diff --git a/.decommissioned/WFA.py b/.decommissioned/WFA.py deleted file mode 100644 index 8e2cd8d..0000000 --- a/.decommissioned/WFA.py +++ /dev/null @@ -1,372 +0,0 @@ -import os -import sys -import pickle -from backtesting.backtesting import Strategy -import pandas as pd -from pandas.tseries.offsets import BDay -import numpy as np -from datetime import datetime -from trade.backtester_.utils.WalkForwardUtils import * -from trade.backtester_.Universe import universe -from trade.helpers.helper import printmd -UNIVERSE = universe - - - -class WFO: - is_train_backtest = True # TO ONLY - is_test_backtest = True - is_reopened = False - prev_open_positions_dict = None - is_position_open = False - open_positions = [] - counter = 50 - official_start = None - i = 0 - size = None - exit_price = None - exit_date = None - init_buy = None - log = pd.DataFrame() - should_log = False - - - - def init(self): - super().init() - self.last_date = self.data.index[-1] - if self.prev_open_positions_dict and len(self.prev_open_positions_dict) != 0: - if self._name in self.prev_open_positions_dict.keys(): - position_details = self.prev_open_positions_dict[self._name] - self.size, self.exit_price, self.exit_date = position_details['Size'], ((position_details['ExitPrice'])), pd.to_datetime(position_details['ExitTime'] - BDay(0)) - # Using prev day because backtesting.py buys on next day - assert (self.is_train_backtest or self.is_test_backtest) and not (self.is_train_backtest and self.is_test_backtest), "Exactly one of self.is_train_backtest or self.is_test_backtest must be True." - assert self.official_start, "Test/Validation backtest needs self.official_start to run." - - def next(self): - # ## REOPEN PREV OPEN POSITIONS - - date = self.data.index[-1] ## SET CURRENT DATE ON EACH NEXT LOOP - if self.is_train_backtest: - self.train_backtest(date) ## Begin train_backtest if user wants to train (setting is_train_backtest to true) - elif self.is_test_backtest: - - ## Begin test_backtest if user wants to test (setting is_test_backtest to true) - self.test_backtest(date) - - def check_open_positions(self, date): # This creates a dictionary holding positions that weren't closed. This is necessary for positions to be carried over to next validation run - # This is only created in test backtest because we are only accumulating returns of validation runs - - if date == self.last_date : - # print('HI', self.last_date, 'Test run', self.is_test_backtest, 'Train run', self.is_train_backtest) - pass - # if self.position: - # self.open_positions.append({'Name': self._name,'Size' : self.position.size, 'ExitDate': self.last_date, 'Close': self.data.Close[-1], 'Prev_Close': self.data.Close[-2]}) - # else: - # self.open_positions.append({'Name': self._name, 'Size' : 'NO OPEN POSITION', 'ExitDate': self.last_date, 'Close': self.data.Close[-1], 'Prev_Close': self.data.Close[-2]}) - - - # self.logger({'Date': [date], - # 'Close': [self.data.Close[-1]], - # 'Upper Band': [self.upper_inner_band[-1]], - # 'Name': [self._name], - # 'Crossover Flag': [crossover(self.data.Close, self.upper_inner_band)] - # }) if self.should_log else None - - - def train_backtest(self, date): - - self.prev_open_positions_dict = None # Handle reset of this variable incase it hasn't already been handled - if date >= self.official_start: - super().next() - self.check_open_positions(date) #Comment this out when officially carrying out WFO - - def test_backtest(self, date): - assert self.prev_open_positions_dict is not None, f"self.prev_open_positions_dict cannot be none in test_backtest. If there are no previous positions, pass an empty dictionary" - - # if self._name in self.prev_open_positions_dict and not self.is_reopened: - # self.reopen_previous_position(date) - # else: - if date >= self.official_start: - super().next() - self.check_open_positions(date) - - def reopen_previous_position(self, date): - if date >= self.exit_date and not self.position and not self.is_reopened: - self.init_buy = date - self.buy() - self.is_reopened = True - print(f'Reopened {self._name} on {date}, for size {self.size}') - - - @classmethod - def logger(cls, dictionary): - item = pd.DataFrame(dictionary) - cls.log = pd.concat([cls.log, item]).reset_index(drop =True) - - - @classmethod - def reset_variables(cls): - # PTBacktester is basically looping individual backtest.run(). Backtest object USES a deep copy of strategy object, which means every instance of Backtest will have the same - # strategy object & variables. Therefore to ensure that during the PTBacktester looping has fresh values, we have to reset position related variables. - - cls.exit_price = None - cls.exit_date = None - cls.size = None - cls.is_reopened = False - cls.is_train_backtest = True - cls.is_test_backtest = True - - - - - - -from typing import Type, Union, Tuple -from backtesting.backtesting import Strategy -from datetime import datetime -import asyncio -class WalkForwardAnalysis: - def __init__(self, names: list, strategy: Union[Type, Type[Strategy]], optimize_var: dict, engine: str): - assert engine in ['position', 'cross'], f'Available engines are "position" or "cross". Recieved "{engine}"' - self.names = names - self.strategy = strategy - self.split_datasets = None # Initiated by method split_dataset - self.settings = None # Settings holding other important attributes. This just helps us ensure we can expand the code w/o over populating the __init__. - # This is set by the set_settings method, will be called at initialization since there are defaults - - self.strategy_settings_lib = None - self.optimize_var = optimize_var - self.windows = None # Dict holding the windows for everthing which includes: - # Train: Start, end - # Test: Official Start, Start, end. - # This is set by a method split_windows. Can't split at initiation cause we need to pass the settings first - self.trainOpt_data = None # Variable holding the data obtained from running an optimization on train dataset - self.tested_data = None # Variable holding the data obtained from OOS testing - self.engine = engine #String with name - self.set_settings({}) - - # async def run(self): - # variable = await self.run_process() - # if variable: - # self.save_class() - - # return variable - - # async def run_process(self): - def run(self): - train_windows = self.windows['train_window'] - test_windows = self.windows['test_window'] - train_data = self.split_datasets['train_window'] - test_data = self.split_datasets['test_window'] - train_packaged_data = {} - test_packaged_data = {} - to_dataframe_dict = {} - wfe_data = {} - mega_data = {} - saved_strat_settings = {} - val_, train_start, train_end, test_start, test_end, train_CAGR, test_CAGR, wfe_, train_drawdown = [], [], [], [],[], [], [], [],[] - for val_run, data in test_data.items(): - printmd(f"### **Validation Run: {val_run}**") if self.printHeaders else None - ## RETRIEVE RUN DATA & SPLIT INTO VARIABLES - test_run_data = data - train_run_data = train_data[val_run] - off_start = self.windows['test_window'][val_run]['off_start'] - test_end_date = self.windows['test_window'][val_run]['End'] - train_end_date = self.windows['train_window'][val_run]['End'] - off_start_train = self.windows['train_window'][val_run]['off_start'] - no_days_traded_in_test = np.busday_count(off_start.strftime('%Y-%m-%d'),test_end_date) - - ## TRAIN DATA - trained_data = self.train(train_run_data, off_start_train) - trained_target_metric = trained_data['agg']['CAGR [%]'] - - ## TEST WITH STRATEGY SETTING - strategy_setting = trained_data['strategy_settings'] - tested_data = self.test(test_run_data, strategy_setting, off_start) - tested_target_metric = tested_data['agg']['CAGR [%]'] - tested_drawdown = tested_data['agg']['Max. Drawdown [%]'] - annualized_drawdown = tested_drawdown * 1/(no_days_traded_in_test/260) - - ## SAVE AGG FROM BOTH - train_packaged_data[val_run] = trained_data - test_packaged_data[val_run] = tested_data - wfe_data[val_run] = tested_target_metric/trained_target_metric - saved_strat_settings[val_run] = strategy_setting - ## PRINT WFE FOR THE RUN - print(f"Validation Run: {val_run}, WFE: {tested_target_metric/trained_target_metric}, Test CAGR [%]: {tested_target_metric}, Train CAGR [%]: {trained_target_metric}, Annualized Drawdowon [%]: {annualized_drawdown}") if self.printHeaders else None - - ## Appending data to list which goes into dataframe - for lst, val in zip([val_, train_start, train_end, test_start, test_end, train_CAGR, test_CAGR, wfe_, train_drawdown], - [val_run, off_start_train.strftime('%Y-%m-%d'), train_end_date, off_start.strftime('%Y-%m-%d'), test_end_date, trained_target_metric, tested_target_metric,tested_target_metric/trained_target_metric ,tested_drawdown]): - lst.append(val) - ## Creating a data dictionary - - for lst, col in zip([train_start, train_end, test_start, test_end, train_CAGR, test_CAGR, wfe_, train_drawdown], - ['Train_Start_Date', 'Train_end_Date', 'Test_Start_Date', 'Test_End_Date', 'Train_CAGR', 'Test_CAGR', 'WFE', 'TEST_ANNUALIZED_DRAWDOWN']): - to_dataframe_dict[col.upper()] = lst - - ## Saving data to class attributes - self.trained_data = train_packaged_data - self.tested_data = test_packaged_data - self.strategy_settings_lib = saved_strat_settings - self.WFE_data = wfe_data - stats = pd.DataFrame(index = pd.Index(val_, name = 'VALIDATION_RUN', dtype = 'int64'), data = to_dataframe_dict ) - stats['WFE_ADJUSTED'] = stats.WFE * np.sign(stats.TRAIN_CAGR) - self.stats = stats - self.save_class() - - return stats - - def save_class(self): - className = self.strategy.__bases__[1].__name__ - print(className) - anc = 'ANCHORED' if self.anchored else 'UNANCHORED' - name = f'{className}_{"_".join(self.names)}_lookback_{self.lookback_bars}_val_{self.validation_bars}_warmup_{self.warmup_bars}' - today = datetime.today().strftime('%Y-%d-%m') - save_location = f'WFA/{today}/{anc}/{name}.pkl' - dir = os.path.dirname(save_location) - os.makedirs(dir, exist_ok = True) - with open(save_location, 'wb') as file: - pickle.dump(self, file) - - - def split_(self) -> Tuple[dict, dict]: - """ - Returns a dictionary holding both the split up window & corresponding dataset objects to carry out backtesting. - - """ - return split_window(stocks = self.names, - strategy= self.strategy, - data_end= self.data_end, - data_length_str= self.data_length_str, - warmup_bars = self.warmup_bars, - lookback_bars= self.lookback_bars, - validation_bars = self.validation_bars, - anchored = self.anchored, - interval = self.interval - ) - - - def set_settings(self, settings) -> None: - """ - Attribute responsible for initiating the necessary settings to assist with the WFA. Pass a dict with setting name as key and corresponding setting as values - - dict params: - ____________ - - BaseRun (bool): designates whether this WFA is a base Run (no optimization, just runs of split up data with constant parameters) - anchored (bool): True to run an anchored WFA or False to not - printHeaders (bool): Bool deciding whether to print headers or not - data_end (datetime): Datetime object for when the WFA data should end - warmup_bars (int): Number of bars to be used as warmup bars - lookback_bars (int): Number of bars to be used as lookback/train bars - validation_bars (int): Number of bars to be used in valudation - cash (int, dict): Cash value. int defaults to setting all names with the cash value supplied. Dict must be {ticker: cash} with corresponding names in names - commission (float): Commission - data_length_str (string): Length string to evaluate. Eg: years = 6. refer to dateutils.relativedelta.relativedelta for available options - interval (string): Timeseries interval - optimize_str (str): Applicable to 'position' engine in WF. The associated string to be optimized from backtesting.py optimizer - optimize_list (list): Applicable to 'cross' engine in WF. Associated list of items to be optimized in PTBacktester optimizer - target_metric (str): This is the index name as seen in the aggregate function. PLEASE PASS EXACTLY - - Defaults: - __________ - - {'BaseRun': False, 'anchored': False, 'printHeaders': False, 'data_end': datetime.datetime(2024, 8, 16, 16, 58, 5, 875120), 'warmup_bars': 300, 'lookback_bars': 1308, 'cash': 1000, - 'commission': 0.002, 'interval': '1d', 'validation_bars': 126, 'data_length_str': 'years = 15', 'optimize_str': 'Return [%]', 'optimize_list': ['rtrn']} - """ - - settings_list = ['BaseRun', 'anchored', 'printHeaders', 'data_end', 'warmup_bars', 'lookback_bars', 'cash', 'commission', 'interval', 'validation_bars', 'data_length_str', 'optimize_str', 'optimize_list', 'target_metric'] # List of available settings - settings_default = [False, False, False, datetime.today(), 300, 252*4+300, 1000, 0.002, '1d', 126, 'years = 15', 'Return [%]', ['rtrn'], 'Return [%]'] # Available settings corresponding default args - settings_type = [bool, bool, bool, datetime, int, int, [int, dict, float], float, str, int, str, str, list, str] # Available settings corresponding datatype - settings_default_dict = dict(zip(settings_list, settings_default)) #Creating settings default - settings_criteria = dict(zip(settings_list, settings_type)) # Creating dict with settings type to assert types allowed - - for i, (key, value) in enumerate(settings.items()): - assert key in settings_list, f"Setting '{key}' not a valid settings. Valid settings: {settings_list}" - if key == 'cash': - assert isinstance(value, settings_criteria[key][0]) or isinstance(value, settings_criteria[key][1]) or isinstance(value, settings_criteria[key][2]), f"Type {type(value)} not a valid type for '{key}', expecting {settings_criteria[key]}" - else: - assert isinstance(value, settings_criteria[key]), f"Type {type(value)} not a valid value for {key}, expecting {settings_criteria[key]}" - settings_default_dict[key] = value - - for key, value in settings_default_dict.items(): - setattr(self, key, value) - self.settings = settings_default_dict - self.windows, self.split_datasets = self.split_() - - def train(self, data: list, off_start: pd.Timestamp): - - if self.engine == 'position': - agg_train = position_train(self.strategy, data, self.optimize_var, off_start =off_start, optimize_str= self.optimize_str, cash = self.cash, baseRun = self.BaseRun, printHeaders = self.printHeaders ) - else: - agg_train = cross_train(self.strategy, data, self.optimize_var,off_start =off_start, optimize_list= self.optimize_list, cash = self.cash,baseRun = False, printHeaders = self.printHeaders) - return agg_train - - def test(self, data: list, strategy_setting: dict, off_start: pd.Timestamp): - if self.engine == 'position': - agg_test = position_test(strategy = self.strategy, off_start= off_start, strategy_settings= strategy_setting,validation_datas= data,cash = self.cash, commission= self.commission, plot_positions= False ) - else: - agg_test = cross_test(self.strategy, off_start, strategy_setting, data,self.cash, self.commission) - return agg_test - - - - - - def produce_summary(self, data_choice: str = 'test') -> pd.Series: - """ - Params: - ________ - - data_choice: 'test' to recieve summary for OOS data and 'train' for IS data - - - Returns: - _________ - pd.Series - - """ - assert self.tested_data is not None, f"Please run Walk Forward Analysis to produce necessary datapoints" - assert data_choice in ['test', 'train'], f"Only options for summary production is 'test' and 'train'. Recieved '{data_choice}'" - def compute_summary(data_choice): - dataChoice = self.tested_data if data_choice == 'test' else self.trained_data - val_run = list(dataChoice.keys()) - metrics = ['# Trades', 'Best Trade [%]', 'Worst Trade [%]', 'Avg. Winning Trade [%]', 'Avg. Losing Trade [%]', 'Avg. Trade [%]', 'Winning Streak', 'Losing Streak'] - windows = self.windows['train_window'] if data_choice == 'train' else self.windows['test_window'] - summary = pd.DataFrame(index = val_run) - for col in metrics: - for run in val_run: - no_bus_days = np.busday_count(windows[run]['off_start'].strftime('%Y-%m-%d'), windows[run]['End']) - summary.at[run, col] = dataChoice[run]['agg'][col] - summary.at[run, 'Net PnL'] = dataChoice[run]['agg']['Equity Final [$]'] - dataChoice[run]['agg']['equity_curve']['Total'][0] - summary.at[run, 'Annualized Net PnL'] = annualize_net_profit(dataChoice[run]['agg']['Equity Final [$]'] - dataChoice[run]['agg']['equity_curve']['Total'][0],dataChoice[run]['agg']['equity_curve']['Total'][0], no_bus_days) - summary.at[run, 'Annualized Net PnL [%]'] = annualize_net_profit(dataChoice[run]['agg']['Equity Final [$]'] - dataChoice[run]['agg']['equity_curve']['Total'][0],dataChoice[run]['agg']['equity_curve']['Total'][0], no_bus_days,False) - summary.at[run, 'Net PnL [%]'] = (dataChoice[run]['agg']['Equity Final [$]'] - dataChoice[run]['agg']['equity_curve']['Total'][0])/dataChoice[run]['agg']['equity_curve']['Total'][0] - summary.at[run, 'Losing Trades'] = (dataChoice[run]['agg']['# Trades'] * (dataChoice[run]['agg']['Lose Rate [%]']/100)).round(0) - summary.at[run, 'Winning Trades'] = (dataChoice[run]['agg']['# Trades'] * (1-(dataChoice[run]['agg']['Lose Rate [%]']/100))).round(0) - summarized_summary = pd.Series() - summarized_summary['Avg Net Profit'] = summary['Net PnL'].mean() - summarized_summary['Avg Annualized Net Profit'] = summary['Annualized Net PnL'].mean() - summarized_summary['Annualized Net PnL [%]'] = summary['Annualized Net PnL [%]' ].mean() - summarized_summary['Avg Net Profit'] = summary['Net PnL'].mean() - summarized_summary['Avg Net Profit [%]'] = summary['Net PnL [%]'].mean() - summarized_summary['Total # of Trades'] = summary['# Trades'].sum() - summarized_summary['Total # of Winning Trades'] = summary['Winning Trades'].sum() - summarized_summary['Total # of Losing Trades'] = summary['Losing Trades'].sum() - summarized_summary['Largest Losing Trades [%]'] = summary['Worst Trade [%]'].min() - summarized_summary['Largest Winning Trades [%]'] = summary['Best Trade [%]'].max() - summarized_summary['Avg. Winning Trade [%]'] = summary['Avg. Winning Trade [%]'].mean() - summarized_summary['Avg. Losing Trade [%]'] = summary['Avg. Losing Trade [%]'].mean() - summarized_summary['Avg. Trade [%]'] = summary['Avg. Trade [%]'].mean() - summarized_summary['Max Winning Streak'] = summary['Winning Streak'].max() - summarized_summary['Max Losing Streak'] = summary['Losing Streak'].max() - return summarized_summary - - test_summary = compute_summary('test') - train_summary = compute_summary('train') - test_summary['WFE'] = test_summary['Avg Annualized Net Profit']/train_summary['Avg Annualized Net Profit'] - train_summary['WFE'] = test_summary['Avg Annualized Net Profit']/train_summary['Avg Annualized Net Profit'] - - return test_summary if data_choice == 'test' else train_summary diff --git a/.decommissioned/WalkForwardUtils.py b/.decommissioned/WalkForwardUtils.py deleted file mode 100644 index 0777959..0000000 --- a/.decommissioned/WalkForwardUtils.py +++ /dev/null @@ -1,328 +0,0 @@ -import os -import sys -from trade.backtester_.backtester_ import PTBacktester, PTDataset -from trade.assets.Stock import Stock -import pandas as pd -from pandas.tseries.offsets import BDay -from datetime import datetime -import yfinance as yf -from trade.backtester_.Universe import universe -UNIVERSE = universe - - - -def create_datasate(stocks: list, start: str,interval: str, engine: str = 'yf', timewidth = None, timeframe = None, end: str = datetime.today(), return_object = False ): - dataset = [] - raw_dataset = {} - data_range = pd.date_range(start, end, freq = 'B') - if engine.lower() == 'yf': - from datetime import datetime - for stock in stocks: - data2 = yf.download(stock, start = start, end = end, interval=interval, progress = False) - if pd.isna(data2.Open.max()): - pass - else: - raw_dataset[stock] = data2 - dataset.append(PTDataset(stock, data2)) - else: - for stk in stocks: - stock = Stock(stk) - data = stock.spot(ts = True, ts_start = '2018-01-01', ts_timeframe=tmframe) - data.rename(columns = {x:x.capitalize() for x in data.columns}, inplace= True) - data['Timestamp'] = pd.to_datetime(data['Timestamp'], format = '%Y-%m-%d') - data2 = data.set_index('Timestamp') - data2 = data2.asfreq('W', method = 'ffill') - data2 = data2.fillna(0) - data2['Next_Day_Open'] = data2.Open.shift(-1) - data2['EMA'] = ta.ma('ema', data2.Close, length = 21).fillna(0) - dataset.append(PTDataset(stk, data2)) - raw_dataset[stock] = data2 - return dataset if return_object else raw_dataset - -def prev_monday(date): - date = pd.to_datetime(date) - day_of_week_ = date.day_of_week - date = date.replace(day = date.day - day_of_week_) - return date - - - - - - -def annualize_net_profit(net_profit, initial_investment, days, value = True): - annualized_profit = ((1 + net_profit / initial_investment) ** (260 / days)) - 1 - return annualized_profit * initial_investment if value else annualized_profit *100 - - - -def split_window( - stocks, - strategy, - data_end, - data_length_str, - warmup_bars, - lookback_bars=28*1440, - validation_bars=7*1440, - anchored = False, - interval = '1d'): - - validation_run = 1 - data_start = eval(f'datetime.today()-relativedelta({data_length_str})') - tester = ['^GSPC'] - data_bank = create_datasate(tester, data_start, interval,end = data_end , return_object=False) - data_dict = create_datasate(stocks, data_start, interval,end = data_end , return_object=False) - data_full = data_bank[tester[0]] - split_data = {} - split_window = {} - train_window = {} - test_window = {} - test_data = {} - train_data = {} - for i in range(lookback_bars+warmup_bars, len(data_full)-validation_bars, validation_bars): - s = i -lookback_bars - warmup_bars if not anchored else 0 - length_filter = 300 - sample_datas = [] - validation_datas = [] - - pass_val_names = [] - ## I NEED TO CREATE A LIST OF SAMPLE DATA PTDATASET - for name, data in data_bank.items(): - off_start_train = pd.to_datetime(data_full.iloc[s+warmup_bars].name) - start = pd.to_datetime(data_full.iloc[s].name).strftime('%Y-%m-%d') - end = pd.to_datetime(data_full.iloc[i].name ).strftime('%Y-%m-%d') - - for stk in stocks: - temp = data_dict[stk] - temp = temp[(temp.index >= start) & (temp.index <= end)] - # if len(temp) = valStart) & (temp.index <= valEnd)] - validation_datas.append(PTDataset(stk, temp)) - - train_window[str(validation_run)] = {'off_start': off_start_train, 'Start': start, 'End': end} - test_window[str(validation_run)] = {'off_start': off_start,'Start': valStart, 'End': valEnd} - train_data[str(validation_run)] = sample_datas - test_data[str(validation_run)] = validation_datas - validation_run += 1 - - split_window['train_window'] = train_window - split_window['test_window'] = test_window - split_data['train_window'] = train_data - split_data['test_window'] = test_data - return split_window, split_data - - -def position_train( - strategy, - sample_datas, - optimize_params, - off_start, - optimize_str = 'Return [%]', - cash=1_000, - commission=0.002, - baseRun = True, - printHeaders = False): - - packaged_data = {} - # Carry out training - strategy.prev_open_positions_dict = None - strategy.official_start = off_start - strategy.open_positions = [] - strategy.is_test_backtest = False - strategy.is_train_backtest = True - bt_training = PTBacktester(sample_datas, strategy, cash=cash, commission=commission) - stats = bt_training.run() - agg1 = bt_training.aggregate() - print('Pre optimize CAGR: ', agg1['CAGR [%]'], ' Return', agg1['Return [%]']) if printHeaders else None - if not baseRun: - # Optimize training data & pick best parameters - - optimized = bt_training.position_optimize(optimize_params, maximize = optimize_str) - strategy_settings = optimized.to_dict('index') - bt_training = PTBacktester(sample_datas, strategy, cash=cash, commission=commission, strategy_settings= strategy_settings) - bt_training.run() - - packaged_data['strategy_settings'] = strategy_settings - packaged_data['agg'] = bt_training.aggregate() - packaged_data['stats_by_tick'] = stats - print('Post optimize CAGR: ', packaged_data['agg']['CAGR [%]'], ' Return', packaged_data['agg']['Return [%]']) if printHeaders else None - - strategy.reset_variables() - return packaged_data - -def cross_train( - strategy, - sample_datas, - optimize_params, - off_start, - optimize_list = ['rtrn'], - cash=1_000, - commission=0.002, - baseRun = True, - printHeaders = False): - - packaged_data = {} - # Carry out training - strategy.prev_open_positions_dict = None - strategy.official_start = off_start - strategy.open_positions = [] - param_dict = {} - strategy.is_test_backtest = False - strategy.is_train_backtest = True - bt_training = PTBacktester(sample_datas, strategy, cash=cash, commission=commission) - stats = bt_training.run() - agg1 = bt_training.aggregate() - print('Pre optimize CAGR: ', agg1['CAGR [%]'], ' Return', agg1['Return [%]']) if printHeaders else None - if not baseRun: - - optimized = bt_training.optimize(optimize_params, optimize_list) - optimized.sort_values(optimize_list[0], ascending = False, inplace = True) - optimized_page = optimized.head(1) - for attr in optimize_params.keys(): - param_dict[attr] = optimized_page[attr].values[0] - - - packaged_data['agg'] = bt_training.aggregate() - packaged_data['stats_by_tick'] = stats - packaged_data['strategy_settings'] = param_dict - print('Post optimize CAGR: ', packaged_data['agg']['CAGR [%]'], ' Return', packaged_data['agg']['Return [%]']) if printHeaders else None - - strategy.reset_variables() - return packaged_data - - - -def position_test( - strategy, - off_start, - strategy_settings, - validation_datas, - cash, - commission, - baseRun = False, - anchored = False, - plot_positions = False): - - """ - This function carries out a test run with per position method. - - Parameters: - _____________ - - strategy: backtesting.backtesting.Strategy object - off_start (pd.Timestamp): Official Start date. This is assuming WFO would be a class in this strategy - strategy_settings (dict): Params as a dict to optimize by. In per ticker format - validation_data (List[PTDataset]): list of PTDataset - cash (int, float, dict): Cash - commission(float): Commission - baseRun (bool): This is assuming there will be no optimizing if True - anchored (bool): True to not move validation period forward, false to move forward - plot_position (bool): True to plot each positions charts - - - Returns: - __________ - - dict: - agg: Aggregate data from PTBacktester - stats_by_tick: Stats by Ticker from backtesting.py - - - """ - - #Run Validation backtest - packaged_data = {} - strategy.official_start =off_start - strategy.is_train_backtest = False - strategy.open_positions = [] - strategy.prev_open_positions_dict = {} # pre_open_positions_dict has be an empty dict in the first run because there are no previous positions - if baseRun: - bt_validation = PTBacktester(validation_datas, strategy, cash=cash, commission=commission) - else: - bt_validation = PTBacktester(validation_datas, strategy, cash=cash, commission=commission, strategy_settings = strategy_settings) - stats_validation = bt_validation.run() - agg_validation = bt_validation.aggregate() - packaged_data['agg'] = agg_validation - packaged_data['stats_by_tick'] = stats_validation - #Plot each validation run - if plot_positions: - for d in bt_validation.datasets: - name = d.name - bt_validation.plot_position(name, filename = f"No Optimization-{off_start.strftime('%Y-%m-%d')}_{name}") - - return packaged_data - - -def cross_test( - strategy, - off_start, - strategy_settings, - validation_datas, - cash, - commission, - baseRun = False, - anchored = False, - plot_positions = False): - - - """ - This function carries out a across positions without changing params per ticker. - - Parameters: - _____________ - - strategy: backtesting.backtesting.Strategy object - off_start (pd.Timestamp): Official Start date. This is assuming WFO would be a class in this strategy - strategy_settings (dict): Params as a dict to optimize by. In per params format - validation_data (List[PTDataset]): list of PTDataset - cash (int, float, dict): Cash - commission(float): Commission - baseRun (bool): This is assuming there will be no optimizing if True - anchored (bool): True to not move validation period forward, false to move forward - plot_position (bool): True to plot each positions charts - - - Returns: - __________ - - dict: - agg: Aggregate data from PTBacktester - stats_by_tick: Stats by Ticker from backtesting.py - - - """ - - - #Run Validation backtest - packaged_data = {} - strategy.official_start =off_start - strategy.is_train_backtest = False - strategy.open_positions = [] - strategy.prev_open_positions_dict = {} #pre_open_positions_dict has be an empty dict in the first run because there are no previous positions - if baseRun: - bt_validation = PTBacktester(validation_datas, strategy, cash=cash, commission=commission) - else: - for attr, value in strategy_settings.items(): - setattr(strategy, attr, value) - bt_validation = PTBacktester(validation_datas, strategy, cash=cash, commission=commission) - stats_validation = bt_validation.run() - agg_validation = bt_validation.aggregate() - packaged_data['agg'] = agg_validation - packaged_data['stats_by_tick'] = stats_validation - #Plot each validation run - if plot_positions: - for d in bt_validation.datasets: - name = d.name - bt_validation.plot_position(name, filename = f"No Optimization-{off_start.strftime('%Y-%m-%d')}_{name}") - - return packaged_data \ No newline at end of file diff --git a/.decommissioned/algo/algo.strategies._utils.py b/.decommissioned/algo/algo.strategies._utils.py deleted file mode 100644 index c902b0d..0000000 --- a/.decommissioned/algo/algo.strategies._utils.py +++ /dev/null @@ -1,391 +0,0 @@ -raise DeprecationWarning("This module is deprecated. Use algo.strategies.utils instead.") -# import os -# import yaml -# import importlib -# from dateutil.relativedelta import relativedelta -# from pathlib import Path -# from datetime import datetime, timedelta -# import pandas as pd -# from dbase.database.SQLHelpers import ( -# get_engine, -# list_tables_from_db, -# create_table_from_schema, -# dynamic_batch_update, -# DatabaseAdapter -# ) -# from dbase.DataAPI.ThetaData import ( -# retrieve_quote, -# retrieve_quote_rt -# ) -# from trade.assets.Calculate import Calculate -# from trade.helpers.helper import ( -# parse_option_tick, -# binomial_implied_vol, -# CustomCache -# ) -# from EventDriven.riskmanager.market_data import ( -# OPTION_TIMESERIES_START_DATE, -# MarketTimeseries -# ) -# from EventDriven.riskmanager.utils import parse_position_id -# from algo.strategies.enums import Action - - -# ## 1). Setup data source. CustomCache location -# DATA_LOCATION = Path(f"{os.environ['GEN_CACHE_PATH']}") -# CUSTOM_CACHE = None - -# ## 2). Object for live data. Reloads after 3 mins -# LIVE_TIMESERIES = None -# def get_live_timeseries_obj() -> MarketTimeseries: -# """ -# Get a MarketTimeseries object that refreshes data every 3 minutes. -# """ -# global LIVE_TIMESERIES - -# ## Start is 2 weeks from today -# end = datetime.now() -# start = end - relativedelta(weeks=2) -# if LIVE_TIMESERIES is None: -# LIVE_TIMESERIES = MarketTimeseries(_refresh_delta=timedelta(minutes=3), -# _start=start.strftime('%Y-%m-%d'), -# _end=end.strftime('%Y-%m-%d')) - -# ## No need for refresh here. It is handled in the class during at_index call -# return LIVE_TIMESERIES - -# def get_custom_cache(loc=DATA_LOCATION): -# """ -# Get a CustomCache instance for storing trading data. -# This function initializes a CustomCache with a specified location and settings. -# """ -# global CUSTOM_CACHE -# if CUSTOM_CACHE is None: -# CUSTOM_CACHE = CustomCache( -# loc, -# fname="bot_prod_data", -# expiry_days=500, -# clear_on_exit=False -# ) -# return CUSTOM_CACHE - -# def get_option_price_theta_data(opttick:str, -# as_of:str|datetime) -> float|None: -# """ -# Retrieve option price data from ThetaData -# """ -# as_of = pd.to_datetime(as_of) -# meta = parse_option_tick(opttick) -# data = retrieve_quote( -# symbol=meta['ticker'], -# start_date=as_of - timedelta(days=7), -# end_date=as_of + timedelta(days=1), -# strike=meta['strike'], -# right= meta['put_call'], -# exp=meta['exp_date'], -# print_url = False, -# interval='1d') -# if data is None or data.empty: -# return None - -# if as_of.date() not in data.index.date: -# raise ValueError(f"Data for {as_of.date()} not found in the retrieved data.") -# return data.loc[data.index.date == as_of.date()]['Midpoint'].values[0] - - -# def get_option_price(_id:str, date:str, force = False) -> float|None: -# """ -# Get the position price for a given position ID and date. - -# Args: -# force (bool): If True, force refresh the price from ThetaData. -# _id (str): Position ID. -# date (str): Date in 'YYYY-MM-DD' format. -# Returns: -# float|None: The position price if available, otherwise None. -# """ -# if _id not in get_custom_cache() or force: ## If not in cache or force refresh, get from ThetaData -# return get_option_price_theta_data(_id, date) -# data = get_custom_cache()[_id] -# if date not in data.index: -# print(f"No data for {_id} on {date}") -# return get_option_price_theta_data(_id, date) -# return data.loc[date, 'Midpoint'] - - -# def get_option_realtime_quote(_id:str) -> float|None: -# """ -# Get the position quote for a given position ID and date. -# """ -# meta = parse_option_tick(_id) -# return retrieve_quote_rt( -# symbol=meta['ticker'], -# exp=meta['exp_date'], -# right=meta['put_call'], -# strike=meta['strike'], -# )['Midpoint'][0] - -# def get_position_price(_id:str, date:str, force = False) -> float|None: -# """ -# Get the position price for a given position ID and date. -# Args: -# force (bool): If True, force refresh the price from ThetaData. -# _id (str): Position ID. -# date (str): Date in 'YYYY-MM-DD' format. - -# Returns: -# float|None: The position price if available, otherwise None. -# """ -# opt_ids_list = parse_position_id(_id)[1] -# prices = [] -# for leg, opt_id in opt_ids_list: - -# price = get_option_price(opt_id, date, force=force) -# if price is not None: -# prices.append(price if leg == 'L' else -price) -# else: -# print(f"No price found for {opt_id} on {date}") -# if not prices: -# print(f"No prices found for {_id} on {date}") -# return None -# return sum(prices) - - -# def get_position_realtime_quote(_id:str) -> float|None: -# """ -# Get the position quote for a given position ID. -# Args: -# _id (str): Position ID. -# Returns: -# float|None: The position quote if available, otherwise None. -# """ -# opt_ids_list = parse_position_id(_id)[1] -# quotes = [] -# for leg, opt_id in opt_ids_list: -# quote = get_option_realtime_quote(opt_id) -# if quote is not None: -# quotes.append(quote if leg == 'L' else -quote) -# else: -# print(f"No quote found for {opt_id}") -# if not quotes: -# print(f"No quotes found for {_id}") -# return None -# return sum(quotes) - - - -# def live_calculate_option_delta(opttick:str, date:str|datetime) -> float: -# """ -# Calculate the delta of an option using the binomial model. This is a live calculation that fetches the necessary data. - -# """ -# tick, option_type, exp, strike = parse_option_tick(opttick).values() -# option_price = get_option_price(opttick, date, force=True) -# timeseries = get_live_timeseries_obj() -# if tick not in timeseries.spot: -# timeseries.load_timeseries(tick, OPTION_TIMESERIES_START_DATE, datetime.now(), force=True) - -# at_index = timeseries.get_at_index(tick, date) -# s = at_index.chain_spot.close -# y = at_index.dividends -# r = at_index.rates.annualized -# vol = binomial_implied_vol( -# price=option_price, -# S=s, -# K=strike, -# r=r, -# exp_date=exp, -# option_type=option_type.lower(), -# pricing_date=date, -# dividend_yield=y) - - - -# return Calculate.delta( -# S=s, -# K=strike, -# r=r, -# sigma=vol, -# start=date, -# flag=option_type.lower(), -# exp=exp, -# y=y, -# model='binomial' -# ) - -# def live_calculate_position_delta(position_id: str, date:str|datetime) -> float: -# ids =parse_position_id(position_id)[1] -# pos_delta = 0 -# for side, opttick in ids: -# if side.upper() == 'L': -# sign = 1 -# elif side.upper() == 'S': -# sign = -1 -# else: -# raise ValueError("Invalid side in position ID. Must be 'LONG' or 'SHORT'.") -# delta = live_calculate_option_delta(opttick, date) -# pos_delta += (sign * delta) -# return pos_delta - -# def create_max_cash_map(weights: dict, -# cash: int|float, -# threshold_map: dict) -> dict: -# """ -# weights: dict of symbol -> weight (numeric) -# cash: scalar. This is initial cash for the portfolio. Not total cash as at a time. -# threshold_map: dict where keys are numeric thresholds and value is the assigned value, -# plus an optional 'else' key for fallback. -# Example: {500:4, 300:3, 200:2, 100:1, 'else': 0.5} -# Returns: dict symbol -> assigned max_cash -# """ -# # Extract numeric thresholds and sort descending -# numeric_thresholds = sorted( -# (k for k in threshold_map if isinstance(k, (int, float))), -# reverse=True -# ) -# fallback = threshold_map.get('else') -# result = {} -# for s, w in weights.items(): -# amount = w * cash -# # find first threshold that amount exceeds -# assigned = None -# for thresh in numeric_thresholds: -# if amount > thresh: -# assigned = threshold_map[thresh] -# break -# if assigned is None: -# assigned = fallback -# result[s] = assigned -# return result - -# def load_eod_tasks() -> list: -# """ -# Loads functions for eod task. Note any scheduled task must work with taking no keywords. -# ENSURE IT IS A FUNCTION THAT TAKES NO ARGUMENTS. -# """ -# with open(f"{os.environ['ALGO_DIR']}/algo/strategies/eod_tasks.yaml") as f: -# tasks = yaml.safe_load(f)['tasks'] - -# run_tasks = [] -# for task in tasks: -# module = importlib.import_module(task['module']) -# func = getattr(module, task['name'], None) -# enabled = task['enabled'] -# if func is not None and enabled: -# run_tasks.append(func) -# return run_tasks - - -# def get_prod_last_run(strat_name:str) -> pd.DataFrame: -# """ -# Retrieve the last run information for all strategies from the prod_last_run table. - -# Returns -# ------- -# pd.DataFrame -# The last run information for all strategies. -# """ -# db = DatabaseAdapter() -# data = db.query_database( -# db = 'strategy_trades_signals', -# table_name= 'prod_last_run', -# query= "SELECT * FROM strategy_trades_signals.prod_last_run WHERE strat_name = '%s'" % strat_name -# ) -# return data.run_date.max() - -# def update_prod_last_run(strat_name:str, run_date: str) -> None: -# """ -# Update a new entry to the prod_last_run table. - -# Parameters -# ---------- -# strat_name : str -# The name of the strategy. -# run_date : str -# The date and time of the run in 'YYYY-MM-DD HH:MM:SS' format. -# """ - -# dynamic_batch_update( -# db = 'strategy_trades_signals', -# table_name = 'prod_last_run', -# update_values= { -# 'run_date': pd.to_datetime(run_date).date(), -# }, -# condition={ -# 'strat_name': strat_name -# }, -# ) - -# def add_strat_to_prod_last_run(strat_name:str, run_date: str) -> None: -# """ -# Add a new strategy to the prod_last_run table if it does not already exist. - -# Parameters -# ---------- -# strat_name : str -# The name of the strategy. -# run_date : str -# The date and time of the run in 'YYYY-MM-DD HH:MM:SS' format. -# """ -# db = DatabaseAdapter() -# existing = db.query_database( -# db = 'strategy_trades_signals', -# table_name= 'prod_last_run', -# query= "SELECT * FROM strategy_trades_signals.prod_last_run WHERE strat_name = '%s'" % strat_name -# ) -# if existing.empty: -# df = pd.DataFrame({ -# 'strat_name': [strat_name], -# 'run_date': [run_date] -# }) -# db.save_to_database( -# db = 'strategy_trades_signals', -# table_name = 'prod_last_run', -# data = df, -# ) - - -# def create_strategy_signals_table(strategy_slug: str) -> None: - -# """ -# Create a table for the specified strategy if it does not already exist. - -# Parameters -# ---------- -# strategy_slug : str -# The slug of the strategy for which to create the table. -# """ -# actions = [action.value for action in Action] -# engine = get_engine('strategy_trades_signals') ## Location db -# tables = list_tables_from_db('strategy_trades_signals') ## Table in location db - -# # Check if the table already exists -# if strategy_slug not in tables: -# print(f"Creating table for strategy {strategy_slug}...") -# create_table_from_schema( -# engine, -# { -# 'table_name': strategy_slug, -# 'columns': -# [ -# {'name': "Ticker", 'type': "String", 'length': 50, 'nullable': False}, -# {'name': 'Size', 'type': 'Integer', 'nullable': False}, -# {'name': 'SIGNAL_ORIGINAL_ENTRY_TIME', 'type': 'DateTime', 'nullable': False}, -# {'name': 'SIGNAL_ORIGINAL_EXIT_TIME', 'type': 'DateTime', 'nullable': False}, -# {'name': 'SIGNAL_ID', 'type': 'String', 'length': 50, 'nullable': False}, -# {'name': 'OPEN_TODAY', 'type': 'Boolean', 'nullable': False}, -# {'name': 'CLOSE_TODAY', 'type': 'Boolean', 'nullable': False}, -# {'name': 'POSITION_PREV_OPENED', 'type': 'Boolean', 'nullable': False}, -# {'name': 'POSITION_ACTIVE', 'type': 'Boolean', 'nullable': False}, -# {'name': 'POSITION_CLOSED', 'type': 'Boolean', 'nullable': False}, -# {'name': 'SIGNAL_CLOSED', 'type': 'Boolean', 'nullable': False}, -# {'name': 'ACTION', 'type': 'Enum', 'values': actions, 'nullable': False}, -# {'name': 'RATIONALE', 'type': 'String', 'length': 255, 'nullable': True}, -# {'name': 'NEW_ENTRY_TIME', 'type': 'DateTime', 'nullable': False}, -# {'name': 'NEW_EXIT_TIME', 'type': 'DateTime', 'nullable': False}, -# ] -# } -# ) - -# else: -# print(f"Table for strategy {strategy_slug} already exists. Skipping creation.") diff --git a/.decommissioned/algo/algo.strategies.init_orders.py b/.decommissioned/algo/algo.strategies.init_orders.py deleted file mode 100644 index e3ca28e..0000000 --- a/.decommissioned/algo/algo.strategies.init_orders.py +++ /dev/null @@ -1,706 +0,0 @@ -""" -This module provides functions to initialize and manage orders for backtesting strategies. -It includes functions to set up the backtest environment, run the backtest, and manage orders and fills. -""" -raise DeprecationWarning("This module (strategies.init_orders) is deprecated and will be removed in future releases. Please use the new order management module.") -# from typing import List -# from datetime import datetime -# from copy import deepcopy -# import os -# import pandas as pd -# from pandas.tseries.offsets import BDay -# from trade.helpers.helper import ( -# change_to_last_busday, -# str_to_bool, -# ny_now -# ) -# from trade.helpers.Logging import setup_logger -# from EventDriven.backtest import OptionSignalBacktest -# from EventDriven.riskmanager.sizer import ZscoreRVolSizer, DefaultSizer -# from EventDriven.riskmanager.utils import ( -# set_timeseries_start, -# set_timeseries_end, -# set_use_temp_cache -# ) -# from EventDriven.riskmanager.utils import parse_position_id -# from EventDriven.helpers import parse_signal_id, generate_signal_id -# from EventDriven.types import SignalTypes -# from module_test.raw_code.DataManagers.DataManagers import set_skip_mysql_query, set_use_quotes -# from dbase.database.SQLHelpers import DatabaseAdapter -# from .init_strategies import get_fills -# from .enums import Action -# from .init_environ import ( -# get_custom_cache -# ) -# from .utils import (create_max_cash_map, -# get_option_price_theta_data, -# get_option_price, -# get_option_realtime_quote, -# get_position_price,) -# from ..positions.loaders.limits._limits import save_limits_from_backtester -# logger = setup_logger('strategies.init_orders') -# bkt_logger = setup_logger('strategies.backtest') - -# logger.critical("WARNING: This module (strategies.init_orders) is deprecated and will be removed in future releases. Please use the new order management module.") - -# def get_use_csv() -> bool: -# """ -# Get the value of USE_CSV. -# Returns: -# bool: The current value of USE_CSV. -# """ -# use_csv = os.environ.get('USE_CSV', 'False').lower() -# if use_csv not in ['true', '1', 'yes', 'false', '0', 'no']: -# raise ValueError("USE_CSV must be a boolean value (True/False).") -# return str_to_bool(use_csv) - -# def set_use_csv(value: bool): -# """ -# Set the value of USE_CSV. -# Args: -# value (bool): The value to set for USE_CSV. -# """ -# if value not in ['true', 'false', 1, 0, True, False, '1', '0', 'yes', 'no']: -# raise ValueError("USE_CSV must be a boolean value (True/False).") -# os.environ['USE_CSV'] = str(value).lower() -# logger.info(f"USE_CSV set to {value}") - - - -# def delete_cached_chain(tick, date): -# """ -# Delete cached chain data for a specific ticker and date. -# Args: -# tick (str): Ticker symbol. -# date (str): Date in 'YYYY-MM-DD' format. -# """ -# from EventDriven.riskmanager.utils import PERSISTENT_CACHE -# func = 'EventDriven.riskmanager.utils.populate_cache_with_chain' -# key = (func, tick, date, None, 'print_url',False) -# if key in PERSISTENT_CACHE: -# del PERSISTENT_CACHE[key] -# print(f"Deleted Chain cache for {tick} on {date}") -# else: -# print(f"No cached chain found for {tick} on {date}") - -# def delete_cached_get_order(tick, date): -# """ -# Delete cached order data for a specific ticker and date. -# Args: -# tick (str): Ticker symbol. -# date (str): Date in 'YYYY-MM-DD' format. -# """ -# from EventDriven.riskmanager.utils import PERSISTENT_CACHE -# f ='EventDriven.riskmanager.base.OrderPicker.__get_order' -# deleted = False -# for key in PERSISTENT_CACHE.keys(): -# if key[0] == f and key[1][2][1] == tick and key[2]== date: -# del PERSISTENT_CACHE[key] -# print(f"Deleted cache for {key}") -# deleted = True -# if not deleted: -# print(f"No cached order found for {tick} on {date}") - - -# def generate_trades_data(strategy_folder_name: str, date:str|datetime=None) -> tuple[pd.DataFrame, list[str]]: -# """ -# Generate trades data from the strategy folder. -# Args: -# strategy_folder_name (str): Name of the strategy folder. -# Returns: -# tuple: A tuple containing: -# - pd.DataFrame: DataFrame with trade details. -# - list[str]: List of unique signal IDs.""" -# db = DatabaseAdapter() -# if get_use_csv(): -# logger.info(f"Using CSV for trades data in {strategy_folder_name}") -# if date: -# logger.critical("Date parameter is ignored when USE_CSV is True.") -# trades = pd.read_csv(f"{os.environ['ALGO_DIR']}/algo/strategies/{strategy_folder_name}/trades.csv") -# else: -# logger.info(f"Using database for trades data in {strategy_folder_name}") -# if date: -# logger.info(f"Filtering trades data for date: {date}") -# trades = db.query_database(db='strategy_trades_signals', -# table_name= 'historical_signals', -# query= f"SELECT * FROM strategy_trades_signals.historical_signals WHERE RUN_DATE = '{pd.to_datetime(date).strftime('%Y-%m-%d')}'") -# if trades.empty: -# logger.warning(f"No trades found for date: {date}. Falling back to all trades.") -# print(f"No trades found for date: {date}. Falling back to all trades.") -# # trades = db.query_database(db='strategy_trades_signals', -# # table_name= strategy_folder_name, -# # query= f"SELECT * FROM {strategy_folder_name}") -# else: -# trades = db.query_database(db='strategy_trades_signals', -# table_name= strategy_folder_name, -# query= f"SELECT * FROM {strategy_folder_name}") -# consumption_trades = trades[trades['ACTION'].isin([Action.OPEN.value, Action.CLOSE.value, Action.HOLD.value])].copy() -# consumption_trades=consumption_trades[['Ticker', 'Size', 'NEW_ENTRY_TIME', 'NEW_EXIT_TIME', 'SIGNAL_ID', 'ACTION']] -# consumption_trades.rename(columns={ -# 'NEW_ENTRY_TIME': 'EntryTime', -# 'NEW_EXIT_TIME': 'ExitTime', -# 'SIGNAL_ID': 'PT_BKTEST_SIG_ID'}, inplace=True) -# consumption_trades['ExitTime'] = consumption_trades['ExitTime'].fillna(ny_now().strftime('%Y-%m-%d')) -# consumption_trades['EntryTime'] = consumption_trades['EntryTime'].fillna(ny_now().strftime('%Y-%m-%d')) -# consumption_trades['MAP_ORDER_SIGNAL_ID'] = consumption_trades.apply(lambda x: generate_signal_id( -# x['Ticker'], -# x['EntryTime'], -# SignalTypes.LONG.value if x['Size'] > 0 else SignalTypes.SHORT.value -# ), axis=1) -# signals = consumption_trades.PT_BKTEST_SIG_ID.unique().tolist() -# return consumption_trades, signals - - -# def delete_cached_chain_and_order(trades: pd.DataFrame): -# """ -# Delete cached chain and order data for each trade in the DataFrame. -# Args: -# trades (pd.DataFrame): DataFrame containing trade details. -# """ -# signals = trades.to_dict(orient='records') -# for signal in signals: -# date = change_to_last_busday(pd.to_datetime(signal['EntryTime']) + BDay(1), offset=-1).strftime('%Y-%m-%d') -# delete_cached_chain(signal['Ticker'], date) -# delete_cached_get_order(signal['Ticker'], date) - -# def add_attr(attr_config, obj, skip_keys=[]): -# """ -# Add attributes to an object based on a configuration dictionary. -# attr_config: dict where keys are attribute names and values are the values to set. -# obj: the object to which attributes will be added. -# skip_keys: list of keys to skip in the attr_config. -# """ -# for attr, value in attr_config.items(): -# if attr in skip_keys: -# continue -# assert hasattr(obj, attr), f"{obj.__class__.__name__} does not have `{attr}`" -# setattr(obj, attr, value) - - - -# def transfer_processed_data_to_cache(bkt:OptionSignalBacktest): -# """ -# Transfer processed option data to the custom cache. -# """ -# for name, data in bkt.risk_manager.processed_option_data.items(): -# if name not in get_custom_cache().keys(): ## TODO: Should transfer all. But data is inconsistent at times. Fix this -# get_custom_cache()[name] = data -# print(f"Transferred processed data for {name} to custom cache.") - - -# def setup_backtest_env( -# trades: pd.DataFrame, -# portfolio_config: dict, -# rm_config: dict, -# sizer_settings: dict, -# config: dict, -# weights: dict = {}, -# cash: int|float=20_000, -# skip_keys_map: dict = {}, -# bkt_config: dict = {} -# ): -# """ -# Set up the backtest environment with the given configuration and trades. - -# Args: -# trades (pd.DataFrame): DataFrame containing trades data. -# portfolio_config (dict): Configuration for the portfolio. -# rm_config (dict): Configuration for the risk manager. -# sizer_settings (dict): Settings for the sizer. -# config (dict): General configuration for the backtest. -# weights (dict, optional): Weights for the portfolio. Defaults to {}. -# cash (int|float, optional): Initial cash amount. Defaults to 20_000. -# skip_keys_map (dict, optional): Keys to skip in the configuration. Defaults to {}. -# bkt_config (dict, optional): Additional configuration for the backtest. Defaults to {}. -# Returns: -# OptionSignalBacktest: An instance of the OptionSignalBacktest class with the configured environment. -# """ - -# ## Set up backtest environment. -# ## NOTE: Need to delete processed_option_data & position_data in other to allow updating the time stamps -# portfolio_config, rm_config, bkt_config = deepcopy(portfolio_config), deepcopy(rm_config), deepcopy(bkt_config) -# set_timeseries_start(config['rm_series_start']) -# set_timeseries_end(config['rm_series_end']) -# set_skip_mysql_query(True) ## To avoid time lag in getting option Timeseries -# set_use_temp_cache(True) ## To ensure we use the temp cache for this backtest. - -# for key in skip_keys_map: -# assert key in ['rm_config', 'portfolio_config', 'bkt_config'], f"Invalid key in skip_keys_map: {key}. Expected keys are ['rm_config', 'portfolio_config', 'bkt_config']" - -# for key in ['rm_config', 'portfolio_config', 'bkt_config']: ## Creating a default -# if key not in skip_keys_map: -# skip_keys_map[key] = [] - -# ## Apply weight haircut to weights -# weights = {x: -# v * portfolio_config.get('weights_haircut', 1) for x,v in weights.items()} -# if 'weights_haircut' not in portfolio_config: -# logger.warning("weights_haircut not found in portfolio_config, using default value of 1.0") - -# ## Produce max_cash_map -# cash_map = portfolio_config.pop('max_cash_map', {}) -# portfolio_config['max_contract_price'] = create_max_cash_map( -# weights=weights, -# cash=cash, -# threshold_map=cash_map -# ) - -# ## Set up the portfolio & Backtest -# bkt = OptionSignalBacktest( -# trades=trades, -# initial_capital=cash, -# t_plus_n=portfolio_config.pop('t_plus_n'), -# symbol_list=config['traded_symbols'], -# finalize_trades = False) - -# ## Clear any existing processed option data and position data then upload new one -# bkt.risk_manager.clear_caches() -# bkt.risk_manager.clear_core_data_caches() ## Clear core data caches to ensure fresh data is used -# bkt.risk_manager.append_option_data(data_pack=get_custom_cache()) - -# ## Set Enabled Limits: -# if 'limits_enabled' in rm_config: -# for lmt in rm_config['limits_enabled']: -# if lmt not in bkt.risk_manager.limits: -# raise ValueError(f"Limit {lmt} not found in risk manager limits.") -# bkt.risk_manager.limits[lmt]=True - -# ## Set up the Sizer in RM -# if 'sizer_type' in rm_config: -# _type = rm_config.pop('sizer_type') -# if _type == 'ZscoreRVolSizer': -# rm_config['sizer'] = ZscoreRVolSizer(pm=bkt.portfolio, -# rm=bkt.risk_manager, -# **sizer_settings) -# elif _type == 'DefaultSizer': -# rm_config['sizer'] = DefaultSizer(pm=bkt.portfolio, -# rm=bkt.risk_manager, -# **sizer_settings) -# else: -# raise ValueError(f"Invalid sizer type: {_type}. Expected 'ZscoreRVolSizer' or 'DefaultSizer'.") -# else: -# logger.info("No sizer type specified in rm_config, using DefaultSizer in RiskManager as default.") - -# ## Add Attributes to the objects -# add_attr(rm_config, -# bkt.risk_manager, -# skip_keys=['rm_series_start', 'rm_series_end'] + skip_keys_map['rm_config']) -# add_attr(portfolio_config, bkt.portfolio, skip_keys=['initial_cash'] + skip_keys_map['portfolio_config']) -# add_attr(bkt_config, bkt.portfolio, skip_keys=['initial_cash', 'weights_haircut']) -# bkt.logger = bkt_logger # Set the logger for the backtest - -# return bkt - - -# def run_backtest( -# trades: pd.DataFrame, -# portfolio_config: dict, -# rm_config: dict, -# sizer_settings: dict, -# config: dict, -# T_0: str, -# strat_name: str, -# strateg_slug: str, -# weights: dict = {}, -# cash: int|float=20_000, -# skip_keys_map: dict = {}, -# bkt_config: dict = {} -# ): -# """ -# Run the backtest with the given configuration and trades. -# Args: -# trades (pd.DataFrame): DataFrame containing trades data. -# portfolio_config (dict): Configuration for the portfolio. -# rm_config (dict): Configuration for the risk manager. -# sizer_settings (dict): Settings for the sizer. -# config (dict): General configuration for the backtest. -# weights (dict, optional): Weights for the portfolio. Defaults to {}. -# cash (int|float, optional): Initial cash amount. Defaults to 20_000. -# skip_keys_map (dict, optional): Keys to skip in the configuration. Defaults to {}. -# bkt_config (dict, optional): Additional configuration for the backtest. Defaults to {}. -# Returns: -# OptionSignalBacktest: An instance of the OptionSignalBacktest class with the configured environment. - -# Sequence: -# 1. Prepare the data for backtest. Which includes: -# - Loading the trades data. -# - Adjusting latest date to match the current date. -# 2. Set up the backtest environment with the given configuration and trades. -# 3. Run the backtest. -# 4. Transfer processed data to the custom cache for future use. -# 5. Run post test tasks, which involves deleting today's data from the cache. It will be re-added EOD with eod_task -# 6. Return the backtest object for further analysis or inspection. - -# """ - -# bkt = setup_backtest_env( -# trades=trades, -# portfolio_config=portfolio_config, -# rm_config=rm_config, -# sizer_settings=sizer_settings, -# config=config, -# weights=weights, -# cash=cash, -# skip_keys_map=skip_keys_map, -# bkt_config=bkt_config -# ) -# try: -# set_use_quotes(True) -# bkt.run() # Run the backtest -# set_use_quotes(False) -# except KeyError: -# logger.error("Backtest complete, key error coming from T+1 not available") -# print("Backtest complete, key error coming from T+1 not available") -# except Exception as e: -# raise e - -# ## Intra day needs to use quotes for backtest, not EOD. -# ## T_0 is the run date of the order search -# # t1 = change_to_last_busday(pd.to_datetime(T_0) + BDay(config['t_plus_n']), offset=-1).strftime('%Y-%m-%d') -# closed_orders = get_close_orders(trades, strateg_slug) -# open_orders = get_open_orders(bkt, T_0) -# actions=get_actions(bkt, T_0) - -# ## Save limits -# save_limits_from_backtester(bkt, T_0) - -# # Transfer processed data to the custom cacheOy -# print("Backtest completed. Transferring processed data to cache...") -# transfer_processed_data_to_cache(bkt) -# print("Processed data transferred to cache. Running post test tasks...") - -# return { -# 'BACKTESTER': bkt, -# 'CLOSED_ORDERS': closed_orders, -# 'OPEN_ORDERS': open_orders, -# 'ACTIONS': actions, -# } - - -# def get_close_orders_meta(consumption_trades:pd.DataFrame, strat_name:str) -> List[dict]: -# """ -# Get the close orders meta data for the given consumption trades DataFrame. -# Args: -# consumption_trades (pd.DataFrame): DataFrame containing trades data with columns 'ACTION', 'PT_BKTEST_SIG_ID', etc. -# strat_name (str): Name of the strategy to filter the trades. -# Returns: -# List[dict]: A list of dictionaries containing the close orders meta data. -# """ -# ## Get closed trades signal_id -# closed_signals = consumption_trades[consumption_trades['ACTION'] == Action.CLOSE.value]['PT_BKTEST_SIG_ID'].unique().tolist() - -# ## Get fills for the closed trades -# fills = get_fills(closed_signals, strat_name) - -# ## Get only open fills. -# open_fills = fills[fills['position_effect'] == Action.OPEN.value].copy() - -# ## Create order meta: -# close_today_signals=[] -# for i, row in open_fills.iterrows(): -# signal_id = row['signal_id'] -# signal_meta = parse_signal_id(signal_id) -# meta= dict( -# signal_id=signal_id, -# position_id = row['position_id'], -# submitted_timestamp=ny_now(), -# ticker=signal_meta['ticker'], -# direction=SignalTypes.LONG.value if row['direction']>0 else SignalTypes.SHORT.value, -# order_type='GTC', -# quantity=row['quantity'], -# limit_price=get_position_price(row['position_id'], -# ny_now().strftime('%Y-%m-%d')), -# fill_ts=None, -# fill_price=None, -# filled_qty=None, -# position_effect='CLOSE', -# strategy_name='LongBBandsTrend_SL' -# ) -# close_today_signals.append(meta) -# return close_today_signals - -# def get_close_orders(consumption_trades:pd.DataFrame, strat_name:str) -> dict: -# """ -# Get the close orders for the given close today order meta data. -# Args: -# close_today_order_meta (List[dict]): List of dictionaries containing the close orders meta data. -# Gotten from get_close_orders_meta function. -# Returns: -# dict: A dictionary where keys are tickers and values are dictionaries containing order details. -# """ - -# close_order_list={} -# consumption_trades = consumption_trades.copy() -# consumption_trades['signal_id'] = consumption_trades['PT_BKTEST_SIG_ID'] - -# ## Get closed trades signal_id -# closed_signals = consumption_trades[consumption_trades['ACTION'] == Action.CLOSE.value]['PT_BKTEST_SIG_ID'].unique().tolist() -# if not closed_signals: -# print("No closed trades found.") -# return close_order_list - -# ## Get fills for the closed trades -# fills = get_fills(closed_signals, strat_name) - -# ## Get only open fills. -# open_fills = fills[fills['position_effect'] == Action.OPEN.value].copy() - -# for idx, sig in open_fills.iterrows(): -# map_signal_id = consumption_trades[consumption_trades['signal_id'] == sig['signal_id']]\ -# ['PT_BKTEST_SIG_ID'].unique()[0] -# size=consumption_trades[consumption_trades['PT_BKTEST_SIG_ID'] == map_signal_id]['Size'].values[0] -# meta= parse_signal_id(sig['signal_id']) -# pairs=parse_position_id(sig['trade_id'])[1] -# order=dict( -# result='SUCCESSFUL', -# data=dict( -# trade_id=sig['trade_id'], -# close=get_position_price(sig['trade_id'], -# ny_now().strftime('%Y-%m-%d')), -# long=[x[1] for x in pairs if x[0] == 'L'], -# short=[x[1] for x in pairs if x[0] == 'S'], -# quantity=sig['quantity'], -# ), -# signal_id=sig['signal_id'], -# direction=SignalTypes.LONG.value if size > 0 else SignalTypes.SHORT.value, -# map_signal_id=map_signal_id, -# ) -# close_order_list[meta['ticker']] = order - -# return close_order_list - - - -# def get_open_orders(bkt:OptionSignalBacktest, t1: str) -> dict: -# """ -# Extract orders from the backtest object for a specific date. -# Args: -# bkt (OptionSignalBacktest): The backtest object containing the risk manager. -# t1 (str): The date for which to extract orders, formatted as 'YYYY-MM-DD'. -# Returns: -# dict: A dictionary where keys are tickers and values are dictionaries containing order details. -# """ -# if not isinstance(t1, str): -# if isinstance(t1, datetime): -# t1 = t1.strftime('%Y-%m-%d') -# else: -# raise ValueError("t1 must be a string in 'YYYY-MM-DD' format or a datetime object.") - -# orders = bkt.risk_manager.order_cache.get(t1, {}) -# unadjusted_trades = bkt.unadjusted_trades -# for order in orders.values(): -# opt_signal_id = order['signal_id'] -# order['map_signal_id'] = unadjusted_trades[unadjusted_trades['signal_id'] == opt_signal_id]['PT_BKTEST_SIG_ID'].unique()[0] -# return orders - - -# def get_open_orders_meta(bkt:OptionSignalBacktest, T_1: str) -> List[dict]: -# """ -# Get open orders metadata -# for the backtest on a specific date. -# Args: -# bkt (OptionSignalBacktest): The backtest object containing the risk manager. -# T_1 (str): The date for which to extract open orders, formatted as 'YYYY-MM-DD'. -# Returns: -# """ -# save_to_df = [] -# unadjusted_trades = bkt.unadjusted_trades -# _open_orders = get_open_orders(bkt, T_1) - -# ## Open Orders -# for tick, order in _open_orders.items(): -# meta=dict( -# signal_id=unadjusted_trades[unadjusted_trades['signal_id'] == order['signal_id']]['PT_BKTEST_SIG_ID'].unique()[0], -# position_id=order['data']['trade_id'], -# submitted_timestamp=ny_now(), -# ticker=tick, -# direction=order['direction'], -# order_type='GTC', -# quantity=order['data']['quantity'], -# limit_price=order['data']['close'], -# fill_ts=None, -# fill_price=None, -# filled_qty=None, -# position_effect='OPEN', -# strategy_name='LongBBandsTrend_SL' -# ) -# save_to_df.append(meta) -# return save_to_df - -# def get_actions(bkt:OptionSignalBacktest, T_1: str) -> dict: -# """ -# Get actions from the risk manager for a specific date. -# Args: -# bkt (OptionSignalBacktest): The backtest object containing the risk manager. -# T_1 (str): The date for which to extract actions, formatted as 'YYYY-MM-DD'. -# Returns: -# dict: A dictionary where keys are tickers and values are dictionaries containing action details. -# """ -# actions = [v for x, v in bkt.risk_manager._actions.items() if x.strftime('%Y-%m-%d') == T_1] -# actions = actions[0] if actions else {} -# return actions - -# ## Save Utils -# def save_orders_to_database(open_orders_meta: List[dict], -# close_order_meta: List[dict]) -> pd.DataFrame: -# """ -# Save open and exit orders to the database. -# Args: -# open_orders_meta (List[dict]): List of dictionaries containing open orders metadata. -# gotten from get_open_orders_meta function. -# close_order_meta (List[dict]): List of dictionaries containing close orders metadata. -# gotten from get_close_orders_meta function. -# Returns: -# pd.DataFrame: DataFrame containing the saved orders metadata. - -# """ -# save_to_df=open_orders_meta+close_order_meta -# db=DatabaseAdapter() -# db.save_to_database( -# data=pd.DataFrame(save_to_df), -# table_name='orders', -# db='portfolio_data', -# filter_data=False, -# _raise=True) -# return pd.DataFrame(save_to_df) - -# def _save_to_database_helper( -# consumption_trades: pd.DataFrame, -# strat_name: str, -# bkt: OptionSignalBacktest, -# T_1: str -# ): -# """ -# Helper function to save orders to the database. -# Args: -# consumption_trades (pd.DataFrame): DataFrame containing trades data. -# strat_name (str): Name of the strategy. -# bkt (OptionSignalBacktest): The backtest object. -# T_1 (str): The date for which to extract orders, formatted as 'YYYY-MM-DD'. -# Returns: -# None -# """ -# close_today_order_meta = get_close_orders_meta(consumption_trades, strat_name) -# open_orders_meta = get_open_orders_meta(bkt, T_1) - -# if not open_orders_meta and not close_today_order_meta: -# print("No open or close orders to save.") -# return -# print(f"Saving {len(open_orders_meta)} open orders and {len(close_today_order_meta)} close orders to database.") -# if not open_orders_meta: -# print("No open orders to save.") -# if not close_today_order_meta: -# print("No close orders to save.") -# # Save to database -# return save_orders_to_database(open_orders_meta, close_today_order_meta) - - -# def make_fill_meta( -# signal_id: str, -# strategy_name: str, -# position_id: str, -# fill_price: float, -# fill_timestamp: datetime, -# quantity: int|float, -# position_effect: str, -# direction: str, -# ticker: str, -# order_type: str, -# limit_price: float, -# filled_qty: int|float -# ): -# """ -# Create a fill meta dictionary for the order. -# """ -# assert position_effect in ['OPEN', 'CLOSE'], "position_effect must be either 'OPEN' or 'CLOSE'" -# assert direction in ['LONG', 'SHORT'], "direction must be either 'LONG' or 'SHORT'" -# return { -# 'signal_id': signal_id, -# 'strategy_name': strategy_name, -# 'position_id': position_id, -# 'fill_price': fill_price, -# 'fill_timestamp': fill_timestamp, -# 'quantity': quantity, -# 'position_effect': position_effect, -# 'direction': direction, -# 'ticker': ticker, -# 'order_type': order_type, -# 'limit_price': limit_price, -# 'filled_qty': filled_qty -# } - -# def save_fills_to_database(fills_list_meta: List[dict]): -# """ -# Save fills to the database. -# """ -# db=DatabaseAdapter() -# db.save_to_database( -# data=pd.DataFrame(fills_list_meta), -# table_name='fills', -# db='portfolio_data', -# filter_data=False, -# _raise=True -# ) - -# return True - - - -# ########## NEW FUNCTIONS ########## -# from ..positions.loaders.configs import get_configs -# from EventDriven.riskmanager._order_validator import build_inputs_with_config, OrderInputs, OrderSchema -# from EventDriven.riskmanager.market_data import get_timeseries_obj, OPTION_TIMESERIES_START_DATE -# CONFIGS = get_configs() - -# def load_position_actions(slug:str, test:bool = False) -> pd.DataFrame: -# trades = generate_trades_data(slug)[0] -# if not test: -# return trades[trades.ACTION == 'OPEN'],trades[trades.ACTION == 'CLOSE'] -# else: -# print("WARNING: TEST MODE. USING INCORRECT INFORMATION IN load_position_actions function") -# close = trades.copy() -# close['ACTION'] = 'CLOSE' -# close['EntryTime'] = datetime.now() - BDay(1) -# close['ExitTime'] = datetime.now() - BDay(1) -# opens = trades.copy() -# opens['ACTION'] = 'OPEN' -# opens['EntryTime'] = datetime.now() - BDay(1) -# opens['ExitTime'] = datetime.now() - BDay(1) -# return opens, close - -# def load_timeseries_for_trades(sym_list: List[str], force=False) -> None: -# timeseries = get_timeseries_obj() -# for sym in sym_list: -# load_bool = sym not in timeseries.spot \ -# or sym not in timeseries.chain_spot \ -# or sym not in timeseries.dividends \ -# or force - -# if load_bool: -# timeseries.load_timeseries(sym, OPTION_TIMESERIES_START_DATE, datetime.now(), force=force) - - -# def get_max_cash_for_symbol(sym: str, slug: str) -> float: -# return CONFIGS.get_configs(slug).cash_map[sym] - - -# def build_inputs(slug: str, -# row: pd.Series, -# tick: str) -> tuple[OrderSchema, OrderInputs]: -# """ -# Builds the inputs for the order selection engine based on the strategy slug and trade row. -# Args: -# slug (str): The strategy slug. -# row (pd.Series): The trade row containing trade details. Expected keys: ['PT_BKTEST_SIG_ID', 'Size', 'EntryTime'] -# tick (str): The stock ticker symbol. -# date (str|datetime): The date for the order selection. - -# Returns: -# Tuple[OrderSchema, OrderInputs]: A tuple containing the OrderSchema and OrderInputs dataclass. -# """ - -# ## Build Config for the strategy slug -# config = CONFIGS.get_configs(slug) - -# ## This is the max price for the order search engine -# max_close = get_max_cash_for_symbol(tick, slug) \ No newline at end of file diff --git a/.decommissioned/algo/algo.stratetgies.init_orders_new_init_orders.py b/.decommissioned/algo/algo.stratetgies.init_orders_new_init_orders.py deleted file mode 100644 index 8966072..0000000 --- a/.decommissioned/algo/algo.stratetgies.init_orders_new_init_orders.py +++ /dev/null @@ -1,54 +0,0 @@ -""" -This module provides functions to initialize and manage orders for backtesting strategies. -It includes functions to set up the backtest environment, run the backtest, and manage orders and fills. -""" -raise DeprecationWarning("This module (strategies.init_orders_new._init_orders) is deprecated and will be removed in future releases. Please use the new order management module.") -# from typing import List -# from datetime import datetime -# from copy import deepcopy -# import os -# import pandas as pd -# from pandas.tseries.offsets import BDay -# from trade.helpers.helper import ( -# change_to_last_busday, -# str_to_bool, -# ny_now -# ) -# from trade.helpers.Logging import setup_logger -# from EventDriven.backtest import OptionSignalBacktest -# from EventDriven.riskmanager.sizer import ZscoreRVolSizer, DefaultSizer -# from EventDriven.riskmanager.utils import ( -# set_timeseries_start, -# set_timeseries_end, -# set_use_temp_cache -# ) -# from EventDriven.riskmanager.utils import parse_position_id -# from EventDriven.helpers import parse_signal_id, generate_signal_id -# from EventDriven.types import SignalTypes -# from module_test.raw_code.DataManagers.DataManagers import set_skip_mysql_query, set_use_quotes -# from dbase.database.SQLHelpers import DatabaseAdapter -# from ..init_strategies import get_fills -# from ..enums import Action -# from ..init_environ import ( -# get_custom_cache -# ) -# from ..utils import (create_max_cash_map, -# get_option_price_theta_data, -# get_option_price, -# get_option_realtime_quote, -# get_position_price,) -# from ...positions.loaders.limits._limits import save_limits_from_backtester -# logger = setup_logger('strategies.init_orders_new._init_orders') -# bkt_logger = setup_logger('strategies.backtest') - -# logger.critical("WARNING: This module (strategies.init_orders_new._init_orders) is deprecated and will be removed in future releases. Please use the new order management module.") - - - - - - - - - - diff --git a/.decommissioned/strats.py b/.decommissioned/strats.py deleted file mode 100644 index 4a06c70..0000000 --- a/.decommissioned/strats.py +++ /dev/null @@ -1,179 +0,0 @@ -from backtesting.lib import crossover -import pandas_ta as ta -import os -import sys -from backtesting.backtesting import Strategy -import pandas as pd - - -def shift(series,n): - pd.Series(series) - return pd.Series(series).shift(n) - - -class BBandsTrend2(Strategy): - start_date = None - outter_band = 2 - inner_band = 0.5 - length = 190 - exit_ma = 35 - stop_loss = 0.1 - long_close = False - long_close_counter = 0 - long_open = False - long_open_counter = 0 - short_open_ = False - short_open_counter = 0 - short_close_ = False - short_close_counter = False - open_wait_days = 0 - close_wait_days =0 - gapper_limit = 1000 - start, end, interval = '2000-06-08', '2024-06-29', '1d' - - - def init(self): - #COMPUTE MOVING AVERAGES FOR STRATEGY - bbands_outter = ta.bbands(pd.Series(self.data.Close), length=self.length, std=self.outter_band, mamode='sma') - bbands_inner = ta.bbands(pd.Series(self.data.Close), length=self.length, std=self.inner_band, mamode='sma') - macd = ta.macd(pd.Series(self.data.Close), 12,26,9) - adx = ta.adx(pd.Series(self.data.High), pd.Series(self.data.Low), pd.Series(self.data.Close), 21, mamode='wilders') - # Assign bands to instance variables - self.lower_inner_band = self.I(lambda: bbands_inner[f'BBL_{int(self.length)}_{float(self.inner_band)}'], name = 'lower_inner_band', color = 'blue', overlay = True) - self.middle_inner_band = self.I(lambda: bbands_inner[f'BBM_{int(self.length)}_{float(self.inner_band)}'], name = 'middle_inner_band') - self.upper_inner_band = self.I(lambda: bbands_inner[f'BBU_{int(self.length)}_{float(self.inner_band)}'], name = 'upper_inner_band', color = 'blue', overlay= True) - # self.sp500 = self.I(create_datasate,['SPY'], self.start, '1d',end = self.end , return_object=False) - self.MACD_Hist = self.I(lambda: macd['MACDh_12_26_9'], name = 'MACD HIS') - self.ADX = self.I(lambda: adx['ADX_21']) - - self.exit_ma = self.I(ta.ema, pd.Series(self.data.Close), length=self.exit_ma) - - def next(self): - price = self.data.Close[-1] - date = self.data.index[-1] - macd = self.MACD_Hist[-1] - adx = self.ADX[-1] - upper = self.upper_inner_band[-1] - lower = self.lower_inner_band[-1] - date = self.data.index[-1] - middle = self.middle_inner_band[-1] - exit_ma = self.exit_ma[-1] - up_gap_ = abs((upper / exit_ma) - 1)*100 - - - - - - print(date, ':','Open', self.long_open, self.long_open_counter) if self.long_open_counter > 51 else None - print(date, ':','Close', self.long_close, self.long_close_counter) if self.long_close_counter > 51 else None - # Check for entry crossover from below to above - if price > upper and not self.long_open: - # print('Set Long Flag to True', date) - self.long_open = True - self.long_open_counter += 1 - - # Check for exit crossover from below - if price < upper and not self.long_close: - self.long_close = True - self.long_close_counter = True - - # If Price goes below entry crossover, reset entry flags - if price < upper and self.long_open: - # print('Set Long Flag to False', date) - self.long_open = False - self.long_open_counter = 0 - - - #If price goes back above exit crossover, reset exit flags - if price > upper and self.long_close: - # print('Set Close Long Flag to True', date) - self.long_close = False - self.long_close_counter = 0 - - # Increment open counter if entry is still valid - if self.long_open: - # print('Hi') - self.long_open_counter += 1 - - - #Increment close counter if exit is still valid - if self.long_close: - self.long_close_counter += 1 - - # Enter a trade after waiting period if no position is open - if self.long_open and self.long_open_counter >= self.open_wait_days: - if not self.position: - # print('Opening Long', date) - self.buy(sl=self.data.Close[-1] * (1 - self.stop_loss)) - self.long_open = False - self.long_open_counter = 0 - - #Exit a trade after waiting period if position is still open - if self.long_close and self.long_close_counter >= self.close_wait_days: - if self.position: - # print('Closing Long', date) - self.position.close() - self.long_close = False - self.long_close_counter = 0 - - -class MAStrat(Strategy): - trend_ma = 71 - entry_ma = 36 - exit_ma_v = 20 - stop_loss = 0.30 # 2% stop loss - take_profit = 0.15 - shift = 4 - - def init(self): - #COMPUTE MOVING AVERAGES FOR STRATEGY - # self.ma_trend = self.I(ta.ma, "ema", pd.Series(self.data.Close), length = self.trend_ma ) - self.ma_entry = self.I(ta.ma, "ema", pd.Series(self.data.Close), length = self.entry_ma ) - self.exit_ma = self.I(ta.ma, "ema", pd.Series(self.data.Close), length = self.exit_ma_v ) - self.ma_shifter = self.I(shift, self.exit_ma, self.shift) - self.close_shifter = self.I(shift, self.data.Close, self.shift) - # self.trend_ma = self.I(ta.ma, "ema", pd.Series(self.data.Close), length = self.trend_ma ) - - def next(self): - shifted = self.ma_shifter[-1] - price = self.data.Close[-1] - date = self.data.index[-1] - entry = self.ma_entry[-1] - close_shifted = self.close_shifter[-1] - # trend = self.trend_ma[-1] - # print(self.data.Next_Day_Open[-1]) - # print(entry, shifted) - - #IF WE DON'T ALREADY HAVE A POSITION - if crossover(self.data.Close,self.ma_entry ) and not self.position and entry >= shifted and price >= close_shifted: - self.buy(sl=self.data.Close[-1] * (1 - self.stop_loss)) - - - elif (self.position and price < self.exit_ma) : - self.position.close() - - if self.ma_entry > self.data.Close and not self.position: - self.sell() - - elif (self.position and price > self.exit_ma) : - self.position.close() - - - - - - - # elif price < trend: - - # if crossover(self.ma_entry, self.data.Close ) and not self.position and price < entry: - # self.sell() - - # elif (self.position and price > self.exit_ma): - # self.position.close() - - - # FIGURE OUT HOW TO USE CROSS - elif not self.position and crossover(self.data.Close,self.exit_ma ) : - # RE-ENTER TRADE AS LONG AS ABOVE 21 SMA & CROSS OVER 13 - self.buy(sl=self.data.Close[-1] * (1 - self.stop_loss)) - diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md new file mode 100644 index 0000000..4643047 --- /dev/null +++ b/.github/copilot-instructions.md @@ -0,0 +1,156 @@ +# QuantTools DataManager System - Copilot Instructions + +## Project Overview +This is a quantitative trading system focused on options pricing and risk management. + +## Code Style & Standards + +### Type Hints +- Always use complete type hints for all function parameters and return values +- Use `Union[datetime, str]` for date parameters that accept multiple formats +- Use `Optional[T]` for nullable parameters +- Import types from `typing`: `Optional, Union, List, Dict, Tuple, ClassVar` + +### Date/Time Conversion +- **Always use `to_datetime` from `trade.helpers.helper` for datetime conversions** +- Never use `datetime.strptime()` or `pd.to_datetime()` directly +- Import: `from trade.helpers.helper import to_datetime` +- Handles both single values and iterables +- Tries "%Y-%m-%d" format first, then lets pandas guess if that fails +- Supports optional `format` parameter for custom formats + +**Example:** +```python +from trade.helpers.helper import to_datetime + +# Single string conversion +date_obj = to_datetime("2026-01-15") + +# With custom format +date_obj = to_datetime("15-01-2026", format="%d-%m-%Y") + +# Iterable conversion +dates = to_datetime(["2026-01-15", "2026-01-16", "2026-01-17"]) + +# Already datetime - returns as-is +date_obj = to_datetime(datetime.now()) +``` + +### Docstrings +- Use Google-style docstrings for all classes and methods +- Include Args, Returns, Raises, and Examples sections +- Examples should be executable and demonstrate real-world usage + +**Example:** +```python +def get_forward_timeseries( + self, + start_date: Union[datetime, str], + end_date: Union[datetime, str], + maturity_date: Union[datetime, str], + div_type: Optional[DivType] = None, + *, + dividend_result: Optional[DividendsResult] = None, + use_chain_spot: bool = True, +) -> ForwardResult: + """Returns daily forward prices from valuation dates to maturity. + + Computes forward prices for each business day in [start_date, end_date], + where each forward is valued to the fixed maturity_date. Uses discrete + dividends (Schedule objects) or continuous yields depending on div_type. + + Args: + start_date: First valuation date (YYYY-MM-DD string or datetime). + end_date: Last valuation date (YYYY-MM-DD string or datetime). + maturity_date: Fixed horizon date for all forwards (e.g., option expiry). + div_type: DivType.DISCRETE or DivType.CONTINUOUS. Defaults to DISCRETE. + dividend_result: Pre-computed dividend data. If None, fetches internally. + use_chain_spot: If True, uses split-adjusted chain_spot prices. + + Returns: + ForwardResult containing daily_discrete_forward or daily_continuous_forward + Series with DatetimeIndex, plus the dividend_result used and cache key. + + Raises: + ValueError: If maturity_date < start_date. + ValueError: If dividend_result.undo_adjust != use_chain_spot. + + Examples: + >>> # Basic usage with automatic dividend fetching + >>> fwd_mgr = ForwardDataManager("AAPL") + >>> result = fwd_mgr.get_forward_timeseries( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... maturity_date="2025-06-20", + ... div_type=DivType.DISCRETE, + ... use_chain_spot=True + ... ) + >>> print(result.daily_discrete_forward.head()) + datetime + 2025-01-02 155.32 + 2025-01-03 156.01 + ... + + >>> # Provide pre-computed dividends for efficiency + >>> div_mgr = DividendDataManager("AAPL") + >>> div_result = div_mgr.get_schedule_timeseries( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... maturity_date="2025-06-20", + ... undo_adjust=True + ... ) + >>> fwd_result = fwd_mgr.get_forward_timeseries( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... maturity_date="2025-06-20", + ... dividend_result=div_result, + ... use_chain_spot=True + ... ) + """ +``` + +### Naming Conventions +- **Classes:** + - Managers end with `Manager`: `DividendDataManager`, `RatesDataManager` + - Results end with `Result`: `DividendsResult`, `ForwardResult`, `RatesResult` + - Configs end with `Config`: `DividendsConfig` +- **Methods:** + - Use `get_*` for retrieval methods: `get_schedule()`, `get_rate()` + - Use `_load_*` for private loading helpers: `_load_spot()`, `_load_rates()` + - Use `_compute_*` for calculation methods: `_compute_forward_discrete()` +- **Variables:** + - Use `_str` suffix for string dates: `start_str`, `end_str`, `mat_str` + - Use `_dt` suffix for date objects: `start_dt`, `end_dt`, `mat_dt` + +### Dataclasses +- Prefer `@dataclass` over regular classes for data containers +- Use pydantic `@dataclass` for validation when needed (Only on strict data models) + - Import from `pydantic.dataclasses` for pydantic dataclasses and alias as `pydantic_dataclass` +- Result classes should inherit from base `Result` class +- Use `frozen=True, slots=True` for immutable configs (e.g., `CacheSpec`) + +**Example:** +```python +@dataclass(frozen=True, slots=True) +class CacheSpec: + """Configuration for cache initialization.""" + base_dir: Optional[Path] = DM_GEN_PATH.as_posix() + default_expire_days: Optional[int] = 500 + default_expire_seconds: Optional[int] = None + cache_fname: Optional[str] = None + clear_on_exit: bool = False + +@dataclass +class DividendsResult(Result): + """Result container for dividend data.""" + daily_discrete_dividends: Optional[pd.Series] = None + daily_continuous_dividends: Optional[pd.Series] = None + dividend_type: Optional[DivType] = None + key: Optional[str] = None + undo_adjust: Optional[bool] = None + + def is_empty(self) -> bool: + if self.dividend_type == DivType.DISCRETE: + return self.daily_discrete_dividends is None or self.daily_discrete_dividends.empty + return True +``` diff --git a/.github/prompt-library.md b/.github/prompt-library.md new file mode 100644 index 0000000..1bdc726 --- /dev/null +++ b/.github/prompt-library.md @@ -0,0 +1,30 @@ +# Prompt Library + +## Code Review Sweep (QuantTools + TFP-Algo + configs) + +Use this prompt to run a recurring review for API mismatches, regressions, and logic/execution discrepancies. + +``` +You are my code-review copilot. Please review recent changes across these repos: +- QuantTools +- TFP-Algo +- configs + +Goals: +1) Identify breaking API changes or call-site mismatches (especially around StrategyBase, TradeDecision, open_action/close_action, signal_id/side). +2) Check for behavioral regressions and missing validations. +3) Verify notebook outputs are cleared where expected. +4) Look for logic/execution discrepancies: places where the intended logic (docs/comments, docstrings, function names, or config flags) does not match what the code actually executes. +5) Bucket findings into Critical / High / Low, with file links and line references. + +Please: +- Use file searches to find StrategyBase implementations and call sites. +- Cross-check docstrings and examples against actual behavior. +- List any gaps in tests or runtime checks. +- If no findings, say so explicitly and note residual risks. + +Output format: +- Findings first (Critical -> High -> Low), each with file links and concise explanation. +- Open questions/assumptions. +- Brief change summary (only if needed). +``` diff --git a/.gitignore b/.gitignore index cda8f7e..723838a 100644 --- a/.gitignore +++ b/.gitignore @@ -198,4 +198,12 @@ trade/helpers/*vol_resolve*.json # Adhoc Path EventDriven/notebooks/riskmanager_streamline/ EventDriven/tests.py -trade/assets/notebooks \ No newline at end of file +trade/assets/notebooks + + +# ignore all notebooks +**/*.ipynb + +# allow notebooks in any demo folder (demo or demos) +!**/demo/**/*.ipynb +!**/demos/**/*.ipynb \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index bb55cf5..8619b8c 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -22,6 +22,24 @@ "python.languageServer": "Pylance", "python.analysis.useLibraryCodeForTypes": true, "python.analysis.typeCheckingMode": "off", - "python.analysis.diagnosticMode": "openFilesOnly" + "python.analysis.diagnosticMode": "workspace", + "python.analysis.indexing": true, + "python.analysis.autoImportCompletions": true, + "python.analysis.includeAliasesFromUserFiles": true, + "python.analysis.userFileIndexingLimit": 5000, + "python.analysis.packageIndexDepths": [ + { + "name": "pydantic", + "depth": 3, + "includeAllSymbols": true + } + ], + "python-envs.pythonProjects": [ + { + "path": "", + "envManager": "ms-python.python:conda", + "packageManager": "ms-python.python:conda" + } + ] } \ No newline at end of file diff --git a/BestPractice.md b/BestPractice.md deleted file mode 100644 index ab3f831..0000000 --- a/BestPractice.md +++ /dev/null @@ -1,7 +0,0 @@ -## Pandas: -- DataFrames: - ## When handling timeseries, datetime column should be index - - -## Useability Management: -- Write typehints & docstrings \ No newline at end of file diff --git a/EventDriven/backtest.py b/EventDriven/backtest.py index 49c7a29..5f1b139 100644 --- a/EventDriven/backtest.py +++ b/EventDriven/backtest.py @@ -1,12 +1,14 @@ from queue import Empty as emptyEventQueue +from typing import Optional, cast import pandas as pd -from EventDriven.data import HistoricTradeDataHandler +from EventDriven.data import HistoricTradeDataHandler from EventDriven.event import Event from EventDriven.strategy import OptionSignalStrategy from EventDriven.new_portfolio import OptionSignalPortfolio from EventDriven.execution import SimulatedExecutionHandler from EventDriven.riskmanager.new_base import RiskManager from EventDriven.eventScheduler import EventScheduler +from trade.backtester_._multi_asset_strategy import MultiAssetStrategy from trade.helpers.Logging import setup_logger from trade.helpers.helper import change_to_last_busday from EventDriven.helpers import generate_signal_id @@ -15,12 +17,15 @@ from pandas.tseries.offsets import BDay from EventDriven.types import EventTypes, SignalTypes from EventDriven.configs.core import BacktesterConfig +from .exceptions import EVBacktestError -LOGGER = setup_logger("OptionSignalBacktest") -class OptionSignalBacktest(): +LOGGER = setup_logger("OptionSignalBacktest", stream_log_level="WARNING") + + +class OptionSignalBacktest: """ Event-driven backtesting engine for option trading strategies. - + This class orchestrates the complete backtesting workflow by coordinating multiple components: - Data handling (HistoricTradeDataHandler) - Strategy signal generation (OptionSignalStrategy) @@ -28,10 +33,10 @@ class OptionSignalBacktest(): - Portfolio management (OptionSignalPortfolio) - Order execution with slippage simulation (SimulatedExecutionHandler) - Event scheduling and processing (EventScheduler) - + The backtester processes trades chronologically through an event queue, simulating realistic market conditions including entry/exit timing, slippage, position sizing, and risk limits. - + Key Features: - T+N settlement adjustments for realistic entry/exit timing - Configurable slippage range for execution realism @@ -39,13 +44,13 @@ class OptionSignalBacktest(): - Risk management with position limits and exposure controls - Support for both options and equity positions - Detailed logging and error handling - + Workflow: 1. Initialize with trade data and configuration 2. Call run() to execute the backtest 3. Access results via portfolio.ledger, portfolio.holdings, etc. 4. Use clean_run() to backtest with different parameters - + Attributes: config (BacktesterConfig): Configuration settings for the backtest bars (HistoricTradeDataHandler): Market data handler @@ -58,7 +63,7 @@ class OptionSignalBacktest(): end_date (date): Backtest end date initial_capital (float): Starting portfolio value unadjusted_trades (pd.DataFrame): Original trades before T+N adjustment - + Example: >>> # Basic usage >>> trades_df = pd.DataFrame({ @@ -69,7 +74,7 @@ class OptionSignalBacktest(): ... 'EntryPrice': [150.0, 155.0], ... 'ExitPrice': [155.0, 150.0] ... }) - >>> + >>> >>> config = BacktesterConfig(t_plus_n=1, max_slippage_pct=0.001) >>> backtest = OptionSignalBacktest( ... trades=trades_df, @@ -77,33 +82,36 @@ class OptionSignalBacktest(): ... config=config ... ) >>> backtest.run() - >>> + >>> >>> # Access results >>> ledger = backtest.portfolio.ledger >>> final_value = backtest.portfolio.current_holdings['total'] - + See Also: BacktesterConfig: Configuration dataclass for backtest settings OptionSignalPortfolio: Portfolio management and P&L tracking RiskManager: Risk controls and position validation """ - - def __init__(self, trades: pd.DataFrame, - initial_capital: int | float =100000, - symbol_list = None, - *, - config: BacktesterConfig = None, - end_date: pd.Timestamp = None - ) -> None: + + def __init__( + self, + trades: pd.DataFrame = None, + initial_capital: int | float = 100000, + symbol_list=None, + *, + eq_strategy: Optional[MultiAssetStrategy] = None, + config: Optional[BacktesterConfig] = None, + end_date: Optional[pd.Timestamp] = None, + ) -> None: """ Initialize the backtesting engine with trade data and configuration. - + This constructor sets up all necessary components for the backtest including data handlers, portfolio manager, risk controls, and event scheduler. It preprocesses trades to handle T+N settlement adjustments and generates unique signal IDs for tracking. - + Args: - trades (pd.DataFrame): + trades (pd.DataFrame): DataFrame containing trade signals to backtest. Must include the following columns: - 'Ticker' or 'Symbol': Stock/option ticker symbol - 'EntryTime': Trade entry timestamp (str or datetime) @@ -111,21 +119,25 @@ def __init__(self, trades: pd.DataFrame, - 'Size': Position size (positive for long, negative for short) - 'EntryPrice': Entry execution price - 'ExitPrice': Exit execution price (can be NaN for open positions) - + Optional columns: - 'signal_id': Unique identifier for each signal (auto-generated if missing) - 'EntryType': Order type at entry (e.g., 'MKT', 'LMT') - 'ExitType': Order type at exit - - initial_capital (int | float, optional): + + initial_capital (int | float, optional): Starting portfolio value in dollars. Defaults to 100000. Used for position sizing and P&L calculations. - - symbol_list (list, optional): + + symbol_list (list, optional): List of symbols to track. If None, extracted from trades DataFrame. Useful for including symbols that may appear later in the backtest. - - config (BacktesterConfig, optional): + + eq_strategy (MultiAssetStrategy, optional): + Equity strategy instance. When provided, trades DataFrame is ignored and + signals are generated from the strategy. + + config (BacktesterConfig, optional): Configuration object controlling backtest behavior. If None, uses defaults. Key configuration options: - t_plus_n (int): Settlement delay in business days (0 or 1) @@ -133,23 +145,24 @@ def __init__(self, trades: pd.DataFrame, - min_slippage_pct (float): Minimum slippage as % of price - finalize_trades (bool): Whether to finalize incomplete trades - raise_errors (bool): Whether to raise exceptions or log them - - end_date (pd.Timestamp, optional): + + end_date (pd.Timestamp, optional): Override backtest end date. If None, uses the latest ExitTime in trades. Useful for extending backtests beyond the last trade exit. - + Raises: TypeError: If config is not a BacktesterConfig instance or None ValueError: If trades DataFrame is empty ValueError: If t_plus_n is not 0 or 1 - + ValueError: If both trades and eq_strategy are provided + Notes: - Trades are automatically adjusted for T+N settlement if configured - Signal IDs are auto-generated using ticker, entry time, and direction - Start date is set to 1 business day before earliest entry - All timestamps are converted to business days (skipping weekends/holidays) - Original unadjusted trades are preserved in self.unadjusted_trades - + Example: >>> # With custom configuration >>> config = BacktesterConfig( @@ -157,7 +170,6 @@ def __init__(self, trades: pd.DataFrame, ... max_slippage_pct=0.002, # 0.2% max slippage ... finalize_trades=True ... ) - >>> >>> backtest = OptionSignalBacktest( ... trades=my_trades_df, ... initial_capital=500000, @@ -165,16 +177,104 @@ def __init__(self, trades: pd.DataFrame, ... config=config, ... end_date=pd.Timestamp('2024-12-31') ... ) - + >>> + >>> # Equity strategy mode + >>> backtest_eq = OptionSignalBacktest( + ... eq_strategy=my_multi_asset_strategy, + ... initial_capital=500000, + ... end_date=pd.Timestamp('2024-12-31') + ... ) + See Also: BacktesterConfig: For detailed configuration options clean_run(): To re-run backtest with different parameters """ + + if eq_strategy is not None and trades is not None: + raise ValueError("Cannot provide both trades DataFrame and eq_strategy. Please choose one.") + self.is_eq_strategy = eq_strategy is not None + self.eq_strategy: Optional[MultiAssetStrategy] = eq_strategy + self.strategy: Optional[OptionSignalStrategy] = None if config is not None and not isinstance(config, BacktesterConfig): raise TypeError("config must be an instance of BacktesterConfig or None") - - self.config: BacktesterConfig = config or BacktesterConfig() - + + self.config: BacktesterConfig = cast( + BacktesterConfig, + config if config is not None else BacktesterConfig(), + ) + self.end_date = end_date + if self.is_eq_strategy: + self.logger.info("Initializing backtest with equity strategy. Trades DataFrame will be ignored.") + self.__init__with_equity_strategy(eq_strategy, cash=initial_capital) + else: + self.logger.info("Initializing backtest with trades DataFrame. Equity strategy will not be used.") + if trades is None or trades.empty: + raise ValueError("Trades DataFrame cannot be None or empty when not using an equity strategy.") + self.__init__with_trades(trades, initial_capital, symbol_list, end_date=end_date) + + def __init__with_equity_strategy( + self, + eq_strategy: MultiAssetStrategy, + cash: int | float = 100000, + ) -> None: + """ + Initializes the backtest using an equity strategy. This method sets up the backtest components based on the provided MultiAssetStrategy instance. + Args: + eq_strategy (MultiAssetStrategy): An instance of MultiAssetStrategy containing the strategy logic and data. + cash (int | float, optional): Initial capital for the backtest. Defaults to 100000. + Raises: + AssertionError: If eq_strategy is not provided, not an instance of MultiAssetStrategy, or if end_date is not provided. + EVBacktestError: If tplusn value of the equity strategy does not match the backtest configuration. + """ + assert eq_strategy is not None, "Equity strategy must be provided for this initialization method" + assert isinstance( + eq_strategy, MultiAssetStrategy + ), f"eq_strategy must be an instance of MultiAssetStrategy, got {type(eq_strategy)}" + assert self.end_date is not None, "end_date must be provided for this initialization method" + if eq_strategy.tplusn != self.config.t_plus_n: + raise EVBacktestError(f"tplusn value of the equity strategy does not match the backtest configuration. eq_strategy.tplusn: {eq_strategy.tplusn}, config.t_plus_n: {self.config.t_plus_n}") + + ## We will not use trades dataframe in this process. + self.start_date = pd.to_datetime(eq_strategy.start_date).date() + start_date, end_date = self.start_date, self.end_date + self.eq_strategy.reset_strategies() + + + + ## Initialize critical components + self.eventScheduler = EventScheduler(start_date, end_date) + self.bars = HistoricTradeDataHandler( + self.eventScheduler, + trades_df=pd.DataFrame(), # No initial trades, will be generated by strategy + symbol_list=list(eq_strategy.data.keys()), + finalize_trades=self.config.finalize_trades, + start_date=start_date, + end_date=end_date, + ) + self.executor = SimulatedExecutionHandler(self.eventScheduler) + self.risk_manager = RiskManager( + symbol_list=self.bars.symbol_list, + bkt_start=start_date, + bkt_end=end_date, + initial_capital=cash, + ) + self.portfolio = OptionSignalPortfolio( + self.bars, + self.eventScheduler, + risk_manager=self.risk_manager, + initial_capital=float(cash), + eq_strategy=eq_strategy, + ) + self.events = [] + + def __init__with_trades( + self, + trades: pd.DataFrame, + initial_capital: int | float = 100000, + symbol_list=None, + *, + end_date: Optional[pd.Timestamp] = None, + ) -> None: ## Initialize trades dataframe. Trades to be preprocessed to handle t_plus_n logic and unadjusted trades ## to be stored for reference trades = trades.copy() @@ -184,70 +284,90 @@ def __init__(self, trades: pd.DataFrame, trades = self.__handle_t_plus_n(trades) if "signal_id" not in trades.columns: self.logger.info("Generating 'signal_id' for trades DataFrame") - unadjusted['signal_id'] = trades.apply(lambda row: generate_signal_id(row['Ticker'], - row['EntryTime'], - SignalTypes.LONG.value if row['Size'] > 0 else SignalTypes.SHORT.value), - axis=1) + unadjusted["signal_id"] = trades.apply( + lambda row: generate_signal_id( + row["Ticker"], + row["EntryTime"], + SignalTypes.LONG.value if row["Size"] > 0 else SignalTypes.SHORT.value, + ), + axis=1, + ) else: - self.logger.critical("Trades DataFrame already contains 'signal_id' column. If this is unintended, please remove it to allow automatic generation.") - unadjusted['signal_id'] = trades['signal_id'] - unadjusted['unadjusted_signal_id'] = unadjusted.apply(lambda row: generate_signal_id(row['Ticker'], - row['EntryTime'], - SignalTypes.LONG.value if row['Size'] > 0 else SignalTypes.SHORT.value), - axis=1) + self.logger.critical( + "Trades DataFrame already contains 'signal_id' column. If this is unintended, please remove it to allow automatic generation." + ) + unadjusted["signal_id"] = trades["signal_id"] + unadjusted["unadjusted_signal_id"] = unadjusted.apply( + lambda row: generate_signal_id( + row["Ticker"], row["EntryTime"], SignalTypes.LONG.value if row["Size"] > 0 else SignalTypes.SHORT.value + ), + axis=1, + ) ## Store unadjusted trades for reference - self.unadjusted_trades = unadjusted.copy() + self.unadjusted_trades = unadjusted.copy() self.end_date = end_date self.__construct_data(trades, initial_capital, symbol_list) - + @property def logger(self): return LOGGER - - def __construct_data(self, trades: pd.DataFrame, initial_capital: int, symbol_list: list) -> None: - + + def __construct_data(self, trades: pd.DataFrame, initial_capital: int, symbol_list: list) -> None: ## Date range setup ## Move back a day if not business day - self.start_date = change_to_last_busday(pd.to_datetime(trades['EntryTime']).min() - BDay(1), 1).date() - + self.start_date = change_to_last_busday(pd.to_datetime(trades["EntryTime"]).min() - BDay(1), 1).date() + ## Move forward a day if not business day - self.end_date = self.end_date or change_to_last_busday(pd.to_datetime(trades['ExitTime']).max(), -1).date() - + self.end_date = self.end_date or change_to_last_busday(pd.to_datetime(trades["ExitTime"]).max(), -1).date() + ## Store trades and initial capital for clean runs self.bars_trades = trades self.initial_capital = initial_capital - - #initialize critical components + + # initialize critical components self.eventScheduler = EventScheduler(self.start_date, self.end_date) - self.bars = HistoricTradeDataHandler(self.eventScheduler, trades, symbol_list, finalize_trades=self.config.finalize_trades, end_date=self.end_date) + self.bars = HistoricTradeDataHandler( + self.eventScheduler, + trades, + symbol_list, + finalize_trades=self.config.finalize_trades, + end_date=self.end_date, + ) self.strategy = OptionSignalStrategy(self.bars, self.eventScheduler) - self.executor = SimulatedExecutionHandler(self.eventScheduler) - self.risk_manager = RiskManager(symbol_list=self.bars.symbol_list, - bkt_start=self.start_date, - bkt_end=self.end_date, - initial_capital=initial_capital,) - - self.portfolio = OptionSignalPortfolio(self.bars, self.eventScheduler, risk_manager=self.risk_manager, initial_capital= float(initial_capital)) - self.final_date = pd.to_datetime(list(self.eventScheduler.events_map)[-1]).strftime('%Y%m%d') - self.risk_free_rate = 0.055 + self.executor = SimulatedExecutionHandler(self.eventScheduler) + self.risk_manager = RiskManager( + symbol_list=self.bars.symbol_list, + bkt_start=self.start_date, + bkt_end=self.end_date, + initial_capital=initial_capital, + ) + + self.portfolio = OptionSignalPortfolio( + self.bars, self.eventScheduler, risk_manager=self.risk_manager, initial_capital=float(initial_capital) + ) self.events = [] - self.order_cache = {} - + def __handle_t_plus_n(self, trades: pd.DataFrame) -> pd.DataFrame: """ Handles the t_plus_n logic for trades, adjusting entry and exit times based on the t_plus_n value. """ + if self.config.t_plus_n > 1: + raise ValueError("t_plus_n must be either 0 or 1.") if self.config.t_plus_n > 0: self.logger.info(f"Adjusting EntryTime and ExitTime by {self.config.t_plus_n} business days") ## Adjust EntryTime and ExitTime by t_plus_n business days - trades['EntryTime'] = trades['EntryTime'].apply(lambda x: change_to_last_busday(pd.to_datetime(x) + BDay(self.config.t_plus_n), -1).replace(hour = 0)) ## Adjust EntryTime by t_plus_n business days, and offseting to next business day if holiday + trades["EntryTime"] = trades["EntryTime"].apply( + lambda x: change_to_last_busday(pd.to_datetime(x) + BDay(self.config.t_plus_n), -1).replace(hour=0) + ) ## Adjust EntryTime by t_plus_n business days, and offseting to next business day if holiday ## Only adjust ExitTime if it is not NaT - trades['ExitTime'] = trades['ExitTime'].apply(lambda x: change_to_last_busday(pd.to_datetime(x) + BDay(self.config.t_plus_n), -1).replace(hour = 0) if pd.notna(x) else x) ## Adjust ExitTime by t_plus_n business days, and offseting to next business day if holiday - elif self.config.t_plus_n > 1: - raise ValueError("t_plus_n must be either 0 or 1.") + trades["ExitTime"] = trades["ExitTime"].apply( + lambda x: change_to_last_busday(pd.to_datetime(x) + BDay(self.config.t_plus_n), -1).replace(hour=0) + if pd.notna(x) + else x + ) ## Adjust ExitTime by t_plus_n business days, and offseting to next business day if holiday return trades - + def run(self): ## Runtime configurations changes self.portfolio.t_plus_n = self.config.t_plus_n @@ -259,34 +379,37 @@ def run(self): ## Begin backtest by looping through event scheduler dates while True: # Get current event queue - if self.eventScheduler.current_date is None: + if self.eventScheduler.current_date is None: self.logger.info("No more dates left.") print("No more dates left.") break - + self.logger.info(f"Processing events for {self.eventScheduler.current_date}") current_event_queue = self.eventScheduler.get_current_queue() event_count = 0 # Process events for the current bar # Avoid blocking. Loops through the event queue - while True: + while True: try: ## Placing before get_nowait because I want to check for roll, and if there is no roll, I want to break out of the loop - if len(list(deepcopy(current_event_queue.queue))) == 0: - meta = self.portfolio.analyze_positions() - print(f"Position Analysis Meta: {meta}") + if len(list(deepcopy(current_event_queue.queue))) == 0: + meta = self.portfolio.analyze_positions() # noqa + # print(f"Position Analysis Meta: {meta}") event = current_event_queue.get_nowait() except emptyEventQueue: self.logger.info(f"Event queue is empty, processed {event_count} event(s)") - print(f"Event queue is empty, processed {event_count} event(s)") - + # Update portfolio time index after processing all events self.portfolio.update_timeindex() - - #advance scheduler queue to next date + + # Analyze eq_strategy if applicable + if self.is_eq_strategy: + self.portfolio.analyze_multiasset_strategy() + + # advance scheduler queue to next date self.eventScheduler.advance_date() break except Exception as e: @@ -300,7 +423,6 @@ def run(self): event_count += 1 try: self.logger.info(f"Processing event: {event}") - print(f"Processing event: {event.type} {event.datetime}") if event.type == EventTypes.SIGNAL.value: self.portfolio.analyze_signal(event) @@ -312,7 +434,7 @@ def run(self): elif event.type == EventTypes.EXERCISE.value: self.executor.execute_exercise(event) elif event.type == EventTypes.ROLL.value: - print("\nPerforming Roll Operation\n") + self.logger.info("\nPerforming Roll Operation\n") self.portfolio.execute_roll(event) else: @@ -320,14 +442,13 @@ def run(self): except Exception as e: if self.config.raise_errors: raise e - + self.logger.error(f"Error processing event: {e}\n{traceback.format_exc()}") - print(f"Error processing event: {e}") + self.logger.error(f"Error processing event: {e}") - def clean_run(self, trades: pd.DataFrame = None, initial_capital: int = None): """ - Rerun the backtest with fresh set of data, the only set of data that persists are the last set of trades and capital data passed to the backtest, unless new data is passed in this function + Rerun the backtest with fresh set of data, the only set of data that persists are the last set of trades and capital data passed to the backtest, unless new data is passed in this function """ if trades is None: trades = pd.DataFrame() @@ -336,69 +457,32 @@ def clean_run(self, trades: pd.DataFrame = None, initial_capital: int = None): self.__construct_data(clean_trades, clean_capital) self.run() - def __roll(self, roll_event, current_event_queue) -> None: - """ - Performs a roll in the same day by closing the current position and opening a new one. - Closing Operation first executes a close order and fills, then opening operation executes an open order and fills - """ - print("Using roll function") - roll_action = ['CLOSE', 'OPEN'] - event_count = 0 - for action in roll_action: ## For each action, we want to carry out all processes - # print(f"Processing {action} action") - self.portfolio.execute_roll(roll_event, action) ## Execute the roll event - event_count += 1 - - while True: ##Starts event queue processing - try: ## Gets current event from the queue for that date - event = current_event_queue.get_nowait() - - except emptyEventQueue: - ## If the queue is empty, we break out of the loop, and return to outer loop - ## If there is no actions in outta loop, we return control to the main loop - break - ## Processes the event - if event.type == EventTypes.MARKET.value: - self.portfolio.analyze_positions(event) - elif event.type == EventTypes.SIGNAL.value: - self.portfolio.analyze_signal(event) - elif event.type == EventTypes.ORDER.value: - self.executor.execute_order_randomized_slippage(event) - elif event.type == EventTypes.FILL.value: - self.portfolio.update_fill(event) - print(f"Roll processed {event_count} event(s)") - self.logger.info(f"Roll Function processed {event_count} roll event(s)") - - - def get_all_holdings(self) -> pd.DataFrame: """ - return timeseries of portfolio holdings + return timeseries of portfolio holdings """ df = pd.DataFrame(self.portfolio.all_holdings) - df.set_index('datetime', inplace=True) + df.set_index("datetime", inplace=True) return df - def get_all_positions(self) -> pd.DataFrame: """ - return timeseries of portfolio positions + return timeseries of portfolio positions """ pos_arr = [] for position in self.portfolio.all_positions: pos_obj = {} - pos_obj['AMD'] = position['AMD']['option'] - pos_obj['AAPL'] = position['AAPL']['option'] - pos_obj['MSFT'] = position['MSFT']['option'] - pos_obj['GOOGL'] = position['GOOGL']['option'] - pos_obj['datetime'] = position['datetime'] + pos_obj["AMD"] = position["AMD"]["option"] + pos_obj["AAPL"] = position["AAPL"]["option"] + pos_obj["MSFT"] = position["MSFT"]["option"] + pos_obj["GOOGL"] = position["GOOGL"]["option"] + pos_obj["datetime"] = position["datetime"] pos_arr.append(pos_obj) pos_df = pd.DataFrame(pos_arr) - pos_df.set_index('datetime', inplace=True) + pos_df.set_index("datetime", inplace=True) return pos_df - - def store_event(self,event: Event): + def store_event(self, event: Event): """ Store an event in the events list """ @@ -410,8 +494,8 @@ def get_events(self) -> pd.DataFrame: """ if not self.events: return pd.DataFrame() - + events_df = pd.DataFrame(self.events) - events_df['datetime'] = pd.to_datetime(events_df['datetime']) - events_df.set_index('datetime', inplace=True) - return events_df \ No newline at end of file + events_df["datetime"] = pd.to_datetime(events_df["datetime"]) + events_df.set_index("datetime", inplace=True) + return events_df diff --git a/EventDriven/configs/base.py b/EventDriven/configs/base.py index 713ca04..ec56c4e 100644 --- a/EventDriven/configs/base.py +++ b/EventDriven/configs/base.py @@ -1,96 +1,23 @@ from trade.helpers.Logging import setup_logger -from pydantic.dataclasses import dataclass as pydantic_dataclass +from typing import Any, Callable, ClassVar + from pydantic import ConfigDict, Field -from typing import ClassVar, Literal +from pydantic.dataclasses import dataclass as _pydantic_dataclass +from typing_extensions import dataclass_transform +from trade.helpers.helper_types import validate_inputs from weakref import WeakSet -from typing import get_origin, get_args, Union, get_type_hints -from EventDriven.exceptions import ( - BacktesterIncorrectTypeError, - BacktestConfigAttributeError -) -import types -from dataclasses import fields +from EventDriven.exceptions import BacktestConfigAttributeError + from EventDriven.configs.vars import get_class_config_descriptions, get_config_class_description logger = setup_logger(__name__, stream_log_level="WARNING") -def validate_inputs(self): - type_hints = get_type_hints(type(self)) - - for f in fields(self): - try: - field_name = f.name - field_value = getattr(self, field_name) - - type_hint = type_hints.get(field_name) - if type_hint is None: - continue # no annotation, skip - - origin = get_origin(type_hint) - args = get_args(type_hint) - - # --- Handle Literal[...] --- - if origin is Literal: - # e.g. name: Literal["LimitsCog", "OtherCog"] - allowed_values = args # tuple of literals - - if field_value is None: - # If you want to allow None here, add it to the Literal. - logger.warning(f"Configuration '{field_name}' is None but expected one of {allowed_values}.") - elif field_value not in allowed_values: - raise BacktesterIncorrectTypeError( - f"Configuration '{field_name}' expected one of {allowed_values}, " f"but got {field_value!r}." - ) - continue - - # --- Handle Optional / Union[...] --- - if origin in (Union, types.UnionType): - allows_none = any(arg is type(None) for arg in args) - if field_value is None: - if not allows_none: - logger.warning( - f"Configuration '{field_name}' is not set (None) and is not Optional. Please review." - ) - continue - - valid_types = tuple(arg for arg in args if arg is not type(None)) - if not isinstance(field_value, valid_types): - raise BacktesterIncorrectTypeError( - f"Configuration '{field_name}' expected types {valid_types}, " f"but got {type(field_value)}." - ) - continue - - # --- Simple (non-generic) types --- - if origin is None: - if field_value is None: - logger.warning(f"Configuration '{field_name}' is not set (None). Please review.") - continue - - if not isinstance(field_value, type_hint): - raise BacktesterIncorrectTypeError( - f"Configuration '{field_name}' expected type {type_hint}, " f"but got {type(field_value)}." - ) - continue - - # --- Other generics (List, Dict, etc.) – shallow check --- - if field_value is None: - logger.warning(f"Configuration '{field_name}' is not set (None). Please review.") - continue - - try: - if not isinstance(field_value, origin): - raise BacktesterIncorrectTypeError( - f"Configuration '{field_name}' expected type {origin}, " f"but got {type(field_value)}." - ) - except TypeError: - logger.warning( - f"Could not validate field '{field_name}' with value '{field_value}' against type '{type_hint}' due to TypeError." - ) - pass - - except Exception as e: - logger.critical(f"Failed to validate field '{f.name}' in {self.__class__.__name__}. Error: {e}") + +@dataclass_transform() +def pydantic_dataclass(*args: Any, **kwargs: Any) -> Callable[..., Any]: + """Typed wrapper for Pydantic dataclasses to improve static analysis.""" + return _pydantic_dataclass(*args, **kwargs) @pydantic_dataclass(config=ConfigDict(arbitrary_types_allowed=True), kw_only=True) @@ -99,7 +26,7 @@ class BaseConfigs: _registry: ClassVar[WeakSet[type]] = WeakSet() run_name: str = Field(default="", description="A name identifier for this run/session.") - + def set(self, **kwargs): """Set multiple configuration attributes at once.""" for key, value in kwargs.items(): @@ -112,7 +39,7 @@ def get(self, key: str): if not hasattr(self, key): raise BacktestConfigAttributeError(f"Configuration has no attribute named '{key}'.") return getattr(self, key) - + def __post_init__(self, ctx=None): pass @@ -120,7 +47,6 @@ def validate_inputs(self): """Validate configuration inputs based on type hints.""" validate_inputs(self) - def __setattr__(self, name, value): super().__setattr__(name, value) @@ -161,7 +87,7 @@ def describe_configs(self): else: logger.warning(f"No description found for config '{key}' in {self.__class__.__name__}.") return header + msg - + def display_and_describe_configs(self): """Display and describe the configuration settings.""" class_desc = get_config_class_description(self.__class__.__name__) @@ -179,7 +105,7 @@ def get_all_configs(cls): for config_cls in cls._registry: configs[config_cls.__name__] = config_cls() return configs - + @classmethod def get_config_instance(cls, class_name: str): """Get a specific configuration class instance by name.""" @@ -188,17 +114,17 @@ def get_config_instance(cls, class_name: str): return config_cls() logger.warning(f"Configuration class '{class_name}' not found.") return None - + @classmethod def list_config_classes(cls): """List all registered configuration class names.""" return [config_cls.__name__ for config_cls in cls._registry] - + @classmethod def is_config_registered(cls, class_name: str) -> bool: """Check if a configuration class is registered.""" return any(config_cls.__name__ == class_name for config_cls in cls._registry) - + @classmethod def display_and_describe_all_configs(cls): """Display and describe all registered configuration classes.""" @@ -213,7 +139,7 @@ def display_and_describe_all_configs(cls): print(f"Description: {class_desc}") else: logger.warning(f"No class description found for {config_cls.__name__}") - print('='*80) + print("=" * 80) instance = config_cls() instance.display_and_describe_configs() @@ -228,5 +154,7 @@ def __setattr__(self, name, value): super().__setattr__(name, value) return if name in self.__dict__: - raise AttributeError(f"Cannot modify frozen attribute '{name}' in {self.__class__.__name__}. If you need to change it within a class, create a new instance.") + raise AttributeError( + f"Cannot modify frozen attribute '{name}' in {self.__class__.__name__}. If you need to change it within a class, create a new instance." + ) super().__setattr__(name, value) diff --git a/EventDriven/configs/core.py b/EventDriven/configs/core.py index cbcfb4c..96d8358 100644 --- a/EventDriven/configs/core.py +++ b/EventDriven/configs/core.py @@ -1,4 +1,4 @@ -from pydantic.dataclasses import dataclass as pydantic_dataclass +from EventDriven.configs.base import pydantic_dataclass from pydantic import ConfigDict import numbers from typing import Union, Tuple, List, Literal, Dict @@ -9,7 +9,7 @@ from EventDriven.configs.base import ( BaseConfigs, _CustomFrozenBaseConfigs, - ) +) from EventDriven._vars import OPTION_TIMESERIES_START_DATE @@ -64,7 +64,7 @@ class BaseSizerConfigs(_CustomFrozenBaseConfigs, ABC): Base configuration class for Sizer modules. """ - delta_lmt_type: Literal["default", "zscore"] = "default" + delta_lmt_type: Literal["default", "zscore"] = "default" @pydantic_dataclass(config=ConfigDict(arbitrary_types_allowed=True), kw_only=True) @@ -90,11 +90,13 @@ class ZscoreSizerConfigs(BaseSizerConfigs): norm_const: numbers.Number = 1.0 delta_lmt_type: Literal["default", "zscore"] = "zscore" + @pydantic_dataclass(config=ConfigDict(arbitrary_types_allowed=True)) class OrderResolutionConfig(BaseConfigs): """ Configuration class for Order Resolution settings. """ + resolve_enabled: bool = True otm_moneyness_width: float = 0.45 itm_moneyness_width: float = 0.45 @@ -102,18 +104,22 @@ class OrderResolutionConfig(BaseConfigs): max_tries: int = 20 max_dte_tolerance: int = 90 + @pydantic_dataclass(config=ConfigDict(arbitrary_types_allowed=True)) class UndlTimeseriesConfig(BaseConfigs): """ Configuration class for underlying timeseries data. """ - interval: str = '1d' + + interval: str = "1d" + @pydantic_dataclass(config=ConfigDict(arbitrary_types_allowed=True)) class OptionPriceConfig(BaseConfigs): """ Configuration class for option price data retrieval. """ + use_price: str = "midpoint" # Options: "close", "bid", "ask", "midpoint" @@ -132,9 +138,13 @@ class SkipCalcConfig(BaseConfigs): spike_flag: bool = False std_window_bool: bool = False zero_filter: bool = True - add_columns: List[Tuple[str, str]] = Field(default_factory=list, description="List of tuples where each tuple contains (column_name, function_name) to add additional calculated columns. Function will be fetched from ADD_COLUMNS_FACTORY.") + add_columns: List[Tuple[str, str]] = Field( + default_factory=list, + description="List of tuples where each tuple contains (column_name, function_name) to add additional calculated columns. Function will be fetched from ADD_COLUMNS_FACTORY.", + ) skip_columns: List[str] = Field(default_factory=lambda: ["Delta", "Gamma", "Vega", "Theta", "Midpoint"]) + @pydantic_dataclass(config=ConfigDict(arbitrary_types_allowed=True), kw_only=True) class BaseCogConfig(BaseConfigs): """ @@ -161,6 +171,7 @@ class StrategyLimitsEnabled(BaseConfigs): moneyness: bool = True exercise: bool = False + @pydantic_dataclass(config=ConfigDict(arbitrary_types_allowed=True), kw_only=True) class LimitsEnabledConfig(BaseCogConfig): """ @@ -176,7 +187,6 @@ class LimitsEnabledConfig(BaseCogConfig): enabled_limits: StrategyLimitsEnabled = Field(default_factory=StrategyLimitsEnabled) - @pydantic_dataclass(config=ConfigDict(arbitrary_types_allowed=True)) class PositionAnalyzerConfig(BaseConfigs): """ @@ -192,6 +202,7 @@ class PortfolioManagerConfig(BaseConfigs): """ Configuration class for Backtest related settings. """ + weights_haircut: float = 0.0 # Haircut applied to weights roll_failed_orders: bool = True # Whether signals that fail to be processed should be rolled forward @@ -207,7 +218,6 @@ class BacktesterConfig(BaseConfigs): raise_errors: bool = False min_slippage_pct: float = 0.075 max_slippage_pct: float = 0.15 - @pydantic_dataclass(config=ConfigDict(arbitrary_types_allowed=True)) @@ -237,6 +247,7 @@ def alloc_for_weight(self, weight: float, cash: float) -> float: def build_max_cash_map(self, weights: Dict[str, float], cash: float) -> Dict[str, float]: return {sym: self.alloc_for_weight(w, cash) for sym, w in weights.items()} + @pydantic_dataclass(config=ConfigDict(arbitrary_types_allowed=True)) class RiskManagerConfig(BaseConfigs): """ diff --git a/EventDriven/configs/export_configs.py b/EventDriven/configs/export_configs.py index 4f3f03a..0f75719 100644 --- a/EventDriven/configs/export_configs.py +++ b/EventDriven/configs/export_configs.py @@ -107,7 +107,7 @@ def save_to_yaml(self, filename: str): yaml.safe_dump(data, f, default_flow_style=False, sort_keys=False) @classmethod - def load_from_yaml(cls, filename: str) -> 'RunConfigBundle': + def load_from_yaml(cls, filename: str = None, data = None) -> 'RunConfigBundle': """ Load a config bundle from a YAML file. @@ -117,10 +117,13 @@ def load_from_yaml(cls, filename: str) -> 'RunConfigBundle': Returns: RunConfigBundle: The loaded config bundle. """ - with open(filename, "r") as f: - data = yaml.safe_load(f) + if data is None: + assert filename is not None, "Either filename or confs must be provided." + with open(filename, "r") as f: + data = yaml.safe_load(f) confs = data.get('configs', {}) + conf_bund_cls: ConfigsDict = {} # type: ignore for label in confs.keys(): # Extract class name without _1, _2 suffixes diff --git a/EventDriven/data.py b/EventDriven/data.py index 0c952d2..dbe0d79 100644 --- a/EventDriven/data.py +++ b/EventDriven/data.py @@ -257,7 +257,8 @@ def __init__(self, trades_df: pd.DataFrame, symbol_list: Optional[list] = None, finalize_trades: bool = True, - end_date: pd.Timestamp = None): + end_date: pd.Timestamp = None, + start_date: pd.Timestamp = None): """ trades: pd.DataFrame Dataframe of trades to be used for backtesting, necessary columns are EntryTime, ExitTime, EntryPrice, ExitPrice, EntryType, ExitType, Symbol @@ -265,18 +266,30 @@ def __init__(self, Event scheduler to push events to the event queue """ self.finalize_trades = finalize_trades + self.start_date = start_date + self.end_date = end_date trades_df = trades_df.copy() - if 'signal_id' not in trades_df.columns: - trades_df['signal_id'] = trades_df.apply(lambda row: generate_signal_id(row['Ticker'], row['EntryTime'], SignalTypes.LONG.value if row['Size'] > 0 else SignalTypes.SHORT.value), axis=1) + + if not trades_df.empty: + if 'signal_id' not in trades_df.columns: + trades_df['signal_id'] = trades_df.apply(lambda row: generate_signal_id(row['Ticker'], row['EntryTime'], SignalTypes.LONG.value if row['Size'] > 0 else SignalTypes.SHORT.value), axis=1) + else: + logger.info("Trades DataFrame already contains 'signal_id' column. If this is unintended, please remove it to allow automatic generation.") + self.trades_df = trades_df + self.events = events + self._open_trade_data() + self.options_data = {} + self.symbol_list = symbol_list if symbol_list is not None else trades_df['Ticker'].unique().tolist() else: - logger.info("Trades DataFrame already contains 'signal_id' column. If this is unintended, please remove it to allow automatic generation.") + logger.warning("Trades DataFrame is empty. No trade data to process.") + self.signal_df = pd.DataFrame() # Initialize an empty DataFrame to avoid attribute errors later + assert symbol_list is not None, "Symbol list must be provided if trades DataFrame is empty." + self.symbol_list = symbol_list + self.trades_df = trades_df - self.continue_backtest = True + self.continue_backtest = True self.events = events - self.end_date = end_date - self._open_trade_data() - self.options_data = {} - self.symbol_list = symbol_list if symbol_list is not None else self.trades_df['Ticker'].unique().tolist() + diff --git a/EventDriven/dataclasses/states.py b/EventDriven/dataclasses/states.py index 7f0d241..8da93b6 100644 --- a/EventDriven/dataclasses/states.py +++ b/EventDriven/dataclasses/states.py @@ -2,9 +2,9 @@ from pydantic import ConfigDict, Field from typing import Optional, List from datetime import datetime +from trade.datamanager.market_data import AtIndexResult from EventDriven.types import Order from EventDriven.dataclasses.orders import OrderRequest -from EventDriven.riskmanager.market_data import AtIndexResult from EventDriven.dataclasses.timeseries import AtTimePositionData from EventDriven.dataclasses.limits import PositionLimits from EventDriven.riskmanager.actions import RMAction diff --git a/EventDriven/demos/00_to_test.txt b/EventDriven/demos/00_to_test.txt deleted file mode 100644 index a83d7ad..0000000 --- a/EventDriven/demos/00_to_test.txt +++ /dev/null @@ -1 +0,0 @@ -Test Exercising: What is premium? It should be strike - spot \ No newline at end of file diff --git a/EventDriven/demos/RiskManager copy.ipynb b/EventDriven/demos/RiskManager copy.ipynb deleted file mode 100644 index dafd186..0000000 --- a/EventDriven/demos/RiskManager copy.ipynb +++ /dev/null @@ -1,52318 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "import faulthandler\n", - "import sys\n", - "\n", - "# Enable faulthandler to capture all threads and output to stderr\n", - "faulthandler.enable(all_threads=True, file=sys.stderr)\n", - "\n", - "# Optionally, redirect output to a file for easier debugging\n", - "with open(\"faulthandler_log.txt\", \"w\") as log_file:\n", - " faulthandler.enable(all_threads=True, file=log_file)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Console Logging & File Logging Can be configured using STREAM_LOG_LEVEL and FILE_LOG_LEVEL in environment variables.\n", - "Propagate to root logger can be set using PROPAGATE_TO_ROOT_LOGGER in environment variables.\n", - "Example:\n", - "STREAM_LOG_LEVEL = 'DEBUG'\n", - "FILE_LOG_LEVEL = 'INFO'\n", - "PROPAGATE_TO_ROOT_LOGGER = 'False'\n", - "\n", - "2025-06-30 21:35:31 trade.helpers.Logging INFO: Logging Root Directory: /Users/chiemelienwanisobi/cloned_repos/QuantTools/logs\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "python(28932) MallocStackLogging: can't turn off malloc stack logging because it was not enabled.\n", - "python(28933) MallocStackLogging: can't turn off malloc stack logging because it was not enabled.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "No Proxy URL found. ThetaData API will default to direct access\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "python(28949) MallocStackLogging: can't turn off malloc stack logging because it was not enabled.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "\n", - "Scheduled Data Requests will be saved to: /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/scheduler/requests.jsonl\n" - ] - } - ], - "source": [ - "%load_ext autoreload\n", - "%load_ext line_profiler\n", - "%autoreload 2\n", - "import os, sys\n", - "import warnings\n", - "warnings.filterwarnings(\"ignore\")\n", - "os.environ['PROXY_URL'] = ''\n", - "from module_test.raw_code.DataManagers.DataManagers import (_SaveManager, \n", - " OptionDataManager, \n", - " ChainDataManager, \n", - " DB_CACHE)\n", - "from EventDriven.riskmanager import RiskManager\n", - "from EventDriven.riskmanager.utils import (\n", - " LOOKBACKS, \n", - " close_cache, \n", - " chain_cache, \n", - " oi_cache, \n", - " spot_cache,\n", - " clear_cache,\n", - " get_cache,\n", - " populate_cache_with_chain,\n", - " logger\n", - ")\n", - "from EventDriven.types import ResultsEnum\n", - "from trade.helpers.helper import (find_split_dates_within_range, \n", - " CustomCache)\n", - "from EventDriven.riskmanager.utils import add_skip_columns, clear_info_stack, get_current_saved_ids, save_info_stack\n", - "from pathlib import Path\n", - "from trade.helpers.helper import (find_split_dates_within_range, \n", - " generate_option_tick_new)\n", - "\n", - "from dbase.DataAPI.ThetaData import (list_contracts, resample, \n", - " retrieve_chain_bulk)\n", - "from trade.assets.Calculate import Calculate\n", - "from trade.helpers.threads import runThreads\n", - "from trade.helpers.helper import (parse_option_tick, \n", - " binomial_implied_vol, \n", - " retrieve_timeseries, \n", - " parse_option_tick, \n", - " change_to_last_busday,\n", - " compare_dates)\n", - "\n", - "from trade.assets.rates import get_risk_free_rate_helper\n", - "from dateutil.relativedelta import relativedelta\n", - "from dbase.DataAPI.ThetaData import retrieve_eod_ohlc, get_proxy_url, proxy_url, refresh_proxy_url\n", - "from pandas.tseries.offsets import BDay\n", - "from trade.assets.Stock import Stock\n", - "import pandas as pd\n", - "from datetime import datetime, timedelta\n", - "import plotly.io as pio\n", - "import plotly.graph_objects as go\n", - "import plotly.express as px \n", - "from trade.helpers.decorators import cProfiler, cprofiler_func\n", - "pd.set_option('display.max_columns', 50)\n", - "pd.set_option('display.max_rows', 150)\n", - "from trade.helpers.helper import change_to_last_busday\n", - "import math\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "## Change pandas backend plotting\n", - "pd.options.plotting.backend = 'plotly'\n", - "pio.renderers.default = 'jupyterlab'\n" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "from EventDriven.portfolio import OptionSignalPortfolio\n", - "from EventDriven.backtest import OptionSignalBacktest\n", - "from copy import deepcopy\n", - "from functools import partial\n", - "from EventDriven.riskmanager.utils import PERSISTENT_CACHE\n", - "\n", - "def get_option_data_datamanager(self, opttick):\n", - " data_manager = OptionDataManager(opttick=opttick)\n", - " return data_manager.get_timeseries(\n", - " start=self.start_date,\n", - " end=self.end_date,\n", - "\n", - ")\n", - "\n", - "def get_option_greeks_datamanager(self, opttick):\n", - " data_manager = OptionDataManager(opttick=opttick)\n", - " return data_manager.get_timeseries(\n", - " start=self.start_date,\n", - " end=self.end_date,\n", - " type_='greeks'\n", - " )\n", - "\n", - "def get_option_data_theta_data(self, opttick):\n", - " meta = parse_option_tick(opttick)\n", - " return retrieve_eod_ohlc(\n", - " symbol=meta['ticker'],\n", - " start_date=self.start_date,\n", - " end_date=self.end_date,\n", - " strike=meta['strike'],\n", - " right= meta['put_call'],\n", - " exp=meta['exp_date'],\n", - " print_url = True\n", - " \n", - " )\n", - "\n", - "\n", - "def delete_cached_chain(tick, date):\n", - " func = 'EventDriven.riskmanager.utils.populate_cache_with_chain'\n", - " key = (func, tick, date, None, 'print_url',False)\n", - " if key in PERSISTENT_CACHE:\n", - " del PERSISTENT_CACHE[key]\n", - " print(f\"Deleted cache for {tick} on {date}\")\n", - " else:\n", - " print(f\"No cache found for {tick} on {date}\")\n", - "\n", - "\n", - "def get_cached_chain(tick, date):\n", - " func = 'EventDriven.riskmanager.utils.populate_cache_with_chain'\n", - " key = (func, tick, date, None, 'print_url',False)\n", - " if key in PERSISTENT_CACHE:\n", - " return PERSISTENT_CACHE[key]\n", - " else:\n", - " print(f\"No cache found for {tick} on {date}\")\n", - " return None\n", - " \n", - "def update_cached_chain(tick, date, data):\n", - " func = 'EventDriven.riskmanager.utils.populate_cache_with_chain'\n", - " key = (func, tick, date, None, 'print_url',False)\n", - " if key in PERSISTENT_CACHE:\n", - " PERSISTENT_CACHE[key] = data\n", - " print(f\"Updated cache for {tick} on {date}\")\n", - " else:\n", - " print(f\"No cache found for {tick} on {date}, adding new cache\")\n", - " PERSISTENT_CACHE[key] = data \n", - " \n", - "def delete_cached_get_order(tick, date):\n", - " f ='EventDriven.riskmanager.base.OrderPicker.__get_order'\n", - " for key in PERSISTENT_CACHE.keys():\n", - " if key[0] == f and key[1][2][1] == tick and key[2]== date:\n", - " del PERSISTENT_CACHE[key]\n", - " print(f\"Deleted cache for {key}\")\n", - "\n", - "def get_cached_get_order(tick, date):\n", - " f ='EventDriven.riskmanager.base.OrderPicker.__get_order'\n", - " for key in PERSISTENT_CACHE.keys():\n", - " if key[0] == f and key[1][2][1] == tick and key[2]== date:\n", - " return PERSISTENT_CACHE[key]\n", - " print(f\"No cache found for {tick} on {date}\")\n", - " return None\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "len(PERSISTENT_CACHE.keys())\n", - "get_cached_get_order('AAPL', '2024-01-04')\n", - "chain = get_cached_chain('AMD', '2017-01-05')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# ***WHOLE RUN***" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### ***INITIAL BACKTEST RUN***" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
SizeEntryBarExitBarEntryPriceExitPricePnLReturnPctEntryTimeExitTimeDurationTicker
015750558711.49007510.290000-188.411751-0.1044442017-01-042017-05-03119AMD
19550575429.06386842.6300011288.7826070.4667702017-01-042017-12-29359AAPL
214505754158.362333296.9400021940.0873780.8750672017-01-042017-12-29359BA
317935057542.5940484.9615004244.8425650.9126482017-01-042017-12-29359NVDA
437505754127.936213192.5099952389.2299210.5047342017-01-042017-12-29359NFLX
510507619163.239343167.05000338.1065990.0233442017-01-062017-06-19164COST
617513754128.488133178.000000841.7017350.3853422017-01-172017-12-29346META
720351571616.54102519.966667695.4053100.2071002017-01-192017-11-03288TSLA
85251868741.24384847.465500323.5258730.1508502017-01-242017-09-25244AMZN
94056562858.31338658.68000014.6645880.0062872017-03-312017-06-3091SBUX
1013659759811.85133510.990000-117.141648-0.0726782017-05-172017-05-181AMD
1110570271014.29987512.450000-194.236895-0.1293632017-10-162017-10-2610AMD
124471475455.46344559.117500160.7784130.0658822017-11-012017-12-2958AMZN
1310721754169.029542186.460007174.3046430.1031212017-11-102017-12-2949COST
144072675457.44034257.74000211.9864000.0052172017-11-172017-12-2942SBUX
\n", - "
" - ], - "text/plain": [ - " Size EntryBar ExitBar EntryPrice ExitPrice PnL ReturnPct \\\n", - "0 157 505 587 11.490075 10.290000 -188.411751 -0.104444 \n", - "1 95 505 754 29.063868 42.630001 1288.782607 0.466770 \n", - "2 14 505 754 158.362333 296.940002 1940.087378 0.875067 \n", - "3 1793 505 754 2.594048 4.961500 4244.842565 0.912648 \n", - "4 37 505 754 127.936213 192.509995 2389.229921 0.504734 \n", - "5 10 507 619 163.239343 167.050003 38.106599 0.023344 \n", - "6 17 513 754 128.488133 178.000000 841.701735 0.385342 \n", - "7 203 515 716 16.541025 19.966667 695.405310 0.207100 \n", - "8 52 518 687 41.243848 47.465500 323.525873 0.150850 \n", - "9 40 565 628 58.313386 58.680000 14.664588 0.006287 \n", - "10 136 597 598 11.851335 10.990000 -117.141648 -0.072678 \n", - "11 105 702 710 14.299875 12.450000 -194.236895 -0.129363 \n", - "12 44 714 754 55.463445 59.117500 160.778413 0.065882 \n", - "13 10 721 754 169.029542 186.460007 174.304643 0.103121 \n", - "14 40 726 754 57.440342 57.740002 11.986400 0.005217 \n", - "\n", - " EntryTime ExitTime Duration Ticker \n", - "0 2017-01-04 2017-05-03 119 AMD \n", - "1 2017-01-04 2017-12-29 359 AAPL \n", - "2 2017-01-04 2017-12-29 359 BA \n", - "3 2017-01-04 2017-12-29 359 NVDA \n", - "4 2017-01-04 2017-12-29 359 NFLX \n", - "5 2017-01-06 2017-06-19 164 COST \n", - "6 2017-01-17 2017-12-29 346 META \n", - "7 2017-01-19 2017-11-03 288 TSLA \n", - "8 2017-01-24 2017-09-25 244 AMZN \n", - "9 2017-03-31 2017-06-30 91 SBUX \n", - "10 2017-05-17 2017-05-18 1 AMD \n", - "11 2017-10-16 2017-10-26 10 AMD \n", - "12 2017-11-01 2017-12-29 58 AMZN \n", - "13 2017-11-10 2017-12-29 49 COST \n", - "14 2017-11-17 2017-12-29 42 SBUX " - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import json\n", - "pd.set_option('display.max_columns', 100)\n", - "pd.set_option('display.max_rows', 100)\n", - "_key = 4\n", - "with open(f'../input/profitable_weights_{_key}.json', 'r') as f:\n", - " weights = json.load(f)\n", - "ttrades__ = pd.read_csv(f'../input/profitable_trades_{_key}.csv').iloc[:, 1:]\n", - "ttrades__['Duration'] = ttrades__.Duration.apply(lambda x: int(x.split(' ')[0]))\n", - "tick = ['TSLA']\n", - "# ttrades__ = ttrades__[(ttrades__.Ticker.isin(tick))]\n", - "# trades_ = ttrades__.iloc[0:10, :]\n", - "trades_ = ttrades__\n", - "# trades_ = ttrades__.loc[0, :].to_frame().T\n", - "# trades_.loc[17, 'Size'] = -126\n", - "ttrades__\n", - "trades_" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### ISSUES:\n", - "\n", - "11: [\n", - " 4: COST is giving very weird values. Issue is the entry day picked a Credit Spread with debit cost. Need to find a logic to avoid this entirely\n", - "]" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "NFLX 0.16987974870876493 3397.594974175299\n", - "TSLA 0.11989196280009984 2397.8392560019965\n", - "NVDA 0.16567849753948508 3313.5699507897016\n", - "AMD 0.06435577471769394 1287.1154943538788\n", - "META 0.07777216333832482 1555.4432667664964\n", - "AAPL 0.09914238127123282 1982.8476254246564\n", - "AMZN 0.07716138546937226 1543.2277093874452\n", - "SBUX 0.08309645764751603 1661.9291529503205\n", - "BA 0.0796207431772608 1592.414863545216\n", - "COST 0.06340088533024943 1268.0177066049887\n" - ] - }, - { - "data": { - "text/plain": [ - "(NFLX 0.169880\n", - " NVDA 0.165678\n", - " TSLA 0.119892\n", - " AAPL 0.099142\n", - " SBUX 0.083096\n", - " BA 0.079621\n", - " META 0.077772\n", - " AMZN 0.077161\n", - " AMD 0.064356\n", - " COST 0.063401\n", - " dtype: float64,\n", - " {'NFLX': 4,\n", - " 'TSLA': 4,\n", - " 'NVDA': 4,\n", - " 'AMD': 4,\n", - " 'META': 4,\n", - " 'AAPL': 4,\n", - " 'AMZN': 4,\n", - " 'SBUX': 4,\n", - " 'BA': 4,\n", - " 'COST': 4})" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "symbol_list = trades_.Ticker.unique()\n", - "untraded_symbols = [s for s in weights.keys() if s not in trades_.Ticker.unique()]\n", - "# for s in untraded_symbols:\n", - "# weights.pop(s)\n", - "\n", - "\n", - "max_cash = {}\n", - "cash = 20_000\n", - "for s, w in weights.items():\n", - " print(f'{s} {w} {w * cash}')\n", - " if w * cash > 500:\n", - " max_cash[s] = 4\n", - " elif w * cash > 300:\n", - " max_cash[s] = 3\n", - " elif w * cash > 200:\n", - " max_cash[s] = 2\n", - " elif w * cash > 100:\n", - " max_cash[s] = 1\n", - " else:\n", - " max_cash[s] = 0.5\n", - "max_cash\n", - "pd.Series(weights).sort_values(ascending=False), max_cash" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[]" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "untraded_symbols" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "#Backtest class \n", - "## Find a way to not always reinitialize the backtest class, when want to redo\n", - "from EventDriven.backtest import OptionSignalBacktest\n", - "from EventDriven.riskmanager.sizer import DefaultSizer, ZscoreRVolSizer, BaseSizer\n", - "pd.options.display.max_rows = 50\n", - "pd.options.display.max_columns = 50\n", - "\n", - "def create_backtest_object(cash, weights, trades_, max_cash):\n", - " evb_backtest = OptionSignalBacktest(trades_, initial_capital=cash, t_plus_n=1, symbol_list = list(weights.keys()) )\n", - " evb_backtest.portfolio.initial_capital\n", - " w_map = {x: w * 0.95 for x, w in weights.items()} ## 75% of the weights for each stock\n", - " evb_backtest.portfolio.weight_map = w_map\n", - " evb_backtest.portfolio.weight_map\n", - " evb_backtest.portfolio.risk_manager.OrderPicker.liquidity_threshold = 50\n", - " evb_backtest.portfolio.risk_manager.OrderPicker.lookback = 10\n", - " evb_backtest.portfolio.risk_manager.sizing_lev = 4.5\n", - " evb_backtest.portfolio.max_contract_price_factor = 2\n", - " evb_backtest.portfolio.min_moneyness_threshold = 3\n", - " evb_backtest.portfolio.risk_manager.OrderPicker.data_availability_threshold = 0.5\n", - " order_settings = {\n", - " 'type': 'spread',\n", - " 'specifics': [\n", - " {'direction': 'long', 'rel_strike': 1.0, 'dte': 365, 'moneyness_width': 0.1},\n", - " {'direction': 'short', 'rel_strike': 0.85, 'dte': 365, 'moneyness_width': 0.1} \n", - " ],\n", - " 'name': 'vertical_spread',\n", - " 'strategy': 'vertical',\n", - " 'target_dte': 360, #270\n", - " 'structure_direction': 'long',\n", - " 'spread_ticks': 1,\n", - " 'dte_tolerance': 60,\n", - " 'min_moneyness': 0.65, #0.75\n", - " 'max_moneyness': 1., #1.25\n", - " 'min_total_price': 0.95 #0.5\n", - " }\n", - " evb_backtest.portfolio.order_settings = order_settings\n", - " evb_backtest.portfolio.risk_manager.max_dte_tolerance = order_settings['target_dte'] - 240\n", - " evb_backtest.portfolio.risk_manager.max_tries = 15\n", - " evb_backtest.portfolio.max_contract_price = max_cash\n", - " evb_backtest.executor.commission_rate = 0.65/100\n", - " evb_backtest.portfolio.min_moneyness_threshold = 5\n", - " evb_backtest.executor.max_slippage_pct = 0.075\n", - " evb_backtest.portfolio.roll_map = 180\n", - " evb_backtest.portfolio.moneyness_width_factor = .025\n", - " evb_backtest.portfolio.dte_reduction_factor = 30\n", - " evb_backtest.portfolio.min_acceptable_dte_threshold = 95\n", - " evb_backtest.portfolio.risk_manager.limits['dte'] = True\n", - " evb_backtest.portfolio.risk_manager.limits['delta'] = True\n", - " evb_backtest.portfolio.risk_manager.limits['moneyness'] = True\n", - " evb_backtest.portfolio.risk_manager.max_moneyness = 1.15 #1.05\n", - " evb_backtest.portfolio.risk_manager.max_slippage = 0.075\n", - " evb_backtest.portfolio.risk_manager.otm_moneyness_width = 0.45\n", - " evb_backtest.portfolio.risk_manager.itm_moneyness_width = 0.10\n", - " evb_backtest.portfolio.risk_manager.re_update_on_roll = False\n", - " evb_backtest.portfolio.risk_manager.t_plus_n = 1\n", - " for key in max_cash:\n", - " if max_cash[key]*100 > evb_backtest.portfolio.allocated_cash_map[key]:\n", - " print(key, max_cash[key]*100, evb_backtest.portfolio.allocated_cash_map[key])\n", - "\n", - " # evb_backtest.portfolio.risk_manager.print_settings()\n", - " return evb_backtest\n", - "\n", - "# evb_backtest = create_backtest_object(cash, weights, trades_, max_cash)" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "class Slippage:\n", - " pass\n", - "\n", - "class PositionGreekLimits:\n", - " pass\n", - "\n", - "class PositionMetaLimits: ## DTE, Moneyness\n", - " pass\n", - "\n", - "class AnalyzePositions:\n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[get_engine] Creating engine for DB: securities_master, PID: 88943\n", - "YF.download() has changed argument auto_adjust default to True\n" - ] - } - ], - "source": [ - "evb_backtest = create_backtest_object(cash, weights, trades_, max_cash)\n", - "rm, pm = evb_backtest.portfolio.risk_manager, evb_backtest.portfolio\n", - "rm.option_price = 'Midpoint'\n", - "rm.submit_add_columns(('Midpoint', 'ewm_smooth'))\n", - "rm.sizer = DefaultSizer(pm, rm, rm.sizing_lev)\n", - "rm.sizer.set_cash_rule(1)\n", - "\n", - "\n", - "\n", - "evb_backtest_smooth = create_backtest_object(cash, weights, trades_, max_cash)\n", - "rm_smooth, pm_smooth = evb_backtest_smooth.portfolio.risk_manager, evb_backtest_smooth.portfolio\n", - "rm_smooth.option_price = 'Midpoint_ewm_smooth'\n", - "rm_smooth.submit_add_columns(('Midpoint', 'ewm_smooth'))\n", - "rm_smooth.sizer = DefaultSizer(pm_smooth, rm_smooth, sizing_lev=rm_smooth.sizing_lev)\n", - "rm_smooth.sizer.set_cash_rule(1)\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['NFLX', 'TSLA', 'NVDA', 'AMD', 'META', 'AAPL', 'AMZN', 'SBUX', 'BA', 'COST']" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.bars.symbol_list" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "No positions need to be adjusted on 2017-01-04 00:00:00\n", - "Risk Manager Actions: NO_POSITIONS_TO_ADJUST\n", - "Event queue is empty, processed 0 event(s)\n", - "Processing event: MARKET 2017-01-05 00:00:00\n", - "Processing event: SIGNAL 2017-01-05 00:00:00\n", - "Not generating order because:NO_CONTRACTS_FOUND SignalEvent type:LONG, symbol=AMD, date:2017-01-05 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:AMD20170105LONG, parent_event:None\n", - "Processing event: SIGNAL 2017-01-05 00:00:00\n", - "\n", - "Order Received: {'result': 'SUCCESSFUL', 'data': {'trade_id': '&L:AAPL20171117C135&S:AAPL20171117C140', 'close': 0.9900000000000002, 'long': ['AAPL20171117C135'], 'short': ['AAPL20171117C140']}}\n", - "\n", - "===========================\n", - "Buy Details\n", - "Position: {'trade_id': '&L:AAPL20171117C135&S:AAPL20171117C140', 'close': 0.9900000000000002, 'long': ['AAPL20171117C135'], 'short': ['AAPL20171117C140'], 'quantity': 12, 'cash_equivalent_qty': 19.0}, Date: 2017-01-05, Signal: SignalEvent type:LONG, symbol=AAPL, date:2017-01-05 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:AAPL20170105LONG, parent_event:None\n", - "Max Contract Price: 4, Cash at Hand: 18.837052441534233\n", - "Cash at Hand 18.837052441534233 Close 0.9900000000000002\n", - "===========================\n", - "Processing event: SIGNAL 2017-01-05 00:00:00\n", - "\n", - "Order Received: {'result': 'SUCCESSFUL', 'data': {'trade_id': '&L:BA20180119C185&S:BA20180119C190', 'close': 0.9500000000000002, 'long': ['BA20180119C185'], 'short': ['BA20180119C190']}}\n", - "\n", - "2025-06-30 21:36:28 QuantTools.EventDriven.riskmanager.utils CRITICAL: Position Data for &L:BA20180119C185&S:BA20180119C190 not available, calculating greeks. Load time ~5 minutes\n", - "Calculating Greeks for BA20180119C185 on 2017-01-05 00:00:00 in L direction\n", - "Calculating Greeks for BA20180119C190 on 2017-01-05 00:00:00 in S direction\n", - "===========================\n", - "Buy Details\n", - "Position: {'trade_id': '&L:BA20180119C185&S:BA20180119C190', 'close': 0.9500000000000002, 'long': ['BA20180119C185'], 'short': ['BA20180119C190'], 'quantity': 10, 'cash_equivalent_qty': 15.0}, Date: 2017-01-05, Signal: SignalEvent type:LONG, symbol=BA, date:2017-01-05 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:BA20170105LONG, parent_event:None\n", - "Max Contract Price: 4, Cash at Hand: 15.127941203679551\n", - "Cash at Hand 15.127941203679551 Close 0.9500000000000002\n", - "===========================\n", - "Processing event: SIGNAL 2017-01-05 00:00:00\n", - "\n", - "Order Received: {'result': 'SUCCESSFUL', 'data': {'trade_id': '&L:NVDA20180119C130&S:NVDA20180119C135', 'close': 1.1999999999999993, 'long': ['NVDA20180119C130'], 'short': ['NVDA20180119C135']}}\n", - "\n", - "2025-06-30 21:36:31 QuantTools.EventDriven.riskmanager.utils CRITICAL: Position Data for &L:NVDA20180119C130&S:NVDA20180119C135 not available, calculating greeks. Load time ~5 minutes\n", - "Calculating Greeks for NVDA20180119C130 on 2017-01-05 00:00:00 in L direction\n", - "Calculating Greeks for NVDA20180119C135 on 2017-01-05 00:00:00 in S direction\n", - "===========================\n", - "Buy Details\n", - "Position: {'trade_id': '&L:NVDA20180119C130&S:NVDA20180119C135', 'close': 1.1999999999999993, 'long': ['NVDA20180119C130'], 'short': ['NVDA20180119C135'], 'quantity': 26, 'cash_equivalent_qty': 26.0}, Date: 2017-01-05, Signal: SignalEvent type:LONG, symbol=NVDA, date:2017-01-05 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:NVDA20170105LONG, parent_event:None\n", - "Max Contract Price: 4, Cash at Hand: 31.478914532502163\n", - "Cash at Hand 31.478914532502163 Close 1.1999999999999993\n", - "===========================\n", - "Processing event: SIGNAL 2017-01-05 00:00:00\n", - "\n", - "Order Received: {'result': 'SUCCESSFUL', 'data': {'trade_id': '&L:NFLX20180119C170&S:NFLX20180119C175', 'close': 1.1500000000000004, 'long': ['NFLX20180119C170'], 'short': ['NFLX20180119C175']}}\n", - "\n", - "2025-06-30 21:36:34 QuantTools.EventDriven.riskmanager.utils CRITICAL: Position Data for &L:NFLX20180119C170&S:NFLX20180119C175 not available, calculating greeks. Load time ~5 minutes\n", - "Calculating Greeks for NFLX20180119C170 on 2017-01-05 00:00:00 in L direction\n", - "Calculating Greeks for NFLX20180119C175 on 2017-01-05 00:00:00 in S direction\n", - "2025-06-30 21:36:35 trade.asset.Stock ERROR: Error getting previous close for BA from yfinance: 'prev_close'\n", - "2025-06-30 21:36:37 trade.asset.Stock ERROR: Error getting dividends history for AMD from yfinance\n", - "2025-06-30 21:36:37 trade.asset.Stock ERROR: Probably due to no dividends history\n", - "===========================\n", - "Buy Details\n", - "Position: {'trade_id': '&L:NFLX20180119C170&S:NFLX20180119C175', 'close': 1.1500000000000004, 'long': ['NFLX20180119C170'], 'short': ['NFLX20180119C175'], 'quantity': 28, 'cash_equivalent_qty': 28.0}, Date: 2017-01-05, Signal: SignalEvent type:LONG, symbol=NFLX, date:2017-01-05 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:NFLX20170105LONG, parent_event:None\n", - "Max Contract Price: 4, Cash at Hand: 32.27715225466534\n", - "Cash at Hand 32.27715225466534 Close 1.1500000000000004\n", - "===========================\n", - "Processing event: ORDER 2017-01-05 00:00:00\n", - "Processing event: ORDER 2017-01-05 00:00:00\n", - "Processing event: ORDER 2017-01-05 00:00:00\n", - "Processing event: ORDER 2017-01-05 00:00:00\n", - "Processing event: FILL 2017-01-05 00:00:00\n", - "Processing event: FILL 2017-01-05 00:00:00\n", - "2025-06-30 21:36:41 trade.asset.Stock ERROR: Error getting previous close for NFLX from yfinance: 'prev_close'\n", - "2025-06-30 21:36:41 trade.asset.Stock ERROR: Error getting dividends history for NFLX from yfinance\n", - "2025-06-30 21:36:41 trade.asset.Stock ERROR: Probably due to no dividends history\n", - "Processing event: FILL 2017-01-05 00:00:00\n", - "Processing event: FILL 2017-01-05 00:00:00\n", - "Risk Manager Actions: {}\n", - "Event queue is empty, processed 14 event(s)\n", - "Processing event: MARKET 2017-01-06 00:00:00\n", - "Risk Manager Actions: {'&L:NFLX20180119C170&S:NFLX20180119C175': HOLD(&L:NFLX20180119C170&S:NFLX20180119C175) Reason: None), '&L:NVDA20180119C130&S:NVDA20180119C135': HOLD(&L:NVDA20180119C130&S:NVDA20180119C135) Reason: None), '&L:AAPL20171117C135&S:AAPL20171117C140': HOLD(&L:AAPL20171117C135&S:AAPL20171117C140) Reason: None), '&L:BA20180119C185&S:BA20180119C190': HOLD(&L:BA20180119C185&S:BA20180119C190) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2017-01-09 00:00:00\n", - "Processing event: SIGNAL 2017-01-09 00:00:00\n", - "\n", - "Order Received: {'result': 'SUCCESSFUL', 'data': {'trade_id': '&L:COST20180119C185&S:COST20180119C190', 'close': 0.96, 'long': ['COST20180119C185'], 'short': ['COST20180119C190']}}\n", - "\n", - "===========================\n", - "Buy Details\n", - "Position: {'trade_id': '&L:COST20180119C185&S:COST20180119C190', 'close': 0.96, 'long': ['COST20180119C185'], 'short': ['COST20180119C190'], 'quantity': 6, 'cash_equivalent_qty': 12.0}, Date: 2017-01-09, Signal: SignalEvent type:LONG, symbol=COST, date:2017-01-09 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:COST20170109LONG, parent_event:None\n", - "Max Contract Price: 4, Cash at Hand: 12.046168212747391\n", - "Cash at Hand 12.046168212747391 Close 0.96\n", - "===========================\n", - "Processing event: ORDER 2017-01-09 00:00:00\n", - "Processing event: FILL 2017-01-09 00:00:00\n", - "Risk Manager Actions: {'&L:NFLX20180119C170&S:NFLX20180119C175': HOLD(&L:NFLX20180119C170&S:NFLX20180119C175) Reason: None), '&L:NVDA20180119C130&S:NVDA20180119C135': HOLD(&L:NVDA20180119C130&S:NVDA20180119C135) Reason: None), '&L:AAPL20171117C135&S:AAPL20171117C140': ADJUST(&L:AAPL20171117C135&S:AAPL20171117C140, Quantity Change: -1), Reason: greek_limit), '&L:BA20180119C185&S:BA20180119C190': HOLD(&L:BA20180119C185&S:BA20180119C190) Reason: None)}\n", - "Event queue is empty, processed 4 event(s)\n", - "Processing event: MARKET 2017-01-10 00:00:00\n", - "Processing event: ORDER 2017-01-10 00:00:00\n", - "Processing event: FILL 2017-01-10 00:00:00\n", - "Risk Manager Actions: {'&L:NFLX20180119C170&S:NFLX20180119C175': HOLD(&L:NFLX20180119C170&S:NFLX20180119C175) Reason: None), '&L:NVDA20180119C130&S:NVDA20180119C135': HOLD(&L:NVDA20180119C130&S:NVDA20180119C135) Reason: None), '&L:AAPL20171117C135&S:AAPL20171117C140': HOLD(&L:AAPL20171117C135&S:AAPL20171117C140) Reason: None), '&L:BA20180119C185&S:BA20180119C190': HOLD(&L:BA20180119C185&S:BA20180119C190) Reason: None), '&L:COST20180119C185&S:COST20180119C190': HOLD(&L:COST20180119C185&S:COST20180119C190) Reason: None)}\n", - "Event queue is empty, processed 3 event(s)\n", - "Processing event: MARKET 2017-01-11 00:00:00\n", - "Risk Manager Actions: {'&L:NFLX20180119C170&S:NFLX20180119C175': HOLD(&L:NFLX20180119C170&S:NFLX20180119C175) Reason: None), '&L:NVDA20180119C130&S:NVDA20180119C135': HOLD(&L:NVDA20180119C130&S:NVDA20180119C135) Reason: None), '&L:AAPL20171117C135&S:AAPL20171117C140': HOLD(&L:AAPL20171117C135&S:AAPL20171117C140) Reason: None), '&L:BA20180119C185&S:BA20180119C190': HOLD(&L:BA20180119C185&S:BA20180119C190) Reason: None), '&L:COST20180119C185&S:COST20180119C190': HOLD(&L:COST20180119C185&S:COST20180119C190) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2017-01-12 00:00:00\n", - "Risk Manager Actions: {'&L:NFLX20180119C170&S:NFLX20180119C175': HOLD(&L:NFLX20180119C170&S:NFLX20180119C175) Reason: None), '&L:NVDA20180119C130&S:NVDA20180119C135': HOLD(&L:NVDA20180119C130&S:NVDA20180119C135) Reason: None), '&L:AAPL20171117C135&S:AAPL20171117C140': HOLD(&L:AAPL20171117C135&S:AAPL20171117C140) Reason: None), '&L:BA20180119C185&S:BA20180119C190': HOLD(&L:BA20180119C185&S:BA20180119C190) Reason: None), '&L:COST20180119C185&S:COST20180119C190': HOLD(&L:COST20180119C185&S:COST20180119C190) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2017-01-13 00:00:00\n", - "Risk Manager Actions: {'&L:NFLX20180119C170&S:NFLX20180119C175': HOLD(&L:NFLX20180119C170&S:NFLX20180119C175) Reason: None), '&L:NVDA20180119C130&S:NVDA20180119C135': HOLD(&L:NVDA20180119C130&S:NVDA20180119C135) Reason: None), '&L:AAPL20171117C135&S:AAPL20171117C140': HOLD(&L:AAPL20171117C135&S:AAPL20171117C140) Reason: None), '&L:BA20180119C185&S:BA20180119C190': HOLD(&L:BA20180119C185&S:BA20180119C190) Reason: None), '&L:COST20180119C185&S:COST20180119C190': HOLD(&L:COST20180119C185&S:COST20180119C190) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2017-01-16 00:00:00\n", - "Risk Manager Actions: IS_HOLIDAY\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2017-01-17 00:00:00\n", - "Risk Manager Actions: {'&L:NFLX20180119C170&S:NFLX20180119C175': HOLD(&L:NFLX20180119C170&S:NFLX20180119C175) Reason: None), '&L:NVDA20180119C130&S:NVDA20180119C135': HOLD(&L:NVDA20180119C130&S:NVDA20180119C135) Reason: None), '&L:AAPL20171117C135&S:AAPL20171117C140': HOLD(&L:AAPL20171117C135&S:AAPL20171117C140) Reason: None), '&L:BA20180119C185&S:BA20180119C190': HOLD(&L:BA20180119C185&S:BA20180119C190) Reason: None), '&L:COST20180119C185&S:COST20180119C190': HOLD(&L:COST20180119C185&S:COST20180119C190) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2017-01-18 00:00:00\n", - "Processing event: SIGNAL 2017-01-18 00:00:00\n", - "\n", - "Order Received: {'result': 'SUCCESSFUL', 'data': {'trade_id': '&L:META20180119C155&S:META20180119C160', 'close': 1.0750000000000002, 'long': ['META20180119C155'], 'short': ['META20180119C160']}}\n", - "\n", - "===========================\n", - "Buy Details\n", - "Position: {'trade_id': '&L:META20180119C155&S:META20180119C160', 'close': 1.0750000000000002, 'long': ['META20180119C155'], 'short': ['META20180119C160'], 'quantity': 11, 'cash_equivalent_qty': 13.0}, Date: 2017-01-18, Signal: SignalEvent type:LONG, symbol=META, date:2017-01-18 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:META20170118LONG, parent_event:None\n", - "Max Contract Price: 4, Cash at Hand: 14.776711034281714\n", - "Cash at Hand 14.776711034281714 Close 1.0750000000000002\n", - "===========================\n", - "Processing event: ORDER 2017-01-18 00:00:00\n", - "Processing event: FILL 2017-01-18 00:00:00\n", - "Risk Manager Actions: {'&L:NFLX20180119C170&S:NFLX20180119C175': HOLD(&L:NFLX20180119C170&S:NFLX20180119C175) Reason: None), '&L:NVDA20180119C130&S:NVDA20180119C135': HOLD(&L:NVDA20180119C130&S:NVDA20180119C135) Reason: None), '&L:AAPL20171117C135&S:AAPL20171117C140': HOLD(&L:AAPL20171117C135&S:AAPL20171117C140) Reason: None), '&L:BA20180119C185&S:BA20180119C190': HOLD(&L:BA20180119C185&S:BA20180119C190) Reason: None), '&L:COST20180119C185&S:COST20180119C190': HOLD(&L:COST20180119C185&S:COST20180119C190) Reason: None)}\n", - "Event queue is empty, processed 4 event(s)\n", - "Processing event: MARKET 2017-01-19 00:00:00\n", - "Risk Manager Actions: {'&L:NFLX20180119C170&S:NFLX20180119C175': HOLD(&L:NFLX20180119C170&S:NFLX20180119C175) Reason: None), '&L:NVDA20180119C130&S:NVDA20180119C135': HOLD(&L:NVDA20180119C130&S:NVDA20180119C135) Reason: None), '&L:META20180119C155&S:META20180119C160': HOLD(&L:META20180119C155&S:META20180119C160) Reason: None), '&L:AAPL20171117C135&S:AAPL20171117C140': HOLD(&L:AAPL20171117C135&S:AAPL20171117C140) Reason: None), '&L:BA20180119C185&S:BA20180119C190': HOLD(&L:BA20180119C185&S:BA20180119C190) Reason: None), '&L:COST20180119C185&S:COST20180119C190': HOLD(&L:COST20180119C185&S:COST20180119C190) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2017-01-20 00:00:00\n", - "Processing event: SIGNAL 2017-01-20 00:00:00\n", - "\n", - "Order Received: {'result': 'SUCCESSFUL', 'data': {'trade_id': '&L:TSLA20171117C305&S:TSLA20171117C310', 'close': 0.9749999999999996, 'long': ['TSLA20171117C305'], 'short': ['TSLA20171117C310']}}\n", - "\n", - "2025-06-30 21:36:54 QuantTools.EventDriven.riskmanager.utils CRITICAL: Position Data for &L:TSLA20171117C305&S:TSLA20171117C310 not available, calculating greeks. Load time ~5 minutes\n", - "Calculating Greeks for TSLA20171117C305 on 2017-01-20 00:00:00 in L direction\n", - "Calculating Greeks for TSLA20171117C310 on 2017-01-20 00:00:00 in S direction\n", - "===========================\n", - "Buy Details\n", - "Position: {'trade_id': '&L:TSLA20171117C305&S:TSLA20171117C310', 'close': 0.9749999999999996, 'long': ['TSLA20171117C305'], 'short': ['TSLA20171117C310'], 'quantity': 22, 'cash_equivalent_qty': 23.0}, Date: 2017-01-20, Signal: SignalEvent type:LONG, symbol=TSLA, date:2017-01-20 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:TSLA20170120LONG, parent_event:None\n", - "Max Contract Price: 4, Cash at Hand: 22.779472932018965\n", - "Cash at Hand 22.779472932018965 Close 0.9749999999999996\n", - "===========================\n", - "Processing event: ORDER 2017-01-20 00:00:00\n", - "Processing event: FILL 2017-01-20 00:00:00\n", - "Risk Manager Actions: {'&L:NFLX20180119C170&S:NFLX20180119C175': HOLD(&L:NFLX20180119C170&S:NFLX20180119C175) Reason: None), '&L:NVDA20180119C130&S:NVDA20180119C135': HOLD(&L:NVDA20180119C130&S:NVDA20180119C135) Reason: None), '&L:META20180119C155&S:META20180119C160': HOLD(&L:META20180119C155&S:META20180119C160) Reason: None), '&L:AAPL20171117C135&S:AAPL20171117C140': HOLD(&L:AAPL20171117C135&S:AAPL20171117C140) Reason: None), '&L:BA20180119C185&S:BA20180119C190': HOLD(&L:BA20180119C185&S:BA20180119C190) Reason: None), '&L:COST20180119C185&S:COST20180119C190': HOLD(&L:COST20180119C185&S:COST20180119C190) Reason: None)}\n", - "Event queue is empty, processed 4 event(s)\n", - "Processing event: MARKET 2017-01-23 00:00:00\n", - "Risk Manager Actions: {'&L:NFLX20180119C170&S:NFLX20180119C175': HOLD(&L:NFLX20180119C170&S:NFLX20180119C175) Reason: None), '&L:TSLA20171117C305&S:TSLA20171117C310': HOLD(&L:TSLA20171117C305&S:TSLA20171117C310) Reason: None), '&L:NVDA20180119C130&S:NVDA20180119C135': HOLD(&L:NVDA20180119C130&S:NVDA20180119C135) Reason: None), '&L:META20180119C155&S:META20180119C160': HOLD(&L:META20180119C155&S:META20180119C160) Reason: None), '&L:AAPL20171117C135&S:AAPL20171117C140': HOLD(&L:AAPL20171117C135&S:AAPL20171117C140) Reason: None), '&L:BA20180119C185&S:BA20180119C190': HOLD(&L:BA20180119C185&S:BA20180119C190) Reason: None), '&L:COST20180119C185&S:COST20180119C190': HOLD(&L:COST20180119C185&S:COST20180119C190) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "2025-06-30 21:36:58 trade.asset.Stock ERROR: Error getting dividends history for TSLA from yfinance\n", - "2025-06-30 21:36:58 trade.asset.Stock ERROR: Probably due to no dividends history\n", - "Processing event: MARKET 2017-01-24 00:00:00\n", - "Risk Manager Actions: {'&L:NFLX20180119C170&S:NFLX20180119C175': HOLD(&L:NFLX20180119C170&S:NFLX20180119C175) Reason: None), '&L:TSLA20171117C305&S:TSLA20171117C310': HOLD(&L:TSLA20171117C305&S:TSLA20171117C310) Reason: None), '&L:NVDA20180119C130&S:NVDA20180119C135': HOLD(&L:NVDA20180119C130&S:NVDA20180119C135) Reason: None), '&L:META20180119C155&S:META20180119C160': HOLD(&L:META20180119C155&S:META20180119C160) Reason: None), '&L:AAPL20171117C135&S:AAPL20171117C140': HOLD(&L:AAPL20171117C135&S:AAPL20171117C140) Reason: None), '&L:BA20180119C185&S:BA20180119C190': HOLD(&L:BA20180119C185&S:BA20180119C190) Reason: None), '&L:COST20180119C185&S:COST20180119C190': HOLD(&L:COST20180119C185&S:COST20180119C190) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2017-01-25 00:00:00\n", - "Processing event: SIGNAL 2017-01-25 00:00:00\n", - "\n", - "Order Received: {'result': 'SUCCESSFUL', 'data': {'trade_id': '&L:AMZN20180119C1050&S:AMZN20180119C1060', 'close': 1.6499999999999986, 'long': ['AMZN20180119C1050'], 'short': ['AMZN20180119C1060']}}\n", - "\n", - "2025-06-30 21:36:59 QuantTools.EventDriven.riskmanager.utils CRITICAL: Position Data for &L:AMZN20180119C1050&S:AMZN20180119C1060 not available, calculating greeks. Load time ~5 minutes\n", - "Calculating Greeks for AMZN20180119C1060 on 2017-01-25 00:00:00 in S direction\n", - "Calculating Greeks for AMZN20180119C1050 on 2017-01-25 00:00:00 in L direction\n", - "===========================\n", - "Buy Details\n", - "Position: {'trade_id': '&L:AMZN20180119C1050&S:AMZN20180119C1060', 'close': 1.4553566387683003, 'long': ['AMZN20180119C1050'], 'short': ['AMZN20180119C1060'], 'quantity': 6, 'cash_equivalent_qty': 10.0}, Date: 2017-01-25, Signal: SignalEvent type:LONG, symbol=AMZN, date:2017-01-25 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:AMZN20170125LONG, parent_event:None\n", - "Max Contract Price: 4, Cash at Hand: 14.66066323918073\n", - "Cash at Hand 14.66066323918073 Close 1.4553566387683003\n", - "===========================\n", - "Processing event: ORDER 2017-01-25 00:00:00\n", - "Processing event: FILL 2017-01-25 00:00:00\n", - "2025-06-30 21:37:02 trade.asset.Stock ERROR: Error getting dividends history for AMZN from yfinance\n", - "2025-06-30 21:37:02 trade.asset.Stock ERROR: Probably due to no dividends history\n" - ] - }, - { - "ename": "KeyboardInterrupt", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[14], line 8\u001b[0m\n\u001b[1;32m 6\u001b[0m profiler\u001b[38;5;241m.\u001b[39menable()\n\u001b[1;32m 7\u001b[0m \u001b[38;5;66;03m#run backtest\u001b[39;00m\n\u001b[0;32m----> 8\u001b[0m \u001b[43mevb_backtest\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 9\u001b[0m profiler\u001b[38;5;241m.\u001b[39mdisable()\n\u001b[1;32m 10\u001b[0m stream \u001b[38;5;241m=\u001b[39m io\u001b[38;5;241m.\u001b[39mStringIO()\n", - "File \u001b[0;32m~/cloned_repos/QuantTools/EventDriven/backtest.py:130\u001b[0m, in \u001b[0;36mOptionSignalBacktest.run\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 128\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mexecutor\u001b[38;5;241m.\u001b[39mexecute_order_randomized_slippage(event)\n\u001b[1;32m 129\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m event\u001b[38;5;241m.\u001b[39mtype \u001b[38;5;241m==\u001b[39m EventTypes\u001b[38;5;241m.\u001b[39mFILL\u001b[38;5;241m.\u001b[39mvalue:\n\u001b[0;32m--> 130\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mportfolio\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mupdate_fill\u001b[49m\u001b[43m(\u001b[49m\u001b[43mevent\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 131\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mportfolio\u001b[38;5;241m.\u001b[39mupdate_timeindex()\n\u001b[1;32m 132\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m event\u001b[38;5;241m.\u001b[39mtype \u001b[38;5;241m==\u001b[39m EventTypes\u001b[38;5;241m.\u001b[39mEXERCISE\u001b[38;5;241m.\u001b[39mvalue:\n", - "File \u001b[0;32m~/cloned_repos/QuantTools/EventDriven/portfolio.py:895\u001b[0m, in \u001b[0;36mOptionSignalPortfolio.update_fill\u001b[0;34m(self, fill_event)\u001b[0m\n\u001b[1;32m 890\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 891\u001b[0m \u001b[38;5;124;03mUpdates the portfolio current positions and holdings \u001b[39;00m\n\u001b[1;32m 892\u001b[0m \u001b[38;5;124;03mfrom a FillEvent.\u001b[39;00m\n\u001b[1;32m 893\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 894\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m fill_event\u001b[38;5;241m.\u001b[39mtype \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mFILL\u001b[39m\u001b[38;5;124m'\u001b[39m: \n\u001b[0;32m--> 895\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mupdate_positions_on_fill\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfill_event\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 896\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mupdate_holdings_on_fill(fill_event)\n\u001b[1;32m 897\u001b[0m \u001b[38;5;66;03m# check if fill_event has roll event ancestor. if so execute roll buy side\u001b[39;00m\n", - "File \u001b[0;32m~/cloned_repos/QuantTools/EventDriven/portfolio.py:767\u001b[0m, in \u001b[0;36mOptionSignalPortfolio.update_positions_on_fill\u001b[0;34m(self, fill_event)\u001b[0m\n\u001b[1;32m 765\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m option_id \u001b[38;5;129;01min\u001b[39;00m fill_event\u001b[38;5;241m.\u001b[39mposition[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mshort\u001b[39m\u001b[38;5;124m'\u001b[39m]: \n\u001b[1;32m 766\u001b[0m option_meta \u001b[38;5;241m=\u001b[39m parse_option_tick(option_id)\n\u001b[0;32m--> 767\u001b[0m option_data \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_options_data_on_contract\u001b[49m\u001b[43m(\u001b[49m\u001b[43msymbol\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43moption_meta\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mticker\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mright\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moption_meta\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mput_call\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexp\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moption_meta\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mexp_date\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstrike\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moption_meta\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mstrike\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 768\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m option_data \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m: \n\u001b[1;32m 769\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moptions_data[option_id] \u001b[38;5;241m=\u001b[39m option_data[\u001b[38;5;241m~\u001b[39moption_data\u001b[38;5;241m.\u001b[39mindex\u001b[38;5;241m.\u001b[39mduplicated(keep\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlast\u001b[39m\u001b[38;5;124m'\u001b[39m)]\n", - "File \u001b[0;32m~/cloned_repos/QuantTools/EventDriven/portfolio.py:994\u001b[0m, in \u001b[0;36mOptionSignalPortfolio.get_options_data_on_contract\u001b[0;34m(self, symbol, exp, strike, right)\u001b[0m\n\u001b[1;32m 992\u001b[0m end_date \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mbars\u001b[38;5;241m.\u001b[39mend_date\u001b[38;5;241m.\u001b[39mstrftime(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m%\u001b[39m\u001b[38;5;124mY\u001b[39m\u001b[38;5;124m%\u001b[39m\u001b[38;5;124mm\u001b[39m\u001b[38;5;132;01m%d\u001b[39;00m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m 993\u001b[0m exp \u001b[38;5;241m=\u001b[39m pd\u001b[38;5;241m.\u001b[39mto_datetime(exp)\u001b[38;5;241m.\u001b[39mstrftime(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m%\u001b[39m\u001b[38;5;124mY\u001b[39m\u001b[38;5;124m%\u001b[39m\u001b[38;5;124mm\u001b[39m\u001b[38;5;132;01m%d\u001b[39;00m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m--> 994\u001b[0m options \u001b[38;5;241m=\u001b[39m \u001b[43mretrieve_eod_ohlc\u001b[49m\u001b[43m(\u001b[49m\u001b[43msymbol\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43msymbol\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexp\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mexp\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstrike\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;28;43mfloat\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mstrike\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mright\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mright\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstart_date\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstart_date\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mend_date\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mend_date\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 995\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(options, pd\u001b[38;5;241m.\u001b[39mDataFrame) \u001b[38;5;129;01mand\u001b[39;00m is_theta_data_retrieval_successful(options):\n\u001b[1;32m 996\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m options \u001b[38;5;66;03m# a dataframe with columns: ms_of_day,open,high,low,close,volume,count,date\u001b[39;00m\n", - "File \u001b[0;32m~/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/backoff/_sync.py:105\u001b[0m, in \u001b[0;36mretry_exception..retry\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 96\u001b[0m details \u001b[38;5;241m=\u001b[39m {\n\u001b[1;32m 97\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtarget\u001b[39m\u001b[38;5;124m\"\u001b[39m: target,\n\u001b[1;32m 98\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124margs\u001b[39m\u001b[38;5;124m\"\u001b[39m: args,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 101\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124melapsed\u001b[39m\u001b[38;5;124m\"\u001b[39m: elapsed,\n\u001b[1;32m 102\u001b[0m }\n\u001b[1;32m 104\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 105\u001b[0m ret \u001b[38;5;241m=\u001b[39m \u001b[43mtarget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 106\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m exception \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 107\u001b[0m max_tries_exceeded \u001b[38;5;241m=\u001b[39m (tries \u001b[38;5;241m==\u001b[39m max_tries_value)\n", - "File \u001b[0;32m~/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:370\u001b[0m, in \u001b[0;36mretrieve_eod_ohlc\u001b[0;34m(symbol, end_date, exp, right, start_date, strike, print_url, rt, proxy, **kwargs)\u001b[0m\n\u001b[1;32m 368\u001b[0m raise_thetadata_exception(response, querystring, proxy)\n\u001b[1;32m 369\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 370\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[43mrequests\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mheaders\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mheaders\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mparams\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mquerystring\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 371\u001b[0m raise_thetadata_exception(response, querystring, proxy)\n\u001b[1;32m 372\u001b[0m \u001b[38;5;28mprint\u001b[39m(response\u001b[38;5;241m.\u001b[39murl) \u001b[38;5;28;01mif\u001b[39;00m print_url \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n", - "File \u001b[0;32m~/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/requests/api.py:73\u001b[0m, in \u001b[0;36mget\u001b[0;34m(url, params, **kwargs)\u001b[0m\n\u001b[1;32m 62\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mget\u001b[39m(url, params\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 63\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124mr\u001b[39m\u001b[38;5;124;03m\"\"\"Sends a GET request.\u001b[39;00m\n\u001b[1;32m 64\u001b[0m \n\u001b[1;32m 65\u001b[0m \u001b[38;5;124;03m :param url: URL for the new :class:`Request` object.\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 70\u001b[0m \u001b[38;5;124;03m :rtype: requests.Response\u001b[39;00m\n\u001b[1;32m 71\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m---> 73\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mrequest\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mget\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mparams\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mparams\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/requests/api.py:59\u001b[0m, in \u001b[0;36mrequest\u001b[0;34m(method, url, **kwargs)\u001b[0m\n\u001b[1;32m 55\u001b[0m \u001b[38;5;66;03m# By using the 'with' statement we are sure the session is closed, thus we\u001b[39;00m\n\u001b[1;32m 56\u001b[0m \u001b[38;5;66;03m# avoid leaving sockets open which can trigger a ResourceWarning in some\u001b[39;00m\n\u001b[1;32m 57\u001b[0m \u001b[38;5;66;03m# cases, and look like a memory leak in others.\u001b[39;00m\n\u001b[1;32m 58\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m sessions\u001b[38;5;241m.\u001b[39mSession() \u001b[38;5;28;01mas\u001b[39;00m session:\n\u001b[0;32m---> 59\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43msession\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrequest\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmethod\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/requests/sessions.py:589\u001b[0m, in \u001b[0;36mSession.request\u001b[0;34m(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)\u001b[0m\n\u001b[1;32m 584\u001b[0m send_kwargs \u001b[38;5;241m=\u001b[39m {\n\u001b[1;32m 585\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtimeout\u001b[39m\u001b[38;5;124m\"\u001b[39m: timeout,\n\u001b[1;32m 586\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mallow_redirects\u001b[39m\u001b[38;5;124m\"\u001b[39m: allow_redirects,\n\u001b[1;32m 587\u001b[0m }\n\u001b[1;32m 588\u001b[0m send_kwargs\u001b[38;5;241m.\u001b[39mupdate(settings)\n\u001b[0;32m--> 589\u001b[0m resp \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msend\u001b[49m\u001b[43m(\u001b[49m\u001b[43mprep\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43msend_kwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 591\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m resp\n", - "File \u001b[0;32m~/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/requests/sessions.py:703\u001b[0m, in \u001b[0;36mSession.send\u001b[0;34m(self, request, **kwargs)\u001b[0m\n\u001b[1;32m 700\u001b[0m start \u001b[38;5;241m=\u001b[39m preferred_clock()\n\u001b[1;32m 702\u001b[0m \u001b[38;5;66;03m# Send the request\u001b[39;00m\n\u001b[0;32m--> 703\u001b[0m r \u001b[38;5;241m=\u001b[39m \u001b[43madapter\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msend\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 705\u001b[0m \u001b[38;5;66;03m# Total elapsed time of the request (approximately)\u001b[39;00m\n\u001b[1;32m 706\u001b[0m elapsed \u001b[38;5;241m=\u001b[39m preferred_clock() \u001b[38;5;241m-\u001b[39m start\n", - "File \u001b[0;32m~/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/requests/adapters.py:667\u001b[0m, in \u001b[0;36mHTTPAdapter.send\u001b[0;34m(self, request, stream, timeout, verify, cert, proxies)\u001b[0m\n\u001b[1;32m 664\u001b[0m timeout \u001b[38;5;241m=\u001b[39m TimeoutSauce(connect\u001b[38;5;241m=\u001b[39mtimeout, read\u001b[38;5;241m=\u001b[39mtimeout)\n\u001b[1;32m 666\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 667\u001b[0m resp \u001b[38;5;241m=\u001b[39m \u001b[43mconn\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43murlopen\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 668\u001b[0m \u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrequest\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 669\u001b[0m \u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 670\u001b[0m \u001b[43m \u001b[49m\u001b[43mbody\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrequest\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbody\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 671\u001b[0m \u001b[43m \u001b[49m\u001b[43mheaders\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrequest\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mheaders\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 672\u001b[0m \u001b[43m \u001b[49m\u001b[43mredirect\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 673\u001b[0m \u001b[43m \u001b[49m\u001b[43massert_same_host\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 674\u001b[0m \u001b[43m \u001b[49m\u001b[43mpreload_content\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 675\u001b[0m \u001b[43m \u001b[49m\u001b[43mdecode_content\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 676\u001b[0m \u001b[43m \u001b[49m\u001b[43mretries\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmax_retries\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 677\u001b[0m \u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtimeout\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 678\u001b[0m \u001b[43m \u001b[49m\u001b[43mchunked\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mchunked\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 679\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 681\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m (ProtocolError, \u001b[38;5;167;01mOSError\u001b[39;00m) \u001b[38;5;28;01mas\u001b[39;00m err:\n\u001b[1;32m 682\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mConnectionError\u001b[39;00m(err, request\u001b[38;5;241m=\u001b[39mrequest)\n", - "File \u001b[0;32m~/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/urllib3/connectionpool.py:789\u001b[0m, in \u001b[0;36mHTTPConnectionPool.urlopen\u001b[0;34m(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, preload_content, decode_content, **response_kw)\u001b[0m\n\u001b[1;32m 786\u001b[0m response_conn \u001b[38;5;241m=\u001b[39m conn \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m release_conn \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 788\u001b[0m \u001b[38;5;66;03m# Make the request on the HTTPConnection object\u001b[39;00m\n\u001b[0;32m--> 789\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_make_request\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 790\u001b[0m \u001b[43m \u001b[49m\u001b[43mconn\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 791\u001b[0m \u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 792\u001b[0m \u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 793\u001b[0m \u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtimeout_obj\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 794\u001b[0m \u001b[43m \u001b[49m\u001b[43mbody\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mbody\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 795\u001b[0m \u001b[43m \u001b[49m\u001b[43mheaders\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mheaders\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 796\u001b[0m \u001b[43m \u001b[49m\u001b[43mchunked\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mchunked\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 797\u001b[0m \u001b[43m \u001b[49m\u001b[43mretries\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mretries\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 798\u001b[0m \u001b[43m \u001b[49m\u001b[43mresponse_conn\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mresponse_conn\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 799\u001b[0m \u001b[43m \u001b[49m\u001b[43mpreload_content\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mpreload_content\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 800\u001b[0m \u001b[43m \u001b[49m\u001b[43mdecode_content\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdecode_content\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 801\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mresponse_kw\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 802\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 804\u001b[0m \u001b[38;5;66;03m# Everything went great!\u001b[39;00m\n\u001b[1;32m 805\u001b[0m clean_exit \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m\n", - "File \u001b[0;32m~/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/urllib3/connectionpool.py:536\u001b[0m, in \u001b[0;36mHTTPConnectionPool._make_request\u001b[0;34m(self, conn, method, url, body, headers, retries, timeout, chunked, response_conn, preload_content, decode_content, enforce_content_length)\u001b[0m\n\u001b[1;32m 534\u001b[0m \u001b[38;5;66;03m# Receive the response from the server\u001b[39;00m\n\u001b[1;32m 535\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 536\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[43mconn\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgetresponse\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 537\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m (BaseSSLError, \u001b[38;5;167;01mOSError\u001b[39;00m) \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 538\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_raise_timeout(err\u001b[38;5;241m=\u001b[39me, url\u001b[38;5;241m=\u001b[39murl, timeout_value\u001b[38;5;241m=\u001b[39mread_timeout)\n", - "File \u001b[0;32m~/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/urllib3/connection.py:507\u001b[0m, in \u001b[0;36mHTTPConnection.getresponse\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 504\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mresponse\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m HTTPResponse\n\u001b[1;32m 506\u001b[0m \u001b[38;5;66;03m# Get the response from http.client.HTTPConnection\u001b[39;00m\n\u001b[0;32m--> 507\u001b[0m httplib_response \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgetresponse\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 509\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 510\u001b[0m assert_header_parsing(httplib_response\u001b[38;5;241m.\u001b[39mmsg)\n", - "File \u001b[0;32m~/miniconda3/envs/openbb_new_use/lib/python3.11/http/client.py:1395\u001b[0m, in \u001b[0;36mHTTPConnection.getresponse\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1393\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 1394\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m-> 1395\u001b[0m \u001b[43mresponse\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbegin\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1396\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mConnectionError\u001b[39;00m:\n\u001b[1;32m 1397\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mclose()\n", - "File \u001b[0;32m~/miniconda3/envs/openbb_new_use/lib/python3.11/http/client.py:325\u001b[0m, in \u001b[0;36mHTTPResponse.begin\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 323\u001b[0m \u001b[38;5;66;03m# read until we get a non-100 response\u001b[39;00m\n\u001b[1;32m 324\u001b[0m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[0;32m--> 325\u001b[0m version, status, reason \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_read_status\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 326\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m status \u001b[38;5;241m!=\u001b[39m CONTINUE:\n\u001b[1;32m 327\u001b[0m \u001b[38;5;28;01mbreak\u001b[39;00m\n", - "File \u001b[0;32m~/miniconda3/envs/openbb_new_use/lib/python3.11/http/client.py:286\u001b[0m, in \u001b[0;36mHTTPResponse._read_status\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 285\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_read_status\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[0;32m--> 286\u001b[0m line \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mstr\u001b[39m(\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mreadline\u001b[49m\u001b[43m(\u001b[49m\u001b[43m_MAXLINE\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m+\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m)\u001b[49m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miso-8859-1\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 287\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(line) \u001b[38;5;241m>\u001b[39m _MAXLINE:\n\u001b[1;32m 288\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m LineTooLong(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mstatus line\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", - "File \u001b[0;32m~/miniconda3/envs/openbb_new_use/lib/python3.11/socket.py:718\u001b[0m, in \u001b[0;36mSocketIO.readinto\u001b[0;34m(self, b)\u001b[0m\n\u001b[1;32m 716\u001b[0m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[1;32m 717\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 718\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_sock\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrecv_into\u001b[49m\u001b[43m(\u001b[49m\u001b[43mb\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 719\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m timeout:\n\u001b[1;32m 720\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_timeout_occurred \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m\n", - "\u001b[0;31mKeyboardInterrupt\u001b[0m: " - ] - } - ], - "source": [ - "import cProfile\n", - "import pstats\n", - "import io\n", - "\n", - "profiler = cProfile.Profile()\n", - "profiler.enable()\n", - "#run backtest\n", - "evb_backtest.run()\n", - "profiler.disable()\n", - "stream = io.StringIO()\n", - "stats = pstats.Stats(profiler, stream=stream)\n", - "# stats.print_stats()" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[autoreload of EventDriven.portfolio failed: Traceback (most recent call last):\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/IPython/extensions/autoreload.py\", line 276, in check\n", - " superreload(m, reload, self.old_objects)\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/IPython/extensions/autoreload.py\", line 475, in superreload\n", - " module = reload(module)\n", - " ^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/importlib/__init__.py\", line 169, in reload\n", - " _bootstrap._exec(spec, module)\n", - " File \"\", line 621, in _exec\n", - " File \"\", line 936, in exec_module\n", - " File \"\", line 1074, in get_code\n", - " File \"\", line 1004, in source_to_code\n", - " File \"\", line 241, in _call_with_frames_removed\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py\", line 73\n", - " def __init__(self, bars : HistoricTradeDataHandler, eventScheduler: EventScheduler, risk_manager : RiskManager, weight_map = None, initial_capital = 10000): \n", - " ^^^\n", - "IndentationError: expected an indented block after function definition on line 72\n", - "]\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
NFLXTSLANVDAAMDMETAAAPLAMZNSBUXBACOSTcashcommissionTotal
datetime
2017-01-043227.7152252277.9472933147.8914531222.759721477.6711031883.7052441466.0663241578.8326951512.7941201204.6168211000.00.00020000.000000
2017-01-053111.9584582277.9472932917.1842231222.759721477.6711031797.4068381466.0663241578.8326951442.0308791204.6168211000.00.94919496.474355
2017-01-063044.4584582277.9472932917.1842231222.759721477.6711031839.4068381466.0663241578.8326951417.0308791204.6168211000.00.94919445.974355
2017-01-092976.9584582277.9472933217.1842231222.759721477.6711031971.4068381466.0663241578.8326951442.0308791179.2490561000.01.02719810.106589
2017-01-103314.4584582277.9472933217.1842231222.759721477.6711031962.0266561466.0663241578.8326951417.0308791194.2490561000.01.04020128.226407
2017-01-113111.9584582277.9472933037.1842231222.759721477.6711031984.0266561466.0663241578.8326951417.0308791239.2490561000.01.04019812.726407
2017-01-122774.4584582277.9472932917.1842231222.759721477.6711031951.0266561466.0663241578.8326951377.0308791194.2490561000.01.04019237.226407
2017-01-133179.4584582277.9472932737.1842231222.759721477.6711031934.5266561466.0663241578.8326951392.0308791200.2490561000.01.04019466.726407
2017-01-163179.4584582277.9472932737.1842231222.759721477.6711031934.5266561466.0663241578.8326951392.0308791200.2490561000.01.04019466.726407
2017-01-173651.9584582277.9472932557.1842231222.759721477.6711031978.5266561466.0663241578.8326951367.0308791251.2490561000.01.04019829.226407
2017-01-182099.4584582277.9472932797.1842231222.759721415.2264342006.0266561466.0663241578.8326951327.0308791263.2490561000.01.18318453.781737
2017-01-191559.4584582277.9472932917.1842231222.759721442.7264341962.0266561466.0663241578.8326951407.0308791233.2490561000.01.18318067.281737
2017-01-203854.4584582149.4836622617.1842231222.759721442.7264341967.5266561466.0663241578.8326951412.0308791254.2490561000.01.46919965.318106
2017-01-233449.4584581929.4836622737.1842231222.759721415.2264341956.5266561466.0663241578.8326951362.0308791215.2490561000.01.46919332.818106
2017-01-243516.9584581379.4836622977.1842231222.759721442.7264341956.5266561466.0663241578.8326951312.0308791233.2490561000.01.46919085.818106
\n", - "
" - ], - "text/plain": [ - " NFLX TSLA NVDA AMD META \\\n", - "datetime \n", - "2017-01-04 3227.715225 2277.947293 3147.891453 1222.75972 1477.671103 \n", - "2017-01-05 3111.958458 2277.947293 2917.184223 1222.75972 1477.671103 \n", - "2017-01-06 3044.458458 2277.947293 2917.184223 1222.75972 1477.671103 \n", - "2017-01-09 2976.958458 2277.947293 3217.184223 1222.75972 1477.671103 \n", - "2017-01-10 3314.458458 2277.947293 3217.184223 1222.75972 1477.671103 \n", - "2017-01-11 3111.958458 2277.947293 3037.184223 1222.75972 1477.671103 \n", - "2017-01-12 2774.458458 2277.947293 2917.184223 1222.75972 1477.671103 \n", - "2017-01-13 3179.458458 2277.947293 2737.184223 1222.75972 1477.671103 \n", - "2017-01-16 3179.458458 2277.947293 2737.184223 1222.75972 1477.671103 \n", - "2017-01-17 3651.958458 2277.947293 2557.184223 1222.75972 1477.671103 \n", - "2017-01-18 2099.458458 2277.947293 2797.184223 1222.75972 1415.226434 \n", - "2017-01-19 1559.458458 2277.947293 2917.184223 1222.75972 1442.726434 \n", - "2017-01-20 3854.458458 2149.483662 2617.184223 1222.75972 1442.726434 \n", - "2017-01-23 3449.458458 1929.483662 2737.184223 1222.75972 1415.226434 \n", - "2017-01-24 3516.958458 1379.483662 2977.184223 1222.75972 1442.726434 \n", - "\n", - " AAPL AMZN SBUX BA COST \\\n", - "datetime \n", - "2017-01-04 1883.705244 1466.066324 1578.832695 1512.794120 1204.616821 \n", - "2017-01-05 1797.406838 1466.066324 1578.832695 1442.030879 1204.616821 \n", - "2017-01-06 1839.406838 1466.066324 1578.832695 1417.030879 1204.616821 \n", - "2017-01-09 1971.406838 1466.066324 1578.832695 1442.030879 1179.249056 \n", - "2017-01-10 1962.026656 1466.066324 1578.832695 1417.030879 1194.249056 \n", - "2017-01-11 1984.026656 1466.066324 1578.832695 1417.030879 1239.249056 \n", - "2017-01-12 1951.026656 1466.066324 1578.832695 1377.030879 1194.249056 \n", - "2017-01-13 1934.526656 1466.066324 1578.832695 1392.030879 1200.249056 \n", - "2017-01-16 1934.526656 1466.066324 1578.832695 1392.030879 1200.249056 \n", - "2017-01-17 1978.526656 1466.066324 1578.832695 1367.030879 1251.249056 \n", - "2017-01-18 2006.026656 1466.066324 1578.832695 1327.030879 1263.249056 \n", - "2017-01-19 1962.026656 1466.066324 1578.832695 1407.030879 1233.249056 \n", - "2017-01-20 1967.526656 1466.066324 1578.832695 1412.030879 1254.249056 \n", - "2017-01-23 1956.526656 1466.066324 1578.832695 1362.030879 1215.249056 \n", - "2017-01-24 1956.526656 1466.066324 1578.832695 1312.030879 1233.249056 \n", - "\n", - " cash commission Total \n", - "datetime \n", - "2017-01-04 1000.0 0.000 20000.000000 \n", - "2017-01-05 1000.0 0.949 19496.474355 \n", - "2017-01-06 1000.0 0.949 19445.974355 \n", - "2017-01-09 1000.0 1.027 19810.106589 \n", - "2017-01-10 1000.0 1.040 20128.226407 \n", - "2017-01-11 1000.0 1.040 19812.726407 \n", - "2017-01-12 1000.0 1.040 19237.226407 \n", - "2017-01-13 1000.0 1.040 19466.726407 \n", - "2017-01-16 1000.0 1.040 19466.726407 \n", - "2017-01-17 1000.0 1.040 19829.226407 \n", - "2017-01-18 1000.0 1.183 18453.781737 \n", - "2017-01-19 1000.0 1.183 18067.281737 \n", - "2017-01-20 1000.0 1.469 19965.318106 \n", - "2017-01-23 1000.0 1.469 19332.818106 \n", - "2017-01-24 1000.0 1.469 19085.818106 " - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pm._equity" - ] - }, - { - "cell_type": "code", - "execution_count": 57, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.0" - ] - }, - "execution_count": 57, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.risk_manager.skip_adj_count/len(evb_backtest.portfolio.trades)" - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
NVDATSLAMETANFLXAMDAAPLCOSTAMZNBASBUXcashcommissionTotal
datetime
2025-01-067064.0165372389.086222235.1217221538.969664897.8188561262.6527851368.148703894.458218536.806886489.2089431000.00.58519676.288534
2025-01-077064.0165372929.086222235.1217221198.969664897.8188561206.6527851368.148703814.458218676.806886489.2089431000.00.58519880.288534
2025-01-087064.0165372794.086222235.1217222018.969664897.8188561210.1527851368.1487031474.4582181246.806886489.2089431000.00.58521798.788534
2025-01-097064.0165372794.086222235.1217222018.969664897.8188561210.1527851368.1487031474.4582181227.453775489.2089431000.00.59821779.435424
2025-01-107064.0165372794.086222235.1217221578.969664897.8188561115.6527851368.148703734.458218912.453775489.2089431000.00.59820189.935424
2025-01-137064.0165372884.086222235.1217221698.969664897.8188561087.6527851368.148703714.458218882.453775489.2089431000.00.59820321.935424
2025-01-147064.0165372794.086222235.1217221598.969664897.8188561045.6527851320.271089714.4582181047.453775489.2089431000.00.67620207.057810
2025-01-157064.0165372749.086222235.1217221478.969664897.8188561070.1527851260.271089854.458218882.453775489.2089431000.00.67619981.557810
2025-01-167064.0165372254.086222235.1217223058.969664897.818856685.1527851275.271089774.458218859.953775489.2089431000.00.67620594.057810
2025-01-177064.0165375404.086222235.1217221138.969664897.818856937.1527851695.271089814.458218634.953775489.2089431000.00.67622311.057810
2025-01-207064.0165375404.086222235.1217221138.969664897.818856937.1527851695.271089814.458218634.953775489.2089431000.00.67622311.057810
2025-01-217064.0165373154.086222235.1217222038.969664897.818856839.1527851395.271089874.458218897.453775489.2089431000.00.67620885.557810
2025-01-227064.0165372974.086222111.8978762338.969664897.818856846.1527851485.271089994.458218822.453775489.2089431000.00.94921024.333964
2025-01-237064.0165373019.086222899.3978761999.963308897.818856842.6527851350.271089994.4582181032.453775489.2089431000.00.96221589.327609
2025-01-247064.0165372929.086223056.8978762314.963308897.818856846.1527851170.271089974.458218949.953775465.4816291000.01.01421669.100294
2025-01-277064.0165372884.086223319.3978762682.463308897.818856944.1527852310.271089934.4582181152.453775289.4816291000.01.01423478.600294
2025-01-287064.0165373199.086223581.8978762682.463308897.8188561108.6527851545.2710891034.4582181017.453775819.4816291000.01.01423950.600294
2025-01-297064.0165372704.086225975.7245502839.963308897.8188561150.6527851170.2710891414.458218822.453775449.4816291000.01.02725488.926967
2025-01-307064.0165372929.086223825.7245502542.463308897.8188561161.1527851950.2710891014.458218979.953775589.4816291000.01.02723954.426967
2025-01-317064.0165372929.086223859.8642263137.463308897.8188561115.6527851740.2710891054.4582181017.453775509.4816291000.01.04024325.566644
2025-02-037064.0165372614.086223954.8642262752.823648897.818856912.6527851215.2710891034.4582181009.953775579.4816291000.01.05323035.426984
2025-02-047064.0165372794.086223907.3642262902.823648897.818856951.1527852250.2710891114.458218927.453775629.4816291000.01.05324438.926984
2025-02-057064.0165372524.086223907.3642263382.823648897.818856937.1527851485.2710891039.7956781047.453775679.4816291000.01.06623965.264444
2025-02-067064.0165372299.086224429.8642263157.823648897.818856902.152785825.2710891057.2956781032.4537751129.4816291000.01.06623795.264444
2025-02-077064.0165372299.086224097.3642263037.823648897.818856895.1527852250.271089882.2956781002.4537751002.4520361000.01.09224428.734852
2025-02-107064.0165372119.086224192.3642262842.823648897.818856867.1527851410.271089899.795678897.453775652.4520361000.01.09222843.234852
2025-02-117064.0165372029.086224144.8642262977.823648897.818856940.6527852040.271089934.795678912.453775827.4520361000.01.09223769.234852
2025-02-127064.0165372074.086224382.3642263112.823648897.8188561038.6527851665.271089882.295678912.453775692.4520361000.01.09223722.234852
2025-02-137064.0165372164.086224619.8642263517.823648897.8188561108.6527852040.271089882.295678964.953775752.4520361000.01.09225012.234852
2025-02-147064.0165371984.086224619.8642263202.823648897.8188561164.6527852370.271089882.2956781182.453775867.4520361000.01.09225235.734852
2025-02-177064.0165371984.086224619.8642263202.823648897.8188561164.6527852370.271089882.2956781182.453775867.4520361000.01.09225235.734852
2025-02-187064.0165372029.086224239.8642263742.823648897.8188561175.1527852250.271089829.7956781099.953775882.4520361000.01.09225211.234852
2025-02-197064.0165372254.086223954.8642263352.823648897.8188561147.1527851965.271089812.295678942.453775767.4520361000.01.09224158.234852
2025-02-207064.0165372209.086223954.8642263142.823648897.8188561175.1527851740.271089742.295678897.453775907.4520361000.01.09223731.234852
2025-02-217064.0165371804.086223717.3642262947.823648897.8188561189.1527851245.271089654.795678874.953775867.4520361000.01.09222262.734852
2025-02-247064.0165371759.086223435.5860982737.823648897.8188561252.1527851890.271089619.7956781099.953775862.4520361000.01.10522618.956723
2025-02-257064.0165371309.086223570.5860982692.823648897.8188561231.2613502040.271089602.295678949.953775902.4520361000.01.11822260.565288
2025-02-267064.0165371219.086223255.5860983307.823648897.8188561090.2613501590.271089637.295678754.953775977.4520361000.01.11821794.565288
2025-02-277064.0165371129.086223345.5860983067.823648897.8188561060.2613502190.271089567.2956781032.4537751157.4520361000.01.11822512.065288
2025-02-287064.0165371309.086223660.5860982587.823648897.8188561153.2613502160.271089602.295678814.953775892.4520361000.01.11822142.565288
2025-03-037064.0165371174.086223192.8537172653.634647897.8188561050.7680451596.826629510.995207786.751955871.3202241000.01.74220799.072037
\n", - "
" - ], - "text/plain": [ - " NVDA TSLA META NFLX AMD \\\n", - "datetime \n", - "2025-01-06 7064.016537 2389.08622 2235.121722 1538.969664 897.818856 \n", - "2025-01-07 7064.016537 2929.08622 2235.121722 1198.969664 897.818856 \n", - "2025-01-08 7064.016537 2794.08622 2235.121722 2018.969664 897.818856 \n", - "2025-01-09 7064.016537 2794.08622 2235.121722 2018.969664 897.818856 \n", - "2025-01-10 7064.016537 2794.08622 2235.121722 1578.969664 897.818856 \n", - "2025-01-13 7064.016537 2884.08622 2235.121722 1698.969664 897.818856 \n", - "2025-01-14 7064.016537 2794.08622 2235.121722 1598.969664 897.818856 \n", - "2025-01-15 7064.016537 2749.08622 2235.121722 1478.969664 897.818856 \n", - "2025-01-16 7064.016537 2254.08622 2235.121722 3058.969664 897.818856 \n", - "2025-01-17 7064.016537 5404.08622 2235.121722 1138.969664 897.818856 \n", - "2025-01-20 7064.016537 5404.08622 2235.121722 1138.969664 897.818856 \n", - "2025-01-21 7064.016537 3154.08622 2235.121722 2038.969664 897.818856 \n", - "2025-01-22 7064.016537 2974.08622 2111.897876 2338.969664 897.818856 \n", - "2025-01-23 7064.016537 3019.08622 2899.397876 1999.963308 897.818856 \n", - "2025-01-24 7064.016537 2929.08622 3056.897876 2314.963308 897.818856 \n", - "2025-01-27 7064.016537 2884.08622 3319.397876 2682.463308 897.818856 \n", - "2025-01-28 7064.016537 3199.08622 3581.897876 2682.463308 897.818856 \n", - "2025-01-29 7064.016537 2704.08622 5975.724550 2839.963308 897.818856 \n", - "2025-01-30 7064.016537 2929.08622 3825.724550 2542.463308 897.818856 \n", - "2025-01-31 7064.016537 2929.08622 3859.864226 3137.463308 897.818856 \n", - "2025-02-03 7064.016537 2614.08622 3954.864226 2752.823648 897.818856 \n", - "2025-02-04 7064.016537 2794.08622 3907.364226 2902.823648 897.818856 \n", - "2025-02-05 7064.016537 2524.08622 3907.364226 3382.823648 897.818856 \n", - "2025-02-06 7064.016537 2299.08622 4429.864226 3157.823648 897.818856 \n", - "2025-02-07 7064.016537 2299.08622 4097.364226 3037.823648 897.818856 \n", - "2025-02-10 7064.016537 2119.08622 4192.364226 2842.823648 897.818856 \n", - "2025-02-11 7064.016537 2029.08622 4144.864226 2977.823648 897.818856 \n", - "2025-02-12 7064.016537 2074.08622 4382.364226 3112.823648 897.818856 \n", - "2025-02-13 7064.016537 2164.08622 4619.864226 3517.823648 897.818856 \n", - "2025-02-14 7064.016537 1984.08622 4619.864226 3202.823648 897.818856 \n", - "2025-02-17 7064.016537 1984.08622 4619.864226 3202.823648 897.818856 \n", - "2025-02-18 7064.016537 2029.08622 4239.864226 3742.823648 897.818856 \n", - "2025-02-19 7064.016537 2254.08622 3954.864226 3352.823648 897.818856 \n", - "2025-02-20 7064.016537 2209.08622 3954.864226 3142.823648 897.818856 \n", - "2025-02-21 7064.016537 1804.08622 3717.364226 2947.823648 897.818856 \n", - "2025-02-24 7064.016537 1759.08622 3435.586098 2737.823648 897.818856 \n", - "2025-02-25 7064.016537 1309.08622 3570.586098 2692.823648 897.818856 \n", - "2025-02-26 7064.016537 1219.08622 3255.586098 3307.823648 897.818856 \n", - "2025-02-27 7064.016537 1129.08622 3345.586098 3067.823648 897.818856 \n", - "2025-02-28 7064.016537 1309.08622 3660.586098 2587.823648 897.818856 \n", - "2025-03-03 7064.016537 1174.08622 3192.853717 2653.634647 897.818856 \n", - "\n", - " AAPL COST AMZN BA SBUX \\\n", - "datetime \n", - "2025-01-06 1262.652785 1368.148703 894.458218 536.806886 489.208943 \n", - "2025-01-07 1206.652785 1368.148703 814.458218 676.806886 489.208943 \n", - "2025-01-08 1210.152785 1368.148703 1474.458218 1246.806886 489.208943 \n", - "2025-01-09 1210.152785 1368.148703 1474.458218 1227.453775 489.208943 \n", - "2025-01-10 1115.652785 1368.148703 734.458218 912.453775 489.208943 \n", - "2025-01-13 1087.652785 1368.148703 714.458218 882.453775 489.208943 \n", - "2025-01-14 1045.652785 1320.271089 714.458218 1047.453775 489.208943 \n", - "2025-01-15 1070.152785 1260.271089 854.458218 882.453775 489.208943 \n", - "2025-01-16 685.152785 1275.271089 774.458218 859.953775 489.208943 \n", - "2025-01-17 937.152785 1695.271089 814.458218 634.953775 489.208943 \n", - "2025-01-20 937.152785 1695.271089 814.458218 634.953775 489.208943 \n", - "2025-01-21 839.152785 1395.271089 874.458218 897.453775 489.208943 \n", - "2025-01-22 846.152785 1485.271089 994.458218 822.453775 489.208943 \n", - "2025-01-23 842.652785 1350.271089 994.458218 1032.453775 489.208943 \n", - "2025-01-24 846.152785 1170.271089 974.458218 949.953775 465.481629 \n", - "2025-01-27 944.152785 2310.271089 934.458218 1152.453775 289.481629 \n", - "2025-01-28 1108.652785 1545.271089 1034.458218 1017.453775 819.481629 \n", - "2025-01-29 1150.652785 1170.271089 1414.458218 822.453775 449.481629 \n", - "2025-01-30 1161.152785 1950.271089 1014.458218 979.953775 589.481629 \n", - "2025-01-31 1115.652785 1740.271089 1054.458218 1017.453775 509.481629 \n", - "2025-02-03 912.652785 1215.271089 1034.458218 1009.953775 579.481629 \n", - "2025-02-04 951.152785 2250.271089 1114.458218 927.453775 629.481629 \n", - "2025-02-05 937.152785 1485.271089 1039.795678 1047.453775 679.481629 \n", - "2025-02-06 902.152785 825.271089 1057.295678 1032.453775 1129.481629 \n", - "2025-02-07 895.152785 2250.271089 882.295678 1002.453775 1002.452036 \n", - "2025-02-10 867.152785 1410.271089 899.795678 897.453775 652.452036 \n", - "2025-02-11 940.652785 2040.271089 934.795678 912.453775 827.452036 \n", - "2025-02-12 1038.652785 1665.271089 882.295678 912.453775 692.452036 \n", - "2025-02-13 1108.652785 2040.271089 882.295678 964.953775 752.452036 \n", - "2025-02-14 1164.652785 2370.271089 882.295678 1182.453775 867.452036 \n", - "2025-02-17 1164.652785 2370.271089 882.295678 1182.453775 867.452036 \n", - "2025-02-18 1175.152785 2250.271089 829.795678 1099.953775 882.452036 \n", - "2025-02-19 1147.152785 1965.271089 812.295678 942.453775 767.452036 \n", - "2025-02-20 1175.152785 1740.271089 742.295678 897.453775 907.452036 \n", - "2025-02-21 1189.152785 1245.271089 654.795678 874.953775 867.452036 \n", - "2025-02-24 1252.152785 1890.271089 619.795678 1099.953775 862.452036 \n", - "2025-02-25 1231.261350 2040.271089 602.295678 949.953775 902.452036 \n", - "2025-02-26 1090.261350 1590.271089 637.295678 754.953775 977.452036 \n", - "2025-02-27 1060.261350 2190.271089 567.295678 1032.453775 1157.452036 \n", - "2025-02-28 1153.261350 2160.271089 602.295678 814.953775 892.452036 \n", - "2025-03-03 1050.768045 1596.826629 510.995207 786.751955 871.320224 \n", - "\n", - " cash commission Total \n", - "datetime \n", - "2025-01-06 1000.0 0.585 19676.288534 \n", - "2025-01-07 1000.0 0.585 19880.288534 \n", - "2025-01-08 1000.0 0.585 21798.788534 \n", - "2025-01-09 1000.0 0.598 21779.435424 \n", - "2025-01-10 1000.0 0.598 20189.935424 \n", - "2025-01-13 1000.0 0.598 20321.935424 \n", - "2025-01-14 1000.0 0.676 20207.057810 \n", - "2025-01-15 1000.0 0.676 19981.557810 \n", - "2025-01-16 1000.0 0.676 20594.057810 \n", - "2025-01-17 1000.0 0.676 22311.057810 \n", - "2025-01-20 1000.0 0.676 22311.057810 \n", - "2025-01-21 1000.0 0.676 20885.557810 \n", - "2025-01-22 1000.0 0.949 21024.333964 \n", - "2025-01-23 1000.0 0.962 21589.327609 \n", - "2025-01-24 1000.0 1.014 21669.100294 \n", - "2025-01-27 1000.0 1.014 23478.600294 \n", - "2025-01-28 1000.0 1.014 23950.600294 \n", - "2025-01-29 1000.0 1.027 25488.926967 \n", - "2025-01-30 1000.0 1.027 23954.426967 \n", - "2025-01-31 1000.0 1.040 24325.566644 \n", - "2025-02-03 1000.0 1.053 23035.426984 \n", - "2025-02-04 1000.0 1.053 24438.926984 \n", - "2025-02-05 1000.0 1.066 23965.264444 \n", - "2025-02-06 1000.0 1.066 23795.264444 \n", - "2025-02-07 1000.0 1.092 24428.734852 \n", - "2025-02-10 1000.0 1.092 22843.234852 \n", - "2025-02-11 1000.0 1.092 23769.234852 \n", - "2025-02-12 1000.0 1.092 23722.234852 \n", - "2025-02-13 1000.0 1.092 25012.234852 \n", - "2025-02-14 1000.0 1.092 25235.734852 \n", - "2025-02-17 1000.0 1.092 25235.734852 \n", - "2025-02-18 1000.0 1.092 25211.234852 \n", - "2025-02-19 1000.0 1.092 24158.234852 \n", - "2025-02-20 1000.0 1.092 23731.234852 \n", - "2025-02-21 1000.0 1.092 22262.734852 \n", - "2025-02-24 1000.0 1.105 22618.956723 \n", - "2025-02-25 1000.0 1.118 22260.565288 \n", - "2025-02-26 1000.0 1.118 21794.565288 \n", - "2025-02-27 1000.0 1.118 22512.065288 \n", - "2025-02-28 1000.0 1.118 22142.565288 \n", - "2025-03-03 1000.0 1.742 20799.072037 " - ] - }, - "execution_count": 58, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.portfolio._equity" - ] - }, - { - "cell_type": "code", - "execution_count": 59, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Processing event: MARKET 2025-01-06 00:00:00\n", - "Processing event: SIGNAL 2025-01-06 00:00:00\n", - "\n", - "Order Received: {'result': 'SUCCESSFUL', 'data': {'trade_id': '&L:TSLA20251121C450&S:TSLA20251121C455', 'close': 1.2750000000000057, 'long': ['TSLA20251121C450'], 'short': ['TSLA20251121C455']}}\n", - "\n", - "===========================\n", - "Buy Details\n", - "Position: {'trade_id': '&L:TSLA20251121C450&S:TSLA20251121C455', 'close': 1.2750000000000057, 'long': ['TSLA20251121C450'], 'short': ['TSLA20251121C455'], 'quantity': 19, 'cash_equivalent_qty': 19.0}, Date: 2025-01-06, Signal: SignalEvent type:LONG, symbol=TSLA, date:2025-01-06 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:TSLA20250106LONG, parent_event:None\n", - "Max Contract Price: 4, Cash at Hand: 25.243127245404267\n", - "Cash at Hand 25.243127245404267 Close 1.2750000000000057\n", - "===========================\n", - "Processing event: SIGNAL 2025-01-06 00:00:00\n", - "\n", - "Order Received: {'result': 'SUCCESSFUL', 'data': {'trade_id': '&L:AAPL20251219C320&S:AAPL20251219C330', 'close': 0.9599999999999995, 'long': ['AAPL20251219C320'], 'short': ['AAPL20251219C330']}}\n", - "\n", - "===========================\n", - "Buy Details\n", - "Position: {'trade_id': '&L:AAPL20251219C320&S:AAPL20251219C330', 'close': 0.9925241278457915, 'long': ['AAPL20251219C320'], 'short': ['AAPL20251219C330'], 'quantity': 7, 'cash_equivalent_qty': 12.0}, Date: 2025-01-06, Signal: SignalEvent type:LONG, symbol=AAPL, date:2025-01-06 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:AAPL20250106LONG, parent_event:None\n", - "Max Contract Price: 4, Cash at Hand: 12.846878830654283\n", - "Cash at Hand 12.846878830654283 Close 0.9925241278457915\n", - "===========================\n", - "Processing event: SIGNAL 2025-01-06 00:00:00\n", - "\n", - "Order Received: {'result': 'SUCCESSFUL', 'data': {'trade_id': '&L:AMZN20251219C290&S:AMZN20251219C295', 'close': 1.0, 'long': ['AMZN20251219C290'], 'short': ['AMZN20251219C295']}}\n", - "\n", - "===========================\n", - "Buy Details\n", - "Position: {'trade_id': '&L:AMZN20251219C290&S:AMZN20251219C295', 'close': 0.9216552702477177, 'long': ['AMZN20251219C290'], 'short': ['AMZN20251219C295'], 'quantity': 9, 'cash_equivalent_qty': 10.0}, Date: 2025-01-06, Signal: SignalEvent type:LONG, symbol=AMZN, date:2025-01-06 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:AMZN20250106LONG, parent_event:None\n", - "Max Contract Price: 4, Cash at Hand: 9.271763022373301\n", - "Cash at Hand 9.271763022373301 Close 0.9216552702477177\n", - "===========================\n", - "Processing event: SIGNAL 2025-01-06 00:00:00\n", - "\n", - "Order Received: {'result': 'SUCCESSFUL', 'data': {'trade_id': '&L:BA20251219C190&S:BA20251219C195', 'close': 1.1499999999999986, 'long': ['BA20251219C190'], 'short': ['BA20251219C195']}}\n", - "\n", - "===========================\n", - "Buy Details\n", - "Position: {'trade_id': '&L:BA20251219C190&S:BA20251219C195', 'close': 1.3384713904762113, 'long': ['BA20251219C190'], 'short': ['BA20251219C195'], 'quantity': 4, 'cash_equivalent_qty': 4.0}, Date: 2025-01-06, Signal: SignalEvent type:LONG, symbol=BA, date:2025-01-06 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:BA20250106LONG, parent_event:None\n", - "Max Contract Price: 4, Cash at Hand: 5.684764764040729\n", - "Cash at Hand 5.684764764040729 Close 1.3384713904762113\n", - "===========================\n", - "Processing event: SIGNAL 2025-01-06 00:00:00\n", - "\n", - "Order Received: {'result': 'SUCCESSFUL', 'data': {'trade_id': '&L:NFLX20251219C1110&S:NFLX20251219C1120', 'close': 1.7250000000000014, 'long': ['NFLX20251219C1110'], 'short': ['NFLX20251219C1120']}}\n", - "\n", - "===========================\n", - "Buy Details\n", - "Position: {'trade_id': '&L:NFLX20251219C1110&S:NFLX20251219C1120', 'close': 1.942095710132292, 'long': ['NFLX20251219C1110'], 'short': ['NFLX20251219C1120'], 'quantity': 8, 'cash_equivalent_qty': 8.0}, Date: 2025-01-06, Signal: SignalEvent type:LONG, symbol=NFLX, date:2025-01-06 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:NFLX20250106LONG, parent_event:None\n", - "Max Contract Price: 4, Cash at Hand: 16.410318521123216\n", - "Cash at Hand 16.410318521123216 Close 1.942095710132292\n", - "===========================\n", - "Processing event: ORDER 2025-01-06 00:00:00\n", - "Processing event: ORDER 2025-01-06 00:00:00\n", - "Processing event: ORDER 2025-01-06 00:00:00\n", - "Processing event: ORDER 2025-01-06 00:00:00\n", - "Processing event: ORDER 2025-01-06 00:00:00\n", - "Processing event: FILL 2025-01-06 00:00:00\n", - "Processing event: FILL 2025-01-06 00:00:00\n", - "Processing event: FILL 2025-01-06 00:00:00\n", - "Processing event: FILL 2025-01-06 00:00:00\n", - "Processing event: FILL 2025-01-06 00:00:00\n", - "Risk Manager Actions: {}\n", - "Event queue is empty, processed 16 event(s)\n", - "Processing event: MARKET 2025-01-07 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-01-08 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-01-09 00:00:00\n", - "Risk Manager Actions: IS_HOLIDAY\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-01-10 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-01-13 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-01-14 00:00:00\n", - "Processing event: SIGNAL 2025-01-14 00:00:00\n", - "\n", - "Order Received: {'result': 'SUCCESSFUL', 'data': {'trade_id': '&L:COST20260116C1000&S:COST20260116C1005', 'close': 2.0249999999999773, 'long': ['COST20260116C1000'], 'short': ['COST20260116C1005']}}\n", - "\n", - "===========================\n", - "Buy Details\n", - "Position: {'trade_id': '&L:COST20260116C1000&S:COST20260116C1005', 'close': 1.9432050419885047, 'long': ['COST20260116C1000'], 'short': ['COST20260116C1005'], 'quantity': 7, 'cash_equivalent_qty': 7.0}, Date: 2025-01-14, Signal: SignalEvent type:LONG, symbol=COST, date:2025-01-14 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:COST20250114LONG, parent_event:None\n", - "Max Contract Price: 4, Cash at Hand: 13.681487030445357\n", - "Cash at Hand 13.681487030445357 Close 1.9432050419885047\n", - "===========================\n", - "Processing event: ORDER 2025-01-14 00:00:00\n", - "Processing event: FILL 2025-01-14 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None)}\n", - "Event queue is empty, processed 4 event(s)\n", - "Processing event: MARKET 2025-01-15 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': ADJUST(&L:AMZN20251219C290&S:AMZN20251219C295, Quantity Change: -1), Reason: greek_limit), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-01-16 00:00:00\n", - "Processing event: ORDER 2025-01-16 00:00:00\n", - "Processing event: FILL 2025-01-16 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None)}\n", - "Event queue is empty, processed 3 event(s)\n", - "Processing event: MARKET 2025-01-17 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-01-20 00:00:00\n", - "Risk Manager Actions: IS_HOLIDAY\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-01-21 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-01-22 00:00:00\n", - "Processing event: SIGNAL 2025-01-22 00:00:00\n", - "\n", - "Order Received: {'result': 'SUCCESSFUL', 'data': {'trade_id': '&L:META20251219C760&S:META20251219C765', 'close': 0.9750000000000014, 'long': ['META20251219C760'], 'short': ['META20251219C765']}}\n", - "\n", - "===========================\n", - "Buy Details\n", - "Position: {'trade_id': '&L:META20251219C760&S:META20251219C765', 'close': 1.1986658014898806, 'long': ['META20251219C760'], 'short': ['META20251219C765'], 'quantity': 18, 'cash_equivalent_qty': 18.0}, Date: 2025-01-22, Signal: SignalEvent type:LONG, symbol=META, date:2025-01-22 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:META20250122LONG, parent_event:None\n", - "Max Contract Price: 4, Cash at Hand: 22.351217223487428\n", - "Cash at Hand 22.351217223487428 Close 1.1986658014898806\n", - "===========================\n", - "Processing event: ORDER 2025-01-22 00:00:00\n", - "Processing event: FILL 2025-01-22 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None)}\n", - "Event queue is empty, processed 4 event(s)\n", - "Processing event: MARKET 2025-01-23 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20251219C760&S:META20251219C765': HOLD(&L:META20251219C760&S:META20251219C765) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-01-24 00:00:00\n", - "Processing event: SIGNAL 2025-01-24 00:00:00\n", - "\n", - "Order Received: {'result': 'SUCCESSFUL', 'data': {'trade_id': '&L:SBUX20260320C125&S:SBUX20260320C130', 'close': 1.0900000000000003, 'long': ['SBUX20260320C125'], 'short': ['SBUX20260320C130']}}\n", - "\n", - "===========================\n", - "Buy Details\n", - "Position: {'trade_id': '&L:SBUX20260320C125&S:SBUX20260320C130', 'close': 1.0900000000000003, 'long': ['SBUX20260320C125'], 'short': ['SBUX20260320C130'], 'quantity': 4, 'cash_equivalent_qty': 4.0}, Date: 2025-01-24, Signal: SignalEvent type:LONG, symbol=SBUX, date:2025-01-24 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:SBUX20250124LONG, parent_event:None\n", - "Max Contract Price: 4, Cash at Hand: 4.892089432439992\n", - "Cash at Hand 4.892089432439992 Close 1.0900000000000003\n", - "===========================\n", - "Processing event: ORDER 2025-01-24 00:00:00\n", - "Processing event: FILL 2025-01-24 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20251219C760&S:META20251219C765': HOLD(&L:META20251219C760&S:META20251219C765) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None)}\n", - "Event queue is empty, processed 4 event(s)\n", - "Processing event: MARKET 2025-01-27 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20251219C760&S:META20251219C765': HOLD(&L:META20251219C760&S:META20251219C765) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:SBUX20260320C125&S:SBUX20260320C130': HOLD(&L:SBUX20260320C125&S:SBUX20260320C130) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-01-28 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20251219C760&S:META20251219C765': HOLD(&L:META20251219C760&S:META20251219C765) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:SBUX20260320C125&S:SBUX20260320C130': HOLD(&L:SBUX20260320C125&S:SBUX20260320C130) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-01-29 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20251219C760&S:META20251219C765': HOLD(&L:META20251219C760&S:META20251219C765) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:SBUX20260320C125&S:SBUX20260320C130': HOLD(&L:SBUX20260320C125&S:SBUX20260320C130) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-01-30 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20251219C760&S:META20251219C765': HOLD(&L:META20251219C760&S:META20251219C765) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:SBUX20260320C125&S:SBUX20260320C130': HOLD(&L:SBUX20260320C125&S:SBUX20260320C130) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-01-31 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20251219C760&S:META20251219C765': HOLD(&L:META20251219C760&S:META20251219C765) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': ADJUST(&L:NFLX20251219C1110&S:NFLX20251219C1120, Quantity Change: -1), Reason: greek_limit), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:SBUX20260320C125&S:SBUX20260320C130': HOLD(&L:SBUX20260320C125&S:SBUX20260320C130) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-03 00:00:00\n", - "Processing event: ORDER 2025-02-03 00:00:00\n", - "Processing event: FILL 2025-02-03 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20251219C760&S:META20251219C765': HOLD(&L:META20251219C760&S:META20251219C765) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:SBUX20260320C125&S:SBUX20260320C130': HOLD(&L:SBUX20260320C125&S:SBUX20260320C130) Reason: None)}\n", - "Event queue is empty, processed 3 event(s)\n", - "Processing event: MARKET 2025-02-04 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20251219C760&S:META20251219C765': HOLD(&L:META20251219C760&S:META20251219C765) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': ADJUST(&L:AMZN20251219C290&S:AMZN20251219C295, Quantity Change: -1), Reason: greek_limit), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:SBUX20260320C125&S:SBUX20260320C130': HOLD(&L:SBUX20260320C125&S:SBUX20260320C130) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-05 00:00:00\n", - "Processing event: ORDER 2025-02-05 00:00:00\n", - "Processing event: FILL 2025-02-05 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20251219C760&S:META20251219C765': HOLD(&L:META20251219C760&S:META20251219C765) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:SBUX20260320C125&S:SBUX20260320C130': HOLD(&L:SBUX20260320C125&S:SBUX20260320C130) Reason: None)}\n", - "Event queue is empty, processed 3 event(s)\n", - "Processing event: MARKET 2025-02-06 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20251219C760&S:META20251219C765': HOLD(&L:META20251219C760&S:META20251219C765) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:SBUX20260320C125&S:SBUX20260320C130': ADJUST(&L:SBUX20260320C125&S:SBUX20260320C130, Quantity Change: -2), Reason: greek_limit)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-07 00:00:00\n", - "Processing event: ORDER 2025-02-07 00:00:00\n", - "Processing event: FILL 2025-02-07 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20251219C760&S:META20251219C765': HOLD(&L:META20251219C760&S:META20251219C765) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:SBUX20260320C125&S:SBUX20260320C130': HOLD(&L:SBUX20260320C125&S:SBUX20260320C130) Reason: None)}\n", - "Event queue is empty, processed 3 event(s)\n", - "Processing event: MARKET 2025-02-10 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20251219C760&S:META20251219C765': HOLD(&L:META20251219C760&S:META20251219C765) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:SBUX20260320C125&S:SBUX20260320C130': HOLD(&L:SBUX20260320C125&S:SBUX20260320C130) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-11 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20251219C760&S:META20251219C765': HOLD(&L:META20251219C760&S:META20251219C765) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:SBUX20260320C125&S:SBUX20260320C130': HOLD(&L:SBUX20260320C125&S:SBUX20260320C130) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-12 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20251219C760&S:META20251219C765': HOLD(&L:META20251219C760&S:META20251219C765) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:SBUX20260320C125&S:SBUX20260320C130': HOLD(&L:SBUX20260320C125&S:SBUX20260320C130) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-13 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20251219C760&S:META20251219C765': HOLD(&L:META20251219C760&S:META20251219C765) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:SBUX20260320C125&S:SBUX20260320C130': HOLD(&L:SBUX20260320C125&S:SBUX20260320C130) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-14 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20251219C760&S:META20251219C765': HOLD(&L:META20251219C760&S:META20251219C765) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:SBUX20260320C125&S:SBUX20260320C130': HOLD(&L:SBUX20260320C125&S:SBUX20260320C130) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-17 00:00:00\n", - "Risk Manager Actions: IS_HOLIDAY\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-18 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20251219C760&S:META20251219C765': HOLD(&L:META20251219C760&S:META20251219C765) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:SBUX20260320C125&S:SBUX20260320C130': HOLD(&L:SBUX20260320C125&S:SBUX20260320C130) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-19 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20251219C760&S:META20251219C765': HOLD(&L:META20251219C760&S:META20251219C765) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:SBUX20260320C125&S:SBUX20260320C130': HOLD(&L:SBUX20260320C125&S:SBUX20260320C130) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-20 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20251219C760&S:META20251219C765': HOLD(&L:META20251219C760&S:META20251219C765) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:SBUX20260320C125&S:SBUX20260320C130': HOLD(&L:SBUX20260320C125&S:SBUX20260320C130) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-21 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20251219C760&S:META20251219C765': HOLD(&L:META20251219C760&S:META20251219C765) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:SBUX20260320C125&S:SBUX20260320C130': HOLD(&L:SBUX20260320C125&S:SBUX20260320C130) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-24 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20251219C760&S:META20251219C765': HOLD(&L:META20251219C760&S:META20251219C765) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': ADJUST(&L:AAPL20251219C320&S:AAPL20251219C330, Quantity Change: -1), Reason: greek_limit), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:SBUX20260320C125&S:SBUX20260320C130': HOLD(&L:SBUX20260320C125&S:SBUX20260320C130) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-25 00:00:00\n", - "Processing event: ORDER 2025-02-25 00:00:00\n", - "Processing event: FILL 2025-02-25 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20251219C760&S:META20251219C765': HOLD(&L:META20251219C760&S:META20251219C765) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:SBUX20260320C125&S:SBUX20260320C130': HOLD(&L:SBUX20260320C125&S:SBUX20260320C130) Reason: None)}\n", - "Event queue is empty, processed 3 event(s)\n", - "Processing event: MARKET 2025-02-26 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20251219C760&S:META20251219C765': HOLD(&L:META20251219C760&S:META20251219C765) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:SBUX20260320C125&S:SBUX20260320C130': HOLD(&L:SBUX20260320C125&S:SBUX20260320C130) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-27 00:00:00\n", - "Risk Manager Actions: {'&L:META20251219C760&S:META20251219C765': HOLD(&L:META20251219C760&S:META20251219C765) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:SBUX20260320C125&S:SBUX20260320C130': HOLD(&L:SBUX20260320C125&S:SBUX20260320C130) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-28 00:00:00\n", - "Processing event: SIGNAL 2025-02-28 00:00:00\n", - "Not generating order because: CLOSE price is negative SignalEvent type:CLOSE, symbol=TSLA, date:2025-02-28 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:TSLA20250106LONG, parent_event:None, moving event to 2025-03-03 00:00:00\n", - "Risk Manager Actions: {}\n", - "Event queue is empty, processed 2 event(s)\n", - "Processing event: MARKET 2025-03-03 00:00:00\n", - "Processing event: SIGNAL 2025-03-03 00:00:00\n", - "Processing event: SIGNAL 2025-03-03 00:00:00\n", - "Processing event: SIGNAL 2025-03-03 00:00:00\n", - "Processing event: SIGNAL 2025-03-03 00:00:00\n", - "Processing event: SIGNAL 2025-03-03 00:00:00\n", - "Processing event: SIGNAL 2025-03-03 00:00:00\n", - "Processing event: SIGNAL 2025-03-03 00:00:00\n", - "Processing event: SIGNAL 2025-03-03 00:00:00\n", - "Not generating order because: CLOSE price is negative SignalEvent type:CLOSE, symbol=TSLA, date:2025-03-03 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:TSLA20250106LONG, parent_event:None, moving event to 2025-03-04 00:00:00\n", - "Event date 20250304 not found in backtest range.\n", - "2025-06-26 20:32:58 OptionSignalEventScheduler ERROR: Event date 20250304 not found in backtest range\n", - "Processing event: ORDER 2025-03-03 00:00:00\n", - "Processing event: ORDER 2025-03-03 00:00:00\n", - "Processing event: ORDER 2025-03-03 00:00:00\n", - "Processing event: ORDER 2025-03-03 00:00:00\n", - "Processing event: ORDER 2025-03-03 00:00:00\n", - "Processing event: ORDER 2025-03-03 00:00:00\n", - "Processing event: ORDER 2025-03-03 00:00:00\n", - "Processing event: FILL 2025-03-03 00:00:00\n", - "Processing event: FILL 2025-03-03 00:00:00\n", - "Processing event: FILL 2025-03-03 00:00:00\n", - "Processing event: FILL 2025-03-03 00:00:00\n", - "Processing event: FILL 2025-03-03 00:00:00\n", - "Processing event: FILL 2025-03-03 00:00:00\n", - "Processing event: FILL 2025-03-03 00:00:00\n", - "Risk Manager Actions: {}\n", - "Event queue is empty, processed 23 event(s)\n", - "No more dates left.\n" - ] - } - ], - "source": [ - "evb_backtest_smooth.run()" - ] - }, - { - "cell_type": "code", - "execution_count": 60, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
EntryTimeExitTimeTradeIDPnLEntryPriceExitPricePnL_smoothEntryPrice_smoothExitPrice_smooth
02025-01-06NaT&L:TSLA20251121C450&S:TSLA20251121C455NaN135.0125840.000000NaN134.2290470.000000
12025-01-062025-03-03&L:AAPL20251219C320&S:AAPL20251219C330-257.46947999.14787165.730751-263.483063103.66998070.114322
22025-01-062025-03-03&L:AMZN20251219C290&S:AMZN20251219C295-443.736169104.08976152.067124-363.19180496.19739658.594283
32025-01-062025-03-03&L:BA20251219C190&S:BA20251219C195206.990137122.917398177.48626720.061838144.151327158.550384
42025-01-062025-03-03&L:NFLX20251219C1110&S:NFLX20251219C1120978.529967185.257774311.833123793.321754206.059825322.486633
52025-01-142025-03-03&L:COST20260116C1000&S:COST20260116C1005147.511080210.479602248.592590469.579109205.158809286.870674
62025-01-222025-03-03&L:META20251219C760&S:META20251219C765842.311680103.367802148.974088409.186852124.567750152.593581
72025-01-242025-03-03&L:SBUX20260320C125&S:SBUX20260320C130332.277192114.931829210.459649293.328606116.741763194.618396
\n", - "
" - ], - "text/plain": [ - " EntryTime ExitTime TradeID PnL \\\n", - "0 2025-01-06 NaT &L:TSLA20251121C450&S:TSLA20251121C455 NaN \n", - "1 2025-01-06 2025-03-03 &L:AAPL20251219C320&S:AAPL20251219C330 -257.469479 \n", - "2 2025-01-06 2025-03-03 &L:AMZN20251219C290&S:AMZN20251219C295 -443.736169 \n", - "3 2025-01-06 2025-03-03 &L:BA20251219C190&S:BA20251219C195 206.990137 \n", - "4 2025-01-06 2025-03-03 &L:NFLX20251219C1110&S:NFLX20251219C1120 978.529967 \n", - "5 2025-01-14 2025-03-03 &L:COST20260116C1000&S:COST20260116C1005 147.511080 \n", - "6 2025-01-22 2025-03-03 &L:META20251219C760&S:META20251219C765 842.311680 \n", - "7 2025-01-24 2025-03-03 &L:SBUX20260320C125&S:SBUX20260320C130 332.277192 \n", - "\n", - " EntryPrice ExitPrice PnL_smooth EntryPrice_smooth ExitPrice_smooth \n", - "0 135.012584 0.000000 NaN 134.229047 0.000000 \n", - "1 99.147871 65.730751 -263.483063 103.669980 70.114322 \n", - "2 104.089761 52.067124 -363.191804 96.197396 58.594283 \n", - "3 122.917398 177.486267 20.061838 144.151327 158.550384 \n", - "4 185.257774 311.833123 793.321754 206.059825 322.486633 \n", - "5 210.479602 248.592590 469.579109 205.158809 286.870674 \n", - "6 103.367802 148.974088 409.186852 124.567750 152.593581 \n", - "7 114.931829 210.459649 293.328606 116.741763 194.618396 " - ] - }, - "execution_count": 60, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "smooth_pnl = evb_backtest_smooth.portfolio.trades.copy()[['TradeID', 'PnL', 'EntryPrice', 'ExitPrice']]\n", - "pnl = evb_backtest.portfolio.trades.copy()[['EntryTime','ExitTime','TradeID', 'PnL', 'EntryPrice', 'ExitPrice']]\n", - "pnl = pnl.merge(smooth_pnl, on='TradeID', suffixes=('', '_smooth'))\n", - "pnl" - ] - }, - { - "cell_type": "code", - "execution_count": 61, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
EntryTimeExitTimeTradeIDPnLEntryPriceExitPricePnL_smoothEntryPrice_smoothExitPrice_smoothABS_Pct_Diffabs_entry_price_diffabs_exit_price_diff
52025-01-142025-03-03&L:COST20260116C1000&S:COST20260116C1005147.511080210.479602248.592590469.579109205.158809286.8706742.1833480.0252790.153979
32025-01-062025-03-03&L:BA20251219C190&S:BA20251219C195206.990137122.917398177.48626720.061838144.151327158.5503840.9030780.1727500.106689
62025-01-222025-03-03&L:META20251219C760&S:META20251219C765842.311680103.367802148.974088409.186852124.567750152.5935810.5142100.2050920.024296
42025-01-062025-03-03&L:NFLX20251219C1110&S:NFLX20251219C1120978.529967185.257774311.833123793.321754206.059825322.4866330.1892720.1122870.034164
22025-01-062025-03-03&L:AMZN20251219C290&S:AMZN20251219C295-443.736169104.08976152.067124-363.19180496.19739658.5942830.1815140.0758230.125360
72025-01-242025-03-03&L:SBUX20260320C125&S:SBUX20260320C130332.277192114.931829210.459649293.328606116.741763194.6183960.1172170.0157480.075270
12025-01-062025-03-03&L:AAPL20251219C320&S:AAPL20251219C330-257.46947999.14787165.730751-263.483063103.66998070.1143220.0233560.0456100.066690
02025-01-06NaT&L:TSLA20251121C450&S:TSLA20251121C455NaN135.0125840.000000NaN134.2290470.000000NaN0.005803NaN
\n", - "
" - ], - "text/plain": [ - " EntryTime ExitTime TradeID PnL \\\n", - "5 2025-01-14 2025-03-03 &L:COST20260116C1000&S:COST20260116C1005 147.511080 \n", - "3 2025-01-06 2025-03-03 &L:BA20251219C190&S:BA20251219C195 206.990137 \n", - "6 2025-01-22 2025-03-03 &L:META20251219C760&S:META20251219C765 842.311680 \n", - "4 2025-01-06 2025-03-03 &L:NFLX20251219C1110&S:NFLX20251219C1120 978.529967 \n", - "2 2025-01-06 2025-03-03 &L:AMZN20251219C290&S:AMZN20251219C295 -443.736169 \n", - "7 2025-01-24 2025-03-03 &L:SBUX20260320C125&S:SBUX20260320C130 332.277192 \n", - "1 2025-01-06 2025-03-03 &L:AAPL20251219C320&S:AAPL20251219C330 -257.469479 \n", - "0 2025-01-06 NaT &L:TSLA20251121C450&S:TSLA20251121C455 NaN \n", - "\n", - " EntryPrice ExitPrice PnL_smooth EntryPrice_smooth ExitPrice_smooth \\\n", - "5 210.479602 248.592590 469.579109 205.158809 286.870674 \n", - "3 122.917398 177.486267 20.061838 144.151327 158.550384 \n", - "6 103.367802 148.974088 409.186852 124.567750 152.593581 \n", - "4 185.257774 311.833123 793.321754 206.059825 322.486633 \n", - "2 104.089761 52.067124 -363.191804 96.197396 58.594283 \n", - "7 114.931829 210.459649 293.328606 116.741763 194.618396 \n", - "1 99.147871 65.730751 -263.483063 103.669980 70.114322 \n", - "0 135.012584 0.000000 NaN 134.229047 0.000000 \n", - "\n", - " ABS_Pct_Diff abs_entry_price_diff abs_exit_price_diff \n", - "5 2.183348 0.025279 0.153979 \n", - "3 0.903078 0.172750 0.106689 \n", - "6 0.514210 0.205092 0.024296 \n", - "4 0.189272 0.112287 0.034164 \n", - "2 0.181514 0.075823 0.125360 \n", - "7 0.117217 0.015748 0.075270 \n", - "1 0.023356 0.045610 0.066690 \n", - "0 NaN 0.005803 NaN " - ] - }, - "execution_count": 61, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "pnl['ABS_Pct_Diff'] = (pnl.PnL - pnl.PnL_smooth).abs() / pnl.PnL.abs()\n", - "pnl['abs_entry_price_diff'] = (pnl.EntryPrice - pnl.EntryPrice_smooth).abs() / pnl.EntryPrice.abs()\n", - "pnl['abs_exit_price_diff'] = (pnl.ExitPrice - pnl.ExitPrice_smooth).abs() / pnl.ExitPrice.abs()\n", - "pnl.sort_values(by='ABS_Pct_Diff', ascending=False)" - ] - }, - { - "cell_type": "code", - "execution_count": 62, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[autoreload of EventDriven.portfolio failed: Traceback (most recent call last):\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/IPython/extensions/autoreload.py\", line 276, in check\n", - " superreload(m, reload, self.old_objects)\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/IPython/extensions/autoreload.py\", line 475, in superreload\n", - " module = reload(module)\n", - " ^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/importlib/__init__.py\", line 169, in reload\n", - " _bootstrap._exec(spec, module)\n", - " File \"\", line 621, in _exec\n", - " File \"\", line 936, in exec_module\n", - " File \"\", line 1074, in get_code\n", - " File \"\", line 1004, in source_to_code\n", - " File \"\", line 241, in _call_with_frames_removed\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py\", line 73\n", - " def __init__(self, bars : HistoricTradeDataHandler, eventScheduler: EventScheduler, risk_manager : RiskManager, weight_map = None, initial_capital = 10000): \n", - " ^^^\n", - "IndentationError: expected an indented block after function definition on line 72\n", - "]\n" - ] - }, - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "hovertemplate": "variable=ewm_3_pct_skip
Datetime=%{x}
value=%{y}", - "legendgroup": "ewm_3_pct_skip", - "line": { - "color": "#636efa", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "ewm_3_pct_skip", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": [ - "2025-01-06T00:00:00", - "2025-01-07T00:00:00", - "2025-01-08T00:00:00", - "2025-01-09T00:00:00", - "2025-01-10T00:00:00", - "2025-01-13T00:00:00", - "2025-01-14T00:00:00", - "2025-01-15T00:00:00", - "2025-01-16T00:00:00", - "2025-01-17T00:00:00", - "2025-01-20T00:00:00", - "2025-01-21T00:00:00", - "2025-01-22T00:00:00", - "2025-01-23T00:00:00", - "2025-01-24T00:00:00", - "2025-01-27T00:00:00", - "2025-01-28T00:00:00", - "2025-01-29T00:00:00", - "2025-01-30T00:00:00", - "2025-01-31T00:00:00", - "2025-02-03T00:00:00", - "2025-02-04T00:00:00", - "2025-02-05T00:00:00", - "2025-02-06T00:00:00", - "2025-02-07T00:00:00", - "2025-02-10T00:00:00", - "2025-02-11T00:00:00", - "2025-02-12T00:00:00", - "2025-02-13T00:00:00", - "2025-02-14T00:00:00", - "2025-02-17T00:00:00", - "2025-02-18T00:00:00", - "2025-02-19T00:00:00", - "2025-02-20T00:00:00", - "2025-02-21T00:00:00", - "2025-02-24T00:00:00", - "2025-02-25T00:00:00", - "2025-02-26T00:00:00", - "2025-02-27T00:00:00", - "2025-02-28T00:00:00", - "2025-03-03T00:00:00" - ], - "xaxis": "x", - "y": [ - false, - false, - false, - false, - false, - false, - false, - false, - true, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false - ], - "yaxis": "y" - }, - { - "hovertemplate": "variable=ewm_5_pct_skip
Datetime=%{x}
value=%{y}", - "legendgroup": "ewm_5_pct_skip", - "line": { - "color": "#EF553B", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "ewm_5_pct_skip", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": [ - "2025-01-06T00:00:00", - "2025-01-07T00:00:00", - "2025-01-08T00:00:00", - "2025-01-09T00:00:00", - "2025-01-10T00:00:00", - "2025-01-13T00:00:00", - "2025-01-14T00:00:00", - "2025-01-15T00:00:00", - "2025-01-16T00:00:00", - "2025-01-17T00:00:00", - "2025-01-20T00:00:00", - "2025-01-21T00:00:00", - "2025-01-22T00:00:00", - "2025-01-23T00:00:00", - "2025-01-24T00:00:00", - "2025-01-27T00:00:00", - "2025-01-28T00:00:00", - "2025-01-29T00:00:00", - "2025-01-30T00:00:00", - "2025-01-31T00:00:00", - "2025-02-03T00:00:00", - "2025-02-04T00:00:00", - "2025-02-05T00:00:00", - "2025-02-06T00:00:00", - "2025-02-07T00:00:00", - "2025-02-10T00:00:00", - "2025-02-11T00:00:00", - "2025-02-12T00:00:00", - "2025-02-13T00:00:00", - "2025-02-14T00:00:00", - "2025-02-17T00:00:00", - "2025-02-18T00:00:00", - "2025-02-19T00:00:00", - "2025-02-20T00:00:00", - "2025-02-21T00:00:00", - "2025-02-24T00:00:00", - "2025-02-25T00:00:00", - "2025-02-26T00:00:00", - "2025-02-27T00:00:00", - "2025-02-28T00:00:00", - "2025-03-03T00:00:00" - ], - "xaxis": "x", - "y": [ - false, - false, - false, - false, - false, - false, - false, - false, - true, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false - ], - "yaxis": "y" - }, - { - "hovertemplate": "variable=Midpoint_skip_day
Datetime=%{x}
value=%{y}", - "legendgroup": "Midpoint_skip_day", - "line": { - "color": "#00cc96", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "Midpoint_skip_day", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": [ - "2025-01-06T00:00:00", - "2025-01-07T00:00:00", - "2025-01-08T00:00:00", - "2025-01-09T00:00:00", - "2025-01-10T00:00:00", - "2025-01-13T00:00:00", - "2025-01-14T00:00:00", - "2025-01-15T00:00:00", - "2025-01-16T00:00:00", - "2025-01-17T00:00:00", - "2025-01-20T00:00:00", - "2025-01-21T00:00:00", - "2025-01-22T00:00:00", - "2025-01-23T00:00:00", - "2025-01-24T00:00:00", - "2025-01-27T00:00:00", - "2025-01-28T00:00:00", - "2025-01-29T00:00:00", - "2025-01-30T00:00:00", - "2025-01-31T00:00:00", - "2025-02-03T00:00:00", - "2025-02-04T00:00:00", - "2025-02-05T00:00:00", - "2025-02-06T00:00:00", - "2025-02-07T00:00:00", - "2025-02-10T00:00:00", - "2025-02-11T00:00:00", - "2025-02-12T00:00:00", - "2025-02-13T00:00:00", - "2025-02-14T00:00:00", - "2025-02-17T00:00:00", - "2025-02-18T00:00:00", - "2025-02-19T00:00:00", - "2025-02-20T00:00:00", - "2025-02-21T00:00:00", - "2025-02-24T00:00:00", - "2025-02-25T00:00:00", - "2025-02-26T00:00:00", - "2025-02-27T00:00:00", - "2025-02-28T00:00:00", - "2025-03-03T00:00:00" - ], - "xaxis": "x", - "y": [ - false, - false, - false, - false, - false, - false, - false, - false, - true, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false - ], - "yaxis": "y" - } - ], - "layout": { - "legend": { - "title": { - "text": "variable" - }, - "tracegroupgap": 0 - }, - "margin": { - "t": 60 - }, - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "heatmapgl": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmapgl" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "xaxis": { - "anchor": "y", - "domain": [ - 0, - 1 - ], - "title": { - "text": "Datetime" - } - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0, - 1 - ], - "title": { - "text": "value" - } - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "pnl\n", - "index = 1\n", - "_id, _entry, _exit = pnl.iloc[index][['TradeID', 'EntryTime', 'ExitTime']]\n", - "data = rm.position_data[_id].copy()\n", - "data['ewm_1'] = data['Midpoint'].ewm(span=1).mean()\n", - "data['ewm_3'] = data['Midpoint'].ewm(span=3).mean()\n", - "data['ewm_5'] = data['Midpoint'].ewm(span=5).mean()\n", - "data['abs_pct_ewn_3'] = (data['Midpoint'] - data['ewm_3']).abs() / data['Midpoint'].abs()\n", - "data['abs_pct_ewn_5'] = (data['Midpoint'] - data['ewm_5']).abs() / data['Midpoint'].abs()\n", - "data['ewm_3_pct_skip'] = data['abs_pct_ewn_3'] > 0.75\n", - "data['ewm_5_pct_skip'] = data['abs_pct_ewn_5'] > 0.75\n", - "data[['ewm_3_pct_skip', 'ewm_5_pct_skip']].sum()\n", - "data[['ewm_3_pct_skip', 'ewm_5_pct_skip', 'Midpoint_skip_day']][_entry:_exit].plot()\n", - "# data[['Midpoint', 'ewm_1', 'ewm_3', 'ewm_5']].plot(title='EWMA Smoothing of Midpoint Price')" - ] - }, - { - "cell_type": "code", - "execution_count": 63, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Start 2025-01-06 00:00:00\n", - "End 2025-03-03 00:00:00\n", - "Duration 56 days 00:00:00\n", - "Exposure Time [%] 100.0\n", - "Equity Final [$] 20799.07\n", - "Equity Peak [$] 25488.926967\n", - "Return [%] 5.706277\n", - "Buy & Hold Return [%] -4.532934\n", - "CAGR [%] 43.57718\n", - "Volatility Ann. [%] 69.030861\n", - "Sharpe Ratio 0.858983\n", - "Sortino Ratio 1.375955\n", - "Skew 0.192601\n", - "Log Return Skew 0.08727\n", - "Calmar Ratio 2.368379\n", - "Max. Drawdown [%] -18.399578\n", - "Max. Drawdown Value [$] -4689.85\n", - "Avg. Drawdown [%] -5.614483\n", - "Max. Drawdown Duration 33 days 00:00:00\n", - "Avg Dradown Duration 10 days 17:33:39.512195122\n", - "# Trades 7\n", - "Win Rate [%] 71.43\n", - "Lose Rate [%] 28.57\n", - "Avg. Trade [%] 20.07143\n", - "Avg. Winning Trade [%] 46.177033\n", - "Avg. Losing Trade [%] -45.192577\n", - "Best Trade [%] 72.277017\n", - "Worst Trade [%] -53.287682\n", - "Avg Trade Duration 50.0\n", - "Avg Win Trade Duration 47.6\n", - "Avg Lose Duration 56.0\n", - "Max Trade Duration 56.0\n", - "Max Win Trade Duration 56.0\n", - "Max Lose Duration 56.0\n", - "Profit Factor 3.576155\n", - "Expectancy [%] 20.072735\n", - "SQN 1.171097\n", - "2025 Return [%] 5.706277\n", - "Winning Streak 5\n", - "Losing Streak 2\n", - "_strategy None\n", - "equity_curve NVDA TSLA ME...\n", - "_trades TradeID ...\n", - "_tickers [NVDA, TSLA, META, NFLX, AMD, AAPL, COST, AMZN...\n", - "dtype: object" - ] - }, - "execution_count": 63, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.portfolio.aggregate()" - ] - }, - { - "cell_type": "code", - "execution_count": 64, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Start 2025-01-06 00:00:00\n", - "End 2025-03-03 00:00:00\n", - "Duration 56 days 00:00:00\n", - "Exposure Time [%] 100.0\n", - "Equity Final [$] 20312.02\n", - "Equity Peak [$] 23958.3422\n", - "Return [%] 3.118206\n", - "Buy & Hold Return [%] -4.532934\n", - "CAGR [%] 22.156873\n", - "Volatility Ann. [%] 36.902873\n", - "Sharpe Ratio 0.721363\n", - "Sortino Ratio 1.36373\n", - "Skew 0.381075\n", - "Log Return Skew 0.328462\n", - "Calmar Ratio 1.455829\n", - "Max. Drawdown [%] -15.219421\n", - "Max. Drawdown Value [$] -3646.32\n", - "Avg. Drawdown [%] -3.424193\n", - "Max. Drawdown Duration 15 days 00:00:00\n", - "Avg Dradown Duration 4 days 16:23:24.878048780\n", - "# Trades 7\n", - "Win Rate [%] 71.43\n", - "Lose Rate [%] 28.57\n", - "Avg. Trade [%] 14.370457\n", - "Avg. Winning Trade [%] 35.770194\n", - "Avg. Losing Trade [%] -39.128887\n", - "Best Trade [%] 62.815696\n", - "Worst Trade [%] -41.949831\n", - "Avg Trade Duration 50.0\n", - "Avg Win Trade Duration 47.6\n", - "Avg Lose Duration 56.0\n", - "Max Trade Duration 56.0\n", - "Max Win Trade Duration 56.0\n", - "Max Lose Duration 56.0\n", - "Profit Factor 3.168275\n", - "Expectancy [%] 14.371527\n", - "SQN 0.98578\n", - "2025 Return [%] 3.118206\n", - "Winning Streak 5\n", - "Losing Streak 2\n", - "_strategy None\n", - "equity_curve NVDA TSLA M...\n", - "_trades TradeID ...\n", - "_tickers [NVDA, TSLA, META, NFLX, AMD, AAPL, COST, AMZN...\n", - "dtype: object" - ] - }, - "execution_count": 64, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest_smooth.portfolio.aggregate()" - ] - }, - { - "cell_type": "raw", - "metadata": { - "vscode": { - "languageId": "raw" - } - }, - "source": [ - "skip_sum = pd.DataFrame()\n", - "from EventDriven.riskmanager.utils import add_skip_columns, clear_info_stack, get_current_saved_ids, save_info_stack\n", - "clear_info_stack()\n", - "for id, position_data in rm.position_data.items():\n", - " if not isinstance(position_data, pd.DataFrame):\n", - " print(id)\n", - " continue \n", - " print(f\"Processing position data for ID: {id}\", end = '\\r')\n", - "\n", - " position_data = add_skip_columns(position_data, id, ['Delta', 'Gamma', 'Vega', 'Theta', 'Midpoint'], 20, 3)\n", - " skip_sum.at[id, 'Midpoint_skip_day'] = position_data['Midpoint_skip_day'].sum()/len(position_data)\n", - " skip_sum.at[id, 'Delta_skip_day'] = position_data['Delta_skip_day'].sum()/len(position_data)\n", - " skip_sum.at[id, 'Gamma_skip_day'] = position_data['Gamma_skip_day'].sum()/len(position_data)\n", - " skip_sum.at[id, 'Vega_skip_day'] = position_data['Vega_skip_day'].sum()/ len(position_data)\n", - " rm.position_data[id] = position_data\n", - "\n" - ] - }, - { - "cell_type": "raw", - "metadata": {}, - "source": [ - "filtered_keys = rm.position_data.filter_keys(lambda x: 'NVDA' in x)\n", - "filtered_positions = rm.processed_option_data.filter_keys(lambda x: 'NVDA' in x)\n", - "for key in filtered_keys:\n", - " del rm.position_data[key]\n", - "\n", - "for key in filtered_positions:\n", - " del rm.processed_option_data[key]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# ***ANALYSIS***" - ] - }, - { - "cell_type": "code", - "execution_count": 112, - "metadata": {}, - "outputs": [], - "source": [ - "from trade.helpers.helper import print_cprofile_internal_time_share, print_top_cprofile_stats\n", - "\n", - "# print_cprofile_internal_time_share(stats, top_n=100, sort_by='call', full_name=False)\n", - "# print_top_cprofile_stats(stats, top_n=100, sort_by='cumulative', full_name=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## ***KNOWN ISSUES***\n", - "\n", - "- Add skips for posiiton open, research for entry\n", - " - Implement skips in everywhere data is used to make decisions.\n", - " - Have a logic to skip delta limit upload\n", - "- Sharpe Ratio in aggregate doesn't look correct, look into it.\n", - "\n", - "\n", - "\n", - "## ***Quick Fixes***\n", - "- Fixed rolling issue where sell is shifted, but buy still goes thru:\n", - " - Handled this by dropping both signals entirely and letting the analyze repopulate till close exits\n", - "\n", - "\n", - "\n", - "## ***Future Fixes***\n", - "- Should greek_limits be updated at each trade. Ie entry on signal & entry on roll?\n", - "- The negative values flipping from positive to short affects the pct_change zscore. Need to figure out what to do about it\n", - "- Re-write calculate_greeks in RM to make better sense.\n", - "- Handle open pnl at end of run. Have issues where none has been sold and pnl not coming up\n", - "- Add order resolve\n", - "- Does the data for split contracts being saved make sense?\n", - "- It saves post split & pre split, joined together on post split timeseries:\n", - " - Might be a good idea to seperate it. As well as save before sizing up.\n", - "- Come out w a solution for negative values. \n", - "- Limits only work for long delta, fix for short delta.\n", - "- Change order to take up a format of \n", - " Column Long | Column Short | Column Short ....\n", - " - Each column would have to somehow be a pegged to another to keep the distance correct.\n", - " - Another option is to construct a chain based on width and known properties.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 113, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
signal_iddatetimesymboldirectioncash_beforecash_after
9NVDA20220125LONG2022-01-25NVDABUY4892.204293-10.953993
45NVDA20221215LONG2022-12-15NVDABUY4322.355001-10.544999
12NVDA20220202LONG2022-02-02NVDABUY5957.598364-0.429804
0NFLX20220105LONG2022-01-05NFLXBUY1512.9157092.748471
3AAPL20220105LONG2022-01-05AAPLBUY2393.8378429.111741
18NVDA20220318LONG2022-03-18NVDABUY5077.76631711.057818
19AAPL20220318LONG2022-03-18AAPLBUY1600.00102916.618397
2AMD20220105LONG2022-01-05AMDBUY1542.49127430.750573
13AMD20220202LONG2022-02-02AMDBUY1367.44810634.991690
38NFLX20221027LONG2022-10-27NFLXBUY2193.71068938.228413
33AAPL20220805LONG2022-08-05AAPLBUY1925.83625585.413971
41NFLX20221114LONG2022-11-14NFLXBUY1915.882150102.709028
40BA20221114LONG2022-11-14BABUY1184.860543118.055683
20AAPL20220318LONG2022-03-22AAPLSELL16.618397140.941136
36AAPL20220914LONG2022-09-14AAPLBUY1412.385323156.747226
14AAPL20220105LONG2022-02-21AAPLSELL9.111741166.694155
26TSLA20220406LONG2022-04-06TSLABUY1957.271325192.991233
23AMZN20220330LONG2022-03-30AMZNBUY1095.437864270.070266
1TSLA20220105LONG2022-01-05TSLABUY2684.632970301.827569
21AAPL20220318LONG2022-03-25AAPLSELL140.941136304.725913
42COST20221123LONG2022-11-23COSTBUY1897.711272436.450427
24AAPL20220318LONG2022-04-04AAPLSELL304.725913487.347717
15AMD20220202LONG2022-02-25AMDSELL34.991690580.483009
43COST20221123LONG2022-11-28COSTSELL436.450427667.094712
5NFLX20220105LONG2022-01-07NFLXSELL2.748471671.533665
4COST20220105LONG2022-01-05COSTBUY1632.722866855.261320
32COST20220801LONG2022-08-01COSTBUY2439.707405928.753758
25AMZN20220330LONG2022-04-04AMZNSELL270.0702661099.367467
37AAPL20220914LONG2022-09-15AAPLSELL156.7472261177.393792
11AMD20220105LONG2022-01-31AMDSELL30.7505731367.448106
34AAPL20220805LONG2022-09-01AAPLSELL85.4139711412.385323
44COST20221123LONG2022-12-05COSTSELL667.0947121416.464597
47BA20221114LONG2023-01-03BASELL118.0556831487.655683
6COST20220105LONG2022-01-07COSTSELL855.2613201563.092167
17AAPL20220105LONG2022-03-15AAPLSELL166.6941551600.001029
22COST20220105LONG2022-03-30COSTSELL1563.0921671823.893297
48NFLX20221114LONG2023-01-03NFLXSELL102.7090281826.109028
35COST20220801LONG2022-09-07COSTSELL928.7537581897.711272
39NFLX20221027LONG2022-11-04NFLXSELL38.2284131915.882150
30AAPL20220318LONG2022-04-28AAPLSELL487.3477171925.836255
8TSLA20220105LONG2022-01-11TSLASELL301.8275691957.271325
28TSLA20220406LONG2022-04-13TSLASELL192.9912332104.581119
7NFLX20220105LONG2022-01-10NFLXSELL671.5336652193.710689
29COST20220105LONG2022-04-14COSTSELL1823.8932972235.355974
31COST20220105LONG2022-05-10COSTSELL2235.3559742439.707405
27NVDA20220318LONG2022-04-12NVDASELL11.0578184322.355001
46NVDA20221215LONG2022-12-19NVDASELL-10.5449994566.555001
16NVDA20220202LONG2022-02-25NVDASELL-0.4298045077.766317
10NVDA20220125LONG2022-01-27NVDASELL-10.9539935957.598364
\n", - "
" - ], - "text/plain": [ - " signal_id datetime symbol direction cash_before cash_after\n", - "9 NVDA20220125LONG 2022-01-25 NVDA BUY 4892.204293 -10.953993\n", - "45 NVDA20221215LONG 2022-12-15 NVDA BUY 4322.355001 -10.544999\n", - "12 NVDA20220202LONG 2022-02-02 NVDA BUY 5957.598364 -0.429804\n", - "0 NFLX20220105LONG 2022-01-05 NFLX BUY 1512.915709 2.748471\n", - "3 AAPL20220105LONG 2022-01-05 AAPL BUY 2393.837842 9.111741\n", - "18 NVDA20220318LONG 2022-03-18 NVDA BUY 5077.766317 11.057818\n", - "19 AAPL20220318LONG 2022-03-18 AAPL BUY 1600.001029 16.618397\n", - "2 AMD20220105LONG 2022-01-05 AMD BUY 1542.491274 30.750573\n", - "13 AMD20220202LONG 2022-02-02 AMD BUY 1367.448106 34.991690\n", - "38 NFLX20221027LONG 2022-10-27 NFLX BUY 2193.710689 38.228413\n", - "33 AAPL20220805LONG 2022-08-05 AAPL BUY 1925.836255 85.413971\n", - "41 NFLX20221114LONG 2022-11-14 NFLX BUY 1915.882150 102.709028\n", - "40 BA20221114LONG 2022-11-14 BA BUY 1184.860543 118.055683\n", - "20 AAPL20220318LONG 2022-03-22 AAPL SELL 16.618397 140.941136\n", - "36 AAPL20220914LONG 2022-09-14 AAPL BUY 1412.385323 156.747226\n", - "14 AAPL20220105LONG 2022-02-21 AAPL SELL 9.111741 166.694155\n", - "26 TSLA20220406LONG 2022-04-06 TSLA BUY 1957.271325 192.991233\n", - "23 AMZN20220330LONG 2022-03-30 AMZN BUY 1095.437864 270.070266\n", - "1 TSLA20220105LONG 2022-01-05 TSLA BUY 2684.632970 301.827569\n", - "21 AAPL20220318LONG 2022-03-25 AAPL SELL 140.941136 304.725913\n", - "42 COST20221123LONG 2022-11-23 COST BUY 1897.711272 436.450427\n", - "24 AAPL20220318LONG 2022-04-04 AAPL SELL 304.725913 487.347717\n", - "15 AMD20220202LONG 2022-02-25 AMD SELL 34.991690 580.483009\n", - "43 COST20221123LONG 2022-11-28 COST SELL 436.450427 667.094712\n", - "5 NFLX20220105LONG 2022-01-07 NFLX SELL 2.748471 671.533665\n", - "4 COST20220105LONG 2022-01-05 COST BUY 1632.722866 855.261320\n", - "32 COST20220801LONG 2022-08-01 COST BUY 2439.707405 928.753758\n", - "25 AMZN20220330LONG 2022-04-04 AMZN SELL 270.070266 1099.367467\n", - "37 AAPL20220914LONG 2022-09-15 AAPL SELL 156.747226 1177.393792\n", - "11 AMD20220105LONG 2022-01-31 AMD SELL 30.750573 1367.448106\n", - "34 AAPL20220805LONG 2022-09-01 AAPL SELL 85.413971 1412.385323\n", - "44 COST20221123LONG 2022-12-05 COST SELL 667.094712 1416.464597\n", - "47 BA20221114LONG 2023-01-03 BA SELL 118.055683 1487.655683\n", - "6 COST20220105LONG 2022-01-07 COST SELL 855.261320 1563.092167\n", - "17 AAPL20220105LONG 2022-03-15 AAPL SELL 166.694155 1600.001029\n", - "22 COST20220105LONG 2022-03-30 COST SELL 1563.092167 1823.893297\n", - "48 NFLX20221114LONG 2023-01-03 NFLX SELL 102.709028 1826.109028\n", - "35 COST20220801LONG 2022-09-07 COST SELL 928.753758 1897.711272\n", - "39 NFLX20221027LONG 2022-11-04 NFLX SELL 38.228413 1915.882150\n", - "30 AAPL20220318LONG 2022-04-28 AAPL SELL 487.347717 1925.836255\n", - "8 TSLA20220105LONG 2022-01-11 TSLA SELL 301.827569 1957.271325\n", - "28 TSLA20220406LONG 2022-04-13 TSLA SELL 192.991233 2104.581119\n", - "7 NFLX20220105LONG 2022-01-10 NFLX SELL 671.533665 2193.710689\n", - "29 COST20220105LONG 2022-04-14 COST SELL 1823.893297 2235.355974\n", - "31 COST20220105LONG 2022-05-10 COST SELL 2235.355974 2439.707405\n", - "27 NVDA20220318LONG 2022-04-12 NVDA SELL 11.057818 4322.355001\n", - "46 NVDA20221215LONG 2022-12-19 NVDA SELL -10.544999 4566.555001\n", - "16 NVDA20220202LONG 2022-02-25 NVDA SELL -0.429804 5077.766317\n", - "10 NVDA20220125LONG 2022-01-27 NVDA SELL -10.953993 5957.598364" - ] - }, - "execution_count": 113, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pm = evb_backtest.portfolio\n", - "rm = evb_backtest.risk_manager\n", - "events = evb_backtest.get_events()\n", - "transactions = pm.transactions.copy()\n", - "equity = pm._equity.copy()\n", - "trades = pm.trades.copy()\n", - "actions = rm.actions.copy()\n", - "positions = pm.get_all_positions().copy()\n", - "# events[(events.symbol == 'META') & ( events.signal_id == 'META20240927LONG')]\n", - "transactions.sort_values('cash_after')\n", - "# trades[trades.SignalID=='TSLA20240816LONG']" - ] - }, - { - "cell_type": "code", - "execution_count": 114, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Number of Transactions: 49\n", - "Number of Trades: 18\n", - "Number of Transactions with positive change and BUY direction: 0\n", - "Number of Transactions with Negative Change and SELL direction: 0\n", - "Number of CashAfter Transactions below Zero: 3\n", - "Number of ExitPrice below Zero in trades 0\n", - "Number of Unclosed Trades: 0\n" - ] - } - ], - "source": [ - "trades.sort_values('EntryPrice')\n", - "transactions['Change'] = transactions['cash_after'] - transactions['cash_before']\n", - "# equity.AMZN.plot()\n", - "print(\"Number of Transactions:\", len(transactions))\n", - "print(\"Number of Trades:\", len(trades))\n", - "print(\"Number of Transactions with positive change and BUY direction:\",\n", - " len(transactions[(transactions.Change > 0) & (transactions.direction == 'BUY')]))\n", - "print(\"Number of Transactions with Negative Change and SELL direction:\",\n", - " len(transactions[(transactions.Change < 0) & (transactions.direction == 'SELL')]))\n", - "print(\"Number of CashAfter Transactions below Zero:\", \n", - " len(transactions[transactions.cash_after < 0]))\n", - "print(\"Number of ExitPrice below Zero in trades\", \n", - " len(trades[trades.ExitPrice < 0]))\n", - "print(\"Number of Unclosed Trades:\",\n", - " len(trades[trades.ExitTime.isna()]))" - ] - }, - { - "cell_type": "code", - "execution_count": 115, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'NFLX': 1826.109028008205,\n", - " 'TSLA': 2104.581118830373,\n", - " 'AMD': 580.48300923541,\n", - " 'AAPL': 1177.3937920713604,\n", - " 'COST': 1416.464596712606,\n", - " 'NVDA': 4566.555001473599,\n", - " 'AMZN': 1099.3674670943374,\n", - " 'SBUX': 1182.7271931424525,\n", - " 'BA': 1487.6556833265286}" - ] - }, - "execution_count": 115, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pm.allocated_cash_map" - ] - }, - { - "cell_type": "code", - "execution_count": 116, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(422.5, 422.5)" - ] - }, - "execution_count": 116, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "trades.EntryCommission.sum(), trades.ExitCommission.sum()\n", - "# trades.EntrySlippage.sum(), trades.ExitSlippage.sum()" - ] - }, - { - "cell_type": "code", - "execution_count": 117, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Index(['TradeID', 'SignalID', 'Ticker', 'EntryTime', 'ExitTime', 'EntryPrice',\n", - " 'EntryCommission', 'EntrySlippage', 'EntryQuantity',\n", - " 'EntryAuxilaryCost', 'TotalEntryCost', 'ExitPrice', 'ExitCommission',\n", - " 'ExitSlippage', 'ExitQuantity', 'ExitAuxilaryCost', 'TotalExitCost',\n", - " 'Quantity', 'ClosedQuantity', 'ClosedPnL', 'TotalCommission',\n", - " 'TotalSlippage', 'TotalAuxilaryCost', 'OpenQuantity', 'UnrealizedPnL',\n", - " 'PnL', 'ReturnPct', 'Duration'],\n", - " dtype='object')" - ] - }, - "execution_count": 117, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pm.trades.columns" - ] - }, - { - "cell_type": "code", - "execution_count": 118, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
TradeIDSignalIDTickerEntryTimeExitTimeEntryPriceTotalEntryCostEntryQuantityEntrySlippageExitPriceTotalExitCostExitQuantityExitSlippagePnLReturnPctDurationOpenQuantityUnrealizedPnL
1&L:TSLA20230317C1300&S:TSLA20230317C1325TSLA20220105LONGTSLA2022-01-052022-01-11794.2684672382.805401398.905401551.8145851655.4437563-110.656244-746.912489-0.313459600
9&L:TSLA20230317C1500&S:TSLA20230317C1525TSLA20220406LONGTSLA2022-04-062022-04-13352.8560181764.280091582.780091382.3179771911.5898855-81.910115133.4398180.075634700
\n", - "
" - ], - "text/plain": [ - " TradeID SignalID Ticker \\\n", - "1 &L:TSLA20230317C1300&S:TSLA20230317C1325 TSLA20220105LONG TSLA \n", - "9 &L:TSLA20230317C1500&S:TSLA20230317C1525 TSLA20220406LONG TSLA \n", - "\n", - " EntryTime ExitTime EntryPrice TotalEntryCost EntryQuantity \\\n", - "1 2022-01-05 2022-01-11 794.268467 2382.805401 3 \n", - "9 2022-04-06 2022-04-13 352.856018 1764.280091 5 \n", - "\n", - " EntrySlippage ExitPrice TotalExitCost ExitQuantity ExitSlippage \\\n", - "1 98.905401 551.814585 1655.443756 3 -110.656244 \n", - "9 82.780091 382.317977 1911.589885 5 -81.910115 \n", - "\n", - " PnL ReturnPct Duration OpenQuantity UnrealizedPnL \n", - "1 -746.912489 -0.313459 6 0 0 \n", - "9 133.439818 0.075634 7 0 0 " - ] - }, - "execution_count": 118, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "trades[trades.Ticker == 'TSLA'][[\n", - " 'TradeID', 'SignalID', 'Ticker', 'EntryTime', 'ExitTime', 'EntryPrice', 'TotalEntryCost','EntryQuantity', 'EntrySlippage',\n", - " 'ExitPrice', 'TotalExitCost','ExitQuantity','ExitSlippage', 'PnL', 'ReturnPct', 'Duration', 'OpenQuantity', 'UnrealizedPnL'\n", - "]]\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 119, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
EntryCommissionEntryQuantityEntryAuxilaryCostTotalEntryCostEntryPriceExitCommissionExitQuantityExitAuxilaryCostTotalExitCostExitPriceClosedQuantityPnLUnrealizedPnLReturnPct
SignalID
AAPL20220105LONG20.816184.7261012384.726101149.04538120.816109.1107121353.57409599.43058116-911.0522020-0.382036
AAPL20220318LONG16.91388.3826321583.382632121.79866416.913108.2821421142.739592146.86291213272.13571600.171870
AAPL20220805LONG19.51577.9222841840.422284122.69481919.51560.5286491326.97135188.46475715-569.8445670-0.309627
AAPL20220914LONG15.61255.6380961255.638096104.63650815.61259.3534341020.64656685.05388012-269.9068680-0.214956
AMD20220105LONG33.82689.1971161435.889657109.39219733.82682.8111481001.95644372.39187926-1035.9942330-0.721500
AMZN20220330LONG2.6230.367598825.367598412.6837992.6260.702799829.297201414.6486012-31.6055970-0.038293
BA20221114LONG10.4866.8048591066.804859133.35060710.4810.4000001369.600000171.2000008225.59028100.211463
COST20220105LONG9.1759.961546777.461546111.0659359.1780.553914457.779887226.3494417768.19217100.988077
COST20220801LONG6.5560.9536471510.953647302.1907296.5543.542486968.957514193.7915035-572.4072950-0.378838
COST20221123LONG9.1778.7608441461.260844208.7515499.1772.485831675.266228140.0020247-505.7216890-0.346086
NFLX20220105LONG10.4890.1672381510.167238188.77090510.4889.0377831308.829066273.8702778658.86552500.436286
NFLX20221027LONG11.79107.9822762155.482276239.49803111.79147.3462621877.653738208.6281939-340.5925240-0.158012
NFLX20221114LONG9.1798.1731221813.173122259.0247329.179.1000001723.400000246.2000007-197.0462450-0.108675
NVDA20220125LONG62.448223.1582864903.158286102.14913162.448271.4476435968.552357124.34484148892.30471400.181986
NVDA20220202LONG131.3101809.7366665552.080596109.155809131.3101688.0066964728.91541792.965280101-2019.5733330-0.363751
NVDA20221215LONG42.93342.9000004332.900000131.30000042.93342.9000004577.100000138.70000033158.40000000.036558
TSLA20220105LONG3.93102.8054012382.805401794.2684673.93114.5562441655.443756551.8145853-746.9124890-0.313459
TSLA20220406LONG6.5589.2800911764.280091352.8560186.5588.4101151911.589885382.3179775133.43981800.075634
\n", - "
" - ], - "text/plain": [ - " EntryCommission EntryQuantity EntryAuxilaryCost \\\n", - "SignalID \n", - "AAPL20220105LONG 20.8 16 184.726101 \n", - "AAPL20220318LONG 16.9 13 88.382632 \n", - "AAPL20220805LONG 19.5 15 77.922284 \n", - "AAPL20220914LONG 15.6 12 55.638096 \n", - "AMD20220105LONG 33.8 26 89.197116 \n", - "AMZN20220330LONG 2.6 2 30.367598 \n", - "BA20221114LONG 10.4 8 66.804859 \n", - "COST20220105LONG 9.1 7 59.961546 \n", - "COST20220801LONG 6.5 5 60.953647 \n", - "COST20221123LONG 9.1 7 78.760844 \n", - "NFLX20220105LONG 10.4 8 90.167238 \n", - "NFLX20221027LONG 11.7 9 107.982276 \n", - "NFLX20221114LONG 9.1 7 98.173122 \n", - "NVDA20220125LONG 62.4 48 223.158286 \n", - "NVDA20220202LONG 131.3 101 809.736666 \n", - "NVDA20221215LONG 42.9 33 42.900000 \n", - "TSLA20220105LONG 3.9 3 102.805401 \n", - "TSLA20220406LONG 6.5 5 89.280091 \n", - "\n", - " TotalEntryCost EntryPrice ExitCommission ExitQuantity \\\n", - "SignalID \n", - "AAPL20220105LONG 2384.726101 149.045381 20.8 16 \n", - "AAPL20220318LONG 1583.382632 121.798664 16.9 13 \n", - "AAPL20220805LONG 1840.422284 122.694819 19.5 15 \n", - "AAPL20220914LONG 1255.638096 104.636508 15.6 12 \n", - "AMD20220105LONG 1435.889657 109.392197 33.8 26 \n", - "AMZN20220330LONG 825.367598 412.683799 2.6 2 \n", - "BA20221114LONG 1066.804859 133.350607 10.4 8 \n", - "COST20220105LONG 777.461546 111.065935 9.1 7 \n", - "COST20220801LONG 1510.953647 302.190729 6.5 5 \n", - "COST20221123LONG 1461.260844 208.751549 9.1 7 \n", - "NFLX20220105LONG 1510.167238 188.770905 10.4 8 \n", - "NFLX20221027LONG 2155.482276 239.498031 11.7 9 \n", - "NFLX20221114LONG 1813.173122 259.024732 9.1 7 \n", - "NVDA20220125LONG 4903.158286 102.149131 62.4 48 \n", - "NVDA20220202LONG 5552.080596 109.155809 131.3 101 \n", - "NVDA20221215LONG 4332.900000 131.300000 42.9 33 \n", - "TSLA20220105LONG 2382.805401 794.268467 3.9 3 \n", - "TSLA20220406LONG 1764.280091 352.856018 6.5 5 \n", - "\n", - " ExitAuxilaryCost TotalExitCost ExitPrice ClosedQuantity \\\n", - "SignalID \n", - "AAPL20220105LONG 109.110712 1353.574095 99.430581 16 \n", - "AAPL20220318LONG 108.282142 1142.739592 146.862912 13 \n", - "AAPL20220805LONG 60.528649 1326.971351 88.464757 15 \n", - "AAPL20220914LONG 59.353434 1020.646566 85.053880 12 \n", - "AMD20220105LONG 82.811148 1001.956443 72.391879 26 \n", - "AMZN20220330LONG 60.702799 829.297201 414.648601 2 \n", - "BA20221114LONG 10.400000 1369.600000 171.200000 8 \n", - "COST20220105LONG 80.553914 457.779887 226.349441 7 \n", - "COST20220801LONG 43.542486 968.957514 193.791503 5 \n", - "COST20221123LONG 72.485831 675.266228 140.002024 7 \n", - "NFLX20220105LONG 89.037783 1308.829066 273.870277 8 \n", - "NFLX20221027LONG 147.346262 1877.653738 208.628193 9 \n", - "NFLX20221114LONG 9.100000 1723.400000 246.200000 7 \n", - "NVDA20220125LONG 271.447643 5968.552357 124.344841 48 \n", - "NVDA20220202LONG 688.006696 4728.915417 92.965280 101 \n", - "NVDA20221215LONG 42.900000 4577.100000 138.700000 33 \n", - "TSLA20220105LONG 114.556244 1655.443756 551.814585 3 \n", - "TSLA20220406LONG 88.410115 1911.589885 382.317977 5 \n", - "\n", - " PnL UnrealizedPnL ReturnPct \n", - "SignalID \n", - "AAPL20220105LONG -911.052202 0 -0.382036 \n", - "AAPL20220318LONG 272.135716 0 0.171870 \n", - "AAPL20220805LONG -569.844567 0 -0.309627 \n", - "AAPL20220914LONG -269.906868 0 -0.214956 \n", - "AMD20220105LONG -1035.994233 0 -0.721500 \n", - "AMZN20220330LONG -31.605597 0 -0.038293 \n", - "BA20221114LONG 225.590281 0 0.211463 \n", - "COST20220105LONG 768.192171 0 0.988077 \n", - "COST20220801LONG -572.407295 0 -0.378838 \n", - "COST20221123LONG -505.721689 0 -0.346086 \n", - "NFLX20220105LONG 658.865525 0 0.436286 \n", - "NFLX20221027LONG -340.592524 0 -0.158012 \n", - "NFLX20221114LONG -197.046245 0 -0.108675 \n", - "NVDA20220125LONG 892.304714 0 0.181986 \n", - "NVDA20220202LONG -2019.573333 0 -0.363751 \n", - "NVDA20221215LONG 158.400000 0 0.036558 \n", - "TSLA20220105LONG -746.912489 0 -0.313459 \n", - "TSLA20220406LONG 133.439818 0 0.075634 " - ] - }, - "execution_count": 119, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "\n", - "aggregate_by_signalID = trades.groupby('SignalID').agg({\n", - " 'EntryCommission': sum,\n", - " 'EntryQuantity': sum,\n", - " 'EntryAuxilaryCost': sum,\n", - " 'TotalEntryCost': 'first',\n", - " 'EntryPrice': 'mean',\n", - " 'ExitCommission': sum,\n", - " 'ExitQuantity': sum,\n", - " 'ExitAuxilaryCost': sum,\n", - " 'TotalExitCost': 'first',\n", - " 'ExitPrice': 'mean',\n", - " 'ClosedQuantity': sum,\n", - " 'PnL': sum,\n", - " 'UnrealizedPnL': sum,\n", - "})\n", - "aggregate_by_signalID['ReturnPct'] = (aggregate_by_signalID['PnL'] / aggregate_by_signalID['TotalEntryCost'])\n", - "aggregate_by_signalID" - ] - }, - { - "cell_type": "code", - "execution_count": 120, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
EntryCommissionEntryQuantityEntryAuxilaryCostTotalEntryCostEntryPriceExitCommissionExitQuantityExitAuxilaryCostTotalExitCostExitPriceClosedQuantityPnLUnrealizedPnLReturnPct
Ticker
AAPL72.856406.6691132384.726101124.54384372.856337.2749371353.574095104.95303256-1478.6679230-0.620058
AMD33.82689.1971161435.889657109.39219733.82682.8111481001.95644372.39187926-1035.9942330-0.721500
AMZN2.6230.367598825.367598412.6837992.6260.702799829.297201414.6486012-31.6055970-0.038293
BA10.4866.8048591066.804859133.35060710.4810.4000001369.600000171.2000008225.59028100.211463
COST24.719199.676038777.461546207.33607124.719196.582231457.779887186.71432319-309.9368120-0.398652
NFLX31.224296.3226361510.167238229.09788931.224245.4840451308.829066242.89949024121.22675600.080274
NVDA236.61821075.7949534903.158286114.201647236.61821002.3543395968.552357118.670040182-968.8686190-0.197601
TSLA10.48192.0854922382.805401573.56224310.48202.9663591655.443756467.0662818-613.4726710-0.257458
\n", - "
" - ], - "text/plain": [ - " EntryCommission EntryQuantity EntryAuxilaryCost TotalEntryCost \\\n", - "Ticker \n", - "AAPL 72.8 56 406.669113 2384.726101 \n", - "AMD 33.8 26 89.197116 1435.889657 \n", - "AMZN 2.6 2 30.367598 825.367598 \n", - "BA 10.4 8 66.804859 1066.804859 \n", - "COST 24.7 19 199.676038 777.461546 \n", - "NFLX 31.2 24 296.322636 1510.167238 \n", - "NVDA 236.6 182 1075.794953 4903.158286 \n", - "TSLA 10.4 8 192.085492 2382.805401 \n", - "\n", - " EntryPrice ExitCommission ExitQuantity ExitAuxilaryCost \\\n", - "Ticker \n", - "AAPL 124.543843 72.8 56 337.274937 \n", - "AMD 109.392197 33.8 26 82.811148 \n", - "AMZN 412.683799 2.6 2 60.702799 \n", - "BA 133.350607 10.4 8 10.400000 \n", - "COST 207.336071 24.7 19 196.582231 \n", - "NFLX 229.097889 31.2 24 245.484045 \n", - "NVDA 114.201647 236.6 182 1002.354339 \n", - "TSLA 573.562243 10.4 8 202.966359 \n", - "\n", - " TotalExitCost ExitPrice ClosedQuantity PnL UnrealizedPnL \\\n", - "Ticker \n", - "AAPL 1353.574095 104.953032 56 -1478.667923 0 \n", - "AMD 1001.956443 72.391879 26 -1035.994233 0 \n", - "AMZN 829.297201 414.648601 2 -31.605597 0 \n", - "BA 1369.600000 171.200000 8 225.590281 0 \n", - "COST 457.779887 186.714323 19 -309.936812 0 \n", - "NFLX 1308.829066 242.899490 24 121.226756 0 \n", - "NVDA 5968.552357 118.670040 182 -968.868619 0 \n", - "TSLA 1655.443756 467.066281 8 -613.472671 0 \n", - "\n", - " ReturnPct \n", - "Ticker \n", - "AAPL -0.620058 \n", - "AMD -0.721500 \n", - "AMZN -0.038293 \n", - "BA 0.211463 \n", - "COST -0.398652 \n", - "NFLX 0.080274 \n", - "NVDA -0.197601 \n", - "TSLA -0.257458 " - ] - }, - "execution_count": 120, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "aggregate_by_ticker = trades.groupby('Ticker').agg({\n", - " 'EntryCommission': sum,\n", - " 'EntryQuantity': sum,\n", - " 'EntryAuxilaryCost': sum,\n", - " 'TotalEntryCost': 'first',\n", - " 'EntryPrice': 'mean',\n", - " 'ExitCommission': sum,\n", - " 'ExitQuantity': sum,\n", - " 'ExitAuxilaryCost': sum,\n", - " 'TotalExitCost': 'first',\n", - " 'ExitPrice': 'mean',\n", - " 'ClosedQuantity': sum,\n", - " 'PnL': sum,\n", - " 'UnrealizedPnL': sum,\n", - "})\n", - "\n", - "\n", - "aggregate_by_ticker['ReturnPct'] = (aggregate_by_ticker['PnL'] / aggregate_by_ticker['TotalEntryCost'])\n", - "aggregate_by_ticker" - ] - }, - { - "cell_type": "code", - "execution_count": 121, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "AAPL -0.467028\n", - "AMD -0.611262\n", - "AMZN 0.003587\n", - "BA 0.255553\n", - "COST -0.099377\n", - "NFLX 0.283508\n", - "NVDA -0.066565\n", - "SBUX 0.000000\n", - "TSLA -0.184848\n", - "Total -0.112416\n", - "cash 0.000000\n", - "commission 12.265306\n", - "dtype: float64" - ] - }, - "execution_count": 121, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "((equity.iloc[-1]/equity.iloc[0])-1).sort_index(ascending=True)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 122, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Start 2022-01-05 00:00:00\n", - "End 2023-01-03 00:00:00\n", - "Duration 363 days 00:00:00\n", - "Exposure Time [%] 63.08\n", - "Equity Final [$] 17319.51\n", - "Equity Peak [$] 28961.535968\n", - "Return [%] -11.241642\n", - "Buy & Hold Return [%] -39.585058\n", - "CAGR [%] -11.29994\n", - "Volatility Ann. [%] 114.304614\n", - "Sharpe Ratio 0.470806\n", - "Sortino Ratio 0.467689\n", - "Skew 0.782041\n", - "Log Return Skew -1.364267\n", - "Calmar Ratio 0.232317\n", - "Max. Drawdown [%] -48.640126\n", - "Max. Drawdown Value [$] -14086.93\n", - "Avg. Drawdown [%] -31.185011\n", - "Max. Drawdown Duration 281 days 00:00:00\n", - "Avg Dradown Duration 112 days 19:17:32.307692308\n", - "# Trades 18\n", - "Win Rate [%] 38.89\n", - "Lose Rate [%] 61.11\n", - "Avg. Trade [%] -6.851994\n", - "Avg. Winning Trade [%] 30.026779\n", - "Avg. Losing Trade [%] -30.320303\n", - "Best Trade [%] 98.807738\n", - "Worst Trade [%] -72.149989\n", - "Avg Trade Duration 31.611111\n", - "Avg Win Trade Duration 33.428571\n", - "Avg Lose Duration 30.454545\n", - "Max Trade Duration 125\n", - "Max Win Trade Duration 125\n", - "Max Lose Duration 69\n", - "Profit Factor 0.431756\n", - "Expectancy [%] -6.851323\n", - "SQN -0.774295\n", - "2022 Return [%] -10.923906\n", - "2023 Return [%] -0.356701\n", - "Winning Streak 2\n", - "Losing Streak 4\n", - "_strategy None\n", - "equity_curve NFLX TSLA ...\n", - "_trades TradeID ...\n", - "_tickers [NFLX, TSLA, AMD, AAPL, COST, NVDA, AMZN, SBUX...\n", - "dtype: object" - ] - }, - "execution_count": 122, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pm.aggregate()" - ] - }, - { - "cell_type": "code", - "execution_count": 123, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "name": "Equity Curve", - "showlegend": true, - "type": "scatter", - "x": [ - "2022-01-05T00:00:00", - "2022-01-06T00:00:00", - "2022-01-07T00:00:00", - "2022-01-10T00:00:00", - "2022-01-11T00:00:00", - "2022-01-12T00:00:00", - "2022-01-13T00:00:00", - "2022-01-14T00:00:00", - "2022-01-17T00:00:00", - "2022-01-18T00:00:00", - "2022-01-19T00:00:00", - "2022-01-20T00:00:00", - "2022-01-21T00:00:00", - "2022-01-24T00:00:00", - "2022-01-25T00:00:00", - "2022-01-26T00:00:00", - "2022-01-27T00:00:00", - "2022-01-28T00:00:00", - "2022-01-31T00:00:00", - "2022-02-01T00:00:00", - "2022-02-02T00:00:00", - "2022-02-03T00:00:00", - "2022-02-04T00:00:00", - "2022-02-07T00:00:00", - "2022-02-08T00:00:00", - "2022-02-09T00:00:00", - "2022-02-10T00:00:00", - "2022-02-11T00:00:00", - "2022-02-14T00:00:00", - "2022-02-15T00:00:00", - "2022-02-16T00:00:00", - "2022-02-17T00:00:00", - "2022-02-18T00:00:00", - "2022-02-21T00:00:00", - "2022-02-22T00:00:00", - "2022-02-23T00:00:00", - "2022-02-24T00:00:00", - "2022-02-25T00:00:00", - "2022-02-28T00:00:00", - "2022-03-01T00:00:00", - "2022-03-02T00:00:00", - "2022-03-03T00:00:00", - "2022-03-04T00:00:00", - "2022-03-07T00:00:00", - "2022-03-08T00:00:00", - "2022-03-09T00:00:00", - "2022-03-10T00:00:00", - "2022-03-11T00:00:00", - "2022-03-14T00:00:00", - "2022-03-15T00:00:00", - "2022-03-16T00:00:00", - "2022-03-17T00:00:00", - "2022-03-18T00:00:00", - "2022-03-21T00:00:00", - "2022-03-22T00:00:00", - "2022-03-23T00:00:00", - "2022-03-24T00:00:00", - "2022-03-25T00:00:00", - "2022-03-28T00:00:00", - "2022-03-29T00:00:00", - "2022-03-30T00:00:00", - "2022-03-31T00:00:00", - "2022-04-01T00:00:00", - "2022-04-04T00:00:00", - "2022-04-05T00:00:00", - "2022-04-06T00:00:00", - "2022-04-07T00:00:00", - "2022-04-08T00:00:00", - "2022-04-11T00:00:00", - "2022-04-12T00:00:00", - "2022-04-13T00:00:00", - "2022-04-14T00:00:00", - "2022-04-15T00:00:00", - "2022-04-18T00:00:00", - "2022-04-19T00:00:00", - "2022-04-20T00:00:00", - "2022-04-21T00:00:00", - "2022-04-22T00:00:00", - "2022-04-25T00:00:00", - "2022-04-26T00:00:00", - "2022-04-27T00:00:00", - "2022-04-28T00:00:00", - "2022-04-29T00:00:00", - "2022-05-02T00:00:00", - "2022-05-03T00:00:00", - "2022-05-04T00:00:00", - "2022-05-05T00:00:00", - "2022-05-06T00:00:00", - "2022-05-09T00:00:00", - "2022-05-10T00:00:00", - "2022-05-11T00:00:00", - "2022-05-12T00:00:00", - "2022-05-13T00:00:00", - "2022-05-16T00:00:00", - "2022-05-17T00:00:00", - "2022-05-18T00:00:00", - "2022-05-19T00:00:00", - "2022-05-20T00:00:00", - "2022-05-23T00:00:00", - "2022-05-24T00:00:00", - "2022-05-25T00:00:00", - "2022-05-26T00:00:00", - "2022-05-27T00:00:00", - "2022-05-30T00:00:00", - "2022-05-31T00:00:00", - "2022-06-01T00:00:00", - "2022-06-02T00:00:00", - "2022-06-03T00:00:00", - "2022-06-06T00:00:00", - "2022-06-07T00:00:00", - "2022-06-08T00:00:00", - "2022-06-09T00:00:00", - "2022-06-10T00:00:00", - "2022-06-13T00:00:00", - "2022-06-14T00:00:00", - "2022-06-15T00:00:00", - "2022-06-16T00:00:00", - "2022-06-17T00:00:00", - "2022-06-20T00:00:00", - "2022-06-21T00:00:00", - "2022-06-22T00:00:00", - "2022-06-23T00:00:00", - "2022-06-24T00:00:00", - "2022-06-27T00:00:00", - "2022-06-28T00:00:00", - "2022-06-29T00:00:00", - "2022-06-30T00:00:00", - "2022-07-01T00:00:00", - "2022-07-04T00:00:00", - "2022-07-05T00:00:00", - "2022-07-06T00:00:00", - "2022-07-07T00:00:00", - "2022-07-08T00:00:00", - "2022-07-11T00:00:00", - "2022-07-12T00:00:00", - "2022-07-13T00:00:00", - "2022-07-14T00:00:00", - "2022-07-15T00:00:00", - "2022-07-18T00:00:00", - "2022-07-19T00:00:00", - "2022-07-20T00:00:00", - "2022-07-21T00:00:00", - "2022-07-22T00:00:00", - "2022-07-25T00:00:00", - "2022-07-26T00:00:00", - "2022-07-27T00:00:00", - "2022-07-28T00:00:00", - "2022-07-29T00:00:00", - "2022-08-01T00:00:00", - "2022-08-02T00:00:00", - "2022-08-03T00:00:00", - "2022-08-04T00:00:00", - "2022-08-05T00:00:00", - "2022-08-08T00:00:00", - "2022-08-09T00:00:00", - "2022-08-10T00:00:00", - "2022-08-11T00:00:00", - "2022-08-12T00:00:00", - "2022-08-15T00:00:00", - "2022-08-16T00:00:00", - "2022-08-17T00:00:00", - "2022-08-18T00:00:00", - "2022-08-19T00:00:00", - "2022-08-22T00:00:00", - "2022-08-23T00:00:00", - "2022-08-24T00:00:00", - "2022-08-25T00:00:00", - "2022-08-26T00:00:00", - "2022-08-29T00:00:00", - "2022-08-30T00:00:00", - "2022-08-31T00:00:00", - "2022-09-01T00:00:00", - "2022-09-02T00:00:00", - "2022-09-05T00:00:00", - "2022-09-06T00:00:00", - "2022-09-07T00:00:00", - "2022-09-08T00:00:00", - "2022-09-09T00:00:00", - "2022-09-12T00:00:00", - "2022-09-13T00:00:00", - "2022-09-14T00:00:00", - "2022-09-15T00:00:00", - "2022-09-16T00:00:00", - "2022-09-19T00:00:00", - "2022-09-20T00:00:00", - "2022-09-21T00:00:00", - "2022-09-22T00:00:00", - "2022-09-23T00:00:00", - "2022-09-26T00:00:00", - "2022-09-27T00:00:00", - "2022-09-28T00:00:00", - "2022-09-29T00:00:00", - "2022-09-30T00:00:00", - "2022-10-03T00:00:00", - "2022-10-04T00:00:00", - "2022-10-05T00:00:00", - "2022-10-06T00:00:00", - "2022-10-07T00:00:00", - "2022-10-10T00:00:00", - "2022-10-11T00:00:00", - "2022-10-12T00:00:00", - "2022-10-13T00:00:00", - "2022-10-14T00:00:00", - "2022-10-17T00:00:00", - "2022-10-18T00:00:00", - "2022-10-19T00:00:00", - "2022-10-20T00:00:00", - "2022-10-21T00:00:00", - "2022-10-24T00:00:00", - "2022-10-25T00:00:00", - "2022-10-26T00:00:00", - "2022-10-27T00:00:00", - "2022-10-28T00:00:00", - "2022-10-31T00:00:00", - "2022-11-01T00:00:00", - "2022-11-02T00:00:00", - "2022-11-03T00:00:00", - "2022-11-04T00:00:00", - "2022-11-07T00:00:00", - "2022-11-08T00:00:00", - "2022-11-09T00:00:00", - "2022-11-10T00:00:00", - "2022-11-11T00:00:00", - "2022-11-14T00:00:00", - "2022-11-15T00:00:00", - "2022-11-16T00:00:00", - "2022-11-17T00:00:00", - "2022-11-18T00:00:00", - "2022-11-21T00:00:00", - "2022-11-22T00:00:00", - "2022-11-23T00:00:00", - "2022-11-24T00:00:00", - "2022-11-25T00:00:00", - "2022-11-28T00:00:00", - "2022-11-29T00:00:00", - "2022-11-30T00:00:00", - "2022-12-01T00:00:00", - "2022-12-02T00:00:00", - "2022-12-05T00:00:00", - "2022-12-06T00:00:00", - "2022-12-07T00:00:00", - "2022-12-08T00:00:00", - "2022-12-09T00:00:00", - "2022-12-12T00:00:00", - "2022-12-13T00:00:00", - "2022-12-14T00:00:00", - "2022-12-15T00:00:00", - "2022-12-16T00:00:00", - "2022-12-19T00:00:00", - "2022-12-20T00:00:00", - "2022-12-21T00:00:00", - "2022-12-22T00:00:00", - "2022-12-23T00:00:00", - "2022-12-26T00:00:00", - "2022-12-27T00:00:00", - "2022-12-28T00:00:00", - "2022-12-29T00:00:00", - "2022-12-30T00:00:00", - "2023-01-02T00:00:00", - "2023-01-03T00:00:00" - ], - "xaxis": "x", - "y": [ - 1.000000050580879, - 1.163223739338693, - 1.0837448211532241, - 1.143175155577643, - 1.1297457151886368, - 1.1425576216845406, - 1.0061108175031654, - 1.076191946035759, - 1.076191946035759, - 1.0977159489488773, - 1.041317936553909, - 1.0346813689890308, - 1.0792924274077678, - 0.9433324756732369, - 0.9678975127122229, - 1.104856793153434, - 1.0467445476693138, - 1.0923549347947312, - 1.0525970265566427, - 1.1310058943115737, - 1.1003603264496318, - 1.0384788180744164, - 1.0939543732016799, - 1.1089443038018874, - 1.0926731825520895, - 1.1631386682795601, - 1.1266247347662344, - 0.8614182703010265, - 0.8870420832928341, - 1.1801785039191122, - 1.2079803410152234, - 0.9913310021694907, - 0.9853094061164159, - 0.9850577802728364, - 1.0201624040716126, - 0.959818324475906, - 0.7190826014178743, - 1.0034392787606394, - 1.0236820910241673, - 1.0176604949710926, - 1.0131763276975263, - 1.0361096403251941, - 1.0008768974614588, - 0.9992113496169912, - 1.0106139463983455, - 1.0149699946069528, - 0.9830683474321524, - 0.9834527046270296, - 0.9607756301292799, - 0.9836223342690354, - 0.9815724292296908, - 0.9902845256469054, - 0.9221205708023588, - 0.8610077768168979, - 0.8921058612162751, - 0.9530905361367771, - 1.0056193527699824, - 1.1221456922552666, - 1.484210169829507, - 1.3941424671633036, - 1.1670094014701027, - 1.102949868990584, - 0.7786805155792595, - 1.0530818290984476, - 0.9481523148969958, - 1.0278792715922256, - 1.1321681904688823, - 1.3299840267656364, - 0.7622884499321405, - 1.0119310103861245, - 1.007272088707954, - 0.983132406964632, - 0.983132406964632, - 0.9877446933031573, - 0.9938944084211911, - 0.9956880753306177, - 0.9767264537166801, - 0.9813387400552055, - 0.9800575494056151, - 0.9613521659215956, - 0.9605834515318413, - 0.980492641750216, - 0.977161546061281, - 0.977161546061281, - 0.9756241172817727, - 0.9758803554116907, - 0.9722930215928376, - 0.9710118309432473, - 0.969986878423575, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9691848530769314, - 0.9660607977969702, - 0.9634984164977894, - 0.9673419884465606, - 0.958373653899428, - 0.9518180575836038, - 0.9415685323868808, - 0.9351625791389289, - 0.9691141313530739, - 0.9473338903100375, - 0.9396467464124952, - 0.9748794892762306, - 0.9857696097977487, - 0.9902537770713151, - 0.986410205122544, - 0.9806448471993873, - 0.9723171079770498, - 0.9569428201819653, - 0.9582240108315556, - 0.9614269874555316, - 0.9005704315999887, - 0.9268348399165914, - 0.9274754352413866, - 0.9172259100446636, - 0.919248653842237, - 0.9141238912438755, - 0.9141238912438755, - 0.9102803192951043, - 0.9150955462325248, - 0.9150955462325248, - 0.9150955462325248, - 0.9150955462325248, - 0.9150955462325248, - 0.9122441283227964, - 0.9030528666026352, - 0.9030528666026352, - 0.9030528666026352, - 0.9030528666026352, - 0.9030528666026352, - 0.9030528666026352, - 0.9030528666026352, - 0.9030528666026352, - 0.9030528666026352, - 0.9030528666026352, - 0.9030528666026352, - 0.9030528666026352, - 0.9030528666026352, - 0.9030528666026352, - 0.9030528666026352, - 0.9030528666026352, - 0.9030528666026352, - 0.9030528666026352, - 0.9030528666026352, - 0.9030528666026352, - 0.9030528666026352, - 0.9030528666026352, - 0.9030528666026352, - 0.9030528666026352, - 0.9030528666026352, - 0.9030528666026352, - 0.9030528666026352, - 0.9030528666026352, - 0.9030528666026352, - 0.9030528666026352, - 0.8975191479489244, - 0.9136621501337632, - 0.9021314342874498, - 0.8986722195335558, - 0.8744577162562976, - 0.8709985015024037, - 0.8888147386756073, - 0.8888147386756073, - 0.8888147386756073, - 0.8888147386756073, - 0.8888147386756073, - 0.8888147386756073, - 0.8803599053408305, - 0.9021401463838669, - 0.8994496460197271, - 0.8911219067973897, - 0.8726727614432882, - 0.8744664283527148, - 0.8720321661184931, - 0.8679959030960236, - 0.8679959030960236, - 0.8869575247099611, - 0.8736664529111106, - 0.8766131914051684, - 0.8989059087080409, - 0.8813535968086528, - 0.8944217414344746, - 0.8781183341803073, - 0.8783745723102253, - 0.8793995248298977, - 0.880680715479488, - 0.9074576000559269, - 0.8751715956862495, - 0.8888803356368664, - 0.8783745723102253, - 0.8604174041655666, - 0.8519615458782701, - 0.8774367407547251, - 0.8834583368077998, - 0.8969108386284987, - 0.8729525734811587, - 0.8893518137959155, - 0.8893518137959155, - 0.8719276209614865, - 0.8774367407547251, - 0.8697495968571828, - 0.890761123510465, - 0.890761123510465, - 0.8875837706994808 - ], - "yaxis": "y" - }, - { - "name": "Benchmark", - "showlegend": true, - "type": "scatter", - "x": [ - "2022-01-05T00:00:00", - "2022-01-06T00:00:00", - "2022-01-07T00:00:00", - "2022-01-10T00:00:00", - "2022-01-11T00:00:00", - "2022-01-12T00:00:00", - "2022-01-13T00:00:00", - "2022-01-14T00:00:00", - "2022-01-17T00:00:00", - "2022-01-18T00:00:00", - "2022-01-19T00:00:00", - "2022-01-20T00:00:00", - "2022-01-21T00:00:00", - "2022-01-24T00:00:00", - "2022-01-25T00:00:00", - "2022-01-26T00:00:00", - "2022-01-27T00:00:00", - "2022-01-28T00:00:00", - "2022-01-31T00:00:00", - "2022-02-01T00:00:00", - "2022-02-02T00:00:00", - "2022-02-03T00:00:00", - "2022-02-04T00:00:00", - "2022-02-07T00:00:00", - "2022-02-08T00:00:00", - "2022-02-09T00:00:00", - "2022-02-10T00:00:00", - "2022-02-11T00:00:00", - "2022-02-14T00:00:00", - "2022-02-15T00:00:00", - "2022-02-16T00:00:00", - "2022-02-17T00:00:00", - "2022-02-18T00:00:00", - "2022-02-21T00:00:00", - "2022-02-22T00:00:00", - "2022-02-23T00:00:00", - "2022-02-24T00:00:00", - "2022-02-25T00:00:00", - "2022-02-28T00:00:00", - "2022-03-01T00:00:00", - "2022-03-02T00:00:00", - "2022-03-03T00:00:00", - "2022-03-04T00:00:00", - "2022-03-07T00:00:00", - "2022-03-08T00:00:00", - "2022-03-09T00:00:00", - "2022-03-10T00:00:00", - "2022-03-11T00:00:00", - "2022-03-14T00:00:00", - "2022-03-15T00:00:00", - "2022-03-16T00:00:00", - "2022-03-17T00:00:00", - "2022-03-18T00:00:00", - "2022-03-21T00:00:00", - "2022-03-22T00:00:00", - "2022-03-23T00:00:00", - "2022-03-24T00:00:00", - "2022-03-25T00:00:00", - "2022-03-28T00:00:00", - "2022-03-29T00:00:00", - "2022-03-30T00:00:00", - "2022-03-31T00:00:00", - "2022-04-01T00:00:00", - "2022-04-04T00:00:00", - "2022-04-05T00:00:00", - "2022-04-06T00:00:00", - "2022-04-07T00:00:00", - "2022-04-08T00:00:00", - "2022-04-11T00:00:00", - "2022-04-12T00:00:00", - "2022-04-13T00:00:00", - "2022-04-14T00:00:00", - "2022-04-15T00:00:00", - "2022-04-18T00:00:00", - "2022-04-19T00:00:00", - "2022-04-20T00:00:00", - "2022-04-21T00:00:00", - "2022-04-22T00:00:00", - "2022-04-25T00:00:00", - "2022-04-26T00:00:00", - "2022-04-27T00:00:00", - "2022-04-28T00:00:00", - "2022-04-29T00:00:00", - "2022-05-02T00:00:00", - "2022-05-03T00:00:00", - "2022-05-04T00:00:00", - "2022-05-05T00:00:00", - "2022-05-06T00:00:00", - "2022-05-09T00:00:00", - "2022-05-10T00:00:00", - "2022-05-11T00:00:00", - "2022-05-12T00:00:00", - "2022-05-13T00:00:00", - "2022-05-16T00:00:00", - "2022-05-17T00:00:00", - "2022-05-18T00:00:00", - "2022-05-19T00:00:00", - "2022-05-20T00:00:00", - "2022-05-23T00:00:00", - "2022-05-24T00:00:00", - "2022-05-25T00:00:00", - "2022-05-26T00:00:00", - "2022-05-27T00:00:00", - "2022-05-30T00:00:00", - "2022-05-31T00:00:00", - "2022-06-01T00:00:00", - "2022-06-02T00:00:00", - "2022-06-03T00:00:00", - "2022-06-06T00:00:00", - "2022-06-07T00:00:00", - "2022-06-08T00:00:00", - "2022-06-09T00:00:00", - "2022-06-10T00:00:00", - "2022-06-13T00:00:00", - "2022-06-14T00:00:00", - "2022-06-15T00:00:00", - "2022-06-16T00:00:00", - "2022-06-17T00:00:00", - "2022-06-20T00:00:00", - "2022-06-21T00:00:00", - "2022-06-22T00:00:00", - "2022-06-23T00:00:00", - "2022-06-24T00:00:00", - "2022-06-27T00:00:00", - "2022-06-28T00:00:00", - "2022-06-29T00:00:00", - "2022-06-30T00:00:00", - "2022-07-01T00:00:00", - "2022-07-04T00:00:00", - "2022-07-05T00:00:00", - "2022-07-06T00:00:00", - "2022-07-07T00:00:00", - "2022-07-08T00:00:00", - "2022-07-11T00:00:00", - "2022-07-12T00:00:00", - "2022-07-13T00:00:00", - "2022-07-14T00:00:00", - "2022-07-15T00:00:00", - "2022-07-18T00:00:00", - "2022-07-19T00:00:00", - "2022-07-20T00:00:00", - "2022-07-21T00:00:00", - "2022-07-22T00:00:00", - "2022-07-25T00:00:00", - "2022-07-26T00:00:00", - "2022-07-27T00:00:00", - "2022-07-28T00:00:00", - "2022-07-29T00:00:00", - "2022-08-01T00:00:00", - "2022-08-02T00:00:00", - "2022-08-03T00:00:00", - "2022-08-04T00:00:00", - "2022-08-05T00:00:00", - "2022-08-08T00:00:00", - "2022-08-09T00:00:00", - "2022-08-10T00:00:00", - "2022-08-11T00:00:00", - "2022-08-12T00:00:00", - "2022-08-15T00:00:00", - "2022-08-16T00:00:00", - "2022-08-17T00:00:00", - "2022-08-18T00:00:00", - "2022-08-19T00:00:00", - "2022-08-22T00:00:00", - "2022-08-23T00:00:00", - "2022-08-24T00:00:00", - "2022-08-25T00:00:00", - "2022-08-26T00:00:00", - "2022-08-29T00:00:00", - "2022-08-30T00:00:00", - "2022-08-31T00:00:00", - "2022-09-01T00:00:00", - "2022-09-02T00:00:00", - "2022-09-05T00:00:00", - "2022-09-06T00:00:00", - "2022-09-07T00:00:00", - "2022-09-08T00:00:00", - "2022-09-09T00:00:00", - "2022-09-12T00:00:00", - "2022-09-13T00:00:00", - "2022-09-14T00:00:00", - "2022-09-15T00:00:00", - "2022-09-16T00:00:00", - "2022-09-19T00:00:00", - "2022-09-20T00:00:00", - "2022-09-21T00:00:00", - "2022-09-22T00:00:00", - "2022-09-23T00:00:00", - "2022-09-26T00:00:00", - "2022-09-27T00:00:00", - "2022-09-28T00:00:00", - "2022-09-29T00:00:00", - "2022-09-30T00:00:00", - "2022-10-03T00:00:00", - "2022-10-04T00:00:00", - "2022-10-05T00:00:00", - "2022-10-06T00:00:00", - "2022-10-07T00:00:00", - "2022-10-10T00:00:00", - "2022-10-11T00:00:00", - "2022-10-12T00:00:00", - "2022-10-13T00:00:00", - "2022-10-14T00:00:00", - "2022-10-17T00:00:00", - "2022-10-18T00:00:00", - "2022-10-19T00:00:00", - "2022-10-20T00:00:00", - "2022-10-21T00:00:00", - "2022-10-24T00:00:00", - "2022-10-25T00:00:00", - "2022-10-26T00:00:00", - "2022-10-27T00:00:00", - "2022-10-28T00:00:00", - "2022-10-31T00:00:00", - "2022-11-01T00:00:00", - "2022-11-02T00:00:00", - "2022-11-03T00:00:00", - "2022-11-04T00:00:00", - "2022-11-07T00:00:00", - "2022-11-08T00:00:00", - "2022-11-09T00:00:00", - "2022-11-10T00:00:00", - "2022-11-11T00:00:00", - "2022-11-14T00:00:00", - "2022-11-15T00:00:00", - "2022-11-16T00:00:00", - "2022-11-17T00:00:00", - "2022-11-18T00:00:00", - "2022-11-21T00:00:00", - "2022-11-22T00:00:00", - "2022-11-23T00:00:00", - "2022-11-24T00:00:00", - "2022-11-25T00:00:00", - "2022-11-28T00:00:00", - "2022-11-29T00:00:00", - "2022-11-30T00:00:00", - "2022-12-01T00:00:00", - "2022-12-02T00:00:00", - "2022-12-05T00:00:00", - "2022-12-06T00:00:00", - "2022-12-07T00:00:00", - "2022-12-08T00:00:00", - "2022-12-09T00:00:00", - "2022-12-12T00:00:00", - "2022-12-13T00:00:00", - "2022-12-14T00:00:00", - "2022-12-15T00:00:00", - "2022-12-16T00:00:00", - "2022-12-19T00:00:00", - "2022-12-20T00:00:00", - "2022-12-21T00:00:00", - "2022-12-22T00:00:00", - "2022-12-23T00:00:00", - "2022-12-26T00:00:00", - "2022-12-27T00:00:00", - "2022-12-28T00:00:00", - "2022-12-29T00:00:00", - "2022-12-30T00:00:00", - "2023-01-02T00:00:00", - "2023-01-03T00:00:00", - "2023-01-04T00:00:00" - ], - "xaxis": "x", - "y": [ - null, - 0.9990605866244945, - 0.9951107892714275, - 0.993872507179495, - 1.0029249649918985, - 1.0056364150974375, - 0.9917801655421244, - 0.992185824279529, - 0.992185824279529, - 0.9746145981372276, - 0.964494631048622, - 0.9538195382866007, - 0.9350954490380298, - 0.9390665522708158, - 0.9276015130693003, - 0.9252743506658511, - 0.9207053796890201, - 0.9435714752972983, - 0.9605662047308694, - 0.9670566793737451, - 0.9764507479732047, - 0.953499298534859, - 0.9579828505260272, - 0.9549084185981174, - 0.962765271233622, - 0.9768564067106091, - 0.9593065516036223, - 0.940390253348411, - 0.9373158214205012, - 0.9524317892586568, - 0.9534992985348589, - 0.9331312033013557, - 0.9270891294665136, - 0.9270891294665136, - 0.9171399351936383, - 0.9008711042492132, - 0.9144284199325039, - 0.9346043713149623, - 0.9322131609611648, - 0.9180153006187955, - 0.9349033051869846, - 0.9302489152244908, - 0.9226909964610085, - 0.8954908157975734, - 0.8887014724382707, - 0.9125282873017736, - 0.9084077171329763, - 0.8968572589457978, - 0.8903027363525738, - 0.9098808851465829, - 0.9300567713734459, - 0.9416926485462873, - 0.9490584234587246, - 0.9487809257776122, - 0.9598829831567571, - 0.9475212074947698, - 0.9618044868228017, - 0.9665015537003292, - 0.9733763160452948, - 0.9854177867999452, - 0.9793330360500695, - 0.9642598102825432, - 0.9669926314233968, - 0.9752764486760251, - 0.9629574150846669, - 0.9533284605635332, - 0.9581322523064427, - 0.9555702691369149, - 0.9392373902421414, - 0.9357572995768272, - 0.9464750692538821, - 0.934689790300625, - 0.934689790300625, - 0.9350740780027149, - 0.9501686748055559, - 0.949464082196129, - 0.9352662218537598, - 0.9096033223098751, - 0.9148768207405374, - 0.8883812326865292, - 0.8908791679057086, - 0.9133822816916162, - 0.8796276435905526, - 0.8849225130565295, - 0.8889790352749785, - 0.9160510548821214, - 0.8834920219579565, - 0.8782185235272942, - 0.8501003656792636, - 0.852064546260342, - 0.8385285364567705, - 0.8376531710316133, - 0.8576796554780605, - 0.8541995648127463, - 0.8717707909550477, - 0.836628338670445, - 0.8315043071757938, - 0.8318672889981645, - 0.8474315924887582, - 0.8409624888811972, - 0.8483923117439828, - 0.8653443642625201, - 0.8865878249211806, - 0.8865878249211806, - 0.8816131952069453, - 0.8744822410605865, - 0.8911354248626969, - 0.8765105347476088, - 0.879179307938114, - 0.8876125921267536, - 0.8779623317259008, - 0.8570818528896109, - 0.8322302056649395, - 0.8006319571515949, - 0.7982193757624828, - 0.809599061133931, - 0.7828045392079003, - 0.7811178563079342, - 0.7811178563079342, - 0.8007814240876061, - 0.7993296271093141, - 0.8071651087095043, - 0.832828008253389, - 0.8296468514600972, - 0.8126947989415597, - 0.8120329484027621, - 0.8054357488945044, - 0.8139544520688068, - 0.8139544520688068, - 0.8154916680327616, - 0.8182458602089299, - 0.8305008458499398, - 0.829817689431423, - 0.8203382018463005, - 0.8130790866436496, - 0.8088090495388411, - 0.8068448689577626, - 0.8222597055123451, - 0.8154703621530424, - 0.8375037040956016, - 0.8428412504766122, - 0.8514240667568584, - 0.8435244720507246, - 0.844549304411893, - 0.834557433223984, - 0.856227858499768, - 0.8669669992121376, - 0.8796062725552374, - 0.8770015473150804, - 0.8712156652816315, - 0.8848584651061805, - 0.884260662517731, - 0.8827661234688099, - 0.8817412911076414, - 0.8782398945626082, - 0.8966864209744714, - 0.8966864209744714, - 0.9118664367629753, - 0.9156240251094019, - 0.9174174980303456, - 0.9109056523521554, - 0.9135531196629415, - 0.9012767629866171, - 0.882509931667417, - 0.8803749131150127, - 0.8831931532415291, - 0.8956616537688986, - 0.86534436426252, - 0.8596225301794195, - 0.8501857195093306, - 0.8437166159017696, - 0.8463640832125557, - 0.8374396561452534, - 0.8374396561452534, - 0.8342798703872762, - 0.8492676771691398, - 0.85481873843651, - 0.8680985564386883, - 0.8774285770877995, - 0.8392758059812309, - 0.8424783338098373, - 0.8329134272390518, - 0.8231777478525361, - 0.8295614324744343, - 0.820039267974278, - 0.8057346827665267, - 0.7989666452869433, - 0.785580102419383, - 0.7778086036139457, - 0.7758230519975526, - 0.7910884216161239, - 0.7745633988703056, - 0.7625859109104081, - 0.7827191202222372, - 0.8069729648584592, - 0.8050941381074481, - 0.7967889498195052, - 0.7745633988703055, - 0.7686493557805645, - 0.7637815160873066, - 0.7612622098328125, - 0.7813527422296079, - 0.7635466953212279, - 0.7831675210302707, - 0.7923694457786854, - 0.7867543365609669, - 0.7801571370527092, - 0.7991161122229542, - 0.8088944685245036, - 0.8218113698599067, - 0.8156197639334579, - 0.811264372998582, - 0.8305648938002878, - 0.8245654968804794, - 0.8209573103144685, - 0.8003543943148865, - 0.7921132539772919, - 0.803514245228459, - 0.8112003250482335, - 0.8155770870184241, - 0.798774501435898, - 0.8426704776608818, - 0.850826264168409, - 0.8435885200010728, - 0.8507835220977799, - 0.8442931126104997, - 0.8417096932500617, - 0.845531394702432, - 0.8424569627745222, - 0.8537939060753411, - 0.8591741945269811, - 0.8591741945269811, - 0.8589819855203407, - 0.8452752029010389, - 0.8438234059227468, - 0.8704043478068224, - 0.8697638683033393, - 0.8687604069774855, - 0.8531320555365434, - 0.8408343278249043, - 0.8394039018819269, - 0.8459797303548701, - 0.8396600936833203, - 0.8517656775439145, - 0.858213410116161, - 0.8527263967991392, - 0.831867288998164, - 0.8182885371239633, - 0.8113497268286495, - 0.8124599781754809, - 0.8246082389511087, - 0.8128442658775707, - 0.8175199617197837, - 0.8175199617197837, - 0.8142960628558626, - 0.8041760957672571, - 0.818651518946334, - 0.8164951293586152, - 0.8164951293586152, - 0.8130577807639302, - 0.8193347405204464 - ], - "yaxis": "y" - }, - { - "customdata": [ - 8, - 3, - 26, - 16, - 7, - 48, - 101, - 13, - 2, - 5, - 5, - 15, - 12, - 9, - 8, - 7, - 7, - 33 - ], - "hovertemplate": "%{text}

Date: %{x}
Size: %{customdata}
PnL: %{y}
", - "marker": { - "color": [ - "green", - "red", - "red", - "red", - "green", - "green", - "red", - "green", - "red", - "green", - "red", - "red", - "red", - "red", - "green", - "red", - "red", - "green" - ] - }, - "mode": "markers", - "name": "Ticker", - "showlegend": false, - "text": [ - "NFLX", - "TSLA", - "AMD", - "AAPL", - "COST", - "NVDA", - "NVDA", - "AAPL", - "AMZN", - "TSLA", - "COST", - "AAPL", - "AAPL", - "NFLX", - "BA", - "NFLX", - "COST", - "NVDA" - ], - "type": "scatter", - "x": [ - "2022-01-05T00:00:00", - "2022-01-05T00:00:00", - "2022-01-05T00:00:00", - "2022-01-05T00:00:00", - "2022-01-05T00:00:00", - "2022-01-25T00:00:00", - "2022-02-02T00:00:00", - "2022-03-18T00:00:00", - "2022-03-30T00:00:00", - "2022-04-06T00:00:00", - "2022-08-01T00:00:00", - "2022-08-05T00:00:00", - "2022-09-14T00:00:00", - "2022-10-27T00:00:00", - "2022-11-14T00:00:00", - "2022-11-14T00:00:00", - "2022-11-23T00:00:00", - "2022-12-15T00:00:00" - ], - "xaxis": "x2", - "y": [ - 0.4362864644957602, - -0.3134592897664055, - -0.7214998922796765, - -0.3820364116130732, - 0.9880773843957119, - 0.1819857042686925, - -0.3637507233353039, - 0.17186983743522039, - -0.038292752899032625, - 0.07563414591886745, - -0.3788384215551487, - -0.30962707440818227, - -0.21495594078956917, - -0.15801221293441267, - 0.21146349216418947, - -0.10867481001325272, - -0.3460858413131771, - 0.036557501904030135 - ], - "yaxis": "y2" - }, - { - "fill": "tozeroy", - "line": { - "color": "red" - }, - "name": "Drawdown", - "showlegend": false, - "type": "scatter", - "x": [ - "2022-01-05T00:00:00", - "2022-01-06T00:00:00", - "2022-01-07T00:00:00", - "2022-01-10T00:00:00", - "2022-01-11T00:00:00", - "2022-01-12T00:00:00", - "2022-01-13T00:00:00", - "2022-01-14T00:00:00", - "2022-01-17T00:00:00", - "2022-01-18T00:00:00", - "2022-01-19T00:00:00", - "2022-01-20T00:00:00", - "2022-01-21T00:00:00", - "2022-01-24T00:00:00", - "2022-01-25T00:00:00", - "2022-01-26T00:00:00", - "2022-01-27T00:00:00", - "2022-01-28T00:00:00", - "2022-01-31T00:00:00", - "2022-02-01T00:00:00", - "2022-02-02T00:00:00", - "2022-02-03T00:00:00", - "2022-02-04T00:00:00", - "2022-02-07T00:00:00", - "2022-02-08T00:00:00", - "2022-02-09T00:00:00", - "2022-02-10T00:00:00", - "2022-02-11T00:00:00", - "2022-02-14T00:00:00", - "2022-02-15T00:00:00", - "2022-02-16T00:00:00", - "2022-02-17T00:00:00", - "2022-02-18T00:00:00", - "2022-02-21T00:00:00", - "2022-02-22T00:00:00", - "2022-02-23T00:00:00", - "2022-02-24T00:00:00", - "2022-02-25T00:00:00", - "2022-02-28T00:00:00", - "2022-03-01T00:00:00", - "2022-03-02T00:00:00", - "2022-03-03T00:00:00", - "2022-03-04T00:00:00", - "2022-03-07T00:00:00", - "2022-03-08T00:00:00", - "2022-03-09T00:00:00", - "2022-03-10T00:00:00", - "2022-03-11T00:00:00", - "2022-03-14T00:00:00", - "2022-03-15T00:00:00", - "2022-03-16T00:00:00", - "2022-03-17T00:00:00", - "2022-03-18T00:00:00", - "2022-03-21T00:00:00", - "2022-03-22T00:00:00", - "2022-03-23T00:00:00", - "2022-03-24T00:00:00", - "2022-03-25T00:00:00", - "2022-03-28T00:00:00", - "2022-03-29T00:00:00", - "2022-03-30T00:00:00", - "2022-03-31T00:00:00", - "2022-04-01T00:00:00", - "2022-04-04T00:00:00", - "2022-04-05T00:00:00", - "2022-04-06T00:00:00", - "2022-04-07T00:00:00", - "2022-04-08T00:00:00", - "2022-04-11T00:00:00", - "2022-04-12T00:00:00", - "2022-04-13T00:00:00", - "2022-04-14T00:00:00", - "2022-04-15T00:00:00", - "2022-04-18T00:00:00", - "2022-04-19T00:00:00", - "2022-04-20T00:00:00", - "2022-04-21T00:00:00", - "2022-04-22T00:00:00", - "2022-04-25T00:00:00", - "2022-04-26T00:00:00", - "2022-04-27T00:00:00", - "2022-04-28T00:00:00", - "2022-04-29T00:00:00", - "2022-05-02T00:00:00", - "2022-05-03T00:00:00", - "2022-05-04T00:00:00", - "2022-05-05T00:00:00", - "2022-05-06T00:00:00", - "2022-05-09T00:00:00", - "2022-05-10T00:00:00", - "2022-05-11T00:00:00", - "2022-05-12T00:00:00", - "2022-05-13T00:00:00", - "2022-05-16T00:00:00", - "2022-05-17T00:00:00", - "2022-05-18T00:00:00", - "2022-05-19T00:00:00", - "2022-05-20T00:00:00", - "2022-05-23T00:00:00", - "2022-05-24T00:00:00", - "2022-05-25T00:00:00", - "2022-05-26T00:00:00", - "2022-05-27T00:00:00", - "2022-05-30T00:00:00", - "2022-05-31T00:00:00", - "2022-06-01T00:00:00", - "2022-06-02T00:00:00", - "2022-06-03T00:00:00", - "2022-06-06T00:00:00", - "2022-06-07T00:00:00", - "2022-06-08T00:00:00", - "2022-06-09T00:00:00", - "2022-06-10T00:00:00", - "2022-06-13T00:00:00", - "2022-06-14T00:00:00", - "2022-06-15T00:00:00", - "2022-06-16T00:00:00", - "2022-06-17T00:00:00", - "2022-06-20T00:00:00", - "2022-06-21T00:00:00", - "2022-06-22T00:00:00", - "2022-06-23T00:00:00", - "2022-06-24T00:00:00", - "2022-06-27T00:00:00", - "2022-06-28T00:00:00", - "2022-06-29T00:00:00", - "2022-06-30T00:00:00", - "2022-07-01T00:00:00", - "2022-07-04T00:00:00", - "2022-07-05T00:00:00", - "2022-07-06T00:00:00", - "2022-07-07T00:00:00", - "2022-07-08T00:00:00", - "2022-07-11T00:00:00", - "2022-07-12T00:00:00", - "2022-07-13T00:00:00", - "2022-07-14T00:00:00", - "2022-07-15T00:00:00", - "2022-07-18T00:00:00", - "2022-07-19T00:00:00", - "2022-07-20T00:00:00", - "2022-07-21T00:00:00", - "2022-07-22T00:00:00", - "2022-07-25T00:00:00", - "2022-07-26T00:00:00", - "2022-07-27T00:00:00", - "2022-07-28T00:00:00", - "2022-07-29T00:00:00", - "2022-08-01T00:00:00", - "2022-08-02T00:00:00", - "2022-08-03T00:00:00", - "2022-08-04T00:00:00", - "2022-08-05T00:00:00", - "2022-08-08T00:00:00", - "2022-08-09T00:00:00", - "2022-08-10T00:00:00", - "2022-08-11T00:00:00", - "2022-08-12T00:00:00", - "2022-08-15T00:00:00", - "2022-08-16T00:00:00", - "2022-08-17T00:00:00", - "2022-08-18T00:00:00", - "2022-08-19T00:00:00", - "2022-08-22T00:00:00", - "2022-08-23T00:00:00", - "2022-08-24T00:00:00", - "2022-08-25T00:00:00", - "2022-08-26T00:00:00", - "2022-08-29T00:00:00", - "2022-08-30T00:00:00", - "2022-08-31T00:00:00", - "2022-09-01T00:00:00", - "2022-09-02T00:00:00", - "2022-09-05T00:00:00", - "2022-09-06T00:00:00", - "2022-09-07T00:00:00", - "2022-09-08T00:00:00", - "2022-09-09T00:00:00", - "2022-09-12T00:00:00", - "2022-09-13T00:00:00", - "2022-09-14T00:00:00", - "2022-09-15T00:00:00", - "2022-09-16T00:00:00", - "2022-09-19T00:00:00", - "2022-09-20T00:00:00", - "2022-09-21T00:00:00", - "2022-09-22T00:00:00", - "2022-09-23T00:00:00", - "2022-09-26T00:00:00", - "2022-09-27T00:00:00", - "2022-09-28T00:00:00", - "2022-09-29T00:00:00", - "2022-09-30T00:00:00", - "2022-10-03T00:00:00", - "2022-10-04T00:00:00", - "2022-10-05T00:00:00", - "2022-10-06T00:00:00", - "2022-10-07T00:00:00", - "2022-10-10T00:00:00", - "2022-10-11T00:00:00", - "2022-10-12T00:00:00", - "2022-10-13T00:00:00", - "2022-10-14T00:00:00", - "2022-10-17T00:00:00", - "2022-10-18T00:00:00", - "2022-10-19T00:00:00", - "2022-10-20T00:00:00", - "2022-10-21T00:00:00", - "2022-10-24T00:00:00", - "2022-10-25T00:00:00", - "2022-10-26T00:00:00", - "2022-10-27T00:00:00", - "2022-10-28T00:00:00", - "2022-10-31T00:00:00", - "2022-11-01T00:00:00", - "2022-11-02T00:00:00", - "2022-11-03T00:00:00", - "2022-11-04T00:00:00", - "2022-11-07T00:00:00", - "2022-11-08T00:00:00", - "2022-11-09T00:00:00", - "2022-11-10T00:00:00", - "2022-11-11T00:00:00", - "2022-11-14T00:00:00", - "2022-11-15T00:00:00", - "2022-11-16T00:00:00", - "2022-11-17T00:00:00", - "2022-11-18T00:00:00", - "2022-11-21T00:00:00", - "2022-11-22T00:00:00", - "2022-11-23T00:00:00", - "2022-11-24T00:00:00", - "2022-11-25T00:00:00", - "2022-11-28T00:00:00", - "2022-11-29T00:00:00", - "2022-11-30T00:00:00", - "2022-12-01T00:00:00", - "2022-12-02T00:00:00", - "2022-12-05T00:00:00", - "2022-12-06T00:00:00", - "2022-12-07T00:00:00", - "2022-12-08T00:00:00", - "2022-12-09T00:00:00", - "2022-12-12T00:00:00", - "2022-12-13T00:00:00", - "2022-12-14T00:00:00", - "2022-12-15T00:00:00", - "2022-12-16T00:00:00", - "2022-12-19T00:00:00", - "2022-12-20T00:00:00", - "2022-12-21T00:00:00", - "2022-12-22T00:00:00", - "2022-12-23T00:00:00", - "2022-12-26T00:00:00", - "2022-12-27T00:00:00", - "2022-12-28T00:00:00", - "2022-12-29T00:00:00", - "2022-12-30T00:00:00", - "2023-01-02T00:00:00", - "2023-01-03T00:00:00" - ], - "xaxis": "x3", - "y": [ - 0, - 0, - -0.06832660116644595, - -0.01723522903170005, - -0.02878052382249685, - -0.017766385596353018, - -0.13506695770478783, - -0.074819621607779, - -0.074819621607779, - -0.0563158693878576, - -0.10480010585934318, - -0.1105054294604858, - -0.07215420015705243, - -0.18903623501289357, - -0.16791809143959524, - -0.0501769538021164, - -0.10013477813014948, - -0.06092444604507652, - -0.09510362845912357, - -0.027697102515121808, - -0.05404224192080498, - -0.10724052955308083, - -0.05954931103387695, - -0.04666276930928792, - -0.06065072485649081, - -0.00007296461269878929, - -0.031463258557209106, - -0.25945591983839256, - -0.2374276433861039, - 0, - 0, - -0.1793483761687522, - -0.1843332216329342, - -0.18454184634900272, - -0.1554812578982403, - -0.20543577308184902, - -0.40472353110732817, - -0.1693248126747725, - -0.1525672470717785, - -0.15755209253596025, - -0.16126421149864878, - -0.14227937451804173, - -0.17144602351059446, - -0.17282481055387877, - -0.16338542233447084, - -0.1597793639135734, - -0.1861884388195576, - -0.18587025719418426, - -0.20464297309120916, - -0.18572996566365785, - -0.1874269343323154, - -0.1802148174905206, - -0.23664289188564303, - -0.2872337703199982, - -0.26148979095401925, - -0.2110049730614555, - -0.16752015092710482, - -0.0710566127455986, - 0, - -0.06068393616725121, - -0.21371678890209433, - -0.256877483188901, - -0.47535691766871757, - -0.29047656425149393, - -0.36117378149328383, - -0.307457020385273, - -0.23719141008635092, - -0.10391118612869144, - -0.4864012588983746, - -0.3182024040939795, - -0.32134139902527525, - -0.3376056373490012, - -0.3376056373490012, - -0.33449806736035115, - -0.3303546407088176, - -0.32914614126878705, - -0.34192170677768186, - -0.33881413678903183, - -0.3396773506747679, - -0.3522802734065156, - -0.3527982017379573, - -0.3393842537408297, - -0.34162860984374366, - -0.34162860984374366, - -0.34266446650662696, - -0.3424918237294797, - -0.3449088226095409, - -0.3457720364952771, - -0.34646260760386605, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.3470029300601979, - -0.34910757145358695, - -0.3508339992250594, - -0.348244357567851, - -0.3542868547680039, - -0.35870382643094423, - -0.36560953751683345, - -0.369925606945514, - -0.3470504389735064, - -0.3617250750310208, - -0.36690435834543755, - -0.34316597648769376, - -0.3358286584589365, - -0.33280740985886004, - -0.33539705151606847, - -0.3392815140018811, - -0.3448924042591661, - -0.35525097088799973, - -0.35438775700226366, - -0.35222972228792315, - -0.3932323818603898, - -0.37553649720279914, - -0.3751048902599309, - -0.38201060134582, - -0.38064771259928765, - -0.38410056814223226, - -0.38410056814223226, - -0.3866902097994407, - -0.3834459925784438, - -0.3834459925784438, - -0.3834459925784438, - -0.3834459925784438, - -0.3834459925784438, - -0.3853670956730244, - -0.39155991066548135, - -0.39155991066548135, - -0.39155991066548135, - -0.39155991066548135, - -0.39155991066548135, - -0.39155991066548135, - -0.39155991066548135, - -0.39155991066548135, - -0.39155991066548135, - -0.39155991066548135, - -0.39155991066548135, - -0.39155991066548135, - -0.39155991066548135, - -0.39155991066548135, - -0.39155991066548135, - -0.39155991066548135, - -0.39155991066548135, - -0.39155991066548135, - -0.39155991066548135, - -0.39155991066548135, - -0.39155991066548135, - -0.39155991066548135, - -0.39155991066548135, - -0.39155991066548135, - -0.39155991066548135, - -0.39155991066548135, - -0.39155991066548135, - -0.39155991066548135, - -0.39155991066548135, - -0.39155991066548135, - -0.39528838267780053, - -0.3844118877175251, - -0.3921808126891504, - -0.3945114901806379, - -0.4108262326210511, - -0.41315691011253863, - -0.4011529287569626, - -0.4011529287569626, - -0.4011529287569626, - -0.4011529287569626, - -0.4011529287569626, - -0.4011529287569626, - -0.406849380145203, - -0.3921747440876885, - -0.39398749324773463, - -0.3995983835050194, - -0.41202866345961986, - -0.41082016401958943, - -0.4124602704024881, - -0.41517976858218986, - -0.41517976858218986, - -0.40240420307329483, - -0.41135938127624383, - -0.409373989339051, - -0.394354067727242, - -0.4061800979618272, - -0.3973753163273185, - -0.4083598896388796, - -0.40818724686173236, - -0.40749667575314363, - -0.40663346186740723, - -0.3885922916555221, - -0.41034528157607264, - -0.4011088929986961, - -0.40818724686173236, - -0.4202860526842106, - -0.42598326433006917, - -0.40881911942609217, - -0.4047620141631324, - -0.3956982683629029, - -0.41184036802616864, - -0.40079123028874586, - -0.40079123028874586, - -0.41253093913475747, - -0.40881911942609206, - -0.4139984027405089, - -0.3998416950144361, - -0.3998416950144361, - -0.4019824654510621 - ], - "yaxis": "y3" - }, - { - "histnorm": "percent", - "marker": { - "color": "purple" - }, - "showlegend": false, - "type": "histogram", - "xaxis": "x4", - "y": [ - null, - -0.006969202350804671, - 0.002880974902816913, - 0.012103039226859513, - 0.0014643497058444144, - -0.21256468962161246, - 0.14382225109890934, - 0.01840017192830623, - -0.002553598407883495, - -0.017408924575687212, - -0.06236430389642322, - 0.21691850037143845, - -0.3060788463768501, - 0.7079970060588339, - -0.26079384945192696, - -0.001824441010026101, - -0.004256704825846835, - -0.0062934488246065845, - -0.0018814444407525555, - 0, - -0.017918757846532185, - -0.012787433096402623, - 0.043631392361769494, - -0.0816548484745474, - 0.015049935832364136, - 0.0010627961805615982, - -0.013160109235150541, - 0.011748113040635388, - -0.027195198713901636, - -0.018161121970726724, - 0.01636892785106725, - 0.008415197650048167, - 0.01457461818236272, - -0.06115554672313739, - 0.04388728146039478, - 0.0015846484936583582, - -0.0035670096020373743 - ], - "yaxis": "y4" - }, - { - "histnorm": "percent", - "marker": { - "color": "purple" - }, - "showlegend": false, - "type": "histogram", - "xaxis": "x5", - "y": [ - null, - -0.027469837236209105, - 0.07743380823136947, - -0.11404731351504227, - -0.008163052491054867, - 0, - -0.05361076319814018, - -0.015452221899691532, - -0.0010204817771758412, - -0.003575495942644835, - -0.009060784519101972, - -0.0035670096020373743 - ], - "yaxis": "y5" - } - ], - "layout": { - "annotations": [ - { - "font": { - "size": 16 - }, - "showarrow": false, - "text": "EQUITY CURVE", - "x": 0.5, - "xanchor": "center", - "xref": "paper", - "y": 0.9999999999999999, - "yanchor": "bottom", - "yref": "paper" - }, - { - "font": { - "size": 16 - }, - "showarrow": false, - "text": "TRADES", - "x": 0.5, - "xanchor": "center", - "xref": "paper", - "y": 0.5576923076923076, - "yanchor": "bottom", - "yref": "paper" - }, - { - "font": { - "size": 16 - }, - "showarrow": false, - "text": "PORTFOLIO DRAWDOWN", - "x": 0.5, - "xanchor": "center", - "xref": "paper", - "y": 0.3769230769230769, - "yanchor": "bottom", - "yref": "paper" - }, - { - "font": { - "size": 16 - }, - "showarrow": false, - "text": "WEEKLY PORTFOLIO RTRNS", - "x": 0.2375, - "xanchor": "center", - "xref": "paper", - "y": 0.13076923076923078, - "yanchor": "bottom", - "yref": "paper" - }, - { - "font": { - "size": 16 - }, - "showarrow": false, - "text": "MONTHLY PORTFOLIO RTRNS", - "x": 0.7625, - "xanchor": "center", - "xref": "paper", - "y": 0.13076923076923078, - "yanchor": "bottom", - "yref": "paper" - } - ], - "height": 1050, - "hovermode": "x unified", - "margin": { - "b": 20, - "l": 15, - "r": 15, - "t": 50 - }, - "paper_bgcolor": "WHITE", - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "heatmapgl": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmapgl" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "width": 1200, - "xaxis": { - "anchor": "y", - "domain": [ - 0, - 1 - ] - }, - "xaxis2": { - "anchor": "y2", - "domain": [ - 0, - 1 - ] - }, - "xaxis3": { - "anchor": "y3", - "domain": [ - 0, - 1 - ] - }, - "xaxis4": { - "anchor": "y4", - "domain": [ - 0, - 0.475 - ] - }, - "xaxis5": { - "anchor": "y5", - "domain": [ - 0.525, - 1 - ] - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0.6076923076923076, - 0.9999999999999999 - ] - }, - "yaxis2": { - "anchor": "x2", - "domain": [ - 0.42692307692307685, - 0.5576923076923076 - ] - }, - "yaxis3": { - "anchor": "x3", - "domain": [ - 0.1807692307692308, - 0.3769230769230769 - ] - }, - "yaxis4": { - "anchor": "x4", - "domain": [ - 0, - 0.13076923076923078 - ] - }, - "yaxis5": { - "anchor": "x5", - "domain": [ - 0, - 0.13076923076923078 - ] - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "pm.plot_portfolio()\n", - "# Check if the jump is real\n", - "# Why is NVDA trades saying None?" - ] - }, - { - "cell_type": "code", - "execution_count": 55, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Index(['TSLA', 'cash', 'commission', 'Total'], dtype='object')" - ] - }, - "execution_count": 55, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "equity.columns" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Weird looking equity curve: BA, AAPL, AMD, META, COST,\n", - "- NFLX: Gap up?\n", - "- AMZN: Gap up\n", - "- TSLA: Gap up\n", - "\n", - "\n", - "Answers:\n", - "- TSLA was a spike in data from 0.7 to 2.55. PCT Change flag for window days\n", - "- BA is correct\n", - "- AAPL is correct\n", - "- AMD is correct\n", - "- META is correct\n", - "- COST: When was special dividend? Handle this. Issue with multiple rolling (Rerun)\n", - "- NFLX: NFLX doesn't look correct (Rerun)\n", - "\n", - "\n", - "Problems V2:\n", - "- Picker picking options close to the money, which is getting close into the money relatively fast.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 56, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "TSLA 6.276487\n", - "Total 0.149094\n", - "cash 0.000000\n", - "commission 44.000000\n", - "dtype: float64" - ] - }, - "execution_count": 56, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "((equity.iloc[-1]/equity.iloc[0])-1).sort_index(ascending=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 57, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array(['TSLA'], dtype=object)" - ] - }, - "execution_count": 57, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "trades.Ticker.unique()" - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'TSLA': {}}" - ] - }, - "execution_count": 58, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "cash = pd.DataFrame(pm.current_cash.values()).set_index('datetime')\n", - "cash\n", - "pm.current_positions " - ] - }, - { - "cell_type": "code", - "execution_count": 67, - "metadata": {}, - "outputs": [], - "source": [ - "diff_value = pd.Series()\n", - "for index, row in trades.iterrows():\n", - " id = row.TradeID\n", - " start = row.EntryTime\n", - " end = row.ExitTime\n", - " tick = row.Ticker\n", - " if pd.isna(end):\n", - " end = rm.pm_end_date\n", - " my_slice = slice(start, end)\n", - " if id not in rm.position_data:\n", - " continue\n", - " if rm.position_data[id].empty:\n", - " continue\n", - " if 'Midpoint' not in rm.position_data[id].columns:\n", - " continue\n", - "\n", - " tick_cash = cash[tick][my_slice].copy()[:-1]\n", - " m_data = rm.position_data[id][rm.option_price][my_slice].copy()[:-1]\n", - " eq = equity[tick][my_slice].copy()[:-1] - tick_cash\n", - " \n", - " m_data_normalized =(m_data.pct_change() + 1).cumprod()\n", - " eq_normalized = (eq.pct_change() +1).cumprod()\n", - " diff_value[id] = (((eq_normalized / m_data_normalized) -1) * 100).abs().mean()\n", - " diff_value[id] = eq_normalized.corr(m_data_normalized)\n", - " if diff_value[id] < 0.99:\n", - " print(f\"{index} {id} {tick} {start} {end} {diff_value[id]}\")\n", - " # if index == 1 : break\n", - "\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": 68, - "metadata": {}, - "outputs": [], - "source": [ - "def get_normalized(index):\n", - " global rm, cash, equity, trades\n", - " row = trades.iloc[index]\n", - " id = row.TradeID\n", - " start = row.EntryTime\n", - " end = row.ExitTime\n", - " tick = row.Ticker\n", - " if pd.isna(end):\n", - " end = rm.pm_end_date\n", - " my_slice = slice(start, end)\n", - " if id not in rm.position_data:\n", - " return None\n", - " if rm.position_data[id].empty:\n", - " return None\n", - " if 'Midpoint' not in rm.position_data[id].columns:\n", - " return None\n", - "\n", - " tick_cash = cash[tick][my_slice].copy()[:-1]\n", - " m_data = rm.position_data[id][rm.option_price][my_slice].copy()[:-1]\n", - " eq = equity[tick][my_slice].copy()[:-1] - tick_cash\n", - " \n", - " m_data_normalized =(m_data.pct_change() + 1).cumprod()\n", - " eq_normalized = (eq.pct_change() +1).cumprod()\n", - " \n", - " return eq_normalized, m_data_normalized, id, tick, start, end\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 69, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "hovertemplate": "variable=Equity
datetime=%{x}
value=%{y}", - "legendgroup": "Equity", - "line": { - "color": "#636efa", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "Equity", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": [ - "2020-08-24T00:00:00", - "2020-08-25T00:00:00", - "2020-08-26T00:00:00", - "2020-08-27T00:00:00", - "2020-08-28T00:00:00", - "2020-08-31T00:00:00", - "2020-09-01T00:00:00" - ], - "xaxis": "x", - "y": [ - null, - 1.094674556213031, - 1.290034751573236, - 1.3854074453711307, - 1.2840236686390796, - 1.82650331754656, - 1.6527269256798145 - ], - "yaxis": "y" - }, - { - "hovertemplate": "variable=Midpoint
datetime=%{x}
value=%{y}", - "legendgroup": "Midpoint", - "line": { - "color": "#EF553B", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "Midpoint", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": [ - "2020-08-24T00:00:00", - "2020-08-25T00:00:00", - "2020-08-26T00:00:00", - "2020-08-27T00:00:00", - "2020-08-28T00:00:00", - "2020-08-31T00:00:00", - "2020-09-01T00:00:00" - ], - "xaxis": "x", - "y": [ - null, - 1.094674556213031, - 1.290034751573236, - 1.3854074453711314, - 1.2840236686390798, - 1.8265033175465601, - 1.652726925679815 - ], - "yaxis": "y" - } - ], - "layout": { - "height": 740, - "legend": { - "title": { - "text": "variable" - }, - "tracegroupgap": 0 - }, - "margin": { - "t": 60 - }, - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "heatmapgl": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmapgl" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "title": { - "text": "&L:TSLA20210716C1975&S:TSLA20210716C1980 TSLA 2020-08-24 00:00:00 2020-09-02 00:00:00" - }, - "width": 900, - "xaxis": { - "anchor": "y", - "domain": [ - 0, - 1 - ], - "title": { - "text": "datetime" - } - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0, - 1 - ], - "title": { - "text": "value" - } - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "e, f, id, tick, start, end = get_normalized(4)\n", - "data = pd.DataFrame()\n", - "data['Equity'] = e\n", - "data['Midpoint'] = f\n", - "px.line(data).update_layout(width=900, height=740, title=f\"{id} {tick} {start} {end}\").show()\n", - "\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
datetimeuidpricequantitysymbolcommissionmarket_valueslippagetotal_costaux_costdirectiontransaction_type
02021-11-17&L:META20220617C405&S:META20220617C410_META202...107.8899436META7.8615.024.539657647.33965732.339657BUYBUY
12021-11-22&L:META20220617C405&S:META20220617C410_META202...111.6306301META1.3115.0-2.069370111.6306303.369370SELLSELL
\n", - "
" - ], - "text/plain": [ - " datetime uid price \\\n", - "0 2021-11-17 &L:META20220617C405&S:META20220617C410_META202... 107.889943 \n", - "1 2021-11-22 &L:META20220617C405&S:META20220617C410_META202... 111.630630 \n", - "\n", - " quantity symbol commission market_value slippage total_cost \\\n", - "0 6 META 7.8 615.0 24.539657 647.339657 \n", - "1 1 META 1.3 115.0 -2.069370 111.630630 \n", - "\n", - " aux_cost direction transaction_type \n", - "0 32.339657 BUY BUY \n", - "1 3.369370 SELL SELL " - ] - }, - "execution_count": 50, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pm.trades_map['&L:META20220617C405&S:META20220617C410'].entries()" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
TradeIDSignalIDTickerEntryTimeExitTimeEntryPriceEntryCommissionEntrySlippageEntryQuantityEntryAuxilaryCostTotalEntryCostExitPriceExitCommissionExitSlippageExitQuantityExitAuxilaryCostTotalExitCostQuantityClosedQuantityClosedPnLTotalCommissionTotalSlippageTotalAuxilaryCostOpenQuantityUnrealizedPnLPnLReturnPctDuration
0&L:META20220121C345&S:META20220121C350META20210324LONGMETA2021-03-242021-10-26116.4591636.538.295815544.795815582.295815143.0795036.5-68.102487574.602487715.39751355133.10169813.0-29.806673-42.80667300.000000133.1016980.228581216.0
1&L:META20220617C405&S:META20220617C410META20211117LONGMETA2021-11-17NaT107.8899437.824.539657632.339657647.339657111.6306301.3-2.06937013.369370111.630630113.7406879.122.470287-31.5702875-539.449714-535.709027-0.827555NaN
\n", - "
" - ], - "text/plain": [ - " TradeID SignalID Ticker EntryTime \\\n", - "0 &L:META20220121C345&S:META20220121C350 META20210324LONG META 2021-03-24 \n", - "1 &L:META20220617C405&S:META20220617C410 META20211117LONG META 2021-11-17 \n", - "\n", - " ExitTime EntryPrice EntryCommission EntrySlippage EntryQuantity \\\n", - "0 2021-10-26 116.459163 6.5 38.295815 5 \n", - "1 NaT 107.889943 7.8 24.539657 6 \n", - "\n", - " EntryAuxilaryCost TotalEntryCost ExitPrice ExitCommission \\\n", - "0 44.795815 582.295815 143.079503 6.5 \n", - "1 32.339657 647.339657 111.630630 1.3 \n", - "\n", - " ExitSlippage ExitQuantity ExitAuxilaryCost TotalExitCost Quantity \\\n", - "0 -68.102487 5 74.602487 715.397513 5 \n", - "1 -2.069370 1 3.369370 111.630630 1 \n", - "\n", - " ClosedQuantity ClosedPnL TotalCommission TotalSlippage \\\n", - "0 5 133.101698 13.0 -29.806673 \n", - "1 1 3.740687 9.1 22.470287 \n", - "\n", - " TotalAuxilaryCost OpenQuantity UnrealizedPnL PnL ReturnPct \\\n", - "0 -42.806673 0 0.000000 133.101698 0.228581 \n", - "1 -31.570287 5 -539.449714 -535.709027 -0.827555 \n", - "\n", - " Duration \n", - "0 216.0 \n", - "1 NaN " - ] - }, - "execution_count": 51, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "tick = 'META'\n", - "\n", - "trades[trades.Ticker == tick]\n" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Start: 2021-11-17 00:00:00, End: NaT, id: &L:META20220617C405&S:META20220617C410\n" - ] - }, - { - "data": { - "image/png": "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ZiMiIgJ///03PD090aZNG01LnxBCa79t27bp3NbGxgaA7mnwFi1aQCaTITQ0VOd+hBBISUnRXLa1tS3SaXRDeOmllxAZGYmzZ8/qXJeWlobc3NxyqYOIqCjYQklEJunMmTO4e/culEolEhMTcfHiRZw/fx7u7u6YPHkyrK2tYW1tjbp162Lz5s3Izc2Fq6srzp07pzW4RS0gIAAAsGrVKrRu3RpWVlZo1qwZvLy8MHjwYKxcuRJxcXF48cUXYWtri4cPH+LEiROaeR/V93H48GEsX74cNWrUgK2tLZo3b14mx9+nTx+cPHkSs2fPRvv27REQEICsrCzExMTg6NGjWLhwoU7/TCIiY2GgJCKTtHbtWgCqQTHqtbxHjBihs5b3+PHjsWTJEuzatUvT73DKlCkYO3as1v3VrFkTr776Kv755x+cPXsWQggsWLAAtra26Nu3L6pWrYpt27Zh3bp1AAB3d3c0bNhQKzB27doV0dHRCAsLw7Zt2+Dh4VFmgdLGxgZfffUV1q9fj6NHj+LAgQOws7ODt7c3QkJCYG9vXyaPS0RUEpJ4/hwPEREREVExsA8lEREREZUKAyURERERlQoDJRERERGVCgMlEREREZUKAyURERERlQoDJRERERGVCgMlEREREZUKAyURERERlQoDJRERERGVCgMlEREREZUKAyURERERlQoDJRERERGVyv8DjVIU3CVp/50AAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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u+++q3O9o6Oj1sfo9OnT2LJlCwICAtCvX788+zwvNDQUCoUCkiRhxYoVmD17NuTyvF8fGzZswJtvvolq1aqhQ4cO8PLywv3797Fx40aMGzcOu3btwoYNG9Q/LlUK+/y/8cYbOHr0KJo0aYIBAwbAzs4Op0+fxtq1axEWFoZ169ZhwIAB6u0zMzPRvXt3WFhYoH379ujUqRNycnKwf/9+LFq0CGvXrsU///yDWrVqadzPw4cP0bp1a0RHRyMkJATDhg3D5cuXsWLFCuzYsQOHDx+Gn59fnsdh2rRp+Oqrr+Dp6Yk+ffrAxcUFCQkJOHHiBCIiItCjRw/1tunp6ernr2rVqnBzc8PNmzfz3Obz3n33Xa2dGEIIzJ8/H9nZ2ejevXue9du3b8eoUaOQmpqKmjVron///nB1dUVqaiqOHj2KGTNmYP78+YiJiYGbm1ue/bOzs/Hyyy9DJsu/v+j9999HamoqKleuDHd393w7iFQK+5muT0HeF2XJw8MDly5dgoODQ5nebx6ikAAIDw8P0bRpU+Hm5iaysrLybDNt2jQBQPTv318AECtWrNBYP3r0aK3LC8rb21sAENevX893u59++kkAEFOmTBEWFhaiYcOGRbq/M2fOCACiRo0aIj09XWPd7du389135syZAoCYOXNmke5bRfWY9evXTwAQ27dvz7PNxYsXNR73oKAgjfUHDhzQurygCnosycnJwtraWtSqVUsMHDhQABAnT57Uuu2ff/4pIiIitB6Lvb29ACCOHz+use769evC0tJSODk5abwGkpKSRI0aNQQAERUVpbHPF198ofW5mjdvngAg6tevr7H81q1bYsmSJSItLU1jeWZmpujZs6cAIN566608t9elSxcBQHz//fcay9977z0BQEyYMCHPPh9//LEAIKZPny5ycnLyrH/27JnG30lJSeKvv/4SDx8+FELkvjb27t2bZ199VO+R/v3751n322+/CQCicuXKWl9vQghx6NAhERAQoPP2X331VVG5cmX14zx9+vQ826SmpooqVaoICwsL8e+//6qXP3nyRLRq1UoAEH/88YfGPqrXcmHfV6r3xs8//6yxPDs7W9y7d0/nfr/++qsAIAICAkRKSkqe9enp6WL//v0FbofqvaR6Py9evDjPNklJScLKykrdZm9vb431169f17q8oFasWCEAiNGjR+e7XXZ2tvD09BT29vZi4sSJAoD4888/tW67b98+sXXr1jyv47t374rq1asLACIsLExjXVGe/++//15cvXo1z/2rXrPOzs4iMzNTvfzZs2di7ty5IikpSWP7nJwcMWHCBAFA9OrVK8/tvf766+rvkOctWrRIABBdu3bNs88vv/yiflyfb8PzbXleZmam2Llzp7hz544QIve1sXTp0jz76rN7924BQDRq1CjPuoiICCGXy4WVlZVYsWKFUCgUebY5e/as6NChg87v1lmzZgkLCwv18Y8cOVLrdrt27RJxcXFCiNzXmbb3vkpRPtPzu63ivC/KmurzW1+eKSlFDn0///yzACA2bdqksf7Zs2fC1dVVtG7dWkyfPt2goa9JkyZCJpOJ+Ph4dfg4cuRIoe/vwoULAoDo0aNHofct6dC3YcMGYW1tLfr27ZtnG1Ww2LFjh0FD3//+9z8BQMybN09s27ZNABBvvPFGoe9v/PjxAoD4+uuvNZZ/8sknAoD49NNP8+yzbNkyAUC88sorBbqP7OxsYW1tLQCIxMTEAu0TGRmpNSjGxMQIAMLHxyfPl96jR4+Era2tsLGx0QiSd+/eFRYWFqJly5YFum9tihP6GjduLACI3bt352mvk5OTACD27NmT7208ffpU6/LNmzcLAOLXX3/N94M/v+ds3759AoBo3769xvKihr7BgwcLAOLYsWOF2u/NN98UAMS3335bqP10Ub2XfvrpJ+Hp6SkCAwPzbKP6Yt25c6dBQ5/qPTx+/Hhx7tw5AUB069at0PenCv4v/lgqyvOfn1q1amn9sajL7du3BQBhZ2ensfzx48fC2tpa2NraikePHmmsy8nJUX8PXbt2Tb386dOnokqVKsLLy0tr4CuI4oS+AQMGqF9XL7a3du3aWn/wvCgnJydPMBVCiH///VfI5XIxZ84c9ftPV+h7XkFCX0l+phf1fXH16lUxaNAg4ejoKGxsbESrVq3E9u3b1e1/Ma/k912qLcip2vX8+w2A1n+qtrds2VJIkqQz63z99dcCgPjqq68KfJxFLuQYPnw4bG1t84w72Lp1Kx48eIDx48cX9aZLxKlTp3DixAl07NgR1atXV5/OzG98mS716tVD//79ER4ejoMHD5ZwSzU9P65OG0dHRwwePBg7duzAvXv31MszMzOxevVqBAUFwd/fv1TbqM/SpUshk8nwyiuvoFu3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CX369EFycjLCwsKwfv16AMCBAwfw999/4+bNm8jIyEDVqlXRvXt3dOnSRX07kyZNQkJCgsZt16tXD5999hkAID09HRs2bMDRo0eRmpoKZ2dndOzYEX369IFMJsODBw/w1ltv5WnfoEGDMGTIEKxfv16jTQAwZMgQdO3aFfXq1cP69evx4MED+Pj4YMKECfDy8sLevXuxdetWJCUloVatWpg4cSJcXV01bv/q1atYv349oqOjkZOTgxo1amD48OGoU6dOST3EREQ6saePiMpEfHw85s6dC3t7ewwePBg5OTlYv349HB0dNbYLDw9H9erV0bRpU5iZmeHEiRMIDQ2FQqFAt27dAACjR4/GihUrYGVlhf79+wOA+nYyMzPx2WefISkpCZ06dYKLiwuuXLmCP/74AykpKRgzZgzs7e0xbtw4hIaGonnz5mjevDkAwNvbO99juHz5Mo4fP46uXbsCADZv3owvvvgCffr0QXh4OLp27Yq0tDRs3boVP/74I2bOnKne9/z585g/fz78/PwwePBgSJKEiIgIzJ49G7Nnz0bNmjVL4mEmItKJoY+IysS6desghMDs2bPh4uICAGjRogWmTp2qsd2sWbNgYWGh/rtbt26YN28eduzYoQ59zZs3x7p161CpUiW0b99eY//t27fj3r17+PLLL1GtWjUAQOfOneHk5IStW7eiV69ecHFxQcuWLREaGgovL688t6HLnTt38O2336p78Ozs7PDLL79g48aNWLRoEaytrQEACoUCmzdvxoMHD+Dq6gohBJYuXYqXXnoJH3/8MSRJUrdrypQpWLt2LWbMmFHYh5SIqFBYyEFEpU6hUODMmTNo1qyZOvABgKenJwICAjS2fT7wZWRk4NGjR6hXrx7u37+PjIwMvfd15MgR1K1bF7a2tnj06JH6X4MGDaBQKHDp0qUiH0f9+vU1TtmqeudatGihDnwAUKtWLQDAgwcPAABxcXG4e/cu2rZti8ePH6vb9PTpU9SvXx+XLl2CQqEocruIiAqCPX1EVOoePXqEZ8+eqXvenufu7o5Tp06p/758+TI2bNiA6OhoZGZmamybkZEBGxubfO/r7t27uHHjBsaNG6d1fWpqahGOQOn5wApA3RZnZ2ety9PS0tRtAoAlS5bovO2MjAzY2dkVuW1ERPow9BGR0bh37x7mzJkDd3d3vPLKK3B2doZcLsepU6ewY8eOAvWGCSHQsGFD9OnTR+t6d3f3IrdPJtN+ckTX8ufbBACjRo2Cj4+P1m2srKyK3C4iooJg6COiUmdvbw8LCwt1j9fz7ty5o/7/iRMnkJWVhQ8//FCjV60wEyhXrVoVT58+RcOGDfPdTjWurixUrVoVgLIHUF+7iIhKC8f0EVGpk8lkCAgIwL///ovExET18lu3buHMmTMa2wG5PWOA8rSntkmYrayskJ6enmd5q1atEB0djdOnT+dZl56ejpycHACApaWl+vZLm5+fH6pWrYpt27bh6dOnedY/evSo1NtARMSePiIqE0OGDMHp06fx6aefokuXLlAoFNi1axeqV6+OGzduAAACAgIgl8uxYMECdOrUCU+fPsW+fftgb2+P5ORkjdvz9fXF3r178eeff8LNzQ0ODg6oX78++vTpg+PHj2PBggUICgqCn58fMjMzER8fjyNHjmDJkiXqnkdPT09ERUWhWrVqsLOzQ/Xq1eHl5VXixy6TyfDGG29g/vz5mDJlCoKDg+Hk5ISkpCRcuHAB1tbW+Oijj0r8fomInsfQR0RlwtvbG9OnT8fq1auxfv16ODs7Y8iQIUhOTlaHPnd3d0yZMgXr1q3Dr7/+CkdHR3Tp0gX29vb48ccfNW5v0KBBSExMxNatW/HkyRPUq1cP9evXh6WlJWbNmoWNGzfiyJEj+Pvvv2FtbQ13d3cMGTJEoxDkjTfewPLly7Fq1SpkZ2dj0KBBpRL6AOCll17CvHnzEBYWhj179uDp06dwdHREzZo10blz51K5TyKi5/GKHEREREQmgGP6iIiIiEwAQx8RERGRCWDoIyIiIjIBDH1EREREJoChj4iIiMgEMPQRERERmQCGPiIiIiITwNBHREREZAIY+oiIiIhMAEMfERERkQlg6CMiIiIyAQx9RERERCbg/wFci+2uPrBjowAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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OdNxOD5Ljs/zhAkTXNaJjY3Vfn5+zpgrVKiQZvnBgwfdPp9ZU6dO1YAePHhwhuulpKToiIgIXbx4cf3www9rQH/zzTdu1/3pp5/0d9995/I+PnHihC5XrpwG9Pz589Msy87f/8MPP9T79u1zOb7jPVuqVCmdlJTkfP7y5ct6zJgxOjY2Ns36qamp+oEHHtCA7tq1q8v+7r//fud3yJXGjx+vAX3LLbe4bPP5558783plDFfGcqWkpCS9dOlS/c8//2it/3tvTJo0yWXba1m+fLkGdIMGDVyWrVq1SttsNu3n56enTp2qTdN0WWfHjh26TZs26X63jho1Svv4+Dhf/4ABA9yut2zZMn3o0CGt9X/vM3effYfsnNPTM3r0aA3ojh07us1/bGysXrt2bab2lZMcf9eVK1dma/vrLto+++wzDeiFCxemWX758mUdEhKimzdvrkeMGGFp0daoUSNtGIY+cuSIs3hYv359lo+3c+dODeguXbpkeducLtrmzZun/f39dbdu3VzWcRQGS5YssbRo++ijjzSgX3/9db148WIN6AcffDDLx7vvvvs0oN955500z7/88ssa0K+88orLNlOmTNGAHjRoUKaOkZKSov39/TWgT58+nalt1q5d67bQ279/vwZ0xYoVXb60zp07p4sUKaIDAgLSFIInTpzQPj4+umnTppk6tjvXU7Q1bNhQA3r58uUu8QYFBWlAr1ixIsN9XLp0ye3z3377rQb0jBkzMjxxZ/Q3++mnnzSgW7Zsmeb57BZtd955pwb0xo0bs7TdQw89pAH9/vvvZ2m79Dg+S59++qmOiIjQkZGRLus4vhiXLl1qadHm+Azfd999+o8//tCA7tSpU5aP5yjcr/6xk52/f0aqVavm9sdeeo4fP64BXbRo0TTPnz9/Xvv7++siRYroc+fOpVmWmprq/B46cOCA8/lLly7p0qVL6/Lly7stGDLjeoq2nj17Ot9XV8dbo0YNtz9YrpaamupSWGqt9e+//65tNpsePXq08/OXXtF2pcwUbTl5Tu/cubPb2iQjVxZUX375pY6MjNR+fn66dOnSeujQofrEiRNut9u7d68eOHCgDg8P197e3josLEwPHDhQ7927N816jveKu3+Zdd0dEfr160eRIkVc7rt/9913nDp1ivvuu+96D3Fdtm7dyubNm2nXrh3lypVz3g7MqH1VemrXrk2PHj2IiorK9XvhV7YrcycwMJA777yTJUuWEB0d7Xw+KSmJ6dOn06pVK6pXr56rMV7LpEmTMAyDQYMG0alTJ0JDQ5k9ezYXL17M0n68vb0BXG7D/PzzzwB06tTJZRvHLQHHOteilHLu393t5qzEtXLlSgA6duzocvugWLFi3HTTTSQkJKRpozZ//nwuX75M3759SUxMZP78+bz11ltMnDiR7du3Zyqe7Nq8eTNbtmyhYsWKdOzYMc2y+fPnExsbS9OmTV2WXc3X19flOcc5oHv37um2e3HI6O/ZsmVLAgIC+O2330hKSnJZvn//fiZMmMAbb7zBF198wb59+zI81nPPPYe3tzevvvpqhrccr+a4pb13795MbwP/tT06dOiQ2+VeXl7cfffdbNu2jU2bNqVZNmnSJCpVqkT79u2zdMyc5jhnDhkyhDp16tCoUSOioqI4fPhwlvaTnc/ztf7+WTlOVtdfv349iYmJ3HTTTRQrVizNMsMwuOWWW4D/PvcAP/zwAzExMfTs2RPDMFiyZAljx45l/PjxrFu3LlPxZNfJkydZvHgxRYsWpX///mmWrV69mj179lC2bFnuueeeDPdjGIYzJw6JiYkMHDiQyMjIXGkOlJPn9Ox+VgHef/99HnzwQerXr88TTzxBjRo1mDp1Ks2bNycmJibNur///juNGzdm5syZ3HDDDQwfPpymTZsyc+ZMGjduzO+//+5c94knnnDejh08eDCvvvqq819mXVebNrB/CfXt25cvv/ySY8eOERERAdhPNMWLF6d3795u27td6dtvv033ZNa3b19q1qyZ7fg+++wzAIYOHQrgLB7mzp3L+++/T/HixTO9r4SEBLTWpKSkcOutt7Jo0SLatWuX7diu13333cf06dOZOnUqL7zwAgALFy7kzJkzmSqWHQ2T3alZsyZ9+/bNdmzr169nx44ddOzY0fmeGDBgAO+++y5z5sy55gnD4dy5c3zzzTcopVyKhj179gC4LU7DwsIoUqQIx44dIyEhgYCAgAyPM2/ePM6fP0/Tpk3dtily54svvgBcTzAZxQVQrVo1oqKi2Lt3r/P94/hgJyQkULNmTY4cOZJmmzvuuIPp06df83Vkh+PL2NFZ50pr1qwByPb7/L777sM0TT799NNrrptR3mw2G5UqVWLnzp38/fff1KpVK83yWbNmMWvWrDTP3XHHHUyaNImSJUu67O/06dP4+vqybNky7rzzTubMmeO26Lxaz549GTt2LJ9++innz5+nR48eNGrUiAoVKlxz22u5++67GTNmDJMmTaJx48aA/XP0559/MmbMmAx/xIG9Y0p6n+fQ0FAefPDBbMd2/Phxli5dSvXq1WnevDlgL942b97M5MmT023sfrWUlBSmT58OZO1zc62//9XWr1/Prl27KFu2LHXq1MlUbNfzeYa0xYHj8+zn50eDBg34888/02zTsmVL5s+fT+nSpTMVW1Z88cUXJCcnM2TIEJci0/F5bt26daZ/nF7p+eef5+DBg2zZsiXTxXBW5OQ5vU+fPsycOZOXX36ZQ4cOceutt9KwYUPCwsKuGceyZcvYsGEDDRo0cD735JNP8sEHH/D8888zZcoUwN52cNCgQZw7d46ZM2cyYMAA5/pz586lb9++DBw4kF27dmEYhrMN4urVqxkyZIjbNqbXlOlrclfh39ujWmu9fv16DehRo0ZprbU+dOiQNgxDP/TQQ1prfc3boxn9y+jS5rVuj164cEEXK1ZMlyhRQicmJjqff/rppzWgP/7440y/3tTUVN2xY0ft5eWlp02bpps2bap9fX1d2mVorXWHDh004GxrpHXWb4/+9ddf+q+//nJ5/upbYDVr1tSVK1d2tkto27atLlmypE5MTNT79u3L8PZoRv/c3XbNymu5++67NaBnz57tfM5xS6VJkyaZyoFpms7bWA8//LDLcm9vbw24bU+ptdbh4eEacLYRSc/ff/+tS5curW02W6bbSyxatEgrpXRERIRL+xjH7dz0bms42q698cYbzuc6deqkAe3l5aVbtmypt2zZoi9cuKDXr1+vGzdunKnbV9m5PXr+/HldrFgxbbPZ3F76d9xi+OSTTzK9TwfH7Yy5c+c6n8voFonjdpa7Nkpaa928eXOXNi1//vmnfuutt/Qff/yhz58/r2NiYvSyZct0gwYNNKBvuukml1vUK1eu1DabTd988816ypQp2svLS7dp08bl1pfj9vdjjz2W5vm5c+fq0NDQNJ+XoKAg3b17d/3dd9+5jX3//v36r7/+crnddPUtsE6dOulixYo5b53ffffd2svLSx8/flwnJydneHs0o38ZtTfMzO3R1157zeU9e+bMGe3j46PDw8N1SkpKutteyXHuddfEJDt/f3fOnDnj3NfXX3+dqbg2btyo/f39dbFixfT+/fvTLMuoHabW/7Vdu//++53PPfjgg87Pc926dfWvv/6qz58/r3fs2OFs73qt5inZuT1qmqauXLmyBtK0C3Rw3N5/7rnnMr1Phx9//FErpfTYsWOdz+X07dGcOqc7jB8/XpcoUSLNZyE0NFT3799fr1692mV9R87vvvtul2Vnz57VJUqU0H5+fs6mIGvWrNGAbtasmdvjt2jRQgNpjnW9bdpyZJy2G2+8kbp16/LFF19gmqazh1Fmb41OnToVbW9f5/Lv6t5MWTFnzhzOnz9P37598fPzcz7vuEU6adKkTO/riy++ICoqimeeeYZBgwaxYsUKIiMj6d27t8ut1n379lG5cmWCgoKyHXvNmjUzdYXxvvvu4++//+bnn39m//79rFy5koEDB6Z5velp1apVunn/9ttvsx37uXPnmDt3LoGBgfTo0cP5vOOWysaNG9mxY8c19/P0008zb948br75Zrc9R3PCqVOn6Ny5MzExMYwfPz5Nz9H0/Pbbb/Tv358iRYrwzTffuL2Sk1WOIRAcveUaNGhAkSJFuPHGG/nuu+8oWrQoM2bM4Pjx49d9rCt99dVXnD9/nttvv91tL7HsOnToEE888QR33nknvXv3zrH9Xu1///sfzz33HHXq1KFo0aIEBwfTqVMnVq1aRaVKlVi7di2LFy92rp+SksKQIUMoUqQI8+bN4+6772bGjBn88ssvtG7dOs2tD8ct1htuuCHNMXv37s2RI0dYsWIFL7/8Ml27dsU0Tb799ltuv/12Bg8ejNY6zTZVqlShZs2aLrebrnbfffc5e7s7Pke33nor4eHh18xFhQoV0v08b9u27Zrbp8c0TaZMmeJs6uAQFBTEbbfdxj///MOSJUuuuZ8PP/yQd999l5o1a6Y7rMz1unjxIt26dWPfvn08++yz3HnnndfcZu/evdx2220kJyczc+ZMqlSpct1xOD7PNpuN7777jhYtWlC0aFHq1q3LwoULiYiIYPXq1Tl+q/THH3/k77//pmHDhs6rtTnh7NmzDBkyhBtvvJGnn346x/ab24YNG8Y///zDt99+y7PPPkuHDh04f/48s2fPplWrVukOm+WuR2mJEiWIjIzk0qVL/PXXXwDOYWXatm3rdj+O57du3ZoTLwfIwcF177vvPg4fPsyyZcuYOnUqjRo1SnNp0QpXtsG4kqN42Lp1q0v7kfQ4br088MADABQvXpyoqCgaN27MAw884LwFvH37dg4dOpSrX1RXGjRoEL6+vkyePJnJkyejtba8HeGsWbO4ePEiffr0cSkeM9um8Nlnn+X999+nZcuWLF261O2tqxIlSgCkOz6Y43nHelc7deoUbdu2Zc+ePYwfP56HH344w5gA1q1bR+fOnTEMg+XLl9OkSZNsx3XlbVjH/7dr187lln1YWBg33ngjpmlm+v2aWY6/Q3pDsThuJWS1WLz77rvx9/fn448/zvQ22clbeooXL+5sz/PLL784n1+7di2HDx+me/fulClTBrC3y502bRrbtm3jpptucrbR+vbbb/H39+e2225z2b+3tzcdO3bktddeY/HixZw+fZq5c+dSpEgRpk+fzqJFizL9uq902223UaZMGSZPnuxs/2n153nFihUcPnyYDh06ULZs2TTLMvt5njBhAo8//ji1a9dm5cqVbn/QXu/f/+LFi9x6662sWbOGp556irFjx2YYE9gLtjZt2hAbG8ucOXPcDtVyPZ/nBg0auAyDFBAQ4GwHt3HjxmvGmBW59Xl+6qmnOHPmDF9++WW2bqtm1vWe090JCAigW7dujB07lqioKGJjY5kwYQJeXl6MHj3a7Q8ax7nhao4fto44HP9N75ar4/nrGRv2ajlWtA0cOBB/f38efPBBjh8/nu6bJq/s2LHD+YFo1qyZy4CDmzdvBjLfIeGff/4BSDMel6Nwu+GGGxgxYgRPPvkkr732Gn5+fgwbNiyHX5F7wcHB9OjRg4ULF/LFF1/QrFmzTLfhyC2OK5ifffaZS94fe+wxwF7YJSYmut3+ySef5O2336ZNmzYsW7aMokWLul2vRo0agPuGpidOnODixYtERES4bftw4sQJWrduza5du5g4cWKm/l6//vort9xyC0opoqKiuOmmm7IcF/x3BefKdhuObdL7QnJczUsvZ9nhaPReqVKldDsZOMY5++mnn7K07y1btnDq1ClKly6d5u/vaFv6+uuvO8dIc8gobykpKRw8eBCbzeZ2PCx3HO2Fruz44u5zDPb2ltOmTXOOrzd79mwWL17M/fffn6ki0cvLi969e/Pkk08CmW8sfTVvb2+GDh3K+vXref3114mIiHA7zlZecpwjV6xY4fJ5dhS0y5cvT3dMsQ8++IDHHnuMOnXqsHLlynSv6F7P3//8+fN07tyZ1atX8+yzz/Luu+9e83X99ddftG7dmtOnTzNv3jzuuOOOLMcF+efzfOrUKRYtWuS2A4KD4/O8atUqt4MVp2fLli0kJiZSs2bNNH//Nm3aAPbzuVIq3fFWM+t6zumZ5ePjwyOPPEK/fv0A95/V9Ma7dHT6cxSNjv9e2Rnw6pivXC8n5FhLwsDAQHr16sWMGTMoUqSIMyFWcZxoWrdune7l7tmzZ/PVV1/x3nvvpVsYOFSsWJG9e/eyatUqunbt6ny+RIkSREVF0aFDBz744AMAxo4dm6nGjjnlvvvuY86cOcTExGTq12Vu2rRpE1u3biU8PDzdL5vff/+dHTt28PXXXzN48GDn81prHn30UT7++GM6dOjAokWL8Pf3T/dYbdu2Ze3atSxfvtzltuayZcuc61zt2LFjtG3blv379/Ppp59m6gfGzz//zG233Yavry8rVqxwuWV2JceJLCoqCtM00/QgPX/+PGvXriUgICDNQLnt27dn9OjRLg2WHXbu3AlApUqVrhlrZjk66dx7773pNnLv1asXw4cPZ926dfz4448Z9mBMSkpyXhEdNGgQCQkJLuvs27ePX375hcjISJer8W3btmXWrFksX77c5fzxyy+/kJCQQMuWLTPVYQBw9s698kvecdXD3Wjkd911F6ZpMnToUAYMGEB4eHiWZzBxNPy++vZoVtx7772MHTuWY8eO8corr+TqlY1riY6O5vvvv6d48eLp3mrcvXs3a9eu5YsvvnDpBTd27Fief/55IiMj+eGHH1yK5Stl9+8fHx9Pp06dWL9+PSNGjGDMmDHXfF1//PEH7du3Jz4+ngULFnDrrbemu27Tpk3x9/dn7dq1nD9/Pk3jftM0iYqKAv773IP9irlSil27drmcAwDn5zwnP89Tp05NtwOCQ6tWrahRowZ79uxh6tSp3HvvvenuzzRNUlNT8fb2pmfPnm5vt544cYKlS5dSpUoVWrduTfny5a/rNWT3nJ4dGX1WV69e7TJDSXx8PNu2bcPPz8/ZEcZx/kpvdgNHj+IrB+t2fJ6zUjSnka2WcDptRwSHw4cP64ULF+o1a9akeT6vx2lLSEjQgYGBzga86bnrrrs0oD///PNrHmvu3Lka0OXLl9fbt29Psyw1NdXZUBfQjz/+uMv2udURQWt749NFixbphQsX6oSEBOfz1+qIkBvjtDka4V/ZWPVqP/74owZ08+bN07yGe++9VwO6c+fOaTqOpOfvv//O8kCMhw4d0pUqVdKGYWT6fbdixQrt7++vS5Uqle7gwFfL6uC6pmnqyMhIDegFCxakWeZo6Fy1atUMG3xnpSPChQsXdPHixdPtgHAlx0ClQUFBLuO4Oaxbt87tQJ5Xy6gxcnx8vA4ODs7S4KruGltrbR8EVymlfXx80rw3UlNTdZ06dTSgn3nmGZeOAQcOHHA25C5durTLOEuzZ8/WUVFRbgc/PnHihK5atarbBvCZ7YjgsGLFCr1w4cI0YwZeqyNCbozT5miE7+hU5s6+ffu0UkqXK1cuTV4c58RGjRql6ZSVnuz8/WNjY50ddRwd4a5l69atulSpUtrf3z/d9/PVsjO47u23364B/d5776V5fsWKFVoppQMDA90O0OyQlY4Ipmk633vXGpfOMbiuv7+/njFjhtvBdXfu3KnbtWt3zTFQc7ojQnbO6en55JNP9Lp169wu++uvv3RwcLCGtGM1OnLu7e3tcq5/4oknNKCHDh3qfM40Tee4d/PmzUuz/rx58zSgq1evnuZzMXHiRA3oL774IlOv42o52me3fPny2aq0Mxryo2LFitecaulqc+fO5ezZs9x2220ZNuC99957mTlzJp9//vk124307t2bdevW8cEHH9CwYUO6dOlCrVq1OH/+PFFRURw4cIBu3bqxd+9exo8fT5kyZZzDcFwpo9fasWNH52VtRyWvM/GLXSmV5WlzIOMhP8A+pkxmh78A+7QhX331Fd7e3mmuoF2tbdu2VK5cmd9++42dO3fyv//9j9dee43Jkyfj7+9PZGSk27lcIyMj09xOq1SpEm+//TbDhg2jcePG9OnTxznlybFjx3j66addfq21bt2aQ4cO0ahRo3Rf/5AhQ5xXZPbs2UO3bt24dOkSXbp0YdGiRW7bK129n48//pjmzZszbNgwfvrpJ2rVqsWGDRtYuXIl1atX5/XXX0+zvlKKadOm0apVK+644w5uu+02qlevzs6dO1m2bBlFihRh2rRpLlddhg8f7pw6ytGd/+2332bmzJmAfRoyd515HA3de/bsec0OCAMGDCAxMZFHH32UTp06ERkZSfPmzZ3TWK1bt47t27dneBUlM4oXL86kSZPo1asXrVu3pm/fvgQFBfHdd9+xZ88eevXqRZ8+fdJs06tXL2w2G40bNyYiIoJLly7x+++/s3HjRmw2G5999lmaNkWGYfD111/Trl073n77bRYsWEDbtm0JCgpi165dLF++nKJFi3L//ffz+eef07FjR3777TfnlfMNGzYwfvx4QkNDadGihfNKycGDB1myZAmJiYl069aNXr16pYmzXbt2HD58mIMHD7q0cXLnWmPiuZPRkB+Q9n2dGVpr5/ibGV2RqVq1Kq1atWLVqlUsW7aMW2+9lWnTpjmvEt588818+OGHLttdfW7Pzt+/Z8+ebNq0iSpVqmCaptvX3717d+dtu7i4ONq1a0dsbCzt2rVj3bp1bjsDXH3ue+ONN1i1ahXvvfce27Zto0mTJvz1118sWrSIkJAQJk6c6LKPiRMnsnXrVp566imWLFlCgwYNOHjwIN9++y1eXl5MnjzZ5bbZW2+9xe7duwGcba2mTp3q/Gy3aNHC7d/C0RGtYcOGNGrUyGX5lVq1asWCBQsYOHAgAwcOZPTo0bRu3ZrSpUsTHx/Ppk2b2LBhA0WKFMnwTkdmTJ482Rm7Y27nxYsXO+drrVmzZprx3rJzTk/P8uXLeeihh6hYsSI33XQT5cqVIykpiX379rFixQqSk5MZNmyY27smnTt35qabbqJ3796EhYWxZs0a1qxZQ8WKFdN8NznO2x06dKBPnz7OKQv37NnDt99+S7FixZg+fXqaK61t2rTBMAxeeOEF/vzzT+et8szMyQrk7JW29FzPkB8ZXQ1K70qbo2v4okWLrhlb9erVNaC3bt2aqdeyZMkS3aVLF12qVClts9l0mTJldLdu3fTSpUu11v8NHwHoyZMnO7dzVPAZ/bvyCp3juatl5WrK9Qz54S6vV7+Wq6+0Oa4IuZsK6WqOX/DDhg1L87oy+pfekATfffedbtmypS5atKgOCAjQjRs31l9++aXbdTPzuq/sip3ZXLlz5MgRPWTIEB0aGqq9vb11+fLl9eOPP+4yRMiV/v77bz148GAdFhambTabDg0N1QMGDNC7d+92u35GI2y7+xs5NGnSRIPrDAgZOXLkiH722Wd1gwYNdIkSJbTNZtPBwcG6devW+v3339fx8fHX3Edmfm2vWbNGd+7cWQcGBmo/Pz9dp04d/d5777m9yvjWW2/p9u3b64iICO3n56d9fX115cqV9ZAhQ/S2bdvSPUZMTIx+7rnndK1atbSfn58OCAjQ9erV0y+99JI+deqU1vq/4Snq1q2r4+LinDmYMGGC7t69u65evbouVqyY9vb21qGhobpz5856xowZbq/CpXeuysrVlOsZ8uPq9/WV0rvSFhUVpcH9VEhXmzVrlgb07bffnuZ1ZefcnpW//7Xe/1d/72Q2V+7OfWfOnNHDhg3T5cuXd/7Nhw4dqo8ePZpuXk6dOqUfffRR5zalSpXS3bt31xs2bHC7fqtWrbJ1Duzdu7cG1xkQMnL69Gn92muv6WbNmumgoCBts9l0yZIldbNmzfTo0aP1yZMnr7mPa11pu9Z5Pb33QFbO6enZs2ePfuedd3SnTp10lSpVdEBAgPbx8dHlypXTPXr00IsXL3bZ5srhOKZOnarr16+v/fz8dHBwsB4yZEi6Q43s3r1b33XXXTo0NDRT5+0ZM2Y4953Rd4g7SuvraHwhhBBCCFEAjBw5klGjRrFy5crsDXybB3Ks96gQQgghhMg9UrQJIYQQQngAKdqEEEIIITyAtGkTQgghhPAAcqVNCCGEEMIDSNEmhBBCCOEBpGgTQgghhPAAUrQJIYQQQniAHJ3GylPFxcWRkpKSo/ssXbo0MTExObrPgkDy4kpy4p7kxZXkxJXkxL2CnhebzeacAqowkaINSElJITk5Ocf2p5Ry7lc65/5H8uJKcuKe5MWV5MSV5MQ9yUvBJbdHhRBCCCE8gBRtQgghhBAeQIo2IYQQQggPIEWbEEIIIYQHkKJNCCGEEMIDSNEmhBBCCOEBpGgTQgghhPAAUrQJIYQQQngAKdqEEEIIITyAFG1CCCGEEB5AprESeUJrjf7xOy6UDkHXuQG8vKwOSQghhPAoUrSJvLFzC+bcycQBhJXD6HsfqnakxUEJIYQQnsOSoi0qKoqoqChiYmIAiIiIoFevXjRo0CDNelpr3nzzTbZt28bw4cNp0qSJc1nv3r1d9vv4449z00035W7wIlv0upX/PThxFPP9V6BhM4w770YFl7EuMCGEEMJDWFK0BQUF0b9/f8LCwtBas3r1asaNG8e4ceMoV66cc70lS5aglEp3Pw8//DCRkZHOxwEBAbkZtsgmnZiA3roegNJjJnB65Qr0yiWwZR3mH5tRt/REdboD5etrcaRCCCFE/mVJR4TGjRvTsGFDwsLCCA8Pp1+/fvj5+bFv3z7nOocOHeL777/noYceSnc/AQEBBAYGOv/5+PjkRfgii/SmNZB8GcLK4Rt5I1797sd4+QOoUReSL6O/n4P5ysPozWvRWlsdrhBCCJEvWd6mzTRN1q1bR1JSEtWrVwcgKSmJ8ePHc8899xAYGJjutlOmTOGzzz4jJCSEDh060KZNmwyvzCUnJ5OcnOx8rJTC39/f+f85xbGvnNynJ9Pr7bdGjebtUEqhlMIoVwk1/HX05t8wv54CsTGYn45F1ayH6nc/qmwFi6POG/JecU/y4kpy4kpy4p7kpeCyrGg7cuQII0aMIDk5GT8/P4YPH05ERAQA06ZNo0aNGtxwww3pbt+7d2/q1KmDr68v27dvZ8qUKVy6dIkuXbqku83ChQuZP3++83GlSpUYO3YspUuXzrkXdoXQ0NBc2a8nSYk+zom9O0Epytx+J3BVXsJ7YXboyvlvpnF+/nT07h2kjnqcol3vpET/+zGKFbco8rwl7xX3JC+uJCeuJCfuSV4KHqUtuh+VkpLC6dOnSUhIYP369fz000+MGjWK6Ohopk+fzrhx4/Dz8wPsBdrVHRGuNnfuXFatWsUnn3yS7jrpXWmLiYkhJSUlx16bUorQ0FCio6ML/e0+c/FXmItmo2pHYnt6TIZ50adPYn49Bb1lnf2JosUxeg5CtWiPMgrmECHyXnFP8uJKcuJKcuJeYciLzWbLtQsu+ZllV9psNpvzV0DlypU5cOAAS5cuxcfHh5MnTzJkyJA067/77rvUqlWLkSNHut1ftWrV+Oabb0hOTsbb29vtOt7e3ukuy403tta6wH5gMkNrjfnbz/YHzdo4c5FuXkqFYDz0AnrXNsw5k+y9TKdPgNXL7UOEVK2Vh9HnrcL+XkmP5MWV5MSV5MQ9yUvBY3mbNgfTNElOTqZ37960bds2zbLhw4czePBgGjdunO72hw4dokiRIukWZcICB/6CmGjw9Uc1aJbpzVTtSIxXxqNXLUF/9xUc3o859jlU0zaoOwajAoNyMWghhBAif7KkaJs9ezaRkZEEBwdz6dIl1qxZw65duxgxYoSzJ+jVgoODCQkJAWDTpk3Ex8dTrVo1fHx82LFjBwsXLuS2227L41ciMuIYm001ao7y9cvStspmQ7Xvhm7SCr1wBnrtj+j1K9Fb16Nu64NqdxvKJgW6EEKIwsOSoi0+Pp6JEycSFxdHQEAAFSpUYMSIEdSrVy9T29tsNlasWMG0adPQWhMaGsqgQYNo165dLkcuMksnX0b/vgYA1axNtvejigeiBj+GbtkJ86vP4OBe9Pwv0b/+gNHnXlTdRjkVshBCCJGvWVK0ZTT2mjtff/11mseRkZFpBtUV+Y/ethESL0JQaahe57r3pypVw3h+nP1q2zfT4ORxzA9HQb0bMPrcgwoJz4GohRBCiPzLksF1RcGn19k7IKimbVBGzrzNlGFgNG+HMfoTVMfu9knnd/yO+eqjmAumoy8l5shxhBBCiPxIijaR4/S5ONi5BQDVrHWO718FFMG4826MVz+C2g0gJQW9bD7myw9jblgtvaWEEEIUSFK0iRynN/wCpgmVqqNCI3LtOCosAuOJkRiPvAjBZeDsGfTkdzHHvYA+8neuHVcIIYSwghRtIsc5b402b3uNNa+fUgoV2RTjtYmo7neBjy/s34U55inMWZ+gL5zL9RiEEEKIvCBFm8hR+thBOHoQvGyoG27Os+Mqbx+MW3tjjP7YflxtolctwxzxIObKpejU1DyLRQghhMgNUrSJHOUYm436N6CKFMvz46ug0hj3P4Mx/A0oWwESLqBnf4o55kn0nj/zPB4hhBAip0jRJnKMTk1Fb1gNgNEs92+NZkTVqIPx8geo/g9AQFE4dgjznRcxP38bHRtjaWxCCCFEdkjRJnLOX9sgPg6KFoc6Da2OBuXlhdHmVowxn6JadQKl0L//au9luuRrdPJlq0MUQgghMk2KNpFj9L+Tw6smLfPVFFOqWHGMux7GeOk9qFobLiehv52J+eqj6G0bZIgQIYQQHkGKNpEjdMJF9LYNQN70Gs0OVb4KxrNvou59GgKDICYac+LrmONHok8cszo8IYQQIkNStIkcoTevheTLEFYOylexOpx0KaUwbmxln1Wh8x1gs8HOrZijHsOcNxWdmGB1iEIIIYRbUrSJHOEcm61ZW5RSFkdzbcrPH6PnYIyRE6DeDZCaio5aiPnSg5i//YQ2TatDFEIIIdKQok1cNx0TDft2gVKopq2tDidLVJlwvB57GWPYKxASDufOoqeOxxz7HPrQPqvDE0IIIZykaBPXTa9fZf+fWvVRJUtZGkt2qbqNMUZ+hLpjMPj6w997MN8YjjntI/S5s1aHJ4QQQkjRJq6P1vqKW6NtLI7m+ihvb4xOd2CM+RjVtA1ojV7zA+ZLD2H+uAidkmJ1iEIIIQoxKdrE9TnwF8REg68/qkEzq6PJESqwFMY9T2I895a9U0XiRfTcKZivPY7+a7vV4QkhhCikpGgT18U5Nluj5ihfP4ujyVmqam2MEe+gBj5iHzD4xFHM914m9ZM30adPWh2eEEKIQkaKNpFt+nISetNawPNvjaZHGV4YLW+xz6rQtisYBmxZh/nKI5jfzUYnJVkdohBCiEJCijaRbXr775B4EYJKQ/U6VoeTq1SRohj97sd4+QOoUReSL6MXz8F85WH05t9kVgUhhBC5Too2kW3ODghN26CMwvFWUhEVMZ4eg/HAsxAUDLExmJ++hfney+jjR6wOTwghRAFWOL5pRY7T8XGwcwsAqllra4PJY0opVOMWGK99guraF2zesHsH5mvDMOdMQidcsDpEIYQQBZAUbSJb9MZfwDShcg1UaITV4VhC+fpidOuP8dpEaNAUTBP902LMEQ9i/hqFNlOtDlEIIUQBIkWbyBZnr9EC2gEhK1TpULwefhHjyVH2uVcvnENPn4D5xjPoA7utDk8IIUQBIUWbyDJ99CAcOwg2G+qGm60OJ99QtRtgvDIe1fse8A+Aw/sx33oW84v30WdjrQ5PCCGEh5OiTWSZXr/S/j/1mqCKFLM2mHxG2WwYHbphjPkEdVN7APS6lfZZFVYsQKckWxyhEEIITyVFm8gSnZrqnGvUkFuj6VLFS2IMGYbx4jtQqTokJaLnf4k5chj6z81WhyeEEMIDSdEmsmbXNjh31j5DQJ2GVkeT76lK1TGeH4ca8jgUKwEnj2OOH0XqhDHoU/9YHZ4QQggPIkWbyBLn2Gw3tkLZvC2OxjMow8C4qZ19VoUO3cDLC7ZvxHz1UVIXTMdMTLA6RCGEEB5AijaRaTrhInrbBkB6jWaHCiiC0fsejFc/hNqRkJKCXjqP6Ad6YW5YLbMqCCGEyJAUbSLT9Oa1kHzZPqxF+SpWh+OxVFg5jCdGYTz8IgSHkHrmFOakdzDffsHeM1cIIYRwQ4o2kWnOW6PN26KUsjgaz6aUQjVoitdrH1N84IPg4wP7dmGOfhJz1ifoC+esDlEIIUQ+I0WbyBQdEw37doFSqBtbWx1OgaF8fCnR9168Rn+CatwCtIletcw+RMiqpTKrghBCCCcp2kSm6HX/js1Wqz6qZClrgymAVKkQjAeexRj+OpStABfPo2d9ijn6KfTeP60OTwghRD4gRZu4Jq21c0Bd1aytxdEUbKpGXYyXP0D1ux8CisCxg5hvv4g56R107GmrwxNCCGEhKdrEte3/C2Kiwdcf1aCp1dEUeMrLC6NtV4wxn6FadgKl0Bt/wXz5IcwlX6OTL1sdohBCCAtI0SauydkBoXFzlK+fxdEUHqpYcYyBD2O89B5UrQWXk9DfzsR89VH0tg0yRIgQQhQyUrSJDOnLSehNawG5NWoVVb4KxrNvoe55CkoEQUw05sTXMT8chY4+ZnV4Qggh8ogUbSJDevtGSLwIpUKg2v+sDqfQUkphNG2NMeZjVOc7wMsGf27BHPkY5rypaJlVQQghCjwp2kSGHL1GVdPWKEPeLlZTfgEYPQdjjJoAdRtDaio6aqG9vdtvP6NN0+oQhRBC5BL5Fhbp0vFxsHMLAKqpTFuVn6gy4XgNewXjsZchJAzi49BTP8Ac9zz60D6rwxNCCJELpGgT6dIbVoNpQuUaqNCyVocj3FD1bsAYOQHVczD4+sGB3ZhvDMecPgF97qzV4QkhhMhBUrSJdDlvjUoHhHxNeXtjdL4DY8wnqKatQWv0r1H2WRV+WoxOSbE6RCGEEDlAijbhlj56EI4dBJsNdUMLq8MRmaACS2Hc8xTGc29B+cqQeBE9ZxLm6CfQf223OjwhhBDXSYo24ZZjbDbqNUEVKWZtMCJLVNXaGCPeRQ18GIoWg3+OYL73MqmfvIU+fdLq8IQQQmSTFG3ChU5NtbdnA4zmcmvUEynDC6NlJ4wxn6La3ArKgC2/Yb7yCOZ3X6EvJ1kdohBCiCySok242rUVzp2FosXhfw2tjkZcB1WkGEb/BzBe+QBq1IXky+jFX2G+8gh6828yq4IQQngQKdqEC2cHhBtboWw2i6MROUFFVMR4egzGA89CUDCcOYX56VuY77+CPn7E6vCEEEJkghRtIg2dcAG9dT0gvUYLGqUUqnELjNc+RnXtAzZv+Gs75mvDMOdMQidcsDrEfEcnJaH/kaJWCJE/SNEm0tCb1kJKMoSXt/dAFAWO8vXD6DYA47WJENkUTBP902L7ECG//2p1ePmGNk3MD0dhvvqo5EUIkS9I0SbS+G9stjYopSyORuQmVToUr0dexHhiFIRGwPl49OR30YcPWB1avqB/WQ57/7T/v1yJFELkA1K0CSd96gTs3wXKsA/SKgoF9b8GGK9+CA2bgWliTvuw0A/Iq+POoL+ZZn/g4wvnzqK/nWltUEKIQk+KtlygTZOEtT97XM88vd5+lY1a9VGBpawNRuQpZbNhDHgQAorC0YPoqIVWh2QZrTXmrE/gUiJUroHxyIv251ctk3ldhRCWkqItF5gLZ3DmjWcxp32ETkm2OpxM0VqnuTUqCh9VvCSqz70A6MVz0CeOWRyRRbb8Bts3gpcNY9CjqNoNUE1agdaYMz9Bm6lWRyiEKKSkaMsFqmQpMAz0mh8wx49CX/SAtjD7/4LTJ8HXH9WgmdXRCIuoZm3gfw0gJdk+6bxpWh1SntIXL2B+9TkAqvMdqLIV7P/f+27wLwKH96NXL7cyRCFEISZFWy4w2nYl+OX3wNcfdu/AfOsZe3uxfMwxbZVq3Bzl62txNMIqSimMgY+Arx/s31XoChT9zZcQHwehEaguvZ3PqxIlUT0G2tdZOAMdH2dRhEKIwkyKtlzi36QFXs+PhZLBEH0c881n0Pt3WR2WW/pyEnrTGkDGZhOgSoWgeg4CQH8zDX0mxuKI8obe8wf61ygA+21Rb+80y1WrW6BCVUhMQH89xYoQhRCFnBRtuUiVq4Tx4jv2E/2Fc5jvvoT575ye+YnevhESE6BUCFT7n9XhiHxAte4CVWtBUiLmzI89rlNNVunLSZjTJwKgWnVCVavtso4yvDAGPgzKQG/8Bb1rWx5HKYQo7KRoy2UqMAjjmTfsg5impKAnv4v5/Zx89SWof/v31mjT1ihD3hIClGFgDHoMbDb4czN6wyqrQ8pV+vu5cOofCAxC9Ryc7nqqQlVU684AmLM/Qyd7RkcjIUTBIN/QeUD5+mE89DyqYw8A9KLZ6C8+yBcnfB0fBzu3AqCaSq9R8R8VFoHq2hcAPWcy+txZawPKJfroQfSKBQAY/R9EBRTJcH3V/S4oURJOHkev+CYvQhRCCECKtjyjDAPjzqGogQ/be5auX4n5/svoC+csjUtvWA3ahCo1UaFlLY1F5D/qlp4QUREunkfPmWR1ODlOm6mY0z4C04SGzVENml5zGxVQBHXn3fbtl8zL952MhBAFhyVFW1RUFMOHD2fw4MEMHjyYESNGsHXrVpf1tNa88cYb9O7dm40bN6ZZdvr0ad58803uuusu7r33XmbMmEFqav4fP8lo2Qnj8VfBPwD27bJ3UIg+blk8zl6jcpVNuKFsNowhw+ztuH7/Fb1tg9Uh5Sj90/dweD/4F8Hod3+mt1NNWkKt+vahUb76LF81dxBCFFyWFG1BQUH079+ft956izfffJM6deowbtw4jh49mma9JUuWuJ3/0jRN3nzzTVJSUhgzZgyPPPIIq1atYu7cuXn1Eq6Lqt0A47lx9ob/p07YC7c9f+Z5HProQTh2CGw21A0t8vz4wjOoClVRHbsDYM76BJ1w0dqAcoiOiXZOTaV6DUEFBmV6W6UURv8H/23zt8U+IK8QQuQyS4q2xo0b07BhQ8LCwggPD6dfv374+fmxb99/U8QcOnSI77//noceeshl++3bt3Ps2DEee+wxKlasSIMGDejTpw8rVqwgxUPmTFRly2O8+DZUqg4JFzDffwXz3w4BecVxlY36TVBFiuXpsYVnUbf3g5AwOBtrH8vMwzmnqrqcBNXroFp0yPI+VGhZVKc7ADDnTEZfSsjpMIUQIg2b1QGYpsm6detISkqievXqACQlJTF+/HjuueceAgMDXbbZu3cv5cuXT7MsMjKSyZMnc/ToUSpVquT2WMnJySRf0fhfKYW/v7/z/3OKY1/X2qcqEYR65g3ML95Hb1qLnvoBZswJjNv753ovTp2aam/PBhjN2uXo609PZvNSmHhKTpSvH2rwY6S+/SL6lxXoJi0xatbLvePlcl70+lX2Djg2b7wGPYry8srWfowud5K6YTXERKO/+wrj32nAcoOnvFfykuTEPclLwWVZ0XbkyBFGjBhBcnIyfn5+DB8+nIiICACmTZtGjRo1uOGGG9xue/bsWZdirkSJEs5l6Vm4cCHz5893Pq5UqRJjx46ldOnS1/di0hEaGpqp9fSr7xM/4xPOfz0V/f1cfM7FUurJkSif3JuZIPH3NZw+dxajREnCO9yKsuXdWyGzeSlMPCInYWHE7tzMxaXfYMz6hDIT5mD4+eXqIXMjL6nxcUTPsw+OW6L/fRRv0Pi69pf46IucfnUY+qfvKXV7H3wqV8+JMNPlEe+VPCY5cU/yUvBYVrSFh4fz9ttvk5CQwPr165k4cSKjRo0iOjqaP//8k3HjxuX4MXv06EHXrl2djx2/QmJiYnL0tqpSitDQUKKjozPfQLljT4wixTGnTyTxlx84dvwoXo+MQBUPzLG4rpT6vb141TfcTHRM3ox4n628FHCelhPduTesW0XKiWP88/m7eP3bizKn5WZeUie/iz4XD2UrcqF5By6euM7en2UroRrdhN68lpMfvIbXc2Nz5Uq5p71X8oLkxL3CkBebzZZrF1zyM8uKNpvN5vwVULlyZQ4cOMDSpUvx8fHh5MmTDBkyJM367777LrVq1WLkyJEEBgayf//+NMvj4+MB3N5OdfD29sb7qqlpHHLjja21ztJ+VfN2GKVCMD9+Aw7sJvWN4RiPvYwKL5+zcSVccPYCVE3b5PmHOqt5KQw8Jid+/hgDHsKcMAYdtQizUQtUpWq5driczov+c7P91qgyMAY/Cl5eObJ/1ede9J9b4MBuzF+jMFrecv3BpsNj3it5SHLinuSl4Mk347SZpklycjLdu3fn7bffZty4cc5/AIMHD+bhhx8GoHr16hw5csRZqAHs2LEDf39/5y1WT6Vq1MV44W0oHQqnT2K+9VyOT5ejN62FlGQILw/lK+fovkXBp+o3sQ95oU3MaR+iU6wfJDoz9KVEzJmfAKDa3YaqlHO3MVXJUqju/e3H+WZagR2IWAhhLUuKttmzZ7Nr1y5OnTrFkSNHnI9vvvlmAgMDKV++fJp/AMHBwYSEhABQv359IiIimDBhAocOHWLbtm3MmTOHW265Jd0raZ5EhUZgvPCOfe7HxIuYH47C/Hci65zgHJuteVtpqCqyRfW9D4oWg+OH0csXWB1OpuhFs+HMKSgVgurWP8f3r9p0hXKVIOECev6XOb5/IYSwpGiLj49n4sSJPPHEE7z22mscOHCAESNGUK9e5nqjGYbB888/j2EYvPTSS3z00Ue0bNmSPn365HLkeUcVK47x1BjUja0gNRU9fQLm/C/Rpnld+9WnTsD+v0AZ9n0LkQ2qWAlUX/tgtHrJXPQ/RyyOKGP64F70T4sBMO56COXnn+PHUF5eGAMeAqXQ635G7837sReFEAWbJW3a3I29lpGvv/7a5bnSpUvzwgsv5FRI+ZLy9oZ7noKQcPTir9ArFqBjTmDc/RTKN3s9S/X6lfb/qVUfFVgqB6MVhY1q0tI+bMwfmzCnT8B49k2Ukb2hM3KTTkmxT1WlTVTT1qg6jXLtWKpKTdTNHdG/rMCc+QnGKx+gbJ5/9V8IkT/kmzZtwj2lFMbt/VD3PGUffX3LOsy3X0Cfjc3yvrRpotfZizbVvG1OhyoKGaUUxl0PgZ8/HNiNXrnU6pDc0lEL4fhhKFoM1fueXD+e6jkIipWAE0fRP3yX68cTQhQeUrR5CKNpa4ynxtjbER3ej/nmcPSxQ1nbyf6/4PRJ8PNHRV57YmwhrkUFlUbdMQQAvWA6+vRJawO6io4+jl48B7D38FTFSuT6MVWRYqheQ+zH/34O+sypXD+mEKJwkKLNg6hqte09S8uUhdjTmGOfQ/+xOdPbO26NqkY3Zfv2qhBXUy1vger/g8tJmDMm5pshBrRpYs6YaO8p/b8GqBtb59mxVbO2/+Xkq8/z7LhCiIJNijYPo0LCMV4YBzXqwqVEzI9GY2bitpS+nITetMa+j2Zya1TkHGUYGAMfBZs37Nr235y2FtNrf4S9f4KPL8ZdD+dpT2n7hPIPgZcXbN/oHBdRCCGuhxRtHkgVKYbxxEhU83agTfTsTzHnTkabqeluo7dtgMQEKBUC1WrnYbSiMFChZVG3/ztO2dwp6Pg4S+PRZ2PR86YCoLrfhQouk+cxqLLlUR26A2B+9Tk66VKexyCEKFikaPNQyuaNGjIM1WMgAPrH7zA/fhN9KdHt+s4OCM3a5Ppk9KJwUh27Q/kqkHAB86vPLI3F/OpzSLwIFauh2nW99ga5RHXtY/+hFBuD/n6uZXEIIQoG+fb2YEopjC53YjzwLHj7wPaNmOOeR8eeTrOePhsLO7fat2naxopQRSGgvLwwBj8GhgGbf0Nv+c2SOPTW9bDlNzAMjEGPWjoMifL1w+h7nz2uH75FH8/f49kJIfI3KdoKANW4BcbTY+zDDBw9aO9ZeuSAc7neuBq0CVVqosqEWxipKOhU+cqoTncAYM7+DH3xQp4eXydcxJz9qT2WW3qiylXK0+O7oyJvhPpNIDUVc9bH+aajhhDC80jRVkCoKjUxXnwHwsrB2VjMsc+jt28Errw1Kh0QRO5TXftAaFmIj0PP+yJPj60XTIOzsRASbo8jnzD63Q8+vrBvF/q3/NFRQwjheaRoK0BUcBmM58dC7Uj7UAMTX8ec/RkcOwQ2G6pxC6tDFIWA8vbBGPQYYO/Bqf/anifH1ft2oVcvB8AY9AjKJ/8Ma6NKhaBu6wuAnj8VfeGcxREJITyRFG0FjAooivHYK/axs7RGr1xiX1C/CapIUWuDE4WGqlYb1aYLAOb0Cbnec1InX8acPsF+7Js7omrUzdXjZYdq3w3Cy8OFc+gF060ORwjhgaRoK4CUzYa662HUnUPh37GpjGbtLI5KFDaq5yAICobTJ9HfzsrVY+ml8yD6GJQo6ZyhIb9RNpt9QnlA/xqFPrDb4oiEEJ5GirYCSimF0bEHxpOvofrdD/UaWx2SKGSUXwDGXY8AoH/6LteKFH38MHrZN4C97Vh+vqKsqv/PPr4iYM78BJ2a/tiKQghxNSnaCjhVqz5G2655Ohq8EA6qbiP7MDNaY077CJ2cnKP712Yq5rSPIDUFIm+Ehs1zdP+5QfUaAgFF4dhB9M/fWx2OEMKDSNEmhMhVqs899uFoThxFL5uXo/vWK5fBwb3gH4DR/0GP+HGiipVA3TEYAL1otsu4ikIIkR4p2oQQuUoVLY7q9wAAeul89PHDObJffSYGvXCG/Rg9B6FKlsqR/eYF1aIDVKkJSYmYX0+2OhwhhIeQok0IketU45v+HWA2xX6bNIN5cjNDa4056xNISoSqtVAtO+VQpHlDGYa9U4Jj9og/N1sdkhDCA0jRJoTIdUope5HiHwAH96J/ur62XPr3X+GPTWCz/TtVleedylS5Sqi2twH/zh5xOcniiIQQ+Z3nnemEEB5JlSyF6jUUAP3tDHRMdLb2oy+cQ8+ZZN9nl96osHI5FmNeU936QWApiIlGL5tvdThCiHxOijYhRJ5RN3eEGnXhsn0w3OzMw6nnTYXz8RBeHtX5jlyIMu8ovwCMvvcCoJd9g44+ZnFEoiDQlxJljtsCSoo2IUSeUUphDHoEfHxg9w70mh+ytL3etQ3920+glP22qM07lyLNQw2bQ51G9vZ+sz6VL1uRbTo5GXPhDFKH9SXu47esDkfkAinahBB5SoWEo7oNAOxXzfTZM5naTiclYc782L6P1l1QVWrmVoh5SimF0f8B8P63kN34i9UhCQ+kD+/HfP0p++wgpsml39dYHZLIBVK0CSHynGp3O1SsBokXMWd9lqmrS3rxbIiJhpLBqJ4D8yDKvKNKh6K63AmA/noKOuGCxREJT6FTkjEXzcJ8YzgcP2wfExFIjTmJvijvo4JGijYhRJ5TXl4Ygx8FLy/Yth62/Jbh+vrwAXTUIgCMAQ+h/ALyIsw8pW7pCaFl4dxZ9LczrQ5HeAB99CDm68PR388F00Q1boExagIEh9hXOH7I0vhEzpOiTQhhCRVRCdW5F4C9LdfF827X06mpmNM/Am2ibrgZVf+GvAwzzyhvb4z+DwKgVy1DH9pncUQiv9IpKZjfz8F8/Sk4dhCKFkPd/yzGA8/aZ9yIqGRf79ghawMVOU6KNiGEZVSX3hBWDs7Ho+dOcbuO/nERHPkbAoqi/u1pWVCpWvVRTVrZ52qd+cl1D0IsCh59/DDmm8+gF82G1FRo0BRj1ASMG1r8t1JERfu6UrQVOFK0CSEso7y9MQY/Bkqh1/2M/nNLmuX65D/2LydA9b4HVbykFWHmKdX7bvAvAof3o1cvtzockU/o1FTMpfMwRz8JRw7Yf8Tc+zTGQy+4fC6UFG0FlhRtQghLqSo1UW27AmDOmIi+lAD8O1XVzI8h+TLUqo9q3tbKMPOMKlES1eMuAPTCGej4OIsjElbT/xzBfOtZ+1y7qSlQv4n96tqNrVBKuazvKNo4dghtmnkbrMhVUrQJISynut8FpUIgNga90N4IP+HH79F/bQcfH4y7Hnb75VRQqVadoEJVSExAf/2F1eEIi2gzFXPFAvvVtUP7IKAI6u4nMR4ZgQoMSn/DkDCUjy9cToLT2Zt5RORPUrQJISyn/Pztg+4CeuUSzC3rODv5ffuy2/ujQsKsDC/PKcML466H7LeNN662F6+iUNHRxzDHPo+e/yWkJEPdxhgjJ2A0a3PNHzDK8MJWvrL9gdwiLVCkaBNC5AuqdgNU83b2Rvgfv4F54RyUr4xq383q0CyhKlZDte4M/Nu7NjnZ2oBEntBmKuYPizBfewL+3gP+AaghwzAeexlVslSm9+NTqap9f1K0FShStAkh8g3V+24oHmh/YHjhNfgxlJeXpTFZSXW/y56Pk8fRy7+xOhyRy/SpfzDfHoH+eoq9LWftBhgjP8K4qX2Wmwd4V6xm3+fxw7kQqbCKFG1CiHxDFSmGMegxsNko3v8+VIWqVodkKRVQFNX7HgDMJV+TckImlC+ItGli/rQYc9Qw2L8LfP1RAx/BeGIkKqh0tvbpXcletMnt0YJFijYhRL6i6t+A18ffUKJfwR6TLbNUk5ZQqz6kJBP3yTiZUL6A0THRmO+OQM+ZBJcvQ816GKM+wmh5y3V1vvGu+O8Pnpho9KXEHIpWWE2KNiFEvqMMOTU52CeUfxBsNi5t/g29OeMpv4Rn0KaJuXKp/era3p3g64ca8CDGk6+hSoVc9/69SpSEEkGgNfxzJAciFvmBnBmFECKfU6FlUZ3uAMCcO8k5lp3wTPr0Scz3X0HP/hSSLkH1OhivfojRukuO/mCRQXYLHinahBDCAxhd7sQrtCzEnUEv+srqcEQ2aK0xf1mOOXIY7N4BPj6ovvdjPD0GVTo05w94xSC7omCQok0IITyA8vGl5EPPAaB/Xow+etDiiERW6NgYzA9eRc/4GJISoWot+9W1dl1zrTmA80rb8UO5sn+R96RoE0IID+HfuDmq0U1gmpizPpEpijyA1hpzzQ+YIx+DXdvA2wfV+x6MZ95AhYTn6rHTTGclHVgKBJvVAQghhMg8o+99pP65BQ7sRq/5AdXyFqtDEunQcWcwp0+APzfbn6hcA2Po46jQiLwJICwCvLwg4SLEnYZsDh8i8g+50iaEEB5ElSyF6tYfAP3NNPT5eIsjElfTWmP+9jPmq4/aCzabN6rXUIzn3sq7gg1QNm9wHE/atRUIUrQJIYSHUW27QkQlSLhgn5tS5Bv6bCzmxNfRUz+AxItQsRrGKx9g3NIDZeT97B7Sg7RgkaJNCCE8jPL6d0J5QP/2E3rvnxZHJLTWmBtW26+ubd8INhuq5yCM58ehwspZF5j0IC1QpGgTQggPpKrURN3cEQBz5ifoFJlQ3ir6XBzmJ2+iJ78LCRegfBWMl97H6NzL8rlz5UpbwSIdEYQQwkOpOwajt66HE0fRP3yH6nyH1SEVOubva9CzP4EL58HLhuraB9XpDpQtn3y9Oq60nTyOTr6M8vaxNBxxfeRKmxBCeChVpBjqzqEA6O/noM+csjiiwkOfj8f8dCz683H2gi2iEsaIdzG69sk/BRvYp7IqWgxME04ctToacZ2kaBNCCA+mmrWF6v+Dy0mYX31udTiFgt7yG+arj6I3rwXDQHXtizHiHVS5SlaH5kIpBWUrAnKLtCCQok0IITyYfUL5h+zjcW3fiN62weqQCix94RzmpHcwP3kLzsdD2QoYL76L0a2/fXiNfEpJZ4QCIx9dwxVCCJEdqmx5VIfu6OXfYH71OUat+ihfP6vDKlD0tg2YMybCubOgDFTnO1Bd+6K882+x5iSdEQoMKdqEEKIAUF37oH//Fc6cQn8/F3XHYKtDKhD0xQvoOZPQ61fanwgrhzH0CVSlatYGlgUqoiIa5EpbASC3R4UQogBQvn4Yfe8DQP/wLfr4EYsj8nx6x++YIx+1F2zKQN3SE+Pl9z2qYAMgrDwoBefj0efirI5GXAcp2oQQooBQkTdC/SaQmoo5+xOZJDybdMJFzC/HY340Gs7GQpmyGM+9hdFriEcOmaF8fcExOb1cbfNoUrQJIUQBYvS7H3x8Ye9O9LqfrQ7H4+g/t2COfAy99idQCtWhG8YrH6Cq1LQ6tOsTUQGQdm2eToo2IYQoQFSpEFTXvgDoeVPRF85ZHJFn0IkJmNMnYI4fCXGnISQM45k3MXrfg/LxtTq86yY9SAsGKdqEEKKAUR1uh7BycOEcesF0q8PJ9/Rf2+1X136NAkC1uw3jlfGoarUtjiznyHRWBYMUbUIIUcAom/d/E8r/GoU+sNviiPInfSkRc9YnmO+9DLExEFwGY/gbGH3vK3hDpvw7wC4njqJTUy0NRWSfFG1CCFEAqep17LMl8O+E8vJFnYbe8wfmqGHoVcsAUK27YLz6IapGHWsDyy2lQsDPH1JS4ORxq6MR2SRFmxBCFFDqzqEQUBSOHUT//L3V4eQLOukS5lefY74zAk6fhKDSGE+NxhjwIMrP3+rwco0yDCgrnRE8nRRtQghRQKliJZyD7OpFs9Gxpy2OyFp63y771bV/C1jV8haMkR+hatW3NrA8Ip0RPJ8UbUIIUYCpFh2gSk1ISsT8erLV4VhCX07CnDsF8+0XICYaSgZjPDEKY+AjKP8Aq8PLO9IZweNZMo1VVFQUUVFRxMTEABAREUGvXr1o0KABAJ9//jl//PEHsbGx+Pn5UaNGDQYMGEDZsmWd++jdu7fLfh9//HFuuummvHkRQgjhAZRhYAx4CHPMk7D5N/Sfm1F1GlkdVp7RB3ZjTh3vbMelbmqP6n0PKqCIxZHlPed0VscPWRyJyC5LiragoCD69+9PWFgYWmtWr17NuHHjGDduHOXKlaNy5cq0aNGC4OBgLly4wLx58xgzZgwTJ07EMP67OPjwww8TGRnpfBwQUIh+MQkhRCapcpVQbW9D/7gIc/ZnGCM/KhBjj2VEJ19GL5qFjloE2oTAIIxBj6LqNrY6NOuE29u0EXsaffECqkhRa+MRWWbJ7dHGjRvTsGFDwsLCCA8Pp1+/fvj5+bFv3z4A2rdvT+3atQkJCaFy5cr07duXM2fOcOrUqTT7CQgIIDAw0PnPx8fzphcRQoi8oLr1g8BSEBONXjbf6nBylT64F3P0k+gVC0GbqGZtMEZOKNwFG9ivLpYKsT+Qq20eyZIrbVcyTZN169aRlJRE9erVXZZfunSJlStXEhISQnBwcJplU6ZM4bPPPiMkJIQOHTrQpk0blFLpHis5OZnk5GTnY6UU/v7+zv/PKY595eQ+CwLJiyvJiXuSF1fXmxPlXwT63of56Vvo5d9A0zao0LLX3jAfuzonOjkZc/FX6GXf2K+ulSiJMfARjMgbrQwzz2X0XlHlKqHPnILjh1E16uZ1aOI6WVa0HTlyhBEjRpCcnIyfnx/Dhw8nIiLCuXzFihXMnDmTpKQkwsPDeemll7DZ/gu3d+/e1KlTB19fX7Zv386UKVO4dOkSXbp0SfeYCxcuZP78/35hVqpUibFjx1K6dOlceY2hoaG5sl9PJ3lxJTlxT/Li6npyorvewenff+HS5t+wzfuC0q9PLBCFcWhoKJf3/UXs+yNJPXwAgIDWnQh8YDhexQOtDc5C7t4r8TXrcG7bBvzPnCIoLMyCqMT1UFprbcWBU1JSOH36NAkJCaxfv56ffvqJUaNGOQu3hIQE4uPjiYuLY/HixcTGxjJ69Oh0b4HOnTuXVatW8cknn6R7zPSutMXExJCSkpJjr00pRWhoKNHR0ViU3nxJ8uJKcuKe5MVVTuVEnzpB6quPQvJljPuexrixdc4FmceUUpQpVYp/pozHXPI1mCYUK4Fx18MYjZpbHZ5lMnqvmJvWYH46FirXwPbiOxZFeP1sNluuXXDJzyy70maz2Zy/AipXrsyBAwdYunQp999/P2BvrxYQEEBYWBjVq1dn6NChbNy4kRYtWrjdX7Vq1fjmm29ITk7G29vb7Tre3t7pLsuNLwattXzhuCF5cSU5cU/y4uq6c1I6FNWlF3rRbMy5U6BOI1SAZzZI10cPcnLMU5gH9wKgGrdA9X8AVayEvG9I573y7wC7HDuEmZpqH3RXeIx889cyTTPNVbArOd54GV0NO3ToEEWKFEm3KBNCCGGnbrkDypSFc2fR3860Opws0ykpmN/PIXXMkyQf3AtFi6HufxbjgWdRxUpYHV7+FhIG3j5wOQlOR1sdjcgiS660zZ49m8jISIKDg7l06RJr1qxh165djBgxgpMnT/Lbb79Rv359ihcvzpkzZ/j222/x8fFxjuO2adMm4uPjqVatGj4+PuzYsYOFCxdy2223WfFyhBDCoyhvb4wBD2K+9zJ61TJ083aoitWsDitT9LFD9nHXjtjbrvk3a8PlXkOhELddywpleEF4eTi83z4zQki41SGJLLCkaIuPj2fixInExcUREBBAhQoVGDFiBPXq1SM2Npbdu3ezdOlSLly4QGBgILVq1WLMmDGUKGH/BWWz2VixYgXTpk1Da01oaCiDBg2iXbt2VrwcIYTwOKpWfVSTVuiNqzFnfoLx4tv2L/R8Sqemopd/g148B1JTIKAoxoAHKdWtj7R9zCIVURF9eD/62CFUw8Lb9s8TWVK0PfTQQ+kuCwoK4oUXXshw+8jIyDSD6gohhMg61ftu9B+b4PB+9OrlqDa3Wh2SW/qfI5hffGC/OgRQv4m9s0HJUgWi92uek+msPFa+adMmhBAib6kSJVE97gJAL5yBjo+zOKK0tJmKufwbzNFP2Au2gCKou5/EeGQEKjDI6vA8lrqiM4LwLFK0CSFEIaZadYIKVSExAf31F1aH46Sjj2GOfR79zTRISYG6jTFGTsBolvEg6iIT/r3SRkw0+lKipaGIrJGiTQghCjFleGHc9RAohd64Gv3Xdkvj0WYqZtS3mK89AX/vAf8A1JDHMR57GVWylKWxFRSqWAko8e+VyuOHrQ1GZIkUbUIIUcipitVQrTsDYM76FJ3O8Eu5TZ/8B/PtF9HzvoDky/C/BhgjP8K4qZ1cXctpEfZbpFrmIPUoUrQJIYRAdb/LPmzGyePoFQvy9NjaNDF/Woz52jDY/xf4+aMGPYrx+EhUUOEb9T4vKMctUmnX5lGkaBNCCIEKKIrqfQ8AesnX6FMn8uS4OiYa890R6DmT4PJlqFUfY+RHGDd3lKtruUl6kHokKdqEEEIAoJq0hFr1ISUZ86vPcnXsM22amCuXYo4aBnt3gq8fasBDGE++hioVkmvHFXb/XWk7LGPceRAp2oQQQgD2icaN/g+AzQZ/boEtv+XKcfTpk5jvv4Ke/SkkXYIadTFe/RCjdWe5upZXQiPAywsSL0LcaaujEZkkRZsQQggnFRqBuqUnAOacyehLCTm2b6015i/LMUcOg907wMcX1e9+jKdGo0qH5thxxLUpm7e9cANp1+ZBpGgTQgiRhupyJ5QOhbNn0Iu+ypF96tgYzA9eRc/4GJISoWptjFfHY7TtijLkq8gKStq1eRz5pAghhEhD+fhi9HsAAP3zYvTRg9nel9Yac80PmCMfg13bwNsH1ecejGdeR8lk5daSHqQeR4o2IYQQLlTdRtCoOZgm5qxP0KaZ5X3ouDOYH76GnvYRJCZAlZoYr3yA0b5bvp6cvrCQK22ex5IJ44UQQuR/Rp/7MP/cCgd2o9f8gGp5S6a201qj1620D+OReBFs3qjud6E63C7FWn7iuNJ28jg6+TLK28fScMS1yZU2IYQQbqmSpVDd+gOgv5mGPh9/zW302VjMia+jp35gL9gqVrNfXbulhxRs+U2JIChaDEwTThy1OhqRCVK0CSGESJdq2xUiKkHCBfT8L9NdT2uNuWE15quPwvaNYLOheg7CeH4cKqxc3gUsMk0pBWUrAnKL1FNI0SaEECJdyuvfCeUB/dtP6L07XdbR5+IwP3kTPfldSLgA5atgvPQ+RudeKC+5upafyXRWnkWKNiGEEBlSVWqibu4IYO+UkPLfhPLm72vsV9e2rgcvG6rbAIwX3kaVrWBVuCIrpDOCR5GOCEIIIa5J3TEYvXU9/HME/cN30KI9etan6M1r7StEVMK4+wlUuUrWBiqyREVURINcafMQUrQJIYS4JlWkGKrXUPSX49Hfz0H/8C2cjwfDQHXpjbr1Tvso+8KzhJUHZcD5ePS5OFTxklZHJDIgt0eFEEJkimreFqrVhstJ9oKtbAWMF9/F6NZfCjYPpXx9oUyY/YFcbcv3pGgTQgiRKUopjMHDoEZdVNc+GCPeQ1WoYnVY4jop6UHqMeT2qBBCiExTZcLxGv661WGInBRRETavlSttHkCutAkhhBCFmIqw9/SVK235nxRtQgghRGH27+1RThxFp6RYGorImBRtQgghRGFWKgT8/CElBU7+Y3U0IgNStAkhhBCFmDIMKOu4RXrQ4mhERqRoE0IIIQo553RWxw9ZGYa4BinahBBCiMLOOZ3VYWvjEBmSok0IIYQo5GTieM8gRZsQQghR2IXb27QRdxp98by1sYh0SdEmhBBCFHIqoIi9FymA3CLNt6RoE0IIIcR/7dqkM0K+JUWbEEIIIaRdmweQok0IIYQQzqJNprPKv6RoE0IIIYTz9ijHD6NN09JQhHtStAkhhBACQsLA2wcuJ8HpaKujEW5I0SaEEEIIlOEF4eXtD+QWab4kRZsQQgghAGnXlt9J0SaEEEIIOyna8jUp2oQQQggByLAf+Z0UbUIIIYSwK1vR/t+YaPSlREtDEa6kaBNCCCEEAKpYcQgMsj84LtNZ5TdStAkhhBDiPzKdVb4lRZsQQgghnJTjFqm0a8t3pGgTQgghxH8iKgDSgzQ/kqJNCCGEEE7/9SA9jNba0lhEWlK0CSGEEOI/oRHg5QWJFyH2tNXRiCtI0SaEEEIIJ2XzthduIO3a8hkp2oQQQgiRxn/TWR20NhCRhhRtQgghhEjL0a5NxmrLV6RoE0IIIUQaMnF8/iRFmxBCCCHSclxpiz6OTr5saSjiP1K0CSGEECKtEkFQtBhoE/45anU04l9StAkhhBAiDaWUc/J4uUWaf0jRJoQQQggX/w2ye8jKMMQVpGgTQgghhCuZOD7fkaJNCCGEEC7kSlv+I0WbEEIIIVyFlQdlwPl49Lk4q6MRSNEmhBBCCDeUry+UCbM/kKtt+YIUbUIIIYRwS0kP0nxFijYhhBBCuCft2vIVmxUHjYqKIioqipiYGAAiIiLo1asXDRo0AODzzz/njz/+IDY2Fj8/P2rUqMGAAQMoW7ascx+nT59m0qRJ7Ny5Ez8/P1q1akX//v3x8vKy4iUJIYQQBY6KqIhGrrTlF5YUbUFBQfTv35+wsDC01qxevZpx48Yxbtw4ypUrR+XKlWnRogXBwcFcuHCBefPmMWbMGCZOnIhhGJimyZtvvklgYCBjxowhLi6OCRMm4OXlRf/+/a14SUIIIUTB47jSduIoOiUFZbOkbBD/siT7jRs3TvO4X79+REVFsW/fPsqVK0f79u2dy0JCQujbty/PPPMMp06dIjQ0lO3bt3Ps2DFefvllAgMDqVixIn369GHWrFn07t0bWzpvquTkZJKTk52PlVL4+/s7/z+nOPaVk/ssCCQvriQn7kleXElOXElO3MvRvASXAT9/uJSIOvUPqmyF69+nyDbLS2bTNFm3bh1JSUlUr17dZfmlS5dYuXIlISEhBAcHA7B3717Kly9PYGCgc73IyEgmT57M0aNHqVSpkttjLVy4kPnz5zsfV6pUibFjx1K6dOmcfVH/Cg0NzZX9ejrJiyvJiXuSF1eSE1eSE/dyKi8nK1fn8q7tlLhwliJhTXNknyJ7LCvajhw5wogRI0hOTsbPz4/hw4cTERHhXL5ixQpmzpxJUlIS4eHhvPTSS84raGfPnk1TsAGUKFHCuSw9PXr0oGvXrs7Hjl8hMTExpKSk5NArs+83NDSU6OhotNY5tl9PJ3lxJTlxT/LiSnLiSnLiXk7nJbV0OLCduD+3ca5G/esPMAfYbLZcu+CSn1lWtIWHh/P222+TkJDA+vXrmThxIqNGjXIWbjfffDP16tUjLi6OxYsX8/777zN69Gh8fHyyfUxvb2+8vb3dLsuND7zWWk4kbkheXElO3JO8uJKcuJKcuJdjeYmw3xLVxw5Jni1m2ZAfNpuN0NBQKleuTP/+/alYsSJLly51Lg8ICCAsLIzatWvz9NNP888//7Bx40YAAgMDXa6oxcfHO5cJIYQQImfIdFb5R74Zp800zTSdBK7k+LXguIVZvXp1jhw54izUAHbs2IG/v3+aW6xCCCGEuE7h/3Y+iDuNvnje2lgKOUuKttmzZ7Nr1y5OnTrFkSNHnI9vvvlmTp48ycKFC/n77785ffo0e/bs4b333sPHx8c5jlv9+vWJiIhgwoQJHDp0iG3btjFnzhxuueWWdG9/CiGEECLrVEARKBVif3DssLXBFHKWtGmLj49n4sSJxMXFERAQQIUKFRgxYgT16tUjNjaW3bt3s3TpUi5cuEBgYCC1atVizJgxzs4GhmHw/PPPM3nyZF566SV8fX1p1aoVffr0seLlCCGEEAVbREU4cwp97BCqRh2roym0LCnaHnrooXSXBQUF8cILL1xzH6VLl87UekIIIYS4PiqiInr7Rjh+yOpQCrV806ZNCCGEEPmTozOCTGdlLSnahBBCCJExRw/S44fRZqqloRRmUrQJIYQQImMhYeDtA5eTIOak1dEUWlK0CSGEECJDyvCC8PL2B3KL1DJStAkhhBDimqRdm/WkaBNCCCHEtUnRZjkp2oQQQghxTc7prGTYD8tI0SaEEEKIaytb0f7fmGj0pURLQymspGgTQgghxDWpYsUhMMj+4LhMZ2UFKdqEEEIIkTmOdm1yi9QSUrQJIYQQIlOU4xapdEawhBRtQgghhMgc6UFqKSnahBBCCJEpzh6kxw6jtbY0lsJIijYhhBBCZE5oWfCyQeJFiD1tdTSFjhRtQgghhMgUZfOGsAj7A7lFmuekaBNCCCFEpqmyFQDQxw5aHEnhI0WbEEIIITLPOTOCjNWW16RoE0IIIUSmycTx1pGiTQghhBCZ57jSFn0cnXzZ0lAKGynahBBCCJF5JYKgaDHQJvxz1OpoChUp2oQQQgiRaUop5+Txcos0b0nRJoQQQogs+W+Q3UNWhlHoSNEmhBBCiKyRieMtIUWbEEIIIbLEeaXt6EGZzioPSdEmhBBCiKwJKw/KgAvn4NxZq6MpNKRoE0IIIUSWKF9fKBNmfyDt2vKMFG1CCCGEyDIlPUjznBRtQgghhMg66UGa56RoE0IIIUSWyXRWeU+KNiGEEEJkneNK24mj6JQUS0MpLKRoE0IIIUTWlQoBP39ITYGTx62OplCQok0IIYQQWaaU+m+QXblFmiekaBNCCCFEtjgH2ZWZEfKEFG1CCCGEyB7nsB+HrY2jkJCiTQghhBDZIhPH5y0p2oQQQgiRPWUr2P8bdxp98by1sRQCUrQJIYQQIluUfwAEl7E/kFukuU6KNiGEEEJk379X26QHae6Tok0IIYQQ2SY9SPOOFG1CCCGEyDaZzirvSNEmhBBCiOxzXmk7jDZTLQ2loJOiTQghhBDZFxIG3j5wOQliTlodTYEmRZsQQgghsk0ZXhBe3v5AbpHmKinahBBCCHFdpF1b3pCiTQghhBDXR4q2PCFFmxBCCCGuiwz7kTekaBNCCCHE9fl34nhiotGXEiwNpSCTok0IIYQQ10UVKw6BQfYHx49YG0wBJkWbEEIIIa6ftGvLdVK0CSGEEOK6KcctUinaco0UbUIIIYS4fnKlLddJ0SaEEEKI63ZlD1KttaWxFFRStAkhhBDi+oWWBS8bJCZAbIzV0RRIUrQJIYQQ4ropmzeERdgfyC3SXCFFmxBCCCFyhExnlbukaBNCCCFEznC2aztsaRgFlRRtQgghhMgRjmE/5Epb7pCiTQghhBA5w3GlLfo4OvmypaEURFK0CSGEECJnlCgJRYuBNuGfo1ZHU+BI0SaEEEKIHKGUck4eL7dIc57NioNGRUURFRVFTIx9HJeIiAh69epFgwYNuHDhAl9//TXbt2/n9OnTFC9enBtuuIG+ffsSEBDg3Efv3r1d9vv4449z00035dnrEEIIIURaKqIies8fMuxHLrCkaAsKCqJ///6EhYWhtWb16tWMGzeOcePGobUmNjaWgQMHEhERwenTp5k0aRJxcXE8/fTTafbz8MMPExkZ6Xx8ZVEnhBBCCAs4hv04fsjSMAoiS4q2xo0bp3ncr18/oqKi2LdvH23btmX48OHOZaGhofTt25ePPvqI1NRUvLy8nMsCAgIIDAzM9HGTk5NJTk52PlZK4e/v7/z/nOLYV07usyCQvLiSnLgneXElOXElOXHP6rwY5SqRCnD0oKVxFESWFG1XMk2TdevWkZSURPXq1d2uk5CQgL+/f5qCDWDKlCl89tlnhISE0KFDB9q0aZPhm2PhwoXMnz/f+bhSpUqMHTuW0qVL58yLuUpoaGiu7NfTSV5cSU7ck7y4kpy4kpy4Z1VezJIlOW4YcOEcZfx88AoKtiSOgsiyou3IkSOMGDGC5ORk/Pz8GD58OBERES7rnTt3jm+++Yb27duneb53797UqVMHX19ftm/fzpQpU7h06RJdunRJ95g9evSga9euzseOAi8mJoaUlJQcemX2/YaGhhIdHS2T5l5B8uJKcuKe5MWV5MSV5MS9fJGXkDCIPk70lg0Y/2uY47u32Wy5dsElP7OsaAsPD+ftt98mISGB9evXM3HiREaNGpWmcEtISOCtt94iIiKCO++8M832vXr1cv5/pUqVSEpKYvHixRkWbd7e3nh7e7tdlhtvbK21nEjckLy4kpy4J3lxJTlxJTlxz8q8qLIV0dHH0UcPoWs3sCSGgsiyIT9sNhuhoaFUrlyZ/v37U7FiRZYuXepcnpiYyBtvvIG/vz/Dhw/HZsu4vqxWrRpnzpxJ02ZNCCGEEBZwDLIrPUhzVL4Zp800TWfBlZCQwJgxY7DZbDz77LP4+Phcc/tDhw5RpEiRdK+kCSGEECJvyMTxucOS26OzZ88mMjKS4OBgLl26xJo1a9i1axcjRowgISGB119/naSkJB577DESExNJTEwEoHjx4hiGwaZNm4iPj6datWr4+PiwY8cOFi5cyG233WbFyxFCCCHElRxX2k4cRaekoK5xt0xkjiVZjI+PZ+LEicTFxREQEECFChUYMWIE9erVY+fOnezbtw+AYcOGpdluwoQJhISEYLPZWLFiBdOmTUNrTWhoKIMGDaJdu3ZWvBwhhBBCXKlUCPj5w6VEOHkcylawOqICwZKi7aGHHkp32f/+9z++/vrrDLePjIxMM6iuEEIIIfIPpZT9atv+v9DHDqGkaMsR+aZNmxBCCCEKDiWdEXKc3GQWQgghRI5T7buhWneBMmWtDqXAkKJNCCGEEDlOlQm3OoQCR26PCiGEEEJ4ACnahBBCCCE8gBRtQgghhBAeQIo2IYQQQggPIEWbEEIIIYQHkKJNCCGEEMIDSNEmhBBCCOEBpGgTQgghhPAAUrQJIYQQQngAKdqEEEIIITyAFG1CCCGEEB5A5h4FbLbcSUNu7dfTSV5cSU7ck7y4kpy4kpy4V5DzUpBfW0aU1lpbHYQQQgghhMiY3B7NBYmJiTz33HMkJiZaHUq+InlxJTlxT/LiSnLiSnLinuSl4JKiLRdorTl48CByETMtyYsryYl7khdXkhNXkhP3JC8FlxRtQgghhBAeQIo2IYQQQggPIEVbLvD29qZXr154e3tbHUq+InlxJTlxT/LiSnLiSnLinuSl4JLeo0IIIYQQHkCutAkhhBBCeAAp2oQQQgghPIAUbUIIIYQQHkCKNiGEEEIIDyBFmxBCCCGEB5CiLZv27dtHdHQ0gIw6LYS4bjLlkKv9+/dz8eJFQM6zQoAUbVkWGxvLu+++y0svvcSCBQsAUEpZHJW1zp49y9KlS9myZQsnT54E5AR74cIFYmJiADBN0+Jo8o+zZ88SFRXFli1bOHXqFCDvldjYWEaMGMGMGTNISUmxOpx8ITY2lvfee48RI0awaNEiQM6zYP/8rFq1it27d3PhwgVAPj+Fjc3qADzJ9OnTWbJkCY0aNaJevXoAXL58GR8fH4sjs87ChQtZsGABNWrU4MyZMwAMHjyYyMhIawOz0LfffsuCBQto3Lgxw4YNwzDktxHA7NmzWbZsGdWqVePo0aOEh4dz3333ERERgda6UH4pT58+nWXLlhEZGUmvXr2w2eSUfOV5Njw8vFCfX680b948vvvuO6pXr86xY8eIiIigX79+VK1a1erQRB6SwXUz4eDBg7zyyiuEhoZy9913U6tWLWbOnMnWrVt59913C+0Xzt9//83kyZPp2bMnjRs3JiYmhsWLF7Nu3TqeeeYZqlevbnWIeSo5OZlZs2axZ88eihcvTmJiIl27dqVJkyaYplloi7dz587xySefcO7cOQYMGECtWrXYsWMHc+bMoVWrVnTq1MnqEPPcuXPneOaZZ9Ba89RTT1GzZk2rQ7Lc7t27eeONNyhTpozzPDthwgTOnDnDq6++WmjPs4Dz89KnTx/q16/P/v37+f777zlw4ACjR48mMDDQ6hBFHimc3yJZpJTiySef5O2336ZWrVoAVK5cmXPnznHy5MlCeyJZv349CQkJNG7cmNTUVEqXLk2DBg04d+4cUVFRzitvBZnjN4/WGm9vb8qUKUO7du0YMGAARYsW5ZdffiEhIQHDMArVbYwrX6vNZqNhw4YMHTqU2rVro5Sifv36GIaRprAv6Pm58vUVL16cihUrUq5cOWrWrMnBgweZMmUKX331FWvWrCE+Pt7CSPPOlTm5dOkSjz76qPM8a5om5cqV49y5c5w9e7ZQnWevPK+A/Vzr+NyYpknVqlWpU6cOp06d4vvvv+fy5ctWhivykBRtbjjaIDnal1SsWJGGDRumWWYYBt7e3iQkJFgTZB5zvO7U1FTncyVLlsTPz48LFy7g5eUFQHx8PDVr1mTt2rUcPnzYkljzSnJyMklJScB/7W06dOhA+/btKV++PA0bNiQuLo5Vq1ZZGGXeuzIvAH5+ftx8883O2zgXL15k3LhxxMTEsGDBApYsWYJpmgX6S/nqnAAMGjSIXbt2MWLECMaNG8e5c+fYu3cvs2bNYsKECQW+LeTVOalfvz5NmjQBcF6Z9vPzc/7oKSyuPq+kpKTg5+dHyZIluXTpkjMXly9fpnLlyixbtszZflYUfNKA4ioLFy50nkjdtS9xfLH873//Iz4+ntjYWCpVqlSgb39dmRMvLy/nay1Tpgy+vr68++67DBgwgE2bNrFo0SJGjBjB3LlzWbNmDQ0bNiyQuZk/fz5bt27Fx8eHypUr07VrV0qWLIlSynkbp1mzZuzevZvNmzfToEEDwsLCCmQurpReXnx9fQGIi4tj9OjRBAUFMXToUPbu3cvy5cs5fPgwDz/8cIHMT3o5KVu2LD169GDDhg089dRTVKpUCZvNxqZNm5gxYwbz58+nd+/eVoefK9LLiePv7zjP1q1bly+//JLo6GiKFy9e4G+RXp2XW2+9laCgIEJDQ9mzZw+TJ0/mzjvvZOXKlSxZsoTHH3+cmTNn8uOPPzJ48OACnx8hRZtTdHQ0s2fPZteuXZw/f54ff/yR9u3bk5qa6ryKBP8VbaZpUqlSJfbu3UujRo0K3BcNpJ8Tx4k1MjISLy8vvv76a8aPH4+vry/PPfccderUYc+ePezatYuUlJQC1bj6yJEjfP755yQmJtKjRw8OHDjAzp07iYmJ4amnnnK+V7TWFClShKZNm7Jo0SJWrlxJ//79MQzDmb+CdIK9Vl4cxWzJkiV56qmniIiIAKBZs2ZEREQwe/Zszp07R/HixS1+JTknvZycPHmS4cOHA9C1a1fq1q1L5cqVne+FevXqUbt2bf7+++8C19HpWu8Tx3nUkYuUlBTCw8M5evQo1atXLzCfl6td673Srl07AFasWMErr7xCQEAAzzzzDPXq1WPTpk0kJiYWqPOJSF/B+Ta9TocPH8YwDO6//352797NvHnzaNWqFd7e3m5//ZcoUYKUlBRnW4KCeIUgo5w4itn69etTq1Ytzp49S0hIiHPbHTt2ULp06QJVsKWkpLBx40YCAwN57rnnKFasGC1atGDVqlUsX76c06dPExwcDPz3pdO4cWN27drFnj17+PPPPzl37hw7d+7kvvvuKzAn2KzkBXAWbI4vmePHjxMcHFygCtnM5iQgIMDZThbs5xEfHx+OHz9O8eLF8fb2tvBV5Kysvk/A/l5JSEhwjtVWEM+z18rLqVOnCAkJoWPHjrRo0YK4uDjKli3r3H7fvn3Ur1+/QHxuxLUVnG/UbHJ8SURGRlKqVCmqVq1KSEgIW7duZebMmQwdOtRlG8eJo1atWuzcuROgQJ1IMpOTK08QPj4+hISEOLdzXGFr3bq1dS8il0RERFCjRg2KFSvmfB/YbDbOnz9PkSJF0qzryEeLFi3466+/eOutt0hNTaVz584WRZ97MpOXq79UlFIcOXKEw4cPc/PNN1O0aFErQs81WXmvOBiGwZ49e0hNTaV169YF7os4Kzm58jz7559/cvvttxeo8+yVMspLsWLFnOsFBAQQEBDgfLxt2zb8/Pxo2bKlFWELCxT6os1xUvT19XU2lA4LC6Ndu3bMmzePW265hfDw8DS/8K48cWitiY2NJSgoKO+DzyXZyUlqaio///wzBw8e5Ndff6Vly5YFbhgDm83GjTfe6PJFmpCQQKlSpVyuiiiliI2N5ccff+Tvv/+mdevWDBw4sMAVJ1nNS3R0NNHR0WzZsoXVq1fTrFkzOnTokJch57rs5OTEiRNs2bKFX375hZtvvpn69evnZci5Lqs5cZxbLl26REpKChcuXChwnx3Iel4uXbrEpk2b2L17N6tXr6Zdu3aUK1cuL0MWFir0RRuQ5paM1hpfX18aN27M5s2bmTZtGi+88IJLoeZoaN6uXbsCVbA5ZDUnXl5eGIZBbGwsr776aoEc8DG9W3d79uyhcuXK2Gw2l9s3v//+O3/99Revv/56gcwJZD0vp0+fZu3atcTFxfHyyy8XyLxkNScnT55k5cqVnD9/XnJyxQ9BLy8vbrnlFkqWLFkgCzbIel58fX2Ji4vjxIkTvPLKK1SrVi2vQxZW0oXA5cuX012WkpLi9nFqaqpeu3atHjx4sN68ebPWWutdu3bpuLi4XIszL+VkTmJjY3Mv0DyUlZykpqY6//vQQw/pDRs2OJdFR0fnToAWyam8nDhxQmutdVJSkj5z5kwuRJp3ciMnMTExuRBp3snpz49jHU+XG+eV5OTkHI5SeIqC2UDgCl9++SWvvfZauoNVenl5obVmzpw5aR4bhkHt2rVp0qQJU6dO5c0332TkyJHO+RI9WU7npCCMEZTVnDh+9e7evRutNXXr1nXOlzhs2DDi4uLyLPbclJN5efzxx4mNjcXHx8ejr07nVk6uboTvSXLj81MQ2q/l1nmlIHXwElnj+Z+KdERHRzNu3Di2b9/O3r17Wblypdv1fv75Zx588EHWrVvnLD6uvFR97tw5Tp06hY+PDxMnTvToqZkkJ66uJycAx44dIyQkhKVLlzJs2DAuXbrEhAkTKFmyZF69hFyRW3nx5GJNcuJKPj/uSV5Ebimw5bqjc8Dtt9/Ovn37mD9/Pk2bNiU0NNS5zu7du1m3bh19+vShdevWaX7ZRUdH89FHH3H27FlGjRpVIBrVS05cXW9OtmzZwu7du7lw4QLPPPNMgWk8LnlxJTlxJTlxT/IickuBmzDe0WAzISGBc+fOERoa6pyUuWrVqjzyyCNp1k9v8Mrk5GT27t3L//73v7wKPddITlzlRE4cPWYd0zQVBJIXV5ITV5IT9yQvItflYfu5XPPrr7/qo0ePZrjO77//rnv37q137tyZR1FZS3LiSnLinuTFleTEleTEPcmLyEse3aZt165dPP3003z00Uf8+uuvztkJ3GncuDGRkZHMmTPH7Xq6gFxwlJy4kpy4J3lxJTlxJTlxT/IirOCxRduZM2dYvXo1devWpXv37kRFRXHo0KEMt7nrrrvYt28f69evJyUlhc2bN7N7927AdbR2TyQ5cSU5cU/y4kpy4kpy4p7kRVjFYzsi+Pv706BBA8LDwylfvjzr169n6dKllC1bNt0pYsqVK0enTp2YPn06ixcv5p9//uG5557L48hzj+TEleTEPcmLK8mJK8mJe5IXYRWPvdIWEBBA06ZNKV++PAD33HMP69atY9euXeleao6OjiYmJobz589TrVo1Jk+eTL169fIy7FwlOXElOXFP8uJKcuJKcuKe5EVYxWOvtF3JNE3q1atHZGQk3377LZUrV6ZUqVJp1omNjWXy5MmcPn2ad955p8DP1SY5cSU5cU/y4kpy4kpy4p7kReQpK3o/ZIVpmi7PpTfNUkxMjO7du7deunSpczoQx3Q5SUlJziljPJ3kxJXkxD3JiyvJiSvJiXuSF5Hf5LsrbSkpKSxdupTQ0FCaNGmSpoGmYwwcLy8vUlNTOXHiBBEREXh5eWGaJsHBwdx6660sWbKEYsWKsXr1aooXL84DDzyAj49PmoENPYnkxJXkxD3JiyvJiSvJiXuSF5Hf5as2bVu3buWZZ55h1qxZrF+/ntjYWOC/7tCOEaOXLl3KkCFD2Lp1KykpKcB/vW+6dOlCTEwMH330EV5eXgwdOtTtQLGeQnLiSnLinuTFleTEleTEPcmL8AT5ZkaES5cu8eWXX+Lr60vJkiXZsGEDbdq0oWPHjs51UlJSmDp1Khs3bmTgwIHcfPPNaX4JrVmzhokTJ1KxYkUeeOABKlasaMEryTmSE1eSE/ckL64kJ64kJ+5JXoSnyDdFm9aavXv3UqxYMcLDw3n33XdJSUmhb9++VKhQwblOdHQ0JUqUICAgIM32pmny+++/c/78edq3b2/FS8hxkhNXkhP3JC+uJCeuJCfuSV6Ep7CsaFu/fj0BAQGUK1eOkiVLuizfsWMHs2bNonHjxvTq1atQDD4oOXElOXFP8uJKcuJKcuKe5EV4qjzviPDLL78wY8YMSpcuzalTpwgLC+O2226jSZMmmKaJUgqlFPXq1WPjxo3s3LmTmjVrUrduXbTWBfLDIzlxJTlxT/LiSnLiSnLinuRFeLo864iQmprK0qVLWbhwIf369eO1117jmWeeoUyZMvz0008kJydjGAZKKUzTBKBz584kJyfz+++/c+nSJbTW/PPPPwDOdTyZ5MSV5MQ9yYsryYkryYl7khdRUORZ0ZaUlMS5c+do1aoVrVu3xmazUaNGDSIiIkhISCA1NfW/oAwDrTVly5blhhtu4O+//+abb77hhRde4KOPPnJ2vfZ0khNXkhP3JC+uJCeuJCfuSV5EQZGrt0dPnDhBaGgoSqk0034YhuF84wcHB5OUlITNljYUx6XounXrMnfuXPbt20e7du24++67PfoDIzlxJTlxT/LiSnLiSnLinuRFFES5UrT99ttvzJo1C29vbwICAmjfvj1t27Z1doG+8pfKli1bqFixIjabjdTUVLy8vAD7r52oqCimTJlCvXr1uPfeeylTpkxuhJsnJCeuJCfuSV5cSU5cSU7ck7yIgizHizZHr5vbb7+dMmXKsGPHDiZNmoRpmrRs2RIfHx+UUmitSU5O5ujRo9x2220Azg+MQ40aNXj88cdp3rx5ToeZpyQnriQn7kleXElOXElO3JO8iIIux4o2x+Vkx1g37dq1w2azERkZyeXLl/npp58oXrx4mqlBLly4QEJCAtWqVQPsl7OjoqIYPHgwABUqVHCOkeOJJCeuJCfuSV5cSU5cSU7ck7yIwiLHbs47PgjHjh2jTJky2Gw25xQfffv2xdvbm99//52zZ886t/njjz8IDg6mZMmSTJ06laeeeoqYmBhSUlKcU4d4MsmJK8mJe5IXV5ITV5IT9yQvorDI9pW2HTt2sGnTJsqUKUONGjWoWrUqAHXq1GHGjBmYpun84BQtWpSWLVuyePFijh8/TmBgIFprNm/ezJEjR3jkkUcIDAxkzJgxVKlSJcdeXF6TnLiSnLgneXElOXElOXFP8iIKqyxfaYuLi+Ott97io48+4sKFC6xcuZIxY8awf/9+AGrXro2/vz/z5s1Ls1379u1JTEzk0KFDAFy+fJnLly/j5+fHPffcw7vvvuuxHxjJiSvJiXuSF1eSE1eSE/ckL6Kwy9KVtqSkJGbPno2fnx+vv/46ISEhALz44otERUVRtWpVSpYsSceOHVmwYAHt2rUjODjY2d4gPDyco0ePAuDr60vv3r2pXLlyzr+qPCQ5cSU5cU/y4kpy4kpy4p7kRYgsXmnz9fXF29ub1q1bExIS4hyQsEGDBhw/fhytNf7+/rRo0YJKlSrx/vvvExMTg1KK06dPEx8fT5MmTZz7KwgfGMmJK8mJe5IXV5ITV5IT9yQvQmRjwviUlBTnQISO8W4+/PBDfH19eeCBB5zrxcbGMnLkSFJTU6lSpQp79uyhbNmyDBs2jMDAwBx9EVaTnLiSnLgneXElOXElOXFP8iIKuywXbe68/PLLtGvXjtatWzvnZDMMg+joaP7++2/27dtHhQoVaN269fUeymNITlxJTtyTvLiSnLiSnLgneRGFyXWP03by5Emio6MpX748YP+wpKSkYBgGoaGhhIaGFrrBCSUnriQn7kleXElOXElO3JO8iMIm2+O0OS7Q7d69Gz8/P2f7gHnz5jF16lTi4+NzJkIPIjlxJTlxT/LiSnLiSnLinuRFFFbZvtLmGMxw//793HjjjezYsYPPPvuMy5cv8+ijj1KiRIkcC9JTSE5cSU7ck7y4kpy4kpy4J3kRhdV13R69fPky27dv5+TJkyxbtow777yT7t2751Bonkly4kpy4p7kxZXkxJXkxD3JiyiMrqto8/HxoXTp0tSrV49Bgwbh4+OTU3F5LMmJK8mJe5IXV5ITV5IT9yQvojC67t6jjm7X4j+SE1eSE/ckL64kJ64kJ+5JXkRhkyNDfgghhBBCiNwlP1GEEEIIITyAFG1CCCGEEB5AijYhhBBCCA8gRZsQQgghhAeQok0IIYQQwgNI0SaEEEII4QGkaBNCCCGE8ABStAkhhBBCeAAp2oQQQgghPIAUbUIIIYQQHuD/pxPVClwDmhIAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "index = 1\n", - "trades[trades.Ticker == tick]\n", - "t_slice = trades.loc[index]\n", - "start = t_slice.EntryTime\n", - "end = t_slice.ExitTime\n", - "id = t_slice.TradeID\n", - "my_slice = slice(start,rm.pm_end_date if pd.isna(end) else end)\n", - "slice_2 = slice('2024-01-01', '2024-12-31')\n", - "\n", - "print(f\"Start: {start}, End: {end}, id: {id}\")\n", - "rm.position_data[id].Midpoint[my_slice].plot()\n", - "plt.title(f\"{tick} {id} Midpoint\")\n", - "plt.show()\n", - "equity[tick][my_slice].plot()\n", - "plt.title(f\"{tick} {id} Equity\")\n", - "plt.show()\n", - "rm.spot_timeseries[tick][my_slice].plot()\n", - "plt.title(f\"{tick} {id} Spot\")\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": 176, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "30" - ] - }, - "execution_count": 176, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "len(diff_value)" - ] - }, - { - "cell_type": "raw", - "metadata": { - "vscode": { - "languageId": "raw" - } - }, - "source": [ - "import nbformat\n", - "\n", - "# Load the notebook file\n", - "with open(\"RiskManager copy.ipynb\", \"r\") as f:\n", - " notebook = nbformat.read(f, as_version=4)\n", - "\n", - "# Iterate through cells and print their position and content\n", - "for i, cell in enumerate(notebook.cells):\n", - " print(f\"Cell {i + 1}:\")\n", - " print(cell.source)" - ] - }, - { - "cell_type": "code", - "execution_count": 132, - "metadata": {}, - "outputs": [ - { - "ename": "KeyError", - "evalue": "'yearly_dividend'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mDateParseError\u001b[0m Traceback (most recent call last)", - "File \u001b[0;32m~/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:603\u001b[0m, in \u001b[0;36mDatetimeIndex.get_loc\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 602\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 603\u001b[0m parsed, reso \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_parse_with_reso\u001b[49m\u001b[43m(\u001b[49m\u001b[43mkey\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 604\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m (\u001b[38;5;167;01mValueError\u001b[39;00m, pytz\u001b[38;5;241m.\u001b[39mNonExistentTimeError) \u001b[38;5;28;01mas\u001b[39;00m err:\n", - "File \u001b[0;32m~/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:559\u001b[0m, in \u001b[0;36mDatetimeIndex._parse_with_reso\u001b[0;34m(self, label)\u001b[0m\n\u001b[1;32m 558\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_parse_with_reso\u001b[39m(\u001b[38;5;28mself\u001b[39m, label: \u001b[38;5;28mstr\u001b[39m):\n\u001b[0;32m--> 559\u001b[0m parsed, reso \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_parse_with_reso\u001b[49m\u001b[43m(\u001b[49m\u001b[43mlabel\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 561\u001b[0m parsed \u001b[38;5;241m=\u001b[39m Timestamp(parsed)\n", - "File \u001b[0;32m~/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:293\u001b[0m, in \u001b[0;36mDatetimeIndexOpsMixin._parse_with_reso\u001b[0;34m(self, label)\u001b[0m\n\u001b[1;32m 291\u001b[0m label \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mstr\u001b[39m(label)\n\u001b[0;32m--> 293\u001b[0m parsed, reso_str \u001b[38;5;241m=\u001b[39m \u001b[43mparsing\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mparse_datetime_string_with_reso\u001b[49m\u001b[43m(\u001b[49m\u001b[43mlabel\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfreqstr\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 294\u001b[0m reso \u001b[38;5;241m=\u001b[39m Resolution\u001b[38;5;241m.\u001b[39mfrom_attrname(reso_str)\n", - "File \u001b[0;32mparsing.pyx:442\u001b[0m, in \u001b[0;36mpandas._libs.tslibs.parsing.parse_datetime_string_with_reso\u001b[0;34m()\u001b[0m\n", - "File \u001b[0;32mparsing.pyx:666\u001b[0m, in \u001b[0;36mpandas._libs.tslibs.parsing.dateutil_parse\u001b[0;34m()\u001b[0m\n", - "\u001b[0;31mDateParseError\u001b[0m: Unknown datetime string format, unable to parse: yearly_dividend", - "\nThe above exception was the direct cause of the following exception:\n", - "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[132], line 4\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtrade\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01massets\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mStock\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m Stock \n\u001b[1;32m 3\u001b[0m cost \u001b[38;5;241m=\u001b[39m Stock(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mCOST\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m----> 4\u001b[0m \u001b[43mcost\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdiv_yield_history\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdiv_type\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mvalue\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/backoff/_sync.py:105\u001b[0m, in \u001b[0;36mretry_exception..retry\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 96\u001b[0m details \u001b[38;5;241m=\u001b[39m {\n\u001b[1;32m 97\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtarget\u001b[39m\u001b[38;5;124m\"\u001b[39m: target,\n\u001b[1;32m 98\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124margs\u001b[39m\u001b[38;5;124m\"\u001b[39m: args,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 101\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124melapsed\u001b[39m\u001b[38;5;124m\"\u001b[39m: elapsed,\n\u001b[1;32m 102\u001b[0m }\n\u001b[1;32m 104\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 105\u001b[0m ret \u001b[38;5;241m=\u001b[39m \u001b[43mtarget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 106\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m exception \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 107\u001b[0m max_tries_exceeded \u001b[38;5;241m=\u001b[39m (tries \u001b[38;5;241m==\u001b[39m max_tries_value)\n", - "File \u001b[0;32m~/cloned_repos/QuantTools/trade/assets/Stock.py:384\u001b[0m, in \u001b[0;36mStock.div_yield_history\u001b[0;34m(self, start, ts_timeframe, ts_timewidth, div_type)\u001b[0m\n\u001b[1;32m 382\u001b[0m dates \u001b[38;5;241m=\u001b[39m pd\u001b[38;5;241m.\u001b[39mdate_range(start \u001b[38;5;241m=\u001b[39m div_history\u001b[38;5;241m.\u001b[39mindex\u001b[38;5;241m.\u001b[39mmin(), end \u001b[38;5;241m=\u001b[39m datetime\u001b[38;5;241m.\u001b[39mtoday() ,freq \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mB\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m 383\u001b[0m div_history \u001b[38;5;241m=\u001b[39m div_history\u001b[38;5;241m.\u001b[39mreindex(dates, method \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mffill\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m--> 384\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mresample\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdiv_history\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43myearly_dividend\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minterval\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m{\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43myearly_dividend\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m:\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mlast\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m}\u001b[49m\u001b[43m)\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43myearly_dividend\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\n\u001b[1;32m 385\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m div_type \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124myield\u001b[39m\u001b[38;5;124m'\u001b[39m:\n\u001b[1;32m 386\u001b[0m \u001b[38;5;28;01mpass\u001b[39;00m\n", - "File \u001b[0;32m~/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/pandas/core/series.py:1121\u001b[0m, in \u001b[0;36mSeries.__getitem__\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 1118\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_values[key]\n\u001b[1;32m 1120\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m key_is_scalar:\n\u001b[0;32m-> 1121\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_get_value\u001b[49m\u001b[43m(\u001b[49m\u001b[43mkey\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1123\u001b[0m \u001b[38;5;66;03m# Convert generator to list before going through hashable part\u001b[39;00m\n\u001b[1;32m 1124\u001b[0m \u001b[38;5;66;03m# (We will iterate through the generator there to check for slices)\u001b[39;00m\n\u001b[1;32m 1125\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m is_iterator(key):\n", - "File \u001b[0;32m~/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/pandas/core/series.py:1237\u001b[0m, in \u001b[0;36mSeries._get_value\u001b[0;34m(self, label, takeable)\u001b[0m\n\u001b[1;32m 1234\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_values[label]\n\u001b[1;32m 1236\u001b[0m \u001b[38;5;66;03m# Similar to Index.get_value, but we do not fall back to positional\u001b[39;00m\n\u001b[0;32m-> 1237\u001b[0m loc \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mindex\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_loc\u001b[49m\u001b[43m(\u001b[49m\u001b[43mlabel\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1239\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m is_integer(loc):\n\u001b[1;32m 1240\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_values[loc]\n", - "File \u001b[0;32m~/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:605\u001b[0m, in \u001b[0;36mDatetimeIndex.get_loc\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 603\u001b[0m parsed, reso \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_parse_with_reso(key)\n\u001b[1;32m 604\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m (\u001b[38;5;167;01mValueError\u001b[39;00m, pytz\u001b[38;5;241m.\u001b[39mNonExistentTimeError) \u001b[38;5;28;01mas\u001b[39;00m err:\n\u001b[0;32m--> 605\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m(key) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01merr\u001b[39;00m\n\u001b[1;32m 606\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_disallow_mismatched_indexing(parsed)\n\u001b[1;32m 608\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_can_partial_date_slice(reso):\n", - "\u001b[0;31mKeyError\u001b[0m: 'yearly_dividend'" - ] - } - ], - "source": [ - "del Stock\n", - "from trade.assets.Stock import Stock \n", - "cost = Stock('COST')\n", - "cost.div_yield_history(div_type = 'value')" - ] - }, - { - "cell_type": "code", - "execution_count": 124, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "http://127.0.0.1:25510/v2/hist/option/eod?end_date=20240101&root=COST&use_csv=true&exp=20240621&right=C&start_date=20231214&strike=655000\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
OpenHighLowCloseVolumeBid_sizeCloseBidAsk_sizeCloseAskMidpointWeighted_midpoint
Datetime
2023-12-27 16:00:0049.6352.3849.6351.40101550.653153.0551.85052.267391
2023-12-27 16:00:0049.6352.3849.6351.40101550.653153.0551.85052.267391
2023-12-28 16:00:0050.5550.5548.0848.08271047.703250.4549.07549.795238
2023-12-28 16:00:0050.5550.5548.0848.08271047.703250.4549.07549.795238
2023-12-29 16:00:0046.8046.8045.0045.00121644.901348.7546.82546.625862
2023-12-29 16:00:0046.8046.8045.0045.00121644.901348.7546.82546.625862
\n", - "
" - ], - "text/plain": [ - " Open High Low Close Volume Bid_size CloseBid \\\n", - "Datetime \n", - "2023-12-27 16:00:00 49.63 52.38 49.63 51.40 10 15 50.65 \n", - "2023-12-27 16:00:00 49.63 52.38 49.63 51.40 10 15 50.65 \n", - "2023-12-28 16:00:00 50.55 50.55 48.08 48.08 27 10 47.70 \n", - "2023-12-28 16:00:00 50.55 50.55 48.08 48.08 27 10 47.70 \n", - "2023-12-29 16:00:00 46.80 46.80 45.00 45.00 12 16 44.90 \n", - "2023-12-29 16:00:00 46.80 46.80 45.00 45.00 12 16 44.90 \n", - "\n", - " Ask_size CloseAsk Midpoint Weighted_midpoint \n", - "Datetime \n", - "2023-12-27 16:00:00 31 53.05 51.850 52.267391 \n", - "2023-12-27 16:00:00 31 53.05 51.850 52.267391 \n", - "2023-12-28 16:00:00 32 50.45 49.075 49.795238 \n", - "2023-12-28 16:00:00 32 50.45 49.075 49.795238 \n", - "2023-12-29 16:00:00 13 48.75 46.825 46.625862 \n", - "2023-12-29 16:00:00 13 48.75 46.825 46.625862 " - ] - }, - "execution_count": 124, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "retrieve_eod_ohlc(\n", - " 'COST', \n", - " start_date='2023-12-14', \n", - " end_date='2024-01-01', \n", - " strike = 670.0-15.0,\n", - " right = 'C',\n", - " exp = '20240621',\n", - " print_url=True\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 97, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "datetime\n", - "2024-01-03 NaN\n", - "2024-01-04 0.701722\n", - "2024-01-05 1.049713\n", - "2024-01-08 0.784577\n", - "2024-01-09 0.734864\n", - "2024-01-10 0.701722\n", - "2024-01-11 0.691779\n", - "2024-01-12 0.658637\n", - "2024-01-15 0.658637\n", - "2024-01-16 0.492927\n", - "Name: BA, dtype: float64" - ] - }, - "execution_count": 97, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "eq_normalized" - ] - }, - { - "cell_type": "code", - "execution_count": 189, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
longshorttrade_idclosequantitymarket_valueCOST20240103LONG
datetimesymbol
2024-10-22META[META20250815C700][META20250815C705]&L:META20250815C700&S:META20250815C7050.95484560.0META20240927LONG
NFLX[NFLX20250117C740][NFLX20250117C745]&L:NFLX20250117C740&S:NFLX20250117C7453.152630.0NFLX20240103LONG
NVDA[NVDA20250321C1480][NVDA20250321C1490]&L:NVDA20250321C1480&S:NVDA20250321C14904.003514000.0NVDA20240112LONG
SBUX[SBUX20250417C110][SBUX20250417C115]&L:SBUX20250417C110&S:SBUX20250417C1151.03131339.0SBUX20240816LONG
SBUX[SBUX20250417C110][SBUX20250417C115]&L:SBUX20250417C110&S:SBUX20250417C1151.035515.0SBUX20240212LONG
META[META20250815C700][META20250815C705]&L:META20250815C700&S:META20250815C7050.95484560.0META20240927LONG
NVDA[NVDA20250321C1480][NVDA20250321C1490]&L:NVDA20250321C1480&S:NVDA20250321C14904.003514000.0NVDA20240112LONG
SBUX[SBUX20250417C110][SBUX20250417C115]&L:SBUX20250417C110&S:SBUX20250417C1151.03131339.0SBUX20240816LONG
SBUX[SBUX20250417C110][SBUX20250417C115]&L:SBUX20250417C110&S:SBUX20250417C1151.035515.0SBUX20240212LONG
META[META20250815C700][META20250815C705]&L:META20250815C700&S:META20250815C7050.95484560.0META20240927LONG
COST[COST20250815C880][COST20250815C885]&L:COST20250815C880&S:COST20250815C8850.659585.0COST20240103LONG
NVDA[NVDA20250321C1480][NVDA20250321C1490]&L:NVDA20250321C1480&S:NVDA20250321C14904.003514000.0NVDA20240112LONG
SBUX[SBUX20250417C110][SBUX20250417C115]&L:SBUX20250417C110&S:SBUX20250417C1151.03131339.0SBUX20240816LONG
SBUX[SBUX20250417C110][SBUX20250417C115]&L:SBUX20250417C110&S:SBUX20250417C1151.035515.0SBUX20240212LONG
META[META20250815C700][META20250815C705]&L:META20250815C700&S:META20250815C7050.95484560.0META20240927LONG
COST[COST20250815C880][COST20250815C885]&L:COST20250815C880&S:COST20250815C8850.659585.0COST20240103LONG
NFLX[NFLX20250815C935][NFLX20250815C940]&L:NFLX20250815C935&S:NFLX20250815C9400.807560.0NFLX20240103LONG
NVDA[NVDA20250321C1480][NVDA20250321C1490]&L:NVDA20250321C1480&S:NVDA20250321C14904.003514000.0NVDA20240112LONG
SBUX[SBUX20250417C110][SBUX20250417C115]&L:SBUX20250417C110&S:SBUX20250417C1151.03131339.0SBUX20240816LONG
SBUX[SBUX20250417C110][SBUX20250417C115]&L:SBUX20250417C110&S:SBUX20250417C1151.035515.0SBUX20240212LONG
META[META20250815C700][META20250815C705]&L:META20250815C700&S:META20250815C7050.95484560.0META20240927LONG
COST[COST20250815C880][COST20250815C885]&L:COST20250815C880&S:COST20250815C8850.659585.0COST20240103LONG
NFLX[NFLX20250815C935][NFLX20250815C940]&L:NFLX20250815C935&S:NFLX20250815C9400.807560.0NFLX20240103LONG
NVDA[NVDA20250321C1480][NVDA20250321C1490]&L:NVDA20250321C1480&S:NVDA20250321C14904.003514000.0NVDA20240112LONG
SBUX[SBUX20250417C110][SBUX20250417C115]&L:SBUX20250417C110&S:SBUX20250417C1151.03131339.0SBUX20240816LONG
SBUX[SBUX20250417C110][SBUX20250417C115]&L:SBUX20250417C110&S:SBUX20250417C1151.035515.0SBUX20240212LONG
\n", - "
" - ], - "text/plain": [ - " long short \\\n", - "datetime symbol \n", - "2024-10-22 META [META20250815C700] [META20250815C705] \n", - " NFLX [NFLX20250117C740] [NFLX20250117C745] \n", - " NVDA [NVDA20250321C1480] [NVDA20250321C1490] \n", - " SBUX [SBUX20250417C110] [SBUX20250417C115] \n", - " SBUX [SBUX20250417C110] [SBUX20250417C115] \n", - " META [META20250815C700] [META20250815C705] \n", - " NVDA [NVDA20250321C1480] [NVDA20250321C1490] \n", - " SBUX [SBUX20250417C110] [SBUX20250417C115] \n", - " SBUX [SBUX20250417C110] [SBUX20250417C115] \n", - " META [META20250815C700] [META20250815C705] \n", - " COST [COST20250815C880] [COST20250815C885] \n", - " NVDA [NVDA20250321C1480] [NVDA20250321C1490] \n", - " SBUX [SBUX20250417C110] [SBUX20250417C115] \n", - " SBUX [SBUX20250417C110] [SBUX20250417C115] \n", - " META [META20250815C700] [META20250815C705] \n", - " COST [COST20250815C880] [COST20250815C885] \n", - " NFLX [NFLX20250815C935] [NFLX20250815C940] \n", - " NVDA [NVDA20250321C1480] [NVDA20250321C1490] \n", - " SBUX [SBUX20250417C110] [SBUX20250417C115] \n", - " SBUX [SBUX20250417C110] [SBUX20250417C115] \n", - " META [META20250815C700] [META20250815C705] \n", - " COST [COST20250815C880] [COST20250815C885] \n", - " NFLX [NFLX20250815C935] [NFLX20250815C940] \n", - " NVDA [NVDA20250321C1480] [NVDA20250321C1490] \n", - " SBUX [SBUX20250417C110] [SBUX20250417C115] \n", - " SBUX [SBUX20250417C110] [SBUX20250417C115] \n", - "\n", - " trade_id close quantity \\\n", - "datetime symbol \n", - "2024-10-22 META &L:META20250815C700&S:META20250815C705 0.95 48 \n", - " NFLX &L:NFLX20250117C740&S:NFLX20250117C745 3.15 2 \n", - " NVDA &L:NVDA20250321C1480&S:NVDA20250321C1490 4.00 35 \n", - " SBUX &L:SBUX20250417C110&S:SBUX20250417C115 1.03 13 \n", - " SBUX &L:SBUX20250417C110&S:SBUX20250417C115 1.03 5 \n", - " META &L:META20250815C700&S:META20250815C705 0.95 48 \n", - " NVDA &L:NVDA20250321C1480&S:NVDA20250321C1490 4.00 35 \n", - " SBUX &L:SBUX20250417C110&S:SBUX20250417C115 1.03 13 \n", - " SBUX &L:SBUX20250417C110&S:SBUX20250417C115 1.03 5 \n", - " META &L:META20250815C700&S:META20250815C705 0.95 48 \n", - " COST &L:COST20250815C880&S:COST20250815C885 0.65 9 \n", - " NVDA &L:NVDA20250321C1480&S:NVDA20250321C1490 4.00 35 \n", - " SBUX &L:SBUX20250417C110&S:SBUX20250417C115 1.03 13 \n", - " SBUX &L:SBUX20250417C110&S:SBUX20250417C115 1.03 5 \n", - " META &L:META20250815C700&S:META20250815C705 0.95 48 \n", - " COST &L:COST20250815C880&S:COST20250815C885 0.65 9 \n", - " NFLX &L:NFLX20250815C935&S:NFLX20250815C940 0.80 7 \n", - " NVDA &L:NVDA20250321C1480&S:NVDA20250321C1490 4.00 35 \n", - " SBUX &L:SBUX20250417C110&S:SBUX20250417C115 1.03 13 \n", - " SBUX &L:SBUX20250417C110&S:SBUX20250417C115 1.03 5 \n", - " META &L:META20250815C700&S:META20250815C705 0.95 48 \n", - " COST &L:COST20250815C880&S:COST20250815C885 0.65 9 \n", - " NFLX &L:NFLX20250815C935&S:NFLX20250815C940 0.80 7 \n", - " NVDA &L:NVDA20250321C1480&S:NVDA20250321C1490 4.00 35 \n", - " SBUX &L:SBUX20250417C110&S:SBUX20250417C115 1.03 13 \n", - " SBUX &L:SBUX20250417C110&S:SBUX20250417C115 1.03 5 \n", - "\n", - " market_value COST20240103LONG \n", - "datetime symbol \n", - "2024-10-22 META 4560.0 META20240927LONG \n", - " NFLX 630.0 NFLX20240103LONG \n", - " NVDA 14000.0 NVDA20240112LONG \n", - " SBUX 1339.0 SBUX20240816LONG \n", - " SBUX 515.0 SBUX20240212LONG \n", - " META 4560.0 META20240927LONG \n", - " NVDA 14000.0 NVDA20240112LONG \n", - " SBUX 1339.0 SBUX20240816LONG \n", - " SBUX 515.0 SBUX20240212LONG \n", - " META 4560.0 META20240927LONG \n", - " COST 585.0 COST20240103LONG \n", - " NVDA 14000.0 NVDA20240112LONG \n", - " SBUX 1339.0 SBUX20240816LONG \n", - " SBUX 515.0 SBUX20240212LONG \n", - " META 4560.0 META20240927LONG \n", - " COST 585.0 COST20240103LONG \n", - " NFLX 560.0 NFLX20240103LONG \n", - " NVDA 14000.0 NVDA20240112LONG \n", - " SBUX 1339.0 SBUX20240816LONG \n", - " SBUX 515.0 SBUX20240212LONG \n", - " META 4560.0 META20240927LONG \n", - " COST 585.0 COST20240103LONG \n", - " NFLX 560.0 NFLX20240103LONG \n", - " NVDA 14000.0 NVDA20240112LONG \n", - " SBUX 1339.0 SBUX20240816LONG \n", - " SBUX 515.0 SBUX20240212LONG " - ] - }, - "execution_count": 189, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "positions[positions.index.get_level_values(0) == '2024-10-22']" - ] - }, - { - "cell_type": "code", - "execution_count": 190, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
longshorttrade_idclosequantitymarket_valueCOST20240103LONG
datetimesymbol
2024-10-23META[META20250815C700][META20250815C705]&L:META20250815C700&S:META20250815C7051.325486360.0META20240927LONG
COST[COST20250815C880][COST20250815C885]&L:COST20250815C880&S:COST20250815C8853.57593217.5COST20240103LONG
NFLX[NFLX20250815C935][NFLX20250815C940]&L:NFLX20250815C935&S:NFLX20250815C9400.6007420.0NFLX20240103LONG
NVDA[NVDA20250321C1480][NVDA20250321C1490]&L:NVDA20250321C1480&S:NVDA20250321C14904.0003514000.0NVDA20240112LONG
SBUX[SBUX20250417C110][SBUX20250417C115]&L:SBUX20250417C110&S:SBUX20250417C1151.085131410.5SBUX20240816LONG
SBUX[SBUX20250417C110][SBUX20250417C115]&L:SBUX20250417C110&S:SBUX20250417C1151.0855542.5SBUX20240212LONG
\n", - "
" - ], - "text/plain": [ - " long short \\\n", - "datetime symbol \n", - "2024-10-23 META [META20250815C700] [META20250815C705] \n", - " COST [COST20250815C880] [COST20250815C885] \n", - " NFLX [NFLX20250815C935] [NFLX20250815C940] \n", - " NVDA [NVDA20250321C1480] [NVDA20250321C1490] \n", - " SBUX [SBUX20250417C110] [SBUX20250417C115] \n", - " SBUX [SBUX20250417C110] [SBUX20250417C115] \n", - "\n", - " trade_id close quantity \\\n", - "datetime symbol \n", - "2024-10-23 META &L:META20250815C700&S:META20250815C705 1.325 48 \n", - " COST &L:COST20250815C880&S:COST20250815C885 3.575 9 \n", - " NFLX &L:NFLX20250815C935&S:NFLX20250815C940 0.600 7 \n", - " NVDA &L:NVDA20250321C1480&S:NVDA20250321C1490 4.000 35 \n", - " SBUX &L:SBUX20250417C110&S:SBUX20250417C115 1.085 13 \n", - " SBUX &L:SBUX20250417C110&S:SBUX20250417C115 1.085 5 \n", - "\n", - " market_value COST20240103LONG \n", - "datetime symbol \n", - "2024-10-23 META 6360.0 META20240927LONG \n", - " COST 3217.5 COST20240103LONG \n", - " NFLX 420.0 NFLX20240103LONG \n", - " NVDA 14000.0 NVDA20240112LONG \n", - " SBUX 1410.5 SBUX20240816LONG \n", - " SBUX 542.5 SBUX20240212LONG " - ] - }, - "execution_count": 190, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "positions[positions.index.get_level_values(0) == '2024-10-23']" - ] - }, - { - "cell_type": "code", - "execution_count": 83, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Datetime\n", - "2024-08-28 0.70\n", - "2024-08-29 2.55\n", - "2024-08-30 2.30\n", - "Freq: B, Name: Midpoint, dtype: float64" - ] - }, - "execution_count": 83, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rm.position_data[id].Midpoint['2024-08-28': '2024-08-30']\n", - "# id" - ] - }, - { - "cell_type": "code", - "execution_count": 124, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'&L:TSLA20250417C200&S:TSLA20250417C205'" - ] - }, - "execution_count": 124, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rm.spot_timeseries['TSLA']['2024-08-27':]\n", - "id" - ] - }, - { - "cell_type": "code", - "execution_count": 101, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'&L:TSLA20250417C200&S:TSLA20250417C205'" - ] - }, - "execution_count": 101, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "id" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "MAD Skip 0.7876447876447876\n", - "Quantile Skip 0.9420849420849421\n" - ] - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiMAAAGkCAYAAADjdyVMAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB+DUlEQVR4nO2dd5wU5f3HP8/cXu/H3XH0DoKiYA3YUIwaxYKxi1FjjAWDiamWGIyQiCVRo7/EHrsiEUWwYCPGjqIgRZAOxx3cwRWu3+08vz/mdndmdrbN7s7u3X7erxcvbmenPPvd2ZnPfNsjpJQShBBCCCEJQkn0AAghhBCS2lCMEEIIISShUIwQQgghJKFQjBBCCCEkoVCMEEIIISShUIwQQgghJKFQjBBCCCEkoVCMEEIIISShUIwQQgghJKG4Ej2ASKirq0NXV5ejxywrK0NNTY2jx+xt0IbRQftFB+0XObSZfWg7Iy6XC8XFxaHXc2AsMaOrqwudnZ2OHU8I4T0uu+bbgzaMDtovOmi/yKHN7EPb2YdhGkIIIYQkFIoRQgghhCQUihFCCCGEJBSKEUIIIYQkFIoRQgghhCQUihFCCCGEJBSKEUIIIYQkFIoRQgghhCQUihFCCCGEJBSKEUIIIYQkFIqRBCClhGzen+hhEEIIIUkBxUgCUP9xB9RfXQr143cTPRRCCCEk4VCMOIys2wt8+yUgVch/P5Do4RBCCCEJh2LEabqcm3WYEEII6Qm4Ill54cKF+OKLL1BZWYmMjAyMHj0aM2bMQP/+/QNus2zZMvzf//2fYVl6ejqee+45eyMmhBBCSK8iIjGydu1anHLKKRgxYgTcbjdeeOEFzJkzB3/729+QlZUVcLvs7Gzcf//9UQ+WEEIIIb2PiMTILbfcYng9c+ZM/OxnP8PmzZsxbty4gNsJIVBUVGRrgIQQQgjp3UQkRsy0tLQAAPLy8oKu19bWhuuuuw5SSgwbNgwXXXQRBg0aFHD9zs5OdHb6ciuEEMjOzvb+7RSeY8X0mKZ9Ofl5EkFcbJhC0H7RQftFDm1mH9rOPkJKKe1sqKoq7rrrLjQ3N+OOO+4IuN6GDRtQVVWFIUOGoKWlBYsWLcK6devwt7/9DX369LHcZv78+ViwYIH39bBhwzBv3jw7w0w6uqorUXXlWd7Xg5Z8mcDREEIIIYnHthh59NFH8c033+DPf/5zQFFhRVdXF371q1/h6KOPxoUXXmi5TiDPSE1NDbq6uuwM1xZCCFRUVKC6uho2zeSHrKmG+6arvK9dj70ek/0mK/GwYSpB+0UH7Rc5tJl9aDt/XC4XysrKQq9nZ+ePP/44VqxYgdtvvz0iIeIZ2LBhw1BdXR1wnfT0dKSnp1u+l4gvWEoZOzFi2k+qnLCxtGEqQvtFB+0XObSZfWi7yImoz4iUEo8//ji++OIL3HbbbSgvL4/4gKqqYvv27SguLo54W0IIIYT0PiLyjDz++OP46KOP8Lvf/Q7Z2dmor68HAOTk5CAjIwMA8OCDD6KkpAQXX3wxAGDBggUYNWoUKioq0NzcjEWLFqGmpgZTp06N7SchhBBCSI8kIjGydOlSAMDs2bMNy6+77jpMmTIFAFBbW2vIJG5qasLDDz+M+vp65ObmYvjw4ZgzZw4GDhwY3cgJIYQQ0iuISIzMnz8/5DpmoXL55Zfj8ssvj+QwhBBCCEkhODcNIYQQQhIKxYjTMMOaEEIIMUAx4jQUI4QQQogBihGnoRghhBBCDFCMOA7FCCGEEKKHYsRp6BkhhBBCDFCMOA3FCCGEEGKAYsRpqEUIIYQQAxQjTiPVRI+AEEIISSooRhyHrhFCCCFED8WI01CLEEIIIQYoRpyGYRpCCCHEAMWI09AzQgghhBigGHEcqhFCCCFED8WI07DPCCGEEGKAYsRpKEYIIYQQAxQjTkMxQgghhBigGHEaihFCCCHEAMWI01CMEEIIIQYoRhyHYoQQQgjRQzHiNNQihBBCiAGKEadhB1ZCCCHEAMWI09AzQgghhBigGHEcqhFCCCFED8WI07CahhBCCDFAMeI0FCOEEEKIAYoRp6EYIYQQQgxQjDgOxQghhBCih2LEaVSKEUIIIUQPxYjjUIwQQggheihGnIZahBBCCDFAMeI07MBKCCGEGKAYcRp6RgghhBADFCOOQzVCCCGE6KEYcRqGaQghhBADFCNOQ8cIIYQQYoBixGnYgZUQQggxQDHiOBQjhBBCiB6KEaehZ4QQQggxQDHiNBQjhBBCiAGKEYehFiGEEEKMUIw4DUt7CSGEEAMUI05D1wghhBBigGIkwUiKE0IIISkOxYjTmMM0FCOEEEJSHIoRp/HTHhQjhBBCUhuKEacxe0KoRQghhKQ4rkhWXrhwIb744gtUVlYiIyMDo0ePxowZM9C/f/+g23366ad46aWXUFNTg4qKClxyySU49NBDoxp4j8VPjKgA0hIyFEIIISQZiMgzsnbtWpxyyimYO3cubr31VrjdbsyZMwdtbW0Bt1m/fj3uv/9+nHjiiZg3bx6OOOII3H333di+fXvUg++Z0DNCCCGE6IlIjNxyyy2YMmUKBg0ahKFDh2LmzJmora3F5s2bA27zxhtvYMKECTjzzDMxcOBAXHjhhRg+fDjeeuutqAffI/FLWKUaIYQQktpEFKYx09LSAgDIy8sLuM6GDRswbdo0w7JDDjkEy5cvD7hNZ2cnOjs7va+FEMjOzvb+7RSeY8XymAJG+SGkdPQzOU08bJhK0H7RQftFDm1mH9rOPrbFiKqq+Pe//40xY8Zg8ODBAderr69HYWGhYVlhYSHq6+sDbrNw4UIsWLDA+3rYsGGYN28eysrK7A43KioqKmK2r6aCAtSZ9q1kZcds/8lKLG2YitB+0UH7RQ5tZh/aLnJsi5HHH38cO3bswJ///OdYjgcAMH36dIM3xaMya2pq0NXVFfPjBUIIgYqKClRXV8esOZlqEmHVVVUQvViMxMOGqQTtFx20X+TQZvah7fxxuVxhORJsiZHHH38cK1aswO23344+ffoEXbeoqAgNDQ2GZQ0NDSgqKgq4TXp6OtLT0y3fS8QXLKWM2XHN+5GqmhKNz2Jpw1SE9osO2i9yaDP70HaRE1ECq5QSjz/+OL744gvcdtttKC8vD7nN6NGj8e233xqWrVq1CqNGjYpspL0FdmAlhBBCDEQkRh5//HH873//ww033IDs7GzU19ejvr4eHR0d3nUefPBBPP/8897Xp512GlauXInXX38dlZWVmD9/PjZt2oRTTz01dp+iJ8EOrIQQQoiBiMI0S5cuBQDMnj3bsPy6667DlClTAAC1tbWGTOIxY8Zg1qxZePHFF/HCCy+gX79++O1vfxs06bV3wz4jhBBCiJ6IxMj8+fNDrmMWKgAwadIkTJo0KZJD9V5Uqw6shBBCSOrCuWkch54RQgghRA/FiNOwAyshhBBigGLEcRimIYQQQvRQjDiNX85IYoZBCCGEJAsUI45jFiNUI4QQQlIbihGnYZ8RQgghxADFiNOYc0TMYRtCCCEkxaAYcRp6RgghhBADFCOOwwRWQgghRA/FiNOo5onyWNpLCCEktaEYSTSspiGEEJLiUIw4DcUHIYQQYoBixGnMYoTihBBCSIpDMeI0FCOEEEKIAYoRx6EYIYQQQvRQjDgN+4wQQgghBihGnMZcykvPCCGEkBSHYsRpzNqDYoQQQkiKQzHiOOzASgghhOihGHEavzANO7ASQghJbShGnIYJrIQQQogBihGn8eszkphhEEIIIckCxYjTsOkZIYQQYoBixHEoRgghhBA9FCNO4yc+KEYIIYSkNhQjTsM+I4QQQogBihGnYQdWQgghxADFSKKhGCGEEJLiUIw4DatpCCGEEAMUI07DjquEEEKIAYoRp/FLYKU4IYQQktpQjDgOO7ASQggheihGnEZlzgghhBCih2LEcShGCCGEED0UI07DDqyEEEKIAYoRp2FpLyGEEGKAYsRpKEYIIYQQAxQjjkMxQgghhOihGHEaP+1BMUIIISS1oRhxGr+J8hIzDEIIISRZoBhxGnZgJYQQQgxQjDgOO7ASQggheihGnMbcgZVqhBBCSIpDMeI4JvHhJ04IIYSQ1IJixGnYgZUQQggxQDHiNGx6RgghhBigGHEaekYIIYQQAxQjDiOZM0IIIYQYcEW6wdq1a7Fo0SJs2bIFdXV1+M1vfoMjjzwy4Ppr1qzB7bff7rf8kUceQVFRUaSH7/mwAyshhBBiIGIx0t7ejqFDh+LEE0/EPffcE/Z29913H3JycryvCwoKIj1074AdWAkhhBADEYuRiRMnYuLEiREfqLCwELm5uWGt29nZic7OTu9rIQSys7O9fzuF51ixPKaAWX/IuH0m9f3FUBc+A3R0QBx5HNKu/FVcjhOMeNgwlaD9ooP2ixzazD60nX0iFiN2+d3vfofOzk4MGjQI5513Hg444ICA6y5cuBALFizwvh42bBjmzZuHsrIyJ4bqR0VFRcz2VZuZiVbd6+KiIuT06xez/evZ9fYrQGsLAEB++j7KrpwFV7+BcTlWKGJpw1SE9osO2i9yaDP70HaRE3cxUlxcjKuuugojRoxAZ2cn3nvvPdx+++2YO3cuhg8fbrnN9OnTMW3aNO9rj8qsqalBV1dXvIdsOG5FRQWqq6shY1SC625tNbyu21eHhqqqmOzb/1gthtd7KndCIC0uxwpEPGyYStB+0UH7RQ5tZh/azh+XyxWWIyHuYqR///7o37+/9/WYMWOwe/duLFmyBL/4xS8st0lPT0d6errle4n4gqWUMTuueT9SqvH7TKoxP0Wq7oT1NYmlDVMR2i86aL/Ioc3sQ9tFTkJKe0eOHInq6upEHDrxONn0zLxvlTMEE0IIST4SIka2bt2K4uLiRBw68TgqRsyVO1TqhBBCko+IwzRtbW0Gr8aePXuwdetW5OXlobS0FM8//zz27duH66+/HgCwZMkSlJeXY9CgQejo6MD777+P1atX49Zbb43dp+hRONiB1ewJYYM1QgghSUjEYmTTpk2GJmZPP/00AOD444/HzJkzUVdXh9raWu/7XV1dePrpp7Fv3z5kZmZiyJAh+OMf/4iDDjooBsPvgfiFTpwM07jjdyxCCCHEJhGLkQMPPBDz588P+P7MmTMNr8866yycddZZkY+st+Lk3DRmocMwDSGEkCSEc9M4jV/OSLwOI5kzQgghpEdAMZJw4qZG/JexmoYQQkgSQjHiNE6V21qJEbOnhESE3FcDuX1zoodBCCG9DooRp3EqVGIlchimsY1srId6yzVQ7/gl5OqvEj0cQgjpVVCMOI1TfUasvCD0jNhGLn0V6NImb1QfnJPYwRBCSC+DYsRxnBIjzBmJKfqyaDdLpAkhJJZQjDiNU+W2DNMQQgjpIVCMOI5DfUasQjLswEoIISQJoRhxmjByRuSG1VD/txSyszN2xwEAyfACIYSQ5CPiDqwkSkKIEbl3D9S7b9ZeNNZDnH6+veNYhWnoGSGEEJKE0DPiNCE6sMqvPvH9/eqzURyHOSOEEEJ6BhQjCSdOOSQWXhDJahpCCCFJCMWI0/h5Rszzx8ToOJbVNBQjthEi0SMghJBeC8WI04ScKC9GasQygZVhGkIIIckHxYjThKqmiZVgYAdWQgghPQSKEcdJYNMz5owQQghJQihGnMYvsTRU2MYmDNMQQgjpIVCMOE4oz0isqmnoGSGEENIzoBhxmlAJrMwZSU7oVSKEkLhBMeI0oUp743UcgB1YCSGEJCUUI07jVDUNZ+2NLewzQgghcYNipLdiOWsvwzSEEEKSD4oRp/HruGp+Hc+mZxQjhBBCkg+KEaeJU/GMHwzTEEII6SFQjDhNyByReOaM0DNCCCEk+aAYcZxQCayxOoxVNQ3FCCGEkOSDYsRpQnlCWE1DCCEkxaAYcRqnwjT0jBBCCOkhUIw4TcgOrLE6DnNGYgq9SoQQEjcoRpwmZAfWeM5NwxuqbehVIoSQuEEx4jgO1fZy1t7YQjFCCCFxw5XoAaQcobRIPCfK4w3VPgxx9ShkZyewZT2Q5oIsL0v0cAghIaAYcZqQHVhjdBz2GYktFHI9BqmqUOfeCFRuAwDUHj4ZuOamBI+KEBIMhmmcJmSUJp7t4BmmsQ3FSM+hfp9XiABA25efQLrdCRwQISQUFCOO41CfEVbTxBaKkZ6DaiE8WpudHwchJGwoRpwmke3geUO1D23Xc7ASIy0UI4QkMxQjThNKjMSzHTzDNPahV6nn4Lb4rlqanB8HISRsKEacJpQYidETuLTqKUIxYh96RnoO7i6/RZKeEUKSGooRxwkhCGJ107NyVVstI+FBMdJzYJiGkB4HxYjTmD0W5ptcrMIBDNPEFMkwTc+BYRpCehwUI44TImE1Vk/glhPlUYzYhp6RngM9I4T0OChGnCZkB9ZYhWlY2htTKEZ6DhY9RSQ9I4QkNRQjThNqYryYeUZY2htTaLueg6VnhGKEkGSGYsRpzJ6QUDkkto/DnJGYQjHSc2CYhpAeB8WI4ziUM8IwTWyh7XoOTGAlpMdBMeI0fhPjMUzTI6Dteg4WnhH2GSEkuaEYcRo/xwjDND0CekZ6DhZNz+gZISS5cUW6wdq1a7Fo0SJs2bIFdXV1+M1vfoMjjzwy6DZr1qzB008/jR07dqBPnz748Y9/jClTptgdc88mZDv4eIZpKEZsY7KnlBJCiAQNhgRDWoZp6BkhJJmJ2DPS3t6OoUOH4sorrwxr/T179uDOO+/EgQceiLvuugunn346/vWvf+Gbb76J9NC9hOA5I1LvYo7mZmchaiQ7sNrHLO4YtkleAlTTSIpxQpKWiD0jEydOxMSJE8Nef+nSpSgvL8dPfvITAMDAgQPx3XffYcmSJZgwYUKkh+/5+IVlgoVpohAjnJsmtliJkbS0uB1OblgN9a1XoBx3MtDvnLgdp1di0WcEXV1AZweQken8eAghIYlYjETK999/j/HjxxuWHXLIIfj3v/8dcJvOzk50dnZ6XwshkJ2d7f3bKTzHiukxLQSBfv9CSp+vRNg/tmE/umVOhxbiYsNEYBIjQqpx/Uzuu2/WDvvtl8Bp5/R8+zmIkKrlDFCitRkiM8vx8fQ0es1vNgHQdvaJuxipr69HYWGhYVlhYSFaW1vR0dGBjIwMv20WLlyIBQsWeF8PGzYM8+bNQ1lZWbyHa0lFRUXM9rXD9Do7Owt9+vXzvq5JT0eb54UQ6Kd7LxIa83LRYFqWmZGBMpv7i5ZY2jARVKeloVP3uqK8HEpObtyOZz5Perr9nKQpLw91FsvLcnOQnqDzvyfCc84+tF3kxF2M2GH69OmYNm2a97VHZdbU1KCryyJTPk4IIVBRUYHq6urYxZtNT9itLS2oqqryvna3thje178X0WEazFIEaG9tsb0/u8TFhgmgq6PD8Lq6ahdETp5jx+/p9nMStW6f70VeAdDUCACo2bYVIj07QaPqOfSW32wioO38cblcYTkS4i5GioqK0GC6MTY0NCA7O9vSKwIA6enpSE9Pt3wvEV+wlDJ+x1WN+5YWVRt2MO9HWxbHzxGCuNrQCUxJkdLtdiwHR7rdPd9+DiL1OSO5+V4xIluamDcVATzn7EPbRU7c+4yMGjUK3377rWHZqlWrMHr06HgfOumwPjnjlMBq2WeEFSC2MdvOyWoaq74ZJDB6MaLPEXHQq0oIiYyIxUhbWxu2bt2KrVu3AtBKd7du3Yra2loAwPPPP48HH3zQu/7JJ5+MPXv24Nlnn0VlZSXefvttfPrppzj99NNj8wl6ElZiIFjTs2hyoKxulixHtU8CS3tlV2folYgPgxjxVc9IihFCkpaIwzSbNm3C7bff7n399NNPAwCOP/54zJw5E3V1dV5hAgDl5eX4wx/+gKeeegpvvPEG+vTpg2uuuSZFy3qtlsXLM8KmZzEloWKEN9GI0IXUREam72fnpqgjJFmJWIwceOCBmD9/fsD3Z86cabnNXXfdFemheh/htGjXi4iomp6xz0hMMYsPJ0NeFCORofeM6PuK0I6EJC2cm8ZJLMSAXzeQeM7ayw6s9nHQM2LOLaJnJEJUihFCehoUI45i5a0wvdbf5KLxZDBME1v8ZluOo2fElLDKnJEIUQMksDIRmJCkhWLEScKpcNG/juaGxzBNbHEyZ8TczpxP9JGhnyiPnhFCegQUI04SRmWv4SZnNb9MuLCaJrY4WdrbRc9IVAQM09COhCQrFCNOYunpCJIzEmvPCMWIfRz1jHQFf02C4zZW0/iW046EJCtJ2Q6+9xJG6MSiA6utSZesbpZOdQyVEti2EWhtgRQCbXt2Qra0QQ4e3nMnkHJSjJg9I518oo8IekYI6XFQjDhJxH1GoHlHhI2p6i0TWJ3xjMjnH4Zc9ob3dU33/2LqGRAXXuXIGGKOk6W95gRWPtFHhv67ymTOCCE9AYZpnCScChe/3ASb3gyr7RwK08jVXwVYvsKR48eFhCaw8ok+IvSigwmshPQIKEacJBxd4fcEblOMJLK013PRz8qGOO08CE95ZU++qTqZwOpX2subaEQECtMkyMMkuzoh138L2d6WkOMT0hOgGHGUMEp7Y/UEnsCcEe9FP78Qaef8BEpeQffyHtx0LYEJrBQjEaL/bpLAMyKffxjqPbdAfeDPCTk+IT0BihEnsQqdhJMzYodEVtN4bqZp3bkurnTj8h6GlDL09xRLzDdNipGIkIGqaRIlRtZ+o/3x/RpIVrQRYgnFiKOE04HV5D2IaZjGoQuh56KfpuVHi3SXcXmSIOv2Qn75EWR7e4gVHW6tb/IgJXOfEVm3F+ry/yVXCCJAmEYmYKI8KSXQsM/zAmhrdXwMhPQEWE3jJJF2YLV6HS4JDdN03ww8YqT7/2SaNVWqKtR5vwf27oE44XSIi68OvLKlLePpGTHZKclEnAcpJdT7/gTs2g4cdyrEpdclekga7gDt4BNhx6b9xuO2NAE5uc6Pg5Akh54RRwlDDMQsgTUxYRoppS8c4+oWId4wTRLljDQ3AXv3AADkB0uCr+t0N9ue4hlpa9WECAC5bWOCB6MjmRJYG/YaX7c0Oz8GQnoAFCNOYidnxG5pbzhemHigv5F254yIdJ8YSZ6YeQR2dVyM9JA+I02Nvr87OxI3DjPJlMBat8/4upVihBArKEYcxbkEVmmV0xDNXDfhor9xesI0Hs8IkDzekUjGkWAxkqxhGuxv8P2dTGLEHagDq/N2lPUmz0hzk+NjIKQnQDHiJLY6sMbAM+KpanEiZ0R/I/WEadJ0qUnJkjcSibfBMoE1fmLEXMqbtGEavWekI5nEiM5+6RnWy52i3ugZkfSMEGIJxYiThDNRXqyaa+m9IEq3GIlnBYiHLgvPSLpejCSJZySSp2SnE1j9OrAmp2dEGsI0ISqSnET/fSmKT5AkQtTRM0JIWFCMOInduWlsHUu3naOeEX3OiEWYJllurFGKERnPkJfpppm0Tc/268VIEnlvvNVcaRBC+M6/hIRpmDNCSDhQjDhK8JwRy+ZadgWE/gbqCZM4IUZ0N1JhbnoGJI8YiSRclOg+Iz0kgVU6VToeCs93o3gSqD2l5YkI09AzQkg4sM+Ik4Tq/RHLREn9fhUlun2Fc7j2NshFLwDN+30LXR7PSBLmjETyJO94mMZ000wmr4MevRgBtCRWfcJoonAbxQgS6Bkx54zQM0KINRQjyUQsG5VZekbiKEaWzIdcutC4MM3UZwRInpyRSJ6SWdpriUxWMeL5btI0ES4SNB2B7OoyVhwBkOwzQoglDNM4SahGZLEUIw7njMj3F/svtPKMJEuYJtoEVjY987vRJk1FjWrqAOwRI057mBrr/H9zLQzTEGIFPSNOEkoMxHI+GcvS3jjeQK0+WzInsCazZ6SnTJTXtN/4OgEVNVJ1Q774KNDaCjHjWojMLP8wTaJyRur2+i+jZ4QQSyhGnMSyK2qcckaswjROdz/1hmmSMGfE3MtDSgghrNd1uM+IX5gmWT0jfmGaBIxz3SrID97Q/h4+BuKE03SeEVOYxmlR17DPfxk9I4RYwjCNo4QQI5aekZ4RprH8bJ528EmYM+JXLhvsqdnxifKS3zMi3W5jsjKQkDCNoXS2eqf2v8kzos8ZcbLiR5pbwQP0jBASAIoRJwnVZySWNz1DNY2n6VkcL8RWu3Ylc5gmgplxmTPij1mIAIlpfNbe6v1Tdk98GFCMAM6GavRlvR6vW0d7cn6fhCQYihEnCdWB1fKmF4tqGl/OiKO9IDxhmvQekMAazGPjuBjpAU3PzCEaIDEJrO06AeQRI6qv6RmAxPW50XttSvv6/qZ3hBA/KEacxJZnJMq5aYTw9RmJZn928HhGknFuGj8xEmRcjueM9IB28PstxEgiJsvTeUawt0b739v0rDtnxDAdgXO2NEyS13+w72+KEUL8oBhxFBsJrHbDNJ59CQEIB8SIZTWNv5tcJknOSEQz4ya4miYp+4xYeEZkRyLCNLpjtjZDtjQBbk+fEYswTSI8I5lZEH3KfcuZxEqIHxQjThIqQdWqxXi0CaxCARRdlYiTFTVp3TeB9CTMGYkkSdRSjMSzHXzyV9P4NTwDEjMRnd4zAmjeETVAB1bAYTHS7Rkp6gPk5PmW0zNCiB8UI04SSlfEMhzgyTVRFJNnJF5iJMxqmmS5sZrHEWnOSBJV00jVDel02XYy5owAQO1un4C3rOZy5vyTbS1AW7dQKioBcnJ979EzQogfFCNOYqfPSLSz9jqVMxKsmiYtMTH7oJjHkUQ5I+ZQVjDPiGysh3rz1VD/8DNIqyZb8cLcfRVITNMzk2dE1lT5XqSZJsoDnPOM6JJXhUmM0DNCiD8UI05iq+lZlNU0QvGVFQLxfaI3462mSb4+I9GHaRycKC/I2OTKL7QqkrpayI/fjd+YzCSLZ8Scp7JHJ0a8HVgzfMsSIEZQVAJhCNPQM0KIGYoRR7HjGYmymkYxiREH3fnC6yZPwtLeZE5gjSRnRNflU25eH68R+WGZM5KIapo2s2ek2vcigX1GDJU0RX3oGSFJi1RVyG+/hNxTldACA7aDdxJLYdFLqmmshJZl07NkyRlJ4j4j5mqaLjcCNKoHGut9f29eD6mqEIoDzxhWpb3J5hlJZDVNnTlMo/OMtFKMkCRiXw3UB/6s/T3xB0i77uaEDIOeESex0gH6MEw82sErijFnJJ5dWM1Yzk2TJJ4RvwTWCHNG4hnu8vPaBM8Z8dK8H9i9Kz5jMmNZTZN4z4i31wjgO+8NnjmHxLB+XhqzZ6SZYRqSROiuGaK8X8KGQTHiJHY6sFpsI/c3GG9ClsfSNT0z5IzEyQ0X7qy9vSZnJI6izpzAGkzAmc4Dufm7OAzIAo8Y8XQ5BUJ6RmTtbq3KJJaYPSMWczKJ9ASEafTJxCbPiKRnhCQB0u2G3LkFctd238K+AxI2HoZpnCQGCayyphrqbdcBElBm/wOiIsDJo+o8I8IBz4jVbq3ESLLkjEQrRhws7ZXBZsNtNFW1bPoOOPqkOAxKN572dp8IKOrja8MeJGdEfvul5grOL4Tyl4chsnJiMxhznxEdwipnJCGekRItf0Uo2nlDzwhJAuRz/4T831LDMpFAMULPSKKJMIFVfekx7Wbl7oL6wsOh9yuUuJf2Srfb+ubscY8naqKyIEjz/C/BPDaWpb3ONT0LajOzZ2STA54RfYimuNR37CAdWNV/3an9sb8B8tMPYjIMqbqDe2MS2fTM4xnJL4RwpWt5PJ5QDT0jJMHIPbsgP3rH/42K/s4PphuKEScJ2YE1jERJ/WypwbLyvTkjAiLe1TSBnjYtq2mSNYE1SF5GwqtprG+gsrPD/8a2a3v8m2rpxIgo8YkRj2dEqm7I71ZB6s9VvWioq9Xej1YYhGo/n9Y9N43u/PMcU+6pgtyyIbrjB0CqKtBQp70oLPG94REjCSjtlfsbIDeuc3aiTJK0yHcX+T+YZucA+UUJGQ9AMeIsoa4Dlu3gTTc9/QkkAtZYGPuMGDwjDooRl1UCa5LkjCR1aa95orxO65uIOUTjYXN8brJe9A3Pii3EyPwnoN57K9S/3WY5bvnmf6Deeyvk0w9GNw5999XMLP/3FeucEVldCfXPN0D9y28gv/okujFY0dToO7+K+/iWZ3vESLOjokB2dkC9/Qao834P+f4Sx45LkhPZvB/y4/f83+g7wPjg6jAUI04SKmcknGqacC9ihj4jcS7tDZQr4MkZ6ZVz0zjYDj7Q8fQhmrwC75/xDtUYeowUFfvOr27vh/f42zcBldsC7+fT96MbiD5fpN8g//fTLMKEXV2QSxcC7W3aGNavim4MVpi7r3rI7U5iVVXv8R3hu1XeHBb54iPOHZckJXLZm5ZeRdE3cSEagGLEWUImsFq9H8QzEqyfhKEdfJw7sAZKsLSspklSMZJMfUasbGTlfdKJEXHIEd6/415RoxcjeYVARneH020bIdevNoxfrv0mfuPQeUZEv4H+73vDNLrzr67WkLMSlxb69aZKGg/Z+sZnzoVqZJuDwockNbKzE/KDbu+YMN0/yhJX1gtQjDhMDDwj+ptguGGahOWMuIz/I0SZqpNEOzeNk31GAEuxJBvrfC+GjvblJ2xeryV3xgt9zkh+oaHdunrPzcCOLb4xrvsmfuPQe0ZyC4DCYuP7FtU08sO3jefrvtqYD0sGECPC4xkBnO3C2kExQjTkFx/68pkm/sAoSPS9cBIAxYiT2OjAKs3eknBzRpIhTONK5jCNSXwkU5jGUoxYLNN7RgqKgBEHaC/aWoFdO+IyNADG7qt5BT7PiBUbVkPG68ZryBnJBPqUG9+3SqA2T/BXF3sxYgzTWOSMAM4msVpNakhSDikl5Duvel8rJ58N5Zrfay8yMiCOODYxA+uGfUYiRO7cCrlhNcRRU4xPOmFtHItZe/ViJIiW9IgY86y98egzEjBMk8B23KEIM0wj99ZAvvOa/xs2xYj89kvI+n0Qk6d65+4JOTbAWozobzIFRRAjxkCu0BIy5dKFkMNGa8exSu6MAkPOSF4BkJ4ZeOWODshVy2Nz3LZWyE/eg+g7AOLAiUbPSGY2RJ9y4/w83ony0hGQ/Q2QnR0Q6daCSjbWQX7xIcRBh0FUDISsqdbCPHoBnpMLMXkqsOk7yC0bjKEpfZgmUfPThGqQSFKDtd/4crhGHAAx4gBIKaHcci+QX2TMb0oAtsTIW2+9hddffx319fUYMmQIfvrTn2LkyJGW6y5btgz/93//Z1iWnp6O5557zs6hE4p0u6HeN1tLBqvaAXHJtRHuwE7TM9MyNVzPiNu3Trw7sEZUTZMkYiTMahr1kbuA6p1+yy3LfUMgd2yB+o87tO9cSYM4eqr1fq32bTU+/U2moAhixFivVJWffgB8+gHQ2ABx1sURjzUoZjESIgNfLv9f1IeUO7dAffguoLoSUihQbv2b1nzNQ2YmUFJm3Miq6ZmHioG+77WuFii3Tt5Tn3sYWPEJ5DuLoPz1Ee37q/L3Osl3F1nf9PWeEX0X1pamwPMNxRqKEQJAXfqq92/lh2cDgFY9M3RUYgZkImIx8sknn+Dpp5/GVVddhVGjRmHJkiWYO3cu7rvvPhQWFlpuk52djfvvvz/qwSac5v2+rHRdXDx8gosRyxucn4AJ07OhBgjTxMUzEqKaJhnFSLh9RgLNhGtHjLy5wPt9ygVPAhZiJGAirVXOiD4jPitbK7N1uQyfTX60FIi1GPF4ZDIyITIzLcWagTVf2z6UlBLyw7chX3zUJ3qlqlXEjBzrWzEzGyg1h2m6E1jNXo/RB0EMHQnpGfe+wGIE3Z4m7Ov2kFkIEQDWN/wRBwD5umtigjwj5qkjZFeX8TdJej1y51ZgbffvsKwCmHhUQsdjRcRn5OLFizF16lSccMIJAICrrroKK1aswAcffICzzz7bchshBIqKiqIZZ3KgL8ezczGJdZ+RoNU0znVgDRWm0VphC+3YyRKmiaTPiBURJLDKTd9BrvjEmMwZyJsQSKxZeZ/067pcWm5OaYVRHBSXQl0yHyjtC+Wo48Mec1A8nhFdOXFQbApQ2dkJ+eR9lp4V+fl/gc//630tMjOBgkLjT8zbgdV4mVNOPhuyptq3r7q9YXkp5Ks+b6648OcQA4dCfe6ffgJFXPhziCEjgKGjDH0bRE6eb3wxzBlRP34X2LDGuHDAYIjDjtbKONetNL7X2gLkh/ndkV6BPtQspp7pnSohmYhIjHR1dWHz5s0G0aEoCsaPH48NGwI3Wmpra8N1110HKSWGDRuGiy66CIMGWfQF6KazsxOduhucEALZ2dnev53CcyzvMfVPoi3NEY9FWnpGVN9xpP8aQpo+s+4mKCACj8E7N40xZ0RAxtyGgTppKmkuCNE9xjSXdkN1dyW0sY4X85hVd0TjEqoacn2puiHfWAD1tectxEuA7y6AZ0Soqp+AEV1d3vNFuNI1W48c63viB4AtG3ydRvuUQ4waF3TMoZCq6usCnFcQ/Xcp1YAXRvnJewYhIk6cBmRkQr71H/+Vs7IhTGEakZam2UTvGakYAHHwEcDXn/lsV1dr+Tn8GpN5BGHFQCgnng6hKJAVAyFNYkQZf5h1zwZ9jlntnpj8DuSm7yD//YD1ey8/ablctLVAFFh7sQGL6x4Jm2S0nazfp4l3AMjJhXLMSUk1Pg8RiZHGxkaoqurn5SgqKsKuXdZTl/fv3x/XXnsthgwZgpaWFixatAi33nor/va3v6FPnz6W2yxcuBALFizwvh42bBjmzZuHsrIyy/XjTUVFBQCgvaEW3VOCQbQ1o1+/yOqyWyuLYc7dV4Ti3U9zQQH2md4vLMhHnu44VUoaPLfRDJeC8gBj2NF988vIzEJGXh48z2F9ikuQGeG4Q9Gcm+M3bgAG+4j0DMiuTrhMyxPFTtVtEH45GRkoMY1LSolAAYjM9HSUBfkc7n212HvPHWhf+YX1Cvvr0bcgH4opCdpdlwGrX1JJYYHf97YnLQ0eedxv4CAIlwsdF/4Uu63mnACQ8b+3UHqcRWgoAtz7G7CrW+hmlZajrF8/NN84G/v+NtvW/vqVlUFkWCfANnR1wJOdUnT1b5B/5oVwN9Rh91cfwV2z27Bun/4DkDHiAFTqluUXFaOgogLSXQrXkOHo2rEVpVfdiOwBA9DeNMb7W85ub/H77gFAbWs17M9D8XmXIW+ANqFY3aAhaPr6U+NnGneQ5WdSiwqxKzsHsrUF+OpjlP/iJqSZy5EjpGHZEjSGXs1AaW4OMsL4DXqueyRyksl29Utfwf5u72T+6eehaNjwBI/ImrgHDkePHo3Ro0cbXv/qV7/CO++8gwsvvNBym+nTp2PatGne1x4VV1NTgy4H3fxCCFRUVKC6uhpSSqiVvluTbG/Hru3bjWWrIVD3+t+yVbcbVVVV2t91/u831Ndjf/f7ANCl8xi1Nzd7t9Wjf6Lr6OpCZ6uv6mBvbQ2Ebhu5azvUpa9CHH40lIMOC/uzGD5D7R7L5VVVVV4bym7vTFd7m+WYnUaaJlhraWxEu2lcMsg8Ou2trQE/h9z0HdwPzgX21wcdQ+WsGRClfX0LXC6I8dbfwd49uyEKjOK9q7XF+3fVnu4n7aw8pN3zFNy/ucxvH63frbY+X1Q31FefA7ZvBvLyofzwLIgh1gnpstp3e25Pz9T2N+4wKNffCvXBOcaV+w0CaqqChsCqKncGnMHXresBsr+oFE2esd/xTyjvvg51ge/Jf19TM0R9A5CXDzRpnpv9LS1oqa7Wbgw334u0jg7UZ+egvqoKUvU9GTZ//D5atm/VXuTmQZl2AUS/QZBWPUjyC9E47lDvb1LNzPZ7v9rid+7l6JOAdxdBdrSj+qUnoZxxUeB1w8D9jU/sKr+eA5FfCPcdvwzaxK9mxzYoucE9I/rrHgmfeNpO7m+AuvglICsbylkXhxVqke1tcC9+WXuR5kLLUVPQ6vD11+VyheVIiEiMFBQUQFEU1NfXG5bX19eHnRPicrkwbNgwVFdXB1wnPT0d6QFu8on4cUgpteOapiuXLfuBggiebAIkqHo+k9XMsVJVjZ9ZnywaYM4Sw35M1TRSdRvyRtz3/QnYV6vN4Pjwq9rsohESaIp7w9g8cfuuroRf4KSUFjkj/raUgRJz0R2CsbK96ob62L0+IVJUAuVnv4H69z/63yCqdxpDKgDkN59bHs/97D+hXP07iApdp1HPTb47Udh7HuXkmTfX2FcD1SK8JL/6BPKNl33HWv4RxLmXQ0w9w39dfTlxXr7PBlb5I1nZwMhxWjvyAMiursB5TDrBKNMzfeuluYAfngXoxIjMytbeLyn3ihGpKL7xpbmArDSfjfILfcm+DXWQDV/5Pn9jPdJuvMNywkEx5TTAle7bj35uHgAo7hP0/BZTz4B8fzGgqlA//y/ENOsHsnCQquorZc4vBMaM137rA4cB2zYG3jDMuXGk7tpEIiPWtpPrV0N97B5vDxu1uBTK8aeG3E79+F1vfpI48ligsCRpv9OI7jwulwvDhw/H6tWrvctUVcXq1asN3o9gqKqK7du3o7g4OvdkIvBrqxxxEmvkTc/8cg30N8hAiaP6bZQQHVj1T39258sIctP24unCmgzVNBZjsBKC6Awy1kAJrF9/DniSI4eMhHLb/RBjDoLyy9u1io9I6DfI191051aoc26Eqmtl7v0c5n4lgfqXAMC+Gr9Fcvtm4wJ3F+RLj0F9aK5x5l3AWNarrxSxqs5Ic0GMm2BcVmZyXwc7H/Q5WqbGakJRoMz6E5CRCRw40dfKWl9RE+TJUSgKxA/Psu7Vs2ENZFur/+97wBCIqdMMi4SfGDG9Nh+3tK9vnWgraqp3+vYx4gBfvoK+ysgCaZ7pmSQtUnVDff1FqPfeamimJ995LWR7Aam6jYmr3eW8yUrEYZpp06bhoYcewvDhwzFy5Ei88cYbaG9vx5QpUwAADz74IEpKSnDxxVo54YIFCzBq1ChUVFSgubkZixYtQk1NDaZOjS52HQ/URS9ArvwCeoGwd+hIyHMu15LPzG2VmzXFKTeshvrWK1CO+SHEoZMCH8DORHnmE87kGQl5HBFBB9bWFm0a6UgJJIr06DwjTiL31UB94VGI/oMhzr5Eu2CH21QsSJgmUIm0unSh929l+qVau3QA4oCDoTzwPLB7F9TbZnrXEeddAXH0D7V+JqZ5XMTIsZo35PG/oWvHFqC9DfKJv8O98BmI0Qf6yklNQkAo3RVUVh19v/kcYuoZxmW7dVkqhxwJePJcVn4B9c83QPnpjVA/WKyJLL1w0XtDrARQWhrEuAmQrzzts8kd/4T6rzsBjweoK0jfG4MY8c/BEOMPg/KPlwDhSwYWJeW+X28IL59yzmWQp53v9VjJl5+A/Phd7Vz4fo3BfuKMiyDOuNA/8c8kPkRJcDECwCfMI/wtyMZ6qM/9C6K0HOLHlxkmRBSe7rsAMHwM8N7rgXekC++RyJAb10FdMh9i8olQYtyxVEoJueDfkN/pqp9aW3wPN4DPm7e7EvKT96Cu/MLyAQOAdl32bDv2EIhBw2I63lgTsRiZPHkyGhsbMX/+fNTX12Po0KG4+eabvWGa2lpjZnpTUxMefvhh1NfXIzc3F8OHD8ecOXMwcKDFxFYJRO7cCvn6C37LW7ZvhtJ3IMTJZwNmz0j3E4Z6983a/99+ibRHFwU5iJUY0f0dTp+RcDwj5vlrDB1Yg6jpNpsXqWA3bQ8J8ozIpa8C33wG+c1nEMNGAROOCl94BPtcFsJRNtT5+pIMGAKYvAJCSYM0eQbE8T/SOqRmWHRJdbkgBg5F3/uexq6/3a7dKAFtsjddWat+7h/DMtXfYyVffBTuNV9D+fHlEAMGawt3V3q3Ua69CVj7NdQn/q6FO/bVavPNWCAMYiTAGAYN8+Vx5BdqFS7pGb7TPsj5YAiTBeiQ6hdWLNfZN4zOsyJL560af7jXxnLtSmCwLtEvL9+6AsHctbI4jCR7l73fglz2htaADdDsqhcjw31iRN/8zhJ6RmyjLnxa85xtXAt52OTYlsh+v1brn2OFUCDOuhhiwGCoD/0FACCf+kfYu1ZOPjsGA4wvthJYTz31VJx6qnW8avbs2YbXl19+OS6//HI7h3EUuXOr74UntOF5Ytq7R+tDYPKMyGb/LoqyvS1w+21LMaK7qYUI00i325h3ENAzEiRME6w/ht0npnDCNInyjGzb5P1bfec1pE04ynoMVsuCfS6r70p3kReDh1vevIQrHeKsSyD/+ybEjy/znivC5fK/gaRpeVNKVjbSrrgB7gPGQz7+d//jWgkBlyvw+L/9EurqFRDHngxxxoWAxzNSVqG1qB9/OJQ/3A311must/eQH0qMpEEoaRDnXAb5+ouaoO9e7iXYbMkhPCNWiCOP17rPKgrE+MPD2sbLAQdrXkSpQq77BkIf8gkwiZhfS/9i6wpBAzZ/C/pwmlz6qu9hJC0NGOpLOBZ9yiBOOgvy608hzrwY8t3XDJMX0jMSBZ5k/bZWYG+Nf9gxCuRuXe2WousPVTEQykU/hxh9kBaaqRgAVJvqvAI1sRMKxOHHAAceGrNxxgu24fOgc1Ur194E9Bvkuxh74uQBPCMGGuuDnKA2ckb04YDOduN7gcSIuWV8uB1YbYuRyDwjUsa+14kVUkqgcqtvwYbVkNs2atPem7G6KQYN04Ro2W7VgrwbZdoFwLQLjAutLibppmZdPzgBsrgU6j23GNcLECIxIy74mXYTq6vVbrgfvgX54Vu+FSoG+P4uqwgY6vESjmcEgHLsycCxJ1uPLWwxEmQyPh0iNw9pN98T1rpW22LoSGDLBm0OD13/EBEoKdi8j4Ki0CvZ/S3s2u77Wy8uBg33KyVWLrgSuOBK7cXkE7V2+rffoL0O83euvvEy1BWfQrnwKmMYKJVp0iVw766MqRjRT9qoXHczxCFH+q0iFEUTms/6plgRp0yHcu4VsRtHguCsvR70qrTvAM217MGTxBcgZ8RAsHkgQmiRkGEaUzlqWJ6RSDqwxjNM47nZShnfGW/17Kvxu/DKpa9at363cpkHE1lV2yH3mDqCmDqiRoTlzdxC0FiJHKtlFtuKY06CMuefENMv1SpdzO/rGnUJRQHyi4KNOGTOSMCJAPWfNZwEVpfLsY6RYuwE799yha5/SLDp1fWt5M0t6a2wMT2CbG8HandbvheWUDDMGBw6TONuqIf6ytPA1u+h/u2PYY2xtyPb24wVXrt3BVnbBvpigiCJ0GLSCb7fXlqa1gywF5DyYkR2dkK2tvhcZIoClPXVfrzdHgXZXSoYtmck4MFCVMuEagdvdrt3dVlnVOu9HxGEaWQcwzQi3BtQLNGH3rqRX34E7LGos7fMGbEYpycJrKMD6pP3a6XSHvTixUpIBMNKvIS7LEzPCNLSITIyoZx2HpS5DwOjDzK+33eA8XWQLp0AgFydYA/iGQk6tqCeke7zKswQTSwwVP/oy5iDeEaUa36vVbNMuwAi0Bw3euzMYl29I/CDRFhixJeYHs7vXG2o873oaA+8YiqhPx8A/1BJlEidZwRBEqFFRiaUK28Eho2GuORav87DPZWUFSNy+2a4b7wU6nU/hnztOV+YprSvFtdXFF/75mYtTCPNnhGLJwzzpFTe5d+t0mYd9XtD/3cIz4jVTd/qxi4D9xkJ6pWwKUYC9RkxoL+JOpQ3YsgDGjBE+19VDbNXerHMI/H/XOKks3yu2Y3rtNlaPei/i/QIPSOWHg8rMWLlBbEQHiFEiygogjJ9huFt4SdGioIe2+D5CFckAZaeEbnma7h//1OoLz7qe88Tlkx3ToxgxBjrxNcgnhExaBjS/nAXlLMuCe8YYQhzueJTuH9zGdTulu6yUheiMSdBhyNG9J6wMBJYVfONlwD7jb1uDTkesaBur/Z/RoZR6FsgDjoUaTffo4VAewkpK0aQm+dVunLzel+PDf0F2ROq8XhGTH04rJoiBfKMqE/cF2AgoXJGdMvMYRrAOpRgyBlJkjBNgj0jykU/991MzROHAWHnjIjBw6BcfoNX4MmFz0JWdTcui8YzEq5nwTJZ1UqgmNZLS/OvPBkxFvA8VQlF62uiwy//YYzOk2J+L1xBZF632+7qP+7Qmu+99zrk3u5SRc8TeZj5IrFAuNL9PUZAUM9IxIQQ5rKzE+o//6o1Y1u6UAsP6PJFxPRLfZ6OPuVhPRkLJc0nSMJ46HCbZ/p1KrSazDSZBFoMwzRSSl+YprgsKeeOiTepK0YKS3weg62+boWGCa5yu+Nyba1aa3BzUzCrToaN9dYNtPQuOD1qCDESLEwDWAsB88y+BjGiq84xh4VaW6y7wAZzpQOA3qUbCBuekZDHDbGO1zPicgEjx2mx1kBY5owY7S2mXwoxcBjE6AMhpp6pLezqhPrkfd2VTlHkjMQ8TOMvRswIIaD8cjYw/nCIi66CMM/kahIcoqAYyvV/1KptrvpN8OMFGpd5XY/N9Lar6Q6jecWIg54RAGLcIcYFLlfA0mJb+08LIUa++NC4oKkRUi9Ghh8A5cpfAwcdCmXGdeEf2JM3Ek6YxvxQ1bw/5QWJNHuL9tVouTyxoLXZ1+E7nIqsXkjKihHhcgGeSar0N3ydZ0Tok1ib9luKEfNNTC57A+qNl/raNANB5zgxeEasvBZ6sWIVu7Xat75ZU7AwjelGLt9dBHXWhZC65lvqf56Cet2PtWnozSOXEu5/3Rm89bSHCD0j6pv/gXr9eVBfey7wOss/gjrrQqgW5a6yo9335NJ/sNbfIlgHQqubgs624qKfQzntPN/r6TN858qWDZAfLA67msaScLwbkazn15XVejyi3yCkzboNygmn+79p9n4UFEEccgTSZt0GccDBxvesGozZzBmRe3ZpIj8BOSMAIMZONC7IyYvtk6ohgdX/9yvffc24oGm/zzOSlQ2UlGrfww2zIQ6KoGTT400JJ0xjesBQb7wU6p9m2s8r6w2YwjQAgJoYeUc8IRpYdPVNEVJWjACwzFg2ekZMFTVmFdzSZC0GWpqgvvyE73WNdRY8AIMAkRvXBX0/fM+Iuc+I72s2eHKsPBQd7VAXv+hdV771H0BVIV99VmvqpWfvHuCrT/z3YYX+yTKMtvPylae0BN3FLwUUc/KRu4COdsjPPoA0VxpU7fDaQQwYqv3fbyAQqPeEVYWNPuxizpfIyIRyxQ2+saxcbhxnTDwjYeaRBOozEmq7UFiIkUAIIfyPEaZnxM+7uHuX8Vx3WIyg/yBjM7NglTR2COIllK0t/onX+2q03xoA9BtkXxh5xEhHuzYnUBDMYRoAQHWl1ngtVbHKo4lVqEZfSRNOF99eCMWIGX3OiN5t3bTfb6I8tDQHDjnoLyi7A01EryGl1PpfbFjt/2ZTo+/CYSVGOjshW5o1T4Bvh76/zTkjes9IoLFvXAdZt9eXK+PZ7ftLjOvp2xQDEJODtPjX38iCVRzBwpOk66kg9zdah2Z0Y5EtzZBbNvjeGzjU+2fAToRutzaXg75cO5SnY/gY3w23pSk6z0g4giLQfsMRKIG8FEHwyxkJNd19GKEhv+Vut3/5dXWl8VyPYYgkHIQQEGN1oZrsGIsRvZfK/Bs09xICIL9f4xtb/8H2j6v/HCHyw/zCNB4CzNCdEphzRgDDLNbRIOt0Ld0pRlIPv3kkMjIN8Tph8Iw0WnhGmgMnb+rmAQhZj95YD/WFR3zHPfwY37bL3oD65xsg21r9pr0HALn1e6i/uwLqH37mS/zTCw7FFKbRe02svAEAICXkik/88lzkf980VM7IGl+JrLjkWr/253r0N7ZAFUdedBNCAYDc9B1kZwfU5/4J9deXQr3jl0bxpRuLXPs11N9dAfncv3zH1okRjBlvbPPtoaMd6h2/gvqrGVCX/09bpv9uLWaRFkL4LvAtzUZ7xsAzIsIVKOEkjwabPC8QfjkjRZarBTxGwDCNb7l0d/k/ce7eZfytOe0ZAYzncm4Mk1eB4H1GLBLS5QafGEEUYkTo550KEW5RG+qt38gK3WK/tyJND2cAjP2pokHnPRfhTCnQC0lpMeKXKNS3v9EFqmvqJJsa/ZueSdXPe+BFL2RCiBH1jl/65pnIL/T3MFTt0ObMsPCMyOX/08Ie+xsg3/6Pb1wezBPlqSHCNPr9mpNum/cDtTpviP4HVF4BMepA32tzyZn+Rra/PuBxARhdlgDkik+g/uU3kMve1Lw+ldsgP1tm3Ka6ErJ5v1a1ZA4D6cSIEALilHP8j+l2a94sqUJ+1D0HjM7eIpCnwxuHbzHO8hupJyLsZFUL0RJOHkmknhogojCN5THD9YyYxUhtteHJXThYTeM95riJXo+MX8lztARL5raqjtO1gY+ZZyRE3ojaGCAp3arRY6pgEaaJReMzubcG8r9v+hZUxPh86yGkdjt4kwL1u+joBUV9nXX5Z6CnfH2nvmpfmEacewWQnq5NdOZJcvXkYhQWaw2UrGZbfec1v9lWARgaeMmP34U882JTNY0IXNobLG686TvITRY5LPrPpfOMoLQCoqQUyqw/QW7fBGFOiIwkTGMWQd+v9V/nHWOSn9y9C3j+Ef/KnowMvyd6ccSx2twSHW2Qn38IbP3euI2ns2oIzwgAXYWC0UsmAq0fCMtuqxbCw5Obof/uwqmmsZMzkhe8usb/mJF7RmDlGXG7ja3PE+AZEQVFUK6/BXLjOogTYtzh0lBNYxIfXRahWP3DRVRiJHzPiLvBus9IMK+m3N8IdLb7lRpLKbXvs7QCIjP4dykb64DOTog+YXSydRrPeZqTp3mI9tVGnTMipYT69D+834eYPBUili3mexApLUZESamxQ7tJkRqqafZZx0oD/jj1YQTPCVtYDOWU6QAA9/KPjOuPmwDlyl9BFBRDWtx8sXePcaZWD/q8jY4OyP++BTHhKN2HCNKBNURVi/zv2/4L9d4Zj2dEUbz9KsT4wyDGH+a3mYhAjJg9I176DdJEwfbNgE7gAQDWrTTO8urBwiMghIA47hQAgPubL/y32btH21dX4ARWL57kRlXV8kY8xMIzEqhXSVq6SYxYhXjSjOe2jTCNXwv2EI2Y7HpG/EomAUj93CsO54x4EOMmah6SWBNhmMZLdk50ZZ8GMRLKM1Jv/Uagpo71+7S5vNrboPz+ToiR43zvvfos5BsvA8PHQPn9PP9+N571qiuhzrkR6GiD8pu/QIw+0HK9hOGZoyy/UMvr2FerlTzvb/Qviw8T+eHbgKd6sbgUwjOfUAqS4mEaU86IvpIGMIZpAt0gQ4gR2dbiW6e8n/dt4RE+igJxzk+g3DAboqDYu8ySMEpo5QdLjM3RzO3gQyWw6te1aurWfcOXUvqEUEmZViodDEPOSIjujvpkLs+wjp4K5ZZ7IX54lvU2+pDKaed7b4zi5OlBD+V1e6dnAAO783ykBPZUG8MuocI0gPEJP8KwiKX9AtnULx8kjG1tJLACADylo4NHBLyJBDyGXc8IAKnr/ZOQnJF4EqwdfDAx0n9wdCXGuqog2RLYM6JNkRFArAQIscqP3/WGR9VHjBMVyjde1v7YvB5YZSH+u1Gf+6dWJCAl1PdfD7heIpCdnT5vUn6B0YtuM29E1lRD6qoulZ9cH/aEjL2RlPaMoLDYO2U4YBGm0bup9wbIIjfPX+G5gXtujvq8ijKdGDn3Cu0CP3IshC7ZVXszigtOQx3k58uM+woYprG48BX10RL2LOZ1MWzT0uR7ugrHrZiX77N1oKcrKYGt30OuW+Ub/rQLIUaN9T2hFpZYzjfoZcJREGdfAnHgBMiqncEbnQEQZ1+iXeTHjIf88iPInd1P5LsrwwrTiOxc73gMT/ixmCgvoBhJD71eLMI0AJTLfgG54lOIg48IvbJfmMZmzgigzZzrodeJEYt2+Kob2LQesn5vgI2izBcBwg/TeDwAVjTWW880rPcEB2rwCEBdPB/CqlGYuwv4zve7x46tgcdgA9lYr4VfR4z1jl22twObvwOGHxAyfGSwSV6h4cFV7t4FMXKs9ndrC9pWfAbZp8LSoyfr9kJuXKu1S1j2plfAieNOiaxnTC8kpcWISEvT+gl4fjxmz4g+i14/uVpami9/RHdjFcedAvnJe9oyz49TH0Yp6+tbNzcP4oTTAgzMhsOqoMg7Fvme7qnCnMAqQ3hGsnMgDj/GOK+LHo/I2uP7XOHEOIWSppVKN9YH9iatWg71wTm+14oCccYFxnCB/oJqJi8fyqXXaReb0QdBWLX1No8rJw9iyo8AANJwgTGVl4YK0wAmz0gswjThekbCqKaxk8AKQBT1CX9W0DA9IyLN5ROUATwjhjBCAhJY44ou/Ca7uiAAyHcWQS54Mvh2UYoRvXAOGqYJJka6urRtzU/wpnm6ZFsLRFaO/7xV2zZCPnZv6MHWVEO2tUJYzC4dKbKzA+q83wN7qiBOOB3i4qsBAOoTfwNWfAocdBjSbvhT8J3ozlHR7Rnx2lLXusF9359Qs+k7iMOPhnL1743jaGmCOvdG/7y2PuUQ511h9+P1GlI7TAP4KkCGjPRzkQlXOtKsMpuLfHFbQ86Iy+V7ivOEaQxixOcZCYpieupIS9Pa1wdBHHio9eydimLcnxqitLdbjATCU14s9VU14SZceUI1++v9G10BUE1JqSgs8c9byAogRoSAcsm1vlCXDfxcr2ElsOrGYzgX4tRnxGrf4ZT72intjZSwm54FyRmxSlzszZ6RLs9EgStCbuaUZ0QGEyOA5cOEX9L5lu6k8CCenqBI1T+x3C5bvvc+TMoPlkCu/kprDbDiU+391V+FnnpC32Mkv9CQX+ipqJH1+7xVkfLLjw0t/AFA/m+pvxARCpTLfgER6LqWQqS0ZwQAxKXXaq79AMlSeaedi4Yn7jcuLO7jC9uYb0Ae15wnb0N30xalPs9I8EGZxEhGJsSJp0MufCbwNiWlUA45EuqmO/33JQKFaQJ4Rvr213px6EoKvXg9I7oeI5GKka4u7UnK3L/BnJluFa6y8oz0H6z9oIePCW8cgTC5Xg1NvgLmjOg8I/qLeMSeEatqmgDHDCcfxJz8ajdnJBKiraZxuSBGjIU0h0SdnLXXCazawdeFcdOOWoyEWdqr9wKcPQOiYgDkV59o5f4A5HuLgTMuNCal7zPmeclN67TGcfqeQeX9IU60mHbAezChzffy9sLufXznP+2ADeTm7wyv1ace9J/Tp3a3v2dcvw99K/j8AqBPmXYeu7t81y3TceQ7r0Fc9gvt764uzW4AIATE9J9olX5DR4U363IKQDGSlQNxRGBPQN6p09Hw/CNaKahnm6I+PhddEM+IlBJSF87QJ7AGH5TJYZWeAXH8qZBL5lvPTwNoybgTj9K8FHpvjN+svcHDNKL7BiwOPxbSI0YyMn3H9XgL9O3XwxQjoqDIaDedGJH7G/2foqxctBZiRIybGL0QATSXcFGJdgGtrjRWj4QTptE/bUY8N00EnpFwwiFmYWAzZyQiTOMQkeaM5BcBg4YCX5iqxnqbZ8Q0UZ6UMmieBQAtLBKqA24o7OSMlJRBHHa0Nt2CR4wsewPy+zVQbrvP57k0N0jcrOX8SJ0YEcedDMWqPYF+u927fGJk/bfA6eeH+lQhkZuMIgH1e6E+eZ9x2e7KoGLEEErMK9Q+d3k/bdqJ3bu07s2m48iP34Na2hfiR+dCfvmRz0YHHwHlRz+2/4F6KSkfpgmFkpsHcdKZxoWHHOn7W3+Sprl88W2paqrZ4xnJzPbv2xAIs0cgPQMiNx/ipACVJNDKlIWSBmH68YpRY43JZrowjTSXFaa5IM64SNvuqOO9Fy+hn8/FU02jFzylEXpGAH9Xr25iQe/YrXIV0jP8b7Shks8iwROqaWo0PtUFEBciUA5LpJ6IcLwbHswhozBCPCLQvmKJHc9IV5euZLIAwlPRpCMRTc/iiTCHaVqaredr0tsz2koawOAZCVgtA6MXQHiuWflFxpUqtwHffK6t39Hu3/zRE47QP2DowtsBKe/nC9WtWwlZtSP0NkGQUvoaSmZl+wRZs2mqi1D9QvQ2yS/U/vBcK7o6gX21/qJHanN6qffP1ub46ibglBQpTsp7RsJBOfMiyNEHQTY1ahfL3FxjAp4HV7rxKa6t1RfOKasI/2Li5xnRbiTirIshxk2ArN/rnwTWXaasHH0SZN8BkHW1EOX9IYaMgNRPZhcgTCOOPxXiR+d6mw2JklIof/qHVsrXUA/51cfaip7wk0eM5OVDhDuRmE6MqO8tglj9lW9YOjEiLrgSYtgYbe4XE0IILW9EfzHJjD7Jzbv/vgO0JzIAqNLFfEM1PTPjqGckjKZnjuSMhJHLYh7L/gZfMnh+oaFbrpfe5hkxV9NYlLID0PLEusMfUeeLAEC27ncS1DOiz4/QxIjBq9mNuvRVpB062TrE5OlWrfeMFAXPewO6ewCdeDrky1oyr3x3EcSlM0NuF5Caat8D48ixWnL+vx/wXy/UHDNNpjANANG3v88mldu8rRfSKgZAPeI4yMUvatdb3SzoGDISGGWdEpDqUIyEgVDSgLGHwCMl/DLEPejDNIAWS/RcaMvCzBcB/PuMuLrbUisKMOYgYP23/uWtup4pYuRYGGSPXgTpE7X0CZqDR/h1PRR9yoA+ZZD6H1Nnp/b5PS7HcL0igPHp6uvPApboisOPgQj2FJVtFiOx9IzoXLUdEVbT6ImnGAnnph+LWXsjJezSXt3cNLonZ5FfpIUi8gqMF//eJkb0XqrOzsD5IsV9fLkYA6IXI0JJ04R7e2twMaLPj/B4Rqy67276TvMGWIWOPcsi9YwAEMecDPn6i0BbK+SnH0Ce91PbVTX6fBEx4gCIyVO1h7NvvzSuF6JXiGwyhmkAGHPMvvif9+Eu88AJ6DjrYqijxkF9/G+GpFVx8tnRe7h6KQzT2ECkp1uXG7rSIXTJdrJyq2+bcCtpAIsEVtOxzDejgqLg05zrn0j0uR4Gr06Qm5X++F0dmren28MSSetiMe4QIDPERFtjDwkuRAD/ipoYe0b8cLkCX0AChWki7jNiNb9MgJt5WAmsicgZCTdMo1tPHwrLL9DsbPaOJKgDa9wweUYCNVQUE3+g2SojE0IfGo4G71xKYZb2esRI/0G+3DCdx1J951Vthm8z3b1E9DkjCMMzAgAiJ1ebsgHQwsLRVNXoQidi+AEQQkD5yUz/qq2QYRoLb1HFQO8iqctzyhyrJd2KsYdAue1+wNMjadAwiMOOtvEhUgN6RuySnQd0GGeXFS4XpP4pvVLn5o/IM+KfM2J8bbpxjTgguNruP1gTOFIa+4eEaCluefzODlPvlAjESFEfKPOeCNxQzeUCho4KvaNso/gI2bAoEqxKuYN5OeIVplEU/7LmQOuG00regZwRQ/8QICzPiFGMFGn7GTgUUt8Aq9d5Rkw5I4HEyLDREHc+3p0zFqPOnNk5mrciWGmvxzPiSvc+PAhXunZjbagDSsqg/uFKLe9rxWfWvwGzZyQ7FyLUg4iekWOB/y3VxmOqqpFffQL57XLNLseeAmE1C7dnXY8YEQowbLT2Z1EfKLMfAFqaoT5ytyZY6vcG72visUlmNoTnehgg4TVDN1ZRUATll7O1RNc+fQMndROKEdvk5AINRjECl8tw49bXmUfmGbHOGfEdx/g6VGmYyMrWRMOeKm3GW9Wt3eh0npGAs9IC3jARAC1Mo+8xEm65suc4uXlaqCkazBe/GHpG0Kfc2NQOCCFGAiWwRnjRiSCsIlzpoW/6iegzEnY7eN1Y9E/onvk9zJ6RXpbA6pczEmgWa1d6WHkWEeHxoLa3Qbrd1jdH3Rws+occkZXtrXATJ5wO+dpzWpLmR+/4tvX8djo7tK6yHrEZ4ecQI8b6OhvrvBtyxxaoD8/zembl2pVQ5vzT8mFMtrUAO7dpLwYMNiSbi6wcICtHyxHz7L96Z+CHIU+YRj8HTX6hdi3Sn8NZ2UgfPBzY4ytPF0JEX5adAjBMYxersIg5gbVym+/vSDwj5h+WK3iYJqw6dc8FvqPd16K+K8wwjV4MdXQYu6+GW64cQ/waBMXQMyJcLv88mCBiRLgsQnZpaaHncTHjdyMPIoDCWTcROSN2mp7pEDrPiIHe5hkxVNN0Woc5gPiEp/Tiuc3fOyKl9ImRINV/YsqP/M/7nDzjzby+zuchiVRUlffzHX/zem+TRLn0VWMS/p5dgSfW3PK9b6qPQNdI3VQcUj8FgQ6puoHm7mk+PJU06BYZY419UMSwMfR+2IRixC5WExqlGT0j3jijUICSCKbENnlG/KajN98ch4wMvcsBQ30vPGGSLlMlUCD03p6uDpNnJAHTXZvCNDH1jAD+oZpAlTTe8ZiEqZ3W65GIB9N4LC9+MZqbJiLslPbq8Tx19htk/A30NjGiF49BwjQhzzsbCP252mKRN9LW6vWYimBiJK8AYvJU47IpPzIKmD2+PIxIPTxCCF9H6eb9UP9+G9z33w65/EO/deWmdZb7MJTaDrcWIwaRYi7N9dC03yeATDZRzO0WRkTf7yhVoRixiWU5a3q69VN6SWnoWW0NOw+RwGo6hgjjCUr/tOnNG9G3gw83gbWz05cz4nIBxTF2I4eDX5gmtjcrYY4FhxIX5vHY6XYabojD6r2w2sE70WckTM+IK8Dy7qdOkZHpi8crSu9OYO3qDNzwzOZ8QkEJ1fjMIlEzEOa+R+KE07XvrhupEyPhVtIY9qcXCutWAqu/8oVPB4/wvWfRowgwtQsYGcQz0n1+yQD7sewx4mHkWINYFgFEDwkNxYhdrMRIWrr1U1ykoQyzi990MRa5+RA/mAJkZkG59g/h7dNKjISbwKoPE3W0+8RIn76BkyzjiTnJLNaeEbMYCekZMYWNbDzRCiGMN6lg4jCMaho/8etIzkiUnhFd+ag4ZXr3NAjTel8ppO67kQ11xgkZ9cQ7TGMlRqwqaQIg+vaHOO18LZH03Ms174ehtYFuclEbuS9i0olASZn/GxUDoPz8t96Xfs3GAEhV9Xk68goCzgsmXOnA0G7Pck01ZGOd/0oWfVe82wsB5YbZ2jVp+BitYpDYggmsdrEK05gSWD2EPSeNB3M1jTlnBIBy5Y2+RNRwKO2rZca3twGekuOwc0Z07+2r8cWBI6ikiSnmm3/MPSMDjQmiTnhGAE3Mer6ToGIknInyEhGmiSJnJCPDUG2hHPNDyMknJkbsxhu9nfSVaWbiEKaxmp9GqqrWZKyxDjjoMO/bIoRnBACU6TOA6TN8C3TfoTSEaWx4RopKoPz1UX/RlJOrCdR+g7QqlR2bITvaDV4Z7N4FtHTneYSoNhTDD4D8fi0AQP31ZRAXX61V6Xh+MwZvUaH/9qMPhHL/84BQIs8VI15oObuEk8DqIZJKGiB0NY13tfAv1EJRgAFDtBc11VqmeZh9RoSS5ruA6i6eIpKk3FhivvlnRFAyGA4Rhmn8WsLbvfHrtwvqqbLRgTUhYiQCz4i53TgiO797FPrvIlC+CBD3MI303OS//Qry3dcgv/gQ8l3dzNnhTl+hxywIPBRHLkYA7bolcvOM/7qFhTeM43YD335l2E6fRxKy2tAUwpHPPwz19l9AfvO5Nr/Yji2+Ny3OU22cab3Pg+cwFCN2saqtd7ks59GI+KZtMTdNLDBUKVRuN4VpQlz4rARRpCIrRghzn5FY32gLi42hn1BPqGZhavcmYgjTBCu1DqOHSEJyRsLtwGqx3M6Nr6ei//70E1cGWy9WWHlGvl/tW6avALTwAoREL0b0Xp/C2OeW6RuIqe+8anxTny8SqtrwoMOB8Ycbz8vqSqgPzYV6762QH76lLUtLi8kswsQaihGbWDYhSnPFxzMSqz4L5ryRcMM0gHX4KVGeEXNpb4wRQhgraiIN09gVR/rvPaKcEYubu59gSZ4+I0JJ8xfcVu3GeyvhnB8uV1xc/sIiZ0Ru0iVu6vvr2BGI+pCpZ7oJIaKfcdiKAyf6+nds+g5y5XLvW3Jjt2ckLQ0YEryRonC5kDbrNqT9ayGUm+7WklI9rP/WOwmgOPwYiJLSAHsh0UIxYhcrz0h6OpBuJUai9IxY5IzYwVzeK/XVNKHyHKy8MwnyjATsehpD9BU1QRvCAf45LHafaPXfe7B9mL0cYVTTxNx7ZEUkSbOm8y1YGWmvI5yconh4RQA/z4js6gzYbt3Wd2L1MFZQFJfeG0IIiB/6KnrUh+ZCXfwiZOU2LZcEAAYOi6hDsxg+Bsrv7tQKA0yFB4Kz7cYVJrDaJVzPSG4+hFWyazD82sHH6MI0cIj3T7lzq/Ez2PCMRNp9NWaY+4zEA33eSMRhmhj8rIK25w/DA5EUE+WFKE/WT9RYYCMk0EMRQmifX5+zpb3h62cRr3Jms2dkxxbj96DHVpjGIn/LRvJquIgfnKDNKL56hdYN9rXntcZonvePOj7yfQoBHDoZysFHQC57E/KT9yAmHAWhLycmMYeeEbsE8oyYQyp2bth+Cawx8ozk5PlK5Sq3Gi9CIcWI6YZcWBzZXBOxxOYMnhHRN4owjd1qGj3Bvo+wPCMRdHSNFeZjBgszmIVLgMTAXov5O8vONZ7X8aikAfzESKCGYQCA3PyId2/phYh1S3v98VwuKL/4I8RZF/uum57E3OwciGN+GMW+06GcdCbSbrsfypkXx2C0JBgUI3ax9Iyk+XlGbLVLV0J0YI0GT95Ia4s2V42HkAmsMRBZsUJ/8w82W3EUiIG+NtGh8hn8q2li8H0Fc2vbqaZJQJ+RoNUFfmIkhcI0gP/3U1JqvHbEK0yj+73I1mZgk3WjL5GbZy+0Z+EZifn8Oub9K2lQpl0I5ddzDMJHHHuK/2+TJC0M09glK8foVu2eZVWawzS2PCPmME0M514ZOBRyVXeilz7bPdIwTTwS0sJEpGdAXHkj5FcfQznjwvgcY8BgiOmXAju2QBz/o+ArxyNME8Sr4D9RXhgdWBORMxIMc85IqntGikt9/XuA+IVpskyeEf3M4jrS7CYUW+WMxFmMeBBjDoJy2/2QC58B2tshpl3gyHFJbKAYsYlQFO2H7Zmx0fMkY76I2GkMFmafEVuYJyEDNPETKnPfPB9KgqsflB9MAX4wJb7HOO288FY0hWlCJrxGSxgdWP2raRLQZyTouinuGTF9h6KkFHJfje79+JxDIi3N1/xw13brLqwAlMJiBCk6DoxlmCZ+OSNmRH4hxE+ud+x4JHYwTBMN+idiz8XFlDMibImR+PQZASxmRAWANFfohj3mMaTak2wwYtX0LFzCERoJ8IxEVDFhHnOqnU/mz1/cx/gdxStnBPCdrwGECAAoMfSMxDtMQ3oHFCPRoBcj3RcXoaQZLyp2yl/9xEgML0zl/cNrJ24eklmMpFJfiFDEqulZuIRTKROO9yTW0DMSPuZzpLgMgP53H8dunlbJ96ZltsWIVVK7g54R0nOhGIkGfcmuXjB4ng7S7M1q6+eliKVnJC3N1yjIQ1hNmJIrTJNUmKt7nPaMWIXYkqEdfLjrZmYb5xVJBcw5MyWlxoeQYJ1Zo8UqqdM0wVtMc0ZstoInqQXFSDRYeEYA+LwhQ0bEZn6NGCez+YVqwin7NJcsU4x4EUqaUZDYLaOVurRUGXg1v3wDqxBbuPPExJKIwjS6dVOox4gXqwRWvaiUwU6AKDGLkb4DIEqN4WSlsMjevs1ixJVuPakoISaYwBoFIifXd8/QPa0qV/wS8osPIWKVYBnrzHqzGAnnqZlhmuDk5AJtrdrf8fZChCMsImlAFisiOYbeRqnUfdWDlRgxeEbiJ0ZEdq5R6/Yb6BdqtB2mMV8nivtwAjkSFhQj0ZBj3cFUKwudYbGBTWKczCYGDg1dGhpqDBQjRrJzAXTPwBr3nJHQ+/e7ASSiA2u466biuaT/zeXma83CHBIjZs+I6NvfT4zYDdMIRdG8qB0d2oI4TJBHeicM00SDoZomjjegZPCMmObHEU50Qe1J6C/wcc8ZsbH/JO4zklLz0njQ26q4e/I1fUm/Gs+cEVMCa98BfqEUJZo+QrrGZ4L5IiRMKEaiIYBnJObE2jOSX2hsWhbO2GM1c3BvJdshYWp3/460g2fOSNjov0PPTLBKYhJYRd/+ELEK0wDGvBF6RkiY2LqDvvXWW3j99ddRX1+PIUOG4Kc//SlGjhwZcP1PP/0UL730EmpqalBRUYFLLrkEhx56qO1BJw0OeUZikgRrZsBQoKFO+zucME0cpjPvTRji8MnoGXGiHby5WV8w9OdcXgqKEb1nyOM90NsvjlEaP89IxQCgZrdhUVpBEdDUbG//+vJeG9WEJDWJ+A7zySef4Omnn8a5556LefPmYciQIZg7dy4aGhos11+/fj3uv/9+nHjiiZg3bx6OOOII3H333di+3boNcU/CMBuvEwmCMcRQURPOza21NW5j6RXk6J42430uJKsYiYQU94wIyzBNgkp784uMc20pCoTV3FvhQs8IsUHEYmTx4sWYOnUqTjjhBAwcOBBXXXUVMjIy8MEHH1iu/8Ybb2DChAk488wzMXDgQFx44YUYPnw43nrrragHn3CcyhmJBwYxEsbYW20+JaUK+qdNu2G1cKsObJxryVbRIAw5I6knRoxhmu6ZtJ1KYDVP7SCE8VqWV6AlotpF1xKeOSMkXCJ6xOrq6sLmzZtx9tlne5cpioLx48djw4YNltts2LAB06ZNMyw75JBDsHz58oDH6ezsRGenb3p7IQSys7O9fzuF51gBj6nzjAhXGC3VoxxHLFEGDYPbs/9w2sHr3y8oCntMIW3YS9CXeQtXur3Pq8vLEenaPiztZ25AF8axHLG/ebbpMGftFYXhn0+RkrTnn776rqRM+64zs3zRmfSM+NnE7TZEgTQxku9b0J1QbPf4IiPT91soSq3S3qQ933oAEYmRxsZGqKqKoqIiw/KioiLs2rXLcpv6+noUFhqffAoLC1FfXx/wOAsXLsSCBQu8r4cNG4Z58+ahrKwskuHGjIoK6/llZGkpqkr7wl27G4WHT0J+Pxut3wNQO2kKWj9dhpwpP0KfGO7XgywrQ/WAweiq3I6CQ49CQYhjdF3yc1R9sARwu1F2y13IinBMgWzYW2g/+gTs+c9TgKKg7w+OhcvGd9b+u7nY8+srACUNFVf/Gq6+vn2Y7bf7wAnoWPMN8s66CMUBjrXv5LPQvPQ1ZB0+GWVxOIfMyL59vedU4eXXBz2nmg6fhLrPlkEpKUW/iUfEvQNrsp1/zUdMxr4P34ZSUIh+R02GkpOHzpl/QPXVPwZUFX1/9SdkxOk7U085E7teeBiypRklv52D3O7j7B57MDrWrULeYZMA2LdZ42GT0LB6BVz9B6Ni/CEGL1iqkGznW09ASBm+P3Dfvn245pprMGfOHIwePdq7/Nlnn8XatWvxl7/8xW+biy66CDNnzsQxxxzjXfb2229jwYIFePTRRy2PE8gzUlNTg66urnCHGzVCCFRUVKC6uhqBzCSb9gN7dgHDRsdUDcvOTmDrBmDYGGN8OYbIpv1A9U5gxAFhjV3u3QO0tUIMGBL2McKxYW9BVu0AXOn2Jkf07GPXDiAjA6K0L4DA9pPtbcD2Tdp3FyDBWXZ1AZvXA8NG+c8tFCdkSzNQtQMYPiboOSWlBLZ8D5T11aq74kSynn9SSmDbRqC4FEJX2SZrqgF3F0TFwPgev34fUL9P6xLd/T15zikxYiz6DRhg22ZSSu28qxgYXe5JDyRZz7dE4nK5wnIkRHSXKygogKIofl6N+vp6P2+Jh6KiIr/k1oaGhoDrA0B6ejrSA8TdE/EFSykDHzc3Dxg22rtezHC5gJHjYr9fPbl5wIgDwj9Gd2zb7gWq1/84u28gUX3Oftb78LNfRmbo8yMtDRgV53PITHYOMHxMeMccNiq89WJAUp5/Q7QKRMO4ukVo3MdaWOwt7/cey3NOecRJNDYL9xzopSTl+ZbkRJSl5HK5MHz4cKxevdq7TFVVrF692uAp0TN69Gh8++23hmWrVq3CqFGjbAyXEEIIIb2NiFOmp02bhvfeew/Lli3Dzp078dhjj6G9vR1TpkwBADz44IN4/vnnveufdtppWLlyJV5//XVUVlZi/vz52LRpE0499dSYfQhCCCGE9FwiTkaYPHkyGhsbMX/+fNTX12Po0KG4+eabvWGX2tpaQ6x4zJgxmDVrFl588UW88MIL6NevH377299i8ODBAY5ACCGEkFQiogTWRFNTU2NIbI03Qgj069cPVVVVjP/ZhDaMDtovOmi/yKHN7EPb+ZOenh5WAit7fBNCCCEkoVCMEEIIISShUIwQQgghJKFQjBBCCCEkoVCMEEIIISShUIwQQgghJKFQjBBCCCEkofSo6RRdcZowLlmP25ugDaOD9osO2i9yaDP70HY+wrVFj2p6RgghhJDeB8M0QWhtbcXvf/97tLa2JnooPRbaMDpov+ig/SKHNrMPbWcfipEgSCmxZcsWtvWNAtowOmi/6KD9Ioc2sw9tZx+KEUIIIYQkFIoRQgghhCQUipEgpKen49xzz0V6enqih9JjoQ2jg/aLDtovcmgz+9B29mE1DSGEEEISCj0jhBBCCEkoFCOEEEIISSgUI4QQQghJKBQjhBBCCEkoKS9G2traEj2EHg3znwkhhERLyoqRmpoazJ07F88++ywAQFXVBI+o59HU1GQQcxQm4eN2uwHwvLOLx260X2Q0NTWhvr4eXV1dAGi/SKiursb8+fNRXV2d6KH0SlJuakEpJR599FF88MEHyMjIwL59+6CqKhQlZXWZLZ544gl8/fXX6NOnD/r06YMZM2aguLg40cPqETz55JPYtWsXbrnlFp53NnjqqadQX1+PG264gfYLEyklnnzySaxcuRK5ubnIysrCr3/9a+Tm5kJKCSFEooeYtEgp8dhjj+Hdd9/F1KlTUVJSkugh9UpSqs/I4sWL8fLLL2PAgAG45pprsHbtWrz//vu46aabeCMNk7a2Ntx3331obm7GRRddhOrqanzwwQfo6OjAzJkzMXjw4EQPMWnZuXMnnnnmGezcuRO1tbW4/vrrceyxx1IMh8mWLVvw7LPPYtu2bdi/fz9uuukmTJgwgfYLwYoVK/DMM88gNzcX559/Pmpra7F48WIMGzYMv/jFLxI9vKTmo48+whNPPIGysjL8/Oc/x4gRI7zvUcTFlpTxjFRVVWH58uW44oorMGXKFACay3Lbtm1eVyVPrtBs3boVe/bswaxZszB06FCMGzcOEyZMwMyZM/Hmm2/ivPPO45NDACorK1FcXIwzzjgDX375JZ555hlMmjQJLlfK/AyjYtOmTSgpKcHpp5+Ojz/+GM888wwmTJgARVH42w3CmjVrcOihh+Kiiy7ynmtbtmzxhgpJYP773/8iOzsbf/jDH1BcXIzt27ejrq4OFRUVKCoqQmZmJs+9GJEyV8GysjLMnj3be9JIKZGbm4vy8nKsWbMGxx13HE+oMGhsbERNTQ2GDh1qWJaXl4fVq1dj3LhxOPbYYxM3wCTE8+R+4IEHYsCAARg4cCDKy8vx6aefYv78+bj44ov5dB8Ghx9+OEaPHo3BgwcjMzMTDzzwABYvXoxp06bxhhCEs846C21tbV4hUl9fj40bN+KII47Ahg0bMHr06ASPMHmZMWMG7rnnHrz99tuorKzE5s2bkZWVhaamJhx44IGYNWsWz7sY0WuvfgsXLsS///1vvPPOO+jq6oLL5YIQwusFEUKgoKAAXV1d6OzsBMAETDNmGwJASUkJSkpK8NJLL3nXe/fdd3HMMccgIyMDX3/9NQDa8vPPP0dLSwsAeEVGXl4eBg4cCAAoLS3F9OnTsXjxYtTW1nqf7omG1blXVFTkDQMOHToUxx9/PF577TW0trZCURQmY8LabgUFBSgvLwcAvP/++7j22muhKAq+/fZbzJs3D88++yw6OjoSOeykwMp2Q4YMwcSJE7Fo0SK4XC7ceOON+MUvfoHLLrsMy5cvx3/+8x8AvN7Fgl6XM7Jr1y7cc889UBQFAwcOxMqVKzF06FBcfPHFGDVqlHc9z5Pobbfdhr59+2LmzJl8uurGyoaDBw/GFVdcgcGDB+Ott97CU089hdGjR2P79u0oLCzEvHnzsHz5cjz55JN48sknE/0REsaaNWvw6KOPoqqqCldddRVOOumkgOs2Njbir3/9K0pKSvDb3/7WwVEmL6F+v/rf6NatW/GPf/wDY8aMwc9//vOU9i6Fe9378MMPUVJSggMPPBBCCHz55Ze49957cffdd3uFcqoRyHYXXHABDjjgALS0tOC1117D1KlTvaIOABYtWoSFCxfiscceQ1paWgI/Qe+g14VpVqxYgZycHNx+++1IS0tDfX095s6di8WLF+Oiiy5CRUWF96LV1dWFfv36ob6+Hm1tbcjKykr08JOCQDZ85ZVXMGPGDJx22mkYOnQoduzYgbKyMhx66KEAgNbWVvTt2xf79+9Hfn5+gj+F8+zcuRPvvPMOxo8fj3HjxuGVV17BYYcdFjA5uqCgAOeeey7uuusurF27FuPGjcPKlStRVlaG/v37Ozz65CCc36/b7UZaWhoGDBiAH/7wh3jhhRdw2mmnYeDAgVi7di0GDx6MvLy8RH8URwnHbgBw7LHHGh64hgwZAiEEdu3albJiJJDt3nzzTRQUFKB///4466yzkJOTY9iupKQELpcLlZWVTNyPAb3qMcLtdmPHjh0oKCjwPiEVFRXhnHPOQW1tLd5//30A8Lp0XS4X8vPzUV9fj6ysLLraENyGe/fuxbvvvgsAGDduHE455RSvEFFVFevXr8fgwYNTUogAWhjm4IMPximnnIJLL70Uqqri9ddfD7rN+PHjMWnSJDz00EO45ZZbcPfdd3vDO6lGuL/ftLQ0SCmRnp6OQw89FAcccAAeeOAB/PGPf8Rf//pXNDY2JvJjOE64dgPg5/ldvnw5Ro8ejYMOOsjRMScLoWy3bNkyAPATIgCwYcMGjBo1ikIkRvQqMZKWlobOzk50dnZCSumNIU+aNAnDhw/Hxo0bsWXLFgC+GN/48eOxdetWVFdXM0SDyGwIaFVK1dXVeOyxx/Ddd9/huOOOA5CaMdSioiJMmTIFAwcORHZ2Ni644AK8/fbb2Lp1a8Bt9u3bh6amJtTW1mLQoEF49NFHMXLkSOcGnUTY+f263W5vVdyAAQPwyCOPpJxXKdLfbG1tLfbs2YMnnngCr776KiZPnoycnJyU/M3atd3jjz+O5cuXp/T1Ltb0GjHiOYmmTp2KVatWYfv27VAUxVu+NmnSJNTW1nq753lifK2trTjhhBO8zX9SmUhtCADffvst/vrXv2Lbtm34wx/+4H3CSlVhp09EPeGEEzB06FDMnz/fsoxy165duP/++1FXV4d77rkH11xzDbKzs50eclIQ6bmnKAo2bdqEO++8E52dnbj33ntT0n6R2q26uhpLly7F7NmzsWXLFtxyyy04+eSTAaTebzZS21VVVeGNN97Arbfeii1btuCmm27CD37wAwCpZ7t40KPESE1NDfbu3QvAv42x5wYwatQojB07Fs888wwAXyXDuHHjIKVEZWWlYfujjjoK11xzDfLz81PihIqlDQFg8uTJmDVrFubOndvr3ZXBbKcXG0IIry1nzJiBr776yltlpKqqN4xQVFSEq6++Gvfeey8GDRrkxEdIKNu3b8e6dess37Nz7pWXl+Paa6/FXXfd1avzHWJpt5KSEhx22GG4/vrrcccdd2DIkCEOfILEEUvb9enTB4cddhhmzZqFOXPm9PrrndP0GDGyfPlyXH/99XjiiScA+E4Yz00hLS0NqqqipaUF559/PtauXYulS5d6T7impiZkZWV5E9s826eCAPEQaxsCWp6EvithbyUc27ndbtTX1wPwnVdjx47F0UcfjQULFni9SG+88QY6OzuRk5Nj6NfSW+nq6sK//vUv/Pa3v8Xq1asN79k996SUyM/PxwEHHODsh3GQeNgtIyMDY8aMwbhx45z9MA4TL9sdeOCBKZtfE296jBjZuHEjRo4cidraWnz22WcAYCjle+ONNzBjxgx88803GDduHM477zy8/PLLeOSRR7Bu3Tr85z//QWtrK8aPH5/Ij5FQaEP7hGO7n/zkJ/jmm2/8wn2nnnoqtmzZgjlz5gAApk2bhvT0dGc/QIJ46623cMUVV6CyshLz5s3DeeedZ3jf7rnX2x8i4mW3VIC265kkfZ8RzwX/8ccfhxACHR0dqKqqwh//+Ee4XC60tLTgsccew5o1a3DxxRcbOqm++eab+Oyzz9Dc3AwhBK6++uqUTA6kDe0Tie0uueQSQ+mkqqr43//+h3/9618YPnw4fvazn2HYsGEJ/kTOsWvXLvz2t7/F4Ycfjl/96lcAtJyFnJwc5OTkwOVyob29Hf/85z+xbt06nnvd0G72oe16LkkvRgDNJfuXv/wF559/Pvbv349nn30WJ510Ek477TS0tLSgqqoK/fv39yav6Z9YVVVFbW2toVlNKkIb2idS23lob2/He++9h4yMjKDNz3ornZ2dePXVV/Huu+/itttuw8svv4ytW7dCSomKigqcccYZOOigg7Bx40b079/fWz6Z6uce7WYf2q7nklRi5LPPPkNOTg4GDRrkbRTlOUn++te/4uyzz8bAgQOxZMkSfPXVVxg0aBAGDx6MadOmcbKxbmhD+9B20WFlv5qaGsyZMwfV1dWYMmUKJk2ahKamJnzwwQdoamrCVVddhZEjR6Z091TazT60Xe8hKa6gH374IZ555hmUlZVhz5496NevH8444wwceeSRUBQFTU1N2LJlC0aNGuV1s+3atQtVVVW8EXRDG9qHtosOK/tNmzYNRx11FIqLi3HppZdi27Zt+NGPfuR9Eq2oqMDzzz+P//73vxg5cmRK3hRoN/vQdr2PhF5F3W433n77bbzzzju46KKLcNxxx2HTpk1455138N5772HixIlIT09HR0cHxo0bh88//xwLFy5EXV0dxo8fj927d3uTBVNV5dKG9qHtoiOY/d5//31MnDjRUIGgn27B82TqmaQylaDd7EPb9V4SevVsb29HY2Mjjj/+eEyZMgUulwtjxozBwIED0dLS4u3doKoqPv30Uzz44IMYO3YsHnjgAcyYMQNlZWV46qmntA+SYjcCD7ShfWi76AhlP08JZXZ2tt+8T/v37/fOZZRq0G72oe16L457RqqqqlBRUQEhBHJycvCDH/wAgwcP9s4XoygKSktL0d7e7nV/l5aW4oYbbkB5ebk3szk3NxdHHHEEWltbvU+nvb3czwNtaB/aLjrs2E9PR0cHmpub8eKLLwKAt4Nlb4d2sw9tlxo4JkY++eQTPPfcc0hPT0dOTg5OOukknHjiid6mT3o394oVKzB06FC4XC50dXXB5XJh8uTJ3n15phGfOnVqSj2R0ob2oe2iw6799Ms/+eQTrFmzBp999hkGDx6MG2+8sdc/pdJu9qHtUgtHxMiqVavw3HPP4cwzz0Tfvn2xatUqPProo1BVFccddxwyMjK8LbQ7OzuxY8cOnHHGGdoAdUrXc5J5nkBT5UYA0IbRQNtFRzT209to4MCBqKqqwqxZs3DIIYck6uM4Bu1mH9ou9YirGPE8QW7YsAH5+fmYOnUqXC4XJkyYgI6ODrz33nsoKCjAkUce6b3ANzU1oaWlBaNGjQKgueiWLl2Kyy67LGUu/npoQ/vQdtERK/u9/fbbuPzyyzF48OCUmM+DdrMPbZe6xPXq6jlZdu7cib59+3rd3gBw4YUXIj09HcuXL/fO5wFos8CWlpaiuLgYTz75JG688UbU1NSgq6srJWfVpQ3tQ9tFR6zsV1tbm1L2o93sQ9ulLjH1jKxatQpffvkl+vbtizFjxniT/Q466CA888wzUFXVe3Ll5eXhuOOOw+uvv47KykoUFRVBSomvvvoK27dvx8yZM1FUVIQ5c+akxERsHmhD+9B20UH72YN2sw9tRzzExDNSV1eHO++8E//4xz+8ne7mzJmDjRs3AtCmYs7OzsbLL79s2O6kk05Ca2srtm7dCkDLeu7o6EBWVhauvPJK3HvvvSlzUtGG9qHtooP2swftZh/ajpiJ2jPS3t6O559/HllZWZg7d663n//NN9+MpUuXYuTIkSguLsbJJ5+MV155BVOnTkVpaak3Nti/f3/s2LEDAJCZmYnzzz8fw4cPj3ZYPQra0D60XXTQfvag3exD2xErovaMZGZmIj09HVOmTEF5ebm3UdTEiRNRWVkJKSWys7NxzDHHYNiwYfj73/+OmpoaCCFQW1uLhoYGHHnkkd79peJJRRvah7aLDtrPHrSbfWg7YkVMJsrz9GIAfOWPDzzwADIzM3H11Vd719u3bx9mz54Nt9uNESNGYP369RgwYABmzZqFoqKiaIfRo6EN7UPbRQftZw/azT60HTETt1l7//jHP2Lq1KmYMmWKt0Wvoiiorq7G5s2b8f3332PIkCGYMmVKPA7fK6AN7UPbRQftZw/azT60XWoTlz4ju3fvRnV1tbe+W1EUdHV1QVEUVFRUoKKiwtDRkvhDG9qHtosO2s8etJt9aDsS0z4jHifLd999h6ysLG8s7+WXX8aTTz6JhoaGWB6uV0Ib2oe2iw7azx60m31oO+Ihpp4RT8OajRs34qijjsKqVavw8MMPo6OjA9dffz0KCwtjebheCW1oH9ouOmg/e9Bu9qHtiIeYh2k6OjqwcuVK7N69G2+++SbOO+88nH322bE+TK+GNrQPbRcdtJ89aDf70HYEiIMYycjIQFlZGQ4++GD85Cc/QUZGRqwP0euhDe1D20UH7WcP2s0+tB0B4lRNo5/CmdiDNrQPbRcdtJ89aDf70HYkbqW9hBBCCCHhQClKCCGEkIRCMUIIIYSQhEIxQgghhJCEQjFCCCGEkIRCMUIIIYSQhEIxQgghhJCEQjFCCCGEkIRCMUIISXr27NmD888/H8uWLUv0UAghcSDm7eAJIcnNsmXL8H//93/e1+np6cjLy8PgwYMxceJEnHDCCcjOzo54v+vXr8fKlStx+umnIzc319bYPvroIzQ0NOD000+3tT0hpGdCMUJIinL++eejvLwcbrcb9fX1WLt2LZ566iksWbIEv/vd7zBkyJCI9rd+/XosWLAAU6ZMiUqM7Nixw0+MlJWV4dlnn4XLxUsWIb0R/rIJSVEmTpyIESNGeF9Pnz4dq1evxp133om77roLf//735Nm0jIhRNKMhRASeyhGCCFeDjroIPz4xz/GCy+8gA8//BAnnXQStm3bhsWLF2PdunWoq6tDTk4OJk6ciEsvvRT5+fkAgPnz52PBggUAgOuvv967vwcffBDl5eUAgA8//BBLlizBzp07kZGRgUMOOQQzZsxAaWkpAGD27NlYu3YtAM1rA2gekYceegh79uzB9ddfj+uuuw5TpkwBADz00EP47LPP8Pe//x2PPfYY1qxZg5ycHEyfPh2nnnoqtm/fjieffBIbN25Efn4+Lr74YhxzzDGGz9vc3IyXX34Zn3/+ORoaGtCnTx9MnToVZ555JiduI8RBKEYIIQaOO+44vPDCC1i1ahVOOukkrFq1Cnv27MGUKVNQVFSEnTt34t1338XOnTsxd+5cCCFw1FFHoaqqCh9//DEuu+wyr0gpKCgAALzyyit46aWXMGnSJEydOhWNjY1488038ac//Ql33XUXcnNzcc4556ClpQV79+7FZZddBgDIysoKOlZVVfGXv/wFY8eOxYwZM/DRRx/hiSeeQFZWFl544QUce+yxOOqoo/DOO+/gwQcfxOjRo73iqL29HbNnz8a+fftw0kknobS0FOvXr8cLL7yA+vp6XH755fEzMiHEAMUIIcRAnz59kJOTg927dwMATjnlFJxxxhmGdUaNGoX7778f3333HcaOHYshQ4Zg2LBh+Pjjj3HEEUd4b/gAUFNTg/nz5+OCCy7AOeec411+5JFH4ve//z3efvttnHPOOTj44INRUlKC5uZmHHfccWGNtbOzE8ceeyymT58OADjmmGNw9dVX45///CduuOEGTJ48GQBw8MEH45e//CWWLVvm9bosXrwY1dXVuOuuu9CvXz8AwA9/+EOUlJRg0aJFmDZtmtdrQwiJL/RDEkL8yMrKQmtrKwAYcjU6OjrQ2NiIUaNGAQC2bNkScl+ff/45pJSYPHkyGhsbvf+KiopQUVGBNWvWRDXWqVOnev/Ozc1F//79kZmZiUmTJnmX9+/fH7m5udizZ4932WeffYaxY8ciNzfXMK7x48dDVVWsW7cuqnERQsKHnhFCiB9tbW0oLCwEADQ1NeHll1/GJ598goaGBsN6LS0tIfdVXV0NKSVmzZpl+X40FTLp6eneUJCHnJwc9OnTB0IIv+VNTU3e11VVVdi2bRt+9rOfWe7b/FkJIfGDYoQQYmDv3r1oaWlB3759AQB///vfsX79epx55pkYOnQosrKyvLkaqqqG3J+qqhBC4KabbrJMCg2VFxKMQEmm4SSfSilx8MEH48wzz7R8v3///rbHRQiJDIoRQoiBDz/8EAAwYcIENDU14dtvv8X555+Pc88917tOVVWV33ZmT4SHiooKSClRXl6eVDf4vn37oq2tDQcffHCih0JIysOcEUKIl9WrV+M///kPysvLccwxx3g9DFJKw3pLlizx2zYzMxOAf+jmyCOPhKIoWLBggd9+pJTYv3+/93VWVlZYoZ9YMGnSJGzYsAHffPON33vNzc1wu92OjIMQQs8IISnL119/jcrKSqiqivr6eqxZswarVq1CaWkpfve73yEjIwMZGRkYO3YsFi1aBLfbjZKSEqxcudKQCOph+PDhAIAXXngBRx99NNLS0nDYYYehoqICF154IZ5//nnU1NTgiCOOQFZWFvbs2YPly5d7+3p49vHJJ5/gqaeewogRI5CVlYXDDz88Lp//zDPPxJdffol58+bh+OOPx/Dhw9He3o7t27fjs88+w0MPPeSXj0IIiQ8UI4SkKPPnzwegJZB65qa57LLL/OamueGGG/DEE0/g7bff9uZZ3Hzzzbj66qsN+xs5ciQuuOACvPPOO/jmm28gpcSDDz6IrKwsnH322ejXrx+WLFmCl19+GQBQWlqKgw8+2CA2Tj75ZGzduhXLli3DkiVLUFZWFjcxkpmZidtvvx2vvPIKPvvsM3z44YfIzs5G//79cf755yMnJycuxyWE+COk2W9KCCGEEOIgzBkhhBBCSEKhGCGEEEJIQqEYIYQQQkhCoRghhBBCSEKhGCGEEEJIQqEYIYQQQkhCoRghhBBCSEKhGCGEEEJIQqEYIYQQQkhCoRghhBBCSEKhGCGEEEJIQqEYIYQQQkhC+X9y+ob5Q5HdWgAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiMAAAGkCAYAAADjdyVMAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABlF0lEQVR4nO3dd3hUZdoG8Ps9mXRIIwlJCKH3LoICAlEQWEEUFRTEunYsq7v2srDCp9gL7q4FCyAqoLgISFMQG4qFjiC9JSQBkpBezvv9cTIz50xJmZnMJDn377q8zMycmXnnYcpznrcJKaUEERERUYAogW4AERERmRuTESIiIgooJiNEREQUUExGiIiIKKCYjBAREVFAMRkhIiKigGIyQkRERAHFZISIiIgCiskIERERBZQl0A2oizNnzqCiosKvz5mQkIDs7Gy/PmdTxVh6jzH0HmPoGcbNN8wWR4vFgtjY2JqP80NbfKaiogLl5eV+ez4hhO15uWq+dxhL7zGG3mMMPcO4+Qbj6B67aYiIiCigmIwQERFRQDEZISIiooBiMkJEREQBxWSEiIiIAorJCBEREQUUkxEiIiIKKCYjREREFFBMRoiIiCigmIwQERFRQDEZCRBZXARZWRnoZhAREQUck5EAkPv/gPqP66E+eSdkeVmgm0NERBRQTEYCQH39aaCsDMjOhPxmVaCbQ0REFFBMRgKh8Kz976LCwLWDiIioAbDU5eClS5fi559/xvHjxxESEoLOnTtj6tSpSElJcXufDRs24N///rfhuuDgYHz44YeetZiIiIialDolI7t27cLo0aPRoUMHVFZW4qOPPsLMmTPx0ksvISwszO39wsPD8eqrr3rdWCIiImp66pSMPP7444bL06ZNwy233IIDBw6ge/fubu8nhEBMTIxHDSQiIqKmrU7JiKOioiIAQLNmzao9rqSkBHfddReklGjXrh0mT56M1q1buz2+vLwc5eXltstCCISHh9v+9hfrc9Xncwoh/PqaAsUfsWzqGEPvMYaeYdx8g3F0T0gppSd3VFUVzz33HAoLC/H000+7PW7v3r3IyMhAmzZtUFRUhGXLlmH37t146aWX0KJFC5f3WbRoEZYsWWK73K5dO8yePduTZjZIR8eea/s76trbED3ltgC2hoiIKLA8TkbefvttbNmyBf/617/cJhWuVFRU4P7778eQIUNwzTXXuDzGXWUkOzsbFRUVnjTXI0IIJCUlITMzEx6GyaWKWy61/a2MnwJl/GSfPXZDVV+xNBPG0HuMoWcYN98wYxwtFgsSEhJqPs6TB587dy5+++03zJgxo06JiLVh7dq1Q2ZmpttjgoODERwc7PK2QPwDSinr7Xnr87EbIrO93vrAGHqPMfQM4+YbjKOzOq0zIqXE3Llz8fPPP+Opp55CYmJinZ9QVVUcOXIEsbGxdb4vERERNT11qozMnTsX3333HR566CGEh4cjNzcXABAREYGQkBAAwJw5cxAXF4cpU6YAAJYsWYJOnTohKSkJhYWFWLZsGbKzszFixAjfvhIiIiJqlOqUjKxZswYAMH36dMP1d911F9LT0wEAOTk5hpHCBQUFePPNN5Gbm4vIyEi0b98eM2fORGpqqnctJyIioiahTsnIokWLajzGMVG58cYbceONN9blaYiIiMhEuDcNERERBRSTESIiIgooJiNEREQUUExGiIiIKKCYjBAREVFAMRkhIiKigGIyQkRERAHFZISIiIgCiskIERERBRSTESIiIgooJiNEREQUUExGiIiIKKCYjBAREVFAMRkhIiKigGIyQkRERAHFZISIiIgCiskIERERBRSTESIiIgooJiNEREQUUExGiIiIKKCYjBAREVFAMRkhIiKigGIyQkRERAHFZISIiIgCiskIERERBRSTESIiIgooJiNEREQUUExGiIiIKKCYjASaEIFuARERUUAxGQk0KQPdAiIiooBiMkJEREQBxWQk0NhNQ0REJsdkJNDYTUNERCbHZISIiIgCislIoLGbhoiITI7JSKCxm4aIiEyOyUigMRkhIiKTYzIScExGiIjI3JiMBBorI0REZHJMRgKNyQgREZkck5FAYzJCREQmx2Qk4JiMEBGRuTEZCTSVyQgREZkbk5GAYzJCRETmxmQk0JiLEBGRyTEZCTSpBroFREREAcVkJNBYGSEiIpOz1OXgpUuX4ueff8bx48cREhKCzp07Y+rUqUhJSan2fj/++CM++eQTZGdnIykpCddeey3OOeccrxredDAbISIic6tTZWTXrl0YPXo0Zs2ahSeeeAKVlZWYOXMmSkpK3N5nz549ePXVV3HRRRdh9uzZGDBgAJ5//nkcOXLE68Y3CVxnhIiITK5Oycjjjz+O9PR0tG7dGm3btsW0adOQk5ODAwcO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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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/OQnP9GFitsEAgF87GMfw5///GccPXo04fM9e/bgoYcewuLFi/G9730P1157LR5//HGsW7cOAHDuuedi165daG1t1b9z4MAB7Nu3D+ecc05ObAaAOXPmYPLkyXoORKrjvmnTJnzve9/DwoULsWLFCnzzm980CNtcMTg4iGXLluH+++/Ht771LTDG8L3vfU9/Whb89re/xYc+9CE88MADaGpqwsMPP4xYLJZz++x499138cgjj+CDH/wgHnzwQXz+85/HunXr8OSTTxqWe/zxx3HmmWfiu9/9Ls455xx8//vfd9z6PBUXXHCBfp4BwIsvvpggLJzu39/85je47LLL8NBDD2H+/Pmu2OfkuvmrX/0Kn/zkJ/Hf//3fqKysxIoVKxCNRvXPh4aG8Ic//AFf+MIX8OCDD6K6utoV22Tc2I9Lly7F+vXrDdfdl19+GWPGjMGcOXNctzld1qxZg0WLFum/8R/84AdpedVJoPiYF198UVfXCxYsQH9/P7Zt2+b4+88++ywuvPBCXHDBBWhubsY111yjPyW4STAYxM0334yXXnoJN9xwA775zW/isccew759+wAA27dvx65du/Dv//7vmD59OpqamvDJT34SZWVleO211/T1RCIR3HrrrZgyZQpOOukkfOYzn8Err7yCzs7OrG1saWkB5xzjx4+3/Hz8+PHo6+vD7t278eqrr+KLX/wizjjjDIwbNw5z587F4sWLEQgE9HBLdXU1ampqXPPuWHHGGWdgypQpljknzzzzDObOnYtrrrkGzc3NWLJkCS699FI8/fTTAICJEydi8uTJWL9+vf6dv//975g5c2bOcxjGjx+P9vZ2R8f9ySefxOLFi7F8+XJMmDABU6ZMwVVXXZVT+wDgrLPOwplnnonGxkZMmTIFX/ziF7F///6Em/iHPvQhnHLKKWhubsby5ctx5MgRg+jLJZs2bcK//Mu/6P8efPBBrFmzBldeeSWWLFmCcePGYd68efjoRz+Kv/3tbwnbt3TpUjQ3N+O6667D9OnT8eyzz7pi13nnnYft27fjyJEjOHLkCLZv365fp+Txnezfyy+/HGeeeSYaGhpQW1vrin1OrpvXXnst5s2bh0mTJuHWW29FV1eXIbE4Fovhs5/9LGbPno3m5mYUFxe7YpuMG/vxjDPOAKB61QQvvfQSlixZAsaY6zany/nnn49zzjkHjY2N+NjHPobBwUHs2rXL8fcpxONTDh8+jF27duErX/kKAFUELF68GC+88AJOPvlkx+u4+OKLDe/NmDEDW7dudd3es846C6eccgq2b9+OnTt3YvPmzXj66afxhS98AYODgxgcHMRnPvMZw3eGh4cNF/v6+npDrHjWrFngnOPw4cOWru5c0N7ejkAgoIeqvOYTn/gE7r33Xj10Izh06FCCq3T27NlYu3YtFEVBIBDQnx6vueYafcKuZcuW5dxmzjkYY9i7d2/K4753714sXbo05zaZaWlpweOPP45du3ahp6dHfyLt6OgwiHj5b3EOdnV12QpdNzn55JNx44036q+Li4vxla98Bdu3bzd4TBRFQSQSwdDQkH4jNYehZs6cqT8wZEtVVRUWLlyIdevWgXOOU045JSE3xun+nTZtmis2CZxeN+X9U1FRgebmZhw6dEh/LxQKYfLkya7aZsaN/VhUVITzzjsPL774IhYvXow9e/Zg//79vkkEl/dhSUkJSktL0dXV5fj7JFAkGGMJrkCv3LkvvPACYrEYbrrpJv09zjnC4TA++9nP+spWQVFREebNm4d58+bhmmuuwf/+7/9i9erVuPjii1FbW4u777474Tu59EDINDY2gjGGgwcP6k8dMocOHUJ5eXlC+MdrTjrpJMyfPx+PPfZY2vH5s88+G7/5zW+wZ88eDA8P4+jRo1i8eHFuDJU4dOgQGhoaMDg4mPK4e7W/V6xYgbFjx+Kmm25CbW0tOOe4/fbbDW5+AIakTfFEmq/m28XFxQnersHBQSxfvhxnnnlmwvL5bIV+4YUXYuXKlQBgyH8QON2/JSUlrtqV6rrplKKiorx4INzYj0uXLsUdd9yBo0ePYt26dZgzZ44hjyUXOL3/mBPlrb6XDBIoElVVVYZwQn9/P9rb2/NuRywWw0svvYRPfvKTmDdvnuGz7373u1i/fj3Gjh2reybEj3zv3r2GZZubm7F7926cf/75+nu7d+/Ouf2CCRMm4I033sC0adPQ2dmJQCCQNNGso6PDkHG/c+dOMMbQ3NyctS2VlZWYN28ennvuOSxbtsxwY+zs7MT69etx3nnnYdKkSeCcY9u2bQn7HojfsMyx9FzyiU98AnfccYdhP4wfPx47duwwLLdjxw40Nzfr1QZ1dXU46aSTsH79egwPD2PevHk5iaXLbN26Ffv378fll1+Ourq6lMd98uTJePvtt3HBBRfk1C6Znp4eHD58GDfddBNOPPFEAGoYshCYNm0aDh8+nDJM99577xl+9++99x6mTp3qmh0LFixANBoFYwwLFiwwfObV/nVy3RSer507d+rVMr29vWhpacmLV8yMG/tx0qRJmD59Op5//nmsX78+wWOZC/J1rySBIjFnzhysW7cOp556KsrLy/H444970s/hn//8J/r6+nDhhRcmeBjOPPNMvPjii/jGN76BoqIirFq1Ch/84Aexa9cuQ8IVAFx66aX4v//7P0ybNg2zZ8/Ghg0bsG/fPowbN85Ve3t6evDggw/iggsuwOTJk1FaWordu3fjD3/4A0477TTMnTsXs2bNwne/+11cf/31aGpqwvHjx7Fp0yacccYZmD59OgD1CfCHP/wh/uVf/gUDAwP4+c9/jkWLFrkW3vnMZz6Du+66C/fddx8++tGPoqGhAQcPHsSvfvUrjBkzBh/72MdQUVGB888/Hz/+8Y/x6U9/GlOmTMGRI0fQ1dWFxYsXY+zYsWCM4Z///CdOOeUUFBUVuf4UaGbSpEk499xz8ec//1l/b9myZfja176GNWvWYPHixdi5cyeeffZZfO5znzN895xzzsHq1asRjUbxqU99ylW7otEoOjs7DWXGv//973HKKafg/PPPB2Ms5XG/5pprcO+996KxsRGLFy+GoijYtGmTof+L25SXl6OyshJ/+9vfUFtbi46ODvzmN7/J2Xhu8pGPfAQrVqxAfX09zjrrLDDGsG/fPhw4cADXXXedvtyrr76KadOm4YQTTsD69euxa9cufPGLX3TNjkAggIceekj/W8ar/evkuikq4p544glUVlaiuroav/3tb1FZWWnpWc01bu3HCy+8ED/72c9QXFycl+3I171y1AsUzrnuhrryyivR3t6O+++/H2VlZfjoRz/qiQflhRdewNy5cy3DH2eddRaefvppHD16FF/60pfw61//Gs8//zzmzJmDa6+9Fj/5yU/0Zc8991y0tbXhV7/6FSKRCBYtWoQlS5aklaTkhJKSEsycORNr165FW1sbYrEY6urqsHTpUlx99dVgjOFrX/saVq1ahR/96Efo7u5GTU0NTjzxRMMTfWNjI84880z893//N3p7e3Hqqacm3HCzoampCffffz9Wr16Nhx56CL29vaipqcHpp5+Oa6+9Vk+A/dznPodVq1Zh5cqV6OnpQX19vZ64OWbMGFx77bV47LHH8OMf/xjnnXdeXhoqLV++HBs2bNBfT5s2DV/+8pexevVqPPHEE6itrcXy5csTwkBnnXUWfvaznyEQCLh+4dq8eTM+//nPIxgMory8HJMnT8anP/1pnH/++frFKtVxP/nkk/Hv//7veOKJJ/D73/8epaWl+tOi24jfeiAQwG233Yaf//znuP3229Hc3IxPf/rTlqEov7FgwQJ89atfxRNPPIE//OEPCAaDGD9+PC688ELDcuJ8WblyJWpqanDbbbdhwoQJrtpiF571av86uW6KPJyPf/zj+MUvfqGXGX/1q191rQdLurixH8855xz88pe/xNlnn52zsKkX98pRP5vxfffdh8bGxrTik4XMt7/9bdTU1OBLX/qS16YYEH1Q3OzPQhAyo+23TiSSj07QXtDe3o4vfelL+O///m/XE48FXvx+Rm2ZcW9vL/75z39i27ZtOWtm4zVDQ0N45plncODAARw6dAirV6/G22+/bYhNE8RIZzT81onRiQiz/va3v8WsWbNyIk68/P2M2hDPj3/8Y+zevRvLli3D6aef7rU5OYExhjfffBNPPvkkIpEImpubcfvtt1smfxLESGU0/NaJ0cmOHTtwzz33oKmpSW8i6TZe/n5GfYiHIAiCIAj/MWpDPARBEARB+BcSKARBEARB+A4SKARBEARB+I5RmyRLEMTI46mnnsLGjRtx6NAhFBUVYdasWbj++usNXXiHh4fx6KOPYsOGDYhEIpg/fz4+97nP6Q0B9+7di9///vfYsWMHuru70dDQgA984AO47LLL9HWIclUzP/nJT/I2bxRBjHRIoBAEMWLYtm0bLrnkEkyfPh2xWAyrVq3Cd77zHTz44IN6x99f/vKX2LRpE/793/8dZWVlWLlyJf7nf/4H3/72twEAe/bsQXV1Nb70pS+hrq4OO3bswE9+8hMEAgFceumlhvG+//3vGxptmSd7Iwgic0igEAQxYvjGN75heH3LLbfgc5/7HPbs2YOTTjoJ/f39eOGFF3Dbbbdhzpw5AICbb74ZX/7yl7Fz507MmjUroSvruHHjsHPnTrz++usJAqW6unpENfwiCD9BAoUgiBFLf38/AOjTGOzZswexWMzQcGr8+PGor6/XBYrdesQ6ZO68805EIhFMnDgR1157LU444YQcbAVBjE4oSZYgiBGJoij4xS9+gdmzZ2PSpEkA1JmrQ6FQgtejurraMDurzI4dO/Dqq6/ioosu0t+rra3FjTfeiNtvvx2333476urqcM8992DPnj052x6CGG2QB4UgiBHJypUrceDAAdx7770Zr2P//v144IEHcM0112D+/Pn6+83NzYbE29mzZ6OtrQ1r16713TxXBFGokAeFIIgRx8qVK7Fp0yb853/+J+rq6vT3a2pqEI1G0dfXZ1i+q6srofrm4MGD+Pa3v42LLroIH/nIR1KOOWPGDLS2trpiP0EQJFAIghhBcM6xcuVKbNy4Ed/61rfQ0NBg+HzatGkIBoN4++239fcOHz6Mjo4OQ/7JgQMHcM899+D888/Hxz72MUdj7927F7W1te5sCEEQFOIhCGLksHLlSqxfvx533nknSktL9bySsrIyFBUVoaysDBdeeCEeffRRVFRUoKysDD/72c8wa9YsXaDs378f9957L+bPn49ly5bp6wgEAnoZ8dq1a9HQ0ICJEydieHgYL7zwArZu3Yq77rrLi80miBEJTRZIEMSIYfny5Zbv33zzzViyZAmAeKO2V155BdFoNKFR2+rVq7FmzZqEdYwdOxY//OEPAQB/+MMf8Le//Q3Hjh1DcXExJk+ejI985CN66TJBENlDAoUgCIIgCN9BOSgEQRAEQfgOEigEQRAEQfgOEigEQRAEQfgOEigEQRAEQfgOEigEQRAEQfgOEigEQRAEQfgOEigEQRAEQfgOEigEQfie9vZ2LF++HOvWrfPaFIIg8gS1uieIUca6devwox/9SH8dDodRUVGBSZMmYeHChbjgggtQWlqa9np37NiBLVu24PLLL0d5eXlGtq1fvx5dXV24/PLLM/o+QRAjBxIoBDFKWb58ORoaGhCLxdDZ2Ylt27bhl7/8JdauXYs777wTkydPTmt9O3bswJo1a7BkyZKsBMqBAwcSBMrYsWPx61//GqEQXbIIYrRAv3aCGKUsXLgQ06dP119fddVV2Lp1K+6//3488MADeOihh1BUVOShhXEYY76xhSCI/EAChSAInTlz5uAjH/kIVq1ahZdffhkXXXQR9u3bh2eeeQbvvvsujh8/jrKyMixcuBD/8i//gsrKSgDGCfZuvfVWfX2PPPIIGhoaAAAvv/wy1q5di4MHD6KoqAjz58/H9ddfj/r6egDA3XffjW3btgGIT/onJuhrb2/Hrbfeapj074c//CFee+01PPTQQ/jpT3+Kd955B2VlZbjqqqtw6aWXYv/+/fj5z3+OXbt2obKyEh//+MdxzjnnGLa3r68Pv/vd7/D666+jq6sLdXV1WLp0Ka644goEApSiRxBeQgKFIAgD5513HlatWoW33noLF110Ed566y20t7djyZIlqKmpwcGDB/G3v/0NBw8exH333QfGGM4880y0tLTglVdewac+9SlduFRVVQEAnnzySTz++ONYtGgRli5diu7ubvz5z3/Gf/7nf+KBBx5AeXk5rr76avT39+Po0aP41Kc+BQAoKSlJaquiKPiv//ovnHjiibj++uuxfv16/OxnP0NJSQlWrVqFc889F2eeeSb++te/4pFHHsGsWbN0wTQ0NIS7774bx44dw0UXXYT6+nrs2LEDq1atQmdnJ2644Ybc7WSCIFJCAoUgCAN1dXUoKytDW1sbAOCSSy7Bhz70IcMyM2fOxMMPP4zt27fjxBNPxOTJkzF16lS88sorOP3003URAABHjhzB6tWr8dGPfhRXX321/v4ZZ5yBr371q/jLX/6Cq6++GvPmzcOYMWPQ19eH8847z5GtkUgE5557Lq666ioAwDnnnIObbroJP/7xj3Hbbbdh8eLFAIB58+bh3/7t37Bu3TrdO/PMM8+gtbUVDzzwAJqamgAAH/jABzBmzBg8/fTTWLZsme7dIQgi/5APkyCIBEpKSjAwMAAAhtyP4eFhdHd3Y+bMmQCA999/P+W6Xn/9dXDOsXjxYnR3d+v/ampq0NjYiHfeeScrW5cuXar/XV5ejubmZhQXF2PRokX6+83NzSgvL0d7e7v+3muvvYYTTzwR5eXlBrvmzp0LRVHw7rvvZmUXQRDZQR4UgiASGBwcRHV1NQCgt7cXv/vd77BhwwZ0dXUZluvv70+5rtbWVnDO8a//+q+Wn2dTmRMOh/UwkqCsrAx1dXVgjCW839vbq79uaWnBvn378LnPfc5y3eZtJQgiv5BAIQjCwNGjR9Hf349x48YBAB566CHs2LEDV1xxBaZMmYKSkhI990NRlJTrUxQFjDF87Wtfs0w8TZVnkgy7RFYnCa6cc8ybNw9XXHGF5efNzc0Z20UQRPaQQCEIwsDLL78MAFiwYAF6e3vx9ttvY/ny5bjmmmv0ZVpaWhK+Z/ZYCBobG8E5R0NDg69u+uPGjcPg4CDmzZvntSkEQVhAOSgEQehs3boVTzzxBBoaGnDOOefongjOuWG5tWvXJny3uLgYQGLY54wzzkAgEMCaNWsS1sM5R09Pj/66pKTEUdjIDRYtWoSdO3di8+bNCZ/19fUhFovlxQ6CIKwhDwpBjFLefPNNHDp0CIqioLOzE++88w7eeust1NfX484770RRURGKiopw4okn4umnn0YsFsOYMWOwZcsWQ7KpYNq0aQCAVatW4eyzz0YwGMSpp56KxsZGXHfddXjsscdw5MgRnH766SgpKUF7ezveeOMNve+IWMeGDRvwy1/+EtOnT0dJSQlOO+20nGz/FVdcgX/84x9YsWIFzj//fEybNg1DQ0PYv38/XnvtNfzwhz9MyG8hCCJ/kEAhiFHK6tWrAahJqmIunk996lMJc/Hcdttt+NnPfoa//OUvet7G17/+ddx0002G9c2YMQMf/ehH8de//hWbN28G5xyPPPIISkpKcOWVV6KpqQlr167F7373OwBAfX095s2bZxAgF198Mfbu3Yt169Zh7dq1GDt2bM4ESnFxMe655x48+eSTeO211/Dyyy+jtLQUzc3NWL58OcrKynIyLkEQzmDc7HMlCIIgCILwGMpBIQiCIAjCd5BAIQiCIAjCd5BAIQiCIAjCd5BAIQiCIAjCd5BAIQiCIAjCd5BAIQiCIAjCd5BAIQiCIAjCd5BAIQiCIAjCd5BAIQiCIAjCd5BAIQiCIAjCd5BAIQiCIAjCd5BAIQiCIAjCd5BAIQiCIAjCd/x/aCUYQ98vEosAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "filtered\n", - "id\n", - "df = data.copy()\n", - "col = 'Midpoint'\n", - "\n", - "\n", - "def mad_zscore_spike_flag(df, threshold=10, window=10, col ='Midpoint'):\n", - " \"\"\"\n", - " Add a flag to the DataFrame indicating if the change in 'Midpoint' exceeds the threshold.\n", - " \"\"\"\n", - " df = df.copy()\n", - " median = df[col].rolling(window).median()\n", - " mad = lambda x: np.median(np.abs(x - np.median(x))) ## lambda function that calculates median absolute deviation. x is a series, therefore x - median(x)\n", - " rolling_mad = df[col].rolling(window).apply(mad) ## Apply function\n", - " zscore_like = (df[col] - median) / rolling_mad ## Z-score like calculation\n", - " return zscore_like.abs() > threshold\n", - "\n", - "def mad_band_spike_flag(df, threshold=2, window=20, col='Midpoint'): \n", - " \"\"\"\n", - " Add a flag to the DataFrame indicating if the change in 'Midpoint' exceeds the threshold.\n", - " \"\"\"\n", - " df = df.copy()\n", - " median = df[col].rolling(window).median()\n", - " mad = df[col].rolling(window).apply(lambda x: np.median(np.abs(x - np.median(x))))\n", - " return (df[col] - median).abs() > threshold * mad\n", - "\n", - "def quantile_band_spike_flag(df, window=20, upper_quantile=0.90, lower_quantile=0.10, col='Midpoint'):\n", - " \"\"\"\n", - " Add a flag to the DataFrame indicating if the change in 'Midpoint' exceeds the threshold.\n", - " \"\"\"\n", - " df = df.copy()\n", - " quantile = df[col].rolling(window).quantile(upper_quantile)\n", - " quantile_down = df[col].rolling(window).quantile(lower_quantile)\n", - " return (df[col] > quantile) | (df[col] < quantile_down)\n", - "\n", - "## Relative MAD\n", - "flag = mad_band_spike_flag(df, threshold=3, window=20)\n", - "\n", - "## Quantile Spike\n", - "q_flag = quantile_band_spike_flag(df, window=20, upper_quantile=0.95, lower_quantile=0.05, col=col)\n", - "\n", - "## Plotting\n", - "filtered = df.loc[~flag, col]\n", - "filtered_quantile = df.loc[~q_flag, col]\n", - "print(\"MAD Skip\",len(filtered)/ len(df))\n", - "print(\"Quantile Skip\",len(filtered_quantile)/ len(df))\n", - "filtered_quantile.plot(label='Filtered Quantile', linewidth=2)\n", - "plt.show()\n", - "filtered.plot(label='Filtered MAD', linewidth=2)\n", - "plt.show()\n", - "df[col].plot(label='Original', alpha=0.5)" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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EYWXiJYRIiIiCi8GI0RERBQoBiNERCE3e/ZsvPrqq0EXgygtzmmruMbGRqxatQpvv/02mpubccopp2DChAmYOXMmBgwYcNLf37p1K+655x489thj6Nevnw8llmPJkiU4evQo7rzzzqCLEiq1tbX48Y9/jHPOOQc//OEPgy5OKPHYdR/PtcFiMKKwffv24e6778aQIUNw2223oby8HLt27cLvfvc7vPXWW1iwYAH69+8fdDGJLDZs2IAvfOEL2LBhAw4ePIiBAwfmvK54PA4AiETYiEve4bk2eAxGFLZ06VIUFBTg7rvvRmFhIQCgrKwMI0aMwLe+9S2sWLECc+fORVtbG1auXInNmzejqakJgwYNwowZM3D22WfjnnvuAQDceOONAICLL74Yt9xyS2D7pKq33noLf/jDH7Br1y5EIhGMGTMGX/va11BRUQEAaGhowK233oo77rgD69evxz//+U8MGTIEc+fOxZgxYwIuvTpaWlqwZcsW3H///YjFYti0aROuvvpqAN13jj/4wQ+wfPly1NXVYfjw4Zg3bx6GDRsGANi0aRMef/xx3Hrrrfj973+Puro6/PKXv0R5eXmQu6W0W265BVdccQWuvPJKY9n3vvc9TJgwAbNnzw6wZHLwXBs8BiOKOnLkCN5++21ce+21xh9HQmlpKSZPnowtW7Zgzpw5WLx4MWpra3HjjTeisrISDQ0NOHz4MMrKynDHHXfgwQcfxC9+8QsUFRWlrIs6tbS0oKqqCpWVlWhpacHKlSvxwAMPYOHChZa78ieffBJf+cpXUFFRgSeffBKLFi3CL3/5S/Tq1SvA0qtjy5YtOO200zB06FBceOGFePzxxzFjxgxommZ85re//S1uvPFGlJaWYvny5aiursaiRYuMp3u2trbiT3/6E26++WYMGDAAJSUlQe0O5QGea9XAYERRdXV10HUdp512mu3PTzvtNBw9ehQffvghXn75Zdx9990YN24cAODUU081PpdoWiwpKWEeM4PPfOYzlvff+MY3MGfOHOzevdu4aweAL37xi/jUpz4FoLNT4O233476+vq031O+2bhxIy688EIAwDnnnINjx45h27Zt+OQnP2l8ZtasWcaxeuutt+Lmm2/Gq6++ikmTJgEAOjo68PWvfx3Dhw/3vfyUf3iuVQODEeEaGhoQiUTwiU98IuiiiFZXV4eVK1figw8+wOHDh42+Co2NjZZgxPy6tLQUANDU1MRgBMDevXvxwQcf4Lvf/S4AoFevXpg0aRI2bNhgCUbMaa3+/ftj6NCh2LNnj7GsoKAAlZWV/hWcKAs813qLwYiiKioqoGkadu/ejYkTJ6b8fM+ePejXrx+bAl1SXV2NwYMHY968eTjllFOg6zruuOMOtLe3Wz6XSCUAMFIPnMS404YNG9DR0YF58+YZy3RdRzQaxde//vWs11NYWGhJ61BmmqalHIMdHR0BlUYenmvVwGBEUQMGDMC4cePw/PPPo6qqyvKHEIvF8NJLL+Giiy7CsGHDoOs6tm3bZjQdmiUunok7fUp1+PBh7N27F/PmzcNZZ50FAHj//fcDLpUsHR0d+N///V989atfTTkOf/azn+Gll14yWo9qa2tRVlYGoDNfX1dXx5alHiguLkYsFjPeHzt2DA0NDcEVSBiea9XA8XIKu+mmm9DW1oYFCxZg27ZtaGxsxFtvvYV7770XAwcOxHXXXYfy8nJcfPHFePjhh/Hqq6+ioaEBW7duxZYtWwAAgwcPhqZpeP3119Hc3IyWlpaA90o9/fr1w4ABA/DXv/4V9fX1qKmpwRNPPBF0sUR5/fXXcfToUVx66aUYNmyY5b/zzz8fGzduND77hz/8Ae+++y527tyJX//61xgwYIDtHSll5+yzz8YLL7yA9957Dzt37sSSJUs4FNohnmuDx5YRhQ0ZMgT3338/Vq1ahYceeghHjhxBaWkpJkyYgFmzZhkdpubMmYMVK1Zg6dKlRs/uGTNmAAAGDhyIWbNmYfny5Xj44Ydx0UUXcbhZF13X0atXL0QiEdx222147LHHcMcdd2Do0KG48cYbMX/+/KCLKMaGDRswduxYFBUVpfzsM5/5DJ555hn861//AgBcf/31ePzxx42hvd///vct6S86ucSxCwDTp09HQ0MD7r//fhQVFeFLX/oSW0Yc4rk2eHxqL+WtBQsWoKKiwlF/BsodZ6h0D49dChu25VHeOXLkCF5//XVs27YNY8eODbo4RFnjsUthxbZRyjsPP/wwPvzwQ1RVVWHChAlBF4coazx2KayYpiEiIqJAMU1DREREgWIwQkRERIFiMEJERESBYgdWCq01a9bg1VdfxZ49e1BYWIgxY8bgy1/+MoYOHWp85sSJE1i2bBm2bNmCtrY2jB8/HnPmzDGeO/Pxxx/j6aefxvbt29Hc3Izy8nJ87nOfwxVXXGG7zffffx/z58/Hv/3bv+FnP/uZH7tJRCQegxEKrW3btuHyyy/HGWecgY6ODqxYsQL33Xcffv7zn6NPnz4AgCeeeAJvvPEGbr/9dhQVFWHp0qV48MEHce+99wIAduzYgZKSEnzrW9/CoEGDsH37dvzmN79BJBLBtGnTLNs7evQolixZgrFjx1qm5yYioswYjFBo/ehHP7K8v+WWWzBnzhzs2LEDn/jEJ3Ds2DFs2LABt912G84++2wAwDe/+U38x3/8B2prazFmzBhceumllnWceuqpqK2txd///veUYOS///u/ccEFFyASieC1117zdueIiEKEfUYobxw7dgwAjKmdd+zYgY6ODsvkUaeddhrKyspQW1ubcT2JdSRs3LgR+/btw6xZszwoORFRuDEYobwQj8fx+OOP48wzz8SwYcMAdD6Rs6CgIGVq8pKSkrRplu3bt+Pll1/GZZddZiyrq6vD8uXL8a1vfct4XggREWWPwQjlhaVLl2LXrl34zne+k/M6du7ciYULF2LmzJkYP348gM4g55e//CVmzZpl6RhLRETZY58RCr2lS5fijTfewD333INBgwYZy0tLS9He3o6jR49aWkeampqM0TQJu3fvxr333ovLLrsM11xzjbH8+PHj+PDDD/HRRx/h0UcfBdD5RFVd13Httdfi7rvvNvqjEBGRPQYjFFq6ruPRRx/Fq6++ivnz56O8vNzy85EjR6JXr15499138ZnPfAYAsHfvXjQ2NmLMmDHG53bt2oWf/vSnuPjii3HddddZ1tG3b1888MADlmXPP/88ampqcPvtt6dsk4iIUjEYodBaunQpXnrpJdx5553o27ev0Q+kqKgIhYWFKCoqwqWXXoply5ahf//+KCoqwqOPPooxY8YYwcjOnTvx05/+FOPHj0dVVZWxjkgkguLiYkQiEaMPSkJxcTGi0WjKciIissdghELr+eefBwDMnz/fsvyb3/wmpkyZAgC44YYboGkaHnzwQbS3txuTniW88soraG5uxosvvogXX3zRWD548GAsWbLE830gIsoHfGovERERBYqjaYiIiChQDEaIiIgoUAxGiIiIKFAMRoiIiChQDEaIiIgoUAxGiIiIKFAMRoiIiChQDEaISHkNDQ2YPXs2Nm3aFHRRiMgDnIGVKM9s2rQJv/71r4330WgU/fv3x7Bhw3DuuefikksuQd++fR2vd/v27Xj77bdx5ZVXWh486MRLL72EpqYmXHnllTn9PhHJxGCEKE/Nnj0b5eXl6OjoQCwWw7Zt2/DEE09g3bp1uPPOO1FZWelofdu3b8fq1asxZcqUHgUju3btSglGBg8ejN/97ncoKOApiyiM+JdNlKfOPfdcnHHGGcb7GTNmoKamBvfffz8WLlyIhx56CIWFhQGWsJumacqUhYjcx2CEiAxnn302rrnmGqxYsQIvvPACLrvsMvzrX//C2rVr8d577+HQoUMoKirCueeei6985SsYMGAAAGDVqlVYvXo1AODWW2811rd48WKUl5cDAF544QWsW7cOu3fvRmFhIcaPH48vf/nLKCsrA9D5QMNt27YB6Gy1AbofSNjQ0IBbb73V8pDDJUuW4JVXXsFDDz2ERx55BFu3bkVRURFmzJiBadOmYefOnXjsscfwwQcfYMCAAbj++usxefJky/4ePXoUTz31FP7+97+jqakJgwYNwtSpU3HVVVchEmGXOiK/MBghIouLLroIK1aswDvvvIPLLrsM77zzDhoaGjBlyhSUlpZi9+7d+Otf/4rdu3djwYIF0DQN559/Purq6rB582bccMMNRpBSXFwMAPjjH/+IlStX4rOf/SymTp2K5uZm/M///A9+8pOfYOHChejXrx+uvvpqHDt2DAcOHMANN9wAAOjTp0/Gssbjcfznf/4nzjrrLHz5y1/GSy+9hEcffRR9+vTBihUrcOGFF+L888/HX/7yFyxevBhjxowxgqPW1lbMnz8fBw8exGWXXYaysjJs374dK1asQCwWw9e+9jXvKpmILBiMEJHFoEGDUFRUhH379gEALr/8cnzxi1+0fGb06NFYtGgR3n//fZx11lmorKzEiBEjsHnzZkyYMMG44APA/v37sWrVKnzpS1/C1VdfbSyfOHEivv/97+PPf/4zrr76aowbNw4DBw7E0aNHcdFFF2VV1ra2Nlx44YWYMWMGAGDy5MmYN28eHn74Ydx2222YNGkSAGDcuHH4zne+g02bNhmtLmvXrkV9fT0WLlyIIUOGAAA+97nPYeDAgXjmmWdQVVVltNoQkbfYDklEKfr06YPjx48DgKWvxokTJ9Dc3IzRo0cDAD766KOTruvvf/87dF3HpEmT0NzcbPxXWlqKiooKbN26tUdlnTp1qvG6X79+GDp0KHr37o3PfvazxvKhQ4eiX79+aGhoMJa98sorOOuss9CvXz9LucaOHYt4PI733nuvR+UiouyxZYSIUrS0tKCkpAQAcOTIETz11FPYsmULmpqaLJ87duzYSddVX18PXdfx7W9/2/bnPRkhE41GjVRQQlFREQYNGgRN01KWHzlyxHhfV1eHf/3rX5gzZ47tupP3lYi8w2CEiCwOHDiAY8eO4dRTTwUAPPTQQ9i+fTuuuuoqDB8+HH369DH6asTj8ZOuLx6PQ9M0/PCHP7TtFHqyfiGZpOtkmk3nU13XMW7cOFx11VW2Px86dGjO5SIiZxiMEJHFCy+8AAA455xzcOTIEbz77ruYPXs2Zs6caXymrq4u5feSWyISKioqoOs6ysvLlbrAn3rqqWhpacG4ceOCLgpR3mOfESIy1NTU4A9/+APKy8sxefJko4VB13XL59atW5fyu7179waQmrqZOHEiIpEIVq9enbIeXddx+PBh432fPn2ySv244bOf/Sxqa2vx1ltvpfzs6NGj6Ojo8KUcRMSWEaK89eabb2LPnj2Ix+OIxWLYunUr3nnnHZSVleHOO+9EYWEhCgsLcdZZZ+GZZ55BR0cHBg4ciLffftvSETRh5MiRAIAVK1bgggsuQK9evXDeeeehoqIC1157LZYvX479+/djwoQJ6NOnDxoaGvDaa68Z83ok1rFlyxY88cQTOOOMM9CnTx98+tOf9mT/r7rqKvzjH/9AdXU1Lr74YowcORKtra3YuXMnXnnlFSxZsiSlPwoReYPBCFGeWrVqFYDODqSJZ9PccMMNKc+mue222/Doo4/iz3/+s9HP4q677sK8efMs6xs1ahS+9KUv4S9/+Qveeust6LqOxYsXo0+fPpg+fTqGDBmCdevW4amnngIAlJWVYdy4cZZg4/Of/zw+/vhjbNq0CevWrcPgwYM9C0Z69+6Ne+65B3/84x/xyiuv4IUXXkDfvn0xdOhQzJ49G0VFRZ5sl4hSaXpyuykRERGRj9hnhIiIiALFYISIiIgCxWCEiIiIAsVghIiIiALFYISIiIgCxWCEiIiIAsVghIiIiALFYISIiIgCxWCEiIiIAsVghIiIiALFYISIiIgCxWCEiIiIAsVghIiIiAL1/wBidjcwbbUDaQAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "rm.greek_limits\n", - "# (rm.position_data['&L:AMD20250321C175&S:AMD20250321C180'].Delta_skip_day[rm.start_date: rm.end_date] * 1).plot()\n", - "# plt.title('Delta Skip Day') \n", - "# plt.show()\n", - "\n", - "# (rm.position_data['&L:AMD20250321C175&S:AMD20250321C180'].Delta[rm.start_date: rm.end_date] * 1).plot()\n", - "# plt.title('Delta')\n", - "# plt.show()\n", - "\n", - "# (rm.position_data['&L:AMD20250321C175&S:AMD20250321C180'].Midpoint[rm.start_date: rm.end_date] * 1).plot()\n", - "# plt.title('Midpoint')\n", - "# plt.show()\n", - "\n", - "\n", - "# rm.spot_timeseries['NFLX'][rm.start_date:rm.end_date].plot()\n", - "rm.data_managers\n", - "# del rm.position_data['&L:NVDA20241220C585&S:NVDA20241220C590']\n", - "# del rm.processed_option_data['NVDA20241220C58.5']\n", - "# del rm.processed_option_data['NVDA20241220C59']\n", - "(rm.position_data['&L:NVDA20241220C585&S:NVDA20241220C590'].Midpoint_skip_day * 1).plot()" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Calculate Greeks Dates Start: 2017-01-01, End: 2025-06-01, Position ID: &L:NVDA20241220C585&S:NVDA20241220C590, Date: \n", - "Position Data for &L:NVDA20241220C585&S:NVDA20241220C590 already available, skipping calculation\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
VegaVannaVolgaDeltaGammaThetaRhoMidpointSRYS0_closes0_closesryDelta_skip_dayGamma_skip_dayVega_skip_dayTheta_skip_dayMidpoint_skip_day
Datetime
2023-07-18NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN47.493999474.9399950.052330.000337FalseFalseFalseFalseFalse
2023-07-19NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN47.077000470.7699970.052480.000340FalseFalseFalseFalseFalse
2023-07-20NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN45.520000455.2000050.052450.000351FalseFalseFalseFalseFalse
2023-07-21NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN44.308998443.0899810.052430.000361FalseFalseFalseFalseFalse
2023-07-24NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN44.612000446.1199950.052480.000359FalseFalseFalseFalseFalse
..................................................................
2024-12-16-0.001089-0.20839211.3193870.002895-0.0001630.035257-0.0000074.500.00.00.00.0132.000000132.0000000.042180.000258FalseFalseFalseFalseFalse
2024-12-17-0.001211-0.1650137.2267780.003963-0.0002020.0605260.0000084.250.00.00.00.0130.389999130.3899990.042280.000261FalseFalseFalseFalseFalse
2024-12-18-0.001211-0.1650137.2267780.003963-0.0002020.0605260.0000084.000.00.00.00.0128.910004128.9100040.042400.000264FalseFalseFalseFalseFalse
2024-12-190.000207-0.34174516.4887430.001354-0.0000760.0277600.0031704.250.00.00.00.0130.679993130.6799930.042320.000260FalseFalseFalseFalseFalse
2024-12-200.000207-0.34174516.4887430.001354-0.0000760.0277600.0031705.000.00.00.00.0134.699997134.6999970.042200.000252FalseFalseFalseFalseFalse
\n", - "

374 rows × 21 columns

\n", - "
" - ], - "text/plain": [ - " Vega Vanna Volga Delta Gamma Theta \\\n", - "Datetime \n", - "2023-07-18 NaN NaN NaN NaN NaN NaN \n", - "2023-07-19 NaN NaN NaN NaN NaN NaN \n", - "2023-07-20 NaN NaN NaN NaN NaN NaN \n", - "2023-07-21 NaN NaN NaN NaN NaN NaN \n", - "2023-07-24 NaN NaN NaN NaN NaN NaN \n", - "... ... ... ... ... ... ... \n", - "2024-12-16 -0.001089 -0.208392 11.319387 0.002895 -0.000163 0.035257 \n", - "2024-12-17 -0.001211 -0.165013 7.226778 0.003963 -0.000202 0.060526 \n", - "2024-12-18 -0.001211 -0.165013 7.226778 0.003963 -0.000202 0.060526 \n", - "2024-12-19 0.000207 -0.341745 16.488743 0.001354 -0.000076 0.027760 \n", - "2024-12-20 0.000207 -0.341745 16.488743 0.001354 -0.000076 0.027760 \n", - "\n", - " Rho Midpoint S R Y S0_close s0_close \\\n", - "Datetime \n", - "2023-07-18 NaN NaN NaN NaN NaN NaN 47.493999 \n", - "2023-07-19 NaN NaN NaN NaN NaN NaN 47.077000 \n", - "2023-07-20 NaN NaN NaN NaN NaN NaN 45.520000 \n", - "2023-07-21 NaN NaN NaN NaN NaN NaN 44.308998 \n", - "2023-07-24 NaN NaN NaN NaN NaN NaN 44.612000 \n", - "... ... ... ... ... ... ... ... \n", - "2024-12-16 -0.000007 4.50 0.0 0.0 0.0 0.0 132.000000 \n", - "2024-12-17 0.000008 4.25 0.0 0.0 0.0 0.0 130.389999 \n", - "2024-12-18 0.000008 4.00 0.0 0.0 0.0 0.0 128.910004 \n", - "2024-12-19 0.003170 4.25 0.0 0.0 0.0 0.0 130.679993 \n", - "2024-12-20 0.003170 5.00 0.0 0.0 0.0 0.0 134.699997 \n", - "\n", - " s r y Delta_skip_day Gamma_skip_day \\\n", - "Datetime \n", - "2023-07-18 474.939995 0.05233 0.000337 False False \n", - "2023-07-19 470.769997 0.05248 0.000340 False False \n", - "2023-07-20 455.200005 0.05245 0.000351 False False \n", - "2023-07-21 443.089981 0.05243 0.000361 False False \n", - "2023-07-24 446.119995 0.05248 0.000359 False False \n", - "... ... ... ... ... ... \n", - "2024-12-16 132.000000 0.04218 0.000258 False False \n", - "2024-12-17 130.389999 0.04228 0.000261 False False \n", - "2024-12-18 128.910004 0.04240 0.000264 False False \n", - "2024-12-19 130.679993 0.04232 0.000260 False False \n", - "2024-12-20 134.699997 0.04220 0.000252 False False \n", - "\n", - " Vega_skip_day Theta_skip_day Midpoint_skip_day \n", - "Datetime \n", - "2023-07-18 False False False \n", - "2023-07-19 False False False \n", - "2023-07-20 False False False \n", - "2023-07-21 False False False \n", - "2023-07-24 False False False \n", - "... ... ... ... \n", - "2024-12-16 False False False \n", - "2024-12-17 False False False \n", - "2024-12-18 False False False \n", - "2024-12-19 False False False \n", - "2024-12-20 False False False \n", - "\n", - "[374 rows x 21 columns]" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rm.calculate_position_greeks('&L:NVDA20241220C585&S:NVDA20241220C590', '')" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "http://127.0.0.1:25510/v2/hist/option/eod?end_date=20250601&root=NVDA&use_csv=true&exp=20241220&right=C&start_date=20170101&strike=585000\n", - "http://127.0.0.1:25510/v2/hist/option/eod?end_date=20250601&root=NVDA&use_csv=true&exp=20241220&right=C&start_date=20170101&strike=590000\n" - ] - } - ], - "source": [ - "long_pre_split = retrieve_eod_ohlc(\n", - " 'NVDA',\n", - " start_date=rm.start_date,\n", - " end_date=rm.end_date,\n", - " strike = 585.0,\n", - " right = 'C',\n", - " exp = '2024-12-20',\n", - " print_url = True\n", - ") \n", - "\n", - "short_pre_split = retrieve_eod_ohlc(\n", - " 'NVDA',\n", - " start_date=rm.start_date,\n", - " end_date=rm.end_date,\n", - " strike = 590.0,\n", - " right = 'C',\n", - " exp = '2024-12-20',\n", - " print_url = True\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "http://127.0.0.1:25510/v2/hist/option/eod?end_date=20250601&root=NVDA&use_csv=true&exp=20241220&right=C&start_date=20170101&strike=58500\n", - "http://127.0.0.1:25510/v2/hist/option/eod?end_date=20250601&root=NVDA&use_csv=true&exp=20241220&right=C&start_date=20170101&strike=59000\n" - ] - } - ], - "source": [ - "long_post_split = retrieve_eod_ohlc(\n", - " 'NVDA',\n", - " start_date=rm.start_date,\n", - " end_date=rm.end_date,\n", - " strike = 58.50,\n", - " right = 'C',\n", - " exp = '2024-12-20',\n", - " print_url = True\n", - ") \n", - "short_post_split = retrieve_eod_ohlc(\n", - " 'NVDA',\n", - " start_date=rm.start_date,\n", - " end_date=rm.end_date,\n", - " strike = 59.00,\n", - " right = 'C',\n", - " exp = '2024-12-20',\n", - " print_url = True\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
OpenHighLowCloseVolumeBid_sizeCloseBidAsk_sizeCloseAskMidpointWeighted_midpoint
Datetime
2024-06-04 16:00:000.000.000.000.00017601.9516605.35603.650603.598485
2024-06-05 16:00:000.000.000.000.00030660.3516664.50662.425661.793478
2024-06-06 16:00:00648.61648.61648.61648.61130646.2530651.95649.100649.100000
2024-06-07 16:00:000.000.000.000.00027644.4030650.35647.375647.531579
2024-06-10 16:00:000.000.000.000.00000.0000.000.000NaN
\n", - "
" - ], - "text/plain": [ - " Open High Low Close Volume Bid_size \\\n", - "Datetime \n", - "2024-06-04 16:00:00 0.00 0.00 0.00 0.00 0 17 \n", - "2024-06-05 16:00:00 0.00 0.00 0.00 0.00 0 30 \n", - "2024-06-06 16:00:00 648.61 648.61 648.61 648.61 1 30 \n", - "2024-06-07 16:00:00 0.00 0.00 0.00 0.00 0 27 \n", - "2024-06-10 16:00:00 0.00 0.00 0.00 0.00 0 0 \n", - "\n", - " CloseBid Ask_size CloseAsk Midpoint Weighted_midpoint \n", - "Datetime \n", - "2024-06-04 16:00:00 601.95 16 605.35 603.650 603.598485 \n", - "2024-06-05 16:00:00 660.35 16 664.50 662.425 661.793478 \n", - "2024-06-06 16:00:00 646.25 30 651.95 649.100 649.100000 \n", - "2024-06-07 16:00:00 644.40 30 650.35 647.375 647.531579 \n", - "2024-06-10 16:00:00 0.00 0 0.00 0.000 NaN " - ] - }, - "execution_count": 50, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "long_pre_split.tail()" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
OpenHighLowCloseVolumeBid_sizeCloseBidAsk_sizeCloseAskMidpointWeighted_midpoint
Datetime
2024-06-10 16:00:000.00.00.00.002564.752566.4065.57565.575000
2024-06-11 16:00:0064.164.164.164.1710064.5552565.5565.05065.390000
2024-06-12 16:00:000.00.00.00.002568.55669.3068.92568.695161
2024-06-13 16:00:000.00.00.00.00672.902673.5573.22573.428125
2024-06-14 16:00:000.00.00.00.0013275.3525076.3575.85076.004450
\n", - "
" - ], - "text/plain": [ - " Open High Low Close Volume Bid_size CloseBid \\\n", - "Datetime \n", - "2024-06-10 16:00:00 0.0 0.0 0.0 0.0 0 25 64.75 \n", - "2024-06-11 16:00:00 64.1 64.1 64.1 64.1 7 100 64.55 \n", - "2024-06-12 16:00:00 0.0 0.0 0.0 0.0 0 25 68.55 \n", - "2024-06-13 16:00:00 0.0 0.0 0.0 0.0 0 6 72.90 \n", - "2024-06-14 16:00:00 0.0 0.0 0.0 0.0 0 132 75.35 \n", - "\n", - " Ask_size CloseAsk Midpoint Weighted_midpoint \n", - "Datetime \n", - "2024-06-10 16:00:00 25 66.40 65.575 65.575000 \n", - "2024-06-11 16:00:00 525 65.55 65.050 65.390000 \n", - "2024-06-12 16:00:00 6 69.30 68.925 68.695161 \n", - "2024-06-13 16:00:00 26 73.55 73.225 73.428125 \n", - "2024-06-14 16:00:00 250 76.35 75.850 76.004450 " - ] - }, - "execution_count": 52, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "long_post_split.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['NVDA20250117C61.5',\n", - " 'NVDA20250117C61',\n", - " 'NVDA20250321C177',\n", - " 'NVDA20250321C178',\n", - " 'NVDA20250718C180',\n", - " 'NVDA20250718C185',\n", - " 'NVDA20250117C92',\n", - " 'NVDA20250117C78',\n", - " 'NVDA20250919C240',\n", - " 'NVDA20250919C205',\n", - " 'NVDA20241220C58.5',\n", - " 'NVDA20241220C59',\n", - " 'NVDA20250919C132',\n", - " 'NVDA20250919C134',\n", - " 'NVDA20250919C120',\n", - " 'NVDA20250919C122',\n", - " 'NVDA20250919C114',\n", - " 'NVDA20250919C112',\n", - " 'NVDA20250919C135',\n", - " 'NVDA20250919C95',\n", - " 'NVDA20250919C96',\n", - " 'NVDA20250919C94',\n", - " 'NVDA20250815C120',\n", - " 'NVDA20250815C115',\n", - " 'NVDA20250919C116',\n", - " 'NVDA20250919C118',\n", - " 'NVDA20250919C115',\n", - " 'NVDA20250919C136']" - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "[x for x in rm.processed_option_data.keys() if 'NVDA' in x]" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "http://127.0.0.1:25510/v2/hist/option/eod?end_date=20250601&root=NVDA&use_csv=true&exp=20241220&right=C&start_date=20170101&strike=58500\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
OpenHighLowCloseVolumeBid_sizeCloseBidAsk_sizeCloseAskMidpointWeighted_midpoint
Datetime
2024-06-10 16:00:000.00.00.00.002564.752566.4065.57565.575000
2024-06-11 16:00:0064.164.164.164.1710064.5552565.5565.05065.390000
2024-06-12 16:00:000.00.00.00.002568.55669.3068.92568.695161
2024-06-13 16:00:000.00.00.00.00672.902673.5573.22573.428125
2024-06-14 16:00:000.00.00.00.0013275.3525076.3575.85076.004450
....................................
2024-12-16 16:00:000.00.00.00.002073.202073.9073.55073.550000
2024-12-17 16:00:000.00.00.00.002071.651472.2571.95071.897059
2024-12-18 16:00:000.00.00.00.008269.358670.8070.07570.092262
2024-12-19 16:00:000.00.00.00.004871.752072.6072.17572.000000
2024-12-20 16:00:000.00.00.00.002075.852077.6576.75076.750000
\n", - "

136 rows × 11 columns

\n", - "
" - ], - "text/plain": [ - " Open High Low Close Volume Bid_size CloseBid \\\n", - "Datetime \n", - "2024-06-10 16:00:00 0.0 0.0 0.0 0.0 0 25 64.75 \n", - "2024-06-11 16:00:00 64.1 64.1 64.1 64.1 7 100 64.55 \n", - "2024-06-12 16:00:00 0.0 0.0 0.0 0.0 0 25 68.55 \n", - "2024-06-13 16:00:00 0.0 0.0 0.0 0.0 0 6 72.90 \n", - "2024-06-14 16:00:00 0.0 0.0 0.0 0.0 0 132 75.35 \n", - "... ... ... ... ... ... ... ... \n", - "2024-12-16 16:00:00 0.0 0.0 0.0 0.0 0 20 73.20 \n", - "2024-12-17 16:00:00 0.0 0.0 0.0 0.0 0 20 71.65 \n", - "2024-12-18 16:00:00 0.0 0.0 0.0 0.0 0 82 69.35 \n", - "2024-12-19 16:00:00 0.0 0.0 0.0 0.0 0 48 71.75 \n", - "2024-12-20 16:00:00 0.0 0.0 0.0 0.0 0 20 75.85 \n", - "\n", - " Ask_size CloseAsk Midpoint Weighted_midpoint \n", - "Datetime \n", - "2024-06-10 16:00:00 25 66.40 65.575 65.575000 \n", - "2024-06-11 16:00:00 525 65.55 65.050 65.390000 \n", - "2024-06-12 16:00:00 6 69.30 68.925 68.695161 \n", - "2024-06-13 16:00:00 26 73.55 73.225 73.428125 \n", - "2024-06-14 16:00:00 250 76.35 75.850 76.004450 \n", - "... ... ... ... ... \n", - "2024-12-16 16:00:00 20 73.90 73.550 73.550000 \n", - "2024-12-17 16:00:00 14 72.25 71.950 71.897059 \n", - "2024-12-18 16:00:00 86 70.80 70.075 70.092262 \n", - "2024-12-19 16:00:00 20 72.60 72.175 72.000000 \n", - "2024-12-20 16:00:00 20 77.65 76.750 76.750000 \n", - "\n", - "[136 rows x 11 columns]" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "retrieve_eod_ohlc(\n", - " 'NVDA',\n", - " start_date=rm.start_date,\n", - " end_date=rm.end_date,\n", - " strike = 585.0/10,\n", - " right = 'C',\n", - " exp = '2024-12-20',\n", - " print_url = True\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'AAPL': [(Timestamp('2020-08-31 00:00:00'), 4.0)],\n", - " 'SBUX': [],\n", - " 'AMD': [],\n", - " 'META': [],\n", - " 'COST': [],\n", - " 'NFLX': [],\n", - " 'NVDA': [(Timestamp('2021-07-20 00:00:00'), 4.0),\n", - " (Timestamp('2024-06-10 00:00:00'), 10.0)],\n", - " 'AMZN': [(Timestamp('2022-06-06 00:00:00'), 20.0)]}" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rm.splits" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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Ab0Z84477mDdunVs2bKF0047jWXLloXcs6ioiD/+8Y/88MMP7Ny5k6uuuor7778/5Jxf/epXrFq1qsVnduqpp/Liiy8Gtnfs2MHjjz/Op59+SllZGSkpKYwfP57rrruOsWPHAvqiigdmEpt/X7dt28Ydd9zB5s2bqampITk5mV//+tfcfvvtIT8nb7/9Ng8//DB79+5lwIAB3H333Zx66qktyticxWIhNTW13XOaNF8fqr+RuoWn/lw36Jv1q3ZVU290tHrMHZOEA7AoCkmpqbi10AabIsXOz1JSAkHJ4apfp4KXHTt2UFVVxe9///vAPlVV+emnn3jvvfeYM2cOXq8Xl8sVkn2pqqoKZFucTifbtm0LuW/TarwHZmSaTJ8+nWnTpgW2mz6k0tLSVqdud7vdfW5K945MM6+qKjabjb/85S9ccMEFgc/D59OXKvd4PIF+QStXriQqKipwbURERMjxA7NVTe6//35OPvlkHnvsMW6++WYAHnnkEYqKinjppZfweDxs2rQJr9fLww8/TE5ODps3b+aOO+6gtraWP/xB73FeU1PD+eefz6RJk3jkkUdYv349t956K5GRkYH1jT7//HPOOuss7r33Xmw2G0uWLOH888/no48+CrxcVVVlypQpPProo4EyWiyWkLJfe+21gfJ5vV5mzpzJrbfeypIlSwBobGzEYrFw2WWXsWLFCjRNa1F3l8tFbGwsN910E08//TQ+n6/FOX/7299C9lVUVHDaaadx5plnBvavXbuWGTNmMGTIEB5++GEGDRpEbW0tH3zwAX/4wx944403ANA0jdtvv52LLroocL/IyMiQ+//6179m5MiRxMTEsHHjRu644w48Hg+zZ88G4Ntvv+Waa65h9uzZnHrqqSxfvpxLL72U9957r931jdxuNwUFBW0eB/3fUEpKCoWFhX1yqvJDIXULT/25btC36+fbtpl60/GtHttW2cAEoLG2hoKCAlweX8jxIks0BXt2Y7DaOlQ/s9ncZuKhMzoVvIwaNYqFCxeG7PvrX/9KWloaZ599NgkJCRiNRn788UeOO+44APLz8yktLSUvLw+AvLw83nzzTaqqqgKZgXXr1mG328nIyGj1uWazudWshaZpfe6H4FCdcMIJ7Nq1i8WLFzN37tw2z0tISGg1s3IwcXFxLFiwgGuuuYbTTjsNj8fD4sWLefbZZwPB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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "trade_id = '&L:NFLX20250117C520&S:NFLX20250117C530'\n", - "tick = ['NFLX20250117C520', 'NFLX20250117C530']\n", - "rm.processed_option_data[tick[0]].Midpoint[rm.start_date:rm.end_date].plot(label=tick[0])\n", - "rm.processed_option_data[tick[1]].Midpoint[rm.start_date:rm.end_date].plot(label=tick[1])\n", - "plt.legend()" - ] - }, - { - "cell_type": "code", - "execution_count": 93, - "metadata": {}, - "outputs": [], - "source": [ - "l = rm.processed_option_data[tick[0]].copy()\n", - "s = rm.processed_option_data[tick[1]].copy()\n", - "filled_l = l.replace(0, np.nan).ffill()\n", - "filled_s = s.replace(0, np.nan).ffill()\n", - "filled_l.Midpoint.plot(label =f'Filled {tick[0]}')\n", - "filled_s.Midpoint.plot(label =f'Filled {tick[1]}')\n", - "plt.legend()\n" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjAAAAGkCAYAAAAv7h+nAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAACfkElEQVR4nO2dd5gT1frHv2eSbF9Y2rJL71VQBEVRKRfsiICgeEXl2kV/iP2KV8UrqNjwInaRi1iRcgVBBSsCYkGQDoJ0dtmlbK/JnN8fk0nOTGbSNruZZN/P8/CQzJyZOW/KzjdvO4xzzkEQBEEQBBFDSNGeAEEQBEEQRKiQgCEIgiAIIuYgAUMQBEEQRMxBAoYgCIIgiJiDBAxBEARBEDEHCRiCIAiCIGIOEjAEQRAEQcQcJGAIgiAIgog5SMAQBEEQBBFz2KM9gdrm1KlTcDqdQY1t1qwZ8vPza3lGtQ/ZYS3ixQ4gfmwhO6xFvNgBxI8t0bTDbrejUaNGgcfVwVyiitPpRHV1dcBxjDHP+FheXYHssBbxYgcQP7aQHdYiXuwA4seWWLGDQkgEQRAEQcQcJGAIgiAIgog5SMAQBEEQBBFzkIAhCIIgCCLmiPskXn+UlpbC6XR6EpbKy8tRVVUV5VnVHLLDWsSLHUD82EJ21IyUlBTY7fX69kFYgHr7CaysrARjDA0bNvRsczgcQVUsWR2yw1rEix1A/NhCdoSPLMsoLi5GamoqiRgiqtTbEFJlZSWSk5OjPQ2CIIiYQpIkpKeno6ysLNpTIeo59VbAAN5ad4IgCCJ4JKle3zoIi0CfQoIgCIIgYg4SMARBEARBxBwkYAiCIAiCiDlIwBAEQRAEYYj83QrIH71lyTWRSMDEEJMnT8ZNN90U1Nh169ahZcuWnn8dO3bEkCFD8P777xuO/+2339C6dWtcf/31Pvu2bduGiRMnol+/fujYsSMGDRqEd955x/CaF198Mdq3b4/zzjsPn3zyiWb/K6+8gssuuwxdunRB7969cdNNN2HPnj2G8+GcY9y4cWjZsiW+/PJLzb4jR47g+uuvR8eOHdG7d2889dRTmhXHjx07hrvuugvnn38+WrVqhccff9zn/Lt27cKtt96K/v37o2XLlnj77bd9xpSUlODxxx/H2WefjY4dO2LEiBHYtGmTz7h9+/bh3nvvRd++fdG+fXucc845mDhxIv744w8AwMGDB3H//ffjnHPOQceOHTFgwAC88MILpv079u3bhy5duqB79+4++5YtW4aBAweiQ4cOGDp0KL755hufMd999x0uuugidOzYEX379sUjjzxieJ2ffvoJY8eORc+ePdGxY0ecd955uOeee/z2Ffm///s/zeeqZ8+euO6667B9+3bD8Q899BBat26NZcuW+ez74IMPMGrUKPTo0QM9evTANddcg40bN2rGcM7x/PPPo0+fPujYsSOuueYa/PXXX579hw4dCuu17dSpk8++QK/tihUrcO2116Jnz55o2bIltm7d6nOO999/H2PGjEHXrl3RsmVLFBYW+ozZsmULxo0bh+7du6Nnz5546KGHUFpa6jNu+fLlGDNmDLp164bOnTtj2LBhmDlzJk6dOuWZz5gxY9CrVy907doVV1xxBb7//nvNOV588UXN+9WyZUsMHDhQM6aiogJTpkxBz5490blzZ9x6661xsZoyERn44nng334O5OdGeyo+kICJc1avXo2NGzfiu+++w/jx4/HII4/gxx9/9Bn38ccf4x//+Ad+/vln5OZqP6hbtmxB06ZN8corr+Dbb7/FpEmT8Mwzz2Du3LmeMQcPHsQNN9yAAQMGYOXKlbjlllvw4IMPav6grl+/HjfeeCOWLVuGjz76CNXV1fj73/9uWI759ttvG1aJuVwu3HDDDaiursZnn32Gl19+GQsWLMDzzz/vGVNVVYUmTZrgnnvuQY8ePQxfl/LycrRp0wZTpkxBZmam4ZgHHngAP/74I2bNmoWvv/4agwYNwrhx45CTk+MZ88cff+DSSy/FX3/9hRkzZuC7777DO++8g06dOuHf//43AGDPnj2QZRkzZszAt99+i6lTp2L+/Pl49tlnfa5ZXV2Nu+66C/379/fZ9+uvv+Kuu+7Ctddei6+++goXX3wxbr75ZuzcudMzpqKiArfccgu6d++Or7/+GvPmzUPPnj19zrV7926MHz8ep59+OhYtWoRvvvkG06ZNQ0JCAlwul+HroTJkyBBs3LgRGzduxCeffAKbzYYbb7zR8DVeunQpJk6c6CNmAUVAXXnllViwYAGWLl2KFi1a4O9//7vm9X3ttdfw7rvv4tlnn8WyZcuQkpKC6667DhUVFXX+2paVleHss8/Go48+avralJeXY/Dgwfi///s/w/25ubkYN24c2rVrh2XLluGDDz7Arl27MHnyZM24Z599FnfeeSdOP/10zJ8/H99++y0ef/xxbN++HYsWLQKgfJ8GDRqE+fPn44svvsCAAQMwYcIEH2HVtWtXz/u1ceNG/O9//9Psnzp1KlatWoU333wTixYtQm5uLm655RZTG4n6A3dWAxXlypNq6zV+ZNyKfqEIkp+fb9joqaioCA0aNACg/MpDVWV0mlslJAZdzj158mQUFRXh3Xff9TvO4XDghx9+wNixY7F9+3ZNs77zzjsP48ePx5133unZVlpaij59+mDFihV48cUX0b17d0yaNMnvNaZMmYI///wTn376KQBg+vTp+Oabb/Dtt996xtx5550oKirCBx98YHiOEydOoHfv3li0aBHOOeccz/atW7fixhtvxKpVq9CrVy/MmTMHl1xyCQDg22+/xY033ojff/8dzZo1AwC89957ePrpp7F582YkJCRorjFmzBj06NHDIyaM6N+/P2655Rbceuutnm3l5eXo2rUr3n33XQwbNsyz/ZJLLsGQIUPw8MMPg3OOoUOHIjExEcuXL/cpLS0sLETDhg0NP1evv/463nvvPfz000+a7dOnT0dubi7OP/98TJ06FTt27PDsu+OOO1BWVob33nvPs2348OHo2bMnZsyYAUARML1798bbb7+NQYMGmdr89ttvY86cOVi/fr3pGCPuu+8+FBQUaD6Dv/zyC0aNGoXNmzejSZMmnu0LFizA/Pnz8cEHH+DMM8/EDz/8gJYtW5qe2+VyoUePHpg2bRrGjh0LzjnOPPNM3H777bjjjjsAKN/bM844AzNnzsSVV15peJ7aem1VDh06hHPOOQdfffUVTjvtNMM5rFu3zvD79/777+P555/Hxo0bPZ+XHTt2YNiwYVizZg3at2+PjRs3Yvjw4XjyyScNhYT6uQJ8G9kNGTIEI0aMwL333gtA8cB8+eWXWLVqleE8i4qK0Lt3b8yePRvDhw8HoIjCQYMGYenSpejbt6/hceqx6t/QmsAYQ3Z2NnJyciwZpgiFeLFFtePorh1w3ad45dn1d0EaeHGdXN/hcHj+vvuD2igCQFUl5LuvRmUULi3NXgAkJtX4PJMnT8bhw4excOFCw/2cc3z//fc4cuQI+vTpo9m3bNkydOrUCZ06dcLo0aMxdepU/N///Z9fYVVcXIyMjAzP8w0bNuD888/XjBk8eDCeeOIJ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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "rm.position_data[ trade_id].dropna().Midpoint[rm.start_date:rm.end_date].plot(label='L:BA20240119C240&S:BA20240119C250')\n", - "plt.legend()\n", - "# pm.all_positions" - ] - }, - { - "cell_type": "code", - "execution_count": 129, - "metadata": {}, - "outputs": [], - "source": [ - "from IPython.display import clear_output\n", - "import json\n", - "pd.set_option('display.max_columns', 100)\n", - "pd.set_option('display.max_rows', 100)\n", - "_key = 11\n", - "\n", - "ttrades__ = pd.read_csv(f'../input/profitable_trades_{_key}.csv').iloc[:, 1:]\n", - "ttrades__['Duration'] = ttrades__.Duration.apply(lambda x: int(x.split(' ')[0]))\n", - "\n", - "for index in ttrades__.index:\n", - " trades_ = ttrades__.iloc[index, :].to_frame().T\n", - "\n", - "\n", - " symbol_list = trades_.Ticker.unique()\n", - " with open(f'../input/profitable_weights_{_key}.json', 'r') as f:\n", - " weights = json.load(f)\n", - " print(f\"\\n\\nRunning backtest for trades {index} with symbols {symbol_list[0]}\\n\")\n", - " untraded_symbols = [s for s in weights.keys() if s not in trades_.Ticker.unique()]\n", - " for s in untraded_symbols:\n", - " weights.pop(s)\n", - "\n", - " print(weights)\n", - "\n", - "\n", - " max_cash = {}\n", - " cash = 20_000\n", - " for s, w in weights.items():\n", - " if w * cash > 200:\n", - " max_cash[s] = 2\n", - " elif w * cash > 100:\n", - " max_cash[s] = 1\n", - " else:\n", - " max_cash[s] = 0.5\n", - " max_cash\n", - " print(max_cash)\n", - " print(\"\\nSetting up backtest\\n\")\n", - " #Backtest class \n", - " ## Find a way to not always reinitialize the backtest class, when want to redo\n", - "\n", - " pd.options.display.max_rows = 50\n", - " pd.options.display.max_columns = 50\n", - "\n", - " evb_backtest = OptionSignalBacktest(trades_, initial_capital=cash)\n", - " evb_backtest.portfolio.initial_capital\n", - " w_map = {x: w * 0.85 for x, w in weights.items()} ## 75% of the weights for each stock\n", - " evb_backtest.portfolio.weight_map = w_map\n", - " evb_backtest.portfolio.weight_map\n", - " evb_backtest.portfolio.risk_manager.OrderPicker.liquidity_threshold = 50\n", - " evb_backtest.portfolio.risk_manager.OrderPicker.lookback = 10\n", - " evb_backtest.portfolio.risk_manager.sizing_lev = 4.5\n", - " evb_backtest.portfolio.max_contract_price_factor = 2\n", - " evb_backtest.portfolio.min_moneyness_threshold = 3\n", - " evb_backtest.portfolio.risk_manager.OrderPicker.data_availability_threshold = 0.5\n", - " evb_backtest.portfolio.order_settings = {'type': 'naked',\n", - " 'specifics': [{'direction': 'long',\n", - " 'rel_strike': .70,\n", - " 'dte': 365,\n", - " 'moneyness_width': 0},\n", - " {'direction': 'short',\n", - " 'rel_strike': .60,\n", - " 'dte': 365,\n", - " 'moneyness_width': 0}\n", - " ],\n", - " 'name': 'vertical_spread'}\n", - "\n", - "\n", - " evb_backtest.portfolio.max_contract_price = max_cash\n", - " evb_backtest.executor.commission_rate = 0.65/100\n", - " evb_backtest.portfolio.min_moneyness_threshold = 5\n", - " evb_backtest.executor.max_slippage_pct = 0.075\n", - " evb_backtest.portfolio.roll_map = 90\n", - " evb_backtest.portfolio.moneyness_width_factor = .025\n", - " evb_backtest.portfolio.dte_reduction_factor = 30\n", - " evb_backtest.portfolio.min_acceptable_dte_threshold = 95\n", - " evb_backtest.portfolio.risk_manager.limits['dte'] = True\n", - " evb_backtest.portfolio.risk_manager.limits['delta'] = True\n", - " evb_backtest.portfolio.risk_manager.limits['moneyness'] = True\n", - " evb_backtest.portfolio.risk_manager.max_moneyness = 1.3\n", - " for key in max_cash:\n", - " if max_cash[key]*100 > evb_backtest.portfolio.allocated_cash_map[key]:\n", - " print(key, max_cash[key]*100, evb_backtest.portfolio.allocated_cash_map[key])\n", - "\n", - " evb_backtest.portfolio.risk_manager.print_settings()\n", - "\n", - " signals = evb_backtest.bars.signal_df\n", - " signals_df = deepcopy(signals).set_index('Date')\n", - " ((signals_df!=-1)&(signals_df!=-0)).sum().sum()\n", - " rm = evb_backtest.portfolio.risk_manager\n", - " pm = evb_backtest.portfolio\n", - "\n", - " evb_backtest.run()\n", - " clear_output()\n" - ] - }, - { - "cell_type": "code", - "execution_count": 111, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "name": "Equity Curve", - "showlegend": true, - "type": "scatter", - "x": [ - "2024-01-31T00:00:00", - "2024-02-01T00:00:00", - "2024-02-02T00:00:00", - "2024-02-05T00:00:00", - "2024-02-06T00:00:00", - "2024-02-07T00:00:00", - "2024-02-08T00:00:00", - "2024-02-09T00:00:00", - "2024-02-12T00:00:00", - "2024-02-13T00:00:00", - "2024-02-14T00:00:00", - "2024-02-15T00:00:00", - "2024-02-16T00:00:00", - "2024-02-19T00:00:00", - "2024-02-20T00:00:00", - "2024-02-21T00:00:00", - "2024-02-22T00:00:00", - "2024-02-23T00:00:00", - "2024-02-26T00:00:00", - "2024-02-27T00:00:00", - "2024-02-28T00:00:00", - "2024-02-29T00:00:00", - "2024-03-01T00:00:00", - "2024-03-04T00:00:00", - "2024-03-05T00:00:00", - "2024-03-06T00:00:00", - "2024-03-07T00:00:00", - "2024-03-08T00:00:00", - "2024-03-11T00:00:00", - "2024-03-12T00:00:00", - "2024-03-13T00:00:00", - "2024-03-14T00:00:00", - "2024-03-15T00:00:00", - "2024-03-18T00:00:00", - "2024-03-19T00:00:00", - "2024-03-20T00:00:00", - "2024-03-21T00:00:00", - "2024-03-22T00:00:00", - "2024-03-25T00:00:00", - "2024-03-26T00:00:00", - "2024-03-27T00:00:00", - "2024-03-28T00:00:00", - "2024-03-29T00:00:00", - "2024-04-01T00:00:00", - "2024-04-02T00:00:00", - "2024-04-03T00:00:00", - "2024-04-04T00:00:00", - "2024-04-05T00:00:00", - "2024-04-08T00:00:00", - "2024-04-09T00:00:00", - "2024-04-10T00:00:00", - "2024-04-11T00:00:00", - "2024-04-12T00:00:00", - "2024-04-15T00:00:00", - "2024-04-16T00:00:00", - "2024-04-17T00:00:00", - "2024-04-18T00:00:00", - "2024-04-19T00:00:00", - "2024-04-22T00:00:00", - "2024-04-23T00:00:00", - "2024-04-24T00:00:00", - "2024-04-25T00:00:00", - "2024-04-26T00:00:00", - "2024-04-29T00:00:00", - "2024-04-30T00:00:00", - "2024-05-01T00:00:00", - "2024-05-02T00:00:00", - "2024-05-03T00:00:00", - "2024-05-06T00:00:00", - "2024-05-07T00:00:00", - "2024-05-08T00:00:00", - "2024-05-09T00:00:00", - "2024-05-10T00:00:00", - "2024-05-13T00:00:00", - "2024-05-14T00:00:00", - "2024-05-15T00:00:00", - "2024-05-16T00:00:00", - "2024-05-17T00:00:00", - "2024-05-20T00:00:00", - "2024-05-21T00:00:00", - "2024-05-22T00:00:00", - "2024-05-23T00:00:00", - "2024-05-24T00:00:00", - "2024-05-27T00:00:00", - "2024-05-28T00:00:00", - "2024-05-29T00:00:00", - "2024-05-30T00:00:00", - "2024-05-31T00:00:00", - "2024-06-03T00:00:00", - "2024-06-04T00:00:00", - "2024-06-05T00:00:00", - "2024-06-06T00:00:00", - "2024-06-07T00:00:00", - "2024-06-10T00:00:00", - "2024-06-11T00:00:00", - "2024-06-12T00:00:00", - "2024-06-13T00:00:00", - "2024-06-14T00:00:00", - "2024-06-17T00:00:00", - "2024-06-18T00:00:00", - "2024-06-19T00:00:00", - "2024-06-20T00:00:00", - "2024-06-21T00:00:00", - "2024-06-24T00:00:00", - "2024-06-25T00:00:00", - "2024-06-26T00:00:00", - "2024-06-27T00:00:00", - "2024-06-28T00:00:00", - "2024-07-01T00:00:00", - "2024-07-02T00:00:00", - "2024-07-03T00:00:00", - "2024-07-04T00:00:00", - "2024-07-05T00:00:00", - "2024-07-08T00:00:00", - "2024-07-09T00:00:00", - "2024-07-10T00:00:00", - "2024-07-11T00:00:00", - "2024-07-12T00:00:00", - "2024-07-15T00:00:00", - "2024-07-16T00:00:00", - "2024-07-17T00:00:00", - "2024-07-18T00:00:00", - "2024-07-19T00:00:00", - "2024-07-22T00:00:00", - "2024-07-23T00:00:00", - "2024-07-24T00:00:00", - "2024-07-25T00:00:00", - "2024-07-26T00:00:00" - ], - "xaxis": "x", - "y": [ - 0.9999997752361321, - 0.9999997752361321, - 1.0032512165198588, - 1.0131556068918266, - 1.0131556068918266, - 1.0111547199479947, - 1.0124052742878895, - 1.0114048308159738, - 1.0149063829676794, - 1.0149063829676794, - 1.0116549416839526, - 1.0136558286277846, - 1.0121551634199106, - 1.0096540547401207, - 1.0096540547401207, - 1.0096540547401207, - 1.0109046090800158, - 1.0166571590435323, - 1.0174074916474691, - 1.0174074916474691, - 1.0154066047036374, - 1.0149063829676794, - 1.0171573807794902, - 1.019408378591301, - 1.019408378591301, - 1.0159068264395954, - 1.0151564938356583, - 1.0191582677233222, - 1.0131556068918266, - 1.0131556068918266, - 1.0166571590435323, - 1.0179077133834271, - 1.020658932931196, - 1.0156567155716163, - 1.0156567155716163, - 1.0166571590435323, - 1.0191582677233222, - 1.0191582677233222, - 1.021159154667154, - 1.021159154667154, - 1.019408378591301, - 1.020909043799175, - 1.021159154667154, - 1.0216593764031119, - 1.0216593764031119, - 1.0216593764031119, - 1.0239103742149227, - 1.021409265535133, - 1.0279121481025866, - 1.0279121481025866, - 1.0279121481025866, - 1.0289125915745023, - 1.0324141437262082, - 1.0261613720267335, - 1.0261613720267335, - 1.0251609285548178, - 1.0229099307430067, - 1.020408822063217, - 1.0176576025154482, - 1.0176576025154482, - 1.020158711195238, - 1.0164070481755534, - 1.0136558286277846, - 1.021909487271091, - 1.021909487271091, - 1.0155066490508289, - 1.0181578242514062, - 1.0249108176868387, - 1.0296629241784394, - 1.0296629241784394, - 1.0294128133104603, - 1.0281622589705655, - 1.0299130350464183, - 1.0251609285548178, - 1.0251609285548178, - 1.0251609285548178, - 1.0234101524789647, - 1.020158711195238, - 1.0191582677233222, - 1.0191582677233222, - 1.018407935119385, - 1.0179077133834271, - 1.0155066490508289, - 1.0169072699115114, - 1.0169072699115114, - 1.0169072699115114, - 1.0164070481755534, - 1.0136058064541886, - 1.0113548086423778, - 1.0113548086423778, - 1.0122552077671023, - 1.0145562277525089, - 1.019408378591301, - 1.0221595981390699, - 1.0221595981390699, - 1.0216593764031119, - 1.020408822063217, - 1.0174074916474691, - 1.0176576025154482, - 1.0176576025154482, - 1.0159068264395954, - 1.020158711195238, - 1.020158711195238, - 1.0196584894592802, - 1.0196584894592802, - 1.0196584894592802, - 1.0296629241784394, - 1.0361658067458928, - 1.034915252405998, - 1.034915252405998, - 1.0389170262936616, - 1.035165363273977, - 1.0379165828217458, - 1.0366660284818507, - 1.0366660284818507, - 1.0369161393498298, - 1.0376664719537667, - 1.0304132567823763, - 1.0266615937626915, - 1.0266615937626915, - 1.0274119263666286, - 1.021159154667154, - 1.0174074916474691, - 1.013555784280593, - 1.013555784280593, - 1.0109046090800158, - 1.01275542950306, - 1.0113698152944566 - ], - "yaxis": "y" - }, - { - "name": "Benchmark", - "showlegend": true, - "type": "scatter", - "x": [ - "2024-01-31T00:00:00", - "2024-02-01T00:00:00", - "2024-02-02T00:00:00", - "2024-02-05T00:00:00", - "2024-02-06T00:00:00", - "2024-02-07T00:00:00", - "2024-02-08T00:00:00", - "2024-02-09T00:00:00", - "2024-02-12T00:00:00", - "2024-02-13T00:00:00", - "2024-02-14T00:00:00", - "2024-02-15T00:00:00", - "2024-02-16T00:00:00", - "2024-02-19T00:00:00", - "2024-02-20T00:00:00", - "2024-02-21T00:00:00", - "2024-02-22T00:00:00", - "2024-02-23T00:00:00", - "2024-02-26T00:00:00", - "2024-02-27T00:00:00", - "2024-02-28T00:00:00", - "2024-02-29T00:00:00", - "2024-03-01T00:00:00", - "2024-03-04T00:00:00", - "2024-03-05T00:00:00", - "2024-03-06T00:00:00", - "2024-03-07T00:00:00", - "2024-03-08T00:00:00", - "2024-03-11T00:00:00", - "2024-03-12T00:00:00", - "2024-03-13T00:00:00", - "2024-03-14T00:00:00", - "2024-03-15T00:00:00", - "2024-03-18T00:00:00", - "2024-03-19T00:00:00", - "2024-03-20T00:00:00", - "2024-03-21T00:00:00", - "2024-03-22T00:00:00", - "2024-03-25T00:00:00", - "2024-03-26T00:00:00", - "2024-03-27T00:00:00", - "2024-03-28T00:00:00", - "2024-03-29T00:00:00", - "2024-04-01T00:00:00", - "2024-04-02T00:00:00", - "2024-04-03T00:00:00", - "2024-04-04T00:00:00", - "2024-04-05T00:00:00", - "2024-04-08T00:00:00", - "2024-04-09T00:00:00", - "2024-04-10T00:00:00", - "2024-04-11T00:00:00", - "2024-04-12T00:00:00", - "2024-04-15T00:00:00", - "2024-04-16T00:00:00", - "2024-04-17T00:00:00", - "2024-04-18T00:00:00", - "2024-04-19T00:00:00", - "2024-04-22T00:00:00", - "2024-04-23T00:00:00", - "2024-04-24T00:00:00", - "2024-04-25T00:00:00", - "2024-04-26T00:00:00", - "2024-04-29T00:00:00", - "2024-04-30T00:00:00", - "2024-05-01T00:00:00", - "2024-05-02T00:00:00", - "2024-05-03T00:00:00", - "2024-05-06T00:00:00", - "2024-05-07T00:00:00", - "2024-05-08T00:00:00", - "2024-05-09T00:00:00", - "2024-05-10T00:00:00", - "2024-05-13T00:00:00", - "2024-05-14T00:00:00", - "2024-05-15T00:00:00", - "2024-05-16T00:00:00", - "2024-05-17T00:00:00", - "2024-05-20T00:00:00", - "2024-05-21T00:00:00", - "2024-05-22T00:00:00", - "2024-05-23T00:00:00", - "2024-05-24T00:00:00", - "2024-05-27T00:00:00", - "2024-05-28T00:00:00", - "2024-05-29T00:00:00", - "2024-05-30T00:00:00", - "2024-05-31T00:00:00", - "2024-06-03T00:00:00", - "2024-06-04T00:00:00", - "2024-06-05T00:00:00", - "2024-06-06T00:00:00", - "2024-06-07T00:00:00", - "2024-06-10T00:00:00", - "2024-06-11T00:00:00", - "2024-06-12T00:00:00", - "2024-06-13T00:00:00", - "2024-06-14T00:00:00", - "2024-06-17T00:00:00", - "2024-06-18T00:00:00", - "2024-06-19T00:00:00", - "2024-06-20T00:00:00", - "2024-06-21T00:00:00", - "2024-06-24T00:00:00", - "2024-06-25T00:00:00", - "2024-06-26T00:00:00", - "2024-06-27T00:00:00", - "2024-06-28T00:00:00", - "2024-07-01T00:00:00", - "2024-07-02T00:00:00", - "2024-07-03T00:00:00", - "2024-07-04T00:00:00", - "2024-07-05T00:00:00", - "2024-07-08T00:00:00", - "2024-07-09T00:00:00", - "2024-07-10T00:00:00", - "2024-07-11T00:00:00", - "2024-07-12T00:00:00", - "2024-07-15T00:00:00", - "2024-07-16T00:00:00", - "2024-07-17T00:00:00", - "2024-07-18T00:00:00", - "2024-07-19T00:00:00", - "2024-07-22T00:00:00", - "2024-07-23T00:00:00", - "2024-07-24T00:00:00", - "2024-07-25T00:00:00", - "2024-07-26T00:00:00", - "2024-07-29T00:00:00" - ], - "xaxis": "x", - "y": [ - null, - 1.0130881528750657, - 1.023753315740391, - 1.0200256436637978, - 1.0229870899421674, - 1.0315192202344279, - 1.0319748224927086, - 1.0379390472559837, - 1.037483444997703, - 1.0231941301694012, - 1.0324925494589776, - 1.0396164775707681, - 1.0344392079080769, - 1.0344392079080769, - 1.0287442112791165, - 1.0296760818989454, - 1.0509857415263286, - 1.051710571918924, - 1.0478586504263536, - 1.049805308875453, - 1.0484178359973437, - 1.0521868402804726, - 1.0620650480452143, - 1.0609260739990594, - 1.0503230358417224, - 1.055645284222751, - 1.0661240729641108, - 1.0597249752449154, - 1.0588137707283543, - 1.0702038271853676, - 1.068526270472398, - 1.0664140304007856, - 1.055810929044356, - 1.062085777347574, - 1.0679879406019532, - 1.0778660851676023, - 1.08142811242259, - 1.0793779338598737, - 1.076395821478236, - 1.074407704424416, - 1.083436832380585, - 1.0832297921533514, - 1.0832297921533514, - 1.081345195213148, - 1.074469892331497, - 1.0756501985841878, - 1.0625207135025865, - 1.0736207493238321, - 1.0742212671013576, - 1.0754638876593146, - 1.0646951414812797, - 1.0727302741096314, - 1.0579232955141529, - 1.0446694978174818, - 1.0427642347740107, - 1.0365929065844093, - 1.0344598740113442, - 1.025430746055175, - 1.0348740808639965, - 1.047154549336118, - 1.0466575516722092, - 1.0426813807636615, - 1.0525596517274955, - 1.0562872606049962, - 1.0395543528627789, - 1.0361787629308492, - 1.045870596571625, - 1.0588345000307138, - 1.069768891030354, - 1.0709493236812297, - 1.0710528437948463, - 1.0772241087853551, - 1.0786117080616497, - 1.0787565603818021, - 1.0837060605148994, - 1.097125629431361, - 1.094868284243226, - 1.0964421944443938, - 1.097705417906526, - 1.1003975728514883, - 1.0972291495449775, - 1.0892147462189863, - 1.0964214651420332, - 1.0964214651420332, - 1.0971876909402567, - 1.0895045772574763, - 1.082277129032069, - 1.0921346706935426, - 1.0930251459077434, - 1.09424703716334, - 1.1072522728289642, - 1.1072315435266038, - 1.1058855292532153, - 1.1093024513916805, - 1.1119740034324677, - 1.1211066515022534, - 1.1233639966903881, - 1.1240474316773552, - 1.132993642424083, - 1.1358722346921037, - 1.1358722346921037, - 1.1327866021968493, - 1.1276300618365185, - 1.1239645144679138, - 1.1282927675211252, - 1.1297009697015952, - 1.1314819201299966, - 1.127029417660808, - 1.1293489507560242, - 1.136949147229363, - 1.1420228967784374, - 1.1420228967784374, - 1.1486083686215984, - 1.1499337799908118, - 1.1510520247346065, - 1.1624420179925274, - 1.1524187683103557, - 1.1596876751404839, - 1.16287695414754, - 1.1697729863315516, - 1.1533714314316375, - 1.144507885097981, - 1.136907688624642, - 1.1486290979239588, - 1.1468274181931972, - 1.120837423367939, - 1.114997448020641, - 1.1274850831181813, - 1.128147788802788 - ], - "yaxis": "y" - }, - { - "customdata": [ - 2 - ], - "hovertemplate": "%{text}

Date: %{x}
Size: %{customdata}
PnL: %{y}
", - "marker": { - "color": [ - "green" - ] - }, - "mode": "markers", - "name": "Ticker", - "showlegend": false, - "text": [ - "AMZN" - ], - "type": "scatter", - "x": [ - "2024-01-31T00:00:00" - ], - "xaxis": "x2", - "y": [ - 0.6601709449353687 - ], - "yaxis": "y2" - }, - { - "fill": "tozeroy", - "line": { - "color": "red" - }, - "name": "Drawdown", - "showlegend": false, - "type": "scatter", - "x": [ - "2024-01-31T00:00:00", - "2024-02-01T00:00:00", - "2024-02-02T00:00:00", - "2024-02-05T00:00:00", - "2024-02-06T00:00:00", - "2024-02-07T00:00:00", - "2024-02-08T00:00:00", - "2024-02-09T00:00:00", - "2024-02-12T00:00:00", - "2024-02-13T00:00:00", - "2024-02-14T00:00:00", - "2024-02-15T00:00:00", - "2024-02-16T00:00:00", - "2024-02-19T00:00:00", - "2024-02-20T00:00:00", - "2024-02-21T00:00:00", - "2024-02-22T00:00:00", - "2024-02-23T00:00:00", - "2024-02-26T00:00:00", - "2024-02-27T00:00:00", - "2024-02-28T00:00:00", - "2024-02-29T00:00:00", - "2024-03-01T00:00:00", - "2024-03-04T00:00:00", - "2024-03-05T00:00:00", - "2024-03-06T00:00:00", - "2024-03-07T00:00:00", - "2024-03-08T00:00:00", - "2024-03-11T00:00:00", - "2024-03-12T00:00:00", - "2024-03-13T00:00:00", - "2024-03-14T00:00:00", - "2024-03-15T00:00:00", - "2024-03-18T00:00:00", - "2024-03-19T00:00:00", - "2024-03-20T00:00:00", - "2024-03-21T00:00:00", - "2024-03-22T00:00:00", - "2024-03-25T00:00:00", - "2024-03-26T00:00:00", - "2024-03-27T00:00:00", - "2024-03-28T00:00:00", - "2024-03-29T00:00:00", - "2024-04-01T00:00:00", - "2024-04-02T00:00:00", - "2024-04-03T00:00:00", - "2024-04-04T00:00:00", - "2024-04-05T00:00:00", - "2024-04-08T00:00:00", - "2024-04-09T00:00:00", - "2024-04-10T00:00:00", - "2024-04-11T00:00:00", - "2024-04-12T00:00:00", - "2024-04-15T00:00:00", - "2024-04-16T00:00:00", - "2024-04-17T00:00:00", - "2024-04-18T00:00:00", - "2024-04-19T00:00:00", - "2024-04-22T00:00:00", - "2024-04-23T00:00:00", - "2024-04-24T00:00:00", - "2024-04-25T00:00:00", - "2024-04-26T00:00:00", - "2024-04-29T00:00:00", - "2024-04-30T00:00:00", - "2024-05-01T00:00:00", - "2024-05-02T00:00:00", - "2024-05-03T00:00:00", - "2024-05-06T00:00:00", - "2024-05-07T00:00:00", - "2024-05-08T00:00:00", - "2024-05-09T00:00:00", - "2024-05-10T00:00:00", - "2024-05-13T00:00:00", - "2024-05-14T00:00:00", - "2024-05-15T00:00:00", - "2024-05-16T00:00:00", - "2024-05-17T00:00:00", - "2024-05-20T00:00:00", - "2024-05-21T00:00:00", - "2024-05-22T00:00:00", - "2024-05-23T00:00:00", - "2024-05-24T00:00:00", - "2024-05-27T00:00:00", - "2024-05-28T00:00:00", - "2024-05-29T00:00:00", - "2024-05-30T00:00:00", - "2024-05-31T00:00:00", - "2024-06-03T00:00:00", - "2024-06-04T00:00:00", - "2024-06-05T00:00:00", - "2024-06-06T00:00:00", - "2024-06-07T00:00:00", - "2024-06-10T00:00:00", - "2024-06-11T00:00:00", - "2024-06-12T00:00:00", - "2024-06-13T00:00:00", - "2024-06-14T00:00:00", - "2024-06-17T00:00:00", - "2024-06-18T00:00:00", - "2024-06-19T00:00:00", - "2024-06-20T00:00:00", - "2024-06-21T00:00:00", - "2024-06-24T00:00:00", - "2024-06-25T00:00:00", - "2024-06-26T00:00:00", - "2024-06-27T00:00:00", - "2024-06-28T00:00:00", - "2024-07-01T00:00:00", - "2024-07-02T00:00:00", - "2024-07-03T00:00:00", - "2024-07-04T00:00:00", - "2024-07-05T00:00:00", - "2024-07-08T00:00:00", - "2024-07-09T00:00:00", - "2024-07-10T00:00:00", - "2024-07-11T00:00:00", - "2024-07-12T00:00:00", - "2024-07-15T00:00:00", - "2024-07-16T00:00:00", - "2024-07-17T00:00:00", - "2024-07-18T00:00:00", - "2024-07-19T00:00:00", - "2024-07-22T00:00:00", - "2024-07-23T00:00:00", - "2024-07-24T00:00:00", - "2024-07-25T00:00:00", - "2024-07-26T00:00:00" - ], - "xaxis": "x3", - "y": [ - 0, - 0, - 0, - 0, - 0, - -0.001974905420582762, - -0.0007405895327184941, - -0.0017280422430099307, - 0, - 0, - -0.0032036852050792985, - -0.001232186617338149, - -0.002710810558144039, - -0.005175183792820337, - -0.005175183792820337, - -0.005175183792820337, - -0.003942997175482188, - 0, - 0, - 0, - -0.0019666520231333973, - -0.002458315028916691, - -0.0002458315028917024, - 0, - 0, - -0.0034348858153454565, - -0.004170932775776515, - -0.00024534898681038975, - -0.006133724670259633, - -0.006133724670259633, - -0.002698838854914287, - -0.0014720939208623385, - 0, - -0.004900967499156139, - -0.004900967499156139, - -0.003920773999325, - -0.001470290249746875, - -0.001470290249746875, - 0, - 0, - -0.0017144983546333314, - -0.0002449283363762378, - 0, - 0, - 0, - 0, - 0, - -0.00244270220689613, - 0, - 0, - 0, - 0, - 0, - -0.006056455518552384, - -0.006056455518552384, - -0.007025488401520841, - -0.00920581238819973, - -0.011628394595620706, - -0.014293235023783768, - -0.014293235023783768, - -0.011870652816362792, - -0.0155045261274942, - -0.018169366555657263, - -0.010174845271168076, - -0.010174845271168076, - -0.016376655722165734, - -0.013808718582299484, - -0.007267746622262927, - -0.002664840428163062, - -0.002664840428163062, - -0.0029070986489051487, - -0.004118389752615692, - -0.0024225822074209757, - -0.007025488401520841, - -0.007025488401520841, - -0.007025488401520841, - -0.008721295946715446, - -0.011870652816362792, - -0.012839685699331138, - -0.012839685699331138, - -0.013566460361557398, - -0.014050976803041682, - -0.016376655722165734, - -0.015020009686010027, - -0.015020009686010027, - -0.015020009686010027, - -0.0155045261274942, - -0.018217818199805724, - -0.020398142186484614, - -0.020398142186484614, - -0.01952601259181308, - -0.01729723696098573, - -0.012597427478589052, - -0.00993258705042599, - -0.00993258705042599, - -0.010417103491910162, - -0.011628394595620706, - -0.014535493244525854, - -0.014293235023783768, - -0.014293235023783768, - -0.015989042568978373, - -0.011870652816362792, - -0.011870652816362792, - -0.012355169257846965, - -0.012355169257846965, - -0.012355169257846965, - -0.002664840428163062, - 0, - -0.0012069053625245463, - -0.0012069053625245463, - 0, - -0.0036111278505249755, - -0.0009629674268066823, - -0.0021666767103150075, - -0.0021666767103150075, - -0.0019259348536133647, - -0.0012037092835083252, - -0.008185223127856633, - -0.01179635097838172, - -0.01179635097838172, - -0.01107412540827668, - -0.017092671825818417, - -0.020703799676343393, - -0.024411224269549003, - -0.024411224269549003, - -0.02696308795058666, - -0.025181598210994416, - -0.0265156306464297 - ], - "yaxis": "y3" - }, - { - "histnorm": "percent", - "marker": { - "color": "purple" - }, - "showlegend": false, - "type": "histogram", - "xaxis": "x4", - "y": [ - null, - 0.00812718921757205, - 0.0007418715180405044, - 0.004447929316169663, - 0.0004920258721621273, - 0.001967135607036097, - 0.0014724551862503876, - -0.001470290249746875, - 0.0019632735816672575, - 0.00024492833637612677, - 0.010774207891737664, - -0.011628394595620706, - -0.006617927836322757, - 0.011103360968836906, - 0.004880635638014663, - -0.00947101492117608, - -0.004560134681401817, - -0.0018718165732348746, - 0.005724681935977971, - -0.001962791894483118, - 0.0027041465318082825, - 0.015690786000522206, - 0.0016896675075344092, - -0.007229217201736637, - -0.012621889530589736, - -0.0059347018482922564 - ], - "yaxis": "y4" - }, - { - "histnorm": "percent", - "marker": { - "color": "purple" - }, - "showlegend": false, - "type": "histogram", - "xaxis": "x5", - "y": [ - null, - 0.014906607731547394, - 0.006160933086690967, - 0.0007347850091286023, - -0.008125650161761144, - 0.022257168561431673, - -0.02393084293387504 - ], - "yaxis": "y5" - } - ], - "layout": { - "annotations": [ - { - "font": { - "size": 16 - }, - "showarrow": false, - "text": "EQUITY CURVE", - "x": 0.5, - "xanchor": "center", - "xref": "paper", - "y": 0.9999999999999999, - "yanchor": "bottom", - "yref": "paper" - }, - { - "font": { - "size": 16 - }, - "showarrow": false, - "text": "TRADES", - "x": 0.5, - "xanchor": "center", - "xref": "paper", - "y": 0.5576923076923076, - "yanchor": "bottom", - "yref": "paper" - }, - { - "font": { - "size": 16 - }, - "showarrow": false, - "text": "PORTFOLIO DRAWDOWN", - "x": 0.5, - "xanchor": "center", - "xref": "paper", - "y": 0.3769230769230769, - "yanchor": "bottom", - "yref": "paper" - }, - { - "font": { - "size": 16 - }, - "showarrow": false, - "text": "WEEKLY PORTFOLIO RTRNS", - "x": 0.2375, - "xanchor": "center", - "xref": "paper", - "y": 0.13076923076923078, - "yanchor": "bottom", - "yref": "paper" - }, - { - "font": { - "size": 16 - }, - "showarrow": false, - "text": "MONTHLY PORTFOLIO RTRNS", - "x": 0.7625, - "xanchor": "center", - "xref": "paper", - "y": 0.13076923076923078, - "yanchor": "bottom", - "yref": "paper" - } - ], - "height": 1050, - "hovermode": "x unified", - "margin": { - "b": 20, - "l": 15, - "r": 15, - "t": 50 - }, - "paper_bgcolor": "WHITE", - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "heatmapgl": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmapgl" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "width": 1200, - "xaxis": { - "anchor": "y", - "domain": [ - 0, - 1 - ] - }, - "xaxis2": { - "anchor": "y2", - "domain": [ - 0, - 1 - ] - }, - "xaxis3": { - "anchor": "y3", - "domain": [ - 0, - 1 - ] - }, - "xaxis4": { - "anchor": "y4", - "domain": [ - 0, - 0.475 - ] - }, - "xaxis5": { - "anchor": "y5", - "domain": [ - 0.525, - 1 - ] - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0.6076923076923076, - 0.9999999999999999 - ] - }, - "yaxis2": { - "anchor": "x2", - "domain": [ - 0.42692307692307685, - 0.5576923076923076 - ] - }, - "yaxis3": { - "anchor": "x3", - "domain": [ - 0.1807692307692308, - 0.3769230769230769 - ] - }, - "yaxis4": { - "anchor": "x4", - "domain": [ - 0, - 0.13076923076923078 - ] - }, - "yaxis5": { - "anchor": "x5", - "domain": [ - 0, - 0.13076923076923078 - ] - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "pm.plot_portfolio()" - ] - }, - { - "cell_type": "code", - "execution_count": 86, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Populate Cache Dates: Start: 2017-01-01, End: 2025-05-28, Target: 2024-05-07\n", - "2025-05-28 22:59:05 QuantTools.EventDriven.riskmanager.utils CRITICAL: Data needs to be queried for 1 strikes_right. Load time ~1.5mins\n", - "Missing Ticks: []\n", - "Data List: []\n" - ] - } - ], - "source": [ - "cprofil_get_order = cProfiler(rm.OrderPicker.get_order)\n", - "candidates = cprofil_get_order(\n", - " tick = 'AMD',\n", - " date = '2024-05-07',\n", - " right = 'C',\n", - " max_close = 2,\n", - " order_settings= {'type': 'naked',\n", - " 'specifics': [{'direction': 'long',\n", - " 'rel_strike':1,\n", - " 'dte': 365,\n", - " 'moneyness_width': 0},\n", - " {'direction': 'short',\n", - " 'rel_strike': .825,\n", - " 'dte': 365,\n", - " 'moneyness_width': 0}\n", - "],\n", - " 'name': 'vertical_spread'}\n", - ")\n", - "# print(candidates[1])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## ***Completed***\n", - "- Add an if statement in calc greeks to use already saved options data for the legs (Done)\n", - "- Move analyze order to do on the next day (Done)\n", - "- Calculating Greeks EOD (Done)\n", - "- Std Dev Moves of greeks (Done)\n", - "- Fix dte reason for hold action\n", - "- Add dictionary for formatted caches to skip reformatting it (Done)\n", - "- Add False in Order_settings to return the exact/closest contract & avoid checks (Done)\n", - "- Extend retrieve_eod to use quotes whenever close i mising. (No need)- Check if leg position data already in processed_position_data risk manager to save even more time. (Done)\n", - "- Solution to Erratic Greek values. (Discuss with zino on possible solutions.) (Done)\n", - "- Have a default return for order. (Done)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## ***Notes:***\n", - "- Move analyze order to do on the next day,\n", - "- Calculating Greeks EOD (Talk More on this)\n", - "- Adding a min filter in order selection for new order picker. Now arbitrally using half close with min_total_price key" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## ***Major To-Do:***\n", - "\n", - "- Add order resolve\n", - "- Does the data for split contracts being saved make sense?\n", - "- It saves post split & pre split, joined together on post split timeseries:\n", - " - Might be a good idea to seperate it. As well as save before sizing up.\n", - "- Come out w a solution for negative values. \n", - "SKIP\n", - "- Add Option, Signal ID, Trade ID Meta, just to avoid recalling the function (Not Urgent)\n", - "- In schedule, find a more efficient way to handle the requests stuff that avoids reputting requests (Not Urgent)\n", - "- Can we extend update_greeks to take a callable for custom updates? (Not Urgent)\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## ***Going Live To-Do:***\n", - "\n", - "- Add give up message when no longer searching for orders ()\n", - "\n", - "\n", - "Future Extensions:\n", - "- Limits only work for long delta, fix for short delta.\n", - "- Change order to take up a format of \n", - " Column Long | Column Short | Column Short ....\n", - " - Each column would have to somehow be a pegged to another to keep the distance correct.\n", - " - Another option is to construct a chain based on width and known properties.\n", - "\n", - "\n", - "Pending Issues:\n", - "- The cost example is unresolved" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "ename": "NameError", - "evalue": "name 'Stock' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[1], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mStock\u001b[49m\u001b[38;5;241m.\u001b[39mclear_instances()\n\u001b[1;32m 2\u001b[0m get_ipython()\u001b[38;5;241m.\u001b[39mrun_line_magic(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlprun\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m-f Stock.__init__ Stock(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mBAC\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", - "\u001b[0;31mNameError\u001b[0m: name 'Stock' is not defined" - ] - } - ], - "source": [ - "Stock.clear_instances()\n", - "%lprun -f Stock.__init__ Stock('BAC')\n" - ] - }, - { - "cell_type": "code", - "execution_count": 93, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " 2430344 function calls (2407955 primitive calls) in 6.614 seconds\n", - "\n", - " Ordered by: cumulative time\n", - "\n", - " ncalls tottime percall cumtime percall filename:lineno(function)\n", - " 2 0.000 0.000 6.614 3.307 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/IPython/core/interactiveshell.py:3541(run_code)\n", - " 2 0.000 0.000 6.614 3.307 {built-in method builtins.exec}\n", - " 1 0.000 0.000 6.614 6.614 /var/folders/j0/80hkbygd4lb27h9mw76gqzpw0000gn/T/ipykernel_42989/3506397735.py:1()\n", - " 1 0.015 0.015 6.614 6.614 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/backtest.py:48(run)\n", - " 2 0.000 0.000 2.492 1.246 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:494(analyze_signal)\n", - " 2 0.000 0.000 2.491 1.246 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:312(generate_order)\n", - " 1 0.000 0.000 2.486 2.486 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:352(create_order)\n", - " 1 0.000 0.000 2.485 2.485 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:411(get_order)\n", - " 2/1 0.000 0.000 2.469 2.469 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/decorators.py:41(wrapper)\n", - " 1 0.000 0.000 2.469 2.469 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:78(get_order)\n", - " 3 0.000 0.000 2.227 0.742 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/decorators.py:11(wrapper)\n", - " 1 0.000 0.000 2.220 2.220 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:769(populate_cache)\n", - " 1 0.000 0.000 2.193 2.193 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:575(populate_cache_v2)\n", - " 1 0.014 0.014 1.963 1.963 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:397(format_cache)\n", - " 2 0.005 0.002 1.949 0.974 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:411(process_cache)\n", - " 3019 0.045 0.000 1.738 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:673(to_datetime)\n", - " 167 0.021 0.000 1.688 0.010 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:643(analyze_position)\n", - " 1858 0.040 0.000 1.580 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:314(_convert_listlike_datetimes)\n", - " 169 0.008 0.000 1.204 0.007 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:786(update_timeindex)\n", - " 2124 0.008 0.000 1.153 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:1224(__getitem__)\n", - " 2124 0.023 0.000 1.145 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:1123(get)\n", - " 169 0.007 0.000 1.027 0.006 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:848(calculate_close_on_position)\n", - " 2124 0.011 0.000 1.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:254(fetch)\n", - " 338 0.015 0.000 1.008 0.003 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:928(get_latest_option_data)\n", - " 1590 0.005 0.000 0.963 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:814(__setitem__)\n", - " 1590 0.024 0.000 0.957 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:749(set)\n", - " 1858 0.380 0.000 0.856 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:126(_guess_datetime_format_for_array)\n", - " 2 0.000 0.000 0.823 0.411 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:170(values)\n", - " 2 0.003 0.001 0.823 0.411 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:171()\n", - " 4085 0.087 0.000 0.766 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:475(__new__)\n", - " 2124 0.275 0.000 0.731 0.000 {built-in method _pickle.load}\n", - " 1854 0.040 0.000 0.622 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:456(_array_strptime_with_fallback)\n", - " 2 0.000 0.000 0.612 0.306 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:839(update_fill)\n", - " 2 0.000 0.000 0.612 0.306 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:689(update_positions_on_fill)\n", - " 2 0.000 0.000 0.609 0.305 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:944(get_options_data_on_contract)\n", - " 2 0.000 0.000 0.607 0.303 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_sync.py:85(retry)\n", - " 2 0.001 0.001 0.606 0.303 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:291(retrieve_eod_ohlc)\n", - " 161 0.016 0.000 0.593 0.004 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:797(limits_check)\n", - " 2 0.000 0.000 0.531 0.265 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:95(request_from_proxy)\n", - " 2 0.000 0.000 0.531 0.265 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/api.py:14(request)\n", - " 2 0.000 0.000 0.530 0.265 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:500(request)\n", - " 2 0.000 0.000 0.523 0.262 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:673(send)\n", - " 4935 0.055 0.000 0.509 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:517(sanitize_array)\n", - " 2202 0.013 0.000 0.439 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1610(_log)\n", - " 34 0.000 0.000 0.435 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:704(readinto)\n", - " 34 0.434 0.013 0.434 0.013 {method 'recv_into' of '_socket.socket' objects}\n", - " 2020 0.014 0.000 0.426 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1479(info)\n", - " 13982 0.405 0.000 0.405 0.000 {method 'execute' of 'sqlite3.Connection' objects}\n", - " 2 0.000 0.000 0.401 0.201 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:613(send)\n", - " 2 0.000 0.000 0.400 0.200 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:594(urlopen)\n", - " 2 0.000 0.000 0.399 0.200 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:379(_make_request)\n", - " 4050 0.014 0.000 0.392 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:769(_try_cast)\n", - " 161 0.013 0.000 0.387 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:842(dte_check)\n", - " 161 0.013 0.000 0.380 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:885(moneyness_check)\n", - " 1590 0.009 0.000 0.366 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:179(store)\n", - " 1854 0.021 0.000 0.364 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1200(maybe_cast_to_datetime)\n", - " 3288 0.004 0.000 0.354 0.000 {built-in method builtins.next}\n", - " 3180 0.011 0.000 0.327 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:708(_transact)\n", - " 2 0.000 0.000 0.318 0.159 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:481(getresponse)\n", - " 2 0.000 0.000 0.317 0.159 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1351(getresponse)\n", - " 2 0.000 0.000 0.317 0.158 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:318(begin)\n", - " 2 0.000 0.000 0.316 0.158 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:285(_read_status)\n", - " 14 0.000 0.000 0.316 0.023 {method 'readline' of '_io.BufferedReader' objects}\n", - " 1610 0.004 0.000 0.289 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:141(__exit__)\n", - " 775 0.005 0.000 0.287 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1176(__getitem__)\n", - " 2202 0.005 0.000 0.281 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1636(handle)\n", - " 2202 0.010 0.000 0.273 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1690(callHandlers)\n", - " 773 0.006 0.000 0.271 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1719(_getitem_axis)\n", - " 2202 0.009 0.000 0.263 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:965(handle)\n", - " 1888 0.038 0.000 0.262 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:666(_parse)\n", - " 496 0.261 0.001 0.261 0.001 {built-in method io.open}\n", - " 1590 0.223 0.000 0.254 0.000 {built-in method _pickle.dumps}\n", - "420381/418511 0.147 0.000 0.250 0.000 {built-in method builtins.isinstance}\n", - " 2202 0.007 0.000 0.243 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/handlers.py:65(emit)\n", - " 1857 0.006 0.000 0.236 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:325(_from_sequence)\n", - " 1861 0.039 0.000 0.231 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:329(_from_sequence_not_strict)\n", - " 2202 0.005 0.000 0.231 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1216(emit)\n", - " 2202 0.010 0.000 0.226 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1098(emit)\n", - " 1782 0.010 0.000 0.199 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:292(_new_Index)\n", - " 167 0.007 0.000 0.194 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:505(analyze_positions)\n", - " 393 0.004 0.000 0.187 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4142(_take_with_is_copy)\n", - " 393 0.006 0.000 0.166 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4027(take)\n", - " 338 0.001 0.000 0.162 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1696(_get_list_axis)\n", - " 338 0.009 0.000 0.157 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:4081(argsort)\n", - " 62 0.008 0.000 0.152 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:167(keys)\n", - " 783/776 0.023 0.000 0.150 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:389(__init__)\n", - " 50304 0.037 0.000 0.149 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:2263(_iter)\n", - " 9212 0.144 0.000 0.144 0.000 {method 'fetchall' of 'sqlite3.Cursor' objects}\n", - " 50585 0.052 0.000 0.140 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:173(search)\n", - " 3 0.000 0.000 0.133 0.044 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:583(map)\n", - " 3 0.002 0.001 0.133 0.044 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:608()\n", - " 2202 0.010 0.000 0.133 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1087(flush)\n", - " 1588 0.024 0.000 0.131 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:161(submit)\n", - " 398 0.004 0.000 0.125 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:869(take)\n", - " 821/443 0.003 0.000 0.124 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/common.py:62(new_method)\n", - " 14 0.000 0.000 0.122 0.009 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:890(content)\n", - " 20 0.000 0.000 0.122 0.006 {method 'join' of 'bytes' objects}\n", - " 12 0.000 0.000 0.122 0.010 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:816(generate)\n", - " 12 0.000 0.000 0.122 0.010 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:1038(stream)\n", - " 10 0.000 0.000 0.122 0.012 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:910(read)\n", - " 12 0.000 0.000 0.121 0.010 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:858(_raw_read)\n", - " 12 0.000 0.000 0.120 0.010 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:801(_fp_read)\n", - " 12 0.000 0.000 0.120 0.010 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:457(read)\n", - " 10 0.000 0.000 0.119 0.012 {method 'read' of '_io.BufferedReader' objects}\n", - " 1 0.000 0.000 0.118 0.118 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:998(produce_order_candidates)\n", - " 2 0.001 0.000 0.118 0.059 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:853(chain_details)\n", - " 2202 0.115 0.000 0.115 0.000 {method 'flush' of '_io.TextIOWrapper' objects}\n", - " 1081 0.011 0.000 0.112 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1095(__getitem__)\n", - " 6 0.000 0.000 0.111 0.018 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:4789(apply)\n", - " 6 0.000 0.000 0.111 0.018 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1409(apply)\n", - " 6 0.000 0.000 0.110 0.018 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1482(apply_standard)\n", - " 74 0.002 0.000 0.110 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:312(remove)\n", - " 6 0.000 0.000 0.109 0.018 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:891(_map_values)\n", - " 6 0.001 0.000 0.109 0.018 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:1667(map_array)\n", - " 1854 0.023 0.000 0.107 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1240(_ensure_nanosecond_dtype)\n", - " 2202 0.007 0.000 0.106 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1595(makeRecord)\n", - " 666 0.008 0.000 0.104 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:3983(_ixs)\n", - " 1888 0.015 0.000 0.104 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:199(split)\n", - " 370 0.005 0.000 0.103 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4062(__getitem__)\n", - " 61346 0.072 0.000 0.101 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:272(_compile)\n", - " 360 0.009 0.000 0.100 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:1371(_arith_method)\n", - " 2202 0.049 0.000 0.098 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:292(__init__)\n", - " 74 0.017 0.000 0.098 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:230(_write)\n", - " 1588 0.008 0.000 0.097 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:180(_adjust_thread_count)\n", - " 340 0.001 0.000 0.097 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:192(__sub__)\n", - " 3719 0.018 0.000 0.097 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2428(maybe_convert_dtype)\n", - " 1590 0.009 0.000 0.096 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:877(_cull)\n", - " 342 0.001 0.000 0.096 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7227(_arith_method)\n", - " 1861 0.024 0.000 0.093 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2184(_sequence_to_dt64)\n", - " 2928 0.011 0.000 0.093 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5373(__getitem__)\n", - " 2606 0.013 0.000 0.091 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:373(__getitem__)\n", - " 3872 0.029 0.000 0.084 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:346(_name_get)\n", - " 2202 0.004 0.000 0.081 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:942(format)\n", - " 2 0.000 0.000 0.081 0.041 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:365(request)\n", - " 4 0.000 0.000 0.081 0.020 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:988(send)\n", - " 2 0.000 0.000 0.081 0.040 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1287(endheaders)\n", - " 2 0.000 0.000 0.081 0.040 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1049(_send_output)\n", - " 46947 0.037 0.000 0.081 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/generic.py:42(_instancecheck)\n", - " 2 0.000 0.000 0.081 0.040 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:278(connect)\n", - " 2 0.000 0.000 0.081 0.040 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:193(_new_conn)\n", - " 2 0.000 0.000 0.080 0.040 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/connection.py:27(create_connection)\n", - " 2 0.079 0.040 0.079 0.040 {method 'connect' of '_socket.socket' objects}\n", - " 2202 0.016 0.000 0.078 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:674(format)\n", - " 5540 0.009 0.000 0.075 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:189(__next__)\n", - " 3768 0.074 0.000 0.074 0.000 {method 'acquire' of '_thread.lock' objects}\n", - " 2608 0.013 0.000 0.073 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:278(__getitem__)\n", - " 400 0.006 0.000 0.070 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:623(reindex_indexer)\n", - " 1610 0.002 0.000 0.069 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:132(__enter__)\n", - " 338 0.004 0.000 0.068 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1543(to_series)\n", - " 1910 0.019 0.000 0.068 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:875(_parse_numeric_token)\n", - " 1589 0.003 0.000 0.066 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:825(_row_update)\n", - " 1588 0.008 0.000 0.066 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:440(acquire)\n", - " 5540 0.043 0.000 0.066 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:77(get_token)\n", - " 684 0.007 0.000 0.063 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:988(parse_option_tick)\n", - " 7511 0.047 0.000 0.062 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:649(_simple_new)\n", - " 2317 0.005 0.000 0.062 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:913(__init__)\n", - " 1936 0.040 0.000 0.061 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:2188(__setstate__)\n", - " 1 0.000 0.000 0.060 0.060 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:442(update_spot_cache)\n", - " 1590 0.007 0.000 0.060 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:2327(volume)\n", - " 1 0.001 0.001 0.060 0.060 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:646()\n", - " 20 0.001 0.000 0.058 0.003 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:178()\n", - " 74 0.001 0.000 0.058 0.001 :232(removedirs)\n", - " 743 0.005 0.000 0.058 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1220(_get_value)\n", - " 20 0.001 0.000 0.058 0.003 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:954(available_close_check)\n", - " 6799/556 0.023 0.000 0.058 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:128(deepcopy)\n", - " 2197 0.034 0.000 0.057 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:545(_box_func)\n", - " 1777 0.014 0.000 0.056 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:935(_verify_integrity)\n", - " 1 0.000 0.000 0.055 0.055 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/threads.py:4(runThreads)\n", - " 338 0.009 0.000 0.055 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1651(abs)\n", - " 205 0.055 0.000 0.055 0.000 {built-in method posix.rmdir}\n", - " 388 0.003 0.000 0.054 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:687()\n", - " 3 0.000 0.000 0.054 0.018 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:646(__exit__)\n", - " 3 0.000 0.000 0.054 0.018 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:216(shutdown)\n", - " 32 0.000 0.000 0.054 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1087(join)\n", - " 51 0.000 0.000 0.054 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1125(_wait_for_tstate_lock)\n", - " 963 0.006 0.000 0.052 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1287(take_nd)\n", - " 167 0.003 0.000 0.052 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/eventScheduler.py:88(advance_date)\n", - " 3738 0.018 0.000 0.049 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1163(is_float_dtype)\n", - " 1867 0.019 0.000 0.049 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:231(asarray_tuplesafe)\n", - " 337 0.005 0.000 0.049 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:582(get_loc)\n", - " 1 0.001 0.001 0.048 0.048 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:645()\n", - " 74 0.048 0.001 0.048 0.001 {built-in method posix.remove}\n", - " 50511 0.036 0.000 0.047 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/generic.py:37(_check)\n", - " 4458 0.008 0.000 0.047 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_strptime.py:26(_getlang)\n", - " 20 0.000 0.000 0.047 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:168()\n", - " 20 0.002 0.000 0.046 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:1053(liquidity_check)\n", - " 360 0.002 0.000 0.046 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1025(argsort)\n", - " 701/363 0.003 0.000 0.045 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:53(_wrapfunc)\n", - "1021/1015 0.004 0.000 0.045 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:59(take_nd)\n", - " 338 0.003 0.000 0.042 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/base.py:800(argsort)\n", - " 1 0.001 0.001 0.042 0.042 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:640()\n", - " 346 0.014 0.000 0.041 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:958(fast_xs)\n", - " 10288 0.010 0.000 0.041 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:646(_sql)\n", - " 2096 0.016 0.000 0.041 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:73(_new_DatetimeIndex)\n", - " 8529 0.026 0.000 0.041 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6301(__setattr__)\n", - "92315/79894 0.031 0.000 0.040 0.000 {built-in method builtins.len}\n", - " 95 0.001 0.000 0.040 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4130(_getitem_bool_array)\n", - " 8060 0.022 0.000 0.040 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2716(new_block)\n", - " 5132 0.008 0.000 0.040 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:163(match)\n", - " 1073 0.024 0.000 0.040 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3777(get_loc)\n", - " 684 0.002 0.000 0.040 0.000 {built-in method strptime}\n", - " 2202 0.016 0.000 0.039 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1561(findCaller)\n", - " 750 0.005 0.000 0.039 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_strptime.py:564(_strptime_datetime)\n", - " 1013 0.014 0.000 0.039 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:120(_take_nd_ndarray)\n", - " 4458 0.009 0.000 0.039 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/locale.py:594(getlocale)\n", - " 5186 0.004 0.000 0.038 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:271(__enter__)\n", - "117860/117856 0.036 0.000 0.038 0.000 {built-in method builtins.getattr}\n", - " 401 0.005 0.000 0.038 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:317(apply)\n", - "5988/5635 0.011 0.000 0.038 0.000 {built-in method numpy.asarray}\n", - " 2202 0.005 0.000 0.037 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:606(formatTime)\n", - " 7785 0.020 0.000 0.036 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2645(maybe_coerce_values)\n", - " 338 0.002 0.000 0.036 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4342(_getitem_slice)\n", - " 1568 0.006 0.000 0.036 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6284(__getattr__)\n", - " 1861 0.010 0.000 0.035 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2425(ensure_arraylike_for_datetimelike)\n", - " 1652 0.008 0.000 0.035 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:2370(reset)\n", - " 360 0.001 0.000 0.035 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:240(arithmetic_op)\n", - " 874 0.004 0.000 0.035 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:295(wait)\n", - " 6732 0.019 0.000 0.035 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1596(pandas_dtype)\n", - " 750 0.021 0.000 0.034 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_strptime.py:309(_strptime)\n", - " 562/387 0.005 0.000 0.034 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:227(_deepcopy_dict)\n", - " 342 0.005 0.000 0.034 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7218(_construct_result)\n", - " 6316 0.011 0.000 0.034 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1375(_is_dtype)\n", - " 50611 0.034 0.000 0.034 0.000 {method 'search' of 're.Pattern' objects}\n", - " 3872 0.010 0.000 0.033 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:330(_name_includes_bit_suffix)\n", - " 295 0.002 0.000 0.032 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4626(_get_item_cache)\n", - " 4286 0.013 0.000 0.032 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1198(is_bool_dtype)\n", - " 2010 0.032 0.000 0.032 0.000 {method '__enter__' of '_thread.lock' objects}\n", - " 5604 0.025 0.000 0.032 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:428(append)\n", - " 4879 0.010 0.000 0.032 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7688(maybe_extract_name)\n", - " 2 0.000 0.000 0.032 0.016 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:10170(apply)\n", - " 2 0.000 0.000 0.032 0.016 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:864(apply)\n", - " 2 0.000 0.000 0.032 0.016 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1061(apply_standard)\n", - " 340 0.001 0.000 0.031 0.000 {built-in method _operator.sub}\n", - " 182 0.001 0.000 0.031 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1491(warning)\n", - " 338 0.002 0.000 0.031 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1087(_slice)\n", - " 10288 0.020 0.000 0.031 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:608(_con)\n", - " 2 0.000 0.000 0.031 0.015 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1070(apply_series_generator)\n", - " 820 0.010 0.000 0.030 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:1054(is_USholiday)\n", - " 496 0.030 0.000 0.030 0.000 {method '__exit__' of '_io._IOBase' objects}\n", - " 338 0.003 0.000 0.029 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1422(__sub__)\n", - " 1591 0.004 0.000 0.029 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:612(result_iterator)\n", - " 2441 0.014 0.000 0.029 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:82(shape)\n", - " 518 0.004 0.000 0.029 0.000 {built-in method builtins.print}\n", - " 20 0.000 0.000 0.028 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:939()\n", - " 2291 0.021 0.000 0.028 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6236(__finalize__)\n", - " 15625 0.028 0.000 0.028 0.000 {method 'write' of '_io.BufferedWriter' objects}\n", - " 340 0.003 0.000 0.027 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:387(apply)\n", - " 5500 0.008 0.000 0.027 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1851(_frombuffer)\n", - " 378 0.005 0.000 0.027 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:823(take)\n", - " 3 0.000 0.000 0.027 0.009 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_decorators.py:325(wrapper)\n", - " 690 0.014 0.000 0.026 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:842(_engine)\n", - " 2 0.000 0.000 0.026 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1204(__repr__)\n", - " 40 0.001 0.000 0.026 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:1022(generate_option_tick_new)\n", - " 338 0.003 0.000 0.026 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1126(_sub_datetimelike_scalar)\n", - " 2 0.000 0.000 0.026 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1310(to_string)\n", - " 41484 0.017 0.000 0.026 0.000 {built-in method builtins.issubclass}\n", - " 2 0.000 0.000 0.026 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:939(to_string)\n", - " 2 0.000 0.000 0.026 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/string.py:28(to_string)\n", - " 2 0.000 0.000 0.026 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/string.py:40(_get_string_representation)\n", - " 1588 0.007 0.000 0.025 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:314(_result_or_cancel)\n", - " 1376 0.015 0.000 0.025 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:655(write)\n", - " 2539 0.005 0.000 0.025 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:536(is_string_dtype)\n", - " 131/74 0.001 0.000 0.024 0.000 :200(makedirs)\n", - " 4458 0.008 0.000 0.024 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/locale.py:479(_parse_localename)\n", - " 341 0.012 0.000 0.024 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:369(nargsort)\n", - " 2 0.000 0.000 0.024 0.012 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/string.py:34(_get_strcols)\n", - " 2 0.000 0.000 0.024 0.012 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:472(get_strcols)\n", - " 36 0.001 0.000 0.024 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4271(__setitem__)\n", - " 3803 0.011 0.000 0.023 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numerictypes.py:357(issubdtype)\n", - " 1858 0.005 0.000 0.023 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:208(findall)\n", - " 2 0.000 0.000 0.023 0.011 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:704(_get_strcols_without_index)\n", - " 36 0.000 0.000 0.023 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4514(_set_item)\n", - " 49 0.001 0.000 0.022 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1347(insert)\n", - " 3771 0.003 0.000 0.022 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:225(compile)\n", - " 775 0.003 0.000 0.022 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5437(_can_hold_identifiers_and_holds_name)\n", - " 11335 0.009 0.000 0.022 0.000 :117(__instancecheck__)\n", - " 32 0.000 0.000 0.022 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:945(start)\n", - " 4085 0.014 0.000 0.021 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:609(_dtype_to_subclass)\n", - " 50176 0.021 0.000 0.021 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:165(get)\n", - " 698/344 0.006 0.000 0.021 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:259(_reconstruct)\n", - " 1013 0.006 0.000 0.021 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:564(_take_preprocess_indexer_and_fill_value)\n", - " 1568 0.011 0.000 0.020 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:2176(__getstate__)\n", - " 338 0.005 0.000 0.020 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1974(get_slice)\n", - " 32 0.000 0.000 0.020 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:611(wait)\n", - " 1508 0.020 0.000 0.020 0.000 {cyfunction Timestamp.strftime at 0x1199445f0}\n", - " 338 0.009 0.000 0.020 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1158(_sub_datetimelike)\n", - " 1670 0.003 0.000 0.020 0.000 {method 'any' of 'numpy.ndarray' objects}\n", - " 131 0.020 0.000 0.020 0.000 {built-in method posix.mkdir}\n", - " 4 0.000 0.000 0.020 0.005 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Context.py:16(Context)\n", - " 36 0.001 0.000 0.019 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4481(_set_item_mgr)\n", - " 1888 0.012 0.000 0.019 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:221(__init__)\n", - " 6606 0.012 0.000 0.019 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:194(_is_internal_frame)\n", - " 402 0.010 0.000 0.019 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:239(maybe_convert_indices)\n", - " 776 0.006 0.000 0.019 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1863(from_array)\n", - " 28 0.000 0.000 0.018 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:751(format_col)\n", - " 1876 0.014 0.000 0.018 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:474(resolve_ymd)\n", - " 1458 0.002 0.000 0.018 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:101(isna)\n", - " 430 0.001 0.000 0.018 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:511(_validate_dtype)\n", - " 4898 0.010 0.000 0.018 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1434(_is_dtype_type)\n", - " 2002 0.018 0.000 0.018 0.000 {method 'reduce' of 'numpy.ufunc' objects}\n", - " 1861 0.012 0.000 0.018 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2514(_validate_dt64_dtype)\n", - " 1863 0.017 0.000 0.018 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:304(_simple_new)\n", - " 14100 0.015 0.000 0.018 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:481(ensure_wrapped_if_datetimelike)\n", - " 8153 0.013 0.000 0.017 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2674(get_block_type)\n", - " 338 0.002 0.000 0.017 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2191(__array_ufunc__)\n", - " 1670 0.002 0.000 0.017 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:55(_any)\n", - " 399 0.002 0.000 0.017 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5425(_getitem_slice)\n", - " 2668 0.014 0.000 0.017 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:278(__init__)\n", - " 1068 0.003 0.000 0.017 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:145(_get_option)\n", - " 1873 0.005 0.000 0.017 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:339(_from_mgr)\n", - " 4458 0.012 0.000 0.017 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/locale.py:396(normalize)\n", - " 342 0.001 0.000 0.017 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:378(interleaved_dtype)\n", - " 401 0.005 0.000 0.016 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1146(take)\n", - " 2097 0.004 0.000 0.016 0.000 {built-in method builtins.sum}\n", - " 2202 0.016 0.000 0.016 0.000 {built-in method time.strftime}\n", - " 1458 0.005 0.000 0.016 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:184(_isna)\n", - " 883 0.004 0.000 0.016 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:97(is_bool_indexer)\n", - " 349 0.006 0.000 0.016 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1433(find_common_type)\n", - " 2202 0.007 0.000 0.016 0.000 :117(splitext)\n", - " 2202 0.016 0.000 0.016 0.000 {built-in method time.localtime}\n", - " 2043 0.015 0.000 0.015 0.000 {built-in method numpy.array}\n", - " 338 0.005 0.000 0.015 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/base.py:2276(__array_ufunc__)\n", - " 2237 0.015 0.000 0.015 0.000 {method 'view' of 'numpy.generic' objects}\n", - " 7323 0.005 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:84()\n", - " 2625 0.013 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:467(__enter__)\n", - " 2202 0.008 0.000 0.014 0.000 :140(basename)\n", - " 4914 0.010 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:696(_sanitize_ndim)\n", - " 32 0.000 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1079(format_array)\n", - " 5948 0.014 0.000 0.014 0.000 {method 'match' of 're.Pattern' objects}\n", - " 2202 0.003 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:658(formatMessage)\n", - " 3712 0.007 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:178(_datetime_metadata_str)\n", - " 2 0.000 0.000 0.014 0.007 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:1065(change_to_last_busday)\n", - " 315 0.004 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2313(is_unique)\n", - " 49 0.001 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6956(insert)\n", - " 2539 0.010 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:572(condition)\n", - " 5186 0.012 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:274(__exit__)\n", - " 1588 0.007 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:428(result)\n", - " 56 0.000 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6662(copy)\n", - " 378 0.005 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:141(equals)\n", - " 8180 0.011 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:416(extract_array)\n", - " 1652 0.004 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:662(_execute_with_retry)\n", - " 11335 0.013 0.000 0.013 0.000 {built-in method _abc._abc_instancecheck}\n", - " 32 0.000 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1193(get_result)\n", - " 1888 0.012 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:62(__init__)\n", - " 320 0.002 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4608(_box_col_values)\n", - " 1275 0.006 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:419(check_array_indexer)\n", - " 7606 0.008 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numerictypes.py:283(issubclass_)\n", - " 8215 0.007 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:937()\n", - " 666 0.003 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:678(_constructor_sliced_from_mgr)\n", - " 338 0.002 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/numpy/function.py:159(validate_argsort_with_ascending)\n", - " 25263 0.011 0.000 0.012 0.000 {built-in method builtins.hasattr}\n", - " 59 0.001 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:557(copy)\n", - " 16924 0.009 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:208(isnum)\n", - " 46 0.000 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12498(sum)\n", - " 4085 0.011 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:591(_ensure_array)\n", - " 5 0.000 0.000 0.011 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6239(reset_index)\n", - " 2202 0.003 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:447(format)\n", - " 46 0.000 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12459(_min_count_stat_function)\n", - " 5728 0.008 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:193(__get__)\n", - " 976 0.010 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:551(maybe_promote)\n", - " 61 0.001 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6201(_construct_result)\n", - " 11370 0.007 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:909(__len__)\n", - " 320 0.005 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1012(iget)\n", - " 5978 0.010 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1331(is_ea_or_datetimelike_dtype)\n", - " 32563 0.011 0.000 0.011 0.000 {method 'get' of 'dict' objects}\n", - " 3760 0.007 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2537(dtype_to_unit)\n", - " 4404 0.007 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:922(acquire)\n", - " 2 0.000 0.000 0.010 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6731(drop_duplicates)\n", - " 682 0.002 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:664(_constructor_from_mgr)\n", - " 1174 0.002 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/numpy/function.py:64(__call__)\n", - " 1858 0.010 0.000 0.010 0.000 {method 'findall' of 're.Pattern' objects}\n", - " 800 0.003 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:807(_set_axis)\n", - " 10602 0.007 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1399(_get_dtype)\n", - " 344 0.003 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1605(maybe_cast_to_integer_array)\n", - " 676 0.001 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:833(isna)\n", - " 6877 0.007 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:334(is_hashable)\n", - " 1903 0.004 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2152(unit)\n", - " 5500 0.010 0.000 0.010 0.000 {built-in method numpy.frombuffer}\n", - " 1952 0.009 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1141(_to_decimal)\n", - " 716 0.007 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:836(_isnan)\n", - " 720 0.004 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:33(seterr)\n", - " 38 0.000 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6110(_cmp_method)\n", - " 340 0.002 0.000 0.009 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/eventScheduler.py:27(get_nowait)\n", - " 1080 0.004 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:127(_get_single_key)\n", - " 57 0.001 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:674(_with_infer)\n", - " 160 0.003 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1913(__setstate__)\n", - " 3564 0.005 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/generic.py:46(_subclasscheck)\n", - " 2891 0.007 0.000 0.009 0.000 :1207(_handle_fromlist)\n", - " 1462 0.003 0.000 0.009 0.000 {built-in method builtins.any}\n", - " 2 0.000 0.000 0.009 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:868(read_csv)\n", - " 5574 0.009 0.000 0.009 0.000 {method 'reshape' of 'numpy.ndarray' objects}\n", - " 97 0.000 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2632(check_bool_indexer)\n", - " 844 0.003 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:784(name)\n", - " 2 0.000 0.000 0.009 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:583(_read)\n", - " 1610 0.003 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:299(helper)\n", - " 787 0.004 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:390(_get_getitem_freq)\n", - " 376 0.001 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:261(_isna_array)\n", - " 338 0.004 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:168(validate_args_and_kwargs)\n", - " 12 0.000 0.000 0.008 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:694(__init__)\n", - " 3 0.000 0.000 0.008 0.003 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager.py:365(_schedule)\n", - " 2226 0.005 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2765(check_dict_or_set_indexers)\n", - " 1888 0.008 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:395(__init__)\n", - " 1044 0.003 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:137(is_object_dtype)\n", - " 874 0.008 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:280(_release_save)\n", - " 6 0.000 0.000 0.008 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:11661(sum)\n", - " 83/43 0.000 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:50(__le__)\n", - " 2202 0.008 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:440(_format)\n", - " 1568 0.004 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:2184()\n", - " 10 0.000 0.000 0.008 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6186(_get_indexer_strict)\n", - " 294 0.003 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/ipkernel.py:775(_clean_thread_parent_frames)\n", - " 1588 0.002 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:328(__init__)\n", - " 9624 0.008 0.000 0.008 0.000 {built-in method __new__ of type object at 0x10dfb6898}\n", - " 1847 0.002 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7593(ensure_index)\n", - " 6 0.000 0.000 0.008 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:11435(_reduce)\n", - " 2202 0.003 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:652(usesTime)\n", - " 2 0.000 0.000 0.008 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6828(duplicated)\n", - " 360 0.001 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:430(__enter__)\n", - " 718 0.005 0.000 0.008 0.000 :71(join)\n", - " 2202 0.006 0.000 0.008 0.000 :121(_splitext)\n", - " 2 0.000 0.000 0.008 0.004 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:43(schedule_kwargs)\n", - " 2 0.000 0.000 0.008 0.004 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager.py:266(schedule)\n", - " 340 0.001 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:193(get_nowait)\n", - " 40 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7164(_cmp_method)\n", - " 24336 0.007 0.000 0.007 0.000 {built-in method builtins.setattr}\n", - " 14 0.000 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1471(_format_strings)\n", - " 1 0.000 0.000 0.007 0.007 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:208()\n", - " 2660 0.007 0.000 0.007 0.000 {method 'view' of 'numpy.ndarray' objects}\n", - " 14 0.000 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1343(get_result_as_array)\n", - " 2 0.000 0.000 0.007 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1907(read)\n", - " 7575 0.007 0.000 0.007 0.000 {method 'format' of 'str' objects}\n", - " 364 0.004 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:154(get)\n", - "1921/1919 0.003 0.000 0.007 0.000 {built-in method builtins.all}\n", - " 386 0.002 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:157(take)\n", - " 13 0.000 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5095(insert)\n", - " 28 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3820(get_indexer)\n", - " 7542 0.007 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:831(_reset_identity)\n", - " 92 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:209()\n", - " 338 0.004 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:716(__abs__)\n", - " 3722 0.005 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2570(_validate_tz_from_dtype)\n", - " 3000 0.005 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:576(tz)\n", - " 9353 0.007 0.000 0.007 0.000 {built-in method numpy.datetime_data}\n", - " 525 0.001 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:659(_constructor_from_mgr)\n", - " 1818 0.002 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:319(asi8)\n", - " 5 0.000 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:423(dict_to_mgr)\n", - " 1876 0.005 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:380(validate)\n", - " 3 0.000 0.000 0.006 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager.py:323(is_already_scheduled)\n", - " 6606 0.005 0.000 0.006 0.000 :52(normcase)\n", - " 1700 0.002 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:831(_values)\n", - " 421/417 0.002 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:1131(take)\n", - " 1629 0.004 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:243(__init__)\n", - " 760 0.003 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:182(_add_filter)\n", - " 83/43 0.001 0.000 0.006 0.000 {built-in method _operator.le}\n", - " 1 0.000 0.000 0.006 0.006 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:601(calculate_quantity)\n", - " 66 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1782(_consolidate_inplace)\n", - " 853 0.002 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1571(validate_all_hashable)\n", - " 519 0.003 0.000 0.006 0.000 {method '__reduce_ex__' of 'object' objects}\n", - " 14 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1397(format_values_with)\n", - " 18 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6133(_arith_method)\n", - " 1652 0.002 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:650(_sql_retry)\n", - " 5 0.000 0.000 0.006 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6997(sort_values)\n", - " 499 0.004 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5323(__contains__)\n", - " 16 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6162(get_indexer_for)\n", - " 1936 0.003 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:401(attrs)\n", - " 61 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1756(_get_slice_axis)\n", - " 40 0.001 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:977(_cmp_method)\n", - " 393 0.002 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:131(filterwarnings)\n", - " 9818 0.006 0.000 0.006 0.000 {built-in method time.time}\n", - " 4604 0.006 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/flags.py:51(__init__)\n", - " 1610 0.005 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:104(__init__)\n", - " 4404 0.004 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:929(release)\n", - " 792 0.004 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:180(blknos)\n", - " 3 0.000 0.000 0.006 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/Requests.py:40(construct_request_name)\n", - " 1326 0.004 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:734(name)\n", - " 340 0.001 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:414(_split_op_result)\n", - " 800 0.002 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:236(set_axis)\n", - " 1588 0.003 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:364(cancel)\n", - " 4 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:157(concat)\n", - " 4799 0.004 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:123()\n", - " 4458 0.005 0.000 0.005 0.000 {built-in method _locale.setlocale}\n", - " 320 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1928()\n", - " 2202 0.004 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/handlers.py:354(shouldRollover)\n", - " 61 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4361(_slice)\n", - " 4799 0.005 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:121(classes)\n", - " 348 0.002 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:274(make_block)\n", - " 2 0.000 0.000 0.005 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:750(merge_environment_settings)\n", - " 20 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:42(__ne__)\n", - " 3334 0.003 0.000 0.005 0.000 :41(_get_sep)\n", - " 743 0.002 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:769(_assert_tzawareness_compat)\n", - " 2625 0.004 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:488(__exit__)\n", - " 2 0.000 0.000 0.005 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:826(get_environ_proxies)\n", - " 2202 0.003 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:432(usesTime)\n", - " 16 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:708(_slice_take_blocks_ax0)\n", - " 676 0.005 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:211(_simple_new)\n", - " 2202 0.003 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:164()\n", - " 4 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:622(get_result)\n", - " 32 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:610(factorize)\n", - " 40 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:309(get_option_specifics_from_key)\n", - " 367 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:166(simplefilter)\n", - " 513 0.002 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:773(_view)\n", - " 160 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1914(unpickle_block)\n", - " 3802 0.003 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:203(isword)\n", - " 371 0.005 0.000 0.005 0.000 {method 'argsort' of 'numpy.ndarray' objects}\n", - " 11875 0.005 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:551(dtype)\n", - " 2134 0.004 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:243(_keep_alive)\n", - " 356 0.004 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2353(copy)\n", - " 30 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1689(_getitem_tuple)\n", - " 3740 0.004 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:139(put)\n", - " 1076 0.003 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:635(_get_root)\n", - " 13866 0.004 0.000 0.004 0.000 {built-in method posix.getpid}\n", - " 14 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1805(_trim_zeros_float)\n", - " 360 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:435(__exit__)\n", - " 2625 0.004 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:441(__init__)\n", - " 12638 0.004 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:266(mgr_locs)\n", - " 1966 0.002 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/extension.py:67(fget)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:574(update_greek_limits)\n", - " 28 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6925(f)\n", - " 1568 0.004 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2787(__reduce__)\n", - " 7016 0.004 0.000 0.004 0.000 {method 'rfind' of 'str' objects}\n", - " 18120 0.004 0.000 0.004 0.000 {method 'read' of '_io.StringIO' objects}\n", - " 342 0.004 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1392(np_find_common_type)\n", - " 410 0.003 0.000 0.004 0.000 :100(split)\n", - " 1700 0.003 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2004(internal_values)\n", - " 22907 0.004 0.000 0.004 0.000 {method 'isdigit' of 'str' objects}\n", - " 12 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2259(_consolidate)\n", - " 2202 0.003 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:123(getLevelName)\n", - " 4 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5993(set_index)\n", - " 12 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1322(__contains__)\n", - " 800 0.002 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:86(_validate_set_axis)\n", - " 32 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:548(factorize_array)\n", - " 74 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:286(filename)\n", - " 12 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2982(get_loc)\n", - " 2266 0.003 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1453(current_thread)\n", - " 62 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3122(duplicated)\n", - " 62 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1726(_make_fixed_width)\n", - " 2 0.000 0.000 0.004 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1397(_getitem_axis)\n", - " 12 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:3308(_get_level_indexer)\n", - " 2 0.000 0.000 0.004 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:78(method)\n", - " 2 0.000 0.000 0.004 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:736(map)\n", - " 2 0.000 0.000 0.004 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1205(_getbool_axis)\n", - " 403 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/common.py:81(get_op_result_name)\n", - " 1568 0.002 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/flags.py:100(__getitem__)\n", - " 147 0.002 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/ipkernel.py:790()\n", - " 338 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:141(validate_kwargs)\n", - " 4404 0.004 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:815(filter)\n", - " 4 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2499(getproxies_environment)\n", - " 1376 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:577(_schedule_flush)\n", - " 3722 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1194()\n", - " 338 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4201(_convert_slice_indexer)\n", - " 1861 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2310(_construct_from_dt64_naive)\n", - " 821 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:568(require_length_match)\n", - " 167 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/event.py:30(__str__)\n", - " 720 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:132(geterr)\n", - " 40 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6519(sum)\n", - " 340 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copyreg.py:113(_slotnames)\n", - " 12 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2957(_get_loc_single_level_index)\n", - " 1253 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:264()\n", - " 4 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5636(rename)\n", - " 12 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:38(__eq__)\n", - " 309 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5170(_get_engine_target)\n", - " 135 0.000 0.000 0.003 0.000 :16(exists)\n", - " 49 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5368(insert)\n", - " 13517 0.003 0.000 0.003 0.000 {method 'append' of 'list' objects}\n", - " 4 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1070(_rename)\n", - " 1373 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:586(_get_axis)\n", - " 756 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:108(asi8)\n", - " 325 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:571(_disallow_mismatched_indexing)\n", - " 110 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1157(maybe_infer_to_datetimelike)\n", - " 2243 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2148(_creso)\n", - " 38 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:262(_get_hashtable_algo)\n", - " 4421 0.003 0.000 0.003 0.000 {method 'acquire' of '_thread.RLock' objects}\n", - " 676 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/base.py:2277()\n", - " 5728 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:1257(value)\n", - " 30 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1032(_getitem_lowerdim)\n", - " 2291 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/flags.py:87(allows_duplicate_labels)\n", - " 353 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:978(__array__)\n", - " 276 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:273(__call__)\n", - " 1568 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:406(__reduce__)\n", - " 688 0.001 0.000 0.003 0.000 :859(__iter__)\n", - " 2292 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:372(apply_if_callable)\n", - " 47 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6418(_reduce)\n", - " 12142 0.003 0.000 0.003 0.000 {built-in method posix.fspath}\n", - " 411 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1006(_find_hms_idx)\n", - " 12 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:558(_parse_with_reso)\n", - " 6 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:3951(T)\n", - " 740 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1816(is_number_with_decimal)\n", - " 394 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:728(is_valid_na_for_dtype)\n", - " 3715 0.003 0.000 0.003 0.000 {method 'find' of 'str' objects}\n", - " 6 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:3767(transpose)\n", - " 1863 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:103(tz_to_dtype)\n", - " 12 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:275(_parse_with_reso)\n", - " 8 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:208(__truediv__)\n", - " 1037 0.003 0.000 0.003 0.000 {method 'copy' of 'numpy.ndarray' objects}\n", - " 3872 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:24(_kind_name)\n", - " 2418 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/__init__.py:34(using_copy_on_write)\n", - " 797 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:707(dtype)\n", - " 2924 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:152(cast_scalar_indexer)\n", - " 2206 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1734(isEnabledFor)\n", - " 135 0.003 0.000 0.003 0.000 {built-in method posix.stat}\n", - " 46 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:76(_f)\n", - " 1876 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:482()\n", - " 7390 0.003 0.000 0.003 0.000 {built-in method builtins.hash}\n", - " 19 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:259(schedule)\n", - " 2577 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:529(is_string_or_object_np_dtype)\n", - " 4070 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1253(iget)\n", - " 10 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4323(reindex)\n", - " 1680 0.003 0.000 0.003 0.000 {built-in method numpy.empty}\n", - " 10 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1197(_format_strings)\n", - " 6 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1483(reduce)\n", - " 62 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:2360(__len__)\n", - " 11 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6432(dtypes)\n", - " 2374 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:735(_sanitize_str_dtypes)\n", - " 404 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1667(_validate_integer)\n", - " 49 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5242(_sanitize_column)\n", - " 2 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:765(should_bypass_proxies)\n", - " 6444 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1249(shape)\n", - " 1080 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:676(_translate_key)\n", - " 64 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:2296(__iter__)\n", - " 4732 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:176(dtype)\n", - " 971 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:292(make_block_same_class)\n", - " 2202 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:368(getMessage)\n", - " 760 0.003 0.000 0.003 0.000 {method 'remove' of 'list' objects}\n", - " 2 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2672(proxy_bypass)\n", - " 54 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:586()\n", - " 6 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:96(arrays_to_mgr)\n", - " 28 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6679(_maybe_cast_listlike_indexer)\n", - " 407 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:745(_get_engine_target)\n", - " 19 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/zmq/sugar/socket.py:621(send)\n", - " 30 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6957()\n", - " 26 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:1255(__contains__)\n", - " 341 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1881(nonzero)\n", - " 4 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:94(concatenate_managers)\n", - " 4914 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:758(_maybe_repeat)\n", - " 108 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:583(copy_func)\n", - " 800 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4379(_set_is_copy)\n", - " 320 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1471(_set_as_cached)\n", - " 463 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:948(from_blocks)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5433(drop)\n", - " 7 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:607(_init_dict)\n", - " 9537 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:2287(cast)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4757(drop)\n", - " 38 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:288(comparison_op)\n", - " 37 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1819(should_trim)\n", - " 38 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:106(_ensure_data)\n", - " 7730 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:405(flags)\n", - " 1714 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1590()\n", - " 6090 0.002 0.000 0.002 0.000 {built-in method _thread.get_ident}\n", - " 360 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:507(maybe_prepare_scalar_for_op)\n", - " 403 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/dispatch.py:17(should_extension_dispatch)\n", - " 352 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:201(_deepcopy_list)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:194(setdefault)\n", - " 1376 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:550(_is_master_process)\n", - " 33 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1496(items)\n", - " 797 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1993(dtype)\n", - " 343 0.002 0.000 0.002 0.000 {built-in method numpy.arange}\n", - " 2124 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1837(__init__)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4796(_drop_axis)\n", - " 209 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:274(full)\n", - " 4312 0.002 0.000 0.002 0.000 {method 'items' of 'dict' objects}\n", - " 322 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:361()\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2685(getproxies)\n", - " 48 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:389(new_func)\n", - " 11107 0.002 0.000 0.002 0.000 {built-in method builtins.id}\n", - " 742 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:62(is_list_like_indexer)\n", - " 4 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4477(__delitem__)\n", - " 36 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2276(_merge_blocks)\n", - " 2266 0.002 0.000 0.002 0.000 {method 'astype' of 'numpy.ndarray' objects}\n", - " 522 0.002 0.000 0.002 0.000 {method '__deepcopy__' of 'numpy.generic' objects}\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:1050(is_busday)\n", - " 6498 0.002 0.000 0.002 0.000 {method 'lower' of 'str' objects}\n", - " 1861 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2063(_maybe_pin_freq)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:1022(bdate_range)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:821(date_range)\n", - " 12 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:325(__new__)\n", - " 28 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6394(_should_compare)\n", - " 442 0.002 0.000 0.002 0.000 {method 'take' of 'numpy.ndarray' objects}\n", - " 407 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:74(__len__)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:301(lexsort_indexer)\n", - " 578 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2795(extend_blocks)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:776(_get_formatted_column_labels)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:397(_generate_range)\n", - " 6 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:947(json)\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1434(idelete)\n", - " 49 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1412(_insert_update_blklocs_and_blknos)\n", - " 3176 0.002 0.000 0.002 0.000 {method '__enter__' of '_thread.RLock' objects}\n", - " 37 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1827()\n", - " 160 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/actions.py:12(__init__)\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2354(objects_to_datetime64)\n", - " 340 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:984()\n", - " 2202 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1152(name)\n", - " 344 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1850(from_blocks)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:454(calculate_position_greeks)\n", - " 2 0.001 0.001 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:222(read)\n", - " 692 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:332(array)\n", - " 693 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1040(needs_i8_conversion)\n", - " 1376 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:505(parent_header)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:457(prepare_request)\n", - " 46 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:455(newfunc)\n", - " 2560 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1168(ident)\n", - " 654 0.001 0.000 0.002 0.000 :674(__getitem__)\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:699(new_axes)\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:371(__init__)\n", - " 1013 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:325(_get_take_nd_function)\n", - " 6 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/simplejson/__init__.py:459(loads)\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:702()\n", - " 6 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/simplejson/decoder.py:379(decode)\n", - " 65 0.000 0.000 0.002 0.000 {built-in method builtins.sorted}\n", - " 22 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1247(series_generator)\n", - " 46 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:604(nansum)\n", - " 5971 0.002 0.000 0.002 0.000 {method '__exit__' of '_thread.lock' objects}\n", - " 4345 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1671(name)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/string.py:119(_join_multiline)\n", - " 338 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1066(_get_arithmetic_result_freq)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1575(__init__)\n", - " 49 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1393(moveaxis)\n", - " 6 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/simplejson/decoder.py:392(raw_decode)\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1425(_format_flat)\n", - " 2202 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/multiprocessing/process.py:37(current_process)\n", - " 49 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1402(_insert_update_mgr_locs)\n", - " 168 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2264()\n", - " 4739 0.002 0.000 0.002 0.000 {method '__exit__' of '_thread.RLock' objects}\n", - " 2276 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:572(_get_axis_number)\n", - " 1600 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:90(RLock)\n", - " 3871 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/flags.py:55(allows_duplicate_labels)\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1448(_format_with_header)\n", - " 3859 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:363(attrs)\n", - " 58 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:189(_na_arithmetic_op)\n", - " 66 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1764(is_consolidated)\n", - " 147 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1501(enumerate)\n", - " 445 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:336(hms)\n", - " 77 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2703(new_block_2d)\n", - " 338 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:338(astype)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2121(create_block_manager_from_column_arrays)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/execution.py:86(execute_order_randomized_slippage)\n", - " 467 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:592(_get_block_manager_axis)\n", - " 1080 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:617(_select_options)\n", - " 40 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:524(_validate_comparison_value)\n", - " 2202 0.001 0.000 0.001 0.000 {method 'write' of '_io.TextIOWrapper' objects}\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaExceptions.py:64(raise_thetadata_exception)\n", - " 1008 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:974(dtype)\n", - " 26 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:124(maybe_convert_platform)\n", - " 2202 0.001 0.000 0.001 0.000 {built-in method sys._getframe}\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:200(__mul__)\n", - " 14 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1349(format_with_na_rep)\n", - " 98 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5562(append)\n", - " 66 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1772(_consolidate_check)\n", - " 301 0.000 0.000 0.001 0.000 {built-in method builtins.max}\n", - " 84 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:225(_consolidate_key)\n", - " 6010 0.001 0.000 0.001 0.000 {built-in method _warnings._filters_mutated}\n", - " 2424 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:366(pm)\n", - " 2657 0.001 0.000 0.001 0.000 {method 'pop' of 'list' objects}\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1848(_make_engine)\n", - " 200 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:790(copy)\n", - " 1095 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:286(_is_owned)\n", - " 3802 0.001 0.000 0.001 0.000 {method 'isalpha' of 'str' objects}\n", - " 615 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:195(is_array_like)\n", - " 4421 0.001 0.000 0.001 0.000 {method 'release' of '_thread.RLock' objects}\n", - " 108 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1220(_format)\n", - " 1939 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1940(_block)\n", - " 2958 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2043(freq)\n", - " 32 0.001 0.000 0.001 0.000 {built-in method _thread.start_new_thread}\n", - " 289 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:253(fill_value)\n", - " 1589 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/__init__.py:145(_DType_reduce)\n", - " 865 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:667(_info_axis)\n", - " 698 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:291(arrays)\n", - " 2252 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:246(items)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:717(_get_concat_axis)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:68(__and__)\n", - " 1360 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:649(_get_deprecated_option)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:209(_maybe_cache)\n", - " 720 0.001 0.000 0.001 0.000 {built-in method numpy.seterrobj}\n", - " 3248 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5144(_values)\n", - " 1868 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:360(convertyear)\n", - " 2202 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/multiprocessing/process.py:189(name)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6123(_logical_method)\n", - " 378 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:2378(array_equal)\n", - " 369 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/base.py:549(find)\n", - " 95 0.000 0.000 0.001 0.000 {method 'all' of 'numpy.ndarray' objects}\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:777(_concat_indexes)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:231(parse_headers)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5455(append)\n", - " 104 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1010(view)\n", - " 686 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:214(is_extension)\n", - " 338 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:49(_check_for_default_values)\n", - " 60 0.000 0.000 0.001 0.000 {method 'sum' of 'numpy.ndarray' objects}\n", - " 684 0.001 0.000 0.001 0.000 {method 'groupdict' of 're.Match' objects}\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/helpers.py:8(parse_signal_id)\n", - " 439 0.001 0.000 0.001 0.000 {method 'nonzero' of 'numpy.ndarray' objects}\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1316(view)\n", - " 30 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:957(_validate_tuple_indexer)\n", - " 1034 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1463()\n", - " 745 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1165(_check_deprecated_callable_usage)\n", - " 519 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:791(is_)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1248(copy)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2235(take)\n", - " 2736 0.001 0.000 0.001 0.000 {method 'group' of 're.Match' objects}\n", - " 23 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1831()\n", - " 1115 0.001 0.000 0.001 0.000 {method 'split' of 'str' objects}\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5491(_concat)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:351(prepare)\n", - " 42 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2744(inferred_type)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:398(reduce)\n", - " 7 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1870(_get_label_or_level_values)\n", - " 169 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:797()\n", - " 773 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:161(iloc)\n", - " 2235 0.001 0.000 0.001 0.000 {method 'pop' of 'dict' objects}\n", - " 2268 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/printing.py:510(len)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/parser.py:59(parsestr)\n", - " 4665 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:182(_deepcopy_atomic)\n", - " 1868 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:402(has_year)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/eventScheduler.py:110(put)\n", - " 3589 0.001 0.000 0.001 0.000 {built-in method builtins.callable}\n", - " 81 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5552(equals)\n", - " 26 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3955(_get_indexer)\n", - " 415 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:329(month)\n", - " 2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:60(__init__)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/parser.py:41(parse)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:596(_homogenize)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1102(wrap_results)\n", - " 32 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/ipkernel.py:768(init_closure)\n", - " 60 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:47(_sum)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:957(getaddrinfo)\n", - " 1532 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:718(dtype)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:739(one_off_save)\n", - " 58 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/computation/expressions.py:226(evaluate)\n", - " 338 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:128(_check_for_invalid_keys)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:817(_get_formatted_index)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/decorators.py:25(wrapper)\n", - " 58 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1755()\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1359(bulk_one_off_save)\n", - " 221 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:366(notify)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:5773(isna)\n", - " 95 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:61(_all)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager_processes.py:347(schedule)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:8693(isna)\n", - " 283 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:456(_engine_type)\n", - " 12 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:903(_set_levels)\n", - " 140 0.000 0.000 0.001 0.000 {method 'max' of 'numpy.ndarray' objects}\n", - " 2 0.001 0.000 0.001 0.000 {built-in method _socket.getaddrinfo}\n", - " 14 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1352()\n", - " 160 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1926()\n", - " 8 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/printing.py:524(adjoin)\n", - " 40 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:534(_scalar_from_string)\n", - " 70 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1081(is_numeric_dtype)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6520(_transform_index)\n", - " 172 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:830(__len__)\n", - " 1588 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:398(__get_result)\n", - " 8 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/printing.py:31(adjoin)\n", - " 60 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1778()\n", - " 110 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/printing.py:165(pprint_thing)\n", - " 32 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:856(__init__)\n", - " 906 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:213(isspace)\n", - " 38 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:280(_check_object_for_strings)\n", - " 58 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/computation/expressions.py:67(_evaluate_standard)\n", - " 30 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/printing.py:567(get_adjustment)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:240(__pow__)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:674(astype)\n", - " 524 0.001 0.000 0.001 0.000 {method 'index' of 'list' objects}\n", - " 14 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1834()\n", - " 338 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1047(_get_i8_values_and_mask)\n", - " 98 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1330(normalize_axis_tuple)\n", - " 60 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1574(_validate_key)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:446(get_connection_with_tls_context)\n", - " 1440 0.001 0.000 0.001 0.000 {built-in method numpy.geterrobj}\n", - " 338 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2180(_ensure_matching_resos)\n", - " 161 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:691()\n", - " 640 0.000 0.000 0.001 0.000 :697(__iter__)\n", - " 140 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:39(_amax)\n", - " 1952 0.001 0.000 0.001 0.000 {method 'is_finite' of 'decimal.Decimal' objects}\n", - " 1272 0.000 0.000 0.001 0.000 :760(decode)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:2344(unique)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2658(proxy_bypass_macosx_sysconf)\n", - " 140 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1305(base_formatter)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:2063(to_dict)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:1019(unique)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/methods/to_dict.py:78(to_dict)\n", - " 74 0.000 0.000 0.001 0.000 {built-in method _codecs.encode}\n", - " 128 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/printing.py:513(justify)\n", - " 150 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:380(notna)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:11458(blk_func)\n", - " 74 0.001 0.000 0.001 0.000 {built-in method posix.urandom}\n", - " 338 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:29(_check_arg_length)\n", - " 7 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4159(xs)\n", - " 654 0.000 0.000 0.001 0.000 :756(encode)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:307(unique)\n", - " 40 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:718(_unbox)\n", - " 58 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:764(_get_formatter)\n", - " 1588 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:47(__init__)\n", - " 17 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:287(get_dtypes)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/string.py:128()\n", - " 21 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1519(construct_1d_arraylike_from_scalar)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:427(unique_with_mask)\n", - " 582 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1749(just)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:176(_call_parse)\n", - " 415 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:319(jump)\n", - " 46 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:525(_unbox_scalar)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7031(drop)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:98(__add__)\n", - " 338 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:38(is_valid_positional_slice)\n", - " 960 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:162(roll_map)\n", - " 766 0.001 0.000 0.001 0.000 {method 'startswith' of 'str' objects}\n", - " 28 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6415(_is_comparable_dtype)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:216(_parsegen)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:171(feed)\n", - " 1960 0.001 0.000 0.001 0.000 {method 'keys' of 'dict' objects}\n", - " 1568 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:2178()\n", - " 340 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:209(_qsize)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1559(itertuples)\n", - " 296 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:673(na_value_for_dtype)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:7172()\n", - " 874 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:283(_acquire_restore)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:860(values)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:276(connection_from_host)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:12590(values)\n", - " 640 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1740()\n", - " 342 0.001 0.000 0.001 0.000 {built-in method fromkeys}\n", - " 49 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2311(_fast_count_smallints)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1633(as_array)\n", - " 48 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:924()\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:355(_concatenate_chunks)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1784(get_level_values)\n", - " 169 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:801()\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:305(connection_from_context)\n", - " 338 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:957(get_option_data)\n", - " 16 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:220(__init__)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:296(_get_combined_plan)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1707(_interleave)\n", - " 11 0.000 0.000 0.001 0.000 {method 'extend' of 'list' objects}\n", - " 1380 0.001 0.000 0.001 0.000 {method 'write' of '_io.StringIO' objects}\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:259(_box_as_indexlike)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2190(_form_blocks)\n", - " 8 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:572(_is_uniform_join_units)\n", - " 16 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:373(_finalize)\n", - " 46 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4402(_check_setitem_copy)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1630()\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:196(__rsub__)\n", - " 688 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1472()\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:447(astype)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1758(_get_level_values)\n", - " 395 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1392()\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:320(__new__)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7553(ensure_index_from_sequences)\n", - " 12 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1085(_set_codes)\n", - " 35 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:782(_rename)\n", - " 2 0.001 0.000 0.001 0.000 {built-in method _scproxy._get_proxy_settings}\n", - " 38 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/concat.py:52(concat_compat)\n", - " 8 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:550(validate_categories)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:419(_close_conn)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:707(_get_comb_axis)\n", - " 2 0.000 0.000 0.001 0.000 {method 'close' of '_io.BufferedReader' objects}\n", - " 1109 0.001 0.000 0.001 0.000 {method 'endswith' of 'str' objects}\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:330(connection_from_pool_key)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:409(prepare_url)\n", - " 59 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:273(is_dict_like)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:72(get_objs_combined_axis)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:781(close)\n", - " 86 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:537(_check_compatible_with)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:58(__ge__)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:2082(empty)\n", - " 64 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6312(_index_as_unique)\n", - " 1888 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:186(__iter__)\n", - " 209 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/frozen.py:76(__getitem__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/weakref.py:585(__call__)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:844(levels)\n", - " 1034 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1479()\n", - " 190 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:79()\n", - " 1368 0.000 0.000 0.000 0.000 {method 'toordinal' of 'datetime.date' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:122(get_group_index)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:237(ndarray_to_mgr)\n", - " 280 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:688(_warn_if_deprecated)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:120(_get_combined_index)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:489(_decref_socketios)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6463(astype)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:499(close)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:229(_new_pool)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:1174(_close_pool_connections)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2662(getproxies_macosx_sysconf)\n", - " 360 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:426(__init__)\n", - " 874 0.000 0.000 0.000 0.000 {method 'values' of 'dict' objects}\n", - " 2 0.000 0.000 0.000 0.000 {built-in method _scproxy._get_proxies}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:495(_real_close)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6219(_raise_if_missing)\n", - " 787 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:196(blklocs)\n", - " 2 0.000 0.000 0.000 0.000 {function socket.close at 0x10ebfe0c0}\n", - " 915 0.000 0.000 0.000 0.000 {built-in method _thread.allocate_lock}\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:897()\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1697(_validate_names)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:219(vstack)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:177(__init__)\n", - " 67 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:914(__len__)\n", - " 98 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1768(ravel)\n", - " 698 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:303()\n", - " 49 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2811(ensure_block_shape)\n", - " 87 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1643(__len__)\n", - " 1591 0.000 0.000 0.000 0.000 {method 'put' of '_queue.SimpleQueue' objects}\n", - " 48 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1102()\n", - " 261 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:219(_can_consolidate)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6324(_maybe_downcast_for_indexing)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4883(_update_inplace)\n", - " 74 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/encodings/hex_codec.py:13(hex_encode)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:5136(reindex)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:359(build_response)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:187(validate_indices)\n", - " 817 0.000 0.000 0.000 0.000 {method 'insert' of 'list' objects}\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:597()\n", - " 179 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copyreg.py:104(__newobj__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5343(reindex)\n", - " 171 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/eventScheduler.py:68(get_current_queue)\n", - " 1376 0.000 0.000 0.000 0.000 {method 'get' of '_contextvars.ContextVar' objects}\n", - " 407 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:265(_engine_type)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:405(__init__)\n", - " 37 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:836(__iter__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:204(get_netrc_auth)\n", - " 1685 0.000 0.000 0.000 0.000 {built-in method time.monotonic}\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1580(construct_1d_object_array_from_listlike)\n", - " 102 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:2140()\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1250(copy)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/string.py:129()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:421(astype)\n", - " 84 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/printing.py:522()\n", - " 160 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:915()\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:12675(_reindex_for_setitem)\n", - " 70 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:184(_reconstruct_data)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:389(is_na)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1051(_stop)\n", - " 110 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/printing.py:196(as_escaped_string)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:122(put)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:369(parse_url)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:562(__init__)\n", - " 1412 0.000 0.000 0.000 0.000 {method 'decode' of 'bytes' objects}\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:592(get_content_type)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:61(merge_setting)\n", - " 523 0.000 0.000 0.000 0.000 {method 'update' of 'dict' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:636()\n", - " 328 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:999(__len__)\n", - " 86 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2776(_is_multi)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/printing.py:507(__init__)\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:305(_isna_string_dtype)\n", - " 684 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1474()\n", - " 400 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3809()\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:71(_wrapreduction)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:664(get_handle)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:723(astype)\n", - " 160 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/actions.py:6(__init__)\n", - " 160 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/actions.py:17(__repr__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/printing.py:51()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:390(__init__)\n", - " 49 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4585(_ensure_valid_index)\n", - " 308 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:745()\n", - " 414 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:660(_constructor)\n", - " 59 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2794(_na_value)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:40(__init__)\n", - " 83 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4623(_clear_item_cache)\n", - " 36 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:4120(_coerce_indexer_frozen)\n", - " 341 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/__init__.py:42(warn_copy_on_write)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1532(__neg__)\n", - " 20 0.000 0.000 0.000 0.000 {built-in method _operator.ne}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:351(get_dataframe_repr_params)\n", - " 337 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6055(_check_indexing_error)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:506(nested_data_to_arrays)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:182(close)\n", - " 21 0.000 0.000 0.000 0.000 {method 'min' of 'numpy.ndarray' objects}\n", - " 173 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:217(_get)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:242(__init__)\n", - " 61 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4191(_validate_positional_slice)\n", - " 165 0.000 0.000 0.000 0.000 {built-in method builtins.min}\n", - " 892 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:363(ndim)\n", - " 30 0.000 0.000 0.000 0.000 :771(get)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:322(_get_block_for_concat_plan)\n", - " 1073 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6672(_maybe_cast_indexer)\n", - " 48 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:253(_get_values)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2320(_preprocess_slice_or_indexer)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:483(prepare_headers)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1574(_set_names)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:810()\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:374(urlparse)\n", - " 452 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:696(ndim)\n", - " 44 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/printing.py:518()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2244(get_values)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/astype.py:191(astype_array_safe)\n", - " 252 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:446(__exit__)\n", - " 1084 0.000 0.000 0.000 0.000 {method 'append' of 'collections.deque' objects}\n", - " 31 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:789(values)\n", - " 49 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5295(_validate_fill_value)\n", - " 430 0.000 0.000 0.000 0.000 {method 'rstrip' of 'str' objects}\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6459(any)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:124(extract_cookies_to_jar)\n", - " 99 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:126(_classes_and_not_datetimelike)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1652(_is_scalar_access)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:165(maybe_lift)\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:43(_amin)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2421(all)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:337(extend)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:393(logical_op)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:149(should_cache)\n", - " 408 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1176(_maybe_disallow_fill)\n", - " 16 0.000 0.000 0.000 0.000 :941(update)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:793(to_arrays)\n", - " 117 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:373(is_sequence)\n", - " 340 0.000 0.000 0.000 0.000 {method 'get' of 'mappingproxy' objects}\n", - " 144 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:72(check)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:217(_ensure_arraylike)\n", - " 68 0.000 0.000 0.000 0.000 {built-in method numpy.zeros}\n", - " 734/732 0.000 0.000 0.000 0.000 {method 'encode' of 'str' objects}\n", - " 29 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:633(is_integer_dtype)\n", - " 46 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:350(getitem_block_columns)\n", - " 906 0.000 0.000 0.000 0.000 {method 'isspace' of 'str' objects}\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:490(get)\n", - " 31 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2000(external_values)\n", - " 341 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1877(_nonzero_dispatcher)\n", - " 252 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:440(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1500(_format_strings)\n", - " 787 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1480(_clear_item_cache)\n", - " 716 0.000 0.000 0.000 0.000 {method 'end' of 're.Match' objects}\n", - " 906 0.000 0.000 0.000 0.000 {method 'release' of '_thread.lock' objects}\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:351(putheader)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6499(min)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:1452(safe_sort)\n", - " 182 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:683(__normalize_dollar_amount)\n", - " 48 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:1499(_maybe_null_out)\n", - " 4 0.000 0.000 0.000 0.000 :229(expanduser)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:560(_validate_scalar)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12381(min)\n", - " 282 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1828()\n", - " 183 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:300()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:744(_format_native_types)\n", - " 529 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:153(concatenate)\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:386(default_index)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:227(_encode_invalid_chars)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12362(_stat_function)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:974(_is_nested_tuple_indexer)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:466(array_equivalent)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/methods/to_dict.py:171()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1476(_format_strings)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:153(_set_option)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:113(comp_method_OBJECT_ARRAY)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:54(__gt__)\n", - " 58 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/missing.py:131(dispatch_fill_zeros)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:2077(__contains__)\n", - " 98 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1380()\n", - " 46 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:122(_reset_cache)\n", - " 119 0.000 0.000 0.000 0.000 {method 'clear' of 'dict' objects}\n", - " 841 0.000 0.000 0.000 0.000 {method 'remove' of 'collections.deque' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5598()\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:829(_maintain_shutdown_locks)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:962(parse_position_id)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4436(_wrap_reindex_result)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1771(_is_label_reference)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:255(get)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:616(get_content_maintype)\n", - " 338 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1989(index)\n", - " 401 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:344()\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:735(_error_catcher)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:425(__init__)\n", - " 168 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/__init__.py:55(using_pyarrow_string_dtype)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1482()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:928(_finalize_columns_and_data)\n", - " 356 0.000 0.000 0.000 0.000 {method 'copy' of 'dict' objects}\n", - " 338 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:191(_values_for_argsort)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1192(is_alive)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7664(trim_front)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2567(_proxy_bypass_macosx_sysconf)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:407(__rsub__)\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1342(is_complex_dtype)\n", - " 686 0.000 0.000 0.000 0.000 {method 'weekday' of 'datetime.date' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:573(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:966()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/astype.py:157(astype_array)\n", - " 4 0.000 0.000 0.000 0.000 {method 'sendall' of '_socket.socket' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:794(_set_axis_nocheck)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2285()\n", - " 167 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/event.py:23(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:223(unique)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:123(__init__)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:81(atleast_2d)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:838(select_proxy)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:446(_init_decoder)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5651(identical)\n", - " 74 0.000 0.000 0.000 0.000 {built-in method binascii.b2a_hex}\n", - " 266 0.000 0.000 0.000 0.000 {built-in method numpy.asanyarray}\n", - " 40 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:973(coerce_indexer_dtype)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:992(is_numeric_v_string_like)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:345(to_key_val_list)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:115(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:111(f)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/astype.py:56(_astype_nansafe)\n", - " 360 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1021(_argsort_dispatcher)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:353(wrapper)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:838(_cleanup)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:854(_row_insert)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:255(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:469(_parse_headers)\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/common.py:103(_maybe_match_name)\n", - " 378 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:2374(_array_equal_dispatcher)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:482(nanany)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:485(__exit__)\n", - " 48 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/numpy/function.py:413(validate_func)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:304(_get_filepath_or_buffer)\n", - " 99 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:131()\n", - " 146/52 0.000 0.000 0.000 0.000 {method 'join' of 'str' objects}\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2065(set_values)\n", - " 90 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1181()\n", - " 31 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:249(external_values)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2246(_stack_arrays)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_asarray.py:27(require)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:201(_simple_new)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:479(__enter__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:202(__init__)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1259(putheader)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:258(_get_conn)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:775(infer_dtype_from_scalar)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:836()\n", - " 46 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1056(_could_be_tzname)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:3995(_maybe_update_cacher)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:521(cookiejar_from_dict)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:35(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:1083(reduction)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:564(_array_equivalent_object)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:3689(equals)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:610(prepare_cookies)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/console.py:9(get_console_size)\n", - " 154 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1449()\n", - " 34 0.000 0.000 0.000 0.000 {method '_checkReadable' of '_io._IOBase' objects}\n", - " 46 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:324(_get_dtype_max)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3996(_check_indexing_method)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/_policybase.py:319(header_fetch_parse)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1798()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/event.py:108(__str__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2399(_is_dates_only)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:404(__radd__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1680(extract_cookies)\n", - " 60 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1480()\n", - " 183 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6685(_validate_indexer)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:140(get_cookie_header)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/event.py:162(__str__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:1006(convert_object_array)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/eventScheduler.py:20(put)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:909(text)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:317(__add__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:331(putrequest)\n", - " 60 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1262(_slice)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:586(update_dtype)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:545(_get_sample_object)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:658(__init__)\n", - " 616 0.000 0.000 0.000 0.000 {method 'rjust' of 'str' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:202(union_indexes)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:1070()\n", - " 60 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2738(is_label_like)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:164(hostname)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:935(_expand_ellipsis)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2979(prod)\n", - " 10 0.000 0.000 0.000 0.000 {built-in method _operator.eq}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:303(makefile)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:1028(convert)\n", - " 112 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1270(is_1d_only_ea_dtype)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6137(_align_for_op)\n", - " 31 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2827(external_values)\n", - " 8 0.000 0.000 0.000 0.000 {built-in method _operator.truediv}\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4440(_maybe_preserve_names)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:487()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:454(__exit__)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:302(add)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1103(putrequest)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:137(__new__)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/_policybase.py:289(_sanitize_header)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1047(shape)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:238(_new_conn)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:119(_coerce_args)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6916(delete)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7723(_unpack_nested_dtype)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:794(close)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1627(_get_options_with_defaults)\n", - " 189 0.000 0.000 0.000 0.000 {built-in method builtins.abs}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:546(request_url)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:203()\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:324(slice_block_columns)\n", - " 78 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:226(validate_bool_kwarg)\n", - " 128 0.000 0.000 0.000 0.000 {method 'ravel' of 'numpy.ndarray' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:635(release_conn)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:492(to_numpy)\n", - " 342 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:669(result_type)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:567()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2095(create_block_manager_from_blocks)\n", - " 340 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1828(ndim)\n", - " 90 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2772()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6537()\n", - " 12 0.000 0.000 0.000 0.000 :778(__contains__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:105(__init__)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:839()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2252()\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1730(_get_default_index_names)\n", - " 42 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1099(_parse_min_sec)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1685(_clean_options)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:259(__getitem__)\n", - " 48 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:209(_maybe_get_mask)\n", - " 211 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:1080(copyto)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:226(isna)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:1034(check_header_validity)\n", - " 84 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:738()\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:688(_sanitize_non_ordered)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_weakrefset.py:85(add)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/_internal_utils.py:38(unicode_is_ascii)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:296(_put_conn)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5818(head)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2817(hasnans)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1275(__init__)\n", - " 524 0.000 0.000 0.000 0.000 {method 'ljust' of 'str' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1599(make_cookies)\n", - " 102 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/printing.py:60()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:588(prepare_auth)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:480(_get_ndims)\n", - " 46 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:322(weekday)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:536(close)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/codeop.py:120(__call__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ipaddress.py:1286(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:95(_default_key_normalizer)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:106(_encode_params)\n", - " 46 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:342(ampm)\n", - " 51 0.000 0.000 0.000 0.000 {method 'transpose' of 'numpy.ndarray' objects}\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1165(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:34(__init__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1261(__init__)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:410(fill_bool)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5134(array)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/weakref.py:427(__setitem__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:1018(get_auth_from_url)\n", - " 202 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1081(codes)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:301(maybe_iterable_to_list)\n", - " 52 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:46(__setitem__)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4518(_check_inplace_and_allows_duplicate_labels)\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:288()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:243(_from_values_or_dtype)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1025(save_to_buffer)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:315(__init__)\n", - " 90 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:981()\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:352(na_logical_op)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Configuration.py:37(__setattr__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:220(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:1204(is_potential_multi_index)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/base.py:294(is_dtype)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:215(_vhstack_dispatcher)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:1547(check_below_min_count)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1356(add_cookie_header)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:191(_validate_parse_dates_presence)\n", - " 37 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2177(_grouping_func)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:1165(_is_binary_mode)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:494(_clean_keys_and_objs)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:660(requote_uri)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ipaddress.py:1187(_ip_int_from_string)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1377(__init__)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:205(_hostinfo)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:127(__next__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:429(__init__)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1826(_check_label_or_level_ambiguity)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method builtins.compile}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:396(build_connection_pool_key_attributes)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/response.py:40(assert_header_parsing)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:213(_read_headers)\n", - " 4 0.000 0.000 0.000 0.000 {method 'settimeout' of '_socket.socket' objects}\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1324(_make_invoke_excepthook)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:540()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:240(init_poolmanager)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/event.py:71(__str__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:267(clear)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:318()\n", - " 46 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:51(__getitem__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5172(delete)\n", - " 252 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:443(__enter__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:90(_urllib3_request_context)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:356()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:201(_set_noconvert_columns)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:900(default_headers)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:134(__init__)\n", - " 330 0.000 0.000 0.000 0.000 {method 'replace' of 'str' objects}\n", - " 60 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:992(_validate_key_length)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1570(_maybe_box_and_unbox_datetimelike)\n", - " 14 0.000 0.000 0.000 0.000 {method 'fill' of 'numpy.ndarray' objects}\n", - " 197 0.000 0.000 0.000 0.000 {method 'popleft' of 'collections.deque' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:76(copy)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2586(get_values)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:351(_encode_target)\n", - " 58 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1030(axes)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:251(put)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/_policybase.py:301(header_source_parse)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:100(push)\n", - " 36 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:743(readable)\n", - " 90 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2781()\n", - " 98 0.000 0.000 0.000 0.000 {built-in method numpy.core._multiarray_umath.normalize_axis_index}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:724()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:1148(take)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:316(close)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:587()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:849(_list_to_arrays)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:1045(_validate_header_part)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:266(index_labels_to_array)\n", - " 160 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1937(_post_setstate)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:138(_event_pipe)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:137(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1534(blk_func)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:109(__init__)\n", - " 34 0.000 0.000 0.000 0.000 {method '_checkClosed' of '_io._IOBase' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/json/__init__.py:183(dumps)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:480()\n", - " 61 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2752(need_slice)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:81(__init__)\n", - " 209 0.000 0.000 0.000 0.000 {function FrozenList.__getitem__ at 0x126b48540}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:159(resolve_redirects)\n", - " 42 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1571(_get_names)\n", - " 98 0.000 0.000 0.000 0.000 {built-in method _operator.index}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:494(prepare_body)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:311(is_null_slice)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1195(_info_repr)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:143(clear)\n", - " 49 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1763(np_can_hold_element)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2804(_isnan)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2738(_check_indexing_error)\n", - " 46 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:248(_qsize)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:509(urlunparse)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:468()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:679(_init_length)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1327(__instancecheck__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:490(is_truncated)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:847(quote)\n", - " 150 0.000 0.000 0.000 0.000 {method 'upper' of 'str' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:199(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:208(_maybe_unbox_datetimelike)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1096(_can_fast_transpose)\n", - " 3 0.000 0.000 0.000 0.000 {built-in method posix.cpu_count}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/json/encoder.py:183(encode)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:354(validate_ascending)\n", - " 12 0.000 0.000 0.000 0.000 {method 'write' of '_io.BytesIO' objects}\n", - " 90 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1180()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:457(__neg__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:479(items)\n", - " 121 0.000 0.000 0.000 0.000 {built-in method builtins.iter}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:774(get_proxy)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method from_bytes}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/retry.py:202(__init__)\n", - " 4 0.000 0.000 0.000 0.000 {built-in method _operator.mul}\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:525(get_all)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:303(_normalize_host)\n", - " 2 0.000 0.000 0.000 0.000 {method 'uniform' of 'numpy.random.mtrand.RandomState' objects}\n", - " 77 0.000 0.000 0.000 0.000 {method 'add' of 'set' objects}\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:230(_can_hold_na)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:367()\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_weakrefset.py:39(_remove)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2712(_generate_range)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:82(frame_apply)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:207(_arrays_for_stack_dispatcher)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:1233(dedup_names)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:370()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:202(_maybe_reindex_columns_na_proxy)\n", - " 98 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5558(_append_dispatcher)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:172(from_float)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/utils.py:52(_has_surrogates)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:675(empty)\n", - " 59 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:692(_constructor)\n", - " 49 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1455()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:487()\n", - " 83 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:575(is_set)\n", - " 64 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1206(daemon)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:99(freq)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:84()\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:553(equals)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:849(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:638(__array__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:362(_make_index)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:121(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:950(_validate_or_indexify_columns)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_common.py:27(_init_wait_gen)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1111(_values)\n", - " 16 0.000 0.000 0.000 0.000 {method 'fullmatch' of 're.Pattern' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2322(any)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/roperator.py:14(rsub)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/weakref.py:369(remove)\n", - " 49 0.000 0.000 0.000 0.000 {method 'item' of 'numpy.ndarray' objects}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:405(_check_values_indices_shape_match)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1602(__subclasscheck__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:263(_remove_path_dot_segments)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:400()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1467(debug)\n", - " 90 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:941()\n", - " 62 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:58()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:303()\n", - " 16 0.000 0.000 0.000 0.000 :790(items)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:603(update_trades_on_sell)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1765(_get_names)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1657(_get_level_number)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1990(__exit__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/encodings/idna.py:145(encode)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:756(_shallow_copy)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:2133(_refine_defaults_read)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:99(_intenum_converter)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:630(prepare_hooks)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:1135(_splitport)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:29(_splitparam)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_asarray.py:108()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/string.py:189(_binify)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:498(is_truncated_vertically)\n", - " 92 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:217(_scalar_type)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2666(_maybe_normalize_endpoints)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:248(stringify_path)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:77(readline)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ipaddress.py:1213(_parse_octet)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/json/encoder.py:205(iterencode)\n", - " 36 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1122()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:390(_check_close)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:95(__init__)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1686(name)\n", - " 82 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:511(f)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:243(get_payload)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:594(_bool_arith_check)\n", - " 6 0.000 0.000 0.000 0.000 {method 'astype' of 'numpy.generic' objects}\n", - " 5 0.000 0.000 0.000 0.000 {built-in method _operator.and_}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:539(get_encoding_from_headers)\n", - " 60 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7678()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:1149(_normalize_host)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:514(show_row_idx_names)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:448(size)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:325()\n", - " 98 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1764(_ravel_dispatcher)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:348(_get_timeout)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:424(close)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1622(close)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:72()\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/concat.py:73()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:215(get_default_val)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:505(get_rename_function)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1133(_parsems)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:484(should_show_dimensions)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:350(_maybe_make_multi_index_columns)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:69(close)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:254(_get)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:542(merge_cookies)\n", - " 32 0.000 0.000 0.000 0.000 {method 'difference_update' of 'set' objects}\n", - " 60 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1665()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:100(__new__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7704(get_unanimous_names)\n", - " 49 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:892(bincount)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1227(deepvalues)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:57(__iter__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:207(register_hook)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:862(codes)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:572(prepare_content_length)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:241(is_single_block)\n", - " 4 0.000 0.000 0.000 0.000 {built-in method _operator.pow}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1721()\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/response.py:9(is_fp_closed)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:369()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/string.py:126()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:106(_get_distinct_objs)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method _operator.ge}\n", - " 4 0.000 0.000 0.000 0.000 {function SocketIO.close at 0x10ebfee80}\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2294()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:534()\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1061()\n", - " 2 0.000 0.000 0.000 0.000 :405(parent)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:251(_put)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:471(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:550(infer_compression)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:974(close)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:742(_get_axes)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:544(_initialize_justify)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method builtins.locals}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:692(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:107(get_redirect_target)\n", - " 49 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5364(_insert_dispatcher)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:373(inner)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1046(nlevels)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:753(update_holdings_on_fill)\n", - " 10 0.000 0.000 0.000 0.000 {method 'getvalue' of '_io.BytesIO' objects}\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:228(_acquireLock)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:354(__array__)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:584()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:102()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/request.py:189(body_to_chunks)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:541(to_numpy)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:641(fill_missing_names)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:196(mgr_to_mgr)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:447(isclosed)\n", - " 4 0.000 0.000 0.000 0.000 {method 'readlines' of '_io._IOBase' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:799(mount)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:923(quote_from_bytes)\n", - " 39 0.000 0.000 0.000 0.000 {method 'capitalize' of 'str' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:188(clone)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:751()\n", - " 6 0.000 0.000 0.000 0.000 :121(__subclasscheck__)\n", - " 36 0.000 0.000 0.000 0.000 {built-in method sys.getrefcount}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1674(_check_file_or_buffer)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Context.py:124(clear_context)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:688(__call__)\n", - " 66 0.000 0.000 0.000 0.000 {method 'partition' of 'str' objects}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:494(is_truncated_horizontally)\n", - " 143 0.000 0.000 0.000 0.000 {method 'locked' of '_thread.lock' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:526(_initialize_sparsify)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/connection.py:93(_set_socket_options)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:593(_calc_max_rows_fitted)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:84(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1277(is_extension_array_dtype)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:157(_int64_cut_off)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:769(is_redirect)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:164(host)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:231(_fix)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:506(has_index_names)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method _operator.add}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:650(truncate)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:353()\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:884(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/console.py:79(in_ipython_frontend)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:520(urlunsplit)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:2015(__iter__)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6277()\n", - " 49 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1389(_moveaxis_dispatcher)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:773(__init__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6270()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:781(get_adapter)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:105(is_file_like)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/hooks.py:15(default_hooks)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method today}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/astype.py:249(astype_is_view)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:871(_do_date_conversions)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1489(__init__)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1287(_value_formatter)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1841(_has_names)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:580(_get_axis_name)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:601(_set_noconvert_dtype_columns)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/weakref.py:568(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:258(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/calendar.py:122(monthrange)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/util.py:19(to_str)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:102(__setitem__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:1079(closed)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:209(count_not_none)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7679()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:306(is_named_tuple)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:52(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1734(clear_expired_cookies)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:135(super_len)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1331(dtype)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:330()\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1028(_output)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager.py:372()\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:507(set_raw)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:194(close)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:136(ones)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method _operator.inv}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:582(update_trades_on_buy)\n", - " 68 0.000 0.000 0.000 0.000 {built-in method builtins.ord}\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:665(_get_registered_option)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:546(ensure_key_mapped)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:518(show_col_idx_names)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:175(port)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:188(all_none)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:237(_releaseLock)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:465(_decode)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:1073(clean_reindex_fill_method)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:358(update)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:436(flush)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:686()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:612(_adjust_max_rows)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:943(urlencode)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/retry.py:242()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:212()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:245(read_timeout)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:150(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:334(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:121(pushlines)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/event.py:122(__init__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:167()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:95(__getitem__)\n", - " 6 0.000 0.000 0.000 0.000 {method 'subn' of 're.Pattern' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5676()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:195(_new_message)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/traitlets/traitlets.py:676(__get__)\n", - " 2 0.000 0.000 0.000 0.000 :815(__len__)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7652(ensure_has_len)\n", - " 26 0.000 0.000 0.000 0.000 {method 'rpartition' of 'str' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:865(_references)\n", - " 2 0.000 0.000 0.000 0.000 {method 'setsockopt' of '_socket.socket' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1297(_cookie_attrs)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:96()\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1753(__iter__)\n", - " 6 0.000 0.000 0.000 0.000 {built-in method _abc._abc_subclasscheck}\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:248(__len__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:805()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:66(copy)\n", - " 4 0.000 0.000 0.000 0.000 {built-in method math.floor}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1041(_get_buffer)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:659(unquote)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:636(unquote_unreserved)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:389(standardize_mapping)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:1229()\n", - " 37 0.000 0.000 0.000 0.000 {method 'pop' of 'set' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/retry.py:387(is_retry)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:85(path_url)\n", - " 16 0.000 0.000 0.000 0.000 :812(__init__)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:65(lookback)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:291(__iter__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:532(treat_as_nested)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/calendar.py:115(weekday)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:126(resolve_default_timeout)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:404(is_dataclass)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:195()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:515(get_compression_method)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:208(_pop_message)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:213(_put)\n", - " 17 0.000 0.000 0.000 0.000 {method 'setdefault' of 'dict' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:207(validate_header_arg)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:234(_disallow_mismatched_datetimelike)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:514(_parse_content_type_header)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:265(_find_common_index_dtype)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:156(username)\n", - " 8 0.000 0.000 0.000 0.000 {method 'count' of 'str' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5486()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Configuration.py:18(initialize_configuration)\n", - " 32 0.000 0.000 0.000 0.000 {method 'discard' of 'set' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/console.py:54(in_interactive_session)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:33(refresh_cache)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/eventScheduler.py:144(store_event)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/_internal_utils.py:25(to_native_string)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1720(getEffectiveLevel)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:764(categories)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7717()\n", - " 4 0.000 0.000 0.000 0.000 {built-in method now}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:213()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:510(has_column_names)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method _operator.gt}\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:199(get_cache)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:244(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:216(refresh_cache)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:799(iter_content)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_sync.py:10(_call_handlers)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/methods/to_dict.py:155()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:398(validate_inclusive)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:172()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:1095(__new__)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:531(validate_ordered)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:170()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:331(set_payload)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:60(__len__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2623(_infer_tz_from_endpoints)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:130(_validate_timeout)\n", - " 18 0.000 0.000 0.000 0.000 {method 'values' of 'collections.OrderedDict' objects}\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:351(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:1269(_process_date_conversion)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:553(nblocks)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:304(cert_verify)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7719()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:393(prepare_method)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2220(_can_hold_na)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:91(ensure_python_int)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1903()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:858(_get_column_name_list)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:211(is_multipart)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/IPython/core/compilerop.py:180(extra_flags)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/event.py:81(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:374(_merge_pool_kwargs)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:693(_get_result_dim)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:899(is_nonnegative_int)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/hooks.py:22(dispatch_hook)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:326()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:657()\n", - " 14 0.000 0.000 0.000 0.000 {method 'strip' of 'str' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5495()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:585(_ensure_2d)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:403(retries)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:397(ensure_np_dtype)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:108(_noop)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:1123(_make_date_converter)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:279(_extract_multi_indexer_columns)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:706()\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:178()\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:619(categories)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:1454(__init__)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method _codecs.lookup}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:202(start_connect)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:1117(_maybe_memory_map)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:330(_sanitize_and_check)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:520(convert_to_list_like)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/hooks.py:16()\n", - " 6 0.000 0.000 0.000 0.000 {method 'count' of 'bytes' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/retry.py:379(_is_method_retryable)\n", - " 12 0.000 0.000 0.000 0.000 {method 'lstrip' of 'str' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1394(__hash__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/util.py:7(to_bytes)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1793()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:193(_userinfo)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:174(not_none)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:183(maybe_box_native)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:77(_atleast_2d_dispatcher)\n", - " 4 0.000 0.000 0.000 0.000 {method 'clear' of 'collections.OrderedDict' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:343()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1251(_validate_host)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:140(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:392(ensure_dtype_objs)\n", - " 4 0.000 0.000 0.000 0.000 {method 'pop' of 'collections.OrderedDict' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:582(_calc_max_cols_fitted)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:11522()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1290(_cookies_for_request)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/methods/to_dict.py:160()\n", - " 8 0.000 0.000 0.000 0.000 {method 'groups' of 're.Match' objects}\n", - " 6 0.000 0.000 0.000 0.000 {method 'decode' of 'bytearray' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1643(reconstruct_func)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_common.py:17(_maybe_call)\n", - " 2 0.000 0.000 0.000 0.000 :1()\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1319(disable)\n", - " 4 0.000 0.000 0.000 0.000 {method 'tolist' of 'numpy.ndarray' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:550(_initialize_columns)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:918(_wrap_ipv6)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/traitlets/traitlets.py:629(get)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:1109(is_theta_data_retrieval_successful)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/eventScheduler.py:32()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:1426(_validate_parse_dates_arg)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/base.py:115(__eq__)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:211()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:965()\n", - " 5 0.000 0.000 0.000 0.000 {method 'reverse' of 'list' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/dataclasses.py:1258(is_dataclass)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2416(_all_dispatcher)\n", - " 2 0.000 0.000 0.000 0.000 :2(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/IPython/core/interactiveshell.py:1277(user_global_ns)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:91(merge_hooks)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:893(_check_data_length)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/IPython/core/interactiveshell.py:3493(compare)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_request_methods.py:51(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1329(result_index)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:255(_has_complex_date_col)\n", - " 2 0.000 0.000 0.000 0.000 {method 'send' of 'generator' objects}\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:213()\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1979(nlevels)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:2056(_clean_na_values)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:277()\n", - " 6 0.000 0.000 0.000 0.000 {built-in method sys.audit}\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:632(ordered)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:2365(_validate_skipfooter)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/parser.py:17(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:131(close)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:421(lexsort)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method sys.getfilesystemencoding}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:305(loc)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1234(_validate_method)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/string.py:63(_need_to_wrap_around)\n", - " 2 0.000 0.000 0.000 0.000 {method 'total_seconds' of 'datetime.timedelta' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/connection.py:103(allowed_gai_family)\n", - " 4 0.000 0.000 0.000 0.000 {method 'extend' of 'collections.deque' objects}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:44(_debug)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:626(_is_in_terminal)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:110(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:292(isclass)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:886(inner)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:655(_constructor)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/request.py:134(set_file_position)\n", - " 8 0.000 0.000 0.000 0.000 {method 'items' of 'collections.OrderedDict' objects}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:1447(is_index_col)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:188(_expand_user)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:2267(_extract_dialect)\n", - " 4 0.000 0.000 0.000 0.000 {method 'split' of 'bytes' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1230(_encode_request)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:2139(_codes)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:717(index)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:235()\n", - " 2 0.000 0.000 0.000 0.000 {method 'sort' of 'list' objects}\n", - " 10 0.000 0.000 0.000 0.000 {method 'isascii' of 'str' objects}\n", - " 4 0.000 0.000 0.000 0.000 {method 'truncate' of '_io.StringIO' objects}\n", - " 2 0.000 0.000 0.000 0.000 {method 'rstrip' of 'bytes' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:196(is_holiday)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/string.py:22(__init__)\n", - " 8 0.000 0.000 0.000 0.000 {method 'seek' of '_io.StringIO' objects}\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:117(info)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:376(dtype)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1243(_validate_path)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method _codecs.lookup_error}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:292(is_fsspec_url)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:127()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7718()\n", - " 4 0.000 0.000 0.000 0.000 {method 'count' of 'list' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:450(check_dtype_backend)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:770(_maybe_check_integrity)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:227(connect_timeout)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:192()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:895(_get_hostport)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:856(columns)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:849()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_wait_gen.py:7(expo)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:891(default_user_agent)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:494(dtype)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:743(set_environ)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1847()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:351()\n", - " 2 0.000 0.000 0.000 0.000 {method 'getvalue' of '_io.StringIO' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:146(dtype)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:527(validate_integer)\n", - " 4 0.000 0.000 0.000 0.000 {method 'update' of 'collections.OrderedDict' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:986(_validate_usecols_arg)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:183(host)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:295(is_closed)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:460(tolist)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:245(_init)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method _socket.getdefaulttimeout}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:559(_validate_names)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2974(_prod_dispatcher)\n", - " 2 0.000 0.000 0.000 0.000 {method 'date' of 'datetime.datetime' objects}\n", - " 1 0.000 0.000 0.000 0.000 :315(__subclasshook__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:885(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/tz/tz.py:74(utcoffset)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ipaddress.py:574(__int__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:124(__iter__)\n", - " 2 0.000 0.000 0.000 0.000 {function HTTPResponse.flush at 0x110a6d1c0}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_common.py:28()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:40(get_should_schedule)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:558(_initialize_colspace)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:315(step)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:677(__normalize_dollar_amount_to_decimal)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/response.py:79()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:216(_validate_dtype)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:820()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:87(get_new_headers)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:280(start)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:643(__enter__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:247()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:581(iter_slices)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:187(_get_fill_value)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2317(_any_dispatcher)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:1318(shares_memory)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:216()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2474(validate_periods)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/IPython/core/interactiveshell.py:683(get_ipython)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5168(_delete_dispatcher)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:107(_copy_immutable)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:531(_initialize_formatters)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:578(add_headers)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:105(_box_func)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1987(__enter__)\n", - " 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/proxy.py:11(connection_requires_http_tunnel)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:339(_validate_conn)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:451(__enter__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:231(_constructor)\n", - "\n", - "\n", - "\n" - ] - } - ], - "source": [ - "\n", - "print(stream.getvalue())\n" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [], - "source": [ - "def find_type(x, _type='ADJUST'):\n", - " if x.__class__.__name__ == _type:\n", - " return True\n", - " return False" - ] - }, - { - "cell_type": "code", - "execution_count": 54, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
&L:AMZN20250117C170&S:AMZN20250117C175
2024-01-31HOLD(&L:AMZN20250117C170&S:AMZN20250117C175) R...
2024-02-01HOLD(&L:AMZN20250117C170&S:AMZN20250117C175) R...
2024-02-02HOLD(&L:AMZN20250117C170&S:AMZN20250117C175) R...
2024-02-05HOLD(&L:AMZN20250117C170&S:AMZN20250117C175) R...
2024-02-06HOLD(&L:AMZN20250117C170&S:AMZN20250117C175) R...
......
2024-07-19HOLD(&L:AMZN20250117C170&S:AMZN20250117C175) R...
2024-07-22HOLD(&L:AMZN20250117C170&S:AMZN20250117C175) R...
2024-07-23HOLD(&L:AMZN20250117C170&S:AMZN20250117C175) R...
2024-07-24HOLD(&L:AMZN20250117C170&S:AMZN20250117C175) R...
2024-07-25HOLD(&L:AMZN20250117C170&S:AMZN20250117C175) R...
\n", - "

122 rows × 1 columns

\n", - "
" - ], - "text/plain": [ - " &L:AMZN20250117C170&S:AMZN20250117C175\n", - "2024-01-31 HOLD(&L:AMZN20250117C170&S:AMZN20250117C175) R...\n", - "2024-02-01 HOLD(&L:AMZN20250117C170&S:AMZN20250117C175) R...\n", - "2024-02-02 HOLD(&L:AMZN20250117C170&S:AMZN20250117C175) R...\n", - "2024-02-05 HOLD(&L:AMZN20250117C170&S:AMZN20250117C175) R...\n", - "2024-02-06 HOLD(&L:AMZN20250117C170&S:AMZN20250117C175) R...\n", - "... ...\n", - "2024-07-19 HOLD(&L:AMZN20250117C170&S:AMZN20250117C175) R...\n", - "2024-07-22 HOLD(&L:AMZN20250117C170&S:AMZN20250117C175) R...\n", - "2024-07-23 HOLD(&L:AMZN20250117C170&S:AMZN20250117C175) R...\n", - "2024-07-24 HOLD(&L:AMZN20250117C170&S:AMZN20250117C175) R...\n", - "2024-07-25 HOLD(&L:AMZN20250117C170&S:AMZN20250117C175) R...\n", - "\n", - "[122 rows x 1 columns]" - ] - }, - "execution_count": 54, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rm.actions[rm.actions[rm.actions.columns[0]].apply(find_type, _type = 'HOLD')]#.values[2][0]" - ] - }, - { - "cell_type": "code", - "execution_count": 59, - "metadata": {}, - "outputs": [], - "source": [ - "# data = rm.processed_option_data['NVDA20250117C61']\n", - "data = rm.position_data['&L:AMZN20250117C170&S:AMZN20250117C175']\n", - "# data[['Vega', 'Delta', 'Gamma', 'Theta', 'Midpoint']] = data[['Vega', 'Delta', 'Gamma', 'Theta', 'Midpoint']].replace(0, np.nan).fillna(method='ffill')\n", - "data.plot()" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2025-05-24 01:26:29 DataManager.py CRITICAL: Extra Cols not implemented for BS Greeks\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
VegaVannaVolgaDeltaGammaThetaRhoMidpoint_vegaMidpoint_vannaMidpoint_volgaMidpoint_deltaMidpoint_gammaMidpoint_thetaMidpoint_rho
Datetime
2024-01-031.8790820.65266576.6009700.4042900.001961-0.1214871.5238081.8782960.65392977.2956400.4036230.001966-0.1211651.522590
2024-01-041.9022760.64488970.0200330.4119870.001959-0.1234561.5603551.9019450.64548470.3314940.4116830.001961-0.1233061.559825
2024-01-051.9629470.62191853.0791730.4320140.001945-0.1280051.6613791.9622760.62353953.8356090.4312340.001951-0.1275961.660210
2024-01-082.1108040.5277997.3064250.4894170.001877-0.1401331.9582112.1111490.5216645.2284970.4922940.001846-0.1420651.959015
2024-01-092.1436780.482483-7.3211370.5110980.001784-0.1475432.0400462.1439370.486120-6.1494070.5092270.001805-0.1461492.040718
.............................................
2024-06-040.0000000.0000000.0000000.0000000.0000000.0000000.0000000.800208-2.1563233451.9249410.9593360.000165-0.1766693.281592
2024-06-050.0000000.0000000.0000000.0000000.0000000.0000000.0000000.728099-2.2327753922.1103380.9658360.000133-0.1711593.309508
2024-06-060.0000000.0000000.0000000.0000000.0000000.0000000.0000000.772995-2.1205843590.4961930.9626390.000144-0.1783353.268097
2024-06-070.0000000.0000000.0000000.0000000.0000000.0000000.0000000.759256-2.1539943652.5290040.9633080.000143-0.1764533.261393
2024-06-100.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.000000
\n", - "

114 rows × 14 columns

\n", - "
" - ], - "text/plain": [ - " Vega Vanna Volga Delta Gamma Theta \\\n", - "Datetime \n", - "2024-01-03 1.879082 0.652665 76.600970 0.404290 0.001961 -0.121487 \n", - "2024-01-04 1.902276 0.644889 70.020033 0.411987 0.001959 -0.123456 \n", - "2024-01-05 1.962947 0.621918 53.079173 0.432014 0.001945 -0.128005 \n", - "2024-01-08 2.110804 0.527799 7.306425 0.489417 0.001877 -0.140133 \n", - "2024-01-09 2.143678 0.482483 -7.321137 0.511098 0.001784 -0.147543 \n", - "... ... ... ... ... ... ... \n", - "2024-06-04 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "2024-06-05 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "2024-06-06 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "2024-06-07 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "2024-06-10 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "\n", - " Rho Midpoint_vega Midpoint_vanna Midpoint_volga \\\n", - "Datetime \n", - "2024-01-03 1.523808 1.878296 0.653929 77.295640 \n", - "2024-01-04 1.560355 1.901945 0.645484 70.331494 \n", - "2024-01-05 1.661379 1.962276 0.623539 53.835609 \n", - "2024-01-08 1.958211 2.111149 0.521664 5.228497 \n", - "2024-01-09 2.040046 2.143937 0.486120 -6.149407 \n", - "... ... ... ... ... \n", - "2024-06-04 0.000000 0.800208 -2.156323 3451.924941 \n", - "2024-06-05 0.000000 0.728099 -2.232775 3922.110338 \n", - "2024-06-06 0.000000 0.772995 -2.120584 3590.496193 \n", - "2024-06-07 0.000000 0.759256 -2.153994 3652.529004 \n", - "2024-06-10 0.000000 0.000000 0.000000 0.000000 \n", - "\n", - " Midpoint_delta Midpoint_gamma Midpoint_theta Midpoint_rho \n", - "Datetime \n", - "2024-01-03 0.403623 0.001966 -0.121165 1.522590 \n", - "2024-01-04 0.411683 0.001961 -0.123306 1.559825 \n", - "2024-01-05 0.431234 0.001951 -0.127596 1.660210 \n", - "2024-01-08 0.492294 0.001846 -0.142065 1.959015 \n", - "2024-01-09 0.509227 0.001805 -0.146149 2.040718 \n", - "... ... ... ... ... \n", - "2024-06-04 0.959336 0.000165 -0.176669 3.281592 \n", - "2024-06-05 0.965836 0.000133 -0.171159 3.309508 \n", - "2024-06-06 0.962639 0.000144 -0.178335 3.268097 \n", - "2024-06-07 0.963308 0.000143 -0.176453 3.261393 \n", - "2024-06-10 0.000000 0.000000 0.000000 0.000000 \n", - "\n", - "[114 rows x 14 columns]" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "opt_manager = OptionDataManager(opttick='NVDA20250117C605')\n", - "req = opt_manager.get_timeseries(\n", - " start=rm.start_date,\n", - " end=rm.end_date,\n", - " type_ = 'greeks'\n", - ")\n", - "req.post_processed_data" - ] - }, - { - "cell_type": "code", - "execution_count": 148, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'ticker': 'NVDA', 'put_call': 'C', 'exp_date': '2025-01-17', 'strike': 302.5}" - ] - }, - "execution_count": 148, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "parse_option_tick('NVDA20250117C302.5')" - ] - }, - { - "cell_type": "code", - "execution_count": 141, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
OpenHighLowCloseVolumeBid_sizeCloseBidAsk_sizeCloseAskMidpointWeighted_midpoint
Datetime
2024-06-10 16:00:000.000.000.000.0002563.30565.0564.17563.591667
2024-06-11 16:00:0062.4063.3062.4063.301213563.0522263.7063.37563.454202
2024-06-12 16:00:000.000.000.000.0008266.65567.8067.22566.716092
2024-06-13 16:00:0071.7071.7071.7071.702371.45372.1071.77571.775000
2024-06-14 16:00:0073.7073.7073.7073.70605273.9014674.6074.25074.416162
....................................
2024-12-24 16:00:000.000.000.000.00014979.651080.5080.07579.703459
2024-12-26 16:00:000.000.000.000.00014879.302480.0579.67579.404651
2024-12-27 16:00:000.000.000.000.00012276.402077.4576.92576.547887
2024-12-30 16:00:0077.2577.2577.2577.253018076.5523477.7577.15077.228261
2024-12-31 16:00:000.000.000.000.0002072.302076.2074.25074.250000
\n", - "

142 rows × 11 columns

\n", - "
" - ], - "text/plain": [ - " Open High Low Close Volume Bid_size CloseBid \\\n", - "Datetime \n", - "2024-06-10 16:00:00 0.00 0.00 0.00 0.00 0 25 63.30 \n", - "2024-06-11 16:00:00 62.40 63.30 62.40 63.30 12 135 63.05 \n", - "2024-06-12 16:00:00 0.00 0.00 0.00 0.00 0 82 66.65 \n", - "2024-06-13 16:00:00 71.70 71.70 71.70 71.70 2 3 71.45 \n", - "2024-06-14 16:00:00 73.70 73.70 73.70 73.70 60 52 73.90 \n", - "... ... ... ... ... ... ... ... \n", - "2024-12-24 16:00:00 0.00 0.00 0.00 0.00 0 149 79.65 \n", - "2024-12-26 16:00:00 0.00 0.00 0.00 0.00 0 148 79.30 \n", - "2024-12-27 16:00:00 0.00 0.00 0.00 0.00 0 122 76.40 \n", - "2024-12-30 16:00:00 77.25 77.25 77.25 77.25 30 180 76.55 \n", - "2024-12-31 16:00:00 0.00 0.00 0.00 0.00 0 20 72.30 \n", - "\n", - " Ask_size CloseAsk Midpoint Weighted_midpoint \n", - "Datetime \n", - "2024-06-10 16:00:00 5 65.05 64.175 63.591667 \n", - "2024-06-11 16:00:00 222 63.70 63.375 63.454202 \n", - "2024-06-12 16:00:00 5 67.80 67.225 66.716092 \n", - "2024-06-13 16:00:00 3 72.10 71.775 71.775000 \n", - "2024-06-14 16:00:00 146 74.60 74.250 74.416162 \n", - "... ... ... ... ... \n", - "2024-12-24 16:00:00 10 80.50 80.075 79.703459 \n", - "2024-12-26 16:00:00 24 80.05 79.675 79.404651 \n", - "2024-12-27 16:00:00 20 77.45 76.925 76.547887 \n", - "2024-12-30 16:00:00 234 77.75 77.150 77.228261 \n", - "2024-12-31 16:00:00 20 76.20 74.250 74.250000 \n", - "\n", - "[142 rows x 11 columns]" - ] - }, - "execution_count": 141, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "retrieve_eod_ohlc(\n", - " symbol='NVDA',\n", - " start_date=evb_backtest.portfolio.start_date,\n", - " end_date=evb_backtest.portfolio.risk_manager.end_date,\n", - " strike =605.0/10,\n", - " right='C',\n", - " exp= '2025-01-17',\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 142, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'AAPL': [],\n", - " 'SBUX': [],\n", - " 'AMD': [],\n", - " 'META': [],\n", - " 'COST': [],\n", - " 'NFLX': [],\n", - " 'NVDA': [(Timestamp('2024-06-10 00:00:00'), 10.0)],\n", - " 'AMZN': []}" - ] - }, - "execution_count": 142, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.portfolio.risk_manager.splits" - ] - }, - { - "cell_type": "code", - "execution_count": 115, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[('AAPL',\n", - " [(Timestamp('2000-06-21 00:00:00'), 2.0),\n", - " (Timestamp('2005-02-28 00:00:00'), 2.0),\n", - " (Timestamp('2014-06-09 00:00:00'), 7.0),\n", - " (Timestamp('2020-08-31 00:00:00'), 4.0)]),\n", - " ('SBUX',\n", - " [(Timestamp('2001-04-30 00:00:00'), 2.0),\n", - " (Timestamp('2005-10-24 00:00:00'), 2.0),\n", - " (Timestamp('2015-04-09 00:00:00'), 2.0)]),\n", - " ('AMD', [(Timestamp('2000-08-22 00:00:00'), 2.0)]),\n", - " ('META', []),\n", - " ('COST', [(Timestamp('2000-01-14 00:00:00'), 2.0)]),\n", - " ('NFLX',\n", - " [(Timestamp('2004-02-12 00:00:00'), 2.0),\n", - " (Timestamp('2015-07-15 00:00:00'), 7.0)]),\n", - " ('NVDA',\n", - " [(Timestamp('2000-06-27 00:00:00'), 2.0),\n", - " (Timestamp('2001-09-10 00:00:00'), 2.0),\n", - " (Timestamp('2006-04-07 00:00:00'), 2.0),\n", - " (Timestamp('2007-09-11 00:00:00'), 1.5),\n", - " (Timestamp('2021-07-20 00:00:00'), 4.0),\n", - " (Timestamp('2024-06-10 00:00:00'), 10.0)]),\n", - " ('AMZN', [(Timestamp('2022-06-06 00:00:00'), 20.0)])]" - ] - }, - "execution_count": 115, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.risk_manager.splits.items()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "ename": "StopIteration", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n", - "\u001b[0;31mStopIteration\u001b[0m Traceback (most recent call last)\n", - "Cell \u001b[0;32mIn[230], line 51\u001b[0m\n", - "\u001b[1;32m 49\u001b[0m df[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m% o\u001b[39;00m\u001b[38;5;124mf tottime\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m (df[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtottime\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m/\u001b[39m total_time \u001b[38;5;241m*\u001b[39m \u001b[38;5;241m100\u001b[39m)\u001b[38;5;241m.\u001b[39mround(\u001b[38;5;241m2\u001b[39m)\n", - "\u001b[1;32m 50\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m df\n", - "\u001b[0;32m---> 51\u001b[0m \u001b[43mparse_cprofile\u001b[49m\u001b[43m(\u001b[49m\u001b[43mstats\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msort_by\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mcumtime\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtop_n\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m20\u001b[39;49m\u001b[43m)\u001b[49m\n", - "\n", - "Cell \u001b[0;32mIn[230], line 26\u001b[0m, in \u001b[0;36mparse_cprofile\u001b[0;34m(file_or_stats, sort_by, top_n)\u001b[0m\n", - "\u001b[1;32m 23\u001b[0m stats\u001b[38;5;241m.\u001b[39mstrip_dirs()\u001b[38;5;241m.\u001b[39msort_stats(sort_by)\u001b[38;5;241m.\u001b[39mprint_stats(top_n)\n", - "\u001b[1;32m 24\u001b[0m lines \u001b[38;5;241m=\u001b[39m s\u001b[38;5;241m.\u001b[39mgetvalue()\u001b[38;5;241m.\u001b[39msplitlines()\n", - "\u001b[0;32m---> 26\u001b[0m header_idx \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mnext\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mi\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mi\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mline\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43menumerate\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mlines\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mline\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstrip\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstartswith\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mncalls\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[1;32m 27\u001b[0m data_lines \u001b[38;5;241m=\u001b[39m lines[header_idx \u001b[38;5;241m+\u001b[39m \u001b[38;5;241m1\u001b[39m:]\n", - "\u001b[1;32m 28\u001b[0m parsed \u001b[38;5;241m=\u001b[39m []\n", - "\n", - "\u001b[0;31mStopIteration\u001b[0m: " - ] - } - ], - "source": [ - "\n", - "import pstats\n", - "from io import StringIO\n", - "import pandas as pd\n", - "\n", - "def parse_cprofile(file_or_stats, sort_by=\"cumtime\", top_n=20):\n", - " \"\"\"\n", - " Parses cProfile stats and returns a DataFrame with percentage time and formatted output.\n", - " \n", - " Parameters:\n", - " file_or_stats: str or pstats.Stats\n", - " Path to cProfile output or a pstats.Stats object\n", - " sort_by: str\n", - " Metric to sort by (\"cumtime\", \"tottime\", etc.)\n", - " top_n: int\n", - " Number of top functions to display\n", - " \"\"\"\n", - " if isinstance(file_or_stats, str):\n", - " stats = pstats.Stats(file_or_stats)\n", - " else:\n", - " stats = file_or_stats\n", - "\n", - " s = StringIO()\n", - " stats.strip_dirs().sort_stats(sort_by).print_stats(top_n, stream=s)\n", - " lines = s.getvalue().splitlines()\n", - "\n", - " header_idx = next(i for i, line in enumerate(lines) if line.strip().startswith(\"ncalls\"))\n", - " data_lines = lines[header_idx + 1:]\n", - " parsed = []\n", - "\n", - " for line in data_lines:\n", - " if not line.strip():\n", - " continue\n", - " parts = line.split()\n", - " if len(parts) < 6:\n", - " continue\n", - " ncalls = parts[0]\n", - " tottime = float(parts[1])\n", - " percall1 = float(parts[2])\n", - " cumtime = float(parts[3])\n", - " percall2 = float(parts[4])\n", - " location = \" \".join(parts[5:])\n", - " parsed.append((ncalls, tottime, percall1, cumtime, percall2, location))\n", - "\n", - " df = pd.DataFrame(parsed, columns=[\"ncalls\", \"tottime\", \"percall1\", \"cumtime\", \"percall2\", \"location\"])\n", - " df[[\"tottime\", \"cumtime\"]] = df[[\"tottime\", \"cumtime\"]].astype(float)\n", - "\n", - " total_time = df[\"cumtime\"].max()\n", - " df[\"% of cumtime\"] = (df[\"cumtime\"] / total_time * 100).round(2)\n", - " df[\"% of tottime\"] = (df[\"tottime\"] / total_time * 100).round(2)\n", - " return df\n", - "parse_cprofile(stats, sort_by='cumtime', top_n=20)" - ] - }, - { - "cell_type": "code", - "execution_count": 111, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[(Timestamp('2024-06-10 00:00:00'), 10.0)]" - ] - }, - "execution_count": 111, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "splits = evb_backtest.risk_manager.splits['NVDA']\n", - "adjust = []\n", - "for s in splits:\n", - " if date_inbetween(s[0], evb_backtest.start_date, evb_backtest.end_date):\n", - " adjust.append(s)\n", - "adjust" - ] - }, - { - "cell_type": "code", - "execution_count": 61, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 61, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "def _get_split_dates(self):\n", - " \"\"\"\n", - " Create a cache of split dates for all symbols in the bars.\n", - " \"\"\"\n", - " base = Path(os.environ['WORK_DIR'])/'.cache'/'split_names_dates'\n", - " if base.exists():\n", - " split_names_dates = CustomCache(base.parent, fname = 'split_names_dates', expiry = 1000)\n", - " for s in self.bars.symbol_list:\n", - " if s not in split_names_dates.keys():\n", - " split_names_dates[s] = find_split_dates_within_range(\n", - " tick = s,\n", - " start= '2000-01-01',\n", - " end= datetime.today().strftime('%Y-%m-%d'),\n", - " )\n", - " else:\n", - " split_names_dates = {\n", - " t: find_split_dates_within_range(\n", - " tick = t,\n", - " start= '2000-01-01',\n", - " end= datetime.today().strftime('%Y-%m-%d'),\n", - " ) for t in (self.bars.symbol_list)}\n", - " split_names_dates = CustomCache(base.parent, fname = 'split_names_dates', expiry = 1000, data = split_names_dates)\n", - " return split_names_dates\n", - "\n", - "_get_split_dates(evb_backtest.risk_manager)" - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 58, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "http://127.0.0.1:25510/v2/hist/option/eod?end_date=20241231&root=NFLX&use_csv=true&exp=20240621&right=C&start_date=20240103&strike=530000\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
OpenHighLowCloseVolumeBid_sizeCloseBidAsk_sizeCloseAskMidpointWeighted_midpoint
Datetime
2024-01-03 16:00:0027.8027.8027.1827.184826.25627.1526.70026.635714
2024-01-04 16:00:0027.6528.7027.6528.707128.501128.9528.72528.912500
2024-01-05 16:00:0029.0029.0027.7227.76211127.752028.1027.92527.975806
2024-01-08 16:00:000.000.000.000.0001031.401131.9031.65031.661905
2024-01-09 16:00:000.000.000.000.0002729.952230.6030.27530.241837
....................................
2024-06-14 16:00:000.000.000.000.00025138.4524141.55140.000139.968367
2024-06-17 16:00:000.000.000.000.00025142.4525150.00146.225146.225000
2024-06-18 16:00:00156.40156.40155.88155.88550152.1550160.00156.075156.075000
2024-06-20 16:00:000.000.000.000.00054145.8050153.70149.750149.598077
2024-06-21 16:00:00153.22154.87153.22154.8725152.002160.70156.350154.485714
\n", - "

118 rows × 11 columns

\n", - "
" - ], - "text/plain": [ - " Open High Low Close Volume Bid_size \\\n", - "Datetime \n", - "2024-01-03 16:00:00 27.80 27.80 27.18 27.18 4 8 \n", - "2024-01-04 16:00:00 27.65 28.70 27.65 28.70 7 1 \n", - "2024-01-05 16:00:00 29.00 29.00 27.72 27.76 21 11 \n", - "2024-01-08 16:00:00 0.00 0.00 0.00 0.00 0 10 \n", - "2024-01-09 16:00:00 0.00 0.00 0.00 0.00 0 27 \n", - "... ... ... ... ... ... ... \n", - "2024-06-14 16:00:00 0.00 0.00 0.00 0.00 0 25 \n", - "2024-06-17 16:00:00 0.00 0.00 0.00 0.00 0 25 \n", - "2024-06-18 16:00:00 156.40 156.40 155.88 155.88 5 50 \n", - "2024-06-20 16:00:00 0.00 0.00 0.00 0.00 0 54 \n", - "2024-06-21 16:00:00 153.22 154.87 153.22 154.87 2 5 \n", - "\n", - " CloseBid Ask_size CloseAsk Midpoint Weighted_midpoint \n", - "Datetime \n", - "2024-01-03 16:00:00 26.25 6 27.15 26.700 26.635714 \n", - "2024-01-04 16:00:00 28.50 11 28.95 28.725 28.912500 \n", - "2024-01-05 16:00:00 27.75 20 28.10 27.925 27.975806 \n", - "2024-01-08 16:00:00 31.40 11 31.90 31.650 31.661905 \n", - "2024-01-09 16:00:00 29.95 22 30.60 30.275 30.241837 \n", - "... ... ... ... ... ... \n", - "2024-06-14 16:00:00 138.45 24 141.55 140.000 139.968367 \n", - "2024-06-17 16:00:00 142.45 25 150.00 146.225 146.225000 \n", - "2024-06-18 16:00:00 152.15 50 160.00 156.075 156.075000 \n", - "2024-06-20 16:00:00 145.80 50 153.70 149.750 149.598077 \n", - "2024-06-21 16:00:00 152.00 2 160.70 156.350 154.485714 \n", - "\n", - "[118 rows x 11 columns]" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "retrieve_eod_ohlc(\n", - " symbol=op_manager.symbol,\n", - " start_date=evb_backtest.start_date,\n", - " end_date=evb_backtest.end_date,\n", - " strike=op_manager.strike,\n", - " exp=op_manager.exp,\n", - " right=op_manager.right,\n", - " print_url=True\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## FUNCTION TESTS" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### PRODUCE ORDER CANDIDTATES" - ] - }, - { - "cell_type": "code", - "execution_count": 119, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Using Old DataManager\n" - ] - } - ], - "source": [ - "from EventDriven.riskmanager.utils import produce_order_candidates, populate_cache\n", - "# 66\t502\t533\t184.864771\t183.419998\t-95.355022\t-0.007815\t2024-01-03\t2024-02-16\t44\tAAPL\n", - "# start = pd.to_datetime('2023-06-22').strftime('%Y-%m-%d')\n", - "sig_date = pd.to_datetime('2024-01-03').strftime('%Y-%m-%d')\n", - "tick = 'AAPL'\n", - "signal_id = f'{tick}{pd.to_datetime(sig_date).strftime(\"%Y%m%d\")}LONG'\n", - "order = {'type': 'naked',\n", - " 'specifics': [{'direction': 'long',\n", - " 'rel_strike': .85,\n", - " 'dte': 365,\n", - " 'moneyness_width': 0.10},\n", - " {'direction': 'short',\n", - " 'rel_strike': .80,\n", - " 'dte': 365,\n", - " 'moneyness_width': 0.10}\n", - "],\n", - " 'name': 'vertical_spread'}\n", - "\n", - "# cprofiled_get_order = cProfiler(evb_backtest.risk_manager.get_order)\n", - "# returned_order=cprofiled_get_order(\n", - "# tick=tick,\n", - "# date=start.strftime('%Y-%m-%d'),\n", - "# right='C',\n", - "# order_settings=order,\n", - "# max_close=2,\n", - "# signal_id=signal_id,\n", - "# )\n", - "\n", - "order_candidates = produce_order_candidates(\n", - " order,\n", - " tick,\n", - " sig_date,\n", - " 'C'\n", - ")\n", - "# order_candidates" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "##### POPULATE CACHE" - ] - }, - { - "cell_type": "code", - "execution_count": 100, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Using Old DataManager\n", - "Using V2\n", - "Looks like our young fellow is targetting: 2024-01-03\n", - "['AAPL20250117C195', 'AAPL20250117C195', 'AAPL20250117C200', 'AAPL20250117C200', 'AAPL20250117C205', 'AAPL20250117C205', 'AAPL20250117C210', 'AAPL20250117C210', 'AAPL20250117C215', 'AAPL20250117C215', 'AAPL20250117C220', 'AAPL20250117C220', 'AAPL20250117C225', 'AAPL20250117C225', 'AAPL20250117C230', 'AAPL20250117C230', 'AAPL20250117C235', 'AAPL20250117C235', 'AAPL20250117C240', 'AAPL20250117C240', 'AAPL20250117C245', 'AAPL20250117C245', 'AAPL20250117C205', 'AAPL20250117C205', 'AAPL20250117C210', 'AAPL20250117C210', 'AAPL20250117C215', 'AAPL20250117C215', 'AAPL20250117C220', 'AAPL20250117C220', 'AAPL20250117C225', 'AAPL20250117C225', 'AAPL20250117C230', 'AAPL20250117C230', 'AAPL20250117C235', 'AAPL20250117C235', 'AAPL20250117C240', 'AAPL20250117C240', 'AAPL20250117C245', 'AAPL20250117C245', 'AAPL20250117C250', 'AAPL20250117C250', 'AAPL20250117C255', 'AAPL20250117C255', 'AAPL20250117C260', 'AAPL20250117C260']\n", - "Now, my dear friend, we are done\n" - ] - } - ], - "source": [ - "populate_cache(\n", - " evb_backtest.risk_manager.start_date,\n", - " evb_backtest.risk_manager.end_date,\n", - " order_candidates,\n", - " sig_date,\n", - ")\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### RISK MANAGER GET ORDER" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "## ***Signal ID: AAPL20240103LONG***" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Using V2\n", - "Looks like our young fellow is targetting: 2024-01-03\n", - "Now, my dear friend, we are done\n", - "Order Produced: {'result': 'SUCCESSFUL', 'data': {'long': ['AAPL20250117C225'], 'short': ['AAPL20250117C235'], 'trade_id': '&L:AAPL20250117C225&S:AAPL20250117C235', 'close': 1.9500000000000002}}\n", - "Position ID: &L:AAPL20250117C225&S:AAPL20250117C235\n", - "Calculating Position Greeks\n", - "Calculate Greeks dates\n", - "Start Date: 2024-01-03 00:00:00\n", - "End Date: 2024-12-31 00:00:00\n", - "2025-05-23 16:10:04 DataManager.py CRITICAL: Extra Cols not implemented for BS Greeks\n", - "Calculate Greeks dates\n", - "Start Date: 2024-01-03 00:00:00\n", - "End Date: 2024-12-31 00:00:00\n", - "2025-05-23 16:10:04 DataManager.py CRITICAL: Extra Cols not implemented for BS Greeks\n", - "Updating Signal Limits\n", - "Spot Price at Purchase: 184.25 at time 2024-01-03 00:00:00\n", - "Delta at Purchase: 0.0697741230044624\n", - "Equivalent Delta Size: 0.36, with Cash Available: 1610.1759002667368, and Leverage: 4.5\n", - "Equivalent Delta Size: 0.36\n", - "Calculating Quantity\n", - "Spot Price at Purchase: 184.25 at time 2024-01-03 00:00:00\n", - "Cash Available: 1610.1759002667368, Option Price: 1.9500000000000002, Cash_Available/OptPRice: 8.257312309060188\n", - "Target Delta: 0.36\n", - "Delta from Full Cash Spend: 0.5581929840356992, Size: 8\n", - "Delta with Size Limit: 0.348870615022312, Size: 5\n", - "Quantity for Position (&L:AAPL20250117C225&S:AAPL20250117C235): 5\n", - "{'result': 'SUCCESSFUL', 'data': {'long': ['AAPL20250117C225'], 'short': ['AAPL20250117C235'], 'trade_id': '&L:AAPL20250117C225&S:AAPL20250117C235', 'close': 1.9500000000000002, 'quantity': 5}}\n" - ] - } - ], - "source": [ - "\n", - "tgt_date = pd.to_datetime('2024-01-03')\n", - "sig_date = pd.to_datetime('2024-01-03').strftime('%Y-%m-%d')\n", - "tick = 'AAPL'\n", - "signal_id = f'{tick}{pd.to_datetime(sig_date).strftime(\"%Y%m%d\")}LONG'\n", - "order = {'type': 'naked',\n", - " 'specifics': [{'direction': 'long',\n", - " 'rel_strike': .85,\n", - " 'dte': 365,\n", - " 'moneyness_width': 0.10},\n", - " {'direction': 'short',\n", - " 'rel_strike': .80,\n", - " 'dte': 365,\n", - " 'moneyness_width': 0.10}\n", - "],\n", - " 'name': 'vertical_spread'}\n", - "\n", - "cprofiled_get_order = cProfiler(evb_backtest.risk_manager.get_order)\n", - "returned_order=cprofiled_get_order(\n", - " tick=tick,\n", - " date=tgt_date.strftime('%Y-%m-%d'),\n", - " right='C',\n", - " order_settings=order,\n", - " max_close=2,\n", - " signal_id=signal_id,\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## To - Do:\n", - "\n", - "- Add more info on actions:\n", - " - Raw Actions: Saves the dict from greek, dte, moneyness\n", - " - Add current greek, greek limit, adjusted greek to the Greek dict.\n", - " \n", - "- Take start and end into consideration when using cache. This is to ensure we don't use stale data (not updated) on diffent timelines of the backtest\n", - " - Rather, we could still keep OptTick key, but update the data in the cache." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['&L:BA20240119C225&S:BA20240119C230',\n", - " '&L:NVDA20240119C205&S:NVDA20240119C210',\n", - " '&L:NFLX20240119C455&S:NFLX20240119C460',\n", - " '&L:AMD20240119C100&S:AMD20240119C105',\n", - " '&L:AAPL20240119C170&S:AAPL20240119C175',\n", - " '&L:AAPL20240315C170&S:AAPL20240315C175',\n", - " '&L:AMZN20240315C135&S:AMZN20240315C145',\n", - " '&L:SBUX20240621C115&S:SBUX20240621C120']" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.risk_manager.position_data.keys()" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
TickerPnLReturnPctEntryPriceEntryCommissionEntrySlippageEntryMarketValueTotalEntryCostAuxilaryEntryCostExitPriceExitCommissionExitSlippageExitMarketValueTotalExitCostAuxilaryExitCostQuantityEntryTimeExitTimeDurationPositionsSignalID
0BA-47.580859-0.119904198.4117992.69.223598394.2235983.96823611.823598174.6213702.6-18.157261351.8427393.49242720.75726122023-01-042023-09-11250.0&L:BA20240119C225&S:BA20240119C230BA20230104LONG
1NVDA4054.8783231.350036200.23549319.5171.5323942984.03239430.035324191.032394470.56071419.5-347.0892847077.91071670.584107366.589284152023-01-192023-12-29344.0&L:NVDA20240119C205&S:NVDA20240119C210NVDA20230119LONG
2NFLX-385.466244-0.409836156.7562437.832.737460932.7374609.40537540.53746092.5118697.8-22.128784562.8712165.55071229.92878462023-01-242023-09-27246.0&L:NFLX20240119C455&S:NFLX20240119C460NFLX20230124LONG
3META1187.5777171.610206184.3828595.222.331434732.3314347.37531427.531434481.2772885.2-49.6908491930.30915119.25109254.89084942023-01-302023-12-29333.0&L:META20240119C165&S:META20240119C170META20230130LONG
4AMD575.7401170.251517176.08261316.9127.1739712272.17397122.890740144.073971220.37031416.9-108.2859122881.71408828.648141125.185912132023-02-022023-09-21231.0&L:AMD20240119C100&S:AMD20240119C105AMD20230202LONG
5AAPL-399.947817-0.220432201.59794511.7115.1815081802.68150818.143815126.881508157.15929911.7-58.8663091426.13369114.14433770.56630992023-02-032023-02-2724.0&L:AAPL20240119C170&S:AAPL20240119C175AAPL20230203LONG
6AAPL559.4207190.360845193.78856410.439.9085081539.90850815.50308550.308508263.71615310.4-59.8707722120.12922821.09729270.27077282023-03-062023-10-26234.0&L:AAPL20240315C170&S:AAPL20240315C175AAPL20230306LONG
7AMZN524.8731370.443082197.4324797.881.7948711176.79487111.84594989.594871284.9113357.8-37.7319921717.26800817.09468045.53199262023-04-282023-10-26181.0&L:AMZN20240315C135&S:AMZN20240315C145AMZN20230428LONG
8SBUXNaNNaN208.31745013.0120.1744952070.17449520.831745133.174495NaNNaNNaNNaNNaNNaN102023-05-05NaTNaN&L:SBUX20240621C115&S:SBUX20240621C120SBUX20230418LONG
\n", - "
" - ], - "text/plain": [ - " Ticker PnL ReturnPct EntryPrice EntryCommission EntrySlippage \\\n", - "0 BA -47.580859 -0.119904 198.411799 2.6 9.223598 \n", - "1 NVDA 4054.878323 1.350036 200.235493 19.5 171.532394 \n", - "2 NFLX -385.466244 -0.409836 156.756243 7.8 32.737460 \n", - "3 META 1187.577717 1.610206 184.382859 5.2 22.331434 \n", - "4 AMD 575.740117 0.251517 176.082613 16.9 127.173971 \n", - "5 AAPL -399.947817 -0.220432 201.597945 11.7 115.181508 \n", - "6 AAPL 559.420719 0.360845 193.788564 10.4 39.908508 \n", - "7 AMZN 524.873137 0.443082 197.432479 7.8 81.794871 \n", - "8 SBUX NaN NaN 208.317450 13.0 120.174495 \n", - "\n", - " EntryMarketValue TotalEntryCost AuxilaryEntryCost ExitPrice \\\n", - "0 394.223598 3.968236 11.823598 174.621370 \n", - "1 2984.032394 30.035324 191.032394 470.560714 \n", - "2 932.737460 9.405375 40.537460 92.511869 \n", - "3 732.331434 7.375314 27.531434 481.277288 \n", - "4 2272.173971 22.890740 144.073971 220.370314 \n", - "5 1802.681508 18.143815 126.881508 157.159299 \n", - "6 1539.908508 15.503085 50.308508 263.716153 \n", - "7 1176.794871 11.845949 89.594871 284.911335 \n", - "8 2070.174495 20.831745 133.174495 NaN \n", - "\n", - " ExitCommission ExitSlippage ExitMarketValue TotalExitCost \\\n", - "0 2.6 -18.157261 351.842739 3.492427 \n", - "1 19.5 -347.089284 7077.910716 70.584107 \n", - "2 7.8 -22.128784 562.871216 5.550712 \n", - "3 5.2 -49.690849 1930.309151 19.251092 \n", - "4 16.9 -108.285912 2881.714088 28.648141 \n", - "5 11.7 -58.866309 1426.133691 14.144337 \n", - "6 10.4 -59.870772 2120.129228 21.097292 \n", - "7 7.8 -37.731992 1717.268008 17.094680 \n", - "8 NaN NaN NaN NaN \n", - "\n", - " AuxilaryExitCost Quantity EntryTime ExitTime Duration \\\n", - "0 20.757261 2 2023-01-04 2023-09-11 250.0 \n", - "1 366.589284 15 2023-01-19 2023-12-29 344.0 \n", - "2 29.928784 6 2023-01-24 2023-09-27 246.0 \n", - "3 54.890849 4 2023-01-30 2023-12-29 333.0 \n", - "4 125.185912 13 2023-02-02 2023-09-21 231.0 \n", - "5 70.566309 9 2023-02-03 2023-02-27 24.0 \n", - "6 70.270772 8 2023-03-06 2023-10-26 234.0 \n", - "7 45.531992 6 2023-04-28 2023-10-26 181.0 \n", - "8 NaN 10 2023-05-05 NaT NaN \n", - "\n", - " Positions SignalID \n", - "0 &L:BA20240119C225&S:BA20240119C230 BA20230104LONG \n", - "1 &L:NVDA20240119C205&S:NVDA20240119C210 NVDA20230119LONG \n", - "2 &L:NFLX20240119C455&S:NFLX20240119C460 NFLX20230124LONG \n", - "3 &L:META20240119C165&S:META20240119C170 META20230130LONG \n", - "4 &L:AMD20240119C100&S:AMD20240119C105 AMD20230202LONG \n", - "5 &L:AAPL20240119C170&S:AAPL20240119C175 AAPL20230203LONG \n", - "6 &L:AAPL20240315C170&S:AAPL20240315C175 AAPL20230306LONG \n", - "7 &L:AMZN20240315C135&S:AMZN20240315C145 AMZN20230428LONG \n", - "8 &L:SBUX20240621C115&S:SBUX20240621C120 SBUX20230418LONG " - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.portfolio.trades" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'&L:BA20240119C225&S:BA20240119C230': HOLD(&L:BA20240119C225&S:BA20240119C230) Reason: dte),\n", - " '&L:NVDA20240119C205&S:NVDA20240119C210': HOLD(&L:NVDA20240119C205&S:NVDA20240119C210) Reason: dte),\n", - " '&L:NFLX20240119C455&S:NFLX20240119C460': HOLD(&L:NFLX20240119C455&S:NFLX20240119C460) Reason: dte),\n", - " '&L:META20240119C165&S:META20240119C170': HOLD(&L:META20240119C165&S:META20240119C170) Reason: dte),\n", - " '&L:AMD20240119C100&S:AMD20240119C105': HOLD(&L:AMD20240119C100&S:AMD20240119C105) Reason: dte)}" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "tmp = pd.Timestamp(('2023-02-02 00:00:00'))\n", - "evb_backtest.risk_manager._actions[tmp]" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "from pprint import pprint\n", - "actions = evb_backtest.risk_manager.actions.copy()\n", - "# actions[~actions['&L:NFLX20240119C455&S:NFLX20240119C460'].isna()].tail(50)\n", - "# idx = [k for k.keys() in evb_backtest.risk_manager._actions]\n", - "# actions = [v for v in evb_backtest.risk_manager._actions.values]\n", - "# print(actions)#[~actions['&L:BA20240119C225&S:BA20240119C230'].isna()].tail(50)['&L:BA20240119C225&S:BA20240119C230'].values[-1])\n" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
VegaVannaVolgaDeltaGammaThetaRhoMidpointsrys0_close
Datetime
2023-03-070.000158-0.204612-9.8015340.058631-0.000241-0.0004740.0521092.0250.00.00.00.0
2023-03-080.002083-0.200509-11.2806940.060319-0.000317-0.0006600.0526262.1000.00.00.00.0
2023-03-090.006826-0.166657-13.5513920.059064-0.000065-0.0006710.0524051.8500.00.00.00.0
2023-03-100.008656-0.147948-13.9943580.0573890.000116-0.0005950.0517051.6750.00.00.00.0
2023-03-130.011035-0.150727-15.6442980.0601510.000094-0.0007430.0540071.7250.00.00.00.0
.......................................
2023-12-250.0409980.112964-8.4191910.0703760.004351-0.0027860.0300980.665NaN0.00.0NaN
2023-12-260.0460730.106544-10.7679690.0795950.004482-0.0034920.0333070.7800.00.00.00.0
2023-12-270.0410470.126353-7.3569040.0692720.004599-0.0027880.0289590.6250.00.00.00.0
2023-12-280.0449620.112180-10.2170620.0779620.004645-0.0033000.0324700.7400.00.00.00.0
2023-12-290.0481170.106621-11.6688220.0834440.004645-0.0037500.0344770.8150.00.00.00.0
\n", - "

214 rows × 12 columns

\n", - "
" - ], - "text/plain": [ - " Vega Vanna Volga Delta Gamma Theta \\\n", - "Datetime \n", - "2023-03-07 0.000158 -0.204612 -9.801534 0.058631 -0.000241 -0.000474 \n", - "2023-03-08 0.002083 -0.200509 -11.280694 0.060319 -0.000317 -0.000660 \n", - "2023-03-09 0.006826 -0.166657 -13.551392 0.059064 -0.000065 -0.000671 \n", - "2023-03-10 0.008656 -0.147948 -13.994358 0.057389 0.000116 -0.000595 \n", - "2023-03-13 0.011035 -0.150727 -15.644298 0.060151 0.000094 -0.000743 \n", - "... ... ... ... ... ... ... \n", - "2023-12-25 0.040998 0.112964 -8.419191 0.070376 0.004351 -0.002786 \n", - "2023-12-26 0.046073 0.106544 -10.767969 0.079595 0.004482 -0.003492 \n", - "2023-12-27 0.041047 0.126353 -7.356904 0.069272 0.004599 -0.002788 \n", - "2023-12-28 0.044962 0.112180 -10.217062 0.077962 0.004645 -0.003300 \n", - "2023-12-29 0.048117 0.106621 -11.668822 0.083444 0.004645 -0.003750 \n", - "\n", - " Rho Midpoint s r y s0_close \n", - "Datetime \n", - "2023-03-07 0.052109 2.025 0.0 0.0 0.0 0.0 \n", - "2023-03-08 0.052626 2.100 0.0 0.0 0.0 0.0 \n", - "2023-03-09 0.052405 1.850 0.0 0.0 0.0 0.0 \n", - "2023-03-10 0.051705 1.675 0.0 0.0 0.0 0.0 \n", - "2023-03-13 0.054007 1.725 0.0 0.0 0.0 0.0 \n", - "... ... ... ... ... ... ... \n", - "2023-12-25 0.030098 0.665 NaN 0.0 0.0 NaN \n", - "2023-12-26 0.033307 0.780 0.0 0.0 0.0 0.0 \n", - "2023-12-27 0.028959 0.625 0.0 0.0 0.0 0.0 \n", - "2023-12-28 0.032470 0.740 0.0 0.0 0.0 0.0 \n", - "2023-12-29 0.034477 0.815 0.0 0.0 0.0 0.0 \n", - "\n", - "[214 rows x 12 columns]" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# get_cache('close')\n", - "evb_backtest.risk_manager.position_data['&L:SBUX20240621C110&S:SBUX20240621C115']" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Analyzing Positions on 2023-01-04 00:00:00\n", - "Checking DTE on 2023-01-04 00:00:00\n", - "Roll Dict {'&L:BA20240119C225&S:BA20240119C230': 'HOLD'}\n", - "Checking Moneyness on 2023-01-04 00:00:00\n", - "Moneyness Dict {'&L:BA20240119C225&S:BA20240119C230': 'HOLD'}\n", - "Checking Limits on 2023-01-04 00:00:00\n", - "Delta for Position &L:BA20240119C225&S:BA20240119C230 is within limits\n", - "Greek Dict {'&L:BA20240119C225&S:BA20240119C230': {'vega': {'status': False, 'quantity_diff': 0}, 'gamma': {'status': False, 'quantity_diff': 0}, 'delta': {'status': False, 'quantity_diff': 0}, 'theta': {'status': False, 'quantity_diff': 0}}}\n" - ] - }, - { - "data": { - "text/plain": [ - "{'&L:BA20240119C225&S:BA20240119C230': HOLD(&L:BA20240119C225&S:BA20240119C230)}" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.risk_manager.analyze_position()\n", - "# evb_backtest.portfolio.current_positions" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [], - "source": [ - "evb_backtest.risk_manager.limits['delta'] = False" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
SizeEntryBarExitBarEntryPriceExitPricePnLReturnPctEntryTimeExitTimeDurationTicker
0105504551103.049417100.110001-308.638768-0.0285242023-01-042023-03-1469SBUX
112504675195.863123213.759995214.7624620.0913742023-01-042023-09-11250BA
289451475217.09562549.81300029249.3327401.9137862023-01-192023-12-29344NVDA
314517687358.781354382.399994330.6609620.0658302023-01-242023-09-27246NFLX
426521752149.932939358.9899905435.4833411.3943372023-01-302023-12-29333META
....................................
1496717735104.10308897.379997-645.416698-0.0645812023-11-082023-12-0527SBUX
15120718752114.499348149.5000004200.0781840.3056842023-11-092023-12-2950AMD
1646721752145.507500153.100006349.2552810.0521792023-11-142023-12-2945AMZN
1740722752240.127508255.100006598.8999140.0623522023-11-152023-12-2944TSLA
1812728752221.382136260.670013471.4545340.1774662023-11-242023-12-2935BA
\n", - "

19 rows × 11 columns

\n", - "
" - ], - "text/plain": [ - " Size EntryBar ExitBar EntryPrice ExitPrice PnL ReturnPct \\\n", - "0 105 504 551 103.049417 100.110001 -308.638768 -0.028524 \n", - "1 12 504 675 195.863123 213.759995 214.762462 0.091374 \n", - "2 894 514 752 17.095625 49.813000 29249.332740 1.913786 \n", - "3 14 517 687 358.781354 382.399994 330.660962 0.065830 \n", - "4 26 521 752 149.932939 358.989990 5435.483341 1.394337 \n", - ".. ... ... ... ... ... ... ... \n", - "14 96 717 735 104.103088 97.379997 -645.416698 -0.064581 \n", - "15 120 718 752 114.499348 149.500000 4200.078184 0.305684 \n", - "16 46 721 752 145.507500 153.100006 349.255281 0.052179 \n", - "17 40 722 752 240.127508 255.100006 598.899914 0.062352 \n", - "18 12 728 752 221.382136 260.670013 471.454534 0.177466 \n", - "\n", - " EntryTime ExitTime Duration Ticker \n", - "0 2023-01-04 2023-03-14 69 SBUX \n", - "1 2023-01-04 2023-09-11 250 BA \n", - "2 2023-01-19 2023-12-29 344 NVDA \n", - "3 2023-01-24 2023-09-27 246 NFLX \n", - "4 2023-01-30 2023-12-29 333 META \n", - ".. ... ... ... ... \n", - "14 2023-11-08 2023-12-05 27 SBUX \n", - "15 2023-11-09 2023-12-29 50 AMD \n", - "16 2023-11-14 2023-12-29 45 AMZN \n", - "17 2023-11-15 2023-12-29 44 TSLA \n", - "18 2023-11-24 2023-12-29 35 BA \n", - "\n", - "[19 rows x 11 columns]" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "trades_" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Generating order for BA at 2023-01-04 00:00:00 index 1\n" - ] - }, - { - "data": { - "text/markdown": [ - "## ***Signal ID: BA20230104LONG***" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Using V2\n", - "Looks like our young fellow is targetting: 2023-01-04\n", - "Generating Data for BA 2024-01-19 00:00:00\n", - "Data Is_complete bool: True\n", - "Actually! We are not done yet. We need to get the spot prices for the requested date\n", - "Now, my dear friend, we are done\n", - "Order Produced: {'result': 'SUCCESSFUL', 'data': {'long': ['BA20240119C220'], 'short': ['BA20240119C290'], 'trade_id': '&L:BA20240119C220&S:BA20240119C290', 'close': 19.75}}\n", - "Position ID: &L:BA20240119C220&S:BA20240119C290\n", - "Calculating Position Greeks\n", - "Calculate Greeks dates\n", - "Start Date: 2023-01-04 00:00:00\n", - "End Date: 2023-12-29 00:00:00\n", - "2025-05-18 20:38:01 DataManager.py CRITICAL: Extra Cols not implemented for BS Greeks\n", - "Calculate Greeks dates\n", - "Start Date: 2023-01-04 00:00:00\n", - "End Date: 2023-12-29 00:00:00\n", - "2025-05-18 20:38:01 DataManager.py CRITICAL: Extra Cols not implemented for BS Greeks\n" - ] - }, - { - "ename": "KeyboardInterrupt", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[35], line 31\u001b[0m\n\u001b[1;32m 19\u001b[0m order \u001b[38;5;241m=\u001b[39m {\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mtype\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mnaked\u001b[39m\u001b[38;5;124m'\u001b[39m,\n\u001b[1;32m 20\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mspecifics\u001b[39m\u001b[38;5;124m'\u001b[39m: [{\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mdirection\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlong\u001b[39m\u001b[38;5;124m'\u001b[39m,\n\u001b[1;32m 21\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mrel_strike\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[38;5;241m.85\u001b[39m,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 28\u001b[0m ],\n\u001b[1;32m 29\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mname\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mvertical_spread\u001b[39m\u001b[38;5;124m'\u001b[39m}\n\u001b[1;32m 30\u001b[0m cprofiled_get_order \u001b[38;5;241m=\u001b[39m cProfiler(evb_backtest\u001b[38;5;241m.\u001b[39mrisk_manager\u001b[38;5;241m.\u001b[39mget_order)\n\u001b[0;32m---> 31\u001b[0m returned_order\u001b[38;5;241m=\u001b[39m\u001b[43mcprofiled_get_order\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 32\u001b[0m \u001b[43m \u001b[49m\u001b[43mtick\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtick\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 33\u001b[0m \u001b[43m \u001b[49m\u001b[43mdate\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstart\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstrftime\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43m%\u001b[39;49m\u001b[38;5;124;43mY-\u001b[39;49m\u001b[38;5;124;43m%\u001b[39;49m\u001b[38;5;124;43mm-\u001b[39;49m\u001b[38;5;132;43;01m%d\u001b[39;49;00m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 34\u001b[0m \u001b[43m \u001b[49m\u001b[43mright\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mC\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 35\u001b[0m \u001b[43m \u001b[49m\u001b[43morder_settings\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43morder\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 36\u001b[0m \u001b[43m \u001b[49m\u001b[43mmax_close\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m20\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 37\u001b[0m \u001b[43m \u001b[49m\u001b[43msignal_id\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msignal_id\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 38\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 39\u001b[0m all_orders[signal_id] \u001b[38;5;241m=\u001b[39m returned_order\n\u001b[1;32m 40\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n", - "File \u001b[0;32m~/cloned_repos/QuantTools/trade/helpers/decorators.py:72\u001b[0m, in \u001b[0;36mcProfiler..wrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 70\u001b[0m profiler \u001b[38;5;241m=\u001b[39m cProfile\u001b[38;5;241m.\u001b[39mProfile()\n\u001b[1;32m 71\u001b[0m profiler\u001b[38;5;241m.\u001b[39menable()\n\u001b[0;32m---> 72\u001b[0m results \u001b[38;5;241m=\u001b[39m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 73\u001b[0m profiler\u001b[38;5;241m.\u001b[39mdisable()\n\u001b[1;32m 74\u001b[0m stream \u001b[38;5;241m=\u001b[39m io\u001b[38;5;241m.\u001b[39mStringIO()\n", - "File \u001b[0;32m~/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:371\u001b[0m, in \u001b[0;36mRiskManager.get_order\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 369\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mPosition ID: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mposition_id\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 370\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mCalculating Position Greeks\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m--> 371\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcalculate_position_greeks\u001b[49m\u001b[43m(\u001b[49m\u001b[43mposition_id\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mdate\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 372\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mUpdating Signal Limits\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m 373\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mupdate_greek_limits(signalID, position_id)\n", - "File \u001b[0;32m~/cloned_repos/QuantTools/trade/helpers/decorators.py:14\u001b[0m, in \u001b[0;36mlog_time..decorator..wrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[38;5;129m@wraps\u001b[39m(func)\n\u001b[1;32m 12\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mwrapper\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 13\u001b[0m start \u001b[38;5;241m=\u001b[39m time\u001b[38;5;241m.\u001b[39mtime()\n\u001b[0;32m---> 14\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 15\u001b[0m end \u001b[38;5;241m=\u001b[39m time\u001b[38;5;241m.\u001b[39mtime()\n\u001b[1;32m 16\u001b[0m logger\u001b[38;5;241m.\u001b[39minfo(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mfunc\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__name__\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m took \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mend\u001b[38;5;250m \u001b[39m\u001b[38;5;241m-\u001b[39m\u001b[38;5;250m \u001b[39mstart\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m seconds\u001b[39m\u001b[38;5;124m'\u001b[39m)\n", - "File \u001b[0;32m~/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:460\u001b[0m, in \u001b[0;36mRiskManager.calculate_position_greeks\u001b[0;34m(self, positionID, date)\u001b[0m\n\u001b[1;32m 457\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m \u001b[38;5;28minput\u001b[39m, list_ \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mzip\u001b[39m([data_manager, s, r, y, s0_close, _set[\u001b[38;5;241m0\u001b[39m]], thread_input_list):\n\u001b[1;32m 458\u001b[0m list_\u001b[38;5;241m.\u001b[39mappend(\u001b[38;5;28minput\u001b[39m)\n\u001b[0;32m--> 460\u001b[0m \u001b[43mrunThreads\u001b[49m\u001b[43m(\u001b[49m\u001b[43mget_timeseries\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mthread_input_list\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 462\u001b[0m position_data \u001b[38;5;241m=\u001b[39m \u001b[38;5;28msum\u001b[39m(long) \u001b[38;5;241m-\u001b[39m \u001b[38;5;28msum\u001b[39m(short)\n\u001b[1;32m 463\u001b[0m position_data \u001b[38;5;241m=\u001b[39m position_data[\u001b[38;5;241m~\u001b[39mposition_data\u001b[38;5;241m.\u001b[39mindex\u001b[38;5;241m.\u001b[39mduplicated(keep \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mfirst\u001b[39m\u001b[38;5;124m'\u001b[39m)]\n", - "File \u001b[0;32m~/cloned_repos/QuantTools/trade/helpers/threads.py:32\u001b[0m, in \u001b[0;36mrunThreads\u001b[0;34m(func, OrderedInputs, run_type, block, thread_name_prefix)\u001b[0m\n\u001b[1;32m 30\u001b[0m results \u001b[38;5;241m=\u001b[39m []\n\u001b[1;32m 31\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m block:\n\u001b[0;32m---> 32\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mwith\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mThreadPoolExecutor\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmax_workers\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mnum_threads\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mthread_name_prefix\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mthread_name_prefix\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mas\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mexecutor\u001b[49m\u001b[43m:\u001b[49m\n\u001b[1;32m 33\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mrun_type\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m==\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mmap\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m:\u001b[49m\n\u001b[1;32m 34\u001b[0m \u001b[43m \u001b[49m\u001b[43mresults\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mexecutor\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmap\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfunc\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mOrderedInputs\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:647\u001b[0m, in \u001b[0;36mExecutor.__exit__\u001b[0;34m(self, exc_type, exc_val, exc_tb)\u001b[0m\n\u001b[1;32m 646\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__exit__\u001b[39m(\u001b[38;5;28mself\u001b[39m, exc_type, exc_val, exc_tb):\n\u001b[0;32m--> 647\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mshutdown\u001b[49m\u001b[43m(\u001b[49m\u001b[43mwait\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[1;32m 648\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mFalse\u001b[39;00m\n", - "File \u001b[0;32m~/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:235\u001b[0m, in \u001b[0;36mThreadPoolExecutor.shutdown\u001b[0;34m(self, wait, cancel_futures)\u001b[0m\n\u001b[1;32m 233\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m wait:\n\u001b[1;32m 234\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m t \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_threads:\n\u001b[0;32m--> 235\u001b[0m \u001b[43mt\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mjoin\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/miniconda3/envs/openbb/lib/python3.11/threading.py:1119\u001b[0m, in \u001b[0;36mThread.join\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 1116\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mRuntimeError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcannot join current thread\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 1118\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m timeout \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m-> 1119\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_wait_for_tstate_lock\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1120\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 1121\u001b[0m \u001b[38;5;66;03m# the behavior of a negative timeout isn't documented, but\u001b[39;00m\n\u001b[1;32m 1122\u001b[0m \u001b[38;5;66;03m# historically .join(timeout=x) for x<0 has acted as if timeout=0\u001b[39;00m\n\u001b[1;32m 1123\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_wait_for_tstate_lock(timeout\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mmax\u001b[39m(timeout, \u001b[38;5;241m0\u001b[39m))\n", - "File \u001b[0;32m~/miniconda3/envs/openbb/lib/python3.11/threading.py:1139\u001b[0m, in \u001b[0;36mThread._wait_for_tstate_lock\u001b[0;34m(self, block, timeout)\u001b[0m\n\u001b[1;32m 1136\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m\n\u001b[1;32m 1138\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m-> 1139\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[43mlock\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43macquire\u001b[49m\u001b[43m(\u001b[49m\u001b[43mblock\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[43m)\u001b[49m:\n\u001b[1;32m 1140\u001b[0m lock\u001b[38;5;241m.\u001b[39mrelease()\n\u001b[1;32m 1141\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_stop()\n", - "\u001b[0;31mKeyboardInterrupt\u001b[0m: " - ] - } - ], - "source": [ - "# 66\t525\t540\t148.548104\t147.710007\t-55.314406\t-0.005642\t2023-02-03\t2023-02-27\t24\tAAPL\n", - "# clear_cache()\n", - "# \tSize\tEntryBar\tExitBar\tEntryPrice\tExitPrice\tPnL\tReturnPct\tEntryTime\tExitTime\tDuration\tTicker\n", - "# 2\t894\t514\t752\t17.095625\t49.813000\t29249.332740\t1.913786\t2023-01-19\t2023-12-29\t344\tNVDA\n", - "# 3\t14\t517\t687\t358.781354\t382.399994\t330.660962\t0.065830\t2023-01-24\t2023-09-27\t246\tNFLX\n", - "# 6\t66\t525\t540\t148.548104\t147.710007\t-55.314406\t-0.005642\t2023-02-03\t2023-02-27\t24\tAAPL\n", - "# 7\t63\t545\t708\t154.328258\t170.369995\t1010.629422\t0.103946\t2023-03-06\t2023-10-26\t234\tAAPL\n", - "# 12\t13\t704\t752\t407.049710\t490.369995\t1083.163708\t0.204693\t2023-10-20\t2023-12-29\t70\tNFLX\n", - "# 13\t61\t714\t752\t174.849846\t193.899994\t1162.059051\t0.108951\t2023-11-03\t2023-12-29\t56\tAAPL\n", - "# {'NVDA': 2, 'AAPL': 2, 'NFLX': 2})\n", - "all_orders = {}\n", - "failed_signals = {}\n", - "for index, row in trades_.iterrows():\n", - " try:\n", - " start = pd.to_datetime(row['EntryTime'])\n", - " tick = row['Ticker']\n", - " print(f\"Generating order for {tick} at {start} index {index}\")\n", - " signal_id = f'{tick}{start.strftime(\"%Y%m%d\")}LONG'\n", - " order = {'type': 'naked',\n", - " 'specifics': [{'direction': 'long',\n", - " 'rel_strike': .85,\n", - " 'dte': 365,\n", - " 'moneyness_width': 0.10},\n", - " {'direction': 'short',\n", - " 'rel_strike': .80,\n", - " 'dte': 365,\n", - " 'moneyness_width': 0.10}\n", - " ],\n", - " 'name': 'vertical_spread'}\n", - " cprofiled_get_order = cProfiler(evb_backtest.risk_manager.get_order)\n", - " returned_order=cprofiled_get_order(\n", - " tick=tick,\n", - " date=start.strftime('%Y-%m-%d'),\n", - " right='C',\n", - " order_settings=order,\n", - " max_close=20,\n", - " signal_id=signal_id,\n", - " )\n", - " all_orders[signal_id] = returned_order\n", - " except Exception as e:\n", - " print(f\"Failed to generate order for {tick} at {start} index {index}\")\n", - " failed_signals[(signal_id, start, tick)] = e\n", - "returned_order" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "from EventDriven.portfolio import OptionSignalPortfolio\n", - "from EventDriven.backtest import OptionSignalBacktest\n", - "from copy import deepcopy\n", - "from functools import partial\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# ***Extending Risk Manager for greek handling***" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### ***INITIAL BACKTEST RUN***" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
SizeEntryBarExitBarEntryPriceExitPricePnLReturnPctEntryTimeExitTimeDurationTicker
0105504551103.049417100.110001-308.638768-0.0285242023-01-042023-03-1469SBUX
314517687358.781354382.399994330.6609620.0658302023-01-242023-09-27246NFLX
426521752149.932939358.9899905435.4833411.3943372023-01-302023-12-29333META
896575587109.251048104.269997-478.180907-0.0455932023-04-182023-05-0416SBUX
1213704752407.049710490.3699951083.1637080.2046932023-10-202023-12-2970NFLX
1496717735104.10308897.379997-645.416698-0.0645812023-11-082023-12-0527SBUX
\n", - "
" - ], - "text/plain": [ - " Size EntryBar ExitBar EntryPrice ExitPrice PnL ReturnPct \\\n", - "0 105 504 551 103.049417 100.110001 -308.638768 -0.028524 \n", - "3 14 517 687 358.781354 382.399994 330.660962 0.065830 \n", - "4 26 521 752 149.932939 358.989990 5435.483341 1.394337 \n", - "8 96 575 587 109.251048 104.269997 -478.180907 -0.045593 \n", - "12 13 704 752 407.049710 490.369995 1083.163708 0.204693 \n", - "14 96 717 735 104.103088 97.379997 -645.416698 -0.064581 \n", - "\n", - " EntryTime ExitTime Duration Ticker \n", - "0 2023-01-04 2023-03-14 69 SBUX \n", - "3 2023-01-24 2023-09-27 246 NFLX \n", - "4 2023-01-30 2023-12-29 333 META \n", - "8 2023-04-18 2023-05-04 16 SBUX \n", - "12 2023-10-20 2023-12-29 70 NFLX \n", - "14 2023-11-08 2023-12-05 27 SBUX " - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import json\n", - "pd.set_option('display.max_columns', 100)\n", - "pd.set_option('display.max_rows', 100)\n", - "_key = 10\n", - "with open(f'../input/profitable_weights_{_key}.json', 'r') as f:\n", - " weights = json.load(f)\n", - "ttrades__ = pd.read_csv(f'../input/profitable_trades_{_key}.csv').iloc[:, 1:]\n", - "ttrades__['Duration'] = ttrades__.Duration.apply(lambda x: int(x.split(' ')[0]))\n", - "# AMZN20220329LONG\n", - "tick = ['NFLX', 'META','SBUX']\n", - "ttrades__ = ttrades__[(ttrades__.Ticker.isin(tick))]\n", - "trades_ = ttrades__.copy()\n", - "# trades_.loc[17, 'Size'] = -126\n", - "# ttrades__\n", - "trades_" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "('TSLA20230602LONG', Timestamp('2023-06-02 00:00:00'), 'TSLA')" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "signal_id, start, tick = list(failed_signals.keys())[0]\n", - "error = failed_signals[(signal_id, start, tick)]\n", - "# # print(error)\n", - "signal_id, start, tick\n", - "# failed_signals.values()\n", - "# signal_id" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "('TSLA20230602LONG', '2023-06-02', 'TSLA')" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "signal_id, start, tick = ('TSLA20230602LONG', ('2023-06-02'), 'TSLA')\n", - "signal_id, start, tick" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(Timestamp('2023-01-04 00:00:00'), Timestamp('2023-12-29 00:00:00'))" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.risk_manager.start_date, evb_backtest.risk_manager.end_date" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2025-05-12 20:56:04 trade.asset.Stock ERROR: Error getting dividends history for AMZN from yfinance\n", - "2025-05-12 20:56:04 trade.asset.Stock ERROR: Probably due to no dividends history\n", - "2025-05-12 20:56:19 DataManager.py ERROR: \n", - "2025-05-12 20:56:19 DataManager.py ERROR: query_thetadata raise an error: Data not found for the given parameters: {'end_date': 20230118, 'root': 'AMZN', 'use_csv': 'true', 'exp': 20240315, 'right': 'C', 'start_date': 20230104, 'strike': 115000, 'url': 'http://127.0.0.1:25510/v2/hist/option/eod?end_date=20230118&root=AMZN&use_csv=true&exp=20240315&right=C&start_date=20230104&strike=115000'}\n", - "Traceback (most recent call last):\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/decorators.py\", line 44, in wrapper\n", - " return func(*args, **kwargs)\n", - " ^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py\", line 219, in query_thetadata\n", - " data = retrieve_eod_ohlc(symbol=self.symbol, end_date=end, exp=exp, right=right, start_date=start, strike=strike, print_url=print_url)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_sync.py\", line 105, in retry\n", - " ret = target(*args, **kwargs)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py\", line 327, in retrieve_eod_ohlc\n", - " raise_thetadata_exception(response, querystring, proxy)\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaExceptions.py\", line 81, in raise_thetadata_exception\n", - " raise ThetaDataNotFound(f\"Data not found for the given parameters: {params}\")\n", - "dbase.DataAPI.ThetaExceptions.ThetaDataNotFound: Data not found for the given parameters: {'end_date': 20230118, 'root': 'AMZN', 'use_csv': 'true', 'exp': 20240315, 'right': 'C', 'start_date': 20230104, 'strike': 115000, 'url': 'http://127.0.0.1:25510/v2/hist/option/eod?end_date=20230118&root=AMZN&use_csv=true&exp=20240315&right=C&start_date=20230104&strike=115000'}\n", - "Traceback (most recent call last):\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/decorators.py\", line 44, in wrapper\n", - " return func(*args, **kwargs)\n", - " ^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py\", line 219, in query_thetadata\n", - " data = retrieve_eod_ohlc(symbol=self.symbol, end_date=end, exp=exp, right=right, start_date=start, strike=strike, print_url=print_url)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_sync.py\", line 105, in retry\n", - " ret = target(*args, **kwargs)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py\", line 327, in retrieve_eod_ohlc\n", - " raise_thetadata_exception(response, querystring, proxy)\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaExceptions.py\", line 81, in raise_thetadata_exception\n", - " raise ThetaDataNotFound(f\"Data not found for the given parameters: {params}\")\n", - "dbase.DataAPI.ThetaExceptions.ThetaDataNotFound: Data not found for the given parameters: {'end_date': 20230118, 'root': 'AMZN', 'use_csv': 'true', 'exp': 20240315, 'right': 'C', 'start_date': 20230104, 'strike': 115000, 'url': 'http://127.0.0.1:25510/v2/hist/option/eod?end_date=20230118&root=AMZN&use_csv=true&exp=20240315&right=C&start_date=20230104&strike=115000'}\n", - "2025-05-12 20:56:19 DataManager.py ERROR: args (,), kwargs: {'start': Timestamp('2023-01-04 00:00:00'), 'end': Timestamp('2023-01-18 00:00:00'), 'strike': 115.0, 'exp': '2024-03-15', 'right': 'C', 'bulk': False, 'data_request': }\n", - "2025-05-12 20:56:20 DataManager.py ERROR: Call Chain: wrapper -> __handle_incomplete_data -> get_timeseries -> query_thetadata\n" - ] - } - ], - "source": [ - "opt_manager = OptionDataManager(opttick = 'AMZN20240315C115')\n", - "req = opt_manager.get_timeseries(\n", - " start = evb_backtest.risk_manager.start_date,\n", - " end =evb_backtest.risk_manager.end_date,\n", - "\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Signal ID: TSLA20230602LONG\n", - "Using V2\n", - "Looks like our young fellow is targetting: 2023-06-02\n", - "Generating Data for TSLA 2024-06-21 00:00:00\n", - "Data Is_complete bool: False\n", - "Time taken to update cache: 0.025025129318237305\n", - "I'm proud of you, we are finally done\n", - "Actually! We are not done yet. We need to get the spot prices for the requested date\n", - "Now, my dear friend, we are done\n", - "Order Produced: {'result': 'SUCCESSFUL', 'data': {'long': ['TSLA20240621C230'], 'short': ['TSLA20240621C300'], 'trade_id': '&L:TSLA20240621C230&S:TSLA20240621C300', 'close': 19.75}}\n", - "Position ID: &L:TSLA20240621C230&S:TSLA20240621C300\n", - "Calculating Position Greeks\n", - "Calculate Greeks dates\n", - "Start Date: 2023-01-04 00:00:00\n", - "End Date: 2023-12-29 00:00:00\n", - "2025-05-12 21:15:30 DataManager.py CRITICAL: Extra Cols not implemented for BS Greeks\n", - "Calculate Greeks dates\n", - "Start Date: 2023-01-04 00:00:00\n", - "End Date: 2023-12-29 00:00:00\n", - "2025-05-12 21:15:30 DataManager.py CRITICAL: Extra Cols not implemented for BS Greeks\n" - ] - }, - { - "ename": "", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[1;31mThe Kernel crashed while executing code in the current cell or a previous cell. \n", - "\u001b[1;31mPlease review the code in the cell(s) to identify a possible cause of the failure. \n", - "\u001b[1;31mClick here for more info. \n", - "\u001b[1;31mView Jupyter log for further details." - ] - } - ], - "source": [ - "## Add logs for\n", - "order = {'type': 'naked',\n", - "'specifics': [{'direction': 'long',\n", - " 'rel_strike': .85,\n", - " 'dte': 365,\n", - " 'moneyness_width': 0.10},\n", - " {'direction': 'short',\n", - " 'rel_strike': .80,\n", - " 'dte': 365,\n", - " 'moneyness_width': 0.10}\n", - "],\n", - "'name': 'vertical_spread'}\n", - "cprofiled_get_order = cProfiler(evb_backtest.risk_manager.get_order)\n", - "returned_order=cprofiled_get_order(\n", - " tick=tick,\n", - " date=start.strftime('%Y-%m-%d'),\n", - " right='C',\n", - " order_settings=order,\n", - " max_close=20,\n", - " signal_id=signal_id,\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'delta': {'AMZN20230428LONG': 0.495,\n", - " 'SBUX20230104LONG': 0.945,\n", - " 'BA20230104LONG': 0.09,\n", - " 'NVDA20230119LONG': 8.325000000000001,\n", - " 'NFLX20230124LONG': 0.09,\n", - " 'META20230130LONG': 0.225,\n", - " 'AMD20230202LONG': 1.215,\n", - " 'AAPL20230203LONG': 0.54,\n", - " 'AAPL20230306LONG': 0.585,\n", - " 'NFLX20231020LONG': 0.09,\n", - " 'AAPL20231103LONG': 0.495,\n", - " 'SBUX20231108LONG': 0.945,\n", - " 'AMD20231109LONG': 0.945,\n", - " 'AMZN20231114LONG': 0.36,\n", - " 'TSLA20231115LONG': 0.36,\n", - " 'BA20231124LONG': 0.09},\n", - " 'gamma': {},\n", - " 'vega': {},\n", - " 'theta': {}}" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.risk_manager.greek_limits" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'result': 'NO_TRADED_CLOSE', 'data': None}" - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "returned_order[0]" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " 3041639 function calls (3029910 primitive calls) in 68.492 seconds\n", - "\n", - " Ordered by: cumulative time\n", - "\n", - " ncalls tottime percall cumtime percall filename:lineno(function)\n", - " 1 0.004 0.004 68.494 68.494 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:340(get_order)\n", - " 6/3 0.003 0.000 58.656 19.552 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/decorators.py:11(wrapper)\n", - " 2/1 0.001 0.001 55.172 55.172 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/decorators.py:41(wrapper)\n", - " 1 0.002 0.002 55.171 55.171 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:50(get_order)\n", - " 281 51.350 0.183 51.350 0.183 {method 'acquire' of '_thread.lock' objects}\n", - " 5 0.001 0.000 48.958 9.792 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/threads.py:4(runThreads)\n", - " 26 0.000 0.000 48.885 1.880 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1087(join)\n", - " 40 0.000 0.000 48.885 1.222 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1125(_wait_for_tstate_lock)\n", - " 5 0.000 0.000 48.882 9.776 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:646(__exit__)\n", - " 5 0.000 0.000 48.882 9.776 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:216(shutdown)\n", - " 1 0.000 0.000 45.343 45.343 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:604(populate_cache)\n", - " 1 0.002 0.002 45.276 45.276 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:451(populate_cache_v2)\n", - " 1 0.002 0.002 35.805 35.805 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:237(update_cache_with_missing_ticks)\n", - " 1 0.002 0.002 13.307 13.307 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:368(calculate_position_greeks)\n", - " 1 0.002 0.002 9.706 9.706 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:821(produce_order_candidates)\n", - " 2 0.015 0.007 9.704 4.852 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:685(chain_details)\n", - " 4/3 0.011 0.003 9.203 3.068 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_sync.py:85(retry)\n", - " 2 0.000 0.000 7.750 3.875 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/decorators.py:25(wrapper)\n", - " 1 0.000 0.000 6.250 6.250 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1522(init_query)\n", - " 1 0.001 0.001 6.248 6.248 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/database/SQLHelpers.py:343(query_database)\n", - " 1 0.001 0.001 6.248 6.248 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/database/SQLHelpers.py:100(query_database)\n", - " 1 0.003 0.003 6.247 6.247 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:570(read_sql)\n", - " 2 0.000 0.000 6.090 3.045 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1713(exec_driver_sql)\n", - " 2 0.002 0.001 6.089 3.045 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1791(_execute_context)\n", - " 1 0.001 0.001 5.929 5.929 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:1779(read_query)\n", - " 2 0.003 0.001 5.911 2.955 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1850(_exec_single_context)\n", - " 2 0.000 0.000 5.898 2.949 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:940(do_execute)\n", - " 2 0.001 0.000 5.898 2.949 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:311(execute)\n", - " 1 0.000 0.000 5.896 5.896 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:1655(execute)\n", - " 1 0.001 0.001 5.073 5.073 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:382(spot)\n", - " 1 0.001 0.001 5.012 5.012 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:155(retrieve_timeseries)\n", - " 11183 0.211 0.000 4.625 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:673(to_datetime)\n", - " 1 0.001 0.001 4.161 4.161 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:214(_handle_result)\n", - " 1 0.000 0.000 4.160 4.160 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:815(_handle_resultset)\n", - " 1 0.031 0.031 4.159 4.159 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:456(get_rows)\n", - " 748 4.127 0.006 4.127 0.006 {method 'fetch_row' of '_mysql_connector.MySQL' objects}\n", - " 11140 0.173 0.000 3.712 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:314(_convert_listlike_datetimes)\n", - " 1 0.004 0.004 3.520 3.520 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:465(option_chain)\n", - " 1 0.005 0.005 3.410 3.410 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:150(list_contracts)\n", - " 1 0.001 0.001 3.339 3.339 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/api.py:62(get)\n", - " 1 0.002 0.002 3.339 3.339 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/api.py:14(request)\n", - " 1 0.001 0.001 3.326 3.326 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:500(request)\n", - " 1 0.000 0.000 3.258 3.258 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:673(send)\n", - " 1 0.002 0.002 3.254 3.254 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:613(send)\n", - " 1 0.001 0.001 3.238 3.238 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:594(urlopen)\n", - " 1 0.000 0.000 3.233 3.233 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:379(_make_request)\n", - " 1 0.001 0.001 3.224 3.224 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:481(getresponse)\n", - " 1 0.001 0.001 3.219 3.219 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1351(getresponse)\n", - " 1 0.000 0.000 3.218 3.218 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:318(begin)\n", - " 1 0.001 0.001 3.213 3.213 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:285(_read_status)\n", - " 11 0.001 0.000 3.212 0.292 {method 'readline' of '_io.BufferedReader' objects}\n", - " 5 0.000 0.000 3.212 0.642 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:704(readinto)\n", - " 5 3.212 0.642 3.212 0.642 {method 'recv_into' of '_socket.socket' objects}\n", - " 1 0.000 0.000 3.168 3.168 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/obbject.py:87(to_df)\n", - " 1 0.000 0.000 3.168 3.168 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/obbject.py:127(to_dataframe)\n", - " 1 0.002 0.002 3.131 3.131 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/utils.py:20(basemodel_to_df)\n", - " 6 0.000 0.000 3.072 0.512 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:4789(apply)\n", - " 6 0.001 0.000 3.072 0.512 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1409(apply)\n", - " 6 0.000 0.000 3.071 0.512 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1482(apply_standard)\n", - " 7 0.000 0.000 3.056 0.437 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:891(_map_values)\n", - " 7 0.043 0.006 3.055 0.436 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:1667(map_array)\n", - " 58 0.001 0.000 2.468 0.043 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:295(wait)\n", - " 2 0.001 0.000 2.465 1.233 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/utils/decorators.py:47(wrapper)\n", - " 2 0.000 0.000 2.462 1.231 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/utils/decorators.py:35(wrapper)\n", - " 2 0.000 0.000 2.412 1.206 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/validate_call_decorator.py:58(wrapper_function)\n", - " 2 0.001 0.000 2.411 1.206 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_validate_call.py:95(__call__)\n", - " 2 0.000 0.000 2.411 1.205 {method 'validate_python' of 'pydantic_core._pydantic_core.SchemaValidator' objects}\n", - " 2 0.001 0.001 2.406 1.203 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/container.py:23(_run)\n", - " 2 0.000 0.000 2.404 1.202 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/command_runner.py:503(sync_run)\n", - " 2 0.000 0.000 2.404 1.202 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/provider/utils/helpers.py:581(run_async)\n", - " 44 0.000 0.000 2.392 0.054 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:428(result)\n", - " 6 0.000 0.000 2.391 0.398 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/from_thread.py:275(call)\n", - " 14630 0.133 0.000 2.189 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:320(__new__)\n", - " 15139 0.257 0.000 1.833 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:329(_from_sequence_not_strict)\n", - " 1 0.004 0.004 1.755 1.755 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/equity_price.py:28(historical)\n", - " 2 0.001 0.000 1.735 0.868 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/opentelemetry/context_propagation.py:93(wrapper)\n", - " 2 0.003 0.002 1.735 0.867 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:690(cmd_query)\n", - " 2 1.731 0.865 1.731 0.865 {method 'query' of '_mysql_connector.MySQL' objects}\n", - " 1 0.000 0.000 1.500 1.500 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:726(one_off_save)\n", - " 1 0.000 0.000 1.500 1.500 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1327(bulk_one_off_save)\n", - " 1 0.001 0.001 1.500 1.500 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager_processes.py:347(schedule)\n", - " 1 0.000 0.000 1.499 1.499 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager.py:360(_schedule)\n", - " 1 0.001 0.001 1.498 1.498 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager.py:323(is_already_scheduled)\n", - " 1 0.000 0.000 1.497 1.497 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager.py:33(construct_current_scheduled_names)\n", - " 1 0.002 0.002 1.493 1.493 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager.py:54()\n", - " 143 0.032 0.000 1.491 0.010 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/Requests.py:36(construct_request_name)\n", - " 4 0.000 0.000 1.437 0.359 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1780(apply)\n", - " 4 0.000 0.000 1.430 0.357 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1850(_python_apply_general)\n", - " 4 0.002 0.000 1.427 0.357 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:897(apply_groupwise)\n", - " 10627 0.046 0.000 1.386 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:259(_box_as_indexlike)\n", - " 11123 0.475 0.000 1.165 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:126(_guess_datetime_format_for_array)\n", - " 6 0.000 0.000 1.034 0.172 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:212(check_all_days_available)\n", - " 15139 0.260 0.000 0.950 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2184(_sequence_to_dt64)\n", - "757412/749704 0.443 0.000 0.852 0.000 {built-in method builtins.isinstance}\n", - " 6 0.000 0.000 0.831 0.139 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1807(f)\n", - " 1 0.000 0.000 0.768 0.768 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:309(div_yield)\n", - " 26263 0.148 0.000 0.762 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2428(maybe_convert_dtype)\n", - " 1 0.000 0.000 0.753 0.753 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:325(div_yield_history)\n", - " 1 0.001 0.001 0.656 0.656 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/equity_fundamental.py:938(dividends)\n", - " 642/639 0.009 0.000 0.628 0.001 {built-in method builtins.all}\n", - " 6 0.014 0.002 0.500 0.083 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:216()\n", - " 4233 0.013 0.000 0.496 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:177(__contains__)\n", - " 4250 0.054 0.000 0.478 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:582(get_loc)\n", - " 1500 0.016 0.000 0.451 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:217()\n", - " 11751 0.044 0.000 0.421 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5373(__getitem__)\n", - " 497 0.029 0.000 0.399 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:456(_array_strptime_with_fallback)\n", - " 654 0.041 0.000 0.397 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:475(__new__)\n", - " 15140 0.097 0.000 0.373 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2425(ensure_arraylike_for_datetimelike)\n", - " 3 0.000 0.000 0.370 0.123 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:219(check_missing_dates)\n", - " 11211 0.050 0.000 0.368 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:373(__getitem__)\n", - " 26289 0.115 0.000 0.362 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1163(is_float_dtype)\n", - " 68232 0.134 0.000 0.356 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:173(search)\n", - " 919 0.025 0.000 0.330 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:517(sanitize_array)\n", - " 3 0.008 0.003 0.330 0.110 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:223()\n", - " 4587 0.110 0.000 0.315 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3777(get_loc)\n", - " 11212 0.043 0.000 0.315 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:278(__getitem__)\n", - " 554 0.031 0.000 0.286 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:666(_parse)\n", - " 114471 0.131 0.000 0.280 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/generic.py:42(_instancecheck)\n", - " 11127 0.154 0.000 0.270 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:545(_box_func)\n", - " 41465 0.075 0.000 0.242 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1375(_is_dtype)\n", - " 10646 0.223 0.000 0.239 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2354(objects_to_datetime64)\n", - " 560 0.005 0.000 0.228 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:769(_try_cast)\n", - " 26496 0.088 0.000 0.226 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1198(is_bool_dtype)\n", - " 497 0.013 0.000 0.222 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1200(maybe_cast_to_datetime)\n", - " 4147 0.135 0.000 0.213 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:842(_engine)\n", - " 12 0.001 0.000 0.206 0.017 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/utils.py:47(bus_range)\n", - " 71238 0.136 0.000 0.199 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:272(_compile)\n", - " 1 0.000 0.000 0.199 0.199 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:2037(has_table)\n", - " 1 0.000 0.000 0.197 0.197 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:400(has_table)\n", - " 1 0.000 0.000 0.197 0.197 :1(has_table)\n", - " 1 0.000 0.000 0.196 0.196 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:78(cache)\n", - " 1 0.002 0.002 0.196 0.196 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/base.py:2732(has_table)\n", - " 2 0.001 0.000 0.175 0.088 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1523(_init_statement)\n", - " 2 0.000 0.000 0.175 0.087 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1736(create_cursor)\n", - " 2 0.000 0.000 0.174 0.087 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1757(create_default_cursor)\n", - " 2 0.000 0.000 0.174 0.087 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1483(cursor)\n", - " 2 0.002 0.001 0.174 0.087 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:733(cursor)\n", - " 2 0.000 0.000 0.170 0.085 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:387(is_connected)\n", - " 2 0.170 0.085 0.170 0.085 {method 'ping' of '_mysql_connector.MySQL' objects}\n", - " 14 0.007 0.001 0.169 0.012 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:850(change_to_last_busday)\n", - " 15127 0.032 0.000 0.163 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:536(is_string_dtype)\n", - " 34 0.001 0.000 0.160 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:1022(bdate_range)\n", - " 34 0.001 0.000 0.159 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:821(date_range)\n", - " 34 0.009 0.000 0.158 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:397(_generate_range)\n", - " 15703 0.125 0.000 0.158 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:649(_simple_new)\n", - " 15410 0.044 0.000 0.148 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7688(maybe_extract_name)\n", - " 1 0.000 0.000 0.147 0.147 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:662(pre_process_data)\n", - " 114471 0.111 0.000 0.147 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/generic.py:37(_check)\n", - " 34 0.005 0.000 0.141 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:468()\n", - " 21 0.014 0.001 0.137 0.007 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:694(__init__)\n", - " 554 0.012 0.000 0.136 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:199(split)\n", - " 3739 0.136 0.000 0.136 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2712(_generate_range)\n", - " 15173 0.125 0.000 0.135 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:304(_simple_new)\n", - " 509 0.003 0.000 0.132 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:325(_from_sequence)\n", - " 11383 0.121 0.000 0.121 0.000 {built-in method numpy.array}\n", - " 68039 0.062 0.000 0.118 0.000 :117(__instancecheck__)\n", - " 223 0.005 0.000 0.118 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4062(__getitem__)\n", - " 5590 0.009 0.000 0.108 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:189(__next__)\n", - " 26825 0.058 0.000 0.108 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1434(_is_dtype_type)\n", - " 120 0.000 0.000 0.102 0.001 {built-in method builtins.next}\n", - " 58 0.000 0.000 0.100 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:132(__enter__)\n", - " 5590 0.070 0.000 0.099 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:77(get_token)\n", - " 7 0.001 0.000 0.098 0.014 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:84(__init__)\n", - "206299/206262 0.084 0.000 0.092 0.000 {built-in method builtins.getattr}\n", - " 1 0.000 0.000 0.091 0.091 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:1643(__exit__)\n", - " 1 0.000 0.000 0.091 0.091 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:607(close)\n", - " 1 0.000 0.000 0.091 0.091 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:558(__exit__)\n", - " 1 0.000 0.000 0.091 0.091 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:234(__exit__)\n", - " 1 0.000 0.000 0.091 0.091 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1218(close)\n", - " 1 0.000 0.000 0.090 0.090 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2576(close)\n", - " 1 0.000 0.000 0.090 0.090 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2725(_do_close)\n", - " 1 0.001 0.001 0.090 0.090 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2709(_close_impl)\n", - " 6 0.000 0.000 0.089 0.015 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/utils.py:18(__init__)\n", - " 118/109 0.011 0.000 0.089 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:389(__init__)\n", - " 1 0.000 0.000 0.089 0.089 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2703(_connection_rollback_impl)\n", - " 1 0.000 0.000 0.089 0.089 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1113(_rollback_impl)\n", - " 1 0.000 0.000 0.088 0.088 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:698(do_rollback)\n", - " 1 0.000 0.000 0.088 0.088 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:578(rollback)\n", - " 1 0.088 0.088 0.088 0.088 {method 'rollback' of '_mysql_connector.MySQL' objects}\n", - " 67961 0.062 0.000 0.087 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1399(_get_dtype)\n", - " 62/53 0.003 0.000 0.084 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4271(__setitem__)\n", - " 4 0.005 0.001 0.083 0.021 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Context.py:16(Context)\n", - " 15127 0.061 0.000 0.082 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:572(condition)\n", - " 497 0.012 0.000 0.080 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1240(_ensure_nanosecond_dtype)\n", - " 7 0.005 0.001 0.079 0.011 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:423(dict_to_mgr)\n", - " 60 0.001 0.000 0.078 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4514(_set_item)\n", - " 250 0.003 0.000 0.076 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:692()\n", - " 28 0.000 0.000 0.076 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:611(wait)\n", - " 923 0.026 0.000 0.076 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:875(_parse_numeric_token)\n", - " 26 0.000 0.000 0.075 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:945(start)\n", - " 5 0.000 0.000 0.074 0.015 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:583(map)\n", - " 5 0.000 0.000 0.074 0.015 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:608()\n", - " 34 0.001 0.000 0.074 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:161(submit)\n", - " 2 0.000 0.000 0.074 0.037 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:9492(pivot_table)\n", - " 2 0.000 0.000 0.073 0.037 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/pivot.py:61(pivot_table)\n", - " 2 0.002 0.001 0.073 0.037 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/pivot.py:118(__internal_pivot_table)\n", - " 34 0.001 0.000 0.072 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:180(_adjust_thread_count)\n", - " 77 0.001 0.000 0.072 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4130(_getitem_bool_array)\n", - " 11152 0.072 0.000 0.072 0.000 {method 'view' of 'numpy.generic' objects}\n", - " 1241 0.017 0.000 0.072 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:346(_name_get)\n", - " 19346 0.060 0.000 0.065 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:645(__iter__)\n", - " 8 0.000 0.000 0.065 0.008 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_decorators.py:325(wrapper)\n", - " 2 0.001 0.001 0.064 0.032 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1204(__repr__)\n", - " 60 0.004 0.000 0.064 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4481(_set_item_mgr)\n", - " 2 0.001 0.000 0.064 0.032 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:737(__init__)\n", - " 2 0.001 0.000 0.061 0.030 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1310(to_string)\n", - " 4238 0.007 0.000 0.060 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:571(_disallow_mismatched_indexing)\n", - " 2 0.001 0.001 0.058 0.029 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:939(to_string)\n", - " 2 0.001 0.000 0.056 0.028 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/string.py:28(to_string)\n", - " 61 0.003 0.000 0.056 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1347(insert)\n", - " 68039 0.055 0.000 0.056 0.000 {built-in method _abc._abc_instancecheck}\n", - " 16276 0.038 0.000 0.056 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:416(extract_array)\n", - " 2 0.000 0.000 0.056 0.028 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/string.py:40(_get_string_representation)\n", - " 10622 0.026 0.000 0.055 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/utils.py:48()\n", - " 14 0.001 0.000 0.055 0.004 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/utils.py:26(default_timestamp)\n", - " 4289 0.036 0.000 0.053 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:769(_assert_tzawareness_compat)\n", - " 68259 0.053 0.000 0.053 0.000 {method 'search' of 're.Pattern' objects}\n", - " 3 0.000 0.000 0.053 0.018 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:335(__init__)\n", - " 70729 0.030 0.000 0.053 0.000 {built-in method builtins.hasattr}\n", - " 12 0.013 0.001 0.051 0.004 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/utils.py:54()\n", - " 2 0.001 0.000 0.051 0.025 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/string.py:34(_get_strcols)\n", - " 2 0.001 0.000 0.050 0.025 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:472(get_strcols)\n", - " 2 0.001 0.000 0.050 0.025 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/validate_call_decorator.py:28(validate_call)\n", - " 108/82 0.002 0.000 0.049 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/common.py:62(new_method)\n", - " 1 0.009 0.009 0.049 0.049 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/utils.py:30()\n", - " 2 0.001 0.000 0.049 0.024 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/validate_call_decorator.py:51(validate)\n", - " 2 0.002 0.001 0.048 0.024 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:704(_get_strcols_without_index)\n", - " 2 0.003 0.001 0.048 0.024 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_validate_call.py:26(__init__)\n", - " 50 0.001 0.000 0.048 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:869(take)\n", - " 1 0.001 0.001 0.045 0.045 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:750(merge_environment_settings)\n", - " 1 0.000 0.000 0.045 0.045 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:826(get_environ_proxies)\n", - " 1241 0.005 0.000 0.044 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:330(_name_includes_bit_suffix)\n", - " 44 0.001 0.000 0.043 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4027(take)\n", - " 11 0.001 0.000 0.043 0.004 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:140()\n", - " 40 0.001 0.000 0.042 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4142(_take_with_is_copy)\n", - " 11 0.003 0.000 0.042 0.004 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:876(liquidity_check)\n", - " 15516 0.028 0.000 0.042 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:576(tz)\n", - " 1 0.000 0.000 0.042 0.042 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:765(should_bypass_proxies)\n", - " 1 0.001 0.001 0.041 0.041 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2672(proxy_bypass)\n", - " 14 0.001 0.000 0.041 0.003 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:839(is_USholiday)\n", - " 63 0.002 0.000 0.041 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:623(reindex_indexer)\n", - " 10621 0.007 0.000 0.040 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/main.py:352(model_dump)\n", - " 28 0.001 0.000 0.040 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:751(format_col)\n", - " 3759 0.040 0.000 0.040 0.000 {cyfunction Timestamp.strftime at 0x125052330}\n", - " 15139 0.040 0.000 0.040 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2310(_construct_from_dt64_naive)\n", - " 1117 0.006 0.000 0.039 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numerictypes.py:357(issubdtype)\n", - " 1 0.000 0.000 0.039 0.039 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2658(proxy_bypass_macosx_sysconf)\n", - " 1 0.038 0.038 0.038 0.038 {built-in method _scproxy._get_proxy_settings}\n", - " 15173 0.038 0.000 0.038 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:103(tz_to_dtype)\n", - " 1094 0.004 0.000 0.037 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_strptime.py:26(_getlang)\n", - " 159 0.024 0.000 0.037 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1157(maybe_infer_to_datetimelike)\n", - " 1 0.000 0.000 0.036 0.036 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:868(read_csv)\n", - " 1 0.003 0.003 0.036 0.036 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:583(_read)\n", - " 2 0.002 0.001 0.036 0.018 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:10170(apply)\n", - " 1 0.000 0.000 0.035 0.035 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:78(method)\n", - " 1 0.001 0.001 0.035 0.035 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:736(map)\n", - " 61 0.003 0.000 0.035 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6956(insert)\n", - " 18 0.001 0.000 0.034 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:209(_maybe_cache)\n", - " 1 0.000 0.000 0.034 0.034 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/obbject.py:169(is_list_of_basemodel)\n", - " 2 0.002 0.001 0.034 0.017 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:864(apply)\n", - " 1094 0.004 0.000 0.034 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/locale.py:594(getlocale)\n", - " 10621 0.032 0.000 0.033 0.000 {method 'to_python' of 'pydantic_core._pydantic_core.SchemaSerializer' objects}\n", - " 60 0.001 0.000 0.033 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6662(copy)\n", - " 11 0.000 0.000 0.033 0.003 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:150()\n", - " 2234 0.031 0.000 0.033 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numerictypes.py:283(issubclass_)\n", - " 9 0.002 0.000 0.033 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:607(_init_dict)\n", - " 11 0.001 0.000 0.032 0.003 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:781(available_close_check)\n", - " 2 0.001 0.000 0.032 0.016 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1061(apply_standard)\n", - " 247 0.004 0.000 0.032 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6284(__getattr__)\n", - " 10622 0.005 0.000 0.032 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/obbject.py:170()\n", - " 34 0.002 0.000 0.031 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1079(format_array)\n", - " 73 0.002 0.000 0.031 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1176(__getitem__)\n", - " 26706 0.022 0.000 0.031 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:123()\n", - " 70 0.002 0.000 0.031 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:557(copy)\n", - " 17/2 0.000 0.000 0.031 0.015 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:620(generate_schema)\n", - " 267 0.002 0.000 0.030 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:3983(_ixs)\n", - " 1 0.000 0.000 0.030 0.030 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:194(_wrap_result)\n", - " 349/339 0.002 0.000 0.030 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:59(take_nd)\n", - " 27/2 0.001 0.000 0.029 0.015 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:906(_generate_schema_inner)\n", - "12074/12054 0.020 0.000 0.029 0.000 {built-in method numpy.asarray}\n", - " 2 0.000 0.000 0.029 0.015 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1070(apply_series_generator)\n", - " 2 0.002 0.001 0.029 0.015 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/__extensions__.py:93(equity)\n", - " 4331 0.013 0.000 0.029 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:728(is_valid_na_for_dtype)\n", - " 256 0.003 0.000 0.029 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4626(_get_item_cache)\n", - " 26274 0.021 0.000 0.029 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1194()\n", - " 2 0.001 0.001 0.028 0.014 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/generic.py:1420(aggregate)\n", - " 83 0.002 0.000 0.028 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:674(_with_infer)\n", - " 26706 0.028 0.000 0.028 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:121(classes)\n", - " 27/2 0.001 0.000 0.028 0.014 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:931(match_type)\n", - " 8794 0.013 0.000 0.028 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/extension.py:67(fget)\n", - " 102 0.004 0.000 0.028 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:317(apply)\n", - " 2 0.002 0.001 0.028 0.014 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1871(_callable_schema)\n", - " 34 0.000 0.000 0.028 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1193(get_result)\n", - " 1 0.000 0.000 0.027 0.027 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:466(__init__)\n", - " 4 0.027 0.007 0.027 0.007 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/container.py:14(__init__)\n", - " 2 0.000 0.000 0.027 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:172(agg)\n", - " 16001 0.020 0.000 0.027 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:334(is_hashable)\n", - " 2 0.001 0.001 0.027 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:558(apply_str)\n", - " 248 0.002 0.000 0.027 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1287(take_nd)\n", - " 4030 0.010 0.000 0.026 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:745(_get_engine_target)\n", - "4617/4610 0.006 0.000 0.026 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:101(isna)\n", - " 17219 0.025 0.000 0.025 0.000 {built-in method numpy.datetime_data}\n", - " 43 0.001 0.000 0.025 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:687()\n", - " 3 0.000 0.000 0.025 0.008 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:506(nested_data_to_arrays)\n", - " 1 0.002 0.002 0.025 0.025 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:885(pandasSQL_builder)\n", - " 14 0.001 0.000 0.025 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5993(set_index)\n", - " 18 0.002 0.000 0.025 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:149(should_cache)\n", - " 3 0.000 0.000 0.024 0.008 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:793(to_arrays)\n", - " 334 0.011 0.000 0.024 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:120(_take_nd_ndarray)\n", - " 1436 0.003 0.000 0.024 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:163(match)\n", - " 54198 0.024 0.000 0.024 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:551(dtype)\n", - " 2 0.000 0.000 0.024 0.012 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:681(_apply_str)\n", - " 441 0.002 0.000 0.023 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7593(ensure_index)\n", - " 1 0.002 0.002 0.023 0.023 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:160(_convert_arrays_to_dataframe)\n", - " 11 0.001 0.000 0.023 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:766()\n", - " 10 0.000 0.000 0.023 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:96(arrays_to_mgr)\n", - " 1 0.001 0.001 0.023 0.023 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:457(prepare_request)\n", - " 1094 0.005 0.000 0.022 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/locale.py:479(_parse_localename)\n", - " 2 0.000 0.000 0.022 0.011 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6731(drop_duplicates)\n", - " 14 0.015 0.001 0.022 0.002 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/utils.py:32()\n", - " 10622 0.011 0.000 0.021 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_model_construction.py:268(__instancecheck__)\n", - " 22 0.001 0.000 0.021 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:807(generate_option_tick_new)\n", - " 15175 0.021 0.000 0.021 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:529(is_string_or_object_np_dtype)\n", - " 4009 0.009 0.000 0.021 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:707(dtype)\n", - " 10 0.001 0.000 0.021 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1574(_generate_parameter_schema)\n", - " 58893 0.019 0.000 0.020 0.000 {built-in method builtins.issubclass}\n", - "4617/4610 0.013 0.000 0.020 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:184(_isna)\n", - " 4 0.000 0.000 0.020 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6239(reset_index)\n", - " 1 0.001 0.001 0.020 0.020 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:2264(count)\n", - " 5 0.001 0.000 0.020 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6538(dropna)\n", - " 44 0.001 0.000 0.019 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:610(factorize)\n", - " 49 0.018 0.000 0.019 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1580(construct_1d_object_array_from_listlike)\n", - " 74 0.003 0.000 0.019 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1782(_consolidate_inplace)\n", - " 1395 0.007 0.000 0.019 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6301(__setattr__)\n", - " 705 0.019 0.000 0.019 0.000 {method 'reduce' of 'numpy.ufunc' objects}\n", - " 1 0.001 0.001 0.018 0.018 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1907(read)\n", - " 1 0.000 0.000 0.018 0.018 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:343(update_spot_cache)\n", - " 1 0.001 0.001 0.018 0.018 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:351(prepare)\n", - " 15140 0.018 0.000 0.018 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2063(_maybe_pin_freq)\n", - " 4386 0.018 0.000 0.018 0.000 {method 'view' of 'numpy.ndarray' objects}\n", - " 15772 0.018 0.000 0.018 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:831(_reset_identity)\n", - " 1530 0.015 0.000 0.018 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:428(append)\n", - "21008/18358 0.012 0.000 0.018 0.000 {built-in method builtins.len}\n", - "20725/20716 0.017 0.000 0.018 0.000 {built-in method builtins.hash}\n", - " 1 0.007 0.007 0.018 0.018 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:1620(__init__)\n", - " 8 0.000 0.000 0.017 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:674(astype)\n", - " 6 0.000 0.000 0.017 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:743(group_info)\n", - " 2 0.006 0.003 0.017 0.009 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:891(_list_of_dict_to_arrays)\n", - " 6 0.000 0.000 0.017 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:758(_get_compressed_codes)\n", - " 4 0.016 0.004 0.017 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:447(astype)\n", - " 1 0.001 0.001 0.017 0.017 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:316(drop_cache_duplicates)\n", - " 1094 0.009 0.000 0.017 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/locale.py:396(normalize)\n", - " 1259 0.009 0.000 0.017 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1596(pandas_dtype)\n", - " 10 0.002 0.000 0.017 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2121(create_block_manager_from_column_arrays)\n", - " 502 0.003 0.000 0.017 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:208(findall)\n", - " 4 0.000 0.000 0.016 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:7282(sort_index)\n", - " 23 0.000 0.000 0.016 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1610(_log)\n", - " 4 0.001 0.000 0.016 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5290(sort_index)\n", - " 82 0.001 0.000 0.016 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2632(check_bool_indexer)\n", - " 554 0.012 0.000 0.016 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:221(__init__)\n", - " 554 0.015 0.000 0.016 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:62(__init__)\n", - " 5 0.000 0.000 0.016 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6997(sort_values)\n", - " 42 0.004 0.000 0.016 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:708(_slice_take_blocks_ax0)\n", - " 35 0.001 0.000 0.016 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3820(get_indexer)\n", - " 12 0.001 0.000 0.015 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1471(_format_strings)\n", - " 10 0.001 0.000 0.015 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2066(_apply_annotations)\n", - " 71 0.001 0.000 0.015 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1719(_getitem_axis)\n", - " 4 0.000 0.000 0.015 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:1006(convert_object_array)\n", - " 4 0.000 0.000 0.015 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:1070()\n", - " 2 0.000 0.000 0.015 0.008 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6828(duplicated)\n", - " 2 0.001 0.000 0.015 0.007 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:10803(where)\n", - " 101 0.011 0.000 0.015 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:1028(convert)\n", - " 2 0.001 0.000 0.015 0.007 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:9863(unstack)\n", - " 1068 0.002 0.000 0.015 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:225(compile)\n", - " 12 0.001 0.000 0.015 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1343(get_result_as_array)\n", - " 196 0.003 0.000 0.015 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:419(check_array_indexer)\n", - " 8 0.000 0.000 0.015 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4796(_drop_axis)\n", - " 48 0.001 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6201(_construct_result)\n", - " 11166 0.014 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2148(_creso)\n", - " 15139 0.012 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2514(_validate_dt64_dtype)\n", - " 32 0.000 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6110(_cmp_method)\n", - " 2 0.001 0.001 0.014 0.007 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:10615(_where)\n", - " 2 0.000 0.000 0.014 0.007 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:489(unstack)\n", - " 458 0.009 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5323(__contains__)\n", - " 2 0.000 0.000 0.014 0.007 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:525(_unstack_frame)\n", - " 23 0.000 0.000 0.014 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1636(handle)\n", - " 1 0.002 0.002 0.014 0.014 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1575(__init__)\n", - " 118 0.001 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5437(_can_hold_identifiers_and_holds_name)\n", - " 23 0.000 0.000 0.014 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1690(callHandlers)\n", - " 260 0.002 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4608(_box_col_values)\n", - " 25 0.000 0.000 0.014 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:965(handle)\n", - " 10 0.000 0.000 0.014 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_schema_generation_shared.py:82(__call__)\n", - " 384 0.008 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:274(full)\n", - " 10 0.000 0.000 0.013 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2085(inner_handler)\n", - " 13 0.001 0.000 0.013 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2259(_consolidate)\n", - " 14 0.000 0.000 0.013 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:835(is_busday)\n", - " 5 0.000 0.000 0.013 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:11603(any)\n", - " 4 0.000 0.000 0.013 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/from_thread.py:455(start_blocking_portal)\n", - " 5 0.000 0.000 0.013 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12169(_logical_func)\n", - " 16305 0.013 0.000 0.013 0.000 {built-in method __new__ of type object at 0x10d1bc898}\n", - " 5 0.000 0.000 0.013 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:11435(_reduce)\n", - " 433 0.003 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:145(_get_option)\n", - " 30278 0.012 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2570(_validate_tz_from_dtype)\n", - " 15 0.002 0.000 0.013 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:1371(_arith_method)\n", - " 4164 0.010 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1040(needs_i8_conversion)\n", - " 3749 0.011 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:865(_references)\n", - " 864 0.011 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:696(_sanitize_ndim)\n", - " 569 0.009 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6236(__finalize__)\n", - " 329 0.002 0.000 0.012 0.000 {method 'any' of 'numpy.ndarray' objects}\n", - " 4009 0.012 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1993(dtype)\n", - " 32 0.001 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1689(_getitem_tuple)\n", - " 44 0.006 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:548(factorize_array)\n", - " 1 0.000 0.000 0.012 0.012 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:909(text)\n", - " 8 0.001 0.000 0.012 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5343(reindex)\n", - " 11733 0.012 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:152(cast_scalar_indexer)\n", - " 1 0.001 0.001 0.012 0.012 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:789(apparent_encoding)\n", - " 10972 0.010 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:208(isnum)\n", - " 12 0.000 0.000 0.012 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1397(format_values_with)\n", - " 25 0.000 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1098(emit)\n", - " 4099 0.006 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:831(_values)\n", - " 6 0.000 0.000 0.011 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:371(__init__)\n", - " 11 0.000 0.000 0.011 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6133(_arith_method)\n", - " 1 0.001 0.001 0.011 0.011 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1848(_make_engine)\n", - " 6 0.001 0.000 0.011 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:5773(isna)\n", - " 922 0.005 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1006(_find_hms_idx)\n", - " 2 0.001 0.000 0.011 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:589(clean_schema)\n", - " 32 0.004 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:124(maybe_convert_platform)\n", - " 36 0.001 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6418(_reduce)\n", - " 330 0.001 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:55(_any)\n", - " 10621 0.011 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/utils.py:49()\n", - " 69 0.001 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5242(_sanitize_column)\n", - " 16 0.000 0.000 0.011 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:689(codes)\n", - " 10 0.001 0.000 0.011 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:777(_codes_and_uniques)\n", - " 1 0.001 0.001 0.011 0.011 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/legacy.py:19(detect)\n", - " 652 0.011 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:591(_ensure_array)\n", - " 1 0.002 0.002 0.010 0.010 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:390(__init__)\n", - " 1336 0.010 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1141(_to_decimal)\n", - " 554 0.010 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:395(__init__)\n", - " 121 0.000 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1496(items)\n", - " 6 0.001 0.000 0.010 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:214(_obj_with_exclusions)\n", - " 40 0.006 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2276(_merge_blocks)\n", - " 1864 0.010 0.000 0.010 0.000 {method 'match' of 're.Pattern' objects}\n", - " 652 0.007 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:609(_dtype_to_subclass)\n", - " 1 0.001 0.001 0.010 0.010 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:446(get_connection_with_tls_context)\n", - " 4 0.000 0.000 0.010 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:157(concat)\n", - " 542 0.008 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:474(resolve_ymd)\n", - " 9 0.000 0.000 0.010 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5095(insert)\n", - " 6 0.002 0.000 0.010 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:8693(isna)\n", - " 25 0.000 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1087(flush)\n", - " 932 0.010 0.000 0.010 0.000 {built-in method numpy.empty}\n", - " 502 0.009 0.000 0.009 0.000 {method 'findall' of 're.Pattern' objects}\n", - " 178 0.005 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/ipkernel.py:775(_clean_thread_parent_frames)\n", - " 1 0.007 0.007 0.009 0.009 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/api.py:33(from_bytes)\n", - " 6 0.002 0.000 0.009 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6459(any)\n", - " 18/17 0.000 0.000 0.009 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:38(__eq__)\n", - " 1 0.002 0.002 0.009 0.009 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:3255(connect)\n", - " 2 0.000 0.000 0.009 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:212(putmask)\n", - " 4 0.000 0.000 0.009 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:622(get_result)\n", - " 7 0.000 0.000 0.009 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6186(_get_indexer_strict)\n", - " 1 0.005 0.005 0.009 0.009 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:60(__init__)\n", - " 2 0.001 0.000 0.009 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4320(_setitem_array)\n", - " 49/26 0.000 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:50(__le__)\n", - " 10630 0.008 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:915()\n", - " 1 0.000 0.000 0.009 0.009 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:287(organize_data_for_query)\n", - " 15 0.000 0.000 0.009 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6162(get_indexer_for)\n", - " 1 0.000 0.000 0.009 0.009 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:365(request)\n", - " 20 0.000 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1479(info)\n", - " 12 0.000 0.000 0.008 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4323(reindex)\n", - " 631 0.007 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:278(__init__)\n", - " 176 0.002 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:807(_set_axis)\n", - " 25 0.000 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7164(_cmp_method)\n", - " 14 0.000 0.000 0.008 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7553(ensure_index_from_sequences)\n", - " 1 0.001 0.001 0.008 0.008 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:409(prepare_url)\n", - " 15 0.000 0.000 0.008 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4477(__delitem__)\n", - " 260 0.005 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1012(iget)\n", - " 1 0.001 0.001 0.008 0.008 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:276(connection_from_host)\n", - " 35 0.001 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:800(_generate_schema_from_property)\n", - " 31392 0.008 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:2287(cast)\n", - " 32 0.001 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1032(_getitem_lowerdim)\n", - " 4 0.000 0.000 0.008 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:59(get_indexer_indexer)\n", - " 2 0.001 0.000 0.008 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:110(__init__)\n", - " 61 0.003 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5368(insert)\n", - " 334 0.003 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:564(_take_preprocess_indexer_and_fill_value)\n", - " 2 0.000 0.000 0.008 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1508(error)\n", - " 48 0.001 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3122(duplicated)\n", - " 492 0.002 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:339(_from_mgr)\n", - " 5 0.000 0.000 0.008 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:5136(reindex)\n", - " 5 0.000 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5614(_reindex_axes)\n", - " 1 0.002 0.002 0.007 0.007 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:305(connection_from_context)\n", - " 23 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/handlers.py:65(emit)\n", - " 453 0.004 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:127(_get_single_key)\n", - " 3 0.000 0.000 0.007 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:226(update_caches)\n", - " 15 0.001 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1434(idelete)\n", - " 267 0.001 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:678(_constructor_sliced_from_mgr)\n", - " 108 0.004 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1863(from_array)\n", - " 35 0.001 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:387(apply)\n", - " 36 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1756(_get_slice_axis)\n", - " 23 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1216(emit)\n", - " 4 0.000 0.000 0.007 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:622(_get_splitter)\n", - " 3 0.000 0.000 0.007 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:928(_finalize_columns_and_data)\n", - " 301 0.001 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:273(__call__)\n", - " 4 0.000 0.000 0.007 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:192(__sub__)\n", - " 13 0.000 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:798(tolist)\n", - " 1 0.001 0.001 0.007 0.007 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:132(__init__)\n", - " 1094 0.007 0.000 0.007 0.000 {built-in method _locale.setlocale}\n", - " 229 0.002 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:790(copy)\n", - " 101 0.001 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_strptime.py:564(_strptime_datetime)\n", - " 65 0.005 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:239(maybe_convert_indices)\n", - " 3 0.001 0.000 0.007 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:301(lexsort_indexer)\n", - " 2 0.000 0.000 0.007 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:567(validate_core_schema)\n", - " 12 0.001 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/base.py:2058(tolist)\n", - " 12 0.000 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1322(__contains__)\n", - " 6 0.001 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:9041(groupby)\n", - " 58 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:586()\n", - " 2 0.007 0.003 0.007 0.003 {built-in method pydantic_core._pydantic_core.validate_core_schema}\n", - " 1002 0.003 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:178(_datetime_metadata_str)\n", - " 12 0.000 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2982(get_loc)\n", - " 30 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6957()\n", - " 1 0.000 0.000 0.007 0.007 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:139(_parse_date_columns)\n", - " 67 0.001 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:106(_ensure_data)\n", - " 116 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:583(copy_func)\n", - " 13 0.000 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:482(nanany)\n", - " 12 0.000 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:3308(_get_level_indexer)\n", - " 1 0.000 0.000 0.007 0.007 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:4620(map)\n", - " 74/71 0.001 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:1131(take)\n", - " 63 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:262(_get_hashtable_algo)\n", - " 36 0.002 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4361(_slice)\n", - " 12 0.001 0.000 0.006 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1197(_format_strings)\n", - " 101 0.003 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_strptime.py:309(_strptime)\n", - " 4 0.000 0.000 0.006 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:687(codes)\n", - " 4 0.000 0.000 0.006 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:690()\n", - " 2 0.000 0.000 0.006 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1397(_getitem_axis)\n", - " 1 0.000 0.000 0.006 0.006 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1823(_setup_result_proxy)\n", - " 70 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2520(get_schema_or_ref)\n", - " 16 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:1149(__iter__)\n", - " 1 0.001 0.001 0.006 0.006 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1893(_setup_dml_or_text_result)\n", - " 2 0.000 0.000 0.006 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1205(_getbool_axis)\n", - " 61 0.001 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1412(_insert_update_blklocs_and_blknos)\n", - " 28 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6925(f)\n", - " 35 0.001 0.000 0.006 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:773(parse_option_tick)\n", - " 10 0.001 0.000 0.006 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2190(_form_blocks)\n", - " 5485 0.006 0.000 0.006 0.000 {method 'lower' of 'str' objects}\n", - " 25 0.002 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:977(_cmp_method)\n", - " 64 0.001 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1726(_make_fixed_width)\n", - " 5186 0.005 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:203(isword)\n", - " 1 0.000 0.000 0.006 0.006 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:474(from_arrays)\n", - " 49/26 0.001 0.000 0.006 0.000 {built-in method _operator.le}\n", - " 35 0.001 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:77(get_type_ref)\n", - " 1 0.000 0.000 0.006 0.006 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:3048(factorize_from_iterables)\n", - " 12 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2957(_get_loc_single_level_index)\n", - " 8 0.000 0.000 0.006 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7031(drop)\n", - " 349 0.006 0.000 0.006 0.000 {method 'copy' of 'numpy.ndarray' objects}\n", - " 3 0.000 0.000 0.006 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:3069()\n", - " 2 0.001 0.000 0.006 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:231(get_result)\n", - " 2 0.000 0.000 0.006 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:3005(factorize_from_iterable)\n", - " 12 0.001 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1805(_trim_zeros_float)\n", - " 1009 0.002 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:481(ensure_wrapped_if_datetimelike)\n", - " 2 0.000 0.000 0.006 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5433(drop)\n", - " 1038 0.004 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2537(dtype_to_unit)\n", - " 2 0.000 0.000 0.006 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4757(drop)\n", - " 1 0.001 0.001 0.006 0.006 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1778(__repr__)\n", - " 31 0.001 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6679(_maybe_cast_listlike_indexer)\n", - " 13 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1247(series_generator)\n", - " 6 0.001 0.000 0.006 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1296(__init__)\n", - " 6/2 0.001 0.000 0.006 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1438(putmask)\n", - " 287 0.005 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:551(maybe_promote)\n", - " 1 0.000 0.000 0.005 0.005 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:691()\n", - " 4099 0.005 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2004(internal_values)\n", - " 1303 0.005 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:336(hms)\n", - " 3 0.001 0.000 0.005 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:7903(_arith_method)\n", - " 23 0.005 0.000 0.005 0.000 {method 'flush' of '_io.TextIOWrapper' objects}\n", - " 30 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:220(__init__)\n", - " 12 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:558(_parse_with_reso)\n", - " 113 0.002 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:231(asarray_tuplesafe)\n", - " 30 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:373(_finalize)\n", - " 99 0.002 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2313(is_unique)\n", - " 12 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:275(_parse_with_reso)\n", - " 2 0.000 0.000 0.005 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/generic.py:2002(_get_data_to_aggregate)\n", - " 209 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:97(is_bool_indexer)\n", - " 27 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:325(__new__)\n", - " 8/7 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1040(_match_generic_type)\n", - " 16 0.002 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:550(validate_categories)\n", - " 12 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1349(format_with_na_rep)\n", - " 12 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:42(__ne__)\n", - " 4 0.001 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:94(concatenate_managers)\n", - " 902 0.005 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:319(jump)\n", - " 4 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:208(__truediv__)\n", - " 4010 0.004 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:734(name)\n", - " 11 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6432(dtypes)\n", - " 47 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:157(take)\n", - " 55 0.002 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1519(construct_1d_arraylike_from_scalar)\n", - " 190 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:82(shape)\n", - " 33 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:240(arithmetic_op)\n", - " 83 0.002 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:380(notna)\n", - " 10 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:596(_homogenize)\n", - " 529 0.002 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2152(unit)\n", - " 71 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4402(_check_setitem_copy)\n", - " 248 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2645(maybe_coerce_values)\n", - " 122 0.004 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5562(append)\n", - " 1 0.001 0.001 0.005 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:1422(__init__)\n", - " 9 0.003 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:122(get_group_index)\n", - " 5 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:7918(_dispatch_frame_op)\n", - " 5 0.001 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6463(astype)\n", - " 4250 0.005 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6055(_check_indexing_error)\n", - " 134 0.001 0.000 0.005 0.000 {built-in method builtins.sum}\n", - " 6 0.001 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:846(get_grouper)\n", - " 3256 0.005 0.000 0.005 0.000 {method 'get' of 'dict' objects}\n", - " 5 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1425(_format_flat)\n", - " 395 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:137(is_object_dtype)\n", - " 3 0.000 0.000 0.005 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5359(reindex)\n", - " 53 0.002 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1095(__getitem__)\n", - " 1 0.000 0.000 0.005 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:610(prepare_cookies)\n", - " 7 0.001 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1369(_union_schema)\n", - " 1 0.000 0.000 0.005 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:231(parse_headers)\n", - " 1 0.000 0.000 0.005 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:140(get_cookie_header)\n", - " 1 0.001 0.001 0.005 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/_optional.py:85(import_optional_dependency)\n", - " 5 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1448(_format_with_header)\n", - " 2 0.001 0.000 0.005 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:202(__init__)\n", - " 25 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:12675(_reindex_for_setitem)\n", - " 8 0.001 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4470(_iset_item_mgr)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/parser.py:59(parsestr)\n", - " 98 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2703(new_block_2d)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/parser.py:41(parse)\n", - " 6 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1633(as_array)\n", - " 13 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1316(view)\n", - " 4 0.001 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2016(_sort_levels_monotonic)\n", - " 4 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:12590(values)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:330(connection_from_pool_key)\n", - " 13 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1248(copy)\n", - " 2 0.001 0.000 0.004 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1450(grouped_reduce)\n", - " 6 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/from_thread.py:308(start_task_soon)\n", - " 1 0.002 0.002 0.004 0.004 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:453(update_greek_limits)\n", - " 37 0.002 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:386(default_index)\n", - " 4 0.001 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1707(_interleave)\n", - " 58 0.002 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/base.py:549(find)\n", - " 1 0.001 0.001 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2225(_handle_dbapi_exception)\n", - " 4 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:3951(T)\n", - " 6945 0.004 0.000 0.004 0.000 {built-in method builtins.setattr}\n", - " 2 0.002 0.001 0.004 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:369(parse_url)\n", - " 4 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/_backends/_asyncio.py:980(_spawn_task_from_thread)\n", - " 2 0.004 0.002 0.004 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2083(remove_unused_levels)\n", - " 4 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:3767(transpose)\n", - " 1 0.001 0.001 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:229(_new_pool)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:258(_get_conn)\n", - " 19 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:307(unique)\n", - " 54 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:655(write)\n", - " 2 0.001 0.000 0.004 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:348(get_function_type_hints)\n", - " 255 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:773(_view)\n", - " 19 0.003 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:427(unique_with_mask)\n", - " 1 0.001 0.001 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:238(_new_conn)\n", - " 34 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:288(comparison_op)\n", - " 58 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:141(__exit__)\n", - " 4 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/_backends/_asyncio.py:2483(run_sync_from_thread)\n", - " 2 0.002 0.001 0.004 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/string.py:119(_join_multiline)\n", - " 2 0.003 0.001 0.004 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:731(generate_data)\n", - " 35 0.000 0.000 0.004 0.000 {built-in method strptime}\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1818(to_string)\n", - " 1060 0.003 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:193(__get__)\n", - " 16 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:1452(safe_sort)\n", - " 4 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:1162(_sorted_data)\n", - " 9 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1066(iset)\n", - " 26 0.000 0.000 0.004 0.000 {built-in method builtins.print}\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:3280(raw_connection)\n", - " 1 0.001 0.001 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:1485(_init_metadata)\n", - " 334 0.001 0.000 0.004 0.000 {built-in method builtins.any}\n", - " 4 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:1364(_duplicated)\n", - " 2 0.000 0.000 0.004 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:860(values)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:2365(mean)\n", - " 1 0.001 0.001 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:2063(to_dict)\n", - " 1 0.001 0.001 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:441(connect)\n", - " 4 0.001 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/base.py:1170(duplicated)\n", - " 2 0.000 0.000 0.004 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:592(flush)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1957(_cython_agg_general)\n", - " 22 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6519(sum)\n", - " 205 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:659(_constructor_from_mgr)\n", - " 21 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_exceptions.py:34(find_stack_level)\n", - " 61 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1393(moveaxis)\n", - " 2 0.001 0.000 0.004 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1578(_wrap_aggregated_output)\n", - " 22 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12498(sum)\n", - " 2167 0.004 0.000 0.004 0.000 {method 'format' of 'str' objects}\n", - " 566 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:84()\n", - " 22 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:140(get_option_specifics_from_key)\n", - " 1 0.001 0.001 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4360(_iset_not_inplace)\n", - " 338 0.004 0.000 0.004 0.000 {built-in method builtins.id}\n", - " 1 0.002 0.002 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:177(__init__)\n", - " 803 0.003 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1331(is_ea_or_datetimelike_dtype)\n", - " 22 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12459(_min_count_stat_function)\n", - " 118 0.003 0.000 0.003 0.000 {method 'take' of 'numpy.ndarray' objects}\n", - " 2265 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:213(isspace)\n", - " 50 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:71(_wrapreduction)\n", - " 29 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:823(take)\n", - " 1 0.001 0.001 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:106(_encode_params)\n", - " 18 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:2344(unique)\n", - " 10 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:263(eval_type_backport)\n", - " 2 0.000 0.000 0.003 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:378(new_index)\n", - " 6688 0.003 0.000 0.003 0.000 {method 'append' of 'list' objects}\n", - " 181 0.000 0.000 0.003 0.000 {method 'max' of 'numpy.ndarray' objects}\n", - " 32 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:957(_validate_tuple_indexer)\n", - " 18 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:1019(unique)\n", - " 58 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:299(helper)\n", - " 48 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5425(_getitem_slice)\n", - " 5 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1483(reduce)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2588(_get_codes_for_sorting)\n", - " 48 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:261(_isna_array)\n", - " 4026 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:265(_engine_type)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2603()\n", - " 3 0.001 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:7142(fillna)\n", - " 1 0.002 0.002 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:115(__init__)\n", - " 89 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/ipkernel.py:790()\n", - " 64 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:189(_na_arithmetic_op)\n", - " 35 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6394(_should_compare)\n", - " 2 0.002 0.001 0.003 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/version/__init__.py:339(__init__)\n", - " 4 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:994(duplicated)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:478(calculate_quantity)\n", - " 5 0.001 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:782(result_index)\n", - " 2 0.000 0.000 0.003 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:776(_get_formatted_column_labels)\n", - " 425 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:180(blknos)\n", - " 1 0.001 0.001 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:331(putrequest)\n", - " 585 0.002 0.000 0.003 0.000 :1207(_handle_fromlist)\n", - " 1 0.001 0.001 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/methods/to_dict.py:78(to_dict)\n", - " 449 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:635(_get_root)\n", - " 58 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:104(__init__)\n", - " 1 0.001 0.001 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1255(_checkout)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:305(to_string)\n", - " 1 0.001 0.001 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:7885(replace)\n", - " 5 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:68(__and__)\n", - " 9473 0.003 0.000 0.003 0.000 {method 'read' of '_io.StringIO' objects}\n", - " 181 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:39(_amax)\n", - " 61 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1402(_insert_update_mgr_locs)\n", - " 2 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2499(getproxies_environment)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2685(getproxies)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1287(endheaders)\n", - " 166 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:784(name)\n", - " 5 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6123(_logical_method)\n", - " 4 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:699(new_axes)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1049(_send_output)\n", - " 152 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5170(_get_engine_target)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:988(send)\n", - " 4 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:702()\n", - " 48 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1146(take)\n", - " 1 0.001 0.001 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:134(__init__)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:278(connect)\n", - " 74 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1764(is_consolidated)\n", - " 408 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1816(is_number_with_decimal)\n", - " 12 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:259(schedule)\n", - " 10 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:296(_eval_type_backport)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:193(_new_conn)\n", - " 4 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:890(content)\n", - " 10 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:321(_eval_type)\n", - " 54 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:577(_schedule_flush)\n", - " 2 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:188(__radd__)\n", - " 2 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:381()\n", - " 29 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2246(_stack_arrays)\n", - " 235 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:830(__len__)\n", - " 1 0.001 0.001 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/connection.py:27(create_connection)\n", - " 45/10 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:387(_eval_type)\n", - " 8 0.000 0.000 0.003 0.000 {method 'join' of 'bytes' objects}\n", - " 542 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:380(validate)\n", - " 2 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:478(coerce_to_target_dtype)\n", - " 6/4 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2435(_signature_from_callable)\n", - " 1 0.001 0.001 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:222(read)\n", - " 260 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1471(_set_as_cached)\n", - " 177 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:236(set_axis)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:347(__init__)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:549()\n", - " 67 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:131(filterwarnings)\n", - " 4 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:816(generate)\n", - " 10 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:374(urlparse)\n", - " 87 0.000 0.000 0.003 0.000 {method 'all' of 'numpy.ndarray' objects}\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1971(array_func)\n", - " 4 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:1038(stream)\n", - " 5 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1277(is_extension_array_dtype)\n", - " 120 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:182(_add_filter)\n", - " 4 0.001 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:515(view)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:812(_cython_operation)\n", - " 53/16 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:409()\n", - " 74 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1772(_consolidate_check)\n", - " 12 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:402(walk_core_schema)\n", - " 9 0.000 0.000 0.003 0.000 {built-in method _operator.sub}\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:296(_get_combined_plan)\n", - " 13016 0.003 0.000 0.003 0.000 {method 'isdigit' of 'str' objects}\n", - " 2 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:191(_make_selectors)\n", - " 3 0.001 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:910(read)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/accessor.py:95(_getter)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/accessors.py:88(_delegate_property_get)\n", - " 10 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:744(_group_index)\n", - " 12 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1433(find_common_type)\n", - " 4 0.002 0.001 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2331(_signature_from_function)\n", - " 340 0.000 0.000 0.003 0.000 :859(__iter__)\n", - " 4187 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2043(freq)\n", - " 95 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:511(_validate_dtype)\n", - " 7 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1870(_get_label_or_level_values)\n", - " 12 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/zmq/sugar/socket.py:621(send)\n", - " 6 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:369(nargsort)\n", - " 3 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:35(__init__)\n", - " 234/12 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:196(walk)\n", - " 1 0.001 0.001 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1422(__sub__)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:171(feed)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:176(_call_parse)\n", - " 2 0.001 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:351(get_dataframe_repr_params)\n", - " 2297 0.002 0.000 0.002 0.000 {method 'pop' of 'list' objects}\n", - " 2 0.001 0.001 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:216(_parsegen)\n", - " 90 0.000 0.000 0.002 0.000 {built-in method builtins.sorted}\n", - " 7 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:378(interleaved_dtype)\n", - " 1674 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:909(__len__)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:496(_merge_cursor_description)\n", - " 63 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:280(_check_object_for_strings)\n", - " 22 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:76(_f)\n", - " 42 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:201(_simple_new)\n", - " 1099 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/__init__.py:34(using_copy_on_write)\n", - " 4 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/generic.py:1558(_wrap_applied_output)\n", - " 5465 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5144(_values)\n", - " 1 0.001 0.001 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1103(putrequest)\n", - " 37 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1819(should_trim)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:625()\n", - " 4 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:240(__pow__)\n", - " 20 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:322(_get_block_for_concat_plan)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:359(build_response)\n", - " 64 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/computation/expressions.py:226(evaluate)\n", - " 902 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:329(month)\n", - " 27 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:903(_set_levels)\n", - " 87 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:61(_all)\n", - " 7 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:723(astype)\n", - " 6 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:40(__init__)\n", - " 333 0.001 0.000 0.002 0.000 :674(__getitem__)\n", - " 1 0.001 0.001 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/env.py:47(DEBUG_MODE)\n", - " 32 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/printing.py:567(get_adjustment)\n", - " 2 0.002 0.001 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:922()\n", - " 2 0.002 0.001 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/plugin/_schema_validator.py:21(create_schema_validator)\n", - " 105 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1010(view)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:900(default_headers)\n", - " 49 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:141(equals)\n", - " 1 0.002 0.002 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:573(__init__)\n", - " 35 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3955(_get_indexer)\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:180(fillna)\n", - " 413 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1099(_parse_min_sec)\n", - " 353 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2765(check_dict_or_set_indexers)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:692(from_codes)\n", - " 20 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:305(_isna_string_dtype)\n", - " 64 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/computation/expressions.py:67(_evaluate_standard)\n", - " 1 0.001 0.001 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:1314(fetchall)\n", - " 334 0.001 0.000 0.002 0.000 {built-in method builtins.max}\n", - " 4 0.001 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:271(from_annotation)\n", - " 1 0.002 0.002 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/equity.py:65(fundamental)\n", - " 188 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2264()\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1216(_iset_split_block)\n", - " 4 0.001 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:117(view)\n", - " 296 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1253(iget)\n", - " 1 0.001 0.001 0.002 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:303()\n", - " 25 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:389(new_func)\n", - " 14 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:838(_cleanup)\n", - " 8 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:243(_from_values_or_dtype)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager.py:42()\n", - " 1 0.002 0.002 0.002 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/decorators.py:9(log_time)\n", - " 177 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:86(_validate_set_axis)\n", - " 2 0.002 0.001 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/retry.py:202(__init__)\n", - " 7 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/astype.py:191(astype_array_safe)\n", - " 122 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1330(normalize_axis_tuple)\n", - " 23 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:219(vstack)\n", - " 1 0.001 0.001 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1356(add_cookie_header)\n", - " 30 0.000 0.000 0.002 0.000 :121(__subclasscheck__)\n", - " 19 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1697(_validate_names)\n", - " 53 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:166(simplefilter)\n", - " 12 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:1180(_chop)\n", - " 1 0.001 0.001 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:943(urlencode)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1102(wrap_results)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1507(operate_blockwise)\n", - " 30 0.002 0.000 0.002 0.000 {built-in method _abc._abc_subclasscheck}\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/ops.py:57(operate_blockwise)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:7894(_cmp_method)\n", - " 2 0.001 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1935(delete)\n", - " 94 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5552(equals)\n", - " 171 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2716(new_block)\n", - " 1 0.001 0.001 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:707(checkout)\n", - " 6 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:687(compress_group_index)\n", - " 94 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:225(_consolidate_key)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/helpers.py:8(parse_signal_id)\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:214(get_compressed_ids)\n", - " 9 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5663(_reindex_with_indexers)\n", - " 26 0.002 0.000 0.002 0.000 {built-in method _thread.start_new_thread}\n", - " 79 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1081(is_numeric_dtype)\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1684(is_monotonic_increasing)\n", - " 2 0.001 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:407(__rsub__)\n", - " 142 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/json/__init__.py:299(loads)\n", - " 11 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4883(_update_inplace)\n", - " 1 0.001 0.001 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/base.py:445(__get__)\n", - " 1 0.001 0.001 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1126(_sub_datetimelike_scalar)\n", - " 37 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1827()\n", - " 5 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:227(_encode_invalid_chars)\n", - " 7 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:58(__new__)\n", - " 234/12 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:199(_walk)\n", - " 189 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1571(validate_all_hashable)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/inspection.py:113(inspect)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:7172()\n", - " 1 0.001 0.001 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/exc.py:604(instance)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:419(simplify_schema_references)\n", - " 121 0.002 0.000 0.002 0.000 {method 'remove' of 'list' objects}\n", - " 1 0.001 0.001 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:137(__init__)\n", - " 117 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:301(maybe_iterable_to_list)\n", - " 12 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:392(handle_call_schema)\n", - " 1 0.001 0.001 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:305(_connection_insp)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:1332(getfullargspec)\n", - " 7 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2235(take)\n", - " 3 0.001 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:2083(to_frame)\n", - " 1 0.002 0.002 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/sql/schema.py:5357(__init__)\n", - " 1 0.001 0.001 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:204(get_netrc_auth)\n", - " 18 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:187(validate_indices)\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7227(_arith_method)\n", - " 230 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:467(__enter__)\n", - " 64 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1574(_validate_key)\n", - " 206 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:253(fill_value)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:817(_get_formatted_index)\n", - " 26 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:844(levels)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:240(init_poolmanager)\n", - " 78 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1220(_format)\n", - " 12 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:379(handle_arguments_schema)\n", - " 58 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:764(_get_formatter)\n", - " 2 0.001 0.001 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:452(urlsplit)\n", - " 2 0.001 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/console.py:9(get_console_size)\n", - " 29 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_asarray.py:27(require)\n", - " 631 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/flags.py:51(__init__)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:543(_allrows)\n", - " 23 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1595(makeRecord)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2662(getproxies_macosx_sysconf)\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:858(_raw_read)\n", - " 96 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:273(is_dict_like)\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2307(factorize)\n", - " 98 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:924()\n", - " 1 0.002 0.002 0.002 0.002 {built-in method _scproxy._get_proxies}\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1966(_is_lexsorted)\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:707(_get_comb_axis)\n", - " 2 0.001 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:199(__init__)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:791(_autobegin)\n", - " 27 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2421(all)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:795(begin)\n", - " 22 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:455(newfunc)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/base.py:1428(factorize)\n", - " 8 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:479(__enter__)\n", - " 7 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/ops.py:29(_iter_block_pairs)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:805(call_soon_threadsafe)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:72(get_objs_combined_axis)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2002(_lexsort_depth)\n", - " 51 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1778()\n", - " 43 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2744(inferred_type)\n", - " 142 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/json/decoder.py:332(decode)\n", - " 119 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:892(getfile)\n", - " 79 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:350(getitem_block_columns)\n", - " 1784 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1168(ident)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:849(__init__)\n", - " 18 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:430(__enter__)\n", - " 23 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:292(__init__)\n", - " 66 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:217(_ensure_arraylike)\n", - " 25 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:942(format)\n", - " 26 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:897()\n", - " 25 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:524(_validate_comparison_value)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:120(_get_combined_index)\n", - " 11070 0.001 0.000 0.001 0.000 {method 'keys' of 'dict' objects}\n", - " 5188 0.001 0.000 0.001 0.000 {method 'isalpha' of 'str' objects}\n", - " 18 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2979(prod)\n", - " 27 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1085(_set_codes)\n", - " 26 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/ipkernel.py:768(init_closure)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:124(extract_cookies_to_jar)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:4037(_lexsort_depth)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:735(has_dropped_na)\n", - " 762 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:649(_get_deprecated_option)\n", - " 110/109 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:390(_get_getitem_freq)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/selector_events.py:128(_write_to_self)\n", - " 89 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1501(enumerate)\n", - " 569 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/flags.py:87(allows_duplicate_labels)\n", - " 50 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:922(acquire)\n", - " 25 0.000 0.000 0.001 0.000 {method 'min' of 'numpy.ndarray' objects}\n", - " 25 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:674(format)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:717(_get_concat_axis)\n", - " 202 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:568(require_length_match)\n", - " 16 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:153(_set_option)\n", - " 198/22 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:128(deepcopy)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1193(_engine)\n", - " 4 0.001 0.000 0.001 0.000 {method 'send' of '_socket.socket' objects}\n", - " 75 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:782(_rename)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:630(prepare_hooks)\n", - " 320 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:586(_get_axis)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/base.py:800(argsort)\n", - " 7 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:958(fast_xs)\n", - " 298 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2674(get_block_type)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:207(register_hook)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:95(_default_key_normalizer)\n", - " 22 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:604(nansum)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:901(quote_plus)\n", - " 453 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:676(_translate_key)\n", - " 7 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/astype.py:157(astype_array)\n", - " 2 0.001 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1680(extract_cookies)\n", - " 63 0.001 0.000 0.001 0.000 {method 'acquire' of '_thread.RLock' objects}\n", - " 42 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2320(_preprocess_slice_or_indexer)\n", - " 4 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2692(max)\n", - " 9 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/printing.py:524(adjoin)\n", - " 2 0.000 0.000 0.001 0.001 {method 'throw' of 'generator' objects}\n", - " 45 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_utils.py:76(lenient_issubclass)\n", - " 4587 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6672(_maybe_cast_indexer)\n", - " 315 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2795(extend_blocks)\n", - " 14 0.001 0.000 0.001 0.000 {method 'setdefault' of 'dict' objects}\n", - " 25 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:43(_amin)\n", - " 65 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1667(_validate_integer)\n", - " 542 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:482()\n", - " 60 0.001 0.000 0.001 0.000 {method 'argsort' of 'numpy.ndarray' objects}\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:777(_concat_indexes)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:776(reconstructed_codes)\n", - " 7 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4159(xs)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:808(__init__)\n", - " 281 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/frozen.py:76(__getitem__)\n", - " 133 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4623(_clear_item_cache)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5455(append)\n", - " 7 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:847(quote)\n", - " 4/3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:58(__ge__)\n", - " 31 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6415(_is_comparable_dtype)\n", - " 257 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:292(make_block_same_class)\n", - " 11 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:66(copy)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:150(assemble_bulk_data_request)\n", - " 16 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5598()\n", - " 9 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/printing.py:31(adjoin)\n", - " 495 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1392()\n", - " 240 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:195(is_array_like)\n", - " 2 0.001 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_discriminated_union.py:37(apply_discriminators)\n", - " 32 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:789(values)\n", - " 26 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:856(__init__)\n", - " 88 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:795(_merge_cols_by_none)\n", - " 1241 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:24(_kind_name)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5491(_concat)\n", - " 36 0.000 0.000 0.001 0.000 {method 'sum' of 'numpy.ndarray' objects}\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:5486(isin)\n", - " 309 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:688(_warn_if_deprecated)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:421(astype)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:268(decons_obs_group_ids)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/utils.py:268(identify_sig_or_bom)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:588(prepare_auth)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/_concurrency_py3k.py:61(is_exit_exception)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:3261(signature)\n", - " 25 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1831()\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:304(cert_verify)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:82(f)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:1018(get_auth_from_url)\n", - " 82 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/printing.py:165(pprint_thing)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:176(sorted_labels)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:3007(from_callable)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:230(_handle_eof)\n", - " 2 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:246(_decons_group_index)\n", - " 3 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/methods/to_dict.py:171()\n", - " 8 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1392(np_find_common_type)\n", - " 107 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:184(_reconstruct_data)\n", - " 21 0.000 0.000 0.001 0.000 :71(join)\n", - " 49 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1220(_get_value)\n", - " 34 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:836(_isnan)\n", - " 131 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/printing.py:513(justify)\n", - " 34 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:440(acquire)\n", - " 61 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2311(_fast_count_smallints)\n", - " 111 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2776(_is_multi)\n", - " 98 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1102()\n", - " 1 0.001 0.001 0.001 0.001 {built-in method io.open}\n", - " 33 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:53(_wrapfunc)\n", - " 41/2 0.001 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:425(collect_refs)\n", - " 4 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_common.py:27(_init_wait_gen)\n", - " 12 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:353(wrapper)\n", - " 8 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5651(identical)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1512(_close_special)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:194(_handle_warnings)\n", - " 309 0.001 0.000 0.001 0.000 {method 'endswith' of 'str' objects}\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1784(get_level_values)\n", - " 864 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:758(_maybe_repeat)\n", - " 34 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2666(_maybe_normalize_endpoints)\n", - " 393 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:322(weekday)\n", - " 12 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1352()\n", - " 36 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:47(_sum)\n", - " 87 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1774(get_result_processor)\n", - " 232 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:673(na_value_for_dtype)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/exc.py:692(__init__)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:156(_indexer_and_to_sort)\n", - " 334 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:325(_get_take_nd_function)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1565(__invert__)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1384(_checkin)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:393(logical_op)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:333(from_annotated_attribute)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:156(username)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:196(__rsub__)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:917(_finalize_fairy)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:416(_maybe_cast_listlike_indexer)\n", - " 23 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1025(argsort)\n", - " 182 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:319(asi8)\n", - " 2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:369(__init__)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:469(_parse_headers)\n", - " 80 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:243(__init__)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12362(_stat_function)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1758(_get_level_values)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:243(replace)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:246(get_new_values)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:202(union_indexes)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:523(cython_operation)\n", - " 7 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:61(merge_setting)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:351(putheader)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:384(get_series_repr_params)\n", - " 22 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:227(_deepcopy_dict)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:198(__init__)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:200(__mul__)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/exc.py:477(__init__)\n", - " 8 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1476(_format_strings)\n", - " 40 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:165(maybe_lift)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/accessors.py:70(_get_values)\n", - " 214 0.001 0.000 0.001 0.000 {method 'clear' of 'dict' objects}\n", - " 9 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/functools.py:35(update_wrapper)\n", - " 1341 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/printing.py:510(len)\n", - " 36 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:33(seterr)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:127(__init__)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:751(checkin)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:310(_cython_op_ndim_compat)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:664(get_handle)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6488(isna)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:658(__init__)\n", - " 122 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1768(ravel)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:354(_call_cython_op)\n", - " 174/78 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:206(_handle_other_schemas)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7218(_construct_result)\n", - " 1153 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:405(flags)\n", - " 8 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1482()\n", - " 156 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:948(from_blocks)\n", - " 101 0.001 0.000 0.001 0.000 {method 'reshape' of 'numpy.ndarray' objects}\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1259(putheader)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:828(replace)\n", - " 393 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:342(ampm)\n", - " 2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:113(comp_method_OBJECT_ARRAY)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1685(_clean_options)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:355(_concatenate_chunks)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:228(_construct)\n", - " 483 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:214(is_extension)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2597(cats)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:195(__init__)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:451(_return_conn)\n", - " 59 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1755()\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/timedeltas.py:149(__new__)\n", - " 2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:2208(__init__)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1643(fillna)\n", - " 117 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1643(__len__)\n", - " 2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:593(fetch_eof_columns)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2678(__init__)\n", - " 1060 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:1257(value)\n", - " 35 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:525(_unbox_scalar)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/impl.py:144(_do_return_conn)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:242(__init__)\n", - " 56 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:274(make_block)\n", - " 22 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1342(is_complex_dtype)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:754(parse_position_id)\n", - " 17 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1826(_check_label_or_level_ambiguity)\n", - " 8 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:418(merge_field_infos)\n", - " 29 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:2082(empty)\n", - " 5 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:123(__init__)\n", - " 22 0.001 0.000 0.001 0.000 {built-in method _warnings.warn}\n", - " 73 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2811(ensure_block_shape)\n", - " 7 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:424(str_schema)\n", - " 24 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:2077(__contains__)\n", - " 4 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1730(_get_default_index_names)\n", - " 2 0.000 0.000 0.001 0.000 :229(expanduser)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:8282(_construct_result)\n", - " 23 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:81(atleast_2d)\n", - " 11 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2229(is_monotonic_increasing)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2700(_connection_begin_impl)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/queue.py:132(put)\n", - " 27 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1574(_set_names)\n", - " 7 0.000 0.000 0.001 0.000 :778(__contains__)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/base.py:183(_for_instance)\n", - " 74 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:836(__iter__)\n", - " 35 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3996(_check_indexing_method)\n", - " 275 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:219(_can_consolidate)\n", - " 453 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:617(_select_options)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:596(shape)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/accessor.py:220(__get__)\n", - " 1336 0.001 0.000 0.001 0.000 {method 'is_finite' of 'decimal.Decimal' objects}\n", - " 230 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:488(__exit__)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:396(build_connection_pool_key_attributes)\n", - " 41 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:414(_split_op_result)\n", - " 54 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/common.py:81(get_op_result_name)\n", - " 66 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1305(base_formatter)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:758()\n", - " 7 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:345(to_key_val_list)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/base.py:180(_for_class)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:306(is_named_tuple)\n", - " 69 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4585(_ensure_valid_index)\n", - " 10 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:527(__init__)\n", - " 2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:542(merge_cookies)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:111(f)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:2329(hfunc)\n", - " 71 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:4120(_coerce_indexer_frozen)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:551()\n", - " 16 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:598()\n", - " 2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:718(_reorder_by_uniques)\n", - " 68 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1763(np_can_hold_element)\n", - " 386/385 0.001 0.000 0.001 0.000 {method 'encode' of 'str' objects}\n", - " 399 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1590()\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1091(_begin_impl)\n", - " 23 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:534(_scalar_from_string)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:90(_urllib3_request_context)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:2134(_fetchall_impl)\n", - " 447 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:372(apply_if_callable)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1158(_sub_datetimelike)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/base.py:137(__init__)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:176(isna)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:494(prepare_body)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1559(itertuples)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:337(extend)\n", - " 493 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:999(__len__)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/string.py:128()\n", - " 12 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:676(ngroups)\n", - " 2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/string.py:63(_need_to_wrap_around)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:352(na_logical_op)\n", - " 2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:533(_maybe_downcast)\n", - " 2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:226(__get_underlier_data)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/weakref.py:568(__init__)\n", - " 32 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:935(_expand_ellipsis)\n", - " 11 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:287(get_dtypes)\n", - " 8 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6916(delete)\n", - " 3 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:137(__new__)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:241(_from_sequence_not_strict)\n", - " 2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:84(__init__)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:228(extract_numeric_value)\n", - " 4 0.001 0.000 0.001 0.000 {built-in method _operator.pow}\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:957(getaddrinfo)\n", - " 10 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:572(_is_uniform_join_units)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6509(max)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:237(ndarray_to_mgr)\n", - " 2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/constants.py:320(raise_warning_against_deprecated_cursor_class)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:252(_init_connection)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:1130(fetchall)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/accessors.py:611(__new__)\n", - " 2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:457(__neg__)\n", - " 343 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:735(_sanitize_str_dtypes)\n", - " 26 0.000 0.000 0.001 0.000 {method 'extend' of 'list' objects}\n", - " 44 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:328(__init__)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:457(isin)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/equity.py:307(price)\n", - " 11 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:3995(_maybe_update_cacher)\n", - " 57 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1047(shape)\n", - " 14 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:1305(construct_from_string)\n", - " 2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:232(get_underlier_data)\n", - " 230 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:441(__init__)\n", - " 142 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/json/decoder.py:343(raw_decode)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12397(max)\n", - " 68 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:914(__len__)\n", - " 25 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:718(_unbox)\n", - " 49 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:111(is_annotated)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:990(sequence_to_td64ns)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1630()\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:819(get_connection)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1532(__neg__)\n", - " 271 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:667(_info_axis)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:5(refresh_cache)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1297(_cookie_attrs)\n", - " 5 0.001 0.000 0.001 0.000 {built-in method _operator.and_}\n", - " 223 0.001 0.000 0.001 0.000 {method 'astype' of 'numpy.ndarray' objects}\n", - " 2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1599(make_cookies)\n", - " 4 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:4039()\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager.py:53()\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:255(__init__)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1491(warning)\n", - " 549 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:572(_get_axis_number)\n", - " 2265 0.001 0.000 0.001 0.000 {method 'isspace' of 'str' objects}\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:492(to_numpy)\n", - " 4 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:373(inner)\n", - " 2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/console.py:54(in_interactive_session)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:638(_extract_index)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:843(_hasna)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:226(isna)\n", - " 4 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:899(is_nonnegative_int)\n", - " 39 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:612(result_iterator)\n", - " 3 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/hooks.py:15(default_hooks)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/connection.py:93(_set_socket_options)\n", - " 32 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/printing.py:507(__init__)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:296(_get_formatted_values)\n", - " 4 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:56(__init__)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:207(validate_header_arg)\n", - " 35 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6324(_maybe_downcast_for_indexing)\n", - " 383 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1740()\n", - " 35 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:775(infer_dtype_from_scalar)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:871(_do_date_conversions)\n", - " 393 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1133(_parsems)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/request.py:189(body_to_chunks)\n", - " 14 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/string_.py:140(construct_from_string)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/response.py:40(assert_header_parsing)\n", - " 2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:514(_collect_metadata)\n", - " 2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:101(is_holiday)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:895(_get_hostport)\n", - " 7 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:923(quote_from_bytes)\n", - " 12 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1834()\n", - " 320 0.000 0.000 0.001 0.000 :697(__iter__)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1216(_get_rows_with_mask)\n", - " 24 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2353(copy)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:393(prepare_method)\n", - " 1 0.001 0.001 0.001 0.001 {built-in method _socket.getaddrinfo}\n", - " 10 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:1084(_convert_grouper)\n", - " 393 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1837(__init__)\n", - " 1 0.001 0.001 0.001 0.001 :1()\n", - " 333 0.000 0.000 0.001 0.000 :756(encode)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/abstract/singleton.py:14(__call__)\n", - " 25 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:606(formatTime)\n", - " 324 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1749(just)\n", - " 636 0.000 0.000 0.001 0.000 :760(decode)\n", - " 30 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1734(isEnabledFor)\n", - " 4 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:303(_normalize_host)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:521(cookiejar_from_dict)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:1426(_validate_parse_dates_arg)\n", - " 60 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:537(_check_compatible_with)\n", - " 2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/string.py:22(__init__)\n", - " 483 0.001 0.000 0.001 0.000 {method 'split' of 'str' objects}\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:572(prepare_content_length)\n", - " 510 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:360(convertyear)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1495(_maybe_update_cacher)\n", - " 32 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1652(_is_scalar_access)\n", - " 25 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1051(_stop)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:343()\n", - " 72 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/dispatch.py:17(should_extension_dispatch)\n", - " 2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/utils/filters.py:8(filter_inputs)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:325(get_new_columns)\n", - " 94 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:108(asi8)\n", - " 61 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5295(_validate_fill_value)\n", - " 121 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:456(_engine_type)\n", - " 87 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:2140()\n", - " 10 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:560(_validate_scalar)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2244(get_values)\n", - " 2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:211(_simple_new)\n", - " 23 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1561(findCaller)\n", - " 2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:150(__init__)\n", - " 19 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:978(__array__)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:405(__init__)\n", - " 10 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2036(_get_prepare_pydantic_annotations_for_known_type)\n", - " 510 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:402(has_year)\n", - " 8 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:586(update_dtype)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:652(_validate_listlike)\n", - " 30 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:294(handle_union_schema)\n", - " 17 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:664(_constructor_from_mgr)\n", - " 571 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3809()\n", - " 4 0.001 0.000 0.001 0.000 {method 'send' of 'generator' objects}\n", - " 28 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:562(__init__)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:1148(take)\n", - " 16/15 0.000 0.000 0.001 0.000 {built-in method _operator.eq}\n", - " 2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:170(parent_frame_namespace)\n", - " 34 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:314(_result_or_cancel)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:1113(_is_indexed_like)\n", - " 7 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/helpers/utils.py:10(verify_ticker)\n", - " 37/27 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2432(_extract_get_pydantic_json_schema)\n", - " 181 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:2443(get_origin)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:470()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:279(_extract_multi_indexer_columns)\n", - " 40 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:633(is_integer_dtype)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2000(external_values)\n", - " 129 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/numpy/function.py:64(__call__)\n", - " 71 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:74(__len__)\n", - " 85 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/printing.py:522()\n", - " 83 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4379(_set_is_copy)\n", - " 97 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1262(_slice)\n", - " 574 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:718(dtype)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:147(start_date)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:54(__gt__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1093(_getitem_nested_tuple)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:266(index_labels_to_array)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:404(__radd__)\n", - " 229 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/__init__.py:55(using_pyarrow_string_dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:479(items)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:8058(_should_reindex_frame_op)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6480(all)\n", - " 79 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:973(coerce_indexer_dtype)\n", - " 92 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:122(_reset_cache)\n", - " 393 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1056(_could_be_tzname)\n", - " 290 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:300()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1250(copy)\n", - " 61 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1389(_moveaxis_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4651(_maybe_cache_changed)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:644(get_group_index_sorter)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:317(__add__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6629(cumprod)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:946(_sorted_ids)\n", - " 82 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/printing.py:196(as_escaped_string)\n", - " 115 0.000 0.000 0.000 0.000 {method 'nonzero' of 'numpy.ndarray' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2567(_proxy_bypass_macosx_sysconf)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5172(delete)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:1083(reduction)\n", - " 20/19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_repr.py:86(display_as_type)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:810()\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:435(__exit__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:1123(_make_date_converter)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:597()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1728(duplicated)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12291(cumprod)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/utils.py:215(any_specified_encoding)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1954(get_rows_with_mask)\n", - " 321 0.000 0.000 0.000 0.000 {built-in method numpy.asanyarray}\n", - " 88 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:79()\n", - " 107 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:592(_get_block_manager_axis)\n", - " 298 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1081(codes)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12239(_accum_func)\n", - " 8 0.000 0.000 0.000 0.000 :941(update)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2817(hasnans)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:974(_is_nested_tuple_indexer)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:485(__exit__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2107(droplevel)\n", - " 35 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:209(count_not_none)\n", - " 335 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/__init__.py:42(warn_copy_on_write)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:675(empty)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/env.py:62(str2bool)\n", - " 165 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:274(__exit__)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1692()\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:448(size)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1500(_format_strings)\n", - " 165 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:271(__enter__)\n", - " 190 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:791(is_)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:10185(align)\n", - " 4/3 0.000 0.000 0.000 0.000 {built-in method _operator.ge}\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:720(size)\n", - " 154 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/base.py:238(construct_from_string)\n", - " 56 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1310(__getattr__)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/printing.py:51()\n", - " 41/2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_discriminated_union.py:45(inner)\n", - " 383 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1940(_block)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:158(collect_invalid_schemas)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:304(_get_filepath_or_buffer)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6499(min)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1771(_is_label_reference)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:398(reduce)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6219(_raise_if_missing)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:481()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:744(_format_native_types)\n", - " 36 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4191(_validate_positional_slice)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:425(__init__)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:389(is_na)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12381(min)\n", - " 21 0.000 0.000 0.000 0.000 :150(dirname)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:105(__init__)\n", - " 36 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:132(geterr)\n", - " 421 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:196(blklocs)\n", - " 12 0.000 0.000 0.000 0.000 {built-in method _operator.ne}\n", - " 41/2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:161(_is_schema_valid)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1689()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1467(debug)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1551()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:315(__init__)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:259(_reconstruct)\n", - " 747 0.000 0.000 0.000 0.000 {method 'raw' of '_mysql_connector.MySQL' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:801(_fp_read)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:74(array)\n", - " 584 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/flags.py:55(allows_duplicate_labels)\n", - " 47 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:2378(array_equal)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/base.py:294(is_dtype)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/concat.py:52(concat_compat)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:480()\n", - " 569 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:363(attrs)\n", - " 122 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1380()\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:249(external_values)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1261(__init__)\n", - " 511 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1671(name)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/string.py:129()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:546(request_url)\n", - " 524 0.000 0.000 0.000 0.000 {method 'startswith' of 'str' objects}\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:8084(_align_for_op)\n", - " 89 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:373(is_sequence)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/impl.py:153(_do_get)\n", - " 49 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:4035(_dict_not_none)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2159(_drop_level_numbers)\n", - " 269 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:363(ndim)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2794(_na_value)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1922(rename)\n", - " 64 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/missing.py:131(dispatch_fill_zeros)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:487()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:457(read)\n", - " 799 0.000 0.000 0.000 0.000 {built-in method builtins.callable}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:838(select_proxy)\n", - " 69 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:194(_is_internal_frame)\n", - " 182 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:745()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:5565(_reindex_output)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2285()\n", - " 72 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6312(_index_as_unique)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:939(_sort_idx)\n", - " 218 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1270(is_1d_only_ea_dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/weakref.py:585(__call__)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Configuration.py:37(__setattr__)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:466(array_equivalent)\n", - " 41/2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:488(inline_refs)\n", - " 46 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/printing.py:518()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3035(unique)\n", - " 105 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2177(_grouping_func)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/base.py:2411(_quote_free_identifiers)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:122(collect_definitions)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:10479(_align_frame)\n", - " 188 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1828()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/errors.py:222(get_mysql_exception)\n", - " 73 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:161(iloc)\n", - " 25 0.000 0.000 0.000 0.000 {built-in method time.localtime}\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:119(is_namedtuple)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/putmask.py:101(validate_putmask)\n", - " 41/2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:125(_record_valid_refs)\n", - " 67 0.000 0.000 0.000 0.000 {built-in method numpy.zeros}\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1798()\n", - " 41/2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:447(count_refs)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:66(mask_missing)\n", - " 25 0.000 0.000 0.000 0.000 {built-in method time.strftime}\n", - " 96 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1181()\n", - " 196 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:246(items)\n", - " 154 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1687(__eq__)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2827(external_values)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:735(_error_catcher)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4436(_wrap_reindex_result)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1605(maybe_cast_to_integer_array)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6137(_align_for_op)\n", - " 10 0.000 0.000 0.000 0.000 {method '__reduce_ex__' of 'object' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1809(set_names)\n", - " 821 0.000 0.000 0.000 0.000 {method 'decode' of 'bytes' objects}\n", - " 35 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:992(is_numeric_v_string_like)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:829(_maintain_shutdown_locks)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:359(_simple_new)\n", - " 19 0.000 0.000 0.000 0.000 {built-in method today}\n", - " 119 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:131()\n", - " 88 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:648(_colnames_from_description)\n", - " 240 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:913(__init__)\n", - " 15 0.000 0.000 0.000 0.000 :771(get)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:1174(_close_pool_connections)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1439(_indexed_same)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:166(is_finalvar)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/base.py:2414()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:223(unique)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:122(put)\n", - " 87 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/sql/type_api.py:908(_cached_result_processor)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:398(validate_inclusive)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:833(isna)\n", - " 114/53 0.000 0.000 0.000 0.000 {method 'join' of 'str' objects}\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4440(_maybe_preserve_names)\n", - " 60 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2738(is_label_like)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12260(block_accum_func)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:183(_make_sorted_values)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:1248(python_charset)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1418(_literal_schema)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:658(formatMessage)\n", - " 282 0.000 0.000 0.000 0.000 {method '__exit__' of '_thread.lock' objects}\n", - " 98 0.000 0.000 0.000 0.000 {built-in method _thread.allocate_lock}\n", - " 568 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager.py:53()\n", - " 31 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:2473(get_args)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:771(ngroups)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:253(_get_values)\n", - " 23 0.000 0.000 0.000 0.000 :140(basename)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:507(maybe_prepare_scalar_for_op)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2804(_isnan)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2623(_infer_tz_from_endpoints)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:46(__setitem__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:254(_get_footer)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1441()\n", - " 333 0.000 0.000 0.000 0.000 {method 'copy' of 'dict' objects}\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1165(__init__)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:3689(equals)\n", - " 75 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1453(current_thread)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:652(usesTime)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2399(_is_dates_only)\n", - " 23 0.000 0.000 0.000 0.000 :117(splitext)\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2669(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:167(get_annotations)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:11458(blk_func)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:1038(handle_unread_result)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1627(_get_options_with_defaults)\n", - " 100 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:226(validate_bool_kwarg)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ipaddress.py:1286(__init__)\n", - " 44 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1480()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/queue.py:174(get)\n", - " 390 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:1080(copyto)\n", - " 148 0.000 0.000 0.000 0.000 {method 'ravel' of 'numpy.ndarray' objects}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1265(_iset_single)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1284(find_result_type)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:85(path_url)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:1714(na_accum_func)\n", - " 554 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:186(__iter__)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:831(construct_from_string)\n", - " 96 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1571(_get_names)\n", - " 580 0.000 0.000 0.000 0.000 {built-in method _warnings._filters_mutated}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/putmask.py:62(putmask_without_repeat)\n", - " 1 0.000 0.000 0.000 0.000 {method 'connect' of '_socket.socket' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:592(get_content_type)\n", - " 108 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6685(_validate_indexer)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:564(_array_equivalent_object)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:447(format)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1534(blk_func)\n", - " 35 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7723(_unpack_nested_dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:1436(date)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:1499(_maybe_null_out)\n", - " 54 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:550(_is_master_process)\n", - " 25 0.000 0.000 0.000 0.000 {built-in method numpy.arange}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1524(__init__)\n", - " 67 0.000 0.000 0.000 0.000 {method 'transpose' of 'numpy.ndarray' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:182()\n", - " 33 0.000 0.000 0.000 0.000 {method 'fill' of 'numpy.ndarray' objects}\n", - " 367 0.000 0.000 0.000 0.000 {method 'rjust' of 'str' objects}\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:354(validate_ascending)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:483(prepare_headers)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:836()\n", - " 61 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1455()\n", - " 37 0.000 0.000 0.000 0.000 :405(parent)\n", - " 95 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1030(axes)\n", - " 50 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:90(RLock)\n", - " 161 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:696(ndim)\n", - " 253 0.000 0.000 0.000 0.000 {method '__exit__' of '_thread.RLock' objects}\n", - " 66 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:72(check)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:154(get)\n", - " 3 0.000 0.000 0.000 0.000 {method 'readlines' of '_io._IOBase' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5818(head)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:543(nanall)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:255(get)\n", - " 3 0.000 0.000 0.000 0.000 {method 'read' of '_io.BufferedReader' objects}\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:324(slice_block_columns)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:545(_get_sample_object)\n", - " 4 0.000 0.000 0.000 0.000 {built-in method _operator.truediv}\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7664(trim_front)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:243(_keep_alive)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1275(__init__)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1327(__instancecheck__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:5607()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3449(intersection)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:1165(_is_binary_mode)\n", - " 160 0.000 0.000 0.000 0.000 {method 'group' of 're.Match' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/astype.py:56(_astype_nansafe)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:429(__init__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:883(_get_args_resolving_forward_refs)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:440(_format)\n", - " 189 0.000 0.000 0.000 0.000 {method 'insert' of 'list' objects}\n", - " 2 0.000 0.000 0.000 0.000 {method 'fetch_fields' of '_mysql_connector.MySQL' objects}\n", - " 54 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1266(_is_dunder)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:545(is_dataclass)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1192(is_alive)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/roperator.py:10(radd)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:303(makefile)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:490(get)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:215(_vhstack_dispatcher)\n", - " 119 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:283(ismodule)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/common.py:103(_maybe_match_name)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:546(ensure_key_mapped)\n", - " 74 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:286(_is_owned)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:1547(check_below_min_count)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:182(close)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:364(cancel)\n", - " 65 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:62(is_list_like_indexer)\n", - " 136 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:292(isclass)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/decorators.py:10(decorator)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:82(frame_apply)\n", - " 88 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/weakref.py:414(__getitem__)\n", - " 281 0.000 0.000 0.000 0.000 {method 'items' of 'dict' objects}\n", - " 127 0.000 0.000 0.000 0.000 {built-in method builtins.iter}\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_weakrefset.py:85(add)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:470(any_schema)\n", - " 41 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:401(_config_wrapper)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:170()\n", - " 228 0.000 0.000 0.000 0.000 {method 'values' of 'dict' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/shape_base.py:1185(tile)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2252()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1875(to_2d_mgr)\n", - " 52 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:283(_acquire_restore)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:756(_shallow_copy)\n", - " 84 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:738()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:884(__init__)\n", - " 56 0.000 0.000 0.000 0.000 {built-in method builtins.min}\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:410(fill_bool)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:567()\n", - " 48 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:692(_constructor)\n", - " 94 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:981()\n", - " 78 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1449()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:409(iscoroutinefunction)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:324(_get_dtype_max)\n", - " 7 0.000 0.000 0.000 0.000 {built-in method _operator.invert}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1025(save_to_buffer)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:157(core_config)\n", - " 49 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:4036()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:430(_list_schema)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:480(_get_ndims)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:845(unread_result)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/numpy/function.py:413(validate_func)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6831(infer_objects)\n", - " 50 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:72()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1695()\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1657(_get_level_number)\n", - " 123 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:300(ismethod)\n", - " 129 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:378(isfunction)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:884(keys)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:862(codes)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1850(from_blocks)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:191(_validate_parse_dates_presence)\n", - " 166 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:974(dtype)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2586(get_values)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:164(hostname)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:822(reset)\n", - " 119 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:456(istraceback)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:391(_has_code_flag)\n", - " 67 0.000 0.000 0.000 0.000 :41(_get_sep)\n", - " 27 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1765(_get_names)\n", - " 119 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:126(_classes_and_not_datetimelike)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:351(_encode_target)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1570(_maybe_box_and_unbox_datetimelike)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1695(__hash__)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:432(usesTime)\n", - " 35 0.000 0.000 0.000 0.000 {method 'groupdict' of 're.Match' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:935(_verify_integrity)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:2037(to_dict)\n", - " 54 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:505(parent_header)\n", - " 109 0.000 0.000 0.000 0.000 {method 'add' of 'set' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/constants.py:993(get_info)\n", - " 50 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:929(release)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:119(_coerce_args)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:136(ones)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/weakref.py:427(__setitem__)\n", - " 29 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_asarray.py:108()\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1602(__subclasscheck__)\n", - " 62 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:992(_validate_key_length)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/accessors.py:59(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2955(__init__)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2065(set_values)\n", - " 96 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2772()\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/dataclasses.py:1258(is_dataclass)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:316(close)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:490(is_truncated)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/sql/compiler.py:7475(quote_identifier)\n", - " 119 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:480(iscode)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager.py:40()\n", - " 23 0.000 0.000 0.000 0.000 :121(_splitext)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:87(is_literal_type)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/attr.py:389(__bool__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:1191(_get_splitter)\n", - " 45 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:148(__getattr__)\n", - " 70 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/printing.py:60()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/base.py:187(_join)\n", - " 90 0.000 0.000 0.000 0.000 {method 'rfind' of 'str' objects}\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:141(validate_kwargs)\n", - " 281 0.000 0.000 0.000 0.000 {function FrozenList.__getitem__ at 0x12618e700}\n", - " 205 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:266(mgr_locs)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:638(__array__)\n", - " 119 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:466(isframe)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:494(_clean_keys_and_objs)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:311(is_null_slice)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:509(urlunparse)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:567(free_result)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:363(_can_hold_element)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:334(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:93(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:685()\n", - " 44 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:158(_check_finalvar)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1933(to_numpy)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7704(get_unanimous_names)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:231(_fix)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1881(nonzero)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2410(wrap_default)\n", - " 35 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:566(is_self_type)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:419(_close_conn)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:121(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:974(close)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:106(keys)\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:1745(currentframe)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1377(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:541(to_numpy)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/_policybase.py:319(header_fetch_parse)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:259(_standardize_fill_value)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/handlers.py:354(shouldRollover)\n", - " 122 0.000 0.000 0.000 0.000 {built-in method numpy.core._multiarray_umath.normalize_axis_index}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1195(_info_repr)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1324(_make_invoke_excepthook)\n", - " 10 0.000 0.000 0.000 0.000 {method 'astype' of 'numpy.generic' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:248(stringify_path)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:209(_maybe_get_mask)\n", - " 201 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:153(concatenate)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:687()\n", - " 4 0.000 0.000 0.000 0.000 {method 'write' of '_io.BytesIO' objects}\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:688(__call__)\n", - " 1 0.000 0.000 0.000 0.000 {method 'close' of '_io.BufferedReader' objects}\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:471(__init__)\n", - " 39 0.000 0.000 0.000 0.000 {method 'put' of '_queue.SimpleQueue' objects}\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:288()\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:157(_int64_cut_off)\n", - " 173 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:213()\n", - " 36 0.000 0.000 0.000 0.000 {built-in method numpy.seterrobj}\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:230(_can_hold_na)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:318()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:687(_constructor_expanddim_from_mgr)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:839()\n", - " 69 0.000 0.000 0.000 0.000 :52(normcase)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1562()\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:99(freq)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:131(is_new_type)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2095(create_block_manager_from_blocks)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:263(_remove_path_dot_segments)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:1054(construct_from_string)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ipaddress.py:1187(_ip_int_from_string)\n", - " 332 0.000 0.000 0.000 0.000 {method 'ljust' of 'str' objects}\n", - " 41 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1165(_check_deprecated_callable_usage)\n", - " 96 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1180()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Configuration.py:18(initialize_configuration)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:837(result_set_available)\n", - " 52 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:280(_release_save)\n", - " 10/2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:99(all_literal_values)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:172(from_float)\n", - " 73 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:470(__getattr__)\n", - " 44 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:241(is_single_block)\n", - " 259 0.000 0.000 0.000 0.000 {method 'replace' of 'str' objects}\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:587()\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:207(_arrays_for_stack_dispatcher)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:405(_check_values_indices_shape_match)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4518(_check_inplace_and_allows_duplicate_labels)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/ops.py:108(_get_same_shape_values)\n", - " 179 0.000 0.000 0.000 0.000 {method 'pop' of 'dict' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:215(get_default_val)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:3108(cumprod)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:454(__exit__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1725(can_hold_element)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/errors.py:46(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:550(infer_compression)\n", - " 5 0.000 0.000 0.000 0.000 {method 'cumsum' of 'numpy.ndarray' objects}\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Configuration.py:29(__getattr__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:762(infer_dtype_from)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:544(_initialize_justify)\n", - " 48 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:815(filter)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:813(str_schema)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:724()\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:366(notify)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:464(get_array_op)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:136(reset)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:436(_split)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:794(close)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_schema_generation_shared.py:72(__init__)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/typing_extensions.py:1132(is_typeddict)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:342(construct_from_string)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:208(_maybe_unbox_datetimelike)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:109(__init__)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:665(_get_registered_option)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:514(show_row_idx_names)\n", - " 96 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2781()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:201(_set_noconvert_columns)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:34(__str__)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:594(_bool_arith_check)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:1034(check_header_validity)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1720(getEffectiveLevel)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:635(release_conn)\n", - " 4 0.000 0.000 0.000 0.000 {method 'free_result' of '_mysql_connector.MySQL' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:2133(_refine_defaults_read)\n", - " 69 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1046(nlevels)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2567(push)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:183()\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:164()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1721()\n", - " 2 0.000 0.000 0.000 0.000 :16(exists)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/_policybase.py:301(header_source_parse)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:534()\n", - " 8 0.000 0.000 0.000 0.000 :790(items)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:536(close)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:438(convert)\n", - " 5 0.000 0.000 0.000 0.000 {built-in method posix.cpu_count}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/string.py:189(_binify)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/log.py:104(_should_log_info)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:47(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/shutil.py:1426(get_terminal_size)\n", - " 4 0.000 0.000 0.000 0.000 {built-in method _operator.inv}\n", - " 1 0.000 0.000 0.000 0.000 {method 'cumprod' of 'numpy.ndarray' objects}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1227(deepvalues)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:228(_acquireLock)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:34(__init__)\n", - " 65 0.000 0.000 0.000 0.000 {method 'item' of 'numpy.ndarray' objects}\n", - " 61 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5364(_insert_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/version/__init__.py:149(__lt__)\n", - " 339 0.000 0.000 0.000 0.000 {method 'end' of 're.Match' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:159(resolve_redirects)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/log.py:101(_should_log_debug)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/version/__init__.py:520(_cmpkey)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:180()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:781(_call_soon)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:446(_init_decoder)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:1835(construct_from_string)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:3345(arguments_parameter)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/roperator.py:14(rsub)\n", - " 23 0.000 0.000 0.000 0.000 {method 'update' of 'dict' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:639(group_keys_seq)\n", - " 159 0.000 0.000 0.000 0.000 {built-in method posix.fspath}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:137(hasnans)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:354(__array__)\n", - " 80 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:115(get_ref)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/_policybase.py:289(_sanitize_header)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1111(_values)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/pivot.py:493(_convert_by)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:205(_hostinfo)\n", - " 96 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:941()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:267(clear)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/plugin/_loader.py:21(get_plugins)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/calendar.py:122(monthrange)\n", - " 64 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1665()\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:2228(construct_from_string)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:332(array)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:598(collect_definitions)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:643(name)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:2364(with_default_schema)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:2426(nullable_schema)\n", - " 68 0.000 0.000 0.000 0.000 {built-in method time.time}\n", - " 128 0.000 0.000 0.000 0.000 {built-in method _thread.get_ident}\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:291(arrays)\n", - " 1 0.000 0.000 0.000 0.000 :2(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:177()\n", - " 2 0.000 0.000 0.000 0.000 {built-in method _operator.mul}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:278(prepare_config)\n", - " 102 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:344()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1096(_can_fast_transpose)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:138(refresh_cache)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:296(_put_conn)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:799(mount)\n", - " 35 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:557(is_generic_alias)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/weakref.py:369(remove)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/sql/elements.py:5219(construct)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1768(_set_names)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method posix.stat}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:220(__init__)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1357(__getattr__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:271(validate_fillna_kwargs)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:484(should_show_dimensions)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:553(equals)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_weakrefset.py:39(_remove)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:123(getLevelName)\n", - " 112 0.000 0.000 0.000 0.000 {method 'upper' of 'str' objects}\n", - " 49 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1206(daemon)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:950(_validate_or_indexify_columns)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/_optional.py:74(get_version)\n", - " 72 0.000 0.000 0.000 0.000 {built-in method numpy.geterrobj}\n", - " 70 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:217(_scalar_type)\n", - " 85 0.000 0.000 0.000 0.000 {method '__enter__' of '_thread.lock' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:358(update)\n", - " 33 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:688(_sanitize_non_ordered)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:206(_should_unflatten_callable_args)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1990(__exit__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/exc.py:48(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:99(_intenum_converter)\n", - " 122 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5558(_append_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:499(close)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1061()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:76(copy)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:525(get_all)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/utils.py:28(eod)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:108()\n", - " 122 0.000 0.000 0.000 0.000 {built-in method _operator.index}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:136(_codes_to_ints)\n", - " 63 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:660(_constructor)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/importlib/__init__.py:108(import_module)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:773(__init__)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2738(_check_indexing_error)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:126(language)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:502(enter_context)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:498(is_truncated_vertically)\n", - " 45 0.000 0.000 0.000 0.000 {method 'find' of 'str' objects}\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:447(isclosed)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/langhelpers.py:1138(__get__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:348(_get_timeout)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method builtins.locals}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/getlimits.py:685(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:139(ticker)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:259(__getitem__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:940(date_schema)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:495(_real_close)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1622(close)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:494(is_truncated_horizontally)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1674(_check_file_or_buffer)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:368(getMessage)\n", - " 60 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1176(_maybe_disallow_fill)\n", - " 176 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:182(_deepcopy_atomic)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:616(get_content_maintype)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:641(fill_missing_names)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:258(__init__)\n", - " 63 0.000 0.000 0.000 0.000 {built-in method sys.getrefcount}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:363(_repeater)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/generic.py:2015(_wrap_agged_manager)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:1204(is_potential_multi_index)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1122()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1731(__hash__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:470()\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/version/__init__.py:348()\n", - " 122 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1480(_clear_item_cache)\n", - " 80 0.000 0.000 0.000 0.000 {method '__enter__' of '_thread.RLock' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:12(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1643(reconstruct_func)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1354(enforce_interval)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:127(__next__)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method from_bytes}\n", - " 122 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1764(_ravel_dispatcher)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:578(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1225(__init__)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:51(__getitem__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:102(__setitem__)\n", - " 23 0.000 0.000 0.000 0.000 {built-in method gc.get_referents}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:182(_make_key_to_index)\n", - " 78 0.000 0.000 0.000 0.000 {built-in method posix.getpid}\n", - " 49 0.000 0.000 0.000 0.000 {method 'rpartition' of 'str' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1544(log)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/encodings/idna.py:145(encode)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:679(_init_length)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:83(is_callable_type)\n", - " 46 0.000 0.000 0.000 0.000 {built-in method sys._getframe}\n", - " 36 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2752(need_slice)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1753(__iter__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:100(push)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:243(get_payload)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:383(is_closed)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:886(inner)\n", - " 42 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1725(__eq__)\n", - " 33 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1463()\n", - " 4 0.000 0.000 0.000 0.000 {method 'put' of 'numpy.ndarray' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:660(requote_uri)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/console.py:79(in_ipython_frontend)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_known_annotated_metadata.py:121(expand_grouped_metadata)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:100(__new__)\n", - " 66 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:575(is_set)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:213(_read_headers)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:219(__init__)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copyreg.py:104(__newobj__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:506(has_index_names)\n", - " 1 0.000 0.000 0.000 0.000 {method '__exit__' of '_io._IOBase' objects}\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1472()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:2015(__iter__)\n", - " 77 0.000 0.000 0.000 0.000 {method 'release' of '_thread.lock' objects}\n", - " 41 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:211(tail)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2155()\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:2472(union_schema)\n", - " 8 0.000 0.000 0.000 0.000 {built-in method now}\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/utils.py:368(cut_sequence_chunks)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:788()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:397(ensure_np_dtype)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:251(handle_list_schema)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1959(maybe_mangle_lambdas)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/putmask.py:115(extract_bool_array)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:58()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/queue.py:228(_put)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:540()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:259(maybe_downcast_to_dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:1532(_soft_close)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:404(is_dataclass)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2322(any)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2294()\n", - " 6 0.000 0.000 0.000 0.000 {method 'fullmatch' of 're.Pattern' objects}\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1841(_has_names)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/putmask.py:29(putmask_inplace)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:400()\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:3002()\n", - " 2 0.000 0.000 0.000 0.000 {method 'searchsorted' of 'numpy.ndarray' objects}\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:531(validate_ordered)\n", - " 23 0.000 0.000 0.000 0.000 {method 'write' of '_io.TextIOWrapper' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5134(array)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:983(is_in_axis)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:211()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/events.py:35(__init__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:1045(_validate_header_part)\n", - " 156 0.000 0.000 0.000 0.000 {method 'strip' of 'str' objects}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/ops.py:96(_reset_block_mgr_locs)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1671(is_all_strings)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:841(fetchall)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:52(__init__)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:440(__init__)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:696(names)\n", - " 1 0.000 0.000 0.000 0.000 {method 'sendall' of '_socket.socket' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:487()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1234(_validate_method)\n", - " 57 0.000 0.000 0.000 0.000 {method 'write' of '_io.StringIO' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1686(name)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1069(_is_homogeneous_type)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1152(name)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:413(_splitnetloc)\n", - " 80 0.000 0.000 0.000 0.000 {method 'append' of 'collections.deque' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1379(determine_table_agg)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:106(_get_distinct_objs)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:199(could_be_from_charset)\n", - " 23 0.000 0.000 0.000 0.000 {method 'difference_update' of 'set' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:81(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/string.py:126()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:849(_list_to_arrays)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:410(_is_comparable_dtype)\n", - " 44 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:398(__get_result)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1249(shape)\n", - " 63 0.000 0.000 0.000 0.000 {method 'release' of '_thread.RLock' objects}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5676()\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:57(__iter__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:526(_initialize_sparsify)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:532(_still_open_and_dbapi_connection_is_valid)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:107(get_redirect_target)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/numpy/function.py:159(validate_argsort_with_ascending)\n", - " 67 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:892(bincount)\n", - " 57 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7678()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:3750(definitions_schema)\n", - " 2 0.000 0.000 0.000 0.000 :773(getenv)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:774(get_proxy)\n", - " 70 0.000 0.000 0.000 0.000 {method 'toordinal' of 'datetime.date' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:593(_calc_max_rows_fitted)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:196(mgr_to_mgr)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/_collections.py:147(__new__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4585(_is_view)\n", - " 35 0.000 0.000 0.000 0.000 {method 'rstrip' of 'str' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2209(_safe_close_cursor)\n", - " 5 0.000 0.000 0.000 0.000 :319(decode)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:426(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:984()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:126(resolve_default_timeout)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:219(mask_all)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:601(_set_noconvert_dtype_columns)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_sync.py:10(_call_handlers)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1319(disable)\n", - " 1 0.000 0.000 0.000 0.000 {function socket.close at 0x10ddfa0c0}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:1135(_splitport)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:389(standardize_mapping)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:479(__repr__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:362(_make_index)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:107()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/database/SQLHelpers.py:46(get_engine)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:672(_is_view_after_cow_rules)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/cd.py:291(merge_coherence_ratios)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:194(__set_y)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:947()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:204(identify_interval)\n", - " 43 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:1073(clean_reindex_fill_method)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3766(_convert_can_do_setop)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:138(_event_pipe)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:532(treat_as_nested)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1980(build_name_format)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/astype.py:249(astype_is_view)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1980(shape)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:193(_userinfo)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method _codecs.lookup}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:206(get_module_ns_of)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:515(get_compression_method)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1041(_get_buffer)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:518(show_col_idx_names)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1489(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1062(levshape)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:102()\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/retry.py:242()\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:584()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:742(_get_axes)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1976(items)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2516(__init__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:91(is_deprecated_instance)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:49(_check_for_default_values)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method _operator.gt}\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/functools.py:65(wraps)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:692(levels)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/Requests.py:172(__init__)\n", - " 49 0.000 0.000 0.000 0.000 {built-in method time.monotonic}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:175(port)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:539(get_encoding_from_headers)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:480(is_view)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/numpy/function.py:223(validate_cum_func_with_skipna)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:572(is_required)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:92()\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/command_runner.py:470(user_settings)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:84()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2512(cumsum)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:475(any_extension_types)\n", - " 50 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:592(groupings)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:692(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:185()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaExceptions.py:62(raise_thetadata_exception)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2066(_get_level_values)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:516(close)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:254()\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:248(_qsize)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7652(ensure_has_len)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:638(_passed_categorical)\n", - " 59 0.000 0.000 0.000 0.000 {method 'discard' of 'set' objects}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/version/__init__.py:470(_parse_letter_version)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:202(_maybe_reindex_columns_na_proxy)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_common.py:17(_maybe_call)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1619(executemany)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:966(_selected_obj)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/pivot.py:173()\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7679()\n", - " 47 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:2374(_array_equal_dispatcher)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:423(repeat)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:764(categories)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:350(_maybe_make_multi_index_columns)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:805()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:1206(literal_schema)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:183(maybe_box_native)\n", - " 33 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1479()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/base.py:346(__init__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:886()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:612(_adjust_max_rows)\n", - " 8 0.000 0.000 0.000 0.000 {built-in method fromkeys}\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:128(_check_for_invalid_keys)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1287(_value_formatter)\n", - " 1 0.000 0.000 0.000 0.000 {method 'any' of 'numpy.generic' objects}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:743(readable)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:143(clear)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:77(readline)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:937()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:343()\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:302(add)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1734(clear_expired_cookies)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:650(truncate)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1340()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:388()\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:949()\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:686()\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2220(_can_hold_na)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:121(get_cache)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:227(_chk_truncate)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:751()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:1269(_process_date_conversion)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Context.py:124(clear_context)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:51(origin_is_union)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:205(_effective_processors)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:237(_releaseLock)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/mysqlconnector.py:145(is_disconnect)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6277()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:1129(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:221()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/functools.py:421(_unwrap_partial)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:424(close)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:483(_view)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ipaddress.py:1213(_parse_octet)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:659(unquote)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:3386(arguments_schema)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/retry.py:387(is_retry)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1269(set_inplace)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:139()\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6270()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/hooks.py:16()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:1149(_normalize_host)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:265(_find_common_index_dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7717()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:2077()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:720()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/langhelpers.py:1224(_set_memoized_attribute)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:204()\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:303()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:95(__init__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:168()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:497(_extract_metadata)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:392(ensure_dtype_objs)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:95(__getitem__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:510(has_column_names)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/database/SQLHelpers.py:336(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:331(set_payload)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:194(close)\n", - " 54 0.000 0.000 0.000 0.000 {method 'get' of '_contextvars.ContextVar' objects}\n", - " 176 0.000 0.000 0.000 0.000 {built-in method builtins.ord}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:446()\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:446(__exit__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1445(is_valid)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:520(urlunsplit)\n", - " 6 0.000 0.000 0.000 0.000 {method '_acquire_restore' of '_thread.RLock' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:735(unwrap)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:3176(ndim)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:514(_parse_content_type_header)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1474()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1230(_encode_request)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:276(append)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3200(_get_reconciled_name_object)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:194(_values_for_factorize)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:520(can_consume_results)\n", - " 1 0.000 0.000 0.000 0.000 :315(__subclasshook__)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method builtins.round}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/calendar.py:115(weekday)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2474(validate_periods)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1331(dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/retry.py:379(_is_method_retryable)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:188(clone)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:1095(__new__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:781(close)\n", - " 1 0.000 0.000 0.000 0.000 :1192(_gcd_import)\n", - " 26 0.000 0.000 0.000 0.000 {method 'capitalize' of 'str' objects}\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:948()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/from_thread.py:170(_check_running)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:918(_wrap_ipv6)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1251(_validate_host)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/multiprocessing/process.py:37(current_process)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:574(is_zoneinfo_type)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:619(categories)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1395(determine_requested_columns)\n", - " 5 0.000 0.000 0.000 0.000 {method '_checkReadable' of '_io._IOBase' objects}\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:172()\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:999(is_in_obj)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:922(_maybe_infer_dtype_type)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:186(_from_factorized)\n", - " 24 0.000 0.000 0.000 0.000 {method 'remove' of 'collections.deque' objects}\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:174(not_none)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:130(_validate_timeout)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:1221(_charset_id)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/util.py:19(to_str)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/multiprocessing/process.py:189(name)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:282(query_attrs)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:167()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:769(is_redirect)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:374(_merge_pool_kwargs)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:636(unquote_unreserved)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1201()\n", - " 27 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2416(_all_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/methods/to_dict.py:155()\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1076()\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:251(_put)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:390(_check_close)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:338(astype)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/utils.py:52(_has_surrogates)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:403()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/response.py:9(is_fp_closed)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:781(get_adapter)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:105(is_file_like)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:37(lookback)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:982()\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:1080(_is_label_like)\n", - " 1 0.000 0.000 0.000 0.000 {method 'setsockopt' of '_socket.socket' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/queue.py:222(_empty)\n", - " 88 0.000 0.000 0.000 0.000 {method 'locked' of '_thread.lock' objects}\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1021(_argsort_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method posix.get_terminal_size}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:309(_operation_context)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:178()\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:209(is_object)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5649(_needs_reindex_multi)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:835(_local_timestamps)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:195()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:196()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:251(put)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1394(__hash__)\n", - " 3 0.000 0.000 0.000 0.000 {function SocketIO.close at 0x10ddfae80}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:234(_disallow_mismatched_datetimelike)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:439(_ensure_has_table_connection)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/parser.py:17(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:520(convert_to_list_like)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1992(_validate_index_level)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:693(_get_result_dim)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:622(convert)\n", - " 1 0.000 0.000 0.000 0.000 {method 'issuperset' of 'frozenset' objects}\n", - " 10 0.000 0.000 0.000 0.000 {method 'index' of 'list' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2564(__init__)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:507(set_raw)\n", - " 2 0.000 0.000 0.000 0.000 {method 'settimeout' of '_socket.socket' objects}\n", - " 1 0.000 0.000 0.000 0.000 :309(__init__)\n", - " 33 0.000 0.000 0.000 0.000 {method 'partition' of 'str' objects}\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:254(_get)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ipaddress.py:574(__int__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:164(host)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5486()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:478()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/methods/to_dict.py:160()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1329(result_index)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:187(_get_fill_value)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:351(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:811(_newname)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:69(close)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/queue.py:225(_full)\n", - " 5 0.000 0.000 0.000 0.000 {method 'subn' of 're.Pattern' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:95(literal_values)\n", - " 8 0.000 0.000 0.000 0.000 :812(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:188(all_none)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:1117(_maybe_memory_map)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:443(__enter__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:534(_push_cm_exit)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:3445(call_schema)\n", - " 37 0.000 0.000 0.000 0.000 {method 'weekday' of 'datetime.date' objects}\n", - " 2 0.000 0.000 0.000 0.000 {method 'pop' of 'collections.OrderedDict' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1398(_reset)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/utils.py:189(check_single_item)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1028(_output)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:657()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:757()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:891(default_user_agent)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:195(_new_message)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1903()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2180(_ensure_matching_resos)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:353()\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2730(annotation)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:421(lexsort)\n", - " 5 0.000 0.000 0.000 0.000 {built-in method _codecs.utf_8_decode}\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:632(ordered)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:559(_validate_names)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2721(is_nested_tuple)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:376(dtype)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:198()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager.py:366()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:550(_initialize_columns)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/abstract/error.py:9(__init__)\n", - " 17 0.000 0.000 0.000 0.000 {method 'lstrip' of 'str' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:212()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:856(columns)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:722(_result_index)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:330(_sanitize_and_check)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:585(_ensure_2d)\n", - " 1 0.000 0.000 0.000 0.000 :815(__len__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4306(_validate_can_reindex)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:29(_splitparam)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:633(is_builtin_func)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:472(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:891(_get_first_arg_or_any)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:238(is_int64_overflow_possible)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:1079(closed)\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1847()\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/concat.py:73()\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2734(kind)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/mysqlconnector.py:53(_escape_identifier)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:694()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:535(temp_setattr)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:191(_server_status)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:1233(dedup_names)\n", - " 27 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:290(_add_custom_serialization_from_json_encoders)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/_internal_utils.py:25(to_native_string)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1658(no_parameters)\n", - " 2 0.000 0.000 0.000 0.000 {method 'swapaxes' of 'numpy.ndarray' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:336(_na_ok_dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3760(_assert_can_do_setop)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:369(should_store)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:405(_types_namespace)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:582(_calc_max_cols_fitted)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:858(_get_column_name_list)\n", - " 1 0.000 0.000 0.000 0.000 :1165(_find_and_load)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:698()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7719()\n", - " 3 0.000 0.000 0.000 0.000 {built-in method math.floor}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:717(index)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:151(end_date)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2722(name)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:553(nblocks)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1720(_value_and_type_iter)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5495()\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1721()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:202(start_connect)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2726(default)\n", - " 2 0.000 0.000 0.000 0.000 {method 'repeat' of 'numpy.ndarray' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1038(in_transaction)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1047(_get_i8_values_and_mask)\n", - " 5 0.000 0.000 0.000 0.000 {method 'tolist' of 'numpy.ndarray' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/errors/__init__.py:535(_check_cacher)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:315(step)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:436(flush)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:277()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1094()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1730()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/utils.py:121(__init__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:2139(_codes)\n", - " 17 0.000 0.000 0.000 0.000 {method '__contains__' of 'frozenset' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:829(warning_count)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1793()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2688(_deactivate_from_connection)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:1131(putmask)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:655(_constructor)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:176(dtype)\n", - " 17 0.000 0.000 0.000 0.000 {method 'isidentifier' of 'str' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:664(maybe_fill)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:850(more_results)\n", - " 25 0.000 0.000 0.000 0.000 {built-in method builtins.abs}\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:291(__iter__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:367()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:370()\n", - " 10 0.000 0.000 0.000 0.000 {method 'count' of 'list' objects}\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:77(_atleast_2d_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:328(merge_incomplete_data_in_cache)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/command_runner.py:465(system_settings)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:518(__repr__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:166(__setattr__)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2974(_prod_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:2056(_clean_na_values)\n", - " 9 0.000 0.000 0.000 0.000 {method 'values' of 'collections.OrderedDict' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:1229()\n", - " 11 0.000 0.000 0.000 0.000 {method 'startswith' of 'bytes' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:2365(_validate_skipfooter)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:661(_ilevel)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:121(pushlines)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1877(_nonzero_dispatcher)\n", - " 4 0.000 0.000 0.000 0.000 {method 'total_seconds' of 'datetime.timedelta' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1128(value_getitem)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:230()\n", - " 6 0.000 0.000 0.000 0.000 {method '_release_save' of '_thread.RLock' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1066(_get_arithmetic_result_freq)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:626(_is_in_terminal)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:494(dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1290(_cookies_for_request)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:518(_check_closed)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:1465(list_schema)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1553()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:140(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:915(__array__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:268(_get_out_dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:244(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/util/numba_.py:18(maybe_use_numba)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/replace.py:31(should_use_regex)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:465(_decode)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:369()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:250(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:799(iter_content)\n", - " 7 0.000 0.000 0.000 0.000 {method 'rstrip' of 'bytes' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/getlimits.py:709(max)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_wait_gen.py:7(expo)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:60(__len__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:314()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:245(read_timeout)\n", - " 3 0.000 0.000 0.000 0.000 {method 'getvalue' of '_io.BytesIO' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:91(ensure_python_int)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4367(igetitem)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:346(where)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_request_methods.py:51(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:211(is_multipart)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:305(loc)\n", - " 4 0.000 0.000 0.000 0.000 {built-in method _contextvars.copy_context}\n", - " 5 0.000 0.000 0.000 0.000 {method 'count' of 'bytes' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:312(pm)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:131(close)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:539(_push_exit_callback)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:93()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/_internal_utils.py:38(unicode_is_ascii)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:280(start)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:303()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:331(maybe_downcast_numeric)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/queue.py:231(_get)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:421(_checknetloc)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:249(_get_output_shape)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1487(__getattr__)\n", - " 1 0.000 0.000 0.000 0.000 :1101(_sanity_check)\n", - " 15 0.000 0.000 0.000 0.000 {method 'popleft' of 'collections.deque' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:44(_debug)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:916()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:1454(__init__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5168(_delete_dispatcher)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:248(__len__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:320(__len__)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1828(ndim)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:403(retries)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:270(mgr_locs)\n", - " 4 0.000 0.000 0.000 0.000 {method 'groups' of 're.Match' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1243(_validate_path)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:706()\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:108(_noop)\n", - " 5 0.000 0.000 0.000 0.000 {method '_checkClosed' of '_io._IOBase' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:91(merge_hooks)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:709(inferred_type)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method sys.exc_info}\n", - " 2 0.000 0.000 0.000 0.000 {method 'items' of 'mappingproxy' objects}\n", - " 8 0.000 0.000 0.000 0.000 {method '_is_owned' of '_thread.RLock' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:330(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:208(_pop_message)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:770(_maybe_check_integrity)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:222()\n", - " 5 0.000 0.000 0.000 0.000 {method 'decode' of 'bytearray' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:212()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:227(connect_timeout)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6061(_should_fallback_to_positional)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:208(__init__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1979(nlevels)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:223(__len__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/base.py:115(__eq__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1989(index)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_common.py:28()\n", - " 1 0.000 0.000 0.000 0.000 :260(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:205()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/hooks.py:22(dispatch_hook)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:849()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:450(check_dtype_backend)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:333(tail)\n", - " 4 0.000 0.000 0.000 0.000 {method 'items' of 'collections.OrderedDict' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:351()\n", - " 2 0.000 0.000 0.000 0.000 {method 'update' of 'collections.OrderedDict' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:7045(_deprecate_downcast)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:197(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7718()\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:669(result_type)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:691(__del__)\n", - " 6 0.000 0.000 0.000 0.000 {method 'reverse' of 'list' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:3015(parameters)\n", - " 9 0.000 0.000 0.000 0.000 {method 'isascii' of 'str' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/request.py:134(set_file_position)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2577(is_view)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:330()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/connection.py:103(allowed_gai_family)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2070()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:141(is_re)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:398()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/shape_base.py:1257()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/container.py:59(_get_provider)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/version/__init__.py:534()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:99()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:567(connection)\n", - " 2 0.000 0.000 0.000 0.000 {method 'values' of 'mappingproxy' objects}\n", - " 1 0.000 0.000 0.000 0.000 {method 'fileno' of '_io.TextIOWrapper' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:245(_init)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:893(_check_data_length)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:643(__enter__)\n", - " 4 0.000 0.000 0.000 0.000 {method 'count' of 'str' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2687(_max_dispatcher)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:117(info)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:1954(get_debug)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:1448(__enter__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:280(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:460(tolist)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:11522()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:1447(is_index_col)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:229(__iter__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/errors.py:80(__str__)\n", - " 3 0.000 0.000 0.000 0.000 {method 'date' of 'datetime.datetime' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:231()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:255(_has_complex_date_col)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:489(_decref_socketios)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/calendar.py:102(isleap)\n", - " 2 0.000 0.000 0.000 0.000 {method 'getvalue' of '_io.StringIO' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:301(__init__)\n", - " 6 0.000 0.000 0.000 0.000 {method 'pop' of 'set' objects}\n", - " 2 0.000 0.000 0.000 0.000 {method 'clear' of 'collections.OrderedDict' objects}\n", - " 2 0.000 0.000 0.000 0.000 {method 'split' of 'bytes' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2583(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:284(_get_result_dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1926(handle_extra_cols)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method sys.getrecursionlimit}\n", - " 2 0.000 0.000 0.000 0.000 {built-in method _weakref.proxy}\n", - " 2 0.000 0.000 0.000 0.000 {method 'extend' of 'collections.deque' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:885(__init__)\n", - " 1 0.000 0.000 0.000 0.000 {method 'sort' of 'list' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:1110(get_warnings)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:462(_create_exit_wrapper)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:540(closed)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:558(_initialize_colspace)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:820()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1567(_maybe_transpose_result)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:4948(_needs_reindex_multi)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:213()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:805(_maybe_copy)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:192()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_validate_call.py:51()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:183(host)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:2267(_extract_dialect)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:206()\n", - " 2 0.000 0.000 0.000 0.000 {method 'connected' of '_mysql_connector.MySQL' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:216(_validate_dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:188(_expand_user)\n", - " 2 0.000 0.000 0.000 0.000 {method 'with_traceback' of 'BaseException' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:212(_get_cython_vals)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:743(set_environ)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:155(_check_executed)\n", - " 1 0.000 0.000 0.000 0.000 {method 'consume_result' of '_mysql_connector.MySQL' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:1065(soft_close)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:191(_values_for_argsort)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:231(_constructor)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:527(validate_integer)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method _codecs.lookup_error}\n", - " 2 0.000 0.000 0.000 0.000 {method 'truncate' of '_io.StringIO' objects}\n", - " 4 0.000 0.000 0.000 0.000 {method 'seek' of '_io.StringIO' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/version/__init__.py:508(_parse_local_version)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:110(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:94(_process_parse_dates_argument)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:3019(return_annotation)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:125(__init__)\n", - " 1 0.000 0.000 0.000 0.000 {method 'more_results' of '_mysql_connector.MySQL' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3211(_validate_sort_keyword)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:146(dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:235()\n", - " 2 0.000 0.000 0.000 0.000 {method 'st_server_status' of '_mysql_connector.MySQL' objects}\n", - " 1 0.000 0.000 0.000 0.000 {built-in method sys.getfilesystemencoding}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/mysqlconnector.py:142(_extract_error_code)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:216()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:326()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:504(description)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:159(_freeze)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:986(_validate_usecols_arg)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:467()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:296(best)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/shape_base.py:1181(_tile_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method _socket.getdefaulttimeout}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:512(_validate_axis)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1371(enforce_inputs)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:292(is_fsspec_url)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:531(_initialize_formatters)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/response.py:79()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:93(encoding)\n", - " 1 0.000 0.000 0.000 0.000 {method 'warning_count' of '_mysql_connector.MySQL' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:510()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:172(raw)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/tz/tz.py:74(utcoffset)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:107(_copy_immutable)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:581(iter_slices)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method sys.audit}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:687(is_closed)\n", - " 2 0.000 0.000 0.000 0.000 {method 'st_warning_count' of '_mysql_connector.MySQL' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:154(chaos)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2508(_cumsum_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:3104(_cumprod_dispatcher)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/IPython/core/interactiveshell.py:683(get_ipython)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:546(invalidated)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:578(add_headers)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:419(_repeat_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method builtins.globals}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:2486(reset)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1763(pre_exec)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:87(get_new_headers)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:295(is_closed)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/cd.py:305()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1976(_shape_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:247()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1987(__enter__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2317(_any_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:695(do_begin)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1771(post_exec)\n", - " 1 0.000 0.000 0.000 0.000 {method 'pop' of 'collections.deque' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:124(__iter__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/proxy.py:11(connection_requires_http_tunnel)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:3172(_ndim_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:105(_box_func)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1803(handle_dbapi_exception)\n", - " 1 0.000 0.000 0.000 0.000 {function HTTPResponse.flush at 0x10fc6d1c0}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:231(__enter__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:339(_validate_conn)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1986(_sort_levels_monotonic)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:451(__enter__)\n", - "\n", - "\n", - "\n" - ] - } - ], - "source": [ - "print(returned_order[1])" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "import json\n", - "_REQUESTS =[]\n", - "def load_requests_into_list():\n", - " global _REQUESTS\n", - " _REQUESTS = requests_from_jsonl()\n", - " for item in _REQUESTS:\n", - " ## Ensure save_func is a callable\n", - " item['save_func'] = partial(eval(item['save_func']), print_info=True)\n", - "\n", - " ## Transform set_attributes to a DataFrame\n", - " if item['type_'] == 'chain':\n", - " item['set_attributes']['post_processed_data'] = pd.DataFrame(item['set_attributes']['post_processed_data'])\n", - " print(f\"Loaded {len(_REQUESTS)} requests into _REQUESTS list\")\n" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "ename": "ThetaDataNotFound", - "evalue": "Data not found for the given parameters: {'end_date': 20231231, 'root': 'SBUX', 'use_csv': 'true', 'exp': 20231229, 'right': 'C', 'start_date': 20230101, 'strike': 79000, 'url': 'http://127.0.0.1:25510/v2/hist/option/eod?end_date=20231231&root=SBUX&use_csv=true&exp=20231229&right=C&start_date=20230101&strike=79000'}", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mThetaDataNotFound\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[14], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mretrieve_eod_ohlc\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 2\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mSBUX\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3\u001b[0m \u001b[43m \u001b[49m\u001b[43mstart_date\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43m2023-01-01\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 4\u001b[0m \u001b[43m \u001b[49m\u001b[43mend_date\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43m2023-12-31\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 5\u001b[0m \u001b[43m \u001b[49m\u001b[43mexp\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43m2023-12-29\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 6\u001b[0m \u001b[43m \u001b[49m\u001b[43mright\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mC\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 7\u001b[0m \u001b[43m \u001b[49m\u001b[43mstrike\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m79.0\u001b[39;49m\n\u001b[1;32m 8\u001b[0m \u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_sync.py:105\u001b[0m, in \u001b[0;36mretry_exception..retry\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 96\u001b[0m details \u001b[38;5;241m=\u001b[39m {\n\u001b[1;32m 97\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtarget\u001b[39m\u001b[38;5;124m\"\u001b[39m: target,\n\u001b[1;32m 98\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124margs\u001b[39m\u001b[38;5;124m\"\u001b[39m: args,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 101\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124melapsed\u001b[39m\u001b[38;5;124m\"\u001b[39m: elapsed,\n\u001b[1;32m 102\u001b[0m }\n\u001b[1;32m 104\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 105\u001b[0m ret \u001b[38;5;241m=\u001b[39m \u001b[43mtarget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 106\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m exception \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 107\u001b[0m max_tries_exceeded \u001b[38;5;241m=\u001b[39m (tries \u001b[38;5;241m==\u001b[39m max_tries_value)\n", - "File \u001b[0;32m~/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:315\u001b[0m, in \u001b[0;36mretrieve_eod_ohlc\u001b[0;34m(symbol, end_date, exp, right, start_date, strike, print_url, rt, proxy, **kwargs)\u001b[0m\n\u001b[1;32m 313\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 314\u001b[0m response \u001b[38;5;241m=\u001b[39m requests\u001b[38;5;241m.\u001b[39mget(url, headers\u001b[38;5;241m=\u001b[39mheaders, params\u001b[38;5;241m=\u001b[39mquerystring)\n\u001b[0;32m--> 315\u001b[0m \u001b[43mraise_thetadata_exception\u001b[49m\u001b[43m(\u001b[49m\u001b[43mresponse\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mquerystring\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mproxy\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 316\u001b[0m \u001b[38;5;28mprint\u001b[39m(response\u001b[38;5;241m.\u001b[39murl) \u001b[38;5;28;01mif\u001b[39;00m print_url \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 319\u001b[0m end_timer \u001b[38;5;241m=\u001b[39m time\u001b[38;5;241m.\u001b[39mtime()\n", - "File \u001b[0;32m~/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaExceptions.py:77\u001b[0m, in \u001b[0;36mraise_thetadata_exception\u001b[0;34m(response, params, proxy)\u001b[0m\n\u001b[1;32m 75\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m ThetaDataPermission(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mPermission denied.\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 76\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m code \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m472\u001b[39m:\n\u001b[0;32m---> 77\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m ThetaDataNotFound(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mData not found for the given parameters: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mparams\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 78\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m code \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m473\u001b[39m:\n\u001b[1;32m 79\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m ThetaDataInvalidParameter(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mInvalid parameter provided: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mparams\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m, if error persists, update terminal.\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", - "\u001b[0;31mThetaDataNotFound\u001b[0m: Data not found for the given parameters: {'end_date': 20231231, 'root': 'SBUX', 'use_csv': 'true', 'exp': 20231229, 'right': 'C', 'start_date': 20230101, 'strike': 79000, 'url': 'http://127.0.0.1:25510/v2/hist/option/eod?end_date=20231231&root=SBUX&use_csv=true&exp=20231229&right=C&start_date=20230101&strike=79000'}" - ] - } - ], - "source": [ - "retrieve_eod_ohlc(\n", - " 'SBUX',\n", - " start_date='2023-01-01',\n", - " end_date='2023-12-31',\n", - " exp = '2023-12-29',\n", - " right = 'C',\n", - " strike=79.0\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{}\n" - ] - } - ], - "source": [ - "from pprint import pprint\n", - "pprint(get_cache('close'))" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " 1885461 function calls (1880572 primitive calls) in 24.433 seconds\n", - "\n", - " Ordered by: cumulative time\n", - "\n", - " ncalls tottime percall cumtime percall filename:lineno(function)\n", - " 1 0.000 0.000 24.433 24.433 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:329(get_order)\n", - " 5/3 0.000 0.000 21.695 7.232 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/decorators.py:10(wrapper)\n", - " 1 0.000 0.000 21.675 21.675 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:357(calculate_position_greeks)\n", - " 183 20.057 0.110 20.057 0.110 {method 'acquire' of '_thread.lock' objects}\n", - " 3 0.000 0.000 18.374 6.125 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/threads.py:4(runThreads)\n", - " 17 0.000 0.000 18.337 1.079 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1087(join)\n", - " 29 0.000 0.000 18.337 0.632 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1125(_wait_for_tstate_lock)\n", - " 3 0.000 0.000 18.334 6.111 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:646(__exit__)\n", - " 3 0.000 0.000 18.334 6.111 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:216(shutdown)\n", - " 2 0.000 0.000 3.303 1.651 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:720(generate_data)\n", - " 3 0.003 0.001 3.276 1.092 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_sync.py:85(retry)\n", - " 2 0.000 0.000 2.889 1.444 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:387(spot)\n", - " 2 0.001 0.000 2.864 1.432 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:142(retrieve_timeseries)\n", - " 2/1 0.000 0.000 2.749 2.749 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/decorators.py:40(wrapper)\n", - " 1 0.001 0.001 2.749 2.749 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:39(get_order)\n", - " 6705 0.100 0.000 2.502 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:673(to_datetime)\n", - " 1 0.000 0.000 2.502 2.502 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:576(populate_cache)\n", - " 1 0.001 0.001 2.502 2.502 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:438(populate_cache_v2)\n", - " 2 0.000 0.000 2.312 1.156 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/decorators.py:24(wrapper)\n", - " 6659 0.082 0.000 2.076 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:314(_convert_listlike_datetimes)\n", - " 1 0.000 0.000 1.869 1.869 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:686(one_off_save)\n", - " 1 0.000 0.000 1.869 1.869 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1219(bulk_one_off_save)\n", - " 1 0.000 0.000 1.869 1.869 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager_processes.py:238(schedule)\n", - " 1 0.000 0.000 1.869 1.869 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager.py:346(_schedule)\n", - " 1 0.026 0.026 1.868 1.868 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager.py:309(is_already_scheduled)\n", - " 1 0.000 0.000 1.842 1.842 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager.py:27(construct_current_scheduled_names)\n", - " 44 0.001 0.000 1.721 0.039 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:295(wait)\n", - " 3 0.000 0.000 1.708 0.569 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/utils/decorators.py:47(wrapper)\n", - " 3 0.000 0.000 1.708 0.569 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/utils/decorators.py:35(wrapper)\n", - " 3 0.000 0.000 1.691 0.564 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/validate_call_decorator.py:58(wrapper_function)\n", - " 3 0.000 0.000 1.691 0.564 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_validate_call.py:95(__call__)\n", - " 3 0.000 0.000 1.691 0.564 {method 'validate_python' of 'pydantic_core._pydantic_core.SchemaValidator' objects}\n", - " 3 0.000 0.000 1.691 0.564 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/container.py:23(_run)\n", - " 3 0.000 0.000 1.691 0.564 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/command_runner.py:503(sync_run)\n", - " 3 0.000 0.000 1.690 0.563 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/provider/utils/helpers.py:581(run_async)\n", - " 63 0.000 0.000 1.685 0.027 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:428(result)\n", - " 9 0.000 0.000 1.684 0.187 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/from_thread.py:275(call)\n", - " 2 0.000 0.000 1.503 0.751 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/obbject.py:85(to_df)\n", - " 2 0.000 0.000 1.503 0.751 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/obbject.py:125(to_dataframe)\n", - " 2 0.001 0.001 1.476 0.738 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/utils.py:20(basemodel_to_df)\n", - " 8 0.000 0.000 1.443 0.180 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:4789(apply)\n", - " 8 0.000 0.000 1.442 0.180 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1409(apply)\n", - " 8 0.000 0.000 1.442 0.180 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1482(apply_standard)\n", - " 8 0.000 0.000 1.431 0.179 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:891(_map_values)\n", - " 8 0.015 0.002 1.430 0.179 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:1667(map_array)\n", - " 2 0.000 0.000 1.318 0.659 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/equity_price.py:28(historical)\n", - " 1 0.002 0.002 1.060 1.060 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager.py:44()\n", - " 193 0.020 0.000 1.058 0.005 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/Requests.py:36(construct_request_name)\n", - " 6656 0.277 0.000 0.793 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:126(_guess_datetime_format_for_array)\n", - " 1 0.000 0.000 0.690 0.690 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager.py:36()\n", - " 192 0.000 0.000 0.690 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/json/__init__.py:299(loads)\n", - " 192 0.001 0.000 0.689 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/json/decoder.py:332(decode)\n", - " 192 0.682 0.004 0.688 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/json/decoder.py:343(raw_decode)\n", - " 6046 0.022 0.000 0.662 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:259(_box_as_indexlike)\n", - " 6051 0.039 0.000 0.643 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:320(__new__)\n", - " 6670 0.090 0.000 0.602 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:329(_from_sequence_not_strict)\n", - " 1 0.000 0.000 0.443 0.443 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1414(init_query)\n", - " 1 0.000 0.000 0.441 0.441 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/database/SQLHelpers.py:343(query_database)\n", - " 1 0.000 0.000 0.441 0.441 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/database/SQLHelpers.py:100(query_database)\n", - " 1 0.000 0.000 0.441 0.441 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:570(read_sql)\n", - " 1 0.000 0.000 0.409 0.409 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:330(div_yield_history)\n", - " 1 0.000 0.000 0.373 0.373 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/equity_fundamental.py:938(dividends)\n", - " 2 0.000 0.000 0.358 0.179 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1713(exec_driver_sql)\n", - " 2 0.000 0.000 0.358 0.179 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1791(_execute_context)\n", - "453216/452926 0.190 0.000 0.354 0.000 {built-in method builtins.isinstance}\n", - " 6670 0.083 0.000 0.308 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2184(_sequence_to_dt64)\n", - " 13326 0.053 0.000 0.297 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2428(maybe_convert_dtype)\n", - " 93138 0.109 0.000 0.277 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:173(search)\n", - " 610 0.020 0.000 0.267 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:456(_array_strptime_with_fallback)\n", - " 753 0.021 0.000 0.260 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:475(__new__)\n", - " 1 0.000 0.000 0.226 0.226 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:1779(read_query)\n", - " 7167 0.027 0.000 0.215 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5373(__getitem__)\n", - " 2 0.000 0.000 0.215 0.107 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1850(_exec_single_context)\n", - " 2 0.000 0.000 0.214 0.107 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:940(do_execute)\n", - " 2 0.000 0.000 0.214 0.107 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:311(execute)\n", - " 2 0.000 0.000 0.213 0.107 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/opentelemetry/context_propagation.py:93(wrapper)\n", - " 2 0.000 0.000 0.213 0.106 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:690(cmd_query)\n", - " 2 0.213 0.106 0.213 0.106 {method 'query' of '_mysql_connector.MySQL' objects}\n", - " 1162 0.017 0.000 0.212 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:517(sanitize_array)\n", - " 660 0.021 0.000 0.211 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:666(_parse)\n", - " 1 0.000 0.000 0.203 0.203 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:1655(execute)\n", - " 6726 0.023 0.000 0.183 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:373(__getitem__)\n", - " 1 0.000 0.000 0.160 0.160 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:793(produce_order_candidates)\n", - " 2 0.001 0.000 0.160 0.080 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:657(chain_details)\n", - " 785 0.004 0.000 0.158 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:769(_try_cast)\n", - " 6728 0.025 0.000 0.158 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:278(__getitem__)\n", - " 1 0.000 0.000 0.155 0.155 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:2037(has_table)\n", - " 1 0.000 0.000 0.155 0.155 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:400(has_table)\n", - " 1 0.000 0.000 0.155 0.155 :1(has_table)\n", - " 1 0.000 0.000 0.155 0.155 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:78(cache)\n", - " 1 0.000 0.000 0.155 0.155 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/base.py:2732(has_table)\n", - " 610 0.009 0.000 0.153 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1200(maybe_cast_to_datetime)\n", - " 13343 0.044 0.000 0.144 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1163(is_float_dtype)\n", - " 2 0.000 0.000 0.143 0.072 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1523(_init_statement)\n", - " 2 0.000 0.000 0.143 0.072 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1736(create_cursor)\n", - " 2 0.000 0.000 0.143 0.072 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1757(create_default_cursor)\n", - " 2 0.000 0.000 0.143 0.072 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1483(cursor)\n", - " 2 0.000 0.000 0.143 0.072 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:733(cursor)\n", - " 2 0.000 0.000 0.143 0.072 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:387(is_connected)\n", - " 96325 0.106 0.000 0.143 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:272(_compile)\n", - " 2 0.143 0.071 0.143 0.071 {method 'ping' of '_mysql_connector.MySQL' objects}\n", - " 6659 0.072 0.000 0.132 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:545(_box_func)\n", - " 60165 0.050 0.000 0.113 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/generic.py:42(_instancecheck)\n", - " 6670 0.035 0.000 0.112 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2425(ensure_arraylike_for_datetimelike)\n", - " 660 0.014 0.000 0.106 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:199(split)\n", - " 619 0.002 0.000 0.102 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:325(_from_sequence)\n", - " 303 0.003 0.000 0.101 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4062(__getitem__)\n", - " 6051 0.091 0.000 0.099 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2354(objects_to_datetime64)\n", - " 13671 0.037 0.000 0.095 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1198(is_bool_dtype)\n", - " 20046 0.031 0.000 0.089 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1375(_is_dtype)\n", - " 7494 0.008 0.000 0.086 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:189(__next__)\n", - " 7494 0.050 0.000 0.078 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:77(get_token)\n", - " 10 0.002 0.000 0.071 0.007 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:837(change_to_last_busday)\n", - " 60165 0.048 0.000 0.063 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/generic.py:37(_check)\n", - " 27 0.001 0.000 0.061 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:694(__init__)\n", - " 1 0.000 0.000 0.060 0.060 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:1643(__exit__)\n", - " 1 0.000 0.000 0.060 0.060 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:607(close)\n", - " 1 0.000 0.000 0.060 0.060 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:558(__exit__)\n", - " 1 0.000 0.000 0.060 0.060 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:234(__exit__)\n", - " 1 0.000 0.000 0.060 0.060 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1218(close)\n", - " 1 0.045 0.045 0.060 0.060 {method 'readlines' of '_io._IOBase' objects}\n", - " 1 0.000 0.000 0.060 0.060 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2576(close)\n", - " 1 0.000 0.000 0.060 0.060 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2725(_do_close)\n", - " 1 0.000 0.000 0.060 0.060 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2709(_close_impl)\n", - " 1 0.000 0.000 0.060 0.060 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2703(_connection_rollback_impl)\n", - " 1 0.000 0.000 0.060 0.060 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1113(_rollback_impl)\n", - " 1 0.000 0.000 0.060 0.060 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:698(do_rollback)\n", - " 1 0.000 0.000 0.060 0.060 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:578(rollback)\n", - " 1 0.060 0.060 0.060 0.060 {method 'rollback' of '_mysql_connector.MySQL' objects}\n", - " 7283 0.045 0.000 0.057 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:649(_simple_new)\n", - " 1239 0.019 0.000 0.056 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:875(_parse_numeric_token)\n", - " 150 0.002 0.000 0.056 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4130(_getitem_bool_array)\n", - " 6669 0.012 0.000 0.056 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:536(is_string_dtype)\n", - " 2 0.009 0.004 0.054 0.027 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/utils.py:30()\n", - " 74/49 0.001 0.000 0.052 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4271(__setitem__)\n", - " 72 0.001 0.000 0.050 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4514(_set_item)\n", - " 6914 0.015 0.000 0.049 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7688(maybe_extract_name)\n", - " 6846 0.047 0.000 0.047 0.000 {built-in method numpy.array}\n", - " 13904 0.025 0.000 0.046 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1434(_is_dtype_type)\n", - " 6039 0.007 0.000 0.046 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/main.py:352(model_dump)\n", - " 6682 0.041 0.000 0.045 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:304(_simple_new)\n", - " 93148 0.045 0.000 0.045 0.000 {method 'search' of 're.Pattern' objects}\n", - " 449/444 0.003 0.000 0.044 0.000 {built-in method builtins.all}\n", - " 7 0.000 0.000 0.043 0.006 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:84(__init__)\n", - " 1 0.000 0.000 0.043 0.043 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:622(pre_process_data)\n", - " 2 0.000 0.000 0.043 0.022 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:10170(apply)\n", - " 610 0.010 0.000 0.043 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1240(_ensure_nanosecond_dtype)\n", - " 2 0.000 0.000 0.043 0.022 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:864(apply)\n", - " 2 0.000 0.000 0.043 0.022 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1061(apply_standard)\n", - " 33401 0.020 0.000 0.043 0.000 :117(__instancecheck__)\n", - " 152 0.000 0.000 0.043 0.000 {built-in method builtins.next}\n", - " 2 0.000 0.000 0.042 0.021 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1070(apply_series_generator)\n", - " 23 0.000 0.000 0.041 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:129()\n", - " 23 0.002 0.000 0.041 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:848(liquidity_check)\n", - " 77 0.000 0.000 0.040 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:132(__enter__)\n", - " 6 0.000 0.000 0.040 0.007 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/utils.py:18(__init__)\n", - " 23 0.001 0.000 0.039 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:738()\n", - " 72 0.001 0.000 0.039 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4481(_set_item_mgr)\n", - " 6039 0.038 0.000 0.039 0.000 {method 'to_python' of 'pydantic_core._pydantic_core.SchemaSerializer' objects}\n", - " 3 0.000 0.000 0.038 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:583(map)\n", - " 3 0.000 0.000 0.038 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:608()\n", - " 48 0.000 0.000 0.038 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:161(submit)\n", - " 48 0.000 0.000 0.037 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:180(_adjust_thread_count)\n", - " 66 0.002 0.000 0.037 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1347(insert)\n", - " 19 0.000 0.000 0.037 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:611(wait)\n", - " 46 0.002 0.000 0.036 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:794(generate_option_tick_new)\n", - " 17 0.000 0.000 0.036 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:945(start)\n", - " 105/94 0.003 0.000 0.036 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:389(__init__)\n", - " 1416 0.012 0.000 0.036 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:346(_name_get)\n", - " 33717 0.024 0.000 0.036 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1399(_get_dtype)\n", - " 132/95 0.001 0.000 0.035 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/common.py:62(new_method)\n", - " 6696 0.035 0.000 0.035 0.000 {method 'view' of 'numpy.generic' objects}\n", - " 4 0.000 0.000 0.035 0.009 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Context.py:16(Context)\n", - " 2 0.000 0.000 0.032 0.016 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/utils.py:47(bus_range)\n", - " 1 0.003 0.003 0.031 0.031 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager.py:34()\n", - " 307 0.005 0.000 0.030 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:317(apply)\n", - "102198/102185 0.029 0.000 0.030 0.000 {built-in method builtins.getattr}\n", - " 3 0.000 0.000 0.029 0.010 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1780(apply)\n", - " 1 0.000 0.000 0.029 0.029 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:227(update_cache_with_missing_ticks)\n", - " 11 0.001 0.000 0.029 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:423(dict_to_mgr)\n", - " 197 0.028 0.000 0.028 0.000 {method 'strip' of 'str' objects}\n", - " 12 0.000 0.000 0.025 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:139()\n", - " 6669 0.019 0.000 0.025 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:572(condition)\n", - " 12 0.001 0.000 0.025 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:753(available_close_check)\n", - " 2 0.000 0.000 0.025 0.012 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:715(__init__)\n", - " 12 0.000 0.000 0.024 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:1022(bdate_range)\n", - " 12 0.000 0.000 0.024 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:821(date_range)\n", - " 121 0.001 0.000 0.024 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6662(copy)\n", - " 3 0.000 0.000 0.024 0.008 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1850(_python_apply_general)\n", - " 12 0.002 0.000 0.024 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:397(_generate_range)\n", - " 5 0.000 0.000 0.024 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:506(nested_data_to_arrays)\n", - " 52 0.001 0.000 0.024 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4142(_take_with_is_copy)\n", - " 288 0.002 0.000 0.024 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4626(_get_item_cache)\n", - " 5 0.000 0.000 0.024 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:793(to_arrays)\n", - " 66 0.002 0.000 0.024 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6956(insert)\n", - " 3 0.000 0.000 0.023 0.008 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/generic.py:1558(_wrap_applied_output)\n", - " 2 0.000 0.000 0.023 0.011 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/obbject.py:167(is_list_of_basemodel)\n", - " 33401 0.022 0.000 0.022 0.000 {built-in method _abc._abc_instancecheck}\n", - " 1 0.000 0.000 0.022 0.022 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:194(_wrap_result)\n", - " 57 0.001 0.000 0.022 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:869(take)\n", - " 87 0.001 0.000 0.022 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1176(__getitem__)\n", - " 53 0.001 0.000 0.022 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4027(take)\n", - " 257 0.002 0.000 0.022 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:3983(_ixs)\n", - " 135 0.001 0.000 0.021 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:557(copy)\n", - " 6041 0.003 0.000 0.021 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/obbject.py:168()\n", - " 10 0.000 0.000 0.020 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:826(is_USholiday)\n", - " 357 0.001 0.000 0.019 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6284(__getattr__)\n", - " 12 0.001 0.000 0.019 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:468()\n", - " 68 0.001 0.000 0.019 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:623(reindex_indexer)\n", - " 6813 0.013 0.000 0.019 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:576(tz)\n", - " 36/9 0.001 0.000 0.019 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6463(astype)\n", - " 895 0.018 0.000 0.018 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2712(_generate_range)\n", - " 7471 0.017 0.000 0.018 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:645(__iter__)\n", - " 1350 0.003 0.000 0.018 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_strptime.py:26(_getlang)\n", - " 3 0.000 0.000 0.018 0.006 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:313(__init__)\n", - " 4 0.006 0.001 0.018 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:891(_list_of_dict_to_arrays)\n", - " 3 0.000 0.000 0.017 0.006 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/validate_call_decorator.py:28(validate_call)\n", - " 3 0.000 0.000 0.017 0.006 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/validate_call_decorator.py:51(validate)\n", - " 3 0.000 0.000 0.017 0.006 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_validate_call.py:26(__init__)\n", - " 2 0.000 0.000 0.017 0.008 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6731(drop_duplicates)\n", - " 6041 0.009 0.000 0.016 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/utils.py:48()\n", - " 1284 0.002 0.000 0.016 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:163(match)\n", - " 81 0.002 0.000 0.016 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:674(_with_infer)\n", - " 1 0.000 0.000 0.016 0.016 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:333(update_spot_cache)\n", - " 3586 0.005 0.000 0.015 0.000 :319(decode)\n", - " 1 0.000 0.000 0.015 0.015 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:160(_convert_arrays_to_dataframe)\n", - " 1350 0.003 0.000 0.015 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/locale.py:594(getlocale)\n", - " 1 0.000 0.000 0.015 0.015 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:426(__init__)\n", - " 1 0.001 0.001 0.015 0.015 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:306(drop_cache_duplicates)\n", - " 2 0.000 0.000 0.015 0.007 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:78(method)\n", - " 2 0.000 0.000 0.015 0.007 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:736(map)\n", - " 158 0.010 0.000 0.015 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1157(maybe_infer_to_datetimelike)\n", - " 6041 0.007 0.000 0.015 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_model_construction.py:268(__instancecheck__)\n", - " 1416 0.004 0.000 0.015 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:330(_name_includes_bit_suffix)\n", - " 1872 0.011 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:428(append)\n", - "7433/7415 0.008 0.000 0.014 0.000 {built-in method numpy.asarray}\n", - " 1 0.000 0.000 0.014 0.014 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:9492(pivot_table)\n", - " 1 0.000 0.000 0.014 0.014 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/pivot.py:61(pivot_table)\n", - " 1 0.000 0.000 0.014 0.014 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/pivot.py:118(__internal_pivot_table)\n", - " 32 0.000 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6110(_cmp_method)\n", - " 8075 0.012 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:416(extract_array)\n", - " 2 0.000 0.000 0.014 0.007 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4320(_setitem_array)\n", - " 85 0.000 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1719(_getitem_axis)\n", - " 13831 0.010 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:123()\n", - " 237 0.001 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1287(take_nd)\n", - " 27/3 0.000 0.000 0.013 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:620(generate_schema)\n", - " 2 0.000 0.000 0.013 0.007 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:10803(where)\n", - " 298/290 0.001 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:59(take_nd)\n", - " 2 0.000 0.000 0.013 0.007 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:10615(_where)\n", - " 151 0.000 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1496(items)\n", - " 152 0.001 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2632(check_bool_indexer)\n", - " 42/3 0.000 0.000 0.013 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:906(_generate_schema_inner)\n", - " 42/3 0.001 0.000 0.013 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:931(match_type)\n", - " 49 0.001 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6201(_construct_result)\n", - " 3 0.000 0.000 0.013 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1871(_callable_schema)\n", - " 6670 0.013 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2310(_construct_from_dt64_naive)\n", - "21528/18897 0.009 0.000 0.012 0.000 {built-in method builtins.len}\n", - " 78 0.000 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1756(_get_slice_axis)\n", - " 387 0.001 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7593(ensure_index)\n", - " 2 0.000 0.000 0.012 0.006 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6828(duplicated)\n", - " 36940 0.011 0.000 0.012 0.000 {built-in method builtins.hasattr}\n", - " 5 0.000 0.000 0.012 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:209(_maybe_cache)\n", - " 1538 0.007 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6301(__setattr__)\n", - " 615 0.002 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:208(findall)\n", - " 14800 0.009 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:208(isnum)\n", - " 13329 0.009 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1194()\n", - " 6682 0.011 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:103(tz_to_dtype)\n", - " 50 0.001 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:687()\n", - " 1288 0.001 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:225(compile)\n", - " 77 0.002 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4361(_slice)\n", - " 48 0.003 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:708(_slice_take_blocks_ax0)\n", - " 15 0.000 0.000 0.011 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1574(_generate_parameter_schema)\n", - " 308 0.002 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:419(check_array_indexer)\n", - " 7526 0.008 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:334(is_hashable)\n", - " 1238 0.005 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1006(_find_hms_idx)\n", - " 288 0.005 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:120(_take_nd_ndarray)\n", - " 16 0.000 0.000 0.011 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:96(arrays_to_mgr)\n", - " 2 0.002 0.001 0.010 0.005 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/utils.py:54()\n", - " 1304 0.005 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numerictypes.py:357(issubdtype)\n", - " 13831 0.010 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:121(classes)\n", - " 5 0.001 0.000 0.010 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:149(should_cache)\n", - " 3586 0.010 0.000 0.010 0.000 {built-in method _codecs.utf_8_decode}\n", - " 7 0.000 0.000 0.010 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:157(concat)\n", - " 34026 0.010 0.000 0.010 0.000 {built-in method builtins.issubclass}\n", - " 966 0.010 0.000 0.010 0.000 {cyfunction Timestamp.strftime at 0x10d6c2c20}\n", - " 251 0.001 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4608(_box_col_values)\n", - " 6670 0.007 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2514(_validate_dt64_dtype)\n", - " 130 0.001 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1782(_consolidate_inplace)\n", - " 1350 0.003 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/locale.py:479(_parse_localename)\n", - " 2 0.000 0.000 0.009 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:196(where)\n", - " 31 0.001 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3820(get_indexer)\n", - " 114 0.001 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2529(__setitem__)\n", - " 9171 0.009 0.000 0.009 0.000 {built-in method numpy.datetime_data}\n", - " 298 0.003 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/ipkernel.py:775(_clean_thread_parent_frames)\n", - " 7 0.000 0.000 0.009 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:622(get_result)\n", - " 677 0.006 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6236(__finalize__)\n", - " 130 0.001 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5437(_can_hold_identifiers_and_holds_name)\n", - " 4 0.000 0.000 0.008 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6239(reset_index)\n", - " 5 0.000 0.000 0.008 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6997(sort_values)\n", - " 6332 0.007 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:915()\n", - " 81 0.001 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5242(_sanitize_column)\n", - " 660 0.005 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:221(__init__)\n", - " 15 0.000 0.000 0.008 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2066(_apply_annotations)\n", - " 1566 0.004 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1596(pandas_dtype)\n", - " 6 0.000 0.000 0.008 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4796(_drop_axis)\n", - " 75/39 0.000 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:50(__le__)\n", - " 14 0.000 0.000 0.008 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:38(__eq__)\n", - " 1806 0.008 0.000 0.008 0.000 {method 'match' of 're.Pattern' objects}\n", - " 695 0.004 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5323(__contains__)\n", - " 648 0.006 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:474(resolve_ymd)\n", - " 6667 0.008 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2148(_creso)\n", - " 13 0.000 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1610(_log)\n", - " 15 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_schema_generation_shared.py:82(__call__)\n", - " 11 0.000 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:607(_init_dict)\n", - " 21 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1689(_getitem_tuple)\n", - " 114 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1422(_set_value)\n", - " 15 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2085(inner_handler)\n", - " 1 0.000 0.000 0.007 0.007 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:139(_parse_date_columns)\n", - " 114 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1415(_set_values)\n", - " 1 0.000 0.000 0.007 0.007 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:277(organize_data_for_query)\n", - " 7 0.000 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6186(_get_indexer_strict)\n", - " 64 0.001 0.000 0.007 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:760(parse_option_tick)\n", - " 66 0.002 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5368(insert)\n", - " 4 0.000 0.000 0.007 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6538(dropna)\n", - " 9 0.000 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:674(astype)\n", - " 37 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7164(_cmp_method)\n", - " 7160 0.007 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:152(cast_scalar_indexer)\n", - " 686 0.007 0.000 0.007 0.000 {method 'reduce' of 'numpy.ufunc' objects}\n", - " 6696 0.007 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:529(is_string_or_object_np_dtype)\n", - " 175 0.003 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:842(_engine)\n", - " 1350 0.005 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/locale.py:396(normalize)\n", - " 39 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:610(factorize)\n", - " 5 0.006 0.001 0.006 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:447(astype)\n", - " 7327 0.006 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:831(_reset_identity)\n", - " 615 0.006 0.000 0.006 0.000 {method 'findall' of 're.Pattern' objects}\n", - " 6670 0.006 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2063(_maybe_pin_freq)\n", - " 752 0.004 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:609(_dtype_to_subclass)\n", - " 5 0.000 0.000 0.006 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5993(set_index)\n", - " 13 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1636(handle)\n", - " 6 0.000 0.000 0.006 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/from_thread.py:455(start_blocking_portal)\n", - " 6984 0.004 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:203(isword)\n", - " 13 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1690(callHandlers)\n", - " 1854 0.005 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1141(_to_decimal)\n", - " 13340 0.005 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2570(_validate_tz_from_dtype)\n", - " 12 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2259(_consolidate)\n", - " 5 0.000 0.000 0.006 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:928(_finalize_columns_and_data)\n", - " 15 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:965(handle)\n", - " 6 0.000 0.000 0.006 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:1006(convert_object_array)\n", - " 130 0.001 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_strptime.py:564(_strptime_datetime)\n", - " 16 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:1371(_arith_method)\n", - " 6 0.000 0.000 0.006 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:1070()\n", - " 46 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:387(apply)\n", - " 29 0.005 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:1028(convert)\n", - " 75/39 0.001 0.000 0.006 0.000 {built-in method _operator.le}\n", - " 9 0.000 0.000 0.006 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5095(insert)\n", - " 13 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6162(get_indexer_for)\n", - " 15 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1098(emit)\n", - " 660 0.005 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:62(__init__)\n", - " 593 0.001 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:339(_from_mgr)\n", - " 12 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4323(reindex)\n", - " 10 0.000 0.000 0.006 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5343(reindex)\n", - " 1224 0.003 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:178(_datetime_metadata_str)\n", - " 7948 0.005 0.000 0.005 0.000 {built-in method __new__ of type object at 0x101d2a898}\n", - " 37 0.002 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:977(_cmp_method)\n", - " 251 0.004 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1012(iget)\n", - " 2608 0.004 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numerictypes.py:283(issubclass_)\n", - " 18 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1004(_getitem_tuple_same_dim)\n", - " 130 0.003 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_strptime.py:309(_strptime)\n", - " 1829 0.005 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:336(hms)\n", - " 10 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:822(is_busday)\n", - " 16 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:596(_homogenize)\n", - " 28 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6925(f)\n", - " 50 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:288(comparison_op)\n", - " 14 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:42(__ne__)\n", - " 725 0.004 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:278(__init__)\n", - " 1 0.001 0.001 0.005 0.005 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:524()\n", - " 269/263 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:101(isna)\n", - " 12 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1322(__contains__)\n", - " 890 0.005 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1331(is_ea_or_datetimelike_dtype)\n", - " 12 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6133(_arith_method)\n", - " 39 0.002 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:548(factorize_array)\n", - " 12 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2982(get_loc)\n", - " 114 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:586()\n", - " 6039 0.005 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/utils.py:49()\n", - " 5 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5614(_reindex_axes)\n", - " 12 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:3308(_get_level_indexer)\n", - " 35 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:127(get_option_specifics_from_key)\n", - " 257 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:678(_constructor_sliced_from_mgr)\n", - " 216 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:97(is_bool_indexer)\n", - " 15 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1087(flush)\n", - " 114 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:372(setitem)\n", - " 18 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:582(get_loc)\n", - " 30 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:124(maybe_convert_platform)\n", - " 1245 0.003 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2537(dtype_to_unit)\n", - " 269/263 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:184(_isna)\n", - " 228 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:583(copy_func)\n", - " 288 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:564(_take_preprocess_indexer_and_fill_value)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/generic.py:1420(aggregate)\n", - " 36 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:421(astype)\n", - " 16 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2121(create_block_manager_from_column_arrays)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:172(agg)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:558(apply_str)\n", - " 2 0.000 0.000 0.004 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:226(__get_underlier_data)\n", - " 2 0.000 0.000 0.004 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1397(_getitem_axis)\n", - " 160 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:145(_get_option)\n", - " 12 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2957(_get_loc_single_level_index)\n", - " 4 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:214(_obj_with_exclusions)\n", - " 2 0.000 0.000 0.004 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1205(_getbool_axis)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:681(_apply_str)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:2365(mean)\n", - " 30 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6957()\n", - " 64 0.000 0.000 0.004 0.000 {built-in method strptime}\n", - " 9309 0.004 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:551(dtype)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1957(_cython_agg_general)\n", - " 485 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:137(is_object_dtype)\n", - " 2 0.000 0.000 0.004 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5433(drop)\n", - " 626 0.002 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2152(unit)\n", - " 2 0.000 0.000 0.004 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4757(drop)\n", - " 79 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5425(_getitem_slice)\n", - " 4 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:11603(any)\n", - " 145 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:807(_set_axis)\n", - " 5 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:7918(_dispatch_frame_op)\n", - " 12 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:558(_parse_with_reso)\n", - " 12 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:275(_parse_with_reso)\n", - " 4 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12169(_logical_func)\n", - " 2 0.000 0.000 0.004 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1508(error)\n", - " 51 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6418(_reduce)\n", - " 117 0.002 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:231(asarray_tuplesafe)\n", - " 29 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:12675(_reindex_for_setitem)\n", - " 5/4 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:11435(_reduce)\n", - " 55 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:800(_generate_schema_from_property)\n", - " 14653 0.004 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:2287(cast)\n", - " 66 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:262(_get_hashtable_algo)\n", - " 453 0.002 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:790(copy)\n", - " 995 0.002 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:696(_sanitize_ndim)\n", - " 295 0.002 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:274(full)\n", - " 13 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/handlers.py:65(emit)\n", - " 424 0.002 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3777(get_loc)\n", - " 660 0.004 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:395(__init__)\n", - " 13/11 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1040(_match_generic_type)\n", - " 35 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6519(sum)\n", - " 13 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1216(emit)\n", - " 35 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12498(sum)\n", - " 6 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7031(drop)\n", - " 290 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:659(_constructor_from_mgr)\n", - " 3 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:7903(_arith_method)\n", - " 66 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1393(moveaxis)\n", - " 2531 0.003 0.000 0.003 0.000 {method 'format' of 'str' objects}\n", - " 10 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1479(info)\n", - " 6 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:371(__init__)\n", - " 77 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:141(__exit__)\n", - " 52 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:723(astype)\n", - " 1326 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:481(ensure_wrapped_if_datetimelike)\n", - " 315 0.000 0.000 0.003 0.000 {method 'any' of 'numpy.ndarray' objects}\n", - " 35 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12459(_min_count_stat_function)\n", - " 7 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:5136(reindex)\n", - " 12559 0.003 0.000 0.003 0.000 {method 'read' of '_io.StringIO' objects}\n", - " 1291 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:193(__get__)\n", - " 7524 0.003 0.000 0.003 0.000 {method 'append' of 'list' objects}\n", - "8265/8251 0.003 0.000 0.003 0.000 {built-in method builtins.hash}\n", - " 314 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:773(_view)\n", - " 91 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1863(from_array)\n", - " 17295 0.003 0.000 0.003 0.000 {method 'isdigit' of 'str' objects}\n", - " 27 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:2344(unique)\n", - " 97 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1095(__getitem__)\n", - " 2 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:301(lexsort_indexer)\n", - " 16 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2190(_form_blocks)\n", - " 149 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/ipkernel.py:790()\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1450(grouped_reduce)\n", - " 170 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:127(_get_single_key)\n", - " 88 0.001 0.000 0.003 0.000 {built-in method builtins.sorted}\n", - " 30 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1580(construct_1d_object_array_from_listlike)\n", - " 3 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:589(clean_schema)\n", - " 65 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1412(_insert_update_blklocs_and_blknos)\n", - " 318 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2645(maybe_coerce_values)\n", - " 6 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4477(__delitem__)\n", - " 54 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:655(write)\n", - " 288 0.001 0.000 0.003 0.000 {built-in method builtins.any}\n", - " 317 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:55(_any)\n", - " 27 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:1019(unique)\n", - " 35 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2276(_merge_blocks)\n", - " 11 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1369(_union_schema)\n", - " 26 0.000 0.000 0.003 0.000 {built-in method builtins.print}\n", - " 8338 0.003 0.000 0.003 0.000 {built-in method builtins.setattr}\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1971(array_func)\n", - " 129 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2703(new_block_2d)\n", - " 3111 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:213(isspace)\n", - " 130 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1764(is_consolidated)\n", - " 3 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:192(__sub__)\n", - " 221 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1010(view)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:467(calculate_quantity)\n", - " 119 0.000 0.000 0.003 0.000 {built-in method builtins.sum}\n", - " 85 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2313(is_unique)\n", - " 7 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:699(new_axes)\n", - " 116 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1495(_maybe_update_cacher)\n", - " 752 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:591(_ensure_array)\n", - " 7 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:702()\n", - " 27 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:307(unique)\n", - " 6 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1434(idelete)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4360(_iset_not_inplace)\n", - " 236 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:551(maybe_promote)\n", - " 1226 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:329(month)\n", - " 130 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1772(_consolidate_check)\n", - " 72 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:131(filterwarnings)\n", - " 648 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:380(validate)\n", - " 13 0.003 0.000 0.003 0.000 {method 'flush' of '_io.TextIOWrapper' objects}\n", - " 4 0.003 0.001 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:922()\n", - " 27 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:427(unique_with_mask)\n", - " 36 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:823(take)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:442(update_greek_limits)\n", - " 155 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5170(_get_engine_target)\n", - " 608 0.002 0.000 0.002 0.000 {method 'copy' of 'numpy.ndarray' objects}\n", - " 149 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1501(enumerate)\n", - " 1226 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:319(jump)\n", - " 18 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:402(walk_core_schema)\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5359(reindex)\n", - " 881 0.002 0.000 0.002 0.000 {built-in method numpy.empty}\n", - " 25 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1247(series_generator)\n", - " 3143 0.002 0.000 0.002 0.000 {method 'pop' of 'list' objects}\n", - " 360/18 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:196(walk)\n", - " 1350 0.002 0.000 0.002 0.000 {built-in method _locale.setlocale}\n", - " 75/73 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:1131(take)\n", - " 27 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6679(_maybe_cast_listlike_indexer)\n", - " 668 0.002 0.000 0.002 0.000 :1207(_handle_fromlist)\n", - " 110 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2520(get_schema_or_ref)\n", - " 35 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:76(_f)\n", - " 17 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:325(__new__)\n", - " 360/18 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:199(_walk)\n", - " 195 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:82(shape)\n", - " 18 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:392(handle_call_schema)\n", - " 4/3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:58(__ge__)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:7885(replace)\n", - " 57 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1146(take)\n", - " 157 0.000 0.000 0.002 0.000 {method 'all' of 'numpy.ndarray' objects}\n", - " 315/35 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:128(deepcopy)\n", - " 63 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:239(maybe_convert_indices)\n", - " 238 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1220(_get_value)\n", - " 18 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:379(handle_arguments_schema)\n", - " 130 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5562(append)\n", - " 251 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1471(_set_as_cached)\n", - " 154 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2264()\n", - " 64 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:189(_na_arithmetic_op)\n", - " 487 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2765(check_dict_or_set_indexers)\n", - " 9 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/from_thread.py:308(start_task_soon)\n", - " 154 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:784(name)\n", - " 39 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:389(new_func)\n", - " 720 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2795(extend_blocks)\n", - " 31 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6394(_should_compare)\n", - " 3912 0.002 0.000 0.002 0.000 {method 'get' of 'dict' objects}\n", - " 114 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1373(setitem)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:7894(_cmp_method)\n", - " 55 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:77(get_type_ref)\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:743(group_info)\n", - " 7 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:717(_get_concat_axis)\n", - " 1812 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:909(__len__)\n", - " 31 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3955(_get_indexer)\n", - " 111 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3122(duplicated)\n", - " 8 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:5773(isna)\n", - " 615 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1099(_parse_min_sec)\n", - " 65 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1402(_insert_update_mgr_locs)\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:758(_get_compressed_codes)\n", - " 563 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:831(_values)\n", - " 8 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:8693(isna)\n", - " 157 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:61(_all)\n", - " 66 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:106(_ensure_data)\n", - " 6 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/_backends/_asyncio.py:980(_spawn_task_from_thread)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:592(flush)\n", - " 77 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:225(_consolidate_key)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:407(__rsub__)\n", - " 6941 0.002 0.000 0.002 0.000 {method 'lower' of 'str' objects}\n", - " 1742 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/__init__.py:34(using_copy_on_write)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:293()\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:798(tolist)\n", - " 167 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1519(construct_1d_arraylike_from_scalar)\n", - " 141 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2518(__getitem__)\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:208(__truediv__)\n", - " 10 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:259(schedule)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:404(__radd__)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/base.py:2058(tolist)\n", - " 55 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:141(equals)\n", - " 6 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/_backends/_asyncio.py:2483(run_sync_from_thread)\n", - " 2 0.002 0.001 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:317(__add__)\n", - " 46 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:157(take)\n", - " 54 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:577(_schedule_flush)\n", - " 35 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:227(_deepcopy_dict)\n", - " 52 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/astype.py:191(astype_array_safe)\n", - " 122 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1778()\n", - " 5 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7553(ensure_index_from_sequences)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/helpers.py:8(parse_signal_id)\n", - " 6984 0.002 0.000 0.002 0.000 {method 'isalpha' of 'str' objects}\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:9863(unstack)\n", - " 83 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:511(_validate_dtype)\n", - " 172 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1571(validate_all_hashable)\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:200(__mul__)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:489(unstack)\n", - " 17 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1066(iset)\n", - " 208 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2716(new_block)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:525(_unstack_frame)\n", - " 145 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:236(set_axis)\n", - " 10 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/zmq/sugar/socket.py:621(send)\n", - " 66 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:280(_check_object_for_strings)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:812(_cython_operation)\n", - " 5 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:68(__and__)\n", - " 7 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6432(dtypes)\n", - " 5 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6123(_logical_method)\n", - " 603 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:322(weekday)\n", - " 8 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1316(view)\n", - " 129 0.000 0.000 0.002 0.000 {method 'max' of 'numpy.ndarray' objects}\n", - " 8 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1248(copy)\n", - " 9 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5663(_reindex_with_indexers)\n", - " 34 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:240(arithmetic_op)\n", - " 129 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:182(_add_filter)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:7282(sort_index)\n", - " 35 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:455(newfunc)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5290(sort_index)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:94(concatenate_managers)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:9041(groupby)\n", - " 170 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:676(_translate_key)\n", - " 15 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4470(_iset_item_mgr)\n", - " 700 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:372(apply_if_callable)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:188(__radd__)\n", - " 111 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:274(make_block)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:380(notna)\n", - " 64 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/computation/expressions.py:226(evaluate)\n", - " 37 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:524(_validate_comparison_value)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:419(simplify_schema_references)\n", - " 8 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4883(_update_inplace)\n", - " 579 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:84()\n", - " 24 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:220(__init__)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1296(__init__)\n", - " 170 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:635(_get_root)\n", - " 10 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:153(_set_option)\n", - " 648 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:482()\n", - " 129 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:39(_amax)\n", - " 437 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:180(blknos)\n", - " 24 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:373(_finalize)\n", - " 111 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2811(ensure_block_shape)\n", - " 35 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:604(nansum)\n", - " 233 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:568(require_length_match)\n", - " 139 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:273(is_dict_like)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2236(_tuples_to_blocks_no_consolidate)\n", - " 7037 0.001 0.000 0.001 0.000 {method 'keys' of 'dict' objects}\n", - " 171 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4402(_check_setitem_copy)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2235(take)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2238()\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:485(__exit__)\n", - " 7 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1870(_get_label_or_level_values)\n", - " 12 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:550(validate_categories)\n", - " 172 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:830(__len__)\n", - " 242 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:467(__enter__)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1633(as_array)\n", - " 64 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/computation/expressions.py:67(_evaluate_standard)\n", - " 264/120 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:206(_handle_other_schemas)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:122(get_group_index)\n", - " 63 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/base.py:549(find)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:12590(values)\n", - " 132 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1330(normalize_axis_tuple)\n", - " 1345 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1168(ident)\n", - " 17 0.001 0.000 0.001 0.000 {built-in method _thread.start_new_thread}\n", - " 1416 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:24(_kind_name)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:846(get_grouper)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1102(wrap_results)\n", - " 112 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2776(_is_multi)\n", - " 145 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:86(_validate_set_axis)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1507(operate_blockwise)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1915(_agg_py_fallback)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/ops.py:57(operate_blockwise)\n", - " 563 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2004(internal_values)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1707(_interleave)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7227(_arith_method)\n", - " 46 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:664(_constructor_from_mgr)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:7142(fillna)\n", - " 356 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2674(get_block_type)\n", - " 45 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:273(__call__)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:735(has_dropped_na)\n", - " 1 0.001 0.001 0.001 0.001 {built-in method io.open}\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:777(_concat_indexes)\n", - " 200 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:253(fill_value)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:897(apply_groupwise)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5455(append)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:59(get_indexer_indexer)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/generic.py:2002(_get_data_to_aggregate)\n", - " 603 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:342(ampm)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1483(reduce)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:240(__pow__)\n", - " 7 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:405(__init__)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5491(_concat)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:622(_get_splitter)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:860(values)\n", - " 70 0.001 0.000 0.001 0.000 {method 'transpose' of 'numpy.ndarray' objects}\n", - " 44 0.000 0.000 0.001 0.000 {method 'sum' of 'numpy.ndarray' objects}\n", - " 37 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2744(inferred_type)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:180(fillna)\n", - " 725 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/flags.py:51(__init__)\n", - " 103 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:390(_get_getitem_freq)\n", - " 25 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:71(_wrapreduction)\n", - " 105 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5552(equals)\n", - " 89 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/dispatch.py:17(should_extension_dispatch)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:243(replace)\n", - " 18 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1524(where)\n", - " 331 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:734(name)\n", - " 27 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:261(_isna_array)\n", - " 45 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:836(__iter__)\n", - " 17 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:903(_set_levels)\n", - " 176 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4623(_clear_item_cache)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_decorators.py:325(wrapper)\n", - " 215 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:948(from_blocks)\n", - " 677 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/flags.py:87(allows_duplicate_labels)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:3951(T)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:3767(transpose)\n", - " 21 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1032(_getitem_lowerdim)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1823(_setup_result_proxy)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:744(_group_index)\n", - " 367 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:586(_get_axis)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1893(_setup_dml_or_text_result)\n", - " 354 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1590()\n", - " 564 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1392()\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:474(from_arrays)\n", - " 408 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:219(_can_consolidate)\n", - " 236 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:707(dtype)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:1422(__init__)\n", - " 599 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1133(_parsems)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:271(from_annotation)\n", - " 9 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:333(from_annotated_attribute)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:110(__init__)\n", - " 48 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:294(handle_union_schema)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:1485(_init_metadata)\n", - " 65 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2311(_fast_count_smallints)\n", - " 12 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:418(merge_field_infos)\n", - " 122 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:3995(_maybe_update_cacher)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:347(__init__)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:828(replace)\n", - " 18 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1643(fillna)\n", - " 85 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:243(__init__)\n", - " 634 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:214(is_extension)\n", - " 15 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:66(copy)\n", - " 44 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:47(_sum)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:651()\n", - " 17 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/ipkernel.py:768(init_closure)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_discriminated_union.py:37(apply_discriminators)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:3048(factorize_from_iterables)\n", - " 105 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:184(_reconstruct_data)\n", - " 13 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1595(makeRecord)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:3069()\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:3005(factorize_from_iterable)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:8282(_construct_result)\n", - " 52 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:414(_split_op_result)\n", - " 376 0.001 0.000 0.001 0.000 {method 'view' of 'numpy.ndarray' objects}\n", - " 20 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:113(comp_method_OBJECT_ARRAY)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:416(_maybe_cast_listlike_indexer)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:196(__rsub__)\n", - " 7 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4159(xs)\n", - " 15 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:942(format)\n", - " 63 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:328(__init__)\n", - " 165 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1850(from_blocks)\n", - " 55 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/common.py:81(get_op_result_name)\n", - " 35 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:534(_scalar_from_string)\n", - " 15 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:674(format)\n", - " 7 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:689(codes)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:2063(to_dict)\n", - " 3111 0.001 0.000 0.001 0.000 {method 'isspace' of 'str' objects}\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/methods/to_dict.py:78(to_dict)\n", - " 246 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:292(make_block_same_class)\n", - " 17 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1085(_set_codes)\n", - " 214 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/frozen.py:76(__getitem__)\n", - " 21 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:957(_validate_tuple_indexer)\n", - " 13 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:292(__init__)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:777(_codes_and_uniques)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:231(get_result)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1443()\n", - " 17 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:856(__init__)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:958(fast_xs)\n", - " 42 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1081(is_numeric_dtype)\n", - " 1291 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:1257(value)\n", - " 130 0.001 0.000 0.001 0.000 {method 'remove' of 'list' objects}\n", - " 51 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:612(result_iterator)\n", - " 337 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/extension.py:67(fget)\n", - " 48 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:440(acquire)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:7172()\n", - " 227 0.001 0.000 0.001 0.000 {method 'clear' of 'dict' objects}\n", - " 41 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:2082(empty)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:496(_merge_cursor_description)\n", - " 5/4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2435(_signature_from_callable)\n", - " 112 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1643(__len__)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4651(_maybe_cache_changed)\n", - " 7 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/ops.py:29(_iter_block_pairs)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1784(get_level_values)\n", - " 57 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:166(simplefilter)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:625()\n", - " 379 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:195(is_array_like)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7218(_construct_result)\n", - " 289 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1253(iget)\n", - " 45 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:525(_unbox_scalar)\n", - " 67 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:217(_ensure_arraylike)\n", - " 214 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:673(na_value_for_dtype)\n", - " 97 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:728(is_valid_na_for_dtype)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12362(_stat_function)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6488(isna)\n", - " 16 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:844(levels)\n", - " 130 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1768(ravel)\n", - " 37 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:718(_unbox)\n", - " 236 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1993(dtype)\n", - " 13 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:305(_isna_string_dtype)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2016(_sort_levels_monotonic)\n", - " 242 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:441(__init__)\n", - " 40 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:2077(__contains__)\n", - " 27 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6415(_is_comparable_dtype)\n", - " 284 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:2443(get_origin)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1758(_get_level_values)\n", - " 33 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1277(is_extension_array_dtype)\n", - " 242 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:488(__exit__)\n", - " 995 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:758(_maybe_repeat)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1565(__invert__)\n", - " 59 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:924()\n", - " 63/3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:425(collect_refs)\n", - " 7 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:707(_get_comb_axis)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:348(get_function_type_hints)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:3261(signature)\n", - " 1854 0.001 0.000 0.001 0.000 {method 'is_finite' of 'decimal.Decimal' objects}\n", - " 48 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:314(_result_or_cancel)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:3007(from_callable)\n", - " 38 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:33(seterr)\n", - " 379 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:735(_sanitize_str_dtypes)\n", - " 2 0.000 0.000 0.001 0.000 {method 'throw' of 'generator' objects}\n", - " 735 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3809()\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2331(_signature_from_function)\n", - " 58/42 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2432(_extract_get_pydantic_json_schema)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:593(fetch_eof_columns)\n", - " 14 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2979(prod)\n", - " 16 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:897()\n", - " 7 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:72(get_objs_combined_axis)\n", - " 59 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1102()\n", - " 46 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:782(_rename)\n", - " 310 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:667(_info_axis)\n", - " 157 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:319(asi8)\n", - " 95 0.001 0.000 0.001 0.000 {method 'take' of 'numpy.ndarray' objects}\n", - " 33 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:353(wrapper)\n", - " 18 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:219(vstack)\n", - " 31 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6324(_maybe_downcast_for_indexing)\n", - " 19 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2246(_stack_arrays)\n", - " 288 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:325(_get_take_nd_function)\n", - " 15 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:263(eval_type_backport)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:176(isna)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:596(shape)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:782(result_index)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:111(f)\n", - " 81 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4585(_ensure_valid_index)\n", - " 514 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1837(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:840(agg_series)\n", - " 603 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1056(_could_be_tzname)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1559(itertuples)\n", - " 575 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/__init__.py:42(warn_copy_on_write)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:296(_eval_type_backport)\n", - " 114 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2603(_tuplify)\n", - " 42 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:775(infer_dtype_from_scalar)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1697(_validate_names)\n", - " 108 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:108(asi8)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:492(to_numpy)\n", - " 119 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:2140()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:598()\n", - " 432 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:999(__len__)\n", - " 48 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2320(_preprocess_slice_or_indexer)\n", - " 82 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:537(_check_compatible_with)\n", - " 1277 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5144(_values)\n", - " 42 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1574(_validate_key)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:676(ngroups)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:321(_eval_type)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:226(isna)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2421(all)\n", - " 403 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:300()\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1433(find_common_type)\n", - " 1387 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:405(flags)\n", - " 25 0.000 0.000 0.000 0.000 {method 'extend' of 'list' objects}\n", - " 35 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:789(values)\n", - " 54 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:914(__len__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:378(interleaved_dtype)\n", - " 135 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4379(_set_is_copy)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6459(any)\n", - " 33 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:165(maybe_lift)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1684(is_monotonic_increasing)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:1083(reduction)\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1652(_is_scalar_access)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1630()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6916(delete)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:805(call_soon_threadsafe)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:885(pandasSQL_builder)\n", - " 70/15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:387(_eval_type)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:430(__enter__)\n", - " 32/30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_repr.py:86(display_as_type)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:259(_reconstruct)\n", - " 654 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:572(_get_axis_number)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:873(_aggregate_series_pure_python)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:191(_make_selectors)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6629(cumprod)\n", - " 158 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:592(_get_block_manager_axis)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:652(_validate_listlike)\n", - " 80 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:769(_assert_tzawareness_compat)\n", - " 184 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1040(needs_i8_conversion)\n", - " 77 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:299(helper)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12291(cumprod)\n", - " 624 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:360(convertyear)\n", - " 128 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:456(_engine_type)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:120(_get_combined_index)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:743(parse_position_id)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12239(_accum_func)\n", - " 35 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2000(external_values)\n", - " 78 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4191(_validate_positional_slice)\n", - " 63/3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_discriminated_union.py:45(inner)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:122(collect_definitions)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:214(_handle_result)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:187(validate_indices)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2036(_get_prepare_pydantic_annotations_for_known_type)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:815(_handle_resultset)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:487()\n", - " 318 0.000 0.000 0.000 0.000 {method 'astype' of 'numpy.ndarray' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:687(codes)\n", - " 87 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1310(__getattr__)\n", - " 624 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:402(has_year)\n", - " 66 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5295(_validate_fill_value)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:838(_cleanup)\n", - " 63/3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:125(_record_valid_refs)\n", - " 140 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:79()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:690()\n", - " 42 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:4120(_coerce_indexer_frozen)\n", - " 58 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:350(getitem_block_columns)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:747()\n", - " 1476 0.000 0.000 0.000 0.000 {built-in method builtins.callable}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:1149(__iter__)\n", - " 220 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:649(_get_deprecated_option)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:1162(_sorted_data)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:237(ndarray_to_mgr)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/putmask.py:101(validate_putmask)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:482(nanany)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6509(max)\n", - " 31 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:633(is_integer_dtype)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2244(get_values)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:771(ngroups)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:456(get_rows)\n", - " 710 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/flags.py:55(allows_duplicate_labels)\n", - " 123 0.000 0.000 0.000 0.000 {method 'nonzero' of 'numpy.ndarray' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_exceptions.py:34(find_stack_level)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12397(max)\n", - " 75 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:4035(_dict_not_none)\n", - " 677 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:718(dtype)\n", - " 59 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:74(__len__)\n", - " 63/3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:488(inline_refs)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2229(is_monotonic_increasing)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1532(__neg__)\n", - " 63/3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:447(count_refs)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:567(validate_core_schema)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:66(mask_missing)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6219(_raise_if_missing)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1730(_get_default_index_names)\n", - " 217 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:791(is_)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1491(warning)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:158(collect_invalid_schemas)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:369(nargsort)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:606(formatTime)\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1574(_set_names)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6499(min)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1561(findCaller)\n", - " 37 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:836(_isnan)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12381(min)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_asarray.py:27(require)\n", - " 63/3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:161(_is_schema_valid)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:53(_wrapfunc)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1045(astype)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:545(_get_sample_object)\n", - " 132 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1380()\n", - " 140 0.000 0.000 0.000 0.000 {method 'reshape' of 'numpy.ndarray' objects}\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:572(_is_uniform_join_units)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/selector_events.py:128(_write_to_self)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:1452(safe_sort)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:348()\n", - " 4/3 0.000 0.000 0.000 0.000 {built-in method _operator.ge}\n", - " 170 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:617(_select_options)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:386(default_index)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/plugin/_schema_validator.py:21(create_schema_validator)\n", - " 677 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:363(attrs)\n", - " 474 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1940(_block)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1265(_iset_single)\n", - " 114 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:123(check_setitem_lengths)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1250(copy)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:435(__exit__)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:562(__init__)\n", - " 88 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:795(_merge_cols_by_none)\n", - " 83/24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:409()\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2666(_maybe_normalize_endpoints)\n", - " 6 0.000 0.000 0.000 0.000 {method 'send' of '_socket.socket' objects}\n", - " 43 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:301(maybe_iterable_to_list)\n", - " 124 0.000 0.000 0.000 0.000 {built-in method numpy.zeros}\n", - " 14 0.000 0.000 0.000 0.000 {built-in method _operator.ne}\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5598()\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:393(logical_op)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:567()\n", - " 29 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:119(is_namedtuple)\n", - " 35 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:249(external_values)\n", - " 288 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1270(is_1d_only_ea_dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:296(_get_combined_plan)\n", - " 17 0.000 0.000 0.000 0.000 {method 'min' of 'numpy.ndarray' objects}\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1771(_is_label_reference)\n", - " 3 0.000 0.000 0.000 0.000 {built-in method pydantic_core._pydantic_core.validate_core_schema}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:266(index_labels_to_array)\n", - " 77 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:104(__init__)\n", - " 242 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1687(__eq__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:652()\n", - " 180 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:271(__enter__)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:58(__new__)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5172(delete)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2083(remove_unused_levels)\n", - " 68 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6312(_index_as_unique)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:166(is_finalvar)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:214(get_compressed_ids)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:560(_validate_scalar)\n", - " 52 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:992(is_numeric_v_string_like)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:480(_get_ndims)\n", - " 197 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/__init__.py:55(using_pyarrow_string_dtype)\n", - " 59 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:122(_reset_cache)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1025(argsort)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:479(__enter__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:5486(isin)\n", - " 87 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1774(get_result_processor)\n", - " 112 0.000 0.000 0.000 0.000 {built-in method builtins.max}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:74(array)\n", - " 255 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2593(_convert_key)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:398(reduce)\n", - " 48 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:973(coerce_indexer_dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:1620(__init__)\n", - " 320 0.000 0.000 0.000 0.000 {built-in method numpy.asanyarray}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:720(size)\n", - " 430 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:196(blklocs)\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:43(_amin)\n", - " 76 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:111(is_annotated)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6480(all)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2285()\n", - " 184 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1763(np_can_hold_element)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:586(update_dtype)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:8084(_align_for_op)\n", - " 143 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2177(_grouping_func)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1216(_iset_split_block)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:287(get_dtypes)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/functools.py:35(update_wrapper)\n", - " 34 0.000 0.000 0.000 0.000 {method 'argsort' of 'numpy.ndarray' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1193(_engine)\n", - " 180 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:274(__exit__)\n", - " 54 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:2378(array_equal)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6831(infer_objects)\n", - " 39 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:1499(_maybe_null_out)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:8058(_should_reindex_frame_op)\n", - " 49 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:2473(get_args)\n", - " 333 0.000 0.000 0.000 0.000 {method '__exit__' of '_thread.RLock' objects}\n", - " 180 0.000 0.000 0.000 0.000 {method 'split' of 'str' objects}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2817(hasnans)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:198(__init__)\n", - " 50 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:688(_warn_if_deprecated)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:481()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1605(maybe_cast_to_integer_array)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:494(_clean_keys_and_objs)\n", - " 88 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/base.py:238(construct_from_string)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:176(sorted_labels)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:54(__gt__)\n", - " 64 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/missing.py:131(dispatch_fill_zeros)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2669(__init__)\n", - " 35 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2827(external_values)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:132(geterr)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1047(shape)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:325(get_new_columns)\n", - " 27 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:201(_simple_new)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2252()\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1051(_stop)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:10185(align)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2065(set_values)\n", - " 660 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:186(__iter__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:123(__init__)\n", - " 319 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:913(__init__)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1798()\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:974(_is_nested_tuple_indexer)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:156(_indexer_and_to_sort)\n", - " 52 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/astype.py:157(astype_array)\n", - " 234 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6685(_validate_indexer)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5651(identical)\n", - " 71 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_utils.py:76(lenient_issubclass)\n", - " 255 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:676(iat)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1392(np_find_common_type)\n", - " 39 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:253(_get_values)\n", - " 84 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1266(_is_dunder)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:647()\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:597()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1728(duplicated)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/methods/to_dict.py:171()\n", - " 88 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:648(_colnames_from_description)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2353(copy)\n", - " 15 0.000 0.000 0.000 0.000 {method '__reduce_ex__' of 'object' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1922(rename)\n", - " 353 0.000 0.000 0.000 0.000 {method 'values' of 'dict' objects}\n", - " 105 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:72(check)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1439(_indexed_same)\n", - " 75 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:4036()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:1547(check_below_min_count)\n", - " 87 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/sql/type_api.py:908(_cached_result_processor)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/_optional.py:85(import_optional_dependency)\n", - " 35 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:243(_keep_alive)\n", - " 51 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:745(_get_engine_target)\n", - " 31 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7723(_unpack_nested_dtype)\n", - " 39 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:194(_is_internal_frame)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:81(atleast_2d)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:438(convert)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1809(set_names)\n", - " 39 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/numpy/function.py:413(validate_func)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12260(block_accum_func)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:430(_list_schema)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4436(_wrap_reindex_result)\n", - " 48 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:364(cancel)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2225(_handle_dbapi_exception)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1826(_check_label_or_level_ambiguity)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1441()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1966(_is_lexsorted)\n", - " 323 0.000 0.000 0.000 0.000 {method 'startswith' of 'str' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/__extensions__.py:93(equity)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:389(is_na)\n", - " 10 0.000 0.000 0.000 0.000 {built-in method _operator.eq}\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:322(_get_block_for_concat_plan)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:246(get_new_values)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:424(str_schema)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:978(__array__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:3255(connect)\n", - " 153 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/numpy/function.py:64(__call__)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:466(array_equivalent)\n", - " 613 0.000 0.000 0.000 0.000 {built-in method _warnings._filters_mutated}\n", - " 76 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1262(_slice)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:132(__init__)\n", - " 120 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:226(validate_bool_kwarg)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:1332(getfullargspec)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:10479(_align_frame)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2002(_lexsort_depth)\n", - " 298 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:1080(copyto)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1935(delete)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/common.py:103(_maybe_match_name)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:507(maybe_prepare_scalar_for_op)\n", - " 114 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2618()\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4440(_maybe_preserve_names)\n", - " 56 0.000 0.000 0.000 0.000 :405(parent)\n", - " 310 0.000 0.000 0.000 0.000 {method '__exit__' of '_thread.lock' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:1714(na_accum_func)\n", - " 151 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:62(is_list_like_indexer)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1692()\n", - " 15 0.000 0.000 0.000 0.000 {built-in method time.localtime}\n", - " 307 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:344()\n", - " 561 0.000 0.000 0.000 0.000 {built-in method builtins.id}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:378(new_index)\n", - " 114 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:259(_standardize_fill_value)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2107(droplevel)\n", - " 150 0.000 0.000 0.000 0.000 {method 'ravel' of 'numpy.ndarray' objects}\n", - " 15 0.000 0.000 0.000 0.000 {built-in method time.strftime}\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1327(__instancecheck__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:4037(_lexsort_depth)\n", - " 31 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3996(_check_indexing_method)\n", - " 103 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:161(iloc)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:11458(blk_func)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:354(validate_ascending)\n", - " 73 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:131()\n", - " 481 0.000 0.000 0.000 0.000 {method 'copy' of 'dict' objects}\n", - " 63 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:90(RLock)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:892(getfile)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:652(usesTime)\n", - " 2 0.000 0.000 0.000 0.000 {method 'fetch_fields' of '_mysql_connector.MySQL' objects}\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:883(_get_args_resolving_forward_refs)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2804(_isnan)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/version/__init__.py:339(__init__)\n", - " 441 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:363(ndim)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:363(_can_hold_element)\n", - " 217 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1081(codes)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/base.py:294(is_dtype)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/container.py:14(__init__)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:3689(equals)\n", - " 276 0.000 0.000 0.000 0.000 {method 'group' of 're.Match' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:429(__init__)\n", - " 18 0.000 0.000 0.000 0.000 {built-in method today}\n", - " 40 0.000 0.000 0.000 0.000 :121(__subclasscheck__)\n", - " 424 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6672(_maybe_cast_indexer)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6370(_find_common_type_compat)\n", - " 35 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:324(_get_dtype_max)\n", - " 234 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2043(freq)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:105(__init__)\n", - " 69 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:148(__getattr__)\n", - " 54 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:550(_is_master_process)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:527(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1418(_literal_schema)\n", - " 226 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1671(name)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:243(_from_values_or_dtype)\n", - " 319 0.000 0.000 0.000 0.000 {method 'items' of 'dict' objects}\n", - " 63 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:401(_config_wrapper)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:658(formatMessage)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:209(count_not_none)\n", - " 55 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:557(is_generic_alias)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:223(unique)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:776(reconstructed_codes)\n", - " 156 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:246(items)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/roperator.py:10(radd)\n", - " 176 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:696(ndim)\n", - " 13 0.000 0.000 0.000 0.000 :117(splitext)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:480()\n", - " 31 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/dataclasses.py:1258(is_dataclass)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2159(_drop_level_numbers)\n", - " 27 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:346(shape)\n", - " 195 0.000 0.000 0.000 0.000 {method 'insert' of 'list' objects}\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:564(_array_equivalent_object)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:141(assemble_bulk_data_request)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2586(get_values)\n", - " 63 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1181()\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:622(convert)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2955(__init__)\n", - " 46 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1453(current_thread)\n", - " 36 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/putmask.py:115(extract_bool_array)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:762(infer_dtype_from)\n", - " 13 0.000 0.000 0.000 0.000 :140(basename)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:545(is_dataclass)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1725(can_hold_element)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1111(_values)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:432(usesTime)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:687(compress_group_index)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:922(acquire)\n", - " 468 0.000 0.000 0.000 0.000 {method 'end' of 're.Match' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:202(union_indexes)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:813(str_schema)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:352(na_logical_op)\n", - " 68 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:158(_check_finalvar)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2410(wrap_default)\n", - " 116 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1249(shape)\n", - " 205 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:266(mgr_locs)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2692(max)\n", - " 33 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:283(_acquire_restore)\n", - " 167 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:974(dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:158()\n", - " 64 0.000 0.000 0.000 0.000 {method 'groupdict' of 're.Match' objects}\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:102()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:3280(raw_connection)\n", - " 54 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:505(parent_header)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3449(intersection)\n", - " 123 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:115(get_ref)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3035(unique)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4585(_is_view)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1377(__init__)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:447(format)\n", - " 75 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:292(isclass)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:441(connect)\n", - " 88 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/weakref.py:414(__getitem__)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2567(push)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1602(__subclasscheck__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:523(cython_operation)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1512(_close_special)\n", - " 70 0.000 0.000 0.000 0.000 {built-in method _thread.allocate_lock}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:1148(take)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:177(__contains__)\n", - " 35 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:87(is_literal_type)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:157(core_config)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1255(_checkout)\n", - " 66 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1165(_check_deprecated_callable_usage)\n", - " 55 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:566(is_self_type)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:543(nanall)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:829(_maintain_shutdown_locks)\n", - " 64 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1571(_get_names)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1534(blk_func)\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:935(_expand_ellipsis)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/equity.py:307(price)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1384(_checkin)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/concat.py:52(concat_compat)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:251(handle_list_schema)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/astype.py:249(astype_is_view)\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6137(_align_for_op)\n", - " 3 0.000 0.000 0.000 0.000 :150(dirname)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:781(_call_soon)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1695(__hash__)\n", - " 114 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:470(__getattr__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:457(isin)\n", - " 51 0.000 0.000 0.000 0.000 {method 'put' of '_queue.SimpleQueue' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1454()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1578(_wrap_aggregated_output)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1192(is_alive)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:310(_cython_op_ndim_compat)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1087(_slice)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1667(_validate_integer)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:268(decons_obs_group_ids)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:3345(arguments_parameter)\n", - " 3 0.000 0.000 0.000 0.000 {built-in method posix.cpu_count}\n", - " 40 0.000 0.000 0.000 0.000 {built-in method _abc._abc_subclasscheck}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:917(_finalize_fairy)\n", - " 8 0.000 0.000 0.000 0.000 {built-in method _operator.sub}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1689()\n", - " 132 0.000 0.000 0.000 0.000 {built-in method numpy.core._multiarray_umath.normalize_axis_index}\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Configuration.py:37(__setattr__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:3108(cumprod)\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_weakrefset.py:85(add)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:354(_call_cython_op)\n", - " 188 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:153(concatenate)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5818(head)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:230(_can_hold_na)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/errors.py:222(get_mysql_exception)\n", - " 4 0.000 0.000 0.000 0.000 {built-in method _operator.mul}\n", - " 39 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:209(_maybe_get_mask)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1657(_get_level_number)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:448(size)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:440(_format)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:707(checkout)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:159()\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:2364(with_default_schema)\n", - " 16/3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:99(all_literal_values)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:246(_decons_group_index)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:410(fill_bool)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:480(is_view)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/roperator.py:14(rsub)\n", - " 56 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1030(axes)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:215(_vhstack_dispatcher)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:946(_sorted_ids)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:106(_get_distinct_objs)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1284(find_result_type)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_asarray.py:108()\n", - " 39 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6277()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:808(__init__)\n", - " 39 0.000 0.000 0.000 0.000 :52(normcase)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:183(_make_sorted_values)\n", - " 168 0.000 0.000 0.000 0.000 {method 'upper' of 'str' objects}\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:675(empty)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:82(frame_apply)\n", - " 4 0.000 0.000 0.000 0.000 {built-in method _operator.truediv}\n", - " 21 0.000 0.000 0.000 0.000 {method 'fill' of 'numpy.ndarray' objects}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:571(_disallow_mismatched_indexing)\n", - " 33 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:286(_is_owned)\n", - " 5 0.000 0.000 0.000 0.000 {built-in method _warnings.warn}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:567(free_result)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:369(__init__)\n", - " 47 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:241(is_single_block)\n", - " 214 0.000 0.000 0.000 0.000 {function FrozenList.__getitem__ at 0x11a7ee7a0}\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2794(_na_value)\n", - " 38 0.000 0.000 0.000 0.000 {built-in method numpy.seterrobj}\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:2472(union_schema)\n", - " 1 0.000 0.000 0.000 0.000 {method '__exit__' of '_io._IOBase' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1570(_maybe_box_and_unbox_datetimelike)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:470()\n", - " 73 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:126(_classes_and_not_datetimelike)\n", - " 280 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:182(_deepcopy_atomic)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:688(_sanitize_non_ordered)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:879(infer_dtype_from_array)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5134(array)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/utils/filters.py:8(filter_inputs)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:929(release)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:404(is_dataclass)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:398(validate_inclusive)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2095(create_block_manager_from_blocks)\n", - " 134 0.000 0.000 0.000 0.000 {method 'add' of 'set' objects}\n", - " 31 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:865(_references)\n", - " 39 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:311(is_null_slice)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:72()\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1765(_get_names)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:324(slice_block_columns)\n", - " 63 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2772()\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:1084(_convert_grouper)\n", - " 66 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1455()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:940(date_schema)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Configuration.py:29(__getattr__)\n", - " 4 0.000 0.000 0.000 0.000 {method 'free_result' of '_mysql_connector.MySQL' objects}\n", - " 63 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:981()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:127(__init__)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:1038(handle_unread_result)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:182(_make_key_to_index)\n", - " 6 0.000 0.000 0.000 0.000 :674(__getitem__)\n", - " 69 0.000 0.000 0.000 0.000 {method 'item' of 'numpy.ndarray' objects}\n", - " 2 0.000 0.000 0.000 0.000 {method 'cumprod' of 'numpy.ndarray' objects}\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:464(get_array_op)\n", - " 15 0.000 0.000 0.000 0.000 {built-in method numpy.arange}\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:83(is_callable_type)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:831(construct_from_string)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/exc.py:604(instance)\n", - " 78 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2752(need_slice)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/weakref.py:427(__setitem__)\n", - " 13 0.000 0.000 0.000 0.000 :121(_splitext)\n", - " 116 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:805(_maybe_copy)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:457(__neg__)\n", - " 48 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:47(__init__)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:157(_int64_cut_off)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:208(_maybe_unbox_datetimelike)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:950(_validate_or_indexify_columns)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:532(treat_as_nested)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2066(_get_level_values)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:121(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:761()\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:688(__call__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Configuration.py:18(initialize_configuration)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:546(ensure_key_mapped)\n", - " 3 0.000 0.000 0.000 0.000 :778(__contains__)\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1324(_make_invoke_excepthook)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1721()\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:533(_maybe_downcast)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2623(_infer_tz_from_endpoints)\n", - " 42 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:992(_validate_key_length)\n", - " 23 0.000 0.000 0.000 0.000 {method 'join' of 'str' objects}\n", - " 5 0.000 0.000 0.000 0.000 {built-in method _operator.and_}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:185()\n", - " 63 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:211(tail)\n", - " 153 0.000 0.000 0.000 0.000 {method 'pop' of 'dict' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:108()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:409(iscoroutinefunction)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:318()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:169(_get_cython_function)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:170(parent_frame_namespace)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_weakrefset.py:39(_remove)\n", - " 8 0.000 0.000 0.000 0.000 {method 'astype' of 'numpy.generic' objects}\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/typing_extensions.py:1132(is_typeddict)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:862(codes)\n", - " 33 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:280(_release_save)\n", - " 130 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5558(_append_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:751(checkin)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:1314(fetchall)\n", - " 128 0.000 0.000 0.000 0.000 {method 'toordinal' of 'datetime.date' objects}\n", - " 113 0.000 0.000 0.000 0.000 {method '__enter__' of '_thread.RLock' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:141(validate_kwargs)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/handlers.py:354(shouldRollover)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:2208(__init__)\n", - " 63 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2781()\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:332(array)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/events.py:35(__init__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:1054(construct_from_string)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:99(freq)\n", - " 132 0.000 0.000 0.000 0.000 {built-in method _operator.index}\n", - " 45 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:51(origin_is_union)\n", - " 4 0.000 0.000 0.000 0.000 {built-in method _operator.pow}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:935(_verify_integrity)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:543(_allrows)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:2426(nullable_schema)\n", - " 42 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2738(is_label_like)\n", - " 63 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1180()\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:1305(construct_from_string)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/plugin/_loader.py:21(get_plugins)\n", - " 39 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:206(_should_unflatten_callable_args)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:756(_shallow_copy)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/errors.py:46(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/impl.py:153(_do_get)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:540()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1768(_set_names)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:207(_arrays_for_stack_dispatcher)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:196(mgr_to_mgr)\n", - " 41 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1046(nlevels)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1974(get_slice)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2738(_check_indexing_error)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:174(not_none)\n", - " 130 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1764(_ravel_dispatcher)\n", - " 95 0.000 0.000 0.000 0.000 {method 'endswith' of 'str' objects}\n", - " 30 0.000 0.000 0.000 0.000 {method 'acquire' of '_thread.RLock' objects}\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:164()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:391(_has_code_flag)\n", - " 76 0.000 0.000 0.000 0.000 {built-in method numpy.geterrobj}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/ops.py:108(_get_same_shape_values)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:470(any_schema)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method _operator.inv}\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:471(__init__)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_known_annotated_metadata.py:121(expand_grouped_metadata)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:3002()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:451(_return_conn)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:373(is_sequence)\n", - " 56 0.000 0.000 0.000 0.000 {method 'rpartition' of 'str' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:136(ones)\n", - " 3 0.000 0.000 0.000 0.000 :71(join)\n", - " 2 0.000 0.000 0.000 0.000 {method 'any' of 'numpy.generic' objects}\n", - " 66 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:660(_constructor)\n", - " 76 0.000 0.000 0.000 0.000 {built-in method sys.getrefcount}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:2134(_fetchall_impl)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:306(is_named_tuple)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copyreg.py:104(__newobj__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:95(__init__)\n", - " 65 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1176(_maybe_disallow_fill)\n", - " 113 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1480(_clear_item_cache)\n", - " 42 0.000 0.000 0.000 0.000 {method 'rfind' of 'str' objects}\n", - " 63 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1725(__eq__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1731(__hash__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/impl.py:144(_do_return_conn)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:1191(_get_splitter)\n", - " 19 0.000 0.000 0.000 0.000 :41(_get_sep)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:291(arrays)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/ops.py:96(_reset_block_mgr_locs)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:915(__array__)\n", - " 63 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:398(__get_result)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/queue.py:174(get)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/astype.py:56(_astype_nansafe)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_common.py:27(_init_wait_gen)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:638(__array__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:742(_get_axes)\n", - " 90 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:217(_scalar_type)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:1130(fetchall)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:594(_bool_arith_check)\n", - " 67 0.000 0.000 0.000 0.000 {method '__enter__' of '_thread.lock' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:939(_sort_idx)\n", - " 47 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:265(_engine_type)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:677(_constructor_expanddim)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/calendar.py:122(monthrange)\n", - " 68 0.000 0.000 0.000 0.000 {built-in method posix.getpid}\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:553(equals)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:815(filter)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:170()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2209(_safe_close_cursor)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/queue.py:132(put)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:886()\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:839()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/inspection.py:113(inspect)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4518(_check_inplace_and_allows_duplicate_labels)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:644(get_group_index_sorter)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/decorators.py:9(decorator)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:410(_is_comparable_dtype)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:405(_check_values_indices_shape_match)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:773(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/exc.py:692(__init__)\n", - " 66 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5364(_insert_dispatcher)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:845(unread_result)\n", - " 82 0.000 0.000 0.000 0.000 {built-in method _thread.get_ident}\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1992(_validate_index_level)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:2228(construct_from_string)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:643(name)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:167(get_annotations)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:123(getLevelName)\n", - " 63 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:213()\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1734(isEnabledFor)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1061()\n", - " 11 0.000 0.000 0.000 0.000 {method '_acquire_restore' of '_thread.RLock' objects}\n", - " 42 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1665()\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:288()\n", - " 3 0.000 0.000 0.000 0.000 :773(getenv)\n", - " 70 0.000 0.000 0.000 0.000 {method 'discard' of 'set' objects}\n", - " 63 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:941()\n", - " 27 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1122()\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6270()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:598(collect_definitions)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5676()\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2294()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1933(to_numpy)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:984()\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/from_thread.py:170(_check_running)\n", - " 5 0.000 0.000 0.000 0.000 {built-in method _operator.invert}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:645()\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:446(__exit__)\n", - " 66 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1389(_moveaxis_dispatcher)\n", - " 54 0.000 0.000 0.000 0.000 {method 'write' of '_io.StringIO' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:516(close)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/base.py:2411(_quote_free_identifiers)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:587()\n", - " 36 0.000 0.000 0.000 0.000 {built-in method time.time}\n", - " 67 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:892(bincount)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:884(keys)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1463()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/getlimits.py:685(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:639(group_keys_seq)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:572(is_required)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/pivot.py:493(_convert_by)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:5565(_reindex_output)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:514(_collect_metadata)\n", - " 26 0.000 0.000 0.000 0.000 {method 'update' of 'dict' objects}\n", - " 31 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1206(daemon)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1881(nonzero)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:215(extract_numeric_value)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:342(construct_from_string)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:479(__repr__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:231(_fix)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:1835(construct_from_string)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/putmask.py:29(putmask_inplace)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1671(is_all_strings)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:106(keys)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/weakref.py:369(remove)\n", - " 62 0.000 0.000 0.000 0.000 {method 'append' of 'collections.deque' objects}\n", - " 46 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:575(is_set)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:171()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/base.py:2414()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7704(get_unanimous_names)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_sync.py:10(_call_handlers)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:373(inner)\n", - " 3 0.000 0.000 0.000 0.000 :771(get)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:426(__init__)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:368(getMessage)\n", - " 71 0.000 0.000 0.000 0.000 {built-in method posix.fspath}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:3176(ndim)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:230(_handle_eof)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/sql/schema.py:5357(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/version/__init__.py:520(_cmpkey)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2512(cumsum)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/string_.py:140(construct_from_string)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/functools.py:65(wraps)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:131(is_new_type)\n", - " 50 0.000 0.000 0.000 0.000 {method 'release' of '_thread.lock' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:735(unwrap)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_schema_generation_shared.py:72(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:1532(_soft_close)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:202(_maybe_reindex_columns_na_proxy)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1695()\n", - " 54 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:2374(_array_equal_dispatcher)\n", - " 6 0.000 0.000 0.000 0.000 :756(encode)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:137(__new__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:822(reset)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/calendar.py:115(weekday)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:378(isfunction)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/base.py:445(__get__)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:206(get_module_ns_of)\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:440(__init__)\n", - " 6 0.000 0.000 0.000 0.000 {built-in method now}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:219(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:891(_get_first_arg_or_any)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:541(to_numpy)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7652(ensure_has_len)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:305(_connection_insp)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:191(identify_interval)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method _operator.gt}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1730()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/equity.py:65(fundamental)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/importlib/__init__.py:108(import_module)\n", - " 12 0.000 0.000 0.000 0.000 {built-in method builtins.min}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:388()\n", - " 41 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:1073(clean_reindex_fill_method)\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:686()\n", - " 16 0.000 0.000 0.000 0.000 {method 'find' of 'str' objects}\n", - " 54 0.000 0.000 0.000 0.000 {method 'get' of '_contextvars.ContextVar' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:436(_split)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:138(_event_pipe)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/sql/compiler.py:7475(quote_identifier)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:665(_get_registered_option)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:244()\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:209(is_object)\n", - " 16 0.000 0.000 0.000 0.000 {built-in method builtins.iter}\n", - " 42 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:178()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1096(_can_fast_transpose)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:354(__array__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:497(_extract_metadata)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:91(is_deprecated_instance)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2155()\n", - " 66 0.000 0.000 0.000 0.000 {method 'weekday' of 'datetime.date' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:3386(arguments_schema)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:136(_codes_to_ints)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:641(fill_missing_names)\n", - " 6 0.000 0.000 0.000 0.000 :1()\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:300(ismethod)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:363(_repeater)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1472()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/generic.py:2015(_wrap_agged_manager)\n", - " 6 0.000 0.000 0.000 0.000 {built-in method fromkeys}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:271(validate_fillna_kwargs)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/shape_base.py:1185(tile)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:692(_constructor)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:764(categories)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:221()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:3445(call_schema)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:228(_construct)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:93(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/exc.py:477(__init__)\n", - " 28 0.000 0.000 0.000 0.000 {built-in method time.monotonic}\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6055(_check_indexing_error)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Context.py:124(clear_context)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:403()\n", - " 19 0.000 0.000 0.000 0.000 {built-in method sys._getframe}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:791(_autobegin)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:948()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:1206(literal_schema)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:531(validate_ordered)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2577(is_view)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:136(reset)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1357(__getattr__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3766(_convert_can_do_setop)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:397(ensure_np_dtype)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:983(is_in_axis)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1980(shape)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:751()\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1152(name)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/base.py:183(_for_instance)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:1248(python_charset)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:837(result_set_available)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2730(annotation)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1479()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:5607()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1686(name)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:584()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:1129(__init__)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1340()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3200(_get_reconciled_name_object)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:1465(list_schema)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:795(begin)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:949()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:680()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:696(names)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:1095(__new__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:423(repeat)\n", - " 1 0.000 0.000 0.000 0.000 :1192(_gcd_import)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:947()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1269(set_inplace)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1959(maybe_mangle_lambdas)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:4039()\n", - " 14 0.000 0.000 0.000 0.000 {method 'difference_update' of 'set' objects}\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:283(ismodule)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:849(_list_to_arrays)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:198()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:435()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:692(levels)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2734(kind)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:219(mask_all)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:1745(currentframe)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:592(groupings)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1445()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/numpy/function.py:223(validate_cum_func_with_skipna)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:502(enter_context)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1062(levshape)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/langhelpers.py:1138(__get__)\n", - " 42 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:290(_add_custom_serialization_from_json_encoders)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:937()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1342(is_complex_dtype)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:811(_newname)\n", - " 30 0.000 0.000 0.000 0.000 {method 'release' of '_thread.RLock' objects}\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:303()\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:195()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:128(_check_for_invalid_keys)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:172()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/base.py:180(_for_class)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4306(_validate_can_reindex)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1524(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1069(_is_homogeneous_type)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:26(lookback)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:49(_check_for_default_values)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/base.py:187(_join)\n", - " 11 0.000 0.000 0.000 0.000 {method '_release_save' of '_thread.RLock' objects}\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/command_runner.py:470(user_settings)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:916()\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:693(_get_result_dim)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1331(dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:166()\n", - " 1 0.000 0.000 0.000 0.000 {method 'cumsum' of 'numpy.ndarray' objects}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2220(_can_hold_na)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:638(_passed_categorical)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:205(_effective_processors)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/multiprocessing/process.py:37(current_process)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:172()\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1721()\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:466(isframe)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:204()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2678(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1619(executemany)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:405(_types_namespace)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:234(_disallow_mismatched_datetimelike)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:3750(definitions_schema)\n", - " 13 0.000 0.000 0.000 0.000 {method 'write' of '_io.TextIOWrapper' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:672(_is_view_after_cow_rules)\n", - " 22 0.000 0.000 0.000 0.000 {method '__contains__' of 'frozenset' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1201()\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:886(inner)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:389(standardize_mapping)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:619(categories)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:578(__init__)\n", - " 22 0.000 0.000 0.000 0.000 {method 'capitalize' of 'str' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/_concurrency_py3k.py:61(is_exit_exception)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:282(query_attrs)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:265(_find_common_index_dtype)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2726(default)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/multiprocessing/process.py:189(name)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/mysqlconnector.py:53(_escape_identifier)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2722(name)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1903()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:383(is_closed)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:95(literal_values)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:191(_server_status)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:574(is_zoneinfo_type)\n", - " 14 0.000 0.000 0.000 0.000 {method 'remove' of 'collections.deque' objects}\n", - " 8 0.000 0.000 0.000 0.000 {method 'encode' of 'str' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/base.py:137(__init__)\n", - " 22 0.000 0.000 0.000 0.000 {method 'isidentifier' of 'str' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1398(_reset)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:456(istraceback)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:841(fetchall)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:480(iscode)\n", - " 1 0.000 0.000 0.000 0.000 :309(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:187(_get_fill_value)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:314()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:369(should_store)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/version/__init__.py:348()\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:999(is_in_obj)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:922(_maybe_infer_dtype_type)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5649(_needs_reindex_multi)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1246(enforce_interval)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1643(reconstruct_func)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/helpers/utils.py:10(verify_ticker)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5486()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:746()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/utils.py:28(eod)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:691(__del__)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:1080(_is_label_like)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2700(_connection_begin_impl)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/base.py:115(__eq__)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:167()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:518(_check_closed)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:788()\n", - " 3 0.000 0.000 0.000 0.000 {built-in method math.floor}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:966(_selected_obj)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/utils.py:189(check_single_item)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:534(_push_cm_exit)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:180()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/methods/to_dict.py:155()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:1454(__init__)\n", - " 49 0.000 0.000 0.000 0.000 {method 'locked' of '_thread.lock' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7717()\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:655(_constructor)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2516(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1076()\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1021(_argsort_dispatcher)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1394(__hash__)\n", - " 25 0.000 0.000 0.000 0.000 {built-in method builtins.abs}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:520(convert_to_list_like)\n", - " 1 0.000 0.000 0.000 0.000 {method 'fetch_row' of '_mysql_connector.MySQL' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/pivot.py:173()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/database/SQLHelpers.py:46(get_engine)\n", - " 1 0.000 0.000 0.000 0.000 :1165(_find_and_load)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/errors/__init__.py:535(_check_cacher)\n", - " 3 0.000 0.000 0.000 0.000 {method 'items' of 'mappingproxy' objects}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_common.py:17(_maybe_call)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:278(prepare_config)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:249(_get_output_shape)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:1009(__getitem__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:366(notify)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:168()\n", - " 7 0.000 0.000 0.000 0.000 {method 'index' of 'list' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/exc.py:48(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:657()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/log.py:101(_should_log_debug)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2974(_prod_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/langhelpers.py:1224(_set_memoized_attribute)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1793()\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:222()\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1474()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/replace.py:31(should_use_regex)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:212()\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1828(ndim)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager.py:352()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7719()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:483(_view)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:351(__init__)\n", - " 6 0.000 0.000 0.000 0.000 {built-in method _contextvars.copy_context}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/attr.py:389(__bool__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1091(_begin_impl)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:632(ordered)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:553(nblocks)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2474(validate_periods)\n", - " 5 0.000 0.000 0.000 0.000 {method 'replace' of 'str' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/queue.py:231(_get)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:229(__iter__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/Requests.py:172(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:139()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:223(__len__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5495()\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:77(_atleast_2d_dispatcher)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:205()\n", - " 3 0.000 0.000 0.000 0.000 {method 'send' of 'generator' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:336(_na_ok_dtype)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/getlimits.py:709(max)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/env.py:47(DEBUG_MODE)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:819(get_connection)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1329(result_index)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:829(warning_count)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:376(dtype)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/getlimits.py:696(min)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1271(determine_table_agg)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:330(_sanitize_and_check)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1872(build_name_format)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:633(is_builtin_func)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:238(is_int64_overflow_possible)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:183(maybe_box_native)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1847()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:532(_still_open_and_dbapi_connection_is_valid)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:2139(_codes)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/constants.py:993(get_info)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1658(no_parameters)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/queue.py:225(_full)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:520(can_consume_results)\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:443(__enter__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:194(_handle_warnings)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/utils.py:121(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:301(pm)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:381()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:698()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:252(_init_connection)\n", - " 1 0.000 0.000 0.000 0.000 {method 'repeat' of 'numpy.ndarray' objects}\n", - " 3 0.000 0.000 0.000 0.000 {method 'total_seconds' of 'datetime.timedelta' objects}\n", - " 13 0.000 0.000 0.000 0.000 {method '_is_owned' of '_thread.RLock' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:421(lexsort)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/mysqlconnector.py:145(is_disconnect)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:585(_ensure_2d)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/methods/to_dict.py:160()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/constants.py:320(raise_warning_against_deprecated_cursor_class)\n", - " 7 0.000 0.000 0.000 0.000 {method 'count' of 'list' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:305(loc)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2416(_all_dispatcher)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:494(dtype)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4367(igetitem)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:856(columns)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:722(_result_index)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:196()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:518(__repr__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1487(__getattr__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/concat.py:73()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:56(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:139(ticker)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:277()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:694()\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:709(inferred_type)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:320(__len__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:398()\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2070()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1128(value_getitem)\n", - " 3 0.000 0.000 0.000 0.000 {method 'rstrip' of 'str' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:333(tail)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:208(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/log.py:104(_should_log_info)\n", - " 1 0.000 0.000 0.000 0.000 {method 'put' of 'numpy.ndarray' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3760(_assert_can_do_setop)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:270(mgr_locs)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:217()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:441(maybe_cast_pointwise_result)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1720(_value_and_type_iter)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/command_runner.py:465(system_settings)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:472(__init__)\n", - " 1 0.000 0.000 0.000 0.000 {method 'searchsorted' of 'numpy.ndarray' objects}\n", - " 1 0.000 0.000 0.000 0.000 {method 'issuperset' of 'frozenset' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2583(__init__)\n", - " 3 0.000 0.000 0.000 0.000 {method 'tolist' of 'numpy.ndarray' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:717(index)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:850(more_results)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_wait_gen.py:7(expo)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/_optional.py:74(get_version)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method sys.exc_info}\n", - " 5 0.000 0.000 0.000 0.000 {method 'lstrip' of 'str' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:92()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:1954(get_debug)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/_collections.py:147(__new__)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:669(result_type)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/version/__init__.py:470(_parse_letter_version)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:101(is_holiday)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:303()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:93()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2564(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:318(merge_incomplete_data_in_cache)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/abstract/error.py:9(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:309(_operation_context)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:330(__init__)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/database/SQLHelpers.py:336(__init__)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:661(_ilevel)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/functools.py:421(_unwrap_partial)\n", - " 1 0.000 0.000 0.000 0.000 :1101(_sanity_check)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1094()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5168(_delete_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1287(determine_requested_columns)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1979(nlevels)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:141(is_re)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1225(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_common.py:28()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/base.py:346(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:88()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2688(_deactivate_from_connection)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:125(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:3015(parameters)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:178(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/version/__init__.py:149(__lt__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:232(get_underlier_data)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:539(_push_exit_callback)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:146(dtype)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_validate_call.py:51()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:1131(putmask)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7718()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/abstract/singleton.py:14(__call__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:687(is_closed)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:770(_maybe_check_integrity)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/queue.py:222(_empty)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/queue.py:228(_put)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1038(in_transaction)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:439(_ensure_has_table_connection)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/util/numba_.py:18(maybe_use_numba)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/version/__init__.py:534()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/decorators.py:8(log_time)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1877(_nonzero_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 :315(__subclasshook__)\n", - " 2 0.000 0.000 0.000 0.000 {method 'setdefault' of 'dict' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:218()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:1221(_charset_id)\n", - " 1 0.000 0.000 0.000 0.000 {method 'values' of 'mappingproxy' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:512(_validate_axis)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method _weakref.proxy}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/container.py:59(_get_provider)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:1110(get_warnings)\n", - " 3 0.000 0.000 0.000 0.000 {built-in method sys.getrecursionlimit}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:260(__init__)\n", - " 3 0.000 0.000 0.000 0.000 {method 'reverse' of 'list' objects}\n", - " 1 0.000 0.000 0.000 0.000 :260(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:460(tolist)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2687(_max_dispatcher)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:280(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:540(closed)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:7045(_deprecate_downcast)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/env.py:62(str2bool)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:467()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:315(step)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:450(check_dtype_backend)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/shape_base.py:1257()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:462(_create_exit_wrapper)\n", - " 2 0.000 0.000 0.000 0.000 {method 'date' of 'datetime.datetime' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:105(_box_func)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:351()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:4948(_needs_reindex_multi)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1818(handle_extra_cols)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:567(connection)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:510()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:231(_constructor)\n", - " 1 0.000 0.000 0.000 0.000 {method 'warning_count' of '_mysql_connector.MySQL' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:155(_check_executed)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/version/__init__.py:508(_parse_local_version)\n", - " 2 0.000 0.000 0.000 0.000 {method 'st_server_status' of '_mysql_connector.MySQL' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1445(is_valid)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:94(_process_parse_dates_argument)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:1065(soft_close)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3984(_should_partial_index)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1567(_maybe_transpose_result)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1263(enforce_inputs)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:643(__enter__)\n", - " 2 0.000 0.000 0.000 0.000 {method 'connected' of '_mysql_connector.MySQL' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/errors.py:80(__str__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:504(description)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/tz/tz.py:74(utcoffset)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:346(where)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:280(start)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:3104(_cumprod_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3211(_validate_sort_keyword)\n", - " 2 0.000 0.000 0.000 0.000 {method 'with_traceback' of 'BaseException' objects}\n", - " 1 0.000 0.000 0.000 0.000 {method 'consume_result' of '_mysql_connector.MySQL' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1355(common_dtype_categorical_compat)\n", - " 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:551()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/mysqlconnector.py:142(_extract_error_code)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:3172(_ndim_dispatcher)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_exceptions.py:15(rewrite_exception)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/shape_base.py:1181(_tile_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1989(index)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2508(_cumsum_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 {method 'more_results' of '_mysql_connector.MySQL' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1763(pre_exec)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:546(invalidated)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1986(_sort_levels_monotonic)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:2486(reset)\n", - " 1 0.000 0.000 0.000 0.000 {method 'popleft' of 'collections.deque' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/sql/elements.py:5219(construct)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1976(_shape_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:216(_validate_dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1803(handle_dbapi_exception)\n", - " 2 0.000 0.000 0.000 0.000 {method 'st_warning_count' of '_mysql_connector.MySQL' objects}\n", - " 1 0.000 0.000 0.000 0.000 {method 'pop' of 'set' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:419(_repeat_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 {method 'pop' of 'collections.deque' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:3019(return_annotation)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method builtins.globals}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1771(post_exec)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:231(__enter__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:1448(__enter__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:695(do_begin)\n", - "\n", - "\n", - "\n" - ] - } - ], - "source": [ - "## RiskManager.get_order\n", - "print(returned_order[1])" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " 2204928 function calls (2198640 primitive calls) in 13.196 seconds\n", - "\n", - " Ordered by: cumulative time\n", - "\n", - " ncalls tottime percall cumtime percall filename:lineno(function)\n", - " 2/1 0.005 0.002 13.196 13.196 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/decorators.py:40(wrapper)\n", - " 1 0.002 0.002 13.191 13.191 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:39(get_order)\n", - " 393 7.934 0.020 7.934 0.020 {method 'acquire' of '_thread.lock' objects}\n", - " 1 0.000 0.000 7.241 7.241 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:780(produce_order_candidates)\n", - " 2 0.001 0.000 7.241 3.620 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:644(chain_details)\n", - " 3/2 0.005 0.002 5.631 2.815 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_sync.py:85(retry)\n", - " 1 0.000 0.000 5.587 5.587 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:563(populate_cache)\n", - " 1 0.001 0.001 5.587 5.587 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:424(populate_cache_v2)\n", - " 2 0.001 0.000 5.118 2.559 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:381(spot)\n", - " 2 0.001 0.000 5.082 2.541 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:142(retrieve_timeseries)\n", - " 1 0.001 0.001 4.775 4.775 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:227(update_cache_with_missing_ticks)\n", - " 4 0.000 0.000 4.590 1.147 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/threads.py:4(runThreads)\n", - " 30 0.000 0.000 4.459 0.149 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1087(join)\n", - " 33 0.000 0.000 4.458 0.135 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1125(_wait_for_tstate_lock)\n", - " 4 0.000 0.000 4.457 1.114 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:646(__exit__)\n", - " 4 0.000 0.000 4.457 1.114 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:216(shutdown)\n", - " 90 0.001 0.000 3.478 0.039 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:295(wait)\n", - " 3 0.000 0.000 3.373 1.124 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/utils/decorators.py:47(wrapper)\n", - " 3 0.000 0.000 3.373 1.124 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/utils/decorators.py:35(wrapper)\n", - " 3 0.000 0.000 3.361 1.120 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/validate_call_decorator.py:58(wrapper_function)\n", - " 3 0.000 0.000 3.361 1.120 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_validate_call.py:95(__call__)\n", - " 3 0.000 0.000 3.361 1.120 {method 'validate_python' of 'pydantic_core._pydantic_core.SchemaValidator' objects}\n", - " 3 0.000 0.000 3.361 1.120 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/container.py:23(_run)\n", - " 3 0.000 0.000 3.361 1.120 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/command_runner.py:503(sync_run)\n", - " 3 0.000 0.000 3.361 1.120 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/provider/utils/helpers.py:581(run_async)\n", - " 91 0.000 0.000 3.357 0.037 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:428(result)\n", - " 9 0.000 0.000 3.357 0.373 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/from_thread.py:275(call)\n", - " 2 0.000 0.000 2.850 1.425 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/equity_price.py:28(historical)\n", - " 8 0.000 0.000 2.322 0.290 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:4789(apply)\n", - " 8 0.000 0.000 2.321 0.290 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1409(apply)\n", - " 8 0.000 0.000 2.321 0.290 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1482(apply_standard)\n", - " 9 0.000 0.000 2.309 0.257 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:891(_map_values)\n", - " 9 0.021 0.002 2.308 0.256 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:1667(map_array)\n", - " 3 0.000 0.000 2.199 0.733 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/obbject.py:85(to_df)\n", - " 3 0.000 0.000 2.199 0.733 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/obbject.py:125(to_dataframe)\n", - " 3 0.001 0.000 2.161 0.720 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/utils.py:20(basemodel_to_df)\n", - " 11580 0.122 0.000 2.118 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:673(to_datetime)\n", - " 11546 0.100 0.000 1.561 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:314(_convert_listlike_datetimes)\n", - " 1 0.000 0.000 1.469 1.469 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:464(option_chain)\n", - " 1 0.000 0.000 1.447 1.447 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:134(list_contracts)\n", - " 1 0.000 0.000 1.439 1.439 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/api.py:62(get)\n", - " 1 0.000 0.000 1.439 1.439 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/api.py:14(request)\n", - " 1 0.000 0.000 1.439 1.439 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:500(request)\n", - " 1 0.000 0.000 1.436 1.436 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:673(send)\n", - " 9 0.000 0.000 1.432 0.159 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:704(readinto)\n", - " 9 1.432 0.159 1.432 0.159 {method 'recv_into' of '_socket.socket' objects}\n", - " 1 0.000 0.000 1.426 1.426 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:613(send)\n", - " 1 0.000 0.000 1.425 1.425 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:594(urlopen)\n", - " 1 0.000 0.000 1.424 1.424 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:379(_make_request)\n", - " 1 0.000 0.000 1.424 1.424 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:481(getresponse)\n", - " 1 0.000 0.000 1.423 1.423 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1351(getresponse)\n", - " 1 0.000 0.000 1.423 1.423 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:318(begin)\n", - " 1 0.000 0.000 1.422 1.422 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:285(_read_status)\n", - " 11 0.000 0.000 1.422 0.129 {method 'readline' of '_io.BufferedReader' objects}\n", - " 11490 0.058 0.000 1.016 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:320(__new__)\n", - " 11447 0.032 0.000 0.991 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:259(_box_as_indexlike)\n", - " 1 0.000 0.000 0.898 0.898 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:310(div_yield)\n", - " 1 0.000 0.000 0.893 0.893 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:324(div_yield_history)\n", - " 11554 0.111 0.000 0.818 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:329(_from_sequence_not_strict)\n", - " 2 0.000 0.000 0.566 0.283 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/decorators.py:24(wrapper)\n", - " 1 0.000 0.000 0.562 0.562 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1377(init_query)\n", - " 1 0.000 0.000 0.561 0.561 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/database/SQLHelpers.py:343(query_database)\n", - " 1 0.000 0.000 0.561 0.561 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/database/SQLHelpers.py:100(query_database)\n", - " 1 0.000 0.000 0.561 0.561 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:570(read_sql)\n", - " 1 0.000 0.000 0.511 0.511 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/equity_fundamental.py:938(dividends)\n", - " 2 0.000 0.000 0.450 0.225 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1713(exec_driver_sql)\n", - " 2 0.000 0.000 0.450 0.225 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1791(_execute_context)\n", - " 11554 0.115 0.000 0.424 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2184(_sequence_to_dt64)\n", - "575903/575499 0.208 0.000 0.419 0.000 {built-in method builtins.isinstance}\n", - " 23058 0.074 0.000 0.406 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2428(maybe_convert_dtype)\n", - " 1 0.000 0.000 0.351 0.351 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:1779(read_query)\n", - " 2 0.000 0.000 0.320 0.160 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1850(_exec_single_context)\n", - " 2 0.000 0.000 0.317 0.159 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:940(do_execute)\n", - " 2 0.000 0.000 0.317 0.159 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:311(execute)\n", - " 2 0.000 0.000 0.316 0.158 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/opentelemetry/context_propagation.py:93(wrapper)\n", - " 2 0.000 0.000 0.316 0.158 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:690(cmd_query)\n", - " 2 0.316 0.158 0.316 0.158 {method 'query' of '_mysql_connector.MySQL' objects}\n", - " 1 0.000 0.000 0.312 0.312 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:1655(execute)\n", - " 12108 0.030 0.000 0.253 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5373(__getitem__)\n", - " 300 0.006 0.000 0.249 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4062(__getitem__)\n", - " 11600 0.030 0.000 0.220 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:373(__getitem__)\n", - " 23092 0.058 0.000 0.192 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1163(is_float_dtype)\n", - " 11602 0.029 0.000 0.187 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:278(__getitem__)\n", - " 11555 0.044 0.000 0.182 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2425(ensure_arraylike_for_datetimelike)\n", - " 19 0.001 0.000 0.167 0.009 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:130()\n", - " 19 0.007 0.000 0.166 0.009 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:835(liquidity_check)\n", - " 38 0.002 0.000 0.164 0.004 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/utils.py:26(default_timestamp)\n", - " 117 0.002 0.000 0.156 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4130(_getitem_bool_array)\n", - " 11508 0.083 0.000 0.155 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:545(_box_func)\n", - " 98250 0.064 0.000 0.144 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/generic.py:42(_instancecheck)\n", - " 11489 0.133 0.000 0.143 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2354(objects_to_datetime64)\n", - " 1 0.000 0.000 0.138 0.138 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:2037(has_table)\n", - " 1 0.000 0.000 0.138 0.138 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:400(has_table)\n", - " 1 0.000 0.000 0.138 0.138 :1(has_table)\n", - " 1 0.000 0.000 0.138 0.138 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:78(cache)\n", - " 1 0.000 0.000 0.137 0.137 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/base.py:2732(has_table)\n", - " 23389 0.052 0.000 0.134 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1198(is_bool_dtype)\n", - " 4 0.000 0.000 0.131 0.033 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:583(map)\n", - " 4 0.000 0.000 0.130 0.033 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:608()\n", - " 76 0.001 0.000 0.130 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:161(submit)\n", - " 2 0.000 0.000 0.130 0.065 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1523(_init_statement)\n", - " 2 0.000 0.000 0.130 0.065 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1736(create_cursor)\n", - " 2 0.000 0.000 0.130 0.065 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1757(create_default_cursor)\n", - " 2 0.000 0.000 0.130 0.065 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1483(cursor)\n", - " 2 0.000 0.000 0.130 0.065 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:733(cursor)\n", - " 2 0.001 0.001 0.130 0.065 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:387(is_connected)\n", - " 2 0.128 0.064 0.128 0.064 {method 'ping' of '_mysql_connector.MySQL' objects}\n", - " 76 0.001 0.000 0.128 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:180(_adjust_thread_count)\n", - " 30 0.000 0.000 0.124 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:945(start)\n", - " 30 0.000 0.000 0.122 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:611(wait)\n", - " 34665 0.042 0.000 0.120 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1375(_is_dtype)\n", - " 19 0.001 0.000 0.118 0.006 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:140()\n", - " 19 0.002 0.000 0.117 0.006 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:740(available_close_check)\n", - " 66 0.001 0.000 0.117 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4142(_take_with_is_copy)\n", - " 67 0.002 0.000 0.106 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4027(take)\n", - " 72 0.002 0.000 0.103 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:869(take)\n", - " 31 0.001 0.000 0.095 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:694(__init__)\n", - " 152/109 0.001 0.000 0.094 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/common.py:62(new_method)\n", - " 12235 0.067 0.000 0.084 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:649(_simple_new)\n", - " 168/157 0.020 0.000 0.084 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:389(__init__)\n", - " 83 0.002 0.000 0.083 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:623(reindex_indexer)\n", - " 98250 0.062 0.000 0.080 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/generic.py:37(_check)\n", - " 11519 0.016 0.000 0.075 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:536(is_string_dtype)\n", - " 11503 0.043 0.000 0.075 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:126(_guess_datetime_format_for_array)\n", - " 96/74 0.002 0.000 0.074 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4271(__setitem__)\n", - " 1 0.000 0.000 0.072 0.072 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:1643(__exit__)\n", - " 1 0.000 0.000 0.072 0.072 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:607(close)\n", - " 1 0.000 0.000 0.072 0.072 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:558(__exit__)\n", - " 1 0.000 0.000 0.072 0.072 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:234(__exit__)\n", - " 1 0.000 0.000 0.072 0.072 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1218(close)\n", - " 1 0.000 0.000 0.072 0.072 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2576(close)\n", - " 1 0.000 0.000 0.072 0.072 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2725(_do_close)\n", - " 1 0.000 0.000 0.072 0.072 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2709(_close_impl)\n", - " 1 0.000 0.000 0.072 0.072 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2703(_connection_rollback_impl)\n", - " 1 0.000 0.000 0.072 0.072 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1113(_rollback_impl)\n", - " 1 0.000 0.000 0.072 0.072 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:698(do_rollback)\n", - " 1 0.000 0.000 0.072 0.072 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:578(rollback)\n", - " 1 0.072 0.072 0.072 0.072 {method 'rollback' of '_mysql_connector.MySQL' objects}\n", - " 93 0.001 0.000 0.071 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4514(_set_item)\n", - " 38 0.047 0.001 0.067 0.002 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/utils.py:32()\n", - " 23706 0.033 0.000 0.066 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1434(_is_dtype_type)\n", - " 574/566 0.005 0.000 0.064 0.000 {built-in method builtins.all}\n", - " 11752 0.062 0.000 0.062 0.000 {built-in method numpy.array}\n", - " 11929 0.021 0.000 0.061 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7688(maybe_extract_name)\n", - " 93 0.002 0.000 0.059 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4481(_set_item_mgr)\n", - " 23581 0.056 0.000 0.058 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:645(__iter__)\n", - " 759 0.010 0.000 0.056 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:517(sanitize_array)\n", - " 3 0.011 0.004 0.056 0.019 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/utils.py:30()\n", - " 11568 0.050 0.000 0.055 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:304(_simple_new)\n", - " 39 0.001 0.000 0.055 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6110(_cmp_method)\n", - " 92 0.001 0.000 0.055 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1176(__getitem__)\n", - " 58858 0.028 0.000 0.055 0.000 :117(__instancecheck__)\n", - " 59 0.001 0.000 0.054 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6201(_construct_result)\n", - " 1 0.000 0.000 0.053 0.053 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:619(pre_process_data)\n", - " 1 0.001 0.001 0.052 0.052 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:292(drop_cache_duplicates)\n", - " 262 0.008 0.000 0.052 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:475(__new__)\n", - " 87 0.004 0.000 0.051 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1347(insert)\n", - " 65 0.001 0.000 0.049 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:687()\n", - " 21 0.000 0.000 0.049 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:42(__ne__)\n", - " 47 0.001 0.000 0.049 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:209(_maybe_cache)\n", - " 58054 0.033 0.000 0.048 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1399(_get_dtype)\n", - " 317 0.003 0.000 0.048 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4626(_get_item_cache)\n", - " 10 0.001 0.000 0.048 0.005 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:837(change_to_last_busday)\n", - " 422 0.009 0.000 0.046 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1287(take_nd)\n", - " 89 0.000 0.000 0.046 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1719(_getitem_axis)\n", - " 11525 0.008 0.000 0.044 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/main.py:352(model_dump)\n", - " 79 0.001 0.000 0.044 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1756(_get_slice_axis)\n", - " 291 0.005 0.000 0.041 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:317(apply)\n", - " 292 0.002 0.000 0.041 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:3983(_ixs)\n", - " 11549 0.040 0.000 0.040 0.000 {method 'view' of 'numpy.generic' objects}\n", - " 532/527 0.004 0.000 0.039 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:59(take_nd)\n", - " 3 0.000 0.000 0.039 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1780(apply)\n", - " 1 0.000 0.000 0.038 0.038 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:194(_wrap_result)\n", - " 75 0.037 0.000 0.038 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1580(construct_1d_object_array_from_listlike)\n", - " 6 0.000 0.000 0.038 0.006 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:506(nested_data_to_arrays)\n", - " 6 0.000 0.000 0.037 0.006 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:793(to_arrays)\n", - " 432 0.002 0.000 0.036 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6284(__getattr__)\n", - " 11525 0.035 0.000 0.036 0.000 {method 'to_python' of 'pydantic_core._pydantic_core.SchemaSerializer' objects}\n", - "161550/161479 0.034 0.000 0.036 0.000 {built-in method builtins.getattr}\n", - " 12 0.001 0.000 0.036 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:423(dict_to_mgr)\n", - " 1 0.000 0.000 0.035 0.035 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:319(update_spot_cache)\n", - " 82 0.001 0.000 0.035 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6662(copy)\n", - " 523 0.011 0.000 0.034 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:120(_take_nd_ndarray)\n", - " 3 0.000 0.000 0.034 0.011 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1850(_python_apply_general)\n", - " 3 0.000 0.000 0.034 0.011 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/obbject.py:167(is_list_of_basemodel)\n", - " 78 0.009 0.000 0.033 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4361(_slice)\n", - " 26 0.001 0.000 0.033 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5993(set_index)\n", - " 11519 0.024 0.000 0.033 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:572(condition)\n", - " 11528 0.005 0.000 0.031 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/obbject.py:168()\n", - " 96 0.002 0.000 0.031 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:557(copy)\n", - " 3 0.000 0.000 0.031 0.010 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/generic.py:1558(_wrap_applied_output)\n", - " 47 0.004 0.000 0.031 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:149(should_cache)\n", - " 65 0.010 0.000 0.030 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:708(_slice_take_blocks_ax0)\n", - " 87 0.003 0.000 0.030 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6956(insert)\n", - "15142/11342 0.022 0.000 0.028 0.000 {built-in method builtins.len}\n", - " 58858 0.027 0.000 0.027 0.000 {built-in method _abc._abc_instancecheck}\n", - " 81/42 0.000 0.000 0.027 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:50(__le__)\n", - " 2 0.000 0.000 0.027 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:9492(pivot_table)\n", - " 2 0.000 0.000 0.026 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/pivot.py:61(pivot_table)\n", - " 2 0.000 0.000 0.026 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/pivot.py:118(__internal_pivot_table)\n", - " 41 0.003 0.000 0.026 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7164(_cmp_method)\n", - " 853 0.026 0.000 0.026 0.000 {method 'reduce' of 'numpy.ufunc' objects}\n", - " 2 0.000 0.000 0.025 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:10170(apply)\n", - " 2 0.000 0.000 0.025 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:864(apply)\n", - " 2 0.000 0.000 0.025 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1061(apply_standard)\n", - " 39/12 0.001 0.000 0.025 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6463(astype)\n", - " 2 0.000 0.000 0.025 0.012 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1070(apply_series_generator)\n", - " 1878 0.015 0.000 0.024 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6301(__setattr__)\n", - " 151 0.000 0.000 0.024 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1496(items)\n", - " 11441 0.012 0.000 0.024 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/utils.py:48()\n", - " 11763 0.016 0.000 0.023 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:576(tz)\n", - " 4 0.000 0.000 0.023 0.006 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:10803(where)\n", - " 4 0.000 0.000 0.023 0.006 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:10615(_where)\n", - " 175 0.000 0.000 0.023 0.000 {built-in method builtins.next}\n", - " 19 0.000 0.000 0.023 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:725()\n", - " 23599 0.017 0.000 0.022 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:123()\n", - " 342/38 0.001 0.000 0.022 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:128(deepcopy)\n", - " 38 0.000 0.000 0.022 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:227(_deepcopy_dict)\n", - " 83/44 0.001 0.000 0.022 0.000 {built-in method _operator.le}\n", - " 106 0.002 0.000 0.022 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:674(_with_infer)\n", - " 121 0.001 0.000 0.021 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2632(check_bool_indexer)\n", - " 41 0.007 0.000 0.021 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:977(_cmp_method)\n", - " 38 0.001 0.000 0.021 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:794(generate_option_tick_new)\n", - " 1 0.000 0.000 0.021 0.021 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:160(_convert_arrays_to_dataframe)\n", - " 737 0.015 0.000 0.021 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6236(__finalize__)\n", - " 11528 0.011 0.000 0.021 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_model_construction.py:268(__instancecheck__)\n", - " 87 0.000 0.000 0.021 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:132(__enter__)\n", - " 273 0.012 0.000 0.021 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:842(_engine)\n", - "13313/13293 0.012 0.000 0.021 0.000 {built-in method numpy.asarray}\n", - " 5 0.007 0.001 0.020 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:891(_list_of_dict_to_arrays)\n", - " 2 0.000 0.000 0.020 0.010 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:78(method)\n", - " 2 0.000 0.000 0.020 0.010 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:736(map)\n", - " 108 0.002 0.000 0.019 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:666(_parse)\n", - " 523 0.003 0.000 0.019 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:564(_take_preprocess_indexer_and_fill_value)\n", - " 288 0.007 0.000 0.019 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:419(check_array_indexer)\n", - " 153 0.002 0.000 0.019 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1863(from_array)\n", - " 283 0.002 0.000 0.019 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4608(_box_col_values)\n", - " 38 0.002 0.000 0.018 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:127(get_option_specifics_from_key)\n", - " 57 0.001 0.000 0.018 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:456(_array_strptime_with_fallback)\n", - " 57 0.001 0.000 0.018 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:760(parse_option_tick)\n", - " 192 0.012 0.000 0.018 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1157(maybe_infer_to_datetimelike)\n", - " 11554 0.018 0.000 0.018 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2310(_construct_from_dt64_naive)\n", - " 1 0.000 0.000 0.017 0.017 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:139(_parse_date_columns)\n", - " 4 0.000 0.000 0.017 0.004 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Context.py:16(Context)\n", - " 304 0.017 0.000 0.017 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:182(_deepcopy_atomic)\n", - " 6 0.000 0.000 0.017 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:928(_finalize_columns_and_data)\n", - " 12564 0.014 0.000 0.017 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:416(extract_array)\n", - " 7910 0.007 0.000 0.017 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:173(search)\n", - " 7 0.000 0.000 0.017 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:1006(convert_object_array)\n", - " 7 0.000 0.000 0.017 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:1070()\n", - " 482 0.017 0.000 0.017 0.000 {method 'copy' of 'numpy.ndarray' objects}\n", - " 33 0.016 0.000 0.017 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:1028(convert)\n", - " 23075 0.012 0.000 0.016 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1194()\n", - " 19 0.000 0.000 0.016 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:96(arrays_to_mgr)\n", - " 3 0.000 0.000 0.016 0.005 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:84(__init__)\n", - " 2 0.000 0.000 0.016 0.008 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4320(_setitem_array)\n", - " 12719 0.012 0.000 0.016 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:334(is_hashable)\n", - " 2 0.000 0.000 0.016 0.008 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:196(where)\n", - " 129 0.010 0.000 0.015 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_strptime.py:564(_strptime_datetime)\n", - " 82 0.001 0.000 0.015 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5425(_getitem_slice)\n", - " 11567 0.015 0.000 0.015 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:103(tz_to_dtype)\n", - " 72 0.000 0.000 0.015 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:586()\n", - " 136 0.001 0.000 0.015 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5437(_can_hold_identifiers_and_holds_name)\n", - " 144 0.000 0.000 0.015 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:583(copy_func)\n", - " 57 0.000 0.000 0.014 0.000 {built-in method strptime}\n", - " 27 0.000 0.000 0.014 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4477(__delitem__)\n", - " 774 0.008 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5323(__contains__)\n", - " 10 0.000 0.000 0.014 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:826(is_USholiday)\n", - " 8 0.000 0.000 0.014 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6538(dropna)\n", - " 59859 0.014 0.000 0.014 0.000 {built-in method builtins.hasattr}\n", - " 13 0.000 0.000 0.014 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:821(date_range)\n", - " 13 0.001 0.000 0.014 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:397(_generate_range)\n", - " 81 0.001 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3122(duplicated)\n", - " 273 0.001 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:773(_view)\n", - " 27 0.001 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1434(idelete)\n", - " 452 0.002 0.000 0.013 0.000 {method 'any' of 'numpy.ndarray' objects}\n", - " 133 0.000 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1010(view)\n", - " 426 0.012 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:551(maybe_promote)\n", - " 23599 0.012 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:121(classes)\n", - " 3 0.000 0.000 0.012 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/validate_call_decorator.py:28(validate_call)\n", - " 3 0.000 0.000 0.012 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/validate_call_decorator.py:51(validate)\n", - " 3 0.000 0.000 0.012 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_validate_call.py:26(__init__)\n", - " 246 0.001 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:769(_try_cast)\n", - " 23 0.000 0.000 0.012 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1689(_getitem_tuple)\n", - " 94 0.001 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1782(_consolidate_inplace)\n", - " 581 0.001 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7593(ensure_index)\n", - " 114 0.002 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2529(__setitem__)\n", - " 36 0.001 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3820(get_indexer)\n", - " 216 0.002 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:97(is_bool_indexer)\n", - " 454 0.001 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:55(_any)\n", - " 1 0.000 0.000 0.011 0.011 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/decorators.py:10(wrapper)\n", - " 283 0.008 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1012(iget)\n", - " 53 0.002 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:823(take)\n", - " 491 0.004 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:137(is_object_dtype)\n", - " 11858 0.011 0.000 0.011 0.000 {built-in method numpy.datetime_data}\n", - " 6 0.011 0.002 0.011 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:532(treat_as_nested)\n", - " 49505 0.010 0.000 0.011 0.000 {built-in method builtins.issubclass}\n", - " 75 0.007 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1146(take)\n", - " 57 0.001 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1200(maybe_cast_to_datetime)\n", - " 2 0.000 0.000 0.010 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6731(drop_duplicates)\n", - " 11 0.000 0.000 0.010 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:1022(bdate_range)\n", - " 38 0.001 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6519(sum)\n", - " 12 0.000 0.000 0.010 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:468()\n", - " 1 0.000 0.000 0.010 0.010 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:423(__init__)\n", - " 2 0.000 0.000 0.010 0.005 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/utils.py:18(__init__)\n", - " 638 0.002 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:339(_from_mgr)\n", - " 4 0.000 0.000 0.010 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:890(content)\n", - " 8 0.000 0.000 0.010 0.001 {method 'join' of 'bytes' objects}\n", - " 7 0.000 0.000 0.010 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:816(generate)\n", - " 7 0.000 0.000 0.010 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:1038(stream)\n", - " 6 0.000 0.000 0.010 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:910(read)\n", - " 8347 0.007 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:272(_compile)\n", - " 292 0.001 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:678(_constructor_sliced_from_mgr)\n", - " 552 0.003 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1596(pandas_dtype)\n", - " 147 0.004 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2313(is_unique)\n", - " 522 0.010 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2712(_generate_range)\n", - " 7 0.000 0.000 0.010 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:858(_raw_read)\n", - " 108 0.001 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:199(split)\n", - " 1 0.000 0.000 0.010 0.010 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/utils.py:47(bus_range)\n", - " 11569 0.009 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2148(_creso)\n", - " 11802 0.008 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:915()\n", - " 7 0.000 0.000 0.009 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:801(_fp_read)\n", - " 68 0.003 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:141(equals)\n", - " 7 0.000 0.000 0.009 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:457(read)\n", - " 6 0.000 0.000 0.009 0.002 {method 'read' of '_io.BufferedReader' objects}\n", - " 8 0.000 0.000 0.009 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6186(_get_indexer_strict)\n", - " 837 0.007 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:278(__init__)\n", - " 11 0.000 0.000 0.009 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:674(astype)\n", - " 27/3 0.000 0.000 0.009 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:620(generate_schema)\n", - " 11565 0.009 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:529(is_string_or_object_np_dtype)\n", - " 38 0.000 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12498(sum)\n", - " 42/3 0.000 0.000 0.009 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:906(_generate_schema_inner)\n", - " 42/3 0.000 0.000 0.009 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:931(match_type)\n", - " 79 0.000 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4191(_validate_positional_slice)\n", - " 59 0.001 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6418(_reduce)\n", - " 3 0.000 0.000 0.009 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1871(_callable_schema)\n", - " 7 0.008 0.001 0.009 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:447(astype)\n", - " 38 0.001 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12459(_min_count_stat_function)\n", - " 18 0.000 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1004(_getitem_tuple_same_dim)\n", - " 237 0.009 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6685(_validate_indexer)\n", - " 65 0.000 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:325(_from_sequence)\n", - " 12334 0.008 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:831(_reset_identity)\n", - " 11555 0.008 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2063(_maybe_pin_freq)\n", - " 114 0.000 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1422(_set_value)\n", - " 165 0.000 0.000 0.008 0.000 {method 'max' of 'numpy.ndarray' objects}\n", - " 12 0.000 0.000 0.008 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5343(reindex)\n", - " 114 0.001 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1415(_set_values)\n", - " 12 0.000 0.000 0.008 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4323(reindex)\n", - " 270 0.001 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:807(_set_axis)\n", - " 165 0.000 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:39(_amax)\n", - " 99 0.006 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:239(maybe_convert_indices)\n", - " 993 0.001 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:189(__next__)\n", - " 103 0.001 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5242(_sanitize_column)\n", - " 19 0.000 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2121(create_block_manager_from_column_arrays)\n", - " 2 0.000 0.000 0.008 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/generic.py:1420(aggregate)\n", - " 7 0.000 0.000 0.008 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:157(concat)\n", - " 7 0.000 0.000 0.008 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4796(_drop_axis)\n", - " 2 0.000 0.000 0.008 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6828(duplicated)\n", - " 2 0.000 0.000 0.008 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:172(agg)\n", - " 2 0.000 0.000 0.008 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:558(apply_str)\n", - " 18/17 0.000 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:38(__eq__)\n", - " 15 0.000 0.000 0.008 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1574(_generate_parameter_schema)\n", - " 12077 0.008 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:152(cast_scalar_indexer)\n", - " 2 0.000 0.000 0.007 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:681(_apply_str)\n", - " 1 0.000 0.000 0.007 0.007 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:848(resample)\n", - " 333/320 0.001 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:101(isna)\n", - " 13011 0.007 0.000 0.007 0.000 {built-in method __new__ of type object at 0x101405898}\n", - " 87 0.003 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5368(insert)\n", - " 1 0.000 0.000 0.007 0.007 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:263(organize_data_for_query)\n", - " 5 0.000 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6239(reset_index)\n", - " 993 0.005 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:77(get_token)\n", - " 491 0.005 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/extension.py:67(fget)\n", - " 7 0.000 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:622(get_result)\n", - " 333/320 0.002 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:184(_isna)\n", - " 18 0.001 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:596(_homogenize)\n", - " 5 0.000 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6997(sort_values)\n", - " 16 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6162(get_indexer_for)\n", - " 4 0.000 0.000 0.007 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5614(_reindex_axes)\n", - " 279 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:707(dtype)\n", - " 39 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:421(astype)\n", - " 43 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:610(factorize)\n", - " 38 0.001 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:76(_f)\n", - " 11439 0.007 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/utils.py:49()\n", - " 7 0.000 0.000 0.006 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:11603(any)\n", - " 366 0.003 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:346(_name_get)\n", - " 26 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7553(ensure_index_from_sequences)\n", - " 8 0.000 0.000 0.006 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12169(_logical_func)\n", - " 6 0.000 0.000 0.006 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5359(reindex)\n", - " 279 0.006 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1993(dtype)\n", - " 14 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2259(_consolidate)\n", - " 20 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:1371(_arith_method)\n", - " 8/7 0.000 0.000 0.006 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:11435(_reduce)\n", - " 53 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:387(apply)\n", - " 15 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2066(_apply_annotations)\n", - " 351 0.004 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:253(fill_value)\n", - " 23108 0.006 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2570(_validate_tz_from_dtype)\n", - " 80 0.001 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:106(_ensure_data)\n", - " 294 0.001 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:659(_constructor_from_mgr)\n", - " 12 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:1364(_duplicated)\n", - " 41 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:524(_validate_comparison_value)\n", - " 129 0.000 0.000 0.006 0.000 {method 'all' of 'numpy.ndarray' objects}\n", - " 12 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/base.py:1170(duplicated)\n", - " 249 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:145(_get_option)\n", - " 15 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6133(_arith_method)\n", - " 5 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:214(_obj_with_exclusions)\n", - " 114 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:372(setitem)\n", - " 59 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:288(comparison_op)\n", - " 5 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:743(group_info)\n", - " 129 0.003 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_strptime.py:309(_strptime)\n", - " 15 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_schema_generation_shared.py:82(__call__)\n", - " 5 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:758(_get_compressed_codes)\n", - " 283 0.002 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1471(_set_as_cached)\n", - " 15 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2085(inner_handler)\n", - " 57 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:723(astype)\n", - " 131 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:61(_all)\n", - " 13012 0.005 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:551(dtype)\n", - " 24728 0.005 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:2287(cast)\n", - " 1 0.000 0.000 0.005 0.005 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:310(__init__)\n", - " 6 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:371(__init__)\n", - " 5 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:9041(groupby)\n", - " 10 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5095(insert)\n", - " 42 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:389(new_func)\n", - " 477 0.003 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3777(get_loc)\n", - " 5 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1296(__init__)\n", - " 420 0.002 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2645(maybe_coerce_values)\n", - " 296 0.002 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:82(shape)\n", - " 154 0.002 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:875(_parse_numeric_token)\n", - " 1 0.001 0.001 0.005 0.005 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:511()\n", - " 94 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1764(is_consolidated)\n", - " 350 0.001 0.000 0.005 0.000 {built-in method builtins.any}\n", - " 5 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:846(get_grouper)\n", - " 144 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:511(_validate_dtype)\n", - " 2 0.000 0.000 0.005 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:9863(unstack)\n", - " 2 0.000 0.000 0.005 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:489(unstack)\n", - " 202 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4402(_check_setitem_copy)\n", - " 144 0.002 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:231(asarray_tuplesafe)\n", - " 86 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1412(_insert_update_blklocs_and_blknos)\n", - " 43 0.002 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:548(factorize_array)\n", - " 2 0.000 0.000 0.004 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:525(_unstack_frame)\n", - " 12 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:994(duplicated)\n", - " 270 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:236(set_axis)\n", - " 361 0.003 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:274(full)\n", - "13541/13527 0.004 0.000 0.004 0.000 {built-in method builtins.hash}\n", - " 2410 0.003 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:909(__len__)\n", - " 11 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6432(dtypes)\n", - " 39 0.002 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2276(_merge_blocks)\n", - " 39 0.004 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:534(_scalar_from_string)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:868(read_csv)\n", - " 7 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7031(drop)\n", - " 38 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:455(newfunc)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:583(_read)\n", - " 1323 0.004 0.000 0.004 0.000 {built-in method numpy.empty}\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:2365(mean)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:9382(resample)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1957(_cython_agg_general)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:2045(get_resampler)\n", - " 157 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2703(new_block_2d)\n", - " 11 0.000 0.000 0.004 0.000 {built-in method builtins.print}\n", - " 3191 0.004 0.000 0.004 0.000 {method 'get' of 'dict' objects}\n", - " 6 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/from_thread.py:455(start_blocking_portal)\n", - " 38 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:604(nansum)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:2210(_get_resampler)\n", - " 22 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:655(write)\n", - " 955 0.002 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:481(ensure_wrapped_if_datetimelike)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:163(__init__)\n", - " 3 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1397(_getitem_axis)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:246(_get_binner)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:1737(_get_binner_for_time)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:2285(_get_time_bins)\n", - " 529 0.002 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:180(blknos)\n", - " 68 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:262(_get_hashtable_algo)\n", - " 3 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1205(_getbool_axis)\n", - " 28 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6925(f)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:683(one_off_save)\n", - " 1 0.001 0.001 0.004 0.004 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1188(bulk_one_off_save)\n", - " 314 0.004 0.000 0.004 0.000 {cyfunction Timestamp.strftime at 0x10d6ce400}\n", - " 166 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/ipkernel.py:775(_clean_thread_parent_frames)\n", - " 15 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:582(get_loc)\n", - " 87 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1393(moveaxis)\n", - " 331 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:790(copy)\n", - " 12 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1322(__contains__)\n", - " 11554 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2514(_validate_dt64_dtype)\n", - " 36 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:124(maybe_convert_platform)\n", - " 227 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1519(construct_1d_arraylike_from_scalar)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:2264(count)\n", - " 94 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1772(_consolidate_check)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4360(_iset_not_inplace)\n", - " 12 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2982(get_loc)\n", - " 10 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:822(is_busday)\n", - " 33 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6679(_maybe_cast_listlike_indexer)\n", - " 22 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:577(_schedule_flush)\n", - " 86 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1402(_insert_update_mgr_locs)\n", - " 3 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:259(schedule)\n", - " 12 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:3308(_get_level_indexer)\n", - " 57 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1240(_ensure_nanosecond_dtype)\n", - " 3 0.003 0.001 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/zmq/sugar/socket.py:621(send)\n", - " 270 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:86(_validate_set_axis)\n", - " 130 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/base.py:549(find)\n", - " 172 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5562(append)\n", - " 30 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6957()\n", - " 95 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:131(filterwarnings)\n", - " 14 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:558(_parse_with_reso)\n", - " 14 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:275(_parse_with_reso)\n", - " 24 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:220(__init__)\n", - " 2 0.000 0.000 0.003 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5433(drop)\n", - " 19 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2190(_form_blocks)\n", - " 2 0.000 0.000 0.003 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4757(drop)\n", - " 24 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:373(_finalize)\n", - " 259 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:127(_get_single_key)\n", - " 12 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2957(_get_loc_single_level_index)\n", - " 2 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1450(grouped_reduce)\n", - " 12 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:550(validate_categories)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1907(read)\n", - " 227 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:784(name)\n", - " 5 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_decorators.py:325(wrapper)\n", - " 53 0.000 0.000 0.003 0.000 {method 'sum' of 'numpy.ndarray' objects}\n", - " 574 0.003 0.000 0.003 0.000 {method 'view' of 'numpy.ndarray' objects}\n", - " 25 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:325(__new__)\n", - " 2 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:110(__init__)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager_processes.py:237(schedule)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager.py:328(_schedule)\n", - " 25 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:307(unique)\n", - " 23 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:2344(unique)\n", - " 657 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:831(_values)\n", - " 218 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5170(_get_engine_target)\n", - " 884 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:84()\n", - " 2 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:301(lexsort_indexer)\n", - " 11 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:607(_init_dict)\n", - " 25 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:427(unique_with_mask)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:750(merge_environment_settings)\n", - " 23 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:1019(unique)\n", - " 5 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:7282(sort_index)\n", - " 5 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5290(sort_index)\n", - " 53 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:47(_sum)\n", - " 12 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:515(view)\n", - " 3 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:3951(T)\n", - " 8 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:7142(fillna)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:826(get_environ_proxies)\n", - " 3 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:3767(transpose)\n", - " 55 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:800(_generate_schema_from_property)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1823(_setup_result_proxy)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1893(_setup_dml_or_text_result)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:474(from_arrays)\n", - " 57 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:189(_na_arithmetic_op)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:1422(__init__)\n", - " 5 0.003 0.001 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:922()\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:2063(to_dict)\n", - " 12 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:117(view)\n", - " 1922 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/__init__.py:34(using_copy_on_write)\n", - " 3 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1610(_log)\n", - " 13/11 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1040(_match_generic_type)\n", - " 4 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:7894(_cmp_method)\n", - " 242 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_strptime.py:26(_getlang)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:1485(_init_metadata)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:347(__init__)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/methods/to_dict.py:78(to_dict)\n", - " 8 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:380(notna)\n", - " 93/91 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:1131(take)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1971(array_func)\n", - " 3 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:897(apply_groupwise)\n", - " 523 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:325(_get_take_nd_function)\n", - " 7949 0.003 0.000 0.003 0.000 {method 'search' of 're.Pattern' objects}\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:3048(factorize_from_iterables)\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:3069()\n", - " 36 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3955(_get_indexer)\n", - " 4 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:622(_get_splitter)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:3005(factorize_from_iterable)\n", - " 793 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/flags.py:55(allows_duplicate_labels)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:496(_merge_cursor_description)\n", - " 114 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1373(setitem)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:625()\n", - " 474 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2765(check_dict_or_set_indexers)\n", - " 7 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:699(new_axes)\n", - " 116 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1495(_maybe_update_cacher)\n", - " 7 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:702()\n", - " 222 0.001 0.000 0.002 0.000 {built-in method builtins.sum}\n", - " 13 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1316(view)\n", - " 285 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2716(new_block)\n", - " 216 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:182(_add_filter)\n", - " 57 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/astype.py:191(astype_array_safe)\n", - " 36 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6394(_should_compare)\n", - " 13 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1248(copy)\n", - " 6 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:208(__truediv__)\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1636(handle)\n", - " 30 0.002 0.000 0.002 0.000 {built-in method _thread.start_new_thread}\n", - " 9 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/from_thread.py:308(start_task_soon)\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1690(callHandlers)\n", - " 65 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2320(_preprocess_slice_or_indexer)\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:589(clean_schema)\n", - " 141 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2518(__getitem__)\n", - " 87 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:141(__exit__)\n", - " 20 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1524(where)\n", - " 15 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:689(codes)\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:965(handle)\n", - " 242 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/locale.py:594(getlocale)\n", - " 46 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:261(_isna_array)\n", - " 6 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:5136(reindex)\n", - " 21 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_exceptions.py:34(find_stack_level)\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/handlers.py:65(emit)\n", - " 9 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:777(_codes_and_uniques)\n", - " 63 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:157(take)\n", - " 79 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1778()\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1216(emit)\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1098(emit)\n", - " 250 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1571(validate_all_hashable)\n", - " 1 0.001 0.001 0.002 0.002 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/utils.py:54()\n", - " 9 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:5773(isna)\n", - " 6 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/_backends/_asyncio.py:980(_spawn_task_from_thread)\n", - " 26 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:838(_cleanup)\n", - " 11 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1369(_union_schema)\n", - " 9 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:8693(isna)\n", - " 87 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1774(get_result_processor)\n", - " 134/133 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:390(_get_getitem_freq)\n", - " 630 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2795(extend_blocks)\n", - " 170 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:163(match)\n", - " 6 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/_backends/_asyncio.py:2483(run_sync_from_thread)\n", - " 285 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:319(asi8)\n", - " 356 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:467(__enter__)\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:7918(_dispatch_frame_op)\n", - " 5 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:59(get_indexer_indexer)\n", - " 87 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/sql/type_api.py:908(_cached_result_processor)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:9114(asfreq)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:2794(asfreq)\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1087(flush)\n", - " 366 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:330(_name_includes_bit_suffix)\n", - " 168 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:273(is_dict_like)\n", - " 9 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:744(_group_index)\n", - " 657 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2004(internal_values)\n", - " 88 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/weakref.py:414(__getitem__)\n", - " 3 0.002 0.001 0.002 0.001 {method 'flush' of '_io.TextIOWrapper' objects}\n", - " 32 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:12675(_reindex_for_setitem)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2499(getproxies_environment)\n", - " 30 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/ipkernel.py:768(init_closure)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/generic.py:2002(_get_data_to_aggregate)\n", - " 53 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:2077(__contains__)\n", - " 532 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:696(_sanitize_ndim)\n", - " 18 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:402(walk_core_schema)\n", - " 121 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:166(simplefilter)\n", - " 706 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1392()\n", - " 51 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:664(_constructor_from_mgr)\n", - " 68 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:280(_check_object_for_strings)\n", - " 7 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:717(_get_concat_axis)\n", - " 76 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:440(acquire)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:279()\n", - " 120 0.000 0.000 0.002 0.000 {built-in method builtins.sorted}\n", - " 360/18 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:196(walk)\n", - " 360/18 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:199(_walk)\n", - " 837 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/flags.py:51(__init__)\n", - " 78 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1095(__getitem__)\n", - " 45 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:71(_wrapreduction)\n", - " 174 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1330(normalize_axis_tuple)\n", - " 123 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:274(make_block)\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:200(__mul__)\n", - " 427 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:734(name)\n", - " 18 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:392(handle_call_schema)\n", - " 16 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:305(_isna_string_dtype)\n", - " 182 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:592(_get_block_manager_axis)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1491(warning)\n", - " 204 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:225(compile)\n", - " 259 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:635(_get_root)\n", - " 435 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:292(make_block_same_class)\n", - " 30 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:856(__init__)\n", - " 344 0.000 0.000 0.002 0.000 :859(__iter__)\n", - " 7 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1483(reduce)\n", - " 18 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:379(handle_arguments_schema)\n", - " 217 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1220(_get_value)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:212(putmask)\n", - " 12 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5663(_reindex_with_indexers)\n", - " 59 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:836(_isnan)\n", - " 16 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4470(_iset_item_mgr)\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:687(codes)\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:690()\n", - " 5 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:68(__and__)\n", - " 57 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/computation/expressions.py:226(evaluate)\n", - " 12223 0.002 0.000 0.002 0.000 {method 'keys' of 'dict' objects}\n", - " 5 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6123(_logical_method)\n", - " 110 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2520(get_schema_or_ref)\n", - " 343 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:219(_can_consolidate)\n", - " 21 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:219(vstack)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:765(should_bypass_proxies)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:191(_make_selectors)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:231(get_result)\n", - " 21 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1247(series_generator)\n", - " 469 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2674(get_block_type)\n", - " 92 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:745(_get_engine_target)\n", - " 18 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1066(iset)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:521(ffill)\n", - " 328 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1253(iget)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:1801(_upsample)\n", - " 66 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:273(__call__)\n", - " 404 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:586(_get_axis)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:648()\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2672(proxy_bypass)\n", - " 80 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:612(result_iterator)\n", - " 9 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:122(get_group_index)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1633(as_array)\n", - " 737 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/flags.py:87(allows_duplicate_labels)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:812(_cython_operation)\n", - " 57 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/computation/expressions.py:67(_evaluate_standard)\n", - " 156 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2264()\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:12590(values)\n", - " 242 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/locale.py:479(_parse_localename)\n", - " 23 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:957(_validate_tuple_indexer)\n", - " 23 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1032(_getitem_lowerdim)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2016(_sort_levels_monotonic)\n", - " 28 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/putmask.py:101(validate_putmask)\n", - " 128 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:243(__init__)\n", - " 409 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:673(na_value_for_dtype)\n", - " 209 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numerictypes.py:357(issubdtype)\n", - " 55 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:77(get_type_ref)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1707(_interleave)\n", - " 152 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:79()\n", - " 730 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:214(is_extension)\n", - " 711 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:372(apply_if_callable)\n", - " 229 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:830(__len__)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:94(concatenate_managers)\n", - " 260 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:609(_dtype_to_subclass)\n", - " 262 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:568(require_length_match)\n", - " 131 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:836(__iter__)\n", - " 7 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:180(fillna)\n", - " 78 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:225(_consolidate_key)\n", - " 214 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:948(from_blocks)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1479(info)\n", - " 86 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2311(_fast_count_smallints)\n", - " 87 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:537(_check_compatible_with)\n", - " 111 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5552(equals)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2685(getproxies)\n", - " 46 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2744(inferred_type)\n", - " 76 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:314(_result_or_cancel)\n", - " 63 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:208(findall)\n", - " 119 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:892(getfile)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:222(read)\n", - " 8 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6488(isna)\n", - " 25 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:903(_set_levels)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2817(hasnans)\n", - " 41 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:2082(empty)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1915(_agg_py_fallback)\n", - " 128 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:3995(_maybe_update_cacher)\n", - " 14 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4883(_update_inplace)\n", - " 91 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:328(__init__)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5636(rename)\n", - " 354 0.001 0.000 0.001 0.000 {method 'match' of 're.Pattern' objects}\n", - " 7 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1870(_get_label_or_level_values)\n", - " 41 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:718(_unbox)\n", - " 205 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4623(_clear_item_cache)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1070(_rename)\n", - " 8 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1565(__invert__)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:7885(replace)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1575(__init__)\n", - " 459 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1331(is_ea_or_datetimelike_dtype)\n", - " 83 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/ipkernel.py:790()\n", - " 210 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:428(append)\n", - " 156 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1643(__len__)\n", - " 133 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2811(ensure_block_shape)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/utils.py:10(add_eod_timestamp)\n", - " 84 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:769(_assert_tzawareness_compat)\n", - " 826 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:999(__len__)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2804(_isnan)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1684(is_monotonic_increasing)\n", - " 46 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:525(_unbox_scalar)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1848(_make_engine)\n", - " 356 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:488(__exit__)\n", - " 15 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:833(isna)\n", - " 1785 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:208(isnum)\n", - " 6/2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1438(putmask)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:231(parse_headers)\n", - " 154 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1006(_find_hms_idx)\n", - " 172 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1768(ravel)\n", - " 337 0.000 0.000 0.001 0.000 :674(__getitem__)\n", - " 20 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:240(arithmetic_op)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:4620(map)\n", - " 217 0.001 0.000 0.001 0.000 {method 'remove' of 'list' objects}\n", - " 46 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1574(_validate_key)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:419(simplify_schema_references)\n", - " 185 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:456(_engine_type)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7227(_arith_method)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:735(has_dropped_na)\n", - " 356 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:441(__init__)\n", - " 25 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1085(_set_codes)\n", - " 1530 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:405(flags)\n", - " 24 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:844(levels)\n", - " 8 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:176(isna)\n", - " 48 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:675(empty)\n", - " 300 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1040(needs_i8_conversion)\n", - " 129 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:108(asi8)\n", - " 242 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/locale.py:396(normalize)\n", - " 259 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:676(_translate_key)\n", - " 7 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:405(__init__)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:7061(_pad_or_backfill)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager.py:294(is_already_scheduled)\n", - " 132 0.001 0.000 0.001 0.000 {method 'take' of 'numpy.ndarray' objects}\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:240(__pow__)\n", - " 83 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1501(enumerate)\n", - " 337 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:195(is_array_like)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:214(get_compressed_ids)\n", - " 108 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:221(__init__)\n", - " 62 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:775(infer_dtype_from_scalar)\n", - " 521 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1590()\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:782(result_index)\n", - " 18 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2421(all)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/Requests.py:36(construct_request_name)\n", - " 264/120 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:206(_handle_other_schemas)\n", - " 23 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1643(fillna)\n", - " 64 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/common.py:81(get_op_result_name)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2083(remove_unused_levels)\n", - " 169 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1850(from_blocks)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:299(pad_or_backfill)\n", - " 120 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:728(is_valid_na_for_dtype)\n", - " 153 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4379(_set_is_copy)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2235(take)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:596(shape)\n", - " 2768 0.001 0.000 0.001 0.000 {method 'append' of 'list' objects}\n", - " 63 0.001 0.000 0.001 0.000 {method 'findall' of 're.Pattern' objects}\n", - " 36 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1277(is_extension_array_dtype)\n", - " 69 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:386(default_index)\n", - " 93 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:914(__len__)\n", - " 111 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:184(_reconstruct_data)\n", - " 24 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:897()\n", - " 76 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6312(_index_as_unique)\n", - " 16 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:598()\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1102(wrap_results)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:2058(sum)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:1539(sum)\n", - " 94 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:474(resolve_ymd)\n", - " 952 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3809()\n", - " 9/6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2435(_signature_from_callable)\n", - " 17 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2229(is_monotonic_increasing)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:192(__sub__)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:562(_apply)\n", - " 12 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:676(ngroups)\n", - " 260 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:591(_ensure_array)\n", - " 22 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2979(prod)\n", - " 99 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:350(getitem_block_columns)\n", - " 114 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2603(_tuplify)\n", - " 27 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2246(_stack_arrays)\n", - " 119 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:2140()\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:460(_apply_columnwise)\n", - " 748 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:572(_get_axis_number)\n", - " 616 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1837(__init__)\n", - " 56 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1081(is_numeric_dtype)\n", - " 92 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:924()\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:457(prepare_request)\n", - " 56 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:448(size)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:777(_concat_indexes)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4420(_set_item_frame_value)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:60(__init__)\n", - " 71 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:782(_rename)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:176(sorted_labels)\n", - " 831 0.001 0.000 0.001 0.000 {method 'decode' of 'bytes' objects}\n", - " 275 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/frozen.py:76(__getitem__)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5455(append)\n", - " 143 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2776(_is_multi)\n", - " 7 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4159(xs)\n", - " 280 0.001 0.000 0.001 0.000 {method 'clear' of 'dict' objects}\n", - " 378 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:667(_info_axis)\n", - " 92 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1102()\n", - " 181 0.001 0.000 0.001 0.000 :1207(_handle_fromlist)\n", - " 4/3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:58(__ge__)\n", - " 1725 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5144(_values)\n", - " 1043 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:203(isword)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5491(_concat)\n", - " 418 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numerictypes.py:283(issubclass_)\n", - " 53 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:414(_split_op_result)\n", - " 33 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6415(_is_comparable_dtype)\n", - " 1407 0.001 0.000 0.001 0.000 {built-in method builtins.callable}\n", - " 286 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/base.py:238(construct_from_string)\n", - " 98 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2152(unit)\n", - " 180 0.001 0.000 0.001 0.000 {method 'nonzero' of 'numpy.ndarray' objects}\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:271(from_annotation)\n", - " 441 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:735(_sanitize_str_dtypes)\n", - " 8 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:1452(safe_sort)\n", - " 497 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:300()\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_discriminated_union.py:37(apply_discriminators)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:860(values)\n", - " 30 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:562(__init__)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:687(compress_group_index)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:237(ndarray_to_mgr)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:156(_indexer_and_to_sort)\n", - " 21 0.001 0.000 0.001 0.000 {built-in method _operator.ne}\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:909(text)\n", - " 51 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:633(is_integer_dtype)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1045(astype)\n", - " 69 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:217(_ensure_arraylike)\n", - " 9 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:527(__init__)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:478(coerce_to_target_dtype)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:789(apparent_encoding)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1784(get_level_values)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:805(call_soon_threadsafe)\n", - " 9 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:958(fast_xs)\n", - " 238 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1141(_to_decimal)\n", - " 9 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:333(from_annotated_attribute)\n", - " 163 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2537(dtype_to_unit)\n", - " 11 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:287(get_dtypes)\n", - " 12 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:418(merge_field_infos)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/legacy.py:19(detect)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:593(fetch_eof_columns)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:365(request)\n", - " 48 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:294(handle_union_schema)\n", - " 20 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:113(comp_method_OBJECT_ARRAY)\n", - " 806 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:718(dtype)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:3261(signature)\n", - " 513 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:196(blklocs)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:177(__contains__)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2236(_tuples_to_blocks_no_consolidate)\n", - " 16 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:66(copy)\n", - " 108 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:62(__init__)\n", - " 646 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/__init__.py:42(warn_copy_on_write)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:3007(from_callable)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:243(replace)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/api.py:33(from_bytes)\n", - " 42 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:253(_get_values)\n", - " 99 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:74(__len__)\n", - " 9 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6459(any)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:8282(_construct_result)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2238()\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:523(inferred_freq)\n", - " 36 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6324(_maybe_downcast_for_indexing)\n", - " 19 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1697(_validate_names)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:7172()\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:910(inferred_freq)\n", - " 85 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:301(maybe_iterable_to_list)\n", - " 7 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:707(_get_comb_axis)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2331(_signature_from_function)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:798(tolist)\n", - " 84 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/dispatch.py:17(should_extension_dispatch)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:89(infer_freq)\n", - " 74 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:201(_simple_new)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:416(_maybe_cast_listlike_indexer)\n", - " 9 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:487()\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:10185(align)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2244(get_values)\n", - " 14 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1433(find_common_type)\n", - " 27 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_asarray.py:27(require)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/base.py:2058(tolist)\n", - " 330 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:649(_get_deprecated_option)\n", - " 298 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:271(__enter__)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:828(replace)\n", - " 67 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:4120(_coerce_indexer_frozen)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:196(__rsub__)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:72(get_objs_combined_axis)\n", - " 532 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:758(_maybe_repeat)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6480(all)\n", - " 207 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:193(__get__)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6916(delete)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:649()\n", - " 104 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4585(_ensure_valid_index)\n", - " 737 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:363(attrs)\n", - " 346 0.000 0.000 0.000 0.000 {method 'astype' of 'numpy.ndarray' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:840(agg_series)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:172()\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1051(_stop)\n", - " 105 0.000 0.000 0.000 0.000 {built-in method numpy.zeros}\n", - " 87 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5295(_validate_fill_value)\n", - " 46 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:33(seterr)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:595(homogeneous_func)\n", - " 242 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:791(is_)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:369(nargsort)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1758(_get_level_values)\n", - " 285 0.000 0.000 0.000 0.000 {method 'split' of 'str' objects}\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7218(_construct_result)\n", - " 284 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:2443(get_origin)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12362(_stat_function)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:53(_wrapfunc)\n", - " 664 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1168(ident)\n", - " 575 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1940(_block)\n", - " 57 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1047(shape)\n", - " 56 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2794(_na_value)\n", - " 118 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:178(_datetime_metadata_str)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:492(to_numpy)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/accessor.py:95(_getter)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:720(size)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/accessors.py:88(_delegate_property_get)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/selector_events.py:128(_write_to_self)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1706(pad_or_backfill)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:351(prepare)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:353(wrapper)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1578(_wrap_aggregated_output)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2658(proxy_bypass_macosx_sysconf)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:226(isna)\n", - " 259 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:617(_select_options)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:482(nanany)\n", - " 1712 0.000 0.000 0.000 0.000 {built-in method builtins.setattr}\n", - " 108 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:395(__init__)\n", - " 6 0.000 0.000 0.000 0.000 {method 'send' of '_socket.socket' objects}\n", - " 214 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:336(hms)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:378(interleaved_dtype)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:206(__getattr__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:325(get_new_columns)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:601(calc)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6219(_raise_if_missing)\n", - " 40 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:165(maybe_lift)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:873(_aggregate_series_pure_python)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1559(itertuples)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:214(_handle_result)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:213(get_freq)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:815(_handle_resultset)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:10479(_align_frame)\n", - " 288 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/__init__.py:55(using_pyarrow_string_dtype)\n", - " 36 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:789(values)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/methods/to_dict.py:171()\n", - " 644 0.000 0.000 0.000 0.000 :760(decode)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1574(_set_names)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1287(endheaders)\n", - " 329 0.000 0.000 0.000 0.000 {method 'format' of 'str' objects}\n", - " 324 0.000 0.000 0.000 0.000 :697(__iter__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1049(_send_output)\n", - " 58/42 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2432(_extract_get_pydantic_json_schema)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5598()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:988(send)\n", - " 57 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/missing.py:131(dispatch_fill_zeros)\n", - " 14/13 0.000 0.000 0.000 0.000 {built-in method _operator.eq}\n", - " 63/3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:425(collect_refs)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2353(copy)\n", - " 337 0.000 0.000 0.000 0.000 :756(encode)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:293(_infer_daily_rule)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:111(f)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:430(__enter__)\n", - " 167 0.000 0.000 0.000 0.000 {method 'reshape' of 'numpy.ndarray' objects}\n", - " 30 0.000 0.000 0.000 0.000 {method 'extend' of 'list' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:446(get_connection_with_tls_context)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:456(get_rows)\n", - " 298 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:274(__exit__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:5486(isin)\n", - " 409 0.000 0.000 0.000 0.000 {built-in method numpy.asanyarray}\n", - " 87 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1310(__getattr__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:54(__gt__)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:120(_get_combined_index)\n", - " 87 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:299(helper)\n", - " 242 0.000 0.000 0.000 0.000 {built-in method _locale.setlocale}\n", - " 174 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1380()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:1149(__iter__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1630()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:885(pandasSQL_builder)\n", - " 1703 0.000 0.000 0.000 0.000 {method 'read' of '_io.StringIO' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:1162(_sorted_data)\n", - " 36 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2000(external_values)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method _scproxy._get_proxy_settings}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1532(__neg__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/utils.py:215(any_specified_encoding)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:652(_validate_listlike)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/parser.py:59(parsestr)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:278(connect)\n", - " 255 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2593(_convert_key)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:1083(reduction)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:348(get_function_type_hints)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:193(_new_conn)\n", - " 114 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:123(check_setitem_lengths)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:266(index_labels_to_array)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6629(cumprod)\n", - " 327 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1270(is_1d_only_ea_dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/parser.py:41(parse)\n", - " 57 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/astype.py:157(astype_array)\n", - " 46 0.000 0.000 0.000 0.000 {method 'argsort' of 'numpy.ndarray' objects}\n", - " 114 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2618()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12291(cumprod)\n", - " 1415 0.000 0.000 0.000 0.000 {method 'lower' of 'str' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6509(max)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:771(ngroups)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:246(get_new_values)\n", - " 76 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:364(cancel)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:545(_get_sample_object)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2662(getproxies_macosx_sysconf)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6520(_transform_index)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12239(_accum_func)\n", - " 63/3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_discriminated_union.py:45(inner)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1406()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12397(max)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:122(collect_definitions)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:390(__init__)\n", - " 61 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:992(is_numeric_v_string_like)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6831(infer_objects)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:378(new_index)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:153(_set_option)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:98(__add__)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method _scproxy._get_proxies}\n", - " 73 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:973(coerce_indexer_dtype)\n", - " 203 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/numpy/function.py:64(__call__)\n", - " 152 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2177(_grouping_func)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1216(_iset_split_block)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:1332(getfullargspec)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/connection.py:27(create_connection)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:243(_keep_alive)\n", - " 32/30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_repr.py:86(display_as_type)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2255(pad_or_backfill)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:572(_is_uniform_join_units)\n", - " 71 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:688(_warn_if_deprecated)\n", - " 63/3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:125(_record_valid_refs)\n", - " 114 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:72(check)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1966(_is_lexsorted)\n", - " 42 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:1499(_maybe_null_out)\n", - " 413 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:213(isspace)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:567(validate_core_schema)\n", - " 2070 0.000 0.000 0.000 0.000 {method 'isdigit' of 'str' objects}\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1692()\n", - " 89 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:122(_reset_cache)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:398(reduce)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5172(delete)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:479(__enter__)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:259(_reconstruct)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:276(connection_from_host)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/functools.py:35(update_wrapper)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:263(eval_type_backport)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1093(_getitem_nested_tuple)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:369(parse_url)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:567()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2107(droplevel)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:305(connection_from_context)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5651(identical)\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1025(argsort)\n", - " 212 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1763(np_can_hold_element)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:187(validate_indices)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1595(makeRecord)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:776(reconstructed_codes)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1922(rename)\n", - " 366 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:24(_kind_name)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1250(copy)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:296(_eval_type_backport)\n", - " 63 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:2378(array_equal)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:409(prepare_url)\n", - " 154 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:62(is_list_like_indexer)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:227(_encode_invalid_chars)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2002(_lexsort_depth)\n", - " 175 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:226(validate_bool_kwarg)\n", - " 88 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:795(_merge_cols_by_none)\n", - " 118 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:805(_maybe_copy)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:393(logical_op)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:393(_get_wom_rule)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:974(_is_nested_tuple_indexer)\n", - " 63/3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:447(count_refs)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/plugin/_schema_validator.py:21(create_schema_validator)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4651(_maybe_cache_changed)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:324(_get_dtype_max)\n", - " 21 0.000 0.000 0.000 0.000 :150(dirname)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:321(_eval_type)\n", - " 63/3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:488(inline_refs)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:66(mask_missing)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:292(__init__)\n", - " 489 0.000 0.000 0.000 0.000 {method 'pop' of 'list' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1809(set_names)\n", - " 113 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1262(_slice)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:158(collect_invalid_schemas)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1652(_is_scalar_access)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:831(construct_from_string)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2036(_get_prepare_pydantic_annotations_for_known_type)\n", - " 75 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:4035(_dict_not_none)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:4037(_lexsort_depth)\n", - " 301 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:246(items)\n", - " 345 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:913(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:171(feed)\n", - " 928 0.000 0.000 0.000 0.000 {built-in method _warnings._filters_mutated}\n", - " 63/3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:161(_is_schema_valid)\n", - " 122 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:259(_standardize_fill_value)\n", - " 27 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:829(_maintain_shutdown_locks)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1265(_iset_single)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:664(get_handle)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:435(__exit__)\n", - " 3 0.000 0.000 0.000 0.000 {built-in method pydantic_core._pydantic_core.validate_core_schema}\n", - " 70/15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:387(_eval_type)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:330(connection_from_pool_key)\n", - " 36 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:249(external_values)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:166(is_finalvar)\n", - " 144 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:329(month)\n", - " 94 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:380(validate)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:586(update_dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/objects.py:96(get_window_bounds)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:480(_get_ndims)\n", - " 352 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1671(name)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:1305(construct_from_string)\n", - " 4/3 0.000 0.000 0.000 0.000 {built-in method _operator.ge}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:296(_get_combined_plan)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:74(array)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:176(_call_parse)\n", - " 255 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:676(iat)\n", - " 42 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/numpy/function.py:413(validate_func)\n", - " 109 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:161(iloc)\n", - " 43 0.000 0.000 0.000 0.000 {method 'fill' of 'numpy.ndarray' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:438(convert)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1193(_engine)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:216(_parsegen)\n", - " 83 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:173()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:268(decons_obs_group_ids)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1826(_check_label_or_level_ambiguity)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2159(_drop_level_numbers)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:1084(_convert_grouper)\n", - " 87 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:104(__init__)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:485(__exit__)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4436(_wrap_reindex_result)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:1620(__init__)\n", - " 60 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1453(current_thread)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:123(__init__)\n", - " 101 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:286(_is_owned)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:11620(all)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:202(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1284(find_result_type)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:481()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:229(_new_pool)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6370(_find_common_type_compat)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:246(_decons_group_index)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2669(__init__)\n", - " 23 0.000 0.000 0.000 0.000 {built-in method _warnings.warn}\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2666(_maybe_normalize_endpoints)\n", - " 97 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:90(RLock)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1392(np_find_common_type)\n", - " 303 0.000 0.000 0.000 0.000 {method 'insert' of 'list' objects}\n", - " 152 0.000 0.000 0.000 0.000 {built-in method builtins.max}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:198(__init__)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1771(_is_label_reference)\n", - " 23 0.000 0.000 0.000 0.000 {built-in method numpy.arange}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/base.py:800(argsort)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1935(delete)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:543(nanall)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1734(isEnabledFor)\n", - " 190 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:292(isclass)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2692(max)\n", - " 413 0.000 0.000 0.000 0.000 {method 'startswith' of 'str' objects}\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:597()\n", - " 29 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:119(is_namedtuple)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:177(__init__)\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:978(__array__)\n", - " 1043 0.000 0.000 0.000 0.000 {method 'isalpha' of 'str' objects}\n", - " 36 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2827(external_values)\n", - " 192 0.000 0.000 0.000 0.000 {method 'ravel' of 'numpy.ndarray' objects}\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4440(_maybe_preserve_names)\n", - " 441 0.000 0.000 0.000 0.000 {method '__exit__' of '_thread.lock' objects}\n", - " 36 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3996(_check_indexing_method)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6499(min)\n", - " 83/24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:409()\n", - " 14 0.000 0.000 0.000 0.000 {method 'min' of 'numpy.ndarray' objects}\n", - " 312 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2043(freq)\n", - " 598 0.000 0.000 0.000 0.000 {built-in method builtins.id}\n", - " 79 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:283(_acquire_restore)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12381(min)\n", - " 242 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1687(__eq__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:245(_pad_or_backfill)\n", - " 144 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:319(jump)\n", - " 93 0.000 0.000 0.000 0.000 {method 'transpose' of 'numpy.ndarray' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/weakref.py:585(__call__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:359(build_response)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1657(_get_level_number)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:407(__rsub__)\n", - " 76 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:111(is_annotated)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:11575(_reduce_axis1)\n", - " 46 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:132(geterr)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:389(is_na)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:183(_make_sorted_values)\n", - " 84 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1266(_is_dunder)\n", - " 91 0.000 0.000 0.000 0.000 {built-in method builtins.min}\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:466(array_equivalent)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:1174(_close_pool_connections)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1216(_get_rows_with_mask)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:935(_expand_ellipsis)\n", - " 130 0.000 0.000 0.000 0.000 {built-in method _thread.allocate_lock}\n", - " 21 0.000 0.000 0.000 0.000 :71(join)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:342(construct_from_string)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4518(_check_inplace_and_allows_duplicate_labels)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12260(block_accum_func)\n", - " 367 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:1080(copyto)\n", - " 107 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:131()\n", - " 88 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:648(_colnames_from_description)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:43(_amin)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:1054(construct_from_string)\n", - " 71 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_utils.py:76(lenient_issubclass)\n", - " 79 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:280(_release_save)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:762(infer_dtype_from)\n", - " 69 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1181()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/utils.py:36(enforce_bus_hours)\n", - " 240 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:696(ndim)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:58(__new__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:942(format)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2955(__init__)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_weakrefset.py:85(add)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:11458(blk_func)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1728(duplicated)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2307(factorize)\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2285()\n", - " 1 0.000 0.000 0.000 0.000 {method 'connect' of '_socket.socket' objects}\n", - " 84 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1099(_parse_min_sec)\n", - " 27 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/weakref.py:427(__setitem__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2225(_handle_dbapi_exception)\n", - " 36 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7723(_unpack_nested_dtype)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:674(format)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:760(indexer_between_time)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1111(_values)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:858(pad_or_backfill_inplace)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/base.py:1428(factorize)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:560(_validate_scalar)\n", - " 92 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1571(_get_names)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:2249(isclose)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:644()\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:81(atleast_2d)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5818(head)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:2329(hfunc)\n", - " 291 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:344()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_ranges.py:24(generate_regular_range)\n", - " 80 0.000 0.000 0.000 0.000 {method 'put' of '_queue.SimpleQueue' objects}\n", - " 48 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/putmask.py:115(extract_bool_array)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:718(_reorder_by_uniques)\n", - " 94 0.000 0.000 0.000 0.000 {built-in method builtins.iter}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:3255(connect)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:494(_clean_keys_and_objs)\n", - " 238 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:974(dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:223(unique)\n", - " 57 0.000 0.000 0.000 0.000 {method 'groupdict' of 're.Match' objects}\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:61(merge_setting)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:1714(na_accum_func)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:132(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:167()\n", - " 3 0.000 0.000 0.000 0.000 {built-in method _operator.sub}\n", - " 2 0.000 0.000 0.000 0.000 {method 'fetch_fields' of '_mysql_connector.MySQL' objects}\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1689()\n", - " 53 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:865(_references)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/__extensions__.py:93(equity)\n", - " 286 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1081(codes)\n", - " 66 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:99(freq)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/accessors.py:70(_get_values)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:480()\n", - " 465 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:363(ndim)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:1148(take)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4585(_is_view)\n", - " 69 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1165(_check_deprecated_callable_usage)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:1547(check_below_min_count)\n", - " 19 0.000 0.000 0.000 0.000 :771(get)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:1436(date)\n", - " 47 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:230(_can_hold_na)\n", - " 477 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6672(_maybe_cast_indexer)\n", - " 88 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:265(_engine_type)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1417()\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1798()\n", - " 248 0.000 0.000 0.000 0.000 {method 'group' of 're.Match' objects}\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/common.py:103(_maybe_match_name)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/concat.py:52(concat_compat)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/astype.py:56(_astype_nansafe)\n", - " 94 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:482()\n", - " 308 0.000 0.000 0.000 0.000 {method '__exit__' of '_thread.RLock' objects}\n", - " 390/389 0.000 0.000 0.000 0.000 {method 'encode' of 'str' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/_optional.py:85(import_optional_dependency)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/base.py:294(is_dtype)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:322(_get_block_for_concat_plan)\n", - " 15 0.000 0.000 0.000 0.000 {method '__reduce_ex__' of 'object' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7406(min)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1954(get_rows_with_mask)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6137(_align_for_op)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/timedeltas.py:149(__new__)\n", - " 27 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:346(shape)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:404(__radd__)\n", - " 75 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:4036()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:40(__init__)\n", - " 74 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:322(weekday)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2100(clip)\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1327(__instancecheck__)\n", - " 498 0.000 0.000 0.000 0.000 {method 'copy' of 'dict' objects}\n", - " 338 0.000 0.000 0.000 0.000 {method 'items' of 'dict' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:317(__add__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1422(__sub__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:457(isin)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:507(maybe_prepare_scalar_for_op)\n", - " 85 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1030(axes)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:355(_concatenate_chunks)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:2706(_from_arrays)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:243(_from_values_or_dtype)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:430(_list_schema)\n", - " 69 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:241(is_single_block)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:204(get_netrc_auth)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:374(urlparse)\n", - " 49 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:2473(get_args)\n", - " 119 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:283(ismodule)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:1368(time)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2065(set_values)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:918(new_func)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1087(_slice)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1418(_literal_schema)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:564(_array_equivalent_object)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:242(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:573(__init__)\n", - " 207 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:1257(value)\n", - " 8 0.000 0.000 0.000 0.000 :941(update)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1126(_sub_datetimelike_scalar)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:122(put)\n", - " 74 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1056(_could_be_tzname)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:154(get)\n", - " 57 0.000 0.000 0.000 0.000 :405(parent)\n", - " 2 0.000 0.000 0.000 0.000 {method 'clip' of 'numpy.ndarray' objects}\n", - " 6 0.000 0.000 0.000 0.000 {built-in method _operator.truediv}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:363(_can_hold_element)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:883(_get_args_resolving_forward_refs)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:209(count_not_none)\n", - " 39 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/astype.py:249(astype_is_view)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:102()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1695()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:141(assemble_bulk_data_request)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:90(_clip)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:141(validate_kwargs)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:95(__init__)\n", - " 235 0.000 0.000 0.000 0.000 {method 'values' of 'dict' objects}\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:490(get)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:1835(construct_from_string)\n", - " 174 0.000 0.000 0.000 0.000 {built-in method numpy.core._multiarray_umath.normalize_axis_index}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1605(maybe_cast_to_integer_array)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:968(_pad_2d)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1324(_make_invoke_excepthook)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:354(validate_ascending)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method _operator.add}\n", - " 42 0.000 0.000 0.000 0.000 :121(__subclasscheck__)\n", - " 27 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:839()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:843(_hasna)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:879(infer_dtype_from_array)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:429(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:304(_get_filepath_or_buffer)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:124(extract_cookies_to_jar)\n", - " 68 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:158(_check_finalvar)\n", - " 45 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:72()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/container.py:14(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:351(_encode_target)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1512(_close_special)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:337(extend)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1377(__init__)\n", - " 79 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2752(need_slice)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1362(__add__)\n", - " 129 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1249(shape)\n", - " 42 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:209(_maybe_get_mask)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:202(union_indexes)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1730(_get_default_index_names)\n", - " 134 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:378(isfunction)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1667(_validate_integer)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2252()\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:480(is_view)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2567(_proxy_bypass_macosx_sysconf)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:82(f)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:352(na_logical_op)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:241(_from_sequence_not_strict)\n", - " 27 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_asarray.py:108()\n", - " 165 0.000 0.000 0.000 0.000 {method 'add' of 'set' objects}\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:643(name)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1158(_sub_datetimelike)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/dataclasses.py:1258(is_dataclass)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:3280(raw_connection)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1384(_checkin)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1342(is_complex_dtype)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2095(create_block_manager_from_blocks)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:946(_sorted_ids)\n", - " 4 0.000 0.000 0.000 0.000 {built-in method _operator.mul}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:808(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1725(can_hold_element)\n", - " 74 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:342(ampm)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/arraysetops.py:138(unique)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:441(connect)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:2228(construct_from_string)\n", - " 76 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:47(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:793(_add_offset)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:106(_encode_params)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/version/__init__.py:339(__init__)\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1602(__subclasscheck__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2037(_signature_bound_method)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:424(str_schema)\n", - " 169 0.000 0.000 0.000 0.000 {method '__enter__' of '_thread.RLock' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:761()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:105(__init__)\n", - " 69 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:941()\n", - " 125 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:300(ismethod)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:917(_finalize_fairy)\n", - " 69 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:148(__getattr__)\n", - " 107 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:126(_classes_and_not_datetimelike)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1255(_checkout)\n", - " 43 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:311(is_null_slice)\n", - " 243 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:153(concatenate)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:3689(equals)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:644(get_group_index_sorter)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:180()\n", - " 87 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1455()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:523(cython_operation)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:288()\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/string_.py:140(construct_from_string)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:271(validate_fillna_kwargs)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:469(_parse_headers)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:351(putheader)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/arraysetops.py:323(_unique1d)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:258(_get_conn)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:3108(cumprod)\n", - " 10 0.000 0.000 0.000 0.000 {built-in method today}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:606(formatTime)\n", - " 84 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:692(_constructor)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:533(_maybe_downcast)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:545(is_dataclass)\n", - " 119 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:480(iscode)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:164(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:2330(within_tol)\n", - " 39 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6277()\n", - " 90 0.000 0.000 0.000 0.000 {method 'item' of 'numpy.ndarray' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:127(__init__)\n", - " 63 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:401(_config_wrapper)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:990(sequence_to_td64ns)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_weakrefset.py:39(_remove)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:567(free_result)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:3023(replace)\n", - " 35 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:87(is_literal_type)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2410(wrap_default)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:2526(_set_grouper)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2586(get_values)\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:1745(currentframe)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1534(blk_func)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1561(findCaller)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:838(select_proxy)\n", - " 119 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:456(istraceback)\n", - " 413 0.000 0.000 0.000 0.000 {method 'isspace' of 'str' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:157(core_config)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:781(_call_soon)\n", - " 119 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:466(isframe)\n", - " 67 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:981()\n", - " 8 0.000 0.000 0.000 0.000 :778(__contains__)\n", - " 123 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:115(get_ref)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:310(_cython_op_ndim_compat)\n", - " 16/3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:99(all_literal_values)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:1165(_is_binary_mode)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:707(checkout)\n", - " 129 0.000 0.000 0.000 0.000 {method '__enter__' of '_thread.lock' objects}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:404(is_dataclass)\n", - " 4 0.000 0.000 0.000 0.000 {method 'free_result' of '_mysql_connector.MySQL' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:2103(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:137(__new__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/response.py:40(assert_header_parsing)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1570(_maybe_box_and_unbox_datetimelike)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:136(ones)\n", - " 36 0.000 0.000 0.000 0.000 {built-in method gc.get_referents}\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:215(_vhstack_dispatcher)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:813(str_schema)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:483(prepare_headers)\n", - " 69 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2772()\n", - " 154 0.000 0.000 0.000 0.000 {method 'upper' of 'str' objects}\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:345(to_key_val_list)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:1848(_wrap_result)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:592(get_content_type)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:410(fill_bool)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1765(_get_names)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1768(_set_names)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:354(_call_cython_op)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:331(_set_grouper)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:454(_get_time_micros)\n", - " 177 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:266(mgr_locs)\n", - " 174 0.000 0.000 0.000 0.000 {built-in method _operator.index}\n", - " 2 0.000 0.000 0.000 0.000 {method 'cumprod' of 'numpy.ndarray' objects}\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:949()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:405(_check_values_indices_shape_match)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/_policybase.py:319(header_fetch_parse)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:688(__call__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:943(urlencode)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:493(_wrap_result)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:157(_int64_cut_off)\n", - " 114 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:470(__getattr__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/errors.py:222(get_mysql_exception)\n", - " 172 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5558(_append_dispatcher)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:2208(__init__)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:106(_get_distinct_objs)\n", - " 69 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1180()\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:550(_is_master_process)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:307(_pad_or_backfill)\n", - " 44 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:992(_validate_key_length)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:902(_fillna_prep)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:238(_new_conn)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:251(handle_list_schema)\n", - " 68 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1133(_parsems)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:950(_validate_or_indexify_columns)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:521(cookiejar_from_dict)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1695(__hash__)\n", - " 275 0.000 0.000 0.000 0.000 {function FrozenList.__getitem__ at 0x119f0aa20}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:2557(_get_timestamp_range_edges)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:291(arrays)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:546(ensure_key_mapped)\n", - " 83 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1176(_maybe_disallow_fill)\n", - " 134 0.000 0.000 0.000 0.000 {method 'endswith' of 'str' objects}\n", - " 42 0.000 0.000 0.000 0.000 {built-in method _abc._abc_subclasscheck}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:331(putrequest)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:332(array)\n", - " 55 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:566(is_self_type)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:316(close)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1680(extract_cookies)\n", - " 46 0.000 0.000 0.000 0.000 {built-in method numpy.seterrobj}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:479(items)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:170()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:115(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:208(_maybe_unbox_datetimelike)\n", - " 98 0.000 0.000 0.000 0.000 {built-in method sys.getrefcount}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/times.py:25(to_time)\n", - " 4 0.000 0.000 0.000 0.000 {built-in method posix.cpu_count}\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Configuration.py:37(__setattr__)\n", - " 37 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:688(_sanitize_non_ordered)\n", - " 172 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1764(_ravel_dispatcher)\n", - " 178 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1480(_clear_item_cache)\n", - " 63 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1046(nlevels)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1974(get_slice)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:3345(arguments_parameter)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:610(prepare_cookies)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:121(__init__)\n", - " 91 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:398(__get_result)\n", - " 57 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1206(daemon)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:336(_get_annual_rule)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/putmask.py:62(putmask_without_repeat)\n", - " 55 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:557(is_generic_alias)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4060(_get_fill_indexer)\n", - " 238 0.000 0.000 0.000 0.000 {method 'is_finite' of 'decimal.Decimal' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/accessor.py:220(__get__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:140(_from_backing_data)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:487()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1933(to_numpy)\n", - " 199 0.000 0.000 0.000 0.000 {method 'pop' of 'dict' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1103(putrequest)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:164(hostname)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1259(putheader)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:398(validate_inclusive)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:1191(_get_splitter)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/_policybase.py:289(_sanitize_header)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:289(ydiffs)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:2364(with_default_schema)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:140(get_cookie_header)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:1038(handle_unread_result)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/exc.py:604(instance)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2567(push)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:125(f)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/utils/filters.py:8(filter_inputs)\n", - " 47 0.000 0.000 0.000 0.000 :41(_get_sep)\n", - " 42 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2738(is_label_like)\n", - " 3 0.000 0.000 0.000 0.000 {method 'cumsum' of 'numpy.ndarray' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12530(rolling)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:849(_list_to_arrays)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2623(_infer_tz_from_endpoints)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:158()\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:915(__array__)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:622(convert)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:505(parent_header)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:243(get_payload)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:546(request_url)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7469(max)\n", - " 69 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2781()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:5565(_reindex_output)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:366(notify)\n", - " 114 0.000 0.000 0.000 0.000 {method 'toordinal' of 'datetime.date' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:182(_make_key_to_index)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5676()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:679(_init_length)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:229(_convert_obj)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:974(close)\n", - " 109 0.000 0.000 0.000 0.000 {method 'release' of '_thread.lock' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:108()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:369(__init__)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:306(is_named_tuple)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:34(__str__)\n", - " 27 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/weakref.py:369(remove)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:751(checkin)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:2472(union_schema)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:324(slice_block_columns)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:553(equals)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:724()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:957(getaddrinfo)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:1314(fetchall)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6380(_consolidate)\n", - " 92 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:217(_scalar_type)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/computation/expressions.py:246(where)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:196(mgr_to_mgr)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:658(__init__)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1096(_can_fast_transpose)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1881(nonzero)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:735(_error_catcher)\n", - " 46 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1665()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ipaddress.py:1286(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:318()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:255(get)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:127(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:182(close)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:939(_sort_idx)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:616(get_content_maintype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:159(resolve_redirects)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:638(__array__)\n", - " 99 0.000 0.000 0.000 0.000 {built-in method time.monotonic}\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:540()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:541(to_numpy)\n", - " 99 0.000 0.000 0.000 0.000 {built-in method _thread.get_ident}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1599(make_cookies)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/errors.py:46(__init__)\n", - " 12 0.000 0.000 0.000 0.000 {built-in method _operator.invert}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:543(_allrows)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:862(codes)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:35(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:436(_split)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/shape_base.py:1185(tile)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:901(quote_plus)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:742(_get_axes)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:470()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/computation/expressions.py:172(_where_standard)\n", - " 2 0.000 0.000 0.000 0.000 :229(expanduser)\n", - " 49 0.000 0.000 0.000 0.000 {method 'join' of 'str' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:935(_verify_integrity)\n", - " 79 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:660(_constructor)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:185()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/events.py:35(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:220(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5134(array)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:255(__init__)\n", - " 2 0.000 0.000 0.000 0.000 {method 'searchsorted' of 'numpy.ndarray' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/accessors.py:611(__new__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:457(__neg__)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:373(inner)\n", - " 108 0.000 0.000 0.000 0.000 {method 'append' of 'collections.deque' objects}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:940(date_schema)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:83(is_callable_type)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:82(frame_apply)\n", - " 3 0.000 0.000 0.000 0.000 {method 'put' of 'numpy.ndarray' objects}\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2066(_get_level_values)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:471(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/getlimits.py:685(__init__)\n", - " 1 0.000 0.000 0.000 0.000 {method 'sort' of 'numpy.ndarray' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/plugin/_loader.py:21(get_plugins)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:451(_return_conn)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2582(array_values)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:1789(_adjust_binner_for_upsample)\n", - " 87 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5364(_insert_dispatcher)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:240(init_poolmanager)\n", - " 92 0.000 0.000 0.000 0.000 {built-in method numpy.geterrobj}\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:446(__exit__)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/typing_extensions.py:1132(is_typeddict)\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:207(_arrays_for_stack_dispatcher)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:639(group_keys_seq)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:499(close)\n", - " 70 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:360(convertyear)\n", - " 30 0.000 0.000 0.000 0.000 {method 'rfind' of 'str' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:409(iscoroutinefunction)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:381()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/impl.py:144(_do_return_conn)\n", - " 6 0.000 0.000 0.000 0.000 {built-in method _operator.and_}\n", - " 63 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:575(is_set)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:194(_is_internal_frame)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:157(clean_fill_method)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:2134(_fetchall_impl)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2155()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:137(hasnans)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:3002()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ipaddress.py:1187(_ip_int_from_string)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:446(_init_decoder)\n", - " 87 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1389(_moveaxis_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:273(fields)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:2426(nullable_schema)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:169(_get_cython_function)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:835(_local_timestamps)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:167(get_annotations)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1721()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:495(_real_close)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:847(quote)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:259(__getitem__)\n", - " 48 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:1073(clean_reindex_fill_method)\n", - " 27 0.000 0.000 0.000 0.000 {method 'difference_update' of 'set' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:454(__exit__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/pivot.py:493(_convert_by)\n", - " 92 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:892(bincount)\n", - " 63 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1725(__eq__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:95(_default_key_normalizer)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:1130(fetchall)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:642()\n", - " 3 0.000 0.000 0.000 0.000 {built-in method time.localtime}\n", - " 63 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:2374(_array_equal_dispatcher)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1069(_is_homogeneous_type)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/queue.py:132(put)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:26(lookback)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:686()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/retry.py:202(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:794(_set_axis_nocheck)\n", - " 2 0.000 0.000 0.000 0.000 {method 'any' of 'numpy.generic' objects}\n", - " 2 0.000 0.000 0.000 0.000 :16(exists)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:794(close)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/utils.py:52(_has_surrogates)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/_policybase.py:301(header_source_parse)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:213(_read_headers)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6270()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1261(__init__)\n", - " 70 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:402(has_year)\n", - " 33 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1122()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:315(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:464(get_array_op)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:598(collect_definitions)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/base.py:115(__eq__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1062(levshape)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:396(build_connection_pool_key_attributes)\n", - " 36 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1463()\n", - " 1 0.000 0.000 0.000 0.000 {method 'sendall' of '_socket.socket' objects}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:470(any_schema)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:391(_has_code_flag)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:1868(_validate)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2209(_safe_close_cursor)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:922(acquire)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:363(_repeater)\n", - " 3 0.000 0.000 0.000 0.000 {built-in method time.strftime}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1192(is_alive)\n", - " 69 0.000 0.000 0.000 0.000 {method 'rpartition' of 'str' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/times.py:67(_convert_listlike)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/generic.py:2015(_wrap_agged_manager)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:199(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:100(push)\n", - " 3 0.000 0.000 0.000 0.000 :140(basename)\n", - " 1 0.000 0.000 0.000 0.000 {function socket.close at 0x102042160}\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:127(__next__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_common.py:27(_init_wait_gen)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:191(_validate_parse_dates_presence)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1467(debug)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:134(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:303(makefile)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:5607()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:90(_urllib3_request_context)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:205(_hostinfo)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:46(__setitem__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:525(get_all)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1524(__init__)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:373(is_sequence)\n", - " 49 0.000 0.000 0.000 0.000 {method 'remove' of 'collections.deque' objects}\n", - " 4 0.000 0.000 0.000 0.000 {built-in method _operator.inv}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1627(_get_options_with_defaults)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:505(get_rename_function)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1685(_clean_options)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:34(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:445(unit)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:756(_shallow_copy)\n", - " 108 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:186(__iter__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1356(add_cookie_header)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method posix.stat}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4027(_iter_column_arrays)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:119(_coerce_args)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:635(release_conn)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/impl.py:153(_do_get)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:354(__array__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1731(__hash__)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:302(add)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_known_annotated_metadata.py:121(expand_grouped_metadata)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:159()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/exc.py:692(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:900(default_headers)\n", - " 59 0.000 0.000 0.000 0.000 {built-in method posix.fspath}\n", - " 3 0.000 0.000 0.000 0.000 :773(getenv)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:8084(_align_for_op)\n", - " 85 0.000 0.000 0.000 0.000 {method 'discard' of 'set' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1959(maybe_mangle_lambdas)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:516(close)\n", - " 3 0.000 0.000 0.000 0.000 :117(splitext)\n", - " 71 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:213()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:536(close)\n", - " 63 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:211(tail)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/equity.py:307(price)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/roperator.py:14(rsub)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:4039()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:191(identify_interval)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:211(_simple_new)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:1204(is_potential_multi_index)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:350(_get_quarterly_rule)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/from_thread.py:170(_check_running)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:137(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:588(prepare_auth)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:358(_prep_values)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:672(_is_view_after_cow_rules)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:423(repeat)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:215(extract_numeric_value)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:230(_handle_eof)\n", - " 39 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:206(_should_unflatten_callable_args)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:884(keys)\n", - " 11 0.000 0.000 0.000 0.000 {method '_acquire_restore' of '_thread.RLock' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:76(copy)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method from_bytes}\n", - " 4 0.000 0.000 0.000 0.000 {built-in method _operator.pow}\n", - " 1 0.000 0.000 0.000 0.000 {built-in method _socket.getaddrinfo}\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:983(is_in_axis)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:788()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:219(mask_all)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2738(_check_indexing_error)\n", - " 35 0.000 0.000 0.000 0.000 {method 'rstrip' of 'str' objects}\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:845(unread_result)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:677(_constructor_expanddim)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:578(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:139()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:296(_put_conn)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:440(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5649(_needs_reindex_multi)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:791(_autobegin)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:209(is_object)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:886()\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:923(quote_from_bytes)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/queue.py:174(get)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/putmask.py:29(putmask_inplace)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:388()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:173(extract_numeric_value)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:658(formatMessage)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2512(cumsum)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:106(keys)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:81(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:284(mdiffs)\n", - " 77 0.000 0.000 0.000 0.000 {method 'end' of 're.Match' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/utils.py:268(identify_sig_or_bom)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:1129(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:263(_remove_path_dot_segments)\n", - " 5 0.000 0.000 0.000 0.000 {method 'astype' of 'numpy.generic' objects}\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1686(name)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:984()\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copyreg.py:104(__newobj__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:128(_check_for_invalid_keys)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Configuration.py:29(__getattr__)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:1454(__init__)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:587()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:850(_maybe_mask_results)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:1034(check_header_validity)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:49(_check_for_default_values)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:303()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:735(unwrap)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:168()\n", - " 45 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:51(origin_is_union)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:1009(__getitem__)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2577(is_view)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:795(begin)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1992(_validate_index_level)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:419(_close_conn)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:947()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:641(fill_missing_names)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4017(_get_column_array)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:1018(get_auth_from_url)\n", - " 27 0.000 0.000 0.000 0.000 {method 'update' of 'dict' objects}\n", - " 178 0.000 0.000 0.000 0.000 {built-in method builtins.ord}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/log.py:101(_should_log_debug)\n", - " 27 0.000 0.000 0.000 0.000 {built-in method sys._getframe}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:201(_set_noconvert_columns)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:531(validate_ordered)\n", - " 42 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:178()\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:51(__getitem__)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1340()\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2294()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7704(get_unanimous_names)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:594(_bool_arith_check)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/inspection.py:113(inspect)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:638(_passed_categorical)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:822(reset)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/pivot.py:173()\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1357(__getattr__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:469()\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7652(ensure_has_len)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:1532(_soft_close)\n", - " 9 0.000 0.000 0.000 0.000 {built-in method fromkeys}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1026(iget_values)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:267(clear)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:219(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:303(_normalize_host)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:692(levels)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/calendar.py:122(monthrange)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1472()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:416(_resolve_output)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1544(log)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/functools.py:65(wraps)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:3176(ndim)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:426(__init__)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method _operator.gt}\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:696(names)\n", - " 1 0.000 0.000 0.000 0.000 {method 'close' of '_io.BufferedReader' objects}\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:251(put)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:195(deltas)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:849(__init__)\n", - " 105 0.000 0.000 0.000 0.000 {method 'locked' of '_thread.lock' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:397(ensure_np_dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/base.py:2411(_quote_free_identifiers)\n", - " 45 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:592(groupings)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:170(parent_frame_namespace)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:447(format)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:202(_maybe_reindex_columns_na_proxy)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:514(_collect_metadata)\n", - " 2 0.000 0.000 0.000 0.000 {method 'all' of 'numpy.generic' objects}\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:1095(__new__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:136(_codes_to_ints)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:248(_qsize)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:764(categories)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:722(_result_index)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:1045(_validate_header_part)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1671(is_all_strings)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:774(get_proxy)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ipaddress.py:1213(_parse_octet)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:228(_acquireLock)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:677()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2678(__init__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1076()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:3750(definitions_schema)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/base.py:445(__get__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/accessors.py:59(__init__)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:479(__repr__)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1061()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:143(clear)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:221()\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:131(is_new_type)\n", - " 59 0.000 0.000 0.000 0.000 {method 'weekday' of 'datetime.date' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/sql/schema.py:5357(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:231(_fix)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:77(readline)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1990(__exit__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:652(usesTime)\n", - " 36 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1479()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:389(standardize_mapping)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:773(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/base.py:2414()\n", - " 8 0.000 0.000 0.000 0.000 :790(items)\n", - " 26 0.000 0.000 0.000 0.000 {built-in method posix.getpid}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_sync.py:10(_call_handlers)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/encodings/idna.py:145(encode)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:929(release)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:1206(literal_schema)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:84()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:305(_connection_insp)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:509(urlunparse)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:665(_get_registered_option)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:136(reset)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1622(close)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:1248(python_charset)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/methods/to_dict.py:155()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/version/__init__.py:520(_cmpkey)\n", - " 6 0.000 0.000 0.000 0.000 {built-in method now}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:440(_format)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:3386(arguments_schema)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:483(_view)\n", - " 23 0.000 0.000 0.000 0.000 {method 'write' of '_io.StringIO' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/importlib/__init__.py:108(import_module)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:109(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:966(_selected_obj)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:1149(_normalize_host)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1980(shape)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/connection.py:93(_set_socket_options)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:948()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:542(merge_cookies)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:891(_get_first_arg_or_any)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:751()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:410(_is_comparable_dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/equity.py:65(fundamental)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1394(__hash__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:99(_intenum_converter)\n", - " 9 0.000 0.000 0.000 0.000 {method '_checkReadable' of '_io._IOBase' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/exc.py:477(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:475(any_extension_types)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:781(close)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:374(_is_business_daily)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:93(__init__)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:999(is_in_obj)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:348(_get_timeout)\n", - " 17 0.000 0.000 0.000 0.000 {method 'acquire' of '_thread.RLock' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Context.py:124(clear_context)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:660(requote_uri)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2700(_connection_begin_impl)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:571(_disallow_mismatched_indexing)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:383(is_closed)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:58()\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:837(result_set_available)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2220(_can_hold_na)\n", - " 3 0.000 0.000 0.000 0.000 :121(_splitext)\n", - " 16 0.000 0.000 0.000 0.000 {built-in method time.time}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:630(prepare_hooks)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/langhelpers.py:1138(__get__)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:1080(_is_label_like)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:1066(get_fill_func)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:400()\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:584()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:3445(call_schema)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:248(stringify_path)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1720(getEffectiveLevel)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:100(__new__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/sql/compiler.py:7475(quote_identifier)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1730()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/handlers.py:354(shouldRollover)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:196()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:424(close)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:206(get_module_ns_of)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:922(_maybe_infer_dtype_type)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:91(is_deprecated_instance)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:205(_effective_processors)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1398(_reset)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2416(_all_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:107(get_redirect_target)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/base.py:183(_for_instance)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:497(_extract_metadata)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6537()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1269(set_inplace)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:2133(_refine_defaults_read)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:84(__init__)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:237(_releaseLock)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:1135(_splitport)\n", - " 10 0.000 0.000 0.000 0.000 {method 'index' of 'list' objects}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1227(deepvalues)\n", - " 11 0.000 0.000 0.000 0.000 {method '_release_save' of '_thread.RLock' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:362(_make_index)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:691(__del__)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:572(is_required)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:693(_get_result_dim)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2730(annotation)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:403()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1094()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:164()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:228(_construct)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Configuration.py:18(initialize_configuration)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:886(inner)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/retry.py:242()\n", - " 42 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:290(_add_custom_serialization_from_json_encoders)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:432(usesTime)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:534()\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:937()\n", - " 37 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2722(name)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:263(day_deltas)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:57(__iter__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/constants.py:320(raise_warning_against_deprecated_cursor_class)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1091(_begin_impl)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:539(get_encoding_from_headers)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:198()\n", - " 35 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2734(kind)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:799(mount)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:183(maybe_box_native)\n", - " 7 0.000 0.000 0.000 0.000 {method 'write' of '_io.BytesIO' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/getlimits.py:696(min)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1698()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/extension.py:153(_isnan)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:502(enter_context)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:655(_constructor)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:234(_disallow_mismatched_datetimelike)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:1465(list_schema)\n", - " 9 0.000 0.000 0.000 0.000 :52(normcase)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:601(_set_noconvert_dtype_columns)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:781(get_adapter)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/calendar.py:115(weekday)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_schema_generation_shared.py:72(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:240(_validate_numeric_only)\n", - " 2 0.000 0.000 0.000 0.000 {method 'readlines' of '_io._IOBase' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:390(_check_close)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:207(register_hook)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:494(prepare_body)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6055(_check_indexing_error)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:251(_put)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:194(close)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:174(not_none)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/response.py:9(is_fp_closed)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:1233(dedup_names)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4306(_validate_can_reindex)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/base.py:180(_for_class)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:123(getLevelName)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:164(host)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager.py:334()\n", - " 28 0.000 0.000 0.000 0.000 {method '__contains__' of 'frozenset' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:769(is_redirect)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:258(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:811(_newname)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:238(is_int64_overflow_possible)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:841(fetchall)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:376(dtype)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:188(clone)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:138(_event_pipe)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/log.py:104(_should_log_info)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/numpy/function.py:223(validate_cum_func_with_skipna)\n", - " 6 0.000 0.000 0.000 0.000 {method 'fullmatch' of 're.Pattern' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/cd.py:291(merge_coherence_ratios)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6357(_protect_consolidate)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1331(dtype)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:916()\n", - " 1 0.000 0.000 0.000 0.000 {method 'setsockopt' of '_socket.socket' objects}\n", - " 2 0.000 0.000 0.000 0.000 {method 'settimeout' of '_socket.socket' objects}\n", - " 1 0.000 0.000 0.000 0.000 :1192(_gcd_import)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:254(_get)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:29(_splitparam)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1619(executemany)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:884(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:871(_do_date_conversions)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1643(reconstruct_func)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:619(categories)\n", - " 2 0.000 0.000 0.000 0.000 {method 'repeat' of 'numpy.ndarray' objects}\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1847()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/hooks.py:15(default_hooks)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:172(_validate)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:187(_get_fill_value)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1215(enforce_interval)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:95(literal_values)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:265(_find_common_index_dtype)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:452(_no_nep50_warning)\n", - " 13 0.000 0.000 0.000 0.000 {method 'capitalize' of 'str' objects}\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/command_runner.py:470(user_settings)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:195()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:350(_maybe_make_multi_index_columns)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:172(from_float)\n", - " 28 0.000 0.000 0.000 0.000 {method 'isidentifier' of 'str' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:633(is_builtin_func)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1903()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:550(infer_compression)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:982()\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2974(_prod_dispatcher)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:56(__init__)\n", - " 17 0.000 0.000 0.000 0.000 {method 'release' of '_thread.RLock' objects}\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:507(set_raw)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:282(query_attrs)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:382(_insert_on_column)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/methods/to_dict.py:160()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/attr.py:389(__bool__)\n", - " 33 0.000 0.000 0.000 0.000 {method 'partition' of 'str' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:175(port)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:585(_ensure_2d)\n", - " 3 0.000 0.000 0.000 0.000 {function SocketIO.close at 0x102042f20}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5486()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:105(is_file_like)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1721()\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/util.py:19(to_str)\n", - " 22 0.000 0.000 0.000 0.000 {method 'get' of '_contextvars.ContextVar' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:266()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/weakref.py:568(__init__)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:172()\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:743(readable)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:167()\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:661(_ilevel)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:987(__init__)\n", - " 14 0.000 0.000 0.000 0.000 {method 'find' of 'str' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:52(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:692(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:478()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:191(_server_status)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/getlimits.py:709(max)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method builtins.locals}\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1474()\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1021(_argsort_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/_concurrency_py3k.py:61(is_exit_exception)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:102(__setitem__)\n", - " 11 0.000 0.000 0.000 0.000 {method 'startswith' of 'bytes' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:405(_types_namespace)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_common.py:17(_maybe_call)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/utils.py:368(cut_sequence_chunks)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:223(__len__)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:353()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:657()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7717()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/langhelpers.py:1224(_set_memoized_attribute)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:443(__enter__)\n", - " 5 0.000 0.000 0.000 0.000 {method 'subn' of 're.Pattern' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1201()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:2352(_adjust_bin_edges)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:815(filter)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:95(__getitem__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/base.py:137(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:532(_still_open_and_dbapi_connection_is_valid)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2726(default)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:698()\n", - " 22 0.000 0.000 0.000 0.000 {built-in method builtins.abs}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/request.py:189(body_to_chunks)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:694()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:85(path_url)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:229(__iter__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:304(merge_incomplete_data_in_cache)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:194(_handle_warnings)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1674(_check_file_or_buffer)\n", - " 14 0.000 0.000 0.000 0.000 {method 'setdefault' of 'dict' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:204()\n", - " 10 0.000 0.000 0.000 0.000 {method 'count' of 'list' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:126(language)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:150(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:249(_get_output_shape)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:276(append)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:632(ordered)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:358(update)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/base.py:187(_join)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:520(urlunsplit)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:447(isclosed)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:574(is_zoneinfo_type)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:278(prepare_config)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:69(close)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:7045(_deprecate_downcast)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/utils.py:189(check_single_item)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:254(__new__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:426(_get_window_indexer)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:819(get_connection)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/errors/__init__.py:535(_check_cacher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1734(clear_expired_cookies)\n", - " 3 0.000 0.000 0.000 0.000 {method 'send' of 'generator' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:336(_na_ok_dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:829(warning_count)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1793()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/utils.py:28(eod)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:1117(_maybe_memory_map)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:261(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/exc.py:48(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:520(convert_to_list_like)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/mysqlconnector.py:145(is_disconnect)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1028(_output)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1753(__iter__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:367()\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1828(ndim)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/replace.py:31(should_use_regex)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/version/__init__.py:348()\n", - " 6 0.000 0.000 0.000 0.000 {built-in method _contextvars.copy_context}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:534(_push_cm_exit)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:334(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:126(resolve_default_timeout)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/concat.py:73()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/util/numba_.py:18(maybe_use_numba)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/retry.py:387(is_retry)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/database/SQLHelpers.py:46(get_engine)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1487(__getattr__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2721(is_nested_tuple)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:515(get_compression_method)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:314()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:805()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5495()\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:248(__len__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:330(_sanitize_and_check)\n", - " 14 0.000 0.000 0.000 0.000 {method 'lstrip' of 'str' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1329(result_index)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:553(nblocks)\n", - " 9 0.000 0.000 0.000 0.000 {method '_checkClosed' of '_io._IOBase' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:1079(closed)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:166(__setattr__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:279(_extract_multi_indexer_columns)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:369(should_store)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1658(no_parameters)\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:77(_atleast_2d_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method builtins.round}\n", - " 1 0.000 0.000 0.000 0.000 :1165(_find_and_load)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:351(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:230(_slice_axis_for_step)\n", - " 11 0.000 0.000 0.000 0.000 {method 'strip' of 'str' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:121(pushlines)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:370()\n", - " 3 0.000 0.000 0.000 0.000 {method 'tolist' of 'numpy.ndarray' objects}\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:520(can_consume_results)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:717(index)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1836(build_name_format)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1408()\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:151(end_date)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2516(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/numpy/function.py:159(validate_argsort_with_ascending)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:305(loc)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:212()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:518(_check_closed)\n", - " 8 0.000 0.000 0.000 0.000 :812(__init__)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:1131(putmask)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:176(dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/Requests.py:172(__init__)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2474(validate_periods)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1066(_get_arithmetic_result_freq)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1240(determine_table_agg)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method sys.exc_info}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:2139(_codes)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:245(read_timeout)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5168(_delete_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:799(iter_content)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:338(astype)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:291(__iter__)\n", - " 1 0.000 0.000 0.000 0.000 {method 'fetch_row' of '_mysql_connector.MySQL' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:195(_new_message)\n", - " 1 0.000 0.000 0.000 0.000 {method 'throw' of 'generator' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1128(value_getitem)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:494(dtype)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:369()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/constants.py:993(get_info)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6390()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:1125(_time_to_micros)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1297(_cookie_attrs)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:12(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:93()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:188(all_none)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:156(username)\n", - " 5 0.000 0.000 0.000 0.000 {method 'replace' of 'str' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:199(could_be_from_charset)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/mysqlconnector.py:53(_escape_identifier)\n", - " 13 0.000 0.000 0.000 0.000 {method '_is_owned' of '_thread.RLock' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:128()\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:222()\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:346(where)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4367(igetitem)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1319(disable)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/queue.py:225(_full)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:368(getMessage)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/helpers/utils.py:10(verify_ticker)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1979(nlevels)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:374(_merge_pool_kwargs)\n", - " 3 0.000 0.000 0.000 0.000 {method 'total_seconds' of 'datetime.timedelta' objects}\n", - " 3 0.000 0.000 0.000 0.000 {method 'values' of 'mappingproxy' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:244(__init__)\n", - " 3 0.000 0.000 0.000 0.000 {method 'items' of 'mappingproxy' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:304(cert_verify)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:436(flush)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:320(__len__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:732(__call__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7719()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:207(validate_header_arg)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:1269(_process_date_conversion)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1152(name)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:217()\n", - " 5 0.000 0.000 0.000 0.000 {method 'reverse' of 'list' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:706()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:252(_init_connection)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:472(__init__)\n", - " 6 0.000 0.000 0.000 0.000 {method 'getvalue' of '_io.BytesIO' objects}\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/_internal_utils.py:25(to_native_string)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:1229()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:202(start_connect)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:139(ticker)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:393(prepare_method)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:175()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:441(maybe_cast_pointwise_result)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:636(unquote_unreserved)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:850(more_results)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:277()\n", - " 7 0.000 0.000 0.000 0.000 {method 'rstrip' of 'bytes' objects}\n", - " 5 0.000 0.000 0.000 0.000 {method 'count' of 'bytes' objects}\n", - " 1 0.000 0.000 0.000 0.000 {method 'issuperset' of 'frozenset' objects}\n", - " 1 0.000 0.000 0.000 0.000 :815(__len__)\n", - " 18 0.000 0.000 0.000 0.000 {method 'popleft' of 'collections.deque' objects}\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:465(_decode)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:580(_get_axis_name)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2070()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:205()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:186(_from_factorized)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:814(_get_refs_and_copy)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/hooks.py:16()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_wait_gen.py:7(expo)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:514(_parse_content_type_header)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:1123(_make_date_converter)\n", - " 1 0.000 0.000 0.000 0.000 {method 'flatten' of 'numpy.ndarray' objects}\n", - " 1 0.000 0.000 0.000 0.000 :2(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:535(temp_setattr)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2180(_ensure_matching_resos)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:250(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/utils.py:121(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1720(_value_and_type_iter)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:303()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:211(is_multipart)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:1426(_validate_parse_dates_arg)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1251(_validate_host)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:208(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:215(_check_window_bounds)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:709(inferred_type)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/command_runner.py:465(system_settings)\n", - " 5 0.000 0.000 0.000 0.000 {method 'decode' of 'bytearray' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:659(unquote)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/shape_base.py:1257()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6061(_should_fallback_to_positional)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:130(_validate_timeout)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:91(ensure_python_int)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:439(_ensure_has_table_connection)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/queue.py:228(_put)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method _codecs.lookup}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/retry.py:379(_is_method_retryable)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/_collections.py:147(__new__)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:1954(get_debug)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:315(__getattr__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:392(ensure_dtype_objs)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:398()\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:669(result_type)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:518(__repr__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:421(lexsort)\n", - " 3 0.000 0.000 0.000 0.000 {method 'write' of '_io.TextIOWrapper' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/functools.py:421(_unwrap_partial)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:343()\n", - " 9 0.000 0.000 0.000 0.000 {method 'values' of 'collections.OrderedDict' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/queue.py:231(_get)\n", - " 4 0.000 0.000 0.000 0.000 {method 'groups' of 're.Match' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/multiprocessing/process.py:37(current_process)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2688(_deactivate_from_connection)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:140(__init__)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method fromisoformat}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:403(retries)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1047(_get_i8_values_and_mask)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:108(_noop)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:101(is_holiday)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/base.py:346(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:309(_operation_context)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:193(_userinfo)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/_optional.py:74(get_version)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:141(is_re)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2564(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2583(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/multiprocessing/process.py:189(name)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1877(_nonzero_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:315(step)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:212()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:607(consolidate)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:3015(parameters)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:125(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/_internal_utils.py:38(unicode_is_ascii)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:331(set_payload)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:330()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1256(determine_requested_columns)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2687(_max_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:460(tolist)\n", - " 1 0.000 0.000 0.000 0.000 :1()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/objects.py:72(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:333(tail)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:211()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/hooks.py:22(dispatch_hook)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:687(is_closed)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:60(__len__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:918(_wrap_ipv6)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:330(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:770(_maybe_check_integrity)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/putmask.py:129(setitem_datetimelike_compat)\n", - " 2 0.000 0.000 0.000 0.000 {method 'pop' of 'collections.OrderedDict' objects}\n", - " 4 0.000 0.000 0.000 0.000 {method 'count' of 'str' objects}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/version/__init__.py:470(_parse_letter_version)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_request_methods.py:51(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/parser.py:17(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:91(merge_hooks)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1225(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:450(check_dtype_backend)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:539(_push_exit_callback)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3984(_should_partial_index)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1243(_validate_path)\n", - " 4 0.000 0.000 0.000 0.000 {built-in method sys.getrecursionlimit}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:643(__enter__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:893(_check_data_length)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7718()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:489(_decref_socketios)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:194(_values_for_factorize)\n", - " 6 0.000 0.000 0.000 0.000 {method 'pop' of 'set' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/connection.py:103(allowed_gai_family)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:511(f)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1038(in_transaction)\n", - " 1 0.000 0.000 0.000 0.000 {method 'set' of '_contextvars.ContextVar' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:231(_constructor)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:208(_pop_message)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1230(_encode_request)\n", - " 1 0.000 0.000 0.000 0.000 :1101(_sanity_check)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_common.py:28()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:88()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:417(_is_multiple)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:274(_create_data)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1989(index)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/request.py:134(set_file_position)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1290(_cookies_for_request)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:512(_validate_axis)\n", - " 2 0.000 0.000 0.000 0.000 {method 'update' of 'collections.OrderedDict' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:147(start_date)\n", - " 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:1221(_charset_id)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:146(dtype)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:92()\n", - " 2 0.000 0.000 0.000 0.000 {built-in method _weakref.proxy}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1234(_validate_method)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:131(close)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:856(columns)\n", - " 3 0.000 0.000 0.000 0.000 {method 'date' of 'datetime.datetime' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/version/__init__.py:149(__lt__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1445(is_valid)\n", - " 1 0.000 0.000 0.000 0.000 {method 'reset' of '_contextvars.ContextVar' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:567(connection)\n", - " 2 0.000 0.000 0.000 0.000 {method 'clear' of 'collections.OrderedDict' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:213()\n", - " 1 0.000 0.000 0.000 0.000 :315(__subclasshook__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/arraysetops.py:125(_unpack_tuple)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/numpy/function.py:383(validate_minmax_axis)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1355(common_dtype_categorical_compat)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:44(_debug)\n", - " 1 0.000 0.000 0.000 0.000 {method 'swapaxes' of 'numpy.ndarray' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:2365(_validate_skipfooter)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/calendar.py:102(isleap)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:255(_has_complex_date_col)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:351()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:895(_get_hostport)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_validate_call.py:51()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:194(__set_y)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12199()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/queue.py:222(_empty)\n", - " 4 0.000 0.000 0.000 0.000 {method 'items' of 'collections.OrderedDict' objects}\n", - " 1 0.000 0.000 0.000 0.000 {built-in method sys.getfilesystemencoding}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1567(_maybe_transpose_result)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:94(_process_parse_dates_argument)\n", - " 2 0.000 0.000 0.000 0.000 {method 'extend' of 'collections.deque' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:176()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/database/SQLHelpers.py:336(__init__)\n", - " 1 0.000 0.000 0.000 0.000 {method 'sort' of 'list' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:1447(is_index_col)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/version/__init__.py:534()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:2056(_clean_na_values)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:110(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:1110(get_warnings)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:540(closed)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:155(_check_executed)\n", - " 2 0.000 0.000 0.000 0.000 {method 'connected' of '_mysql_connector.MySQL' objects}\n", - " 2 0.000 0.000 0.000 0.000 {method 'split' of 'bytes' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_exceptions.py:15(rewrite_exception)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:227(connect_timeout)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:245(_init)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/container.py:59(_get_provider)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:3019(return_annotation)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/shape_base.py:1181(_tile_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:326()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:217(_from_selection)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:280(start)\n", - " 1 0.000 0.000 0.000 0.000 {method 'pop' of 'collections.deque' objects}\n", - " 4 0.000 0.000 0.000 0.000 {method 'seek' of '_io.StringIO' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:205(is_unique)\n", - " 5 0.000 0.000 0.000 0.000 {method 'isascii' of 'str' objects}\n", - " 1 0.000 0.000 0.000 0.000 {built-in method _codecs.lookup_error}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2096(_clip_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:364(_get_monthly_rule)\n", - " 2 0.000 0.000 0.000 0.000 {method 'truncate' of '_io.StringIO' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:216(_validate_dtype)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:743(set_environ)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:986(_validate_usecols_arg)\n", - " 2 0.000 0.000 0.000 0.000 {method 'st_server_status' of '_mysql_connector.MySQL' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:419(_repeat_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:159(_freeze)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1782(handle_extra_cols)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:467()\n", - " 1 0.000 0.000 0.000 0.000 {method 'consume_result' of '_mysql_connector.MySQL' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:891(default_user_agent)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method sys.audit}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:510()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:218()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:188(_expand_user)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:886()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:572(prepare_content_length)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:292(is_fsspec_url)\n", - " 1 0.000 0.000 0.000 0.000 {method 'warning_count' of '_mysql_connector.MySQL' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:117(info)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:1065(soft_close)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ipaddress.py:574(__int__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:462(_create_exit_wrapper)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:2267(_extract_dialect)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:235()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1232(enforce_inputs)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:295(is_closed)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:175(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:105(_box_func)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:4948(_needs_reindex_multi)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:11522()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:296(best)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:206()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:192()\n", - " 1 0.000 0.000 0.000 0.000 {method 'with_traceback' of 'BaseException' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1763(pre_exec)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/mysqlconnector.py:142(_extract_error_code)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:202(_selected_obj)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/errors.py:80(__str__)\n", - " 2 0.000 0.000 0.000 0.000 {method 'st_warning_count' of '_mysql_connector.MySQL' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:257(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:183(host)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2508(_cumsum_dispatcher)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:527(validate_integer)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:3104(_cumprod_dispatcher)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/version/__init__.py:508(_parse_local_version)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1986(_sort_levels_monotonic)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:546(invalidated)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:551()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/proxy.py:11(connection_requires_http_tunnel)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/sql/elements.py:5219(construct)\n", - " 1 0.000 0.000 0.000 0.000 {method 'more_results' of '_mysql_connector.MySQL' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:1448(__enter__)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method _socket.getdefaulttimeout}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/response.py:79()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:581(iter_slices)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:2486(reset)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:93(encoding)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:277(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:695(do_begin)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1803(handle_dbapi_exception)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:2245(_isclose_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:504(description)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1976(_shape_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:559(_validate_names)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/cd.py:305()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:124(__iter__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/arraysetops.py:133(_unique_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:3172(_ndim_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:191(_values_for_argsort)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:339(_validate_conn)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:247()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1771(post_exec)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:172(raw)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:578(add_headers)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:107(_copy_immutable)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:154(chaos)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method builtins.globals}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:87(get_new_headers)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:216()\n", - " 1 0.000 0.000 0.000 0.000 {function HTTPResponse.flush at 0x103e89260}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:451(__enter__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:317(is_consolidated)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:231(__enter__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1987(__enter__)\n", - "\n", - "\n", - "\n" - ] - } - ], - "source": [ - "## OderPicker.get_order\n", - "print(returned_order[1])" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Open_interestDatetime
Datetime
2023-02-03159092023020306:30:00
2023-02-06160472023020606:30:05
2023-02-07162132023020706:30:00
2023-02-08163652023020806:30:09
2023-02-09165222023020906:30:13
............
2023-12-22167732023122206:30:09
2023-12-26167422023122606:30:02
2023-12-27166452023122706:30:04
2023-12-28166202023122806:30:11
2023-12-29166642023122906:30:02
\n", - "

228 rows × 3 columns

\n", - "
" - ], - "text/plain": [ - " Open_interest Date time\n", - "Datetime \n", - "2023-02-03 15909 20230203 06:30:00\n", - "2023-02-06 16047 20230206 06:30:05\n", - "2023-02-07 16213 20230207 06:30:00\n", - "2023-02-08 16365 20230208 06:30:09\n", - "2023-02-09 16522 20230209 06:30:13\n", - "... ... ... ...\n", - "2023-12-22 16773 20231222 06:30:09\n", - "2023-12-26 16742 20231226 06:30:02\n", - "2023-12-27 16645 20231227 06:30:04\n", - "2023-12-28 16620 20231228 06:30:11\n", - "2023-12-29 16664 20231229 06:30:02\n", - "\n", - "[228 rows x 3 columns]" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from EventDriven.riskmanager.utils import get_cache" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'pending_tasks': 0,\n", - " 'max_queue_size': 100,\n", - " 'active_processes': 4,\n", - " 'total_processes': 4,\n", - " 'current_requests': {'SaveWorker-0': },\n", - " 'num_finished_requests': 0,\n", - " 'num_failed_requests': 0,\n", - " 'failed_initialization': 0}" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "_SaveManager.status()" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Loaded 224 requests from file\n", - "Loaded 206 unique requests\n" - ] - } - ], - "source": [ - "import json\n", - "def requests_from_jsonl():\n", - " reqs = []\n", - " with open('/Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/scheduler/requests.jsonl', 'r') as f:\n", - " for line in f:\n", - " line = line.strip()\n", - " if not line:\n", - " continue\n", - " k = json.loads(line)\n", - " if '_requests' in k:\n", - " k.pop('_requests')\n", - " reqs.append(k)\n", - " print(f\"Loaded {len(reqs)} requests from file\")\n", - " single = [req for req in reqs if req['type_'] == 'single']\n", - " bulk = [req for req in reqs if req['type_'] == 'bulk']\n", - " chain = [req for req in reqs if req['type_'] == 'chain']\n", - " reqs = single + bulk + chain\n", - " reqs = [dict(t) for t in {tuple(sorted(r.items())) for r in reqs}]\n", - " print(f\"Loaded {len(reqs)} unique requests\")\n", - " return reqs\n", - "reqs = requests_from_jsonl()" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[{'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 115.0,\n", - " 'tick': 'AMZN',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 303.33,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 500.0,\n", - " 'tick': 'NFLX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2025-01-17',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 145.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2024-01-19',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2024-01-19',\n", - " 'strike': 135.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2024-01-19',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2024-01-19',\n", - " 'strike': 107.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2024-01-19',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2024-01-19',\n", - " 'strike': 150.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 150.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-12-27 00:00:00',\n", - " 'strike': 690.0,\n", - " 'tick': 'COST',\n", - " 'type_': 'single'},\n", - " {'end': '2024-01-19',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2024-01-19',\n", - " 'strike': 106.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 190.0,\n", - " 'tick': 'NVDA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-05-25 00:00:00',\n", - " 'strike': 205.0,\n", - " 'tick': 'NVDA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2025-01-17',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 135.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19 00:00:00',\n", - " 'print_info': False,\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'tick': 'SBUX',\n", - " 'type_': 'bulk'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 120.0,\n", - " 'tick': 'AMZN',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 720.0,\n", - " 'tick': 'COST',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19 00:00:00',\n", - " 'print_info': False,\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'tick': 'AMD',\n", - " 'type_': 'bulk'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 230.0,\n", - " 'tick': 'NVDA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 440.0,\n", - " 'tick': 'NFLX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 185.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 480.0,\n", - " 'tick': 'NFLX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 270.0,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20 00:00:00',\n", - " 'print_info': False,\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'tick': 'AMZN',\n", - " 'type_': 'bulk'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 190.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 325.0,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 125.0,\n", - " 'tick': 'AMZN',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 195.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 200.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 700.0,\n", - " 'tick': 'COST',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 135.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2025-01-17',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 120.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2025-01-17',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 280.0,\n", - " 'tick': 'BA',\n", - " 'type_': 'single'},\n", - " {'end': '2024-01-19',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2024-01-19',\n", - " 'strike': 120.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 170.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2024-01-19',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2024-01-19',\n", - " 'strike': 130.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 110.0,\n", - " 'tick': 'AMD',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 330.0,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 140.0,\n", - " 'tick': 'AMZN',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 290.0,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 390.0,\n", - " 'tick': 'NFLX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 200.0,\n", - " 'tick': 'META',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 430.0,\n", - " 'tick': 'NFLX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20 00:00:00',\n", - " 'print_info': False,\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'tick': 'AAPL',\n", - " 'type_': 'bulk'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21 00:00:00',\n", - " 'print_info': False,\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'tick': 'TSLA',\n", - " 'type_': 'bulk'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 140.0,\n", - " 'tick': 'AMZN',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 260.0,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2025-01-17 00:00:00',\n", - " 'print_info': False,\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'tick': 'SBUX',\n", - " 'type_': 'bulk'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 140.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 300.0,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 315.0,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 115.0,\n", - " 'tick': 'AMZN',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 220.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 185.0,\n", - " 'tick': 'NVDA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-03-15 00:00:00',\n", - " 'print_info': False,\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'tick': 'AAPL',\n", - " 'type_': 'bulk'},\n", - " {'end': '2023-01-18 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 115.0,\n", - " 'tick': 'AMZN',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 485.0,\n", - " 'tick': 'NFLX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 155.0,\n", - " 'tick': 'AMZN',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 230.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20 00:00:00',\n", - " 'print_info': False,\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'tick': 'TSLA',\n", - " 'type_': 'bulk'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 180.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19 00:00:00',\n", - " 'print_info': False,\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'tick': 'AAPL',\n", - " 'type_': 'bulk'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 500.0,\n", - " 'tick': 'NFLX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 410.0,\n", - " 'tick': 'NFLX',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 155.0,\n", - " 'tick': 'META',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 200.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 280.0,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 460.0,\n", - " 'tick': 'NFLX',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 130.0,\n", - " 'tick': 'AMZN',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 175.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 145.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 160.0,\n", - " 'tick': 'META',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 130.0,\n", - " 'tick': 'AMZN',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 290.0,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 190.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 140.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 195.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-03-15 00:00:00',\n", - " 'print_info': False,\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'tick': 'AMZN',\n", - " 'type_': 'bulk'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 740.0,\n", - " 'tick': 'COST',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 470.0,\n", - " 'tick': 'NFLX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 235.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 250.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-07-13 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 200.0,\n", - " 'tick': 'AMZN',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 515.0,\n", - " 'tick': 'NFLX',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 230.0,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 205.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2024-01-19',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2024-01-19',\n", - " 'strike': 115.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 465.0,\n", - " 'tick': 'NFLX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 130.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2025-01-17',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 270.0,\n", - " 'tick': 'BA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2025-01-17',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 115.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-01-27 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 150.0,\n", - " 'tick': 'AMZN',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 125.0,\n", - " 'tick': 'AMD',\n", - " 'type_': 'single'},\n", - " {'end': '2023-02-02 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 155.0,\n", - " 'tick': 'AMZN',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 210.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 345.0,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20 00:00:00',\n", - " 'print_info': False,\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'tick': 'NFLX',\n", - " 'type_': 'bulk'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 335.0,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 190.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 215.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 205.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 620.0,\n", - " 'tick': 'COST',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 125.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 210.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 305.0,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 150.0,\n", - " 'tick': 'AMZN',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 210.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 296.67,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 293.33,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 115.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 310.0,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 200.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 180.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 205.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 145.0,\n", - " 'tick': 'AMZN',\n", - " 'type_': 'single'},\n", - " {'end': '2023-04-27 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 150.0,\n", - " 'tick': 'AMZN',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 225.0,\n", - " 'tick': 'NVDA',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 170.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 145.0,\n", - " 'tick': 'AMZN',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 475.0,\n", - " 'tick': 'NFLX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2025-01-17',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 125.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2025-01-17',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 140.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2024-01-19',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2024-01-19',\n", - " 'strike': 125.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 185.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 220.0,\n", - " 'tick': 'NVDA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 225.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 120.0,\n", - " 'tick': 'AMZN',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 195.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 180.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-04-18 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 115.0,\n", - " 'tick': 'AMZN',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 490.0,\n", - " 'tick': 'NFLX',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 215.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 130.0,\n", - " 'tick': 'AMD',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 275.0,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 130.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-01-17 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 190.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 185.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 125.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 320.0,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19 00:00:00',\n", - " 'print_info': False,\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'tick': 'NFLX',\n", - " 'type_': 'bulk'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19 00:00:00',\n", - " 'print_info': False,\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'tick': 'META',\n", - " 'type_': 'bulk'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 105.0,\n", - " 'tick': 'AMD',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 505.0,\n", - " 'tick': 'NFLX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-01-17 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 250.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 450.0,\n", - " 'tick': 'NFLX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 276.67,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 215.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 680.0,\n", - " 'tick': 'COST',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 230.0,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 265.0,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 125.0,\n", - " 'tick': 'AMZN',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 115.0,\n", - " 'tick': 'AMD',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 190.0,\n", - " 'tick': 'META',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 185.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 200.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 100.0,\n", - " 'tick': 'AMD',\n", - " 'type_': 'single'},\n", - " {'end': '2024-01-19',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2024-01-19',\n", - " 'strike': 145.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 240.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 195.0,\n", - " 'tick': 'META',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 200.0,\n", - " 'tick': 'NVDA',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 195.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 180.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 185.0,\n", - " 'tick': 'META',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 135.0,\n", - " 'tick': 'AMZN',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-05-25 00:00:00',\n", - " 'strike': 210.0,\n", - " 'tick': 'NVDA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 280.0,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 245.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2025-01-17',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 260.0,\n", - " 'tick': 'BA',\n", - " 'type_': 'single'},\n", - " {'end': '2024-01-19',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2024-01-19',\n", - " 'strike': 140.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19 00:00:00',\n", - " 'print_info': False,\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'tick': 'BA',\n", - " 'type_': 'bulk'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 295.0,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2024-01-25 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-07-20 00:00:00',\n", - " 'strike': 130.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21 00:00:00',\n", - " 'print_info': False,\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'tick': 'SBUX',\n", - " 'type_': 'bulk'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 150.0,\n", - " 'tick': 'AMZN',\n", - " 'type_': 'single'},\n", - " {'end': '2023-07-20 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 450.0,\n", - " 'tick': 'NFLX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 520.0,\n", - " 'tick': 'NFLX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 560.0,\n", - " 'tick': 'NFLX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2025-01-17',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 240.0,\n", - " 'tick': 'BA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 470.0,\n", - " 'tick': 'NFLX',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 170.0,\n", - " 'tick': 'META',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 120.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-07-20 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 500.0,\n", - " 'tick': 'NFLX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 285.0,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 175.0,\n", - " 'tick': 'META',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 286.67,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20 00:00:00',\n", - " 'print_info': False,\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'tick': 'AMD',\n", - " 'type_': 'bulk'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 205.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 210.0,\n", - " 'tick': 'META',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 283.33,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 340.0,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 120.0,\n", - " 'tick': 'AMD',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 215.0,\n", - " 'tick': 'NVDA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 200.0,\n", - " 'tick': 'AMZN',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 165.0,\n", - " 'tick': 'META',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 710.0,\n", - " 'tick': 'COST',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 300.0,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 215.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 760.0,\n", - " 'tick': 'COST',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 120.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2025-01-17',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 290.0,\n", - " 'tick': 'BA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 180.0,\n", - " 'tick': 'META',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2025-01-17 00:00:00',\n", - " 'print_info': False,\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'tick': 'BA',\n", - " 'type_': 'bulk'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 195.0,\n", - " 'tick': 'NVDA',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 495.0,\n", - " 'tick': 'NFLX',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 510.0,\n", - " 'tick': 'NFLX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19 00:00:00',\n", - " 'print_info': False,\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'tick': 'NVDA',\n", - " 'type_': 'bulk'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2025-01-17',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 250.0,\n", - " 'tick': 'BA',\n", - " 'type_': 'single'}]" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "[dict(t) for t in {tuple(sorted(r.items())) for r in reqs}]" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{(('a', 1),), (('a', 1), ('b', 2)), (('a', 2),), (('b', 2), ('a', 1))}" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "{tuple((d.items())) for d in lst}" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(Timestamp('2023-02-03 00:00:00'), Timestamp('2023-12-29 00:00:00'))" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.start_date, evb_backtest.end_date" - ] - }, - { - "cell_type": "code", - "execution_count": 79, - "metadata": {}, - "outputs": [], - "source": [ - "from trade.assets.helpers.DataManagers import OptionDataManager \n", - "dm = OptionDataManager(opttick='AAPL20240119C175')" - ] - }, - { - "cell_type": "code", - "execution_count": 81, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "OptionDataManager calculating greeks. Database unavailable\n" - ] - } - ], - "source": [ - "from trade.assets.helpers.DataManagers import OptionDataManager \n", - "dm = OptionDataManager(opttick='AAPL20240119C175')\n", - "data = dm.get_timeseries('2023-02-03', '2023-12-03', '1d', 'greeks')\n", - "data" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The autoreload extension is already loaded. To reload it, use:\n", - " %reload_ext autoreload\n" - ] - } - ], - "source": [ - "%load_ext autoreload\n", - "%autoreload 2\n", - "from trade.assets.helpers.DataManagers import OptionDataManager\n", - "data_manager = OptionDataManager(opttick='AAPL20240322C170', default_fill='midpoint')" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
OpenHighLowCloseMidpointVolume
Datetime
2024-02-0119.0019.0019.0019.0019.1751
2024-02-0212.9518.7512.9518.7518.0753
2024-02-0519.5519.5519.5519.5519.4252
2024-02-0619.7019.7019.7019.7020.8501
2024-02-0720.9321.5820.2520.7520.8506
.....................
2024-03-185.958.004.304.404.4253658
2024-03-194.956.833.856.106.3751776
2024-03-206.008.755.408.758.675613
2024-03-216.997.451.762.032.02537144
2024-03-222.103.031.022.302.26030964
\n", - "

37 rows × 6 columns

\n", - "
" - ], - "text/plain": [ - " Open High Low Close Midpoint Volume\n", - "Datetime \n", - "2024-02-01 19.00 19.00 19.00 19.00 19.175 1\n", - "2024-02-02 12.95 18.75 12.95 18.75 18.075 3\n", - "2024-02-05 19.55 19.55 19.55 19.55 19.425 2\n", - "2024-02-06 19.70 19.70 19.70 19.70 20.850 1\n", - "2024-02-07 20.93 21.58 20.25 20.75 20.850 6\n", - "... ... ... ... ... ... ...\n", - "2024-03-18 5.95 8.00 4.30 4.40 4.425 3658\n", - "2024-03-19 4.95 6.83 3.85 6.10 6.375 1776\n", - "2024-03-20 6.00 8.75 5.40 8.75 8.675 613\n", - "2024-03-21 6.99 7.45 1.76 2.03 2.025 37144\n", - "2024-03-22 2.10 3.03 1.02 2.30 2.260 30964\n", - "\n", - "[37 rows x 6 columns]" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "data = data_manager.get_timeseries(\n", - " start = '2024-01-01',\n", - " end = '2024-12-31',\n", - " interval = '1d',\n", - " type_ = 'spot'\n", - ")\n", - "data" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "use_cols = [x for x in data.columns if 'Midpoint' in x]\n", - "data2 = data[use_cols]\n", - "data2.columns = [x.split('_')[1].capitalize() for x in data2.columns]\n", - "data2" - ] - }, - { - "cell_type": "code", - "execution_count": 67, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['L', 'AAPL20240315C170']\n", - "['S', 'AAPL20240315C175']\n", - "Using available dataing available data\r" - ] - } - ], - "source": [ - "# evb_backtest.risk_manager.position_data['&L:AMD20220617P80&S:AMD20220617P75']\n", - "# evb_backtest.portfolio.events.advance_date()\n", - "evb_backtest.risk_manager.calculate_position_greeks('&L:AAPL20240315C170&S:AAPL20240315C175', '2023-10-20')\n", - "# v = evb_backtest.risk_manager.limits_check()" - ] - }, - { - "cell_type": "code", - "execution_count": 63, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "12.35\n", - "8.719999999999999\n" - ] - } - ], - "source": [ - "print((10.1 + 12.7 + 15.0 + 11.6)/4)\n", - "print((6.9 + 9.1 + 8.8 + 9.1 + 9.7)/5)" - ] - }, - { - "cell_type": "code", - "execution_count": 54, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[[], []]" - ] - }, - "execution_count": 54, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "[[], []]" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
DeltaGammaThetaRhoVegaVannaVolgaMidpointSRYS0_closes0_close
Datetime
2023-03-060.043469-0.000003-0.0011270.0494750.008352-0.121052-13.5870821.8750.00.00.00.0153.830002
2023-03-070.045053-0.000054-0.0015170.0497870.011670-0.113807-15.2686641.9750.00.00.00.0151.600006
2023-03-080.044645-0.000027-0.0013300.0501120.009961-0.120422-14.5680891.9250.00.00.00.0152.869995
2023-03-090.0418840.000116-0.0011470.0475050.012243-0.095080-14.4763341.6500.00.00.00.0150.589996
2023-03-100.045343-0.000021-0.0017850.0489140.016040-0.095283-16.4651131.9250.00.00.00.0148.500000
..........................................
2023-10-200.065127-0.000915-0.0010350.033691-0.014997-0.3536379.7866822.9250.00.00.00.0172.880005
2023-10-230.066135-0.000966-0.0010870.033629-0.015245-0.36283410.2420122.9500.00.00.00.0173.000000
2023-10-240.067072-0.001022-0.0009660.034052-0.016610-0.38395412.2998602.9750.00.00.00.0173.440002
2023-10-250.068176-0.000731-0.0012480.034916-0.010601-0.3446604.6714902.7250.00.00.00.0171.100006
2023-10-260.071325-0.000480-0.0025830.0364680.000396-0.286381-5.9377232.5000.00.00.00.0166.889999
\n", - "

169 rows × 13 columns

\n", - "
" - ], - "text/plain": [ - " Delta Gamma Theta Rho Vega Vanna \\\n", - "Datetime \n", - "2023-03-06 0.043469 -0.000003 -0.001127 0.049475 0.008352 -0.121052 \n", - "2023-03-07 0.045053 -0.000054 -0.001517 0.049787 0.011670 -0.113807 \n", - "2023-03-08 0.044645 -0.000027 -0.001330 0.050112 0.009961 -0.120422 \n", - "2023-03-09 0.041884 0.000116 -0.001147 0.047505 0.012243 -0.095080 \n", - "2023-03-10 0.045343 -0.000021 -0.001785 0.048914 0.016040 -0.095283 \n", - "... ... ... ... ... ... ... \n", - "2023-10-20 0.065127 -0.000915 -0.001035 0.033691 -0.014997 -0.353637 \n", - "2023-10-23 0.066135 -0.000966 -0.001087 0.033629 -0.015245 -0.362834 \n", - "2023-10-24 0.067072 -0.001022 -0.000966 0.034052 -0.016610 -0.383954 \n", - "2023-10-25 0.068176 -0.000731 -0.001248 0.034916 -0.010601 -0.344660 \n", - "2023-10-26 0.071325 -0.000480 -0.002583 0.036468 0.000396 -0.286381 \n", - "\n", - " Volga Midpoint S R Y S0_close s0_close \n", - "Datetime \n", - "2023-03-06 -13.587082 1.875 0.0 0.0 0.0 0.0 153.830002 \n", - "2023-03-07 -15.268664 1.975 0.0 0.0 0.0 0.0 151.600006 \n", - "2023-03-08 -14.568089 1.925 0.0 0.0 0.0 0.0 152.869995 \n", - "2023-03-09 -14.476334 1.650 0.0 0.0 0.0 0.0 150.589996 \n", - "2023-03-10 -16.465113 1.925 0.0 0.0 0.0 0.0 148.500000 \n", - "... ... ... ... ... ... ... ... \n", - "2023-10-20 9.786682 2.925 0.0 0.0 0.0 0.0 172.880005 \n", - "2023-10-23 10.242012 2.950 0.0 0.0 0.0 0.0 173.000000 \n", - "2023-10-24 12.299860 2.975 0.0 0.0 0.0 0.0 173.440002 \n", - "2023-10-25 4.671490 2.725 0.0 0.0 0.0 0.0 171.100006 \n", - "2023-10-26 -5.937723 2.500 0.0 0.0 0.0 0.0 166.889999 \n", - "\n", - "[169 rows x 13 columns]" - ] - }, - "execution_count": 39, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.risk_manager.position_data['&L:AAPL20240315C170&S:AAPL20240315C175']" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### ***RISK MANAGER CORE METHOD TESTS***" - ] - }, - { - "cell_type": "code", - "execution_count": 90, - "metadata": {}, - "outputs": [], - "source": [ - "test_date = pd.to_datetime('2021-07-15')\n", - "position_str = '&L:AMD20220617C115&S:AMD20220617C125'\n", - "def parse_position_id(positionID):\n", - " position_str = positionID\n", - " position_list = position_str.split('&')\n", - " position_list = [x.split(':') for x in position_list if x]\n", - " position_list_parsed = [(x[0], parse_option_tick(x[1])) for x in position_list]\n", - " position_dict = dict(L = [], S = [])\n", - " for x in position_list_parsed:\n", - " position_dict[x[0]].append(x[1])\n", - " return position_dict, position_list\n", - "\n", - "def get_position_dict(positionID):\n", - " return parse_position_id(positionID)[0]\n", - "\n", - "def get_position_list(positionID):\n", - " return parse_position_id(positionID)[1]\n", - "\n", - "def get_option_price(optID, portfolio, date):\n", - " return portfolio.options_data[optID]['Midpoint'][date]\n", - "\n", - " \n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Console Logging & File Logging Can be configured using STREAM_LOG_LEVEL and FILE_LOG_LEVEL in environment variables.\n", - "Propagate to root logger can be set using PROPAGATE_TO_ROOT_LOGGER in environment variables.\n", - "Example:\n", - "STREAM_LOG_LEVEL = 'DEBUG'\n", - "FILE_LOG_LEVEL = 'INFO'\n", - "PROPAGATE_TO_ROOT_LOGGER = 'False'\n", - "\n", - "2025-04-20 00:37:06 trade.helpers.Logging INFO: Logging Root Directory: /Users/chiemelienwanisobi/cloned_repos/QuantTools/logs\n", - "Using Proxy URL: http://18.232.166.224:5500/thetadata\n" - ] - }, - { - "ename": "OpenBBError", - "evalue": "400: unexpected error", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mHTTPException\u001b[0m Traceback (most recent call last)", - "File \u001b[0;32m~/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/account.py:50\u001b[0m, in \u001b[0;36mAccount._log_account_command..wrapped\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 48\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 49\u001b[0m \u001b[38;5;66;03m# pylint: disable=E1102\u001b[39;00m\n\u001b[0;32m---> 50\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;66;03m# type: ignore[operator]\u001b[39;00m\n\u001b[1;32m 51\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n", - "File \u001b[0;32m~/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/account.py:124\u001b[0m, in \u001b[0;36mAccount.login\u001b[0;34m(self, email, password, pat, remember_me, return_settings)\u001b[0m\n\u001b[1;32m 104\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"Login to hub.\u001b[39;00m\n\u001b[1;32m 105\u001b[0m \n\u001b[1;32m 106\u001b[0m \u001b[38;5;124;03mParameters\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 122\u001b[0m \u001b[38;5;124;03m User settings: profile, credentials, preferences\u001b[39;00m\n\u001b[1;32m 123\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m--> 124\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_hub_service \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_create_hub_service\u001b[49m\u001b[43m(\u001b[49m\u001b[43memail\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpassword\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpat\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 125\u001b[0m incoming \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_hub_service\u001b[38;5;241m.\u001b[39mpull()\n", - "File \u001b[0;32m~/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/account.py:92\u001b[0m, in \u001b[0;36mAccount._create_hub_service\u001b[0;34m(self, email, password, pat)\u001b[0m\n\u001b[1;32m 91\u001b[0m hs \u001b[38;5;241m=\u001b[39m HubService()\n\u001b[0;32m---> 92\u001b[0m \u001b[43mhs\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconnect\u001b[49m\u001b[43m(\u001b[49m\u001b[43memail\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpassword\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpat\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 93\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m hs\n", - "File \u001b[0;32m~/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/service/hub_service.py:70\u001b[0m, in \u001b[0;36mHubService.connect\u001b[0;34m(self, email, password, pat)\u001b[0m\n\u001b[1;32m 69\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m pat:\n\u001b[0;32m---> 70\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_session \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_get_session_from_platform_token\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpat\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 71\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_session\n", - "File \u001b[0;32m~/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/service/hub_service.py:171\u001b[0m, in \u001b[0;36mHubService._get_session_from_platform_token\u001b[0;34m(self, token)\u001b[0m\n\u001b[1;32m 170\u001b[0m detail \u001b[38;5;241m=\u001b[39m response\u001b[38;5;241m.\u001b[39mjson()\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdetail\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m)\n\u001b[0;32m--> 171\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m HTTPException(status_code, detail)\n", - "\u001b[0;31mHTTPException\u001b[0m: 400: unexpected error", - "\nThe above exception was the direct cause of the following exception:\n", - "\u001b[0;31mOpenBBError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[1], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtrade\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01massets\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mStock\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m Stock\n", - "File \u001b[0;32m~/cloned_repos/QuantTools/trade/assets/Stock.py:34\u001b[0m\n\u001b[1;32m 32\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtrade\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mhelpers\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mopenbb_helper\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;241m*\u001b[39m\n\u001b[1;32m 33\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtrade\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mmodels\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mVolSurface\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m SurfaceLab\n\u001b[0;32m---> 34\u001b[0m \u001b[43mload_openBB\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 35\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01myfinance\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01myf\u001b[39;00m\n\u001b[1;32m 36\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtrade\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01massets\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mrates\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m get_risk_free_rate_helper\n", - "File \u001b[0;32m~/cloned_repos/QuantTools/trade/helpers/openbb_helper.py:6\u001b[0m, in \u001b[0;36mload_openBB\u001b[0;34m()\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mopenbb\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m obb\n\u001b[1;32m 5\u001b[0m openbb_key \u001b[38;5;241m=\u001b[39m os\u001b[38;5;241m.\u001b[39menviron\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mOPENBB_KEY\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m----> 6\u001b[0m \u001b[43mobb\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43maccount\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mlogin\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpat\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mopenbb_key\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mremember_me\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[1;32m 7\u001b[0m obb\u001b[38;5;241m.\u001b[39maccount\u001b[38;5;241m.\u001b[39mrefresh()\n\u001b[1;32m 8\u001b[0m obb\u001b[38;5;241m.\u001b[39maccount\u001b[38;5;241m.\u001b[39msave()\n", - "File \u001b[0;32m~/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/account.py:52\u001b[0m, in \u001b[0;36mAccount._log_account_command..wrapped\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 50\u001b[0m result \u001b[38;5;241m=\u001b[39m func(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs) \u001b[38;5;66;03m# type: ignore[operator]\u001b[39;00m\n\u001b[1;32m 51\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[0;32m---> 52\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m OpenBBError(e) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01me\u001b[39;00m\n\u001b[1;32m 53\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[1;32m 54\u001b[0m user_settings \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_base_app\u001b[38;5;241m.\u001b[39m_command_runner\u001b[38;5;241m.\u001b[39muser_settings\n", - "\u001b[0;31mOpenBBError\u001b[0m: 400: unexpected error" - ] - } - ], - "source": [ - "from trade.assets.Stock import Stock" - ] - }, - { - "cell_type": "code", - "execution_count": 329, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Spot Price at Purchase: 93.30999755859375 at time 2021-07-01 00:00:00\n", - "Target Delta: 1.45\n", - "Delta from Full Spend: 0.9306110124412736, Size: 13\n", - "Delta with Size Limit: 1.4317092499096518, Size: 20\n" - ] - }, - { - "data": { - "text/plain": [ - "13" - ] - }, - "execution_count": 329, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# evb_backtest.risk_manager.calculate_position_greeks(position_str,test_date)\n", - "evb_backtest.risk_manager.calculate_quantity(position_str, 'AMD20210701LONG', '2021-07-01')\n", - "# evb_backtest.risk_manager.update_signal_limits(fill_event)" - ] - }, - { - "cell_type": "code", - "execution_count": 237, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'AMD': {'position': {'long': ['AMD20220617C115'],\n", - " 'short': ['AMD20220617C125'],\n", - " 'trade_id': '&L:AMD20220617C115&S:AMD20220617C125',\n", - " 'close': 1.825000000000001},\n", - " 'quantity': 11,\n", - " 'entry_price': 2270.5487409714515,\n", - " 'market_value': 2007.500000000001,\n", - " 'signal_id': 'AMD20210701LONG'}}" - ] - }, - "execution_count": 237, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.portfolio.current_positions" - ] - }, - { - "cell_type": "code", - "execution_count": 239, - "metadata": {}, - "outputs": [ - { - "ename": "KeyError", - "evalue": "'delta'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[239], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mevb_backtest\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrisk_manager\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mlimits_check\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/cloned_repos/QuantTools/EventDriven/riskmanager.py:830\u001b[0m, in \u001b[0;36mRiskManager.limits_check\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 828\u001b[0m current_positions \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpm\u001b[38;5;241m.\u001b[39mcurrent_positions\n\u001b[1;32m 829\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m symbol, position \u001b[38;5;129;01min\u001b[39;00m current_positions\u001b[38;5;241m.\u001b[39mitems():\n\u001b[0;32m--> 830\u001b[0m max_delta \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msignal_limits\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mdelta\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m[symbol]\n\u001b[1;32m 831\u001b[0m quantity \u001b[38;5;241m=\u001b[39m position[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mquantity\u001b[39m\u001b[38;5;124m'\u001b[39m]\n\u001b[1;32m 832\u001b[0m trade_id \u001b[38;5;241m=\u001b[39m position[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mposition\u001b[39m\u001b[38;5;124m'\u001b[39m][\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mtrade_id\u001b[39m\u001b[38;5;124m'\u001b[39m]\n", - "\u001b[0;31mKeyError\u001b[0m: 'delta'" - ] - } - ], - "source": [ - "evb_backtest.risk_manager.limits_check()" - ] - }, - { - "cell_type": "code", - "execution_count": 203, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'long': ['AMD20220617C115'],\n", - " 'short': ['AMD20220617C125'],\n", - " 'trade_id': '&L:AMD20220617C115&S:AMD20220617C125',\n", - " 'close': 1.3499999999999996}" - ] - }, - "execution_count": 203, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "events = evb_backtest.events.events.copy()\n", - "events[events.type == 'FILL'].position[0]" - ] - }, - { - "cell_type": "code", - "execution_count": 204, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Equivalent Delta Size: 1.0\n" - ] - } - ], - "source": [ - "from EventDriven.event import FillEvent\n", - "fill_event = FillEvent(datetime = '2021-07-01', \n", - " symbol ='AMD', \n", - " exchange = 'I', \n", - " quantity=14, \n", - " direction = 'LONG', \n", - " fill_cost = 0,\n", - " signal_id='AMD20210701LONG',\n", - " commission = 0.13,\n", - " position = {'long': ['AMD20220617C115'],\n", - " 'short': ['AMD20220617C125'],\n", - " 'trade_id': '&L:AMD20220617C115&S:AMD20220617C125',\n", - " 'close': 1.3499999999999996})\n", - "evb_backtest.risk_manager.update_signal_limits(fill_event)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 175, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0 AMD20210701LONG\n", - "Name: SignalID, dtype: object" - ] - }, - "execution_count": 175, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.portfolio.trades['SignalID']" - ] - }, - { - "cell_type": "code", - "execution_count": 193, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2729.761012667402" - ] - }, - "execution_count": 193, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.portfolio.weight_map['AMD'] * 20_000" - ] - }, - { - "cell_type": "code", - "execution_count": 194, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1937.393900773914" - ] - }, - "execution_count": 194, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.portfolio.allocated_cash_map['AMD']" - ] - }, - { - "cell_type": "code", - "execution_count": 164, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
DeltaGammaVegaThetaRhoVannaVolgaMidpointIvS0_closes0_close
Datetime
2021-07-010.0715850.0007790.025448-0.0014110.045023-0.020942-12.3240342.000-0.0029920.093.309998
2021-07-020.0758870.0006550.025141-0.0016090.047353-0.035179-13.3777622.2500.0014860.094.699997
2021-07-060.0811920.0005470.027271-0.0021570.049014-0.040630-14.3172992.5000.0094170.094.470001
2021-07-070.0715610.0009690.030466-0.0018010.0440080.001789-11.6868441.825-0.0013120.090.540001
2021-07-080.0762140.0010150.034979-0.0022980.0464130.007265-12.4497551.9000.0046210.089.739998
2021-07-090.0739180.0010330.032556-0.0019370.0458010.003379-12.2638981.850-0.0002280.090.900002
2021-07-120.0793020.0010000.035748-0.0024160.0482880.001074-13.3134812.0000.0061960.090.809998
2021-07-130.0744860.0010580.033682-0.0021010.0453520.007532-12.0661001.8250.0012610.090.260002
2021-07-140.0691360.0012610.033893-0.0018290.0426370.025277-10.4951401.550-0.0046160.089.050003
2021-07-150.0664800.0015020.037180-0.0019500.0409650.049053-8.9143751.350-0.0052430.086.930000
2021-07-160.0726350.0015020.042144-0.0025940.0435960.052443-9.6540801.5250.0037970.085.889999
\n", - "
" - ], - "text/plain": [ - " Delta Gamma Vega Theta Rho Vanna \\\n", - "Datetime \n", - "2021-07-01 0.071585 0.000779 0.025448 -0.001411 0.045023 -0.020942 \n", - "2021-07-02 0.075887 0.000655 0.025141 -0.001609 0.047353 -0.035179 \n", - "2021-07-06 0.081192 0.000547 0.027271 -0.002157 0.049014 -0.040630 \n", - "2021-07-07 0.071561 0.000969 0.030466 -0.001801 0.044008 0.001789 \n", - "2021-07-08 0.076214 0.001015 0.034979 -0.002298 0.046413 0.007265 \n", - "2021-07-09 0.073918 0.001033 0.032556 -0.001937 0.045801 0.003379 \n", - "2021-07-12 0.079302 0.001000 0.035748 -0.002416 0.048288 0.001074 \n", - "2021-07-13 0.074486 0.001058 0.033682 -0.002101 0.045352 0.007532 \n", - "2021-07-14 0.069136 0.001261 0.033893 -0.001829 0.042637 0.025277 \n", - "2021-07-15 0.066480 0.001502 0.037180 -0.001950 0.040965 0.049053 \n", - "2021-07-16 0.072635 0.001502 0.042144 -0.002594 0.043596 0.052443 \n", - "\n", - " Volga Midpoint Iv S0_close s0_close \n", - "Datetime \n", - "2021-07-01 -12.324034 2.000 -0.002992 0.0 93.309998 \n", - "2021-07-02 -13.377762 2.250 0.001486 0.0 94.699997 \n", - "2021-07-06 -14.317299 2.500 0.009417 0.0 94.470001 \n", - "2021-07-07 -11.686844 1.825 -0.001312 0.0 90.540001 \n", - "2021-07-08 -12.449755 1.900 0.004621 0.0 89.739998 \n", - "2021-07-09 -12.263898 1.850 -0.000228 0.0 90.900002 \n", - "2021-07-12 -13.313481 2.000 0.006196 0.0 90.809998 \n", - "2021-07-13 -12.066100 1.825 0.001261 0.0 90.260002 \n", - "2021-07-14 -10.495140 1.550 -0.004616 0.0 89.050003 \n", - "2021-07-15 -8.914375 1.350 -0.005243 0.0 86.930000 \n", - "2021-07-16 -9.654080 1.525 0.003797 0.0 85.889999 " - ] - }, - "execution_count": 164, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.risk_manager.position_data['&L:AMD20220617C115&S:AMD20220617C125']" - ] - }, - { - "cell_type": "code", - "execution_count": 152, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "20.13888888888889" - ] - }, - "execution_count": 152, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "cash_available = w_map['AMD'] * cash\n", - "purchase_date = pd.to_datetime('2021-07-01')\n", - "s0_at_purchase = data['s'][purchase_date]\n", - "leverage = 5\n", - "equivalent_size = (math.floor(cash_available/s0_at_purchase)/100) * leverage\n", - "equivalent_size/0.072" - ] - }, - { - "cell_type": "code", - "execution_count": 127, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2022.1066637737406" - ] - }, - "execution_count": 127, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.portfolio.allocated_cash_map['AMD']\n", - "# t = get_position_dict(position_str)\n", - "# key = list(t.keys())[0]\n", - "# t[key][0]['ticker']" - ] - }, - { - "cell_type": "code", - "execution_count": 100, - "metadata": {}, - "outputs": [], - "source": [ - "pd.options.display.max_columns = 100\n", - "## Switching to calculating vol for entire timeseries\n", - "data = evb_backtest.portfolio.options_data['AMD20220617C115'].copy()\n", - "option_meta = parse_option_tick('AMD20220617C115')\n", - "data[['symbol', 'put_call', 'exp_date', 'strike']] = pd.Series(option_meta)\n", - "data['s'] = evb_backtest.risk_manager.spot_timeseries['AMD']\n", - "data['r'] = evb_backtest.risk_manager.rf_timeseries\n", - "data['y'] = evb_backtest.risk_manager.dividend_timeseries['AMD']\n", - "data['iv'] = data.apply(lambda x: binomial_implied_vol(price = x['Midpoint'],\n", - " S = x['s'],\n", - " K = x['strike'],\n", - " r = x['r'],\n", - " exp_date = x['exp_date'],\n", - " option_type = x['put_call'].lower(),\n", - " pricing_date = test_date,\n", - " dividend_yield= x['y']), axis=1)\n", - "\n", - "greeks = data.apply(lambda x: Calculate.greeks(S = x['s'],\n", - " K = x['strike'],\n", - " r = x['r'],\n", - " y = x['y'],\n", - " start = test_date,\n", - " exp = x['exp_date'],\n", - " flag = x['put_call'],\n", - " sigma = x['iv']), axis=1, result_type = 'expand')\n", - "data = data.join(greeks)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 67, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
OpenHighLowCloseVolumeBid_sizeCloseBidAsk_sizeCloseAskMidpointWeighted_midpointsymbolput_callexp_datestrikesryivDeltaGammaVegaThetaRhoVannaVolga
Datetime
2021-07-018.498.498.008.15555777.902749.008.4508.254172AMDC2022-06-17115.093.3099980.0004000.4335720.3848640.0098350.342548-0.0220950.2536050.62952616.516995
2021-07-028.059.278.059.2484788.65999.359.0009.297664AMDC2022-06-17115.094.6999970.0003800.4338610.3986580.0097810.351101-0.0226610.2654810.61891514.458817
2021-07-069.059.258.658.65112338.851499.209.0258.986518AMDC2022-06-17115.094.4700010.0004000.4371310.3983890.0097290.350185-0.0227740.2641830.61736814.426723
2021-07-078.008.007.267.301526.405587.657.0257.645536AMDC2022-06-17115.090.5400010.0004300.4231070.3504040.0100700.322235-0.0202840.2275890.65478821.880235
2021-07-086.406.886.406.8834436.105077.006.5506.580316AMDC2022-06-17115.089.7399980.0004300.4165100.3376500.0101780.314970-0.0195170.2189220.66390523.972143
2021-07-090.000.000.000.000906.653526.906.7756.849095AMDC2022-06-17115.090.9000020.0004300.4114590.3459000.0102650.321979-0.0197100.2272810.66550623.034816
2021-07-120.000.000.000.000426.60346.756.6756.667105AMDC2022-06-17115.090.8099980.0004300.4094820.3435660.0102990.320846-0.0195470.2259120.66793023.464894
2021-07-130.000.000.000.0003885.9017.206.5505.903342AMDC2022-06-17115.090.2600020.0004500.4112360.3391870.0102670.317351-0.0194170.2217330.66783624.010453
2021-07-146.156.156.096.0924625.70446.005.8505.726087AMDC2022-06-17115.089.0500030.0004500.4002860.3185380.0104240.305264-0.0181800.2078010.68141127.498679
2021-07-155.455.454.844.84178214.354405.254.8004.664036AMDC2022-06-17115.086.9300000.0003800.3863530.2851770.0105270.283523-0.0162920.1845220.69283532.832833
2021-07-164.454.454.454.4550014.303184.904.6004.898119AMDC2022-06-17115.085.8899990.0003800.3902100.2774800.0104110.276454-0.0160440.1773890.68632933.427196
\n", - "
" - ], - "text/plain": [ - " Open High Low Close Volume Bid_size CloseBid Ask_size \\\n", - "Datetime \n", - "2021-07-01 8.49 8.49 8.00 8.15 55 577 7.90 274 \n", - "2021-07-02 8.05 9.27 8.05 9.24 847 8 8.65 99 \n", - "2021-07-06 9.05 9.25 8.65 8.65 11 233 8.85 149 \n", - "2021-07-07 8.00 8.00 7.26 7.30 15 2 6.40 558 \n", - "2021-07-08 6.40 6.88 6.40 6.88 3 443 6.10 507 \n", - "2021-07-09 0.00 0.00 0.00 0.00 0 90 6.65 352 \n", - "2021-07-12 0.00 0.00 0.00 0.00 0 42 6.60 34 \n", - "2021-07-13 0.00 0.00 0.00 0.00 0 388 5.90 1 \n", - "2021-07-14 6.15 6.15 6.09 6.09 2 462 5.70 44 \n", - "2021-07-15 5.45 5.45 4.84 4.84 17 821 4.35 440 \n", - "2021-07-16 4.45 4.45 4.45 4.45 500 1 4.30 318 \n", - "\n", - " CloseAsk Midpoint Weighted_midpoint symbol put_call exp_date \\\n", - "Datetime \n", - "2021-07-01 9.00 8.450 8.254172 AMD C 2022-06-17 \n", - "2021-07-02 9.35 9.000 9.297664 AMD C 2022-06-17 \n", - "2021-07-06 9.20 9.025 8.986518 AMD C 2022-06-17 \n", - "2021-07-07 7.65 7.025 7.645536 AMD C 2022-06-17 \n", - "2021-07-08 7.00 6.550 6.580316 AMD C 2022-06-17 \n", - "2021-07-09 6.90 6.775 6.849095 AMD C 2022-06-17 \n", - "2021-07-12 6.75 6.675 6.667105 AMD C 2022-06-17 \n", - "2021-07-13 7.20 6.550 5.903342 AMD C 2022-06-17 \n", - "2021-07-14 6.00 5.850 5.726087 AMD C 2022-06-17 \n", - "2021-07-15 5.25 4.800 4.664036 AMD C 2022-06-17 \n", - "2021-07-16 4.90 4.600 4.898119 AMD C 2022-06-17 \n", - "\n", - " strike s r y iv Delta Gamma \\\n", - "Datetime \n", - "2021-07-01 115.0 93.309998 0.00040 0 0.433572 0.384864 0.009835 \n", - "2021-07-02 115.0 94.699997 0.00038 0 0.433861 0.398658 0.009781 \n", - "2021-07-06 115.0 94.470001 0.00040 0 0.437131 0.398389 0.009729 \n", - "2021-07-07 115.0 90.540001 0.00043 0 0.423107 0.350404 0.010070 \n", - "2021-07-08 115.0 89.739998 0.00043 0 0.416510 0.337650 0.010178 \n", - "2021-07-09 115.0 90.900002 0.00043 0 0.411459 0.345900 0.010265 \n", - "2021-07-12 115.0 90.809998 0.00043 0 0.409482 0.343566 0.010299 \n", - "2021-07-13 115.0 90.260002 0.00045 0 0.411236 0.339187 0.010267 \n", - "2021-07-14 115.0 89.050003 0.00045 0 0.400286 0.318538 0.010424 \n", - "2021-07-15 115.0 86.930000 0.00038 0 0.386353 0.285177 0.010527 \n", - "2021-07-16 115.0 85.889999 0.00038 0 0.390210 0.277480 0.010411 \n", - "\n", - " Vega Theta Rho Vanna Volga \n", - "Datetime \n", - "2021-07-01 0.342548 -0.022095 0.253605 0.629526 16.516995 \n", - "2021-07-02 0.351101 -0.022661 0.265481 0.618915 14.458817 \n", - "2021-07-06 0.350185 -0.022774 0.264183 0.617368 14.426723 \n", - "2021-07-07 0.322235 -0.020284 0.227589 0.654788 21.880235 \n", - "2021-07-08 0.314970 -0.019517 0.218922 0.663905 23.972143 \n", - "2021-07-09 0.321979 -0.019710 0.227281 0.665506 23.034816 \n", - "2021-07-12 0.320846 -0.019547 0.225912 0.667930 23.464894 \n", - "2021-07-13 0.317351 -0.019417 0.221733 0.667836 24.010453 \n", - "2021-07-14 0.305264 -0.018180 0.207801 0.681411 27.498679 \n", - "2021-07-15 0.283523 -0.016292 0.184522 0.692835 32.832833 \n", - "2021-07-16 0.276454 -0.016044 0.177389 0.686329 33.427196 " - ] - }, - "execution_count": 67, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# ***RISK MANAGER TESTS***" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "ename": "KeyError", - "evalue": "'signal_id'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[28], line 13\u001b[0m\n\u001b[1;32m 11\u001b[0m rm\u001b[38;5;241m.\u001b[39mOrderPicker\u001b[38;5;241m.\u001b[39mliquidity_threshold \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m100\u001b[39m\n\u001b[1;32m 12\u001b[0m rm\u001b[38;5;241m.\u001b[39mOrderPicker\u001b[38;5;241m.\u001b[39mlookback \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m10\u001b[39m\n\u001b[0;32m---> 13\u001b[0m order \u001b[38;5;241m=\u001b[39m \u001b[43mrm\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_order\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mTSLA\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43m2023-06-02\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mC\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m2\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\n\u001b[1;32m 14\u001b[0m \u001b[43m \u001b[49m\u001b[43m{\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mtype\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mnaked\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mspecifics\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43m[\u001b[49m\u001b[43m{\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mdirection\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mlong\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mrel_strike\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m0.85\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mdte\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m300\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mmoneyness_width\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m0.35\u001b[39;49m\u001b[43m}\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m{\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mdirection\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mshort\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mrel_strike\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m0.6\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mdte\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m300\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mmoneyness_width\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m0.35\u001b[39;49m\u001b[43m}\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mname\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mvertical_spread\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m}\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 16\u001b[0m profiler\u001b[38;5;241m.\u001b[39mdisable()\n\u001b[1;32m 17\u001b[0m stream \u001b[38;5;241m=\u001b[39m io\u001b[38;5;241m.\u001b[39mStringIO()\n", - "File \u001b[0;32m~/cloned_repos/QuantTools/EventDriven/riskmanager.py:774\u001b[0m, in \u001b[0;36mRiskManager.get_order\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 773\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mget_order\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[0;32m--> 774\u001b[0m signalID \u001b[38;5;241m=\u001b[39m \u001b[43mkwargs\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpop\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43msignal_id\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 775\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mSignal ID: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00msignalID\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 777\u001b[0m \u001b[38;5;66;03m## I cannot calculate greeks here. I need option_data to be available first.\u001b[39;00m\n", - "\u001b[0;31mKeyError\u001b[0m: 'signal_id'" - ] - } - ], - "source": [ - "import cProfile\n", - "import pstats\n", - "import io\n", - "profiler = cProfile.Profile()\n", - "profiler.enable()\n", - "#run backtest\n", - "\n", - "\n", - "\n", - "rm = RiskManager(evb_backtest.bars, None, None, '2023-01-01', '2023-12-31')\n", - "rm.OrderPicker.liquidity_threshold = 100\n", - "rm.OrderPicker.lookback = 10\n", - "order = rm.OrderPicker.get_order('TSLA', '2023-06-02', 'C', 2, \n", - " {'type': 'naked', 'specifics': [{'direction': 'long', 'rel_strike': 0.85, 'dte': 300, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 300, 'moneyness_width': 0.35}], 'name': 'vertical_spread'})\n", - "\n", - "profiler.disable()\n", - "stream = io.StringIO()\n", - "stats = pstats.Stats(profiler, stream=stream).sort_stats('cumulative')\n", - "\n", - "order" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "from EventDriven.riskmanager import produce_order_candidates, populate_cache\n", - "import cProfile\n", - "import pstats\n", - "import io\n", - "profiler = cProfile.Profile()\n", - "profiler.enable()\n", - "#run backtest\n", - "\n", - "\n", - "candi = produce_order_candidates({'type': 'naked', 'specifics': [{'direction': 'long', 'rel_strike': 0.85, 'dte': 300, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 300, 'moneyness_width': 0.35}], 'name': 'vertical_spread'},\n", - " 'NVDA',\n", - " '2023-06-02',\n", - " 'C')\n", - "profiler.disable()\n", - "stream = io.StringIO()\n", - "stats = pstats.Stats(profiler, stream=stream).sort_stats('cumulative')\n" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " 3811024 function calls (3793904 primitive calls) in 41.362 seconds\n", - "\n", - " Ordered by: cumulative time\n", - "\n", - " ncalls tottime percall cumtime percall filename:lineno(function)\n", - " 5 0.000 0.000 41.361 8.272 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/IPython/core/interactiveshell.py:3541(run_code)\n", - " 5 0.000 0.000 41.361 8.272 {built-in method builtins.exec}\n", - " 2/1 0.002 0.001 40.474 40.474 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/decorators.py:37(wrapper)\n", - " 1 0.001 0.001 40.474 40.474 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:513(get_order)\n", - " 1795 27.676 0.015 27.676 0.015 {method 'acquire' of '_thread.lock' objects}\n", - " 524 0.004 0.000 27.638 0.053 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:295(wait)\n", - " 396 0.004 0.000 25.366 0.064 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:428(result)\n", - " 1 0.000 0.000 23.943 23.943 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:94(populate_cache)\n", - " 4 0.001 0.000 23.922 5.980 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/threads.py:4(runThreads)\n", - " 380 0.001 0.000 21.621 0.057 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:612(result_iterator)\n", - " 376 0.002 0.000 21.620 0.057 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:314(_result_or_cancel)\n", - " 1 0.000 0.000 15.926 15.926 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:388(produce_order_candidates)\n", - " 2 0.001 0.001 15.926 7.963 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:252(chain_details)\n", - " 10 0.002 0.000 8.624 0.862 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:739(change_to_last_busday)\n", - " 10 0.001 0.000 8.567 0.857 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:727(is_USholiday)\n", - " 10 0.000 0.000 8.537 0.854 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas_market_calendars/calendars/nyse.py:1276(valid_days)\n", - " 10 0.000 0.000 8.527 0.853 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas_market_calendars/market_calendar.py:570(valid_days)\n", - " 10 1.008 0.101 8.521 0.852 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas_market_calendars/market_calendar.py:553(holidays)\n", - " 1 0.000 0.000 7.394 7.394 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:376(spot)\n", - " 10 0.001 0.000 6.695 0.670 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/holiday.py:443(holidays)\n", - " 10 0.005 0.001 6.639 0.664 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/holiday.py:476()\n", - " 290 0.027 0.000 6.634 0.023 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/holiday.py:249(dates)\n", - " 1 0.000 0.000 5.760 5.760 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:81(__init__)\n", - " 312 0.005 0.000 4.702 0.015 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:821(date_range)\n", - " 312 0.023 0.000 4.692 0.015 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:397(_generate_range)\n", - " 312 0.106 0.000 4.630 0.015 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:468()\n", - " 66680 2.356 0.000 4.523 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2712(_generate_range)\n", - " 4 0.000 0.000 3.825 0.956 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/utils/decorators.py:46(wrapper)\n", - " 4 0.000 0.000 3.825 0.956 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/utils/decorators.py:34(wrapper)\n", - " 4 0.000 0.000 3.795 0.949 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/validate_call_decorator.py:58(wrapper_function)\n", - " 4 0.000 0.000 3.795 0.949 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_validate_call.py:95(__call__)\n", - " 4 0.000 0.000 3.795 0.949 {method 'validate_python' of 'pydantic_core._pydantic_core.SchemaValidator' objects}\n", - " 4 0.000 0.000 3.795 0.949 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/container.py:23(_run)\n", - " 4 0.000 0.000 3.794 0.949 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/command_runner.py:476(sync_run)\n", - " 4 0.000 0.000 3.794 0.949 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/provider/utils/helpers.py:289(run_async)\n", - " 12 0.000 0.000 3.743 0.312 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/from_thread.py:275(call)\n", - " 1 0.002 0.002 3.625 3.625 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:104(retrieve_timeseries)\n", - " 290 0.082 0.000 3.468 0.012 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/holiday.py:308(_reference_dates)\n", - " 2 0.000 0.000 3.329 1.664 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/rates.py:178(get_risk_free_rate_helper)\n", - " 290 0.005 0.000 2.692 0.009 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/holiday.py:343(_apply_rule)\n", - "1973/1057 0.009 0.000 2.512 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/common.py:62(new_method)\n", - " 1 0.000 0.000 2.452 2.452 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/equity_price.py:25(historical)\n", - " 1 0.003 0.003 2.450 2.450 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:212(init_rfrate_ts)\n", - " 36 0.001 0.000 2.277 0.063 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:945(start)\n", - " 36 0.000 0.000 2.274 0.063 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:611(wait)\n", - " 4 0.000 0.000 2.271 0.568 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:583(map)\n", - " 4 0.001 0.000 2.271 0.568 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:608()\n", - " 376 0.002 0.000 2.270 0.006 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:161(submit)\n", - " 376 0.001 0.000 2.264 0.006 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:180(_adjust_thread_count)\n", - " 155 0.004 0.000 2.236 0.014 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:1371(_arith_method)\n", - " 140 0.001 0.000 2.234 0.016 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3184(__iadd__)\n", - " 140 0.001 0.000 2.233 0.016 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:98(__add__)\n", - " 144 0.001 0.000 2.233 0.016 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7227(_arith_method)\n", - " 155 0.001 0.000 2.187 0.014 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:240(arithmetic_op)\n", - " 140 0.000 0.000 2.184 0.016 {built-in method _operator.add}\n", - " 140 0.002 0.000 2.183 0.016 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1362(__add__)\n", - " 110 0.788 0.007 2.177 0.020 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:793(_add_offset)\n", - " 187 0.001 0.000 2.061 0.011 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:891(_map_values)\n", - " 187 0.056 0.000 1.859 0.010 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:1667(map_array)\n", - " 46510 0.548 0.000 1.787 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:495(__mul__)\n", - " 2 0.000 0.000 1.768 0.884 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/rates.py:126(_fetch_rates)\n", - " 6 0.000 0.000 1.665 0.277 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:4789(apply)\n", - " 6 0.000 0.000 1.665 0.277 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1409(apply)\n", - " 6 0.000 0.000 1.664 0.277 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1482(apply_standard)\n", - " 1 0.000 0.000 1.603 1.603 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:220(init_risk_free_rate)\n", - " 2 0.001 0.000 1.558 0.779 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:840(resample)\n", - " 46513 0.066 0.000 1.514 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:404(__radd__)\n", - " 46513 0.865 0.000 1.448 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:317(__add__)\n", - " 2 0.000 0.000 1.317 0.658 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:9382(resample)\n", - " 2 0.000 0.000 1.317 0.658 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:2045(get_resampler)\n", - " 2 0.000 0.000 1.316 0.658 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:2210(_get_resampler)\n", - " 2 0.000 0.000 1.316 0.658 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:163(__init__)\n", - " 2 0.000 0.000 1.316 0.658 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:246(_get_binner)\n", - " 2 0.000 0.000 1.316 0.658 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:1737(_get_binner_for_time)\n", - " 2 0.000 0.000 1.315 0.658 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:2285(_get_time_bins)\n", - " 3 0.000 0.000 1.304 0.435 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:500(request)\n", - " 1 0.001 0.001 1.299 1.299 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:459(option_chain)\n", - " 3855 0.067 0.000 1.261 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:673(to_datetime)\n", - " 46806 0.434 0.000 1.248 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:105(__init__)\n", - " 1 0.003 0.003 1.244 1.244 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:130(list_contracts)\n", - " 1 0.000 0.000 1.223 1.223 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:74(request_from_proxy)\n", - " 1 0.000 0.000 1.223 1.223 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/api.py:14(request)\n", - " 3 0.000 0.000 1.221 0.407 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:673(send)\n", - " 2 0.000 0.000 1.187 0.593 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/obbject.py:126(to_dataframe)\n", - " 56 0.000 0.000 1.163 0.021 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:704(readinto)\n", - " 1 0.000 0.000 1.148 1.148 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/obbject.py:86(to_df)\n", - " 2 0.001 0.001 1.134 0.567 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/utils.py:21(basemodel_to_df)\n", - " 50 1.109 0.022 1.109 0.022 {method 'recv_into' of '_socket.socket' objects}\n", - " 3 0.000 0.000 1.095 0.365 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:613(send)\n", - " 3 0.000 0.000 1.091 0.364 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:594(urlopen)\n", - " 3 0.000 0.000 1.087 0.362 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:379(_make_request)\n", - " 3 0.000 0.000 1.047 0.349 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:481(getresponse)\n", - " 3 0.000 0.000 1.046 0.349 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1351(getresponse)\n", - " 3 0.000 0.000 1.046 0.349 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:318(begin)\n", - " 3 0.000 0.000 1.043 0.348 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:285(_read_status)\n", - " 45 0.000 0.000 1.043 0.023 {method 'readline' of '_io.BufferedReader' objects}\n", - " 641 0.001 0.000 1.033 0.002 {built-in method builtins.next}\n", - " 318 0.000 0.000 1.028 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:132(__enter__)\n", - " 4 0.000 0.000 0.991 0.248 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Context.py:16(Context)\n", - " 3851 0.055 0.000 0.961 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:314(_convert_listlike_datetimes)\n", - " 1 0.000 0.000 0.884 0.884 /var/folders/j0/80hkbygd4lb27h9mw76gqzpw0000gn/T/ipykernel_13480/2907384584.py:1()\n", - " 1 0.001 0.001 0.884 0.884 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:694(__init__)\n", - " 36251 0.235 0.000 0.760 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:346(_name_get)\n", - " 1 0.000 0.000 0.707 0.707 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:292(prev_close)\n", - " 2 0.000 0.000 0.695 0.347 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:307(div_yield)\n", - " 2 0.000 0.000 0.695 0.347 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:322(div_yield_history)\n", - " 2 0.000 0.000 0.686 0.343 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/equity_fundamental.py:930(dividends)\n", - " 1 0.000 0.000 0.657 0.657 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/equity_price.py:360(quote)\n", - " 3902 0.031 0.000 0.571 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:320(__new__)\n", - " 4323 0.077 0.000 0.555 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:329(_from_sequence_not_strict)\n", - " 3719 0.017 0.000 0.517 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:259(_box_as_indexlike)\n", - " 94042 0.215 0.000 0.469 0.000 {built-in method builtins.any}\n", - " 180 0.007 0.000 0.445 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6454(map)\n", - "536983/535010 0.241 0.000 0.408 0.000 {built-in method builtins.isinstance}\n", - " 181 0.002 0.000 0.408 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:78(method)\n", - " 181 0.007 0.000 0.405 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:736(map)\n", - " 94 0.020 0.000 0.397 0.004 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:601()\n", - " 94 0.012 0.000 0.377 0.004 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:424(liquidity_check)\n", - " 36251 0.090 0.000 0.348 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:330(_name_includes_bit_suffix)\n", - " 46806 0.267 0.000 0.322 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:231(_fix)\n", - " 880 0.034 0.000 0.315 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:475(__new__)\n", - " 746 0.009 0.000 0.313 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4062(__getitem__)\n", - " 4323 0.092 0.000 0.300 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2184(_sequence_to_dt64)\n", - " 46513 0.139 0.000 0.273 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/calendar.py:122(monthrange)\n", - " 35888 0.132 0.000 0.258 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numerictypes.py:357(issubdtype)\n", - " 5044 0.027 0.000 0.257 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5373(__getitem__)\n", - " 4843 0.024 0.000 0.244 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:373(__getitem__)\n", - " 380 0.004 0.000 0.232 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4130(_getitem_bool_array)\n", - " 8172 0.043 0.000 0.227 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2428(maybe_convert_dtype)\n", - " 242 0.005 0.000 0.226 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:317(apply)\n", - " 1491 0.032 0.000 0.212 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:517(sanitize_array)\n", - " 7751 0.021 0.000 0.189 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:416(extract_array)\n", - "1184/1176 0.002 0.000 0.185 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:101(isna)\n", - "1184/1176 0.004 0.000 0.182 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:184(_isna)\n", - " 91 0.002 0.000 0.182 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:611()\n", - " 2 0.000 0.000 0.182 0.091 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:7484(ffill)\n", - " 2 0.000 0.000 0.182 0.091 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:7061(_pad_or_backfill)\n", - " 2 0.000 0.000 0.182 0.091 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:299(pad_or_backfill)\n", - " 4 0.000 0.000 0.181 0.045 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1706(pad_or_backfill)\n", - " 91 0.004 0.000 0.180 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:348(available_close_check)\n", - " 45 0.001 0.000 0.177 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:261(_isna_array)\n", - " 694 0.015 0.000 0.177 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7164(_cmp_method)\n", - " 14 0.176 0.013 0.176 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:305(_isna_string_dtype)\n", - " 46511 0.175 0.000 0.175 0.000 {method 'replace' of 'datetime.datetime' objects}\n", - " 4844 0.028 0.000 0.169 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:278(__getitem__)\n", - " 5 0.000 0.000 0.166 0.033 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:492(to_numpy)\n", - " 5 0.000 0.000 0.166 0.033 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:226(isna)\n", - " 775 0.043 0.000 0.156 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:977(_cmp_method)\n", - " 548/543 0.019 0.000 0.152 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:389(__init__)\n", - " 433 0.006 0.000 0.143 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:674(astype)\n", - " 949/476 0.003 0.000 0.141 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:50(__le__)\n", - " 374448 0.138 0.000 0.138 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:195()\n", - " 202 0.002 0.000 0.135 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4142(_take_with_is_copy)\n", - " 3848 0.064 0.000 0.134 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:126(_guess_datetime_format_for_array)\n", - " 46513 0.117 0.000 0.130 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/calendar.py:115(weekday)\n", - " 52134 0.057 0.000 0.127 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/generic.py:42(_instancecheck)\n", - " 202 0.003 0.000 0.126 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4027(take)\n", - " 11 0.000 0.000 0.126 0.011 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:890(content)\n", - " 30 0.000 0.000 0.126 0.004 {method 'join' of 'bytes' objects}\n", - " 33 0.000 0.000 0.125 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:816(generate)\n", - " 33 0.000 0.000 0.125 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:1038(stream)\n", - " 30 0.000 0.000 0.125 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:910(read)\n", - " 35804 0.074 0.000 0.125 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:178(_datetime_metadata_str)\n", - " 217 0.002 0.000 0.123 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:869(take)\n", - " 33 0.001 0.000 0.123 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:858(_raw_read)\n", - " 33 0.000 0.000 0.121 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:801(_fp_read)\n", - " 33 0.000 0.000 0.121 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:457(read)\n", - " 30 0.000 0.000 0.121 0.004 {method 'read' of '_io.BufferedReader' objects}\n", - " 71776 0.086 0.000 0.120 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numerictypes.py:283(issubclass_)\n", - " 2 0.000 0.000 0.118 0.059 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:10170(apply)\n", - " 2 0.000 0.000 0.118 0.059 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:864(apply)\n", - " 2 0.000 0.000 0.118 0.059 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1061(apply_standard)\n", - " 2 0.001 0.000 0.117 0.058 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1070(apply_series_generator)\n", - " 94 0.002 0.000 0.112 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:333()\n", - " 291 0.037 0.000 0.112 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1157(maybe_infer_to_datetimelike)\n", - " 140418 0.111 0.000 0.111 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:172()\n", - " 8282 0.034 0.000 0.110 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1163(is_float_dtype)\n", - " 94 0.003 0.000 0.105 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:696(generate_option_tick_new)\n", - " 421 0.002 0.000 0.104 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:325(_from_sequence)\n", - "282483/282300 0.082 0.000 0.101 0.000 {built-in method builtins.getattr}\n", - " 4010 0.092 0.000 0.100 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2354(objects_to_datetime64)\n", - " 4037 0.055 0.000 0.099 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:545(_box_func)\n", - " 4324 0.031 0.000 0.097 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2425(ensure_arraylike_for_datetimelike)\n", - " 10753 0.037 0.000 0.093 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1198(is_bool_dtype)\n", - " 220 0.003 0.000 0.092 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:623(reindex_indexer)\n", - " 949/476 0.007 0.000 0.091 0.000 {built-in method _operator.le}\n", - " 293 0.074 0.000 0.091 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:447(astype)\n", - " 1 0.000 0.000 0.089 0.089 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/ticker.py:157(info)\n", - " 1 0.000 0.000 0.089 0.089 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/base.py:230(get_info)\n", - " 1 0.000 0.000 0.089 0.089 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/scrapers/quote.py:505(info)\n", - " 604/303 0.003 0.000 0.088 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:58(__ge__)\n", - " 2 0.000 0.000 0.088 0.044 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/scrapers/quote.py:604(_fetch_info)\n", - " 2 0.000 0.000 0.086 0.043 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/data.py:426(get_raw_json)\n", - " 8/2 0.002 0.000 0.086 0.043 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/utils.py:98(wrapper)\n", - " 2 0.000 0.000 0.086 0.043 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/data.py:345(get)\n", - " 2 0.000 0.000 0.085 0.043 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/data.py:353(_make_request)\n", - " 2 0.000 0.000 0.082 0.041 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:593(get)\n", - " 14610 0.011 0.000 0.081 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/holiday.py:360()\n", - " 201 0.002 0.000 0.078 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6110(_cmp_method)\n", - " 199 0.003 0.000 0.076 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:687()\n", - " 2104 0.029 0.000 0.075 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:419(check_array_indexer)\n", - " 604/303 0.006 0.000 0.074 0.000 {built-in method _operator.ge}\n", - " 6458 0.059 0.000 0.073 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:649(_simple_new)\n", - " 12616 0.023 0.000 0.073 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1375(_is_dtype)\n", - " 3 0.000 0.000 0.072 0.024 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:750(merge_environment_settings)\n", - " 1084 0.006 0.000 0.072 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1287(take_nd)\n", - " 3 0.000 0.000 0.072 0.024 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:826(get_environ_proxies)\n", - " 282 0.002 0.000 0.071 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1176(__getitem__)\n", - " 52134 0.050 0.000 0.069 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/generic.py:37(_check)\n", - " 37423 0.065 0.000 0.069 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:645(__iter__)\n", - " 1074 0.005 0.000 0.067 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6284(__getattr__)\n", - "1232/1132 0.006 0.000 0.066 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:59(take_nd)\n", - " 3 0.000 0.000 0.064 0.021 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:765(should_bypass_proxies)\n", - " 3 0.000 0.000 0.064 0.021 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2672(proxy_bypass)\n", - " 280 0.001 0.000 0.062 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1719(_getitem_axis)\n", - " 10 0.000 0.000 0.062 0.006 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:798(tolist)\n", - " 10 0.006 0.001 0.062 0.006 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/base.py:2058(tolist)\n", - " 3 0.000 0.000 0.061 0.020 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:172(agg)\n", - " 2056 0.012 0.000 0.060 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1596(pandas_dtype)\n", - " 206 0.002 0.000 0.060 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6662(copy)\n", - " 276 0.002 0.000 0.059 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1756(_get_slice_axis)\n", - " 4306 0.059 0.000 0.059 0.000 {built-in method numpy.array}\n", - " 248534 0.058 0.000 0.058 0.000 {built-in method builtins.abs}\n", - " 3322 0.057 0.000 0.057 0.000 {method 'reduce' of 'numpy.ufunc' objects}\n", - " 276 0.024 0.000 0.055 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4361(_slice)\n", - " 130 0.004 0.000 0.055 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:456(_array_strptime_with_fallback)\n", - " 168511 0.054 0.000 0.054 0.000 {built-in method builtins.issubclass}\n", - " 6 0.000 0.000 0.053 0.009 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ssl.py:1299(recv_into)\n", - " 6 0.000 0.000 0.053 0.009 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ssl.py:1157(read)\n", - " 6 0.053 0.009 0.053 0.009 {method 'read' of '_ssl._SSLSocket' objects}\n", - " 211 0.003 0.000 0.052 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:557(copy)\n", - " 1296/916 0.031 0.000 0.051 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:390(_get_getitem_freq)\n", - " 2296 0.006 0.000 0.051 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:481(ensure_wrapped_if_datetimelike)\n", - " 71697 0.051 0.000 0.051 0.000 {method 'format' of 'str' objects}\n", - " 8 0.000 0.000 0.050 0.006 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/from_thread.py:455(start_blocking_portal)\n", - " 110 0.049 0.000 0.050 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2159(as_unit)\n", - " 2059 0.008 0.000 0.050 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/extension.py:67(fget)\n", - " 4775 0.045 0.000 0.050 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:304(_simple_new)\n", - " 6980 0.049 0.000 0.049 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/holiday.py:97(nearest_workday)\n", - " 3 0.000 0.000 0.048 0.016 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2658(proxy_bypass_macosx_sysconf)\n", - " 6380 0.048 0.000 0.048 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/easter.py:16(easter)\n", - " 11217 0.024 0.000 0.048 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1434(_is_dtype_type)\n", - " 3 0.048 0.016 0.048 0.016 {built-in method _scproxy._get_proxy_settings}\n", - " 2 0.000 0.000 0.048 0.024 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:343(aggregate)\n", - " 2 0.000 0.000 0.047 0.024 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:415(agg_dict_like)\n", - " 4217 0.009 0.000 0.047 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:536(is_string_dtype)\n", - " 2 0.000 0.000 0.047 0.024 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1575(agg_or_apply_dict_like)\n", - " 36 0.000 0.000 0.047 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1087(join)\n", - " 46960 0.047 0.000 0.047 0.000 {built-in method builtins.min}\n", - " 1128 0.022 0.000 0.047 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:120(_take_nd_ndarray)\n", - " 37 0.000 0.000 0.046 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1125(_wait_for_tstate_lock)\n", - "27069/20900 0.039 0.000 0.046 0.000 {built-in method builtins.len}\n", - " 217 0.002 0.000 0.045 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6201(_construct_result)\n", - " 5339 0.014 0.000 0.045 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7688(maybe_extract_name)\n", - " 388 0.004 0.000 0.045 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4626(_get_item_cache)\n", - " 1 0.000 0.000 0.044 0.044 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/scrapers/quote.py:578(_fetch)\n", - "9211/8982 0.030 0.000 0.043 0.000 {built-in method numpy.asarray}\n", - " 1721 0.004 0.000 0.043 0.000 {method 'any' of 'numpy.ndarray' objects}\n", - " 1 0.000 0.000 0.042 0.042 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/scrapers/quote.py:593(_fetch_additional_info)\n", - " 16 0.000 0.000 0.041 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:694(__init__)\n", - " 3 0.000 0.000 0.039 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:365(request)\n", - " 383 0.003 0.000 0.039 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:3983(_ixs)\n", - " 128 0.006 0.000 0.039 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_exceptions.py:34(find_stack_level)\n", - " 273 0.001 0.000 0.038 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3122(duplicated)\n", - " 1722 0.002 0.000 0.038 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:55(_any)\n", - " 3 0.000 0.000 0.038 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1287(endheaders)\n", - " 3 0.000 0.000 0.038 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1049(_send_output)\n", - " 4 0.000 0.000 0.038 0.009 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:988(send)\n", - " 179 0.004 0.000 0.038 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:666(_parse)\n", - " 1 0.000 0.000 0.037 0.037 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:278(connect)\n", - " 1 0.000 0.000 0.037 0.037 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:193(_new_conn)\n", - " 1 0.000 0.000 0.037 0.037 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/connection.py:27(create_connection)\n", - " 1 0.036 0.036 0.036 0.036 {method 'connect' of '_socket.socket' objects}\n", - " 120 0.001 0.000 0.036 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/arraysetops.py:766(isin)\n", - " 14 0.000 0.000 0.035 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:157(concat)\n", - " 13896 0.013 0.000 0.035 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:173(search)\n", - " 22226 0.015 0.000 0.035 0.000 :117(__instancecheck__)\n", - " 382 0.002 0.000 0.034 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2632(check_bool_indexer)\n", - " 1 0.000 0.000 0.034 0.034 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/main.py:456(model_json_schema)\n", - " 1 0.000 0.000 0.034 0.034 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2246(model_json_schema)\n", - " 1 0.000 0.000 0.034 0.034 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:9492(pivot_table)\n", - " 1 0.000 0.000 0.034 0.034 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/pivot.py:61(pivot_table)\n", - "1473/1462 0.004 0.000 0.034 0.000 {built-in method builtins.all}\n", - " 1 0.000 0.000 0.034 0.034 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/pivot.py:118(__internal_pivot_table)\n", - " 1 0.000 0.000 0.033 0.033 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:394(generate)\n", - " 365 0.002 0.000 0.033 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:769(_try_cast)\n", - " 120 0.015 0.000 0.033 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/arraysetops.py:524(in1d)\n", - " 576 0.003 0.000 0.033 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:807(_set_axis)\n", - " 41754 0.033 0.000 0.033 0.000 {built-in method numpy.datetime_data}\n", - " 386 0.002 0.000 0.033 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1095(__getitem__)\n", - " 213 0.002 0.000 0.032 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:288(comparison_op)\n", - " 23369 0.023 0.000 0.032 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1399(_get_dtype)\n", - " 130 0.002 0.000 0.031 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1200(maybe_cast_to_datetime)\n", - " 175/1 0.002 0.000 0.031 0.031 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:443(generate_inner)\n", - " 215/1 0.000 0.000 0.031 0.031 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_schema_generation_shared.py:36(__call__)\n", - " 2/1 0.000 0.000 0.031 0.031 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:522(new_handler_func)\n", - " 1 0.000 0.000 0.030 0.030 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/main.py:673(__get_pydantic_json_schema__)\n", - " 1 0.000 0.000 0.030 0.030 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:248(modify_model_json_schema)\n", - " 4812 0.030 0.000 0.030 0.000 {method 'view' of 'numpy.generic' objects}\n", - " 175/1 0.001 0.000 0.030 0.030 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:479(handler_func)\n", - " 413 0.018 0.000 0.030 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/base.py:549(find)\n", - " 290 0.002 0.000 0.030 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5425(_getitem_slice)\n", - " 1 0.000 0.000 0.030 0.030 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1399(model_schema)\n", - " 185 0.001 0.000 0.030 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:89(get_option_specifics_from_key)\n", - " 1 0.000 0.000 0.030 0.030 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:975(function_before_schema)\n", - " 1 0.000 0.000 0.030 0.030 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1494(model_fields_schema)\n", - " 14 0.000 0.000 0.030 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:622(get_result)\n", - " 185 0.002 0.000 0.030 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:662(parse_option_tick)\n", - " 53/43 0.001 0.000 0.029 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4271(__setitem__)\n", - " 246 0.002 0.000 0.029 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:674(_with_infer)\n", - " 4 0.000 0.000 0.029 0.007 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:646(__exit__)\n", - " 4 0.000 0.000 0.029 0.007 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:216(shutdown)\n", - " 1 0.000 0.000 0.029 0.029 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1309(_named_required_fields_schema)\n", - " 4 0.000 0.000 0.029 0.007 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/validate_call_decorator.py:28(validate_call)\n", - " 4 0.000 0.000 0.029 0.007 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/validate_call_decorator.py:51(validate)\n", - " 1247 0.007 0.000 0.029 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:97(is_bool_indexer)\n", - " 586 0.001 0.000 0.029 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:236(set_axis)\n", - " 4 0.001 0.000 0.029 0.007 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_validate_call.py:26(__init__)\n", - " 14795 0.017 0.000 0.028 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:272(_compile)\n", - " 144 0.001 0.000 0.027 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7218(_construct_result)\n", - " 1096 0.027 0.000 0.027 0.000 {method 'copy' of 'numpy.ndarray' objects}\n", - " 586 0.001 0.000 0.027 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:86(_validate_set_axis)\n", - " 49 0.000 0.000 0.027 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4514(_set_item)\n", - " 10 0.000 0.000 0.027 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4342(_getitem_slice)\n", - " 2 0.000 0.000 0.027 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:425(compute_dict_like)\n", - " 2992 0.011 0.000 0.026 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6301(__setattr__)\n", - " 38 0.000 0.000 0.026 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:540(new_handler_func)\n", - " 38 0.001 0.000 0.026 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2466(json_schema_update_func)\n", - " 67/41 0.001 0.000 0.025 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:620(generate_schema)\n", - " 91 0.000 0.000 0.025 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:1364(_duplicated)\n", - " 2 0.000 0.000 0.025 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:496()\n", - " 91 0.001 0.000 0.025 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/base.py:1170(duplicated)\n", - " 38 0.000 0.000 0.025 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1377(model_field_schema)\n", - " 671 0.004 0.000 0.024 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:790(copy)\n", - " 92 0.000 0.000 0.024 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:42(__ne__)\n", - " 49 0.001 0.000 0.024 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4481(_set_item_mgr)\n", - " 5 0.000 0.000 0.023 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:423(dict_to_mgr)\n", - " 4217 0.018 0.000 0.023 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:572(condition)\n", - " 37 0.000 0.000 0.023 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1033(default_schema)\n", - " 2096 0.010 0.000 0.023 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:892(getfile)\n", - " 85/41 0.001 0.000 0.023 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:906(_generate_schema_inner)\n", - " 91 0.005 0.000 0.022 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:994(duplicated)\n", - " 2545 0.007 0.000 0.022 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:137(is_object_dtype)\n", - " 2 0.004 0.002 0.022 0.011 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/utils.py:31()\n", - " 85/41 0.002 0.000 0.022 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:931(match_type)\n", - " 6 0.002 0.000 0.022 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2499(getproxies_environment)\n", - " 225 0.001 0.000 0.022 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:157(take)\n", - " 8 0.000 0.000 0.022 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:96(arrays_to_mgr)\n", - " 7630 0.021 0.000 0.021 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/holiday.py:75(sunday_to_monday)\n", - " 10 0.000 0.000 0.021 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1087(_slice)\n", - " 4 0.001 0.000 0.021 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1871(_callable_schema)\n", - " 1002 0.002 0.000 0.021 0.000 :859(__iter__)\n", - " 10 0.000 0.000 0.020 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1974(get_slice)\n", - " 775 0.006 0.000 0.020 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:524(_validate_comparison_value)\n", - " 7351 0.014 0.000 0.020 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:576(tz)\n", - " 22226 0.020 0.000 0.020 0.000 {built-in method _abc._abc_instancecheck}\n", - " 46 0.001 0.000 0.020 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1347(insert)\n", - " 2 0.000 0.000 0.020 0.010 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:504(wrap_results_dict_like)\n", - " 318 0.001 0.000 0.020 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:141(__exit__)\n", - " 516 0.002 0.000 0.020 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5437(_can_hold_identifiers_and_holds_name)\n", - " 182 0.001 0.000 0.020 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6519(sum)\n", - " 36251 0.020 0.000 0.020 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:24(_kind_name)\n", - " 1397 0.013 0.000 0.019 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6236(__finalize__)\n", - " 4760 0.019 0.000 0.019 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2148(_creso)\n", - " 132 0.002 0.000 0.019 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:106(_ensure_data)\n", - " 182 0.001 0.000 0.019 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12498(sum)\n", - " 251 0.002 0.000 0.019 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_strptime.py:564(_strptime_datetime)\n", - " 3715 0.004 0.000 0.018 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/main.py:352(model_dump)\n", - " 182 0.002 0.000 0.018 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12459(_min_count_stat_function)\n", - " 8 0.000 0.000 0.018 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/generic.py:232(aggregate)\n", - " 8 0.000 0.000 0.018 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:3417(last)\n", - " 8 0.000 0.000 0.018 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1896(_agg_general)\n", - " 255/253 0.002 0.000 0.018 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:1131(take)\n", - " 560 0.006 0.000 0.018 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1863(from_array)\n", - " 18 0.001 0.000 0.018 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1574(_generate_parameter_schema)\n", - " 885 0.009 0.000 0.018 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:525(_unbox_scalar)\n", - " 8 0.000 0.000 0.017 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1957(_cython_agg_general)\n", - " 775 0.002 0.000 0.017 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:718(_unbox)\n", - " 1039 0.002 0.000 0.017 0.000 :674(__getitem__)\n", - " 37 0.001 0.000 0.017 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2064(encode_default)\n", - " 377 0.003 0.000 0.017 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4608(_box_col_values)\n", - " 8 0.000 0.000 0.017 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2121(create_block_manager_from_column_arrays)\n", - " 179 0.002 0.000 0.017 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:199(split)\n", - " 251 0.009 0.000 0.017 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_strptime.py:309(_strptime)\n", - " 1128 0.005 0.000 0.017 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:564(_take_preprocess_indexer_and_fill_value)\n", - " 719 0.008 0.000 0.017 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:659(_constructor_from_mgr)\n", - " 185 0.001 0.000 0.017 0.000 {built-in method strptime}\n", - " 130 0.005 0.000 0.016 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:125(f)\n", - " 1018 0.013 0.000 0.016 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:836(_isnan)\n", - " 192 0.001 0.000 0.016 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6418(_reduce)\n", - " 61198 0.016 0.000 0.016 0.000 {method 'weekday' of 'datetime.date' objects}\n", - " 4635 0.015 0.000 0.016 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:103(tz_to_dtype)\n", - " 605 0.003 0.000 0.015 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:145(_get_option)\n", - " 12 0.001 0.000 0.015 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5290(sort_index)\n", - " 3752 0.015 0.000 0.015 0.000 {method 'to_python' of 'pydantic_core._pydantic_core.SchemaSerializer' objects}\n", - " 2 0.000 0.000 0.015 0.008 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/obbject.py:168(is_list_of_basemodel)\n", - " 354 0.007 0.000 0.015 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:842(_engine)\n", - " 8 0.001 0.000 0.015 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2190(_form_blocks)\n", - " 1660 0.003 0.000 0.015 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:537(_check_compatible_with)\n", - " 3717 0.002 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/obbject.py:169()\n", - " 18 0.000 0.000 0.014 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2066(_apply_annotations)\n", - " 111/74 0.001 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/type_adapter.py:132(wrapped)\n", - " 37 0.000 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/type_adapter.py:189(__init__)\n", - " 1414 0.001 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:189(__next__)\n", - " 1721 0.011 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:278(__init__)\n", - " 10 0.000 0.000 0.014 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:3936(sort_index)\n", - " 1 0.000 0.000 0.014 0.014 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/generic.py:1420(aggregate)\n", - " 22 0.013 0.001 0.014 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2246(_stack_arrays)\n", - " 1 0.000 0.000 0.014 0.014 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:558(apply_str)\n", - " 2 0.000 0.000 0.014 0.007 {method 'throw' of 'generator' objects}\n", - " 120 0.002 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:823(take)\n", - " 1039 0.002 0.000 0.013 0.000 :756(encode)\n", - " 1 0.000 0.000 0.013 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:681(_apply_str)\n", - " 1 0.000 0.000 0.013 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:2264(count)\n", - " 18 0.000 0.000 0.013 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_schema_generation_shared.py:82(__call__)\n", - " 18 0.000 0.000 0.013 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2085(inner_handler)\n", - " 1271 0.012 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:551(maybe_promote)\n", - " 377 0.006 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1012(iget)\n", - " 8 0.000 0.000 0.013 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:365(grouped_reduce)\n", - " 209 0.001 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1782(_consolidate_inplace)\n", - " 10921 0.009 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:123()\n", - " 7384 0.009 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:334(is_hashable)\n", - " 1157 0.003 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:339(_from_mgr)\n", - " 182 0.001 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:76(_f)\n", - " 1414 0.008 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:77(get_token)\n", - " 3 0.000 0.000 0.012 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:506(nested_data_to_arrays)\n", - " 46 0.001 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6956(insert)\n", - " 3 0.000 0.000 0.012 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:793(to_arrays)\n", - " 201 0.007 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2313(is_unique)\n", - " 1601 0.008 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:769(_assert_tzawareness_compat)\n", - " 5 0.000 0.000 0.012 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:7142(fillna)\n", - " 37 0.001 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/type_adapter.py:267(_init_core_attrs)\n", - " 8 0.000 0.000 0.012 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1971(array_func)\n", - " 91 0.000 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:515(view)\n", - " 4323 0.012 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2310(_construct_from_dt64_naive)\n", - " 8 0.000 0.000 0.012 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:812(_cython_operation)\n", - " 91 0.001 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:117(view)\n", - " 3718 0.012 0.000 0.012 0.000 {method 'view' of 'numpy.ndarray' objects}\n", - " 27425 0.011 0.000 0.012 0.000 {built-in method builtins.hasattr}\n", - " 10 0.001 0.000 0.011 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:533(_maybe_downcast)\n", - " 5 0.000 0.000 0.011 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:180(fillna)\n", - "1213/1212 0.011 0.000 0.011 0.000 {method 'encode' of 'str' objects}\n", - " 8 0.000 0.000 0.011 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:523(cython_operation)\n", - " 8 0.000 0.000 0.011 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:310(_cython_op_ndim_compat)\n", - " 530 0.003 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:71(_wrapreduction)\n", - " 36 0.000 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:610(factorize)\n", - " 4 0.000 0.000 0.011 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6538(dropna)\n", - " 8 0.010 0.001 0.011 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:354(_call_cython_op)\n", - " 7 0.000 0.000 0.011 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1643(fillna)\n", - " 3 0.000 0.000 0.011 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:457(prepare_request)\n", - " 3717 0.006 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_model_construction.py:268(__instancecheck__)\n", - " 130 0.000 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:850(_maybe_mask_results)\n", - " 12 0.000 0.000 0.010 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/from_thread.py:308(start_task_soon)\n", - " 225 0.003 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:875(_parse_numeric_token)\n", - " 92 0.002 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:1148(take)\n", - " 549 0.002 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:166(simplefilter)\n", - " 131 0.001 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:843(_hasna)\n", - " 8 0.000 0.000 0.010 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/_backends/_asyncio.py:980(_spawn_task_from_thread)\n", - " 797 0.005 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5323(__contains__)\n", - " 8 0.000 0.000 0.010 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/_backends/_asyncio.py:2483(run_sync_from_thread)\n", - " 4 0.001 0.000 0.009 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:555()\n", - " 144 0.002 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1146(take)\n", - " 2 0.003 0.002 0.009 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:891(_list_of_dict_to_arrays)\n", - " 10921 0.009 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:121(classes)\n", - " 863 0.009 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:467(__enter__)\n", - " 41 0.000 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:589(clean_schema)\n", - " 1 0.000 0.000 0.009 0.009 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:743(group_info)\n", - " 1 0.000 0.000 0.009 0.009 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:758(_get_compressed_codes)\n", - " 2 0.000 0.000 0.009 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6731(drop_duplicates)\n", - " 185 0.001 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:389(new_func)\n", - " 265 0.004 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:231(asarray_tuplesafe)\n", - " 8267 0.007 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1194()\n", - " 587 0.006 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:274(full)\n", - " 609 0.003 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:127(_get_single_key)\n", - " 765 0.003 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:784(name)\n", - " 15/7 0.001 0.000 0.009 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:622(convert)\n", - " 37 0.000 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/type_adapter.py:45(_get_schema)\n", - " 14/12 0.000 0.000 0.009 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1040(_match_generic_type)\n", - " 879 0.004 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:609(_dtype_to_subclass)\n", - " 3715 0.005 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/utils.py:49()\n", - " 393 0.001 0.000 0.009 0.000 {method 'all' of 'numpy.ndarray' objects}\n", - " 180 0.001 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:441(maybe_cast_pointwise_result)\n", - " 130 0.002 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1240(_ensure_nanosecond_dtype)\n", - " 18760 0.008 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:551(dtype)\n", - " 3 0.000 0.000 0.008 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:351(prepare)\n", - " 195 0.001 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:586()\n", - " 5 0.000 0.000 0.008 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6997(sort_values)\n", - " 1 0.000 0.000 0.008 0.008 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:868(read_csv)\n", - " 3 0.000 0.000 0.008 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2685(getproxies)\n", - " 12 0.000 0.000 0.008 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:59(get_indexer_indexer)\n", - " 1787 0.004 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:319(asi8)\n", - " 314 0.003 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1519(construct_1d_arraylike_from_scalar)\n", - " 1 0.000 0.000 0.008 0.008 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:583(_read)\n", - " 601 0.005 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:182(_add_filter)\n", - " 925 0.003 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2152(unit)\n", - " 445 0.001 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:163(match)\n", - " 12 0.000 0.000 0.008 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1369(_union_schema)\n", - " 26 0.001 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:708(_slice_take_blocks_ax0)\n", - " 1666/186 0.004 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:128(deepcopy)\n", - " 1 0.000 0.000 0.008 0.008 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:9863(unstack)\n", - " 182 0.001 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:455(newfunc)\n", - " 1 0.000 0.000 0.008 0.008 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:489(unstack)\n", - " 10 0.002 0.000 0.008 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas_market_calendars/calendars/nyse.py:869(adhoc_holidays)\n", - " 383 0.001 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:678(_constructor_sliced_from_mgr)\n", - " 1 0.000 0.000 0.008 0.008 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:525(_unstack_frame)\n", - " 397 0.001 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:61(_all)\n", - " 269 0.006 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:273(is_dict_like)\n", - " 390 0.001 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:583(copy_func)\n", - " 363 0.001 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/common.py:81(get_op_result_name)\n", - " 16 0.000 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:1102(groupings)\n", - " 1240 0.001 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7593(ensure_index)\n", - " 211 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1764(is_consolidated)\n", - " 2 0.000 0.000 0.007 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:10803(where)\n", - " 6590 0.007 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:831(_reset_identity)\n", - " 220 0.004 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:239(maybe_convert_indices)\n", - " 2 0.000 0.000 0.007 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:10615(_where)\n", - " 182 0.001 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:604(nansum)\n", - " 2 0.000 0.000 0.007 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:687(codes)\n", - " 2 0.000 0.000 0.007 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:690()\n", - " 8 0.000 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:689(codes)\n", - " 9 0.000 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1296(__init__)\n", - " 209 0.001 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1772(_consolidate_check)\n", - " 4 0.000 0.000 0.007 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:777(_codes_and_uniques)\n", - " 4 0.000 0.000 0.007 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:209(_maybe_cache)\n", - " 240 0.001 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2836(min)\n", - " 8 0.000 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:405(_gotitem)\n", - " 194 0.002 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/ipkernel.py:775(_clean_thread_parent_frames)\n", - " 510 0.001 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_strptime.py:26(_getlang)\n", - " 4 0.000 0.000 0.007 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:11603(any)\n", - " 14 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:699(new_axes)\n", - " 4 0.000 0.000 0.007 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12169(_logical_func)\n", - " 99 0.001 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:800(_generate_schema_from_property)\n", - " 14 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:702()\n", - " 8 0.000 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6186(_get_indexer_strict)\n", - " 4 0.000 0.000 0.007 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:11435(_reduce)\n", - " 32 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:582(get_loc)\n", - " 2 0.000 0.000 0.007 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6828(duplicated)\n", - " 7824 0.006 0.000 0.006 0.000 {built-in method __new__ of type object at 0x1096a5898}\n", - " 313 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:225(compile)\n", - " 1 0.000 0.000 0.006 0.006 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1907(read)\n", - " 4 0.000 0.000 0.006 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:245(_pad_or_backfill)\n", - " 188 0.002 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:259(maybe_downcast_to_dtype)\n", - " 825 0.005 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3777(get_loc)\n", - " 14 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:717(_get_concat_axis)\n", - " 4872 0.006 0.000 0.006 0.000 {method 'startswith' of 'str' objects}\n", - " 788 0.002 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1571(validate_all_hashable)\n", - " 2144 0.006 0.000 0.006 0.000 {built-in method numpy.empty}\n", - " 246 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:402(walk_core_schema)\n", - " 1236 0.004 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2537(dtype_to_unit)\n", - " 24/14 0.002 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:369(nargsort)\n", - " 26/25 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:38(__eq__)\n", - " 612 0.004 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2716(new_block)\n", - " 14148 0.006 0.000 0.006 0.000 {method 'search' of 're.Pattern' objects}\n", - " 510 0.001 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/locale.py:594(getlocale)\n", - " 4252 0.006 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:529(is_string_or_object_np_dtype)\n", - " 384 0.001 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1010(view)\n", - " 681 0.004 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2645(maybe_coerce_values)\n", - " 12 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:777(_concat_indexes)\n", - " 12 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5455(append)\n", - " 3 0.000 0.000 0.006 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:483(prepare_headers)\n", - " 10 0.000 0.000 0.006 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4201(_convert_slice_indexer)\n", - " 200 0.003 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1778()\n", - " 23 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3820(get_indexer)\n", - " 376 0.002 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:440(acquire)\n", - " 195 0.005 0.000 0.005 0.000 {method 'strftime' of 'datetime.date' objects}\n", - " 10 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:723(is_busday)\n", - " 314 0.002 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:33(seterr)\n", - " 186 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:227(_deepcopy_dict)\n", - " 5 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:3951(T)\n", - " 5 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:3767(transpose)\n", - " 1 0.000 0.000 0.005 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:110(__init__)\n", - " 4324 0.005 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2063(_maybe_pin_freq)\n", - " 10 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:1022(bdate_range)\n", - " 10 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:646(slice_indexer)\n", - " 13 0.005 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:1034(check_header_validity)\n", - " 390 0.002 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:82(shape)\n", - " 423 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:253(fill_value)\n", - " 14 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:405(__init__)\n", - " 630/246 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:196(walk)\n", - " 2299 0.005 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/base.py:238(construct_from_string)\n", - " 3 0.000 0.000 0.005 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_compiler.py:740(compile)\n", - " 10 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6618(slice_indexer)\n", - " 1418 0.004 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2765(check_dict_or_set_indexers)\n", - " 9 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1578(_wrap_aggregated_output)\n", - " 10 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6828(slice_locs)\n", - " 183 0.005 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:534(_scalar_from_string)\n", - " 4323 0.004 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2514(_validate_dt64_dtype)\n", - " 12 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5491(_concat)\n", - " 1333 0.003 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:734(name)\n", - " 193 0.005 0.000 0.005 0.000 {method 'take' of 'numpy.ndarray' objects}\n", - " 1266 0.004 0.000 0.005 0.000 :1207(_handle_fromlist)\n", - " 20 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6745(get_slice_bound)\n", - " 10 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6432(dtypes)\n", - " 8 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:5927(get_groupby)\n", - " 11 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/base.py:800(argsort)\n", - " 36 0.002 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:548(factorize_array)\n", - " 1610 0.002 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:831(_values)\n", - " 4 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4320(_setitem_array)\n", - " 406 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:773(_view)\n", - " 2 0.000 0.000 0.005 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6239(reset_index)\n", - " 37 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1095(nullable_schema)\n", - " 4615 0.005 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:152(cast_scalar_indexer)\n", - " 4 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:858(pad_or_backfill_inplace)\n", - " 193 0.004 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2353(copy)\n", - " 8 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:596(_homogenize)\n", - " 3843 0.003 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:909(__len__)\n", - " 194 0.001 0.000 0.005 0.000 {method 'sum' of 'numpy.ndarray' objects}\n", - " 10 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2259(_consolidate)\n", - " 4 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:918(new_func)\n", - " 11 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6133(_arith_method)\n", - " 4 0.001 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:968(_pad_2d)\n", - " 3717 0.004 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:915()\n", - " 347 0.002 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5170(_get_engine_target)\n", - " 307 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:301(maybe_iterable_to_list)\n", - " 3 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:979(parse)\n", - " 12 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1322(__contains__)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:191(_make_selectors)\n", - " 9/3 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:456(_parse_sub)\n", - " 12 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2982(get_loc)\n", - " 1177 0.003 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:696(_sanitize_ndim)\n", - " 9/3 0.003 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:516(_parse)\n", - " 4 0.001 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:149(should_cache)\n", - " 2 0.000 0.000 0.004 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:212(putmask)\n", - " 110 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:560(_validate_scalar)\n", - " 12 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:3308(_get_level_indexer)\n", - " 630/246 0.002 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:199(_walk)\n", - " 103 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:141(equals)\n", - " 6120 0.004 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/calendar.py:102(isleap)\n", - " 108 0.003 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:353(wrapper)\n", - " 194 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:47(_sum)\n", - " 26 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/concat.py:52(concat_compat)\n", - " 3 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4796(_drop_axis)\n", - " 30 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1194(_add_timedeltalike_scalar)\n", - " 134 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:189(_na_arithmetic_op)\n", - " 3 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:947(json)\n", - " 11 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6162(get_indexer_for)\n", - " 609 0.003 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:635(_get_root)\n", - " 1 0.004 0.004 0.004 0.004 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:504(lookback)\n", - " 5 0.001 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:122(get_group_index)\n", - " 1859 0.003 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:195(is_array_like)\n", - " 157 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:430(__enter__)\n", - " 661 0.002 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:180(blknos)\n", - " 8646 0.003 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2570(_validate_tz_from_dtype)\n", - " 1488 0.003 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1331(is_ea_or_datetimelike_dtype)\n", - " 10 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas_market_calendars/calendar_registry.py:41(get_calendar)\n", - " 12 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2957(_get_loc_single_level_index)\n", - "8234/8216 0.004 0.000 0.004 0.000 {built-in method builtins.hash}\n", - " 1006 0.004 0.000 0.004 0.000 {method 'match' of 're.Pattern' objects}\n", - " 2096 0.003 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:466(isframe)\n", - " 10 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas_market_calendars/class_registry.py:5(_regmeta_instance_factory)\n", - " 245 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2692(max)\n", - " 4 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:902(_fillna_prep)\n", - " 10 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:5565(_reindex_output)\n", - " 10 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas_market_calendars/market_calendar.py:107(__init__)\n", - " 97 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_daemon_thread.py:99(new_threading_enumerate)\n", - " 41 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:419(simplify_schema_references)\n", - " 14018 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:2287(cast)\n", - " 3 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/simplejson/__init__.py:459(loads)\n", - " 2 0.000 0.000 0.003 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1397(_getitem_axis)\n", - " 3 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/simplejson/decoder.py:379(decode)\n", - " 510 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/locale.py:479(_parse_localename)\n", - " 11 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5343(reindex)\n", - " 157 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:435(__exit__)\n", - " 2 0.000 0.000 0.003 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:430(_list_schema)\n", - " 2 0.000 0.000 0.003 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:214(get_compressed_ids)\n", - " 6 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5095(insert)\n", - " 3 0.003 0.001 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/simplejson/decoder.py:392(raw_decode)\n", - " 396 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:328(__init__)\n", - " 198 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2520(get_schema_or_ref)\n", - " 200 0.000 0.000 0.003 0.000 {method 'min' of 'numpy.ndarray' objects}\n", - " 2 0.000 0.000 0.003 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1205(_getbool_axis)\n", - " 12 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:558(_parse_with_reso)\n", - " 41 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:217(_ensure_arraylike)\n", - " 12 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:275(_parse_with_reso)\n", - " 1150 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:84()\n", - " 2 0.001 0.000 0.003 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:301(lexsort_indexer)\n", - " 9 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:5136(reindex)\n", - " 46 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5368(insert)\n", - " 10 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas_market_calendars/market_calendar.py:150(_prepare_regular_market_times)\n", - " 96 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1247(series_generator)\n", - " 10793 0.003 0.000 0.003 0.000 {method 'get' of 'dict' objects}\n", - " 439 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:243(__init__)\n", - " 106 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:187(validate_indices)\n", - " 6/2 0.000 0.000 0.003 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1438(putmask)\n", - " 28 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6925(f)\n", - " 2 0.000 0.000 0.003 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5433(drop)\n", - " 431 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:673(na_value_for_dtype)\n", - " 2 0.000 0.000 0.003 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4757(drop)\n", - " 200 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:43(_amin)\n", - " 1088 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:292(make_block_same_class)\n", - " 13 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:227(_encode_invalid_chars)\n", - " 1610 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2004(internal_values)\n", - " 4 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:452(split_and_operate)\n", - " 2 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_strptime.py:261(compile)\n", - " 2 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_strptime.py:238(pattern)\n", - " 181 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5134(array)\n", - " 1721 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/flags.py:51(__init__)\n", - " 3 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:928(_finalize_columns_and_data)\n", - " 879 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:591(_ensure_array)\n", - " 35 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:165(maybe_lift)\n", - " 34 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2276(_merge_blocks)\n", - " 609 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:676(_translate_key)\n", - " 12 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:424(str_schema)\n", - " 59 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4402(_check_setitem_copy)\n", - " 863 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:488(__exit__)\n", - " 433 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1253(iget)\n", - " 601 0.003 0.000 0.003 0.000 {method 'remove' of 'list' objects}\n", - " 312 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:209(count_not_none)\n", - " 99 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:77(get_type_ref)\n", - " 5 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:607(_init_dict)\n", - " 1251 0.002 0.000 0.003 0.000 {built-in method builtins.sum}\n", - " 3714 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/utils.py:50()\n", - " 1860 0.002 0.000 0.003 0.000 :760(decode)\n", - " 55 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5242(_sanitize_column)\n", - " 3 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:1006(convert_object_array)\n", - " 376 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1220(_get_value)\n", - " 3 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:1070()\n", - " 8 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4323(reindex)\n", - " 377 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1471(_set_as_cached)\n", - " 32 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:1028(convert)\n", - " 24 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:392(handle_call_schema)\n", - " 429 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:428(append)\n", - " 743 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2795(extend_blocks)\n", - " 16 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:325(__new__)\n", - " 134 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/computation/expressions.py:226(evaluate)\n", - " 3 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5993(set_index)\n", - " 373 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/dispatch.py:17(should_extension_dispatch)\n", - " 948 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:586(_get_axis)\n", - " 110 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas_market_calendars/market_calendar.py:171()\n", - " 24 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:379(handle_arguments_schema)\n", - " 361 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/getlimits.py:685(__init__)\n", - " 30 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6957()\n", - " 510 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/locale.py:396(normalize)\n", - " 1879 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/__init__.py:34(using_copy_on_write)\n", - " 1591 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1590()\n", - " 4 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/__extensions__.py:81(equity)\n", - " 52 0.002 0.000 0.002 0.000 {method 'argsort' of 'numpy.ndarray' objects}\n", - " 717 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2674(get_block_type)\n", - " 302 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:675(empty)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:9041(groupby)\n", - " 41 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:262(_get_hashtable_algo)\n", - " 585 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:312(mode)\n", - " 316/304 0.001 0.000 0.002 0.000 {built-in method builtins.sorted}\n", - " 36 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_monkey.py:1174(pydev_start_new_thread)\n", - " 609 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:617(_select_options)\n", - " 373 0.002 0.000 0.002 0.000 {method 'astype' of 'numpy.ndarray' objects}\n", - " 172 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1081(is_numeric_dtype)\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:231(parse_headers)\n", - " 439 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:948(from_blocks)\n", - " 1003 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:791(is_)\n", - " 179 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:221(__init__)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:846(get_grouper)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:231(get_result)\n", - " 4 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:371(__init__)\n", - " 134 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/computation/expressions.py:67(_evaluate_standard)\n", - " 287 0.000 0.000 0.002 0.000 {method 'max' of 'numpy.ndarray' objects}\n", - " 120 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:67(zeros_like)\n", - " 1397 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/flags.py:87(allows_duplicate_labels)\n", - " 8 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/container.py:14(__init__)\n", - " 711 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:219(_can_consolidate)\n", - " 106 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:2082(empty)\n", - " 70 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas_market_calendars/market_calendar.py:66(_tdelta)\n", - " 33 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1496(items)\n", - " 863 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:441(__init__)\n", - " 10 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2331(_concat_same_type)\n", - " 243 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:511(_validate_dtype)\n", - " 1 0.002 0.002 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:222(read)\n", - " 135 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:208(findall)\n", - " 36 0.002 0.000 0.002 0.000 {built-in method _thread.start_new_thread}\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:351(_encode_target)\n", - " 23 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6679(_maybe_cast_listlike_indexer)\n", - " 14 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:545(_get_sample_object)\n", - " 936 0.001 0.000 0.002 0.000 :697(__iter__)\n", - " 128 0.001 0.000 0.002 0.000 :150(dirname)\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/parser.py:59(parsestr)\n", - " 311 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:775(infer_dtype_from_scalar)\n", - " 112 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:833(isna)\n", - " 312 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:398(validate_inclusive)\n", - " 484 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4379(_set_is_copy)\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/parser.py:41(parse)\n", - " 225 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1006(_find_hms_idx)\n", - " 14 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:567()\n", - " 184 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5552(equals)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1479(info)\n", - " 8 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:805(call_soon_threadsafe)\n", - " 794 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:707(dtype)\n", - " 30 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1232(_add_timedeltalike)\n", - " 209 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:831(construct_from_string)\n", - " 24 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:387(apply)\n", - " 4442 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5144(_values)\n", - " 728 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:79()\n", - " 46 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1412(_insert_update_blklocs_and_blknos)\n", - " 376 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:364(cancel)\n", - " 287 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:39(_amax)\n", - " 1581 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:999(__len__)\n", - " 22 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5598()\n", - " 10 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:227(_concat_same_type)\n", - " 2096 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:283(ismodule)\n", - " 41 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_discriminated_union.py:37(apply_discriminators)\n", - " 41 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:567(validate_core_schema)\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6463(astype)\n", - " 2636 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:208(isnum)\n", - " 312 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2623(_infer_tz_from_endpoints)\n", - " 6 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:380(notna)\n", - " 1002 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:718(dtype)\n", - " 314 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:132(geterr)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:4620(map)\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:446(get_connection_with_tls_context)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1610(_log)\n", - " 97 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_daemon_thread.py:103()\n", - " 41 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/plugin/_schema_validator.py:21(create_schema_validator)\n", - " 8 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/selector_events.py:128(_write_to_self)\n", - " 2117 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:292(isclass)\n", - " 307 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:448(size)\n", - " 1128 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:325(_get_take_nd_function)\n", - " 8 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:1452(safe_sort)\n", - " 8 0.002 0.000 0.002 0.000 {method 'send' of '_socket.socket' objects}\n", - " 11 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5651(identical)\n", - " 36 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/ipkernel.py:768(init_closure)\n", - " 2110 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:378(isfunction)\n", - " 1473 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:372(apply_if_callable)\n", - " 14 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:480(_get_ndims)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4360(_iset_not_inplace)\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:171(feed)\n", - " 167 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:474(resolve_ymd)\n", - " 1 0.001 0.001 0.002 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:643()\n", - " 129 0.002 0.000 0.002 0.000 {built-in method _warnings.warn}\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7031(drop)\n", - " 318 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:299(helper)\n", - " 2104 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:300(ismethod)\n", - " 1211 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:271(__enter__)\n", - " 848 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:214(is_extension)\n", - " 306 0.002 0.000 0.002 0.000 {method 'fill' of 'numpy.ndarray' objects}\n", - " 42 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2140(get_flattened_anyof)\n", - " 6 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:176(_call_parse)\n", - " 46 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1393(moveaxis)\n", - " 6 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:216(_parsegen)\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:409(prepare_url)\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:208(__truediv__)\n", - " 318 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:2140()\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2662(getproxies_macosx_sysconf)\n", - " 184 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:728(is_valid_na_for_dtype)\n", - " 55 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:664(_constructor_from_mgr)\n", - " 7 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1316(view)\n", - " 146/41 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:425(collect_refs)\n", - " 3 0.002 0.001 0.002 0.001 {built-in method _scproxy._get_proxies}\n", - " 6 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:369(parse_url)\n", - " 276 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4191(_validate_positional_slice)\n", - " 36 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:856(__init__)\n", - " 711 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:735(_sanitize_str_dtypes)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1575(__init__)\n", - " 7 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1248(copy)\n", - " 2096 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:456(istraceback)\n", - " 522/366 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:206(_handle_other_schemas)\n", - " 219 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:914(__len__)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1636(handle)\n", - " 2096 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:480(iscode)\n", - " 10 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:12590(values)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1690(callHandlers)\n", - " 9 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:214(_obj_with_exclusions)\n", - " 41 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:158(collect_invalid_schemas)\n", - " 92 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5562(append)\n", - " 10 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1633(as_array)\n", - " 290 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:568(require_length_match)\n", - " 128 0.001 0.000 0.001 0.000 :71(join)\n", - " 131 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:835(_local_timestamps)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:478(coerce_to_target_dtype)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:7282(sort_index)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4477(__delitem__)\n", - " 31 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2229(is_monotonic_increasing)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/generic.py:2002(_get_data_to_aggregate)\n", - " 1211 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:274(__exit__)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:965(handle)\n", - " 9 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4470(_iset_item_mgr)\n", - " 23 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6394(_should_compare)\n", - " 52 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:131(filterwarnings)\n", - " 188 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:331(maybe_downcast_numeric)\n", - " 10 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1066(iset)\n", - " 124 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:633(is_integer_dtype)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1848(_make_engine)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/handlers.py:65(emit)\n", - " 146/41 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:161(_is_schema_valid)\n", - " 21 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:124(maybe_convert_platform)\n", - " 42 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2339(_deduplicate_schemas)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1707(_interleave)\n", - " 209 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:1305(construct_from_string)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:1064(group_info)\n", - " 10 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/putmask.py:101(validate_putmask)\n", - " 97 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/ipkernel.py:790()\n", - " 155 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:507(maybe_prepare_scalar_for_op)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1434(idelete)\n", - " 41 0.001 0.000 0.001 0.000 {built-in method pydantic_core._pydantic_core.validate_core_schema}\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1216(emit)\n", - " 8 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:271(from_annotation)\n", - " 46 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1402(_insert_update_mgr_locs)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1098(emit)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2235(take)\n", - " 10 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4883(_update_inplace)\n", - " 509 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:592(_get_block_manager_axis)\n", - " 179 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:62(__init__)\n", - " 92 0.001 0.000 0.001 0.000 {built-in method _operator.ne}\n", - " 1 0.000 0.000 0.001 0.001 {built-in method builtins.print}\n", - " 527 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:2443(get_origin)\n", - " 298 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:346(shape)\n", - " 158 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2264()\n", - " 10 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6731(_searchsorted_monotonic)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:655(write)\n", - " 794 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1993(dtype)\n", - " 23 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2421(all)\n", - " 981 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1837(__init__)\n", - " 635 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:667(_info_axis)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1483(reduce)\n", - " 453 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1040(needs_i8_conversion)\n", - " 42 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2340()\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:723(astype)\n", - " 3085 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:405(flags)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:258(_get_conn)\n", - " 2 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:922()\n", - " 47 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:273(__call__)\n", - " 83 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2703(new_block_2d)\n", - " 1744 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:572(_get_axis_number)\n", - " 307 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1141(_to_decimal)\n", - " 207 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:830(__len__)\n", - " 351 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_metadata.py:57(metadata)\n", - " 209 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:1054(construct_from_string)\n", - " 135 0.001 0.000 0.001 0.000 {method 'findall' of 're.Pattern' objects}\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:577(_schedule_flush)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1114(union_schema)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:259(schedule)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/accessor.py:111(f)\n", - " 79 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:225(_consolidate_key)\n", - " 215 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_schema_generation_shared.py:31(__init__)\n", - " 658 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:649(_get_deprecated_option)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/accessors.py:126(_delegate_method)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/zmq/sugar/socket.py:621(send)\n", - " 318 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:104(__init__)\n", - " 21 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:61(merge_setting)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:192(__sub__)\n", - " 74 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/type_adapter.py:115(_type_has_config)\n", - " 230/101 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2343(_make_json_hashable)\n", - " 441 0.001 0.000 0.001 0.000 {built-in method numpy.zeros}\n", - " 754 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/__init__.py:55(using_pyarrow_string_dtype)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:60(__init__)\n", - " 1385 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:203(isword)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1087(flush)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:68(__and__)\n", - " 324 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:456(_engine_type)\n", - " 283 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:336(hms)\n", - " 686 0.001 0.000 0.001 0.000 {method 'split' of 'str' objects}\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/scrapers/quote.py:660(_fetch_complementary)\n", - " 1688 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/flags.py:55(allows_duplicate_labels)\n", - " 2 0.001 0.001 0.001 0.001 {method 'flush' of '_io.TextIOWrapper' objects}\n", - " 7 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1870(_get_label_or_level_values)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/accessor.py:95(_getter)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6123(_logical_method)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:636(normalize_dictlike_arg)\n", - " 3080 0.001 0.000 0.001 0.000 {method 'append' of 'list' objects}\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/accessors.py:88(_delegate_property_get)\n", - " 312 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:193(__get__)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/scrapers/quote.py:658()\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:240(__pow__)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:421(astype)\n", - " 23 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:66(copy)\n", - " 852 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:148(__getattr__)\n", - " 31 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2180(_ensure_matching_resos)\n", - " 16 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:903(_set_levels)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:596(shape)\n", - " 3 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:687(compress_group_index)\n", - " 2830 0.001 0.000 0.001 0.000 {method 'lower' of 'str' objects}\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:378(new_index)\n", - " 223 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:74(__len__)\n", - " 10 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:598()\n", - " 6/5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2435(_signature_from_callable)\n", - " 109 0.000 0.000 0.001 0.000 :771(get)\n", - " 23 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3955(_get_indexer)\n", - " 41 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:157(core_config)\n", - " 102 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:2378(array_equal)\n", - " 530 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:72()\n", - " 8 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:676(ngroups)\n", - " 10 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:1333(searchsorted)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:359(build_response)\n", - " 37 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/type_adapter.py:413(dump_python)\n", - " 14 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:418(merge_field_infos)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_decorators.py:325(wrapper)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:469(_parse_headers)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:7894(_cmp_method)\n", - " 41 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:280(_check_object_for_strings)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:838(select_proxy)\n", - " 257 0.001 0.000 0.001 0.000 {method 'nonzero' of 'numpy.ndarray' objects}\n", - " 209 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:342(construct_from_string)\n", - " 106 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:978(__array__)\n", - " 510 0.001 0.000 0.001 0.000 {built-in method _locale.setlocale}\n", - " 16 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1085(_set_codes)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:610(prepare_cookies)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:782(result_index)\n", - " 342 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:280(_release_save)\n", - " 92 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:483(_view)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/astype.py:191(astype_array_safe)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1102(wrap_results)\n", - " 2642 0.001 0.000 0.001 0.000 {built-in method builtins.setattr}\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:744(_group_index)\n", - " 186 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:243(_keep_alive)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:140(get_cookie_header)\n", - " 10 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:333(from_annotated_attribute)\n", - " 124 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:836(__iter__)\n", - " 185 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:253(_get_values)\n", - " 252/171 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/scrapers/quote.py:645(_format)\n", - " 645 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:300()\n", - " 41 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:122(collect_definitions)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/connection.py:15(is_connection_dropped)\n", - " 4581 0.001 0.000 0.001 0.000 {method 'keys' of 'dict' objects}\n", - " 385/2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:210(remap_json_schema)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:299(is_connected)\n", - " 546 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:72(check)\n", - " 208 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:108(asi8)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:348(get_function_type_hints)\n", - " 103/85 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2432(_extract_get_pydantic_json_schema)\n", - " 1585 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2043(freq)\n", - " 14 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:494(_clean_keys_and_objs)\n", - " 233 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4623(_clear_item_cache)\n", - " 48 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:294(handle_union_schema)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:2063(to_dict)\n", - " 257 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/frozen.py:76(__getitem__)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:276(connection_from_host)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:196(__rsub__)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/methods/to_dict.py:78(to_dict)\n", - " 10 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:240(searchsorted)\n", - " 2465 0.001 0.000 0.001 0.000 {method 'decode' of 'bytes' objects}\n", - " 146/41 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_discriminated_union.py:45(inner)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:5773(isna)\n", - " 38 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:374(urlparse)\n", - " 20 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:527(__init__)\n", - " 1770 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:217(_scalar_type)\n", - " 27 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:164(hostname)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:8693(isna)\n", - " 179 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:395(__init__)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:860(values)\n", - " 591 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:644()\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:7885(replace)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_compiler.py:573(_code)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6488(isna)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:305(connection_from_context)\n", - " 209 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:2228(construct_from_string)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1565(__invert__)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:200(__mul__)\n", - " 1177 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:758(_maybe_repeat)\n", - " 24/23 0.000 0.000 0.001 0.000 {built-in method _operator.eq}\n", - " 46 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:274(make_block)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:957(getaddrinfo)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1356(add_cookie_header)\n", - " 33 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2744(inferred_type)\n", - " 199 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:111(is_annotated)\n", - " 13 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1433(find_common_type)\n", - " 314 0.001 0.000 0.001 0.000 {built-in method numpy.seterrobj}\n", - " 16 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:220(__init__)\n", - " 92 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1330(normalize_axis_tuple)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1503()\n", - " 184 0.001 0.000 0.001 0.000 :405(parent)\n", - " 146/41 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:125(_record_valid_refs)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:3261(signature)\n", - " 486 0.001 0.000 0.001 0.000 {built-in method builtins.max}\n", - " 16 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:844(levels)\n", - " 37 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/functools.py:981(__get__)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2083(remove_unused_levels)\n", - " 16 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:373(_finalize)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/data.py:322(_get_cookie_and_crumb)\n", - " 65 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1102()\n", - " 32 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:119(is_namedtuple)\n", - " 116 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:201(_simple_new)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:3007(from_callable)\n", - " 1 0.001 0.001 0.001 0.001 {built-in method _socket.getaddrinfo}\n", - " 251 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:115(get_ref)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2331(_signature_from_function)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:307(unique)\n", - " 18 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:263(eval_type_backport)\n", - " 185 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/numpy/function.py:413(validate_func)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1689(_getitem_tuple)\n", - " 569 0.001 0.000 0.001 0.000 {built-in method _thread.allocate_lock}\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:176(sorted_labels)\n", - " 1146 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1671(name)\n", - " 2514 0.001 0.000 0.001 0.000 {built-in method builtins.callable}\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:106(_encode_params)\n", - " 8 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:550(validate_categories)\n", - " 828 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6685(_validate_indexer)\n", - " 59 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:782(_rename)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:237(ndarray_to_mgr)\n", - " 2327 0.001 0.000 0.001 0.000 {built-in method _warnings._filters_mutated}\n", - " 41 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:369(__init__)\n", - " 29 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:12675(_reindex_for_setitem)\n", - " 622 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:308(_config)\n", - " 65 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:924()\n", - " 384/1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2352(_sort_json_schema)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2152(get_json_ref_counts)\n", - " 7 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4159(xs)\n", - " 36 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1051(_stop)\n", - " 18 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:296(_eval_type_backport)\n", - " 16 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:40(__init__)\n", - " 182 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:324(_get_dtype_max)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:381()\n", - " 296 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:131()\n", - " 59 0.000 0.000 0.001 0.000 :778(__contains__)\n", - " 10 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:635()\n", - " 12 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2979(prod)\n", - " 39 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/_policybase.py:301(header_source_parse)\n", - " 182 0.001 0.000 0.001 0.000 {method '_acquire_restore' of '_thread.RLock' objects}\n", - " 40 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:53(_wrapfunc)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:427(unique_with_mask)\n", - " 386/1 0.001 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2156(_add_json_refs)\n", - " 18 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:321(_eval_type)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/codeop.py:120(__call__)\n", - " 1560 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:213()\n", - " 314 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6277()\n", - " 22 0.000 0.000 0.001 0.000 :941(update)\n", - " 22 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:219(vstack)\n", - " 16 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:897()\n", - " 94 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2065(set_values)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:176(isna)\n", - " 146/41 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:447(count_refs)\n", - " 312 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2666(_maybe_normalize_endpoints)\n", - " 36 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:562(__init__)\n", - " 209 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/string_.py:140(construct_from_string)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:7172()\n", - " 1064 0.001 0.000 0.001 0.000 {method 'pop' of 'list' objects}\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:7918(_dispatch_frame_op)\n", - " 100 0.001 0.000 0.001 0.000 {method 'astype' of 'numpy.generic' objects}\n", - " 209 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:1835(construct_from_string)\n", - " 947 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1940(_block)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:204(get_netrc_auth)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:330(connection_from_pool_key)\n", - " 1397 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:363(attrs)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/wait.py:113(wait_for_read)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1450(grouped_reduce)\n", - " 10 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:710(_validate_setitem_value)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1784(get_level_values)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/accessors.py:70(_get_values)\n", - " 146/41 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:488(inline_refs)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/wait.py:57(poll_wait_for_socket)\n", - " 10 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:287(get_dtypes)\n", - " 2479 0.001 0.000 0.001 0.000 {method 'read' of '_io.StringIO' objects}\n", - " 197 0.001 0.000 0.001 0.000 {method 'reshape' of 'numpy.ndarray' objects}\n", - " 628 0.001 0.000 0.001 0.000 {built-in method numpy.geterrobj}\n", - " 123 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:4035(_dict_not_none)\n", - " 64 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2811(ensure_block_shape)\n", - " 282 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:161(iloc)\n", - " 455 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/__init__.py:42(warn_copy_on_write)\n", - " 3215 0.001 0.000 0.001 0.000 {method 'isdigit' of 'str' objects}\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:479(items)\n", - " 30 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:446(_init_decoder)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1032(_getitem_lowerdim)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/data.py:215(_get_cookie_and_crumb_basic)\n", - " 5 0.001 0.000 0.001 0.000 {built-in method builtins.compile}\n", - " 419 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1392()\n", - " 408 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:90(RLock)\n", - " 167 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:380(validate)\n", - " 150/38 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1904(field_title_should_be_set)\n", - " 77 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:184(_reconstruct_data)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:958(fast_xs)\n", - " 46 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2311(_fast_count_smallints)\n", - " 79/18 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:387(_eval_type)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1290(_cookies_for_request)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1758(_get_level_values)\n", - " 49 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:4120(_coerce_indexer_frozen)\n", - " 2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/data.py:184(_get_crumb_basic)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:943(urlencode)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/wait.py:74(do_poll)\n", - " 30 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:255(get)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2016(_sort_levels_monotonic)\n", - " 10 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1250(copy)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:156(_indexer_and_to_sort)\n", - " 619 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1168(ident)\n", - " 17 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1697(_validate_names)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1277(is_extension_array_dtype)\n", - " 2 0.001 0.000 0.001 0.000 {method 'poll' of 'select.poll' objects}\n", - " 1481 0.001 0.000 0.001 0.000 {method '__exit__' of '_thread.lock' objects}\n", - " 114 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1310(__getattr__)\n", - " 10 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:378(interleaved_dtype)\n", - " 128 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:1745(currentframe)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1272(_cookies_for_domain)\n", - " 2388 0.000 0.000 0.000 0.000 {built-in method builtins.id}\n", - " 123 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:992(is_numeric_v_string_like)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:124(extract_cookies_to_jar)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/concat.py:73()\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2036(_get_prepare_pydantic_annotations_for_known_type)\n", - " 1105 0.000 0.000 0.000 0.000 {function ProtectedDict.copy at 0x13d045b20}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1093(_getitem_nested_tuple)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:638()\n", - " 43 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:93(__init__)\n", - " 1695 0.000 0.000 0.000 0.000 {method 'items' of 'dict' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6499(min)\n", - " 545 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/numpy/function.py:64(__call__)\n", - " 213 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:329(month)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:10185(align)\n", - " 117 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_utils.py:76(lenient_issubclass)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:229(_new_pool)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12362(_stat_function)\n", - " 280 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1165(_check_deprecated_callable_usage)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12381(min)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:351(putheader)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:246(get_new_values)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2225(_garbage_collect_definitions)\n", - " 552 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:213(isspace)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1532(__neg__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:272(__init__)\n", - " 647 0.000 0.000 0.000 0.000 {method 'insert' of 'list' objects}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2252()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ssl.py:1262(sendall)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:198(__init__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6219(_raise_if_missing)\n", - " 41 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/plugin/_loader.py:21(get_plugins)\n", - " 772 0.000 0.000 0.000 0.000 {method '__enter__' of '_thread.RLock' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:2249(isclose)\n", - " 241 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/getlimits.py:709(max)\n", - " 163 0.000 0.000 0.000 0.000 :121(__subclasscheck__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:707(_get_comb_axis)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:901(quote_plus)\n", - " 454 0.000 0.000 0.000 0.000 {method 'ravel' of 'numpy.ndarray' objects}\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:847(quote)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:3995(_maybe_update_cacher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:177(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1216(_iset_split_block)\n", - " 15/3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_compiler.py:37(_compile)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2567(_proxy_bypass_macosx_sysconf)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2478(_get_all_json_refs)\n", - " 641 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:196(blklocs)\n", - " 34/32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_repr.py:86(display_as_type)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:259(_reconstruct)\n", - " 368 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:286(_is_owned)\n", - " 94 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1342(is_complex_dtype)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:634(_maybe_cast_slice_bound)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1580(construct_1d_object_array_from_listlike)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/ticker.py:34(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:72(get_objs_combined_axis)\n", - " 454 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:692(_constructor)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:319(build_schema_type_to_method)\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:345(to_key_val_list)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:2103(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7553(ensure_index_from_sequences)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:218()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:242(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/base.py:47(__init__)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6415(_is_comparable_dtype)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:414(_split_op_result)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ssl.py:1235(send)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/scrapers/quote.py:649()\n", - " 282 0.000 0.000 0.000 0.000 {method 'clear' of 'dict' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2307(factorize)\n", - " 42 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:278(prepare_config)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:243(replace)\n", - " 93/28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:409()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:276(strftime)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:776(reconstructed_codes)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/base.py:1428(factorize)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3602(difference)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:2077(__contains__)\n", - " 2 0.000 0.000 0.000 0.000 {method 'write' of '_ssl._SSLSocket' objects}\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4436(_wrap_reindex_result)\n", - " 264 0.000 0.000 0.000 0.000 :41(_get_sep)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:883(_get_args_resolving_forward_refs)\n", - " 213 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:319(jump)\n", - " 73/5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:99(all_literal_values)\n", - " 31 0.000 0.000 0.000 0.000 {built-in method numpy.arange}\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1334(_get_alias_name)\n", - " 92 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1768(ravel)\n", - " 396 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:398(__get_result)\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:923(quote_from_bytes)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:325(get_new_columns)\n", - " 312 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:1257(value)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:664(maybe_fill)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:10479(_align_frame)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:111(f)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:2329(hfunc)\n", - " 360 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/arraysetops.py:630()\n", - " 39 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1327(__instancecheck__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:183(_make_sorted_values)\n", - " 342 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:283(_acquire_restore)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:909(text)\n", - " 176 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_metadata.py:48(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:390(__init__)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_asarray.py:27(require)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/index_tricks.py:326(__getitem__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4440(_maybe_preserve_names)\n", - " 265 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:226(validate_bool_kwarg)\n", - " 749 0.000 0.000 0.000 0.000 {method 'group' of 're.Match' objects}\n", - " 134 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/missing.py:131(dispatch_fill_zeros)\n", - " 711 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:1080(copyto)\n", - " 242/218 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2345()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:337(extend)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1684(is_monotonic_increasing)\n", - " 185 0.000 0.000 0.000 0.000 {method 'groupdict' of 're.Match' objects}\n", - " 74 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:115(annotated_type)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:1332(getfullargspec)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/generic.py:155(_wrap_agged_manager)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:2344(unique)\n", - " 952 0.000 0.000 0.000 0.000 {method '__exit__' of '_thread.RLock' objects}\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1517(field_is_present)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:521(cookiejar_from_dict)\n", - " 40 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:166(is_finalvar)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1284(find_result_type)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:828(replace)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:829(_maintain_shutdown_locks)\n", - " 124 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:915(__array__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:331(putrequest)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:1019(unique)\n", - " 44 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1047(shape)\n", - " 83 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1643(__len__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:268(decons_obs_group_ids)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2107(droplevel)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/functools.py:35(update_wrapper)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:720(size)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:120(_get_combined_index)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5676()\n", - " 178 0.000 0.000 0.000 0.000 {method 'rstrip' of 'str' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:94(concatenate_managers)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:386(default_index)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:1028(nunique)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/scrapers/quote.py:651()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:1083(reduction)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:789(values)\n", - " 95 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:87(is_literal_type)\n", - " 41 0.000 0.000 0.000 0.000 :773(getenv)\n", - " 1245 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:363(ndim)\n", - " 252 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1270(is_1d_only_ea_dtype)\n", - " 163 0.000 0.000 0.000 0.000 {built-in method _abc._abc_subclasscheck}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_compiler.py:511(_compile_info)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1574(_set_names)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6480(all)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1259(putheader)\n", - " 31 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1066(_get_arithmetic_result_freq)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:490(get)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:419(_close_conn)\n", - " 185 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:1499(_maybe_null_out)\n", - " 1385 0.000 0.000 0.000 0.000 {method 'isalpha' of 'str' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:8282(_construct_result)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:718(_reorder_by_uniques)\n", - " 2 0.000 0.000 0.000 0.000 {method 'put' of 'numpy.ndarray' objects}\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:108()\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1025(argsort)\n", - " 53 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:973(coerce_indexer_dtype)\n", - " 41 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:598(collect_definitions)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:246(_decons_group_index)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:724()\n", - " 376 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:47(__init__)\n", - " 107 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/dataclasses.py:1258(is_dataclass)\n", - " 296 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:126(_classes_and_not_datetimelike)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5663(_reindex_with_indexers)\n", - " 732 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:913(__init__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:398(reduce)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6324(_maybe_downcast_for_indexing)\n", - " 460 0.000 0.000 0.000 0.000 {method 'endswith' of 'str' objects}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1680(extract_cookies)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1103(putrequest)\n", - " 3 0.000 0.000 0.000 0.000 {method 'close' of '_io.BufferedReader' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:113(comp_method_OBJECT_ARRAY)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:1084(_convert_grouper)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:159(resolve_redirects)\n", - " 136 0.000 0.000 0.000 0.000 {method 'rfind' of 'str' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1935(delete)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:407(__rsub__)\n", - " 55 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4585(_ensure_valid_index)\n", - " 92 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/typing_extensions.py:1132(is_typeddict)\n", - " 765 0.000 0.000 0.000 0.000 {method 'values' of 'dict' objects}\n", - " 66 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:735(_error_catcher)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5495()\n", - " 11 0.000 0.000 0.000 0.000 {method 'searchsorted' of 'numpy.ndarray' objects}\n", - " 1480 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:182(_deepcopy_atomic)\n", - " 194 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:553(equals)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2322(any)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2000(external_values)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas_market_calendars/calendars/nyse.py:833(regular_holidays)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1096(return_ok)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2320(_preprocess_slice_or_indexer)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:154(get)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5486()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:546(request_url)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1535(field_is_required)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:54(__gt__)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:592(get_content_type)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:781(close)\n", - " 167 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:482()\n", - " 78 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:259(__getitem__)\n", - " 733 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:211(tail)\n", - " 276 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:464(populate_defs)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2244(get_values)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:718(remove_na_arraylike)\n", - " 429 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3809()\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:482(nanany)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1418(_literal_schema)\n", - " 3 0.000 0.000 0.000 0.000 {built-in method _operator.sub}\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:86(consensus_name_attr)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:423(repeat)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:122(put)\n", - " 58 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:122(_reset_cache)\n", - " 74 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2776(_is_multi)\n", - " 380 0.000 0.000 0.000 0.000 {method 'put' of '_queue.SimpleQueue' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:573(__init__)\n", - " 20 0.000 0.000 0.000 0.000 {method '__reduce_ex__' of 'object' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5359(reindex)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:886()\n", - " 644 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:376(dtype)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:745(_get_engine_target)\n", - " 677 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:53(is_core_schema)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/astype.py:157(astype_array)\n", - " 264 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1687(__eq__)\n", - " 33 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:465(_decode)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1809(set_names)\n", - " 39 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1602(__subclasscheck__)\n", - " 46 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5295(_validate_fill_value)\n", - " 120 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/getlimits.py:696(min)\n", - " 6 0.000 0.000 0.000 0.000 :229(expanduser)\n", - " 108 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1266(_is_dunder)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:487()\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:35(__init__)\n", - " 123 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:4036()\n", - " 276 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2752(need_slice)\n", - " 57 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/_policybase.py:319(header_fetch_parse)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:489(_decref_socketios)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1599(make_cookies)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/timedeltas.py:149(__new__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6459(any)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:1324(diff)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2669(__init__)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:436(_split)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1495(_maybe_update_cacher)\n", - " 82 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1099(_parse_min_sec)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:234()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:499(close)\n", - " 3 0.000 0.000 0.000 0.000 {method 'repeat' of 'numpy.ndarray' objects}\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:354(validate_ascending)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:837(list_schema)\n", - " 70 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1056(_could_be_tzname)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1422(__sub__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/utils.py:92(get_indented_logger)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:495(_real_close)\n", - " 57 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:2473(get_args)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2159(_drop_level_numbers)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:350(getitem_block_columns)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:664(get_handle)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:652(str_schema)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2344()\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1392(np_find_common_type)\n", - " 49 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:688(_warn_if_deprecated)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:2330(within_tol)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:95(__init__)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1850(from_blocks)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:328(check_deprecated)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:393(logical_op)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:121(decompress)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1595(makeRecord)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:202(__init__)\n", - " 71 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:51(__getitem__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6916(delete)\n", - " 31 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2794(_na_value)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:355(_concatenate_chunks)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6629(cumprod)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/generic.py:160(_get_data_to_aggregate)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1126(_sub_datetimelike_scalar)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:123(__init__)\n", - " 37 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/type_adapter.py:100(_getattr_no_parents)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:542(merge_cookies)\n", - " 1 0.000 0.000 0.000 0.000 {function socket.close at 0x10a2e20c0}\n", - " 111 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:401(_config_wrapper)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:255(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:182(close)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/weakref.py:585(__call__)\n", - " 33 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:251(put)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/methods/to_dict.py:171()\n", - " 185 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:209(_maybe_get_mask)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:658(__init__)\n", - " 182 0.000 0.000 0.000 0.000 {method '_release_save' of '_thread.RLock' objects}\n", - " 37 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:499(none_schema)\n", - " 70 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1453(current_thread)\n", - " 36 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1734(isEnabledFor)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7406(min)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:2557(_get_timestamp_range_edges)\n", - " 287 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:246(items)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:1174(_close_pool_connections)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12291(cumprod)\n", - " 825 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6672(_maybe_cast_indexer)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:82(f)\n", - " 36 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_weakrefset.py:85(add)\n", - " 90 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:46(__setitem__)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1771(_is_label_reference)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:605(float_schema)\n", - " 41 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:170(parent_frame_namespace)\n", - " 6 0.000 0.000 0.000 0.000 :16(exists)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/astype.py:56(_astype_nansafe)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12239(_accum_func)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:292(__init__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_compiler.py:243(_optimize_charset)\n", - " 57 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/_policybase.py:289(_sanitize_header)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4651(_maybe_cache_changed)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/weakref.py:427(__setitem__)\n", - " 296 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/type_adapter.py:259(_with_frame_depth)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:66(mask_missing)\n", - " 260 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:696(ndim)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:616(get_content_maintype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:241(_from_sequence_not_strict)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:941()\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:249(external_values)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:771(ngroups)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:213(_read_headers)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:525(get_all)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1158(_sub_datetimelike)\n", - " 314 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:974(dtype)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ipaddress.py:1286(__init__)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:358(update)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:735(has_dropped_na)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/accessor.py:220(__get__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:11458(blk_func)\n", - " 245 0.000 0.000 0.000 0.000 {built-in method sys._getframe}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:261(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1998(get_cache_defs_ref_schema)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:942(format)\n", - " 568 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1480(_clear_item_cache)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6509(max)\n", - " 33 0.000 0.000 0.000 0.000 {method 'write' of '_io.BytesIO' objects}\n", - " 37 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/type_adapter.py:323(_defer_build)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:724()\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:466(array_equivalent)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:303(makefile)\n", - " 41 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:198()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:620(request_host)\n", - " 566 0.000 0.000 0.000 0.000 {method 'append' of 'collections.deque' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12397(max)\n", - " 370 0.000 0.000 0.000 0.000 {method 'toordinal' of 'datetime.date' objects}\n", - " 44 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:119(_coerce_args)\n", - " 70 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:322(weekday)\n", - " 92 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1380()\n", - " 157 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:426(__init__)\n", - " 259 0.000 0.000 0.000 0.000 {built-in method numpy.asanyarray}\n", - " 477 0.000 0.000 0.000 0.000 {method 'add' of 'set' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:115(__init__)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/holiday.py:416(__init__)\n", - " 615 0.000 0.000 0.000 0.000 {built-in method time.monotonic}\n", - " 51 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2093(update_with_validations)\n", - " 48 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:127(__next__)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas_market_calendars/class_registry.py:116(copy)\n", - " 6 0.000 0.000 0.000 0.000 {built-in method posix.stat}\n", - " 439 0.000 0.000 0.000 0.000 {method '__enter__' of '_thread.lock' objects}\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:81(atleast_2d)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:76(copy)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2679(_maybe_localize_point)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1826(_check_label_or_level_ambiguity)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:781(get_adapter)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:545(is_dataclass)\n", - " 6 0.000 0.000 0.000 0.000 {method 'update' of 'collections.OrderedDict' objects}\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:2074(getLogger)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:206(__getattr__)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:1045(_validate_header_part)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1881(nonzero)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1123(return_ok_verifiability)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:1087(result_index)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:990(sequence_to_td64ns)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:396(build_connection_pool_key_attributes)\n", - " 312 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2474(validate_periods)\n", - " 2 0.000 0.000 0.000 0.000 {method 'decompress' of 'zlib.Decompress' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:266(index_labels_to_array)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/accessors.py:611(__new__)\n", - " 99 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:557(is_generic_alias)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:839()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:180()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1742(strftime)\n", - " 99 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:566(is_self_type)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:205(_hostinfo)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:140(_from_backing_data)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1839(debug)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:95(_default_key_normalizer)\n", - " 44 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2586(get_values)\n", - " 272 0.000 0.000 0.000 0.000 {built-in method posix.fspath}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:674(format)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1261(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:90(_urllib3_request_context)\n", - " 56 0.000 0.000 0.000 0.000 {method '_checkReadable' of '_io._IOBase' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:726(is_third_party)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1966(_is_lexsorted)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:86(opengroup)\n", - " 53 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1763(np_can_hold_element)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:744(_format_native_types)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2827(external_values)\n", - " 80 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:158(_check_finalvar)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1950(get_defs_ref)\n", - " 242 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1176(_maybe_disallow_fill)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:303(_normalize_host)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:636(eff_request_host)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2410(wrap_default)\n", - " 70 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:342(ampm)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:813(str_schema)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6831(infer_objects)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ipaddress.py:1187(_ip_int_from_string)\n", - " 220 0.000 0.000 0.000 0.000 {method 'rpartition' of 'str' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:153(_set_option)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1692()\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1695(__hash__)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:571(_disallow_mismatched_indexing)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:586(update_dtype)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2285()\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:487()\n", - " 17 0.000 0.000 0.000 0.000 {method 'sub' of 're.Pattern' objects}\n", - " 337 0.000 0.000 0.000 0.000 {method 'upper' of 'str' objects}\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:470(any_schema)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:588(prepare_auth)\n", - " 36 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1324(_make_invoke_excepthook)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:229(_convert_obj)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/putmask.py:62(putmask_without_repeat)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1534(blk_func)\n", - " 5/3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_compiler.py:436(_get_literal_prefix)\n", - " 237 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:660(_constructor)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:543(nanall)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1798()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:238(_new_conn)\n", - " 21/9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:178(getwidth)\n", - " 552 0.000 0.000 0.000 0.000 {method 'isspace' of 'str' objects}\n", - " 39 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:302(add)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:635(release_conn)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:564(_array_equivalent_object)\n", - " 50 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6312(_index_as_unique)\n", - " 36/20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1227(deepvalues)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1768(_set_names)\n", - " 188 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:59(is_core_schema_field)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:373(inner)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:546(ensure_key_mapped)\n", - " 245 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1081(codes)\n", - " 110 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:686()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:2526(_set_grouper)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1922(rename)\n", - " 245 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2687(_max_dispatcher)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:1547(check_below_min_count)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/response.py:40(assert_header_parsing)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2002(_lexsort_depth)\n", - " 71 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:168(__getitem__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5172(delete)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:404(is_dataclass)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:591(int_schema)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:271(validate_fillna_kwargs)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:176(append)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:3689(equals)\n", - " 611 0.000 0.000 0.000 0.000 {built-in method builtins.ord}\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2476(add_json_schema_extra)\n", - " 70 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas_market_calendars/market_calendar.py:78(_off)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:366(notify)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1188(domain_return_ok)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:348(_get_timeout)\n", - " 31 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1047(_get_i8_values_and_mask)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:781(_call_soon)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:1018(get_auth_from_url)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:539(get_encoding_from_headers)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1893(get_title_from_name)\n", - " 31 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:688(__call__)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:332(array)\n", - " 44 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:261(get)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:660(requote_uri)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:783(_creso)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:1525(__and__)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_asarray.py:108()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6380(_consolidate)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:479(__enter__)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2955(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2817(hasnans)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:100(push)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:4037(_lexsort_depth)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:296(_put_conn)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1605(maybe_cast_to_integer_array)\n", - " 242 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:344()\n", - " 306 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:178()\n", - " 92 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:315(step)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:751(__init__)\n", - " 94 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:500(lookback)\n", - " 36 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2567(push)\n", - " 307 0.000 0.000 0.000 0.000 {method 'is_finite' of 'decimal.Decimal' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:315(__init__)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6270()\n", - " 378 0.000 0.000 0.000 0.000 {method 'release' of '_thread.lock' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:409(iscoroutinefunction)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1262(_slice)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:109(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:838(_cleanup)\n", - " 38 0.000 0.000 0.000 0.000 {built-in method pydantic_core._pydantic_core.to_jsonable_python}\n", - " 137 0.000 0.000 0.000 0.000 {method 'join' of 'str' objects}\n", - " 176 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:207(remap_json_ref)\n", - " 31 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1765(_get_names)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/utils/filters.py:8(filter_inputs)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/equity.py:301(price)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3996(_check_indexing_method)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:957(_validate_tuple_indexer)\n", - " 66 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1133(_parsems)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1265(_iset_single)\n", - " 48 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:77(readline)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12260(block_accum_func)\n", - " 44 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2177(_grouping_func)\n", - " 24 0.000 0.000 0.000 0.000 :790(items)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:259(_standardize_fill_value)\n", - " 128 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:470(__getattr__)\n", - " 310 0.000 0.000 0.000 0.000 {method 'pop' of 'dict' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:169(extract_numeric_value)\n", - " 56 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:240(__next)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:263(_remove_path_dot_segments)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:240(init_poolmanager)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7723(_unpack_nested_dtype)\n", - " 41 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:3750(definitions_schema)\n", - " 85 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:58()\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:291(arrays)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5818(head)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/numpy/function.py:159(validate_argsort_with_ascending)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:137(__init__)\n", - " 240 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2831(_min_dispatcher)\n", - " 4 0.000 0.000 0.000 0.000 {built-in method _operator.truediv}\n", - " 143 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:360(convertyear)\n", - " 56 0.000 0.000 0.000 0.000 {method 'transpose' of 'numpy.ndarray' objects}\n", - " 143 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:402(has_year)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/common.py:103(_maybe_match_name)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1340()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:494(prepare_body)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:391(_has_code_flag)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:1714(na_accum_func)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:34(__init__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1327(getLogger)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:400()\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:84()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:188(clone)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2095(create_block_manager_from_blocks)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:137(__new__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:481()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:509(urlunparse)\n", - " 46 0.000 0.000 0.000 0.000 {method 'item' of 'numpy.ndarray' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:34(__str__)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:3345(arguments_parameter)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/putmask.py:115(extract_bool_array)\n", - " 130 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:804(tz)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:2364(with_default_schema)\n", - " 75 0.000 0.000 0.000 0.000 {method 'update' of 'dict' objects}\n", - " 180 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:709(inferred_type)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:774(get_proxy)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:83(is_callable_type)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1734(clear_expired_cookies)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:865(_references)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:251(handle_list_schema)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2582(array_values)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1657(_get_level_number)\n", - " 33 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/response.py:9(is_fp_closed)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1214(path_return_ok)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:405(_check_values_indices_shape_match)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:849(_list_to_arrays)\n", - " 306 0.000 0.000 0.000 0.000 {method 'remove' of 'collections.deque' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:485(__exit__)\n", - " 13 0.000 0.000 0.000 0.000 {method 'subn' of 're.Pattern' objects}\n", - " 2 0.000 0.000 0.000 0.000 {built-in method now}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:304(_get_filepath_or_buffer)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:249(_get_output_shape)\n", - " 60 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/utils.py:52(_has_surrogates)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:455(create_cookie)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6137(_align_for_op)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:644(get_group_index_sorter)\n", - " 2 0.000 0.000 0.000 0.000 {method 'sendall' of '_socket.socket' objects}\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Configuration.py:37(__setattr__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1689()\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_compiler.py:216(_compile_charset)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:679(_init_length)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:230(_can_hold_na)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:134(__init__)\n", - " 60 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1571(_get_names)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:178(sub)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:243(_from_values_or_dtype)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:98(closegroup)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:429(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:199(__init__)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:410(fill_bool)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:457(__neg__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7469(max)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:514(_parse_content_type_header)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:521()\n", - " 104 0.000 0.000 0.000 0.000 {built-in method builtins.iter}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1377(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/shape_base.py:1185(tile)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/base.py:294(is_dtype)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:243(get_payload)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:100(__new__)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas_market_calendars/class_registry.py:73(__init__)\n", - " 4 0.000 0.000 0.000 0.000 {method 'all' of 'numpy.generic' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:1436(date)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:405(_types_namespace)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:558()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:1165(_is_binary_mode)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:438(convert)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:390(_check_close)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:58(__new__)\n", - " 178 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:153(concatenate)\n", - " 84 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1725(__eq__)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1880(log)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:215(_vhstack_dispatcher)\n", - " 70 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas_market_calendars/market_calendar.py:152()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1685(_clean_options)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:606(formatTime)\n", - " 40 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:99(freq)\n", - " 92 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:280(start)\n", - " 59 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:743(readable)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:762(infer_dtype_from)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:57(__iter__)\n", - " 2 0.000 0.000 0.000 0.000 {method 'cumsum' of 'numpy.ndarray' objects}\n", - " 257 0.000 0.000 0.000 0.000 {function FrozenList.__getitem__ at 0x12c993740}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/accessors.py:59(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:647(request_path)\n", - " 4 0.000 0.000 0.000 0.000 {built-in method _operator.inv}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/roperator.py:14(rsub)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1161(return_ok_domain)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:331(_set_grouper)\n", - " 3 0.000 0.000 0.000 0.000 {built-in method from_bytes}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4585(_is_view)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:454(__exit__)\n", - " 71 0.000 0.000 0.000 0.000 {method '__getitem__' of 'dict' objects}\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:653()\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:2426(nullable_schema)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:170()\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:352(na_logical_op)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1966()\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:49(get_full_url)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/util.py:19(to_str)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1467(debug)\n", - " 22 0.000 0.000 0.000 0.000 {method 'fullmatch' of 're.Pattern' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1574(_validate_key)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/events.py:35(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/data.py:48(__call__)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:157(clean_fill_method)\n", - " 39 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:507(set_raw)\n", - " 37 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/type_adapter.py:314(serializer)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:141(validate_kwargs)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:363(_can_hold_element)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3766(_convert_can_do_setop)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:642()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1561(findCaller)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:794(close)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2214(_build_definitions_remapping)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:940(date_schema)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:121(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:480(is_view)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1096(_can_fast_transpose)\n", - " 68 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1206(daemon)\n", - " 213 0.000 0.000 0.000 0.000 {method 'end' of 're.Match' objects}\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:2472(union_schema)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:630(prepare_hooks)\n", - " 4 0.000 0.000 0.000 0.000 {built-in method posix.cpu_count}\n", - " 161 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:266(mgr_locs)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:692(__init__)\n", - " 56 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:256(match)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1069(_is_homogeneous_type)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:514(_collect_metadata)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_known_annotated_metadata.py:121(expand_grouped_metadata)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:512(_validate_axis)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:136(ones)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:349(_maybe_cast_slice_bound)\n", - " 179 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:186(__iter__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2804(_isnan)\n", - " 120 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/arraysetops.py:761(_isin_dispatcher)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:268(_get_out_dtype)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1731(__hash__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1627(_get_options_with_defaults)\n", - " 46 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1455()\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:29(_splitparam)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:974(_is_nested_tuple_indexer)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6055(_check_indexing_error)\n", - " 30 0.000 0.000 0.000 0.000 {method 'getvalue' of '_io.BytesIO' objects}\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:157(_int64_cut_off)\n", - " 120 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:63(_zeros_like_dispatcher)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:638(_passed_categorical)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copyreg.py:104(__newobj__)\n", - " 182 0.000 0.000 0.000 0.000 {method '_is_owned' of '_thread.RLock' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:636(unquote_unreserved)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:349(set_cookie)\n", - " 71 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:447(isclosed)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:82(frame_apply)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:191(_validate_parse_dates_presence)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/utils.py:185(is_isin)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:849(__init__)\n", - " 56 0.000 0.000 0.000 0.000 {method '_checkClosed' of '_io._IOBase' objects}\n", - " 43 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:206(_should_unflatten_callable_args)\n", - " 2 0.000 0.000 0.000 0.000 :117(splitext)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:140(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:735(unwrap)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:1454(__init__)\n", - " 6 0.000 0.000 0.000 0.000 {method 'settimeout' of '_socket.socket' objects}\n", - " 94 0.000 0.000 0.000 0.000 {built-in method numpy.core._multiarray_umath.normalize_axis_index}\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:131(is_new_type)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:333(tail)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/json/__init__.py:299(loads)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1297(_cookie_attrs)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1725(can_hold_element)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:95(__getitem__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/env.py:48(DEBUG_MODE)\n", - " 120 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/arraysetops.py:519(_in1d_dispatcher)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/traitlets/traitlets.py:676(__get__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:220(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:1204(is_potential_multi_index)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:900(default_headers)\n", - " 6 0.000 0.000 0.000 0.000 {built-in method today}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:536(close)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1061()\n", - " 6 0.000 0.000 0.000 0.000 {method 'readlines' of '_io._IOBase' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:258(__init__)\n", - " 36 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_monkey.py:1084(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:326()\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:616()\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1357(__getattr__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:212(_get_cython_vals)\n", - " 29 0.000 0.000 0.000 0.000 {method 'acquire' of '_thread.RLock' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:207(register_hook)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:130(_validate_timeout)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:288()\n", - " 4 0.000 0.000 0.000 0.000 {built-in method _operator.pow}\n", - " 50 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:892(bincount)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:102()\n", - " 153 0.000 0.000 0.000 0.000 {method 'replace' of 'str' objects}\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:5607()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/equity.py:62(fundamental)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:1135(_splitport)\n", - " 116 0.000 0.000 0.000 0.000 {built-in method _thread.get_ident}\n", - " 101 0.000 0.000 0.000 0.000 {method 'extend' of 'list' objects}\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:3002()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ipaddress.py:1213(_parse_octet)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:475(any_extension_types)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1667(_validate_integer)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:69(close)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/request.py:189(body_to_chunks)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1721()\n", - " 41 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2516(__init__)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:167(get_annotations)\n", - " 8 0.000 0.000 0.000 0.000 {built-in method _operator.invert}\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:602()\n", - " 44 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1388(__eq__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:516()\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:353()\n", - " 99 0.000 0.000 0.000 0.000 {method 'partition' of 'str' objects}\n", - " 102 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:2374(_array_equal_dispatcher)\n", - " 62 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:231(_constructor)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:228(_acquireLock)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:241(is_single_block)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:106(_get_distinct_objs)\n", - " 57 0.000 0.000 0.000 0.000 {method 'find' of 'str' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:107(get_redirect_target)\n", - " 124 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:85(empty_like)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/json/decoder.py:332(decode)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:207(_arrays_for_stack_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/json/__init__.py:183(dumps)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1111(_values)\n", - " 27 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:248(_qsize)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:81(__init__)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1889(isEnabledFor)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:3386(arguments_schema)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:206(get_module_ns_of)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1463()\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:688(_sanitize_non_ordered)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:209(_get_decoder)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1730(_get_default_index_names)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/weakref.py:568(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/retry.py:202(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:306(is_named_tuple)\n", - " 37 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/type_adapter.py:333(_is_defer_build_config)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:265(_engine_type)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:950(_validate_or_indexify_columns)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/hooks.py:15(default_hooks)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_compiler.py:398(_simple)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:248(stringify_path)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1046(nlevels)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/utils.py:88(__exit__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:761(__init__)\n", - " 73 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:575(is_set)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1028(_output)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:677(escape_path)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:267(clear)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:91(is_deprecated_instance)\n", - " 38 0.000 0.000 0.000 0.000 {method 'title' of 'str' objects}\n", - " 2 0.000 0.000 0.000 0.000 {built-in method _operator.mul}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:520(urlunsplit)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:534()\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:693(_get_result_dim)\n", - " 33 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1249(shape)\n", - " 99 0.000 0.000 0.000 0.000 {method 'discard' of 'set' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:532(treat_as_nested)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:453(_uniq)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:424(close)\n", - " 32 0.000 0.000 0.000 0.000 {method 'difference_update' of 'set' objects}\n", - " 29 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1030(axes)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:884(__init__)\n", - " 42 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:208(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:3108(cumprod)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:332(_idna_encode)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:303()\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:1507(_get_value)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:172(from_float)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/json/encoder.py:183(encode)\n", - " 91 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:380(is_unique)\n", - " 48 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:51(origin_is_union)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:1206(literal_schema)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:334(__init__)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:479(__repr__)\n", - " 31 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:1095(__new__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_compiler.py:386(_mk_bitmap)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:478()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:550(infer_compression)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:756(_shallow_copy)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:769(is_redirect)\n", - " 13 0.000 0.000 0.000 0.000 {built-in method fromkeys}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:157(from_prioritized_choices)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:983(is_in_axis)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:293(tell)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2738(_check_indexing_error)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:540()\n", - " 41 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2564(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:572(prepare_content_length)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:99(_intenum_converter)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:643(name)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/abstract/singleton.py:14(__call__)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/from_thread.py:170(_check_running)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:315(_subx)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:316(_class_escape)\n", - " 42 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:291(__iter__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:480()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:1087(_validate_conn)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:209(is_object)\n", - " 66 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:248(__len__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:497(_extract_metadata)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/scrapers/analysis.py:13(__init__)\n", - " 166 0.000 0.000 0.000 0.000 {method 'locked' of '_thread.lock' objects}\n", - " 24 0.000 0.000 0.000 0.000 :812(__init__)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1686(name)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:143(clear)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:95(literal_values)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:672(_is_view_after_cow_rules)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:742(_get_axes)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1394(__hash__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/data.py:26(wrapped)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1062(levshape)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1652(_is_scalar_access)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method time.strftime}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:550(domain_match)\n", - " 92 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5558(_append_dispatcher)\n", - " 85 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:290(_add_custom_serialization_from_json_encoders)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:373(is_sequence)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:94(origin_req_host)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:397(ensure_np_dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:596(_sign)\n", - " 52 0.000 0.000 0.000 0.000 {method 'setdefault' of 'dict' objects}\n", - " 2 0.000 0.000 0.000 0.000 {built-in method time.localtime}\n", - " 92 0.000 0.000 0.000 0.000 {built-in method _operator.index}\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/astype.py:249(astype_is_view)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:2352(_adjust_bin_edges)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:117(__init__)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/functools.py:65(wraps)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_schema_generation_shared.py:72(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:201(_set_noconvert_columns)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:52(__init__)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method builtins.locals}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:862(codes)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:85(path_url)\n", - " 5 0.000 0.000 0.000 0.000 {built-in method _operator.and_}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:131(identify_interval)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:464(get_array_op)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:194(_is_internal_frame)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/encodings/idna.py:145(encode)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:891(_get_first_arg_or_any)\n", - " 18 0.000 0.000 0.000 0.000 {built-in method gc.get_referents}\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:284(_get_result_dtype)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:311(is_null_slice)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:316(close)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1285(__call__)\n", - " 6 0.000 0.000 0.000 0.000 {function SocketIO.close at 0x10a2e2e80}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2155()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6357(_protect_consolidate)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1990(__exit__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/generic.py:2015(_wrap_agged_manager)\n", - " 92 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1764(_ravel_dispatcher)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:196(mgr_to_mgr)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:46(get_origin_req_host)\n", - " 27 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:164(__len__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/utils.py:85(__enter__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:175(port)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/hooks.py:22(dispatch_hook)\n", - " 41 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:330(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:691(reach)\n", - " 54 0.000 0.000 0.000 0.000 {built-in method sys.getrefcount}\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1753(__iter__)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:38(is_valid_positional_slice)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1619(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:211(_simple_new)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:541(to_numpy)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:652(usesTime)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:594(_bool_arith_check)\n", - " 24 0.000 0.000 0.000 0.000 {built-in method time.time}\n", - " 1 0.000 0.000 0.000 0.000 {method 'cumprod' of 'numpy.ndarray' objects}\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/IPython/core/compilerop.py:180(extra_flags)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:254(__new__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:1079(closed)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:204()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:1149(_normalize_host)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:535(is_HDN)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1667(set_cookie)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:987(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1939(normalize_name)\n", - " 75 0.000 0.000 0.000 0.000 {method 'popleft' of 'collections.deque' objects}\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2294()\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:376(_escape)\n", - " 45 0.000 0.000 0.000 0.000 {method 'lstrip' of 'str' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:363(_repeater)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/json/encoder.py:205(iterencode)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/pivot.py:173()\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1472()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:3445(call_schema)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:362(_make_index)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4518(_check_inplace_and_allows_duplicate_labels)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:43(get_host)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3035(unique)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/scrapers/fundamentals.py:13(__init__)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:251(_put)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/retry.py:387(is_retry)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:452(_no_nep50_warning)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:572(is_required)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:254(_get)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:231(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:984()\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/_internal_utils.py:25(to_native_string)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:1066(get_fill_func)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1622(close)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:922(acquire)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:219(mask_all)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1524(__init__)\n", - " 1 0.000 0.000 0.000 0.000 {method 'any' of 'numpy.generic' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Context.py:124(clear_context)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:374(_merge_pool_kwargs)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:799(mount)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:83(groups)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/json/decoder.py:343(raw_decode)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/traitlets/traitlets.py:629(get)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:242()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:304(cert_verify)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:659(unquote)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:146(dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1432(_update_class_schema)\n", - " 40 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas_market_calendars/market_calendar.py:187()\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Configuration.py:29(__getattr__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:195(_new_message)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:150(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:393(prepare_method)\n", - " 2 0.000 0.000 0.000 0.000 :140(basename)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/command_runner.py:438(system_settings)\n", - " 3 0.000 0.000 0.000 0.000 :815(__len__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:156(username)\n", - " 21 0.000 0.000 0.000 0.000 {method 'rstrip' of 'bytes' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:1465(list_schema)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:164(host)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1479()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:84(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1959(maybe_mangle_lambdas)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1122()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:811(_newname)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/pivot.py:493(_convert_by)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/connection.py:93(_set_socket_options)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:658(formatMessage)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:535(temp_setattr)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/util/numba_.py:18(maybe_use_numba)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:121(pushlines)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:166(__setattr__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:8084(_align_for_op)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:102(__setitem__)\n", - " 46 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5364(_insert_dispatcher)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:3176(ndim)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:174(not_none)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:574(is_zoneinfo_type)\n", - " 29 0.000 0.000 0.000 0.000 {method 'release' of '_thread.RLock' objects}\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:237(_releaseLock)\n", - " 39 0.000 0.000 0.000 0.000 {method 'strip' of 'str' objects}\n", - " 48 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1828(ndim)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:773(__init__)\n", - " 46 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1389(_moveaxis_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:2133(_refine_defaults_read)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/command_runner.py:443(user_settings)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/scrapers/holders.py:15(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:350(_maybe_make_multi_index_columns)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/handlers.py:354(shouldRollover)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:1233(dedup_names)\n", - " 2 0.000 0.000 0.000 0.000 :121(_splitext)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:799(iter_content)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:918(_wrap_ipv6)\n", - " 24 0.000 0.000 0.000 0.000 {method 'find' of 'bytearray' objects}\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:403()\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1076()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:139()\n", - " 41 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2583(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1329(result_index)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1319(disable)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:113(__init__)\n", - " 6 0.000 0.000 0.000 0.000 {method 'tolist' of 'numpy.ndarray' objects}\n", - " 13 0.000 0.000 0.000 0.000 {method 'decode' of 'bytearray' objects}\n", - " 44 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:108(_noop)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:661(_ilevel)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:4039()\n", - " 13 0.000 0.000 0.000 0.000 {method 'count' of 'bytes' objects}\n", - " 4 0.000 0.000 0.000 0.000 {method 'pop' of 'collections.OrderedDict' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:339(_validate_conn)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:1073(clean_reindex_fill_method)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:65(is_function_with_inner_schema)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1181()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:447(format)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:982()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:788()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:245(read_timeout)\n", - " 41 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:510()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_request_methods.py:51(__init__)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:126(resolve_default_timeout)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ipaddress.py:574(__int__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1695()\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/IPython/core/interactiveshell.py:3493(compare)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/index_tricks.py:415()\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:922(_maybe_infer_dtype_type)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:790(unit)\n", - " 31 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2734(kind)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:135(super_len)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:691(__del__)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:168()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:183(host)\n", - " 41 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:467()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_compiler.py:388()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_compiler.py:467(_get_charset_prefix)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:60(__len__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:72(has_header)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2026(handle_ref_overrides)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:671(check_str_or_none)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2416(_all_dispatcher)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:202(start_connect)\n", - " 21 0.000 0.000 0.000 0.000 {method 'values' of 'collections.OrderedDict' objects}\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/hooks.py:16()\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1331(dtype)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:196()\n", - " 1 0.000 0.000 0.000 0.000 {built-in method _operator.gt}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:49(_check_for_default_values)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:128(_check_for_invalid_keys)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2730(annotation)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1877(_nonzero_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:871(_do_date_conversions)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:1434(is_busday)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Configuration.py:18(initialize_configuration)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:436(flush)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/putmask.py:29(putmask_inplace)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/data.py:155(_get_cookie_basic)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:194(close)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1989(index)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:706()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:440(_format)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:929(release)\n", - " 3 0.000 0.000 0.000 0.000 {method 'sort' of 'list' objects}\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1721()\n", - " 2 0.000 0.000 0.000 0.000 {built-in method zlib.decompressobj}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:432(usesTime)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/retry.py:379(_is_method_retryable)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:935(_expand_ellipsis)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:671()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1269(set_inplace)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:677(_constructor_expanddim)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1674(_check_file_or_buffer)\n", - " 12 0.000 0.000 0.000 0.000 {method 'groups' of 're.Match' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:505(parent_header)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/utils.py:158(get_yf_logger)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:471(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:641(fill_missing_names)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1980(shape)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:105(is_file_like)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:198(split)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:125(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2721(is_nested_tuple)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:244(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1243(_validate_path)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3760(_assert_can_do_setop)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:193(_userinfo)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:91(merge_hooks)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:974(close)\n", - " 12 0.000 0.000 0.000 0.000 {method 'count' of 'str' objects}\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:211()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:601(_set_noconvert_dtype_columns)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:531(validate_ordered)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7652(ensure_has_len)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:997(raise_for_status)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1094()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/_internal_utils.py:38(unicode_is_ascii)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:863(cleandoc)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/utils.py:190(check_single_item)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:202(_maybe_reindex_columns_na_proxy)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_model_construction.py:257(__getattr__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:999(is_in_obj)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1720(getEffectiveLevel)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:367()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:321(filter)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/methods/to_dict.py:155()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:805()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/abstract/error.py:9(__init__)\n", - " 8 0.000 0.000 0.000 0.000 {built-in method _contextvars.copy_context}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:215(push)\n", - " 23 0.000 0.000 0.000 0.000 {method '__contains__' of 'frozenset' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:370()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6390()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:764(categories)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:389(standardize_mapping)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:947()\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:949()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:211(is_multipart)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/retry.py:242()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:343()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:550(_is_master_process)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1230(_encode_request)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/request.py:134(set_file_position)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:665(_get_registered_option)\n", - " 6 0.000 0.000 0.000 0.000 :52(normcase)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:751()\n", - " 23 0.000 0.000 0.000 0.000 {method 'isidentifier' of 'str' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1720(_value_and_type_iter)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:815(filter)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:585(_ensure_2d)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:1080(_is_label_like)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:403(retries)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:532()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:314()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:238(is_int64_overflow_possible)\n", - " 2 0.000 0.000 0.000 0.000 {method 'register' of 'select.poll' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:331(set_payload)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:208(_pop_message)\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:44(_debug)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_dataclasses.py:198(is_builtin_dataclass)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:7045(_deprecate_downcast)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:770(_maybe_check_integrity)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1474()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1234(_validate_method)\n", - " 7 0.000 0.000 0.000 0.000 {method 'index' of 'list' objects}\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:176(dtype)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1809(__init__)\n", - " 1 0.000 0.000 0.000 0.000 {method 'setsockopt' of '_socket.socket' objects}\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:518(__repr__)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:592(groupings)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1021(_argsort_dispatcher)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_schema_generation_shared.py:39(resolve_ref_schema)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_compiler.py:31(_combine_flags)\n", - " 3 0.000 0.000 0.000 0.000 :1()\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1567(_maybe_transpose_result)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/scrapers/quote.py:488(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1643(reconstruct_func)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:338(astype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:354(__array__)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2726(default)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5168(_delete_dispatcher)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_compiler.py:570(isstring)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:187(_get_fill_value)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:143()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_migration.py:262(wrapper)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:966(_selected_obj)\n", - " 5 0.000 0.000 0.000 0.000 {method 'write' of '_io.StringIO' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:75()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:1099(expand_template)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:171()\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1903()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:371(check_key_length)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:56(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:963(fix_flags)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:1123(_make_date_converter)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:186(_from_factorized)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2722(name)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:222()\n", - " 1 0.000 0.000 0.000 0.000 {built-in method math.copysign}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2772()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1141(return_ok_expires)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:948()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:164()\n", - " 3 0.000 0.000 0.000 0.000 {built-in method _sre.compile}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:1229()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:62(is_list_like_indexer)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1180()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:207(validate_header_arg)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2220(_can_hold_na)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/numpy/function.py:223(validate_cum_func_with_skipna)\n", - " 4 0.000 0.000 0.000 0.000 {method 'items' of 'mappingproxy' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:279(_extract_multi_indexer_columns)\n", - " 12 0.000 0.000 0.000 0.000 {method 'items' of 'collections.OrderedDict' objects}\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2317(_any_dispatcher)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:191(_values_for_argsort)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:515(get_compression_method)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1128(value_getitem)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:520(convert_to_list_like)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:655(_constructor)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:123(getLevelName)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:696(names)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ssl.py:1145(_checkClosed)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1251(_validate_host)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:369()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:110(__init__)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1793()\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/IPython/core/interactiveshell.py:1277(user_global_ns)\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1986(_sort_levels_monotonic)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:619(categories)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:77(_atleast_2d_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:1269(_process_date_conversion)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:136(ticker)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:607(consolidate)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:188(all_none)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/dataclasses.py:332(is_pydantic_dataclass)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:886(inner)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:227(connect_timeout)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/parser.py:17(__init__)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:320(__len__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:578(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:183(maybe_box_native)\n", - " 6 0.000 0.000 0.000 0.000 {method 'extend' of 'collections.deque' objects}\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2974(_prod_dispatcher)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:305(loc)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:77(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1192(is_alive)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:205()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:336(_na_ok_dtype)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4367(igetitem)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/functools.py:421(_unwrap_partial)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:518(_check_closed)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2053(get_schema_from_definitions)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:1131(putmask)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1847()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:916()\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2070()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/scrapers/quote.py:582()\n", - " 10 0.000 0.000 0.000 0.000 {method '__exit__' of 'memoryview' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/methods/to_dict.py:160()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:743(set_environ)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:84(is_holiday)\n", - " 15 0.000 0.000 0.000 0.000 {method 'isascii' of 'str' objects}\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/utils.py:82(__init__)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:172(__setitem__)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2781()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/collections/__init__.py:587(__init__)\n", - " 7 0.000 0.000 0.000 0.000 {method 'count' of 'list' objects}\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:117(info)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:703(datetime_schema)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:148(end_date)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1963()\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas_market_calendars/calendars/nyse.py:829(weekmask)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:91(ensure_python_int)\n", - " 6 0.000 0.000 0.000 0.000 {method 'truncate' of '_io.StringIO' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:981()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:90(unverifiable)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1665()\n", - " 6 0.000 0.000 0.000 0.000 {method 'index' of 'str' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:392(ensure_dtype_objs)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:722(_result_index)\n", - " 12 0.000 0.000 0.000 0.000 {method 'seek' of '_io.StringIO' objects}\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:1954(get_debug)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:295(is_closed)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:553(nblocks)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:657()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:445(unit)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/data.py:29()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/env.py:63(str2bool)\n", - " 2 0.000 0.000 0.000 0.000 {method 'set' of '_contextvars.ContextVar' objects}\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:669(result_type)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:1117(_maybe_memory_map)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:502()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/scrapers/quote.py:620()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:687(is_closed)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/util.py:7(to_bytes)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method select.poll}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:941()\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_compiler.py:428(_get_iscased)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1979(nlevels)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:368(getMessage)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2577(is_view)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:212()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:330()\n", - " 7 0.000 0.000 0.000 0.000 {method 'pop' of 'set' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:159(_freeze)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1307()\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:632(ordered)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/replace.py:31(should_use_regex)\n", - " 5 0.000 0.000 0.000 0.000 {built-in method sys.audit}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/errors/__init__.py:535(_check_cacher)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:3015(parameters)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:2139(_codes)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:810(is_expired)\n", - " 4 0.000 0.000 0.000 0.000 {built-in method sys.getrecursionlimit}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:172()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/data.py:28()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:138(_event_pipe)\n", - " 2 0.000 0.000 0.000 0.000 {method 'reset' of '_contextvars.ContextVar' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:421(lexsort)\n", - " 4 0.000 0.000 0.000 0.000 {built-in method posix.getpid}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:144(start_date)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:1426(_validate_parse_dates_arg)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method _codecs.lookup}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:2056(_clean_na_values)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:814(_get_refs_and_copy)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:893(_check_data_length)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:440(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:84(add_unredirected_header)\n", - " 5 0.000 0.000 0.000 0.000 {method 'reverse' of 'list' objects}\n", - " 1 0.000 0.000 0.000 0.000 :2(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1114(return_ok_version)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/connection.py:103(allowed_gai_family)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:369(should_store)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/data.py:31()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:992(_validate_key_length)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:717(index)\n", - " 1 0.000 0.000 0.000 0.000 {method 'swapaxes' of 'numpy.ndarray' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:346(where)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1152(name)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:3172(_ndim_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:698()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:581(iter_slices)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:194(_values_for_factorize)\n", - " 1 0.000 0.000 0.000 0.000 {method 'split' of 're.Pattern' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:255(_has_complex_date_col)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:213()\n", - " 2 0.000 0.000 0.000 0.000 {method 'clear' of 'collections.OrderedDict' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/shape_base.py:1257()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/scrapers/fundamentals.py:44(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:562()\n", - " 2 0.000 0.000 0.000 0.000 {method 'split' of 'bytes' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:191(__set_y)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/multiprocessing/process.py:189(name)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/base.py:115(__eq__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:131(close)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:926(is_blocked)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:2365(_validate_skipfooter)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3211(_validate_sort_keyword)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:494(dtype)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/container.py:39(_get_provider)\n", - " 2 0.000 0.000 0.000 0.000 {method 'cast' of 'memoryview' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/multiprocessing/process.py:37(current_process)\n", - " 4 0.000 0.000 0.000 0.000 {method 'isalnum' of 'str' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_validate_call.py:51()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:480(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:1447(is_index_col)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:124(__iter__)\n", - " 2 0.000 0.000 0.000 0.000 {method 'write' of '_io.TextIOWrapper' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:2245(_isclose_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:188(_expand_user)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/numpy/function.py:383(validate_minmax_axis)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:895(_get_hostport)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:216()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:805(_maybe_copy)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1135(return_ok_secure)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:941(is_not_allowed)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/proxy.py:11(connection_requires_http_tunnel)\n", - " 3 0.000 0.000 0.000 0.000 {method 'date' of 'datetime.datetime' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/obbject.py:209()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/response.py:79()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:891(default_user_agent)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:856(columns)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:141(is_re)\n", - " 1 0.000 0.000 0.000 0.000 {method 'values' of 'mappingproxy' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:450(check_dtype_backend)\n", - " 2 0.000 0.000 0.000 0.000 {method 'translate' of 'bytearray' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/data.py:30()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:245(_init)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method sys.getfilesystemencoding}\n", - " 4 0.000 0.000 0.000 0.000 {built-in method builtins.chr}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:326()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:578(add_headers)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:11522()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:419(_repeat_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method _codecs.lookup_error}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:643(__enter__)\n", - " 1 0.000 0.000 0.000 0.000 :315(__subclasshook__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:527(validate_integer)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:87(get_new_headers)\n", - " 3 0.000 0.000 0.000 0.000 {method 'get' of 'mappingproxy' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:460(tolist)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:216(_validate_dtype)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:446(__exit__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:1320(_diff_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:2267(_extract_dialect)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:235()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/data.py:418(_get_proxy)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:292(is_fsspec_url)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1147(return_ok_port)\n", - " 3 0.000 0.000 0.000 0.000 {function HTTPResponse.flush at 0x10c128cc0}\n", - " 2 0.000 0.000 0.000 0.000 {method 'get' of '_contextvars.ContextVar' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/data.py:80(_set_session)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:886()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:3019(return_annotation)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/helpers/utils.py:10(verify_ticker)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:986(_validate_usecols_arg)\n", - " 1 0.000 0.000 0.000 0.000 {method 'rsplit' of 'str' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2240()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:192()\n", - " 2 0.000 0.000 0.000 0.000 {method 'with_traceback' of 'BaseException' objects}\n", - " 1 0.000 0.000 0.000 0.000 {built-in method _socket.getdefaulttimeout}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:443(__enter__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:69(is_unverifiable)\n", - " 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1976(_shape_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/shape_base.py:1181(_tile_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1987(__enter__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:559(_validate_names)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:247()\n", - " 1 0.000 0.000 0.000 0.000 {built-in method builtins.divmod}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:224()\n", - " 1 0.000 0.000 0.000 0.000 {method 'expandtabs' of 'str' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/collections/__init__.py:660(update)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:107(_copy_immutable)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:3104(_cumprod_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:451(__enter__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:105(_box_func)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/collections/__init__.py:601(__missing__)\n", - "\n", - "\n", - "\n" - ] - } - ], - "source": [ - "stats.print_stats()\n", - "print(stream.getvalue())" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Updating Cache\n" - ] - } - ], - "source": [ - "from EventDriven.riskmanager import produce_order_candidates, populate_cache\n", - "import cProfile\n", - "import pstats\n", - "import io\n", - "profiler = cProfile.Profile()\n", - "profiler.enable()\n", - "#run backtest\n", - "populate_cache(\n", - " candi,\n", - " evb_backtest.start_date,\n", - " evb_backtest.end_date,\n", - " evb_backtest.end_date,\n", - ")\n", - "profiler.disable()\n", - "stream = io.StringIO()\n", - "stats = pstats.Stats(profiler, stream=stream).sort_stats('cumulative')" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "ename": "KeyboardInterrupt", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[25], line 2\u001b[0m\n\u001b[1;32m 1\u001b[0m stats\u001b[38;5;241m.\u001b[39mprint_stats()\n\u001b[0;32m----> 2\u001b[0m \u001b[38;5;28mprint\u001b[39m(stream\u001b[38;5;241m.\u001b[39mgetvalue())\n", - "Cell \u001b[0;32mIn[25], line 2\u001b[0m\n\u001b[1;32m 1\u001b[0m stats\u001b[38;5;241m.\u001b[39mprint_stats()\n\u001b[0;32m----> 2\u001b[0m \u001b[38;5;28mprint\u001b[39m(stream\u001b[38;5;241m.\u001b[39mgetvalue())\n", - "File \u001b[0;32m_pydevd_bundle/pydevd_cython.pyx:1457\u001b[0m, in \u001b[0;36m_pydevd_bundle.pydevd_cython.SafeCallWrapper.__call__\u001b[0;34m()\u001b[0m\n", - "File \u001b[0;32m_pydevd_bundle/pydevd_cython.pyx:701\u001b[0m, in \u001b[0;36m_pydevd_bundle.pydevd_cython.PyDBFrame.trace_dispatch\u001b[0;34m()\u001b[0m\n", - "File \u001b[0;32m_pydevd_bundle/pydevd_cython.pyx:1152\u001b[0m, in \u001b[0;36m_pydevd_bundle.pydevd_cython.PyDBFrame.trace_dispatch\u001b[0;34m()\u001b[0m\n", - "File \u001b[0;32m_pydevd_bundle/pydevd_cython.pyx:1135\u001b[0m, in \u001b[0;36m_pydevd_bundle.pydevd_cython.PyDBFrame.trace_dispatch\u001b[0;34m()\u001b[0m\n", - "File \u001b[0;32m_pydevd_bundle/pydevd_cython.pyx:312\u001b[0m, in \u001b[0;36m_pydevd_bundle.pydevd_cython.PyDBFrame.do_wait_suspend\u001b[0;34m()\u001b[0m\n", - "File \u001b[0;32m~/miniconda3/envs/openbb/lib/python3.11/site-packages/debugpy/_vendored/pydevd/pydevd.py:2070\u001b[0m, in \u001b[0;36mPyDB.do_wait_suspend\u001b[0;34m(self, thread, frame, event, arg, exception_type)\u001b[0m\n\u001b[1;32m 2067\u001b[0m from_this_thread\u001b[38;5;241m.\u001b[39mappend(frame_custom_thread_id)\n\u001b[1;32m 2069\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_threads_suspended_single_notification\u001b[38;5;241m.\u001b[39mnotify_thread_suspended(thread_id, thread, stop_reason):\n\u001b[0;32m-> 2070\u001b[0m keep_suspended \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_do_wait_suspend\u001b[49m\u001b[43m(\u001b[49m\u001b[43mthread\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mframe\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mevent\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43marg\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msuspend_type\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfrom_this_thread\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mframes_tracker\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2072\u001b[0m frames_list \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 2074\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m keep_suspended:\n\u001b[1;32m 2075\u001b[0m \u001b[38;5;66;03m# This means that we should pause again after a set next statement.\u001b[39;00m\n", - "File \u001b[0;32m~/miniconda3/envs/openbb/lib/python3.11/site-packages/debugpy/_vendored/pydevd/pydevd.py:2106\u001b[0m, in \u001b[0;36mPyDB._do_wait_suspend\u001b[0;34m(self, thread, frame, event, arg, suspend_type, from_this_thread, frames_tracker)\u001b[0m\n\u001b[1;32m 2103\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_call_input_hook()\n\u001b[1;32m 2105\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mprocess_internal_commands()\n\u001b[0;32m-> 2106\u001b[0m time\u001b[38;5;241m.\u001b[39msleep(\u001b[38;5;241m0.01\u001b[39m)\n\u001b[1;32m 2108\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcancel_async_evaluation(get_current_thread_id(thread), \u001b[38;5;28mstr\u001b[39m(\u001b[38;5;28mid\u001b[39m(frame)))\n\u001b[1;32m 2110\u001b[0m \u001b[38;5;66;03m# process any stepping instructions\u001b[39;00m\n", - "\u001b[0;31mKeyboardInterrupt\u001b[0m: " - ] - } - ], - "source": [ - "stats.print_stats()\n", - "print(stream.getvalue())" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Index(['Expiration', 'DTE', 'Strike', 'C', 'P', 'Spot', 'q', 'r',\n", - " 'relative_moneyness', 'moneyness_spread', 'dte_spread', 'ticker',\n", - " 'moneyness', 'TGT_DTE', 'right', 'option_id'],\n", - " dtype='object', name='Right')" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "candi['long'][0].columns" - ] - }, - { - "cell_type": "code", - "execution_count": 270, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
OpenHighLowCloseVolumeBid_sizeCloseBidAsk_sizeCloseAskMidpointWeighted_midpoint
Datetime
2023-01-0313.5013.5013.0013.00222313.5511014.0513.80013.715165
2023-01-0313.5013.5013.0013.00222313.5511014.0513.80013.715165
2023-01-0414.0015.5014.0015.2087615.3512915.8515.60015.664634
2023-01-0414.0015.5014.0015.2087615.3512915.8515.60015.664634
2023-01-0513.3013.3013.3013.30222613.3039114.5513.92514.092139
2023-01-0513.3013.3013.3013.30222613.3039114.5513.92514.092139
2023-01-0611.4711.4711.4711.47110014.8510615.1014.97514.978641
2023-01-0611.4711.4711.4711.47110014.8510615.1014.97514.978641
2023-01-0916.7518.3816.7518.38320217.3033818.0517.67517.769444
2023-01-0916.7518.3816.7518.38320217.3033818.0517.67517.769444
2023-01-100.000.000.000.00018716.702517.1016.90016.747170
2023-01-100.000.000.000.00018716.702517.1016.90016.747170
2023-01-1118.5018.5018.1018.10412018.3028318.7018.50018.580893
2023-01-1118.5018.5018.1018.10412018.3028318.7018.50018.580893
2023-01-1217.8217.8217.8217.82112317.9524018.3018.12518.181405
2023-01-1217.8217.8217.8217.82112317.9524018.3018.12518.181405
2023-01-1316.6516.6616.6516.66213517.0513517.4017.22517.225000
2023-01-1316.6516.6616.6516.66213517.0513517.4017.22517.225000
2023-01-1720.5421.4519.6021.452327521.0014521.6021.30021.207143
2023-01-1720.5421.4519.6021.452327521.0014521.6021.30021.207143
2023-01-1823.5023.5019.4020.00548419.6019520.1519.87519.984409
2023-01-1823.5023.5019.4020.00548419.6019520.1519.87519.984409
2023-01-1919.6019.6019.2519.25256618.8010219.2019.00019.042857
2023-01-1919.6019.6019.2519.25256618.8010219.2019.00019.042857
2023-01-2020.1721.0120.1720.98439220.9012821.5021.20021.047692
2023-01-2020.1721.0120.1720.98439220.9012821.5021.20021.047692
2023-01-2323.7526.1523.7526.1512925725.7019726.1525.92525.895264
2023-01-2323.7526.1523.7526.1512925725.7019726.1525.92525.895264
2023-01-2424.8525.7524.8525.45546925.209225.8525.52525.306595
2023-01-2424.8525.7524.8525.45546925.209225.8525.52525.306595
2023-01-2523.2225.9723.2225.8320226924.6018025.3524.97524.900668
2023-01-2523.2225.9723.2225.8320226924.6018025.3524.97524.900668
2023-01-2631.8833.6330.3031.33856432.0512032.6532.35032.441304
2023-01-2631.8833.6330.3031.33856432.0512032.6532.35032.441304
2023-01-2734.3547.4234.3547.4016751145.4535246.9546.20046.061819
2023-01-2734.3547.4234.3547.4016751145.4535246.9546.20046.061819
2023-01-3045.5045.5038.8339.031394137.506638.9038.20038.363551
2023-01-3045.5045.5038.8339.031394137.506638.9038.20038.363551
2023-01-3139.4142.5039.0042.50231741.301542.5541.92541.885937
2023-01-3139.4142.5039.0042.50231741.301542.5541.92541.885937
2023-02-0143.0048.0040.6246.9654146.5518547.8547.20047.843011
2023-02-0143.0048.0040.6246.9654146.5518547.8547.20047.843011
2023-02-0251.7656.3351.7652.8342151.252552.8552.05052.788462
2023-02-0251.7656.3351.7652.8342151.252552.8552.05052.788462
2023-02-0361.2461.2455.3055.30271053.702555.3554.52554.878571
2023-02-0361.2461.2455.3055.30271053.702555.3554.52554.878571
2023-02-0659.1059.5058.7058.7074758.0520759.1558.60058.946457
2023-02-0659.1059.5058.7058.7074758.0520759.1558.60058.946457
2023-02-0757.3359.1056.0056.0065659.002860.0059.50059.333333
2023-02-0757.3359.1056.0056.0065659.002860.0059.50059.333333
2023-02-0863.2364.8062.7563.10334662.806863.9063.35063.456140
2023-02-0863.2364.8062.7563.10334662.806863.9063.35063.456140
2023-02-0968.0072.9667.9867.98101368.101168.8068.45068.420833
2023-02-0968.0072.9667.9867.98101368.101168.8068.45068.420833
2023-02-1065.2065.2060.1060.10142759.6519660.4560.05060.353139
2023-02-1065.2065.2060.1060.10142759.6519660.4560.05060.353139
2023-02-1358.0058.0057.6057.6049557.2554458.6057.92558.399296
2023-02-1358.0058.0057.6057.6049557.2554458.6057.92558.399296
2023-02-1454.1468.9554.1468.45142168.5556870.1569.35070.092954
2023-02-1454.1468.9554.1468.45142168.5556870.1569.35070.092954
2023-02-1571.7272.3571.7272.35165172.603873.8573.22573.133708
2023-02-1571.7272.3571.7272.35165172.603873.8573.22573.133708
2023-02-1671.0071.0067.7267.724560.4520164.9562.70064.840777
2023-02-1671.0071.0067.7267.724560.4520164.9562.70064.840777
2023-02-1765.0065.0063.0063.80204868.104969.8068.95068.958763
2023-02-1765.0065.0063.0063.80204868.104969.8068.95068.958763
2023-02-2167.2067.2063.6563.65243559.851661.0560.45059.892572
2023-02-2167.2067.2063.6563.65243559.851661.0560.45059.892572
2023-02-2259.2561.1559.2061.15862061.7530263.2062.47563.109938
2023-02-2259.2561.1559.2061.15862061.7530263.2062.47563.109938
2023-02-230.000.000.000.0006662.8024463.6563.22563.469032
2023-02-230.000.000.000.0006662.8024463.6563.22563.469032
2023-02-2458.8058.8058.8058.80217358.7014259.5059.10059.060635
2023-02-2458.8058.8058.8058.80217358.7014259.5059.10059.060635
2023-02-2764.5767.5364.5767.5385966.6040567.6067.10067.472845
2023-02-2764.5767.5364.5767.5385966.6040567.6067.10067.472845
2023-02-2867.7567.7565.0065.7765564.201165.3564.77564.391667
2023-02-2867.7567.7565.0065.7765564.201165.3564.77564.391667
2023-03-0165.0065.0060.6262.151651661.5555862.7562.15062.173464
2023-03-0165.0065.0060.6262.151651661.5555862.7562.15062.173464
2023-03-0252.0552.3051.5952.30125752.704253.2552.97552.933333
2023-03-0252.0552.3051.5952.30125752.704253.2552.97552.933333
2023-03-0354.7059.1554.7058.20320257.2026058.1557.67557.734632
2023-03-0354.7059.1554.7058.20320257.2026058.1557.67557.734632
2023-03-0655.8455.8455.2155.211425953.9514954.8054.37554.260417
2023-03-0655.8455.8455.2155.211425953.9514954.8054.37554.260417
2023-03-0750.9551.5550.9551.5588849.757250.5050.12550.087500
2023-03-0750.9551.5550.9551.5588849.757250.5050.12550.087500
2023-03-0845.7746.9545.0045.001820145.7017546.3046.00045.979255
2023-03-0845.7746.9545.0045.001820145.7017546.3046.00045.979255
2023-03-0946.6547.6039.9340.171197639.85140.2040.02539.854545
2023-03-0946.6547.6039.9340.171197639.85140.2040.02539.854545
2023-03-1041.5242.3040.7540.751010440.4023041.0040.70040.813174
2023-03-1041.5242.3040.7540.751010440.4023041.0040.70040.813174
2023-03-1337.0042.1135.5041.406710440.554241.3040.92540.765753
2023-03-1337.0042.1135.5041.406710440.554241.3040.92540.765753
2023-03-1444.9046.2044.0046.1048446.255646.9046.57546.856667
2023-03-1444.9046.2044.0046.1048446.255646.9046.57546.856667
2023-03-1544.5045.5342.5443.90198044.205945.0544.62544.560791
2023-03-1544.5045.5342.5443.90198044.205945.0544.62544.560791
2023-03-1644.0546.9844.0546.751612546.406447.0546.72546.620106
2023-03-1644.0546.9844.0546.751612546.406447.0546.72546.620106
2023-03-1746.7046.7043.6344.2010014143.9520944.6044.27544.338143
2023-03-1746.7046.7043.6344.2010014143.9520944.6044.27544.338143
2023-03-2042.1147.9042.1145.402017445.504046.1045.80045.612150
2023-03-2042.1147.9042.1145.402017445.504046.1045.80045.612150
2023-03-2151.2556.6951.1056.284574154.953856.5055.72555.025610
2023-03-2151.2556.6951.1056.284574154.953856.5055.72555.025610
2023-03-2256.8056.8053.0053.0036951.303751.8551.57551.491981
2023-03-2256.8056.8053.0053.0036951.303751.8551.57551.491981
2023-03-2356.0056.0052.3052.30107652.402953.0052.70052.565714
2023-03-2356.0056.0052.3052.30107652.402953.0052.70052.565714
2023-03-2451.2451.2550.4050.4047651.203151.6551.42551.330374
2023-03-2451.2451.2550.4050.4047651.203151.6551.42551.330374
2023-03-2754.0554.0552.2352.23235552.006352.4552.22552.240254
2023-03-2754.0554.0552.2352.23235552.006352.4552.22552.240254
2023-03-2850.1550.1549.0349.03713450.1016750.5550.32550.349668
2023-03-2850.1550.1549.0349.03713450.1016750.5550.32550.349668
2023-03-2952.4352.8552.4352.85215152.80753.2553.02552.819937
2023-03-2952.4352.8552.4352.85215152.80753.2553.02552.819937
2023-03-3055.0055.0554.1054.10413353.6038954.1553.87554.009866
2023-03-3055.0055.0554.1054.10413353.6038954.1553.87554.009866
2023-03-3156.7862.5456.7862.171923162.159262.9062.52562.363622
2023-03-3156.7862.5456.7862.171923162.159262.9062.52562.363622
2023-04-0357.0057.0051.9051.901143852.6019453.4053.00052.845570
2023-04-0357.0057.0051.9051.901143852.6019453.4053.00052.845570
2023-04-0451.7051.7050.8550.85237551.0512851.8051.42551.240855
2023-04-0451.7051.7050.8550.85237551.0512851.8051.42551.240855
2023-04-0549.4049.4045.7547.501725846.1515546.9546.55046.450242
2023-04-0549.4049.4045.7547.501725846.1515546.9546.55046.450242
2023-04-0644.2546.5543.0046.002616545.5515546.1545.85045.840625
2023-04-0644.2546.5543.0046.002616545.5515546.1545.85045.840625
2023-04-1043.3545.7041.0045.35428145.1012345.8545.47545.552206
2023-04-1043.3545.7041.0045.35428145.1012345.8545.47545.552206
2023-04-1147.5048.8546.6547.801026546.7516547.4547.10047.018605
2023-04-1147.5048.8546.6547.801026546.7516547.4547.10047.018605
2023-04-1243.5143.5143.1143.1175742.4514043.1042.77542.911929
2023-04-1243.5143.5143.1143.1175742.4514043.1042.77542.911929
2023-04-1345.4546.0945.4546.09418045.5516246.1045.82545.810526
2023-04-1345.4546.0945.4546.09418045.5516246.1045.82545.810526
2023-04-1445.1045.1043.5344.612533744.4523545.1544.80044.737587
2023-04-1445.1045.1043.5344.612533744.4523545.1544.80044.737587
2023-04-1747.5047.5043.5044.703319045.1023545.9045.50045.542353
2023-04-1747.5047.5043.5044.703319045.1023545.9045.50045.542353
2023-04-1844.8845.6043.3043.302211342.8522343.5043.17543.281399
2023-04-1844.8845.6043.3043.302211342.8522343.5043.17543.281399
2023-04-1940.7541.5040.0040.502422339.459740.1539.80039.662188
2023-04-1940.7541.5040.0040.502422339.459740.1539.80039.662188
2023-04-2030.8031.8628.1528.886829828.552629.2028.87528.602160
2023-04-2030.8031.8628.1528.886829828.552629.2028.87528.602160
2023-04-2130.0030.0028.2829.372514329.0030229.6029.30029.407191
2023-04-2130.0030.0028.2829.372514329.0030229.6029.30029.407191
2023-04-2428.0028.0026.0526.7015121027.1530527.9027.52527.594175
2023-04-2428.0028.0026.0526.7015121027.1530527.9027.52527.594175
2023-04-2526.7527.7926.7527.579316026.3023027.1526.72526.801282
2023-04-2526.7527.7926.7527.579316026.3023027.1526.72526.801282
2023-04-2626.0026.0023.2024.10180120.6527823.8522.25023.838530
2023-04-2626.0026.0023.2024.10180120.6527823.8522.25023.838530
2023-04-2723.6525.7023.6525.701124226.1027626.8026.45026.472973
2023-04-2723.6525.7023.6525.701124226.1027626.8026.45026.472973
2023-04-2826.4028.4025.3528.371330827.8528828.6528.25028.236577
2023-04-2826.4028.4025.3528.371330827.8528828.6528.25028.236577
2023-05-0127.4527.4525.9026.45170020326.4516327.1026.77526.739481
2023-05-0127.4527.4525.9026.45170020326.4516327.1026.77526.739481
2023-05-0228.3528.3526.6026.604517225.9041026.6526.27526.428351
2023-05-0228.3528.3526.6026.604517225.9041026.6526.27526.428351
2023-05-0327.9927.9926.4726.477726.0020726.8026.40026.773832
2023-05-0327.9927.9926.4726.477726.0020726.8026.40026.773832
2023-05-0426.5526.8026.5526.80313026.4533127.0026.72526.844902
2023-05-0426.5526.8026.5526.80313026.4533127.0026.72526.844902
2023-05-0528.6531.7628.6531.20777631.2523331.8031.52531.664725
2023-05-0528.6531.7628.6531.20777631.2523331.8031.52531.664725
2023-05-0832.8632.8632.8232.82221632.3532433.1032.72532.800000
2023-05-0832.8632.8632.8232.82221632.3532433.1032.72532.800000
2023-05-0931.3531.3530.0830.102023830.7029331.4031.05031.086252
2023-05-0931.3531.3530.0830.102023830.7029331.4031.05031.086252
2023-05-1033.3633.8030.6030.622722130.2031130.9030.55030.609211
2023-05-1033.3633.8030.6030.622722130.2031130.9030.55030.609211
2023-05-1129.7031.3029.7030.821828131.9522532.9532.45032.394664
2023-05-1129.7031.3029.7030.821828131.9522532.9532.45032.394664
2023-05-1235.0035.9730.1630.9017410330.0021131.0030.50030.671975
2023-05-1235.0035.9730.1630.9017410330.0021131.0030.50030.671975
2023-05-1531.2131.2128.9528.952743628.8033529.5529.17529.125875
2023-05-1531.2131.2128.9528.952743628.8033529.5529.17529.125875
2023-05-1629.0030.8527.9730.852414728.8539129.5529.20029.358736
2023-05-1629.0030.8527.9730.852414728.8539129.5529.20029.358736
2023-05-1732.2033.2532.2033.16765032.6524433.2532.95033.147959
2023-05-1732.2033.2532.2033.16765032.6524433.2532.95033.147959
2023-05-1831.9533.7031.9533.7083433.705535.2034.45034.626966
2023-05-1831.9533.7031.9533.7083433.705535.2034.45034.626966
2023-05-1935.0037.9034.7236.5016218136.4019337.0036.70036.709626
2023-05-1935.0037.9034.7236.5016218136.4019337.0036.70036.709626
2023-05-2238.0042.7038.0042.70488842.7011343.3543.02543.065423
2023-05-2238.0042.7038.0042.70488842.7011343.3543.02543.065423
2023-05-2341.1245.8541.1242.753916440.7023141.6041.15041.226329
2023-05-2341.1245.8541.1242.753916440.7023141.6041.15041.226329
2023-05-2438.0039.8037.6539.801812538.9025939.7039.30039.439583
2023-05-2438.0039.8037.6539.801812538.9025939.7039.30039.439583
2023-05-2539.1040.6538.2540.651910439.7022740.3040.00040.111480
2023-05-2539.1040.6538.2540.651910439.7022740.3040.00040.111480
2023-05-2641.6048.1041.6046.35422145.8017946.4046.10046.337000
2023-05-2641.6048.1041.6046.35422145.8017946.4046.10046.337000
2023-05-3054.6554.6549.5549.551525251.4024653.0052.20052.190361
2023-05-3054.6554.6549.5549.551525251.4024653.0052.20052.190361
2023-05-3153.0553.0548.3051.002316853.3019554.8054.05054.105785
2023-05-3153.0553.0548.3051.002316853.3019554.8054.05054.105785
2023-06-0152.6057.8052.6057.804128955.7516156.8056.27556.125667
2023-06-0152.6057.8052.6057.804128955.7516156.8056.27556.125667
2023-06-0261.0563.5061.0061.452217860.8018761.7561.27561.286712
2023-06-0261.0563.5061.0061.452217860.8018761.7561.27561.286712
2023-06-0565.8566.3564.3464.341239763.6514664.4064.02564.100617
2023-06-0565.8566.3564.3464.341239763.6514664.4064.02564.100617
2023-06-0665.0065.6564.9564.9511313366.3027567.1066.70066.839216
2023-06-0665.0065.6564.9564.9511313366.3027567.1066.70066.839216
2023-06-0771.9072.6568.7769.752130367.8041869.5068.65068.785576
2023-06-0771.9072.6568.7769.752130367.8041869.5068.65068.785576
2023-06-0870.2076.2570.2075.992714277.2518977.9077.57577.621148
2023-06-0870.2076.2570.2075.992714277.2518977.9077.57577.621148
2023-06-0989.7092.3585.7186.062215785.0012986.1585.57585.518706
2023-06-1287.9089.1086.8088.004726589.2039990.7089.95090.101355
2023-06-1287.9089.1086.8088.004726589.2039990.7089.95090.101355
2023-06-1393.9097.7293.4497.725225997.0536798.5097.77597.900080
2023-06-1393.9097.7293.4497.725225997.0536798.5097.77597.900080
2023-06-1496.6096.6092.6092.601117995.7522596.7596.25096.306931
2023-06-1496.6096.6092.6092.601117995.7522596.7596.25096.306931
2023-06-1595.6995.6995.6995.69310795.2513996.4595.85095.928049
2023-06-1595.6995.6995.6995.69310795.2513996.4595.85095.928049
2023-06-1699.80101.5297.7098.50137599.50108100.4099.950100.031148
2023-06-1699.80101.5297.7098.50137599.50108100.4099.950100.031148
2023-06-20105.00112.60105.00112.6027137112.00107112.95112.475112.416598
2023-06-20105.00112.60105.00112.6027137112.00107112.95112.475112.416598
2023-06-21106.60106.6098.1098.10166515898.1521999.2598.70098.788992
2023-06-21106.60106.6098.1098.10166515898.1521999.2598.70098.788992
2023-06-2295.0095.0095.0095.001175102.55205103.70103.125103.170395
2023-06-2295.0095.0095.0095.001175102.55205103.70103.125103.170395
2023-06-2392.8595.7992.8595.71515694.958395.7095.32595.210460
2023-06-2392.8595.7992.8595.71515694.958395.7095.32595.210460
2023-06-2694.7594.7587.0087.00620181.2030982.3581.77581.896765
2023-06-2694.7594.7587.0087.00620181.2030982.3581.77581.896765
2023-06-2786.2788.2582.6088.251613788.3516689.4088.87588.925248
2023-06-2786.2788.2582.6088.251613788.3516689.4088.87588.925248
2023-06-2892.8593.6592.8593.103221693.5534594.9094.22594.380214
2023-06-2892.8593.6592.8593.103221693.5534594.9094.22594.380214
2023-06-290.000.000.000.00013294.905395.5095.20095.071892
2023-06-290.000.000.000.00013294.905395.5095.20095.071892
2023-06-3099.6099.6099.6099.6018098.4516399.7099.07599.288477
2023-06-3099.6099.6099.6099.6018098.4516399.7099.07599.288477
2023-07-03118.05118.05114.15114.252676114.80110116.20115.500115.627957
2023-07-03118.05118.05114.15114.252676114.80110116.20115.500115.627957
2023-07-05114.27115.25114.25115.255143117.05311118.25117.650117.872026
2023-07-05114.27115.25114.25115.255143117.05311118.25117.650117.872026
2023-07-06112.50112.50112.50112.501154111.70276112.60112.150112.277674
2023-07-06112.50112.50112.50112.501154111.70276112.60112.150112.277674
2023-07-07112.41112.41112.41112.411132109.25275110.40109.825110.027027
2023-07-07112.41112.41112.41112.411132109.25275110.40109.825110.027027
2023-07-10107.98107.98104.43104.439228104.20244105.45104.825104.846186
2023-07-10107.98107.98104.43104.439228104.20244105.45104.825104.846186
2023-07-110.000.000.000.000175104.35282105.50104.925105.059628
2023-07-110.000.000.000.000175104.35282105.50104.925105.059628
2023-07-12110.87110.87107.54107.548112106.20232106.95106.575106.705814
2023-07-12110.87110.87107.54107.548112106.20232106.95106.575106.705814
2023-07-130.000.000.000.000111111.50155112.50112.000112.082707
2023-07-130.000.000.000.000111111.50155112.50112.000112.082707
2023-07-14111.00114.42111.00114.42446114.6045115.50115.050115.045055
2023-07-14111.00114.42111.00114.42446114.6045115.50115.050115.045055
2023-07-17118.20118.20118.20118.20350123.2549124.20123.725123.720202
2023-07-17118.20118.20118.20118.20350123.2549124.20123.725123.720202
2023-07-18121.25126.28121.25126.2841124.7515128.20126.475127.984375
2023-07-18121.25126.28121.25126.2841124.7515128.20126.475127.984375
2023-07-190.000.000.000.0007123.3525127.05125.200126.240625
2023-07-190.000.000.000.0007123.3525127.05125.200126.240625
2023-07-20106.07106.0797.9597.95162297.4013498.2097.80098.087179
2023-07-20106.07106.0797.9597.95162297.4013498.2097.80098.087179
2023-07-2195.0096.9795.0096.9725294.604195.3594.97594.930645
2023-07-2195.0096.9795.0096.9725294.604195.3594.97594.930645
2023-07-2491.98102.7591.20102.755161102.50181103.35102.925102.949854
2023-07-2491.98102.7591.20102.755161102.50181103.35102.925102.949854
2023-07-25104.75104.75104.75104.75811098.60180100.7599.67599.934483
2023-07-25104.75104.75104.75104.75811098.60180100.7599.67599.934483
2023-07-260.000.000.000.00017497.058499.1598.10097.733721
2023-07-260.000.000.000.00017497.058499.1598.10097.733721
2023-07-2790.9090.9090.9090.90120089.9533691.7090.82591.047015
2023-07-2790.9090.9090.9090.90120089.9533691.7090.82591.047015
2023-07-2899.6399.6399.6399.63141998.20330100.7599.47599.323498
2023-07-2899.6399.6399.6399.63141998.20330100.7599.47599.323498
2023-07-31100.00101.0599.70101.05336499.30140101.05100.17599.786111
2023-07-31100.00101.0599.70101.05336499.30140101.05100.17599.786111
2023-08-010.000.000.000.00040094.2551296.3095.27595.400877
2023-08-010.000.000.000.00040094.2551296.3095.27595.400877
2023-08-0289.8489.8489.6289.62257988.0554890.4089.22589.192680
2023-08-0289.8489.8489.6289.62257988.0554890.4089.22589.192680
2023-08-030.000.000.000.00011492.7015895.4094.05094.268382
2023-08-030.000.000.000.00011492.7015895.4094.05094.268382
2023-08-0490.0690.0690.0490.04227687.2024889.9088.55088.477863
2023-08-0490.0690.0690.0490.04227687.2024889.9088.55088.477863
2023-08-0781.8581.9081.3181.31735984.7036787.2085.95085.963774
2023-08-0781.8581.9081.3181.31735984.7036787.2085.95085.963774
2023-08-0883.7783.7783.7783.77111684.1524985.5084.82585.070959
2023-08-0883.7783.7783.7783.77111684.1524985.5084.82585.070959
2023-08-0982.5082.5079.6280.293828177.3538079.4578.40078.557262
2023-08-0982.5082.5079.6280.293828177.3538079.4578.40078.557262
2023-08-1081.1383.2680.3080.33820080.2034081.8581.02581.238889
2023-08-1081.1383.2680.3080.33820080.2034081.8581.02581.238889
2023-08-110.000.000.000.00035877.5038079.4078.45078.478320
2023-08-110.000.000.000.00035877.5038079.4078.45078.478320
2023-08-1472.9574.0472.9573.95449274.2033176.1075.15074.964156
2023-08-1472.9574.0472.9573.95449274.2033176.1075.15074.964156
2023-08-150.000.000.000.00028968.8530371.2570.05070.078378
2023-08-150.000.000.000.00028968.8530371.2570.05070.078378
2023-08-1666.1566.1565.2065.20516163.2526664.6563.95064.122131
2023-08-1666.1566.1565.2065.20516163.2526664.6563.95064.122131
2023-08-1761.1762.0058.3558.351127757.6534059.7058.67558.779660
2023-08-1761.1762.0058.3558.351127757.6534059.7058.67558.779660
2023-08-1855.0055.0055.0055.00111754.8513656.5055.67555.736957
2023-08-1855.0055.0055.0055.00111754.8513656.5055.67555.736957
2023-08-2162.9067.8762.9067.872841068.0045968.7568.37568.396145
2023-08-2162.9067.8762.9067.872841068.0045968.7568.37568.396145
2023-08-2276.0076.0072.1072.10538869.9535570.7070.32570.308345
2023-08-2276.0076.0072.1072.10538869.9535570.7070.32570.308345
2023-08-2373.5573.5573.5073.504035672.5543673.5073.02573.072980
2023-08-2373.5573.5573.5073.504035672.5543673.5073.02573.072980
2023-08-2470.4170.5767.4067.403130167.1556368.0567.60067.736458
2023-08-2470.4170.5767.4067.403130167.1556368.0567.60067.736458
2023-08-2571.2172.1468.7072.1023415274.0531475.3074.67574.892275
2023-08-2571.2172.1468.7072.1023415274.0531475.3074.67574.892275
2023-08-2874.1574.1574.1574.15113973.8515575.5574.70074.746259
2023-08-2874.1574.1574.1574.15113973.8515575.5574.70074.746259
2023-08-2987.6087.6087.6087.60126989.3523391.7590.55090.463944
2023-08-2987.6087.6087.6087.60126989.3523391.7590.55090.463944
2023-08-3087.3488.1187.2688.07624989.6519591.2590.45090.352703
2023-08-3087.3488.1187.2688.07624989.6519591.2590.45090.352703
2023-08-310.000.000.000.00037690.4030892.0591.22591.142982
2023-08-310.000.000.000.00037690.4030892.0591.22591.142982
2023-09-0180.2080.2079.1879.18425279.0540380.0079.52579.634504
2023-09-0180.2080.2079.1879.18425279.0540380.0079.52579.634504
2023-09-0589.2589.2589.2589.25446789.0552690.3589.70089.738620
2023-09-0589.2589.2589.2589.25446789.0552690.3589.70089.738620
2023-09-0685.6285.6782.3582.35536984.9543285.9585.45085.489326
2023-09-0685.6285.6782.3582.35536984.9543285.9585.45085.489326
2023-09-0780.0080.3080.0080.301040684.4537485.2584.85084.833590
2023-09-0780.0080.3080.0080.301040684.4537485.2584.85084.833590
2023-09-0881.9481.9481.9481.94343081.5040982.3581.92581.914362
2023-09-0881.9481.9481.9481.94343081.5040982.3581.92581.914362
2023-09-11103.57103.57103.57103.571260103.4550105.70104.575103.812903
2023-09-11103.57103.57103.57103.571260103.4550105.70104.575103.812903
2023-09-120.000.000.000.00044098.4047499.4098.90098.918600
2023-09-120.000.000.000.00044098.4047499.4098.90098.918600
2023-09-13102.65102.65102.65102.651399101.55273103.10102.325102.179688
2023-09-13102.65102.65102.65102.651399101.55273103.10102.325102.179688
2023-09-14103.60106.87103.60106.0713234105.95369107.15106.550106.684328
2023-09-14103.60106.87103.60106.0713234105.95369107.15106.550106.684328
2023-09-15105.76106.10105.20105.203205104.10318105.85104.975105.164054
2023-09-15105.76106.10105.20105.203205104.10318105.85104.975105.164054
2023-09-180.000.000.000.0005195.4510597.9596.70097.132692
2023-09-180.000.000.000.0005195.4510597.9596.70097.132692
2023-09-1997.5797.5797.5797.57125196.40597.8097.10096.427344
2023-09-1997.5797.5797.5797.57125196.40597.8097.10096.427344
2023-09-200.000.000.000.00037092.3044094.7593.52593.630864
2023-09-200.000.000.000.00037092.3044094.7593.52593.630864
2023-09-2188.8888.8888.8888.8829087.0015788.4087.70087.889879
2023-09-2188.8888.8888.8888.8829087.0015788.4087.70087.889879
2023-09-2285.8585.8585.8585.8517977.0510078.9578.00078.111453
2023-09-2285.8585.8585.8585.8517977.0510078.9578.00078.111453
2023-09-2577.7077.7076.8876.88220378.5512379.8079.17579.021626
2023-09-2577.7077.7076.8876.88220378.5512379.8079.17579.021626
2023-09-260.000.000.000.00034676.4541477.8077.12577.185395
2023-09-260.000.000.000.00034676.4541477.8077.12577.185395
2023-09-2777.0377.0371.0374.851610473.55275.6074.57573.588679
2023-09-2777.0377.0371.0374.851610473.55275.6074.57573.588679
2023-09-2874.8878.4374.0978.004910478.3016678.8578.57578.638148
2023-09-2874.8878.4374.0978.004910478.3016678.8578.57578.638148
2023-09-290.000.000.000.00022681.3022882.3581.82581.827313
2023-09-290.000.000.000.00022681.3022882.3581.82581.827313
2023-10-0278.9078.9078.9078.90130182.4535883.6083.02583.074734
2023-10-0278.9078.9078.9078.90130182.4535883.6083.02583.074734
2023-10-0381.4681.4681.4681.46219478.2017179.5078.85078.809041
2023-10-0381.4681.4681.4681.46219478.2017179.5078.85078.809041
2023-10-0483.7083.8583.5583.8545991.255492.7592.00091.966814
2023-10-0483.7083.8583.5583.8545991.255492.7592.00091.966814
2023-10-050.000.000.000.00025490.3529691.3090.82590.861273
2023-10-050.000.000.000.00025490.3529691.3090.82590.861273
2023-10-060.000.000.000.00020490.6525991.6591.15091.209395
2023-10-060.000.000.000.00020490.6525991.6591.15091.209395
2023-10-0989.0090.8589.0090.853119689.9016490.5090.20090.173333
2023-10-0989.0090.8589.0090.853119689.9016490.5090.20090.173333
2023-10-1095.0097.8595.0097.8522892.908593.9593.42593.689823
2023-10-1095.0097.8595.0097.8522892.908593.9593.42593.689823
2023-10-1192.8092.8092.2992.2925892.6522793.5093.07593.327018
2023-10-1192.8092.8092.2992.2925892.6522793.5093.07593.327018
2023-10-1290.0090.0090.0090.00517588.509589.1088.80088.711111
2023-10-1290.0090.0090.0090.00517588.509589.1088.80088.711111
2023-10-130.000.000.000.00030681.7030582.7082.20082.199182
2023-10-130.000.000.000.00030681.7030582.7082.20082.199182
2023-10-1682.6582.6582.6582.65117483.804684.3584.07583.915000
2023-10-1682.6582.6582.6582.65117483.804684.3584.07583.915000
2023-10-1780.0084.4080.0084.401116284.2515085.4084.82584.802885
2023-10-1780.0084.4080.0084.401116284.2515085.4084.82584.802885
2023-10-1881.3081.3074.1374.13109373.155374.3073.72573.567466
2023-10-1881.3081.3074.1374.13109373.155374.3073.72573.567466
2023-10-1961.9061.9052.6752.8510118254.4020255.0554.72554.741927
2023-10-1961.9061.9052.6752.8510118254.4020255.0554.72554.741927
2023-10-2050.4852.1248.0250.471708147.905748.6548.27548.209783
2023-10-2050.4852.1248.0250.471708147.905748.6548.27548.209783
2023-10-2343.5549.7042.9048.331225347.5019548.5048.00047.935268
2023-10-2343.5549.7042.9048.331225347.5019548.5048.00047.935268
2023-10-2453.2553.2551.7051.70419151.1025851.6551.37551.416036
2023-10-2453.2553.2551.7051.70419151.1025851.6551.37551.416036
2023-10-250.000.000.000.00026447.9520748.5048.22548.191720
2023-10-250.000.000.000.00026447.9520748.5048.22548.191720
2023-10-2647.1047.6643.5043.502516842.9010243.5543.22543.145556
2023-10-2647.1047.6643.5043.502516842.9010243.5543.22543.145556
2023-10-2745.8846.5743.5043.5010128444.2018244.7544.47544.414807
2023-10-2745.8846.5743.5043.5010128444.2018244.7544.47544.414807
2023-10-3040.0040.0036.0536.055823036.704137.1536.92536.768081
2023-10-3040.0040.0036.0536.055823036.704137.1536.92536.768081
2023-10-3135.1539.9035.1539.582322738.6518639.2038.92538.897700
2023-10-3135.1539.9035.1539.582322738.6518639.2038.92538.897700
2023-11-0140.6542.1539.0042.156519041.8013142.3542.07542.024455
2023-11-0140.6542.1539.0042.156519041.8013142.3542.07542.024455
2023-11-0250.7051.7050.0051.702126351.3522552.0051.67551.649693
2023-11-0250.7051.7050.0051.702126351.3522552.0051.67551.649693
2023-11-0353.9557.4551.8051.801532052.2030153.9553.07553.048229
2023-11-0353.9557.4551.8051.801532052.2030153.9553.07553.048229
2023-11-0656.6056.6049.0050.072723551.459652.1051.77551.638520
2023-11-0656.6056.6049.0050.072723551.459652.1051.77551.638520
2023-11-0752.9552.9550.3050.602210354.007754.4054.20054.171111
2023-11-0752.9552.9550.3050.602210354.007754.4054.20054.171111
2023-11-0851.0052.7551.0052.7510119953.6529754.1553.90053.949395
2023-11-0851.0052.7551.0052.7510119953.6529754.1553.90053.949395
2023-11-0950.5050.5042.7542.759923043.903744.3544.12543.962360
2023-11-0950.5050.5042.7542.759923043.903744.3544.12543.962360
2023-11-1043.6047.4243.6047.42344147.0515247.9547.50047.280691
2023-11-1043.6047.4243.6047.42344147.0515247.9547.50047.280691
2023-11-1347.4055.3347.4055.05238254.9012455.3055.10055.140777
2023-11-1347.4055.3347.4055.05238254.9012455.3055.10055.140777
2023-11-1460.7564.4060.7564.4045266.4014066.8566.62566.728125
2023-11-1460.7564.4060.7564.4045266.4014066.8566.62566.728125
2023-11-1566.0575.0066.0572.8068171.202371.7071.45071.310577
2023-11-1566.0575.0066.0572.8068171.202371.7071.45071.310577
2023-11-160.000.000.000.0008762.559863.4563.00063.026757
2023-11-160.000.000.000.0008762.559863.4563.00063.026757
2023-11-1763.6165.0563.2563.252921762.4522864.8063.62563.654045
2023-11-1763.6165.0563.2563.252921762.4522864.8063.62563.654045
2023-11-2062.2463.3262.2463.321515264.1015764.6564.37564.379450
2023-11-2062.2463.3262.2463.321515264.1015764.6564.37564.379450
2023-11-2169.7569.7569.7569.751020769.0021769.6069.30069.307075
2023-11-2169.7569.7569.7569.751020769.0021769.6069.30069.307075
2023-11-2262.1562.1561.5561.602718062.7019363.1062.90062.906971
2023-11-2262.1562.1561.5561.602718062.7019363.1062.90062.906971
2023-11-2464.4564.4564.4564.45118163.6520864.1063.87563.890617
2023-11-2464.4564.4564.4564.45118163.6520864.1063.87563.890617
2023-11-270.000.000.000.00025063.8526564.5064.17564.184466
2023-11-270.000.000.000.00025063.8526564.5064.17564.184466
2023-11-2870.0573.7569.4573.24715073.205374.2573.72573.740291
2023-11-2870.0573.7569.4573.24715073.205374.2573.72573.740291
2023-11-2975.7575.7572.9472.94589570.7513771.7071.22571.310991
2023-11-2975.7575.7572.9472.94589570.7513771.7071.22571.310991
2023-11-3070.6570.6566.7366.8564566.703667.8067.25067.188889
2023-11-3070.6570.6566.7366.8564566.703667.8067.25067.188889
2023-12-0165.9465.9464.9164.913914665.5512766.3565.95065.922161
2023-12-0165.9465.9464.9164.913914665.5512766.3565.95065.922161
2023-12-040.000.000.000.0009062.6514963.3062.97563.055230
2023-12-040.000.000.000.0009062.6514963.3062.97563.055230
2023-12-0569.0569.0569.0569.0552265.401466.0065.70065.633333
2023-12-0569.0569.0569.0569.0552265.401466.0065.70065.633333
2023-12-0670.9272.8070.9272.801317965.7024966.5566.12566.194509
2023-12-0670.9272.8070.9272.801317965.7024966.5566.12566.194509
2023-12-0767.1767.1767.1767.1713768.653669.4569.05069.044521
2023-12-0767.1767.1767.1767.1713768.653669.4569.05069.044521
2023-12-0869.8969.8969.8969.8967369.301670.3569.82569.488764
2023-12-0869.8969.8969.8969.8967369.301670.3569.82569.488764
2023-12-1166.3266.3266.3266.3213565.808566.2566.02566.118750
2023-12-1166.3266.3266.3266.3213565.808566.2566.02566.118750
2023-12-1262.2962.8661.5862.8677163.1510963.6063.37563.422500
2023-12-1262.2962.8661.5862.8677163.1510963.6063.37563.422500
2023-12-1356.9558.0056.9558.001516264.702065.8065.25064.820879
2023-12-1356.9558.0056.9558.001516264.702065.8065.25064.820879
2023-12-1470.8577.5370.8576.17121676.051976.5576.30076.321429
2023-12-1470.8577.5370.8576.17121676.051976.5576.30076.321429
2023-12-1576.8877.3076.8877.04133077.752678.8078.27578.237500
2023-12-1576.8877.3076.8877.04133077.752678.8078.27578.237500
2023-12-1878.4082.0378.4082.0342576.652977.2576.95076.972222
2023-12-1878.4082.0378.4082.0342576.652977.2576.95076.972222
2023-12-1981.0581.0581.0581.0512181.452982.0081.72581.769000
2023-12-1981.0581.0581.0581.0512181.452982.0081.72581.769000
2023-12-2080.9080.9080.9080.9013772.051672.7572.40072.261321
2023-12-2080.9080.9080.9080.9013772.051672.7572.40072.261321
2023-12-210.000.000.000.0002578.703079.6079.15079.190909
2023-12-210.000.000.000.0002578.703079.6079.15079.190909
2023-12-2282.2182.2177.1677.301753177.004077.4577.22577.253521
2023-12-2282.2182.2177.1677.301753177.004077.4577.22577.253521
2023-12-2680.9880.9880.9880.9843280.552781.1580.85080.824576
2023-12-2680.9880.9880.9880.9843280.552781.1580.85080.824576
2023-12-2785.8685.9085.2085.20193885.001785.7585.37585.231818
2023-12-2785.8685.9085.2085.20193885.001785.7585.37585.231818
2023-12-2882.9082.9082.9082.9015876.501177.7077.10076.691304
2023-12-2882.9082.9082.9082.9015876.501177.7077.10076.691304
2023-12-2976.6077.4073.0074.80223072.40573.2572.82572.521429
2023-12-2976.6077.4073.0074.80223072.40573.2572.82572.521429
\n", - "
" - ], - "text/plain": [ - " Open High Low Close Volume Bid_size CloseBid \\\n", - "Datetime \n", - "2023-01-03 13.50 13.50 13.00 13.00 2 223 13.55 \n", - "2023-01-03 13.50 13.50 13.00 13.00 2 223 13.55 \n", - "2023-01-04 14.00 15.50 14.00 15.20 8 76 15.35 \n", - "2023-01-04 14.00 15.50 14.00 15.20 8 76 15.35 \n", - "2023-01-05 13.30 13.30 13.30 13.30 2 226 13.30 \n", - "2023-01-05 13.30 13.30 13.30 13.30 2 226 13.30 \n", - "2023-01-06 11.47 11.47 11.47 11.47 1 100 14.85 \n", - "2023-01-06 11.47 11.47 11.47 11.47 1 100 14.85 \n", - "2023-01-09 16.75 18.38 16.75 18.38 3 202 17.30 \n", - "2023-01-09 16.75 18.38 16.75 18.38 3 202 17.30 \n", - "2023-01-10 0.00 0.00 0.00 0.00 0 187 16.70 \n", - "2023-01-10 0.00 0.00 0.00 0.00 0 187 16.70 \n", - "2023-01-11 18.50 18.50 18.10 18.10 4 120 18.30 \n", - "2023-01-11 18.50 18.50 18.10 18.10 4 120 18.30 \n", - "2023-01-12 17.82 17.82 17.82 17.82 1 123 17.95 \n", - "2023-01-12 17.82 17.82 17.82 17.82 1 123 17.95 \n", - "2023-01-13 16.65 16.66 16.65 16.66 2 135 17.05 \n", - "2023-01-13 16.65 16.66 16.65 16.66 2 135 17.05 \n", - "2023-01-17 20.54 21.45 19.60 21.45 23 275 21.00 \n", - "2023-01-17 20.54 21.45 19.60 21.45 23 275 21.00 \n", - "2023-01-18 23.50 23.50 19.40 20.00 54 84 19.60 \n", - "2023-01-18 23.50 23.50 19.40 20.00 54 84 19.60 \n", - "2023-01-19 19.60 19.60 19.25 19.25 25 66 18.80 \n", - "2023-01-19 19.60 19.60 19.25 19.25 25 66 18.80 \n", - "2023-01-20 20.17 21.01 20.17 20.98 4 392 20.90 \n", - "2023-01-20 20.17 21.01 20.17 20.98 4 392 20.90 \n", - "2023-01-23 23.75 26.15 23.75 26.15 129 257 25.70 \n", - "2023-01-23 23.75 26.15 23.75 26.15 129 257 25.70 \n", - "2023-01-24 24.85 25.75 24.85 25.45 5 469 25.20 \n", - "2023-01-24 24.85 25.75 24.85 25.45 5 469 25.20 \n", - "2023-01-25 23.22 25.97 23.22 25.83 202 269 24.60 \n", - "2023-01-25 23.22 25.97 23.22 25.83 202 269 24.60 \n", - "2023-01-26 31.88 33.63 30.30 31.33 85 64 32.05 \n", - "2023-01-26 31.88 33.63 30.30 31.33 85 64 32.05 \n", - "2023-01-27 34.35 47.42 34.35 47.40 167 511 45.45 \n", - "2023-01-27 34.35 47.42 34.35 47.40 167 511 45.45 \n", - "2023-01-30 45.50 45.50 38.83 39.03 139 41 37.50 \n", - "2023-01-30 45.50 45.50 38.83 39.03 139 41 37.50 \n", - "2023-01-31 39.41 42.50 39.00 42.50 23 17 41.30 \n", - "2023-01-31 39.41 42.50 39.00 42.50 23 17 41.30 \n", - "2023-02-01 43.00 48.00 40.62 46.96 54 1 46.55 \n", - "2023-02-01 43.00 48.00 40.62 46.96 54 1 46.55 \n", - "2023-02-02 51.76 56.33 51.76 52.83 42 1 51.25 \n", - "2023-02-02 51.76 56.33 51.76 52.83 42 1 51.25 \n", - "2023-02-03 61.24 61.24 55.30 55.30 27 10 53.70 \n", - "2023-02-03 61.24 61.24 55.30 55.30 27 10 53.70 \n", - "2023-02-06 59.10 59.50 58.70 58.70 7 47 58.05 \n", - "2023-02-06 59.10 59.50 58.70 58.70 7 47 58.05 \n", - "2023-02-07 57.33 59.10 56.00 56.00 6 56 59.00 \n", - "2023-02-07 57.33 59.10 56.00 56.00 6 56 59.00 \n", - "2023-02-08 63.23 64.80 62.75 63.10 33 46 62.80 \n", - "2023-02-08 63.23 64.80 62.75 63.10 33 46 62.80 \n", - "2023-02-09 68.00 72.96 67.98 67.98 10 13 68.10 \n", - "2023-02-09 68.00 72.96 67.98 67.98 10 13 68.10 \n", - "2023-02-10 65.20 65.20 60.10 60.10 14 27 59.65 \n", - "2023-02-10 65.20 65.20 60.10 60.10 14 27 59.65 \n", - "2023-02-13 58.00 58.00 57.60 57.60 4 95 57.25 \n", - "2023-02-13 58.00 58.00 57.60 57.60 4 95 57.25 \n", - "2023-02-14 54.14 68.95 54.14 68.45 14 21 68.55 \n", - "2023-02-14 54.14 68.95 54.14 68.45 14 21 68.55 \n", - "2023-02-15 71.72 72.35 71.72 72.35 16 51 72.60 \n", - "2023-02-15 71.72 72.35 71.72 72.35 16 51 72.60 \n", - "2023-02-16 71.00 71.00 67.72 67.72 4 5 60.45 \n", - "2023-02-16 71.00 71.00 67.72 67.72 4 5 60.45 \n", - "2023-02-17 65.00 65.00 63.00 63.80 20 48 68.10 \n", - "2023-02-17 65.00 65.00 63.00 63.80 20 48 68.10 \n", - "2023-02-21 67.20 67.20 63.65 63.65 2 435 59.85 \n", - "2023-02-21 67.20 67.20 63.65 63.65 2 435 59.85 \n", - "2023-02-22 59.25 61.15 59.20 61.15 86 20 61.75 \n", - "2023-02-22 59.25 61.15 59.20 61.15 86 20 61.75 \n", - "2023-02-23 0.00 0.00 0.00 0.00 0 66 62.80 \n", - "2023-02-23 0.00 0.00 0.00 0.00 0 66 62.80 \n", - "2023-02-24 58.80 58.80 58.80 58.80 2 173 58.70 \n", - "2023-02-24 58.80 58.80 58.80 58.80 2 173 58.70 \n", - "2023-02-27 64.57 67.53 64.57 67.53 8 59 66.60 \n", - "2023-02-27 64.57 67.53 64.57 67.53 8 59 66.60 \n", - "2023-02-28 67.75 67.75 65.00 65.77 6 55 64.20 \n", - "2023-02-28 67.75 67.75 65.00 65.77 6 55 64.20 \n", - "2023-03-01 65.00 65.00 60.62 62.15 16 516 61.55 \n", - "2023-03-01 65.00 65.00 60.62 62.15 16 516 61.55 \n", - "2023-03-02 52.05 52.30 51.59 52.30 12 57 52.70 \n", - "2023-03-02 52.05 52.30 51.59 52.30 12 57 52.70 \n", - "2023-03-03 54.70 59.15 54.70 58.20 3 202 57.20 \n", - "2023-03-03 54.70 59.15 54.70 58.20 3 202 57.20 \n", - "2023-03-06 55.84 55.84 55.21 55.21 14 259 53.95 \n", - "2023-03-06 55.84 55.84 55.21 55.21 14 259 53.95 \n", - "2023-03-07 50.95 51.55 50.95 51.55 8 88 49.75 \n", - "2023-03-07 50.95 51.55 50.95 51.55 8 88 49.75 \n", - "2023-03-08 45.77 46.95 45.00 45.00 18 201 45.70 \n", - "2023-03-08 45.77 46.95 45.00 45.00 18 201 45.70 \n", - "2023-03-09 46.65 47.60 39.93 40.17 119 76 39.85 \n", - "2023-03-09 46.65 47.60 39.93 40.17 119 76 39.85 \n", - "2023-03-10 41.52 42.30 40.75 40.75 10 104 40.40 \n", - "2023-03-10 41.52 42.30 40.75 40.75 10 104 40.40 \n", - "2023-03-13 37.00 42.11 35.50 41.40 67 104 40.55 \n", - "2023-03-13 37.00 42.11 35.50 41.40 67 104 40.55 \n", - "2023-03-14 44.90 46.20 44.00 46.10 48 4 46.25 \n", - "2023-03-14 44.90 46.20 44.00 46.10 48 4 46.25 \n", - "2023-03-15 44.50 45.53 42.54 43.90 19 80 44.20 \n", - "2023-03-15 44.50 45.53 42.54 43.90 19 80 44.20 \n", - "2023-03-16 44.05 46.98 44.05 46.75 16 125 46.40 \n", - "2023-03-16 44.05 46.98 44.05 46.75 16 125 46.40 \n", - "2023-03-17 46.70 46.70 43.63 44.20 100 141 43.95 \n", - "2023-03-17 46.70 46.70 43.63 44.20 100 141 43.95 \n", - "2023-03-20 42.11 47.90 42.11 45.40 20 174 45.50 \n", - "2023-03-20 42.11 47.90 42.11 45.40 20 174 45.50 \n", - "2023-03-21 51.25 56.69 51.10 56.28 45 741 54.95 \n", - "2023-03-21 51.25 56.69 51.10 56.28 45 741 54.95 \n", - "2023-03-22 56.80 56.80 53.00 53.00 3 69 51.30 \n", - "2023-03-22 56.80 56.80 53.00 53.00 3 69 51.30 \n", - "2023-03-23 56.00 56.00 52.30 52.30 10 76 52.40 \n", - "2023-03-23 56.00 56.00 52.30 52.30 10 76 52.40 \n", - "2023-03-24 51.24 51.25 50.40 50.40 4 76 51.20 \n", - "2023-03-24 51.24 51.25 50.40 50.40 4 76 51.20 \n", - "2023-03-27 54.05 54.05 52.23 52.23 23 55 52.00 \n", - "2023-03-27 54.05 54.05 52.23 52.23 23 55 52.00 \n", - "2023-03-28 50.15 50.15 49.03 49.03 7 134 50.10 \n", - "2023-03-28 50.15 50.15 49.03 49.03 7 134 50.10 \n", - "2023-03-29 52.43 52.85 52.43 52.85 2 151 52.80 \n", - "2023-03-29 52.43 52.85 52.43 52.85 2 151 52.80 \n", - "2023-03-30 55.00 55.05 54.10 54.10 4 133 53.60 \n", - "2023-03-30 55.00 55.05 54.10 54.10 4 133 53.60 \n", - "2023-03-31 56.78 62.54 56.78 62.17 19 231 62.15 \n", - "2023-03-31 56.78 62.54 56.78 62.17 19 231 62.15 \n", - "2023-04-03 57.00 57.00 51.90 51.90 11 438 52.60 \n", - "2023-04-03 57.00 57.00 51.90 51.90 11 438 52.60 \n", - "2023-04-04 51.70 51.70 50.85 50.85 2 375 51.05 \n", - "2023-04-04 51.70 51.70 50.85 50.85 2 375 51.05 \n", - "2023-04-05 49.40 49.40 45.75 47.50 17 258 46.15 \n", - "2023-04-05 49.40 49.40 45.75 47.50 17 258 46.15 \n", - "2023-04-06 44.25 46.55 43.00 46.00 26 165 45.55 \n", - "2023-04-06 44.25 46.55 43.00 46.00 26 165 45.55 \n", - "2023-04-10 43.35 45.70 41.00 45.35 42 81 45.10 \n", - "2023-04-10 43.35 45.70 41.00 45.35 42 81 45.10 \n", - "2023-04-11 47.50 48.85 46.65 47.80 10 265 46.75 \n", - "2023-04-11 47.50 48.85 46.65 47.80 10 265 46.75 \n", - "2023-04-12 43.51 43.51 43.11 43.11 7 57 42.45 \n", - "2023-04-12 43.51 43.51 43.11 43.11 7 57 42.45 \n", - "2023-04-13 45.45 46.09 45.45 46.09 4 180 45.55 \n", - "2023-04-13 45.45 46.09 45.45 46.09 4 180 45.55 \n", - "2023-04-14 45.10 45.10 43.53 44.61 25 337 44.45 \n", - "2023-04-14 45.10 45.10 43.53 44.61 25 337 44.45 \n", - "2023-04-17 47.50 47.50 43.50 44.70 33 190 45.10 \n", - "2023-04-17 47.50 47.50 43.50 44.70 33 190 45.10 \n", - "2023-04-18 44.88 45.60 43.30 43.30 22 113 42.85 \n", - "2023-04-18 44.88 45.60 43.30 43.30 22 113 42.85 \n", - "2023-04-19 40.75 41.50 40.00 40.50 24 223 39.45 \n", - "2023-04-19 40.75 41.50 40.00 40.50 24 223 39.45 \n", - "2023-04-20 30.80 31.86 28.15 28.88 68 298 28.55 \n", - "2023-04-20 30.80 31.86 28.15 28.88 68 298 28.55 \n", - "2023-04-21 30.00 30.00 28.28 29.37 25 143 29.00 \n", - "2023-04-21 30.00 30.00 28.28 29.37 25 143 29.00 \n", - "2023-04-24 28.00 28.00 26.05 26.70 151 210 27.15 \n", - "2023-04-24 28.00 28.00 26.05 26.70 151 210 27.15 \n", - "2023-04-25 26.75 27.79 26.75 27.57 93 160 26.30 \n", - "2023-04-25 26.75 27.79 26.75 27.57 93 160 26.30 \n", - "2023-04-26 26.00 26.00 23.20 24.10 180 1 20.65 \n", - "2023-04-26 26.00 26.00 23.20 24.10 180 1 20.65 \n", - "2023-04-27 23.65 25.70 23.65 25.70 11 242 26.10 \n", - "2023-04-27 23.65 25.70 23.65 25.70 11 242 26.10 \n", - "2023-04-28 26.40 28.40 25.35 28.37 13 308 27.85 \n", - "2023-04-28 26.40 28.40 25.35 28.37 13 308 27.85 \n", - "2023-05-01 27.45 27.45 25.90 26.45 1700 203 26.45 \n", - "2023-05-01 27.45 27.45 25.90 26.45 1700 203 26.45 \n", - "2023-05-02 28.35 28.35 26.60 26.60 45 172 25.90 \n", - "2023-05-02 28.35 28.35 26.60 26.60 45 172 25.90 \n", - "2023-05-03 27.99 27.99 26.47 26.47 7 7 26.00 \n", - "2023-05-03 27.99 27.99 26.47 26.47 7 7 26.00 \n", - "2023-05-04 26.55 26.80 26.55 26.80 3 130 26.45 \n", - "2023-05-04 26.55 26.80 26.55 26.80 3 130 26.45 \n", - "2023-05-05 28.65 31.76 28.65 31.20 77 76 31.25 \n", - "2023-05-05 28.65 31.76 28.65 31.20 77 76 31.25 \n", - "2023-05-08 32.86 32.86 32.82 32.82 2 216 32.35 \n", - "2023-05-08 32.86 32.86 32.82 32.82 2 216 32.35 \n", - "2023-05-09 31.35 31.35 30.08 30.10 20 238 30.70 \n", - "2023-05-09 31.35 31.35 30.08 30.10 20 238 30.70 \n", - "2023-05-10 33.36 33.80 30.60 30.62 27 221 30.20 \n", - "2023-05-10 33.36 33.80 30.60 30.62 27 221 30.20 \n", - "2023-05-11 29.70 31.30 29.70 30.82 18 281 31.95 \n", - "2023-05-11 29.70 31.30 29.70 30.82 18 281 31.95 \n", - "2023-05-12 35.00 35.97 30.16 30.90 174 103 30.00 \n", - "2023-05-12 35.00 35.97 30.16 30.90 174 103 30.00 \n", - "2023-05-15 31.21 31.21 28.95 28.95 27 436 28.80 \n", - "2023-05-15 31.21 31.21 28.95 28.95 27 436 28.80 \n", - "2023-05-16 29.00 30.85 27.97 30.85 24 147 28.85 \n", - "2023-05-16 29.00 30.85 27.97 30.85 24 147 28.85 \n", - "2023-05-17 32.20 33.25 32.20 33.16 76 50 32.65 \n", - "2023-05-17 32.20 33.25 32.20 33.16 76 50 32.65 \n", - "2023-05-18 31.95 33.70 31.95 33.70 8 34 33.70 \n", - "2023-05-18 31.95 33.70 31.95 33.70 8 34 33.70 \n", - "2023-05-19 35.00 37.90 34.72 36.50 162 181 36.40 \n", - "2023-05-19 35.00 37.90 34.72 36.50 162 181 36.40 \n", - "2023-05-22 38.00 42.70 38.00 42.70 48 88 42.70 \n", - "2023-05-22 38.00 42.70 38.00 42.70 48 88 42.70 \n", - "2023-05-23 41.12 45.85 41.12 42.75 39 164 40.70 \n", - "2023-05-23 41.12 45.85 41.12 42.75 39 164 40.70 \n", - "2023-05-24 38.00 39.80 37.65 39.80 18 125 38.90 \n", - "2023-05-24 38.00 39.80 37.65 39.80 18 125 38.90 \n", - "2023-05-25 39.10 40.65 38.25 40.65 19 104 39.70 \n", - "2023-05-25 39.10 40.65 38.25 40.65 19 104 39.70 \n", - "2023-05-26 41.60 48.10 41.60 46.35 42 21 45.80 \n", - "2023-05-26 41.60 48.10 41.60 46.35 42 21 45.80 \n", - "2023-05-30 54.65 54.65 49.55 49.55 15 252 51.40 \n", - "2023-05-30 54.65 54.65 49.55 49.55 15 252 51.40 \n", - "2023-05-31 53.05 53.05 48.30 51.00 23 168 53.30 \n", - "2023-05-31 53.05 53.05 48.30 51.00 23 168 53.30 \n", - "2023-06-01 52.60 57.80 52.60 57.80 41 289 55.75 \n", - "2023-06-01 52.60 57.80 52.60 57.80 41 289 55.75 \n", - "2023-06-02 61.05 63.50 61.00 61.45 22 178 60.80 \n", - "2023-06-02 61.05 63.50 61.00 61.45 22 178 60.80 \n", - "2023-06-05 65.85 66.35 64.34 64.34 123 97 63.65 \n", - "2023-06-05 65.85 66.35 64.34 64.34 123 97 63.65 \n", - "2023-06-06 65.00 65.65 64.95 64.95 113 133 66.30 \n", - "2023-06-06 65.00 65.65 64.95 64.95 113 133 66.30 \n", - "2023-06-07 71.90 72.65 68.77 69.75 21 303 67.80 \n", - "2023-06-07 71.90 72.65 68.77 69.75 21 303 67.80 \n", - "2023-06-08 70.20 76.25 70.20 75.99 27 142 77.25 \n", - "2023-06-08 70.20 76.25 70.20 75.99 27 142 77.25 \n", - "2023-06-09 89.70 92.35 85.71 86.06 22 157 85.00 \n", - "2023-06-12 87.90 89.10 86.80 88.00 47 265 89.20 \n", - "2023-06-12 87.90 89.10 86.80 88.00 47 265 89.20 \n", - "2023-06-13 93.90 97.72 93.44 97.72 52 259 97.05 \n", - "2023-06-13 93.90 97.72 93.44 97.72 52 259 97.05 \n", - "2023-06-14 96.60 96.60 92.60 92.60 11 179 95.75 \n", - "2023-06-14 96.60 96.60 92.60 92.60 11 179 95.75 \n", - "2023-06-15 95.69 95.69 95.69 95.69 3 107 95.25 \n", - "2023-06-15 95.69 95.69 95.69 95.69 3 107 95.25 \n", - "2023-06-16 99.80 101.52 97.70 98.50 13 75 99.50 \n", - "2023-06-16 99.80 101.52 97.70 98.50 13 75 99.50 \n", - "2023-06-20 105.00 112.60 105.00 112.60 27 137 112.00 \n", - "2023-06-20 105.00 112.60 105.00 112.60 27 137 112.00 \n", - "2023-06-21 106.60 106.60 98.10 98.10 1665 158 98.15 \n", - "2023-06-21 106.60 106.60 98.10 98.10 1665 158 98.15 \n", - "2023-06-22 95.00 95.00 95.00 95.00 1 175 102.55 \n", - "2023-06-22 95.00 95.00 95.00 95.00 1 175 102.55 \n", - "2023-06-23 92.85 95.79 92.85 95.71 5 156 94.95 \n", - "2023-06-23 92.85 95.79 92.85 95.71 5 156 94.95 \n", - "2023-06-26 94.75 94.75 87.00 87.00 6 201 81.20 \n", - "2023-06-26 94.75 94.75 87.00 87.00 6 201 81.20 \n", - "2023-06-27 86.27 88.25 82.60 88.25 16 137 88.35 \n", - "2023-06-27 86.27 88.25 82.60 88.25 16 137 88.35 \n", - "2023-06-28 92.85 93.65 92.85 93.10 32 216 93.55 \n", - "2023-06-28 92.85 93.65 92.85 93.10 32 216 93.55 \n", - "2023-06-29 0.00 0.00 0.00 0.00 0 132 94.90 \n", - "2023-06-29 0.00 0.00 0.00 0.00 0 132 94.90 \n", - "2023-06-30 99.60 99.60 99.60 99.60 1 80 98.45 \n", - "2023-06-30 99.60 99.60 99.60 99.60 1 80 98.45 \n", - "2023-07-03 118.05 118.05 114.15 114.25 26 76 114.80 \n", - "2023-07-03 118.05 118.05 114.15 114.25 26 76 114.80 \n", - "2023-07-05 114.27 115.25 114.25 115.25 5 143 117.05 \n", - "2023-07-05 114.27 115.25 114.25 115.25 5 143 117.05 \n", - "2023-07-06 112.50 112.50 112.50 112.50 1 154 111.70 \n", - "2023-07-06 112.50 112.50 112.50 112.50 1 154 111.70 \n", - "2023-07-07 112.41 112.41 112.41 112.41 1 132 109.25 \n", - "2023-07-07 112.41 112.41 112.41 112.41 1 132 109.25 \n", - "2023-07-10 107.98 107.98 104.43 104.43 9 228 104.20 \n", - "2023-07-10 107.98 107.98 104.43 104.43 9 228 104.20 \n", - "2023-07-11 0.00 0.00 0.00 0.00 0 175 104.35 \n", - "2023-07-11 0.00 0.00 0.00 0.00 0 175 104.35 \n", - "2023-07-12 110.87 110.87 107.54 107.54 8 112 106.20 \n", - "2023-07-12 110.87 110.87 107.54 107.54 8 112 106.20 \n", - "2023-07-13 0.00 0.00 0.00 0.00 0 111 111.50 \n", - "2023-07-13 0.00 0.00 0.00 0.00 0 111 111.50 \n", - "2023-07-14 111.00 114.42 111.00 114.42 4 46 114.60 \n", - "2023-07-14 111.00 114.42 111.00 114.42 4 46 114.60 \n", - "2023-07-17 118.20 118.20 118.20 118.20 3 50 123.25 \n", - "2023-07-17 118.20 118.20 118.20 118.20 3 50 123.25 \n", - "2023-07-18 121.25 126.28 121.25 126.28 4 1 124.75 \n", - "2023-07-18 121.25 126.28 121.25 126.28 4 1 124.75 \n", - "2023-07-19 0.00 0.00 0.00 0.00 0 7 123.35 \n", - "2023-07-19 0.00 0.00 0.00 0.00 0 7 123.35 \n", - "2023-07-20 106.07 106.07 97.95 97.95 16 22 97.40 \n", - "2023-07-20 106.07 106.07 97.95 97.95 16 22 97.40 \n", - "2023-07-21 95.00 96.97 95.00 96.97 2 52 94.60 \n", - "2023-07-21 95.00 96.97 95.00 96.97 2 52 94.60 \n", - "2023-07-24 91.98 102.75 91.20 102.75 5 161 102.50 \n", - "2023-07-24 91.98 102.75 91.20 102.75 5 161 102.50 \n", - "2023-07-25 104.75 104.75 104.75 104.75 8 110 98.60 \n", - "2023-07-25 104.75 104.75 104.75 104.75 8 110 98.60 \n", - "2023-07-26 0.00 0.00 0.00 0.00 0 174 97.05 \n", - "2023-07-26 0.00 0.00 0.00 0.00 0 174 97.05 \n", - "2023-07-27 90.90 90.90 90.90 90.90 1 200 89.95 \n", - "2023-07-27 90.90 90.90 90.90 90.90 1 200 89.95 \n", - "2023-07-28 99.63 99.63 99.63 99.63 1 419 98.20 \n", - "2023-07-28 99.63 99.63 99.63 99.63 1 419 98.20 \n", - "2023-07-31 100.00 101.05 99.70 101.05 3 364 99.30 \n", - "2023-07-31 100.00 101.05 99.70 101.05 3 364 99.30 \n", - "2023-08-01 0.00 0.00 0.00 0.00 0 400 94.25 \n", - "2023-08-01 0.00 0.00 0.00 0.00 0 400 94.25 \n", - "2023-08-02 89.84 89.84 89.62 89.62 2 579 88.05 \n", - "2023-08-02 89.84 89.84 89.62 89.62 2 579 88.05 \n", - "2023-08-03 0.00 0.00 0.00 0.00 0 114 92.70 \n", - "2023-08-03 0.00 0.00 0.00 0.00 0 114 92.70 \n", - "2023-08-04 90.06 90.06 90.04 90.04 2 276 87.20 \n", - "2023-08-04 90.06 90.06 90.04 90.04 2 276 87.20 \n", - "2023-08-07 81.85 81.90 81.31 81.31 7 359 84.70 \n", - "2023-08-07 81.85 81.90 81.31 81.31 7 359 84.70 \n", - "2023-08-08 83.77 83.77 83.77 83.77 1 116 84.15 \n", - "2023-08-08 83.77 83.77 83.77 83.77 1 116 84.15 \n", - "2023-08-09 82.50 82.50 79.62 80.29 38 281 77.35 \n", - "2023-08-09 82.50 82.50 79.62 80.29 38 281 77.35 \n", - "2023-08-10 81.13 83.26 80.30 80.33 8 200 80.20 \n", - "2023-08-10 81.13 83.26 80.30 80.33 8 200 80.20 \n", - "2023-08-11 0.00 0.00 0.00 0.00 0 358 77.50 \n", - "2023-08-11 0.00 0.00 0.00 0.00 0 358 77.50 \n", - "2023-08-14 72.95 74.04 72.95 73.95 4 492 74.20 \n", - "2023-08-14 72.95 74.04 72.95 73.95 4 492 74.20 \n", - "2023-08-15 0.00 0.00 0.00 0.00 0 289 68.85 \n", - "2023-08-15 0.00 0.00 0.00 0.00 0 289 68.85 \n", - "2023-08-16 66.15 66.15 65.20 65.20 5 161 63.25 \n", - "2023-08-16 66.15 66.15 65.20 65.20 5 161 63.25 \n", - "2023-08-17 61.17 62.00 58.35 58.35 11 277 57.65 \n", - "2023-08-17 61.17 62.00 58.35 58.35 11 277 57.65 \n", - "2023-08-18 55.00 55.00 55.00 55.00 1 117 54.85 \n", - "2023-08-18 55.00 55.00 55.00 55.00 1 117 54.85 \n", - "2023-08-21 62.90 67.87 62.90 67.87 28 410 68.00 \n", - "2023-08-21 62.90 67.87 62.90 67.87 28 410 68.00 \n", - "2023-08-22 76.00 76.00 72.10 72.10 5 388 69.95 \n", - "2023-08-22 76.00 76.00 72.10 72.10 5 388 69.95 \n", - "2023-08-23 73.55 73.55 73.50 73.50 40 356 72.55 \n", - "2023-08-23 73.55 73.55 73.50 73.50 40 356 72.55 \n", - "2023-08-24 70.41 70.57 67.40 67.40 31 301 67.15 \n", - "2023-08-24 70.41 70.57 67.40 67.40 31 301 67.15 \n", - "2023-08-25 71.21 72.14 68.70 72.10 234 152 74.05 \n", - "2023-08-25 71.21 72.14 68.70 72.10 234 152 74.05 \n", - "2023-08-28 74.15 74.15 74.15 74.15 1 139 73.85 \n", - "2023-08-28 74.15 74.15 74.15 74.15 1 139 73.85 \n", - "2023-08-29 87.60 87.60 87.60 87.60 1 269 89.35 \n", - "2023-08-29 87.60 87.60 87.60 87.60 1 269 89.35 \n", - "2023-08-30 87.34 88.11 87.26 88.07 6 249 89.65 \n", - "2023-08-30 87.34 88.11 87.26 88.07 6 249 89.65 \n", - "2023-08-31 0.00 0.00 0.00 0.00 0 376 90.40 \n", - "2023-08-31 0.00 0.00 0.00 0.00 0 376 90.40 \n", - "2023-09-01 80.20 80.20 79.18 79.18 4 252 79.05 \n", - "2023-09-01 80.20 80.20 79.18 79.18 4 252 79.05 \n", - "2023-09-05 89.25 89.25 89.25 89.25 4 467 89.05 \n", - "2023-09-05 89.25 89.25 89.25 89.25 4 467 89.05 \n", - "2023-09-06 85.62 85.67 82.35 82.35 5 369 84.95 \n", - "2023-09-06 85.62 85.67 82.35 82.35 5 369 84.95 \n", - "2023-09-07 80.00 80.30 80.00 80.30 10 406 84.45 \n", - "2023-09-07 80.00 80.30 80.00 80.30 10 406 84.45 \n", - "2023-09-08 81.94 81.94 81.94 81.94 3 430 81.50 \n", - "2023-09-08 81.94 81.94 81.94 81.94 3 430 81.50 \n", - "2023-09-11 103.57 103.57 103.57 103.57 1 260 103.45 \n", - "2023-09-11 103.57 103.57 103.57 103.57 1 260 103.45 \n", - "2023-09-12 0.00 0.00 0.00 0.00 0 440 98.40 \n", - "2023-09-12 0.00 0.00 0.00 0.00 0 440 98.40 \n", - "2023-09-13 102.65 102.65 102.65 102.65 1 399 101.55 \n", - "2023-09-13 102.65 102.65 102.65 102.65 1 399 101.55 \n", - "2023-09-14 103.60 106.87 103.60 106.07 13 234 105.95 \n", - "2023-09-14 103.60 106.87 103.60 106.07 13 234 105.95 \n", - "2023-09-15 105.76 106.10 105.20 105.20 3 205 104.10 \n", - "2023-09-15 105.76 106.10 105.20 105.20 3 205 104.10 \n", - "2023-09-18 0.00 0.00 0.00 0.00 0 51 95.45 \n", - "2023-09-18 0.00 0.00 0.00 0.00 0 51 95.45 \n", - "2023-09-19 97.57 97.57 97.57 97.57 1 251 96.40 \n", - "2023-09-19 97.57 97.57 97.57 97.57 1 251 96.40 \n", - "2023-09-20 0.00 0.00 0.00 0.00 0 370 92.30 \n", - "2023-09-20 0.00 0.00 0.00 0.00 0 370 92.30 \n", - "2023-09-21 88.88 88.88 88.88 88.88 2 90 87.00 \n", - "2023-09-21 88.88 88.88 88.88 88.88 2 90 87.00 \n", - "2023-09-22 85.85 85.85 85.85 85.85 1 79 77.05 \n", - "2023-09-22 85.85 85.85 85.85 85.85 1 79 77.05 \n", - "2023-09-25 77.70 77.70 76.88 76.88 2 203 78.55 \n", - "2023-09-25 77.70 77.70 76.88 76.88 2 203 78.55 \n", - "2023-09-26 0.00 0.00 0.00 0.00 0 346 76.45 \n", - "2023-09-26 0.00 0.00 0.00 0.00 0 346 76.45 \n", - "2023-09-27 77.03 77.03 71.03 74.85 16 104 73.55 \n", - "2023-09-27 77.03 77.03 71.03 74.85 16 104 73.55 \n", - "2023-09-28 74.88 78.43 74.09 78.00 49 104 78.30 \n", - "2023-09-28 74.88 78.43 74.09 78.00 49 104 78.30 \n", - "2023-09-29 0.00 0.00 0.00 0.00 0 226 81.30 \n", - "2023-09-29 0.00 0.00 0.00 0.00 0 226 81.30 \n", - "2023-10-02 78.90 78.90 78.90 78.90 1 301 82.45 \n", - "2023-10-02 78.90 78.90 78.90 78.90 1 301 82.45 \n", - "2023-10-03 81.46 81.46 81.46 81.46 2 194 78.20 \n", - "2023-10-03 81.46 81.46 81.46 81.46 2 194 78.20 \n", - "2023-10-04 83.70 83.85 83.55 83.85 4 59 91.25 \n", - "2023-10-04 83.70 83.85 83.55 83.85 4 59 91.25 \n", - "2023-10-05 0.00 0.00 0.00 0.00 0 254 90.35 \n", - "2023-10-05 0.00 0.00 0.00 0.00 0 254 90.35 \n", - "2023-10-06 0.00 0.00 0.00 0.00 0 204 90.65 \n", - "2023-10-06 0.00 0.00 0.00 0.00 0 204 90.65 \n", - "2023-10-09 89.00 90.85 89.00 90.85 31 196 89.90 \n", - "2023-10-09 89.00 90.85 89.00 90.85 31 196 89.90 \n", - "2023-10-10 95.00 97.85 95.00 97.85 2 28 92.90 \n", - "2023-10-10 95.00 97.85 95.00 97.85 2 28 92.90 \n", - "2023-10-11 92.80 92.80 92.29 92.29 2 58 92.65 \n", - "2023-10-11 92.80 92.80 92.29 92.29 2 58 92.65 \n", - "2023-10-12 90.00 90.00 90.00 90.00 5 175 88.50 \n", - "2023-10-12 90.00 90.00 90.00 90.00 5 175 88.50 \n", - "2023-10-13 0.00 0.00 0.00 0.00 0 306 81.70 \n", - "2023-10-13 0.00 0.00 0.00 0.00 0 306 81.70 \n", - "2023-10-16 82.65 82.65 82.65 82.65 1 174 83.80 \n", - "2023-10-16 82.65 82.65 82.65 82.65 1 174 83.80 \n", - "2023-10-17 80.00 84.40 80.00 84.40 11 162 84.25 \n", - "2023-10-17 80.00 84.40 80.00 84.40 11 162 84.25 \n", - "2023-10-18 81.30 81.30 74.13 74.13 10 93 73.15 \n", - "2023-10-18 81.30 81.30 74.13 74.13 10 93 73.15 \n", - "2023-10-19 61.90 61.90 52.67 52.85 101 182 54.40 \n", - "2023-10-19 61.90 61.90 52.67 52.85 101 182 54.40 \n", - "2023-10-20 50.48 52.12 48.02 50.47 170 81 47.90 \n", - "2023-10-20 50.48 52.12 48.02 50.47 170 81 47.90 \n", - "2023-10-23 43.55 49.70 42.90 48.33 12 253 47.50 \n", - "2023-10-23 43.55 49.70 42.90 48.33 12 253 47.50 \n", - "2023-10-24 53.25 53.25 51.70 51.70 4 191 51.10 \n", - "2023-10-24 53.25 53.25 51.70 51.70 4 191 51.10 \n", - "2023-10-25 0.00 0.00 0.00 0.00 0 264 47.95 \n", - "2023-10-25 0.00 0.00 0.00 0.00 0 264 47.95 \n", - "2023-10-26 47.10 47.66 43.50 43.50 25 168 42.90 \n", - "2023-10-26 47.10 47.66 43.50 43.50 25 168 42.90 \n", - "2023-10-27 45.88 46.57 43.50 43.50 101 284 44.20 \n", - "2023-10-27 45.88 46.57 43.50 43.50 101 284 44.20 \n", - "2023-10-30 40.00 40.00 36.05 36.05 58 230 36.70 \n", - "2023-10-30 40.00 40.00 36.05 36.05 58 230 36.70 \n", - "2023-10-31 35.15 39.90 35.15 39.58 23 227 38.65 \n", - "2023-10-31 35.15 39.90 35.15 39.58 23 227 38.65 \n", - "2023-11-01 40.65 42.15 39.00 42.15 65 190 41.80 \n", - "2023-11-01 40.65 42.15 39.00 42.15 65 190 41.80 \n", - "2023-11-02 50.70 51.70 50.00 51.70 21 263 51.35 \n", - "2023-11-02 50.70 51.70 50.00 51.70 21 263 51.35 \n", - "2023-11-03 53.95 57.45 51.80 51.80 15 320 52.20 \n", - "2023-11-03 53.95 57.45 51.80 51.80 15 320 52.20 \n", - "2023-11-06 56.60 56.60 49.00 50.07 27 235 51.45 \n", - "2023-11-06 56.60 56.60 49.00 50.07 27 235 51.45 \n", - "2023-11-07 52.95 52.95 50.30 50.60 22 103 54.00 \n", - "2023-11-07 52.95 52.95 50.30 50.60 22 103 54.00 \n", - "2023-11-08 51.00 52.75 51.00 52.75 101 199 53.65 \n", - "2023-11-08 51.00 52.75 51.00 52.75 101 199 53.65 \n", - "2023-11-09 50.50 50.50 42.75 42.75 99 230 43.90 \n", - "2023-11-09 50.50 50.50 42.75 42.75 99 230 43.90 \n", - "2023-11-10 43.60 47.42 43.60 47.42 3 441 47.05 \n", - "2023-11-10 43.60 47.42 43.60 47.42 3 441 47.05 \n", - "2023-11-13 47.40 55.33 47.40 55.05 23 82 54.90 \n", - "2023-11-13 47.40 55.33 47.40 55.05 23 82 54.90 \n", - "2023-11-14 60.75 64.40 60.75 64.40 4 52 66.40 \n", - "2023-11-14 60.75 64.40 60.75 64.40 4 52 66.40 \n", - "2023-11-15 66.05 75.00 66.05 72.80 6 81 71.20 \n", - "2023-11-15 66.05 75.00 66.05 72.80 6 81 71.20 \n", - "2023-11-16 0.00 0.00 0.00 0.00 0 87 62.55 \n", - "2023-11-16 0.00 0.00 0.00 0.00 0 87 62.55 \n", - "2023-11-17 63.61 65.05 63.25 63.25 29 217 62.45 \n", - "2023-11-17 63.61 65.05 63.25 63.25 29 217 62.45 \n", - "2023-11-20 62.24 63.32 62.24 63.32 15 152 64.10 \n", - "2023-11-20 62.24 63.32 62.24 63.32 15 152 64.10 \n", - "2023-11-21 69.75 69.75 69.75 69.75 10 207 69.00 \n", - "2023-11-21 69.75 69.75 69.75 69.75 10 207 69.00 \n", - "2023-11-22 62.15 62.15 61.55 61.60 27 180 62.70 \n", - "2023-11-22 62.15 62.15 61.55 61.60 27 180 62.70 \n", - "2023-11-24 64.45 64.45 64.45 64.45 1 181 63.65 \n", - "2023-11-24 64.45 64.45 64.45 64.45 1 181 63.65 \n", - "2023-11-27 0.00 0.00 0.00 0.00 0 250 63.85 \n", - "2023-11-27 0.00 0.00 0.00 0.00 0 250 63.85 \n", - "2023-11-28 70.05 73.75 69.45 73.24 71 50 73.20 \n", - "2023-11-28 70.05 73.75 69.45 73.24 71 50 73.20 \n", - "2023-11-29 75.75 75.75 72.94 72.94 58 95 70.75 \n", - "2023-11-29 75.75 75.75 72.94 72.94 58 95 70.75 \n", - "2023-11-30 70.65 70.65 66.73 66.85 6 45 66.70 \n", - "2023-11-30 70.65 70.65 66.73 66.85 6 45 66.70 \n", - "2023-12-01 65.94 65.94 64.91 64.91 39 146 65.55 \n", - "2023-12-01 65.94 65.94 64.91 64.91 39 146 65.55 \n", - "2023-12-04 0.00 0.00 0.00 0.00 0 90 62.65 \n", - "2023-12-04 0.00 0.00 0.00 0.00 0 90 62.65 \n", - "2023-12-05 69.05 69.05 69.05 69.05 5 22 65.40 \n", - "2023-12-05 69.05 69.05 69.05 69.05 5 22 65.40 \n", - "2023-12-06 70.92 72.80 70.92 72.80 13 179 65.70 \n", - "2023-12-06 70.92 72.80 70.92 72.80 13 179 65.70 \n", - "2023-12-07 67.17 67.17 67.17 67.17 1 37 68.65 \n", - "2023-12-07 67.17 67.17 67.17 67.17 1 37 68.65 \n", - "2023-12-08 69.89 69.89 69.89 69.89 6 73 69.30 \n", - "2023-12-08 69.89 69.89 69.89 69.89 6 73 69.30 \n", - "2023-12-11 66.32 66.32 66.32 66.32 1 35 65.80 \n", - "2023-12-11 66.32 66.32 66.32 66.32 1 35 65.80 \n", - "2023-12-12 62.29 62.86 61.58 62.86 7 71 63.15 \n", - "2023-12-12 62.29 62.86 61.58 62.86 7 71 63.15 \n", - "2023-12-13 56.95 58.00 56.95 58.00 15 162 64.70 \n", - "2023-12-13 56.95 58.00 56.95 58.00 15 162 64.70 \n", - "2023-12-14 70.85 77.53 70.85 76.17 12 16 76.05 \n", - "2023-12-14 70.85 77.53 70.85 76.17 12 16 76.05 \n", - "2023-12-15 76.88 77.30 76.88 77.04 13 30 77.75 \n", - "2023-12-15 76.88 77.30 76.88 77.04 13 30 77.75 \n", - "2023-12-18 78.40 82.03 78.40 82.03 4 25 76.65 \n", - "2023-12-18 78.40 82.03 78.40 82.03 4 25 76.65 \n", - "2023-12-19 81.05 81.05 81.05 81.05 1 21 81.45 \n", - "2023-12-19 81.05 81.05 81.05 81.05 1 21 81.45 \n", - "2023-12-20 80.90 80.90 80.90 80.90 1 37 72.05 \n", - "2023-12-20 80.90 80.90 80.90 80.90 1 37 72.05 \n", - "2023-12-21 0.00 0.00 0.00 0.00 0 25 78.70 \n", - "2023-12-21 0.00 0.00 0.00 0.00 0 25 78.70 \n", - "2023-12-22 82.21 82.21 77.16 77.30 175 31 77.00 \n", - "2023-12-22 82.21 82.21 77.16 77.30 175 31 77.00 \n", - "2023-12-26 80.98 80.98 80.98 80.98 4 32 80.55 \n", - "2023-12-26 80.98 80.98 80.98 80.98 4 32 80.55 \n", - "2023-12-27 85.86 85.90 85.20 85.20 19 38 85.00 \n", - "2023-12-27 85.86 85.90 85.20 85.20 19 38 85.00 \n", - "2023-12-28 82.90 82.90 82.90 82.90 1 58 76.50 \n", - "2023-12-28 82.90 82.90 82.90 82.90 1 58 76.50 \n", - "2023-12-29 76.60 77.40 73.00 74.80 22 30 72.40 \n", - "2023-12-29 76.60 77.40 73.00 74.80 22 30 72.40 \n", - "\n", - " Ask_size CloseAsk Midpoint Weighted_midpoint \n", - "Datetime \n", - "2023-01-03 110 14.05 13.800 13.715165 \n", - "2023-01-03 110 14.05 13.800 13.715165 \n", - "2023-01-04 129 15.85 15.600 15.664634 \n", - "2023-01-04 129 15.85 15.600 15.664634 \n", - "2023-01-05 391 14.55 13.925 14.092139 \n", - "2023-01-05 391 14.55 13.925 14.092139 \n", - "2023-01-06 106 15.10 14.975 14.978641 \n", - "2023-01-06 106 15.10 14.975 14.978641 \n", - "2023-01-09 338 18.05 17.675 17.769444 \n", - "2023-01-09 338 18.05 17.675 17.769444 \n", - "2023-01-10 25 17.10 16.900 16.747170 \n", - "2023-01-10 25 17.10 16.900 16.747170 \n", - "2023-01-11 283 18.70 18.500 18.580893 \n", - "2023-01-11 283 18.70 18.500 18.580893 \n", - "2023-01-12 240 18.30 18.125 18.181405 \n", - "2023-01-12 240 18.30 18.125 18.181405 \n", - "2023-01-13 135 17.40 17.225 17.225000 \n", - "2023-01-13 135 17.40 17.225 17.225000 \n", - "2023-01-17 145 21.60 21.300 21.207143 \n", - "2023-01-17 145 21.60 21.300 21.207143 \n", - "2023-01-18 195 20.15 19.875 19.984409 \n", - "2023-01-18 195 20.15 19.875 19.984409 \n", - "2023-01-19 102 19.20 19.000 19.042857 \n", - "2023-01-19 102 19.20 19.000 19.042857 \n", - "2023-01-20 128 21.50 21.200 21.047692 \n", - "2023-01-20 128 21.50 21.200 21.047692 \n", - "2023-01-23 197 26.15 25.925 25.895264 \n", - "2023-01-23 197 26.15 25.925 25.895264 \n", - "2023-01-24 92 25.85 25.525 25.306595 \n", - "2023-01-24 92 25.85 25.525 25.306595 \n", - "2023-01-25 180 25.35 24.975 24.900668 \n", - "2023-01-25 180 25.35 24.975 24.900668 \n", - "2023-01-26 120 32.65 32.350 32.441304 \n", - "2023-01-26 120 32.65 32.350 32.441304 \n", - "2023-01-27 352 46.95 46.200 46.061819 \n", - "2023-01-27 352 46.95 46.200 46.061819 \n", - "2023-01-30 66 38.90 38.200 38.363551 \n", - "2023-01-30 66 38.90 38.200 38.363551 \n", - "2023-01-31 15 42.55 41.925 41.885937 \n", - "2023-01-31 15 42.55 41.925 41.885937 \n", - "2023-02-01 185 47.85 47.200 47.843011 \n", - "2023-02-01 185 47.85 47.200 47.843011 \n", - "2023-02-02 25 52.85 52.050 52.788462 \n", - "2023-02-02 25 52.85 52.050 52.788462 \n", - "2023-02-03 25 55.35 54.525 54.878571 \n", - "2023-02-03 25 55.35 54.525 54.878571 \n", - "2023-02-06 207 59.15 58.600 58.946457 \n", - "2023-02-06 207 59.15 58.600 58.946457 \n", - "2023-02-07 28 60.00 59.500 59.333333 \n", - "2023-02-07 28 60.00 59.500 59.333333 \n", - "2023-02-08 68 63.90 63.350 63.456140 \n", - "2023-02-08 68 63.90 63.350 63.456140 \n", - "2023-02-09 11 68.80 68.450 68.420833 \n", - "2023-02-09 11 68.80 68.450 68.420833 \n", - "2023-02-10 196 60.45 60.050 60.353139 \n", - "2023-02-10 196 60.45 60.050 60.353139 \n", - "2023-02-13 544 58.60 57.925 58.399296 \n", - "2023-02-13 544 58.60 57.925 58.399296 \n", - "2023-02-14 568 70.15 69.350 70.092954 \n", - "2023-02-14 568 70.15 69.350 70.092954 \n", - "2023-02-15 38 73.85 73.225 73.133708 \n", - "2023-02-15 38 73.85 73.225 73.133708 \n", - "2023-02-16 201 64.95 62.700 64.840777 \n", - "2023-02-16 201 64.95 62.700 64.840777 \n", - "2023-02-17 49 69.80 68.950 68.958763 \n", - "2023-02-17 49 69.80 68.950 68.958763 \n", - "2023-02-21 16 61.05 60.450 59.892572 \n", - "2023-02-21 16 61.05 60.450 59.892572 \n", - "2023-02-22 302 63.20 62.475 63.109938 \n", - "2023-02-22 302 63.20 62.475 63.109938 \n", - "2023-02-23 244 63.65 63.225 63.469032 \n", - "2023-02-23 244 63.65 63.225 63.469032 \n", - "2023-02-24 142 59.50 59.100 59.060635 \n", - "2023-02-24 142 59.50 59.100 59.060635 \n", - "2023-02-27 405 67.60 67.100 67.472845 \n", - "2023-02-27 405 67.60 67.100 67.472845 \n", - "2023-02-28 11 65.35 64.775 64.391667 \n", - "2023-02-28 11 65.35 64.775 64.391667 \n", - "2023-03-01 558 62.75 62.150 62.173464 \n", - "2023-03-01 558 62.75 62.150 62.173464 \n", - "2023-03-02 42 53.25 52.975 52.933333 \n", - "2023-03-02 42 53.25 52.975 52.933333 \n", - "2023-03-03 260 58.15 57.675 57.734632 \n", - "2023-03-03 260 58.15 57.675 57.734632 \n", - "2023-03-06 149 54.80 54.375 54.260417 \n", - "2023-03-06 149 54.80 54.375 54.260417 \n", - "2023-03-07 72 50.50 50.125 50.087500 \n", - "2023-03-07 72 50.50 50.125 50.087500 \n", - "2023-03-08 175 46.30 46.000 45.979255 \n", - "2023-03-08 175 46.30 46.000 45.979255 \n", - "2023-03-09 1 40.20 40.025 39.854545 \n", - "2023-03-09 1 40.20 40.025 39.854545 \n", - "2023-03-10 230 41.00 40.700 40.813174 \n", - "2023-03-10 230 41.00 40.700 40.813174 \n", - "2023-03-13 42 41.30 40.925 40.765753 \n", - "2023-03-13 42 41.30 40.925 40.765753 \n", - "2023-03-14 56 46.90 46.575 46.856667 \n", - "2023-03-14 56 46.90 46.575 46.856667 \n", - "2023-03-15 59 45.05 44.625 44.560791 \n", - "2023-03-15 59 45.05 44.625 44.560791 \n", - "2023-03-16 64 47.05 46.725 46.620106 \n", - "2023-03-16 64 47.05 46.725 46.620106 \n", - "2023-03-17 209 44.60 44.275 44.338143 \n", - "2023-03-17 209 44.60 44.275 44.338143 \n", - "2023-03-20 40 46.10 45.800 45.612150 \n", - "2023-03-20 40 46.10 45.800 45.612150 \n", - "2023-03-21 38 56.50 55.725 55.025610 \n", - "2023-03-21 38 56.50 55.725 55.025610 \n", - "2023-03-22 37 51.85 51.575 51.491981 \n", - "2023-03-22 37 51.85 51.575 51.491981 \n", - "2023-03-23 29 53.00 52.700 52.565714 \n", - "2023-03-23 29 53.00 52.700 52.565714 \n", - "2023-03-24 31 51.65 51.425 51.330374 \n", - "2023-03-24 31 51.65 51.425 51.330374 \n", - "2023-03-27 63 52.45 52.225 52.240254 \n", - "2023-03-27 63 52.45 52.225 52.240254 \n", - "2023-03-28 167 50.55 50.325 50.349668 \n", - "2023-03-28 167 50.55 50.325 50.349668 \n", - "2023-03-29 7 53.25 53.025 52.819937 \n", - "2023-03-29 7 53.25 53.025 52.819937 \n", - "2023-03-30 389 54.15 53.875 54.009866 \n", - "2023-03-30 389 54.15 53.875 54.009866 \n", - "2023-03-31 92 62.90 62.525 62.363622 \n", - "2023-03-31 92 62.90 62.525 62.363622 \n", - "2023-04-03 194 53.40 53.000 52.845570 \n", - "2023-04-03 194 53.40 53.000 52.845570 \n", - "2023-04-04 128 51.80 51.425 51.240855 \n", - "2023-04-04 128 51.80 51.425 51.240855 \n", - "2023-04-05 155 46.95 46.550 46.450242 \n", - "2023-04-05 155 46.95 46.550 46.450242 \n", - "2023-04-06 155 46.15 45.850 45.840625 \n", - "2023-04-06 155 46.15 45.850 45.840625 \n", - "2023-04-10 123 45.85 45.475 45.552206 \n", - "2023-04-10 123 45.85 45.475 45.552206 \n", - "2023-04-11 165 47.45 47.100 47.018605 \n", - "2023-04-11 165 47.45 47.100 47.018605 \n", - "2023-04-12 140 43.10 42.775 42.911929 \n", - "2023-04-12 140 43.10 42.775 42.911929 \n", - "2023-04-13 162 46.10 45.825 45.810526 \n", - "2023-04-13 162 46.10 45.825 45.810526 \n", - "2023-04-14 235 45.15 44.800 44.737587 \n", - "2023-04-14 235 45.15 44.800 44.737587 \n", - "2023-04-17 235 45.90 45.500 45.542353 \n", - "2023-04-17 235 45.90 45.500 45.542353 \n", - "2023-04-18 223 43.50 43.175 43.281399 \n", - "2023-04-18 223 43.50 43.175 43.281399 \n", - "2023-04-19 97 40.15 39.800 39.662188 \n", - "2023-04-19 97 40.15 39.800 39.662188 \n", - "2023-04-20 26 29.20 28.875 28.602160 \n", - "2023-04-20 26 29.20 28.875 28.602160 \n", - "2023-04-21 302 29.60 29.300 29.407191 \n", - "2023-04-21 302 29.60 29.300 29.407191 \n", - "2023-04-24 305 27.90 27.525 27.594175 \n", - "2023-04-24 305 27.90 27.525 27.594175 \n", - "2023-04-25 230 27.15 26.725 26.801282 \n", - "2023-04-25 230 27.15 26.725 26.801282 \n", - "2023-04-26 278 23.85 22.250 23.838530 \n", - "2023-04-26 278 23.85 22.250 23.838530 \n", - "2023-04-27 276 26.80 26.450 26.472973 \n", - "2023-04-27 276 26.80 26.450 26.472973 \n", - "2023-04-28 288 28.65 28.250 28.236577 \n", - "2023-04-28 288 28.65 28.250 28.236577 \n", - "2023-05-01 163 27.10 26.775 26.739481 \n", - "2023-05-01 163 27.10 26.775 26.739481 \n", - "2023-05-02 410 26.65 26.275 26.428351 \n", - "2023-05-02 410 26.65 26.275 26.428351 \n", - "2023-05-03 207 26.80 26.400 26.773832 \n", - "2023-05-03 207 26.80 26.400 26.773832 \n", - "2023-05-04 331 27.00 26.725 26.844902 \n", - "2023-05-04 331 27.00 26.725 26.844902 \n", - "2023-05-05 233 31.80 31.525 31.664725 \n", - "2023-05-05 233 31.80 31.525 31.664725 \n", - "2023-05-08 324 33.10 32.725 32.800000 \n", - "2023-05-08 324 33.10 32.725 32.800000 \n", - "2023-05-09 293 31.40 31.050 31.086252 \n", - "2023-05-09 293 31.40 31.050 31.086252 \n", - "2023-05-10 311 30.90 30.550 30.609211 \n", - "2023-05-10 311 30.90 30.550 30.609211 \n", - "2023-05-11 225 32.95 32.450 32.394664 \n", - "2023-05-11 225 32.95 32.450 32.394664 \n", - "2023-05-12 211 31.00 30.500 30.671975 \n", - "2023-05-12 211 31.00 30.500 30.671975 \n", - "2023-05-15 335 29.55 29.175 29.125875 \n", - "2023-05-15 335 29.55 29.175 29.125875 \n", - "2023-05-16 391 29.55 29.200 29.358736 \n", - "2023-05-16 391 29.55 29.200 29.358736 \n", - "2023-05-17 244 33.25 32.950 33.147959 \n", - "2023-05-17 244 33.25 32.950 33.147959 \n", - "2023-05-18 55 35.20 34.450 34.626966 \n", - "2023-05-18 55 35.20 34.450 34.626966 \n", - "2023-05-19 193 37.00 36.700 36.709626 \n", - "2023-05-19 193 37.00 36.700 36.709626 \n", - "2023-05-22 113 43.35 43.025 43.065423 \n", - "2023-05-22 113 43.35 43.025 43.065423 \n", - "2023-05-23 231 41.60 41.150 41.226329 \n", - "2023-05-23 231 41.60 41.150 41.226329 \n", - "2023-05-24 259 39.70 39.300 39.439583 \n", - "2023-05-24 259 39.70 39.300 39.439583 \n", - "2023-05-25 227 40.30 40.000 40.111480 \n", - "2023-05-25 227 40.30 40.000 40.111480 \n", - "2023-05-26 179 46.40 46.100 46.337000 \n", - "2023-05-26 179 46.40 46.100 46.337000 \n", - "2023-05-30 246 53.00 52.200 52.190361 \n", - "2023-05-30 246 53.00 52.200 52.190361 \n", - "2023-05-31 195 54.80 54.050 54.105785 \n", - "2023-05-31 195 54.80 54.050 54.105785 \n", - "2023-06-01 161 56.80 56.275 56.125667 \n", - "2023-06-01 161 56.80 56.275 56.125667 \n", - "2023-06-02 187 61.75 61.275 61.286712 \n", - "2023-06-02 187 61.75 61.275 61.286712 \n", - "2023-06-05 146 64.40 64.025 64.100617 \n", - "2023-06-05 146 64.40 64.025 64.100617 \n", - "2023-06-06 275 67.10 66.700 66.839216 \n", - "2023-06-06 275 67.10 66.700 66.839216 \n", - "2023-06-07 418 69.50 68.650 68.785576 \n", - "2023-06-07 418 69.50 68.650 68.785576 \n", - "2023-06-08 189 77.90 77.575 77.621148 \n", - "2023-06-08 189 77.90 77.575 77.621148 \n", - "2023-06-09 129 86.15 85.575 85.518706 \n", - "2023-06-12 399 90.70 89.950 90.101355 \n", - "2023-06-12 399 90.70 89.950 90.101355 \n", - "2023-06-13 367 98.50 97.775 97.900080 \n", - "2023-06-13 367 98.50 97.775 97.900080 \n", - "2023-06-14 225 96.75 96.250 96.306931 \n", - "2023-06-14 225 96.75 96.250 96.306931 \n", - "2023-06-15 139 96.45 95.850 95.928049 \n", - "2023-06-15 139 96.45 95.850 95.928049 \n", - "2023-06-16 108 100.40 99.950 100.031148 \n", - "2023-06-16 108 100.40 99.950 100.031148 \n", - "2023-06-20 107 112.95 112.475 112.416598 \n", - "2023-06-20 107 112.95 112.475 112.416598 \n", - "2023-06-21 219 99.25 98.700 98.788992 \n", - "2023-06-21 219 99.25 98.700 98.788992 \n", - "2023-06-22 205 103.70 103.125 103.170395 \n", - "2023-06-22 205 103.70 103.125 103.170395 \n", - "2023-06-23 83 95.70 95.325 95.210460 \n", - "2023-06-23 83 95.70 95.325 95.210460 \n", - "2023-06-26 309 82.35 81.775 81.896765 \n", - "2023-06-26 309 82.35 81.775 81.896765 \n", - "2023-06-27 166 89.40 88.875 88.925248 \n", - "2023-06-27 166 89.40 88.875 88.925248 \n", - "2023-06-28 345 94.90 94.225 94.380214 \n", - "2023-06-28 345 94.90 94.225 94.380214 \n", - "2023-06-29 53 95.50 95.200 95.071892 \n", - "2023-06-29 53 95.50 95.200 95.071892 \n", - "2023-06-30 163 99.70 99.075 99.288477 \n", - "2023-06-30 163 99.70 99.075 99.288477 \n", - "2023-07-03 110 116.20 115.500 115.627957 \n", - "2023-07-03 110 116.20 115.500 115.627957 \n", - "2023-07-05 311 118.25 117.650 117.872026 \n", - "2023-07-05 311 118.25 117.650 117.872026 \n", - "2023-07-06 276 112.60 112.150 112.277674 \n", - "2023-07-06 276 112.60 112.150 112.277674 \n", - "2023-07-07 275 110.40 109.825 110.027027 \n", - "2023-07-07 275 110.40 109.825 110.027027 \n", - "2023-07-10 244 105.45 104.825 104.846186 \n", - "2023-07-10 244 105.45 104.825 104.846186 \n", - "2023-07-11 282 105.50 104.925 105.059628 \n", - "2023-07-11 282 105.50 104.925 105.059628 \n", - "2023-07-12 232 106.95 106.575 106.705814 \n", - "2023-07-12 232 106.95 106.575 106.705814 \n", - "2023-07-13 155 112.50 112.000 112.082707 \n", - "2023-07-13 155 112.50 112.000 112.082707 \n", - "2023-07-14 45 115.50 115.050 115.045055 \n", - "2023-07-14 45 115.50 115.050 115.045055 \n", - "2023-07-17 49 124.20 123.725 123.720202 \n", - "2023-07-17 49 124.20 123.725 123.720202 \n", - "2023-07-18 15 128.20 126.475 127.984375 \n", - "2023-07-18 15 128.20 126.475 127.984375 \n", - "2023-07-19 25 127.05 125.200 126.240625 \n", - "2023-07-19 25 127.05 125.200 126.240625 \n", - "2023-07-20 134 98.20 97.800 98.087179 \n", - "2023-07-20 134 98.20 97.800 98.087179 \n", - "2023-07-21 41 95.35 94.975 94.930645 \n", - "2023-07-21 41 95.35 94.975 94.930645 \n", - "2023-07-24 181 103.35 102.925 102.949854 \n", - "2023-07-24 181 103.35 102.925 102.949854 \n", - "2023-07-25 180 100.75 99.675 99.934483 \n", - "2023-07-25 180 100.75 99.675 99.934483 \n", - "2023-07-26 84 99.15 98.100 97.733721 \n", - "2023-07-26 84 99.15 98.100 97.733721 \n", - "2023-07-27 336 91.70 90.825 91.047015 \n", - "2023-07-27 336 91.70 90.825 91.047015 \n", - "2023-07-28 330 100.75 99.475 99.323498 \n", - "2023-07-28 330 100.75 99.475 99.323498 \n", - "2023-07-31 140 101.05 100.175 99.786111 \n", - "2023-07-31 140 101.05 100.175 99.786111 \n", - "2023-08-01 512 96.30 95.275 95.400877 \n", - "2023-08-01 512 96.30 95.275 95.400877 \n", - "2023-08-02 548 90.40 89.225 89.192680 \n", - "2023-08-02 548 90.40 89.225 89.192680 \n", - "2023-08-03 158 95.40 94.050 94.268382 \n", - "2023-08-03 158 95.40 94.050 94.268382 \n", - "2023-08-04 248 89.90 88.550 88.477863 \n", - "2023-08-04 248 89.90 88.550 88.477863 \n", - "2023-08-07 367 87.20 85.950 85.963774 \n", - "2023-08-07 367 87.20 85.950 85.963774 \n", - "2023-08-08 249 85.50 84.825 85.070959 \n", - "2023-08-08 249 85.50 84.825 85.070959 \n", - "2023-08-09 380 79.45 78.400 78.557262 \n", - "2023-08-09 380 79.45 78.400 78.557262 \n", - "2023-08-10 340 81.85 81.025 81.238889 \n", - "2023-08-10 340 81.85 81.025 81.238889 \n", - "2023-08-11 380 79.40 78.450 78.478320 \n", - "2023-08-11 380 79.40 78.450 78.478320 \n", - "2023-08-14 331 76.10 75.150 74.964156 \n", - "2023-08-14 331 76.10 75.150 74.964156 \n", - "2023-08-15 303 71.25 70.050 70.078378 \n", - "2023-08-15 303 71.25 70.050 70.078378 \n", - "2023-08-16 266 64.65 63.950 64.122131 \n", - "2023-08-16 266 64.65 63.950 64.122131 \n", - "2023-08-17 340 59.70 58.675 58.779660 \n", - "2023-08-17 340 59.70 58.675 58.779660 \n", - "2023-08-18 136 56.50 55.675 55.736957 \n", - "2023-08-18 136 56.50 55.675 55.736957 \n", - "2023-08-21 459 68.75 68.375 68.396145 \n", - "2023-08-21 459 68.75 68.375 68.396145 \n", - "2023-08-22 355 70.70 70.325 70.308345 \n", - "2023-08-22 355 70.70 70.325 70.308345 \n", - "2023-08-23 436 73.50 73.025 73.072980 \n", - "2023-08-23 436 73.50 73.025 73.072980 \n", - "2023-08-24 563 68.05 67.600 67.736458 \n", - "2023-08-24 563 68.05 67.600 67.736458 \n", - "2023-08-25 314 75.30 74.675 74.892275 \n", - "2023-08-25 314 75.30 74.675 74.892275 \n", - "2023-08-28 155 75.55 74.700 74.746259 \n", - "2023-08-28 155 75.55 74.700 74.746259 \n", - "2023-08-29 233 91.75 90.550 90.463944 \n", - "2023-08-29 233 91.75 90.550 90.463944 \n", - "2023-08-30 195 91.25 90.450 90.352703 \n", - "2023-08-30 195 91.25 90.450 90.352703 \n", - "2023-08-31 308 92.05 91.225 91.142982 \n", - "2023-08-31 308 92.05 91.225 91.142982 \n", - "2023-09-01 403 80.00 79.525 79.634504 \n", - "2023-09-01 403 80.00 79.525 79.634504 \n", - "2023-09-05 526 90.35 89.700 89.738620 \n", - "2023-09-05 526 90.35 89.700 89.738620 \n", - "2023-09-06 432 85.95 85.450 85.489326 \n", - "2023-09-06 432 85.95 85.450 85.489326 \n", - "2023-09-07 374 85.25 84.850 84.833590 \n", - "2023-09-07 374 85.25 84.850 84.833590 \n", - "2023-09-08 409 82.35 81.925 81.914362 \n", - "2023-09-08 409 82.35 81.925 81.914362 \n", - "2023-09-11 50 105.70 104.575 103.812903 \n", - "2023-09-11 50 105.70 104.575 103.812903 \n", - "2023-09-12 474 99.40 98.900 98.918600 \n", - "2023-09-12 474 99.40 98.900 98.918600 \n", - "2023-09-13 273 103.10 102.325 102.179688 \n", - "2023-09-13 273 103.10 102.325 102.179688 \n", - "2023-09-14 369 107.15 106.550 106.684328 \n", - "2023-09-14 369 107.15 106.550 106.684328 \n", - "2023-09-15 318 105.85 104.975 105.164054 \n", - "2023-09-15 318 105.85 104.975 105.164054 \n", - "2023-09-18 105 97.95 96.700 97.132692 \n", - "2023-09-18 105 97.95 96.700 97.132692 \n", - "2023-09-19 5 97.80 97.100 96.427344 \n", - "2023-09-19 5 97.80 97.100 96.427344 \n", - "2023-09-20 440 94.75 93.525 93.630864 \n", - "2023-09-20 440 94.75 93.525 93.630864 \n", - "2023-09-21 157 88.40 87.700 87.889879 \n", - "2023-09-21 157 88.40 87.700 87.889879 \n", - "2023-09-22 100 78.95 78.000 78.111453 \n", - "2023-09-22 100 78.95 78.000 78.111453 \n", - "2023-09-25 123 79.80 79.175 79.021626 \n", - "2023-09-25 123 79.80 79.175 79.021626 \n", - "2023-09-26 414 77.80 77.125 77.185395 \n", - "2023-09-26 414 77.80 77.125 77.185395 \n", - "2023-09-27 2 75.60 74.575 73.588679 \n", - "2023-09-27 2 75.60 74.575 73.588679 \n", - "2023-09-28 166 78.85 78.575 78.638148 \n", - "2023-09-28 166 78.85 78.575 78.638148 \n", - "2023-09-29 228 82.35 81.825 81.827313 \n", - "2023-09-29 228 82.35 81.825 81.827313 \n", - "2023-10-02 358 83.60 83.025 83.074734 \n", - "2023-10-02 358 83.60 83.025 83.074734 \n", - "2023-10-03 171 79.50 78.850 78.809041 \n", - "2023-10-03 171 79.50 78.850 78.809041 \n", - "2023-10-04 54 92.75 92.000 91.966814 \n", - "2023-10-04 54 92.75 92.000 91.966814 \n", - "2023-10-05 296 91.30 90.825 90.861273 \n", - "2023-10-05 296 91.30 90.825 90.861273 \n", - "2023-10-06 259 91.65 91.150 91.209395 \n", - "2023-10-06 259 91.65 91.150 91.209395 \n", - "2023-10-09 164 90.50 90.200 90.173333 \n", - "2023-10-09 164 90.50 90.200 90.173333 \n", - "2023-10-10 85 93.95 93.425 93.689823 \n", - "2023-10-10 85 93.95 93.425 93.689823 \n", - "2023-10-11 227 93.50 93.075 93.327018 \n", - "2023-10-11 227 93.50 93.075 93.327018 \n", - "2023-10-12 95 89.10 88.800 88.711111 \n", - "2023-10-12 95 89.10 88.800 88.711111 \n", - "2023-10-13 305 82.70 82.200 82.199182 \n", - "2023-10-13 305 82.70 82.200 82.199182 \n", - "2023-10-16 46 84.35 84.075 83.915000 \n", - "2023-10-16 46 84.35 84.075 83.915000 \n", - "2023-10-17 150 85.40 84.825 84.802885 \n", - "2023-10-17 150 85.40 84.825 84.802885 \n", - "2023-10-18 53 74.30 73.725 73.567466 \n", - "2023-10-18 53 74.30 73.725 73.567466 \n", - "2023-10-19 202 55.05 54.725 54.741927 \n", - "2023-10-19 202 55.05 54.725 54.741927 \n", - "2023-10-20 57 48.65 48.275 48.209783 \n", - "2023-10-20 57 48.65 48.275 48.209783 \n", - "2023-10-23 195 48.50 48.000 47.935268 \n", - "2023-10-23 195 48.50 48.000 47.935268 \n", - "2023-10-24 258 51.65 51.375 51.416036 \n", - "2023-10-24 258 51.65 51.375 51.416036 \n", - "2023-10-25 207 48.50 48.225 48.191720 \n", - "2023-10-25 207 48.50 48.225 48.191720 \n", - "2023-10-26 102 43.55 43.225 43.145556 \n", - "2023-10-26 102 43.55 43.225 43.145556 \n", - "2023-10-27 182 44.75 44.475 44.414807 \n", - "2023-10-27 182 44.75 44.475 44.414807 \n", - "2023-10-30 41 37.15 36.925 36.768081 \n", - "2023-10-30 41 37.15 36.925 36.768081 \n", - "2023-10-31 186 39.20 38.925 38.897700 \n", - "2023-10-31 186 39.20 38.925 38.897700 \n", - "2023-11-01 131 42.35 42.075 42.024455 \n", - "2023-11-01 131 42.35 42.075 42.024455 \n", - "2023-11-02 225 52.00 51.675 51.649693 \n", - "2023-11-02 225 52.00 51.675 51.649693 \n", - "2023-11-03 301 53.95 53.075 53.048229 \n", - "2023-11-03 301 53.95 53.075 53.048229 \n", - "2023-11-06 96 52.10 51.775 51.638520 \n", - "2023-11-06 96 52.10 51.775 51.638520 \n", - "2023-11-07 77 54.40 54.200 54.171111 \n", - "2023-11-07 77 54.40 54.200 54.171111 \n", - "2023-11-08 297 54.15 53.900 53.949395 \n", - "2023-11-08 297 54.15 53.900 53.949395 \n", - "2023-11-09 37 44.35 44.125 43.962360 \n", - "2023-11-09 37 44.35 44.125 43.962360 \n", - "2023-11-10 152 47.95 47.500 47.280691 \n", - "2023-11-10 152 47.95 47.500 47.280691 \n", - "2023-11-13 124 55.30 55.100 55.140777 \n", - "2023-11-13 124 55.30 55.100 55.140777 \n", - "2023-11-14 140 66.85 66.625 66.728125 \n", - "2023-11-14 140 66.85 66.625 66.728125 \n", - "2023-11-15 23 71.70 71.450 71.310577 \n", - "2023-11-15 23 71.70 71.450 71.310577 \n", - "2023-11-16 98 63.45 63.000 63.026757 \n", - "2023-11-16 98 63.45 63.000 63.026757 \n", - "2023-11-17 228 64.80 63.625 63.654045 \n", - "2023-11-17 228 64.80 63.625 63.654045 \n", - "2023-11-20 157 64.65 64.375 64.379450 \n", - "2023-11-20 157 64.65 64.375 64.379450 \n", - "2023-11-21 217 69.60 69.300 69.307075 \n", - "2023-11-21 217 69.60 69.300 69.307075 \n", - "2023-11-22 193 63.10 62.900 62.906971 \n", - "2023-11-22 193 63.10 62.900 62.906971 \n", - "2023-11-24 208 64.10 63.875 63.890617 \n", - "2023-11-24 208 64.10 63.875 63.890617 \n", - "2023-11-27 265 64.50 64.175 64.184466 \n", - "2023-11-27 265 64.50 64.175 64.184466 \n", - "2023-11-28 53 74.25 73.725 73.740291 \n", - "2023-11-28 53 74.25 73.725 73.740291 \n", - "2023-11-29 137 71.70 71.225 71.310991 \n", - "2023-11-29 137 71.70 71.225 71.310991 \n", - "2023-11-30 36 67.80 67.250 67.188889 \n", - "2023-11-30 36 67.80 67.250 67.188889 \n", - "2023-12-01 127 66.35 65.950 65.922161 \n", - "2023-12-01 127 66.35 65.950 65.922161 \n", - "2023-12-04 149 63.30 62.975 63.055230 \n", - "2023-12-04 149 63.30 62.975 63.055230 \n", - "2023-12-05 14 66.00 65.700 65.633333 \n", - "2023-12-05 14 66.00 65.700 65.633333 \n", - "2023-12-06 249 66.55 66.125 66.194509 \n", - "2023-12-06 249 66.55 66.125 66.194509 \n", - "2023-12-07 36 69.45 69.050 69.044521 \n", - "2023-12-07 36 69.45 69.050 69.044521 \n", - "2023-12-08 16 70.35 69.825 69.488764 \n", - "2023-12-08 16 70.35 69.825 69.488764 \n", - "2023-12-11 85 66.25 66.025 66.118750 \n", - "2023-12-11 85 66.25 66.025 66.118750 \n", - "2023-12-12 109 63.60 63.375 63.422500 \n", - "2023-12-12 109 63.60 63.375 63.422500 \n", - "2023-12-13 20 65.80 65.250 64.820879 \n", - "2023-12-13 20 65.80 65.250 64.820879 \n", - "2023-12-14 19 76.55 76.300 76.321429 \n", - "2023-12-14 19 76.55 76.300 76.321429 \n", - "2023-12-15 26 78.80 78.275 78.237500 \n", - "2023-12-15 26 78.80 78.275 78.237500 \n", - "2023-12-18 29 77.25 76.950 76.972222 \n", - "2023-12-18 29 77.25 76.950 76.972222 \n", - "2023-12-19 29 82.00 81.725 81.769000 \n", - "2023-12-19 29 82.00 81.725 81.769000 \n", - "2023-12-20 16 72.75 72.400 72.261321 \n", - "2023-12-20 16 72.75 72.400 72.261321 \n", - "2023-12-21 30 79.60 79.150 79.190909 \n", - "2023-12-21 30 79.60 79.150 79.190909 \n", - "2023-12-22 40 77.45 77.225 77.253521 \n", - "2023-12-22 40 77.45 77.225 77.253521 \n", - "2023-12-26 27 81.15 80.850 80.824576 \n", - "2023-12-26 27 81.15 80.850 80.824576 \n", - "2023-12-27 17 85.75 85.375 85.231818 \n", - "2023-12-27 17 85.75 85.375 85.231818 \n", - "2023-12-28 11 77.70 77.100 76.691304 \n", - "2023-12-28 11 77.70 77.100 76.691304 \n", - "2023-12-29 5 73.25 72.825 72.521429 \n", - "2023-12-29 5 73.25 72.825 72.521429 " - ] - }, - "execution_count": 270, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rm.option_data['TSLA20240315C180']" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[0;31mSignature:\u001b[0m\n", - "\u001b[0mrm\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mOrderPicker\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_order\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mtick\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mdate\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mright\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mmax_close\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0morder_settings\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mdict\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mdict\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mDocstring:\u001b[0m\n", - "returns the order for the given tick, date, right, max_close, and order_settings\n", - "\n", - "params:\n", - "tick: str: ticker to get the order for\n", - "date: str: date to get the order for\n", - "right: str: right of the option contract (P or C)\n", - "max_close: str: maximum close price\n", - "order_settings: dict: settings for the order\n", - " example: {'type': 'naked',\n", - " 'specifics': [{'direction': 'long',\n", - " 'rel_strike': .900,\n", - " 'dte': 365,\n", - " 'moneyness_width': 0.15},\n", - " {'direction': 'short',\n", - " 'rel_strike': .80,\n", - " 'dte': 365,\n", - " 'moneyness_width': 0.15}],\n", - "\n", - " 'name': 'vertical_spread'}\n", - "\n", - "returns:\n", - "dict: order\n", - "\u001b[0;31mFile:\u001b[0m ~/cloned_repos/QuantTools/EventDriven/riskmanager.py\n", - "\u001b[0;31mType:\u001b[0m method" - ] - } - ], - "source": [ - "rm.OrderPicker.get_order?" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Console Logging & File Logging Can be configured using STREAM_LOG_LEVEL and FILE_LOG_LEVEL in environment variables.\n", - "Propagate to root logger can be set using PROPAGATE_TO_ROOT_LOGGER in environment variables.\n", - "Example:\n", - "STREAM_LOG_LEVEL = 'DEBUG'\n", - "FILE_LOG_LEVEL = 'INFO'\n", - "PROPAGATE_TO_ROOT_LOGGER = 'False'\n", - "\n", - "Using Proxy URL: http://18.232.166.224:5500/thetadata\n" - ] - } - ], - "source": [ - "%load_ext autoreload\n", - "%autoreload 2\n", - "import os, sys\n", - "os.environ['STREAM_LOG_LEVEL'] = 'ERROR'\n", - "os.environ['FILE_LOG_LEVEL'] = 'DEBUG'\n", - "os.environ['PROPAGATE_TO_ROOT_LOGGER'] = 'False'\n", - "os.environ['PROPAGATE_TO_ROOT_LOGGER'], os.environ['STREAM_LOG_LEVEL']\n", - "from trade.assets.Stock import Stock\n", - "from trade.assets.Option import Option\n", - "from trade.assets.OptionStructure import OptionStructure\n", - "from trade.helpers.Context import Context, clear_context\n", - "from trade.helpers.helper import (change_to_last_busday, \n", - " is_USholiday, \n", - " is_busday, \n", - " setup_logger, \n", - " generate_option_tick, \n", - " get_option_specifics_from_key,\n", - " identify_length,\n", - " extract_numeric_value)\n", - "from scipy.stats import percentileofscore\n", - "from EventDriven.riskmanager import RiskManager\n", - "from dbase.DataAPI.ThetaData import (list_contracts, retrieve_openInterest, retrieve_eod_ohlc, retrieve_quote)\n", - "from pandas.tseries.offsets import BDay\n", - "from itertools import product\n", - "import pandas as pd\n", - "from trade.helpers.types import ResultsEnum\n", - "from copy import deepcopy\n", - "from concurrent.futures import ThreadPoolExecutor, as_completed\n", - "from pathos.multiprocessing import ProcessingPool as Pool\n", - "import numpy as np\n", - "import time\n", - "chain_cache = {}\n", - "close_cache = {}\n", - "oi_cache = {}\n", - "spot_cache = {}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## TEST IMPORT" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'L': ['AAPL20250620000235C'],\n", - " 'S': ['AAPL20250620000260C'],\n", - " 'trade_id': '&L:AAPL20250620000235C&S:AAPL20250620000260C',\n", - " 'close': 4.925000000000001}" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from EventDriven.riskmanager import RiskManager, spot_cache, oi_cache, close_cache, chain_cache\n", - "from pandas.tseries.offsets import BDay\n", - "import pandas as pd\n", - "\n", - "order_settings = {\n", - " 'type': 'spread',\n", - " 'specifics': [\n", - " {'direction': 'long', 'rel_strike': 1.0, 'dte': 365, 'moneyness_width': 0.15},\n", - " {'direction': 'short', 'rel_strike': 0.85, 'dte': 365, 'moneyness_width': 0.15} \n", - " ],\n", - " 'name': 'vertical_spread'\n", - " }\n", - "tick = 'AAPL'\n", - "date = '2024-07-24'\n", - "start = (pd.to_datetime(date) - BDay(30)).strftime('%Y-%m-%d')\n", - "right = 'C'\n", - "\n", - "rm = RiskManager(None, None, 1000000)\n", - "rm.OrderPicker.get_order(tick, date, 'C', 5, order_settings)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## SAMPLE ORDER" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "tick = 'BAC'\n", - "date = '2023-07-24'\n", - "start = (pd.to_datetime(date) - BDay(30)).strftime('%Y-%m-%d')\n", - "right = 'C'\n", - "order_settings = {\n", - " 'type': 'spread',\n", - " 'specifics': [\n", - " {'direction': 'long', 'rel_strike': 1.0, 'dte': 365, 'moneyness_width': 0.15},\n", - " # {'direction': 'short', 'rel_strike': 0.85, 'dte': 365, 'moneyness_width': 0.15} \n", - " ],\n", - " 'name': 'vertical_spread'\n", - " }" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## MULTIPROCESSING FUNCTION" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "from typing import List, Dict\n", - "from abc import ABC, abstractmethod\n", - "from pathos.multiprocessing import ProcessingPool as Pool\n", - "from pathos.multiprocessing import cpu_count\n", - "from pathos.pools import _ProcessPool\n", - "from threading import Thread\n", - "from functools import partial\n", - "from concurrent.futures import ThreadPoolExecutor\n", - "\n", - "shutdown_event = False\n", - "\n", - "def runProcesses(func, OrderedInputs: List[List], run_type: str = 'map') -> List:\n", - " global shutdown_event\n", - " try:\n", - "\n", - " pool = Pool(20)\n", - " pool.restart()\n", - " if run_type == 'map':\n", - " results = pool.map(func, *OrderedInputs)\n", - " elif run_type == 'amap':\n", - " results = pool.amap(func, *OrderedInputs)\n", - " elif run_type == 'uimap':\n", - " results = pool.uimap(func, *OrderedInputs)\n", - " elif run_type == 'imap':\n", - " results = pool.imap(func, *OrderedInputs)\n", - "\n", - " else:\n", - " raise ValueError(f'Run type {run_type} not recognized')\n", - "\n", - " except KeyboardInterrupt as e:\n", - "\n", - " shutdown_event = True\n", - " shutdown(pool)\n", - " raise\n", - "\n", - " except Exception as e:\n", - " print('Error occured: ', e)\n", - " shutdown(pool)\n", - "\n", - "\n", - " finally:\n", - " pool.close()\n", - " pool.join()\n", - "\n", - " return results\n", - "\n", - "\n", - "\n", - "def shutdown(pool):\n", - " global shutdown_event\n", - " shutdown_event\n", - " shutdown_event = True\n", - " pool.terminate()\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## RELEVANT FUNCTIONS" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "def return_closePrice(id, date):\n", - " global close_cache, spot_cache\n", - " cache_key = f\"{id}_{date}\"\n", - " close_data = close_cache[cache_key]\n", - " close_data = close_data[~close_data.index.duplicated(keep = 'first')]\n", - " close = close_data['Midpoint'][date]\n", - " return close\n", - "\n", - "\n", - "def load_chain(date, ticker, print_stderr = False):\n", - " print(date, ticker) if print_stderr else None\n", - " ## Get both calls and puts per moneyness. For 1 Moneyness, both will most be available. If not, if one is False, other True. \n", - " ## We will need to get two rows. \n", - " chain_key = f\"{date}_{ticker}\"\n", - " with Context(end_date = date):\n", - " if chain_key in chain_cache:\n", - " Option_Chain = chain_cache[chain_key]\n", - " else:\n", - " start_time = time.time()\n", - " Stock_obj = Stock(ticker, run_chain = False)\n", - " end_time = time.time()\n", - " print(f\"Time taken to get stock object: {end_time-start_time}\") if print_stderr else None\n", - " Option_Chain = Stock_obj.option_chain()\n", - " Spot = Stock_obj.spot(ts = False)\n", - " Spot = list(Spot.values())[0]\n", - " Option_Chain['Spot'] = Spot\n", - " Option_Chain['q'] = Stock_obj.div_yield()\n", - " Option_Chain['r'] = Stock_obj.rf_rate\n", - " chain_cache[chain_key] = Option_Chain\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "def populate_cache(order_candidates, date = '2024-03-12',):\n", - "\n", - " global close_cache, oi_cache, spot_cache\n", - "\n", - " tempholder1 = {}\n", - " tempholder2 = {}\n", - "\n", - " ## Create necessary data structures\n", - " ## Looping through the order candidates to get the necessary data, and organize into a list of lists that will be passed to runProcesses function\n", - " for j, direction in enumerate(order_candidates):\n", - " for i,data in enumerate(order_candidates[direction]):\n", - " data[[ 'exp', 'strike', 'symbol']] = data[[ 'expiration', 'strike', 'ticker']]\n", - " start = (pd.to_datetime(date) - BDay(20)).strftime('%Y-%m-%d')\n", - " data[['end_date', 'start_date']] = date, start\n", - " data['exp'] = data['exp'].dt.strftime('%Y-%m-%d')\n", - " tempholder1[i+j] = (data[['symbol', 'end_date', 'exp', 'right', 'start_date', 'strike']].T.values.tolist())\n", - " tempholder2[i+j] = data[['symbol', 'right', 'exp','strike']].T.values.tolist()\n", - "\n", - " ## Extending lists, to ensure only one runProcesses call is made, instead of run per side\n", - " for i, data in tempholder1.items():\n", - " if i == 0:\n", - " OrderedList = data\n", - " tickOrderedList = tempholder2[i]\n", - " else:\n", - " for position, vars in enumerate(data):\n", - " OrderedList[position].extend(vars)\n", - " for position, vars in enumerate(tempholder2[i]):\n", - " tickOrderedList[position].extend(vars)\n", - "\n", - " \n", - " eod_results = (runProcesses(retrieve_eod_ohlc, OrderedList, 'imap'))\n", - " oi_results = (runProcesses(retrieve_openInterest, OrderedList, 'imap'))\n", - " tick_results = (runProcesses(generate_option_tick, tickOrderedList, 'imap'))\n", - " tick_results = list(set(tick_results))\n", - "\n", - "\n", - " ## Save to Dictionary Cache\n", - " for tick, eod, oi in zip(tick_results, eod_results, oi_results):\n", - " cache_key = f\"{tick}_{date}\"\n", - " close_cache[cache_key] = eod\n", - " oi_cache[cache_key] = oi\n", - "\n", - "\n", - " ## Test1: Run spot_cache process after close_cache has been populate.\n", - " \n", - " spot_results = list(runProcesses(return_closePrice, [tick_results, [date]*len(tick_results)], 'imap')) \n", - " for tick, spot in zip(tick_results, spot_results):\n", - " cache_key = f\"{tick}_{date}\"\n", - " spot_cache[cache_key] = spot\n", - "\n", - "\n", - " ## Test2: We will edit the populate spot_cache populate function to make an api call instead of using the cache.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "def produce_order_candidates(settings, tick, date, right = 'P'):\n", - " order_candidates = {'long': [], 'short': []}\n", - " for spec in settings['specifics']:\n", - " chain = chain_details(date, tick, spec['dte'], spec['rel_strike'], right, moneyness_width = spec['moneyness_width'])\n", - " order_candidates[spec['direction']].append(chain)\n", - " return order_candidates\n", - "\n", - "\n", - "def liquidity_check(id, date, pass_threshold = 250):\n", - " sample_id = deepcopy(get_option_specifics_from_key(id))\n", - " new_dict_keys = {'ticker': 'symbol', 'exp_date': 'exp', 'strike': 'strike', 'put_call': 'right'}\n", - " transfer_dict = {}\n", - " for k, v in sample_id.items():\n", - "\n", - " if k in new_dict_keys:\n", - " if k == 'strike':\n", - " transfer_dict[new_dict_keys[k]] = float(sample_id[k])\n", - " else:\n", - " transfer_dict[new_dict_keys[k]] = sample_id[k]\n", - "\n", - " start = (pd.to_datetime(date) - BDay(10)).strftime('%Y-%m-%d')\n", - " oi_data = retrieve_openInterest(**transfer_dict, end_date=date, start_date=start)\n", - " # print(f'Open Interest > {pass_threshold} for {id}:', oi_data.Open_interest.mean() )\n", - " return oi_data.Open_interest.mean() > pass_threshold\n", - "\n", - "\n", - "def available_close_check(id, date, threshold = 0.7):\n", - " cache_key = f\"{id}_{date}\"\n", - " sample_id = deepcopy(get_option_specifics_from_key(id))\n", - " new_dict_keys = {'ticker': 'symbol', 'exp_date': 'exp', 'strike': 'strike', 'put_call': 'right'}\n", - " transfer_dict = {}\n", - " for k, v in sample_id.items():\n", - " if k in new_dict_keys:\n", - " if k == 'strike':\n", - " transfer_dict[new_dict_keys[k]] = float(sample_id[k])\n", - " else:\n", - " transfer_dict[new_dict_keys[k]] = sample_id[k]\n", - " \n", - " if cache_key in close_cache:\n", - " close_data_sample = close_cache[cache_key]\n", - " else:\n", - " start = (pd.to_datetime(date) - BDay(30)).strftime('%Y-%m-%d')\n", - " close_data_sample = retrieve_eod_ohlc(**transfer_dict, start_date=start, end_date=date)\n", - " close_cache[cache_key] = close_data_sample\n", - " close_mask_series = close_data_sample.Close != 0\n", - " return close_mask_series.sum()/len(close_mask_series) > threshold\n", - "\n", - "\n", - "def get_structure_price(tradeables, direction_index, date, tick, right = 'P'):\n", - " pack_price = {}\n", - " pack_dataframe = pd.DataFrame()\n", - " pack_dataframe['close'] = 0\n", - "\n", - " for pack_i, pack in enumerate(tradeables):\n", - " pack_close = 0\n", - " for i, id in enumerate(pack):\n", - " if id not in spot_cache:\n", - " \n", - " cache_key = f\"{id}_{date}\"\n", - " sample_id = deepcopy(get_option_specifics_from_key(id))\n", - " new_dict_keys = {'ticker': 'symbol', 'exp_date': 'exp', 'strike': 'strike', 'put_call': 'right'}\n", - " transfer_dict = {}\n", - " for k, v in sample_id.items():\n", - " if k in new_dict_keys:\n", - " if k == 'strike':\n", - " transfer_dict[new_dict_keys[k]] = float(sample_id[k])\n", - " else:\n", - " transfer_dict[new_dict_keys[k]] = sample_id[k]\n", - " start = (pd.to_datetime(date) - BDay(30)).strftime('%Y-%m-%d')\n", - " close_data_sample = retrieve_eod_ohlc(**transfer_dict, start_date=start, end_date=date)\n", - " close_data_sample = close_data_sample[~close_data_sample.index.duplicated(keep = 'first')]\n", - " close = close_data_sample['Midpoint'][date]\n", - " spot_cache[cache_key] = close\n", - " else:\n", - " close = cache_key[id]\n", - " pack_close += close * direction_index[i]\n", - " pack_dataframe.at[pack_i, i] = id\n", - "\n", - " pack_dataframe.at[pack_i, 'close'] = pack_close\n", - " return pack_dataframe\n", - "\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "def chain_details(date, ticker, tgt_dte, tgt_moneyness, right = 'P', moneyness_width = 0.15, print_stderr = False):\n", - " return_dataframe = pd.DataFrame()\n", - " errors = {}\n", - " if not (is_USholiday(date) and not is_busday(date)):\n", - " try:\n", - " print(date, ticker) if print_stderr else None\n", - " ## Get both calls and puts per moneyness. For 1 Moneyness, both will most be available. If not, if one is False, other True. \n", - " ## We will need to get two rows. \n", - " chain_key = f\"{date}_{ticker}\"\n", - " with Context(end_date = date):\n", - " if chain_key in chain_cache:\n", - " Option_Chain = chain_cache[chain_key]\n", - " else:\n", - " start_time = time.time()\n", - " Stock_obj = Stock(ticker, run_chain = False)\n", - " end_time = time.time()\n", - " print(f\"Time taken to get stock object: {end_time-start_time}\") if print_stderr else None\n", - " Option_Chain = Stock_obj.option_chain()\n", - " Spot = Stock_obj.spot(ts = False)\n", - " Spot = list(Spot.values())[0]\n", - " Option_Chain['Spot'] = Spot\n", - " Option_Chain['q'] = Stock_obj.div_yield()\n", - " Option_Chain['r'] = Stock_obj.rf_rate\n", - " chain_cache[chain_key] = Option_Chain\n", - "\n", - " \n", - " Option_Chain_Filtered = Option_Chain[Option_Chain[right.upper()] == True]\n", - " \n", - " \n", - " if right == 'P':\n", - " Option_Chain_Filtered['relative_moneyness'] = Option_Chain_Filtered.index.get_level_values('strike')/Option_Chain_Filtered.Spot\n", - " elif right == 'C':\n", - " Option_Chain_Filtered['relative_moneyness'] = Option_Chain_Filtered.Spot/Option_Chain_Filtered.index.get_level_values('strike')\n", - " else:\n", - " raise ValueError(f'Right dne. recieved {right}')\n", - " Option_Chain_Filtered['moneyness_spread'] = (tgt_moneyness-Option_Chain_Filtered['relative_moneyness'])**2\n", - " Option_Chain_Filtered['dte_spread'] = (Option_Chain_Filtered.index.get_level_values('DTE')-tgt_dte)**2\n", - " Option_Chain_Filtered.sort_values(by=['dte_spread','moneyness_spread'], inplace = True)\n", - " Option_Chain_Filtered = Option_Chain_Filtered.loc[Option_Chain_Filtered['dte_spread'] == Option_Chain_Filtered['dte_spread'].min()]\n", - " if float(moneyness_width) == 0.0:\n", - " option_details = Option_Chain_Filtered.sort_values('moneyness_spread', ascending=False).head(1)\n", - " else:\n", - " option_details = Option_Chain_Filtered[(Option_Chain_Filtered['relative_moneyness'] >= tgt_moneyness-moneyness_width) & \n", - " (Option_Chain_Filtered['relative_moneyness'] <= tgt_moneyness+moneyness_width)]\n", - " \n", - " if option_details.empty:\n", - " return None\n", - " \n", - " option_details['build_date'] = date\n", - " option_details['ticker'] = ticker\n", - " option_details['moneyness'] = tgt_moneyness\n", - " option_details['TGT_DTE'] = tgt_dte\n", - " option_details.reset_index(inplace = True)\n", - " option_details.set_index('build_date', inplace = True)\n", - " option_details['right'] = right\n", - " option_details.drop(columns = ['C','P'], inplace = True)\n", - " option_details['option_id'] = option_details.apply(lambda x: generate_option_tick(symbol = x['ticker'], \n", - " exp = x['expiration'].strftime('%Y-%m-%d'), strike = float(x['strike']), right = x['right']), axis = 1)\n", - " return_dataframe = pd.concat([return_dataframe, option_details])\n", - " clear_context()\n", - " return_dataframe.drop_duplicates(inplace = True)\n", - "\n", - " except Exception as e:\n", - " raise\n", - "\n", - " return return_dataframe.sort_values('relative_moneyness', ascending=False)\n", - " else:\n", - " return None, errors\n", - " \n", - "\n", - "# details= chain_details('2024-03-12', 'TSLA', 365, 0.7, moneyness_width = 0.00)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## CREATING ORDERPICKER AND TESTING" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'result': 'SUCCESSFUL',\n", - " 'data': {'long': ['TSLA20250620000215C'],\n", - " 'short': ['TSLA20250620000235C'],\n", - " 'trade_id': '&L:TSLA20250620000215C&S:TSLA20250620000235C',\n", - " 'close': 9.674999999999997}}" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "class OrderPicker:\n", - " def __init__(self):\n", - " self.liquidity_threshold = 250\n", - " self.data_availability_threshold = 0.7\n", - " self.lookback = 30\n", - "\n", - " def get_order(self, \n", - " tick, \n", - " date,\n", - " right, \n", - " max_close,\n", - " order_settings):\n", - " \n", - " ## Create necessary data structures\n", - " direction_index = {}\n", - " str_direction_index = {}\n", - " for indx, v in enumerate(order_settings['specifics']):\n", - " if v['direction'] == 'long':\n", - " str_direction_index[indx] = 'long'\n", - " direction_index[indx] = 1\n", - " elif v['direction'] == 'short':\n", - " str_direction_index[indx] = 'short'\n", - " direction_index[indx] = -1\n", - "\n", - "\n", - " load_chain(date, 'TSLA')\n", - " order_candidates = produce_order_candidates(order_settings, tick, date, right)\n", - "\n", - " if any([x2 is None for x in order_candidates.values() for x2 in x]):\n", - " return {\n", - " 'result': ResultsEnum.MONEYNESS_TOO_TIGHT.value,\n", - " 'data': None\n", - " } \n", - "\n", - "\n", - " populate_cache(order_candidates, date=date)\n", - "\n", - "\n", - " for direction in order_candidates:\n", - " for i,data in enumerate(order_candidates[direction]):\n", - " data['liquidity_check'] = data.option_id.apply(lambda x: liquidity_check(x, date))\n", - " data = data[data.liquidity_check == True]\n", - " data['available_close_check'] = data.option_id.apply(lambda x: available_close_check(x, date))\n", - " order_candidates[direction][i] = data[data.available_close_check == True] \n", - "\n", - "\n", - "\n", - "\n", - " ## Filter Unique Combinations per leg.\n", - " unique_ids = {'long': [], 'short': []}\n", - " for direction in order_candidates:\n", - " for i,data in enumerate(order_candidates[direction]):\n", - " unique_ids[direction].append(data[(data.liquidity_check == True) & (data.available_close_check == True)].option_id.unique().tolist())\n", - "\n", - " ## Produce Tradeable Combinations\n", - " tradeable_ids = list(product(*unique_ids['long'], *unique_ids['short']))\n", - " tradeable_ids, unique_ids \n", - "\n", - " ## Keep only unique combinations. Not repeating a contract.\n", - " filtered = [t for t in tradeable_ids if len(set(t)) == len(t)]\n", - "\n", - " ## Get the price of the structure\n", - " ## Using List Comprehension to sum the prices of the structure per index\n", - " results = [\n", - " (*items, sum([direction_index[i] * spot_cache[f'{item}_{date}'] for i, item in enumerate(items)])) for items in filtered\n", - " ]\n", - "\n", - " ## Convert to DataFrame, and sort by the price of the structure.\n", - " return_dataframe = pd.DataFrame(results)\n", - " cols = return_dataframe.columns.tolist()\n", - " cols[-1] = 'close'\n", - " return_dataframe.columns= cols\n", - " return_dataframe = return_dataframe[(return_dataframe.close<= max_close) & (return_dataframe.close> 0)].sort_values('close', ascending = False).head(1)\n", - "\n", - "\n", - " if return_dataframe.empty:\n", - " return {\n", - " 'result': ResultsEnum.MONEYNESS_TOO_TIGHT.value,\n", - " 'data': None\n", - " } \n", - " \n", - " ## Rename the columns to the direction names\n", - " return_dataframe.columns = list(str_direction_index.values()) + ['close']\n", - " return_order = return_dataframe[list(str_direction_index.values())].to_dict(orient = 'list')\n", - " return_order\n", - "\n", - " ## Create the trade_id with the direction and the id of the contract.\n", - " id = ''\n", - " for k, v in return_order.items():\n", - " id += f\"&{k[0].upper()}:{v[0]}\"\n", - "\n", - " return_order['trade_id'] = id\n", - " return_order['close'] = return_dataframe.close.values[0]\n", - " return_dict = {\n", - " 'result': ResultsEnum.SUCCESSFUL.value,\n", - " 'data': return_order\n", - " }\n", - "\n", - "\n", - " return return_dict\n", - "\n", - "\n", - "order_settings = {\n", - " 'type': 'spread',\n", - " 'specifics': [\n", - " {'direction': 'long', 'rel_strike': 1.0, 'dte': 365, 'moneyness_width': 0.10},\n", - " {'direction': 'short', 'rel_strike': 0.85, 'dte': 365, 'moneyness_width': 0.10} \n", - " ],\n", - " 'name': 'vertical_spread',\n", - " }\n", - "\n", - "\n", - "tick = 'TSLA'\n", - "date = '2024-07-24'\n", - "start = (pd.to_datetime(date) - BDay(30)).strftime('%Y-%m-%d')\n", - "right = 'P'\n", - "\n", - "\n", - "picker = OrderPicker()\n", - "er = picker.get_order(tick, date, 'C', 10, order_settings)\n", - "er" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[1, 4, 9, 16, 25]" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from multiprocessing import set_start_method\n", - "set_start_method(\"fork\", force = True)\n", - "from trade.helpers.pools import runProcesses\n", - "\n", - "def test_func(x):\n", - " return x**2\n", - "\n", - "if __name__ == '__main__':\n", - " results = runProcesses(test_func, [[1,2,3,4,5]], 'imap')\n", - "list(results)" - ] - }, - { - "cell_type": "code", - "execution_count": 424, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'L': ['TSLA20250321000165C'],\n", - " 'S': ['TSLA20250321000200C'],\n", - " 'trade_id': '&L:TSLA20250321000165C&S:TSLA20250321000200C',\n", - " 'close': 9.674999999999997}" - ] - }, - "execution_count": 424, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "class RiskManager:\n", - " def __init__(self,\n", - " bars,\n", - " events,\n", - " initial_capital,\n", - " ):\n", - " self.bars = bars\n", - " self.events = events\n", - " self.initial_capital = initial_capital\n", - " # self.symbol_list = self.bars.symbol_list\n", - " self.OrderPicker = OrderPicker()\n", - "\n", - "\n", - " def get_order(self, symbol, date, order_settings):\n", - " pass\n", - "\n", - "\n", - "\n", - "rm = RiskManager(None, None, 1000000)\n", - "rm.OrderPicker.get_order(tick, date, 'C', 10, order_settings)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## DRY RUN" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ - { - "ename": "TypeError", - "evalue": "'NoneType' object is not subscriptable", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[35], line 31\u001b[0m\n\u001b[1;32m 27\u001b[0m load_chain(date, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mTSLA\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m 28\u001b[0m order_candidates \u001b[38;5;241m=\u001b[39m produce_order_candidates(order_settings, tick, date, right)\n\u001b[0;32m---> 31\u001b[0m \u001b[43mpopulate_cache\u001b[49m\u001b[43m(\u001b[49m\u001b[43morder_candidates\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdate\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdate\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 34\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m direction \u001b[38;5;129;01min\u001b[39;00m order_candidates:\n\u001b[1;32m 35\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i,data \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28menumerate\u001b[39m(order_candidates[direction]):\n", - "Cell \u001b[0;32mIn[12], line 12\u001b[0m, in \u001b[0;36mpopulate_cache\u001b[0;34m(order_candidates, date)\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m j, direction \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28menumerate\u001b[39m(order_candidates):\n\u001b[1;32m 11\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i,data \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28menumerate\u001b[39m(order_candidates[direction]):\n\u001b[0;32m---> 12\u001b[0m data[[ \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mexp\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mstrike\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124msymbol\u001b[39m\u001b[38;5;124m'\u001b[39m]] \u001b[38;5;241m=\u001b[39m \u001b[43mdata\u001b[49m\u001b[43m[\u001b[49m\u001b[43m[\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mexpiration\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mstrike\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mticker\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m]\u001b[49m\n\u001b[1;32m 13\u001b[0m start \u001b[38;5;241m=\u001b[39m (pd\u001b[38;5;241m.\u001b[39mto_datetime(date) \u001b[38;5;241m-\u001b[39m BDay(\u001b[38;5;241m20\u001b[39m))\u001b[38;5;241m.\u001b[39mstrftime(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m%\u001b[39m\u001b[38;5;124mY-\u001b[39m\u001b[38;5;124m%\u001b[39m\u001b[38;5;124mm-\u001b[39m\u001b[38;5;132;01m%d\u001b[39;00m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m 14\u001b[0m data[[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mend_date\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mstart_date\u001b[39m\u001b[38;5;124m'\u001b[39m]] \u001b[38;5;241m=\u001b[39m date, start\n", - "\u001b[0;31mTypeError\u001b[0m: 'NoneType' object is not subscriptable" - ] - } - ], - "source": [ - "max_close = 5\n", - "\n", - "\n", - "order_settings = {\n", - " 'type': 'spread',\n", - " 'specifics': [\n", - " {'direction': 'long', 'rel_strike': 1.0, 'dte': 365, 'moneyness_width': 0.01},\n", - " {'direction': 'short', 'rel_strike': 0.85, 'dte': 365, 'moneyness_width': 0.01} \n", - " ],\n", - " 'name': 'vertical_spread'\n", - " }\n", - "\n", - "\n", - "\n", - "\n", - "direction_index = {}\n", - "str_direction_index = {}\n", - "for indx, v in enumerate(order_settings['specifics']):\n", - " if v['direction'] == 'long':\n", - " str_direction_index[indx] = 'L'\n", - " direction_index[indx] = 1\n", - " elif v['direction'] == 'short':\n", - " str_direction_index[indx] = 'S'\n", - " direction_index[indx] = -1\n", - "\n", - "\n", - "load_chain(date, 'TSLA')\n", - "order_candidates = produce_order_candidates(order_settings, tick, date, right)\n", - "\n", - "if any([x2 is None for x in order_candidates.values() for x2 in x]):\n", - " return {\n", - " 'result': \"MONEYNESS_TOO_TIGHT\",\n", - " } \n", - "\n", - "\n", - "populate_cache(order_candidates, date=date)\n", - "\n", - "\n", - "for direction in order_candidates:\n", - " for i,data in enumerate(order_candidates[direction]):\n", - " data['liquidity_check'] = data.option_id.apply(lambda x: liquidity_check(x, date))\n", - " data = data[data.liquidity_check == True]\n", - " data['available_close_check'] = data.option_id.apply(lambda x: available_close_check(x, date))\n", - " order_candidates[direction][i] = data[data.available_close_check == True] \n", - "\n", - "\n", - "\n", - "## Filter Unique Combinations per leg.\n", - "unique_ids = {'long': [], 'short': []}\n", - "for direction in order_candidates:\n", - " for i,data in enumerate(order_candidates[direction]):\n", - " unique_ids[direction].append(data[(data.liquidity_check == True) & (data.available_close_check == True)].option_id.unique().tolist())\n", - "\n", - "## Produce Tradeable Combinations\n", - "tradeable_ids = list(product(*unique_ids['long'], *unique_ids['short']))\n", - "tradeable_ids, unique_ids \n", - "\n", - "## Keep only unique combinations. Not repeating a contract.\n", - "filtered = [t for t in tradeable_ids if len(set(t)) == len(t)]\n", - "\n", - "## Get the price of the structure\n", - "## Using List Comprehension to sum the prices of the structure per index\n", - "results = [\n", - " (*items, sum([direction_index[i] * spot_cache[f'{item}_{date}'] for i, item in enumerate(items)])) for items in filtered\n", - "]\n", - "\n", - "## Convert to DataFrame, and sort by the price of the structure.\n", - "return_dataframe = pd.DataFrame(results)\n", - "cols = return_dataframe.columns.tolist()\n", - "cols[-1] = 'close'\n", - "return_dataframe.columns= cols\n", - "return_dataframe = return_dataframe[(return_dataframe.close<= max_close) & (return_dataframe.close> 0)].sort_values('close', ascending = False).head(1)\n", - "\n", - "## Rename the columns to the direction names\n", - "return_dataframe.columns = list(str_direction_index.values()) + ['close']\n", - "return_order = return_dataframe[list(str_direction_index.values())].to_dict(orient = 'list')\n", - "return_order\n", - "\n", - "## Create the trade_id with the direction and the id of the contract.\n", - "id = ''\n", - "for k, v in return_order.items():\n", - " id += f\"&{k}:{v[0]}\"\n", - "\n", - "return_order['trade_id'] = id\n", - "return_order['close'] = return_dataframe.close.values[0]\n", - "\n", - "return_order" - ] - }, - { - "cell_type": "code", - "execution_count": 73, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[0;31mType:\u001b[0m dict\n", - "\u001b[0;31mString form:\u001b[0m {}\n", - "\u001b[0;31mLength:\u001b[0m 0\n", - "\u001b[0;31mDocstring:\u001b[0m \n", - "dict() -> new empty dictionary\n", - "dict(mapping) -> new dictionary initialized from a mapping object's\n", - " (key, value) pairs\n", - "dict(iterable) -> new dictionary initialized as if via:\n", - " d = {}\n", - " for k, v in iterable:\n", - " d[k] = v\n", - "dict(**kwargs) -> new dictionary initialized with the name=value pairs\n", - " in the keyword argument list. For example: dict(one=1, two=2)" - ] - } - ], - "source": [ - "from trade.helpers.types import PositionData\n", - "def prineter(x,y) -> PositionData:\n", - " return " - ] - }, - { - "cell_type": "code", - "execution_count": 80, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'long': [3]}" - ] - }, - "execution_count": 80, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from typing import TypedDict\n", - "class PositionData( TypedDict): \n", - " long: list[str]\n", - " short: list[str]\n", - "\n", - " def __setitem__(self, key, value):\n", - " if (key == 'long' or key == 'short') and not isinstance(value, list):\n", - " raise ValueError(f'{key} must be a list')\n", - " \n", - " if key == 'long':\n", - " self.long = value\n", - " elif key == 'short':\n", - " self.short = value\n", - " else:\n", - " raise ValueError(f'Key {key} not recognized')\n", - " super().__setitem__(key, value)\n", - "\n", - "rr = PositionData()\n", - "rr['long'] = [3]\n", - "rr" - ] - }, - { - "cell_type": "code", - "execution_count": 82, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "John\n" - ] - } - ], - "source": [ - "from typing import TypedDict\n", - "\n", - "class Person(TypedDict):\n", - " name: str\n", - " age: int\n", - "\n", - "# Static type checking\n", - "person: Person = {\"name\": \"John\", \"age\": 30} # OK\n", - "person = {\"name\": \"John\"} # Error (age is missing)\n", - "\n", - "# Runtime behavior\n", - "print(person['name']) # No runtime type enforcement, behaves like a regular dictionary\n" - ] - }, - { - "cell_type": "code", - "execution_count": 86, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'name': 'John'}" - ] - }, - "execution_count": 86, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "person: Person = {\"name\": \"John\", \"age\": 30}\n", - "person = {\"name\": \"John\"} \n", - "person" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
LSclose
\n", - "
" - ], - "text/plain": [ - "Empty DataFrame\n", - "Columns: [L, S, close]\n", - "Index: []" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "return_dataframe" - ] - }, - { - "cell_type": "code", - "execution_count": 92, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Starting task: https://api.github.com\n", - "Starting task: https://api.spacexdata.com/v4/launches/latest\n", - "Starting task: https://jsonplaceholder.typicode.com/todos/1\n", - "Completed task: https://api.github.com\n", - "Completed task: https://api.spacexdata.com/v4/launches/latest\n", - "Completed task: https://jsonplaceholder.typicode.com/todos/1\n", - "{'current_user_url': 'https://api.github.com/user', 'current_user_authorizations_html_url': 'https://github.com/settings/connections/applications{/client_id}', 'authorizations_url': 'https://api.github.com/authorizations', 'code_search_url': 'https://api.github.com/search/code?q={query}{&page,per_page,sort,order}', 'commit_search_url': 'https://api.github.com/search/commits?q={query}{&page,per_page,sort,order}', 'emails_url': 'https://api.github.com/user/emails', 'emojis_url': 'https://api.github.com/emojis', 'events_url': 'https://api.github.com/events', 'feeds_url': 'https://api.github.com/feeds', 'followers_url': 'https://api.github.com/user/followers', 'following_url': 'https://api.github.com/user/following{/target}', 'gists_url': 'https://api.github.com/gists{/gist_id}', 'hub_url': 'https://api.github.com/hub', 'issue_search_url': 'https://api.github.com/search/issues?q={query}{&page,per_page,sort,order}', 'issues_url': 'https://api.github.com/issues', 'keys_url': 'https://api.github.com/user/keys', 'label_search_url': 'https://api.github.com/search/labels?q={query}&repository_id={repository_id}{&page,per_page}', 'notifications_url': 'https://api.github.com/notifications', 'organization_url': 'https://api.github.com/orgs/{org}', 'organization_repositories_url': 'https://api.github.com/orgs/{org}/repos{?type,page,per_page,sort}', 'organization_teams_url': 'https://api.github.com/orgs/{org}/teams', 'public_gists_url': 'https://api.github.com/gists/public', 'rate_limit_url': 'https://api.github.com/rate_limit', 'repository_url': 'https://api.github.com/repos/{owner}/{repo}', 'repository_search_url': 'https://api.github.com/search/repositories?q={query}{&page,per_page,sort,order}', 'current_user_repositories_url': 'https://api.github.com/user/repos{?type,page,per_page,sort}', 'starred_url': 'https://api.github.com/user/starred{/owner}{/repo}', 'starred_gists_url': 'https://api.github.com/gists/starred', 'topic_search_url': 'https://api.github.com/search/topics?q={query}{&page,per_page}', 'user_url': 'https://api.github.com/users/{user}', 'user_organizations_url': 'https://api.github.com/user/orgs', 'user_repositories_url': 'https://api.github.com/users/{user}/repos{?type,page,per_page,sort}', 'user_search_url': 'https://api.github.com/search/users?q={query}{&page,per_page,sort,order}'}\n", - "{'fairings': None, 'links': {'patch': {'small': 'https://images2.imgbox.com/eb/d8/D1Yywp0w_o.png', 'large': 'https://images2.imgbox.com/33/2e/k6VE4iYl_o.png'}, 'reddit': {'campaign': None, 'launch': 'https://www.reddit.com/r/spacex/comments/xvm76j/rspacex_crew5_launchcoast_docking_discussion_and/', 'media': None, 'recovery': None}, 'flickr': {'small': [], 'original': []}, 'presskit': None, 'webcast': 'https://youtu.be/5EwW8ZkArL4', 'youtube_id': '5EwW8ZkArL4', 'article': None, 'wikipedia': 'https://en.wikipedia.org/wiki/SpaceX_Crew-5'}, 'static_fire_date_utc': None, 'static_fire_date_unix': None, 'net': False, 'window': None, 'rocket': '5e9d0d95eda69973a809d1ec', 'success': True, 'failures': [], 'details': None, 'crew': ['62dd7196202306255024d13c', '62dd71c9202306255024d13d', '62dd7210202306255024d13e', '62dd7253202306255024d13f'], 'ships': [], 'capsules': ['617c05591bad2c661a6e2909'], 'payloads': ['62dd73ed202306255024d145'], 'launchpad': '5e9e4502f509094188566f88', 'flight_number': 187, 'name': 'Crew-5', 'date_utc': '2022-10-05T16:00:00.000Z', 'date_unix': 1664985600, 'date_local': '2022-10-05T12:00:00-04:00', 'date_precision': 'hour', 'upcoming': False, 'cores': [{'core': '633d9da635a71d1d9c66797b', 'flight': 1, 'gridfins': True, 'legs': True, 'reused': False, 'landing_attempt': True, 'landing_success': True, 'landing_type': 'ASDS', 'landpad': '5e9e3033383ecbb9e534e7cc'}], 'auto_update': True, 'tbd': False, 'launch_library_id': 'f33d5ece-e825-4cd8-809f-1d4c72a2e0d3', 'id': '62dd70d5202306255024d139'}\n", - "{'userId': 1, 'id': 1, 'title': 'delectus aut autem', 'completed': False}\n", - "Total time taken: 0.1384739875793457 seconds\n" - ] - } - ], - "source": [ - "import aiohttp\n", - "import asyncio\n", - "import time\n", - "\n", - "async def fetch_data(session, url):\n", - " print(f\"Starting task: {url}\")\n", - " async with session.get(url) as response:\n", - " data = await response.json()\n", - " print(f\"Completed task: {url}\")\n", - " return data\n", - "\n", - "async def main():\n", - " urls = [\n", - " 'https://api.github.com',\n", - " 'https://api.spacexdata.com/v4/launches/latest',\n", - " 'https://jsonplaceholder.typicode.com/todos/1'\n", - " ]\n", - " \n", - " async with aiohttp.ClientSession() as session:\n", - " tasks = [fetch_data(session, url) for url in urls]\n", - " results = await asyncio.gather(*tasks)\n", - " \n", - " for result in results:\n", - " print(result)\n", - "\n", - "if __name__ == '__main__':\n", - " start_time = time.time()\n", - " asyncio.run(main())\n", - " print(f\"Total time taken: {time.time() - start_time} seconds\")\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Steps to producing an order:\n", - "\n", - "- S1: RM recieves order settings from PM\n", - "- S2: RM produces a dataframe of potential options based on settings (if two legs produce two dataframes)\n", - "- S3: RM assesses if option passes all checks\n", - " - C1: Minimum Available close\n", - " - C2: Liquidity (Open Interest)\n", - " - C2.5: (for Spreads only) Ensure both legs are not the same\n", - " - Optional, to extend:\n", - " - C3: Bid-Ask Spread\n", - " \n", - "- S4: Return picked order to portfolio manager, which places the order. \n", - "- Example:\n", - " {'long': [optionid or {'strike', 'exp'}], 'short' : []}" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import os\n", - "eval(os.environ['ASYNC'])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "['Delta', 'Gamma', 'Vega', 'Theta']\n", - "IDS = []\n", - "ID_SAVE_FOLDER = Path(os.environ['WORK_DIR']) / '.cache'\n", - "ID_SAVE_FILE = ID_SAVE_FOLDER / 'position_data.csv'\n", - "_id = '&L:META20240920C430&S:META20240920C435'\n", - "data = rm.position_data[_id].copy()\n", - "data_col = ['Delta', 'Gamma', 'Vega', 'Theta', 'Midpoint']\n", - "def register_info_stack(id, data, data_col):\n", - " \"\"\"\n", - " Register the information stack for a given position ID.\n", - " \n", - " Parameters:\n", - " - id: The position ID.\n", - " - data: The DataFrame containing position data.\n", - " \n", - " Returns:\n", - " - info: A dictionary containing the registered information.\n", - " \"\"\"\n", - " if not isinstance(data, pd.DataFrame):\n", - " raise ValueError(\"Data must be a pandas DataFrame.\")\n", - " \n", - "\n", - " info = {}\n", - " info['ID'] = id\n", - " for k in data_col:\n", - " info[f'{k.upper()}_SKIP'] = data[f\"{k}_skip_day\"].sum()\n", - " copy_cat = data[f\"{k}_skip_day\"].copy().to_frame()\n", - " copy_cat['streak_id'] = copy_cat[f\"{k}_skip_day\"].ne(copy_cat[f\"{k}_skip_day\"].shift()).cumsum()\n", - " copy_cat['streak'] = copy_cat.groupby('streak_id').cumcount() + 1\n", - " info[f'{k.upper()}_MAX_STREAK'] = copy_cat[copy_cat[f\"{k}_skip_day\"] ==True].streak.max() if not copy_cat[copy_cat[f\"{k}_skip_day\"] ==True].streak.empty else 0\n", - " info['DATA_LEN'] = len(data)\n", - " info['DATETIME'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')\n", - " IDS.append(info)\n", - "\n", - "register_info_stack(_id, data, data_col)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Data saved to /Users/chiemelienwanisobi/cloned_repos/QuantTools/.cache/position_data.csv\n" - ] - } - ], - "source": [ - "def save_info_stack():\n", - " \"\"\"\n", - " Save the information stack to a CSV file.\n", - " \n", - " Parameters:\n", - " - IDS: List of dictionaries containing position information.\n", - " - id_save_file: Path to the CSV file where the information will be saved.\n", - " \"\"\"\n", - " if not IDS:\n", - " print(\"No data to save.\")\n", - " return\n", - " full_data = pd.read_csv(ID_SAVE_FILE) if ID_SAVE_FILE.exists() else pd.DataFrame()\n", - " df = pd.DataFrame(IDS)\n", - " full_data = pd.concat([full_data, df], ignore_index=True)\n", - " full_data.to_csv(ID_SAVE_FILE, index=False)\n", - " print(f\"Data saved to {ID_SAVE_FILE}\")\n", - "\n", - "save_info_stack()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Data saved to /Users/chiemelienwanisobi/cloned_repos/QuantTools/.cache/position_data.csv\n" - ] - } - ], - "source": [ - "\n", - "def mad_zscore_spike_flag(df, threshold=10, window=10, col ='Midpoint'):\n", - " \"\"\"\n", - " Add a flag to the DataFrame indicating if the change in 'Midpoint' exceeds the threshold.\n", - " \"\"\"\n", - " df = df.copy()\n", - " median = df[col].rolling(window).median()\n", - " mad = lambda x: np.median(np.abs(x - np.median(x))) ## lambda function that calculates median absolute deviation. x is a series, therefore x - median(x)\n", - " rolling_mad = df[col].rolling(window).apply(mad) ## Apply function\n", - " zscore_like = (df[col] - median) / rolling_mad ## Z-score like calculation\n", - " return zscore_like.abs() > threshold\n", - "\n", - "def mad_band_spike_flag(df, threshold=2, window=20, col='Midpoint'): \n", - " \"\"\"\n", - " Add a flag to the DataFrame indicating if the change in 'Midpoint' exceeds the threshold.\n", - " \"\"\"\n", - " df = df.copy()\n", - " median = df[col].rolling(window).median()\n", - " mad = df[col].rolling(window).apply(lambda x: np.median(np.abs(x - np.median(x))))\n", - " return (df[col] - median).abs() > threshold * mad\n", - "\n", - "def quantile_band_spike_flag(df, window=20, upper_quantile=0.90, lower_quantile=0.10, col='Midpoint'):\n", - " \"\"\"\n", - " Add a flag to the DataFrame indicating if the change in 'Midpoint' exceeds the threshold.\n", - " \"\"\"\n", - " df = df.copy()\n", - " quantile = df[col].rolling(window).quantile(upper_quantile)\n", - " quantile_down = df[col].rolling(window).quantile(lower_quantile)\n", - " return (df[col] > quantile) | (df[col] < quantile_down)\n", - " \n", - "def add_skip_columns(df, id, skip_columns, window=15, skip_threshold=2.75):\n", - " \"\"\"\n", - " Adds skip columns to the DataFrame.\n", - " \"\"\"\n", - " for col in skip_columns:\n", - " ## EMA Smoothing + Zscore Fiter\n", - " logger.info(f\"Adding skip column for {col} with window {window} and threshold {skip_threshold}\")\n", - " if col not in df.columns:\n", - " logger.info(f\"Column {col} not found in DataFrame. Skipping...\")\n", - " continue\n", - "\n", - " ##ABS Zscore\n", - " df.loc[df[col] < 0 , col] = 0 ## NOTE: This is one time fix. Take it out\n", - " smooth = df[col].ewm(span=3).mean()\n", - " _zscore = (smooth - smooth.rolling(window).mean()) / smooth.rolling(window).std()\n", - " _thresh = _zscore.abs() > skip_threshold\n", - "\n", - " ## Percentage change\n", - " smooth_pct = df[col].pct_change().fillna(0)\n", - " _zscore_pct = (smooth_pct - smooth_pct.rolling(window).mean()) / smooth_pct.rolling(window).std()\n", - " _zscore_pct = _zscore_pct.fillna(0)\n", - " _zscore_pct.replace([np.inf, -np.inf], 0, inplace=True) ## Replace inf values with 0\n", - " _thresh_pct = _zscore_pct.abs() > skip_threshold\n", - "\n", - " ## Spike Detection\n", - " spike_flag = mad_band_spike_flag(df, threshold=skip_threshold, window = window, col=col)\n", - "\n", - " ## Window \n", - " shortened = df[col][:window]\n", - " pct_change = shortened.pct_change()\n", - " window_bool = pct_change.abs() > 1.5\n", - "\n", - " ## Zero Values\n", - " zero_bool = df[col] == 0\n", - "\n", - " \n", - " ## Combine both boolean masks\n", - " _combined = _thresh | spike_flag | window_bool| zero_bool | _thresh_pct\n", - "\n", - " df[f'{col}_skip_day']= _combined\n", - " df[f'{col}_skip_day_count'] = _combined.rolling(60).sum()\n", - " register_info_stack(id, df, skip_columns)\n", - " return df\n", - "add_skip_columns(data, _id, data_col, window=20, skip_threshold=3)\n", - "save_info_stack()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Signal function for `save_info_stack` added to signal number 15.\n" - ] - }, - { - "data": { - "text/plain": [ - "[{'ID': '&L:BA20240920C265&S:BA20240920C270',\n", - " 'DELTA_SKIP': 78,\n", - " 'DELTA_MAX_STREAK': 36,\n", - " 'GAMMA_SKIP': 118,\n", - " 'GAMMA_MAX_STREAK': 36,\n", - " 'VEGA_SKIP': 110,\n", - " 'VEGA_MAX_STREAK': 36,\n", - " 'THETA_SKIP': 240,\n", - " 'THETA_MAX_STREAK': 225,\n", - " 'MIDPOINT_SKIP': 93,\n", - " 'MIDPOINT_MAX_STREAK': 46,\n", - " 'DATA_LEN': 266,\n", - " 'DATETIME': '2025-06-11 22:54:31',\n", - " 'window': 20,\n", - " 'skip_threshold': 3}]" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "from EventDriven.riskmanager.utils import add_skip_columns, save_info_stack, get_current_saved_ids \n", - "_id = '&L:BA20240920C265&S:BA20240920C270'\n", - "data = rm.position_data[_id].copy()\n", - "data_col = ['Delta', 'Gamma', 'Vega', 'Theta', 'Midpoint']\n", - "data = add_skip_columns(data, _id, data_col, window=20, skip_threshold=3)\n", - "save_info_stack()\n", - "get_current_saved_ids()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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R3/5y1/Url073XHHHUpNTdX27dv18ssva926dZo8ebKaN28etXzx8fF6/fXXdd5550U1x/H07t1bt9xyi9xut1wul9atW6cXXnhBn3zyie655x41atQo2hFjhmdf+kpKSopSGn9t2rTRmjVrdN111ykhIUGSdOTIEa1evVopKSkntO2ampqwfO7F8uXLdeGFF2r58uX68ccf1bp16wZvy+12S1JYCupI7jtYUzh/FyPh8ccfV01NjW699VadcsopKi8v19dff60DBw5EO9px2a4YmTlzpuLi4vSXv/zFe4JISUlRp06ddPvtt2vu3LkaP368qqurNW/ePK1evVrl5eVq06aNRo0ape7du+vBBx+UJF1//fWSFNZ3OD169NCePXv02muv6eqrrw66zscff6zCwkLt3r1brVq10vDhw3XxxRdLkubMmaOioiL99a9/9XvO3XffrX79+ik/Pz8sOePi4pScnCxJat26tbKyspSdna2HHnpIK1euVG5uriorK/XSSy/ps88+U01NjbKysnTttdcqMzPTu53//Oc/WrBggbZt26bExET9+te/1t133x2WjL7WrVunBQsWaPv27XI6ncrOztZ1113nHX0oLS3VbbfdprvuukvLli3Tf//7X7Vr107jx49XdnZ22PP48t2Xvj777DPNnz9fO3bsUKtWrTR48GCNHj3ar9BzuVz661//qm+++UatWrXS1VdfrXPOOSds2Tp16qQ9e/bok08+0aBBgyQdG6lLSUlR27ZtvevVd//+4Q9/0Ntvv61NmzZp/PjxGjJkyAnlO3z4sNasWaMpU6bI5XJp5cqVGj16tKSfRzD//Oc/a86cOSopKVFmZqYmTJigjh07SpJWrlypF154QbfddpteeeUVlZSU6Omnn1ZqauoJ5ZLCt+8efPBBdejQQb/73e+8z6moqNCECRM0ceJE9ejR44SzBnPrrbfqoosu0ogRI7zL7r77bp199tkaO3aspGOXQSZMmKC1a9fqyy+/VOvWrXXNNdforLPOikimUPOZ6Zd+Fz2/Zy+88IJ3/WAj3gsWLNBbb72lI0eOKCcnRy1atNC6dev06KOPnnC+yspKffvtt5o0aZJOO+00SVLbtm3VpUsXv3V+6ZxdWFiozz77TOeff74WLlyo/fv3q0+fPrrpppvUtGnTE874S6wx3h4mBw4c0Jdffqnzzz/fW4h4JCcna+DAgVqzZo0Mw9D06dO1evVqXX/99Zo2bZpuvPFGJSYmKiUlRXfddZck6cknn9Szzz7rLUrCwel06oorrtBbb72lH374odb3t2zZomnTpiknJ0ePPfaYxowZo3nz5mnlypWSpEGDBmnTpk3avXu39znbt2/X999/r4EDB4YtZzDdu3dXRkaG9xrtE088ofLyck2cOFFTpkxRp06d9PDDD3ur8LVr1+qxxx7TGWecoYKCAj3wwAN+B0Y4HT58WHl5eZoyZYr+3//7f3I4HHrssce874Q9Xn31VV188cWaOnWq2rVrp6eeekpHjx6NSKZf8u2332r69Om68MIL9cQTT+jGG2/UypUrtXDhQr/15s2bp379+unRRx/VwIED9eSTT9b7ttH1NXToUO/vlyStWLGiVhFR3/37yiuv6KKLLtK0adPUq1evE862Zs0atW/fXunp6Ro0aJBWrFhR6/bVL730kq655hr97W9/U4sWLVRQUKCamhrv96uqqvT666/rpptu0hNPPKGWLVuecC6PcOy73NxcrVq1yu+zOz744AO1bt1a3bt3D1vWhpo/f7769+/vPZaffvrpmHinHW71+V38JR9++KEWLlyoq666SlOmTFFKSoreeeedsOVLTExUYmKiPv300zo/B+Z452xJ2r17tz766CPde++9mjhxorZu3arnnnsubDnrYqtipKSkRIZhqH379kG/3759e1VWVmrz5s366KOPdPPNN6tv37465ZRT1KNHD+Xk5MjpdHovn7Rs2VLJyclhrwj79u2rzMzMoHNElixZoh49eig/P1/p6ekaMmSIhg8frsWLF0uSfvWrXykjI0OrVq3yPufDDz9U165dTZmD0L59e5WWlmrDhg3atGmT7rzzTnXu3Fnt2rXTNddco6ZNm+rjjz+WJC1cuFA5OTkaO3asOnTooMzMTI0aNSoiuc455xz169dPaWlpyszM1M0336xt27bV+sN98cUXq0+fPkpPT9fYsWO1d+9ev8IuEtauXavf/va33v898cQTmj9/vkaOHKkhQ4bolFNOUc+ePXXZZZfp3XffrfVz5ebmKj09XZdffrk6d+6sZcuWhTXfueeeqw0bNmjv3r3au3evNmzY4H2n75ujPvt3xIgR6tevn1JTU9WqVasTzrZixQpvlt69e+vgwYNav3693zpjxoxRz5491bFjR912220qLy/3m9R49OhR/e53v1O3bt2Unp6uxo0bn3Auj3Dsu759+0o6NlLm8f7772vIkCFyOBxhy9pQgwcP1sCBA5WWlqYrrrhChw8f1qZNm6Idy3T1+V38JcuWLdOwYcM0dOhQpaenKz8/3zuCFw6NGjXSLbfcovfff1/XXXedHnjgAc2ZM0fff/+9JNXrnC0d+2Da2267TZmZmTrttNM0btw4rV69Wi6XK2xZg7HdZZr6KC0tldPp9A5lRcNVV12lhx56yHv5xWPnzp21hkC7deumpUuXyu12y+l0eqvy/Px874cQ5eXlmZLbMAw5HA5t3bpVhw8f1rhx4/y+f+TIEe8f961btyo3N9eUXCUlJZo3b542bdqk/fv3e991lpWV+R3wvl97Lp2Ul5fXWcCGw+mnn67x48d7Hzdu3Fh/+tOftGHDBr+RELfbrerqalVVVXn/YAZeQuratav35BIuSUlJOuOMM7Ry5UoZhqE+ffrUmtNS3/2blZUVtly7du3Spk2b9Kc//UnSsZNtTk6Oli9frtNPP927nu8+at68udLT07Vz507vsri4OGVkZIQtl69w7LuEhASde+65WrFihXJycrRlyxZt27bNMpM4ffddYmKimjRpovLy8igmMl99fxePt43zzz/fb1mXLl1UVFQUtpznnHOO+vTpow0bNqi4uFjr1q3T4sWLddNNN+nw4cPHPWdLx6Y1+M6Fyc7OlmEY2rVrV9DLzeFiq2IkLS1NDodDO3bs8L7b8LVz5041a9as1iWcaDjttNPUq1cvzZkzJ+Tr6gMGDNArr7yiLVu26MiRI/rhhx+Uk5MTmaABdu7cqdTUVB0+fFitWrXSpEmTaq3jGUkycz8XFBSobdu2mjBhglq1aiXDMHTXXXf5DddL8ptQ6XnXGembEDdu3LjWqNXhw4c1duxY9evXr9b60biN9LBhwzRz5kxJ8pu74FHf/ZuYmBi2TMuXL9fRo0c1YcIE7zLDMBQfHx80Y10SEhIiOsIQjn2Xm5uru+++Wz/88INWrlyp7t27+807iQSHw1Hrdz/YJcvAyerBnhcJ9c1nhuP9Llopa0JCgnr27KmePXsqPz9f//znP1VYWKjzzz//uOfsaLJVMdKiRQv17NlT77zzjvLy8vz+GLpcLq1atUrnnnuuOnbsKMMwtH79evXs2bPWdjx/sAKvh4fbVVddpbvvvlvp6eneZe3bt9fGjRv91tu4caPS09O9HQBt2rTRaaedplWrVunIkSPq2bNnWK+D16WoqEjbtm3TiBEj1KZNG7lcLjmdzjonA2ZkZOjrr7/W0KFDI5pr//792rVrlyZMmKBTTz1V0rEhSSvLysrSrl27jntp7b///a8GDx7s97hTp05hz9O7d2/V1NTI4XCod+/eft+Lxv49evSo3n//fV1zzTW1jtFHH31Uq1at8o5mFRcXe7tXDhw4oJKSkoiOdAUKx77r2LGjOnfurPfee0+rVq2q9e41EpKSkvyG3g8ePKjS0tKIv259WSVffX4X27Zt6x158BTkW7du9Vs3PT1dmzdv9jueN2/eHPH8HTp00GeffaasrKzjnrOlYyN2vp1CxcXFcjgcfn+nIsFWxYgkjRs3Tn/5y180efJkXXbZZUpNTdWOHTv00ksvqXXr1rriiivUvHlzDR48WM8884yuv/56ZWZmau/evSovL1dOTo7atm0rh8Ohzz//XH369FFCQkJY3/F5dOzYUYMGDdJbb73lXZaXl6f77rtP8+fPV05OjoqLi7Vs2TLdcMMNfs8dOHCgCgsLVVNTo2uvvTbs2WpqauRyufxae1977TX16dNHgwcPlsPhUHZ2th599FFdffXVateunfbt26e1a9eqb9++6ty5s/Lz8/XQQw8pLS1NOTk5crvdWrt2rd89VsKhWbNmatGihd599121atVKZWVleuWVV8L6GuF26aWXqqCgQCkpKTrnnHPkcDj0/fffa/v27br88su963300UfKysrSr3/9a61atUqbNm3SzTffHPY8TqdT06ZN837tKxr79/PPP1dlZaWGDRtW611bv379tGLFCm832oIFC9SiRQu1bNlSr776qlq0aBF0ZDRSwrXvhg0bplmzZqlx48am5O/evbtWrlypM888U82aNdO8efMscw8hyTr56vO7eP/99yshIUFz587VhRdeqE2bNvlNbJak4cOH63//93+VlZWlbt26ac2aNfr+++91yimnhCXn/v379cQTT2jo0KHKyMhQkyZNtHnzZr3++us666yz1KNHj+Oes6VjI7MzZszQb3/7Wx06dEjPP/+8+vfvH9FLNJINi5F27dppypQpKiws1LRp03TgwAElJyfr7LPP1pgxY7yTU2+44QbNnTtXM2fO1P79+5WSkuKdXNm6dWuNGTNGc+bM0TPPPKNzzz03YjcvGjt2rNasWeN9nJWVpT/+8Y8qLCzUggUL1KpVK40dO7bWpZxzzjlHs2bNktPpjMiJa926dbrxxhvVqFEjNWvWTBkZGbr++us1ePBg7wnhvvvu09y5c/WPf/xDFRUVSk5O1qmnnuodpTn99NN15513asGCBXrttdfUpEkT77vDcDAMQ40aNZLT6dQdd9yh559/XnfddZfS09N1/fXXBx2OtIrevXvr3nvv1YIFC/T666+rUaNGat++vYYNG+a3nuf3Y+bMmUpOTtYdd9yhDh06RCRTXUO10di/y5cvV48ePYJmOuecc7R48WLv3Jkrr7xSL7zwgre199577w3L/U1CEY59N3DgQL344osaMGBAxC5xeo4ZSRo5cqRKS0s1ZcoUNW3aVJdddlnUR0asmK8+v4s//PCDbr/9dr388st677331L17d40ZM0bPPvusd91BgwZpz549eumll1RdXa3+/ftryJAhYZsMnJiYqK5du2rp0qXas2ePjh49qjZt2ig3N1ejR4+Ww+E47jlbOjbdoV+/fvrb3/6mAwcO6Mwzz6z1ZjgS+NRexKzJkycrLS0tpPkDsI9I3Sk5WkpLS3X77bfrb3/7W1gnAvuy+jFj9Xzh9vDDDys5OVm33357tKNI+vk+I+G470morDMmB9TTgQMH9Pnnn2v9+vURuyEUYBbPJdFXX31V2dnZESlErH7MWD1fOFRVVWnJkiXavn27du7cqcLCQn399dd+c0hOZra7TAP7e+aZZ7R582bl5eXp7LPPjnYc4IRs3LhRDz74oNq1a+e94WK4Wf2YsXq+cHA4HPriiy+0cOFCVVdXKz09XXfddVfQJoqTEZdpAABAVHGZBgAARBXFCAAAiCqKEQAAEFVMYIVlLVq0SJ9++ql27typhIQEZWdn6+qrr/a7E+CRI0c0e/ZsrVmzRtXV1erVq5duuOEG7w16tm7dqtdee00bN25URUWFUlNT9Zvf/EYXXXRR0NfcsGGDJk2apF/96ldRaW8DgJMRxQgsa/369brgggvUuXNnHT16VHPnztUjjzyiJ554wntH3BdffFFr167VnXfeqaZNm2rmzJl6/PHH9fDDD0uStmzZopYtW+r2229XmzZttHHjRj377LNyOp0aPny43+tVVlZqxowZ6tGjR8Q/oRIA8DOKEVjW/fff7/f41ltv1Q033KAtW7botNNO08GDB7V8+XLdcccd6t69uyTplltu0R//+EcVFxcrOzu71h1NTznlFBUXF+uTTz6pVYz83//9nwYMGCCn0+n3ce4AgMhizghixsGDByXJe0v/LVu26OjRo343SWrfvr1SUlJUXFz8i9vxbMNjxYoV2rNnj8aMGROB5ACAX0Ixgpjgdrv1wgsvqFu3burYsaOkY5/EHBcXV+tW4C1btqzzMsvGjRv10Ucf6bzzzvMuKykp0Zw5c3T77bfX+rh0AEDkUYwgJsycOVPbt2/XH/7whwZvY9u2bZo6dary8/PVq1cvSceKnKefflpjxoyJ+EdkAwCCY84ILG/mzJlau3atHnzwQbVp08a7PDk5WTU1NaqsrPQbHSkvL6/1cdc7duzQww8/rPPOO0+XXnqpd/mhQ4e0efNmfffdd5o1a5akY58cahiGLr/8cv3lL3/xzkcBAEQGxQgsyzAMzZo1S59++qkmTZqk1NRUv+9nZWWpUaNG+vrrr3XOOedIknbt2qWysjJlZ2d719u+fbseeughDR48WFdccYXfNpo0aaLHHnvMb9k777yjoqIi3XnnnbVeEwAQfhQjsKyZM2dq1apVuueee9SkSRPvPJCmTZsqISFBTZs21bBhwzR79mw1b95cTZs21axZs5Sdne0tRrZt26aHHnpIvXr1Ul5enncbTqdTSUlJcjqd3jkoHklJSYqPj6+1HAAQGRQjsKx33nlHkjRp0iS/5bfccouGDBkiSbr22mvlcDj0+OOPq6amxnvTM4+PP/5YFRUV+vDDD/Xhhx96l7dt21YzZsyI+M8AADg+PrUXAABEFd00AAAgqihGAABAVFGMAACAqKIYAQAAUUUxAgAAoopiBAAARBXFCAAAiCqKEQCWV1paqrFjx2rlypXRjgIgArgDK3CSWblypf7xj394H8fHx6t58+bq2LGjzjjjDA0dOlRNmjQJebsbN27Ul19+qREjRvh9cGEoVq1apfLyco0YMaJBzwcQmyhGgJPU2LFjlZqaqqNHj8rlcmn9+vV68cUXtXTpUt1zzz3KyMgIaXsbN27U/PnzNWTIkBMqRrZv316rGGnbtq1efvllxcVxygLsiCMbOEmdccYZ6ty5s/fxqFGjVFRUpClTpmjq1KmaNm2aEhISopjwZw6HwzJZAIQfxQgAr+7du+vSSy/V3Llz9cEHH+i8887T999/ryVLlujbb7/Vvn371LRpU51xxhn67W9/qxYtWkiSCgsLNX/+fEnSbbfd5t3e9OnTlZqaKkn64IMPtHTpUu3YsUMJCQnq1auXrr76aqWkpEg69oGI69evl3Rs1Eb6+QMNS0tLddttt/l9SOKMGTP08ccfa9q0aXruuef0zTffqGnTpho1apSGDx+ubdu26fnnn9emTZvUokULXXnllRo4cKDfz1tZWal//etf+uSTT1ReXq42bdooNzdXl1xyiZxOptQBZqEYAeDn3HPP1dy5c/XVV1/pvPPO01dffaXS0lINGTJEycnJ2rFjh959913t2LFDkydPlsPhUL9+/VRSUqLVq1fr2muv9RYpSUlJkqSFCxdq3rx56t+/v3Jzc1VRUaG33npL//M//6OpU6eqWbNmGj16tA4ePKgffvhB1157rSQpMTHxF7O63W799a9/1amnnqqrr75aq1at0qxZs5SYmKi5c+dq0KBB6tevn/79739r+vTpys7O9hZHVVVVmjRpkn788Uedd955SklJ0caNGzV37ly5XC5dd911kdvJAPxQjADw06ZNGzVt2lR79uyRJF1wwQW6+OKL/dbp2rWrnnrqKW3YsEGnnnqqMjIy1KlTJ61evVpnn3229w++JO3du1eFhYW67LLLNHr0aO/yvn376t5779Xbb7+t0aNHq2fPnmrdurUqKyt17rnn1itrdXW1Bg0apFGjRkmSBg4cqAkTJuiZZ57RHXfcoZycHElSz5499Yc//EErV670jrosWbJEu3fv1tSpU9WuXTtJ0m9+8xu1bt1aixcvVl5ennfUBkBkMQ4JoJbExEQdOnRIkvzmahw5ckQVFRXq2rWrJOm777477rY++eQTGYahnJwcVVRUeP+XnJystLQ0ffPNNyeUNTc31/t1s2bNlJ6ersaNG6t///7e5enp6WrWrJlKS0u9yz7++GOdeuqpatasmV+uHj16yO1269tvvz2hXADqj5ERALUcPnxYLVu2lCQdOHBA//rXv7RmzRqVl5f7rXfw4MHjbmv37t0yDEO///3vg37/RDpk4uPjvZeCPJo2bao2bdrI4XDUWn7gwAHv45KSEn3//fe64YYbgm478GcFEDkUIwD8/PDDDzp48KBOOeUUSdK0adO0ceNGXXLJJcrMzFRiYqJ3robb7T7u9txutxwOh+67776gk0KPNy/kl9Q1ybQ+k08Nw1DPnj11ySWXBP1+enp6g3MBCA3FCAA/H3zwgSSpd+/eOnDggL7++muNHTtW+fn53nVKSkpqPS9wJMIjLS1NhmEoNTXVUn/gTznlFB0+fFg9e/aMdhTgpMecEQBeRUVFWrBggVJTUzVw4EDvCINhGH7rLV26tNZzGzduLKn2pZu+ffvK6XRq/vz5tbZjGIb279/vfZyYmFivSz/h0L9/fxUXF2vdunW1vldZWamjR4+akgMAIyPASeuLL77Qzp075Xa75XK59M033+irr75SSkqK7rnnHiUkJCghIUGnnnqqFi9erKNHj6p169b68ssv/SaCemRlZUmS5s6dqwEDBqhRo0Y688wzlZaWpssvv1xz5szR3r17dfbZZysxMVGlpaX67LPPvPf18GxjzZo1evHFF9W5c2clJibqrLPOisjPf8kll+g///mPCgoKNHjwYGVlZamqqkrbtm3Txx9/rBkzZtSajwIgMihGgJNUYWGhpGMTSD2fTXPttdfW+myaO+64Q7NmzdLbb7/tnWcxceJETZgwwW97Xbp00WWXXaZ///vfWrdunQzD0PTp05WYmKiRI0eqXbt2Wrp0qf71r39JklJSUtSzZ0+/YuP888/X1q1btXLlSi1dulRt27aNWDHSuHFjPfjgg1q4cKE+/vhjffDBB2rSpInS09M1duxYNW3aNCKvC6A2hxE4bgoAAGAi5owAAICoohgBAABRRTECAACiimIEAABEFcUIAACIKooRAAAQVRQjAAAgqihGAABAVFGMAACAqKIYAQAAUUUxAgAAoopiBAAARBXFCAAAiKr/D3Ez6HVBXyuyAAAAAElFTkSuQmCC", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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ejabDUII/P73v++wKbSrvpDOuGsy9aT5VEqJ0aNH46KLLurw+aysrG7HRUTeYTJCRC6++uorAMDYsWNRW1uLbdu2Yc6cOZg1a5Z+TlFRUbvXta1EaDIyMiClRFpamqF+wKenp6OxsRGjR48OdihExz32jBCRbvv27Xj33XeRlpaG008/Xa8wSCldzlu1alW710ZGRgJoP3QzYcIEmEwmrFixot11pJSoqanRH0dFRXk09OMLkyZNwp49e7B58+Z2z9XV1cFqtQYkDiJiZYTouPXjjz+isLAQNpsNFosFO3bswNatW5Gamor7778fERERiIiIwLBhw7By5UpYrVYkJydjy5YtLo2gmtzcXADA8uXLcdpppyEsLAwnn3wyMjIyMHfuXCxbtgxlZWUYP348oqKiUFpaio0bN+rremjXWLduHV5//XUMHjwYUVFROOWUU/zy97/ooovw/fffY9GiRZgyZQpyc3PR1NSEgoICrF+/Hi+99FK7fhQi8g8mI0THqfz8fACqgVTbm+a6665rtzfNnXfeiaVLl+K///2v3mfx4IMP4pZbbnG53gknnIArrrgCn332GTZv3gwpJRYvXoyoqChccsklyMzMxKpVq/DOO+8AAFJTUzF69GiXZOOcc87BwYMHsWbNGqxatQp9+/b1WzISGRmJhQsX4r333sP69evx1VdfITo6GllZWZgzZw5iYmL88r5E1J6QbeumRERERAHEnhEiIiIKKiYjREREFFRMRoiIiCiomIwQERFRUDEZISIioqBiMkJERERBxWSEiIiIgorJCBEREQUVkxEiIiIKKiYjREREFFRMRoiIiCiomIwQERFRUDEZISIioqD6//bY6/iaKHgdAAAAAElFTkSuQmCC", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "(data.Midpoint_skip_day * 1).plot()\n", - "plt.show()\n", - "data.Midpoint.plot()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
VegaVannaVolgaDeltaGammaThetaRhoMidpointCloseaskClosebidsrys0_close
Datetime
\n", - "
" - ], - "text/plain": [ - "Empty DataFrame\n", - "Columns: [Vega, Vanna, Volga, Delta, Gamma, Theta, Rho, Midpoint, Closeask, Closebid, s, r, y, s0_close]\n", - "Index: []" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "from EventDriven.riskmanager.utils import _clean_data\n", - "def load_position_data(self, opttick):\n", - " \"\"\"\n", - " Load position data for a given option tick.\n", - "\n", - " This function ONLY retrives the data for the option tick, it does not apply any splits or adjustments.\n", - " This function will NOT check for splits or special dividends. It will only retrieve the data for the given option tick.\n", - " \"\"\"\n", - " ## Check if the option tick is already processed\n", - " if opttick in self.processed_option_data:\n", - " return self.processed_option_data[opttick]\n", - "\n", - " ## Get Meta\n", - " meta = parse_option_tick(opttick)\n", - "\n", - " ## Generate data\n", - " data = generate_spot_greeks(self, opttick)\n", - " data = enrich_data(self, data, meta['ticker'])\n", - " self.processed_option_data[opttick] = data\n", - " return data\n", - "\n", - "def enrich_data(self, data, ticker):\n", - " \"\"\"\n", - " Enrich the data with additional information.\n", - " \"\"\"\n", - " data = _clean_data(data)\n", - " data = data[~data.index.duplicated(keep = 'last')]\n", - " data['s'] = self.chain_spot_timeseries[ticker]\n", - " data['r'] = self.rf_timeseries\n", - " data['y'] = self.dividend_timeseries[ticker]\n", - " data['s0_close'] = self.spot_timeseries[ticker]\n", - " return data\n", - " \n", - "def generate_spot_greeks(self, opttick):\n", - " \"\"\"\n", - " Generate spot greeks for a given option tick.\n", - " \"\"\"\n", - " meta = parse_option_tick(opttick)\n", - " data_manager = OptionDataManager(opttick=opttick)\n", - " greeks = data_manager.get_timeseries(start = self.start_date,\n", - " end = self.end_date,\n", - " interval = '1d',\n", - " type_ = 'greeks',).post_processed_data ## Multiply by the shift to account for splits\n", - " greeks_cols = [x for x in greeks.columns if 'Midpoint' in x]\n", - " greeks = greeks[greeks_cols]\n", - " greeks[greeks_cols] = greeks[greeks_cols].replace(0, np.nan).fillna(method = 'ffill') ## FFill NaN values and 0 Values\n", - " greeks.columns = [x.split('_')[1].capitalize() for x in greeks.columns]\n", - "\n", - " spot = data_manager.get_timeseries(start = self.start_date,\n", - " end = self.end_date,\n", - " interval = '1d',\n", - " type_ = 'spot',\n", - " extra_cols=['bid', 'ask']).post_processed_data ## Using chain spot data to account for splits\n", - " spot = spot[[self.option_price.capitalize()] + ['Closeask', 'Closebid']]\n", - " data = greeks.join(spot)\n", - " return data\n", - "\n", - "\n", - "def generate_option_data_for_trade(self, opttick, check_date):\n", - " \"\"\"\n", - " Generate option data for a given trade.\n", - " This function retrieve the option data to backtest on. Data will not be saved, as it will be applying splits and adjustments.\n", - " This function is written with the assumption that there is no cummulative splits. Expectation is only one split per option tick.\n", - " Obviously, this might not be the case if the option was alive for ~5 years or more. But most options are not alive for that long.\n", - " \"\"\"\n", - "\n", - " meta = parse_option_tick(opttick)\n", - "\n", - " ## Check if there's any split/special dividend\n", - " splits = self.splits.get(meta['ticker'], [])\n", - " dividends = self.special_dividends.get(meta['ticker'], {})\n", - " to_adjust_split = []\n", - "\n", - " ## To avoid loading multiple data to account for splits everytime, we check if the PM_date range includes the split date \n", - " for pack in splits:\n", - " if compare_dates.inbetween(\n", - " pack[0], \n", - " self.pm_start_date, \n", - " self.pm_end_date,\n", - " ):\n", - " pack = list(pack) ## Convert to list to append later\n", - " pack.append('SPLIT')\n", - " to_adjust_split.append(pack)\n", - "\n", - " for pack in dividends.items():\n", - " if compare_dates.inbetween(\n", - " pack[0], \n", - " self.pm_start_date, \n", - " self.pm_end_date,\n", - " ):\n", - " pack = list(pack)\n", - " pack.append('DIVIDEND')\n", - " to_adjust_split.append(pack)\n", - "\n", - " ## Sort the splits by date\n", - " to_adjust_split.sort(key=lambda x: x[0]) ## Sort by date\n", - "\n", - " ## If there are no splits, we can just load the data\n", - " if not to_adjust_split:\n", - " data = load_position_data(self, opttick).copy() ## Copy to avoid modifying the original data\n", - " return data[(data.index >= self.pm_start_date) & (data.index <= self.pm_end_date)]\n", - "\n", - " # If there are splits, we need to load the data for each tick after adjusting strikes\n", - " else:\n", - " adj_meta = meta.copy()\n", - " adj_strike = meta['strike']\n", - " logger.info(f\"Generating data for {opttick} with splits: {to_adjust_split}\")\n", - " ## Load the data for picked option first\n", - " first_set_data = load_position_data(self, opttick).copy() ## Copy to avoid modifying the original data\n", - " if compare_dates.is_before(check_date, to_adjust_split[0][0]):\n", - " first_set_data = first_set_data[first_set_data.index < to_adjust_split[0][0]]\n", - " else:\n", - " first_set_data = first_set_data[first_set_data.index >= to_adjust_split[0][0]]\n", - "\n", - " segments = []\n", - "\n", - " for event_date, factor, event_type in to_adjust_split:\n", - " if compare_dates.is_before(check_date, event_date):\n", - " # You're in the PRE-event regime\n", - " if event_type == 'SPLIT':\n", - " adj_strike /= factor\n", - " elif event_type == 'DIVIDEND':\n", - " adj_strike -= factor\n", - " else:\n", - " # You're in the POST-event regime\n", - " if event_type == 'SPLIT':\n", - " adj_strike *= factor\n", - " elif event_type == 'DIVIDEND':\n", - " adj_strike += factor\n", - "\n", - " adj_opttick = generate_option_tick_new(\n", - " symbol=adj_meta['ticker'],\n", - " strike=adj_strike,\n", - " right=adj_meta['put_call'],\n", - " exp=adj_meta['exp_date']\n", - " )\n", - " logger.info(f\"Adjusted option tick: {adj_opttick} for event {event_type} on {event_date} with factor {factor}\")\n", - "\n", - " # Load adjusted data\n", - " if adj_opttick not in self.processed_option_data:\n", - " adj_data = load_position_data(self, adj_opttick).copy()\n", - " else:\n", - " adj_data = self.processed_option_data[adj_opttick]\n", - "\n", - " # Slice around the event\n", - " if compare_dates.is_before(check_date, event_date):\n", - " adj_data = adj_data[adj_data.index >= event_date]\n", - " else:\n", - " adj_data = adj_data[adj_data.index < event_date]\n", - "\n", - " # Apply price transformation if SPLIT\n", - " if event_type == 'SPLIT':\n", - " cols = ['Midpoint', 'Closeask', 'Closebid']\n", - " if compare_dates.is_before(check_date, event_date):\n", - " adj_data[cols] *= factor\n", - " else:\n", - " adj_data[cols] /= factor\n", - " \n", - " segments.append(adj_data)\n", - "\n", - " \n", - " base_data = load_position_data(self, opttick).copy()\n", - " first_event_date = to_adjust_split[0][0] if to_adjust_split else self.pm_start_date\n", - " if compare_dates.is_before(check_date, first_event_date):\n", - " base_data = base_data[base_data.index < first_event_date]\n", - " \n", - " else:\n", - " base_data = base_data[base_data.index >= first_event_date]\n", - " \n", - " segments.insert(0, base_data)\n", - " final_data = pd.concat(segments).sort_index()\n", - " final_data = final_data[~final_data.index.duplicated(keep='last')]\n", - " final_data = final_data[(final_data.index >= self.pm_start_date) & (final_data.index <= self.pm_end_date)]\n", - " return final_data\n", - "\n", - "\n", - "'&L:NVDA20230915C195&S:NVDA20230915C200'\n", - "data = generate_option_data_for_trade(rm, 'NVDA20240719C62.5', '2024-06-11')\n", - "data" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "rm.position_data.filter_keys(lambda x: 'NVDA' in x)\n", - "rm.splits" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from trade.assets.helpers.utils import swap_ticker\n", - "def calculate_position_greeks(self, positionID, date):\n", - " \"\"\"\n", - " Calculate the greeks of a position\n", - "\n", - " date: Evaluation Date for the greeks (PS: This is not the pricing date)\n", - " positionID: str: position string. (PS: This function assumes ticker for position is the same)\n", - " \"\"\"\n", - " logger.info(f\"Calculate Greeks Dates Start: {self.start_date}, End: {self.end_date}, Position ID: {positionID}, Date: {date}\")\n", - " if positionID in self.position_data:\n", - " ## If the position data is already available, then we can skip this step\n", - " logger.info(f\"Position Data for {positionID} already available, skipping calculation\")\n", - " return self.position_data[positionID]\n", - " else:\n", - " logger.critical(f\"Position Data for {positionID} not available, calculating greeks. Load time ~5 minutes\")\n", - " ## Initialize the Long and Short Lists\n", - " long = []\n", - " short = []\n", - " threads = []\n", - " thread_input_list = [\n", - " [], []\n", - " ]\n", - "\n", - " date = pd.to_datetime(date) ## Ensure date is in datetime format\n", - " \n", - " ## First get position info\n", - " position_dict, positon_meta = self.parse_position_id(positionID)\n", - "\n", - " ## Now ensure that the spot and dividend data is available\n", - " for p in position_dict.values():\n", - " for s in p:\n", - " self.generate_data(swap_ticker(s['ticker']))\n", - " ticker = swap_ticker(s['ticker'])\n", - "\n", - " # @log_time(time_logger)\n", - " def get_timeseries(_id, direction):\n", - " logger.info(\"Calculate Greeks dates\")\n", - " logger.info(f\"Start Date: {self.start_date}\")\n", - " logger.info(f\"End Date: {self.end_date}\")\n", - " \n", - " print(f\"Calculating Greeks for {_id} on {date} in {direction} direction\")\n", - " data = self.generate_option_data_for_trade(_id, date) ## Generate the option data for the trade\n", - " print(data.head().index)\n", - " if direction == 'L':\n", - " long.append(data)\n", - " elif direction == 'S':\n", - " short.append(data)\n", - " else:\n", - " raise ValueError(f\"Position Type {_set[0]} not recognized\")\n", - " \n", - " return data\n", - "\n", - " ## Calculating IVs & Greeks for the options\n", - " for _set in positon_meta:\n", - " thread_input_list[0].append(_set[1]) ## Append the option id to the thread input list\n", - " thread_input_list[1].append(_set[0]) ## Append the direction to the thread input list\n", - " runThreads(get_timeseries, thread_input_list)\n", - " \n", - " position_data = sum(long) - sum(short)\n", - " position_data = position_data[~position_data.index.duplicated(keep = 'first')]\n", - " position_data.columns = [x.capitalize() for x in position_data.columns]\n", - " ## Retain the spot, risk free rate, and dividend yield for the position, after the greeks have been calculated & spread values subtracted\n", - " position_data['s0_close'] = self.spot_timeseries[ticker] ## Spot price at the time of the position\n", - " position_data['s'] = self.chain_spot_timeseries[ticker] ## Chain spot price at the time of the position\n", - " position_data['r'] = self.rf_timeseries ## Risk free rate at the time of the position\n", - " position_data['y'] = self.dividend_timeseries[ticker] ## Dividend yield at the time of the position\n", - " position_data['spread'] = position_data['Closeask'] - position_data['Closebid'] ## Spread is the difference between the ask and bid prices\n", - " position_data['spread_ratio'] = (position_data['spread'] / position_data['Midpoint'] ).abs().replace(np.inf, np.nan).fillna(0) ## Spread ratio is the spread divided by the midpoint price\n", - " position_data = add_skip_columns(position_data, positionID, ['Delta', 'Gamma', 'Vega', 'Theta', 'Midpoint'], window = 20, skip_threshold=3)\n", - " self.position_data[positionID] = position_data\n", - " return position_data\n", - " \n", - "calculate_position_greeks(rm, '&L:NVDA20240719C61.5&S:NVDA20240719C62.5', '2024-06-11')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2025-06-15 22:55:52 QuantTools.EventDriven.riskmanager.utils CRITICAL: Position Data for &L:NVDA20240719C625 not available, calculating greeks. Load time ~5 minutes\n", - "Calculating Greeks for NVDA20240719C625 on 2024-06-04 00:00:00 in L direction\n", - "Greeks Calculated for all options in the position\n" - ] - } - ], - "source": [ - "data=rm.calculate_position_greeks('&L:NVDA20240719C625', '2024-06-04')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "hovertemplate": "variable=Midpoint
Datetime=%{x}
value=%{y}", - "legendgroup": "Midpoint", - "line": { - "color": "#636efa", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "Midpoint", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": [ - "2024-01-01T00:00:00", - "2024-01-02T00:00:00", - "2024-01-03T00:00:00", - "2024-01-04T00:00:00", - "2024-01-05T00:00:00", - "2024-01-08T00:00:00", - "2024-01-09T00:00:00", - "2024-01-10T00:00:00", - "2024-01-11T00:00:00", - "2024-01-12T00:00:00", - "2024-01-15T00:00:00", - "2024-01-16T00:00:00", - "2024-01-17T00:00:00", - "2024-01-18T00:00:00", - "2024-01-19T00:00:00", - "2024-01-22T00:00:00", - "2024-01-23T00:00:00", - "2024-01-24T00:00:00", - "2024-01-25T00:00:00", - "2024-01-26T00:00:00", - "2024-01-29T00:00:00", - "2024-01-30T00:00:00", - "2024-01-31T00:00:00", - "2024-02-01T00:00:00", - "2024-02-02T00:00:00", - "2024-02-05T00:00:00", - "2024-02-06T00:00:00", - "2024-02-07T00:00:00", - "2024-02-08T00:00:00", - "2024-02-09T00:00:00", - "2024-02-12T00:00:00", - "2024-02-13T00:00:00", - "2024-02-14T00:00:00", - "2024-02-15T00:00:00", - "2024-02-16T00:00:00", - "2024-02-19T00:00:00", - "2024-02-20T00:00:00", - "2024-02-21T00:00:00", - "2024-02-22T00:00:00", - "2024-02-23T00:00:00", - "2024-02-26T00:00:00", - "2024-02-27T00:00:00", - "2024-02-28T00:00:00", - "2024-02-29T00:00:00", - "2024-03-01T00:00:00", - "2024-03-04T00:00:00", - "2024-03-05T00:00:00", - "2024-03-06T00:00:00", - "2024-03-07T00:00:00", - "2024-03-08T00:00:00", - "2024-03-11T00:00:00", - "2024-03-12T00:00:00", - "2024-03-13T00:00:00", - "2024-03-14T00:00:00", - "2024-03-15T00:00:00", - "2024-03-18T00:00:00", - "2024-03-19T00:00:00", - "2024-03-20T00:00:00", - "2024-03-21T00:00:00", - "2024-03-22T00:00:00", - "2024-03-25T00:00:00", - "2024-03-26T00:00:00", - "2024-03-27T00:00:00", - "2024-03-28T00:00:00", - "2024-03-29T00:00:00", - "2024-04-01T00:00:00", - "2024-04-02T00:00:00", - "2024-04-03T00:00:00", - "2024-04-04T00:00:00", - "2024-04-05T00:00:00", - "2024-04-08T00:00:00", - "2024-04-09T00:00:00", - "2024-04-10T00:00:00", - "2024-04-11T00:00:00", - "2024-04-12T00:00:00", - "2024-04-15T00:00:00", - "2024-04-16T00:00:00", - "2024-04-17T00:00:00", - "2024-04-18T00:00:00", - "2024-04-19T00:00:00", - "2024-04-22T00:00:00", - "2024-04-23T00:00:00", - "2024-04-24T00:00:00", - "2024-04-25T00:00:00", - "2024-04-26T00:00:00", - "2024-04-29T00:00:00", - "2024-04-30T00:00:00", - "2024-05-01T00:00:00", - "2024-05-02T00:00:00", - "2024-05-03T00:00:00", - "2024-05-06T00:00:00", - "2024-05-07T00:00:00", - "2024-05-08T00:00:00", - "2024-05-09T00:00:00", - "2024-05-10T00:00:00", - "2024-05-13T00:00:00", - "2024-05-14T00:00:00", - "2024-05-15T00:00:00", - "2024-05-16T00:00:00", - "2024-05-17T00:00:00", - "2024-05-20T00:00:00", - "2024-05-21T00:00:00", - "2024-05-22T00:00:00", - "2024-05-23T00:00:00", - "2024-05-24T00:00:00", - "2024-05-27T00:00:00", - "2024-05-28T00:00:00", - "2024-05-29T00:00:00", - "2024-05-30T00:00:00", - "2024-05-31T00:00:00", - "2024-06-03T00:00:00", - "2024-06-04T00:00:00", - "2024-06-05T00:00:00", - "2024-06-06T00:00:00", - "2024-06-07T00:00:00", - "2024-06-10T00:00:00", - "2024-06-11T00:00:00", - "2024-06-12T00:00:00", - "2024-06-13T00:00:00", - "2024-06-14T00:00:00", - "2024-06-17T00:00:00", - "2024-06-18T00:00:00", - "2024-06-19T00:00:00", - "2024-06-20T00:00:00", - "2024-06-21T00:00:00", - "2024-06-24T00:00:00", - "2024-06-25T00:00:00", - "2024-06-26T00:00:00", - "2024-06-27T00:00:00", - "2024-06-28T00:00:00", - "2024-07-01T00:00:00", - "2024-07-02T00:00:00", - "2024-07-03T00:00:00", - "2024-07-04T00:00:00", - "2024-07-05T00:00:00", - "2024-07-08T00:00:00", - "2024-07-09T00:00:00", - "2024-07-10T00:00:00", - "2024-07-11T00:00:00", - "2024-07-12T00:00:00", - "2024-07-15T00:00:00", - "2024-07-16T00:00:00", - "2024-07-17T00:00:00", - "2024-07-18T00:00:00", - "2024-07-19T00:00:00" - ], - "xaxis": "x", - "y": [ - 22.525, - 18.575, - 16.950000000000003, - 17.625, - 20.025, - 30.1, - 33.775000000000006, - 38.6, - 39.675, - 38.45, - 38.45, - 45.725, - 44.400000000000006, - 49, - 60.925, - 61.075, - 60.675, - 69.725, - 71.3, - 67.575, - 75.75, - 77.975, - 70.75, - 78.775, - 100.175, - 124.975, - 117.875, - 130.925, - 127.65, - 146.10000000000002, - 150, - 151, - 163.60000000000002, - 153.5, - 153.55, - 153.55, - 128.45, - 110.275, - 196.22500000000002, - 199.125, - 200.25, - 195.10000000000002, - 185.425, - 197.89999999999998, - 225.275, - 253.55, - 260.825, - 286.82500000000005, - 326.04999999999995, - 279.79999999999995, - 262.55, - 319.9, - 313.025, - 285.57500000000005, - 284.85, - 287.45, - 293.875, - 301.8, - 310.4, - 338.82500000000005, - 345.625, - 320.92499999999995, - 298.85, - 298.05, - 298.05, - 297.225, - 288.425, - 283.25, - 254.7, - 273.6, - 266.29999999999995, - 247.875, - 263.32500000000005, - 297.07500000000005, - 274.25, - 253.475, - 266.7, - 235.8, - 240.89999999999998, - 168.85000000000002, - 192.85, - 221.65, - 195.275, - 221.325, - 270.1, - 269.35, - 253.45, - 224.375, - 249.3, - 276.65, - 308.475, - 292.325, - 292, - 274.425, - 284.45000000000005, - 289.29999999999995, - 298.075, - 329.925, - 327.25, - 308.95, - 330.25, - 336.15, - 331.025, - 418.775, - 445.6, - 445.6, - 521.45, - 527.075, - 486.475, - 476.525, - 530.6, - 544.775, - 604.575, - 590.7, - 588, - 604, - 589, - 630.5, - 665.25, - 698.5, - 698, - 735, - 735, - 691.7500000000001, - 645, - 559.25, - 639, - 642.25, - 607, - 611.75, - 611.75, - 603.75, - 659.25, - 659.25, - 635, - 654.5, - 690.5, - 724.5, - 650.25, - 675.5, - 660, - 640, - 547.5, - 591, - 564.5 - ], - "yaxis": "y" - } - ], - "layout": { - "legend": { - "title": { - "text": "variable" - }, - "tracegroupgap": 0 - }, - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "heatmapgl": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmapgl" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "title": { - "text": "Midpoint Price for &L:NVDA20240719C61.5&S:NVDA20240719C62.5" - }, - "xaxis": { - "anchor": "y", - "domain": [ - 0, - 1 - ], - "title": { - "text": "Datetime" - } - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0, - 1 - ], - "title": { - "text": "value" - } - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "px.line(data['Midpoint'], title='Midpoint Price for &L:NVDA20240719C61.5&S:NVDA20240719C62.5')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "http://127.0.0.1:25510/v2/hist/option/eod?end_date=20250613&root=NVDA&use_csv=true&exp=20240719&right=C&start_date=20170101&strike=615000\n", - "http://127.0.0.1:25510/v2/hist/option/eod?end_date=20250613&root=NVDA&use_csv=true&exp=20240719&right=C&start_date=20170101&strike=61500\n" - ] - } - ], - "source": [ - "'NVDA20230915C19.5'\n", - "p1 = get_option_data_theta_data(rm, 'NVDA20240719C615')\n", - "p2 = get_option_data_theta_data(rm, 'NVDA20240719C61.5')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2025-06-15 19:43:21 DataManager.py CRITICAL: Extra Cols not implemented for BS Greeks\n", - "2025-06-15 19:44:14 DataManager.py CRITICAL: Extra Cols not implemented for BS Greeks\n" - ] - } - ], - "source": [ - "dm_p1 = get_option_greeks_datamanager(rm, 'NVDA20240719C615')\n", - "dm_p2 = get_option_greeks_datamanager(rm, 'NVDA20240719C61.5')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "hovertemplate": "variable=Midpoint_delta
Datetime=%{x}
value=%{y}", - "legendgroup": "Midpoint_delta", - "line": { - "color": "#636efa", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "Midpoint_delta", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": [ - "2023-12-01T00:00:00", - "2023-12-04T00:00:00", - "2023-12-05T00:00:00", - "2023-12-06T00:00:00", - "2023-12-07T00:00:00", - "2023-12-08T00:00:00", - "2023-12-11T00:00:00", - "2023-12-12T00:00:00", - "2023-12-13T00:00:00", - "2023-12-14T00:00:00", - "2023-12-15T00:00:00", - "2023-12-18T00:00:00", - "2023-12-19T00:00:00", - "2023-12-20T00:00:00", - "2023-12-21T00:00:00", - "2023-12-22T00:00:00", - "2023-12-25T00:00:00", - "2023-12-26T00:00:00", - "2023-12-27T00:00:00", - "2023-12-28T00:00:00", - "2023-12-29T00:00:00", - "2024-01-01T00:00:00", - "2024-01-02T00:00:00", - "2024-01-03T00:00:00", - "2024-01-04T00:00:00", - "2024-01-05T00:00:00", - "2024-01-08T00:00:00", - "2024-01-09T00:00:00", - "2024-01-10T00:00:00", - "2024-01-11T00:00:00", - "2024-01-12T00:00:00", - "2024-01-15T00:00:00", - "2024-01-16T00:00:00", - "2024-01-17T00:00:00", - "2024-01-18T00:00:00", - "2024-01-19T00:00:00", - "2024-01-22T00:00:00", - "2024-01-23T00:00:00", - "2024-01-24T00:00:00", - "2024-01-25T00:00:00", - "2024-01-26T00:00:00", - "2024-01-29T00:00:00", - "2024-01-30T00:00:00", - "2024-01-31T00:00:00", - "2024-02-01T00:00:00", - "2024-02-02T00:00:00", - "2024-02-05T00:00:00", - "2024-02-06T00:00:00", - "2024-02-07T00:00:00", - "2024-02-08T00:00:00", - "2024-02-09T00:00:00", - "2024-02-12T00:00:00", - "2024-02-13T00:00:00", - "2024-02-14T00:00:00", - "2024-02-15T00:00:00", - "2024-02-16T00:00:00", - "2024-02-19T00:00:00", - "2024-02-20T00:00:00", - "2024-02-21T00:00:00", - "2024-02-22T00:00:00", - "2024-02-23T00:00:00", - "2024-02-26T00:00:00", - "2024-02-27T00:00:00", - "2024-02-28T00:00:00", - "2024-02-29T00:00:00", - "2024-03-01T00:00:00", - "2024-03-04T00:00:00", - "2024-03-05T00:00:00", - "2024-03-06T00:00:00", - "2024-03-07T00:00:00", - "2024-03-08T00:00:00", - "2024-03-11T00:00:00", - "2024-03-12T00:00:00", - "2024-03-13T00:00:00", - "2024-03-14T00:00:00", - "2024-03-15T00:00:00", - "2024-03-18T00:00:00", - "2024-03-19T00:00:00", - "2024-03-20T00:00:00", - "2024-03-21T00:00:00", - "2024-03-22T00:00:00", - "2024-03-25T00:00:00", - "2024-03-26T00:00:00", - "2024-03-27T00:00:00", - "2024-03-28T00:00:00", - "2024-03-29T00:00:00", - "2024-04-01T00:00:00", - "2024-04-02T00:00:00", - "2024-04-03T00:00:00", - "2024-04-04T00:00:00", - "2024-04-05T00:00:00", - "2024-04-08T00:00:00", - "2024-04-09T00:00:00", - "2024-04-10T00:00:00", - "2024-04-11T00:00:00", - "2024-04-12T00:00:00", - "2024-04-15T00:00:00", - "2024-04-16T00:00:00", - "2024-04-17T00:00:00", - "2024-04-18T00:00:00", - "2024-04-19T00:00:00", - "2024-04-22T00:00:00", - "2024-04-23T00:00:00", - "2024-04-24T00:00:00", - "2024-04-25T00:00:00", - "2024-04-26T00:00:00", - "2024-04-29T00:00:00", - "2024-04-30T00:00:00", - "2024-05-01T00:00:00", - "2024-05-02T00:00:00", - "2024-05-03T00:00:00", - "2024-05-06T00:00:00", - "2024-05-07T00:00:00", - "2024-05-08T00:00:00", - "2024-05-09T00:00:00", - "2024-05-10T00:00:00", - "2024-05-13T00:00:00", - "2024-05-14T00:00:00", - "2024-05-15T00:00:00", - "2024-05-16T00:00:00", - "2024-05-17T00:00:00", - "2024-05-20T00:00:00", - "2024-05-21T00:00:00", - "2024-05-22T00:00:00", - "2024-05-23T00:00:00", - "2024-05-24T00:00:00", - "2024-05-27T00:00:00", - "2024-05-28T00:00:00", - "2024-05-29T00:00:00", - "2024-05-30T00:00:00", - "2024-05-31T00:00:00", - "2024-06-03T00:00:00", - "2024-06-04T00:00:00", - "2024-06-05T00:00:00", - "2024-06-06T00:00:00", - "2024-06-07T00:00:00", - "2024-06-10T00:00:00" - ], - "xaxis": "x", - "y": [ - 0.2675751165794438, - 0.242095814217258, - 0.26653218459600225, - 0.24376614106955685, - 0.2642180478705569, - 0.2822564623990331, - 0.2613711149809461, - 0.28247586282379444, - 0.29106534728420286, - 0.2965178906123356, - 0.3096170608660742, - 0.3372811330374148, - 0.3241581219242562, - 0.2911828364101865, - 0.3102188776839654, - 0.3032626683898698, - 0.3032626683898698, - 0.3109347148930297, - 0.30969936329778847, - 0.31022805031586387, - 0.30805690508355354, - 0.30805690508355354, - 0.2737024003824473, - 0.25832132210705794, - 0.2658005385276496, - 0.2895123990100501, - 0.37024797738141046, - 0.3943806528557303, - 0.4250792860482022, - 0.43416834475245025, - 0.42886290214596556, - 0.42886290214596556, - 0.47090731621324267, - 0.46284860793370797, - 0.4885886164281317, - 0.5460568468990346, - 0.5486238540612476, - 0.5523573411942095, - 0.587565747829899, - 0.5931997330414163, - 0.5794157710795389, - 0.611203187099818, - 0.6177357966933528, - 0.5900036088284821, - 0.6228450047380818, - 0.6852767765174406, - 0.7360918844000253, - 0.7169420639790758, - 0.7464801886285954, - 0.7398442469522593, - 0.7764931508219775, - 0.7725219470913203, - 0.7668213398815737, - 0.7903707055874065, - 0.7749293523218626, - 0.7753026583515066, - 0.7753026583515066, - 0.7308960145380183, - 0.7017594363148305, - 0.8522702196771093, - 0.8524485299844287, - 0.8567053103675448, - 0.8591535997211963, - 0.8511543841819957, - 0.8644134608118748, - 0.8915461380908596, - 0.9047371704895113, - 0.9065952075360428, - 0.9176261835307287, - 0.9306567987522385, - 0.8993852377955136, - 0.8923764396058687, - 0.9187740203799422, - 0.9074466172847906, - 0.8966874416188375, - 0.8950611252942053, - 0.9022995424146529, - 0.915236231912786, - 0.9255314170218298, - 0.9295620257432802, - 0.9373043216868382, - 0.937885941488048, - 0.936974981647154, - 0.9259034927907805, - 0.9344690700402225, - 0.9344690700402225, - 0.9381969896537612, - 0.933584592505099, - 0.933481557461846, - 0.9162033087449117, - 0.9302139998482062, - 0.923430541615744, - 0.9200545306356389, - 0.9306717182482771, - 0.9448580423054409, - 0.9337471585439516, - 0.9230582937988174, - 0.9301738123099312, - 0.908067495035425, - 0.9103854329922001, - 0.8320338724118415, - 0.881387777988607, - 0.898319006361703, - 0.8775421041974596, - 0.9029357715704123, - 0.9246921712502854, - 0.9280003618954424, - 0.9405739026419724, - 0.9060015408877575, - 0.9260471708074647, - 0.944032122836802, - 0.9550593664044982, - 0.9547473581989152, - 0.9476760987013222, - 0.950045759105933, - 0.9551245837116085, - 0.9592605511983265, - 0.9641708825313344, - 0.9711534329284177, - 0.9722503410785066, - 0.9664733048850849, - 0.9728043549699805, - 0.9779026641552946, - 0.9822921848922306, - 0.9923324825706459, - 0.9940159046038843, - 0.9940159046038843, - 0.9814516618007474, - 0.9980430285338571, - 0.9847493258604345, - 0.9944678635491755, - 0.988763014640881, - 0.9898129925034027, - 0.9914519084929907, - 0.9876121584795783, - 0.9977134245957586, - 0 - ], - "yaxis": "y" - } - ], - "layout": { - "legend": { - "title": { - "text": "variable" - }, - "tracegroupgap": 0 - }, - "margin": { - "t": 60 - }, - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "heatmapgl": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmapgl" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "xaxis": { - "anchor": "y", - "domain": [ - 0, - 1 - ], - "title": { - "text": "Datetime" - } - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0, - 1 - ], - "title": { - "text": "value" - } - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "px.line(dm_p1.post_processed_data.Midpoint_delta)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "hovertemplate": "variable=Midpoint_delta
Datetime=%{x}
value=%{y}", - "legendgroup": "Midpoint_delta", - "line": { - "color": "#636efa", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "Midpoint_delta", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": [ - "2024-06-10T00:00:00", - "2024-06-11T00:00:00", - "2024-06-12T00:00:00", - "2024-06-13T00:00:00", - "2024-06-14T00:00:00", - "2024-06-17T00:00:00", - "2024-06-18T00:00:00", - "2024-06-19T00:00:00", - "2024-06-20T00:00:00", - "2024-06-21T00:00:00", - "2024-06-24T00:00:00", - "2024-06-25T00:00:00", - "2024-06-26T00:00:00", - "2024-06-27T00:00:00", - "2024-06-28T00:00:00", - "2024-07-01T00:00:00", - "2024-07-02T00:00:00", - "2024-07-03T00:00:00", - "2024-07-04T00:00:00", - "2024-07-05T00:00:00", - "2024-07-08T00:00:00", - "2024-07-09T00:00:00", - "2024-07-10T00:00:00", - "2024-07-11T00:00:00", - "2024-07-12T00:00:00", - "2024-07-15T00:00:00", - "2024-07-16T00:00:00", - "2024-07-17T00:00:00", - "2024-07-18T00:00:00", - "2024-07-19T00:00:00" - ], - "xaxis": "x", - "y": [ - 0.994408469950514, - 0.9904750984226496, - 0, - 0, - 0.9917455068077174, - 0.9904649430360735, - 0.9907354296686322, - 0.9907354296686322, - 0.9721318292918113, - 0.9888519548596264, - 0.9921137209190078, - 0.9943095812900538, - 0.9917344193283384, - 0, - 0.997415847252725, - 0, - 0.995214374868425, - 0.9993810201329723, - 0.9993810201329723, - 0.9978348329951814, - 0.9719820453469197, - 0.9944094979715601, - 0, - 0.9956798557247737, - 0.9821334775004686, - 0.9977371511659783, - 0.9922494844161633, - 0, - 0.9571271744096777, - 0 - ], - "yaxis": "y" - } - ], - "layout": { - "legend": { - "title": { - "text": "variable" - }, - "tracegroupgap": 0 - }, - "margin": { - "t": 60 - }, - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "heatmapgl": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmapgl" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "xaxis": { - "anchor": "y", - "domain": [ - 0, - 1 - ], - "title": { - "text": "Datetime" - } - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0, - 1 - ], - "title": { - "text": "value" - } - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "px.line(dm_p2.post_processed_data.Midpoint_delta)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "hovertemplate": "variable=Midpoint
Datetime=%{x}
value=%{y}", - "legendgroup": "Midpoint", - "line": { - "color": "#636efa", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "Midpoint", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": [ - "2024-06-10T16:00:00", - "2024-06-11T16:00:00", - "2024-06-12T16:00:00", - "2024-06-13T16:00:00", - "2024-06-14T16:00:00", - "2024-06-17T16:00:00", - "2024-06-18T16:00:00", - "2024-06-20T16:00:00", - "2024-06-21T16:00:00", - "2024-06-24T16:00:00", - "2024-06-25T16:00:00", - "2024-06-26T16:00:00", - "2024-06-27T16:00:00", - "2024-06-28T16:00:00", - "2024-07-01T16:00:00", - "2024-07-02T16:00:00", - "2024-07-03T16:00:00", - "2024-07-05T16:00:00", - "2024-07-08T16:00:00", - "2024-07-09T16:00:00", - "2024-07-10T16:00:00", - "2024-07-11T16:00:00", - "2024-07-12T16:00:00", - "2024-07-15T16:00:00", - "2024-07-16T16:00:00", - "2024-07-17T16:00:00", - "2024-07-18T16:00:00", - "2024-07-19T16:00:00" - ], - "xaxis": "x", - "y": [ - 607, - 598.75, - 640, - 674.75, - 708.2499999999999, - 699.25, - 745.25, - 702.75, - 655, - 569.25, - 648.75, - 652.25, - 624.5, - 622.5, - 627.25, - 613.75, - 669.25, - 644.75, - 675, - 700.5, - 734.5, - 660.25, - 681.75, - 670, - 650, - 557.5, - 607.5, - 576 - ], - "yaxis": "y" - } - ], - "layout": { - "legend": { - "title": { - "text": "variable" - }, - "tracegroupgap": 0 - }, - "margin": { - "t": 60 - }, - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "heatmapgl": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmapgl" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "xaxis": { - "anchor": "y", - "domain": [ - 0, - 1 - ], - "title": { - "text": "Datetime" - } - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0, - 1 - ], - "title": { - "text": "value" - } - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "px.line(p2.Midpoint*10)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "hovertemplate": "variable=Midpoint
Datetime=%{x}
value=%{y}", - "legendgroup": "Midpoint", - "line": { - "color": "#636efa", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "Midpoint", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": [ - "2023-12-01T16:00:00", - "2023-12-01T16:00:00", - "2023-12-04T16:00:00", - "2023-12-04T16:00:00", - "2023-12-05T16:00:00", - "2023-12-05T16:00:00", - "2023-12-06T16:00:00", - "2023-12-06T16:00:00", - "2023-12-07T16:00:00", - "2023-12-07T16:00:00", - "2023-12-08T16:00:00", - "2023-12-08T16:00:00", - "2023-12-11T16:00:00", - "2023-12-11T16:00:00", - "2023-12-12T16:00:00", - "2023-12-12T16:00:00", - "2023-12-13T16:00:00", - "2023-12-13T16:00:00", - "2023-12-14T16:00:00", - "2023-12-14T16:00:00", - "2023-12-15T16:00:00", - "2023-12-15T16:00:00", - "2023-12-18T16:00:00", - "2023-12-18T16:00:00", - "2023-12-19T16:00:00", - "2023-12-19T16:00:00", - "2023-12-20T16:00:00", - "2023-12-20T16:00:00", - "2023-12-21T16:00:00", - "2023-12-21T16:00:00", - "2023-12-22T16:00:00", - "2023-12-22T16:00:00", - "2023-12-26T16:00:00", - "2023-12-26T16:00:00", - "2023-12-27T16:00:00", - "2023-12-27T16:00:00", - "2023-12-28T16:00:00", - "2023-12-28T16:00:00", - "2023-12-29T16:00:00", - "2023-12-29T16:00:00", - "2024-01-02T16:00:00", - "2024-01-03T16:00:00", - "2024-01-04T16:00:00", - "2024-01-05T16:00:00", - "2024-01-08T16:00:00", - "2024-01-09T16:00:00", - "2024-01-10T16:00:00", - "2024-01-11T16:00:00", - "2024-01-12T16:00:00", - "2024-01-16T16:00:00", - "2024-01-17T16:00:00", - "2024-01-18T16:00:00", - "2024-01-19T16:00:00", - "2024-01-22T16:00:00", - "2024-01-23T16:00:00", - "2024-01-24T16:00:00", - "2024-01-25T16:00:00", - "2024-01-26T16:00:00", - "2024-01-29T16:00:00", - "2024-01-30T16:00:00", - "2024-01-31T16:00:00", - "2024-02-01T16:00:00", - "2024-02-02T16:00:00", - "2024-02-05T16:00:00", - "2024-02-06T16:00:00", - "2024-02-07T16:00:00", - "2024-02-08T16:00:00", - "2024-02-09T16:00:00", - "2024-02-12T16:00:00", - "2024-02-13T16:00:00", - "2024-02-14T16:00:00", - "2024-02-15T16:00:00", - "2024-02-16T16:00:00", - "2024-02-20T16:00:00", - "2024-02-21T16:00:00", - "2024-02-22T16:00:00", - "2024-02-23T16:00:00", - "2024-02-26T16:00:00", - "2024-02-27T16:00:00", - "2024-02-28T16:00:00", - "2024-02-29T16:00:00", - "2024-03-01T16:00:00", - "2024-03-04T16:00:00", - "2024-03-05T16:00:00", - "2024-03-06T16:00:00", - "2024-03-07T16:00:00", - "2024-03-08T16:00:00", - "2024-03-11T16:00:00", - "2024-03-12T16:00:00", - "2024-03-13T16:00:00", - "2024-03-14T16:00:00", - "2024-03-15T16:00:00", - "2024-03-18T16:00:00", - "2024-03-19T16:00:00", - "2024-03-20T16:00:00", - "2024-03-21T16:00:00", - "2024-03-22T16:00:00", - "2024-03-25T16:00:00", - "2024-03-26T16:00:00", - "2024-03-27T16:00:00", - "2024-03-28T16:00:00", - "2024-04-01T16:00:00", - "2024-04-02T16:00:00", - "2024-04-03T16:00:00", - "2024-04-04T16:00:00", - "2024-04-05T16:00:00", - "2024-04-08T16:00:00", - "2024-04-09T16:00:00", - "2024-04-10T16:00:00", - "2024-04-11T16:00:00", - "2024-04-12T16:00:00", - "2024-04-15T16:00:00", - "2024-04-16T16:00:00", - "2024-04-17T16:00:00", - "2024-04-18T16:00:00", - "2024-04-19T16:00:00", - "2024-04-22T16:00:00", - "2024-04-23T16:00:00", - "2024-04-24T16:00:00", - "2024-04-25T16:00:00", - "2024-04-26T16:00:00", - "2024-04-29T16:00:00", - "2024-04-30T16:00:00", - "2024-05-01T16:00:00", - "2024-05-02T16:00:00", - "2024-05-03T16:00:00", - "2024-05-06T16:00:00", - "2024-05-07T16:00:00", - "2024-05-08T16:00:00", - "2024-05-09T16:00:00", - "2024-05-10T16:00:00", - "2024-05-13T16:00:00", - "2024-05-14T16:00:00", - "2024-05-15T16:00:00", - "2024-05-16T16:00:00", - "2024-05-17T16:00:00", - "2024-05-20T16:00:00", - "2024-05-21T16:00:00", - "2024-05-22T16:00:00", - "2024-05-23T16:00:00", - "2024-05-24T16:00:00", - "2024-05-28T16:00:00", - "2024-05-29T16:00:00", - "2024-05-30T16:00:00", - "2024-05-31T16:00:00", - "2024-06-03T16:00:00", - "2024-06-04T16:00:00", - "2024-06-05T16:00:00", - "2024-06-06T16:00:00", - "2024-06-07T16:00:00", - "2024-06-10T16:00:00" - ], - "xaxis": "x", - "y": [ - 20.425, - 20.425, - 17.625, - 17.625, - 20.475, - 20.475, - 17.875, - 17.875, - 20.1, - 20.1, - 22.175, - 22.175, - 19.675, - 19.675, - 22.1, - 22.1, - 23.1, - 23.1, - 23.775, - 23.775, - 25.5, - 25.5, - 29.275, - 29.275, - 27.35, - 27.35, - 23.175, - 23.175, - 25.549999999999997, - 25.549999999999997, - 24.5, - 24.5, - 25.375, - 25.375, - 24.975, - 24.975, - 24.924999999999997, - 24.924999999999997, - 24.55, - 24.55, - 20.4, - 18.625, - 19.35, - 21.95, - 32.75, - 36.625, - 41.725, - 42.875, - 41.6, - 49.3, - 47.875, - 52.724999999999994, - 65.25, - 65.35, - 65.1, - 74.45, - 76.125, - 72.225, - 80.7, - 83, - 75.525, - 83.925, - 105.94999999999999, - 131.175, - 123.825, - 137.55, - 133.75, - 152.55, - 155.77499999999998, - 156.95, - 170.175, - 160.125, - 159.15, - 134.45, - 117.725, - 203.55, - 206.625, - 208.2, - 202.925, - 193.175, - 205.89999999999998, - 233.77499999999998, - 262.125, - 269.35, - 295.575, - 333.875, - 288, - 270.75, - 328.8, - 321.325, - 292.85, - 292.125, - 296.225, - 302.45, - 309.95000000000005, - 319.975, - 347.70000000000005, - 354.67499999999995, - 329.45, - 307.9, - 306.925, - 305.82500000000005, - 297.275, - 292.125, - 263.675, - 282.65, - 274.675, - 256.625, - 272.04999999999995, - 306.29999999999995, - 283.225, - 262.275, - 275.55, - 244.475, - 250.65, - 176.4, - 201.125, - 228.825, - 203.55, - 229.9, - 279.125, - 278.375, - 261.95, - 233.05, - 258.25, - 285.675, - 317.85, - 301.625, - 301.275, - 283.725, - 294.4, - 298.825, - 307.75, - 339.82500000000005, - 336.85, - 318.55, - 340.675, - 346.025, - 341.025, - 428.625, - 455.1, - 531.35, - 537.875, - 496.325, - 486.125, - 540.475, - 554.625, - 614.45, - 600.65, - 597.775, - 0 - ], - "yaxis": "y" - } - ], - "layout": { - "legend": { - "title": { - "text": "variable" - }, - "tracegroupgap": 0 - }, - "margin": { - "t": 60 - }, - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "heatmapgl": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmapgl" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "xaxis": { - "anchor": "y", - "domain": [ - 0, - 1 - ], - "title": { - "text": "Datetime" - } - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0, - 1 - ], - "title": { - "text": "value" - } - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "px.line(p1.Midpoint)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'SBUX': 2475.180708157909}" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "rm.sizer.ticker_starting_cash" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from abc import ABC, abstractmethod\n", - "\n", - "class BaseSizer(ABC):\n", - " \"\"\"\n", - " Abstract base class for size calculation.\n", - "\n", - " This class provides a framework for calculating position sizes based on available cash and other parameters.\n", - "\n", - " Attributes:\n", - " CASH_USE_RULES (dict): A dictionary defining the rules for cash base when calculating position sizes and greek limits.\n", - " \"\"\"\n", - " __CASH_USE_RULES = {\n", - " 1: 'USE_CASH_EVERY_NEW_POSITION_ID',\n", - " 2: 'USE_CASH_EVERY_NEW_TICK',\n", - " 3: 'USE_CASH_EVERY_NEW_SIGNAL_ID',\n", - " }\n", - "\n", - " def __init__(self, pm, rm, sizing_lev=1.0):\n", - " \"\"\"\n", - " Initialize the BaseSizer with a PowerManager and ResourceManager.\n", - " Args:\n", - " pm (OptionSignalPortfolio): The PowerManager instance managing the portfolio.\n", - " rm (RiskManager): The ResourceManager instance managing resources.\n", - " sizing_lev (float): The sizing level for position sizing. Default is 1.0.\n", - " \"\"\"\n", - " self.pm = pm\n", - " self.rm = rm\n", - " self.sizing_lev = sizing_lev\n", - " self.signal_starting_cash = {}\n", - " self.position_id_starting_cash = {} ## This is helpful to track the starting cash for each position ID, especially when calculating limits\n", - " self.ticker_starting_cash = pm.allocated_cash_map.copy()\n", - " self.cash_rule = self.__CASH_USE_RULES[1]\n", - " self.re_update_on_roll = True # Flag to control re-updating on roll\n", - " self.delta_limit_log = {}\n", - " \n", - " @abstractmethod\n", - " def update_delta_limit(self, *args, **kwargs):\n", - " \"\"\"\n", - " Abstract method to calculate the delta limit for a given position ID and date.\n", - " \"\"\"\n", - " pass\n", - "\n", - " @abstractmethod\n", - " def calculate_position_size(self, *args, **kwargs):\n", - " \"\"\"\n", - " Abstract method to calculate the position size for a given position ID and date.\n", - " \"\"\"\n", - " pass\n", - "\n", - " @abstractmethod\n", - " def pre_analyze_task(self, *args, **kwargs):\n", - " \"\"\"\n", - " Abstract method for daily updates.\n", - " \"\"\"\n", - " pass\n", - "\n", - " @abstractmethod\n", - " def post_analyze_task(self, *args, **kwargs):\n", - " \"\"\"\n", - " Abstract method for daily updates.\n", - " \"\"\"\n", - " pass\n", - "\n", - " def get_cash(self, tick:str, signal_id:str, position_id:str) -> float:\n", - " \"\"\"\n", - " Get the available cash for a given position ID and date based on the cash rule.\n", - " This method determines the cash available for position sizing based on the specified cash rule.\n", - " Args:\n", - " tick (str): The ticker symbol for the asset.\n", - " signal_id (str): The ID of the signal associated with the position.\n", - " position_id (str): The ID of the position.\n", - " \"\"\"\n", - " if self.cash_rule == self.__CASH_USE_RULES[1]:\n", - " return self.position_id_starting_cash.get(position_id, self.pm.allocated_cash_map[tick])\n", - " elif self.cash_rule == self.__CASH_USE_RULES[2]:\n", - " return self.ticker_starting_cash[tick]\n", - " elif self.cash_rule == self.__CASH_USE_RULES[3]:\n", - " return self.signal_starting_cash.get(signal_id, self.pm.allocated_cash_map[tick])\n", - " else:\n", - " raise ValueError(f\"Unknown cash rule: {self.cash_rule}\")\n", - " \n", - " def set_cash_rule(self, rule: int) -> None:\n", - " \"\"\"\n", - " Set the cash rule for position sizing.\n", - " Args:\n", - " rule (int): The cash rule to set. Must be one of the keys in CASH_USE_RULES.\n", - " \"\"\"\n", - " if rule in self.__CASH_USE_RULES:\n", - " self.cash_rule = self.__CASH_USE_RULES[rule]\n", - " else:\n", - " raise ValueError(f\"Invalid cash rule: {rule}. Available rules: {self.__CASH_USE_RULES.keys()}\")\n", - " \n", - " def register_signal_starting_cash(self, signal_id:str, cash:float) -> None:\n", - " \"\"\"\n", - " Register the starting cash for a specific signal ID.\n", - " Args:\n", - " signal_id (str): The ID of the signal.\n", - " cash (float): The starting cash amount for the signal.\n", - " \"\"\"\n", - " if signal_id in self.signal_starting_cash:\n", - " logger.warning(f\"Signal ID {signal_id} already has starting cash registered. Overwriting previous value.\")\n", - " return\n", - " self.signal_starting_cash[signal_id] = cash\n", - "\n", - " def register_position_id_starting_cash(self, position_id:str, cash:float) -> None:\n", - " \"\"\"\n", - " Register the starting cash for a specific position ID.\n", - " Args:\n", - " position_id (str): The ID of the position.\n", - " cash (float): The starting cash amount for the position.\n", - " \"\"\"\n", - " if position_id in self.position_id_starting_cash:\n", - " logger.warning(f\"Position ID {position_id} already has starting cash registered. Overwriting previous value.\")\n", - " return\n", - " self.position_id_starting_cash[position_id] = cash\n", - "\n", - " def log_daily_delta_limit(self, symbol:str, date:datetime, delta_limit:float) -> None:\n", - " \"\"\"\n", - " Log the daily delta limit for a specific symbol and date.\n", - " Args:\n", - " symbol (str): The ticker symbol for the asset.\n", - " date (datetime): The date for which the delta limit is logged.\n", - " delta_limit (float): The delta limit value to log.\n", - " \"\"\"\n", - " if symbol not in self.delta_limit_log:\n", - " self.delta_limit_log[symbol] = {}\n", - " self.delta_limit_log[symbol][date] = delta_limit\n", - "\n", - "\n", - " @property\n", - " def CASH_USE_RULES(self):\n", - " \"\"\"\n", - " Get the available cash use rules.\n", - " \"\"\"\n", - " return self.__CASH_USE_RULES\n", - " \n", - " @CASH_USE_RULES.setter\n", - " def CASH_USE_RULES(self, value):\n", - " \"\"\"\n", - " Set the available cash use rules.\n", - " \"\"\"\n", - " raise AttributeError(\"CASH_USE_RULES is a read-only property.\")\n", - "\n", - " def __repr__(self):\n", - " \"\"\"\n", - " String representation of the BaseSizer class.\n", - " \"\"\"\n", - " return f\"{self.__class__.__name__}(sizing_lev={self.sizing_lev}, cash_rule={self.cash_rule})\"\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[0;31mInit signature:\u001b[0m \u001b[0mBaseSizer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpm\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrm\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msizing_lev\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1.0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mDocstring:\u001b[0m \n", - "Abstract base class for size calculation.\n", - "\n", - "This class provides a framework for calculating position sizes based on available cash and other parameters.\n", - "\n", - "Attributes:\n", - "CASH_USE_RULES (dict): A dictionary defining the rules for cash base when calculating position sizes and greek limits.\n", - "\u001b[0;31mInit docstring:\u001b[0m\n", - "Initialize the BaseSizer with a PowerManager and ResourceManager.\n", - "Args:\n", - " pm (OptionSignalPortfolio): The PowerManager instance managing the portfolio.\n", - " rm (RiskManager): The ResourceManager instance managing resources.\n", - " sizing_lev (float): The sizing level for position sizing. Default is 1.0.\n", - "\u001b[0;31mType:\u001b[0m ABCMeta\n", - "\u001b[0;31mSubclasses:\u001b[0m DefaultSizer, ZscoreRVolSizer, ZscoreRVolSizer" - ] - } - ], - "source": [ - "BaseSizer?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from EventDriven.riskmanager.utils import parse_signal_id\n", - "from trade.assets.helpers.utils import swap_ticker\n", - "class DefaultSizer(BaseSizer):\n", - " \"\"\"\n", - " Default implementation of the BaseSizer.\n", - " Calculates position size based on delta limits and available cash.\n", - " \"\"\"\n", - "\n", - " def __init__(self, pm, rm, sizing_lev):\n", - " super().__init__(pm, rm, sizing_lev)\n", - " \n", - " def get_daily_delta_limit(self, signal_id:str, position_id:str, date:str|datetime) -> float:\n", - " \"\"\"\n", - " Returns the delta limit for a given signal ID and date.\n", - " This method retrieves the delta limit for a specific signal ID and date, \n", - " calculating it if it doesn't already exist in the risk manager's greek limits.\n", - " \n", - " Args:\n", - " signal_id (str): The ID of the signal.\n", - " position_id (str): The ID of the position.\n", - " date (str|datetime): The date for which the delta limit is calculated.\n", - " \n", - " Returns:\n", - " float: The delta limit for the specified signal ID and date.\n", - " \"\"\"\n", - " ## Check if the signal_id already has a delta limit set. This avoids recalculating during rolls\n", - " # if signal_id in self.rm.greek_limits['delta'] and not self.re_update_on_roll:\n", - " # logger.info(f\"Greek Limits for Signal ID: {signal_id} already updated, skipping\")\n", - " # return self.rm.greek_limits['delta'][signal_id] \n", - " logger.info(f\"DefaultSizer: Calculating Delta Limit for Signal ID: {signal_id} and Position ID: {position_id} on Date: {date}\")\n", - " id_details = parse_signal_id(signal_id)\n", - " self.register_signal_starting_cash(signal_id, self.pm.allocated_cash_map[id_details['ticker']]) ## Register the starting cash for the signal\n", - " self.register_position_id_starting_cash(position_id, self.pm.allocated_cash_map[id_details['ticker']]) ## Register the starting cash for the position ID\n", - "\n", - "\n", - " logger.info(f\"Updating Greek Limits for Signal ID: {signal_id} and Position ID: {position_id}\")\n", - " starting_cash = self.get_cash(id_details['ticker'], signal_id, position_id) ## Get the cash available for the ticker based on the cash rule\n", - " logger.info(f\"Starting Cash for {id_details['ticker']} on {date}: {starting_cash} vs Current Cash: {self.pm.allocated_cash_map[id_details['ticker']]}\")\n", - " delta_at_purchase = self.rm.position_data[position_id]['Delta'][date] ## This is the delta at the time of purchase\n", - " s0_at_purchase = self.rm.position_data[position_id]['s'][date] ## This is the delta at the time of purchase## As always, we use the chain spot data to account for splits\n", - " equivalent_delta_size = (starting_cash * self.sizing_lev) / (s0_at_purchase * 100) if s0_at_purchase != 0 else 0\n", - " logger.info(f\"Spot Price at Purchase: {s0_at_purchase} at time {date} ## This is the delta at the time of purchase\")\n", - " logger.info(f\"Delta at Purchase: {delta_at_purchase}\")\n", - " logger.info(f\"Equivalent Delta Size: {equivalent_delta_size}, with Cash Available: {starting_cash}, and Leverage: {self.sizing_lev}\")\n", - " return equivalent_delta_size\n", - " \n", - "\n", - "\n", - " def update_delta_limit(self, signal_id:str, position_id:str, date:str|datetime) -> float:\n", - " \"\"\"\n", - " Updates the limits associated with a signal\n", - " ps: This should only be updated on first purchase of the signal\n", - " Limits are saved in absolute values to account for both long and short positions\n", - " \n", - " Limit Calc: (allocated_cash * lev)/(S0 * 100)\n", - " \"\"\"\n", - " equivalent_delta_size = self.get_daily_delta_limit(signal_id, position_id, date) ## Get the delta limit for the signal ID and date\n", - " self.rm.greek_limits['delta'][signal_id] = equivalent_delta_size ## Update the delta limit in the risk manager's greek limits\n", - " return equivalent_delta_size\n", - "\n", - " def calculate_position_size(self, signal_id:str, position_id:str, opt_price:str, date:str|datetime) -> float:\n", - " \"\"\"\n", - " Returns the quantity of the position that can be bought based on the sizing type\n", - " Args:\n", - " signal_id (str): The ID of the signal.\n", - " position_id (str): The ID of the position.\n", - " opt_price (float): The price of the option.\n", - " date (str|datetime): The date for which the position size is calculated.\n", - " \"\"\"\n", - " self.update_delta_limit(signal_id,position_id, date) ## Always calculate the delta limit first\n", - " logger.info(f\"Calculating Quantity for Position ID: {position_id} and Signal ID: {signal_id} on Date: {date}\")\n", - " if position_id not in self.rm.position_data: ## If the position data isn't available, calculate the greeks\n", - " self.rm.calculate_position_greeks(position_id, date)\n", - " \n", - " ## First get position info and ticker\n", - " position_dict, _ = self.rm.parse_position_id(position_id)\n", - " key = list(position_dict.keys())[0]\n", - " ticker = swap_ticker(position_dict[key][0]['ticker'])\n", - "\n", - " ## Now calculate the max size cash can buy\n", - " cash_available = self.pm.allocated_cash_map[ticker]\n", - " purchase_date = pd.to_datetime(date)\n", - " s0_at_purchase = self.rm.position_data[position_id]['s'][purchase_date] ## s -> chain spot, s0_close -> adjusted close\n", - " logger.info(f\"Spot Price at Purchase: {s0_at_purchase} at time {purchase_date}\")\n", - " logger.info(f\"Cash Available: {cash_available}, Option Price: {opt_price}, Cash_Available/OptPRice: {(cash_available/(opt_price*100))}\")\n", - " max_size_cash_can_buy = abs(math.floor(cash_available/(opt_price*100))) ## Assuming Allocated Cash map is already in 100s\n", - " \n", - " delta = self.rm.position_data[position_id]['Delta'][purchase_date]\n", - " target_delta = self.rm.greek_limits['delta'][signal_id]\n", - " logger.info(f\"Target Delta: {target_delta}\")\n", - " delta_size = (math.floor(target_delta/abs(delta)))\n", - " logger.info(f\"Delta from Full Cash Spend: {max_size_cash_can_buy * delta}, Size: {max_size_cash_can_buy}\")\n", - " logger.info(f\"Delta with Size Limit: {delta_size * delta}, Size: {delta_size}\")\n", - " return delta_size if abs(delta_size) <= abs(max_size_cash_can_buy) else max_size_cash_can_buy\n", - " \n", - " def daily_update(self):\n", - " \"\"\"\n", - " Daily update method to refresh the position data and limits.\n", - " \"\"\"\n", - " pass\n", - "\n", - " def pre_analyze_task(self, *args, **kwargs):\n", - " \"\"\"\n", - " Abstract method for daily updates.\n", - " \"\"\"\n", - " pass\n", - "\n", - " def post_analyze_task(self, *args, **kwargs):\n", - " \"\"\"\n", - " Abstract method for daily updates.\n", - " \"\"\"\n", - " pass\n", - "\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[0;31mInit signature:\u001b[0m \u001b[0mDefaultSizer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpm\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrm\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msizing_lev\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mDocstring:\u001b[0m \n", - "Default implementation of the BaseSizer.\n", - "Calculates position size based on delta limits and available cash.\n", - "\u001b[0;31mInit docstring:\u001b[0m\n", - "Initialize the BaseSizer with a PowerManager and ResourceManager.\n", - "Args:\n", - " pm (OptionSignalPortfolio): The PowerManager instance managing the portfolio.\n", - " rm (RiskManager): The ResourceManager instance managing resources.\n", - " sizing_lev (float): The sizing level for position sizing. Default is 1.0.\n", - "\u001b[0;31mType:\u001b[0m ABCMeta\n", - "\u001b[0;31mSubclasses:\u001b[0m " - ] - } - ], - "source": [ - "DefaultSizer?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from EventDriven.riskmanager.base import BASE\n", - "class ZscoreRVolSizer(BaseSizer):\n", - " \"\"\"\n", - " Sizer that calculates position size based on the zscore of the realized volatility.\n", - " \"\"\"\n", - "\n", - " def __init__(self, pm, rm, sizing_lev=1.0, rvol_window=30, rolling_window=100):\n", - " \"\"\"\n", - " Initialize the ZscoreRVolSizer with a PowerManager and ResourceManager.\n", - " Args:\n", - " pm (OptionSignalPortfolio): The PowerManager instance managing the portfolio.\n", - " rm (RiskManager): The ResourceManager instance managing resources.\n", - " sizing_lev (float): The sizing level for position sizing. Default is 1.0.\n", - " rvol_window (int): The window size for realized volatility calculation. Default is 30 days.\n", - " rolling_window (int): The window size for rolling calculations. Default is 100 days.\n", - " \"\"\"\n", - " super().__init__(pm, rm, sizing_lev)\n", - " self.__rvol_window = rvol_window\n", - " self.__rolling_window = rolling_window\n", - " self.rvol_timeseries = {}\n", - " self.z_i = {}\n", - " self.scaler = {}\n", - "\n", - " @property\n", - " def rvol_window(self):\n", - " return self.__rvol_window\n", - " \n", - " @rvol_window.setter\n", - " def rvol_window(self, value):\n", - " if not isinstance(value, int) or value <= 0:\n", - " raise ValueError(\"rvol_window must be a positive integer.\")\n", - " \n", - " if value != self.__rvol_window: ## Clear the cache if the window changes\n", - " logger.info(f\"Setting realized volatility window to {value} days\")\n", - " self.rvol_timeseries = {} # Clear the cache if the window changes\n", - " self.__rvol_window = value\n", - "\n", - " @property\n", - " def rolling_window(self):\n", - " return self.__rolling_window\n", - "\n", - " @rolling_window.setter\n", - " def rolling_window(self, value):\n", - " if not isinstance(value, int) or value <= 0:\n", - " raise ValueError(\"rolling_window must be a positive integer.\")\n", - " self.__rolling_window = value\n", - "\n", - " def get_daily_delta_limit(self, signal_id:str, position_id:str, date:str|datetime) -> float:\n", - " \"\"\"\n", - " Calculate the delta limit based on the percentile of the realized volatility.\n", - " This method is called to get the delta limit for a given signal and position.\n", - " Args:\n", - " signal_id (str): The ID of the signal.\n", - " position_id (str): The ID of the position.\n", - " date (str|datetime): The date for which the delta limit is calculated.\n", - "\n", - " Returns:\n", - " float: The scaled delta size based on the realized volatility scaler.\n", - "\n", - " Limit Calc: (allocated_cash * lev)/(S0 * 100) * 1/(1+Zscore(rvol(30), window))\n", - " \"\"\"\n", - " id_details = parse_signal_id(signal_id)\n", - " symbol = swap_ticker(id_details['ticker'])\n", - " \n", - " ## Check if the scaler for the symbol is already calculated\n", - " if symbol not in self.scaler:\n", - " self.calculate_scaler(symbol)\n", - "\n", - " ## Get the scaler for the symbol and date\n", - " scaler = self.scaler[symbol][date]\n", - "\n", - " id_details = parse_signal_id(signal_id)\n", - " starting_cash = self.get_cash(id_details['ticker'], signal_id, position_id) ## Get the cash available for the ticker based on the cash rule\n", - " logger.info(f\"Starting Cash for {id_details['ticker']} on {date}: {starting_cash} vs Current Cash: {self.pm.allocated_cash_map[id_details['ticker']]}\")\n", - " delta_at_purchase = self.rm.position_data[position_id]['Delta'][date] ## This is the delta at the time of purchase\n", - " s0_at_purchase = self.rm.position_data[position_id]['s'][date] ## This is the delta at the time of purchase## As always, we use the chain spot data to account for splits\n", - " equivalent_delta_size = ((starting_cash * self.sizing_lev) / (s0_at_purchase * 100)) if s0_at_purchase != 0 else 0\n", - " scaled_delta_size = equivalent_delta_size * scaler\n", - " logger.info(f\"Scaler for {symbol} on {date}: {scaler}\")\n", - " logger.info(f\"Spot Price at Purchase: {s0_at_purchase} at time {date} ## This is the delta at the time of purchase\")\n", - " logger.info(f\"Delta at Purchase: {delta_at_purchase}\")\n", - " logger.info(f\"Equivalent Delta Size: {equivalent_delta_size}, with Cash Available: {starting_cash}, Leverage: {self.sizing_lev} and Scaler: {scaler}\")\n", - " logger.info(f\"Scaled Delta Size: {scaled_delta_size}\")\n", - " return scaled_delta_size\n", - " \n", - " def update_delta_limit(self, signal_id:str, position_id:str, date:str|datetime) -> float:\n", - " \"\"\"\n", - " Calculate the delta limit based on the percentile of the realized volatility.\n", - " This method is called to update the delta limit for a given signal and position.\n", - " Args:\n", - " signal_id (str): The ID of the signal.\n", - " position_id (str): The ID of the position.\n", - " date (str|datetime): The date for which the delta limit is calculated.\n", - "\n", - " This method checks if the delta limit for the signal ID is already updated. If not, it calculates the delta limit based on the realized volatility and updates the risk manager's greek limits.\n", - " \"\"\"\n", - "\n", - " id_details = parse_signal_id(signal_id)\n", - " symbol = swap_ticker(id_details['ticker'])\n", - " self.register_signal_starting_cash(signal_id, self.pm.allocated_cash_map[symbol]) ## Register the starting cash for the signal\n", - " self.register_position_id_starting_cash(position_id, self.pm.allocated_cash_map[symbol]) ## Register the starting cash for the position ID\n", - " logger.info(f\"Updating Greek Limits for Signal ID: {signal_id} and Position ID: {position_id}\")\n", - " scaled_delta_size = self.get_daily_delta_limit(signal_id, position_id, date)\n", - " self.rm.greek_limits['delta'][signal_id] = abs(scaled_delta_size)\n", - " return scaled_delta_size\n", - "\n", - " def calculate_position_size(self, signal_id:str, position_id:str, opt_price:float, date:str|datetime) -> float:\n", - " \"\"\"\n", - " Calculate the position size based on the percentile of the realized volatility.\n", - " This method calculates the position size for a given signal ID and position ID based on the available cash and the delta limit.\n", - " Args:\n", - " signal_id (str): The ID of the signal.\n", - " position_id (str): The ID of the position.\n", - " opt_price (float): The price of the option.\n", - " date (str|datetime): The date for which the position size is calculated.\n", - "\n", - "\n", - " \"\"\"\n", - " self.update_delta_limit(signal_id,position_id, date) ## Always calculate the delta limit first\n", - " logger.info(f\"Calculating Quantity for Position ID: {position_id} and Signal ID: {signal_id} on Date: {date}\")\n", - " if position_id not in self.rm.position_data: ## If the position data isn't available, calculate the greeks\n", - " self.rm.calculate_position_greeks(position_id, date)\n", - " \n", - " ## First get position info and ticker\n", - " position_dict, _ = self.rm.parse_position_id(position_id)\n", - " key = list(position_dict.keys())[0]\n", - " ticker = swap_ticker(position_dict[key][0]['ticker'])\n", - "\n", - " ## Now calculate the max size cash can buy\n", - " cash_available = self.pm.allocated_cash_map[ticker]\n", - " purchase_date = pd.to_datetime(date)\n", - " s0_at_purchase = self.rm.position_data[position_id]['s'][purchase_date] ## s -> chain spot, s0_close -> adjusted close\n", - " logger.info(f\"Spot Price at Purchase: {s0_at_purchase} at time {purchase_date}\")\n", - " logger.info(f\"Cash Available: {cash_available}, Option Price: {opt_price}, Cash_Available/OptPRice: {(cash_available/(opt_price*100))}\")\n", - " max_size_cash_can_buy = abs(math.floor(cash_available/(opt_price*100))) ## Assuming Allocated Cash map is already in 100s\n", - "\n", - " delta = self.rm.position_data[position_id]['Delta'][purchase_date]\n", - " target_delta = self.rm.greek_limits['delta'][signal_id]\n", - " logger.info(f\"Target Delta: {target_delta}\")\n", - " delta_size = (math.floor(target_delta/abs(delta)))\n", - " logger.info(f\"Delta from Full Cash Spend: {max_size_cash_can_buy * delta}, Size: {max_size_cash_can_buy}\")\n", - " logger.info(f\"Delta with Size Limit: {delta_size * delta}, Size: {delta_size}\")\n", - " return max(delta_size if abs(delta_size) <= abs(max_size_cash_can_buy) else max_size_cash_can_buy, 1)\n", - "\n", - " def calculate_scaler(self, symbol):\n", - " \"\"\"\n", - " Calculate the scaler for the realized volatility timeseries.\n", - " \"\"\"\n", - " if symbol not in self.rvol_timeseries:\n", - " self.load_rvol_timeseries(symbol)\n", - " \n", - " rvol = self.rvol_timeseries[symbol]\n", - " rolling_mean = rvol.rolling(window=self.rolling_window).mean()\n", - " rolling_std = rvol.rolling(window=self.rolling_window).std()\n", - " z_i = (rvol - rolling_mean) / rolling_std\n", - " scaler = 1/(1+z_i.abs())\n", - " self.z_i[symbol] = z_i\n", - " self.scaler[symbol] = scaler\n", - "\n", - " def load_rvol_timeseries(self, symbol:str):\n", - " \"\"\"\n", - " Load the realized volatility timeseries for a given symbol.\n", - " \"\"\"\n", - " if symbol not in self.rvol_timeseries:\n", - " rvol_series = self.pm.get_underlier_data(symbol).rvol(\n", - " ts_start = pd.to_datetime(rm.start_date) - relativedelta(years=1),\n", - " ts_end = pd.to_datetime(rm.end_date) + BDay(1),\n", - " window = self.rvol_window,\n", - " log = True)['rvol_30D']\n", - " rvol_series = rvol_series.rename(symbol)\n", - " self.rvol_timeseries[symbol] = rvol_series\n", - "\n", - " def daily_update(self):\n", - "\n", - "\n", - " ### Consider implementing:\n", - " ### - Increase & Reduce position delta based on scaler\n", - " ### - Reduce only using min(limit, today_delta_limit)\n", - " pass\n", - "\n", - " def pre_analyze_task(self, *args, **kwargs):\n", - " \"\"\"\n", - " Abstract method for daily updates.\n", - " \"\"\"\n", - " pass\n", - "\n", - " def post_analyze_task(self, *args, **kwargs):\n", - " \"\"\"\n", - " Abstract method for daily updates.\n", - " \"\"\"\n", - " pass\n", - "\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# ZscoreRVolSizer?\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ZscoreRVolSizer: Calculated Delta Limit for Signal ID: SBUX20230105LONG and Position ID: &L:SBUX20240119C130&S:SBUX20240119C135 on Date: 2023-01-05 to 0.32688696210247514\n", - "ZscoreRVolSizer: Updated Delta Limit for Signal ID: SBUX20230105LONG and Position ID: &L:SBUX20240119C130&S:SBUX20240119C135 on Date: 2023-01-05 to 0.32688696210247514\n", - "Delta from Full Cash Spend: 1.0764741829564883, Size: 24\n" - ] - }, - { - "data": { - "text/plain": [ - "7" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# rm.greek_limits\n", - "# pm.eventScheduler.current_date\n", - "pv_sizer = ZscoreRVolSizer(pm, rm, sizing_lev=4.5, rolling_window = 63)\n", - "pv_sizer.vol_type = 'window'\n", - "pv_sizer.rvol_timeseries = {}\n", - "pv_sizer.re_update_on_roll = True # Set to True to re-update on roll\n", - "pv_sizer.calculate_position_size('SBUX20230105LONG',\n", - " '&L:SBUX20240119C130&S:SBUX20240119C135', 1.025,\n", - " '2023-01-05')\n", - "# pv_sizer.calculate_position_size('BA20230105LONG',\n", - "# '&L:BA20240119C260&S:BA20240119C265', 1.10,\n", - "# '2023-01-05')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "hovertemplate": "variable=SBUX
index=%{x}
value=%{y}", - "legendgroup": "SBUX", - "line": { - "color": "#636efa", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "SBUX", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": [ - "2024-05-31T00:00:00", - "2024-06-03T00:00:00", - "2024-06-04T00:00:00", - "2024-06-05T00:00:00", - "2024-06-06T00:00:00", - "2024-06-07T00:00:00", - "2024-06-10T00:00:00", - "2024-06-11T00:00:00", - "2024-06-12T00:00:00", - "2024-06-13T00:00:00", - "2024-06-14T00:00:00", - "2024-06-17T00:00:00", - "2024-06-18T00:00:00", - "2024-06-21T00:00:00", - "2024-06-24T00:00:00", - "2024-06-25T00:00:00", - "2024-06-26T00:00:00", - "2024-06-27T00:00:00", - "2024-06-28T00:00:00", - "2024-07-01T00:00:00", - "2024-07-02T00:00:00", - "2024-07-03T00:00:00", - "2024-07-08T00:00:00", - "2024-07-09T00:00:00", - "2024-07-10T00:00:00", - "2024-07-11T00:00:00", - "2024-07-12T00:00:00", - "2024-07-15T00:00:00", - "2024-07-16T00:00:00", - "2024-07-17T00:00:00", - "2024-07-18T00:00:00", - "2024-07-19T00:00:00", - "2024-07-22T00:00:00", - "2024-07-23T00:00:00", - "2024-07-24T00:00:00", - "2024-07-25T00:00:00", - "2024-07-26T00:00:00", - "2024-07-29T00:00:00", - "2024-07-30T00:00:00", - "2024-07-31T00:00:00", - "2024-08-01T00:00:00", - "2024-08-02T00:00:00", - "2024-08-05T00:00:00", - "2024-08-06T00:00:00", - "2024-08-07T00:00:00", - "2024-08-08T00:00:00", - "2024-08-09T00:00:00", - "2024-08-12T00:00:00", - "2024-08-13T00:00:00", - "2024-08-14T00:00:00", - "2024-08-15T00:00:00", - "2024-08-16T00:00:00", - "2024-08-19T00:00:00", - "2024-08-20T00:00:00", - "2024-08-21T00:00:00", - "2024-08-22T00:00:00", - "2024-08-23T00:00:00", - "2024-08-26T00:00:00", - "2024-08-27T00:00:00", - "2024-08-28T00:00:00", - "2024-08-29T00:00:00", - "2024-08-30T00:00:00", - "2024-09-04T00:00:00", - "2024-09-05T00:00:00", - "2024-09-06T00:00:00", - "2024-09-09T00:00:00", - "2024-09-10T00:00:00", - "2024-09-11T00:00:00", - "2024-09-12T00:00:00", - "2024-09-13T00:00:00", - "2024-09-16T00:00:00", - "2024-09-17T00:00:00", - "2024-09-18T00:00:00", - "2024-09-19T00:00:00", - "2024-09-20T00:00:00", - "2024-09-23T00:00:00", - "2024-09-24T00:00:00", - "2024-09-25T00:00:00", - "2024-09-26T00:00:00", - "2024-09-27T00:00:00", - "2024-09-30T00:00:00", - "2024-10-01T00:00:00", - "2024-10-02T00:00:00", - "2024-10-03T00:00:00", - "2024-10-04T00:00:00", - "2024-10-07T00:00:00", - "2024-10-08T00:00:00", - "2024-10-09T00:00:00", - "2024-10-10T00:00:00", - "2024-10-11T00:00:00", - "2024-10-14T00:00:00", - "2024-10-15T00:00:00", - "2024-10-16T00:00:00", - "2024-10-17T00:00:00", - "2024-10-18T00:00:00", - "2024-10-21T00:00:00", - "2024-10-22T00:00:00", - "2024-10-23T00:00:00", - "2024-10-24T00:00:00", - "2024-10-25T00:00:00", - "2024-10-28T00:00:00", - "2024-10-29T00:00:00", - "2024-10-30T00:00:00", - "2024-10-31T00:00:00", - "2024-11-01T00:00:00", - "2024-11-04T00:00:00", - "2024-11-05T00:00:00", - "2024-11-06T00:00:00", - "2024-11-07T00:00:00", - "2024-11-08T00:00:00", - "2024-11-11T00:00:00", - "2024-11-12T00:00:00", - "2024-11-13T00:00:00", - "2024-11-14T00:00:00", - "2024-11-15T00:00:00", - "2024-11-18T00:00:00", - "2024-11-19T00:00:00", - "2024-11-20T00:00:00", - "2024-11-21T00:00:00", - "2024-11-22T00:00:00", - "2024-11-25T00:00:00", - "2024-11-26T00:00:00", - "2024-11-27T00:00:00", - "2024-12-02T00:00:00", - "2024-12-03T00:00:00", - "2024-12-04T00:00:00", - "2024-12-05T00:00:00", - "2024-12-06T00:00:00", - "2024-12-09T00:00:00", - "2024-12-10T00:00:00", - "2024-12-11T00:00:00", - "2024-12-12T00:00:00", - "2024-12-13T00:00:00", - "2024-12-16T00:00:00", - "2024-12-17T00:00:00", - "2024-12-18T00:00:00", - "2024-12-19T00:00:00", - "2024-12-20T00:00:00", - "2024-12-23T00:00:00", - "2024-12-24T00:00:00", - "2024-12-27T00:00:00", - "2024-12-30T00:00:00", - "2024-12-31T00:00:00", - "2025-01-03T00:00:00", - "2025-01-06T00:00:00", - "2025-01-07T00:00:00", - "2025-01-08T00:00:00", - "2025-01-13T00:00:00", - "2025-01-14T00:00:00", - "2025-01-15T00:00:00", - "2025-01-16T00:00:00", - "2025-01-17T00:00:00", - "2025-01-22T00:00:00", - "2025-01-23T00:00:00", - "2025-01-24T00:00:00", - "2025-01-27T00:00:00", - "2025-01-28T00:00:00", - "2025-01-29T00:00:00", - "2025-01-30T00:00:00", - "2025-01-31T00:00:00", - "2025-02-03T00:00:00", - "2025-02-04T00:00:00", - "2025-02-05T00:00:00", - "2025-02-06T00:00:00", - "2025-02-07T00:00:00", - "2025-02-10T00:00:00", - "2025-02-11T00:00:00", - "2025-02-12T00:00:00", - "2025-02-13T00:00:00", - "2025-02-14T00:00:00", - "2025-02-19T00:00:00", - "2025-02-20T00:00:00", - "2025-02-21T00:00:00", - "2025-02-24T00:00:00", - "2025-02-25T00:00:00", - "2025-02-26T00:00:00", - "2025-02-27T00:00:00", - "2025-02-28T00:00:00", - "2025-03-03T00:00:00", - "2025-03-04T00:00:00", - "2025-03-05T00:00:00", - "2025-03-06T00:00:00", - "2025-03-07T00:00:00", - "2025-03-10T00:00:00", - "2025-03-11T00:00:00", - "2025-03-12T00:00:00", - "2025-03-13T00:00:00", - "2025-03-14T00:00:00", - "2025-03-17T00:00:00", - "2025-03-18T00:00:00", - "2025-03-19T00:00:00", - "2025-03-20T00:00:00", - "2025-03-21T00:00:00", - "2025-03-24T00:00:00", - "2025-03-25T00:00:00", - "2025-03-26T00:00:00", - "2025-03-27T00:00:00", - "2025-03-28T00:00:00", - "2025-03-31T00:00:00", - "2025-04-01T00:00:00", - "2025-04-02T00:00:00", - "2025-04-03T00:00:00", - "2025-04-04T00:00:00", - "2025-04-07T00:00:00", - "2025-04-08T00:00:00", - "2025-04-09T00:00:00", - "2025-04-10T00:00:00", - "2025-04-11T00:00:00", - "2025-04-14T00:00:00", - "2025-04-15T00:00:00", - "2025-04-16T00:00:00", - "2025-04-17T00:00:00", - "2025-04-22T00:00:00", - "2025-04-23T00:00:00", - "2025-04-24T00:00:00", - "2025-04-25T00:00:00", - "2025-04-28T00:00:00", - "2025-04-29T00:00:00", - "2025-04-30T00:00:00", - "2025-05-01T00:00:00", - "2025-05-02T00:00:00", - "2025-05-05T00:00:00", - "2025-05-06T00:00:00", - "2025-05-07T00:00:00", - "2025-05-08T00:00:00", - "2025-05-09T00:00:00", - "2025-05-12T00:00:00", - "2025-05-13T00:00:00", - "2025-05-14T00:00:00", - "2025-05-15T00:00:00", - "2025-05-16T00:00:00", - "2025-05-19T00:00:00", - "2025-05-20T00:00:00", - "2025-05-21T00:00:00", - "2025-05-22T00:00:00", - "2025-05-23T00:00:00", - "2025-05-28T00:00:00", - "2025-05-29T00:00:00", - "2025-05-30T00:00:00", - "2025-06-02T00:00:00", - "2025-06-03T00:00:00", - "2025-06-04T00:00:00", - "2025-06-05T00:00:00", - "2025-06-06T00:00:00", - "2025-06-09T00:00:00", - "2025-06-10T00:00:00", - "2025-06-11T00:00:00", - "2025-06-12T00:00:00", - "2025-06-13T00:00:00", - "2025-06-16T00:00:00", - "2025-06-17T00:00:00", - "2025-06-18T00:00:00" - ], - "xaxis": "x", - "y": [ - 0.3367385296305356, - 0.294279363250572, - 0.2857383991679775, - 0.3175063723538867, - 0.3082102212127868, - 0.3018420797619498, - 0.27302406480865526, - 0.28598417404996385, - 0.27473913197290695, - 0.2837133162970049, - 0.2847520169558228, - 0.31160272543572554, - 0.295803455108887, - 0.29224961461210214, - 0.2884874612918961, - 0.2756270682588713, - 0.23003942003550584, - 0.21364464535856023, - 0.23933822554896303, - 0.23396969489343208, - 0.2297947320560831, - 0.2194089713575329, - 0.21905603384499997, - 0.23259320280967258, - 0.23665203469637586, - 0.2623861575469056, - 0.29825640771718126, - 0.31340447548238104, - 0.34940900762066834, - 0.34933492588112697, - 0.35633576179825255, - 0.4638608205919516, - 0.48087198653684066, - 0.46597379690633106, - 0.47553431118635764, - 0.4799667037088962, - 0.3608122414231407, - 0.3584682832654513, - 0.36328190475325606, - 0.363157762383953, - 0.4140189299281329, - 0.4146185690100816, - 0.43130684932688723, - 0.39432118258809096, - 0.37143972566496, - 0.3348403791457593, - 0.3321815504842051, - 0.3148172987087501, - 1.0179831247031508, - 1.035409108301747, - 1.031881469959292, - 1.0193645331387307, - 1.0477243997208439, - 0.5897257712085495, - 0.5759056221035953, - 0.5635874045766888, - 0.582410791978212, - 0.5492238267180737, - 0.5732709263415351, - 0.634481259094316, - 0.6299500317102297, - 0.6263601786594023, - 0.6156491013194987, - 0.5614397163251698, - 0.5083730715948762, - 0.5385657007756519, - 0.549117228921434, - 0.6224006252030178, - 0.4052799125330422, - 0.40573247357903036, - 0.44393837701358674, - 0.4442204990400531, - 0.3581244301225879, - 0.3536458461891813, - 0.3548267196232813, - 0.32734821553054977, - 0.33114070342750096, - 0.34658860186291846, - 0.3587577728268451, - 0.343409078847236, - 0.33846709736777675, - 0.32356540808252815, - 0.33152275678629534, - 0.3042079376365738, - 0.32113561027945076, - 0.31998399852768517, - 0.3188974890521087, - 0.28487554658291886, - 0.30840384328236664, - 0.3254590386131195, - 0.32019118368496363, - 0.31976328068539694, - 0.3214100976423086, - 0.29386821239885613, - 0.2892397677523162, - 0.28109071273243375, - 0.279249609518807, - 0.2790740830291833, - 0.27759080827231236, - 0.2601594545030996, - 0.25947401142654014, - 0.26800115303422917, - 0.25878440393520713, - 0.2532150707137882, - 0.2638895111744829, - 0.29186507677681855, - 0.290271088632817, - 0.2963222226356908, - 0.2876018562748059, - 0.2911547215588632, - 0.311493129776231, - 0.22713983659395823, - 0.2174851456803276, - 0.2226532280581407, - 0.22264187574717567, - 0.20996042819013597, - 0.22507447171304218, - 0.21814895456751174, - 0.2354273757505179, - 0.2485581231084317, - 0.24618990826510354, - 0.23073580239955493, - 0.22587678582859164, - 0.22570501464628942, - 0.1876955970377324, - 0.18599127430111326, - 0.19321340496488404, - 0.1937244713858314, - 0.19374809538328597, - 0.19316432860172159, - 0.17949115317700434, - 0.16897009009509878, - 0.15117902302523087, - 0.24489777663992862, - 0.24562613294214652, - 0.23568648717926463, - 0.22927404563859224, - 0.22363570387038378, - 0.17459075614948516, - 0.24642412770428831, - 0.23048313882211438, - 0.23787930192262705, - 0.23518865181118262, - 0.23228910932601643, - 0.20346525163187187, - 0.2027242494868364, - 0.1716023204593243, - 0.18367244892361648, - 0.18829979410626133, - 0.1861475035950644, - 0.1986453627467811, - 0.1942393110577381, - 0.19057746952672236, - 0.1657423684378341, - 0.16357188087085503, - 0.15374847996383303, - 0.15017595390394675, - 0.3610287381738407, - 0.35880610897223747, - 0.375900985973237, - 0.3781076128038207, - 0.37316136332571537, - 0.25707876421282194, - 0.2636779065349551, - 0.24494044721199462, - 0.2563226428696645, - 0.23763566670491873, - 0.24519136157746693, - 0.24077113392654795, - 0.24285401075948854, - 0.24168291330913963, - 0.24136548867028984, - 0.2349649104514869, - 0.24864597676470046, - 0.25427685636445385, - 0.2680033626268324, - 0.273121552487483, - 0.20670164672765745, - 0.20785134649282488, - 0.24863909633055967, - 0.24463141107390304, - 0.3286685579429048, - 0.3235685801388346, - 0.35892522392763815, - 0.3607513191926011, - 0.3560868501510819, - 0.3283396378707891, - 0.3516703802009447, - 0.3160204810901984, - 0.3114175279788847, - 0.3142129840806706, - 0.2710065240539959, - 0.2864766247045724, - 0.27844726121911695, - 0.27895723242362297, - 0.3065292186675654, - 0.3054893386207804, - 0.28753771610969314, - 0.27244948826863147, - 0.2694089487378741, - 0.25597125747373983, - 0.5698655029623415, - 0.6093953666985263, - 0.5860896260300584, - 0.5805891811808128, - 0.8227087100780808, - 0.7465802706478076, - 0.6926470408963011, - 0.6778717964315796, - 0.6885176195140971, - 0.5082010394104021, - 0.4892585654570307, - 0.4944938578962536, - 0.5045985720746419, - 0.49915622150137634, - 0.4142035131393123, - 0.41946771799653293, - 0.4187753585550869, - 0.5503310898197488, - 0.5664158111195888, - 0.5835653746683345, - 0.5711276860364105, - 0.5557697154026483, - 0.48397224382968823, - 0.4747089531531303, - 0.3854172509235423, - 0.4811476817668499, - 0.48202394594950565, - 0.48357956559965665, - 0.47569585801817493, - 0.46507939836032725, - 0.3707042629826936, - 0.3670250922815918, - 0.3996988006073268, - 0.404384778168333, - 0.4009609958758035, - 0.4016351860963663, - 0.40199737176284644, - 0.36154118433813665, - 0.3638542163808672, - 0.37153912083906704, - 0.3671133373999851, - 0.34601211667589965, - 0.36529333111061674, - 0.3614895220238636, - 0.3562704973348509, - 0.36876062791698244, - 0.3666817700827947, - 0.3747566710855647, - 0.37357555478767207, - 0.38873816362999175, - 0.3158227319116034 - ], - "yaxis": "y" - } - ], - "layout": { - "legend": { - "title": { - "text": "variable" - }, - "tracegroupgap": 0 - }, - "margin": { - "t": 60 - }, - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "heatmapgl": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmapgl" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "xaxis": { - "anchor": "y", - "domain": [ - 0, - 1 - ], - "title": { - "text": "index" - } - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0, - 1 - ], - "title": { - "text": "value" - } - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "hovertemplate": "variable=rvol_30D
index=%{x}
value=%{y}", - "legendgroup": "rvol_30D", - "line": { - "color": "#636efa", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "rvol_30D", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": [ - "2024-05-31T00:00:00", - "2024-06-03T00:00:00", - "2024-06-04T00:00:00", - "2024-06-05T00:00:00", - "2024-06-06T00:00:00", - "2024-06-07T00:00:00", - "2024-06-10T00:00:00", - "2024-06-11T00:00:00", - "2024-06-12T00:00:00", - "2024-06-13T00:00:00", - "2024-06-14T00:00:00", - "2024-06-17T00:00:00", - "2024-06-18T00:00:00", - "2024-06-21T00:00:00", - "2024-06-24T00:00:00", - "2024-06-25T00:00:00", - "2024-06-26T00:00:00", - "2024-06-27T00:00:00", - "2024-06-28T00:00:00", - "2024-07-01T00:00:00", - "2024-07-02T00:00:00", - "2024-07-03T00:00:00", - "2024-07-08T00:00:00", - "2024-07-09T00:00:00", - "2024-07-10T00:00:00", - "2024-07-11T00:00:00", - "2024-07-12T00:00:00", - "2024-07-15T00:00:00", - "2024-07-16T00:00:00", - "2024-07-17T00:00:00", - "2024-07-18T00:00:00", - "2024-07-19T00:00:00", - "2024-07-22T00:00:00", - "2024-07-23T00:00:00", - "2024-07-24T00:00:00", - "2024-07-25T00:00:00", - "2024-07-26T00:00:00", - "2024-07-29T00:00:00", - "2024-07-30T00:00:00", - "2024-07-31T00:00:00", - "2024-08-01T00:00:00", - "2024-08-02T00:00:00", - "2024-08-05T00:00:00", - "2024-08-06T00:00:00", - "2024-08-07T00:00:00", - "2024-08-08T00:00:00", - "2024-08-09T00:00:00", - "2024-08-12T00:00:00", - "2024-08-13T00:00:00", - "2024-08-14T00:00:00", - "2024-08-15T00:00:00", - "2024-08-16T00:00:00", - "2024-08-19T00:00:00", - "2024-08-20T00:00:00", - "2024-08-21T00:00:00", - "2024-08-22T00:00:00", - "2024-08-23T00:00:00", - "2024-08-26T00:00:00", - "2024-08-27T00:00:00", - "2024-08-28T00:00:00", - "2024-08-29T00:00:00", - "2024-08-30T00:00:00", - "2024-09-04T00:00:00", - "2024-09-05T00:00:00", - "2024-09-06T00:00:00", - "2024-09-09T00:00:00", - "2024-09-10T00:00:00", - "2024-09-11T00:00:00", - "2024-09-12T00:00:00", - "2024-09-13T00:00:00", - "2024-09-16T00:00:00", - "2024-09-17T00:00:00", - "2024-09-18T00:00:00", - "2024-09-19T00:00:00", - "2024-09-20T00:00:00", - "2024-09-23T00:00:00", - "2024-09-24T00:00:00", - "2024-09-25T00:00:00", - "2024-09-26T00:00:00", - "2024-09-27T00:00:00", - "2024-09-30T00:00:00", - "2024-10-01T00:00:00", - "2024-10-02T00:00:00", - "2024-10-03T00:00:00", - "2024-10-04T00:00:00", - "2024-10-07T00:00:00", - "2024-10-08T00:00:00", - "2024-10-09T00:00:00", - "2024-10-10T00:00:00", - "2024-10-11T00:00:00", - "2024-10-14T00:00:00", - "2024-10-15T00:00:00", - "2024-10-16T00:00:00", - "2024-10-17T00:00:00", - "2024-10-18T00:00:00", - "2024-10-21T00:00:00", - "2024-10-22T00:00:00", - "2024-10-23T00:00:00", - "2024-10-24T00:00:00", - "2024-10-25T00:00:00", - "2024-10-28T00:00:00", - "2024-10-29T00:00:00", - "2024-10-30T00:00:00", - "2024-10-31T00:00:00", - "2024-11-01T00:00:00", - "2024-11-04T00:00:00", - "2024-11-05T00:00:00", - "2024-11-06T00:00:00", - "2024-11-07T00:00:00", - "2024-11-08T00:00:00", - "2024-11-11T00:00:00", - "2024-11-12T00:00:00", - "2024-11-13T00:00:00", - "2024-11-14T00:00:00", - "2024-11-15T00:00:00", - "2024-11-18T00:00:00", - "2024-11-19T00:00:00", - "2024-11-20T00:00:00", - "2024-11-21T00:00:00", - "2024-11-22T00:00:00", - "2024-11-25T00:00:00", - "2024-11-26T00:00:00", - "2024-11-27T00:00:00", - "2024-12-02T00:00:00", - "2024-12-03T00:00:00", - "2024-12-04T00:00:00", - "2024-12-05T00:00:00", - "2024-12-06T00:00:00", - "2024-12-09T00:00:00", - "2024-12-10T00:00:00", - "2024-12-11T00:00:00", - "2024-12-12T00:00:00", - "2024-12-13T00:00:00", - "2024-12-16T00:00:00", - "2024-12-17T00:00:00", - "2024-12-18T00:00:00", - "2024-12-19T00:00:00", - "2024-12-20T00:00:00", - "2024-12-23T00:00:00", - "2024-12-24T00:00:00", - "2024-12-27T00:00:00", - "2024-12-30T00:00:00", - "2024-12-31T00:00:00", - "2025-01-03T00:00:00", - "2025-01-06T00:00:00", - "2025-01-07T00:00:00", - "2025-01-08T00:00:00", - "2025-01-13T00:00:00", - "2025-01-14T00:00:00", - "2025-01-15T00:00:00", - "2025-01-16T00:00:00", - "2025-01-17T00:00:00", - "2025-01-22T00:00:00", - "2025-01-23T00:00:00", - "2025-01-24T00:00:00", - "2025-01-27T00:00:00", - "2025-01-28T00:00:00", - "2025-01-29T00:00:00", - "2025-01-30T00:00:00", - "2025-01-31T00:00:00", - "2025-02-03T00:00:00", - "2025-02-04T00:00:00", - "2025-02-05T00:00:00", - "2025-02-06T00:00:00", - "2025-02-07T00:00:00", - "2025-02-10T00:00:00", - "2025-02-11T00:00:00", - "2025-02-12T00:00:00", - "2025-02-13T00:00:00", - "2025-02-14T00:00:00", - "2025-02-19T00:00:00", - "2025-02-20T00:00:00", - "2025-02-21T00:00:00", - "2025-02-24T00:00:00", - "2025-02-25T00:00:00", - "2025-02-26T00:00:00", - "2025-02-27T00:00:00", - "2025-02-28T00:00:00", - "2025-03-03T00:00:00", - "2025-03-04T00:00:00", - "2025-03-05T00:00:00", - "2025-03-06T00:00:00", - "2025-03-07T00:00:00", - "2025-03-10T00:00:00", - "2025-03-11T00:00:00", - "2025-03-12T00:00:00", - "2025-03-13T00:00:00", - "2025-03-14T00:00:00", - "2025-03-17T00:00:00", - "2025-03-18T00:00:00", - "2025-03-19T00:00:00", - "2025-03-20T00:00:00", - "2025-03-21T00:00:00", - "2025-03-24T00:00:00", - "2025-03-25T00:00:00", - "2025-03-26T00:00:00", - "2025-03-27T00:00:00", - "2025-03-28T00:00:00", - "2025-03-31T00:00:00", - "2025-04-01T00:00:00", - "2025-04-02T00:00:00", - "2025-04-03T00:00:00", - "2025-04-04T00:00:00", - "2025-04-07T00:00:00", - "2025-04-08T00:00:00", - "2025-04-09T00:00:00", - "2025-04-10T00:00:00", - "2025-04-11T00:00:00", - "2025-04-14T00:00:00", - "2025-04-15T00:00:00", - "2025-04-16T00:00:00", - "2025-04-17T00:00:00", - "2025-04-22T00:00:00", - "2025-04-23T00:00:00", - "2025-04-24T00:00:00", - "2025-04-25T00:00:00", - "2025-04-28T00:00:00", - "2025-04-29T00:00:00", - "2025-04-30T00:00:00", - "2025-05-01T00:00:00", - "2025-05-02T00:00:00", - "2025-05-05T00:00:00", - "2025-05-06T00:00:00", - "2025-05-07T00:00:00", - "2025-05-08T00:00:00", - "2025-05-09T00:00:00", - "2025-05-12T00:00:00", - "2025-05-13T00:00:00", - "2025-05-14T00:00:00", - "2025-05-15T00:00:00", - "2025-05-16T00:00:00", - "2025-05-19T00:00:00", - "2025-05-20T00:00:00", - "2025-05-21T00:00:00", - "2025-05-22T00:00:00", - "2025-05-23T00:00:00", - "2025-05-28T00:00:00", - "2025-05-29T00:00:00", - "2025-05-30T00:00:00", - "2025-06-02T00:00:00", - "2025-06-03T00:00:00", - "2025-06-04T00:00:00", - "2025-06-05T00:00:00", - "2025-06-06T00:00:00", - "2025-06-09T00:00:00", - "2025-06-10T00:00:00", - "2025-06-11T00:00:00", - "2025-06-12T00:00:00", - "2025-06-13T00:00:00", - "2025-06-16T00:00:00", - "2025-06-17T00:00:00", - "2025-06-18T00:00:00" - ], - "xaxis": "x", - "y": [ - 0.5639915521293248, - 0.567421543602405, - 0.5678463950204488, - 0.5698471309176805, - 0.5700926298793776, - 0.5690015647726073, - 0.5686152901993582, - 0.5709662192072363, - 0.5709553714261909, - 0.5721973826553566, - 0.26051232766240334, - 0.2655388577009346, - 0.25751330112374216, - 0.25680032013499116, - 0.2559434263617511, - 0.2556931651479823, - 0.24388898097223624, - 0.24369696298212837, - 0.25038607043285915, - 0.25107732835924984, - 0.251553031629236, - 0.2520573131236149, - 0.2396003350601718, - 0.24950558130278291, - 0.24934069928515948, - 0.22325692773684574, - 0.21651634862926025, - 0.22933673081077985, - 0.25484487890241236, - 0.24437576000059044, - 0.2390012333467955, - 0.3031011567953136, - 0.31719536011161187, - 0.3128512908618372, - 0.31719695434262274, - 0.3203800249900802, - 0.32229865732079177, - 0.32175609569850566, - 0.3231304965064151, - 0.3310324101784845, - 0.347094654175396, - 0.34241940446236735, - 0.34838368184826146, - 0.35433026864108896, - 0.3543355168393296, - 0.3548647151037289, - 0.3554998480610017, - 0.36408131588467924, - 0.7309444773507247, - 0.7340241761384001, - 0.7334077199664327, - 0.7325065962251878, - 0.7350966956717372, - 0.7288814128297856, - 0.728771840897212, - 0.72954606343118, - 0.7290658772313219, - 0.721506861739615, - 0.7195088869049984, - 0.7291696094308312, - 0.7276830529413806, - 0.7070801219431324, - 0.698049911814662, - 0.6987763106222213, - 0.6947609007179293, - 0.690612661772524, - 0.6906947669381786, - 0.7014109247194028, - 0.7014245111247039, - 0.7011763195238279, - 0.6944680060574419, - 0.6947845668689625, - 0.687636714633991, - 0.686854659433153, - 0.6881940579474568, - 0.6894612356651628, - 0.6899356865804488, - 0.6881067203459642, - 0.2732594790602154, - 0.2652320950679158, - 0.2639515000209327, - 0.2639431283172831, - 0.2523956719991738, - 0.254041957708428, - 0.25514014947375463, - 0.2554178925080282, - 0.2512823677826706, - 0.24711738613015094, - 0.23779835552617556, - 0.22233241144050647, - 0.22333328064481628, - 0.2231895293617421, - 0.22145879235383434, - 0.21984990413739042, - 0.22332806955285786, - 0.2221080121386062, - 0.21992612059537, - 0.16429332081944842, - 0.16141426594158184, - 0.16037074887059793, - 0.14649646350858023, - 0.14788025858680248, - 0.1475137841390818, - 0.146115298375823, - 0.14725356127130895, - 0.15687506672844548, - 0.15312028357020238, - 0.15261848723602814, - 0.14160982038633438, - 0.14829894758380635, - 0.1688399308895014, - 0.17516228169014905, - 0.17462162189191066, - 0.17280417680520957, - 0.1725505772145578, - 0.18039371589300693, - 0.19142621435756013, - 0.19108828154308244, - 0.18577860474547783, - 0.19132541569134126, - 0.1905076066111664, - 0.19467695871121043, - 0.19540928680848424, - 0.1978622241622289, - 0.19301045237991685, - 0.19455093162084142, - 0.199662868913105, - 0.19976703390695266, - 0.20065118703499452, - 0.2036237941970117, - 0.20262367995818467, - 0.20253636948092998, - 0.20285332430446443, - 0.240403060130514, - 0.2381572903035191, - 0.24172732622631296, - 0.24316326072503308, - 0.24281481525000911, - 0.24268896443398225, - 0.2539379144766119, - 0.23763054320902283, - 0.23908316091678503, - 0.2378344708185132, - 0.23901906545110996, - 0.24019702158032966, - 0.22999144893862275, - 0.22451386299203716, - 0.2297507409078985, - 0.2209453871576473, - 0.20514801300742877, - 0.2121580975015027, - 0.213237969045115, - 0.21053119315648375, - 0.21050851607520116, - 0.21286577717522076, - 0.216451484431906, - 0.21375925917545338, - 0.31403770523518554, - 0.31302346606127796, - 0.313218589459788, - 0.3133355042429782, - 0.3183285709479001, - 0.3197984455643532, - 0.2869405882311735, - 0.2832606584103757, - 0.27220457770105566, - 0.26825331671585784, - 0.266941932963993, - 0.26513124038834385, - 0.2589816956798815, - 0.2607035533681859, - 0.25099707020076006, - 0.25772344068293923, - 0.25858513059525035, - 0.25929084218268555, - 0.2644332242931428, - 0.26414612333995396, - 0.2636977718339625, - 0.2632786655300579, - 0.28232697583619343, - 0.2819008974724839, - 0.3336740263427569, - 0.33398009411086343, - 0.3691634145866507, - 0.37143408108915854, - 0.3705263361098953, - 0.37815040344765966, - 0.30204385846641, - 0.30380518773454346, - 0.3030005582979587, - 0.30435689431069574, - 0.29505410991168984, - 0.29449148257970487, - 0.29564883595333324, - 0.29495743075694103, - 0.3050610384892234, - 0.30751830563646504, - 0.30100222704927526, - 0.30176775911722276, - 0.30231105275316444, - 0.306122243446841, - 0.4500099262068652, - 0.48666421937700055, - 0.4836346595945665, - 0.4789495456925531, - 0.5900679172098616, - 0.597046642474576, - 0.5965334864478774, - 0.597060309254245, - 0.5951728166118222, - 0.5995913847805439, - 0.5855767747500964, - 0.58665127208236, - 0.5751476698362176, - 0.577023702650669, - 0.5770821690532026, - 0.5734779883296917, - 0.5703233846139925, - 0.5892588538593402, - 0.5960189619291947, - 0.6046520189905114, - 0.6111690738778446, - 0.6117485921052565, - 0.6112486138467008, - 0.6109823936338992, - 0.6079813629790042, - 0.6407488663274457, - 0.6425817739713401, - 0.642212799648634, - 0.6430086534456578, - 0.6428694358703683, - 0.5447628007038203, - 0.5019534931734307, - 0.5045802284788733, - 0.5051682409171977, - 0.3960025531654268, - 0.3730542027281708, - 0.377528879069172, - 0.37748495445795494, - 0.37542449504277176, - 0.36248279040520487, - 0.36471096529681585, - 0.3655128219531223, - 0.3736085442779169, - 0.37332404867390034, - 0.3737690443111676, - 0.3917477825914068, - 0.39319403161490324, - 0.35150676110747436, - 0.3463079099620057, - 0.3418012959609369, - 0.3224988014724663 - ], - "yaxis": "y" - } - ], - "layout": { - "legend": { - "title": { - "text": "variable" - }, - "tracegroupgap": 0 - }, - "margin": { - "t": 60 - }, - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "heatmapgl": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmapgl" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "xaxis": { - "anchor": "y", - "domain": [ - 0, - 1 - ], - "title": { - "text": "index" - } - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0, - 1 - ], - "title": { - "text": "value" - } - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "Stock('SBUX').rvol(\n", - " ts_start=pd.to_datetime(rm.start_date) - relativedelta(years=1),\n", - " ts_end=pd.to_datetime(rm.end_date) + BDay(1),\n", - " window=pv_sizer.rvol_window,\n", - " log=True\n", - ")['rvol_30D'][-252:].plot()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1.0665817441502536" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "sizer = DefaultSizer(evb_backtest.portfolio, evb_backtest.portfolio.risk_manager, 4.5)\n", - "sizer.re_update_on_roll = True # Set to True to re-update limits on roll\n", - "sizer.calculate_position_size('SBUX20230105LONG',\n", - " '&L:SBUX20240119C130&S:SBUX20240119C135', 1.025,\n", - " '2023-01-05')\n", - "sizer.calculate_position_size('BA20230105LONG',\n", - " '&L:BA20240119C260&S:BA20240119C265', 1.10,\n", - " '2023-01-05')\n", - "# rm.greek_limits\n", - "sizer.get_daily_delta_limit('SBUX20230105LONG', '&L:SBUX20240119C130&S:SBUX20240119C135', '2023-01-05')" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "openbb", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.13" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/EventDriven/demos/RiskManager.ipynb b/EventDriven/demos/RiskManager.ipynb deleted file mode 100644 index e99eab8..0000000 --- a/EventDriven/demos/RiskManager.ipynb +++ /dev/null @@ -1,37120 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import faulthandler, sys, signal\n", - "faulthandler.enable(all_threads=True, file=sys.stderr)\n", - "faulthandler.register(signal.SIGUSR1, all_threads=True, file=sys.stderr)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Console Logging & File Logging Can be configured using STREAM_LOG_LEVEL and FILE_LOG_LEVEL in environment variables.\n", - "Propagate to root logger can be set using PROPAGATE_TO_ROOT_LOGGER in environment variables.\n", - "Example:\n", - "STREAM_LOG_LEVEL = 'DEBUG'\n", - "FILE_LOG_LEVEL = 'INFO'\n", - "PROPAGATE_TO_ROOT_LOGGER = 'False'\n", - "\n", - "2025-06-07 10:07:50 trade.helpers.Logging INFO: Logging Root Directory: /Users/chiemelienwanisobi/cloned_repos/QuantTools/logs\n", - "Using Proxy URL: http://34.235.162.150:5500/thetadata\n", - "\n", - "\n", - "Scheduled Data Requests will be saved to: /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/scheduler/requests.jsonl\n" - ] - } - ], - "source": [ - "%load_ext autoreload\n", - "%load_ext line_profiler\n", - "%autoreload 2\n", - "import os, sys\n", - "import warnings\n", - "warnings.filterwarnings(\"ignore\")\n", - "# os.environ['PROXY_URL'] = ''\n", - "from module_test.raw_code.DataManagers.DataManagers import (_SaveManager, \n", - " OptionDataManager, \n", - " ChainDataManager, \n", - " DB_CACHE)\n", - "from EventDriven.riskmanager import RiskManager\n", - "from EventDriven.riskmanager.utils import (\n", - " LOOKBACKS, \n", - " close_cache, \n", - " chain_cache, \n", - " oi_cache, \n", - " spot_cache,\n", - " clear_cache,\n", - " get_cache,\n", - " populate_cache_with_chain,\n", - " logger\n", - ")\n", - "from EventDriven.types import ResultsEnum\n", - "from trade.helpers.helper import (find_split_dates_within_range, \n", - " CustomCache)\n", - "from pathlib import Path\n", - "from trade.helpers.helper import (find_split_dates_within_range, \n", - " generate_option_tick_new)\n", - "\n", - "from dbase.DataAPI.ThetaData import (list_contracts, resample, \n", - " retrieve_chain_bulk)\n", - "from trade.assets.Calculate import Calculate\n", - "from trade.helpers.threads import runThreads\n", - "from trade.helpers.helper import (parse_option_tick, \n", - " binomial_implied_vol, \n", - " retrieve_timeseries, \n", - " parse_option_tick, \n", - " change_to_last_busday,\n", - " compare_dates)\n", - "\n", - "from trade.assets.rates import get_risk_free_rate_helper\n", - "from dateutil.relativedelta import relativedelta\n", - "from dbase.DataAPI.ThetaData import retrieve_eod_ohlc\n", - "from pandas.tseries.offsets import BDay\n", - "from trade.assets.Stock import Stock\n", - "import pandas as pd\n", - "from datetime import datetime, timedelta\n", - "from trade.helpers.decorators import cProfiler, cprofiler_func\n", - "pd.set_option('display.max_columns', 50)\n", - "pd.set_option('display.max_rows', 150)\n", - "import math\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[get_engine] Creating engine for DB: securities_master, PID: 2414\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
dailyannualizednamedescription
Datetime
2010-01-010.0000000.0000000
2010-01-040.0000020.00055^IRX13 week treasury bill
2010-01-050.0000020.00060^IRX13 week treasury bill
2010-01-060.0000010.00045^IRX13 week treasury bill
2010-01-070.0000010.00045^IRX13 week treasury bill
...............
2025-06-020.0001140.04232^IRX13 WEEK TREASURY BILL
2025-06-030.0001140.04232^IRX13 WEEK TREASURY BILL
2025-06-040.0001140.04235^IRX13 WEEK TREASURY BILL
2025-06-050.0001140.04240^IRX13 WEEK TREASURY BILL
2025-06-060.0001140.04232^IRX13 WEEK TREASURY BILL
\n", - "

4026 rows × 4 columns

\n", - "
" - ], - "text/plain": [ - " daily annualized name description\n", - "Datetime \n", - "2010-01-01 0.000000 0.00000 0 0\n", - "2010-01-04 0.000002 0.00055 ^IRX 13 week treasury bill\n", - "2010-01-05 0.000002 0.00060 ^IRX 13 week treasury bill\n", - "2010-01-06 0.000001 0.00045 ^IRX 13 week treasury bill\n", - "2010-01-07 0.000001 0.00045 ^IRX 13 week treasury bill\n", - "... ... ... ... ...\n", - "2025-06-02 0.000114 0.04232 ^IRX 13 WEEK TREASURY BILL\n", - "2025-06-03 0.000114 0.04232 ^IRX 13 WEEK TREASURY BILL\n", - "2025-06-04 0.000114 0.04235 ^IRX 13 WEEK TREASURY BILL\n", - "2025-06-05 0.000114 0.04240 ^IRX 13 WEEK TREASURY BILL\n", - "2025-06-06 0.000114 0.04232 ^IRX 13 WEEK TREASURY BILL\n", - "\n", - "[4026 rows x 4 columns]" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from trade.assets.rates import get_risk_free_rate_helper\n", - "(get_risk_free_rate_helper('1d'))" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "287" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from EventDriven.portfolio import OptionSignalPortfolio\n", - "from EventDriven.backtest import OptionSignalBacktest\n", - "from copy import deepcopy\n", - "from functools import partial\n", - "from EventDriven.riskmanager.utils import PERSISTENT_CACHE\n", - "\n", - "len(PERSISTENT_CACHE.keys())\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# ***WHOLE RUN***" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### ***INITIAL BACKTEST RUN***" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
SizeEntryBarExitBarEntryPriceExitPricePnLReturnPctEntryTimeExitTimeDurationTicker
024502511249.189127202.630005-1117.418939-0.1868432024-01-032024-01-1714BA
166502533184.864771183.419998-95.355022-0.0078152024-01-032024-02-1644AAPL
2120502585136.184992145.5099951119.0003320.0684732024-01-032024-05-02120AMD
345502637346.187441475.0000005796.5651540.3720892024-01-032024-07-18197META
416502752653.489257923.6500244322.5722780.4134132024-01-032024-12-31363COST
514502752468.955627901.7999886059.8210460.9229962024-01-032024-12-31363NFLX
660050975254.811169138.02999949931.2979111.5182822024-01-122024-12-31354NVDA
720521643157.549500180.389999456.8099880.1449732024-01-312024-07-26177AMZN
89052953097.25921894.849998-216.829772-0.0247712024-02-122024-02-131SBUX
9112588617156.867127156.99000513.7623520.0007832024-05-072024-06-1842AMD
1065592752186.089042252.4400024312.8123990.3565552024-05-132024-12-31232AAPL
1172627649235.380958185.220001-3611.588856-0.2131052024-07-032024-08-0533TSLA
1297635637180.318917163.410004-1640.164637-0.0937722024-07-162024-07-182AMD
1344648650490.711500479.000000-515.306000-0.0238662024-08-022024-08-064META
149165874593.68676190.239998-313.655410-0.0367902024-08-162024-12-19125SBUX
1563658752211.889019423.79000913349.7623491.0000562024-08-162024-12-31137TSLA
1636687752572.095326592.270020726.2889850.0352652024-09-272024-12-3195META
1792694700172.351125158.070007-1313.862826-0.0828612024-10-082024-10-168AMD
1817719752209.099290222.970001235.8020890.0663362024-11-122024-12-3149AMZN
1927747752178.743415177.539993-32.492389-0.0067332024-12-232024-12-318BA
\n", - "
" - ], - "text/plain": [ - " Size EntryBar ExitBar EntryPrice ExitPrice PnL ReturnPct \\\n", - "0 24 502 511 249.189127 202.630005 -1117.418939 -0.186843 \n", - "1 66 502 533 184.864771 183.419998 -95.355022 -0.007815 \n", - "2 120 502 585 136.184992 145.509995 1119.000332 0.068473 \n", - "3 45 502 637 346.187441 475.000000 5796.565154 0.372089 \n", - "4 16 502 752 653.489257 923.650024 4322.572278 0.413413 \n", - "5 14 502 752 468.955627 901.799988 6059.821046 0.922996 \n", - "6 600 509 752 54.811169 138.029999 49931.297911 1.518282 \n", - "7 20 521 643 157.549500 180.389999 456.809988 0.144973 \n", - "8 90 529 530 97.259218 94.849998 -216.829772 -0.024771 \n", - "9 112 588 617 156.867127 156.990005 13.762352 0.000783 \n", - "10 65 592 752 186.089042 252.440002 4312.812399 0.356555 \n", - "11 72 627 649 235.380958 185.220001 -3611.588856 -0.213105 \n", - "12 97 635 637 180.318917 163.410004 -1640.164637 -0.093772 \n", - "13 44 648 650 490.711500 479.000000 -515.306000 -0.023866 \n", - "14 91 658 745 93.686761 90.239998 -313.655410 -0.036790 \n", - "15 63 658 752 211.889019 423.790009 13349.762349 1.000056 \n", - "16 36 687 752 572.095326 592.270020 726.288985 0.035265 \n", - "17 92 694 700 172.351125 158.070007 -1313.862826 -0.082861 \n", - "18 17 719 752 209.099290 222.970001 235.802089 0.066336 \n", - "19 27 747 752 178.743415 177.539993 -32.492389 -0.006733 \n", - "\n", - " EntryTime ExitTime Duration Ticker \n", - "0 2024-01-03 2024-01-17 14 BA \n", - "1 2024-01-03 2024-02-16 44 AAPL \n", - "2 2024-01-03 2024-05-02 120 AMD \n", - "3 2024-01-03 2024-07-18 197 META \n", - "4 2024-01-03 2024-12-31 363 COST \n", - "5 2024-01-03 2024-12-31 363 NFLX \n", - "6 2024-01-12 2024-12-31 354 NVDA \n", - "7 2024-01-31 2024-07-26 177 AMZN \n", - "8 2024-02-12 2024-02-13 1 SBUX \n", - "9 2024-05-07 2024-06-18 42 AMD \n", - "10 2024-05-13 2024-12-31 232 AAPL \n", - "11 2024-07-03 2024-08-05 33 TSLA \n", - "12 2024-07-16 2024-07-18 2 AMD \n", - "13 2024-08-02 2024-08-06 4 META \n", - "14 2024-08-16 2024-12-19 125 SBUX \n", - "15 2024-08-16 2024-12-31 137 TSLA \n", - "16 2024-09-27 2024-12-31 95 META \n", - "17 2024-10-08 2024-10-16 8 AMD \n", - "18 2024-11-12 2024-12-31 49 AMZN \n", - "19 2024-12-23 2024-12-31 8 BA " - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import json\n", - "pd.set_option('display.max_columns', 100)\n", - "pd.set_option('display.max_rows', 100)\n", - "_key = 11\n", - "with open(f'../input/profitable_weights_{_key}.json', 'r') as f:\n", - " weights = json.load(f)\n", - "ttrades__ = pd.read_csv(f'../input/profitable_trades_{_key}.csv').iloc[:, 1:]\n", - "ttrades__['Duration'] = ttrades__.Duration.apply(lambda x: int(x.split(' ')[0]))\n", - "tick = ['AAPL', 'NFLX', 'NVDA']\n", - "# ttrades__ = ttrades__[(ttrades__.Ticker.isin(tick))]\n", - "# trades_ = ttrades__.iloc[0:10, :]\n", - "trades_ = ttrades__\n", - "# trades_ = ttrades__.iloc[9, :].to_frame().T\n", - "# trades_.loc[17, 'Size'] = -126\n", - "# ttrades__\n", - "trades_" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### ISSUES:\n", - "\n", - "11: [\n", - " 4: COST is giving very weird values. Issue is the entry day picked a Credit Spread with debit cost. Need to find a logic to avoid this entirely\n", - "]" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "NVDA 0.2527323831217408 5054.647662434816\n", - "TSLA 0.1315097599965802 2630.1951999316043\n", - "AMD 0.1264165402671991 2528.330805343982\n", - "META 0.12170653973488622 2434.1307946977245\n", - "AAPL 0.09471622942745511 1894.3245885491021\n", - "NFLX 0.05117009979641809 1023.4019959283618\n", - "COST 0.08262689789608499 1652.5379579216997\n", - "SBUX 0.06740991086070897 1348.1982172141793\n", - "BA 0.04636898185718145 927.379637143629\n", - "AMZN 0.025342657041745188 506.85314083490374\n" - ] - }, - { - "data": { - "text/plain": [ - "(NVDA 0.252732\n", - " TSLA 0.131510\n", - " AMD 0.126417\n", - " META 0.121707\n", - " AAPL 0.094716\n", - " COST 0.082627\n", - " SBUX 0.067410\n", - " NFLX 0.051170\n", - " BA 0.046369\n", - " AMZN 0.025343\n", - " dtype: float64,\n", - " {'NVDA': 4,\n", - " 'TSLA': 4,\n", - " 'AMD': 4,\n", - " 'META': 4,\n", - " 'AAPL': 4,\n", - " 'NFLX': 4,\n", - " 'COST': 4,\n", - " 'SBUX': 4,\n", - " 'BA': 4,\n", - " 'AMZN': 4})" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "symbol_list = trades_.Ticker.unique()\n", - "untraded_symbols = [s for s in weights.keys() if s not in trades_.Ticker.unique()]\n", - "for s in untraded_symbols:\n", - " weights.pop(s)\n", - "\n", - "\n", - "max_cash = {}\n", - "cash = 20_000\n", - "for s, w in weights.items():\n", - " print(f'{s} {w} {w * cash}')\n", - " if w * cash > 500:\n", - " max_cash[s] = 4\n", - " elif w * cash > 300:\n", - " max_cash[s] = 3\n", - " elif w * cash > 200:\n", - " max_cash[s] = 2\n", - " elif w * cash > 100:\n", - " max_cash[s] = 1\n", - " else:\n", - " max_cash[s] = 0.5\n", - "max_cash\n", - "pd.Series(weights).sort_values(ascending=False), max_cash" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Risk Manager Settings:\n", - "Start Date: 2017-01-01\n", - "End Date: 2025-06-07\n", - "Current Limits State (Position Adjusted when these thresholds are reached):\n", - " Delta: True\n", - " Gamma: False\n", - " Vega: False\n", - " Theta: False\n", - " Roll On DTE: True\n", - " Min DTE Threshold: 95\n", - " Roll On Moneyness: True\n", - " Max Moneyness: 1.05\n", - "Quanitity Sizing Type: delta\n", - " \n" - ] - } - ], - "source": [ - "#Backtest class \n", - "## Find a way to not always reinitialize the backtest class, when want to redo\n", - "\n", - "pd.options.display.max_rows = 50\n", - "pd.options.display.max_columns = 50\n", - "\n", - "evb_backtest = OptionSignalBacktest(trades_, initial_capital=cash)\n", - "evb_backtest.portfolio.initial_capital\n", - "w_map = {x: w * 0.85 for x, w in weights.items()} ## 75% of the weights for each stock\n", - "evb_backtest.portfolio.weight_map = w_map\n", - "evb_backtest.portfolio.weight_map\n", - "evb_backtest.portfolio.risk_manager.OrderPicker.liquidity_threshold = 50\n", - "evb_backtest.portfolio.risk_manager.OrderPicker.lookback = 10\n", - "evb_backtest.portfolio.risk_manager.sizing_lev = 4.5\n", - "evb_backtest.portfolio.max_contract_price_factor = 2\n", - "evb_backtest.portfolio.min_moneyness_threshold = 3\n", - "evb_backtest.portfolio.risk_manager.OrderPicker.data_availability_threshold = 0.5\n", - "evb_backtest.portfolio.order_settings = {\n", - " 'type': 'spread',\n", - " 'specifics': [\n", - " {'direction': 'long', 'rel_strike': 1.0, 'dte': 365, 'moneyness_width': 0.1},\n", - " {'direction': 'short', 'rel_strike': 0.85, 'dte': 365, 'moneyness_width': 0.1} \n", - " ],\n", - " 'name': 'vertical_spread',\n", - " 'strategy': 'vertical',\n", - " 'target_dte': 270,\n", - " 'structure_direction': 'long',\n", - " 'spread_ticks': 1,\n", - " 'dte_tolerance': 60,\n", - " 'min_moneyness': 0.75,\n", - " 'max_moneyness': 1.25,\n", - " 'min_total_price': 0.5\n", - " }\n", - "\n", - "\n", - "evb_backtest.portfolio.max_contract_price = max_cash\n", - "evb_backtest.executor.commission_rate = 0.65/100\n", - "evb_backtest.portfolio.min_moneyness_threshold = 5\n", - "evb_backtest.executor.max_slippage_pct = 0.075\n", - "evb_backtest.portfolio.roll_map = 90\n", - "evb_backtest.portfolio.moneyness_width_factor = .025\n", - "evb_backtest.portfolio.dte_reduction_factor = 30\n", - "evb_backtest.portfolio.min_acceptable_dte_threshold = 95\n", - "evb_backtest.portfolio.risk_manager.limits['dte'] = True\n", - "evb_backtest.portfolio.risk_manager.limits['delta'] = True\n", - "evb_backtest.portfolio.risk_manager.limits['moneyness'] = True\n", - "evb_backtest.portfolio.risk_manager.max_moneyness = 1.05\n", - "for key in max_cash:\n", - " if max_cash[key]*100 > evb_backtest.portfolio.allocated_cash_map[key]:\n", - " print(key, max_cash[key]*100, evb_backtest.portfolio.allocated_cash_map[key])\n", - "\n", - "evb_backtest.portfolio.risk_manager.print_settings()\n", - "\n", - "signals = evb_backtest.bars.signal_df\n", - "signals_df = deepcopy(signals).set_index('Date')\n", - "((signals_df!=-1)&(signals_df!=-0)).sum().sum()\n", - "rm = evb_backtest.portfolio.risk_manager\n", - "pm = evb_backtest.portfolio" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{}" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rm.id_meta" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Processing event: MARKET 2024-01-03 00:00:00\n", - "Processing event: SIGNAL 2024-01-03 00:00:00\n", - "Generating order for BA at 2024-01-03 00:00:00, Signal_ID: BA20240103LONG, Signal Type: LONG\n", - "\n", - "Order Received: {'result': 'SUCCESSFUL', 'data': {'trade_id': '&L:BA20240816C295&S:BA20240816C300', 'close': 0.9500000000000002, 'long': ['BA20240816C295'], 'short': ['BA20240816C300']}}\n", - "\n", - "Calculate Greeks Dates Start: 2017-01-01, End: 2025-06-07, Position ID: &L:BA20240816C295&S:BA20240816C300, Date: 2024-01-03\n", - "Position Data for &L:BA20240816C295&S:BA20240816C300 already available, skipping calculation\n", - "===========================\n", - "Buy Details\n", - "Position: {'trade_id': '&L:BA20240816C295&S:BA20240816C300', 'close': 0.9500000000000002, 'long': ['BA20240816C295'], 'short': ['BA20240816C300'], 'quantity': 5, 'cash_equivalent_qty': 8.0}, Date: 2024-01-03, Signal: SignalEvent type:LONG, symbol=BA, date:2024-01-03 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:BA20240103LONG\n", - "Max Contract Price: 4, Cash at Hand: 7.882726915720846\n", - "Cash at Hand 7.882726915720846 Close 0.9500000000000002\n", - "===========================\n", - "Processing event: SIGNAL 2024-01-03 00:00:00\n", - "Generating order for AAPL at 2024-01-03 00:00:00, Signal_ID: AAPL20240103LONG, Signal Type: LONG\n", - "\n", - "Order Received: {'result': 'SUCCESSFUL', 'data': {'trade_id': '&L:AAPL20240920C225&S:AAPL20240920C230', 'close': 0.6550000000000002, 'long': ['AAPL20240920C225'], 'short': ['AAPL20240920C230']}}\n", - "\n", - "Calculate Greeks Dates Start: 2017-01-01, End: 2025-06-07, Position ID: &L:AAPL20240920C225&S:AAPL20240920C230, Date: 2024-01-03\n", - "Position Data for &L:AAPL20240920C225&S:AAPL20240920C230 already available, skipping calculation\n", - "===========================\n", - "Buy Details\n", - "Position: {'trade_id': '&L:AAPL20240920C225&S:AAPL20240920C230', 'close': 0.6550000000000002, 'long': ['AAPL20240920C225'], 'short': ['AAPL20240920C230'], 'quantity': 10, 'cash_equivalent_qty': 24.0}, Date: 2024-01-03, Signal: SignalEvent type:LONG, symbol=AAPL, date:2024-01-03 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:AAPL20240103LONG\n", - "Max Contract Price: 4, Cash at Hand: 16.101759002667368\n", - "Cash at Hand 16.101759002667368 Close 0.6550000000000002\n", - "===========================\n", - "Processing event: SIGNAL 2024-01-03 00:00:00\n", - "Generating order for AMD at 2024-01-03 00:00:00, Signal_ID: AMD20240103LONG, Signal Type: LONG\n", - "\n", - "Order Received: {'result': 'SUCCESSFUL', 'data': {'trade_id': '&L:AMD20240920C160&S:AMD20240920C165', 'close': 1.3750000000000018, 'long': ['AMD20240920C160'], 'short': ['AMD20240920C165']}}\n", - "\n", - "Calculate Greeks Dates Start: 2017-01-01, End: 2025-06-07, Position ID: &L:AMD20240920C160&S:AMD20240920C165, Date: 2024-01-03\n", - "Position Data for &L:AMD20240920C160&S:AMD20240920C165 already available, skipping calculation\n", - "===========================\n", - "Buy Details\n", - "Position: {'trade_id': '&L:AMD20240920C160&S:AMD20240920C165', 'close': 1.3750000000000018, 'long': ['AMD20240920C160'], 'short': ['AMD20240920C165'], 'quantity': 15, 'cash_equivalent_qty': 15.0}, Date: 2024-01-03, Signal: SignalEvent type:LONG, symbol=AMD, date:2024-01-03 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:AMD20240103LONG\n", - "Max Contract Price: 4, Cash at Hand: 21.490811845423845\n", - "Cash at Hand 21.490811845423845 Close 1.3750000000000018\n", - "===========================\n", - "Processing event: SIGNAL 2024-01-03 00:00:00\n", - "Generating order for META at 2024-01-03 00:00:00, Signal_ID: META20240103LONG, Signal Type: LONG\n", - "\n", - "Order Received: {'result': 'SUCCESSFUL', 'data': {'trade_id': '&L:META20240920C395&S:META20240920C400', 'close': 0.75, 'long': ['META20240920C395'], 'short': ['META20240920C400']}}\n", - "\n", - "Calculate Greeks Dates Start: 2017-01-01, End: 2025-06-07, Position ID: &L:META20240920C395&S:META20240920C400, Date: 2024-01-03\n", - "Position Data for &L:META20240920C395&S:META20240920C400 already available, skipping calculation\n", - "===========================\n", - "Buy Details\n", - "Position: {'trade_id': '&L:META20240920C395&S:META20240920C400', 'close': 0.75, 'long': ['META20240920C395'], 'short': ['META20240920C400'], 'quantity': 20, 'cash_equivalent_qty': 27.0}, Date: 2024-01-03, Signal: SignalEvent type:LONG, symbol=META, date:2024-01-03 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:META20240103LONG\n", - "Max Contract Price: 4, Cash at Hand: 20.69011175493066\n", - "Cash at Hand 20.69011175493066 Close 0.75\n", - "===========================\n", - "Processing event: SIGNAL 2024-01-03 00:00:00\n", - "Generating order for COST at 2024-01-03 00:00:00, Signal_ID: COST20240103LONG, Signal Type: LONG\n", - "\n", - "Order Received: {'result': 'SUCCESSFUL', 'data': {'trade_id': '&L:COST20240920C795&S:COST20240920C800', 'close': 0.5, 'long': ['COST20240920C795'], 'short': ['COST20240920C800']}}\n", - "\n", - "Calculate Greeks Dates Start: 2017-01-01, End: 2025-06-07, Position ID: &L:COST20240920C795&S:COST20240920C800, Date: 2024-01-03\n", - "Position Data for &L:COST20240920C795&S:COST20240920C800 already available, skipping calculation\n", - "===========================\n", - "Buy Details\n", - "Position: {'trade_id': '&L:COST20240920C795&S:COST20240920C800', 'close': 0.5, 'long': ['COST20240920C795'], 'short': ['COST20240920C800'], 'quantity': 11, 'cash_equivalent_qty': 28.0}, Date: 2024-01-03, Signal: SignalEvent type:LONG, symbol=COST, date:2024-01-03 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:COST20240103LONG\n", - "Max Contract Price: 4, Cash at Hand: 14.04657264233445\n", - "Cash at Hand 14.04657264233445 Close 0.5\n", - "===========================\n", - "Processing event: SIGNAL 2024-01-03 00:00:00\n", - "Generating order for NFLX at 2024-01-03 00:00:00, Signal_ID: NFLX20240103LONG, Signal Type: LONG\n", - "2025-06-07 10:08:31 trade.asset.Stock ERROR: Error getting dividends history for AMD from yfinance\n", - "2025-06-07 10:08:31 trade.asset.Stock ERROR: Probably due to no dividends history\n" - ] - }, - { - "ename": "", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[1;31mThe Kernel crashed while executing code in the current cell or a previous cell. \n", - "\u001b[1;31mPlease review the code in the cell(s) to identify a possible cause of the failure. \n", - "\u001b[1;31mClick here for more info. \n", - "\u001b[1;31mView Jupyter log for further details." - ] - } - ], - "source": [ - "import cProfile\n", - "import pstats\n", - "import io\n", - "\n", - "profiler = cProfile.Profile()\n", - "profiler.enable()\n", - "#run backtest\n", - "evb_backtest.run()\n", - "profiler.disable()\n", - "stream = io.StringIO()\n", - "stats = pstats.Stats(profiler, stream=stream)\n", - "# stats.print_stats()" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'AMD': 3950.6369248151377}" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "'&L:NVDA20250221C1150&S:NVDA20250221C1160'\n", - "pm.skip_log\n", - "pm.allocated_cash_map" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "ename": "PicklingError", - "evalue": "Can't pickle at 0x10b753d80>: attribute lookup on __main__ failed", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mPicklingError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[1], line 8\u001b[0m\n\u001b[1;32m 5\u001b[0m cache[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124msafe\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m {\u001b[38;5;124m'\u001b[39m\u001b[38;5;124ma\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[38;5;241m1\u001b[39m}\n\u001b[1;32m 7\u001b[0m \u001b[38;5;66;03m# Unsafe: may crash\u001b[39;00m\n\u001b[0;32m----> 8\u001b[0m \u001b[43mcache\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43munsafe\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mlambda\u001b[39;00m x: x \u001b[38;5;241m+\u001b[39m \u001b[38;5;241m1\u001b[39m\n", - "File \u001b[0;32m~/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:823\u001b[0m, in \u001b[0;36mCache.__setitem__\u001b[0;34m(self, key, value)\u001b[0m\n\u001b[1;32m 814\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__setitem__\u001b[39m(\u001b[38;5;28mself\u001b[39m, key, value):\n\u001b[1;32m 815\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Set corresponding `value` for `key` in cache.\u001b[39;00m\n\u001b[1;32m 816\u001b[0m \n\u001b[1;32m 817\u001b[0m \u001b[38;5;124;03m :param key: key for item\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 821\u001b[0m \n\u001b[1;32m 822\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m--> 823\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mset\u001b[49m\u001b[43m(\u001b[49m\u001b[43mkey\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mvalue\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mretry\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:772\u001b[0m, in \u001b[0;36mCache.set\u001b[0;34m(self, key, value, expire, read, tag, retry)\u001b[0m\n\u001b[1;32m 770\u001b[0m db_key, raw \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_disk\u001b[38;5;241m.\u001b[39mput(key)\n\u001b[1;32m 771\u001b[0m expire_time \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;28;01mif\u001b[39;00m expire \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;28;01melse\u001b[39;00m now \u001b[38;5;241m+\u001b[39m expire\n\u001b[0;32m--> 772\u001b[0m size, mode, filename, db_value \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_disk\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstore\u001b[49m\u001b[43m(\u001b[49m\u001b[43mvalue\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mread\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkey\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mkey\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 773\u001b[0m columns \u001b[38;5;241m=\u001b[39m (expire_time, tag, size, mode, filename, db_value)\n\u001b[1;32m 775\u001b[0m \u001b[38;5;66;03m# The order of SELECT, UPDATE, and INSERT is important below.\u001b[39;00m\n\u001b[1;32m 776\u001b[0m \u001b[38;5;66;03m#\u001b[39;00m\n\u001b[1;32m 777\u001b[0m \u001b[38;5;66;03m# Typical cache usage pattern is:\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 793\u001b[0m \u001b[38;5;66;03m# INSERT OR REPLACE aka UPSERT is not used because the old filename may\u001b[39;00m\n\u001b[1;32m 794\u001b[0m \u001b[38;5;66;03m# need cleanup.\u001b[39;00m\n", - "File \u001b[0;32m~/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:221\u001b[0m, in \u001b[0;36mDisk.store\u001b[0;34m(self, value, read, key)\u001b[0m\n\u001b[1;32m 219\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m size, MODE_BINARY, filename, \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 220\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 221\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[43mpickle\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdumps\u001b[49m\u001b[43m(\u001b[49m\u001b[43mvalue\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mprotocol\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpickle_protocol\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 223\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(result) \u001b[38;5;241m<\u001b[39m min_file_size:\n\u001b[1;32m 224\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;241m0\u001b[39m, MODE_PICKLE, \u001b[38;5;28;01mNone\u001b[39;00m, sqlite3\u001b[38;5;241m.\u001b[39mBinary(result)\n", - "\u001b[0;31mPicklingError\u001b[0m: Can't pickle at 0x10b753d80>: attribute lookup on __main__ failed" - ] - } - ], - "source": [ - "from diskcache import Cache\n", - "cache = Cache('/tmp/test-cache')\n", - "\n", - "# Safe: will succeed\n", - "cache['safe'] = {'a': 1}\n", - "\n", - "# Unsafe: may crash\n", - "cache['unsafe'] = lambda x: x + 1" - ] - }, - { - "cell_type": "code", - "execution_count": 328, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
OpenHighLowCloseMidpointVolumeOpeninterestCloseaskClosebid
Datetime
2023-08-1629.0629.0628.7028.7029.25030.031.3027.20
2023-08-1727.6727.6927.6727.6926.55021.027.5525.55
2023-08-1825.8025.8024.3824.3824.82553.025.6024.05
2023-08-210.000.000.000.0031.42508.031.9530.90
2023-08-220.000.000.000.0032.85008.033.4532.25
..............................
2025-06-0229.6530.4625.0027.8027.775116116842.027.9027.65
2025-06-0329.1833.0028.1028.4228.37570916942.028.4528.30
2025-06-0428.6028.8023.2023.7023.60092116905.023.7023.50
2025-06-0520.8521.259.9011.3011.3001011117067.011.4011.20
2025-06-0613.9515.2512.2512.4512.450159915733.012.5512.35
\n", - "

473 rows × 9 columns

\n", - "
" - ], - "text/plain": [ - " Open High Low Close Midpoint Volume Openinterest \\\n", - "Datetime \n", - "2023-08-16 29.06 29.06 28.70 28.70 29.250 3 0.0 \n", - "2023-08-17 27.67 27.69 27.67 27.69 26.550 2 1.0 \n", - "2023-08-18 25.80 25.80 24.38 24.38 24.825 5 3.0 \n", - "2023-08-21 0.00 0.00 0.00 0.00 31.425 0 8.0 \n", - "2023-08-22 0.00 0.00 0.00 0.00 32.850 0 8.0 \n", - "... ... ... ... ... ... ... ... \n", - "2025-06-02 29.65 30.46 25.00 27.80 27.775 1161 16842.0 \n", - "2025-06-03 29.18 33.00 28.10 28.42 28.375 709 16942.0 \n", - "2025-06-04 28.60 28.80 23.20 23.70 23.600 921 16905.0 \n", - "2025-06-05 20.85 21.25 9.90 11.30 11.300 10111 17067.0 \n", - "2025-06-06 13.95 15.25 12.25 12.45 12.450 1599 15733.0 \n", - "\n", - " Closeask Closebid \n", - "Datetime \n", - "2023-08-16 31.30 27.20 \n", - "2023-08-17 27.55 25.55 \n", - "2023-08-18 25.60 24.05 \n", - "2023-08-21 31.95 30.90 \n", - "2023-08-22 33.45 32.25 \n", - "... ... ... \n", - "2025-06-02 27.90 27.65 \n", - "2025-06-03 28.45 28.30 \n", - "2025-06-04 23.70 23.50 \n", - "2025-06-05 11.40 11.20 \n", - "2025-06-06 12.55 12.35 \n", - "\n", - "[473 rows x 9 columns]" - ] - }, - "execution_count": 328, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "opt_manager = OptionDataManager(opttick='TSLA20250919C400')\n", - "req =opt_manager.get_timeseries(\n", - " start = rm.start_date,\n", - " end = rm.end_date,\n", - " type_ = 'spot',\n", - " extra_cols=['ask', 'bid']\n", - ")\n" - ] - }, - { - "cell_type": "code", - "execution_count": 336, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiMAAAHFCAYAAAAg3/mzAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB6RklEQVR4nO3deXgT1f4G8HemC12gLaWUtiCFUvCiFtwAqSIgKlWrFxQQl6uIIi644srVH6igolcBL7iCC3pFEEUFFDdABVxAFKgIKItsLVAh3VvazPn9MU0yk0zapE2aSfJ+nkdpJpOZk9N05ptzvuccSQghQERERBQgcqALQEREROGNwQgREREFFIMRIiIiCigGI0RERBRQDEaIiIgooBiMEBERUUAxGCEiIqKAYjBCREREAcVghIiIiAKKwQgREREFVGSgC+CNY8eOoa6uLqBlaN++PY4cORLQMpgN60SP9aHH+jDGenHFOnEIlbqIjIxE27ZtG9+vBcriM3V1daitrQ3Y+SVJspeDS/qoWCd6rA891ocx1osr1olDONYFu2mIiIgooBiMEBERUUAxGCEiIqKAYjBCREREARVUCaxERKQmNlZWVga6GD5XVVWF48ePB7oYphBMdREXF4fIyOaFEwxGiIiCSF1dHSoqKtCmTRvIcmg1bkdFRQV0xKSZBEtdKIqCsrIyxMfHNysgCa1PMhFRiKusrAzJQISCkyzLaNOmTbNb6vhpJiIKMgxEyEx88XnkJ5qIiIgCisEIERERBRSDESIiIh9YuHAhevbs6bPjHT58GKNHj0Z2drZPj6v13HPP4YILLmhwn7vvvhtjx471y/ltGIwQEZHfffjhhzjzzDNx0kknYcqUKbrn9u3bh3POOQdlZWX2bVVVVXjqqaeQm5uLrKws5OTk4IorrsDnn3/ewiUPnNdeew2HDx/GF198ge+++84v57jllluwcOFCvxzbGxzaS6YgFAXY8wfQqQuk6FaBLg4R+dDRo0dx//334/nnn0dmZiauu+46nH322fZv5JMmTcKkSZPQpk0b+3DWBx98EL/88gueeOIJ9OjRA8eOHcOGDRtw7NixZpWltrYWUVFRzX5PLWHPnj3IyclBVlaW384RHx+P+Ph4vx3fU2wZIXP49UcoT90PseSdQJeEiHzsr7/+Qps2bfDPf/4Tp556KnJzc/Hnn38CAD766CNERkbi4osv1r3myy+/xB133IEhQ4bghBNOQK9evTB27FiMHj3avk+/fv0wY8YM3HbbbcjOzsYZZ5yBN998U3ecjh074q233sKYMWOQnZ2NF154AQDw+eefY+jQocjKykL//v3x/PPPo66uzv66V155BUOGDEF2djbOPPNMPPzww6ioqNAde+HChejTpw+6deuGG2+80etA6a233kJubi66dOmCAQMGYPHixfbnzjjjDHz66adYvHgxOnbsiLvvvrvR43Xs2BFvv/02rrvuOnTr1g0DBw7Ehg0bsHv3bowYMQLZ2dm47LLLsGfPHvtrnLtprFYrpkyZgp49e+Lkk0/G1KlTW2TlYAYjZAriWHH9v0cCXBKi4CGEgKipDsx/XtygunbtiqqqKhQUFODYsWPYtGkTevbsCYvFgmeffRZTp051eU379u2xcuVKlJeXN3jsl19+GSeddBI+//xz3H777fi///s/fPvtt7p9nn/+eVx00UX4+uuvMXr0aPz444+46667cOONN2LVqlWYPn06Fi1aZA9UAHW46uOPP45Vq1Zh5syZWLt2ra6cGzduxH333YcbbrgBX3zxBXJzc3Wvb8xnn32GyZMn4+abb8bXX3+Na6+9Fvfeey/Wrl0LQA2WBg8ejEsvvRS//PILHn/8cY+OO3PmTIwYMQJffPEFsrOzMWHCBDz44IOYMGECPvvsMwgh8Mgjj7h9/SuvvIL3338fzz33HD766CNYLBasWLHC4/fVVOymISIKVsdroEwYFZBTy7MXAa1iPNo3KSkJM2fOxF133YXq6mqMGDECgwYNwsSJEzFmzBjs27cPN9xwA6xWK+655x7k5+fjmWeewYQJE3DKKafgpJNOQp8+fZCfn48+ffrojt2nTx9MmDABANCtWzesX78er732Gs4991z7PsOGDcOVV15pf3zvvffi9ttvx6hRat1lZmbi/vvvx7Rp03DvvfcCAMaNG2ff/4QTTsADDzyAhx56CE899RQAYN68eRg0aBBuu+02+7k3bNiA1atXe1QnL7/8MkaNGoUxY8bYX79x40a8/PLLOPvss5GSkoLo6GjExMQgNTXVo2MCwJVXXonLLrsMAHDbbbfhsssuw913341BgwYBAG666Sb7ezQyd+5cTJgwwd5S9fTTT3v8npqDwQiZg+1blv9bA4koAC666CJcdNFF9sff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FXfccQcWLFiAcePGoba2FgsXLsTatWtRUlKCdu3aYfjw4TjllFPw2GOPAQBuuOEGAMDAgQNx++23B+w9+dKvv/6KDz74APv27YMsy+jRowfGjBmDtLQ0AMDhw4cxYcIETJw4EStWrMAff/yB9PR0jBs3Dj169Ahw6X2juroa69atw9NPPw2LxYLVq1fj8ssvB6B+m33sscfw0EMP4d1330VhYSG6dOmC8ePHo3PnzgCA1atX480338SECRPwv//9D4WFhXjhhReQmpoayLflc7fffjsuvvhiXHLJJfZt999/P/r06YNRo0YFsGT+x+uIZ8L5esLriLHgDqV8pLy8HJs2bcKFF15ov4DYJCUl4ZxzzsG6desghMDs2bOxdu1a3HDDDZgxYwZuvvlmxMTEICUlBRMnTgQAzJw5E6+++qr9YhIKqqurkZ+fj6effhr/93//B0mS8J///Mceldu89957uPTSS/HMM88gPT0ds2bNgtVqDVCpfWvdunXo2LEjMjIyMGDAAKxatcpluua3334b1113HZ566im0adMG06dPR11dnf35mpoafPzxx7jlllvw/PPPIzExsaXfBvkJryOeC+frCa8jxhiMACgsLIQQAh07djR8vmPHjqioqMDOnTvx/fff49Zbb0Xfvn3RoUMH5OTkIDc3F7Is25tfExMTkZSUhLi4uJZ8G3511llnoV+/fkhLS0OXLl1w6623Yu/evS5rHFx66aU4/fTTkZGRgVGjRuHIkSMoKioKUKl9a9WqVRgwYAAA4NRTT0VlZSW2bt2q22fkyJHo1asXOnfujAkTJqCkpESXqGm1WnHjjTfixBNPREZGBlq1atWi74H8h9cRz4Xz9YTXEWPspvHC4cOHIcsyTjrppEAXpcUVFhZi4cKF+PPPP1FWVmb/BlNcXGxvPgSg+zkpKQkAUFJS4vYCHSwOHjyIP//8E/fddx8AICIiArm5uVi5ciVOPvlk+37aJuTWrVsjIyMDBw4csG+LjIxEZmZmyxWcTCecryM24Xo94XXEPQYjANLS0iBJEvbv34++ffu6PH/gwAHEx8e7NL2Gk+nTp6N9+/YYP3482rZtCyEEJk6cqGs6BNQ/EhtJkgDAr6twtpSVK1fCarVi/Pjx9m1CCERFReHGG2/0+DjR0dH2eglVkiS5/M6DvWndE7yOeC5crye8jrjHYARAmzZt0KtXL3zxxRfIz8/XXSwsFgvWrFmDc889F507d4YQAlu3bkWvXr1cjmP7w3Hu9wx2ZWVlOHjwIMaPH4+ePXsCALZt2xbgUrUcq9WKb775Btddd53L7/3ZZ5/FmjVr7N/UduzYgZSUFABqDkFhYWHQfotrqoSEBFgsFvvjyspKHD58OHAFaiG8jngmXK8nvI40jDkj9caOHYva2lpMmzYNW7duRXFxMX799Vc88cQTSE5OxlVXXYXU1FQMHDgQL730En766SccPnwYv/32G9atWwcAaN++PSRJws8//4zS0lJUV1cH+F35Rnx8PNq0aYOvvvoKRUVFKCgowFtvvRXoYrWYn3/+GRUVFTjvvPPQuXNn3X/9+vXDqlWr7Pt+8MEH2LJlC/bu3YsXX3wRbdq0MfyWHMpOOeUUfPvtt/j999+xd+9ezJkzJ+iHHXqK15HGhev1hNeRhrFlpF56ejqefvppLFq0CDNmzEB5eTmSkpLQp08fjBw50p5UdtNNN2HBggWYN28eysrKkJKSguHDhwMAkpOTMXLkSLz77rt46aWXcO655wb1kDwhBCIiIiDLMu666y688cYbmDhxIjIyMnDDDTdgypQpgS5ii1i5ciVycnIMEwnPOussfPLJJ/jrr78AAFdffTXefPNN+5C8Bx98UNfUHKpsnxUAGDZsGA4fPoynn34acXFxuPLKK8OiZQTgdaQh4X494XWkYVy1l9yaNm0a0tLSvOrLDFe2+QHeeOMNxMfHB7o4LY6fFWoMPyONC+frSHi0nZJXysvL8fPPP2Pr1q3IyckJdHHIxPhZocbwM0KeCO12H2qSl156CTt37kR+fj769OkT6OKQifGzQo3hZ4Q8wW4aIiIiCih20xAREVFAMRghIiKigGIwQkRERAHFBNYwt2TJEvz00084cOAAoqOj0aNHD1x77bXIyMiw73P8+HHMnz8f69atQ21tLXr37o2bbrrJvlbEnj178NFHH2H79u0oLS1FamoqLrjgAlx88cWG59y2bRumTJmCE044Ac8++2xLvE0iagEtdT2xDYF19uqrr9qPQ8GFwUiY27p1K4YOHYpu3brBarViwYIFmDp1Kp5//nnExMQAAN566y1s3LgR9957L+Li4jBv3jw899xzeOKJJwAAu3btQmJiIu644w60a9cO27dvx6uvvgpZlpGXl6c7X0VFBebMmYOcnBzdlOFEFPxa+noyc+ZM3SRiCQkJLfdmybcEkUZJSYkYOXKk+O2334QQQlRUVIjRo0eL77//3r7P/v37xciRI8X27dvdHue1114TU6ZMcdk+Y8YMsWDBArFw4UJx3333+f4NEJFp+Ot6UlBQIEaOHCnKy8v9V3hqUcwZIZ3KykoAsE9bvWvXLlitVt1kRR07dkRKSgp27NjR4HFsx7BZtWoVDh06hJEjR/qh5ERkNv68ngDAAw88gJtvvhlPPPFEWCy2F8oYjJCdoih48803ceKJJ6Jz584A1NVGIyMjXaYmTkxMdNvNsn37dnz//fc4//zz7dsKCwvx7rvv4o477rCvYUJEocuf15O2bdti3LhxmDhxIiZOnIh27drhsccew65du/z2fsi/mDNCdvPmzcO+ffvw+OOPN/kYe/fuxTPPPIMRI0agd+/eANSL0gsvvICRI0fqEtmIKHT563oCABkZGbpryYknnohDhw5h+fLluOOOO5pVbgoMBiMEQL1wbNy4EY899hjatWtn356UlIS6ujpUVFTovs2UlJS4ZK3v378fTzzxBM4//3xcccUV9u1VVVXYuXMndu/ejddffx2AuoKnEAKjR4/GI488glNOOcW/b5CIWow/ryfuZGdns6smiDEYCXNCCLz++uv46aefMGXKFKSmpuqez8rKQkREBLZs2YKzzjoLAHDw4EEUFxejR48e9v1s34AGDhyIq666SneM2NhY/Oc//9Ft++KLL1BQUIB7773X5ZxEFJxa4nrizp49e9C2bVvfvRlqUQxGwty8efOwZs0aPPDAA4iNjbX328bFxSE6OhpxcXE477zzMH/+fLRu3RpxcXF4/fXX0aNHD/vFY+/evXj88cfRu3dv5Ofn248hyzISEhIgy7K9z9gmISEBUVFRLtuJKHi1xPUEAJYvX47U1FSccMIJOH78OFauXImCggI88sgjgXjb5ANcKC/MjRo1ynD7bbfdhkGDBgFwTFK0du1a1NXVuUxStGjRIixevNjlGO3bt8ecOXMMj79o0SKsX7+ek54RhZCWup58/PHH+Oqrr3D06FG0atUKmZmZuOKKK9jdG8QYjBAREVFAcWgvERERBRSDESIiIgooBiNEREQUUAxGiIiIKKAYjBAREVFAMRghIiKigGIwQkRERAHFYISITO/w4cMYNWoUVq9eHeiiEJEfcDp4ojCzevVqvPjii/bHUVFRaN26NTp37ozTTjsNgwcPRmxsrNfH3b59OzZt2oRLLrnEZYl4T61ZswYlJSW45JJLmvR6IgpODEaIwtSoUaOQmpoKq9UKi8WCrVu34q233sLy5cvxwAMPIDMz06vjbd++HYsXL8agQYOaFYzs27fPJRhp37493nnnHURG8pJFFIr4l00Upk477TR069bN/nj48OEoKCjA008/jWeeeQYzZsxAdHR0AEvoIEmSacpCRL7HYISI7E455RRcccUVWLBgAb799lucf/75+Ouvv7Bs2TL8/vvvOHbsGOLi4nDaaafhX//6F9q0aQNAv7jZhAkT7MebPXu2fRn5b7/9FsuXL8f+/fsRHR2N3r1749prr0VKSgoAYMqUKdi6dSsAx4JrtsXRDh8+jAkTJugWXJszZw5++OEHzJgxA3PnzsVvv/2GuLg4DB8+HHl5edi7dy/eeOMN/Pnnn2jTpg2uvvpqnHPOObr3W1FRgffffx8//vgjSkpK0K5dOwwZMgSXXXYZZJkpdUQthcEIEemce+65WLBgATZv3ozzzz8fmzdvxuHDhzFo0CAkJSVh//79+Oqrr7B//35MmzYNkiShX79+KCwsxNq1a3H99dfbgxTbku8ffvghFi5ciP79+2PIkCEoLS3FZ599hsmTJ+OZZ55BfHw8Lr/8clRWVuLvv//G9ddfDwCIiYlpsKyKouDJJ59Ez549ce2112LNmjV4/fXXERMTgwULFmDAgAHo168fvvzyS8yePRs9evSwB0c1NTWYMmUKjh49ivPPPx8pKSnYvn07FixYAIvFgjFjxvivkolIh8EIEem0a9cOcXFxOHToEABg6NChuPTSS3X7dO/eHbNmzcK2bdvQs2dPZGZmomvXrli7di369Oljv+EDwJEjR7Bo0SJceeWVuPzyy+3b+/btiwcffBCff/45Lr/8cvTq1QvJycmoqKjAueee61FZa2trMWDAAAwfPhwAcM4552D8+PF46aWXcNdddyE3NxcA0KtXL9x9991YvXq1vdVl2bJlKCoqwjPPPIP09HQAwAUXXIDk5GR88sknyM/Pt7faEJF/sR2SiFzExMSgqqoKAHS5GsePH0dpaSm6d+8OANi9e3ejx/rxxx8hhEBubi5KS0vt/yUlJSEtLQ2//fZbs8o6ZMgQ+8/x8fHIyMhAq1at0L9/f/v2jIwMxMfH4/Dhw/ZtP/zwA3r27In4+HhduXJycqAoCn7//fdmlYuIPMeWESJyUV1djcTERABAeXk53n//faxbtw4lJSW6/SorKxs9VlFREYQQuPPOOw2fb84ImaioKHtXkE1cXBzatWsHSZJctpeXl9sfFxYW4q+//sJNN91keGzn90pE/sNghIh0/v77b1RWVqJDhw4AgBkzZmD79u247LLL0KVLF8TExNhzNRRFafR4iqJAkiQ8/PDDhkmhjeWFNMRdkqknyadCCPTq1QuXXXaZ4fMZGRlNLhcReYfBCBHpfPvttwCAU089FeXl5diyZQtGjRqFESNG2PcpLCx0eZ1zS4RNWloahBBITU011Q2+Q4cOqK6uRq9evQJdFKKwx5wRIrIrKCjABx98gNTUVJxzzjn2FgYhhG6/5cuXu7y2VatWAFy7bvr27QtZlrF48WKX4wghUFZWZn8cExPjUdePL/Tv3x87duzAr7/+6vJcRUUFrFZri5SDiNgyQhS2fvnlFxw4cACKosBiseC3337D5s2bkZKSggceeADR0dGIjo5Gz5498cknn8BqtSI5ORmbNm3SJYLaZGVlAQAWLFiAs88+GxERETjjjDOQlpaG0aNH491338WRI0fQp08fxMTE4PDhw1i/fr19Xg/bMdatW4e33noL3bp1Q0xMDM4880y/vP/LLrsMGzZswPTp0zFw4EBkZWWhpqYGe/fuxQ8//IA5c+a45KMQkX8wGCEKU4sWLQKgJpDa1qa5/vrrXdamueuuu/D666/j888/t+dZTJo0CePHj9cdLzs7G1deeSW+/PJL/PrrrxBCYPbs2YiJicGwYcOQnp6O5cuX4/333wcApKSkoFevXrpg48ILL8SePXuwevVqLF++HO3bt/dbMNKqVSs89thj+PDDD/HDDz/g22+/RWxsLDIyMjBq1CjExcX55bxE5EoSzu2mRERERC2IOSNEREQUUAxGiIiIKKAYjBAREVFAMRghIiKigGIwQkRERAHFYISIiIgCisEIERERBRSDESIiIgooBiNEREQUUAxGiIiIKKAYjBAREVFAMRghIiKigGIwQkRERAH1/5rppqvoJiGDAAAAAElFTkSuQmCC", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 336, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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kiVON0MI4RIJHXxUVVXx6KOPMnnyZC677DKmTJnCk08+ye7duzv1/BUrVjBhwgTq6uqi3NLYeOSRR7jvvvucboarrF69mksuuYR77rnH6aa4inxW/OQ8Eko+H8HkPBIqvieS74Zt27Zx5513UlJSws9//nOKiorYtGkTzzzzDF9++SV333032dnZTjdTOGzBggX84Ac/YMGCBezcuZP8/Pwub8s0TQAMI6Fj/h5FziOiM+Q8Eiphg49Zs2aRnJzMnXfeSWpqKgAFBQUMGTKEG264gTlz5nDttdfS0tLC888/z6JFi6itraVPnz6MHz+e4cOHM336dACuvvpqAE466SSuv/56x15TJH355Ze8+OKLbNq0CcMwKCsr46qrrqK4uBiAyspKpk6dys0338wbb7zBd999R0lJCddeey1lZWUOtz4yGhsbWbx4Mffeey81NTW89957XHDBBYD1a3X69On88pe/5Nlnn6W8vJzBgwczefJkBg4cCMB7773HU089xdSpU/nXv/5FeXk5f/7znykqKnLyZUXc9ddfz9lnn80555xj3/Z///d/jB49mgkTJjjYsuiT88i+Jfq5RM4j7Yvv0KmL9uzZw1dffcUZZ5xhnzB88vLyOP7441m8eDFaax5++GEWLVrE1VdfzYMPPshPfvIT0tPTKSgo4OabbwbgT3/6E3//+9/tk0dP0NjYyLhx47j33nv5zW9+g1KK+++/3466fZ577jl++MMfct9991FSUsJDDz2Ex+NxqNWRtXjxYvr160dpaSknnHAC7777bsj0x//85z+58sorueeee8jJyWHGjBm0trba9zc1NfHyyy/z05/+lAceeIDc3NxYvwwRJXIe6ZxEP5fIeaR9CRl8lJeXo7WmX79+7d7fr18/6urqWLt2LR999BHXXXcdRx11FH379mXEiBGMGTMGwzDsdGpubi55eXlkZmbG8mVE1THHHMPRRx9NcXExgwcP5rrrrmPjxo0hawT88Ic/5PDDD6e0tJQJEyawfft2KioqHGp1ZL377ruccMIJABx66KHU19ezcuXKoMdcfPHFjBw5koEDBzJ16lRqa2uDCis9Hg/XXHMNBxxwAKWlpaSlpcX0NYjokfNI5yT6uUTOI+1L2G6XzqisrMQwDA4++GCnmxJz5eXlPP/886xZs4bdu3fbv1KqqqrsdCAQdDkvLw+A2traDk/I8WLr1q2sWbOGW265BYCkpCTGjBnDggULOOSQQ+zHBaaFs7OzKS0tZcuWLfZtycnJDBo0KHYNF66TyOcRSOxziZxHOpaQwUdxcTFKKTZv3sxRRx0Vcv+WLVvIysoKSaUmkhkzZlBYWMjkyZPp3bs3WmtuvvnmoFQgWP8pfJRSAFFdpTJWFixYgMfjYfLkyfZtWmtSUlK45pprOr2d1NRU+7j0VEqpkPe8J6TL90XOI52TyOcSOY90LCGDj5ycHEaOHMmbb77JuHHjgk4ONTU1LFy4kBNPPJGBAweitWblypWMHDkyZDu+/yxt+y7j3e7du9m6dSuTJ0/moIMOAuDbb791uFWx4/F4eP/997nyyitD3vc//vGPLFy40P41tnr1agoKCgCrBqC8vDyuf6l1Ra9evaipqbGv19fXU1lZ6VyDYkTOI/uWyOcSOY/sXULWfAD8+Mc/pqWlhbvvvpuVK1dSVVXFl19+yV133UV+fj6XXXYZRUVFnHTSSTz22GMsWbKEyspKVqxYweLFiwEoLCxEKcXSpUvZtWsXjY2NDr+qyMjKyiInJ4e3336biooKli9fztNPP+10s2Jm6dKl1NXVccoppzBw4MCgf0cffTTvvvuu/dgXX3yRZcuWsXHjRh599FFycnLa/RXckw0fPpwPPviAb775ho0bN/LII4/E/TDAzpLzyN4l8rlEziN7l5CZD4CSkhLuvfde5s6dy4MPPsiePXvIy8tj9OjRXHzxxXYR2KRJk5gzZw6zZs1i9+7dFBQUMH78eADy8/O5+OKLefbZZ3nsscc48cQT43qInNaapKQkDMPg5z//OU8++SQ333wzpaWlXH311UybNs3pJsbEggULGDFiRLuFf8cccwyvvPIK33//PQCXX345Tz31lD1E7rbbbgtKH/dUvs8KwPnnn09lZSX33nsvmZmZXHLJJQmR+QA5j3REziVyHtkXWdVW2O6++26Ki4vD6otMVL7x+U8++SRZWVlONyfm5LMi9kY+H52TyOeRxMiNir3as2cPS5cuZeXKlYwYMcLp5ggXk8+K2Bv5fIjO6tl5HdEpjz32GGvXrmXcuHGMHj3a6eYIF5PPitgb+XyIzpJuFyGEEELElHS7CCGEECKmJPgQQgghRExJ8CGEEEKImJKC0wQzf/58lixZwpYtW0hNTaWsrIwrrriC0tJS+zHNzc3Mnj2bxYsX09LSwqhRo5g0aZK93sKGDRv497//zapVq9i1axdFRUWcfvrpnH322e3u89tvv2XatGkMGDCAP/7xj7F4mUKIKIvVucQ3HLWtv//97/Z2RPyR4CPBrFy5kjPPPJP99tsPj8fDnDlz+P3vf88DDzxAeno6AE8//TSff/45N910E5mZmcyaNYuZM2dy1113AbBu3Tpyc3O54YYb6NOnD6tWreLvf/87hmFw1llnBe2vrq6ORx55hBEjRgRNwS2EiG+xPpf86U9/Cpqwq1evXrF7sSLytEhotbW1+uKLL9YrVqzQWmtdV1enL730Uv3RRx/Zj9m8ebO++OKL9apVqzrczj/+8Q89bdq0kNsffPBBPWfOHP3888/rW265JfIvQAjhCtE6lyxfvlxffPHFes+ePdFrvIg5qflIcPX19QD2NNDr1q3D4/EETRDUr18/CgoKWL169V6349uGz7vvvsu2bdu4+OKLo9ByIYSbRPNcAnDrrbfyk5/8hLvuuithFqfryST4SGCmafLUU09xwAEHMHDgQMBajTM5OTlkqt/c3NwOu01WrVrFRx99xGmnnWbfVl5ezrPPPssNN9xgrwEihOiZonku6d27N9deey0333wzN998M3369GH69OmsW7cuaq9HRJ/UfCSwWbNmsWnTJn73u991eRsbN27kvvvu46KLLmLUqFGAdSL685//zMUXXxxUfCaE6JmidS4BKC0tDTqPHHDAAWzbto1XX32VG264oVvtFs6R4CNBzZo1i88//5zp06fTp08f+/a8vDxaW1upq6sL+sVSW1sbUlm+efNm7rrrLk477TQuvPBC+/aGhgbWrl3L+vXreeKJJwBrlUutNZdeeil33nknw4cPj+4LFELERDTPJR0ZNmyYdL3EOQk+EozWmieeeIIlS5Ywbdo0ioqKgu4fOnQoSUlJLFu2jGOOOQaArVu3UlVVRVlZmf0436+ck046icsuuyxoGxkZGdx///1Bt7355pssX76cm266KWSfQoj4E4tzSUc2bNhA7969I/diRMxJ8JFgZs2axcKFC7n11lvJyMiw+14zMzNJTU0lMzOTU045hdmzZ5OdnU1mZiZPPPEEZWVl9glj48aN/O53v2PUqFGMGzfO3oZhGPTq1QvDMOx+X59evXqRkpIScrsQIj7F4lwC8Oqrr1JUVMSAAQNobm5mwYIFLF++nDvvvNOJly0iRBaWSzATJkxo9/YpU6YwduxYwD8x0KJFi2htbQ2ZGGju3LnMmzcvZBuFhYU88sgj7W5/7ty5fPrppzLJmBA9RKzOJS+//DJvv/02O3fuJC0tjUGDBnHhhRdK122ck+BDCCGEEDElQ22FEEIIEVMSfAghhBAipiT4EEIIIURMSfAhhBBCiJiS4EMIIYQQMSXBhxBCCCFiSoIPIYQQQsSUBB9CCFeprKxkwoQJvPfee043RQgRJTK9uhA92Hvvvcejjz5qX09JSSE7O5uBAwdy2GGHcfLJJ5ORkRH2dletWsVXX33FOeecE7JkemctXLiQ2tpazjnnnC49XwgRvyT4ECIBTJgwgaKiIjweDzU1NaxcuZKnn36aV199lVtvvZVBgwaFtb1Vq1Yxb948xo4d263gY9OmTSHBR2FhIc888wzJyXJ6EqKnkv/dQiSAww47jP3228++Pn78eJYvX869997Lfffdx4MPPkhqaqqDLfRTSrmmLUKI6JDgQ4gENXz4cC688ELmzJnDBx98wGmnncb333/Pf//7X7755huqq6vJzMzksMMO40c/+hE5OTlA8GJgU6dOtbf38MMP28uqf/DBB7z66qts3ryZ1NRURo0axRVXXEFBQQEA06ZNY+XKlYB/gTLfYmKVlZVMnTo1aIGyRx55hI8//pgHH3yQxx9/nBUrVpCZmcn48eM566yz2LhxI08++SRr1qwhJyeHyy+/nOOPPz7o9dbV1fHCCy/wySefUFtbS58+fTj11FM599xzMQwpfxMiliT4ECKBnXjiicyZM4evv/6a0047ja+//prKykrGjh1LXl4emzdv5u2332bz5s3cfffdKKU4+uijKS8vZ9GiRUycONEOSnxLoL/00ks8//zzHHvssZx66qns2rWL119/nd/+9rfcd999ZGVlccEFF1BfX8+OHTuYOHEiAOnp6Xttq2ma/OEPf+Cggw7iiiuuYOHChTzxxBOkp6czZ84cTjjhBI4++mjeeustHn74YcrKyuxgqKmpiWnTprFz505OO+00CgoKWLVqFXPmzKGmpoarrroqegdZCBFCgg8hElifPn3IzMxk27ZtAJx55pn88Ic/DHrM/vvvz0MPPcS3337LQQcdxKBBgxgyZAiLFi1i9OjR9hc8wPbt25k7dy6XXHIJF1xwgX37UUcdxW233cb//vc/LrjgAkaOHEl+fj51dXWceOKJnWprS0sLJ5xwAuPHjwfg+OOPZ/LkyTz22GP8/Oc/Z8yYMQCMHDmSG2+8kffee8/Oqvz3v/+loqKC++67j5KSEgBOP/108vPzeeWVVxg3bpydlRFCRJ/kGoVIcOnp6TQ0NAAE1Vo0Nzeza9cu9t9/fwDWr1+/z2198sknaK0ZM2YMu3btsv/l5eVRXFzMihUrutXWU0891b6clZVFaWkpaWlpHHvssfbtpaWlZGVlUVlZad/28ccfc9BBB5GVlRXUrhEjRmCaJt9880232iWECI9kPoRIcI2NjeTm5gKwZ88eXnjhBRYvXkxtbW3Q4+rr6/e5rYqKCrTW/OxnP2v3/u6MYElJSbG7dnwyMzPp06cPSqmQ2/fs2WNfLy8v5/vvv2fSpEntbrvtaxVCRJcEH0IksB07dlBfX0/fvn0BePDBB1m1ahXnnnsugwcPJj093a61ME1zn9szTROlFL/61a/aLeLcV13H3nRUFNqZYlGtNSNHjuTcc89t9/7S0tIut0sIET4JPoRIYB988AEAhx56KHv27GHZsmVMmDCBiy66yH5MeXl5yPPaZhp8iouL0VpTVFTkqi/0vn370tjYyMiRI51uihACqfkQImEtX76cF198kaKiIo4//ng7g6C1Dnrcq6++GvLctLQ0ILQr5qijjsIwDObNmxeyHa01u3fvtq+np6d3qisnEo499lhWr17Nl19+GXJfXV0dHo8nJu0QQlgk8yFEAvjiiy/YsmULpmlSU1PDihUr+PrrrykoKODWW28lNTWV1NRUDjroIF555RU8Hg/5+fl89dVXQYWbPkOHDgVgzpw5HHfccSQlJXHEEUdQXFzMpZdeyrPPPsv27dsZPXo06enpVFZW8umnn9rzavi2sXjxYp5++mn2228/0tPTOfLII6Py+s8991w+++wzZsyYwUknncTQoUNpampi48aNfPzxxzzyyCMh9SRCiOiR4EOIBDB37lzAKvj0re0yceLEkLVdfv7zn/PEE0/wv//9z66TuP3225k8eXLQ9oYNG8Yll1zCW2+9xZdffonWmocffpj09HTOP/98SkpKePXVV3nhhRcAKCgoYOTIkUHBxRlnnMGGDRt47733ePXVVyksLIxa8JGWlsb06dN56aWX+Pjjj/nggw/IyMigtLSUCRMmkJmZGZX9CiHap3Tb3KgQQgghRBRJzYcQQgghYkqCDyGEEELElAQfQgghhIgpCT6EEEIIEVMSfAghhBAipiT4EEIIIURMSfAhhBBCiJiS4EMIIYQQMSXBhxBCCCFiSoIPIYQQQsSUBB9CCCGEiCkJPoQQQggRUxJ8CCGEECKm/j+ujd5ipKshlgAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "req.post_processed_data['%Spread_of_mid'] = (req.post_processed_data['Closeask'] - req.post_processed_data ['Closebid']).abs()/req.post_processed_data.Midpoint\n", - "req.post_processed_data.plot(y = '%Spread_of_mid')\n", - "plt.show()\n", - "(req.post_processed_data.Midpoint.pct_change().rolling(30).std() * 252).plot()" - ] - }, - { - "cell_type": "code", - "execution_count": 397, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Processing position data for ID: &L:NVDA20250919C135&S:NVDA20250919C13690\r" - ] - } - ], - "source": [ - "from EventDriven.riskmanager.utils import add_skip_columns\n", - "for id, position_data in rm.position_data.items():\n", - " if not isinstance(position_data, pd.DataFrame):\n", - " print(id)\n", - " continue \n", - " print(f\"Processing position data for ID: {id}\", end = '\\r')\n", - " if 'NVDA' in id:\n", - " position_data = add_skip_columns(position_data, ['Delta', 'Gamma', 'Vega', 'Theta', 'Midpoint'], 15, 2.5)\n", - " rm.position_data[id] = position_data\n", - "\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "rm.p" - ] - }, - { - "cell_type": "raw", - "metadata": {}, - "source": [ - "filtered_keys = rm.position_data.filter_keys(lambda x: 'NVDA' in x)\n", - "filtered_positions = rm.processed_option_data.filter_keys(lambda x: 'NVDA' in x)\n", - "for key in filtered_keys:\n", - " del rm.position_data[key]\n", - "\n", - "for key in filtered_positions:\n", - " del rm.processed_option_data[key]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# ***SINGLE TEST***" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### ***INITIAL BACKTEST RUN***" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
SizeEntryBarExitBarEntryPriceExitPricePnLReturnPctEntryTimeExitTimeDurationTicker
1563658752211.889019423.79000913349.7623491.0000562024-08-162024-12-31137TSLA
\n", - "
" - ], - "text/plain": [ - " Size EntryBar ExitBar EntryPrice ExitPrice PnL ReturnPct \\\n", - "15 63 658 752 211.889019 423.790009 13349.762349 1.000056 \n", - "\n", - " EntryTime ExitTime Duration Ticker \n", - "15 2024-08-16 2024-12-31 137 TSLA " - ] - }, - "execution_count": 41, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import json\n", - "pd.set_option('display.max_columns', 100)\n", - "pd.set_option('display.max_rows', 100)\n", - "_key = 11\n", - "with open(f'../input/profitable_weights_{_key}.json', 'r') as f:\n", - " weights = json.load(f)\n", - "ttrades__ = pd.read_csv(f'../input/profitable_trades_{_key}.csv').iloc[:, 1:]\n", - "ttrades__['Duration'] = ttrades__.Duration.apply(lambda x: int(x.split(' ')[0]))\n", - "tick = ['AAPL', 'NFLX', 'NVDA']\n", - "# ttrades__ = ttrades__[(ttrades__.Ticker.isin(tick))]\n", - "# trades_ = ttrades__.iloc[0:10, :]\n", - "trades_ = ttrades__\n", - "trades_ = ttrades__.iloc[15, :].to_frame().T\n", - "# trades_.loc[17, 'Size'] = -126\n", - "# ttrades__\n", - "trades_" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### ISSUES:\n", - "\n", - "11: [\n", - " 4: COST is giving very weird values. Issue is the entry day picked a Credit Spread with debit cost. Need to find a logic to avoid this entirely\n", - "]" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "TSLA 0.1315097599965802 2630.1951999316043\n" - ] - }, - { - "data": { - "text/plain": [ - "(TSLA 0.13151\n", - " dtype: float64,\n", - " {'TSLA': 4})" - ] - }, - "execution_count": 51, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "symbol_list = trades_.Ticker.unique()\n", - "untraded_symbols = [s for s in weights.keys() if s not in trades_.Ticker.unique()]\n", - "for s in untraded_symbols:\n", - " weights.pop(s)\n", - "\n", - "\n", - "max_cash = {}\n", - "cash = 20_000\n", - "for s, w in weights.items():\n", - " print(f'{s} {w} {w * cash}')\n", - " if w * cash > 500:\n", - " max_cash[s] = 4\n", - " elif w * cash > 300:\n", - " max_cash[s] = 3\n", - " elif w * cash > 200:\n", - " max_cash[s] = 2\n", - " elif w * cash > 100:\n", - " max_cash[s] = 1\n", - " else:\n", - " max_cash[s] = 0.5\n", - "max_cash\n", - "pd.Series(weights).sort_values(ascending=False), max_cash" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Risk Manager Settings:\n", - "Start Date: 2017-01-01\n", - "End Date: 2025-06-05\n", - "Current Limits State (Position Adjusted when these thresholds are reached):\n", - " Delta: True\n", - " Gamma: False\n", - " Vega: False\n", - " Theta: False\n", - " Roll On DTE: True\n", - " Min DTE Threshold: 95\n", - " Roll On Moneyness: True\n", - " Max Moneyness: 1.3\n", - "Quanitity Sizing Type: delta\n", - " \n" - ] - } - ], - "source": [ - "#Backtest class \n", - "## Find a way to not always reinitialize the backtest class, when want to redo\n", - "\n", - "pd.options.display.max_rows = 50\n", - "pd.options.display.max_columns = 50\n", - "\n", - "evb_single = OptionSignalBacktest(trades_, initial_capital=cash)\n", - "evb_single.portfolio.initial_capital\n", - "w_map = {x: w * 0.85 for x, w in weights.items()} ## 75% of the weights for each stock\n", - "evb_single.portfolio.weight_map = w_map\n", - "evb_single.portfolio.weight_map\n", - "evb_single.portfolio.risk_manager.OrderPicker.liquidity_threshold = 50\n", - "evb_single.portfolio.risk_manager.OrderPicker.lookback = 10\n", - "evb_single.portfolio.risk_manager.sizing_lev = 4.5\n", - "evb_single.portfolio.max_contract_price_factor = 2\n", - "evb_single.portfolio.min_moneyness_threshold = 3\n", - "evb_single.portfolio.risk_manager.OrderPicker.data_availability_threshold = 0.5\n", - "evb_single.portfolio.order_settings = {\n", - " 'type': 'spread',\n", - " 'specifics': [\n", - " {'direction': 'long', 'rel_strike': 1.0, 'dte': 365, 'moneyness_width': 0.1},\n", - " {'direction': 'short', 'rel_strike': 0.85, 'dte': 365, 'moneyness_width': 0.1} \n", - " ],\n", - " 'name': 'vertical_spread',\n", - " 'strategy': 'vertical',\n", - " 'target_dte': 270,\n", - " 'structure_direction': 'long',\n", - " 'spread_ticks': 1,\n", - " 'dte_tolerance': 60,\n", - " 'min_moneyness': 0.75,\n", - " 'max_moneyness': 1.25,\n", - " 'min_total_price': 0.5\n", - " }\n", - "\n", - "\n", - "evb_single.portfolio.max_contract_price = max_cash\n", - "evb_single.executor.commission_rate = 0.65/100\n", - "evb_single.portfolio.min_moneyness_threshold = 5\n", - "evb_single.executor.max_slippage_pct = 0.075\n", - "evb_single.portfolio.roll_map = 90\n", - "evb_single.portfolio.moneyness_width_factor = .025\n", - "evb_single.portfolio.dte_reduction_factor = 30\n", - "evb_single.portfolio.min_acceptable_dte_threshold = 95\n", - "evb_single.portfolio.risk_manager.limits['dte'] = True\n", - "evb_single.portfolio.risk_manager.limits['delta'] = True\n", - "evb_single.portfolio.risk_manager.limits['moneyness'] = True\n", - "evb_single.portfolio.risk_manager.max_moneyness = 1.3\n", - "for key in max_cash:\n", - " if max_cash[key]*100 > evb_single.portfolio.allocated_cash_map[key]:\n", - " print(key, max_cash[key]*100, evb_single.portfolio.allocated_cash_map[key])\n", - "\n", - "evb_single.portfolio.risk_manager.print_settings()\n", - "\n", - "signals = evb_single.bars.signal_df\n", - "signals_df = deepcopy(signals).set_index('Date')\n", - "((signals_df!=-1)&(signals_df!=-0)).sum().sum()\n", - "rm = evb_single.portfolio.risk_manager\n", - "pm = evb_single.portfolio" - ] - }, - { - "cell_type": "code", - "execution_count": 53, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Processing event: MARKET 2024-08-16 00:00:00\n", - "Processing event: SIGNAL 2024-08-16 00:00:00\n", - "Generating order for TSLA at 2024-08-16 00:00:00, Signal_ID: TSLA20240816LONG, Signal Type: LONG\n", - "\n", - "Order Received: {'result': 'SUCCESSFUL', 'data': {'trade_id': '&L:TSLA20250321C265&S:TSLA20250321C270', 'close': 1.2250000000000014, 'long': ['TSLA20250321C265'], 'short': ['TSLA20250321C270']}}\n", - "\n", - "Calculate Greeks Dates Start: 2017-01-01, End: 2025-06-05, Position ID: &L:TSLA20250321C265&S:TSLA20250321C270, Date: 2024-08-16\n", - "Position Data for &L:TSLA20250321C265&S:TSLA20250321C270 already available, skipping calculation\n", - "===========================\n", - "Buy Details\n", - "Position: {'trade_id': '&L:TSLA20250321C265&S:TSLA20250321C270', 'close': 1.2250000000000014, 'long': ['TSLA20250321C265'], 'short': ['TSLA20250321C270'], 'quantity': 18, 'cash_equivalent_qty': 18.0}, Date: 2024-08-16, Signal: SignalEvent type:LONG, symbol=TSLA, date:2024-08-16 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:TSLA20240816LONG\n", - "Max Contract Price: 4, Cash at Hand: 22.356659199418637\n", - "Cash at Hand 22.356659199418637 Close 1.2250000000000014\n", - "===========================\n", - "Processing event: ORDER 2024-08-16 00:00:00\n", - "Processing event: FILL 2024-08-16 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 4 event(s)\n", - "Processing event: MARKET 2024-08-19 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-08-20 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-08-21 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-08-22 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-08-23 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-08-26 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-08-27 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-08-28 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-08-29 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-08-30 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-09-02 00:00:00\n", - "Risk Manager Actions: IS_HOLIDAY\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-09-03 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-09-04 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-09-05 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-09-06 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-09-09 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-09-10 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-09-11 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-09-12 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-09-13 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-09-16 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-09-17 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-09-18 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-09-19 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-09-20 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-09-23 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-09-24 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-09-25 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-09-26 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-09-27 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-09-30 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-10-01 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-10-02 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-10-03 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-10-04 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-10-07 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-10-08 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-10-09 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-10-10 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-10-11 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-10-14 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-10-15 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-10-16 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-10-17 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-10-18 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-10-21 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-10-22 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-10-23 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-10-24 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-10-25 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-10-28 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-10-29 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-10-30 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-10-31 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-11-01 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-11-04 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-11-05 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-11-06 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-11-07 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-11-08 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': HOLD(&L:TSLA20250321C265&S:TSLA20250321C270) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-11-11 00:00:00\n", - "Risk Manager Scheduling Action: Position ID: &L:TSLA20250321C265&S:TSLA20250321C270, Action: ROLL(&L:TSLA20250321C265&S:TSLA20250321C270, Reason: moneyness), Reason: moneyness\n", - "Risk Manager Actions: {'&L:TSLA20250321C265&S:TSLA20250321C270': ROLL(&L:TSLA20250321C265&S:TSLA20250321C270, Reason: moneyness)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-11-12 00:00:00\n", - "Processing event: ROLL 2024-11-12 00:00:00\n", - "\n", - "Performing Roll Operation\n", - "\n", - "Rolling contract for TSLA at 2024-11-12 00:00:00\n", - "Processing event: SIGNAL 2024-11-12 00:00:00\n", - "Setting roll_tracker for CLOSING LEG of TSLA20240816LONG to CLOSED on 2024-11-12 00:00:00\n", - "Pushing SignalEvent type:LONG, symbol=TSLA, date:2024-11-12 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:TSLA20240816LONG to back of queue because conflicting events were found: [\"OrderEvent type=MKT, symbol=TSLA, date:2024-11-12 00:00:00, cash:None, quantity=17, direction=SELL, position={'trade_id': '&L:TSLA20250321C265&S:TSLA20250321C270', 'close': 3.3499999999999943, 'long': ['TSLA20250321C265'], 'short': ['TSLA20250321C270'], 'quantity': 18, 'cash_equivalent_qty': 18.0}, signal_id=TSLA20240816LONG\"]\n", - "Processing event: ORDER 2024-11-12 00:00:00\n", - "Pushing SignalEvent type:LONG, symbol=TSLA, date:2024-11-12 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:TSLA20240816LONG to back of queue because conflicting events were found: [\"FillEvent symbol=TSLA, date:2024-11-12 00:00:00, exchange=ARCA, quantity=17, direction=SELL, fill_cost=54.78545252854012, commission=0.22100000000000003, market_value=56.9499999999999, slippage=-1.9435474714597865, position={'trade_id': '&L:TSLA20250321C265&S:TSLA20250321C270', 'close': 3.3499999999999943, 'long': ['TSLA20250321C265'], 'short': ['TSLA20250321C270'], 'quantity': 18, 'cash_equivalent_qty': 18.0}, signal_id=TSLA20240816LONG\"]\n", - "Processing event: FILL 2024-11-12 00:00:00\n", - "Processing event: SIGNAL 2024-11-12 00:00:00\n", - "Generating order for TSLA at 2024-11-12 00:00:00, Signal_ID: TSLA20240816LONG, Signal Type: LONG\n", - "\n", - "Order Received: {'result': 'SUCCESSFUL', 'data': {'trade_id': '&L:TSLA20250919C405&S:TSLA20250919C410', 'close': 1.2000000000000028, 'long': ['TSLA20250919C405'], 'short': ['TSLA20250919C410']}}\n", - "\n", - "Calculate Greeks Dates Start: 2017-01-01, End: 2025-06-05, Position ID: &L:TSLA20250919C405&S:TSLA20250919C410, Date: 2024-11-12\n", - "Position Data for &L:TSLA20250919C405&S:TSLA20250919C410 already available, skipping calculation\n", - "===========================\n", - "Buy Details\n", - "Position: {'trade_id': '&L:TSLA20250919C405&S:TSLA20250919C410', 'close': 1.2000000000000028, 'long': ['TSLA20250919C405'], 'short': ['TSLA20250919C410'], 'quantity': 45, 'cash_equivalent_qty': 45.0}, Date: 2024-11-12, Signal: SignalEvent type:LONG, symbol=TSLA, date:2024-11-12 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:TSLA20240816LONG\n", - "Max Contract Price: 4, Cash at Hand: 54.98308020246229\n", - "Cash at Hand 54.98308020246229 Close 1.2000000000000028\n", - "===========================\n", - "Processing event: ORDER 2024-11-12 00:00:00\n", - "Processing event: FILL 2024-11-12 00:00:00\n", - "Not enough cash to buy TSLA at 2024-11-12 00:00:00, fill cost: 55.246816251322464, allocated cash: 5498.308020246229\n", - "Risk Manager Actions: {'&L:TSLA20250919C405&S:TSLA20250919C410': HOLD(&L:TSLA20250919C405&S:TSLA20250919C410) Reason: None)}\n", - "Event queue is empty, processed 8 event(s)\n", - "Processing event: MARKET 2024-11-13 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250919C405&S:TSLA20250919C410': HOLD(&L:TSLA20250919C405&S:TSLA20250919C410) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-11-14 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250919C405&S:TSLA20250919C410': HOLD(&L:TSLA20250919C405&S:TSLA20250919C410) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-11-15 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250919C405&S:TSLA20250919C410': HOLD(&L:TSLA20250919C405&S:TSLA20250919C410) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-11-18 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250919C405&S:TSLA20250919C410': HOLD(&L:TSLA20250919C405&S:TSLA20250919C410) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-11-19 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250919C405&S:TSLA20250919C410': HOLD(&L:TSLA20250919C405&S:TSLA20250919C410) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-11-20 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250919C405&S:TSLA20250919C410': HOLD(&L:TSLA20250919C405&S:TSLA20250919C410) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-11-21 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250919C405&S:TSLA20250919C410': HOLD(&L:TSLA20250919C405&S:TSLA20250919C410) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-11-22 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250919C405&S:TSLA20250919C410': HOLD(&L:TSLA20250919C405&S:TSLA20250919C410) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-11-25 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250919C405&S:TSLA20250919C410': HOLD(&L:TSLA20250919C405&S:TSLA20250919C410) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-11-26 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250919C405&S:TSLA20250919C410': HOLD(&L:TSLA20250919C405&S:TSLA20250919C410) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-11-27 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250919C405&S:TSLA20250919C410': HOLD(&L:TSLA20250919C405&S:TSLA20250919C410) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-11-28 00:00:00\n", - "Risk Manager Actions: IS_HOLIDAY\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-11-29 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250919C405&S:TSLA20250919C410': HOLD(&L:TSLA20250919C405&S:TSLA20250919C410) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-12-02 00:00:00\n", - "Position &L:TSLA20250919C405&S:TSLA20250919C410 exceeds delta limit. Current Delta: 0.45847091705724097, Max Delta: 0.45, Required Quantity: 42, Current Quantity: 43\n", - "Risk Manager Scheduling Action: Position ID: &L:TSLA20250919C405&S:TSLA20250919C410, Action: ADJUST(&L:TSLA20250919C405&S:TSLA20250919C410, Quantity Change: -1), Reason: greek_limit), Reason: greek_limit\n", - "Risk Manager Actions: {'&L:TSLA20250919C405&S:TSLA20250919C410': ADJUST(&L:TSLA20250919C405&S:TSLA20250919C410, Quantity Change: -1), Reason: greek_limit)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-12-03 00:00:00\n", - "Processing event: ORDER 2024-12-03 00:00:00\n", - "Processing event: FILL 2024-12-03 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250919C405&S:TSLA20250919C410': HOLD(&L:TSLA20250919C405&S:TSLA20250919C410) Reason: None)}\n", - "Event queue is empty, processed 3 event(s)\n", - "Processing event: MARKET 2024-12-04 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250919C405&S:TSLA20250919C410': HOLD(&L:TSLA20250919C405&S:TSLA20250919C410) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-12-05 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250919C405&S:TSLA20250919C410': HOLD(&L:TSLA20250919C405&S:TSLA20250919C410) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-12-06 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250919C405&S:TSLA20250919C410': HOLD(&L:TSLA20250919C405&S:TSLA20250919C410) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-12-09 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250919C405&S:TSLA20250919C410': HOLD(&L:TSLA20250919C405&S:TSLA20250919C410) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-12-10 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250919C405&S:TSLA20250919C410': HOLD(&L:TSLA20250919C405&S:TSLA20250919C410) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-12-11 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250919C405&S:TSLA20250919C410': HOLD(&L:TSLA20250919C405&S:TSLA20250919C410) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-12-12 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250919C405&S:TSLA20250919C410': HOLD(&L:TSLA20250919C405&S:TSLA20250919C410) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-12-13 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250919C405&S:TSLA20250919C410': HOLD(&L:TSLA20250919C405&S:TSLA20250919C410) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-12-16 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250919C405&S:TSLA20250919C410': HOLD(&L:TSLA20250919C405&S:TSLA20250919C410) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-12-17 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250919C405&S:TSLA20250919C410': HOLD(&L:TSLA20250919C405&S:TSLA20250919C410) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-12-18 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250919C405&S:TSLA20250919C410': HOLD(&L:TSLA20250919C405&S:TSLA20250919C410) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-12-19 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250919C405&S:TSLA20250919C410': HOLD(&L:TSLA20250919C405&S:TSLA20250919C410) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-12-20 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250919C405&S:TSLA20250919C410': HOLD(&L:TSLA20250919C405&S:TSLA20250919C410) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-12-23 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250919C405&S:TSLA20250919C410': HOLD(&L:TSLA20250919C405&S:TSLA20250919C410) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-12-24 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250919C405&S:TSLA20250919C410': HOLD(&L:TSLA20250919C405&S:TSLA20250919C410) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-12-25 00:00:00\n", - "Risk Manager Actions: IS_HOLIDAY\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-12-26 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250919C405&S:TSLA20250919C410': HOLD(&L:TSLA20250919C405&S:TSLA20250919C410) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-12-27 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250919C405&S:TSLA20250919C410': HOLD(&L:TSLA20250919C405&S:TSLA20250919C410) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-12-30 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20250919C405&S:TSLA20250919C410': HOLD(&L:TSLA20250919C405&S:TSLA20250919C410) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2024-12-31 00:00:00\n", - "Processing event: SIGNAL 2024-12-31 00:00:00\n", - "Processing event: ORDER 2024-12-31 00:00:00\n", - "Processing event: FILL 2024-12-31 00:00:00\n", - "No positions need to be adjusted on 2024-12-31 00:00:00\n", - "Risk Manager Actions: NO_POSITIONS_TO_ADJUST\n", - "Event queue is empty, processed 4 event(s)\n", - "No more dates left.\n" - ] - } - ], - "source": [ - "import cProfile\n", - "import pstats\n", - "import io\n", - "\n", - "profiler = cProfile.Profile()\n", - "profiler.enable()\n", - "#run backtest\n", - "evb_single.run()\n", - "profiler.disable()\n", - "stream = io.StringIO()\n", - "stats = pstats.Stats(profiler, stream=stream)\n", - "# stats.print_stats()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# ***ANALYSIS***" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from trade.helpers.helper import print_cprofile_internal_time_share, print_top_cprofile_stats\n", - "\n", - "# print_cprofile_internal_time_share(stats, top_n=100, sort_by='call', full_name=True)\n", - "# print_top_cprofile_stats(stats, top_n=100, sort_by='cumulative', full_name=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## ***KNOWN ISSUES***\n", - "\n", - "- Why did we close NVDA 2024-03-04 open on 2024-03-07?: Was a roll\n", - "- NVDA Spike is due to erratic behavior of the delta. The skip_flag doesn't capture it so far, not within zscore threshold\n", - " - Need to find secondary filter to avoid minor spikes. Maybe threshold at 2.5\n", - "- Sharpe Ratio in aggregate doesn't look correct, look into it.\n", - "- FFWD Spike.\n", - "- Revisit add_skip_days. Need to figure out what to do in flip from positive to negative fast\n", - "- Change Moneyness_check: Create a meta: direction has a list of series with option_id as key\n", - "- Filtering rash values stiill not workingwell.\n", - "\n", - "\n", - "\n", - "## ***Quick Fixes***\n", - "- Fixed rolling issue where sell is shifted, but buy still goes thru:\n", - " - Handled this by dropping both signals entirely and letting the analyze repopulate till close exits\n", - "\n", - "\n", - "\n", - "## ***Future Fixes***\n", - "- The negative values flipping from positive to short affects the pct_change zscore. Need to figure out what to do about it\n", - "- Re-write calculate_greeks in RM to make better sense.\n", - "- Handle open pnl at end of run. Have issues where none has been sold and pnl not coming up\n", - "- Add order resolve\n", - "- Does the data for split contracts being saved make sense?\n", - "- It saves post split & pre split, joined together on post split timeseries:\n", - " - Might be a good idea to seperate it. As well as save before sizing up.\n", - "- Come out w a solution for negative values. \n", - "- Limits only work for long delta, fix for short delta.\n", - "- Change order to take up a format of \n", - " Column Long | Column Short | Column Short ....\n", - " - Each column would have to somehow be a pegged to another to keep the distance correct.\n", - " - Another option is to construct a chain based on width and known properties." - ] - }, - { - "cell_type": "raw", - "metadata": { - "vscode": { - "languageId": "raw" - } - }, - "source": [ - "from EventDriven.riskmanager.utils import add_skip_columns\n", - "for id, position_data in rm.position_data.items():\n", - " position_data = add_skip_columns(position_data, ['Delta', 'Gamma', 'Vega', 'Theta', 'Midpoint'], 15 , 2.75)\n", - " rm.position_data[id] = position_data\n" - ] - }, - { - "cell_type": "code", - "execution_count": 403, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
signal_iddatetimesymboldirectioncash_beforecash_after
2NVDA20240112LONG2024-02-05NVDABUY5849.109046117.771861
0NVDA20240112LONG2024-01-12NVDABUY4296.450513140.358760
3NVDA20240112LONG2024-02-07NVDASELL117.771861361.428234
4NVDA20240112LONG2024-02-12NVDASELL361.428234658.892348
1NVDA20240112LONG2024-02-05NVDASELL140.3587605849.109046
6NVDA20240112LONG2024-03-08NVDABUY13152.6875299610.844261
5NVDA20240112LONG2024-03-08NVDASELL658.89234813152.687529
8NVDA20240112LONG2024-03-12NVDABUY25205.85251418765.364146
9NVDA20240112LONG2024-03-14NVDASELL18765.36414622782.604680
10NVDA20240112LONG2024-03-22NVDASELL22782.60468023304.521827
11NVDA20240112LONG2024-03-29NVDASELL23304.52182723539.119029
12NVDA20240112LONG2024-04-02NVDASELL23539.11902923781.424317
13NVDA20240112LONG2024-04-09NVDASELL23781.42431724006.623412
14NVDA20240112LONG2024-04-12NVDASELL24006.62341224253.179222
15NVDA20240112LONG2024-05-07NVDASELL24253.17922224782.355321
16NVDA20240112LONG2024-05-14NVDASELL24782.35532125024.215612
7NVDA20240112LONG2024-03-12NVDASELL9610.84426125205.852514
17NVDA20240112LONG2024-05-16NVDASELL25024.21561225302.941794
18NVDA20240112LONG2024-05-21NVDASELL25302.94179425907.314022
19NVDA20240112LONG2024-05-24NVDASELL25907.31402226279.949297
20NVDA20240112LONG2024-05-27NVDASELL26279.94929726680.066911
22NVDA20240112LONG2024-06-06NVDABUY39315.58735728260.021565
23NVDA20240112LONG2024-06-10NVDASELL28260.02156531300.505730
24NVDA20240112LONG2024-06-11NVDASELL31300.50573032564.045186
25NVDA20240112LONG2024-08-26NVDASELL32564.04518632916.441431
26NVDA20240112LONG2024-09-12NVDASELL32916.44143133787.811554
27NVDA20240112LONG2024-10-02NVDASELL33787.81155434553.355299
28NVDA20240112LONG2024-10-09NVDASELL34553.35529935860.420693
29NVDA20240112LONG2024-11-28NVDASELL35860.42069336117.781041
30NVDA20240112LONG2024-12-09NVDASELL36117.78104138893.912230
21NVDA20240112LONG2024-06-06NVDASELL26680.06691139315.587357
32NVDA20240112LONG2024-12-24NVDABUY48705.97270246038.547653
33NVDA20240112LONG2024-12-26NVDASELL46038.54765348139.746907
31NVDA20240112LONG2024-12-24NVDASELL38893.91223048705.972702
\n", - "
" - ], - "text/plain": [ - " signal_id datetime symbol direction cash_before cash_after\n", - "2 NVDA20240112LONG 2024-02-05 NVDA BUY 5849.109046 117.771861\n", - "0 NVDA20240112LONG 2024-01-12 NVDA BUY 4296.450513 140.358760\n", - "3 NVDA20240112LONG 2024-02-07 NVDA SELL 117.771861 361.428234\n", - "4 NVDA20240112LONG 2024-02-12 NVDA SELL 361.428234 658.892348\n", - "1 NVDA20240112LONG 2024-02-05 NVDA SELL 140.358760 5849.109046\n", - "6 NVDA20240112LONG 2024-03-08 NVDA BUY 13152.687529 9610.844261\n", - "5 NVDA20240112LONG 2024-03-08 NVDA SELL 658.892348 13152.687529\n", - "8 NVDA20240112LONG 2024-03-12 NVDA BUY 25205.852514 18765.364146\n", - "9 NVDA20240112LONG 2024-03-14 NVDA SELL 18765.364146 22782.604680\n", - "10 NVDA20240112LONG 2024-03-22 NVDA SELL 22782.604680 23304.521827\n", - "11 NVDA20240112LONG 2024-03-29 NVDA SELL 23304.521827 23539.119029\n", - "12 NVDA20240112LONG 2024-04-02 NVDA SELL 23539.119029 23781.424317\n", - "13 NVDA20240112LONG 2024-04-09 NVDA SELL 23781.424317 24006.623412\n", - "14 NVDA20240112LONG 2024-04-12 NVDA SELL 24006.623412 24253.179222\n", - "15 NVDA20240112LONG 2024-05-07 NVDA SELL 24253.179222 24782.355321\n", - "16 NVDA20240112LONG 2024-05-14 NVDA SELL 24782.355321 25024.215612\n", - "7 NVDA20240112LONG 2024-03-12 NVDA SELL 9610.844261 25205.852514\n", - "17 NVDA20240112LONG 2024-05-16 NVDA SELL 25024.215612 25302.941794\n", - "18 NVDA20240112LONG 2024-05-21 NVDA SELL 25302.941794 25907.314022\n", - "19 NVDA20240112LONG 2024-05-24 NVDA SELL 25907.314022 26279.949297\n", - "20 NVDA20240112LONG 2024-05-27 NVDA SELL 26279.949297 26680.066911\n", - "22 NVDA20240112LONG 2024-06-06 NVDA BUY 39315.587357 28260.021565\n", - "23 NVDA20240112LONG 2024-06-10 NVDA SELL 28260.021565 31300.505730\n", - "24 NVDA20240112LONG 2024-06-11 NVDA SELL 31300.505730 32564.045186\n", - "25 NVDA20240112LONG 2024-08-26 NVDA SELL 32564.045186 32916.441431\n", - "26 NVDA20240112LONG 2024-09-12 NVDA SELL 32916.441431 33787.811554\n", - "27 NVDA20240112LONG 2024-10-02 NVDA SELL 33787.811554 34553.355299\n", - "28 NVDA20240112LONG 2024-10-09 NVDA SELL 34553.355299 35860.420693\n", - "29 NVDA20240112LONG 2024-11-28 NVDA SELL 35860.420693 36117.781041\n", - "30 NVDA20240112LONG 2024-12-09 NVDA SELL 36117.781041 38893.912230\n", - "21 NVDA20240112LONG 2024-06-06 NVDA SELL 26680.066911 39315.587357\n", - "32 NVDA20240112LONG 2024-12-24 NVDA BUY 48705.972702 46038.547653\n", - "33 NVDA20240112LONG 2024-12-26 NVDA SELL 46038.547653 48139.746907\n", - "31 NVDA20240112LONG 2024-12-24 NVDA SELL 38893.912230 48705.972702" - ] - }, - "execution_count": 403, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pm = evb_backtest.portfolio\n", - "rm = evb_backtest.risk_manager\n", - "events = evb_backtest.get_events()\n", - "transactions = pm.transactions.copy()\n", - "equity = pm._equity.copy()\n", - "trades = pm.trades.copy()\n", - "actions = rm.actions.copy()\n", - "events[(events.symbol == 'META') & ( events.signal_id == 'META20240927LONG')]\n", - "transactions.sort_values('cash_after')\n", - "# trades[trades.SignalID=='TSLA20240816LONG']" - ] - }, - { - "cell_type": "code", - "execution_count": 378, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([HOLD(&L:NVDA20250221C1150&S:NVDA20250221C1160) Reason: None),\n", - " ADJUST(&L:NVDA20250221C1150&S:NVDA20250221C1160, Quantity Change: -10), Reason: greek_limit),\n", - " HOLD(&L:NVDA20250221C1150&S:NVDA20250221C1160) Reason: None),\n", - " ROLL(&L:NVDA20250221C1150&S:NVDA20250221C1160, Reason: moneyness)],\n", - " dtype=object)" - ] - }, - "execution_count": 378, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "actions['&L:NVDA20250221C1150&S:NVDA20250221C1160'].dropna().values" - ] - }, - { - "cell_type": "code", - "execution_count": 404, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'NVDA': 48139.746906808454}" - ] - }, - "execution_count": 404, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "\n", - "\n", - "pm.current_positions\n", - "# rm.analyze_position()\n", - "pm.trades_map.keys()\n", - "pm.allocated_cash_map\n", - "# rm.order_cache\n", - "# pm.current_positions" - ] - }, - { - "cell_type": "code", - "execution_count": 405, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Index(['TradeID', 'SignalID', 'Ticker', 'EntryTime', 'ExitTime', 'EntryPrice',\n", - " 'EntryCommission', 'EntrySlippage', 'EntryQuantity',\n", - " 'EntryAuxilaryCost', 'TotalEntryCost', 'ExitPrice', 'ExitCommission',\n", - " 'ExitSlippage', 'ExitQuantity', 'ExitAuxilaryCost', 'TotalExitCost',\n", - " 'Quantity', 'ClosedQuantity', 'ClosedPnL', 'TotalCommission',\n", - " 'TotalSlippage', 'TotalAuxilaryCost', 'OpenQuantity', 'UnrealizedPnL',\n", - " 'PnL', 'ReturnPct', 'Duration'],\n", - " dtype='object')" - ] - }, - "execution_count": 405, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pm.trades.columns\n", - "# rm.position_data['&L:NVDA20241220C1080&S:NVDA20241220C1090'].Midpoint[rm.pm_start_date:rm.pm_end_date].plot()" - ] - }, - { - "cell_type": "code", - "execution_count": 406, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
TradeIDSignalIDTickerEntryTimeExitTimeEntryPriceEntryQuantityExitPriceExitQuantityPnLReturnPctDurationOpenQuantityUnrealizedPnL
0&L:NVDA20240920C625&S:NVDA20240920C630NVDA20240112LONGNVDA2024-01-122024-02-05166.24367025228.350011251552.6585330.3735862400
1&L:NVDA20241115C840&S:NVDA20241115C850NVDA20240112LONGNVDA2024-02-052024-03-08220.43604626501.342910267303.5784821.2743243200
2&L:NVDA20250117C685&S:NVDA20250117C690NVDA20240112LONGNVDA2024-03-082024-03-1270.83686550311.9001655012053.1649853.403077400
3&L:NVDA20241018C1080&S:NVDA20241018C1090NVDA20240112LONGNVDA2024-03-122024-06-06123.85554652395.1966005214109.7348432.1907868600
4&L:NVDA20250321C1480&S:NVDA20250321C1490NVDA20240112LONGNVDA2024-06-062024-12-24181.23878361335.179527619390.3853450.84938120100
5&L:NVDA20250919C135&S:NVDA20250919C136NVDA20240112LONGNVDA2024-12-242024-12-2654.4372464942.88161749-566.225795-0.212274200
\n", - "
" - ], - "text/plain": [ - " TradeID SignalID Ticker \\\n", - "0 &L:NVDA20240920C625&S:NVDA20240920C630 NVDA20240112LONG NVDA \n", - "1 &L:NVDA20241115C840&S:NVDA20241115C850 NVDA20240112LONG NVDA \n", - "2 &L:NVDA20250117C685&S:NVDA20250117C690 NVDA20240112LONG NVDA \n", - "3 &L:NVDA20241018C1080&S:NVDA20241018C1090 NVDA20240112LONG NVDA \n", - "4 &L:NVDA20250321C1480&S:NVDA20250321C1490 NVDA20240112LONG NVDA \n", - "5 &L:NVDA20250919C135&S:NVDA20250919C136 NVDA20240112LONG NVDA \n", - "\n", - " EntryTime ExitTime EntryPrice EntryQuantity ExitPrice ExitQuantity \\\n", - "0 2024-01-12 2024-02-05 166.243670 25 228.350011 25 \n", - "1 2024-02-05 2024-03-08 220.436046 26 501.342910 26 \n", - "2 2024-03-08 2024-03-12 70.836865 50 311.900165 50 \n", - "3 2024-03-12 2024-06-06 123.855546 52 395.196600 52 \n", - "4 2024-06-06 2024-12-24 181.238783 61 335.179527 61 \n", - "5 2024-12-24 2024-12-26 54.437246 49 42.881617 49 \n", - "\n", - " PnL ReturnPct Duration OpenQuantity UnrealizedPnL \n", - "0 1552.658533 0.373586 24 0 0 \n", - "1 7303.578482 1.274324 32 0 0 \n", - "2 12053.164985 3.403077 4 0 0 \n", - "3 14109.734843 2.190786 86 0 0 \n", - "4 9390.385345 0.849381 201 0 0 \n", - "5 -566.225795 -0.212274 2 0 0 " - ] - }, - "execution_count": 406, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "trades[[\n", - " 'TradeID', 'SignalID', 'Ticker', 'EntryTime', 'ExitTime', 'EntryPrice', 'EntryQuantity', \n", - " 'ExitPrice', 'ExitQuantity', 'PnL', 'ReturnPct', 'Duration', 'OpenQuantity', 'UnrealizedPnL'\n", - "]]" - ] - }, - { - "cell_type": "code", - "execution_count": 359, - "metadata": {}, - "outputs": [], - "source": [ - "# events[events.symbol=='NVDA'].head(50)" - ] - }, - { - "cell_type": "code", - "execution_count": 360, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "AMZN 0.325310\n", - "cash 0.000000\n", - "commission 3.000000\n", - "Total 0.006895\n", - "dtype: float64" - ] - }, - "execution_count": 360, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "(equity.iloc[-1]/equity.iloc[0])-1\n", - "# equity\n", - "# equity.COST[-1]/equity.COST[0]-1\n", - "# equity#.NVDA.plot()" - ] - }, - { - "cell_type": "code", - "execution_count": 361, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Start 2024-01-31 00:00:00\n", - "End 2024-07-26 00:00:00\n", - "Duration 177 days 00:00:00\n", - "Exposure Time [%] 100.0\n", - "Equity Final [$] 20130.75\n", - "Equity Peak [$] 20302.018012\n", - "Return [%] 0.68947\n", - "Buy & Hold Return [%] 18.041237\n", - "CAGR [%] 1.426995\n", - "Volatility Ann. [%] 2.854543\n", - "Sharpe Ratio 0.510502\n", - "Sortino Ratio 0.752829\n", - "Skew 2.540961\n", - "Calmar Ratio 1.655479\n", - "Max. Drawdown [%] -0.861983\n", - "Max. Drawdown Value [$] -175.0\n", - "Avg. Drawdown [%] -0.166071\n", - "Max. Drawdown Duration 47 days 00:00:00\n", - "Avg Dradown Duration 12 days 13:07:30\n", - "# Trades 2\n", - "Win Rate [%] 50.0\n", - "Lose Rate [%] 50.0\n", - "Avg. Trade [%] 27.593374\n", - "Avg. Winning Trade [%] 73.637248\n", - "Avg. Losing Trade [%] -18.4505\n", - "Best Trade [%] 73.637248\n", - "Worst Trade [%] -18.4505\n", - "Avg Trade Duration 88.5\n", - "Avg Win Trade Duration 146.0\n", - "Avg Lose Duration 31.0\n", - "Max Trade Duration 146\n", - "Max Win Trade Duration 146\n", - "Max Lose Duration 31\n", - "Profit Factor 3.983034\n", - "Expectancy [%] 27.593374\n", - "SQN 0.847516\n", - "2024 Return [%] 0.68947\n", - "Winning Streak 1\n", - "Losing Streak 1\n", - "_strategy None\n", - "equity_curve AMZN cash commissio...\n", - "_trades TradeID ...\n", - "_tickers [AMZN]\n", - "dtype: object" - ] - }, - "execution_count": 361, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pm.aggregate()" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "name": "Equity Curve", - "showlegend": true, - "type": "scatter", - "x": [ - "2024-01-12T00:00:00", - "2024-01-15T00:00:00", - "2024-01-16T00:00:00", - "2024-01-17T00:00:00", - "2024-01-18T00:00:00", - "2024-01-19T00:00:00", - "2024-01-22T00:00:00", - "2024-01-23T00:00:00", - "2024-01-24T00:00:00", - "2024-01-25T00:00:00", - "2024-01-26T00:00:00", - "2024-01-29T00:00:00", - "2024-01-30T00:00:00", - "2024-01-31T00:00:00", - "2024-02-01T00:00:00", - "2024-02-02T00:00:00", - "2024-02-05T00:00:00", - "2024-02-06T00:00:00", - "2024-02-07T00:00:00", - "2024-02-08T00:00:00", - "2024-02-09T00:00:00", - "2024-02-12T00:00:00", - "2024-02-13T00:00:00", - "2024-02-14T00:00:00", - "2024-02-15T00:00:00", - "2024-02-16T00:00:00", - "2024-02-19T00:00:00", - "2024-02-20T00:00:00", - "2024-02-21T00:00:00", - "2024-02-22T00:00:00", - "2024-02-23T00:00:00", - "2024-02-26T00:00:00", - "2024-02-27T00:00:00", - "2024-02-28T00:00:00", - "2024-02-29T00:00:00", - "2024-03-01T00:00:00", - "2024-03-04T00:00:00", - "2024-03-05T00:00:00", - "2024-03-06T00:00:00", - "2024-03-07T00:00:00", - "2024-03-08T00:00:00", - "2024-03-11T00:00:00", - "2024-03-12T00:00:00", - "2024-03-13T00:00:00", - "2024-03-14T00:00:00", - "2024-03-15T00:00:00", - "2024-03-18T00:00:00", - "2024-03-19T00:00:00", - "2024-03-20T00:00:00", - "2024-03-21T00:00:00", - "2024-03-22T00:00:00", - "2024-03-25T00:00:00", - "2024-03-26T00:00:00", - "2024-03-27T00:00:00", - "2024-03-28T00:00:00", - "2024-03-29T00:00:00", - "2024-04-01T00:00:00", - "2024-04-02T00:00:00", - "2024-04-03T00:00:00", - "2024-04-04T00:00:00", - "2024-04-05T00:00:00", - "2024-04-08T00:00:00", - "2024-04-09T00:00:00", - "2024-04-10T00:00:00", - "2024-04-11T00:00:00", - "2024-04-12T00:00:00", - "2024-04-15T00:00:00", - "2024-04-16T00:00:00", - "2024-04-17T00:00:00", - "2024-04-18T00:00:00", - "2024-04-19T00:00:00", - "2024-04-22T00:00:00", - "2024-04-23T00:00:00", - "2024-04-24T00:00:00", - "2024-04-25T00:00:00", - "2024-04-26T00:00:00", - "2024-04-29T00:00:00", - "2024-04-30T00:00:00", - "2024-05-01T00:00:00", - "2024-05-02T00:00:00", - "2024-05-03T00:00:00", - "2024-05-06T00:00:00", - "2024-05-07T00:00:00", - "2024-05-08T00:00:00", - "2024-05-09T00:00:00", - "2024-05-10T00:00:00", - "2024-05-13T00:00:00", - "2024-05-14T00:00:00", - "2024-05-15T00:00:00", - "2024-05-16T00:00:00", - "2024-05-17T00:00:00", - "2024-05-20T00:00:00", - "2024-05-21T00:00:00", - "2024-05-22T00:00:00", - "2024-05-23T00:00:00", - "2024-05-24T00:00:00", - "2024-05-27T00:00:00", - "2024-05-28T00:00:00", - "2024-05-29T00:00:00", - "2024-05-30T00:00:00", - "2024-05-31T00:00:00", - "2024-06-03T00:00:00", - "2024-06-04T00:00:00", - "2024-06-05T00:00:00", - "2024-06-06T00:00:00", - "2024-06-07T00:00:00", - "2024-06-10T00:00:00", - "2024-06-11T00:00:00", - "2024-06-12T00:00:00", - "2024-06-13T00:00:00", - "2024-06-14T00:00:00", - "2024-06-17T00:00:00", - "2024-06-18T00:00:00", - "2024-06-19T00:00:00", - "2024-06-20T00:00:00", - "2024-06-21T00:00:00", - "2024-06-24T00:00:00", - "2024-06-25T00:00:00", - "2024-06-26T00:00:00", - "2024-06-27T00:00:00", - "2024-06-28T00:00:00", - "2024-07-01T00:00:00", - "2024-07-02T00:00:00", - "2024-07-03T00:00:00", - "2024-07-04T00:00:00", - "2024-07-05T00:00:00", - "2024-07-08T00:00:00", - "2024-07-09T00:00:00", - "2024-07-10T00:00:00", - "2024-07-11T00:00:00", - "2024-07-12T00:00:00", - "2024-07-15T00:00:00", - "2024-07-16T00:00:00", - "2024-07-17T00:00:00", - "2024-07-18T00:00:00", - "2024-07-19T00:00:00", - "2024-07-22T00:00:00", - "2024-07-23T00:00:00", - "2024-07-24T00:00:00", - "2024-07-25T00:00:00", - "2024-07-26T00:00:00", - "2024-07-29T00:00:00", - "2024-07-30T00:00:00", - "2024-07-31T00:00:00", - "2024-08-01T00:00:00", - "2024-08-02T00:00:00", - "2024-08-05T00:00:00", - "2024-08-06T00:00:00", - "2024-08-07T00:00:00", - "2024-08-08T00:00:00", - "2024-08-09T00:00:00", - "2024-08-12T00:00:00", - "2024-08-13T00:00:00", - "2024-08-14T00:00:00", - "2024-08-15T00:00:00", - "2024-08-16T00:00:00", - "2024-08-19T00:00:00", - "2024-08-20T00:00:00", - "2024-08-21T00:00:00", - "2024-08-22T00:00:00", - "2024-08-23T00:00:00", - "2024-08-26T00:00:00", - "2024-08-27T00:00:00", - "2024-08-28T00:00:00", - "2024-08-29T00:00:00", - "2024-08-30T00:00:00", - "2024-09-02T00:00:00", - "2024-09-03T00:00:00", - "2024-09-04T00:00:00", - "2024-09-05T00:00:00", - "2024-09-06T00:00:00", - "2024-09-09T00:00:00", - "2024-09-10T00:00:00", - "2024-09-11T00:00:00", - "2024-09-12T00:00:00", - "2024-09-13T00:00:00", - "2024-09-16T00:00:00", - "2024-09-17T00:00:00", - "2024-09-18T00:00:00", - "2024-09-19T00:00:00", - "2024-09-20T00:00:00", - "2024-09-23T00:00:00", - "2024-09-24T00:00:00", - "2024-09-25T00:00:00", - "2024-09-26T00:00:00", - "2024-09-27T00:00:00", - "2024-09-30T00:00:00", - "2024-10-01T00:00:00", - "2024-10-02T00:00:00", - "2024-10-03T00:00:00", - "2024-10-04T00:00:00", - "2024-10-07T00:00:00", - "2024-10-08T00:00:00", - "2024-10-09T00:00:00", - "2024-10-10T00:00:00", - "2024-10-11T00:00:00", - "2024-10-14T00:00:00", - "2024-10-15T00:00:00", - "2024-10-16T00:00:00", - "2024-10-17T00:00:00", - "2024-10-18T00:00:00", - "2024-10-21T00:00:00", - "2024-10-22T00:00:00", - "2024-10-23T00:00:00", - "2024-10-24T00:00:00", - "2024-10-25T00:00:00", - "2024-10-28T00:00:00", - "2024-10-29T00:00:00", - "2024-10-30T00:00:00", - "2024-10-31T00:00:00", - "2024-11-01T00:00:00", - "2024-11-04T00:00:00", - "2024-11-05T00:00:00", - "2024-11-06T00:00:00", - "2024-11-07T00:00:00", - "2024-11-08T00:00:00", - "2024-11-11T00:00:00", - "2024-11-12T00:00:00", - "2024-11-13T00:00:00", - "2024-11-14T00:00:00", - "2024-11-15T00:00:00", - "2024-11-18T00:00:00", - "2024-11-19T00:00:00", - "2024-11-20T00:00:00", - "2024-11-21T00:00:00", - "2024-11-22T00:00:00", - "2024-11-25T00:00:00", - "2024-11-26T00:00:00", - "2024-11-27T00:00:00", - "2024-11-28T00:00:00", - "2024-11-29T00:00:00", - "2024-12-02T00:00:00", - "2024-12-03T00:00:00", - "2024-12-04T00:00:00", - "2024-12-05T00:00:00", - "2024-12-06T00:00:00", - "2024-12-09T00:00:00", - "2024-12-10T00:00:00", - "2024-12-11T00:00:00", - "2024-12-12T00:00:00", - "2024-12-13T00:00:00", - "2024-12-16T00:00:00", - "2024-12-17T00:00:00", - "2024-12-18T00:00:00", - "2024-12-19T00:00:00", - "2024-12-20T00:00:00", - "2024-12-23T00:00:00", - "2024-12-24T00:00:00", - "2024-12-25T00:00:00", - "2024-12-26T00:00:00", - "2024-12-27T00:00:00", - "2024-12-30T00:00:00", - "2024-12-31T00:00:00" - ], - "xaxis": "x", - "y": [ - 1.00000019776224, - 1.00000019776224, - 1.0189252487292009, - 1.0094627232457203, - 1.0283877742126812, - 1.0599295258242827, - 1.088317102274724, - 1.0725462264689234, - 1.0946254525970445, - 1.088317102274724, - 1.0820087519524038, - 1.1040879780805248, - 1.107242153241685, - 1.088317102274724, - 1.0946254525970445, - 1.1356297296921263, - 1.0742903591660384, - 1.136616860350563, - 1.1516004540361384, - 1.1263670527468572, - 1.1957589062923806, - 1.1862524746906566, - 1.1529443849888052, - 1.1862524746906566, - 1.192308491000084, - 1.1953364991547977, - 1.1953364991547977, - 1.1378043442152366, - 1.1105522708228128, - 1.3285688579622026, - 1.2831487356414963, - 1.2861767437962102, - 1.2831487356414963, - 1.2589246704037864, - 1.2801207274867827, - 1.3406808905810574, - 1.3770169884376224, - 1.3861010129017637, - 1.4194091026036149, - 1.5305652632910534, - 2.564503881119351, - 1.9469163845641935, - 2.0456344970881193, - 2.005261055025269, - 1.9699342932202757, - 1.9749809734781318, - 1.9850743339938444, - 1.9901210142517007, - 2.005261055025269, - 2.0243410390761465, - 2.0637051450874253, - 2.0833871980930643, - 1.6405410054661793, - 2.009579499321917, - 2.009199988966526, - 2.0081522981449953, - 2.0081522981449953, - 2.0268250150990634, - 1.9949794533359386, - 1.9419893106284483, - 1.9773160724334418, - 1.8050981086340976, - 2.15394988145841, - 2.0037586583125053, - 2.046150772478498, - 2.0178893630345027, - 1.9825626012295092, - 1.9966933059515066, - 1.9684318965075116, - 1.9684318965075116, - 1.8695169634535294, - 1.9119090776195218, - 1.9366378108830173, - 1.904843725258523, - 1.9507685156050147, - 1.7741347065800464, - 2.0108240106735042, - 1.9578338679660137, - 1.9507685156050147, - 1.9754972488685105, - 2.0037586583125053, - 2.0532161248394964, - 2.039085420117499, - 2.0320200677565, - 2.0249547153955016, - 2.028487391576001, - 2.039085420117499, - 2.049683448658997, - 2.0850102104639907, - 2.0814775342834917, - 2.056748801019996, - 2.0991409151859886, - 2.0991409151859886, - 1.855386258731532, - 2.2263172576839656, - 2.222784581503466, - 2.222784581503466, - 2.162729086434977, - 2.125201467369532, - 2.770545705342899, - 2.7379133661275747, - 3.7189880082548283, - 3.709103075633765, - 3.7234861143686553, - 3.743983710903964, - 4.028742644453502, - 4.165757490114171, - 4.1046220054705005, - 4.047846852569617, - 6.034977204100513, - 4.1046220054705005, - 9.441486378153474, - 4.274947464173149, - 4.274947464173149, - 3.763971088065204, - 3.423320170659908, - 3.934296546767852, - 4.1046220054705005, - 4.1046220054705005, - 3.423320170659908, - 4.047846852569617, - 4.1046220054705005, - 3.9910716996687348, - 4.161397158371383, - 4.161397158371383, - 4.047846852569617, - 3.423320170659908, - 4.161397158371383, - 4.218172311272266, - 4.161397158371383, - 4.1046220054705005, - 4.161397158371383, - 4.1046220054705005, - 3.8775213938669695, - 3.9910716996687348, - 3.934296546767852, - 4.047846852569617, - 4.047846852569617, - 3.423320170659908, - 3.8775213938669695, - 3.934296546767852, - 3.8775213938669695, - 3.820746240966087, - 4.047846852569617, - 3.8775213938669695, - 3.820746240966087, - 3.763971088065204, - 3.763971088065204, - 3.763971088065204, - 3.763971088065204, - 3.763971088065204, - 3.423320170659908, - 3.934296546767852, - 3.9910716996687348, - 4.218172311272266, - 4.107452688427132, - 4.107452688427132, - 3.8904454373393134, - 4.053200875655177, - 3.4564309351636764, - 4.270208126742996, - 4.107452688427132, - 4.107452688427132, - 4.270208126742996, - 4.020987915569281, - 3.971782783055182, - 3.971782783055182, - 3.9225776505410836, - 3.824167385512887, - 3.824167385512887, - 3.824167385512887, - 3.824167385512887, - 3.9225776505410836, - 4.119398180597477, - 3.971782783055182, - 4.020987915569281, - 3.528936590428297, - 3.9225776505410836, - 3.528936590428297, - 3.971782783055182, - 3.9225776505410836, - 3.9225776505410836, - 3.528936590428297, - 3.676551987970592, - 4.070193048083379, - 4.070193048083379, - 4.020987915569281, - 4.070193048083379, - 3.9735834385711857, - 4.117413825920089, - 4.02152690102082, - 4.117413825920089, - 4.405074600617894, - 4.179814008636377, - 4.22397246089262, - 4.22397246089262, - 4.003180199611409, - 4.179814008636377, - 4.179814008636377, - 4.44476472217383, - 4.22397246089262, - 4.400606269917588, - 4.312289365405103, - 4.312289365405103, - 4.22397246089262, - 4.312289365405103, - 4.135655556380136, - 4.268130913148862, - 5.990310551142304, - 6.034469003398546, - 4.22397246089262, - 4.091497104123893, - 4.312289365405103, - 4.312289365405103, - 4.44476472217383, - 4.400606269917588, - 4.356447817661346, - 4.400606269917588, - 4.312289365405103, - 4.488923174430072, - 5.239616862786188, - 4.205792299931718, - 4.580508309077545, - 6.045307253920319, - 4.707875416089268, - 4.435354682165031, - 4.556475008353582, - 4.617035171447856, - 4.526194926806444, - 4.526194926806444, - 4.647315252994994, - 4.647315252994994, - 4.647315252994994, - 4.193114029787933, - 4.950116068466368, - 4.798715660730681, - 4.617035171447856, - 5.313477047032018, - 4.647315252994994, - 4.647315252994994, - 4.193114029787933, - 4.556475008353582, - 4.526194926806444, - 4.495914845259307, - 4.556475008353582, - 4.193114029787933, - 4.586755089900719, - 4.629235520971224, - 4.629235520971224, - 4.62305333765535, - 4.684875170814089, - 4.623083113068871, - 4.770157506487524 - ], - "yaxis": "y" - }, - { - "name": "Benchmark", - "showlegend": true, - "type": "scatter", - "x": [ - "2024-01-12T00:00:00", - "2024-01-15T00:00:00", - "2024-01-16T00:00:00", - "2024-01-17T00:00:00", - "2024-01-18T00:00:00", - "2024-01-19T00:00:00", - "2024-01-22T00:00:00", - "2024-01-23T00:00:00", - "2024-01-24T00:00:00", - "2024-01-25T00:00:00", - "2024-01-26T00:00:00", - "2024-01-29T00:00:00", - "2024-01-30T00:00:00", - "2024-01-31T00:00:00", - "2024-02-01T00:00:00", - "2024-02-02T00:00:00", - "2024-02-05T00:00:00", - "2024-02-06T00:00:00", - "2024-02-07T00:00:00", - "2024-02-08T00:00:00", - "2024-02-09T00:00:00", - "2024-02-12T00:00:00", - "2024-02-13T00:00:00", - "2024-02-14T00:00:00", - "2024-02-15T00:00:00", - "2024-02-16T00:00:00", - "2024-02-19T00:00:00", - "2024-02-20T00:00:00", - "2024-02-21T00:00:00", - "2024-02-22T00:00:00", - "2024-02-23T00:00:00", - "2024-02-26T00:00:00", - "2024-02-27T00:00:00", - "2024-02-28T00:00:00", - "2024-02-29T00:00:00", - "2024-03-01T00:00:00", - "2024-03-04T00:00:00", - "2024-03-05T00:00:00", - "2024-03-06T00:00:00", - "2024-03-07T00:00:00", - "2024-03-08T00:00:00", - "2024-03-11T00:00:00", - "2024-03-12T00:00:00", - "2024-03-13T00:00:00", - "2024-03-14T00:00:00", - "2024-03-15T00:00:00", - "2024-03-18T00:00:00", - "2024-03-19T00:00:00", - "2024-03-20T00:00:00", - "2024-03-21T00:00:00", - "2024-03-22T00:00:00", - "2024-03-25T00:00:00", - "2024-03-26T00:00:00", - "2024-03-27T00:00:00", - "2024-03-28T00:00:00", - "2024-03-29T00:00:00", - "2024-04-01T00:00:00", - "2024-04-02T00:00:00", - "2024-04-03T00:00:00", - "2024-04-04T00:00:00", - "2024-04-05T00:00:00", - "2024-04-08T00:00:00", - "2024-04-09T00:00:00", - "2024-04-10T00:00:00", - "2024-04-11T00:00:00", - "2024-04-12T00:00:00", - "2024-04-15T00:00:00", - "2024-04-16T00:00:00", - "2024-04-17T00:00:00", - "2024-04-18T00:00:00", - "2024-04-19T00:00:00", - "2024-04-22T00:00:00", - "2024-04-23T00:00:00", - "2024-04-24T00:00:00", - "2024-04-25T00:00:00", - "2024-04-26T00:00:00", - "2024-04-29T00:00:00", - "2024-04-30T00:00:00", - "2024-05-01T00:00:00", - "2024-05-02T00:00:00", - "2024-05-03T00:00:00", - "2024-05-06T00:00:00", - "2024-05-07T00:00:00", - "2024-05-08T00:00:00", - "2024-05-09T00:00:00", - "2024-05-10T00:00:00", - "2024-05-13T00:00:00", - "2024-05-14T00:00:00", - "2024-05-15T00:00:00", - "2024-05-16T00:00:00", - "2024-05-17T00:00:00", - "2024-05-20T00:00:00", - "2024-05-21T00:00:00", - "2024-05-22T00:00:00", - "2024-05-23T00:00:00", - "2024-05-24T00:00:00", - "2024-05-27T00:00:00", - "2024-05-28T00:00:00", - "2024-05-29T00:00:00", - "2024-05-30T00:00:00", - "2024-05-31T00:00:00", - "2024-06-03T00:00:00", - "2024-06-04T00:00:00", - "2024-06-05T00:00:00", - "2024-06-06T00:00:00", - "2024-06-07T00:00:00", - "2024-06-10T00:00:00", - "2024-06-11T00:00:00", - "2024-06-12T00:00:00", - "2024-06-13T00:00:00", - "2024-06-14T00:00:00", - "2024-06-17T00:00:00", - "2024-06-18T00:00:00", - "2024-06-19T00:00:00", - "2024-06-20T00:00:00", - "2024-06-21T00:00:00", - "2024-06-24T00:00:00", - "2024-06-25T00:00:00", - "2024-06-26T00:00:00", - "2024-06-27T00:00:00", - "2024-06-28T00:00:00", - "2024-07-01T00:00:00", - "2024-07-02T00:00:00", - "2024-07-03T00:00:00", - "2024-07-04T00:00:00", - "2024-07-05T00:00:00", - "2024-07-08T00:00:00", - "2024-07-09T00:00:00", - "2024-07-10T00:00:00", - "2024-07-11T00:00:00", - "2024-07-12T00:00:00", - "2024-07-15T00:00:00", - "2024-07-16T00:00:00", - "2024-07-17T00:00:00", - "2024-07-18T00:00:00", - "2024-07-19T00:00:00", - "2024-07-22T00:00:00", - "2024-07-23T00:00:00", - "2024-07-24T00:00:00", - "2024-07-25T00:00:00", - "2024-07-26T00:00:00", - "2024-07-29T00:00:00", - "2024-07-30T00:00:00", - "2024-07-31T00:00:00", - "2024-08-01T00:00:00", - "2024-08-02T00:00:00", - "2024-08-05T00:00:00", - "2024-08-06T00:00:00", - "2024-08-07T00:00:00", - "2024-08-08T00:00:00", - "2024-08-09T00:00:00", - "2024-08-12T00:00:00", - "2024-08-13T00:00:00", - "2024-08-14T00:00:00", - "2024-08-15T00:00:00", - "2024-08-16T00:00:00", - "2024-08-19T00:00:00", - "2024-08-20T00:00:00", - "2024-08-21T00:00:00", - "2024-08-22T00:00:00", - "2024-08-23T00:00:00", - "2024-08-26T00:00:00", - "2024-08-27T00:00:00", - "2024-08-28T00:00:00", - "2024-08-29T00:00:00", - "2024-08-30T00:00:00", - "2024-09-02T00:00:00", - "2024-09-03T00:00:00", - "2024-09-04T00:00:00", - "2024-09-05T00:00:00", - "2024-09-06T00:00:00", - "2024-09-09T00:00:00", - "2024-09-10T00:00:00", - "2024-09-11T00:00:00", - "2024-09-12T00:00:00", - "2024-09-13T00:00:00", - "2024-09-16T00:00:00", - "2024-09-17T00:00:00", - "2024-09-18T00:00:00", - "2024-09-19T00:00:00", - "2024-09-20T00:00:00", - "2024-09-23T00:00:00", - "2024-09-24T00:00:00", - "2024-09-25T00:00:00", - "2024-09-26T00:00:00", - "2024-09-27T00:00:00", - "2024-09-30T00:00:00", - "2024-10-01T00:00:00", - "2024-10-02T00:00:00", - "2024-10-03T00:00:00", - "2024-10-04T00:00:00", - "2024-10-07T00:00:00", - "2024-10-08T00:00:00", - "2024-10-09T00:00:00", - "2024-10-10T00:00:00", - "2024-10-11T00:00:00", - "2024-10-14T00:00:00", - "2024-10-15T00:00:00", - "2024-10-16T00:00:00", - "2024-10-17T00:00:00", - "2024-10-18T00:00:00", - "2024-10-21T00:00:00", - "2024-10-22T00:00:00", - "2024-10-23T00:00:00", - "2024-10-24T00:00:00", - "2024-10-25T00:00:00", - "2024-10-28T00:00:00", - "2024-10-29T00:00:00", - "2024-10-30T00:00:00", - "2024-10-31T00:00:00", - "2024-11-01T00:00:00", - "2024-11-04T00:00:00", - "2024-11-05T00:00:00", - "2024-11-06T00:00:00", - "2024-11-07T00:00:00", - "2024-11-08T00:00:00", - "2024-11-11T00:00:00", - "2024-11-12T00:00:00", - "2024-11-13T00:00:00", - "2024-11-14T00:00:00", - "2024-11-15T00:00:00", - "2024-11-18T00:00:00", - "2024-11-19T00:00:00", - "2024-11-20T00:00:00", - "2024-11-21T00:00:00", - "2024-11-22T00:00:00", - "2024-11-25T00:00:00", - "2024-11-26T00:00:00", - "2024-11-27T00:00:00", - "2024-11-28T00:00:00", - "2024-11-29T00:00:00", - "2024-12-02T00:00:00", - "2024-12-03T00:00:00", - "2024-12-04T00:00:00", - "2024-12-05T00:00:00", - "2024-12-06T00:00:00", - "2024-12-09T00:00:00", - "2024-12-10T00:00:00", - "2024-12-11T00:00:00", - "2024-12-12T00:00:00", - "2024-12-13T00:00:00", - "2024-12-16T00:00:00", - "2024-12-17T00:00:00", - "2024-12-18T00:00:00", - "2024-12-19T00:00:00", - "2024-12-20T00:00:00", - "2024-12-23T00:00:00", - "2024-12-24T00:00:00", - "2024-12-25T00:00:00", - "2024-12-26T00:00:00", - "2024-12-27T00:00:00", - "2024-12-30T00:00:00", - "2024-12-31T00:00:00" - ], - "xaxis": "x", - "y": [ - null, - 1, - 0.9963287739638985, - 0.990790500548981, - 0.9996014046229638, - 1.0120625998329051, - 1.014202441124595, - 1.0171603440493988, - 1.0182722625377325, - 1.0238105359526501, - 1.022509883257522, - 1.0306075282413085, - 1.0298104015083374, - 1.013006654993486, - 1.0262650409574996, - 1.0370689219166636, - 1.0332927652954413, - 1.0362927300838356, - 1.0449358348511668, - 1.045397362970835, - 1.0514391623479098, - 1.0509776342282415, - 1.0365024632118747, - 1.0459218238331354, - 1.0531384104200745, - 1.0478938017970723, - 1.0478938017970723, - 1.04212473231177, - 1.0430687234512495, - 1.0646555504694346, - 1.065389808480875, - 1.0614877863743888, - 1.063459764338326, - 1.0620542450791781, - 1.0658722715006865, - 1.0758789617057782, - 1.0747251734171583, - 1.0639842252006262, - 1.0693756982301366, - 1.0799907809614049, - 1.0735084523859064, - 1.07258539614657, - 1.0841235991382758, - 1.0824242230239085, - 1.0802845097744214, - 1.069543497536788, - 1.0758999606270223, - 1.0818788912825663, - 1.0918855174665565, - 1.0954938747811274, - 1.093417030253171, - 1.0903961305646335, - 1.0883821547582078, - 1.0975287214665947, - 1.0973189883385557, - 1.0973189883385557, - 1.0954098790961493, - 1.0884451515219409, - 1.089640809610847, - 1.0763405538465471, - 1.087584964004135, - 1.0881932925092102, - 1.0894520754040524, - 1.0785432638597674, - 1.086682906686043, - 1.0716833388284772, - 1.058257153557812, - 1.0563271094152626, - 1.0500755128890475, - 1.0479147366972148, - 1.0387681699888278, - 1.0483343309954956, - 1.0607745272841924, - 1.0602710653431366, - 1.0562431777513863, - 1.0662499319775791, - 1.0700260245777002, - 1.0530754776774418, - 1.049655982611868, - 1.059473874589064, - 1.0726063950678137, - 1.0836830059187503, - 1.084878792049859, - 1.0849836586138784, - 1.0912351911189921, - 1.0926408384203428, - 1.0927875747846485, - 1.0978014513583672, - 1.1113955639778865, - 1.1091088582796884, - 1.1107032397878336, - 1.1119828935617173, - 1.1147100644372379, - 1.1115004305419058, - 1.1033817866368747, - 1.1106822408665886, - 1.1106822408665886, - 1.1114584326994168, - 1.1036753874076888, - 1.0963539342567303, - 1.1063396895616788, - 1.1072417468797708, - 1.1084795308533686, - 1.1216539211324046, - 1.1216329222111603, - 1.1202694007945013, - 1.1237307656603612, - 1.12643706565684, - 1.1356884989292466, - 1.1379752046274447, - 1.1386675288174977, - 1.147730099840907, - 1.150646132965425, - 1.150646132965425, - 1.1475203667128682, - 1.1422967570111104, - 1.13858353313252, - 1.142968082279919, - 1.1443946004603114, - 1.1461987150964954, - 1.1416883004638325, - 1.144038002925764, - 1.1517370525325141, - 1.1568767945914966, - 1.1568767945914966, - 1.163547921394891, - 1.164890571932508, - 1.1660233612998836, - 1.1775615002704882, - 1.1674078816377869, - 1.1747713326312343, - 1.1780020934900133, - 1.1849878199854662, - 1.1683729357196122, - 1.1593941042967753, - 1.1516950546900249, - 1.1635689203161352, - 1.1617438067587067, - 1.1354157690374738, - 1.129499835145663, - 1.1421498926046016, - 1.1428212178734103, - 1.1370311494668635, - 1.1555131451326348, - 1.1391499918373087, - 1.1179408252960168, - 1.0853822539909146, - 1.0953890082171076, - 1.0880674270239463, - 1.1132206775353148, - 1.1181295595028113, - 1.1187170171288447, - 1.1371150171096385, - 1.1407023755029648, - 1.160254291814581, - 1.1628555972048376, - 1.1739741418771614, - 1.1720651606769579, - 1.1760929842476069, - 1.166862421854242, - 1.1792607483426525, - 1.176449581782154, - 1.1780649622115436, - 1.1712259720803964, - 1.171330838644416, - 1.182512380080473, - 1.182512380080473, - 1.1581774472866242, - 1.155806873945651, - 1.152995707385153, - 1.133590655480045, - 1.1462825827392695, - 1.1512754603917437, - 1.1630863292541207, - 1.1728833503522746, - 1.1790090173721242, - 1.1807502632867777, - 1.181232726306589, - 1.1777293635982402, - 1.1978266116511984, - 1.192099540008385, - 1.1950784418544336, - 1.198497936920007, - 1.1958546336872615, - 1.2005957803692078, - 1.1988545344545543, - 1.2036586779002338, - 1.1928757318412129, - 1.1933791937822686, - 1.1911974826902927, - 1.2020222985495999, - 1.1911554848478036, - 1.202420893926636, - 1.210749399001909, - 1.2086305566314637, - 1.2158681421396471, - 1.2258118996021068, - 1.2162877364379279, - 1.2215742148612163, - 1.2216790814252358, - 1.226378358306896, - 1.2243643825004702, - 1.223714056152906, - 1.2125325147168489, - 1.2151548190283499, - 1.2147352247300691, - 1.2184904464511483, - 1.2204624244150852, - 1.2167701994577393, - 1.192917729683702, - 1.1979524771364622, - 1.19537217066745, - 1.2098263427625726, - 1.2399093461204793, - 1.2494965060483916, - 1.2549089779991465, - 1.2561047641302554, - 1.2522028060448704, - 1.2528111345499457, - 1.2447553593664453, - 1.2288118003694, - 1.2338466758643631, - 1.2383569624548234, - 1.238776556753104, - 1.245426684635254, - 1.2492867729203527, - 1.2535244576612434, - 1.2600697189793737, - 1.2562516285367638, - 1.2562516285367638, - 1.2640555447075337, - 1.2663212514844875, - 1.2669085810683183, - 1.2747754940028213, - 1.2726776505536206, - 1.2750902217370828, - 1.268523961497708, - 1.2645800055698342, - 1.2743560277467436, - 1.2677897675073688, - 1.267538036536841, - 1.2729503804453932, - 1.2677057718223912, - 1.229923718857734, - 1.2295459943597395, - 1.240140206211966, - 1.2475665259269442, - 1.261433240396033, - 1.261433240396033, - 1.2615172360810107, - 1.2482378511957526, - 1.233993412228669, - 1.2295041245594533 - ], - "yaxis": "y" - }, - { - "customdata": [ - 25, - 26, - 55, - 31, - 48, - 61, - 49 - ], - "hovertemplate": "%{text}

Date: %{x}
Size: %{customdata}
PnL: %{y}
", - "marker": { - "color": [ - "green", - "green", - "green", - "green", - "green", - "green", - "green" - ] - }, - "mode": "markers", - "name": "Ticker", - "showlegend": false, - "text": [ - "NVDA", - "NVDA", - "NVDA", - "NVDA", - "NVDA", - "NVDA", - "NVDA" - ], - "type": "scatter", - "x": [ - "2024-01-12T00:00:00", - "2024-02-05T00:00:00", - "2024-03-07T00:00:00", - "2024-05-29T00:00:00", - "2024-05-31T00:00:00", - "2024-06-06T00:00:00", - "2024-12-24T00:00:00" - ], - "xaxis": "x2", - "y": [ - 0.37623337269988116, - 1.5291314131654508, - 2.372872644233779, - 4.192244418271823, - 6.309229870826918, - 1.5666969078302981, - 1.047383794498297 - ], - "yaxis": "y2" - }, - { - "fill": "tozeroy", - "line": { - "color": "red" - }, - "name": "Drawdown", - "showlegend": false, - "type": "scatter", - "x": [ - "2024-01-12T00:00:00", - "2024-01-15T00:00:00", - "2024-01-16T00:00:00", - "2024-01-17T00:00:00", - "2024-01-18T00:00:00", - "2024-01-19T00:00:00", - "2024-01-22T00:00:00", - "2024-01-23T00:00:00", - "2024-01-24T00:00:00", - "2024-01-25T00:00:00", - "2024-01-26T00:00:00", - "2024-01-29T00:00:00", - "2024-01-30T00:00:00", - "2024-01-31T00:00:00", - "2024-02-01T00:00:00", - "2024-02-02T00:00:00", - "2024-02-05T00:00:00", - "2024-02-06T00:00:00", - "2024-02-07T00:00:00", - "2024-02-08T00:00:00", - "2024-02-09T00:00:00", - "2024-02-12T00:00:00", - "2024-02-13T00:00:00", - "2024-02-14T00:00:00", - "2024-02-15T00:00:00", - "2024-02-16T00:00:00", - "2024-02-19T00:00:00", - "2024-02-20T00:00:00", - "2024-02-21T00:00:00", - "2024-02-22T00:00:00", - "2024-02-23T00:00:00", - "2024-02-26T00:00:00", - "2024-02-27T00:00:00", - "2024-02-28T00:00:00", - "2024-02-29T00:00:00", - "2024-03-01T00:00:00", - "2024-03-04T00:00:00", - "2024-03-05T00:00:00", - "2024-03-06T00:00:00", - "2024-03-07T00:00:00", - "2024-03-08T00:00:00", - "2024-03-11T00:00:00", - "2024-03-12T00:00:00", - "2024-03-13T00:00:00", - "2024-03-14T00:00:00", - "2024-03-15T00:00:00", - "2024-03-18T00:00:00", - "2024-03-19T00:00:00", - "2024-03-20T00:00:00", - "2024-03-21T00:00:00", - "2024-03-22T00:00:00", - "2024-03-25T00:00:00", - "2024-03-26T00:00:00", - "2024-03-27T00:00:00", - "2024-03-28T00:00:00", - "2024-03-29T00:00:00", - "2024-04-01T00:00:00", - "2024-04-02T00:00:00", - "2024-04-03T00:00:00", - "2024-04-04T00:00:00", - "2024-04-05T00:00:00", - "2024-04-08T00:00:00", - "2024-04-09T00:00:00", - "2024-04-10T00:00:00", - "2024-04-11T00:00:00", - "2024-04-12T00:00:00", - "2024-04-15T00:00:00", - "2024-04-16T00:00:00", - "2024-04-17T00:00:00", - "2024-04-18T00:00:00", - "2024-04-19T00:00:00", - "2024-04-22T00:00:00", - "2024-04-23T00:00:00", - "2024-04-24T00:00:00", - "2024-04-25T00:00:00", - "2024-04-26T00:00:00", - "2024-04-29T00:00:00", - "2024-04-30T00:00:00", - "2024-05-01T00:00:00", - "2024-05-02T00:00:00", - "2024-05-03T00:00:00", - "2024-05-06T00:00:00", - "2024-05-07T00:00:00", - "2024-05-08T00:00:00", - "2024-05-09T00:00:00", - "2024-05-10T00:00:00", - "2024-05-13T00:00:00", - "2024-05-14T00:00:00", - "2024-05-15T00:00:00", - "2024-05-16T00:00:00", - "2024-05-17T00:00:00", - "2024-05-20T00:00:00", - "2024-05-21T00:00:00", - "2024-05-22T00:00:00", - "2024-05-23T00:00:00", - "2024-05-24T00:00:00", - "2024-05-27T00:00:00", - "2024-05-28T00:00:00", - "2024-05-29T00:00:00", - "2024-05-30T00:00:00", - "2024-05-31T00:00:00", - "2024-06-03T00:00:00", - "2024-06-04T00:00:00", - "2024-06-05T00:00:00", - "2024-06-06T00:00:00", - "2024-06-07T00:00:00", - "2024-06-10T00:00:00", - "2024-06-11T00:00:00", - "2024-06-12T00:00:00", - "2024-06-13T00:00:00", - "2024-06-14T00:00:00", - "2024-06-17T00:00:00", - "2024-06-18T00:00:00", - "2024-06-19T00:00:00", - "2024-06-20T00:00:00", - "2024-06-21T00:00:00", - "2024-06-24T00:00:00", - "2024-06-25T00:00:00", - "2024-06-26T00:00:00", - "2024-06-27T00:00:00", - "2024-06-28T00:00:00", - "2024-07-01T00:00:00", - "2024-07-02T00:00:00", - "2024-07-03T00:00:00", - "2024-07-04T00:00:00", - "2024-07-05T00:00:00", - "2024-07-08T00:00:00", - "2024-07-09T00:00:00", - "2024-07-10T00:00:00", - "2024-07-11T00:00:00", - "2024-07-12T00:00:00", - "2024-07-15T00:00:00", - "2024-07-16T00:00:00", - "2024-07-17T00:00:00", - "2024-07-18T00:00:00", - "2024-07-19T00:00:00", - "2024-07-22T00:00:00", - "2024-07-23T00:00:00", - "2024-07-24T00:00:00", - "2024-07-25T00:00:00", - "2024-07-26T00:00:00", - "2024-07-29T00:00:00", - "2024-07-30T00:00:00", - "2024-07-31T00:00:00", - "2024-08-01T00:00:00", - "2024-08-02T00:00:00", - "2024-08-05T00:00:00", - "2024-08-06T00:00:00", - "2024-08-07T00:00:00", - "2024-08-08T00:00:00", - "2024-08-09T00:00:00", - "2024-08-12T00:00:00", - "2024-08-13T00:00:00", - "2024-08-14T00:00:00", - "2024-08-15T00:00:00", - "2024-08-16T00:00:00", - "2024-08-19T00:00:00", - "2024-08-20T00:00:00", - "2024-08-21T00:00:00", - "2024-08-22T00:00:00", - "2024-08-23T00:00:00", - "2024-08-26T00:00:00", - "2024-08-27T00:00:00", - "2024-08-28T00:00:00", - "2024-08-29T00:00:00", - "2024-08-30T00:00:00", - "2024-09-02T00:00:00", - "2024-09-03T00:00:00", - "2024-09-04T00:00:00", - "2024-09-05T00:00:00", - "2024-09-06T00:00:00", - "2024-09-09T00:00:00", - "2024-09-10T00:00:00", - "2024-09-11T00:00:00", - "2024-09-12T00:00:00", - "2024-09-13T00:00:00", - "2024-09-16T00:00:00", - "2024-09-17T00:00:00", - "2024-09-18T00:00:00", - "2024-09-19T00:00:00", - "2024-09-20T00:00:00", - "2024-09-23T00:00:00", - "2024-09-24T00:00:00", - "2024-09-25T00:00:00", - "2024-09-26T00:00:00", - "2024-09-27T00:00:00", - "2024-09-30T00:00:00", - "2024-10-01T00:00:00", - "2024-10-02T00:00:00", - "2024-10-03T00:00:00", - "2024-10-04T00:00:00", - "2024-10-07T00:00:00", - "2024-10-08T00:00:00", - "2024-10-09T00:00:00", - "2024-10-10T00:00:00", - "2024-10-11T00:00:00", - "2024-10-14T00:00:00", - "2024-10-15T00:00:00", - "2024-10-16T00:00:00", - "2024-10-17T00:00:00", - "2024-10-18T00:00:00", - "2024-10-21T00:00:00", - "2024-10-22T00:00:00", - "2024-10-23T00:00:00", - "2024-10-24T00:00:00", - "2024-10-25T00:00:00", - "2024-10-28T00:00:00", - "2024-10-29T00:00:00", - "2024-10-30T00:00:00", - "2024-10-31T00:00:00", - "2024-11-01T00:00:00", - "2024-11-04T00:00:00", - "2024-11-05T00:00:00", - "2024-11-06T00:00:00", - "2024-11-07T00:00:00", - "2024-11-08T00:00:00", - "2024-11-11T00:00:00", - "2024-11-12T00:00:00", - "2024-11-13T00:00:00", - "2024-11-14T00:00:00", - "2024-11-15T00:00:00", - "2024-11-18T00:00:00", - "2024-11-19T00:00:00", - "2024-11-20T00:00:00", - "2024-11-21T00:00:00", - "2024-11-22T00:00:00", - "2024-11-25T00:00:00", - "2024-11-26T00:00:00", - "2024-11-27T00:00:00", - "2024-11-28T00:00:00", - "2024-11-29T00:00:00", - "2024-12-02T00:00:00", - "2024-12-03T00:00:00", - "2024-12-04T00:00:00", - "2024-12-05T00:00:00", - "2024-12-06T00:00:00", - "2024-12-09T00:00:00", - "2024-12-10T00:00:00", - "2024-12-11T00:00:00", - "2024-12-12T00:00:00", - "2024-12-13T00:00:00", - "2024-12-16T00:00:00", - "2024-12-17T00:00:00", - "2024-12-18T00:00:00", - "2024-12-19T00:00:00", - "2024-12-20T00:00:00", - "2024-12-23T00:00:00", - "2024-12-24T00:00:00", - "2024-12-25T00:00:00", - "2024-12-26T00:00:00", - "2024-12-27T00:00:00", - "2024-12-30T00:00:00", - "2024-12-31T00:00:00" - ], - "xaxis": "x3", - "y": [ - 0, - 0, - 0, - -0.009286772834273593, - 0, - 0, - 0, - -0.014491069412236435, - 0, - -0.005763022819414099, - -0.01152604563882964, - 0, - 0, - -0.017092064542266416, - -0.011394709694842686, - 0, - -0.05401353044877932, - 0, - 0, - -0.021911590809575943, - 0, - -0.007950330560971053, - -0.03580551545624533, - -0.007950330560969499, - -0.002885751489101307, - -0.00035346195316654505, - -0.00035346195316654505, - -0.04846696313591958, - -0.07125756895932644, - 0, - -0.034187257427026774, - -0.03190810693189239, - -0.034187257427026774, - -0.05242046138810874, - -0.03646640792216249, - 0, - 0, - 0, - 0, - 0, - 0, - -0.2408214110724367, - -0.20232739138059752, - -0.2180705684067824, - -0.2318458483046949, - -0.22987795117642107, - -0.22594215691987607, - -0.22397425979160224, - -0.2180705684067824, - -0.210630615500203, - -0.19528101789967145, - -0.18760621909940634, - -0.3602891921053817, - -0.21638671460040138, - -0.21653469244761214, - -0.21694322251537979, - -0.21694322251537979, - -0.20966200314076733, - -0.2220798971125315, - -0.24274281695940025, - -0.22896753706148731, - -0.29612202656381126, - -0.16009113757192406, - -0.21865651228675265, - -0.20212617640925767, - -0.21314640032758703, - -0.22692168022549974, - -0.22141156826633512, - -0.23243179218466536, - -0.23243179218466536, - -0.2710025758988205, - -0.2544722400213256, - -0.24482954409278646, - -0.2572272960009083, - -0.2393194321336214, - -0.308195831623185, - -0.21590145630717028, - -0.23656437615403925, - -0.23931943213362172, - -0.229676736205083, - -0.21865651228675265, - -0.1993711204296753, - -0.20488123238884004, - -0.20763628836842318, - -0.21039134434800477, - -0.20901381635821403, - -0.20488123238883915, - -0.20074864841946538, - -0.18697336852155277, - -0.18835089651134573, - -0.19799359243988368, - -0.1814632565623887, - -0.1814632565623887, - -0.27651268785798566, - -0.13187224892990357, - -0.13324977691969508, - -0.13324977691969508, - -0.15666775274614575, - -0.1713011156455594, - 0, - -0.011778409471320361, - 0, - -0.0026579733675676787, - 0, - 0, - 0, - 0, - -0.014675643111334291, - -0.0283046543861879, - 0, - -0.3198612189968798, - 0, - -0.5472166828106393, - -0.5472166828106393, - -0.6013370140776255, - -0.6374172349222831, - -0.5832969036552969, - -0.5652567932329681, - -0.5652567932329673, - -0.6374172349222831, - -0.5712701633737443, - -0.5652567932329681, - -0.5772835335145206, - -0.5592434230921919, - -0.5592434230921919, - -0.5712701633737443, - -0.6374172349222831, - -0.5592434230921925, - -0.5532300529514149, - -0.5592434230921911, - -0.5652567932329681, - -0.5592434230921925, - -0.5652567932329681, - -0.589310273796073, - -0.5772835335145206, - -0.5832969036552969, - -0.5712701633737443, - -0.5712701633737443, - -0.6374172349222831, - -0.589310273796073, - -0.5832969036552969, - -0.589310273796073, - -0.5953236439368493, - -0.571270163373744, - -0.589310273796073, - -0.5953236439368493, - -0.6013370140776255, - -0.6013370140776255, - -0.6013370140776255, - -0.6013370140776255, - -0.6013370140776255, - -0.6374172349222831, - -0.5832969036552969, - -0.5772835335145206, - -0.5532300529514156, - -0.5649569776221581, - -0.5649569776221581, - -0.5879414146046809, - -0.5707030868677889, - -0.6339102885697259, - -0.5477186498852662, - -0.5649569776221581, - -0.5649569776221581, - -0.5477186498852662, - -0.5741149266076606, - -0.5793265140630001, - -0.5793265140630001, - -0.5845381015183395, - -0.5949612764290183, - -0.5949612764290183, - -0.5949612764290183, - -0.5949612764290183, - -0.5845381015183395, - -0.5636917516969815, - -0.5793265140630001, - -0.5741149266076606, - -0.6262308011610548, - -0.5845381015183395, - -0.6262308011610548, - -0.5793265140630001, - -0.5845381015183395, - -0.5845381015183395, - -0.6262308011610548, - -0.6105960387950369, - -0.5689033391523213, - -0.5689033391523215, - -0.5741149266076606, - -0.5689033391523213, - -0.5791358299669811, - -0.5639019589436809, - -0.5740578729592145, - -0.5639019589436809, - -0.5334342168970815, - -0.557292812722663, - -0.5526157470576147, - -0.5526157470576147, - -0.5760010753828557, - -0.557292812722663, - -0.557292812722663, - -0.5292304187323738, - -0.5526157470576147, - -0.533907484397422, - -0.5432616157275183, - -0.543261615727519, - -0.5526157470576147, - -0.5432616157275183, - -0.5619698783877112, - -0.5479386813925666, - -0.365533120455687, - -0.36085605479063876, - -0.5526157470576147, - -0.5666469440527594, - -0.5432616157275183, - -0.543261615727519, - -0.5292304187323743, - -0.533907484397422, - -0.5385845500624706, - -0.533907484397422, - -0.5432616157275183, - -0.5245533530673256, - -0.44504323676150626, - -0.5545413075736765, - -0.5148530646445532, - -0.359708115012526, - -0.5013629015417524, - -0.5302270782174785, - -0.5173985552504893, - -0.5109842937669944, - -0.5206056859922366, - -0.5206056859922366, - -0.5077771630252471, - -0.5077771630252471, - -0.5077771630252471, - -0.5558841241514572, - -0.4757058556077738, - -0.4917415093165104, - -0.5109842937669946, - -0.4372202867068058, - -0.5077771630252471, - -0.5077771630252471, - -0.5558841241514572, - -0.5173985552504892, - -0.5206056859922364, - -0.5238128167339837, - -0.5173985552504892, - -0.5558841241514572, - -0.5141914245087416, - -0.5096921029418564, - -0.5096921029418564, - -0.5103468921349632, - -0.5037990002038957, - -0.5103437345750403, - -0.49476625397502794 - ], - "yaxis": "y3" - }, - { - "histnorm": "percent", - "marker": { - "color": "purple" - }, - "showlegend": false, - "type": "histogram", - "xaxis": "x4", - "y": [ - null, - 0.059929328062044984, - 0.02083084743818553, - 0.04955688892853227, - 0.0529481897154922, - -0.00035346195316654505, - 0.07346236269229389, - 0.044836703326366134, - 0.912837201692924, - -0.22987795117642107, - 0.0449239615066197, - -0.026918968108804453, - -0.015355610080705295, - 0.020519417137903284, - -0.07352851355743995, - -0.051019735454102655, - 0.12942870747153634, - 0.012341173990916499, - 0.013932258421496035, - 0.08072730455752075, - 0.23174932106833923, - 0.4714645859678295, - 0.01883457375465114, - -0.16598405809704708, - 0.1824330274892152, - 0, - 0.01402601271723114, - -0.04149601452426144, - -0.028861653265959353, - -0.01485970220567534, - 0.09125511457075963, - 0.03962442068986949, - -0.06988540245958763, - -0.03716602754555276, - 0.05146754768918882, - -0.024474149393530542, - 0.037632241183021664, - -0.011956793626648365, - 0.05034046773106926, - 0.020908494808602462, - -0.020480282919501436, - 0.04181698961720515, - 0.19065795879822134, - -0.1534963570114457, - 0.04778886596325438, - 0.03257803682432381, - -0.1262007738398817, - 0.1172782302547637, - 0.01820380497536167 - ], - "yaxis": "y4" - }, - { - "histnorm": "percent", - "marker": { - "color": "purple" - }, - "showlegend": false, - "type": "histogram", - "xaxis": "x5", - "y": [ - null, - 0.17623885793232152, - 0.5687211552471374, - -0.025057127660254253, - 0.39844011134383717, - 0.4784423431331173, - 6.661338147750939e-16, - -0.01879120602534401, - 0.01238867584851766, - 0.5007427710915822, - -0.22987170470101548, - 0.026432965057422653 - ], - "yaxis": "y5" - } - ], - "layout": { - "annotations": [ - { - "font": { - "size": 16 - }, - "showarrow": false, - "text": "EQUITY CURVE", - "x": 0.5, - "xanchor": "center", - "xref": "paper", - "y": 0.9999999999999999, - "yanchor": "bottom", - "yref": "paper" - }, - { - "font": { - "size": 16 - }, - "showarrow": false, - "text": "TRADES", - "x": 0.5, - "xanchor": "center", - "xref": "paper", - "y": 0.5576923076923076, - "yanchor": "bottom", - "yref": "paper" - }, - { - "font": { - "size": 16 - }, - "showarrow": false, - "text": "PORTFOLIO DRAWDOWN", - "x": 0.5, - "xanchor": "center", - "xref": "paper", - "y": 0.3769230769230769, - "yanchor": "bottom", - "yref": "paper" - }, - { - "font": { - "size": 16 - }, - "showarrow": false, - "text": "WEEKLY PORTFOLIO RTRNS", - "x": 0.2375, - "xanchor": "center", - "xref": "paper", - "y": 0.13076923076923078, - "yanchor": "bottom", - "yref": "paper" - }, - { - "font": { - "size": 16 - }, - "showarrow": false, - "text": "MONTHLY PORTFOLIO RTRNS", - "x": 0.7625, - "xanchor": "center", - "xref": "paper", - "y": 0.13076923076923078, - "yanchor": "bottom", - "yref": "paper" - } - ], - "height": 1050, - "hovermode": "x unified", - "margin": { - "b": 20, - "l": 15, - "r": 15, - "t": 50 - }, - "paper_bgcolor": "WHITE", - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "heatmapgl": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmapgl" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "width": 1200, - "xaxis": { - "anchor": "y", - "domain": [ - 0, - 1 - ] - }, - "xaxis2": { - "anchor": "y2", - "domain": [ - 0, - 1 - ] - }, - "xaxis3": { - "anchor": "y3", - "domain": [ - 0, - 1 - ] - }, - "xaxis4": { - "anchor": "y4", - "domain": [ - 0, - 0.475 - ] - }, - "xaxis5": { - "anchor": "y5", - "domain": [ - 0.525, - 1 - ] - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0.6076923076923076, - 0.9999999999999999 - ] - }, - "yaxis2": { - "anchor": "x2", - "domain": [ - 0.42692307692307685, - 0.5576923076923076 - ] - }, - "yaxis3": { - "anchor": "x3", - "domain": [ - 0.1807692307692308, - 0.3769230769230769 - ] - }, - "yaxis4": { - "anchor": "x4", - "domain": [ - 0, - 0.13076923076923078 - ] - }, - "yaxis5": { - "anchor": "x5", - "domain": [ - 0, - 0.13076923076923078 - ] - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2025-06-06 11:57:40 trade.asset.Stock ERROR: Error getting previous close for SPY from yfinance: 'prev_close'\n" - ] - } - ], - "source": [ - "pm.plot_portfolio()\n", - "# Check if the jump is real\n", - "# Why is NVDA trades saying None?" - ] - }, - { - "cell_type": "code", - "execution_count": 407, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 407, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkIAAAHFCAYAAAAe+pb9AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAACOK0lEQVR4nO3deXhTZdoG8PtNuu8bpS2lLaUUZCui7CiIiIiMiKDgMi4IyuD2jSvD4IygKLiOjI4yWlRckIooiIC4MYqgssgmS2kLtFCgFEj3Lc37/XFyTpI2hbZkacz9uy4umpM35zxJm/bJ825CSilBRERE5IV07g6AiIiIyF2YCBEREZHXYiJEREREXouJEBEREXktJkJERETktZgIERERkddiIkRERERei4kQEREReS0mQkREROS1mAgRERGR1/JxdwCe4OzZszAajS65Vrt27XDq1CmXXKu1PCFGwHPiBDwrVlVbj7mtx2ePJ8XsCbF6Qoz2eELcbT1GHx8fREZGNq+tk2P5QzAajairq3P6dYQQ2vXa6hZwnhAj4DlxAp4Vq6qtx9zW47PHk2L2hFg9IUZ7PCFuT4ixJdg1RkRERF6LiRARERF5LSZCRERE5LWYCBEREZHXYiJEREREXouJEBEREXktJkJERETktZgIERERkddiIkRERERei4kQEREReS0mQkREROS1mAgRERGR12IiRERuJ48ehiwvdXcYROSFmAgRkVvJ00UwzX0Ipv886+5QiMgLMREiIvc6exqQUvmfiMjFmAgRkXtJafs/EZELMREiIveSJuV/k8m9cRCRV2IiRETupVWEmAgRkesxESIi91IrQewaIyI3YCJERO7FrjEiciMmQkTkXiYOliYi92EiRETuxVljRORGTISIyL3YNUZEbsREiIjci7PGiMiNmAgRkXtJzhojIvdhIkRE7mViRYiI3IeJEBG5l1oJMrEiRESux0SIiNyLXWNE5EZMhIjIraRWEWLXGBG5HhMhInIvbYsNJkJE5HpMhIjIvawSIMnuMSJyMSZCRORe1oOkWRUiIhdjIkRE7mVdBeLMMSJyMSZCRORe1lUgdo0RkYsxESIi97KpCLFrjIhci4kQEbmXTUWIiRARuZZPSx+wd+9erFq1CocOHcLZs2fx6KOPon///nbb/ve//8U333yDO+64A9dee612vLy8HIsXL8a2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Ld66Quh0EFePt9zudxlw5hRE70sdGWqriJj2EONvBwryIK6/zWb/NNGJq/USEbV1TITIaaTJBNO//gHU1EDc+aBy0AE7cQu9HmLMjRd8HkfRXTPB3SEQEVErMREi56mpBiorAABy20/KsQvcDJWIiMiROFianMecBAHQVoYWoRHuiYWIiMgOJkLkPFVWiZCxTvk/PMItoRAREdnDRIicx3pDVZUDxggRERE5ChMhch7ripCKiRAREbUhTITIaaSdilBb20KCiIi8GxMhch61ImS9YCArQkRE1IYwESLnUStCndItx5gIERFRG8J1hMh5zNPnRad0yLBIZRsKriNERERtCBMhch61aywwGPr7prk3FiIiIjvYNUbOo3aNBQadux0REZGbMBEip5FMhIiIqI1zeNfYZ599hl9//RXHjh2Dn58f0tPTcdtttyEhIUFrU1tbiyVLlmDTpk2oq6tDRkYGpk6dioiICK1NcXEx3nrrLfz+++8ICAjAsGHDcMstt0Cv12ttfv/9dyxZsgQFBQWIjo7GhAkTMHz4cJt41q1bhy+++AIGgwHJycmYMmUK0tLSHP20yR5z15gICnZzIERERPY5vCK0d+9eXH311Zg3bx5mz56N+vp6PPPMM6iurtbavPfee9i2bRsefvhhzJkzB2fPnsVLL72k3W8ymfDcc8/BaDTimWeewX333YcNGzZg2bJlWpuioiLMnz8fPXr0wPPPP49rr70Wb775Jnbs2KG12bRpE5YsWYKJEydiwYIFSE5Oxrx581BSUuLop032sCJERERtnMMTob///e8YPnw4OnbsiJSUFNx3330oLi5GXl4eAKCyshLfffcd7rjjDvTs2ROpqamYMWMGDhw4gOzsbADAzp07cfToUTzwwANISUnBxRdfjEmTJuGrr76C0WgEAKxfvx6xsbG4/fbbkZiYiNGjR2PgwIH48ssvtVhWr16NK6+8EldccQUSExMxbdo0+Pn54fvvv3f00yZ7tMHSIe6Ng4iIqAlOHyNUWalUBUJClD+GeXl5qK+vR69evbQ2HTp0QExMjJYIZWdnIykpyaarrE+fPqiqqkJBQQEA4ODBgzbnAICMjAztHEajEXl5eTZtdDodevXqpbUhJ1N3n2dFiIiI2iinTp83mUx499130bVrVyQlJQEADAYDfHx8EBxsO24kPDwcBoNBa2Od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Fnbu3InS0lJERkaiX79+mDhxIkJDQ8/7+N9//x1z5szBO++8g+DgYKfFqf4+uOWWW3D99ddrx3/99Ve8+OKLyMrKctq1W8L675Rer0dISAiSkpIwZMgQDB8+HDrdH7duwkTIRfr06YMZM2bYHAsLC3NTNI1FR0dj06ZNuPPOO+Hn5wcAqK2txU8//YSYmJgLOrfRaHT4njTfffcdrrnmGnz33Xc4c+YMoqKiWn0uk8kEAA59ozvz9STP4sifVWd76aWXYDQacd9996F9+/YoKSnB7t27UV5e7u7QbJw8eRKzZ89GfHw8HnroIcTGxqKgoAAffPABduzYgXnz5iEkJMTdYWp8fX2xcuVKjBw5sk3F1ZD6d8pkMsFgMGDHjh1499138csvv+Dxxx+HXq93d4hOwUTIRXx8fBAREdHo+JYtW7B8+XIcPXoUkZGRGDZsGG644QabHziDwYBnn30Wv//+OyIjI3Hbbbdh4MCBDo2vU6dOOHnyJH755RdcdtllAJRPLDExMWjXrp3WbseOHfj0009RUFAAnU6H9PR03HnnnVplq6ioCPfffz/+7//+D1999RVycnIwbdo0DB8+3GGxVldXY9OmTZg/fz4MBgM2bNiAG264AYDlU97MmTPx0Ucf4fjx40hJScG9996LpKQkAMCGDRvw7rvv4v7778eHH36I48ePY+HChYiNjXVYjI56PefMmYPExETcfffd2mNKS0tx7733YtasWejVq5fDYm7KfffdhzFjxuDaa6/Vjj322GPo168fbrrpJgBKl9O9996L7du3Y+fOnYiKisLtt9+OSy+91OnxtSROVzvXz6r6c/juu+9q7e1VCT799FOsXbsWtbW1GDx4MEJDQ7Fjxw688MILDo21oqIC+/btw1NPPYXu3bsDANq1a4e0tDSbNu+//z62bNkCo9GI1NRU3HHHHUhJSQEAZGVlYcuWLRg1ahRWrFiBsrIy9O3bF9OnT0dQUJDDYs3MzISPjw9mz56tfdCIiYlBp06d8MADD2Dp0qWYNm0a6urqsGzZMvz0008oKSlBdHQ0xo8fj549e2LOnDkAgLvuugsAnFql7dWrF06ePInPP/8ct912m902P//8M7KysnDixAlERkZi9OjR+NOf/gQA+Oijj7Bnzx48++yzNo957LHHMGDAAEycONEhcVr/nYqKikJqairS09Mx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5IiIiP6AOEbIiSorKwFAW+49Ly8P9fX1NgvAdejQATExMcjOzj7nedRzqL7//nucPHkSN954oxMiJyIi8g5MhJzEZDLh3XffRdeuXZGUlARA2RnZx8en0dYP4eHhTXZtHThwAJs3b8bIkSO1Y8ePH8dHH32EBx54QNtniYiIiFqOiZCTZGZmoqCgAP/3f//X6nPk5+fj+eefx8SJE5GRkQFASbAWLlyIG2+80WYQNhEREbUcxwg5QWZmJrZv3445c+YgOjpaOx4REQGj0YiKigqbqlBJSYk2a0x19OhRPP300xg5ciQmTJigHa+qqkJubi4OHTqExYsXA1B24JZSYvLkyZg9e7Y2/oiIiIjOjYmQA0kpsXjxYvz666946qmnEBsba3N/amoq9Ho9du/ejYEDBwIACgsLUVxcjPT0dK1dQUEB5s6di2HDhuHmm2+2OUdgYCBefPFFm2Pr16/Hnj178PDDDze6JhERETWNiZADZWZmYuPGjXj88ccRGBiojfsJCgqCn58fgoKCMGLECCxZsgQhISEICgrC4sWLkZ6eriVC+fn5mDt3LjIyMjB27FjtHDqdDmFhYdDpdNqYI1VYWBh8fX0bHSciIqJzYyLkQOvXrwcAPPXUUzbHZ8yYgeHDhwMA7rjjDggh8NJLL8FoNGoLKqp+/vlnlJaW4scff8SPP/6oHW/Xrh1ef/11pz8HIiIib8Ld54mIiMhrcdYYEREReS0mQkREROS1mAgRERGR12IiRERERF6LiRARERF5LSZCRERE5LWYCBEREZHXYiJERG1CVlYWbrrpJneHYaMtxkREjsVEiIg82ldffYUNGza0+vE1NTXIysrC77//7rigiMhjMBEiIo+2fv36C06Eli9fbjcRmjBhAj744IMLiI6I2jruNUZE1AS9Xg+9Xu/uMIjIibjXGBG53P79+/Hee+8hPz8fUVFRuO6663D27FksX74cWVlZAIDvv/8eP/zwAwoKClBZWYn27dvjmmuuwahRo7Tz3HfffTh16pTNubt3765tfFxRUYFPPvkEv/zyC0pKShAdHY0rr7wS1113HXQ6HYqKinD//fc3im/ixIm46aabkJWVZRMTANx00024+uqr0b17d2RlZaGoqAgpKSm49957kZSUhK+//hqrVq3CmTNn0KVLF8yYMQOxsbE25z948CCysrKQnZ2N+vp6dO7cGTfffDO6devmqJeYiJqJFSEicqn8/Hw888wzCAsLw4033oj6+npkZWUhIiLCpt369evRsWNHXHrppdDr9di2bRvefvttmEwmjB49GgBwxx134J133kFAQADGjx8PANp5ampq8NRTT+HMmTMYOXIkYmJicODAASxduhQGgwF33nknwsLCMHXqVLz99tvo378/+vfvDwBITk4+53PYv38/tm7diquvvhoA8Pnnn2P+/Pm47rrrsH79elx99dUoLy/HqlWr8MYbb+Cf//yn9tg9e/bg2WefRWpqKm688UYIIbBhwwbMnTsXc+fORVpamiNeZiJqJiZCRORSy5Ytg5QSc+fORUxMDABgwIABePTRR23azZkzB35+ftrt0aNHY968efjyyy+1RKh///5YtmwZQkNDcfnll9s8fvXq1Thx4gSef/55xMfHAwCuuuoqREVFYdWqVRg7dixiYmIwcOBAvP3220hKSmp0jqYUFhbilVde0So9ISEh+O9//4sVK1bg1VdfRWBgIADAZDLh888/R1FREWJjYyGlxFtvvYUePXpg1qxZEEJocT388MP4+OOPMXv27Ja+pER0AThYmohcxmQyYefOnejXr5+WBAFAYmIiMjIybNpaJ0GVlZUoLS1F9+7dcfLkSVRWVp73Wj///DMuuugiBAcHo7S0VPvXq1cvmEwm7Nu3r9XPo2fPnjbdXWoVZ8CAAVoSBABdunQBABQVFQEADh8+jOPHj2Po0KEoKyvTYqqurkbPnj2xb98+mEymVsdFRC3HihARuUxpaSlqa2u1Co21hIQE/Pbbb9rt/fv345NPPkF2djZqamps2lZWViIoKOic1zp+/DiOHDmCqVOn2r2/pKSkFc9AYZ3EAdBiiY6Otnu8vLxciwkAXn/99SbPXVlZiZCQkFbHRkQtw0SIiNqcEydO4Omnn0ZCQgJuv/12REdHw8fHB7/99hu+/PLLZlVNpJTo3bs3rrvuOrv3JyQktDo+nc5+Mb2p49YxAcBtt92GlJQUu20CAgJaHRcRtRwTISJymbCwMPj5+WmVEWuFhYXa19u2bUNdXR2eeOIJm+pLSxY9bN++Paqrq9G7d+9ztlPH6bhC+/btASiVovPFRUSuwTFCROQyOp0OGRkZ2LJlC4qLi7XjR48exc6dO23aAZYKCqB0GdlbODEgIAAVFRWNjg8aNAjZ2dnYsWNHo/sqKipQX18PAPD399fO72ypqalo3749vvjiC1RXVze6v7S01OkxEJEtVoSIyKVuuukm7NixA//4xz8watQomEwmrF27Fh07dsSRI0cAABkZGfDx8cGCBQswcuRIVFdX49tvv0VYWBjOnj1rc75OnTrh66+/xqeffoq4uDiEh4ejZ8+euO6667B161YsWLAAw4YNQ2pqKmpqapCfn4+ff/4Zr7/+ulahSkxMxKZNmxAfH4+QkBB07NgRSUlJDn/uOp0O06dPx7PPPouHH34Yw4cPR1RUFM6cOYPff/8dgYGBmDlzpsOvS0RNYyJERC6VnJyMv//971iyZAmysrIQHR2Nm266CWfPntUSoYSEBDz88MNYtmwZ3n//fURERGDUqFEICwvDG2+8YXO+iRMnori4GKtWrUJVVRW6d++Onj17wt/fH3PmzMGKFSvw888/44cffkBgYCASEhJw00032Qy2nj59OhYvXoz33nsPRqMREydOdEoiBAA9evTAvHnzsHz5cnz11Veorq5GREQE0tLScNVVVznlmkTUNK4sTURERF6LY4SIiIjIazERIiIiIq/FRIiIiIi8FhMhIiIi8lpMhIiIiMhrMREiIiIir8VEiIiIiLwWEyEiIiLyWkyEiIiIyGsxESIiIiKvxUSIiIiIvBYTISIiIvJaTISIiIjIa/0/u1tbQLufP88AAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "pm._equity['NVDA'].plot()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "MAD Skip 0.7876447876447876\n", - "Quantile Skip 0.9420849420849421\n" - ] - }, - { - "data": { - "image/png": "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SlVhp09EPeGEEzB06FDMnz/fsoxy165duP/++1FXV4d77rkH11xzDbKzs50eclIQ6bmnKAo2bdqEO++8E52dnbj33ntT0n6R2q26uhpLly7F7NmzsWXLFtxyyy04+eSTAaTebzZS21VVVeGNN97Arbfeii1btuCmm27CD37wAwCpZ7t40KPESE1NDfbu3QvAv42x5wYwatQojB07Fs888wwAXyXDuHHjIKVEZWWlYfujjjoK11xzDfLz81PihIqlDQFg8uTJmDVrFubOndvr3ZXBbKcXG0IIry1nzJiBr776yltlpKqqN4xQVFSEq6++Gvfeey8GDRrkxEdIKNu3b8e6dess37Nz7pWXl+Paa6/FXXfd1avzHWJpt5KSEhx22GG4/vrrcccdd2DIkCEOfILEEUvb9enTB4cddhhmzZqFOXPm9PrrndP0GDGyfPlyXH/99XjiiScA+E4Yz00hLS0NqqqipaUF559/PtauXYulS5d6T7impiZkZWV5E9s826eCAPEQaxsCWp6EvithbyUc27ndbtTX1wPwnVdjx47F0UcfjQULFni9SG+88QY6OzuRk5Nj6NfSW+nq6sK//vUv/Pa3v8Xq1asN79k996SUyM/PxwEHHODsh3GQeNgtIyMDY8aMwbhx45z9MA4TL9sdeOCBKZtfE296jBjZuHEjRo4cidraWnz22WcAYCjle+ONNzBjxgx88803GDduHM477zy8/PLLeOSRR7Bu3Tr85z//QWtrK8aPH5/Ij5FQaEP7hGO7n/zkJ/jmm2/8wn2nnnoqtmzZgjlz5gAApk2bhvT0dGc/QIJ46623cMUVV6CyshLz5s3DeeedZ3jf7rnX2x8i4mW3VIC265kkfZ8RzwX/8ccfhxACHR0dqKqqwh//+Ee4XC60tLTgsccew5o1a3DxxRcbOqm++eab+Oyzz9Dc3AwhBK6++uqUTA6kDe0Tie0uueQSQ+mkqqr43//+h3/9618YPnw4fvazn2HYsGEJ/kTOsWvXLvz2t7/F4Ycfjl/96lcAtJyFnJwc5OTkwOVyob29Hf/85z+xbt06nnvd0G72oe16LkkvRgDNJfuXv/wF559/Pvbv349nn30WJ510Ek477TS0tLSgqqoK/fv39yav6Z9YVVVFbW2toVlNKkIb2idS23lob2/He++9h4yMjKDNz3ornZ2dePXVV/Hu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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiMAAAGkCAYAAADjdyVMAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABlF0lEQVR4nO3dd3hUZdoG8Ps9mXRIIwlJCKH3LoICAlEQWEEUFRTEunYsq7v2srDCp9gL7q4FCyAqoLgISFMQG4qFjiC9JSQBkpBezvv9cTIz50xJmZnMJDn377q8zMycmXnnYcpznrcJKaUEERERUYAogW4AERERmRuTESIiIgooJiNEREQUUExGiIiIKKCYjBAREVFAMRkhIiKigGIyQkRERAHFZISIiIgCiskIERERBZQl0A2oizNnzqCiosKvz5mQkIDs7Gy/PmdTxVh6jzH0HmPoGcbNN8wWR4vFgtjY2JqP80NbfKaiogLl5eV+ez4hhO15uWq+dxhL7zGG3mMMPcO4+Qbj6B67aYiIiCigmIwQERFRQDEZISIiooBiMkJEREQBxWSEiIiIAorJCBEREQUUkxEiIiIKKCYjREREFFBMRoiIiCigmIwQERFRQDEZCRBZXARZWRnoZhAREQUck5EAkPv/gPqP66E+eSdkeVmgm0NERBRQTEYCQH39aaCsDMjOhPxmVaCbQ0REFFBMRgKh8Kz976LCwLWDiIioAbDU5eClS5fi559/xvHjxxESEoLOnTtj6tSpSElJcXufDRs24N///rfhuuDgYHz44YeetZiIiIialDolI7t27cLo0aPRoUMHVFZW4qOPPsLMmTPx0ksvISwszO39wsPD8eqrr3rdWCIiImp66pSMPP7444bL06ZNwy233IIDBw6ge/fubu8nhEBMTIxHDSQiIqKmrU7JiKOioiIAQLNmzao9rqSkBHfddReklGjXrh0mT56M1q1buz2+vLwc5eXltstCCISHh9v+9hfrc9Xncwoh/PqaAsUfsWzqGEPvMYaeYdx8g3F0T0gppSd3VFUVzz33HAoLC/H000+7PW7v3r3IyMhAmzZtUFRUhGXLlmH37t146aWX0KJFC5f3WbRoEZYsWWK73K5dO8yePduTZjZIR8eea/s76trbED3ltgC2hoiIKLA8TkbefvttbNmyBf/617/cJhWuVFRU4P7778eQIUNwzTXXuDzGXWUkOzsbFRUVnjTXI0IIJCUlITMzEx6GyaWKWy61/a2MnwJl/GSfPXZDVV+xNBPG0HuMoWcYN98wYxwtFgsSEhJqPs6TB587dy5+++03zJgxo06JiLVh7dq1Q2ZmpttjgoODERwc7PK2QPwDSinr7Xnr87EbIrO93vrAGHqPMfQM4+YbjKOzOq0zIqXE3Llz8fPPP+Opp55CYmJinZ9QVVUcOXIEsbGxdb4vERERNT11qozMnTsX3333HR566CGEh4cjNzcXABAREYGQkBAAwJw5cxAXF4cpU6YAAJYsWYJOnTohKSkJhYWFWLZsGbKzszFixAjfvhIiIiJqlOqUjKxZswYAMH36dMP1d911F9LT0wEAOTk5hpHCBQUFePPNN5Gbm4vIyEi0b98eM2fORGpqqnctJyIioiahTsnIokWLajzGMVG58cYbceONN9blaYiIiMhEuDcNERERBRSTESIiIgooJiNEREQUUExGiIiIKKCYjBAREVFAMRkhIiKigGIyQkRERAHFZISIiIgCiskIERERBRSTESIiIgooJiNEREQUUExGiIiIKKCYjBAREVFAMRkhIiKigGIyQkRERAHFZISIiIgCiskIERERBRSTESIiIgooJiNEREQUUExGiIiIKKCYjBAREVFAMRkhIiKigGIyQkRERAHFZISIiIgCiskIERERBRSTESIiIgooJiNEREQUUExGiIiIKKCYjASaEIFuARERUUAxGQk0KQPdAiIiooBiMkJEREQBxWQk0NhNQ0REJsdkJNDYTUNERCbHZISIiIgCislIoLGbhoiITI7JSKCxm4aIiEyOyUigMRkhIiKTYzIScExGiIjI3JiMBBorI0REZHJMRgKNyQgREZkck5FAYzJCREQmx2Qk4JiMEBGRuTEZCTSVyQgREZkbk5GAYzJCRETmxmQk0JiLEBGRyTEZCTSpBroFREREAcVkJNBYGSEiIpOz1OXgpUuX4ueff8bx48cREhKCzp07Y+rUqUhJSan2fj/++CM++eQTZGdnIykpCddeey3OOeccrxredDAbISIic6tTZWTXrl0YPXo0Zs2ahSeeeAKVlZWYOXMmSkpK3N5nz549ePXVV3HRRRdh9uzZGDBgAJ5//nkcOXLE68Y3CVxnhIiITK5Oycjjjz+O9PR0tG7dGm3btsW0adOQk5ODAwcO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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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/OQnP9GFitsEAgF87GMfw5///GccPXo04fM9e/bgoYcewuLFi/G9730P1157LR5//HGsW7cOAHDuuedi165daG1t1b9z4MAB7Nu3D+ecc05ObAaAOXPmYPLkyXoORKrjvmnTJnzve9/DwoULsWLFCnzzm980CNtcMTg4iGXLluH+++/Ht771LTDG8L3vfU9/Whb89re/xYc+9CE88MADaGpqwsMPP4xYLJZz++x499138cgjj+CDH/wgHnzwQXz+85/HunXr8OSTTxqWe/zxx3HmmWfiu9/9Ls455xx8//vfd9z6PBUXXHCBfp4BwIsvvpggLJzu39/85je47LLL8NBDD2H+/Pmu2OfkuvmrX/0Kn/zkJ/Hf//3fqKysxIoVKxCNRvXPh4aG8Ic//AFf+MIX8OCDD6K6utoV22Tc2I9Lly7F+vXrDdfdl19+GWPGjMGcOXNctzld1qxZg0WLFum/8R/84AdpedVJoPiYF198UVfXCxYsQH9/P7Zt2+b4+88++ywuvPBCXHDBBWhubsY111yjPyW4STAYxM0334yXXnoJN9xwA775zW/isccew759+wAA27dvx65du/Dv//7vmD59OpqamvDJT34SZWVleO211/T1RCIR3HrrrZgyZQpOOukkfOYzn8Err7yCzs7OrG1saWkB5xzjx4+3/Hz8+PHo6+vD7t278eqrr+KLX/wizjjjDIwbNw5z587F4sWLEQgE9HBLdXU1ampqXPPuWHHGGWdgypQpljknzzzzDObOnYtrrrkGzc3NWLJkCS699FI8/fTTAICJEydi8uTJWL9+vf6dv//975g5c2bOcxjGjx+P9vZ2R8f9ySefxOLFi7F8+XJMmDABU6ZMwVVXXZVT+wDgrLPOwplnnonGxkZMmTIFX/ziF7F///6Em/iHPvQhnHLKKWhubsby5ctx5MgRg+jLJZs2bcK//Mu/6P8efPBBrFmzBldeeSWWLFmCcePGYd68efjoRz+Kv/3tbwnbt3TpUjQ3N+O6667D9OnT8eyzz7pi13nnnYft27fjyJEjOHLkCLZv365fp+Txnezfyy+/HGeeeSYaGhpQW1vrin1OrpvXXnst5s2bh0mTJuHWW29FV1eXIbE4Fovhs5/9LGbPno3m5mYUFxe7YpuMG/vxjDPOAKB61QQvvfQSlixZAsaY6zany/nnn49zzjkHjY2N+NjHPobBwUHs2rXL8fcpxONTDh8+jF27duErX/kKAFUELF68GC+88AJOPvlkx+u4+OKLDe/NmDEDW7dudd3es846C6eccgq2b9+OnTt3YvPmzXj66afxhS98AYODgxgcHMRnPvMZw3eGh4cNF/v6+npDrHjWrFngnOPw4cOWru5c0N7ejkAgoIeqvOYTn/gE7r33Xj10Izh06FCCq3T27NlYu3YtFEVBIBDQnx6vueYafcKuZcuW5dxmzjkYY9i7d2/K4753714sXbo05zaZaWlpweOPP45du3ahp6dHfyLt6OgwiHj5b3EOdnV12QpdNzn55JNx44036q+Li4vxla98Bdu3bzd4TBRFQSQSwdDQkH4jNYehZs6cqT8wZEtVVRUWLlyIdevWgXOOU045JSE3xun+nTZtmis2CZxeN+X9U1FRgebmZhw6dEh/LxQKYfLkya7aZsaN/VhUVITzzjsPL774IhYvXow9e/Zg//79vkkEl/dhSUkJSktL0dXV5fj7JFAkGGMJrkCv3LkvvPACYrEYbrrpJv09zjnC4TA++9nP+spWQVFREebNm4d58+bhmmuuwf/+7/9i9erVuPjii1FbW4u777474Tu59EDINDY2gjGGgwcP6k8dMocOHUJ5eXlC+MdrTjrpJMyfPx+PPfZY2vH5s88+G7/5zW+wZ88eDA8P4+jRo1i8eHFuDJU4dOgQGhoaMDg4mPK4e7W/V6xYgbFjx+Kmm25CbW0tOOe4/fbbDW5+AIakTfFEmq/m28XFxQnersHBQSxfvhxnnnlmwvL5bIV+4YUXYuXKlQBgyH8QON2/JSUlrtqV6rrplKKiorx4INzYj0uXLsUdd9yBo0ePYt26dZgzZ44hjyUXOL3/mBPlrb6XDBIoElVVVYZwQn9/P9rb2/NuRywWw0svvYRPfvKTmDdvnuGz7373u1i/fj3Gjh2reybEj3zv3r2GZZubm7F7926cf/75+nu7d+/Ouf2CCRMm4I033sC0adPQ2dmJQCCQNNGso6PDkHG/c+dOMMbQ3NyctS2VlZWYN28ennvuOSxbtsxwY+zs7MT69etx3nnnYdKkSeCcY9u2bQn7HojfsMyx9FzyiU98AnfccYdhP4wfPx47duwwLLdjxw40Nzfr1QZ1dXU46aSTsH79egwPD2PevHk5iaXLbN26Ffv378fll1+Ourq6lMd98uTJePvtt3HBBRfk1C6Znp4eHD58GDfddBNOPPFEAGoYshCYNm0aDh8+nDJM99577xl+9++99x6mTp3qmh0LFixANBoFYwwLFiwwfObV/nVy3RSer507d+rVMr29vWhpacmLV8yMG/tx0qRJmD59Op5//nmsX78+wWOZC/J1rySBIjFnzhysW7cOp556KsrLy/H444970s/hn//8J/r6+nDhhRcmeBjOPPNMvPjii/jGN76BoqIirFq1Ch/84Aexa9cuQ8IVAFx66aX4v//7P0ybNg2zZ8/Ghg0bsG/fPowbN85Ve3t6evDggw/iggsuwOTJk1FaWordu3fjD3/4A0477TTMnTsXs2bNwne/+11cf/31aGpqwvHjx7Fp0yacccYZmD59OgD1CfCHP/wh/uVf/gUDAwP4+c9/jkWLFrkW3vnMZz6Du+66C/fddx8++tGPoqGhAQcPHsSvfvUrjBkzBh/72MdQUVGB888/Hz/+8Y/x6U9/GlOmTMGRI0fQ1dWFxYsXY+zYsWCM4Z///CdOOeUUFBUVuf4UaGbSpEk499xz8ec//1l/b9myZfja176GNWvWYPHixdi5cyeeffZZfO5znzN895xzzsHq1asRjUbxqU99ylW7otEoOjs7DWXGv//973HKKafg/PPPB2Ms5XG/5pprcO+996KxsRGLFy+GoijYtGmTof+L25SXl6OyshJ/+9vfUFtbi46ODvzmN7/J2Xhu8pGPfAQrVqxAfX09zjrrLDDGsG/fPhw4cADXXXedvtyrr76KadOm4YQTTsD69euxa9cufPGLX3TNjkAggIceekj/W8ar/evkuikq4p544glUVlaiuroav/3tb1FZWWnpWc01bu3HCy+8ED/72c9QXFycl+3I171y1AsUzrnuhrryyivR3t6O+++/H2VlZfjoRz/qiQflhRdewNy5cy3DH2eddRaefvppHD16FF/60pfw61//Gs8//zzmzJmDa6+9Fj/5yU/0Zc8991y0tbXhV7/6FSKRCBYtWoQlS5aklaTkhJKSEsycORNr165FW1sbYrEY6urqsHTpUlx99dVgjOFrX/saVq1ahR/96Efo7u5GTU0NTjzxRMMTfWNjI84880z893//N3p7e3Hqqacm3HCzoampCffffz9Wr16Nhx56CL29vaipqcHpp5+Oa6+9Vk+A/dznPodVq1Zh5cqV6OnpQX19vZ64OWbMGFx77bV47LHH8OMf/xjnnXdeXhoqLV++HBs2bNBfT5s2DV/+8pexevVqPPHEE6itrcXy5csTwkBnnXUWfvaznyEQCLh+4dq8eTM+//nPIxgMory8HJMnT8anP/1pnH/++frFKtVxP/nkk/Hv//7veOKJJ/D73/8epaWl+tOi24jfeiAQwG233Yaf//znuP3229Hc3IxPf/rTlqEov7FgwQJ89atfxRNPPIE//OEPCAaDGD9+PC688ELDcuJ8WblyJWpqanDbbbdhwoQJrtpiF571av86uW6KPJyPf/zj+MUvfqGXGX/1q191rQdLurixH8855xz88pe/xNlnn52zsKkX98pRP5vxfffdh8bGxrTik4XMt7/9bdTU1OBLX/qS16YYEH1Q3OzPQhAyo+23TiSSj07QXtDe3o4vfelL+O///m/XE48FXvx+Rm2ZcW9vL/75z39i27ZtOWtm4zVDQ0N45plncODAARw6dAirV6/G22+/bYhNE8RIZzT81onRiQiz/va3v8WsWbNyIk68/P2M2hDPj3/8Y+zevRvLli3D6aef7rU5OYExhjfffBNPPvkkIpEImpubcfvtt1smfxLESGU0/NaJ0cmOHTtwzz33oKmpSW8i6TZe/n5GfYiHIAiCIAj/MWpDPARBEARB+BcSKARBEARB+A4SKARBEARB+I5RmyRLEMTI46mnnsLGjRtx6NAhFBUVYdasWbj++usNXXiHh4fx6KOPYsOGDYhEIpg/fz4+97nP6Q0B9+7di9///vfYsWMHuru70dDQgA984AO47LLL9HWIclUzP/nJT/I2bxRBjHRIoBAEMWLYtm0bLrnkEkyfPh2xWAyrVq3Cd77zHTz44IN6x99f/vKX2LRpE/793/8dZWVlWLlyJf7nf/4H3/72twEAe/bsQXV1Nb70pS+hrq4OO3bswE9+8hMEAgFceumlhvG+//3vGxptmSd7Iwgic0igEAQxYvjGN75heH3LLbfgc5/7HPbs2YOTTjoJ/f39eOGFF3Dbbbdhzpw5AICbb74ZX/7yl7Fz507MmjUroSvruHHjsHPnTrz++usJAqW6unpENfwiCD9BAoUgiBFLf38/AOjTGOzZswexWMzQcGr8+PGor6/XBYrdesQ6ZO68805EIhFMnDgR1157LU444YQcbAVBjE4oSZYgiBGJoij4xS9+gdmzZ2PSpEkA1JmrQ6FQgtejurraMDurzI4dO/Dqq6/ioosu0t+rra3FjTfeiNtvvx2333476urqcM8992DPnj052x6CGG2QB4UgiBHJypUrceDAAdx7770Zr2P//v144IEHcM0112D+/Pn6+83NzYbE29mzZ6OtrQ1r16713TxXBFGokAeFIIgRx8qVK7Fp0yb853/+J+rq6vT3a2pqEI1G0dfXZ1i+q6srofrm4MGD+Pa3v42LLroIH/nIR1KOOWPGDLS2trpiP0EQJFAIghhBcM6xcuVKbNy4Ed/61rfQ0NBg+HzatGkIBoN4++239fcOHz6Mjo4OQ/7JgQMHcM899+D888/Hxz72MUdj7927F7W1te5sCEEQFOIhCGLksHLlSqxfvx533nknSktL9bySsrIyFBUVoaysDBdeeCEeffRRVFRUoKysDD/72c8wa9YsXaDs378f9957L+bPn49ly5bp6wgEAnoZ8dq1a9HQ0ICJEydieHgYL7zwArZu3Yq77rrLi80miBEJTRZIEMSIYfny5Zbv33zzzViyZAmAeKO2V155BdFoNKFR2+rVq7FmzZqEdYwdOxY//OEPAQB/+MMf8Le//Q3Hjh1DcXExJk+ejI985CN66TJBENlDAoUgCIIgCN9BOSgEQRAEQfgOEigEQRAEQfgOEigEQRAEQfgOEigEQRAEQfgOEigEQRAEQfgOEigEQRAEQfgOEigEQRAEQfgOEigEQfie9vZ2LF++HOvWrfPaFIIg8gS1uieIUca6devwox/9SH8dDodRUVGBSZMmYeHChbjgggtQWlqa9np37NiBLVu24PLLL0d5eXlGtq1fvx5dXV24/PLLM/o+QRAjBxIoBDFKWb58ORoaGhCLxdDZ2Ylt27bhl7/8JdauXYs777wTkydPTmt9O3bswJo1a7BkyZKsBMqBAwcSBMrYsWPx61//GqEQXbIIYrRAv3aCGKUsXLgQ06dP119fddVV2Lp1K+6//3488MADeOihh1BUVOShhXEYY76xhSCI/EAChSAInTlz5uAjH/kIVq1ahZdffhkXXXQR9u3bh2eeeQbvvvsujh8/jrKyMixcuBD/8i//gsrKSgDGCfZuvfVWfX2PPPIIGhoaAAAvv/wy1q5di4MHD6KoqAjz58/H9ddfj/r6egDA3XffjW3b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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "filtered\n", - "id\n", - "df = data.copy()\n", - "col = 'Midpoint'\n", - "\n", - "\n", - "def mad_zscore_spike_flag(df, threshold=10, window=10, col ='Midpoint'):\n", - " \"\"\"\n", - " Add a flag to the DataFrame indicating if the change in 'Midpoint' exceeds the threshold.\n", - " \"\"\"\n", - " df = df.copy()\n", - " median = df[col].rolling(window).median()\n", - " mad = lambda x: np.median(np.abs(x - np.median(x))) ## lambda function that calculates median absolute deviation. x is a series, therefore x - median(x)\n", - " rolling_mad = df[col].rolling(window).apply(mad) ## Apply function\n", - " zscore_like = (df[col] - median) / rolling_mad ## Z-score like calculation\n", - " return zscore_like.abs() > threshold\n", - "\n", - "def mad_band_spike_flag(df, threshold=2, window=20, col='Midpoint'): \n", - " \"\"\"\n", - " Add a flag to the DataFrame indicating if the change in 'Midpoint' exceeds the threshold.\n", - " \"\"\"\n", - " df = df.copy()\n", - " median = df[col].rolling(window).median()\n", - " mad = df[col].rolling(window).apply(lambda x: np.median(np.abs(x - np.median(x))))\n", - " return (df[col] - median).abs() > threshold * mad\n", - "\n", - "def quantile_band_spike_flag(df, window=20, upper_quantile=0.90, lower_quantile=0.10, col='Midpoint'):\n", - " \"\"\"\n", - " Add a flag to the DataFrame indicating if the change in 'Midpoint' exceeds the threshold.\n", - " \"\"\"\n", - " df = df.copy()\n", - " quantile = df[col].rolling(window).quantile(upper_quantile)\n", - " quantile_down = df[col].rolling(window).quantile(lower_quantile)\n", - " return (df[col] > quantile) | (df[col] < quantile_down)\n", - "\n", - "## Relative MAD\n", - "flag = mad_band_spike_flag(df, threshold=3, window=20)\n", - "\n", - "## Quantile Spike\n", - "q_flag = quantile_band_spike_flag(df, window=20, upper_quantile=0.95, lower_quantile=0.05, col=col)\n", - "\n", - "## Plotting\n", - "filtered = df.loc[~flag, col]\n", - "filtered_quantile = df.loc[~q_flag, col]\n", - "print(\"MAD Skip\",len(filtered)/ len(df))\n", - "print(\"Quantile Skip\",len(filtered_quantile)/ len(df))\n", - "filtered_quantile.plot(label='Filtered Quantile', linewidth=2)\n", - "plt.show()\n", - "filtered.plot(label='Filtered MAD', linewidth=2)\n", - "plt.show()\n", - "df[col].plot(label='Original', alpha=0.5)" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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EYWXiJYRIiIiCi8GI0RERBQoBiNERCE3e/ZsvPrqq0EXgygtzmmruMbGRqxatQpvv/02mpubccopp2DChAmYOXMmBgwYcNLf37p1K+655x489thj6Nevnw8llmPJkiU4evQo7rzzzqCLEiq1tbX48Y9/jHPOOQc//OEPgy5OKPHYdR/PtcFiMKKwffv24e6778aQIUNw2223oby8HLt27cLvfvc7vPXWW1iwYAH69+8fdDGJLDZs2IAvfOEL2LBhAw4ePIiBAwfmvK54PA4AiETYiEve4bk2eAxGFLZ06VIUFBTg7rvvRmFhIQCgrKwMI0aMwLe+9S2sWLECc+fORVtbG1auXInNmzejqakJgwYNwowZM3D22WfjnnvuAQDceOONAICLL74Yt9xyS2D7pKq33noLf/jDH7Br1y5EIhGMGTMGX/va11BRUQEAaGhowK233oo77rgD69evxz//+U8MGTIEc+fOxZgxYwIuvTpaWlqwZcsW3H///YjFYti0aROuvvpqAN13jj/4wQ+wfPly1NXVYfjw4Zg3bx6GDRsGANi0aRMef/xx3Hrrrfj973+Puro6/PKXv0R5eXmQu6W0W265BVdccQWuvPJKY9n3vvc9TJgwAbNnzw6wZHLwXBs8BiOKOnLkCN5++21ce+21xh9HQmlpKSZPnowtW7Zgzpw5WLx4MWpra3HjjTeisrISDQ0NOHz4MMrKynDHHXfgwQcfxC9+8QsUFRWlrIs6tbS0oKqqCpWVlWhpacHKlSvxwAMPYOHChZa78ieffBJf+cpXUFFRgSeffBKLFi3CL3/5S/Tq1SvA0qtjy5YtOO200zB06FBceOGFePzxxzFjxgxommZ85re//S1uvPFGlJaWYvny5aiursaiRYuMp3u2trbiT3/6E26++WYMGDAAJSUlQe0O5QGea9XAYERRdXV10HUdp512mu3PTzvtNBw9ehQffvghXn75Zdx9990YN24cAODUU081PpdoWiwpKWEeM4PPfOYzlvff+MY3MGfOHOzevdu4aweAL37xi/jUpz4FoLNT4O233476+vq031O+2bhxIy688EIAwDnnnINjx45h27Zt+OQnP2l8ZtasWcaxeuutt+Lmm2/Gq6++ikmTJgEAOjo68PWvfx3Dhw/3vfyUf3iuVQODEeEaGhoQiUTwiU98IuiiiFZXV4eVK1figw8+wOHDh42+Co2NjZZgxPy6tLQUANDU1MRgBMDevXvxwQcf4Lvf/S4AoFevXpg0aRI2bNhgCUbMaa3+/ftj6NCh2LNnj7GsoKAAlZWV/hWcKAs813qLwYiiKioqoGkadu/ejYkTJ6b8fM+ePejXrx+bAl1SXV2NwYMHY968eTjllFOg6zruuOMOtLe3Wz6XSCUAMFIPnMS404YNG9DR0YF58+YZy3RdRzQaxde//vWs11NYWGhJ61BmmqalHIMdHR0BlUYenmvVwGBEUQMGDMC4cePw/PPPo6qqyvKHEIvF8NJLL+Giiy7CsGHDoOs6tm3bZjQdmiUunok7fUp1+PBh7N27F/PmzcNZZ50FAHj//fcDLpUsHR0d+N///V989atfTTkOf/azn+Gll14yWo9qa2tRVlYGoDNfX1dXx5alHiguLkYsFjPeHzt2DA0NDcEVSBiea9XA8XIKu+mmm9DW1oYFCxZg27ZtaGxsxFtvvYV7770XAwcOxHXXXYfy8nJcfPHFePjhh/Hqq6+ioaEBW7duxZYtWwAAgwcPhqZpeP3119Hc3IyWlpaA90o9/fr1w4ABA/DXv/4V9fX1qKmpwRNPPBF0sUR5/fXXcfToUVx66aUYNmyY5b/zzz8fGzduND77hz/8Ae+++y527tyJX//61xgwYIDtHSll5+yzz8YLL7yA9957Dzt37sSSJUs4FNohnmuDx5YRhQ0ZMgT3338/Vq1ahYceeghHjhxBaWkpJkyYgFmzZhkdpubMmYMVK1Zg6dKlRs/uGTNmAAAGDhyIWbNmYfny5Xj44Ydx0UUXcbhZF13X0atXL0QiEdx222147LHHcMcdd2Do0KG48cYbMX/+/KCLKMaGDRswduxYFBUVpfzsM5/5DJ555hn861//AgBcf/31ePzxx42hvd///vct6S86ucSxCwDTp09HQ0MD7r//fhQVFeFLX/oSW0Yc4rk2eHxqL+WtBQsWoKKiwlF/BsodZ6h0D49dChu25VHeOXLkCF5//XVs27YNY8eODbo4RFnjsUthxbZRyjsPP/wwPvzwQ1RVVWHChAlBF4coazx2KayYpiEiIqJAMU1DREREgWIwQkRERIFiMEJERESBYgdWCq01a9bg1VdfxZ49e1BYWIgxY8bgy1/+MoYOHWp85sSJE1i2bBm2bNmCtrY2jB8/HnPmzDGeO/Pxxx/j6aefxvbt29Hc3Izy8nJ87nOfwxVXXGG7zffffx/z58/Hv/3bv+FnP/uZH7tJRCQegxEKrW3btuHyyy/HGWecgY6ODqxYsQL33Xcffv7zn6NPnz4AgCeeeAJvvPEGbr/9dhQVFWHp0qV48MEHce+99wIAduzYgZKSEnzrW9/CoEGDsH37dvzmN79BJBLBtGnTLNs7evQolixZgrFjx1qm5yYioswYjFBo/ehHP7K8v+WWWzBnzhzs2LEDn/jEJ3Ds2DFs2LABt912G84++2wAwDe/+U38x3/8B2prazFmzBhceumllnWceuqpqK2txd///veUYOS///u/ccEFFyASieC1117zdueIiEKEfUYobxw7dgwAjKmdd+zYgY6ODsvkUaeddhrKyspQW1ubcT2JdSRs3LgR+/btw6xZszwoORFRuDEYobwQj8fx+OOP48wzz8SwYcMAdD6Rs6CgIGVq8pKSkrRplu3bt+Pll1/GZZddZiyrq6vD8uXL8a1vfct4XggREWWPwQjlhaVLl2LXrl34zne+k/M6du7ciYULF2LmzJkYP348gM4g55e//CVmzZpl6RhLRETZY58RCr2lS5fijTfewD333INBgwYZy0tLS9He3o6jR49aWkeampqM0TQJu3fvxr333ovLLrsM11xzjbH8+PHj+PDDD/HRRx/h0UcfBdD5RFVd13Httdfi7rvvNvqjEBGRPQYjFFq6ruPRRx/Fq6++ivnz56O8vNzy85EjR6JXr15499138ZnPfAYAsHfvXjQ2NmLMmDHG53bt2oWf/vSnuPjii3HddddZ1tG3b1888MADlmXPP/88ampqcPvtt6dsk4iIUjEYodBaunQpXnrpJdx5553o27ev0Q+kqKgIhYWFKCoqwqWXXoply5ahf//+KCoqwqOPPooxY8YYwcjOnTvx05/+FOPHj0dVVZWxjkgkguLiYkQiEaMPSkJxcTGi0WjKciIissdghELr+eefBwDMnz/fsvyb3/wmpkyZAgC44YYboGkaHnzwQbS3txuTniW88soraG5uxosvvogXX3zRWD548GAsWbLE830gIsoHfGovERERBYqjaYiIiChQDEaIiIgoUAxGiIiIKFAMRoiIiChQDEaIiIgoUAxGiIiIKFAMRoiIiChQDEaISHkNDQ2YPXs2Nm3aFHRRiMgDnIGVKM9s2rQJv/71r4330WgU/fv3x7Bhw3DuuefikksuQd++fR2vd/v27Xj77bdx5ZVXWh486MRLL72EpqYmXHnllTn9PhHJxGCEKE/Nnj0b5eXl6OjoQCwWw7Zt2/DEE09g3bp1uPPOO1FZWelofdu3b8fq1asxZcqUHgUju3btSglGBg8ejN/97ncoKOApiyiM+JdNlKfOPfdcnHHGGcb7GTNmoKamBvfffz8WLlyIhx56CIWFhQGWsJumacqUhYjcx2CEiAxnn302rrnmGqxYsQIvvPACLrvsMvzrX//C2rVr8d577+HQoUMoKirCueeei6985SsYMGAAAGDVqlVYvXo1AODWW2811rd48WKUl5cDAF544QWsW7cOu3fvRmFhIcaPH48vf/nLKCsrA9D5QMNt27YB6Gy1AbofSNjQ0IBbb73V8pDDJUuW4JVXXsFDDz2ERx55BFu3bkVRURFmzJiBadOmYefOnXjsscfwwQcfYMCAAbj++usxefJky/4ePXoUTz31FP7+97+jqakJgwYNwtSpU3HVVVchEmGXOiK/MBghIouLLroIK1aswDvvvIPLLrsM77zzDhoaGjBlyhSUlpZi9+7d+Otf/4rdu3djwYIF0DQN559/Purq6rB582bccMMNRpBSXFwMAPjjH/+IlStX4rOf/SymTp2K5uZm/M///A9+8pOfYOHChejXrx+uvvpqHDt2DAcOHMANN9wAAOjTp0/Gssbjcfznf/4nzjrrLHz5y1/GSy+9hEcffRR9+vTBihUrcOGFF+L888/HX/7yFyxevBhjxowxgqPW1lbMnz8fBw8exGWXXYaysjJs374dK1asQCwWw9e+9jXvKpmILBiMEJHFoEGDUFRUhH379gEALr/8cnzxi1+0fGb06NFYtGgR3n//fZx11lmorKzEiBEjsHnzZkyYMMG44APA/v37sWrVKnzpS1/C1VdfbSyfOHEivv/97+PPf/4zrr76aowbNw4DBw7E0aNHcdFFF2VV1ra2Nlx44YWYMWMGAGDy5MmYN28eHn74Ydx2222YNGkSAGDcuHH4zne+g02bNhmtLmvXrkV9fT0WLlyIIUOGAAA+97nPYeDAgXjmmWdQVVVltNoQkbfYDklEKfr06YPjx48DgKWvxokTJ9Dc3IzRo0cDAD766KOTruvvf/87dF3HpEmT0NzcbPxXWlqKiooKbN26tUdlnTp1qvG6X79+GDp0KHr37o3PfvazxvKhQ4eiX79+aGhoMJa98sorOOuss9CvXz9LucaOHYt4PI733nuvR+UiouyxZYSIUrS0tKCkpAQAcOTIETz11FPYsmULmpqaLJ87duzYSddVX18PXdfx7W9/2/bnPRkhE41GjVRQQlFREQYNGgRN01KWHzlyxHhfV1eHf/3rX5gzZ47tupP3lYi8w2CEiCwOHDiAY8eO4dRTTwUAPPTQQ9i+fTuuuuoqDB8+HH369DH6asTj8ZOuLx6PQ9M0/PCHP7TtFHqyfiGZpOtkmk3nU13XMW7cOFx11VW2Px86dGjO5SIiZxiMEJHFCy+8AAA455xzcOTIEbz77ruYPXs2Zs6caXymrq4u5feSWyISKioqoOs6ysvLlbrAn3rqqWhpacG4ceOCLgpR3mOfESIy1NTU4A9/+APKy8sxefJko4VB13XL59atW5fyu7179waQmrqZOHEiIpEIVq9enbIeXddx+PBh432fPn2ySv244bOf/Sxqa2vx1ltvpfzs6NGj6Ojo8KUcRMSWEaK89eabb2LPnj2Ix+OIxWLYunUr3nnnHZSVleHOO+9EYWEhCgsLcdZZZ+GZZ55BR0cHBg4ciLffftvSETRh5MiRAIAVK1bgggsuQK9evXDeeeehoqIC1157LZYvX479+/djwoQJ6NOnDxoaGvDaa68Z83ok1rFlyxY88cQTOOOMM9CnTx98+tOf9mT/r7rqKvzjH/9AdXU1Lr74YowcORKtra3YuXMnXnnlFSxZsiSlPwoReYPBCFGeWrVqFYDODqSJZ9PccMMNKc+mue222/Doo4/iz3/+s9HP4q677sK8efMs6xs1ahS+9KUv4S9/+Qveeust6LqOxYsXo0+fPpg+fTqGDBmCdevW4amnngIAlJWVYdy4cZZg4/Of/zw+/vhjbNq0CevWrcPgwYM9C0Z69+6Ne+65B3/84x/xyiuv4IUXXkDfvn0xdOhQzJ49G0VFRZ5sl4hSaXpyuykRERGRj9hnhIiIiALFYISIiIgCxWCEiIiIAsVghIiIiALFYISIiIgCxWCEiIiIAsVghIiIiALFYISIiIgCxWCEiIiIAsVghIiIiALFYISIiIgCxWCEiIiIAsVghIiIiAL1/wBidjcwbbUDaQAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "rm.greek_limits\n", - "# (rm.position_data['&L:AMD20250321C175&S:AMD20250321C180'].Delta_skip_day[rm.start_date: rm.end_date] * 1).plot()\n", - "# plt.title('Delta Skip Day') \n", - "# plt.show()\n", - "\n", - "# (rm.position_data['&L:AMD20250321C175&S:AMD20250321C180'].Delta[rm.start_date: rm.end_date] * 1).plot()\n", - "# plt.title('Delta')\n", - "# plt.show()\n", - "\n", - "# (rm.position_data['&L:AMD20250321C175&S:AMD20250321C180'].Midpoint[rm.start_date: rm.end_date] * 1).plot()\n", - "# plt.title('Midpoint')\n", - "# plt.show()\n", - "\n", - "\n", - "# rm.spot_timeseries['NFLX'][rm.start_date:rm.end_date].plot()\n", - "rm.data_managers\n", - "# del rm.position_data['&L:NVDA20241220C585&S:NVDA20241220C590']\n", - "# del rm.processed_option_data['NVDA20241220C58.5']\n", - "# del rm.processed_option_data['NVDA20241220C59']\n", - "(rm.position_data['&L:NVDA20241220C585&S:NVDA20241220C590'].Midpoint_skip_day * 1).plot()" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Calculate Greeks Dates Start: 2017-01-01, End: 2025-06-01, Position ID: &L:NVDA20241220C585&S:NVDA20241220C590, Date: \n", - "Position Data for &L:NVDA20241220C585&S:NVDA20241220C590 already available, skipping calculation\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
VegaVannaVolgaDeltaGammaThetaRhoMidpointSRYS0_closes0_closesryDelta_skip_dayGamma_skip_dayVega_skip_dayTheta_skip_dayMidpoint_skip_day
Datetime
2023-07-18NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN47.493999474.9399950.052330.000337FalseFalseFalseFalseFalse
2023-07-19NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN47.077000470.7699970.052480.000340FalseFalseFalseFalseFalse
2023-07-20NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN45.520000455.2000050.052450.000351FalseFalseFalseFalseFalse
2023-07-21NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN44.308998443.0899810.052430.000361FalseFalseFalseFalseFalse
2023-07-24NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN44.612000446.1199950.052480.000359FalseFalseFalseFalseFalse
..................................................................
2024-12-16-0.001089-0.20839211.3193870.002895-0.0001630.035257-0.0000074.500.00.00.00.0132.000000132.0000000.042180.000258FalseFalseFalseFalseFalse
2024-12-17-0.001211-0.1650137.2267780.003963-0.0002020.0605260.0000084.250.00.00.00.0130.389999130.3899990.042280.000261FalseFalseFalseFalseFalse
2024-12-18-0.001211-0.1650137.2267780.003963-0.0002020.0605260.0000084.000.00.00.00.0128.910004128.9100040.042400.000264FalseFalseFalseFalseFalse
2024-12-190.000207-0.34174516.4887430.001354-0.0000760.0277600.0031704.250.00.00.00.0130.679993130.6799930.042320.000260FalseFalseFalseFalseFalse
2024-12-200.000207-0.34174516.4887430.001354-0.0000760.0277600.0031705.000.00.00.00.0134.699997134.6999970.042200.000252FalseFalseFalseFalseFalse
\n", - "

374 rows × 21 columns

\n", - "
" - ], - "text/plain": [ - " Vega Vanna Volga Delta Gamma Theta \\\n", - "Datetime \n", - "2023-07-18 NaN NaN NaN NaN NaN NaN \n", - "2023-07-19 NaN NaN NaN NaN NaN NaN \n", - "2023-07-20 NaN NaN NaN NaN NaN NaN \n", - "2023-07-21 NaN NaN NaN NaN NaN NaN \n", - "2023-07-24 NaN NaN NaN NaN NaN NaN \n", - "... ... ... ... ... ... ... \n", - "2024-12-16 -0.001089 -0.208392 11.319387 0.002895 -0.000163 0.035257 \n", - "2024-12-17 -0.001211 -0.165013 7.226778 0.003963 -0.000202 0.060526 \n", - "2024-12-18 -0.001211 -0.165013 7.226778 0.003963 -0.000202 0.060526 \n", - "2024-12-19 0.000207 -0.341745 16.488743 0.001354 -0.000076 0.027760 \n", - "2024-12-20 0.000207 -0.341745 16.488743 0.001354 -0.000076 0.027760 \n", - "\n", - " Rho Midpoint S R Y S0_close s0_close \\\n", - "Datetime \n", - "2023-07-18 NaN NaN NaN NaN NaN NaN 47.493999 \n", - "2023-07-19 NaN NaN NaN NaN NaN NaN 47.077000 \n", - "2023-07-20 NaN NaN NaN NaN NaN NaN 45.520000 \n", - "2023-07-21 NaN NaN NaN NaN NaN NaN 44.308998 \n", - "2023-07-24 NaN NaN NaN NaN NaN NaN 44.612000 \n", - "... ... ... ... ... ... ... ... \n", - "2024-12-16 -0.000007 4.50 0.0 0.0 0.0 0.0 132.000000 \n", - "2024-12-17 0.000008 4.25 0.0 0.0 0.0 0.0 130.389999 \n", - "2024-12-18 0.000008 4.00 0.0 0.0 0.0 0.0 128.910004 \n", - "2024-12-19 0.003170 4.25 0.0 0.0 0.0 0.0 130.679993 \n", - "2024-12-20 0.003170 5.00 0.0 0.0 0.0 0.0 134.699997 \n", - "\n", - " s r y Delta_skip_day Gamma_skip_day \\\n", - "Datetime \n", - "2023-07-18 474.939995 0.05233 0.000337 False False \n", - "2023-07-19 470.769997 0.05248 0.000340 False False \n", - "2023-07-20 455.200005 0.05245 0.000351 False False \n", - "2023-07-21 443.089981 0.05243 0.000361 False False \n", - "2023-07-24 446.119995 0.05248 0.000359 False False \n", - "... ... ... ... ... ... \n", - "2024-12-16 132.000000 0.04218 0.000258 False False \n", - "2024-12-17 130.389999 0.04228 0.000261 False False \n", - "2024-12-18 128.910004 0.04240 0.000264 False False \n", - "2024-12-19 130.679993 0.04232 0.000260 False False \n", - "2024-12-20 134.699997 0.04220 0.000252 False False \n", - "\n", - " Vega_skip_day Theta_skip_day Midpoint_skip_day \n", - "Datetime \n", - "2023-07-18 False False False \n", - "2023-07-19 False False False \n", - "2023-07-20 False False False \n", - "2023-07-21 False False False \n", - "2023-07-24 False False False \n", - "... ... ... ... \n", - "2024-12-16 False False False \n", - "2024-12-17 False False False \n", - "2024-12-18 False False False \n", - "2024-12-19 False False False \n", - "2024-12-20 False False False \n", - "\n", - "[374 rows x 21 columns]" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rm.calculate_position_greeks('&L:NVDA20241220C585&S:NVDA20241220C590', '')" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "http://127.0.0.1:25510/v2/hist/option/eod?end_date=20250601&root=NVDA&use_csv=true&exp=20241220&right=C&start_date=20170101&strike=585000\n", - "http://127.0.0.1:25510/v2/hist/option/eod?end_date=20250601&root=NVDA&use_csv=true&exp=20241220&right=C&start_date=20170101&strike=590000\n" - ] - } - ], - "source": [ - "long_pre_split = retrieve_eod_ohlc(\n", - " 'NVDA',\n", - " start_date=rm.start_date,\n", - " end_date=rm.end_date,\n", - " strike = 585.0,\n", - " right = 'C',\n", - " exp = '2024-12-20',\n", - " print_url = True\n", - ") \n", - "\n", - "short_pre_split = retrieve_eod_ohlc(\n", - " 'NVDA',\n", - " start_date=rm.start_date,\n", - " end_date=rm.end_date,\n", - " strike = 590.0,\n", - " right = 'C',\n", - " exp = '2024-12-20',\n", - " print_url = True\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "http://127.0.0.1:25510/v2/hist/option/eod?end_date=20250601&root=NVDA&use_csv=true&exp=20241220&right=C&start_date=20170101&strike=58500\n", - "http://127.0.0.1:25510/v2/hist/option/eod?end_date=20250601&root=NVDA&use_csv=true&exp=20241220&right=C&start_date=20170101&strike=59000\n" - ] - } - ], - "source": [ - "long_post_split = retrieve_eod_ohlc(\n", - " 'NVDA',\n", - " start_date=rm.start_date,\n", - " end_date=rm.end_date,\n", - " strike = 58.50,\n", - " right = 'C',\n", - " exp = '2024-12-20',\n", - " print_url = True\n", - ") \n", - "short_post_split = retrieve_eod_ohlc(\n", - " 'NVDA',\n", - " start_date=rm.start_date,\n", - " end_date=rm.end_date,\n", - " strike = 59.00,\n", - " right = 'C',\n", - " exp = '2024-12-20',\n", - " print_url = True\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
OpenHighLowCloseVolumeBid_sizeCloseBidAsk_sizeCloseAskMidpointWeighted_midpoint
Datetime
2024-06-04 16:00:000.000.000.000.00017601.9516605.35603.650603.598485
2024-06-05 16:00:000.000.000.000.00030660.3516664.50662.425661.793478
2024-06-06 16:00:00648.61648.61648.61648.61130646.2530651.95649.100649.100000
2024-06-07 16:00:000.000.000.000.00027644.4030650.35647.375647.531579
2024-06-10 16:00:000.000.000.000.00000.0000.000.000NaN
\n", - "
" - ], - "text/plain": [ - " Open High Low Close Volume Bid_size \\\n", - "Datetime \n", - "2024-06-04 16:00:00 0.00 0.00 0.00 0.00 0 17 \n", - "2024-06-05 16:00:00 0.00 0.00 0.00 0.00 0 30 \n", - "2024-06-06 16:00:00 648.61 648.61 648.61 648.61 1 30 \n", - "2024-06-07 16:00:00 0.00 0.00 0.00 0.00 0 27 \n", - "2024-06-10 16:00:00 0.00 0.00 0.00 0.00 0 0 \n", - "\n", - " CloseBid Ask_size CloseAsk Midpoint Weighted_midpoint \n", - "Datetime \n", - "2024-06-04 16:00:00 601.95 16 605.35 603.650 603.598485 \n", - "2024-06-05 16:00:00 660.35 16 664.50 662.425 661.793478 \n", - "2024-06-06 16:00:00 646.25 30 651.95 649.100 649.100000 \n", - "2024-06-07 16:00:00 644.40 30 650.35 647.375 647.531579 \n", - "2024-06-10 16:00:00 0.00 0 0.00 0.000 NaN " - ] - }, - "execution_count": 50, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "long_pre_split.tail()" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
OpenHighLowCloseVolumeBid_sizeCloseBidAsk_sizeCloseAskMidpointWeighted_midpoint
Datetime
2024-06-10 16:00:000.00.00.00.002564.752566.4065.57565.575000
2024-06-11 16:00:0064.164.164.164.1710064.5552565.5565.05065.390000
2024-06-12 16:00:000.00.00.00.002568.55669.3068.92568.695161
2024-06-13 16:00:000.00.00.00.00672.902673.5573.22573.428125
2024-06-14 16:00:000.00.00.00.0013275.3525076.3575.85076.004450
\n", - "
" - ], - "text/plain": [ - " Open High Low Close Volume Bid_size CloseBid \\\n", - "Datetime \n", - "2024-06-10 16:00:00 0.0 0.0 0.0 0.0 0 25 64.75 \n", - "2024-06-11 16:00:00 64.1 64.1 64.1 64.1 7 100 64.55 \n", - "2024-06-12 16:00:00 0.0 0.0 0.0 0.0 0 25 68.55 \n", - "2024-06-13 16:00:00 0.0 0.0 0.0 0.0 0 6 72.90 \n", - "2024-06-14 16:00:00 0.0 0.0 0.0 0.0 0 132 75.35 \n", - "\n", - " Ask_size CloseAsk Midpoint Weighted_midpoint \n", - "Datetime \n", - "2024-06-10 16:00:00 25 66.40 65.575 65.575000 \n", - "2024-06-11 16:00:00 525 65.55 65.050 65.390000 \n", - "2024-06-12 16:00:00 6 69.30 68.925 68.695161 \n", - "2024-06-13 16:00:00 26 73.55 73.225 73.428125 \n", - "2024-06-14 16:00:00 250 76.35 75.850 76.004450 " - ] - }, - "execution_count": 52, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "long_post_split.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['NVDA20250117C61.5',\n", - " 'NVDA20250117C61',\n", - " 'NVDA20250321C177',\n", - " 'NVDA20250321C178',\n", - " 'NVDA20250718C180',\n", - " 'NVDA20250718C185',\n", - " 'NVDA20250117C92',\n", - " 'NVDA20250117C78',\n", - " 'NVDA20250919C240',\n", - " 'NVDA20250919C205',\n", - " 'NVDA20241220C58.5',\n", - " 'NVDA20241220C59',\n", - " 'NVDA20250919C132',\n", - " 'NVDA20250919C134',\n", - " 'NVDA20250919C120',\n", - " 'NVDA20250919C122',\n", - " 'NVDA20250919C114',\n", - " 'NVDA20250919C112',\n", - " 'NVDA20250919C135',\n", - " 'NVDA20250919C95',\n", - " 'NVDA20250919C96',\n", - " 'NVDA20250919C94',\n", - " 'NVDA20250815C120',\n", - " 'NVDA20250815C115',\n", - " 'NVDA20250919C116',\n", - " 'NVDA20250919C118',\n", - " 'NVDA20250919C115',\n", - " 'NVDA20250919C136']" - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "[x for x in rm.processed_option_data.keys() if 'NVDA' in x]" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "http://127.0.0.1:25510/v2/hist/option/eod?end_date=20250601&root=NVDA&use_csv=true&exp=20241220&right=C&start_date=20170101&strike=58500\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
OpenHighLowCloseVolumeBid_sizeCloseBidAsk_sizeCloseAskMidpointWeighted_midpoint
Datetime
2024-06-10 16:00:000.00.00.00.002564.752566.4065.57565.575000
2024-06-11 16:00:0064.164.164.164.1710064.5552565.5565.05065.390000
2024-06-12 16:00:000.00.00.00.002568.55669.3068.92568.695161
2024-06-13 16:00:000.00.00.00.00672.902673.5573.22573.428125
2024-06-14 16:00:000.00.00.00.0013275.3525076.3575.85076.004450
....................................
2024-12-16 16:00:000.00.00.00.002073.202073.9073.55073.550000
2024-12-17 16:00:000.00.00.00.002071.651472.2571.95071.897059
2024-12-18 16:00:000.00.00.00.008269.358670.8070.07570.092262
2024-12-19 16:00:000.00.00.00.004871.752072.6072.17572.000000
2024-12-20 16:00:000.00.00.00.002075.852077.6576.75076.750000
\n", - "

136 rows × 11 columns

\n", - "
" - ], - "text/plain": [ - " Open High Low Close Volume Bid_size CloseBid \\\n", - "Datetime \n", - "2024-06-10 16:00:00 0.0 0.0 0.0 0.0 0 25 64.75 \n", - "2024-06-11 16:00:00 64.1 64.1 64.1 64.1 7 100 64.55 \n", - "2024-06-12 16:00:00 0.0 0.0 0.0 0.0 0 25 68.55 \n", - "2024-06-13 16:00:00 0.0 0.0 0.0 0.0 0 6 72.90 \n", - "2024-06-14 16:00:00 0.0 0.0 0.0 0.0 0 132 75.35 \n", - "... ... ... ... ... ... ... ... \n", - "2024-12-16 16:00:00 0.0 0.0 0.0 0.0 0 20 73.20 \n", - "2024-12-17 16:00:00 0.0 0.0 0.0 0.0 0 20 71.65 \n", - "2024-12-18 16:00:00 0.0 0.0 0.0 0.0 0 82 69.35 \n", - "2024-12-19 16:00:00 0.0 0.0 0.0 0.0 0 48 71.75 \n", - "2024-12-20 16:00:00 0.0 0.0 0.0 0.0 0 20 75.85 \n", - "\n", - " Ask_size CloseAsk Midpoint Weighted_midpoint \n", - "Datetime \n", - "2024-06-10 16:00:00 25 66.40 65.575 65.575000 \n", - "2024-06-11 16:00:00 525 65.55 65.050 65.390000 \n", - "2024-06-12 16:00:00 6 69.30 68.925 68.695161 \n", - "2024-06-13 16:00:00 26 73.55 73.225 73.428125 \n", - "2024-06-14 16:00:00 250 76.35 75.850 76.004450 \n", - "... ... ... ... ... \n", - "2024-12-16 16:00:00 20 73.90 73.550 73.550000 \n", - "2024-12-17 16:00:00 14 72.25 71.950 71.897059 \n", - "2024-12-18 16:00:00 86 70.80 70.075 70.092262 \n", - "2024-12-19 16:00:00 20 72.60 72.175 72.000000 \n", - "2024-12-20 16:00:00 20 77.65 76.750 76.750000 \n", - "\n", - "[136 rows x 11 columns]" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "retrieve_eod_ohlc(\n", - " 'NVDA',\n", - " start_date=rm.start_date,\n", - " end_date=rm.end_date,\n", - " strike = 585.0/10,\n", - " right = 'C',\n", - " exp = '2024-12-20',\n", - " print_url = True\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'AAPL': [(Timestamp('2020-08-31 00:00:00'), 4.0)],\n", - " 'SBUX': [],\n", - " 'AMD': [],\n", - " 'META': [],\n", - " 'COST': [],\n", - " 'NFLX': [],\n", - " 'NVDA': [(Timestamp('2021-07-20 00:00:00'), 4.0),\n", - " (Timestamp('2024-06-10 00:00:00'), 10.0)],\n", - " 'AMZN': [(Timestamp('2022-06-06 00:00:00'), 20.0)]}" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rm.splits" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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Ab0Z84477mDdunVs2bKF0047jWXLloXcs6ioiD/+8Y/88MMP7Ny5k6uuuor7778/5Jxf/epXrFq1qsVnduqpp/Liiy8Gtnfs2MHjjz/Op59+SllZGSkpKYwfP57rrruOsWPHAvqiigdmEpt/X7dt28Ydd9zB5s2bqampITk5mV//+tfcfvvtIT8nb7/9Ng8//DB79+5lwIAB3H333Zx66qktyticxWIhNTW13XOaNF8fqr+RuoWn/lw36Jv1q3ZVU290tHrMHZOEA7AoCkmpqbi10AabIsXOz1JSAkHJ4apfp4KXHTt2UFVVxe9///vAPlVV+emnn3jvvfeYM2cOXq8Xl8sVkn2pqqoKZFucTifbtm0LuW/TarwHZmSaTJ8+nWnTpgW2mz6k0tLSVqdud7vdfW5K945MM6+qKjabjb/85S9ccMEFgc/D59OXKvd4PIF+QStXriQqKipwbURERMjxA7NVTe6//35OPvlkHnvsMW6++WYAHnnkEYqKinjppZfweDxs2rQJr9fLww8/TE5ODps3b+aOO+6gtraWP/xB73FeU1PD+eefz6RJk3jkkUdYv349t956K5GRkYH1jT7//HPOOuss7r33Xmw2G0uWLOH888/no48+CrxcVVVlypQpPProo4EyWiyWkLJfe+21gfJ5vV5mzpzJrbfeypIlSwBobGzEYrFw2WWXsWLFCjRNa1F3l8tFbGwsN910E08//TQ+n6/FOX/7299C9lVUVHDaaadx5plnBvavXbuWGTNmMGTIEB5++GEGDRpEbW0tH3zwAX/4wx944403ANA0jdtvv52LLroocL/IyMiQ+//6179m5MiRxMTEsHHjRu644w48Hg+zZ88G4Ntvv+Waa65h9uzZnHrqqSxfvpxLL72U9957r931jdxuNwUFBW0eB/3fUEpKCoWFhX1yqvJDIXULT/25btC36+fbtpl60/GtHttW2cAEoLG2hoKCAlweX8jxIks0BXt2Y7DaOlQ/s9ncZuKhMzoVvIwaNYqFCxeG7PvrX/9KWloaZ599NgkJCRiNRn788UeOO+44APLz8yktLSUvLw+AvLw83nzzTaqqqgKZgXXr1mG328nIyGj1uWazudWshaZpfe6H4FCdcMIJ7Nq1i8WLFzN37tw2z0tISGg1s3IwcXFxLFiwgGuuuYbTTjsNj8fD4sWLefbZZwPB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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "trade_id = '&L:NFLX20250117C520&S:NFLX20250117C530'\n", - "tick = ['NFLX20250117C520', 'NFLX20250117C530']\n", - "rm.processed_option_data[tick[0]].Midpoint[rm.start_date:rm.end_date].plot(label=tick[0])\n", - "rm.processed_option_data[tick[1]].Midpoint[rm.start_date:rm.end_date].plot(label=tick[1])\n", - "plt.legend()" - ] - }, - { - "cell_type": "code", - "execution_count": 93, - "metadata": {}, - "outputs": [], - "source": [ - "l = rm.processed_option_data[tick[0]].copy()\n", - "s = rm.processed_option_data[tick[1]].copy()\n", - "filled_l = l.replace(0, np.nan).ffill()\n", - "filled_s = s.replace(0, np.nan).ffill()\n", - "filled_l.Midpoint.plot(label =f'Filled {tick[0]}')\n", - "filled_s.Midpoint.plot(label =f'Filled {tick[1]}')\n", - "plt.legend()\n" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjAAAAGkCAYAAAAv7h+nAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAACfkElEQVR4nO2dd5gT1frHv2eSbF9Y2rJL71VQBEVRKRfsiICgeEXl2kV/iP2KV8UrqNjwInaRi1iRcgVBBSsCYkGQDoJ0dtmlbK/JnN8fk0nOTGbSNruZZN/P8/CQzJyZOW/KzjdvO4xzzkEQBEEQBBFDSNGeAEEQBEEQRKiQgCEIgiAIIuYgAUMQBEEQRMxBAoYgCIIgiJiDBAxBEARBEDEHCRiCIAiCIGIOEjAEQRAEQcQcJGAIgiAIgog5SMAQBEEQBBFz2KM9gdrm1KlTcDqdQY1t1qwZ8vPza3lGtQ/ZYS3ixQ4gfmwhO6xFvNgBxI8t0bTDbrejUaNGgcfVwVyiitPpRHV1dcBxjDHP+FheXYHssBbxYgcQP7aQHdYiXuwA4seWWLGDQkgEQRAEQcQcJGAIgiAIgog5SMAQBEEQBBFzkIAhCIIgCCLmiPskXn+UlpbC6XR6EpbKy8tRVVUV5VnVHLLDWsSLHUD82EJ21IyUlBTY7fX69kFYgHr7CaysrARjDA0bNvRsczgcQVUsWR2yw1rEix1A/NhCdoSPLMsoLi5GamoqiRgiqtTbEFJlZSWSk5OjPQ2CIIiYQpIkpKeno6ysLNpTIeo59VbAAN5ad4IgCCJ4JKle3zoIi0CfQoIgCIIgYg4SMARBEARBxBwkYAiCIAiCiDlIwBAEQRAEYYj83QrIH71lyTWRSMDEEJMnT8ZNN90U1Nh169ahZcuWnn8dO3bEkCFD8P777xuO/+2339C6dWtcf/31Pvu2bduGiRMnol+/fujYsSMGDRqEd955x/CaF198Mdq3b4/zzjsPn3zyiWb/K6+8gssuuwxdunRB7969cdNNN2HPnj2G8+GcY9y4cWjZsiW+/PJLzb4jR47g+uuvR8eOHdG7d2889dRTmhXHjx07hrvuugvnn38+WrVqhccff9zn/Lt27cKtt96K/v37o2XLlnj77bd9xpSUlODxxx/H2WefjY4dO2LEiBHYtGmTz7h9+/bh3nvvRd++fdG+fXucc845mDhxIv744w8AwMGDB3H//ffjnHPOQceOHTFgwAC88MILpv079u3bhy5duqB79+4++5YtW4aBAweiQ4cOGDp0KL755hufMd999x0uuugidOzYEX379sUjjzxieJ2ffvoJY8eORc+ePdGxY0ecd955uOeee/z2Ffm///s/zeeqZ8+euO6667B9+3bD8Q899BBat26NZcuW+ez74IMPMGrUKPTo0QM9evTANddcg40bN2rGcM7x/PPPo0+fPujYsSOuueYa/PXXX579hw4dCuu17dSpk8++QK/tihUrcO2116Jnz55o2bIltm7d6nOO999/H2PGjEHXrl3RsmVLFBYW+ozZsmULxo0bh+7du6Nnz5546KGHUFpa6jNu+fLlGDNmDLp164bOnTtj2LBhmDlzJk6dOuWZz5gxY9CrVy907doVV1xxBb7//nvNOV588UXN+9WyZUsMHDhQM6aiogJTpkxBz5490blzZ9x6661xsZoyERn44nng334O5OdGeyo+kICJc1avXo2NGzfiu+++w/jx4/HII4/gxx9/9Bn38ccf4x//+Ad+/vln5OZqP6hbtmxB06ZN8corr+Dbb7/FpEmT8Mwzz2Du3LmeMQcPHsQNN9yAAQMGYOXKlbjlllvw4IMPav6grl+/HjfeeCOWLVuGjz76CNXV1fj73/9uWI759ttvG1aJuVwu3HDDDaiursZnn32Gl19+GQsWLMDzzz/vGVNVVYUmTZrgnnvuQY8ePQxfl/LycrRp0wZTpkxBZmam4ZgHHngAP/74I2bNmoWvv/4agwYNwrhx45CTk+MZ88cff+DSSy/FX3/9hRkzZuC7777DO++8g06dOuHf//43AGDPnj2QZRkzZszAt99+i6lTp2L+/Pl49tlnfa5ZXV2Nu+66C/379/fZ9+uvv+Kuu+7Ctddei6+++goXX3wxbr75ZuzcudMzpqKiArfccgu6d++Or7/+GvPmzUPPnj19zrV7926MHz8ep59+OhYtWoRvvvkG06ZNQ0JCAlwul+HroTJkyBBs3LgRGzduxCeffAKbzYYbb7zR8DVeunQpJk6c6CNmAUVAXXnllViwYAGWLl2KFi1a4O9//7vm9X3ttdfw7rvv4tlnn8WyZcuQkpKC6667DhUVFXX+2paVleHss8/Go48+avralJeXY/Dgwfi///s/w/25ubkYN24c2rVrh2XLluGDDz7Arl27MHnyZM24Z599FnfeeSdOP/10zJ8/H99++y0ef/xxbN++HYsWLQKgfJ8GDRqE+fPn44svvsCAAQMwYcIEH2HVtWtXz/u1ceNG/O9//9Psnzp1KlatWoU333wTixYtQm5uLm655RZTG4n6A3dWAxXlypNq6zV+ZNyKfqEIkp+fb9joqaioCA0aNACg/MpDVWV0mlslJAZdzj158mQUFRXh3Xff9TvO4XDghx9+wNixY7F9+3ZNs77zzjsP48ePx5133unZVlpaij59+mDFihV48cUX0b17d0yaNMnvNaZMmYI///wTn376KQBg+vTp+Oabb/Dtt996xtx5550oKirCBx98YHiOEydOoHfv3li0aBHOOeccz/atW7fixhtvxKpVq9CrVy/MmTMHl1xyCQDg22+/xY033ojff/8dzZo1AwC89957ePrpp7F582YkJCRorjFmzBj06NHDIyaM6N+/P2655Rbceuutnm3l5eXo2rUr3n33XQwbNsyz/ZJLLsGQIUPw8MMPg3OOoUOHIjExEcuXL/cpLS0sLETDhg0NP1evv/463nvvPfz000+a7dOnT0dubi7OP/98TJ06FTt27PDsu+OOO1BWVob33nvPs2348OHo2bMnZsyYAUARML1798bbb7+NQYMGmdr89ttvY86cOVi/fr3pGCPuu+8+FBQUaD6Dv/zyC0aNGoXNmzejSZMmnu0LFizA/Pnz8cEHH+DMM8/EDz/8gJYtW5qe2+VyoUePHpg2bRrGjh0LzjnOPPNM3H777bjjjjsAKN/bM844AzNnzsSVV15peJ7aem1VDh06hHPOOQdfffUVTjvtNMM5rFu3zvD79/777+P555/Hxo0bPZ+XHTt2YNiwYVizZg3at2+PjRs3Yvjw4XjyyScNhYT6uQJ8G9kNGTIEI0aMwL333gtA8cB8+eWXWLVqleE8i4qK0Lt3b8yePRvDhw8HoIjCQYMGYenSpejbt6/hceqx6t/QmsAYQ3Z2NnJyciwZpgiFeLFFtePorh1w3ad45dn1d0EaeHGdXN/hcHj+vvuD2igCQFUl5LuvRmUULi3NXgAkJtX4PJMnT8bhw4excOFCw/2cc3z//fc4cuQI+vTpo9m3bNkydOrUCZ06dcLo0aMxdepU/N///Z9fYVVcXIyMjAzP8w0bNuD888/XjBk8eDCeeOIJ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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "rm.position_data[ trade_id].dropna().Midpoint[rm.start_date:rm.end_date].plot(label='L:BA20240119C240&S:BA20240119C250')\n", - "plt.legend()\n", - "# pm.all_positions" - ] - }, - { - "cell_type": "code", - "execution_count": 129, - "metadata": {}, - "outputs": [], - "source": [ - "from IPython.display import clear_output\n", - "import json\n", - "pd.set_option('display.max_columns', 100)\n", - "pd.set_option('display.max_rows', 100)\n", - "_key = 11\n", - "\n", - "ttrades__ = pd.read_csv(f'../input/profitable_trades_{_key}.csv').iloc[:, 1:]\n", - "ttrades__['Duration'] = ttrades__.Duration.apply(lambda x: int(x.split(' ')[0]))\n", - "\n", - "for index in ttrades__.index:\n", - " trades_ = ttrades__.iloc[index, :].to_frame().T\n", - "\n", - "\n", - " symbol_list = trades_.Ticker.unique()\n", - " with open(f'../input/profitable_weights_{_key}.json', 'r') as f:\n", - " weights = json.load(f)\n", - " print(f\"\\n\\nRunning backtest for trades {index} with symbols {symbol_list[0]}\\n\")\n", - " untraded_symbols = [s for s in weights.keys() if s not in trades_.Ticker.unique()]\n", - " for s in untraded_symbols:\n", - " weights.pop(s)\n", - "\n", - " print(weights)\n", - "\n", - "\n", - " max_cash = {}\n", - " cash = 20_000\n", - " for s, w in weights.items():\n", - " if w * cash > 200:\n", - " max_cash[s] = 2\n", - " elif w * cash > 100:\n", - " max_cash[s] = 1\n", - " else:\n", - " max_cash[s] = 0.5\n", - " max_cash\n", - " print(max_cash)\n", - " print(\"\\nSetting up backtest\\n\")\n", - " #Backtest class \n", - " ## Find a way to not always reinitialize the backtest class, when want to redo\n", - "\n", - " pd.options.display.max_rows = 50\n", - " pd.options.display.max_columns = 50\n", - "\n", - " evb_backtest = OptionSignalBacktest(trades_, initial_capital=cash)\n", - " evb_backtest.portfolio.initial_capital\n", - " w_map = {x: w * 0.85 for x, w in weights.items()} ## 75% of the weights for each stock\n", - " evb_backtest.portfolio.weight_map = w_map\n", - " evb_backtest.portfolio.weight_map\n", - " evb_backtest.portfolio.risk_manager.OrderPicker.liquidity_threshold = 50\n", - " evb_backtest.portfolio.risk_manager.OrderPicker.lookback = 10\n", - " evb_backtest.portfolio.risk_manager.sizing_lev = 4.5\n", - " evb_backtest.portfolio.max_contract_price_factor = 2\n", - " evb_backtest.portfolio.min_moneyness_threshold = 3\n", - " evb_backtest.portfolio.risk_manager.OrderPicker.data_availability_threshold = 0.5\n", - " evb_backtest.portfolio.order_settings = {'type': 'naked',\n", - " 'specifics': [{'direction': 'long',\n", - " 'rel_strike': .70,\n", - " 'dte': 365,\n", - " 'moneyness_width': 0},\n", - " {'direction': 'short',\n", - " 'rel_strike': .60,\n", - " 'dte': 365,\n", - " 'moneyness_width': 0}\n", - " ],\n", - " 'name': 'vertical_spread'}\n", - "\n", - "\n", - " evb_backtest.portfolio.max_contract_price = max_cash\n", - " evb_backtest.executor.commission_rate = 0.65/100\n", - " evb_backtest.portfolio.min_moneyness_threshold = 5\n", - " evb_backtest.executor.max_slippage_pct = 0.075\n", - " evb_backtest.portfolio.roll_map = 90\n", - " evb_backtest.portfolio.moneyness_width_factor = .025\n", - " evb_backtest.portfolio.dte_reduction_factor = 30\n", - " evb_backtest.portfolio.min_acceptable_dte_threshold = 95\n", - " evb_backtest.portfolio.risk_manager.limits['dte'] = True\n", - " evb_backtest.portfolio.risk_manager.limits['delta'] = True\n", - " evb_backtest.portfolio.risk_manager.limits['moneyness'] = True\n", - " evb_backtest.portfolio.risk_manager.max_moneyness = 1.3\n", - " for key in max_cash:\n", - " if max_cash[key]*100 > evb_backtest.portfolio.allocated_cash_map[key]:\n", - " print(key, max_cash[key]*100, evb_backtest.portfolio.allocated_cash_map[key])\n", - "\n", - " evb_backtest.portfolio.risk_manager.print_settings()\n", - "\n", - " signals = evb_backtest.bars.signal_df\n", - " signals_df = deepcopy(signals).set_index('Date')\n", - " ((signals_df!=-1)&(signals_df!=-0)).sum().sum()\n", - " rm = evb_backtest.portfolio.risk_manager\n", - " pm = evb_backtest.portfolio\n", - "\n", - " evb_backtest.run()\n", - " clear_output()\n" - ] - }, - { - "cell_type": "code", - "execution_count": 111, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "name": "Equity Curve", - "showlegend": true, - "type": "scatter", - "x": [ - "2024-01-31T00:00:00", - "2024-02-01T00:00:00", - "2024-02-02T00:00:00", - "2024-02-05T00:00:00", - "2024-02-06T00:00:00", - "2024-02-07T00:00:00", - "2024-02-08T00:00:00", - "2024-02-09T00:00:00", - "2024-02-12T00:00:00", - "2024-02-13T00:00:00", - "2024-02-14T00:00:00", - "2024-02-15T00:00:00", - "2024-02-16T00:00:00", - "2024-02-19T00:00:00", - "2024-02-20T00:00:00", - "2024-02-21T00:00:00", - "2024-02-22T00:00:00", - "2024-02-23T00:00:00", - "2024-02-26T00:00:00", - "2024-02-27T00:00:00", - "2024-02-28T00:00:00", - "2024-02-29T00:00:00", - "2024-03-01T00:00:00", - "2024-03-04T00:00:00", - "2024-03-05T00:00:00", - "2024-03-06T00:00:00", - "2024-03-07T00:00:00", - "2024-03-08T00:00:00", - "2024-03-11T00:00:00", - "2024-03-12T00:00:00", - "2024-03-13T00:00:00", - "2024-03-14T00:00:00", - "2024-03-15T00:00:00", - "2024-03-18T00:00:00", - "2024-03-19T00:00:00", - "2024-03-20T00:00:00", - "2024-03-21T00:00:00", - "2024-03-22T00:00:00", - "2024-03-25T00:00:00", - "2024-03-26T00:00:00", - "2024-03-27T00:00:00", - "2024-03-28T00:00:00", - "2024-03-29T00:00:00", - "2024-04-01T00:00:00", - "2024-04-02T00:00:00", - "2024-04-03T00:00:00", - "2024-04-04T00:00:00", - "2024-04-05T00:00:00", - "2024-04-08T00:00:00", - "2024-04-09T00:00:00", - "2024-04-10T00:00:00", - "2024-04-11T00:00:00", - "2024-04-12T00:00:00", - "2024-04-15T00:00:00", - "2024-04-16T00:00:00", - "2024-04-17T00:00:00", - "2024-04-18T00:00:00", - "2024-04-19T00:00:00", - "2024-04-22T00:00:00", - "2024-04-23T00:00:00", - "2024-04-24T00:00:00", - "2024-04-25T00:00:00", - "2024-04-26T00:00:00", - "2024-04-29T00:00:00", - "2024-04-30T00:00:00", - "2024-05-01T00:00:00", - "2024-05-02T00:00:00", - "2024-05-03T00:00:00", - "2024-05-06T00:00:00", - "2024-05-07T00:00:00", - "2024-05-08T00:00:00", - "2024-05-09T00:00:00", - "2024-05-10T00:00:00", - "2024-05-13T00:00:00", - "2024-05-14T00:00:00", - "2024-05-15T00:00:00", - "2024-05-16T00:00:00", - "2024-05-17T00:00:00", - "2024-05-20T00:00:00", - "2024-05-21T00:00:00", - "2024-05-22T00:00:00", - "2024-05-23T00:00:00", - "2024-05-24T00:00:00", - "2024-05-27T00:00:00", - "2024-05-28T00:00:00", - "2024-05-29T00:00:00", - "2024-05-30T00:00:00", - "2024-05-31T00:00:00", - "2024-06-03T00:00:00", - "2024-06-04T00:00:00", - "2024-06-05T00:00:00", - "2024-06-06T00:00:00", - "2024-06-07T00:00:00", - "2024-06-10T00:00:00", - "2024-06-11T00:00:00", - "2024-06-12T00:00:00", - "2024-06-13T00:00:00", - "2024-06-14T00:00:00", - "2024-06-17T00:00:00", - "2024-06-18T00:00:00", - "2024-06-19T00:00:00", - "2024-06-20T00:00:00", - "2024-06-21T00:00:00", - "2024-06-24T00:00:00", - "2024-06-25T00:00:00", - "2024-06-26T00:00:00", - "2024-06-27T00:00:00", - "2024-06-28T00:00:00", - "2024-07-01T00:00:00", - "2024-07-02T00:00:00", - "2024-07-03T00:00:00", - "2024-07-04T00:00:00", - "2024-07-05T00:00:00", - "2024-07-08T00:00:00", - "2024-07-09T00:00:00", - "2024-07-10T00:00:00", - "2024-07-11T00:00:00", - "2024-07-12T00:00:00", - "2024-07-15T00:00:00", - "2024-07-16T00:00:00", - "2024-07-17T00:00:00", - "2024-07-18T00:00:00", - "2024-07-19T00:00:00", - "2024-07-22T00:00:00", - "2024-07-23T00:00:00", - "2024-07-24T00:00:00", - "2024-07-25T00:00:00", - "2024-07-26T00:00:00" - ], - "xaxis": "x", - "y": [ - 0.9999997752361321, - 0.9999997752361321, - 1.0032512165198588, - 1.0131556068918266, - 1.0131556068918266, - 1.0111547199479947, - 1.0124052742878895, - 1.0114048308159738, - 1.0149063829676794, - 1.0149063829676794, - 1.0116549416839526, - 1.0136558286277846, - 1.0121551634199106, - 1.0096540547401207, - 1.0096540547401207, - 1.0096540547401207, - 1.0109046090800158, - 1.0166571590435323, - 1.0174074916474691, - 1.0174074916474691, - 1.0154066047036374, - 1.0149063829676794, - 1.0171573807794902, - 1.019408378591301, - 1.019408378591301, - 1.0159068264395954, - 1.0151564938356583, - 1.0191582677233222, - 1.0131556068918266, - 1.0131556068918266, - 1.0166571590435323, - 1.0179077133834271, - 1.020658932931196, - 1.0156567155716163, - 1.0156567155716163, - 1.0166571590435323, - 1.0191582677233222, - 1.0191582677233222, - 1.021159154667154, - 1.021159154667154, - 1.019408378591301, - 1.020909043799175, - 1.021159154667154, - 1.0216593764031119, - 1.0216593764031119, - 1.0216593764031119, - 1.0239103742149227, - 1.021409265535133, - 1.0279121481025866, - 1.0279121481025866, - 1.0279121481025866, - 1.0289125915745023, - 1.0324141437262082, - 1.0261613720267335, - 1.0261613720267335, - 1.0251609285548178, - 1.0229099307430067, - 1.020408822063217, - 1.0176576025154482, - 1.0176576025154482, - 1.020158711195238, - 1.0164070481755534, - 1.0136558286277846, - 1.021909487271091, - 1.021909487271091, - 1.0155066490508289, - 1.0181578242514062, - 1.0249108176868387, - 1.0296629241784394, - 1.0296629241784394, - 1.0294128133104603, - 1.0281622589705655, - 1.0299130350464183, - 1.0251609285548178, - 1.0251609285548178, - 1.0251609285548178, - 1.0234101524789647, - 1.020158711195238, - 1.0191582677233222, - 1.0191582677233222, - 1.018407935119385, - 1.0179077133834271, - 1.0155066490508289, - 1.0169072699115114, - 1.0169072699115114, - 1.0169072699115114, - 1.0164070481755534, - 1.0136058064541886, - 1.0113548086423778, - 1.0113548086423778, - 1.0122552077671023, - 1.0145562277525089, - 1.019408378591301, - 1.0221595981390699, - 1.0221595981390699, - 1.0216593764031119, - 1.020408822063217, - 1.0174074916474691, - 1.0176576025154482, - 1.0176576025154482, - 1.0159068264395954, - 1.020158711195238, - 1.020158711195238, - 1.0196584894592802, - 1.0196584894592802, - 1.0196584894592802, - 1.0296629241784394, - 1.0361658067458928, - 1.034915252405998, - 1.034915252405998, - 1.0389170262936616, - 1.035165363273977, - 1.0379165828217458, - 1.0366660284818507, - 1.0366660284818507, - 1.0369161393498298, - 1.0376664719537667, - 1.0304132567823763, - 1.0266615937626915, - 1.0266615937626915, - 1.0274119263666286, - 1.021159154667154, - 1.0174074916474691, - 1.013555784280593, - 1.013555784280593, - 1.0109046090800158, - 1.01275542950306, - 1.0113698152944566 - ], - "yaxis": "y" - }, - { - "name": "Benchmark", - "showlegend": true, - "type": "scatter", - "x": [ - "2024-01-31T00:00:00", - "2024-02-01T00:00:00", - "2024-02-02T00:00:00", - "2024-02-05T00:00:00", - "2024-02-06T00:00:00", - "2024-02-07T00:00:00", - "2024-02-08T00:00:00", - "2024-02-09T00:00:00", - "2024-02-12T00:00:00", - "2024-02-13T00:00:00", - "2024-02-14T00:00:00", - "2024-02-15T00:00:00", - "2024-02-16T00:00:00", - "2024-02-19T00:00:00", - "2024-02-20T00:00:00", - "2024-02-21T00:00:00", - "2024-02-22T00:00:00", - "2024-02-23T00:00:00", - "2024-02-26T00:00:00", - "2024-02-27T00:00:00", - "2024-02-28T00:00:00", - "2024-02-29T00:00:00", - "2024-03-01T00:00:00", - "2024-03-04T00:00:00", - "2024-03-05T00:00:00", - "2024-03-06T00:00:00", - "2024-03-07T00:00:00", - "2024-03-08T00:00:00", - "2024-03-11T00:00:00", - "2024-03-12T00:00:00", - "2024-03-13T00:00:00", - "2024-03-14T00:00:00", - "2024-03-15T00:00:00", - "2024-03-18T00:00:00", - "2024-03-19T00:00:00", - "2024-03-20T00:00:00", - "2024-03-21T00:00:00", - "2024-03-22T00:00:00", - "2024-03-25T00:00:00", - "2024-03-26T00:00:00", - "2024-03-27T00:00:00", - "2024-03-28T00:00:00", - "2024-03-29T00:00:00", - "2024-04-01T00:00:00", - "2024-04-02T00:00:00", - "2024-04-03T00:00:00", - "2024-04-04T00:00:00", - "2024-04-05T00:00:00", - "2024-04-08T00:00:00", - "2024-04-09T00:00:00", - "2024-04-10T00:00:00", - "2024-04-11T00:00:00", - "2024-04-12T00:00:00", - "2024-04-15T00:00:00", - "2024-04-16T00:00:00", - "2024-04-17T00:00:00", - "2024-04-18T00:00:00", - "2024-04-19T00:00:00", - "2024-04-22T00:00:00", - "2024-04-23T00:00:00", - "2024-04-24T00:00:00", - "2024-04-25T00:00:00", - "2024-04-26T00:00:00", - "2024-04-29T00:00:00", - "2024-04-30T00:00:00", - "2024-05-01T00:00:00", - "2024-05-02T00:00:00", - "2024-05-03T00:00:00", - "2024-05-06T00:00:00", - "2024-05-07T00:00:00", - "2024-05-08T00:00:00", - "2024-05-09T00:00:00", - "2024-05-10T00:00:00", - "2024-05-13T00:00:00", - "2024-05-14T00:00:00", - "2024-05-15T00:00:00", - "2024-05-16T00:00:00", - "2024-05-17T00:00:00", - "2024-05-20T00:00:00", - "2024-05-21T00:00:00", - "2024-05-22T00:00:00", - "2024-05-23T00:00:00", - "2024-05-24T00:00:00", - "2024-05-27T00:00:00", - "2024-05-28T00:00:00", - "2024-05-29T00:00:00", - "2024-05-30T00:00:00", - "2024-05-31T00:00:00", - "2024-06-03T00:00:00", - "2024-06-04T00:00:00", - "2024-06-05T00:00:00", - "2024-06-06T00:00:00", - "2024-06-07T00:00:00", - "2024-06-10T00:00:00", - "2024-06-11T00:00:00", - "2024-06-12T00:00:00", - "2024-06-13T00:00:00", - "2024-06-14T00:00:00", - "2024-06-17T00:00:00", - "2024-06-18T00:00:00", - "2024-06-19T00:00:00", - "2024-06-20T00:00:00", - "2024-06-21T00:00:00", - "2024-06-24T00:00:00", - "2024-06-25T00:00:00", - "2024-06-26T00:00:00", - "2024-06-27T00:00:00", - "2024-06-28T00:00:00", - "2024-07-01T00:00:00", - "2024-07-02T00:00:00", - "2024-07-03T00:00:00", - "2024-07-04T00:00:00", - "2024-07-05T00:00:00", - "2024-07-08T00:00:00", - "2024-07-09T00:00:00", - "2024-07-10T00:00:00", - "2024-07-11T00:00:00", - "2024-07-12T00:00:00", - "2024-07-15T00:00:00", - "2024-07-16T00:00:00", - "2024-07-17T00:00:00", - "2024-07-18T00:00:00", - "2024-07-19T00:00:00", - "2024-07-22T00:00:00", - "2024-07-23T00:00:00", - "2024-07-24T00:00:00", - "2024-07-25T00:00:00", - "2024-07-26T00:00:00", - "2024-07-29T00:00:00" - ], - "xaxis": "x", - "y": [ - null, - 1.0130881528750657, - 1.023753315740391, - 1.0200256436637978, - 1.0229870899421674, - 1.0315192202344279, - 1.0319748224927086, - 1.0379390472559837, - 1.037483444997703, - 1.0231941301694012, - 1.0324925494589776, - 1.0396164775707681, - 1.0344392079080769, - 1.0344392079080769, - 1.0287442112791165, - 1.0296760818989454, - 1.0509857415263286, - 1.051710571918924, - 1.0478586504263536, - 1.049805308875453, - 1.0484178359973437, - 1.0521868402804726, - 1.0620650480452143, - 1.0609260739990594, - 1.0503230358417224, - 1.055645284222751, - 1.0661240729641108, - 1.0597249752449154, - 1.0588137707283543, - 1.0702038271853676, - 1.068526270472398, - 1.0664140304007856, - 1.055810929044356, - 1.062085777347574, - 1.0679879406019532, - 1.0778660851676023, - 1.08142811242259, - 1.0793779338598737, - 1.076395821478236, - 1.074407704424416, - 1.083436832380585, - 1.0832297921533514, - 1.0832297921533514, - 1.081345195213148, - 1.074469892331497, - 1.0756501985841878, - 1.0625207135025865, - 1.0736207493238321, - 1.0742212671013576, - 1.0754638876593146, - 1.0646951414812797, - 1.0727302741096314, - 1.0579232955141529, - 1.0446694978174818, - 1.0427642347740107, - 1.0365929065844093, - 1.0344598740113442, - 1.025430746055175, - 1.0348740808639965, - 1.047154549336118, - 1.0466575516722092, - 1.0426813807636615, - 1.0525596517274955, - 1.0562872606049962, - 1.0395543528627789, - 1.0361787629308492, - 1.045870596571625, - 1.0588345000307138, - 1.069768891030354, - 1.0709493236812297, - 1.0710528437948463, - 1.0772241087853551, - 1.0786117080616497, - 1.0787565603818021, - 1.0837060605148994, - 1.097125629431361, - 1.094868284243226, - 1.0964421944443938, - 1.097705417906526, - 1.1003975728514883, - 1.0972291495449775, - 1.0892147462189863, - 1.0964214651420332, - 1.0964214651420332, - 1.0971876909402567, - 1.0895045772574763, - 1.082277129032069, - 1.0921346706935426, - 1.0930251459077434, - 1.09424703716334, - 1.1072522728289642, - 1.1072315435266038, - 1.1058855292532153, - 1.1093024513916805, - 1.1119740034324677, - 1.1211066515022534, - 1.1233639966903881, - 1.1240474316773552, - 1.132993642424083, - 1.1358722346921037, - 1.1358722346921037, - 1.1327866021968493, - 1.1276300618365185, - 1.1239645144679138, - 1.1282927675211252, - 1.1297009697015952, - 1.1314819201299966, - 1.127029417660808, - 1.1293489507560242, - 1.136949147229363, - 1.1420228967784374, - 1.1420228967784374, - 1.1486083686215984, - 1.1499337799908118, - 1.1510520247346065, - 1.1624420179925274, - 1.1524187683103557, - 1.1596876751404839, - 1.16287695414754, - 1.1697729863315516, - 1.1533714314316375, - 1.144507885097981, - 1.136907688624642, - 1.1486290979239588, - 1.1468274181931972, - 1.120837423367939, - 1.114997448020641, - 1.1274850831181813, - 1.128147788802788 - ], - "yaxis": "y" - }, - { - "customdata": [ - 2 - ], - "hovertemplate": "%{text}

Date: %{x}
Size: %{customdata}
PnL: %{y}
", - "marker": { - "color": [ - "green" - ] - }, - "mode": "markers", - "name": "Ticker", - "showlegend": false, - "text": [ - "AMZN" - ], - "type": "scatter", - "x": [ - "2024-01-31T00:00:00" - ], - "xaxis": "x2", - "y": [ - 0.6601709449353687 - ], - "yaxis": "y2" - }, - { - "fill": "tozeroy", - "line": { - "color": "red" - }, - "name": "Drawdown", - "showlegend": false, - "type": "scatter", - "x": [ - "2024-01-31T00:00:00", - "2024-02-01T00:00:00", - "2024-02-02T00:00:00", - "2024-02-05T00:00:00", - "2024-02-06T00:00:00", - "2024-02-07T00:00:00", - "2024-02-08T00:00:00", - "2024-02-09T00:00:00", - "2024-02-12T00:00:00", - "2024-02-13T00:00:00", - "2024-02-14T00:00:00", - "2024-02-15T00:00:00", - "2024-02-16T00:00:00", - "2024-02-19T00:00:00", - "2024-02-20T00:00:00", - "2024-02-21T00:00:00", - "2024-02-22T00:00:00", - "2024-02-23T00:00:00", - "2024-02-26T00:00:00", - "2024-02-27T00:00:00", - "2024-02-28T00:00:00", - "2024-02-29T00:00:00", - "2024-03-01T00:00:00", - "2024-03-04T00:00:00", - "2024-03-05T00:00:00", - "2024-03-06T00:00:00", - "2024-03-07T00:00:00", - "2024-03-08T00:00:00", - "2024-03-11T00:00:00", - "2024-03-12T00:00:00", - "2024-03-13T00:00:00", - "2024-03-14T00:00:00", - "2024-03-15T00:00:00", - "2024-03-18T00:00:00", - "2024-03-19T00:00:00", - "2024-03-20T00:00:00", - "2024-03-21T00:00:00", - "2024-03-22T00:00:00", - "2024-03-25T00:00:00", - "2024-03-26T00:00:00", - "2024-03-27T00:00:00", - "2024-03-28T00:00:00", - "2024-03-29T00:00:00", - "2024-04-01T00:00:00", - "2024-04-02T00:00:00", - "2024-04-03T00:00:00", - "2024-04-04T00:00:00", - "2024-04-05T00:00:00", - "2024-04-08T00:00:00", - "2024-04-09T00:00:00", - "2024-04-10T00:00:00", - "2024-04-11T00:00:00", - "2024-04-12T00:00:00", - "2024-04-15T00:00:00", - "2024-04-16T00:00:00", - "2024-04-17T00:00:00", - "2024-04-18T00:00:00", - "2024-04-19T00:00:00", - "2024-04-22T00:00:00", - "2024-04-23T00:00:00", - "2024-04-24T00:00:00", - "2024-04-25T00:00:00", - "2024-04-26T00:00:00", - "2024-04-29T00:00:00", - "2024-04-30T00:00:00", - "2024-05-01T00:00:00", - "2024-05-02T00:00:00", - "2024-05-03T00:00:00", - "2024-05-06T00:00:00", - "2024-05-07T00:00:00", - "2024-05-08T00:00:00", - "2024-05-09T00:00:00", - "2024-05-10T00:00:00", - "2024-05-13T00:00:00", - "2024-05-14T00:00:00", - "2024-05-15T00:00:00", - "2024-05-16T00:00:00", - "2024-05-17T00:00:00", - "2024-05-20T00:00:00", - "2024-05-21T00:00:00", - "2024-05-22T00:00:00", - "2024-05-23T00:00:00", - "2024-05-24T00:00:00", - "2024-05-27T00:00:00", - "2024-05-28T00:00:00", - "2024-05-29T00:00:00", - "2024-05-30T00:00:00", - "2024-05-31T00:00:00", - "2024-06-03T00:00:00", - "2024-06-04T00:00:00", - "2024-06-05T00:00:00", - "2024-06-06T00:00:00", - "2024-06-07T00:00:00", - "2024-06-10T00:00:00", - "2024-06-11T00:00:00", - "2024-06-12T00:00:00", - "2024-06-13T00:00:00", - "2024-06-14T00:00:00", - "2024-06-17T00:00:00", - "2024-06-18T00:00:00", - "2024-06-19T00:00:00", - "2024-06-20T00:00:00", - "2024-06-21T00:00:00", - "2024-06-24T00:00:00", - "2024-06-25T00:00:00", - "2024-06-26T00:00:00", - "2024-06-27T00:00:00", - "2024-06-28T00:00:00", - "2024-07-01T00:00:00", - "2024-07-02T00:00:00", - "2024-07-03T00:00:00", - "2024-07-04T00:00:00", - "2024-07-05T00:00:00", - "2024-07-08T00:00:00", - "2024-07-09T00:00:00", - "2024-07-10T00:00:00", - "2024-07-11T00:00:00", - "2024-07-12T00:00:00", - "2024-07-15T00:00:00", - "2024-07-16T00:00:00", - "2024-07-17T00:00:00", - "2024-07-18T00:00:00", - "2024-07-19T00:00:00", - "2024-07-22T00:00:00", - "2024-07-23T00:00:00", - "2024-07-24T00:00:00", - "2024-07-25T00:00:00", - "2024-07-26T00:00:00" - ], - "xaxis": "x3", - "y": [ - 0, - 0, - 0, - 0, - 0, - -0.001974905420582762, - -0.0007405895327184941, - -0.0017280422430099307, - 0, - 0, - -0.0032036852050792985, - -0.001232186617338149, - -0.002710810558144039, - -0.005175183792820337, - -0.005175183792820337, - -0.005175183792820337, - -0.003942997175482188, - 0, - 0, - 0, - -0.0019666520231333973, - -0.002458315028916691, - -0.0002458315028917024, - 0, - 0, - -0.0034348858153454565, - -0.004170932775776515, - -0.00024534898681038975, - -0.006133724670259633, - -0.006133724670259633, - -0.002698838854914287, - -0.0014720939208623385, - 0, - -0.004900967499156139, - -0.004900967499156139, - -0.003920773999325, - -0.001470290249746875, - -0.001470290249746875, - 0, - 0, - -0.0017144983546333314, - -0.0002449283363762378, - 0, - 0, - 0, - 0, - 0, - -0.00244270220689613, - 0, - 0, - 0, - 0, - 0, - -0.006056455518552384, - -0.006056455518552384, - -0.007025488401520841, - -0.00920581238819973, - -0.011628394595620706, - -0.014293235023783768, - -0.014293235023783768, - -0.011870652816362792, - -0.0155045261274942, - -0.018169366555657263, - -0.010174845271168076, - -0.010174845271168076, - -0.016376655722165734, - -0.013808718582299484, - -0.007267746622262927, - -0.002664840428163062, - -0.002664840428163062, - -0.0029070986489051487, - -0.004118389752615692, - -0.0024225822074209757, - -0.007025488401520841, - -0.007025488401520841, - -0.007025488401520841, - -0.008721295946715446, - -0.011870652816362792, - -0.012839685699331138, - -0.012839685699331138, - -0.013566460361557398, - -0.014050976803041682, - -0.016376655722165734, - -0.015020009686010027, - -0.015020009686010027, - -0.015020009686010027, - -0.0155045261274942, - -0.018217818199805724, - -0.020398142186484614, - -0.020398142186484614, - -0.01952601259181308, - -0.01729723696098573, - -0.012597427478589052, - -0.00993258705042599, - -0.00993258705042599, - -0.010417103491910162, - -0.011628394595620706, - -0.014535493244525854, - -0.014293235023783768, - -0.014293235023783768, - -0.015989042568978373, - -0.011870652816362792, - -0.011870652816362792, - -0.012355169257846965, - -0.012355169257846965, - -0.012355169257846965, - -0.002664840428163062, - 0, - -0.0012069053625245463, - -0.0012069053625245463, - 0, - -0.0036111278505249755, - -0.0009629674268066823, - -0.0021666767103150075, - -0.0021666767103150075, - -0.0019259348536133647, - -0.0012037092835083252, - -0.008185223127856633, - -0.01179635097838172, - -0.01179635097838172, - -0.01107412540827668, - -0.017092671825818417, - -0.020703799676343393, - -0.024411224269549003, - -0.024411224269549003, - -0.02696308795058666, - -0.025181598210994416, - -0.0265156306464297 - ], - "yaxis": "y3" - }, - { - "histnorm": "percent", - "marker": { - "color": "purple" - }, - "showlegend": false, - "type": "histogram", - "xaxis": "x4", - "y": [ - null, - 0.00812718921757205, - 0.0007418715180405044, - 0.004447929316169663, - 0.0004920258721621273, - 0.001967135607036097, - 0.0014724551862503876, - -0.001470290249746875, - 0.0019632735816672575, - 0.00024492833637612677, - 0.010774207891737664, - -0.011628394595620706, - -0.006617927836322757, - 0.011103360968836906, - 0.004880635638014663, - -0.00947101492117608, - -0.004560134681401817, - -0.0018718165732348746, - 0.005724681935977971, - -0.001962791894483118, - 0.0027041465318082825, - 0.015690786000522206, - 0.0016896675075344092, - -0.007229217201736637, - -0.012621889530589736, - -0.0059347018482922564 - ], - "yaxis": "y4" - }, - { - "histnorm": "percent", - "marker": { - "color": "purple" - }, - "showlegend": false, - "type": "histogram", - "xaxis": "x5", - "y": [ - null, - 0.014906607731547394, - 0.006160933086690967, - 0.0007347850091286023, - -0.008125650161761144, - 0.022257168561431673, - -0.02393084293387504 - ], - "yaxis": "y5" - } - ], - "layout": { - "annotations": [ - { - "font": { - "size": 16 - }, - "showarrow": false, - "text": "EQUITY CURVE", - "x": 0.5, - "xanchor": "center", - "xref": "paper", - "y": 0.9999999999999999, - "yanchor": "bottom", - "yref": "paper" - }, - { - "font": { - "size": 16 - }, - "showarrow": false, - "text": "TRADES", - "x": 0.5, - "xanchor": "center", - "xref": "paper", - "y": 0.5576923076923076, - "yanchor": "bottom", - "yref": "paper" - }, - { - "font": { - "size": 16 - }, - "showarrow": false, - "text": "PORTFOLIO DRAWDOWN", - "x": 0.5, - "xanchor": "center", - "xref": "paper", - "y": 0.3769230769230769, - "yanchor": "bottom", - "yref": "paper" - }, - { - "font": { - "size": 16 - }, - "showarrow": false, - "text": "WEEKLY PORTFOLIO RTRNS", - "x": 0.2375, - "xanchor": "center", - "xref": "paper", - "y": 0.13076923076923078, - "yanchor": "bottom", - "yref": "paper" - }, - { - "font": { - "size": 16 - }, - "showarrow": false, - "text": "MONTHLY PORTFOLIO RTRNS", - "x": 0.7625, - "xanchor": "center", - "xref": "paper", - "y": 0.13076923076923078, - "yanchor": "bottom", - "yref": "paper" - } - ], - "height": 1050, - "hovermode": "x unified", - "margin": { - "b": 20, - "l": 15, - "r": 15, - "t": 50 - }, - "paper_bgcolor": "WHITE", - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "heatmapgl": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmapgl" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "width": 1200, - "xaxis": { - "anchor": "y", - "domain": [ - 0, - 1 - ] - }, - "xaxis2": { - "anchor": "y2", - "domain": [ - 0, - 1 - ] - }, - "xaxis3": { - "anchor": "y3", - "domain": [ - 0, - 1 - ] - }, - "xaxis4": { - "anchor": "y4", - "domain": [ - 0, - 0.475 - ] - }, - "xaxis5": { - "anchor": "y5", - "domain": [ - 0.525, - 1 - ] - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0.6076923076923076, - 0.9999999999999999 - ] - }, - "yaxis2": { - "anchor": "x2", - "domain": [ - 0.42692307692307685, - 0.5576923076923076 - ] - }, - "yaxis3": { - "anchor": "x3", - "domain": [ - 0.1807692307692308, - 0.3769230769230769 - ] - }, - "yaxis4": { - "anchor": "x4", - "domain": [ - 0, - 0.13076923076923078 - ] - }, - "yaxis5": { - "anchor": "x5", - "domain": [ - 0, - 0.13076923076923078 - ] - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "pm.plot_portfolio()" - ] - }, - { - "cell_type": "code", - "execution_count": 86, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Populate Cache Dates: Start: 2017-01-01, End: 2025-05-28, Target: 2024-05-07\n", - "2025-05-28 22:59:05 QuantTools.EventDriven.riskmanager.utils CRITICAL: Data needs to be queried for 1 strikes_right. Load time ~1.5mins\n", - "Missing Ticks: []\n", - "Data List: []\n" - ] - } - ], - "source": [ - "cprofil_get_order = cProfiler(rm.OrderPicker.get_order)\n", - "candidates = cprofil_get_order(\n", - " tick = 'AMD',\n", - " date = '2024-05-07',\n", - " right = 'C',\n", - " max_close = 2,\n", - " order_settings= {'type': 'naked',\n", - " 'specifics': [{'direction': 'long',\n", - " 'rel_strike':1,\n", - " 'dte': 365,\n", - " 'moneyness_width': 0},\n", - " {'direction': 'short',\n", - " 'rel_strike': .825,\n", - " 'dte': 365,\n", - " 'moneyness_width': 0}\n", - "],\n", - " 'name': 'vertical_spread'}\n", - ")\n", - "# print(candidates[1])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## ***Completed***\n", - "- Add an if statement in calc greeks to use already saved options data for the legs (Done)\n", - "- Move analyze order to do on the next day (Done)\n", - "- Calculating Greeks EOD (Done)\n", - "- Std Dev Moves of greeks (Done)\n", - "- Fix dte reason for hold action\n", - "- Add dictionary for formatted caches to skip reformatting it (Done)\n", - "- Add False in Order_settings to return the exact/closest contract & avoid checks (Done)\n", - "- Extend retrieve_eod to use quotes whenever close i mising. (No need)- Check if leg position data already in processed_position_data risk manager to save even more time. (Done)\n", - "- Solution to Erratic Greek values. (Discuss with zino on possible solutions.) (Done)\n", - "- Have a default return for order. (Done)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## ***Notes:***\n", - "- Move analyze order to do on the next day,\n", - "- Calculating Greeks EOD (Talk More on this)\n", - "- Adding a min filter in order selection for new order picker. Now arbitrally using half close with min_total_price key" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## ***Major To-Do:***\n", - "\n", - "- Add order resolve\n", - "- Does the data for split contracts being saved make sense?\n", - "- It saves post split & pre split, joined together on post split timeseries:\n", - " - Might be a good idea to seperate it. As well as save before sizing up.\n", - "- Come out w a solution for negative values. \n", - "SKIP\n", - "- Add Option, Signal ID, Trade ID Meta, just to avoid recalling the function (Not Urgent)\n", - "- In schedule, find a more efficient way to handle the requests stuff that avoids reputting requests (Not Urgent)\n", - "- Can we extend update_greeks to take a callable for custom updates? (Not Urgent)\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## ***Going Live To-Do:***\n", - "\n", - "- Add give up message when no longer searching for orders ()\n", - "\n", - "\n", - "Future Extensions:\n", - "- Limits only work for long delta, fix for short delta.\n", - "- Change order to take up a format of \n", - " Column Long | Column Short | Column Short ....\n", - " - Each column would have to somehow be a pegged to another to keep the distance correct.\n", - " - Another option is to construct a chain based on width and known properties.\n", - "\n", - "\n", - "Pending Issues:\n", - "- The cost example is unresolved" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "ename": "NameError", - "evalue": "name 'Stock' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[1], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mStock\u001b[49m\u001b[38;5;241m.\u001b[39mclear_instances()\n\u001b[1;32m 2\u001b[0m get_ipython()\u001b[38;5;241m.\u001b[39mrun_line_magic(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlprun\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m-f Stock.__init__ Stock(\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mBAC\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m)\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", - "\u001b[0;31mNameError\u001b[0m: name 'Stock' is not defined" - ] - } - ], - "source": [ - "Stock.clear_instances()\n", - "%lprun -f Stock.__init__ Stock('BAC')\n" - ] - }, - { - "cell_type": "code", - "execution_count": 93, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " 2430344 function calls (2407955 primitive calls) in 6.614 seconds\n", - "\n", - " Ordered by: cumulative time\n", - "\n", - " ncalls tottime percall cumtime percall filename:lineno(function)\n", - " 2 0.000 0.000 6.614 3.307 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/IPython/core/interactiveshell.py:3541(run_code)\n", - " 2 0.000 0.000 6.614 3.307 {built-in method builtins.exec}\n", - " 1 0.000 0.000 6.614 6.614 /var/folders/j0/80hkbygd4lb27h9mw76gqzpw0000gn/T/ipykernel_42989/3506397735.py:1()\n", - " 1 0.015 0.015 6.614 6.614 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/backtest.py:48(run)\n", - " 2 0.000 0.000 2.492 1.246 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:494(analyze_signal)\n", - " 2 0.000 0.000 2.491 1.246 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:312(generate_order)\n", - " 1 0.000 0.000 2.486 2.486 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:352(create_order)\n", - " 1 0.000 0.000 2.485 2.485 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:411(get_order)\n", - " 2/1 0.000 0.000 2.469 2.469 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/decorators.py:41(wrapper)\n", - " 1 0.000 0.000 2.469 2.469 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:78(get_order)\n", - " 3 0.000 0.000 2.227 0.742 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/decorators.py:11(wrapper)\n", - " 1 0.000 0.000 2.220 2.220 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:769(populate_cache)\n", - " 1 0.000 0.000 2.193 2.193 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:575(populate_cache_v2)\n", - " 1 0.014 0.014 1.963 1.963 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:397(format_cache)\n", - " 2 0.005 0.002 1.949 0.974 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:411(process_cache)\n", - " 3019 0.045 0.000 1.738 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:673(to_datetime)\n", - " 167 0.021 0.000 1.688 0.010 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:643(analyze_position)\n", - " 1858 0.040 0.000 1.580 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:314(_convert_listlike_datetimes)\n", - " 169 0.008 0.000 1.204 0.007 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:786(update_timeindex)\n", - " 2124 0.008 0.000 1.153 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:1224(__getitem__)\n", - " 2124 0.023 0.000 1.145 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:1123(get)\n", - " 169 0.007 0.000 1.027 0.006 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:848(calculate_close_on_position)\n", - " 2124 0.011 0.000 1.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:254(fetch)\n", - " 338 0.015 0.000 1.008 0.003 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:928(get_latest_option_data)\n", - " 1590 0.005 0.000 0.963 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:814(__setitem__)\n", - " 1590 0.024 0.000 0.957 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:749(set)\n", - " 1858 0.380 0.000 0.856 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:126(_guess_datetime_format_for_array)\n", - " 2 0.000 0.000 0.823 0.411 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:170(values)\n", - " 2 0.003 0.001 0.823 0.411 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:171()\n", - " 4085 0.087 0.000 0.766 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:475(__new__)\n", - " 2124 0.275 0.000 0.731 0.000 {built-in method _pickle.load}\n", - " 1854 0.040 0.000 0.622 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:456(_array_strptime_with_fallback)\n", - " 2 0.000 0.000 0.612 0.306 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:839(update_fill)\n", - " 2 0.000 0.000 0.612 0.306 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:689(update_positions_on_fill)\n", - " 2 0.000 0.000 0.609 0.305 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:944(get_options_data_on_contract)\n", - " 2 0.000 0.000 0.607 0.303 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_sync.py:85(retry)\n", - " 2 0.001 0.001 0.606 0.303 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:291(retrieve_eod_ohlc)\n", - " 161 0.016 0.000 0.593 0.004 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:797(limits_check)\n", - " 2 0.000 0.000 0.531 0.265 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:95(request_from_proxy)\n", - " 2 0.000 0.000 0.531 0.265 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/api.py:14(request)\n", - " 2 0.000 0.000 0.530 0.265 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:500(request)\n", - " 2 0.000 0.000 0.523 0.262 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:673(send)\n", - " 4935 0.055 0.000 0.509 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:517(sanitize_array)\n", - " 2202 0.013 0.000 0.439 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1610(_log)\n", - " 34 0.000 0.000 0.435 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:704(readinto)\n", - " 34 0.434 0.013 0.434 0.013 {method 'recv_into' of '_socket.socket' objects}\n", - " 2020 0.014 0.000 0.426 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1479(info)\n", - " 13982 0.405 0.000 0.405 0.000 {method 'execute' of 'sqlite3.Connection' objects}\n", - " 2 0.000 0.000 0.401 0.201 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:613(send)\n", - " 2 0.000 0.000 0.400 0.200 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:594(urlopen)\n", - " 2 0.000 0.000 0.399 0.200 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:379(_make_request)\n", - " 4050 0.014 0.000 0.392 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:769(_try_cast)\n", - " 161 0.013 0.000 0.387 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:842(dte_check)\n", - " 161 0.013 0.000 0.380 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:885(moneyness_check)\n", - " 1590 0.009 0.000 0.366 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:179(store)\n", - " 1854 0.021 0.000 0.364 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1200(maybe_cast_to_datetime)\n", - " 3288 0.004 0.000 0.354 0.000 {built-in method builtins.next}\n", - " 3180 0.011 0.000 0.327 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:708(_transact)\n", - " 2 0.000 0.000 0.318 0.159 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:481(getresponse)\n", - " 2 0.000 0.000 0.317 0.159 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1351(getresponse)\n", - " 2 0.000 0.000 0.317 0.158 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:318(begin)\n", - " 2 0.000 0.000 0.316 0.158 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:285(_read_status)\n", - " 14 0.000 0.000 0.316 0.023 {method 'readline' of '_io.BufferedReader' objects}\n", - " 1610 0.004 0.000 0.289 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:141(__exit__)\n", - " 775 0.005 0.000 0.287 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1176(__getitem__)\n", - " 2202 0.005 0.000 0.281 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1636(handle)\n", - " 2202 0.010 0.000 0.273 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1690(callHandlers)\n", - " 773 0.006 0.000 0.271 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1719(_getitem_axis)\n", - " 2202 0.009 0.000 0.263 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:965(handle)\n", - " 1888 0.038 0.000 0.262 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:666(_parse)\n", - " 496 0.261 0.001 0.261 0.001 {built-in method io.open}\n", - " 1590 0.223 0.000 0.254 0.000 {built-in method _pickle.dumps}\n", - "420381/418511 0.147 0.000 0.250 0.000 {built-in method builtins.isinstance}\n", - " 2202 0.007 0.000 0.243 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/handlers.py:65(emit)\n", - " 1857 0.006 0.000 0.236 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:325(_from_sequence)\n", - " 1861 0.039 0.000 0.231 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:329(_from_sequence_not_strict)\n", - " 2202 0.005 0.000 0.231 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1216(emit)\n", - " 2202 0.010 0.000 0.226 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1098(emit)\n", - " 1782 0.010 0.000 0.199 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:292(_new_Index)\n", - " 167 0.007 0.000 0.194 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:505(analyze_positions)\n", - " 393 0.004 0.000 0.187 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4142(_take_with_is_copy)\n", - " 393 0.006 0.000 0.166 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4027(take)\n", - " 338 0.001 0.000 0.162 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1696(_get_list_axis)\n", - " 338 0.009 0.000 0.157 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:4081(argsort)\n", - " 62 0.008 0.000 0.152 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:167(keys)\n", - " 783/776 0.023 0.000 0.150 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:389(__init__)\n", - " 50304 0.037 0.000 0.149 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:2263(_iter)\n", - " 9212 0.144 0.000 0.144 0.000 {method 'fetchall' of 'sqlite3.Cursor' objects}\n", - " 50585 0.052 0.000 0.140 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:173(search)\n", - " 3 0.000 0.000 0.133 0.044 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:583(map)\n", - " 3 0.002 0.001 0.133 0.044 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:608()\n", - " 2202 0.010 0.000 0.133 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1087(flush)\n", - " 1588 0.024 0.000 0.131 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:161(submit)\n", - " 398 0.004 0.000 0.125 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:869(take)\n", - " 821/443 0.003 0.000 0.124 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/common.py:62(new_method)\n", - " 14 0.000 0.000 0.122 0.009 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:890(content)\n", - " 20 0.000 0.000 0.122 0.006 {method 'join' of 'bytes' objects}\n", - " 12 0.000 0.000 0.122 0.010 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:816(generate)\n", - " 12 0.000 0.000 0.122 0.010 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:1038(stream)\n", - " 10 0.000 0.000 0.122 0.012 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:910(read)\n", - " 12 0.000 0.000 0.121 0.010 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:858(_raw_read)\n", - " 12 0.000 0.000 0.120 0.010 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:801(_fp_read)\n", - " 12 0.000 0.000 0.120 0.010 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:457(read)\n", - " 10 0.000 0.000 0.119 0.012 {method 'read' of '_io.BufferedReader' objects}\n", - " 1 0.000 0.000 0.118 0.118 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:998(produce_order_candidates)\n", - " 2 0.001 0.000 0.118 0.059 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:853(chain_details)\n", - " 2202 0.115 0.000 0.115 0.000 {method 'flush' of '_io.TextIOWrapper' objects}\n", - " 1081 0.011 0.000 0.112 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1095(__getitem__)\n", - " 6 0.000 0.000 0.111 0.018 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:4789(apply)\n", - " 6 0.000 0.000 0.111 0.018 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1409(apply)\n", - " 6 0.000 0.000 0.110 0.018 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1482(apply_standard)\n", - " 74 0.002 0.000 0.110 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:312(remove)\n", - " 6 0.000 0.000 0.109 0.018 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:891(_map_values)\n", - " 6 0.001 0.000 0.109 0.018 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:1667(map_array)\n", - " 1854 0.023 0.000 0.107 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1240(_ensure_nanosecond_dtype)\n", - " 2202 0.007 0.000 0.106 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1595(makeRecord)\n", - " 666 0.008 0.000 0.104 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:3983(_ixs)\n", - " 1888 0.015 0.000 0.104 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:199(split)\n", - " 370 0.005 0.000 0.103 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4062(__getitem__)\n", - " 61346 0.072 0.000 0.101 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:272(_compile)\n", - " 360 0.009 0.000 0.100 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:1371(_arith_method)\n", - " 2202 0.049 0.000 0.098 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:292(__init__)\n", - " 74 0.017 0.000 0.098 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:230(_write)\n", - " 1588 0.008 0.000 0.097 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:180(_adjust_thread_count)\n", - " 340 0.001 0.000 0.097 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:192(__sub__)\n", - " 3719 0.018 0.000 0.097 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2428(maybe_convert_dtype)\n", - " 1590 0.009 0.000 0.096 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:877(_cull)\n", - " 342 0.001 0.000 0.096 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7227(_arith_method)\n", - " 1861 0.024 0.000 0.093 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2184(_sequence_to_dt64)\n", - " 2928 0.011 0.000 0.093 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5373(__getitem__)\n", - " 2606 0.013 0.000 0.091 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:373(__getitem__)\n", - " 3872 0.029 0.000 0.084 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:346(_name_get)\n", - " 2202 0.004 0.000 0.081 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:942(format)\n", - " 2 0.000 0.000 0.081 0.041 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:365(request)\n", - " 4 0.000 0.000 0.081 0.020 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:988(send)\n", - " 2 0.000 0.000 0.081 0.040 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1287(endheaders)\n", - " 2 0.000 0.000 0.081 0.040 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1049(_send_output)\n", - " 46947 0.037 0.000 0.081 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/generic.py:42(_instancecheck)\n", - " 2 0.000 0.000 0.081 0.040 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:278(connect)\n", - " 2 0.000 0.000 0.081 0.040 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:193(_new_conn)\n", - " 2 0.000 0.000 0.080 0.040 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/connection.py:27(create_connection)\n", - " 2 0.079 0.040 0.079 0.040 {method 'connect' of '_socket.socket' objects}\n", - " 2202 0.016 0.000 0.078 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:674(format)\n", - " 5540 0.009 0.000 0.075 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:189(__next__)\n", - " 3768 0.074 0.000 0.074 0.000 {method 'acquire' of '_thread.lock' objects}\n", - " 2608 0.013 0.000 0.073 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:278(__getitem__)\n", - " 400 0.006 0.000 0.070 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:623(reindex_indexer)\n", - " 1610 0.002 0.000 0.069 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:132(__enter__)\n", - " 338 0.004 0.000 0.068 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1543(to_series)\n", - " 1910 0.019 0.000 0.068 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:875(_parse_numeric_token)\n", - " 1589 0.003 0.000 0.066 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:825(_row_update)\n", - " 1588 0.008 0.000 0.066 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:440(acquire)\n", - " 5540 0.043 0.000 0.066 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:77(get_token)\n", - " 684 0.007 0.000 0.063 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:988(parse_option_tick)\n", - " 7511 0.047 0.000 0.062 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:649(_simple_new)\n", - " 2317 0.005 0.000 0.062 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:913(__init__)\n", - " 1936 0.040 0.000 0.061 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:2188(__setstate__)\n", - " 1 0.000 0.000 0.060 0.060 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:442(update_spot_cache)\n", - " 1590 0.007 0.000 0.060 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:2327(volume)\n", - " 1 0.001 0.001 0.060 0.060 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:646()\n", - " 20 0.001 0.000 0.058 0.003 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:178()\n", - " 74 0.001 0.000 0.058 0.001 :232(removedirs)\n", - " 743 0.005 0.000 0.058 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1220(_get_value)\n", - " 20 0.001 0.000 0.058 0.003 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:954(available_close_check)\n", - " 6799/556 0.023 0.000 0.058 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:128(deepcopy)\n", - " 2197 0.034 0.000 0.057 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:545(_box_func)\n", - " 1777 0.014 0.000 0.056 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:935(_verify_integrity)\n", - " 1 0.000 0.000 0.055 0.055 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/threads.py:4(runThreads)\n", - " 338 0.009 0.000 0.055 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1651(abs)\n", - " 205 0.055 0.000 0.055 0.000 {built-in method posix.rmdir}\n", - " 388 0.003 0.000 0.054 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:687()\n", - " 3 0.000 0.000 0.054 0.018 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:646(__exit__)\n", - " 3 0.000 0.000 0.054 0.018 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:216(shutdown)\n", - " 32 0.000 0.000 0.054 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1087(join)\n", - " 51 0.000 0.000 0.054 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1125(_wait_for_tstate_lock)\n", - " 963 0.006 0.000 0.052 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1287(take_nd)\n", - " 167 0.003 0.000 0.052 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/eventScheduler.py:88(advance_date)\n", - " 3738 0.018 0.000 0.049 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1163(is_float_dtype)\n", - " 1867 0.019 0.000 0.049 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:231(asarray_tuplesafe)\n", - " 337 0.005 0.000 0.049 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:582(get_loc)\n", - " 1 0.001 0.001 0.048 0.048 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:645()\n", - " 74 0.048 0.001 0.048 0.001 {built-in method posix.remove}\n", - " 50511 0.036 0.000 0.047 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/generic.py:37(_check)\n", - " 4458 0.008 0.000 0.047 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_strptime.py:26(_getlang)\n", - " 20 0.000 0.000 0.047 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:168()\n", - " 20 0.002 0.000 0.046 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:1053(liquidity_check)\n", - " 360 0.002 0.000 0.046 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1025(argsort)\n", - " 701/363 0.003 0.000 0.045 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:53(_wrapfunc)\n", - "1021/1015 0.004 0.000 0.045 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:59(take_nd)\n", - " 338 0.003 0.000 0.042 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/base.py:800(argsort)\n", - " 1 0.001 0.001 0.042 0.042 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:640()\n", - " 346 0.014 0.000 0.041 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:958(fast_xs)\n", - " 10288 0.010 0.000 0.041 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:646(_sql)\n", - " 2096 0.016 0.000 0.041 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:73(_new_DatetimeIndex)\n", - " 8529 0.026 0.000 0.041 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6301(__setattr__)\n", - "92315/79894 0.031 0.000 0.040 0.000 {built-in method builtins.len}\n", - " 95 0.001 0.000 0.040 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4130(_getitem_bool_array)\n", - " 8060 0.022 0.000 0.040 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2716(new_block)\n", - " 5132 0.008 0.000 0.040 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:163(match)\n", - " 1073 0.024 0.000 0.040 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3777(get_loc)\n", - " 684 0.002 0.000 0.040 0.000 {built-in method strptime}\n", - " 2202 0.016 0.000 0.039 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1561(findCaller)\n", - " 750 0.005 0.000 0.039 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_strptime.py:564(_strptime_datetime)\n", - " 1013 0.014 0.000 0.039 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:120(_take_nd_ndarray)\n", - " 4458 0.009 0.000 0.039 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/locale.py:594(getlocale)\n", - " 5186 0.004 0.000 0.038 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:271(__enter__)\n", - "117860/117856 0.036 0.000 0.038 0.000 {built-in method builtins.getattr}\n", - " 401 0.005 0.000 0.038 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:317(apply)\n", - "5988/5635 0.011 0.000 0.038 0.000 {built-in method numpy.asarray}\n", - " 2202 0.005 0.000 0.037 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:606(formatTime)\n", - " 7785 0.020 0.000 0.036 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2645(maybe_coerce_values)\n", - " 338 0.002 0.000 0.036 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4342(_getitem_slice)\n", - " 1568 0.006 0.000 0.036 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6284(__getattr__)\n", - " 1861 0.010 0.000 0.035 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2425(ensure_arraylike_for_datetimelike)\n", - " 1652 0.008 0.000 0.035 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:2370(reset)\n", - " 360 0.001 0.000 0.035 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:240(arithmetic_op)\n", - " 874 0.004 0.000 0.035 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:295(wait)\n", - " 6732 0.019 0.000 0.035 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1596(pandas_dtype)\n", - " 750 0.021 0.000 0.034 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_strptime.py:309(_strptime)\n", - " 562/387 0.005 0.000 0.034 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:227(_deepcopy_dict)\n", - " 342 0.005 0.000 0.034 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7218(_construct_result)\n", - " 6316 0.011 0.000 0.034 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1375(_is_dtype)\n", - " 50611 0.034 0.000 0.034 0.000 {method 'search' of 're.Pattern' objects}\n", - " 3872 0.010 0.000 0.033 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:330(_name_includes_bit_suffix)\n", - " 295 0.002 0.000 0.032 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4626(_get_item_cache)\n", - " 4286 0.013 0.000 0.032 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1198(is_bool_dtype)\n", - " 2010 0.032 0.000 0.032 0.000 {method '__enter__' of '_thread.lock' objects}\n", - " 5604 0.025 0.000 0.032 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:428(append)\n", - " 4879 0.010 0.000 0.032 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7688(maybe_extract_name)\n", - " 2 0.000 0.000 0.032 0.016 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:10170(apply)\n", - " 2 0.000 0.000 0.032 0.016 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:864(apply)\n", - " 2 0.000 0.000 0.032 0.016 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1061(apply_standard)\n", - " 340 0.001 0.000 0.031 0.000 {built-in method _operator.sub}\n", - " 182 0.001 0.000 0.031 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1491(warning)\n", - " 338 0.002 0.000 0.031 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1087(_slice)\n", - " 10288 0.020 0.000 0.031 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:608(_con)\n", - " 2 0.000 0.000 0.031 0.015 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1070(apply_series_generator)\n", - " 820 0.010 0.000 0.030 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:1054(is_USholiday)\n", - " 496 0.030 0.000 0.030 0.000 {method '__exit__' of '_io._IOBase' objects}\n", - " 338 0.003 0.000 0.029 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1422(__sub__)\n", - " 1591 0.004 0.000 0.029 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:612(result_iterator)\n", - " 2441 0.014 0.000 0.029 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:82(shape)\n", - " 518 0.004 0.000 0.029 0.000 {built-in method builtins.print}\n", - " 20 0.000 0.000 0.028 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:939()\n", - " 2291 0.021 0.000 0.028 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6236(__finalize__)\n", - " 15625 0.028 0.000 0.028 0.000 {method 'write' of '_io.BufferedWriter' objects}\n", - " 340 0.003 0.000 0.027 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:387(apply)\n", - " 5500 0.008 0.000 0.027 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1851(_frombuffer)\n", - " 378 0.005 0.000 0.027 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:823(take)\n", - " 3 0.000 0.000 0.027 0.009 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_decorators.py:325(wrapper)\n", - " 690 0.014 0.000 0.026 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:842(_engine)\n", - " 2 0.000 0.000 0.026 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1204(__repr__)\n", - " 40 0.001 0.000 0.026 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:1022(generate_option_tick_new)\n", - " 338 0.003 0.000 0.026 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1126(_sub_datetimelike_scalar)\n", - " 2 0.000 0.000 0.026 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1310(to_string)\n", - " 41484 0.017 0.000 0.026 0.000 {built-in method builtins.issubclass}\n", - " 2 0.000 0.000 0.026 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:939(to_string)\n", - " 2 0.000 0.000 0.026 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/string.py:28(to_string)\n", - " 2 0.000 0.000 0.026 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/string.py:40(_get_string_representation)\n", - " 1588 0.007 0.000 0.025 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:314(_result_or_cancel)\n", - " 1376 0.015 0.000 0.025 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:655(write)\n", - " 2539 0.005 0.000 0.025 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:536(is_string_dtype)\n", - " 131/74 0.001 0.000 0.024 0.000 :200(makedirs)\n", - " 4458 0.008 0.000 0.024 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/locale.py:479(_parse_localename)\n", - " 341 0.012 0.000 0.024 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:369(nargsort)\n", - " 2 0.000 0.000 0.024 0.012 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/string.py:34(_get_strcols)\n", - " 2 0.000 0.000 0.024 0.012 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:472(get_strcols)\n", - " 36 0.001 0.000 0.024 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4271(__setitem__)\n", - " 3803 0.011 0.000 0.023 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numerictypes.py:357(issubdtype)\n", - " 1858 0.005 0.000 0.023 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:208(findall)\n", - " 2 0.000 0.000 0.023 0.011 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:704(_get_strcols_without_index)\n", - " 36 0.000 0.000 0.023 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4514(_set_item)\n", - " 49 0.001 0.000 0.022 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1347(insert)\n", - " 3771 0.003 0.000 0.022 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:225(compile)\n", - " 775 0.003 0.000 0.022 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5437(_can_hold_identifiers_and_holds_name)\n", - " 11335 0.009 0.000 0.022 0.000 :117(__instancecheck__)\n", - " 32 0.000 0.000 0.022 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:945(start)\n", - " 4085 0.014 0.000 0.021 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:609(_dtype_to_subclass)\n", - " 50176 0.021 0.000 0.021 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:165(get)\n", - " 698/344 0.006 0.000 0.021 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:259(_reconstruct)\n", - " 1013 0.006 0.000 0.021 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:564(_take_preprocess_indexer_and_fill_value)\n", - " 1568 0.011 0.000 0.020 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:2176(__getstate__)\n", - " 338 0.005 0.000 0.020 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1974(get_slice)\n", - " 32 0.000 0.000 0.020 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:611(wait)\n", - " 1508 0.020 0.000 0.020 0.000 {cyfunction Timestamp.strftime at 0x1199445f0}\n", - " 338 0.009 0.000 0.020 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1158(_sub_datetimelike)\n", - " 1670 0.003 0.000 0.020 0.000 {method 'any' of 'numpy.ndarray' objects}\n", - " 131 0.020 0.000 0.020 0.000 {built-in method posix.mkdir}\n", - " 4 0.000 0.000 0.020 0.005 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Context.py:16(Context)\n", - " 36 0.001 0.000 0.019 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4481(_set_item_mgr)\n", - " 1888 0.012 0.000 0.019 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:221(__init__)\n", - " 6606 0.012 0.000 0.019 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:194(_is_internal_frame)\n", - " 402 0.010 0.000 0.019 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:239(maybe_convert_indices)\n", - " 776 0.006 0.000 0.019 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1863(from_array)\n", - " 28 0.000 0.000 0.018 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:751(format_col)\n", - " 1876 0.014 0.000 0.018 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:474(resolve_ymd)\n", - " 1458 0.002 0.000 0.018 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:101(isna)\n", - " 430 0.001 0.000 0.018 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:511(_validate_dtype)\n", - " 4898 0.010 0.000 0.018 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1434(_is_dtype_type)\n", - " 2002 0.018 0.000 0.018 0.000 {method 'reduce' of 'numpy.ufunc' objects}\n", - " 1861 0.012 0.000 0.018 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2514(_validate_dt64_dtype)\n", - " 1863 0.017 0.000 0.018 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:304(_simple_new)\n", - " 14100 0.015 0.000 0.018 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:481(ensure_wrapped_if_datetimelike)\n", - " 8153 0.013 0.000 0.017 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2674(get_block_type)\n", - " 338 0.002 0.000 0.017 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2191(__array_ufunc__)\n", - " 1670 0.002 0.000 0.017 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:55(_any)\n", - " 399 0.002 0.000 0.017 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5425(_getitem_slice)\n", - " 2668 0.014 0.000 0.017 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:278(__init__)\n", - " 1068 0.003 0.000 0.017 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:145(_get_option)\n", - " 1873 0.005 0.000 0.017 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:339(_from_mgr)\n", - " 4458 0.012 0.000 0.017 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/locale.py:396(normalize)\n", - " 342 0.001 0.000 0.017 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:378(interleaved_dtype)\n", - " 401 0.005 0.000 0.016 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1146(take)\n", - " 2097 0.004 0.000 0.016 0.000 {built-in method builtins.sum}\n", - " 2202 0.016 0.000 0.016 0.000 {built-in method time.strftime}\n", - " 1458 0.005 0.000 0.016 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:184(_isna)\n", - " 883 0.004 0.000 0.016 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:97(is_bool_indexer)\n", - " 349 0.006 0.000 0.016 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1433(find_common_type)\n", - " 2202 0.007 0.000 0.016 0.000 :117(splitext)\n", - " 2202 0.016 0.000 0.016 0.000 {built-in method time.localtime}\n", - " 2043 0.015 0.000 0.015 0.000 {built-in method numpy.array}\n", - " 338 0.005 0.000 0.015 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/base.py:2276(__array_ufunc__)\n", - " 2237 0.015 0.000 0.015 0.000 {method 'view' of 'numpy.generic' objects}\n", - " 7323 0.005 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:84()\n", - " 2625 0.013 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:467(__enter__)\n", - " 2202 0.008 0.000 0.014 0.000 :140(basename)\n", - " 4914 0.010 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:696(_sanitize_ndim)\n", - " 32 0.000 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1079(format_array)\n", - " 5948 0.014 0.000 0.014 0.000 {method 'match' of 're.Pattern' objects}\n", - " 2202 0.003 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:658(formatMessage)\n", - " 3712 0.007 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:178(_datetime_metadata_str)\n", - " 2 0.000 0.000 0.014 0.007 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:1065(change_to_last_busday)\n", - " 315 0.004 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2313(is_unique)\n", - " 49 0.001 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6956(insert)\n", - " 2539 0.010 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:572(condition)\n", - " 5186 0.012 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:274(__exit__)\n", - " 1588 0.007 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:428(result)\n", - " 56 0.000 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6662(copy)\n", - " 378 0.005 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:141(equals)\n", - " 8180 0.011 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:416(extract_array)\n", - " 1652 0.004 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:662(_execute_with_retry)\n", - " 11335 0.013 0.000 0.013 0.000 {built-in method _abc._abc_instancecheck}\n", - " 32 0.000 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1193(get_result)\n", - " 1888 0.012 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:62(__init__)\n", - " 320 0.002 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4608(_box_col_values)\n", - " 1275 0.006 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:419(check_array_indexer)\n", - " 7606 0.008 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numerictypes.py:283(issubclass_)\n", - " 8215 0.007 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:937()\n", - " 666 0.003 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:678(_constructor_sliced_from_mgr)\n", - " 338 0.002 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/numpy/function.py:159(validate_argsort_with_ascending)\n", - " 25263 0.011 0.000 0.012 0.000 {built-in method builtins.hasattr}\n", - " 59 0.001 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:557(copy)\n", - " 16924 0.009 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:208(isnum)\n", - " 46 0.000 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12498(sum)\n", - " 4085 0.011 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:591(_ensure_array)\n", - " 5 0.000 0.000 0.011 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6239(reset_index)\n", - " 2202 0.003 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:447(format)\n", - " 46 0.000 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12459(_min_count_stat_function)\n", - " 5728 0.008 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:193(__get__)\n", - " 976 0.010 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:551(maybe_promote)\n", - " 61 0.001 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6201(_construct_result)\n", - " 11370 0.007 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:909(__len__)\n", - " 320 0.005 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1012(iget)\n", - " 5978 0.010 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1331(is_ea_or_datetimelike_dtype)\n", - " 32563 0.011 0.000 0.011 0.000 {method 'get' of 'dict' objects}\n", - " 3760 0.007 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2537(dtype_to_unit)\n", - " 4404 0.007 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:922(acquire)\n", - " 2 0.000 0.000 0.010 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6731(drop_duplicates)\n", - " 682 0.002 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:664(_constructor_from_mgr)\n", - " 1174 0.002 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/numpy/function.py:64(__call__)\n", - " 1858 0.010 0.000 0.010 0.000 {method 'findall' of 're.Pattern' objects}\n", - " 800 0.003 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:807(_set_axis)\n", - " 10602 0.007 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1399(_get_dtype)\n", - " 344 0.003 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1605(maybe_cast_to_integer_array)\n", - " 676 0.001 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:833(isna)\n", - " 6877 0.007 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:334(is_hashable)\n", - " 1903 0.004 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2152(unit)\n", - " 5500 0.010 0.000 0.010 0.000 {built-in method numpy.frombuffer}\n", - " 1952 0.009 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1141(_to_decimal)\n", - " 716 0.007 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:836(_isnan)\n", - " 720 0.004 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:33(seterr)\n", - " 38 0.000 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6110(_cmp_method)\n", - " 340 0.002 0.000 0.009 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/eventScheduler.py:27(get_nowait)\n", - " 1080 0.004 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:127(_get_single_key)\n", - " 57 0.001 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:674(_with_infer)\n", - " 160 0.003 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1913(__setstate__)\n", - " 3564 0.005 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/generic.py:46(_subclasscheck)\n", - " 2891 0.007 0.000 0.009 0.000 :1207(_handle_fromlist)\n", - " 1462 0.003 0.000 0.009 0.000 {built-in method builtins.any}\n", - " 2 0.000 0.000 0.009 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:868(read_csv)\n", - " 5574 0.009 0.000 0.009 0.000 {method 'reshape' of 'numpy.ndarray' objects}\n", - " 97 0.000 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2632(check_bool_indexer)\n", - " 844 0.003 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:784(name)\n", - " 2 0.000 0.000 0.009 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:583(_read)\n", - " 1610 0.003 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:299(helper)\n", - " 787 0.004 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:390(_get_getitem_freq)\n", - " 376 0.001 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:261(_isna_array)\n", - " 338 0.004 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:168(validate_args_and_kwargs)\n", - " 12 0.000 0.000 0.008 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:694(__init__)\n", - " 3 0.000 0.000 0.008 0.003 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager.py:365(_schedule)\n", - " 2226 0.005 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2765(check_dict_or_set_indexers)\n", - " 1888 0.008 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:395(__init__)\n", - " 1044 0.003 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:137(is_object_dtype)\n", - " 874 0.008 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:280(_release_save)\n", - " 6 0.000 0.000 0.008 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:11661(sum)\n", - " 83/43 0.000 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:50(__le__)\n", - " 2202 0.008 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:440(_format)\n", - " 1568 0.004 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:2184()\n", - " 10 0.000 0.000 0.008 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6186(_get_indexer_strict)\n", - " 294 0.003 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/ipkernel.py:775(_clean_thread_parent_frames)\n", - " 1588 0.002 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:328(__init__)\n", - " 9624 0.008 0.000 0.008 0.000 {built-in method __new__ of type object at 0x10dfb6898}\n", - " 1847 0.002 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7593(ensure_index)\n", - " 6 0.000 0.000 0.008 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:11435(_reduce)\n", - " 2202 0.003 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:652(usesTime)\n", - " 2 0.000 0.000 0.008 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6828(duplicated)\n", - " 360 0.001 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:430(__enter__)\n", - " 718 0.005 0.000 0.008 0.000 :71(join)\n", - " 2202 0.006 0.000 0.008 0.000 :121(_splitext)\n", - " 2 0.000 0.000 0.008 0.004 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:43(schedule_kwargs)\n", - " 2 0.000 0.000 0.008 0.004 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager.py:266(schedule)\n", - " 340 0.001 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:193(get_nowait)\n", - " 40 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7164(_cmp_method)\n", - " 24336 0.007 0.000 0.007 0.000 {built-in method builtins.setattr}\n", - " 14 0.000 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1471(_format_strings)\n", - " 1 0.000 0.000 0.007 0.007 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:208()\n", - " 2660 0.007 0.000 0.007 0.000 {method 'view' of 'numpy.ndarray' objects}\n", - " 14 0.000 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1343(get_result_as_array)\n", - " 2 0.000 0.000 0.007 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1907(read)\n", - " 7575 0.007 0.000 0.007 0.000 {method 'format' of 'str' objects}\n", - " 364 0.004 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:154(get)\n", - "1921/1919 0.003 0.000 0.007 0.000 {built-in method builtins.all}\n", - " 386 0.002 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:157(take)\n", - " 13 0.000 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5095(insert)\n", - " 28 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3820(get_indexer)\n", - " 7542 0.007 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:831(_reset_identity)\n", - " 92 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:209()\n", - " 338 0.004 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:716(__abs__)\n", - " 3722 0.005 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2570(_validate_tz_from_dtype)\n", - " 3000 0.005 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:576(tz)\n", - " 9353 0.007 0.000 0.007 0.000 {built-in method numpy.datetime_data}\n", - " 525 0.001 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:659(_constructor_from_mgr)\n", - " 1818 0.002 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:319(asi8)\n", - " 5 0.000 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:423(dict_to_mgr)\n", - " 1876 0.005 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:380(validate)\n", - " 3 0.000 0.000 0.006 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager.py:323(is_already_scheduled)\n", - " 6606 0.005 0.000 0.006 0.000 :52(normcase)\n", - " 1700 0.002 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:831(_values)\n", - " 421/417 0.002 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:1131(take)\n", - " 1629 0.004 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:243(__init__)\n", - " 760 0.003 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:182(_add_filter)\n", - " 83/43 0.001 0.000 0.006 0.000 {built-in method _operator.le}\n", - " 1 0.000 0.000 0.006 0.006 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:601(calculate_quantity)\n", - " 66 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1782(_consolidate_inplace)\n", - " 853 0.002 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1571(validate_all_hashable)\n", - " 519 0.003 0.000 0.006 0.000 {method '__reduce_ex__' of 'object' objects}\n", - " 14 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1397(format_values_with)\n", - " 18 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6133(_arith_method)\n", - " 1652 0.002 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:650(_sql_retry)\n", - " 5 0.000 0.000 0.006 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6997(sort_values)\n", - " 499 0.004 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5323(__contains__)\n", - " 16 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6162(get_indexer_for)\n", - " 1936 0.003 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:401(attrs)\n", - " 61 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1756(_get_slice_axis)\n", - " 40 0.001 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:977(_cmp_method)\n", - " 393 0.002 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:131(filterwarnings)\n", - " 9818 0.006 0.000 0.006 0.000 {built-in method time.time}\n", - " 4604 0.006 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/flags.py:51(__init__)\n", - " 1610 0.005 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:104(__init__)\n", - " 4404 0.004 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:929(release)\n", - " 792 0.004 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:180(blknos)\n", - " 3 0.000 0.000 0.006 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/Requests.py:40(construct_request_name)\n", - " 1326 0.004 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:734(name)\n", - " 340 0.001 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:414(_split_op_result)\n", - " 800 0.002 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:236(set_axis)\n", - " 1588 0.003 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:364(cancel)\n", - " 4 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:157(concat)\n", - " 4799 0.004 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:123()\n", - " 4458 0.005 0.000 0.005 0.000 {built-in method _locale.setlocale}\n", - " 320 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1928()\n", - " 2202 0.004 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/handlers.py:354(shouldRollover)\n", - " 61 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4361(_slice)\n", - " 4799 0.005 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:121(classes)\n", - " 348 0.002 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:274(make_block)\n", - " 2 0.000 0.000 0.005 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:750(merge_environment_settings)\n", - " 20 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:42(__ne__)\n", - " 3334 0.003 0.000 0.005 0.000 :41(_get_sep)\n", - " 743 0.002 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:769(_assert_tzawareness_compat)\n", - " 2625 0.004 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:488(__exit__)\n", - " 2 0.000 0.000 0.005 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:826(get_environ_proxies)\n", - " 2202 0.003 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:432(usesTime)\n", - " 16 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:708(_slice_take_blocks_ax0)\n", - " 676 0.005 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:211(_simple_new)\n", - " 2202 0.003 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:164()\n", - " 4 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:622(get_result)\n", - " 32 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:610(factorize)\n", - " 40 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:309(get_option_specifics_from_key)\n", - " 367 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:166(simplefilter)\n", - " 513 0.002 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:773(_view)\n", - " 160 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1914(unpickle_block)\n", - " 3802 0.003 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:203(isword)\n", - " 371 0.005 0.000 0.005 0.000 {method 'argsort' of 'numpy.ndarray' objects}\n", - " 11875 0.005 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:551(dtype)\n", - " 2134 0.004 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:243(_keep_alive)\n", - " 356 0.004 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2353(copy)\n", - " 30 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1689(_getitem_tuple)\n", - " 3740 0.004 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:139(put)\n", - " 1076 0.003 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:635(_get_root)\n", - " 13866 0.004 0.000 0.004 0.000 {built-in method posix.getpid}\n", - " 14 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1805(_trim_zeros_float)\n", - " 360 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:435(__exit__)\n", - " 2625 0.004 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:441(__init__)\n", - " 12638 0.004 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:266(mgr_locs)\n", - " 1966 0.002 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/extension.py:67(fget)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:574(update_greek_limits)\n", - " 28 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6925(f)\n", - " 1568 0.004 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2787(__reduce__)\n", - " 7016 0.004 0.000 0.004 0.000 {method 'rfind' of 'str' objects}\n", - " 18120 0.004 0.000 0.004 0.000 {method 'read' of '_io.StringIO' objects}\n", - " 342 0.004 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1392(np_find_common_type)\n", - " 410 0.003 0.000 0.004 0.000 :100(split)\n", - " 1700 0.003 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2004(internal_values)\n", - " 22907 0.004 0.000 0.004 0.000 {method 'isdigit' of 'str' objects}\n", - " 12 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2259(_consolidate)\n", - " 2202 0.003 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:123(getLevelName)\n", - " 4 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5993(set_index)\n", - " 12 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1322(__contains__)\n", - " 800 0.002 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:86(_validate_set_axis)\n", - " 32 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:548(factorize_array)\n", - " 74 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:286(filename)\n", - " 12 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2982(get_loc)\n", - " 2266 0.003 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1453(current_thread)\n", - " 62 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3122(duplicated)\n", - " 62 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1726(_make_fixed_width)\n", - " 2 0.000 0.000 0.004 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1397(_getitem_axis)\n", - " 12 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:3308(_get_level_indexer)\n", - " 2 0.000 0.000 0.004 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:78(method)\n", - " 2 0.000 0.000 0.004 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:736(map)\n", - " 2 0.000 0.000 0.004 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1205(_getbool_axis)\n", - " 403 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/common.py:81(get_op_result_name)\n", - " 1568 0.002 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/flags.py:100(__getitem__)\n", - " 147 0.002 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/ipkernel.py:790()\n", - " 338 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:141(validate_kwargs)\n", - " 4404 0.004 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:815(filter)\n", - " 4 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2499(getproxies_environment)\n", - " 1376 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:577(_schedule_flush)\n", - " 3722 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1194()\n", - " 338 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4201(_convert_slice_indexer)\n", - " 1861 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2310(_construct_from_dt64_naive)\n", - " 821 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:568(require_length_match)\n", - " 167 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/event.py:30(__str__)\n", - " 720 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:132(geterr)\n", - " 40 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6519(sum)\n", - " 340 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copyreg.py:113(_slotnames)\n", - " 12 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2957(_get_loc_single_level_index)\n", - " 1253 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:264()\n", - " 4 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5636(rename)\n", - " 12 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:38(__eq__)\n", - " 309 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5170(_get_engine_target)\n", - " 135 0.000 0.000 0.003 0.000 :16(exists)\n", - " 49 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5368(insert)\n", - " 13517 0.003 0.000 0.003 0.000 {method 'append' of 'list' objects}\n", - " 4 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1070(_rename)\n", - " 1373 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:586(_get_axis)\n", - " 756 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:108(asi8)\n", - " 325 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:571(_disallow_mismatched_indexing)\n", - " 110 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1157(maybe_infer_to_datetimelike)\n", - " 2243 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2148(_creso)\n", - " 38 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:262(_get_hashtable_algo)\n", - " 4421 0.003 0.000 0.003 0.000 {method 'acquire' of '_thread.RLock' objects}\n", - " 676 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/base.py:2277()\n", - " 5728 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:1257(value)\n", - " 30 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1032(_getitem_lowerdim)\n", - " 2291 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/flags.py:87(allows_duplicate_labels)\n", - " 353 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:978(__array__)\n", - " 276 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:273(__call__)\n", - " 1568 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:406(__reduce__)\n", - " 688 0.001 0.000 0.003 0.000 :859(__iter__)\n", - " 2292 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:372(apply_if_callable)\n", - " 47 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6418(_reduce)\n", - " 12142 0.003 0.000 0.003 0.000 {built-in method posix.fspath}\n", - " 411 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1006(_find_hms_idx)\n", - " 12 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:558(_parse_with_reso)\n", - " 6 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:3951(T)\n", - " 740 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1816(is_number_with_decimal)\n", - " 394 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:728(is_valid_na_for_dtype)\n", - " 3715 0.003 0.000 0.003 0.000 {method 'find' of 'str' objects}\n", - " 6 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:3767(transpose)\n", - " 1863 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:103(tz_to_dtype)\n", - " 12 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:275(_parse_with_reso)\n", - " 8 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:208(__truediv__)\n", - " 1037 0.003 0.000 0.003 0.000 {method 'copy' of 'numpy.ndarray' objects}\n", - " 3872 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:24(_kind_name)\n", - " 2418 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/__init__.py:34(using_copy_on_write)\n", - " 797 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:707(dtype)\n", - " 2924 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:152(cast_scalar_indexer)\n", - " 2206 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1734(isEnabledFor)\n", - " 135 0.003 0.000 0.003 0.000 {built-in method posix.stat}\n", - " 46 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:76(_f)\n", - " 1876 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:482()\n", - " 7390 0.003 0.000 0.003 0.000 {built-in method builtins.hash}\n", - " 19 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:259(schedule)\n", - " 2577 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:529(is_string_or_object_np_dtype)\n", - " 4070 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1253(iget)\n", - " 10 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4323(reindex)\n", - " 1680 0.003 0.000 0.003 0.000 {built-in method numpy.empty}\n", - " 10 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1197(_format_strings)\n", - " 6 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1483(reduce)\n", - " 62 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:2360(__len__)\n", - " 11 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6432(dtypes)\n", - " 2374 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:735(_sanitize_str_dtypes)\n", - " 404 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1667(_validate_integer)\n", - " 49 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5242(_sanitize_column)\n", - " 2 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:765(should_bypass_proxies)\n", - " 6444 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1249(shape)\n", - " 1080 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:676(_translate_key)\n", - " 64 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:2296(__iter__)\n", - " 4732 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:176(dtype)\n", - " 971 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:292(make_block_same_class)\n", - " 2202 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:368(getMessage)\n", - " 760 0.003 0.000 0.003 0.000 {method 'remove' of 'list' objects}\n", - " 2 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2672(proxy_bypass)\n", - " 54 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:586()\n", - " 6 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:96(arrays_to_mgr)\n", - " 28 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6679(_maybe_cast_listlike_indexer)\n", - " 407 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:745(_get_engine_target)\n", - " 19 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/zmq/sugar/socket.py:621(send)\n", - " 30 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6957()\n", - " 26 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:1255(__contains__)\n", - " 341 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1881(nonzero)\n", - " 4 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:94(concatenate_managers)\n", - " 4914 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:758(_maybe_repeat)\n", - " 108 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:583(copy_func)\n", - " 800 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4379(_set_is_copy)\n", - " 320 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1471(_set_as_cached)\n", - " 463 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:948(from_blocks)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5433(drop)\n", - " 7 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:607(_init_dict)\n", - " 9537 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:2287(cast)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4757(drop)\n", - " 38 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:288(comparison_op)\n", - " 37 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1819(should_trim)\n", - " 38 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:106(_ensure_data)\n", - " 7730 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:405(flags)\n", - " 1714 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1590()\n", - " 6090 0.002 0.000 0.002 0.000 {built-in method _thread.get_ident}\n", - " 360 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:507(maybe_prepare_scalar_for_op)\n", - " 403 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/dispatch.py:17(should_extension_dispatch)\n", - " 352 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:201(_deepcopy_list)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:194(setdefault)\n", - " 1376 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:550(_is_master_process)\n", - " 33 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1496(items)\n", - " 797 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1993(dtype)\n", - " 343 0.002 0.000 0.002 0.000 {built-in method numpy.arange}\n", - " 2124 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1837(__init__)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4796(_drop_axis)\n", - " 209 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:274(full)\n", - " 4312 0.002 0.000 0.002 0.000 {method 'items' of 'dict' objects}\n", - " 322 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:361()\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2685(getproxies)\n", - " 48 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:389(new_func)\n", - " 11107 0.002 0.000 0.002 0.000 {built-in method builtins.id}\n", - " 742 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:62(is_list_like_indexer)\n", - " 4 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4477(__delitem__)\n", - " 36 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2276(_merge_blocks)\n", - " 2266 0.002 0.000 0.002 0.000 {method 'astype' of 'numpy.ndarray' objects}\n", - " 522 0.002 0.000 0.002 0.000 {method '__deepcopy__' of 'numpy.generic' objects}\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:1050(is_busday)\n", - " 6498 0.002 0.000 0.002 0.000 {method 'lower' of 'str' objects}\n", - " 1861 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2063(_maybe_pin_freq)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:1022(bdate_range)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:821(date_range)\n", - " 12 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:325(__new__)\n", - " 28 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6394(_should_compare)\n", - " 442 0.002 0.000 0.002 0.000 {method 'take' of 'numpy.ndarray' objects}\n", - " 407 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:74(__len__)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:301(lexsort_indexer)\n", - " 578 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2795(extend_blocks)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:776(_get_formatted_column_labels)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:397(_generate_range)\n", - " 6 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:947(json)\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1434(idelete)\n", - " 49 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1412(_insert_update_blklocs_and_blknos)\n", - " 3176 0.002 0.000 0.002 0.000 {method '__enter__' of '_thread.RLock' objects}\n", - " 37 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1827()\n", - " 160 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/actions.py:12(__init__)\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2354(objects_to_datetime64)\n", - " 340 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:984()\n", - " 2202 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1152(name)\n", - " 344 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1850(from_blocks)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:454(calculate_position_greeks)\n", - " 2 0.001 0.001 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:222(read)\n", - " 692 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:332(array)\n", - " 693 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1040(needs_i8_conversion)\n", - " 1376 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:505(parent_header)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:457(prepare_request)\n", - " 46 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:455(newfunc)\n", - " 2560 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1168(ident)\n", - " 654 0.001 0.000 0.002 0.000 :674(__getitem__)\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:699(new_axes)\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:371(__init__)\n", - " 1013 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:325(_get_take_nd_function)\n", - " 6 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/simplejson/__init__.py:459(loads)\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:702()\n", - " 6 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/simplejson/decoder.py:379(decode)\n", - " 65 0.000 0.000 0.002 0.000 {built-in method builtins.sorted}\n", - " 22 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1247(series_generator)\n", - " 46 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:604(nansum)\n", - " 5971 0.002 0.000 0.002 0.000 {method '__exit__' of '_thread.lock' objects}\n", - " 4345 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1671(name)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/string.py:119(_join_multiline)\n", - " 338 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1066(_get_arithmetic_result_freq)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1575(__init__)\n", - " 49 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1393(moveaxis)\n", - " 6 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/simplejson/decoder.py:392(raw_decode)\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1425(_format_flat)\n", - " 2202 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/multiprocessing/process.py:37(current_process)\n", - " 49 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1402(_insert_update_mgr_locs)\n", - " 168 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2264()\n", - " 4739 0.002 0.000 0.002 0.000 {method '__exit__' of '_thread.RLock' objects}\n", - " 2276 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:572(_get_axis_number)\n", - " 1600 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:90(RLock)\n", - " 3871 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/flags.py:55(allows_duplicate_labels)\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1448(_format_with_header)\n", - " 3859 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:363(attrs)\n", - " 58 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:189(_na_arithmetic_op)\n", - " 66 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1764(is_consolidated)\n", - " 147 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1501(enumerate)\n", - " 445 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:336(hms)\n", - " 77 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2703(new_block_2d)\n", - " 338 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:338(astype)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2121(create_block_manager_from_column_arrays)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/execution.py:86(execute_order_randomized_slippage)\n", - " 467 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:592(_get_block_manager_axis)\n", - " 1080 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:617(_select_options)\n", - " 40 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:524(_validate_comparison_value)\n", - " 2202 0.001 0.000 0.001 0.000 {method 'write' of '_io.TextIOWrapper' objects}\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaExceptions.py:64(raise_thetadata_exception)\n", - " 1008 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:974(dtype)\n", - " 26 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:124(maybe_convert_platform)\n", - " 2202 0.001 0.000 0.001 0.000 {built-in method sys._getframe}\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:200(__mul__)\n", - " 14 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1349(format_with_na_rep)\n", - " 98 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5562(append)\n", - " 66 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1772(_consolidate_check)\n", - " 301 0.000 0.000 0.001 0.000 {built-in method builtins.max}\n", - " 84 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:225(_consolidate_key)\n", - " 6010 0.001 0.000 0.001 0.000 {built-in method _warnings._filters_mutated}\n", - " 2424 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:366(pm)\n", - " 2657 0.001 0.000 0.001 0.000 {method 'pop' of 'list' objects}\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1848(_make_engine)\n", - " 200 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:790(copy)\n", - " 1095 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:286(_is_owned)\n", - " 3802 0.001 0.000 0.001 0.000 {method 'isalpha' of 'str' objects}\n", - " 615 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:195(is_array_like)\n", - " 4421 0.001 0.000 0.001 0.000 {method 'release' of '_thread.RLock' objects}\n", - " 108 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1220(_format)\n", - " 1939 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1940(_block)\n", - " 2958 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2043(freq)\n", - " 32 0.001 0.000 0.001 0.000 {built-in method _thread.start_new_thread}\n", - " 289 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:253(fill_value)\n", - " 1589 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/__init__.py:145(_DType_reduce)\n", - " 865 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:667(_info_axis)\n", - " 698 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:291(arrays)\n", - " 2252 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:246(items)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:717(_get_concat_axis)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:68(__and__)\n", - " 1360 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:649(_get_deprecated_option)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:209(_maybe_cache)\n", - " 720 0.001 0.000 0.001 0.000 {built-in method numpy.seterrobj}\n", - " 3248 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5144(_values)\n", - " 1868 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:360(convertyear)\n", - " 2202 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/multiprocessing/process.py:189(name)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6123(_logical_method)\n", - " 378 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:2378(array_equal)\n", - " 369 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/base.py:549(find)\n", - " 95 0.000 0.000 0.001 0.000 {method 'all' of 'numpy.ndarray' objects}\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:777(_concat_indexes)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:231(parse_headers)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5455(append)\n", - " 104 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1010(view)\n", - " 686 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:214(is_extension)\n", - " 338 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:49(_check_for_default_values)\n", - " 60 0.000 0.000 0.001 0.000 {method 'sum' of 'numpy.ndarray' objects}\n", - " 684 0.001 0.000 0.001 0.000 {method 'groupdict' of 're.Match' objects}\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/helpers.py:8(parse_signal_id)\n", - " 439 0.001 0.000 0.001 0.000 {method 'nonzero' of 'numpy.ndarray' objects}\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1316(view)\n", - " 30 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:957(_validate_tuple_indexer)\n", - " 1034 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1463()\n", - " 745 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1165(_check_deprecated_callable_usage)\n", - " 519 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:791(is_)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1248(copy)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2235(take)\n", - " 2736 0.001 0.000 0.001 0.000 {method 'group' of 're.Match' objects}\n", - " 23 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1831()\n", - " 1115 0.001 0.000 0.001 0.000 {method 'split' of 'str' objects}\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5491(_concat)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:351(prepare)\n", - " 42 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2744(inferred_type)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:398(reduce)\n", - " 7 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1870(_get_label_or_level_values)\n", - " 169 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:797()\n", - " 773 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:161(iloc)\n", - " 2235 0.001 0.000 0.001 0.000 {method 'pop' of 'dict' objects}\n", - " 2268 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/printing.py:510(len)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/parser.py:59(parsestr)\n", - " 4665 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:182(_deepcopy_atomic)\n", - " 1868 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:402(has_year)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/eventScheduler.py:110(put)\n", - " 3589 0.001 0.000 0.001 0.000 {built-in method builtins.callable}\n", - " 81 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5552(equals)\n", - " 26 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3955(_get_indexer)\n", - " 415 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:329(month)\n", - " 2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:60(__init__)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/parser.py:41(parse)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:596(_homogenize)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1102(wrap_results)\n", - " 32 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/ipkernel.py:768(init_closure)\n", - " 60 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:47(_sum)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:957(getaddrinfo)\n", - " 1532 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:718(dtype)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:739(one_off_save)\n", - " 58 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/computation/expressions.py:226(evaluate)\n", - " 338 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:128(_check_for_invalid_keys)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:817(_get_formatted_index)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/decorators.py:25(wrapper)\n", - " 58 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1755()\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1359(bulk_one_off_save)\n", - " 221 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:366(notify)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:5773(isna)\n", - " 95 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:61(_all)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager_processes.py:347(schedule)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:8693(isna)\n", - " 283 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:456(_engine_type)\n", - " 12 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:903(_set_levels)\n", - " 140 0.000 0.000 0.001 0.000 {method 'max' of 'numpy.ndarray' objects}\n", - " 2 0.001 0.000 0.001 0.000 {built-in method _socket.getaddrinfo}\n", - " 14 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1352()\n", - " 160 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1926()\n", - " 8 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/printing.py:524(adjoin)\n", - " 40 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:534(_scalar_from_string)\n", - " 70 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1081(is_numeric_dtype)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6520(_transform_index)\n", - " 172 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:830(__len__)\n", - " 1588 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:398(__get_result)\n", - " 8 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/printing.py:31(adjoin)\n", - " 60 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1778()\n", - " 110 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/printing.py:165(pprint_thing)\n", - " 32 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:856(__init__)\n", - " 906 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:213(isspace)\n", - " 38 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:280(_check_object_for_strings)\n", - " 58 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/computation/expressions.py:67(_evaluate_standard)\n", - " 30 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/printing.py:567(get_adjustment)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:240(__pow__)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:674(astype)\n", - " 524 0.001 0.000 0.001 0.000 {method 'index' of 'list' objects}\n", - " 14 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1834()\n", - " 338 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1047(_get_i8_values_and_mask)\n", - " 98 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1330(normalize_axis_tuple)\n", - " 60 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1574(_validate_key)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:446(get_connection_with_tls_context)\n", - " 1440 0.001 0.000 0.001 0.000 {built-in method numpy.geterrobj}\n", - " 338 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2180(_ensure_matching_resos)\n", - " 161 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:691()\n", - " 640 0.000 0.000 0.001 0.000 :697(__iter__)\n", - " 140 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:39(_amax)\n", - " 1952 0.001 0.000 0.001 0.000 {method 'is_finite' of 'decimal.Decimal' objects}\n", - " 1272 0.000 0.000 0.001 0.000 :760(decode)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:2344(unique)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2658(proxy_bypass_macosx_sysconf)\n", - " 140 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1305(base_formatter)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:2063(to_dict)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:1019(unique)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/methods/to_dict.py:78(to_dict)\n", - " 74 0.000 0.000 0.001 0.000 {built-in method _codecs.encode}\n", - " 128 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/printing.py:513(justify)\n", - " 150 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:380(notna)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:11458(blk_func)\n", - " 74 0.001 0.000 0.001 0.000 {built-in method posix.urandom}\n", - " 338 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:29(_check_arg_length)\n", - " 7 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4159(xs)\n", - " 654 0.000 0.000 0.001 0.000 :756(encode)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:307(unique)\n", - " 40 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:718(_unbox)\n", - " 58 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:764(_get_formatter)\n", - " 1588 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:47(__init__)\n", - " 17 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:287(get_dtypes)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/string.py:128()\n", - " 21 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1519(construct_1d_arraylike_from_scalar)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:427(unique_with_mask)\n", - " 582 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1749(just)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:176(_call_parse)\n", - " 415 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:319(jump)\n", - " 46 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:525(_unbox_scalar)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7031(drop)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:98(__add__)\n", - " 338 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:38(is_valid_positional_slice)\n", - " 960 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:162(roll_map)\n", - " 766 0.001 0.000 0.001 0.000 {method 'startswith' of 'str' objects}\n", - " 28 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6415(_is_comparable_dtype)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:216(_parsegen)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:171(feed)\n", - " 1960 0.001 0.000 0.001 0.000 {method 'keys' of 'dict' objects}\n", - " 1568 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:2178()\n", - " 340 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:209(_qsize)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1559(itertuples)\n", - " 296 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:673(na_value_for_dtype)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:7172()\n", - " 874 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:283(_acquire_restore)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:860(values)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:276(connection_from_host)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:12590(values)\n", - " 640 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1740()\n", - " 342 0.001 0.000 0.001 0.000 {built-in method fromkeys}\n", - " 49 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2311(_fast_count_smallints)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1633(as_array)\n", - " 48 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:924()\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:355(_concatenate_chunks)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1784(get_level_values)\n", - " 169 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:801()\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:305(connection_from_context)\n", - " 338 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:957(get_option_data)\n", - " 16 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:220(__init__)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:296(_get_combined_plan)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1707(_interleave)\n", - " 11 0.000 0.000 0.001 0.000 {method 'extend' of 'list' objects}\n", - " 1380 0.001 0.000 0.001 0.000 {method 'write' of '_io.StringIO' objects}\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:259(_box_as_indexlike)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2190(_form_blocks)\n", - " 8 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:572(_is_uniform_join_units)\n", - " 16 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:373(_finalize)\n", - " 46 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4402(_check_setitem_copy)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1630()\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:196(__rsub__)\n", - " 688 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1472()\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:447(astype)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1758(_get_level_values)\n", - " 395 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1392()\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:320(__new__)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7553(ensure_index_from_sequences)\n", - " 12 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1085(_set_codes)\n", - " 35 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:782(_rename)\n", - " 2 0.001 0.000 0.001 0.000 {built-in method _scproxy._get_proxy_settings}\n", - " 38 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/concat.py:52(concat_compat)\n", - " 8 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:550(validate_categories)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:419(_close_conn)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:707(_get_comb_axis)\n", - " 2 0.000 0.000 0.001 0.000 {method 'close' of '_io.BufferedReader' objects}\n", - " 1109 0.001 0.000 0.001 0.000 {method 'endswith' of 'str' objects}\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:330(connection_from_pool_key)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:409(prepare_url)\n", - " 59 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:273(is_dict_like)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:72(get_objs_combined_axis)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:781(close)\n", - " 86 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:537(_check_compatible_with)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:58(__ge__)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:2082(empty)\n", - " 64 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6312(_index_as_unique)\n", - " 1888 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:186(__iter__)\n", - " 209 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/frozen.py:76(__getitem__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/weakref.py:585(__call__)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:844(levels)\n", - " 1034 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1479()\n", - " 190 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:79()\n", - " 1368 0.000 0.000 0.000 0.000 {method 'toordinal' of 'datetime.date' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:122(get_group_index)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:237(ndarray_to_mgr)\n", - " 280 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:688(_warn_if_deprecated)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:120(_get_combined_index)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:489(_decref_socketios)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6463(astype)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:499(close)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:229(_new_pool)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:1174(_close_pool_connections)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2662(getproxies_macosx_sysconf)\n", - " 360 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:426(__init__)\n", - " 874 0.000 0.000 0.000 0.000 {method 'values' of 'dict' objects}\n", - " 2 0.000 0.000 0.000 0.000 {built-in method _scproxy._get_proxies}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:495(_real_close)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6219(_raise_if_missing)\n", - " 787 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:196(blklocs)\n", - " 2 0.000 0.000 0.000 0.000 {function socket.close at 0x10ebfe0c0}\n", - " 915 0.000 0.000 0.000 0.000 {built-in method _thread.allocate_lock}\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:897()\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1697(_validate_names)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:219(vstack)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:177(__init__)\n", - " 67 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:914(__len__)\n", - " 98 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1768(ravel)\n", - " 698 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:303()\n", - " 49 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2811(ensure_block_shape)\n", - " 87 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1643(__len__)\n", - " 1591 0.000 0.000 0.000 0.000 {method 'put' of '_queue.SimpleQueue' objects}\n", - " 48 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1102()\n", - " 261 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:219(_can_consolidate)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6324(_maybe_downcast_for_indexing)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4883(_update_inplace)\n", - " 74 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/encodings/hex_codec.py:13(hex_encode)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:5136(reindex)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:359(build_response)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:187(validate_indices)\n", - " 817 0.000 0.000 0.000 0.000 {method 'insert' of 'list' objects}\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:597()\n", - " 179 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copyreg.py:104(__newobj__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5343(reindex)\n", - " 171 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/eventScheduler.py:68(get_current_queue)\n", - " 1376 0.000 0.000 0.000 0.000 {method 'get' of '_contextvars.ContextVar' objects}\n", - " 407 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:265(_engine_type)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:405(__init__)\n", - " 37 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:836(__iter__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:204(get_netrc_auth)\n", - " 1685 0.000 0.000 0.000 0.000 {built-in method time.monotonic}\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1580(construct_1d_object_array_from_listlike)\n", - " 102 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:2140()\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1250(copy)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/string.py:129()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:421(astype)\n", - " 84 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/printing.py:522()\n", - " 160 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:915()\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:12675(_reindex_for_setitem)\n", - " 70 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:184(_reconstruct_data)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:389(is_na)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1051(_stop)\n", - " 110 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/printing.py:196(as_escaped_string)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:122(put)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:369(parse_url)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:562(__init__)\n", - " 1412 0.000 0.000 0.000 0.000 {method 'decode' of 'bytes' objects}\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:592(get_content_type)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:61(merge_setting)\n", - " 523 0.000 0.000 0.000 0.000 {method 'update' of 'dict' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:636()\n", - " 328 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:999(__len__)\n", - " 86 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2776(_is_multi)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/printing.py:507(__init__)\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:305(_isna_string_dtype)\n", - " 684 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1474()\n", - " 400 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3809()\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:71(_wrapreduction)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:664(get_handle)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:723(astype)\n", - " 160 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/actions.py:6(__init__)\n", - " 160 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/actions.py:17(__repr__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/printing.py:51()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:390(__init__)\n", - " 49 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4585(_ensure_valid_index)\n", - " 308 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:745()\n", - " 414 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:660(_constructor)\n", - " 59 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2794(_na_value)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:40(__init__)\n", - " 83 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4623(_clear_item_cache)\n", - " 36 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:4120(_coerce_indexer_frozen)\n", - " 341 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/__init__.py:42(warn_copy_on_write)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1532(__neg__)\n", - " 20 0.000 0.000 0.000 0.000 {built-in method _operator.ne}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:351(get_dataframe_repr_params)\n", - " 337 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6055(_check_indexing_error)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:506(nested_data_to_arrays)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:182(close)\n", - " 21 0.000 0.000 0.000 0.000 {method 'min' of 'numpy.ndarray' objects}\n", - " 173 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:217(_get)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:242(__init__)\n", - " 61 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4191(_validate_positional_slice)\n", - " 165 0.000 0.000 0.000 0.000 {built-in method builtins.min}\n", - " 892 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:363(ndim)\n", - " 30 0.000 0.000 0.000 0.000 :771(get)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:322(_get_block_for_concat_plan)\n", - " 1073 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6672(_maybe_cast_indexer)\n", - " 48 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:253(_get_values)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2320(_preprocess_slice_or_indexer)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:483(prepare_headers)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1574(_set_names)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:810()\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:374(urlparse)\n", - " 452 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:696(ndim)\n", - " 44 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/printing.py:518()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2244(get_values)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/astype.py:191(astype_array_safe)\n", - " 252 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:446(__exit__)\n", - " 1084 0.000 0.000 0.000 0.000 {method 'append' of 'collections.deque' objects}\n", - " 31 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:789(values)\n", - " 49 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5295(_validate_fill_value)\n", - " 430 0.000 0.000 0.000 0.000 {method 'rstrip' of 'str' objects}\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6459(any)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:124(extract_cookies_to_jar)\n", - " 99 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:126(_classes_and_not_datetimelike)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1652(_is_scalar_access)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:165(maybe_lift)\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:43(_amin)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2421(all)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:337(extend)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:393(logical_op)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:149(should_cache)\n", - " 408 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1176(_maybe_disallow_fill)\n", - " 16 0.000 0.000 0.000 0.000 :941(update)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:793(to_arrays)\n", - " 117 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:373(is_sequence)\n", - " 340 0.000 0.000 0.000 0.000 {method 'get' of 'mappingproxy' objects}\n", - " 144 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:72(check)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:217(_ensure_arraylike)\n", - " 68 0.000 0.000 0.000 0.000 {built-in method numpy.zeros}\n", - " 734/732 0.000 0.000 0.000 0.000 {method 'encode' of 'str' objects}\n", - " 29 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:633(is_integer_dtype)\n", - " 46 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:350(getitem_block_columns)\n", - " 906 0.000 0.000 0.000 0.000 {method 'isspace' of 'str' objects}\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:490(get)\n", - " 31 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2000(external_values)\n", - " 341 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1877(_nonzero_dispatcher)\n", - " 252 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:440(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1500(_format_strings)\n", - " 787 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1480(_clear_item_cache)\n", - " 716 0.000 0.000 0.000 0.000 {method 'end' of 're.Match' objects}\n", - " 906 0.000 0.000 0.000 0.000 {method 'release' of '_thread.lock' objects}\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:351(putheader)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6499(min)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:1452(safe_sort)\n", - " 182 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:683(__normalize_dollar_amount)\n", - " 48 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:1499(_maybe_null_out)\n", - " 4 0.000 0.000 0.000 0.000 :229(expanduser)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:560(_validate_scalar)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12381(min)\n", - " 282 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1828()\n", - " 183 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:300()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:744(_format_native_types)\n", - " 529 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:153(concatenate)\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:386(default_index)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:227(_encode_invalid_chars)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12362(_stat_function)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:974(_is_nested_tuple_indexer)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:466(array_equivalent)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/methods/to_dict.py:171()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1476(_format_strings)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:153(_set_option)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:113(comp_method_OBJECT_ARRAY)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:54(__gt__)\n", - " 58 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/missing.py:131(dispatch_fill_zeros)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:2077(__contains__)\n", - " 98 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1380()\n", - " 46 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:122(_reset_cache)\n", - " 119 0.000 0.000 0.000 0.000 {method 'clear' of 'dict' objects}\n", - " 841 0.000 0.000 0.000 0.000 {method 'remove' of 'collections.deque' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5598()\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:829(_maintain_shutdown_locks)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:962(parse_position_id)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4436(_wrap_reindex_result)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1771(_is_label_reference)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:255(get)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:616(get_content_maintype)\n", - " 338 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1989(index)\n", - " 401 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:344()\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:735(_error_catcher)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:425(__init__)\n", - " 168 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/__init__.py:55(using_pyarrow_string_dtype)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1482()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:928(_finalize_columns_and_data)\n", - " 356 0.000 0.000 0.000 0.000 {method 'copy' of 'dict' objects}\n", - " 338 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:191(_values_for_argsort)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1192(is_alive)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7664(trim_front)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2567(_proxy_bypass_macosx_sysconf)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:407(__rsub__)\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1342(is_complex_dtype)\n", - " 686 0.000 0.000 0.000 0.000 {method 'weekday' of 'datetime.date' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:573(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:966()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/astype.py:157(astype_array)\n", - " 4 0.000 0.000 0.000 0.000 {method 'sendall' of '_socket.socket' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:794(_set_axis_nocheck)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2285()\n", - " 167 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/event.py:23(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:223(unique)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:123(__init__)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:81(atleast_2d)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:838(select_proxy)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:446(_init_decoder)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5651(identical)\n", - " 74 0.000 0.000 0.000 0.000 {built-in method binascii.b2a_hex}\n", - " 266 0.000 0.000 0.000 0.000 {built-in method numpy.asanyarray}\n", - " 40 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:973(coerce_indexer_dtype)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:992(is_numeric_v_string_like)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:345(to_key_val_list)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:115(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:111(f)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/astype.py:56(_astype_nansafe)\n", - " 360 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1021(_argsort_dispatcher)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:353(wrapper)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:838(_cleanup)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/diskcache/core.py:854(_row_insert)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:255(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:469(_parse_headers)\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/common.py:103(_maybe_match_name)\n", - " 378 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:2374(_array_equal_dispatcher)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:482(nanany)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:485(__exit__)\n", - " 48 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/numpy/function.py:413(validate_func)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:304(_get_filepath_or_buffer)\n", - " 99 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:131()\n", - " 146/52 0.000 0.000 0.000 0.000 {method 'join' of 'str' objects}\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2065(set_values)\n", - " 90 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1181()\n", - " 31 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:249(external_values)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2246(_stack_arrays)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_asarray.py:27(require)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:201(_simple_new)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:479(__enter__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:202(__init__)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1259(putheader)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:258(_get_conn)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:775(infer_dtype_from_scalar)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:836()\n", - " 46 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1056(_could_be_tzname)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:3995(_maybe_update_cacher)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:521(cookiejar_from_dict)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:35(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:1083(reduction)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:564(_array_equivalent_object)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:3689(equals)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:610(prepare_cookies)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/console.py:9(get_console_size)\n", - " 154 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1449()\n", - " 34 0.000 0.000 0.000 0.000 {method '_checkReadable' of '_io._IOBase' objects}\n", - " 46 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:324(_get_dtype_max)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3996(_check_indexing_method)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/_policybase.py:319(header_fetch_parse)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1798()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/event.py:108(__str__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2399(_is_dates_only)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:404(__radd__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1680(extract_cookies)\n", - " 60 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1480()\n", - " 183 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6685(_validate_indexer)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:140(get_cookie_header)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/event.py:162(__str__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:1006(convert_object_array)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/eventScheduler.py:20(put)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:909(text)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:317(__add__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:331(putrequest)\n", - " 60 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1262(_slice)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:586(update_dtype)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:545(_get_sample_object)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:658(__init__)\n", - " 616 0.000 0.000 0.000 0.000 {method 'rjust' of 'str' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:202(union_indexes)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:1070()\n", - " 60 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2738(is_label_like)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:164(hostname)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:935(_expand_ellipsis)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2979(prod)\n", - " 10 0.000 0.000 0.000 0.000 {built-in method _operator.eq}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:303(makefile)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:1028(convert)\n", - " 112 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1270(is_1d_only_ea_dtype)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6137(_align_for_op)\n", - " 31 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2827(external_values)\n", - " 8 0.000 0.000 0.000 0.000 {built-in method _operator.truediv}\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4440(_maybe_preserve_names)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:487()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:454(__exit__)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:302(add)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1103(putrequest)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:137(__new__)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/_policybase.py:289(_sanitize_header)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1047(shape)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:238(_new_conn)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:119(_coerce_args)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6916(delete)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7723(_unpack_nested_dtype)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:794(close)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1627(_get_options_with_defaults)\n", - " 189 0.000 0.000 0.000 0.000 {built-in method builtins.abs}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:546(request_url)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:203()\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:324(slice_block_columns)\n", - " 78 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:226(validate_bool_kwarg)\n", - " 128 0.000 0.000 0.000 0.000 {method 'ravel' of 'numpy.ndarray' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:635(release_conn)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:492(to_numpy)\n", - " 342 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:669(result_type)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:567()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2095(create_block_manager_from_blocks)\n", - " 340 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1828(ndim)\n", - " 90 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2772()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6537()\n", - " 12 0.000 0.000 0.000 0.000 :778(__contains__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:105(__init__)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:839()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2252()\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1730(_get_default_index_names)\n", - " 42 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1099(_parse_min_sec)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1685(_clean_options)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:259(__getitem__)\n", - " 48 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:209(_maybe_get_mask)\n", - " 211 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:1080(copyto)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:226(isna)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:1034(check_header_validity)\n", - " 84 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:738()\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:688(_sanitize_non_ordered)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_weakrefset.py:85(add)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/_internal_utils.py:38(unicode_is_ascii)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:296(_put_conn)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5818(head)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2817(hasnans)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1275(__init__)\n", - " 524 0.000 0.000 0.000 0.000 {method 'ljust' of 'str' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1599(make_cookies)\n", - " 102 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/printing.py:60()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:588(prepare_auth)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:480(_get_ndims)\n", - " 46 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:322(weekday)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:536(close)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/codeop.py:120(__call__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ipaddress.py:1286(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:95(_default_key_normalizer)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:106(_encode_params)\n", - " 46 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:342(ampm)\n", - " 51 0.000 0.000 0.000 0.000 {method 'transpose' of 'numpy.ndarray' objects}\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1165(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:34(__init__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1261(__init__)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:410(fill_bool)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5134(array)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/weakref.py:427(__setitem__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:1018(get_auth_from_url)\n", - " 202 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1081(codes)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:301(maybe_iterable_to_list)\n", - " 52 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:46(__setitem__)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4518(_check_inplace_and_allows_duplicate_labels)\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:288()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:243(_from_values_or_dtype)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1025(save_to_buffer)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:315(__init__)\n", - " 90 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:981()\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:352(na_logical_op)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Configuration.py:37(__setattr__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:220(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:1204(is_potential_multi_index)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/base.py:294(is_dtype)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:215(_vhstack_dispatcher)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:1547(check_below_min_count)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1356(add_cookie_header)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:191(_validate_parse_dates_presence)\n", - " 37 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2177(_grouping_func)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:1165(_is_binary_mode)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:494(_clean_keys_and_objs)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:660(requote_uri)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ipaddress.py:1187(_ip_int_from_string)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1377(__init__)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:205(_hostinfo)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:127(__next__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:429(__init__)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1826(_check_label_or_level_ambiguity)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method builtins.compile}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:396(build_connection_pool_key_attributes)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/response.py:40(assert_header_parsing)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:213(_read_headers)\n", - " 4 0.000 0.000 0.000 0.000 {method 'settimeout' of '_socket.socket' objects}\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1324(_make_invoke_excepthook)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:540()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:240(init_poolmanager)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/event.py:71(__str__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:267(clear)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:318()\n", - " 46 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:51(__getitem__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5172(delete)\n", - " 252 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:443(__enter__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:90(_urllib3_request_context)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:356()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:201(_set_noconvert_columns)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:900(default_headers)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:134(__init__)\n", - " 330 0.000 0.000 0.000 0.000 {method 'replace' of 'str' objects}\n", - " 60 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:992(_validate_key_length)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1570(_maybe_box_and_unbox_datetimelike)\n", - " 14 0.000 0.000 0.000 0.000 {method 'fill' of 'numpy.ndarray' objects}\n", - " 197 0.000 0.000 0.000 0.000 {method 'popleft' of 'collections.deque' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:76(copy)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2586(get_values)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:351(_encode_target)\n", - " 58 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1030(axes)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:251(put)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/_policybase.py:301(header_source_parse)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:100(push)\n", - " 36 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:743(readable)\n", - " 90 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2781()\n", - " 98 0.000 0.000 0.000 0.000 {built-in method numpy.core._multiarray_umath.normalize_axis_index}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:724()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:1148(take)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:316(close)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:587()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:849(_list_to_arrays)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:1045(_validate_header_part)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:266(index_labels_to_array)\n", - " 160 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1937(_post_setstate)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:138(_event_pipe)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:137(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1534(blk_func)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:109(__init__)\n", - " 34 0.000 0.000 0.000 0.000 {method '_checkClosed' of '_io._IOBase' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/json/__init__.py:183(dumps)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:480()\n", - " 61 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2752(need_slice)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:81(__init__)\n", - " 209 0.000 0.000 0.000 0.000 {function FrozenList.__getitem__ at 0x126b48540}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:159(resolve_redirects)\n", - " 42 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1571(_get_names)\n", - " 98 0.000 0.000 0.000 0.000 {built-in method _operator.index}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:494(prepare_body)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:311(is_null_slice)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1195(_info_repr)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:143(clear)\n", - " 49 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1763(np_can_hold_element)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2804(_isnan)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2738(_check_indexing_error)\n", - " 46 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:248(_qsize)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:509(urlunparse)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:468()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:679(_init_length)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1327(__instancecheck__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:490(is_truncated)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:847(quote)\n", - " 150 0.000 0.000 0.000 0.000 {method 'upper' of 'str' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:199(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:208(_maybe_unbox_datetimelike)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1096(_can_fast_transpose)\n", - " 3 0.000 0.000 0.000 0.000 {built-in method posix.cpu_count}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/json/encoder.py:183(encode)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:354(validate_ascending)\n", - " 12 0.000 0.000 0.000 0.000 {method 'write' of '_io.BytesIO' objects}\n", - " 90 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1180()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:457(__neg__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:479(items)\n", - " 121 0.000 0.000 0.000 0.000 {built-in method builtins.iter}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:774(get_proxy)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method from_bytes}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/retry.py:202(__init__)\n", - " 4 0.000 0.000 0.000 0.000 {built-in method _operator.mul}\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:525(get_all)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:303(_normalize_host)\n", - " 2 0.000 0.000 0.000 0.000 {method 'uniform' of 'numpy.random.mtrand.RandomState' objects}\n", - " 77 0.000 0.000 0.000 0.000 {method 'add' of 'set' objects}\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:230(_can_hold_na)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:367()\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_weakrefset.py:39(_remove)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2712(_generate_range)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:82(frame_apply)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:207(_arrays_for_stack_dispatcher)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:1233(dedup_names)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:370()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:202(_maybe_reindex_columns_na_proxy)\n", - " 98 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5558(_append_dispatcher)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:172(from_float)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/utils.py:52(_has_surrogates)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:675(empty)\n", - " 59 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:692(_constructor)\n", - " 49 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1455()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:487()\n", - " 83 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:575(is_set)\n", - " 64 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1206(daemon)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:99(freq)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:84()\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:553(equals)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:849(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:638(__array__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:362(_make_index)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:121(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:950(_validate_or_indexify_columns)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_common.py:27(_init_wait_gen)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1111(_values)\n", - " 16 0.000 0.000 0.000 0.000 {method 'fullmatch' of 're.Pattern' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2322(any)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/roperator.py:14(rsub)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/weakref.py:369(remove)\n", - " 49 0.000 0.000 0.000 0.000 {method 'item' of 'numpy.ndarray' objects}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:405(_check_values_indices_shape_match)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1602(__subclasscheck__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:263(_remove_path_dot_segments)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:400()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1467(debug)\n", - " 90 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:941()\n", - " 62 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:58()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:303()\n", - " 16 0.000 0.000 0.000 0.000 :790(items)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:603(update_trades_on_sell)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1765(_get_names)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1657(_get_level_number)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1990(__exit__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/encodings/idna.py:145(encode)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:756(_shallow_copy)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:2133(_refine_defaults_read)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:99(_intenum_converter)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:630(prepare_hooks)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:1135(_splitport)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:29(_splitparam)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_asarray.py:108()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/string.py:189(_binify)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:498(is_truncated_vertically)\n", - " 92 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:217(_scalar_type)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2666(_maybe_normalize_endpoints)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:248(stringify_path)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:77(readline)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ipaddress.py:1213(_parse_octet)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/json/encoder.py:205(iterencode)\n", - " 36 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1122()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:390(_check_close)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:95(__init__)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1686(name)\n", - " 82 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:511(f)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:243(get_payload)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:594(_bool_arith_check)\n", - " 6 0.000 0.000 0.000 0.000 {method 'astype' of 'numpy.generic' objects}\n", - " 5 0.000 0.000 0.000 0.000 {built-in method _operator.and_}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:539(get_encoding_from_headers)\n", - " 60 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7678()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:1149(_normalize_host)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:514(show_row_idx_names)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:448(size)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:325()\n", - " 98 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1764(_ravel_dispatcher)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:348(_get_timeout)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:424(close)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1622(close)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:72()\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/concat.py:73()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:215(get_default_val)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:505(get_rename_function)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1133(_parsems)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:484(should_show_dimensions)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:350(_maybe_make_multi_index_columns)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:69(close)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:254(_get)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:542(merge_cookies)\n", - " 32 0.000 0.000 0.000 0.000 {method 'difference_update' of 'set' objects}\n", - " 60 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1665()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:100(__new__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7704(get_unanimous_names)\n", - " 49 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:892(bincount)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1227(deepvalues)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:57(__iter__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:207(register_hook)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:862(codes)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:572(prepare_content_length)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:241(is_single_block)\n", - " 4 0.000 0.000 0.000 0.000 {built-in method _operator.pow}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1721()\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/response.py:9(is_fp_closed)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:369()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/string.py:126()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:106(_get_distinct_objs)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method _operator.ge}\n", - " 4 0.000 0.000 0.000 0.000 {function SocketIO.close at 0x10ebfee80}\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2294()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:534()\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1061()\n", - " 2 0.000 0.000 0.000 0.000 :405(parent)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:251(_put)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:471(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:550(infer_compression)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:974(close)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:742(_get_axes)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:544(_initialize_justify)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method builtins.locals}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:692(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:107(get_redirect_target)\n", - " 49 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5364(_insert_dispatcher)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:373(inner)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1046(nlevels)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:753(update_holdings_on_fill)\n", - " 10 0.000 0.000 0.000 0.000 {method 'getvalue' of '_io.BytesIO' objects}\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:228(_acquireLock)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:354(__array__)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:584()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:102()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/request.py:189(body_to_chunks)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:541(to_numpy)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:641(fill_missing_names)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:196(mgr_to_mgr)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:447(isclosed)\n", - " 4 0.000 0.000 0.000 0.000 {method 'readlines' of '_io._IOBase' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:799(mount)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:923(quote_from_bytes)\n", - " 39 0.000 0.000 0.000 0.000 {method 'capitalize' of 'str' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:188(clone)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:751()\n", - " 6 0.000 0.000 0.000 0.000 :121(__subclasscheck__)\n", - " 36 0.000 0.000 0.000 0.000 {built-in method sys.getrefcount}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1674(_check_file_or_buffer)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Context.py:124(clear_context)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:688(__call__)\n", - " 66 0.000 0.000 0.000 0.000 {method 'partition' of 'str' objects}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:494(is_truncated_horizontally)\n", - " 143 0.000 0.000 0.000 0.000 {method 'locked' of '_thread.lock' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:526(_initialize_sparsify)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/connection.py:93(_set_socket_options)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:593(_calc_max_rows_fitted)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:84(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1277(is_extension_array_dtype)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:157(_int64_cut_off)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:769(is_redirect)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:164(host)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:231(_fix)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:506(has_index_names)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method _operator.add}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:650(truncate)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:353()\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:884(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/console.py:79(in_ipython_frontend)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:520(urlunsplit)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:2015(__iter__)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6277()\n", - " 49 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1389(_moveaxis_dispatcher)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:773(__init__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6270()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:781(get_adapter)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:105(is_file_like)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/hooks.py:15(default_hooks)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method today}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/astype.py:249(astype_is_view)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:871(_do_date_conversions)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1489(__init__)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1287(_value_formatter)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1841(_has_names)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:580(_get_axis_name)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:601(_set_noconvert_dtype_columns)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/weakref.py:568(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:258(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/calendar.py:122(monthrange)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/util.py:19(to_str)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:102(__setitem__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:1079(closed)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:209(count_not_none)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7679()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:306(is_named_tuple)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:52(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1734(clear_expired_cookies)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:135(super_len)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1331(dtype)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:330()\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1028(_output)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager.py:372()\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:507(set_raw)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:194(close)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:136(ones)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method _operator.inv}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:582(update_trades_on_buy)\n", - " 68 0.000 0.000 0.000 0.000 {built-in method builtins.ord}\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:665(_get_registered_option)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:546(ensure_key_mapped)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:518(show_col_idx_names)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:175(port)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:188(all_none)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:237(_releaseLock)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:465(_decode)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:1073(clean_reindex_fill_method)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:358(update)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:436(flush)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:686()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:612(_adjust_max_rows)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:943(urlencode)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/retry.py:242()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:212()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:245(read_timeout)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:150(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:334(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:121(pushlines)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/event.py:122(__init__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:167()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:95(__getitem__)\n", - " 6 0.000 0.000 0.000 0.000 {method 'subn' of 're.Pattern' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5676()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:195(_new_message)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/traitlets/traitlets.py:676(__get__)\n", - " 2 0.000 0.000 0.000 0.000 :815(__len__)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7652(ensure_has_len)\n", - " 26 0.000 0.000 0.000 0.000 {method 'rpartition' of 'str' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:865(_references)\n", - " 2 0.000 0.000 0.000 0.000 {method 'setsockopt' of '_socket.socket' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1297(_cookie_attrs)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:96()\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1753(__iter__)\n", - " 6 0.000 0.000 0.000 0.000 {built-in method _abc._abc_subclasscheck}\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:248(__len__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:805()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:66(copy)\n", - " 4 0.000 0.000 0.000 0.000 {built-in method math.floor}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1041(_get_buffer)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:659(unquote)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:636(unquote_unreserved)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:389(standardize_mapping)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:1229()\n", - " 37 0.000 0.000 0.000 0.000 {method 'pop' of 'set' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/retry.py:387(is_retry)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:85(path_url)\n", - " 16 0.000 0.000 0.000 0.000 :812(__init__)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:65(lookback)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:291(__iter__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:532(treat_as_nested)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/calendar.py:115(weekday)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:126(resolve_default_timeout)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:404(is_dataclass)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:195()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:515(get_compression_method)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:208(_pop_message)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:213(_put)\n", - " 17 0.000 0.000 0.000 0.000 {method 'setdefault' of 'dict' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:207(validate_header_arg)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:234(_disallow_mismatched_datetimelike)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:514(_parse_content_type_header)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:265(_find_common_index_dtype)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:156(username)\n", - " 8 0.000 0.000 0.000 0.000 {method 'count' of 'str' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5486()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Configuration.py:18(initialize_configuration)\n", - " 32 0.000 0.000 0.000 0.000 {method 'discard' of 'set' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/console.py:54(in_interactive_session)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:33(refresh_cache)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/eventScheduler.py:144(store_event)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/_internal_utils.py:25(to_native_string)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1720(getEffectiveLevel)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:764(categories)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7717()\n", - " 4 0.000 0.000 0.000 0.000 {built-in method now}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:213()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:510(has_column_names)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method _operator.gt}\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:199(get_cache)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:244(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:216(refresh_cache)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:799(iter_content)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_sync.py:10(_call_handlers)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/methods/to_dict.py:155()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:398(validate_inclusive)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:172()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:1095(__new__)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:531(validate_ordered)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:170()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:331(set_payload)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:60(__len__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2623(_infer_tz_from_endpoints)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:130(_validate_timeout)\n", - " 18 0.000 0.000 0.000 0.000 {method 'values' of 'collections.OrderedDict' objects}\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:351(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:1269(_process_date_conversion)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:553(nblocks)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:304(cert_verify)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7719()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:393(prepare_method)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2220(_can_hold_na)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:91(ensure_python_int)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1903()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:858(_get_column_name_list)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:211(is_multipart)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/IPython/core/compilerop.py:180(extra_flags)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/event.py:81(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:374(_merge_pool_kwargs)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:693(_get_result_dim)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:899(is_nonnegative_int)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/hooks.py:22(dispatch_hook)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:326()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:657()\n", - " 14 0.000 0.000 0.000 0.000 {method 'strip' of 'str' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5495()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:585(_ensure_2d)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:403(retries)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:397(ensure_np_dtype)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:108(_noop)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:1123(_make_date_converter)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:279(_extract_multi_indexer_columns)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:706()\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:178()\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:619(categories)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:1454(__init__)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method _codecs.lookup}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:202(start_connect)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:1117(_maybe_memory_map)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:330(_sanitize_and_check)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:520(convert_to_list_like)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/hooks.py:16()\n", - " 6 0.000 0.000 0.000 0.000 {method 'count' of 'bytes' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/retry.py:379(_is_method_retryable)\n", - " 12 0.000 0.000 0.000 0.000 {method 'lstrip' of 'str' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1394(__hash__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/util.py:7(to_bytes)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1793()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:193(_userinfo)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:174(not_none)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:183(maybe_box_native)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:77(_atleast_2d_dispatcher)\n", - " 4 0.000 0.000 0.000 0.000 {method 'clear' of 'collections.OrderedDict' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:343()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1251(_validate_host)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:140(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:392(ensure_dtype_objs)\n", - " 4 0.000 0.000 0.000 0.000 {method 'pop' of 'collections.OrderedDict' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:582(_calc_max_cols_fitted)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:11522()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1290(_cookies_for_request)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/methods/to_dict.py:160()\n", - " 8 0.000 0.000 0.000 0.000 {method 'groups' of 're.Match' objects}\n", - " 6 0.000 0.000 0.000 0.000 {method 'decode' of 'bytearray' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1643(reconstruct_func)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_common.py:17(_maybe_call)\n", - " 2 0.000 0.000 0.000 0.000 :1()\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1319(disable)\n", - " 4 0.000 0.000 0.000 0.000 {method 'tolist' of 'numpy.ndarray' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:550(_initialize_columns)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:918(_wrap_ipv6)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/traitlets/traitlets.py:629(get)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:1109(is_theta_data_retrieval_successful)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/eventScheduler.py:32()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:1426(_validate_parse_dates_arg)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/base.py:115(__eq__)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:211()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:965()\n", - " 5 0.000 0.000 0.000 0.000 {method 'reverse' of 'list' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/dataclasses.py:1258(is_dataclass)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2416(_all_dispatcher)\n", - " 2 0.000 0.000 0.000 0.000 :2(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/IPython/core/interactiveshell.py:1277(user_global_ns)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:91(merge_hooks)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:893(_check_data_length)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/IPython/core/interactiveshell.py:3493(compare)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_request_methods.py:51(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1329(result_index)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:255(_has_complex_date_col)\n", - " 2 0.000 0.000 0.000 0.000 {method 'send' of 'generator' objects}\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:213()\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1979(nlevels)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:2056(_clean_na_values)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:277()\n", - " 6 0.000 0.000 0.000 0.000 {built-in method sys.audit}\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:632(ordered)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:2365(_validate_skipfooter)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/parser.py:17(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:131(close)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:421(lexsort)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method sys.getfilesystemencoding}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:305(loc)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1234(_validate_method)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/string.py:63(_need_to_wrap_around)\n", - " 2 0.000 0.000 0.000 0.000 {method 'total_seconds' of 'datetime.timedelta' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/connection.py:103(allowed_gai_family)\n", - " 4 0.000 0.000 0.000 0.000 {method 'extend' of 'collections.deque' objects}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:44(_debug)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:626(_is_in_terminal)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:110(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:292(isclass)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:886(inner)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:655(_constructor)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/request.py:134(set_file_position)\n", - " 8 0.000 0.000 0.000 0.000 {method 'items' of 'collections.OrderedDict' objects}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:1447(is_index_col)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:188(_expand_user)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:2267(_extract_dialect)\n", - " 4 0.000 0.000 0.000 0.000 {method 'split' of 'bytes' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1230(_encode_request)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:2139(_codes)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:717(index)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:235()\n", - " 2 0.000 0.000 0.000 0.000 {method 'sort' of 'list' objects}\n", - " 10 0.000 0.000 0.000 0.000 {method 'isascii' of 'str' objects}\n", - " 4 0.000 0.000 0.000 0.000 {method 'truncate' of '_io.StringIO' objects}\n", - " 2 0.000 0.000 0.000 0.000 {method 'rstrip' of 'bytes' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:196(is_holiday)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/string.py:22(__init__)\n", - " 8 0.000 0.000 0.000 0.000 {method 'seek' of '_io.StringIO' objects}\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:117(info)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:376(dtype)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1243(_validate_path)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method _codecs.lookup_error}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:292(is_fsspec_url)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:127()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7718()\n", - " 4 0.000 0.000 0.000 0.000 {method 'count' of 'list' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:450(check_dtype_backend)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:770(_maybe_check_integrity)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:227(connect_timeout)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:192()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:895(_get_hostport)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:856(columns)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:849()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_wait_gen.py:7(expo)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:891(default_user_agent)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:494(dtype)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:743(set_environ)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1847()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:351()\n", - " 2 0.000 0.000 0.000 0.000 {method 'getvalue' of '_io.StringIO' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:146(dtype)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:527(validate_integer)\n", - " 4 0.000 0.000 0.000 0.000 {method 'update' of 'collections.OrderedDict' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:986(_validate_usecols_arg)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:183(host)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:295(is_closed)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:460(tolist)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:245(_init)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method _socket.getdefaulttimeout}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:559(_validate_names)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2974(_prod_dispatcher)\n", - " 2 0.000 0.000 0.000 0.000 {method 'date' of 'datetime.datetime' objects}\n", - " 1 0.000 0.000 0.000 0.000 :315(__subclasshook__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:885(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/tz/tz.py:74(utcoffset)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ipaddress.py:574(__int__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:124(__iter__)\n", - " 2 0.000 0.000 0.000 0.000 {function HTTPResponse.flush at 0x110a6d1c0}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_common.py:28()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:40(get_should_schedule)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:558(_initialize_colspace)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:315(step)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:677(__normalize_dollar_amount_to_decimal)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/response.py:79()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:216(_validate_dtype)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:820()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:87(get_new_headers)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:280(start)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:643(__enter__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:247()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:581(iter_slices)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:187(_get_fill_value)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2317(_any_dispatcher)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:1318(shares_memory)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:216()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2474(validate_periods)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/IPython/core/interactiveshell.py:683(get_ipython)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5168(_delete_dispatcher)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:107(_copy_immutable)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:531(_initialize_formatters)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:578(add_headers)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:105(_box_func)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1987(__enter__)\n", - " 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/proxy.py:11(connection_requires_http_tunnel)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:339(_validate_conn)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:451(__enter__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:231(_constructor)\n", - "\n", - "\n", - "\n" - ] - } - ], - "source": [ - "\n", - "print(stream.getvalue())\n" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [], - "source": [ - "def find_type(x, _type='ADJUST'):\n", - " if x.__class__.__name__ == _type:\n", - " return True\n", - " return False" - ] - }, - { - "cell_type": "code", - "execution_count": 54, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
&L:AMZN20250117C170&S:AMZN20250117C175
2024-01-31HOLD(&L:AMZN20250117C170&S:AMZN20250117C175) R...
2024-02-01HOLD(&L:AMZN20250117C170&S:AMZN20250117C175) R...
2024-02-02HOLD(&L:AMZN20250117C170&S:AMZN20250117C175) R...
2024-02-05HOLD(&L:AMZN20250117C170&S:AMZN20250117C175) R...
2024-02-06HOLD(&L:AMZN20250117C170&S:AMZN20250117C175) R...
......
2024-07-19HOLD(&L:AMZN20250117C170&S:AMZN20250117C175) R...
2024-07-22HOLD(&L:AMZN20250117C170&S:AMZN20250117C175) R...
2024-07-23HOLD(&L:AMZN20250117C170&S:AMZN20250117C175) R...
2024-07-24HOLD(&L:AMZN20250117C170&S:AMZN20250117C175) R...
2024-07-25HOLD(&L:AMZN20250117C170&S:AMZN20250117C175) R...
\n", - "

122 rows × 1 columns

\n", - "
" - ], - "text/plain": [ - " &L:AMZN20250117C170&S:AMZN20250117C175\n", - "2024-01-31 HOLD(&L:AMZN20250117C170&S:AMZN20250117C175) R...\n", - "2024-02-01 HOLD(&L:AMZN20250117C170&S:AMZN20250117C175) R...\n", - "2024-02-02 HOLD(&L:AMZN20250117C170&S:AMZN20250117C175) R...\n", - "2024-02-05 HOLD(&L:AMZN20250117C170&S:AMZN20250117C175) R...\n", - "2024-02-06 HOLD(&L:AMZN20250117C170&S:AMZN20250117C175) R...\n", - "... ...\n", - "2024-07-19 HOLD(&L:AMZN20250117C170&S:AMZN20250117C175) R...\n", - "2024-07-22 HOLD(&L:AMZN20250117C170&S:AMZN20250117C175) R...\n", - "2024-07-23 HOLD(&L:AMZN20250117C170&S:AMZN20250117C175) R...\n", - "2024-07-24 HOLD(&L:AMZN20250117C170&S:AMZN20250117C175) R...\n", - "2024-07-25 HOLD(&L:AMZN20250117C170&S:AMZN20250117C175) R...\n", - "\n", - "[122 rows x 1 columns]" - ] - }, - "execution_count": 54, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rm.actions[rm.actions[rm.actions.columns[0]].apply(find_type, _type = 'HOLD')]#.values[2][0]" - ] - }, - { - "cell_type": "code", - "execution_count": 59, - "metadata": {}, - "outputs": [], - "source": [ - "# data = rm.processed_option_data['NVDA20250117C61']\n", - "data = rm.position_data['&L:AMZN20250117C170&S:AMZN20250117C175']\n", - "# data[['Vega', 'Delta', 'Gamma', 'Theta', 'Midpoint']] = data[['Vega', 'Delta', 'Gamma', 'Theta', 'Midpoint']].replace(0, np.nan).fillna(method='ffill')\n", - "data.plot()" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2025-05-24 01:26:29 DataManager.py CRITICAL: Extra Cols not implemented for BS Greeks\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
VegaVannaVolgaDeltaGammaThetaRhoMidpoint_vegaMidpoint_vannaMidpoint_volgaMidpoint_deltaMidpoint_gammaMidpoint_thetaMidpoint_rho
Datetime
2024-01-031.8790820.65266576.6009700.4042900.001961-0.1214871.5238081.8782960.65392977.2956400.4036230.001966-0.1211651.522590
2024-01-041.9022760.64488970.0200330.4119870.001959-0.1234561.5603551.9019450.64548470.3314940.4116830.001961-0.1233061.559825
2024-01-051.9629470.62191853.0791730.4320140.001945-0.1280051.6613791.9622760.62353953.8356090.4312340.001951-0.1275961.660210
2024-01-082.1108040.5277997.3064250.4894170.001877-0.1401331.9582112.1111490.5216645.2284970.4922940.001846-0.1420651.959015
2024-01-092.1436780.482483-7.3211370.5110980.001784-0.1475432.0400462.1439370.486120-6.1494070.5092270.001805-0.1461492.040718
.............................................
2024-06-040.0000000.0000000.0000000.0000000.0000000.0000000.0000000.800208-2.1563233451.9249410.9593360.000165-0.1766693.281592
2024-06-050.0000000.0000000.0000000.0000000.0000000.0000000.0000000.728099-2.2327753922.1103380.9658360.000133-0.1711593.309508
2024-06-060.0000000.0000000.0000000.0000000.0000000.0000000.0000000.772995-2.1205843590.4961930.9626390.000144-0.1783353.268097
2024-06-070.0000000.0000000.0000000.0000000.0000000.0000000.0000000.759256-2.1539943652.5290040.9633080.000143-0.1764533.261393
2024-06-100.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.000000
\n", - "

114 rows × 14 columns

\n", - "
" - ], - "text/plain": [ - " Vega Vanna Volga Delta Gamma Theta \\\n", - "Datetime \n", - "2024-01-03 1.879082 0.652665 76.600970 0.404290 0.001961 -0.121487 \n", - "2024-01-04 1.902276 0.644889 70.020033 0.411987 0.001959 -0.123456 \n", - "2024-01-05 1.962947 0.621918 53.079173 0.432014 0.001945 -0.128005 \n", - "2024-01-08 2.110804 0.527799 7.306425 0.489417 0.001877 -0.140133 \n", - "2024-01-09 2.143678 0.482483 -7.321137 0.511098 0.001784 -0.147543 \n", - "... ... ... ... ... ... ... \n", - "2024-06-04 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "2024-06-05 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "2024-06-06 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "2024-06-07 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "2024-06-10 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "\n", - " Rho Midpoint_vega Midpoint_vanna Midpoint_volga \\\n", - "Datetime \n", - "2024-01-03 1.523808 1.878296 0.653929 77.295640 \n", - "2024-01-04 1.560355 1.901945 0.645484 70.331494 \n", - "2024-01-05 1.661379 1.962276 0.623539 53.835609 \n", - "2024-01-08 1.958211 2.111149 0.521664 5.228497 \n", - "2024-01-09 2.040046 2.143937 0.486120 -6.149407 \n", - "... ... ... ... ... \n", - "2024-06-04 0.000000 0.800208 -2.156323 3451.924941 \n", - "2024-06-05 0.000000 0.728099 -2.232775 3922.110338 \n", - "2024-06-06 0.000000 0.772995 -2.120584 3590.496193 \n", - "2024-06-07 0.000000 0.759256 -2.153994 3652.529004 \n", - "2024-06-10 0.000000 0.000000 0.000000 0.000000 \n", - "\n", - " Midpoint_delta Midpoint_gamma Midpoint_theta Midpoint_rho \n", - "Datetime \n", - "2024-01-03 0.403623 0.001966 -0.121165 1.522590 \n", - "2024-01-04 0.411683 0.001961 -0.123306 1.559825 \n", - "2024-01-05 0.431234 0.001951 -0.127596 1.660210 \n", - "2024-01-08 0.492294 0.001846 -0.142065 1.959015 \n", - "2024-01-09 0.509227 0.001805 -0.146149 2.040718 \n", - "... ... ... ... ... \n", - "2024-06-04 0.959336 0.000165 -0.176669 3.281592 \n", - "2024-06-05 0.965836 0.000133 -0.171159 3.309508 \n", - "2024-06-06 0.962639 0.000144 -0.178335 3.268097 \n", - "2024-06-07 0.963308 0.000143 -0.176453 3.261393 \n", - "2024-06-10 0.000000 0.000000 0.000000 0.000000 \n", - "\n", - "[114 rows x 14 columns]" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "opt_manager = OptionDataManager(opttick='NVDA20250117C605')\n", - "req = opt_manager.get_timeseries(\n", - " start=rm.start_date,\n", - " end=rm.end_date,\n", - " type_ = 'greeks'\n", - ")\n", - "req.post_processed_data" - ] - }, - { - "cell_type": "code", - "execution_count": 148, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'ticker': 'NVDA', 'put_call': 'C', 'exp_date': '2025-01-17', 'strike': 302.5}" - ] - }, - "execution_count": 148, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "parse_option_tick('NVDA20250117C302.5')" - ] - }, - { - "cell_type": "code", - "execution_count": 141, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
OpenHighLowCloseVolumeBid_sizeCloseBidAsk_sizeCloseAskMidpointWeighted_midpoint
Datetime
2024-06-10 16:00:000.000.000.000.0002563.30565.0564.17563.591667
2024-06-11 16:00:0062.4063.3062.4063.301213563.0522263.7063.37563.454202
2024-06-12 16:00:000.000.000.000.0008266.65567.8067.22566.716092
2024-06-13 16:00:0071.7071.7071.7071.702371.45372.1071.77571.775000
2024-06-14 16:00:0073.7073.7073.7073.70605273.9014674.6074.25074.416162
....................................
2024-12-24 16:00:000.000.000.000.00014979.651080.5080.07579.703459
2024-12-26 16:00:000.000.000.000.00014879.302480.0579.67579.404651
2024-12-27 16:00:000.000.000.000.00012276.402077.4576.92576.547887
2024-12-30 16:00:0077.2577.2577.2577.253018076.5523477.7577.15077.228261
2024-12-31 16:00:000.000.000.000.0002072.302076.2074.25074.250000
\n", - "

142 rows × 11 columns

\n", - "
" - ], - "text/plain": [ - " Open High Low Close Volume Bid_size CloseBid \\\n", - "Datetime \n", - "2024-06-10 16:00:00 0.00 0.00 0.00 0.00 0 25 63.30 \n", - "2024-06-11 16:00:00 62.40 63.30 62.40 63.30 12 135 63.05 \n", - "2024-06-12 16:00:00 0.00 0.00 0.00 0.00 0 82 66.65 \n", - "2024-06-13 16:00:00 71.70 71.70 71.70 71.70 2 3 71.45 \n", - "2024-06-14 16:00:00 73.70 73.70 73.70 73.70 60 52 73.90 \n", - "... ... ... ... ... ... ... ... \n", - "2024-12-24 16:00:00 0.00 0.00 0.00 0.00 0 149 79.65 \n", - "2024-12-26 16:00:00 0.00 0.00 0.00 0.00 0 148 79.30 \n", - "2024-12-27 16:00:00 0.00 0.00 0.00 0.00 0 122 76.40 \n", - "2024-12-30 16:00:00 77.25 77.25 77.25 77.25 30 180 76.55 \n", - "2024-12-31 16:00:00 0.00 0.00 0.00 0.00 0 20 72.30 \n", - "\n", - " Ask_size CloseAsk Midpoint Weighted_midpoint \n", - "Datetime \n", - "2024-06-10 16:00:00 5 65.05 64.175 63.591667 \n", - "2024-06-11 16:00:00 222 63.70 63.375 63.454202 \n", - "2024-06-12 16:00:00 5 67.80 67.225 66.716092 \n", - "2024-06-13 16:00:00 3 72.10 71.775 71.775000 \n", - "2024-06-14 16:00:00 146 74.60 74.250 74.416162 \n", - "... ... ... ... ... \n", - "2024-12-24 16:00:00 10 80.50 80.075 79.703459 \n", - "2024-12-26 16:00:00 24 80.05 79.675 79.404651 \n", - "2024-12-27 16:00:00 20 77.45 76.925 76.547887 \n", - "2024-12-30 16:00:00 234 77.75 77.150 77.228261 \n", - "2024-12-31 16:00:00 20 76.20 74.250 74.250000 \n", - "\n", - "[142 rows x 11 columns]" - ] - }, - "execution_count": 141, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "retrieve_eod_ohlc(\n", - " symbol='NVDA',\n", - " start_date=evb_backtest.portfolio.start_date,\n", - " end_date=evb_backtest.portfolio.risk_manager.end_date,\n", - " strike =605.0/10,\n", - " right='C',\n", - " exp= '2025-01-17',\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 142, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'AAPL': [],\n", - " 'SBUX': [],\n", - " 'AMD': [],\n", - " 'META': [],\n", - " 'COST': [],\n", - " 'NFLX': [],\n", - " 'NVDA': [(Timestamp('2024-06-10 00:00:00'), 10.0)],\n", - " 'AMZN': []}" - ] - }, - "execution_count": 142, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.portfolio.risk_manager.splits" - ] - }, - { - "cell_type": "code", - "execution_count": 115, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[('AAPL',\n", - " [(Timestamp('2000-06-21 00:00:00'), 2.0),\n", - " (Timestamp('2005-02-28 00:00:00'), 2.0),\n", - " (Timestamp('2014-06-09 00:00:00'), 7.0),\n", - " (Timestamp('2020-08-31 00:00:00'), 4.0)]),\n", - " ('SBUX',\n", - " [(Timestamp('2001-04-30 00:00:00'), 2.0),\n", - " (Timestamp('2005-10-24 00:00:00'), 2.0),\n", - " (Timestamp('2015-04-09 00:00:00'), 2.0)]),\n", - " ('AMD', [(Timestamp('2000-08-22 00:00:00'), 2.0)]),\n", - " ('META', []),\n", - " ('COST', [(Timestamp('2000-01-14 00:00:00'), 2.0)]),\n", - " ('NFLX',\n", - " [(Timestamp('2004-02-12 00:00:00'), 2.0),\n", - " (Timestamp('2015-07-15 00:00:00'), 7.0)]),\n", - " ('NVDA',\n", - " [(Timestamp('2000-06-27 00:00:00'), 2.0),\n", - " (Timestamp('2001-09-10 00:00:00'), 2.0),\n", - " (Timestamp('2006-04-07 00:00:00'), 2.0),\n", - " (Timestamp('2007-09-11 00:00:00'), 1.5),\n", - " (Timestamp('2021-07-20 00:00:00'), 4.0),\n", - " (Timestamp('2024-06-10 00:00:00'), 10.0)]),\n", - " ('AMZN', [(Timestamp('2022-06-06 00:00:00'), 20.0)])]" - ] - }, - "execution_count": 115, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.risk_manager.splits.items()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "ename": "StopIteration", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n", - "\u001b[0;31mStopIteration\u001b[0m Traceback (most recent call last)\n", - "Cell \u001b[0;32mIn[230], line 51\u001b[0m\n", - "\u001b[1;32m 49\u001b[0m df[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m% o\u001b[39;00m\u001b[38;5;124mf tottime\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m (df[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtottime\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m/\u001b[39m total_time \u001b[38;5;241m*\u001b[39m \u001b[38;5;241m100\u001b[39m)\u001b[38;5;241m.\u001b[39mround(\u001b[38;5;241m2\u001b[39m)\n", - "\u001b[1;32m 50\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m df\n", - "\u001b[0;32m---> 51\u001b[0m \u001b[43mparse_cprofile\u001b[49m\u001b[43m(\u001b[49m\u001b[43mstats\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msort_by\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mcumtime\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtop_n\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m20\u001b[39;49m\u001b[43m)\u001b[49m\n", - "\n", - "Cell \u001b[0;32mIn[230], line 26\u001b[0m, in \u001b[0;36mparse_cprofile\u001b[0;34m(file_or_stats, sort_by, top_n)\u001b[0m\n", - "\u001b[1;32m 23\u001b[0m stats\u001b[38;5;241m.\u001b[39mstrip_dirs()\u001b[38;5;241m.\u001b[39msort_stats(sort_by)\u001b[38;5;241m.\u001b[39mprint_stats(top_n)\n", - "\u001b[1;32m 24\u001b[0m lines \u001b[38;5;241m=\u001b[39m s\u001b[38;5;241m.\u001b[39mgetvalue()\u001b[38;5;241m.\u001b[39msplitlines()\n", - "\u001b[0;32m---> 26\u001b[0m header_idx \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mnext\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mi\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mi\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mline\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43menumerate\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mlines\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mline\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstrip\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstartswith\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mncalls\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[1;32m 27\u001b[0m data_lines \u001b[38;5;241m=\u001b[39m lines[header_idx \u001b[38;5;241m+\u001b[39m \u001b[38;5;241m1\u001b[39m:]\n", - "\u001b[1;32m 28\u001b[0m parsed \u001b[38;5;241m=\u001b[39m []\n", - "\n", - "\u001b[0;31mStopIteration\u001b[0m: " - ] - } - ], - "source": [ - "\n", - "import pstats\n", - "from io import StringIO\n", - "import pandas as pd\n", - "\n", - "def parse_cprofile(file_or_stats, sort_by=\"cumtime\", top_n=20):\n", - " \"\"\"\n", - " Parses cProfile stats and returns a DataFrame with percentage time and formatted output.\n", - " \n", - " Parameters:\n", - " file_or_stats: str or pstats.Stats\n", - " Path to cProfile output or a pstats.Stats object\n", - " sort_by: str\n", - " Metric to sort by (\"cumtime\", \"tottime\", etc.)\n", - " top_n: int\n", - " Number of top functions to display\n", - " \"\"\"\n", - " if isinstance(file_or_stats, str):\n", - " stats = pstats.Stats(file_or_stats)\n", - " else:\n", - " stats = file_or_stats\n", - "\n", - " s = StringIO()\n", - " stats.strip_dirs().sort_stats(sort_by).print_stats(top_n, stream=s)\n", - " lines = s.getvalue().splitlines()\n", - "\n", - " header_idx = next(i for i, line in enumerate(lines) if line.strip().startswith(\"ncalls\"))\n", - " data_lines = lines[header_idx + 1:]\n", - " parsed = []\n", - "\n", - " for line in data_lines:\n", - " if not line.strip():\n", - " continue\n", - " parts = line.split()\n", - " if len(parts) < 6:\n", - " continue\n", - " ncalls = parts[0]\n", - " tottime = float(parts[1])\n", - " percall1 = float(parts[2])\n", - " cumtime = float(parts[3])\n", - " percall2 = float(parts[4])\n", - " location = \" \".join(parts[5:])\n", - " parsed.append((ncalls, tottime, percall1, cumtime, percall2, location))\n", - "\n", - " df = pd.DataFrame(parsed, columns=[\"ncalls\", \"tottime\", \"percall1\", \"cumtime\", \"percall2\", \"location\"])\n", - " df[[\"tottime\", \"cumtime\"]] = df[[\"tottime\", \"cumtime\"]].astype(float)\n", - "\n", - " total_time = df[\"cumtime\"].max()\n", - " df[\"% of cumtime\"] = (df[\"cumtime\"] / total_time * 100).round(2)\n", - " df[\"% of tottime\"] = (df[\"tottime\"] / total_time * 100).round(2)\n", - " return df\n", - "parse_cprofile(stats, sort_by='cumtime', top_n=20)" - ] - }, - { - "cell_type": "code", - "execution_count": 111, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[(Timestamp('2024-06-10 00:00:00'), 10.0)]" - ] - }, - "execution_count": 111, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "splits = evb_backtest.risk_manager.splits['NVDA']\n", - "adjust = []\n", - "for s in splits:\n", - " if date_inbetween(s[0], evb_backtest.start_date, evb_backtest.end_date):\n", - " adjust.append(s)\n", - "adjust" - ] - }, - { - "cell_type": "code", - "execution_count": 61, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 61, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "def _get_split_dates(self):\n", - " \"\"\"\n", - " Create a cache of split dates for all symbols in the bars.\n", - " \"\"\"\n", - " base = Path(os.environ['WORK_DIR'])/'.cache'/'split_names_dates'\n", - " if base.exists():\n", - " split_names_dates = CustomCache(base.parent, fname = 'split_names_dates', expiry = 1000)\n", - " for s in self.bars.symbol_list:\n", - " if s not in split_names_dates.keys():\n", - " split_names_dates[s] = find_split_dates_within_range(\n", - " tick = s,\n", - " start= '2000-01-01',\n", - " end= datetime.today().strftime('%Y-%m-%d'),\n", - " )\n", - " else:\n", - " split_names_dates = {\n", - " t: find_split_dates_within_range(\n", - " tick = t,\n", - " start= '2000-01-01',\n", - " end= datetime.today().strftime('%Y-%m-%d'),\n", - " ) for t in (self.bars.symbol_list)}\n", - " split_names_dates = CustomCache(base.parent, fname = 'split_names_dates', expiry = 1000, data = split_names_dates)\n", - " return split_names_dates\n", - "\n", - "_get_split_dates(evb_backtest.risk_manager)" - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 58, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "http://127.0.0.1:25510/v2/hist/option/eod?end_date=20241231&root=NFLX&use_csv=true&exp=20240621&right=C&start_date=20240103&strike=530000\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
OpenHighLowCloseVolumeBid_sizeCloseBidAsk_sizeCloseAskMidpointWeighted_midpoint
Datetime
2024-01-03 16:00:0027.8027.8027.1827.184826.25627.1526.70026.635714
2024-01-04 16:00:0027.6528.7027.6528.707128.501128.9528.72528.912500
2024-01-05 16:00:0029.0029.0027.7227.76211127.752028.1027.92527.975806
2024-01-08 16:00:000.000.000.000.0001031.401131.9031.65031.661905
2024-01-09 16:00:000.000.000.000.0002729.952230.6030.27530.241837
....................................
2024-06-14 16:00:000.000.000.000.00025138.4524141.55140.000139.968367
2024-06-17 16:00:000.000.000.000.00025142.4525150.00146.225146.225000
2024-06-18 16:00:00156.40156.40155.88155.88550152.1550160.00156.075156.075000
2024-06-20 16:00:000.000.000.000.00054145.8050153.70149.750149.598077
2024-06-21 16:00:00153.22154.87153.22154.8725152.002160.70156.350154.485714
\n", - "

118 rows × 11 columns

\n", - "
" - ], - "text/plain": [ - " Open High Low Close Volume Bid_size \\\n", - "Datetime \n", - "2024-01-03 16:00:00 27.80 27.80 27.18 27.18 4 8 \n", - "2024-01-04 16:00:00 27.65 28.70 27.65 28.70 7 1 \n", - "2024-01-05 16:00:00 29.00 29.00 27.72 27.76 21 11 \n", - "2024-01-08 16:00:00 0.00 0.00 0.00 0.00 0 10 \n", - "2024-01-09 16:00:00 0.00 0.00 0.00 0.00 0 27 \n", - "... ... ... ... ... ... ... \n", - "2024-06-14 16:00:00 0.00 0.00 0.00 0.00 0 25 \n", - "2024-06-17 16:00:00 0.00 0.00 0.00 0.00 0 25 \n", - "2024-06-18 16:00:00 156.40 156.40 155.88 155.88 5 50 \n", - "2024-06-20 16:00:00 0.00 0.00 0.00 0.00 0 54 \n", - "2024-06-21 16:00:00 153.22 154.87 153.22 154.87 2 5 \n", - "\n", - " CloseBid Ask_size CloseAsk Midpoint Weighted_midpoint \n", - "Datetime \n", - "2024-01-03 16:00:00 26.25 6 27.15 26.700 26.635714 \n", - "2024-01-04 16:00:00 28.50 11 28.95 28.725 28.912500 \n", - "2024-01-05 16:00:00 27.75 20 28.10 27.925 27.975806 \n", - "2024-01-08 16:00:00 31.40 11 31.90 31.650 31.661905 \n", - "2024-01-09 16:00:00 29.95 22 30.60 30.275 30.241837 \n", - "... ... ... ... ... ... \n", - "2024-06-14 16:00:00 138.45 24 141.55 140.000 139.968367 \n", - "2024-06-17 16:00:00 142.45 25 150.00 146.225 146.225000 \n", - "2024-06-18 16:00:00 152.15 50 160.00 156.075 156.075000 \n", - "2024-06-20 16:00:00 145.80 50 153.70 149.750 149.598077 \n", - "2024-06-21 16:00:00 152.00 2 160.70 156.350 154.485714 \n", - "\n", - "[118 rows x 11 columns]" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "retrieve_eod_ohlc(\n", - " symbol=op_manager.symbol,\n", - " start_date=evb_backtest.start_date,\n", - " end_date=evb_backtest.end_date,\n", - " strike=op_manager.strike,\n", - " exp=op_manager.exp,\n", - " right=op_manager.right,\n", - " print_url=True\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## FUNCTION TESTS" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### PRODUCE ORDER CANDIDTATES" - ] - }, - { - "cell_type": "code", - "execution_count": 119, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Using Old DataManager\n" - ] - } - ], - "source": [ - "from EventDriven.riskmanager.utils import produce_order_candidates, populate_cache\n", - "# 66\t502\t533\t184.864771\t183.419998\t-95.355022\t-0.007815\t2024-01-03\t2024-02-16\t44\tAAPL\n", - "# start = pd.to_datetime('2023-06-22').strftime('%Y-%m-%d')\n", - "sig_date = pd.to_datetime('2024-01-03').strftime('%Y-%m-%d')\n", - "tick = 'AAPL'\n", - "signal_id = f'{tick}{pd.to_datetime(sig_date).strftime(\"%Y%m%d\")}LONG'\n", - "order = {'type': 'naked',\n", - " 'specifics': [{'direction': 'long',\n", - " 'rel_strike': .85,\n", - " 'dte': 365,\n", - " 'moneyness_width': 0.10},\n", - " {'direction': 'short',\n", - " 'rel_strike': .80,\n", - " 'dte': 365,\n", - " 'moneyness_width': 0.10}\n", - "],\n", - " 'name': 'vertical_spread'}\n", - "\n", - "# cprofiled_get_order = cProfiler(evb_backtest.risk_manager.get_order)\n", - "# returned_order=cprofiled_get_order(\n", - "# tick=tick,\n", - "# date=start.strftime('%Y-%m-%d'),\n", - "# right='C',\n", - "# order_settings=order,\n", - "# max_close=2,\n", - "# signal_id=signal_id,\n", - "# )\n", - "\n", - "order_candidates = produce_order_candidates(\n", - " order,\n", - " tick,\n", - " sig_date,\n", - " 'C'\n", - ")\n", - "# order_candidates" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "##### POPULATE CACHE" - ] - }, - { - "cell_type": "code", - "execution_count": 100, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Using Old DataManager\n", - "Using V2\n", - "Looks like our young fellow is targetting: 2024-01-03\n", - "['AAPL20250117C195', 'AAPL20250117C195', 'AAPL20250117C200', 'AAPL20250117C200', 'AAPL20250117C205', 'AAPL20250117C205', 'AAPL20250117C210', 'AAPL20250117C210', 'AAPL20250117C215', 'AAPL20250117C215', 'AAPL20250117C220', 'AAPL20250117C220', 'AAPL20250117C225', 'AAPL20250117C225', 'AAPL20250117C230', 'AAPL20250117C230', 'AAPL20250117C235', 'AAPL20250117C235', 'AAPL20250117C240', 'AAPL20250117C240', 'AAPL20250117C245', 'AAPL20250117C245', 'AAPL20250117C205', 'AAPL20250117C205', 'AAPL20250117C210', 'AAPL20250117C210', 'AAPL20250117C215', 'AAPL20250117C215', 'AAPL20250117C220', 'AAPL20250117C220', 'AAPL20250117C225', 'AAPL20250117C225', 'AAPL20250117C230', 'AAPL20250117C230', 'AAPL20250117C235', 'AAPL20250117C235', 'AAPL20250117C240', 'AAPL20250117C240', 'AAPL20250117C245', 'AAPL20250117C245', 'AAPL20250117C250', 'AAPL20250117C250', 'AAPL20250117C255', 'AAPL20250117C255', 'AAPL20250117C260', 'AAPL20250117C260']\n", - "Now, my dear friend, we are done\n" - ] - } - ], - "source": [ - "populate_cache(\n", - " evb_backtest.risk_manager.start_date,\n", - " evb_backtest.risk_manager.end_date,\n", - " order_candidates,\n", - " sig_date,\n", - ")\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### RISK MANAGER GET ORDER" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "## ***Signal ID: AAPL20240103LONG***" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Using V2\n", - "Looks like our young fellow is targetting: 2024-01-03\n", - "Now, my dear friend, we are done\n", - "Order Produced: {'result': 'SUCCESSFUL', 'data': {'long': ['AAPL20250117C225'], 'short': ['AAPL20250117C235'], 'trade_id': '&L:AAPL20250117C225&S:AAPL20250117C235', 'close': 1.9500000000000002}}\n", - "Position ID: &L:AAPL20250117C225&S:AAPL20250117C235\n", - "Calculating Position Greeks\n", - "Calculate Greeks dates\n", - "Start Date: 2024-01-03 00:00:00\n", - "End Date: 2024-12-31 00:00:00\n", - "2025-05-23 16:10:04 DataManager.py CRITICAL: Extra Cols not implemented for BS Greeks\n", - "Calculate Greeks dates\n", - "Start Date: 2024-01-03 00:00:00\n", - "End Date: 2024-12-31 00:00:00\n", - "2025-05-23 16:10:04 DataManager.py CRITICAL: Extra Cols not implemented for BS Greeks\n", - "Updating Signal Limits\n", - "Spot Price at Purchase: 184.25 at time 2024-01-03 00:00:00\n", - "Delta at Purchase: 0.0697741230044624\n", - "Equivalent Delta Size: 0.36, with Cash Available: 1610.1759002667368, and Leverage: 4.5\n", - "Equivalent Delta Size: 0.36\n", - "Calculating Quantity\n", - "Spot Price at Purchase: 184.25 at time 2024-01-03 00:00:00\n", - "Cash Available: 1610.1759002667368, Option Price: 1.9500000000000002, Cash_Available/OptPRice: 8.257312309060188\n", - "Target Delta: 0.36\n", - "Delta from Full Cash Spend: 0.5581929840356992, Size: 8\n", - "Delta with Size Limit: 0.348870615022312, Size: 5\n", - "Quantity for Position (&L:AAPL20250117C225&S:AAPL20250117C235): 5\n", - "{'result': 'SUCCESSFUL', 'data': {'long': ['AAPL20250117C225'], 'short': ['AAPL20250117C235'], 'trade_id': '&L:AAPL20250117C225&S:AAPL20250117C235', 'close': 1.9500000000000002, 'quantity': 5}}\n" - ] - } - ], - "source": [ - "\n", - "tgt_date = pd.to_datetime('2024-01-03')\n", - "sig_date = pd.to_datetime('2024-01-03').strftime('%Y-%m-%d')\n", - "tick = 'AAPL'\n", - "signal_id = f'{tick}{pd.to_datetime(sig_date).strftime(\"%Y%m%d\")}LONG'\n", - "order = {'type': 'naked',\n", - " 'specifics': [{'direction': 'long',\n", - " 'rel_strike': .85,\n", - " 'dte': 365,\n", - " 'moneyness_width': 0.10},\n", - " {'direction': 'short',\n", - " 'rel_strike': .80,\n", - " 'dte': 365,\n", - " 'moneyness_width': 0.10}\n", - "],\n", - " 'name': 'vertical_spread'}\n", - "\n", - "cprofiled_get_order = cProfiler(evb_backtest.risk_manager.get_order)\n", - "returned_order=cprofiled_get_order(\n", - " tick=tick,\n", - " date=tgt_date.strftime('%Y-%m-%d'),\n", - " right='C',\n", - " order_settings=order,\n", - " max_close=2,\n", - " signal_id=signal_id,\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## To - Do:\n", - "\n", - "- Add more info on actions:\n", - " - Raw Actions: Saves the dict from greek, dte, moneyness\n", - " - Add current greek, greek limit, adjusted greek to the Greek dict.\n", - " \n", - "- Take start and end into consideration when using cache. This is to ensure we don't use stale data (not updated) on diffent timelines of the backtest\n", - " - Rather, we could still keep OptTick key, but update the data in the cache." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['&L:BA20240119C225&S:BA20240119C230',\n", - " '&L:NVDA20240119C205&S:NVDA20240119C210',\n", - " '&L:NFLX20240119C455&S:NFLX20240119C460',\n", - " '&L:AMD20240119C100&S:AMD20240119C105',\n", - " '&L:AAPL20240119C170&S:AAPL20240119C175',\n", - " '&L:AAPL20240315C170&S:AAPL20240315C175',\n", - " '&L:AMZN20240315C135&S:AMZN20240315C145',\n", - " '&L:SBUX20240621C115&S:SBUX20240621C120']" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.risk_manager.position_data.keys()" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
TickerPnLReturnPctEntryPriceEntryCommissionEntrySlippageEntryMarketValueTotalEntryCostAuxilaryEntryCostExitPriceExitCommissionExitSlippageExitMarketValueTotalExitCostAuxilaryExitCostQuantityEntryTimeExitTimeDurationPositionsSignalID
0BA-47.580859-0.119904198.4117992.69.223598394.2235983.96823611.823598174.6213702.6-18.157261351.8427393.49242720.75726122023-01-042023-09-11250.0&L:BA20240119C225&S:BA20240119C230BA20230104LONG
1NVDA4054.8783231.350036200.23549319.5171.5323942984.03239430.035324191.032394470.56071419.5-347.0892847077.91071670.584107366.589284152023-01-192023-12-29344.0&L:NVDA20240119C205&S:NVDA20240119C210NVDA20230119LONG
2NFLX-385.466244-0.409836156.7562437.832.737460932.7374609.40537540.53746092.5118697.8-22.128784562.8712165.55071229.92878462023-01-242023-09-27246.0&L:NFLX20240119C455&S:NFLX20240119C460NFLX20230124LONG
3META1187.5777171.610206184.3828595.222.331434732.3314347.37531427.531434481.2772885.2-49.6908491930.30915119.25109254.89084942023-01-302023-12-29333.0&L:META20240119C165&S:META20240119C170META20230130LONG
4AMD575.7401170.251517176.08261316.9127.1739712272.17397122.890740144.073971220.37031416.9-108.2859122881.71408828.648141125.185912132023-02-022023-09-21231.0&L:AMD20240119C100&S:AMD20240119C105AMD20230202LONG
5AAPL-399.947817-0.220432201.59794511.7115.1815081802.68150818.143815126.881508157.15929911.7-58.8663091426.13369114.14433770.56630992023-02-032023-02-2724.0&L:AAPL20240119C170&S:AAPL20240119C175AAPL20230203LONG
6AAPL559.4207190.360845193.78856410.439.9085081539.90850815.50308550.308508263.71615310.4-59.8707722120.12922821.09729270.27077282023-03-062023-10-26234.0&L:AAPL20240315C170&S:AAPL20240315C175AAPL20230306LONG
7AMZN524.8731370.443082197.4324797.881.7948711176.79487111.84594989.594871284.9113357.8-37.7319921717.26800817.09468045.53199262023-04-282023-10-26181.0&L:AMZN20240315C135&S:AMZN20240315C145AMZN20230428LONG
8SBUXNaNNaN208.31745013.0120.1744952070.17449520.831745133.174495NaNNaNNaNNaNNaNNaN102023-05-05NaTNaN&L:SBUX20240621C115&S:SBUX20240621C120SBUX20230418LONG
\n", - "
" - ], - "text/plain": [ - " Ticker PnL ReturnPct EntryPrice EntryCommission EntrySlippage \\\n", - "0 BA -47.580859 -0.119904 198.411799 2.6 9.223598 \n", - "1 NVDA 4054.878323 1.350036 200.235493 19.5 171.532394 \n", - "2 NFLX -385.466244 -0.409836 156.756243 7.8 32.737460 \n", - "3 META 1187.577717 1.610206 184.382859 5.2 22.331434 \n", - "4 AMD 575.740117 0.251517 176.082613 16.9 127.173971 \n", - "5 AAPL -399.947817 -0.220432 201.597945 11.7 115.181508 \n", - "6 AAPL 559.420719 0.360845 193.788564 10.4 39.908508 \n", - "7 AMZN 524.873137 0.443082 197.432479 7.8 81.794871 \n", - "8 SBUX NaN NaN 208.317450 13.0 120.174495 \n", - "\n", - " EntryMarketValue TotalEntryCost AuxilaryEntryCost ExitPrice \\\n", - "0 394.223598 3.968236 11.823598 174.621370 \n", - "1 2984.032394 30.035324 191.032394 470.560714 \n", - "2 932.737460 9.405375 40.537460 92.511869 \n", - "3 732.331434 7.375314 27.531434 481.277288 \n", - "4 2272.173971 22.890740 144.073971 220.370314 \n", - "5 1802.681508 18.143815 126.881508 157.159299 \n", - "6 1539.908508 15.503085 50.308508 263.716153 \n", - "7 1176.794871 11.845949 89.594871 284.911335 \n", - "8 2070.174495 20.831745 133.174495 NaN \n", - "\n", - " ExitCommission ExitSlippage ExitMarketValue TotalExitCost \\\n", - "0 2.6 -18.157261 351.842739 3.492427 \n", - "1 19.5 -347.089284 7077.910716 70.584107 \n", - "2 7.8 -22.128784 562.871216 5.550712 \n", - "3 5.2 -49.690849 1930.309151 19.251092 \n", - "4 16.9 -108.285912 2881.714088 28.648141 \n", - "5 11.7 -58.866309 1426.133691 14.144337 \n", - "6 10.4 -59.870772 2120.129228 21.097292 \n", - "7 7.8 -37.731992 1717.268008 17.094680 \n", - "8 NaN NaN NaN NaN \n", - "\n", - " AuxilaryExitCost Quantity EntryTime ExitTime Duration \\\n", - "0 20.757261 2 2023-01-04 2023-09-11 250.0 \n", - "1 366.589284 15 2023-01-19 2023-12-29 344.0 \n", - "2 29.928784 6 2023-01-24 2023-09-27 246.0 \n", - "3 54.890849 4 2023-01-30 2023-12-29 333.0 \n", - "4 125.185912 13 2023-02-02 2023-09-21 231.0 \n", - "5 70.566309 9 2023-02-03 2023-02-27 24.0 \n", - "6 70.270772 8 2023-03-06 2023-10-26 234.0 \n", - "7 45.531992 6 2023-04-28 2023-10-26 181.0 \n", - "8 NaN 10 2023-05-05 NaT NaN \n", - "\n", - " Positions SignalID \n", - "0 &L:BA20240119C225&S:BA20240119C230 BA20230104LONG \n", - "1 &L:NVDA20240119C205&S:NVDA20240119C210 NVDA20230119LONG \n", - "2 &L:NFLX20240119C455&S:NFLX20240119C460 NFLX20230124LONG \n", - "3 &L:META20240119C165&S:META20240119C170 META20230130LONG \n", - "4 &L:AMD20240119C100&S:AMD20240119C105 AMD20230202LONG \n", - "5 &L:AAPL20240119C170&S:AAPL20240119C175 AAPL20230203LONG \n", - "6 &L:AAPL20240315C170&S:AAPL20240315C175 AAPL20230306LONG \n", - "7 &L:AMZN20240315C135&S:AMZN20240315C145 AMZN20230428LONG \n", - "8 &L:SBUX20240621C115&S:SBUX20240621C120 SBUX20230418LONG " - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.portfolio.trades" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'&L:BA20240119C225&S:BA20240119C230': HOLD(&L:BA20240119C225&S:BA20240119C230) Reason: dte),\n", - " '&L:NVDA20240119C205&S:NVDA20240119C210': HOLD(&L:NVDA20240119C205&S:NVDA20240119C210) Reason: dte),\n", - " '&L:NFLX20240119C455&S:NFLX20240119C460': HOLD(&L:NFLX20240119C455&S:NFLX20240119C460) Reason: dte),\n", - " '&L:META20240119C165&S:META20240119C170': HOLD(&L:META20240119C165&S:META20240119C170) Reason: dte),\n", - " '&L:AMD20240119C100&S:AMD20240119C105': HOLD(&L:AMD20240119C100&S:AMD20240119C105) Reason: dte)}" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "tmp = pd.Timestamp(('2023-02-02 00:00:00'))\n", - "evb_backtest.risk_manager._actions[tmp]" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "from pprint import pprint\n", - "actions = evb_backtest.risk_manager.actions.copy()\n", - "# actions[~actions['&L:NFLX20240119C455&S:NFLX20240119C460'].isna()].tail(50)\n", - "# idx = [k for k.keys() in evb_backtest.risk_manager._actions]\n", - "# actions = [v for v in evb_backtest.risk_manager._actions.values]\n", - "# print(actions)#[~actions['&L:BA20240119C225&S:BA20240119C230'].isna()].tail(50)['&L:BA20240119C225&S:BA20240119C230'].values[-1])\n" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
VegaVannaVolgaDeltaGammaThetaRhoMidpointsrys0_close
Datetime
2023-03-070.000158-0.204612-9.8015340.058631-0.000241-0.0004740.0521092.0250.00.00.00.0
2023-03-080.002083-0.200509-11.2806940.060319-0.000317-0.0006600.0526262.1000.00.00.00.0
2023-03-090.006826-0.166657-13.5513920.059064-0.000065-0.0006710.0524051.8500.00.00.00.0
2023-03-100.008656-0.147948-13.9943580.0573890.000116-0.0005950.0517051.6750.00.00.00.0
2023-03-130.011035-0.150727-15.6442980.0601510.000094-0.0007430.0540071.7250.00.00.00.0
.......................................
2023-12-250.0409980.112964-8.4191910.0703760.004351-0.0027860.0300980.665NaN0.00.0NaN
2023-12-260.0460730.106544-10.7679690.0795950.004482-0.0034920.0333070.7800.00.00.00.0
2023-12-270.0410470.126353-7.3569040.0692720.004599-0.0027880.0289590.6250.00.00.00.0
2023-12-280.0449620.112180-10.2170620.0779620.004645-0.0033000.0324700.7400.00.00.00.0
2023-12-290.0481170.106621-11.6688220.0834440.004645-0.0037500.0344770.8150.00.00.00.0
\n", - "

214 rows × 12 columns

\n", - "
" - ], - "text/plain": [ - " Vega Vanna Volga Delta Gamma Theta \\\n", - "Datetime \n", - "2023-03-07 0.000158 -0.204612 -9.801534 0.058631 -0.000241 -0.000474 \n", - "2023-03-08 0.002083 -0.200509 -11.280694 0.060319 -0.000317 -0.000660 \n", - "2023-03-09 0.006826 -0.166657 -13.551392 0.059064 -0.000065 -0.000671 \n", - "2023-03-10 0.008656 -0.147948 -13.994358 0.057389 0.000116 -0.000595 \n", - "2023-03-13 0.011035 -0.150727 -15.644298 0.060151 0.000094 -0.000743 \n", - "... ... ... ... ... ... ... \n", - "2023-12-25 0.040998 0.112964 -8.419191 0.070376 0.004351 -0.002786 \n", - "2023-12-26 0.046073 0.106544 -10.767969 0.079595 0.004482 -0.003492 \n", - "2023-12-27 0.041047 0.126353 -7.356904 0.069272 0.004599 -0.002788 \n", - "2023-12-28 0.044962 0.112180 -10.217062 0.077962 0.004645 -0.003300 \n", - "2023-12-29 0.048117 0.106621 -11.668822 0.083444 0.004645 -0.003750 \n", - "\n", - " Rho Midpoint s r y s0_close \n", - "Datetime \n", - "2023-03-07 0.052109 2.025 0.0 0.0 0.0 0.0 \n", - "2023-03-08 0.052626 2.100 0.0 0.0 0.0 0.0 \n", - "2023-03-09 0.052405 1.850 0.0 0.0 0.0 0.0 \n", - "2023-03-10 0.051705 1.675 0.0 0.0 0.0 0.0 \n", - "2023-03-13 0.054007 1.725 0.0 0.0 0.0 0.0 \n", - "... ... ... ... ... ... ... \n", - "2023-12-25 0.030098 0.665 NaN 0.0 0.0 NaN \n", - "2023-12-26 0.033307 0.780 0.0 0.0 0.0 0.0 \n", - "2023-12-27 0.028959 0.625 0.0 0.0 0.0 0.0 \n", - "2023-12-28 0.032470 0.740 0.0 0.0 0.0 0.0 \n", - "2023-12-29 0.034477 0.815 0.0 0.0 0.0 0.0 \n", - "\n", - "[214 rows x 12 columns]" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# get_cache('close')\n", - "evb_backtest.risk_manager.position_data['&L:SBUX20240621C110&S:SBUX20240621C115']" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Analyzing Positions on 2023-01-04 00:00:00\n", - "Checking DTE on 2023-01-04 00:00:00\n", - "Roll Dict {'&L:BA20240119C225&S:BA20240119C230': 'HOLD'}\n", - "Checking Moneyness on 2023-01-04 00:00:00\n", - "Moneyness Dict {'&L:BA20240119C225&S:BA20240119C230': 'HOLD'}\n", - "Checking Limits on 2023-01-04 00:00:00\n", - "Delta for Position &L:BA20240119C225&S:BA20240119C230 is within limits\n", - "Greek Dict {'&L:BA20240119C225&S:BA20240119C230': {'vega': {'status': False, 'quantity_diff': 0}, 'gamma': {'status': False, 'quantity_diff': 0}, 'delta': {'status': False, 'quantity_diff': 0}, 'theta': {'status': False, 'quantity_diff': 0}}}\n" - ] - }, - { - "data": { - "text/plain": [ - "{'&L:BA20240119C225&S:BA20240119C230': HOLD(&L:BA20240119C225&S:BA20240119C230)}" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.risk_manager.analyze_position()\n", - "# evb_backtest.portfolio.current_positions" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [], - "source": [ - "evb_backtest.risk_manager.limits['delta'] = False" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
SizeEntryBarExitBarEntryPriceExitPricePnLReturnPctEntryTimeExitTimeDurationTicker
0105504551103.049417100.110001-308.638768-0.0285242023-01-042023-03-1469SBUX
112504675195.863123213.759995214.7624620.0913742023-01-042023-09-11250BA
289451475217.09562549.81300029249.3327401.9137862023-01-192023-12-29344NVDA
314517687358.781354382.399994330.6609620.0658302023-01-242023-09-27246NFLX
426521752149.932939358.9899905435.4833411.3943372023-01-302023-12-29333META
....................................
1496717735104.10308897.379997-645.416698-0.0645812023-11-082023-12-0527SBUX
15120718752114.499348149.5000004200.0781840.3056842023-11-092023-12-2950AMD
1646721752145.507500153.100006349.2552810.0521792023-11-142023-12-2945AMZN
1740722752240.127508255.100006598.8999140.0623522023-11-152023-12-2944TSLA
1812728752221.382136260.670013471.4545340.1774662023-11-242023-12-2935BA
\n", - "

19 rows × 11 columns

\n", - "
" - ], - "text/plain": [ - " Size EntryBar ExitBar EntryPrice ExitPrice PnL ReturnPct \\\n", - "0 105 504 551 103.049417 100.110001 -308.638768 -0.028524 \n", - "1 12 504 675 195.863123 213.759995 214.762462 0.091374 \n", - "2 894 514 752 17.095625 49.813000 29249.332740 1.913786 \n", - "3 14 517 687 358.781354 382.399994 330.660962 0.065830 \n", - "4 26 521 752 149.932939 358.989990 5435.483341 1.394337 \n", - ".. ... ... ... ... ... ... ... \n", - "14 96 717 735 104.103088 97.379997 -645.416698 -0.064581 \n", - "15 120 718 752 114.499348 149.500000 4200.078184 0.305684 \n", - "16 46 721 752 145.507500 153.100006 349.255281 0.052179 \n", - "17 40 722 752 240.127508 255.100006 598.899914 0.062352 \n", - "18 12 728 752 221.382136 260.670013 471.454534 0.177466 \n", - "\n", - " EntryTime ExitTime Duration Ticker \n", - "0 2023-01-04 2023-03-14 69 SBUX \n", - "1 2023-01-04 2023-09-11 250 BA \n", - "2 2023-01-19 2023-12-29 344 NVDA \n", - "3 2023-01-24 2023-09-27 246 NFLX \n", - "4 2023-01-30 2023-12-29 333 META \n", - ".. ... ... ... ... \n", - "14 2023-11-08 2023-12-05 27 SBUX \n", - "15 2023-11-09 2023-12-29 50 AMD \n", - "16 2023-11-14 2023-12-29 45 AMZN \n", - "17 2023-11-15 2023-12-29 44 TSLA \n", - "18 2023-11-24 2023-12-29 35 BA \n", - "\n", - "[19 rows x 11 columns]" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "trades_" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Generating order for BA at 2023-01-04 00:00:00 index 1\n" - ] - }, - { - "data": { - "text/markdown": [ - "## ***Signal ID: BA20230104LONG***" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Using V2\n", - "Looks like our young fellow is targetting: 2023-01-04\n", - "Generating Data for BA 2024-01-19 00:00:00\n", - "Data Is_complete bool: True\n", - "Actually! We are not done yet. We need to get the spot prices for the requested date\n", - "Now, my dear friend, we are done\n", - "Order Produced: {'result': 'SUCCESSFUL', 'data': {'long': ['BA20240119C220'], 'short': ['BA20240119C290'], 'trade_id': '&L:BA20240119C220&S:BA20240119C290', 'close': 19.75}}\n", - "Position ID: &L:BA20240119C220&S:BA20240119C290\n", - "Calculating Position Greeks\n", - "Calculate Greeks dates\n", - "Start Date: 2023-01-04 00:00:00\n", - "End Date: 2023-12-29 00:00:00\n", - "2025-05-18 20:38:01 DataManager.py CRITICAL: Extra Cols not implemented for BS Greeks\n", - "Calculate Greeks dates\n", - "Start Date: 2023-01-04 00:00:00\n", - "End Date: 2023-12-29 00:00:00\n", - "2025-05-18 20:38:01 DataManager.py CRITICAL: Extra Cols not implemented for BS Greeks\n" - ] - }, - { - "ename": "KeyboardInterrupt", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[35], line 31\u001b[0m\n\u001b[1;32m 19\u001b[0m order \u001b[38;5;241m=\u001b[39m {\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mtype\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mnaked\u001b[39m\u001b[38;5;124m'\u001b[39m,\n\u001b[1;32m 20\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mspecifics\u001b[39m\u001b[38;5;124m'\u001b[39m: [{\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mdirection\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlong\u001b[39m\u001b[38;5;124m'\u001b[39m,\n\u001b[1;32m 21\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mrel_strike\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[38;5;241m.85\u001b[39m,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 28\u001b[0m ],\n\u001b[1;32m 29\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mname\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mvertical_spread\u001b[39m\u001b[38;5;124m'\u001b[39m}\n\u001b[1;32m 30\u001b[0m cprofiled_get_order \u001b[38;5;241m=\u001b[39m cProfiler(evb_backtest\u001b[38;5;241m.\u001b[39mrisk_manager\u001b[38;5;241m.\u001b[39mget_order)\n\u001b[0;32m---> 31\u001b[0m returned_order\u001b[38;5;241m=\u001b[39m\u001b[43mcprofiled_get_order\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 32\u001b[0m \u001b[43m \u001b[49m\u001b[43mtick\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtick\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 33\u001b[0m \u001b[43m \u001b[49m\u001b[43mdate\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstart\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstrftime\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43m%\u001b[39;49m\u001b[38;5;124;43mY-\u001b[39;49m\u001b[38;5;124;43m%\u001b[39;49m\u001b[38;5;124;43mm-\u001b[39;49m\u001b[38;5;132;43;01m%d\u001b[39;49;00m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 34\u001b[0m \u001b[43m \u001b[49m\u001b[43mright\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mC\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 35\u001b[0m \u001b[43m \u001b[49m\u001b[43morder_settings\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43morder\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 36\u001b[0m \u001b[43m \u001b[49m\u001b[43mmax_close\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m20\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 37\u001b[0m \u001b[43m \u001b[49m\u001b[43msignal_id\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msignal_id\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 38\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 39\u001b[0m all_orders[signal_id] \u001b[38;5;241m=\u001b[39m returned_order\n\u001b[1;32m 40\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n", - "File \u001b[0;32m~/cloned_repos/QuantTools/trade/helpers/decorators.py:72\u001b[0m, in \u001b[0;36mcProfiler..wrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 70\u001b[0m profiler \u001b[38;5;241m=\u001b[39m cProfile\u001b[38;5;241m.\u001b[39mProfile()\n\u001b[1;32m 71\u001b[0m profiler\u001b[38;5;241m.\u001b[39menable()\n\u001b[0;32m---> 72\u001b[0m results \u001b[38;5;241m=\u001b[39m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 73\u001b[0m profiler\u001b[38;5;241m.\u001b[39mdisable()\n\u001b[1;32m 74\u001b[0m stream \u001b[38;5;241m=\u001b[39m io\u001b[38;5;241m.\u001b[39mStringIO()\n", - "File \u001b[0;32m~/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:371\u001b[0m, in \u001b[0;36mRiskManager.get_order\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 369\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mPosition ID: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mposition_id\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 370\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mCalculating Position Greeks\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m--> 371\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcalculate_position_greeks\u001b[49m\u001b[43m(\u001b[49m\u001b[43mposition_id\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mdate\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 372\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mUpdating Signal Limits\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m 373\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mupdate_greek_limits(signalID, position_id)\n", - "File \u001b[0;32m~/cloned_repos/QuantTools/trade/helpers/decorators.py:14\u001b[0m, in \u001b[0;36mlog_time..decorator..wrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[38;5;129m@wraps\u001b[39m(func)\n\u001b[1;32m 12\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mwrapper\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 13\u001b[0m start \u001b[38;5;241m=\u001b[39m time\u001b[38;5;241m.\u001b[39mtime()\n\u001b[0;32m---> 14\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 15\u001b[0m end \u001b[38;5;241m=\u001b[39m time\u001b[38;5;241m.\u001b[39mtime()\n\u001b[1;32m 16\u001b[0m logger\u001b[38;5;241m.\u001b[39minfo(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mfunc\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__name__\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m took \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mend\u001b[38;5;250m \u001b[39m\u001b[38;5;241m-\u001b[39m\u001b[38;5;250m \u001b[39mstart\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m seconds\u001b[39m\u001b[38;5;124m'\u001b[39m)\n", - "File \u001b[0;32m~/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:460\u001b[0m, in \u001b[0;36mRiskManager.calculate_position_greeks\u001b[0;34m(self, positionID, date)\u001b[0m\n\u001b[1;32m 457\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m \u001b[38;5;28minput\u001b[39m, list_ \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mzip\u001b[39m([data_manager, s, r, y, s0_close, _set[\u001b[38;5;241m0\u001b[39m]], thread_input_list):\n\u001b[1;32m 458\u001b[0m list_\u001b[38;5;241m.\u001b[39mappend(\u001b[38;5;28minput\u001b[39m)\n\u001b[0;32m--> 460\u001b[0m \u001b[43mrunThreads\u001b[49m\u001b[43m(\u001b[49m\u001b[43mget_timeseries\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mthread_input_list\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 462\u001b[0m position_data \u001b[38;5;241m=\u001b[39m \u001b[38;5;28msum\u001b[39m(long) \u001b[38;5;241m-\u001b[39m \u001b[38;5;28msum\u001b[39m(short)\n\u001b[1;32m 463\u001b[0m position_data \u001b[38;5;241m=\u001b[39m position_data[\u001b[38;5;241m~\u001b[39mposition_data\u001b[38;5;241m.\u001b[39mindex\u001b[38;5;241m.\u001b[39mduplicated(keep \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mfirst\u001b[39m\u001b[38;5;124m'\u001b[39m)]\n", - "File \u001b[0;32m~/cloned_repos/QuantTools/trade/helpers/threads.py:32\u001b[0m, in \u001b[0;36mrunThreads\u001b[0;34m(func, OrderedInputs, run_type, block, thread_name_prefix)\u001b[0m\n\u001b[1;32m 30\u001b[0m results \u001b[38;5;241m=\u001b[39m []\n\u001b[1;32m 31\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m block:\n\u001b[0;32m---> 32\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mwith\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mThreadPoolExecutor\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmax_workers\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mnum_threads\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mthread_name_prefix\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mthread_name_prefix\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mas\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mexecutor\u001b[49m\u001b[43m:\u001b[49m\n\u001b[1;32m 33\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mrun_type\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m==\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mmap\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m:\u001b[49m\n\u001b[1;32m 34\u001b[0m \u001b[43m \u001b[49m\u001b[43mresults\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mexecutor\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmap\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfunc\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mOrderedInputs\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:647\u001b[0m, in \u001b[0;36mExecutor.__exit__\u001b[0;34m(self, exc_type, exc_val, exc_tb)\u001b[0m\n\u001b[1;32m 646\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__exit__\u001b[39m(\u001b[38;5;28mself\u001b[39m, exc_type, exc_val, exc_tb):\n\u001b[0;32m--> 647\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mshutdown\u001b[49m\u001b[43m(\u001b[49m\u001b[43mwait\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[1;32m 648\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mFalse\u001b[39;00m\n", - "File \u001b[0;32m~/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:235\u001b[0m, in \u001b[0;36mThreadPoolExecutor.shutdown\u001b[0;34m(self, wait, cancel_futures)\u001b[0m\n\u001b[1;32m 233\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m wait:\n\u001b[1;32m 234\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m t \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_threads:\n\u001b[0;32m--> 235\u001b[0m \u001b[43mt\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mjoin\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/miniconda3/envs/openbb/lib/python3.11/threading.py:1119\u001b[0m, in \u001b[0;36mThread.join\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 1116\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mRuntimeError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcannot join current thread\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 1118\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m timeout \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m-> 1119\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_wait_for_tstate_lock\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1120\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 1121\u001b[0m \u001b[38;5;66;03m# the behavior of a negative timeout isn't documented, but\u001b[39;00m\n\u001b[1;32m 1122\u001b[0m \u001b[38;5;66;03m# historically .join(timeout=x) for x<0 has acted as if timeout=0\u001b[39;00m\n\u001b[1;32m 1123\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_wait_for_tstate_lock(timeout\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mmax\u001b[39m(timeout, \u001b[38;5;241m0\u001b[39m))\n", - "File \u001b[0;32m~/miniconda3/envs/openbb/lib/python3.11/threading.py:1139\u001b[0m, in \u001b[0;36mThread._wait_for_tstate_lock\u001b[0;34m(self, block, timeout)\u001b[0m\n\u001b[1;32m 1136\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m\n\u001b[1;32m 1138\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m-> 1139\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[43mlock\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43macquire\u001b[49m\u001b[43m(\u001b[49m\u001b[43mblock\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[43m)\u001b[49m:\n\u001b[1;32m 1140\u001b[0m lock\u001b[38;5;241m.\u001b[39mrelease()\n\u001b[1;32m 1141\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_stop()\n", - "\u001b[0;31mKeyboardInterrupt\u001b[0m: " - ] - } - ], - "source": [ - "# 66\t525\t540\t148.548104\t147.710007\t-55.314406\t-0.005642\t2023-02-03\t2023-02-27\t24\tAAPL\n", - "# clear_cache()\n", - "# \tSize\tEntryBar\tExitBar\tEntryPrice\tExitPrice\tPnL\tReturnPct\tEntryTime\tExitTime\tDuration\tTicker\n", - "# 2\t894\t514\t752\t17.095625\t49.813000\t29249.332740\t1.913786\t2023-01-19\t2023-12-29\t344\tNVDA\n", - "# 3\t14\t517\t687\t358.781354\t382.399994\t330.660962\t0.065830\t2023-01-24\t2023-09-27\t246\tNFLX\n", - "# 6\t66\t525\t540\t148.548104\t147.710007\t-55.314406\t-0.005642\t2023-02-03\t2023-02-27\t24\tAAPL\n", - "# 7\t63\t545\t708\t154.328258\t170.369995\t1010.629422\t0.103946\t2023-03-06\t2023-10-26\t234\tAAPL\n", - "# 12\t13\t704\t752\t407.049710\t490.369995\t1083.163708\t0.204693\t2023-10-20\t2023-12-29\t70\tNFLX\n", - "# 13\t61\t714\t752\t174.849846\t193.899994\t1162.059051\t0.108951\t2023-11-03\t2023-12-29\t56\tAAPL\n", - "# {'NVDA': 2, 'AAPL': 2, 'NFLX': 2})\n", - "all_orders = {}\n", - "failed_signals = {}\n", - "for index, row in trades_.iterrows():\n", - " try:\n", - " start = pd.to_datetime(row['EntryTime'])\n", - " tick = row['Ticker']\n", - " print(f\"Generating order for {tick} at {start} index {index}\")\n", - " signal_id = f'{tick}{start.strftime(\"%Y%m%d\")}LONG'\n", - " order = {'type': 'naked',\n", - " 'specifics': [{'direction': 'long',\n", - " 'rel_strike': .85,\n", - " 'dte': 365,\n", - " 'moneyness_width': 0.10},\n", - " {'direction': 'short',\n", - " 'rel_strike': .80,\n", - " 'dte': 365,\n", - " 'moneyness_width': 0.10}\n", - " ],\n", - " 'name': 'vertical_spread'}\n", - " cprofiled_get_order = cProfiler(evb_backtest.risk_manager.get_order)\n", - " returned_order=cprofiled_get_order(\n", - " tick=tick,\n", - " date=start.strftime('%Y-%m-%d'),\n", - " right='C',\n", - " order_settings=order,\n", - " max_close=20,\n", - " signal_id=signal_id,\n", - " )\n", - " all_orders[signal_id] = returned_order\n", - " except Exception as e:\n", - " print(f\"Failed to generate order for {tick} at {start} index {index}\")\n", - " failed_signals[(signal_id, start, tick)] = e\n", - "returned_order" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "from EventDriven.portfolio import OptionSignalPortfolio\n", - "from EventDriven.backtest import OptionSignalBacktest\n", - "from copy import deepcopy\n", - "from functools import partial\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# ***Extending Risk Manager for greek handling***" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### ***INITIAL BACKTEST RUN***" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
SizeEntryBarExitBarEntryPriceExitPricePnLReturnPctEntryTimeExitTimeDurationTicker
0105504551103.049417100.110001-308.638768-0.0285242023-01-042023-03-1469SBUX
314517687358.781354382.399994330.6609620.0658302023-01-242023-09-27246NFLX
426521752149.932939358.9899905435.4833411.3943372023-01-302023-12-29333META
896575587109.251048104.269997-478.180907-0.0455932023-04-182023-05-0416SBUX
1213704752407.049710490.3699951083.1637080.2046932023-10-202023-12-2970NFLX
1496717735104.10308897.379997-645.416698-0.0645812023-11-082023-12-0527SBUX
\n", - "
" - ], - "text/plain": [ - " Size EntryBar ExitBar EntryPrice ExitPrice PnL ReturnPct \\\n", - "0 105 504 551 103.049417 100.110001 -308.638768 -0.028524 \n", - "3 14 517 687 358.781354 382.399994 330.660962 0.065830 \n", - "4 26 521 752 149.932939 358.989990 5435.483341 1.394337 \n", - "8 96 575 587 109.251048 104.269997 -478.180907 -0.045593 \n", - "12 13 704 752 407.049710 490.369995 1083.163708 0.204693 \n", - "14 96 717 735 104.103088 97.379997 -645.416698 -0.064581 \n", - "\n", - " EntryTime ExitTime Duration Ticker \n", - "0 2023-01-04 2023-03-14 69 SBUX \n", - "3 2023-01-24 2023-09-27 246 NFLX \n", - "4 2023-01-30 2023-12-29 333 META \n", - "8 2023-04-18 2023-05-04 16 SBUX \n", - "12 2023-10-20 2023-12-29 70 NFLX \n", - "14 2023-11-08 2023-12-05 27 SBUX " - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import json\n", - "pd.set_option('display.max_columns', 100)\n", - "pd.set_option('display.max_rows', 100)\n", - "_key = 10\n", - "with open(f'../input/profitable_weights_{_key}.json', 'r') as f:\n", - " weights = json.load(f)\n", - "ttrades__ = pd.read_csv(f'../input/profitable_trades_{_key}.csv').iloc[:, 1:]\n", - "ttrades__['Duration'] = ttrades__.Duration.apply(lambda x: int(x.split(' ')[0]))\n", - "# AMZN20220329LONG\n", - "tick = ['NFLX', 'META','SBUX']\n", - "ttrades__ = ttrades__[(ttrades__.Ticker.isin(tick))]\n", - "trades_ = ttrades__.copy()\n", - "# trades_.loc[17, 'Size'] = -126\n", - "# ttrades__\n", - "trades_" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "('TSLA20230602LONG', Timestamp('2023-06-02 00:00:00'), 'TSLA')" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "signal_id, start, tick = list(failed_signals.keys())[0]\n", - "error = failed_signals[(signal_id, start, tick)]\n", - "# # print(error)\n", - "signal_id, start, tick\n", - "# failed_signals.values()\n", - "# signal_id" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "('TSLA20230602LONG', '2023-06-02', 'TSLA')" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "signal_id, start, tick = ('TSLA20230602LONG', ('2023-06-02'), 'TSLA')\n", - "signal_id, start, tick" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(Timestamp('2023-01-04 00:00:00'), Timestamp('2023-12-29 00:00:00'))" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.risk_manager.start_date, evb_backtest.risk_manager.end_date" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2025-05-12 20:56:04 trade.asset.Stock ERROR: Error getting dividends history for AMZN from yfinance\n", - "2025-05-12 20:56:04 trade.asset.Stock ERROR: Probably due to no dividends history\n", - "2025-05-12 20:56:19 DataManager.py ERROR: \n", - "2025-05-12 20:56:19 DataManager.py ERROR: query_thetadata raise an error: Data not found for the given parameters: {'end_date': 20230118, 'root': 'AMZN', 'use_csv': 'true', 'exp': 20240315, 'right': 'C', 'start_date': 20230104, 'strike': 115000, 'url': 'http://127.0.0.1:25510/v2/hist/option/eod?end_date=20230118&root=AMZN&use_csv=true&exp=20240315&right=C&start_date=20230104&strike=115000'}\n", - "Traceback (most recent call last):\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/decorators.py\", line 44, in wrapper\n", - " return func(*args, **kwargs)\n", - " ^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py\", line 219, in query_thetadata\n", - " data = retrieve_eod_ohlc(symbol=self.symbol, end_date=end, exp=exp, right=right, start_date=start, strike=strike, print_url=print_url)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_sync.py\", line 105, in retry\n", - " ret = target(*args, **kwargs)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py\", line 327, in retrieve_eod_ohlc\n", - " raise_thetadata_exception(response, querystring, proxy)\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaExceptions.py\", line 81, in raise_thetadata_exception\n", - " raise ThetaDataNotFound(f\"Data not found for the given parameters: {params}\")\n", - "dbase.DataAPI.ThetaExceptions.ThetaDataNotFound: Data not found for the given parameters: {'end_date': 20230118, 'root': 'AMZN', 'use_csv': 'true', 'exp': 20240315, 'right': 'C', 'start_date': 20230104, 'strike': 115000, 'url': 'http://127.0.0.1:25510/v2/hist/option/eod?end_date=20230118&root=AMZN&use_csv=true&exp=20240315&right=C&start_date=20230104&strike=115000'}\n", - "Traceback (most recent call last):\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/decorators.py\", line 44, in wrapper\n", - " return func(*args, **kwargs)\n", - " ^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py\", line 219, in query_thetadata\n", - " data = retrieve_eod_ohlc(symbol=self.symbol, end_date=end, exp=exp, right=right, start_date=start, strike=strike, print_url=print_url)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_sync.py\", line 105, in retry\n", - " ret = target(*args, **kwargs)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py\", line 327, in retrieve_eod_ohlc\n", - " raise_thetadata_exception(response, querystring, proxy)\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaExceptions.py\", line 81, in raise_thetadata_exception\n", - " raise ThetaDataNotFound(f\"Data not found for the given parameters: {params}\")\n", - "dbase.DataAPI.ThetaExceptions.ThetaDataNotFound: Data not found for the given parameters: {'end_date': 20230118, 'root': 'AMZN', 'use_csv': 'true', 'exp': 20240315, 'right': 'C', 'start_date': 20230104, 'strike': 115000, 'url': 'http://127.0.0.1:25510/v2/hist/option/eod?end_date=20230118&root=AMZN&use_csv=true&exp=20240315&right=C&start_date=20230104&strike=115000'}\n", - "2025-05-12 20:56:19 DataManager.py ERROR: args (,), kwargs: {'start': Timestamp('2023-01-04 00:00:00'), 'end': Timestamp('2023-01-18 00:00:00'), 'strike': 115.0, 'exp': '2024-03-15', 'right': 'C', 'bulk': False, 'data_request': }\n", - "2025-05-12 20:56:20 DataManager.py ERROR: Call Chain: wrapper -> __handle_incomplete_data -> get_timeseries -> query_thetadata\n" - ] - } - ], - "source": [ - "opt_manager = OptionDataManager(opttick = 'AMZN20240315C115')\n", - "req = opt_manager.get_timeseries(\n", - " start = evb_backtest.risk_manager.start_date,\n", - " end =evb_backtest.risk_manager.end_date,\n", - "\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Signal ID: TSLA20230602LONG\n", - "Using V2\n", - "Looks like our young fellow is targetting: 2023-06-02\n", - "Generating Data for TSLA 2024-06-21 00:00:00\n", - "Data Is_complete bool: False\n", - "Time taken to update cache: 0.025025129318237305\n", - "I'm proud of you, we are finally done\n", - "Actually! We are not done yet. We need to get the spot prices for the requested date\n", - "Now, my dear friend, we are done\n", - "Order Produced: {'result': 'SUCCESSFUL', 'data': {'long': ['TSLA20240621C230'], 'short': ['TSLA20240621C300'], 'trade_id': '&L:TSLA20240621C230&S:TSLA20240621C300', 'close': 19.75}}\n", - "Position ID: &L:TSLA20240621C230&S:TSLA20240621C300\n", - "Calculating Position Greeks\n", - "Calculate Greeks dates\n", - "Start Date: 2023-01-04 00:00:00\n", - "End Date: 2023-12-29 00:00:00\n", - "2025-05-12 21:15:30 DataManager.py CRITICAL: Extra Cols not implemented for BS Greeks\n", - "Calculate Greeks dates\n", - "Start Date: 2023-01-04 00:00:00\n", - "End Date: 2023-12-29 00:00:00\n", - "2025-05-12 21:15:30 DataManager.py CRITICAL: Extra Cols not implemented for BS Greeks\n" - ] - }, - { - "ename": "", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[1;31mThe Kernel crashed while executing code in the current cell or a previous cell. \n", - "\u001b[1;31mPlease review the code in the cell(s) to identify a possible cause of the failure. \n", - "\u001b[1;31mClick here for more info. \n", - "\u001b[1;31mView Jupyter log for further details." - ] - } - ], - "source": [ - "## Add logs for\n", - "order = {'type': 'naked',\n", - "'specifics': [{'direction': 'long',\n", - " 'rel_strike': .85,\n", - " 'dte': 365,\n", - " 'moneyness_width': 0.10},\n", - " {'direction': 'short',\n", - " 'rel_strike': .80,\n", - " 'dte': 365,\n", - " 'moneyness_width': 0.10}\n", - "],\n", - "'name': 'vertical_spread'}\n", - "cprofiled_get_order = cProfiler(evb_backtest.risk_manager.get_order)\n", - "returned_order=cprofiled_get_order(\n", - " tick=tick,\n", - " date=start.strftime('%Y-%m-%d'),\n", - " right='C',\n", - " order_settings=order,\n", - " max_close=20,\n", - " signal_id=signal_id,\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'delta': {'AMZN20230428LONG': 0.495,\n", - " 'SBUX20230104LONG': 0.945,\n", - " 'BA20230104LONG': 0.09,\n", - " 'NVDA20230119LONG': 8.325000000000001,\n", - " 'NFLX20230124LONG': 0.09,\n", - " 'META20230130LONG': 0.225,\n", - " 'AMD20230202LONG': 1.215,\n", - " 'AAPL20230203LONG': 0.54,\n", - " 'AAPL20230306LONG': 0.585,\n", - " 'NFLX20231020LONG': 0.09,\n", - " 'AAPL20231103LONG': 0.495,\n", - " 'SBUX20231108LONG': 0.945,\n", - " 'AMD20231109LONG': 0.945,\n", - " 'AMZN20231114LONG': 0.36,\n", - " 'TSLA20231115LONG': 0.36,\n", - " 'BA20231124LONG': 0.09},\n", - " 'gamma': {},\n", - " 'vega': {},\n", - " 'theta': {}}" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.risk_manager.greek_limits" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'result': 'NO_TRADED_CLOSE', 'data': None}" - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "returned_order[0]" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " 3041639 function calls (3029910 primitive calls) in 68.492 seconds\n", - "\n", - " Ordered by: cumulative time\n", - "\n", - " ncalls tottime percall cumtime percall filename:lineno(function)\n", - " 1 0.004 0.004 68.494 68.494 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:340(get_order)\n", - " 6/3 0.003 0.000 58.656 19.552 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/decorators.py:11(wrapper)\n", - " 2/1 0.001 0.001 55.172 55.172 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/decorators.py:41(wrapper)\n", - " 1 0.002 0.002 55.171 55.171 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:50(get_order)\n", - " 281 51.350 0.183 51.350 0.183 {method 'acquire' of '_thread.lock' objects}\n", - " 5 0.001 0.000 48.958 9.792 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/threads.py:4(runThreads)\n", - " 26 0.000 0.000 48.885 1.880 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1087(join)\n", - " 40 0.000 0.000 48.885 1.222 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1125(_wait_for_tstate_lock)\n", - " 5 0.000 0.000 48.882 9.776 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:646(__exit__)\n", - " 5 0.000 0.000 48.882 9.776 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:216(shutdown)\n", - " 1 0.000 0.000 45.343 45.343 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:604(populate_cache)\n", - " 1 0.002 0.002 45.276 45.276 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:451(populate_cache_v2)\n", - " 1 0.002 0.002 35.805 35.805 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:237(update_cache_with_missing_ticks)\n", - " 1 0.002 0.002 13.307 13.307 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:368(calculate_position_greeks)\n", - " 1 0.002 0.002 9.706 9.706 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:821(produce_order_candidates)\n", - " 2 0.015 0.007 9.704 4.852 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:685(chain_details)\n", - " 4/3 0.011 0.003 9.203 3.068 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_sync.py:85(retry)\n", - " 2 0.000 0.000 7.750 3.875 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/decorators.py:25(wrapper)\n", - " 1 0.000 0.000 6.250 6.250 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1522(init_query)\n", - " 1 0.001 0.001 6.248 6.248 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/database/SQLHelpers.py:343(query_database)\n", - " 1 0.001 0.001 6.248 6.248 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/database/SQLHelpers.py:100(query_database)\n", - " 1 0.003 0.003 6.247 6.247 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:570(read_sql)\n", - " 2 0.000 0.000 6.090 3.045 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1713(exec_driver_sql)\n", - " 2 0.002 0.001 6.089 3.045 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1791(_execute_context)\n", - " 1 0.001 0.001 5.929 5.929 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:1779(read_query)\n", - " 2 0.003 0.001 5.911 2.955 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1850(_exec_single_context)\n", - " 2 0.000 0.000 5.898 2.949 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:940(do_execute)\n", - " 2 0.001 0.000 5.898 2.949 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:311(execute)\n", - " 1 0.000 0.000 5.896 5.896 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:1655(execute)\n", - " 1 0.001 0.001 5.073 5.073 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:382(spot)\n", - " 1 0.001 0.001 5.012 5.012 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:155(retrieve_timeseries)\n", - " 11183 0.211 0.000 4.625 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:673(to_datetime)\n", - " 1 0.001 0.001 4.161 4.161 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:214(_handle_result)\n", - " 1 0.000 0.000 4.160 4.160 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:815(_handle_resultset)\n", - " 1 0.031 0.031 4.159 4.159 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:456(get_rows)\n", - " 748 4.127 0.006 4.127 0.006 {method 'fetch_row' of '_mysql_connector.MySQL' objects}\n", - " 11140 0.173 0.000 3.712 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:314(_convert_listlike_datetimes)\n", - " 1 0.004 0.004 3.520 3.520 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:465(option_chain)\n", - " 1 0.005 0.005 3.410 3.410 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:150(list_contracts)\n", - " 1 0.001 0.001 3.339 3.339 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/api.py:62(get)\n", - " 1 0.002 0.002 3.339 3.339 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/api.py:14(request)\n", - " 1 0.001 0.001 3.326 3.326 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:500(request)\n", - " 1 0.000 0.000 3.258 3.258 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:673(send)\n", - " 1 0.002 0.002 3.254 3.254 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:613(send)\n", - " 1 0.001 0.001 3.238 3.238 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:594(urlopen)\n", - " 1 0.000 0.000 3.233 3.233 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:379(_make_request)\n", - " 1 0.001 0.001 3.224 3.224 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:481(getresponse)\n", - " 1 0.001 0.001 3.219 3.219 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1351(getresponse)\n", - " 1 0.000 0.000 3.218 3.218 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:318(begin)\n", - " 1 0.001 0.001 3.213 3.213 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:285(_read_status)\n", - " 11 0.001 0.000 3.212 0.292 {method 'readline' of '_io.BufferedReader' objects}\n", - " 5 0.000 0.000 3.212 0.642 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:704(readinto)\n", - " 5 3.212 0.642 3.212 0.642 {method 'recv_into' of '_socket.socket' objects}\n", - " 1 0.000 0.000 3.168 3.168 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/obbject.py:87(to_df)\n", - " 1 0.000 0.000 3.168 3.168 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/obbject.py:127(to_dataframe)\n", - " 1 0.002 0.002 3.131 3.131 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/utils.py:20(basemodel_to_df)\n", - " 6 0.000 0.000 3.072 0.512 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:4789(apply)\n", - " 6 0.001 0.000 3.072 0.512 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1409(apply)\n", - " 6 0.000 0.000 3.071 0.512 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1482(apply_standard)\n", - " 7 0.000 0.000 3.056 0.437 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:891(_map_values)\n", - " 7 0.043 0.006 3.055 0.436 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:1667(map_array)\n", - " 58 0.001 0.000 2.468 0.043 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:295(wait)\n", - " 2 0.001 0.000 2.465 1.233 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/utils/decorators.py:47(wrapper)\n", - " 2 0.000 0.000 2.462 1.231 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/utils/decorators.py:35(wrapper)\n", - " 2 0.000 0.000 2.412 1.206 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/validate_call_decorator.py:58(wrapper_function)\n", - " 2 0.001 0.000 2.411 1.206 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_validate_call.py:95(__call__)\n", - " 2 0.000 0.000 2.411 1.205 {method 'validate_python' of 'pydantic_core._pydantic_core.SchemaValidator' objects}\n", - " 2 0.001 0.001 2.406 1.203 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/container.py:23(_run)\n", - " 2 0.000 0.000 2.404 1.202 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/command_runner.py:503(sync_run)\n", - " 2 0.000 0.000 2.404 1.202 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/provider/utils/helpers.py:581(run_async)\n", - " 44 0.000 0.000 2.392 0.054 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:428(result)\n", - " 6 0.000 0.000 2.391 0.398 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/from_thread.py:275(call)\n", - " 14630 0.133 0.000 2.189 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:320(__new__)\n", - " 15139 0.257 0.000 1.833 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:329(_from_sequence_not_strict)\n", - " 1 0.004 0.004 1.755 1.755 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/equity_price.py:28(historical)\n", - " 2 0.001 0.000 1.735 0.868 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/opentelemetry/context_propagation.py:93(wrapper)\n", - " 2 0.003 0.002 1.735 0.867 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:690(cmd_query)\n", - " 2 1.731 0.865 1.731 0.865 {method 'query' of '_mysql_connector.MySQL' objects}\n", - " 1 0.000 0.000 1.500 1.500 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:726(one_off_save)\n", - " 1 0.000 0.000 1.500 1.500 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1327(bulk_one_off_save)\n", - " 1 0.001 0.001 1.500 1.500 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager_processes.py:347(schedule)\n", - " 1 0.000 0.000 1.499 1.499 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager.py:360(_schedule)\n", - " 1 0.001 0.001 1.498 1.498 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager.py:323(is_already_scheduled)\n", - " 1 0.000 0.000 1.497 1.497 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager.py:33(construct_current_scheduled_names)\n", - " 1 0.002 0.002 1.493 1.493 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager.py:54()\n", - " 143 0.032 0.000 1.491 0.010 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/Requests.py:36(construct_request_name)\n", - " 4 0.000 0.000 1.437 0.359 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1780(apply)\n", - " 4 0.000 0.000 1.430 0.357 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1850(_python_apply_general)\n", - " 4 0.002 0.000 1.427 0.357 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:897(apply_groupwise)\n", - " 10627 0.046 0.000 1.386 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:259(_box_as_indexlike)\n", - " 11123 0.475 0.000 1.165 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:126(_guess_datetime_format_for_array)\n", - " 6 0.000 0.000 1.034 0.172 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:212(check_all_days_available)\n", - " 15139 0.260 0.000 0.950 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2184(_sequence_to_dt64)\n", - "757412/749704 0.443 0.000 0.852 0.000 {built-in method builtins.isinstance}\n", - " 6 0.000 0.000 0.831 0.139 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1807(f)\n", - " 1 0.000 0.000 0.768 0.768 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:309(div_yield)\n", - " 26263 0.148 0.000 0.762 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2428(maybe_convert_dtype)\n", - " 1 0.000 0.000 0.753 0.753 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:325(div_yield_history)\n", - " 1 0.001 0.001 0.656 0.656 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/equity_fundamental.py:938(dividends)\n", - " 642/639 0.009 0.000 0.628 0.001 {built-in method builtins.all}\n", - " 6 0.014 0.002 0.500 0.083 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:216()\n", - " 4233 0.013 0.000 0.496 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:177(__contains__)\n", - " 4250 0.054 0.000 0.478 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:582(get_loc)\n", - " 1500 0.016 0.000 0.451 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:217()\n", - " 11751 0.044 0.000 0.421 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5373(__getitem__)\n", - " 497 0.029 0.000 0.399 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:456(_array_strptime_with_fallback)\n", - " 654 0.041 0.000 0.397 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:475(__new__)\n", - " 15140 0.097 0.000 0.373 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2425(ensure_arraylike_for_datetimelike)\n", - " 3 0.000 0.000 0.370 0.123 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:219(check_missing_dates)\n", - " 11211 0.050 0.000 0.368 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:373(__getitem__)\n", - " 26289 0.115 0.000 0.362 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1163(is_float_dtype)\n", - " 68232 0.134 0.000 0.356 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:173(search)\n", - " 919 0.025 0.000 0.330 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:517(sanitize_array)\n", - " 3 0.008 0.003 0.330 0.110 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:223()\n", - " 4587 0.110 0.000 0.315 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3777(get_loc)\n", - " 11212 0.043 0.000 0.315 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:278(__getitem__)\n", - " 554 0.031 0.000 0.286 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:666(_parse)\n", - " 114471 0.131 0.000 0.280 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/generic.py:42(_instancecheck)\n", - " 11127 0.154 0.000 0.270 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:545(_box_func)\n", - " 41465 0.075 0.000 0.242 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1375(_is_dtype)\n", - " 10646 0.223 0.000 0.239 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2354(objects_to_datetime64)\n", - " 560 0.005 0.000 0.228 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:769(_try_cast)\n", - " 26496 0.088 0.000 0.226 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1198(is_bool_dtype)\n", - " 497 0.013 0.000 0.222 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1200(maybe_cast_to_datetime)\n", - " 4147 0.135 0.000 0.213 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:842(_engine)\n", - " 12 0.001 0.000 0.206 0.017 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/utils.py:47(bus_range)\n", - " 71238 0.136 0.000 0.199 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:272(_compile)\n", - " 1 0.000 0.000 0.199 0.199 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:2037(has_table)\n", - " 1 0.000 0.000 0.197 0.197 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:400(has_table)\n", - " 1 0.000 0.000 0.197 0.197 :1(has_table)\n", - " 1 0.000 0.000 0.196 0.196 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:78(cache)\n", - " 1 0.002 0.002 0.196 0.196 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/base.py:2732(has_table)\n", - " 2 0.001 0.000 0.175 0.088 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1523(_init_statement)\n", - " 2 0.000 0.000 0.175 0.087 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1736(create_cursor)\n", - " 2 0.000 0.000 0.174 0.087 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1757(create_default_cursor)\n", - " 2 0.000 0.000 0.174 0.087 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1483(cursor)\n", - " 2 0.002 0.001 0.174 0.087 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:733(cursor)\n", - " 2 0.000 0.000 0.170 0.085 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:387(is_connected)\n", - " 2 0.170 0.085 0.170 0.085 {method 'ping' of '_mysql_connector.MySQL' objects}\n", - " 14 0.007 0.001 0.169 0.012 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:850(change_to_last_busday)\n", - " 15127 0.032 0.000 0.163 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:536(is_string_dtype)\n", - " 34 0.001 0.000 0.160 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:1022(bdate_range)\n", - " 34 0.001 0.000 0.159 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:821(date_range)\n", - " 34 0.009 0.000 0.158 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:397(_generate_range)\n", - " 15703 0.125 0.000 0.158 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:649(_simple_new)\n", - " 15410 0.044 0.000 0.148 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7688(maybe_extract_name)\n", - " 1 0.000 0.000 0.147 0.147 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:662(pre_process_data)\n", - " 114471 0.111 0.000 0.147 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/generic.py:37(_check)\n", - " 34 0.005 0.000 0.141 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:468()\n", - " 21 0.014 0.001 0.137 0.007 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:694(__init__)\n", - " 554 0.012 0.000 0.136 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:199(split)\n", - " 3739 0.136 0.000 0.136 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2712(_generate_range)\n", - " 15173 0.125 0.000 0.135 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:304(_simple_new)\n", - " 509 0.003 0.000 0.132 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:325(_from_sequence)\n", - " 11383 0.121 0.000 0.121 0.000 {built-in method numpy.array}\n", - " 68039 0.062 0.000 0.118 0.000 :117(__instancecheck__)\n", - " 223 0.005 0.000 0.118 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4062(__getitem__)\n", - " 5590 0.009 0.000 0.108 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:189(__next__)\n", - " 26825 0.058 0.000 0.108 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1434(_is_dtype_type)\n", - " 120 0.000 0.000 0.102 0.001 {built-in method builtins.next}\n", - " 58 0.000 0.000 0.100 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:132(__enter__)\n", - " 5590 0.070 0.000 0.099 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:77(get_token)\n", - " 7 0.001 0.000 0.098 0.014 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:84(__init__)\n", - "206299/206262 0.084 0.000 0.092 0.000 {built-in method builtins.getattr}\n", - " 1 0.000 0.000 0.091 0.091 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:1643(__exit__)\n", - " 1 0.000 0.000 0.091 0.091 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:607(close)\n", - " 1 0.000 0.000 0.091 0.091 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:558(__exit__)\n", - " 1 0.000 0.000 0.091 0.091 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:234(__exit__)\n", - " 1 0.000 0.000 0.091 0.091 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1218(close)\n", - " 1 0.000 0.000 0.090 0.090 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2576(close)\n", - " 1 0.000 0.000 0.090 0.090 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2725(_do_close)\n", - " 1 0.001 0.001 0.090 0.090 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2709(_close_impl)\n", - " 6 0.000 0.000 0.089 0.015 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/utils.py:18(__init__)\n", - " 118/109 0.011 0.000 0.089 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:389(__init__)\n", - " 1 0.000 0.000 0.089 0.089 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2703(_connection_rollback_impl)\n", - " 1 0.000 0.000 0.089 0.089 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1113(_rollback_impl)\n", - " 1 0.000 0.000 0.088 0.088 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:698(do_rollback)\n", - " 1 0.000 0.000 0.088 0.088 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:578(rollback)\n", - " 1 0.088 0.088 0.088 0.088 {method 'rollback' of '_mysql_connector.MySQL' objects}\n", - " 67961 0.062 0.000 0.087 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1399(_get_dtype)\n", - " 62/53 0.003 0.000 0.084 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4271(__setitem__)\n", - " 4 0.005 0.001 0.083 0.021 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Context.py:16(Context)\n", - " 15127 0.061 0.000 0.082 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:572(condition)\n", - " 497 0.012 0.000 0.080 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1240(_ensure_nanosecond_dtype)\n", - " 7 0.005 0.001 0.079 0.011 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:423(dict_to_mgr)\n", - " 60 0.001 0.000 0.078 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4514(_set_item)\n", - " 250 0.003 0.000 0.076 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:692()\n", - " 28 0.000 0.000 0.076 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:611(wait)\n", - " 923 0.026 0.000 0.076 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:875(_parse_numeric_token)\n", - " 26 0.000 0.000 0.075 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:945(start)\n", - " 5 0.000 0.000 0.074 0.015 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:583(map)\n", - " 5 0.000 0.000 0.074 0.015 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:608()\n", - " 34 0.001 0.000 0.074 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:161(submit)\n", - " 2 0.000 0.000 0.074 0.037 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:9492(pivot_table)\n", - " 2 0.000 0.000 0.073 0.037 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/pivot.py:61(pivot_table)\n", - " 2 0.002 0.001 0.073 0.037 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/pivot.py:118(__internal_pivot_table)\n", - " 34 0.001 0.000 0.072 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:180(_adjust_thread_count)\n", - " 77 0.001 0.000 0.072 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4130(_getitem_bool_array)\n", - " 11152 0.072 0.000 0.072 0.000 {method 'view' of 'numpy.generic' objects}\n", - " 1241 0.017 0.000 0.072 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:346(_name_get)\n", - " 19346 0.060 0.000 0.065 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:645(__iter__)\n", - " 8 0.000 0.000 0.065 0.008 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_decorators.py:325(wrapper)\n", - " 2 0.001 0.001 0.064 0.032 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1204(__repr__)\n", - " 60 0.004 0.000 0.064 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4481(_set_item_mgr)\n", - " 2 0.001 0.000 0.064 0.032 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:737(__init__)\n", - " 2 0.001 0.000 0.061 0.030 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1310(to_string)\n", - " 4238 0.007 0.000 0.060 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:571(_disallow_mismatched_indexing)\n", - " 2 0.001 0.001 0.058 0.029 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:939(to_string)\n", - " 2 0.001 0.000 0.056 0.028 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/string.py:28(to_string)\n", - " 61 0.003 0.000 0.056 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1347(insert)\n", - " 68039 0.055 0.000 0.056 0.000 {built-in method _abc._abc_instancecheck}\n", - " 16276 0.038 0.000 0.056 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:416(extract_array)\n", - " 2 0.000 0.000 0.056 0.028 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/string.py:40(_get_string_representation)\n", - " 10622 0.026 0.000 0.055 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/utils.py:48()\n", - " 14 0.001 0.000 0.055 0.004 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/utils.py:26(default_timestamp)\n", - " 4289 0.036 0.000 0.053 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:769(_assert_tzawareness_compat)\n", - " 68259 0.053 0.000 0.053 0.000 {method 'search' of 're.Pattern' objects}\n", - " 3 0.000 0.000 0.053 0.018 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:335(__init__)\n", - " 70729 0.030 0.000 0.053 0.000 {built-in method builtins.hasattr}\n", - " 12 0.013 0.001 0.051 0.004 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/utils.py:54()\n", - " 2 0.001 0.000 0.051 0.025 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/string.py:34(_get_strcols)\n", - " 2 0.001 0.000 0.050 0.025 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:472(get_strcols)\n", - " 2 0.001 0.000 0.050 0.025 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/validate_call_decorator.py:28(validate_call)\n", - " 108/82 0.002 0.000 0.049 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/common.py:62(new_method)\n", - " 1 0.009 0.009 0.049 0.049 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/utils.py:30()\n", - " 2 0.001 0.000 0.049 0.024 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/validate_call_decorator.py:51(validate)\n", - " 2 0.002 0.001 0.048 0.024 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:704(_get_strcols_without_index)\n", - " 2 0.003 0.001 0.048 0.024 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_validate_call.py:26(__init__)\n", - " 50 0.001 0.000 0.048 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:869(take)\n", - " 1 0.001 0.001 0.045 0.045 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:750(merge_environment_settings)\n", - " 1 0.000 0.000 0.045 0.045 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:826(get_environ_proxies)\n", - " 1241 0.005 0.000 0.044 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:330(_name_includes_bit_suffix)\n", - " 44 0.001 0.000 0.043 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4027(take)\n", - " 11 0.001 0.000 0.043 0.004 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:140()\n", - " 40 0.001 0.000 0.042 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4142(_take_with_is_copy)\n", - " 11 0.003 0.000 0.042 0.004 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:876(liquidity_check)\n", - " 15516 0.028 0.000 0.042 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:576(tz)\n", - " 1 0.000 0.000 0.042 0.042 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:765(should_bypass_proxies)\n", - " 1 0.001 0.001 0.041 0.041 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2672(proxy_bypass)\n", - " 14 0.001 0.000 0.041 0.003 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:839(is_USholiday)\n", - " 63 0.002 0.000 0.041 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:623(reindex_indexer)\n", - " 10621 0.007 0.000 0.040 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/main.py:352(model_dump)\n", - " 28 0.001 0.000 0.040 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:751(format_col)\n", - " 3759 0.040 0.000 0.040 0.000 {cyfunction Timestamp.strftime at 0x125052330}\n", - " 15139 0.040 0.000 0.040 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2310(_construct_from_dt64_naive)\n", - " 1117 0.006 0.000 0.039 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numerictypes.py:357(issubdtype)\n", - " 1 0.000 0.000 0.039 0.039 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2658(proxy_bypass_macosx_sysconf)\n", - " 1 0.038 0.038 0.038 0.038 {built-in method _scproxy._get_proxy_settings}\n", - " 15173 0.038 0.000 0.038 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:103(tz_to_dtype)\n", - " 1094 0.004 0.000 0.037 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_strptime.py:26(_getlang)\n", - " 159 0.024 0.000 0.037 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1157(maybe_infer_to_datetimelike)\n", - " 1 0.000 0.000 0.036 0.036 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:868(read_csv)\n", - " 1 0.003 0.003 0.036 0.036 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:583(_read)\n", - " 2 0.002 0.001 0.036 0.018 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:10170(apply)\n", - " 1 0.000 0.000 0.035 0.035 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:78(method)\n", - " 1 0.001 0.001 0.035 0.035 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:736(map)\n", - " 61 0.003 0.000 0.035 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6956(insert)\n", - " 18 0.001 0.000 0.034 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:209(_maybe_cache)\n", - " 1 0.000 0.000 0.034 0.034 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/obbject.py:169(is_list_of_basemodel)\n", - " 2 0.002 0.001 0.034 0.017 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:864(apply)\n", - " 1094 0.004 0.000 0.034 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/locale.py:594(getlocale)\n", - " 10621 0.032 0.000 0.033 0.000 {method 'to_python' of 'pydantic_core._pydantic_core.SchemaSerializer' objects}\n", - " 60 0.001 0.000 0.033 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6662(copy)\n", - " 11 0.000 0.000 0.033 0.003 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:150()\n", - " 2234 0.031 0.000 0.033 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numerictypes.py:283(issubclass_)\n", - " 9 0.002 0.000 0.033 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:607(_init_dict)\n", - " 11 0.001 0.000 0.032 0.003 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:781(available_close_check)\n", - " 2 0.001 0.000 0.032 0.016 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1061(apply_standard)\n", - " 247 0.004 0.000 0.032 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6284(__getattr__)\n", - " 10622 0.005 0.000 0.032 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/obbject.py:170()\n", - " 34 0.002 0.000 0.031 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1079(format_array)\n", - " 73 0.002 0.000 0.031 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1176(__getitem__)\n", - " 26706 0.022 0.000 0.031 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:123()\n", - " 70 0.002 0.000 0.031 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:557(copy)\n", - " 17/2 0.000 0.000 0.031 0.015 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:620(generate_schema)\n", - " 267 0.002 0.000 0.030 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:3983(_ixs)\n", - " 1 0.000 0.000 0.030 0.030 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:194(_wrap_result)\n", - " 349/339 0.002 0.000 0.030 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:59(take_nd)\n", - " 27/2 0.001 0.000 0.029 0.015 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:906(_generate_schema_inner)\n", - "12074/12054 0.020 0.000 0.029 0.000 {built-in method numpy.asarray}\n", - " 2 0.000 0.000 0.029 0.015 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1070(apply_series_generator)\n", - " 2 0.002 0.001 0.029 0.015 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/__extensions__.py:93(equity)\n", - " 4331 0.013 0.000 0.029 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:728(is_valid_na_for_dtype)\n", - " 256 0.003 0.000 0.029 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4626(_get_item_cache)\n", - " 26274 0.021 0.000 0.029 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1194()\n", - " 2 0.001 0.001 0.028 0.014 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/generic.py:1420(aggregate)\n", - " 83 0.002 0.000 0.028 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:674(_with_infer)\n", - " 26706 0.028 0.000 0.028 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:121(classes)\n", - " 27/2 0.001 0.000 0.028 0.014 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:931(match_type)\n", - " 8794 0.013 0.000 0.028 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/extension.py:67(fget)\n", - " 102 0.004 0.000 0.028 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:317(apply)\n", - " 2 0.002 0.001 0.028 0.014 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1871(_callable_schema)\n", - " 34 0.000 0.000 0.028 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1193(get_result)\n", - " 1 0.000 0.000 0.027 0.027 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:466(__init__)\n", - " 4 0.027 0.007 0.027 0.007 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/container.py:14(__init__)\n", - " 2 0.000 0.000 0.027 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:172(agg)\n", - " 16001 0.020 0.000 0.027 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:334(is_hashable)\n", - " 2 0.001 0.001 0.027 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:558(apply_str)\n", - " 248 0.002 0.000 0.027 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1287(take_nd)\n", - " 4030 0.010 0.000 0.026 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:745(_get_engine_target)\n", - "4617/4610 0.006 0.000 0.026 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:101(isna)\n", - " 17219 0.025 0.000 0.025 0.000 {built-in method numpy.datetime_data}\n", - " 43 0.001 0.000 0.025 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:687()\n", - " 3 0.000 0.000 0.025 0.008 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:506(nested_data_to_arrays)\n", - " 1 0.002 0.002 0.025 0.025 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:885(pandasSQL_builder)\n", - " 14 0.001 0.000 0.025 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5993(set_index)\n", - " 18 0.002 0.000 0.025 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:149(should_cache)\n", - " 3 0.000 0.000 0.024 0.008 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:793(to_arrays)\n", - " 334 0.011 0.000 0.024 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:120(_take_nd_ndarray)\n", - " 1436 0.003 0.000 0.024 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:163(match)\n", - " 54198 0.024 0.000 0.024 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:551(dtype)\n", - " 2 0.000 0.000 0.024 0.012 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:681(_apply_str)\n", - " 441 0.002 0.000 0.023 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7593(ensure_index)\n", - " 1 0.002 0.002 0.023 0.023 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:160(_convert_arrays_to_dataframe)\n", - " 11 0.001 0.000 0.023 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:766()\n", - " 10 0.000 0.000 0.023 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:96(arrays_to_mgr)\n", - " 1 0.001 0.001 0.023 0.023 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:457(prepare_request)\n", - " 1094 0.005 0.000 0.022 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/locale.py:479(_parse_localename)\n", - " 2 0.000 0.000 0.022 0.011 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6731(drop_duplicates)\n", - " 14 0.015 0.001 0.022 0.002 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/utils.py:32()\n", - " 10622 0.011 0.000 0.021 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_model_construction.py:268(__instancecheck__)\n", - " 22 0.001 0.000 0.021 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:807(generate_option_tick_new)\n", - " 15175 0.021 0.000 0.021 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:529(is_string_or_object_np_dtype)\n", - " 4009 0.009 0.000 0.021 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:707(dtype)\n", - " 10 0.001 0.000 0.021 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1574(_generate_parameter_schema)\n", - " 58893 0.019 0.000 0.020 0.000 {built-in method builtins.issubclass}\n", - "4617/4610 0.013 0.000 0.020 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:184(_isna)\n", - " 4 0.000 0.000 0.020 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6239(reset_index)\n", - " 1 0.001 0.001 0.020 0.020 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:2264(count)\n", - " 5 0.001 0.000 0.020 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6538(dropna)\n", - " 44 0.001 0.000 0.019 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:610(factorize)\n", - " 49 0.018 0.000 0.019 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1580(construct_1d_object_array_from_listlike)\n", - " 74 0.003 0.000 0.019 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1782(_consolidate_inplace)\n", - " 1395 0.007 0.000 0.019 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6301(__setattr__)\n", - " 705 0.019 0.000 0.019 0.000 {method 'reduce' of 'numpy.ufunc' objects}\n", - " 1 0.001 0.001 0.018 0.018 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1907(read)\n", - " 1 0.000 0.000 0.018 0.018 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:343(update_spot_cache)\n", - " 1 0.001 0.001 0.018 0.018 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:351(prepare)\n", - " 15140 0.018 0.000 0.018 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2063(_maybe_pin_freq)\n", - " 4386 0.018 0.000 0.018 0.000 {method 'view' of 'numpy.ndarray' objects}\n", - " 15772 0.018 0.000 0.018 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:831(_reset_identity)\n", - " 1530 0.015 0.000 0.018 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:428(append)\n", - "21008/18358 0.012 0.000 0.018 0.000 {built-in method builtins.len}\n", - "20725/20716 0.017 0.000 0.018 0.000 {built-in method builtins.hash}\n", - " 1 0.007 0.007 0.018 0.018 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:1620(__init__)\n", - " 8 0.000 0.000 0.017 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:674(astype)\n", - " 6 0.000 0.000 0.017 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:743(group_info)\n", - " 2 0.006 0.003 0.017 0.009 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:891(_list_of_dict_to_arrays)\n", - " 6 0.000 0.000 0.017 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:758(_get_compressed_codes)\n", - " 4 0.016 0.004 0.017 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:447(astype)\n", - " 1 0.001 0.001 0.017 0.017 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:316(drop_cache_duplicates)\n", - " 1094 0.009 0.000 0.017 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/locale.py:396(normalize)\n", - " 1259 0.009 0.000 0.017 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1596(pandas_dtype)\n", - " 10 0.002 0.000 0.017 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2121(create_block_manager_from_column_arrays)\n", - " 502 0.003 0.000 0.017 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:208(findall)\n", - " 4 0.000 0.000 0.016 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:7282(sort_index)\n", - " 23 0.000 0.000 0.016 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1610(_log)\n", - " 4 0.001 0.000 0.016 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5290(sort_index)\n", - " 82 0.001 0.000 0.016 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2632(check_bool_indexer)\n", - " 554 0.012 0.000 0.016 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:221(__init__)\n", - " 554 0.015 0.000 0.016 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:62(__init__)\n", - " 5 0.000 0.000 0.016 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6997(sort_values)\n", - " 42 0.004 0.000 0.016 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:708(_slice_take_blocks_ax0)\n", - " 35 0.001 0.000 0.016 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3820(get_indexer)\n", - " 12 0.001 0.000 0.015 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1471(_format_strings)\n", - " 10 0.001 0.000 0.015 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2066(_apply_annotations)\n", - " 71 0.001 0.000 0.015 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1719(_getitem_axis)\n", - " 4 0.000 0.000 0.015 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:1006(convert_object_array)\n", - " 4 0.000 0.000 0.015 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:1070()\n", - " 2 0.000 0.000 0.015 0.008 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6828(duplicated)\n", - " 2 0.001 0.000 0.015 0.007 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:10803(where)\n", - " 101 0.011 0.000 0.015 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:1028(convert)\n", - " 2 0.001 0.000 0.015 0.007 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:9863(unstack)\n", - " 1068 0.002 0.000 0.015 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:225(compile)\n", - " 12 0.001 0.000 0.015 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1343(get_result_as_array)\n", - " 196 0.003 0.000 0.015 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:419(check_array_indexer)\n", - " 8 0.000 0.000 0.015 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4796(_drop_axis)\n", - " 48 0.001 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6201(_construct_result)\n", - " 11166 0.014 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2148(_creso)\n", - " 15139 0.012 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2514(_validate_dt64_dtype)\n", - " 32 0.000 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6110(_cmp_method)\n", - " 2 0.001 0.001 0.014 0.007 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:10615(_where)\n", - " 2 0.000 0.000 0.014 0.007 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:489(unstack)\n", - " 458 0.009 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5323(__contains__)\n", - " 2 0.000 0.000 0.014 0.007 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:525(_unstack_frame)\n", - " 23 0.000 0.000 0.014 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1636(handle)\n", - " 1 0.002 0.002 0.014 0.014 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1575(__init__)\n", - " 118 0.001 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5437(_can_hold_identifiers_and_holds_name)\n", - " 23 0.000 0.000 0.014 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1690(callHandlers)\n", - " 260 0.002 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4608(_box_col_values)\n", - " 25 0.000 0.000 0.014 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:965(handle)\n", - " 10 0.000 0.000 0.014 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_schema_generation_shared.py:82(__call__)\n", - " 384 0.008 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:274(full)\n", - " 10 0.000 0.000 0.013 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2085(inner_handler)\n", - " 13 0.001 0.000 0.013 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2259(_consolidate)\n", - " 14 0.000 0.000 0.013 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:835(is_busday)\n", - " 5 0.000 0.000 0.013 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:11603(any)\n", - " 4 0.000 0.000 0.013 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/from_thread.py:455(start_blocking_portal)\n", - " 5 0.000 0.000 0.013 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12169(_logical_func)\n", - " 16305 0.013 0.000 0.013 0.000 {built-in method __new__ of type object at 0x10d1bc898}\n", - " 5 0.000 0.000 0.013 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:11435(_reduce)\n", - " 433 0.003 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:145(_get_option)\n", - " 30278 0.012 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2570(_validate_tz_from_dtype)\n", - " 15 0.002 0.000 0.013 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:1371(_arith_method)\n", - " 4164 0.010 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1040(needs_i8_conversion)\n", - " 3749 0.011 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:865(_references)\n", - " 864 0.011 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:696(_sanitize_ndim)\n", - " 569 0.009 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6236(__finalize__)\n", - " 329 0.002 0.000 0.012 0.000 {method 'any' of 'numpy.ndarray' objects}\n", - " 4009 0.012 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1993(dtype)\n", - " 32 0.001 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1689(_getitem_tuple)\n", - " 44 0.006 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:548(factorize_array)\n", - " 1 0.000 0.000 0.012 0.012 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:909(text)\n", - " 8 0.001 0.000 0.012 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5343(reindex)\n", - " 11733 0.012 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:152(cast_scalar_indexer)\n", - " 1 0.001 0.001 0.012 0.012 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:789(apparent_encoding)\n", - " 10972 0.010 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:208(isnum)\n", - " 12 0.000 0.000 0.012 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1397(format_values_with)\n", - " 25 0.000 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1098(emit)\n", - " 4099 0.006 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:831(_values)\n", - " 6 0.000 0.000 0.011 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:371(__init__)\n", - " 11 0.000 0.000 0.011 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6133(_arith_method)\n", - " 1 0.001 0.001 0.011 0.011 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1848(_make_engine)\n", - " 6 0.001 0.000 0.011 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:5773(isna)\n", - " 922 0.005 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1006(_find_hms_idx)\n", - " 2 0.001 0.000 0.011 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:589(clean_schema)\n", - " 32 0.004 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:124(maybe_convert_platform)\n", - " 36 0.001 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6418(_reduce)\n", - " 330 0.001 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:55(_any)\n", - " 10621 0.011 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/utils.py:49()\n", - " 69 0.001 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5242(_sanitize_column)\n", - " 16 0.000 0.000 0.011 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:689(codes)\n", - " 10 0.001 0.000 0.011 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:777(_codes_and_uniques)\n", - " 1 0.001 0.001 0.011 0.011 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/legacy.py:19(detect)\n", - " 652 0.011 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:591(_ensure_array)\n", - " 1 0.002 0.002 0.010 0.010 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:390(__init__)\n", - " 1336 0.010 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1141(_to_decimal)\n", - " 554 0.010 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:395(__init__)\n", - " 121 0.000 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1496(items)\n", - " 6 0.001 0.000 0.010 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:214(_obj_with_exclusions)\n", - " 40 0.006 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2276(_merge_blocks)\n", - " 1864 0.010 0.000 0.010 0.000 {method 'match' of 're.Pattern' objects}\n", - " 652 0.007 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:609(_dtype_to_subclass)\n", - " 1 0.001 0.001 0.010 0.010 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:446(get_connection_with_tls_context)\n", - " 4 0.000 0.000 0.010 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:157(concat)\n", - " 542 0.008 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:474(resolve_ymd)\n", - " 9 0.000 0.000 0.010 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5095(insert)\n", - " 6 0.002 0.000 0.010 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:8693(isna)\n", - " 25 0.000 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1087(flush)\n", - " 932 0.010 0.000 0.010 0.000 {built-in method numpy.empty}\n", - " 502 0.009 0.000 0.009 0.000 {method 'findall' of 're.Pattern' objects}\n", - " 178 0.005 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/ipkernel.py:775(_clean_thread_parent_frames)\n", - " 1 0.007 0.007 0.009 0.009 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/api.py:33(from_bytes)\n", - " 6 0.002 0.000 0.009 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6459(any)\n", - " 18/17 0.000 0.000 0.009 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:38(__eq__)\n", - " 1 0.002 0.002 0.009 0.009 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:3255(connect)\n", - " 2 0.000 0.000 0.009 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:212(putmask)\n", - " 4 0.000 0.000 0.009 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:622(get_result)\n", - " 7 0.000 0.000 0.009 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6186(_get_indexer_strict)\n", - " 1 0.005 0.005 0.009 0.009 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:60(__init__)\n", - " 2 0.001 0.000 0.009 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4320(_setitem_array)\n", - " 49/26 0.000 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:50(__le__)\n", - " 10630 0.008 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:915()\n", - " 1 0.000 0.000 0.009 0.009 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:287(organize_data_for_query)\n", - " 15 0.000 0.000 0.009 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6162(get_indexer_for)\n", - " 1 0.000 0.000 0.009 0.009 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:365(request)\n", - " 20 0.000 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1479(info)\n", - " 12 0.000 0.000 0.008 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4323(reindex)\n", - " 631 0.007 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:278(__init__)\n", - " 176 0.002 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:807(_set_axis)\n", - " 25 0.000 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7164(_cmp_method)\n", - " 14 0.000 0.000 0.008 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7553(ensure_index_from_sequences)\n", - " 1 0.001 0.001 0.008 0.008 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:409(prepare_url)\n", - " 15 0.000 0.000 0.008 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4477(__delitem__)\n", - " 260 0.005 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1012(iget)\n", - " 1 0.001 0.001 0.008 0.008 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:276(connection_from_host)\n", - " 35 0.001 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:800(_generate_schema_from_property)\n", - " 31392 0.008 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:2287(cast)\n", - " 32 0.001 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1032(_getitem_lowerdim)\n", - " 4 0.000 0.000 0.008 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:59(get_indexer_indexer)\n", - " 2 0.001 0.000 0.008 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:110(__init__)\n", - " 61 0.003 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5368(insert)\n", - " 334 0.003 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:564(_take_preprocess_indexer_and_fill_value)\n", - " 2 0.000 0.000 0.008 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1508(error)\n", - " 48 0.001 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3122(duplicated)\n", - " 492 0.002 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:339(_from_mgr)\n", - " 5 0.000 0.000 0.008 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:5136(reindex)\n", - " 5 0.000 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5614(_reindex_axes)\n", - " 1 0.002 0.002 0.007 0.007 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:305(connection_from_context)\n", - " 23 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/handlers.py:65(emit)\n", - " 453 0.004 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:127(_get_single_key)\n", - " 3 0.000 0.000 0.007 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:226(update_caches)\n", - " 15 0.001 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1434(idelete)\n", - " 267 0.001 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:678(_constructor_sliced_from_mgr)\n", - " 108 0.004 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1863(from_array)\n", - " 35 0.001 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:387(apply)\n", - " 36 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1756(_get_slice_axis)\n", - " 23 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1216(emit)\n", - " 4 0.000 0.000 0.007 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:622(_get_splitter)\n", - " 3 0.000 0.000 0.007 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:928(_finalize_columns_and_data)\n", - " 301 0.001 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:273(__call__)\n", - " 4 0.000 0.000 0.007 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:192(__sub__)\n", - " 13 0.000 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:798(tolist)\n", - " 1 0.001 0.001 0.007 0.007 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:132(__init__)\n", - " 1094 0.007 0.000 0.007 0.000 {built-in method _locale.setlocale}\n", - " 229 0.002 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:790(copy)\n", - " 101 0.001 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_strptime.py:564(_strptime_datetime)\n", - " 65 0.005 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:239(maybe_convert_indices)\n", - " 3 0.001 0.000 0.007 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:301(lexsort_indexer)\n", - " 2 0.000 0.000 0.007 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:567(validate_core_schema)\n", - " 12 0.001 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/base.py:2058(tolist)\n", - " 12 0.000 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1322(__contains__)\n", - " 6 0.001 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:9041(groupby)\n", - " 58 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:586()\n", - " 2 0.007 0.003 0.007 0.003 {built-in method pydantic_core._pydantic_core.validate_core_schema}\n", - " 1002 0.003 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:178(_datetime_metadata_str)\n", - " 12 0.000 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2982(get_loc)\n", - " 30 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6957()\n", - " 1 0.000 0.000 0.007 0.007 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:139(_parse_date_columns)\n", - " 67 0.001 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:106(_ensure_data)\n", - " 116 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:583(copy_func)\n", - " 13 0.000 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:482(nanany)\n", - " 12 0.000 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:3308(_get_level_indexer)\n", - " 1 0.000 0.000 0.007 0.007 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:4620(map)\n", - " 74/71 0.001 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:1131(take)\n", - " 63 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:262(_get_hashtable_algo)\n", - " 36 0.002 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4361(_slice)\n", - " 12 0.001 0.000 0.006 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1197(_format_strings)\n", - " 101 0.003 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_strptime.py:309(_strptime)\n", - " 4 0.000 0.000 0.006 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:687(codes)\n", - " 4 0.000 0.000 0.006 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:690()\n", - " 2 0.000 0.000 0.006 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1397(_getitem_axis)\n", - " 1 0.000 0.000 0.006 0.006 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1823(_setup_result_proxy)\n", - " 70 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2520(get_schema_or_ref)\n", - " 16 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:1149(__iter__)\n", - " 1 0.001 0.001 0.006 0.006 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1893(_setup_dml_or_text_result)\n", - " 2 0.000 0.000 0.006 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1205(_getbool_axis)\n", - " 61 0.001 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1412(_insert_update_blklocs_and_blknos)\n", - " 28 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6925(f)\n", - " 35 0.001 0.000 0.006 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:773(parse_option_tick)\n", - " 10 0.001 0.000 0.006 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2190(_form_blocks)\n", - " 5485 0.006 0.000 0.006 0.000 {method 'lower' of 'str' objects}\n", - " 25 0.002 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:977(_cmp_method)\n", - " 64 0.001 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1726(_make_fixed_width)\n", - " 5186 0.005 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:203(isword)\n", - " 1 0.000 0.000 0.006 0.006 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:474(from_arrays)\n", - " 49/26 0.001 0.000 0.006 0.000 {built-in method _operator.le}\n", - " 35 0.001 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:77(get_type_ref)\n", - " 1 0.000 0.000 0.006 0.006 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:3048(factorize_from_iterables)\n", - " 12 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2957(_get_loc_single_level_index)\n", - " 8 0.000 0.000 0.006 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7031(drop)\n", - " 349 0.006 0.000 0.006 0.000 {method 'copy' of 'numpy.ndarray' objects}\n", - " 3 0.000 0.000 0.006 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:3069()\n", - " 2 0.001 0.000 0.006 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:231(get_result)\n", - " 2 0.000 0.000 0.006 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:3005(factorize_from_iterable)\n", - " 12 0.001 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1805(_trim_zeros_float)\n", - " 1009 0.002 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:481(ensure_wrapped_if_datetimelike)\n", - " 2 0.000 0.000 0.006 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5433(drop)\n", - " 1038 0.004 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2537(dtype_to_unit)\n", - " 2 0.000 0.000 0.006 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4757(drop)\n", - " 1 0.001 0.001 0.006 0.006 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1778(__repr__)\n", - " 31 0.001 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6679(_maybe_cast_listlike_indexer)\n", - " 13 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1247(series_generator)\n", - " 6 0.001 0.000 0.006 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1296(__init__)\n", - " 6/2 0.001 0.000 0.006 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1438(putmask)\n", - " 287 0.005 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:551(maybe_promote)\n", - " 1 0.000 0.000 0.005 0.005 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:691()\n", - " 4099 0.005 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2004(internal_values)\n", - " 1303 0.005 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:336(hms)\n", - " 3 0.001 0.000 0.005 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:7903(_arith_method)\n", - " 23 0.005 0.000 0.005 0.000 {method 'flush' of '_io.TextIOWrapper' objects}\n", - " 30 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:220(__init__)\n", - " 12 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:558(_parse_with_reso)\n", - " 113 0.002 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:231(asarray_tuplesafe)\n", - " 30 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:373(_finalize)\n", - " 99 0.002 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2313(is_unique)\n", - " 12 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:275(_parse_with_reso)\n", - " 2 0.000 0.000 0.005 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/generic.py:2002(_get_data_to_aggregate)\n", - " 209 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:97(is_bool_indexer)\n", - " 27 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:325(__new__)\n", - " 8/7 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1040(_match_generic_type)\n", - " 16 0.002 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:550(validate_categories)\n", - " 12 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1349(format_with_na_rep)\n", - " 12 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:42(__ne__)\n", - " 4 0.001 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:94(concatenate_managers)\n", - " 902 0.005 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:319(jump)\n", - " 4 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:208(__truediv__)\n", - " 4010 0.004 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:734(name)\n", - " 11 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6432(dtypes)\n", - " 47 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:157(take)\n", - " 55 0.002 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1519(construct_1d_arraylike_from_scalar)\n", - " 190 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:82(shape)\n", - " 33 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:240(arithmetic_op)\n", - " 83 0.002 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:380(notna)\n", - " 10 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:596(_homogenize)\n", - " 529 0.002 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2152(unit)\n", - " 71 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4402(_check_setitem_copy)\n", - " 248 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2645(maybe_coerce_values)\n", - " 122 0.004 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5562(append)\n", - " 1 0.001 0.001 0.005 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:1422(__init__)\n", - " 9 0.003 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:122(get_group_index)\n", - " 5 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:7918(_dispatch_frame_op)\n", - " 5 0.001 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6463(astype)\n", - " 4250 0.005 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6055(_check_indexing_error)\n", - " 134 0.001 0.000 0.005 0.000 {built-in method builtins.sum}\n", - " 6 0.001 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:846(get_grouper)\n", - " 3256 0.005 0.000 0.005 0.000 {method 'get' of 'dict' objects}\n", - " 5 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1425(_format_flat)\n", - " 395 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:137(is_object_dtype)\n", - " 3 0.000 0.000 0.005 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5359(reindex)\n", - " 53 0.002 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1095(__getitem__)\n", - " 1 0.000 0.000 0.005 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:610(prepare_cookies)\n", - " 7 0.001 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1369(_union_schema)\n", - " 1 0.000 0.000 0.005 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:231(parse_headers)\n", - " 1 0.000 0.000 0.005 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:140(get_cookie_header)\n", - " 1 0.001 0.001 0.005 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/_optional.py:85(import_optional_dependency)\n", - " 5 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1448(_format_with_header)\n", - " 2 0.001 0.000 0.005 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:202(__init__)\n", - " 25 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:12675(_reindex_for_setitem)\n", - " 8 0.001 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4470(_iset_item_mgr)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/parser.py:59(parsestr)\n", - " 98 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2703(new_block_2d)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/parser.py:41(parse)\n", - " 6 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1633(as_array)\n", - " 13 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1316(view)\n", - " 4 0.001 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2016(_sort_levels_monotonic)\n", - " 4 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:12590(values)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:330(connection_from_pool_key)\n", - " 13 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1248(copy)\n", - " 2 0.001 0.000 0.004 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1450(grouped_reduce)\n", - " 6 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/from_thread.py:308(start_task_soon)\n", - " 1 0.002 0.002 0.004 0.004 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:453(update_greek_limits)\n", - " 37 0.002 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:386(default_index)\n", - " 4 0.001 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1707(_interleave)\n", - " 58 0.002 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/base.py:549(find)\n", - " 1 0.001 0.001 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2225(_handle_dbapi_exception)\n", - " 4 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:3951(T)\n", - " 6945 0.004 0.000 0.004 0.000 {built-in method builtins.setattr}\n", - " 2 0.002 0.001 0.004 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:369(parse_url)\n", - " 4 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/_backends/_asyncio.py:980(_spawn_task_from_thread)\n", - " 2 0.004 0.002 0.004 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2083(remove_unused_levels)\n", - " 4 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:3767(transpose)\n", - " 1 0.001 0.001 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:229(_new_pool)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:258(_get_conn)\n", - " 19 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:307(unique)\n", - " 54 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:655(write)\n", - " 2 0.001 0.000 0.004 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:348(get_function_type_hints)\n", - " 255 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:773(_view)\n", - " 19 0.003 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:427(unique_with_mask)\n", - " 1 0.001 0.001 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:238(_new_conn)\n", - " 34 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:288(comparison_op)\n", - " 58 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:141(__exit__)\n", - " 4 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/_backends/_asyncio.py:2483(run_sync_from_thread)\n", - " 2 0.002 0.001 0.004 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/string.py:119(_join_multiline)\n", - " 2 0.003 0.001 0.004 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:731(generate_data)\n", - " 35 0.000 0.000 0.004 0.000 {built-in method strptime}\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1818(to_string)\n", - " 1060 0.003 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:193(__get__)\n", - " 16 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:1452(safe_sort)\n", - " 4 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:1162(_sorted_data)\n", - " 9 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1066(iset)\n", - " 26 0.000 0.000 0.004 0.000 {built-in method builtins.print}\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:3280(raw_connection)\n", - " 1 0.001 0.001 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:1485(_init_metadata)\n", - " 334 0.001 0.000 0.004 0.000 {built-in method builtins.any}\n", - " 4 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:1364(_duplicated)\n", - " 2 0.000 0.000 0.004 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:860(values)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:2365(mean)\n", - " 1 0.001 0.001 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:2063(to_dict)\n", - " 1 0.001 0.001 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:441(connect)\n", - " 4 0.001 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/base.py:1170(duplicated)\n", - " 2 0.000 0.000 0.004 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:592(flush)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1957(_cython_agg_general)\n", - " 22 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6519(sum)\n", - " 205 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:659(_constructor_from_mgr)\n", - " 21 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_exceptions.py:34(find_stack_level)\n", - " 61 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1393(moveaxis)\n", - " 2 0.001 0.000 0.004 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1578(_wrap_aggregated_output)\n", - " 22 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12498(sum)\n", - " 2167 0.004 0.000 0.004 0.000 {method 'format' of 'str' objects}\n", - " 566 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:84()\n", - " 22 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:140(get_option_specifics_from_key)\n", - " 1 0.001 0.001 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4360(_iset_not_inplace)\n", - " 338 0.004 0.000 0.004 0.000 {built-in method builtins.id}\n", - " 1 0.002 0.002 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:177(__init__)\n", - " 803 0.003 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1331(is_ea_or_datetimelike_dtype)\n", - " 22 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12459(_min_count_stat_function)\n", - " 118 0.003 0.000 0.003 0.000 {method 'take' of 'numpy.ndarray' objects}\n", - " 2265 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:213(isspace)\n", - " 50 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:71(_wrapreduction)\n", - " 29 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:823(take)\n", - " 1 0.001 0.001 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:106(_encode_params)\n", - " 18 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:2344(unique)\n", - " 10 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:263(eval_type_backport)\n", - " 2 0.000 0.000 0.003 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:378(new_index)\n", - " 6688 0.003 0.000 0.003 0.000 {method 'append' of 'list' objects}\n", - " 181 0.000 0.000 0.003 0.000 {method 'max' of 'numpy.ndarray' objects}\n", - " 32 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:957(_validate_tuple_indexer)\n", - " 18 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:1019(unique)\n", - " 58 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:299(helper)\n", - " 48 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5425(_getitem_slice)\n", - " 5 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1483(reduce)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2588(_get_codes_for_sorting)\n", - " 48 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:261(_isna_array)\n", - " 4026 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:265(_engine_type)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2603()\n", - " 3 0.001 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:7142(fillna)\n", - " 1 0.002 0.002 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:115(__init__)\n", - " 89 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/ipkernel.py:790()\n", - " 64 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:189(_na_arithmetic_op)\n", - " 35 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6394(_should_compare)\n", - " 2 0.002 0.001 0.003 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/version/__init__.py:339(__init__)\n", - " 4 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:994(duplicated)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:478(calculate_quantity)\n", - " 5 0.001 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:782(result_index)\n", - " 2 0.000 0.000 0.003 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:776(_get_formatted_column_labels)\n", - " 425 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:180(blknos)\n", - " 1 0.001 0.001 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:331(putrequest)\n", - " 585 0.002 0.000 0.003 0.000 :1207(_handle_fromlist)\n", - " 1 0.001 0.001 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/methods/to_dict.py:78(to_dict)\n", - " 449 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:635(_get_root)\n", - " 58 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:104(__init__)\n", - " 1 0.001 0.001 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1255(_checkout)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:305(to_string)\n", - " 1 0.001 0.001 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:7885(replace)\n", - " 5 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:68(__and__)\n", - " 9473 0.003 0.000 0.003 0.000 {method 'read' of '_io.StringIO' objects}\n", - " 181 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:39(_amax)\n", - " 61 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1402(_insert_update_mgr_locs)\n", - " 2 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2499(getproxies_environment)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2685(getproxies)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1287(endheaders)\n", - " 166 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:784(name)\n", - " 5 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6123(_logical_method)\n", - " 4 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:699(new_axes)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1049(_send_output)\n", - " 152 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5170(_get_engine_target)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:988(send)\n", - " 4 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:702()\n", - " 48 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1146(take)\n", - " 1 0.001 0.001 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:134(__init__)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:278(connect)\n", - " 74 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1764(is_consolidated)\n", - " 408 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1816(is_number_with_decimal)\n", - " 12 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:259(schedule)\n", - " 10 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:296(_eval_type_backport)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:193(_new_conn)\n", - " 4 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:890(content)\n", - " 10 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:321(_eval_type)\n", - " 54 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:577(_schedule_flush)\n", - " 2 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:188(__radd__)\n", - " 2 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:381()\n", - " 29 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2246(_stack_arrays)\n", - " 235 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:830(__len__)\n", - " 1 0.001 0.001 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/connection.py:27(create_connection)\n", - " 45/10 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:387(_eval_type)\n", - " 8 0.000 0.000 0.003 0.000 {method 'join' of 'bytes' objects}\n", - " 542 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:380(validate)\n", - " 2 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:478(coerce_to_target_dtype)\n", - " 6/4 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2435(_signature_from_callable)\n", - " 1 0.001 0.001 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:222(read)\n", - " 260 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1471(_set_as_cached)\n", - " 177 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:236(set_axis)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:347(__init__)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:549()\n", - " 67 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:131(filterwarnings)\n", - " 4 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:816(generate)\n", - " 10 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:374(urlparse)\n", - " 87 0.000 0.000 0.003 0.000 {method 'all' of 'numpy.ndarray' objects}\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1971(array_func)\n", - " 4 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:1038(stream)\n", - " 5 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1277(is_extension_array_dtype)\n", - " 120 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:182(_add_filter)\n", - " 4 0.001 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:515(view)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:812(_cython_operation)\n", - " 53/16 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:409()\n", - " 74 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1772(_consolidate_check)\n", - " 12 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:402(walk_core_schema)\n", - " 9 0.000 0.000 0.003 0.000 {built-in method _operator.sub}\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:296(_get_combined_plan)\n", - " 13016 0.003 0.000 0.003 0.000 {method 'isdigit' of 'str' objects}\n", - " 2 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:191(_make_selectors)\n", - " 3 0.001 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:910(read)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/accessor.py:95(_getter)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/accessors.py:88(_delegate_property_get)\n", - " 10 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:744(_group_index)\n", - " 12 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1433(find_common_type)\n", - " 4 0.002 0.001 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2331(_signature_from_function)\n", - " 340 0.000 0.000 0.003 0.000 :859(__iter__)\n", - " 4187 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2043(freq)\n", - " 95 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:511(_validate_dtype)\n", - " 7 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1870(_get_label_or_level_values)\n", - " 12 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/zmq/sugar/socket.py:621(send)\n", - " 6 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:369(nargsort)\n", - " 3 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:35(__init__)\n", - " 234/12 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:196(walk)\n", - " 1 0.001 0.001 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1422(__sub__)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:171(feed)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:176(_call_parse)\n", - " 2 0.001 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:351(get_dataframe_repr_params)\n", - " 2297 0.002 0.000 0.002 0.000 {method 'pop' of 'list' objects}\n", - " 2 0.001 0.001 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:216(_parsegen)\n", - " 90 0.000 0.000 0.002 0.000 {built-in method builtins.sorted}\n", - " 7 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:378(interleaved_dtype)\n", - " 1674 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:909(__len__)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:496(_merge_cursor_description)\n", - " 63 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:280(_check_object_for_strings)\n", - " 22 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:76(_f)\n", - " 42 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:201(_simple_new)\n", - " 1099 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/__init__.py:34(using_copy_on_write)\n", - " 4 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/generic.py:1558(_wrap_applied_output)\n", - " 5465 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5144(_values)\n", - " 1 0.001 0.001 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1103(putrequest)\n", - " 37 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1819(should_trim)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:625()\n", - " 4 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:240(__pow__)\n", - " 20 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:322(_get_block_for_concat_plan)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:359(build_response)\n", - " 64 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/computation/expressions.py:226(evaluate)\n", - " 902 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:329(month)\n", - " 27 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:903(_set_levels)\n", - " 87 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:61(_all)\n", - " 7 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:723(astype)\n", - " 6 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:40(__init__)\n", - " 333 0.001 0.000 0.002 0.000 :674(__getitem__)\n", - " 1 0.001 0.001 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/env.py:47(DEBUG_MODE)\n", - " 32 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/printing.py:567(get_adjustment)\n", - " 2 0.002 0.001 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:922()\n", - " 2 0.002 0.001 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/plugin/_schema_validator.py:21(create_schema_validator)\n", - " 105 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1010(view)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:900(default_headers)\n", - " 49 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:141(equals)\n", - " 1 0.002 0.002 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:573(__init__)\n", - " 35 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3955(_get_indexer)\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:180(fillna)\n", - " 413 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1099(_parse_min_sec)\n", - " 353 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2765(check_dict_or_set_indexers)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:692(from_codes)\n", - " 20 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:305(_isna_string_dtype)\n", - " 64 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/computation/expressions.py:67(_evaluate_standard)\n", - " 1 0.001 0.001 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:1314(fetchall)\n", - " 334 0.001 0.000 0.002 0.000 {built-in method builtins.max}\n", - " 4 0.001 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:271(from_annotation)\n", - " 1 0.002 0.002 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/equity.py:65(fundamental)\n", - " 188 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2264()\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1216(_iset_split_block)\n", - " 4 0.001 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:117(view)\n", - " 296 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1253(iget)\n", - " 1 0.001 0.001 0.002 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:303()\n", - " 25 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:389(new_func)\n", - " 14 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:838(_cleanup)\n", - " 8 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:243(_from_values_or_dtype)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager.py:42()\n", - " 1 0.002 0.002 0.002 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/decorators.py:9(log_time)\n", - " 177 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:86(_validate_set_axis)\n", - " 2 0.002 0.001 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/retry.py:202(__init__)\n", - " 7 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/astype.py:191(astype_array_safe)\n", - " 122 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1330(normalize_axis_tuple)\n", - " 23 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:219(vstack)\n", - " 1 0.001 0.001 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1356(add_cookie_header)\n", - " 30 0.000 0.000 0.002 0.000 :121(__subclasscheck__)\n", - " 19 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1697(_validate_names)\n", - " 53 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:166(simplefilter)\n", - " 12 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:1180(_chop)\n", - " 1 0.001 0.001 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:943(urlencode)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1102(wrap_results)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1507(operate_blockwise)\n", - " 30 0.002 0.000 0.002 0.000 {built-in method _abc._abc_subclasscheck}\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/ops.py:57(operate_blockwise)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:7894(_cmp_method)\n", - " 2 0.001 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1935(delete)\n", - " 94 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5552(equals)\n", - " 171 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2716(new_block)\n", - " 1 0.001 0.001 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:707(checkout)\n", - " 6 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:687(compress_group_index)\n", - " 94 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:225(_consolidate_key)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/helpers.py:8(parse_signal_id)\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:214(get_compressed_ids)\n", - " 9 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5663(_reindex_with_indexers)\n", - " 26 0.002 0.000 0.002 0.000 {built-in method _thread.start_new_thread}\n", - " 79 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1081(is_numeric_dtype)\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1684(is_monotonic_increasing)\n", - " 2 0.001 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:407(__rsub__)\n", - " 142 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/json/__init__.py:299(loads)\n", - " 11 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4883(_update_inplace)\n", - " 1 0.001 0.001 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/base.py:445(__get__)\n", - " 1 0.001 0.001 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1126(_sub_datetimelike_scalar)\n", - " 37 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1827()\n", - " 5 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:227(_encode_invalid_chars)\n", - " 7 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:58(__new__)\n", - " 234/12 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:199(_walk)\n", - " 189 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1571(validate_all_hashable)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/inspection.py:113(inspect)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:7172()\n", - " 1 0.001 0.001 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/exc.py:604(instance)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:419(simplify_schema_references)\n", - " 121 0.002 0.000 0.002 0.000 {method 'remove' of 'list' objects}\n", - " 1 0.001 0.001 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:137(__init__)\n", - " 117 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:301(maybe_iterable_to_list)\n", - " 12 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:392(handle_call_schema)\n", - " 1 0.001 0.001 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:305(_connection_insp)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:1332(getfullargspec)\n", - " 7 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2235(take)\n", - " 3 0.001 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:2083(to_frame)\n", - " 1 0.002 0.002 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/sql/schema.py:5357(__init__)\n", - " 1 0.001 0.001 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:204(get_netrc_auth)\n", - " 18 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:187(validate_indices)\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7227(_arith_method)\n", - " 230 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:467(__enter__)\n", - " 64 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1574(_validate_key)\n", - " 206 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:253(fill_value)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:817(_get_formatted_index)\n", - " 26 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:844(levels)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:240(init_poolmanager)\n", - " 78 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1220(_format)\n", - " 12 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:379(handle_arguments_schema)\n", - " 58 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:764(_get_formatter)\n", - " 2 0.001 0.001 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:452(urlsplit)\n", - " 2 0.001 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/console.py:9(get_console_size)\n", - " 29 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_asarray.py:27(require)\n", - " 631 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/flags.py:51(__init__)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:543(_allrows)\n", - " 23 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1595(makeRecord)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2662(getproxies_macosx_sysconf)\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:858(_raw_read)\n", - " 96 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:273(is_dict_like)\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2307(factorize)\n", - " 98 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:924()\n", - " 1 0.002 0.002 0.002 0.002 {built-in method _scproxy._get_proxies}\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1966(_is_lexsorted)\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:707(_get_comb_axis)\n", - " 2 0.001 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:199(__init__)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:791(_autobegin)\n", - " 27 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2421(all)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:795(begin)\n", - " 22 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:455(newfunc)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/base.py:1428(factorize)\n", - " 8 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:479(__enter__)\n", - " 7 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/ops.py:29(_iter_block_pairs)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:805(call_soon_threadsafe)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:72(get_objs_combined_axis)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2002(_lexsort_depth)\n", - " 51 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1778()\n", - " 43 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2744(inferred_type)\n", - " 142 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/json/decoder.py:332(decode)\n", - " 119 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:892(getfile)\n", - " 79 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:350(getitem_block_columns)\n", - " 1784 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1168(ident)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:849(__init__)\n", - " 18 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:430(__enter__)\n", - " 23 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:292(__init__)\n", - " 66 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:217(_ensure_arraylike)\n", - " 25 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:942(format)\n", - " 26 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:897()\n", - " 25 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:524(_validate_comparison_value)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:120(_get_combined_index)\n", - " 11070 0.001 0.000 0.001 0.000 {method 'keys' of 'dict' objects}\n", - " 5188 0.001 0.000 0.001 0.000 {method 'isalpha' of 'str' objects}\n", - " 18 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2979(prod)\n", - " 27 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1085(_set_codes)\n", - " 26 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/ipkernel.py:768(init_closure)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:124(extract_cookies_to_jar)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:4037(_lexsort_depth)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:735(has_dropped_na)\n", - " 762 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:649(_get_deprecated_option)\n", - " 110/109 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:390(_get_getitem_freq)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/selector_events.py:128(_write_to_self)\n", - " 89 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1501(enumerate)\n", - " 569 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/flags.py:87(allows_duplicate_labels)\n", - " 50 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:922(acquire)\n", - " 25 0.000 0.000 0.001 0.000 {method 'min' of 'numpy.ndarray' objects}\n", - " 25 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:674(format)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:717(_get_concat_axis)\n", - " 202 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:568(require_length_match)\n", - " 16 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:153(_set_option)\n", - " 198/22 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:128(deepcopy)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1193(_engine)\n", - " 4 0.001 0.000 0.001 0.000 {method 'send' of '_socket.socket' objects}\n", - " 75 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:782(_rename)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:630(prepare_hooks)\n", - " 320 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:586(_get_axis)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/base.py:800(argsort)\n", - " 7 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:958(fast_xs)\n", - " 298 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2674(get_block_type)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:207(register_hook)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:95(_default_key_normalizer)\n", - " 22 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:604(nansum)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:901(quote_plus)\n", - " 453 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:676(_translate_key)\n", - " 7 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/astype.py:157(astype_array)\n", - " 2 0.001 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1680(extract_cookies)\n", - " 63 0.001 0.000 0.001 0.000 {method 'acquire' of '_thread.RLock' objects}\n", - " 42 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2320(_preprocess_slice_or_indexer)\n", - " 4 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2692(max)\n", - " 9 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/printing.py:524(adjoin)\n", - " 2 0.000 0.000 0.001 0.001 {method 'throw' of 'generator' objects}\n", - " 45 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_utils.py:76(lenient_issubclass)\n", - " 4587 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6672(_maybe_cast_indexer)\n", - " 315 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2795(extend_blocks)\n", - " 14 0.001 0.000 0.001 0.000 {method 'setdefault' of 'dict' objects}\n", - " 25 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:43(_amin)\n", - " 65 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1667(_validate_integer)\n", - " 542 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:482()\n", - " 60 0.001 0.000 0.001 0.000 {method 'argsort' of 'numpy.ndarray' objects}\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:777(_concat_indexes)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:776(reconstructed_codes)\n", - " 7 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4159(xs)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:808(__init__)\n", - " 281 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/frozen.py:76(__getitem__)\n", - " 133 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4623(_clear_item_cache)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5455(append)\n", - " 7 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:847(quote)\n", - " 4/3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:58(__ge__)\n", - " 31 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6415(_is_comparable_dtype)\n", - " 257 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:292(make_block_same_class)\n", - " 11 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:66(copy)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:150(assemble_bulk_data_request)\n", - " 16 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5598()\n", - " 9 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/printing.py:31(adjoin)\n", - " 495 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1392()\n", - " 240 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:195(is_array_like)\n", - " 2 0.001 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_discriminated_union.py:37(apply_discriminators)\n", - " 32 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:789(values)\n", - " 26 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:856(__init__)\n", - " 88 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:795(_merge_cols_by_none)\n", - " 1241 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:24(_kind_name)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5491(_concat)\n", - " 36 0.000 0.000 0.001 0.000 {method 'sum' of 'numpy.ndarray' objects}\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:5486(isin)\n", - " 309 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:688(_warn_if_deprecated)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:421(astype)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:268(decons_obs_group_ids)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/utils.py:268(identify_sig_or_bom)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:588(prepare_auth)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/_concurrency_py3k.py:61(is_exit_exception)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:3261(signature)\n", - " 25 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1831()\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:304(cert_verify)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:82(f)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:1018(get_auth_from_url)\n", - " 82 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/printing.py:165(pprint_thing)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:176(sorted_labels)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:3007(from_callable)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:230(_handle_eof)\n", - " 2 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:246(_decons_group_index)\n", - " 3 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/methods/to_dict.py:171()\n", - " 8 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1392(np_find_common_type)\n", - " 107 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:184(_reconstruct_data)\n", - " 21 0.000 0.000 0.001 0.000 :71(join)\n", - " 49 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1220(_get_value)\n", - " 34 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:836(_isnan)\n", - " 131 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/printing.py:513(justify)\n", - " 34 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:440(acquire)\n", - " 61 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2311(_fast_count_smallints)\n", - " 111 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2776(_is_multi)\n", - " 98 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1102()\n", - " 1 0.001 0.001 0.001 0.001 {built-in method io.open}\n", - " 33 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:53(_wrapfunc)\n", - " 41/2 0.001 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:425(collect_refs)\n", - " 4 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_common.py:27(_init_wait_gen)\n", - " 12 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:353(wrapper)\n", - " 8 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5651(identical)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1512(_close_special)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:194(_handle_warnings)\n", - " 309 0.001 0.000 0.001 0.000 {method 'endswith' of 'str' objects}\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1784(get_level_values)\n", - " 864 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:758(_maybe_repeat)\n", - " 34 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2666(_maybe_normalize_endpoints)\n", - " 393 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:322(weekday)\n", - " 12 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1352()\n", - " 36 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:47(_sum)\n", - " 87 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1774(get_result_processor)\n", - " 232 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:673(na_value_for_dtype)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/exc.py:692(__init__)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:156(_indexer_and_to_sort)\n", - " 334 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:325(_get_take_nd_function)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1565(__invert__)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1384(_checkin)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:393(logical_op)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:333(from_annotated_attribute)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:156(username)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:196(__rsub__)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:917(_finalize_fairy)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:416(_maybe_cast_listlike_indexer)\n", - " 23 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1025(argsort)\n", - " 182 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:319(asi8)\n", - " 2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:369(__init__)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:469(_parse_headers)\n", - " 80 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:243(__init__)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12362(_stat_function)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1758(_get_level_values)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:243(replace)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:246(get_new_values)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:202(union_indexes)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:523(cython_operation)\n", - " 7 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:61(merge_setting)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:351(putheader)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:384(get_series_repr_params)\n", - " 22 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:227(_deepcopy_dict)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:198(__init__)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:200(__mul__)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/exc.py:477(__init__)\n", - " 8 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1476(_format_strings)\n", - " 40 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:165(maybe_lift)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/accessors.py:70(_get_values)\n", - " 214 0.001 0.000 0.001 0.000 {method 'clear' of 'dict' objects}\n", - " 9 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/functools.py:35(update_wrapper)\n", - " 1341 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/printing.py:510(len)\n", - " 36 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:33(seterr)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:127(__init__)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:751(checkin)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:310(_cython_op_ndim_compat)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:664(get_handle)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6488(isna)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:658(__init__)\n", - " 122 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1768(ravel)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:354(_call_cython_op)\n", - " 174/78 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:206(_handle_other_schemas)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7218(_construct_result)\n", - " 1153 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:405(flags)\n", - " 8 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1482()\n", - " 156 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:948(from_blocks)\n", - " 101 0.001 0.000 0.001 0.000 {method 'reshape' of 'numpy.ndarray' objects}\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1259(putheader)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:828(replace)\n", - " 393 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:342(ampm)\n", - " 2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:113(comp_method_OBJECT_ARRAY)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1685(_clean_options)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:355(_concatenate_chunks)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:228(_construct)\n", - " 483 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:214(is_extension)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2597(cats)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:195(__init__)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:451(_return_conn)\n", - " 59 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1755()\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/timedeltas.py:149(__new__)\n", - " 2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:2208(__init__)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1643(fillna)\n", - " 117 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1643(__len__)\n", - " 2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:593(fetch_eof_columns)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2678(__init__)\n", - " 1060 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:1257(value)\n", - " 35 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:525(_unbox_scalar)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/impl.py:144(_do_return_conn)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:242(__init__)\n", - " 56 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:274(make_block)\n", - " 22 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1342(is_complex_dtype)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:754(parse_position_id)\n", - " 17 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1826(_check_label_or_level_ambiguity)\n", - " 8 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:418(merge_field_infos)\n", - " 29 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:2082(empty)\n", - " 5 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:123(__init__)\n", - " 22 0.001 0.000 0.001 0.000 {built-in method _warnings.warn}\n", - " 73 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2811(ensure_block_shape)\n", - " 7 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:424(str_schema)\n", - " 24 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:2077(__contains__)\n", - " 4 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1730(_get_default_index_names)\n", - " 2 0.000 0.000 0.001 0.000 :229(expanduser)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:8282(_construct_result)\n", - " 23 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:81(atleast_2d)\n", - " 11 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2229(is_monotonic_increasing)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2700(_connection_begin_impl)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/queue.py:132(put)\n", - " 27 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1574(_set_names)\n", - " 7 0.000 0.000 0.001 0.000 :778(__contains__)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/base.py:183(_for_instance)\n", - " 74 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:836(__iter__)\n", - " 35 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3996(_check_indexing_method)\n", - " 275 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:219(_can_consolidate)\n", - " 453 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:617(_select_options)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:596(shape)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/accessor.py:220(__get__)\n", - " 1336 0.001 0.000 0.001 0.000 {method 'is_finite' of 'decimal.Decimal' objects}\n", - " 230 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:488(__exit__)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:396(build_connection_pool_key_attributes)\n", - " 41 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:414(_split_op_result)\n", - " 54 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/common.py:81(get_op_result_name)\n", - " 66 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1305(base_formatter)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:758()\n", - " 7 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:345(to_key_val_list)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/base.py:180(_for_class)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:306(is_named_tuple)\n", - " 69 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4585(_ensure_valid_index)\n", - " 10 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:527(__init__)\n", - " 2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:542(merge_cookies)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:111(f)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:2329(hfunc)\n", - " 71 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:4120(_coerce_indexer_frozen)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:551()\n", - " 16 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:598()\n", - " 2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:718(_reorder_by_uniques)\n", - " 68 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1763(np_can_hold_element)\n", - " 386/385 0.001 0.000 0.001 0.000 {method 'encode' of 'str' objects}\n", - " 399 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1590()\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1091(_begin_impl)\n", - " 23 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:534(_scalar_from_string)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:90(_urllib3_request_context)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:2134(_fetchall_impl)\n", - " 447 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:372(apply_if_callable)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1158(_sub_datetimelike)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/base.py:137(__init__)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:176(isna)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:494(prepare_body)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1559(itertuples)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:337(extend)\n", - " 493 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:999(__len__)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/string.py:128()\n", - " 12 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:676(ngroups)\n", - " 2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/string.py:63(_need_to_wrap_around)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:352(na_logical_op)\n", - " 2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:533(_maybe_downcast)\n", - " 2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:226(__get_underlier_data)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/weakref.py:568(__init__)\n", - " 32 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:935(_expand_ellipsis)\n", - " 11 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:287(get_dtypes)\n", - " 8 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6916(delete)\n", - " 3 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:137(__new__)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:241(_from_sequence_not_strict)\n", - " 2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:84(__init__)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:228(extract_numeric_value)\n", - " 4 0.001 0.000 0.001 0.000 {built-in method _operator.pow}\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:957(getaddrinfo)\n", - " 10 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:572(_is_uniform_join_units)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6509(max)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:237(ndarray_to_mgr)\n", - " 2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/constants.py:320(raise_warning_against_deprecated_cursor_class)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:252(_init_connection)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:1130(fetchall)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/accessors.py:611(__new__)\n", - " 2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:457(__neg__)\n", - " 343 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:735(_sanitize_str_dtypes)\n", - " 26 0.000 0.000 0.001 0.000 {method 'extend' of 'list' objects}\n", - " 44 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:328(__init__)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:457(isin)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/equity.py:307(price)\n", - " 11 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:3995(_maybe_update_cacher)\n", - " 57 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1047(shape)\n", - " 14 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:1305(construct_from_string)\n", - " 2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:232(get_underlier_data)\n", - " 230 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:441(__init__)\n", - " 142 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/json/decoder.py:343(raw_decode)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12397(max)\n", - " 68 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:914(__len__)\n", - " 25 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:718(_unbox)\n", - " 49 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:111(is_annotated)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:990(sequence_to_td64ns)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1630()\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:819(get_connection)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1532(__neg__)\n", - " 271 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:667(_info_axis)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:5(refresh_cache)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1297(_cookie_attrs)\n", - " 5 0.001 0.000 0.001 0.000 {built-in method _operator.and_}\n", - " 223 0.001 0.000 0.001 0.000 {method 'astype' of 'numpy.ndarray' objects}\n", - " 2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1599(make_cookies)\n", - " 4 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:4039()\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager.py:53()\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:255(__init__)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1491(warning)\n", - " 549 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:572(_get_axis_number)\n", - " 2265 0.001 0.000 0.001 0.000 {method 'isspace' of 'str' objects}\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:492(to_numpy)\n", - " 4 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:373(inner)\n", - " 2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/console.py:54(in_interactive_session)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:638(_extract_index)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:843(_hasna)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:226(isna)\n", - " 4 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:899(is_nonnegative_int)\n", - " 39 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:612(result_iterator)\n", - " 3 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/hooks.py:15(default_hooks)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/connection.py:93(_set_socket_options)\n", - " 32 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/printing.py:507(__init__)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:296(_get_formatted_values)\n", - " 4 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:56(__init__)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:207(validate_header_arg)\n", - " 35 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6324(_maybe_downcast_for_indexing)\n", - " 383 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1740()\n", - " 35 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:775(infer_dtype_from_scalar)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:871(_do_date_conversions)\n", - " 393 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1133(_parsems)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/request.py:189(body_to_chunks)\n", - " 14 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/string_.py:140(construct_from_string)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/response.py:40(assert_header_parsing)\n", - " 2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:514(_collect_metadata)\n", - " 2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:101(is_holiday)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:895(_get_hostport)\n", - " 7 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:923(quote_from_bytes)\n", - " 12 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1834()\n", - " 320 0.000 0.000 0.001 0.000 :697(__iter__)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1216(_get_rows_with_mask)\n", - " 24 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2353(copy)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:393(prepare_method)\n", - " 1 0.001 0.001 0.001 0.001 {built-in method _socket.getaddrinfo}\n", - " 10 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:1084(_convert_grouper)\n", - " 393 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1837(__init__)\n", - " 1 0.001 0.001 0.001 0.001 :1()\n", - " 333 0.000 0.000 0.001 0.000 :756(encode)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/abstract/singleton.py:14(__call__)\n", - " 25 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:606(formatTime)\n", - " 324 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1749(just)\n", - " 636 0.000 0.000 0.001 0.000 :760(decode)\n", - " 30 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1734(isEnabledFor)\n", - " 4 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:303(_normalize_host)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:521(cookiejar_from_dict)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:1426(_validate_parse_dates_arg)\n", - " 60 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:537(_check_compatible_with)\n", - " 2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/string.py:22(__init__)\n", - " 483 0.001 0.000 0.001 0.000 {method 'split' of 'str' objects}\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:572(prepare_content_length)\n", - " 510 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:360(convertyear)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1495(_maybe_update_cacher)\n", - " 32 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1652(_is_scalar_access)\n", - " 25 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1051(_stop)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:343()\n", - " 72 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/dispatch.py:17(should_extension_dispatch)\n", - " 2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/utils/filters.py:8(filter_inputs)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:325(get_new_columns)\n", - " 94 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:108(asi8)\n", - " 61 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5295(_validate_fill_value)\n", - " 121 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:456(_engine_type)\n", - " 87 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:2140()\n", - " 10 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:560(_validate_scalar)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2244(get_values)\n", - " 2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:211(_simple_new)\n", - " 23 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1561(findCaller)\n", - " 2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:150(__init__)\n", - " 19 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:978(__array__)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:405(__init__)\n", - " 10 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2036(_get_prepare_pydantic_annotations_for_known_type)\n", - " 510 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:402(has_year)\n", - " 8 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:586(update_dtype)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:652(_validate_listlike)\n", - " 30 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:294(handle_union_schema)\n", - " 17 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:664(_constructor_from_mgr)\n", - " 571 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3809()\n", - " 4 0.001 0.000 0.001 0.000 {method 'send' of 'generator' objects}\n", - " 28 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:562(__init__)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:1148(take)\n", - " 16/15 0.000 0.000 0.001 0.000 {built-in method _operator.eq}\n", - " 2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:170(parent_frame_namespace)\n", - " 34 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:314(_result_or_cancel)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:1113(_is_indexed_like)\n", - " 7 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/helpers/utils.py:10(verify_ticker)\n", - " 37/27 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2432(_extract_get_pydantic_json_schema)\n", - " 181 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:2443(get_origin)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:470()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:279(_extract_multi_indexer_columns)\n", - " 40 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:633(is_integer_dtype)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2000(external_values)\n", - " 129 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/numpy/function.py:64(__call__)\n", - " 71 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:74(__len__)\n", - " 85 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/printing.py:522()\n", - " 83 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4379(_set_is_copy)\n", - " 97 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1262(_slice)\n", - " 574 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:718(dtype)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:147(start_date)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:54(__gt__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1093(_getitem_nested_tuple)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:266(index_labels_to_array)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:404(__radd__)\n", - " 229 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/__init__.py:55(using_pyarrow_string_dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:479(items)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:8058(_should_reindex_frame_op)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6480(all)\n", - " 79 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:973(coerce_indexer_dtype)\n", - " 92 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:122(_reset_cache)\n", - " 393 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1056(_could_be_tzname)\n", - " 290 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:300()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1250(copy)\n", - " 61 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1389(_moveaxis_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4651(_maybe_cache_changed)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:644(get_group_index_sorter)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:317(__add__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6629(cumprod)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:946(_sorted_ids)\n", - " 82 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/printing.py:196(as_escaped_string)\n", - " 115 0.000 0.000 0.000 0.000 {method 'nonzero' of 'numpy.ndarray' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2567(_proxy_bypass_macosx_sysconf)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5172(delete)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:1083(reduction)\n", - " 20/19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_repr.py:86(display_as_type)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:810()\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:435(__exit__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:1123(_make_date_converter)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:597()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1728(duplicated)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12291(cumprod)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/utils.py:215(any_specified_encoding)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1954(get_rows_with_mask)\n", - " 321 0.000 0.000 0.000 0.000 {built-in method numpy.asanyarray}\n", - " 88 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:79()\n", - " 107 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:592(_get_block_manager_axis)\n", - " 298 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1081(codes)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12239(_accum_func)\n", - " 8 0.000 0.000 0.000 0.000 :941(update)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2817(hasnans)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:974(_is_nested_tuple_indexer)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:485(__exit__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2107(droplevel)\n", - " 35 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:209(count_not_none)\n", - " 335 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/__init__.py:42(warn_copy_on_write)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:675(empty)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/env.py:62(str2bool)\n", - " 165 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:274(__exit__)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1692()\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:448(size)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1500(_format_strings)\n", - " 165 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:271(__enter__)\n", - " 190 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:791(is_)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:10185(align)\n", - " 4/3 0.000 0.000 0.000 0.000 {built-in method _operator.ge}\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:720(size)\n", - " 154 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/base.py:238(construct_from_string)\n", - " 56 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1310(__getattr__)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/printing.py:51()\n", - " 41/2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_discriminated_union.py:45(inner)\n", - " 383 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1940(_block)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:158(collect_invalid_schemas)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:304(_get_filepath_or_buffer)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6499(min)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1771(_is_label_reference)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:398(reduce)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6219(_raise_if_missing)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:481()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:744(_format_native_types)\n", - " 36 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4191(_validate_positional_slice)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:425(__init__)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:389(is_na)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12381(min)\n", - " 21 0.000 0.000 0.000 0.000 :150(dirname)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:105(__init__)\n", - " 36 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:132(geterr)\n", - " 421 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:196(blklocs)\n", - " 12 0.000 0.000 0.000 0.000 {built-in method _operator.ne}\n", - " 41/2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:161(_is_schema_valid)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1689()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1467(debug)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1551()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:315(__init__)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:259(_reconstruct)\n", - " 747 0.000 0.000 0.000 0.000 {method 'raw' of '_mysql_connector.MySQL' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:801(_fp_read)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:74(array)\n", - " 584 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/flags.py:55(allows_duplicate_labels)\n", - " 47 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:2378(array_equal)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/base.py:294(is_dtype)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/concat.py:52(concat_compat)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:480()\n", - " 569 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:363(attrs)\n", - " 122 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1380()\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:249(external_values)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1261(__init__)\n", - " 511 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1671(name)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/string.py:129()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:546(request_url)\n", - " 524 0.000 0.000 0.000 0.000 {method 'startswith' of 'str' objects}\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:8084(_align_for_op)\n", - " 89 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:373(is_sequence)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/impl.py:153(_do_get)\n", - " 49 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:4035(_dict_not_none)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2159(_drop_level_numbers)\n", - " 269 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:363(ndim)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2794(_na_value)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1922(rename)\n", - " 64 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/missing.py:131(dispatch_fill_zeros)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:487()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:457(read)\n", - " 799 0.000 0.000 0.000 0.000 {built-in method builtins.callable}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:838(select_proxy)\n", - " 69 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:194(_is_internal_frame)\n", - " 182 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:745()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:5565(_reindex_output)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2285()\n", - " 72 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6312(_index_as_unique)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:939(_sort_idx)\n", - " 218 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1270(is_1d_only_ea_dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/weakref.py:585(__call__)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Configuration.py:37(__setattr__)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:466(array_equivalent)\n", - " 41/2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:488(inline_refs)\n", - " 46 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/printing.py:518()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3035(unique)\n", - " 105 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2177(_grouping_func)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/base.py:2411(_quote_free_identifiers)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:122(collect_definitions)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:10479(_align_frame)\n", - " 188 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1828()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/errors.py:222(get_mysql_exception)\n", - " 73 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:161(iloc)\n", - " 25 0.000 0.000 0.000 0.000 {built-in method time.localtime}\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:119(is_namedtuple)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/putmask.py:101(validate_putmask)\n", - " 41/2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:125(_record_valid_refs)\n", - " 67 0.000 0.000 0.000 0.000 {built-in method numpy.zeros}\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1798()\n", - " 41/2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:447(count_refs)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:66(mask_missing)\n", - " 25 0.000 0.000 0.000 0.000 {built-in method time.strftime}\n", - " 96 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1181()\n", - " 196 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:246(items)\n", - " 154 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1687(__eq__)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2827(external_values)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:735(_error_catcher)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4436(_wrap_reindex_result)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1605(maybe_cast_to_integer_array)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6137(_align_for_op)\n", - " 10 0.000 0.000 0.000 0.000 {method '__reduce_ex__' of 'object' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1809(set_names)\n", - " 821 0.000 0.000 0.000 0.000 {method 'decode' of 'bytes' objects}\n", - " 35 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:992(is_numeric_v_string_like)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:829(_maintain_shutdown_locks)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:359(_simple_new)\n", - " 19 0.000 0.000 0.000 0.000 {built-in method today}\n", - " 119 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:131()\n", - " 88 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:648(_colnames_from_description)\n", - " 240 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:913(__init__)\n", - " 15 0.000 0.000 0.000 0.000 :771(get)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:1174(_close_pool_connections)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1439(_indexed_same)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:166(is_finalvar)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/base.py:2414()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:223(unique)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:122(put)\n", - " 87 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/sql/type_api.py:908(_cached_result_processor)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:398(validate_inclusive)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:833(isna)\n", - " 114/53 0.000 0.000 0.000 0.000 {method 'join' of 'str' objects}\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4440(_maybe_preserve_names)\n", - " 60 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2738(is_label_like)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12260(block_accum_func)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:183(_make_sorted_values)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:1248(python_charset)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1418(_literal_schema)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:658(formatMessage)\n", - " 282 0.000 0.000 0.000 0.000 {method '__exit__' of '_thread.lock' objects}\n", - " 98 0.000 0.000 0.000 0.000 {built-in method _thread.allocate_lock}\n", - " 568 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager.py:53()\n", - " 31 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:2473(get_args)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:771(ngroups)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:253(_get_values)\n", - " 23 0.000 0.000 0.000 0.000 :140(basename)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:507(maybe_prepare_scalar_for_op)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2804(_isnan)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2623(_infer_tz_from_endpoints)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:46(__setitem__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:254(_get_footer)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1441()\n", - " 333 0.000 0.000 0.000 0.000 {method 'copy' of 'dict' objects}\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1165(__init__)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:3689(equals)\n", - " 75 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1453(current_thread)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:652(usesTime)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2399(_is_dates_only)\n", - " 23 0.000 0.000 0.000 0.000 :117(splitext)\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2669(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:167(get_annotations)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:11458(blk_func)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:1038(handle_unread_result)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1627(_get_options_with_defaults)\n", - " 100 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:226(validate_bool_kwarg)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ipaddress.py:1286(__init__)\n", - " 44 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1480()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/queue.py:174(get)\n", - " 390 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:1080(copyto)\n", - " 148 0.000 0.000 0.000 0.000 {method 'ravel' of 'numpy.ndarray' objects}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1265(_iset_single)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1284(find_result_type)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:85(path_url)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:1714(na_accum_func)\n", - " 554 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:186(__iter__)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:831(construct_from_string)\n", - " 96 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1571(_get_names)\n", - " 580 0.000 0.000 0.000 0.000 {built-in method _warnings._filters_mutated}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/putmask.py:62(putmask_without_repeat)\n", - " 1 0.000 0.000 0.000 0.000 {method 'connect' of '_socket.socket' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:592(get_content_type)\n", - " 108 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6685(_validate_indexer)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:564(_array_equivalent_object)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:447(format)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1534(blk_func)\n", - " 35 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7723(_unpack_nested_dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:1436(date)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:1499(_maybe_null_out)\n", - " 54 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:550(_is_master_process)\n", - " 25 0.000 0.000 0.000 0.000 {built-in method numpy.arange}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1524(__init__)\n", - " 67 0.000 0.000 0.000 0.000 {method 'transpose' of 'numpy.ndarray' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:182()\n", - " 33 0.000 0.000 0.000 0.000 {method 'fill' of 'numpy.ndarray' objects}\n", - " 367 0.000 0.000 0.000 0.000 {method 'rjust' of 'str' objects}\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:354(validate_ascending)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:483(prepare_headers)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:836()\n", - " 61 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1455()\n", - " 37 0.000 0.000 0.000 0.000 :405(parent)\n", - " 95 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1030(axes)\n", - " 50 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:90(RLock)\n", - " 161 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:696(ndim)\n", - " 253 0.000 0.000 0.000 0.000 {method '__exit__' of '_thread.RLock' objects}\n", - " 66 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:72(check)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:154(get)\n", - " 3 0.000 0.000 0.000 0.000 {method 'readlines' of '_io._IOBase' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5818(head)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:543(nanall)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:255(get)\n", - " 3 0.000 0.000 0.000 0.000 {method 'read' of '_io.BufferedReader' objects}\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:324(slice_block_columns)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:545(_get_sample_object)\n", - " 4 0.000 0.000 0.000 0.000 {built-in method _operator.truediv}\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7664(trim_front)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:243(_keep_alive)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1275(__init__)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1327(__instancecheck__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:5607()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3449(intersection)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:1165(_is_binary_mode)\n", - " 160 0.000 0.000 0.000 0.000 {method 'group' of 're.Match' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/astype.py:56(_astype_nansafe)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:429(__init__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:883(_get_args_resolving_forward_refs)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:440(_format)\n", - " 189 0.000 0.000 0.000 0.000 {method 'insert' of 'list' objects}\n", - " 2 0.000 0.000 0.000 0.000 {method 'fetch_fields' of '_mysql_connector.MySQL' objects}\n", - " 54 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1266(_is_dunder)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:545(is_dataclass)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1192(is_alive)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/roperator.py:10(radd)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:303(makefile)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:490(get)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:215(_vhstack_dispatcher)\n", - " 119 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:283(ismodule)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/common.py:103(_maybe_match_name)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:546(ensure_key_mapped)\n", - " 74 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:286(_is_owned)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:1547(check_below_min_count)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:182(close)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:364(cancel)\n", - " 65 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:62(is_list_like_indexer)\n", - " 136 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:292(isclass)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/decorators.py:10(decorator)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:82(frame_apply)\n", - " 88 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/weakref.py:414(__getitem__)\n", - " 281 0.000 0.000 0.000 0.000 {method 'items' of 'dict' objects}\n", - " 127 0.000 0.000 0.000 0.000 {built-in method builtins.iter}\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_weakrefset.py:85(add)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:470(any_schema)\n", - " 41 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:401(_config_wrapper)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:170()\n", - " 228 0.000 0.000 0.000 0.000 {method 'values' of 'dict' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/shape_base.py:1185(tile)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2252()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1875(to_2d_mgr)\n", - " 52 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:283(_acquire_restore)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:756(_shallow_copy)\n", - " 84 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:738()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:884(__init__)\n", - " 56 0.000 0.000 0.000 0.000 {built-in method builtins.min}\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:410(fill_bool)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:567()\n", - " 48 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:692(_constructor)\n", - " 94 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:981()\n", - " 78 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1449()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:409(iscoroutinefunction)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:324(_get_dtype_max)\n", - " 7 0.000 0.000 0.000 0.000 {built-in method _operator.invert}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1025(save_to_buffer)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:157(core_config)\n", - " 49 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:4036()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:430(_list_schema)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:480(_get_ndims)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:845(unread_result)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/numpy/function.py:413(validate_func)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6831(infer_objects)\n", - " 50 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:72()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1695()\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1657(_get_level_number)\n", - " 123 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:300(ismethod)\n", - " 129 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:378(isfunction)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:884(keys)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:862(codes)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1850(from_blocks)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:191(_validate_parse_dates_presence)\n", - " 166 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:974(dtype)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2586(get_values)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:164(hostname)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:822(reset)\n", - " 119 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:456(istraceback)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:391(_has_code_flag)\n", - " 67 0.000 0.000 0.000 0.000 :41(_get_sep)\n", - " 27 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1765(_get_names)\n", - " 119 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:126(_classes_and_not_datetimelike)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:351(_encode_target)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1570(_maybe_box_and_unbox_datetimelike)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1695(__hash__)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:432(usesTime)\n", - " 35 0.000 0.000 0.000 0.000 {method 'groupdict' of 're.Match' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:935(_verify_integrity)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:2037(to_dict)\n", - " 54 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:505(parent_header)\n", - " 109 0.000 0.000 0.000 0.000 {method 'add' of 'set' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/constants.py:993(get_info)\n", - " 50 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:929(release)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:119(_coerce_args)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:136(ones)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/weakref.py:427(__setitem__)\n", - " 29 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_asarray.py:108()\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1602(__subclasscheck__)\n", - " 62 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:992(_validate_key_length)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/accessors.py:59(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2955(__init__)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2065(set_values)\n", - " 96 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2772()\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/dataclasses.py:1258(is_dataclass)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:316(close)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:490(is_truncated)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/sql/compiler.py:7475(quote_identifier)\n", - " 119 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:480(iscode)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager.py:40()\n", - " 23 0.000 0.000 0.000 0.000 :121(_splitext)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:87(is_literal_type)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/attr.py:389(__bool__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:1191(_get_splitter)\n", - " 45 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:148(__getattr__)\n", - " 70 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/printing.py:60()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/base.py:187(_join)\n", - " 90 0.000 0.000 0.000 0.000 {method 'rfind' of 'str' objects}\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:141(validate_kwargs)\n", - " 281 0.000 0.000 0.000 0.000 {function FrozenList.__getitem__ at 0x12618e700}\n", - " 205 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:266(mgr_locs)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:638(__array__)\n", - " 119 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:466(isframe)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:494(_clean_keys_and_objs)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:311(is_null_slice)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:509(urlunparse)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:567(free_result)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:363(_can_hold_element)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:334(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:93(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:685()\n", - " 44 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:158(_check_finalvar)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1933(to_numpy)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7704(get_unanimous_names)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:231(_fix)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1881(nonzero)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2410(wrap_default)\n", - " 35 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:566(is_self_type)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:419(_close_conn)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:121(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:974(close)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:106(keys)\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:1745(currentframe)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1377(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:541(to_numpy)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/_policybase.py:319(header_fetch_parse)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:259(_standardize_fill_value)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/handlers.py:354(shouldRollover)\n", - " 122 0.000 0.000 0.000 0.000 {built-in method numpy.core._multiarray_umath.normalize_axis_index}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1195(_info_repr)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1324(_make_invoke_excepthook)\n", - " 10 0.000 0.000 0.000 0.000 {method 'astype' of 'numpy.generic' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:248(stringify_path)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:209(_maybe_get_mask)\n", - " 201 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:153(concatenate)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:687()\n", - " 4 0.000 0.000 0.000 0.000 {method 'write' of '_io.BytesIO' objects}\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:688(__call__)\n", - " 1 0.000 0.000 0.000 0.000 {method 'close' of '_io.BufferedReader' objects}\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:471(__init__)\n", - " 39 0.000 0.000 0.000 0.000 {method 'put' of '_queue.SimpleQueue' objects}\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:288()\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:157(_int64_cut_off)\n", - " 173 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:213()\n", - " 36 0.000 0.000 0.000 0.000 {built-in method numpy.seterrobj}\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:230(_can_hold_na)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:318()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:687(_constructor_expanddim_from_mgr)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:839()\n", - " 69 0.000 0.000 0.000 0.000 :52(normcase)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1562()\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:99(freq)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:131(is_new_type)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2095(create_block_manager_from_blocks)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:263(_remove_path_dot_segments)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:1054(construct_from_string)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ipaddress.py:1187(_ip_int_from_string)\n", - " 332 0.000 0.000 0.000 0.000 {method 'ljust' of 'str' objects}\n", - " 41 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1165(_check_deprecated_callable_usage)\n", - " 96 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1180()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Configuration.py:18(initialize_configuration)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:837(result_set_available)\n", - " 52 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:280(_release_save)\n", - " 10/2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:99(all_literal_values)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:172(from_float)\n", - " 73 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:470(__getattr__)\n", - " 44 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:241(is_single_block)\n", - " 259 0.000 0.000 0.000 0.000 {method 'replace' of 'str' objects}\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:587()\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:207(_arrays_for_stack_dispatcher)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:405(_check_values_indices_shape_match)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4518(_check_inplace_and_allows_duplicate_labels)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/ops.py:108(_get_same_shape_values)\n", - " 179 0.000 0.000 0.000 0.000 {method 'pop' of 'dict' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:215(get_default_val)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:3108(cumprod)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:454(__exit__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1725(can_hold_element)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/errors.py:46(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:550(infer_compression)\n", - " 5 0.000 0.000 0.000 0.000 {method 'cumsum' of 'numpy.ndarray' objects}\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Configuration.py:29(__getattr__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:762(infer_dtype_from)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:544(_initialize_justify)\n", - " 48 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:815(filter)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:813(str_schema)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:724()\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:366(notify)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:464(get_array_op)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:136(reset)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:436(_split)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:794(close)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_schema_generation_shared.py:72(__init__)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/typing_extensions.py:1132(is_typeddict)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:342(construct_from_string)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:208(_maybe_unbox_datetimelike)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:109(__init__)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:665(_get_registered_option)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:514(show_row_idx_names)\n", - " 96 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2781()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:201(_set_noconvert_columns)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:34(__str__)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:594(_bool_arith_check)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:1034(check_header_validity)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1720(getEffectiveLevel)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:635(release_conn)\n", - " 4 0.000 0.000 0.000 0.000 {method 'free_result' of '_mysql_connector.MySQL' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:2133(_refine_defaults_read)\n", - " 69 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1046(nlevels)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2567(push)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:183()\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:164()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1721()\n", - " 2 0.000 0.000 0.000 0.000 :16(exists)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/_policybase.py:301(header_source_parse)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:534()\n", - " 8 0.000 0.000 0.000 0.000 :790(items)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:536(close)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:438(convert)\n", - " 5 0.000 0.000 0.000 0.000 {built-in method posix.cpu_count}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/string.py:189(_binify)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/log.py:104(_should_log_info)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:47(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/shutil.py:1426(get_terminal_size)\n", - " 4 0.000 0.000 0.000 0.000 {built-in method _operator.inv}\n", - " 1 0.000 0.000 0.000 0.000 {method 'cumprod' of 'numpy.ndarray' objects}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1227(deepvalues)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:228(_acquireLock)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:34(__init__)\n", - " 65 0.000 0.000 0.000 0.000 {method 'item' of 'numpy.ndarray' objects}\n", - " 61 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5364(_insert_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/version/__init__.py:149(__lt__)\n", - " 339 0.000 0.000 0.000 0.000 {method 'end' of 're.Match' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:159(resolve_redirects)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/log.py:101(_should_log_debug)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/version/__init__.py:520(_cmpkey)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:180()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:781(_call_soon)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:446(_init_decoder)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:1835(construct_from_string)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:3345(arguments_parameter)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/roperator.py:14(rsub)\n", - " 23 0.000 0.000 0.000 0.000 {method 'update' of 'dict' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:639(group_keys_seq)\n", - " 159 0.000 0.000 0.000 0.000 {built-in method posix.fspath}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:137(hasnans)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:354(__array__)\n", - " 80 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:115(get_ref)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/_policybase.py:289(_sanitize_header)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1111(_values)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/pivot.py:493(_convert_by)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:205(_hostinfo)\n", - " 96 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:941()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:267(clear)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/plugin/_loader.py:21(get_plugins)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/calendar.py:122(monthrange)\n", - " 64 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1665()\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:2228(construct_from_string)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:332(array)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:598(collect_definitions)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:643(name)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:2364(with_default_schema)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:2426(nullable_schema)\n", - " 68 0.000 0.000 0.000 0.000 {built-in method time.time}\n", - " 128 0.000 0.000 0.000 0.000 {built-in method _thread.get_ident}\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:291(arrays)\n", - " 1 0.000 0.000 0.000 0.000 :2(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:177()\n", - " 2 0.000 0.000 0.000 0.000 {built-in method _operator.mul}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:278(prepare_config)\n", - " 102 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:344()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1096(_can_fast_transpose)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:138(refresh_cache)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:296(_put_conn)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:799(mount)\n", - " 35 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:557(is_generic_alias)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/weakref.py:369(remove)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/sql/elements.py:5219(construct)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1768(_set_names)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method posix.stat}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:220(__init__)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1357(__getattr__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:271(validate_fillna_kwargs)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:484(should_show_dimensions)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:553(equals)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_weakrefset.py:39(_remove)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:123(getLevelName)\n", - " 112 0.000 0.000 0.000 0.000 {method 'upper' of 'str' objects}\n", - " 49 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1206(daemon)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:950(_validate_or_indexify_columns)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/_optional.py:74(get_version)\n", - " 72 0.000 0.000 0.000 0.000 {built-in method numpy.geterrobj}\n", - " 70 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:217(_scalar_type)\n", - " 85 0.000 0.000 0.000 0.000 {method '__enter__' of '_thread.lock' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:358(update)\n", - " 33 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:688(_sanitize_non_ordered)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:206(_should_unflatten_callable_args)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1990(__exit__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/exc.py:48(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:99(_intenum_converter)\n", - " 122 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5558(_append_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:499(close)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1061()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:76(copy)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:525(get_all)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/utils.py:28(eod)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:108()\n", - " 122 0.000 0.000 0.000 0.000 {built-in method _operator.index}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:136(_codes_to_ints)\n", - " 63 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:660(_constructor)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/importlib/__init__.py:108(import_module)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:773(__init__)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2738(_check_indexing_error)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:126(language)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:502(enter_context)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:498(is_truncated_vertically)\n", - " 45 0.000 0.000 0.000 0.000 {method 'find' of 'str' objects}\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:447(isclosed)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/langhelpers.py:1138(__get__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:348(_get_timeout)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method builtins.locals}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/getlimits.py:685(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:139(ticker)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:259(__getitem__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:940(date_schema)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:495(_real_close)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1622(close)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:494(is_truncated_horizontally)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1674(_check_file_or_buffer)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:368(getMessage)\n", - " 60 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1176(_maybe_disallow_fill)\n", - " 176 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:182(_deepcopy_atomic)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:616(get_content_maintype)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:641(fill_missing_names)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:258(__init__)\n", - " 63 0.000 0.000 0.000 0.000 {built-in method sys.getrefcount}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:363(_repeater)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/generic.py:2015(_wrap_agged_manager)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:1204(is_potential_multi_index)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1122()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1731(__hash__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:470()\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/version/__init__.py:348()\n", - " 122 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1480(_clear_item_cache)\n", - " 80 0.000 0.000 0.000 0.000 {method '__enter__' of '_thread.RLock' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:12(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1643(reconstruct_func)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1354(enforce_interval)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:127(__next__)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method from_bytes}\n", - " 122 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1764(_ravel_dispatcher)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:578(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1225(__init__)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:51(__getitem__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:102(__setitem__)\n", - " 23 0.000 0.000 0.000 0.000 {built-in method gc.get_referents}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:182(_make_key_to_index)\n", - " 78 0.000 0.000 0.000 0.000 {built-in method posix.getpid}\n", - " 49 0.000 0.000 0.000 0.000 {method 'rpartition' of 'str' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1544(log)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/encodings/idna.py:145(encode)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:679(_init_length)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:83(is_callable_type)\n", - " 46 0.000 0.000 0.000 0.000 {built-in method sys._getframe}\n", - " 36 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2752(need_slice)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1753(__iter__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:100(push)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:243(get_payload)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:383(is_closed)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:886(inner)\n", - " 42 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1725(__eq__)\n", - " 33 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1463()\n", - " 4 0.000 0.000 0.000 0.000 {method 'put' of 'numpy.ndarray' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:660(requote_uri)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/console.py:79(in_ipython_frontend)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_known_annotated_metadata.py:121(expand_grouped_metadata)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:100(__new__)\n", - " 66 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:575(is_set)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:213(_read_headers)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:219(__init__)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copyreg.py:104(__newobj__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:506(has_index_names)\n", - " 1 0.000 0.000 0.000 0.000 {method '__exit__' of '_io._IOBase' objects}\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1472()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:2015(__iter__)\n", - " 77 0.000 0.000 0.000 0.000 {method 'release' of '_thread.lock' objects}\n", - " 41 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:211(tail)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2155()\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:2472(union_schema)\n", - " 8 0.000 0.000 0.000 0.000 {built-in method now}\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/utils.py:368(cut_sequence_chunks)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:788()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:397(ensure_np_dtype)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:251(handle_list_schema)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1959(maybe_mangle_lambdas)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/putmask.py:115(extract_bool_array)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:58()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/queue.py:228(_put)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:540()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:259(maybe_downcast_to_dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:1532(_soft_close)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:404(is_dataclass)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2322(any)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2294()\n", - " 6 0.000 0.000 0.000 0.000 {method 'fullmatch' of 're.Pattern' objects}\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1841(_has_names)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/putmask.py:29(putmask_inplace)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:400()\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:3002()\n", - " 2 0.000 0.000 0.000 0.000 {method 'searchsorted' of 'numpy.ndarray' objects}\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:531(validate_ordered)\n", - " 23 0.000 0.000 0.000 0.000 {method 'write' of '_io.TextIOWrapper' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5134(array)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:983(is_in_axis)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:211()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/events.py:35(__init__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:1045(_validate_header_part)\n", - " 156 0.000 0.000 0.000 0.000 {method 'strip' of 'str' objects}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/ops.py:96(_reset_block_mgr_locs)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1671(is_all_strings)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:841(fetchall)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:52(__init__)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:440(__init__)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:696(names)\n", - " 1 0.000 0.000 0.000 0.000 {method 'sendall' of '_socket.socket' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:487()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1234(_validate_method)\n", - " 57 0.000 0.000 0.000 0.000 {method 'write' of '_io.StringIO' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1686(name)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1069(_is_homogeneous_type)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1152(name)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:413(_splitnetloc)\n", - " 80 0.000 0.000 0.000 0.000 {method 'append' of 'collections.deque' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1379(determine_table_agg)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:106(_get_distinct_objs)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:199(could_be_from_charset)\n", - " 23 0.000 0.000 0.000 0.000 {method 'difference_update' of 'set' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:81(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/string.py:126()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:849(_list_to_arrays)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:410(_is_comparable_dtype)\n", - " 44 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:398(__get_result)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1249(shape)\n", - " 63 0.000 0.000 0.000 0.000 {method 'release' of '_thread.RLock' objects}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5676()\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:57(__iter__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:526(_initialize_sparsify)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:532(_still_open_and_dbapi_connection_is_valid)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:107(get_redirect_target)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/numpy/function.py:159(validate_argsort_with_ascending)\n", - " 67 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:892(bincount)\n", - " 57 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7678()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:3750(definitions_schema)\n", - " 2 0.000 0.000 0.000 0.000 :773(getenv)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:774(get_proxy)\n", - " 70 0.000 0.000 0.000 0.000 {method 'toordinal' of 'datetime.date' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:593(_calc_max_rows_fitted)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:196(mgr_to_mgr)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/_collections.py:147(__new__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4585(_is_view)\n", - " 35 0.000 0.000 0.000 0.000 {method 'rstrip' of 'str' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2209(_safe_close_cursor)\n", - " 5 0.000 0.000 0.000 0.000 :319(decode)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:426(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:984()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:126(resolve_default_timeout)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:219(mask_all)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:601(_set_noconvert_dtype_columns)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_sync.py:10(_call_handlers)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1319(disable)\n", - " 1 0.000 0.000 0.000 0.000 {function socket.close at 0x10ddfa0c0}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:1135(_splitport)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:389(standardize_mapping)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:479(__repr__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:362(_make_index)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:107()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/database/SQLHelpers.py:46(get_engine)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:672(_is_view_after_cow_rules)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/cd.py:291(merge_coherence_ratios)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:194(__set_y)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:947()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:204(identify_interval)\n", - " 43 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:1073(clean_reindex_fill_method)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3766(_convert_can_do_setop)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:138(_event_pipe)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:532(treat_as_nested)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1980(build_name_format)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/astype.py:249(astype_is_view)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1980(shape)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:193(_userinfo)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method _codecs.lookup}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:206(get_module_ns_of)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:515(get_compression_method)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1041(_get_buffer)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:518(show_col_idx_names)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1489(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1062(levshape)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:102()\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/retry.py:242()\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:584()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:742(_get_axes)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1976(items)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2516(__init__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:91(is_deprecated_instance)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:49(_check_for_default_values)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method _operator.gt}\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/functools.py:65(wraps)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:692(levels)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/Requests.py:172(__init__)\n", - " 49 0.000 0.000 0.000 0.000 {built-in method time.monotonic}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:175(port)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:539(get_encoding_from_headers)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:480(is_view)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/numpy/function.py:223(validate_cum_func_with_skipna)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:572(is_required)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:92()\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/command_runner.py:470(user_settings)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:84()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2512(cumsum)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:475(any_extension_types)\n", - " 50 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:592(groupings)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:692(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:185()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaExceptions.py:62(raise_thetadata_exception)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2066(_get_level_values)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:516(close)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:254()\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:248(_qsize)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7652(ensure_has_len)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:638(_passed_categorical)\n", - " 59 0.000 0.000 0.000 0.000 {method 'discard' of 'set' objects}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/version/__init__.py:470(_parse_letter_version)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:202(_maybe_reindex_columns_na_proxy)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_common.py:17(_maybe_call)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1619(executemany)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:966(_selected_obj)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/pivot.py:173()\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7679()\n", - " 47 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:2374(_array_equal_dispatcher)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:423(repeat)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:764(categories)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:350(_maybe_make_multi_index_columns)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:805()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:1206(literal_schema)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:183(maybe_box_native)\n", - " 33 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1479()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/base.py:346(__init__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:886()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:612(_adjust_max_rows)\n", - " 8 0.000 0.000 0.000 0.000 {built-in method fromkeys}\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:128(_check_for_invalid_keys)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:1287(_value_formatter)\n", - " 1 0.000 0.000 0.000 0.000 {method 'any' of 'numpy.generic' objects}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:743(readable)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:143(clear)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:77(readline)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:937()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:343()\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:302(add)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1734(clear_expired_cookies)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:650(truncate)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1340()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:388()\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:949()\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:686()\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2220(_can_hold_na)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:121(get_cache)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:227(_chk_truncate)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:751()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:1269(_process_date_conversion)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Context.py:124(clear_context)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:51(origin_is_union)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:205(_effective_processors)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:237(_releaseLock)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/mysqlconnector.py:145(is_disconnect)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6277()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:1129(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:221()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/functools.py:421(_unwrap_partial)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:424(close)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:483(_view)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ipaddress.py:1213(_parse_octet)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:659(unquote)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:3386(arguments_schema)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/retry.py:387(is_retry)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1269(set_inplace)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:139()\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6270()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/hooks.py:16()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:1149(_normalize_host)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:265(_find_common_index_dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7717()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:2077()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:720()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/langhelpers.py:1224(_set_memoized_attribute)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:204()\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:303()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:95(__init__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:168()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:497(_extract_metadata)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:392(ensure_dtype_objs)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:95(__getitem__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:510(has_column_names)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/database/SQLHelpers.py:336(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:331(set_payload)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:194(close)\n", - " 54 0.000 0.000 0.000 0.000 {method 'get' of '_contextvars.ContextVar' objects}\n", - " 176 0.000 0.000 0.000 0.000 {built-in method builtins.ord}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:446()\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:446(__exit__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1445(is_valid)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:520(urlunsplit)\n", - " 6 0.000 0.000 0.000 0.000 {method '_acquire_restore' of '_thread.RLock' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:735(unwrap)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:3176(ndim)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:514(_parse_content_type_header)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1474()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1230(_encode_request)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:276(append)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3200(_get_reconciled_name_object)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:194(_values_for_factorize)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:520(can_consume_results)\n", - " 1 0.000 0.000 0.000 0.000 :315(__subclasshook__)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method builtins.round}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/calendar.py:115(weekday)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2474(validate_periods)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1331(dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/retry.py:379(_is_method_retryable)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:188(clone)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:1095(__new__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:781(close)\n", - " 1 0.000 0.000 0.000 0.000 :1192(_gcd_import)\n", - " 26 0.000 0.000 0.000 0.000 {method 'capitalize' of 'str' objects}\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:948()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/from_thread.py:170(_check_running)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:918(_wrap_ipv6)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1251(_validate_host)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/multiprocessing/process.py:37(current_process)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:574(is_zoneinfo_type)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:619(categories)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1395(determine_requested_columns)\n", - " 5 0.000 0.000 0.000 0.000 {method '_checkReadable' of '_io._IOBase' objects}\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:172()\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:999(is_in_obj)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:922(_maybe_infer_dtype_type)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:186(_from_factorized)\n", - " 24 0.000 0.000 0.000 0.000 {method 'remove' of 'collections.deque' objects}\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:174(not_none)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:130(_validate_timeout)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:1221(_charset_id)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/util.py:19(to_str)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/multiprocessing/process.py:189(name)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:282(query_attrs)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:167()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:769(is_redirect)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:374(_merge_pool_kwargs)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:636(unquote_unreserved)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1201()\n", - " 27 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2416(_all_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/methods/to_dict.py:155()\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1076()\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:251(_put)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:390(_check_close)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:338(astype)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/utils.py:52(_has_surrogates)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:403()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/response.py:9(is_fp_closed)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:781(get_adapter)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:105(is_file_like)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:37(lookback)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:982()\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:1080(_is_label_like)\n", - " 1 0.000 0.000 0.000 0.000 {method 'setsockopt' of '_socket.socket' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/queue.py:222(_empty)\n", - " 88 0.000 0.000 0.000 0.000 {method 'locked' of '_thread.lock' objects}\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1021(_argsort_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method posix.get_terminal_size}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:309(_operation_context)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:178()\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:209(is_object)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5649(_needs_reindex_multi)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:835(_local_timestamps)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:195()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:196()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:251(put)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1394(__hash__)\n", - " 3 0.000 0.000 0.000 0.000 {function SocketIO.close at 0x10ddfae80}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:234(_disallow_mismatched_datetimelike)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:439(_ensure_has_table_connection)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/parser.py:17(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:520(convert_to_list_like)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1992(_validate_index_level)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:693(_get_result_dim)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:622(convert)\n", - " 1 0.000 0.000 0.000 0.000 {method 'issuperset' of 'frozenset' objects}\n", - " 10 0.000 0.000 0.000 0.000 {method 'index' of 'list' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2564(__init__)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:507(set_raw)\n", - " 2 0.000 0.000 0.000 0.000 {method 'settimeout' of '_socket.socket' objects}\n", - " 1 0.000 0.000 0.000 0.000 :309(__init__)\n", - " 33 0.000 0.000 0.000 0.000 {method 'partition' of 'str' objects}\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:254(_get)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ipaddress.py:574(__int__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:164(host)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5486()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:478()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/methods/to_dict.py:160()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1329(result_index)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:187(_get_fill_value)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:351(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:811(_newname)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:69(close)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/queue.py:225(_full)\n", - " 5 0.000 0.000 0.000 0.000 {method 'subn' of 're.Pattern' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:95(literal_values)\n", - " 8 0.000 0.000 0.000 0.000 :812(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:188(all_none)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:1117(_maybe_memory_map)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:443(__enter__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:534(_push_cm_exit)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:3445(call_schema)\n", - " 37 0.000 0.000 0.000 0.000 {method 'weekday' of 'datetime.date' objects}\n", - " 2 0.000 0.000 0.000 0.000 {method 'pop' of 'collections.OrderedDict' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1398(_reset)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/utils.py:189(check_single_item)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1028(_output)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:657()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:757()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:891(default_user_agent)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:195(_new_message)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1903()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2180(_ensure_matching_resos)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:353()\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2730(annotation)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:421(lexsort)\n", - " 5 0.000 0.000 0.000 0.000 {built-in method _codecs.utf_8_decode}\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:632(ordered)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:559(_validate_names)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2721(is_nested_tuple)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:376(dtype)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:198()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager.py:366()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:550(_initialize_columns)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/abstract/error.py:9(__init__)\n", - " 17 0.000 0.000 0.000 0.000 {method 'lstrip' of 'str' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:212()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:856(columns)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:722(_result_index)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:330(_sanitize_and_check)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:585(_ensure_2d)\n", - " 1 0.000 0.000 0.000 0.000 :815(__len__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4306(_validate_can_reindex)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:29(_splitparam)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:633(is_builtin_func)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:472(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:891(_get_first_arg_or_any)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:238(is_int64_overflow_possible)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:1079(closed)\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1847()\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/concat.py:73()\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2734(kind)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/mysqlconnector.py:53(_escape_identifier)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:694()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:535(temp_setattr)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:191(_server_status)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:1233(dedup_names)\n", - " 27 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:290(_add_custom_serialization_from_json_encoders)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/_internal_utils.py:25(to_native_string)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1658(no_parameters)\n", - " 2 0.000 0.000 0.000 0.000 {method 'swapaxes' of 'numpy.ndarray' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:336(_na_ok_dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3760(_assert_can_do_setop)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:369(should_store)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:405(_types_namespace)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:582(_calc_max_cols_fitted)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:858(_get_column_name_list)\n", - " 1 0.000 0.000 0.000 0.000 :1165(_find_and_load)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:698()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7719()\n", - " 3 0.000 0.000 0.000 0.000 {built-in method math.floor}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:717(index)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:151(end_date)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2722(name)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:553(nblocks)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1720(_value_and_type_iter)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5495()\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1721()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:202(start_connect)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2726(default)\n", - " 2 0.000 0.000 0.000 0.000 {method 'repeat' of 'numpy.ndarray' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1038(in_transaction)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1047(_get_i8_values_and_mask)\n", - " 5 0.000 0.000 0.000 0.000 {method 'tolist' of 'numpy.ndarray' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/errors/__init__.py:535(_check_cacher)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:315(step)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:436(flush)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:277()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1094()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1730()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/utils.py:121(__init__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:2139(_codes)\n", - " 17 0.000 0.000 0.000 0.000 {method '__contains__' of 'frozenset' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:829(warning_count)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1793()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2688(_deactivate_from_connection)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:1131(putmask)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:655(_constructor)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:176(dtype)\n", - " 17 0.000 0.000 0.000 0.000 {method 'isidentifier' of 'str' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:664(maybe_fill)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:850(more_results)\n", - " 25 0.000 0.000 0.000 0.000 {built-in method builtins.abs}\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:291(__iter__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:367()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:370()\n", - " 10 0.000 0.000 0.000 0.000 {method 'count' of 'list' objects}\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:77(_atleast_2d_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:328(merge_incomplete_data_in_cache)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/command_runner.py:465(system_settings)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:518(__repr__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:166(__setattr__)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2974(_prod_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:2056(_clean_na_values)\n", - " 9 0.000 0.000 0.000 0.000 {method 'values' of 'collections.OrderedDict' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:1229()\n", - " 11 0.000 0.000 0.000 0.000 {method 'startswith' of 'bytes' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:2365(_validate_skipfooter)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:661(_ilevel)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:121(pushlines)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1877(_nonzero_dispatcher)\n", - " 4 0.000 0.000 0.000 0.000 {method 'total_seconds' of 'datetime.timedelta' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1128(value_getitem)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:230()\n", - " 6 0.000 0.000 0.000 0.000 {method '_release_save' of '_thread.RLock' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1066(_get_arithmetic_result_freq)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:626(_is_in_terminal)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:494(dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1290(_cookies_for_request)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:518(_check_closed)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:1465(list_schema)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1553()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:140(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:915(__array__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:268(_get_out_dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:244(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/util/numba_.py:18(maybe_use_numba)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/replace.py:31(should_use_regex)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:465(_decode)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:369()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:250(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:799(iter_content)\n", - " 7 0.000 0.000 0.000 0.000 {method 'rstrip' of 'bytes' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/getlimits.py:709(max)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_wait_gen.py:7(expo)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:60(__len__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:314()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:245(read_timeout)\n", - " 3 0.000 0.000 0.000 0.000 {method 'getvalue' of '_io.BytesIO' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:91(ensure_python_int)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4367(igetitem)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:346(where)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_request_methods.py:51(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:211(is_multipart)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:305(loc)\n", - " 4 0.000 0.000 0.000 0.000 {built-in method _contextvars.copy_context}\n", - " 5 0.000 0.000 0.000 0.000 {method 'count' of 'bytes' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:312(pm)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:131(close)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:539(_push_exit_callback)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:93()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/_internal_utils.py:38(unicode_is_ascii)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:280(start)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:303()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:331(maybe_downcast_numeric)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/queue.py:231(_get)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:421(_checknetloc)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:249(_get_output_shape)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1487(__getattr__)\n", - " 1 0.000 0.000 0.000 0.000 :1101(_sanity_check)\n", - " 15 0.000 0.000 0.000 0.000 {method 'popleft' of 'collections.deque' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:44(_debug)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:916()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:1454(__init__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5168(_delete_dispatcher)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:248(__len__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:320(__len__)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1828(ndim)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:403(retries)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:270(mgr_locs)\n", - " 4 0.000 0.000 0.000 0.000 {method 'groups' of 're.Match' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1243(_validate_path)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:706()\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:108(_noop)\n", - " 5 0.000 0.000 0.000 0.000 {method '_checkClosed' of '_io._IOBase' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:91(merge_hooks)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:709(inferred_type)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method sys.exc_info}\n", - " 2 0.000 0.000 0.000 0.000 {method 'items' of 'mappingproxy' objects}\n", - " 8 0.000 0.000 0.000 0.000 {method '_is_owned' of '_thread.RLock' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:330(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:208(_pop_message)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:770(_maybe_check_integrity)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:222()\n", - " 5 0.000 0.000 0.000 0.000 {method 'decode' of 'bytearray' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:212()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:227(connect_timeout)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6061(_should_fallback_to_positional)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:208(__init__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1979(nlevels)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:223(__len__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/base.py:115(__eq__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1989(index)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_common.py:28()\n", - " 1 0.000 0.000 0.000 0.000 :260(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:205()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/hooks.py:22(dispatch_hook)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:849()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:450(check_dtype_backend)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:333(tail)\n", - " 4 0.000 0.000 0.000 0.000 {method 'items' of 'collections.OrderedDict' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:351()\n", - " 2 0.000 0.000 0.000 0.000 {method 'update' of 'collections.OrderedDict' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:7045(_deprecate_downcast)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:197(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7718()\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:669(result_type)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:691(__del__)\n", - " 6 0.000 0.000 0.000 0.000 {method 'reverse' of 'list' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:3015(parameters)\n", - " 9 0.000 0.000 0.000 0.000 {method 'isascii' of 'str' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/request.py:134(set_file_position)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2577(is_view)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:330()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/connection.py:103(allowed_gai_family)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2070()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:141(is_re)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:398()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/shape_base.py:1257()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/container.py:59(_get_provider)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/version/__init__.py:534()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:99()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:567(connection)\n", - " 2 0.000 0.000 0.000 0.000 {method 'values' of 'mappingproxy' objects}\n", - " 1 0.000 0.000 0.000 0.000 {method 'fileno' of '_io.TextIOWrapper' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:245(_init)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:893(_check_data_length)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:643(__enter__)\n", - " 4 0.000 0.000 0.000 0.000 {method 'count' of 'str' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2687(_max_dispatcher)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:117(info)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:1954(get_debug)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:1448(__enter__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:280(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:460(tolist)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:11522()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:1447(is_index_col)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:229(__iter__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/errors.py:80(__str__)\n", - " 3 0.000 0.000 0.000 0.000 {method 'date' of 'datetime.datetime' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:231()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:255(_has_complex_date_col)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:489(_decref_socketios)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/calendar.py:102(isleap)\n", - " 2 0.000 0.000 0.000 0.000 {method 'getvalue' of '_io.StringIO' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:301(__init__)\n", - " 6 0.000 0.000 0.000 0.000 {method 'pop' of 'set' objects}\n", - " 2 0.000 0.000 0.000 0.000 {method 'clear' of 'collections.OrderedDict' objects}\n", - " 2 0.000 0.000 0.000 0.000 {method 'split' of 'bytes' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2583(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:284(_get_result_dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1926(handle_extra_cols)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method sys.getrecursionlimit}\n", - " 2 0.000 0.000 0.000 0.000 {built-in method _weakref.proxy}\n", - " 2 0.000 0.000 0.000 0.000 {method 'extend' of 'collections.deque' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:885(__init__)\n", - " 1 0.000 0.000 0.000 0.000 {method 'sort' of 'list' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:1110(get_warnings)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:462(_create_exit_wrapper)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:540(closed)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:558(_initialize_colspace)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:820()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1567(_maybe_transpose_result)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:4948(_needs_reindex_multi)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:213()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:805(_maybe_copy)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:192()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_validate_call.py:51()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:183(host)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:2267(_extract_dialect)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:206()\n", - " 2 0.000 0.000 0.000 0.000 {method 'connected' of '_mysql_connector.MySQL' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:216(_validate_dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:188(_expand_user)\n", - " 2 0.000 0.000 0.000 0.000 {method 'with_traceback' of 'BaseException' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:212(_get_cython_vals)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:743(set_environ)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:155(_check_executed)\n", - " 1 0.000 0.000 0.000 0.000 {method 'consume_result' of '_mysql_connector.MySQL' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:1065(soft_close)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:191(_values_for_argsort)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:231(_constructor)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:527(validate_integer)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method _codecs.lookup_error}\n", - " 2 0.000 0.000 0.000 0.000 {method 'truncate' of '_io.StringIO' objects}\n", - " 4 0.000 0.000 0.000 0.000 {method 'seek' of '_io.StringIO' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/version/__init__.py:508(_parse_local_version)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:110(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:94(_process_parse_dates_argument)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:3019(return_annotation)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:125(__init__)\n", - " 1 0.000 0.000 0.000 0.000 {method 'more_results' of '_mysql_connector.MySQL' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3211(_validate_sort_keyword)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:146(dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:235()\n", - " 2 0.000 0.000 0.000 0.000 {method 'st_server_status' of '_mysql_connector.MySQL' objects}\n", - " 1 0.000 0.000 0.000 0.000 {built-in method sys.getfilesystemencoding}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/mysqlconnector.py:142(_extract_error_code)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:216()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:326()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:504(description)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:159(_freeze)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:986(_validate_usecols_arg)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:467()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:296(best)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/shape_base.py:1181(_tile_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method _socket.getdefaulttimeout}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:512(_validate_axis)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1371(enforce_inputs)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:292(is_fsspec_url)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/formats/format.py:531(_initialize_formatters)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/response.py:79()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:93(encoding)\n", - " 1 0.000 0.000 0.000 0.000 {method 'warning_count' of '_mysql_connector.MySQL' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:510()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:172(raw)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/tz/tz.py:74(utcoffset)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:107(_copy_immutable)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:581(iter_slices)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method sys.audit}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:687(is_closed)\n", - " 2 0.000 0.000 0.000 0.000 {method 'st_warning_count' of '_mysql_connector.MySQL' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:154(chaos)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2508(_cumsum_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:3104(_cumprod_dispatcher)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/IPython/core/interactiveshell.py:683(get_ipython)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:546(invalidated)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:578(add_headers)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:419(_repeat_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method builtins.globals}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:2486(reset)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1763(pre_exec)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:87(get_new_headers)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:295(is_closed)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/cd.py:305()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1976(_shape_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:247()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1987(__enter__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2317(_any_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:695(do_begin)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1771(post_exec)\n", - " 1 0.000 0.000 0.000 0.000 {method 'pop' of 'collections.deque' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:124(__iter__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/proxy.py:11(connection_requires_http_tunnel)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:3172(_ndim_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:105(_box_func)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1803(handle_dbapi_exception)\n", - " 1 0.000 0.000 0.000 0.000 {function HTTPResponse.flush at 0x10fc6d1c0}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:231(__enter__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:339(_validate_conn)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1986(_sort_levels_monotonic)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:451(__enter__)\n", - "\n", - "\n", - "\n" - ] - } - ], - "source": [ - "print(returned_order[1])" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "import json\n", - "_REQUESTS =[]\n", - "def load_requests_into_list():\n", - " global _REQUESTS\n", - " _REQUESTS = requests_from_jsonl()\n", - " for item in _REQUESTS:\n", - " ## Ensure save_func is a callable\n", - " item['save_func'] = partial(eval(item['save_func']), print_info=True)\n", - "\n", - " ## Transform set_attributes to a DataFrame\n", - " if item['type_'] == 'chain':\n", - " item['set_attributes']['post_processed_data'] = pd.DataFrame(item['set_attributes']['post_processed_data'])\n", - " print(f\"Loaded {len(_REQUESTS)} requests into _REQUESTS list\")\n" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "ename": "ThetaDataNotFound", - "evalue": "Data not found for the given parameters: {'end_date': 20231231, 'root': 'SBUX', 'use_csv': 'true', 'exp': 20231229, 'right': 'C', 'start_date': 20230101, 'strike': 79000, 'url': 'http://127.0.0.1:25510/v2/hist/option/eod?end_date=20231231&root=SBUX&use_csv=true&exp=20231229&right=C&start_date=20230101&strike=79000'}", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mThetaDataNotFound\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[14], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mretrieve_eod_ohlc\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 2\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mSBUX\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3\u001b[0m \u001b[43m \u001b[49m\u001b[43mstart_date\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43m2023-01-01\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 4\u001b[0m \u001b[43m \u001b[49m\u001b[43mend_date\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43m2023-12-31\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 5\u001b[0m \u001b[43m \u001b[49m\u001b[43mexp\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43m2023-12-29\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 6\u001b[0m \u001b[43m \u001b[49m\u001b[43mright\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mC\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 7\u001b[0m \u001b[43m \u001b[49m\u001b[43mstrike\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m79.0\u001b[39;49m\n\u001b[1;32m 8\u001b[0m \u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_sync.py:105\u001b[0m, in \u001b[0;36mretry_exception..retry\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 96\u001b[0m details \u001b[38;5;241m=\u001b[39m {\n\u001b[1;32m 97\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtarget\u001b[39m\u001b[38;5;124m\"\u001b[39m: target,\n\u001b[1;32m 98\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124margs\u001b[39m\u001b[38;5;124m\"\u001b[39m: args,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 101\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124melapsed\u001b[39m\u001b[38;5;124m\"\u001b[39m: elapsed,\n\u001b[1;32m 102\u001b[0m }\n\u001b[1;32m 104\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 105\u001b[0m ret \u001b[38;5;241m=\u001b[39m \u001b[43mtarget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 106\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m exception \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 107\u001b[0m max_tries_exceeded \u001b[38;5;241m=\u001b[39m (tries \u001b[38;5;241m==\u001b[39m max_tries_value)\n", - "File \u001b[0;32m~/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:315\u001b[0m, in \u001b[0;36mretrieve_eod_ohlc\u001b[0;34m(symbol, end_date, exp, right, start_date, strike, print_url, rt, proxy, **kwargs)\u001b[0m\n\u001b[1;32m 313\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 314\u001b[0m response \u001b[38;5;241m=\u001b[39m requests\u001b[38;5;241m.\u001b[39mget(url, headers\u001b[38;5;241m=\u001b[39mheaders, params\u001b[38;5;241m=\u001b[39mquerystring)\n\u001b[0;32m--> 315\u001b[0m \u001b[43mraise_thetadata_exception\u001b[49m\u001b[43m(\u001b[49m\u001b[43mresponse\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mquerystring\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mproxy\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 316\u001b[0m \u001b[38;5;28mprint\u001b[39m(response\u001b[38;5;241m.\u001b[39murl) \u001b[38;5;28;01mif\u001b[39;00m print_url \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 319\u001b[0m end_timer \u001b[38;5;241m=\u001b[39m time\u001b[38;5;241m.\u001b[39mtime()\n", - "File \u001b[0;32m~/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaExceptions.py:77\u001b[0m, in \u001b[0;36mraise_thetadata_exception\u001b[0;34m(response, params, proxy)\u001b[0m\n\u001b[1;32m 75\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m ThetaDataPermission(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mPermission denied.\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 76\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m code \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m472\u001b[39m:\n\u001b[0;32m---> 77\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m ThetaDataNotFound(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mData not found for the given parameters: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mparams\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 78\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m code \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m473\u001b[39m:\n\u001b[1;32m 79\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m ThetaDataInvalidParameter(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mInvalid parameter provided: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mparams\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m, if error persists, update terminal.\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", - "\u001b[0;31mThetaDataNotFound\u001b[0m: Data not found for the given parameters: {'end_date': 20231231, 'root': 'SBUX', 'use_csv': 'true', 'exp': 20231229, 'right': 'C', 'start_date': 20230101, 'strike': 79000, 'url': 'http://127.0.0.1:25510/v2/hist/option/eod?end_date=20231231&root=SBUX&use_csv=true&exp=20231229&right=C&start_date=20230101&strike=79000'}" - ] - } - ], - "source": [ - "retrieve_eod_ohlc(\n", - " 'SBUX',\n", - " start_date='2023-01-01',\n", - " end_date='2023-12-31',\n", - " exp = '2023-12-29',\n", - " right = 'C',\n", - " strike=79.0\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{}\n" - ] - } - ], - "source": [ - "from pprint import pprint\n", - "pprint(get_cache('close'))" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " 1885461 function calls (1880572 primitive calls) in 24.433 seconds\n", - "\n", - " Ordered by: cumulative time\n", - "\n", - " ncalls tottime percall cumtime percall filename:lineno(function)\n", - " 1 0.000 0.000 24.433 24.433 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:329(get_order)\n", - " 5/3 0.000 0.000 21.695 7.232 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/decorators.py:10(wrapper)\n", - " 1 0.000 0.000 21.675 21.675 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:357(calculate_position_greeks)\n", - " 183 20.057 0.110 20.057 0.110 {method 'acquire' of '_thread.lock' objects}\n", - " 3 0.000 0.000 18.374 6.125 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/threads.py:4(runThreads)\n", - " 17 0.000 0.000 18.337 1.079 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1087(join)\n", - " 29 0.000 0.000 18.337 0.632 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1125(_wait_for_tstate_lock)\n", - " 3 0.000 0.000 18.334 6.111 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:646(__exit__)\n", - " 3 0.000 0.000 18.334 6.111 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:216(shutdown)\n", - " 2 0.000 0.000 3.303 1.651 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:720(generate_data)\n", - " 3 0.003 0.001 3.276 1.092 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_sync.py:85(retry)\n", - " 2 0.000 0.000 2.889 1.444 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:387(spot)\n", - " 2 0.001 0.000 2.864 1.432 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:142(retrieve_timeseries)\n", - " 2/1 0.000 0.000 2.749 2.749 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/decorators.py:40(wrapper)\n", - " 1 0.001 0.001 2.749 2.749 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:39(get_order)\n", - " 6705 0.100 0.000 2.502 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:673(to_datetime)\n", - " 1 0.000 0.000 2.502 2.502 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:576(populate_cache)\n", - " 1 0.001 0.001 2.502 2.502 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:438(populate_cache_v2)\n", - " 2 0.000 0.000 2.312 1.156 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/decorators.py:24(wrapper)\n", - " 6659 0.082 0.000 2.076 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:314(_convert_listlike_datetimes)\n", - " 1 0.000 0.000 1.869 1.869 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:686(one_off_save)\n", - " 1 0.000 0.000 1.869 1.869 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1219(bulk_one_off_save)\n", - " 1 0.000 0.000 1.869 1.869 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager_processes.py:238(schedule)\n", - " 1 0.000 0.000 1.869 1.869 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager.py:346(_schedule)\n", - " 1 0.026 0.026 1.868 1.868 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager.py:309(is_already_scheduled)\n", - " 1 0.000 0.000 1.842 1.842 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager.py:27(construct_current_scheduled_names)\n", - " 44 0.001 0.000 1.721 0.039 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:295(wait)\n", - " 3 0.000 0.000 1.708 0.569 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/utils/decorators.py:47(wrapper)\n", - " 3 0.000 0.000 1.708 0.569 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/utils/decorators.py:35(wrapper)\n", - " 3 0.000 0.000 1.691 0.564 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/validate_call_decorator.py:58(wrapper_function)\n", - " 3 0.000 0.000 1.691 0.564 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_validate_call.py:95(__call__)\n", - " 3 0.000 0.000 1.691 0.564 {method 'validate_python' of 'pydantic_core._pydantic_core.SchemaValidator' objects}\n", - " 3 0.000 0.000 1.691 0.564 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/container.py:23(_run)\n", - " 3 0.000 0.000 1.691 0.564 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/command_runner.py:503(sync_run)\n", - " 3 0.000 0.000 1.690 0.563 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/provider/utils/helpers.py:581(run_async)\n", - " 63 0.000 0.000 1.685 0.027 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:428(result)\n", - " 9 0.000 0.000 1.684 0.187 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/from_thread.py:275(call)\n", - " 2 0.000 0.000 1.503 0.751 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/obbject.py:85(to_df)\n", - " 2 0.000 0.000 1.503 0.751 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/obbject.py:125(to_dataframe)\n", - " 2 0.001 0.001 1.476 0.738 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/utils.py:20(basemodel_to_df)\n", - " 8 0.000 0.000 1.443 0.180 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:4789(apply)\n", - " 8 0.000 0.000 1.442 0.180 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1409(apply)\n", - " 8 0.000 0.000 1.442 0.180 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1482(apply_standard)\n", - " 8 0.000 0.000 1.431 0.179 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:891(_map_values)\n", - " 8 0.015 0.002 1.430 0.179 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:1667(map_array)\n", - " 2 0.000 0.000 1.318 0.659 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/equity_price.py:28(historical)\n", - " 1 0.002 0.002 1.060 1.060 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager.py:44()\n", - " 193 0.020 0.000 1.058 0.005 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/Requests.py:36(construct_request_name)\n", - " 6656 0.277 0.000 0.793 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:126(_guess_datetime_format_for_array)\n", - " 1 0.000 0.000 0.690 0.690 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager.py:36()\n", - " 192 0.000 0.000 0.690 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/json/__init__.py:299(loads)\n", - " 192 0.001 0.000 0.689 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/json/decoder.py:332(decode)\n", - " 192 0.682 0.004 0.688 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/json/decoder.py:343(raw_decode)\n", - " 6046 0.022 0.000 0.662 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:259(_box_as_indexlike)\n", - " 6051 0.039 0.000 0.643 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:320(__new__)\n", - " 6670 0.090 0.000 0.602 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:329(_from_sequence_not_strict)\n", - " 1 0.000 0.000 0.443 0.443 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1414(init_query)\n", - " 1 0.000 0.000 0.441 0.441 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/database/SQLHelpers.py:343(query_database)\n", - " 1 0.000 0.000 0.441 0.441 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/database/SQLHelpers.py:100(query_database)\n", - " 1 0.000 0.000 0.441 0.441 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:570(read_sql)\n", - " 1 0.000 0.000 0.409 0.409 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:330(div_yield_history)\n", - " 1 0.000 0.000 0.373 0.373 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/equity_fundamental.py:938(dividends)\n", - " 2 0.000 0.000 0.358 0.179 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1713(exec_driver_sql)\n", - " 2 0.000 0.000 0.358 0.179 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1791(_execute_context)\n", - "453216/452926 0.190 0.000 0.354 0.000 {built-in method builtins.isinstance}\n", - " 6670 0.083 0.000 0.308 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2184(_sequence_to_dt64)\n", - " 13326 0.053 0.000 0.297 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2428(maybe_convert_dtype)\n", - " 93138 0.109 0.000 0.277 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:173(search)\n", - " 610 0.020 0.000 0.267 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:456(_array_strptime_with_fallback)\n", - " 753 0.021 0.000 0.260 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:475(__new__)\n", - " 1 0.000 0.000 0.226 0.226 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:1779(read_query)\n", - " 7167 0.027 0.000 0.215 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5373(__getitem__)\n", - " 2 0.000 0.000 0.215 0.107 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1850(_exec_single_context)\n", - " 2 0.000 0.000 0.214 0.107 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:940(do_execute)\n", - " 2 0.000 0.000 0.214 0.107 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:311(execute)\n", - " 2 0.000 0.000 0.213 0.107 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/opentelemetry/context_propagation.py:93(wrapper)\n", - " 2 0.000 0.000 0.213 0.106 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:690(cmd_query)\n", - " 2 0.213 0.106 0.213 0.106 {method 'query' of '_mysql_connector.MySQL' objects}\n", - " 1162 0.017 0.000 0.212 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:517(sanitize_array)\n", - " 660 0.021 0.000 0.211 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:666(_parse)\n", - " 1 0.000 0.000 0.203 0.203 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:1655(execute)\n", - " 6726 0.023 0.000 0.183 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:373(__getitem__)\n", - " 1 0.000 0.000 0.160 0.160 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:793(produce_order_candidates)\n", - " 2 0.001 0.000 0.160 0.080 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:657(chain_details)\n", - " 785 0.004 0.000 0.158 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:769(_try_cast)\n", - " 6728 0.025 0.000 0.158 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:278(__getitem__)\n", - " 1 0.000 0.000 0.155 0.155 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:2037(has_table)\n", - " 1 0.000 0.000 0.155 0.155 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:400(has_table)\n", - " 1 0.000 0.000 0.155 0.155 :1(has_table)\n", - " 1 0.000 0.000 0.155 0.155 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:78(cache)\n", - " 1 0.000 0.000 0.155 0.155 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/base.py:2732(has_table)\n", - " 610 0.009 0.000 0.153 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1200(maybe_cast_to_datetime)\n", - " 13343 0.044 0.000 0.144 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1163(is_float_dtype)\n", - " 2 0.000 0.000 0.143 0.072 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1523(_init_statement)\n", - " 2 0.000 0.000 0.143 0.072 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1736(create_cursor)\n", - " 2 0.000 0.000 0.143 0.072 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1757(create_default_cursor)\n", - " 2 0.000 0.000 0.143 0.072 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1483(cursor)\n", - " 2 0.000 0.000 0.143 0.072 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:733(cursor)\n", - " 2 0.000 0.000 0.143 0.072 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:387(is_connected)\n", - " 96325 0.106 0.000 0.143 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:272(_compile)\n", - " 2 0.143 0.071 0.143 0.071 {method 'ping' of '_mysql_connector.MySQL' objects}\n", - " 6659 0.072 0.000 0.132 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:545(_box_func)\n", - " 60165 0.050 0.000 0.113 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/generic.py:42(_instancecheck)\n", - " 6670 0.035 0.000 0.112 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2425(ensure_arraylike_for_datetimelike)\n", - " 660 0.014 0.000 0.106 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:199(split)\n", - " 619 0.002 0.000 0.102 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:325(_from_sequence)\n", - " 303 0.003 0.000 0.101 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4062(__getitem__)\n", - " 6051 0.091 0.000 0.099 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2354(objects_to_datetime64)\n", - " 13671 0.037 0.000 0.095 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1198(is_bool_dtype)\n", - " 20046 0.031 0.000 0.089 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1375(_is_dtype)\n", - " 7494 0.008 0.000 0.086 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:189(__next__)\n", - " 7494 0.050 0.000 0.078 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:77(get_token)\n", - " 10 0.002 0.000 0.071 0.007 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:837(change_to_last_busday)\n", - " 60165 0.048 0.000 0.063 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/generic.py:37(_check)\n", - " 27 0.001 0.000 0.061 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:694(__init__)\n", - " 1 0.000 0.000 0.060 0.060 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:1643(__exit__)\n", - " 1 0.000 0.000 0.060 0.060 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:607(close)\n", - " 1 0.000 0.000 0.060 0.060 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:558(__exit__)\n", - " 1 0.000 0.000 0.060 0.060 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:234(__exit__)\n", - " 1 0.000 0.000 0.060 0.060 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1218(close)\n", - " 1 0.045 0.045 0.060 0.060 {method 'readlines' of '_io._IOBase' objects}\n", - " 1 0.000 0.000 0.060 0.060 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2576(close)\n", - " 1 0.000 0.000 0.060 0.060 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2725(_do_close)\n", - " 1 0.000 0.000 0.060 0.060 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2709(_close_impl)\n", - " 1 0.000 0.000 0.060 0.060 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2703(_connection_rollback_impl)\n", - " 1 0.000 0.000 0.060 0.060 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1113(_rollback_impl)\n", - " 1 0.000 0.000 0.060 0.060 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:698(do_rollback)\n", - " 1 0.000 0.000 0.060 0.060 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:578(rollback)\n", - " 1 0.060 0.060 0.060 0.060 {method 'rollback' of '_mysql_connector.MySQL' objects}\n", - " 7283 0.045 0.000 0.057 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:649(_simple_new)\n", - " 1239 0.019 0.000 0.056 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:875(_parse_numeric_token)\n", - " 150 0.002 0.000 0.056 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4130(_getitem_bool_array)\n", - " 6669 0.012 0.000 0.056 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:536(is_string_dtype)\n", - " 2 0.009 0.004 0.054 0.027 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/utils.py:30()\n", - " 74/49 0.001 0.000 0.052 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4271(__setitem__)\n", - " 72 0.001 0.000 0.050 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4514(_set_item)\n", - " 6914 0.015 0.000 0.049 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7688(maybe_extract_name)\n", - " 6846 0.047 0.000 0.047 0.000 {built-in method numpy.array}\n", - " 13904 0.025 0.000 0.046 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1434(_is_dtype_type)\n", - " 6039 0.007 0.000 0.046 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/main.py:352(model_dump)\n", - " 6682 0.041 0.000 0.045 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:304(_simple_new)\n", - " 93148 0.045 0.000 0.045 0.000 {method 'search' of 're.Pattern' objects}\n", - " 449/444 0.003 0.000 0.044 0.000 {built-in method builtins.all}\n", - " 7 0.000 0.000 0.043 0.006 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:84(__init__)\n", - " 1 0.000 0.000 0.043 0.043 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:622(pre_process_data)\n", - " 2 0.000 0.000 0.043 0.022 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:10170(apply)\n", - " 610 0.010 0.000 0.043 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1240(_ensure_nanosecond_dtype)\n", - " 2 0.000 0.000 0.043 0.022 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:864(apply)\n", - " 2 0.000 0.000 0.043 0.022 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1061(apply_standard)\n", - " 33401 0.020 0.000 0.043 0.000 :117(__instancecheck__)\n", - " 152 0.000 0.000 0.043 0.000 {built-in method builtins.next}\n", - " 2 0.000 0.000 0.042 0.021 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1070(apply_series_generator)\n", - " 23 0.000 0.000 0.041 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:129()\n", - " 23 0.002 0.000 0.041 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:848(liquidity_check)\n", - " 77 0.000 0.000 0.040 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:132(__enter__)\n", - " 6 0.000 0.000 0.040 0.007 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/utils.py:18(__init__)\n", - " 23 0.001 0.000 0.039 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:738()\n", - " 72 0.001 0.000 0.039 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4481(_set_item_mgr)\n", - " 6039 0.038 0.000 0.039 0.000 {method 'to_python' of 'pydantic_core._pydantic_core.SchemaSerializer' objects}\n", - " 3 0.000 0.000 0.038 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:583(map)\n", - " 3 0.000 0.000 0.038 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:608()\n", - " 48 0.000 0.000 0.038 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:161(submit)\n", - " 48 0.000 0.000 0.037 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:180(_adjust_thread_count)\n", - " 66 0.002 0.000 0.037 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1347(insert)\n", - " 19 0.000 0.000 0.037 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:611(wait)\n", - " 46 0.002 0.000 0.036 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:794(generate_option_tick_new)\n", - " 17 0.000 0.000 0.036 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:945(start)\n", - " 105/94 0.003 0.000 0.036 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:389(__init__)\n", - " 1416 0.012 0.000 0.036 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:346(_name_get)\n", - " 33717 0.024 0.000 0.036 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1399(_get_dtype)\n", - " 132/95 0.001 0.000 0.035 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/common.py:62(new_method)\n", - " 6696 0.035 0.000 0.035 0.000 {method 'view' of 'numpy.generic' objects}\n", - " 4 0.000 0.000 0.035 0.009 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Context.py:16(Context)\n", - " 2 0.000 0.000 0.032 0.016 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/utils.py:47(bus_range)\n", - " 1 0.003 0.003 0.031 0.031 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager.py:34()\n", - " 307 0.005 0.000 0.030 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:317(apply)\n", - "102198/102185 0.029 0.000 0.030 0.000 {built-in method builtins.getattr}\n", - " 3 0.000 0.000 0.029 0.010 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1780(apply)\n", - " 1 0.000 0.000 0.029 0.029 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:227(update_cache_with_missing_ticks)\n", - " 11 0.001 0.000 0.029 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:423(dict_to_mgr)\n", - " 197 0.028 0.000 0.028 0.000 {method 'strip' of 'str' objects}\n", - " 12 0.000 0.000 0.025 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:139()\n", - " 6669 0.019 0.000 0.025 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:572(condition)\n", - " 12 0.001 0.000 0.025 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:753(available_close_check)\n", - " 2 0.000 0.000 0.025 0.012 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:715(__init__)\n", - " 12 0.000 0.000 0.024 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:1022(bdate_range)\n", - " 12 0.000 0.000 0.024 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:821(date_range)\n", - " 121 0.001 0.000 0.024 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6662(copy)\n", - " 3 0.000 0.000 0.024 0.008 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1850(_python_apply_general)\n", - " 12 0.002 0.000 0.024 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:397(_generate_range)\n", - " 5 0.000 0.000 0.024 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:506(nested_data_to_arrays)\n", - " 52 0.001 0.000 0.024 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4142(_take_with_is_copy)\n", - " 288 0.002 0.000 0.024 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4626(_get_item_cache)\n", - " 5 0.000 0.000 0.024 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:793(to_arrays)\n", - " 66 0.002 0.000 0.024 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6956(insert)\n", - " 3 0.000 0.000 0.023 0.008 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/generic.py:1558(_wrap_applied_output)\n", - " 2 0.000 0.000 0.023 0.011 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/obbject.py:167(is_list_of_basemodel)\n", - " 33401 0.022 0.000 0.022 0.000 {built-in method _abc._abc_instancecheck}\n", - " 1 0.000 0.000 0.022 0.022 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:194(_wrap_result)\n", - " 57 0.001 0.000 0.022 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:869(take)\n", - " 87 0.001 0.000 0.022 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1176(__getitem__)\n", - " 53 0.001 0.000 0.022 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4027(take)\n", - " 257 0.002 0.000 0.022 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:3983(_ixs)\n", - " 135 0.001 0.000 0.021 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:557(copy)\n", - " 6041 0.003 0.000 0.021 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/obbject.py:168()\n", - " 10 0.000 0.000 0.020 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:826(is_USholiday)\n", - " 357 0.001 0.000 0.019 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6284(__getattr__)\n", - " 12 0.001 0.000 0.019 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:468()\n", - " 68 0.001 0.000 0.019 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:623(reindex_indexer)\n", - " 6813 0.013 0.000 0.019 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:576(tz)\n", - " 36/9 0.001 0.000 0.019 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6463(astype)\n", - " 895 0.018 0.000 0.018 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2712(_generate_range)\n", - " 7471 0.017 0.000 0.018 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:645(__iter__)\n", - " 1350 0.003 0.000 0.018 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_strptime.py:26(_getlang)\n", - " 3 0.000 0.000 0.018 0.006 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:313(__init__)\n", - " 4 0.006 0.001 0.018 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:891(_list_of_dict_to_arrays)\n", - " 3 0.000 0.000 0.017 0.006 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/validate_call_decorator.py:28(validate_call)\n", - " 3 0.000 0.000 0.017 0.006 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/validate_call_decorator.py:51(validate)\n", - " 3 0.000 0.000 0.017 0.006 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_validate_call.py:26(__init__)\n", - " 2 0.000 0.000 0.017 0.008 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6731(drop_duplicates)\n", - " 6041 0.009 0.000 0.016 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/utils.py:48()\n", - " 1284 0.002 0.000 0.016 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:163(match)\n", - " 81 0.002 0.000 0.016 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:674(_with_infer)\n", - " 1 0.000 0.000 0.016 0.016 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:333(update_spot_cache)\n", - " 3586 0.005 0.000 0.015 0.000 :319(decode)\n", - " 1 0.000 0.000 0.015 0.015 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:160(_convert_arrays_to_dataframe)\n", - " 1350 0.003 0.000 0.015 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/locale.py:594(getlocale)\n", - " 1 0.000 0.000 0.015 0.015 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:426(__init__)\n", - " 1 0.001 0.001 0.015 0.015 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:306(drop_cache_duplicates)\n", - " 2 0.000 0.000 0.015 0.007 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:78(method)\n", - " 2 0.000 0.000 0.015 0.007 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:736(map)\n", - " 158 0.010 0.000 0.015 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1157(maybe_infer_to_datetimelike)\n", - " 6041 0.007 0.000 0.015 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_model_construction.py:268(__instancecheck__)\n", - " 1416 0.004 0.000 0.015 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:330(_name_includes_bit_suffix)\n", - " 1872 0.011 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:428(append)\n", - "7433/7415 0.008 0.000 0.014 0.000 {built-in method numpy.asarray}\n", - " 1 0.000 0.000 0.014 0.014 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:9492(pivot_table)\n", - " 1 0.000 0.000 0.014 0.014 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/pivot.py:61(pivot_table)\n", - " 1 0.000 0.000 0.014 0.014 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/pivot.py:118(__internal_pivot_table)\n", - " 32 0.000 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6110(_cmp_method)\n", - " 8075 0.012 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:416(extract_array)\n", - " 2 0.000 0.000 0.014 0.007 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4320(_setitem_array)\n", - " 85 0.000 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1719(_getitem_axis)\n", - " 13831 0.010 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:123()\n", - " 237 0.001 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1287(take_nd)\n", - " 27/3 0.000 0.000 0.013 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:620(generate_schema)\n", - " 2 0.000 0.000 0.013 0.007 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:10803(where)\n", - " 298/290 0.001 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:59(take_nd)\n", - " 2 0.000 0.000 0.013 0.007 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:10615(_where)\n", - " 151 0.000 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1496(items)\n", - " 152 0.001 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2632(check_bool_indexer)\n", - " 42/3 0.000 0.000 0.013 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:906(_generate_schema_inner)\n", - " 42/3 0.001 0.000 0.013 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:931(match_type)\n", - " 49 0.001 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6201(_construct_result)\n", - " 3 0.000 0.000 0.013 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1871(_callable_schema)\n", - " 6670 0.013 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2310(_construct_from_dt64_naive)\n", - "21528/18897 0.009 0.000 0.012 0.000 {built-in method builtins.len}\n", - " 78 0.000 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1756(_get_slice_axis)\n", - " 387 0.001 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7593(ensure_index)\n", - " 2 0.000 0.000 0.012 0.006 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6828(duplicated)\n", - " 36940 0.011 0.000 0.012 0.000 {built-in method builtins.hasattr}\n", - " 5 0.000 0.000 0.012 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:209(_maybe_cache)\n", - " 1538 0.007 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6301(__setattr__)\n", - " 615 0.002 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:208(findall)\n", - " 14800 0.009 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:208(isnum)\n", - " 13329 0.009 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1194()\n", - " 6682 0.011 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:103(tz_to_dtype)\n", - " 50 0.001 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:687()\n", - " 1288 0.001 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:225(compile)\n", - " 77 0.002 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4361(_slice)\n", - " 48 0.003 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:708(_slice_take_blocks_ax0)\n", - " 15 0.000 0.000 0.011 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1574(_generate_parameter_schema)\n", - " 308 0.002 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:419(check_array_indexer)\n", - " 7526 0.008 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:334(is_hashable)\n", - " 1238 0.005 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1006(_find_hms_idx)\n", - " 288 0.005 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:120(_take_nd_ndarray)\n", - " 16 0.000 0.000 0.011 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:96(arrays_to_mgr)\n", - " 2 0.002 0.001 0.010 0.005 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/utils.py:54()\n", - " 1304 0.005 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numerictypes.py:357(issubdtype)\n", - " 13831 0.010 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:121(classes)\n", - " 5 0.001 0.000 0.010 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:149(should_cache)\n", - " 3586 0.010 0.000 0.010 0.000 {built-in method _codecs.utf_8_decode}\n", - " 7 0.000 0.000 0.010 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:157(concat)\n", - " 34026 0.010 0.000 0.010 0.000 {built-in method builtins.issubclass}\n", - " 966 0.010 0.000 0.010 0.000 {cyfunction Timestamp.strftime at 0x10d6c2c20}\n", - " 251 0.001 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4608(_box_col_values)\n", - " 6670 0.007 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2514(_validate_dt64_dtype)\n", - " 130 0.001 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1782(_consolidate_inplace)\n", - " 1350 0.003 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/locale.py:479(_parse_localename)\n", - " 2 0.000 0.000 0.009 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:196(where)\n", - " 31 0.001 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3820(get_indexer)\n", - " 114 0.001 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2529(__setitem__)\n", - " 9171 0.009 0.000 0.009 0.000 {built-in method numpy.datetime_data}\n", - " 298 0.003 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/ipkernel.py:775(_clean_thread_parent_frames)\n", - " 7 0.000 0.000 0.009 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:622(get_result)\n", - " 677 0.006 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6236(__finalize__)\n", - " 130 0.001 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5437(_can_hold_identifiers_and_holds_name)\n", - " 4 0.000 0.000 0.008 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6239(reset_index)\n", - " 5 0.000 0.000 0.008 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6997(sort_values)\n", - " 6332 0.007 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:915()\n", - " 81 0.001 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5242(_sanitize_column)\n", - " 660 0.005 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:221(__init__)\n", - " 15 0.000 0.000 0.008 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2066(_apply_annotations)\n", - " 1566 0.004 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1596(pandas_dtype)\n", - " 6 0.000 0.000 0.008 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4796(_drop_axis)\n", - " 75/39 0.000 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:50(__le__)\n", - " 14 0.000 0.000 0.008 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:38(__eq__)\n", - " 1806 0.008 0.000 0.008 0.000 {method 'match' of 're.Pattern' objects}\n", - " 695 0.004 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5323(__contains__)\n", - " 648 0.006 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:474(resolve_ymd)\n", - " 6667 0.008 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2148(_creso)\n", - " 13 0.000 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1610(_log)\n", - " 15 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_schema_generation_shared.py:82(__call__)\n", - " 11 0.000 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:607(_init_dict)\n", - " 21 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1689(_getitem_tuple)\n", - " 114 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1422(_set_value)\n", - " 15 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2085(inner_handler)\n", - " 1 0.000 0.000 0.007 0.007 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:139(_parse_date_columns)\n", - " 114 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1415(_set_values)\n", - " 1 0.000 0.000 0.007 0.007 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:277(organize_data_for_query)\n", - " 7 0.000 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6186(_get_indexer_strict)\n", - " 64 0.001 0.000 0.007 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:760(parse_option_tick)\n", - " 66 0.002 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5368(insert)\n", - " 4 0.000 0.000 0.007 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6538(dropna)\n", - " 9 0.000 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:674(astype)\n", - " 37 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7164(_cmp_method)\n", - " 7160 0.007 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:152(cast_scalar_indexer)\n", - " 686 0.007 0.000 0.007 0.000 {method 'reduce' of 'numpy.ufunc' objects}\n", - " 6696 0.007 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:529(is_string_or_object_np_dtype)\n", - " 175 0.003 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:842(_engine)\n", - " 1350 0.005 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/locale.py:396(normalize)\n", - " 39 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:610(factorize)\n", - " 5 0.006 0.001 0.006 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:447(astype)\n", - " 7327 0.006 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:831(_reset_identity)\n", - " 615 0.006 0.000 0.006 0.000 {method 'findall' of 're.Pattern' objects}\n", - " 6670 0.006 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2063(_maybe_pin_freq)\n", - " 752 0.004 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:609(_dtype_to_subclass)\n", - " 5 0.000 0.000 0.006 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5993(set_index)\n", - " 13 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1636(handle)\n", - " 6 0.000 0.000 0.006 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/from_thread.py:455(start_blocking_portal)\n", - " 6984 0.004 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:203(isword)\n", - " 13 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1690(callHandlers)\n", - " 1854 0.005 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1141(_to_decimal)\n", - " 13340 0.005 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2570(_validate_tz_from_dtype)\n", - " 12 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2259(_consolidate)\n", - " 5 0.000 0.000 0.006 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:928(_finalize_columns_and_data)\n", - " 15 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:965(handle)\n", - " 6 0.000 0.000 0.006 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:1006(convert_object_array)\n", - " 130 0.001 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_strptime.py:564(_strptime_datetime)\n", - " 16 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:1371(_arith_method)\n", - " 6 0.000 0.000 0.006 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:1070()\n", - " 46 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:387(apply)\n", - " 29 0.005 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:1028(convert)\n", - " 75/39 0.001 0.000 0.006 0.000 {built-in method _operator.le}\n", - " 9 0.000 0.000 0.006 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5095(insert)\n", - " 13 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6162(get_indexer_for)\n", - " 15 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1098(emit)\n", - " 660 0.005 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:62(__init__)\n", - " 593 0.001 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:339(_from_mgr)\n", - " 12 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4323(reindex)\n", - " 10 0.000 0.000 0.006 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5343(reindex)\n", - " 1224 0.003 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:178(_datetime_metadata_str)\n", - " 7948 0.005 0.000 0.005 0.000 {built-in method __new__ of type object at 0x101d2a898}\n", - " 37 0.002 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:977(_cmp_method)\n", - " 251 0.004 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1012(iget)\n", - " 2608 0.004 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numerictypes.py:283(issubclass_)\n", - " 18 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1004(_getitem_tuple_same_dim)\n", - " 130 0.003 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_strptime.py:309(_strptime)\n", - " 1829 0.005 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:336(hms)\n", - " 10 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:822(is_busday)\n", - " 16 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:596(_homogenize)\n", - " 28 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6925(f)\n", - " 50 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:288(comparison_op)\n", - " 14 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:42(__ne__)\n", - " 725 0.004 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:278(__init__)\n", - " 1 0.001 0.001 0.005 0.005 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:524()\n", - " 269/263 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:101(isna)\n", - " 12 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1322(__contains__)\n", - " 890 0.005 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1331(is_ea_or_datetimelike_dtype)\n", - " 12 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6133(_arith_method)\n", - " 39 0.002 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:548(factorize_array)\n", - " 12 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2982(get_loc)\n", - " 114 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:586()\n", - " 6039 0.005 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/utils.py:49()\n", - " 5 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5614(_reindex_axes)\n", - " 12 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:3308(_get_level_indexer)\n", - " 35 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:127(get_option_specifics_from_key)\n", - " 257 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:678(_constructor_sliced_from_mgr)\n", - " 216 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:97(is_bool_indexer)\n", - " 15 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1087(flush)\n", - " 114 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:372(setitem)\n", - " 18 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:582(get_loc)\n", - " 30 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:124(maybe_convert_platform)\n", - " 1245 0.003 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2537(dtype_to_unit)\n", - " 269/263 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:184(_isna)\n", - " 228 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:583(copy_func)\n", - " 288 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:564(_take_preprocess_indexer_and_fill_value)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/generic.py:1420(aggregate)\n", - " 36 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:421(astype)\n", - " 16 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2121(create_block_manager_from_column_arrays)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:172(agg)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:558(apply_str)\n", - " 2 0.000 0.000 0.004 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:226(__get_underlier_data)\n", - " 2 0.000 0.000 0.004 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1397(_getitem_axis)\n", - " 160 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:145(_get_option)\n", - " 12 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2957(_get_loc_single_level_index)\n", - " 4 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:214(_obj_with_exclusions)\n", - " 2 0.000 0.000 0.004 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1205(_getbool_axis)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:681(_apply_str)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:2365(mean)\n", - " 30 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6957()\n", - " 64 0.000 0.000 0.004 0.000 {built-in method strptime}\n", - " 9309 0.004 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:551(dtype)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1957(_cython_agg_general)\n", - " 485 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:137(is_object_dtype)\n", - " 2 0.000 0.000 0.004 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5433(drop)\n", - " 626 0.002 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2152(unit)\n", - " 2 0.000 0.000 0.004 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4757(drop)\n", - " 79 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5425(_getitem_slice)\n", - " 4 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:11603(any)\n", - " 145 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:807(_set_axis)\n", - " 5 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:7918(_dispatch_frame_op)\n", - " 12 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:558(_parse_with_reso)\n", - " 12 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:275(_parse_with_reso)\n", - " 4 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12169(_logical_func)\n", - " 2 0.000 0.000 0.004 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1508(error)\n", - " 51 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6418(_reduce)\n", - " 117 0.002 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:231(asarray_tuplesafe)\n", - " 29 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:12675(_reindex_for_setitem)\n", - " 5/4 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:11435(_reduce)\n", - " 55 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:800(_generate_schema_from_property)\n", - " 14653 0.004 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:2287(cast)\n", - " 66 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:262(_get_hashtable_algo)\n", - " 453 0.002 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:790(copy)\n", - " 995 0.002 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:696(_sanitize_ndim)\n", - " 295 0.002 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:274(full)\n", - " 13 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/handlers.py:65(emit)\n", - " 424 0.002 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3777(get_loc)\n", - " 660 0.004 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:395(__init__)\n", - " 13/11 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1040(_match_generic_type)\n", - " 35 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6519(sum)\n", - " 13 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1216(emit)\n", - " 35 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12498(sum)\n", - " 6 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7031(drop)\n", - " 290 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:659(_constructor_from_mgr)\n", - " 3 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:7903(_arith_method)\n", - " 66 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1393(moveaxis)\n", - " 2531 0.003 0.000 0.003 0.000 {method 'format' of 'str' objects}\n", - " 10 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1479(info)\n", - " 6 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:371(__init__)\n", - " 77 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:141(__exit__)\n", - " 52 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:723(astype)\n", - " 1326 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:481(ensure_wrapped_if_datetimelike)\n", - " 315 0.000 0.000 0.003 0.000 {method 'any' of 'numpy.ndarray' objects}\n", - " 35 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12459(_min_count_stat_function)\n", - " 7 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:5136(reindex)\n", - " 12559 0.003 0.000 0.003 0.000 {method 'read' of '_io.StringIO' objects}\n", - " 1291 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:193(__get__)\n", - " 7524 0.003 0.000 0.003 0.000 {method 'append' of 'list' objects}\n", - "8265/8251 0.003 0.000 0.003 0.000 {built-in method builtins.hash}\n", - " 314 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:773(_view)\n", - " 91 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1863(from_array)\n", - " 17295 0.003 0.000 0.003 0.000 {method 'isdigit' of 'str' objects}\n", - " 27 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:2344(unique)\n", - " 97 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1095(__getitem__)\n", - " 2 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:301(lexsort_indexer)\n", - " 16 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2190(_form_blocks)\n", - " 149 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/ipkernel.py:790()\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1450(grouped_reduce)\n", - " 170 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:127(_get_single_key)\n", - " 88 0.001 0.000 0.003 0.000 {built-in method builtins.sorted}\n", - " 30 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1580(construct_1d_object_array_from_listlike)\n", - " 3 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:589(clean_schema)\n", - " 65 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1412(_insert_update_blklocs_and_blknos)\n", - " 318 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2645(maybe_coerce_values)\n", - " 6 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4477(__delitem__)\n", - " 54 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:655(write)\n", - " 288 0.001 0.000 0.003 0.000 {built-in method builtins.any}\n", - " 317 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:55(_any)\n", - " 27 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:1019(unique)\n", - " 35 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2276(_merge_blocks)\n", - " 11 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1369(_union_schema)\n", - " 26 0.000 0.000 0.003 0.000 {built-in method builtins.print}\n", - " 8338 0.003 0.000 0.003 0.000 {built-in method builtins.setattr}\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1971(array_func)\n", - " 129 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2703(new_block_2d)\n", - " 3111 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:213(isspace)\n", - " 130 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1764(is_consolidated)\n", - " 3 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:192(__sub__)\n", - " 221 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1010(view)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:467(calculate_quantity)\n", - " 119 0.000 0.000 0.003 0.000 {built-in method builtins.sum}\n", - " 85 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2313(is_unique)\n", - " 7 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:699(new_axes)\n", - " 116 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1495(_maybe_update_cacher)\n", - " 752 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:591(_ensure_array)\n", - " 7 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:702()\n", - " 27 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:307(unique)\n", - " 6 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1434(idelete)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4360(_iset_not_inplace)\n", - " 236 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:551(maybe_promote)\n", - " 1226 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:329(month)\n", - " 130 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1772(_consolidate_check)\n", - " 72 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:131(filterwarnings)\n", - " 648 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:380(validate)\n", - " 13 0.003 0.000 0.003 0.000 {method 'flush' of '_io.TextIOWrapper' objects}\n", - " 4 0.003 0.001 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:922()\n", - " 27 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:427(unique_with_mask)\n", - " 36 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:823(take)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:442(update_greek_limits)\n", - " 155 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5170(_get_engine_target)\n", - " 608 0.002 0.000 0.002 0.000 {method 'copy' of 'numpy.ndarray' objects}\n", - " 149 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1501(enumerate)\n", - " 1226 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:319(jump)\n", - " 18 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:402(walk_core_schema)\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5359(reindex)\n", - " 881 0.002 0.000 0.002 0.000 {built-in method numpy.empty}\n", - " 25 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1247(series_generator)\n", - " 3143 0.002 0.000 0.002 0.000 {method 'pop' of 'list' objects}\n", - " 360/18 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:196(walk)\n", - " 1350 0.002 0.000 0.002 0.000 {built-in method _locale.setlocale}\n", - " 75/73 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:1131(take)\n", - " 27 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6679(_maybe_cast_listlike_indexer)\n", - " 668 0.002 0.000 0.002 0.000 :1207(_handle_fromlist)\n", - " 110 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2520(get_schema_or_ref)\n", - " 35 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:76(_f)\n", - " 17 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:325(__new__)\n", - " 360/18 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:199(_walk)\n", - " 195 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:82(shape)\n", - " 18 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:392(handle_call_schema)\n", - " 4/3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:58(__ge__)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:7885(replace)\n", - " 57 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1146(take)\n", - " 157 0.000 0.000 0.002 0.000 {method 'all' of 'numpy.ndarray' objects}\n", - " 315/35 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:128(deepcopy)\n", - " 63 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:239(maybe_convert_indices)\n", - " 238 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1220(_get_value)\n", - " 18 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:379(handle_arguments_schema)\n", - " 130 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5562(append)\n", - " 251 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1471(_set_as_cached)\n", - " 154 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2264()\n", - " 64 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:189(_na_arithmetic_op)\n", - " 487 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2765(check_dict_or_set_indexers)\n", - " 9 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/from_thread.py:308(start_task_soon)\n", - " 154 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:784(name)\n", - " 39 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:389(new_func)\n", - " 720 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2795(extend_blocks)\n", - " 31 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6394(_should_compare)\n", - " 3912 0.002 0.000 0.002 0.000 {method 'get' of 'dict' objects}\n", - " 114 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1373(setitem)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:7894(_cmp_method)\n", - " 55 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:77(get_type_ref)\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:743(group_info)\n", - " 7 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:717(_get_concat_axis)\n", - " 1812 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:909(__len__)\n", - " 31 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3955(_get_indexer)\n", - " 111 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3122(duplicated)\n", - " 8 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:5773(isna)\n", - " 615 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1099(_parse_min_sec)\n", - " 65 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1402(_insert_update_mgr_locs)\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:758(_get_compressed_codes)\n", - " 563 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:831(_values)\n", - " 8 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:8693(isna)\n", - " 157 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:61(_all)\n", - " 66 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:106(_ensure_data)\n", - " 6 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/_backends/_asyncio.py:980(_spawn_task_from_thread)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:592(flush)\n", - " 77 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:225(_consolidate_key)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:407(__rsub__)\n", - " 6941 0.002 0.000 0.002 0.000 {method 'lower' of 'str' objects}\n", - " 1742 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/__init__.py:34(using_copy_on_write)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:293()\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:798(tolist)\n", - " 167 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1519(construct_1d_arraylike_from_scalar)\n", - " 141 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2518(__getitem__)\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:208(__truediv__)\n", - " 10 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:259(schedule)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:404(__radd__)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/base.py:2058(tolist)\n", - " 55 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:141(equals)\n", - " 6 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/_backends/_asyncio.py:2483(run_sync_from_thread)\n", - " 2 0.002 0.001 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:317(__add__)\n", - " 46 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:157(take)\n", - " 54 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:577(_schedule_flush)\n", - " 35 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:227(_deepcopy_dict)\n", - " 52 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/astype.py:191(astype_array_safe)\n", - " 122 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1778()\n", - " 5 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7553(ensure_index_from_sequences)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/helpers.py:8(parse_signal_id)\n", - " 6984 0.002 0.000 0.002 0.000 {method 'isalpha' of 'str' objects}\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:9863(unstack)\n", - " 83 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:511(_validate_dtype)\n", - " 172 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1571(validate_all_hashable)\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:200(__mul__)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:489(unstack)\n", - " 17 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1066(iset)\n", - " 208 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2716(new_block)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:525(_unstack_frame)\n", - " 145 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:236(set_axis)\n", - " 10 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/zmq/sugar/socket.py:621(send)\n", - " 66 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:280(_check_object_for_strings)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:812(_cython_operation)\n", - " 5 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:68(__and__)\n", - " 7 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6432(dtypes)\n", - " 5 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6123(_logical_method)\n", - " 603 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:322(weekday)\n", - " 8 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1316(view)\n", - " 129 0.000 0.000 0.002 0.000 {method 'max' of 'numpy.ndarray' objects}\n", - " 8 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1248(copy)\n", - " 9 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5663(_reindex_with_indexers)\n", - " 34 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:240(arithmetic_op)\n", - " 129 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:182(_add_filter)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:7282(sort_index)\n", - " 35 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:455(newfunc)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5290(sort_index)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:94(concatenate_managers)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:9041(groupby)\n", - " 170 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:676(_translate_key)\n", - " 15 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4470(_iset_item_mgr)\n", - " 700 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:372(apply_if_callable)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:188(__radd__)\n", - " 111 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:274(make_block)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:380(notna)\n", - " 64 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/computation/expressions.py:226(evaluate)\n", - " 37 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:524(_validate_comparison_value)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:419(simplify_schema_references)\n", - " 8 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4883(_update_inplace)\n", - " 579 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:84()\n", - " 24 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:220(__init__)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1296(__init__)\n", - " 170 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:635(_get_root)\n", - " 10 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:153(_set_option)\n", - " 648 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:482()\n", - " 129 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:39(_amax)\n", - " 437 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:180(blknos)\n", - " 24 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:373(_finalize)\n", - " 111 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2811(ensure_block_shape)\n", - " 35 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:604(nansum)\n", - " 233 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:568(require_length_match)\n", - " 139 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:273(is_dict_like)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2236(_tuples_to_blocks_no_consolidate)\n", - " 7037 0.001 0.000 0.001 0.000 {method 'keys' of 'dict' objects}\n", - " 171 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4402(_check_setitem_copy)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2235(take)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2238()\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:485(__exit__)\n", - " 7 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1870(_get_label_or_level_values)\n", - " 12 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:550(validate_categories)\n", - " 172 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:830(__len__)\n", - " 242 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:467(__enter__)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1633(as_array)\n", - " 64 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/computation/expressions.py:67(_evaluate_standard)\n", - " 264/120 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:206(_handle_other_schemas)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:122(get_group_index)\n", - " 63 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/base.py:549(find)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:12590(values)\n", - " 132 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1330(normalize_axis_tuple)\n", - " 1345 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1168(ident)\n", - " 17 0.001 0.000 0.001 0.000 {built-in method _thread.start_new_thread}\n", - " 1416 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:24(_kind_name)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:846(get_grouper)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1102(wrap_results)\n", - " 112 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2776(_is_multi)\n", - " 145 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:86(_validate_set_axis)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1507(operate_blockwise)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1915(_agg_py_fallback)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/ops.py:57(operate_blockwise)\n", - " 563 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2004(internal_values)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1707(_interleave)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7227(_arith_method)\n", - " 46 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:664(_constructor_from_mgr)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:7142(fillna)\n", - " 356 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2674(get_block_type)\n", - " 45 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:273(__call__)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:735(has_dropped_na)\n", - " 1 0.001 0.001 0.001 0.001 {built-in method io.open}\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:777(_concat_indexes)\n", - " 200 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:253(fill_value)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:897(apply_groupwise)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5455(append)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:59(get_indexer_indexer)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/generic.py:2002(_get_data_to_aggregate)\n", - " 603 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:342(ampm)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1483(reduce)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:240(__pow__)\n", - " 7 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:405(__init__)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5491(_concat)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:622(_get_splitter)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:860(values)\n", - " 70 0.001 0.000 0.001 0.000 {method 'transpose' of 'numpy.ndarray' objects}\n", - " 44 0.000 0.000 0.001 0.000 {method 'sum' of 'numpy.ndarray' objects}\n", - " 37 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2744(inferred_type)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:180(fillna)\n", - " 725 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/flags.py:51(__init__)\n", - " 103 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:390(_get_getitem_freq)\n", - " 25 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:71(_wrapreduction)\n", - " 105 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5552(equals)\n", - " 89 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/dispatch.py:17(should_extension_dispatch)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:243(replace)\n", - " 18 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1524(where)\n", - " 331 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:734(name)\n", - " 27 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:261(_isna_array)\n", - " 45 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:836(__iter__)\n", - " 17 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:903(_set_levels)\n", - " 176 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4623(_clear_item_cache)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_decorators.py:325(wrapper)\n", - " 215 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:948(from_blocks)\n", - " 677 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/flags.py:87(allows_duplicate_labels)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:3951(T)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:3767(transpose)\n", - " 21 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1032(_getitem_lowerdim)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1823(_setup_result_proxy)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:744(_group_index)\n", - " 367 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:586(_get_axis)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1893(_setup_dml_or_text_result)\n", - " 354 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1590()\n", - " 564 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1392()\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:474(from_arrays)\n", - " 408 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:219(_can_consolidate)\n", - " 236 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:707(dtype)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:1422(__init__)\n", - " 599 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1133(_parsems)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:271(from_annotation)\n", - " 9 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:333(from_annotated_attribute)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:110(__init__)\n", - " 48 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:294(handle_union_schema)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:1485(_init_metadata)\n", - " 65 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2311(_fast_count_smallints)\n", - " 12 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:418(merge_field_infos)\n", - " 122 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:3995(_maybe_update_cacher)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:347(__init__)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:828(replace)\n", - " 18 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1643(fillna)\n", - " 85 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:243(__init__)\n", - " 634 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:214(is_extension)\n", - " 15 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:66(copy)\n", - " 44 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:47(_sum)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:651()\n", - " 17 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/ipkernel.py:768(init_closure)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_discriminated_union.py:37(apply_discriminators)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:3048(factorize_from_iterables)\n", - " 105 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:184(_reconstruct_data)\n", - " 13 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1595(makeRecord)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:3069()\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:3005(factorize_from_iterable)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:8282(_construct_result)\n", - " 52 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:414(_split_op_result)\n", - " 376 0.001 0.000 0.001 0.000 {method 'view' of 'numpy.ndarray' objects}\n", - " 20 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:113(comp_method_OBJECT_ARRAY)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:416(_maybe_cast_listlike_indexer)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:196(__rsub__)\n", - " 7 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4159(xs)\n", - " 15 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:942(format)\n", - " 63 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:328(__init__)\n", - " 165 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1850(from_blocks)\n", - " 55 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/common.py:81(get_op_result_name)\n", - " 35 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:534(_scalar_from_string)\n", - " 15 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:674(format)\n", - " 7 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:689(codes)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:2063(to_dict)\n", - " 3111 0.001 0.000 0.001 0.000 {method 'isspace' of 'str' objects}\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/methods/to_dict.py:78(to_dict)\n", - " 246 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:292(make_block_same_class)\n", - " 17 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1085(_set_codes)\n", - " 214 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/frozen.py:76(__getitem__)\n", - " 21 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:957(_validate_tuple_indexer)\n", - " 13 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:292(__init__)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:777(_codes_and_uniques)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:231(get_result)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1443()\n", - " 17 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:856(__init__)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:958(fast_xs)\n", - " 42 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1081(is_numeric_dtype)\n", - " 1291 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:1257(value)\n", - " 130 0.001 0.000 0.001 0.000 {method 'remove' of 'list' objects}\n", - " 51 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:612(result_iterator)\n", - " 337 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/extension.py:67(fget)\n", - " 48 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:440(acquire)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:7172()\n", - " 227 0.001 0.000 0.001 0.000 {method 'clear' of 'dict' objects}\n", - " 41 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:2082(empty)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:496(_merge_cursor_description)\n", - " 5/4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2435(_signature_from_callable)\n", - " 112 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1643(__len__)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4651(_maybe_cache_changed)\n", - " 7 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/ops.py:29(_iter_block_pairs)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1784(get_level_values)\n", - " 57 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:166(simplefilter)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:625()\n", - " 379 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:195(is_array_like)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7218(_construct_result)\n", - " 289 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1253(iget)\n", - " 45 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:525(_unbox_scalar)\n", - " 67 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:217(_ensure_arraylike)\n", - " 214 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:673(na_value_for_dtype)\n", - " 97 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:728(is_valid_na_for_dtype)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12362(_stat_function)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6488(isna)\n", - " 16 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:844(levels)\n", - " 130 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1768(ravel)\n", - " 37 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:718(_unbox)\n", - " 236 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1993(dtype)\n", - " 13 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:305(_isna_string_dtype)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2016(_sort_levels_monotonic)\n", - " 242 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:441(__init__)\n", - " 40 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:2077(__contains__)\n", - " 27 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6415(_is_comparable_dtype)\n", - " 284 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:2443(get_origin)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1758(_get_level_values)\n", - " 33 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1277(is_extension_array_dtype)\n", - " 242 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:488(__exit__)\n", - " 995 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:758(_maybe_repeat)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1565(__invert__)\n", - " 59 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:924()\n", - " 63/3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:425(collect_refs)\n", - " 7 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:707(_get_comb_axis)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:348(get_function_type_hints)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:3261(signature)\n", - " 1854 0.001 0.000 0.001 0.000 {method 'is_finite' of 'decimal.Decimal' objects}\n", - " 48 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:314(_result_or_cancel)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:3007(from_callable)\n", - " 38 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:33(seterr)\n", - " 379 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:735(_sanitize_str_dtypes)\n", - " 2 0.000 0.000 0.001 0.000 {method 'throw' of 'generator' objects}\n", - " 735 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3809()\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2331(_signature_from_function)\n", - " 58/42 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2432(_extract_get_pydantic_json_schema)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:593(fetch_eof_columns)\n", - " 14 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2979(prod)\n", - " 16 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:897()\n", - " 7 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:72(get_objs_combined_axis)\n", - " 59 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1102()\n", - " 46 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:782(_rename)\n", - " 310 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:667(_info_axis)\n", - " 157 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:319(asi8)\n", - " 95 0.001 0.000 0.001 0.000 {method 'take' of 'numpy.ndarray' objects}\n", - " 33 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:353(wrapper)\n", - " 18 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:219(vstack)\n", - " 31 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6324(_maybe_downcast_for_indexing)\n", - " 19 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2246(_stack_arrays)\n", - " 288 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:325(_get_take_nd_function)\n", - " 15 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:263(eval_type_backport)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:176(isna)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:596(shape)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:782(result_index)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:111(f)\n", - " 81 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4585(_ensure_valid_index)\n", - " 514 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1837(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:840(agg_series)\n", - " 603 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1056(_could_be_tzname)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1559(itertuples)\n", - " 575 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/__init__.py:42(warn_copy_on_write)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:296(_eval_type_backport)\n", - " 114 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2603(_tuplify)\n", - " 42 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:775(infer_dtype_from_scalar)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1697(_validate_names)\n", - " 108 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:108(asi8)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:492(to_numpy)\n", - " 119 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:2140()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:598()\n", - " 432 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:999(__len__)\n", - " 48 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2320(_preprocess_slice_or_indexer)\n", - " 82 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:537(_check_compatible_with)\n", - " 1277 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5144(_values)\n", - " 42 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1574(_validate_key)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:676(ngroups)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:321(_eval_type)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:226(isna)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2421(all)\n", - " 403 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:300()\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1433(find_common_type)\n", - " 1387 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:405(flags)\n", - " 25 0.000 0.000 0.000 0.000 {method 'extend' of 'list' objects}\n", - " 35 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:789(values)\n", - " 54 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:914(__len__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:378(interleaved_dtype)\n", - " 135 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4379(_set_is_copy)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6459(any)\n", - " 33 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:165(maybe_lift)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1684(is_monotonic_increasing)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:1083(reduction)\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1652(_is_scalar_access)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1630()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6916(delete)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:805(call_soon_threadsafe)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:885(pandasSQL_builder)\n", - " 70/15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:387(_eval_type)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:430(__enter__)\n", - " 32/30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_repr.py:86(display_as_type)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:259(_reconstruct)\n", - " 654 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:572(_get_axis_number)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:873(_aggregate_series_pure_python)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:191(_make_selectors)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6629(cumprod)\n", - " 158 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:592(_get_block_manager_axis)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:652(_validate_listlike)\n", - " 80 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:769(_assert_tzawareness_compat)\n", - " 184 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1040(needs_i8_conversion)\n", - " 77 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:299(helper)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12291(cumprod)\n", - " 624 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:360(convertyear)\n", - " 128 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:456(_engine_type)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:120(_get_combined_index)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:743(parse_position_id)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12239(_accum_func)\n", - " 35 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2000(external_values)\n", - " 78 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4191(_validate_positional_slice)\n", - " 63/3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_discriminated_union.py:45(inner)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:122(collect_definitions)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:214(_handle_result)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:187(validate_indices)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2036(_get_prepare_pydantic_annotations_for_known_type)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:815(_handle_resultset)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:487()\n", - " 318 0.000 0.000 0.000 0.000 {method 'astype' of 'numpy.ndarray' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:687(codes)\n", - " 87 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1310(__getattr__)\n", - " 624 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:402(has_year)\n", - " 66 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5295(_validate_fill_value)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:838(_cleanup)\n", - " 63/3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:125(_record_valid_refs)\n", - " 140 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:79()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:690()\n", - " 42 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:4120(_coerce_indexer_frozen)\n", - " 58 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:350(getitem_block_columns)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:747()\n", - " 1476 0.000 0.000 0.000 0.000 {built-in method builtins.callable}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:1149(__iter__)\n", - " 220 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:649(_get_deprecated_option)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:1162(_sorted_data)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:237(ndarray_to_mgr)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/putmask.py:101(validate_putmask)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:482(nanany)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6509(max)\n", - " 31 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:633(is_integer_dtype)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2244(get_values)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:771(ngroups)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:456(get_rows)\n", - " 710 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/flags.py:55(allows_duplicate_labels)\n", - " 123 0.000 0.000 0.000 0.000 {method 'nonzero' of 'numpy.ndarray' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_exceptions.py:34(find_stack_level)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12397(max)\n", - " 75 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:4035(_dict_not_none)\n", - " 677 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:718(dtype)\n", - " 59 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:74(__len__)\n", - " 63/3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:488(inline_refs)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2229(is_monotonic_increasing)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1532(__neg__)\n", - " 63/3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:447(count_refs)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:567(validate_core_schema)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:66(mask_missing)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6219(_raise_if_missing)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1730(_get_default_index_names)\n", - " 217 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:791(is_)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1491(warning)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:158(collect_invalid_schemas)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:369(nargsort)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:606(formatTime)\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1574(_set_names)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6499(min)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1561(findCaller)\n", - " 37 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:836(_isnan)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12381(min)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_asarray.py:27(require)\n", - " 63/3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:161(_is_schema_valid)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:53(_wrapfunc)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1045(astype)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:545(_get_sample_object)\n", - " 132 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1380()\n", - " 140 0.000 0.000 0.000 0.000 {method 'reshape' of 'numpy.ndarray' objects}\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:572(_is_uniform_join_units)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/selector_events.py:128(_write_to_self)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:1452(safe_sort)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:348()\n", - " 4/3 0.000 0.000 0.000 0.000 {built-in method _operator.ge}\n", - " 170 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:617(_select_options)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:386(default_index)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/plugin/_schema_validator.py:21(create_schema_validator)\n", - " 677 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:363(attrs)\n", - " 474 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1940(_block)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1265(_iset_single)\n", - " 114 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:123(check_setitem_lengths)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1250(copy)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:435(__exit__)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:562(__init__)\n", - " 88 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:795(_merge_cols_by_none)\n", - " 83/24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:409()\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2666(_maybe_normalize_endpoints)\n", - " 6 0.000 0.000 0.000 0.000 {method 'send' of '_socket.socket' objects}\n", - " 43 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:301(maybe_iterable_to_list)\n", - " 124 0.000 0.000 0.000 0.000 {built-in method numpy.zeros}\n", - " 14 0.000 0.000 0.000 0.000 {built-in method _operator.ne}\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5598()\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:393(logical_op)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:567()\n", - " 29 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:119(is_namedtuple)\n", - " 35 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:249(external_values)\n", - " 288 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1270(is_1d_only_ea_dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:296(_get_combined_plan)\n", - " 17 0.000 0.000 0.000 0.000 {method 'min' of 'numpy.ndarray' objects}\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1771(_is_label_reference)\n", - " 3 0.000 0.000 0.000 0.000 {built-in method pydantic_core._pydantic_core.validate_core_schema}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:266(index_labels_to_array)\n", - " 77 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:104(__init__)\n", - " 242 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1687(__eq__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:652()\n", - " 180 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:271(__enter__)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:58(__new__)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5172(delete)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2083(remove_unused_levels)\n", - " 68 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6312(_index_as_unique)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:166(is_finalvar)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:214(get_compressed_ids)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:560(_validate_scalar)\n", - " 52 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:992(is_numeric_v_string_like)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:480(_get_ndims)\n", - " 197 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/__init__.py:55(using_pyarrow_string_dtype)\n", - " 59 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:122(_reset_cache)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1025(argsort)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:479(__enter__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:5486(isin)\n", - " 87 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1774(get_result_processor)\n", - " 112 0.000 0.000 0.000 0.000 {built-in method builtins.max}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:74(array)\n", - " 255 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2593(_convert_key)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:398(reduce)\n", - " 48 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:973(coerce_indexer_dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:1620(__init__)\n", - " 320 0.000 0.000 0.000 0.000 {built-in method numpy.asanyarray}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:720(size)\n", - " 430 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:196(blklocs)\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:43(_amin)\n", - " 76 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:111(is_annotated)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6480(all)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2285()\n", - " 184 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1763(np_can_hold_element)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:586(update_dtype)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:8084(_align_for_op)\n", - " 143 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2177(_grouping_func)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1216(_iset_split_block)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:287(get_dtypes)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/functools.py:35(update_wrapper)\n", - " 34 0.000 0.000 0.000 0.000 {method 'argsort' of 'numpy.ndarray' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1193(_engine)\n", - " 180 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:274(__exit__)\n", - " 54 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:2378(array_equal)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6831(infer_objects)\n", - " 39 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:1499(_maybe_null_out)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:8058(_should_reindex_frame_op)\n", - " 49 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:2473(get_args)\n", - " 333 0.000 0.000 0.000 0.000 {method '__exit__' of '_thread.RLock' objects}\n", - " 180 0.000 0.000 0.000 0.000 {method 'split' of 'str' objects}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2817(hasnans)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:198(__init__)\n", - " 50 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:688(_warn_if_deprecated)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:481()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1605(maybe_cast_to_integer_array)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:494(_clean_keys_and_objs)\n", - " 88 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/base.py:238(construct_from_string)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:176(sorted_labels)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:54(__gt__)\n", - " 64 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/missing.py:131(dispatch_fill_zeros)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2669(__init__)\n", - " 35 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2827(external_values)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:132(geterr)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1047(shape)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:325(get_new_columns)\n", - " 27 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:201(_simple_new)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2252()\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1051(_stop)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:10185(align)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2065(set_values)\n", - " 660 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:186(__iter__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:123(__init__)\n", - " 319 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:913(__init__)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1798()\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:974(_is_nested_tuple_indexer)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:156(_indexer_and_to_sort)\n", - " 52 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/astype.py:157(astype_array)\n", - " 234 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6685(_validate_indexer)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5651(identical)\n", - " 71 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_utils.py:76(lenient_issubclass)\n", - " 255 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:676(iat)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1392(np_find_common_type)\n", - " 39 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:253(_get_values)\n", - " 84 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1266(_is_dunder)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:647()\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:597()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1728(duplicated)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/methods/to_dict.py:171()\n", - " 88 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:648(_colnames_from_description)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2353(copy)\n", - " 15 0.000 0.000 0.000 0.000 {method '__reduce_ex__' of 'object' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1922(rename)\n", - " 353 0.000 0.000 0.000 0.000 {method 'values' of 'dict' objects}\n", - " 105 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:72(check)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1439(_indexed_same)\n", - " 75 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:4036()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:1547(check_below_min_count)\n", - " 87 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/sql/type_api.py:908(_cached_result_processor)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/_optional.py:85(import_optional_dependency)\n", - " 35 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:243(_keep_alive)\n", - " 51 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:745(_get_engine_target)\n", - " 31 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7723(_unpack_nested_dtype)\n", - " 39 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:194(_is_internal_frame)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:81(atleast_2d)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:438(convert)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1809(set_names)\n", - " 39 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/numpy/function.py:413(validate_func)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12260(block_accum_func)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:430(_list_schema)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4436(_wrap_reindex_result)\n", - " 48 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:364(cancel)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2225(_handle_dbapi_exception)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1826(_check_label_or_level_ambiguity)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1441()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1966(_is_lexsorted)\n", - " 323 0.000 0.000 0.000 0.000 {method 'startswith' of 'str' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/__extensions__.py:93(equity)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:389(is_na)\n", - " 10 0.000 0.000 0.000 0.000 {built-in method _operator.eq}\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:322(_get_block_for_concat_plan)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:246(get_new_values)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:424(str_schema)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:978(__array__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:3255(connect)\n", - " 153 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/numpy/function.py:64(__call__)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:466(array_equivalent)\n", - " 613 0.000 0.000 0.000 0.000 {built-in method _warnings._filters_mutated}\n", - " 76 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1262(_slice)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:132(__init__)\n", - " 120 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:226(validate_bool_kwarg)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:1332(getfullargspec)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:10479(_align_frame)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2002(_lexsort_depth)\n", - " 298 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:1080(copyto)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1935(delete)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/common.py:103(_maybe_match_name)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:507(maybe_prepare_scalar_for_op)\n", - " 114 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2618()\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4440(_maybe_preserve_names)\n", - " 56 0.000 0.000 0.000 0.000 :405(parent)\n", - " 310 0.000 0.000 0.000 0.000 {method '__exit__' of '_thread.lock' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:1714(na_accum_func)\n", - " 151 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:62(is_list_like_indexer)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1692()\n", - " 15 0.000 0.000 0.000 0.000 {built-in method time.localtime}\n", - " 307 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:344()\n", - " 561 0.000 0.000 0.000 0.000 {built-in method builtins.id}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:378(new_index)\n", - " 114 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:259(_standardize_fill_value)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2107(droplevel)\n", - " 150 0.000 0.000 0.000 0.000 {method 'ravel' of 'numpy.ndarray' objects}\n", - " 15 0.000 0.000 0.000 0.000 {built-in method time.strftime}\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1327(__instancecheck__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:4037(_lexsort_depth)\n", - " 31 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3996(_check_indexing_method)\n", - " 103 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:161(iloc)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:11458(blk_func)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:354(validate_ascending)\n", - " 73 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:131()\n", - " 481 0.000 0.000 0.000 0.000 {method 'copy' of 'dict' objects}\n", - " 63 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:90(RLock)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:892(getfile)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:652(usesTime)\n", - " 2 0.000 0.000 0.000 0.000 {method 'fetch_fields' of '_mysql_connector.MySQL' objects}\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:883(_get_args_resolving_forward_refs)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2804(_isnan)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/version/__init__.py:339(__init__)\n", - " 441 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:363(ndim)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:363(_can_hold_element)\n", - " 217 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1081(codes)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/base.py:294(is_dtype)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/container.py:14(__init__)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:3689(equals)\n", - " 276 0.000 0.000 0.000 0.000 {method 'group' of 're.Match' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:429(__init__)\n", - " 18 0.000 0.000 0.000 0.000 {built-in method today}\n", - " 40 0.000 0.000 0.000 0.000 :121(__subclasscheck__)\n", - " 424 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6672(_maybe_cast_indexer)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6370(_find_common_type_compat)\n", - " 35 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:324(_get_dtype_max)\n", - " 234 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2043(freq)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:105(__init__)\n", - " 69 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:148(__getattr__)\n", - " 54 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:550(_is_master_process)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:527(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1418(_literal_schema)\n", - " 226 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1671(name)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:243(_from_values_or_dtype)\n", - " 319 0.000 0.000 0.000 0.000 {method 'items' of 'dict' objects}\n", - " 63 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:401(_config_wrapper)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:658(formatMessage)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:209(count_not_none)\n", - " 55 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:557(is_generic_alias)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:223(unique)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:776(reconstructed_codes)\n", - " 156 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:246(items)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/roperator.py:10(radd)\n", - " 176 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:696(ndim)\n", - " 13 0.000 0.000 0.000 0.000 :117(splitext)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:480()\n", - " 31 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/dataclasses.py:1258(is_dataclass)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2159(_drop_level_numbers)\n", - " 27 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:346(shape)\n", - " 195 0.000 0.000 0.000 0.000 {method 'insert' of 'list' objects}\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:564(_array_equivalent_object)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:141(assemble_bulk_data_request)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2586(get_values)\n", - " 63 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1181()\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:622(convert)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2955(__init__)\n", - " 46 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1453(current_thread)\n", - " 36 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/putmask.py:115(extract_bool_array)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:762(infer_dtype_from)\n", - " 13 0.000 0.000 0.000 0.000 :140(basename)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:545(is_dataclass)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1725(can_hold_element)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1111(_values)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:432(usesTime)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:687(compress_group_index)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:922(acquire)\n", - " 468 0.000 0.000 0.000 0.000 {method 'end' of 're.Match' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:202(union_indexes)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:813(str_schema)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:352(na_logical_op)\n", - " 68 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:158(_check_finalvar)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2410(wrap_default)\n", - " 116 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1249(shape)\n", - " 205 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:266(mgr_locs)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2692(max)\n", - " 33 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:283(_acquire_restore)\n", - " 167 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:974(dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:158()\n", - " 64 0.000 0.000 0.000 0.000 {method 'groupdict' of 're.Match' objects}\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:102()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:3280(raw_connection)\n", - " 54 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:505(parent_header)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3449(intersection)\n", - " 123 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:115(get_ref)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3035(unique)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4585(_is_view)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1377(__init__)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:447(format)\n", - " 75 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:292(isclass)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:441(connect)\n", - " 88 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/weakref.py:414(__getitem__)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2567(push)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1602(__subclasscheck__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:523(cython_operation)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1512(_close_special)\n", - " 70 0.000 0.000 0.000 0.000 {built-in method _thread.allocate_lock}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:1148(take)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:177(__contains__)\n", - " 35 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:87(is_literal_type)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:157(core_config)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1255(_checkout)\n", - " 66 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1165(_check_deprecated_callable_usage)\n", - " 55 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:566(is_self_type)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:543(nanall)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:829(_maintain_shutdown_locks)\n", - " 64 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1571(_get_names)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1534(blk_func)\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:935(_expand_ellipsis)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/equity.py:307(price)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1384(_checkin)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/concat.py:52(concat_compat)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:251(handle_list_schema)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/astype.py:249(astype_is_view)\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6137(_align_for_op)\n", - " 3 0.000 0.000 0.000 0.000 :150(dirname)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:781(_call_soon)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1695(__hash__)\n", - " 114 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:470(__getattr__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:457(isin)\n", - " 51 0.000 0.000 0.000 0.000 {method 'put' of '_queue.SimpleQueue' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1454()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1578(_wrap_aggregated_output)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1192(is_alive)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:310(_cython_op_ndim_compat)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1087(_slice)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1667(_validate_integer)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:268(decons_obs_group_ids)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:3345(arguments_parameter)\n", - " 3 0.000 0.000 0.000 0.000 {built-in method posix.cpu_count}\n", - " 40 0.000 0.000 0.000 0.000 {built-in method _abc._abc_subclasscheck}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:917(_finalize_fairy)\n", - " 8 0.000 0.000 0.000 0.000 {built-in method _operator.sub}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1689()\n", - " 132 0.000 0.000 0.000 0.000 {built-in method numpy.core._multiarray_umath.normalize_axis_index}\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Configuration.py:37(__setattr__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:3108(cumprod)\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_weakrefset.py:85(add)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:354(_call_cython_op)\n", - " 188 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:153(concatenate)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5818(head)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:230(_can_hold_na)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/errors.py:222(get_mysql_exception)\n", - " 4 0.000 0.000 0.000 0.000 {built-in method _operator.mul}\n", - " 39 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:209(_maybe_get_mask)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1657(_get_level_number)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:448(size)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:440(_format)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:707(checkout)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:159()\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:2364(with_default_schema)\n", - " 16/3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:99(all_literal_values)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:246(_decons_group_index)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:410(fill_bool)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:480(is_view)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/roperator.py:14(rsub)\n", - " 56 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1030(axes)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:215(_vhstack_dispatcher)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:946(_sorted_ids)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:106(_get_distinct_objs)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1284(find_result_type)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_asarray.py:108()\n", - " 39 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6277()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:808(__init__)\n", - " 39 0.000 0.000 0.000 0.000 :52(normcase)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:183(_make_sorted_values)\n", - " 168 0.000 0.000 0.000 0.000 {method 'upper' of 'str' objects}\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:675(empty)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:82(frame_apply)\n", - " 4 0.000 0.000 0.000 0.000 {built-in method _operator.truediv}\n", - " 21 0.000 0.000 0.000 0.000 {method 'fill' of 'numpy.ndarray' objects}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:571(_disallow_mismatched_indexing)\n", - " 33 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:286(_is_owned)\n", - " 5 0.000 0.000 0.000 0.000 {built-in method _warnings.warn}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:567(free_result)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:369(__init__)\n", - " 47 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:241(is_single_block)\n", - " 214 0.000 0.000 0.000 0.000 {function FrozenList.__getitem__ at 0x11a7ee7a0}\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2794(_na_value)\n", - " 38 0.000 0.000 0.000 0.000 {built-in method numpy.seterrobj}\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:2472(union_schema)\n", - " 1 0.000 0.000 0.000 0.000 {method '__exit__' of '_io._IOBase' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1570(_maybe_box_and_unbox_datetimelike)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:470()\n", - " 73 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:126(_classes_and_not_datetimelike)\n", - " 280 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:182(_deepcopy_atomic)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:688(_sanitize_non_ordered)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:879(infer_dtype_from_array)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5134(array)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/utils/filters.py:8(filter_inputs)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:929(release)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:404(is_dataclass)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:398(validate_inclusive)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2095(create_block_manager_from_blocks)\n", - " 134 0.000 0.000 0.000 0.000 {method 'add' of 'set' objects}\n", - " 31 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:865(_references)\n", - " 39 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:311(is_null_slice)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:72()\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1765(_get_names)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:324(slice_block_columns)\n", - " 63 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2772()\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:1084(_convert_grouper)\n", - " 66 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1455()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:940(date_schema)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Configuration.py:29(__getattr__)\n", - " 4 0.000 0.000 0.000 0.000 {method 'free_result' of '_mysql_connector.MySQL' objects}\n", - " 63 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:981()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:127(__init__)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:1038(handle_unread_result)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:182(_make_key_to_index)\n", - " 6 0.000 0.000 0.000 0.000 :674(__getitem__)\n", - " 69 0.000 0.000 0.000 0.000 {method 'item' of 'numpy.ndarray' objects}\n", - " 2 0.000 0.000 0.000 0.000 {method 'cumprod' of 'numpy.ndarray' objects}\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:464(get_array_op)\n", - " 15 0.000 0.000 0.000 0.000 {built-in method numpy.arange}\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:83(is_callable_type)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:831(construct_from_string)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/exc.py:604(instance)\n", - " 78 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2752(need_slice)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/weakref.py:427(__setitem__)\n", - " 13 0.000 0.000 0.000 0.000 :121(_splitext)\n", - " 116 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:805(_maybe_copy)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:457(__neg__)\n", - " 48 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:47(__init__)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:157(_int64_cut_off)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:208(_maybe_unbox_datetimelike)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:950(_validate_or_indexify_columns)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:532(treat_as_nested)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2066(_get_level_values)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:121(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:761()\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:688(__call__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Configuration.py:18(initialize_configuration)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:546(ensure_key_mapped)\n", - " 3 0.000 0.000 0.000 0.000 :778(__contains__)\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1324(_make_invoke_excepthook)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1721()\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:533(_maybe_downcast)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2623(_infer_tz_from_endpoints)\n", - " 42 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:992(_validate_key_length)\n", - " 23 0.000 0.000 0.000 0.000 {method 'join' of 'str' objects}\n", - " 5 0.000 0.000 0.000 0.000 {built-in method _operator.and_}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:185()\n", - " 63 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:211(tail)\n", - " 153 0.000 0.000 0.000 0.000 {method 'pop' of 'dict' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:108()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:409(iscoroutinefunction)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:318()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:169(_get_cython_function)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:170(parent_frame_namespace)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_weakrefset.py:39(_remove)\n", - " 8 0.000 0.000 0.000 0.000 {method 'astype' of 'numpy.generic' objects}\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/typing_extensions.py:1132(is_typeddict)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:862(codes)\n", - " 33 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:280(_release_save)\n", - " 130 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5558(_append_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:751(checkin)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:1314(fetchall)\n", - " 128 0.000 0.000 0.000 0.000 {method 'toordinal' of 'datetime.date' objects}\n", - " 113 0.000 0.000 0.000 0.000 {method '__enter__' of '_thread.RLock' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:141(validate_kwargs)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/handlers.py:354(shouldRollover)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:2208(__init__)\n", - " 63 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2781()\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:332(array)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/events.py:35(__init__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:1054(construct_from_string)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:99(freq)\n", - " 132 0.000 0.000 0.000 0.000 {built-in method _operator.index}\n", - " 45 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:51(origin_is_union)\n", - " 4 0.000 0.000 0.000 0.000 {built-in method _operator.pow}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:935(_verify_integrity)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:543(_allrows)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:2426(nullable_schema)\n", - " 42 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2738(is_label_like)\n", - " 63 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1180()\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:1305(construct_from_string)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/plugin/_loader.py:21(get_plugins)\n", - " 39 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:206(_should_unflatten_callable_args)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:756(_shallow_copy)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/errors.py:46(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/impl.py:153(_do_get)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:540()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1768(_set_names)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:207(_arrays_for_stack_dispatcher)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:196(mgr_to_mgr)\n", - " 41 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1046(nlevels)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1974(get_slice)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2738(_check_indexing_error)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:174(not_none)\n", - " 130 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1764(_ravel_dispatcher)\n", - " 95 0.000 0.000 0.000 0.000 {method 'endswith' of 'str' objects}\n", - " 30 0.000 0.000 0.000 0.000 {method 'acquire' of '_thread.RLock' objects}\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:164()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:391(_has_code_flag)\n", - " 76 0.000 0.000 0.000 0.000 {built-in method numpy.geterrobj}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/ops.py:108(_get_same_shape_values)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:470(any_schema)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method _operator.inv}\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:471(__init__)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_known_annotated_metadata.py:121(expand_grouped_metadata)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:3002()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:451(_return_conn)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:373(is_sequence)\n", - " 56 0.000 0.000 0.000 0.000 {method 'rpartition' of 'str' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:136(ones)\n", - " 3 0.000 0.000 0.000 0.000 :71(join)\n", - " 2 0.000 0.000 0.000 0.000 {method 'any' of 'numpy.generic' objects}\n", - " 66 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:660(_constructor)\n", - " 76 0.000 0.000 0.000 0.000 {built-in method sys.getrefcount}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:2134(_fetchall_impl)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:306(is_named_tuple)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copyreg.py:104(__newobj__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:95(__init__)\n", - " 65 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1176(_maybe_disallow_fill)\n", - " 113 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1480(_clear_item_cache)\n", - " 42 0.000 0.000 0.000 0.000 {method 'rfind' of 'str' objects}\n", - " 63 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1725(__eq__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1731(__hash__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/impl.py:144(_do_return_conn)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:1191(_get_splitter)\n", - " 19 0.000 0.000 0.000 0.000 :41(_get_sep)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:291(arrays)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/ops.py:96(_reset_block_mgr_locs)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:915(__array__)\n", - " 63 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:398(__get_result)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/queue.py:174(get)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/astype.py:56(_astype_nansafe)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_common.py:27(_init_wait_gen)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:638(__array__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:742(_get_axes)\n", - " 90 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:217(_scalar_type)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:1130(fetchall)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:594(_bool_arith_check)\n", - " 67 0.000 0.000 0.000 0.000 {method '__enter__' of '_thread.lock' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:939(_sort_idx)\n", - " 47 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:265(_engine_type)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:677(_constructor_expanddim)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/calendar.py:122(monthrange)\n", - " 68 0.000 0.000 0.000 0.000 {built-in method posix.getpid}\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:553(equals)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:815(filter)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:170()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2209(_safe_close_cursor)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/queue.py:132(put)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:886()\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:839()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/inspection.py:113(inspect)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4518(_check_inplace_and_allows_duplicate_labels)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:644(get_group_index_sorter)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/decorators.py:9(decorator)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:410(_is_comparable_dtype)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:405(_check_values_indices_shape_match)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:773(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/exc.py:692(__init__)\n", - " 66 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5364(_insert_dispatcher)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:845(unread_result)\n", - " 82 0.000 0.000 0.000 0.000 {built-in method _thread.get_ident}\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1992(_validate_index_level)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:2228(construct_from_string)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:643(name)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:167(get_annotations)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:123(getLevelName)\n", - " 63 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:213()\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1734(isEnabledFor)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1061()\n", - " 11 0.000 0.000 0.000 0.000 {method '_acquire_restore' of '_thread.RLock' objects}\n", - " 42 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1665()\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:288()\n", - " 3 0.000 0.000 0.000 0.000 :773(getenv)\n", - " 70 0.000 0.000 0.000 0.000 {method 'discard' of 'set' objects}\n", - " 63 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:941()\n", - " 27 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1122()\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6270()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:598(collect_definitions)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5676()\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2294()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1933(to_numpy)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:984()\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/from_thread.py:170(_check_running)\n", - " 5 0.000 0.000 0.000 0.000 {built-in method _operator.invert}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:645()\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:446(__exit__)\n", - " 66 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1389(_moveaxis_dispatcher)\n", - " 54 0.000 0.000 0.000 0.000 {method 'write' of '_io.StringIO' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:516(close)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/base.py:2411(_quote_free_identifiers)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:587()\n", - " 36 0.000 0.000 0.000 0.000 {built-in method time.time}\n", - " 67 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:892(bincount)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:884(keys)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1463()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/getlimits.py:685(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:639(group_keys_seq)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:572(is_required)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/pivot.py:493(_convert_by)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:5565(_reindex_output)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:514(_collect_metadata)\n", - " 26 0.000 0.000 0.000 0.000 {method 'update' of 'dict' objects}\n", - " 31 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1206(daemon)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1881(nonzero)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:215(extract_numeric_value)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:342(construct_from_string)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:479(__repr__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:231(_fix)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:1835(construct_from_string)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/putmask.py:29(putmask_inplace)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1671(is_all_strings)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:106(keys)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/weakref.py:369(remove)\n", - " 62 0.000 0.000 0.000 0.000 {method 'append' of 'collections.deque' objects}\n", - " 46 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:575(is_set)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:171()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/base.py:2414()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7704(get_unanimous_names)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_sync.py:10(_call_handlers)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:373(inner)\n", - " 3 0.000 0.000 0.000 0.000 :771(get)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:426(__init__)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:368(getMessage)\n", - " 71 0.000 0.000 0.000 0.000 {built-in method posix.fspath}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:3176(ndim)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:230(_handle_eof)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/sql/schema.py:5357(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/version/__init__.py:520(_cmpkey)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2512(cumsum)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/string_.py:140(construct_from_string)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/functools.py:65(wraps)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:131(is_new_type)\n", - " 50 0.000 0.000 0.000 0.000 {method 'release' of '_thread.lock' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:735(unwrap)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_schema_generation_shared.py:72(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:1532(_soft_close)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:202(_maybe_reindex_columns_na_proxy)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1695()\n", - " 54 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:2374(_array_equal_dispatcher)\n", - " 6 0.000 0.000 0.000 0.000 :756(encode)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:137(__new__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:822(reset)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/calendar.py:115(weekday)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:378(isfunction)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/base.py:445(__get__)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:206(get_module_ns_of)\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:440(__init__)\n", - " 6 0.000 0.000 0.000 0.000 {built-in method now}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:219(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:891(_get_first_arg_or_any)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:541(to_numpy)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7652(ensure_has_len)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:305(_connection_insp)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:191(identify_interval)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method _operator.gt}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1730()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/equity.py:65(fundamental)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/importlib/__init__.py:108(import_module)\n", - " 12 0.000 0.000 0.000 0.000 {built-in method builtins.min}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:388()\n", - " 41 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:1073(clean_reindex_fill_method)\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:686()\n", - " 16 0.000 0.000 0.000 0.000 {method 'find' of 'str' objects}\n", - " 54 0.000 0.000 0.000 0.000 {method 'get' of '_contextvars.ContextVar' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:436(_split)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:138(_event_pipe)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/sql/compiler.py:7475(quote_identifier)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:665(_get_registered_option)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:244()\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:209(is_object)\n", - " 16 0.000 0.000 0.000 0.000 {built-in method builtins.iter}\n", - " 42 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:178()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1096(_can_fast_transpose)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:354(__array__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:497(_extract_metadata)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:91(is_deprecated_instance)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2155()\n", - " 66 0.000 0.000 0.000 0.000 {method 'weekday' of 'datetime.date' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:3386(arguments_schema)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:136(_codes_to_ints)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:641(fill_missing_names)\n", - " 6 0.000 0.000 0.000 0.000 :1()\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:300(ismethod)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:363(_repeater)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1472()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/generic.py:2015(_wrap_agged_manager)\n", - " 6 0.000 0.000 0.000 0.000 {built-in method fromkeys}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:271(validate_fillna_kwargs)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/shape_base.py:1185(tile)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:692(_constructor)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:764(categories)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:221()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:3445(call_schema)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:228(_construct)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:93(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/exc.py:477(__init__)\n", - " 28 0.000 0.000 0.000 0.000 {built-in method time.monotonic}\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6055(_check_indexing_error)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Context.py:124(clear_context)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:403()\n", - " 19 0.000 0.000 0.000 0.000 {built-in method sys._getframe}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:791(_autobegin)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:948()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:1206(literal_schema)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:531(validate_ordered)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2577(is_view)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:136(reset)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1357(__getattr__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3766(_convert_can_do_setop)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:397(ensure_np_dtype)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:983(is_in_axis)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1980(shape)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:751()\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1152(name)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/base.py:183(_for_instance)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:1248(python_charset)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:837(result_set_available)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2730(annotation)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1479()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:5607()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1686(name)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:584()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:1129(__init__)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1340()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3200(_get_reconciled_name_object)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:1465(list_schema)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:795(begin)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:949()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:680()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:696(names)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:1095(__new__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:423(repeat)\n", - " 1 0.000 0.000 0.000 0.000 :1192(_gcd_import)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:947()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1269(set_inplace)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1959(maybe_mangle_lambdas)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:4039()\n", - " 14 0.000 0.000 0.000 0.000 {method 'difference_update' of 'set' objects}\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:283(ismodule)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:849(_list_to_arrays)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:198()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:435()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:692(levels)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2734(kind)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:219(mask_all)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:1745(currentframe)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:592(groupings)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1445()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/numpy/function.py:223(validate_cum_func_with_skipna)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:502(enter_context)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1062(levshape)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/langhelpers.py:1138(__get__)\n", - " 42 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:290(_add_custom_serialization_from_json_encoders)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:937()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1342(is_complex_dtype)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:811(_newname)\n", - " 30 0.000 0.000 0.000 0.000 {method 'release' of '_thread.RLock' objects}\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:303()\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:195()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:128(_check_for_invalid_keys)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:172()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/base.py:180(_for_class)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4306(_validate_can_reindex)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1524(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1069(_is_homogeneous_type)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:26(lookback)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:49(_check_for_default_values)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/base.py:187(_join)\n", - " 11 0.000 0.000 0.000 0.000 {method '_release_save' of '_thread.RLock' objects}\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/command_runner.py:470(user_settings)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:916()\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:693(_get_result_dim)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1331(dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:166()\n", - " 1 0.000 0.000 0.000 0.000 {method 'cumsum' of 'numpy.ndarray' objects}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2220(_can_hold_na)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:638(_passed_categorical)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:205(_effective_processors)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/multiprocessing/process.py:37(current_process)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:172()\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1721()\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:466(isframe)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:204()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2678(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1619(executemany)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:405(_types_namespace)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:234(_disallow_mismatched_datetimelike)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:3750(definitions_schema)\n", - " 13 0.000 0.000 0.000 0.000 {method 'write' of '_io.TextIOWrapper' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:672(_is_view_after_cow_rules)\n", - " 22 0.000 0.000 0.000 0.000 {method '__contains__' of 'frozenset' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1201()\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:886(inner)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:389(standardize_mapping)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:619(categories)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:578(__init__)\n", - " 22 0.000 0.000 0.000 0.000 {method 'capitalize' of 'str' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/_concurrency_py3k.py:61(is_exit_exception)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:282(query_attrs)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:265(_find_common_index_dtype)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2726(default)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/multiprocessing/process.py:189(name)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/mysqlconnector.py:53(_escape_identifier)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2722(name)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1903()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:383(is_closed)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:95(literal_values)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:191(_server_status)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:574(is_zoneinfo_type)\n", - " 14 0.000 0.000 0.000 0.000 {method 'remove' of 'collections.deque' objects}\n", - " 8 0.000 0.000 0.000 0.000 {method 'encode' of 'str' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/base.py:137(__init__)\n", - " 22 0.000 0.000 0.000 0.000 {method 'isidentifier' of 'str' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1398(_reset)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:456(istraceback)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:841(fetchall)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:480(iscode)\n", - " 1 0.000 0.000 0.000 0.000 :309(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:187(_get_fill_value)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:314()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:369(should_store)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/version/__init__.py:348()\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:999(is_in_obj)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:922(_maybe_infer_dtype_type)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5649(_needs_reindex_multi)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1246(enforce_interval)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1643(reconstruct_func)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/helpers/utils.py:10(verify_ticker)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5486()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:746()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/utils.py:28(eod)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:691(__del__)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:1080(_is_label_like)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2700(_connection_begin_impl)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/base.py:115(__eq__)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:167()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:518(_check_closed)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:788()\n", - " 3 0.000 0.000 0.000 0.000 {built-in method math.floor}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:966(_selected_obj)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/utils.py:189(check_single_item)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:534(_push_cm_exit)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:180()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/methods/to_dict.py:155()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:1454(__init__)\n", - " 49 0.000 0.000 0.000 0.000 {method 'locked' of '_thread.lock' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7717()\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:655(_constructor)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2516(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1076()\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1021(_argsort_dispatcher)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1394(__hash__)\n", - " 25 0.000 0.000 0.000 0.000 {built-in method builtins.abs}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:520(convert_to_list_like)\n", - " 1 0.000 0.000 0.000 0.000 {method 'fetch_row' of '_mysql_connector.MySQL' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/pivot.py:173()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/database/SQLHelpers.py:46(get_engine)\n", - " 1 0.000 0.000 0.000 0.000 :1165(_find_and_load)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/errors/__init__.py:535(_check_cacher)\n", - " 3 0.000 0.000 0.000 0.000 {method 'items' of 'mappingproxy' objects}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_common.py:17(_maybe_call)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:278(prepare_config)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:249(_get_output_shape)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:1009(__getitem__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:366(notify)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:168()\n", - " 7 0.000 0.000 0.000 0.000 {method 'index' of 'list' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/exc.py:48(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:657()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/log.py:101(_should_log_debug)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2974(_prod_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/langhelpers.py:1224(_set_memoized_attribute)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1793()\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:222()\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1474()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/replace.py:31(should_use_regex)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:212()\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1828(ndim)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager.py:352()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7719()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:483(_view)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:351(__init__)\n", - " 6 0.000 0.000 0.000 0.000 {built-in method _contextvars.copy_context}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/attr.py:389(__bool__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1091(_begin_impl)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:632(ordered)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:553(nblocks)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2474(validate_periods)\n", - " 5 0.000 0.000 0.000 0.000 {method 'replace' of 'str' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/queue.py:231(_get)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:229(__iter__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/Requests.py:172(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:139()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:223(__len__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5495()\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:77(_atleast_2d_dispatcher)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:205()\n", - " 3 0.000 0.000 0.000 0.000 {method 'send' of 'generator' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:336(_na_ok_dtype)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/getlimits.py:709(max)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/env.py:47(DEBUG_MODE)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:819(get_connection)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1329(result_index)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:829(warning_count)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:376(dtype)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/getlimits.py:696(min)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1271(determine_table_agg)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:330(_sanitize_and_check)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1872(build_name_format)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:633(is_builtin_func)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:238(is_int64_overflow_possible)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:183(maybe_box_native)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1847()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:532(_still_open_and_dbapi_connection_is_valid)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:2139(_codes)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/constants.py:993(get_info)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1658(no_parameters)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/queue.py:225(_full)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:520(can_consume_results)\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:443(__enter__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:194(_handle_warnings)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/utils.py:121(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:301(pm)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:381()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:698()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:252(_init_connection)\n", - " 1 0.000 0.000 0.000 0.000 {method 'repeat' of 'numpy.ndarray' objects}\n", - " 3 0.000 0.000 0.000 0.000 {method 'total_seconds' of 'datetime.timedelta' objects}\n", - " 13 0.000 0.000 0.000 0.000 {method '_is_owned' of '_thread.RLock' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:421(lexsort)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/mysqlconnector.py:145(is_disconnect)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:585(_ensure_2d)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/methods/to_dict.py:160()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/constants.py:320(raise_warning_against_deprecated_cursor_class)\n", - " 7 0.000 0.000 0.000 0.000 {method 'count' of 'list' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:305(loc)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2416(_all_dispatcher)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:494(dtype)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4367(igetitem)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:856(columns)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:722(_result_index)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:196()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:518(__repr__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1487(__getattr__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/concat.py:73()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:56(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:139(ticker)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:277()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:694()\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:709(inferred_type)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:320(__len__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:398()\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2070()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1128(value_getitem)\n", - " 3 0.000 0.000 0.000 0.000 {method 'rstrip' of 'str' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:333(tail)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:208(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/log.py:104(_should_log_info)\n", - " 1 0.000 0.000 0.000 0.000 {method 'put' of 'numpy.ndarray' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3760(_assert_can_do_setop)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:270(mgr_locs)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:217()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:441(maybe_cast_pointwise_result)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1720(_value_and_type_iter)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/command_runner.py:465(system_settings)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:472(__init__)\n", - " 1 0.000 0.000 0.000 0.000 {method 'searchsorted' of 'numpy.ndarray' objects}\n", - " 1 0.000 0.000 0.000 0.000 {method 'issuperset' of 'frozenset' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2583(__init__)\n", - " 3 0.000 0.000 0.000 0.000 {method 'tolist' of 'numpy.ndarray' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:717(index)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:850(more_results)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_wait_gen.py:7(expo)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/_optional.py:74(get_version)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method sys.exc_info}\n", - " 5 0.000 0.000 0.000 0.000 {method 'lstrip' of 'str' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:92()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:1954(get_debug)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/_collections.py:147(__new__)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:669(result_type)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/version/__init__.py:470(_parse_letter_version)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:101(is_holiday)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:303()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:93()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2564(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:318(merge_incomplete_data_in_cache)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/abstract/error.py:9(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:309(_operation_context)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:330(__init__)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/database/SQLHelpers.py:336(__init__)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:661(_ilevel)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/functools.py:421(_unwrap_partial)\n", - " 1 0.000 0.000 0.000 0.000 :1101(_sanity_check)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1094()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5168(_delete_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1287(determine_requested_columns)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1979(nlevels)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:141(is_re)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1225(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_common.py:28()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/base.py:346(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:88()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2688(_deactivate_from_connection)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:125(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:3015(parameters)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:178(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/version/__init__.py:149(__lt__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:232(get_underlier_data)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:539(_push_exit_callback)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:146(dtype)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_validate_call.py:51()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:1131(putmask)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7718()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/abstract/singleton.py:14(__call__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:687(is_closed)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:770(_maybe_check_integrity)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/queue.py:222(_empty)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/queue.py:228(_put)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1038(in_transaction)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:439(_ensure_has_table_connection)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/util/numba_.py:18(maybe_use_numba)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/version/__init__.py:534()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/decorators.py:8(log_time)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1877(_nonzero_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 :315(__subclasshook__)\n", - " 2 0.000 0.000 0.000 0.000 {method 'setdefault' of 'dict' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:218()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:1221(_charset_id)\n", - " 1 0.000 0.000 0.000 0.000 {method 'values' of 'mappingproxy' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:512(_validate_axis)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method _weakref.proxy}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/container.py:59(_get_provider)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:1110(get_warnings)\n", - " 3 0.000 0.000 0.000 0.000 {built-in method sys.getrecursionlimit}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:260(__init__)\n", - " 3 0.000 0.000 0.000 0.000 {method 'reverse' of 'list' objects}\n", - " 1 0.000 0.000 0.000 0.000 :260(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:460(tolist)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2687(_max_dispatcher)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:280(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:540(closed)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:7045(_deprecate_downcast)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/env.py:62(str2bool)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:467()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:315(step)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:450(check_dtype_backend)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/shape_base.py:1257()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:462(_create_exit_wrapper)\n", - " 2 0.000 0.000 0.000 0.000 {method 'date' of 'datetime.datetime' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:105(_box_func)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:351()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:4948(_needs_reindex_multi)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1818(handle_extra_cols)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:567(connection)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:510()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:231(_constructor)\n", - " 1 0.000 0.000 0.000 0.000 {method 'warning_count' of '_mysql_connector.MySQL' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:155(_check_executed)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/version/__init__.py:508(_parse_local_version)\n", - " 2 0.000 0.000 0.000 0.000 {method 'st_server_status' of '_mysql_connector.MySQL' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1445(is_valid)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:94(_process_parse_dates_argument)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:1065(soft_close)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3984(_should_partial_index)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1567(_maybe_transpose_result)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1263(enforce_inputs)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:643(__enter__)\n", - " 2 0.000 0.000 0.000 0.000 {method 'connected' of '_mysql_connector.MySQL' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/errors.py:80(__str__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:504(description)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/tz/tz.py:74(utcoffset)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:346(where)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:280(start)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:3104(_cumprod_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3211(_validate_sort_keyword)\n", - " 2 0.000 0.000 0.000 0.000 {method 'with_traceback' of 'BaseException' objects}\n", - " 1 0.000 0.000 0.000 0.000 {method 'consume_result' of '_mysql_connector.MySQL' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1355(common_dtype_categorical_compat)\n", - " 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:551()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/mysqlconnector.py:142(_extract_error_code)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:3172(_ndim_dispatcher)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_exceptions.py:15(rewrite_exception)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/shape_base.py:1181(_tile_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1989(index)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2508(_cumsum_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 {method 'more_results' of '_mysql_connector.MySQL' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1763(pre_exec)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:546(invalidated)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1986(_sort_levels_monotonic)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:2486(reset)\n", - " 1 0.000 0.000 0.000 0.000 {method 'popleft' of 'collections.deque' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/sql/elements.py:5219(construct)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1976(_shape_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:216(_validate_dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1803(handle_dbapi_exception)\n", - " 2 0.000 0.000 0.000 0.000 {method 'st_warning_count' of '_mysql_connector.MySQL' objects}\n", - " 1 0.000 0.000 0.000 0.000 {method 'pop' of 'set' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:419(_repeat_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 {method 'pop' of 'collections.deque' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:3019(return_annotation)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method builtins.globals}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1771(post_exec)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:231(__enter__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:1448(__enter__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:695(do_begin)\n", - "\n", - "\n", - "\n" - ] - } - ], - "source": [ - "## RiskManager.get_order\n", - "print(returned_order[1])" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " 2204928 function calls (2198640 primitive calls) in 13.196 seconds\n", - "\n", - " Ordered by: cumulative time\n", - "\n", - " ncalls tottime percall cumtime percall filename:lineno(function)\n", - " 2/1 0.005 0.002 13.196 13.196 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/decorators.py:40(wrapper)\n", - " 1 0.002 0.002 13.191 13.191 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:39(get_order)\n", - " 393 7.934 0.020 7.934 0.020 {method 'acquire' of '_thread.lock' objects}\n", - " 1 0.000 0.000 7.241 7.241 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:780(produce_order_candidates)\n", - " 2 0.001 0.000 7.241 3.620 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:644(chain_details)\n", - " 3/2 0.005 0.002 5.631 2.815 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_sync.py:85(retry)\n", - " 1 0.000 0.000 5.587 5.587 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:563(populate_cache)\n", - " 1 0.001 0.001 5.587 5.587 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:424(populate_cache_v2)\n", - " 2 0.001 0.000 5.118 2.559 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:381(spot)\n", - " 2 0.001 0.000 5.082 2.541 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:142(retrieve_timeseries)\n", - " 1 0.001 0.001 4.775 4.775 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:227(update_cache_with_missing_ticks)\n", - " 4 0.000 0.000 4.590 1.147 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/threads.py:4(runThreads)\n", - " 30 0.000 0.000 4.459 0.149 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1087(join)\n", - " 33 0.000 0.000 4.458 0.135 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1125(_wait_for_tstate_lock)\n", - " 4 0.000 0.000 4.457 1.114 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:646(__exit__)\n", - " 4 0.000 0.000 4.457 1.114 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:216(shutdown)\n", - " 90 0.001 0.000 3.478 0.039 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:295(wait)\n", - " 3 0.000 0.000 3.373 1.124 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/utils/decorators.py:47(wrapper)\n", - " 3 0.000 0.000 3.373 1.124 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/utils/decorators.py:35(wrapper)\n", - " 3 0.000 0.000 3.361 1.120 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/validate_call_decorator.py:58(wrapper_function)\n", - " 3 0.000 0.000 3.361 1.120 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_validate_call.py:95(__call__)\n", - " 3 0.000 0.000 3.361 1.120 {method 'validate_python' of 'pydantic_core._pydantic_core.SchemaValidator' objects}\n", - " 3 0.000 0.000 3.361 1.120 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/container.py:23(_run)\n", - " 3 0.000 0.000 3.361 1.120 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/command_runner.py:503(sync_run)\n", - " 3 0.000 0.000 3.361 1.120 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/provider/utils/helpers.py:581(run_async)\n", - " 91 0.000 0.000 3.357 0.037 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:428(result)\n", - " 9 0.000 0.000 3.357 0.373 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/from_thread.py:275(call)\n", - " 2 0.000 0.000 2.850 1.425 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/equity_price.py:28(historical)\n", - " 8 0.000 0.000 2.322 0.290 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:4789(apply)\n", - " 8 0.000 0.000 2.321 0.290 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1409(apply)\n", - " 8 0.000 0.000 2.321 0.290 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1482(apply_standard)\n", - " 9 0.000 0.000 2.309 0.257 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:891(_map_values)\n", - " 9 0.021 0.002 2.308 0.256 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:1667(map_array)\n", - " 3 0.000 0.000 2.199 0.733 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/obbject.py:85(to_df)\n", - " 3 0.000 0.000 2.199 0.733 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/obbject.py:125(to_dataframe)\n", - " 3 0.001 0.000 2.161 0.720 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/utils.py:20(basemodel_to_df)\n", - " 11580 0.122 0.000 2.118 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:673(to_datetime)\n", - " 11546 0.100 0.000 1.561 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:314(_convert_listlike_datetimes)\n", - " 1 0.000 0.000 1.469 1.469 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:464(option_chain)\n", - " 1 0.000 0.000 1.447 1.447 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:134(list_contracts)\n", - " 1 0.000 0.000 1.439 1.439 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/api.py:62(get)\n", - " 1 0.000 0.000 1.439 1.439 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/api.py:14(request)\n", - " 1 0.000 0.000 1.439 1.439 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:500(request)\n", - " 1 0.000 0.000 1.436 1.436 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:673(send)\n", - " 9 0.000 0.000 1.432 0.159 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:704(readinto)\n", - " 9 1.432 0.159 1.432 0.159 {method 'recv_into' of '_socket.socket' objects}\n", - " 1 0.000 0.000 1.426 1.426 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:613(send)\n", - " 1 0.000 0.000 1.425 1.425 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:594(urlopen)\n", - " 1 0.000 0.000 1.424 1.424 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:379(_make_request)\n", - " 1 0.000 0.000 1.424 1.424 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:481(getresponse)\n", - " 1 0.000 0.000 1.423 1.423 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1351(getresponse)\n", - " 1 0.000 0.000 1.423 1.423 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:318(begin)\n", - " 1 0.000 0.000 1.422 1.422 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:285(_read_status)\n", - " 11 0.000 0.000 1.422 0.129 {method 'readline' of '_io.BufferedReader' objects}\n", - " 11490 0.058 0.000 1.016 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:320(__new__)\n", - " 11447 0.032 0.000 0.991 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:259(_box_as_indexlike)\n", - " 1 0.000 0.000 0.898 0.898 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:310(div_yield)\n", - " 1 0.000 0.000 0.893 0.893 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:324(div_yield_history)\n", - " 11554 0.111 0.000 0.818 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:329(_from_sequence_not_strict)\n", - " 2 0.000 0.000 0.566 0.283 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/decorators.py:24(wrapper)\n", - " 1 0.000 0.000 0.562 0.562 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1377(init_query)\n", - " 1 0.000 0.000 0.561 0.561 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/database/SQLHelpers.py:343(query_database)\n", - " 1 0.000 0.000 0.561 0.561 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/database/SQLHelpers.py:100(query_database)\n", - " 1 0.000 0.000 0.561 0.561 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:570(read_sql)\n", - " 1 0.000 0.000 0.511 0.511 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/equity_fundamental.py:938(dividends)\n", - " 2 0.000 0.000 0.450 0.225 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1713(exec_driver_sql)\n", - " 2 0.000 0.000 0.450 0.225 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1791(_execute_context)\n", - " 11554 0.115 0.000 0.424 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2184(_sequence_to_dt64)\n", - "575903/575499 0.208 0.000 0.419 0.000 {built-in method builtins.isinstance}\n", - " 23058 0.074 0.000 0.406 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2428(maybe_convert_dtype)\n", - " 1 0.000 0.000 0.351 0.351 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:1779(read_query)\n", - " 2 0.000 0.000 0.320 0.160 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1850(_exec_single_context)\n", - " 2 0.000 0.000 0.317 0.159 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:940(do_execute)\n", - " 2 0.000 0.000 0.317 0.159 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:311(execute)\n", - " 2 0.000 0.000 0.316 0.158 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/opentelemetry/context_propagation.py:93(wrapper)\n", - " 2 0.000 0.000 0.316 0.158 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:690(cmd_query)\n", - " 2 0.316 0.158 0.316 0.158 {method 'query' of '_mysql_connector.MySQL' objects}\n", - " 1 0.000 0.000 0.312 0.312 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:1655(execute)\n", - " 12108 0.030 0.000 0.253 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5373(__getitem__)\n", - " 300 0.006 0.000 0.249 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4062(__getitem__)\n", - " 11600 0.030 0.000 0.220 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:373(__getitem__)\n", - " 23092 0.058 0.000 0.192 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1163(is_float_dtype)\n", - " 11602 0.029 0.000 0.187 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:278(__getitem__)\n", - " 11555 0.044 0.000 0.182 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2425(ensure_arraylike_for_datetimelike)\n", - " 19 0.001 0.000 0.167 0.009 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:130()\n", - " 19 0.007 0.000 0.166 0.009 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:835(liquidity_check)\n", - " 38 0.002 0.000 0.164 0.004 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/utils.py:26(default_timestamp)\n", - " 117 0.002 0.000 0.156 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4130(_getitem_bool_array)\n", - " 11508 0.083 0.000 0.155 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:545(_box_func)\n", - " 98250 0.064 0.000 0.144 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/generic.py:42(_instancecheck)\n", - " 11489 0.133 0.000 0.143 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2354(objects_to_datetime64)\n", - " 1 0.000 0.000 0.138 0.138 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:2037(has_table)\n", - " 1 0.000 0.000 0.138 0.138 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:400(has_table)\n", - " 1 0.000 0.000 0.138 0.138 :1(has_table)\n", - " 1 0.000 0.000 0.138 0.138 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:78(cache)\n", - " 1 0.000 0.000 0.137 0.137 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/base.py:2732(has_table)\n", - " 23389 0.052 0.000 0.134 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1198(is_bool_dtype)\n", - " 4 0.000 0.000 0.131 0.033 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:583(map)\n", - " 4 0.000 0.000 0.130 0.033 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:608()\n", - " 76 0.001 0.000 0.130 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:161(submit)\n", - " 2 0.000 0.000 0.130 0.065 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1523(_init_statement)\n", - " 2 0.000 0.000 0.130 0.065 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1736(create_cursor)\n", - " 2 0.000 0.000 0.130 0.065 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1757(create_default_cursor)\n", - " 2 0.000 0.000 0.130 0.065 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1483(cursor)\n", - " 2 0.000 0.000 0.130 0.065 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:733(cursor)\n", - " 2 0.001 0.001 0.130 0.065 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:387(is_connected)\n", - " 2 0.128 0.064 0.128 0.064 {method 'ping' of '_mysql_connector.MySQL' objects}\n", - " 76 0.001 0.000 0.128 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:180(_adjust_thread_count)\n", - " 30 0.000 0.000 0.124 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:945(start)\n", - " 30 0.000 0.000 0.122 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:611(wait)\n", - " 34665 0.042 0.000 0.120 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1375(_is_dtype)\n", - " 19 0.001 0.000 0.118 0.006 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:140()\n", - " 19 0.002 0.000 0.117 0.006 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:740(available_close_check)\n", - " 66 0.001 0.000 0.117 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4142(_take_with_is_copy)\n", - " 67 0.002 0.000 0.106 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4027(take)\n", - " 72 0.002 0.000 0.103 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:869(take)\n", - " 31 0.001 0.000 0.095 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:694(__init__)\n", - " 152/109 0.001 0.000 0.094 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/common.py:62(new_method)\n", - " 12235 0.067 0.000 0.084 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:649(_simple_new)\n", - " 168/157 0.020 0.000 0.084 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:389(__init__)\n", - " 83 0.002 0.000 0.083 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:623(reindex_indexer)\n", - " 98250 0.062 0.000 0.080 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/generic.py:37(_check)\n", - " 11519 0.016 0.000 0.075 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:536(is_string_dtype)\n", - " 11503 0.043 0.000 0.075 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:126(_guess_datetime_format_for_array)\n", - " 96/74 0.002 0.000 0.074 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4271(__setitem__)\n", - " 1 0.000 0.000 0.072 0.072 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:1643(__exit__)\n", - " 1 0.000 0.000 0.072 0.072 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:607(close)\n", - " 1 0.000 0.000 0.072 0.072 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:558(__exit__)\n", - " 1 0.000 0.000 0.072 0.072 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:234(__exit__)\n", - " 1 0.000 0.000 0.072 0.072 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1218(close)\n", - " 1 0.000 0.000 0.072 0.072 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2576(close)\n", - " 1 0.000 0.000 0.072 0.072 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2725(_do_close)\n", - " 1 0.000 0.000 0.072 0.072 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2709(_close_impl)\n", - " 1 0.000 0.000 0.072 0.072 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2703(_connection_rollback_impl)\n", - " 1 0.000 0.000 0.072 0.072 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1113(_rollback_impl)\n", - " 1 0.000 0.000 0.072 0.072 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:698(do_rollback)\n", - " 1 0.000 0.000 0.072 0.072 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:578(rollback)\n", - " 1 0.072 0.072 0.072 0.072 {method 'rollback' of '_mysql_connector.MySQL' objects}\n", - " 93 0.001 0.000 0.071 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4514(_set_item)\n", - " 38 0.047 0.001 0.067 0.002 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/utils.py:32()\n", - " 23706 0.033 0.000 0.066 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1434(_is_dtype_type)\n", - " 574/566 0.005 0.000 0.064 0.000 {built-in method builtins.all}\n", - " 11752 0.062 0.000 0.062 0.000 {built-in method numpy.array}\n", - " 11929 0.021 0.000 0.061 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7688(maybe_extract_name)\n", - " 93 0.002 0.000 0.059 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4481(_set_item_mgr)\n", - " 23581 0.056 0.000 0.058 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:645(__iter__)\n", - " 759 0.010 0.000 0.056 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:517(sanitize_array)\n", - " 3 0.011 0.004 0.056 0.019 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/utils.py:30()\n", - " 11568 0.050 0.000 0.055 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:304(_simple_new)\n", - " 39 0.001 0.000 0.055 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6110(_cmp_method)\n", - " 92 0.001 0.000 0.055 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1176(__getitem__)\n", - " 58858 0.028 0.000 0.055 0.000 :117(__instancecheck__)\n", - " 59 0.001 0.000 0.054 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6201(_construct_result)\n", - " 1 0.000 0.000 0.053 0.053 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:619(pre_process_data)\n", - " 1 0.001 0.001 0.052 0.052 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:292(drop_cache_duplicates)\n", - " 262 0.008 0.000 0.052 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:475(__new__)\n", - " 87 0.004 0.000 0.051 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1347(insert)\n", - " 65 0.001 0.000 0.049 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:687()\n", - " 21 0.000 0.000 0.049 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:42(__ne__)\n", - " 47 0.001 0.000 0.049 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:209(_maybe_cache)\n", - " 58054 0.033 0.000 0.048 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1399(_get_dtype)\n", - " 317 0.003 0.000 0.048 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4626(_get_item_cache)\n", - " 10 0.001 0.000 0.048 0.005 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:837(change_to_last_busday)\n", - " 422 0.009 0.000 0.046 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1287(take_nd)\n", - " 89 0.000 0.000 0.046 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1719(_getitem_axis)\n", - " 11525 0.008 0.000 0.044 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/main.py:352(model_dump)\n", - " 79 0.001 0.000 0.044 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1756(_get_slice_axis)\n", - " 291 0.005 0.000 0.041 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:317(apply)\n", - " 292 0.002 0.000 0.041 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:3983(_ixs)\n", - " 11549 0.040 0.000 0.040 0.000 {method 'view' of 'numpy.generic' objects}\n", - " 532/527 0.004 0.000 0.039 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:59(take_nd)\n", - " 3 0.000 0.000 0.039 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1780(apply)\n", - " 1 0.000 0.000 0.038 0.038 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:194(_wrap_result)\n", - " 75 0.037 0.000 0.038 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1580(construct_1d_object_array_from_listlike)\n", - " 6 0.000 0.000 0.038 0.006 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:506(nested_data_to_arrays)\n", - " 6 0.000 0.000 0.037 0.006 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:793(to_arrays)\n", - " 432 0.002 0.000 0.036 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6284(__getattr__)\n", - " 11525 0.035 0.000 0.036 0.000 {method 'to_python' of 'pydantic_core._pydantic_core.SchemaSerializer' objects}\n", - "161550/161479 0.034 0.000 0.036 0.000 {built-in method builtins.getattr}\n", - " 12 0.001 0.000 0.036 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:423(dict_to_mgr)\n", - " 1 0.000 0.000 0.035 0.035 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:319(update_spot_cache)\n", - " 82 0.001 0.000 0.035 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6662(copy)\n", - " 523 0.011 0.000 0.034 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:120(_take_nd_ndarray)\n", - " 3 0.000 0.000 0.034 0.011 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1850(_python_apply_general)\n", - " 3 0.000 0.000 0.034 0.011 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/obbject.py:167(is_list_of_basemodel)\n", - " 78 0.009 0.000 0.033 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4361(_slice)\n", - " 26 0.001 0.000 0.033 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5993(set_index)\n", - " 11519 0.024 0.000 0.033 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:572(condition)\n", - " 11528 0.005 0.000 0.031 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/obbject.py:168()\n", - " 96 0.002 0.000 0.031 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:557(copy)\n", - " 3 0.000 0.000 0.031 0.010 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/generic.py:1558(_wrap_applied_output)\n", - " 47 0.004 0.000 0.031 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:149(should_cache)\n", - " 65 0.010 0.000 0.030 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:708(_slice_take_blocks_ax0)\n", - " 87 0.003 0.000 0.030 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6956(insert)\n", - "15142/11342 0.022 0.000 0.028 0.000 {built-in method builtins.len}\n", - " 58858 0.027 0.000 0.027 0.000 {built-in method _abc._abc_instancecheck}\n", - " 81/42 0.000 0.000 0.027 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:50(__le__)\n", - " 2 0.000 0.000 0.027 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:9492(pivot_table)\n", - " 2 0.000 0.000 0.026 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/pivot.py:61(pivot_table)\n", - " 2 0.000 0.000 0.026 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/pivot.py:118(__internal_pivot_table)\n", - " 41 0.003 0.000 0.026 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7164(_cmp_method)\n", - " 853 0.026 0.000 0.026 0.000 {method 'reduce' of 'numpy.ufunc' objects}\n", - " 2 0.000 0.000 0.025 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:10170(apply)\n", - " 2 0.000 0.000 0.025 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:864(apply)\n", - " 2 0.000 0.000 0.025 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1061(apply_standard)\n", - " 39/12 0.001 0.000 0.025 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6463(astype)\n", - " 2 0.000 0.000 0.025 0.012 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1070(apply_series_generator)\n", - " 1878 0.015 0.000 0.024 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6301(__setattr__)\n", - " 151 0.000 0.000 0.024 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1496(items)\n", - " 11441 0.012 0.000 0.024 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/utils.py:48()\n", - " 11763 0.016 0.000 0.023 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:576(tz)\n", - " 4 0.000 0.000 0.023 0.006 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:10803(where)\n", - " 4 0.000 0.000 0.023 0.006 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:10615(_where)\n", - " 175 0.000 0.000 0.023 0.000 {built-in method builtins.next}\n", - " 19 0.000 0.000 0.023 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:725()\n", - " 23599 0.017 0.000 0.022 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:123()\n", - " 342/38 0.001 0.000 0.022 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:128(deepcopy)\n", - " 38 0.000 0.000 0.022 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:227(_deepcopy_dict)\n", - " 83/44 0.001 0.000 0.022 0.000 {built-in method _operator.le}\n", - " 106 0.002 0.000 0.022 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:674(_with_infer)\n", - " 121 0.001 0.000 0.021 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2632(check_bool_indexer)\n", - " 41 0.007 0.000 0.021 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:977(_cmp_method)\n", - " 38 0.001 0.000 0.021 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:794(generate_option_tick_new)\n", - " 1 0.000 0.000 0.021 0.021 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:160(_convert_arrays_to_dataframe)\n", - " 737 0.015 0.000 0.021 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6236(__finalize__)\n", - " 11528 0.011 0.000 0.021 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_model_construction.py:268(__instancecheck__)\n", - " 87 0.000 0.000 0.021 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:132(__enter__)\n", - " 273 0.012 0.000 0.021 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:842(_engine)\n", - "13313/13293 0.012 0.000 0.021 0.000 {built-in method numpy.asarray}\n", - " 5 0.007 0.001 0.020 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:891(_list_of_dict_to_arrays)\n", - " 2 0.000 0.000 0.020 0.010 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:78(method)\n", - " 2 0.000 0.000 0.020 0.010 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:736(map)\n", - " 108 0.002 0.000 0.019 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:666(_parse)\n", - " 523 0.003 0.000 0.019 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:564(_take_preprocess_indexer_and_fill_value)\n", - " 288 0.007 0.000 0.019 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:419(check_array_indexer)\n", - " 153 0.002 0.000 0.019 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1863(from_array)\n", - " 283 0.002 0.000 0.019 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4608(_box_col_values)\n", - " 38 0.002 0.000 0.018 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:127(get_option_specifics_from_key)\n", - " 57 0.001 0.000 0.018 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:456(_array_strptime_with_fallback)\n", - " 57 0.001 0.000 0.018 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:760(parse_option_tick)\n", - " 192 0.012 0.000 0.018 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1157(maybe_infer_to_datetimelike)\n", - " 11554 0.018 0.000 0.018 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2310(_construct_from_dt64_naive)\n", - " 1 0.000 0.000 0.017 0.017 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:139(_parse_date_columns)\n", - " 4 0.000 0.000 0.017 0.004 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Context.py:16(Context)\n", - " 304 0.017 0.000 0.017 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:182(_deepcopy_atomic)\n", - " 6 0.000 0.000 0.017 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:928(_finalize_columns_and_data)\n", - " 12564 0.014 0.000 0.017 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:416(extract_array)\n", - " 7910 0.007 0.000 0.017 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:173(search)\n", - " 7 0.000 0.000 0.017 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:1006(convert_object_array)\n", - " 7 0.000 0.000 0.017 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:1070()\n", - " 482 0.017 0.000 0.017 0.000 {method 'copy' of 'numpy.ndarray' objects}\n", - " 33 0.016 0.000 0.017 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:1028(convert)\n", - " 23075 0.012 0.000 0.016 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1194()\n", - " 19 0.000 0.000 0.016 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:96(arrays_to_mgr)\n", - " 3 0.000 0.000 0.016 0.005 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:84(__init__)\n", - " 2 0.000 0.000 0.016 0.008 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4320(_setitem_array)\n", - " 12719 0.012 0.000 0.016 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:334(is_hashable)\n", - " 2 0.000 0.000 0.016 0.008 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:196(where)\n", - " 129 0.010 0.000 0.015 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_strptime.py:564(_strptime_datetime)\n", - " 82 0.001 0.000 0.015 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5425(_getitem_slice)\n", - " 11567 0.015 0.000 0.015 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:103(tz_to_dtype)\n", - " 72 0.000 0.000 0.015 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:586()\n", - " 136 0.001 0.000 0.015 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5437(_can_hold_identifiers_and_holds_name)\n", - " 144 0.000 0.000 0.015 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:583(copy_func)\n", - " 57 0.000 0.000 0.014 0.000 {built-in method strptime}\n", - " 27 0.000 0.000 0.014 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4477(__delitem__)\n", - " 774 0.008 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5323(__contains__)\n", - " 10 0.000 0.000 0.014 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:826(is_USholiday)\n", - " 8 0.000 0.000 0.014 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6538(dropna)\n", - " 59859 0.014 0.000 0.014 0.000 {built-in method builtins.hasattr}\n", - " 13 0.000 0.000 0.014 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:821(date_range)\n", - " 13 0.001 0.000 0.014 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:397(_generate_range)\n", - " 81 0.001 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3122(duplicated)\n", - " 273 0.001 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:773(_view)\n", - " 27 0.001 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1434(idelete)\n", - " 452 0.002 0.000 0.013 0.000 {method 'any' of 'numpy.ndarray' objects}\n", - " 133 0.000 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1010(view)\n", - " 426 0.012 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:551(maybe_promote)\n", - " 23599 0.012 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:121(classes)\n", - " 3 0.000 0.000 0.012 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/validate_call_decorator.py:28(validate_call)\n", - " 3 0.000 0.000 0.012 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/validate_call_decorator.py:51(validate)\n", - " 3 0.000 0.000 0.012 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_validate_call.py:26(__init__)\n", - " 246 0.001 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:769(_try_cast)\n", - " 23 0.000 0.000 0.012 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1689(_getitem_tuple)\n", - " 94 0.001 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1782(_consolidate_inplace)\n", - " 581 0.001 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7593(ensure_index)\n", - " 114 0.002 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2529(__setitem__)\n", - " 36 0.001 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3820(get_indexer)\n", - " 216 0.002 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:97(is_bool_indexer)\n", - " 454 0.001 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:55(_any)\n", - " 1 0.000 0.000 0.011 0.011 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/decorators.py:10(wrapper)\n", - " 283 0.008 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1012(iget)\n", - " 53 0.002 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:823(take)\n", - " 491 0.004 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:137(is_object_dtype)\n", - " 11858 0.011 0.000 0.011 0.000 {built-in method numpy.datetime_data}\n", - " 6 0.011 0.002 0.011 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:532(treat_as_nested)\n", - " 49505 0.010 0.000 0.011 0.000 {built-in method builtins.issubclass}\n", - " 75 0.007 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1146(take)\n", - " 57 0.001 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1200(maybe_cast_to_datetime)\n", - " 2 0.000 0.000 0.010 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6731(drop_duplicates)\n", - " 11 0.000 0.000 0.010 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:1022(bdate_range)\n", - " 38 0.001 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6519(sum)\n", - " 12 0.000 0.000 0.010 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:468()\n", - " 1 0.000 0.000 0.010 0.010 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:423(__init__)\n", - " 2 0.000 0.000 0.010 0.005 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/utils.py:18(__init__)\n", - " 638 0.002 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:339(_from_mgr)\n", - " 4 0.000 0.000 0.010 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:890(content)\n", - " 8 0.000 0.000 0.010 0.001 {method 'join' of 'bytes' objects}\n", - " 7 0.000 0.000 0.010 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:816(generate)\n", - " 7 0.000 0.000 0.010 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:1038(stream)\n", - " 6 0.000 0.000 0.010 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:910(read)\n", - " 8347 0.007 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:272(_compile)\n", - " 292 0.001 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:678(_constructor_sliced_from_mgr)\n", - " 552 0.003 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1596(pandas_dtype)\n", - " 147 0.004 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2313(is_unique)\n", - " 522 0.010 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2712(_generate_range)\n", - " 7 0.000 0.000 0.010 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:858(_raw_read)\n", - " 108 0.001 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:199(split)\n", - " 1 0.000 0.000 0.010 0.010 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/utils.py:47(bus_range)\n", - " 11569 0.009 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2148(_creso)\n", - " 11802 0.008 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:915()\n", - " 7 0.000 0.000 0.009 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:801(_fp_read)\n", - " 68 0.003 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:141(equals)\n", - " 7 0.000 0.000 0.009 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:457(read)\n", - " 6 0.000 0.000 0.009 0.002 {method 'read' of '_io.BufferedReader' objects}\n", - " 8 0.000 0.000 0.009 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6186(_get_indexer_strict)\n", - " 837 0.007 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:278(__init__)\n", - " 11 0.000 0.000 0.009 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:674(astype)\n", - " 27/3 0.000 0.000 0.009 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:620(generate_schema)\n", - " 11565 0.009 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:529(is_string_or_object_np_dtype)\n", - " 38 0.000 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12498(sum)\n", - " 42/3 0.000 0.000 0.009 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:906(_generate_schema_inner)\n", - " 42/3 0.000 0.000 0.009 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:931(match_type)\n", - " 79 0.000 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4191(_validate_positional_slice)\n", - " 59 0.001 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6418(_reduce)\n", - " 3 0.000 0.000 0.009 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1871(_callable_schema)\n", - " 7 0.008 0.001 0.009 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:447(astype)\n", - " 38 0.001 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12459(_min_count_stat_function)\n", - " 18 0.000 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1004(_getitem_tuple_same_dim)\n", - " 237 0.009 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6685(_validate_indexer)\n", - " 65 0.000 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:325(_from_sequence)\n", - " 12334 0.008 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:831(_reset_identity)\n", - " 11555 0.008 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2063(_maybe_pin_freq)\n", - " 114 0.000 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1422(_set_value)\n", - " 165 0.000 0.000 0.008 0.000 {method 'max' of 'numpy.ndarray' objects}\n", - " 12 0.000 0.000 0.008 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5343(reindex)\n", - " 114 0.001 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1415(_set_values)\n", - " 12 0.000 0.000 0.008 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4323(reindex)\n", - " 270 0.001 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:807(_set_axis)\n", - " 165 0.000 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:39(_amax)\n", - " 99 0.006 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:239(maybe_convert_indices)\n", - " 993 0.001 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:189(__next__)\n", - " 103 0.001 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5242(_sanitize_column)\n", - " 19 0.000 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2121(create_block_manager_from_column_arrays)\n", - " 2 0.000 0.000 0.008 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/generic.py:1420(aggregate)\n", - " 7 0.000 0.000 0.008 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:157(concat)\n", - " 7 0.000 0.000 0.008 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4796(_drop_axis)\n", - " 2 0.000 0.000 0.008 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6828(duplicated)\n", - " 2 0.000 0.000 0.008 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:172(agg)\n", - " 2 0.000 0.000 0.008 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:558(apply_str)\n", - " 18/17 0.000 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:38(__eq__)\n", - " 15 0.000 0.000 0.008 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1574(_generate_parameter_schema)\n", - " 12077 0.008 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:152(cast_scalar_indexer)\n", - " 2 0.000 0.000 0.007 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:681(_apply_str)\n", - " 1 0.000 0.000 0.007 0.007 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:848(resample)\n", - " 333/320 0.001 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:101(isna)\n", - " 13011 0.007 0.000 0.007 0.000 {built-in method __new__ of type object at 0x101405898}\n", - " 87 0.003 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5368(insert)\n", - " 1 0.000 0.000 0.007 0.007 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:263(organize_data_for_query)\n", - " 5 0.000 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6239(reset_index)\n", - " 993 0.005 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:77(get_token)\n", - " 491 0.005 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/extension.py:67(fget)\n", - " 7 0.000 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:622(get_result)\n", - " 333/320 0.002 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:184(_isna)\n", - " 18 0.001 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:596(_homogenize)\n", - " 5 0.000 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6997(sort_values)\n", - " 16 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6162(get_indexer_for)\n", - " 4 0.000 0.000 0.007 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5614(_reindex_axes)\n", - " 279 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:707(dtype)\n", - " 39 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:421(astype)\n", - " 43 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:610(factorize)\n", - " 38 0.001 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:76(_f)\n", - " 11439 0.007 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/utils.py:49()\n", - " 7 0.000 0.000 0.006 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:11603(any)\n", - " 366 0.003 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:346(_name_get)\n", - " 26 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7553(ensure_index_from_sequences)\n", - " 8 0.000 0.000 0.006 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12169(_logical_func)\n", - " 6 0.000 0.000 0.006 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5359(reindex)\n", - " 279 0.006 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1993(dtype)\n", - " 14 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2259(_consolidate)\n", - " 20 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:1371(_arith_method)\n", - " 8/7 0.000 0.000 0.006 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:11435(_reduce)\n", - " 53 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:387(apply)\n", - " 15 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2066(_apply_annotations)\n", - " 351 0.004 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:253(fill_value)\n", - " 23108 0.006 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2570(_validate_tz_from_dtype)\n", - " 80 0.001 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:106(_ensure_data)\n", - " 294 0.001 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:659(_constructor_from_mgr)\n", - " 12 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:1364(_duplicated)\n", - " 41 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:524(_validate_comparison_value)\n", - " 129 0.000 0.000 0.006 0.000 {method 'all' of 'numpy.ndarray' objects}\n", - " 12 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/base.py:1170(duplicated)\n", - " 249 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:145(_get_option)\n", - " 15 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6133(_arith_method)\n", - " 5 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:214(_obj_with_exclusions)\n", - " 114 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:372(setitem)\n", - " 59 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:288(comparison_op)\n", - " 5 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:743(group_info)\n", - " 129 0.003 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_strptime.py:309(_strptime)\n", - " 15 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_schema_generation_shared.py:82(__call__)\n", - " 5 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:758(_get_compressed_codes)\n", - " 283 0.002 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1471(_set_as_cached)\n", - " 15 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2085(inner_handler)\n", - " 57 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:723(astype)\n", - " 131 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:61(_all)\n", - " 13012 0.005 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:551(dtype)\n", - " 24728 0.005 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:2287(cast)\n", - " 1 0.000 0.000 0.005 0.005 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:310(__init__)\n", - " 6 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:371(__init__)\n", - " 5 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:9041(groupby)\n", - " 10 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5095(insert)\n", - " 42 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:389(new_func)\n", - " 477 0.003 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3777(get_loc)\n", - " 5 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1296(__init__)\n", - " 420 0.002 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2645(maybe_coerce_values)\n", - " 296 0.002 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:82(shape)\n", - " 154 0.002 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:875(_parse_numeric_token)\n", - " 1 0.001 0.001 0.005 0.005 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:511()\n", - " 94 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1764(is_consolidated)\n", - " 350 0.001 0.000 0.005 0.000 {built-in method builtins.any}\n", - " 5 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:846(get_grouper)\n", - " 144 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:511(_validate_dtype)\n", - " 2 0.000 0.000 0.005 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:9863(unstack)\n", - " 2 0.000 0.000 0.005 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:489(unstack)\n", - " 202 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4402(_check_setitem_copy)\n", - " 144 0.002 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:231(asarray_tuplesafe)\n", - " 86 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1412(_insert_update_blklocs_and_blknos)\n", - " 43 0.002 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:548(factorize_array)\n", - " 2 0.000 0.000 0.004 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:525(_unstack_frame)\n", - " 12 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:994(duplicated)\n", - " 270 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:236(set_axis)\n", - " 361 0.003 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:274(full)\n", - "13541/13527 0.004 0.000 0.004 0.000 {built-in method builtins.hash}\n", - " 2410 0.003 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:909(__len__)\n", - " 11 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6432(dtypes)\n", - " 39 0.002 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2276(_merge_blocks)\n", - " 39 0.004 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:534(_scalar_from_string)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:868(read_csv)\n", - " 7 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7031(drop)\n", - " 38 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:455(newfunc)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:583(_read)\n", - " 1323 0.004 0.000 0.004 0.000 {built-in method numpy.empty}\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:2365(mean)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:9382(resample)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1957(_cython_agg_general)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:2045(get_resampler)\n", - " 157 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2703(new_block_2d)\n", - " 11 0.000 0.000 0.004 0.000 {built-in method builtins.print}\n", - " 3191 0.004 0.000 0.004 0.000 {method 'get' of 'dict' objects}\n", - " 6 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/from_thread.py:455(start_blocking_portal)\n", - " 38 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:604(nansum)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:2210(_get_resampler)\n", - " 22 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:655(write)\n", - " 955 0.002 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:481(ensure_wrapped_if_datetimelike)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:163(__init__)\n", - " 3 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1397(_getitem_axis)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:246(_get_binner)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:1737(_get_binner_for_time)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:2285(_get_time_bins)\n", - " 529 0.002 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:180(blknos)\n", - " 68 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:262(_get_hashtable_algo)\n", - " 3 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1205(_getbool_axis)\n", - " 28 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6925(f)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:683(one_off_save)\n", - " 1 0.001 0.001 0.004 0.004 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1188(bulk_one_off_save)\n", - " 314 0.004 0.000 0.004 0.000 {cyfunction Timestamp.strftime at 0x10d6ce400}\n", - " 166 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/ipkernel.py:775(_clean_thread_parent_frames)\n", - " 15 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:582(get_loc)\n", - " 87 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1393(moveaxis)\n", - " 331 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:790(copy)\n", - " 12 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1322(__contains__)\n", - " 11554 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2514(_validate_dt64_dtype)\n", - " 36 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:124(maybe_convert_platform)\n", - " 227 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1519(construct_1d_arraylike_from_scalar)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:2264(count)\n", - " 94 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1772(_consolidate_check)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4360(_iset_not_inplace)\n", - " 12 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2982(get_loc)\n", - " 10 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:822(is_busday)\n", - " 33 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6679(_maybe_cast_listlike_indexer)\n", - " 22 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:577(_schedule_flush)\n", - " 86 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1402(_insert_update_mgr_locs)\n", - " 3 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:259(schedule)\n", - " 12 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:3308(_get_level_indexer)\n", - " 57 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1240(_ensure_nanosecond_dtype)\n", - " 3 0.003 0.001 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/zmq/sugar/socket.py:621(send)\n", - " 270 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:86(_validate_set_axis)\n", - " 130 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/base.py:549(find)\n", - " 172 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5562(append)\n", - " 30 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6957()\n", - " 95 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:131(filterwarnings)\n", - " 14 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:558(_parse_with_reso)\n", - " 14 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:275(_parse_with_reso)\n", - " 24 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:220(__init__)\n", - " 2 0.000 0.000 0.003 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5433(drop)\n", - " 19 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2190(_form_blocks)\n", - " 2 0.000 0.000 0.003 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4757(drop)\n", - " 24 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:373(_finalize)\n", - " 259 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:127(_get_single_key)\n", - " 12 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2957(_get_loc_single_level_index)\n", - " 2 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1450(grouped_reduce)\n", - " 12 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:550(validate_categories)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1907(read)\n", - " 227 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:784(name)\n", - " 5 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_decorators.py:325(wrapper)\n", - " 53 0.000 0.000 0.003 0.000 {method 'sum' of 'numpy.ndarray' objects}\n", - " 574 0.003 0.000 0.003 0.000 {method 'view' of 'numpy.ndarray' objects}\n", - " 25 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:325(__new__)\n", - " 2 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:110(__init__)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager_processes.py:237(schedule)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager.py:328(_schedule)\n", - " 25 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:307(unique)\n", - " 23 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:2344(unique)\n", - " 657 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:831(_values)\n", - " 218 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5170(_get_engine_target)\n", - " 884 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:84()\n", - " 2 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:301(lexsort_indexer)\n", - " 11 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:607(_init_dict)\n", - " 25 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:427(unique_with_mask)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:750(merge_environment_settings)\n", - " 23 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:1019(unique)\n", - " 5 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:7282(sort_index)\n", - " 5 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5290(sort_index)\n", - " 53 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:47(_sum)\n", - " 12 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:515(view)\n", - " 3 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:3951(T)\n", - " 8 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:7142(fillna)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:826(get_environ_proxies)\n", - " 3 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:3767(transpose)\n", - " 55 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:800(_generate_schema_from_property)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1823(_setup_result_proxy)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1893(_setup_dml_or_text_result)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:474(from_arrays)\n", - " 57 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:189(_na_arithmetic_op)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:1422(__init__)\n", - " 5 0.003 0.001 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:922()\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:2063(to_dict)\n", - " 12 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:117(view)\n", - " 1922 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/__init__.py:34(using_copy_on_write)\n", - " 3 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1610(_log)\n", - " 13/11 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1040(_match_generic_type)\n", - " 4 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:7894(_cmp_method)\n", - " 242 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_strptime.py:26(_getlang)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:1485(_init_metadata)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:347(__init__)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/methods/to_dict.py:78(to_dict)\n", - " 8 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:380(notna)\n", - " 93/91 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:1131(take)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1971(array_func)\n", - " 3 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:897(apply_groupwise)\n", - " 523 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:325(_get_take_nd_function)\n", - " 7949 0.003 0.000 0.003 0.000 {method 'search' of 're.Pattern' objects}\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:3048(factorize_from_iterables)\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:3069()\n", - " 36 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3955(_get_indexer)\n", - " 4 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:622(_get_splitter)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:3005(factorize_from_iterable)\n", - " 793 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/flags.py:55(allows_duplicate_labels)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:496(_merge_cursor_description)\n", - " 114 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1373(setitem)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:625()\n", - " 474 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2765(check_dict_or_set_indexers)\n", - " 7 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:699(new_axes)\n", - " 116 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1495(_maybe_update_cacher)\n", - " 7 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:702()\n", - " 222 0.001 0.000 0.002 0.000 {built-in method builtins.sum}\n", - " 13 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1316(view)\n", - " 285 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2716(new_block)\n", - " 216 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:182(_add_filter)\n", - " 57 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/astype.py:191(astype_array_safe)\n", - " 36 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6394(_should_compare)\n", - " 13 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1248(copy)\n", - " 6 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:208(__truediv__)\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1636(handle)\n", - " 30 0.002 0.000 0.002 0.000 {built-in method _thread.start_new_thread}\n", - " 9 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/from_thread.py:308(start_task_soon)\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1690(callHandlers)\n", - " 65 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2320(_preprocess_slice_or_indexer)\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:589(clean_schema)\n", - " 141 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2518(__getitem__)\n", - " 87 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:141(__exit__)\n", - " 20 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1524(where)\n", - " 15 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:689(codes)\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:965(handle)\n", - " 242 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/locale.py:594(getlocale)\n", - " 46 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:261(_isna_array)\n", - " 6 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:5136(reindex)\n", - " 21 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_exceptions.py:34(find_stack_level)\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/handlers.py:65(emit)\n", - " 9 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:777(_codes_and_uniques)\n", - " 63 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:157(take)\n", - " 79 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1778()\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1216(emit)\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1098(emit)\n", - " 250 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1571(validate_all_hashable)\n", - " 1 0.001 0.001 0.002 0.002 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/utils.py:54()\n", - " 9 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:5773(isna)\n", - " 6 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/_backends/_asyncio.py:980(_spawn_task_from_thread)\n", - " 26 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:838(_cleanup)\n", - " 11 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1369(_union_schema)\n", - " 9 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:8693(isna)\n", - " 87 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1774(get_result_processor)\n", - " 134/133 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:390(_get_getitem_freq)\n", - " 630 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2795(extend_blocks)\n", - " 170 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:163(match)\n", - " 6 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/_backends/_asyncio.py:2483(run_sync_from_thread)\n", - " 285 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:319(asi8)\n", - " 356 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:467(__enter__)\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:7918(_dispatch_frame_op)\n", - " 5 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:59(get_indexer_indexer)\n", - " 87 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/sql/type_api.py:908(_cached_result_processor)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:9114(asfreq)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:2794(asfreq)\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1087(flush)\n", - " 366 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:330(_name_includes_bit_suffix)\n", - " 168 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:273(is_dict_like)\n", - " 9 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:744(_group_index)\n", - " 657 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2004(internal_values)\n", - " 88 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/weakref.py:414(__getitem__)\n", - " 3 0.002 0.001 0.002 0.001 {method 'flush' of '_io.TextIOWrapper' objects}\n", - " 32 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:12675(_reindex_for_setitem)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2499(getproxies_environment)\n", - " 30 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/ipkernel.py:768(init_closure)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/generic.py:2002(_get_data_to_aggregate)\n", - " 53 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:2077(__contains__)\n", - " 532 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:696(_sanitize_ndim)\n", - " 18 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:402(walk_core_schema)\n", - " 121 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:166(simplefilter)\n", - " 706 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1392()\n", - " 51 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:664(_constructor_from_mgr)\n", - " 68 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:280(_check_object_for_strings)\n", - " 7 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:717(_get_concat_axis)\n", - " 76 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:440(acquire)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:279()\n", - " 120 0.000 0.000 0.002 0.000 {built-in method builtins.sorted}\n", - " 360/18 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:196(walk)\n", - " 360/18 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:199(_walk)\n", - " 837 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/flags.py:51(__init__)\n", - " 78 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1095(__getitem__)\n", - " 45 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:71(_wrapreduction)\n", - " 174 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1330(normalize_axis_tuple)\n", - " 123 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:274(make_block)\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:200(__mul__)\n", - " 427 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:734(name)\n", - " 18 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:392(handle_call_schema)\n", - " 16 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:305(_isna_string_dtype)\n", - " 182 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:592(_get_block_manager_axis)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1491(warning)\n", - " 204 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:225(compile)\n", - " 259 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:635(_get_root)\n", - " 435 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:292(make_block_same_class)\n", - " 30 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:856(__init__)\n", - " 344 0.000 0.000 0.002 0.000 :859(__iter__)\n", - " 7 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1483(reduce)\n", - " 18 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:379(handle_arguments_schema)\n", - " 217 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1220(_get_value)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:212(putmask)\n", - " 12 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5663(_reindex_with_indexers)\n", - " 59 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:836(_isnan)\n", - " 16 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4470(_iset_item_mgr)\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:687(codes)\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:690()\n", - " 5 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:68(__and__)\n", - " 57 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/computation/expressions.py:226(evaluate)\n", - " 12223 0.002 0.000 0.002 0.000 {method 'keys' of 'dict' objects}\n", - " 5 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6123(_logical_method)\n", - " 110 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2520(get_schema_or_ref)\n", - " 343 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:219(_can_consolidate)\n", - " 21 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:219(vstack)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:765(should_bypass_proxies)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:191(_make_selectors)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:231(get_result)\n", - " 21 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1247(series_generator)\n", - " 469 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2674(get_block_type)\n", - " 92 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:745(_get_engine_target)\n", - " 18 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1066(iset)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:521(ffill)\n", - " 328 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1253(iget)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:1801(_upsample)\n", - " 66 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:273(__call__)\n", - " 404 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:586(_get_axis)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:648()\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2672(proxy_bypass)\n", - " 80 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:612(result_iterator)\n", - " 9 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:122(get_group_index)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1633(as_array)\n", - " 737 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/flags.py:87(allows_duplicate_labels)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:812(_cython_operation)\n", - " 57 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/computation/expressions.py:67(_evaluate_standard)\n", - " 156 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2264()\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:12590(values)\n", - " 242 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/locale.py:479(_parse_localename)\n", - " 23 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:957(_validate_tuple_indexer)\n", - " 23 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1032(_getitem_lowerdim)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2016(_sort_levels_monotonic)\n", - " 28 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/putmask.py:101(validate_putmask)\n", - " 128 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:243(__init__)\n", - " 409 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:673(na_value_for_dtype)\n", - " 209 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numerictypes.py:357(issubdtype)\n", - " 55 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:77(get_type_ref)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1707(_interleave)\n", - " 152 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:79()\n", - " 730 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:214(is_extension)\n", - " 711 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:372(apply_if_callable)\n", - " 229 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:830(__len__)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:94(concatenate_managers)\n", - " 260 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:609(_dtype_to_subclass)\n", - " 262 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:568(require_length_match)\n", - " 131 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:836(__iter__)\n", - " 7 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:180(fillna)\n", - " 78 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:225(_consolidate_key)\n", - " 214 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:948(from_blocks)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1479(info)\n", - " 86 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2311(_fast_count_smallints)\n", - " 87 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:537(_check_compatible_with)\n", - " 111 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5552(equals)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2685(getproxies)\n", - " 46 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2744(inferred_type)\n", - " 76 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:314(_result_or_cancel)\n", - " 63 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:208(findall)\n", - " 119 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:892(getfile)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:222(read)\n", - " 8 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6488(isna)\n", - " 25 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:903(_set_levels)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2817(hasnans)\n", - " 41 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:2082(empty)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1915(_agg_py_fallback)\n", - " 128 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:3995(_maybe_update_cacher)\n", - " 14 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4883(_update_inplace)\n", - " 91 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:328(__init__)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5636(rename)\n", - " 354 0.001 0.000 0.001 0.000 {method 'match' of 're.Pattern' objects}\n", - " 7 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1870(_get_label_or_level_values)\n", - " 41 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:718(_unbox)\n", - " 205 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4623(_clear_item_cache)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1070(_rename)\n", - " 8 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1565(__invert__)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:7885(replace)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1575(__init__)\n", - " 459 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1331(is_ea_or_datetimelike_dtype)\n", - " 83 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/ipkernel.py:790()\n", - " 210 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:428(append)\n", - " 156 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1643(__len__)\n", - " 133 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2811(ensure_block_shape)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/utils.py:10(add_eod_timestamp)\n", - " 84 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:769(_assert_tzawareness_compat)\n", - " 826 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:999(__len__)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2804(_isnan)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1684(is_monotonic_increasing)\n", - " 46 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:525(_unbox_scalar)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1848(_make_engine)\n", - " 356 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:488(__exit__)\n", - " 15 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:833(isna)\n", - " 1785 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:208(isnum)\n", - " 6/2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1438(putmask)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:231(parse_headers)\n", - " 154 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1006(_find_hms_idx)\n", - " 172 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1768(ravel)\n", - " 337 0.000 0.000 0.001 0.000 :674(__getitem__)\n", - " 20 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:240(arithmetic_op)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:4620(map)\n", - " 217 0.001 0.000 0.001 0.000 {method 'remove' of 'list' objects}\n", - " 46 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1574(_validate_key)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:419(simplify_schema_references)\n", - " 185 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:456(_engine_type)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7227(_arith_method)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:735(has_dropped_na)\n", - " 356 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:441(__init__)\n", - " 25 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1085(_set_codes)\n", - " 1530 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:405(flags)\n", - " 24 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:844(levels)\n", - " 8 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:176(isna)\n", - " 48 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:675(empty)\n", - " 300 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1040(needs_i8_conversion)\n", - " 129 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:108(asi8)\n", - " 242 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/locale.py:396(normalize)\n", - " 259 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:676(_translate_key)\n", - " 7 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:405(__init__)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:7061(_pad_or_backfill)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager.py:294(is_already_scheduled)\n", - " 132 0.001 0.000 0.001 0.000 {method 'take' of 'numpy.ndarray' objects}\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:240(__pow__)\n", - " 83 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1501(enumerate)\n", - " 337 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:195(is_array_like)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:214(get_compressed_ids)\n", - " 108 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:221(__init__)\n", - " 62 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:775(infer_dtype_from_scalar)\n", - " 521 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1590()\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:782(result_index)\n", - " 18 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2421(all)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/Requests.py:36(construct_request_name)\n", - " 264/120 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:206(_handle_other_schemas)\n", - " 23 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1643(fillna)\n", - " 64 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/common.py:81(get_op_result_name)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2083(remove_unused_levels)\n", - " 169 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1850(from_blocks)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:299(pad_or_backfill)\n", - " 120 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:728(is_valid_na_for_dtype)\n", - " 153 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4379(_set_is_copy)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2235(take)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:596(shape)\n", - " 2768 0.001 0.000 0.001 0.000 {method 'append' of 'list' objects}\n", - " 63 0.001 0.000 0.001 0.000 {method 'findall' of 're.Pattern' objects}\n", - " 36 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1277(is_extension_array_dtype)\n", - " 69 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:386(default_index)\n", - " 93 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:914(__len__)\n", - " 111 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:184(_reconstruct_data)\n", - " 24 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:897()\n", - " 76 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6312(_index_as_unique)\n", - " 16 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:598()\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1102(wrap_results)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:2058(sum)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:1539(sum)\n", - " 94 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:474(resolve_ymd)\n", - " 952 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3809()\n", - " 9/6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2435(_signature_from_callable)\n", - " 17 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2229(is_monotonic_increasing)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:192(__sub__)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:562(_apply)\n", - " 12 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:676(ngroups)\n", - " 260 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:591(_ensure_array)\n", - " 22 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2979(prod)\n", - " 99 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:350(getitem_block_columns)\n", - " 114 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2603(_tuplify)\n", - " 27 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2246(_stack_arrays)\n", - " 119 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:2140()\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:460(_apply_columnwise)\n", - " 748 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:572(_get_axis_number)\n", - " 616 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1837(__init__)\n", - " 56 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1081(is_numeric_dtype)\n", - " 92 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:924()\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:457(prepare_request)\n", - " 56 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:448(size)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:777(_concat_indexes)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4420(_set_item_frame_value)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:60(__init__)\n", - " 71 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:782(_rename)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:176(sorted_labels)\n", - " 831 0.001 0.000 0.001 0.000 {method 'decode' of 'bytes' objects}\n", - " 275 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/frozen.py:76(__getitem__)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5455(append)\n", - " 143 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2776(_is_multi)\n", - " 7 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4159(xs)\n", - " 280 0.001 0.000 0.001 0.000 {method 'clear' of 'dict' objects}\n", - " 378 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:667(_info_axis)\n", - " 92 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1102()\n", - " 181 0.001 0.000 0.001 0.000 :1207(_handle_fromlist)\n", - " 4/3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:58(__ge__)\n", - " 1725 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5144(_values)\n", - " 1043 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:203(isword)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5491(_concat)\n", - " 418 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numerictypes.py:283(issubclass_)\n", - " 53 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:414(_split_op_result)\n", - " 33 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6415(_is_comparable_dtype)\n", - " 1407 0.001 0.000 0.001 0.000 {built-in method builtins.callable}\n", - " 286 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/base.py:238(construct_from_string)\n", - " 98 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2152(unit)\n", - " 180 0.001 0.000 0.001 0.000 {method 'nonzero' of 'numpy.ndarray' objects}\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:271(from_annotation)\n", - " 441 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:735(_sanitize_str_dtypes)\n", - " 8 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:1452(safe_sort)\n", - " 497 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:300()\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_discriminated_union.py:37(apply_discriminators)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:860(values)\n", - " 30 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:562(__init__)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:687(compress_group_index)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:237(ndarray_to_mgr)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:156(_indexer_and_to_sort)\n", - " 21 0.001 0.000 0.001 0.000 {built-in method _operator.ne}\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:909(text)\n", - " 51 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:633(is_integer_dtype)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1045(astype)\n", - " 69 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:217(_ensure_arraylike)\n", - " 9 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:527(__init__)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:478(coerce_to_target_dtype)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:789(apparent_encoding)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1784(get_level_values)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:805(call_soon_threadsafe)\n", - " 9 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:958(fast_xs)\n", - " 238 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1141(_to_decimal)\n", - " 9 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:333(from_annotated_attribute)\n", - " 163 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2537(dtype_to_unit)\n", - " 11 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:287(get_dtypes)\n", - " 12 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:418(merge_field_infos)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/legacy.py:19(detect)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:593(fetch_eof_columns)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:365(request)\n", - " 48 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:294(handle_union_schema)\n", - " 20 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:113(comp_method_OBJECT_ARRAY)\n", - " 806 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:718(dtype)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:3261(signature)\n", - " 513 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:196(blklocs)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:177(__contains__)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2236(_tuples_to_blocks_no_consolidate)\n", - " 16 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:66(copy)\n", - " 108 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:62(__init__)\n", - " 646 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/__init__.py:42(warn_copy_on_write)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:3007(from_callable)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:243(replace)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/api.py:33(from_bytes)\n", - " 42 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:253(_get_values)\n", - " 99 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:74(__len__)\n", - " 9 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6459(any)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:8282(_construct_result)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2238()\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:523(inferred_freq)\n", - " 36 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6324(_maybe_downcast_for_indexing)\n", - " 19 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1697(_validate_names)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:7172()\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:910(inferred_freq)\n", - " 85 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:301(maybe_iterable_to_list)\n", - " 7 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:707(_get_comb_axis)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2331(_signature_from_function)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:798(tolist)\n", - " 84 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/dispatch.py:17(should_extension_dispatch)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:89(infer_freq)\n", - " 74 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:201(_simple_new)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:416(_maybe_cast_listlike_indexer)\n", - " 9 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:487()\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:10185(align)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2244(get_values)\n", - " 14 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1433(find_common_type)\n", - " 27 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_asarray.py:27(require)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/base.py:2058(tolist)\n", - " 330 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:649(_get_deprecated_option)\n", - " 298 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:271(__enter__)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:828(replace)\n", - " 67 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:4120(_coerce_indexer_frozen)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:196(__rsub__)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:72(get_objs_combined_axis)\n", - " 532 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:758(_maybe_repeat)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6480(all)\n", - " 207 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:193(__get__)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6916(delete)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:649()\n", - " 104 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4585(_ensure_valid_index)\n", - " 737 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:363(attrs)\n", - " 346 0.000 0.000 0.000 0.000 {method 'astype' of 'numpy.ndarray' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:840(agg_series)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:172()\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1051(_stop)\n", - " 105 0.000 0.000 0.000 0.000 {built-in method numpy.zeros}\n", - " 87 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5295(_validate_fill_value)\n", - " 46 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:33(seterr)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:595(homogeneous_func)\n", - " 242 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:791(is_)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:369(nargsort)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1758(_get_level_values)\n", - " 285 0.000 0.000 0.000 0.000 {method 'split' of 'str' objects}\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7218(_construct_result)\n", - " 284 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:2443(get_origin)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12362(_stat_function)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:53(_wrapfunc)\n", - " 664 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1168(ident)\n", - " 575 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1940(_block)\n", - " 57 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1047(shape)\n", - " 56 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2794(_na_value)\n", - " 118 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:178(_datetime_metadata_str)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:492(to_numpy)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/accessor.py:95(_getter)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:720(size)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/accessors.py:88(_delegate_property_get)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/selector_events.py:128(_write_to_self)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1706(pad_or_backfill)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:351(prepare)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:353(wrapper)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1578(_wrap_aggregated_output)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2658(proxy_bypass_macosx_sysconf)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:226(isna)\n", - " 259 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:617(_select_options)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:482(nanany)\n", - " 1712 0.000 0.000 0.000 0.000 {built-in method builtins.setattr}\n", - " 108 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:395(__init__)\n", - " 6 0.000 0.000 0.000 0.000 {method 'send' of '_socket.socket' objects}\n", - " 214 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:336(hms)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:378(interleaved_dtype)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:206(__getattr__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:325(get_new_columns)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:601(calc)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6219(_raise_if_missing)\n", - " 40 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:165(maybe_lift)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:873(_aggregate_series_pure_python)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1559(itertuples)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:214(_handle_result)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:213(get_freq)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:815(_handle_resultset)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:10479(_align_frame)\n", - " 288 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/__init__.py:55(using_pyarrow_string_dtype)\n", - " 36 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:789(values)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/methods/to_dict.py:171()\n", - " 644 0.000 0.000 0.000 0.000 :760(decode)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1574(_set_names)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1287(endheaders)\n", - " 329 0.000 0.000 0.000 0.000 {method 'format' of 'str' objects}\n", - " 324 0.000 0.000 0.000 0.000 :697(__iter__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1049(_send_output)\n", - " 58/42 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2432(_extract_get_pydantic_json_schema)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5598()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:988(send)\n", - " 57 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/missing.py:131(dispatch_fill_zeros)\n", - " 14/13 0.000 0.000 0.000 0.000 {built-in method _operator.eq}\n", - " 63/3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:425(collect_refs)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2353(copy)\n", - " 337 0.000 0.000 0.000 0.000 :756(encode)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:293(_infer_daily_rule)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:111(f)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:430(__enter__)\n", - " 167 0.000 0.000 0.000 0.000 {method 'reshape' of 'numpy.ndarray' objects}\n", - " 30 0.000 0.000 0.000 0.000 {method 'extend' of 'list' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:446(get_connection_with_tls_context)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:456(get_rows)\n", - " 298 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:274(__exit__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:5486(isin)\n", - " 409 0.000 0.000 0.000 0.000 {built-in method numpy.asanyarray}\n", - " 87 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1310(__getattr__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:54(__gt__)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:120(_get_combined_index)\n", - " 87 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:299(helper)\n", - " 242 0.000 0.000 0.000 0.000 {built-in method _locale.setlocale}\n", - " 174 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1380()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:1149(__iter__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1630()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:885(pandasSQL_builder)\n", - " 1703 0.000 0.000 0.000 0.000 {method 'read' of '_io.StringIO' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:1162(_sorted_data)\n", - " 36 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2000(external_values)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method _scproxy._get_proxy_settings}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1532(__neg__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/utils.py:215(any_specified_encoding)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:652(_validate_listlike)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/parser.py:59(parsestr)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:278(connect)\n", - " 255 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2593(_convert_key)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:1083(reduction)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:348(get_function_type_hints)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:193(_new_conn)\n", - " 114 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:123(check_setitem_lengths)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:266(index_labels_to_array)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6629(cumprod)\n", - " 327 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1270(is_1d_only_ea_dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/parser.py:41(parse)\n", - " 57 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/astype.py:157(astype_array)\n", - " 46 0.000 0.000 0.000 0.000 {method 'argsort' of 'numpy.ndarray' objects}\n", - " 114 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2618()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12291(cumprod)\n", - " 1415 0.000 0.000 0.000 0.000 {method 'lower' of 'str' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6509(max)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:771(ngroups)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:246(get_new_values)\n", - " 76 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:364(cancel)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:545(_get_sample_object)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2662(getproxies_macosx_sysconf)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6520(_transform_index)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12239(_accum_func)\n", - " 63/3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_discriminated_union.py:45(inner)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1406()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12397(max)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:122(collect_definitions)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:390(__init__)\n", - " 61 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:992(is_numeric_v_string_like)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6831(infer_objects)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:378(new_index)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:153(_set_option)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:98(__add__)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method _scproxy._get_proxies}\n", - " 73 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:973(coerce_indexer_dtype)\n", - " 203 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/numpy/function.py:64(__call__)\n", - " 152 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2177(_grouping_func)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1216(_iset_split_block)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:1332(getfullargspec)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/connection.py:27(create_connection)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:243(_keep_alive)\n", - " 32/30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_repr.py:86(display_as_type)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2255(pad_or_backfill)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:572(_is_uniform_join_units)\n", - " 71 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:688(_warn_if_deprecated)\n", - " 63/3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:125(_record_valid_refs)\n", - " 114 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:72(check)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1966(_is_lexsorted)\n", - " 42 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:1499(_maybe_null_out)\n", - " 413 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:213(isspace)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:567(validate_core_schema)\n", - " 2070 0.000 0.000 0.000 0.000 {method 'isdigit' of 'str' objects}\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1692()\n", - " 89 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:122(_reset_cache)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:398(reduce)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5172(delete)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:479(__enter__)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:259(_reconstruct)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:276(connection_from_host)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/functools.py:35(update_wrapper)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:263(eval_type_backport)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1093(_getitem_nested_tuple)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:369(parse_url)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:567()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2107(droplevel)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:305(connection_from_context)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5651(identical)\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1025(argsort)\n", - " 212 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1763(np_can_hold_element)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:187(validate_indices)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1595(makeRecord)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:776(reconstructed_codes)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1922(rename)\n", - " 366 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:24(_kind_name)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1250(copy)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:296(_eval_type_backport)\n", - " 63 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:2378(array_equal)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:409(prepare_url)\n", - " 154 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:62(is_list_like_indexer)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:227(_encode_invalid_chars)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2002(_lexsort_depth)\n", - " 175 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:226(validate_bool_kwarg)\n", - " 88 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:795(_merge_cols_by_none)\n", - " 118 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:805(_maybe_copy)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:393(logical_op)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:393(_get_wom_rule)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:974(_is_nested_tuple_indexer)\n", - " 63/3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:447(count_refs)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/plugin/_schema_validator.py:21(create_schema_validator)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4651(_maybe_cache_changed)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:324(_get_dtype_max)\n", - " 21 0.000 0.000 0.000 0.000 :150(dirname)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:321(_eval_type)\n", - " 63/3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:488(inline_refs)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:66(mask_missing)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:292(__init__)\n", - " 489 0.000 0.000 0.000 0.000 {method 'pop' of 'list' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1809(set_names)\n", - " 113 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1262(_slice)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:158(collect_invalid_schemas)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1652(_is_scalar_access)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:831(construct_from_string)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2036(_get_prepare_pydantic_annotations_for_known_type)\n", - " 75 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:4035(_dict_not_none)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:4037(_lexsort_depth)\n", - " 301 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:246(items)\n", - " 345 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:913(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:171(feed)\n", - " 928 0.000 0.000 0.000 0.000 {built-in method _warnings._filters_mutated}\n", - " 63/3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:161(_is_schema_valid)\n", - " 122 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:259(_standardize_fill_value)\n", - " 27 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:829(_maintain_shutdown_locks)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1265(_iset_single)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:664(get_handle)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:435(__exit__)\n", - " 3 0.000 0.000 0.000 0.000 {built-in method pydantic_core._pydantic_core.validate_core_schema}\n", - " 70/15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:387(_eval_type)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:330(connection_from_pool_key)\n", - " 36 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:249(external_values)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:166(is_finalvar)\n", - " 144 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:329(month)\n", - " 94 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:380(validate)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:586(update_dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/objects.py:96(get_window_bounds)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:480(_get_ndims)\n", - " 352 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1671(name)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:1305(construct_from_string)\n", - " 4/3 0.000 0.000 0.000 0.000 {built-in method _operator.ge}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:296(_get_combined_plan)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:74(array)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:176(_call_parse)\n", - " 255 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:676(iat)\n", - " 42 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/numpy/function.py:413(validate_func)\n", - " 109 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:161(iloc)\n", - " 43 0.000 0.000 0.000 0.000 {method 'fill' of 'numpy.ndarray' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:438(convert)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1193(_engine)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:216(_parsegen)\n", - " 83 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:173()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:268(decons_obs_group_ids)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1826(_check_label_or_level_ambiguity)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2159(_drop_level_numbers)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:1084(_convert_grouper)\n", - " 87 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:104(__init__)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:485(__exit__)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4436(_wrap_reindex_result)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:1620(__init__)\n", - " 60 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1453(current_thread)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:123(__init__)\n", - " 101 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:286(_is_owned)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:11620(all)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:202(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1284(find_result_type)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:481()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:229(_new_pool)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6370(_find_common_type_compat)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:246(_decons_group_index)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2669(__init__)\n", - " 23 0.000 0.000 0.000 0.000 {built-in method _warnings.warn}\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2666(_maybe_normalize_endpoints)\n", - " 97 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:90(RLock)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1392(np_find_common_type)\n", - " 303 0.000 0.000 0.000 0.000 {method 'insert' of 'list' objects}\n", - " 152 0.000 0.000 0.000 0.000 {built-in method builtins.max}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:198(__init__)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1771(_is_label_reference)\n", - " 23 0.000 0.000 0.000 0.000 {built-in method numpy.arange}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/base.py:800(argsort)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1935(delete)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:543(nanall)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1734(isEnabledFor)\n", - " 190 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:292(isclass)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2692(max)\n", - " 413 0.000 0.000 0.000 0.000 {method 'startswith' of 'str' objects}\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:597()\n", - " 29 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:119(is_namedtuple)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:177(__init__)\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:978(__array__)\n", - " 1043 0.000 0.000 0.000 0.000 {method 'isalpha' of 'str' objects}\n", - " 36 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2827(external_values)\n", - " 192 0.000 0.000 0.000 0.000 {method 'ravel' of 'numpy.ndarray' objects}\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4440(_maybe_preserve_names)\n", - " 441 0.000 0.000 0.000 0.000 {method '__exit__' of '_thread.lock' objects}\n", - " 36 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3996(_check_indexing_method)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6499(min)\n", - " 83/24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:409()\n", - " 14 0.000 0.000 0.000 0.000 {method 'min' of 'numpy.ndarray' objects}\n", - " 312 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2043(freq)\n", - " 598 0.000 0.000 0.000 0.000 {built-in method builtins.id}\n", - " 79 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:283(_acquire_restore)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12381(min)\n", - " 242 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1687(__eq__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:245(_pad_or_backfill)\n", - " 144 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:319(jump)\n", - " 93 0.000 0.000 0.000 0.000 {method 'transpose' of 'numpy.ndarray' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/weakref.py:585(__call__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:359(build_response)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1657(_get_level_number)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:407(__rsub__)\n", - " 76 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:111(is_annotated)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:11575(_reduce_axis1)\n", - " 46 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:132(geterr)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:389(is_na)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:183(_make_sorted_values)\n", - " 84 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1266(_is_dunder)\n", - " 91 0.000 0.000 0.000 0.000 {built-in method builtins.min}\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:466(array_equivalent)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:1174(_close_pool_connections)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1216(_get_rows_with_mask)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:935(_expand_ellipsis)\n", - " 130 0.000 0.000 0.000 0.000 {built-in method _thread.allocate_lock}\n", - " 21 0.000 0.000 0.000 0.000 :71(join)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:342(construct_from_string)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4518(_check_inplace_and_allows_duplicate_labels)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12260(block_accum_func)\n", - " 367 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:1080(copyto)\n", - " 107 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:131()\n", - " 88 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:648(_colnames_from_description)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:43(_amin)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:1054(construct_from_string)\n", - " 71 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_utils.py:76(lenient_issubclass)\n", - " 79 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:280(_release_save)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:762(infer_dtype_from)\n", - " 69 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1181()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/utils.py:36(enforce_bus_hours)\n", - " 240 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:696(ndim)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:58(__new__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:942(format)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2955(__init__)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_weakrefset.py:85(add)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:11458(blk_func)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1728(duplicated)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2307(factorize)\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2285()\n", - " 1 0.000 0.000 0.000 0.000 {method 'connect' of '_socket.socket' objects}\n", - " 84 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1099(_parse_min_sec)\n", - " 27 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/weakref.py:427(__setitem__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2225(_handle_dbapi_exception)\n", - " 36 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7723(_unpack_nested_dtype)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:674(format)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:760(indexer_between_time)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1111(_values)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:858(pad_or_backfill_inplace)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/base.py:1428(factorize)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:560(_validate_scalar)\n", - " 92 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1571(_get_names)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:2249(isclose)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:644()\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:81(atleast_2d)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5818(head)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:2329(hfunc)\n", - " 291 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:344()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_ranges.py:24(generate_regular_range)\n", - " 80 0.000 0.000 0.000 0.000 {method 'put' of '_queue.SimpleQueue' objects}\n", - " 48 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/putmask.py:115(extract_bool_array)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:718(_reorder_by_uniques)\n", - " 94 0.000 0.000 0.000 0.000 {built-in method builtins.iter}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:3255(connect)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:494(_clean_keys_and_objs)\n", - " 238 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:974(dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:223(unique)\n", - " 57 0.000 0.000 0.000 0.000 {method 'groupdict' of 're.Match' objects}\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:61(merge_setting)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:1714(na_accum_func)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:132(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:167()\n", - " 3 0.000 0.000 0.000 0.000 {built-in method _operator.sub}\n", - " 2 0.000 0.000 0.000 0.000 {method 'fetch_fields' of '_mysql_connector.MySQL' objects}\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1689()\n", - " 53 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:865(_references)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/__extensions__.py:93(equity)\n", - " 286 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1081(codes)\n", - " 66 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:99(freq)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/accessors.py:70(_get_values)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:480()\n", - " 465 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:363(ndim)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:1148(take)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4585(_is_view)\n", - " 69 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1165(_check_deprecated_callable_usage)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:1547(check_below_min_count)\n", - " 19 0.000 0.000 0.000 0.000 :771(get)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:1436(date)\n", - " 47 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:230(_can_hold_na)\n", - " 477 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6672(_maybe_cast_indexer)\n", - " 88 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:265(_engine_type)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1417()\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1798()\n", - " 248 0.000 0.000 0.000 0.000 {method 'group' of 're.Match' objects}\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/common.py:103(_maybe_match_name)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/concat.py:52(concat_compat)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/astype.py:56(_astype_nansafe)\n", - " 94 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:482()\n", - " 308 0.000 0.000 0.000 0.000 {method '__exit__' of '_thread.RLock' objects}\n", - " 390/389 0.000 0.000 0.000 0.000 {method 'encode' of 'str' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/_optional.py:85(import_optional_dependency)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/base.py:294(is_dtype)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:322(_get_block_for_concat_plan)\n", - " 15 0.000 0.000 0.000 0.000 {method '__reduce_ex__' of 'object' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7406(min)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1954(get_rows_with_mask)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6137(_align_for_op)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/timedeltas.py:149(__new__)\n", - " 27 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:346(shape)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:404(__radd__)\n", - " 75 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:4036()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:40(__init__)\n", - " 74 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:322(weekday)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2100(clip)\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1327(__instancecheck__)\n", - " 498 0.000 0.000 0.000 0.000 {method 'copy' of 'dict' objects}\n", - " 338 0.000 0.000 0.000 0.000 {method 'items' of 'dict' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:317(__add__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1422(__sub__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:457(isin)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:507(maybe_prepare_scalar_for_op)\n", - " 85 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1030(axes)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:355(_concatenate_chunks)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:2706(_from_arrays)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:243(_from_values_or_dtype)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:430(_list_schema)\n", - " 69 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:241(is_single_block)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:204(get_netrc_auth)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:374(urlparse)\n", - " 49 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:2473(get_args)\n", - " 119 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:283(ismodule)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:1368(time)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2065(set_values)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:918(new_func)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1087(_slice)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1418(_literal_schema)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:564(_array_equivalent_object)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:242(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:573(__init__)\n", - " 207 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:1257(value)\n", - " 8 0.000 0.000 0.000 0.000 :941(update)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1126(_sub_datetimelike_scalar)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:122(put)\n", - " 74 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1056(_could_be_tzname)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:154(get)\n", - " 57 0.000 0.000 0.000 0.000 :405(parent)\n", - " 2 0.000 0.000 0.000 0.000 {method 'clip' of 'numpy.ndarray' objects}\n", - " 6 0.000 0.000 0.000 0.000 {built-in method _operator.truediv}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:363(_can_hold_element)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:883(_get_args_resolving_forward_refs)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:209(count_not_none)\n", - " 39 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/astype.py:249(astype_is_view)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:102()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1695()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:141(assemble_bulk_data_request)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:90(_clip)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:141(validate_kwargs)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:95(__init__)\n", - " 235 0.000 0.000 0.000 0.000 {method 'values' of 'dict' objects}\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:490(get)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:1835(construct_from_string)\n", - " 174 0.000 0.000 0.000 0.000 {built-in method numpy.core._multiarray_umath.normalize_axis_index}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1605(maybe_cast_to_integer_array)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:968(_pad_2d)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1324(_make_invoke_excepthook)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:354(validate_ascending)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method _operator.add}\n", - " 42 0.000 0.000 0.000 0.000 :121(__subclasscheck__)\n", - " 27 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:839()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:843(_hasna)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:879(infer_dtype_from_array)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:429(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:304(_get_filepath_or_buffer)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:124(extract_cookies_to_jar)\n", - " 68 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:158(_check_finalvar)\n", - " 45 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:72()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/container.py:14(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:351(_encode_target)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1512(_close_special)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:337(extend)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1377(__init__)\n", - " 79 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2752(need_slice)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1362(__add__)\n", - " 129 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1249(shape)\n", - " 42 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:209(_maybe_get_mask)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:202(union_indexes)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1730(_get_default_index_names)\n", - " 134 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:378(isfunction)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1667(_validate_integer)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2252()\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:480(is_view)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2567(_proxy_bypass_macosx_sysconf)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:82(f)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:352(na_logical_op)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:241(_from_sequence_not_strict)\n", - " 27 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_asarray.py:108()\n", - " 165 0.000 0.000 0.000 0.000 {method 'add' of 'set' objects}\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:643(name)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1158(_sub_datetimelike)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/dataclasses.py:1258(is_dataclass)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:3280(raw_connection)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1384(_checkin)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1342(is_complex_dtype)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2095(create_block_manager_from_blocks)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:946(_sorted_ids)\n", - " 4 0.000 0.000 0.000 0.000 {built-in method _operator.mul}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:808(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1725(can_hold_element)\n", - " 74 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:342(ampm)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/arraysetops.py:138(unique)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:441(connect)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:2228(construct_from_string)\n", - " 76 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:47(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:793(_add_offset)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:106(_encode_params)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/version/__init__.py:339(__init__)\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1602(__subclasscheck__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2037(_signature_bound_method)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:424(str_schema)\n", - " 169 0.000 0.000 0.000 0.000 {method '__enter__' of '_thread.RLock' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:761()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:105(__init__)\n", - " 69 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:941()\n", - " 125 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:300(ismethod)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:917(_finalize_fairy)\n", - " 69 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:148(__getattr__)\n", - " 107 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:126(_classes_and_not_datetimelike)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1255(_checkout)\n", - " 43 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:311(is_null_slice)\n", - " 243 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:153(concatenate)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:3689(equals)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:644(get_group_index_sorter)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:180()\n", - " 87 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1455()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:523(cython_operation)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:288()\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/string_.py:140(construct_from_string)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:271(validate_fillna_kwargs)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:469(_parse_headers)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:351(putheader)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/arraysetops.py:323(_unique1d)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:258(_get_conn)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:3108(cumprod)\n", - " 10 0.000 0.000 0.000 0.000 {built-in method today}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:606(formatTime)\n", - " 84 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:692(_constructor)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:533(_maybe_downcast)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:545(is_dataclass)\n", - " 119 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:480(iscode)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:164(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:2330(within_tol)\n", - " 39 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6277()\n", - " 90 0.000 0.000 0.000 0.000 {method 'item' of 'numpy.ndarray' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:127(__init__)\n", - " 63 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:401(_config_wrapper)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:990(sequence_to_td64ns)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_weakrefset.py:39(_remove)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:567(free_result)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:3023(replace)\n", - " 35 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:87(is_literal_type)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2410(wrap_default)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:2526(_set_grouper)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2586(get_values)\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:1745(currentframe)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1534(blk_func)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1561(findCaller)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:838(select_proxy)\n", - " 119 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:456(istraceback)\n", - " 413 0.000 0.000 0.000 0.000 {method 'isspace' of 'str' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:157(core_config)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:781(_call_soon)\n", - " 119 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:466(isframe)\n", - " 67 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:981()\n", - " 8 0.000 0.000 0.000 0.000 :778(__contains__)\n", - " 123 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:115(get_ref)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:310(_cython_op_ndim_compat)\n", - " 16/3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:99(all_literal_values)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:1165(_is_binary_mode)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:707(checkout)\n", - " 129 0.000 0.000 0.000 0.000 {method '__enter__' of '_thread.lock' objects}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:404(is_dataclass)\n", - " 4 0.000 0.000 0.000 0.000 {method 'free_result' of '_mysql_connector.MySQL' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:2103(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:137(__new__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/response.py:40(assert_header_parsing)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1570(_maybe_box_and_unbox_datetimelike)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:136(ones)\n", - " 36 0.000 0.000 0.000 0.000 {built-in method gc.get_referents}\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:215(_vhstack_dispatcher)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:813(str_schema)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:483(prepare_headers)\n", - " 69 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2772()\n", - " 154 0.000 0.000 0.000 0.000 {method 'upper' of 'str' objects}\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:345(to_key_val_list)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:1848(_wrap_result)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:592(get_content_type)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:410(fill_bool)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1765(_get_names)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1768(_set_names)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:354(_call_cython_op)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:331(_set_grouper)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:454(_get_time_micros)\n", - " 177 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:266(mgr_locs)\n", - " 174 0.000 0.000 0.000 0.000 {built-in method _operator.index}\n", - " 2 0.000 0.000 0.000 0.000 {method 'cumprod' of 'numpy.ndarray' objects}\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:949()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:405(_check_values_indices_shape_match)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/_policybase.py:319(header_fetch_parse)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:688(__call__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:943(urlencode)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:493(_wrap_result)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:157(_int64_cut_off)\n", - " 114 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:470(__getattr__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/errors.py:222(get_mysql_exception)\n", - " 172 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5558(_append_dispatcher)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:2208(__init__)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:106(_get_distinct_objs)\n", - " 69 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1180()\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:550(_is_master_process)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:307(_pad_or_backfill)\n", - " 44 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:992(_validate_key_length)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:902(_fillna_prep)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:238(_new_conn)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:251(handle_list_schema)\n", - " 68 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1133(_parsems)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:950(_validate_or_indexify_columns)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:521(cookiejar_from_dict)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1695(__hash__)\n", - " 275 0.000 0.000 0.000 0.000 {function FrozenList.__getitem__ at 0x119f0aa20}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:2557(_get_timestamp_range_edges)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:291(arrays)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:546(ensure_key_mapped)\n", - " 83 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1176(_maybe_disallow_fill)\n", - " 134 0.000 0.000 0.000 0.000 {method 'endswith' of 'str' objects}\n", - " 42 0.000 0.000 0.000 0.000 {built-in method _abc._abc_subclasscheck}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:331(putrequest)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:332(array)\n", - " 55 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:566(is_self_type)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:316(close)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1680(extract_cookies)\n", - " 46 0.000 0.000 0.000 0.000 {built-in method numpy.seterrobj}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:479(items)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:170()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:115(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:208(_maybe_unbox_datetimelike)\n", - " 98 0.000 0.000 0.000 0.000 {built-in method sys.getrefcount}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/times.py:25(to_time)\n", - " 4 0.000 0.000 0.000 0.000 {built-in method posix.cpu_count}\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Configuration.py:37(__setattr__)\n", - " 37 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:688(_sanitize_non_ordered)\n", - " 172 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1764(_ravel_dispatcher)\n", - " 178 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1480(_clear_item_cache)\n", - " 63 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1046(nlevels)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1974(get_slice)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:3345(arguments_parameter)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:610(prepare_cookies)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:121(__init__)\n", - " 91 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:398(__get_result)\n", - " 57 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1206(daemon)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:336(_get_annual_rule)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/putmask.py:62(putmask_without_repeat)\n", - " 55 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:557(is_generic_alias)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4060(_get_fill_indexer)\n", - " 238 0.000 0.000 0.000 0.000 {method 'is_finite' of 'decimal.Decimal' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/accessor.py:220(__get__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:140(_from_backing_data)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:487()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1933(to_numpy)\n", - " 199 0.000 0.000 0.000 0.000 {method 'pop' of 'dict' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1103(putrequest)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:164(hostname)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1259(putheader)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:398(validate_inclusive)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:1191(_get_splitter)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/_policybase.py:289(_sanitize_header)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:289(ydiffs)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:2364(with_default_schema)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:140(get_cookie_header)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:1038(handle_unread_result)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/exc.py:604(instance)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2567(push)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:125(f)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/utils/filters.py:8(filter_inputs)\n", - " 47 0.000 0.000 0.000 0.000 :41(_get_sep)\n", - " 42 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2738(is_label_like)\n", - " 3 0.000 0.000 0.000 0.000 {method 'cumsum' of 'numpy.ndarray' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12530(rolling)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:849(_list_to_arrays)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2623(_infer_tz_from_endpoints)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:158()\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:915(__array__)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:622(convert)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:505(parent_header)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:243(get_payload)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:546(request_url)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7469(max)\n", - " 69 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2781()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:5565(_reindex_output)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:366(notify)\n", - " 114 0.000 0.000 0.000 0.000 {method 'toordinal' of 'datetime.date' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:182(_make_key_to_index)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5676()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:679(_init_length)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:229(_convert_obj)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:974(close)\n", - " 109 0.000 0.000 0.000 0.000 {method 'release' of '_thread.lock' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:108()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:369(__init__)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:306(is_named_tuple)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:34(__str__)\n", - " 27 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/weakref.py:369(remove)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:751(checkin)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:2472(union_schema)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:324(slice_block_columns)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:553(equals)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:724()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:957(getaddrinfo)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:1314(fetchall)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6380(_consolidate)\n", - " 92 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:217(_scalar_type)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/computation/expressions.py:246(where)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:196(mgr_to_mgr)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:658(__init__)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1096(_can_fast_transpose)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1881(nonzero)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:735(_error_catcher)\n", - " 46 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1665()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ipaddress.py:1286(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:318()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:255(get)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:127(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:182(close)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:939(_sort_idx)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:616(get_content_maintype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:159(resolve_redirects)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:638(__array__)\n", - " 99 0.000 0.000 0.000 0.000 {built-in method time.monotonic}\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:540()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:541(to_numpy)\n", - " 99 0.000 0.000 0.000 0.000 {built-in method _thread.get_ident}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1599(make_cookies)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/errors.py:46(__init__)\n", - " 12 0.000 0.000 0.000 0.000 {built-in method _operator.invert}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:543(_allrows)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:862(codes)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:35(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:436(_split)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/shape_base.py:1185(tile)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:901(quote_plus)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:742(_get_axes)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:470()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/computation/expressions.py:172(_where_standard)\n", - " 2 0.000 0.000 0.000 0.000 :229(expanduser)\n", - " 49 0.000 0.000 0.000 0.000 {method 'join' of 'str' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:935(_verify_integrity)\n", - " 79 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:660(_constructor)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:185()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/events.py:35(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:220(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5134(array)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:255(__init__)\n", - " 2 0.000 0.000 0.000 0.000 {method 'searchsorted' of 'numpy.ndarray' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/accessors.py:611(__new__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:457(__neg__)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:373(inner)\n", - " 108 0.000 0.000 0.000 0.000 {method 'append' of 'collections.deque' objects}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:940(date_schema)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:83(is_callable_type)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:82(frame_apply)\n", - " 3 0.000 0.000 0.000 0.000 {method 'put' of 'numpy.ndarray' objects}\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2066(_get_level_values)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:471(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/getlimits.py:685(__init__)\n", - " 1 0.000 0.000 0.000 0.000 {method 'sort' of 'numpy.ndarray' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/plugin/_loader.py:21(get_plugins)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:451(_return_conn)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2582(array_values)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:1789(_adjust_binner_for_upsample)\n", - " 87 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5364(_insert_dispatcher)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:240(init_poolmanager)\n", - " 92 0.000 0.000 0.000 0.000 {built-in method numpy.geterrobj}\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:446(__exit__)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/typing_extensions.py:1132(is_typeddict)\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:207(_arrays_for_stack_dispatcher)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:639(group_keys_seq)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:499(close)\n", - " 70 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:360(convertyear)\n", - " 30 0.000 0.000 0.000 0.000 {method 'rfind' of 'str' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:409(iscoroutinefunction)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:381()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/impl.py:144(_do_return_conn)\n", - " 6 0.000 0.000 0.000 0.000 {built-in method _operator.and_}\n", - " 63 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:575(is_set)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:194(_is_internal_frame)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:157(clean_fill_method)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:2134(_fetchall_impl)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2155()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:137(hasnans)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:3002()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ipaddress.py:1187(_ip_int_from_string)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:446(_init_decoder)\n", - " 87 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1389(_moveaxis_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:273(fields)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:2426(nullable_schema)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:169(_get_cython_function)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:835(_local_timestamps)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:167(get_annotations)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1721()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:495(_real_close)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:847(quote)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:259(__getitem__)\n", - " 48 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:1073(clean_reindex_fill_method)\n", - " 27 0.000 0.000 0.000 0.000 {method 'difference_update' of 'set' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:454(__exit__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/pivot.py:493(_convert_by)\n", - " 92 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:892(bincount)\n", - " 63 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1725(__eq__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:95(_default_key_normalizer)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:1130(fetchall)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:642()\n", - " 3 0.000 0.000 0.000 0.000 {built-in method time.localtime}\n", - " 63 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:2374(_array_equal_dispatcher)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1069(_is_homogeneous_type)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/queue.py:132(put)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:26(lookback)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:686()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/retry.py:202(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:794(_set_axis_nocheck)\n", - " 2 0.000 0.000 0.000 0.000 {method 'any' of 'numpy.generic' objects}\n", - " 2 0.000 0.000 0.000 0.000 :16(exists)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:794(close)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/utils.py:52(_has_surrogates)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/_policybase.py:301(header_source_parse)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:213(_read_headers)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6270()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1261(__init__)\n", - " 70 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:402(has_year)\n", - " 33 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1122()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:315(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:464(get_array_op)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:598(collect_definitions)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/base.py:115(__eq__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1062(levshape)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:396(build_connection_pool_key_attributes)\n", - " 36 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1463()\n", - " 1 0.000 0.000 0.000 0.000 {method 'sendall' of '_socket.socket' objects}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:470(any_schema)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:391(_has_code_flag)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:1868(_validate)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2209(_safe_close_cursor)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:922(acquire)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:363(_repeater)\n", - " 3 0.000 0.000 0.000 0.000 {built-in method time.strftime}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1192(is_alive)\n", - " 69 0.000 0.000 0.000 0.000 {method 'rpartition' of 'str' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/times.py:67(_convert_listlike)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/generic.py:2015(_wrap_agged_manager)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:199(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:100(push)\n", - " 3 0.000 0.000 0.000 0.000 :140(basename)\n", - " 1 0.000 0.000 0.000 0.000 {function socket.close at 0x102042160}\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:127(__next__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_common.py:27(_init_wait_gen)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:191(_validate_parse_dates_presence)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1467(debug)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:134(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:303(makefile)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:5607()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:90(_urllib3_request_context)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:205(_hostinfo)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:46(__setitem__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:525(get_all)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1524(__init__)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:373(is_sequence)\n", - " 49 0.000 0.000 0.000 0.000 {method 'remove' of 'collections.deque' objects}\n", - " 4 0.000 0.000 0.000 0.000 {built-in method _operator.inv}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1627(_get_options_with_defaults)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:505(get_rename_function)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1685(_clean_options)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:34(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:445(unit)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:756(_shallow_copy)\n", - " 108 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:186(__iter__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1356(add_cookie_header)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method posix.stat}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4027(_iter_column_arrays)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:119(_coerce_args)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:635(release_conn)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/impl.py:153(_do_get)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:354(__array__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1731(__hash__)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:302(add)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_known_annotated_metadata.py:121(expand_grouped_metadata)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:159()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/exc.py:692(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:900(default_headers)\n", - " 59 0.000 0.000 0.000 0.000 {built-in method posix.fspath}\n", - " 3 0.000 0.000 0.000 0.000 :773(getenv)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:8084(_align_for_op)\n", - " 85 0.000 0.000 0.000 0.000 {method 'discard' of 'set' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1959(maybe_mangle_lambdas)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:516(close)\n", - " 3 0.000 0.000 0.000 0.000 :117(splitext)\n", - " 71 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:213()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:536(close)\n", - " 63 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:211(tail)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/equity.py:307(price)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/roperator.py:14(rsub)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:4039()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:191(identify_interval)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:211(_simple_new)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:1204(is_potential_multi_index)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:350(_get_quarterly_rule)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/from_thread.py:170(_check_running)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:137(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:588(prepare_auth)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:358(_prep_values)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:672(_is_view_after_cow_rules)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:423(repeat)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:215(extract_numeric_value)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:230(_handle_eof)\n", - " 39 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:206(_should_unflatten_callable_args)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:884(keys)\n", - " 11 0.000 0.000 0.000 0.000 {method '_acquire_restore' of '_thread.RLock' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:76(copy)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method from_bytes}\n", - " 4 0.000 0.000 0.000 0.000 {built-in method _operator.pow}\n", - " 1 0.000 0.000 0.000 0.000 {built-in method _socket.getaddrinfo}\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:983(is_in_axis)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:788()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:219(mask_all)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2738(_check_indexing_error)\n", - " 35 0.000 0.000 0.000 0.000 {method 'rstrip' of 'str' objects}\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:845(unread_result)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:677(_constructor_expanddim)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:578(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:139()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:296(_put_conn)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:440(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5649(_needs_reindex_multi)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:791(_autobegin)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:209(is_object)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:886()\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:923(quote_from_bytes)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/queue.py:174(get)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/putmask.py:29(putmask_inplace)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:388()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:173(extract_numeric_value)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:658(formatMessage)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2512(cumsum)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:106(keys)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:81(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:284(mdiffs)\n", - " 77 0.000 0.000 0.000 0.000 {method 'end' of 're.Match' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/utils.py:268(identify_sig_or_bom)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:1129(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:263(_remove_path_dot_segments)\n", - " 5 0.000 0.000 0.000 0.000 {method 'astype' of 'numpy.generic' objects}\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1686(name)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:984()\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copyreg.py:104(__newobj__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:128(_check_for_invalid_keys)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Configuration.py:29(__getattr__)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:1454(__init__)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:587()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:850(_maybe_mask_results)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:1034(check_header_validity)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:49(_check_for_default_values)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:303()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:735(unwrap)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:168()\n", - " 45 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:51(origin_is_union)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:1009(__getitem__)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2577(is_view)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:795(begin)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1992(_validate_index_level)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:419(_close_conn)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:947()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:641(fill_missing_names)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4017(_get_column_array)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:1018(get_auth_from_url)\n", - " 27 0.000 0.000 0.000 0.000 {method 'update' of 'dict' objects}\n", - " 178 0.000 0.000 0.000 0.000 {built-in method builtins.ord}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/log.py:101(_should_log_debug)\n", - " 27 0.000 0.000 0.000 0.000 {built-in method sys._getframe}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:201(_set_noconvert_columns)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:531(validate_ordered)\n", - " 42 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:178()\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:51(__getitem__)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1340()\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2294()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7704(get_unanimous_names)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:594(_bool_arith_check)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/inspection.py:113(inspect)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:638(_passed_categorical)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:822(reset)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/pivot.py:173()\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1357(__getattr__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:469()\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7652(ensure_has_len)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:1532(_soft_close)\n", - " 9 0.000 0.000 0.000 0.000 {built-in method fromkeys}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1026(iget_values)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:267(clear)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:219(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:303(_normalize_host)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:692(levels)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/calendar.py:122(monthrange)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1472()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:416(_resolve_output)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1544(log)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/functools.py:65(wraps)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:3176(ndim)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:426(__init__)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method _operator.gt}\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:696(names)\n", - " 1 0.000 0.000 0.000 0.000 {method 'close' of '_io.BufferedReader' objects}\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:251(put)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:195(deltas)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:849(__init__)\n", - " 105 0.000 0.000 0.000 0.000 {method 'locked' of '_thread.lock' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:397(ensure_np_dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/base.py:2411(_quote_free_identifiers)\n", - " 45 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:592(groupings)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:170(parent_frame_namespace)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:447(format)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:202(_maybe_reindex_columns_na_proxy)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:514(_collect_metadata)\n", - " 2 0.000 0.000 0.000 0.000 {method 'all' of 'numpy.generic' objects}\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:1095(__new__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:136(_codes_to_ints)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:248(_qsize)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:764(categories)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:722(_result_index)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:1045(_validate_header_part)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1671(is_all_strings)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:774(get_proxy)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ipaddress.py:1213(_parse_octet)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:228(_acquireLock)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:677()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2678(__init__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1076()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:3750(definitions_schema)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/base.py:445(__get__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/accessors.py:59(__init__)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:479(__repr__)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1061()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:143(clear)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:221()\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:131(is_new_type)\n", - " 59 0.000 0.000 0.000 0.000 {method 'weekday' of 'datetime.date' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/sql/schema.py:5357(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:231(_fix)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:77(readline)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1990(__exit__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:652(usesTime)\n", - " 36 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1479()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:389(standardize_mapping)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:773(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/base.py:2414()\n", - " 8 0.000 0.000 0.000 0.000 :790(items)\n", - " 26 0.000 0.000 0.000 0.000 {built-in method posix.getpid}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_sync.py:10(_call_handlers)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/encodings/idna.py:145(encode)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:929(release)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:1206(literal_schema)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:84()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:305(_connection_insp)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:509(urlunparse)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:665(_get_registered_option)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:136(reset)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1622(close)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:1248(python_charset)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/methods/to_dict.py:155()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/version/__init__.py:520(_cmpkey)\n", - " 6 0.000 0.000 0.000 0.000 {built-in method now}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:440(_format)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:3386(arguments_schema)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:483(_view)\n", - " 23 0.000 0.000 0.000 0.000 {method 'write' of '_io.StringIO' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/importlib/__init__.py:108(import_module)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:109(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:966(_selected_obj)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:1149(_normalize_host)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1980(shape)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/connection.py:93(_set_socket_options)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:948()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:542(merge_cookies)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:891(_get_first_arg_or_any)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:751()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:410(_is_comparable_dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/equity.py:65(fundamental)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1394(__hash__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:99(_intenum_converter)\n", - " 9 0.000 0.000 0.000 0.000 {method '_checkReadable' of '_io._IOBase' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/exc.py:477(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:475(any_extension_types)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:781(close)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:374(_is_business_daily)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:93(__init__)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:999(is_in_obj)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:348(_get_timeout)\n", - " 17 0.000 0.000 0.000 0.000 {method 'acquire' of '_thread.RLock' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Context.py:124(clear_context)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:660(requote_uri)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2700(_connection_begin_impl)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:571(_disallow_mismatched_indexing)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:383(is_closed)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:58()\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:837(result_set_available)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2220(_can_hold_na)\n", - " 3 0.000 0.000 0.000 0.000 :121(_splitext)\n", - " 16 0.000 0.000 0.000 0.000 {built-in method time.time}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:630(prepare_hooks)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/langhelpers.py:1138(__get__)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:1080(_is_label_like)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:1066(get_fill_func)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:400()\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:584()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:3445(call_schema)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:248(stringify_path)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1720(getEffectiveLevel)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:100(__new__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/sql/compiler.py:7475(quote_identifier)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1730()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/handlers.py:354(shouldRollover)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:196()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:424(close)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:206(get_module_ns_of)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:922(_maybe_infer_dtype_type)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:91(is_deprecated_instance)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:205(_effective_processors)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1398(_reset)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2416(_all_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:107(get_redirect_target)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/base.py:183(_for_instance)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:497(_extract_metadata)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6537()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1269(set_inplace)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:2133(_refine_defaults_read)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:84(__init__)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:237(_releaseLock)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:1135(_splitport)\n", - " 10 0.000 0.000 0.000 0.000 {method 'index' of 'list' objects}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1227(deepvalues)\n", - " 11 0.000 0.000 0.000 0.000 {method '_release_save' of '_thread.RLock' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:362(_make_index)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:691(__del__)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:572(is_required)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:693(_get_result_dim)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2730(annotation)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:403()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1094()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:164()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:228(_construct)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Configuration.py:18(initialize_configuration)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:886(inner)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/retry.py:242()\n", - " 42 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:290(_add_custom_serialization_from_json_encoders)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:432(usesTime)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:534()\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:937()\n", - " 37 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2722(name)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:263(day_deltas)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:57(__iter__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/constants.py:320(raise_warning_against_deprecated_cursor_class)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1091(_begin_impl)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:539(get_encoding_from_headers)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:198()\n", - " 35 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2734(kind)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:799(mount)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:183(maybe_box_native)\n", - " 7 0.000 0.000 0.000 0.000 {method 'write' of '_io.BytesIO' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/getlimits.py:696(min)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1698()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/extension.py:153(_isnan)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:502(enter_context)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:655(_constructor)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:234(_disallow_mismatched_datetimelike)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:1465(list_schema)\n", - " 9 0.000 0.000 0.000 0.000 :52(normcase)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:601(_set_noconvert_dtype_columns)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:781(get_adapter)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/calendar.py:115(weekday)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_schema_generation_shared.py:72(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:240(_validate_numeric_only)\n", - " 2 0.000 0.000 0.000 0.000 {method 'readlines' of '_io._IOBase' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:390(_check_close)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:207(register_hook)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:494(prepare_body)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6055(_check_indexing_error)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:251(_put)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:194(close)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:174(not_none)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/response.py:9(is_fp_closed)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:1233(dedup_names)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4306(_validate_can_reindex)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/base.py:180(_for_class)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:123(getLevelName)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:164(host)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/SaveManager.py:334()\n", - " 28 0.000 0.000 0.000 0.000 {method '__contains__' of 'frozenset' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:769(is_redirect)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:258(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:811(_newname)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:238(is_int64_overflow_possible)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:841(fetchall)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:376(dtype)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:188(clone)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:138(_event_pipe)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/log.py:104(_should_log_info)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/numpy/function.py:223(validate_cum_func_with_skipna)\n", - " 6 0.000 0.000 0.000 0.000 {method 'fullmatch' of 're.Pattern' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/cd.py:291(merge_coherence_ratios)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6357(_protect_consolidate)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1331(dtype)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:916()\n", - " 1 0.000 0.000 0.000 0.000 {method 'setsockopt' of '_socket.socket' objects}\n", - " 2 0.000 0.000 0.000 0.000 {method 'settimeout' of '_socket.socket' objects}\n", - " 1 0.000 0.000 0.000 0.000 :1192(_gcd_import)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:254(_get)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:29(_splitparam)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1619(executemany)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:884(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:871(_do_date_conversions)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1643(reconstruct_func)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:619(categories)\n", - " 2 0.000 0.000 0.000 0.000 {method 'repeat' of 'numpy.ndarray' objects}\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1847()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/hooks.py:15(default_hooks)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:172(_validate)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:187(_get_fill_value)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1215(enforce_interval)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:95(literal_values)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:265(_find_common_index_dtype)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:452(_no_nep50_warning)\n", - " 13 0.000 0.000 0.000 0.000 {method 'capitalize' of 'str' objects}\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/command_runner.py:470(user_settings)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:195()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:350(_maybe_make_multi_index_columns)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:172(from_float)\n", - " 28 0.000 0.000 0.000 0.000 {method 'isidentifier' of 'str' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:633(is_builtin_func)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1903()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:550(infer_compression)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:982()\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2974(_prod_dispatcher)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:56(__init__)\n", - " 17 0.000 0.000 0.000 0.000 {method 'release' of '_thread.RLock' objects}\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:507(set_raw)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:282(query_attrs)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:382(_insert_on_column)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/methods/to_dict.py:160()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/attr.py:389(__bool__)\n", - " 33 0.000 0.000 0.000 0.000 {method 'partition' of 'str' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:175(port)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:585(_ensure_2d)\n", - " 3 0.000 0.000 0.000 0.000 {function SocketIO.close at 0x102042f20}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5486()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:105(is_file_like)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1721()\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/util.py:19(to_str)\n", - " 22 0.000 0.000 0.000 0.000 {method 'get' of '_contextvars.ContextVar' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:266()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/weakref.py:568(__init__)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:172()\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:743(readable)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:167()\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:661(_ilevel)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:987(__init__)\n", - " 14 0.000 0.000 0.000 0.000 {method 'find' of 'str' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:52(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:692(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:478()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:191(_server_status)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/getlimits.py:709(max)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method builtins.locals}\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1474()\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1021(_argsort_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/_concurrency_py3k.py:61(is_exit_exception)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:102(__setitem__)\n", - " 11 0.000 0.000 0.000 0.000 {method 'startswith' of 'bytes' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:405(_types_namespace)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_common.py:17(_maybe_call)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/utils.py:368(cut_sequence_chunks)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:223(__len__)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:353()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:657()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7717()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/langhelpers.py:1224(_set_memoized_attribute)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:443(__enter__)\n", - " 5 0.000 0.000 0.000 0.000 {method 'subn' of 're.Pattern' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1201()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:2352(_adjust_bin_edges)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:815(filter)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:95(__getitem__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/base.py:137(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:532(_still_open_and_dbapi_connection_is_valid)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2726(default)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:698()\n", - " 22 0.000 0.000 0.000 0.000 {built-in method builtins.abs}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/request.py:189(body_to_chunks)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:694()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:85(path_url)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:229(__iter__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:304(merge_incomplete_data_in_cache)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:194(_handle_warnings)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1674(_check_file_or_buffer)\n", - " 14 0.000 0.000 0.000 0.000 {method 'setdefault' of 'dict' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:204()\n", - " 10 0.000 0.000 0.000 0.000 {method 'count' of 'list' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:126(language)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:150(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:249(_get_output_shape)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:276(append)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:632(ordered)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:358(update)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/base.py:187(_join)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:520(urlunsplit)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:447(isclosed)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:574(is_zoneinfo_type)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:278(prepare_config)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:69(close)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:7045(_deprecate_downcast)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/utils.py:189(check_single_item)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:254(__new__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:426(_get_window_indexer)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:819(get_connection)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/errors/__init__.py:535(_check_cacher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1734(clear_expired_cookies)\n", - " 3 0.000 0.000 0.000 0.000 {method 'send' of 'generator' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:336(_na_ok_dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:829(warning_count)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1793()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/utils.py:28(eod)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:1117(_maybe_memory_map)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:261(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/exc.py:48(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:520(convert_to_list_like)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/mysqlconnector.py:145(is_disconnect)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1028(_output)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1753(__iter__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:367()\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1828(ndim)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/replace.py:31(should_use_regex)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/version/__init__.py:348()\n", - " 6 0.000 0.000 0.000 0.000 {built-in method _contextvars.copy_context}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:534(_push_cm_exit)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:334(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:126(resolve_default_timeout)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/concat.py:73()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/util/numba_.py:18(maybe_use_numba)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/retry.py:387(is_retry)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/database/SQLHelpers.py:46(get_engine)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1487(__getattr__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2721(is_nested_tuple)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:515(get_compression_method)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:314()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:805()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5495()\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:248(__len__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:330(_sanitize_and_check)\n", - " 14 0.000 0.000 0.000 0.000 {method 'lstrip' of 'str' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1329(result_index)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:553(nblocks)\n", - " 9 0.000 0.000 0.000 0.000 {method '_checkClosed' of '_io._IOBase' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:1079(closed)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:166(__setattr__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:279(_extract_multi_indexer_columns)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:369(should_store)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1658(no_parameters)\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:77(_atleast_2d_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method builtins.round}\n", - " 1 0.000 0.000 0.000 0.000 :1165(_find_and_load)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:351(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:230(_slice_axis_for_step)\n", - " 11 0.000 0.000 0.000 0.000 {method 'strip' of 'str' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:121(pushlines)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:370()\n", - " 3 0.000 0.000 0.000 0.000 {method 'tolist' of 'numpy.ndarray' objects}\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:520(can_consume_results)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:717(index)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1836(build_name_format)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1408()\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:151(end_date)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2516(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/numpy/function.py:159(validate_argsort_with_ascending)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:305(loc)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:212()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:518(_check_closed)\n", - " 8 0.000 0.000 0.000 0.000 :812(__init__)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:1131(putmask)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:176(dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/Requests.py:172(__init__)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2474(validate_periods)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1066(_get_arithmetic_result_freq)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1240(determine_table_agg)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method sys.exc_info}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:2139(_codes)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:245(read_timeout)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5168(_delete_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:799(iter_content)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:338(astype)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:291(__iter__)\n", - " 1 0.000 0.000 0.000 0.000 {method 'fetch_row' of '_mysql_connector.MySQL' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:195(_new_message)\n", - " 1 0.000 0.000 0.000 0.000 {method 'throw' of 'generator' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1128(value_getitem)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:494(dtype)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:369()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/constants.py:993(get_info)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6390()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:1125(_time_to_micros)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1297(_cookie_attrs)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:12(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:93()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:188(all_none)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:156(username)\n", - " 5 0.000 0.000 0.000 0.000 {method 'replace' of 'str' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:199(could_be_from_charset)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/mysqlconnector.py:53(_escape_identifier)\n", - " 13 0.000 0.000 0.000 0.000 {method '_is_owned' of '_thread.RLock' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:128()\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:222()\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:346(where)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4367(igetitem)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1319(disable)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/queue.py:225(_full)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:368(getMessage)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/helpers/utils.py:10(verify_ticker)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1979(nlevels)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:374(_merge_pool_kwargs)\n", - " 3 0.000 0.000 0.000 0.000 {method 'total_seconds' of 'datetime.timedelta' objects}\n", - " 3 0.000 0.000 0.000 0.000 {method 'values' of 'mappingproxy' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:244(__init__)\n", - " 3 0.000 0.000 0.000 0.000 {method 'items' of 'mappingproxy' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:304(cert_verify)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:436(flush)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:320(__len__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:732(__call__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7719()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:207(validate_header_arg)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:1269(_process_date_conversion)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1152(name)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:217()\n", - " 5 0.000 0.000 0.000 0.000 {method 'reverse' of 'list' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:706()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:252(_init_connection)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:472(__init__)\n", - " 6 0.000 0.000 0.000 0.000 {method 'getvalue' of '_io.BytesIO' objects}\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/_internal_utils.py:25(to_native_string)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:1229()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:202(start_connect)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:139(ticker)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:393(prepare_method)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:175()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:441(maybe_cast_pointwise_result)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:636(unquote_unreserved)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:850(more_results)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:277()\n", - " 7 0.000 0.000 0.000 0.000 {method 'rstrip' of 'bytes' objects}\n", - " 5 0.000 0.000 0.000 0.000 {method 'count' of 'bytes' objects}\n", - " 1 0.000 0.000 0.000 0.000 {method 'issuperset' of 'frozenset' objects}\n", - " 1 0.000 0.000 0.000 0.000 :815(__len__)\n", - " 18 0.000 0.000 0.000 0.000 {method 'popleft' of 'collections.deque' objects}\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:465(_decode)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:580(_get_axis_name)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2070()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:205()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:186(_from_factorized)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:814(_get_refs_and_copy)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/hooks.py:16()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_wait_gen.py:7(expo)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:514(_parse_content_type_header)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:1123(_make_date_converter)\n", - " 1 0.000 0.000 0.000 0.000 {method 'flatten' of 'numpy.ndarray' objects}\n", - " 1 0.000 0.000 0.000 0.000 :2(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:535(temp_setattr)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2180(_ensure_matching_resos)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:250(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/utils.py:121(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1720(_value_and_type_iter)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:303()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:211(is_multipart)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:1426(_validate_parse_dates_arg)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1251(_validate_host)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:208(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:215(_check_window_bounds)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:709(inferred_type)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/command_runner.py:465(system_settings)\n", - " 5 0.000 0.000 0.000 0.000 {method 'decode' of 'bytearray' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:659(unquote)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/shape_base.py:1257()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6061(_should_fallback_to_positional)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:130(_validate_timeout)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:91(ensure_python_int)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:439(_ensure_has_table_connection)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/queue.py:228(_put)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method _codecs.lookup}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/retry.py:379(_is_method_retryable)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/_collections.py:147(__new__)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:1954(get_debug)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:315(__getattr__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:392(ensure_dtype_objs)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:398()\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:669(result_type)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:518(__repr__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:421(lexsort)\n", - " 3 0.000 0.000 0.000 0.000 {method 'write' of '_io.TextIOWrapper' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/functools.py:421(_unwrap_partial)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:343()\n", - " 9 0.000 0.000 0.000 0.000 {method 'values' of 'collections.OrderedDict' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/queue.py:231(_get)\n", - " 4 0.000 0.000 0.000 0.000 {method 'groups' of 're.Match' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/multiprocessing/process.py:37(current_process)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2688(_deactivate_from_connection)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:140(__init__)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method fromisoformat}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:403(retries)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1047(_get_i8_values_and_mask)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:108(_noop)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:101(is_holiday)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/base.py:346(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:309(_operation_context)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:193(_userinfo)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/_optional.py:74(get_version)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:141(is_re)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2564(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2583(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/multiprocessing/process.py:189(name)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1877(_nonzero_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:315(step)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:212()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:607(consolidate)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:3015(parameters)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:125(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/_internal_utils.py:38(unicode_is_ascii)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:331(set_payload)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:330()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1256(determine_requested_columns)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2687(_max_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:460(tolist)\n", - " 1 0.000 0.000 0.000 0.000 :1()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/objects.py:72(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:333(tail)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:211()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/hooks.py:22(dispatch_hook)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:687(is_closed)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:60(__len__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:918(_wrap_ipv6)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:330(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:770(_maybe_check_integrity)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/putmask.py:129(setitem_datetimelike_compat)\n", - " 2 0.000 0.000 0.000 0.000 {method 'pop' of 'collections.OrderedDict' objects}\n", - " 4 0.000 0.000 0.000 0.000 {method 'count' of 'str' objects}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/version/__init__.py:470(_parse_letter_version)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_request_methods.py:51(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/parser.py:17(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:91(merge_hooks)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1225(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:450(check_dtype_backend)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:539(_push_exit_callback)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3984(_should_partial_index)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1243(_validate_path)\n", - " 4 0.000 0.000 0.000 0.000 {built-in method sys.getrecursionlimit}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:643(__enter__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:893(_check_data_length)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7718()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:489(_decref_socketios)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:194(_values_for_factorize)\n", - " 6 0.000 0.000 0.000 0.000 {method 'pop' of 'set' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/connection.py:103(allowed_gai_family)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:511(f)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1038(in_transaction)\n", - " 1 0.000 0.000 0.000 0.000 {method 'set' of '_contextvars.ContextVar' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:231(_constructor)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:208(_pop_message)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1230(_encode_request)\n", - " 1 0.000 0.000 0.000 0.000 :1101(_sanity_check)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/backoff/_common.py:28()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/base.py:88()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:417(_is_multiple)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:274(_create_data)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1989(index)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/request.py:134(set_file_position)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1290(_cookies_for_request)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:512(_validate_axis)\n", - " 2 0.000 0.000 0.000 0.000 {method 'update' of 'collections.OrderedDict' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:147(start_date)\n", - " 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:1221(_charset_id)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:146(dtype)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:92()\n", - " 2 0.000 0.000 0.000 0.000 {built-in method _weakref.proxy}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1234(_validate_method)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:131(close)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:856(columns)\n", - " 3 0.000 0.000 0.000 0.000 {method 'date' of 'datetime.datetime' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/version/__init__.py:149(__lt__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1445(is_valid)\n", - " 1 0.000 0.000 0.000 0.000 {method 'reset' of '_contextvars.ContextVar' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:567(connection)\n", - " 2 0.000 0.000 0.000 0.000 {method 'clear' of 'collections.OrderedDict' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:213()\n", - " 1 0.000 0.000 0.000 0.000 :315(__subclasshook__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/arraysetops.py:125(_unpack_tuple)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/numpy/function.py:383(validate_minmax_axis)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1355(common_dtype_categorical_compat)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:44(_debug)\n", - " 1 0.000 0.000 0.000 0.000 {method 'swapaxes' of 'numpy.ndarray' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:2365(_validate_skipfooter)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/calendar.py:102(isleap)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:255(_has_complex_date_col)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:351()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:895(_get_hostport)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_validate_call.py:51()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:194(__set_y)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12199()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/queue.py:222(_empty)\n", - " 4 0.000 0.000 0.000 0.000 {method 'items' of 'collections.OrderedDict' objects}\n", - " 1 0.000 0.000 0.000 0.000 {built-in method sys.getfilesystemencoding}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1567(_maybe_transpose_result)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:94(_process_parse_dates_argument)\n", - " 2 0.000 0.000 0.000 0.000 {method 'extend' of 'collections.deque' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:176()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/database/SQLHelpers.py:336(__init__)\n", - " 1 0.000 0.000 0.000 0.000 {method 'sort' of 'list' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:1447(is_index_col)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/version/__init__.py:534()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:2056(_clean_na_values)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:110(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:1110(get_warnings)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:540(closed)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:155(_check_executed)\n", - " 2 0.000 0.000 0.000 0.000 {method 'connected' of '_mysql_connector.MySQL' objects}\n", - " 2 0.000 0.000 0.000 0.000 {method 'split' of 'bytes' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_exceptions.py:15(rewrite_exception)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:227(connect_timeout)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:245(_init)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/container.py:59(_get_provider)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:3019(return_annotation)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/shape_base.py:1181(_tile_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:326()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:217(_from_selection)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:280(start)\n", - " 1 0.000 0.000 0.000 0.000 {method 'pop' of 'collections.deque' objects}\n", - " 4 0.000 0.000 0.000 0.000 {method 'seek' of '_io.StringIO' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:205(is_unique)\n", - " 5 0.000 0.000 0.000 0.000 {method 'isascii' of 'str' objects}\n", - " 1 0.000 0.000 0.000 0.000 {built-in method _codecs.lookup_error}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2096(_clip_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:364(_get_monthly_rule)\n", - " 2 0.000 0.000 0.000 0.000 {method 'truncate' of '_io.StringIO' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:216(_validate_dtype)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:743(set_environ)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:986(_validate_usecols_arg)\n", - " 2 0.000 0.000 0.000 0.000 {method 'st_server_status' of '_mysql_connector.MySQL' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:419(_repeat_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:159(_freeze)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1782(handle_extra_cols)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:467()\n", - " 1 0.000 0.000 0.000 0.000 {method 'consume_result' of '_mysql_connector.MySQL' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:891(default_user_agent)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method sys.audit}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:510()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:218()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:188(_expand_user)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:886()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:572(prepare_content_length)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:292(is_fsspec_url)\n", - " 1 0.000 0.000 0.000 0.000 {method 'warning_count' of '_mysql_connector.MySQL' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:117(info)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:1065(soft_close)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ipaddress.py:574(__int__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:462(_create_exit_wrapper)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:2267(_extract_dialect)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:235()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:1232(enforce_inputs)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:295(is_closed)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:175(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:105(_box_func)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:4948(_needs_reindex_multi)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:11522()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:296(best)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:206()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:192()\n", - " 1 0.000 0.000 0.000 0.000 {method 'with_traceback' of 'BaseException' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1763(pre_exec)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/mysqlconnector.py:142(_extract_error_code)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:202(_selected_obj)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/errors.py:80(__str__)\n", - " 2 0.000 0.000 0.000 0.000 {method 'st_warning_count' of '_mysql_connector.MySQL' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:257(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:183(host)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2508(_cumsum_dispatcher)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:527(validate_integer)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:3104(_cumprod_dispatcher)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/version/__init__.py:508(_parse_local_version)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1986(_sort_levels_monotonic)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:546(invalidated)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:551()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/proxy.py:11(connection_requires_http_tunnel)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/sql/elements.py:5219(construct)\n", - " 1 0.000 0.000 0.000 0.000 {method 'more_results' of '_mysql_connector.MySQL' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:1448(__enter__)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method _socket.getdefaulttimeout}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/response.py:79()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:581(iter_slices)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:2486(reset)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:93(encoding)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:277(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:695(do_begin)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1803(handle_dbapi_exception)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:2245(_isclose_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:504(description)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1976(_shape_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:559(_validate_names)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/cd.py:305()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:124(__iter__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/arraysetops.py:133(_unique_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:3172(_ndim_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:191(_values_for_argsort)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:339(_validate_conn)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:247()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1771(post_exec)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:172(raw)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:578(add_headers)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:107(_copy_immutable)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:154(chaos)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method builtins.globals}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:87(get_new_headers)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:216()\n", - " 1 0.000 0.000 0.000 0.000 {function HTTPResponse.flush at 0x103e89260}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:451(__enter__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:317(is_consolidated)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:231(__enter__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1987(__enter__)\n", - "\n", - "\n", - "\n" - ] - } - ], - "source": [ - "## OderPicker.get_order\n", - "print(returned_order[1])" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Open_interestDatetime
Datetime
2023-02-03159092023020306:30:00
2023-02-06160472023020606:30:05
2023-02-07162132023020706:30:00
2023-02-08163652023020806:30:09
2023-02-09165222023020906:30:13
............
2023-12-22167732023122206:30:09
2023-12-26167422023122606:30:02
2023-12-27166452023122706:30:04
2023-12-28166202023122806:30:11
2023-12-29166642023122906:30:02
\n", - "

228 rows × 3 columns

\n", - "
" - ], - "text/plain": [ - " Open_interest Date time\n", - "Datetime \n", - "2023-02-03 15909 20230203 06:30:00\n", - "2023-02-06 16047 20230206 06:30:05\n", - "2023-02-07 16213 20230207 06:30:00\n", - "2023-02-08 16365 20230208 06:30:09\n", - "2023-02-09 16522 20230209 06:30:13\n", - "... ... ... ...\n", - "2023-12-22 16773 20231222 06:30:09\n", - "2023-12-26 16742 20231226 06:30:02\n", - "2023-12-27 16645 20231227 06:30:04\n", - "2023-12-28 16620 20231228 06:30:11\n", - "2023-12-29 16664 20231229 06:30:02\n", - "\n", - "[228 rows x 3 columns]" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from EventDriven.riskmanager.utils import get_cache" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'pending_tasks': 0,\n", - " 'max_queue_size': 100,\n", - " 'active_processes': 4,\n", - " 'total_processes': 4,\n", - " 'current_requests': {'SaveWorker-0': },\n", - " 'num_finished_requests': 0,\n", - " 'num_failed_requests': 0,\n", - " 'failed_initialization': 0}" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "_SaveManager.status()" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Loaded 224 requests from file\n", - "Loaded 206 unique requests\n" - ] - } - ], - "source": [ - "import json\n", - "def requests_from_jsonl():\n", - " reqs = []\n", - " with open('/Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/scheduler/requests.jsonl', 'r') as f:\n", - " for line in f:\n", - " line = line.strip()\n", - " if not line:\n", - " continue\n", - " k = json.loads(line)\n", - " if '_requests' in k:\n", - " k.pop('_requests')\n", - " reqs.append(k)\n", - " print(f\"Loaded {len(reqs)} requests from file\")\n", - " single = [req for req in reqs if req['type_'] == 'single']\n", - " bulk = [req for req in reqs if req['type_'] == 'bulk']\n", - " chain = [req for req in reqs if req['type_'] == 'chain']\n", - " reqs = single + bulk + chain\n", - " reqs = [dict(t) for t in {tuple(sorted(r.items())) for r in reqs}]\n", - " print(f\"Loaded {len(reqs)} unique requests\")\n", - " return reqs\n", - "reqs = requests_from_jsonl()" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[{'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 115.0,\n", - " 'tick': 'AMZN',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 303.33,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 500.0,\n", - " 'tick': 'NFLX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2025-01-17',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 145.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2024-01-19',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2024-01-19',\n", - " 'strike': 135.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2024-01-19',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2024-01-19',\n", - " 'strike': 107.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2024-01-19',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2024-01-19',\n", - " 'strike': 150.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 150.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-12-27 00:00:00',\n", - " 'strike': 690.0,\n", - " 'tick': 'COST',\n", - " 'type_': 'single'},\n", - " {'end': '2024-01-19',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2024-01-19',\n", - " 'strike': 106.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 190.0,\n", - " 'tick': 'NVDA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-05-25 00:00:00',\n", - " 'strike': 205.0,\n", - " 'tick': 'NVDA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2025-01-17',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 135.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19 00:00:00',\n", - " 'print_info': False,\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'tick': 'SBUX',\n", - " 'type_': 'bulk'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 120.0,\n", - " 'tick': 'AMZN',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 720.0,\n", - " 'tick': 'COST',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19 00:00:00',\n", - " 'print_info': False,\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'tick': 'AMD',\n", - " 'type_': 'bulk'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 230.0,\n", - " 'tick': 'NVDA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 440.0,\n", - " 'tick': 'NFLX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 185.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 480.0,\n", - " 'tick': 'NFLX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 270.0,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20 00:00:00',\n", - " 'print_info': False,\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'tick': 'AMZN',\n", - " 'type_': 'bulk'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 190.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 325.0,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 125.0,\n", - " 'tick': 'AMZN',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 195.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 200.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 700.0,\n", - " 'tick': 'COST',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 135.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2025-01-17',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 120.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2025-01-17',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 280.0,\n", - " 'tick': 'BA',\n", - " 'type_': 'single'},\n", - " {'end': '2024-01-19',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2024-01-19',\n", - " 'strike': 120.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 170.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2024-01-19',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2024-01-19',\n", - " 'strike': 130.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 110.0,\n", - " 'tick': 'AMD',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 330.0,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 140.0,\n", - " 'tick': 'AMZN',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 290.0,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 390.0,\n", - " 'tick': 'NFLX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 200.0,\n", - " 'tick': 'META',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 430.0,\n", - " 'tick': 'NFLX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20 00:00:00',\n", - " 'print_info': False,\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'tick': 'AAPL',\n", - " 'type_': 'bulk'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21 00:00:00',\n", - " 'print_info': False,\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'tick': 'TSLA',\n", - " 'type_': 'bulk'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 140.0,\n", - " 'tick': 'AMZN',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 260.0,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2025-01-17 00:00:00',\n", - " 'print_info': False,\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'tick': 'SBUX',\n", - " 'type_': 'bulk'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 140.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 300.0,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 315.0,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 115.0,\n", - " 'tick': 'AMZN',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 220.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 185.0,\n", - " 'tick': 'NVDA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-03-15 00:00:00',\n", - " 'print_info': False,\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'tick': 'AAPL',\n", - " 'type_': 'bulk'},\n", - " {'end': '2023-01-18 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 115.0,\n", - " 'tick': 'AMZN',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 485.0,\n", - " 'tick': 'NFLX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 155.0,\n", - " 'tick': 'AMZN',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 230.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20 00:00:00',\n", - " 'print_info': False,\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'tick': 'TSLA',\n", - " 'type_': 'bulk'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 180.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19 00:00:00',\n", - " 'print_info': False,\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'tick': 'AAPL',\n", - " 'type_': 'bulk'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 500.0,\n", - " 'tick': 'NFLX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 410.0,\n", - " 'tick': 'NFLX',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 155.0,\n", - " 'tick': 'META',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 200.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 280.0,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 460.0,\n", - " 'tick': 'NFLX',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 130.0,\n", - " 'tick': 'AMZN',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 175.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 145.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 160.0,\n", - " 'tick': 'META',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 130.0,\n", - " 'tick': 'AMZN',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 290.0,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 190.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 140.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 195.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-03-15 00:00:00',\n", - " 'print_info': False,\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'tick': 'AMZN',\n", - " 'type_': 'bulk'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 740.0,\n", - " 'tick': 'COST',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 470.0,\n", - " 'tick': 'NFLX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 235.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 250.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-07-13 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 200.0,\n", - " 'tick': 'AMZN',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 515.0,\n", - " 'tick': 'NFLX',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 230.0,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 205.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2024-01-19',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2024-01-19',\n", - " 'strike': 115.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 465.0,\n", - " 'tick': 'NFLX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 130.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2025-01-17',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 270.0,\n", - " 'tick': 'BA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2025-01-17',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 115.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-01-27 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 150.0,\n", - " 'tick': 'AMZN',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 125.0,\n", - " 'tick': 'AMD',\n", - " 'type_': 'single'},\n", - " {'end': '2023-02-02 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 155.0,\n", - " 'tick': 'AMZN',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 210.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 345.0,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20 00:00:00',\n", - " 'print_info': False,\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'tick': 'NFLX',\n", - " 'type_': 'bulk'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 335.0,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 190.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 215.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 205.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 620.0,\n", - " 'tick': 'COST',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 125.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 210.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 305.0,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 150.0,\n", - " 'tick': 'AMZN',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 210.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 296.67,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 293.33,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 115.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 310.0,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 200.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 180.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 205.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 145.0,\n", - " 'tick': 'AMZN',\n", - " 'type_': 'single'},\n", - " {'end': '2023-04-27 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 150.0,\n", - " 'tick': 'AMZN',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 225.0,\n", - " 'tick': 'NVDA',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 170.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 145.0,\n", - " 'tick': 'AMZN',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 475.0,\n", - " 'tick': 'NFLX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2025-01-17',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 125.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2025-01-17',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 140.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2024-01-19',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2024-01-19',\n", - " 'strike': 125.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 185.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 220.0,\n", - " 'tick': 'NVDA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 225.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 120.0,\n", - " 'tick': 'AMZN',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 195.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 180.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-04-18 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 115.0,\n", - " 'tick': 'AMZN',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 490.0,\n", - " 'tick': 'NFLX',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 215.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 130.0,\n", - " 'tick': 'AMD',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 275.0,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 130.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-01-17 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 190.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 185.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 125.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 320.0,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19 00:00:00',\n", - " 'print_info': False,\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'tick': 'NFLX',\n", - " 'type_': 'bulk'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19 00:00:00',\n", - " 'print_info': False,\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'tick': 'META',\n", - " 'type_': 'bulk'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 105.0,\n", - " 'tick': 'AMD',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 505.0,\n", - " 'tick': 'NFLX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-01-17 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 250.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 450.0,\n", - " 'tick': 'NFLX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 276.67,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 215.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 680.0,\n", - " 'tick': 'COST',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 230.0,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 265.0,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 125.0,\n", - " 'tick': 'AMZN',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 115.0,\n", - " 'tick': 'AMD',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 190.0,\n", - " 'tick': 'META',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 185.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 200.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 100.0,\n", - " 'tick': 'AMD',\n", - " 'type_': 'single'},\n", - " {'end': '2024-01-19',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2024-01-19',\n", - " 'strike': 145.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 240.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 195.0,\n", - " 'tick': 'META',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 200.0,\n", - " 'tick': 'NVDA',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 195.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 180.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 185.0,\n", - " 'tick': 'META',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 135.0,\n", - " 'tick': 'AMZN',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-05-25 00:00:00',\n", - " 'strike': 210.0,\n", - " 'tick': 'NVDA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 280.0,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 245.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2025-01-17',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 260.0,\n", - " 'tick': 'BA',\n", - " 'type_': 'single'},\n", - " {'end': '2024-01-19',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2024-01-19',\n", - " 'strike': 140.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19 00:00:00',\n", - " 'print_info': False,\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'tick': 'BA',\n", - " 'type_': 'bulk'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 295.0,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2024-01-25 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-07-20 00:00:00',\n", - " 'strike': 130.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21 00:00:00',\n", - " 'print_info': False,\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'tick': 'SBUX',\n", - " 'type_': 'bulk'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-03-15',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 150.0,\n", - " 'tick': 'AMZN',\n", - " 'type_': 'single'},\n", - " {'end': '2023-07-20 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 450.0,\n", - " 'tick': 'NFLX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 520.0,\n", - " 'tick': 'NFLX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 560.0,\n", - " 'tick': 'NFLX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2025-01-17',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 240.0,\n", - " 'tick': 'BA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 470.0,\n", - " 'tick': 'NFLX',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 170.0,\n", - " 'tick': 'META',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 120.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-07-20 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 500.0,\n", - " 'tick': 'NFLX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 285.0,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 175.0,\n", - " 'tick': 'META',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 286.67,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20 00:00:00',\n", - " 'print_info': False,\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'tick': 'AMD',\n", - " 'type_': 'bulk'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 205.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 210.0,\n", - " 'tick': 'META',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 283.33,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 340.0,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 120.0,\n", - " 'tick': 'AMD',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 215.0,\n", - " 'tick': 'NVDA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 200.0,\n", - " 'tick': 'AMZN',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 165.0,\n", - " 'tick': 'META',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 710.0,\n", - " 'tick': 'COST',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 300.0,\n", - " 'tick': 'TSLA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-09-20',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 215.0,\n", - " 'tick': 'AAPL',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 760.0,\n", - " 'tick': 'COST',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-06-21',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 120.0,\n", - " 'tick': 'SBUX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2025-01-17',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 290.0,\n", - " 'tick': 'BA',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 180.0,\n", - " 'tick': 'META',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2025-01-17 00:00:00',\n", - " 'print_info': False,\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'tick': 'BA',\n", - " 'type_': 'bulk'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 195.0,\n", - " 'tick': 'NVDA',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 495.0,\n", - " 'tick': 'NFLX',\n", - " 'type_': 'single'},\n", - " {'end': '2024-03-29 00:00:00',\n", - " 'exp': '2024-01-19',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2022-10-04 00:00:00',\n", - " 'strike': 510.0,\n", - " 'tick': 'NFLX',\n", - " 'type_': 'single'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2024-01-19 00:00:00',\n", - " 'print_info': False,\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'tick': 'NVDA',\n", - " 'type_': 'bulk'},\n", - " {'end': '2023-12-29 00:00:00',\n", - " 'exp': '2025-01-17',\n", - " 'right': 'C',\n", - " 'save_func': 'save_to_database',\n", - " 'start': '2023-01-04 00:00:00',\n", - " 'strike': 250.0,\n", - " 'tick': 'BA',\n", - " 'type_': 'single'}]" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "[dict(t) for t in {tuple(sorted(r.items())) for r in reqs}]" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{(('a', 1),), (('a', 1), ('b', 2)), (('a', 2),), (('b', 2), ('a', 1))}" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "{tuple((d.items())) for d in lst}" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(Timestamp('2023-02-03 00:00:00'), Timestamp('2023-12-29 00:00:00'))" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.start_date, evb_backtest.end_date" - ] - }, - { - "cell_type": "code", - "execution_count": 79, - "metadata": {}, - "outputs": [], - "source": [ - "from trade.assets.helpers.DataManagers import OptionDataManager \n", - "dm = OptionDataManager(opttick='AAPL20240119C175')" - ] - }, - { - "cell_type": "code", - "execution_count": 81, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "OptionDataManager calculating greeks. Database unavailable\n" - ] - } - ], - "source": [ - "from trade.assets.helpers.DataManagers import OptionDataManager \n", - "dm = OptionDataManager(opttick='AAPL20240119C175')\n", - "data = dm.get_timeseries('2023-02-03', '2023-12-03', '1d', 'greeks')\n", - "data" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The autoreload extension is already loaded. To reload it, use:\n", - " %reload_ext autoreload\n" - ] - } - ], - "source": [ - "%load_ext autoreload\n", - "%autoreload 2\n", - "from trade.assets.helpers.DataManagers import OptionDataManager\n", - "data_manager = OptionDataManager(opttick='AAPL20240322C170', default_fill='midpoint')" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
OpenHighLowCloseMidpointVolume
Datetime
2024-02-0119.0019.0019.0019.0019.1751
2024-02-0212.9518.7512.9518.7518.0753
2024-02-0519.5519.5519.5519.5519.4252
2024-02-0619.7019.7019.7019.7020.8501
2024-02-0720.9321.5820.2520.7520.8506
.....................
2024-03-185.958.004.304.404.4253658
2024-03-194.956.833.856.106.3751776
2024-03-206.008.755.408.758.675613
2024-03-216.997.451.762.032.02537144
2024-03-222.103.031.022.302.26030964
\n", - "

37 rows × 6 columns

\n", - "
" - ], - "text/plain": [ - " Open High Low Close Midpoint Volume\n", - "Datetime \n", - "2024-02-01 19.00 19.00 19.00 19.00 19.175 1\n", - "2024-02-02 12.95 18.75 12.95 18.75 18.075 3\n", - "2024-02-05 19.55 19.55 19.55 19.55 19.425 2\n", - "2024-02-06 19.70 19.70 19.70 19.70 20.850 1\n", - "2024-02-07 20.93 21.58 20.25 20.75 20.850 6\n", - "... ... ... ... ... ... ...\n", - "2024-03-18 5.95 8.00 4.30 4.40 4.425 3658\n", - "2024-03-19 4.95 6.83 3.85 6.10 6.375 1776\n", - "2024-03-20 6.00 8.75 5.40 8.75 8.675 613\n", - "2024-03-21 6.99 7.45 1.76 2.03 2.025 37144\n", - "2024-03-22 2.10 3.03 1.02 2.30 2.260 30964\n", - "\n", - "[37 rows x 6 columns]" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "data = data_manager.get_timeseries(\n", - " start = '2024-01-01',\n", - " end = '2024-12-31',\n", - " interval = '1d',\n", - " type_ = 'spot'\n", - ")\n", - "data" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "use_cols = [x for x in data.columns if 'Midpoint' in x]\n", - "data2 = data[use_cols]\n", - "data2.columns = [x.split('_')[1].capitalize() for x in data2.columns]\n", - "data2" - ] - }, - { - "cell_type": "code", - "execution_count": 67, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['L', 'AAPL20240315C170']\n", - "['S', 'AAPL20240315C175']\n", - "Using available dataing available data\r" - ] - } - ], - "source": [ - "# evb_backtest.risk_manager.position_data['&L:AMD20220617P80&S:AMD20220617P75']\n", - "# evb_backtest.portfolio.events.advance_date()\n", - "evb_backtest.risk_manager.calculate_position_greeks('&L:AAPL20240315C170&S:AAPL20240315C175', '2023-10-20')\n", - "# v = evb_backtest.risk_manager.limits_check()" - ] - }, - { - "cell_type": "code", - "execution_count": 63, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "12.35\n", - "8.719999999999999\n" - ] - } - ], - "source": [ - "print((10.1 + 12.7 + 15.0 + 11.6)/4)\n", - "print((6.9 + 9.1 + 8.8 + 9.1 + 9.7)/5)" - ] - }, - { - "cell_type": "code", - "execution_count": 54, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[[], []]" - ] - }, - "execution_count": 54, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "[[], []]" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
DeltaGammaThetaRhoVegaVannaVolgaMidpointSRYS0_closes0_close
Datetime
2023-03-060.043469-0.000003-0.0011270.0494750.008352-0.121052-13.5870821.8750.00.00.00.0153.830002
2023-03-070.045053-0.000054-0.0015170.0497870.011670-0.113807-15.2686641.9750.00.00.00.0151.600006
2023-03-080.044645-0.000027-0.0013300.0501120.009961-0.120422-14.5680891.9250.00.00.00.0152.869995
2023-03-090.0418840.000116-0.0011470.0475050.012243-0.095080-14.4763341.6500.00.00.00.0150.589996
2023-03-100.045343-0.000021-0.0017850.0489140.016040-0.095283-16.4651131.9250.00.00.00.0148.500000
..........................................
2023-10-200.065127-0.000915-0.0010350.033691-0.014997-0.3536379.7866822.9250.00.00.00.0172.880005
2023-10-230.066135-0.000966-0.0010870.033629-0.015245-0.36283410.2420122.9500.00.00.00.0173.000000
2023-10-240.067072-0.001022-0.0009660.034052-0.016610-0.38395412.2998602.9750.00.00.00.0173.440002
2023-10-250.068176-0.000731-0.0012480.034916-0.010601-0.3446604.6714902.7250.00.00.00.0171.100006
2023-10-260.071325-0.000480-0.0025830.0364680.000396-0.286381-5.9377232.5000.00.00.00.0166.889999
\n", - "

169 rows × 13 columns

\n", - "
" - ], - "text/plain": [ - " Delta Gamma Theta Rho Vega Vanna \\\n", - "Datetime \n", - "2023-03-06 0.043469 -0.000003 -0.001127 0.049475 0.008352 -0.121052 \n", - "2023-03-07 0.045053 -0.000054 -0.001517 0.049787 0.011670 -0.113807 \n", - "2023-03-08 0.044645 -0.000027 -0.001330 0.050112 0.009961 -0.120422 \n", - "2023-03-09 0.041884 0.000116 -0.001147 0.047505 0.012243 -0.095080 \n", - "2023-03-10 0.045343 -0.000021 -0.001785 0.048914 0.016040 -0.095283 \n", - "... ... ... ... ... ... ... \n", - "2023-10-20 0.065127 -0.000915 -0.001035 0.033691 -0.014997 -0.353637 \n", - "2023-10-23 0.066135 -0.000966 -0.001087 0.033629 -0.015245 -0.362834 \n", - "2023-10-24 0.067072 -0.001022 -0.000966 0.034052 -0.016610 -0.383954 \n", - "2023-10-25 0.068176 -0.000731 -0.001248 0.034916 -0.010601 -0.344660 \n", - "2023-10-26 0.071325 -0.000480 -0.002583 0.036468 0.000396 -0.286381 \n", - "\n", - " Volga Midpoint S R Y S0_close s0_close \n", - "Datetime \n", - "2023-03-06 -13.587082 1.875 0.0 0.0 0.0 0.0 153.830002 \n", - "2023-03-07 -15.268664 1.975 0.0 0.0 0.0 0.0 151.600006 \n", - "2023-03-08 -14.568089 1.925 0.0 0.0 0.0 0.0 152.869995 \n", - "2023-03-09 -14.476334 1.650 0.0 0.0 0.0 0.0 150.589996 \n", - "2023-03-10 -16.465113 1.925 0.0 0.0 0.0 0.0 148.500000 \n", - "... ... ... ... ... ... ... ... \n", - "2023-10-20 9.786682 2.925 0.0 0.0 0.0 0.0 172.880005 \n", - "2023-10-23 10.242012 2.950 0.0 0.0 0.0 0.0 173.000000 \n", - "2023-10-24 12.299860 2.975 0.0 0.0 0.0 0.0 173.440002 \n", - "2023-10-25 4.671490 2.725 0.0 0.0 0.0 0.0 171.100006 \n", - "2023-10-26 -5.937723 2.500 0.0 0.0 0.0 0.0 166.889999 \n", - "\n", - "[169 rows x 13 columns]" - ] - }, - "execution_count": 39, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.risk_manager.position_data['&L:AAPL20240315C170&S:AAPL20240315C175']" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### ***RISK MANAGER CORE METHOD TESTS***" - ] - }, - { - "cell_type": "code", - "execution_count": 90, - "metadata": {}, - "outputs": [], - "source": [ - "test_date = pd.to_datetime('2021-07-15')\n", - "position_str = '&L:AMD20220617C115&S:AMD20220617C125'\n", - "def parse_position_id(positionID):\n", - " position_str = positionID\n", - " position_list = position_str.split('&')\n", - " position_list = [x.split(':') for x in position_list if x]\n", - " position_list_parsed = [(x[0], parse_option_tick(x[1])) for x in position_list]\n", - " position_dict = dict(L = [], S = [])\n", - " for x in position_list_parsed:\n", - " position_dict[x[0]].append(x[1])\n", - " return position_dict, position_list\n", - "\n", - "def get_position_dict(positionID):\n", - " return parse_position_id(positionID)[0]\n", - "\n", - "def get_position_list(positionID):\n", - " return parse_position_id(positionID)[1]\n", - "\n", - "def get_option_price(optID, portfolio, date):\n", - " return portfolio.options_data[optID]['Midpoint'][date]\n", - "\n", - " \n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Console Logging & File Logging Can be configured using STREAM_LOG_LEVEL and FILE_LOG_LEVEL in environment variables.\n", - "Propagate to root logger can be set using PROPAGATE_TO_ROOT_LOGGER in environment variables.\n", - "Example:\n", - "STREAM_LOG_LEVEL = 'DEBUG'\n", - "FILE_LOG_LEVEL = 'INFO'\n", - "PROPAGATE_TO_ROOT_LOGGER = 'False'\n", - "\n", - "2025-04-20 00:37:06 trade.helpers.Logging INFO: Logging Root Directory: /Users/chiemelienwanisobi/cloned_repos/QuantTools/logs\n", - "Using Proxy URL: http://18.232.166.224:5500/thetadata\n" - ] - }, - { - "ename": "OpenBBError", - "evalue": "400: unexpected error", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mHTTPException\u001b[0m Traceback (most recent call last)", - "File \u001b[0;32m~/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/account.py:50\u001b[0m, in \u001b[0;36mAccount._log_account_command..wrapped\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 48\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 49\u001b[0m \u001b[38;5;66;03m# pylint: disable=E1102\u001b[39;00m\n\u001b[0;32m---> 50\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;66;03m# type: ignore[operator]\u001b[39;00m\n\u001b[1;32m 51\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n", - "File \u001b[0;32m~/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/account.py:124\u001b[0m, in \u001b[0;36mAccount.login\u001b[0;34m(self, email, password, pat, remember_me, return_settings)\u001b[0m\n\u001b[1;32m 104\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"Login to hub.\u001b[39;00m\n\u001b[1;32m 105\u001b[0m \n\u001b[1;32m 106\u001b[0m \u001b[38;5;124;03mParameters\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 122\u001b[0m \u001b[38;5;124;03m User settings: profile, credentials, preferences\u001b[39;00m\n\u001b[1;32m 123\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m--> 124\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_hub_service \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_create_hub_service\u001b[49m\u001b[43m(\u001b[49m\u001b[43memail\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpassword\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpat\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 125\u001b[0m incoming \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_hub_service\u001b[38;5;241m.\u001b[39mpull()\n", - "File \u001b[0;32m~/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/account.py:92\u001b[0m, in \u001b[0;36mAccount._create_hub_service\u001b[0;34m(self, email, password, pat)\u001b[0m\n\u001b[1;32m 91\u001b[0m hs \u001b[38;5;241m=\u001b[39m HubService()\n\u001b[0;32m---> 92\u001b[0m \u001b[43mhs\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconnect\u001b[49m\u001b[43m(\u001b[49m\u001b[43memail\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpassword\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpat\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 93\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m hs\n", - "File \u001b[0;32m~/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/service/hub_service.py:70\u001b[0m, in \u001b[0;36mHubService.connect\u001b[0;34m(self, email, password, pat)\u001b[0m\n\u001b[1;32m 69\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m pat:\n\u001b[0;32m---> 70\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_session \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_get_session_from_platform_token\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpat\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 71\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_session\n", - "File \u001b[0;32m~/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/service/hub_service.py:171\u001b[0m, in \u001b[0;36mHubService._get_session_from_platform_token\u001b[0;34m(self, token)\u001b[0m\n\u001b[1;32m 170\u001b[0m detail \u001b[38;5;241m=\u001b[39m response\u001b[38;5;241m.\u001b[39mjson()\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdetail\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m)\n\u001b[0;32m--> 171\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m HTTPException(status_code, detail)\n", - "\u001b[0;31mHTTPException\u001b[0m: 400: unexpected error", - "\nThe above exception was the direct cause of the following exception:\n", - "\u001b[0;31mOpenBBError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[1], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtrade\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01massets\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mStock\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m Stock\n", - "File \u001b[0;32m~/cloned_repos/QuantTools/trade/assets/Stock.py:34\u001b[0m\n\u001b[1;32m 32\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtrade\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mhelpers\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mopenbb_helper\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;241m*\u001b[39m\n\u001b[1;32m 33\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtrade\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mmodels\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mVolSurface\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m SurfaceLab\n\u001b[0;32m---> 34\u001b[0m \u001b[43mload_openBB\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 35\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01myfinance\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01myf\u001b[39;00m\n\u001b[1;32m 36\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtrade\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01massets\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mrates\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m get_risk_free_rate_helper\n", - "File \u001b[0;32m~/cloned_repos/QuantTools/trade/helpers/openbb_helper.py:6\u001b[0m, in \u001b[0;36mload_openBB\u001b[0;34m()\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mopenbb\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m obb\n\u001b[1;32m 5\u001b[0m openbb_key \u001b[38;5;241m=\u001b[39m os\u001b[38;5;241m.\u001b[39menviron\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mOPENBB_KEY\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m----> 6\u001b[0m \u001b[43mobb\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43maccount\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mlogin\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpat\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mopenbb_key\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mremember_me\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[1;32m 7\u001b[0m obb\u001b[38;5;241m.\u001b[39maccount\u001b[38;5;241m.\u001b[39mrefresh()\n\u001b[1;32m 8\u001b[0m obb\u001b[38;5;241m.\u001b[39maccount\u001b[38;5;241m.\u001b[39msave()\n", - "File \u001b[0;32m~/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/account.py:52\u001b[0m, in \u001b[0;36mAccount._log_account_command..wrapped\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 50\u001b[0m result \u001b[38;5;241m=\u001b[39m func(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs) \u001b[38;5;66;03m# type: ignore[operator]\u001b[39;00m\n\u001b[1;32m 51\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[0;32m---> 52\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m OpenBBError(e) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01me\u001b[39;00m\n\u001b[1;32m 53\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[1;32m 54\u001b[0m user_settings \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_base_app\u001b[38;5;241m.\u001b[39m_command_runner\u001b[38;5;241m.\u001b[39muser_settings\n", - "\u001b[0;31mOpenBBError\u001b[0m: 400: unexpected error" - ] - } - ], - "source": [ - "from trade.assets.Stock import Stock" - ] - }, - { - "cell_type": "code", - "execution_count": 329, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Spot Price at Purchase: 93.30999755859375 at time 2021-07-01 00:00:00\n", - "Target Delta: 1.45\n", - "Delta from Full Spend: 0.9306110124412736, Size: 13\n", - "Delta with Size Limit: 1.4317092499096518, Size: 20\n" - ] - }, - { - "data": { - "text/plain": [ - "13" - ] - }, - "execution_count": 329, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# evb_backtest.risk_manager.calculate_position_greeks(position_str,test_date)\n", - "evb_backtest.risk_manager.calculate_quantity(position_str, 'AMD20210701LONG', '2021-07-01')\n", - "# evb_backtest.risk_manager.update_signal_limits(fill_event)" - ] - }, - { - "cell_type": "code", - "execution_count": 237, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'AMD': {'position': {'long': ['AMD20220617C115'],\n", - " 'short': ['AMD20220617C125'],\n", - " 'trade_id': '&L:AMD20220617C115&S:AMD20220617C125',\n", - " 'close': 1.825000000000001},\n", - " 'quantity': 11,\n", - " 'entry_price': 2270.5487409714515,\n", - " 'market_value': 2007.500000000001,\n", - " 'signal_id': 'AMD20210701LONG'}}" - ] - }, - "execution_count": 237, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.portfolio.current_positions" - ] - }, - { - "cell_type": "code", - "execution_count": 239, - "metadata": {}, - "outputs": [ - { - "ename": "KeyError", - "evalue": "'delta'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[239], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mevb_backtest\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrisk_manager\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mlimits_check\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/cloned_repos/QuantTools/EventDriven/riskmanager.py:830\u001b[0m, in \u001b[0;36mRiskManager.limits_check\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 828\u001b[0m current_positions \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpm\u001b[38;5;241m.\u001b[39mcurrent_positions\n\u001b[1;32m 829\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m symbol, position \u001b[38;5;129;01min\u001b[39;00m current_positions\u001b[38;5;241m.\u001b[39mitems():\n\u001b[0;32m--> 830\u001b[0m max_delta \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msignal_limits\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mdelta\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m[symbol]\n\u001b[1;32m 831\u001b[0m quantity \u001b[38;5;241m=\u001b[39m position[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mquantity\u001b[39m\u001b[38;5;124m'\u001b[39m]\n\u001b[1;32m 832\u001b[0m trade_id \u001b[38;5;241m=\u001b[39m position[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mposition\u001b[39m\u001b[38;5;124m'\u001b[39m][\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mtrade_id\u001b[39m\u001b[38;5;124m'\u001b[39m]\n", - "\u001b[0;31mKeyError\u001b[0m: 'delta'" - ] - } - ], - "source": [ - "evb_backtest.risk_manager.limits_check()" - ] - }, - { - "cell_type": "code", - "execution_count": 203, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'long': ['AMD20220617C115'],\n", - " 'short': ['AMD20220617C125'],\n", - " 'trade_id': '&L:AMD20220617C115&S:AMD20220617C125',\n", - " 'close': 1.3499999999999996}" - ] - }, - "execution_count": 203, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "events = evb_backtest.events.events.copy()\n", - "events[events.type == 'FILL'].position[0]" - ] - }, - { - "cell_type": "code", - "execution_count": 204, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Equivalent Delta Size: 1.0\n" - ] - } - ], - "source": [ - "from EventDriven.event import FillEvent\n", - "fill_event = FillEvent(datetime = '2021-07-01', \n", - " symbol ='AMD', \n", - " exchange = 'I', \n", - " quantity=14, \n", - " direction = 'LONG', \n", - " fill_cost = 0,\n", - " signal_id='AMD20210701LONG',\n", - " commission = 0.13,\n", - " position = {'long': ['AMD20220617C115'],\n", - " 'short': ['AMD20220617C125'],\n", - " 'trade_id': '&L:AMD20220617C115&S:AMD20220617C125',\n", - " 'close': 1.3499999999999996})\n", - "evb_backtest.risk_manager.update_signal_limits(fill_event)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 175, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0 AMD20210701LONG\n", - "Name: SignalID, dtype: object" - ] - }, - "execution_count": 175, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.portfolio.trades['SignalID']" - ] - }, - { - "cell_type": "code", - "execution_count": 193, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2729.761012667402" - ] - }, - "execution_count": 193, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.portfolio.weight_map['AMD'] * 20_000" - ] - }, - { - "cell_type": "code", - "execution_count": 194, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1937.393900773914" - ] - }, - "execution_count": 194, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.portfolio.allocated_cash_map['AMD']" - ] - }, - { - "cell_type": "code", - "execution_count": 164, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
DeltaGammaVegaThetaRhoVannaVolgaMidpointIvS0_closes0_close
Datetime
2021-07-010.0715850.0007790.025448-0.0014110.045023-0.020942-12.3240342.000-0.0029920.093.309998
2021-07-020.0758870.0006550.025141-0.0016090.047353-0.035179-13.3777622.2500.0014860.094.699997
2021-07-060.0811920.0005470.027271-0.0021570.049014-0.040630-14.3172992.5000.0094170.094.470001
2021-07-070.0715610.0009690.030466-0.0018010.0440080.001789-11.6868441.825-0.0013120.090.540001
2021-07-080.0762140.0010150.034979-0.0022980.0464130.007265-12.4497551.9000.0046210.089.739998
2021-07-090.0739180.0010330.032556-0.0019370.0458010.003379-12.2638981.850-0.0002280.090.900002
2021-07-120.0793020.0010000.035748-0.0024160.0482880.001074-13.3134812.0000.0061960.090.809998
2021-07-130.0744860.0010580.033682-0.0021010.0453520.007532-12.0661001.8250.0012610.090.260002
2021-07-140.0691360.0012610.033893-0.0018290.0426370.025277-10.4951401.550-0.0046160.089.050003
2021-07-150.0664800.0015020.037180-0.0019500.0409650.049053-8.9143751.350-0.0052430.086.930000
2021-07-160.0726350.0015020.042144-0.0025940.0435960.052443-9.6540801.5250.0037970.085.889999
\n", - "
" - ], - "text/plain": [ - " Delta Gamma Vega Theta Rho Vanna \\\n", - "Datetime \n", - "2021-07-01 0.071585 0.000779 0.025448 -0.001411 0.045023 -0.020942 \n", - "2021-07-02 0.075887 0.000655 0.025141 -0.001609 0.047353 -0.035179 \n", - "2021-07-06 0.081192 0.000547 0.027271 -0.002157 0.049014 -0.040630 \n", - "2021-07-07 0.071561 0.000969 0.030466 -0.001801 0.044008 0.001789 \n", - "2021-07-08 0.076214 0.001015 0.034979 -0.002298 0.046413 0.007265 \n", - "2021-07-09 0.073918 0.001033 0.032556 -0.001937 0.045801 0.003379 \n", - "2021-07-12 0.079302 0.001000 0.035748 -0.002416 0.048288 0.001074 \n", - "2021-07-13 0.074486 0.001058 0.033682 -0.002101 0.045352 0.007532 \n", - "2021-07-14 0.069136 0.001261 0.033893 -0.001829 0.042637 0.025277 \n", - "2021-07-15 0.066480 0.001502 0.037180 -0.001950 0.040965 0.049053 \n", - "2021-07-16 0.072635 0.001502 0.042144 -0.002594 0.043596 0.052443 \n", - "\n", - " Volga Midpoint Iv S0_close s0_close \n", - "Datetime \n", - "2021-07-01 -12.324034 2.000 -0.002992 0.0 93.309998 \n", - "2021-07-02 -13.377762 2.250 0.001486 0.0 94.699997 \n", - "2021-07-06 -14.317299 2.500 0.009417 0.0 94.470001 \n", - "2021-07-07 -11.686844 1.825 -0.001312 0.0 90.540001 \n", - "2021-07-08 -12.449755 1.900 0.004621 0.0 89.739998 \n", - "2021-07-09 -12.263898 1.850 -0.000228 0.0 90.900002 \n", - "2021-07-12 -13.313481 2.000 0.006196 0.0 90.809998 \n", - "2021-07-13 -12.066100 1.825 0.001261 0.0 90.260002 \n", - "2021-07-14 -10.495140 1.550 -0.004616 0.0 89.050003 \n", - "2021-07-15 -8.914375 1.350 -0.005243 0.0 86.930000 \n", - "2021-07-16 -9.654080 1.525 0.003797 0.0 85.889999 " - ] - }, - "execution_count": 164, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.risk_manager.position_data['&L:AMD20220617C115&S:AMD20220617C125']" - ] - }, - { - "cell_type": "code", - "execution_count": 152, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "20.13888888888889" - ] - }, - "execution_count": 152, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "cash_available = w_map['AMD'] * cash\n", - "purchase_date = pd.to_datetime('2021-07-01')\n", - "s0_at_purchase = data['s'][purchase_date]\n", - "leverage = 5\n", - "equivalent_size = (math.floor(cash_available/s0_at_purchase)/100) * leverage\n", - "equivalent_size/0.072" - ] - }, - { - "cell_type": "code", - "execution_count": 127, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2022.1066637737406" - ] - }, - "execution_count": 127, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.portfolio.allocated_cash_map['AMD']\n", - "# t = get_position_dict(position_str)\n", - "# key = list(t.keys())[0]\n", - "# t[key][0]['ticker']" - ] - }, - { - "cell_type": "code", - "execution_count": 100, - "metadata": {}, - "outputs": [], - "source": [ - "pd.options.display.max_columns = 100\n", - "## Switching to calculating vol for entire timeseries\n", - "data = evb_backtest.portfolio.options_data['AMD20220617C115'].copy()\n", - "option_meta = parse_option_tick('AMD20220617C115')\n", - "data[['symbol', 'put_call', 'exp_date', 'strike']] = pd.Series(option_meta)\n", - "data['s'] = evb_backtest.risk_manager.spot_timeseries['AMD']\n", - "data['r'] = evb_backtest.risk_manager.rf_timeseries\n", - "data['y'] = evb_backtest.risk_manager.dividend_timeseries['AMD']\n", - "data['iv'] = data.apply(lambda x: binomial_implied_vol(price = x['Midpoint'],\n", - " S = x['s'],\n", - " K = x['strike'],\n", - " r = x['r'],\n", - " exp_date = x['exp_date'],\n", - " option_type = x['put_call'].lower(),\n", - " pricing_date = test_date,\n", - " dividend_yield= x['y']), axis=1)\n", - "\n", - "greeks = data.apply(lambda x: Calculate.greeks(S = x['s'],\n", - " K = x['strike'],\n", - " r = x['r'],\n", - " y = x['y'],\n", - " start = test_date,\n", - " exp = x['exp_date'],\n", - " flag = x['put_call'],\n", - " sigma = x['iv']), axis=1, result_type = 'expand')\n", - "data = data.join(greeks)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 67, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
OpenHighLowCloseVolumeBid_sizeCloseBidAsk_sizeCloseAskMidpointWeighted_midpointsymbolput_callexp_datestrikesryivDeltaGammaVegaThetaRhoVannaVolga
Datetime
2021-07-018.498.498.008.15555777.902749.008.4508.254172AMDC2022-06-17115.093.3099980.0004000.4335720.3848640.0098350.342548-0.0220950.2536050.62952616.516995
2021-07-028.059.278.059.2484788.65999.359.0009.297664AMDC2022-06-17115.094.6999970.0003800.4338610.3986580.0097810.351101-0.0226610.2654810.61891514.458817
2021-07-069.059.258.658.65112338.851499.209.0258.986518AMDC2022-06-17115.094.4700010.0004000.4371310.3983890.0097290.350185-0.0227740.2641830.61736814.426723
2021-07-078.008.007.267.301526.405587.657.0257.645536AMDC2022-06-17115.090.5400010.0004300.4231070.3504040.0100700.322235-0.0202840.2275890.65478821.880235
2021-07-086.406.886.406.8834436.105077.006.5506.580316AMDC2022-06-17115.089.7399980.0004300.4165100.3376500.0101780.314970-0.0195170.2189220.66390523.972143
2021-07-090.000.000.000.000906.653526.906.7756.849095AMDC2022-06-17115.090.9000020.0004300.4114590.3459000.0102650.321979-0.0197100.2272810.66550623.034816
2021-07-120.000.000.000.000426.60346.756.6756.667105AMDC2022-06-17115.090.8099980.0004300.4094820.3435660.0102990.320846-0.0195470.2259120.66793023.464894
2021-07-130.000.000.000.0003885.9017.206.5505.903342AMDC2022-06-17115.090.2600020.0004500.4112360.3391870.0102670.317351-0.0194170.2217330.66783624.010453
2021-07-146.156.156.096.0924625.70446.005.8505.726087AMDC2022-06-17115.089.0500030.0004500.4002860.3185380.0104240.305264-0.0181800.2078010.68141127.498679
2021-07-155.455.454.844.84178214.354405.254.8004.664036AMDC2022-06-17115.086.9300000.0003800.3863530.2851770.0105270.283523-0.0162920.1845220.69283532.832833
2021-07-164.454.454.454.4550014.303184.904.6004.898119AMDC2022-06-17115.085.8899990.0003800.3902100.2774800.0104110.276454-0.0160440.1773890.68632933.427196
\n", - "
" - ], - "text/plain": [ - " Open High Low Close Volume Bid_size CloseBid Ask_size \\\n", - "Datetime \n", - "2021-07-01 8.49 8.49 8.00 8.15 55 577 7.90 274 \n", - "2021-07-02 8.05 9.27 8.05 9.24 847 8 8.65 99 \n", - "2021-07-06 9.05 9.25 8.65 8.65 11 233 8.85 149 \n", - "2021-07-07 8.00 8.00 7.26 7.30 15 2 6.40 558 \n", - "2021-07-08 6.40 6.88 6.40 6.88 3 443 6.10 507 \n", - "2021-07-09 0.00 0.00 0.00 0.00 0 90 6.65 352 \n", - "2021-07-12 0.00 0.00 0.00 0.00 0 42 6.60 34 \n", - "2021-07-13 0.00 0.00 0.00 0.00 0 388 5.90 1 \n", - "2021-07-14 6.15 6.15 6.09 6.09 2 462 5.70 44 \n", - "2021-07-15 5.45 5.45 4.84 4.84 17 821 4.35 440 \n", - "2021-07-16 4.45 4.45 4.45 4.45 500 1 4.30 318 \n", - "\n", - " CloseAsk Midpoint Weighted_midpoint symbol put_call exp_date \\\n", - "Datetime \n", - "2021-07-01 9.00 8.450 8.254172 AMD C 2022-06-17 \n", - "2021-07-02 9.35 9.000 9.297664 AMD C 2022-06-17 \n", - "2021-07-06 9.20 9.025 8.986518 AMD C 2022-06-17 \n", - "2021-07-07 7.65 7.025 7.645536 AMD C 2022-06-17 \n", - "2021-07-08 7.00 6.550 6.580316 AMD C 2022-06-17 \n", - "2021-07-09 6.90 6.775 6.849095 AMD C 2022-06-17 \n", - "2021-07-12 6.75 6.675 6.667105 AMD C 2022-06-17 \n", - "2021-07-13 7.20 6.550 5.903342 AMD C 2022-06-17 \n", - "2021-07-14 6.00 5.850 5.726087 AMD C 2022-06-17 \n", - "2021-07-15 5.25 4.800 4.664036 AMD C 2022-06-17 \n", - "2021-07-16 4.90 4.600 4.898119 AMD C 2022-06-17 \n", - "\n", - " strike s r y iv Delta Gamma \\\n", - "Datetime \n", - "2021-07-01 115.0 93.309998 0.00040 0 0.433572 0.384864 0.009835 \n", - "2021-07-02 115.0 94.699997 0.00038 0 0.433861 0.398658 0.009781 \n", - "2021-07-06 115.0 94.470001 0.00040 0 0.437131 0.398389 0.009729 \n", - "2021-07-07 115.0 90.540001 0.00043 0 0.423107 0.350404 0.010070 \n", - "2021-07-08 115.0 89.739998 0.00043 0 0.416510 0.337650 0.010178 \n", - "2021-07-09 115.0 90.900002 0.00043 0 0.411459 0.345900 0.010265 \n", - "2021-07-12 115.0 90.809998 0.00043 0 0.409482 0.343566 0.010299 \n", - "2021-07-13 115.0 90.260002 0.00045 0 0.411236 0.339187 0.010267 \n", - "2021-07-14 115.0 89.050003 0.00045 0 0.400286 0.318538 0.010424 \n", - "2021-07-15 115.0 86.930000 0.00038 0 0.386353 0.285177 0.010527 \n", - "2021-07-16 115.0 85.889999 0.00038 0 0.390210 0.277480 0.010411 \n", - "\n", - " Vega Theta Rho Vanna Volga \n", - "Datetime \n", - "2021-07-01 0.342548 -0.022095 0.253605 0.629526 16.516995 \n", - "2021-07-02 0.351101 -0.022661 0.265481 0.618915 14.458817 \n", - "2021-07-06 0.350185 -0.022774 0.264183 0.617368 14.426723 \n", - "2021-07-07 0.322235 -0.020284 0.227589 0.654788 21.880235 \n", - "2021-07-08 0.314970 -0.019517 0.218922 0.663905 23.972143 \n", - "2021-07-09 0.321979 -0.019710 0.227281 0.665506 23.034816 \n", - "2021-07-12 0.320846 -0.019547 0.225912 0.667930 23.464894 \n", - "2021-07-13 0.317351 -0.019417 0.221733 0.667836 24.010453 \n", - "2021-07-14 0.305264 -0.018180 0.207801 0.681411 27.498679 \n", - "2021-07-15 0.283523 -0.016292 0.184522 0.692835 32.832833 \n", - "2021-07-16 0.276454 -0.016044 0.177389 0.686329 33.427196 " - ] - }, - "execution_count": 67, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# ***RISK MANAGER TESTS***" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "ename": "KeyError", - "evalue": "'signal_id'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[28], line 13\u001b[0m\n\u001b[1;32m 11\u001b[0m rm\u001b[38;5;241m.\u001b[39mOrderPicker\u001b[38;5;241m.\u001b[39mliquidity_threshold \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m100\u001b[39m\n\u001b[1;32m 12\u001b[0m rm\u001b[38;5;241m.\u001b[39mOrderPicker\u001b[38;5;241m.\u001b[39mlookback \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m10\u001b[39m\n\u001b[0;32m---> 13\u001b[0m order \u001b[38;5;241m=\u001b[39m \u001b[43mrm\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_order\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mTSLA\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43m2023-06-02\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mC\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m2\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\n\u001b[1;32m 14\u001b[0m \u001b[43m \u001b[49m\u001b[43m{\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mtype\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mnaked\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mspecifics\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43m[\u001b[49m\u001b[43m{\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mdirection\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mlong\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mrel_strike\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m0.85\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mdte\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m300\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mmoneyness_width\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m0.35\u001b[39;49m\u001b[43m}\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m{\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mdirection\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mshort\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mrel_strike\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m0.6\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mdte\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m300\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mmoneyness_width\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m0.35\u001b[39;49m\u001b[43m}\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mname\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mvertical_spread\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m}\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 16\u001b[0m profiler\u001b[38;5;241m.\u001b[39mdisable()\n\u001b[1;32m 17\u001b[0m stream \u001b[38;5;241m=\u001b[39m io\u001b[38;5;241m.\u001b[39mStringIO()\n", - "File \u001b[0;32m~/cloned_repos/QuantTools/EventDriven/riskmanager.py:774\u001b[0m, in \u001b[0;36mRiskManager.get_order\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 773\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mget_order\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[0;32m--> 774\u001b[0m signalID \u001b[38;5;241m=\u001b[39m \u001b[43mkwargs\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpop\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43msignal_id\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 775\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mSignal ID: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00msignalID\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 777\u001b[0m \u001b[38;5;66;03m## I cannot calculate greeks here. I need option_data to be available first.\u001b[39;00m\n", - "\u001b[0;31mKeyError\u001b[0m: 'signal_id'" - ] - } - ], - "source": [ - "import cProfile\n", - "import pstats\n", - "import io\n", - "profiler = cProfile.Profile()\n", - "profiler.enable()\n", - "#run backtest\n", - "\n", - "\n", - "\n", - "rm = RiskManager(evb_backtest.bars, None, None, '2023-01-01', '2023-12-31')\n", - "rm.OrderPicker.liquidity_threshold = 100\n", - "rm.OrderPicker.lookback = 10\n", - "order = rm.OrderPicker.get_order('TSLA', '2023-06-02', 'C', 2, \n", - " {'type': 'naked', 'specifics': [{'direction': 'long', 'rel_strike': 0.85, 'dte': 300, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 300, 'moneyness_width': 0.35}], 'name': 'vertical_spread'})\n", - "\n", - "profiler.disable()\n", - "stream = io.StringIO()\n", - "stats = pstats.Stats(profiler, stream=stream).sort_stats('cumulative')\n", - "\n", - "order" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "from EventDriven.riskmanager import produce_order_candidates, populate_cache\n", - "import cProfile\n", - "import pstats\n", - "import io\n", - "profiler = cProfile.Profile()\n", - "profiler.enable()\n", - "#run backtest\n", - "\n", - "\n", - "candi = produce_order_candidates({'type': 'naked', 'specifics': [{'direction': 'long', 'rel_strike': 0.85, 'dte': 300, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 300, 'moneyness_width': 0.35}], 'name': 'vertical_spread'},\n", - " 'NVDA',\n", - " '2023-06-02',\n", - " 'C')\n", - "profiler.disable()\n", - "stream = io.StringIO()\n", - "stats = pstats.Stats(profiler, stream=stream).sort_stats('cumulative')\n" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " 3811024 function calls (3793904 primitive calls) in 41.362 seconds\n", - "\n", - " Ordered by: cumulative time\n", - "\n", - " ncalls tottime percall cumtime percall filename:lineno(function)\n", - " 5 0.000 0.000 41.361 8.272 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/IPython/core/interactiveshell.py:3541(run_code)\n", - " 5 0.000 0.000 41.361 8.272 {built-in method builtins.exec}\n", - " 2/1 0.002 0.001 40.474 40.474 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/decorators.py:37(wrapper)\n", - " 1 0.001 0.001 40.474 40.474 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:513(get_order)\n", - " 1795 27.676 0.015 27.676 0.015 {method 'acquire' of '_thread.lock' objects}\n", - " 524 0.004 0.000 27.638 0.053 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:295(wait)\n", - " 396 0.004 0.000 25.366 0.064 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:428(result)\n", - " 1 0.000 0.000 23.943 23.943 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:94(populate_cache)\n", - " 4 0.001 0.000 23.922 5.980 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/threads.py:4(runThreads)\n", - " 380 0.001 0.000 21.621 0.057 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:612(result_iterator)\n", - " 376 0.002 0.000 21.620 0.057 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:314(_result_or_cancel)\n", - " 1 0.000 0.000 15.926 15.926 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:388(produce_order_candidates)\n", - " 2 0.001 0.001 15.926 7.963 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:252(chain_details)\n", - " 10 0.002 0.000 8.624 0.862 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:739(change_to_last_busday)\n", - " 10 0.001 0.000 8.567 0.857 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:727(is_USholiday)\n", - " 10 0.000 0.000 8.537 0.854 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas_market_calendars/calendars/nyse.py:1276(valid_days)\n", - " 10 0.000 0.000 8.527 0.853 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas_market_calendars/market_calendar.py:570(valid_days)\n", - " 10 1.008 0.101 8.521 0.852 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas_market_calendars/market_calendar.py:553(holidays)\n", - " 1 0.000 0.000 7.394 7.394 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:376(spot)\n", - " 10 0.001 0.000 6.695 0.670 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/holiday.py:443(holidays)\n", - " 10 0.005 0.001 6.639 0.664 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/holiday.py:476()\n", - " 290 0.027 0.000 6.634 0.023 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/holiday.py:249(dates)\n", - " 1 0.000 0.000 5.760 5.760 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:81(__init__)\n", - " 312 0.005 0.000 4.702 0.015 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:821(date_range)\n", - " 312 0.023 0.000 4.692 0.015 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:397(_generate_range)\n", - " 312 0.106 0.000 4.630 0.015 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:468()\n", - " 66680 2.356 0.000 4.523 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2712(_generate_range)\n", - " 4 0.000 0.000 3.825 0.956 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/utils/decorators.py:46(wrapper)\n", - " 4 0.000 0.000 3.825 0.956 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/utils/decorators.py:34(wrapper)\n", - " 4 0.000 0.000 3.795 0.949 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/validate_call_decorator.py:58(wrapper_function)\n", - " 4 0.000 0.000 3.795 0.949 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_validate_call.py:95(__call__)\n", - " 4 0.000 0.000 3.795 0.949 {method 'validate_python' of 'pydantic_core._pydantic_core.SchemaValidator' objects}\n", - " 4 0.000 0.000 3.795 0.949 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/container.py:23(_run)\n", - " 4 0.000 0.000 3.794 0.949 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/command_runner.py:476(sync_run)\n", - " 4 0.000 0.000 3.794 0.949 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/provider/utils/helpers.py:289(run_async)\n", - " 12 0.000 0.000 3.743 0.312 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/from_thread.py:275(call)\n", - " 1 0.002 0.002 3.625 3.625 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:104(retrieve_timeseries)\n", - " 290 0.082 0.000 3.468 0.012 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/holiday.py:308(_reference_dates)\n", - " 2 0.000 0.000 3.329 1.664 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/rates.py:178(get_risk_free_rate_helper)\n", - " 290 0.005 0.000 2.692 0.009 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/holiday.py:343(_apply_rule)\n", - "1973/1057 0.009 0.000 2.512 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/common.py:62(new_method)\n", - " 1 0.000 0.000 2.452 2.452 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/equity_price.py:25(historical)\n", - " 1 0.003 0.003 2.450 2.450 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:212(init_rfrate_ts)\n", - " 36 0.001 0.000 2.277 0.063 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:945(start)\n", - " 36 0.000 0.000 2.274 0.063 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:611(wait)\n", - " 4 0.000 0.000 2.271 0.568 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:583(map)\n", - " 4 0.001 0.000 2.271 0.568 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:608()\n", - " 376 0.002 0.000 2.270 0.006 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:161(submit)\n", - " 376 0.001 0.000 2.264 0.006 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:180(_adjust_thread_count)\n", - " 155 0.004 0.000 2.236 0.014 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:1371(_arith_method)\n", - " 140 0.001 0.000 2.234 0.016 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3184(__iadd__)\n", - " 140 0.001 0.000 2.233 0.016 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:98(__add__)\n", - " 144 0.001 0.000 2.233 0.016 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7227(_arith_method)\n", - " 155 0.001 0.000 2.187 0.014 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:240(arithmetic_op)\n", - " 140 0.000 0.000 2.184 0.016 {built-in method _operator.add}\n", - " 140 0.002 0.000 2.183 0.016 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1362(__add__)\n", - " 110 0.788 0.007 2.177 0.020 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:793(_add_offset)\n", - " 187 0.001 0.000 2.061 0.011 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:891(_map_values)\n", - " 187 0.056 0.000 1.859 0.010 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:1667(map_array)\n", - " 46510 0.548 0.000 1.787 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:495(__mul__)\n", - " 2 0.000 0.000 1.768 0.884 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/rates.py:126(_fetch_rates)\n", - " 6 0.000 0.000 1.665 0.277 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:4789(apply)\n", - " 6 0.000 0.000 1.665 0.277 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1409(apply)\n", - " 6 0.000 0.000 1.664 0.277 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1482(apply_standard)\n", - " 1 0.000 0.000 1.603 1.603 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:220(init_risk_free_rate)\n", - " 2 0.001 0.000 1.558 0.779 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:840(resample)\n", - " 46513 0.066 0.000 1.514 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:404(__radd__)\n", - " 46513 0.865 0.000 1.448 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:317(__add__)\n", - " 2 0.000 0.000 1.317 0.658 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:9382(resample)\n", - " 2 0.000 0.000 1.317 0.658 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:2045(get_resampler)\n", - " 2 0.000 0.000 1.316 0.658 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:2210(_get_resampler)\n", - " 2 0.000 0.000 1.316 0.658 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:163(__init__)\n", - " 2 0.000 0.000 1.316 0.658 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:246(_get_binner)\n", - " 2 0.000 0.000 1.316 0.658 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:1737(_get_binner_for_time)\n", - " 2 0.000 0.000 1.315 0.658 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:2285(_get_time_bins)\n", - " 3 0.000 0.000 1.304 0.435 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:500(request)\n", - " 1 0.001 0.001 1.299 1.299 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:459(option_chain)\n", - " 3855 0.067 0.000 1.261 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:673(to_datetime)\n", - " 46806 0.434 0.000 1.248 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:105(__init__)\n", - " 1 0.003 0.003 1.244 1.244 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:130(list_contracts)\n", - " 1 0.000 0.000 1.223 1.223 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:74(request_from_proxy)\n", - " 1 0.000 0.000 1.223 1.223 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/api.py:14(request)\n", - " 3 0.000 0.000 1.221 0.407 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:673(send)\n", - " 2 0.000 0.000 1.187 0.593 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/obbject.py:126(to_dataframe)\n", - " 56 0.000 0.000 1.163 0.021 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:704(readinto)\n", - " 1 0.000 0.000 1.148 1.148 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/obbject.py:86(to_df)\n", - " 2 0.001 0.001 1.134 0.567 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/utils.py:21(basemodel_to_df)\n", - " 50 1.109 0.022 1.109 0.022 {method 'recv_into' of '_socket.socket' objects}\n", - " 3 0.000 0.000 1.095 0.365 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:613(send)\n", - " 3 0.000 0.000 1.091 0.364 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:594(urlopen)\n", - " 3 0.000 0.000 1.087 0.362 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:379(_make_request)\n", - " 3 0.000 0.000 1.047 0.349 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:481(getresponse)\n", - " 3 0.000 0.000 1.046 0.349 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1351(getresponse)\n", - " 3 0.000 0.000 1.046 0.349 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:318(begin)\n", - " 3 0.000 0.000 1.043 0.348 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:285(_read_status)\n", - " 45 0.000 0.000 1.043 0.023 {method 'readline' of '_io.BufferedReader' objects}\n", - " 641 0.001 0.000 1.033 0.002 {built-in method builtins.next}\n", - " 318 0.000 0.000 1.028 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:132(__enter__)\n", - " 4 0.000 0.000 0.991 0.248 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Context.py:16(Context)\n", - " 3851 0.055 0.000 0.961 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:314(_convert_listlike_datetimes)\n", - " 1 0.000 0.000 0.884 0.884 /var/folders/j0/80hkbygd4lb27h9mw76gqzpw0000gn/T/ipykernel_13480/2907384584.py:1()\n", - " 1 0.001 0.001 0.884 0.884 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:694(__init__)\n", - " 36251 0.235 0.000 0.760 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:346(_name_get)\n", - " 1 0.000 0.000 0.707 0.707 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:292(prev_close)\n", - " 2 0.000 0.000 0.695 0.347 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:307(div_yield)\n", - " 2 0.000 0.000 0.695 0.347 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:322(div_yield_history)\n", - " 2 0.000 0.000 0.686 0.343 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/equity_fundamental.py:930(dividends)\n", - " 1 0.000 0.000 0.657 0.657 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/equity_price.py:360(quote)\n", - " 3902 0.031 0.000 0.571 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:320(__new__)\n", - " 4323 0.077 0.000 0.555 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:329(_from_sequence_not_strict)\n", - " 3719 0.017 0.000 0.517 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:259(_box_as_indexlike)\n", - " 94042 0.215 0.000 0.469 0.000 {built-in method builtins.any}\n", - " 180 0.007 0.000 0.445 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6454(map)\n", - "536983/535010 0.241 0.000 0.408 0.000 {built-in method builtins.isinstance}\n", - " 181 0.002 0.000 0.408 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:78(method)\n", - " 181 0.007 0.000 0.405 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:736(map)\n", - " 94 0.020 0.000 0.397 0.004 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:601()\n", - " 94 0.012 0.000 0.377 0.004 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:424(liquidity_check)\n", - " 36251 0.090 0.000 0.348 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:330(_name_includes_bit_suffix)\n", - " 46806 0.267 0.000 0.322 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:231(_fix)\n", - " 880 0.034 0.000 0.315 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:475(__new__)\n", - " 746 0.009 0.000 0.313 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4062(__getitem__)\n", - " 4323 0.092 0.000 0.300 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2184(_sequence_to_dt64)\n", - " 46513 0.139 0.000 0.273 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/calendar.py:122(monthrange)\n", - " 35888 0.132 0.000 0.258 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numerictypes.py:357(issubdtype)\n", - " 5044 0.027 0.000 0.257 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5373(__getitem__)\n", - " 4843 0.024 0.000 0.244 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:373(__getitem__)\n", - " 380 0.004 0.000 0.232 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4130(_getitem_bool_array)\n", - " 8172 0.043 0.000 0.227 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2428(maybe_convert_dtype)\n", - " 242 0.005 0.000 0.226 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:317(apply)\n", - " 1491 0.032 0.000 0.212 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:517(sanitize_array)\n", - " 7751 0.021 0.000 0.189 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:416(extract_array)\n", - "1184/1176 0.002 0.000 0.185 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:101(isna)\n", - "1184/1176 0.004 0.000 0.182 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:184(_isna)\n", - " 91 0.002 0.000 0.182 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:611()\n", - " 2 0.000 0.000 0.182 0.091 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:7484(ffill)\n", - " 2 0.000 0.000 0.182 0.091 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:7061(_pad_or_backfill)\n", - " 2 0.000 0.000 0.182 0.091 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:299(pad_or_backfill)\n", - " 4 0.000 0.000 0.181 0.045 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1706(pad_or_backfill)\n", - " 91 0.004 0.000 0.180 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:348(available_close_check)\n", - " 45 0.001 0.000 0.177 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:261(_isna_array)\n", - " 694 0.015 0.000 0.177 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7164(_cmp_method)\n", - " 14 0.176 0.013 0.176 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:305(_isna_string_dtype)\n", - " 46511 0.175 0.000 0.175 0.000 {method 'replace' of 'datetime.datetime' objects}\n", - " 4844 0.028 0.000 0.169 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:278(__getitem__)\n", - " 5 0.000 0.000 0.166 0.033 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:492(to_numpy)\n", - " 5 0.000 0.000 0.166 0.033 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:226(isna)\n", - " 775 0.043 0.000 0.156 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:977(_cmp_method)\n", - " 548/543 0.019 0.000 0.152 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:389(__init__)\n", - " 433 0.006 0.000 0.143 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:674(astype)\n", - " 949/476 0.003 0.000 0.141 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:50(__le__)\n", - " 374448 0.138 0.000 0.138 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:195()\n", - " 202 0.002 0.000 0.135 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4142(_take_with_is_copy)\n", - " 3848 0.064 0.000 0.134 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:126(_guess_datetime_format_for_array)\n", - " 46513 0.117 0.000 0.130 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/calendar.py:115(weekday)\n", - " 52134 0.057 0.000 0.127 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/generic.py:42(_instancecheck)\n", - " 202 0.003 0.000 0.126 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4027(take)\n", - " 11 0.000 0.000 0.126 0.011 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:890(content)\n", - " 30 0.000 0.000 0.126 0.004 {method 'join' of 'bytes' objects}\n", - " 33 0.000 0.000 0.125 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:816(generate)\n", - " 33 0.000 0.000 0.125 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:1038(stream)\n", - " 30 0.000 0.000 0.125 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:910(read)\n", - " 35804 0.074 0.000 0.125 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:178(_datetime_metadata_str)\n", - " 217 0.002 0.000 0.123 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:869(take)\n", - " 33 0.001 0.000 0.123 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:858(_raw_read)\n", - " 33 0.000 0.000 0.121 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:801(_fp_read)\n", - " 33 0.000 0.000 0.121 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:457(read)\n", - " 30 0.000 0.000 0.121 0.004 {method 'read' of '_io.BufferedReader' objects}\n", - " 71776 0.086 0.000 0.120 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numerictypes.py:283(issubclass_)\n", - " 2 0.000 0.000 0.118 0.059 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:10170(apply)\n", - " 2 0.000 0.000 0.118 0.059 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:864(apply)\n", - " 2 0.000 0.000 0.118 0.059 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1061(apply_standard)\n", - " 2 0.001 0.000 0.117 0.058 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1070(apply_series_generator)\n", - " 94 0.002 0.000 0.112 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:333()\n", - " 291 0.037 0.000 0.112 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1157(maybe_infer_to_datetimelike)\n", - " 140418 0.111 0.000 0.111 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:172()\n", - " 8282 0.034 0.000 0.110 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1163(is_float_dtype)\n", - " 94 0.003 0.000 0.105 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:696(generate_option_tick_new)\n", - " 421 0.002 0.000 0.104 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:325(_from_sequence)\n", - "282483/282300 0.082 0.000 0.101 0.000 {built-in method builtins.getattr}\n", - " 4010 0.092 0.000 0.100 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2354(objects_to_datetime64)\n", - " 4037 0.055 0.000 0.099 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:545(_box_func)\n", - " 4324 0.031 0.000 0.097 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2425(ensure_arraylike_for_datetimelike)\n", - " 10753 0.037 0.000 0.093 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1198(is_bool_dtype)\n", - " 220 0.003 0.000 0.092 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:623(reindex_indexer)\n", - " 949/476 0.007 0.000 0.091 0.000 {built-in method _operator.le}\n", - " 293 0.074 0.000 0.091 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:447(astype)\n", - " 1 0.000 0.000 0.089 0.089 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/ticker.py:157(info)\n", - " 1 0.000 0.000 0.089 0.089 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/base.py:230(get_info)\n", - " 1 0.000 0.000 0.089 0.089 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/scrapers/quote.py:505(info)\n", - " 604/303 0.003 0.000 0.088 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:58(__ge__)\n", - " 2 0.000 0.000 0.088 0.044 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/scrapers/quote.py:604(_fetch_info)\n", - " 2 0.000 0.000 0.086 0.043 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/data.py:426(get_raw_json)\n", - " 8/2 0.002 0.000 0.086 0.043 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/utils.py:98(wrapper)\n", - " 2 0.000 0.000 0.086 0.043 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/data.py:345(get)\n", - " 2 0.000 0.000 0.085 0.043 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/data.py:353(_make_request)\n", - " 2 0.000 0.000 0.082 0.041 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:593(get)\n", - " 14610 0.011 0.000 0.081 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/holiday.py:360()\n", - " 201 0.002 0.000 0.078 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6110(_cmp_method)\n", - " 199 0.003 0.000 0.076 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:687()\n", - " 2104 0.029 0.000 0.075 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:419(check_array_indexer)\n", - " 604/303 0.006 0.000 0.074 0.000 {built-in method _operator.ge}\n", - " 6458 0.059 0.000 0.073 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:649(_simple_new)\n", - " 12616 0.023 0.000 0.073 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1375(_is_dtype)\n", - " 3 0.000 0.000 0.072 0.024 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:750(merge_environment_settings)\n", - " 1084 0.006 0.000 0.072 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1287(take_nd)\n", - " 3 0.000 0.000 0.072 0.024 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:826(get_environ_proxies)\n", - " 282 0.002 0.000 0.071 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1176(__getitem__)\n", - " 52134 0.050 0.000 0.069 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/generic.py:37(_check)\n", - " 37423 0.065 0.000 0.069 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:645(__iter__)\n", - " 1074 0.005 0.000 0.067 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6284(__getattr__)\n", - "1232/1132 0.006 0.000 0.066 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:59(take_nd)\n", - " 3 0.000 0.000 0.064 0.021 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:765(should_bypass_proxies)\n", - " 3 0.000 0.000 0.064 0.021 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2672(proxy_bypass)\n", - " 280 0.001 0.000 0.062 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1719(_getitem_axis)\n", - " 10 0.000 0.000 0.062 0.006 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:798(tolist)\n", - " 10 0.006 0.001 0.062 0.006 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/base.py:2058(tolist)\n", - " 3 0.000 0.000 0.061 0.020 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:172(agg)\n", - " 2056 0.012 0.000 0.060 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1596(pandas_dtype)\n", - " 206 0.002 0.000 0.060 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6662(copy)\n", - " 276 0.002 0.000 0.059 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1756(_get_slice_axis)\n", - " 4306 0.059 0.000 0.059 0.000 {built-in method numpy.array}\n", - " 248534 0.058 0.000 0.058 0.000 {built-in method builtins.abs}\n", - " 3322 0.057 0.000 0.057 0.000 {method 'reduce' of 'numpy.ufunc' objects}\n", - " 276 0.024 0.000 0.055 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4361(_slice)\n", - " 130 0.004 0.000 0.055 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:456(_array_strptime_with_fallback)\n", - " 168511 0.054 0.000 0.054 0.000 {built-in method builtins.issubclass}\n", - " 6 0.000 0.000 0.053 0.009 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ssl.py:1299(recv_into)\n", - " 6 0.000 0.000 0.053 0.009 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ssl.py:1157(read)\n", - " 6 0.053 0.009 0.053 0.009 {method 'read' of '_ssl._SSLSocket' objects}\n", - " 211 0.003 0.000 0.052 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:557(copy)\n", - " 1296/916 0.031 0.000 0.051 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:390(_get_getitem_freq)\n", - " 2296 0.006 0.000 0.051 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:481(ensure_wrapped_if_datetimelike)\n", - " 71697 0.051 0.000 0.051 0.000 {method 'format' of 'str' objects}\n", - " 8 0.000 0.000 0.050 0.006 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/from_thread.py:455(start_blocking_portal)\n", - " 110 0.049 0.000 0.050 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2159(as_unit)\n", - " 2059 0.008 0.000 0.050 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/extension.py:67(fget)\n", - " 4775 0.045 0.000 0.050 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:304(_simple_new)\n", - " 6980 0.049 0.000 0.049 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/holiday.py:97(nearest_workday)\n", - " 3 0.000 0.000 0.048 0.016 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2658(proxy_bypass_macosx_sysconf)\n", - " 6380 0.048 0.000 0.048 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/easter.py:16(easter)\n", - " 11217 0.024 0.000 0.048 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1434(_is_dtype_type)\n", - " 3 0.048 0.016 0.048 0.016 {built-in method _scproxy._get_proxy_settings}\n", - " 2 0.000 0.000 0.048 0.024 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:343(aggregate)\n", - " 2 0.000 0.000 0.047 0.024 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:415(agg_dict_like)\n", - " 4217 0.009 0.000 0.047 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:536(is_string_dtype)\n", - " 2 0.000 0.000 0.047 0.024 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1575(agg_or_apply_dict_like)\n", - " 36 0.000 0.000 0.047 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1087(join)\n", - " 46960 0.047 0.000 0.047 0.000 {built-in method builtins.min}\n", - " 1128 0.022 0.000 0.047 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:120(_take_nd_ndarray)\n", - " 37 0.000 0.000 0.046 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1125(_wait_for_tstate_lock)\n", - "27069/20900 0.039 0.000 0.046 0.000 {built-in method builtins.len}\n", - " 217 0.002 0.000 0.045 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6201(_construct_result)\n", - " 5339 0.014 0.000 0.045 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7688(maybe_extract_name)\n", - " 388 0.004 0.000 0.045 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4626(_get_item_cache)\n", - " 1 0.000 0.000 0.044 0.044 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/scrapers/quote.py:578(_fetch)\n", - "9211/8982 0.030 0.000 0.043 0.000 {built-in method numpy.asarray}\n", - " 1721 0.004 0.000 0.043 0.000 {method 'any' of 'numpy.ndarray' objects}\n", - " 1 0.000 0.000 0.042 0.042 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/scrapers/quote.py:593(_fetch_additional_info)\n", - " 16 0.000 0.000 0.041 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:694(__init__)\n", - " 3 0.000 0.000 0.039 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:365(request)\n", - " 383 0.003 0.000 0.039 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:3983(_ixs)\n", - " 128 0.006 0.000 0.039 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_exceptions.py:34(find_stack_level)\n", - " 273 0.001 0.000 0.038 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3122(duplicated)\n", - " 1722 0.002 0.000 0.038 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:55(_any)\n", - " 3 0.000 0.000 0.038 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1287(endheaders)\n", - " 3 0.000 0.000 0.038 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1049(_send_output)\n", - " 4 0.000 0.000 0.038 0.009 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:988(send)\n", - " 179 0.004 0.000 0.038 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:666(_parse)\n", - " 1 0.000 0.000 0.037 0.037 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:278(connect)\n", - " 1 0.000 0.000 0.037 0.037 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:193(_new_conn)\n", - " 1 0.000 0.000 0.037 0.037 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/connection.py:27(create_connection)\n", - " 1 0.036 0.036 0.036 0.036 {method 'connect' of '_socket.socket' objects}\n", - " 120 0.001 0.000 0.036 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/arraysetops.py:766(isin)\n", - " 14 0.000 0.000 0.035 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:157(concat)\n", - " 13896 0.013 0.000 0.035 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:173(search)\n", - " 22226 0.015 0.000 0.035 0.000 :117(__instancecheck__)\n", - " 382 0.002 0.000 0.034 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2632(check_bool_indexer)\n", - " 1 0.000 0.000 0.034 0.034 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/main.py:456(model_json_schema)\n", - " 1 0.000 0.000 0.034 0.034 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2246(model_json_schema)\n", - " 1 0.000 0.000 0.034 0.034 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:9492(pivot_table)\n", - " 1 0.000 0.000 0.034 0.034 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/pivot.py:61(pivot_table)\n", - "1473/1462 0.004 0.000 0.034 0.000 {built-in method builtins.all}\n", - " 1 0.000 0.000 0.034 0.034 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/pivot.py:118(__internal_pivot_table)\n", - " 1 0.000 0.000 0.033 0.033 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:394(generate)\n", - " 365 0.002 0.000 0.033 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:769(_try_cast)\n", - " 120 0.015 0.000 0.033 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/arraysetops.py:524(in1d)\n", - " 576 0.003 0.000 0.033 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:807(_set_axis)\n", - " 41754 0.033 0.000 0.033 0.000 {built-in method numpy.datetime_data}\n", - " 386 0.002 0.000 0.033 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1095(__getitem__)\n", - " 213 0.002 0.000 0.032 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:288(comparison_op)\n", - " 23369 0.023 0.000 0.032 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1399(_get_dtype)\n", - " 130 0.002 0.000 0.031 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1200(maybe_cast_to_datetime)\n", - " 175/1 0.002 0.000 0.031 0.031 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:443(generate_inner)\n", - " 215/1 0.000 0.000 0.031 0.031 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_schema_generation_shared.py:36(__call__)\n", - " 2/1 0.000 0.000 0.031 0.031 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:522(new_handler_func)\n", - " 1 0.000 0.000 0.030 0.030 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/main.py:673(__get_pydantic_json_schema__)\n", - " 1 0.000 0.000 0.030 0.030 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:248(modify_model_json_schema)\n", - " 4812 0.030 0.000 0.030 0.000 {method 'view' of 'numpy.generic' objects}\n", - " 175/1 0.001 0.000 0.030 0.030 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:479(handler_func)\n", - " 413 0.018 0.000 0.030 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/base.py:549(find)\n", - " 290 0.002 0.000 0.030 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5425(_getitem_slice)\n", - " 1 0.000 0.000 0.030 0.030 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1399(model_schema)\n", - " 185 0.001 0.000 0.030 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:89(get_option_specifics_from_key)\n", - " 1 0.000 0.000 0.030 0.030 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:975(function_before_schema)\n", - " 1 0.000 0.000 0.030 0.030 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1494(model_fields_schema)\n", - " 14 0.000 0.000 0.030 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:622(get_result)\n", - " 185 0.002 0.000 0.030 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:662(parse_option_tick)\n", - " 53/43 0.001 0.000 0.029 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4271(__setitem__)\n", - " 246 0.002 0.000 0.029 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:674(_with_infer)\n", - " 4 0.000 0.000 0.029 0.007 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:646(__exit__)\n", - " 4 0.000 0.000 0.029 0.007 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:216(shutdown)\n", - " 1 0.000 0.000 0.029 0.029 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1309(_named_required_fields_schema)\n", - " 4 0.000 0.000 0.029 0.007 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/validate_call_decorator.py:28(validate_call)\n", - " 4 0.000 0.000 0.029 0.007 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/validate_call_decorator.py:51(validate)\n", - " 1247 0.007 0.000 0.029 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:97(is_bool_indexer)\n", - " 586 0.001 0.000 0.029 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:236(set_axis)\n", - " 4 0.001 0.000 0.029 0.007 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_validate_call.py:26(__init__)\n", - " 14795 0.017 0.000 0.028 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:272(_compile)\n", - " 144 0.001 0.000 0.027 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7218(_construct_result)\n", - " 1096 0.027 0.000 0.027 0.000 {method 'copy' of 'numpy.ndarray' objects}\n", - " 586 0.001 0.000 0.027 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:86(_validate_set_axis)\n", - " 49 0.000 0.000 0.027 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4514(_set_item)\n", - " 10 0.000 0.000 0.027 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4342(_getitem_slice)\n", - " 2 0.000 0.000 0.027 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:425(compute_dict_like)\n", - " 2992 0.011 0.000 0.026 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6301(__setattr__)\n", - " 38 0.000 0.000 0.026 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:540(new_handler_func)\n", - " 38 0.001 0.000 0.026 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2466(json_schema_update_func)\n", - " 67/41 0.001 0.000 0.025 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:620(generate_schema)\n", - " 91 0.000 0.000 0.025 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:1364(_duplicated)\n", - " 2 0.000 0.000 0.025 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:496()\n", - " 91 0.001 0.000 0.025 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/base.py:1170(duplicated)\n", - " 38 0.000 0.000 0.025 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1377(model_field_schema)\n", - " 671 0.004 0.000 0.024 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:790(copy)\n", - " 92 0.000 0.000 0.024 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:42(__ne__)\n", - " 49 0.001 0.000 0.024 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4481(_set_item_mgr)\n", - " 5 0.000 0.000 0.023 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:423(dict_to_mgr)\n", - " 4217 0.018 0.000 0.023 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:572(condition)\n", - " 37 0.000 0.000 0.023 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1033(default_schema)\n", - " 2096 0.010 0.000 0.023 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:892(getfile)\n", - " 85/41 0.001 0.000 0.023 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:906(_generate_schema_inner)\n", - " 91 0.005 0.000 0.022 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:994(duplicated)\n", - " 2545 0.007 0.000 0.022 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:137(is_object_dtype)\n", - " 2 0.004 0.002 0.022 0.011 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/utils.py:31()\n", - " 85/41 0.002 0.000 0.022 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:931(match_type)\n", - " 6 0.002 0.000 0.022 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2499(getproxies_environment)\n", - " 225 0.001 0.000 0.022 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:157(take)\n", - " 8 0.000 0.000 0.022 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:96(arrays_to_mgr)\n", - " 7630 0.021 0.000 0.021 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/holiday.py:75(sunday_to_monday)\n", - " 10 0.000 0.000 0.021 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1087(_slice)\n", - " 4 0.001 0.000 0.021 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1871(_callable_schema)\n", - " 1002 0.002 0.000 0.021 0.000 :859(__iter__)\n", - " 10 0.000 0.000 0.020 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1974(get_slice)\n", - " 775 0.006 0.000 0.020 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:524(_validate_comparison_value)\n", - " 7351 0.014 0.000 0.020 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:576(tz)\n", - " 22226 0.020 0.000 0.020 0.000 {built-in method _abc._abc_instancecheck}\n", - " 46 0.001 0.000 0.020 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1347(insert)\n", - " 2 0.000 0.000 0.020 0.010 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:504(wrap_results_dict_like)\n", - " 318 0.001 0.000 0.020 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:141(__exit__)\n", - " 516 0.002 0.000 0.020 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5437(_can_hold_identifiers_and_holds_name)\n", - " 182 0.001 0.000 0.020 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6519(sum)\n", - " 36251 0.020 0.000 0.020 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:24(_kind_name)\n", - " 1397 0.013 0.000 0.019 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6236(__finalize__)\n", - " 4760 0.019 0.000 0.019 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2148(_creso)\n", - " 132 0.002 0.000 0.019 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:106(_ensure_data)\n", - " 182 0.001 0.000 0.019 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12498(sum)\n", - " 251 0.002 0.000 0.019 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_strptime.py:564(_strptime_datetime)\n", - " 3715 0.004 0.000 0.018 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/main.py:352(model_dump)\n", - " 182 0.002 0.000 0.018 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12459(_min_count_stat_function)\n", - " 8 0.000 0.000 0.018 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/generic.py:232(aggregate)\n", - " 8 0.000 0.000 0.018 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:3417(last)\n", - " 8 0.000 0.000 0.018 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1896(_agg_general)\n", - " 255/253 0.002 0.000 0.018 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:1131(take)\n", - " 560 0.006 0.000 0.018 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1863(from_array)\n", - " 18 0.001 0.000 0.018 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1574(_generate_parameter_schema)\n", - " 885 0.009 0.000 0.018 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:525(_unbox_scalar)\n", - " 8 0.000 0.000 0.017 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1957(_cython_agg_general)\n", - " 775 0.002 0.000 0.017 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:718(_unbox)\n", - " 1039 0.002 0.000 0.017 0.000 :674(__getitem__)\n", - " 37 0.001 0.000 0.017 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2064(encode_default)\n", - " 377 0.003 0.000 0.017 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4608(_box_col_values)\n", - " 8 0.000 0.000 0.017 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2121(create_block_manager_from_column_arrays)\n", - " 179 0.002 0.000 0.017 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:199(split)\n", - " 251 0.009 0.000 0.017 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_strptime.py:309(_strptime)\n", - " 1128 0.005 0.000 0.017 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:564(_take_preprocess_indexer_and_fill_value)\n", - " 719 0.008 0.000 0.017 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:659(_constructor_from_mgr)\n", - " 185 0.001 0.000 0.017 0.000 {built-in method strptime}\n", - " 130 0.005 0.000 0.016 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:125(f)\n", - " 1018 0.013 0.000 0.016 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:836(_isnan)\n", - " 192 0.001 0.000 0.016 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6418(_reduce)\n", - " 61198 0.016 0.000 0.016 0.000 {method 'weekday' of 'datetime.date' objects}\n", - " 4635 0.015 0.000 0.016 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:103(tz_to_dtype)\n", - " 605 0.003 0.000 0.015 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:145(_get_option)\n", - " 12 0.001 0.000 0.015 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5290(sort_index)\n", - " 3752 0.015 0.000 0.015 0.000 {method 'to_python' of 'pydantic_core._pydantic_core.SchemaSerializer' objects}\n", - " 2 0.000 0.000 0.015 0.008 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/obbject.py:168(is_list_of_basemodel)\n", - " 354 0.007 0.000 0.015 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:842(_engine)\n", - " 8 0.001 0.000 0.015 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2190(_form_blocks)\n", - " 1660 0.003 0.000 0.015 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:537(_check_compatible_with)\n", - " 3717 0.002 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/obbject.py:169()\n", - " 18 0.000 0.000 0.014 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2066(_apply_annotations)\n", - " 111/74 0.001 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/type_adapter.py:132(wrapped)\n", - " 37 0.000 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/type_adapter.py:189(__init__)\n", - " 1414 0.001 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:189(__next__)\n", - " 1721 0.011 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:278(__init__)\n", - " 10 0.000 0.000 0.014 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:3936(sort_index)\n", - " 1 0.000 0.000 0.014 0.014 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/generic.py:1420(aggregate)\n", - " 22 0.013 0.001 0.014 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2246(_stack_arrays)\n", - " 1 0.000 0.000 0.014 0.014 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:558(apply_str)\n", - " 2 0.000 0.000 0.014 0.007 {method 'throw' of 'generator' objects}\n", - " 120 0.002 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:823(take)\n", - " 1039 0.002 0.000 0.013 0.000 :756(encode)\n", - " 1 0.000 0.000 0.013 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:681(_apply_str)\n", - " 1 0.000 0.000 0.013 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:2264(count)\n", - " 18 0.000 0.000 0.013 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_schema_generation_shared.py:82(__call__)\n", - " 18 0.000 0.000 0.013 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2085(inner_handler)\n", - " 1271 0.012 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:551(maybe_promote)\n", - " 377 0.006 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1012(iget)\n", - " 8 0.000 0.000 0.013 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:365(grouped_reduce)\n", - " 209 0.001 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1782(_consolidate_inplace)\n", - " 10921 0.009 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:123()\n", - " 7384 0.009 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:334(is_hashable)\n", - " 1157 0.003 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:339(_from_mgr)\n", - " 182 0.001 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:76(_f)\n", - " 1414 0.008 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:77(get_token)\n", - " 3 0.000 0.000 0.012 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:506(nested_data_to_arrays)\n", - " 46 0.001 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6956(insert)\n", - " 3 0.000 0.000 0.012 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:793(to_arrays)\n", - " 201 0.007 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2313(is_unique)\n", - " 1601 0.008 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:769(_assert_tzawareness_compat)\n", - " 5 0.000 0.000 0.012 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:7142(fillna)\n", - " 37 0.001 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/type_adapter.py:267(_init_core_attrs)\n", - " 8 0.000 0.000 0.012 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1971(array_func)\n", - " 91 0.000 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:515(view)\n", - " 4323 0.012 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2310(_construct_from_dt64_naive)\n", - " 8 0.000 0.000 0.012 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:812(_cython_operation)\n", - " 91 0.001 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:117(view)\n", - " 3718 0.012 0.000 0.012 0.000 {method 'view' of 'numpy.ndarray' objects}\n", - " 27425 0.011 0.000 0.012 0.000 {built-in method builtins.hasattr}\n", - " 10 0.001 0.000 0.011 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:533(_maybe_downcast)\n", - " 5 0.000 0.000 0.011 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:180(fillna)\n", - "1213/1212 0.011 0.000 0.011 0.000 {method 'encode' of 'str' objects}\n", - " 8 0.000 0.000 0.011 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:523(cython_operation)\n", - " 8 0.000 0.000 0.011 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:310(_cython_op_ndim_compat)\n", - " 530 0.003 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:71(_wrapreduction)\n", - " 36 0.000 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:610(factorize)\n", - " 4 0.000 0.000 0.011 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6538(dropna)\n", - " 8 0.010 0.001 0.011 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:354(_call_cython_op)\n", - " 7 0.000 0.000 0.011 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1643(fillna)\n", - " 3 0.000 0.000 0.011 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:457(prepare_request)\n", - " 3717 0.006 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_model_construction.py:268(__instancecheck__)\n", - " 130 0.000 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:850(_maybe_mask_results)\n", - " 12 0.000 0.000 0.010 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/from_thread.py:308(start_task_soon)\n", - " 225 0.003 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:875(_parse_numeric_token)\n", - " 92 0.002 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:1148(take)\n", - " 549 0.002 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:166(simplefilter)\n", - " 131 0.001 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:843(_hasna)\n", - " 8 0.000 0.000 0.010 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/_backends/_asyncio.py:980(_spawn_task_from_thread)\n", - " 797 0.005 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5323(__contains__)\n", - " 8 0.000 0.000 0.010 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/_backends/_asyncio.py:2483(run_sync_from_thread)\n", - " 4 0.001 0.000 0.009 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:555()\n", - " 144 0.002 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1146(take)\n", - " 2 0.003 0.002 0.009 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:891(_list_of_dict_to_arrays)\n", - " 10921 0.009 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:121(classes)\n", - " 863 0.009 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:467(__enter__)\n", - " 41 0.000 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:589(clean_schema)\n", - " 1 0.000 0.000 0.009 0.009 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:743(group_info)\n", - " 1 0.000 0.000 0.009 0.009 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:758(_get_compressed_codes)\n", - " 2 0.000 0.000 0.009 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6731(drop_duplicates)\n", - " 185 0.001 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:389(new_func)\n", - " 265 0.004 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:231(asarray_tuplesafe)\n", - " 8267 0.007 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1194()\n", - " 587 0.006 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:274(full)\n", - " 609 0.003 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:127(_get_single_key)\n", - " 765 0.003 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:784(name)\n", - " 15/7 0.001 0.000 0.009 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:622(convert)\n", - " 37 0.000 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/type_adapter.py:45(_get_schema)\n", - " 14/12 0.000 0.000 0.009 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1040(_match_generic_type)\n", - " 879 0.004 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:609(_dtype_to_subclass)\n", - " 3715 0.005 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/utils.py:49()\n", - " 393 0.001 0.000 0.009 0.000 {method 'all' of 'numpy.ndarray' objects}\n", - " 180 0.001 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:441(maybe_cast_pointwise_result)\n", - " 130 0.002 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1240(_ensure_nanosecond_dtype)\n", - " 18760 0.008 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:551(dtype)\n", - " 3 0.000 0.000 0.008 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:351(prepare)\n", - " 195 0.001 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:586()\n", - " 5 0.000 0.000 0.008 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6997(sort_values)\n", - " 1 0.000 0.000 0.008 0.008 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:868(read_csv)\n", - " 3 0.000 0.000 0.008 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2685(getproxies)\n", - " 12 0.000 0.000 0.008 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:59(get_indexer_indexer)\n", - " 1787 0.004 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:319(asi8)\n", - " 314 0.003 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1519(construct_1d_arraylike_from_scalar)\n", - " 1 0.000 0.000 0.008 0.008 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:583(_read)\n", - " 601 0.005 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:182(_add_filter)\n", - " 925 0.003 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2152(unit)\n", - " 445 0.001 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:163(match)\n", - " 12 0.000 0.000 0.008 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1369(_union_schema)\n", - " 26 0.001 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:708(_slice_take_blocks_ax0)\n", - " 1666/186 0.004 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:128(deepcopy)\n", - " 1 0.000 0.000 0.008 0.008 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:9863(unstack)\n", - " 182 0.001 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:455(newfunc)\n", - " 1 0.000 0.000 0.008 0.008 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:489(unstack)\n", - " 10 0.002 0.000 0.008 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas_market_calendars/calendars/nyse.py:869(adhoc_holidays)\n", - " 383 0.001 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:678(_constructor_sliced_from_mgr)\n", - " 1 0.000 0.000 0.008 0.008 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:525(_unstack_frame)\n", - " 397 0.001 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:61(_all)\n", - " 269 0.006 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:273(is_dict_like)\n", - " 390 0.001 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:583(copy_func)\n", - " 363 0.001 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/common.py:81(get_op_result_name)\n", - " 16 0.000 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:1102(groupings)\n", - " 1240 0.001 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7593(ensure_index)\n", - " 211 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1764(is_consolidated)\n", - " 2 0.000 0.000 0.007 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:10803(where)\n", - " 6590 0.007 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:831(_reset_identity)\n", - " 220 0.004 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:239(maybe_convert_indices)\n", - " 2 0.000 0.000 0.007 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:10615(_where)\n", - " 182 0.001 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:604(nansum)\n", - " 2 0.000 0.000 0.007 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:687(codes)\n", - " 2 0.000 0.000 0.007 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:690()\n", - " 8 0.000 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:689(codes)\n", - " 9 0.000 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1296(__init__)\n", - " 209 0.001 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1772(_consolidate_check)\n", - " 4 0.000 0.000 0.007 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:777(_codes_and_uniques)\n", - " 4 0.000 0.000 0.007 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:209(_maybe_cache)\n", - " 240 0.001 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2836(min)\n", - " 8 0.000 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:405(_gotitem)\n", - " 194 0.002 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/ipkernel.py:775(_clean_thread_parent_frames)\n", - " 510 0.001 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_strptime.py:26(_getlang)\n", - " 4 0.000 0.000 0.007 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:11603(any)\n", - " 14 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:699(new_axes)\n", - " 4 0.000 0.000 0.007 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12169(_logical_func)\n", - " 99 0.001 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:800(_generate_schema_from_property)\n", - " 14 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:702()\n", - " 8 0.000 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6186(_get_indexer_strict)\n", - " 4 0.000 0.000 0.007 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:11435(_reduce)\n", - " 32 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:582(get_loc)\n", - " 2 0.000 0.000 0.007 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6828(duplicated)\n", - " 7824 0.006 0.000 0.006 0.000 {built-in method __new__ of type object at 0x1096a5898}\n", - " 313 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:225(compile)\n", - " 1 0.000 0.000 0.006 0.006 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1907(read)\n", - " 4 0.000 0.000 0.006 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:245(_pad_or_backfill)\n", - " 188 0.002 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:259(maybe_downcast_to_dtype)\n", - " 825 0.005 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3777(get_loc)\n", - " 14 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:717(_get_concat_axis)\n", - " 4872 0.006 0.000 0.006 0.000 {method 'startswith' of 'str' objects}\n", - " 788 0.002 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1571(validate_all_hashable)\n", - " 2144 0.006 0.000 0.006 0.000 {built-in method numpy.empty}\n", - " 246 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:402(walk_core_schema)\n", - " 1236 0.004 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2537(dtype_to_unit)\n", - " 24/14 0.002 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:369(nargsort)\n", - " 26/25 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:38(__eq__)\n", - " 612 0.004 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2716(new_block)\n", - " 14148 0.006 0.000 0.006 0.000 {method 'search' of 're.Pattern' objects}\n", - " 510 0.001 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/locale.py:594(getlocale)\n", - " 4252 0.006 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:529(is_string_or_object_np_dtype)\n", - " 384 0.001 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1010(view)\n", - " 681 0.004 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2645(maybe_coerce_values)\n", - " 12 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:777(_concat_indexes)\n", - " 12 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5455(append)\n", - " 3 0.000 0.000 0.006 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:483(prepare_headers)\n", - " 10 0.000 0.000 0.006 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4201(_convert_slice_indexer)\n", - " 200 0.003 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1778()\n", - " 23 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3820(get_indexer)\n", - " 376 0.002 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:440(acquire)\n", - " 195 0.005 0.000 0.005 0.000 {method 'strftime' of 'datetime.date' objects}\n", - " 10 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:723(is_busday)\n", - " 314 0.002 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:33(seterr)\n", - " 186 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:227(_deepcopy_dict)\n", - " 5 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:3951(T)\n", - " 5 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:3767(transpose)\n", - " 1 0.000 0.000 0.005 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:110(__init__)\n", - " 4324 0.005 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2063(_maybe_pin_freq)\n", - " 10 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:1022(bdate_range)\n", - " 10 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:646(slice_indexer)\n", - " 13 0.005 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:1034(check_header_validity)\n", - " 390 0.002 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:82(shape)\n", - " 423 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:253(fill_value)\n", - " 14 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:405(__init__)\n", - " 630/246 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:196(walk)\n", - " 2299 0.005 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/base.py:238(construct_from_string)\n", - " 3 0.000 0.000 0.005 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_compiler.py:740(compile)\n", - " 10 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6618(slice_indexer)\n", - " 1418 0.004 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2765(check_dict_or_set_indexers)\n", - " 9 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1578(_wrap_aggregated_output)\n", - " 10 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6828(slice_locs)\n", - " 183 0.005 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:534(_scalar_from_string)\n", - " 4323 0.004 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2514(_validate_dt64_dtype)\n", - " 12 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5491(_concat)\n", - " 1333 0.003 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:734(name)\n", - " 193 0.005 0.000 0.005 0.000 {method 'take' of 'numpy.ndarray' objects}\n", - " 1266 0.004 0.000 0.005 0.000 :1207(_handle_fromlist)\n", - " 20 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6745(get_slice_bound)\n", - " 10 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6432(dtypes)\n", - " 8 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:5927(get_groupby)\n", - " 11 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/base.py:800(argsort)\n", - " 36 0.002 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:548(factorize_array)\n", - " 1610 0.002 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:831(_values)\n", - " 4 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4320(_setitem_array)\n", - " 406 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:773(_view)\n", - " 2 0.000 0.000 0.005 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6239(reset_index)\n", - " 37 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1095(nullable_schema)\n", - " 4615 0.005 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:152(cast_scalar_indexer)\n", - " 4 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:858(pad_or_backfill_inplace)\n", - " 193 0.004 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2353(copy)\n", - " 8 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:596(_homogenize)\n", - " 3843 0.003 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:909(__len__)\n", - " 194 0.001 0.000 0.005 0.000 {method 'sum' of 'numpy.ndarray' objects}\n", - " 10 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2259(_consolidate)\n", - " 4 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:918(new_func)\n", - " 11 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6133(_arith_method)\n", - " 4 0.001 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:968(_pad_2d)\n", - " 3717 0.004 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:915()\n", - " 347 0.002 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5170(_get_engine_target)\n", - " 307 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:301(maybe_iterable_to_list)\n", - " 3 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:979(parse)\n", - " 12 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1322(__contains__)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:191(_make_selectors)\n", - " 9/3 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:456(_parse_sub)\n", - " 12 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2982(get_loc)\n", - " 1177 0.003 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:696(_sanitize_ndim)\n", - " 9/3 0.003 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:516(_parse)\n", - " 4 0.001 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:149(should_cache)\n", - " 2 0.000 0.000 0.004 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:212(putmask)\n", - " 110 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:560(_validate_scalar)\n", - " 12 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:3308(_get_level_indexer)\n", - " 630/246 0.002 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:199(_walk)\n", - " 103 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:141(equals)\n", - " 6120 0.004 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/calendar.py:102(isleap)\n", - " 108 0.003 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:353(wrapper)\n", - " 194 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:47(_sum)\n", - " 26 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/concat.py:52(concat_compat)\n", - " 3 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4796(_drop_axis)\n", - " 30 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1194(_add_timedeltalike_scalar)\n", - " 134 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:189(_na_arithmetic_op)\n", - " 3 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:947(json)\n", - " 11 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6162(get_indexer_for)\n", - " 609 0.003 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:635(_get_root)\n", - " 1 0.004 0.004 0.004 0.004 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:504(lookback)\n", - " 5 0.001 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:122(get_group_index)\n", - " 1859 0.003 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:195(is_array_like)\n", - " 157 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:430(__enter__)\n", - " 661 0.002 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:180(blknos)\n", - " 8646 0.003 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2570(_validate_tz_from_dtype)\n", - " 1488 0.003 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1331(is_ea_or_datetimelike_dtype)\n", - " 10 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas_market_calendars/calendar_registry.py:41(get_calendar)\n", - " 12 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2957(_get_loc_single_level_index)\n", - "8234/8216 0.004 0.000 0.004 0.000 {built-in method builtins.hash}\n", - " 1006 0.004 0.000 0.004 0.000 {method 'match' of 're.Pattern' objects}\n", - " 2096 0.003 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:466(isframe)\n", - " 10 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas_market_calendars/class_registry.py:5(_regmeta_instance_factory)\n", - " 245 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2692(max)\n", - " 4 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:902(_fillna_prep)\n", - " 10 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:5565(_reindex_output)\n", - " 10 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas_market_calendars/market_calendar.py:107(__init__)\n", - " 97 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_daemon_thread.py:99(new_threading_enumerate)\n", - " 41 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:419(simplify_schema_references)\n", - " 14018 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:2287(cast)\n", - " 3 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/simplejson/__init__.py:459(loads)\n", - " 2 0.000 0.000 0.003 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1397(_getitem_axis)\n", - " 3 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/simplejson/decoder.py:379(decode)\n", - " 510 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/locale.py:479(_parse_localename)\n", - " 11 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5343(reindex)\n", - " 157 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:435(__exit__)\n", - " 2 0.000 0.000 0.003 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:430(_list_schema)\n", - " 2 0.000 0.000 0.003 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:214(get_compressed_ids)\n", - " 6 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5095(insert)\n", - " 3 0.003 0.001 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/simplejson/decoder.py:392(raw_decode)\n", - " 396 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:328(__init__)\n", - " 198 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2520(get_schema_or_ref)\n", - " 200 0.000 0.000 0.003 0.000 {method 'min' of 'numpy.ndarray' objects}\n", - " 2 0.000 0.000 0.003 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1205(_getbool_axis)\n", - " 12 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:558(_parse_with_reso)\n", - " 41 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:217(_ensure_arraylike)\n", - " 12 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:275(_parse_with_reso)\n", - " 1150 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:84()\n", - " 2 0.001 0.000 0.003 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:301(lexsort_indexer)\n", - " 9 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:5136(reindex)\n", - " 46 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5368(insert)\n", - " 10 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas_market_calendars/market_calendar.py:150(_prepare_regular_market_times)\n", - " 96 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1247(series_generator)\n", - " 10793 0.003 0.000 0.003 0.000 {method 'get' of 'dict' objects}\n", - " 439 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:243(__init__)\n", - " 106 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:187(validate_indices)\n", - " 6/2 0.000 0.000 0.003 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1438(putmask)\n", - " 28 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6925(f)\n", - " 2 0.000 0.000 0.003 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5433(drop)\n", - " 431 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:673(na_value_for_dtype)\n", - " 2 0.000 0.000 0.003 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4757(drop)\n", - " 200 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:43(_amin)\n", - " 1088 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:292(make_block_same_class)\n", - " 13 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:227(_encode_invalid_chars)\n", - " 1610 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2004(internal_values)\n", - " 4 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:452(split_and_operate)\n", - " 2 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_strptime.py:261(compile)\n", - " 2 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_strptime.py:238(pattern)\n", - " 181 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5134(array)\n", - " 1721 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/flags.py:51(__init__)\n", - " 3 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:928(_finalize_columns_and_data)\n", - " 879 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:591(_ensure_array)\n", - " 35 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:165(maybe_lift)\n", - " 34 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2276(_merge_blocks)\n", - " 609 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:676(_translate_key)\n", - " 12 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:424(str_schema)\n", - " 59 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4402(_check_setitem_copy)\n", - " 863 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:488(__exit__)\n", - " 433 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1253(iget)\n", - " 601 0.003 0.000 0.003 0.000 {method 'remove' of 'list' objects}\n", - " 312 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:209(count_not_none)\n", - " 99 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:77(get_type_ref)\n", - " 5 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:607(_init_dict)\n", - " 1251 0.002 0.000 0.003 0.000 {built-in method builtins.sum}\n", - " 3714 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/utils.py:50()\n", - " 1860 0.002 0.000 0.003 0.000 :760(decode)\n", - " 55 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5242(_sanitize_column)\n", - " 3 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:1006(convert_object_array)\n", - " 376 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1220(_get_value)\n", - " 3 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:1070()\n", - " 8 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4323(reindex)\n", - " 377 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1471(_set_as_cached)\n", - " 32 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:1028(convert)\n", - " 24 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:392(handle_call_schema)\n", - " 429 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:428(append)\n", - " 743 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2795(extend_blocks)\n", - " 16 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:325(__new__)\n", - " 134 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/computation/expressions.py:226(evaluate)\n", - " 3 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5993(set_index)\n", - " 373 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/dispatch.py:17(should_extension_dispatch)\n", - " 948 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:586(_get_axis)\n", - " 110 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas_market_calendars/market_calendar.py:171()\n", - " 24 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:379(handle_arguments_schema)\n", - " 361 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/getlimits.py:685(__init__)\n", - " 30 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6957()\n", - " 510 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/locale.py:396(normalize)\n", - " 1879 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/__init__.py:34(using_copy_on_write)\n", - " 1591 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1590()\n", - " 4 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/__extensions__.py:81(equity)\n", - " 52 0.002 0.000 0.002 0.000 {method 'argsort' of 'numpy.ndarray' objects}\n", - " 717 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2674(get_block_type)\n", - " 302 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:675(empty)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:9041(groupby)\n", - " 41 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:262(_get_hashtable_algo)\n", - " 585 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:312(mode)\n", - " 316/304 0.001 0.000 0.002 0.000 {built-in method builtins.sorted}\n", - " 36 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_monkey.py:1174(pydev_start_new_thread)\n", - " 609 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:617(_select_options)\n", - " 373 0.002 0.000 0.002 0.000 {method 'astype' of 'numpy.ndarray' objects}\n", - " 172 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1081(is_numeric_dtype)\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:231(parse_headers)\n", - " 439 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:948(from_blocks)\n", - " 1003 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:791(is_)\n", - " 179 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:221(__init__)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:846(get_grouper)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:231(get_result)\n", - " 4 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:371(__init__)\n", - " 134 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/computation/expressions.py:67(_evaluate_standard)\n", - " 287 0.000 0.000 0.002 0.000 {method 'max' of 'numpy.ndarray' objects}\n", - " 120 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:67(zeros_like)\n", - " 1397 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/flags.py:87(allows_duplicate_labels)\n", - " 8 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/container.py:14(__init__)\n", - " 711 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:219(_can_consolidate)\n", - " 106 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:2082(empty)\n", - " 70 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas_market_calendars/market_calendar.py:66(_tdelta)\n", - " 33 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1496(items)\n", - " 863 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:441(__init__)\n", - " 10 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2331(_concat_same_type)\n", - " 243 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:511(_validate_dtype)\n", - " 1 0.002 0.002 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:222(read)\n", - " 135 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:208(findall)\n", - " 36 0.002 0.000 0.002 0.000 {built-in method _thread.start_new_thread}\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:351(_encode_target)\n", - " 23 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6679(_maybe_cast_listlike_indexer)\n", - " 14 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:545(_get_sample_object)\n", - " 936 0.001 0.000 0.002 0.000 :697(__iter__)\n", - " 128 0.001 0.000 0.002 0.000 :150(dirname)\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/parser.py:59(parsestr)\n", - " 311 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:775(infer_dtype_from_scalar)\n", - " 112 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:833(isna)\n", - " 312 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:398(validate_inclusive)\n", - " 484 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4379(_set_is_copy)\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/parser.py:41(parse)\n", - " 225 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1006(_find_hms_idx)\n", - " 14 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:567()\n", - " 184 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5552(equals)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1479(info)\n", - " 8 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:805(call_soon_threadsafe)\n", - " 794 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:707(dtype)\n", - " 30 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1232(_add_timedeltalike)\n", - " 209 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:831(construct_from_string)\n", - " 24 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:387(apply)\n", - " 4442 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5144(_values)\n", - " 728 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:79()\n", - " 46 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1412(_insert_update_blklocs_and_blknos)\n", - " 376 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:364(cancel)\n", - " 287 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:39(_amax)\n", - " 1581 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:999(__len__)\n", - " 22 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5598()\n", - " 10 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:227(_concat_same_type)\n", - " 2096 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:283(ismodule)\n", - " 41 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_discriminated_union.py:37(apply_discriminators)\n", - " 41 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:567(validate_core_schema)\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6463(astype)\n", - " 2636 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:208(isnum)\n", - " 312 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2623(_infer_tz_from_endpoints)\n", - " 6 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:380(notna)\n", - " 1002 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:718(dtype)\n", - " 314 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:132(geterr)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:4620(map)\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:446(get_connection_with_tls_context)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1610(_log)\n", - " 97 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_daemon_thread.py:103()\n", - " 41 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/plugin/_schema_validator.py:21(create_schema_validator)\n", - " 8 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/selector_events.py:128(_write_to_self)\n", - " 2117 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:292(isclass)\n", - " 307 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:448(size)\n", - " 1128 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:325(_get_take_nd_function)\n", - " 8 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:1452(safe_sort)\n", - " 8 0.002 0.000 0.002 0.000 {method 'send' of '_socket.socket' objects}\n", - " 11 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5651(identical)\n", - " 36 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/ipkernel.py:768(init_closure)\n", - " 2110 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:378(isfunction)\n", - " 1473 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:372(apply_if_callable)\n", - " 14 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:480(_get_ndims)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4360(_iset_not_inplace)\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:171(feed)\n", - " 167 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:474(resolve_ymd)\n", - " 1 0.001 0.001 0.002 0.002 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:643()\n", - " 129 0.002 0.000 0.002 0.000 {built-in method _warnings.warn}\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7031(drop)\n", - " 318 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:299(helper)\n", - " 2104 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:300(ismethod)\n", - " 1211 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:271(__enter__)\n", - " 848 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:214(is_extension)\n", - " 306 0.002 0.000 0.002 0.000 {method 'fill' of 'numpy.ndarray' objects}\n", - " 42 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2140(get_flattened_anyof)\n", - " 6 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:176(_call_parse)\n", - " 46 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1393(moveaxis)\n", - " 6 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:216(_parsegen)\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:409(prepare_url)\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:208(__truediv__)\n", - " 318 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:2140()\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2662(getproxies_macosx_sysconf)\n", - " 184 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:728(is_valid_na_for_dtype)\n", - " 55 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:664(_constructor_from_mgr)\n", - " 7 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1316(view)\n", - " 146/41 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:425(collect_refs)\n", - " 3 0.002 0.001 0.002 0.001 {built-in method _scproxy._get_proxies}\n", - " 6 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:369(parse_url)\n", - " 276 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4191(_validate_positional_slice)\n", - " 36 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:856(__init__)\n", - " 711 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:735(_sanitize_str_dtypes)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1575(__init__)\n", - " 7 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1248(copy)\n", - " 2096 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:456(istraceback)\n", - " 522/366 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:206(_handle_other_schemas)\n", - " 219 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:914(__len__)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1636(handle)\n", - " 2096 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:480(iscode)\n", - " 10 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:12590(values)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1690(callHandlers)\n", - " 9 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:214(_obj_with_exclusions)\n", - " 41 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:158(collect_invalid_schemas)\n", - " 92 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5562(append)\n", - " 10 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1633(as_array)\n", - " 290 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:568(require_length_match)\n", - " 128 0.001 0.000 0.001 0.000 :71(join)\n", - " 131 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:835(_local_timestamps)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:478(coerce_to_target_dtype)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:7282(sort_index)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4477(__delitem__)\n", - " 31 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2229(is_monotonic_increasing)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/generic.py:2002(_get_data_to_aggregate)\n", - " 1211 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:274(__exit__)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:965(handle)\n", - " 9 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4470(_iset_item_mgr)\n", - " 23 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6394(_should_compare)\n", - " 52 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:131(filterwarnings)\n", - " 188 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:331(maybe_downcast_numeric)\n", - " 10 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1066(iset)\n", - " 124 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:633(is_integer_dtype)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1848(_make_engine)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/handlers.py:65(emit)\n", - " 146/41 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:161(_is_schema_valid)\n", - " 21 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:124(maybe_convert_platform)\n", - " 42 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2339(_deduplicate_schemas)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1707(_interleave)\n", - " 209 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:1305(construct_from_string)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:1064(group_info)\n", - " 10 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/putmask.py:101(validate_putmask)\n", - " 97 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/ipkernel.py:790()\n", - " 155 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:507(maybe_prepare_scalar_for_op)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1434(idelete)\n", - " 41 0.001 0.000 0.001 0.000 {built-in method pydantic_core._pydantic_core.validate_core_schema}\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1216(emit)\n", - " 8 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:271(from_annotation)\n", - " 46 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1402(_insert_update_mgr_locs)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1098(emit)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2235(take)\n", - " 10 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4883(_update_inplace)\n", - " 509 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:592(_get_block_manager_axis)\n", - " 179 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:62(__init__)\n", - " 92 0.001 0.000 0.001 0.000 {built-in method _operator.ne}\n", - " 1 0.000 0.000 0.001 0.001 {built-in method builtins.print}\n", - " 527 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:2443(get_origin)\n", - " 298 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:346(shape)\n", - " 158 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2264()\n", - " 10 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6731(_searchsorted_monotonic)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:655(write)\n", - " 794 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1993(dtype)\n", - " 23 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2421(all)\n", - " 981 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1837(__init__)\n", - " 635 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:667(_info_axis)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1483(reduce)\n", - " 453 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1040(needs_i8_conversion)\n", - " 42 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2340()\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:723(astype)\n", - " 3085 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:405(flags)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:258(_get_conn)\n", - " 2 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:922()\n", - " 47 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:273(__call__)\n", - " 83 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2703(new_block_2d)\n", - " 1744 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:572(_get_axis_number)\n", - " 307 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1141(_to_decimal)\n", - " 207 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:830(__len__)\n", - " 351 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_metadata.py:57(metadata)\n", - " 209 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:1054(construct_from_string)\n", - " 135 0.001 0.000 0.001 0.000 {method 'findall' of 're.Pattern' objects}\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:577(_schedule_flush)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1114(union_schema)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:259(schedule)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/accessor.py:111(f)\n", - " 79 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:225(_consolidate_key)\n", - " 215 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_schema_generation_shared.py:31(__init__)\n", - " 658 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:649(_get_deprecated_option)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/accessors.py:126(_delegate_method)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/zmq/sugar/socket.py:621(send)\n", - " 318 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:104(__init__)\n", - " 21 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:61(merge_setting)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:192(__sub__)\n", - " 74 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/type_adapter.py:115(_type_has_config)\n", - " 230/101 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2343(_make_json_hashable)\n", - " 441 0.001 0.000 0.001 0.000 {built-in method numpy.zeros}\n", - " 754 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/__init__.py:55(using_pyarrow_string_dtype)\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:60(__init__)\n", - " 1385 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:203(isword)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1087(flush)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:68(__and__)\n", - " 324 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:456(_engine_type)\n", - " 283 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:336(hms)\n", - " 686 0.001 0.000 0.001 0.000 {method 'split' of 'str' objects}\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/scrapers/quote.py:660(_fetch_complementary)\n", - " 1688 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/flags.py:55(allows_duplicate_labels)\n", - " 2 0.001 0.001 0.001 0.001 {method 'flush' of '_io.TextIOWrapper' objects}\n", - " 7 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1870(_get_label_or_level_values)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/accessor.py:95(_getter)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6123(_logical_method)\n", - " 2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:636(normalize_dictlike_arg)\n", - " 3080 0.001 0.000 0.001 0.000 {method 'append' of 'list' objects}\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/accessors.py:88(_delegate_property_get)\n", - " 312 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:193(__get__)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/scrapers/quote.py:658()\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:240(__pow__)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:421(astype)\n", - " 23 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:66(copy)\n", - " 852 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:148(__getattr__)\n", - " 31 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2180(_ensure_matching_resos)\n", - " 16 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:903(_set_levels)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:596(shape)\n", - " 3 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:687(compress_group_index)\n", - " 2830 0.001 0.000 0.001 0.000 {method 'lower' of 'str' objects}\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:378(new_index)\n", - " 223 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:74(__len__)\n", - " 10 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:598()\n", - " 6/5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2435(_signature_from_callable)\n", - " 109 0.000 0.000 0.001 0.000 :771(get)\n", - " 23 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3955(_get_indexer)\n", - " 41 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:157(core_config)\n", - " 102 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:2378(array_equal)\n", - " 530 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:72()\n", - " 8 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:676(ngroups)\n", - " 10 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:1333(searchsorted)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:359(build_response)\n", - " 37 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/type_adapter.py:413(dump_python)\n", - " 14 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:418(merge_field_infos)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_decorators.py:325(wrapper)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:469(_parse_headers)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:7894(_cmp_method)\n", - " 41 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:280(_check_object_for_strings)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:838(select_proxy)\n", - " 257 0.001 0.000 0.001 0.000 {method 'nonzero' of 'numpy.ndarray' objects}\n", - " 209 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:342(construct_from_string)\n", - " 106 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:978(__array__)\n", - " 510 0.001 0.000 0.001 0.000 {built-in method _locale.setlocale}\n", - " 16 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1085(_set_codes)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:610(prepare_cookies)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:782(result_index)\n", - " 342 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:280(_release_save)\n", - " 92 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:483(_view)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/astype.py:191(astype_array_safe)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1102(wrap_results)\n", - " 2642 0.001 0.000 0.001 0.000 {built-in method builtins.setattr}\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:744(_group_index)\n", - " 186 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:243(_keep_alive)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:140(get_cookie_header)\n", - " 10 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:333(from_annotated_attribute)\n", - " 124 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:836(__iter__)\n", - " 185 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:253(_get_values)\n", - " 252/171 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/scrapers/quote.py:645(_format)\n", - " 645 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:300()\n", - " 41 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:122(collect_definitions)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/connection.py:15(is_connection_dropped)\n", - " 4581 0.001 0.000 0.001 0.000 {method 'keys' of 'dict' objects}\n", - " 385/2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:210(remap_json_schema)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:299(is_connected)\n", - " 546 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:72(check)\n", - " 208 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:108(asi8)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:348(get_function_type_hints)\n", - " 103/85 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2432(_extract_get_pydantic_json_schema)\n", - " 1585 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2043(freq)\n", - " 14 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:494(_clean_keys_and_objs)\n", - " 233 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4623(_clear_item_cache)\n", - " 48 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:294(handle_union_schema)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:2063(to_dict)\n", - " 257 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/frozen.py:76(__getitem__)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:276(connection_from_host)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:196(__rsub__)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/methods/to_dict.py:78(to_dict)\n", - " 10 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:240(searchsorted)\n", - " 2465 0.001 0.000 0.001 0.000 {method 'decode' of 'bytes' objects}\n", - " 146/41 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_discriminated_union.py:45(inner)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:5773(isna)\n", - " 38 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:374(urlparse)\n", - " 20 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:527(__init__)\n", - " 1770 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:217(_scalar_type)\n", - " 27 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:164(hostname)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:8693(isna)\n", - " 179 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:395(__init__)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:860(values)\n", - " 591 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:644()\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:7885(replace)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_compiler.py:573(_code)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6488(isna)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:305(connection_from_context)\n", - " 209 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:2228(construct_from_string)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1565(__invert__)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:200(__mul__)\n", - " 1177 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:758(_maybe_repeat)\n", - " 24/23 0.000 0.000 0.001 0.000 {built-in method _operator.eq}\n", - " 46 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:274(make_block)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:957(getaddrinfo)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1356(add_cookie_header)\n", - " 33 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2744(inferred_type)\n", - " 199 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:111(is_annotated)\n", - " 13 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1433(find_common_type)\n", - " 314 0.001 0.000 0.001 0.000 {built-in method numpy.seterrobj}\n", - " 16 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:220(__init__)\n", - " 92 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1330(normalize_axis_tuple)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1503()\n", - " 184 0.001 0.000 0.001 0.000 :405(parent)\n", - " 146/41 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:125(_record_valid_refs)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:3261(signature)\n", - " 486 0.001 0.000 0.001 0.000 {built-in method builtins.max}\n", - " 16 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:844(levels)\n", - " 37 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/functools.py:981(__get__)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2083(remove_unused_levels)\n", - " 16 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:373(_finalize)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/data.py:322(_get_cookie_and_crumb)\n", - " 65 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1102()\n", - " 32 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:119(is_namedtuple)\n", - " 116 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:201(_simple_new)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:3007(from_callable)\n", - " 1 0.001 0.001 0.001 0.001 {built-in method _socket.getaddrinfo}\n", - " 251 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:115(get_ref)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2331(_signature_from_function)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:307(unique)\n", - " 18 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:263(eval_type_backport)\n", - " 185 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/numpy/function.py:413(validate_func)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1689(_getitem_tuple)\n", - " 569 0.001 0.000 0.001 0.000 {built-in method _thread.allocate_lock}\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:176(sorted_labels)\n", - " 1146 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1671(name)\n", - " 2514 0.001 0.000 0.001 0.000 {built-in method builtins.callable}\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:106(_encode_params)\n", - " 8 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:550(validate_categories)\n", - " 828 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6685(_validate_indexer)\n", - " 59 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:782(_rename)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:237(ndarray_to_mgr)\n", - " 2327 0.001 0.000 0.001 0.000 {built-in method _warnings._filters_mutated}\n", - " 41 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:369(__init__)\n", - " 29 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:12675(_reindex_for_setitem)\n", - " 622 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:308(_config)\n", - " 65 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:924()\n", - " 384/1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2352(_sort_json_schema)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2152(get_json_ref_counts)\n", - " 7 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4159(xs)\n", - " 36 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1051(_stop)\n", - " 18 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:296(_eval_type_backport)\n", - " 16 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:40(__init__)\n", - " 182 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:324(_get_dtype_max)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:381()\n", - " 296 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:131()\n", - " 59 0.000 0.000 0.001 0.000 :778(__contains__)\n", - " 10 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:635()\n", - " 12 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2979(prod)\n", - " 39 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/_policybase.py:301(header_source_parse)\n", - " 182 0.001 0.000 0.001 0.000 {method '_acquire_restore' of '_thread.RLock' objects}\n", - " 40 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:53(_wrapfunc)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:427(unique_with_mask)\n", - " 386/1 0.001 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2156(_add_json_refs)\n", - " 18 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:321(_eval_type)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/codeop.py:120(__call__)\n", - " 1560 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:213()\n", - " 314 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6277()\n", - " 22 0.000 0.000 0.001 0.000 :941(update)\n", - " 22 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:219(vstack)\n", - " 16 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:897()\n", - " 94 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2065(set_values)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:176(isna)\n", - " 146/41 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:447(count_refs)\n", - " 312 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2666(_maybe_normalize_endpoints)\n", - " 36 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:562(__init__)\n", - " 209 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/string_.py:140(construct_from_string)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:7172()\n", - " 1064 0.001 0.000 0.001 0.000 {method 'pop' of 'list' objects}\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:7918(_dispatch_frame_op)\n", - " 100 0.001 0.000 0.001 0.000 {method 'astype' of 'numpy.generic' objects}\n", - " 209 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:1835(construct_from_string)\n", - " 947 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1940(_block)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:204(get_netrc_auth)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:330(connection_from_pool_key)\n", - " 1397 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:363(attrs)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/wait.py:113(wait_for_read)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1450(grouped_reduce)\n", - " 10 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:710(_validate_setitem_value)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1784(get_level_values)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/accessors.py:70(_get_values)\n", - " 146/41 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:488(inline_refs)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/wait.py:57(poll_wait_for_socket)\n", - " 10 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:287(get_dtypes)\n", - " 2479 0.001 0.000 0.001 0.000 {method 'read' of '_io.StringIO' objects}\n", - " 197 0.001 0.000 0.001 0.000 {method 'reshape' of 'numpy.ndarray' objects}\n", - " 628 0.001 0.000 0.001 0.000 {built-in method numpy.geterrobj}\n", - " 123 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:4035(_dict_not_none)\n", - " 64 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2811(ensure_block_shape)\n", - " 282 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:161(iloc)\n", - " 455 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/__init__.py:42(warn_copy_on_write)\n", - " 3215 0.001 0.000 0.001 0.000 {method 'isdigit' of 'str' objects}\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:479(items)\n", - " 30 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:446(_init_decoder)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1032(_getitem_lowerdim)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/data.py:215(_get_cookie_and_crumb_basic)\n", - " 5 0.001 0.000 0.001 0.000 {built-in method builtins.compile}\n", - " 419 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1392()\n", - " 408 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:90(RLock)\n", - " 167 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:380(validate)\n", - " 150/38 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1904(field_title_should_be_set)\n", - " 77 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:184(_reconstruct_data)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:958(fast_xs)\n", - " 46 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2311(_fast_count_smallints)\n", - " 79/18 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:387(_eval_type)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1290(_cookies_for_request)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1758(_get_level_values)\n", - " 49 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:4120(_coerce_indexer_frozen)\n", - " 2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/data.py:184(_get_crumb_basic)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:943(urlencode)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/wait.py:74(do_poll)\n", - " 30 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:255(get)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2016(_sort_levels_monotonic)\n", - " 10 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1250(copy)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:156(_indexer_and_to_sort)\n", - " 619 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1168(ident)\n", - " 17 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1697(_validate_names)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1277(is_extension_array_dtype)\n", - " 2 0.001 0.000 0.001 0.000 {method 'poll' of 'select.poll' objects}\n", - " 1481 0.001 0.000 0.001 0.000 {method '__exit__' of '_thread.lock' objects}\n", - " 114 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1310(__getattr__)\n", - " 10 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:378(interleaved_dtype)\n", - " 128 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:1745(currentframe)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1272(_cookies_for_domain)\n", - " 2388 0.000 0.000 0.000 0.000 {built-in method builtins.id}\n", - " 123 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:992(is_numeric_v_string_like)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:124(extract_cookies_to_jar)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/concat.py:73()\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2036(_get_prepare_pydantic_annotations_for_known_type)\n", - " 1105 0.000 0.000 0.000 0.000 {function ProtectedDict.copy at 0x13d045b20}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1093(_getitem_nested_tuple)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:638()\n", - " 43 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:93(__init__)\n", - " 1695 0.000 0.000 0.000 0.000 {method 'items' of 'dict' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6499(min)\n", - " 545 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/numpy/function.py:64(__call__)\n", - " 213 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:329(month)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:10185(align)\n", - " 117 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_utils.py:76(lenient_issubclass)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:229(_new_pool)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12362(_stat_function)\n", - " 280 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1165(_check_deprecated_callable_usage)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12381(min)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:351(putheader)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:246(get_new_values)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2225(_garbage_collect_definitions)\n", - " 552 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:213(isspace)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1532(__neg__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:272(__init__)\n", - " 647 0.000 0.000 0.000 0.000 {method 'insert' of 'list' objects}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2252()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ssl.py:1262(sendall)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:198(__init__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6219(_raise_if_missing)\n", - " 41 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/plugin/_loader.py:21(get_plugins)\n", - " 772 0.000 0.000 0.000 0.000 {method '__enter__' of '_thread.RLock' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:2249(isclose)\n", - " 241 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/getlimits.py:709(max)\n", - " 163 0.000 0.000 0.000 0.000 :121(__subclasscheck__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:707(_get_comb_axis)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:901(quote_plus)\n", - " 454 0.000 0.000 0.000 0.000 {method 'ravel' of 'numpy.ndarray' objects}\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:847(quote)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:3995(_maybe_update_cacher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:177(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1216(_iset_split_block)\n", - " 15/3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_compiler.py:37(_compile)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2567(_proxy_bypass_macosx_sysconf)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2478(_get_all_json_refs)\n", - " 641 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:196(blklocs)\n", - " 34/32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_repr.py:86(display_as_type)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:259(_reconstruct)\n", - " 368 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:286(_is_owned)\n", - " 94 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1342(is_complex_dtype)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:634(_maybe_cast_slice_bound)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1580(construct_1d_object_array_from_listlike)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/ticker.py:34(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:72(get_objs_combined_axis)\n", - " 454 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:692(_constructor)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:319(build_schema_type_to_method)\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:345(to_key_val_list)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:2103(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7553(ensure_index_from_sequences)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:218()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:242(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/base.py:47(__init__)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6415(_is_comparable_dtype)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:414(_split_op_result)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ssl.py:1235(send)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/scrapers/quote.py:649()\n", - " 282 0.000 0.000 0.000 0.000 {method 'clear' of 'dict' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2307(factorize)\n", - " 42 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:278(prepare_config)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:243(replace)\n", - " 93/28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:409()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:276(strftime)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:776(reconstructed_codes)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/base.py:1428(factorize)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3602(difference)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:2077(__contains__)\n", - " 2 0.000 0.000 0.000 0.000 {method 'write' of '_ssl._SSLSocket' objects}\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4436(_wrap_reindex_result)\n", - " 264 0.000 0.000 0.000 0.000 :41(_get_sep)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:883(_get_args_resolving_forward_refs)\n", - " 213 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:319(jump)\n", - " 73/5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:99(all_literal_values)\n", - " 31 0.000 0.000 0.000 0.000 {built-in method numpy.arange}\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1334(_get_alias_name)\n", - " 92 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1768(ravel)\n", - " 396 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:398(__get_result)\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:923(quote_from_bytes)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:325(get_new_columns)\n", - " 312 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:1257(value)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:664(maybe_fill)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:10479(_align_frame)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:111(f)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:2329(hfunc)\n", - " 360 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/arraysetops.py:630()\n", - " 39 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1327(__instancecheck__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:183(_make_sorted_values)\n", - " 342 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:283(_acquire_restore)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:909(text)\n", - " 176 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_metadata.py:48(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:390(__init__)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_asarray.py:27(require)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/index_tricks.py:326(__getitem__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4440(_maybe_preserve_names)\n", - " 265 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:226(validate_bool_kwarg)\n", - " 749 0.000 0.000 0.000 0.000 {method 'group' of 're.Match' objects}\n", - " 134 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/missing.py:131(dispatch_fill_zeros)\n", - " 711 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:1080(copyto)\n", - " 242/218 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2345()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:337(extend)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1684(is_monotonic_increasing)\n", - " 185 0.000 0.000 0.000 0.000 {method 'groupdict' of 're.Match' objects}\n", - " 74 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:115(annotated_type)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:1332(getfullargspec)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/generic.py:155(_wrap_agged_manager)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:2344(unique)\n", - " 952 0.000 0.000 0.000 0.000 {method '__exit__' of '_thread.RLock' objects}\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1517(field_is_present)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:521(cookiejar_from_dict)\n", - " 40 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:166(is_finalvar)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1284(find_result_type)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:828(replace)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:829(_maintain_shutdown_locks)\n", - " 124 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:915(__array__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:331(putrequest)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:1019(unique)\n", - " 44 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1047(shape)\n", - " 83 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1643(__len__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:268(decons_obs_group_ids)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2107(droplevel)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/functools.py:35(update_wrapper)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:720(size)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:120(_get_combined_index)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5676()\n", - " 178 0.000 0.000 0.000 0.000 {method 'rstrip' of 'str' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:94(concatenate_managers)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:386(default_index)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:1028(nunique)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/scrapers/quote.py:651()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:1083(reduction)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:789(values)\n", - " 95 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:87(is_literal_type)\n", - " 41 0.000 0.000 0.000 0.000 :773(getenv)\n", - " 1245 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:363(ndim)\n", - " 252 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1270(is_1d_only_ea_dtype)\n", - " 163 0.000 0.000 0.000 0.000 {built-in method _abc._abc_subclasscheck}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_compiler.py:511(_compile_info)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1574(_set_names)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6480(all)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1259(putheader)\n", - " 31 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1066(_get_arithmetic_result_freq)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:490(get)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:419(_close_conn)\n", - " 185 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:1499(_maybe_null_out)\n", - " 1385 0.000 0.000 0.000 0.000 {method 'isalpha' of 'str' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:8282(_construct_result)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:718(_reorder_by_uniques)\n", - " 2 0.000 0.000 0.000 0.000 {method 'put' of 'numpy.ndarray' objects}\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:108()\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1025(argsort)\n", - " 53 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:973(coerce_indexer_dtype)\n", - " 41 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:598(collect_definitions)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:246(_decons_group_index)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:724()\n", - " 376 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:47(__init__)\n", - " 107 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/dataclasses.py:1258(is_dataclass)\n", - " 296 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:126(_classes_and_not_datetimelike)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5663(_reindex_with_indexers)\n", - " 732 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:913(__init__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:398(reduce)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6324(_maybe_downcast_for_indexing)\n", - " 460 0.000 0.000 0.000 0.000 {method 'endswith' of 'str' objects}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1680(extract_cookies)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1103(putrequest)\n", - " 3 0.000 0.000 0.000 0.000 {method 'close' of '_io.BufferedReader' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:113(comp_method_OBJECT_ARRAY)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:1084(_convert_grouper)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:159(resolve_redirects)\n", - " 136 0.000 0.000 0.000 0.000 {method 'rfind' of 'str' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1935(delete)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:407(__rsub__)\n", - " 55 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4585(_ensure_valid_index)\n", - " 92 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/typing_extensions.py:1132(is_typeddict)\n", - " 765 0.000 0.000 0.000 0.000 {method 'values' of 'dict' objects}\n", - " 66 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:735(_error_catcher)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5495()\n", - " 11 0.000 0.000 0.000 0.000 {method 'searchsorted' of 'numpy.ndarray' objects}\n", - " 1480 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:182(_deepcopy_atomic)\n", - " 194 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:553(equals)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2322(any)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2000(external_values)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas_market_calendars/calendars/nyse.py:833(regular_holidays)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1096(return_ok)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2320(_preprocess_slice_or_indexer)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:154(get)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5486()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:546(request_url)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1535(field_is_required)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:54(__gt__)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:592(get_content_type)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:781(close)\n", - " 167 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:482()\n", - " 78 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:259(__getitem__)\n", - " 733 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:211(tail)\n", - " 276 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:464(populate_defs)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2244(get_values)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:718(remove_na_arraylike)\n", - " 429 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3809()\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:482(nanany)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1418(_literal_schema)\n", - " 3 0.000 0.000 0.000 0.000 {built-in method _operator.sub}\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:86(consensus_name_attr)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:423(repeat)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:122(put)\n", - " 58 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:122(_reset_cache)\n", - " 74 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2776(_is_multi)\n", - " 380 0.000 0.000 0.000 0.000 {method 'put' of '_queue.SimpleQueue' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:573(__init__)\n", - " 20 0.000 0.000 0.000 0.000 {method '__reduce_ex__' of 'object' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5359(reindex)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:886()\n", - " 644 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:376(dtype)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:745(_get_engine_target)\n", - " 677 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:53(is_core_schema)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/astype.py:157(astype_array)\n", - " 264 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1687(__eq__)\n", - " 33 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:465(_decode)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1809(set_names)\n", - " 39 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1602(__subclasscheck__)\n", - " 46 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5295(_validate_fill_value)\n", - " 120 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/getlimits.py:696(min)\n", - " 6 0.000 0.000 0.000 0.000 :229(expanduser)\n", - " 108 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1266(_is_dunder)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:487()\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:35(__init__)\n", - " 123 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:4036()\n", - " 276 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2752(need_slice)\n", - " 57 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/_policybase.py:319(header_fetch_parse)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:489(_decref_socketios)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1599(make_cookies)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/timedeltas.py:149(__new__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6459(any)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:1324(diff)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2669(__init__)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:436(_split)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1495(_maybe_update_cacher)\n", - " 82 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1099(_parse_min_sec)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:234()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:499(close)\n", - " 3 0.000 0.000 0.000 0.000 {method 'repeat' of 'numpy.ndarray' objects}\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:354(validate_ascending)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:837(list_schema)\n", - " 70 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1056(_could_be_tzname)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1422(__sub__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/utils.py:92(get_indented_logger)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:495(_real_close)\n", - " 57 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:2473(get_args)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2159(_drop_level_numbers)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:350(getitem_block_columns)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:664(get_handle)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:652(str_schema)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2344()\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1392(np_find_common_type)\n", - " 49 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:688(_warn_if_deprecated)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:2330(within_tol)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:95(__init__)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1850(from_blocks)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:328(check_deprecated)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:393(logical_op)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:121(decompress)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1595(makeRecord)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:202(__init__)\n", - " 71 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:51(__getitem__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6916(delete)\n", - " 31 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2794(_na_value)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:355(_concatenate_chunks)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6629(cumprod)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/generic.py:160(_get_data_to_aggregate)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1126(_sub_datetimelike_scalar)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/thread.py:123(__init__)\n", - " 37 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/type_adapter.py:100(_getattr_no_parents)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:542(merge_cookies)\n", - " 1 0.000 0.000 0.000 0.000 {function socket.close at 0x10a2e20c0}\n", - " 111 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:401(_config_wrapper)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:255(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:182(close)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/weakref.py:585(__call__)\n", - " 33 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:251(put)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/methods/to_dict.py:171()\n", - " 185 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:209(_maybe_get_mask)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:658(__init__)\n", - " 182 0.000 0.000 0.000 0.000 {method '_release_save' of '_thread.RLock' objects}\n", - " 37 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:499(none_schema)\n", - " 70 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1453(current_thread)\n", - " 36 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1734(isEnabledFor)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7406(min)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:2557(_get_timestamp_range_edges)\n", - " 287 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:246(items)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:1174(_close_pool_connections)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12291(cumprod)\n", - " 825 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6672(_maybe_cast_indexer)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:82(f)\n", - " 36 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_weakrefset.py:85(add)\n", - " 90 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:46(__setitem__)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1771(_is_label_reference)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:605(float_schema)\n", - " 41 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:170(parent_frame_namespace)\n", - " 6 0.000 0.000 0.000 0.000 :16(exists)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/astype.py:56(_astype_nansafe)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12239(_accum_func)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:292(__init__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_compiler.py:243(_optimize_charset)\n", - " 57 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/_policybase.py:289(_sanitize_header)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4651(_maybe_cache_changed)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/weakref.py:427(__setitem__)\n", - " 296 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/type_adapter.py:259(_with_frame_depth)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:66(mask_missing)\n", - " 260 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:696(ndim)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:616(get_content_maintype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:241(_from_sequence_not_strict)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:941()\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:249(external_values)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:771(ngroups)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:213(_read_headers)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:525(get_all)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1158(_sub_datetimelike)\n", - " 314 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:974(dtype)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ipaddress.py:1286(__init__)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:358(update)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:735(has_dropped_na)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/accessor.py:220(__get__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:11458(blk_func)\n", - " 245 0.000 0.000 0.000 0.000 {built-in method sys._getframe}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:261(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1998(get_cache_defs_ref_schema)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:942(format)\n", - " 568 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1480(_clear_item_cache)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6509(max)\n", - " 33 0.000 0.000 0.000 0.000 {method 'write' of '_io.BytesIO' objects}\n", - " 37 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/type_adapter.py:323(_defer_build)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:724()\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:466(array_equivalent)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:303(makefile)\n", - " 41 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:198()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:620(request_host)\n", - " 566 0.000 0.000 0.000 0.000 {method 'append' of 'collections.deque' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12397(max)\n", - " 370 0.000 0.000 0.000 0.000 {method 'toordinal' of 'datetime.date' objects}\n", - " 44 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:119(_coerce_args)\n", - " 70 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:322(weekday)\n", - " 92 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1380()\n", - " 157 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:426(__init__)\n", - " 259 0.000 0.000 0.000 0.000 {built-in method numpy.asanyarray}\n", - " 477 0.000 0.000 0.000 0.000 {method 'add' of 'set' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:115(__init__)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/holiday.py:416(__init__)\n", - " 615 0.000 0.000 0.000 0.000 {built-in method time.monotonic}\n", - " 51 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2093(update_with_validations)\n", - " 48 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:127(__next__)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas_market_calendars/class_registry.py:116(copy)\n", - " 6 0.000 0.000 0.000 0.000 {built-in method posix.stat}\n", - " 439 0.000 0.000 0.000 0.000 {method '__enter__' of '_thread.lock' objects}\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:81(atleast_2d)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:76(copy)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2679(_maybe_localize_point)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1826(_check_label_or_level_ambiguity)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:781(get_adapter)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:545(is_dataclass)\n", - " 6 0.000 0.000 0.000 0.000 {method 'update' of 'collections.OrderedDict' objects}\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:2074(getLogger)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:206(__getattr__)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:1045(_validate_header_part)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1881(nonzero)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1123(return_ok_verifiability)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:1087(result_index)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:990(sequence_to_td64ns)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:396(build_connection_pool_key_attributes)\n", - " 312 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2474(validate_periods)\n", - " 2 0.000 0.000 0.000 0.000 {method 'decompress' of 'zlib.Decompress' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:266(index_labels_to_array)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/accessors.py:611(__new__)\n", - " 99 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:557(is_generic_alias)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:839()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:180()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1742(strftime)\n", - " 99 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:566(is_self_type)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:205(_hostinfo)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:140(_from_backing_data)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1839(debug)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:95(_default_key_normalizer)\n", - " 44 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2586(get_values)\n", - " 272 0.000 0.000 0.000 0.000 {built-in method posix.fspath}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:674(format)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1261(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:90(_urllib3_request_context)\n", - " 56 0.000 0.000 0.000 0.000 {method '_checkReadable' of '_io._IOBase' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:726(is_third_party)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1966(_is_lexsorted)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:86(opengroup)\n", - " 53 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1763(np_can_hold_element)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:744(_format_native_types)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2827(external_values)\n", - " 80 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:158(_check_finalvar)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1950(get_defs_ref)\n", - " 242 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1176(_maybe_disallow_fill)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:303(_normalize_host)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:636(eff_request_host)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2410(wrap_default)\n", - " 70 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:342(ampm)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:813(str_schema)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6831(infer_objects)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ipaddress.py:1187(_ip_int_from_string)\n", - " 220 0.000 0.000 0.000 0.000 {method 'rpartition' of 'str' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:153(_set_option)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1692()\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1695(__hash__)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:571(_disallow_mismatched_indexing)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:586(update_dtype)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2285()\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:487()\n", - " 17 0.000 0.000 0.000 0.000 {method 'sub' of 're.Pattern' objects}\n", - " 337 0.000 0.000 0.000 0.000 {method 'upper' of 'str' objects}\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:470(any_schema)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:588(prepare_auth)\n", - " 36 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1324(_make_invoke_excepthook)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:229(_convert_obj)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/putmask.py:62(putmask_without_repeat)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1534(blk_func)\n", - " 5/3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_compiler.py:436(_get_literal_prefix)\n", - " 237 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:660(_constructor)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:543(nanall)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1798()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:238(_new_conn)\n", - " 21/9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:178(getwidth)\n", - " 552 0.000 0.000 0.000 0.000 {method 'isspace' of 'str' objects}\n", - " 39 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:302(add)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:635(release_conn)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:564(_array_equivalent_object)\n", - " 50 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6312(_index_as_unique)\n", - " 36/20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1227(deepvalues)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1768(_set_names)\n", - " 188 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:59(is_core_schema_field)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:373(inner)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:546(ensure_key_mapped)\n", - " 245 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1081(codes)\n", - " 110 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:686()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:2526(_set_grouper)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1922(rename)\n", - " 245 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2687(_max_dispatcher)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:1547(check_below_min_count)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/response.py:40(assert_header_parsing)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2002(_lexsort_depth)\n", - " 71 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:168(__getitem__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5172(delete)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:404(is_dataclass)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:591(int_schema)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:271(validate_fillna_kwargs)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:176(append)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:3689(equals)\n", - " 611 0.000 0.000 0.000 0.000 {built-in method builtins.ord}\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2476(add_json_schema_extra)\n", - " 70 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas_market_calendars/market_calendar.py:78(_off)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:366(notify)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1188(domain_return_ok)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:348(_get_timeout)\n", - " 31 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1047(_get_i8_values_and_mask)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:781(_call_soon)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:1018(get_auth_from_url)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:539(get_encoding_from_headers)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1893(get_title_from_name)\n", - " 31 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:688(__call__)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:332(array)\n", - " 44 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:261(get)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:660(requote_uri)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:783(_creso)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:1525(__and__)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_asarray.py:108()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6380(_consolidate)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:479(__enter__)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2955(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2817(hasnans)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:100(push)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:4037(_lexsort_depth)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:296(_put_conn)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1605(maybe_cast_to_integer_array)\n", - " 242 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:344()\n", - " 306 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:178()\n", - " 92 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:315(step)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:751(__init__)\n", - " 94 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:500(lookback)\n", - " 36 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2567(push)\n", - " 307 0.000 0.000 0.000 0.000 {method 'is_finite' of 'decimal.Decimal' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:315(__init__)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6270()\n", - " 378 0.000 0.000 0.000 0.000 {method 'release' of '_thread.lock' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:409(iscoroutinefunction)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1262(_slice)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:109(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:838(_cleanup)\n", - " 38 0.000 0.000 0.000 0.000 {built-in method pydantic_core._pydantic_core.to_jsonable_python}\n", - " 137 0.000 0.000 0.000 0.000 {method 'join' of 'str' objects}\n", - " 176 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:207(remap_json_ref)\n", - " 31 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1765(_get_names)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/utils/filters.py:8(filter_inputs)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/equity.py:301(price)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3996(_check_indexing_method)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:957(_validate_tuple_indexer)\n", - " 66 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1133(_parsems)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1265(_iset_single)\n", - " 48 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:77(readline)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12260(block_accum_func)\n", - " 44 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2177(_grouping_func)\n", - " 24 0.000 0.000 0.000 0.000 :790(items)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:259(_standardize_fill_value)\n", - " 128 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:470(__getattr__)\n", - " 310 0.000 0.000 0.000 0.000 {method 'pop' of 'dict' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:169(extract_numeric_value)\n", - " 56 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:240(__next)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:263(_remove_path_dot_segments)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:240(init_poolmanager)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7723(_unpack_nested_dtype)\n", - " 41 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:3750(definitions_schema)\n", - " 85 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:58()\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:291(arrays)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5818(head)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/numpy/function.py:159(validate_argsort_with_ascending)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:137(__init__)\n", - " 240 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2831(_min_dispatcher)\n", - " 4 0.000 0.000 0.000 0.000 {built-in method _operator.truediv}\n", - " 143 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:360(convertyear)\n", - " 56 0.000 0.000 0.000 0.000 {method 'transpose' of 'numpy.ndarray' objects}\n", - " 143 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:402(has_year)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/common.py:103(_maybe_match_name)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1340()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:494(prepare_body)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:391(_has_code_flag)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:1714(na_accum_func)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:34(__init__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1327(getLogger)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:400()\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:84()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:188(clone)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2095(create_block_manager_from_blocks)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:137(__new__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:481()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:509(urlunparse)\n", - " 46 0.000 0.000 0.000 0.000 {method 'item' of 'numpy.ndarray' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:34(__str__)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:3345(arguments_parameter)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/putmask.py:115(extract_bool_array)\n", - " 130 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:804(tz)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:2364(with_default_schema)\n", - " 75 0.000 0.000 0.000 0.000 {method 'update' of 'dict' objects}\n", - " 180 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:709(inferred_type)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:774(get_proxy)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:83(is_callable_type)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1734(clear_expired_cookies)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:865(_references)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:251(handle_list_schema)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2582(array_values)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1657(_get_level_number)\n", - " 33 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/response.py:9(is_fp_closed)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1214(path_return_ok)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:405(_check_values_indices_shape_match)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:849(_list_to_arrays)\n", - " 306 0.000 0.000 0.000 0.000 {method 'remove' of 'collections.deque' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:485(__exit__)\n", - " 13 0.000 0.000 0.000 0.000 {method 'subn' of 're.Pattern' objects}\n", - " 2 0.000 0.000 0.000 0.000 {built-in method now}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:304(_get_filepath_or_buffer)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:249(_get_output_shape)\n", - " 60 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/utils.py:52(_has_surrogates)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:455(create_cookie)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6137(_align_for_op)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:644(get_group_index_sorter)\n", - " 2 0.000 0.000 0.000 0.000 {method 'sendall' of '_socket.socket' objects}\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Configuration.py:37(__setattr__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1689()\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_compiler.py:216(_compile_charset)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:679(_init_length)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:230(_can_hold_na)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:134(__init__)\n", - " 60 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1571(_get_names)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:178(sub)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:243(_from_values_or_dtype)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:98(closegroup)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:429(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:199(__init__)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:410(fill_bool)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:457(__neg__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7469(max)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:514(_parse_content_type_header)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:521()\n", - " 104 0.000 0.000 0.000 0.000 {built-in method builtins.iter}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1377(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/shape_base.py:1185(tile)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/base.py:294(is_dtype)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:243(get_payload)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:100(__new__)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas_market_calendars/class_registry.py:73(__init__)\n", - " 4 0.000 0.000 0.000 0.000 {method 'all' of 'numpy.generic' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:1436(date)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:405(_types_namespace)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:558()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:1165(_is_binary_mode)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:438(convert)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:390(_check_close)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:58(__new__)\n", - " 178 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:153(concatenate)\n", - " 84 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1725(__eq__)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1880(log)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:215(_vhstack_dispatcher)\n", - " 70 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas_market_calendars/market_calendar.py:152()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1685(_clean_options)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:606(formatTime)\n", - " 40 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:99(freq)\n", - " 92 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:280(start)\n", - " 59 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:743(readable)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:762(infer_dtype_from)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:57(__iter__)\n", - " 2 0.000 0.000 0.000 0.000 {method 'cumsum' of 'numpy.ndarray' objects}\n", - " 257 0.000 0.000 0.000 0.000 {function FrozenList.__getitem__ at 0x12c993740}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/accessors.py:59(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:647(request_path)\n", - " 4 0.000 0.000 0.000 0.000 {built-in method _operator.inv}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/roperator.py:14(rsub)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1161(return_ok_domain)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:331(_set_grouper)\n", - " 3 0.000 0.000 0.000 0.000 {built-in method from_bytes}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4585(_is_view)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:454(__exit__)\n", - " 71 0.000 0.000 0.000 0.000 {method '__getitem__' of 'dict' objects}\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:653()\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:2426(nullable_schema)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:170()\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:352(na_logical_op)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1966()\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:49(get_full_url)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/util.py:19(to_str)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1467(debug)\n", - " 22 0.000 0.000 0.000 0.000 {method 'fullmatch' of 're.Pattern' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1574(_validate_key)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/events.py:35(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/data.py:48(__call__)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:157(clean_fill_method)\n", - " 39 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:507(set_raw)\n", - " 37 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/type_adapter.py:314(serializer)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:141(validate_kwargs)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:363(_can_hold_element)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3766(_convert_can_do_setop)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:642()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1561(findCaller)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:794(close)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2214(_build_definitions_remapping)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:940(date_schema)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:121(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:480(is_view)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1096(_can_fast_transpose)\n", - " 68 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1206(daemon)\n", - " 213 0.000 0.000 0.000 0.000 {method 'end' of 're.Match' objects}\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:2472(union_schema)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:630(prepare_hooks)\n", - " 4 0.000 0.000 0.000 0.000 {built-in method posix.cpu_count}\n", - " 161 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:266(mgr_locs)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:692(__init__)\n", - " 56 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:256(match)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1069(_is_homogeneous_type)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:514(_collect_metadata)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_known_annotated_metadata.py:121(expand_grouped_metadata)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:512(_validate_axis)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:136(ones)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:349(_maybe_cast_slice_bound)\n", - " 179 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:186(__iter__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2804(_isnan)\n", - " 120 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/arraysetops.py:761(_isin_dispatcher)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:268(_get_out_dtype)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1731(__hash__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1627(_get_options_with_defaults)\n", - " 46 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1455()\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:29(_splitparam)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:974(_is_nested_tuple_indexer)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6055(_check_indexing_error)\n", - " 30 0.000 0.000 0.000 0.000 {method 'getvalue' of '_io.BytesIO' objects}\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:157(_int64_cut_off)\n", - " 120 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:63(_zeros_like_dispatcher)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:638(_passed_categorical)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copyreg.py:104(__newobj__)\n", - " 182 0.000 0.000 0.000 0.000 {method '_is_owned' of '_thread.RLock' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:636(unquote_unreserved)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:349(set_cookie)\n", - " 71 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:447(isclosed)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:82(frame_apply)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:191(_validate_parse_dates_presence)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/utils.py:185(is_isin)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:849(__init__)\n", - " 56 0.000 0.000 0.000 0.000 {method '_checkClosed' of '_io._IOBase' objects}\n", - " 43 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:206(_should_unflatten_callable_args)\n", - " 2 0.000 0.000 0.000 0.000 :117(splitext)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:140(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:735(unwrap)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:1454(__init__)\n", - " 6 0.000 0.000 0.000 0.000 {method 'settimeout' of '_socket.socket' objects}\n", - " 94 0.000 0.000 0.000 0.000 {built-in method numpy.core._multiarray_umath.normalize_axis_index}\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:131(is_new_type)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:333(tail)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/json/__init__.py:299(loads)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1297(_cookie_attrs)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1725(can_hold_element)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:95(__getitem__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/env.py:48(DEBUG_MODE)\n", - " 120 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/arraysetops.py:519(_in1d_dispatcher)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/traitlets/traitlets.py:676(__get__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:220(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:1204(is_potential_multi_index)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:900(default_headers)\n", - " 6 0.000 0.000 0.000 0.000 {built-in method today}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:536(close)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1061()\n", - " 6 0.000 0.000 0.000 0.000 {method 'readlines' of '_io._IOBase' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:258(__init__)\n", - " 36 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/debugpy/_vendored/pydevd/_pydev_bundle/pydev_monkey.py:1084(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:326()\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:616()\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1357(__getattr__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:212(_get_cython_vals)\n", - " 29 0.000 0.000 0.000 0.000 {method 'acquire' of '_thread.RLock' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:207(register_hook)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:130(_validate_timeout)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:288()\n", - " 4 0.000 0.000 0.000 0.000 {built-in method _operator.pow}\n", - " 50 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:892(bincount)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:102()\n", - " 153 0.000 0.000 0.000 0.000 {method 'replace' of 'str' objects}\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:5607()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/equity.py:62(fundamental)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:1135(_splitport)\n", - " 116 0.000 0.000 0.000 0.000 {built-in method _thread.get_ident}\n", - " 101 0.000 0.000 0.000 0.000 {method 'extend' of 'list' objects}\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:3002()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ipaddress.py:1213(_parse_octet)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:475(any_extension_types)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1667(_validate_integer)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:69(close)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/request.py:189(body_to_chunks)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1721()\n", - " 41 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2516(__init__)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:167(get_annotations)\n", - " 8 0.000 0.000 0.000 0.000 {built-in method _operator.invert}\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:602()\n", - " 44 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1388(__eq__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:516()\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:353()\n", - " 99 0.000 0.000 0.000 0.000 {method 'partition' of 'str' objects}\n", - " 102 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:2374(_array_equal_dispatcher)\n", - " 62 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:231(_constructor)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:228(_acquireLock)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:241(is_single_block)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:106(_get_distinct_objs)\n", - " 57 0.000 0.000 0.000 0.000 {method 'find' of 'str' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:107(get_redirect_target)\n", - " 124 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:85(empty_like)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/json/decoder.py:332(decode)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:207(_arrays_for_stack_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/json/__init__.py:183(dumps)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1111(_values)\n", - " 27 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:248(_qsize)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:81(__init__)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1889(isEnabledFor)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:3386(arguments_schema)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:206(get_module_ns_of)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1463()\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:688(_sanitize_non_ordered)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:209(_get_decoder)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1730(_get_default_index_names)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/weakref.py:568(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/retry.py:202(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:306(is_named_tuple)\n", - " 37 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/type_adapter.py:333(_is_defer_build_config)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:265(_engine_type)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:950(_validate_or_indexify_columns)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/hooks.py:15(default_hooks)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_compiler.py:398(_simple)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:248(stringify_path)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1046(nlevels)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/utils.py:88(__exit__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:761(__init__)\n", - " 73 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:575(is_set)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1028(_output)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:677(escape_path)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:267(clear)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:91(is_deprecated_instance)\n", - " 38 0.000 0.000 0.000 0.000 {method 'title' of 'str' objects}\n", - " 2 0.000 0.000 0.000 0.000 {built-in method _operator.mul}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:520(urlunsplit)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:534()\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:693(_get_result_dim)\n", - " 33 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1249(shape)\n", - " 99 0.000 0.000 0.000 0.000 {method 'discard' of 'set' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:532(treat_as_nested)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:453(_uniq)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:424(close)\n", - " 32 0.000 0.000 0.000 0.000 {method 'difference_update' of 'set' objects}\n", - " 29 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1030(axes)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:884(__init__)\n", - " 42 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:208(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:3108(cumprod)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:332(_idna_encode)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:303()\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:1507(_get_value)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:172(from_float)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/json/encoder.py:183(encode)\n", - " 91 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:380(is_unique)\n", - " 48 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:51(origin_is_union)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:1206(literal_schema)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:334(__init__)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:479(__repr__)\n", - " 31 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:1095(__new__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_compiler.py:386(_mk_bitmap)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:478()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:550(infer_compression)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:756(_shallow_copy)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:769(is_redirect)\n", - " 13 0.000 0.000 0.000 0.000 {built-in method fromkeys}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:157(from_prioritized_choices)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:983(is_in_axis)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:293(tell)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2738(_check_indexing_error)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:540()\n", - " 41 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2564(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:572(prepare_content_length)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:99(_intenum_converter)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:643(name)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/abstract/singleton.py:14(__call__)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/from_thread.py:170(_check_running)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:315(_subx)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:316(_class_escape)\n", - " 42 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:291(__iter__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:480()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:1087(_validate_conn)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:209(is_object)\n", - " 66 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:248(__len__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:497(_extract_metadata)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/scrapers/analysis.py:13(__init__)\n", - " 166 0.000 0.000 0.000 0.000 {method 'locked' of '_thread.lock' objects}\n", - " 24 0.000 0.000 0.000 0.000 :812(__init__)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1686(name)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:143(clear)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:95(literal_values)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:672(_is_view_after_cow_rules)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:742(_get_axes)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1394(__hash__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/data.py:26(wrapped)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1062(levshape)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1652(_is_scalar_access)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method time.strftime}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:550(domain_match)\n", - " 92 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5558(_append_dispatcher)\n", - " 85 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:290(_add_custom_serialization_from_json_encoders)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:373(is_sequence)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:94(origin_req_host)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:397(ensure_np_dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:596(_sign)\n", - " 52 0.000 0.000 0.000 0.000 {method 'setdefault' of 'dict' objects}\n", - " 2 0.000 0.000 0.000 0.000 {built-in method time.localtime}\n", - " 92 0.000 0.000 0.000 0.000 {built-in method _operator.index}\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/astype.py:249(astype_is_view)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:2352(_adjust_bin_edges)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:117(__init__)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/functools.py:65(wraps)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_schema_generation_shared.py:72(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:201(_set_noconvert_columns)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:52(__init__)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method builtins.locals}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:862(codes)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:85(path_url)\n", - " 5 0.000 0.000 0.000 0.000 {built-in method _operator.and_}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:131(identify_interval)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:464(get_array_op)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:194(_is_internal_frame)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/encodings/idna.py:145(encode)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:891(_get_first_arg_or_any)\n", - " 18 0.000 0.000 0.000 0.000 {built-in method gc.get_referents}\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:284(_get_result_dtype)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:311(is_null_slice)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:316(close)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1285(__call__)\n", - " 6 0.000 0.000 0.000 0.000 {function SocketIO.close at 0x10a2e2e80}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2155()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6357(_protect_consolidate)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1990(__exit__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/generic.py:2015(_wrap_agged_manager)\n", - " 92 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1764(_ravel_dispatcher)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:196(mgr_to_mgr)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:46(get_origin_req_host)\n", - " 27 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:164(__len__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/utils.py:85(__enter__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:175(port)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/hooks.py:22(dispatch_hook)\n", - " 41 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:330(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:691(reach)\n", - " 54 0.000 0.000 0.000 0.000 {built-in method sys.getrefcount}\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1753(__iter__)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:38(is_valid_positional_slice)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1619(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:211(_simple_new)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:541(to_numpy)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:652(usesTime)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:594(_bool_arith_check)\n", - " 24 0.000 0.000 0.000 0.000 {built-in method time.time}\n", - " 1 0.000 0.000 0.000 0.000 {method 'cumprod' of 'numpy.ndarray' objects}\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/IPython/core/compilerop.py:180(extra_flags)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:254(__new__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:1079(closed)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:204()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:1149(_normalize_host)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:535(is_HDN)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1667(set_cookie)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:987(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1939(normalize_name)\n", - " 75 0.000 0.000 0.000 0.000 {method 'popleft' of 'collections.deque' objects}\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2294()\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:376(_escape)\n", - " 45 0.000 0.000 0.000 0.000 {method 'lstrip' of 'str' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:363(_repeater)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/json/encoder.py:205(iterencode)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/pivot.py:173()\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1472()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:3445(call_schema)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:362(_make_index)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4518(_check_inplace_and_allows_duplicate_labels)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:43(get_host)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3035(unique)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/scrapers/fundamentals.py:13(__init__)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:251(_put)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/retry.py:387(is_retry)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:452(_no_nep50_warning)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:572(is_required)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:254(_get)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:231(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:984()\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/_internal_utils.py:25(to_native_string)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:1066(get_fill_func)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1622(close)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:922(acquire)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:219(mask_all)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1524(__init__)\n", - " 1 0.000 0.000 0.000 0.000 {method 'any' of 'numpy.generic' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Context.py:124(clear_context)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:374(_merge_pool_kwargs)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:799(mount)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:83(groups)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/json/decoder.py:343(raw_decode)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/traitlets/traitlets.py:629(get)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:242()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:304(cert_verify)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:659(unquote)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:146(dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1432(_update_class_schema)\n", - " 40 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas_market_calendars/market_calendar.py:187()\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Configuration.py:29(__getattr__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:195(_new_message)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:150(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:393(prepare_method)\n", - " 2 0.000 0.000 0.000 0.000 :140(basename)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/command_runner.py:438(system_settings)\n", - " 3 0.000 0.000 0.000 0.000 :815(__len__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:156(username)\n", - " 21 0.000 0.000 0.000 0.000 {method 'rstrip' of 'bytes' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:1465(list_schema)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:164(host)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1479()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:84(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1959(maybe_mangle_lambdas)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1122()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:811(_newname)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/pivot.py:493(_convert_by)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/connection.py:93(_set_socket_options)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:658(formatMessage)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:535(temp_setattr)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/util/numba_.py:18(maybe_use_numba)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:121(pushlines)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:166(__setattr__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:8084(_align_for_op)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:102(__setitem__)\n", - " 46 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5364(_insert_dispatcher)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:3176(ndim)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:174(not_none)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:574(is_zoneinfo_type)\n", - " 29 0.000 0.000 0.000 0.000 {method 'release' of '_thread.RLock' objects}\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:237(_releaseLock)\n", - " 39 0.000 0.000 0.000 0.000 {method 'strip' of 'str' objects}\n", - " 48 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1828(ndim)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:773(__init__)\n", - " 46 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1389(_moveaxis_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:2133(_refine_defaults_read)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/command_runner.py:443(user_settings)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/scrapers/holders.py:15(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:350(_maybe_make_multi_index_columns)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/handlers.py:354(shouldRollover)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:1233(dedup_names)\n", - " 2 0.000 0.000 0.000 0.000 :121(_splitext)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:799(iter_content)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:918(_wrap_ipv6)\n", - " 24 0.000 0.000 0.000 0.000 {method 'find' of 'bytearray' objects}\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:403()\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1076()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:139()\n", - " 41 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2583(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1329(result_index)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1319(disable)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:113(__init__)\n", - " 6 0.000 0.000 0.000 0.000 {method 'tolist' of 'numpy.ndarray' objects}\n", - " 13 0.000 0.000 0.000 0.000 {method 'decode' of 'bytearray' objects}\n", - " 44 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:108(_noop)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:661(_ilevel)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:4039()\n", - " 13 0.000 0.000 0.000 0.000 {method 'count' of 'bytes' objects}\n", - " 4 0.000 0.000 0.000 0.000 {method 'pop' of 'collections.OrderedDict' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:339(_validate_conn)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:1073(clean_reindex_fill_method)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:65(is_function_with_inner_schema)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1181()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:447(format)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:982()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:788()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:245(read_timeout)\n", - " 41 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:510()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_request_methods.py:51(__init__)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:126(resolve_default_timeout)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ipaddress.py:574(__int__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1695()\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/IPython/core/interactiveshell.py:3493(compare)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/index_tricks.py:415()\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:922(_maybe_infer_dtype_type)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:790(unit)\n", - " 31 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2734(kind)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:135(super_len)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:691(__del__)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:168()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:183(host)\n", - " 41 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:467()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_compiler.py:388()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_compiler.py:467(_get_charset_prefix)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:60(__len__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:72(has_header)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2026(handle_ref_overrides)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:671(check_str_or_none)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2416(_all_dispatcher)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:202(start_connect)\n", - " 21 0.000 0.000 0.000 0.000 {method 'values' of 'collections.OrderedDict' objects}\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/hooks.py:16()\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1331(dtype)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:196()\n", - " 1 0.000 0.000 0.000 0.000 {built-in method _operator.gt}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:49(_check_for_default_values)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:128(_check_for_invalid_keys)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2730(annotation)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1877(_nonzero_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:871(_do_date_conversions)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:1434(is_busday)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Configuration.py:18(initialize_configuration)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:436(flush)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/putmask.py:29(putmask_inplace)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/data.py:155(_get_cookie_basic)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:194(close)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1989(index)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:706()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:440(_format)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:929(release)\n", - " 3 0.000 0.000 0.000 0.000 {method 'sort' of 'list' objects}\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1721()\n", - " 2 0.000 0.000 0.000 0.000 {built-in method zlib.decompressobj}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:432(usesTime)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/retry.py:379(_is_method_retryable)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:935(_expand_ellipsis)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:671()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1269(set_inplace)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:677(_constructor_expanddim)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1674(_check_file_or_buffer)\n", - " 12 0.000 0.000 0.000 0.000 {method 'groups' of 're.Match' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:505(parent_header)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/utils.py:158(get_yf_logger)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:471(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:641(fill_missing_names)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1980(shape)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:105(is_file_like)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:198(split)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:125(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2721(is_nested_tuple)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:244(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1243(_validate_path)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3760(_assert_can_do_setop)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:193(_userinfo)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:91(merge_hooks)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:974(close)\n", - " 12 0.000 0.000 0.000 0.000 {method 'count' of 'str' objects}\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:211()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:601(_set_noconvert_dtype_columns)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:531(validate_ordered)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7652(ensure_has_len)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:997(raise_for_status)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1094()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/_internal_utils.py:38(unicode_is_ascii)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:863(cleandoc)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/utils.py:190(check_single_item)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:202(_maybe_reindex_columns_na_proxy)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_model_construction.py:257(__getattr__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:999(is_in_obj)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1720(getEffectiveLevel)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:367()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:321(filter)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/methods/to_dict.py:155()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:805()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/abstract/error.py:9(__init__)\n", - " 8 0.000 0.000 0.000 0.000 {built-in method _contextvars.copy_context}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:215(push)\n", - " 23 0.000 0.000 0.000 0.000 {method '__contains__' of 'frozenset' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:370()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6390()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:764(categories)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:389(standardize_mapping)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:947()\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:949()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:211(is_multipart)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/retry.py:242()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:343()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:550(_is_master_process)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1230(_encode_request)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/request.py:134(set_file_position)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:665(_get_registered_option)\n", - " 6 0.000 0.000 0.000 0.000 :52(normcase)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:751()\n", - " 23 0.000 0.000 0.000 0.000 {method 'isidentifier' of 'str' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1720(_value_and_type_iter)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:815(filter)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:585(_ensure_2d)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:1080(_is_label_like)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:403(retries)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:532()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:314()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:238(is_int64_overflow_possible)\n", - " 2 0.000 0.000 0.000 0.000 {method 'register' of 'select.poll' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:331(set_payload)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:208(_pop_message)\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:44(_debug)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_dataclasses.py:198(is_builtin_dataclass)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:7045(_deprecate_downcast)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:770(_maybe_check_integrity)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1474()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1234(_validate_method)\n", - " 7 0.000 0.000 0.000 0.000 {method 'index' of 'list' objects}\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:176(dtype)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1809(__init__)\n", - " 1 0.000 0.000 0.000 0.000 {method 'setsockopt' of '_socket.socket' objects}\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:518(__repr__)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:592(groupings)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1021(_argsort_dispatcher)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_schema_generation_shared.py:39(resolve_ref_schema)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_compiler.py:31(_combine_flags)\n", - " 3 0.000 0.000 0.000 0.000 :1()\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1567(_maybe_transpose_result)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/scrapers/quote.py:488(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1643(reconstruct_func)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:338(astype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:354(__array__)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2726(default)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5168(_delete_dispatcher)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_compiler.py:570(isstring)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:187(_get_fill_value)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:143()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_migration.py:262(wrapper)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:966(_selected_obj)\n", - " 5 0.000 0.000 0.000 0.000 {method 'write' of '_io.StringIO' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:75()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:1099(expand_template)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:171()\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1903()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:371(check_key_length)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:56(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:963(fix_flags)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:1123(_make_date_converter)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:186(_from_factorized)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2722(name)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:222()\n", - " 1 0.000 0.000 0.000 0.000 {built-in method math.copysign}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2772()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1141(return_ok_expires)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:948()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:164()\n", - " 3 0.000 0.000 0.000 0.000 {built-in method _sre.compile}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:1229()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:62(is_list_like_indexer)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1180()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:207(validate_header_arg)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2220(_can_hold_na)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/numpy/function.py:223(validate_cum_func_with_skipna)\n", - " 4 0.000 0.000 0.000 0.000 {method 'items' of 'mappingproxy' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:279(_extract_multi_indexer_columns)\n", - " 12 0.000 0.000 0.000 0.000 {method 'items' of 'collections.OrderedDict' objects}\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2317(_any_dispatcher)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:191(_values_for_argsort)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:515(get_compression_method)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1128(value_getitem)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:520(convert_to_list_like)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:655(_constructor)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:123(getLevelName)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:696(names)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ssl.py:1145(_checkClosed)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1251(_validate_host)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:369()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:110(__init__)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1793()\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/IPython/core/interactiveshell.py:1277(user_global_ns)\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1986(_sort_levels_monotonic)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:619(categories)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:77(_atleast_2d_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:1269(_process_date_conversion)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:136(ticker)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:607(consolidate)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:188(all_none)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/dataclasses.py:332(is_pydantic_dataclass)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:886(inner)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:227(connect_timeout)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/parser.py:17(__init__)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:320(__len__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:578(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:183(maybe_box_native)\n", - " 6 0.000 0.000 0.000 0.000 {method 'extend' of 'collections.deque' objects}\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2974(_prod_dispatcher)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:305(loc)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:77(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1192(is_alive)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:205()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:336(_na_ok_dtype)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4367(igetitem)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/functools.py:421(_unwrap_partial)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:518(_check_closed)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2053(get_schema_from_definitions)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:1131(putmask)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1847()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:916()\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2070()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/scrapers/quote.py:582()\n", - " 10 0.000 0.000 0.000 0.000 {method '__exit__' of 'memoryview' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/methods/to_dict.py:160()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:743(set_environ)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:84(is_holiday)\n", - " 15 0.000 0.000 0.000 0.000 {method 'isascii' of 'str' objects}\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/utils.py:82(__init__)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:172(__setitem__)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2781()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/collections/__init__.py:587(__init__)\n", - " 7 0.000 0.000 0.000 0.000 {method 'count' of 'list' objects}\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:117(info)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:703(datetime_schema)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:148(end_date)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1963()\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas_market_calendars/calendars/nyse.py:829(weekmask)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:91(ensure_python_int)\n", - " 6 0.000 0.000 0.000 0.000 {method 'truncate' of '_io.StringIO' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:981()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:90(unverifiable)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1665()\n", - " 6 0.000 0.000 0.000 0.000 {method 'index' of 'str' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:392(ensure_dtype_objs)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:722(_result_index)\n", - " 12 0.000 0.000 0.000 0.000 {method 'seek' of '_io.StringIO' objects}\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:1954(get_debug)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:295(is_closed)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:553(nblocks)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:657()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:445(unit)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/data.py:29()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/env.py:63(str2bool)\n", - " 2 0.000 0.000 0.000 0.000 {method 'set' of '_contextvars.ContextVar' objects}\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:669(result_type)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:1117(_maybe_memory_map)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:502()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/scrapers/quote.py:620()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:687(is_closed)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/util.py:7(to_bytes)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method select.poll}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:941()\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_compiler.py:428(_get_iscased)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1979(nlevels)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:368(getMessage)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2577(is_view)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:212()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:330()\n", - " 7 0.000 0.000 0.000 0.000 {method 'pop' of 'set' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:159(_freeze)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1307()\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:632(ordered)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/replace.py:31(should_use_regex)\n", - " 5 0.000 0.000 0.000 0.000 {built-in method sys.audit}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/errors/__init__.py:535(_check_cacher)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:3015(parameters)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:2139(_codes)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:810(is_expired)\n", - " 4 0.000 0.000 0.000 0.000 {built-in method sys.getrecursionlimit}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:172()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/data.py:28()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:138(_event_pipe)\n", - " 2 0.000 0.000 0.000 0.000 {method 'reset' of '_contextvars.ContextVar' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:421(lexsort)\n", - " 4 0.000 0.000 0.000 0.000 {built-in method posix.getpid}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:144(start_date)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:1426(_validate_parse_dates_arg)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method _codecs.lookup}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:2056(_clean_na_values)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:814(_get_refs_and_copy)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:893(_check_data_length)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:440(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:84(add_unredirected_header)\n", - " 5 0.000 0.000 0.000 0.000 {method 'reverse' of 'list' objects}\n", - " 1 0.000 0.000 0.000 0.000 :2(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1114(return_ok_version)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/connection.py:103(allowed_gai_family)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:369(should_store)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/data.py:31()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:992(_validate_key_length)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:717(index)\n", - " 1 0.000 0.000 0.000 0.000 {method 'swapaxes' of 'numpy.ndarray' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:346(where)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1152(name)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:3172(_ndim_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:698()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:581(iter_slices)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:194(_values_for_factorize)\n", - " 1 0.000 0.000 0.000 0.000 {method 'split' of 're.Pattern' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:255(_has_complex_date_col)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:213()\n", - " 2 0.000 0.000 0.000 0.000 {method 'clear' of 'collections.OrderedDict' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/shape_base.py:1257()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/scrapers/fundamentals.py:44(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:562()\n", - " 2 0.000 0.000 0.000 0.000 {method 'split' of 'bytes' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:191(__set_y)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/multiprocessing/process.py:189(name)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/base.py:115(__eq__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:131(close)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:926(is_blocked)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:2365(_validate_skipfooter)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3211(_validate_sort_keyword)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:494(dtype)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/container.py:39(_get_provider)\n", - " 2 0.000 0.000 0.000 0.000 {method 'cast' of 'memoryview' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/multiprocessing/process.py:37(current_process)\n", - " 4 0.000 0.000 0.000 0.000 {method 'isalnum' of 'str' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_validate_call.py:51()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:480(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:1447(is_index_col)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:124(__iter__)\n", - " 2 0.000 0.000 0.000 0.000 {method 'write' of '_io.TextIOWrapper' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:2245(_isclose_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:188(_expand_user)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/numpy/function.py:383(validate_minmax_axis)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:895(_get_hostport)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:216()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:805(_maybe_copy)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1135(return_ok_secure)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:941(is_not_allowed)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/proxy.py:11(connection_requires_http_tunnel)\n", - " 3 0.000 0.000 0.000 0.000 {method 'date' of 'datetime.datetime' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/obbject.py:209()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/response.py:79()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:891(default_user_agent)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:856(columns)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:141(is_re)\n", - " 1 0.000 0.000 0.000 0.000 {method 'values' of 'mappingproxy' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:450(check_dtype_backend)\n", - " 2 0.000 0.000 0.000 0.000 {method 'translate' of 'bytearray' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/data.py:30()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:245(_init)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method sys.getfilesystemencoding}\n", - " 4 0.000 0.000 0.000 0.000 {built-in method builtins.chr}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:326()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:578(add_headers)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:11522()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:419(_repeat_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method _codecs.lookup_error}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:643(__enter__)\n", - " 1 0.000 0.000 0.000 0.000 :315(__subclasshook__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:527(validate_integer)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:87(get_new_headers)\n", - " 3 0.000 0.000 0.000 0.000 {method 'get' of 'mappingproxy' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:460(tolist)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:216(_validate_dtype)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:446(__exit__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:1320(_diff_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:2267(_extract_dialect)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:235()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/data.py:418(_get_proxy)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:292(is_fsspec_url)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1147(return_ok_port)\n", - " 3 0.000 0.000 0.000 0.000 {function HTTPResponse.flush at 0x10c128cc0}\n", - " 2 0.000 0.000 0.000 0.000 {method 'get' of '_contextvars.ContextVar' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/data.py:80(_set_session)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:886()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:3019(return_annotation)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/helpers/utils.py:10(verify_ticker)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:986(_validate_usecols_arg)\n", - " 1 0.000 0.000 0.000 0.000 {method 'rsplit' of 'str' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2240()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:192()\n", - " 2 0.000 0.000 0.000 0.000 {method 'with_traceback' of 'BaseException' objects}\n", - " 1 0.000 0.000 0.000 0.000 {built-in method _socket.getdefaulttimeout}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:443(__enter__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:69(is_unverifiable)\n", - " 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1976(_shape_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/shape_base.py:1181(_tile_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1987(__enter__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:559(_validate_names)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:247()\n", - " 1 0.000 0.000 0.000 0.000 {built-in method builtins.divmod}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:224()\n", - " 1 0.000 0.000 0.000 0.000 {method 'expandtabs' of 'str' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/collections/__init__.py:660(update)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:107(_copy_immutable)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:3104(_cumprod_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:451(__enter__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:105(_box_func)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/collections/__init__.py:601(__missing__)\n", - "\n", - "\n", - "\n" - ] - } - ], - "source": [ - "stats.print_stats()\n", - "print(stream.getvalue())" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Updating Cache\n" - ] - } - ], - "source": [ - "from EventDriven.riskmanager import produce_order_candidates, populate_cache\n", - "import cProfile\n", - "import pstats\n", - "import io\n", - "profiler = cProfile.Profile()\n", - "profiler.enable()\n", - "#run backtest\n", - "populate_cache(\n", - " candi,\n", - " evb_backtest.start_date,\n", - " evb_backtest.end_date,\n", - " evb_backtest.end_date,\n", - ")\n", - "profiler.disable()\n", - "stream = io.StringIO()\n", - "stats = pstats.Stats(profiler, stream=stream).sort_stats('cumulative')" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "ename": "KeyboardInterrupt", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[25], line 2\u001b[0m\n\u001b[1;32m 1\u001b[0m stats\u001b[38;5;241m.\u001b[39mprint_stats()\n\u001b[0;32m----> 2\u001b[0m \u001b[38;5;28mprint\u001b[39m(stream\u001b[38;5;241m.\u001b[39mgetvalue())\n", - "Cell \u001b[0;32mIn[25], line 2\u001b[0m\n\u001b[1;32m 1\u001b[0m stats\u001b[38;5;241m.\u001b[39mprint_stats()\n\u001b[0;32m----> 2\u001b[0m \u001b[38;5;28mprint\u001b[39m(stream\u001b[38;5;241m.\u001b[39mgetvalue())\n", - "File \u001b[0;32m_pydevd_bundle/pydevd_cython.pyx:1457\u001b[0m, in \u001b[0;36m_pydevd_bundle.pydevd_cython.SafeCallWrapper.__call__\u001b[0;34m()\u001b[0m\n", - "File \u001b[0;32m_pydevd_bundle/pydevd_cython.pyx:701\u001b[0m, in \u001b[0;36m_pydevd_bundle.pydevd_cython.PyDBFrame.trace_dispatch\u001b[0;34m()\u001b[0m\n", - "File \u001b[0;32m_pydevd_bundle/pydevd_cython.pyx:1152\u001b[0m, in \u001b[0;36m_pydevd_bundle.pydevd_cython.PyDBFrame.trace_dispatch\u001b[0;34m()\u001b[0m\n", - "File \u001b[0;32m_pydevd_bundle/pydevd_cython.pyx:1135\u001b[0m, in \u001b[0;36m_pydevd_bundle.pydevd_cython.PyDBFrame.trace_dispatch\u001b[0;34m()\u001b[0m\n", - "File \u001b[0;32m_pydevd_bundle/pydevd_cython.pyx:312\u001b[0m, in \u001b[0;36m_pydevd_bundle.pydevd_cython.PyDBFrame.do_wait_suspend\u001b[0;34m()\u001b[0m\n", - "File \u001b[0;32m~/miniconda3/envs/openbb/lib/python3.11/site-packages/debugpy/_vendored/pydevd/pydevd.py:2070\u001b[0m, in \u001b[0;36mPyDB.do_wait_suspend\u001b[0;34m(self, thread, frame, event, arg, exception_type)\u001b[0m\n\u001b[1;32m 2067\u001b[0m from_this_thread\u001b[38;5;241m.\u001b[39mappend(frame_custom_thread_id)\n\u001b[1;32m 2069\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_threads_suspended_single_notification\u001b[38;5;241m.\u001b[39mnotify_thread_suspended(thread_id, thread, stop_reason):\n\u001b[0;32m-> 2070\u001b[0m keep_suspended \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_do_wait_suspend\u001b[49m\u001b[43m(\u001b[49m\u001b[43mthread\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mframe\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mevent\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43marg\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msuspend_type\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfrom_this_thread\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mframes_tracker\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2072\u001b[0m frames_list \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 2074\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m keep_suspended:\n\u001b[1;32m 2075\u001b[0m \u001b[38;5;66;03m# This means that we should pause again after a set next statement.\u001b[39;00m\n", - "File \u001b[0;32m~/miniconda3/envs/openbb/lib/python3.11/site-packages/debugpy/_vendored/pydevd/pydevd.py:2106\u001b[0m, in \u001b[0;36mPyDB._do_wait_suspend\u001b[0;34m(self, thread, frame, event, arg, suspend_type, from_this_thread, frames_tracker)\u001b[0m\n\u001b[1;32m 2103\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_call_input_hook()\n\u001b[1;32m 2105\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mprocess_internal_commands()\n\u001b[0;32m-> 2106\u001b[0m time\u001b[38;5;241m.\u001b[39msleep(\u001b[38;5;241m0.01\u001b[39m)\n\u001b[1;32m 2108\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcancel_async_evaluation(get_current_thread_id(thread), \u001b[38;5;28mstr\u001b[39m(\u001b[38;5;28mid\u001b[39m(frame)))\n\u001b[1;32m 2110\u001b[0m \u001b[38;5;66;03m# process any stepping instructions\u001b[39;00m\n", - "\u001b[0;31mKeyboardInterrupt\u001b[0m: " - ] - } - ], - "source": [ - "stats.print_stats()\n", - "print(stream.getvalue())" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Index(['Expiration', 'DTE', 'Strike', 'C', 'P', 'Spot', 'q', 'r',\n", - " 'relative_moneyness', 'moneyness_spread', 'dte_spread', 'ticker',\n", - " 'moneyness', 'TGT_DTE', 'right', 'option_id'],\n", - " dtype='object', name='Right')" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "candi['long'][0].columns" - ] - }, - { - "cell_type": "code", - "execution_count": 270, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
OpenHighLowCloseVolumeBid_sizeCloseBidAsk_sizeCloseAskMidpointWeighted_midpoint
Datetime
2023-01-0313.5013.5013.0013.00222313.5511014.0513.80013.715165
2023-01-0313.5013.5013.0013.00222313.5511014.0513.80013.715165
2023-01-0414.0015.5014.0015.2087615.3512915.8515.60015.664634
2023-01-0414.0015.5014.0015.2087615.3512915.8515.60015.664634
2023-01-0513.3013.3013.3013.30222613.3039114.5513.92514.092139
2023-01-0513.3013.3013.3013.30222613.3039114.5513.92514.092139
2023-01-0611.4711.4711.4711.47110014.8510615.1014.97514.978641
2023-01-0611.4711.4711.4711.47110014.8510615.1014.97514.978641
2023-01-0916.7518.3816.7518.38320217.3033818.0517.67517.769444
2023-01-0916.7518.3816.7518.38320217.3033818.0517.67517.769444
2023-01-100.000.000.000.00018716.702517.1016.90016.747170
2023-01-100.000.000.000.00018716.702517.1016.90016.747170
2023-01-1118.5018.5018.1018.10412018.3028318.7018.50018.580893
2023-01-1118.5018.5018.1018.10412018.3028318.7018.50018.580893
2023-01-1217.8217.8217.8217.82112317.9524018.3018.12518.181405
2023-01-1217.8217.8217.8217.82112317.9524018.3018.12518.181405
2023-01-1316.6516.6616.6516.66213517.0513517.4017.22517.225000
2023-01-1316.6516.6616.6516.66213517.0513517.4017.22517.225000
2023-01-1720.5421.4519.6021.452327521.0014521.6021.30021.207143
2023-01-1720.5421.4519.6021.452327521.0014521.6021.30021.207143
2023-01-1823.5023.5019.4020.00548419.6019520.1519.87519.984409
2023-01-1823.5023.5019.4020.00548419.6019520.1519.87519.984409
2023-01-1919.6019.6019.2519.25256618.8010219.2019.00019.042857
2023-01-1919.6019.6019.2519.25256618.8010219.2019.00019.042857
2023-01-2020.1721.0120.1720.98439220.9012821.5021.20021.047692
2023-01-2020.1721.0120.1720.98439220.9012821.5021.20021.047692
2023-01-2323.7526.1523.7526.1512925725.7019726.1525.92525.895264
2023-01-2323.7526.1523.7526.1512925725.7019726.1525.92525.895264
2023-01-2424.8525.7524.8525.45546925.209225.8525.52525.306595
2023-01-2424.8525.7524.8525.45546925.209225.8525.52525.306595
2023-01-2523.2225.9723.2225.8320226924.6018025.3524.97524.900668
2023-01-2523.2225.9723.2225.8320226924.6018025.3524.97524.900668
2023-01-2631.8833.6330.3031.33856432.0512032.6532.35032.441304
2023-01-2631.8833.6330.3031.33856432.0512032.6532.35032.441304
2023-01-2734.3547.4234.3547.4016751145.4535246.9546.20046.061819
2023-01-2734.3547.4234.3547.4016751145.4535246.9546.20046.061819
2023-01-3045.5045.5038.8339.031394137.506638.9038.20038.363551
2023-01-3045.5045.5038.8339.031394137.506638.9038.20038.363551
2023-01-3139.4142.5039.0042.50231741.301542.5541.92541.885937
2023-01-3139.4142.5039.0042.50231741.301542.5541.92541.885937
2023-02-0143.0048.0040.6246.9654146.5518547.8547.20047.843011
2023-02-0143.0048.0040.6246.9654146.5518547.8547.20047.843011
2023-02-0251.7656.3351.7652.8342151.252552.8552.05052.788462
2023-02-0251.7656.3351.7652.8342151.252552.8552.05052.788462
2023-02-0361.2461.2455.3055.30271053.702555.3554.52554.878571
2023-02-0361.2461.2455.3055.30271053.702555.3554.52554.878571
2023-02-0659.1059.5058.7058.7074758.0520759.1558.60058.946457
2023-02-0659.1059.5058.7058.7074758.0520759.1558.60058.946457
2023-02-0757.3359.1056.0056.0065659.002860.0059.50059.333333
2023-02-0757.3359.1056.0056.0065659.002860.0059.50059.333333
2023-02-0863.2364.8062.7563.10334662.806863.9063.35063.456140
2023-02-0863.2364.8062.7563.10334662.806863.9063.35063.456140
2023-02-0968.0072.9667.9867.98101368.101168.8068.45068.420833
2023-02-0968.0072.9667.9867.98101368.101168.8068.45068.420833
2023-02-1065.2065.2060.1060.10142759.6519660.4560.05060.353139
2023-02-1065.2065.2060.1060.10142759.6519660.4560.05060.353139
2023-02-1358.0058.0057.6057.6049557.2554458.6057.92558.399296
2023-02-1358.0058.0057.6057.6049557.2554458.6057.92558.399296
2023-02-1454.1468.9554.1468.45142168.5556870.1569.35070.092954
2023-02-1454.1468.9554.1468.45142168.5556870.1569.35070.092954
2023-02-1571.7272.3571.7272.35165172.603873.8573.22573.133708
2023-02-1571.7272.3571.7272.35165172.603873.8573.22573.133708
2023-02-1671.0071.0067.7267.724560.4520164.9562.70064.840777
2023-02-1671.0071.0067.7267.724560.4520164.9562.70064.840777
2023-02-1765.0065.0063.0063.80204868.104969.8068.95068.958763
2023-02-1765.0065.0063.0063.80204868.104969.8068.95068.958763
2023-02-2167.2067.2063.6563.65243559.851661.0560.45059.892572
2023-02-2167.2067.2063.6563.65243559.851661.0560.45059.892572
2023-02-2259.2561.1559.2061.15862061.7530263.2062.47563.109938
2023-02-2259.2561.1559.2061.15862061.7530263.2062.47563.109938
2023-02-230.000.000.000.0006662.8024463.6563.22563.469032
2023-02-230.000.000.000.0006662.8024463.6563.22563.469032
2023-02-2458.8058.8058.8058.80217358.7014259.5059.10059.060635
2023-02-2458.8058.8058.8058.80217358.7014259.5059.10059.060635
2023-02-2764.5767.5364.5767.5385966.6040567.6067.10067.472845
2023-02-2764.5767.5364.5767.5385966.6040567.6067.10067.472845
2023-02-2867.7567.7565.0065.7765564.201165.3564.77564.391667
2023-02-2867.7567.7565.0065.7765564.201165.3564.77564.391667
2023-03-0165.0065.0060.6262.151651661.5555862.7562.15062.173464
2023-03-0165.0065.0060.6262.151651661.5555862.7562.15062.173464
2023-03-0252.0552.3051.5952.30125752.704253.2552.97552.933333
2023-03-0252.0552.3051.5952.30125752.704253.2552.97552.933333
2023-03-0354.7059.1554.7058.20320257.2026058.1557.67557.734632
2023-03-0354.7059.1554.7058.20320257.2026058.1557.67557.734632
2023-03-0655.8455.8455.2155.211425953.9514954.8054.37554.260417
2023-03-0655.8455.8455.2155.211425953.9514954.8054.37554.260417
2023-03-0750.9551.5550.9551.5588849.757250.5050.12550.087500
2023-03-0750.9551.5550.9551.5588849.757250.5050.12550.087500
2023-03-0845.7746.9545.0045.001820145.7017546.3046.00045.979255
2023-03-0845.7746.9545.0045.001820145.7017546.3046.00045.979255
2023-03-0946.6547.6039.9340.171197639.85140.2040.02539.854545
2023-03-0946.6547.6039.9340.171197639.85140.2040.02539.854545
2023-03-1041.5242.3040.7540.751010440.4023041.0040.70040.813174
2023-03-1041.5242.3040.7540.751010440.4023041.0040.70040.813174
2023-03-1337.0042.1135.5041.406710440.554241.3040.92540.765753
2023-03-1337.0042.1135.5041.406710440.554241.3040.92540.765753
2023-03-1444.9046.2044.0046.1048446.255646.9046.57546.856667
2023-03-1444.9046.2044.0046.1048446.255646.9046.57546.856667
2023-03-1544.5045.5342.5443.90198044.205945.0544.62544.560791
2023-03-1544.5045.5342.5443.90198044.205945.0544.62544.560791
2023-03-1644.0546.9844.0546.751612546.406447.0546.72546.620106
2023-03-1644.0546.9844.0546.751612546.406447.0546.72546.620106
2023-03-1746.7046.7043.6344.2010014143.9520944.6044.27544.338143
2023-03-1746.7046.7043.6344.2010014143.9520944.6044.27544.338143
2023-03-2042.1147.9042.1145.402017445.504046.1045.80045.612150
2023-03-2042.1147.9042.1145.402017445.504046.1045.80045.612150
2023-03-2151.2556.6951.1056.284574154.953856.5055.72555.025610
2023-03-2151.2556.6951.1056.284574154.953856.5055.72555.025610
2023-03-2256.8056.8053.0053.0036951.303751.8551.57551.491981
2023-03-2256.8056.8053.0053.0036951.303751.8551.57551.491981
2023-03-2356.0056.0052.3052.30107652.402953.0052.70052.565714
2023-03-2356.0056.0052.3052.30107652.402953.0052.70052.565714
2023-03-2451.2451.2550.4050.4047651.203151.6551.42551.330374
2023-03-2451.2451.2550.4050.4047651.203151.6551.42551.330374
2023-03-2754.0554.0552.2352.23235552.006352.4552.22552.240254
2023-03-2754.0554.0552.2352.23235552.006352.4552.22552.240254
2023-03-2850.1550.1549.0349.03713450.1016750.5550.32550.349668
2023-03-2850.1550.1549.0349.03713450.1016750.5550.32550.349668
2023-03-2952.4352.8552.4352.85215152.80753.2553.02552.819937
2023-03-2952.4352.8552.4352.85215152.80753.2553.02552.819937
2023-03-3055.0055.0554.1054.10413353.6038954.1553.87554.009866
2023-03-3055.0055.0554.1054.10413353.6038954.1553.87554.009866
2023-03-3156.7862.5456.7862.171923162.159262.9062.52562.363622
2023-03-3156.7862.5456.7862.171923162.159262.9062.52562.363622
2023-04-0357.0057.0051.9051.901143852.6019453.4053.00052.845570
2023-04-0357.0057.0051.9051.901143852.6019453.4053.00052.845570
2023-04-0451.7051.7050.8550.85237551.0512851.8051.42551.240855
2023-04-0451.7051.7050.8550.85237551.0512851.8051.42551.240855
2023-04-0549.4049.4045.7547.501725846.1515546.9546.55046.450242
2023-04-0549.4049.4045.7547.501725846.1515546.9546.55046.450242
2023-04-0644.2546.5543.0046.002616545.5515546.1545.85045.840625
2023-04-0644.2546.5543.0046.002616545.5515546.1545.85045.840625
2023-04-1043.3545.7041.0045.35428145.1012345.8545.47545.552206
2023-04-1043.3545.7041.0045.35428145.1012345.8545.47545.552206
2023-04-1147.5048.8546.6547.801026546.7516547.4547.10047.018605
2023-04-1147.5048.8546.6547.801026546.7516547.4547.10047.018605
2023-04-1243.5143.5143.1143.1175742.4514043.1042.77542.911929
2023-04-1243.5143.5143.1143.1175742.4514043.1042.77542.911929
2023-04-1345.4546.0945.4546.09418045.5516246.1045.82545.810526
2023-04-1345.4546.0945.4546.09418045.5516246.1045.82545.810526
2023-04-1445.1045.1043.5344.612533744.4523545.1544.80044.737587
2023-04-1445.1045.1043.5344.612533744.4523545.1544.80044.737587
2023-04-1747.5047.5043.5044.703319045.1023545.9045.50045.542353
2023-04-1747.5047.5043.5044.703319045.1023545.9045.50045.542353
2023-04-1844.8845.6043.3043.302211342.8522343.5043.17543.281399
2023-04-1844.8845.6043.3043.302211342.8522343.5043.17543.281399
2023-04-1940.7541.5040.0040.502422339.459740.1539.80039.662188
2023-04-1940.7541.5040.0040.502422339.459740.1539.80039.662188
2023-04-2030.8031.8628.1528.886829828.552629.2028.87528.602160
2023-04-2030.8031.8628.1528.886829828.552629.2028.87528.602160
2023-04-2130.0030.0028.2829.372514329.0030229.6029.30029.407191
2023-04-2130.0030.0028.2829.372514329.0030229.6029.30029.407191
2023-04-2428.0028.0026.0526.7015121027.1530527.9027.52527.594175
2023-04-2428.0028.0026.0526.7015121027.1530527.9027.52527.594175
2023-04-2526.7527.7926.7527.579316026.3023027.1526.72526.801282
2023-04-2526.7527.7926.7527.579316026.3023027.1526.72526.801282
2023-04-2626.0026.0023.2024.10180120.6527823.8522.25023.838530
2023-04-2626.0026.0023.2024.10180120.6527823.8522.25023.838530
2023-04-2723.6525.7023.6525.701124226.1027626.8026.45026.472973
2023-04-2723.6525.7023.6525.701124226.1027626.8026.45026.472973
2023-04-2826.4028.4025.3528.371330827.8528828.6528.25028.236577
2023-04-2826.4028.4025.3528.371330827.8528828.6528.25028.236577
2023-05-0127.4527.4525.9026.45170020326.4516327.1026.77526.739481
2023-05-0127.4527.4525.9026.45170020326.4516327.1026.77526.739481
2023-05-0228.3528.3526.6026.604517225.9041026.6526.27526.428351
2023-05-0228.3528.3526.6026.604517225.9041026.6526.27526.428351
2023-05-0327.9927.9926.4726.477726.0020726.8026.40026.773832
2023-05-0327.9927.9926.4726.477726.0020726.8026.40026.773832
2023-05-0426.5526.8026.5526.80313026.4533127.0026.72526.844902
2023-05-0426.5526.8026.5526.80313026.4533127.0026.72526.844902
2023-05-0528.6531.7628.6531.20777631.2523331.8031.52531.664725
2023-05-0528.6531.7628.6531.20777631.2523331.8031.52531.664725
2023-05-0832.8632.8632.8232.82221632.3532433.1032.72532.800000
2023-05-0832.8632.8632.8232.82221632.3532433.1032.72532.800000
2023-05-0931.3531.3530.0830.102023830.7029331.4031.05031.086252
2023-05-0931.3531.3530.0830.102023830.7029331.4031.05031.086252
2023-05-1033.3633.8030.6030.622722130.2031130.9030.55030.609211
2023-05-1033.3633.8030.6030.622722130.2031130.9030.55030.609211
2023-05-1129.7031.3029.7030.821828131.9522532.9532.45032.394664
2023-05-1129.7031.3029.7030.821828131.9522532.9532.45032.394664
2023-05-1235.0035.9730.1630.9017410330.0021131.0030.50030.671975
2023-05-1235.0035.9730.1630.9017410330.0021131.0030.50030.671975
2023-05-1531.2131.2128.9528.952743628.8033529.5529.17529.125875
2023-05-1531.2131.2128.9528.952743628.8033529.5529.17529.125875
2023-05-1629.0030.8527.9730.852414728.8539129.5529.20029.358736
2023-05-1629.0030.8527.9730.852414728.8539129.5529.20029.358736
2023-05-1732.2033.2532.2033.16765032.6524433.2532.95033.147959
2023-05-1732.2033.2532.2033.16765032.6524433.2532.95033.147959
2023-05-1831.9533.7031.9533.7083433.705535.2034.45034.626966
2023-05-1831.9533.7031.9533.7083433.705535.2034.45034.626966
2023-05-1935.0037.9034.7236.5016218136.4019337.0036.70036.709626
2023-05-1935.0037.9034.7236.5016218136.4019337.0036.70036.709626
2023-05-2238.0042.7038.0042.70488842.7011343.3543.02543.065423
2023-05-2238.0042.7038.0042.70488842.7011343.3543.02543.065423
2023-05-2341.1245.8541.1242.753916440.7023141.6041.15041.226329
2023-05-2341.1245.8541.1242.753916440.7023141.6041.15041.226329
2023-05-2438.0039.8037.6539.801812538.9025939.7039.30039.439583
2023-05-2438.0039.8037.6539.801812538.9025939.7039.30039.439583
2023-05-2539.1040.6538.2540.651910439.7022740.3040.00040.111480
2023-05-2539.1040.6538.2540.651910439.7022740.3040.00040.111480
2023-05-2641.6048.1041.6046.35422145.8017946.4046.10046.337000
2023-05-2641.6048.1041.6046.35422145.8017946.4046.10046.337000
2023-05-3054.6554.6549.5549.551525251.4024653.0052.20052.190361
2023-05-3054.6554.6549.5549.551525251.4024653.0052.20052.190361
2023-05-3153.0553.0548.3051.002316853.3019554.8054.05054.105785
2023-05-3153.0553.0548.3051.002316853.3019554.8054.05054.105785
2023-06-0152.6057.8052.6057.804128955.7516156.8056.27556.125667
2023-06-0152.6057.8052.6057.804128955.7516156.8056.27556.125667
2023-06-0261.0563.5061.0061.452217860.8018761.7561.27561.286712
2023-06-0261.0563.5061.0061.452217860.8018761.7561.27561.286712
2023-06-0565.8566.3564.3464.341239763.6514664.4064.02564.100617
2023-06-0565.8566.3564.3464.341239763.6514664.4064.02564.100617
2023-06-0665.0065.6564.9564.9511313366.3027567.1066.70066.839216
2023-06-0665.0065.6564.9564.9511313366.3027567.1066.70066.839216
2023-06-0771.9072.6568.7769.752130367.8041869.5068.65068.785576
2023-06-0771.9072.6568.7769.752130367.8041869.5068.65068.785576
2023-06-0870.2076.2570.2075.992714277.2518977.9077.57577.621148
2023-06-0870.2076.2570.2075.992714277.2518977.9077.57577.621148
2023-06-0989.7092.3585.7186.062215785.0012986.1585.57585.518706
2023-06-1287.9089.1086.8088.004726589.2039990.7089.95090.101355
2023-06-1287.9089.1086.8088.004726589.2039990.7089.95090.101355
2023-06-1393.9097.7293.4497.725225997.0536798.5097.77597.900080
2023-06-1393.9097.7293.4497.725225997.0536798.5097.77597.900080
2023-06-1496.6096.6092.6092.601117995.7522596.7596.25096.306931
2023-06-1496.6096.6092.6092.601117995.7522596.7596.25096.306931
2023-06-1595.6995.6995.6995.69310795.2513996.4595.85095.928049
2023-06-1595.6995.6995.6995.69310795.2513996.4595.85095.928049
2023-06-1699.80101.5297.7098.50137599.50108100.4099.950100.031148
2023-06-1699.80101.5297.7098.50137599.50108100.4099.950100.031148
2023-06-20105.00112.60105.00112.6027137112.00107112.95112.475112.416598
2023-06-20105.00112.60105.00112.6027137112.00107112.95112.475112.416598
2023-06-21106.60106.6098.1098.10166515898.1521999.2598.70098.788992
2023-06-21106.60106.6098.1098.10166515898.1521999.2598.70098.788992
2023-06-2295.0095.0095.0095.001175102.55205103.70103.125103.170395
2023-06-2295.0095.0095.0095.001175102.55205103.70103.125103.170395
2023-06-2392.8595.7992.8595.71515694.958395.7095.32595.210460
2023-06-2392.8595.7992.8595.71515694.958395.7095.32595.210460
2023-06-2694.7594.7587.0087.00620181.2030982.3581.77581.896765
2023-06-2694.7594.7587.0087.00620181.2030982.3581.77581.896765
2023-06-2786.2788.2582.6088.251613788.3516689.4088.87588.925248
2023-06-2786.2788.2582.6088.251613788.3516689.4088.87588.925248
2023-06-2892.8593.6592.8593.103221693.5534594.9094.22594.380214
2023-06-2892.8593.6592.8593.103221693.5534594.9094.22594.380214
2023-06-290.000.000.000.00013294.905395.5095.20095.071892
2023-06-290.000.000.000.00013294.905395.5095.20095.071892
2023-06-3099.6099.6099.6099.6018098.4516399.7099.07599.288477
2023-06-3099.6099.6099.6099.6018098.4516399.7099.07599.288477
2023-07-03118.05118.05114.15114.252676114.80110116.20115.500115.627957
2023-07-03118.05118.05114.15114.252676114.80110116.20115.500115.627957
2023-07-05114.27115.25114.25115.255143117.05311118.25117.650117.872026
2023-07-05114.27115.25114.25115.255143117.05311118.25117.650117.872026
2023-07-06112.50112.50112.50112.501154111.70276112.60112.150112.277674
2023-07-06112.50112.50112.50112.501154111.70276112.60112.150112.277674
2023-07-07112.41112.41112.41112.411132109.25275110.40109.825110.027027
2023-07-07112.41112.41112.41112.411132109.25275110.40109.825110.027027
2023-07-10107.98107.98104.43104.439228104.20244105.45104.825104.846186
2023-07-10107.98107.98104.43104.439228104.20244105.45104.825104.846186
2023-07-110.000.000.000.000175104.35282105.50104.925105.059628
2023-07-110.000.000.000.000175104.35282105.50104.925105.059628
2023-07-12110.87110.87107.54107.548112106.20232106.95106.575106.705814
2023-07-12110.87110.87107.54107.548112106.20232106.95106.575106.705814
2023-07-130.000.000.000.000111111.50155112.50112.000112.082707
2023-07-130.000.000.000.000111111.50155112.50112.000112.082707
2023-07-14111.00114.42111.00114.42446114.6045115.50115.050115.045055
2023-07-14111.00114.42111.00114.42446114.6045115.50115.050115.045055
2023-07-17118.20118.20118.20118.20350123.2549124.20123.725123.720202
2023-07-17118.20118.20118.20118.20350123.2549124.20123.725123.720202
2023-07-18121.25126.28121.25126.2841124.7515128.20126.475127.984375
2023-07-18121.25126.28121.25126.2841124.7515128.20126.475127.984375
2023-07-190.000.000.000.0007123.3525127.05125.200126.240625
2023-07-190.000.000.000.0007123.3525127.05125.200126.240625
2023-07-20106.07106.0797.9597.95162297.4013498.2097.80098.087179
2023-07-20106.07106.0797.9597.95162297.4013498.2097.80098.087179
2023-07-2195.0096.9795.0096.9725294.604195.3594.97594.930645
2023-07-2195.0096.9795.0096.9725294.604195.3594.97594.930645
2023-07-2491.98102.7591.20102.755161102.50181103.35102.925102.949854
2023-07-2491.98102.7591.20102.755161102.50181103.35102.925102.949854
2023-07-25104.75104.75104.75104.75811098.60180100.7599.67599.934483
2023-07-25104.75104.75104.75104.75811098.60180100.7599.67599.934483
2023-07-260.000.000.000.00017497.058499.1598.10097.733721
2023-07-260.000.000.000.00017497.058499.1598.10097.733721
2023-07-2790.9090.9090.9090.90120089.9533691.7090.82591.047015
2023-07-2790.9090.9090.9090.90120089.9533691.7090.82591.047015
2023-07-2899.6399.6399.6399.63141998.20330100.7599.47599.323498
2023-07-2899.6399.6399.6399.63141998.20330100.7599.47599.323498
2023-07-31100.00101.0599.70101.05336499.30140101.05100.17599.786111
2023-07-31100.00101.0599.70101.05336499.30140101.05100.17599.786111
2023-08-010.000.000.000.00040094.2551296.3095.27595.400877
2023-08-010.000.000.000.00040094.2551296.3095.27595.400877
2023-08-0289.8489.8489.6289.62257988.0554890.4089.22589.192680
2023-08-0289.8489.8489.6289.62257988.0554890.4089.22589.192680
2023-08-030.000.000.000.00011492.7015895.4094.05094.268382
2023-08-030.000.000.000.00011492.7015895.4094.05094.268382
2023-08-0490.0690.0690.0490.04227687.2024889.9088.55088.477863
2023-08-0490.0690.0690.0490.04227687.2024889.9088.55088.477863
2023-08-0781.8581.9081.3181.31735984.7036787.2085.95085.963774
2023-08-0781.8581.9081.3181.31735984.7036787.2085.95085.963774
2023-08-0883.7783.7783.7783.77111684.1524985.5084.82585.070959
2023-08-0883.7783.7783.7783.77111684.1524985.5084.82585.070959
2023-08-0982.5082.5079.6280.293828177.3538079.4578.40078.557262
2023-08-0982.5082.5079.6280.293828177.3538079.4578.40078.557262
2023-08-1081.1383.2680.3080.33820080.2034081.8581.02581.238889
2023-08-1081.1383.2680.3080.33820080.2034081.8581.02581.238889
2023-08-110.000.000.000.00035877.5038079.4078.45078.478320
2023-08-110.000.000.000.00035877.5038079.4078.45078.478320
2023-08-1472.9574.0472.9573.95449274.2033176.1075.15074.964156
2023-08-1472.9574.0472.9573.95449274.2033176.1075.15074.964156
2023-08-150.000.000.000.00028968.8530371.2570.05070.078378
2023-08-150.000.000.000.00028968.8530371.2570.05070.078378
2023-08-1666.1566.1565.2065.20516163.2526664.6563.95064.122131
2023-08-1666.1566.1565.2065.20516163.2526664.6563.95064.122131
2023-08-1761.1762.0058.3558.351127757.6534059.7058.67558.779660
2023-08-1761.1762.0058.3558.351127757.6534059.7058.67558.779660
2023-08-1855.0055.0055.0055.00111754.8513656.5055.67555.736957
2023-08-1855.0055.0055.0055.00111754.8513656.5055.67555.736957
2023-08-2162.9067.8762.9067.872841068.0045968.7568.37568.396145
2023-08-2162.9067.8762.9067.872841068.0045968.7568.37568.396145
2023-08-2276.0076.0072.1072.10538869.9535570.7070.32570.308345
2023-08-2276.0076.0072.1072.10538869.9535570.7070.32570.308345
2023-08-2373.5573.5573.5073.504035672.5543673.5073.02573.072980
2023-08-2373.5573.5573.5073.504035672.5543673.5073.02573.072980
2023-08-2470.4170.5767.4067.403130167.1556368.0567.60067.736458
2023-08-2470.4170.5767.4067.403130167.1556368.0567.60067.736458
2023-08-2571.2172.1468.7072.1023415274.0531475.3074.67574.892275
2023-08-2571.2172.1468.7072.1023415274.0531475.3074.67574.892275
2023-08-2874.1574.1574.1574.15113973.8515575.5574.70074.746259
2023-08-2874.1574.1574.1574.15113973.8515575.5574.70074.746259
2023-08-2987.6087.6087.6087.60126989.3523391.7590.55090.463944
2023-08-2987.6087.6087.6087.60126989.3523391.7590.55090.463944
2023-08-3087.3488.1187.2688.07624989.6519591.2590.45090.352703
2023-08-3087.3488.1187.2688.07624989.6519591.2590.45090.352703
2023-08-310.000.000.000.00037690.4030892.0591.22591.142982
2023-08-310.000.000.000.00037690.4030892.0591.22591.142982
2023-09-0180.2080.2079.1879.18425279.0540380.0079.52579.634504
2023-09-0180.2080.2079.1879.18425279.0540380.0079.52579.634504
2023-09-0589.2589.2589.2589.25446789.0552690.3589.70089.738620
2023-09-0589.2589.2589.2589.25446789.0552690.3589.70089.738620
2023-09-0685.6285.6782.3582.35536984.9543285.9585.45085.489326
2023-09-0685.6285.6782.3582.35536984.9543285.9585.45085.489326
2023-09-0780.0080.3080.0080.301040684.4537485.2584.85084.833590
2023-09-0780.0080.3080.0080.301040684.4537485.2584.85084.833590
2023-09-0881.9481.9481.9481.94343081.5040982.3581.92581.914362
2023-09-0881.9481.9481.9481.94343081.5040982.3581.92581.914362
2023-09-11103.57103.57103.57103.571260103.4550105.70104.575103.812903
2023-09-11103.57103.57103.57103.571260103.4550105.70104.575103.812903
2023-09-120.000.000.000.00044098.4047499.4098.90098.918600
2023-09-120.000.000.000.00044098.4047499.4098.90098.918600
2023-09-13102.65102.65102.65102.651399101.55273103.10102.325102.179688
2023-09-13102.65102.65102.65102.651399101.55273103.10102.325102.179688
2023-09-14103.60106.87103.60106.0713234105.95369107.15106.550106.684328
2023-09-14103.60106.87103.60106.0713234105.95369107.15106.550106.684328
2023-09-15105.76106.10105.20105.203205104.10318105.85104.975105.164054
2023-09-15105.76106.10105.20105.203205104.10318105.85104.975105.164054
2023-09-180.000.000.000.0005195.4510597.9596.70097.132692
2023-09-180.000.000.000.0005195.4510597.9596.70097.132692
2023-09-1997.5797.5797.5797.57125196.40597.8097.10096.427344
2023-09-1997.5797.5797.5797.57125196.40597.8097.10096.427344
2023-09-200.000.000.000.00037092.3044094.7593.52593.630864
2023-09-200.000.000.000.00037092.3044094.7593.52593.630864
2023-09-2188.8888.8888.8888.8829087.0015788.4087.70087.889879
2023-09-2188.8888.8888.8888.8829087.0015788.4087.70087.889879
2023-09-2285.8585.8585.8585.8517977.0510078.9578.00078.111453
2023-09-2285.8585.8585.8585.8517977.0510078.9578.00078.111453
2023-09-2577.7077.7076.8876.88220378.5512379.8079.17579.021626
2023-09-2577.7077.7076.8876.88220378.5512379.8079.17579.021626
2023-09-260.000.000.000.00034676.4541477.8077.12577.185395
2023-09-260.000.000.000.00034676.4541477.8077.12577.185395
2023-09-2777.0377.0371.0374.851610473.55275.6074.57573.588679
2023-09-2777.0377.0371.0374.851610473.55275.6074.57573.588679
2023-09-2874.8878.4374.0978.004910478.3016678.8578.57578.638148
2023-09-2874.8878.4374.0978.004910478.3016678.8578.57578.638148
2023-09-290.000.000.000.00022681.3022882.3581.82581.827313
2023-09-290.000.000.000.00022681.3022882.3581.82581.827313
2023-10-0278.9078.9078.9078.90130182.4535883.6083.02583.074734
2023-10-0278.9078.9078.9078.90130182.4535883.6083.02583.074734
2023-10-0381.4681.4681.4681.46219478.2017179.5078.85078.809041
2023-10-0381.4681.4681.4681.46219478.2017179.5078.85078.809041
2023-10-0483.7083.8583.5583.8545991.255492.7592.00091.966814
2023-10-0483.7083.8583.5583.8545991.255492.7592.00091.966814
2023-10-050.000.000.000.00025490.3529691.3090.82590.861273
2023-10-050.000.000.000.00025490.3529691.3090.82590.861273
2023-10-060.000.000.000.00020490.6525991.6591.15091.209395
2023-10-060.000.000.000.00020490.6525991.6591.15091.209395
2023-10-0989.0090.8589.0090.853119689.9016490.5090.20090.173333
2023-10-0989.0090.8589.0090.853119689.9016490.5090.20090.173333
2023-10-1095.0097.8595.0097.8522892.908593.9593.42593.689823
2023-10-1095.0097.8595.0097.8522892.908593.9593.42593.689823
2023-10-1192.8092.8092.2992.2925892.6522793.5093.07593.327018
2023-10-1192.8092.8092.2992.2925892.6522793.5093.07593.327018
2023-10-1290.0090.0090.0090.00517588.509589.1088.80088.711111
2023-10-1290.0090.0090.0090.00517588.509589.1088.80088.711111
2023-10-130.000.000.000.00030681.7030582.7082.20082.199182
2023-10-130.000.000.000.00030681.7030582.7082.20082.199182
2023-10-1682.6582.6582.6582.65117483.804684.3584.07583.915000
2023-10-1682.6582.6582.6582.65117483.804684.3584.07583.915000
2023-10-1780.0084.4080.0084.401116284.2515085.4084.82584.802885
2023-10-1780.0084.4080.0084.401116284.2515085.4084.82584.802885
2023-10-1881.3081.3074.1374.13109373.155374.3073.72573.567466
2023-10-1881.3081.3074.1374.13109373.155374.3073.72573.567466
2023-10-1961.9061.9052.6752.8510118254.4020255.0554.72554.741927
2023-10-1961.9061.9052.6752.8510118254.4020255.0554.72554.741927
2023-10-2050.4852.1248.0250.471708147.905748.6548.27548.209783
2023-10-2050.4852.1248.0250.471708147.905748.6548.27548.209783
2023-10-2343.5549.7042.9048.331225347.5019548.5048.00047.935268
2023-10-2343.5549.7042.9048.331225347.5019548.5048.00047.935268
2023-10-2453.2553.2551.7051.70419151.1025851.6551.37551.416036
2023-10-2453.2553.2551.7051.70419151.1025851.6551.37551.416036
2023-10-250.000.000.000.00026447.9520748.5048.22548.191720
2023-10-250.000.000.000.00026447.9520748.5048.22548.191720
2023-10-2647.1047.6643.5043.502516842.9010243.5543.22543.145556
2023-10-2647.1047.6643.5043.502516842.9010243.5543.22543.145556
2023-10-2745.8846.5743.5043.5010128444.2018244.7544.47544.414807
2023-10-2745.8846.5743.5043.5010128444.2018244.7544.47544.414807
2023-10-3040.0040.0036.0536.055823036.704137.1536.92536.768081
2023-10-3040.0040.0036.0536.055823036.704137.1536.92536.768081
2023-10-3135.1539.9035.1539.582322738.6518639.2038.92538.897700
2023-10-3135.1539.9035.1539.582322738.6518639.2038.92538.897700
2023-11-0140.6542.1539.0042.156519041.8013142.3542.07542.024455
2023-11-0140.6542.1539.0042.156519041.8013142.3542.07542.024455
2023-11-0250.7051.7050.0051.702126351.3522552.0051.67551.649693
2023-11-0250.7051.7050.0051.702126351.3522552.0051.67551.649693
2023-11-0353.9557.4551.8051.801532052.2030153.9553.07553.048229
2023-11-0353.9557.4551.8051.801532052.2030153.9553.07553.048229
2023-11-0656.6056.6049.0050.072723551.459652.1051.77551.638520
2023-11-0656.6056.6049.0050.072723551.459652.1051.77551.638520
2023-11-0752.9552.9550.3050.602210354.007754.4054.20054.171111
2023-11-0752.9552.9550.3050.602210354.007754.4054.20054.171111
2023-11-0851.0052.7551.0052.7510119953.6529754.1553.90053.949395
2023-11-0851.0052.7551.0052.7510119953.6529754.1553.90053.949395
2023-11-0950.5050.5042.7542.759923043.903744.3544.12543.962360
2023-11-0950.5050.5042.7542.759923043.903744.3544.12543.962360
2023-11-1043.6047.4243.6047.42344147.0515247.9547.50047.280691
2023-11-1043.6047.4243.6047.42344147.0515247.9547.50047.280691
2023-11-1347.4055.3347.4055.05238254.9012455.3055.10055.140777
2023-11-1347.4055.3347.4055.05238254.9012455.3055.10055.140777
2023-11-1460.7564.4060.7564.4045266.4014066.8566.62566.728125
2023-11-1460.7564.4060.7564.4045266.4014066.8566.62566.728125
2023-11-1566.0575.0066.0572.8068171.202371.7071.45071.310577
2023-11-1566.0575.0066.0572.8068171.202371.7071.45071.310577
2023-11-160.000.000.000.0008762.559863.4563.00063.026757
2023-11-160.000.000.000.0008762.559863.4563.00063.026757
2023-11-1763.6165.0563.2563.252921762.4522864.8063.62563.654045
2023-11-1763.6165.0563.2563.252921762.4522864.8063.62563.654045
2023-11-2062.2463.3262.2463.321515264.1015764.6564.37564.379450
2023-11-2062.2463.3262.2463.321515264.1015764.6564.37564.379450
2023-11-2169.7569.7569.7569.751020769.0021769.6069.30069.307075
2023-11-2169.7569.7569.7569.751020769.0021769.6069.30069.307075
2023-11-2262.1562.1561.5561.602718062.7019363.1062.90062.906971
2023-11-2262.1562.1561.5561.602718062.7019363.1062.90062.906971
2023-11-2464.4564.4564.4564.45118163.6520864.1063.87563.890617
2023-11-2464.4564.4564.4564.45118163.6520864.1063.87563.890617
2023-11-270.000.000.000.00025063.8526564.5064.17564.184466
2023-11-270.000.000.000.00025063.8526564.5064.17564.184466
2023-11-2870.0573.7569.4573.24715073.205374.2573.72573.740291
2023-11-2870.0573.7569.4573.24715073.205374.2573.72573.740291
2023-11-2975.7575.7572.9472.94589570.7513771.7071.22571.310991
2023-11-2975.7575.7572.9472.94589570.7513771.7071.22571.310991
2023-11-3070.6570.6566.7366.8564566.703667.8067.25067.188889
2023-11-3070.6570.6566.7366.8564566.703667.8067.25067.188889
2023-12-0165.9465.9464.9164.913914665.5512766.3565.95065.922161
2023-12-0165.9465.9464.9164.913914665.5512766.3565.95065.922161
2023-12-040.000.000.000.0009062.6514963.3062.97563.055230
2023-12-040.000.000.000.0009062.6514963.3062.97563.055230
2023-12-0569.0569.0569.0569.0552265.401466.0065.70065.633333
2023-12-0569.0569.0569.0569.0552265.401466.0065.70065.633333
2023-12-0670.9272.8070.9272.801317965.7024966.5566.12566.194509
2023-12-0670.9272.8070.9272.801317965.7024966.5566.12566.194509
2023-12-0767.1767.1767.1767.1713768.653669.4569.05069.044521
2023-12-0767.1767.1767.1767.1713768.653669.4569.05069.044521
2023-12-0869.8969.8969.8969.8967369.301670.3569.82569.488764
2023-12-0869.8969.8969.8969.8967369.301670.3569.82569.488764
2023-12-1166.3266.3266.3266.3213565.808566.2566.02566.118750
2023-12-1166.3266.3266.3266.3213565.808566.2566.02566.118750
2023-12-1262.2962.8661.5862.8677163.1510963.6063.37563.422500
2023-12-1262.2962.8661.5862.8677163.1510963.6063.37563.422500
2023-12-1356.9558.0056.9558.001516264.702065.8065.25064.820879
2023-12-1356.9558.0056.9558.001516264.702065.8065.25064.820879
2023-12-1470.8577.5370.8576.17121676.051976.5576.30076.321429
2023-12-1470.8577.5370.8576.17121676.051976.5576.30076.321429
2023-12-1576.8877.3076.8877.04133077.752678.8078.27578.237500
2023-12-1576.8877.3076.8877.04133077.752678.8078.27578.237500
2023-12-1878.4082.0378.4082.0342576.652977.2576.95076.972222
2023-12-1878.4082.0378.4082.0342576.652977.2576.95076.972222
2023-12-1981.0581.0581.0581.0512181.452982.0081.72581.769000
2023-12-1981.0581.0581.0581.0512181.452982.0081.72581.769000
2023-12-2080.9080.9080.9080.9013772.051672.7572.40072.261321
2023-12-2080.9080.9080.9080.9013772.051672.7572.40072.261321
2023-12-210.000.000.000.0002578.703079.6079.15079.190909
2023-12-210.000.000.000.0002578.703079.6079.15079.190909
2023-12-2282.2182.2177.1677.301753177.004077.4577.22577.253521
2023-12-2282.2182.2177.1677.301753177.004077.4577.22577.253521
2023-12-2680.9880.9880.9880.9843280.552781.1580.85080.824576
2023-12-2680.9880.9880.9880.9843280.552781.1580.85080.824576
2023-12-2785.8685.9085.2085.20193885.001785.7585.37585.231818
2023-12-2785.8685.9085.2085.20193885.001785.7585.37585.231818
2023-12-2882.9082.9082.9082.9015876.501177.7077.10076.691304
2023-12-2882.9082.9082.9082.9015876.501177.7077.10076.691304
2023-12-2976.6077.4073.0074.80223072.40573.2572.82572.521429
2023-12-2976.6077.4073.0074.80223072.40573.2572.82572.521429
\n", - "
" - ], - "text/plain": [ - " Open High Low Close Volume Bid_size CloseBid \\\n", - "Datetime \n", - "2023-01-03 13.50 13.50 13.00 13.00 2 223 13.55 \n", - "2023-01-03 13.50 13.50 13.00 13.00 2 223 13.55 \n", - "2023-01-04 14.00 15.50 14.00 15.20 8 76 15.35 \n", - "2023-01-04 14.00 15.50 14.00 15.20 8 76 15.35 \n", - "2023-01-05 13.30 13.30 13.30 13.30 2 226 13.30 \n", - "2023-01-05 13.30 13.30 13.30 13.30 2 226 13.30 \n", - "2023-01-06 11.47 11.47 11.47 11.47 1 100 14.85 \n", - "2023-01-06 11.47 11.47 11.47 11.47 1 100 14.85 \n", - "2023-01-09 16.75 18.38 16.75 18.38 3 202 17.30 \n", - "2023-01-09 16.75 18.38 16.75 18.38 3 202 17.30 \n", - "2023-01-10 0.00 0.00 0.00 0.00 0 187 16.70 \n", - "2023-01-10 0.00 0.00 0.00 0.00 0 187 16.70 \n", - "2023-01-11 18.50 18.50 18.10 18.10 4 120 18.30 \n", - "2023-01-11 18.50 18.50 18.10 18.10 4 120 18.30 \n", - "2023-01-12 17.82 17.82 17.82 17.82 1 123 17.95 \n", - "2023-01-12 17.82 17.82 17.82 17.82 1 123 17.95 \n", - "2023-01-13 16.65 16.66 16.65 16.66 2 135 17.05 \n", - "2023-01-13 16.65 16.66 16.65 16.66 2 135 17.05 \n", - "2023-01-17 20.54 21.45 19.60 21.45 23 275 21.00 \n", - "2023-01-17 20.54 21.45 19.60 21.45 23 275 21.00 \n", - "2023-01-18 23.50 23.50 19.40 20.00 54 84 19.60 \n", - "2023-01-18 23.50 23.50 19.40 20.00 54 84 19.60 \n", - "2023-01-19 19.60 19.60 19.25 19.25 25 66 18.80 \n", - "2023-01-19 19.60 19.60 19.25 19.25 25 66 18.80 \n", - "2023-01-20 20.17 21.01 20.17 20.98 4 392 20.90 \n", - "2023-01-20 20.17 21.01 20.17 20.98 4 392 20.90 \n", - "2023-01-23 23.75 26.15 23.75 26.15 129 257 25.70 \n", - "2023-01-23 23.75 26.15 23.75 26.15 129 257 25.70 \n", - "2023-01-24 24.85 25.75 24.85 25.45 5 469 25.20 \n", - "2023-01-24 24.85 25.75 24.85 25.45 5 469 25.20 \n", - "2023-01-25 23.22 25.97 23.22 25.83 202 269 24.60 \n", - "2023-01-25 23.22 25.97 23.22 25.83 202 269 24.60 \n", - "2023-01-26 31.88 33.63 30.30 31.33 85 64 32.05 \n", - "2023-01-26 31.88 33.63 30.30 31.33 85 64 32.05 \n", - "2023-01-27 34.35 47.42 34.35 47.40 167 511 45.45 \n", - "2023-01-27 34.35 47.42 34.35 47.40 167 511 45.45 \n", - "2023-01-30 45.50 45.50 38.83 39.03 139 41 37.50 \n", - "2023-01-30 45.50 45.50 38.83 39.03 139 41 37.50 \n", - "2023-01-31 39.41 42.50 39.00 42.50 23 17 41.30 \n", - "2023-01-31 39.41 42.50 39.00 42.50 23 17 41.30 \n", - "2023-02-01 43.00 48.00 40.62 46.96 54 1 46.55 \n", - "2023-02-01 43.00 48.00 40.62 46.96 54 1 46.55 \n", - "2023-02-02 51.76 56.33 51.76 52.83 42 1 51.25 \n", - "2023-02-02 51.76 56.33 51.76 52.83 42 1 51.25 \n", - "2023-02-03 61.24 61.24 55.30 55.30 27 10 53.70 \n", - "2023-02-03 61.24 61.24 55.30 55.30 27 10 53.70 \n", - "2023-02-06 59.10 59.50 58.70 58.70 7 47 58.05 \n", - "2023-02-06 59.10 59.50 58.70 58.70 7 47 58.05 \n", - "2023-02-07 57.33 59.10 56.00 56.00 6 56 59.00 \n", - "2023-02-07 57.33 59.10 56.00 56.00 6 56 59.00 \n", - "2023-02-08 63.23 64.80 62.75 63.10 33 46 62.80 \n", - "2023-02-08 63.23 64.80 62.75 63.10 33 46 62.80 \n", - "2023-02-09 68.00 72.96 67.98 67.98 10 13 68.10 \n", - "2023-02-09 68.00 72.96 67.98 67.98 10 13 68.10 \n", - "2023-02-10 65.20 65.20 60.10 60.10 14 27 59.65 \n", - "2023-02-10 65.20 65.20 60.10 60.10 14 27 59.65 \n", - "2023-02-13 58.00 58.00 57.60 57.60 4 95 57.25 \n", - "2023-02-13 58.00 58.00 57.60 57.60 4 95 57.25 \n", - "2023-02-14 54.14 68.95 54.14 68.45 14 21 68.55 \n", - "2023-02-14 54.14 68.95 54.14 68.45 14 21 68.55 \n", - "2023-02-15 71.72 72.35 71.72 72.35 16 51 72.60 \n", - "2023-02-15 71.72 72.35 71.72 72.35 16 51 72.60 \n", - "2023-02-16 71.00 71.00 67.72 67.72 4 5 60.45 \n", - "2023-02-16 71.00 71.00 67.72 67.72 4 5 60.45 \n", - "2023-02-17 65.00 65.00 63.00 63.80 20 48 68.10 \n", - "2023-02-17 65.00 65.00 63.00 63.80 20 48 68.10 \n", - "2023-02-21 67.20 67.20 63.65 63.65 2 435 59.85 \n", - "2023-02-21 67.20 67.20 63.65 63.65 2 435 59.85 \n", - "2023-02-22 59.25 61.15 59.20 61.15 86 20 61.75 \n", - "2023-02-22 59.25 61.15 59.20 61.15 86 20 61.75 \n", - "2023-02-23 0.00 0.00 0.00 0.00 0 66 62.80 \n", - "2023-02-23 0.00 0.00 0.00 0.00 0 66 62.80 \n", - "2023-02-24 58.80 58.80 58.80 58.80 2 173 58.70 \n", - "2023-02-24 58.80 58.80 58.80 58.80 2 173 58.70 \n", - "2023-02-27 64.57 67.53 64.57 67.53 8 59 66.60 \n", - "2023-02-27 64.57 67.53 64.57 67.53 8 59 66.60 \n", - "2023-02-28 67.75 67.75 65.00 65.77 6 55 64.20 \n", - "2023-02-28 67.75 67.75 65.00 65.77 6 55 64.20 \n", - "2023-03-01 65.00 65.00 60.62 62.15 16 516 61.55 \n", - "2023-03-01 65.00 65.00 60.62 62.15 16 516 61.55 \n", - "2023-03-02 52.05 52.30 51.59 52.30 12 57 52.70 \n", - "2023-03-02 52.05 52.30 51.59 52.30 12 57 52.70 \n", - "2023-03-03 54.70 59.15 54.70 58.20 3 202 57.20 \n", - "2023-03-03 54.70 59.15 54.70 58.20 3 202 57.20 \n", - "2023-03-06 55.84 55.84 55.21 55.21 14 259 53.95 \n", - "2023-03-06 55.84 55.84 55.21 55.21 14 259 53.95 \n", - "2023-03-07 50.95 51.55 50.95 51.55 8 88 49.75 \n", - "2023-03-07 50.95 51.55 50.95 51.55 8 88 49.75 \n", - "2023-03-08 45.77 46.95 45.00 45.00 18 201 45.70 \n", - "2023-03-08 45.77 46.95 45.00 45.00 18 201 45.70 \n", - "2023-03-09 46.65 47.60 39.93 40.17 119 76 39.85 \n", - "2023-03-09 46.65 47.60 39.93 40.17 119 76 39.85 \n", - "2023-03-10 41.52 42.30 40.75 40.75 10 104 40.40 \n", - "2023-03-10 41.52 42.30 40.75 40.75 10 104 40.40 \n", - "2023-03-13 37.00 42.11 35.50 41.40 67 104 40.55 \n", - "2023-03-13 37.00 42.11 35.50 41.40 67 104 40.55 \n", - "2023-03-14 44.90 46.20 44.00 46.10 48 4 46.25 \n", - "2023-03-14 44.90 46.20 44.00 46.10 48 4 46.25 \n", - "2023-03-15 44.50 45.53 42.54 43.90 19 80 44.20 \n", - "2023-03-15 44.50 45.53 42.54 43.90 19 80 44.20 \n", - "2023-03-16 44.05 46.98 44.05 46.75 16 125 46.40 \n", - "2023-03-16 44.05 46.98 44.05 46.75 16 125 46.40 \n", - "2023-03-17 46.70 46.70 43.63 44.20 100 141 43.95 \n", - "2023-03-17 46.70 46.70 43.63 44.20 100 141 43.95 \n", - "2023-03-20 42.11 47.90 42.11 45.40 20 174 45.50 \n", - "2023-03-20 42.11 47.90 42.11 45.40 20 174 45.50 \n", - "2023-03-21 51.25 56.69 51.10 56.28 45 741 54.95 \n", - "2023-03-21 51.25 56.69 51.10 56.28 45 741 54.95 \n", - "2023-03-22 56.80 56.80 53.00 53.00 3 69 51.30 \n", - "2023-03-22 56.80 56.80 53.00 53.00 3 69 51.30 \n", - "2023-03-23 56.00 56.00 52.30 52.30 10 76 52.40 \n", - "2023-03-23 56.00 56.00 52.30 52.30 10 76 52.40 \n", - "2023-03-24 51.24 51.25 50.40 50.40 4 76 51.20 \n", - "2023-03-24 51.24 51.25 50.40 50.40 4 76 51.20 \n", - "2023-03-27 54.05 54.05 52.23 52.23 23 55 52.00 \n", - "2023-03-27 54.05 54.05 52.23 52.23 23 55 52.00 \n", - "2023-03-28 50.15 50.15 49.03 49.03 7 134 50.10 \n", - "2023-03-28 50.15 50.15 49.03 49.03 7 134 50.10 \n", - "2023-03-29 52.43 52.85 52.43 52.85 2 151 52.80 \n", - "2023-03-29 52.43 52.85 52.43 52.85 2 151 52.80 \n", - "2023-03-30 55.00 55.05 54.10 54.10 4 133 53.60 \n", - "2023-03-30 55.00 55.05 54.10 54.10 4 133 53.60 \n", - "2023-03-31 56.78 62.54 56.78 62.17 19 231 62.15 \n", - "2023-03-31 56.78 62.54 56.78 62.17 19 231 62.15 \n", - "2023-04-03 57.00 57.00 51.90 51.90 11 438 52.60 \n", - "2023-04-03 57.00 57.00 51.90 51.90 11 438 52.60 \n", - "2023-04-04 51.70 51.70 50.85 50.85 2 375 51.05 \n", - "2023-04-04 51.70 51.70 50.85 50.85 2 375 51.05 \n", - "2023-04-05 49.40 49.40 45.75 47.50 17 258 46.15 \n", - "2023-04-05 49.40 49.40 45.75 47.50 17 258 46.15 \n", - "2023-04-06 44.25 46.55 43.00 46.00 26 165 45.55 \n", - "2023-04-06 44.25 46.55 43.00 46.00 26 165 45.55 \n", - "2023-04-10 43.35 45.70 41.00 45.35 42 81 45.10 \n", - "2023-04-10 43.35 45.70 41.00 45.35 42 81 45.10 \n", - "2023-04-11 47.50 48.85 46.65 47.80 10 265 46.75 \n", - "2023-04-11 47.50 48.85 46.65 47.80 10 265 46.75 \n", - "2023-04-12 43.51 43.51 43.11 43.11 7 57 42.45 \n", - "2023-04-12 43.51 43.51 43.11 43.11 7 57 42.45 \n", - "2023-04-13 45.45 46.09 45.45 46.09 4 180 45.55 \n", - "2023-04-13 45.45 46.09 45.45 46.09 4 180 45.55 \n", - "2023-04-14 45.10 45.10 43.53 44.61 25 337 44.45 \n", - "2023-04-14 45.10 45.10 43.53 44.61 25 337 44.45 \n", - "2023-04-17 47.50 47.50 43.50 44.70 33 190 45.10 \n", - "2023-04-17 47.50 47.50 43.50 44.70 33 190 45.10 \n", - "2023-04-18 44.88 45.60 43.30 43.30 22 113 42.85 \n", - "2023-04-18 44.88 45.60 43.30 43.30 22 113 42.85 \n", - "2023-04-19 40.75 41.50 40.00 40.50 24 223 39.45 \n", - "2023-04-19 40.75 41.50 40.00 40.50 24 223 39.45 \n", - "2023-04-20 30.80 31.86 28.15 28.88 68 298 28.55 \n", - "2023-04-20 30.80 31.86 28.15 28.88 68 298 28.55 \n", - "2023-04-21 30.00 30.00 28.28 29.37 25 143 29.00 \n", - "2023-04-21 30.00 30.00 28.28 29.37 25 143 29.00 \n", - "2023-04-24 28.00 28.00 26.05 26.70 151 210 27.15 \n", - "2023-04-24 28.00 28.00 26.05 26.70 151 210 27.15 \n", - "2023-04-25 26.75 27.79 26.75 27.57 93 160 26.30 \n", - "2023-04-25 26.75 27.79 26.75 27.57 93 160 26.30 \n", - "2023-04-26 26.00 26.00 23.20 24.10 180 1 20.65 \n", - "2023-04-26 26.00 26.00 23.20 24.10 180 1 20.65 \n", - "2023-04-27 23.65 25.70 23.65 25.70 11 242 26.10 \n", - "2023-04-27 23.65 25.70 23.65 25.70 11 242 26.10 \n", - "2023-04-28 26.40 28.40 25.35 28.37 13 308 27.85 \n", - "2023-04-28 26.40 28.40 25.35 28.37 13 308 27.85 \n", - "2023-05-01 27.45 27.45 25.90 26.45 1700 203 26.45 \n", - "2023-05-01 27.45 27.45 25.90 26.45 1700 203 26.45 \n", - "2023-05-02 28.35 28.35 26.60 26.60 45 172 25.90 \n", - "2023-05-02 28.35 28.35 26.60 26.60 45 172 25.90 \n", - "2023-05-03 27.99 27.99 26.47 26.47 7 7 26.00 \n", - "2023-05-03 27.99 27.99 26.47 26.47 7 7 26.00 \n", - "2023-05-04 26.55 26.80 26.55 26.80 3 130 26.45 \n", - "2023-05-04 26.55 26.80 26.55 26.80 3 130 26.45 \n", - "2023-05-05 28.65 31.76 28.65 31.20 77 76 31.25 \n", - "2023-05-05 28.65 31.76 28.65 31.20 77 76 31.25 \n", - "2023-05-08 32.86 32.86 32.82 32.82 2 216 32.35 \n", - "2023-05-08 32.86 32.86 32.82 32.82 2 216 32.35 \n", - "2023-05-09 31.35 31.35 30.08 30.10 20 238 30.70 \n", - "2023-05-09 31.35 31.35 30.08 30.10 20 238 30.70 \n", - "2023-05-10 33.36 33.80 30.60 30.62 27 221 30.20 \n", - "2023-05-10 33.36 33.80 30.60 30.62 27 221 30.20 \n", - "2023-05-11 29.70 31.30 29.70 30.82 18 281 31.95 \n", - "2023-05-11 29.70 31.30 29.70 30.82 18 281 31.95 \n", - "2023-05-12 35.00 35.97 30.16 30.90 174 103 30.00 \n", - "2023-05-12 35.00 35.97 30.16 30.90 174 103 30.00 \n", - "2023-05-15 31.21 31.21 28.95 28.95 27 436 28.80 \n", - "2023-05-15 31.21 31.21 28.95 28.95 27 436 28.80 \n", - "2023-05-16 29.00 30.85 27.97 30.85 24 147 28.85 \n", - "2023-05-16 29.00 30.85 27.97 30.85 24 147 28.85 \n", - "2023-05-17 32.20 33.25 32.20 33.16 76 50 32.65 \n", - "2023-05-17 32.20 33.25 32.20 33.16 76 50 32.65 \n", - "2023-05-18 31.95 33.70 31.95 33.70 8 34 33.70 \n", - "2023-05-18 31.95 33.70 31.95 33.70 8 34 33.70 \n", - "2023-05-19 35.00 37.90 34.72 36.50 162 181 36.40 \n", - "2023-05-19 35.00 37.90 34.72 36.50 162 181 36.40 \n", - "2023-05-22 38.00 42.70 38.00 42.70 48 88 42.70 \n", - "2023-05-22 38.00 42.70 38.00 42.70 48 88 42.70 \n", - "2023-05-23 41.12 45.85 41.12 42.75 39 164 40.70 \n", - "2023-05-23 41.12 45.85 41.12 42.75 39 164 40.70 \n", - "2023-05-24 38.00 39.80 37.65 39.80 18 125 38.90 \n", - "2023-05-24 38.00 39.80 37.65 39.80 18 125 38.90 \n", - "2023-05-25 39.10 40.65 38.25 40.65 19 104 39.70 \n", - "2023-05-25 39.10 40.65 38.25 40.65 19 104 39.70 \n", - "2023-05-26 41.60 48.10 41.60 46.35 42 21 45.80 \n", - "2023-05-26 41.60 48.10 41.60 46.35 42 21 45.80 \n", - "2023-05-30 54.65 54.65 49.55 49.55 15 252 51.40 \n", - "2023-05-30 54.65 54.65 49.55 49.55 15 252 51.40 \n", - "2023-05-31 53.05 53.05 48.30 51.00 23 168 53.30 \n", - "2023-05-31 53.05 53.05 48.30 51.00 23 168 53.30 \n", - "2023-06-01 52.60 57.80 52.60 57.80 41 289 55.75 \n", - "2023-06-01 52.60 57.80 52.60 57.80 41 289 55.75 \n", - "2023-06-02 61.05 63.50 61.00 61.45 22 178 60.80 \n", - "2023-06-02 61.05 63.50 61.00 61.45 22 178 60.80 \n", - "2023-06-05 65.85 66.35 64.34 64.34 123 97 63.65 \n", - "2023-06-05 65.85 66.35 64.34 64.34 123 97 63.65 \n", - "2023-06-06 65.00 65.65 64.95 64.95 113 133 66.30 \n", - "2023-06-06 65.00 65.65 64.95 64.95 113 133 66.30 \n", - "2023-06-07 71.90 72.65 68.77 69.75 21 303 67.80 \n", - "2023-06-07 71.90 72.65 68.77 69.75 21 303 67.80 \n", - "2023-06-08 70.20 76.25 70.20 75.99 27 142 77.25 \n", - "2023-06-08 70.20 76.25 70.20 75.99 27 142 77.25 \n", - "2023-06-09 89.70 92.35 85.71 86.06 22 157 85.00 \n", - "2023-06-12 87.90 89.10 86.80 88.00 47 265 89.20 \n", - "2023-06-12 87.90 89.10 86.80 88.00 47 265 89.20 \n", - "2023-06-13 93.90 97.72 93.44 97.72 52 259 97.05 \n", - "2023-06-13 93.90 97.72 93.44 97.72 52 259 97.05 \n", - "2023-06-14 96.60 96.60 92.60 92.60 11 179 95.75 \n", - "2023-06-14 96.60 96.60 92.60 92.60 11 179 95.75 \n", - "2023-06-15 95.69 95.69 95.69 95.69 3 107 95.25 \n", - "2023-06-15 95.69 95.69 95.69 95.69 3 107 95.25 \n", - "2023-06-16 99.80 101.52 97.70 98.50 13 75 99.50 \n", - "2023-06-16 99.80 101.52 97.70 98.50 13 75 99.50 \n", - "2023-06-20 105.00 112.60 105.00 112.60 27 137 112.00 \n", - "2023-06-20 105.00 112.60 105.00 112.60 27 137 112.00 \n", - "2023-06-21 106.60 106.60 98.10 98.10 1665 158 98.15 \n", - "2023-06-21 106.60 106.60 98.10 98.10 1665 158 98.15 \n", - "2023-06-22 95.00 95.00 95.00 95.00 1 175 102.55 \n", - "2023-06-22 95.00 95.00 95.00 95.00 1 175 102.55 \n", - "2023-06-23 92.85 95.79 92.85 95.71 5 156 94.95 \n", - "2023-06-23 92.85 95.79 92.85 95.71 5 156 94.95 \n", - "2023-06-26 94.75 94.75 87.00 87.00 6 201 81.20 \n", - "2023-06-26 94.75 94.75 87.00 87.00 6 201 81.20 \n", - "2023-06-27 86.27 88.25 82.60 88.25 16 137 88.35 \n", - "2023-06-27 86.27 88.25 82.60 88.25 16 137 88.35 \n", - "2023-06-28 92.85 93.65 92.85 93.10 32 216 93.55 \n", - "2023-06-28 92.85 93.65 92.85 93.10 32 216 93.55 \n", - "2023-06-29 0.00 0.00 0.00 0.00 0 132 94.90 \n", - "2023-06-29 0.00 0.00 0.00 0.00 0 132 94.90 \n", - "2023-06-30 99.60 99.60 99.60 99.60 1 80 98.45 \n", - "2023-06-30 99.60 99.60 99.60 99.60 1 80 98.45 \n", - "2023-07-03 118.05 118.05 114.15 114.25 26 76 114.80 \n", - "2023-07-03 118.05 118.05 114.15 114.25 26 76 114.80 \n", - "2023-07-05 114.27 115.25 114.25 115.25 5 143 117.05 \n", - "2023-07-05 114.27 115.25 114.25 115.25 5 143 117.05 \n", - "2023-07-06 112.50 112.50 112.50 112.50 1 154 111.70 \n", - "2023-07-06 112.50 112.50 112.50 112.50 1 154 111.70 \n", - "2023-07-07 112.41 112.41 112.41 112.41 1 132 109.25 \n", - "2023-07-07 112.41 112.41 112.41 112.41 1 132 109.25 \n", - "2023-07-10 107.98 107.98 104.43 104.43 9 228 104.20 \n", - "2023-07-10 107.98 107.98 104.43 104.43 9 228 104.20 \n", - "2023-07-11 0.00 0.00 0.00 0.00 0 175 104.35 \n", - "2023-07-11 0.00 0.00 0.00 0.00 0 175 104.35 \n", - "2023-07-12 110.87 110.87 107.54 107.54 8 112 106.20 \n", - "2023-07-12 110.87 110.87 107.54 107.54 8 112 106.20 \n", - "2023-07-13 0.00 0.00 0.00 0.00 0 111 111.50 \n", - "2023-07-13 0.00 0.00 0.00 0.00 0 111 111.50 \n", - "2023-07-14 111.00 114.42 111.00 114.42 4 46 114.60 \n", - "2023-07-14 111.00 114.42 111.00 114.42 4 46 114.60 \n", - "2023-07-17 118.20 118.20 118.20 118.20 3 50 123.25 \n", - "2023-07-17 118.20 118.20 118.20 118.20 3 50 123.25 \n", - "2023-07-18 121.25 126.28 121.25 126.28 4 1 124.75 \n", - "2023-07-18 121.25 126.28 121.25 126.28 4 1 124.75 \n", - "2023-07-19 0.00 0.00 0.00 0.00 0 7 123.35 \n", - "2023-07-19 0.00 0.00 0.00 0.00 0 7 123.35 \n", - "2023-07-20 106.07 106.07 97.95 97.95 16 22 97.40 \n", - "2023-07-20 106.07 106.07 97.95 97.95 16 22 97.40 \n", - "2023-07-21 95.00 96.97 95.00 96.97 2 52 94.60 \n", - "2023-07-21 95.00 96.97 95.00 96.97 2 52 94.60 \n", - "2023-07-24 91.98 102.75 91.20 102.75 5 161 102.50 \n", - "2023-07-24 91.98 102.75 91.20 102.75 5 161 102.50 \n", - "2023-07-25 104.75 104.75 104.75 104.75 8 110 98.60 \n", - "2023-07-25 104.75 104.75 104.75 104.75 8 110 98.60 \n", - "2023-07-26 0.00 0.00 0.00 0.00 0 174 97.05 \n", - "2023-07-26 0.00 0.00 0.00 0.00 0 174 97.05 \n", - "2023-07-27 90.90 90.90 90.90 90.90 1 200 89.95 \n", - "2023-07-27 90.90 90.90 90.90 90.90 1 200 89.95 \n", - "2023-07-28 99.63 99.63 99.63 99.63 1 419 98.20 \n", - "2023-07-28 99.63 99.63 99.63 99.63 1 419 98.20 \n", - "2023-07-31 100.00 101.05 99.70 101.05 3 364 99.30 \n", - "2023-07-31 100.00 101.05 99.70 101.05 3 364 99.30 \n", - "2023-08-01 0.00 0.00 0.00 0.00 0 400 94.25 \n", - "2023-08-01 0.00 0.00 0.00 0.00 0 400 94.25 \n", - "2023-08-02 89.84 89.84 89.62 89.62 2 579 88.05 \n", - "2023-08-02 89.84 89.84 89.62 89.62 2 579 88.05 \n", - "2023-08-03 0.00 0.00 0.00 0.00 0 114 92.70 \n", - "2023-08-03 0.00 0.00 0.00 0.00 0 114 92.70 \n", - "2023-08-04 90.06 90.06 90.04 90.04 2 276 87.20 \n", - "2023-08-04 90.06 90.06 90.04 90.04 2 276 87.20 \n", - "2023-08-07 81.85 81.90 81.31 81.31 7 359 84.70 \n", - "2023-08-07 81.85 81.90 81.31 81.31 7 359 84.70 \n", - "2023-08-08 83.77 83.77 83.77 83.77 1 116 84.15 \n", - "2023-08-08 83.77 83.77 83.77 83.77 1 116 84.15 \n", - "2023-08-09 82.50 82.50 79.62 80.29 38 281 77.35 \n", - "2023-08-09 82.50 82.50 79.62 80.29 38 281 77.35 \n", - "2023-08-10 81.13 83.26 80.30 80.33 8 200 80.20 \n", - "2023-08-10 81.13 83.26 80.30 80.33 8 200 80.20 \n", - "2023-08-11 0.00 0.00 0.00 0.00 0 358 77.50 \n", - "2023-08-11 0.00 0.00 0.00 0.00 0 358 77.50 \n", - "2023-08-14 72.95 74.04 72.95 73.95 4 492 74.20 \n", - "2023-08-14 72.95 74.04 72.95 73.95 4 492 74.20 \n", - "2023-08-15 0.00 0.00 0.00 0.00 0 289 68.85 \n", - "2023-08-15 0.00 0.00 0.00 0.00 0 289 68.85 \n", - "2023-08-16 66.15 66.15 65.20 65.20 5 161 63.25 \n", - "2023-08-16 66.15 66.15 65.20 65.20 5 161 63.25 \n", - "2023-08-17 61.17 62.00 58.35 58.35 11 277 57.65 \n", - "2023-08-17 61.17 62.00 58.35 58.35 11 277 57.65 \n", - "2023-08-18 55.00 55.00 55.00 55.00 1 117 54.85 \n", - "2023-08-18 55.00 55.00 55.00 55.00 1 117 54.85 \n", - "2023-08-21 62.90 67.87 62.90 67.87 28 410 68.00 \n", - "2023-08-21 62.90 67.87 62.90 67.87 28 410 68.00 \n", - "2023-08-22 76.00 76.00 72.10 72.10 5 388 69.95 \n", - "2023-08-22 76.00 76.00 72.10 72.10 5 388 69.95 \n", - "2023-08-23 73.55 73.55 73.50 73.50 40 356 72.55 \n", - "2023-08-23 73.55 73.55 73.50 73.50 40 356 72.55 \n", - "2023-08-24 70.41 70.57 67.40 67.40 31 301 67.15 \n", - "2023-08-24 70.41 70.57 67.40 67.40 31 301 67.15 \n", - "2023-08-25 71.21 72.14 68.70 72.10 234 152 74.05 \n", - "2023-08-25 71.21 72.14 68.70 72.10 234 152 74.05 \n", - "2023-08-28 74.15 74.15 74.15 74.15 1 139 73.85 \n", - "2023-08-28 74.15 74.15 74.15 74.15 1 139 73.85 \n", - "2023-08-29 87.60 87.60 87.60 87.60 1 269 89.35 \n", - "2023-08-29 87.60 87.60 87.60 87.60 1 269 89.35 \n", - "2023-08-30 87.34 88.11 87.26 88.07 6 249 89.65 \n", - "2023-08-30 87.34 88.11 87.26 88.07 6 249 89.65 \n", - "2023-08-31 0.00 0.00 0.00 0.00 0 376 90.40 \n", - "2023-08-31 0.00 0.00 0.00 0.00 0 376 90.40 \n", - "2023-09-01 80.20 80.20 79.18 79.18 4 252 79.05 \n", - "2023-09-01 80.20 80.20 79.18 79.18 4 252 79.05 \n", - "2023-09-05 89.25 89.25 89.25 89.25 4 467 89.05 \n", - "2023-09-05 89.25 89.25 89.25 89.25 4 467 89.05 \n", - "2023-09-06 85.62 85.67 82.35 82.35 5 369 84.95 \n", - "2023-09-06 85.62 85.67 82.35 82.35 5 369 84.95 \n", - "2023-09-07 80.00 80.30 80.00 80.30 10 406 84.45 \n", - "2023-09-07 80.00 80.30 80.00 80.30 10 406 84.45 \n", - "2023-09-08 81.94 81.94 81.94 81.94 3 430 81.50 \n", - "2023-09-08 81.94 81.94 81.94 81.94 3 430 81.50 \n", - "2023-09-11 103.57 103.57 103.57 103.57 1 260 103.45 \n", - "2023-09-11 103.57 103.57 103.57 103.57 1 260 103.45 \n", - "2023-09-12 0.00 0.00 0.00 0.00 0 440 98.40 \n", - "2023-09-12 0.00 0.00 0.00 0.00 0 440 98.40 \n", - "2023-09-13 102.65 102.65 102.65 102.65 1 399 101.55 \n", - "2023-09-13 102.65 102.65 102.65 102.65 1 399 101.55 \n", - "2023-09-14 103.60 106.87 103.60 106.07 13 234 105.95 \n", - "2023-09-14 103.60 106.87 103.60 106.07 13 234 105.95 \n", - "2023-09-15 105.76 106.10 105.20 105.20 3 205 104.10 \n", - "2023-09-15 105.76 106.10 105.20 105.20 3 205 104.10 \n", - "2023-09-18 0.00 0.00 0.00 0.00 0 51 95.45 \n", - "2023-09-18 0.00 0.00 0.00 0.00 0 51 95.45 \n", - "2023-09-19 97.57 97.57 97.57 97.57 1 251 96.40 \n", - "2023-09-19 97.57 97.57 97.57 97.57 1 251 96.40 \n", - "2023-09-20 0.00 0.00 0.00 0.00 0 370 92.30 \n", - "2023-09-20 0.00 0.00 0.00 0.00 0 370 92.30 \n", - "2023-09-21 88.88 88.88 88.88 88.88 2 90 87.00 \n", - "2023-09-21 88.88 88.88 88.88 88.88 2 90 87.00 \n", - "2023-09-22 85.85 85.85 85.85 85.85 1 79 77.05 \n", - "2023-09-22 85.85 85.85 85.85 85.85 1 79 77.05 \n", - "2023-09-25 77.70 77.70 76.88 76.88 2 203 78.55 \n", - "2023-09-25 77.70 77.70 76.88 76.88 2 203 78.55 \n", - "2023-09-26 0.00 0.00 0.00 0.00 0 346 76.45 \n", - "2023-09-26 0.00 0.00 0.00 0.00 0 346 76.45 \n", - "2023-09-27 77.03 77.03 71.03 74.85 16 104 73.55 \n", - "2023-09-27 77.03 77.03 71.03 74.85 16 104 73.55 \n", - "2023-09-28 74.88 78.43 74.09 78.00 49 104 78.30 \n", - "2023-09-28 74.88 78.43 74.09 78.00 49 104 78.30 \n", - "2023-09-29 0.00 0.00 0.00 0.00 0 226 81.30 \n", - "2023-09-29 0.00 0.00 0.00 0.00 0 226 81.30 \n", - "2023-10-02 78.90 78.90 78.90 78.90 1 301 82.45 \n", - "2023-10-02 78.90 78.90 78.90 78.90 1 301 82.45 \n", - "2023-10-03 81.46 81.46 81.46 81.46 2 194 78.20 \n", - "2023-10-03 81.46 81.46 81.46 81.46 2 194 78.20 \n", - "2023-10-04 83.70 83.85 83.55 83.85 4 59 91.25 \n", - "2023-10-04 83.70 83.85 83.55 83.85 4 59 91.25 \n", - "2023-10-05 0.00 0.00 0.00 0.00 0 254 90.35 \n", - "2023-10-05 0.00 0.00 0.00 0.00 0 254 90.35 \n", - "2023-10-06 0.00 0.00 0.00 0.00 0 204 90.65 \n", - "2023-10-06 0.00 0.00 0.00 0.00 0 204 90.65 \n", - "2023-10-09 89.00 90.85 89.00 90.85 31 196 89.90 \n", - "2023-10-09 89.00 90.85 89.00 90.85 31 196 89.90 \n", - "2023-10-10 95.00 97.85 95.00 97.85 2 28 92.90 \n", - "2023-10-10 95.00 97.85 95.00 97.85 2 28 92.90 \n", - "2023-10-11 92.80 92.80 92.29 92.29 2 58 92.65 \n", - "2023-10-11 92.80 92.80 92.29 92.29 2 58 92.65 \n", - "2023-10-12 90.00 90.00 90.00 90.00 5 175 88.50 \n", - "2023-10-12 90.00 90.00 90.00 90.00 5 175 88.50 \n", - "2023-10-13 0.00 0.00 0.00 0.00 0 306 81.70 \n", - "2023-10-13 0.00 0.00 0.00 0.00 0 306 81.70 \n", - "2023-10-16 82.65 82.65 82.65 82.65 1 174 83.80 \n", - "2023-10-16 82.65 82.65 82.65 82.65 1 174 83.80 \n", - "2023-10-17 80.00 84.40 80.00 84.40 11 162 84.25 \n", - "2023-10-17 80.00 84.40 80.00 84.40 11 162 84.25 \n", - "2023-10-18 81.30 81.30 74.13 74.13 10 93 73.15 \n", - "2023-10-18 81.30 81.30 74.13 74.13 10 93 73.15 \n", - "2023-10-19 61.90 61.90 52.67 52.85 101 182 54.40 \n", - "2023-10-19 61.90 61.90 52.67 52.85 101 182 54.40 \n", - "2023-10-20 50.48 52.12 48.02 50.47 170 81 47.90 \n", - "2023-10-20 50.48 52.12 48.02 50.47 170 81 47.90 \n", - "2023-10-23 43.55 49.70 42.90 48.33 12 253 47.50 \n", - "2023-10-23 43.55 49.70 42.90 48.33 12 253 47.50 \n", - "2023-10-24 53.25 53.25 51.70 51.70 4 191 51.10 \n", - "2023-10-24 53.25 53.25 51.70 51.70 4 191 51.10 \n", - "2023-10-25 0.00 0.00 0.00 0.00 0 264 47.95 \n", - "2023-10-25 0.00 0.00 0.00 0.00 0 264 47.95 \n", - "2023-10-26 47.10 47.66 43.50 43.50 25 168 42.90 \n", - "2023-10-26 47.10 47.66 43.50 43.50 25 168 42.90 \n", - "2023-10-27 45.88 46.57 43.50 43.50 101 284 44.20 \n", - "2023-10-27 45.88 46.57 43.50 43.50 101 284 44.20 \n", - "2023-10-30 40.00 40.00 36.05 36.05 58 230 36.70 \n", - "2023-10-30 40.00 40.00 36.05 36.05 58 230 36.70 \n", - "2023-10-31 35.15 39.90 35.15 39.58 23 227 38.65 \n", - "2023-10-31 35.15 39.90 35.15 39.58 23 227 38.65 \n", - "2023-11-01 40.65 42.15 39.00 42.15 65 190 41.80 \n", - "2023-11-01 40.65 42.15 39.00 42.15 65 190 41.80 \n", - "2023-11-02 50.70 51.70 50.00 51.70 21 263 51.35 \n", - "2023-11-02 50.70 51.70 50.00 51.70 21 263 51.35 \n", - "2023-11-03 53.95 57.45 51.80 51.80 15 320 52.20 \n", - "2023-11-03 53.95 57.45 51.80 51.80 15 320 52.20 \n", - "2023-11-06 56.60 56.60 49.00 50.07 27 235 51.45 \n", - "2023-11-06 56.60 56.60 49.00 50.07 27 235 51.45 \n", - "2023-11-07 52.95 52.95 50.30 50.60 22 103 54.00 \n", - "2023-11-07 52.95 52.95 50.30 50.60 22 103 54.00 \n", - "2023-11-08 51.00 52.75 51.00 52.75 101 199 53.65 \n", - "2023-11-08 51.00 52.75 51.00 52.75 101 199 53.65 \n", - "2023-11-09 50.50 50.50 42.75 42.75 99 230 43.90 \n", - "2023-11-09 50.50 50.50 42.75 42.75 99 230 43.90 \n", - "2023-11-10 43.60 47.42 43.60 47.42 3 441 47.05 \n", - "2023-11-10 43.60 47.42 43.60 47.42 3 441 47.05 \n", - "2023-11-13 47.40 55.33 47.40 55.05 23 82 54.90 \n", - "2023-11-13 47.40 55.33 47.40 55.05 23 82 54.90 \n", - "2023-11-14 60.75 64.40 60.75 64.40 4 52 66.40 \n", - "2023-11-14 60.75 64.40 60.75 64.40 4 52 66.40 \n", - "2023-11-15 66.05 75.00 66.05 72.80 6 81 71.20 \n", - "2023-11-15 66.05 75.00 66.05 72.80 6 81 71.20 \n", - "2023-11-16 0.00 0.00 0.00 0.00 0 87 62.55 \n", - "2023-11-16 0.00 0.00 0.00 0.00 0 87 62.55 \n", - "2023-11-17 63.61 65.05 63.25 63.25 29 217 62.45 \n", - "2023-11-17 63.61 65.05 63.25 63.25 29 217 62.45 \n", - "2023-11-20 62.24 63.32 62.24 63.32 15 152 64.10 \n", - "2023-11-20 62.24 63.32 62.24 63.32 15 152 64.10 \n", - "2023-11-21 69.75 69.75 69.75 69.75 10 207 69.00 \n", - "2023-11-21 69.75 69.75 69.75 69.75 10 207 69.00 \n", - "2023-11-22 62.15 62.15 61.55 61.60 27 180 62.70 \n", - "2023-11-22 62.15 62.15 61.55 61.60 27 180 62.70 \n", - "2023-11-24 64.45 64.45 64.45 64.45 1 181 63.65 \n", - "2023-11-24 64.45 64.45 64.45 64.45 1 181 63.65 \n", - "2023-11-27 0.00 0.00 0.00 0.00 0 250 63.85 \n", - "2023-11-27 0.00 0.00 0.00 0.00 0 250 63.85 \n", - "2023-11-28 70.05 73.75 69.45 73.24 71 50 73.20 \n", - "2023-11-28 70.05 73.75 69.45 73.24 71 50 73.20 \n", - "2023-11-29 75.75 75.75 72.94 72.94 58 95 70.75 \n", - "2023-11-29 75.75 75.75 72.94 72.94 58 95 70.75 \n", - "2023-11-30 70.65 70.65 66.73 66.85 6 45 66.70 \n", - "2023-11-30 70.65 70.65 66.73 66.85 6 45 66.70 \n", - "2023-12-01 65.94 65.94 64.91 64.91 39 146 65.55 \n", - "2023-12-01 65.94 65.94 64.91 64.91 39 146 65.55 \n", - "2023-12-04 0.00 0.00 0.00 0.00 0 90 62.65 \n", - "2023-12-04 0.00 0.00 0.00 0.00 0 90 62.65 \n", - "2023-12-05 69.05 69.05 69.05 69.05 5 22 65.40 \n", - "2023-12-05 69.05 69.05 69.05 69.05 5 22 65.40 \n", - "2023-12-06 70.92 72.80 70.92 72.80 13 179 65.70 \n", - "2023-12-06 70.92 72.80 70.92 72.80 13 179 65.70 \n", - "2023-12-07 67.17 67.17 67.17 67.17 1 37 68.65 \n", - "2023-12-07 67.17 67.17 67.17 67.17 1 37 68.65 \n", - "2023-12-08 69.89 69.89 69.89 69.89 6 73 69.30 \n", - "2023-12-08 69.89 69.89 69.89 69.89 6 73 69.30 \n", - "2023-12-11 66.32 66.32 66.32 66.32 1 35 65.80 \n", - "2023-12-11 66.32 66.32 66.32 66.32 1 35 65.80 \n", - "2023-12-12 62.29 62.86 61.58 62.86 7 71 63.15 \n", - "2023-12-12 62.29 62.86 61.58 62.86 7 71 63.15 \n", - "2023-12-13 56.95 58.00 56.95 58.00 15 162 64.70 \n", - "2023-12-13 56.95 58.00 56.95 58.00 15 162 64.70 \n", - "2023-12-14 70.85 77.53 70.85 76.17 12 16 76.05 \n", - "2023-12-14 70.85 77.53 70.85 76.17 12 16 76.05 \n", - "2023-12-15 76.88 77.30 76.88 77.04 13 30 77.75 \n", - "2023-12-15 76.88 77.30 76.88 77.04 13 30 77.75 \n", - "2023-12-18 78.40 82.03 78.40 82.03 4 25 76.65 \n", - "2023-12-18 78.40 82.03 78.40 82.03 4 25 76.65 \n", - "2023-12-19 81.05 81.05 81.05 81.05 1 21 81.45 \n", - "2023-12-19 81.05 81.05 81.05 81.05 1 21 81.45 \n", - "2023-12-20 80.90 80.90 80.90 80.90 1 37 72.05 \n", - "2023-12-20 80.90 80.90 80.90 80.90 1 37 72.05 \n", - "2023-12-21 0.00 0.00 0.00 0.00 0 25 78.70 \n", - "2023-12-21 0.00 0.00 0.00 0.00 0 25 78.70 \n", - "2023-12-22 82.21 82.21 77.16 77.30 175 31 77.00 \n", - "2023-12-22 82.21 82.21 77.16 77.30 175 31 77.00 \n", - "2023-12-26 80.98 80.98 80.98 80.98 4 32 80.55 \n", - "2023-12-26 80.98 80.98 80.98 80.98 4 32 80.55 \n", - "2023-12-27 85.86 85.90 85.20 85.20 19 38 85.00 \n", - "2023-12-27 85.86 85.90 85.20 85.20 19 38 85.00 \n", - "2023-12-28 82.90 82.90 82.90 82.90 1 58 76.50 \n", - "2023-12-28 82.90 82.90 82.90 82.90 1 58 76.50 \n", - "2023-12-29 76.60 77.40 73.00 74.80 22 30 72.40 \n", - "2023-12-29 76.60 77.40 73.00 74.80 22 30 72.40 \n", - "\n", - " Ask_size CloseAsk Midpoint Weighted_midpoint \n", - "Datetime \n", - "2023-01-03 110 14.05 13.800 13.715165 \n", - "2023-01-03 110 14.05 13.800 13.715165 \n", - "2023-01-04 129 15.85 15.600 15.664634 \n", - "2023-01-04 129 15.85 15.600 15.664634 \n", - "2023-01-05 391 14.55 13.925 14.092139 \n", - "2023-01-05 391 14.55 13.925 14.092139 \n", - "2023-01-06 106 15.10 14.975 14.978641 \n", - "2023-01-06 106 15.10 14.975 14.978641 \n", - "2023-01-09 338 18.05 17.675 17.769444 \n", - "2023-01-09 338 18.05 17.675 17.769444 \n", - "2023-01-10 25 17.10 16.900 16.747170 \n", - "2023-01-10 25 17.10 16.900 16.747170 \n", - "2023-01-11 283 18.70 18.500 18.580893 \n", - "2023-01-11 283 18.70 18.500 18.580893 \n", - "2023-01-12 240 18.30 18.125 18.181405 \n", - "2023-01-12 240 18.30 18.125 18.181405 \n", - "2023-01-13 135 17.40 17.225 17.225000 \n", - "2023-01-13 135 17.40 17.225 17.225000 \n", - "2023-01-17 145 21.60 21.300 21.207143 \n", - "2023-01-17 145 21.60 21.300 21.207143 \n", - "2023-01-18 195 20.15 19.875 19.984409 \n", - "2023-01-18 195 20.15 19.875 19.984409 \n", - "2023-01-19 102 19.20 19.000 19.042857 \n", - "2023-01-19 102 19.20 19.000 19.042857 \n", - "2023-01-20 128 21.50 21.200 21.047692 \n", - "2023-01-20 128 21.50 21.200 21.047692 \n", - "2023-01-23 197 26.15 25.925 25.895264 \n", - "2023-01-23 197 26.15 25.925 25.895264 \n", - "2023-01-24 92 25.85 25.525 25.306595 \n", - "2023-01-24 92 25.85 25.525 25.306595 \n", - "2023-01-25 180 25.35 24.975 24.900668 \n", - "2023-01-25 180 25.35 24.975 24.900668 \n", - "2023-01-26 120 32.65 32.350 32.441304 \n", - "2023-01-26 120 32.65 32.350 32.441304 \n", - "2023-01-27 352 46.95 46.200 46.061819 \n", - "2023-01-27 352 46.95 46.200 46.061819 \n", - "2023-01-30 66 38.90 38.200 38.363551 \n", - "2023-01-30 66 38.90 38.200 38.363551 \n", - "2023-01-31 15 42.55 41.925 41.885937 \n", - "2023-01-31 15 42.55 41.925 41.885937 \n", - "2023-02-01 185 47.85 47.200 47.843011 \n", - "2023-02-01 185 47.85 47.200 47.843011 \n", - "2023-02-02 25 52.85 52.050 52.788462 \n", - "2023-02-02 25 52.85 52.050 52.788462 \n", - "2023-02-03 25 55.35 54.525 54.878571 \n", - "2023-02-03 25 55.35 54.525 54.878571 \n", - "2023-02-06 207 59.15 58.600 58.946457 \n", - "2023-02-06 207 59.15 58.600 58.946457 \n", - "2023-02-07 28 60.00 59.500 59.333333 \n", - "2023-02-07 28 60.00 59.500 59.333333 \n", - "2023-02-08 68 63.90 63.350 63.456140 \n", - "2023-02-08 68 63.90 63.350 63.456140 \n", - "2023-02-09 11 68.80 68.450 68.420833 \n", - "2023-02-09 11 68.80 68.450 68.420833 \n", - "2023-02-10 196 60.45 60.050 60.353139 \n", - "2023-02-10 196 60.45 60.050 60.353139 \n", - "2023-02-13 544 58.60 57.925 58.399296 \n", - "2023-02-13 544 58.60 57.925 58.399296 \n", - "2023-02-14 568 70.15 69.350 70.092954 \n", - "2023-02-14 568 70.15 69.350 70.092954 \n", - "2023-02-15 38 73.85 73.225 73.133708 \n", - "2023-02-15 38 73.85 73.225 73.133708 \n", - "2023-02-16 201 64.95 62.700 64.840777 \n", - "2023-02-16 201 64.95 62.700 64.840777 \n", - "2023-02-17 49 69.80 68.950 68.958763 \n", - "2023-02-17 49 69.80 68.950 68.958763 \n", - "2023-02-21 16 61.05 60.450 59.892572 \n", - "2023-02-21 16 61.05 60.450 59.892572 \n", - "2023-02-22 302 63.20 62.475 63.109938 \n", - "2023-02-22 302 63.20 62.475 63.109938 \n", - "2023-02-23 244 63.65 63.225 63.469032 \n", - "2023-02-23 244 63.65 63.225 63.469032 \n", - "2023-02-24 142 59.50 59.100 59.060635 \n", - "2023-02-24 142 59.50 59.100 59.060635 \n", - "2023-02-27 405 67.60 67.100 67.472845 \n", - "2023-02-27 405 67.60 67.100 67.472845 \n", - "2023-02-28 11 65.35 64.775 64.391667 \n", - "2023-02-28 11 65.35 64.775 64.391667 \n", - "2023-03-01 558 62.75 62.150 62.173464 \n", - "2023-03-01 558 62.75 62.150 62.173464 \n", - "2023-03-02 42 53.25 52.975 52.933333 \n", - "2023-03-02 42 53.25 52.975 52.933333 \n", - "2023-03-03 260 58.15 57.675 57.734632 \n", - "2023-03-03 260 58.15 57.675 57.734632 \n", - "2023-03-06 149 54.80 54.375 54.260417 \n", - "2023-03-06 149 54.80 54.375 54.260417 \n", - "2023-03-07 72 50.50 50.125 50.087500 \n", - "2023-03-07 72 50.50 50.125 50.087500 \n", - "2023-03-08 175 46.30 46.000 45.979255 \n", - "2023-03-08 175 46.30 46.000 45.979255 \n", - "2023-03-09 1 40.20 40.025 39.854545 \n", - "2023-03-09 1 40.20 40.025 39.854545 \n", - "2023-03-10 230 41.00 40.700 40.813174 \n", - "2023-03-10 230 41.00 40.700 40.813174 \n", - "2023-03-13 42 41.30 40.925 40.765753 \n", - "2023-03-13 42 41.30 40.925 40.765753 \n", - "2023-03-14 56 46.90 46.575 46.856667 \n", - "2023-03-14 56 46.90 46.575 46.856667 \n", - "2023-03-15 59 45.05 44.625 44.560791 \n", - "2023-03-15 59 45.05 44.625 44.560791 \n", - "2023-03-16 64 47.05 46.725 46.620106 \n", - "2023-03-16 64 47.05 46.725 46.620106 \n", - "2023-03-17 209 44.60 44.275 44.338143 \n", - "2023-03-17 209 44.60 44.275 44.338143 \n", - "2023-03-20 40 46.10 45.800 45.612150 \n", - "2023-03-20 40 46.10 45.800 45.612150 \n", - "2023-03-21 38 56.50 55.725 55.025610 \n", - "2023-03-21 38 56.50 55.725 55.025610 \n", - "2023-03-22 37 51.85 51.575 51.491981 \n", - "2023-03-22 37 51.85 51.575 51.491981 \n", - "2023-03-23 29 53.00 52.700 52.565714 \n", - "2023-03-23 29 53.00 52.700 52.565714 \n", - "2023-03-24 31 51.65 51.425 51.330374 \n", - "2023-03-24 31 51.65 51.425 51.330374 \n", - "2023-03-27 63 52.45 52.225 52.240254 \n", - "2023-03-27 63 52.45 52.225 52.240254 \n", - "2023-03-28 167 50.55 50.325 50.349668 \n", - "2023-03-28 167 50.55 50.325 50.349668 \n", - "2023-03-29 7 53.25 53.025 52.819937 \n", - "2023-03-29 7 53.25 53.025 52.819937 \n", - "2023-03-30 389 54.15 53.875 54.009866 \n", - "2023-03-30 389 54.15 53.875 54.009866 \n", - "2023-03-31 92 62.90 62.525 62.363622 \n", - "2023-03-31 92 62.90 62.525 62.363622 \n", - "2023-04-03 194 53.40 53.000 52.845570 \n", - "2023-04-03 194 53.40 53.000 52.845570 \n", - "2023-04-04 128 51.80 51.425 51.240855 \n", - "2023-04-04 128 51.80 51.425 51.240855 \n", - "2023-04-05 155 46.95 46.550 46.450242 \n", - "2023-04-05 155 46.95 46.550 46.450242 \n", - "2023-04-06 155 46.15 45.850 45.840625 \n", - "2023-04-06 155 46.15 45.850 45.840625 \n", - "2023-04-10 123 45.85 45.475 45.552206 \n", - "2023-04-10 123 45.85 45.475 45.552206 \n", - "2023-04-11 165 47.45 47.100 47.018605 \n", - "2023-04-11 165 47.45 47.100 47.018605 \n", - "2023-04-12 140 43.10 42.775 42.911929 \n", - "2023-04-12 140 43.10 42.775 42.911929 \n", - "2023-04-13 162 46.10 45.825 45.810526 \n", - "2023-04-13 162 46.10 45.825 45.810526 \n", - "2023-04-14 235 45.15 44.800 44.737587 \n", - "2023-04-14 235 45.15 44.800 44.737587 \n", - "2023-04-17 235 45.90 45.500 45.542353 \n", - "2023-04-17 235 45.90 45.500 45.542353 \n", - "2023-04-18 223 43.50 43.175 43.281399 \n", - "2023-04-18 223 43.50 43.175 43.281399 \n", - "2023-04-19 97 40.15 39.800 39.662188 \n", - "2023-04-19 97 40.15 39.800 39.662188 \n", - "2023-04-20 26 29.20 28.875 28.602160 \n", - "2023-04-20 26 29.20 28.875 28.602160 \n", - "2023-04-21 302 29.60 29.300 29.407191 \n", - "2023-04-21 302 29.60 29.300 29.407191 \n", - "2023-04-24 305 27.90 27.525 27.594175 \n", - "2023-04-24 305 27.90 27.525 27.594175 \n", - "2023-04-25 230 27.15 26.725 26.801282 \n", - "2023-04-25 230 27.15 26.725 26.801282 \n", - "2023-04-26 278 23.85 22.250 23.838530 \n", - "2023-04-26 278 23.85 22.250 23.838530 \n", - "2023-04-27 276 26.80 26.450 26.472973 \n", - "2023-04-27 276 26.80 26.450 26.472973 \n", - "2023-04-28 288 28.65 28.250 28.236577 \n", - "2023-04-28 288 28.65 28.250 28.236577 \n", - "2023-05-01 163 27.10 26.775 26.739481 \n", - "2023-05-01 163 27.10 26.775 26.739481 \n", - "2023-05-02 410 26.65 26.275 26.428351 \n", - "2023-05-02 410 26.65 26.275 26.428351 \n", - "2023-05-03 207 26.80 26.400 26.773832 \n", - "2023-05-03 207 26.80 26.400 26.773832 \n", - "2023-05-04 331 27.00 26.725 26.844902 \n", - "2023-05-04 331 27.00 26.725 26.844902 \n", - "2023-05-05 233 31.80 31.525 31.664725 \n", - "2023-05-05 233 31.80 31.525 31.664725 \n", - "2023-05-08 324 33.10 32.725 32.800000 \n", - "2023-05-08 324 33.10 32.725 32.800000 \n", - "2023-05-09 293 31.40 31.050 31.086252 \n", - "2023-05-09 293 31.40 31.050 31.086252 \n", - "2023-05-10 311 30.90 30.550 30.609211 \n", - "2023-05-10 311 30.90 30.550 30.609211 \n", - "2023-05-11 225 32.95 32.450 32.394664 \n", - "2023-05-11 225 32.95 32.450 32.394664 \n", - "2023-05-12 211 31.00 30.500 30.671975 \n", - "2023-05-12 211 31.00 30.500 30.671975 \n", - "2023-05-15 335 29.55 29.175 29.125875 \n", - "2023-05-15 335 29.55 29.175 29.125875 \n", - "2023-05-16 391 29.55 29.200 29.358736 \n", - "2023-05-16 391 29.55 29.200 29.358736 \n", - "2023-05-17 244 33.25 32.950 33.147959 \n", - "2023-05-17 244 33.25 32.950 33.147959 \n", - "2023-05-18 55 35.20 34.450 34.626966 \n", - "2023-05-18 55 35.20 34.450 34.626966 \n", - "2023-05-19 193 37.00 36.700 36.709626 \n", - "2023-05-19 193 37.00 36.700 36.709626 \n", - "2023-05-22 113 43.35 43.025 43.065423 \n", - "2023-05-22 113 43.35 43.025 43.065423 \n", - "2023-05-23 231 41.60 41.150 41.226329 \n", - "2023-05-23 231 41.60 41.150 41.226329 \n", - "2023-05-24 259 39.70 39.300 39.439583 \n", - "2023-05-24 259 39.70 39.300 39.439583 \n", - "2023-05-25 227 40.30 40.000 40.111480 \n", - "2023-05-25 227 40.30 40.000 40.111480 \n", - "2023-05-26 179 46.40 46.100 46.337000 \n", - "2023-05-26 179 46.40 46.100 46.337000 \n", - "2023-05-30 246 53.00 52.200 52.190361 \n", - "2023-05-30 246 53.00 52.200 52.190361 \n", - "2023-05-31 195 54.80 54.050 54.105785 \n", - "2023-05-31 195 54.80 54.050 54.105785 \n", - "2023-06-01 161 56.80 56.275 56.125667 \n", - "2023-06-01 161 56.80 56.275 56.125667 \n", - "2023-06-02 187 61.75 61.275 61.286712 \n", - "2023-06-02 187 61.75 61.275 61.286712 \n", - "2023-06-05 146 64.40 64.025 64.100617 \n", - "2023-06-05 146 64.40 64.025 64.100617 \n", - "2023-06-06 275 67.10 66.700 66.839216 \n", - "2023-06-06 275 67.10 66.700 66.839216 \n", - "2023-06-07 418 69.50 68.650 68.785576 \n", - "2023-06-07 418 69.50 68.650 68.785576 \n", - "2023-06-08 189 77.90 77.575 77.621148 \n", - "2023-06-08 189 77.90 77.575 77.621148 \n", - "2023-06-09 129 86.15 85.575 85.518706 \n", - "2023-06-12 399 90.70 89.950 90.101355 \n", - "2023-06-12 399 90.70 89.950 90.101355 \n", - "2023-06-13 367 98.50 97.775 97.900080 \n", - "2023-06-13 367 98.50 97.775 97.900080 \n", - "2023-06-14 225 96.75 96.250 96.306931 \n", - "2023-06-14 225 96.75 96.250 96.306931 \n", - "2023-06-15 139 96.45 95.850 95.928049 \n", - "2023-06-15 139 96.45 95.850 95.928049 \n", - "2023-06-16 108 100.40 99.950 100.031148 \n", - "2023-06-16 108 100.40 99.950 100.031148 \n", - "2023-06-20 107 112.95 112.475 112.416598 \n", - "2023-06-20 107 112.95 112.475 112.416598 \n", - "2023-06-21 219 99.25 98.700 98.788992 \n", - "2023-06-21 219 99.25 98.700 98.788992 \n", - "2023-06-22 205 103.70 103.125 103.170395 \n", - "2023-06-22 205 103.70 103.125 103.170395 \n", - "2023-06-23 83 95.70 95.325 95.210460 \n", - "2023-06-23 83 95.70 95.325 95.210460 \n", - "2023-06-26 309 82.35 81.775 81.896765 \n", - "2023-06-26 309 82.35 81.775 81.896765 \n", - "2023-06-27 166 89.40 88.875 88.925248 \n", - "2023-06-27 166 89.40 88.875 88.925248 \n", - "2023-06-28 345 94.90 94.225 94.380214 \n", - "2023-06-28 345 94.90 94.225 94.380214 \n", - "2023-06-29 53 95.50 95.200 95.071892 \n", - "2023-06-29 53 95.50 95.200 95.071892 \n", - "2023-06-30 163 99.70 99.075 99.288477 \n", - "2023-06-30 163 99.70 99.075 99.288477 \n", - "2023-07-03 110 116.20 115.500 115.627957 \n", - "2023-07-03 110 116.20 115.500 115.627957 \n", - "2023-07-05 311 118.25 117.650 117.872026 \n", - "2023-07-05 311 118.25 117.650 117.872026 \n", - "2023-07-06 276 112.60 112.150 112.277674 \n", - "2023-07-06 276 112.60 112.150 112.277674 \n", - "2023-07-07 275 110.40 109.825 110.027027 \n", - "2023-07-07 275 110.40 109.825 110.027027 \n", - "2023-07-10 244 105.45 104.825 104.846186 \n", - "2023-07-10 244 105.45 104.825 104.846186 \n", - "2023-07-11 282 105.50 104.925 105.059628 \n", - "2023-07-11 282 105.50 104.925 105.059628 \n", - "2023-07-12 232 106.95 106.575 106.705814 \n", - "2023-07-12 232 106.95 106.575 106.705814 \n", - "2023-07-13 155 112.50 112.000 112.082707 \n", - "2023-07-13 155 112.50 112.000 112.082707 \n", - "2023-07-14 45 115.50 115.050 115.045055 \n", - "2023-07-14 45 115.50 115.050 115.045055 \n", - "2023-07-17 49 124.20 123.725 123.720202 \n", - "2023-07-17 49 124.20 123.725 123.720202 \n", - "2023-07-18 15 128.20 126.475 127.984375 \n", - "2023-07-18 15 128.20 126.475 127.984375 \n", - "2023-07-19 25 127.05 125.200 126.240625 \n", - "2023-07-19 25 127.05 125.200 126.240625 \n", - "2023-07-20 134 98.20 97.800 98.087179 \n", - "2023-07-20 134 98.20 97.800 98.087179 \n", - "2023-07-21 41 95.35 94.975 94.930645 \n", - "2023-07-21 41 95.35 94.975 94.930645 \n", - "2023-07-24 181 103.35 102.925 102.949854 \n", - "2023-07-24 181 103.35 102.925 102.949854 \n", - "2023-07-25 180 100.75 99.675 99.934483 \n", - "2023-07-25 180 100.75 99.675 99.934483 \n", - "2023-07-26 84 99.15 98.100 97.733721 \n", - "2023-07-26 84 99.15 98.100 97.733721 \n", - "2023-07-27 336 91.70 90.825 91.047015 \n", - "2023-07-27 336 91.70 90.825 91.047015 \n", - "2023-07-28 330 100.75 99.475 99.323498 \n", - "2023-07-28 330 100.75 99.475 99.323498 \n", - "2023-07-31 140 101.05 100.175 99.786111 \n", - "2023-07-31 140 101.05 100.175 99.786111 \n", - "2023-08-01 512 96.30 95.275 95.400877 \n", - "2023-08-01 512 96.30 95.275 95.400877 \n", - "2023-08-02 548 90.40 89.225 89.192680 \n", - "2023-08-02 548 90.40 89.225 89.192680 \n", - "2023-08-03 158 95.40 94.050 94.268382 \n", - "2023-08-03 158 95.40 94.050 94.268382 \n", - "2023-08-04 248 89.90 88.550 88.477863 \n", - "2023-08-04 248 89.90 88.550 88.477863 \n", - "2023-08-07 367 87.20 85.950 85.963774 \n", - "2023-08-07 367 87.20 85.950 85.963774 \n", - "2023-08-08 249 85.50 84.825 85.070959 \n", - "2023-08-08 249 85.50 84.825 85.070959 \n", - "2023-08-09 380 79.45 78.400 78.557262 \n", - "2023-08-09 380 79.45 78.400 78.557262 \n", - "2023-08-10 340 81.85 81.025 81.238889 \n", - "2023-08-10 340 81.85 81.025 81.238889 \n", - "2023-08-11 380 79.40 78.450 78.478320 \n", - "2023-08-11 380 79.40 78.450 78.478320 \n", - "2023-08-14 331 76.10 75.150 74.964156 \n", - "2023-08-14 331 76.10 75.150 74.964156 \n", - "2023-08-15 303 71.25 70.050 70.078378 \n", - "2023-08-15 303 71.25 70.050 70.078378 \n", - "2023-08-16 266 64.65 63.950 64.122131 \n", - "2023-08-16 266 64.65 63.950 64.122131 \n", - "2023-08-17 340 59.70 58.675 58.779660 \n", - "2023-08-17 340 59.70 58.675 58.779660 \n", - "2023-08-18 136 56.50 55.675 55.736957 \n", - "2023-08-18 136 56.50 55.675 55.736957 \n", - "2023-08-21 459 68.75 68.375 68.396145 \n", - "2023-08-21 459 68.75 68.375 68.396145 \n", - "2023-08-22 355 70.70 70.325 70.308345 \n", - "2023-08-22 355 70.70 70.325 70.308345 \n", - "2023-08-23 436 73.50 73.025 73.072980 \n", - "2023-08-23 436 73.50 73.025 73.072980 \n", - "2023-08-24 563 68.05 67.600 67.736458 \n", - "2023-08-24 563 68.05 67.600 67.736458 \n", - "2023-08-25 314 75.30 74.675 74.892275 \n", - "2023-08-25 314 75.30 74.675 74.892275 \n", - "2023-08-28 155 75.55 74.700 74.746259 \n", - "2023-08-28 155 75.55 74.700 74.746259 \n", - "2023-08-29 233 91.75 90.550 90.463944 \n", - "2023-08-29 233 91.75 90.550 90.463944 \n", - "2023-08-30 195 91.25 90.450 90.352703 \n", - "2023-08-30 195 91.25 90.450 90.352703 \n", - "2023-08-31 308 92.05 91.225 91.142982 \n", - "2023-08-31 308 92.05 91.225 91.142982 \n", - "2023-09-01 403 80.00 79.525 79.634504 \n", - "2023-09-01 403 80.00 79.525 79.634504 \n", - "2023-09-05 526 90.35 89.700 89.738620 \n", - "2023-09-05 526 90.35 89.700 89.738620 \n", - "2023-09-06 432 85.95 85.450 85.489326 \n", - "2023-09-06 432 85.95 85.450 85.489326 \n", - "2023-09-07 374 85.25 84.850 84.833590 \n", - "2023-09-07 374 85.25 84.850 84.833590 \n", - "2023-09-08 409 82.35 81.925 81.914362 \n", - "2023-09-08 409 82.35 81.925 81.914362 \n", - "2023-09-11 50 105.70 104.575 103.812903 \n", - "2023-09-11 50 105.70 104.575 103.812903 \n", - "2023-09-12 474 99.40 98.900 98.918600 \n", - "2023-09-12 474 99.40 98.900 98.918600 \n", - "2023-09-13 273 103.10 102.325 102.179688 \n", - "2023-09-13 273 103.10 102.325 102.179688 \n", - "2023-09-14 369 107.15 106.550 106.684328 \n", - "2023-09-14 369 107.15 106.550 106.684328 \n", - "2023-09-15 318 105.85 104.975 105.164054 \n", - "2023-09-15 318 105.85 104.975 105.164054 \n", - "2023-09-18 105 97.95 96.700 97.132692 \n", - "2023-09-18 105 97.95 96.700 97.132692 \n", - "2023-09-19 5 97.80 97.100 96.427344 \n", - "2023-09-19 5 97.80 97.100 96.427344 \n", - "2023-09-20 440 94.75 93.525 93.630864 \n", - "2023-09-20 440 94.75 93.525 93.630864 \n", - "2023-09-21 157 88.40 87.700 87.889879 \n", - "2023-09-21 157 88.40 87.700 87.889879 \n", - "2023-09-22 100 78.95 78.000 78.111453 \n", - "2023-09-22 100 78.95 78.000 78.111453 \n", - "2023-09-25 123 79.80 79.175 79.021626 \n", - "2023-09-25 123 79.80 79.175 79.021626 \n", - "2023-09-26 414 77.80 77.125 77.185395 \n", - "2023-09-26 414 77.80 77.125 77.185395 \n", - "2023-09-27 2 75.60 74.575 73.588679 \n", - "2023-09-27 2 75.60 74.575 73.588679 \n", - "2023-09-28 166 78.85 78.575 78.638148 \n", - "2023-09-28 166 78.85 78.575 78.638148 \n", - "2023-09-29 228 82.35 81.825 81.827313 \n", - "2023-09-29 228 82.35 81.825 81.827313 \n", - "2023-10-02 358 83.60 83.025 83.074734 \n", - "2023-10-02 358 83.60 83.025 83.074734 \n", - "2023-10-03 171 79.50 78.850 78.809041 \n", - "2023-10-03 171 79.50 78.850 78.809041 \n", - "2023-10-04 54 92.75 92.000 91.966814 \n", - "2023-10-04 54 92.75 92.000 91.966814 \n", - "2023-10-05 296 91.30 90.825 90.861273 \n", - "2023-10-05 296 91.30 90.825 90.861273 \n", - "2023-10-06 259 91.65 91.150 91.209395 \n", - "2023-10-06 259 91.65 91.150 91.209395 \n", - "2023-10-09 164 90.50 90.200 90.173333 \n", - "2023-10-09 164 90.50 90.200 90.173333 \n", - "2023-10-10 85 93.95 93.425 93.689823 \n", - "2023-10-10 85 93.95 93.425 93.689823 \n", - "2023-10-11 227 93.50 93.075 93.327018 \n", - "2023-10-11 227 93.50 93.075 93.327018 \n", - "2023-10-12 95 89.10 88.800 88.711111 \n", - "2023-10-12 95 89.10 88.800 88.711111 \n", - "2023-10-13 305 82.70 82.200 82.199182 \n", - "2023-10-13 305 82.70 82.200 82.199182 \n", - "2023-10-16 46 84.35 84.075 83.915000 \n", - "2023-10-16 46 84.35 84.075 83.915000 \n", - "2023-10-17 150 85.40 84.825 84.802885 \n", - "2023-10-17 150 85.40 84.825 84.802885 \n", - "2023-10-18 53 74.30 73.725 73.567466 \n", - "2023-10-18 53 74.30 73.725 73.567466 \n", - "2023-10-19 202 55.05 54.725 54.741927 \n", - "2023-10-19 202 55.05 54.725 54.741927 \n", - "2023-10-20 57 48.65 48.275 48.209783 \n", - "2023-10-20 57 48.65 48.275 48.209783 \n", - "2023-10-23 195 48.50 48.000 47.935268 \n", - "2023-10-23 195 48.50 48.000 47.935268 \n", - "2023-10-24 258 51.65 51.375 51.416036 \n", - "2023-10-24 258 51.65 51.375 51.416036 \n", - "2023-10-25 207 48.50 48.225 48.191720 \n", - "2023-10-25 207 48.50 48.225 48.191720 \n", - "2023-10-26 102 43.55 43.225 43.145556 \n", - "2023-10-26 102 43.55 43.225 43.145556 \n", - "2023-10-27 182 44.75 44.475 44.414807 \n", - "2023-10-27 182 44.75 44.475 44.414807 \n", - "2023-10-30 41 37.15 36.925 36.768081 \n", - "2023-10-30 41 37.15 36.925 36.768081 \n", - "2023-10-31 186 39.20 38.925 38.897700 \n", - "2023-10-31 186 39.20 38.925 38.897700 \n", - "2023-11-01 131 42.35 42.075 42.024455 \n", - "2023-11-01 131 42.35 42.075 42.024455 \n", - "2023-11-02 225 52.00 51.675 51.649693 \n", - "2023-11-02 225 52.00 51.675 51.649693 \n", - "2023-11-03 301 53.95 53.075 53.048229 \n", - "2023-11-03 301 53.95 53.075 53.048229 \n", - "2023-11-06 96 52.10 51.775 51.638520 \n", - "2023-11-06 96 52.10 51.775 51.638520 \n", - "2023-11-07 77 54.40 54.200 54.171111 \n", - "2023-11-07 77 54.40 54.200 54.171111 \n", - "2023-11-08 297 54.15 53.900 53.949395 \n", - "2023-11-08 297 54.15 53.900 53.949395 \n", - "2023-11-09 37 44.35 44.125 43.962360 \n", - "2023-11-09 37 44.35 44.125 43.962360 \n", - "2023-11-10 152 47.95 47.500 47.280691 \n", - "2023-11-10 152 47.95 47.500 47.280691 \n", - "2023-11-13 124 55.30 55.100 55.140777 \n", - "2023-11-13 124 55.30 55.100 55.140777 \n", - "2023-11-14 140 66.85 66.625 66.728125 \n", - "2023-11-14 140 66.85 66.625 66.728125 \n", - "2023-11-15 23 71.70 71.450 71.310577 \n", - "2023-11-15 23 71.70 71.450 71.310577 \n", - "2023-11-16 98 63.45 63.000 63.026757 \n", - "2023-11-16 98 63.45 63.000 63.026757 \n", - "2023-11-17 228 64.80 63.625 63.654045 \n", - "2023-11-17 228 64.80 63.625 63.654045 \n", - "2023-11-20 157 64.65 64.375 64.379450 \n", - "2023-11-20 157 64.65 64.375 64.379450 \n", - "2023-11-21 217 69.60 69.300 69.307075 \n", - "2023-11-21 217 69.60 69.300 69.307075 \n", - "2023-11-22 193 63.10 62.900 62.906971 \n", - "2023-11-22 193 63.10 62.900 62.906971 \n", - "2023-11-24 208 64.10 63.875 63.890617 \n", - "2023-11-24 208 64.10 63.875 63.890617 \n", - "2023-11-27 265 64.50 64.175 64.184466 \n", - "2023-11-27 265 64.50 64.175 64.184466 \n", - "2023-11-28 53 74.25 73.725 73.740291 \n", - "2023-11-28 53 74.25 73.725 73.740291 \n", - "2023-11-29 137 71.70 71.225 71.310991 \n", - "2023-11-29 137 71.70 71.225 71.310991 \n", - "2023-11-30 36 67.80 67.250 67.188889 \n", - "2023-11-30 36 67.80 67.250 67.188889 \n", - "2023-12-01 127 66.35 65.950 65.922161 \n", - "2023-12-01 127 66.35 65.950 65.922161 \n", - "2023-12-04 149 63.30 62.975 63.055230 \n", - "2023-12-04 149 63.30 62.975 63.055230 \n", - "2023-12-05 14 66.00 65.700 65.633333 \n", - "2023-12-05 14 66.00 65.700 65.633333 \n", - "2023-12-06 249 66.55 66.125 66.194509 \n", - "2023-12-06 249 66.55 66.125 66.194509 \n", - "2023-12-07 36 69.45 69.050 69.044521 \n", - "2023-12-07 36 69.45 69.050 69.044521 \n", - "2023-12-08 16 70.35 69.825 69.488764 \n", - "2023-12-08 16 70.35 69.825 69.488764 \n", - "2023-12-11 85 66.25 66.025 66.118750 \n", - "2023-12-11 85 66.25 66.025 66.118750 \n", - "2023-12-12 109 63.60 63.375 63.422500 \n", - "2023-12-12 109 63.60 63.375 63.422500 \n", - "2023-12-13 20 65.80 65.250 64.820879 \n", - "2023-12-13 20 65.80 65.250 64.820879 \n", - "2023-12-14 19 76.55 76.300 76.321429 \n", - "2023-12-14 19 76.55 76.300 76.321429 \n", - "2023-12-15 26 78.80 78.275 78.237500 \n", - "2023-12-15 26 78.80 78.275 78.237500 \n", - "2023-12-18 29 77.25 76.950 76.972222 \n", - "2023-12-18 29 77.25 76.950 76.972222 \n", - "2023-12-19 29 82.00 81.725 81.769000 \n", - "2023-12-19 29 82.00 81.725 81.769000 \n", - "2023-12-20 16 72.75 72.400 72.261321 \n", - "2023-12-20 16 72.75 72.400 72.261321 \n", - "2023-12-21 30 79.60 79.150 79.190909 \n", - "2023-12-21 30 79.60 79.150 79.190909 \n", - "2023-12-22 40 77.45 77.225 77.253521 \n", - "2023-12-22 40 77.45 77.225 77.253521 \n", - "2023-12-26 27 81.15 80.850 80.824576 \n", - "2023-12-26 27 81.15 80.850 80.824576 \n", - "2023-12-27 17 85.75 85.375 85.231818 \n", - "2023-12-27 17 85.75 85.375 85.231818 \n", - "2023-12-28 11 77.70 77.100 76.691304 \n", - "2023-12-28 11 77.70 77.100 76.691304 \n", - "2023-12-29 5 73.25 72.825 72.521429 \n", - "2023-12-29 5 73.25 72.825 72.521429 " - ] - }, - "execution_count": 270, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rm.option_data['TSLA20240315C180']" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[0;31mSignature:\u001b[0m\n", - "\u001b[0mrm\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mOrderPicker\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_order\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mtick\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mdate\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mright\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mmax_close\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0morder_settings\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mdict\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mdict\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mDocstring:\u001b[0m\n", - "returns the order for the given tick, date, right, max_close, and order_settings\n", - "\n", - "params:\n", - "tick: str: ticker to get the order for\n", - "date: str: date to get the order for\n", - "right: str: right of the option contract (P or C)\n", - "max_close: str: maximum close price\n", - "order_settings: dict: settings for the order\n", - " example: {'type': 'naked',\n", - " 'specifics': [{'direction': 'long',\n", - " 'rel_strike': .900,\n", - " 'dte': 365,\n", - " 'moneyness_width': 0.15},\n", - " {'direction': 'short',\n", - " 'rel_strike': .80,\n", - " 'dte': 365,\n", - " 'moneyness_width': 0.15}],\n", - "\n", - " 'name': 'vertical_spread'}\n", - "\n", - "returns:\n", - "dict: order\n", - "\u001b[0;31mFile:\u001b[0m ~/cloned_repos/QuantTools/EventDriven/riskmanager.py\n", - "\u001b[0;31mType:\u001b[0m method" - ] - } - ], - "source": [ - "rm.OrderPicker.get_order?" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Console Logging & File Logging Can be configured using STREAM_LOG_LEVEL and FILE_LOG_LEVEL in environment variables.\n", - "Propagate to root logger can be set using PROPAGATE_TO_ROOT_LOGGER in environment variables.\n", - "Example:\n", - "STREAM_LOG_LEVEL = 'DEBUG'\n", - "FILE_LOG_LEVEL = 'INFO'\n", - "PROPAGATE_TO_ROOT_LOGGER = 'False'\n", - "\n", - "Using Proxy URL: http://18.232.166.224:5500/thetadata\n" - ] - } - ], - "source": [ - "%load_ext autoreload\n", - "%autoreload 2\n", - "import os, sys\n", - "os.environ['STREAM_LOG_LEVEL'] = 'ERROR'\n", - "os.environ['FILE_LOG_LEVEL'] = 'DEBUG'\n", - "os.environ['PROPAGATE_TO_ROOT_LOGGER'] = 'False'\n", - "os.environ['PROPAGATE_TO_ROOT_LOGGER'], os.environ['STREAM_LOG_LEVEL']\n", - "from trade.assets.Stock import Stock\n", - "from trade.assets.Option import Option\n", - "from trade.assets.OptionStructure import OptionStructure\n", - "from trade.helpers.Context import Context, clear_context\n", - "from trade.helpers.helper import (change_to_last_busday, \n", - " is_USholiday, \n", - " is_busday, \n", - " setup_logger, \n", - " generate_option_tick, \n", - " get_option_specifics_from_key,\n", - " identify_length,\n", - " extract_numeric_value)\n", - "from scipy.stats import percentileofscore\n", - "from EventDriven.riskmanager import RiskManager\n", - "from dbase.DataAPI.ThetaData import (list_contracts, retrieve_openInterest, retrieve_eod_ohlc, retrieve_quote)\n", - "from pandas.tseries.offsets import BDay\n", - "from itertools import product\n", - "import pandas as pd\n", - "from trade.helpers.types import ResultsEnum\n", - "from copy import deepcopy\n", - "from concurrent.futures import ThreadPoolExecutor, as_completed\n", - "from pathos.multiprocessing import ProcessingPool as Pool\n", - "import numpy as np\n", - "import time\n", - "chain_cache = {}\n", - "close_cache = {}\n", - "oi_cache = {}\n", - "spot_cache = {}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## TEST IMPORT" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'L': ['AAPL20250620000235C'],\n", - " 'S': ['AAPL20250620000260C'],\n", - " 'trade_id': '&L:AAPL20250620000235C&S:AAPL20250620000260C',\n", - " 'close': 4.925000000000001}" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from EventDriven.riskmanager import RiskManager, spot_cache, oi_cache, close_cache, chain_cache\n", - "from pandas.tseries.offsets import BDay\n", - "import pandas as pd\n", - "\n", - "order_settings = {\n", - " 'type': 'spread',\n", - " 'specifics': [\n", - " {'direction': 'long', 'rel_strike': 1.0, 'dte': 365, 'moneyness_width': 0.15},\n", - " {'direction': 'short', 'rel_strike': 0.85, 'dte': 365, 'moneyness_width': 0.15} \n", - " ],\n", - " 'name': 'vertical_spread'\n", - " }\n", - "tick = 'AAPL'\n", - "date = '2024-07-24'\n", - "start = (pd.to_datetime(date) - BDay(30)).strftime('%Y-%m-%d')\n", - "right = 'C'\n", - "\n", - "rm = RiskManager(None, None, 1000000)\n", - "rm.OrderPicker.get_order(tick, date, 'C', 5, order_settings)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## SAMPLE ORDER" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "tick = 'BAC'\n", - "date = '2023-07-24'\n", - "start = (pd.to_datetime(date) - BDay(30)).strftime('%Y-%m-%d')\n", - "right = 'C'\n", - "order_settings = {\n", - " 'type': 'spread',\n", - " 'specifics': [\n", - " {'direction': 'long', 'rel_strike': 1.0, 'dte': 365, 'moneyness_width': 0.15},\n", - " # {'direction': 'short', 'rel_strike': 0.85, 'dte': 365, 'moneyness_width': 0.15} \n", - " ],\n", - " 'name': 'vertical_spread'\n", - " }" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## MULTIPROCESSING FUNCTION" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "from typing import List, Dict\n", - "from abc import ABC, abstractmethod\n", - "from pathos.multiprocessing import ProcessingPool as Pool\n", - "from pathos.multiprocessing import cpu_count\n", - "from pathos.pools import _ProcessPool\n", - "from threading import Thread\n", - "from functools import partial\n", - "from concurrent.futures import ThreadPoolExecutor\n", - "\n", - "shutdown_event = False\n", - "\n", - "def runProcesses(func, OrderedInputs: List[List], run_type: str = 'map') -> List:\n", - " global shutdown_event\n", - " try:\n", - "\n", - " pool = Pool(20)\n", - " pool.restart()\n", - " if run_type == 'map':\n", - " results = pool.map(func, *OrderedInputs)\n", - " elif run_type == 'amap':\n", - " results = pool.amap(func, *OrderedInputs)\n", - " elif run_type == 'uimap':\n", - " results = pool.uimap(func, *OrderedInputs)\n", - " elif run_type == 'imap':\n", - " results = pool.imap(func, *OrderedInputs)\n", - "\n", - " else:\n", - " raise ValueError(f'Run type {run_type} not recognized')\n", - "\n", - " except KeyboardInterrupt as e:\n", - "\n", - " shutdown_event = True\n", - " shutdown(pool)\n", - " raise\n", - "\n", - " except Exception as e:\n", - " print('Error occured: ', e)\n", - " shutdown(pool)\n", - "\n", - "\n", - " finally:\n", - " pool.close()\n", - " pool.join()\n", - "\n", - " return results\n", - "\n", - "\n", - "\n", - "def shutdown(pool):\n", - " global shutdown_event\n", - " shutdown_event\n", - " shutdown_event = True\n", - " pool.terminate()\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## RELEVANT FUNCTIONS" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "def return_closePrice(id, date):\n", - " global close_cache, spot_cache\n", - " cache_key = f\"{id}_{date}\"\n", - " close_data = close_cache[cache_key]\n", - " close_data = close_data[~close_data.index.duplicated(keep = 'first')]\n", - " close = close_data['Midpoint'][date]\n", - " return close\n", - "\n", - "\n", - "def load_chain(date, ticker, print_stderr = False):\n", - " print(date, ticker) if print_stderr else None\n", - " ## Get both calls and puts per moneyness. For 1 Moneyness, both will most be available. If not, if one is False, other True. \n", - " ## We will need to get two rows. \n", - " chain_key = f\"{date}_{ticker}\"\n", - " with Context(end_date = date):\n", - " if chain_key in chain_cache:\n", - " Option_Chain = chain_cache[chain_key]\n", - " else:\n", - " start_time = time.time()\n", - " Stock_obj = Stock(ticker, run_chain = False)\n", - " end_time = time.time()\n", - " print(f\"Time taken to get stock object: {end_time-start_time}\") if print_stderr else None\n", - " Option_Chain = Stock_obj.option_chain()\n", - " Spot = Stock_obj.spot(ts = False)\n", - " Spot = list(Spot.values())[0]\n", - " Option_Chain['Spot'] = Spot\n", - " Option_Chain['q'] = Stock_obj.div_yield()\n", - " Option_Chain['r'] = Stock_obj.rf_rate\n", - " chain_cache[chain_key] = Option_Chain\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "def populate_cache(order_candidates, date = '2024-03-12',):\n", - "\n", - " global close_cache, oi_cache, spot_cache\n", - "\n", - " tempholder1 = {}\n", - " tempholder2 = {}\n", - "\n", - " ## Create necessary data structures\n", - " ## Looping through the order candidates to get the necessary data, and organize into a list of lists that will be passed to runProcesses function\n", - " for j, direction in enumerate(order_candidates):\n", - " for i,data in enumerate(order_candidates[direction]):\n", - " data[[ 'exp', 'strike', 'symbol']] = data[[ 'expiration', 'strike', 'ticker']]\n", - " start = (pd.to_datetime(date) - BDay(20)).strftime('%Y-%m-%d')\n", - " data[['end_date', 'start_date']] = date, start\n", - " data['exp'] = data['exp'].dt.strftime('%Y-%m-%d')\n", - " tempholder1[i+j] = (data[['symbol', 'end_date', 'exp', 'right', 'start_date', 'strike']].T.values.tolist())\n", - " tempholder2[i+j] = data[['symbol', 'right', 'exp','strike']].T.values.tolist()\n", - "\n", - " ## Extending lists, to ensure only one runProcesses call is made, instead of run per side\n", - " for i, data in tempholder1.items():\n", - " if i == 0:\n", - " OrderedList = data\n", - " tickOrderedList = tempholder2[i]\n", - " else:\n", - " for position, vars in enumerate(data):\n", - " OrderedList[position].extend(vars)\n", - " for position, vars in enumerate(tempholder2[i]):\n", - " tickOrderedList[position].extend(vars)\n", - "\n", - " \n", - " eod_results = (runProcesses(retrieve_eod_ohlc, OrderedList, 'imap'))\n", - " oi_results = (runProcesses(retrieve_openInterest, OrderedList, 'imap'))\n", - " tick_results = (runProcesses(generate_option_tick, tickOrderedList, 'imap'))\n", - " tick_results = list(set(tick_results))\n", - "\n", - "\n", - " ## Save to Dictionary Cache\n", - " for tick, eod, oi in zip(tick_results, eod_results, oi_results):\n", - " cache_key = f\"{tick}_{date}\"\n", - " close_cache[cache_key] = eod\n", - " oi_cache[cache_key] = oi\n", - "\n", - "\n", - " ## Test1: Run spot_cache process after close_cache has been populate.\n", - " \n", - " spot_results = list(runProcesses(return_closePrice, [tick_results, [date]*len(tick_results)], 'imap')) \n", - " for tick, spot in zip(tick_results, spot_results):\n", - " cache_key = f\"{tick}_{date}\"\n", - " spot_cache[cache_key] = spot\n", - "\n", - "\n", - " ## Test2: We will edit the populate spot_cache populate function to make an api call instead of using the cache.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "def produce_order_candidates(settings, tick, date, right = 'P'):\n", - " order_candidates = {'long': [], 'short': []}\n", - " for spec in settings['specifics']:\n", - " chain = chain_details(date, tick, spec['dte'], spec['rel_strike'], right, moneyness_width = spec['moneyness_width'])\n", - " order_candidates[spec['direction']].append(chain)\n", - " return order_candidates\n", - "\n", - "\n", - "def liquidity_check(id, date, pass_threshold = 250):\n", - " sample_id = deepcopy(get_option_specifics_from_key(id))\n", - " new_dict_keys = {'ticker': 'symbol', 'exp_date': 'exp', 'strike': 'strike', 'put_call': 'right'}\n", - " transfer_dict = {}\n", - " for k, v in sample_id.items():\n", - "\n", - " if k in new_dict_keys:\n", - " if k == 'strike':\n", - " transfer_dict[new_dict_keys[k]] = float(sample_id[k])\n", - " else:\n", - " transfer_dict[new_dict_keys[k]] = sample_id[k]\n", - "\n", - " start = (pd.to_datetime(date) - BDay(10)).strftime('%Y-%m-%d')\n", - " oi_data = retrieve_openInterest(**transfer_dict, end_date=date, start_date=start)\n", - " # print(f'Open Interest > {pass_threshold} for {id}:', oi_data.Open_interest.mean() )\n", - " return oi_data.Open_interest.mean() > pass_threshold\n", - "\n", - "\n", - "def available_close_check(id, date, threshold = 0.7):\n", - " cache_key = f\"{id}_{date}\"\n", - " sample_id = deepcopy(get_option_specifics_from_key(id))\n", - " new_dict_keys = {'ticker': 'symbol', 'exp_date': 'exp', 'strike': 'strike', 'put_call': 'right'}\n", - " transfer_dict = {}\n", - " for k, v in sample_id.items():\n", - " if k in new_dict_keys:\n", - " if k == 'strike':\n", - " transfer_dict[new_dict_keys[k]] = float(sample_id[k])\n", - " else:\n", - " transfer_dict[new_dict_keys[k]] = sample_id[k]\n", - " \n", - " if cache_key in close_cache:\n", - " close_data_sample = close_cache[cache_key]\n", - " else:\n", - " start = (pd.to_datetime(date) - BDay(30)).strftime('%Y-%m-%d')\n", - " close_data_sample = retrieve_eod_ohlc(**transfer_dict, start_date=start, end_date=date)\n", - " close_cache[cache_key] = close_data_sample\n", - " close_mask_series = close_data_sample.Close != 0\n", - " return close_mask_series.sum()/len(close_mask_series) > threshold\n", - "\n", - "\n", - "def get_structure_price(tradeables, direction_index, date, tick, right = 'P'):\n", - " pack_price = {}\n", - " pack_dataframe = pd.DataFrame()\n", - " pack_dataframe['close'] = 0\n", - "\n", - " for pack_i, pack in enumerate(tradeables):\n", - " pack_close = 0\n", - " for i, id in enumerate(pack):\n", - " if id not in spot_cache:\n", - " \n", - " cache_key = f\"{id}_{date}\"\n", - " sample_id = deepcopy(get_option_specifics_from_key(id))\n", - " new_dict_keys = {'ticker': 'symbol', 'exp_date': 'exp', 'strike': 'strike', 'put_call': 'right'}\n", - " transfer_dict = {}\n", - " for k, v in sample_id.items():\n", - " if k in new_dict_keys:\n", - " if k == 'strike':\n", - " transfer_dict[new_dict_keys[k]] = float(sample_id[k])\n", - " else:\n", - " transfer_dict[new_dict_keys[k]] = sample_id[k]\n", - " start = (pd.to_datetime(date) - BDay(30)).strftime('%Y-%m-%d')\n", - " close_data_sample = retrieve_eod_ohlc(**transfer_dict, start_date=start, end_date=date)\n", - " close_data_sample = close_data_sample[~close_data_sample.index.duplicated(keep = 'first')]\n", - " close = close_data_sample['Midpoint'][date]\n", - " spot_cache[cache_key] = close\n", - " else:\n", - " close = cache_key[id]\n", - " pack_close += close * direction_index[i]\n", - " pack_dataframe.at[pack_i, i] = id\n", - "\n", - " pack_dataframe.at[pack_i, 'close'] = pack_close\n", - " return pack_dataframe\n", - "\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "def chain_details(date, ticker, tgt_dte, tgt_moneyness, right = 'P', moneyness_width = 0.15, print_stderr = False):\n", - " return_dataframe = pd.DataFrame()\n", - " errors = {}\n", - " if not (is_USholiday(date) and not is_busday(date)):\n", - " try:\n", - " print(date, ticker) if print_stderr else None\n", - " ## Get both calls and puts per moneyness. For 1 Moneyness, both will most be available. If not, if one is False, other True. \n", - " ## We will need to get two rows. \n", - " chain_key = f\"{date}_{ticker}\"\n", - " with Context(end_date = date):\n", - " if chain_key in chain_cache:\n", - " Option_Chain = chain_cache[chain_key]\n", - " else:\n", - " start_time = time.time()\n", - " Stock_obj = Stock(ticker, run_chain = False)\n", - " end_time = time.time()\n", - " print(f\"Time taken to get stock object: {end_time-start_time}\") if print_stderr else None\n", - " Option_Chain = Stock_obj.option_chain()\n", - " Spot = Stock_obj.spot(ts = False)\n", - " Spot = list(Spot.values())[0]\n", - " Option_Chain['Spot'] = Spot\n", - " Option_Chain['q'] = Stock_obj.div_yield()\n", - " Option_Chain['r'] = Stock_obj.rf_rate\n", - " chain_cache[chain_key] = Option_Chain\n", - "\n", - " \n", - " Option_Chain_Filtered = Option_Chain[Option_Chain[right.upper()] == True]\n", - " \n", - " \n", - " if right == 'P':\n", - " Option_Chain_Filtered['relative_moneyness'] = Option_Chain_Filtered.index.get_level_values('strike')/Option_Chain_Filtered.Spot\n", - " elif right == 'C':\n", - " Option_Chain_Filtered['relative_moneyness'] = Option_Chain_Filtered.Spot/Option_Chain_Filtered.index.get_level_values('strike')\n", - " else:\n", - " raise ValueError(f'Right dne. recieved {right}')\n", - " Option_Chain_Filtered['moneyness_spread'] = (tgt_moneyness-Option_Chain_Filtered['relative_moneyness'])**2\n", - " Option_Chain_Filtered['dte_spread'] = (Option_Chain_Filtered.index.get_level_values('DTE')-tgt_dte)**2\n", - " Option_Chain_Filtered.sort_values(by=['dte_spread','moneyness_spread'], inplace = True)\n", - " Option_Chain_Filtered = Option_Chain_Filtered.loc[Option_Chain_Filtered['dte_spread'] == Option_Chain_Filtered['dte_spread'].min()]\n", - " if float(moneyness_width) == 0.0:\n", - " option_details = Option_Chain_Filtered.sort_values('moneyness_spread', ascending=False).head(1)\n", - " else:\n", - " option_details = Option_Chain_Filtered[(Option_Chain_Filtered['relative_moneyness'] >= tgt_moneyness-moneyness_width) & \n", - " (Option_Chain_Filtered['relative_moneyness'] <= tgt_moneyness+moneyness_width)]\n", - " \n", - " if option_details.empty:\n", - " return None\n", - " \n", - " option_details['build_date'] = date\n", - " option_details['ticker'] = ticker\n", - " option_details['moneyness'] = tgt_moneyness\n", - " option_details['TGT_DTE'] = tgt_dte\n", - " option_details.reset_index(inplace = True)\n", - " option_details.set_index('build_date', inplace = True)\n", - " option_details['right'] = right\n", - " option_details.drop(columns = ['C','P'], inplace = True)\n", - " option_details['option_id'] = option_details.apply(lambda x: generate_option_tick(symbol = x['ticker'], \n", - " exp = x['expiration'].strftime('%Y-%m-%d'), strike = float(x['strike']), right = x['right']), axis = 1)\n", - " return_dataframe = pd.concat([return_dataframe, option_details])\n", - " clear_context()\n", - " return_dataframe.drop_duplicates(inplace = True)\n", - "\n", - " except Exception as e:\n", - " raise\n", - "\n", - " return return_dataframe.sort_values('relative_moneyness', ascending=False)\n", - " else:\n", - " return None, errors\n", - " \n", - "\n", - "# details= chain_details('2024-03-12', 'TSLA', 365, 0.7, moneyness_width = 0.00)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## CREATING ORDERPICKER AND TESTING" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'result': 'SUCCESSFUL',\n", - " 'data': {'long': ['TSLA20250620000215C'],\n", - " 'short': ['TSLA20250620000235C'],\n", - " 'trade_id': '&L:TSLA20250620000215C&S:TSLA20250620000235C',\n", - " 'close': 9.674999999999997}}" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "class OrderPicker:\n", - " def __init__(self):\n", - " self.liquidity_threshold = 250\n", - " self.data_availability_threshold = 0.7\n", - " self.lookback = 30\n", - "\n", - " def get_order(self, \n", - " tick, \n", - " date,\n", - " right, \n", - " max_close,\n", - " order_settings):\n", - " \n", - " ## Create necessary data structures\n", - " direction_index = {}\n", - " str_direction_index = {}\n", - " for indx, v in enumerate(order_settings['specifics']):\n", - " if v['direction'] == 'long':\n", - " str_direction_index[indx] = 'long'\n", - " direction_index[indx] = 1\n", - " elif v['direction'] == 'short':\n", - " str_direction_index[indx] = 'short'\n", - " direction_index[indx] = -1\n", - "\n", - "\n", - " load_chain(date, 'TSLA')\n", - " order_candidates = produce_order_candidates(order_settings, tick, date, right)\n", - "\n", - " if any([x2 is None for x in order_candidates.values() for x2 in x]):\n", - " return {\n", - " 'result': ResultsEnum.MONEYNESS_TOO_TIGHT.value,\n", - " 'data': None\n", - " } \n", - "\n", - "\n", - " populate_cache(order_candidates, date=date)\n", - "\n", - "\n", - " for direction in order_candidates:\n", - " for i,data in enumerate(order_candidates[direction]):\n", - " data['liquidity_check'] = data.option_id.apply(lambda x: liquidity_check(x, date))\n", - " data = data[data.liquidity_check == True]\n", - " data['available_close_check'] = data.option_id.apply(lambda x: available_close_check(x, date))\n", - " order_candidates[direction][i] = data[data.available_close_check == True] \n", - "\n", - "\n", - "\n", - "\n", - " ## Filter Unique Combinations per leg.\n", - " unique_ids = {'long': [], 'short': []}\n", - " for direction in order_candidates:\n", - " for i,data in enumerate(order_candidates[direction]):\n", - " unique_ids[direction].append(data[(data.liquidity_check == True) & (data.available_close_check == True)].option_id.unique().tolist())\n", - "\n", - " ## Produce Tradeable Combinations\n", - " tradeable_ids = list(product(*unique_ids['long'], *unique_ids['short']))\n", - " tradeable_ids, unique_ids \n", - "\n", - " ## Keep only unique combinations. Not repeating a contract.\n", - " filtered = [t for t in tradeable_ids if len(set(t)) == len(t)]\n", - "\n", - " ## Get the price of the structure\n", - " ## Using List Comprehension to sum the prices of the structure per index\n", - " results = [\n", - " (*items, sum([direction_index[i] * spot_cache[f'{item}_{date}'] for i, item in enumerate(items)])) for items in filtered\n", - " ]\n", - "\n", - " ## Convert to DataFrame, and sort by the price of the structure.\n", - " return_dataframe = pd.DataFrame(results)\n", - " cols = return_dataframe.columns.tolist()\n", - " cols[-1] = 'close'\n", - " return_dataframe.columns= cols\n", - " return_dataframe = return_dataframe[(return_dataframe.close<= max_close) & (return_dataframe.close> 0)].sort_values('close', ascending = False).head(1)\n", - "\n", - "\n", - " if return_dataframe.empty:\n", - " return {\n", - " 'result': ResultsEnum.MONEYNESS_TOO_TIGHT.value,\n", - " 'data': None\n", - " } \n", - " \n", - " ## Rename the columns to the direction names\n", - " return_dataframe.columns = list(str_direction_index.values()) + ['close']\n", - " return_order = return_dataframe[list(str_direction_index.values())].to_dict(orient = 'list')\n", - " return_order\n", - "\n", - " ## Create the trade_id with the direction and the id of the contract.\n", - " id = ''\n", - " for k, v in return_order.items():\n", - " id += f\"&{k[0].upper()}:{v[0]}\"\n", - "\n", - " return_order['trade_id'] = id\n", - " return_order['close'] = return_dataframe.close.values[0]\n", - " return_dict = {\n", - " 'result': ResultsEnum.SUCCESSFUL.value,\n", - " 'data': return_order\n", - " }\n", - "\n", - "\n", - " return return_dict\n", - "\n", - "\n", - "order_settings = {\n", - " 'type': 'spread',\n", - " 'specifics': [\n", - " {'direction': 'long', 'rel_strike': 1.0, 'dte': 365, 'moneyness_width': 0.10},\n", - " {'direction': 'short', 'rel_strike': 0.85, 'dte': 365, 'moneyness_width': 0.10} \n", - " ],\n", - " 'name': 'vertical_spread',\n", - " }\n", - "\n", - "\n", - "tick = 'TSLA'\n", - "date = '2024-07-24'\n", - "start = (pd.to_datetime(date) - BDay(30)).strftime('%Y-%m-%d')\n", - "right = 'P'\n", - "\n", - "\n", - "picker = OrderPicker()\n", - "er = picker.get_order(tick, date, 'C', 10, order_settings)\n", - "er" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[1, 4, 9, 16, 25]" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from multiprocessing import set_start_method\n", - "set_start_method(\"fork\", force = True)\n", - "from trade.helpers.pools import runProcesses\n", - "\n", - "def test_func(x):\n", - " return x**2\n", - "\n", - "if __name__ == '__main__':\n", - " results = runProcesses(test_func, [[1,2,3,4,5]], 'imap')\n", - "list(results)" - ] - }, - { - "cell_type": "code", - "execution_count": 424, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'L': ['TSLA20250321000165C'],\n", - " 'S': ['TSLA20250321000200C'],\n", - " 'trade_id': '&L:TSLA20250321000165C&S:TSLA20250321000200C',\n", - " 'close': 9.674999999999997}" - ] - }, - "execution_count": 424, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "class RiskManager:\n", - " def __init__(self,\n", - " bars,\n", - " events,\n", - " initial_capital,\n", - " ):\n", - " self.bars = bars\n", - " self.events = events\n", - " self.initial_capital = initial_capital\n", - " # self.symbol_list = self.bars.symbol_list\n", - " self.OrderPicker = OrderPicker()\n", - "\n", - "\n", - " def get_order(self, symbol, date, order_settings):\n", - " pass\n", - "\n", - "\n", - "\n", - "rm = RiskManager(None, None, 1000000)\n", - "rm.OrderPicker.get_order(tick, date, 'C', 10, order_settings)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## DRY RUN" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ - { - "ename": "TypeError", - "evalue": "'NoneType' object is not subscriptable", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[35], line 31\u001b[0m\n\u001b[1;32m 27\u001b[0m load_chain(date, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mTSLA\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m 28\u001b[0m order_candidates \u001b[38;5;241m=\u001b[39m produce_order_candidates(order_settings, tick, date, right)\n\u001b[0;32m---> 31\u001b[0m \u001b[43mpopulate_cache\u001b[49m\u001b[43m(\u001b[49m\u001b[43morder_candidates\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdate\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdate\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 34\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m direction \u001b[38;5;129;01min\u001b[39;00m order_candidates:\n\u001b[1;32m 35\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i,data \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28menumerate\u001b[39m(order_candidates[direction]):\n", - "Cell \u001b[0;32mIn[12], line 12\u001b[0m, in \u001b[0;36mpopulate_cache\u001b[0;34m(order_candidates, date)\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m j, direction \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28menumerate\u001b[39m(order_candidates):\n\u001b[1;32m 11\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i,data \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28menumerate\u001b[39m(order_candidates[direction]):\n\u001b[0;32m---> 12\u001b[0m data[[ \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mexp\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mstrike\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124msymbol\u001b[39m\u001b[38;5;124m'\u001b[39m]] \u001b[38;5;241m=\u001b[39m \u001b[43mdata\u001b[49m\u001b[43m[\u001b[49m\u001b[43m[\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mexpiration\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mstrike\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mticker\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m]\u001b[49m\n\u001b[1;32m 13\u001b[0m start \u001b[38;5;241m=\u001b[39m (pd\u001b[38;5;241m.\u001b[39mto_datetime(date) \u001b[38;5;241m-\u001b[39m BDay(\u001b[38;5;241m20\u001b[39m))\u001b[38;5;241m.\u001b[39mstrftime(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m%\u001b[39m\u001b[38;5;124mY-\u001b[39m\u001b[38;5;124m%\u001b[39m\u001b[38;5;124mm-\u001b[39m\u001b[38;5;132;01m%d\u001b[39;00m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m 14\u001b[0m data[[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mend_date\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mstart_date\u001b[39m\u001b[38;5;124m'\u001b[39m]] \u001b[38;5;241m=\u001b[39m date, start\n", - "\u001b[0;31mTypeError\u001b[0m: 'NoneType' object is not subscriptable" - ] - } - ], - "source": [ - "max_close = 5\n", - "\n", - "\n", - "order_settings = {\n", - " 'type': 'spread',\n", - " 'specifics': [\n", - " {'direction': 'long', 'rel_strike': 1.0, 'dte': 365, 'moneyness_width': 0.01},\n", - " {'direction': 'short', 'rel_strike': 0.85, 'dte': 365, 'moneyness_width': 0.01} \n", - " ],\n", - " 'name': 'vertical_spread'\n", - " }\n", - "\n", - "\n", - "\n", - "\n", - "direction_index = {}\n", - "str_direction_index = {}\n", - "for indx, v in enumerate(order_settings['specifics']):\n", - " if v['direction'] == 'long':\n", - " str_direction_index[indx] = 'L'\n", - " direction_index[indx] = 1\n", - " elif v['direction'] == 'short':\n", - " str_direction_index[indx] = 'S'\n", - " direction_index[indx] = -1\n", - "\n", - "\n", - "load_chain(date, 'TSLA')\n", - "order_candidates = produce_order_candidates(order_settings, tick, date, right)\n", - "\n", - "if any([x2 is None for x in order_candidates.values() for x2 in x]):\n", - " return {\n", - " 'result': \"MONEYNESS_TOO_TIGHT\",\n", - " } \n", - "\n", - "\n", - "populate_cache(order_candidates, date=date)\n", - "\n", - "\n", - "for direction in order_candidates:\n", - " for i,data in enumerate(order_candidates[direction]):\n", - " data['liquidity_check'] = data.option_id.apply(lambda x: liquidity_check(x, date))\n", - " data = data[data.liquidity_check == True]\n", - " data['available_close_check'] = data.option_id.apply(lambda x: available_close_check(x, date))\n", - " order_candidates[direction][i] = data[data.available_close_check == True] \n", - "\n", - "\n", - "\n", - "## Filter Unique Combinations per leg.\n", - "unique_ids = {'long': [], 'short': []}\n", - "for direction in order_candidates:\n", - " for i,data in enumerate(order_candidates[direction]):\n", - " unique_ids[direction].append(data[(data.liquidity_check == True) & (data.available_close_check == True)].option_id.unique().tolist())\n", - "\n", - "## Produce Tradeable Combinations\n", - "tradeable_ids = list(product(*unique_ids['long'], *unique_ids['short']))\n", - "tradeable_ids, unique_ids \n", - "\n", - "## Keep only unique combinations. Not repeating a contract.\n", - "filtered = [t for t in tradeable_ids if len(set(t)) == len(t)]\n", - "\n", - "## Get the price of the structure\n", - "## Using List Comprehension to sum the prices of the structure per index\n", - "results = [\n", - " (*items, sum([direction_index[i] * spot_cache[f'{item}_{date}'] for i, item in enumerate(items)])) for items in filtered\n", - "]\n", - "\n", - "## Convert to DataFrame, and sort by the price of the structure.\n", - "return_dataframe = pd.DataFrame(results)\n", - "cols = return_dataframe.columns.tolist()\n", - "cols[-1] = 'close'\n", - "return_dataframe.columns= cols\n", - "return_dataframe = return_dataframe[(return_dataframe.close<= max_close) & (return_dataframe.close> 0)].sort_values('close', ascending = False).head(1)\n", - "\n", - "## Rename the columns to the direction names\n", - "return_dataframe.columns = list(str_direction_index.values()) + ['close']\n", - "return_order = return_dataframe[list(str_direction_index.values())].to_dict(orient = 'list')\n", - "return_order\n", - "\n", - "## Create the trade_id with the direction and the id of the contract.\n", - "id = ''\n", - "for k, v in return_order.items():\n", - " id += f\"&{k}:{v[0]}\"\n", - "\n", - "return_order['trade_id'] = id\n", - "return_order['close'] = return_dataframe.close.values[0]\n", - "\n", - "return_order" - ] - }, - { - "cell_type": "code", - "execution_count": 73, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[0;31mType:\u001b[0m dict\n", - "\u001b[0;31mString form:\u001b[0m {}\n", - "\u001b[0;31mLength:\u001b[0m 0\n", - "\u001b[0;31mDocstring:\u001b[0m \n", - "dict() -> new empty dictionary\n", - "dict(mapping) -> new dictionary initialized from a mapping object's\n", - " (key, value) pairs\n", - "dict(iterable) -> new dictionary initialized as if via:\n", - " d = {}\n", - " for k, v in iterable:\n", - " d[k] = v\n", - "dict(**kwargs) -> new dictionary initialized with the name=value pairs\n", - " in the keyword argument list. For example: dict(one=1, two=2)" - ] - } - ], - "source": [ - "from trade.helpers.types import PositionData\n", - "def prineter(x,y) -> PositionData:\n", - " return " - ] - }, - { - "cell_type": "code", - "execution_count": 80, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'long': [3]}" - ] - }, - "execution_count": 80, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from typing import TypedDict\n", - "class PositionData( TypedDict): \n", - " long: list[str]\n", - " short: list[str]\n", - "\n", - " def __setitem__(self, key, value):\n", - " if (key == 'long' or key == 'short') and not isinstance(value, list):\n", - " raise ValueError(f'{key} must be a list')\n", - " \n", - " if key == 'long':\n", - " self.long = value\n", - " elif key == 'short':\n", - " self.short = value\n", - " else:\n", - " raise ValueError(f'Key {key} not recognized')\n", - " super().__setitem__(key, value)\n", - "\n", - "rr = PositionData()\n", - "rr['long'] = [3]\n", - "rr" - ] - }, - { - "cell_type": "code", - "execution_count": 82, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "John\n" - ] - } - ], - "source": [ - "from typing import TypedDict\n", - "\n", - "class Person(TypedDict):\n", - " name: str\n", - " age: int\n", - "\n", - "# Static type checking\n", - "person: Person = {\"name\": \"John\", \"age\": 30} # OK\n", - "person = {\"name\": \"John\"} # Error (age is missing)\n", - "\n", - "# Runtime behavior\n", - "print(person['name']) # No runtime type enforcement, behaves like a regular dictionary\n" - ] - }, - { - "cell_type": "code", - "execution_count": 86, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'name': 'John'}" - ] - }, - "execution_count": 86, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "person: Person = {\"name\": \"John\", \"age\": 30}\n", - "person = {\"name\": \"John\"} \n", - "person" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
LSclose
\n", - "
" - ], - "text/plain": [ - "Empty DataFrame\n", - "Columns: [L, S, close]\n", - "Index: []" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "return_dataframe" - ] - }, - { - "cell_type": "code", - "execution_count": 92, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Starting task: https://api.github.com\n", - "Starting task: https://api.spacexdata.com/v4/launches/latest\n", - "Starting task: https://jsonplaceholder.typicode.com/todos/1\n", - "Completed task: https://api.github.com\n", - "Completed task: https://api.spacexdata.com/v4/launches/latest\n", - "Completed task: https://jsonplaceholder.typicode.com/todos/1\n", - "{'current_user_url': 'https://api.github.com/user', 'current_user_authorizations_html_url': 'https://github.com/settings/connections/applications{/client_id}', 'authorizations_url': 'https://api.github.com/authorizations', 'code_search_url': 'https://api.github.com/search/code?q={query}{&page,per_page,sort,order}', 'commit_search_url': 'https://api.github.com/search/commits?q={query}{&page,per_page,sort,order}', 'emails_url': 'https://api.github.com/user/emails', 'emojis_url': 'https://api.github.com/emojis', 'events_url': 'https://api.github.com/events', 'feeds_url': 'https://api.github.com/feeds', 'followers_url': 'https://api.github.com/user/followers', 'following_url': 'https://api.github.com/user/following{/target}', 'gists_url': 'https://api.github.com/gists{/gist_id}', 'hub_url': 'https://api.github.com/hub', 'issue_search_url': 'https://api.github.com/search/issues?q={query}{&page,per_page,sort,order}', 'issues_url': 'https://api.github.com/issues', 'keys_url': 'https://api.github.com/user/keys', 'label_search_url': 'https://api.github.com/search/labels?q={query}&repository_id={repository_id}{&page,per_page}', 'notifications_url': 'https://api.github.com/notifications', 'organization_url': 'https://api.github.com/orgs/{org}', 'organization_repositories_url': 'https://api.github.com/orgs/{org}/repos{?type,page,per_page,sort}', 'organization_teams_url': 'https://api.github.com/orgs/{org}/teams', 'public_gists_url': 'https://api.github.com/gists/public', 'rate_limit_url': 'https://api.github.com/rate_limit', 'repository_url': 'https://api.github.com/repos/{owner}/{repo}', 'repository_search_url': 'https://api.github.com/search/repositories?q={query}{&page,per_page,sort,order}', 'current_user_repositories_url': 'https://api.github.com/user/repos{?type,page,per_page,sort}', 'starred_url': 'https://api.github.com/user/starred{/owner}{/repo}', 'starred_gists_url': 'https://api.github.com/gists/starred', 'topic_search_url': 'https://api.github.com/search/topics?q={query}{&page,per_page}', 'user_url': 'https://api.github.com/users/{user}', 'user_organizations_url': 'https://api.github.com/user/orgs', 'user_repositories_url': 'https://api.github.com/users/{user}/repos{?type,page,per_page,sort}', 'user_search_url': 'https://api.github.com/search/users?q={query}{&page,per_page,sort,order}'}\n", - "{'fairings': None, 'links': {'patch': {'small': 'https://images2.imgbox.com/eb/d8/D1Yywp0w_o.png', 'large': 'https://images2.imgbox.com/33/2e/k6VE4iYl_o.png'}, 'reddit': {'campaign': None, 'launch': 'https://www.reddit.com/r/spacex/comments/xvm76j/rspacex_crew5_launchcoast_docking_discussion_and/', 'media': None, 'recovery': None}, 'flickr': {'small': [], 'original': []}, 'presskit': None, 'webcast': 'https://youtu.be/5EwW8ZkArL4', 'youtube_id': '5EwW8ZkArL4', 'article': None, 'wikipedia': 'https://en.wikipedia.org/wiki/SpaceX_Crew-5'}, 'static_fire_date_utc': None, 'static_fire_date_unix': None, 'net': False, 'window': None, 'rocket': '5e9d0d95eda69973a809d1ec', 'success': True, 'failures': [], 'details': None, 'crew': ['62dd7196202306255024d13c', '62dd71c9202306255024d13d', '62dd7210202306255024d13e', '62dd7253202306255024d13f'], 'ships': [], 'capsules': ['617c05591bad2c661a6e2909'], 'payloads': ['62dd73ed202306255024d145'], 'launchpad': '5e9e4502f509094188566f88', 'flight_number': 187, 'name': 'Crew-5', 'date_utc': '2022-10-05T16:00:00.000Z', 'date_unix': 1664985600, 'date_local': '2022-10-05T12:00:00-04:00', 'date_precision': 'hour', 'upcoming': False, 'cores': [{'core': '633d9da635a71d1d9c66797b', 'flight': 1, 'gridfins': True, 'legs': True, 'reused': False, 'landing_attempt': True, 'landing_success': True, 'landing_type': 'ASDS', 'landpad': '5e9e3033383ecbb9e534e7cc'}], 'auto_update': True, 'tbd': False, 'launch_library_id': 'f33d5ece-e825-4cd8-809f-1d4c72a2e0d3', 'id': '62dd70d5202306255024d139'}\n", - "{'userId': 1, 'id': 1, 'title': 'delectus aut autem', 'completed': False}\n", - "Total time taken: 0.1384739875793457 seconds\n" - ] - } - ], - "source": [ - "import aiohttp\n", - "import asyncio\n", - "import time\n", - "\n", - "async def fetch_data(session, url):\n", - " print(f\"Starting task: {url}\")\n", - " async with session.get(url) as response:\n", - " data = await response.json()\n", - " print(f\"Completed task: {url}\")\n", - " return data\n", - "\n", - "async def main():\n", - " urls = [\n", - " 'https://api.github.com',\n", - " 'https://api.spacexdata.com/v4/launches/latest',\n", - " 'https://jsonplaceholder.typicode.com/todos/1'\n", - " ]\n", - " \n", - " async with aiohttp.ClientSession() as session:\n", - " tasks = [fetch_data(session, url) for url in urls]\n", - " results = await asyncio.gather(*tasks)\n", - " \n", - " for result in results:\n", - " print(result)\n", - "\n", - "if __name__ == '__main__':\n", - " start_time = time.time()\n", - " asyncio.run(main())\n", - " print(f\"Total time taken: {time.time() - start_time} seconds\")\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Steps to producing an order:\n", - "\n", - "- S1: RM recieves order settings from PM\n", - "- S2: RM produces a dataframe of potential options based on settings (if two legs produce two dataframes)\n", - "- S3: RM assesses if option passes all checks\n", - " - C1: Minimum Available close\n", - " - C2: Liquidity (Open Interest)\n", - " - C2.5: (for Spreads only) Ensure both legs are not the same\n", - " - Optional, to extend:\n", - " - C3: Bid-Ask Spread\n", - " \n", - "- S4: Return picked order to portfolio manager, which places the order. \n", - "- Example:\n", - " {'long': [optionid or {'strike', 'exp'}], 'short' : []}" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import os\n", - "eval(os.environ['ASYNC'])" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "openbb", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.13" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/EventDriven/demos/attributor.ipynb b/EventDriven/demos/attributor.ipynb deleted file mode 100644 index 8f5c492..0000000 --- a/EventDriven/demos/attributor.ipynb +++ /dev/null @@ -1,1223 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Console Logging & File Logging Can be configured using STREAM_LOG_LEVEL and FILE_LOG_LEVEL in environment variables.\n", - "Propagate to root logger can be set using PROPAGATE_TO_ROOT_LOGGER in environment variables.\n", - "Example:\n", - "STREAM_LOG_LEVEL = 'DEBUG'\n", - "FILE_LOG_LEVEL = 'INFO'\n", - "PROPAGATE_TO_ROOT_LOGGER = 'False'\n", - "\n", - "2025-03-19 22:14:32 trade.helpers.Logging INFO: Logging Root Directory: /Users/chiemelienwanisobi/cloned_repos/QuantTools/logs\n", - "Using Proxy URL: http://18.232.166.224:5500/thetadata\n" - ] - } - ], - "source": [ - "from EventDriven.attributor import EVBAttributor\n", - "import pandas as pd\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[0;31mSignature:\u001b[0m\n", - "\u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mSeries\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto_string\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mbuf\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;34m'FilePath | WriteBuffer[str] | None'\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mna_rep\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;34m'str'\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'NaN'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mfloat_format\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;34m'str | None'\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mheader\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;34m'bool'\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mindex\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;34m'bool'\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mlength\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;34m'bool'\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;34m'bool'\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;34m'bool'\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mmax_rows\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;34m'int | None'\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mmin_rows\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;34m'int | None'\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0;34m'str | None'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mDocstring:\u001b[0m\n", - "Render a string representation of the Series.\n", - "\n", - "Parameters\n", - "----------\n", - "buf : StringIO-like, optional\n", - " Buffer to write to.\n", - "na_rep : str, optional\n", - " String representation of NaN to use, default 'NaN'.\n", - "float_format : one-parameter function, optional\n", - " Formatter function to apply to columns' elements if they are\n", - " floats, default None.\n", - "header : bool, default True\n", - " Add the Series header (index name).\n", - "index : bool, optional\n", - " Add index (row) labels, default True.\n", - "length : bool, default False\n", - " Add the Series length.\n", - "dtype : bool, default False\n", - " Add the Series dtype.\n", - "name : bool, default False\n", - " Add the Series name if not None.\n", - "max_rows : int, optional\n", - " Maximum number of rows to show before truncating. If None, show\n", - " all.\n", - "min_rows : int, optional\n", - " The number of rows to display in a truncated repr (when number\n", - " of rows is above `max_rows`).\n", - "\n", - "Returns\n", - "-------\n", - "str or None\n", - " String representation of Series if ``buf=None``, otherwise None.\n", - "\n", - "Examples\n", - "--------\n", - ">>> ser = pd.Series([1, 2, 3]).to_string()\n", - ">>> ser\n", - "'0 1\\n1 2\\n2 3'\n", - "\u001b[0;31mFile:\u001b[0m ~/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py\n", - "\u001b[0;31mType:\u001b[0m function" - ] - } - ], - "source": [ - "import pandas as pd\n", - "pd.Series.to_string?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
TickerPnLReturnPctEntryPriceEntryCommissionEntrySlippageEntryMarketValueTotalEntryCostAuxilaryEntryCostExitPrice...ExitSlippageExitMarketValueTotalExitCostAuxilaryExitCostQuantityEntryTimeExitTimeDurationPositionsSignalID
0SBUX-765.808141-0.395094193.82934713.0125.2934681925.29346819.382935138.293468117.248533...-89.5146731185.48532711.724853102.514673102023-01-042023-03-1469&L:SBUX20240119C115&S:SBUX20240119C120SBUX20230104LONG
1BA-7.273412-0.017810204.1937122.615.787423405.7874234.08387418.387423200.557006...-21.285988403.7140124.01114023.88598822023-01-042023-09-11250&L:BA20240119C220&S:BA20240119C225BA20230104LONG
2NVDA3727.8930751.346659197.73243418.2125.0540782750.05407827.682541143.254078464.010511...-275.6528476514.34715364.961472293.852847142023-01-192023-12-20335&L:NVDA20240119C205&S:NVDA20240119C210NVDA20230119LONG
3NFLX-571.844768-0.589678161.6262847.861.957704961.9577049.69757769.75770466.318823...-14.287064405.7129363.97912922.08706462023-01-242023-09-27246&L:NFLX20240119C455&S:NFLX20240119C460NFLX20230124LONG
4META968.6266111.738711185.6982233.920.694668553.1946685.57094724.594668508.573760...-45.3787211529.62127915.25721349.27872132023-01-302023-12-21325&L:META20240119C165&S:META20240119C170META20230130LONG
5AMD154.1004850.075023171.16950115.658.4340102038.43401020.54034074.034010184.011208...-86.2655052223.73449522.081345101.865505122023-02-022023-09-21231&L:AMD20240119C100&S:AMD20240119C105AMD20230202LONG
6AAPL-325.462116-0.187831192.52631911.733.5368691721.03686917.32736945.236869156.363861...-66.0252471418.97475314.07274877.72524792023-02-032023-02-2724&L:AAPL20240119C170&S:AAPL20240119C175AAPL20230203LONG
7AAPL226.6120330.160565201.6204009.189.7428021402.24280214.11342898.842802233.993548...-102.9451641647.05483616.379548112.04516472023-03-062023-10-26234&L:AAPL20240315C170&S:AAPL20240315C175AAPL20230306LONG
8SBUX-314.507168-0.256819204.1041697.876.8250111216.82501112.24625084.625011151.686307...-57.082156917.9178449.10117864.88215662023-04-192023-05-0415&L:SBUX20240119C115&S:SBUX20240119C120SBUX20230418LONG
9AMZN511.0066500.535457190.8675166.535.337582947.8375829.54337641.837582293.068846...-28.1557681471.84423214.65344234.65576852023-04-282023-10-26181&L:AMZN20240315C135&S:AMZN20240315C145AMZN20230428LONG
10TSLA-343.834981-0.196904194.02309911.747.0078911734.50789117.46207958.707891155.819212...-70.9270901414.07291014.02372982.62709092023-06-022023-10-23143&L:TSLA20240621C266.67&S:TSLA20240621C273.33TSLA20230602LONG
11COST3194.0153672.708296589.6725502.671.7451001176.74510011.79345174.3451002186.680233...-154.0395344375.96046643.733605156.63953422023-07-032023-12-29179&L:COST20240621C550&S:COST20240621C560COST20230703LONG
12NFLX217.9054940.626191347.9858811.39.185881346.6858813.47985910.485881565.891375...-37.808625567.1913755.65891439.10862512023-10-202023-12-2970&L:NFLX20240920C450&S:NFLX20240920C460NFLX20231020LONG
13AAPL852.9196210.537489198.35738510.456.4590811576.45908115.86859166.859081304.972338...-85.8212982450.17870224.39778796.22129882023-11-032023-12-2956&L:AAPL20240920C220&S:AAPL20240920C235AAPL20231103LONG
14SBUX-511.000015-0.546811186.9018916.553.009453928.0094539.34509559.50945384.701888...-29.990562430.0094384.23509436.49056252023-11-082023-12-0527&L:SBUX20250117C115&S:SBUX20250117C120SBUX20231108LONG
15AMD910.2554220.400891206.41642214.356.2806472256.28064722.70580670.580647289.166915...-214.8639313195.13606931.808361229.163931112023-11-092023-12-2950&L:AMD20240920C120&S:AMD20240920C125AMD20231109LONG
16AMZN12.9077920.009202200.3820269.128.5741801393.57418014.02674237.674180202.225996...-115.3180281424.68197214.155820124.41802872023-11-142023-12-2945&L:AMZN20240920C160&S:AMZN20240920C165AMZN20231114LONG
17TSLA-123.752305-0.089618197.2688589.141.7820091371.78200913.80882050.882009179.589958...-63.7702961266.22970412.57129772.87029672023-11-152023-12-2944&L:TSLA20240920C270&S:TSLA20240920C275TSLA20231115LONG
18BA184.6989880.708846260.5628251.36.762825259.2628252.6056288.062825445.261813...-18.438187446.5618134.45261819.73818712023-11-242023-12-2935&L:BA20250117C270&S:BA20250117C280BA20231124LONG
19NVDA156.5631030.026128285.33779727.3294.7937305964.79373059.920937322.093730292.793183...-386.5431666175.95683461.486568413.843166212023-12-202023-12-299&L:NVDA20241220C590&S:NVDA20241220C600NVDA20230119LONG
20META-113.664637-0.076916184.72292110.447.3833721467.38337214.77783457.783372170.514842...-45.4812651374.51873513.64118755.88126582023-12-212023-12-298&L:META20250117C400&S:META20250117C405META20230130LONG
\n", - "

21 rows × 21 columns

\n", - "
" - ], - "text/plain": [ - " Ticker PnL ReturnPct EntryPrice EntryCommission EntrySlippage \\\n", - "0 SBUX -765.808141 -0.395094 193.829347 13.0 125.293468 \n", - "1 BA -7.273412 -0.017810 204.193712 2.6 15.787423 \n", - "2 NVDA 3727.893075 1.346659 197.732434 18.2 125.054078 \n", - "3 NFLX -571.844768 -0.589678 161.626284 7.8 61.957704 \n", - "4 META 968.626611 1.738711 185.698223 3.9 20.694668 \n", - "5 AMD 154.100485 0.075023 171.169501 15.6 58.434010 \n", - "6 AAPL -325.462116 -0.187831 192.526319 11.7 33.536869 \n", - "7 AAPL 226.612033 0.160565 201.620400 9.1 89.742802 \n", - "8 SBUX -314.507168 -0.256819 204.104169 7.8 76.825011 \n", - "9 AMZN 511.006650 0.535457 190.867516 6.5 35.337582 \n", - "10 TSLA -343.834981 -0.196904 194.023099 11.7 47.007891 \n", - "11 COST 3194.015367 2.708296 589.672550 2.6 71.745100 \n", - "12 NFLX 217.905494 0.626191 347.985881 1.3 9.185881 \n", - "13 AAPL 852.919621 0.537489 198.357385 10.4 56.459081 \n", - "14 SBUX -511.000015 -0.546811 186.901891 6.5 53.009453 \n", - "15 AMD 910.255422 0.400891 206.416422 14.3 56.280647 \n", - "16 AMZN 12.907792 0.009202 200.382026 9.1 28.574180 \n", - "17 TSLA -123.752305 -0.089618 197.268858 9.1 41.782009 \n", - "18 BA 184.698988 0.708846 260.562825 1.3 6.762825 \n", - "19 NVDA 156.563103 0.026128 285.337797 27.3 294.793730 \n", - "20 META -113.664637 -0.076916 184.722921 10.4 47.383372 \n", - "\n", - " EntryMarketValue TotalEntryCost AuxilaryEntryCost ExitPrice ... \\\n", - "0 1925.293468 19.382935 138.293468 117.248533 ... \n", - "1 405.787423 4.083874 18.387423 200.557006 ... \n", - "2 2750.054078 27.682541 143.254078 464.010511 ... \n", - "3 961.957704 9.697577 69.757704 66.318823 ... \n", - "4 553.194668 5.570947 24.594668 508.573760 ... \n", - "5 2038.434010 20.540340 74.034010 184.011208 ... \n", - "6 1721.036869 17.327369 45.236869 156.363861 ... \n", - "7 1402.242802 14.113428 98.842802 233.993548 ... \n", - "8 1216.825011 12.246250 84.625011 151.686307 ... \n", - "9 947.837582 9.543376 41.837582 293.068846 ... \n", - "10 1734.507891 17.462079 58.707891 155.819212 ... \n", - "11 1176.745100 11.793451 74.345100 2186.680233 ... \n", - "12 346.685881 3.479859 10.485881 565.891375 ... \n", - "13 1576.459081 15.868591 66.859081 304.972338 ... \n", - "14 928.009453 9.345095 59.509453 84.701888 ... \n", - "15 2256.280647 22.705806 70.580647 289.166915 ... \n", - "16 1393.574180 14.026742 37.674180 202.225996 ... \n", - "17 1371.782009 13.808820 50.882009 179.589958 ... \n", - "18 259.262825 2.605628 8.062825 445.261813 ... \n", - "19 5964.793730 59.920937 322.093730 292.793183 ... \n", - "20 1467.383372 14.777834 57.783372 170.514842 ... \n", - "\n", - " ExitSlippage ExitMarketValue TotalExitCost AuxilaryExitCost Quantity \\\n", - "0 -89.514673 1185.485327 11.724853 102.514673 10 \n", - "1 -21.285988 403.714012 4.011140 23.885988 2 \n", - "2 -275.652847 6514.347153 64.961472 293.852847 14 \n", - "3 -14.287064 405.712936 3.979129 22.087064 6 \n", - "4 -45.378721 1529.621279 15.257213 49.278721 3 \n", - "5 -86.265505 2223.734495 22.081345 101.865505 12 \n", - "6 -66.025247 1418.974753 14.072748 77.725247 9 \n", - "7 -102.945164 1647.054836 16.379548 112.045164 7 \n", - "8 -57.082156 917.917844 9.101178 64.882156 6 \n", - "9 -28.155768 1471.844232 14.653442 34.655768 5 \n", - "10 -70.927090 1414.072910 14.023729 82.627090 9 \n", - "11 -154.039534 4375.960466 43.733605 156.639534 2 \n", - "12 -37.808625 567.191375 5.658914 39.108625 1 \n", - "13 -85.821298 2450.178702 24.397787 96.221298 8 \n", - "14 -29.990562 430.009438 4.235094 36.490562 5 \n", - "15 -214.863931 3195.136069 31.808361 229.163931 11 \n", - "16 -115.318028 1424.681972 14.155820 124.418028 7 \n", - "17 -63.770296 1266.229704 12.571297 72.870296 7 \n", - "18 -18.438187 446.561813 4.452618 19.738187 1 \n", - "19 -386.543166 6175.956834 61.486568 413.843166 21 \n", - "20 -45.481265 1374.518735 13.641187 55.881265 8 \n", - "\n", - " EntryTime ExitTime Duration \\\n", - "0 2023-01-04 2023-03-14 69 \n", - "1 2023-01-04 2023-09-11 250 \n", - "2 2023-01-19 2023-12-20 335 \n", - "3 2023-01-24 2023-09-27 246 \n", - "4 2023-01-30 2023-12-21 325 \n", - "5 2023-02-02 2023-09-21 231 \n", - "6 2023-02-03 2023-02-27 24 \n", - "7 2023-03-06 2023-10-26 234 \n", - "8 2023-04-19 2023-05-04 15 \n", - "9 2023-04-28 2023-10-26 181 \n", - "10 2023-06-02 2023-10-23 143 \n", - "11 2023-07-03 2023-12-29 179 \n", - "12 2023-10-20 2023-12-29 70 \n", - "13 2023-11-03 2023-12-29 56 \n", - "14 2023-11-08 2023-12-05 27 \n", - "15 2023-11-09 2023-12-29 50 \n", - "16 2023-11-14 2023-12-29 45 \n", - "17 2023-11-15 2023-12-29 44 \n", - "18 2023-11-24 2023-12-29 35 \n", - "19 2023-12-20 2023-12-29 9 \n", - "20 2023-12-21 2023-12-29 8 \n", - "\n", - " Positions SignalID \n", - "0 &L:SBUX20240119C115&S:SBUX20240119C120 SBUX20230104LONG \n", - "1 &L:BA20240119C220&S:BA20240119C225 BA20230104LONG \n", - "2 &L:NVDA20240119C205&S:NVDA20240119C210 NVDA20230119LONG \n", - "3 &L:NFLX20240119C455&S:NFLX20240119C460 NFLX20230124LONG \n", - "4 &L:META20240119C165&S:META20240119C170 META20230130LONG \n", - "5 &L:AMD20240119C100&S:AMD20240119C105 AMD20230202LONG \n", - "6 &L:AAPL20240119C170&S:AAPL20240119C175 AAPL20230203LONG \n", - "7 &L:AAPL20240315C170&S:AAPL20240315C175 AAPL20230306LONG \n", - "8 &L:SBUX20240119C115&S:SBUX20240119C120 SBUX20230418LONG \n", - "9 &L:AMZN20240315C135&S:AMZN20240315C145 AMZN20230428LONG \n", - "10 &L:TSLA20240621C266.67&S:TSLA20240621C273.33 TSLA20230602LONG \n", - "11 &L:COST20240621C550&S:COST20240621C560 COST20230703LONG \n", - "12 &L:NFLX20240920C450&S:NFLX20240920C460 NFLX20231020LONG \n", - "13 &L:AAPL20240920C220&S:AAPL20240920C235 AAPL20231103LONG \n", - "14 &L:SBUX20250117C115&S:SBUX20250117C120 SBUX20231108LONG \n", - "15 &L:AMD20240920C120&S:AMD20240920C125 AMD20231109LONG \n", - "16 &L:AMZN20240920C160&S:AMZN20240920C165 AMZN20231114LONG \n", - "17 &L:TSLA20240920C270&S:TSLA20240920C275 TSLA20231115LONG \n", - "18 &L:BA20250117C270&S:BA20250117C280 BA20231124LONG \n", - "19 &L:NVDA20241220C590&S:NVDA20241220C600 NVDA20230119LONG \n", - "20 &L:META20250117C400&S:META20250117C405 META20230130LONG \n", - "\n", - "[21 rows x 21 columns]" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "trades = pd.read_csv('/Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/output/profitable_trades_options_10.csv').iloc[:, 1:]\n", - "trades = trades\n", - "trades" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Starting 20\n", - "Completed 20ble dataing available data\n" - ] - } - ], - "source": [ - "attributor = EVBAttributor(trades)\n", - "attributor.load_data(attribution = True, greeks = True, print_output = True, attribution_method='RV')" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([, , , , , ,\n", - " ], dtype=object)" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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BzF16tQWHYeIiDoWgykiIupw2dnZ+Pbbb/HQQw/hyiuvbPB4TU0NrrvuOvz444+YOHEiwsLCAMBjEBMWFuZxux3r1q3D5s2bcdppp1njXLFiBaZPn25lgwYMGICSkhJs27YNo0aNAgAcO3YMy5cvtz22qVOnIjAwEE8//TSmT59uBWFLlixBSUkJZs6c2S7nR0RE7YvBFBERtdnGjRvxyCOPNNg+ZcoUa20nV2+++SaklLjssss8Hm/GjBnw9/fHG2+8gYkTJ1pNIf74xz/immuuQUBAAC699FKEhYVh3LhxWLVqFZ566imkpKQgPT0dEydOtHUeI0aMwLRp09xaowNwKze85pprcO+992L27Nm46667UFFRgeeeew4ZGRnYvHmz2/FaOraEhAT84Q9/wEMPPYTp06fjsssuw969e/Hss89i/Pjxbs0miIio62AwRUREbfbjjz/ixx9/bLD9L3/5i8dg6o033kBaWhpGjx7t8XjR0dE4++yz8c477+Cpp57C+PHj8Ze//AXPP/88PvvsM+i6joMHDyIsLAxPPfUUbr/9dixcuBCVlZWYN2+e7WBq8uTJOPPMM/HQQw/hyJEjGDZsGF599VUrAwWotbiWL1+OX//61/j973+P9PR0LFq0CPv27WsQTLVmbA8++CASEhLwzDPP4J577kFsbCxuv/12PProo25rTBERUdchJGerEhERERERtRrXmSIiIiIiIrKBwRQREREREZENDKaIiIiIiIhsYDBFRERERERkA4MpIiIiIiIiGxhMERERERER2cBgioiIiIiIyAYGU0RERERERDYwmCIiIiIiIrKBwRQREREREZENDKaIiIiIiIhsYDBFRERERERkA4MpIiIiIiIiGxhMERERERER2cBgioiIiIiIyAYGU0RERERERDYwmCIiIiIiIrKBwRQREREREZENDKaIiIiIiIhsYDBFRERERERkA4MpIiIiIiIiGxhMERERERER2cBgioiIiIiIyAYGU0RERERERDYwmCIiIiIiIrKBwRQREREREZENDKaIiIiIiIhsYDBFRERERERkA4MpIiIiIiIiGxhMERERERER2cBgioiIiIiIyAYGU0RERERERDYwmCIiIiIiIrKBwRQREREREZENDKaIiIiIiIhsYDBFRERERERkA4MpIiIiIiIiGxhMERERERER2cBgioiIiIiIyAYGU0RERERERDYwmCIiIiIiIrKBwRQREREREZENDKaIiIiIiIhsYDBFRERERERkA4MpIiIiIiIiGxhMERERERER2cBgioiIiIiIyAYGU0RERERERDYwmCIiIiIiIrKBwRQREREREZENDKaIiIiIiIhsYDBFRERERERkA4MpIiIiIiIiGxhMERERERER2cBgioiIiIiIyAYGU0RERERERDYwmCIiIiIiIrKBwRQREREREZENDKaIiIiIiIhsYDBFRERERERkA4MpIiIiIiIiGxhMERERERER2cBgioiIiIiIyAYGU0RERERERDYwmCIiIiIiIrKBwRQREREREZENDKaIiIiIiIhsYDBFRERERERkA4MpIiIiIiIiGxhMERERERER2cBgioiIiIiIyAYGU0RERERERDYwmCIiIiIiIrKBwRQREREREZENDKaIiIiIiIhsYDBFRERERERkA4MpIiIiIiIiGxhMERERERER2cBgioiIiIiIyAYGU0RERERERDYwmCIiIiIiIrKBwRQREREREZENDKaIiIiIiIhsYDBFRERERERkA4MpIiIiIiIiGxhMERERERER2cBgioiIiIiIyAYGU0RERERERDYwmCIiIiIiIrKBwRQREREREZENDKaIiIiIiIhsYDBFRERERERkA4MpIiIiIiIiGxhMERERERER2cBgioiIiIiIyAYGU0RERERERDYwmCIiIiIiIrKBwRQREREREZENDKaIiIiIiIhsYDBFRERERERkA4MpIiIiIiIiGxhMERERERER2cBgioiIiIiIyAYGU0RERERERDYwmCIiIiIiIrKBwRQREREREZENDKaIiIiIiIhsYDBFRERERERkA4MpIiIiIiIiGxhMERERERER2cBgioiIiIiIyAYGU0RERERERDYwmCIiIiIiIrKBwRQREREREZENDKaIiIiIiIhsYDBFRERERERkA4MpIiIiIiIiGxhMERERERER2cBgioiIiIiIyAYGU0RERERERDYwmCIiIiIiIrKBwRQREREREZENDKaIiIiIiIhsYDBFRERERERkA4MpIiIiIiIiGxhMERERERER2cBgioiIiIiIyAYGU0RERERERDYwmCIiIiIiIrKBwRQREREREZENDKaIiIiIiIhsYDBFRERERERkA4MpIiIiIiIiGxhMERERERER2cBgioiIiIiIyAYGU0RERERERDYwmCIiIiIiIrKBwRQREREREZENDKaIiIiIiIhsYDBFRERERERkA4MpIiIiIiIiGxhMERERERER2cBgioiIiIiIyAYGU0RERERERDYwmCIiIiIiIrKBwRQREREREZENDKaIiIiIiIhsYDBFRERERERkA4MpIiIiIiIiGxhMERERERER2cBgioiIiIiIyAYGU0RERERERDYwmCIiIiIiIrKBwRQREREREZENDKaIiIiIiIhsYDBFRERERERkA4MpIiIiIiIiGxhMERERERER2cBgioiIiIiIyAYGU0RERERERDYwmCIiIiIiIrKBwRQREREREZENDKaIiIiIiIhsYDBFRERERERkA4MpIiIiIiIiGxhMERERERER2cBgioiIiIiIyAYGU0RERERERDYwmCIiIiIiIrKBwRQREREREZENDKaIiIiIiIhsYDBFRERERERkA4MpIiIiIiIiGxhMERERERER2cBgioiIiIiIyAYGU0RERERERDYwmCIiIiIiIrKBwRQREREREZENDKaIiIiIiIhsYDBFRERERERkA4MpIiIiIiIiGxhMERERERER2cBgioiIiIiIyAYGU0RERERERDYwmCIiIiIiIrKBwRQREREREZENDKaIiIiIiIhsYDBFRERERERkA4MpIiIiIiIiGxhMERERERER2cBgioiIiIiIyAYGU0RERERERDYwmCIiIiIiIrKBwRQREREREZENDKaIiIiIiIhsYDBFRERERERkA4MpIiIiIiIiGxhMERERERER2cBgioiIiIiIyAYGU0RERERERDYwmCIiIiIiIrKBwRQREREREZENDKaIiIiIiIhsYDBFRERERERkA4MpIiIiIiIiGxhMERERERER2cBgioiIiIiIyAYGU0RERERERDYwmCIiIiIiIrKBwRQREREREZENDKaIiIiIiIhsYDBFRERERERkA4MpIiIiIiIiGxhMERERERER2cBgioiIiIiIyAYGU0RERERERDYwmCIiIiIiIrKBwRQREREREZENDKaIiIiIiIhsYDBFRERERERkA4MpIiIiIiIiGxhMERERERER2cBgioiIiIiIyAYGU0RERERERDYwmCIiIiIiIrKBwRQREREREZENDKaIiIiIiIhsYDBFRERERERkA4MpIiIiIiIiGxhMERERERER2cBgioiI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ddeiRYswf/58/+PW4uhfJsedn7FSmlF2UTc+AGjqhfEMAXDPyHDcMzIcAFBWVtYL7xJIEAQkJCSgvLwciqL0+vuFmtbi7Qot5kSLMXeGOVFpPQ9aj789Ws6JlmO/GHOh0loe9Ho9YmJiunTsoCimIiIiIIoi7HZ7wPN2u73NbBWgJkivb9vgQVEUTXxALqS1mLUWb1doMSdajLkzzIlK63nQevzt0XJOtBz7xZgLlVby0J0YxV4cR5+RJAkZGRnIy8vzPyfLMvLy8pCTkxPCkRERERER0WA1KGamAGD+/Pl46623kJGRgaysLKxduxYulwszZswI9dCIiIiIiGgQGjTF1LRp09DQ0IDly5fDbrcjLS0NTz/9dLvL/IiIiIiIiC7XoCmmAGDu3LmYO3duqIdBREREREQaMCjumSIiIiIiIuprLKaIiIiIiIiCwGKKiIiIiIgoCIPqnqnLJUnaS4fWYtZavF2hxZxoMebOMCcqredB6/G3R8s50XLsF2MuVFrJQ3fiFBQt7LzVCY/H0+4mvkREREREpE1dqRG4zA9qot544w04HI5Oj3311VeDfp/+dK7D4cCTTz7Zacz9acyXc67W4u2KruakN947VOdebswDLd6unHupnPTXMffGuVr8erjw3GDiD/WYe/vci3MyEMbcU+dq/evhQvz+QaW1rweHw4E33ngDHo+n02NZTJ2zfft2dGWSrri4OOj36E/nKoqCgoKCTmPuT2O+nHO1Fm9XdDUnvfHeoTr3cmMeaPF25dxL5aS/jrk3ztXi18OF5wYTf6jH3NvnXpyTgTDmnjpX618PF+L3DyqtfT0oioLt27d36VgWU900Z84cnstzB825l0trMQ/EeHlu3xmIMfNcnttbBmLMPJfnBkUhpbm5WbnzzjuV5ubmUA+lz2gtZq3F2xVazIkWY+4Mc6LSeh60Hn97tJwTLcd+MeZCpbU8dCdezkwB0Ov1uOOOOzTVhEJrMWst3q7QYk60GHNnmBOV1vOg9fjbo+WcaDn2izEXKq3loTvxspsfERERERFREDgzRUREREREFAQWU0REREREREFgMUVERERERBQEFlNERERERERBYDFFREREREQUBBZTREREREREQWAxRUREREREFAQWU0REREREREFgMUVERERERBQEFlNERERERERBYDFFREREREQUBBZTREREREREQWAxRUREREREFAQWU0REREREREFgMUVERERERBQEFlNERERERERBYDFFREREREQUBBZTREREREREQWAxRUREREREFAQWU0REREREREFgMUVERERERBQEFlNERERERERBYDFFREREREQUBBZTREREREREQWAxRUREREREFAQWU0REREREREFgMUVERERERBQEFlNERERERERBYDFFREREREQUBBZTREREREREQWAxRUREREREFAQWU0REREREREFgMUVERERERBQEFlNERERERERBYDFFREREREQUBBZTREREREREQWAxRUREREREFAQWU0REREREREFgMUVERERERBQEFlNERERERERBkEI9gP6krq4OXq831MPoM7Gxsaiqqgr1MPqM1uLtCi3mRIsxd4Y5UWk9D1qPvz1azomWY78Yc6HSUh4kSUJUVFTXju3lsQwoXq8XHo8n1MPoE4IgAFBjVhQlxKPpfVqLtyu0mBMtxtwZ5kSl9TxoPf72aDknWo79YsyFinnoGJf5ERERERERBYHFFBERERERURBYTBEREREREQWBxRQREREREVEQ2ICCiIiIiAYtr9eLlpaWoM93OBxwu909OKKBaTDmwWKxQJIurxwaVMXUunXrsHr1atjtdqSmpuKBBx5AVlZWqIdFRERERCHg9XrR3NyM8PBwiGJwC7L0er1muj1fymDLgyzLaGxshNVqvayCatAs89uxYweWLVuGO+64A0uXLkVqaipeeukl1NfXh3poRERERBQCLS0tl1VI0eAliiLCw8Mva9YSGEQzU19++SVmzZqFmTNnAgCWLFmCvXv3YvPmzVi4cGHAsR6PJ6CyFgQBZrMZP3zbhLpaFwQREAT1efX31uNaTwCEc3/o8LULzusqQRBgDRdhi5JgG6KDNVz09/Xvaa3X7a3r9zdai7crtJgTLcbcGeZEpfU8aD3+9mg5J4MtdhZS1JHWz8bFn/XufPYHRTHl9Xpx+vTpgKJJFEWMGTMG+fn5bY5fuXIlVqxY4X+cnp6OpUuXwulU0Nwk98WQO+ECAERE6pGVG4ms4ZGIiNS3PUwQIIqX95ddQkJC0OcORFqLtyu0mBMtxtwZ5kSl9TxoPf72aDkngyF2h8MBvb6d76G6qSeuMRgMxjwYDAYkJiYGff6gKKYaGhogyzJsNlvA8zabDaWlpW2OX7RoEebP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iHJMVVUcPHgQALBq1SoIgpDnFhER0WQwmCIiIsqxtrY2eDweWK1WY5sPIiKafhhMERER5ZielVq2bBlsNlueW0NERJPFYIqIiCgLRkZGsHfvXvT398f93ufz4eTJkwCAlStX5qNpRESUISyNTkRElEGqquKDDz7Aq6++imAwiLfeeguXXXYZVq9ejY6ODvzpT3+CoiiYNWsWamtr891cIiKaAgZTREREGeLz+fDyyy8bmSeHw4FAIIBXX30Vhw4dQm9vLwCgpKQEGzduzGdTiYgoAxhMERERZcCJEyewc+dOBAIBiKKIiy66COeffz4OHjyI119/3Qikli9fjssvv5z7ShERzQAMpoiIiKYgHA5j586d+OCDDwAANTU1uOaaa4wpfGvWrEFjYyP279+PxYsXY968eflsLhERZRCDKSIioinYt28fPvjgAwiCgHXr1uHCCy+EJElx96mursaHPvShPLWQiIiyhcEUERHRFDQ3NwMANm3ahFWrVuW3MURElFMsjU5ERDRJgUAAXV1dAICFCxfmuTVERJRrDKaIiIgmqbW1FYA2ja+0tDTPrSEiolxjMEVERDRJLS0tAMCiEkRERYrBFBER0SSoqspgioioyDGYIiIimgSPx4Ph4WFIkoTZs2fnuzlERJQHDKaIiIgmQc9KzZ49G1arNc+tISKifGAwRURENAlnzpwBwCl+RETFjMEUERHRBMmyjLNnzwJgMEVEVMzyvmnv4cOH8dvf/hanT5/GwMAAvvrVr+LCCy80bldVFU8//TT+/Oc/w+v1YtmyZbj99tvR0NBg3GdkZASPPfYY3nnnHQiCgIsuugh/+7d/C4fDkY8uERHRDNfR0YFwOAyn04mampp8N4eIiPIk75mpYDCIBQsW4O/+7u9S3v7cc8/hD3/4A+644w58//vfh91uxwMPPIBQKGTc59///d/R2tqKe++9F3fffTeOHDmCn/70p7nqAhERFYlIJIJ33nkHzz//PAAtKyUIQp5bRURE+ZL3YOq8887Dpz71qbhslE5VVbzwwgv4xCc+gfXr12P+/Pn4h3/4BwwMDGDPnj0AgLa2Nrz33nv4whe+gKVLl2LZsmX4/Oc/j927d6O/vz/X3SEiohlIURQcPnwY27Ztw65duxAMBlFdXY2LL744300jIqI8yvs0v7F0d3fD4/Fg9erVxu9cLheWLFmC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IiIiIiKaBAZTREREREREk8BgioiIiIiIaBIYTBEREREREU0CgykiIiIiIqJJYDBFREREREQ0CQymiIiIiIiIJoHBFBERERER0SQwmCIiIiIiIpoEBlNERERERESTwGCKiIiIiIhoEhhMERERERERTQKDKSIiIiIioklgMEVERERERDQJDKaIiIiIiIgmgcEUERERERHRJDCYIiIiIiIimgQGU0RERERERJPAYIqIiIiIiGgSGEwRERERERFNAoMpIiIiIiKiSWAwRURERERENAkMpoiIiIiIiCaBwRQREREREdEkMJgiIiIiIiKaBAZTREREREREk8BgioiIiIiIaBIYTBEREREREU2CJd8NKCQDAwOIRCL5bkbO1NbWoqenJ9/NyJli6286inFMirHP4+GYaIp9HIq9/6kU85gUc98TcSw0xTQOFosFlZWV6d03y22ZViKRCMLhcL6bkROCIADQ+qyqap5bk33F1t90FOOYFGOfx8Mx0RT7OBR7/1Mp5jEp5r4n4lhoOA6j4zQ/IiIiIiKiSWAwRURERERENAkMpoiIiIiIiCaBwRQREREREdEksAAFEREREdEEeL1eRCIRozBDMfD7/QiFQvluRka5XC5YLFMLhxhMERERERGlKRgMQhAEVFRU5LspOWW1WmdU1WtFUTA8PIySkpIpBVSc5kdERERE05uqwD78HsTwQNZfKhgMwul0Zv11KLtEUURZWRl8Pt/UnidD7SEiIiIiygub7wQqup5CefezOXm9YpreN5OJ4tRDIQZTRERERDStifIwAMASaAVUJc+toWLCYIqIiIiIpjc1AgAQ1SCkcH+eG0PFJKsFKHbs2IEdO3agp6cHANDY2Iibb74Z5513HgAgFAph27Zt2L17N8LhMNasWYPbb78dbrfbeI7e3l787Gc/w6FDh+BwOLBx40bceuutkCTJuM+hQ4ewbds2tLa2orq6GjfddBM2bdqUza4RERERUYEQlFiVOUuwHbKtJo+toWKS1cxUVVUVbr31VvzgBz/Agw8+iJUrV+KHP/whWltbAQCPP/443nnnHXzlK1/Bfffdh4GBATz88MPG4xVFwYMPPohIJIL7778fd955J1555RU89dRTxn26u7vxgx/8ACtWrMAPf/hDfOQjH8FPfvITvPfee9nsGhEREREVCCGamQIAS/BsHltSeD73uc/h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UBitz0brbzKMOCZG7PNAOCYqo4+D0fufiJHHxMh974ljoTLaOAymv6zmR0RERERENATMTBEREREREQ0BgykiIiIiIqIhYDBFREREREQ0BAymiIiIiIiIhoDBFBERERER0RAwmCIiIiIiIhoCBlNERERERERDwGCKiIiIiIhoCBhMERERERERDQGDKSIiIiIioiFgMEVERERERDQEDKaIiIiIiIiGgMEUERERERHREDCYIiIiIiIiGgIGU0REREREREPAYIqIiIiIiGgIGEwRERERERENAYMpIiIiIiKiIWAwRURERERENAQMpoiIiIiIiIaAwRQREREREdEQMJgiIiIiIiIaAgZTREREREREQ8BgioiIiIiIaAgYTBEREREREQ0BgykiIiIiIqIhYDBFREREREQ0BAymiIiIiIiIhoDBFBERERER0RAwmCIiIiIiIhoCBlNERERERERDwGCKiIiIiIhoCBhMERERERERDQGDKSIiIiIioiFgMEVERERERDQEDKaIiIiIiIiGgMEUERERERHREDCYIiIiIiIiGgIGU0REREREREPAYIqIiIiIiGgIGEwRERERERENgZTuBuhJa2srQqFQupsxaoqKinDkyJF0N2PUGK2/yTDimBixzwPhmKiMPg5G738iRh4TI/e9J46FykjjIEkS8vLykjs2xW3JKKFQCMFgMN3NGBWCIABQ+6woSppbk3pG628yjDgmRuzzQDgmKqOPg9H7n4iRx8TIfe+JY6HiOPSN0/yIiIiIiIiGgMEUERERERHREDCYIiIiIiIiGgIGU0REREREREPAAhRJCoVC8Hq96W7GiOrq6kIgEEh3M0bNWO2vw+GAJPGlTERERDTa+AksCaFQCB6PB1lZWRDFsZPMM5vNhqleCIzN/sqyjI6ODjidTgZURERERKNs7EQGKeT1esdcIEVjgyiKyMrKGnNZUyIiIopQFPUf6RKjgyQxkCK94nOTiIhojFIUFH62CwW1dQyodIrzgoiIiIiIdEgIy7B4u9SfFQVKZPNc0g9+pU1EREREpEsx2ShmpnSJwRQRERERkQ4JCoMpvWMwRbqwatUqfOELXxjUOeXl5Xj11VdT1KJu8+bNw29+85uUPw4RERFRnJj4SWAwpUsMpsawpUuX4kc/+lGv65999lkcffTRaWjRyPrwww9x2mmnpbsZcebNm4fy8nKUl5djypQpOPPMM/HSSy8N6j5GK0gkIiIifRPipvmlrx3UNwZTlLGKi4thtVrT3YxebrzxRnz44Yd47bXXMHv2bHznO9/Be++9l+5mERERUaaJyUYxM6VPDKaGQlEghOW0/Bvp+bLf+973cMUVV+BXv/oV5s6di+nTp+O2226L29zW7/djxYoV+NznPocpU6ZgyZIl2LRpEwDA5/PhtNNOw80336wdX19fj+rqavz5z38G0J0Je/XVV3HiiSeiqqoKF198MQ4cONBnuz766CNcdNFFmDFjBqZNm4bzzjsPW7ZsiTsmNoOzb98+lJeX4x//+AeWLl2KyZMnY/HixXj//ffjznn33XdxzjnnYPLkyTjuuONw5513xu3R1NTUhMsuuwyTJ0/G/Pnz8fzzzw96TF0uF4qLizF58mTcf//9sNlseP311wGomavHH38cN9xwA6qrq3H88cfjj3/846Afg4iIiAxA6fMC6QRLow+BICso3fJpWh770MzpUEwjWxZz06ZNKC4uxl/+8hfs3r0b3/nOdzB9+nRccsklAIA77rgDNTU1+MUvfoFx48bh1VdfxaWXXorXX38dVVVV+NnPfoavfOUrWLRoERYvXozrrrsOJ598Mi666CLtMbq6uvD444/jscceg8ViwW233Ybly5fjxRdfTNimzs5OnH/++bj33nuhKApWr16Nr3/969iwYQNcLleffVm5ciXuvPNOTJo0CStXrsQ111yDjRs3QpLKe9bzAABQdklEQVQk7N69G5dccgluvvlmrFq1Cs3Nzbjjjjtw++2346c//SkA4Pvf/z4aGhqwbt06mM1m3HnnnWhqahry2EqSBLPZjEAgoF23evVq3HTTTbjuuuvw97//HT/84Q8xf/58TJkyZciPQ0RERGOPwMyU7jEzRcjJycF9992HKVOm4Atf+AIWLVqEDRs2AAAOHDiAZ599FqtXr8a8efNQWVmJq6++GscffzyeffZZAMCMGTNw880348Ybb8SPf/xjHDhwAD/5yU/iHiMYDOLee+/Fcccdh1mzZuHRRx/F+++/jw8//DBhmxYuXIjzzjsPU6ZMwdSpU/GTn/wEXV1deOedd/rty9VXX43Fixdj8uTJuPHGG7F//37U19cDAB5//HGcc845uPLKK1FVVYXjjz8e99xzD9avXw+fz4ddu3bhjTfewEMPPYTP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MKVLDKaIiIiIiHSImSn9YzBFRERERKRHcWum0tcM6huDKSIiIiIiHRK4aa/uMZgiIiIiItIlpY+fSS8YTBERERER6RHXTOkegykiIiIiIh0SmJjSPQZTRERERES6xE179Y7BFBERERGRHnGan+4xmCIiIiIi0qH4aX4MpvSIwRQRERERkR7FZqa4aEqXGEwREREREelQXADFWEqXGEwREREREekRN+3VPQZTRERERER6pLCan94xmCIiIiIi0qHYaX4CwIBKhxhMERERERHpUc/YicGU7jCYIiIiIiLSoZ7rpIQ0tYP6xmCKiIiIiEiPemaimJnSHQZTRERERES6xGBK7xhMERERERHpkKD0vMxgSm8YTBERERER6VGvaX7paQb1jcEUEREREZHeKEqvghPMTOkPgykiIiIioozAYEpvGEwREREREelNTBZKEdQcFTNT+sNgioiIiIhIZ4QEwRSr+ekPgykiIiIiIr2JiZsUUf3I3rO6H6UfgykiIiIiIp0RwMxUJmAwRURERESkN5HASQEAkWum9IrBFBERERGR3kTjJkGAViSdwZTuMJgiIiIiItIZITYzFa3mx9LousNgioiIiIhIdyKBkyBAEeKvIv1gMEVEREREpDcx0/zAAhS6xWCKiIiIiEhntGl+Ajft1TMGU0REREREuqOlppiZ0jEGU0REREREOiPETvMDM1N6xWCKiIiIiEhv4qb5Ra9LX3MoMQZTREREREQ6052FElgaXccYTBERERER6U40MyVoBSi4Zkp/GEwREREREelNTGIKrOanW1Iq73zbtm3429/+ht27d6O1tRU33ngjTjjhBO12RVGwbt06/Pvf/4bH48G0adOwbNkylJaWasd0dnbiySefxAcffABBEDBv3jxcfvnlsNls2jF79uzBmjVrsGvXLmRnZ+Oss87CV7/61VR2jYiIiIgoZbTAiZkpXUtpZsrv96OyshLf+ta3Et7+4osv4pVXXsGVV16J+++/H1arFffddx8CgYB2zOOPP459+/bhjjvuwK233ort27dj9erV2u1erxf33nsvCgsL8eCDD+LSSy/FX/7yF7z++uup7BoRERERUQpFpvlB0K4RGEvpTkqDqblz5+Kiiy6Ky0ZFKYqCf/zjHzj33HNx/PHHo6KiAtdeey1aW1vx3nvvAQD279+Pjz76CFdffTWmTp2K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Px/PPPMMfvnLX+Lkk0/OuNLoPUU//0RVVVXh+9//PtatW4fnnnsOeXl5uOCCC3pNBZw/fz6efPJJiKKYkV/AffTRR/j2t78Nk8kEp9OJiooKXH755TjllFO0L5cGek1Mnz4dN9xwA5577jn89a9/hd1u12aBGIGgjMWJ8ETUp0zfuT7VGhsbcd111+GBBx4YEwVJ7rvvPpSUlAxqvdxYxvEYnnvuuQe5ubm47rrr0t2UtInuM5Wpe20R0cjK/PkMREQjIDrV4c9//jOqq6szPpDq7OzEBx98gG3bto2JDYeHi+MxeH6/Hy+//DL27duHAwcOYN26ddiyZUvcGioiIqPL7Dk9REQjZOfOnbj77rtRWlqqbUiZyX75y19i165dWLJkCY4//vh0NyftOB6DJwgCPvzwQzz//PMIBoMoKyvDD37wg4QFCYiIjIrT/IiIiIiIiIaA0/yIiIiIiIiGgMEUERERERHREHDNVIZ64YUX8O677+LAgQOwWCyorq7GpZdeGrfhXCAQwNq1a7Fp0yYEg0HMnj0by5Yt0/bBqK+vx1//+lfs3LkT7e3tKC4uxhe+8AV86Utf0u5jx44dePrpp3HgwAH4/X4UFRVh8eLFWLJkyWh3mYiIiIhIVxhMZaht27bhzDPPxOTJkxEOh/GnP/0J9957Lx555BFt47zf//732Lx5M2644QY4HA6sWbMGq1atwj333AMAqKurQ05ODq677joUFBRg586d+PWvfw1RFHHWWWcBAKxWK84880xUVFTAarVix44d+M1vfgObzYbFixenrf9EREREROnGAhRjRHt7O5YtW4a77roLxxxzDLxeL771rW/h+uuvx/z58wEABw4cwPe//33ce++9qK6uTng/v/3tb3HgwAH8+Mc/7vOxHn74YVitVkPvM0JERERExDVTY4TX6wUAbefyuro6hMPhuP1UysvLUVhYiJqamn7vJ3ofiezevRs7d+7EMcccM0ItJyIiIiLKTJzmNwbIsoynnnoKRx11FCZOnAgAcLvdkCQJTqcz7ticnBy43e6E97Nz50688847uPXWW3vddvXVV6O9vR3hcBjnn38+Fi1aNOL9ICIiIiLKJAymxoA1a9Zg3759WLFixZDvY+/evfjJT36CpUuXYvbs2b1uX7FiBXw+H2pqavDMM8+gpKQECxcuHE6ziYiIiIgyGoOpDLdmzRps3rwZd999NwoKCrTrc3NzEQqF4PF44rJTbW1tWjW/qP379+Oee+7B4sWLcd555yV8nOLiYgDAxIkT0dbWhr/85S8MpoiIiIjI0LhmKkMpioI1a9bg3XffxY9+9CMt2ImqqqqCyWTCli1btOsOHjyIpqamuOIT+/btw913341TTjkFX/va15J+7FAoNDIdISIiIiLKUMxMZag1a9Zgw4YNuPnmm2G327V1UA6HAxaLBQ6HA6effjrWrl0Ll8sFh8OBJ598EtXV1VowtXfvXqxYsQKzZ8/GkiVLtPsQRRHZ2dkAgFdffRWFhYUoLy8HAGzfvh0vvfQSvvjFL456n4mIiIiI9ISl0TPUBRdckPD65cuX49RTTwXQvWnvxo0bEQqFem3au27dOqxfv77XfRQVFeGJJ54AALzyyit4/fXX0djYCFEUUVJSgkWLFmHx4sUQRSY2iYiIiMi4GEwRERERERENAVMLREREREREQ8BgioiIiIiIaAgYTBEREREREQ0BgykiIiIiIqIhYDBFREREREQ0BAymiIiIiIiIhoDBFBERERER0RAwmCIiIiIiIhoCBlNERERERERDwGCKiIiIiIhoCBhMERERERERDcH/BzKfqc0Gt3GFAAAAAElFTkSuQmCC", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "attributor.attribution.cumsum().plot(y = ['Total_PnL', 'Delta_PnL', 'Gamma_PnL', 'Theta_PnL', 'Vega_PnL', 'Rho_PnL', 'Unexplained_PnL'], figsize = (10, 25), title = 'PnL Attribution', subplots = True)" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Delta_PnLGamma_PnLVega_PnLVolga_PnLTheta_PnLRho_PnLVanna_PnLDividend_PnLTotal_PnLUnexplained_PnLActual_PnLPrice
2023-11-16122.207482-9.242813-1362.276319245.78360516.661025-2.969921-5.6700760.0-995.5070171812.007017816.520031.0
2023-11-10786.0571198.593892998.301911-634.320696-8.038048-2.429832-60.7323330.01087.432011486.0679891573.516751.0
2023-12-01167.7952251.019306-20.336757159.109959-6.804126-5.7788925.0522920.0300.057007138.442993438.519255.0
2023-12-15263.484698-19.4150811532.081871-1485.48735824.1066792.22044970.8786160.0387.869875124.630125512.520645.0
2023-12-250.0000000.0000000.0000000.000000-25.2166790.0000000.0000000.0-25.21667925.2166790.019062.5
.......................................
2023-12-04-491.3911830.257606-800.685761668.582428-16.0730632.034615-23.6275230.0-660.902882-118.097118-779.018476.0
2023-12-1876.633620-14.9569551565.753003-1224.04612311.5946490.000000-98.9118490.0316.066345-188.566345127.520772.5
2023-11-20331.926082-2.2768812730.661937-1695.57944351.3904971.249972-81.5675850.01335.804578-327.3045781008.519450.0
2023-11-13-262.6618161.946268-382.634811386.053626-53.7631201.8659854.3606030.0-304.833265-488.666735-793.515957.5
2023-11-1735.107324-0.23649440.061235-114.01664519.192101-2.490477-2.7346110.0-25.117567-1564.382433-1589.518441.5
\n", - "

258 rows × 12 columns

\n", - "
" - ], - "text/plain": [ - " Delta_PnL Gamma_PnL Vega_PnL Volga_PnL Theta_PnL \\\n", - "2023-11-16 122.207482 -9.242813 -1362.276319 245.783605 16.661025 \n", - "2023-11-10 786.057119 8.593892 998.301911 -634.320696 -8.038048 \n", - "2023-12-01 167.795225 1.019306 -20.336757 159.109959 -6.804126 \n", - "2023-12-15 263.484698 -19.415081 1532.081871 -1485.487358 24.106679 \n", - "2023-12-25 0.000000 0.000000 0.000000 0.000000 -25.216679 \n", - "... ... ... ... ... ... \n", - "2023-12-04 -491.391183 0.257606 -800.685761 668.582428 -16.073063 \n", - "2023-12-18 76.633620 -14.956955 1565.753003 -1224.046123 11.594649 \n", - "2023-11-20 331.926082 -2.276881 2730.661937 -1695.579443 51.390497 \n", - "2023-11-13 -262.661816 1.946268 -382.634811 386.053626 -53.763120 \n", - "2023-11-17 35.107324 -0.236494 40.061235 -114.016645 19.192101 \n", - "\n", - " Rho_PnL Vanna_PnL Dividend_PnL Total_PnL Unexplained_PnL \\\n", - "2023-11-16 -2.969921 -5.670076 0.0 -995.507017 1812.007017 \n", - "2023-11-10 -2.429832 -60.732333 0.0 1087.432011 486.067989 \n", - "2023-12-01 -5.778892 5.052292 0.0 300.057007 138.442993 \n", - "2023-12-15 2.220449 70.878616 0.0 387.869875 124.630125 \n", - "2023-12-25 0.000000 0.000000 0.0 -25.216679 25.216679 \n", - "... ... ... ... ... ... \n", - "2023-12-04 2.034615 -23.627523 0.0 -660.902882 -118.097118 \n", - "2023-12-18 0.000000 -98.911849 0.0 316.066345 -188.566345 \n", - "2023-11-20 1.249972 -81.567585 0.0 1335.804578 -327.304578 \n", - "2023-11-13 1.865985 4.360603 0.0 -304.833265 -488.666735 \n", - "2023-11-17 -2.490477 -2.734611 0.0 -25.117567 -1564.382433 \n", - "\n", - " Actual_PnL Price \n", - "2023-11-16 816.5 20031.0 \n", - "2023-11-10 1573.5 16751.0 \n", - "2023-12-01 438.5 19255.0 \n", - "2023-12-15 512.5 20645.0 \n", - "2023-12-25 0.0 19062.5 \n", - "... ... ... \n", - "2023-12-04 -779.0 18476.0 \n", - "2023-12-18 127.5 20772.5 \n", - "2023-11-20 1008.5 19450.0 \n", - "2023-11-13 -793.5 15957.5 \n", - "2023-11-17 -1589.5 18441.5 \n", - "\n", - "[258 rows x 12 columns]" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "attributor.attribution.sort_values(by = 'Unexplained_PnL', ascending = False)" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The autoreload extension is already loaded. To reload it, use:\n", - " %reload_ext autoreload\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "%load_ext autoreload\n", - "%autoreload 2\n", - "from trade.helpers.helper import CustomCache\n", - "\n", - "k = CustomCache(clear_on_exit=True)\n", - "k" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'oQkn7M9m'" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import shortuuid\n", - "sid = shortuuid.random(length=8)\n", - "sid" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[0;31mInit signature:\u001b[0m\n", - "\u001b[0mCustomCache\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mlocation\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m \u001b[0;34m|\u001b[0m \u001b[0mpathlib\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mPath\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mfname\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'cache'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mlog_path\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m \u001b[0;34m|\u001b[0m \u001b[0mpathlib\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mPath\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mclear_on_exit\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mbool\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mDocstring:\u001b[0m Disk and file backed cache.\n", - "\u001b[0;31mInit docstring:\u001b[0m\n", - "Initialize cache instance.\n", - "\n", - ":param str directory: cache directory\n", - ":param float timeout: SQLite connection timeout\n", - ":param disk: Disk type or subclass for serialization\n", - ":param settings: any of DEFAULT_SETTINGS\n", - "\u001b[0;31mFile:\u001b[0m ~/cloned_repos/QuantTools/trade/helpers/helper.py\n", - "\u001b[0;31mType:\u001b[0m type\n", - "\u001b[0;31mSubclasses:\u001b[0m " - ] - } - ], - "source": [ - "CustomCache?" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "openbb", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.10" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/EventDriven/demos/backtestClean.ipynb b/EventDriven/demos/backtestClean.ipynb deleted file mode 100644 index 7fc6afd..0000000 --- a/EventDriven/demos/backtestClean.ipynb +++ /dev/null @@ -1,9423 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Console Logging & File Logging Can be configured using STREAM_LOG_LEVEL and FILE_LOG_LEVEL in environment variables.\n", - "Propagate to root logger can be set using PROPAGATE_TO_ROOT_LOGGER in environment variables.\n", - "Example:\n", - "STREAM_LOG_LEVEL = 'DEBUG'\n", - "FILE_LOG_LEVEL = 'INFO'\n", - "PROPAGATE_TO_ROOT_LOGGER = 'False'\n", - "\n", - "2025-03-29 23:12:03 trade.helpers.Logging INFO: Logging Root Directory: /Users/chiemelienwanisobi/cloned_repos/QuantTools/logs\n", - "Using Proxy URL: http://18.232.166.224:5500/thetadata\n" - ] - } - ], - "source": [ - "\n", - "from dotenv import load_dotenv\n", - "load_dotenv()\n", - "import os\n", - "import sys\n", - "sys.path.append(\n", - " os.environ.get('WORK_DIR')) #type: ignore\n", - "sys.path.append(\n", - " os.environ.get('DBASE_DIR')) #type: ignore\n", - "from dbase.DataAPI.ThetaData import * #type: ignore\n", - "from dbase.database.SQLHelpers import * #type: ignore\n", - "import pandas as pd\n", - "from EventDriven.data import HistoricTradeDataHandler\n", - "from EventDriven.event import *\n", - "from queue import Queue\n", - "from trade.backtester_.backtester_ import PTDataset, PTBacktester\n", - "import pandas_ta as ta\n", - "from trade.assets.Stock import Stock\n", - "from trade.assets.Calculate import Calculate\n", - "from trade.assets.helpers.loaders import create_object_from_id\n", - "from trade.backtester_.utils.WalkForwardUtils import prev_monday \n", - "from trade.backtester_.strats import BBandsTrend2\n", - "from trade.backtester_.strats import MAStrat\n", - "from trade.helpers.Context import Context\n", - "import math\n", - "import yfinance as yf\n", - "import numpy as np\n", - "from datetime import datetime\n", - "from EventDriven.backtest import OptionSignalBacktest\n", - "from copy import deepcopy\n", - "from pandas.tseries.offsets import BDay\n", - "import matplotlib.pyplot as plt\n", - "pd.options.display.max_rows = 100\n", - "pd.options.display.max_columns = 50\n", - "%load_ext autoreload\n", - "%autoreload 2" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Console Logging & File Logging Can be configured using STREAM_LOG_LEVEL and FILE_LOG_LEVEL in environment variables.\n", - "Propagate to root logger can be set using PROPAGATE_TO_ROOT_LOGGER in environment variables.\n", - "Example:\n", - "STREAM_LOG_LEVEL = 'DEBUG'\n", - "FILE_LOG_LEVEL = 'INFO'\n", - "PROPAGATE_TO_ROOT_LOGGER = 'False'\n", - "\n", - "2025-03-31 18:44:27 trade.helpers.Logging INFO: Logging Root Directory: /Users/chiemelienwanisobi/cloned_repos/QuantTools/logs\n", - "Using Proxy URL: http://18.232.166.224:5500/thetadata\n" - ] - } - ], - "source": [ - "import sys\n", - "from EventDriven.data import HistoricTradeDataHandler" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "thetadata_start = '2021-01-01'" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
SizeEntryBarExitBarEntryPriceExitPricePnLReturnPctEntryTimeExitTimeDurationTicker
1712662963994.36914187.32-888.191794-0.0746982021-07-012021-07-1615AMD
\n", - "
" - ], - "text/plain": [ - " Size EntryBar ExitBar EntryPrice ExitPrice PnL ReturnPct \\\n", - "17 126 629 639 94.369141 87.32 -888.191794 -0.074698 \n", - "\n", - " EntryTime ExitTime Duration Ticker \n", - "17 2021-07-01 2021-07-16 15 AMD " - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import json\n", - "pd.set_option('display.max_columns', 100)\n", - "pd.set_option('display.max_rows', 100)\n", - "_key = 8\n", - "with open(f'../input/profitable_weights_{_key}.json', 'r') as f:\n", - " weights = json.load(f)\n", - "ttrades__ = pd.read_csv(f'../input/profitable_trades_{_key}.csv').iloc[:, 1:]\n", - "ttrades__['Duration'] = ttrades__.Duration.apply(lambda x: int(x.split(' ')[0]))\n", - "# AMZN20220329LONG\n", - "tick = 'AMD'\n", - "eq_idx = 17\n", - "ttrades__ = ttrades__[(ttrades__.Ticker == tick) & (ttrades__.index == eq_idx)]\n", - "trades_ = ttrades__.copy()\n", - "trades_" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(AMD 0.160574\n", - " dtype: float64,\n", - " {'AMD': 2})" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "symbol_list = trades_.Ticker.unique()\n", - "untraded_symbols = [s for s in weights.keys() if s not in trades_.Ticker.unique()]\n", - "for s in untraded_symbols:\n", - " weights.pop(s)\n", - "\n", - "\n", - "max_cash = {}\n", - "cash = 20_000\n", - "for s, w in weights.items():\n", - " if w * cash > 200:\n", - " max_cash[s] = 2\n", - " elif w * cash > 100:\n", - " max_cash[s] = 1\n", - " else:\n", - " max_cash[s] = 0.5\n", - "max_cash\n", - "pd.Series(weights).sort_values(ascending=False), max_cash" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "# from EventDriven.riskmanager import RiskManager, close_cache, spot_cache, chain_cache, oi_cache, LOOKBACKS, order_cache\n", - "# from pandas.tseries.offsets import BDay\n", - "\n", - "# rm = RiskManager(None, None, 1000000)\n", - "# rm.OrderPicker.liquidity_threshold = 2\n", - "# rm.OrderPicker.lookback = 10\n", - "# rm.OrderPicker.data_availability_threshold = 0.15\n", - "# date, tick = '2023-07-05', 'AVGO'\n", - "# date, tick = '2024-08-13', 'TSM'\n", - "# start = (pd.to_datetime(date) - BDay(30)).strftime('%Y-%m-%d')\n", - "# right = 'C'\n", - "# order_settings = {'type': 'spread',\n", - "# 'specifics': [{'direction': 'long',\n", - "# 'rel_strike': .50,\n", - "# 'dte': 210,\n", - "# 'moneyness_width': 0.5},\n", - "# # {'direction': 'short',\n", - "# # 'rel_strike': .60,\n", - "# # 'dte': 270,\n", - "# # 'moneyness_width': 0.35}\n", - "# ],\n", - "# 'name': 'vertical_spread'}\n", - "\n", - "# order = rm.OrderPicker.get_order(tick, date, right, 2, order_settings)\n", - "# order" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving to cache from db\n" - ] - }, - { - "data": { - "text/plain": [ - "1.0" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#Backtest class \n", - "## Find a way to not always reinitialize the backtest class, when want to redo\n", - "\n", - "pd.options.display.max_rows = 15\n", - "pd.options.display.max_columns = 15\n", - "\n", - "evb_backtest = OptionSignalBacktest(trades_, initial_capital=cash)\n", - "evb_backtest.portfolio.initial_capital\n", - "w_map = {x: w * 0.85 for x, w in weights.items()} ## 75% of the weights for each stock\n", - "evb_backtest.portfolio.weight_map = w_map\n", - "evb_backtest.portfolio.weight_map\n", - "evb_backtest.portfolio.risk_manager.OrderPicker.liquidity_threshold = 50\n", - "evb_backtest.portfolio.risk_manager.OrderPicker.lookback = 10\n", - "evb_backtest.portfolio.risk_manager.OrderPicker.data_availability_threshold = 0.5\n", - "evb_backtest.portfolio.order_settings = {'type': 'naked',\n", - " 'specifics': [{'direction': 'long',\n", - " 'rel_strike': .85,\n", - " 'dte': 365,\n", - " 'moneyness_width': 0.10},\n", - " {'direction': 'short',\n", - " 'rel_strike': .80,\n", - " 'dte': 365,\n", - " 'moneyness_width': 0.10}\n", - "],\n", - " 'name': 'vertical_spread'}\n", - "\n", - "\n", - "evb_backtest.portfolio.max_contract_price = max_cash\n", - "evb_backtest.executor.commission_rate = 0.65/100\n", - "evb_backtest.portfolio.min_moneyness_threshold = 5\n", - "evb_backtest.executor.max_slippage_pct = 0.075\n", - "evb_backtest.portfolio.roll_map = 90\n", - "evb_backtest.portfolio.moneyness_width_factor = .025\n", - "evb_backtest.portfolio.dte_reduction_factor = 30\n", - "evb_backtest.portfolio.min_acceptable_dte_threshold = 95\n", - "for key in max_cash:\n", - " if max_cash[key]*100 > evb_backtest.portfolio.allocated_cash_map[key]:\n", - " print(key, max_cash[key]*100, evb_backtest.portfolio.allocated_cash_map[key])\n", - "\n", - "\n", - "\n", - "signals = evb_backtest.bars.signal_df\n", - "signals_df = deepcopy(signals).set_index('Date')\n", - "signals_df[signals_df!=-1].sum().sum()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Problems:\n", - "\n", - "- Current Problem: SELL Signal and Buy Signal are put right next to each other in the queue. Whereas, it is meant to be Sell Signal -> Order Event -> Fill Event -> Buy Signal -> Order Event -> Fill Event\n", - "\n", - "Solution:\n", - "- Use a tuple of action ```python['CLOSE', 'OPEN']```\n", - "- Put first action into queue and return ffunctionality to backtester. Backtester then handles all corresponding sequence.\n", - "- Do the same for action two." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Buy Details\n", - "Position: {'long': ['AMD20220617C115'], 'short': ['AMD20220617C125'], 'trade_id': '&L:AMD20220617C115&S:AMD20220617C125', 'close': 1.9999999999999991}, Date: 2021-07-01, Signal: SignalEvent type:LONG, symbol=AMD, date:2021-07-01 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:AMD20210701LONG\n", - "Max Contract Price: 2, Cash at Hand: 24.56784911400662\n", - "Cash at Hand 24.56784911400662 Close 1.9999999999999991\n", - "Processing event: ORDER\n", - "Buy Order Position: {'long': ['AMD20220617C115'], 'short': ['AMD20220617C125'], 'trade_id': '&L:AMD20220617C115&S:AMD20220617C125', 'close': 1.9999999999999991} Price: 2.0764538773598953 Quantity: 11 Datetime: 2021-07-01 00:00:00\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Sell Order Position: {'long': ['AMD20220617C115'], 'short': ['AMD20220617C125'], 'trade_id': '&L:AMD20220617C115&S:AMD20220617C125', 'close': 1.5249999999999995} Price: 1.4879687231094032 Quantity: 11 Datetime: 2021-07-16 00:00:00\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - "No more dates left.\n" - ] - } - ], - "source": [ - "import cProfile\n", - "import pstats\n", - "import io\n", - "\n", - "profiler = cProfile.Profile()\n", - "profiler.enable()\n", - "#run backtest\n", - "\n", - "evb_backtest.run()\n", - "profiler.disable()\n", - "stream = io.StringIO()\n", - "stats = pstats.Stats(profiler, stream=stream).sort_stats('cumulative')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## ***VISUALIZE TEST RESULTS***" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "8\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
signal_iddatetimesymboldirectioncash_beforecash_after
0AMD20210701LONG2021-07-01AMDBUY2729.761013431.361748
1AMD20210701LONG2021-07-16AMDSELL431.3617482053.827343
\n", - "
" - ], - "text/plain": [ - " signal_id datetime symbol direction cash_before cash_after\n", - "0 AMD20210701LONG 2021-07-01 AMD BUY 2729.761013 431.361748\n", - "1 AMD20210701LONG 2021-07-16 AMD SELL 431.361748 2053.827343" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "##Transaction details\n", - "\n", - "pd.set_option('display.max_rows', 100)\n", - "print(_key)\n", - "transactions=evb_backtest.portfolio.transactions\n", - "transactions[transactions.symbol==tick]" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2298.399265095885" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "cash_used_position = transactions.loc[0, 'cash_before'] - transactions.loc[0, 'cash_after']\n", - "cash_used_position" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
PositionsEntryTimeExitTimeTickerPnLReturnPctEntryPriceExitPriceEntryMarketValueExitMarketValueEntryPriceExitPriceQuantitySignalIDDuration
0&L:AMD20220617C115&S:AMD20220617C1252021-07-012021-07-16AMD-675.93367-0.294089208.945388147.4968722284.0992651636.765595208.945388147.49687211AMD20210701LONG15
\n", - "
" - ], - "text/plain": [ - " Positions EntryTime ExitTime Ticker \\\n", - "0 &L:AMD20220617C115&S:AMD20220617C125 2021-07-01 2021-07-16 AMD \n", - "\n", - " PnL ReturnPct EntryPrice ExitPrice EntryMarketValue \\\n", - "0 -675.93367 -0.294089 208.945388 147.496872 2284.099265 \n", - "\n", - " ExitMarketValue EntryPrice ExitPrice Quantity SignalID \\\n", - "0 1636.765595 208.945388 147.496872 11 AMD20210701LONG \n", - "\n", - " Duration \n", - "0 15 " - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "##Trade details\n", - "trades = evb_backtest.portfolio._trades.copy()#\n", - "len(trades)\n", - "preferred_cols = ['Positions','EntryTime', 'ExitTime','Ticker','PnL', 'ReturnPct', 'EntryPrice', 'ExitPrice', 'EntryMarketValue', 'ExitMarketValue', 'EntryPrice', 'ExitPrice', 'Quantity', 'SignalID', 'Duration']\n", - "trades[preferred_cols]" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{}" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "reasons = {\n", - " x['reason']:0 for x in evb_backtest.portfolio.unprocessed_signals\n", - "}\n", - "\n", - "for v in (evb_backtest.portfolio.unprocessed_signals):\n", - " reasons[v['reason']] += 1\n", - " print(v) \n", - "reasons" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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Dh06uJb3WJl37NjBa6+9xpo1aygsLKR169YMGDCAmJgY1/KuWrWKOXPm8Msvv7B3716GDh1K+/btASgsLGTGjBn89NNPpKenExkZSatWrejXrx+1atXyy8wAM2fOZMGCBezevZvQ0FCaNGlC3759ad68ud9mPtSrr77KZ599xi233MKVV15ZwUlLOlbuF154ga+//rrEa1q3bs2wYcMqOmqFUslxwYIFC5g2bRp33HEHzZs3Z+7cuYwePZpnn32WrKws9uzZw0033URCQgIZGRlMnDiRvXv3ct999/ll5ho1agBw6aWX0qdPH99r3CwKcOzMqampjB49mp49ezJgwABCQkLYtGkTxhi/zBwbG8urr75aYv/PPvuMOXPm0LZtW5cSH/vnPGHCBA4cOMADDzxA9erV+fbbb3nmmWcYM2YMjRs39rvMVapUYfTo0TRq1IjHHnsMgBkzZjB27FhGjx6Nx+POAHheXh5JSUlccskl/Otf/yrxXH5+Pr/88gu9evUiKSmJ7OxspkyZwrhx4xgzZowreeHomQHi4+MZMGAAdevWJT8/n7lz5zJq1Cief/55oqOjXUh87MzFFi1axLp166hZs2YFpvtzx5O7TZs2DBo0yPe4Mtz2KCg+4dF+I/vss8/49ttv+eWXX8jNzeU///kP1apVczXvhx9+yKWXXsrFF18MwB133MGSJUv48ssvueaaaxg6dKhv33r16tG3b1+ef/55ioqKCAkJ8cvMAFWqVHH1N90/OlbmqVOn0q1bN19+8P6l66ZjZf7jz3fRokWce+65VK1a1YW0XsfKvHbtWu644w7f/yd79erF3Llz2bhxo2sl52iZGzduTHp6OmPHjvWNnv71r3/ltttuY8WKFZxxxhmuZG7btu2fltnIyEgeeeSREtsGDBjAww8/TEZGBrGxsRUR8TBHywxwwQUXlHh8880388UXX/Drr7/SqlWr8o53RMfKDLBnzx4mT57MsGHDXC2Rhzqe3KGhoX71d/TxjJpt2bKFN954g1WrVuE4DgkJCdx3333H/d90wM/JKf6N7LrrrmPs2LE0atSI0aNHk5WVBXjbbZs2bejZs6fLSb0KCwvZuHFjif8DezweWrVqRWpq6hFfk5OTQ0REhGsF53gzf/PNN9x+++3cd999vPnmm+Tl5bkRFzh25qysLNatW0eNGjUYPnw4d9xxB4899hhr1qzx28x/tHHjRjZt2sQll1xSkTFLOJ7MLVq0YMGCBWRnZ+M4Dt999x0FBQWcfvrpfpm5oKAAY0yJy1fDwsIwxrj630dp5eTkYIxx/TT38SosLOSzzz4jMjKSRo0auR3nTzmOw/PPP0+PHj1o2LCh23FKZdWqVQwcOJB77rmHiRMnsn//flfzFI8+3X777Ud8fseOHTz66KM0aNCAxx9/nKeeeopevXqV6tLygB/JOdZvkcXnSVeuXOlmTJ99+/bhOM5hbTomJoZt27Ydcf933nmHzp07V1DCwx1P5gsuuIDY2Fhq1arFr7/+yhtvvMG2bdtKjEpVpGNl3rlzJwBvv/02N910E0lJSXz99deMHDmS8ePHU79+fb/L/EdffPEFDRo0oEWLFhWU8HDHk/nvf/87zz77rO+UYHh4OEOHDqVevXouJD525uTkZKpUqcIbb7zBDTfcgLWWN998E8dxyMzMdCVzaeXn5/PGG29w/vnn+33JWbx4Mc8++yz5+fnExMQwfPhw105VHY/333+fkJAQunXr5naUUmnTpg3nnHMOcXFx7Nixg+nTp/PEE0+4egr2WKNPM2bMoG3btvTv39+3rbR/bwR0ySn+jezQ0w3HGhUJJDk5OYwZM4aEhASuv/56t+Mc1aElLDExkZo1azJy5Eh27Njh2pfZ0RQvD9W5c2dfQW7cuDErVqzgyy+/pF+/fm7GO6b8/Hy+/fZbevXq5XaUY3rrrbc4cOAAjzzyCNWrV+eHH37gmWeeYeTIkSQmJrod7zDR0dHce++9TJo0iY8//hhjDOeffz6NGzd2db7W8SosLOSZZ54BYODAgS6nObbTTz+dp556in379vH555/zzDPP8MQTT/jm+vmTjRs38tFHHzF27NiA+G/hUOeff77v3xMTE2nUqBFDhgxh5cqVrp0aPBrHcViyZAk9evRg9OjR/PLLL8TFxXHNNdf86UTwIwno01VH+43MX3/jio6OxuPxHJYvMzOzxOfIzc3liSeeICIigqFDh7o6Qex4Mx/q0KtU3HCszMWTBRMSEko836BBAzIyMioqZgml+Tl///335OXl0bFjx4oLeATHyrxjxw4++eQT7r77blq1akVSUhLXX389TZs25ZNPPvHLzOC96uT5559n4sSJpKSkMGTIEPbs2UPdunUrPnApFBecjIwMhg8f7vejOABVq1alXr16JCcnc/fddxMSEsIXX3zhdqwjWr16Nfv27WPQoEH07duXvn37smvXLqZNm8bgwYPdjlcqdevWpXr16q79HX0s+/bt4+DBg7z//vu0bt2a4cOH0759e8aPH3/YlbxHE9AlJxAVXya5YsUK3zbHcVixYgXJycmAdwRn1KhRhIaGcv/997t+ldLxZP6jTZs2Abh25cGxMtepU4eaNWsedhpo+/btrk3SLM3P+YsvvqBdu3auD+sfK3N+fj7AYb/1ejwe3FpsvTQ/5+joaKpVq8aKFSvYt28f7dq1q+i4x6244OzYscM3ahaIrLUUFBS4HeOILrroIp566inGjRvn+6dmzZr06NEj4C7F3r17N9nZ2X5zddgfOY4DQLt27ejevTtJSUlcc801nHnmmcyfP/+4jxPQp6tOZITBH3Tv3p0XXniBJk2a0KxZMz766CPy8vLo1KkTOTk5jB49mry8PIYMGUJubi65ubnA75/X3zLv2LGDb7/9ljPPPJOoqCg2b97M1KlTOfXUU12dQHi0zMYYevTowcyZM0lKSiIpKYmvvvqKrVu3cu+99/pl5mI7duxg9erVPPTQQ67lPNTRMkdFRVGvXj0mTpzITTfdRFRUFD/88APLly/ngQce8MvMAF9++SUNGjQgOjqa1NRUpkyZwpVXXunq1XcHDx4s8Vt3eno6mzZtIioqipiYGJ5++ml++eUXHnjggRLzh6KiolwbCT5a5qioKN59913atWtHzZo12b9/P5988gl79uxxdc2no2WOjY09rDwWX7Hk9pWZx/pZv/3225xzzjnExMSwc+dOXn/9derVq0fr1q1dTP3noqOjCQkJOeJo+9q1a4/7OAFdcg79jaz4HF3xb2Rdu3Z1Od2fO++889i3bx8zZ84kMzOTpKQkHn74YWJiYli5ciXr1q0D4G9/+1uJ102YMIG4uDg3Ih81c0ZGBj///LPvi6J27dqcc845XHvtta5kPZ7MAFdeeSUFBQVMnTqV7OxsGjVqxCOPPOLqHKJjZQbvKE6tWrVcu5T5j46V+aGHHuKNN95g7NixHDx4kHr16jF48GDOPPNMv828bds23nzzTbKzs4mLi+Paa691fbG3DRs2MGLECN/jadOmAdCxY0euv/56fvzxRwDuv//+Eq977LHHXLuS7WiZ77jjDrZt28b48ePZv38/1atXp2nTpowYMcLVq5aOltmfT0kd62e9efNmvv76aw4cOOD7+6NPnz5+exPr0NBQmjZtetKj7QF/g84FCxbwwgsv+Nbh+Oijj1i4cCHPPPOMb25OZmYmGzZs4JVXXmHEiBFEREQQGxtLVFSU2/FFREQqpUNHn+6//35uvvlmWrZs6Rs1W7RoEc888wy33347LVu2ZOnSpUyZMoXHH3+cU0455bjeI+BLDngXA5wzZ47vN7LbbrvNtyz4zJkzmTVr1mGvGTRoUIlTACIiIlJxVq5cWWL0qdiho2ZffPEF7733Hrt37yY+Pp7evXtz9tlnH/d7BEXJEREREfkjXV0lIiIiQUklR0RERIKSSo6IiIgEJZUcERERCUoqOSIiIhKUKl3J6d27N4sWLXI7hoiIiJSzgC85L7zwAuPGjXM7hoiIiPiZgC85IiIiIkcSVCVn8ODBzJ07t8S2f/zjH8ycOdOlRCIiIuKWoCo5IiIiIsVUckRERCQoqeSIiIhIUAqqkmOM4Y/3Gy0qKnIpjYiIiLgpqEpOdHQ0mZmZvsc5OTmkp6e7F0hERERcE+p2gLLUsmVLvvrqK8466yyqVavGW2+9hccTVD1OREREjlPAlxxrLSEhIQBcc801pKenM2bMGCIjI+nTp49GckRERCopY/84iSXAjB49mnr16nH77be7HUVERET8SMCey8nOzmbx4sWsWrWKVq1auR1HRERE/EzAnq566aWX2LBhA927d+fss892O46IiIj4mYA/XSUiIiJyJAF7ukpERETkaFRyREREJCj57Zyc2bNns2jRIrZu3Up4eDjJycn079+f+Ph43z75+flMmzaNBQsWUFBQQOvWrRk4cCAxMTEAbNq0iffee4+1a9eyb98+4uLiuOyyy7jiiit8x9i7dy/Tpk1j48aN7Nixg27dunHrrbdW8KcVERGRsua3IzmrVq2iS5cujB49muHDh1NUVMSoUaM4ePCgb5+pU6eyePFi7r33XkaMGMHevXsZP3687/mNGzdSo0YNhgwZwtNPP03Pnj158803+eSTT3z7FBQUEB0dzbXXXkujRo0q9DOKiIhI+fHbkZxhw4aVeDx48GAGDhzIxo0bOe2008jJyeGLL77gnnvuoWXLlgAMGjSIv//976SmppKcnMwll1xS4hh169YlNTWV//3vf3Tt2hWAuLg4brvtNgC+/PLLCvhkIiIiUhH8diTnj3JycgCIiooCvKM0RUVFJdbIadCgAbGxsaSmph71OMXHEBERkeAVECXHcRymTJlCixYtSExMBCAzM5PQ0FCqVatWYt8aNWqUuEnnodauXcvChQvp3LlzeUcWERERlwVEyUlJSSEtLY3/+7//O+FjbN68mXHjxnHdddfRunXrsgsnIiIifsnvS05KSgpLlizhscceo3bt2r7tMTExFBYWcuDAgRL7Z2Vl+a6uKrZlyxb++c9/0rlzZ3r16lURsUVERMRlfltyrLWkpKSwaNEiHn30UeLi4ko836RJE0JCQvj5559927Zt20ZGRgbJycm+bWlpaYwYMYKOHTtyww03VFh+ERERcZffXl2VkpLCt99+y/33309ERIRvnk1kZCTh4eFERkZyySWXMG3aNKKiooiMjGTy5MkkJyf7Ss7mzZsZOXIkrVu3pnv37r5jeDweoqOjfe+1adMmAA4ePMi+ffvYtGkToaGhJCQkVORHFhERkTLkt/eu6t279xG3Dxo0iE6dOgG/Lwb43XffUVhYeNhigDNnzmTWrFmHHaNOnTq88MILR32vP+4jIiIigcVvS46IiIjIyfDbOTkiIiIiJ0MlR0RERIKSSo6IiIgEJZUcERERCUoqOSIiIhKUVHJEREQkKKnkiIiISFBSyRGRkzJz5sw/XbzTLf6YSUQqnkqOiLhi3rx5fPXVVyf8+ry8PGbOnMnKlSvLLpSIBBWVHBFxxfz580+65MyaNeuIJadXr168/vrrJ5FORIKB396gU0TkRIWEhBASEuJ2DBFxme5dJSLHbc2aNUydOpXNmzdTq1YtevTowd69e5k1axYzZ84E4Msvv+S///0vaWlp5OTkULduXbp168bll1/uO87gwYPZtWtXiWOfdtppPP744wAcOHCAt99+m//9739kZWVRu3ZtLr30Unr06IHH4yE9PZ2//vWvh+W77rrr6N27t+/mvMWZwHsj3i5dunDaaacxc+ZM0tPTSUpK4i9/+QuJiYl8+umnzJkzhz179tC8eXMGDRpEXFxcieOvW7eOmTNnkpqaSlFREU2bNuWGG27glFNOKasfsYiUIY3kiMhx2bx5M6NGjSI6Oprrr7+eoqIiZs6cSUxMTIn95s+fT8OGDWnXrh0hISEsXryYSZMm4TgOXbt2BeCWW27hP//5D1WrVqVnz54AvuPk5eXx+OOPs2fPHjp37kxsbCxr165l+vTpZGZmcuuttxIdHc3AgQOZNGkS7du3p3379gA0atToqJ9hzZo1/Pjjj3Tp0gWA9957jzFjxtCjRw/mz59Ply5dyM7OZs6cObz00ks89thjvteuWLGCJ554giZNmnD99ddjjOGrr75i5MiRjBw5kmbNmpXFj1lEypBKjogcl7feegtrLSNHjiQ2NhaAc845h6FDh5bYb8SIEYSHh/sed+3aldGjRzN37lxfyWnfvj1vvfUW1atX56KLLirx+g8//JAdO3Ywbtw46tevD8Bll11GrVq1mDNnDt27dyc2NpYOHTowadIkEhMTDzvGn9m2bRvPPPOMb4QmKiqKV199lXfffZfnnnuOiIgIABzH4b333iM9PZ24uDistUycOJHTTz+dhx9+GGOML9e9997LjBkzGD58eGl/pCJSzjTxWESOyXEcli1bxtlnn+0rOAAJCQm0bt26xL6HFpycnBz27dvHaaedxs6dO8nJyTnme33//feceuqpVKtWjX379vn+adWqFY7jsHr16hP+HC1btixxCqp49OWcc87xFRyA5s2bA5Ceng7Apk2b2L59OxdccAH79+/3ZTp48CAtW7Zk9erVOI5zwrlEpHxoJEdEjmnfvn3k5+f7RlYOFR8fz08//eR7vGbNGt5++21SU1PJy8srsW9OTg6RkZFHfa/t27fz66+/MnDgwCM+n5WVdQKfwOvQggb4stSuXfuI27Ozs32ZAF544YU/PXZOTg5RUVEnnE1Eyp5KjoiUmR07dvDPf/6T+Ph4br75ZmrXrk1oaCg//fQTc+fOPa7RDmstZ5xxBj169Dji8/Hx8Secz+M58uD1n20/NBNA//79SUpKOuI+VatWPeFcIlI+VHJE5Jiio6MJDw/3jWgcatu2bb5/X7x4MQUFBTzwwAMlRk1Ks2Bf3bp1OXjwIGecccZR9yueF1MR6tatC3hHeI6VS0T8h+bkiMgxeTweWrduzQ8//EBGRoZv+5YtW1i2bFmJ/eD3kQ/wnsY50qJ/VatW5cCBA4dtP/fcc0lNTWXp0qWHPXfgwAGKiooAqFKliu/45a1JkybUrVuXDz74gIMHDx72/L59+8o9g4iUnkZyROS49O7dm6VLl/Loo49y+eWX4zgOH3/8MQ0bNuTXX38FoHXr1oSGhjJ27Fg6d+7MwYMH+fzzz4mOjmbv3r0ljte4cWM+/fRT3nnnHerVq0eNGjVo2bIlPXr04Mcff2Ts2LF07NiRJk2akJeXx+bNm/n+++954YUXfCNLCQkJLFiwgPr16xMVFUXDhg1JTEws88/u8Xi46667eOKJJ7j33nvp1KkTtWrVYs+ePaxcuZKIiAgefPDBMn9fETk5KjkiclwaNWrEsGHDmDZtGjNnzqR27dr07t2bvXv3+kpOfHw89957L2+99RavvfYaMTExXH755URHR/PSSy+VON51111HRkYGc+bMITc3l9NOO42WLVtSpUoVRowYwbvvvsv333/Pf//7XyIiIoiPj6d3794lJi7fddddTJ48malTp1JYWMh1111XLiUH4PTTT2f06NHMmjWLefPmcfDgQWJiYmjWrBmXXXZZubyniJwcrXgsIiIiQUlzckRERCQoqeSIiIhIUFLJERERkaCkkiMiIiJBSSVHREREgpJKjoiIiAQllRwREREJSio5IiIiEpRUckRERCQoqeSIiIhIUFLJERERkaCkkiMiIiJBSSVHREREgtL/Aym5C78Cl6i1AAAAAElFTkSuQmCC", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# evb_backtest.portfolio._equity.plot(y = 'COST'), evb_backtest.portfolio._equity.plot(y = 'AAPL'), evb_backtest.portfolio._equity.plot(y = 'NVDA')\n", - "# for col in evb_backtest.portfolio._equity.columns:\n", - "# if col not in ['cash', 'Total']:\n", - "# evb_backtest.portfolio._equity.plot(y = col)\n", - "# plt.show()\n", - "evb_backtest.portfolio._equity.plot(y = tick)" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "name": "Equity Curve", - "showlegend": true, - "type": "scatter", - "x": [ - "2021-07-01T00:00:00", - "2021-07-02T00:00:00", - "2021-07-05T00:00:00", - "2021-07-06T00:00:00", - "2021-07-07T00:00:00", - "2021-07-08T00:00:00", - "2021-07-09T00:00:00", - "2021-07-12T00:00:00", - "2021-07-13T00:00:00", - "2021-07-14T00:00:00", - "2021-07-15T00:00:00", - "2021-07-16T00:00:00" - ], - "xaxis": "x", - "y": [ - 0.9999999630731151, - 1.0138179470465196, - 1.0276359310199241, - 1.0276359310199241, - 0.990327374291732, - 0.9944727694837533, - 0.9917091726890724, - 0.9999999630731151, - 0.990327374291732, - 0.9751275919209871, - 0.9640732047422634, - 0.9709806893125323 - ], - "yaxis": "y" - }, - { - "name": "Benchmark", - "showlegend": true, - "type": "scatter", - "x": [ - "2021-07-01T00:00:00", - "2021-07-02T00:00:00", - "2021-07-05T00:00:00", - "2021-07-06T00:00:00", - "2021-07-07T00:00:00", - "2021-07-08T00:00:00", - "2021-07-09T00:00:00", - "2021-07-12T00:00:00", - "2021-07-13T00:00:00", - "2021-07-14T00:00:00", - "2021-07-15T00:00:00", - "2021-07-16T00:00:00", - "2021-07-19T00:00:00" - ], - "xaxis": "x", - "y": [ - null, - 1.0076435392535483, - 1.0076435392535483, - 1.0058081454418608, - 1.009362727616271, - 1.0011384447187495, - 1.011825375611603, - 1.015449652695307, - 1.011988020700026, - 1.0134981243348673, - 1.0100364923395864, - 1.0021141734488628, - 0.9873150302070356 - ], - "yaxis": "y" - }, - { - "customdata": [ - 11 - ], - "hovertemplate": "%{text}

Date: %{x}
Size: %{customdata}
PnL: %{y}
", - "marker": { - "color": [ - "red" - ] - }, - "mode": "markers", - "name": "Ticker", - "showlegend": false, - "text": [ - "AMD" - ], - "type": "scatter", - "x": [ - "2021-07-01T00:00:00" - ], - "xaxis": "x2", - "y": [ - -0.2940888817449839 - ], - "yaxis": "y2" - }, - { - "fill": "tozeroy", - "line": { - "color": "red" - }, - "name": "Drawdown", - "showlegend": false, - "type": "scatter", - "x": [ - "2021-07-01T00:00:00", - "2021-07-02T00:00:00", - "2021-07-05T00:00:00", - "2021-07-06T00:00:00", - "2021-07-07T00:00:00", - "2021-07-08T00:00:00", - "2021-07-09T00:00:00", - "2021-07-12T00:00:00", - "2021-07-13T00:00:00", - "2021-07-14T00:00:00", - "2021-07-15T00:00:00", - "2021-07-16T00:00:00" - ], - "xaxis": "x3", - "y": [ - 0, - 0, - 0, - 0, - -0.03630522664823954, - -0.03227131257621296, - -0.03496058862423068, - -0.026892760480177413, - -0.03630522664823954, - -0.05109624491233722, - -0.061853349104408206, - -0.05513184122821879 - ], - "yaxis": "y3" - }, - { - "histnorm": "percent", - "marker": { - "color": "purple" - }, - "showlegend": false, - "type": "histogram", - "xaxis": "x4", - "y": [ - null, - -0.021807439507827042, - -0.020901998784932263 - ], - "yaxis": "y4" - }, - { - "histnorm": "percent", - "marker": { - "color": "purple" - }, - "showlegend": false, - "type": "histogram", - "xaxis": "x5", - "y": [ - null - ], - "yaxis": "y5" - } - ], - "layout": { - "annotations": [ - { - "font": { - "size": 16 - }, - "showarrow": false, - "text": "EQUITY CURVE", - "x": 0.5, - "xanchor": "center", - "xref": "paper", - "y": 0.9999999999999999, - "yanchor": "bottom", - "yref": "paper" - }, - { - "font": { - "size": 16 - }, - "showarrow": false, - "text": "TRADES", - "x": 0.5, - "xanchor": "center", - "xref": "paper", - "y": 0.5576923076923076, - "yanchor": "bottom", - "yref": "paper" - }, - { - "font": { - "size": 16 - }, - "showarrow": false, - "text": "PORTFOLIO DRAWDOWN", - "x": 0.5, - "xanchor": "center", - "xref": "paper", - "y": 0.3769230769230769, - "yanchor": "bottom", - "yref": "paper" - }, - { - "font": { - "size": 16 - }, - "showarrow": false, - "text": "WEEKLY PORTFOLIO RTRNS", - "x": 0.2375, - "xanchor": "center", - "xref": "paper", - "y": 0.13076923076923078, - "yanchor": "bottom", - "yref": "paper" - }, - { - "font": { - "size": 16 - }, - "showarrow": false, - "text": "MONTHLY PORTFOLIO RTRNS", - "x": 0.7625, - "xanchor": "center", - "xref": "paper", - "y": 0.13076923076923078, - "yanchor": "bottom", - "yref": "paper" - } - ], - "height": 1050, - "hovermode": "x unified", - "margin": { - "b": 20, - "l": 15, - "r": 15, - "t": 50 - }, - "paper_bgcolor": "WHITE", - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "heatmapgl": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmapgl" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "width": 1200, - "xaxis": { - "anchor": "y", - "domain": [ - 0, - 1 - ] - }, - "xaxis2": { - "anchor": "y2", - "domain": [ - 0, - 1 - ] - }, - "xaxis3": { - "anchor": "y3", - "domain": [ - 0, - 1 - ] - }, - "xaxis4": { - "anchor": "y4", - "domain": [ - 0, - 0.475 - ] - }, - "xaxis5": { - "anchor": "y5", - "domain": [ - 0.525, - 1 - ] - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0.6076923076923076, - 0.9999999999999999 - ] - }, - "yaxis2": { - "anchor": "x2", - "domain": [ - 0.42692307692307685, - 0.5576923076923076 - ] - }, - "yaxis3": { - "anchor": "x3", - "domain": [ - 0.1807692307692308, - 0.3769230769230769 - ] - }, - "yaxis4": { - "anchor": "x4", - "domain": [ - 0, - 0.13076923076923078 - ] - }, - "yaxis5": { - "anchor": "x5", - "domain": [ - 0, - 0.13076923076923078 - ] - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "evb_backtest.portfolio.plot_portfolio()" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Start 2021-07-01 00:00:00\n", - "End 2021-07-16 00:00:00\n", - "Duration 15 days 00:00:00\n", - "Exposure Time [%] 100.0\n", - "Equity Final [$] 19324.07\n", - "Equity Peak [$] 20451.600735\n", - "Return [%] -2.90195\n", - "Buy & Hold Return [%] -7.212513\n", - "CAGR [%] -51.15849\n", - "Volatility Ann. [%] 24.410428\n", - "Sharpe Ratio -2.819375\n", - "Sortino Ratio -3.213905\n", - "Skew -1.114858\n", - "Calmar Ratio 8.270933\n", - "Max. Drawdown [%] -6.185335\n", - "Max. Drawdown Value [$] -1265.0\n", - "Avg. Drawdown [%] -2.790138\n", - "Max. Drawdown Duration 11 days 00:00:00\n", - "Avg Dradown Duration 4 days 14:00:00\n", - "# Trades 1\n", - "Win Rate [%] 0.0\n", - "Lose Rate [%] 100.0\n", - "Avg. Trade [%] -29.408888\n", - "Avg. Winning Trade [%] 0\n", - "Avg. Losing Trade [%] -29.408888\n", - "Best Trade [%] -29.408888\n", - "Worst Trade [%] -29.408888\n", - "Avg Trade Duration 15.0\n", - "Avg Win Trade Duration NaN\n", - "Avg Lose Duration 15.0\n", - "Max Trade Duration 15\n", - "Max Win Trade Duration NaN\n", - "Max Lose Duration 15\n", - "Profit Factor 0.0\n", - "Expectancy [%] -29.408888\n", - "SQN -inf\n", - "2021 Return [%] -2.90195\n", - "Winning Streak NaN\n", - "Losing Streak 1\n", - "_strategy None\n", - "equity_curve AMD cash commiss...\n", - "_trades Ticker PnL ReturnPct EntryPrice En...\n", - "_tickers [AMD]\n", - "dtype: object" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.portfolio.aggregate()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## ***ANALYZE POSITIONS***" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[0;31mSignature:\u001b[0m\n", - "\u001b[0mCalculate\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mattribution\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0masset\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mts_start\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mts_end\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mts_timeframe\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'day'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mts_timewidth\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'1'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mmethod\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'GB'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mreplace\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'partial'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mreturn_both_data\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mDocstring:\u001b[0m\n", - "Calculate attribution of option asset \n", - "\n", - "Parameter:\n", - "____________\n", - "ts_start (str | Datetime): Start date if timeseries\n", - "ts_end (str | Datetime): End date if timeseries \n", - "ts_timewidth (int): Examples 1,2,3,4. The span over the timeframe\n", - "ts_timeframe (str): The timeframe for aggregation, eg: Minute, Hour, Day, Month, Week, Year\n", - "method (str): Available methods are 'GB' for Greek Based and 'RV' for Revaluation\n", - "replace (str): Available options are 'partial', 'close', 'default_fill'. Partial replaces only the missing data, Close uses close data to fill, default_fill uses the default fill for all data\n", - "return_both_data (bool): If True. Will return both the PnL Data and Full Data\n", - "return_all: specific to OptionStructure. If True, will return all the data for the long and short leg\n", - "\u001b[0;31mFile:\u001b[0m ~/cloned_repos/QuantTools/trade/assets/Calculate.py\n", - "\u001b[0;31mType:\u001b[0m function" - ] - } - ], - "source": [ - "create_object_from_id?\n", - "Calculate.attribution?" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "trades['structure_object'] = trades.apply(lambda x: create_object_from_id(x['Positions'], date = x['ExitTime'].strftime('%Y-%m-%d')), axis=1)" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "('2021-07-01', '2021-07-16')" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "trades[preferred_cols+['structure_object']]\n", - "focus_index = 0\n", - "focus_object = trades.iloc[focus_index].structure_object\n", - "quantity = trades.iloc[focus_index].Quantity\n", - "ticker = trades.iloc[focus_index].Ticker\n", - "cash_for_tick = w_map[ticker] * 20_000\n", - "focus_start, focus_end = trades.iloc[focus_index].EntryTime.strftime('%Y-%m-%d'), trades.iloc[focus_index].ExitTime.strftime('%Y-%m-%d')\n", - "with Context(end_date = focus_start):\n", - " tick_on_start = Stock(ticker)\n", - " spot = list(tick_on_start.spot(spot_type = 'chain_price').values())[0]\n", - "\n", - "with Context(end_date = focus_end):\n", - " tick_on_start = Stock(ticker)\n", - " spot_end = list(tick_on_start.spot(spot_type = 'chain_price').values())[0]\n", - " \n", - "focus_start, focus_end" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'AMD20220617C115'" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "focus_object.Structure['long'][0].OptTick" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1.305" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "size_leverage = 4.5\n", - "eq_equivalent_size = (math.floor(cash_for_tick/spot)/100) * size_leverage\n", - "eq_equivalent_size" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[0;31mSignature:\u001b[0m\n", - "\u001b[0mfocus_object\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgreeks\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mgreek_type\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'greek'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mts_start\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mts_end\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mts_timewidth\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mts_timeframe\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mreturn_all\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mDocstring:\u001b[0m\n", - "The greeks method returns a timeseries dataframe for greeks based. Only available for BSM model\n", - "\n", - "PARAMS\n", - "______\n", - "ts (Bool): True to return dataframe timeseries, false to return spot in a dict\n", - "ts_start (str|datetime): Start Date\n", - "ts_end (str|datetime): End Date\n", - "ts_timewidth (str|int): Steps in timeframe\n", - "ts_timeframe (str): Target timeframe for series \n", - "greek_type (str): Type of greek to return. Default is 'greek'.\n", - " 'greek' returns all greek, while passing 'delta', 'gamma', 'theta', 'vega' returns only the specific greek\n", - "return_all (bool): True to return all from each leg, False to return only the aggregate greeks\n", - "\n", - "\n", - "RETURNS\n", - "_________\n", - "pd.DataFrame or dict\n", - "\u001b[0;31mFile:\u001b[0m ~/cloned_repos/QuantTools/trade/assets/OptionStructure.py\n", - "\u001b[0;31mType:\u001b[0m method" - ] - } - ], - "source": [ - "focus_object.greeks?" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Exception in thread SaveDataProcess:\n", - "Traceback (most recent call last):\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py\", line 1045, in _bootstrap_inner\n", - " self.run()\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/ipkernel.py\", line 766, in run_closure\n", - " _threading_Thread_run(self)\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py\", line 982, in run\n", - " self._target(*self._args, **self._kwargs)\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/helpers/DataManagers.py\", line 416, in __process_data\n", - " processed_data = Calc_Risks(data, timeAggType, self.symbol, end,self.exp, self.right, start, self.strike,)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/Organizers.py\", line 122, in Calc_Risks\n", - " data['Binomial_IV'] = data.apply(lambda x: binomial_implied_vol(\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py\", line 10374, in apply\n", - " return op.apply().__finalize__(self, method=\"apply\")\n", - " ^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py\", line 916, in apply\n", - " return self.apply_standard()\n", - " ^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py\", line 1063, in apply_standard\n", - " results, res_index = self.apply_series_generator()\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py\", line 1081, in apply_series_generator\n", - " results[i] = self.func(v, *self.args, **self.kwargs)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/Organizers.py\", line 122, in \n", - " data['Binomial_IV'] = data.apply(lambda x: binomial_implied_vol(\n", - " ^^^^^^^^^^^^^^^^^^^^^\n", - "TypeError: binomial_implied_vol() got an unexpected keyword argument 'T'\n", - "Exception in thread SaveDataProcess:\n", - "Traceback (most recent call last):\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py\", line 1045, in _bootstrap_inner\n", - " self.run()\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/ipkernel.py\", line 766, in run_closure\n", - " _threading_Thread_run(self)\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py\", line 982, in run\n", - " self._target(*self._args, **self._kwargs)\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/helpers/DataManagers.py\", line 416, in __process_data\n", - " processed_data = Calc_Risks(data, timeAggType, self.symbol, end,self.exp, self.right, start, self.strike,)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/Organizers.py\", line 122, in Calc_Risks\n", - " data['Binomial_IV'] = data.apply(lambda x: binomial_implied_vol(\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py\", line 10374, in apply\n", - " return op.apply().__finalize__(self, method=\"apply\")\n", - " ^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py\", line 916, in apply\n", - " return self.apply_standard()\n", - " ^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py\", line 1063, in apply_standard\n", - " results, res_index = self.apply_series_generator()\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py\", line 1081, in apply_series_generator\n", - " results[i] = self.func(v, *self.args, **self.kwargs)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/Organizers.py\", line 122, in \n", - " data['Binomial_IV'] = data.apply(lambda x: binomial_implied_vol(\n", - " ^^^^^^^^^^^^^^^^^^^^^\n", - "TypeError: binomial_implied_vol() got an unexpected keyword argument 'T'\n" - ] - }, - { - "ename": "ValueError", - "evalue": "Neither `start` nor `end` can be NaT", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[21], line 4\u001b[0m\n\u001b[1;32m 1\u001b[0m long_leg \u001b[38;5;241m=\u001b[39m focus_object\u001b[38;5;241m.\u001b[39mStructure[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlong\u001b[39m\u001b[38;5;124m'\u001b[39m][\u001b[38;5;241m0\u001b[39m]\n\u001b[1;32m 2\u001b[0m short_leg \u001b[38;5;241m=\u001b[39m focus_object\u001b[38;5;241m.\u001b[39mStructure[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mshort\u001b[39m\u001b[38;5;124m'\u001b[39m][\u001b[38;5;241m0\u001b[39m]\n\u001b[0;32m----> 4\u001b[0m long_attribution \u001b[38;5;241m=\u001b[39m \u001b[43mCalculate\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mattribution\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 5\u001b[0m \u001b[43m \u001b[49m\u001b[43masset\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mlong_leg\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 6\u001b[0m \u001b[43m \u001b[49m\u001b[43mts_start\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mfocus_start\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 7\u001b[0m \u001b[43m \u001b[49m\u001b[43mts_end\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mfocus_end\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 8\u001b[0m \u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mGB\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 9\u001b[0m \u001b[43m \u001b[49m\u001b[43mreplace\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mdefault_fill\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 10\u001b[0m \u001b[43m \u001b[49m\u001b[43mreturn_both_data\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\n\u001b[1;32m 11\u001b[0m \u001b[43m)\u001b[49m\n\u001b[1;32m 13\u001b[0m short_attribution \u001b[38;5;241m=\u001b[39m Calculate\u001b[38;5;241m.\u001b[39mattribution(\n\u001b[1;32m 14\u001b[0m asset \u001b[38;5;241m=\u001b[39m short_leg,\n\u001b[1;32m 15\u001b[0m ts_start \u001b[38;5;241m=\u001b[39m focus_start,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 19\u001b[0m return_both_data \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m\n\u001b[1;32m 20\u001b[0m )\n\u001b[1;32m 23\u001b[0m attribution_gb \u001b[38;5;241m=\u001b[39m Calculate\u001b[38;5;241m.\u001b[39mattribution(\n\u001b[1;32m 24\u001b[0m asset \u001b[38;5;241m=\u001b[39m focus_object,\n\u001b[1;32m 25\u001b[0m ts_start \u001b[38;5;241m=\u001b[39m focus_start,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 28\u001b[0m replace \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mdefault_fill\u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[1;32m 29\u001b[0m ) \n", - "File \u001b[0;32m~/cloned_repos/QuantTools/trade/assets/Calculate.py:778\u001b[0m, in \u001b[0;36mCalculate.attribution\u001b[0;34m(asset, ts_start, ts_end, ts_timeframe, ts_timewidth, method, replace, return_both_data, **kwargs)\u001b[0m\n\u001b[1;32m 774\u001b[0m full_data\u001b[38;5;241m.\u001b[39mloc[close_fill_mask, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mOption_Close\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m full_data\u001b[38;5;241m.\u001b[39mloc[close_fill_mask, asset\u001b[38;5;241m.\u001b[39mdefault_fill\u001b[38;5;241m.\u001b[39mcapitalize()]\n\u001b[1;32m 777\u001b[0m \u001b[38;5;66;03m## Get Vol Timeseries\u001b[39;00m\n\u001b[0;32m--> 778\u001b[0m vol \u001b[38;5;241m=\u001b[39m \u001b[43masset\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mvol\u001b[49m\u001b[43m(\u001b[49m\u001b[43mts_start\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mstart\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\n\u001b[1;32m 779\u001b[0m \u001b[43m \u001b[49m\u001b[43mts_end\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mend\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 780\u001b[0m \u001b[43m \u001b[49m\u001b[43mts_timeframe\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mts_timeframe\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 781\u001b[0m \u001b[43m \u001b[49m\u001b[43mts_timewidth\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mts_timewidth\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 782\u001b[0m \u001b[43m \u001b[49m\u001b[43mts\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m[vol_col]\n\u001b[1;32m 783\u001b[0m full_data[vol_col] \u001b[38;5;241m=\u001b[39m vol\n\u001b[1;32m 784\u001b[0m \u001b[38;5;66;03m## Fill missing Vol data\u001b[39;00m\n", - "File \u001b[0;32m~/cloned_repos/QuantTools/trade/assets/Option.py:354\u001b[0m, in \u001b[0;36mOption.vol\u001b[0;34m(self, ts, ts_start, ts_end, ts_timewidth, ts_timeframe)\u001b[0m\n\u001b[1;32m 351\u001b[0m model \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmodel\n\u001b[1;32m 353\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m ts:\n\u001b[0;32m--> 354\u001b[0m data \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__dataManager\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_timeseries\u001b[49m\u001b[43m(\u001b[49m\u001b[43mts_start\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mts_end\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minterval\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtype_\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mvol\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmodel\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mmodel\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 355\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 356\u001b[0m data \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__dataManager\u001b[38;5;241m.\u001b[39mget_vol(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mquote\u001b[39m\u001b[38;5;124m'\u001b[39m, query_date \u001b[38;5;241m=\u001b[39m ts_end)\n", - "File \u001b[0;32m~/cloned_repos/QuantTools/trade/helpers/decorators.py:55\u001b[0m, in \u001b[0;36mlog_error_with_stack..decorator..wrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 53\u001b[0m logger\u001b[38;5;241m.\u001b[39merror(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mVariables: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00margs\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m, \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mkwargs\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m 54\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m raise_exception:\n\u001b[0;32m---> 55\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m e\n", - "File \u001b[0;32m~/cloned_repos/QuantTools/trade/helpers/decorators.py:40\u001b[0m, in \u001b[0;36mlog_error_with_stack..decorator..wrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 37\u001b[0m \u001b[38;5;129m@wraps\u001b[39m(func)\n\u001b[1;32m 38\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mwrapper\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 39\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m---> 40\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 41\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 42\u001b[0m stack \u001b[38;5;241m=\u001b[39m inspect\u001b[38;5;241m.\u001b[39mstack()\n", - "File \u001b[0;32m~/cloned_repos/QuantTools/trade/assets/helpers/DataManagers.py:166\u001b[0m, in \u001b[0;36mOptionDataManager.get_timeseries\u001b[0;34m(self, start, end, interval, type_, model, **kwargs)\u001b[0m\n\u001b[1;32m 163\u001b[0m organized_data \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__greek_data_organizer_handler(unProcessedData, flag, type_)\n\u001b[1;32m 164\u001b[0m column_agg \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mdict\u001b[39m(\u001b[38;5;28mzip\u001b[39m(organized_data\u001b[38;5;241m.\u001b[39mcolumns, [\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlast\u001b[39m\u001b[38;5;124m'\u001b[39m]\u001b[38;5;241m*\u001b[39m\u001b[38;5;28mlen\u001b[39m(organized_data\u001b[38;5;241m.\u001b[39mcolumns)))\n\u001b[0;32m--> 166\u001b[0m return_verified_data \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__verify_return_data_integrity\u001b[49m\u001b[43m(\u001b[49m\u001b[43morganized_data\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mflag\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 167\u001b[0m resampled \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__resample(return_verified_data, interval,column_agg)\n\u001b[1;32m 168\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m flag \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mINTRA\u001b[39m\u001b[38;5;124m'\u001b[39m:\n", - "File \u001b[0;32m~/cloned_repos/QuantTools/trade/helpers/decorators.py:55\u001b[0m, in \u001b[0;36mlog_error_with_stack..decorator..wrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 53\u001b[0m logger\u001b[38;5;241m.\u001b[39merror(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mVariables: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00margs\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m, \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mkwargs\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m 54\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m raise_exception:\n\u001b[0;32m---> 55\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m e\n", - "File \u001b[0;32m~/cloned_repos/QuantTools/trade/helpers/decorators.py:40\u001b[0m, in \u001b[0;36mlog_error_with_stack..decorator..wrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 37\u001b[0m \u001b[38;5;129m@wraps\u001b[39m(func)\n\u001b[1;32m 38\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mwrapper\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 39\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m---> 40\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 41\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 42\u001b[0m stack \u001b[38;5;241m=\u001b[39m inspect\u001b[38;5;241m.\u001b[39mstack()\n", - "File \u001b[0;32m~/cloned_repos/QuantTools/trade/assets/helpers/DataManagers.py:447\u001b[0m, in \u001b[0;36mOptionDataManager.__verify_return_data_integrity\u001b[0;34m(self, data, timeAggType)\u001b[0m\n\u001b[1;32m 445\u001b[0m date_range\u001b[38;5;241m=\u001b[39m date_range[(date_range\u001b[38;5;241m.\u001b[39mtime \u001b[38;5;241m>\u001b[39m\u001b[38;5;241m=\u001b[39m pd\u001b[38;5;241m.\u001b[39mTimestamp(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m9:30\u001b[39m\u001b[38;5;124m'\u001b[39m)\u001b[38;5;241m.\u001b[39mtime()) \u001b[38;5;241m&\u001b[39m (date_range\u001b[38;5;241m.\u001b[39mtime \u001b[38;5;241m<\u001b[39m\u001b[38;5;241m=\u001b[39m pd\u001b[38;5;241m.\u001b[39mTimestamp(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m16:00\u001b[39m\u001b[38;5;124m'\u001b[39m)\u001b[38;5;241m.\u001b[39mtime()) \u001b[38;5;241m&\u001b[39m (date_range\u001b[38;5;241m.\u001b[39mweekday \u001b[38;5;241m<\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;241m5\u001b[39m)]\n\u001b[1;32m 446\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 447\u001b[0m date_range \u001b[38;5;241m=\u001b[39m \u001b[43mpd\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdate_range\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdata\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mindex\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmin\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdata\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mindex\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmax\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfreq\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mB\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 449\u001b[0m missing_dates \u001b[38;5;241m=\u001b[39m\u001b[38;5;28mset\u001b[39m(date_range) \u001b[38;5;241m-\u001b[39m \u001b[38;5;28mset\u001b[39m(data\u001b[38;5;241m.\u001b[39mindex)\n\u001b[1;32m 450\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(missing_dates) \u001b[38;5;241m>\u001b[39m \u001b[38;5;241m0\u001b[39m:\n", - "File \u001b[0;32m~/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:1008\u001b[0m, in \u001b[0;36mdate_range\u001b[0;34m(start, end, periods, freq, tz, normalize, name, inclusive, unit, **kwargs)\u001b[0m\n\u001b[1;32m 1005\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m freq \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m com\u001b[38;5;241m.\u001b[39many_none(periods, start, end):\n\u001b[1;32m 1006\u001b[0m freq \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mD\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m-> 1008\u001b[0m dtarr \u001b[38;5;241m=\u001b[39m \u001b[43mDatetimeArray\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_generate_range\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1009\u001b[0m \u001b[43m \u001b[49m\u001b[43mstart\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstart\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1010\u001b[0m \u001b[43m \u001b[49m\u001b[43mend\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mend\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1011\u001b[0m \u001b[43m \u001b[49m\u001b[43mperiods\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mperiods\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1012\u001b[0m \u001b[43m \u001b[49m\u001b[43mfreq\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfreq\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1013\u001b[0m \u001b[43m \u001b[49m\u001b[43mtz\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtz\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1014\u001b[0m \u001b[43m \u001b[49m\u001b[43mnormalize\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mnormalize\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1015\u001b[0m \u001b[43m \u001b[49m\u001b[43minclusive\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43minclusive\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1016\u001b[0m \u001b[43m \u001b[49m\u001b[43munit\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43munit\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1017\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1018\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1019\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m DatetimeIndex\u001b[38;5;241m.\u001b[39m_simple_new(dtarr, name\u001b[38;5;241m=\u001b[39mname)\n", - "File \u001b[0;32m~/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:430\u001b[0m, in \u001b[0;36mDatetimeArray._generate_range\u001b[0;34m(cls, start, end, periods, freq, tz, normalize, ambiguous, nonexistent, inclusive, unit)\u001b[0m\n\u001b[1;32m 427\u001b[0m end \u001b[38;5;241m=\u001b[39m Timestamp(end)\n\u001b[1;32m 429\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m start \u001b[38;5;129;01mis\u001b[39;00m NaT \u001b[38;5;129;01mor\u001b[39;00m end \u001b[38;5;129;01mis\u001b[39;00m NaT:\n\u001b[0;32m--> 430\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mNeither `start` nor `end` can be NaT\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 432\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m unit \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 433\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m unit \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m [\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124ms\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mms\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mus\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mns\u001b[39m\u001b[38;5;124m\"\u001b[39m]:\n", - "\u001b[0;31mValueError\u001b[0m: Neither `start` nor `end` can be NaT" - ] - } - ], - "source": [ - "long_leg = focus_object.Structure['long'][0]\n", - "short_leg = focus_object.Structure['short'][0]\n", - "\n", - "long_attribution = Calculate.attribution(\n", - " asset = long_leg,\n", - " ts_start = focus_start,\n", - " ts_end = focus_end,\n", - " method = 'GB',\n", - " replace = 'default_fill',\n", - " return_both_data = True\n", - ")\n", - "\n", - "short_attribution = Calculate.attribution(\n", - " asset = short_leg,\n", - " ts_start = focus_start,\n", - " ts_end = focus_end,\n", - " method = 'GB',\n", - " replace = 'default_fill',\n", - " return_both_data = True\n", - ")\n", - "\n", - "\n", - "attribution_gb = Calculate.attribution(\n", - " asset = focus_object,\n", - " ts_start = focus_start,\n", - " ts_end = focus_end,\n", - " method = 'GB',\n", - " replace = 'default_fill'\n", - ") \n", - "\n", - "\n", - "attribution = Calculate.attribution(\n", - " asset = focus_object,\n", - " ts_start = focus_start,\n", - " ts_end = focus_end,\n", - " method = 'RV',\n", - "replace = 'default_fill'\n", - ")\n", - "\n", - "vol_ts = focus_object.vol(\n", - " ts = True,\n", - " ts_start = focus_start,\n", - " ts_end = focus_end\n", - ")\n", - "\n", - "greeks = focus_object.greeks(\n", - " ts_start = pd.to_datetime(focus_start) - BDay(1),\n", - " ts_end = focus_end\n", - ")\n", - "\n", - "\n", - "ticker_ob = Stock(ticker)\n", - "spot_ts = ticker_ob.spot(ts = True,\n", - " ts_start= pd.to_datetime(focus_start) - BDay(1),\n", - " ts_end=focus_end,\n", - " spot_type = 'chain_price')" - ] - }, - { - "cell_type": "code", - "execution_count": 319, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Using available dataing available data\r" - ] - } - ], - "source": [ - "long_greeks = long_leg.greeks(\n", - " ts_start = focus_start,\n", - " ts_end = focus_end,\n", - ")\n", - "\n", - "short_greeks = short_leg.greeks(\n", - " ts_start = focus_start,\n", - " ts_end = focus_end,\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 320, - "metadata": {}, - "outputs": [], - "source": [ - "# long_greeks.iloc[long_greeks.Midpoint_delta == 0] = np.nan\n", - "# short_greeks.iloc[short_greeks.Midpoint_delta == 0] = np.nan\n", - "# short_greeks.fillna(method = 'ffill', inplace = True)\n", - "# long_greeks.fillna(method = 'ffill', inplace = True)\n", - "# greeks = long_greeks - short_greeks" - ] - }, - { - "cell_type": "code", - "execution_count": 321, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Stock change & Querying Spot Change are the same on long\n", - "Stock change & Querying Spot Change are the same on short\n", - "PnL Attribution on Structure and Individual Legs match\n", - "Greeks on Structure and Individual Legs match\n", - "Structure Delta * Spot_TS diff == Structure Delta * Stock_Close_Change_Mark\n", - "Moneyness at Start: Long Leg Strike: 90% Short Leg Strike: 88%\n", - "Moneyness at End: Long Leg Strike: 92% Short Leg Strike: 90%\n" - ] - } - ], - "source": [ - "long_full_data = long_attribution[0].set_index('Datetime')\n", - "long_pnl = long_attribution[1]\n", - "\n", - "short_full_data = short_attribution[0].set_index('Datetime')\n", - "short_pnl = short_attribution[1]\n", - "\n", - "## Attribution Func Stock change & Querying Spot Change are the same\n", - "## Calculate.attribution calculation on option structure matches with individual option leg calc\n", - "if (long_full_data['Stock_Close_Change_Mark'] - spot_ts['close'].diff()).dropna().sum() == 0:\n", - " print('Stock change & Querying Spot Change are the same on long')\n", - "else:\n", - " print('Stock change & Querying Spot Change are not the same on long')\n", - "\n", - "\n", - "if (short_full_data['Stock_Close_Change_Mark'] - spot_ts['close'].diff()).dropna().sum() == 0:\n", - " print('Stock change & Querying Spot Change are the same on short')\n", - "else:\n", - " print('Stock change & Querying Spot Change are not the same on short')\n", - "\n", - "\n", - "if ((long_pnl - short_pnl) - attribution_gb)['Delta_PnL'].sum() == 0:\n", - " print('PnL Attribution on Structure and Individual Legs match')\n", - "else:\n", - " print('PnL Attribution on Structure and Individual Legs do not match')\n", - "\n", - "## Greeks on Structure and Individual Legs match\n", - "if ((long_greeks - short_greeks) - greeks)['Midpoint_delta'].sum() == 0:\n", - " print('Greeks on Structure and Individual Legs match')\n", - "else:\n", - " print('Greeks on Structure and Individual Legs do not match')\n", - "\n", - "\n", - "if (((greeks['Midpoint_delta'] * 100) * spot_ts['close'].diff()) - ((greeks['Midpoint_delta'] * 100) * short_full_data['Stock_Close_Change_Mark'])).sum() == 0:\n", - " print('Structure Delta * Spot_TS diff == Structure Delta * Stock_Close_Change_Mark')\n", - "else:\n", - " print('Structure Delta * Spot_TS diff != Structure Delta * Stock_Close_Change_Mark')\n", - "\n", - "long_leg_strike = spot/long_leg.K\n", - "short_leg_strike = spot/short_leg.K\n", - "long_leg_strike_end = spot_end/long_leg.K\n", - "short_leg_strike_end = spot_end/short_leg.K\n", - "print('Moneyness at Start: Long Leg Strike:', f\"{long_leg_strike:.0%}\", 'Short Leg Strike:', f\"{short_leg_strike:.0%}\")\n", - "print('Moneyness at End: Long Leg Strike:', f\"{long_leg_strike_end:.0%}\", 'Short Leg Strike:', f\"{short_leg_strike_end:.0%}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 322, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 322, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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LFmyJJLhxoS33noLr776Kux2O0pLS/G9730PU6dOHbCNqqr49a9/jd27d+O2227D6aefHqVoo+fgwYN45ZVXcPz4cXR1dQ16H7Zt24Z3330XVVVV6OnpwYMPPoiysrLoBRxFI71XXq8Xf/vb37Bjxw50d3cjNzcXX//61/G1r30tilFH3mh+2++66y4cPHhwwPNWrlyJH/zgB5EON2Yw+YiQgwcPYtWqVZgyZQpkWcYzzzyDe++9Fw8//DBMJhMA4IknnsDOnTtx6623wmKxYP369Vi3bh3uueeeKEcfWSO9V9nZ2fi///u/Ac9577338Morr2D+/PlRijp6tm7diieffBI33HADpk2bhtdffx333Xcffve73yEtLa1/u9dffx2CIEQx0ujz+XwoKyvDeeedh4ceemjIx0855RQsWbIE//u//xuFCGPHSO/VE088gf379+NHP/oRcnJysHfvXjz22GPIzMzEwoULoxBxdIzmtx0AVqxYgWuuuab/tsFgiEa4MYPJR4TccccdA27ffPPNWLNmDaqqqjBz5ky43W5s3LgRP/7xjzF79mwAwE033YRbbrkFlZWVqKioiEbYUTHSeyWK4qDWoO3bt2PJkiUDvuzJ4rXXXsOKFStw7rnnAgBuuOEG7Ny5Ex988AEuu+wyAEB1dTVee+013H///Ul9tTV//vyTJqhLly4FoLWuJbuR3qvKykosW7YMs2bNAqBdyb/77rs4evRoUiUfI/1e9TEajUnXin0yHPMRJW63GwBgs9kAAFVVVZBlGXPmzOnfpqioCNnZ2aisrIxKjLHiq+/VV1VVVaG6uhrnnXdeJMOKCcFgEFVVVQM+N6IoYs6cOf2fG5/Ph9///vf4/ve/zx8/CpmKigp8/vnn6OzshKqq2L9/P5qamjB37txohxZVw/1effTRR/j+97+Pn/zkJ3j66afh8/miEV7MYMtHFCiKgscffxzTp09HSUkJAMBut0On08FqtQ7YNi0tDXa7PQpRxoah3quv2rhxI4qKijB9+vQIRxd9TqcTiqIMSirS09PR2NgIQGsenz59OhYtWhSFCClRfe9738P//u//4l/+5V8gSRIEQcCNN9444Go/2Qz3e3X22WcjOzsbmZmZqKmpwd/+9jc0Njbitttui2K00cXkIwrWr1+Puro63H333dEOJeaN9F75/X5s2bIFV155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XV3doOQjJycHTz31FHQ6/jwRJSp+u4mSwPz58zFlypT+25dffjn279+P+++/Hw8++CB++9vfwmAwRDHCLwmCEDOxEFF4MPkgSlKzZ8/GlVdeiWeeeQabN2/GypUrUVNTg9deew2HDh1CV1cXLBYL5s+fj29/+9tISUkBMHChux/+8If9+/vv//5v5ObmAgA2b96M119/HfX19TAYDJg3bx6uu+46ZGdnAwDuuusuHDx4EMCXi+/1LZTX2tqKH/7whwMW33vkkUfw6aef4re//S0ee+wxHDhwABaLBZdffjkuuOAC1NbW4i9/+QuOHj2KlJQUXHvttTj77LMHvF6Xy4Xnn38e27Ztg8PhQFZWFlasWIFLLrmEi+8RRRiTD6IktnTpUjzzzDPYu3cvVq5cib1796K1tRXLly9Heno66uvr8d5776G+vh733XcfBEHA4sWL0dTUhI8//hjXX399f1KSmpoKAHjxxRfx7LPPYsmSJVixYgWcTifefPNN/OpXv8KDDz4Iq9WKK664Am63Gx0dHbj++usBACaT6aSxKoqC//zP/8SMGTNw3XXXYcuWLfjzn/8Mk8mEZ555Bueccw4WL16Md999F//93/+NioqK/mTI5/PhrrvuQmdnJ1auXIns7GwcPnwYzzzzDOx2O77zne+E700mokGYfBAlsaysLFgsFrS0tAAAVq1ahW984xsDtpk2bRp+//vf44svvsCMGTNQWlqKyZMn4+OPP8aiRYv6T/AA0NbWhueeew7XXHMNrrjiiv77Tz/9dPzsZz/D22+/jSuuuAJz585FZmYmXC4Xli5dOqpYA4EAzjnnHFx++eUAgLPPPhs33ngj/vSnP+HHP/4xzjzzTADA3Llz8e///u/YtGlTf6vKa6+9hubmZjz44IMoKCgAAJx//vnIzMzEK6+8gosvvri/VYaIwo9tjURJzmQywePxAMCAsRZ+vx9OpxPTpk0DABw/fnzEfW3btg2qquLMM8+E0+ns/y89PR35+fk4cODAhGJdsWJF/7+tVisKCwthNBqxZMmS/vsLCwthtVrR2traf9+nn36KGTNmwGq1Dohrzpw5UBQFhw4dmlBcRDQ2bPkgSnJerxdpaWkAgJ6eHjz//PPYunUrHA7HgO3cbveI+2puboaqqvi3f/u3IR+fyAwWvV7f37XTx2KxICsrC4IgDLq/p6en/3ZTUxNqamqwZs2aIff91ddKROHF5IMoiXV0dMDtdiMvLw8A8Nvf/haHDx/GJZdcgrKyMphMpv6xFoqijLg/RVEgCAJ+/vOfDzmIc6RxHScz3KDQ0QwWVVUVc+fOxSWXXDLk44WFheOOi4jGjskHURLbvHkzAODUU09FT08P9u3bh9WrV+Oqq67q36apqWnQ877a0tAnPz8fqqoiNzc3pk7oeXl58Hq9mDt3brRDISJwzAdR0tq/fz9eeOEF5Obm4uyzz+5vQVBVdcB2r7/++qDnGo1GAIO7Yk4//XSIoogNGzYM2o+qquju7u6/bTKZRtWVEwpLlixBZWUldu/ePegxl8sFWZYjEgcRadjyQZQEdu3ahYaGBiiKArvdjgMHDmDv3r3Izs7G7bffDoPBAIPBgBkzZuCVV16BLMvIzMzEnj17Bgzc7FNeXg4AeOaZZ3DWWWdBkiScdtppyM/Pxze/+U08/fTTaGtrw6JFi2AymdDa2oodO3b019Xo28fWrVvxxBNPYMqUKTCZTFi4cGFYXv8ll1yCzz77DA888ACWLVuG8vJy+Hw+1NbW4tNPP8UjjzwyaDwJEYUPkw+iJPDcc88B0AZ89q3tcv311w9a2+XHP/4x/vznP+Ptt9/uHyfxi1/8AjfeeOOA/U2dOhXXXHMN3n33XezevRuqquK///u/YTKZcNlll6GgoACvv/46nn/+eQBAdnY25s6dOyC5+NrXvobq6mps2rQJr7/+OnJycsKWfBiNRqxduxYvvvgiPv30U2zevBlmsxmFhYVYvXo1LBZLWI5LREMT1K+2jRIRERGFEcd8EBERUUQx+SAiIqKIYvJBREREEcXkg4iIiCKKyQcRERFFFJMPIiIiiigmH0RERBRRTD6IiIgooph8EBERUUQx+SAiIqKIYvJBREREEcXkg4iIiCKKyQcRERFF1P8HTmN1yb4RqdcAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "self_calc_pnl = ((long_full_data['Delta'] - short_full_data['Delta'])*100) * spot_ts['close'].diff()\n", - "self_calc_pnl.cumsum().plot(label = 'Self Calc'), attribution_gb['Delta_PnL'].cumsum().plot(label = 'Attribution'), (((long_full_data['Delta'] - short_full_data['Delta'])*100) * spot_ts['close'].diff()).cumsum().plot(label = 'Structure')\n", - "plt.legend()" - ] - }, - { - "cell_type": "code", - "execution_count": 329, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjMAAAH8CAYAAAAkBC4+AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAADaIElEQVR4nOyddZxc5fX/38/oumt2NytJNm4kARICCRKCQ4DiFIq0fKEttLQUCi3Fi4SWlvIrFCvQFg8uIYSEhLi7rLu7jd3n98edmd1N1l2e9+u1r2Svnpm5O/fccz7nHCGllCgUCoVCoVAMUwyDbYBCoVAoFApFb1DOjEKhUCgUimGNcmYUCoVCoVAMa5Qzo1AoFAqFYlijnBmFQqFQKBTDGuXMKBQKhUKhGNYoZ0ahUCgUCsWwRjkzCoVCoVAohjXKmVEoFAqFQjGsUc6MQqEYVSxevBghRKtla9asQQjBn/70p8Exyk1SUhJJSUmDakN7PPjgg/j4+JCbmzvg55ZSMnPmTE499dQBP7dieKCcGcWIwuVy8a9//YtFixYRFhaG2WwmKiqKGTNmcMstt/DJJ5+02v71119HCMHrr78+OAZ3wlC3rzs89thjCCEQQnD48OF2t+vshi6EYPHixX1v4ADQliM1HMjNzeXpp5/mpz/9KQkJCa3WeT5Tz4/RaCQsLIzFixfz+uuv45mYo2kaY8eORQjBgQMHOjxfQ0MDISEhWCwWSkpKEELw8MMPs379et5///1+e52K4YtpsA1QKPoKl8vFBRdcwFdffUVISAjnn38+8fHx2O129u/fz3//+18OHTrERRddNNimjjqklLz88ssIIZBS8q9//YtnnnlmUGx54403aGhoGJRzd8a333472Ca0ySOPPILNZuOee+5pd5sHH3wQAIfDQVpaGitWrGDt2rVs27aN559/HoPBwE033cRDDz3Eyy+/zLPPPtvusd577z2qq6u5/PLLiYqKAuDiiy9m8uTJ3H///Vx22WXD0ilU9CNSoRghvPnmmxKQM2fOlFVVVcetr6+vl6tXr2617LXXXpOAfO211wbIyu4x1O3rKl999ZUE5I033ihjYmJkRESEtNlsbW6bmJgoExMT2z0WIBctWtSn9n333XcSkA8++GCfHvdYFi1aJIfb125VVZX08/OTS5YsaXM90OZrWr9+vTQYDFIIITMyMqSUUubk5Eij0djh5y+llAsXLpSAXLlyZavlf/7znyUgv/nmm168IsVIZHj9VSkUHfB///d/EpB/+ctfurS958bS1k9mZqaUUsoHH3xQAvK7776T//nPf+SJJ54o/f39vTfbzm6CHd2Y3377bXnGGWfI0NBQabVaZWJiorzqqqvk1q1bu2zfDTfc0Or3lrRnm+e4NptNPvTQQzI1NVVaLBZ5ww03eLfJzc2Vd9xxh0xOTpYWi0WGhYXJCy+8UG7ZsqVL7+2xXHbZZRKQP/zwg7z77rslIN9+++027W3r54YbbvA6dm39eF5jZmamd/vDhw/LK664QkZGRkohhPzuu+9avf723qsNGzbIM888UwYFBcmAgAB59tlnez+TlnTnvffY1dZPS8esveulqalJPvHEE3LatGnS19dXBgYGyoULF8p33nnnuG1bvgeZmZnyyiuvlOHh4dJqtco5c+bITz/9tP0Pqg3+3//7fxKQL7/8cpvr23NmpJRyypQpEpDvvfeed9n555/f5ufv4eDBgxKQKSkpUtO0VuuysrIkIK+66qpuvQbFyEelmRQjhvDwcACOHDnSpe1vvPFGQkJC+Pjjj7n44ouZNWuWd11ISEirbZcvX84333zDhRdeyOmnn051dXWP7ZRS8pOf/IR///vfREREcOmllxIZGUleXh7fffcdEydOZO7cud2yrydcdtllbN26lXPPPZdLLrnEG87fsWMHZ599NhUVFSxdupRLL72UsrIyPvroIxYuXMiKFSs477zzunye4uJiPvnkE1JTU1mwYAFBQUEsX76cl156iSuvvNK7XVJSEg8++CB//etfAbjrrru862bNmuVd/9BDD5GYmMiNN97oXX+shiY9PZ2TTjqJ1NRUrr32WhobGwkKCurU1s2bN/PEE09w1llncccdd5CWlsaHH37I999/z8qVK3ssQA0JCeHBBx/k9ddfJzs725uS8bzujrDb7SxdupS1a9cyadIk7rjjDhoaGnj//fe58sor2bVrF48//vhx+2VnZ3PiiSeSkpLC9ddfT0VFBe+88w4XX3wxq1at4vTTT++S7atWrQJg4cKFXX/Bx2A2m73/v/XWW/n88895+eWXW33+Hl5++WUAbr755uNSSYmJicTFxbFq1SqklCrVpGhmsL0phaKv2LFjhzSbzVIIIa+77jr5wQcfyKysrA736SyN44nM+Pn5yR07dhy3vieRmRdffFECct68ecelw5xOpywoKOiyfb2JzEyfPl2Wlpa2WudwOOS4ceOk1WqVa9asabUuPz9fjhkzRsbExMimpqY27WmLJ554QgLy8ccf9y6bM2eOFELIo0ePHrd9b9JMLSMg9913X5vbdBSZAeTf//73Vus++ugjCcjx48dLl8vlXd6b97492nrtjz/+uATkueeeKx0Oh3d5cXGxTExM9Ea82noP/vSnP7U6lifdd+6557Zrw7FER0fLoKCg46IkHmgnMrN27VppMBikxWJpdU07nU45ZsyYVuknDzabTUZGRkqTySQLCwvbPN8ll1wiAbl///4uvwbFyEdVMylGDLNnz+att94iOjqat956i8suu4ykpCTCw8NZtmwZn376aY+P/dOf/pTZs2f3iZ1///vfAXjxxRcJDg5utc5oNBIbG9sn5+mMRx55hIiIiFbLPv/8c9LT0/nFL37BokWLWq0bM2YM99xzD0VFRV0Wqkq38NdgMPDjH//Yu/zGG2/0CoH7g+jo6FbRj64yfvx4br/99lbLLr74YhYtWkRaWhrr1q3rKxO7zKuvvooQgmeffRaTqTmYHhUVxR/+8AegOZrRksTERB544IFWy5YuXcrYsWPZsmVLl85tt9spLi4mOjq60yjIn/70J/70pz9x//33c+WVV3LWWWchpeSZZ55pdU0bjUZuuukmpJS88sorrY7x8ccfU1payoUXXkhMTEyb5/Esz8nJ6dJrUIwOVJpJMaK44oorWLZsGd999x3r169n586drF+/no8++oiPPvqIH//4x95y5+5w4okn9ol99fX17Nu3j+jo6D5zjnpKW69p48aNgJ6iaKvnytGjRwE4ePBgl1JNq1evJj09naVLlxIXF+ddfs0113D33Xfz+uuv8+ijj7ZKQ/QFM2fOxGq1dnu/U089FYPh+Ge8xYsXs3btWnbu3Hmck9ef1NbWkpaWRlxcHJMmTTpu/RlnnAHAzp07j1s3a9YsjEbjccsTEhK8n3NnlJeXAxAaGtrptg899FCr34UQvPLKK/zkJz85bttbbrmFxx9/nNdee42HHnrIa6fHub311lvbPU9YWBgAZWVlXXoNitGBcmYUIw6z2czZZ5/N2WefDegl2x988AE33XQTb7zxBsuWLeOSSy7p1jHbe0rsLlVVVQCtbuyDRVuv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Ac899xwulwun08nTTz9Nbm5uMJgpKCjggQceYPr06axYsSJ4H6qqEhUVBcA///lPEhISSE9PB2Dfvn28+eabXHzxxf3+nIUQIhRka7YQg8TKlSs7PX7bbbexePFioK1o3saNG/H5fKcUzXv55Zd59dVXT7mPxMREnnzySQDeeecdPvjgAyoqKlBVlZSUFJYsWcLSpUtRVZmsFUIMPRLMCCGEEGJIk49hQgghhBjSJJgRQgghxJAmwYwQQgghhjQJZoQQQggxpEkwI4QQQoghTYIZIYQQQgxpEswIIYQQYkiTYEYIIYQQQ5oEM0KIYa+iooKVK1eybt26gR6KECIMpDeTEKJH1q1bxx/+8IfgbYvFgsvlIiMjg5kzZ3L++efjcDh6fL8HDhxgx44dXHrppR26gvfEhg0bqK2t5dJLL+3V9wshhiYJZoQQvbJy5UqSkpLw+/3U1NSwd+9enn32WdauXcuqVavIzMzs0f0dOHCAV199lcWLF/cpmCksLDwlmElMTOT555/HbJZLnhDDkfxlCyF6ZebMmeTk5ARvX3nllezevZuHH36YRx99lMceewyr1TqAI2yjKMqgGYsQIvQkmBFChMyUKVO4+uqrWbNmDevXr2fp0qUcO3aMt956i3379lFdXY3T6WTmzJl885vfJDIyEujY7ft73/te8P6eeOIJkpKSAFi/fj1r166lqKgIq9XK9OnTuf7660lISADgvvvuY+/evUBbB/JAt/CKigq+973vdehA/uSTT7Jp0yYee+wxnnrqKfbs2YPT6eTKK69k+fLlFBQU8L//+78cOnSIyMhIrrvuOhYsWNDh+TY2NvLKK6+wefNmamtriY+PZ8mSJVx++eXSgVyIfiTBjBAipM477zzWrFnDzp07Wbp0KTt37qSiooLFixcTExNDUVERH3zwAUVFRfz85z9HURTOPvtsSktL2bhxIzfeeGMwyImKigLgtdde46WXXmLevHksWbKEuro63nnnHX72s5/x6KOPEhERwVVXXUVTUxMnTpzgxhtvBMBut59xrJqm8Ytf/IKJEydy/fXXs2HDBp5++mnsdjtr1qxh4cKFnH322bz//vs88cQT5ObmBoMrt9vNfffdR1VVFUuXLiUhIYEDBw6wZs0aampq+Na3vhW+F1kI0YEEM0KIkIqPj8fpdFJeXg7ARRddxGWXXdbhnHHjxvH444+zf/9+Jk6cSGZmJtnZ2WzcuJE5c+YEAwaA48eP8/LLL3Pttddy1VVXBY/PnTuXH/3oR7z77rtcddVVTJs2jbi4OBobGznvvPO6NVav18vChQu58sorAViwYAG33norf/zjH7nzzjuZP38+ANOmTePf//3fWbduXXDW56233qKsrIxHH32U1NRUAC688ELi4uJ44403WLFiRXDWSAgRXjIPKoQIObvdTnNzM0CHXBWPx0NdXR3jxo0D4OjRo13e1+bNm9F1nfnz51NXVxf8X0xMDCkpKezZs6dPY12yZEnw3xEREaSlpWGz2Zg3b17weFpaGhEREVRUVASPbdq0iYkTJxIREdFhXFOnTkXTNPbt29encQkhuk9mZoQQIdfS0kJ0dDQADQ0NvPLKK3z22WfU1tZ2OK+pqanL+yorK0PXdb7//e93+vW+7FCyWCzBpawAp9NJfHw8iqKccryhoSF4u7S0lGPHjnHzzTd3et8nP1chRPhIMCOECKkTJ07Q1NREcnIyAI899hgHDhzg8ssvJysrC7vdHsxV0TSty/vTNA1FUbj33ns7TartKi/mTE6XpNud5F1d15k2bRqXX355p19PS0vr9biEED0jwYwQIqTWr18PwIwZM2hoaGDXrl2sXLmSa665JnhOaWnpKd938kxIQEpKCrquk5SUNKgChOTkZFpaWpg2bdpAD0WIEU9yZoQQIbN7927+9re/kZSUxIIFC4IzHLqudzhv7dq1p3yvzWYDTl16mjt3Lqqq8uqrr55yP7quU19fH7xtt9u7tXQVCvPmzSMvL4/t27ef8rXGxkb8fn+/jEMIITMzQohe+uqrryguLkbTNGpqatizZw87d+4kISGBVatWYbVasVqtTJw4kTfeeAO/309cXBw7duzokEgbMGbMGADWrFnDueeei8lk4qyzziIlJYWvf/3rvPjiixw/fpw5c+Zgt9upqKhg69atwbougfv47LPPePbZZ8nJycFutzN79uywPP/LL7+cL774gkceeYRFixYxZswY3G43BQUFbNq0iSeffPKUfBwhRHhIMCOE6JWXX34ZMBJwA72ZbrzxxlN6M9155508/fTTvPvuu8E8kx//+MfceuutHe5v7NixXHvttbz//vts374dXdd54oknsNvtXHHFFaSmprJ27VpeeeUVABISEpg2bVqHYGXZsmXk5+ezbt061q5dS2JiYtiCGZvNxv33389rr73Gpk2bWL9+PQ6Hg7S0NFauXInT6QzL4wohTqXoJ8/bCiGEEEIMIZIzI4QQQoghTYIZIYQQQgxpEswIIYQQYkiTYEYIIYQQQ5oEM0IIIYQY0iSYEUIIIcSQJsGMEEIIIYY0CWaEEEIIMaRJMCOEEEKIIU2CGSGEEEIMaRLMCCGEEGJIk2BGCCGEEEPa/wc+mdfqsoikfAAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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vY8rmjl/Rz8i9KxatUrbbDatlNLXXHONnjt3rt6+ffsJb+P6Nv3KK6/UeL3rm1lMTIxetWpVtesb0/Px4osvakCfcsopOj8/v8p1drtd7927t97ta0rPR69evfTBgwerXFdeXq6zsrJ0ZGSkXrJkSZXr9uzZo9u2bavT0tJ0SUlJje2pyWOPPaYB/eijj7q3DRgwQCul9KZNm6rtf6LeIq11td6Cyir3MPztb3+rcZ8T9XwA+l//+leV695//30N6M6dO2uHw+He3pTHvjY13fdHH31UA/rcc8+t0nOwf/9+nZGR4e5RqukxmDJlSpVjLVq0yH2s+mrdurVu0aKFNk2z2nUjRoyotVekPlz/X8OGDdOTJ0/WkydP1pMmTdLXXXedTkpK0klJSXru3Lm13r5v377aMAx95MiRRp1fND8y20X4XL9+/Xj99ddp3bo1r7/+OpdddhkdO3akVatWjBkzhg8//LDRx/7jH/9Iv379PNLOf/3rXwC8+OKL1fJSwsLCaNOmjUfOU5fp06eTnJxcZduCBQvYsmULt912G8OGDatyXdu2bZk4cSI5OTn1TozUzkRTwzD4/e9/795+3XXXuRNPvaF169ZVehfqq3Pnztx8881Vtl188cUMGzaMzZs3880333iqifX28ssvo5TiH//4R5Weg9TUVB588EEAXnrppWq3y8jI4IEHHqiybfTo0XTo0IEVK1bU69xlZWXs37+f1q1b1zhLJycnB4D09PRq123fvp0pU6ZU+XH1ah3vq6++YurUqUydOpVHHnmEWbNmceTIEcaOHcvAgQNrbV9aWhqmabJnz5563R/R/Mmwi/CLsWPHMmbMGBYvXszSpUv56aefWLp0Ke+//z7vv/8+v//9793TVxviRG+ADVFYWMjatWtp3bq1x4KZxqrpPn333XeA1WVfU82LTZs2AbB+/fp6Db18+eWXbNmyhdGjR1f5gLrqqqu4++67mTVrFg8//DA2m62R96Jmffr0ITIyssG3O/300zGM6t+dhg8fzldffcVPP/1ULSjzpqNHj7J582bS09Pp1q1btevPPPNMAH766adq1/Xt25ewsLBq29u3b+9+nuty6NAhAFq2bNmQZgNW8DF16tQq2zIyMqoMp7lMnjzZ/XozTZN9+/bx/vvvc/fdd/P++++zYsWKGqf4JiUlAZCbm9vg9onmSYIP4Tc2m42zzz6bs88+G7Cm4M6dO5frr7+e2bNnM2bMGC655JIGHTMtLc0jbcvPzwdq/qboazXdJ9eHzTvvvHPC2x47dqxe5/jPf/4DUCU/A6wPjQsvvJC5c+cyf/58Lr/88nodr74a+3y1bt36hMdrSq5PY7jOV1tvmGu763VVWW15QeHh4ZimWa/zR0dHA1BSUlLj9Wlpaaxfv569e/dWu2748OForQFr+mx9A0zDMEhPT+eWW25h3759PPLIIzz88MO8+OKL1fYtLi6u0k4hZNhFBIywsDDGjh3LnXfeCVjfxhuqtp4S17fk4wshuRz/oeD6QPBUN/GJzl/TB1JlNd0n1zDQ/Pnz0VrX+lOfIY2DBw/y/vvvA3DllVdWKyY1d+5coCJA8aTGFvLav39/jdtdwwuVh8ma8tjXl+t8rvMfb9++fdXa5UmJiYlERES4g9LjuabVeqs+yaBBgwBqHSZytcuVLC2EBB8i4MTHxwO4v40B7m5ph8PRqGO6uqNrKjm9efPmat+UY2Nj6dmzJ/v376+xq/x4dbXvROf/4Ycf6jz+8U499VQAj+Q2vPrqq5SVlTFgwABuuOGGGn9SUlL4/PPP2bZtm/t2YWFhJ3w+DMNo9PNVl6VLl9bYK7BkyRKAKkNljXnsG/p6i4+PJysriz179riHvCpbvHgxAP3796/X8RqjV69e7Nu3jyNHjlS77rrrriM8PJx3332X9evXe/zceXl5ALX21GzYsIFWrVrVWH9EhCYJPoTPzZkzh88++6zGN6qcnBx3cuMZZ5zh3u6anrtz585GnbNbt260aNGC+fPnc+DAAff24uJi/vKXv9R4G9f2m266qVpw4hrvrm/7XHkbxydurlmzhmeffbaB98ZKrszKyuL555/n448/rnGf7777rl4VQl1teuGFF3jppZdq/LnpppvcSakurVq14uDBg+4u9eO1atXKa+uLbNq0iRdeeKHKtvnz5/PVV1/RuXPnKlNtG/PYN+b1dv3116O15t57760StOTm5jJ9+nT3Pt4yfPhwTNOssfchKyuLBx54gLKyMs4991yWLVtW4zEa0xNUWlrqfi5qKqe/bds29u/fH7Ql64V3SM6H8Lnly5fz7LPPkpaWxtChQ+nUqRNgvUktWLCA4uJiLr744ir5BYMHDyYmJoZnnnmGQ4cOucf2b7vttnp1ZdtsNm6//XamT59Ov379GDNmDHa7nc8++4y2bdvStm3bareZMGEC33zzDa+99hpdunTh4osvJiUlhb179/Lll19y/fXXu5Pv6mrfxRdfTJcuXZgzZw67d+9m0KBB7Ny5010b5O23327QY2iz2XjvvfcYPXo0559/PkOGDKFv377ExMSwa9cuVq5cydatW9m3bx8xMTG1HmfJkiVs3LiRXr16nTBZ94YbbuCRRx7hlVdeYerUqYSHhzNy5EhWrlzJOeecwxlnnEFkZCR9+vThwgsvBGDkyJH873//48ILL6R///7YbDbOOOOMKkFlY51zzjncfffdLFy4kD59+rjrfERFRfHyyy9XSUZtzGM/cuRI3nnnHS699FLOO+88oqOjycjI4Nprr621Tffccw8LFy5k/vz59OnTh/POO4+ioiLeeecdDhw4wMSJE2usweEpl112GTNmzOCTTz5h1KhR1a5/6KGH0Fozffp0TjvtNAYMGMDAgQNJSkoiPz+f7du3u2uF1PYcLVmyxP2a11qzb98+Fi5cyO7du8nMzGTSpEnVbuMqq37ZZZd56J6KZsEP03tFiNu5c6d+7rnn9CWXXKKzs7N1fHy8ttlsOi0tTZ977rn6tddeq1KnwWXhwoX61FNP1bGxsSescFob0zT1Y489pjMzM7XNZtPt27fX9957ry4sLDxhzYrXX39dn3HGGbpFixY6MjJSd+zYUV911VX6xx9/rHf7XPd77NixumXLljoqKkqffPLJeu7cuY2uNaG1VUPir3/9qz7ppJN0dHS0jo2N1Z07d9aXXXaZfu2116pVqjzeVVddpQH97LPPnnA/rbU+66yzNKDfe+89rbXWx44d03/60590enq6DgsLc1frrNy2K6+8UqempmrDMGqtcFqb+lY4jY+P13Fxcfqss86qtbJrQx97u92u//a3v+lOnTrp8PDwelc4LS4u1o888og+6aSTdFRUlI6Li9OnnXaafvPNN6vtW9djUJ/n/3h9+/bVbdq00Xa7vdZ9fvvtN33HHXfoPn366ISEBB0eHq5btmypTz75ZH3HHXdUe11rXfH/dfxPTEyM7t27t540aZLOy8ur8XyDBw/WKSkpurS0tEH3RTRvSutKA+tCCCGC1pw5c7jqqqt47733GDNmjL+bwy+//EKfPn2YPn16tVomIrRJ8CGEEM2E1prBgwdTXFzM6tWr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5ppr+Pzzz8nMzORf//oXF154ISNHjmTUqFHcdtttnHHGGVxxxRXucxQXF/PPf/6TZ599loiICO6//35uvvlm5s+fX2Objh07xu9+9zsefvhhtNa8+OKLXHvttSxdupS4uLha78sTTzzBgw8+SKdOnXjiiSe45ZZb+PbbbwkPD2f79u1cffXVTJw4kRkzZnDo0CEeeOABJk2axNNPPw3AnXfeSU5ODm+//TY2m40HH3yQ3NzcRj+24eHh2Gw2ysrK3NtefPFF7r33Xm677TYWLFjA3/72N0499VQ6d+7c6PMAdb52XdfX5zUuhBDVOIMP1b1vre8jRtv2OABydvvkvaYh52hw8PHtt9+ybds2HnvssWrX5efnEx4eXqU3BCAhIaHWvI958+bx7rvvui+7PqiSk5Nr3L+4uBibrWKRHAdmQ++Cx9jCbdhs9es8UkoRFhZWpe1gfSCCtRSxYRgkJiby5JNPEhYWRvfu3TnrrLNYtmwZ1113Hbt37+att97ip59+Ii3Nymzu0qULS5Ys4d1332XSpEn069eP++67j3vvvZdLLrmEPXv28Oabb7rPGx4eTnl5OY8//jgDBgwA4LnnnuO0005jzZo19O/fH8MwUEq5b3N8LsfTTz9N586dWblyJWeffbZ7u+v+ue7TLbfcwrnnngvAfffdx+mnn87u3bvp0qULL7zwApdddhk333yz+/aPPvool1xyCU899RR79uzhyy+/5JNPPqFfv34APPvss5x22mk1Po51PeZlZWX8+9//5siRIwwbNgybzYZSilGjRnHjjTe6H8v//ve/LF++vEoeTn3P5xIREUGbNm3qta/reRRCiPrSWrNvwy84gOShZxJVy/uNGR/HHoD8w7ROiMeIqf3Loq81KPjIzc1l1qxZPPDAA0RERHikAWPGjOGCCy5wX3ZFTrm5uTUuflZWVlZlu6E1b42r3qPiC4a2U15ev0hPa43D4ah2n+x2O2D1AJmmSZcuXTBNE9O0gqqUlBTWr19PeXk5a9asweFwcOqpp1Y5RllZGYmJie5j33jjjXz88cfMnDmT119/nfj4ePd1drud8PBwevbs6d7WsWNHEhISWL9+Pb169cI0rSEl1/UHDx7kySefZNmyZRw6dAiHw0FxcTE7duyocn9c9891n7Kzs93XJyUlAZCTk0PHjh1Zu3Yt69evZ+7cuVUe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ww/MnTuXnTt3EhUVRbdu3bj33nv9c6eEEMLDpB9YCC/r2bMnGRkZrFixAoB//OMfFBQUcP/99/P444/TqVMnpk+fzrFjxwBYtWoVTz31FP369eOJJ57gwQcfpHPnzv68C0II4VHS8yGED6Snp7Njxw5+++03Nm/ezEsvvYTNZgPg97//PStXruT7779n1KhRvPfeewwZMoSxY8e6b1+5V0QIIYKdBB9C+IDWGqUU27dvp6SkhOuvv77K9WVlZeTk5ACwfft2Ro4c6Y9mCiGET0jwIYQP7Nmzh9TUVEpKSmjZsiVTpkyptk9MTAwAERERPm6dEEL4lgQfQnjZ2rVr2blzJ+effz6tWrUiPz8fwzBITU2tcf+MjAzWrFnDiBEjfNxSIYTwDQk+hPAgu91Ofn5+lam277//Pv3792fYsGEopcjOzubvf/8711xzDW3atCEvL49Vq1YxcOBAsrKyuPzyy5k2bRppaWkMGTIE0zRZtWoVl1xyib/vnhBCeITSWmt/N0KI5uD4ImOxsbFkZGQwdOhQhg0b5i4yVlxczJw5c1i+fDlHjhwhMTGR7t27c9VVV5GcnAzA8uXLmTt3Lrt37yY6Opru3btzzz33+O2+CSGEJ0nwIYQQQgifkjofQgghhPApCT6EEEII4VMSfAghhBDCpyT4EEIIIYRPSfAhhBBCCJ+SOh9CNNK8efNYsWIFe/bsISIiguzsbK655hratm3r3qesrIzZs2ezbNkyysvL6dOnDxMmTHCvfLt9+3bef/99NmzYwJEjR0hNTeWss87ivPPOcx/jt99+44033mDPnj2UlpaSkpLCqFGjuOCCC3x9l4UQwiMk+BCikdatW8fo0aPJysrC4XAwZ84cHn74Yf7xj38QFRUFwKuvvsqqVau46667iImJYebMmcyYMYPp06cDsHXrVhISErjtttto1aoVGzZs4D//+Q+GYXDOOecAEBkZyejRo8nIyCAyMpLffvuN//73v0RFRTFq1Ci/3X8hhGgsqfMhhIccOXKECRMmMGXKFHr06EFRURE33HADt99+O6eeeipgrfFy55138vDDD5OdnV3jcV566SX27NnD5MmTaz3XU089RWRkJLfddptX7osQQniT5HwI4SFFRUUAxMXFAVavhsPhoFevXu590tPTSU5OZuPGjSc8jusYNdm2bRsbNmygR48eHmq5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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjUAAAH8CAYAAAApGl55AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABqJklEQVR4nO3dd3zV1f3H8de52WEkZEAYkhCWoICggiIKAlVUtA7UalWsglpHba1i1fYnrrpXlVoHKljBVbUCziqogODAASIgJmGvEJIIIfN7fn98cy/EBMi4Kzfv5+PBg9yb7zg3851zPuccY621iIiIiDRznlA3QERERMQfFGpEREQkIijUiIiISERQqBEREZGIoFAjIiIiEUGhRkRERCKCQo2IiIhEBIUaERERiQgKNSIiIhIRFGpExOf555/HGMPzzz8f6qaIiDSYQo1ImDPG1PgXFxdHeno6gwYNYsKECbzzzjtUVVUFtA1ZWVlkZWUF9B4AeXl5tV5vXf/y8vIC3hYRaX6iQ90AEamfW2+9FYCqqioKCwv5/vvveeGFF5g6dSpHHHEEL774Ir169QpxK/0jKSmJP/7xj/t8f3JyctDaIiLNh0KNSDMxefLkWs9t2bKFa665hldffZXRo0fz5Zdf0r59++A3zs+Sk5PrfL0iIvuj4SeRZqxDhw689NJLjBgxgnXr1vH3v/+91jEFBQXcdNNN9OnTh4SEBJKSkhg1ahTvv//+Aa8/b948jDGsWbOGNWvW1BgCuvjii33Hvfnmm1xwwQX06tWLVq1a0apVKw4//HD+8Y9/4DiOP19yDYsXLyY2Npbs7GyKiopqvG/Tpk106NCB1q1bs2LFCt/zI0aMwBhDWVkZf/3rX+nWrRtxcXF0796d2267jfLy8jrv9eGHHzJmzBhSUlKIi4ujV69e/OUvf6l1X4CcnBwuu+wyevToQUJCAikpKfTr148rrriC7du3+46bPHkyxhjmzZtX6xreobi9P84AF198McYYcnJyeOyxx+jfvz8JCQmMGDHCd0xTPucizZl6akSaOY/Hw1//+lfmzZvHzJkzefjhhzHGALBmzRpGjBhBXl4exx57LGPGjGHXrl3Mnj2bMWPG8OSTTzJx4sR9XjsrK4tbb72VRx55BKDGkNBhhx3me/svf/kLHo+HIUOG0LlzZ4qKivjoo4+49tpr+eKLL3jhhRcC8dIZMmQIf//737nhhhuYOHEir7zyCgCO4/Db3/6WrVu38vzzz3PwwQfXOvecc87hiy++YNy4ccTExPDf//6XyZMn8+WXX/LWW2/5PoYATz75JL///e9p1aoVZ599Nu3bt2fevHnce++9zJo1iwULFviGxDZt2sSRRx5JcXExJ598MmeddRalpaXk5ubywgsvcPXVV5Oamtrk137ttdfy6aefcsopp3DyyScTFRUFNP1zLtKsWREJa4A90LdqaWmpjY6OtoDNycnxPT98+HBrjLEzZ86scfyOHTvsgAEDbHx8vN28ebPv+eeee84C9rnnnqtxfGZmps3MzNzn/VevXl3ruaqqKnvRRRdZwC5atGi/7ffKzc21gE1KSrK33nprnf+eeOKJGuc4jmNPPvlkC9h//etf1lprJ0+ebAF70UUX1brH8OHDLWB79uxpCwoKfM/v3r3bHnXUURaw06dP9z2fl5dnY2NjbZs2bewPP/xQ41q///3vLWAnTpzoe+4f//iHBewjjzxS6947d+60JSUlvse33nqrBezcuXP3+bEYP358jefHjx9vAdupU6can+u9X19DPucikUShRiTM1SfUWGtthw4dLGAXL15srbX2m2++sYAdN25cnce/+eabFrBTpkzxPdfYULMvX331lQXsbbfdVq/jvb/I9/dvwIABtc7btm2b7dy5s42Pj7ePP/64jYqKsr1797Y7d+6sdaw31OwdXLzmzp1rATtixAjfc3feeacF7E033VTr+IKCAtumTRsbHx9vS0tLrbV7Qs2TTz55wNfblFBTV2hqzOdcJJJo+EkkQlhrAXzDJp999hkARUVFdRbdbtu2DYAffvihyffevn07999/P2+//TY5OTns2rWrxvs3bNjQoOtlZmY2aNp2WloaM2bMYOTIkVx99dXEx8fz8ssv06pVq32eM3z48FrPDRs2jKioKL7++mvfc0uWLAFg5MiRtY5v164dAwcO5JNPPmHFihUMGDCA0047jZtvvpmrrrqK9957jxNPPJFjjjmGvn371hjSaqrBgwfXei6Yn3ORcKRQIxIBSktLKSgoACA9PR3AV5D6wQcf8MEHH+zz3J07dzbp3oWFhRx55JHk5uYyePBgLrroIlJSUoiOjqawsJBHH32UsrKyJt2jPgYPHkzXrl3Jzc3l+OOPZ8CAAfs9vkOHDrWei46OJi0tja1bt/qe8xYCd+zYsc7reJ8vLCwE3ED2+eefM3nyZN59911ef/11AA466CCuv/56/vCHPzT4tdUlIyOj1nPB+pyLhCvNfhKJAPPnz6eyspIOHTr4FslLSkoC4NFHH8W6Q811/nvuueeadO9nnnmG3Nxcbr31VhYvXsw///lP7rzzTiZPnsy5557b1JdWb9deey25ubmkpaXxzjvv8OKLL+73+C1bttR6rrKykvz8fNq2bet7zvtx3Lx5c53X2bRpU43jAPr06cPLL7/M9u3b+fLLL7nnnntwHIdrr72WqVOn+o7zeDy++/6SNyTtS129PsH6nIuEK4UakWbOcRzuuusuAM4//3zf80cddRQAn376aZPvERUVtc9Vi1evXg3AWWedVet9H3/8cZPvXR+vvPIKTz31FMcddxxLliwhPT2dK664gh9//HGf59TVtvnz51NVVcXAgQN9z3nfrmvadWFhId988w3x8fH06dOn1vujo6M5/PDDufHGG5k5cybgTn/3ateuHQDr1q2rde6XX365z7bviz8/5yLNkUKNSDO2detWfvOb3zBv3jy6du3KzTff7HvfEUccwbHHHsvrr7/Os88+W+f5S5curTHUsi+pqals27aN3bt313qft2fol7/0v/76a+6+++76v5hGysnJYeLEiaSmpjJjxgwOOuggpk2bxq5duzj33HP3OfR1xx13sGPHDt/j0tJSbrrpJgB+97vf+Z6/4IILiImJ4bHHHvMFOK+//e1vFBcXc8EFFxAXFwfAV199VefaNd6eocTERN9z3rqY5557rkZvzbp167j99tsb9HEA/37ORZoj1dSINBPewk/HcXzbJMyfP5/y8nIGDx7Miy++SFpaWo1zvMWzl156Kf/4xz8YMmQIycnJrF+/nu+++45ly5bx2WefHXAV4lGjRvHFF18wZswYjjvuOOLi4hgwYACnnnoqF110Effffz9//OMfmTt3Lj179uTHH39k9uzZnHnmmbz88ssNfq2FhYX7XVH44osvJisri4qKCn7zm99QXFzMW2+9RefOnQE46aST+POf/8wDDzzA9ddfz2OPPVbrGn369OGQQw6psU7NTz/9xCmnnMKFF17oOy4rK4tHHnmEq666ikGDBnHOOeeQnp7Oxx9/zGeffcbBBx/Mvffe6zv+hRde4Mknn2TYsGF0796d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+7ZCjYiIyAEp1IQpd62a6t4aDT+JiIgckEJNGDMHZbv/dzwoxC0REREJf9GhboDsm/ntFZjjToTe/ULdFBERkbCnUBPGTKs2cHD/UDdDRESkWdDwk4iIiEQEhRoRERGJCAo1IiIiEhEUakRERCQiKNSIiIhIRFCoERERkYigUCMiIiIRQaFGREREIoJCjYiIiEQEhRoRERGJCAo1IiIiEhEUakRERCQiKNSIiIhIRGhxu3RHR7e4lyyyT/p+EJFw15CfU8ZaawPYlrBRUVFBTExMqJshIiIijVCf3+MtZvipoqKCRx99lN27dzfq/AcffLDR99a5kX1uKO/d2HN3797NjTfeqO8HnatzdW7Yn7t7924effRRKioqDnhsiwk1AAsWLKCxHVPr169v9H11bmSfG8p7N/Zcay25ubn6ftC5Olfnhv251loWLFhQr2NbVKhpihNPPFHn6tywu3dT2x2K++pcnatzdW6gtJiampKSEi6++GKef/55EhMTQ90ckZDS94OINBcN+XnVYnpqYmJiGDdunIqFRdD3g4g0Hw35edViempEREQksrWYnhoRERGJbAo1IiIiEhG0nGgz98Ybb/D555+zYcMGYmNj6dWrFxdccAGdOnXyHVNeXs706dNZuHAhFRUVDBgwgAkTJpCcnBy6hofAgT5WW7du5eqrr67z3D/96U8cffTRwWxuWHj33XeZNWsWhYWFZGZmcskll9CjR48ax1hrufvuu/nmm2+4/vrrGTx4cIhaGxrLly/nrbfeIjc3lx07dtT6GCxevJgPPviAnJwcdu7cyX333UdWVlboGhxiB/p4lZaW8uKLL/LFF1/w888/0759e0466SROOOGEELY6+Orzs33y5MksX768xnmjR4/msssuC3Zzw4ZCTTO3fPlyTjzxRLp3705VVRUzZ87kzjvv5KGHHiI+Ph6AadOmsWTJEq677joSExOZOnUqDz74IHfccUeIWx9cB/pYpaWl8dRTT9U453//+x9vvfUWAwcODFGrQ2fhwoVMnz6diRMn0rNnT+bMmcNdd93FI488QlJSku+4OXPmYIwJYUtDq6ysjKysLEaOHMkDDzxQ5/sPPvhgjj76aJ588skQtDC8HOjjNW3aNJYtW8Y111xDeno63333Hc888wwpKSkcccQRIWhxaNTnZzvAqFGjOPfcc32PY2NjQ9HcsKFQ08zdcsstNR5fddVVTJgwgZycHPr27UtJSQkfffQR1157LYceeigAV155JX/6059YtWoVvXr1CkWzQ+JAHyuPx1Or9+rzzz/n6KOPrvFDpKWYPXs2o0aN4vjjjwdg4sSJLFmyhLlz53L66acDkJeXx+zZs7nnnnta7F+HAwcO3G/oPe644wC3J1AO/PFatWoVw4cP55BDDgHcnocPPviA1atXt6hQc6CfV15xcXEtrtd9f1RTE2FKSkoAaN26NQA5OTlUVVXRr18/3zGdO3cmLS2NVatWhaSN4eKXH6tfysnJIS8vj5EjRwazWWGhsrKSnJycGl83Ho+Hfv36+b5uysrKePTRR7n00kv1Q1X8plevXnz11VcUFBRgrWXZsmVs2rSJ/v37h7ppIbWvn1effvopl156KX/+85+ZMWMGZWVloWhe2FBPTQRxHIfnn3+e3r1707VrVwAKCwuJjo6mVatWNY5NSkqisLAwBK0MD3V9rH7po48+onPnzvTu3TvIrQu94uJiHMepFVaSk5PZuHEj4A4T9O7dmyOPPDIELZRIdckll/Dkk09yxRVXEBUVhTGGyy+/vEbvREuzr59Xw4YNIy0tjZSUFNasWcOLL77Ixo0buf7660PY2tBSqIkgU6dOZd26ddx+++2hbkrYO9DHqry8nPnz53PWWWcFuWXNw5dffsmyZcu47777Qt0UiTDvvPMOP/74I5MmTSI9PZ0ffviBqVOn0q5duxbbW7Ovn1ejR4/2vd21a1fatWvH7bffzubNm8nIyAh2M8OCQk2EmDp1KkuWLOG2224jNTXV93xycjKVlZXs2rWrRm9NUVFRix0y2NfHam+LFi2irKyM4cOHB7l14aFt27Z4PJ5avXmFhYUkJyezbNkytmzZwsUXX1zj/Q8++CB9+vRh8uTJQWurRI7y8nJmzpzJDTfcwKBBgwDIzMwkLy+PWbNmtchQU5+fV17emYkKNdJsWWt59tln+fzzz5k8eTLt27ev8f7s7GyioqJYunQpRx11FAAbN24kPz+/RRUJw4E/Vnv76KOPOOKII2jbtm0QWxg+oqOjyc7OZtmyZb7pto7jsGzZMsaMGcOIESNq1Rpdf/31jB8/vkUVc4p/VVZWUlVVVWs2ncfjafSO8s1VQ35eeeXl5QHQrl27ALcufCnUNHNTp05l/vz5TJo0iYSEBN9f1omJicTGxpKYmMjIkSOZPn06rVu3JjExkWeffZZevXq1uFBzoI+V1+bNm/nhhx+46aabQtTS8DB27FimTJlCdnY2PXr04O2336asrIwRI0aQnJxcZ09fWlpavX74RpLS0lI2b97se7x161by8vJo3bo1aWlp7Ny5k/z8fAoKCgB8NUn7+hhGugN9vPr27cu///1vYmNjSU9PZ/ny5Xz88ceMHz8+hK0OvgP9vNq8eTPz589n0KBBtG7dmrVr1zJt2jT69OlDZmZmaBsfQtr7qZk755xz6nz+yiuvZMSIEcCexfcWLFhAZWVli118rz4fK4AZM2bw6aefMmXKFDyelj1B8N133+Wtt96isLCQrKwsfve739GzZ886jz3nnHNa5OJ733//Pbfddlut54cPH85VV13FvHnz+Oc//1nr/ePGjdvn12QkO9DHq7CwkBkzZvDtt9+yc+dO0tPTGT16NKecckqLWg/pQD+v8vPzeeyxx1i3bh1lZWWkpqYyePBgzjzzzAPuZB3JFGpEREQkIrTsP0NFREQkYijUiIiISERQqBEREZGIoFAjIiIiEUGhRkRERCKCQo2IiIhEBIUaERERiQgKNSIiIhIRFGpEREQkIijUiIiISERQqBEREZGIoFAjIiIiEUGhRkRERCKCQo2IiIhEBIUaERERiQgKNSIiIhIRFGpEREQkIijUiIiISERQqBEREZGIoFAjIiIiEUGhRkRERCKCQo2IiIhEBIUaERERiQgKNSIiIhIRokPdABHxjylTpvDxxx8DEBUVRevWrenatSvHHHMMI0aMwOPR3zAiEtkUakQiyGGHHcaVV16J4zgUFhbyzTff8Pzzz7N48WImTZpEVFRUqJsoIhIwCjUiESQ6Oprk5GQAUlJSyM7OplevXtx+++3MmzePUaNGsWvXLl544QW++OILKisryc7OZvz48WRlZfmu8+WXX/Kf//yHtWvXEh8fz8EHH8wNN9wQmhclIlJP6o8WiXCHHnoomZmZfP755wA89NBDFBUVcfPNN3PPPffQrVs37rjjDnbu3AnAkiVLeOCBBxg4cCD33nsvf/vb3+jRo0coX4KISL2op0akBejcuTNr1qxhxYoVrF69mmeeeYaYmBgALrroIr744gsWLVrE6NGjef311xk6dCjnnHOO7/y9e3FERMKVQo1IC2CtxRhDXl4epaWlXHLJJTXeX15ezubNmwHIy8tj1KhRoWimiEiTKNSItAAbNmygffv2lJaW0q5dOyZPnlzrmMTERABiY2OD3DoREf9QqBGJcMuWLWPt2rWccsoppKamUlhYiMfjoX379nUen5mZydKlSzn++OOD3FIRkaZRqBGJIJWVlRQWFtaY0v3mm28yaNAghg8fjjGGXr16cf/993PBBRfQsWNHduzYwZIlSxg8eDDdu3dn3Lhx3H777WRkZDB06FAcx2HJkiWcfvrpoX55IiL7Zay1NtSNEJGm++Xie61atSIzM5Nhw4YxfPhw3+J7u3fvZubMmSxevJji4mKSk5Pp06cP559/PmlpaQAsXryY//znP6xfv56EhAT69OnD9ddfH7LXJiJSHwo1IiIiEhG0To2IiIhEBIUaERERiQgKNSIiIhIRFGpEREQkIijUiIiISETQOjUizdAbb7zB559/zoYNG4iNjaVXr15ccMEFdOrUyXdMeXk506dPZ+HChVRUVDBgwAAmTJjg28U7Ly+PN998k5UrV1JcXEz79u351a9+xcknn+y7xooVK3jxxRfZsGEDZWVlpKenM3r0aMaOHRvslywickAKNSLN0PLlyznxxBPp3r07VVVVzJw5kzvvvJOHHnqI+Ph4AKZNm8aSJUu47rrrSExMZOrUqTz44IPccccdAOTk5JCUlMQ111xDamoqK1eu5KmnnsLj8TBmzBgA4uLiOPHEE8nMzCQuLo4VK1bw9NNPEx8fz+jRo0P2+kVE6qJ1akQiQHFxMRMmTGDy5Mn07duXkpISLr30Uq699lqOOuoowN3/6U9/+hN33nknvXr1qvM6zzzzDBs2bODWW2/d570eeOAB4uLiuOaaawLyWkREGks1NSIRoKSkBIDWrVsDbi9MVVUV/fr18x3TuXNn0tLSWLVq1X6v471GXXJzc1m5ciV9+/b1U8tFRPxHw08izZzjODz//PP07t2brl27AlBYWEh0dDStWrWqcWxSUhKFhYV1XmflypV89tln/OUvf6n1viuuuILi4mKqqqo4++yzGTVqlN9fh4hIUynUiDRzU6dOZd26ddx+++2NvsbatWu57777GDduHAMGDKj1/ttvv53S0lJWrVrFjBkzyMjIYNiwYU1ptoiI3ynUiDRjU6dOZcmSJdx2222kpqb6nk9OTqayspJdu3bV6K0pKiryzX7yWr9+PXfccQejR4/mrLPOqvM+7du3B6Br164UFRXx6quvKtSISNhRTY1IM2StZerUqXz++ef83//9ny90eGVnZxMVFcXSpUt9z23cuJH8/PwaRcLr1q3jtttuY/jw4Zx33nn1vndlZaV/XoiIiB+pp0akGZo6dSrz589n0qRJJCQk+OpkEhMTiY2NJTExkZEjRzJ9+nRat25NYmIizz77LL169fKFmrVr13L77bczYMAAxo4d67uGx+Ohbdu2ALz77rukpaXRuXNnAH744QdmzZrFSSedFPTXLCJyIJrSLdIMnXPOOXU+f+WVVzJixAhgz+J7CxYsoLKystbie6+88gqvvfZarWukp6czZcoUAN555x3+97//sXXrVjweDxkZGYwaNYrRo0fj8aijV0TCi0KNiIiIRAT9qSUiIiIRQaFGREREIoJCjYiIiEQEhRoRERGJCAo1IiIiEhEUakRERCQiKNSIiIhIRFCoERERkYigUCMiLcLWrVs555xzmDdvXqibIiIBor2fRKTB5s2bxz//+U/f45iYGFq3bk3Xrl0ZOHAgxx9/PAkJCQ2+7sqVK/n222855ZRTauwu3hDz58+nqKiIU045pVHni0jzpVAjIo12zjnn0L59e6qqqigsLGT58uVMmzaNOXPmMGnSJDIzMxt0vZUrV/Laa68xYsSIJoWadevW1Qo16enp/Pvf/yY6Wj/2RCKVvrtFpNEGDhxI9+7dfY/POOMMli1bxj333MN9993Hww8/TGxsbAhbuIcxJmzaIiKBoVAjIn516KGHctZZZzFz5kw++eQTRo8ezZo1a5g9ezY//PADO3bsIDExkYEDB3LhhRfSpk0boOau4VdffbXveo8//jjt27cH4JNPPmHOnDmsX7+e2NhYBgwYwAUXXEBaWhoAkydPZvny5cCency9u45v3bqVq6++usZO5lOmTGHRokU8/PDDPPPMM3z//fckJiZyxhlnMGbMGNauXctzzz3H6tWradOmDeeffz7Dhg2r8Xp37drFq6++yuLFiykqKiI1NZVRo0Zx2mmnaSdzkSBTqBERvzvuuOOYOXMm3333HaNHj+a7775j69atjBgxguTkZNavX8///vc/1q9fz1133YUxhiFDhrBp0yYWLFjA+PHjfWGnbdu2ALz++uu8/PLLHH300YwaNYri4mLeeecdbr31Vu677z5atWrFmWeeSUlJCdu3b2f8+PEAxMfH77etjuPw97//nT59+nDBBRcwf/58nn32WeLj45k5cybHHnssQ4YM4YMPPuDxxx+nV69evpBVVlbG5MmTKSgoYPTo0aSlpbFy5UpmzpxJYWEhF198ceA+yCJSi0KNiPhdamoqiYmJbNmyBYATTzyRU089tcYxPXv25NFHH2XFihX06dOHzMxMunXrxoIFCzjyyCN9wQFg27ZtvPLKK5x77rmceeaZvucHDx7MjTfeyHvvvceZZ55J//79SUlJYdeuXRx33HH1amtFRQXHHnssZ5xxBgDDhg3j8ssv54knnuDaa69l6NChAPTv358//vGPzJs3z9cLNHv2bDZv3sx9991Hx44dAfjVr35FSkoKb731FmPHjvX1IolI4KlvVEQCIj4+nt27dwPUqGUpLy+nuLiYnj17ApCbm3vAay1evBhrLUOHDqW4uNj3Lzk5mYyMDL7//vsmtXXUqFG+t1u1akWnTp2Ii4vj6KOP9j3fqVMnWrVqxdatW33PLVq0iD59+tCqVasa7erXrx+O4/DDDz80qV0i0jDqqRGRgCgtLSUpKQmAnTt38uqrr7Jw4UKKiopqHFdSUnLAa23evBlrLX/4wx/qfH9TZjTFxMT4hri8EhMTSU1NxRhT6/mdO3f6Hm/atIk1a9YwYcKEOq/9y9cqIoGlUCMifrd9+3ZKSkro0KEDAA8//DArV67ktNNOIysri/j4eF8ti+M4B7ye4zgYY7jpppvqLL49UN3M/uyrmLc+Rb7WWvr3789pp51W5/s7derU6HaJSMMp1IiI333yyScAHHbYYezcuZOlS5dyzjnnMG7cON8xmzZtqnXeL3tGvDIyMrDW0r59+7AKCh06dKC0tJT+/fuHuikigmpqRMTPli1bxn/+8x/at2/PsGHDfD0e1toax82ZM6fWuXFxcUDtIanBgwfj8Xh47bXXal3HWsvPP//sexwfH1+vIS1/OProo1m1ahXffPNNrfft2rWLqqqqoLRDRFzqqRGRRvv666/ZsGEDjuNQWFjI999/z3fffUdaWhqTJk0iNjaW2NhY+vTpw1tvvUVVVRUpKSl8++23NQpuvbKzswGYOXMmxxxzDFFRURx++OFkZGTwm9/8hhkzZrBt2zaOPPJI4uPj2bp1K1988YVvXRjvNRYuXMi0adPo3r078fHxHHHEEQF5/aeddhpffvkl9957L8OHDyc7O5uysjLWrl3LokWLmDJlSq16HREJHIUaEWm0V155BXALdb17P40fP77W3k/XXnstzz77LO+9956vDuXmm2/m8ssvr3G9Hj16cO655/LBBx/wzTffYK3l8ccfJz4+ntNPP52OHTsyZ84cXn31VQDS0tLo379/jdBywgknkJeXx7x585gzZw7p6ekBCzVxcXHcdtttvP766yxatIhPPvmEhIQEOnXqxDnnnENiYmJA7isidTP2l325IiIiIs2QampEREQkIijUiIiISERQqBEREZGIoFAjIiIiEUGhRkRERCKCQo2IiIhEBIUaERERiQgKNSIiIhIRFGpEREQkIijUiIiISERQqBEREZGIoFAjIiIiEeH/Af2hOp/gvfCYAAAAAElFTkSuQmCC", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkkAAAH8CAYAAADFbztvAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAACfE0lEQVR4nOzde1zUVfrA8c8ZbgICoyKCouANsVLRstIumrabmd3M1bLdLpZua/fdtVrXNmt1y1wrW+u3lnZxt1K3NNPUak3dTCvNvFAqIZKiopIMCCgCc35/fGe+MHKHuQHP+/XiBfOd7+XMMAzPnPOc5yittUYIIYQQQriw+LoBQgghhBD+SIIkIYQQQogqSJAkhBBCCFEFCZKEEEIIIaogQZIQQgghRBUkSBJCCCGEqIIESUIIIYQQVZAgSQghhBCiChIkCSGEEEJUQYIkIYTXDB06FKWUy7YNGzaglGL69Okeu25mZiZKKe666y6PXaO+EhMTSUxM9Og1qnvcd911F0opMjMza91XiJZMgiQhmiGlVKVgRNTNZZddhlKK1atX17pvr169UErx3XffeaFlVVNKMXToUI+dv6qASoiWItDXDRBCtGwXX3wxe/bsITo62tdNAWDixIls3ryZBQsWMHLkyGr327hxI2lpaVx00UX079/fiy2su06dOrFnzx6ioqLcuq8QLYX0JAkhfCosLIzk5GS/CZLGjRtHVFQUq1at4tixY9Xut2DBAgAmTZrkrabVW1BQEMnJycTFxbl1XyFaCgmShGghKuac7N+/nzFjxtCuXTsiIiL45S9/SWpqKgAnTpxg0qRJxMXF0apVKwYOHMj69esrnW/69OkopdiwYQNvv/02/fv3JzQ0lJiYGCZMmEB2dnad2lVTTtLJkyf505/+RO/evQkNDSUqKorhw4fz6aefVnmuU6dO8fvf/574+HhatWpFcnIyL7zwAna7vc7PU2hoKL/+9a8pKSnhrbfeqnIfm83G+++/T+vWrbntttvM7UuXLuXKK68kKiqK0NBQ+vTpw7PPPktxcXGdrp2Xl8fs2bMZNmwY8fHxBAcH0759e2644Qa2bNnisu9bb71lDqlu3LjRHGKt+FzWJ8+oqn2VUrz99tsAdO3a1Ty/M5dq0KBBWCyWaofi5syZg1KKv//973V6/EL4GxluE6KFyczM5JJLLqF3797cddddZGZmsnz5coYOHcqWLVsYMWIEkZGRjBs3jpMnT7J48WKuvfZa0tLS6NKlS6Xzvfjii3z66aeMGzeOESNGsGnTJt588002bNjA119/Tfv27RvUzp9++omhQ4eSmZnJFVdcwYgRIygsLGTVqlWMGDGC+fPnM3HiRHP/4uJihg8fztatW+nXrx+33347NpuNv/71r2zcuLFe1544cSKvvPIKCxcu5PHHH690/7///W/OnDnDxIkTad26NQBTp07l2WefJTo6mvHjx9O6dWvWrFnD1KlT+eSTT/j0008JDg6u8bp79uzhz3/+M1deeSXXXXcdbdq04eDBg3z00UesWbOGlStXMmLECABSUlJ46qmnePrpp0lISHAJbtyVo/TUU0/x4YcfsnPnTh5++GGsViuA+f13v/sdX331Fa+//jozZ86sdPxrr71GSEiIJIOLpksLIZodQJ/7533gwAFz+4wZM1zue+aZZzSg27Rpo3/729/qsrIy875FixZpQD/yyCMuxzz11FMa0EFBQXr79u0u9z3yyCMa0BMmTHDZPmTIkErtWr9+vQb0U089VWlfpZR+7733XLbn5ubqfv366VatWuns7Gxz+8yZMzWgR48e7dL+jIwM3aZNGw3oO++8s4pnq2oXX3yxBvT69esr3devXz8N6K1bt2qttd68ebMGdOfOnfXRo0fN/UpKSvSoUaM0oGfOnOlyjoSEBJ2QkOCyzWaz6RMnTlS63qFDh3RcXJxOTk6udB+ghwwZUuVjcP7Oz33cd955pwb0gQMHGrSv0+nTp3W7du10bGysLikpcbnP+XsdP358lW0ToimQ4TYhWpjExESeeOIJl2133nknYPTGzJ49G4ul/K1h/PjxBAYGsmPHjirP95vf/KZS4vL06dOJiori3XffrfNQU0U7d+5k48aN3HLLLdx6660u91mtVp5++mnOnDnDBx98YG5/8803sVgsPP/88y7t79q1Kw899FC92+DMNXLmHjlt3bqVnTt30r9/fy666CIA3njjDQCmTZtGbGysuW9gYCBz5szBYrFUOk9VoqKiqszNio+PZ8yYMezdu5eDBw/W+7F4SqtWrbj77rvJzs5mxYoVLvfNnz8fgN/+9re+aJoQbiFBkhAtTEpKCgEBAS7bOnbsCEBSUhIREREu9wUEBNChQweysrKqPN+QIUMqbYuKiiIlJYUz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6l1yslqt5OXluWzLy8sz93d+r2kfp5MnT/L000/Tq1cvJk2aVGt7e/ToQXZ2drX3BwUFERYWZn45X4Raa/mSr2b9Ja9z+fLE17m01ujiM775qqI9NenTpw8dO3ZkzZo15rY1a9bQsWNHLrjgAnPbmDFj+Mtf/mLezsnJ4c4776R79+5ceumlLFu2rNK5O3XqxNtvv82vf/1runfvzqBBg1i1apXLPnv27OFXv/oV3bt35/zzz+exxx6jsLDQvP+RRx5hwoQJLu148sknmTFjBueffz4pKSnMmTPHvP+SSy4B4J577qFTp07m7br417/+xUUXXUT37t357W9/S35+vnnf5s2bue666+jRowe9e/fmxhtvJCsrq9Zzzpkzh1/84hcAbNy4kW7dulX6v/+Xv/yFX/3qV7Weq66vv6p4tCcpMDCQbt26kZqaysUXXwwYkWdqaiojRoyo8pikpCR2797NddddZ27btWsXPXv2BIzuQKvVyu7du0lMTASMfKP09HR++ctfmsc4A6SuXbsyefLkOtVLyMzMpE2bNg19uEIIIRrjbDH2B8b65NKWeUshpFW9jhk3bhxLlixh9OjRACxevJhx48axZcuWao959NFHyc7OZunSpQQFBfHkk0+Sk5NTab/Zs2czdepUnn76aT744AMmT55Mr1696NmzJ0VFRdx+++1ceOGFfPzxx+Tk5DBlyhT+/Oc/89JLL1V77f/85z9MmjSJlStX8u233/Loo48ycOBArrzySlavXk3fvn154YUXuOqqqwgICKjTc5CZmcnKlSt56623KCgo4A9/+ANTp05l3rx5lJaWcs899zB+/HheeeUVSkpK+O677+qd33j55ZcTGRnJ6tWrue222wCjx+ujjz7i8ccfr9e56svjs9tGjRrFunXr2LBhA1lZWSxYsIDi4mKGDh0KwLx583j33XfN/UeOHMnOnTtZuXIlhw8fZunSpezfv98MqpRSjBw5kmXLlrFt2zYOHjzIvHnzaNOmDQMHDgSMAGn69OlER0dzxx13kJ+fj81mc+nR2rBhA5s2beLw4cMcPnyYZcuWsX79+mqDNyGEEKKiW265ha1bt5KVlUVWVhbbtm3jlltuqXb//fv38/nnnzN79mwuvPBC+vbty5w5czhz5kylfUeNGsX48ePp3r07jz32GH379jWTsJcvX05xcTFz584lOTmZyy+/nBkzZvDBBx9w4sSJaq/fu3dvfv/739OtWzd+9atf0a9fPzZt2gRAu3btACO/NyYmxrxdG2c7LrjgAi699FJmzJjBihUrOH78OKdOnSI/P5+rr76axMREevbsydixY+nUqVOdzu0UEBDADTfcwPLly81tmzZtIj8/v875Uw3l8ZykwYMHk5+fz9KlS7HZbCQmJjJ16lRzaCwnJ8clquzVqxcPPfQQixcv5r333iMuLo4pU6aYNZIAbrzxRoqLi5k/fz5FRUUkJyczdepUgoODAaPnKTs7m+zsbO677z6X9ixdutT8+YMPPiAnJweLxUKnTp149NFHufTSS+v/IM+choBmn94lhBCeFRxi9Oj46Nr11a5dO4YPH87SpUvRWjNs2DDatm1b7f7p6ekEBga6zM7u0aNHlTUDL7zwwkq3v//+ewB+/PFHevfuTVhYmHn/wIEDsdvt7N+/n/bt21d5/d69e7vcjomJqbIXqz46derkkhh94YUXmu0YNGgQY8eO5fbbb+eKK67giiuu4Prrr6dDhw71vs7o0aO5/vrryc7OJjY2lmXLljF8+PAqnzt38sp/9hEjRlTbQzN9+vRK2wYNGsSgQYOqPZ9SinHjxjFu3Lgq7x86dKjZU1WduuxTZ7afoV39f+lCCCHKKaXqPeTla+PGjWPatGkAzJw508etqdm5dQCVUtjtdo9e88UXX+See+5h/fr1fPTRRzz//PO89957lYLA2qSkpJCQkMCKFSu44447WLt2LS+++KKHWl1OFs1xA5170tdNEEII4QNXXXWVWUOvtg/e3bt3p7S0lF27dpnb0tPTKyUkA2zfvr3SbWdubs+ePdmzZ4/L4q1bt27FYrHQvXv3Bj+WoKAgysrK6nXM4cOHXSY8bd++vVI7LrjgAh588EE++ugjevXqxYcfftig9o0ePZrly5fz2WefYbFYGD58eIPOUx8SJLmDrXHdlUIIIZqmgIAANmzYwIYNG2pNdu7RowdXXXUVjz/+ONu3b2fXrl1MmTKFVq0q956tWrWKxYsXs3//fv7+97+zY8cO7r77bsAIFkJCQnj44YfZu3cvX375JU8++SS33HJLtUNtdREfH8+mTZvMos11ERISwiOPPML333/P119/zZNPPsn1119PTEwMBw8e5Nlnn2Xbtm1kZWWxceNGDhw4UOParTW5+eab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b1FKcckll3D33XfTqlWrao85e/YsixYtYvPmzZSUlNCvXz/uvfderFaruU9OTg6vv/4633//Pa1atWLIkCGMHz+egIAAAHJzc1m0aBEZGRlkZ2dz7bXXctddd7lcZ8OGDbz66qsu24KCgnjnnXfc9viFEEII0bR5LEh6+eWXyc3NZdq0aZSVlfHqq68yf/58Hn744WqPefvtt9m+fTu///3vCQsLY+HChcyZM4e//vWvANjtdp599lmsViszZswgNzeXefPmERAQwPjx4wEoKSkhMjKS0aNH8/HHH1d7rdDQUObOneveBy2EEEKIZsMjw21ZWVns2LGD++67j549e5KcnMyECRPYvHkzJ0+erPKYoqIiPv/8c+68804uuOACunXrxuTJk9m3bx9paWkA7Ny5k6ysLB588EESExPp378/48aN45NPPqG0tBSAmJgY7r77boYMGUJYWFi1bVRKYbVaXb6EEEIIIZw80pOUlpZGeHg43bt3N7f16dMHpRTp6elcfPHFlY7JyMigrKyMPn36mNs6depEdHQ0aWlpJCUlkZaWRpcuXVwCmpSUFBYsWMChQ4fo2rVrndt45swZJk+ejNaarl27ctttt9G5c+cajykpKaGkpMS8rZQiNDQUpRRKqTpfW4imxPnalte4EKK5qOv7mUeCJJvNRmRkpMu2gIAAWrdujc1mq/aYwMBAwsPDXbZHRUWZx9hstko9PlFRUeZ9ddWxY0d+97vfkZCQQFFRER999BHTpk3jhRdeoF27dtUet3z5ct5//33zdteuXZk1axbR0dF1vrYQTVVsbKyvmyCEEF5VryDpnXfeYcWKFTXu8+KLLzaqQd6QlJREUlKSy+1HH32Uzz77jFtvvbXa426++WZGjRpl3nZGorm5ueZwnxDNjVKK6OhocnJy0Fr7ujlCCNFogYGBtGnTpvb96nPS66+/nqFDh9a4T4cOHbBareTn57tsLysro6CgoNrcH6vVSmlpKYWFhS69SXl5eeYxVquV9PR0l+Py8vLM+xoqMDCQrl27kp2dXeN+QUFBBAUFmbedQ291eaKFaOqkx1QI0dyUlJS4/F8/V70StyMjI+nUqVONX4GBgSQlJVFYWEhGRoZ5bGpqKlprevToUeW5u3XrRkBAALt37za3HTlyhJycHLPXJykpiYMHD5qBEcCuXbsIDQ0lPj6+Pg/Fhd1u5+DBg/UOdkpKSpg7dy6nT59u0HXnzJnToOPccbxcW65dV6dPn+bxxx+X17lcW64t12421z59+jRz5851yTOuikdmt8XHx5OSksL8+fNJT09n7969vPHGGwwePJi2bdsCcPLkSR555BGzZygsLIxhw4axaNEiUlNTycjI4NVXX3UZGuvXrx/x8fHMmzePzMxMduzYweLFi7nmmmtcIsHMzEwyMzM5c+YM+fn5ZGZmkpWVZd7//vvvs3PnTo4dO0ZGRgYvv/wyJ06cYPjw4fV+rF9++WWDhyAqtsnbx8u15dp1pbXmwIED8jqXa8u15drN5tpaa7788sta9/NYnaSHHnqIhQsX8swzz5jFJCdMmGDeX1paypEjRyguLja33XnnnSilmDNnDqWlpWYxSSeLxcITTzzBggULmDZtGiEhIQwZMoRx48a5XPuxxx4zf87IyGDTpk20b9+eV155BTAKXc6fPx+bzUZ4eDjdunVjxowZjeqNaohrrrnGZ8fLteXa3tKUH7dcW64t126+164LpSUTs8GKioq46667eOutt2qsySREUyavcyFEc1PX9zVZu60RgoKCGDNmTI1JX0I0dfI6F0I0N3V9X5OeJCGEEEKIKkhPkhBCCCFEFSRIEkIIIYSogsdmtwnfWr58Od988w2HDx8mODiYpKQkfv3rX9OxY0dzn7Nnz7Jo0SI2b95MSUmJOZuwJS/2W9vzdvz4cR544IEqj3300UcZNGiQN5vrV9auXcvKlSux2WwkJCQwYcKESnXRtNY8++yz7Nixgz/+8Y9VruPYUvzwww989NFHHDhwgNzc3ErPx9dff81nn31GRkYGBQUFPP/88yQmJvquwX6ituftzJkzvPPOO2zdupVTp04RExPDtddeyy9/+Usfttq36vL/YPr06fzwww8ux1199dVMmjTJ2831KxIkNVM//PAD11xzDd27d6esrIz33nuPGTNm8MILL9CqVSsA3n77bbZv387vf/97wsLCWLhwIXPmzOGvf/2rj1vvO7U9b9HR0bz22msux/z3v//lo48+on///j5qte9t3ryZRYsWMXHiRHr27MnHH3/MzJkzeemll8z1FQE+/vhjWSjXobi4mMTERIYNG8bf//73Ku9PTk5m0KBBzJ8/3wct9E+1PW9vv/02qampPPjgg7Rv355du3axYMEC2rZty0UX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4QW8Xi9dXV08+eSTpKWlXfd5iIj0BYUkkdtIcXExx44dIz8//6prNDY2UlBQwLx580hISOhxPz8/n46ODhoaGli3bh0REREkJydfS9siIv1CIUnkNlFcXEx9fT15eXmEhYUFroeGhtLZ2UlbW1u31aTW1tbAT7dd0tTUxIoVK3A6ncydO9fwcxwOBwCjRo2itbWVsrIyhSQRuSlpT5LILc7v91NcXMzOnTt56623AiHmktGjRzNgwAD27t0buPbbb7/xxx9/dNu0fezYMfLy8khJSeHpp5++4s/u7Oy8PhMREeljWkkSucUVFxezY8cOcnJyCAkJCewzslqtmM1mrFYrjzzyCGvXrmXw4MFYrVbWrFlDbGxsICQ1NjaSn59PQkICM2fODNQwmUwMHToUgO+//x673c7IkSMBOHjwIN999x2PPfZYn89ZROR60BEAIre4zMxMw+uLFy8mNTUV+Pswyerqajo7O3scJllaWkp5eXmPGuHh4RQVFQGwZcsWtm/fTktLCyaTiYiICNLS0nA6nZhMWrQWkZuPQpKIiIiIAf33TkRERMSAQpKIiIiIAYUkEREREQMKSSIiIiIGFJJEREREDCgkiYiIiBhQSBIRERExoJAkIiIiYkAhSUTkKrW0tJCZmUllZWV/tyIivUDPbhORG0JlZSWffPJJ4PWgQYMYPHgwo0aNIjExkalTpxISEvKf67rdbnbv3s2MGTOw2WxX1duOHTtobW1lxowZV/V+Ebk5KSSJyA0lMzMTh8NBV1cXHo+HAwcOUFJSQkVFBTk5OURHR/+nem63m/LyclJTU68pJB07dqxHSAoPD+err75i4ED9UypyK9LfbBG5oSQmJhITExN4PXv2bPbt28e7775LQUEBq1atwmw292OHfwsKCrphehGR608hSURuePfeey9z587F5XJRVVWF0+nk6NGjbN68mYMHD3L69GmsViuJiYk888wzDBkyBIDS0lLKy8sBWLJkSaBeYWEhDocDgKqqKioqKmhqasJsNpOQkEBWVhZ2ux2A3NxcDhw4AFxc5YKLK0hFRUW0tLSwZMkSFi9eTGpqKgBFRUXU1tayatUqVq9ezf79+7FarcyePZvp06fT2NjIF198wS+//MKQIUNYsGABycnJ3ebb1tZGWVkZdXV1tLa2EhYWRlpaGhkZGZhM2koq0lcUkkTkpjBlyhRcLhd79uzB6XSyZ88eWlpaSE1NJTQ0lKamJrZv305TUxNvv/02QUFBTJgwgePHj1NdXU12dnYgPA0dOhSADRs28M033zBx4kTS0tLwer1s2bKF5cuXU1BQgM1mY86cObS3t3Pq1Cmys7MBsFgs/9irz+fjnXfeIS4ujqysLHbs2MGaNWuwWCy4XC4mT57MhAkT2LZtG4WFhcTGxgZC27lz58jNzeXPP//E6XRit9txu924XC48Hg/PPvts7/0hi0g3CkkiclMICwvDarXy+++/A5Cens4TTzzRbcyYMWP4+OOPOXToEHFxcURHR3PXXXdRXV3N+PHjA0EE4OTJk5SWljJ//nzmzJkTuJ6UlMRrr73G1q1bmTNnDvHx8QwfPpy2tjamTJlyRb1euHCByZMnM3v2bACSk5NZtGgRn376KcuWLWPSpEkAxMfH89JLL1FZWRlYpdq8eTMnTpygoKCAyMhIAKZNm8bw4cPZtGkTM2fODKxyiUjv0rqtiNw0LBYLZ8+eBei2F+j8+fN4vV7GjBkDwOHDh/+1Vl1dHX6/n0mTJuH1egO/QkNDiYiIYP/+/dfUa1paWuD3NpuNqKgogoODmThxYuB6VFQUNpuNlpaWwLXa2lri4uKw2Wzd+ho3bhw+n4+DBw9eU18icuW0kiQiN42Ojg6GDRsGwJkzZygrK6OmpobW1tZu49rb2/+11okTJ/D7/bz44ouG96/lJ9YGDRoU+ErvEqvVSlhYGEFBQT2unzlzJvD6+PHjHD16lIULFxrWvnyuItJ7FJJE5KZw6tQp2tvbGTFiBACrVq3C7XaTkZHBnXfeicViCewF8vl8/1rP5/MRFBTEG2+8YbgZ+t/2Hf2T/7e5+ko2Xfv9fuLj48nIyDC8HxUVddV9ich/o5AkIjeFqqoqAO677z7OnDnD3r17yczMZN68eYExx48f7/G+y1duLomIiMDv9+NwOG6o4DFixAg6OjqIj4/v71ZEbnvakyQiN7x9+/axfv16HA4HycnJgRUZv9/fbVxFRUWP9wYHBwM9v4JLSkrCZDJRXl7eo47f7+evv/4KvLZYLFf0Fd71MHHiRBoaGti1a1ePe21tbXR1dfVJHyKilSQRucH8/PPPNDc34/P58Hg87N+/nz179mC328nJycFsNmM2m4mLi2PTpk10dXUxfPhwdu/e3W0D9CWjR48GwOVy8fDDDzNgwAAeeOABIiIieOqpp1i3bh0nT55k/PjxWCwWWlpa+PHHHwPnEl2qUVNTQ0lJCTExMVgsFh588MFemX9GRgY//fQT7733HikpKYwePZpz587R2NhIbW0tRUVFPfY7iUjvUEgSkRtKaWkpcHHj9KVnt2VnZ/d4dtuyZctYs2YNW7duDezjefPNN1m0aFG3enfffTfz589n27Zt7Nq1C7/fT2FhIRaLhVmzZhEZGUlFRQVlZWUA2O124uPju4WgRx99lCNHjlBZWUlFRQXh4eG9FpKCg4PJy8tjw4YN1NbWUlVVRUhICFFRUWRmZmK1Wnvlc0WkpyD/5evMIiIiIqI9SSIiIiJGFJJEREREDCgkiYiIiBhQSBIRERExoJAkIiIiYkAhSURERMSAQpKIiIiIAYUkEREREQMKSSIiIiIGFJJEREREDCgkiYiIiBhQSBIREREx8D9pNvVDFAPheQAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "attribution['Gamma_Carry'] = attribution['Gamma_PnL'] + attribution['Theta_PnL']\n", - "\n", - "(attribution * quantity).cumsum().plot(y = ['Total_PnL', 'Delta_PnL', 'Vega_PnL'], title = 'Structure Attribution (RV)')\n", - "plt.show()\n", - "\n", - "(attribution_gb ).cumsum().plot(y = [ 'Delta_PnL', 'Unexplained_PnL'], title = 'Structure Attribution (GB)')\n", - "plt.show()\n", - "\n", - "\n", - "(greeks['Midpoint_delta'] * quantity).plot(y = ['Midpoint_delta'], title = 'Delta Exposure')\n", - "plt.show()\n", - "\n", - "vol_ts.plot(y = 'Midpoint_bs_iv', title = 'Implied Volatility')\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": 324, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Equivalent Expected Size: 0.36\n" - ] - }, - { - "data": { - "text/plain": [ - "Datetime\n", - "2023-11-14 8.0\n", - "2023-11-15 8.0\n", - "2023-11-16 8.0\n", - "2023-11-17 8.0\n", - "2023-11-20 8.0\n", - "2023-11-21 8.0\n", - "2023-11-22 8.0\n", - "2023-11-23 8.0\n", - "2023-11-24 8.0\n", - "2023-11-27 8.0\n", - "2023-11-28 8.0\n", - "2023-11-29 8.0\n", - "2023-11-30 8.0\n", - "2023-12-01 8.0\n", - "2023-12-04 8.0\n", - "2023-12-05 8.0\n", - "2023-12-06 8.0\n", - "2023-12-07 8.0\n", - "2023-12-08 8.0\n", - "2023-12-11 8.0\n", - "2023-12-12 8.0\n", - "2023-12-13 8.0\n", - "2023-12-14 8.0\n", - "2023-12-15 8.0\n", - "2023-12-18 8.0\n", - "2023-12-19 8.0\n", - "2023-12-20 8.0\n", - "2023-12-21 8.0\n", - "2023-12-22 8.0\n", - "2023-12-25 8.0\n", - "2023-12-26 8.0\n", - "2023-12-27 8.0\n", - "2023-12-28 8.0\n", - "2023-12-29 8.0\n", - "Freq: B, dtype: float64" - ] - }, - "execution_count": 324, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "delta = greeks['Midpoint_delta'].shift(1)\n", - "quantity_edit = pd.Series(index = delta.index)\n", - "booked_quantity = pd.Series(index = delta.index, data = [False]*len(delta)) ## Booked quantity is the quantity that has been booked for the day\n", - "q_change = pd.Series(index = delta.index, data = [0]*len(delta)) ## Quantity change for the day\n", - "## The plan is to simulate some sort of rebalance, where we want to keep delta within a certain range,\n", - "## We plan to achieve this by reducing quantity when delta is too high and increasing quantity when delta is too low\n", - "q = quantity\n", - "d_threshold = 0.6\n", - "d_threshold = eq_equivalent_size\n", - "print(f\"Equivalent Expected Size: {eq_equivalent_size:.2f}\")\n", - "## Start loop\n", - "for _delta, index in zip((delta), delta.index):\n", - " day_delta = _delta * q\n", - " if day_delta > d_threshold:\n", - " while day_delta >d_threshold:\n", - " q -= 1\n", - " q_change.loc[index] += 1\n", - " day_delta = _delta * q\n", - " quantity_edit.loc[index] = q\n", - " booked_quantity.loc[index] = True\n", - " else:\n", - " quantity_edit.loc[index] = q\n", - "\n", - " # print(q)\n", - "quantity_edit" - ] - }, - { - "cell_type": "code", - "execution_count": 325, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAj0AAAH8CAYAAAA6zR6NAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAACA90lEQVR4nO3dfXzP9f7H8cf7u+u5mhk2xpiZOC5LF6gQXVJRUulCKdWvi9PpShc6Jyqn6Ern0DmdKJyTDimdhlChEpLkYq7FYlg2u8KYbd/374+vfVkbttn2/W7f5/12c7Pv5/v5fj6v73fG0/vSWGstIiIiIjWcw9MFiIiIiFQFhR4RERHxCQo9IiIi4hMUekRERMQnKPSIiIiIT1DoEREREZ+g0CMiIiI+QaFHREREfIJCj4iIiPgEhR6RaiopKQljDHfddVeR43fddRfGGJKSkjxSl7fUcDrGGHr16uXpMkSkiin0iE9bsmTJGf8BLAwXLVq0qLK6KtqpApK3KAxJhb/8/PyoV68erVq1YsCAAUyYMIEDBw5Uag2jRo3CGMOSJUsq9T4AvXr1KvJ+S/o1atSoSq9DxNf4e7oAEalYr7zyCs888wxNmzb1dClldv3119O5c2cADh48yO7du/nuu+/43//+x8iRI3n77be9NriVx9ChQ08ZptUSJVLxFHpEapioqCiioqI8XUa5DBgwoFioyc/P5/333+fRRx/l7rvvJigoiFtvvdUzBVawu+66S+FGpAqpe0uknE7uDpk1axYXXHABoaGhhIeHc8stt7Bnz54SX5eens6zzz5L27ZtCQkJoV69evTp04eFCxeWeP7Bgwd5/PHHiY6OJjg4mHPOOYc333wTp9NZ4vm/H08zatQoWrZsCcDUqVOLdKFMmTKlyGsXLFjANddcQ0REBEFBQbRq1YqnnnqKzMzMEu/11Vdfcckll1CrVi3Cw8MZMGAAmzdvPvOHVwb+/v7cd999vPPOOwA8/vjjHDlypNh5H330Eb179yYsLIzg4GDatm3Lyy+/TG5u7hnv0aJFC0aPHg1A7969i3xGhbZu3cozzzxD165dadiwIUFBQcTExHDfffeRnJxcQe+2uGPHjnH++edjjOHzzz8v9vydd96JMYaXXnrJfWzKlCnu7+/cuXPp3r07tWrVon79+gwaNIht27aVeK99+/bx0EMP0aJFCwIDA2nYsCE33HADP/30U4l1/e1vf+Pcc8+lfv36hIaG0qJFC66//nq++uor93ln6lot7Oo7WWG386hRo1i5ciX9+vUjPDy82Dixs/mei29SS4/IWXrnnXf4/PPPue666+jZsyc//PADM2bMYO3ataxZs4agoCD3ub/++iu9evUiKSmJSy65hKuuuorDhw8zZ84crrrqKt59912GDx/uPj83N5c+ffrw448/0qlTJ2677TYyMzN56aWX+Oabb0pVX69evcjMzOTtt9+mU6dODBgwwP1cYVcSwOjRoxk1ahTh4eH079+fRo0asW7dOl5//XXmzZvH8uXLqVu3rvv8WbNmcfPNNxMYGMjNN99MVFQUS5cupVu3bnTs2LH8H+gpDB06lNGjR/Prr7+yaNEi+vXr535u2LBhfPDBB0RHR3PjjTcSFhbGihUr+POf/8zXX3/Nl19+ib//qf+6+9Of/sRnn33GN998c8oup08//ZR//vOf9O7dm+7duxMYGMiGDRuYNGkSCQkJrFq1qlK6FAMDA5kxYwZdunTh7rvvZs2aNTRr1gyADz74gH//+9/06dOHkSNHlljzF198wcCBA+nVqxdr1qzhk08+YfHixSxbtow2bdq4z925cycXX3wxe/fu5bLLLuPWW29l9+7dfPzxx8ydO5dPPvmE/v37u8+/6667+Oijj2jfvj133nknISEh7N27l6VLlzJ//nz69u171u99+fLlvPLKK1x88cUMGzaMtLQ0AgMDgbP/nouPsiI+bPHixRawPXv2POU5O3futICNiYkpcvyFF16wgK1Tp45dt25dkeduvfVWC9gZM2YUOd6zZ09rjLEfffRRkeMZGRm2U6dONjg42KakpLiPjxkzxgL2hhtusAUFBe7jO3bssPXr17eAHTp0aJFrDR061AJ2586dxd7D788ttGjRIgvYbt262YyMjCLPffDBBxawf/rTn9zHDh48aMPDw62/v7/98ccfi5z/pz/9yQLFajidwpo/+OCD0553++23W8D+5S9/KVbfwIEDbU5OTpHzC79H48ePL3K8pO954bmLFy8u8d7Jycn26NGjxY4vWLDAOhwO+8ADD5y29pP17NnT/f144YUXSvy1b9++Iq+ZMWOGBezFF19s8/Pz7caNG21oaKht1KhRsXMLPxPAJiQkFHlu/PjxFrCXXXZZkeNXXHGFBezL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u++47bbbiI+Px8/Pj+uuu46OHTvSp08fXn31VZ599llat27NNddcQ8uWLTl06BC//vor33zzDRdffDHz5893X+9f//oXN998M5dcckmRdXoSExO59NJL3V1RZfHZZ5+5F587fPgwu3bt4rvvvmPfvn3Uq1fPfc+TDRs2jJ9++ol33nmHVq1aceWVV9K8eXPS09PZuXMn3377LXfffTf//Oc/T3vv3r1743A4ePbZZ0lMTHS3UDz//PNERkZyyy238N///pfOnTtzxRVXkJWVxZdffklwcDCdO3cuV+vWlClTTtli17lzZ/eaSuPHjychIYEbb7yRBx54AHCFiRkzZtCtWzduvfVW1qxZ46650LXXXsvAgQMZOHAgcXFxrFmzhi+++ILw8HD3Yo+F/vnPf9KjRw+eeuopFi5cSNeuXd3r9DgcDj744AN3K9eePXvo0qULHTp0oGPHjjRr1ozs7GzmzJlDSkoKf/zjH4u0iD311FPcc8899OjRg5tuuong4GAWL15MXl4enTp1Yu3atWX63Crqey4+yKNzx0S8xMGDB+2YMWNs165dbZ06day/v79t3Lix7d+/v507d26JrzndFOfTTdPNzs62Y8aMseeee66tVauWDQ4Oti1atLDXXHONfffdd+2hQ4eKnJ+VlWUfe+wx26RJExsUFGTbtGljX3/9dfvLL7+Uesq6tdZu27bN9u/f34aHh1tjTIlTxL/77jt700032aioKBsQEGAjIiJsp06d7GOPPVZsPR5rrV24cKHt0aOHDQkJsWFhYfa6666zmzZtOmUNp1J4fuEvh8Nh69SpY2NjY+31119v//73v9sDBw6c9hoJCQm2X79+tmHDhjYgIMA2btzYnn/++XbkyJF206ZNRc7lFMsU/Pvf/3avl1RYS6HDhw/b5557zrZq1coGBQXZ6Oho++CDD9q0tLQSp12fTmmmrBd+X1etWmUDAwNtTExMiVO03377bQvY66+/3n2scMr6Bx98YBMSEuxFF11kQ0NDbb169ewNN9xgt2zZUmJdycnJ9oEHHrDNmze3AQEBtkGDBvb666+3K1euLHJeRkaGHT16tO3du7dt0qSJDQwMtJGRkbZnz552+vTpJU5jnzRpkm3Xrp0NDAy0jRs3tvfdd98pP7vCKesvvPDCaT/HsnzPRay11lj7u/Z8ERGp1qZMmcLdd9/N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St26dc943aSkJGrVqlVisJEyKGmBwpMGMWschYiIVAdl7t7q378/EydOJDY2lri4OObNm0dubi69evUCYMKECYSHhzNkyBDANfg5OTnZ/XV6ejpJSUkEBwe7+98nT57M0qVLGTFiBCEhIe6WpNDQUAIDA933TklJYdOmTTz77LPF6lq1ahVZWVm0bt2awMBA1q1bx+zZs7n22mvL+hbld0qatm4LV2MO1/gnERGpHsocerp37052djYzZ84kMzOTFi1a8Nxzz7m7t9LS0or8zz89PZ0RI0a4HyckJJCQkEC7du0YNWoUAAsXLgRwPy704IMPusMUuFp5wsPD6dixY/E34u/PggULmDp1KtZaIiMjufPOO+nTp09Z36L83vGWHlJTsE6na0+udK3RIyIi1Yux6gAvJjU1VQOZT2ILCnA+dBMU5ON4dTKmQUOc0yZgv1uIuW4Ijmtv8XSJ4uOMMURFRbFv3z6N6RHxQQEBATRseOb/hGvvLTkj4+cHhevzHN+O4kT3llp6RESkelDokdL5/WBmd/eWxvSIiEj1oNAjpWIKx/XsP9594N5s9NQz7URERLyJQo+UzsktPYey4dgx1/H6aukREZHqQaFHSsU0Or7xaOq+E6089epjtAaSiIhUEwo9UjondW+RpkHMIiJS/Sj0SOk0aAR+fpB3DLtjM6A1ekREpHpR6JFSMX5+0MA1bd1uXuc62EChR0REqg+FHim9wi6u3Ttdv6ulR0REqhGFHik197T14yveGrX0iIhINaLQI6VXOIOrkFp6RESkGlHokVJzt/QUUugREZFqRKFHSu/k0BMUDLXqeK4WERGRMlLokdJr0Agcx//IhDfEGOPZekRERMpAoUdKzfj7n9hrSxuNiohINaPQI2VzvIvLaKNRERGpZhR6pExMTJzri6Yxni1ERESkjPw9XYBUL+aawZg27SG+vadLERERKROFHikTExQE7bp4ugwREZEyU/eWiIiI+ASFHhEREfEJCj0iIiLiExR6RERExCco9IiIiIhPUOgRERERn6DQIyIiIj5BoUdERER8gkKPiIiI+ASFHhEREfEJCj0iIiLiExR6RERExCco9IiIiIhP0C7rJfD318ciUh3pZ1fEN5X2Z99Ya20l11Jt5OXlERAQ4OkyREREpBzO9O+4urdOkpeXx9tvv82RI0fO+lpvvPFGBVRUsdfytutU5LVqck16b2d25MgRnn76af3sVtF1KvJa3nadiryWt12nIq/lbTUdOXKEt99+m7y8vNOep9DzO99//z0V0fiVnJxcAdVU7LW87ToVea2aXJPe25lZa9m5c6d+dqvoOhV5LW+7TkVey9uuU5HX8raarLV8//33ZzxPoaeSXHnllV53LW+7TkVeqybXpPdWtfR5V+21vO06FXktb7tORV7LG2sqDY3pOUlOTg533XUXU6ZMITQ01NPliEgp6WdXxLeV9u8AtfScJCAggEGDBmkws0g1o59dEd9W2r8D1NIjIiIiPkEtPSIiIuITFHpERETEJ2j5UinR7NmzWblyJXv27CEwMJD4+Hhuv/12mjRp4j7n2LFjTJs2jWXLlpGXl0enTp249957CQsL81zh1dSZPu/9+/fz8MMPl/jaxx57jG7dulVluTXC/PnzSUhIIDMzk5iYGIYNG0ZcXFyRc6y1vPLKK6xZs4Ynn3ySCy64wEPVVm8bN27k888/Z+fOnWRkZBT7LH/44Qe+/PJLduzYwaFDhxg3bhwtWrTwXMHV3Jk+76NHj/Lhhx/y448/cvDgQRo1asTVV1/NFVdc4cGqq4ZaeqREGzdu5Morr2TMmDE8//zzFBQU8PLLL3P06FH3OVOnTuWnn37i8ccfZ/To0WRkZFToglW+5Eyfd0REBP/617+K/Bo8eDDBwcF06dLFw9VXP8uWLWPatGkMGjSIsWPHEhMTw5gxY8jKyipy3ty5czHGeKjKmiM3N5cWLVpwzz33nPL5c845h9tuu62KK6uZzvR5T506lTVr1vDII4/w1ltv0a9fP95//31WrVpVxZVWPYUeKdHIkSPp1asXzZo1o0WLFjz00EOkpaWxY8cOwDU9cNGiRQwdOpT27dsTGxvLgw8+yJYtW9i6dauHq69+zvR5OxwOwsLCivxauXIl3bp1Izg42MPVVz9z5syhT58+9O7dm+joaIYPH05gYCCLFy92n5OUlMScOXP4v//7Pw9WWjN06dKFW2655ZQtZZdeeimDBg2iQ4cOVVxZzXSmz3vr1q307NmTP/zhDzRq1Ii+ffsSExPD9u3bq7jSqqfQI6WSk5MDQO3atQHYsWMHBQUFRf6Satq0KREREQo9FeD3n/fv7dixg6SkJC677LKqLKtGyM/PZ8eOHUX+7DocDjp06OD+s5ubm8vbb7/NPffco+5aqXHi4+P56aefSE9Px1pLYmIi+/bto2PHjp4urdJpTI+ckdPpZMqUKbRp04bmzZsDkJmZib+/P7Vq1Spybr169cjMzPRAlTVHSZ/37y1atIimTZvSpk2bKq6u+svOzsbpdBYLM2FhYezduxdwNf+3adOG888/3wMVilSuYcOG8e677/LAAw/g5+eHMYb777+fdu3aebq0SqfQI2c0efJkdu/ezYsvvujpUnzCmT7vY8eOsXTpUm688cYqrsw3rFq1isTERMaNG+fpUkQqxRdffMG2bdsYMWIEDRs2ZNOmTUyePJn69evX+NYehR45rcmTJ7N69WpGjx5NgwYN3MfDwsLIz8/n8OHDRVp7srKy1B1wFk71eZ9sxYoV5Obm0rNnzyqurmaoW7cuDoejWItkZmYmYWFhJCYm8ttvv3HXXXcVef6NN96gbdu2jBo1qspqFalox44d46OPPuKpp57i3HPPBSAmJoakpCQSEhIUesQ3WWt5//33WblyJaNGjaJRo0ZFno+NjcXPz4/169dz0UUXAbB3717S0tKIj4/3RMnV2pk+75MtWrSIrl27Urdu3SqssObw9/cnNjaWxMRE90BPp9NJYmIiV111Fb169So2VurJJ59k6NChdO3a1RMli1SY/Px8CgoKis1KdDgc+MIGDQo9UqLJkyezdOlSRowYQUhIiPt/xaGhoQQGBhIaGspll13GtGnTqF27NqGhobz//vvEx8cr9JTDmT7vQikpKWzatIlnn33WQ5XWDP3792fixInExsYSFxfHvHnzyM3NpVevXu7Zcb8XERFx2jAqp3b06FFSUlLcj/fv309SUhK1a9cmIiKCQ4cOkZaWRnp6OoB7bNWpvhdyemf6vNu1a8d//vMfAgMDadiwIRs3buSbb75h6NChHqy6amjvLSnR4MGDSzz+4IMP0qtXL+DE4oTff/89+fn5WpzwLJTm8waYPn063333HRMnTsTh0OTLszF//nw+//xzMjMzadGiBXfffTetW7cu8dzBgwdrccKzsGHDBkaPHl3seM+ePXnooYdYsmQJ77zzTrHnBw0adMqfDTm1M33emZmZTJ8+nbVr13Lo0CEaNmxI37596devX41fl0qhR0RERHyC/qsoIiIiPkGhR0RERHyCQo+IiIj4BIUeERER8QkKPSIiIuITFHpERETEJyj0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Fv369SvX60WkelLoEZFKNXjwYBo1akRBQQGZmZls3LiRqVOnMnfuXEaMGEFMTEyZrrdlyxZmzZpFr169zir07N69u1joadiwIf/5z3/w99dfjSI1kX6yRaRSdenShVatWrkfDxw4kMTERF599VXGjRvHW2+9RWBgoAcrPMEY4zW1iEjFU+gRkSrXvn17brzxRj766CO+/fZb+vbty6+//sqcOXPYtGkTGRkZhIaG0qVLF+644w7q1KkDFN1J/eGHH3Zfb8KECTRq1AiAb7/9lrlz55KcnExgYCCdOnXi9ttvJyIiAoBRo0axceNG4MTu7oU7se/fv5+HH364yO7uEydOZMWKFbz11ltMmjSJDRs2EBoaysCBA7nqqqvYtWsXH3zwAdu3b6dOnToMGTKEiy++uMj7PXz4MB9//DE//PADWVlZNGjQgD59+nDddddpd3eRKqTQIyIecemll/LRRx+xbt06+vbty7p169i/fz+9evUiLCyM5ORkvvrqK5KTkxkzZgzGGC688EL27dvH999/z9ChQ91hqG7dugB8+umnzJgxg27dutGnTx+ys7P54osveOGFFxg3bhy1atXihhtuICcnhwMHDjB06FAAgoODT1ur0+nkr3/9K23btuX2229n6dKlvP/++wQHB/PRRx9xySWXcOGFF/Lll18yYcIE4uPj3SEsNzeXUaNGkZ6eTt++fYmIiGDLli189NFHZGZmctddd1XehywiRSj0iIhHNGjQgNDQUH777TcArrzySq699toi57Ru3Zq3336bzZs307ZtW2JiYmjZsiXff/89559/vjtYAKSmpjJz5kxuvvlmbrjhBvfxCy64gKeffpoFCxZwww030LFjR8LDwzl8+DCXXnppqWrNy8vjkksuYeDAgQBcfPHF3H///fzjH//g0UcfpXv37gB07NiRP/3pTyxZssTdijRnzhxSUlIYN24cUVFRAFx++eWEh4fz+eef079/f3crlIhULrWriojHBAcHc+TIEYAiY2mOHTtGdnY2rVu3BmDnzp1nvNYPP/yAtZbu3buTnZ3t/hUWFkZkZCQbNmw4q1r79Onj/rpWrVo0adKEoKAgunXr5j7epEkTatWqxf79+93HVqxYQdu2balVq1aRujp06IDT6WTTpk1nVZeIlJ5aekTEY44ePUq9evUAOHToEB9//DHLli0jKyuryHk5OTlnvFZKSgrWWv74xz+W+PzZzMgKCAhwd6EVCg0NpUGDBhhjih0/dOiQ+/G+ffv49ddfuffee0u89u/fq4hUHoUeEfGIAwcOkJOTQ+PGjQF466232LJlC9dddx0tWrQgODjYPZbG6XSe8XpOpxNjDM8++2yJg4PPNG7ndE412Lg0g5CttXTs2JHrrruuxOebNGlS7rpEpGwUekTEI7799lsAOnfuzKFDh1i/fj2DBw9m0KBB7nP27dtX7HW/b1kpFBkZibWWRo0aeVWQaNy4MUePHqVjx46eLkXE52lMj4hUucTERD755BMaNWrExRdf7G4xsdYWOW/u3LnFXhsUFAQU7/K64IILcDgczJo1q9h1rLUcPHjQ/Tg4OLhUXWYVoVu3bmzdupU1a9YUe+7w4cMUFBRUSR0iopYeEalkP//8M3v27MHpdJKZmcmGDRtYt24dERERjBgxgsDAQAIDA2nbti2ff/45BQUFhIeHs3bt2iIDggvFxsYC8NFHH9GjRw/8/Pw477zziIyM5JZbbmH69OmkpqZy/vnnExwczP79+/nxxx/d6+IUXmPZsmVMnTqVVq1aERwcTNeuXSvl/V933XWsWrWKsWPH0rNnT2JjY8nNzWXXrl2sWLGCiRMnFhsvJCKVQ6FHRCrVzJkzAddA4sK9t4YOHVps761HH32U999/nwULFrjHwTz33HPcf//9Ra4XFxfHzTffzJdffsmaNWuw1jJhwgSCg4MZMGAAUVFRzJ07l48//hiAiIgIOnbsWCTUXHHFFSQlJbFkyRLmzp1Lw4YNKy30BAUFMXr0aD799FNWrFjBt99+S0hICE2aNGHw4MGEhoZWyn1FpDhjf98OLCIiIlIDaUyPiIiI+ASFHhEREfEJCj0iIiLiExR6RERExCco9IiIiIhPUOgRERERn6DQIyIiIj5BoUdERER8gkKPiIiI+ASFHhEREfEJCj0iIiLiExR6RERExCf8P1bKoWnyzNCDAAAAAElFTkSuQmCC", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAj0AAAH8CAYAAAA6zR6NAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAACCrUlEQVR4nO3deVyVZf7/8dd92FEBERWXAFExHdfSGpdS06bNZrJMyxYby5ppr3GsyWZGK1tsmeaXNt9KK53JyiybyDJr1MrMrCwNNZcAdxKEAyqCwH39/jieowQoy4ED57yfj4cPubfrvu5z4PDhuj7XdVnGGIOIiIiIn3P4ugIiIiIiDUFBj4iIiAQEBT0iIiISEBT0iIiISEBQ0CMiIiIBQUGPiIiIBAQFPSIiIhIQFPSIiIhIQFDQIyIiIgFBQY+Ij61cuRLLspg2bVq5/cOGDcOyLN9UqhHVoSqZmZlYlsUNN9zg66qISBOhoEekFizLOuW/lStXev2+VQVIjYU7SHL/Cw4OpmXLlpx++umMHTuWV155hUOHDtVrHW644QYsyyIzM7Ne7wOQlJR0yu+DV199td7rISLVE+zrCog0ZX//+9+rPJaUlFSnsufPn09hYWGdyvCVCRMmkJSUhDGGgwcPkp6ezieffMJbb73FAw88wNy5c7n44ot9XU2vueuuu4iJian0WN++fRu0LiJSNQU9InVQny0uCQkJ9VZ2fbvhhhsYNmxYuX1FRUU8/fTT/O1vf2P06NF8/PHHnHvuub6poJfdfffddQ5yRaT+qXtLpIH8/PPP3HjjjbRt25aIiAj69u3LvHnzqjz/l/k0N9xwA8OHDwdg+vTpJ+1Ke/311xk+fDgxMTGEh4fTvXt3HnnkEYqLiyu91xtvvMGZZ55JREQEbdq04brrrmPv3r11f+gThIeHM3XqVB588EGOHj3KXXfdVeGc0tJSnn/+eX79618TFRVFZGQk/fr1Y9asWdi2fcp7WJbleU07derkeX1ODEi+/fZb7rrrLvr06UNsbCzh4eF07dqVP/3pT+Tl5XnteX8pLy+PpKQkwsLC+Pbbb8sds22b4cOHY1kW//73vz37p02b5nl/582bR79+/Tzv0cSJE8nKyqr0Xtu2beP666+nQ4cOhIaG0r59e66//nq2bdtW4dyDBw/y8MMP07NnT6KiomjRogWdO3dm3Lhx5ep5qq7VpKSkCoHfq6++6uniW7p0KcOGDSM6Orrc93Vd33ORmlBLj0gDyMnJYdCgQaSnpzNkyBCGDBnCvn37+MMf/sBvfvObapVx2WWXATBv3jyGDh1ariXlxF82EydO5JVXXqFjx45cccUVxMTEsGbNGv7617/yv//9j48//pjg4OM/+v/4xz+49957iYmJ4frrrycmJoaPPvqIQYMGER0d7Y3HL2fy5Mk8+eSTfP/992zcuJFf/epXAJSUlHDppZfy0Ucf0a1bN8aPH094eDgrVqzgjjvu4KuvvioXEFTm73//O++++y7r168v1+V0YtfTSy+9xOLFixk6dCgjR47Etm2+/fZbnnnmGT788EO++uorWrRo4fXnbtmyJa+//jrnnnsu48aN47vvvvPcZ/r06axcuZIbbriB6667rsK1//jHP1i2bBnjxo3jwgsvZNWqVbzyyiusXLmSr776itatW3vO/frrrxk5ciQHDx7kt7/9LT169ODHH3/kP//5D//973/55JNPGDBgAADGGC688EJWr17NwIEDuemmmwgODmb37t2sWLGCc845hzPPPLPOz75o0SKWLl3KRRddxB/+8Ad27NgBeOc9F6kRIyI1BhjA/P3vf6/032OPPVbu/EmTJhnA3H333eX2f/311yY4ONhT1omGDh1qfvkjumLFikrPdXvllVcMYEaPHm0KCwvLHfv73/9uAPPss8969mVkZJiQkBDTsmVLk5GR4dlfVlZmLr/8cs9zVpe7zitWrDjpeUOGDDGAefnllyvU7/bbbzelpaWe/aWlpWbixIkGMO+++265ugNmwoQJ5cqeMGGCAco9z4kyMzPLle82Z84cA5jHH3/81A96TGJiogHMXXfdVeX3wpEjR8pd88QTTxjAXHXVVcYYY5YvX24cDofp3r27OXz4cLlz3a9JSEiIWbduXbljd999twHMxIkTPfts2zann366Acx//vOfcue/8cYbBjDdunUzZWVlxhhjNmzYYABz2WWXVXi2srIyk5ub69k+1fdeYmKiSUxMLLfP/f1oWZb58MMPK1xT0/dcpK4U9IjUgjsYqOpfdHS059yjR4+ayMhI06JFC+N0OiuU5f4l7Y2gp2/fviY4ONjk5eVVOFZaWmpatWplBgwY4Nn3yCOPGMD87W9/q3D+Tz/9ZBwOR70EPePGjTOAeeKJJ4wxrl+wsbGxJj4+3pSUlFQ4Py8vz1iWZa688krPvtoGPVWxbdtERUWZ4cOHV/sad9Bzsn+/fC9s2zYXXnihAcyjjz5q2rVrZyIiIsyGDRsqlO8OCk4MbNycTqeJjo424eHhpqioyBhjzKpVqwxgBg4cWGl93cHmp59+aow5HvRcffXVp3zWugQ9VQVVNX3PRepK3VsidWCMOeU5P/74I4WFhZxzzjmVdhcNGzbspLk91VVYWMj69euJi4vj2WefrfScsLAwNm/e7Nlet24dAEOHDq1wbnJyMqeddpqnK8Kb3K+bO7dj69at5Obm0rVrVx555JFKr4mIiChX99oqKSnhhRde4I033mDTpk3k5+eXyx3Zs2dPjcvMyMiodiKzZVnMnz+fvn378sADDwDwwgsv0KtXryqvqez9iY6Opm/fvnz66ads3ryZvn37et7P8847r9JyzjvvPFatWsV3333HueeeS48ePejbty+vv/46O3bs4He/+x1Dhgyhf//+hIaGVut5quOss86qsK8h33MRNwU9IvUsPz8fgLZt21Z6PD4+3iv3ycvLwxhDdnY206dP91rd6iPocSdJu3NRDhw4ALgScE9Wd2/M8TNu3DgWL15McnIyv/vd74iPjycsLAyAZ599tspkb29q3bo15557Lm+88QatWrWqNI/nRKf63nG/j+7/27VrV+n57v1OpxOAoKAgli9fzkMPPcSiRYu47777AGjRogUTJkzgscceo3nz5jV7uJPU80QN+Z6LuGn0lkg9c7fu/Pzzz5Uer2oETm3v069fP4yr67rKfw1dtxMdPHjQMyro7LPPLleP0aNHn7TeGRkZdbr3N998w+LFixk5ciRbtmzhlVde4bHHHmPatGn87W9/4+jRo3V7uGp64403eOONN4iLi+PAgQPceeedJz3/VO+P+/Vz/1/V+7Zv375y54Erwfof//gHu3btYtu2bcyZM4fTTz+dWbNm8cc//tFznsPh+nVRWlpaadnuQKoylc3q3VDvuciJFPSI1LPTTz+dyMhIvv/+e89f4ieqyczNQUFBAJSVlVU41rx5c371q1+xceNGcnNzq1XeGWecAcCnn35a4Vh6ejq7du2qdt2q68knn+TIkSOcccYZdO/eHXC9Ru5RZiUlJXUq/2Sv0fbt2wH47W9/W24EG8DatWs5cuRIne5dHdu3b+fmm2+mdevWnm6mOXPm8MYbb1R5TWXvT35+Pt9//71nSgJwBbxQ9ffUihUrgOPv+y916dKFG2+8kU8//ZTmzZvz3//+13OsZcuWAJV+T2zfvr3S7+2T8eZ7LlJdCnpE6llISAjXXHMNBw8erDDHyTfffMNrr71W7bJatWoFwM6dOys9fu+993L06FEmTpxY6V/eeXl5nrwPgGuuuYaQkBCee+65css22LbNn//8Z6/Ok1JUVMSjjz7KjBkzCA0N5Z///KfnWHBwMHfccQf79u3jzjvvrDT42LdvH5s2bTrlfU72Grnzbn4ZFOzfv5/bbrutBk9TO0ePHuWqq67i0KFDzJs3j44dO7JgwQJatWrFLbfcwk8//VTpdf/+97/57rvvyu2bNm0a+fn5XH311Z7uucGDB9OtWzdWrVrFokWLyp2/aNEiPv/8c1JSUhgyZAjgykVKT0+vcL+8vDyKi4uJiIjw7Dv99NOJioriv//9L/v37/fsP3LkyClbqirjzfdcpLqU0yNSByebkfmyyy7zLEHw6KOP8r///Y9nn32Wb775xjNPz5tvvsnFF1/Me++9V637devWjQ4dOvDGG28QEhJCYmIilmVx3XXXkZiYyMSJE/n22295/vnn6dy5MxdccAEJCQnk5uaSkZHBZ599xu9//3v+7//+D3AFAY8//jh/+tOf6NevH+PGjSM6OpqPPvoIp9NJ79692bBhQ41fl1dffdUTWLiXofjss8/Izc2lXbt2vPzyy55fvG5//etfWb9+Pf/3f/9Hamoq5513Hh06dGD//v1s27aNL774ghkzZtCjR4+T3nvEiBE8+eSTTJo0iSuuuIIWLVoQExPD7bffzoABAxg8eDDvvPMOgwYNYsiQIfz88898+OGHdOvWjfbt29f4WcGVC1TVMhTDhg3zzKk0ZcoUvv32W+69914uuugiADp06MCrr77KpZdeyrhx41i9enWFJOKLLrqIwYMHM3bsWNq1a8eqVatYtWqV5/1zc0/OeP755zNu3Dh+97vfcfrpp7NlyxbeffddWrRowfz58z1dVevXr+fyyy9nwIABdO/enfbt25Odnc1///tfSkpKPDk+4Are77rrLh5++GH69evH6NGjKS0t5eOPP6Z9+/a1eu289Z6LVFuDjRMT8SOcYpgyYF555ZVy1+zbt8/8/ve/N3FxcSY8PNz06dPHvPLK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AS2iGq5iIiIiDURBT6BoeYoJCt1dW1ExWI6ghqmTiIhIA1LQEyhi3etvVZHT4xmuHtMw9REREWlgCnoChHWKpSiOD1dXPo+IiPgnBT2Bwt29lXcAY9sVjx8LejRcXURE/JWCnkARE+tKUi4rhQJnxeMari4iIn5OQU+AsIKCoOWxrqtKuriMlqAQERE/p6AnkMSeJK9H3VsiIuLnFPQEEPdq65WO4FL3loiI+DkFPYGkipYeY4yCHhER8XsKegJJVUtRFB6G0hLX1wp6RETETynoCSDu7q0Ki466k5gjm2OFhDZspURERBqIgp5AUlUis7q2REQkAATX5qKlS5eSmpqK0+kkMTGRiRMn0qVLl0rP3bVrF2+++SYZGRlkZ2czYcIELrnkknLnLF68mLVr17Jnzx5CQ0NJSUnh2muvpX379gDs37+f22+/vdLy77nnHgYOHAjA2LFjKxy/6667GDx4cG0e0/+4Z2U+mI85WowVGgacOFxdQY+IiPivGgc9q1evZv78+UyaNImuXbuyZMkSZsyYwbPPPkt0dHSF84uLi2nbti0DBw5k3rx5lZa5adMmLrjgAjp37kxZWRmvv/46jzzyCM888wzh4eHExcXx4osvlrvmk08+4b333qNfv37l9t9666307dvXsx0ZGVnTR/Rfkc0hLByKiyDvALR1BZXkOwENVxcREf9W4+6t999/nxEjRjB8+HA6duzIpEmTCA0NZcWKFZWe36VLF6677joGDx5MSEhIpedMnTqVYcOGcdppp5GUlMRtt91GTk4O6enprko6HMTExJT7t3btWgYOHEh4eHi5siIjI8udFxqqHBU3y7LAk9dzQheXJiYUEZEAUKOWntLSUtLT07nssss8+xwOB7169WLr1q1eq1RhYSEAzZs3r/R4eno6mZmZ3HjjjRWOzZ07lxdeeIE2bdpw/vnnM3z4cNcv+0qUlJRQUlLi2bYsi4iICCzLqvKaps5q1RqTtRvyco4/o3tiwphYv31uqRn394G+H0SkKajuZ1WNgp6CggJs2yYmJqbc/piYGPbu3VuToqpk2zavvvoq3bp1IyEhodJzli9fTocOHejWrVu5/WPHjqVnz56EhYWxfv165s6dS1FRERdffHGl5SxevJhFixZ5tjt16sQTTzxBXFycV56lMcrtmMjhjd/R/GgR0e3aAbD/yGGKgZjETjQ7tk8EID4+3tdVEBHxmlolMtenuXPnsmvXLh566KFKjx89epRVq1ZxxRVXVDg2ZswYz9edOnWiuLiY1NTUKoOe0aNHM2rUKM+2O1LMyckp1wLkT+xwV47TwR3pFO7bB0BpdhYATmNRcGyfBDbLsoiPjycrK8s1eaWISCMWEhJSrQaLGgU9UVFROBwOnE5nuf1Op7NC609tzJ07l3Xr1jF9+nRatWpV6Tlr1qyhuLiYoUOHnrK8rl278vbbb1NSUlJpPlFISEil+40xfvtBb1q6JyjMOf6MxxKZiWrpt88ttePPPwsi4j+q+zlVo0Tm4OBgkpOTSUtL8+yzbZu0tDRSUlJqVsMTGGOYO3cua9eu5W9/+xtt2rSp8tzly5fTv39/oqKiTlluZmYmzZo1qzKBOhBZseUTmc3RYjhy2LVPo7dERMSP1bh7a9SoUcyePZvk5GS6dOnCBx98QHFxMcOGDQNg1qxZxMbGMn78eMCV/Lx7927P17m5uWRmZhIeHu7JF5g7dy6rVq1iypQpREREeFqSIiMjy42+ysrKYvPmzfzlL3+pUK9vvvmG/Px8unbtSmhoKBs2bGDx4sVceumlNX1E/9bq+ASF5dbcCg2FCA3vFxER/1XjoGfQoEEUFBSwcOFCnE4nSUlJPPDAA57urZycnHJZ1Lm5uUyZMsWznZqaSmpqKj169GDatGkALFu2DMCz7Xbrrbd6gilwtfLExsbSu3fvig8SHMxHH33EvHnzMMYQHx/P9ddfz4gRI2r6iP7NPWT9aDEUHio3XF0jdURExJ9ZRh32FWRnZ/ttIjNA2b3XwcF8HH99FrL3Yf/fE9D5dILun+nrqkkjYVkW7dq1Y9++fcrpEZFGLyQkhNatW5/yPK29FYhOWIPLeNbd0sSEIiLi3xT0BKJjycwmN/v4xIRKYhYRET/X6ObpkfpnxbbGAOTmwKF8104FPSIi4ucU9ASiE7u33MPVY9S9JSIi/k1BTwCyWrlaekxuNhQXu/ZFqaVHRET8m4KeQOQetp6XA6Wlrq/VvSUiIn5OQU8gcndv5eUCx4YjxyjoERER/6bRW4EoKgaCgsHYYAw4HNA82te1EhERqVcKegKQ5XBAyxMWdI2Kce0TERHxY/pNF6hiT5i5UknMIiISABT0BCjrxKBHScwiIhIAFPQEqhOCHktz9IiISABQ0BOoji1FAailR0REAoKCngCl7i0REQk0CnoC1YndW0pkFhGRAKCgJ1Cpe0tERAKMgp4AZUVEQqs2rkkK27TzdXVERETqnZahCGCOPz0ChYexWmg2ZhER8X8KegKY1Tre11UQERFpMOreEhERkYCgoEdEREQCgoIeERERCQgKekRERCQgKOgRERGRgKCgR0RERAKCgh4REREJCAp6REREJCAo6BEREZGAoKBHREREAoKCHhEREQkICnpEREQkICjoERERkYCgVdYrERysl0UE9LMgIk1DdT+rLGOMqee6NBklJSWEhIT4uhoiIiJSC6f6Pa7urROUlJTwz3/+kyNHjtTq+qeffrrW99a1urYxXXvkyBHuu+8+/Sw0gXvrWl2ra12fWf/85z8pKSk56XkKen7hiy++oLaNX7t37671fXWtrm1M1xpjyMjI0M9CE7i3rtW1utb1mfXFF1+c8jwFPV50wQUX6Fpd6zfX1kVTfN66vlZNsd66Vtf607XVoZyeExQWFnLDDTfw6quvEhkZ6evqiPiMfhZEpCmp7meWWnpOEBISwpgxY5TMLAFPPwsi0pRU9zNLLT0iIiISENTSIyIiIgFBQY+IiIgEBE236ucWL17M2rVr2bNnD6GhoaSkpHDttdfSvn17zzlHjx5l/vz5rF69mpKSEvr06cNNN91ETEyM7yruA6d6rfbv38/tt99e6bX33HMPAwcObMjqNhpLly4lNTUVp9NJYmIiEydOpEuXLuXOMcbw2GOP8f333zN58mTOOussH9XWNzZt2sR7771HRkYGeXl5FV6Dr776io8//pj09HQOHTrEzJkzSUpK8l2FfehUr1VRURGvvfYaX3/9NQcPHqRNmzZcdNFF/OY3v/FhrX2jOp/v06ZNY9OmTeWuGzlyJDfffHNDV7dRUNDj5zZt2sQFF1xA586dKSsr4/XXX+eRRx7hmWeeITw8HIB58+axbt067r33XiIjI5k7dy5PP/00Dz/8sI9r37BO9VrFxcXx4osvlrvmk08+4b333qNfv34+qrVvrV69mvnz5zNp0iS6du3KkiVLmDFjBs8++yzR0dGe85YsWYJlWT6sqW8VFxeTlJTEeeedx1NPPVXp8dNPP52BAwfywgsv+KCGjcepXqt58+aRlpbGHXfcQevWrdmwYQNz5swhNjaW/v37+6DGvlOdz3eAESNGMG7cOM92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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiMAAAH8CAYAAAADqq/WAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA/R0lEQVR4nO3deVxWdf7//+e58EJAA0RAREXRxLRybzE1cK+0EjUza9LMmRZNyzGn5dsnNWfK9iZ1Wtw/irmkjMu0WGqJueaUO+YHyQ0URsHcELjO749+XtMVIFy4vFke99vN261zzvt9zus6cR2evM9m2bZtCwAAwBCH6QIAAEDlRhgBAABGEUYAAIBRhBEAAGAUYQQAABhFGAEAAEYRRgAAgFGEEQAAYBRhBAAAGEUYAcqwNWvWyLIsjR071mN+XFycLMsyU1QZqqGsmzlzpizL0syZM02XApRphBHgMrMsq9h/a9asuezbLSq4lDWHDx/WmDFj1KJFCwUGBsrf31+NGjXSkCFD9O9//9t0eV4p7T5v0KCBGjRocEVqAsqjKqYLACqql19+uchll/qLaPbs2Tpz5swlrcOERYsWadCgQTpz5oxuuukmPfroo/L19dXOnTs1Z84czZw5U//zP/9T5gNVScXHx+vWW29V7dq1TZcClGmEEeAKuZK/UKOioq7Yuq+UVatWacCAAXI6nVq4cKH69evnsXznzp3q1auXxo0bp8DAQI0aNcpQpZdPUFCQgoKCTJcBlHmcpgHKgKNHj+rRRx9VrVq15O/vr5YtW2rWrFlFtv/99RqDBw9Wp06dJEnjxo276CmhefPmqVOnTgoODpafn5+aNm2qCRMmKCcnp9BtffLJJ2rTpo38/f0VHh6uP/zhDzpy5IhXn8/lcumJJ55Qfn6+3n333QJBRJKuv/56LV26VE6nUy+88ILS09Pdy4o7HVLYaY/s7Gy98cYb6ty5s+rWrStfX1+FhYXpnnvu0fr16wtdj2VZiouLU2Zmpv70pz+pdu3aqlq1qq6//nrNmDHDo21J9vnvrxm58Dl+/vln/fzzzx59Bg8erBMnTiggIECNGjVSUS9Uv/vuu2VZlrZs2VLocqA8YmQEMCwzM1O33XabUlJS1KFDB3Xo0EFpaWl6/PHH1b179xKto3fv3pKkWbNmKTY2VnFxce5lv/0lPWTIEM2YMUN169ZV3759FRwcrA0bNuill17S119/rZUrV6pKlf8eFt555x2NGjVKwcHBevjhhxUcHKwvvvhCt912m1d/8X/zzTfau3evIiMjNXTo0CLb3Xjjjerdu7cWLlyomTNn6rnnnivxNn5v9+7devHFF3X77berZ8+eqlGjhg4cOKClS5fqs88+07Jly3THHXcU6JeVlaX27dvL19dX/fr1U05OjhYuXKghQ4bI4XBo0KBBkkq+z3+rQYMGevnll/Xuu+9Kkp5++mn3spYtW6pGjRoaMGCAZsyYoa+++krdunXz6H/w4EF99tlnatOmjdq2bVvqfQOUOTaAy0qSLcl++eWXC/336quverT/4x//aEuyn376aY/5mzdvtqtUqeJe12/Fxsbav//6rl69utC2F8yYMcOWZMfHx9tnzpzxWPbyyy/bkux3333XPW///v220+m0a9SoYe/fv989Pz8/3+7Tp4/7c5bE+PHjbUn2wIEDi2370Ucf2ZLsO++8s8SfrX79+nb9+vU95mVlZdkZGRkF2h48eNCuXbu2fd111xVYduEzPfroo3ZeXp57/s6dO20fHx+7adOmHu1Lus9nzJhRbL0XbN682ZZk9+3bt8CyC/+fPvroo0L7AuUVIyPAFTJu3LhC5wcFBbn/4s/NzdXcuXN1zTXXFDgF0bZtWz344IMXPV3jjffee09VqlTR9OnT5e/v77HspZde0qRJkzR37lyNHDlSkjR37lzl5ubqqaee8vhL3+Fw6I033lBiYqJcLleJtp2WliZJqlevXrFtL7Q5dOhQidZdlKJGburWrat+/frp/fff14EDBwpcfxMQEKC3335bPj4+7nnNmjVT+/bt9e233+rUqVOqXr36JdV2MW3btlXbtm31z3/+U+np6YqIiJAk5efna9q0abrmmmv0wAMPXLHtAyYQRoArxC7inP9v7dmzR2fOnFHHjh0L/eUZFxd3WcLImTNn9OOPPyo0NNR9iuD3qlatqt27d7unt27dKkmKjY0t0LZhw4aqV6+efv7550uurSjnzp275HWsW7dO7733ntavX69jx47p/PnzHssPHz5cIIw0btxYgYGBBdZ1ISSdOHHiioYRSXryySc1ZMgQTZ8+XS+88IIk6V//+pcOHTqkJ5544opvH7jaCCOAQdnZ2ZKkWrVqFbr8wl/Fl+rEiROybVsZGRlFjtiUpraS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VgBlntPpVFhYWLHteDcNAAAwijACAACMIowAAACjCCMAAMAowggAADCKMAIAAIwijAAAAKMIIwAAwKhy9YIY3mcD/IrvAoDyoKTHqnLxBNbc3Fw5nU7TZQAAgFIo7vd4uThNk5ubq/fee09nz54tVf+33nqr1NumL33LUt+zZ8/qL3/5C98F+pa5bdOXvoU5e/as3nvvvWJf5VIuwogkrVu3rtTv4jh06FCpt0tf+palvrZta//+/XwX6Fvmtk1f+hbGtm2tW7eu2HblJoxcih49etCXvhWm76Uoj5+XvuVj2/Sl76UoF9eMnDlzRoMHD9bMmTMVEBBguhzAGL4LAMqTkh6zysXIiNPpVL9+/biIFZUe3wUA5UlJj1nlYmQEAABUXOViZAQAAFRchBEAAGAUj3E0ZMmSJdq0aZMOHz4sX19fxcTE6KGHHlJkZKS7zfnz5zV79mx99913ys3NVYsWLTR06FAFBwebK9yA4vbVsWPHNHz48EL7PvPMM2rXrt3VLLdM+Pzzz7Vs2TJlZWWpfv36GjJkiK699lqPNrZt69VXX9UPP/yg0aNH6+abbzZUrTm7du3S0qVLtX//fp04caLAfti4caNWrlyplJQUnTp1Sq+//roaNGhgrmCDittX586d09y5c7V582b98ssvCg8P15133qnu3bsbrNqMkhzfx44dq127dnn069q1q/70pz9d7XLLBMKIIbt27VKPHj3UqFEj5efna968eZowYYLefvtt+fn5SZJmzZqlrVu3atSoUQoICNC0adP01ltv6ZVXXjFc/dVV3L4KDQ3VRx995NHnq6++0tKlS9WqVStDVZvz3Xffafbs2frjH/+oxo0ba8WKFfrrX/+qd999V0FBQe52K1askGVZBis1LycnRw0aNFDnzp315ptvFrr8uuuuU7t27fThhx8aqLDsKG5fzZo1Szt27NBTTz2lsLAwbdu2TVOnTlVISIjatm1roGJzSnJ8l6QuXbro/vvvd0/7+vqaKLdMIIwY8uKLL3pMDxs2TEOHDlVKSoqaNWumM2fOaNWqVRo5cqRuuOEGSdKTTz6pZ555Rnv37lVMTIyJso0obl85HI4Co0WbNm1Su3btPL74lcXy5cvVpUsXderUSZL0xz/+UVu3btXq1avVu3dvSVJqaqqWL1+u1157rdL+JSZJrVq1umhgvf322yX9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YmLcYeTAgQMaP368WrRooV69ernX4XA4FBgYKEn6/PPPFRoaqjp16kiSdu/erWXLlunOO++86p8ZAC6GW3uBq6x///6Fzn/yyScVFxcn6b8PPVu3bp3y8vIKPPRswYIFWrRoUYF1hIWFafLkyZKkzz77TF999ZWOHTsmh8OhiIgIdenSRV27dpXDwaAogLKDMAIAAIzizyMAAGAUYQQAABhFGAEAAEYRRgAAgFGEEQAAYBRhBAAAGEUYAQAARhFGAACAUYQRAGXesWPH1L9/f61Zs8Z0KQCuAN5NA1Qya9as0ZQpU9zTTqdT1atXV1RUlFq1aqVOnTrJ39/f6/UmJyfrxx9/VM+ePT3eNuyNpKQkZWdnq2fPnqXqD6B8IowAlVT//v0VHh6u/Px8ZWVladeuXZo1a5ZWrFihMWPGqH79+l6tLzk5WYsWLVJcXNwlhZGDBw8WCCNhYWGaM2eOqlThkAVURHyzgUqqVatWatSokXs6Pj5eO3bs0GuvvabXX39d77zzjnx9fQ1W+F+WZZWZWgBcfoQRAG433HCD+vbtq3nz5unbb79V165d9fPPP2v58uXavXu3Tpw4oYCAALVq1Up/+MMfdM0110jyfIvw8OHD3eubNGmSwsPDJUnffvutVqxYoUOHDsnX11ctWrTQQw89pNDQUEnS2LFjtWvXLkn/fbPxhbcQHzt2TMOHD/d4s/HkyZO1YcMGvfPOO5o6dap27typgIAAxcfH64477tCBAwc0Y8YM7du3T9dcc40GDhyoDh06eHze06dPa+HChdq4caOys7NVs2ZNdenSRffccw9vNgauIsIIAA+333675s2bp23btqlr167atm2bjh07pri4OAUHB+vQoUP66quvdOjQIf31r3+VZVm65ZZblJaWpnXr1mnQoEHukBIYGChJWrx4sebPn6927dqpS5cuOnnypD777DO9/PLLev3111WtWjX16dNHZ86c0X/+8x8NGjRIkuTn53fRWl0ul/72t7+padOmeuihh5SUlKTp06fLz89P8+bNU8eOHXXLLbdo5cqVmjRpkmJiYtzhKCcnR2PHjtXx48fVtWtXhYaGKjk5WfPmzVNWVpYGDx585XYyAA+EEQAeatasqYCAAB09elSS1KNHD919990ebRo3bqz33ntPe/bsUdOmTVW/fn1FR0dr3bp1uummm9y/8CUpIyNDCxYs0P33368+ffq459988836y1/+oi+++EJ9+vRR8+bNFRISotOnT+v2228vUa25ubnq2LGj4uPjJUkdOnTQY489pn/84x8aOXKkbrvtNklS8+bN9fTTT2vNmjXuUZfly5crPT1dr7/+umrXri1J6tatm0JCQrR06VL16tXLPWoD4MpiHBJAAX5+fjp79qwkeVyrcf78eZ08eVKNGzeWJO3fv7/YdW3cuFG2beu2227TyZMn3f+Cg4MVERGhnTt3XlKtXbp0cf93tWrVFBkZqapVq6pdu3bu+ZGRkapWrZqOHTvmnrdhwwY1bdpU1apV86jrxhtvlMvl0u7duy+pLgAlx8gIgALOnTunoKAgSdKpU6e0cOFCfffdd8rOzvZod+bMmWLXlZ6eLtu2NWLEiEKXX8odMk6n030q6IKAgADVrFlTlmUVmH/q1Cn3dFpamn7++WcNHTq00HX//rMCuHIIIwA8/Oc//9GZM2dUq1YtSdI777yj5ORk3XPPPWrQoIH8/Pzc12q4XK5i1+dyuWRZlp5//vlCLwot7rqQiynqItOSXHxq27aaN2+ue+65p9DlkZGRpa4LgHcIIwA8fPvtt5Kkli1b6tSpU9q+fbv69++vfv36udukpaUV6Pf7kYgLIiIiZNu2wsPDy9Qv+Fq1auncuXNq3ry56VKASo9rRgC47dixQ59++qnCw8PVoUMH9wiDbdse7VasWFGgb9WqVSUVPHVz8803y+FwaNGiRQXWY9u2fvnlF/e0n59fiU79XA7t2rXT3r179cMPPxRYdvr0aeXn51+VOgAwMgJUWv/+9791+PBhuVwuZWVlaefOndq2bZtCQ0M1ZswY+fr6ytfXV02bNtXSpUuVn5+vkJAQ/fjjjx4Xgl7QsGFDSdK8efPUvn17+fj4qE2bNoqIiNCAAQOUkJCgjIwM3XTTTfLz89OxY8e0efNm93M9Lqzju+++06xZs9SoUSP5+fmpbdu2V+Tz33PPPdqyZYsmTpyo2NhYNWzYUDk5OTpw4IA2bNigyZMnF7geBcCVQRgBKqkFCxZI+vUC0gvvphk0aFCBd9OMHDlS06dP1xdffOG+zuKFF17QY4895rG+a6+9Vvfff79WrlypH374QbZta9KkSfLz81Pv3r1Vu3ZtrVixQgsXLpQkhYaGqnnz5h5ho3v37kpNTdWaNWu0YsUKhYWFXbEwUrVqVY0bN06LFy/Whg0b9O2338rf31+RkZHq37+/AgICrsh2ARRk2b8fNwUAALiKuGYEAAAYRRgBAABGEUYAAIBRhBEAAGAUYQQAABhFGAEAAEYRRgAAgFGEEQAAYBRhBAAAGEUYAQAARhFGAACAUYQRAABg1P8HzEVMWLVHvLIAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "(delta[:-1] * quantity).iloc[:-5].plot(title = \"Unedited Delta Exposure\")\n", - "plt.show()\n", - "(delta * quantity_edit).plot(title = \"Edited Delta Exposure\")\n", - "plt.show()\n", - "quantity_edit.plot(title = \"Edited Quantity\")\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": 326, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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BJYCFREREQksBSoiIiISWApUREREJLDS/R5ArKSnJ82XItIv+lkQkYGgp59VA35TwpaWlk47MouIiMjAcazf4wN+6qelpYWf//znHDx4sE/Pv+OOO/p8bj1Xzw3Scw8ePMi//Mu/6GdBzw3cufVcPbcrBw8e5Oc//zktLS1HfdyAD1QAXnvttT5va799+/Y+n1fP1XOD9FxrLZs3b9bPgp4buHPruXpuV6y1vPbaa8d8XFIEKv1x3nnn6bl6btI8tz8G4ter5w6Mc+u5em5/DPgalcbGRr7yla9w//33k5ub6/dwRHyjnwURGUh6+pk14DMqGRkZXHLJJSqolZSnnwURGUh6+pk14DMqIiIikrwGfEZFREREkpcCFREREQkstbAMoMcff5yVK1eyY8cOMjMzKS8v54orrmD48OHeY5qbm1m6dCkrVqygpaWF6dOns3DhQsLhsH8D98GxXqs9e/bwjW98o8vnfutb3+L0009P5HAD4dlnn+WPf/wjNTU1jB49miuvvJIJEyZ0eoy1ln//93/n3Xff5YYbbuDUU0/1abT+WbNmDU888QSbN2+murr6iNfhzTff5Pnnn2fTpk3U19dz++23M2bMGP8G7KNjvVaHDh3iN7/5DW+99RYHDhygtLSUz3zmM3z605/2cdT+6Mnn+80338yaNWs6PW/evHn8/d//faKHGwgKVAJozZo1nHfeeYwfP562tjaWLVvGLbfcwk9/+lOys7MBeOCBB1i1ahXf/va3yc3NZcmSJdxxxx388Ic/9Hn0iXWs16qkpIRf/vKXnZ7z5z//mSeeeIKZM2f6NGr/rFixgqVLl3L11VczceJEnnrqKW699Vb+8z//k8LCQu9xTz31FMYYH0fqv6amJsaMGcO5557LT37yky7vnzx5Mqeffjp33323DyMMjmO9Vg888ACrV6/muuuuY8iQIbz//vvce++9FBUVcfLJJ/swYv/05PMdYO7cuVx22WXe9czMTD+GGwgKVALoe9/7Xqfr1157LQsXLmTTpk0cf/zxNDY28sILL3D99ddz4oknAnDNNdfwrW99i/Xr11NeXu7HsH1xrNcqFAodkWVauXIlp59+eqcPhVTx5JNPMnfuXM455xwArr76alatWsWLL77IhRdeCEBFRQVPPvkkP/7xj1P2LziAmTNnHjWYPfvsswEna5fqjvVarV+/ntmzZ3PCCScATnbg+eefZ8OGDSkXqBzrM8uVlZWVchny7qhGZQBobGwEID8/H4BNmzbR1tbG1KlTvceMGDGCkpIS1q9f78sYg+Lw1+pwmzZtoqKignPPPTeRwwqE1tZWNm3a1Ol9EwqFmDp1qve+aWpq4uc//zlXXXWVPiQlZsrLy3nnnXfYv38/1lpWr17Nrl27mDZtmt9D8113n1mvvPIKV111Ff/0T//Egw8+SFNTkx/DCwRlVAIuEolw//33M2nSJEaNGgVATU0N6enp5OXldXpsYWEhNTU1PowyGLp6rQ73wgsvMGLECCZNmpTg0fmvrq6OSCRyRAASDofZuXMn4KToJ02axCmnnOLDCCVZXXnlldx99918/etfJy0tDWMMX/va1zplEFJRd59ZZ555JiUlJRQVFbFlyxZ+85vfsHPnTm644QYfR+sfBSoBt2TJErZt28bixYv9HkrgHeu1am5u5tVXX+ULX/hCgkc2MLz99tusXr2a22+/3e+hSJJ55pln+Pjjj7nxxhsZMmQIH330EUuWLGHw4MEpnVXp7jNr3rx53uVRo0YxePBgFi9eTGVlJWVlZYkepu8UqATYkiVLWLVqFYsWLaK4uNi7PRwO09raSkNDQ6esSm1tbcqm67t7rTp64403aGpqYvbs2QkeXTAUFBQQCoWOyLrV1NQQDodZvXo1u3fv5itf+Uqn+++44w6mTJnCzTffnLCxSvJobm5m2bJl/PM//zMnnXQSAKNHj6aiooI//vGPKRuo9OQzy+WuylOgIoFhreW+++5j5cqV3HzzzZSWlna6f9y4caSlpfHBBx9w2mmnAbBz506qqqpSqpAWjv1adfTCCy9w8sknU1BQkMARBkd6ejrjxo1j9erV3tLRSCTC6tWrOf/885kzZ84RtTs33HADCxYsSLmCR4md1tZW2trajlhFFgqF+rzT90DWm88sV0VFBQCDBw+O8+iCSYFKAC1ZsoRXX32VG2+8kZycHO8v4NzcXDIzM8nNzeXcc89l6dKl5Ofnk5uby3333Ud5eXnKBSrHeq1clZWVfPTRR9x0000+jTQY5s+fz1133cW4ceOYMGECTz/9NE1NTcyZM4dwONxlRq6kpKRHH6bJ5tChQ1RWVnrX9+zZQ0VFBfn5+ZSUlFBfX09VVRX79+8H8Op8unsdk9mxXqvjjz+eX//612RmZjJkyBDWrFnDSy+9xIIFC3wctT+O9ZlVWVnJq6++ykknnUR+fj5bt27lgQceYMqUKYwePdrfwftEe/0E0KWXXtrl7ddccw1z5swB2hu+vfbaa7S2tqZsw7eevFYADz74IK+88gp33XUXoVBqL3Z79tlneeKJJ6ipqWHMmDF89atfZeLEiV0+9tJLL03Zhm8ffvghixYtOuL22bNnc+2117J8+XJ+8YtfHHH/JZdc0u37Mlkd67WqqanhwQcf5L333qO+vp4hQ4Ywb948LrjggpTr13Osz6yqqir++7//m23bttHU1ERxcTGnnnoqF198ccruiq5ARURERAIrtf+0FBERkUBToCIiIiKBpUBFREREAkuBioiIiASWAhUREREJLAUqIiIiElgKVERERCSwFKiIiIhIYClQERERkcBSoCIiIiKBpUBFREREAkuBioiIiASWAhUREREJLAUqIiIiElgKVERERCSwFKiIiIhIYClQERERkcBSoCIiIiKBpUBFREREAkuBioiIiASWAhUREREJLAUqIiIiElgKVERERCSwFKiIiIhIYKX7PQAR6d5dd93FSy+9BEBaWhr5+fmMGjWKT37yk8yZM4dQSH9riEhyU6AiEnAzZszgmmuuIRKJUFNTw7vvvsv999/Pm2++yY033khaWprfQxQRiRsFKiIBl56eTjgcBqCoqIhx48ZRXl7O4sWLWb58OXPnzqWhoYFf/epXvPXWW7S2tjJu3DgWLFjAmDFjvOO8/fbbPProo2zdupXs7GwmT57MP//zP/vzRYmI9JDyxiID0Iknnsjo0aNZuXIlAD/96U+pra3lu9/9Lj/+8Y8ZO3YsP/zhD6mvrwdg1apV/OQnP2HmzJncdttt/Ou//isTJkzw80sQEekRZVREBqgRI0awZcsW1q5dy4YNG7j33nvJyMgA4Mtf/jJvvfUWb7zxBvPmzeOxxx7jjDPO4NJLL/We3zHbIiISVApURAYoay3GGCoqKjh06BBXXnllp/ubm5uprKwEoKKigrlz5/oxTBGRflGgIjJA7dixg9LSUg4dOsTgwYO5+eabj3hMbm4uAJmZmQkenYhIbChQERmAVq9ezdatW7ngggsoLi6mpqaGUChEaWlpl48fPXo0H3zwAeecc06CRyoi0j8KVEQCrrW1lZqamk7Lk3//+99z0kknMXv2bIwxlJeX8x//8R9cccUVDBs2jOrqalatWsWpp57K+PHjueSSS1i8eDFlZWWcccYZRCIRVq1axYUXXuj3lyciclTGWmv9HoSIdO3whm95eXmMHj2aM888k9mzZ3sN3w4ePMiyZct48803qaurIxwOM2XKFC6//HJKSkoAePPNN3n00UfZvn07OTk5TJkyhRtuuMG3r01EpCcUqIiIiEhgqY+KiIiIBJYCFREREQksBSoiIiISWApUREREJLAUqIiIiEhgqY+KSIA8/vjjrFy5kh07dpCZmUl5eTlXXHEFw4cP9x7T3NzM0qVLWbFiBS0tLUyfPp2FCxd6OyxXVFTw+9//nnXr1lFXV0dpaSmf+tSn+OxnP+sdY+3atfzmN79hx44dNDU1MWTIEObNm8f8+fMT/SWLiByVAhWRAFmzZg3nnXce48ePp62tjWXLlnHLLbfw05/+lOzsbAAeeOABVq1axbe//W1yc3NZsmQJd9xxBz/84Q8B2LRpE4WFhVx33XUUFxezbt06fvnLXxIKhTj//PMByMrK4rzzzmP06NFkZWWxdu1a7rnnHrKzs5k3b55vX7+IyOHUR0UkwOrq6li4cCE333wzxx9/PI2NjVx11VVcf/31nHbaaYCz58+3vvUtbrnlFsrLy7s8zr333suOHTv4t3/7t27P9ZOf/ISsrCyuu+66uHwtIiJ9oRoVkQBrbGwEID8/H3CyJW1tbUydOtV7zIgRIygpKWH9+vVHPY57jK5s3ryZdevWcfzxx8do5CIisaGpH5GAikQi3H///UyaNIlRo0YBUFNTQ3p6Onl5eZ0eW1hYSE1NTZfHWbduHa+//jrf+c53jrjv61//OnV1dbS1tfG3f/u3zJ07N+Zfh4hIfyhQEQmoJUuWsG3bNhYvXtznY2zdupXbb7+dSy65hOnTpx9x/+LFizl06BDr16/nwQcfpKysjDPPPLM/wxYRiSkFKiIBtGTJElatWsWiRYsoLi72bg+Hw7S2ttLQ0NApq1JbW+ut+nFt376dH/7wh8ybN48vfOELXZ6ntLQUgFGjRlFbW8vDDz+sQEVEAkU1KiIBYq1lyZIlrFy5kh/84AdeIOEaN24caWlpfPDBB95tO3fupKqqqlMh7bZt21i0aBGzZ8/m//2//9fjc7e2tsbmCxERiRFlVEQCZMmSJbz66qvceOON5OTkeHUnubm5ZGZmkpuby7nnnsvSpUvJz88nNzeX++67j/Lyci9Q2bp1K4sXL2b69OnMnz/fO0YoFKKgoACAZ599lpKSEkaMGAHARx99xB//+Ec+85nPJPxrFhE5Gi1PFgmQSy+9tMvbr7nmGubMmQO0N3x77bXXaG1tPaLh20MPPcQjjzxyxDGGDBnCXXfdBcAzzzzDn//8Z/bs2UMoFKKsrIy5c+cyb948QiElWkUkOBSoiIiISGDpTycREREJLAUqIiIiElgKVERERCSwFKiIiIhIYClQERERkcBSoCIiIiKBpUBFREREAkuBiogMaHv27OHSSy9l+fLlfg9FROJALfRFxLN8+XJ+8YtfeNczMjLIz89n1KhRzJw5k3POOYecnJxeH3fdunW89957XHDBBZ02U+yNV199ldraWi644II+PV9EBiYFKiJyhEsvvZTS0lLa2tqoqalhzZo1PPDAAzz11FPceOONjB49ulfHW7duHY888ghz5szpV6Cybdu2IwKVIUOG8Otf/5r0dH2ciSQj/WSLyBFmzpzJ+PHjvesXXXQRq1ev5sc//jG33347P/vZz8jMzPRxhO2MMYEZi4jEngIVEemRE088kS984QssW7aMl19+mXnz5rFlyxaefPJJPvroI6qrq8nNzWXmzJn83d/9HYMGDQI6b5L4jW98wzvenXfeSWlpKQAvv/wyTz31FNu3byczM5Pp06dzxRVXUFJSAsDNN9/MmjVrgPaNG91NFvfs2cM3vvGNThs33nXXXbzxxhv87Gc/49577+XDDz8kNzeXiy66iPPPP5+tW7fyf//3f2zYsIFBgwZx+eWXc+aZZ3b6ehsaGnj44Yd58803qa2tpbi4mLlz5/K5z31OGzeKJJACFRHpsbPPPptly5bx/vvvM2/ePN5//3327NnDnDlzCIfDbN++nT//+c9s376dW2+9FWMMs2bNYteuXbz22mssWLDAC2AKCgoAeOyxx/jd737H6aefzty5c6mrq+OZZ57h3/7t37j99tvJy8vj4osvprGxkX379rFgwQIAsrOzjzrWSCTCj370I6ZMmcIVV1zBq6++yn333Ud2djbLli3jrLPOYtasWTz//PPceeedlJeXe4FTU1MTN998M/v372fevHmUlJSwbt06li1bRk1NDV/5ylfi9yKLSCcKVESkx4qLi8nNzWX37t0AnHfeefzN3/xNp8dMnDiRn//856xdu5YpU6YwevRoxo4dy2uvvcYpp5ziBQMAe/fu5aGHHuKyyy7j4osv9m4/9dRT+Zd/+Reee+45Lr74YqZNm0ZRURENDQ2cffbZPRprS0sLZ511FhdddBEAZ555Jl/72tf4n//5H66//nrOOOMMAKZNm8Y//uM/snz5ci9b8+STT1JZWcntt9/OsGHDAPjUpz5FUVERTzzxBPPnz/eyPSISX8pfikivZGdnc/DgQYBOtSHNzc3U1dUxceJEADZv3nzMY7355ptYaznjjDOoq6vz/oXDYcrKyvjwww/7Nda5c+d6l/Py8hg+fDhZWVmcfvrp3u3Dhw8nLy+PPXv2eLe98cYbTJkyhby8vE7jmjp1KpFIhI8++qhf4xKRnlNGRUR65dChQxQWFgJQX1/Pww8/zIoVK6itre30uMbGxmMeq7KyEmst3/zmN7u8vz8reTIyMrzpJVdubi7FxcUYY464vb6+3ru+a9cutmzZwsKFC7s89uFfq4jEjwIVEemxffv20djYyNChQwH42c9+xrp16/jc5z7HmDFjyM7O9mpDIpHIMY8XiUQwxnDTTTd1WaB6rDqUo+mu4LUnhbDWWqZNm8bnPve5Lu8fPnx4n8clIr2jQEVEeuzll18GYMaMGdTX1/PBBx9w6aWXcskll3iP2bVr1xHPOzyD4SorK8NaS2lpaaB++Q8dOpRDhw4xbdo0v4cikvJUoyIiPbJ69WoeffRRSktLOfPMM73MhLW20+OeeuqpI56blZUFHDkddOqppxIKhXjkkUeOOI61lgMHDnjXs7OzezSdFAunn34669ev59133z3ivoaGBtra2hIyDhFRRkVEuvDXv/6VHTt2EIlEqKmp4cMPP+T999+npKSEG2+8kczMTDIzM5kyZQpPPPEEbW1tFBUV8d5773UqSnWNGzcOgGXLlvHJT36StLQ0PvGJT1BWVsYXv/hFHnzwQfbu3cspp5xCdnY2e/bs4a233vL6lrjHWLFiBQ888ADjx48nOzubk08+OS5f/+c+9znefvttbrvtNmbPns24ceNoampi69atvPHGG9x1111H1L+ISHwoUBGRIzz00EOAU8zq7vWzYMGCI/b6uf7667nvvvt47rnnvLqO7373u3zta1/rdLwJEyZw2WWX8fzzz/Puu+9ireXOO+8kOzubCy+8kGHDhvHUU0/x8MMPA1BSUsK0adM6BSKf/vSnqaioYPny5Tz11FMMGTIkboFKVlYWixYt4rHHHuONN97g5ZdfJicnh+HDh3PppZeSm5sbl/OKyJGMPTzfKiIiIhIQqlERERGRwFKgIiIiIoGlQEVEREQCS4GKiIiIBJYCFREREQksBSoiIiISWApUREREJLAUqIiIiEhgKVARERGRwFKgIiIiIoGlQEVEREQCS4GKiIiIBJYCFREREQms/w/mbqnVXSgt+gAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAioAAAHlCAYAAADbZtdPAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB0b0lEQVR4nO3deXzU1b3/8deZ7AvJkIQQFtkJoKxuqFVBoVUrbdV60Wu9V+ty25/WWq21tXYR1N7qrbb2am+tYpW20ipq3bWL4oaKSlUQAVnCHiCQSUhC1jm/P74z3ySQQJZZvpl5Px8PHsz6/Z6ZJJNPPudzPsdYay0iIiIiHuSL9wBEREREOqNARURERDxLgYqIiIh4lgIVERER8SwFKiIiIuJZClRERETEsxSoiIiIiGcpUBERERHPUqAiIiIinqVARURERDwrNd4DiJTKykqam5vjPQyRuBowYAC7d++O9zBERA4rNTWV/v37H/5xMRhLTDQ3N9PU1BTvYYjEjTEGcH4WtIWXiCQKTf2IiIiIZylQEREREc9SoCIiIiKelTA1KofS3NxMXV1dvIchUWCtJTU1lZycnHgPRUREoiDhA5Xm5mZqa2vp168fPp8SSImotraWhoYGMjIy4j0UERGJsIT/zV1XV6cgJcFlZ2fT0NAQ72GIiEgUJMVvbwUpiS28LFdERBKPfoOLiIiIZylQEREREc9SoCIiIiKepUAlAW3ZsoUhQ4awcuXKqJ3j/PPP5yc/+Yl7ffr06TzwwANROdeQIUN46aWXonJsERHxNgUqEhEvvPACF198sXtdwYWIiERCwvdRkdgoLCyM9xBERKSb7MbPCD7/F0x+Ab7/uCrew+lQUmVUrLXYhvr4/OvGbrbnn38+N998MzfffDPjx49n4sSJ3Hnnne4xpk+fzq9//Wuuv/56SktLOe644/jjH//Y4/dl9erVXHzxxYwdO5YpU6ZwzTXXsHfvXvf+uro6vv3tbzN27FimTZvGb3/724OO0XbqZ/r06QBcfvnlDBkyxL0O8PLLL3PGGWcwatQoTjzxRO6++26am5vd+zds2MB5553HqFGjmDlzJq+//nqPX5eIiBxGUwN8tAy7+qN4j6RTyZVRaWwg+K25cTm1797HICOzy49//PHHufDCC3nuuef4+OOPufHGGxkyZAhf+9rXALj//vv53ve+xzXXXMPzzz/PTTfdxAknnMCYMWO6Na6qqirmzp3Lv//7v3PLLbdQX1/P7bffzje+8Q0ef/xxAG699VbeeecdHnroIYqKivj5z3/OihUrOPLIIzs85gsvvMDkyZO5++67Oe2000hJSQHg3Xff5dprr2X+/PlMnz6dTZs2ceONNwJw/fXXEwwGufLKKykqKuLZZ59l3759/PSnP+3W6xERkW4oLHb+37MbGwxiPNh3zHsjEgAGDx7MvHnzGDNmDOeddx6XXXZZu2LV008/nUsvvZSRI0dy9dVXU1BQwNKlS7t9nt///vdMnDiRm266iTFjxjBx4kTuuusuli5dyvr166mtreXPf/4zP/7xjznllFOYMGECv/rVr9plQQ4UngbKz8+nuLjYvX733Xdz9dVXM3fuXIYPH86pp57K9773PTcb9MYbb7Bu3TruuecejjrqKE444QR+8IMfdPs1iUjfZ2trCD7xCHbHlngPJbH5C8Hng5ZmqKqM92g6lFwZlfQMJ7MRp3N3x9FHH92u4+oxxxzD/fffT0tLC0C7bIYxhgEDBrBnz55uD2vVqlUsXbqUsWPHHnTfpk2bqK+vp7GxkaOPPtq9vX///owePbpH53r//ff59a9/7d4WDAapr69n//79fPbZZwwePJiSkhL3/mOOOabb5xGRvs++/hL2pSegsgJzxXfjPZyEZVJSoH8R7Nnl/OvvvXrDpApUjDHdmn7xstTU9l86YwzBYLDbx6mrq+Pzn/88P/zhDw+6b+DAgWzcuLHHY+zoXN/97nc566yzDrpPGwqKSFu2bJ3z/97dcR5JEigaCHt2YffswoyZEO/RHCSpApW+5F//+le768uXL2fkyJFuvUekTJw4kRdeeIEjjjjioOAHYMSIEaSlpbF8+XKGDBkCQCAQYMOGDZxwwgmdHjctLc3N/rQ91/r16xk5cmSHzxk7dizbt29n586dDBw4EHBet4gkoU1OoEJg76EfJ71mCgZgASp2xnsoHVKNikdt27aNW265hXXr1vHXv/6Vhx56iMsvvzzi57n00ksJBAJcddVVfPjhh5SVlbFkyRKuu+46WlpayMnJ4cILL+S2227jzTffZPXq1Vx33XWH3ehx6NChvPnmm+zatYtAIADAddddx+LFi7n77rtZs2YNn332GU8//TR33HEHAKeccgqjRo3iO9/5Dp988gnvvvuue5+I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KFCRZKdARUT6kq4GKuqHLiIiIp6lQEVEREQ8S4GKiIiIeJYCFREREfEsBSoiIiLiWQpURERExLMUqIiIiIhnKVARERERz1KgIiIiIp6lQEVEREQ8S4GKiIiIeFZqvAcQKampCfNSRHpFPwsi0hd09bOqz29K2NTU1G5HZhEREek7Dvd7vM9P/TQ1NXHPPfewf//+Hj3/rrvu6vG59Vw910vP3b9/P9///vf1s6Dneu7ceq6e25H9+/dzzz330NTUdMjH9flABeCtt97q8bb2W7du7fF59Vw910vPtdayceNG/SzouZ47t56r53bEWstbb7112MclRKDSG2eccYaeq+cmzHN7oy++Xj23b5xbz9Vze6PP16jU1dVx6aWX8vDDD5OdnR3v4YjEjX4WRKQv6epnVp/PqKSlpXH++eeroFaSnn4WRKQv6epnVp/PqIiIiEji6vMZFREREUlcClRERETEs9TC0oOeeuopli1bxrZt20hPT6e0tJSLL76YwYMHu49pbGxk4cKFLF26lKamJqZMmcIVV1yB3++P38Dj4HDv1a5du/jWt77V4XOvu+46TjzxxFgO1xNeeuklnn32WQKBAMOHD+eyyy5jzJgx7R5jreW///u/+fDDD7nhhhs4/vjj4zTa+Fm1ahXPPPMMGzdupLKy8qD34d133+Xvf/87GzZsoKamhjvvvJMRI0bEb8BxdLj3qr6+nj/96U+899577Nu3j+LiYs466yy+8IUvxHHU8dGVz/dbbrmFVatWtXve7Nmz+a//+q9YD9cTFKh40KpVqzjjjDMYPXo0LS0tLFq0iNtuu427776bzMxMAB555BGWL1/O9ddfT3Z2NgsWLOCuu+7i1ltvjfPoY+tw71VRURG/+93v2j3nH//4B8888wzTpk2L06jjZ+nSpSxcuJArr7ySsWPH8vzzz3P77bfzq1/9ivz8fPdxzz//PMaYOI40/hoaGhgxYgSnn346v/jFLzq8f/z48Zx44oncf//9cRihdxzuvXrkkUdYuXIl11xzDQMGDODjjz/mwQcfpKCggGOPPTYOI46frny+A8yaNYsLLrjAvZ6enh6P4XqCAhUPuvnmm9tdv/rqq7niiivYsGEDRx55JHV1dbzyyitce+21TJw4EYCrrrqK6667jrVr11JaWhqPYcfF4d4rn893UJZp2bJlnHjiie0+FJLFc889x6xZszjttNMAuPLKK1m+fDmvvvoq55xzDgBlZWU899xz/PznP0/av+AApk2bdshg9tRTTwWcrF2yO9x7tXbtWmbMmMFRRx0FONmBv//976xbty7pApXDfWaFZWRkJF2GvDOqUekD6urqAMjNzQVgw4YNtLS0MGnSJPcxQ4YMoaioiLVr18ZljF5x4Ht1oA0bNlBWVsbpp58ey2F5QnNzMxs2bGj3fePz+Zg0aZL7fdPQ0MA999zD5Zdfrg9JiZjS0lI++OAD9u7di7WWlStXsmPHDiZPnhzvocVdZ59Zb7zxBpdffjnf/e53efTRR2loaIjH8DxBGRWPCwaDPPzww4wbN45hw4YBEAgESE1NJScnp91j8/PzCQQCcRilN3T0Xh3olVdeYciQIYwbNy7Go4u/6upqgsHgQQGI3+9n+/btgJOiHzduHMcdd1wcRiiJ6rLLLuP+++/nm9/8JikpKRhj+MY3vtEug5CMOvvMOvnkkykqKqKgoIBNmzbxpz/9ie3bt3PDDTfEcbTxo0DF4xYsWMCWLVuYP39+vIfieYd7rxobG3nzzTf56le/GuOR9Q3vv/8+K1eu5M4774z3UCTBvPjii3z22WfceOONDBgwgE8//ZQFCxbQv3//pM6qdPaZNXv2bPfysGHD6N+/P/Pnz6e8vJySkpJYDzPuFKh42IIFC1i+fDnz5s2jsLDQvd3v99Pc3ExtbW27rEpVVVXSpus7e6/aeuedd2hoaGDGjBkxHp035OXl4fP5Dsq6BQIB/H4/K1euZOfOnVx66aXt7r/rrruYMGECt9xyS8zGKomjsbGRRYsW8b3vfY+jjz4agOHDh1NWVsazzz6btIFKVz6zwsKr8hSoiGdYa3nooYdYtmwZt9xyC8XFxe3uHzVqFCkpKaxYsYITTjgBgO3bt1NRUZFUhbRw+PeqrVdeeYVjjz2WvLy8GI7QO1JTUxk1ahQrV650l44Gg0FWrlzJmWeeycyZMw+q3bnhhhu45JJLkq7gUSKnubmZlpaWg1aR+Xy+Hu/03Zd15zMrrKysDID+/ftHeXTepEDFgxYsWMCbb77JjTfeSFZWlvsXcHZ2Nunp6WRnZ3P66aezcOFCcnNzyc7O5qGHHqK0tDTpApXDvVdh5eXlfPrpp9x0001xGqk3zJkzh/vuu49Ro0YxZswYXnjhBRoaGpg5cyZ+v7/DjFxRUVGXPkwTTX19PeXl5e71Xbt2UVZWRm5uLkVFRdTU1FBRUcHevXsB3Dqfzt7HRHa49+rII4/kj3/8I+np6QwYMIBVq1bx2muvcckll8Rx1PFxuM+s8vJy3nzzTY4++mhyc3PZvHkzjzzyCBMmTGD48OHxHXycaK8fD5o7d26Ht1911VXMnDkTaG349tZbb9Hc3Jy0Dd+68l4BPProo7zxxhvcd999+HzJvdjtpZde4plnniEQCDBixAi+/vWvM3bs2A4fO3fu3KRt+PbJJ58wb968g26fMWMGV199NUuWLOE3v/nNQfeff/75nX5fJqrDvVeBQIBHH32Ujz76iJqaGgYMGMDs2bM5++yzk65fz+E+syoqKvjf//1ftmzZQkNDA4WFhRx//PGcd955SbsrugIVERER8azk/tNSREREPE2BioiIiHiWAhURERHxLAUqIiIi4lkKVERERMSzFKiIiIiIZylQEREREc9SoCIiIiKepUBFREREPEuBioiIiHiWAhURERHxLAUqIiIi4lkKVERERMSzFKiIiIiIZylQEREREc9SoCIiIiKepUBFREREPEuBioiIiHiWAhURERHxLAUqIiIi4lkKVERERMSzFKiIiIiIZylQEREREc9SoCIiIiKelRrvAYhI5+677z5ee+01AFJSUsjNzWXYsGF87nOfY+bMmfh8+ltDRBKbAhURj5s6dSpXXXUVwWCQQCDAhx9+yMMPP8y7777LjTfeSEpKSryHKCISNQpURDwuNTUVv98PQEFBAaNGjaK0tJT58+ezZMkSZs2aRW1tLX/4wx947733aG5uZtSoUVxyySWMGDHCPc7777/PE088webNm8nMzGT8+PF873vfi8+LEhHpIuWNRfqgiRMnMnz4cJYtWwbA3XffTVVVFT/84Q/5+c9/zsiRI7n11lupqakBYPny5fziF79g2rRp3HHHHfz4xz9mzJgx8XwJIiJdooyKSB81ZMgQNm3axOrVq1m3bh0PPvggaWlpAPznf/4n7733Hu+88w6zZ8/mySef5KSTTmLu3Lnu89tmW0REvEqBikgfZa3FGENZWRn19fVcdtll7e5vbGykvLwcgLKyMmbNmhWPYYqI9IoCFZE+atu2bRQXF1NfX0///v255ZZbDnpMdnY2AOnp6TEenYhIZChQEemDVq5cyebNmzn77LMpLCwkEAjg8/koLi7u8PHDhw9nxYoVnHbaaTEeqYhI7yhQEfG45uZmAoFAu+XJf/3rXzn66KOZMWMGxhhKS0v5n//5Hy6++GIGDRpEZWUly5cv5/jjj2f06NGcf/75zJ8/n5KSEk466SSCwSDLly/nnHPOiffLExE5JGOttfEehIh07MCGbzk5OQwfPpyTTz6ZGTNmuA3f9u/fz6JFi3j33Xeprq7G7/czYcIELrroIoqKigB49913eeKJJ9i6dStZWVlMmDCBG264IW6vTUSkKxSoiIiIiGepj4qIiIh4lgIVERER8SwFKiIiIuJZClRERETEsxSoiIiIiGepj4qIhzz11FMsW7aMbdu2kZ6eTmlpKRdffDGDBw92H9PY2MjChQtZunQpTU1NTJkyhSuuuMLdYbmsrIy//vWvrFmzhurqaoqLi/n85z/PF7/4RfcYq1ev5k9/+hPbtm2joaGBAQMGMHv2bObMmRPrlywickgKVEQ8ZNWqVZxxxhmMHj2alpYWFi1axG233cbdd99NZmYmAI888gjLly/n+uuvJzs7mwULFnDXXXdx6623ArBhwwby8/O55pprKCwsZM2aNfzud7/D5/Nx5plnApCRkcEZZ5zB8OHDycjIYPXq1TzwwANkZmYye/bsuL1+EZEDqY+KiIdVV1dzxRVXcMstt3DkkUdSV1fH5ZdfzrXXXssJJ5wAOHv+XHfdddx2222UlpZ2eJwHH3yQbdu28dOf/rTTc/3iF78gIyODa665JiqvRUSkJ1SjIuJhdXV1AOTm5gJOtqSlpYVJkya5jxkyZAhFRUWsXbv2kMcJH6MjGzduZM2aNRx55JERGrmISGRo6kfEo4LBIA8//DDjxo1j2LBhAAQCAVJTU8nJyWn32Pz8fAKBQIfHWbNmDW+//TY/+MEPDrrvm9/8JtXV1bS0tPBv//ZvzJo1K+KvQ0SkNxSoiHjUggUL2LJlC/Pnz+/xMTZv3sydd97J+eefz5QpUw66f/78+dTX17N27VoeffRRSkpKOPnkk3szbBGRiFKgIuJBCxYsYPny5cybN4/CwkL3dr/fT3NzM7W1te2yKlVVVe6qn7CtW7dy6623Mnv2bL761a92eJ7i4mIAhg0bRlVVFY8//rgCFRHxFNWoiHiItZYFCxawbNkyfvKTn7iBRNioUaNISUlhxYoV7m3bt2+noqKiXSHtli1bmDdvHjNmzODf//3fu3zu5ubmyLwQEZEIUUZFxEMWLFjAm2++yY033khWVpZbd5KdnU16ejrZ2dmcfvrpLFy4kNzcXLKzs3nooYcoLS11A5XNmzczf/58pkyZwpw5c9xj+Hw+8vLyAHjppZcoKipiyJAhAHz66ac8++yznHXWWTF/zSIih6LlySIeMnfu3A5vv+qqq5g5cybQ2vDtrbfeorm5+aCGb4899hiLFy8+6BgDBgzgvvvuA+DFF1/kH//4B7t27cLn81FSUsKsWbOYPXs2Pp8SrSLiHQpURERExLP0p5OIiIh4lgIVERER8SwFKiIiIuJZClRERETEsxSoiIiIiGcpUBERERHPUqAiIiIinqVARUT6tF27djF37lyWLFkS76GISBSohb6IuJYsWcJvfvMb93paWhq5ubkMGzaMadOmcdppp5GVldXt465Zs4aPPvqIs88+u91mit3x5ptvUlVVxdlnn92j54tI36RARUQOMnfuXIqLi2lpaSEQCLBq1SoeeeQRnn/+eW688UaGDx/ereOtWbOGxYsXM3PmzF4FKlu2bDkoUBkwYAB//OMfSU3Vx5lIItJPtogcZNq0aYwePdq9fu6557Jy5Up+/vOfc+edd/LLX/6S9PT0OI6wlTHGM2MRkchToCIiXTJx4kS++tWvsmjRIl5//XVmz57Npk2beO655/j000+prKwkOzubadOm8R//8R/069cPaL9J4re+9S33ePfeey/FxcUAvP766zz//PNs3bqV9PR0pkyZwsUXX0xRUREAt9xyC6tWrQJaN24Mb7K4a9cuvvWtb7XbuPG+++7jnXfe4Ze//CUPPvggn3zyCdnZ2Zx77rmceeaZbN68md///vesW7eOfv36cdFFF3HyySe3e721tbU8/vjjvPvuu1RVVVFYWMisWbP48pe/rI0bRWJIgYqIdNmpp57KokWL+Pjjj5k9ezYff/wxu3btYubMmfj9frZu3co//vEPtm7dyu23344xhunTp7Njxw7eeustLrnkEjeAycvLA+DJJ5/kL3/5CyeeeCKzZs2iurqaF198kZ/+9Kfceeed5OTkcN5551FXV8eePXu45JJLAMjMzDzkWIPBID/72c+YMGECF198MW+++SYPPfQQmZmZLFq0iFNOOYXp06fz97//nXvvvZfS0lI3cGpoaOCWW25h7969zJ49m6KiItasWcOiRYsIBAJceuml0XuTRaQdBSoi0mWFhYVkZ2ezc+dOAM444wy+9KUvtXvM2LFjueeee1i9ejUTJkxg+PDhjBw5krfeeovjjjvODQYAdu/ezWOPPcYFF1zAeeed595+/PHH8/3vf5+XX36Z8847j8mTJ1NQUEBtbS2nnnpql8ba1NTEKaecwrnnngvAySefzDe+8Q3+7//+j2uvvZaTTjoJgMmTJ/Od73yHJUuWuNma5557jvLycu68804GDRoEwOc//3kKCgp45plnmDNnjpvtEZHoUv5SRLolMzOT/fv3A7SrDWlsbKS6upqxY8cCsHHjxsMe691338Vay0knnUR1dbX7z+/3U1JSwieffNKrsc6aNcu9nJOTw+DBg8nIyODEE090bx88eDA5OTns2rXLve2dd95hwoQJ5OTktBvXpEmTCAaDfPrpp70al4h0nTIqItIt9fX15OfnA1BTU8Pjjz/O0qVLqaqqave4urq6wx6rvLwcay3f/va3O7y/Nyt50tLS3OmlsOzsbAoLCzHGHHR7TU2Ne33Hjh1s2rSJK664osNjH/haRSR6FKiISJft2bOHuro6Bg4cCMAvf/lL1qxZw5e//GVGjBhBZmamWxsSDAYPe7xgMIgxhptuuqnDAtXD1aEcSmcFr10phLXWMnnyZL785S93eP/gwYN7PC4R6R4FKiLSZa+//joAU6dOpaamhhUrVjB37lzOP/989zE7duw46HkHZjDCSkpKsNZSXFzsqV/+AwcOpL6+nsmTJ8d7KCJJTzUqItIlK1eu5IknnqC4uJiTTz7ZzUxYa9s97vnnnz/ouRkZGcDB00HHH388Pp+PxYsXH3Qcay379u1zr2dmZnZpOikSTjzxRNauXcuHH3540H21tbW0tLTEZBwiooyKiHTgX//6F9u2bSMYDBIIBPjkk0/4+OOPKSoq4sYbbyQ9PZ309HQmTJjAM888Q0tLCwUFBXz00UftilLDRo0aBcCiRYv43Oc+R0pKCscccwwlJSVceOGFPProo+zevZvjjjuOzMxMdu3axXvvvef2LQkfY+nSpTzyyCOMHj2azMxMjj322Ki8/i9/+cu8//773HHHHcyYMYNRo0bR0NDA5s2beeedd7jvvvsOqn8RkehQoCIiB3nssccAp5g1vNfPJZdcctBeP9deey0PPfQQL7/8slvX8cMf/pBvfOMb7Y43ZswYLrjgAv7+97/z4YcfYq3l3nvvJTMzk3POOYdBgwbx/PPP8/jjjwNQVFTE5MmT2wUiX/jCFygrK2PJkiU8//zzDBgwIGqBSkZGBvPmzePJJ5/knXfe4fXXXycrK4vBgwczd+5csrOzo3JeETmYsQfmW0VEREQ8QjUqIiIi4lkKVERERMSzFKiIiIiIZylQEREREc9SoCIiIiKepUBFREREPEuBioiIiHiWAhURERHxLAUqIiIi4lkKVERERMSzFKiIiIiIZylQEREREc9SoCIiIiKe9f8BaTQGFS5EzIMAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "delta = greeks['Midpoint_delta'].shift(1)\n", - "quantity_ts = pd.Series([quantity]*len(delta), index = delta.index)\n", - "quantity_ts\n", - "delta_frame = delta.to_frame()\n", - "delta_frame['spot_close'] = spot_ts['close']\n", - "delta_frame['unedited_quantity'] = quantity\n", - "delta_frame['edited_quantity'] = quantity_edit\n", - "delta_frame['close_change'] = delta_frame['spot_close'] - delta_frame['spot_close'].shift(1)\n", - "delta_frame['edited_delta'] = (delta_frame['edited_quantity'] * delta_frame['Midpoint_delta']) * 100\n", - "delta_frame['unedited_delta'] = (delta_frame['unedited_quantity'] * delta_frame['Midpoint_delta']) * 100\n", - "delta_frame['pnl'] = delta_frame['unedited_delta'] * delta_frame['close_change']\n", - "delta_frame['pnl_edited'] = delta_frame['edited_delta'] * delta_frame['close_change']\n", - "# delta_frame['pnl'].cumsum().plot(y = 'undedited_quantity')\n", - "# delta_frame['pnl_edited'].cumsum().plot(y = 'edited_quantity')\n", - "# plt.legend()\n", - "# plt.show()\n", - "# delta_frame.plot(y = ['unedited_delta', 'edited_delta'])\n", - "delta_frame.cumsum().plot(y = ['pnl'])\n", - "plt.show()\n", - "delta_frame.cumsum().plot(y = ['pnl_edited'])\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": 331, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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XIwdOxZAfdG8zZs3w2AwNCqa9+mnn2LlypWNzhEVFYU33ngDALB69Wr89NNPyMvLg06nQ2xsLCZMmICJEydCp+NkLRG5HgYzRERE5NL4ZxgRERG5NAYzRERE5NIYzBAREZFLYzBDRERELo3BDBEREbk0BjNERETk0hjMEBERkUtjMENEREQujcEMEXV6eXl5mDFjBjZs2ODooRCRDbA3ExG1yYYNG/Dmm29qt728vBAYGIju3btjyJAhGDduHPz8/Np83qNHj2Lfvn245pprzLqCt8WmTZtQXFyMa665pl3PJyLXxGCGiNplxowZiI6ORl1dHfR6PQ4dOoQPPvgAq1atwmOPPYaEhIQ2ne/o0aNYuXIlxo4d26Fg5uzZs42CmaioKHz44Yfw9OSPPKLOiP9nE1G7DBkyBD179tRuT5s2Denp6XjhhRewePFivPLKK/D29nbgCOsJIZxmLERkfQxmiMhqBg4ciJtuugkrVqzAL7/8gokTJ+L06dP47rvvcPjwYRQVFcHf3x9DhgzBbbfdhqCgIADm3b7vu+8+7Xyvv/46oqOjAQC//PILVq1ahaysLHh7eyMlJQW33norIiMjAQDz5s3DoUOHANR3IFe7hefl5eG+++4z60D+xhtvYOvWrXjllVewdOlSHDx4EP7+/pg2bRqmTJmCM2fO4L333sPx48cRFBSEWbNmYfTo0Wavt7y8HJ999hm2bduG4uJiREREYMKECbjuuuvYgZzIjhjMEJFVXXHFFVixYgX279+PiRMnYv/+/cjLy8PYsWMRGhqKrKws/PTTT8jKysLzzz8PIQQuu+wy5OTkYPPmzZg9e7YW5AQHBwMAvvjiC/zvf//DyJEjMWHCBJSUlGD16tV45plnsHjxYgQEBODGG29ERUUFLly4gNmzZwMAfH19mx2r0WjEP/7xD/Tr1w+33norNm3ahHfffRe+vr5YsWIFxowZg8suuwxr167F66+/juTkZC24qq6uxrx581BYWIiJEyciMjISR48exYoVK6DX6/GHP/zBdm8yEZlhMENEVhUREQF/f3+cP38eADB58mRce+21Zsf07t0br732Go4cOYJ+/fohISEBSUlJ2Lx5M4YNG6YFDACQn5+PTz/9FDNnzsSNN96o3T98+HD89a9/xZo1a3DjjTdi8ODBCA8PR3l5Oa644opWjbW2thZjxozBtGnTAACjR4/Gn/70J/z73//Ggw8+iFGjRgEABg8ejD//+c/YsGGDNuvz3XffITc3F4sXL0ZcXBwA4Morr0R4eDi++eYbTJ06VZs1IiLb4jwoEVmdr68vKisrAcAsV6WmpgYlJSXo3bs3AODUqVMtnmvbtm2QUmLUqFEoKSnR/gsNDUVsbCwOHjzYobFOmDBB+zogIABdunSBj48PRo4cqd3fpUsXBAQEIC8vT7tv69at6NevHwICAszGNWjQIBiNRhw+fLhD4yKi1uPMDBFZXVVVFUJCQgAAZWVl+Oyzz7BlyxYUFxebHVdRUdHiuXJzcyGlxAMPPGDx8Y7sUPLy8tKWslT+/v6IiIiAEKLR/WVlZdrtnJwcnD59GnPmzLF47otfKxHZDoMZIrKqCxcuoKKiAjExMQCAV155BUePHsV1112HxMRE+Pr6arkqRqOxxfMZjUYIIfDEE09YTKptKS+mOU0l6bYmeVdKicGDB+O6666z+HiXLl3aPS4iahsGM0RkVb/88gsAIDU1FWVlZThw4ABmzJiB6dOna8fk5OQ0et7FMyGq2NhYSCkRHR3tVAFCTEwMqqqqMHjwYEcPhcjtMWeGiKwmPT0dn3/+OaKjozF69GhthkNKaXbcqlWrGj3Xx8cHQOOlp+HDh0On02HlypWNziOlRGlpqXbb19e3VUtX1jBy5EhkZGRg7969jR4rLy9HXV2dXcZBRJyZIaJ22rNnD86dOwej0Qi9Xo+DBw9i//79iIyMxGOPPQZvb294e3ujX79++Oabb1BXV4fw8HDs27fPLJFW1aNHDwDAihUrcPnll8PDwwOXXHIJYmNjcfPNN+Pjjz9Gfn4+hg0bBl9fX+Tl5WHHjh1aXRf1HFu2bMEHH3yAnj17wtfXF5deeqlNXv91112HnTt3YtGiRUhLS0OPHj1QXV2NM2fOYOvWrXjjjTca5eMQkW0wmCGidvn0008BKAm4am+m2bNnN+rN9OCDD+Ldd9/FmjVrtDyTJ598En/605/MzterVy/MnDkTa9euxd69eyGlxOuvvw5fX1/ccMMNiIuLw6pVq/DZZ58BACIjIzF48GCzYGXSpEnIzMzEhg0bsGrVKkRFRdksmPHx8cGzzz6LL774Alu3bsUvv/wCPz8/dOnSBTNmzIC/v79NrktEjQl58bwtERERkQthzgwRERG5NAYzRERE5NIYzBAREZFLYzBDRERELo3BDBEREbk0BjNERETk0hjMEBERkUtjMENEREQujcEMERERuTQGM0REROTSGMwQERGRS2MwQ0RERC7t/wGZWzHQF91YdAAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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zTUoLy/H2rVrkZeXhzFjxliksvG0adPw119/4X//+x+6d++Oa665BiEhIcjIyMCaNWtw55131qqu3FoJCQm455578P7776N37976e/T999/D398fERERMBj4tzNZD3+6iOxs48aNWLp0aZ3/NfWv/kGDBulBxsCBA+tM3qw5W9OcfJn4+HgsXboUYWFheOedd/Dcc8/hueeea/LzLcnb2xtPP/00FEXRgyl3d3d88803WLZsGXr06IEffvgB8+fPxy+//AJFUTBnzhxMmTKl1rliYmKwadMmBAYG4r333sOKFSswaNAg/PTTT7Wad95777346KOPEB4ejqVLl+LTTz9F586dsXXrVgwaNKjJ458zZw7mz58Pb29vLFq0CF9//TUGDx6Mbdu2NWknVFMIIbBs2TJ88skniI+Px4oVK/DGG29g/fr1GDVqFK6++mqLXOd87777Lt544w34+fnhvffew2effYbx48fjt99+Q1FRkVlwSGRpQjZnqwYREVEzHD58GHFxcbjpppuwfPlyew+H2ijOzBARUatlZWXV6oNVWlqKRx55BADMcpCILI05M0RE1Gr/+c9/sHz5cowePRrh4eHIysrCH3/8gfT0dFx++eX4xz/+Ye8hUhvGYIaIiFrtkksuwe7du/Hrr78iLy8PRqMRcXFxePjhh/HII4/U22mdyBKYM0NEREROjTkzRERE5NQYzBAREZFTYzBDRERETo3BDBERETk1l9rNlJ+fz4Zn1KaFhIQgJyfH3sMgIrIIo9GoVzdv8DgbjMVhVFZWNruzLpGz0La+VlZWgpsUiciVcJmJiIiInBqDGSIiInJqDGaIiIjIqblUzkxDSkpKUFlZyZLb5NTOnj2L8vJym13Px8cHRiM/RojIvvgpBKCsrAxCCPj7+9t7KESt4u7ubrMkd0VRcObMGfj6+jKgISK74jIT1GDG29vb3sMgcioGgwHt2rVDaWmpvYdCRC6OwYwJl5eIms9g4EcIEdkfP4mIiIjIqTGYISIiIqfGYIaIiIicGoMZarLIyEj88ssvFj/v5MmT8fzzzzd4zBdffIH4+HiLX7sxjzzyCO68885WnSMtLQ2RkZFISkqy0Kgat2nTJkRGRqKwsNBm1yQisher7qf89ddf8euvv+qN7zp16oTJkydj4MCBAIDy8nIsW7YMmzZtQkVFBfr3749p06Yh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r2YfHx94eHjAx8cHY8eOxbJly+Dn5wcfHx98+OGHiIuLc+lgprH3TZOVlYUDBw7gqaeestNIHcvEiRPx9ttvIzY2Ft26dcNPP/2EsrIyjB49GgEBAXXO9gUHBzfpQ7WtOnfuHLKysvTb2dnZSElJgZ+fH4KDg1FcXIzc3Fzk5eUBgJ5/VN/76Soae9969eqFTz75BB4eHggJCcH+/fuxfv16TJ061Y6jtq/GPteysrKwYcMGDBo0CH5+fkhNTcXSpUsRHx+PqKgo+w7eztibyc5uuOGGOu+///77MXr0aADVRfM2btyIyspKFs1D0943APjss8/w119/4e2334bBwM17gFo077vvvkNBQQGio6Nxxx13oHv37nUee8MNN7h80bx9+/bhxRdfrHV/QkICHnjgAaxbtw7vvPNOrccnT55c78+pK2jsfSsoKMBnn32G3bt3o7i4GCEhIRg/fjyuvPJKl61x1NjnWm5uLv773/8iLS0NZWVl6NChA4YOHYrrrruuwY7SroDBDBERETk1/qlKRERETo3BDBERETk1BjNERETk1BjMEBERkVNjMENEREROjcEMEREROTUGM0REROTUGMwQERGRU2MwQ0RERE6NwQwRERE5NQYzRERE5NQYzBAREZFTYzBDRERETo3BDBERETk1BjNERETk1BjMEBERkVNjMENEREROjcEMEREROTUGM0REROTUGMwQERGRU2MwQ0RERE6NwQwRERE5NQYzRERE5NQYzBAREZFTM9p7AERUv7fffhvr168HALi5ucHPzw9dunTBRRddhNGjR8Ng4N8jREQMZogc3IABA3D//fdDURQUFBRg165d+Pjjj7F161bMmDEDbm5u9h4iEZFdMZghcnBGoxEBAQEAgKCgIMTGxiIuLg6zZ8/GunXrMG7cOJSUlOB///sftm/fjsrKSsTGxmLq1KmIjo7Wz7Njxw589dVXSE1NhZeXF3r27Il//etf9nlRREQWxDlqIifUp08fREVFYdu2bQCAN954A4WFhXj66afx6quvIiYmBnPmzEFxcTEAIDExEa+//joGDhyIuXPn4rnnnkO3bt3s+RKIiCyGMzNETioyMhInTpzAwYMHceTIESxevBju7u4AgNtuuw3bt2/Hli1bMH78eHz99de48MILccMNN+jPrzlrQ0TkzBjMEDkpKSWEEEhJScG5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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "attribution_gb['booked_pnl'] = 0\n", - "attribution_gb['booked_delta'] = 0\n", - "for date in booked_quantity[booked_quantity == True].index:\n", - " profit = (attribution_gb.loc[:date, 'Total_PnL'].sum() * q_change.loc[date]) - (q_change.loc[date] * 1.3)\n", - " delta_pnl = (attribution_gb.loc[date, 'Delta_PnL'] * q_change.loc[date])\n", - " attribution_gb.loc[date, 'booked_pnl'] = profit\n", - " attribution_gb.loc[date, 'booked_delta'] = delta_pnl\n", - " print(f\"Q Change {q_change.loc[date]} PnL {profit} on {date}\")\n", - "attribution_gb['q2'] = quantity_edit\n", - "attribution_gb['Total_with_rebalancing'] = attribution_gb['Total_PnL'] * attribution_gb['q2'] + attribution_gb['booked_pnl']\n", - "attribution_gb['Delta_PnL With Rebalancing'] = attribution_gb['Delta_PnL'] * attribution_gb['q2'] + attribution_gb['booked_delta']\n", - "attribution_gb['Full_PnL_No_Rebalancing'] = attribution_gb['Total_PnL'] * quantity\n", - "(attribution_gb * quantity).cumsum().plot(y = 'Total_PnL', title = 'PnL Without Rebalancing')\n", - "plt.show()\n", - "(attribution_gb).cumsum().plot(y = 'Total_with_rebalancing', title = 'PnL With Rebalancing')\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": 337, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Delta_PnLGamma_PnLTheta_PnLVega_PnLVolga_PnLVanna_PnLRho_PnLTotal_PnLUnexplained_PnLActual_PnLPricebooked_pnlq2Total_with_rebalancingbooked_deltaDelta_PnL With RebalancingFull_PnL_No_Rebalancing
Datetime
2023-12-2920.146776-0.959664-1.6842450.190445-0.0939820.252768-0.14150217.710597-0.21059717.55992.50264.0141.6847780161.17421141.684778
\n", - "
" - ], - "text/plain": [ - " Delta_PnL Gamma_PnL Theta_PnL Vega_PnL Volga_PnL Vanna_PnL \\\n", - "Datetime \n", - "2023-12-29 20.146776 -0.959664 -1.684245 0.190445 -0.093982 0.252768 \n", - "\n", - " Rho_PnL Total_PnL Unexplained_PnL Actual_PnL Price \\\n", - "Datetime \n", - "2023-12-29 -0.141502 17.710597 -0.210597 17.5 5992.5 \n", - "\n", - " booked_pnl q2 Total_with_rebalancing booked_delta \\\n", - "Datetime \n", - "2023-12-29 0 264.0 141.684778 0 \n", - "\n", - " Delta_PnL With Rebalancing Full_PnL_No_Rebalancing \n", - "Datetime \n", - "2023-12-29 161.17421 141.684778 " - ] - }, - "execution_count": 337, - "metadata": {}, - "output_type": "execute_result" - }, - { - "ename": "", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[1;31mThe Kernel crashed while executing code in the current cell or a previous cell. \n", - "\u001b[1;31mPlease review the code in the cell(s) to identify a possible cause of the failure. \n", - "\u001b[1;31mClick here for more info. \n", - "\u001b[1;31mView Jupyter log for further details." - ] - } - ], - "source": [ - "pd.options.display.max_columns = 100\n", - "attribution_gb.cumsum().tail(1) " - ] - }, - { - "cell_type": "code", - "execution_count": 294, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "' 20.14%'" - ] - }, - "execution_count": 294, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "f\"{attribution_gb.cumsum().Total_with_rebalancing[-1]/cash_used_position: .2%}\"" - ] - }, - { - "cell_type": "code", -<<<<<<< Updated upstream - "execution_count": 122, - "metadata": {}, - "outputs": [], - "source": [ - "# tick, entry, exit = '&L:META20220916C380&S:META20220916C385\t2021-11-16\t2021-11-29'.split('\\t')\n", - "# _, long, short = tick.split('&')\n", - "# long, short = long[2:], short[2:] \n", - "# price_data = evb_backtest.portfolio.options_data[long] - evb_backtest.portfolio.options_data[short]\n", - "# price_data.plot(y = 'Midpoint')\n", - "# price_data[(price_data.index >=entry) & (price_data.index <= exit)]\n", - "# # price_data#[price_data.index.isin(['2022-01-04', '2022-01-21'])]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## ***RANDOMS***" - ] - }, - { - "cell_type": "code", - "execution_count": 123, -======= - "execution_count": 137, ->>>>>>> Stashed changes - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "http://127.0.0.1:25510/v2/hist/option/eod?end_date=20240115&root=COST&use_csv=true&exp=20240621&right=C&start_date=20230703&strike=560000\n" - ] - }, - { - "data": { -<<<<<<< Updated upstream - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
OpenHighLowCloseVolumeBid_sizeCloseBidAsk_sizeCloseAskMidpointWeighted_midpoint
Datetime
2023-07-0343.2343.2343.2343.2314842.101045.1543.62542.625862
2023-07-0343.2343.2343.2343.2314842.101045.1543.62542.625862
2023-07-0543.2543.3243.2543.3221643.551044.9544.25044.088462
2023-07-0543.2543.3243.2543.3221643.551044.9544.25044.088462
2023-07-0642.0043.9042.0043.9041542.301544.4043.35043.350000
....................................
2024-01-080.000.000.000.00016118.257120.70119.475118.995652
2024-01-090.000.000.000.00021121.7531124.90123.325123.627885
2024-01-100.000.000.000.0006125.207132.05128.625128.888462
2024-01-110.000.000.000.0006125.606132.35128.975128.975000
2024-01-120.000.000.000.0006134.9017141.35138.125139.667391
\n", - "

257 rows × 11 columns

\n", - "
" - ], - "text/plain": [ - " Open High Low Close Volume Bid_size CloseBid Ask_size \\\n", - "Datetime \n", - "2023-07-03 43.23 43.23 43.23 43.23 1 48 42.10 10 \n", - "2023-07-03 43.23 43.23 43.23 43.23 1 48 42.10 10 \n", - "2023-07-05 43.25 43.32 43.25 43.32 2 16 43.55 10 \n", - "2023-07-05 43.25 43.32 43.25 43.32 2 16 43.55 10 \n", - "2023-07-06 42.00 43.90 42.00 43.90 4 15 42.30 15 \n", - "... ... ... ... ... ... ... ... ... \n", - "2024-01-08 0.00 0.00 0.00 0.00 0 16 118.25 7 \n", - "2024-01-09 0.00 0.00 0.00 0.00 0 21 121.75 31 \n", - "2024-01-10 0.00 0.00 0.00 0.00 0 6 125.20 7 \n", - "2024-01-11 0.00 0.00 0.00 0.00 0 6 125.60 6 \n", - "2024-01-12 0.00 0.00 0.00 0.00 0 6 134.90 17 \n", - "\n", - " CloseAsk Midpoint Weighted_midpoint \n", - "Datetime \n", - "2023-07-03 45.15 43.625 42.625862 \n", - "2023-07-03 45.15 43.625 42.625862 \n", - "2023-07-05 44.95 44.250 44.088462 \n", - "2023-07-05 44.95 44.250 44.088462 \n", - "2023-07-06 44.40 43.350 43.350000 \n", - "... ... ... ... \n", - "2024-01-08 120.70 119.475 118.995652 \n", - "2024-01-09 124.90 123.325 123.627885 \n", - "2024-01-10 132.05 128.625 128.888462 \n", - "2024-01-11 132.35 128.975 128.975000 \n", - "2024-01-12 141.35 138.125 139.667391 \n", - "\n", - "[257 rows x 11 columns]" - ] - }, - "execution_count": 123, -======= - "text/plain": [ - "" - ] - }, - "execution_count": 137, ->>>>>>> Stashed changes - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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uOKKK8jOzubLL7+koqKCG2+8kS5duvi7iQHvwIEDvPbaaxw4cIDc3FxuuukmTj/9dEmCG2n37t28/vrr7N27l6KiIv76178ydOjQVhE/6fnwgy1btnDSSSdxxRVXYLeb/wt2795tdTuKhn311VeEh4dz991306FDB/bt20deXh4pKSnExcURGhoqSUgDDh06xJo1a7j66qsZN24cYA4b7N271+qylfid2J49ezh8+DA333wz3bp1o3///gwdOpQbb7yRpUuXctlll0mP3AkcPHiQDh06cP7557N27Vpee+01Ro0aZf27KBq2c+dO4uPjmTRpEt988w2vvfYaQ4cOxWazBfzvsPwf9oMLL7yQY8eOWb9g+fn57Nixg+HDh5OZmUlGRoafWxjYrrrqKp588kk++eQTDh48yK5duwgLC6O4uJgBAwZw8803B/Qvnb8lJSXxwAMPWDHSWhMZGUlycjJbtmzhjDPOkPg1QmFhITk5OXTr1s3tWFRUFJs3b6Z///6cfvrp/mtgAHP+ZT5gwADS0tJIT08nOTmZb7/9lvnz53PllVe2ir/e/e2UU04hIyODLl26EBoayr/+9S+WLFnC5MmTAz75kP+zPrZ48WJeffVVli1bZk0qjYmJITk5GYAvvviCP/7xj9hsNjZt2sTMmTN5/fXXqaio8GezA0Zd8evatSvDhg3j/fffx263c9ttt/GnP/2JadOmsWbNGt555x1AJv05HR9Du92OUsrq5VBKERMTQ1VVFZWVlYDE7nh1fQ7j4+OJj4/n7bffts777LPPGDNmDCEhIfzwww+AxNLpu+++o7S0FMBKKqKiokhPTwcgMTGRKVOmsGTJEnJzc62/3oWprs9gXFycNbzXrVs3xo4dy3vvvUdZWRk2my2gJ5/KnA8fycrK4sknn8Rms5Gens6GDRvo1q0bV155Jb1797bOW7FiBfHx8QwYMAClFGvXrmXWrFk88cQT1i9le1Rf/KZOnUrfvn0pLS3lvffeY/z48VYiB/D++++zePFiXn75ZYKCgvz4DvyvsZ9B51+Y999/Px07duTGG28M+L+aWkpdMezSpQtXX301Xbp04eOPP2bu3LlkZGSwb98+YmNjmTlzJmvWrOGVV17hlVde8fdb8LstW7bw0ksvcejQIa699lomTJhQ77mFhYU8+uijxMfHc8cdd7RgKwPXiX6P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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ -<<<<<<< Updated upstream - "# COST20240621C550\n", - "retrieve_eod_ohlc('COST',\n", - " '2024-01-15',\n", - " '2024-06-21',\n", - " 'C',\n", - " '2023-07-03',\n", - " 560.0,\n", - " print_url=True)" -======= - "#0\t&L:NVDA20240119C380&S:NVDA20240119C450\n", - "price = (evb_backtest.portfolio.options_data['NVDA20240119C380'] - evb_backtest.portfolio.options_data['NVDA20240119C450']).copy()\n", - "price[price.index >= '2023-01-25']\n", - "# price[price.index.isin( ['2023-01-25', '2023-07-24'])]\n", - "price.plot(y = 'Midpoint')" ->>>>>>> Stashed changes - ] - }, - { - "cell_type": "code", - "execution_count": 124, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "-0.3666666666666666" - ] - }, - "execution_count": 124, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "(1.235/1.950)-1" - ] - }, - { - "cell_type": "code", - "execution_count": 125, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
longshorttrade_idclosequantitymarket_value
datetimesymbol
2023-01-19NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2652.000132600.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2652.000132600.0
2023-01-20NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2652.450133185.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2652.450133185.0
2023-01-23NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2652.250132925.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2652.250132925.0
2023-01-24NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2652.475133217.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2652.475133217.5
2023-01-25NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2652.350133055.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2652.350133055.0
2023-01-26NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2652.625133412.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2652.625133412.5
2023-01-27NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2652.425133152.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2652.425133152.5
2023-01-30NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2651.900132470.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2651.900132470.0
2023-01-31NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2652.225132892.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2652.225132892.5
2023-02-01NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.550134615.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.550134615.0
2023-02-02NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2652.950133835.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2652.950133835.0
2023-02-03NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.225134192.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.225134192.5
2023-02-06NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2652.850133705.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2652.850133705.0
2023-02-07NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.325134322.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.325134322.5
2023-02-08NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.400134420.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.400134420.0
2023-02-09NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.475134517.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.475134517.5
2023-02-10NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.125134062.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.125134062.5
2023-02-13NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.175134127.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.175134127.5
2023-02-14NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.500134550.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.500134550.0
2023-02-15NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.525134582.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.525134582.5
2023-02-16NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.275134257.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.275134257.5
2023-02-17NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2652.750133575.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2652.750133575.0
2023-02-20NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.825134972.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.825134972.5
2023-02-21NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.825134972.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.825134972.5
2023-02-22NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.550134615.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.550134615.0
2023-02-23NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.825134972.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.825134972.5
2023-02-24NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.450134485.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.450134485.0
2023-02-27NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2654.225135492.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2654.225135492.5
2023-02-28NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.425134452.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.425134452.5
2023-03-01NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.925135102.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.925135102.5
2023-03-02NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.375134387.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.375134387.5
2023-03-03NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2654.350135655.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2654.350135655.0
2023-03-06NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.950135135.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.950135135.0
2023-03-07NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.725134842.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.725134842.5
2023-03-08NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2654.400135720.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2654.400135720.0
2023-03-09NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.900135070.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.900135070.0
2023-03-10NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.775134907.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.775134907.5
2023-03-13NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.600134680.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.600134680.0
2023-03-14NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.800134940.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.800134940.0
2023-03-15NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.800134940.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2653.800134940.0
2023-03-16NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2654.475135817.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2654.475135817.5
2023-03-17NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2654.275135557.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2654.275135557.5
2023-03-20NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2654.875136337.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2654.875136337.5
2023-03-21NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2654.725136142.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2654.725136142.5
2023-03-22NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2656.350138255.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2656.350138255.0
2023-03-23NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2654.875136337.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2654.875136337.5
2023-03-24NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2654.325135622.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2654.325135622.5
2023-03-27NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2655.100136630.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2655.100136630.0
2023-03-28NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2654.600135980.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2654.600135980.0
2023-03-29NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2655.875137637.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2655.875137637.5
2023-03-30NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2654.925136402.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2654.925136402.5
2023-03-31NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2656.200138060.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2656.200138060.0
2023-04-03NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2655.025136532.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2655.025136532.5
2023-04-04NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2655.725137442.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2655.725137442.5
2023-04-05NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2654.550135915.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2654.550135915.0
2023-04-06NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2654.400135720.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2654.400135720.0
2023-04-07NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2654.400135720.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2654.400135720.0
2023-04-10NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2654.425135752.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2654.425135752.5
2023-04-11NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2655.750137475.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2655.750137475.0
2023-04-12NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2655.900137670.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2655.900137670.0
2023-04-13NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2654.850136305.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2654.850136305.0
2023-04-14NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2655.450137085.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2655.450137085.0
2023-04-17NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2655.400137020.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2655.400137020.0
2023-04-18NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2654.700136110.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2654.700136110.0
2023-04-19NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2655.100136630.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2655.100136630.0
2023-04-20NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2655.725137442.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2655.725137442.5
2023-04-21NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2656.050137865.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2656.050137865.0
2023-04-24NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2654.925136402.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2654.925136402.5
2023-04-25NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2655.225136792.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2655.225136792.5
2023-04-26NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2655.300136890.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2655.300136890.0
2023-04-27NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2655.300136890.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2655.300136890.0
2023-04-28NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2654.725136142.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2654.725136142.5
2023-05-01NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2655.775137507.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2655.775137507.5
2023-05-02NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2656.325138222.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2656.325138222.5
2023-05-03NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2655.225136792.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2655.225136792.5
2023-05-04NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2654.300135590.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2654.300135590.0
2023-05-05NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2657.300139490.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2657.300139490.0
2023-05-08NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2656.850138905.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2656.850138905.0
2023-05-09NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2656.125137962.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2656.125137962.5
2023-05-10NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2655.275136857.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2655.275136857.5
2023-05-11NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2655.100136630.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2655.100136630.0
2023-05-12NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2656.125137962.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2656.125137962.5
2023-05-15NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2657.000139100.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2657.000139100.0
2023-05-16NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2656.150137995.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2656.150137995.0
2023-05-17NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2655.250136825.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2655.250136825.0
2023-05-18NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2657.150139295.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2657.150139295.0
2023-05-19NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2657.325139522.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2657.325139522.5
2023-05-22NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2657.350139555.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2657.350139555.0
2023-05-23NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2657.400139620.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2657.400139620.0
2023-05-24NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2654.400135720.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2654.400135720.0
2023-05-25NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2657.200139360.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2657.200139360.0
2023-05-26NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2657.425139652.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2657.425139652.5
2023-05-29NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.1251310562.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.1251310562.5
2023-05-30NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.1251310562.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.1251310562.5
2023-05-31NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.0001310400.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.0001310400.0
2023-06-01NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2657.550139815.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2657.550139815.0
2023-06-02NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2657.9751310367.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2657.9751310367.5
2023-06-05NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.0001310400.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.0001310400.0
2023-06-06NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.2501310725.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.2501310725.0
2023-06-07NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.1751310627.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.1751310627.5
2023-06-08NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2657.8751310237.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2657.8751310237.5
2023-06-09NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.8251311472.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.8251311472.5
2023-06-12NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.2001310660.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.2001310660.0
2023-06-13NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2657.7501310075.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2657.7501310075.0
2023-06-14NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.4501310985.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.4501310985.0
2023-06-15NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.5251311082.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.5251311082.5
2023-06-16NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.5251311082.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.5251311082.5
2023-06-19NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.0001311700.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.0001311700.0
2023-06-20NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.0001311700.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.0001311700.0
2023-06-21NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.2751312057.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.2751312057.5
2023-06-22NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.0251311732.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.0251311732.5
2023-06-23NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2657.7001310010.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2657.7001310010.0
2023-06-26NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.3001310790.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.3001310790.0
2023-06-27NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.6251311212.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.6251311212.5
2023-06-28NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.0751311797.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.0751311797.5
2023-06-29NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.2501310725.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.2501310725.0
2023-06-30NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.4501312285.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.4501312285.0
2023-07-03NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.3251312122.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.3251312122.5
2023-07-04NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.5001311050.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.5001311050.0
2023-07-05NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.5001311050.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.5001311050.0
2023-07-06NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.3001310790.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.3001310790.0
2023-07-07NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.6501311245.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.6501311245.0
2023-07-10NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.9751311667.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.9751311667.5
2023-07-11NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.9751311667.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.9751311667.5
2023-07-12NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.7001312610.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.7001312610.0
2023-07-13NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.1501311895.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.1501311895.0
2023-07-14NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.3751312187.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.3751312187.5
2023-07-17NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.2501312025.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.2501312025.0
2023-07-18NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.9251311602.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.9251311602.5
2023-07-19NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.2001311960.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.2001311960.0
2023-07-20NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.1001311830.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.1001311830.0
2023-07-21NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.0751311797.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.0751311797.5
2023-07-24NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.0751311797.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.0751311797.5
2023-07-25NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.3251310822.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.3251310822.5
2023-07-26NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.4501312285.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.4501312285.0
2023-07-27NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.1501311895.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.1501311895.0
2023-07-28NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.7501311375.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.7501311375.0
2023-07-31NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.2751312057.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.2751312057.5
2023-08-01NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.1251311862.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.1251311862.5
2023-08-02NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.0751311797.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.0751311797.5
2023-08-03NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.1001311830.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.1001311830.0
2023-08-04NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.0751311797.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.0751311797.5
2023-08-07NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.0501311765.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.0501311765.0
2023-08-08NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.6251312512.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.6251312512.5
2023-08-09NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.0001311700.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.0001311700.0
2023-08-10NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.9501311635.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.9501311635.0
2023-08-11NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.8501311505.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.8501311505.0
2023-08-14NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.0751311797.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.0751311797.5
2023-08-15NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.9751311667.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2658.9751311667.5
2023-08-16NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.1251311862.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.1251311862.5
2023-08-17NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.0251311732.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.0251311732.5
2023-08-18NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.3001312090.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.3001312090.0
2023-08-21NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.4001312220.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.4001312220.0
2023-08-22NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.2001311960.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.2001311960.0
2023-08-23NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.4751312317.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.4751312317.5
2023-08-24NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.5751312447.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.5751312447.5
2023-08-25NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.4001312220.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.4001312220.0
2023-08-28NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.5001312350.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.5001312350.0
2023-08-29NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.4001312220.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.4001312220.0
2023-08-30NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.5501312415.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.5501312415.0
2023-08-31NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.5251312382.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.5251312382.5
2023-09-01NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.5751312447.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.5751312447.5
2023-09-04NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.5751312447.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.5751312447.5
2023-09-05NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.5751312447.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.5751312447.5
2023-09-06NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.5501312415.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.5501312415.0
2023-09-07NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.5751312447.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.5751312447.5
2023-09-08NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.5501312415.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.5501312415.0
2023-09-11NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.5251312382.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.5251312382.5
2023-09-12NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.4751312317.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.4751312317.5
2023-09-13NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.5251312382.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.5251312382.5
2023-09-14NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.6501312545.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.6501312545.0
2023-09-15NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.5251312382.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.5251312382.5
2023-09-18NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.5501312415.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.5501312415.0
2023-09-19NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.4751312317.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.4751312317.5
2023-09-20NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.4751312317.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.4751312317.5
2023-09-21NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.2751312057.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.2751312057.5
2023-09-22NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.3501312155.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.3501312155.0
2023-09-25NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.4251312252.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.4251312252.5
2023-09-26NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.4751312317.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.4751312317.5
2023-09-27NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.3251312122.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.3251312122.5
2023-09-28NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.7751312707.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.7751312707.5
2023-09-29NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.5501312415.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.5501312415.0
2023-10-02NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.4001312220.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.4001312220.0
2023-10-03NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.3001312090.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.3001312090.0
2023-10-04NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.0251311732.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.0251311732.5
2023-10-05NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C26510.5001313650.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C26510.5001313650.0
2023-10-06NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.4501312285.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.4501312285.0
2023-10-09NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.4251312252.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.4251312252.5
2023-10-10NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.3501312155.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.3501312155.0
2023-10-11NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.6501312545.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.6501312545.0
2023-10-12NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.6251312512.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.6251312512.5
2023-10-13NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.6751312577.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.6751312577.5
2023-10-16NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.3751312187.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.3751312187.5
2023-10-17NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.5251312382.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.5251312382.5
2023-10-18NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.0751311797.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.0751311797.5
2023-10-19NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.4251312252.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.4251312252.5
2023-10-20NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.4501312285.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.4501312285.0
2023-10-23NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C26510.3001313390.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C26510.3001313390.0
2023-10-24NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.6001312480.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.6001312480.0
2023-10-25NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.0751311797.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.0751311797.5
2023-10-26NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.5251312382.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.5251312382.5
2023-10-27NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.5251312382.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.5251312382.5
2023-10-30NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.2001311960.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.2001311960.0
2023-10-31NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.8001312740.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.8001312740.0
2023-11-01NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.7001312610.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.7001312610.0
2023-11-02NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.9001312870.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.9001312870.0
2023-11-03NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.9751312967.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.9751312967.5
2023-11-06NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.6001312480.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.6001312480.0
2023-11-07NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.7251312642.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.7251312642.5
2023-11-08NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.6251312512.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.6251312512.5
2023-11-09NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.8001312740.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.8001312740.0
2023-11-10NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.4501312285.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.4501312285.0
2023-11-13NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.8001312740.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.8001312740.0
2023-11-14NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.7751312707.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.7751312707.5
2023-11-15NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C26510.0501313065.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C26510.0501313065.0
2023-11-16NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.8001312740.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.8001312740.0
2023-11-17NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.9501312935.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.9501312935.0
2023-11-20NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C26510.2501313325.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C26510.2501313325.0
2023-11-21NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C26510.0501313065.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C26510.0501313065.0
2023-11-22NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.7251312642.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.7251312642.5
2023-11-23NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.7251312642.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.7251312642.5
2023-11-24NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.8501312805.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.8501312805.0
2023-11-27NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.9251312902.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.9251312902.5
2023-11-28NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.9251312902.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.9251312902.5
2023-11-29NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.9001312870.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.9001312870.0
2023-11-30NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.8501312805.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.8501312805.0
2023-12-01NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.9751312967.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.9751312967.5
2023-12-04NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.6751312577.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.6751312577.5
2023-12-05NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C26510.0001313000.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C26510.0001313000.0
2023-12-06NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.9501312935.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.9501312935.0
2023-12-07NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C26510.0001313000.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C26510.0001313000.0
2023-12-08NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.9251312902.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.9251312902.5
2023-12-11NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.9251312902.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.9251312902.5
2023-12-12NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.8251312772.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.8251312772.5
2023-12-13NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C26510.1001313130.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C26510.1001313130.0
2023-12-14NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.9001312870.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.9001312870.0
2023-12-15NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C26510.0251313032.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C26510.0251313032.5
2023-12-18NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.9251312902.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.9251312902.5
2023-12-19NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.8751312837.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.8751312837.5
2023-12-20NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.9751312967.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.9751312967.5
2023-12-21NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C26510.1001313130.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C26510.1001313130.0
2023-12-22NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.9251312902.5
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.9251312902.5
2023-12-25NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.9501312935.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.9501312935.0
2023-12-26NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.9501312935.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.9501312935.0
2023-12-27NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.9501312935.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C2659.9501312935.0
2023-12-28NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C26510.0501313065.0
NVDA[NVDA20240119C255][NVDA20240119C265]&L:NVDA20240119C255&S:NVDA20240119C26510.0501313065.0
\n", - "
" - ], - "text/plain": [ - " long short \\\n", - "datetime symbol \n", - "2023-01-19 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-01-20 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-01-23 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-01-24 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-01-25 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-01-26 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-01-27 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-01-30 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-01-31 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-02-01 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-02-02 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-02-03 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-02-06 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-02-07 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-02-08 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-02-09 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-02-10 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-02-13 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-02-14 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-02-15 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-02-16 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-02-17 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-02-20 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-02-21 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-02-22 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-02-23 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-02-24 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-02-27 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-02-28 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-03-01 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-03-02 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-03-03 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-03-06 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-03-07 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-03-08 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-03-09 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-03-10 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-03-13 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-03-14 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-03-15 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-03-16 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-03-17 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-03-20 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-03-21 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-03-22 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-03-23 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-03-24 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-03-27 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-03-28 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-03-29 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-03-30 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-03-31 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-04-03 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-04-04 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-04-05 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-04-06 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-04-07 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-04-10 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-04-11 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-04-12 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-04-13 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-04-14 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-04-17 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-04-18 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-04-19 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-04-20 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-04-21 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-04-24 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-04-25 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-04-26 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-04-27 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-04-28 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-05-01 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-05-02 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-05-03 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-05-04 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-05-05 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-05-08 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-05-09 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-05-10 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-05-11 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-05-12 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-05-15 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-05-16 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-05-17 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-05-18 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-05-19 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-05-22 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-05-23 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-05-24 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-05-25 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-05-26 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-05-29 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-05-30 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-05-31 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-06-01 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-06-02 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-06-05 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-06-06 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-06-07 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-06-08 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-06-09 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-06-12 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-06-13 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-06-14 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-06-15 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-06-16 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-06-19 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-06-20 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-06-21 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-06-22 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-06-23 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-06-26 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-06-27 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-06-28 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-06-29 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-06-30 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-07-03 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-07-04 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-07-05 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-07-06 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-07-07 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-07-10 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-07-11 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-07-12 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-07-13 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-07-14 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-07-17 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-07-18 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-07-19 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-07-20 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-07-21 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-07-24 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-07-25 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-07-26 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-07-27 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-07-28 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-07-31 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-08-01 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-08-02 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-08-03 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-08-04 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-08-07 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-08-08 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-08-09 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-08-10 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-08-11 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-08-14 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-08-15 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-08-16 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-08-17 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-08-18 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-08-21 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-08-22 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-08-23 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-08-24 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-08-25 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-08-28 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-08-29 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-08-30 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-08-31 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-09-01 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-09-04 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-09-05 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-09-06 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-09-07 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-09-08 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-09-11 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-09-12 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-09-13 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-09-14 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-09-15 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-09-18 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-09-19 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-09-20 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-09-21 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-09-22 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-09-25 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-09-26 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-09-27 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-09-28 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-09-29 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-10-02 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-10-03 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-10-04 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-10-05 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-10-06 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-10-09 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-10-10 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-10-11 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-10-12 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-10-13 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-10-16 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-10-17 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-10-18 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-10-19 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-10-20 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-10-23 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-10-24 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-10-25 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-10-26 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-10-27 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-10-30 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-10-31 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-11-01 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-11-02 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-11-03 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-11-06 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-11-07 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-11-08 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-11-09 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-11-10 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-11-13 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-11-14 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-11-15 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-11-16 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-11-17 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-11-20 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-11-21 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-11-22 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-11-23 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-11-24 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-11-27 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-11-28 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-11-29 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-11-30 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-12-01 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-12-04 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-12-05 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-12-06 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-12-07 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-12-08 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-12-11 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-12-12 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-12-13 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-12-14 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-12-15 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-12-18 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-12-19 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-12-20 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-12-21 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-12-22 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-12-25 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-12-26 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-12-27 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "2023-12-28 NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - " NVDA [NVDA20240119C255] [NVDA20240119C265] \n", - "\n", - " trade_id close quantity \\\n", - "datetime symbol \n", - "2023-01-19 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 2.000 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 2.000 13 \n", - "2023-01-20 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 2.450 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 2.450 13 \n", - "2023-01-23 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 2.250 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 2.250 13 \n", - "2023-01-24 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 2.475 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 2.475 13 \n", - "2023-01-25 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 2.350 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 2.350 13 \n", - "2023-01-26 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 2.625 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 2.625 13 \n", - "2023-01-27 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 2.425 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 2.425 13 \n", - "2023-01-30 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 1.900 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 1.900 13 \n", - "2023-01-31 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 2.225 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 2.225 13 \n", - "2023-02-01 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.550 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.550 13 \n", - "2023-02-02 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 2.950 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 2.950 13 \n", - "2023-02-03 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.225 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.225 13 \n", - "2023-02-06 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 2.850 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 2.850 13 \n", - "2023-02-07 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.325 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.325 13 \n", - "2023-02-08 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.400 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.400 13 \n", - "2023-02-09 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.475 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.475 13 \n", - "2023-02-10 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.125 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.125 13 \n", - "2023-02-13 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.175 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.175 13 \n", - "2023-02-14 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.500 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.500 13 \n", - "2023-02-15 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.525 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.525 13 \n", - "2023-02-16 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.275 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.275 13 \n", - "2023-02-17 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 2.750 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 2.750 13 \n", - "2023-02-20 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.825 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.825 13 \n", - "2023-02-21 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.825 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.825 13 \n", - "2023-02-22 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.550 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.550 13 \n", - "2023-02-23 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.825 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.825 13 \n", - "2023-02-24 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.450 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.450 13 \n", - "2023-02-27 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 4.225 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 4.225 13 \n", - "2023-02-28 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.425 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.425 13 \n", - "2023-03-01 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.925 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.925 13 \n", - "2023-03-02 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.375 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.375 13 \n", - "2023-03-03 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 4.350 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 4.350 13 \n", - "2023-03-06 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.950 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.950 13 \n", - "2023-03-07 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.725 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.725 13 \n", - "2023-03-08 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 4.400 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 4.400 13 \n", - "2023-03-09 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.900 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.900 13 \n", - "2023-03-10 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.775 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.775 13 \n", - "2023-03-13 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.600 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.600 13 \n", - "2023-03-14 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.800 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.800 13 \n", - "2023-03-15 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.800 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 3.800 13 \n", - "2023-03-16 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 4.475 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 4.475 13 \n", - "2023-03-17 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 4.275 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 4.275 13 \n", - "2023-03-20 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 4.875 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 4.875 13 \n", - "2023-03-21 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 4.725 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 4.725 13 \n", - "2023-03-22 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 6.350 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 6.350 13 \n", - "2023-03-23 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 4.875 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 4.875 13 \n", - "2023-03-24 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 4.325 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 4.325 13 \n", - "2023-03-27 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 5.100 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 5.100 13 \n", - "2023-03-28 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 4.600 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 4.600 13 \n", - "2023-03-29 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 5.875 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 5.875 13 \n", - "2023-03-30 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 4.925 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 4.925 13 \n", - "2023-03-31 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 6.200 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 6.200 13 \n", - "2023-04-03 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 5.025 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 5.025 13 \n", - "2023-04-04 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 5.725 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 5.725 13 \n", - "2023-04-05 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 4.550 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 4.550 13 \n", - "2023-04-06 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 4.400 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 4.400 13 \n", - "2023-04-07 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 4.400 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 4.400 13 \n", - "2023-04-10 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 4.425 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 4.425 13 \n", - "2023-04-11 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 5.750 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 5.750 13 \n", - "2023-04-12 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 5.900 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 5.900 13 \n", - "2023-04-13 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 4.850 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 4.850 13 \n", - "2023-04-14 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 5.450 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 5.450 13 \n", - "2023-04-17 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 5.400 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 5.400 13 \n", - "2023-04-18 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 4.700 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 4.700 13 \n", - "2023-04-19 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 5.100 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 5.100 13 \n", - "2023-04-20 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 5.725 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 5.725 13 \n", - "2023-04-21 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 6.050 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 6.050 13 \n", - "2023-04-24 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 4.925 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 4.925 13 \n", - "2023-04-25 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 5.225 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 5.225 13 \n", - "2023-04-26 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 5.300 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 5.300 13 \n", - "2023-04-27 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 5.300 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 5.300 13 \n", - "2023-04-28 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 4.725 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 4.725 13 \n", - "2023-05-01 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 5.775 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 5.775 13 \n", - "2023-05-02 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 6.325 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 6.325 13 \n", - "2023-05-03 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 5.225 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 5.225 13 \n", - "2023-05-04 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 4.300 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 4.300 13 \n", - "2023-05-05 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 7.300 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 7.300 13 \n", - "2023-05-08 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 6.850 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 6.850 13 \n", - "2023-05-09 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 6.125 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 6.125 13 \n", - "2023-05-10 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 5.275 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 5.275 13 \n", - "2023-05-11 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 5.100 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 5.100 13 \n", - "2023-05-12 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 6.125 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 6.125 13 \n", - "2023-05-15 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 7.000 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 7.000 13 \n", - "2023-05-16 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 6.150 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 6.150 13 \n", - "2023-05-17 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 5.250 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 5.250 13 \n", - "2023-05-18 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 7.150 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 7.150 13 \n", - "2023-05-19 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 7.325 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 7.325 13 \n", - "2023-05-22 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 7.350 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 7.350 13 \n", - "2023-05-23 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 7.400 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 7.400 13 \n", - "2023-05-24 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 4.400 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 4.400 13 \n", - "2023-05-25 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 7.200 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 7.200 13 \n", - "2023-05-26 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 7.425 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 7.425 13 \n", - "2023-05-29 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.125 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.125 13 \n", - "2023-05-30 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.125 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.125 13 \n", - "2023-05-31 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.000 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.000 13 \n", - "2023-06-01 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 7.550 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 7.550 13 \n", - "2023-06-02 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 7.975 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 7.975 13 \n", - "2023-06-05 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.000 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.000 13 \n", - "2023-06-06 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.250 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.250 13 \n", - "2023-06-07 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.175 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.175 13 \n", - "2023-06-08 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 7.875 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 7.875 13 \n", - "2023-06-09 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.825 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.825 13 \n", - "2023-06-12 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.200 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.200 13 \n", - "2023-06-13 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 7.750 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 7.750 13 \n", - "2023-06-14 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.450 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.450 13 \n", - "2023-06-15 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.525 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.525 13 \n", - "2023-06-16 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.525 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.525 13 \n", - "2023-06-19 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.000 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.000 13 \n", - "2023-06-20 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.000 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.000 13 \n", - "2023-06-21 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.275 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.275 13 \n", - "2023-06-22 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.025 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.025 13 \n", - "2023-06-23 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 7.700 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 7.700 13 \n", - "2023-06-26 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.300 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.300 13 \n", - "2023-06-27 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.625 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.625 13 \n", - "2023-06-28 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.075 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.075 13 \n", - "2023-06-29 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.250 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.250 13 \n", - "2023-06-30 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.450 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.450 13 \n", - "2023-07-03 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.325 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.325 13 \n", - "2023-07-04 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.500 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.500 13 \n", - "2023-07-05 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.500 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.500 13 \n", - "2023-07-06 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.300 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.300 13 \n", - "2023-07-07 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.650 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.650 13 \n", - "2023-07-10 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.975 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.975 13 \n", - "2023-07-11 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.975 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.975 13 \n", - "2023-07-12 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.700 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.700 13 \n", - "2023-07-13 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.150 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.150 13 \n", - "2023-07-14 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.375 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.375 13 \n", - "2023-07-17 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.250 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.250 13 \n", - "2023-07-18 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.925 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.925 13 \n", - "2023-07-19 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.200 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.200 13 \n", - "2023-07-20 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.100 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.100 13 \n", - "2023-07-21 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.075 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.075 13 \n", - "2023-07-24 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.075 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.075 13 \n", - "2023-07-25 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.325 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.325 13 \n", - "2023-07-26 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.450 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.450 13 \n", - "2023-07-27 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.150 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.150 13 \n", - "2023-07-28 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.750 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.750 13 \n", - "2023-07-31 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.275 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.275 13 \n", - "2023-08-01 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.125 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.125 13 \n", - "2023-08-02 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.075 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.075 13 \n", - "2023-08-03 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.100 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.100 13 \n", - "2023-08-04 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.075 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.075 13 \n", - "2023-08-07 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.050 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.050 13 \n", - "2023-08-08 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.625 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.625 13 \n", - "2023-08-09 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.000 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.000 13 \n", - "2023-08-10 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.950 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.950 13 \n", - "2023-08-11 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.850 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.850 13 \n", - "2023-08-14 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.075 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.075 13 \n", - "2023-08-15 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.975 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 8.975 13 \n", - "2023-08-16 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.125 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.125 13 \n", - "2023-08-17 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.025 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.025 13 \n", - "2023-08-18 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.300 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.300 13 \n", - "2023-08-21 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.400 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.400 13 \n", - "2023-08-22 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.200 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.200 13 \n", - "2023-08-23 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.475 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.475 13 \n", - "2023-08-24 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.575 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.575 13 \n", - "2023-08-25 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.400 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.400 13 \n", - "2023-08-28 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.500 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.500 13 \n", - "2023-08-29 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.400 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.400 13 \n", - "2023-08-30 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.550 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.550 13 \n", - "2023-08-31 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.525 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.525 13 \n", - "2023-09-01 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.575 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.575 13 \n", - "2023-09-04 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.575 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.575 13 \n", - "2023-09-05 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.575 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.575 13 \n", - "2023-09-06 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.550 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.550 13 \n", - "2023-09-07 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.575 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.575 13 \n", - "2023-09-08 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.550 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.550 13 \n", - "2023-09-11 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.525 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.525 13 \n", - "2023-09-12 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.475 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.475 13 \n", - "2023-09-13 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.525 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.525 13 \n", - "2023-09-14 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.650 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.650 13 \n", - "2023-09-15 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.525 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.525 13 \n", - "2023-09-18 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.550 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.550 13 \n", - "2023-09-19 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.475 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.475 13 \n", - "2023-09-20 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.475 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.475 13 \n", - "2023-09-21 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.275 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.275 13 \n", - "2023-09-22 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.350 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.350 13 \n", - "2023-09-25 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.425 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.425 13 \n", - "2023-09-26 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.475 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.475 13 \n", - "2023-09-27 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.325 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.325 13 \n", - "2023-09-28 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.775 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.775 13 \n", - "2023-09-29 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.550 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.550 13 \n", - "2023-10-02 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.400 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.400 13 \n", - "2023-10-03 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.300 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.300 13 \n", - "2023-10-04 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.025 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.025 13 \n", - "2023-10-05 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 10.500 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 10.500 13 \n", - "2023-10-06 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.450 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.450 13 \n", - "2023-10-09 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.425 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.425 13 \n", - "2023-10-10 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.350 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.350 13 \n", - "2023-10-11 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.650 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.650 13 \n", - "2023-10-12 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.625 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.625 13 \n", - "2023-10-13 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.675 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.675 13 \n", - "2023-10-16 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.375 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.375 13 \n", - "2023-10-17 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.525 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.525 13 \n", - "2023-10-18 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.075 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.075 13 \n", - "2023-10-19 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.425 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.425 13 \n", - "2023-10-20 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.450 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.450 13 \n", - "2023-10-23 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 10.300 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 10.300 13 \n", - "2023-10-24 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.600 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.600 13 \n", - "2023-10-25 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.075 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.075 13 \n", - "2023-10-26 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.525 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.525 13 \n", - "2023-10-27 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.525 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.525 13 \n", - "2023-10-30 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.200 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.200 13 \n", - "2023-10-31 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.800 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.800 13 \n", - "2023-11-01 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.700 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.700 13 \n", - "2023-11-02 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.900 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.900 13 \n", - "2023-11-03 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.975 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.975 13 \n", - "2023-11-06 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.600 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.600 13 \n", - "2023-11-07 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.725 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.725 13 \n", - "2023-11-08 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.625 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.625 13 \n", - "2023-11-09 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.800 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.800 13 \n", - "2023-11-10 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.450 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.450 13 \n", - "2023-11-13 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.800 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.800 13 \n", - "2023-11-14 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.775 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.775 13 \n", - "2023-11-15 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 10.050 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 10.050 13 \n", - "2023-11-16 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.800 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.800 13 \n", - "2023-11-17 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.950 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.950 13 \n", - "2023-11-20 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 10.250 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 10.250 13 \n", - "2023-11-21 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 10.050 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 10.050 13 \n", - "2023-11-22 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.725 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.725 13 \n", - "2023-11-23 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.725 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.725 13 \n", - "2023-11-24 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.850 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.850 13 \n", - "2023-11-27 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.925 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.925 13 \n", - "2023-11-28 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.925 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.925 13 \n", - "2023-11-29 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.900 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.900 13 \n", - "2023-11-30 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.850 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.850 13 \n", - "2023-12-01 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.975 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.975 13 \n", - "2023-12-04 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.675 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.675 13 \n", - "2023-12-05 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 10.000 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 10.000 13 \n", - "2023-12-06 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.950 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.950 13 \n", - "2023-12-07 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 10.000 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 10.000 13 \n", - "2023-12-08 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.925 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.925 13 \n", - "2023-12-11 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.925 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.925 13 \n", - "2023-12-12 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.825 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.825 13 \n", - "2023-12-13 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 10.100 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 10.100 13 \n", - "2023-12-14 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.900 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.900 13 \n", - "2023-12-15 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 10.025 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 10.025 13 \n", - "2023-12-18 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.925 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.925 13 \n", - "2023-12-19 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.875 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.875 13 \n", - "2023-12-20 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.975 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.975 13 \n", - "2023-12-21 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 10.100 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 10.100 13 \n", - "2023-12-22 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.925 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.925 13 \n", - "2023-12-25 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.950 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.950 13 \n", - "2023-12-26 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.950 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.950 13 \n", - "2023-12-27 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.950 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 9.950 13 \n", - "2023-12-28 NVDA &L:NVDA20240119C255&S:NVDA20240119C265 10.050 13 \n", - " NVDA &L:NVDA20240119C255&S:NVDA20240119C265 10.050 13 \n", - "\n", - " market_value \n", - "datetime symbol \n", - "2023-01-19 NVDA 2600.0 \n", - " NVDA 2600.0 \n", - "2023-01-20 NVDA 3185.0 \n", - " NVDA 3185.0 \n", - "2023-01-23 NVDA 2925.0 \n", - " NVDA 2925.0 \n", - "2023-01-24 NVDA 3217.5 \n", - " NVDA 3217.5 \n", - "2023-01-25 NVDA 3055.0 \n", - " NVDA 3055.0 \n", - "2023-01-26 NVDA 3412.5 \n", - " NVDA 3412.5 \n", - "2023-01-27 NVDA 3152.5 \n", - " NVDA 3152.5 \n", - "2023-01-30 NVDA 2470.0 \n", - " NVDA 2470.0 \n", - "2023-01-31 NVDA 2892.5 \n", - " NVDA 2892.5 \n", - "2023-02-01 NVDA 4615.0 \n", - " NVDA 4615.0 \n", - "2023-02-02 NVDA 3835.0 \n", - " NVDA 3835.0 \n", - "2023-02-03 NVDA 4192.5 \n", - " NVDA 4192.5 \n", - "2023-02-06 NVDA 3705.0 \n", - " NVDA 3705.0 \n", - "2023-02-07 NVDA 4322.5 \n", - " NVDA 4322.5 \n", - "2023-02-08 NVDA 4420.0 \n", - " NVDA 4420.0 \n", - "2023-02-09 NVDA 4517.5 \n", - " NVDA 4517.5 \n", - "2023-02-10 NVDA 4062.5 \n", - " NVDA 4062.5 \n", - "2023-02-13 NVDA 4127.5 \n", - " NVDA 4127.5 \n", - "2023-02-14 NVDA 4550.0 \n", - " NVDA 4550.0 \n", - "2023-02-15 NVDA 4582.5 \n", - " NVDA 4582.5 \n", - "2023-02-16 NVDA 4257.5 \n", - " NVDA 4257.5 \n", - "2023-02-17 NVDA 3575.0 \n", - " NVDA 3575.0 \n", - "2023-02-20 NVDA 4972.5 \n", - " NVDA 4972.5 \n", - "2023-02-21 NVDA 4972.5 \n", - " NVDA 4972.5 \n", - "2023-02-22 NVDA 4615.0 \n", - " NVDA 4615.0 \n", - "2023-02-23 NVDA 4972.5 \n", - " NVDA 4972.5 \n", - "2023-02-24 NVDA 4485.0 \n", - " NVDA 4485.0 \n", - "2023-02-27 NVDA 5492.5 \n", - " NVDA 5492.5 \n", - "2023-02-28 NVDA 4452.5 \n", - " NVDA 4452.5 \n", - "2023-03-01 NVDA 5102.5 \n", - " NVDA 5102.5 \n", - "2023-03-02 NVDA 4387.5 \n", - " NVDA 4387.5 \n", - "2023-03-03 NVDA 5655.0 \n", - " NVDA 5655.0 \n", - "2023-03-06 NVDA 5135.0 \n", - " NVDA 5135.0 \n", - "2023-03-07 NVDA 4842.5 \n", - " NVDA 4842.5 \n", - "2023-03-08 NVDA 5720.0 \n", - " NVDA 5720.0 \n", - "2023-03-09 NVDA 5070.0 \n", - " NVDA 5070.0 \n", - "2023-03-10 NVDA 4907.5 \n", - " NVDA 4907.5 \n", - "2023-03-13 NVDA 4680.0 \n", - " NVDA 4680.0 \n", - "2023-03-14 NVDA 4940.0 \n", - " NVDA 4940.0 \n", - "2023-03-15 NVDA 4940.0 \n", - " NVDA 4940.0 \n", - "2023-03-16 NVDA 5817.5 \n", - " NVDA 5817.5 \n", - "2023-03-17 NVDA 5557.5 \n", - " NVDA 5557.5 \n", - "2023-03-20 NVDA 6337.5 \n", - " NVDA 6337.5 \n", - "2023-03-21 NVDA 6142.5 \n", - " NVDA 6142.5 \n", - "2023-03-22 NVDA 8255.0 \n", - " NVDA 8255.0 \n", - "2023-03-23 NVDA 6337.5 \n", - " NVDA 6337.5 \n", - "2023-03-24 NVDA 5622.5 \n", - " NVDA 5622.5 \n", - "2023-03-27 NVDA 6630.0 \n", - " NVDA 6630.0 \n", - "2023-03-28 NVDA 5980.0 \n", - " NVDA 5980.0 \n", - "2023-03-29 NVDA 7637.5 \n", - " NVDA 7637.5 \n", - "2023-03-30 NVDA 6402.5 \n", - " NVDA 6402.5 \n", - "2023-03-31 NVDA 8060.0 \n", - " NVDA 8060.0 \n", - "2023-04-03 NVDA 6532.5 \n", - " NVDA 6532.5 \n", - "2023-04-04 NVDA 7442.5 \n", - " NVDA 7442.5 \n", - "2023-04-05 NVDA 5915.0 \n", - " NVDA 5915.0 \n", - "2023-04-06 NVDA 5720.0 \n", - " NVDA 5720.0 \n", - "2023-04-07 NVDA 5720.0 \n", - " NVDA 5720.0 \n", - "2023-04-10 NVDA 5752.5 \n", - " NVDA 5752.5 \n", - "2023-04-11 NVDA 7475.0 \n", - " NVDA 7475.0 \n", - "2023-04-12 NVDA 7670.0 \n", - " NVDA 7670.0 \n", - "2023-04-13 NVDA 6305.0 \n", - " NVDA 6305.0 \n", - "2023-04-14 NVDA 7085.0 \n", - " NVDA 7085.0 \n", - "2023-04-17 NVDA 7020.0 \n", - " NVDA 7020.0 \n", - "2023-04-18 NVDA 6110.0 \n", - " NVDA 6110.0 \n", - "2023-04-19 NVDA 6630.0 \n", - " NVDA 6630.0 \n", - "2023-04-20 NVDA 7442.5 \n", - " NVDA 7442.5 \n", - "2023-04-21 NVDA 7865.0 \n", - " NVDA 7865.0 \n", - "2023-04-24 NVDA 6402.5 \n", - " NVDA 6402.5 \n", - "2023-04-25 NVDA 6792.5 \n", - " NVDA 6792.5 \n", - "2023-04-26 NVDA 6890.0 \n", - " NVDA 6890.0 \n", - "2023-04-27 NVDA 6890.0 \n", - " NVDA 6890.0 \n", - "2023-04-28 NVDA 6142.5 \n", - " NVDA 6142.5 \n", - "2023-05-01 NVDA 7507.5 \n", - " NVDA 7507.5 \n", - "2023-05-02 NVDA 8222.5 \n", - " NVDA 8222.5 \n", - "2023-05-03 NVDA 6792.5 \n", - " NVDA 6792.5 \n", - "2023-05-04 NVDA 5590.0 \n", - " NVDA 5590.0 \n", - "2023-05-05 NVDA 9490.0 \n", - " NVDA 9490.0 \n", - "2023-05-08 NVDA 8905.0 \n", - " NVDA 8905.0 \n", - "2023-05-09 NVDA 7962.5 \n", - " NVDA 7962.5 \n", - "2023-05-10 NVDA 6857.5 \n", - " NVDA 6857.5 \n", - "2023-05-11 NVDA 6630.0 \n", - " NVDA 6630.0 \n", - "2023-05-12 NVDA 7962.5 \n", - " NVDA 7962.5 \n", - "2023-05-15 NVDA 9100.0 \n", - " NVDA 9100.0 \n", - "2023-05-16 NVDA 7995.0 \n", - " NVDA 7995.0 \n", - "2023-05-17 NVDA 6825.0 \n", - " NVDA 6825.0 \n", - "2023-05-18 NVDA 9295.0 \n", - " NVDA 9295.0 \n", - "2023-05-19 NVDA 9522.5 \n", - " NVDA 9522.5 \n", - "2023-05-22 NVDA 9555.0 \n", - " NVDA 9555.0 \n", - "2023-05-23 NVDA 9620.0 \n", - " NVDA 9620.0 \n", - "2023-05-24 NVDA 5720.0 \n", - " NVDA 5720.0 \n", - "2023-05-25 NVDA 9360.0 \n", - " NVDA 9360.0 \n", - "2023-05-26 NVDA 9652.5 \n", - " NVDA 9652.5 \n", - "2023-05-29 NVDA 10562.5 \n", - " NVDA 10562.5 \n", - "2023-05-30 NVDA 10562.5 \n", - " NVDA 10562.5 \n", - "2023-05-31 NVDA 10400.0 \n", - " NVDA 10400.0 \n", - "2023-06-01 NVDA 9815.0 \n", - " NVDA 9815.0 \n", - "2023-06-02 NVDA 10367.5 \n", - " NVDA 10367.5 \n", - "2023-06-05 NVDA 10400.0 \n", - " NVDA 10400.0 \n", - "2023-06-06 NVDA 10725.0 \n", - " NVDA 10725.0 \n", - "2023-06-07 NVDA 10627.5 \n", - " NVDA 10627.5 \n", - "2023-06-08 NVDA 10237.5 \n", - " NVDA 10237.5 \n", - "2023-06-09 NVDA 11472.5 \n", - " NVDA 11472.5 \n", - "2023-06-12 NVDA 10660.0 \n", - " NVDA 10660.0 \n", - "2023-06-13 NVDA 10075.0 \n", - " NVDA 10075.0 \n", - "2023-06-14 NVDA 10985.0 \n", - " NVDA 10985.0 \n", - "2023-06-15 NVDA 11082.5 \n", - " NVDA 11082.5 \n", - "2023-06-16 NVDA 11082.5 \n", - " NVDA 11082.5 \n", - "2023-06-19 NVDA 11700.0 \n", - " NVDA 11700.0 \n", - "2023-06-20 NVDA 11700.0 \n", - " NVDA 11700.0 \n", - "2023-06-21 NVDA 12057.5 \n", - " NVDA 12057.5 \n", - "2023-06-22 NVDA 11732.5 \n", - " NVDA 11732.5 \n", - "2023-06-23 NVDA 10010.0 \n", - " NVDA 10010.0 \n", - "2023-06-26 NVDA 10790.0 \n", - " NVDA 10790.0 \n", - "2023-06-27 NVDA 11212.5 \n", - " NVDA 11212.5 \n", - "2023-06-28 NVDA 11797.5 \n", - " NVDA 11797.5 \n", - "2023-06-29 NVDA 10725.0 \n", - " NVDA 10725.0 \n", - "2023-06-30 NVDA 12285.0 \n", - " NVDA 12285.0 \n", - "2023-07-03 NVDA 12122.5 \n", - " NVDA 12122.5 \n", - "2023-07-04 NVDA 11050.0 \n", - " NVDA 11050.0 \n", - "2023-07-05 NVDA 11050.0 \n", - " NVDA 11050.0 \n", - "2023-07-06 NVDA 10790.0 \n", - " NVDA 10790.0 \n", - "2023-07-07 NVDA 11245.0 \n", - " NVDA 11245.0 \n", - "2023-07-10 NVDA 11667.5 \n", - " NVDA 11667.5 \n", - "2023-07-11 NVDA 11667.5 \n", - " NVDA 11667.5 \n", - "2023-07-12 NVDA 12610.0 \n", - " NVDA 12610.0 \n", - "2023-07-13 NVDA 11895.0 \n", - " NVDA 11895.0 \n", - "2023-07-14 NVDA 12187.5 \n", - " NVDA 12187.5 \n", - "2023-07-17 NVDA 12025.0 \n", - " NVDA 12025.0 \n", - "2023-07-18 NVDA 11602.5 \n", - " NVDA 11602.5 \n", - "2023-07-19 NVDA 11960.0 \n", - " NVDA 11960.0 \n", - "2023-07-20 NVDA 11830.0 \n", - " NVDA 11830.0 \n", - "2023-07-21 NVDA 11797.5 \n", - " NVDA 11797.5 \n", - "2023-07-24 NVDA 11797.5 \n", - " NVDA 11797.5 \n", - "2023-07-25 NVDA 10822.5 \n", - " NVDA 10822.5 \n", - "2023-07-26 NVDA 12285.0 \n", - " NVDA 12285.0 \n", - "2023-07-27 NVDA 11895.0 \n", - " NVDA 11895.0 \n", - "2023-07-28 NVDA 11375.0 \n", - " NVDA 11375.0 \n", - "2023-07-31 NVDA 12057.5 \n", - " NVDA 12057.5 \n", - "2023-08-01 NVDA 11862.5 \n", - " NVDA 11862.5 \n", - "2023-08-02 NVDA 11797.5 \n", - " NVDA 11797.5 \n", - "2023-08-03 NVDA 11830.0 \n", - " NVDA 11830.0 \n", - "2023-08-04 NVDA 11797.5 \n", - " NVDA 11797.5 \n", - "2023-08-07 NVDA 11765.0 \n", - " NVDA 11765.0 \n", - "2023-08-08 NVDA 12512.5 \n", - " NVDA 12512.5 \n", - "2023-08-09 NVDA 11700.0 \n", - " NVDA 11700.0 \n", - "2023-08-10 NVDA 11635.0 \n", - " NVDA 11635.0 \n", - "2023-08-11 NVDA 11505.0 \n", - " NVDA 11505.0 \n", - "2023-08-14 NVDA 11797.5 \n", - " NVDA 11797.5 \n", - "2023-08-15 NVDA 11667.5 \n", - " NVDA 11667.5 \n", - "2023-08-16 NVDA 11862.5 \n", - " NVDA 11862.5 \n", - "2023-08-17 NVDA 11732.5 \n", - " NVDA 11732.5 \n", - "2023-08-18 NVDA 12090.0 \n", - " NVDA 12090.0 \n", - "2023-08-21 NVDA 12220.0 \n", - " NVDA 12220.0 \n", - "2023-08-22 NVDA 11960.0 \n", - " NVDA 11960.0 \n", - "2023-08-23 NVDA 12317.5 \n", - " NVDA 12317.5 \n", - "2023-08-24 NVDA 12447.5 \n", - " NVDA 12447.5 \n", - "2023-08-25 NVDA 12220.0 \n", - " NVDA 12220.0 \n", - "2023-08-28 NVDA 12350.0 \n", - " NVDA 12350.0 \n", - "2023-08-29 NVDA 12220.0 \n", - " NVDA 12220.0 \n", - "2023-08-30 NVDA 12415.0 \n", - " NVDA 12415.0 \n", - "2023-08-31 NVDA 12382.5 \n", - " NVDA 12382.5 \n", - "2023-09-01 NVDA 12447.5 \n", - " NVDA 12447.5 \n", - "2023-09-04 NVDA 12447.5 \n", - " NVDA 12447.5 \n", - "2023-09-05 NVDA 12447.5 \n", - " NVDA 12447.5 \n", - "2023-09-06 NVDA 12415.0 \n", - " NVDA 12415.0 \n", - "2023-09-07 NVDA 12447.5 \n", - " NVDA 12447.5 \n", - "2023-09-08 NVDA 12415.0 \n", - " NVDA 12415.0 \n", - "2023-09-11 NVDA 12382.5 \n", - " NVDA 12382.5 \n", - "2023-09-12 NVDA 12317.5 \n", - " NVDA 12317.5 \n", - "2023-09-13 NVDA 12382.5 \n", - " NVDA 12382.5 \n", - "2023-09-14 NVDA 12545.0 \n", - " NVDA 12545.0 \n", - "2023-09-15 NVDA 12382.5 \n", - " NVDA 12382.5 \n", - "2023-09-18 NVDA 12415.0 \n", - " NVDA 12415.0 \n", - "2023-09-19 NVDA 12317.5 \n", - " NVDA 12317.5 \n", - "2023-09-20 NVDA 12317.5 \n", - " NVDA 12317.5 \n", - "2023-09-21 NVDA 12057.5 \n", - " NVDA 12057.5 \n", - "2023-09-22 NVDA 12155.0 \n", - " NVDA 12155.0 \n", - "2023-09-25 NVDA 12252.5 \n", - " NVDA 12252.5 \n", - "2023-09-26 NVDA 12317.5 \n", - " NVDA 12317.5 \n", - "2023-09-27 NVDA 12122.5 \n", - " NVDA 12122.5 \n", - "2023-09-28 NVDA 12707.5 \n", - " NVDA 12707.5 \n", - "2023-09-29 NVDA 12415.0 \n", - " NVDA 12415.0 \n", - "2023-10-02 NVDA 12220.0 \n", - " NVDA 12220.0 \n", - "2023-10-03 NVDA 12090.0 \n", - " NVDA 12090.0 \n", - "2023-10-04 NVDA 11732.5 \n", - " NVDA 11732.5 \n", - "2023-10-05 NVDA 13650.0 \n", - " NVDA 13650.0 \n", - "2023-10-06 NVDA 12285.0 \n", - " NVDA 12285.0 \n", - "2023-10-09 NVDA 12252.5 \n", - " NVDA 12252.5 \n", - "2023-10-10 NVDA 12155.0 \n", - " NVDA 12155.0 \n", - "2023-10-11 NVDA 12545.0 \n", - " NVDA 12545.0 \n", - "2023-10-12 NVDA 12512.5 \n", - " NVDA 12512.5 \n", - "2023-10-13 NVDA 12577.5 \n", - " NVDA 12577.5 \n", - "2023-10-16 NVDA 12187.5 \n", - " NVDA 12187.5 \n", - "2023-10-17 NVDA 12382.5 \n", - " NVDA 12382.5 \n", - "2023-10-18 NVDA 11797.5 \n", - " NVDA 11797.5 \n", - "2023-10-19 NVDA 12252.5 \n", - " NVDA 12252.5 \n", - "2023-10-20 NVDA 12285.0 \n", - " NVDA 12285.0 \n", - "2023-10-23 NVDA 13390.0 \n", - " NVDA 13390.0 \n", - "2023-10-24 NVDA 12480.0 \n", - " NVDA 12480.0 \n", - "2023-10-25 NVDA 11797.5 \n", - " NVDA 11797.5 \n", - "2023-10-26 NVDA 12382.5 \n", - " NVDA 12382.5 \n", - "2023-10-27 NVDA 12382.5 \n", - " NVDA 12382.5 \n", - "2023-10-30 NVDA 11960.0 \n", - " NVDA 11960.0 \n", - "2023-10-31 NVDA 12740.0 \n", - " NVDA 12740.0 \n", - "2023-11-01 NVDA 12610.0 \n", - " NVDA 12610.0 \n", - "2023-11-02 NVDA 12870.0 \n", - " NVDA 12870.0 \n", - "2023-11-03 NVDA 12967.5 \n", - " NVDA 12967.5 \n", - "2023-11-06 NVDA 12480.0 \n", - " NVDA 12480.0 \n", - "2023-11-07 NVDA 12642.5 \n", - " NVDA 12642.5 \n", - "2023-11-08 NVDA 12512.5 \n", - " NVDA 12512.5 \n", - "2023-11-09 NVDA 12740.0 \n", - " NVDA 12740.0 \n", - "2023-11-10 NVDA 12285.0 \n", - " NVDA 12285.0 \n", - "2023-11-13 NVDA 12740.0 \n", - " NVDA 12740.0 \n", - "2023-11-14 NVDA 12707.5 \n", - " NVDA 12707.5 \n", - "2023-11-15 NVDA 13065.0 \n", - " NVDA 13065.0 \n", - "2023-11-16 NVDA 12740.0 \n", - " NVDA 12740.0 \n", - "2023-11-17 NVDA 12935.0 \n", - " NVDA 12935.0 \n", - "2023-11-20 NVDA 13325.0 \n", - " NVDA 13325.0 \n", - "2023-11-21 NVDA 13065.0 \n", - " NVDA 13065.0 \n", - "2023-11-22 NVDA 12642.5 \n", - " NVDA 12642.5 \n", - "2023-11-23 NVDA 12642.5 \n", - " NVDA 12642.5 \n", - "2023-11-24 NVDA 12805.0 \n", - " NVDA 12805.0 \n", - "2023-11-27 NVDA 12902.5 \n", - " NVDA 12902.5 \n", - "2023-11-28 NVDA 12902.5 \n", - " NVDA 12902.5 \n", - "2023-11-29 NVDA 12870.0 \n", - " NVDA 12870.0 \n", - "2023-11-30 NVDA 12805.0 \n", - " NVDA 12805.0 \n", - "2023-12-01 NVDA 12967.5 \n", - " NVDA 12967.5 \n", - "2023-12-04 NVDA 12577.5 \n", - " NVDA 12577.5 \n", - "2023-12-05 NVDA 13000.0 \n", - " NVDA 13000.0 \n", - "2023-12-06 NVDA 12935.0 \n", - " NVDA 12935.0 \n", - "2023-12-07 NVDA 13000.0 \n", - " NVDA 13000.0 \n", - "2023-12-08 NVDA 12902.5 \n", - " NVDA 12902.5 \n", - "2023-12-11 NVDA 12902.5 \n", - " NVDA 12902.5 \n", - "2023-12-12 NVDA 12772.5 \n", - " NVDA 12772.5 \n", - "2023-12-13 NVDA 13130.0 \n", - " NVDA 13130.0 \n", - "2023-12-14 NVDA 12870.0 \n", - " NVDA 12870.0 \n", - "2023-12-15 NVDA 13032.5 \n", - " NVDA 13032.5 \n", - "2023-12-18 NVDA 12902.5 \n", - " NVDA 12902.5 \n", - "2023-12-19 NVDA 12837.5 \n", - " NVDA 12837.5 \n", - "2023-12-20 NVDA 12967.5 \n", - " NVDA 12967.5 \n", - "2023-12-21 NVDA 13130.0 \n", - " NVDA 13130.0 \n", - "2023-12-22 NVDA 12902.5 \n", - " NVDA 12902.5 \n", - "2023-12-25 NVDA 12935.0 \n", - " NVDA 12935.0 \n", - "2023-12-26 NVDA 12935.0 \n", - " NVDA 12935.0 \n", - "2023-12-27 NVDA 12935.0 \n", - " NVDA 12935.0 \n", - "2023-12-28 NVDA 13065.0 \n", - " NVDA 13065.0 " - ] - }, - "execution_count": 125, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "pd.set_option('display.max_rows', 10000)\n", - "evb_backtest.portfolio.get_all_positions()" - ] - }, - { - "cell_type": "code", - "execution_count": 126, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'\"\\nWhy do these two return weird stuff after run?\\n current_weighted_holdings\\n current_positions\\n\\nI can\\'t reconcile the cost with the data (NVM, haha)\\n\\n'" - ] - }, - "execution_count": 126, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "\n", - "\"\"\"\"\n", - "Why do these two return weird stuff after run?\n", - " current_weighted_holdings\n", - " current_positions\n", - "\n", - "I can't reconcile the cost with the data (NVM, haha)\n", - "\n", - "\"\"\"\n", - "# evb_backtest.portfolio.all_positions" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Extend for get_port_stats\n", - "- Buy & Hold\n", - "- Dates\n", - "- Trades\n", - "- _strategy in Aggregate\n", - "- The function" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": ".venv", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.10" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/EventDriven/demos/bactest_data.txt b/EventDriven/demos/bactest_data.txt deleted file mode 100644 index 38353e5..0000000 --- a/EventDriven/demos/bactest_data.txt +++ /dev/null @@ -1,38 +0,0 @@ - 179946728 function calls (179230715 primitive calls) in 771.171 seconds - - Ordered by: cumulative time - List reduced from 2996 to 30 due to restriction <30> - - ncalls tottime percall cumtime percall filename:lineno(function) - 2 0.000 0.000 771.173 385.587 c:\Users\Zino\python-playground\QuantTools\.venv\lib\site-packages\IPython\core\interactiveshell.py:3517(run_code) - 2 0.000 0.000 771.173 385.587 {built-in method builtins.exec} - 1 0.000 0.000 771.173 771.173 C:\Users\Zino\AppData\Local\Temp\ipykernel_28000\3226836942.py:1() - 1 0.028 0.028 771.173 771.173 C:\Users\Zino\python-playground\QuantTools\EventDriven\backtest.py:37(run) - 79 0.000 0.000 629.085 7.963 C:\Users\Zino\python-playground\QuantTools\EventDriven\portfolio.py:378(update_signal) - 79 0.003 0.000 629.083 7.963 C:\Users\Zino\python-playground\QuantTools\EventDriven\portfolio.py:267(generate_order) - 45 0.002 0.000 621.001 13.800 C:\Users\Zino\python-playground\QuantTools\EventDriven\portfolio.py:296(create_order) - 90/45 0.006 0.000 620.970 13.799 C:\Users\Zino\python-playground\QuantTools\trade\helpers\decorators.py:37(wrapper) - 45 0.011 0.000 620.926 13.798 C:\Users\Zino\python-playground\QuantTools\EventDriven\riskmanager.py:463(get_order) - 20753 464.060 0.022 464.060 0.022 {method 'acquire' of '_thread.lock' objects} - 5026 0.038 0.000 463.357 0.092 C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\lib\threading.py:288(wait) - 3736 0.034 0.000 460.912 0.123 C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\lib\concurrent\futures\_base.py:430(result) - 45 0.019 0.000 387.365 8.608 C:\Users\Zino\python-playground\QuantTools\EventDriven\riskmanager.py:72(populate_cache) - 176 0.007 0.000 386.928 2.198 C:\Users\Zino\python-playground\QuantTools\trade\helpers\threads.py:4(runThreads) - 2892 0.016 0.000 384.527 0.133 C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\lib\concurrent\futures\_base.py:614(result_iterator) - 2716 0.006 0.000 384.509 0.142 C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\lib\concurrent\futures\_base.py:316(_result_or_cancel) - 45 0.005 0.000 232.584 5.169 C:\Users\Zino\python-playground\QuantTools\EventDriven\riskmanager.py:350(produce_order_candidates) - 90 0.016 0.000 232.579 2.584 C:\Users\Zino\python-playground\QuantTools\EventDriven\riskmanager.py:217(chain_details) - 140 0.003 0.000 161.314 1.152 c:\Users\Zino\python-playground\QuantTools\.venv\lib\site-packages\requests\sessions.py:500(request) - 140 0.004 0.000 161.147 1.151 c:\Users\Zino\python-playground\QuantTools\.venv\lib\site-packages\requests\sessions.py:673(send) - 82 0.002 0.000 159.095 1.940 C:\Users\Zino\python-playground\FinanceDatabase\FinanceDatabase\dbase\DataAPI\ThetaData.py:34(request_from_proxy) - 82 0.001 0.000 159.091 1.940 c:\Users\Zino\python-playground\QuantTools\.venv\lib\site-packages\requests\api.py:14(request) - 1359 0.008 0.000 157.182 0.116 C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\lib\socket.py:691(readinto) - 1185 155.145 0.131 155.145 0.131 {method 'recv_into' of '_socket.socket' objects} - 140 0.003 0.000 151.908 1.085 c:\Users\Zino\python-playground\QuantTools\.venv\lib\site-packages\requests\adapters.py:613(send) - 140 0.003 0.000 151.846 1.085 c:\Users\Zino\python-playground\QuantTools\.venv\lib\site-packages\urllib3\connectionpool.py:594(urlopen) - 140 0.004 0.000 151.816 1.084 c:\Users\Zino\python-playground\QuantTools\.venv\lib\site-packages\urllib3\connectionpool.py:379(_make_request) - 140 0.007 0.000 148.221 1.059 c:\Users\Zino\python-playground\QuantTools\.venv\lib\site-packages\urllib3\connection.py:481(getresponse) - 140 0.002 0.000 148.182 1.058 C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\lib\http\client.py:1331(getresponse) - 140 0.004 0.000 148.170 1.058 C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\lib\http\client.py:311(begin) - - diff --git a/EventDriven/demos/bkt_test.ipynb b/EventDriven/demos/bkt_test.ipynb new file mode 100644 index 0000000..2a3489a --- /dev/null +++ b/EventDriven/demos/bkt_test.ipynb @@ -0,0 +1,3760 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "99f1034a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Console Logging & File Logging Can be configured using STREAM_LOG_LEVEL and FILE_LOG_LEVEL in environment variables.\n", + "Propagate to root logger can be set using PROPAGATE_TO_ROOT_LOGGER in environment variables.\n", + "Example:\n", + "STREAM_LOG_LEVEL = 'DEBUG'\n", + "FILE_LOG_LEVEL = 'INFO'\n", + "PROPAGATE_TO_ROOT_LOGGER = 'False'\n", + "\n", + "2025-12-07 20:50:50 trade.helpers.Logging INFO: Logging Root Directory: /Users/chiemelienwanisobi/cloned_repos/QuantTools/logs\n", + "Using Proxy URL: http://54.205.248.219:5500/thetadata\n", + "Using Proxy URL: http://54.205.248.219:5500/thetadata\n", + "\n", + "\n", + "Scheduled Data Requests will be saved to: /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/scheduler/requests.jsonl\n", + "2025-12-07 20:51:27 DataManager.py CRITICAL: Using ProcessSaveManager for saving data.\n", + "\n", + "\n", + "Scheduled Data Requests will be saved to: /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/scheduler/requests.jsonl\n", + "2025-12-07 20:51:27 DataManager.py CRITICAL: Using ProcessSaveManager for saving data.\n" + ] + }, + { + "data": { + "text/html": [ + " \n", + "
\n", + " \n", + " Loading BokehJS ...\n", + "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": "'use strict';\n(function(root) {\n function now() {\n return new Date();\n }\n\n const force = true;\n\n if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n root._bokeh_onload_callbacks = [];\n root._bokeh_is_loading = undefined;\n }\n\nconst JS_MIME_TYPE = 'application/javascript';\n const HTML_MIME_TYPE = 'text/html';\n const EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n const CLASS_NAME = 'output_bokeh rendered_html';\n\n /**\n * Render data to the DOM node\n */\n function render(props, node) {\n const script = document.createElement(\"script\");\n node.appendChild(script);\n }\n\n /**\n * Handle when an output is cleared or removed\n */\n function handleClearOutput(event, handle) {\n function drop(id) {\n const view = Bokeh.index.get_by_id(id)\n if (view != null) {\n view.model.document.clear()\n Bokeh.index.delete(view)\n }\n }\n\n const cell = handle.cell;\n\n const id = cell.output_area._bokeh_element_id;\n const server_id = cell.output_area._bokeh_server_id;\n\n // Clean up Bokeh references\n if (id != null) {\n drop(id)\n }\n\n if (server_id !== undefined) {\n // Clean up Bokeh references\n const cmd_clean = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n cell.notebook.kernel.execute(cmd_clean, {\n iopub: {\n output: function(msg) {\n const id = msg.content.text.trim()\n drop(id)\n }\n }\n });\n // Destroy server and session\n const cmd_destroy = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n cell.notebook.kernel.execute(cmd_destroy);\n }\n }\n\n /**\n * Handle when a new output is added\n */\n function handleAddOutput(event, handle) {\n const output_area = handle.output_area;\n const output = handle.output;\n\n // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n if ((output.output_type != \"display_data\") || (!Object.prototype.hasOwnProperty.call(output.data, EXEC_MIME_TYPE))) {\n return\n }\n\n const toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n\n if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n // store reference to embed id on output_area\n output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n }\n if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n const bk_div = document.createElement(\"div\");\n bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n const script_attrs = bk_div.children[0].attributes;\n for (let i = 0; i < script_attrs.length; i++) {\n toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n toinsert[toinsert.length - 1].firstChild.textContent = bk_div.children[0].textContent\n }\n // store reference to server id on output_area\n output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n }\n }\n\n function register_renderer(events, OutputArea) {\n\n function append_mime(data, metadata, element) {\n // create a DOM node to render to\n const toinsert = this.create_output_subarea(\n metadata,\n CLASS_NAME,\n EXEC_MIME_TYPE\n );\n this.keyboard_manager.register_events(toinsert);\n // Render to node\n const props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n render(props, toinsert[toinsert.length - 1]);\n element.append(toinsert);\n return toinsert\n }\n\n /* Handle when an output is cleared or removed */\n events.on('clear_output.CodeCell', handleClearOutput);\n events.on('delete.Cell', handleClearOutput);\n\n /* Handle when a new output is added */\n events.on('output_added.OutputArea', handleAddOutput);\n\n /**\n * Register the mime type and append_mime function with output_area\n */\n OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n /* Is output safe? */\n safe: true,\n /* Index of renderer in `output_area.display_order` */\n index: 0\n });\n }\n\n // register the mime type if in Jupyter Notebook environment and previously unregistered\n if (root.Jupyter !== undefined) {\n const events = require('base/js/events');\n const OutputArea = require('notebook/js/outputarea').OutputArea;\n\n if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n register_renderer(events, OutputArea);\n }\n }\n if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n const NB_LOAD_WARNING = {'data': {'text/html':\n \"
\\n\"+\n \"

\\n\"+\n \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n \"

\\n\"+\n \"
    \\n\"+\n \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n \"
  • use INLINE resources instead, as so:
  • \\n\"+\n \"
\\n\"+\n \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"
\"}};\n\n function display_loaded(error = null) {\n const el = document.getElementById(\"fb0d9b22-6af6-4e2b-a915-ef191c28ceee\");\n if (el != null) {\n const html = (() => {\n if (typeof root.Bokeh === \"undefined\") {\n if (error == null) {\n return \"BokehJS is loading ...\";\n } else {\n return \"BokehJS failed to load.\";\n }\n } else {\n const prefix = `BokehJS ${root.Bokeh.version}`;\n if (error == null) {\n return `${prefix} successfully loaded.`;\n } else {\n return `${prefix} encountered errors while loading and may not function as expected.`;\n }\n }\n })();\n el.innerHTML = html;\n\n if (error != null) {\n const wrapper = document.createElement(\"div\");\n wrapper.style.overflow = \"auto\";\n wrapper.style.height = \"5em\";\n wrapper.style.resize = \"vertical\";\n const content = document.createElement(\"div\");\n content.style.fontFamily = \"monospace\";\n content.style.whiteSpace = \"pre-wrap\";\n content.style.backgroundColor = \"rgb(255, 221, 221)\";\n content.textContent = error.stack ?? error.toString();\n wrapper.append(content);\n el.append(wrapper);\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(() => display_loaded(error), 100);\n }\n }\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n\n root._bokeh_onload_callbacks.push(callback);\n if (root._bokeh_is_loading > 0) {\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls == null || js_urls.length === 0) {\n run_callbacks();\n return null;\n }\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = css_urls.length + js_urls.length;\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n\n function on_error(url) {\n console.error(\"failed to load \" + url);\n }\n\n for (let i = 0; i < css_urls.length; i++) {\n const url = css_urls[i];\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n }\n\n for (let i = 0; i < js_urls.length; i++) {\n const url = js_urls[i];\n const element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n };\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.7.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.7.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.7.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.7.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.7.3.min.js\"];\n const css_urls = [];\n\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {\n }\n ];\n\n function run_inline_js() {\n if (root.Bokeh !== undefined || force === true) {\n try {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\n\n } catch (error) {display_loaded(error);throw error;\n }if (force === true) {\n display_loaded();\n }} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n } else if (force !== true) {\n const cell = $(document.getElementById(\"fb0d9b22-6af6-4e2b-a915-ef191c28ceee\")).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\n }\n }\n\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(css_urls, js_urls, function() {\n console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n}(window));", + "application/vnd.bokehjs_load.v0+json": "" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2\n", + "import pandas as pd\n", + "import numpy as np\n", + "from copy import deepcopy\n", + "from EventDriven.backtest import OptionSignalBacktest, OptionSignalPortfolio\n", + "from EventDriven.riskmanager.new_base import RiskManager\n", + "from EventDriven.riskmanager.utils import get_use_temp_cache, set_use_temp_cache\n", + "import json\n", + "from EventDriven.types import OrderData, OrderDataDict\n", + "from trade import set_pool_enabled\n", + "from EventDriven.configs.core import DefaultSizerConfigs, ZscoreSizerConfigs, BacktesterConfig, LimitsEnabledConfig\n", + "from EventDriven.riskmanager.position.cogs.limits import LimitsAndSizingCog\n", + "from EventDriven.configs.export_configs import collect_run_configs, walk_configs, tag_run, export_run_configs, RunConfigBundle\n", + "set_pool_enabled(False) # Disable multiprocessing for debugging\n", + "from EventDriven.dataclasses.states import PositionState, PortfolioState\n", + "from EventDriven.configs.base import BaseConfigs\n", + "\n", + "order_data = OrderData.from_dict(\n", + " {\n", + " \"trade_id\": \"&L:BA20240920C230&S:BA20240920C235\",\n", + " \"long\": [\"BA20240920C230\"],\n", + " \"short\": [\"BA20240920C235\"],\n", + " \"close\": np.float64(3.0250000000000057),\n", + " \"quantity\": 66,\n", + " }\n", + ")\n", + "\n", + "sample_positions = {'BA': {'BA20240103LONG': {'position': order_data,\n", + " 'quantity': 65,\n", + " 'entry_price': np.float64(19728.795024479812),\n", + " 'market_value': np.float64(19662.500000000036),\n", + " 'signal_id': 'BA20240103LONG'}}}\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6ede1a79", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "================================================================================\n", + "Configuration Class: PositionAnalyzerConfig\n", + "Description: Configuration for the position analyzer orchestrating multiple cogs for comprehensive position analysis.\n", + "================================================================================\n", + "\n", + "Configuration for the position analyzer orchestrating multiple cogs for comprehensive position analysis.\n", + "\n", + "\n", + "Current Configuration Settings for PositionAnalyzerConfig:\n", + "{'run_name': '', 'enabled': True, 'enabled_cogs': []}\n", + " \n", + "\n", + "Configuration Descriptions for PositionAnalyzerConfig:\n", + "- run_name: # A name identifier for this run/session, used to tag and track configuration across backtest runs.\n", + "- enabled: True # Flag to enable or disable the position analyzer (default True).\n", + "- enabled_cogs: [] # List of cog names that are enabled for position analysis.\n", + "\n", + "\n", + "================================================================================\n", + "Configuration Class: SkipCalcConfig\n", + "Description: Configuration for anomaly detection in option data, determining when to skip calculations due to data quality issues.\n", + "================================================================================\n", + "\n", + "Configuration for anomaly detection in option data, determining when to skip calculations due to data quality issues.\n", + "\n", + "\n", + "Current Configuration Settings for SkipCalcConfig:\n", + "{'run_name': '', 'window': 20, 'skip_threshold': 3.0, 'skip_enabled': True, 'abs_zscore_threshold': False, 'pct_zscore_threshold': False, 'spike_flag': False, 'std_window_bool': False, 'zero_filter': True, 'add_columns': [], 'skip_columns': ['Delta', 'Gamma', 'Vega', 'Theta', 'Midpoint']}\n", + " \n", + "\n", + "Configuration Descriptions for SkipCalcConfig:\n", + "- run_name: # A name identifier for this run/session, used to tag and track configuration across backtest runs.\n", + "- window: 20 # Rolling window size for skip calculation statistics (default 20).\n", + "- skip_threshold: 3.0 # Z-score threshold for determining when to skip a calculation date (default 3.0).\n", + "- skip_enabled: True # Flag to enable or disable skip calculation logic.\n", + "- abs_zscore_threshold: False # Use absolute z-score threshold for skip detection.\n", + "- pct_zscore_threshold: False # Use percentage-based z-score threshold for skip detection.\n", + "- spike_flag: False # Flag to enable spike detection in price data.\n", + "- std_window_bool: False # Use standard deviation window for anomaly detection.\n", + "- zero_filter: True # Filter out zero values when calculating skip conditions (default True).\n", + "- add_columns: [] # List of (column_name, function_name) tuples to add additional calculated columns using ADD_COLUMNS_FACTORY.\n", + "- skip_columns: ['Delta', 'Gamma', 'Vega', 'Theta', 'Midpoint'] # List of column names to apply skip calculation logic to (default ['Delta', 'Gamma', 'Vega', 'Theta', 'Midpoint']).\n", + "\n", + "\n", + "================================================================================\n", + "Configuration Class: RiskManagerConfig\n", + "Description: Configuration for the risk manager controlling slippage limits and order caching behavior.\n", + "================================================================================\n", + "\n", + "Configuration for the risk manager controlling slippage limits and order caching behavior.\n", + "\n", + "2025-12-07 20:51:32 EventDriven.configs.base WARNING: No description found for config 'min_slippage_pct' in RiskManagerConfig.\n", + "2025-12-07 20:51:32 EventDriven.configs.base WARNING: No description found for config 'max_slippage_pct' in RiskManagerConfig.\n", + "2025-12-07 20:51:32 EventDriven.configs.base WARNING: No description found for config 'cache_order_requests' in RiskManagerConfig.\n", + "\n", + "Current Configuration Settings for RiskManagerConfig:\n", + "{'run_name': '', 'min_slippage_pct': 0.25, 'max_slippage_pct': 0.16, 'cache_orders': False, 'cache_position_analysis': False, 'cache_order_requests': False}\n", + " \n", + "\n", + "Configuration Descriptions for RiskManagerConfig:\n", + "- run_name: # A name identifier for this run/session, used to tag and track configuration across backtest runs.\n", + "- cache_orders: False # Flag to enable caching of generated orders for reuse (default False).\n", + "- cache_position_analysis: False # Flag to enable caching of position analysis results for performance optimization (default False).\n", + "\n", + "\n", + "================================================================================\n", + "Configuration Class: PortfolioManagerConfig\n", + "Description: Configuration for portfolio management including weights haircut adjustments.\n", + "================================================================================\n", + "\n", + "Configuration for portfolio management including weights haircut adjustments.\n", + "\n", + "2025-12-07 20:51:32 EventDriven.configs.base WARNING: No description found for config 'roll_failed_orders' in PortfolioManagerConfig.\n", + "\n", + "Current Configuration Settings for PortfolioManagerConfig:\n", + "{'run_name': '', 'weights_haircut': 0.0, 'roll_failed_orders': True}\n", + " \n", + "\n", + "Configuration Descriptions for PortfolioManagerConfig:\n", + "- run_name: # A name identifier for this run/session, used to tag and track configuration across backtest runs.\n", + "- weights_haircut: 0.0 # Haircut applied to position weights for conservative allocation (default 0.0).\n", + "\n", + "\n", + "================================================================================\n", + "Configuration Class: OrderSchemaConfigs\n", + "Description: Configuration defining the structure and parameters for options orders including strategy type, DTE, and moneyness.\n", + "================================================================================\n", + "\n", + "Configuration defining the structure and parameters for options orders including strategy type, DTE, and moneyness.\n", + "\n", + "\n", + "Current Configuration Settings for OrderSchemaConfigs:\n", + "{'run_name': '', 'target_dte': 270, 'strategy': 'vertical', 'structure_direction': 'long', 'spread_ticks': 1, 'dte_tolerance': 60, 'min_moneyness': 0.65, 'max_moneyness': 1, 'min_total_price': 0.95}\n", + " \n", + "\n", + "Configuration Descriptions for OrderSchemaConfigs:\n", + "- run_name: # A name identifier for this run/session, used to tag and track configuration across backtest runs.\n", + "- target_dte: 270 # Target days to expiration for the options in the order schema.\n", + "- strategy: vertical # The options strategy to be used (e.g., vertical, iron condor).\n", + "- structure_direction: long # Direction of the structure, either long or short.\n", + "- spread_ticks: 1 # Number of strike price ticks between legs of the spread.\n", + "- dte_tolerance: 60 # Allowed deviation in days to expiration from the target DTE.\n", + "- min_moneyness: 0.65 # Minimum moneyness level for selecting options.\n", + "- max_moneyness: 1 # Maximum moneyness level for selecting options.\n", + "- min_total_price: 0.95 # Minimum total price for the option structure.\n", + "\n", + "\n", + "================================================================================\n", + "Configuration Class: ChainConfig\n", + "Description: Configuration for filtering and selecting options from the option chain based on spread width and open interest.\n", + "================================================================================\n", + "\n", + "Configuration for filtering and selecting options from the option chain based on spread width and open interest.\n", + "\n", + "\n", + "Current Configuration Settings for ChainConfig:\n", + "{'run_name': '', 'max_pct_width': None, 'min_oi': None}\n", + " \n", + "\n", + "Configuration Descriptions for ChainConfig:\n", + "- run_name: # A name identifier for this run/session, used to tag and track configuration across backtest runs.\n", + "- max_pct_width: None # Maximum abs spread/mid price percentage width for an option to be included in the option chain.\n", + "- min_oi: None # Minimum open interest required for an option to be included in the option chain.\n", + "\n", + "\n", + "================================================================================\n", + "Configuration Class: BacktesterConfig\n", + "Description: Configuration for backtest execution including settlement delays and trade finalization.\n", + "================================================================================\n", + "\n", + "Configuration for backtest execution including settlement delays and trade finalization.\n", + "\n", + "2025-12-07 20:51:32 EventDriven.configs.base WARNING: No description found for config 'min_slippage_pct' in BacktesterConfig.\n", + "2025-12-07 20:51:32 EventDriven.configs.base WARNING: No description found for config 'max_slippage_pct' in RiskManagerConfig.\n", + "2025-12-07 20:51:32 EventDriven.configs.base WARNING: No description found for config 'cache_order_requests' in RiskManagerConfig.\n", + "\n", + "Current Configuration Settings for RiskManagerConfig:\n", + "{'run_name': '', 'min_slippage_pct': 0.25, 'max_slippage_pct': 0.16, 'cache_orders': False, 'cache_position_analysis': False, 'cache_order_requests': False}\n", + " \n", + "\n", + "Configuration Descriptions for RiskManagerConfig:\n", + "- run_name: # A name identifier for this run/session, used to tag and track configuration across backtest runs.\n", + "- cache_orders: False # Flag to enable caching of generated orders for reuse (default False).\n", + "- cache_position_analysis: False # Flag to enable caching of position analysis results for performance optimization (default False).\n", + "\n", + "\n", + "================================================================================\n", + "Configuration Class: PortfolioManagerConfig\n", + "Description: Configuration for portfolio management including weights haircut adjustments.\n", + "================================================================================\n", + "\n", + "Configuration for portfolio management including weights haircut adjustments.\n", + "\n", + "2025-12-07 20:51:32 EventDriven.configs.base WARNING: No description found for config 'roll_failed_orders' in PortfolioManagerConfig.\n", + "\n", + "Current Configuration Settings for PortfolioManagerConfig:\n", + "{'run_name': '', 'weights_haircut': 0.0, 'roll_failed_orders': True}\n", + " \n", + "\n", + "Configuration Descriptions for PortfolioManagerConfig:\n", + "- run_name: # A name identifier for this run/session, used to tag and track configuration across backtest runs.\n", + "- weights_haircut: 0.0 # Haircut applied to position weights for conservative allocation (default 0.0).\n", + "\n", + "\n", + "================================================================================\n", + "Configuration Class: OrderSchemaConfigs\n", + "Description: Configuration defining the structure and parameters for options orders including strategy type, DTE, and moneyness.\n", + "================================================================================\n", + "\n", + "Configuration defining the structure and parameters for options orders including strategy type, DTE, and moneyness.\n", + "\n", + "\n", + "Current Configuration Settings for OrderSchemaConfigs:\n", + "{'run_name': '', 'target_dte': 270, 'strategy': 'vertical', 'structure_direction': 'long', 'spread_ticks': 1, 'dte_tolerance': 60, 'min_moneyness': 0.65, 'max_moneyness': 1, 'min_total_price': 0.95}\n", + " \n", + "\n", + "Configuration Descriptions for OrderSchemaConfigs:\n", + "- run_name: # A name identifier for this run/session, used to tag and track configuration across backtest runs.\n", + "- target_dte: 270 # Target days to expiration for the options in the order schema.\n", + "- strategy: vertical # The options strategy to be used (e.g., vertical, iron condor).\n", + "- structure_direction: long # Direction of the structure, either long or short.\n", + "- spread_ticks: 1 # Number of strike price ticks between legs of the spread.\n", + "- dte_tolerance: 60 # Allowed deviation in days to expiration from the target DTE.\n", + "- min_moneyness: 0.65 # Minimum moneyness level for selecting options.\n", + "- max_moneyness: 1 # Maximum moneyness level for selecting options.\n", + "- min_total_price: 0.95 # Minimum total price for the option structure.\n", + "\n", + "\n", + "================================================================================\n", + "Configuration Class: ChainConfig\n", + "Description: Configuration for filtering and selecting options from the option chain based on spread width and open interest.\n", + "================================================================================\n", + "\n", + "Configuration for filtering and selecting options from the option chain based on spread width and open interest.\n", + "\n", + "\n", + "Current Configuration Settings for ChainConfig:\n", + "{'run_name': '', 'max_pct_width': None, 'min_oi': None}\n", + " \n", + "\n", + "Configuration Descriptions for ChainConfig:\n", + "- run_name: # A name identifier for this run/session, used to tag and track configuration across backtest runs.\n", + "- max_pct_width: None # Maximum abs spread/mid price percentage width for an option to be included in the option chain.\n", + "- min_oi: None # Minimum open interest required for an option to be included in the option chain.\n", + "\n", + "\n", + "================================================================================\n", + "Configuration Class: BacktesterConfig\n", + "Description: Configuration for backtest execution including settlement delays and trade finalization.\n", + "================================================================================\n", + "\n", + "Configuration for backtest execution including settlement delays and trade finalization.\n", + "\n", + "2025-12-07 20:51:32 EventDriven.configs.base WARNING: No description found for config 'min_slippage_pct' in BacktesterConfig.\n", + "2025-12-07 20:51:32 EventDriven.configs.base WARNING: No description found for config 'max_slippage_pct' in BacktesterConfig.\n", + "\n", + "Current Configuration Settings for BacktesterConfig:\n", + "{'run_name': '', 't_plus_n': 1, 'finalize_trades': False, 'raise_errors': False, 'min_slippage_pct': 0.075, 'max_slippage_pct': 0.15}\n", + " \n", + "\n", + "Configuration Descriptions for BacktesterConfig:\n", + "- run_name: # A name identifier for this run/session, used to tag and track configuration across backtest runs.\n", + "- t_plus_n: 1 # Settlement delay for orders in business days (T+N, default 1).\n", + "- finalize_trades: False # Flag to enable finalization of trades at end of backtest (default False).\n", + "- raise_errors: False # Flag to raise errors during backtest execution instead of logging them (default False).\n", + "\n", + "\n", + "================================================================================\n", + "Configuration Class: UndlTimeseriesConfig\n", + "Description: Configuration for underlying asset timeseries data retrieval and interval settings.\n", + "================================================================================\n", + "\n", + "Configuration for underlying asset timeseries data retrieval and interval settings.\n", + "\n", + "\n", + "Current Configuration Settings for UndlTimeseriesConfig:\n", + "{'run_name': '', 'interval': '1d'}\n", + " \n", + "\n", + "Configuration Descriptions for UndlTimeseriesConfig:\n", + "- run_name: # A name identifier for this run/session, used to tag and track configuration across backtest runs.\n", + "- interval: 1d # Time interval for underlying price data (e.g., '1d' for daily, '1h' for hourly).\n", + "\n", + "\n", + "================================================================================\n", + "Configuration Class: OrderResolutionConfig\n", + "Description: Configuration for automatic order resolution when initial order schemas fail to find suitable options.\n", + "================================================================================\n", + "\n", + "Configuration for automatic order resolution when initial order schemas fail to find suitable options.\n", + "\n", + "\n", + "Current Configuration Settings for OrderResolutionConfig:\n", + "{'run_name': '', 'resolve_enabled': True, 'otm_moneyness_width': 0.45, 'itm_moneyness_width': 0.45, 'max_close': 10.0, 'max_tries': 20, 'max_dte_tolerance': 90}\n", + " \n", + "\n", + "Configuration Descriptions for OrderResolutionConfig:\n", + "- run_name: # A name identifier for this run/session, used to tag and track configuration across backtest runs.\n", + "- resolve_enabled: True # Flag to enable or disable automatic order resolution when initial order schema fails.\n", + "- otm_moneyness_width: 0.45 # Maximum OTM moneyness width for ATM vs OTM option selection (default 0.45).\n", + "- itm_moneyness_width: 0.45 # Maximum ITM moneyness width for ATM vs ITM option selection (default 0.45).\n", + "- max_close: 10.0 # Maximum close price allowed for the order structure (default 10.0).\n", + "- max_tries: 20 # Maximum number of attempts to resolve an order schema before giving up (default 20).\n", + "- max_dte_tolerance: 90 # Maximum days to expiration tolerance allowed for the order (default 90).\n", + "\n", + "\n", + "================================================================================\n", + "Configuration Class: DefaultSizerConfigs\n", + "Description: Standard position sizing configuration using fixed leverage without volatility adjustments.\n", + "================================================================================\n", + "\n", + "Standard position sizing configuration using fixed leverage without volatility adjustments.\n", + "\n", + "\n", + "Current Configuration Settings for DefaultSizerConfigs:\n", + "{'run_name': '', 'delta_lmt_type': 'default', 'sizing_lev': 1.0}\n", + " \n", + "\n", + "Configuration Descriptions for DefaultSizerConfigs:\n", + "- run_name: # A name identifier for this run/session, used to tag and track configuration across backtest runs.\n", + "- delta_lmt_type: default # Type of delta limit calculation to use: 'default' uses fixed limits, 'zscore' uses volatility-adjusted limits.\n", + "- sizing_lev: 1.0 # Leverage level to be used for sizing positions (multiplier on equity equivalent size).\n", + "\n", + "\n", + "================================================================================\n", + "Configuration Class: ZscoreSizerConfigs\n", + "Description: Advanced position sizing configuration using volatility-adjusted z-score based limits for dynamic risk management.\n", + "================================================================================\n", + "\n", + "Advanced position sizing configuration using volatility-adjusted z-score based limits for dynamic risk management.\n", + "\n", + "\n", + "Current Configuration Settings for ZscoreSizerConfigs:\n", + "{'run_name': '', 'delta_lmt_type': 'zscore', 'sizing_lev': 1.0, 'rvol_window': None, 'rolling_window': 100, 'weights': (0.5, 0.3, 0.2), 'vol_type': 'mean', 'norm_const': 1.0}\n", + " \n", + "\n", + "Configuration Descriptions for ZscoreSizerConfigs:\n", + "- run_name: # A name identifier for this run/session, used to tag and track configuration across backtest runs.\n", + "- delta_lmt_type: zscore # Type of delta limit calculation to use: 'default' uses fixed limits, 'zscore' uses volatility-adjusted limits.\n", + "- sizing_lev: 1.0 # Leverage level to be used for sizing positions (multiplier on equity equivalent size).\n", + "- rvol_window: None # Rolling volatility window size(s) for calculating relative volatility. Can be a single number or tuple of windows.\n", + "- rolling_window: 100 # Rolling window size for z-score calculation (default 100 days).\n", + "- weights: (0.5, 0.3, 0.2) # Weights tuple (w1, w2, w3) applied in the z-score calculation for combining different volatility measures.\n", + "- vol_type: mean # Type of volatility measure to be used (e.g., 'mean', 'weighted').\n", + "- norm_const: 1.0 # Normalization constant for z-score calculation to scale the volatility adjustment.\n", + "\n", + "\n", + "================================================================================\n", + "Configuration Class: LimitsEnabledConfig\n", + "Description: Configuration for the limits enforcement cog, managing risk thresholds and position rolling triggers.\n", + "================================================================================\n", + "\n", + "Configuration for the limits enforcement cog, managing risk thresholds and position rolling triggers.\n", + "\n", + "\n", + "Current Configuration Settings for LimitsEnabledConfig:\n", + "{'run_name': '', 'enabled_limits': StrategyLimitsEnabled(run_name='', delta=True, vega=False, gamma=False, theta=False, dte=True, moneyness=True, exercise=False), 'name': 'LimitsEnabledCog', 'enabled': True, 'cache_actions': True, 'delta_lmt_type': 'default', 'default_dte': 120, 'default_moneyness': 1.15}\n", + " \n", + "\n", + "Configuration Descriptions for LimitsEnabledConfig:\n", + "- run_name: # A name identifier for this run/session, used to tag and track configuration across backtest runs.\n", + "- enabled_limits: StrategyLimitsEnabled(run_name='', delta=True, vega=False, gamma=False, theta=False, dte=True, moneyness=True, exercise=False) # StrategyLimitsEnabled instance specifying which limit types are active.\n", + "- name: LimitsEnabledCog # Name identifier for the limits cog (default 'LimitsEnabledCog').\n", + "- enabled: True # Flag to enable or disable the limits enforcement cog (default True).\n", + "- cache_actions: True # Cache analyzed actions for performance optimization (default True).\n", + "- delta_lmt_type: default # Type of delta limit calculation: 'default' for fixed limits or 'zscore' for volatility-adjusted limits.\n", + "- default_dte: 120 # Default days to expiration threshold for rolling positions (default 120).\n", + "- default_moneyness: 1.15 # Default moneyness threshold for rolling positions (default 1.15).\n", + "\n", + "\n", + "================================================================================\n", + "Configuration Class: OrderPickerConfig\n", + "Description: Configuration for the order picker component that selects optimal orders from available option chains.\n", + "================================================================================\n", + "\n", + "Configuration for the order picker component that selects optimal orders from available option chains.\n", + "\n", + "\n", + "Current Configuration Settings for OrderPickerConfig:\n", + "{'run_name': '', 'start_date': datetime.date(2017, 1, 1), 'end_date': datetime.date(2025, 12, 7)}\n", + " \n", + "\n", + "Configuration Descriptions for OrderPickerConfig:\n", + "- run_name: # A name identifier for this run/session, used to tag and track configuration across backtest runs.\n", + "- start_date: 2017-01-01 # The start date for selecting orders from option chain data.\n", + "- end_date: 2025-12-07 # The end date for selecting orders from option chain data.\n", + "\n", + "\n", + "================================================================================\n", + "Configuration Class: OptionPriceConfig\n", + "Description: Configuration specifying which price type (bid, ask, midpoint, close) to use for option valuation.\n", + "================================================================================\n", + "\n", + "Configuration specifying which price type (bid, ask, midpoint, close) to use for option valuation.\n", + "\n", + "\n", + "Current Configuration Settings for OptionPriceConfig:\n", + "{'run_name': '', 'use_price': 'midpoint'}\n", + " \n", + "\n", + "Configuration Descriptions for OptionPriceConfig:\n", + "- run_name: # A name identifier for this run/session, used to tag and track configuration across backtest runs.\n", + "- use_price: midpoint # Price type to use for option pricing: 'midpoint', 'close', 'bid', or 'ask' (default 'midpoint').\n", + "\n", + "\n", + "================================================================================\n", + "Configuration Class: _CustomFrozenBaseConfigs\n", + "Description: Frozen configuration base class that prevents modification of attributes after initialization, except for run_name.\n", + "================================================================================\n", + "\n", + "Frozen configuration base class that prevents modification of attributes after initialization, except for run_name.\n", + "\n", + "\n", + "Current Configuration Settings for _CustomFrozenBaseConfigs:\n", + "{'run_name': ''}\n", + " \n", + "\n", + "Configuration Descriptions for _CustomFrozenBaseConfigs:\n", + "- run_name: # A name identifier for this run/session, used to tag and track configuration across backtest runs.\n", + "\n", + "\n", + "================================================================================\n", + "Configuration Class: CashAllocatorConfig\n", + "Description: Threshold-based cash bucket allocator for symbols.\n", + "================================================================================\n", + "\n", + "Threshold-based cash bucket allocator for symbols.\n", + "\n", + "\n", + "Current Configuration Settings for CashAllocatorConfig:\n", + "{'run_name': '', 'thresholds': [(500, 4), (300, 3), (200, 2), (100, 1), (0, 0.5)]}\n", + " \n", + "\n", + "Configuration Descriptions for CashAllocatorConfig:\n", + "- run_name: # A name identifier for this run/session, used to tag and track configuration across backtest runs.\n", + "- thresholds: [(500, 4), (300, 3), (200, 2), (100, 1), (0, 0.5)] # (min_alloc, bucket_value) pairs; first pair whose min_alloc is satisfied sets the bucket. Cash is supplied at runtime.\n", + "\n", + "\n", + "================================================================================\n", + "Configuration Class: StrategyLimitsEnabled\n", + "Description: Configuration flags controlling which types of risk limits (delta, gamma, vega, theta, DTE, moneyness) are enforced.\n", + "================================================================================\n", + "\n", + "Configuration flags controlling which types of risk limits (delta, gamma, vega, theta, DTE, moneyness) are enforced.\n", + "\n", + "\n", + "Current Configuration Settings for StrategyLimitsEnabled:\n", + "{'run_name': '', 'delta': True, 'vega': False, 'gamma': False, 'theta': False, 'dte': True, 'moneyness': True, 'exercise': False}\n", + " \n", + "\n", + "Configuration Descriptions for StrategyLimitsEnabled:\n", + "- run_name: # A name identifier for this run/session, used to tag and track configuration across backtest runs.\n", + "- delta: True # Enable delta-based risk limits for the strategy (default True).\n", + "- vega: False # Enable vega-based risk limits for the strategy (default False).\n", + "- gamma: False # Enable gamma-based risk limits for the strategy (default False).\n", + "- theta: False # Enable theta-based risk limits for the strategy (default False).\n", + "- dte: True # Enable DTE-based position rolling limits (default True).\n", + "- moneyness: True # Enable moneyness-based position rolling limits (default True).\n", + "- exercise: False # Enable automatic exercise logic for expiring positions (default False).\n", + "\n", + "\n", + "================================================================================\n", + "Configuration Class: BaseCogConfig\n", + "Description: Base configuration for position analyzer cog components that perform specific analysis tasks.\n", + "================================================================================\n", + "\n", + "Base configuration for position analyzer cog components that perform specific analysis tasks.\n", + "\n", + "\n", + "Current Configuration Settings for BaseCogConfig:\n", + "{'run_name': '', 'name': None, 'enabled': True}\n", + " \n", + "\n", + "Configuration Descriptions for BaseCogConfig:\n", + "- run_name: # A name identifier for this run/session, used to tag and track configuration across backtest runs.\n", + "- name: None # Name identifier for the cog component.\n", + "- enabled: True # Flag to enable or disable this cog in the position analyzer.\n", + "\n", + "\n", + "================================================================================\n", + "Configuration Class: BaseSizerConfigs\n", + "Description: Base configuration for position sizing modules, defining the type of delta limit calculation.\n", + "================================================================================\n", + "\n", + "Base configuration for position sizing modules, defining the type of delta limit calculation.\n", + "\n", + "\n", + "Current Configuration Settings for BaseSizerConfigs:\n", + "{'run_name': '', 'delta_lmt_type': 'default'}\n", + " \n", + "\n", + "Configuration Descriptions for BaseSizerConfigs:\n", + "- run_name: # A name identifier for this run/session, used to tag and track configuration across backtest runs.\n", + "- delta_lmt_type: default # Type of delta limit calculation to use: 'default' uses fixed limits, 'zscore' uses volatility-adjusted limits.\n", + "\n", + "2025-12-07 20:51:32 EventDriven.configs.base WARNING: No description found for config 'max_slippage_pct' in BacktesterConfig.\n", + "\n", + "Current Configuration Settings for BacktesterConfig:\n", + "{'run_name': '', 't_plus_n': 1, 'finalize_trades': False, 'raise_errors': False, 'min_slippage_pct': 0.075, 'max_slippage_pct': 0.15}\n", + " \n", + "\n", + "Configuration Descriptions for BacktesterConfig:\n", + "- run_name: # A name identifier for this run/session, used to tag and track configuration across backtest runs.\n", + "- t_plus_n: 1 # Settlement delay for orders in business days (T+N, default 1).\n", + "- finalize_trades: False # Flag to enable finalization of trades at end of backtest (default False).\n", + "- raise_errors: False # Flag to raise errors during backtest execution instead of logging them (default False).\n", + "\n", + "\n", + "================================================================================\n", + "Configuration Class: UndlTimeseriesConfig\n", + "Description: Configuration for underlying asset timeseries data retrieval and interval settings.\n", + "================================================================================\n", + "\n", + "Configuration for underlying asset timeseries data retrieval and interval settings.\n", + "\n", + "\n", + "Current Configuration Settings for UndlTimeseriesConfig:\n", + "{'run_name': '', 'interval': '1d'}\n", + " \n", + "\n", + "Configuration Descriptions for UndlTimeseriesConfig:\n", + "- run_name: # A name identifier for this run/session, used to tag and track configuration across backtest runs.\n", + "- interval: 1d # Time interval for underlying price data (e.g., '1d' for daily, '1h' for hourly).\n", + "\n", + "\n", + "================================================================================\n", + "Configuration Class: OrderResolutionConfig\n", + "Description: Configuration for automatic order resolution when initial order schemas fail to find suitable options.\n", + "================================================================================\n", + "\n", + "Configuration for automatic order resolution when initial order schemas fail to find suitable options.\n", + "\n", + "\n", + "Current Configuration Settings for OrderResolutionConfig:\n", + "{'run_name': '', 'resolve_enabled': True, 'otm_moneyness_width': 0.45, 'itm_moneyness_width': 0.45, 'max_close': 10.0, 'max_tries': 20, 'max_dte_tolerance': 90}\n", + " \n", + "\n", + "Configuration Descriptions for OrderResolutionConfig:\n", + "- run_name: # A name identifier for this run/session, used to tag and track configuration across backtest runs.\n", + "- resolve_enabled: True # Flag to enable or disable automatic order resolution when initial order schema fails.\n", + "- otm_moneyness_width: 0.45 # Maximum OTM moneyness width for ATM vs OTM option selection (default 0.45).\n", + "- itm_moneyness_width: 0.45 # Maximum ITM moneyness width for ATM vs ITM option selection (default 0.45).\n", + "- max_close: 10.0 # Maximum close price allowed for the order structure (default 10.0).\n", + "- max_tries: 20 # Maximum number of attempts to resolve an order schema before giving up (default 20).\n", + "- max_dte_tolerance: 90 # Maximum days to expiration tolerance allowed for the order (default 90).\n", + "\n", + "\n", + "================================================================================\n", + "Configuration Class: DefaultSizerConfigs\n", + "Description: Standard position sizing configuration using fixed leverage without volatility adjustments.\n", + "================================================================================\n", + "\n", + "Standard position sizing configuration using fixed leverage without volatility adjustments.\n", + "\n", + "\n", + "Current Configuration Settings for DefaultSizerConfigs:\n", + "{'run_name': '', 'delta_lmt_type': 'default', 'sizing_lev': 1.0}\n", + " \n", + "\n", + "Configuration Descriptions for DefaultSizerConfigs:\n", + "- run_name: # A name identifier for this run/session, used to tag and track configuration across backtest runs.\n", + "- delta_lmt_type: default # Type of delta limit calculation to use: 'default' uses fixed limits, 'zscore' uses volatility-adjusted limits.\n", + "- sizing_lev: 1.0 # Leverage level to be used for sizing positions (multiplier on equity equivalent size).\n", + "\n", + "\n", + "================================================================================\n", + "Configuration Class: ZscoreSizerConfigs\n", + "Description: Advanced position sizing configuration using volatility-adjusted z-score based limits for dynamic risk management.\n", + "================================================================================\n", + "\n", + "Advanced position sizing configuration using volatility-adjusted z-score based limits for dynamic risk management.\n", + "\n", + "\n", + "Current Configuration Settings for ZscoreSizerConfigs:\n", + "{'run_name': '', 'delta_lmt_type': 'zscore', 'sizing_lev': 1.0, 'rvol_window': None, 'rolling_window': 100, 'weights': (0.5, 0.3, 0.2), 'vol_type': 'mean', 'norm_const': 1.0}\n", + " \n", + "\n", + "Configuration Descriptions for ZscoreSizerConfigs:\n", + "- run_name: # A name identifier for this run/session, used to tag and track configuration across backtest runs.\n", + "- delta_lmt_type: zscore # Type of delta limit calculation to use: 'default' uses fixed limits, 'zscore' uses volatility-adjusted limits.\n", + "- sizing_lev: 1.0 # Leverage level to be used for sizing positions (multiplier on equity equivalent size).\n", + "- rvol_window: None # Rolling volatility window size(s) for calculating relative volatility. Can be a single number or tuple of windows.\n", + "- rolling_window: 100 # Rolling window size for z-score calculation (default 100 days).\n", + "- weights: (0.5, 0.3, 0.2) # Weights tuple (w1, w2, w3) applied in the z-score calculation for combining different volatility measures.\n", + "- vol_type: mean # Type of volatility measure to be used (e.g., 'mean', 'weighted').\n", + "- norm_const: 1.0 # Normalization constant for z-score calculation to scale the volatility adjustment.\n", + "\n", + "\n", + "================================================================================\n", + "Configuration Class: LimitsEnabledConfig\n", + "Description: Configuration for the limits enforcement cog, managing risk thresholds and position rolling triggers.\n", + "================================================================================\n", + "\n", + "Configuration for the limits enforcement cog, managing risk thresholds and position rolling triggers.\n", + "\n", + "\n", + "Current Configuration Settings for LimitsEnabledConfig:\n", + "{'run_name': '', 'enabled_limits': StrategyLimitsEnabled(run_name='', delta=True, vega=False, gamma=False, theta=False, dte=True, moneyness=True, exercise=False), 'name': 'LimitsEnabledCog', 'enabled': True, 'cache_actions': True, 'delta_lmt_type': 'default', 'default_dte': 120, 'default_moneyness': 1.15}\n", + " \n", + "\n", + "Configuration Descriptions for LimitsEnabledConfig:\n", + "- run_name: # A name identifier for this run/session, used to tag and track configuration across backtest runs.\n", + "- enabled_limits: StrategyLimitsEnabled(run_name='', delta=True, vega=False, gamma=False, theta=False, dte=True, moneyness=True, exercise=False) # StrategyLimitsEnabled instance specifying which limit types are active.\n", + "- name: LimitsEnabledCog # Name identifier for the limits cog (default 'LimitsEnabledCog').\n", + "- enabled: True # Flag to enable or disable the limits enforcement cog (default True).\n", + "- cache_actions: True # Cache analyzed actions for performance optimization (default True).\n", + "- delta_lmt_type: default # Type of delta limit calculation: 'default' for fixed limits or 'zscore' for volatility-adjusted limits.\n", + "- default_dte: 120 # Default days to expiration threshold for rolling positions (default 120).\n", + "- default_moneyness: 1.15 # Default moneyness threshold for rolling positions (default 1.15).\n", + "\n", + "\n", + "================================================================================\n", + "Configuration Class: OrderPickerConfig\n", + "Description: Configuration for the order picker component that selects optimal orders from available option chains.\n", + "================================================================================\n", + "\n", + "Configuration for the order picker component that selects optimal orders from available option chains.\n", + "\n", + "\n", + "Current Configuration Settings for OrderPickerConfig:\n", + "{'run_name': '', 'start_date': datetime.date(2017, 1, 1), 'end_date': datetime.date(2025, 12, 7)}\n", + " \n", + "\n", + "Configuration Descriptions for OrderPickerConfig:\n", + "- run_name: # A name identifier for this run/session, used to tag and track configuration across backtest runs.\n", + "- start_date: 2017-01-01 # The start date for selecting orders from option chain data.\n", + "- end_date: 2025-12-07 # The end date for selecting orders from option chain data.\n", + "\n", + "\n", + "================================================================================\n", + "Configuration Class: OptionPriceConfig\n", + "Description: Configuration specifying which price type (bid, ask, midpoint, close) to use for option valuation.\n", + "================================================================================\n", + "\n", + "Configuration specifying which price type (bid, ask, midpoint, close) to use for option valuation.\n", + "\n", + "\n", + "Current Configuration Settings for OptionPriceConfig:\n", + "{'run_name': '', 'use_price': 'midpoint'}\n", + " \n", + "\n", + "Configuration Descriptions for OptionPriceConfig:\n", + "- run_name: # A name identifier for this run/session, used to tag and track configuration across backtest runs.\n", + "- use_price: midpoint # Price type to use for option pricing: 'midpoint', 'close', 'bid', or 'ask' (default 'midpoint').\n", + "\n", + "\n", + "================================================================================\n", + "Configuration Class: _CustomFrozenBaseConfigs\n", + "Description: Frozen configuration base class that prevents modification of attributes after initialization, except for run_name.\n", + "================================================================================\n", + "\n", + "Frozen configuration base class that prevents modification of attributes after initialization, except for run_name.\n", + "\n", + "\n", + "Current Configuration Settings for _CustomFrozenBaseConfigs:\n", + "{'run_name': ''}\n", + " \n", + "\n", + "Configuration Descriptions for _CustomFrozenBaseConfigs:\n", + "- run_name: # A name identifier for this run/session, used to tag and track configuration across backtest runs.\n", + "\n", + "\n", + "================================================================================\n", + "Configuration Class: CashAllocatorConfig\n", + "Description: Threshold-based cash bucket allocator for symbols.\n", + "================================================================================\n", + "\n", + "Threshold-based cash bucket allocator for symbols.\n", + "\n", + "\n", + "Current Configuration Settings for CashAllocatorConfig:\n", + "{'run_name': '', 'thresholds': [(500, 4), (300, 3), (200, 2), (100, 1), (0, 0.5)]}\n", + " \n", + "\n", + "Configuration Descriptions for CashAllocatorConfig:\n", + "- run_name: # A name identifier for this run/session, used to tag and track configuration across backtest runs.\n", + "- thresholds: [(500, 4), (300, 3), (200, 2), (100, 1), (0, 0.5)] # (min_alloc, bucket_value) pairs; first pair whose min_alloc is satisfied sets the bucket. Cash is supplied at runtime.\n", + "\n", + "\n", + "================================================================================\n", + "Configuration Class: StrategyLimitsEnabled\n", + "Description: Configuration flags controlling which types of risk limits (delta, gamma, vega, theta, DTE, moneyness) are enforced.\n", + "================================================================================\n", + "\n", + "Configuration flags controlling which types of risk limits (delta, gamma, vega, theta, DTE, moneyness) are enforced.\n", + "\n", + "\n", + "Current Configuration Settings for StrategyLimitsEnabled:\n", + "{'run_name': '', 'delta': True, 'vega': False, 'gamma': False, 'theta': False, 'dte': True, 'moneyness': True, 'exercise': False}\n", + " \n", + "\n", + "Configuration Descriptions for StrategyLimitsEnabled:\n", + "- run_name: # A name identifier for this run/session, used to tag and track configuration across backtest runs.\n", + "- delta: True # Enable delta-based risk limits for the strategy (default True).\n", + "- vega: False # Enable vega-based risk limits for the strategy (default False).\n", + "- gamma: False # Enable gamma-based risk limits for the strategy (default False).\n", + "- theta: False # Enable theta-based risk limits for the strategy (default False).\n", + "- dte: True # Enable DTE-based position rolling limits (default True).\n", + "- moneyness: True # Enable moneyness-based position rolling limits (default True).\n", + "- exercise: False # Enable automatic exercise logic for expiring positions (default False).\n", + "\n", + "\n", + "================================================================================\n", + "Configuration Class: BaseCogConfig\n", + "Description: Base configuration for position analyzer cog components that perform specific analysis tasks.\n", + "================================================================================\n", + "\n", + "Base configuration for position analyzer cog components that perform specific analysis tasks.\n", + "\n", + "\n", + "Current Configuration Settings for BaseCogConfig:\n", + "{'run_name': '', 'name': None, 'enabled': True}\n", + " \n", + "\n", + "Configuration Descriptions for BaseCogConfig:\n", + "- run_name: # A name identifier for this run/session, used to tag and track configuration across backtest runs.\n", + "- name: None # Name identifier for the cog component.\n", + "- enabled: True # Flag to enable or disable this cog in the position analyzer.\n", + "\n", + "\n", + "================================================================================\n", + "Configuration Class: BaseSizerConfigs\n", + "Description: Base configuration for position sizing modules, defining the type of delta limit calculation.\n", + "================================================================================\n", + "\n", + "Base configuration for position sizing modules, defining the type of delta limit calculation.\n", + "\n", + "\n", + "Current Configuration Settings for BaseSizerConfigs:\n", + "{'run_name': '', 'delta_lmt_type': 'default'}\n", + " \n", + "\n", + "Configuration Descriptions for BaseSizerConfigs:\n", + "- run_name: # A name identifier for this run/session, used to tag and track configuration across backtest runs.\n", + "- delta_lmt_type: default # Type of delta limit calculation to use: 'default' uses fixed limits, 'zscore' uses volatility-adjusted limits.\n", + "\n" + ] + }, + { + "ename": "", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31mThe Kernel crashed while executing code in the current cell or a previous cell. \n", + "\u001b[1;31mPlease review the code in the cell(s) to identify a possible cause of the failure. \n", + "\u001b[1;31mClick here for more info. \n", + "\u001b[1;31mView Jupyter log for further details." + ] + } + ], + "source": [ + "BaseConfigs.display_and_describe_all_configs()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "8f55b25d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
SizeEntryBarExitBarEntryPriceExitPricePnLReturnPctEntryTimeExitTimeDurationTicker
0105504551103.049417100.110001-308.638768-0.0285242023-01-042023-03-1469SBUX
112504675195.863123213.759995214.7624620.0913742023-01-042023-09-11250BA
289451475217.09562549.81300029249.3327401.9137862023-01-192023-12-29344NVDA
314517687358.781354382.399994330.6609620.0658302023-01-242023-09-27246NFLX
426521752149.932939358.9899905435.4833411.3943372023-01-302023-12-29333META
513952468384.58501698.5999981948.0825750.1656912023-02-022023-09-21231AMD
666525540148.548104147.710007-55.314406-0.0056422023-02-032023-02-2724AAPL
763545708154.328258170.3699951010.6294220.1039462023-03-062023-10-26234AAPL
896575587109.251048104.269997-478.180907-0.0455932023-04-182023-05-0416SBUX
955583708108.107058120.629997688.7616390.1158382023-04-282023-10-26181AMZN
1046607705210.885519210.000000-40.733868-0.0041992023-06-022023-10-23143TSLA
1114627752539.130375661.0000001706.1747500.2260492023-07-032023-12-29179COST
1213704752407.049710490.3699951083.1637080.2046932023-10-202023-12-2970NFLX
1361714752174.849846193.8999941162.0590510.1089512023-11-032023-12-2956AAPL
1496717735104.10308897.379997-645.416698-0.0645812023-11-082023-12-0527SBUX
15120718752114.499348149.5000004200.0781840.3056842023-11-092023-12-2950AMD
1646721752145.507500153.100006349.2552810.0521792023-11-142023-12-2945AMZN
1740722752240.127508255.100006598.8999140.0623522023-11-152023-12-2944TSLA
1812728752221.382136260.670013471.4545340.1774662023-11-242023-12-2935BA
\n", + "
" + ], + "text/plain": [ + " Size EntryBar ExitBar EntryPrice ExitPrice PnL ReturnPct \\\n", + "0 105 504 551 103.049417 100.110001 -308.638768 -0.028524 \n", + "1 12 504 675 195.863123 213.759995 214.762462 0.091374 \n", + "2 894 514 752 17.095625 49.813000 29249.332740 1.913786 \n", + "3 14 517 687 358.781354 382.399994 330.660962 0.065830 \n", + "4 26 521 752 149.932939 358.989990 5435.483341 1.394337 \n", + "5 139 524 683 84.585016 98.599998 1948.082575 0.165691 \n", + "6 66 525 540 148.548104 147.710007 -55.314406 -0.005642 \n", + "7 63 545 708 154.328258 170.369995 1010.629422 0.103946 \n", + "8 96 575 587 109.251048 104.269997 -478.180907 -0.045593 \n", + "9 55 583 708 108.107058 120.629997 688.761639 0.115838 \n", + "10 46 607 705 210.885519 210.000000 -40.733868 -0.004199 \n", + "11 14 627 752 539.130375 661.000000 1706.174750 0.226049 \n", + "12 13 704 752 407.049710 490.369995 1083.163708 0.204693 \n", + "13 61 714 752 174.849846 193.899994 1162.059051 0.108951 \n", + "14 96 717 735 104.103088 97.379997 -645.416698 -0.064581 \n", + "15 120 718 752 114.499348 149.500000 4200.078184 0.305684 \n", + "16 46 721 752 145.507500 153.100006 349.255281 0.052179 \n", + "17 40 722 752 240.127508 255.100006 598.899914 0.062352 \n", + "18 12 728 752 221.382136 260.670013 471.454534 0.177466 \n", + "\n", + " EntryTime ExitTime Duration Ticker \n", + "0 2023-01-04 2023-03-14 69 SBUX \n", + "1 2023-01-04 2023-09-11 250 BA \n", + "2 2023-01-19 2023-12-29 344 NVDA \n", + "3 2023-01-24 2023-09-27 246 NFLX \n", + "4 2023-01-30 2023-12-29 333 META \n", + "5 2023-02-02 2023-09-21 231 AMD \n", + "6 2023-02-03 2023-02-27 24 AAPL \n", + "7 2023-03-06 2023-10-26 234 AAPL \n", + "8 2023-04-18 2023-05-04 16 SBUX \n", + "9 2023-04-28 2023-10-26 181 AMZN \n", + "10 2023-06-02 2023-10-23 143 TSLA \n", + "11 2023-07-03 2023-12-29 179 COST \n", + "12 2023-10-20 2023-12-29 70 NFLX \n", + "13 2023-11-03 2023-12-29 56 AAPL \n", + "14 2023-11-08 2023-12-05 27 SBUX \n", + "15 2023-11-09 2023-12-29 50 AMD \n", + "16 2023-11-14 2023-12-29 45 AMZN \n", + "17 2023-11-15 2023-12-29 44 TSLA \n", + "18 2023-11-24 2023-12-29 35 BA " + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pd.set_option(\"display.max_columns\", 100)\n", + "pd.set_option(\"display.max_rows\", 100)\n", + "_key = 10\n", + "with open(\n", + " f\"/Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/input/profitable_weights_{_key}.json\", \"r\"\n", + ") as f:\n", + " weights = json.load(f)\n", + "ttrades__ = pd.read_csv(\n", + " f\"/Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/input/profitable_trades_{_key}.csv\"\n", + ").iloc[:, 1:]\n", + "ttrades__[\"Duration\"] = ttrades__.Duration.apply(lambda x: int(x.split(\" \")[0]))\n", + "tick = [\"AAPL\", \"NFLX\", \"NVDA\"]\n", + "trades_ = ttrades__#.iloc[-3:]\n", + "symbol_list = list(weights.keys())\n", + "cash = 20_000\n", + "# trades_.iloc[0, 8] = pd.NaT\n", + "# trades_ = trades_.iloc[3].to_frame().T\n", + "# trades_.iloc[0, 8] = '2025-01-05'\n", + "trades_ = trades_.iloc[:30]\n", + "trades_" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "f1d65628", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[get_engine] Creating engine for DB: securities_master, PID: 49061\n" + ] + } + ], + "source": [ + "## Setup Backtest Object\n", + "pd.options.display.max_rows = 50\n", + "pd.options.display.max_columns = 50\n", + "\n", + "evb_backtest = OptionSignalBacktest(trades_, initial_capital=cash)\n", + "rm = evb_backtest.risk_manager\n", + "pm = evb_backtest.portfolio\n", + "picker = rm.order_picker\n", + "market_data = rm.market_data\n", + "analyzer = rm.position_analyzer\n", + "scheduler = evb_backtest.eventScheduler" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "8b9966cf", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'BacktesterConfig_1': BacktesterConfig(run_name='', t_plus_n=1, finalize_trades=False, raise_errors=False, min_slippage_pct=0.075, max_slippage_pct=0.15),\n", + " 'RiskManagerConfig_1': RiskManagerConfig(run_name='', min_slippage_pct=0.25, max_slippage_pct=0.16, cache_orders=False, cache_position_analysis=False, cache_order_requests=False),\n", + " 'ChainConfig_1': ChainConfig(run_name='', max_pct_width=None, min_oi=None),\n", + " 'OrderPickerConfig_1': OrderPickerConfig(run_name='', start_date=datetime.date(2017, 1, 1), end_date=datetime.date(2025, 12, 7)),\n", + " 'OrderSchemaConfigs_1': OrderSchemaConfigs(run_name='', target_dte=270, strategy='vertical', structure_direction='long', spread_ticks=1, dte_tolerance=60, min_moneyness=0.65, max_moneyness=1, min_total_price=0.95),\n", + " 'OrderResolutionConfig_1': OrderResolutionConfig(run_name='', resolve_enabled=True, otm_moneyness_width=0.45, itm_moneyness_width=0.45, max_close=10.0, max_tries=20, max_dte_tolerance=90),\n", + " 'SkipCalcConfig_1': SkipCalcConfig(run_name='', window=20, skip_threshold=3.0, skip_enabled=True, abs_zscore_threshold=False, pct_zscore_threshold=False, spike_flag=False, std_window_bool=False, zero_filter=True, add_columns=[], skip_columns=['Midpoint']),\n", + " 'UndlTimeseriesConfig_1': UndlTimeseriesConfig(run_name='', interval='1d'),\n", + " 'OptionPriceConfig_1': OptionPriceConfig(run_name='', use_price='midpoint'),\n", + " 'PositionAnalyzerConfig_1': PositionAnalyzerConfig(run_name='', enabled=True, enabled_cogs=[]),\n", + " 'DefaultSizerConfigs_1': DefaultSizerConfigs(run_name='', delta_lmt_type='default', sizing_lev=1.0),\n", + " 'LimitsEnabledConfig_1': LimitsEnabledConfig(run_name='', name='LimitsEnabledCog', enabled=True, cache_actions=True, delta_lmt_type='default', default_dte=120, default_moneyness=1.15, enabled_limits=StrategyLimitsEnabled(run_name='', delta=True, vega=False, gamma=False, theta=False, dte=True, moneyness=True, exercise=False)),\n", + " 'StrategyLimitsEnabled_1': StrategyLimitsEnabled(run_name='', delta=True, vega=False, gamma=False, theta=False, dte=True, moneyness=True, exercise=False),\n", + " 'CashAllocatorConfig_1': CashAllocatorConfig(run_name='', thresholds=[(500, 4), (300, 3), (200, 2), (100, 1), (0, 0.5)]),\n", + " 'PortfolioManagerConfig_1': PortfolioManagerConfig(run_name='', weights_haircut=0.0, roll_failed_orders=True)}" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "## Extract Configs\n", + "pd.options.display.max_rows = 50\n", + "pd.options.display.max_columns = 50\n", + "\n", + "# evb_backtest = OptionSignalBacktest(trades_, initial_capital=cash)\n", + "confs = collect_run_configs(evb_backtest, debug=False)\n", + "confs" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "d007631d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2025-12-07 20:47:50 EventDriven.configs.base WARNING: Attempting to set attribute 'run_name' to 'long_bbands' in ZscoreSizerConfigs...\n", + "2025-12-07 20:47:50 EventDriven.configs.base CRITICAL: Failed to validate field 'rvol_window' in ZscoreSizerConfigs. Error: Subscripted generics cannot be used with class and instance checks\n", + "2025-12-07 20:47:50 EventDriven.configs.base CRITICAL: Failed to validate field 'rvol_window' in ZscoreSizerConfigs. Error: Subscripted generics cannot be used with class and instance checks\n" + ] + } + ], + "source": [ + "## Modify Configs\n", + "## Order Schema\n", + "confs[\"OrderSchemaConfigs_1\"].target_dte = 270\n", + "confs[\"OrderSchemaConfigs_1\"].strategy = \"vertical\"\n", + "confs[\"OrderSchemaConfigs_1\"].structure_direction = \"long\"\n", + "confs[\"OrderSchemaConfigs_1\"].spread_ticks = 1\n", + "confs[\"OrderSchemaConfigs_1\"].dte_tolerance = 60\n", + "confs[\"OrderSchemaConfigs_1\"].min_moneyness = 0.65\n", + "confs[\"OrderSchemaConfigs_1\"].max_moneyness = 1.0\n", + "confs[\"OrderSchemaConfigs_1\"].min_total_price = 0.95\n", + "\n", + "## OrderResolution\n", + "confs[\"OrderResolutionConfig_1\"].max_tries = 15\n", + "confs[\"OrderResolutionConfig_1\"].otm_moneyness_width = 0.45\n", + "confs[\"OrderResolutionConfig_1\"].itm_moneyness_width = 0.1\n", + "confs[\"OrderResolutionConfig_1\"].max_dte_tolerance = 95\n", + "\n", + "## SkipCalc\n", + "confs[\"SkipCalcConfig_1\"].skip_enabled = True\n", + "confs[\"SkipCalcConfig_1\"].window = 20\n", + "confs[\"SkipCalcConfig_1\"].skip_threshold = 3.0\n", + "confs[\"SkipCalcConfig_1\"].abs_zscore_threshold = True\n", + "confs[\"SkipCalcConfig_1\"].pct_zscore_threshold = True\n", + "confs[\"SkipCalcConfig_1\"].spike_flag = True\n", + "confs[\"SkipCalcConfig_1\"].std_window_bool = True\n", + "confs[\"SkipCalcConfig_1\"].zero_filter = True\n", + "\n", + "## LimitsEnabled\n", + "confs[\"LimitsEnabledConfig_1\"].enabled = True\n", + "confs[\"LimitsEnabledConfig_1\"].default_dte = 120\n", + "confs[\"LimitsEnabledConfig_1\"].default_moneyness = 1.20\n", + "\n", + "## Sizer\n", + "new_sizer_conf = ZscoreSizerConfigs(\n", + " sizing_lev=4.5,\n", + " rvol_window=[5, 20, 63],\n", + " rolling_window=100,\n", + " weights=[0.5, 0.3, 0.2],\n", + " vol_type=\"weighted_mean\",\n", + " norm_const=2.0\n", + ")\n", + "\n", + "confs[\"RiskManagerConfig_1\"].cache_orders=True\n", + "confs[\"RiskManagerConfig_1\"].cache_position_analysis = True\n", + "confs[\"RiskManagerConfig_1\"].cache_order_requests = True\n", + "confs[\"PositionAnalyzerConfig_1\"].enabled=True\n", + "confs[\"ChainConfig_1\"].max_pct_width=0.2\n", + "confs[\"ChainConfig_1\"].min_oi=5\n", + "\n", + "## Portfolio Configs\n", + "confs[\"PortfolioManagerConfig_1\"].roll_failed_orders = False\n", + "evb_backtest.config.raise_errors = True\n", + "evb_backtest.config.t_plus_n = 1\n", + "evb_backtest.config.max_slippage_pct = 0.125\n", + "evb_backtest.config.min_slippage_pct = 0.05\n", + "\n", + "## Additional Modifications\n", + "pm.config.weights_haircut = 0.05\n", + "pm.weight_map = weights\n", + "lmt_cog = evb_backtest.risk_manager.position_analyzer.cogs[0]\n", + "lmt_cog.sizer_configs = new_sizer_conf\n", + "\n", + "## Re-tag confs\n", + "tag_run(evb_backtest, run_name=\"long_bbands\")\n", + "confs = collect_run_configs(evb_backtest, debug=False)\n", + "exported = export_run_configs(evb_backtest,)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "b746a30a", + "metadata": {}, + "outputs": [], + "source": [ + "exported.save_to_yaml(\"/Users/chiemelienwanisobi/cloned_repos/configs/prod_strategies/long_bbands/backtest_config.yaml\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "ee53e31e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "RunConfigBundle(run_name='long_bbands', created_at=datetime.datetime(2025, 11, 29, 16, 31, 28, 736350), configs=['BacktesterConfig', 'RiskManagerConfig', 'ChainConfig', 'OrderPickerConfig', 'OrderSchemaConfigs', 'OrderResolutionConfig', 'SkipCalcConfig', 'UndlTimeseriesConfig', 'OptionPriceConfig', 'PositionAnalyzerConfig', 'ZscoreSizerConfigs', 'LimitsEnabledConfig', 'StrategyLimitsEnabled', 'CashAllocatorConfig', 'PortfolioManagerConfig'])" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "conf_bundle = RunConfigBundle.load_from_yaml(\n", + " \"/Users/chiemelienwanisobi/cloned_repos/configs/prod_strategies/long_bbands/backtest_config.yaml\"\n", + ")\n", + "conf_bundle" + ] + }, + { + "cell_type": "code", + "execution_count": 173, + "id": "52f2f468", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'BacktesterConfig_1': BacktesterConfig(run_name='bkt_test_11', t_plus_n=1, finalize_trades=False, raise_errors=True, min_slippage_pct=0.05, max_slippage_pct=0.125),\n", + " 'RiskManagerConfig_1': RiskManagerConfig(run_name='bkt_test_11', min_slippage_pct=0.25, max_slippage_pct=0.16, cache_orders=True, cache_position_analysis=True, cache_order_requests=True),\n", + " 'ChainConfig_1': ChainConfig(run_name='bkt_test_11', max_pct_width=0.2, min_oi=5),\n", + " 'OrderPickerConfig_1': OrderPickerConfig(run_name='bkt_test_11', start_date=datetime.date(2017, 1, 1), end_date=datetime.date(2025, 1, 31)),\n", + " 'OrderSchemaConfigs_1': OrderSchemaConfigs(run_name='bkt_test_11', target_dte=270, strategy='vertical', structure_direction='long', spread_ticks=1, dte_tolerance=60, min_moneyness=0.65, max_moneyness=1.0, min_total_price=0.95),\n", + " 'OrderResolutionConfig_1': OrderResolutionConfig(run_name='bkt_test_11', resolve_enabled=True, otm_moneyness_width=0.45, itm_moneyness_width=0.1, max_close=10.0, max_tries=15, max_dte_tolerance=95),\n", + " 'SkipCalcConfig_1': SkipCalcConfig(run_name='bkt_test_11', window=20, skip_threshold=3.0, skip_enabled=True, abs_zscore_threshold=True, pct_zscore_threshold=True, spike_flag=True, std_window_bool=True, zero_filter=True, add_columns=[], skip_columns=['Midpoint']),\n", + " 'UndlTimeseriesConfig_1': UndlTimeseriesConfig(run_name='bkt_test_11', interval='1d'),\n", + " 'OptionPriceConfig_1': OptionPriceConfig(run_name='bkt_test_11', use_price='midpoint'),\n", + " 'PositionAnalyzerConfig_1': PositionAnalyzerConfig(run_name='bkt_test_11', enabled=True, enabled_cogs=[]),\n", + " 'ZscoreSizerConfigs_1': ZscoreSizerConfigs(run_name='', delta_lmt_type='zscore', sizing_lev=4.5, rvol_window=(5, 20, 63), rolling_window=100, weights=(0.5, 0.3, 0.2), vol_type='weighted_mean', norm_const=2.0),\n", + " 'LimitsEnabledConfig_1': LimitsEnabledConfig(run_name='bkt_test_11', name='LimitsEnabledCog', enabled=True, cache_actions=True, delta_lmt_type='zscore', default_dte=120, default_moneyness=1.2, enabled_limits=StrategyLimitsEnabled(run_name='bkt_test_11', delta=True, vega=False, gamma=False, theta=False, dte=True, moneyness=True, exercise=False)),\n", + " 'StrategyLimitsEnabled_1': StrategyLimitsEnabled(run_name='bkt_test_11', delta=True, vega=False, gamma=False, theta=False, dte=True, moneyness=True, exercise=False),\n", + " 'CashAllocatorConfig_1': CashAllocatorConfig(run_name='bkt_test_11', thresholds=[(500.0, 4.0), (300.0, 3.0), (200.0, 2.0), (100.0, 1.0), (0.0, 0.5)]),\n", + " 'PortfolioManagerConfig_1': PortfolioManagerConfig(run_name='bkt_test_11', weights_haircut=0.05, roll_failed_orders=False)}" + ] + }, + "execution_count": 173, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "conf_bundle.configs" + ] + }, + { + "cell_type": "code", + "execution_count": 141, + "id": "ecd44c75", + "metadata": {}, + "outputs": [], + "source": [ + "import yaml\n", + "filename = \"/Users/chiemelienwanisobi/cloned_repos/configs/prod_strategies/long_bbands/trade_meta.yaml\"\n", + "template_conf = {\n", + " \"traded_symbols\": [],\n", + " \"ruin_value\": 0.0,\n", + " \"warmup_period\": 300,\n", + " \"cash\": 20_000,\n", + " \"weights_last_refresh\": \"\",\n", + " \"official_start_date\": \"\",\n", + " \"open_missed_signals\": True,\n", + " \"strat_name\": \"LongBBandsTrend_SL\",\n", + " \"strat_slug\": \"long_bbands\",\n", + " \"executor_level\": 3,\n", + " \"weights\": []\n", + "}\n", + "with open(filename, \"w\") as f:\n", + " yaml.safe_dump(template_conf, f, default_flow_style=False, sort_keys=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "id": "b31e4dca", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Position Analysis Meta: StrategyChangeMeta(date=2024-01-03 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 0 event(s)\n", + "Processing event: MARKET 2024-01-04 00:00:00\n", + "Processing event: SIGNAL 2024-01-04 00:00:00\n", + "Cash at Hand: 8.810106552864475, Max Contract Price: 4 for Signal: BA20240104LONG\n", + "Generating order for request: OrderRequest(date='2024-01-04', symbol='BA', option_type='c', max_close=4, tick_cash=881.0106552864476, direction='LONG', signal_id='BA20240104LONG', spot=np.float64(244.94000244140625), chain_spot=np.float64(244.94000244140625), is_tick_cash_scaled=True)\n", + "\n", + "Order Received: {'result': 'SUCCESSFUL', 'signal_id': 'BA20240104LONG', 'map_signal_id': 'BA20240104LONG', 'date': datetime.date(2024, 1, 4), 'data': {'trade_id': '&L:BA20240920C320&S:BA20240920C330', 'long': ['BA20240920C320'], 'short': ['BA20240920C330'], 'close': np.float64(1.2000000000000002), 'quantity': 1}}\n", + "\n", + "2025-11-28 22:39:21 DataManager.py CRITICAL: Skipping MySQL query. This is not optimized and may lead to performance issues.\n", + "Processing event: SIGNAL 2024-01-04 00:00:00\n", + "Cash at Hand: 17.99608359121647, Max Contract Price: 4 for Signal: AAPL20240104LONG\n", + "Generating order for request: OrderRequest(date='2024-01-04', symbol='AAPL', option_type='c', max_close=4, tick_cash=1799.6083591216468, direction='LONG', signal_id='AAPL20240104LONG', spot=np.float64(180.20811462402344), chain_spot=np.float64(180.20811462402344), is_tick_cash_scaled=True)\n", + "\n", + "Order Received: {'result': 'SUCCESSFUL', 'signal_id': 'AAPL20240104LONG', 'map_signal_id': 'AAPL20240104LONG', 'date': datetime.date(2024, 1, 4), 'data': {'trade_id': '&L:AAPL20240920C200&S:AAPL20240920C205', 'long': ['AAPL20240920C200'], 'short': ['AAPL20240920C205'], 'close': np.float64(1.8250000000000002), 'quantity': 1}}\n", + "\n", + "2025-11-28 22:39:25 DataManager.py CRITICAL: Skipping MySQL query. This is not optimized and may lead to performance issues.\n", + "Processing event: SIGNAL 2024-01-04 00:00:00\n", + "Cash at Hand: 24.019142650767826, Max Contract Price: 4 for Signal: AMD20240104LONG\n", + "Generating order for request: OrderRequest(date='2024-01-04', symbol='AMD', option_type='c', max_close=4, tick_cash=2401.9142650767826, direction='LONG', signal_id='AMD20240104LONG', spot=np.float64(136.00999450683594), chain_spot=np.float64(136.00999450683594), is_tick_cash_scaled=True)\n", + "\n", + "Order Received: {'result': 'SUCCESSFUL', 'signal_id': 'AMD20240104LONG', 'map_signal_id': 'AMD20240104LONG', 'date': datetime.date(2024, 1, 4), 'data': {'trade_id': '&L:AMD20240920C145&S:AMD20240920C150', 'long': ['AMD20240920C145'], 'short': ['AMD20240920C150'], 'close': np.float64(1.9500000000000028), 'quantity': 1}}\n", + "\n", + "2025-11-28 22:39:27 DataManager.py CRITICAL: Skipping MySQL query. This is not optimized and may lead to performance issues.\n", + "2025-11-28 22:39:29 EventDriven.riskmanager.market_data ERROR: Failed to retrieve dividends for symbol AMD\n", + "Processing event: SIGNAL 2024-01-04 00:00:00\n", + "Cash at Hand: 23.124242549628384, Max Contract Price: 4 for Signal: META20240104LONG\n", + "Generating order for request: OrderRequest(date='2024-01-04', symbol='META', option_type='c', max_close=4, tick_cash=2312.4242549628384, direction='LONG', signal_id='META20240104LONG', spot=np.float64(344.9931640625), chain_spot=np.float64(344.9931945800781), is_tick_cash_scaled=True)\n", + "\n", + "Order Received: {'result': 'SUCCESSFUL', 'signal_id': 'META20240104LONG', 'map_signal_id': 'META20240104LONG', 'date': datetime.date(2024, 1, 4), 'data': {'trade_id': '&L:META20240920C450&S:META20240920C460', 'long': ['META20240920C450'], 'short': ['META20240920C460'], 'close': np.float64(1.6500000000000004), 'quantity': 1}}\n", + "\n", + "2025-11-28 22:39:46 DataManager.py CRITICAL: Skipping MySQL query. This is not optimized and may lead to performance issues.\n", + "Processing event: SIGNAL 2024-01-04 00:00:00\n", + "Cash at Hand: 15.699110600256146, Max Contract Price: 4 for Signal: COST20240104LONG\n", + "Generating order for request: OrderRequest(date='2024-01-04', symbol='COST', option_type='c', max_close=4, tick_cash=1569.9110600256147, direction='LONG', signal_id='COST20240104LONG', spot=np.float64(641.2394409179688), chain_spot=np.float64(641.2393798828125), is_tick_cash_scaled=True)\n", + "\n", + "Order Received: {'result': 'SUCCESSFUL', 'signal_id': 'COST20240104LONG', 'map_signal_id': 'COST20240104LONG', 'date': datetime.date(2024, 1, 4), 'data': {'trade_id': '&L:COST20240920C755&S:COST20240920C765', 'long': ['COST20240920C755'], 'short': ['COST20240920C765'], 'close': np.float64(2.2499999999999982), 'quantity': 1}}\n", + "\n", + "2025-11-28 22:40:06 DataManager.py CRITICAL: Skipping MySQL query. This is not optimized and may lead to performance issues.\n", + "Processing event: SIGNAL 2024-01-04 00:00:00\n", + "Cash at Hand: 9.722318961319436, Max Contract Price: 4 for Signal: NFLX20240104LONG\n", + "Generating order for request: OrderRequest(date='2024-01-04', symbol='NFLX', option_type='c', max_close=4, tick_cash=972.2318961319436, direction='LONG', signal_id='NFLX20240104LONG', spot=np.float64(47.46699905395508), chain_spot=np.float64(474.6699905395508), is_tick_cash_scaled=True)\n", + "\n", + "Order Received: {'result': 'SUCCESSFUL', 'signal_id': 'NFLX20240104LONG', 'map_signal_id': 'NFLX20240104LONG', 'date': datetime.date(2024, 1, 4), 'data': {'trade_id': '&L:NFLX20240920C520&S:NFLX20240920C530', 'long': ['NFLX20240920C520'], 'short': ['NFLX20240920C530'], 'close': np.float64(3.8500000000000014), 'quantity': 1}}\n", + "\n", + "2025-11-28 22:40:09 DataManager.py CRITICAL: Skipping MySQL query. This is not optimized and may lead to performance issues.\n", + "2025-11-28 22:40:15 EventDriven.riskmanager.market_data ERROR: Failed to retrieve dividends for symbol NFLX\n", + "Processing event: ORDER 2024-01-04 00:00:00\n", + "Processing event: ORDER 2024-01-04 00:00:00\n", + "Processing event: ORDER 2024-01-04 00:00:00\n", + "Processing event: ORDER 2024-01-04 00:00:00\n", + "Processing event: ORDER 2024-01-04 00:00:00\n", + "Processing event: ORDER 2024-01-04 00:00:00\n", + "Processing event: FILL 2024-01-04 00:00:00\n", + "Processing event: FILL 2024-01-04 00:00:00\n", + "Processing event: FILL 2024-01-04 00:00:00\n", + "Processing event: FILL 2024-01-04 00:00:00\n", + "Processing event: FILL 2024-01-04 00:00:00\n", + "Processing event: FILL 2024-01-04 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-01-04 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 19 event(s)\n", + "Processing event: MARKET 2024-01-05 00:00:00\n", + "2025-11-28 22:40:18 OptionSignalEventScheduler ERROR: Event date 20240106 not found in backtest range\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-01-05 00:00:00, num_actions=1)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-01-08 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-01-08 00:00:00, num_actions=1)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-01-09 00:00:00\n", + "Processing event: ORDER 2024-01-09 00:00:00\n", + "Processing event: FILL 2024-01-09 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-01-09 00:00:00, num_actions=1)\n", + "Event queue is empty, processed 3 event(s)\n", + "Processing event: MARKET 2024-01-10 00:00:00\n", + "Processing event: ORDER 2024-01-10 00:00:00\n", + "Processing event: FILL 2024-01-10 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-01-10 00:00:00, num_actions=1)\n", + "Event queue is empty, processed 3 event(s)\n", + "Processing event: MARKET 2024-01-11 00:00:00\n", + "Processing event: ORDER 2024-01-11 00:00:00\n", + "Processing event: FILL 2024-01-11 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-01-11 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 3 event(s)\n", + "Processing event: MARKET 2024-01-12 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-01-12 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-01-16 00:00:00\n", + "Processing event: SIGNAL 2024-01-16 00:00:00\n", + "Cash at Hand: 48.01915279313075, Max Contract Price: 4 for Signal: NVDA20240116LONG\n", + "Generating order for request: OrderRequest(date='2024-01-16', symbol='NVDA', option_type='c', max_close=4, tick_cash=4801.915279313075, direction='LONG', signal_id='NVDA20240116LONG', spot=np.float64(56.3537483215332), chain_spot=np.float64(563.5374450683594), is_tick_cash_scaled=True)\n", + "\n", + "Order Received: {'result': 'SUCCESSFUL', 'signal_id': 'NVDA20240116LONG', 'map_signal_id': 'NVDA20240116LONG', 'date': datetime.date(2024, 1, 16), 'data': {'trade_id': '&L:NVDA20240920C630&S:NVDA20240920C640', 'long': ['NVDA20240920C630'], 'short': ['NVDA20240920C640'], 'close': np.float64(3.4250000000000043), 'quantity': 1}}\n", + "\n", + "2025-11-28 22:40:25 DataManager.py CRITICAL: Skipping MySQL query. This is not optimized and may lead to performance issues.\n", + "2025-11-28 22:40:25 EventDriven.riskmanager.market_timeseries CRITICAL: Position Data for &L:NVDA20240920C630&S:NVDA20240920C640 not available, calculating greeks. Load time ~5 minutes\n", + "Processing event: ORDER 2024-01-16 00:00:00\n", + "Processing event: FILL 2024-01-16 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-01-16 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 4 event(s)\n", + "Processing event: MARKET 2024-01-17 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-01-17 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-01-18 00:00:00\n", + "Processing event: SIGNAL 2024-01-18 00:00:00\n", + "Processing event: ORDER 2024-01-18 00:00:00\n", + "Processing event: FILL 2024-01-18 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-01-18 00:00:00, num_actions=1)\n", + "Event queue is empty, processed 4 event(s)\n", + "Processing event: MARKET 2024-01-19 00:00:00\n", + "Processing event: ORDER 2024-01-19 00:00:00\n", + "Processing event: FILL 2024-01-19 00:00:00\n", + "2025-11-28 22:40:33 OptionSignalEventScheduler ERROR: Event date 20240120 not found in backtest range\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-01-19 00:00:00, num_actions=1)\n", + "Event queue is empty, processed 3 event(s)\n", + "Processing event: MARKET 2024-01-22 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-01-22 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-01-23 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-01-23 00:00:00, num_actions=1)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-01-24 00:00:00\n", + "Processing event: ORDER 2024-01-24 00:00:00\n", + "Processing event: FILL 2024-01-24 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-01-24 00:00:00, num_actions=1)\n", + "Event queue is empty, processed 3 event(s)\n", + "Processing event: MARKET 2024-01-25 00:00:00\n", + "Processing event: ROLL 2024-01-25 00:00:00\n", + "\n", + "Performing Roll Operation\n", + "\n", + "Rolling contract (sell side) for AMD at 2024-01-25 00:00:00\n", + "Processing event: SIGNAL 2024-01-25 00:00:00\n", + "Processing event: ORDER 2024-01-25 00:00:00\n", + "Processing event: FILL 2024-01-25 00:00:00\n", + "Rolling contract (buy side) for AMD at 2024-01-25 00:00:00\n", + "Processing event: SIGNAL 2024-01-25 00:00:00\n", + "Cash at Hand: 32.27541917020321, Max Contract Price: 4 for Signal: AMD20240104LONG\n", + "Generating order for request: OrderRequest(date='2024-01-25', symbol='AMD', option_type='c', max_close=4, tick_cash=np.float64(3227.541917020321), direction='LONG', signal_id='AMD20240104LONG', spot=np.float64(180.3300018310547), chain_spot=np.float64(180.3300018310547), is_tick_cash_scaled=True)\n", + "\n", + "Order Received: {'result': 'SUCCESSFUL', 'signal_id': 'AMD20240104LONG', 'map_signal_id': 'AMD20240104LONG', 'date': datetime.date(2024, 1, 25), 'data': {'trade_id': '&L:AMD20240920C200&S:AMD20240920C210', 'long': ['AMD20240920C200'], 'short': ['AMD20240920C210'], 'close': np.float64(3.224999999999998), 'quantity': 1}}\n", + "\n", + "2025-11-28 22:40:37 DataManager.py CRITICAL: Skipping MySQL query. This is not optimized and may lead to performance issues.\n", + "2025-11-28 22:40:37 EventDriven.riskmanager.market_timeseries CRITICAL: Position Data for &L:AMD20240920C200&S:AMD20240920C210 not available, calculating greeks. Load time ~5 minutes\n", + "Processing event: ORDER 2024-01-25 00:00:00\n", + "Processing event: FILL 2024-01-25 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-01-25 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 8 event(s)\n", + "Processing event: MARKET 2024-01-26 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-01-26 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-01-29 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-01-29 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-01-30 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-01-30 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-01-31 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-01-31 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-02-01 00:00:00\n", + "Processing event: SIGNAL 2024-02-01 00:00:00\n", + "Cash at Hand: 4.815104837931586, Max Contract Price: 3 for Signal: AMZN20240201LONG\n", + "Generating order for request: OrderRequest(date='2024-02-01', symbol='AMZN', option_type='c', max_close=3, tick_cash=481.51048379315864, direction='LONG', signal_id='AMZN20240201LONG', spot=np.float64(159.27999877929688), chain_spot=np.float64(159.27999877929688), is_tick_cash_scaled=True)\n", + "\n", + "Order Received: {'result': 'SUCCESSFUL', 'signal_id': 'AMZN20240201LONG', 'map_signal_id': 'AMZN20240201LONG', 'date': datetime.date(2024, 2, 1), 'data': {'trade_id': '&L:AMZN20240920C185&S:AMZN20240920C195', 'long': ['AMZN20240920C185'], 'short': ['AMZN20240920C195'], 'close': np.float64(2.500000000000001), 'quantity': 1}}\n", + "\n", + "2025-11-28 22:40:44 DataManager.py CRITICAL: Skipping MySQL query. This is not optimized and may lead to performance issues.\n", + "2025-11-28 22:40:44 EventDriven.riskmanager.market_timeseries CRITICAL: Position Data for &L:AMZN20240920C185&S:AMZN20240920C195 not available, calculating greeks. Load time ~5 minutes\n", + "2025-11-28 22:40:46 EventDriven.riskmanager.market_data ERROR: Failed to retrieve dividends for symbol AMZN\n", + "Processing event: ORDER 2024-02-01 00:00:00\n", + "Processing event: FILL 2024-02-01 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-02-01 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 4 event(s)\n", + "Processing event: MARKET 2024-02-02 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-02-02 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-02-05 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-02-05 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-02-06 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-02-06 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-02-07 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-02-07 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-02-08 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-02-08 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-02-09 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-02-09 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-02-12 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-02-12 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-02-13 00:00:00\n", + "Processing event: SIGNAL 2024-02-13 00:00:00\n", + "Cash at Hand: 12.807883063534703, Max Contract Price: 4 for Signal: SBUX20240213LONG\n", + "Generating order for request: OrderRequest(date='2024-02-13', symbol='SBUX', option_type='c', max_close=4, tick_cash=1280.7883063534703, direction='LONG', signal_id='SBUX20240213LONG', spot=np.float64(89.65399169921875), chain_spot=np.float64(89.65399169921875), is_tick_cash_scaled=True)\n", + "\n", + "Order Received: {'result': 'SUCCESSFUL', 'signal_id': 'SBUX20240213LONG', 'map_signal_id': 'SBUX20240213LONG', 'date': datetime.date(2024, 2, 13), 'data': {'trade_id': '&L:SBUX20240920C95&S:SBUX20240920C100', 'long': ['SBUX20240920C95'], 'short': ['SBUX20240920C100'], 'close': np.float64(2.2), 'quantity': 1}}\n", + "\n", + "2025-11-28 22:40:57 DataManager.py CRITICAL: Skipping MySQL query. This is not optimized and may lead to performance issues.\n", + "2025-11-28 22:40:57 EventDriven.riskmanager.market_timeseries CRITICAL: Position Data for &L:SBUX20240920C95&S:SBUX20240920C100 not available, calculating greeks. Load time ~5 minutes\n", + "Processing event: ORDER 2024-02-13 00:00:00\n", + "Processing event: FILL 2024-02-13 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-02-13 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 4 event(s)\n", + "Processing event: MARKET 2024-02-14 00:00:00\n", + "Processing event: SIGNAL 2024-02-14 00:00:00\n", + "Processing event: ORDER 2024-02-14 00:00:00\n", + "Processing event: FILL 2024-02-14 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-02-14 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 4 event(s)\n", + "Processing event: MARKET 2024-02-15 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-02-15 00:00:00, num_actions=1)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-02-16 00:00:00\n", + "Processing event: ORDER 2024-02-16 00:00:00\n", + "Processing event: FILL 2024-02-16 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-02-16 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 3 event(s)\n", + "Processing event: MARKET 2024-02-20 00:00:00\n", + "Processing event: SIGNAL 2024-02-20 00:00:00\n", + "Processing event: ORDER 2024-02-20 00:00:00\n", + "Processing event: FILL 2024-02-20 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-02-20 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 4 event(s)\n", + "Processing event: MARKET 2024-02-21 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-02-21 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-02-22 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-02-22 00:00:00, num_actions=1)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-02-23 00:00:00\n", + "Processing event: ROLL 2024-02-23 00:00:00\n", + "\n", + "Performing Roll Operation\n", + "\n", + "Rolling contract (sell side) for NVDA at 2024-02-23 00:00:00\n", + "Processing event: SIGNAL 2024-02-23 00:00:00\n", + "Processing event: ORDER 2024-02-23 00:00:00\n", + "Processing event: FILL 2024-02-23 00:00:00\n", + "Rolling contract (buy side) for NVDA at 2024-02-23 00:00:00\n", + "Processing event: SIGNAL 2024-02-23 00:00:00\n", + "Cash at Hand: 75.7831395893178, Max Contract Price: 4 for Signal: NVDA20240116LONG\n", + "Generating order for request: OrderRequest(date='2024-02-23', symbol='NVDA', option_type='c', max_close=4, tick_cash=np.float64(7578.31395893178), direction='LONG', signal_id='NVDA20240116LONG', spot=np.float64(78.77750396728516), chain_spot=np.float64(787.7750396728516), is_tick_cash_scaled=True)\n", + "\n", + "Order Received: {'result': 'SUCCESSFUL', 'signal_id': 'NVDA20240116LONG', 'map_signal_id': 'NVDA20240116LONG', 'date': datetime.date(2024, 2, 23), 'data': {'trade_id': '&L:NVDA20240920C930&S:NVDA20240920C940', 'long': ['NVDA20240920C930'], 'short': ['NVDA20240920C940'], 'close': np.float64(2.700000000000003), 'quantity': 1}}\n", + "\n", + "2025-11-28 22:41:10 DataManager.py CRITICAL: Skipping MySQL query. This is not optimized and may lead to performance issues.\n", + "2025-11-28 22:41:10 EventDriven.riskmanager.market_timeseries CRITICAL: Position Data for &L:NVDA20240920C930&S:NVDA20240920C940 not available, calculating greeks. Load time ~5 minutes\n", + "Processing event: ORDER 2024-02-23 00:00:00\n", + "Processing event: FILL 2024-02-23 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-02-23 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 8 event(s)\n", + "Processing event: MARKET 2024-02-26 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-02-26 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-02-27 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-02-27 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-02-28 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-02-28 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-02-29 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-02-29 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-03-01 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-03-01 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-03-04 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-03-04 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-03-05 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-03-05 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-03-06 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-03-06 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-03-07 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-03-07 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-03-08 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-03-08 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-03-11 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-03-11 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-03-12 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-03-12 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-03-13 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-03-13 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-03-14 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-03-14 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-03-15 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-03-15 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-03-18 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-03-18 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-03-19 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-03-19 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-03-20 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-03-20 00:00:00, num_actions=1)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-03-21 00:00:00\n", + "Processing event: ROLL 2024-03-21 00:00:00\n", + "\n", + "Performing Roll Operation\n", + "\n", + "Rolling contract (sell side) for NFLX at 2024-03-21 00:00:00\n", + "Processing event: SIGNAL 2024-03-21 00:00:00\n", + "Processing event: ORDER 2024-03-21 00:00:00\n", + "Processing event: FILL 2024-03-21 00:00:00\n", + "Rolling contract (buy side) for NFLX at 2024-03-21 00:00:00\n", + "Processing event: SIGNAL 2024-03-21 00:00:00\n", + "Cash at Hand: 13.800203738568857, Max Contract Price: 4 for Signal: NFLX20240104LONG\n", + "Generating order for request: OrderRequest(date='2024-03-21', symbol='NFLX', option_type='c', max_close=4, tick_cash=np.float64(1380.0203738568857), direction='LONG', signal_id='NFLX20240104LONG', spot=np.float64(62.270999908447266), chain_spot=np.float64(622.7099990844727), is_tick_cash_scaled=True)\n", + "\n", + "Order Received: {'result': 'SUCCESSFUL', 'signal_id': 'NFLX20240104LONG', 'map_signal_id': 'NFLX20240104LONG', 'date': datetime.date(2024, 3, 21), 'data': {'trade_id': '&L:NFLX20241220C680&S:NFLX20241220C690', 'long': ['NFLX20241220C680'], 'short': ['NFLX20241220C690'], 'close': np.float64(3.75), 'quantity': 1}}\n", + "\n", + "2025-11-28 22:41:34 DataManager.py CRITICAL: Skipping MySQL query. This is not optimized and may lead to performance issues.\n", + "2025-11-28 22:41:34 EventDriven.riskmanager.market_timeseries CRITICAL: Position Data for &L:NFLX20241220C680&S:NFLX20241220C690 not available, calculating greeks. Load time ~5 minutes\n", + "Processing event: ORDER 2024-03-21 00:00:00\n", + "Processing event: FILL 2024-03-21 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-03-21 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 8 event(s)\n", + "Processing event: MARKET 2024-03-22 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-03-22 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-03-25 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-03-25 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-03-26 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-03-26 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-03-27 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-03-27 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-03-28 00:00:00\n", + "2025-11-28 22:41:41 OptionSignalEventScheduler ERROR: Event date 20240329 not found in backtest range\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-03-28 00:00:00, num_actions=1)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-04-01 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-04-01 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-04-02 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-04-02 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-04-03 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-04-03 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-04-04 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-04-04 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-04-05 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-04-05 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-04-08 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-04-08 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-04-09 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-04-09 00:00:00, num_actions=1)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-04-10 00:00:00\n", + "Processing event: ORDER 2024-04-10 00:00:00\n", + "Processing event: FILL 2024-04-10 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-04-10 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 3 event(s)\n", + "Processing event: MARKET 2024-04-11 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-04-11 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-04-12 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-04-12 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-04-15 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-04-15 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-04-16 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-04-16 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-04-17 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-04-17 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-04-18 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-04-18 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-04-19 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-04-19 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-04-22 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-04-22 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-04-23 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-04-23 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-04-24 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-04-24 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-04-25 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-04-25 00:00:00, num_actions=1)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-04-26 00:00:00\n", + "Processing event: ORDER 2024-04-26 00:00:00\n", + "Processing event: FILL 2024-04-26 00:00:00\n", + "2025-11-28 22:42:05 OptionSignalEventScheduler ERROR: Event date 20240427 not found in backtest range\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-04-26 00:00:00, num_actions=1)\n", + "Event queue is empty, processed 3 event(s)\n", + "Processing event: MARKET 2024-04-29 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-04-29 00:00:00, num_actions=1)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-04-30 00:00:00\n", + "Processing event: ORDER 2024-04-30 00:00:00\n", + "Processing event: FILL 2024-04-30 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-04-30 00:00:00, num_actions=2)\n", + "Event queue is empty, processed 3 event(s)\n", + "Processing event: MARKET 2024-05-01 00:00:00\n", + "Processing event: ORDER 2024-05-01 00:00:00\n", + "Processing event: ORDER 2024-05-01 00:00:00\n", + "Processing event: FILL 2024-05-01 00:00:00\n", + "Processing event: FILL 2024-05-01 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-05-01 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 5 event(s)\n", + "Processing event: MARKET 2024-05-02 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-05-02 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-05-03 00:00:00\n", + "Processing event: SIGNAL 2024-05-03 00:00:00\n", + "Processing event: ORDER 2024-05-03 00:00:00\n", + "Processing event: FILL 2024-05-03 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-05-03 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 4 event(s)\n", + "Processing event: MARKET 2024-05-06 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-05-06 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-05-07 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-05-07 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-05-08 00:00:00\n", + "Processing event: SIGNAL 2024-05-08 00:00:00\n", + "Cash at Hand: 11.209048289264752, Max Contract Price: 4 for Signal: AMD20240508LONG\n", + "Generating order for request: OrderRequest(date='2024-05-08', symbol='AMD', option_type='c', max_close=4, tick_cash=np.float64(1120.9048289264751), direction='LONG', signal_id='AMD20240508LONG', spot=np.float64(153.6199951171875), chain_spot=np.float64(153.6199951171875), is_tick_cash_scaled=True)\n", + "\n", + "Order Received: {'result': 'SUCCESSFUL', 'signal_id': 'AMD20240508LONG', 'map_signal_id': 'AMD20240508LONG', 'date': datetime.date(2024, 5, 8), 'data': {'trade_id': '&L:AMD20250117C165&S:AMD20250117C170', 'long': ['AMD20250117C165'], 'short': ['AMD20250117C170'], 'close': np.float64(1.8499999999999979), 'quantity': 1}}\n", + "\n", + "2025-11-28 22:42:13 DataManager.py CRITICAL: Skipping MySQL query. This is not optimized and may lead to performance issues.\n", + "2025-11-28 22:42:13 EventDriven.riskmanager.market_timeseries CRITICAL: Position Data for &L:AMD20250117C165&S:AMD20250117C170 not available, calculating greeks. Load time ~5 minutes\n", + "Processing event: ORDER 2024-05-08 00:00:00\n", + "Processing event: FILL 2024-05-08 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-05-08 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 4 event(s)\n", + "Processing event: MARKET 2024-05-09 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-05-09 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-05-10 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-05-10 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-05-13 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-05-13 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-05-14 00:00:00\n", + "Processing event: SIGNAL 2024-05-14 00:00:00\n", + "Cash at Hand: 13.250786237900193, Max Contract Price: 4 for Signal: AAPL20240514LONG\n", + "Generating order for request: OrderRequest(date='2024-05-14', symbol='AAPL', option_type='c', max_close=4, tick_cash=np.float64(1325.0786237900193), direction='LONG', signal_id='AAPL20240514LONG', spot=np.float64(186.1655731201172), chain_spot=np.float64(186.16555786132812), is_tick_cash_scaled=True)\n", + "2025-11-28 22:42:21 QuantTools.EventDriven.riskmanager ERROR: Retrieved chain for AAPL on 2024-05-14\n", + "\n", + "Order Received: {'result': 'SUCCESSFUL', 'signal_id': 'AAPL20240514LONG', 'map_signal_id': 'AAPL20240514LONG', 'date': datetime.date(2024, 5, 14), 'data': {'trade_id': '&L:AAPL20241220C215&S:AAPL20241220C230', 'long': ['AAPL20241220C215'], 'short': ['AAPL20241220C230'], 'close': np.float64(2.475), 'quantity': 1}}\n", + "\n", + "2025-11-28 22:42:37 DataManager.py CRITICAL: Skipping MySQL query. This is not optimized and may lead to performance issues.\n", + "2025-11-28 22:42:37 EventDriven.riskmanager.market_timeseries CRITICAL: Position Data for &L:AAPL20241220C215&S:AAPL20241220C230 not available, calculating greeks. Load time ~5 minutes\n", + "Processing event: ORDER 2024-05-14 00:00:00\n", + "Processing event: FILL 2024-05-14 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-05-14 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 4 event(s)\n", + "Processing event: MARKET 2024-05-15 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-05-15 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-05-16 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-05-16 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-05-17 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-05-17 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-05-20 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-05-20 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-05-21 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-05-21 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-05-22 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-05-22 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-05-23 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-05-23 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-05-24 00:00:00\n", + "2025-11-28 22:42:51 OptionSignalEventScheduler ERROR: Event date 20240525 not found in backtest range\n", + "2025-11-28 22:42:51 OptionSignalEventScheduler ERROR: Event date 20240525 not found in backtest range\n", + "2025-11-28 22:42:51 OptionSignalEventScheduler ERROR: Event date 20240525 not found in backtest range\n", + "2025-11-28 22:42:51 OptionSignalEventScheduler ERROR: Event date 20240525 not found in backtest range\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-05-24 00:00:00, num_actions=4)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-05-28 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-05-28 00:00:00, num_actions=4)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-05-29 00:00:00\n", + "Processing event: ROLL 2024-05-29 00:00:00\n", + "\n", + "Performing Roll Operation\n", + "\n", + "Rolling contract (sell side) for NVDA at 2024-05-29 00:00:00\n", + "Processing event: ROLL 2024-05-29 00:00:00\n", + "\n", + "Performing Roll Operation\n", + "\n", + "Rolling contract (sell side) for META at 2024-05-29 00:00:00\n", + "Processing event: ROLL 2024-05-29 00:00:00\n", + "\n", + "Performing Roll Operation\n", + "\n", + "Rolling contract (sell side) for COST at 2024-05-29 00:00:00\n", + "Processing event: ROLL 2024-05-29 00:00:00\n", + "\n", + "Performing Roll Operation\n", + "\n", + "Rolling contract (sell side) for AMZN at 2024-05-29 00:00:00\n", + "Processing event: SIGNAL 2024-05-29 00:00:00\n", + "Processing event: SIGNAL 2024-05-29 00:00:00\n", + "Processing event: SIGNAL 2024-05-29 00:00:00\n", + "Processing event: SIGNAL 2024-05-29 00:00:00\n", + "Processing event: ORDER 2024-05-29 00:00:00\n", + "Processing event: ORDER 2024-05-29 00:00:00\n", + "Processing event: ORDER 2024-05-29 00:00:00\n", + "Processing event: FILL 2024-05-29 00:00:00\n", + "Rolling contract (buy side) for META at 2024-05-29 00:00:00\n", + "Processing event: FILL 2024-05-29 00:00:00\n", + "Rolling contract (buy side) for COST at 2024-05-29 00:00:00\n", + "Processing event: FILL 2024-05-29 00:00:00\n", + "Rolling contract (buy side) for AMZN at 2024-05-29 00:00:00\n", + "Processing event: SIGNAL 2024-05-29 00:00:00\n", + "Cash at Hand: 49.33883861594013, Max Contract Price: 4 for Signal: META20240104LONG\n", + "Generating order for request: OrderRequest(date='2024-05-29', symbol='META', option_type='c', max_close=4, tick_cash=np.float64(4933.883861594013), direction='LONG', signal_id='META20240104LONG', spot=np.float64(471.95379638671875), chain_spot=np.float64(471.953857421875), is_tick_cash_scaled=True)\n", + "\n", + "Order Received: {'result': 'SUCCESSFUL', 'signal_id': 'META20240104LONG', 'map_signal_id': 'META20240104LONG', 'date': datetime.date(2024, 5, 29), 'data': {'trade_id': '&L:META20250117C570&S:META20250117C580', 'long': ['META20250117C570'], 'short': ['META20250117C580'], 'close': np.float64(2.6750000000000007), 'quantity': 1}}\n", + "\n", + "2025-11-28 22:43:08 DataManager.py CRITICAL: Skipping MySQL query. This is not optimized and may lead to performance issues.\n", + "Processing event: SIGNAL 2024-05-29 00:00:00\n", + "Cash at Hand: 34.30508850465709, Max Contract Price: 4 for Signal: COST20240104LONG\n", + "Generating order for request: OrderRequest(date='2024-05-29', symbol='COST', option_type='c', max_close=4, tick_cash=np.float64(3430.508850465709), direction='LONG', signal_id='COST20240104LONG', spot=np.float64(800.129638671875), chain_spot=np.float64(800.1295776367188), is_tick_cash_scaled=True)\n", + "\n", + "Order Received: {'result': 'SUCCESSFUL', 'signal_id': 'COST20240104LONG', 'map_signal_id': 'COST20240104LONG', 'date': datetime.date(2024, 5, 29), 'data': {'trade_id': '&L:COST20250117C985&S:COST20250117C1000', 'long': ['COST20250117C985'], 'short': ['COST20250117C1000'], 'close': np.float64(2.299999999999999), 'quantity': 1}}\n", + "\n", + "2025-11-28 22:43:09 DataManager.py CRITICAL: Skipping MySQL query. This is not optimized and may lead to performance issues.\n", + "2025-11-28 22:43:09 EventDriven.riskmanager.market_timeseries CRITICAL: Position Data for &L:COST20250117C985&S:COST20250117C1000 not available, calculating greeks. Load time ~5 minutes\n", + "Processing event: SIGNAL 2024-05-29 00:00:00\n", + "Cash at Hand: 6.016240811350071, Max Contract Price: 3 for Signal: AMZN20240201LONG\n", + "Generating order for request: OrderRequest(date='2024-05-29', symbol='AMZN', option_type='c', max_close=3, tick_cash=np.float64(601.6240811350071), direction='LONG', signal_id='AMZN20240201LONG', spot=np.float64(182.02000427246094), chain_spot=np.float64(182.02000427246094), is_tick_cash_scaled=True)\n", + "\n", + "Order Received: {'result': 'SUCCESSFUL', 'signal_id': 'AMZN20240201LONG', 'map_signal_id': 'AMZN20240201LONG', 'date': datetime.date(2024, 5, 29), 'data': {'trade_id': '&L:AMZN20250117C195&S:AMZN20250117C200', 'long': ['AMZN20250117C195'], 'short': ['AMZN20250117C200'], 'close': np.float64(2.0), 'quantity': 1}}\n", + "\n", + "2025-11-28 22:43:10 DataManager.py CRITICAL: Skipping MySQL query. This is not optimized and may lead to performance issues.\n", + "2025-11-28 22:43:10 EventDriven.riskmanager.market_timeseries CRITICAL: Position Data for &L:AMZN20250117C195&S:AMZN20250117C200 not available, calculating greeks. Load time ~5 minutes\n", + "Processing event: ORDER 2024-05-29 00:00:00\n", + "Processing event: ORDER 2024-05-29 00:00:00\n", + "Processing event: ORDER 2024-05-29 00:00:00\n", + "Processing event: FILL 2024-05-29 00:00:00\n", + "Processing event: FILL 2024-05-29 00:00:00\n", + "Processing event: FILL 2024-05-29 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-05-29 00:00:00, num_actions=1)\n", + "Event queue is empty, processed 24 event(s)\n", + "Processing event: MARKET 2024-05-30 00:00:00\n", + "Processing event: ROLL 2024-05-30 00:00:00\n", + "\n", + "Performing Roll Operation\n", + "\n", + "Rolling contract (sell side) for NVDA at 2024-05-30 00:00:00\n", + "Processing event: SIGNAL 2024-05-30 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-05-30 00:00:00, num_actions=1)\n", + "Event queue is empty, processed 3 event(s)\n", + "Processing event: MARKET 2024-05-31 00:00:00\n", + "Processing event: ROLL 2024-05-31 00:00:00\n", + "\n", + "Performing Roll Operation\n", + "\n", + "Rolling contract (sell side) for NVDA at 2024-05-31 00:00:00\n", + "Processing event: SIGNAL 2024-05-31 00:00:00\n", + "2025-11-28 22:43:15 OptionSignalEventScheduler ERROR: Event date 20240601 not found in backtest range\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-05-31 00:00:00, num_actions=1)\n", + "Event queue is empty, processed 3 event(s)\n", + "Processing event: MARKET 2024-06-03 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-06-03 00:00:00, num_actions=1)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-06-04 00:00:00\n", + "Processing event: ROLL 2024-06-04 00:00:00\n", + "\n", + "Performing Roll Operation\n", + "\n", + "Rolling contract (sell side) for NVDA at 2024-06-04 00:00:00\n", + "Processing event: SIGNAL 2024-06-04 00:00:00\n", + "Processing event: ORDER 2024-06-04 00:00:00\n", + "Processing event: FILL 2024-06-04 00:00:00\n", + "Rolling contract (buy side) for NVDA at 2024-06-04 00:00:00\n", + "Processing event: SIGNAL 2024-06-04 00:00:00\n", + "Cash at Hand: 115.13725870634627, Max Contract Price: 4 for Signal: NVDA20240116LONG\n", + "Generating order for request: OrderRequest(date='2024-06-04', symbol='NVDA', option_type='c', max_close=4, tick_cash=np.float64(11513.725870634627), direction='LONG', signal_id='NVDA20240116LONG', spot=np.float64(116.38410949707031), chain_spot=np.float64(1163.8410949707031), is_tick_cash_scaled=True)\n", + "\n", + "Order Received: {'result': 'SUCCESSFUL', 'signal_id': 'NVDA20240116LONG', 'map_signal_id': 'NVDA20240116LONG', 'date': datetime.date(2024, 6, 4), 'data': {'trade_id': '&L:NVDA20250117C1530&S:NVDA20250117C1550', 'long': ['NVDA20250117C1530'], 'short': ['NVDA20250117C1550'], 'close': np.float64(3.799999999999997), 'quantity': 1}}\n", + "\n", + "2025-11-28 22:43:17 DataManager.py CRITICAL: Skipping MySQL query. This is not optimized and may lead to performance issues.\n", + "2025-11-28 22:43:17 EventDriven.riskmanager.market_timeseries CRITICAL: Position Data for &L:NVDA20250117C1530&S:NVDA20250117C1550 not available, calculating greeks. Load time ~5 minutes\n", + "Processing event: ORDER 2024-06-04 00:00:00\n", + "Processing event: FILL 2024-06-04 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-06-04 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 8 event(s)\n", + "Processing event: MARKET 2024-06-05 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-06-05 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-06-06 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-06-06 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-06-07 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-06-07 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-06-10 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-06-10 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-06-11 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-06-11 00:00:00, num_actions=1)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-06-12 00:00:00\n", + "Processing event: ORDER 2024-06-12 00:00:00\n", + "Processing event: FILL 2024-06-12 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-06-12 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 3 event(s)\n", + "Processing event: MARKET 2024-06-13 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-06-13 00:00:00, num_actions=1)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-06-14 00:00:00\n", + "Processing event: ORDER 2024-06-14 00:00:00\n", + "Processing event: FILL 2024-06-14 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-06-14 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 3 event(s)\n", + "Processing event: MARKET 2024-06-17 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-06-17 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-06-18 00:00:00\n", + "2025-11-28 22:43:33 OptionSignalEventScheduler ERROR: Event date 20240619 not found in backtest range\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-06-18 00:00:00, num_actions=1)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-06-20 00:00:00\n", + "Processing event: SIGNAL 2024-06-20 00:00:00\n", + "Processing event: ORDER 2024-06-20 00:00:00\n", + "Processing event: FILL 2024-06-20 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-06-20 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 4 event(s)\n", + "Processing event: MARKET 2024-06-21 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-06-21 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-06-24 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-06-24 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-06-25 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-06-25 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-06-26 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-06-26 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-06-27 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-06-27 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-06-28 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-06-28 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-07-01 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-07-01 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-07-02 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-07-02 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-07-03 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-07-03 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-07-05 00:00:00\n", + "Processing event: SIGNAL 2024-07-05 00:00:00\n", + "Cash at Hand: 24.98685439935024, Max Contract Price: 4 for Signal: TSLA20240705LONG\n", + "Generating order for request: OrderRequest(date='2024-07-05', symbol='TSLA', option_type='c', max_close=4, tick_cash=2498.685439935024, direction='LONG', signal_id='TSLA20240705LONG', spot=np.float64(251.52000427246094), chain_spot=np.float64(251.52000427246094), is_tick_cash_scaled=True)\n", + "\n", + "Order Received: {'result': 'SUCCESSFUL', 'signal_id': 'TSLA20240705LONG', 'map_signal_id': 'TSLA20240705LONG', 'date': datetime.date(2024, 7, 5), 'data': {'trade_id': '&L:TSLA20250321C260&S:TSLA20250321C265', 'long': ['TSLA20250321C260'], 'short': ['TSLA20250321C265'], 'close': np.float64(1.9250000000000043), 'quantity': 1}}\n", + "\n", + "2025-11-28 22:43:46 DataManager.py CRITICAL: Skipping MySQL query. This is not optimized and may lead to performance issues.\n", + "2025-11-28 22:43:46 EventDriven.riskmanager.market_timeseries CRITICAL: Position Data for &L:TSLA20250321C260&S:TSLA20250321C265 not available, calculating greeks. Load time ~5 minutes\n", + "2025-11-28 22:43:48 EventDriven.riskmanager.market_data ERROR: Failed to retrieve dividends for symbol TSLA\n", + "Processing event: ORDER 2024-07-05 00:00:00\n", + "Processing event: FILL 2024-07-05 00:00:00\n", + "2025-11-28 22:43:50 OptionSignalEventScheduler ERROR: Event date 20240706 not found in backtest range\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-07-05 00:00:00, num_actions=1)\n", + "Event queue is empty, processed 4 event(s)\n", + "Processing event: MARKET 2024-07-08 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-07-08 00:00:00, num_actions=1)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-07-09 00:00:00\n", + "Processing event: ORDER 2024-07-09 00:00:00\n", + "Processing event: FILL 2024-07-09 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-07-09 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 3 event(s)\n", + "Processing event: MARKET 2024-07-10 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-07-10 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-07-11 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-07-11 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-07-12 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-07-12 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-07-15 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-07-15 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-07-16 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-07-16 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-07-17 00:00:00\n", + "Processing event: SIGNAL 2024-07-17 00:00:00\n", + "Cash at Hand: 10.463421335141359, Max Contract Price: 4 for Signal: AMD20240717LONG\n", + "Generating order for request: OrderRequest(date='2024-07-17', symbol='AMD', option_type='c', max_close=4, tick_cash=np.float64(1046.3421335141359), direction='LONG', signal_id='AMD20240717LONG', spot=np.float64(159.42999267578125), chain_spot=np.float64(159.42999267578125), is_tick_cash_scaled=True)\n", + "\n", + "Order Received: {'result': 'SUCCESSFUL', 'signal_id': 'AMD20240717LONG', 'map_signal_id': 'AMD20240717LONG', 'date': datetime.date(2024, 7, 17), 'data': {'trade_id': '&L:AMD20250321C200&S:AMD20250321C210', 'long': ['AMD20250321C200'], 'short': ['AMD20250321C210'], 'close': np.float64(2.1500000000000004), 'quantity': 1}}\n", + "\n", + "2025-11-28 22:44:00 DataManager.py CRITICAL: Skipping MySQL query. This is not optimized and may lead to performance issues.\n", + "2025-11-28 22:44:00 EventDriven.riskmanager.market_timeseries CRITICAL: Position Data for &L:AMD20250321C200&S:AMD20250321C210 not available, calculating greeks. Load time ~5 minutes\n", + "Processing event: ORDER 2024-07-17 00:00:00\n", + "Processing event: FILL 2024-07-17 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-07-17 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 4 event(s)\n", + "Processing event: MARKET 2024-07-18 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-07-18 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-07-19 00:00:00\n", + "Processing event: SIGNAL 2024-07-19 00:00:00\n", + "Processing event: SIGNAL 2024-07-19 00:00:00\n", + "Processing event: ORDER 2024-07-19 00:00:00\n", + "Processing event: ORDER 2024-07-19 00:00:00\n", + "Processing event: FILL 2024-07-19 00:00:00\n", + "Processing event: FILL 2024-07-19 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-07-19 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 7 event(s)\n", + "Processing event: MARKET 2024-07-22 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-07-22 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-07-23 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-07-23 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-07-24 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-07-24 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-07-25 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-07-25 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-07-26 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-07-26 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-07-29 00:00:00\n", + "Processing event: SIGNAL 2024-07-29 00:00:00\n", + "Processing event: ORDER 2024-07-29 00:00:00\n", + "Processing event: FILL 2024-07-29 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-07-29 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 4 event(s)\n", + "Processing event: MARKET 2024-07-30 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-07-30 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-07-31 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-07-31 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-08-01 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-08-01 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-08-02 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-08-02 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-08-05 00:00:00\n", + "Processing event: SIGNAL 2024-08-05 00:00:00\n", + "Cash at Hand: 36.59060515415923, Max Contract Price: 4 for Signal: META20240805LONG\n", + "Generating order for request: OrderRequest(date='2024-08-05', symbol='META', option_type='c', max_close=4, tick_cash=np.float64(3659.060515415923), direction='LONG', signal_id='META20240805LONG', spot=np.float64(473.786865234375), chain_spot=np.float64(473.786865234375), is_tick_cash_scaled=True)\n", + "\n", + "Order Received: {'result': 'SUCCESSFUL', 'signal_id': 'META20240805LONG', 'map_signal_id': 'META20240805LONG', 'date': datetime.date(2024, 8, 5), 'data': {'trade_id': '&L:META20250620C580&S:META20250620C590', 'long': ['META20250620C580'], 'short': ['META20250620C590'], 'close': np.float64(2.9749999999999943), 'quantity': 1}}\n", + "\n", + "2025-11-28 22:44:17 DataManager.py CRITICAL: Skipping MySQL query. This is not optimized and may lead to performance issues.\n", + "2025-11-28 22:44:17 EventDriven.riskmanager.market_timeseries CRITICAL: Position Data for &L:META20250620C580&S:META20250620C590 not available, calculating greeks. Load time ~5 minutes\n", + "Processing event: ORDER 2024-08-05 00:00:00\n", + "Processing event: FILL 2024-08-05 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-08-05 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 4 event(s)\n", + "Processing event: MARKET 2024-08-06 00:00:00\n", + "Processing event: SIGNAL 2024-08-06 00:00:00\n", + "Processing event: ORDER 2024-08-06 00:00:00\n", + "Processing event: FILL 2024-08-06 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-08-06 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 4 event(s)\n", + "Processing event: MARKET 2024-08-07 00:00:00\n", + "Processing event: SIGNAL 2024-08-07 00:00:00\n", + "Processing event: ORDER 2024-08-07 00:00:00\n", + "Processing event: FILL 2024-08-07 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-08-07 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 4 event(s)\n", + "Processing event: MARKET 2024-08-08 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-08-08 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-08-09 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-08-09 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-08-12 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-08-12 00:00:00, num_actions=1)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-08-13 00:00:00\n", + "Processing event: ORDER 2024-08-13 00:00:00\n", + "Processing event: FILL 2024-08-13 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-08-13 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 3 event(s)\n", + "Processing event: MARKET 2024-08-14 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-08-14 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-08-15 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-08-15 00:00:00, num_actions=1)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-08-16 00:00:00\n", + "Processing event: ORDER 2024-08-16 00:00:00\n", + "Processing event: FILL 2024-08-16 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-08-16 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 3 event(s)\n", + "Processing event: MARKET 2024-08-19 00:00:00\n", + "Processing event: SIGNAL 2024-08-19 00:00:00\n", + "Cash at Hand: 11.20264267324284, Max Contract Price: 4 for Signal: SBUX20240819LONG\n", + "Generating order for request: OrderRequest(date='2024-08-19', symbol='SBUX', option_type='c', max_close=4, tick_cash=np.float64(1120.264267324284), direction='LONG', signal_id='SBUX20240819LONG', spot=np.float64(89.36016082763672), chain_spot=np.float64(89.36015319824219), is_tick_cash_scaled=True)\n", + "\n", + "Order Received: {'result': 'SUCCESSFUL', 'signal_id': 'SBUX20240819LONG', 'map_signal_id': 'SBUX20240819LONG', 'date': datetime.date(2024, 8, 19), 'data': {'trade_id': '&L:SBUX20250321C90&S:SBUX20250321C95', 'long': ['SBUX20250321C90'], 'short': ['SBUX20250321C95'], 'close': np.float64(2.499999999999999), 'quantity': 1}}\n", + "\n", + "2025-11-28 22:44:26 DataManager.py CRITICAL: Skipping MySQL query. This is not optimized and may lead to performance issues.\n", + "2025-11-28 22:44:26 EventDriven.riskmanager.market_timeseries CRITICAL: Position Data for &L:SBUX20250321C90&S:SBUX20250321C95 not available, calculating greeks. Load time ~5 minutes\n", + "Processing event: SIGNAL 2024-08-19 00:00:00\n", + "Cash at Hand: 12.731587532757421, Max Contract Price: 4 for Signal: TSLA20240819LONG\n", + "Generating order for request: OrderRequest(date='2024-08-19', symbol='TSLA', option_type='c', max_close=4, tick_cash=np.float64(1273.1587532757421), direction='LONG', signal_id='TSLA20240819LONG', spot=np.float64(222.72000122070312), chain_spot=np.float64(222.72000122070312), is_tick_cash_scaled=True)\n", + "\n", + "Order Received: {'result': 'SUCCESSFUL', 'signal_id': 'TSLA20240819LONG', 'map_signal_id': 'TSLA20240819LONG', 'date': datetime.date(2024, 8, 19), 'data': {'trade_id': '&L:TSLA20250620C240&S:TSLA20250620C250', 'long': ['TSLA20250620C240'], 'short': ['TSLA20250620C250'], 'close': np.float64(3.450000000000003), 'quantity': 1}}\n", + "\n", + "2025-11-28 22:44:29 DataManager.py CRITICAL: Skipping MySQL query. This is not optimized and may lead to performance issues.\n", + "2025-11-28 22:44:29 EventDriven.riskmanager.market_timeseries CRITICAL: Position Data for &L:TSLA20250620C240&S:TSLA20250620C250 not available, calculating greeks. Load time ~5 minutes\n", + "Processing event: ORDER 2024-08-19 00:00:00\n", + "Processing event: ORDER 2024-08-19 00:00:00\n", + "Processing event: FILL 2024-08-19 00:00:00\n", + "Processing event: FILL 2024-08-19 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-08-19 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 7 event(s)\n", + "Processing event: MARKET 2024-08-20 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-08-20 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-08-21 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-08-21 00:00:00, num_actions=1)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-08-22 00:00:00\n", + "Processing event: ORDER 2024-08-22 00:00:00\n", + "Processing event: FILL 2024-08-22 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-08-22 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 3 event(s)\n", + "Processing event: MARKET 2024-08-23 00:00:00\n", + "2025-11-28 22:44:38 OptionSignalEventScheduler ERROR: Event date 20240824 not found in backtest range\n", + "2025-11-28 22:44:38 OptionSignalEventScheduler ERROR: Event date 20240824 not found in backtest range\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-08-23 00:00:00, num_actions=2)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-08-26 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-08-26 00:00:00, num_actions=3)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-08-27 00:00:00\n", + "Processing event: ROLL 2024-08-27 00:00:00\n", + "\n", + "Performing Roll Operation\n", + "\n", + "Rolling contract (sell side) for AAPL at 2024-08-27 00:00:00\n", + "Processing event: ROLL 2024-08-27 00:00:00\n", + "\n", + "Performing Roll Operation\n", + "\n", + "Rolling contract (sell side) for NFLX at 2024-08-27 00:00:00\n", + "Processing event: ORDER 2024-08-27 00:00:00\n", + "Processing event: SIGNAL 2024-08-27 00:00:00\n", + "Processing event: SIGNAL 2024-08-27 00:00:00\n", + "Processing event: FILL 2024-08-27 00:00:00\n", + "Processing event: ORDER 2024-08-27 00:00:00\n", + "Processing event: ORDER 2024-08-27 00:00:00\n", + "Processing event: FILL 2024-08-27 00:00:00\n", + "Rolling contract (buy side) for AAPL at 2024-08-27 00:00:00\n", + "Processing event: FILL 2024-08-27 00:00:00\n", + "Rolling contract (buy side) for NFLX at 2024-08-27 00:00:00\n", + "Processing event: SIGNAL 2024-08-27 00:00:00\n", + "Cash at Hand: 35.76907743185767, Max Contract Price: 4 for Signal: AAPL20240514LONG\n", + "Generating order for request: OrderRequest(date='2024-08-27', symbol='AAPL', option_type='c', max_close=4, tick_cash=np.float64(3576.907743185767), direction='LONG', signal_id='AAPL20240514LONG', spot=np.float64(226.75384521484375), chain_spot=np.float64(226.7538604736328), is_tick_cash_scaled=True)\n", + "\n", + "Order Received: {'result': 'SUCCESSFUL', 'signal_id': 'AAPL20240514LONG', 'map_signal_id': 'AAPL20240514LONG', 'date': datetime.date(2024, 8, 27), 'data': {'trade_id': '&L:AAPL20250620C250&S:AAPL20250620C260', 'long': ['AAPL20250620C250'], 'short': ['AAPL20250620C260'], 'close': np.float64(3.424999999999999), 'quantity': 1}}\n", + "\n", + "2025-11-28 22:44:39 DataManager.py CRITICAL: Skipping MySQL query. This is not optimized and may lead to performance issues.\n", + "2025-11-28 22:44:39 EventDriven.riskmanager.market_timeseries CRITICAL: Position Data for &L:AAPL20250620C250&S:AAPL20250620C260 not available, calculating greeks. Load time ~5 minutes\n", + "Processing event: SIGNAL 2024-08-27 00:00:00\n", + "Cash at Hand: 15.36294015214368, Max Contract Price: 4 for Signal: NFLX20240104LONG\n", + "Generating order for request: OrderRequest(date='2024-08-27', symbol='NFLX', option_type='c', max_close=4, tick_cash=np.float64(1536.294015214368), direction='LONG', signal_id='NFLX20240104LONG', spot=np.float64(69.5719985961914), chain_spot=np.float64(695.7199859619141), is_tick_cash_scaled=True)\n", + "\n", + "Order Received: {'result': 'SUCCESSFUL', 'signal_id': 'NFLX20240104LONG', 'map_signal_id': 'NFLX20240104LONG', 'date': datetime.date(2024, 8, 27), 'data': {'trade_id': '&L:NFLX20250620C900&S:NFLX20250620C910', 'long': ['NFLX20250620C900'], 'short': ['NFLX20250620C910'], 'close': np.float64(1.975000000000005), 'quantity': 1}}\n", + "\n", + "2025-11-28 22:44:40 DataManager.py CRITICAL: Skipping MySQL query. This is not optimized and may lead to performance issues.\n", + "2025-11-28 22:44:40 EventDriven.riskmanager.market_timeseries CRITICAL: Position Data for &L:NFLX20250620C900&S:NFLX20250620C910 not available, calculating greeks. Load time ~5 minutes\n", + "Processing event: ORDER 2024-08-27 00:00:00\n", + "Processing event: ORDER 2024-08-27 00:00:00\n", + "Processing event: FILL 2024-08-27 00:00:00\n", + "Processing event: FILL 2024-08-27 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-08-27 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 17 event(s)\n", + "Processing event: MARKET 2024-08-28 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-08-28 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-08-29 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-08-29 00:00:00, num_actions=1)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-08-30 00:00:00\n", + "Processing event: ORDER 2024-08-30 00:00:00\n", + "Processing event: FILL 2024-08-30 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-08-30 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 3 event(s)\n", + "Processing event: MARKET 2024-09-03 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-09-03 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-09-04 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-09-04 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-09-05 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-09-05 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-09-06 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-09-06 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-09-09 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-09-09 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-09-10 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-09-10 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-09-11 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-09-11 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-09-12 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-09-12 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-09-13 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-09-13 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-09-16 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-09-16 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-09-17 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-09-17 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-09-18 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-09-18 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-09-19 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-09-19 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-09-20 00:00:00\n", + "2025-11-28 22:45:02 OptionSignalEventScheduler ERROR: Event date 20240921 not found in backtest range\n", + "2025-11-28 22:45:02 OptionSignalEventScheduler ERROR: Event date 20240921 not found in backtest range\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-09-20 00:00:00, num_actions=2)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-09-23 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-09-23 00:00:00, num_actions=2)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-09-24 00:00:00\n", + "Processing event: ROLL 2024-09-24 00:00:00\n", + "\n", + "Performing Roll Operation\n", + "\n", + "Rolling contract (sell side) for NVDA at 2024-09-24 00:00:00\n", + "Processing event: ROLL 2024-09-24 00:00:00\n", + "\n", + "Performing Roll Operation\n", + "\n", + "Rolling contract (sell side) for COST at 2024-09-24 00:00:00\n", + "Processing event: SIGNAL 2024-09-24 00:00:00\n", + "Processing event: SIGNAL 2024-09-24 00:00:00\n", + "Processing event: ORDER 2024-09-24 00:00:00\n", + "Processing event: ORDER 2024-09-24 00:00:00\n", + "Processing event: FILL 2024-09-24 00:00:00\n", + "Rolling contract (buy side) for NVDA at 2024-09-24 00:00:00\n", + "Processing event: FILL 2024-09-24 00:00:00\n", + "Rolling contract (buy side) for COST at 2024-09-24 00:00:00\n", + "Processing event: SIGNAL 2024-09-24 00:00:00\n", + "Cash at Hand: 100.28640068894157, Max Contract Price: 4 for Signal: NVDA20240116LONG\n", + "Generating order for request: OrderRequest(date='2024-09-24', symbol='NVDA', option_type='c', max_close=4, tick_cash=np.float64(10028.640068894158), direction='LONG', signal_id='NVDA20240116LONG', spot=np.float64(120.8353500366211), chain_spot=np.float64(120.8353500366211), is_tick_cash_scaled=True)\n", + "\n", + "Order Received: {'result': 'SUCCESSFUL', 'signal_id': 'NVDA20240116LONG', 'map_signal_id': 'NVDA20240116LONG', 'date': datetime.date(2024, 9, 24), 'data': {'trade_id': '&L:NVDA20250815C125&S:NVDA20250815C130', 'long': ['NVDA20250815C125'], 'short': ['NVDA20250815C130'], 'close': np.float64(2.0), 'quantity': 1}}\n", + "\n", + "2025-11-28 22:45:04 DataManager.py CRITICAL: Skipping MySQL query. This is not optimized and may lead to performance issues.\n", + "2025-11-28 22:45:04 EventDriven.riskmanager.market_timeseries CRITICAL: Position Data for &L:NVDA20250815C125&S:NVDA20250815C130 not available, calculating greeks. Load time ~5 minutes\n", + "Processing event: SIGNAL 2024-09-24 00:00:00\n", + "Cash at Hand: 47.82753419983484, Max Contract Price: 4 for Signal: COST20240104LONG\n", + "Generating order for request: OrderRequest(date='2024-09-24', symbol='COST', option_type='c', max_close=4, tick_cash=np.float64(4782.753419983484), direction='LONG', signal_id='COST20240104LONG', spot=np.float64(895.6698608398438), chain_spot=np.float64(895.6698608398438), is_tick_cash_scaled=True)\n", + "\n", + "Order Received: {'result': 'SUCCESSFUL', 'signal_id': 'COST20240104LONG', 'map_signal_id': 'COST20240104LONG', 'date': datetime.date(2024, 9, 24), 'data': {'trade_id': '&L:COST20250620C1060&S:COST20250620C1080', 'long': ['COST20250620C1060'], 'short': ['COST20250620C1080'], 'close': np.float64(3.9750000000000014), 'quantity': 1}}\n", + "\n", + "2025-11-28 22:45:23 DataManager.py CRITICAL: Skipping MySQL query. This is not optimized and may lead to performance issues.\n", + "2025-11-28 22:45:23 EventDriven.riskmanager.market_timeseries CRITICAL: Position Data for &L:COST20250620C1060&S:COST20250620C1080 not available, calculating greeks. Load time ~5 minutes\n", + "Processing event: ORDER 2024-09-24 00:00:00\n", + "Processing event: ORDER 2024-09-24 00:00:00\n", + "Processing event: FILL 2024-09-24 00:00:00\n", + "Processing event: FILL 2024-09-24 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-09-24 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 15 event(s)\n", + "Processing event: MARKET 2024-09-25 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-09-25 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-09-26 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-09-26 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-09-27 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-09-27 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-09-30 00:00:00\n", + "Processing event: SIGNAL 2024-09-30 00:00:00\n", + "Cash at Hand: 29.574861728488994, Max Contract Price: 4 for Signal: META20240930LONG\n", + "Generating order for request: OrderRequest(date='2024-09-30', symbol='META', option_type='c', max_close=4, tick_cash=np.float64(2957.4861728488995), direction='LONG', signal_id='META20240930LONG', spot=np.float64(570.6456909179688), chain_spot=np.float64(570.6456909179688), is_tick_cash_scaled=True)\n", + "2025-11-28 22:45:33 QuantTools.EventDriven.riskmanager ERROR: Retrieved chain for META on 2024-09-30\n", + "\n", + "Order Received: {'result': 'SUCCESSFUL', 'signal_id': 'META20240930LONG', 'map_signal_id': 'META20240930LONG', 'date': datetime.date(2024, 9, 30), 'data': {'trade_id': '&L:META20250620C660&S:META20250620C670', 'long': ['META20250620C660'], 'short': ['META20250620C670'], 'close': np.float64(3.249999999999993), 'quantity': 1}}\n", + "\n", + "2025-11-28 22:45:57 DataManager.py CRITICAL: Skipping MySQL query. This is not optimized and may lead to performance issues.\n", + "2025-11-28 22:45:57 EventDriven.riskmanager.market_timeseries CRITICAL: Position Data for &L:META20250620C660&S:META20250620C670 not available, calculating greeks. Load time ~5 minutes\n", + "Processing event: ORDER 2024-09-30 00:00:00\n", + "Processing event: FILL 2024-09-30 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-09-30 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 4 event(s)\n", + "Processing event: MARKET 2024-10-01 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-10-01 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-10-02 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-10-02 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-10-03 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-10-03 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-10-04 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-10-04 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-10-07 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-10-07 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-10-08 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-10-08 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-10-09 00:00:00\n", + "Processing event: SIGNAL 2024-10-09 00:00:00\n", + "Cash at Hand: 7.816945418352888, Max Contract Price: 4 for Signal: AMD20241009LONG\n", + "Generating order for request: OrderRequest(date='2024-10-09', symbol='AMD', option_type='c', max_close=4, tick_cash=np.float64(781.6945418352888), direction='LONG', signal_id='AMD20241009LONG', spot=np.float64(171.02000427246094), chain_spot=np.float64(171.02000427246094), is_tick_cash_scaled=True)\n", + "\n", + "Order Received: {'result': 'SUCCESSFUL', 'signal_id': 'AMD20241009LONG', 'map_signal_id': 'AMD20241009LONG', 'date': datetime.date(2024, 10, 9), 'data': {'trade_id': '&L:AMD20250620C210&S:AMD20250620C220', 'long': ['AMD20250620C210'], 'short': ['AMD20250620C220'], 'close': np.float64(2.375), 'quantity': 1}}\n", + "\n", + "2025-11-28 22:46:08 DataManager.py CRITICAL: Skipping MySQL query. This is not optimized and may lead to performance issues.\n", + "2025-11-28 22:46:08 EventDriven.riskmanager.market_timeseries CRITICAL: Position Data for &L:AMD20250620C210&S:AMD20250620C220 not available, calculating greeks. Load time ~5 minutes\n", + "Processing event: ORDER 2024-10-09 00:00:00\n", + "Processing event: FILL 2024-10-09 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-10-09 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 4 event(s)\n", + "Processing event: MARKET 2024-10-10 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-10-10 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-10-11 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-10-11 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-10-14 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-10-14 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-10-15 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-10-15 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-10-16 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-10-16 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-10-17 00:00:00\n", + "Processing event: SIGNAL 2024-10-17 00:00:00\n", + "Processing event: ORDER 2024-10-17 00:00:00\n", + "Processing event: FILL 2024-10-17 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-10-17 00:00:00, num_actions=1)\n", + "Event queue is empty, processed 4 event(s)\n", + "Processing event: MARKET 2024-10-18 00:00:00\n", + "Processing event: ORDER 2024-10-18 00:00:00\n", + "Processing event: FILL 2024-10-18 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-10-18 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 3 event(s)\n", + "Processing event: MARKET 2024-10-21 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-10-21 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-10-22 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-10-22 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-10-23 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-10-23 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-10-24 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-10-24 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-10-25 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-10-25 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-10-28 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-10-28 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-10-29 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-10-29 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-10-30 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-10-30 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-10-31 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-10-31 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-11-01 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-11-01 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-11-04 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-11-04 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-11-05 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-11-05 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-11-06 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-11-06 00:00:00, num_actions=3)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-11-07 00:00:00\n", + "Processing event: ORDER 2024-11-07 00:00:00\n", + "Processing event: ORDER 2024-11-07 00:00:00\n", + "Processing event: ROLL 2024-11-07 00:00:00\n", + "\n", + "Performing Roll Operation\n", + "\n", + "Rolling contract (sell side) for TSLA at 2024-11-07 00:00:00\n", + "Processing event: FILL 2024-11-07 00:00:00\n", + "Processing event: FILL 2024-11-07 00:00:00\n", + "Processing event: SIGNAL 2024-11-07 00:00:00\n", + "Processing event: ORDER 2024-11-07 00:00:00\n", + "Processing event: FILL 2024-11-07 00:00:00\n", + "Rolling contract (buy side) for TSLA at 2024-11-07 00:00:00\n", + "Processing event: SIGNAL 2024-11-07 00:00:00\n", + "Cash at Hand: 20.19983983621369, Max Contract Price: 4 for Signal: TSLA20240819LONG\n", + "Generating order for request: OrderRequest(date='2024-11-07', symbol='TSLA', option_type='c', max_close=4, tick_cash=np.float64(2019.9839836213691), direction='LONG', signal_id='TSLA20240819LONG', spot=np.float64(296.9100036621094), chain_spot=np.float64(296.9100036621094), is_tick_cash_scaled=True)\n", + "\n", + "Order Received: {'result': 'SUCCESSFUL', 'signal_id': 'TSLA20240819LONG', 'map_signal_id': 'TSLA20240819LONG', 'date': datetime.date(2024, 11, 7), 'data': {'trade_id': '&L:TSLA20250815C320&S:TSLA20250815C330', 'long': ['TSLA20250815C320'], 'short': ['TSLA20250815C330'], 'close': np.float64(3.8500000000000014), 'quantity': 1}}\n", + "\n", + "2025-11-28 22:46:43 DataManager.py CRITICAL: Skipping MySQL query. This is not optimized and may lead to performance issues.\n", + "2025-11-28 22:46:43 EventDriven.riskmanager.market_timeseries CRITICAL: Position Data for &L:TSLA20250815C320&S:TSLA20250815C330 not available, calculating greeks. Load time ~5 minutes\n", + "Processing event: ORDER 2024-11-07 00:00:00\n", + "Processing event: FILL 2024-11-07 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-11-07 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 12 event(s)\n", + "Processing event: MARKET 2024-11-08 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-11-08 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-11-11 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-11-11 00:00:00, num_actions=1)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-11-12 00:00:00\n", + "Processing event: ORDER 2024-11-12 00:00:00\n", + "Processing event: FILL 2024-11-12 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-11-12 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 3 event(s)\n", + "Processing event: MARKET 2024-11-13 00:00:00\n", + "Processing event: SIGNAL 2024-11-13 00:00:00\n", + "Cash at Hand: 5.293515759213204, Max Contract Price: 3 for Signal: AMZN20241113LONG\n", + "Generating order for request: OrderRequest(date='2024-11-13', symbol='AMZN', option_type='c', max_close=3, tick_cash=np.float64(529.3515759213203), direction='LONG', signal_id='AMZN20241113LONG', spot=np.float64(214.10000610351562), chain_spot=np.float64(214.10000610351562), is_tick_cash_scaled=True)\n", + "\n", + "Order Received: {'result': 'SUCCESSFUL', 'signal_id': 'AMZN20241113LONG', 'map_signal_id': 'AMZN20241113LONG', 'date': datetime.date(2024, 11, 13), 'data': {'trade_id': '&L:AMZN20250620C215&S:AMZN20250620C220', 'long': ['AMZN20250620C215'], 'short': ['AMZN20250620C220'], 'close': np.float64(2.450000000000003), 'quantity': 1}}\n", + "\n", + "2025-11-28 22:46:50 DataManager.py CRITICAL: Skipping MySQL query. This is not optimized and may lead to performance issues.\n", + "2025-11-28 22:46:50 EventDriven.riskmanager.market_timeseries CRITICAL: Position Data for &L:AMZN20250620C215&S:AMZN20250620C220 not available, calculating greeks. Load time ~5 minutes\n", + "Processing event: ORDER 2024-11-13 00:00:00\n", + "Processing event: FILL 2024-11-13 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-11-13 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 4 event(s)\n", + "Processing event: MARKET 2024-11-14 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-11-14 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-11-15 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-11-15 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-11-18 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-11-18 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-11-19 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-11-19 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-11-20 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-11-20 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-11-21 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-11-21 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-11-22 00:00:00\n", + "2025-11-28 22:47:04 OptionSignalEventScheduler ERROR: Event date 20241123 not found in backtest range\n", + "2025-11-28 22:47:04 OptionSignalEventScheduler ERROR: Event date 20241123 not found in backtest range\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-11-22 00:00:00, num_actions=2)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-11-25 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-11-25 00:00:00, num_actions=1)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-11-26 00:00:00\n", + "Processing event: ROLL 2024-11-26 00:00:00\n", + "\n", + "Performing Roll Operation\n", + "\n", + "Rolling contract (sell side) for SBUX at 2024-11-26 00:00:00\n", + "Processing event: SIGNAL 2024-11-26 00:00:00\n", + "Processing event: ORDER 2024-11-26 00:00:00\n", + "Processing event: FILL 2024-11-26 00:00:00\n", + "Rolling contract (buy side) for SBUX at 2024-11-26 00:00:00\n", + "Processing event: SIGNAL 2024-11-26 00:00:00\n", + "Cash at Hand: 12.752304127136686, Max Contract Price: 4 for Signal: SBUX20240819LONG\n", + "Generating order for request: OrderRequest(date='2024-11-26', symbol='SBUX', option_type='c', max_close=4, tick_cash=np.float64(1275.2304127136686), direction='LONG', signal_id='SBUX20240819LONG', spot=np.float64(98.0761489868164), chain_spot=np.float64(98.07616424560547), is_tick_cash_scaled=True)\n", + "\n", + "Order Received: {'result': 'SUCCESSFUL', 'signal_id': 'SBUX20240819LONG', 'map_signal_id': 'SBUX20240819LONG', 'date': datetime.date(2024, 11, 26), 'data': {'trade_id': '&L:SBUX20250718C100&S:SBUX20250718C105', 'long': ['SBUX20250718C100'], 'short': ['SBUX20250718C105'], 'close': np.float64(2.375), 'quantity': 1}}\n", + "\n", + "2025-11-28 22:47:25 DataManager.py CRITICAL: Skipping MySQL query. This is not optimized and may lead to performance issues.\n", + "2025-11-28 22:47:25 EventDriven.riskmanager.market_timeseries CRITICAL: Position Data for &L:SBUX20250718C100&S:SBUX20250718C105 not available, calculating greeks. Load time ~5 minutes\n", + "Processing event: ORDER 2024-11-26 00:00:00\n", + "Processing event: FILL 2024-11-26 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-11-26 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 8 event(s)\n", + "Processing event: MARKET 2024-11-27 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-11-27 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-11-29 00:00:00\n", + "2025-11-28 22:47:32 OptionSignalEventScheduler ERROR: Event date 20241130 not found in backtest range\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-11-29 00:00:00, num_actions=1)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-12-02 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-12-02 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-12-03 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-12-03 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-12-04 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-12-04 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-12-05 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-12-05 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-12-06 00:00:00\n", + "2025-11-28 22:47:40 OptionSignalEventScheduler ERROR: Event date 20241207 not found in backtest range\n", + "2025-11-28 22:47:40 OptionSignalEventScheduler ERROR: Event date 20241207 not found in backtest range\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-12-06 00:00:00, num_actions=2)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-12-09 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-12-09 00:00:00, num_actions=1)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-12-10 00:00:00\n", + "Processing event: ROLL 2024-12-10 00:00:00\n", + "\n", + "Performing Roll Operation\n", + "\n", + "Rolling contract (sell side) for TSLA at 2024-12-10 00:00:00\n", + "Processing event: SIGNAL 2024-12-10 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-12-10 00:00:00, num_actions=1)\n", + "Event queue is empty, processed 3 event(s)\n", + "Processing event: MARKET 2024-12-11 00:00:00\n", + "Processing event: ROLL 2024-12-11 00:00:00\n", + "\n", + "Performing Roll Operation\n", + "\n", + "Rolling contract (sell side) for TSLA at 2024-12-11 00:00:00\n", + "Processing event: SIGNAL 2024-12-11 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-12-11 00:00:00, num_actions=1)\n", + "Event queue is empty, processed 3 event(s)\n", + "Processing event: MARKET 2024-12-12 00:00:00\n", + "Processing event: ROLL 2024-12-12 00:00:00\n", + "\n", + "Performing Roll Operation\n", + "\n", + "Rolling contract (sell side) for TSLA at 2024-12-12 00:00:00\n", + "Processing event: SIGNAL 2024-12-12 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-12-12 00:00:00, num_actions=1)\n", + "Event queue is empty, processed 3 event(s)\n", + "Processing event: MARKET 2024-12-13 00:00:00\n", + "Processing event: ROLL 2024-12-13 00:00:00\n", + "\n", + "Performing Roll Operation\n", + "\n", + "Rolling contract (sell side) for TSLA at 2024-12-13 00:00:00\n", + "Processing event: SIGNAL 2024-12-13 00:00:00\n", + "2025-11-28 22:47:48 OptionSignalEventScheduler ERROR: Event date 20241214 not found in backtest range\n", + "2025-11-28 22:47:48 OptionSignalEventScheduler ERROR: Event date 20241214 not found in backtest range\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-12-13 00:00:00, num_actions=2)\n", + "Event queue is empty, processed 3 event(s)\n", + "Processing event: MARKET 2024-12-16 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-12-16 00:00:00, num_actions=1)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-12-17 00:00:00\n", + "Processing event: ROLL 2024-12-17 00:00:00\n", + "\n", + "Performing Roll Operation\n", + "\n", + "Rolling contract (sell side) for TSLA at 2024-12-17 00:00:00\n", + "Processing event: SIGNAL 2024-12-17 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-12-17 00:00:00, num_actions=1)\n", + "Event queue is empty, processed 3 event(s)\n", + "Processing event: MARKET 2024-12-18 00:00:00\n", + "Processing event: ROLL 2024-12-18 00:00:00\n", + "\n", + "Performing Roll Operation\n", + "\n", + "Rolling contract (sell side) for TSLA at 2024-12-18 00:00:00\n", + "Processing event: SIGNAL 2024-12-18 00:00:00\n", + "Processing event: ORDER 2024-12-18 00:00:00\n", + "Processing event: FILL 2024-12-18 00:00:00\n", + "Rolling contract (buy side) for TSLA at 2024-12-18 00:00:00\n", + "Processing event: SIGNAL 2024-12-18 00:00:00\n", + "Cash at Hand: 25.333300173823908, Max Contract Price: 4 for Signal: TSLA20240819LONG\n", + "Generating order for request: OrderRequest(date='2024-12-18', symbol='TSLA', option_type='c', max_close=4, tick_cash=np.float64(2533.330017382391), direction='LONG', signal_id='TSLA20240819LONG', spot=np.float64(440.1300048828125), chain_spot=np.float64(440.1300048828125), is_tick_cash_scaled=True)\n", + "\n", + "Order Received: {'result': 'SUCCESSFUL', 'signal_id': 'TSLA20240819LONG', 'map_signal_id': 'TSLA20240819LONG', 'date': datetime.date(2024, 12, 18), 'data': {'trade_id': '&L:TSLA20250919C480&S:TSLA20250919C490', 'long': ['TSLA20250919C480'], 'short': ['TSLA20250919C490'], 'close': np.float64(3.200000000000017), 'quantity': 1}}\n", + "\n", + "2025-11-28 22:47:52 DataManager.py CRITICAL: Skipping MySQL query. This is not optimized and may lead to performance issues.\n", + "2025-11-28 22:47:52 EventDriven.riskmanager.market_timeseries CRITICAL: Position Data for &L:TSLA20250919C480&S:TSLA20250919C490 not available, calculating greeks. Load time ~5 minutes\n", + "Processing event: ORDER 2024-12-18 00:00:00\n", + "Processing event: FILL 2024-12-18 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-12-18 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 8 event(s)\n", + "Processing event: MARKET 2024-12-19 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-12-19 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-12-20 00:00:00\n", + "Processing event: SIGNAL 2024-12-20 00:00:00\n", + "Processing event: ORDER 2024-12-20 00:00:00\n", + "Processing event: FILL 2024-12-20 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-12-20 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 4 event(s)\n", + "Processing event: MARKET 2024-12-23 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-12-23 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-12-24 00:00:00\n", + "Processing event: SIGNAL 2024-12-24 00:00:00\n", + "Cash at Hand: 3.8161959685340516, Max Contract Price: 3.8161959685340516 for Signal: BA20241224LONG\n", + "Generating order for request: OrderRequest(date='2024-12-24', symbol='BA', option_type='c', max_close=np.float64(3.8161959685340516), tick_cash=np.float64(381.61959685340514), direction='LONG', signal_id='BA20241224LONG', spot=np.float64(179.33999633789062), chain_spot=np.float64(179.33999633789062), is_tick_cash_scaled=True)\n", + "\n", + "Order Received: {'result': 'SUCCESSFUL', 'signal_id': 'BA20241224LONG', 'map_signal_id': 'BA20241224LONG', 'date': datetime.date(2024, 12, 24), 'data': {'trade_id': '&L:BA20250919C200&S:BA20250919C210', 'long': ['BA20250919C200'], 'short': ['BA20250919C210'], 'close': np.float64(3.2749999999999986), 'quantity': 1}}\n", + "\n", + "2025-11-28 22:48:18 DataManager.py CRITICAL: Skipping MySQL query. This is not optimized and may lead to performance issues.\n", + "2025-11-28 22:48:18 EventDriven.riskmanager.market_timeseries CRITICAL: Position Data for &L:BA20250919C200&S:BA20250919C210 not available, calculating greeks. Load time ~5 minutes\n", + "2025-11-28 22:48:18 DataManager.py CRITICAL: Extra Cols not implemented for BS Greeks\n", + "2025-11-28 22:48:19 DataManager.py CRITICAL: Extra Cols not implemented for BS Greeks\n", + "Processing event: ORDER 2024-12-24 00:00:00\n", + "Processing event: FILL 2024-12-24 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-12-24 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 4 event(s)\n", + "Processing event: MARKET 2024-12-26 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-12-26 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-12-27 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-12-27 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-12-30 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-12-30 00:00:00, num_actions=1)\n", + "Event queue is empty, processed 1 event(s)\n", + "Processing event: MARKET 2024-12-31 00:00:00\n", + "Processing event: ORDER 2024-12-31 00:00:00\n", + "Processing event: FILL 2024-12-31 00:00:00\n", + "Position Analysis Meta: StrategyChangeMeta(date=2024-12-31 00:00:00, num_actions=0)\n", + "Event queue is empty, processed 3 event(s)\n", + "Processing event: MARKET 2025-01-02 00:00:00\n", + "Processing event: SIGNAL 2025-01-02 00:00:00\n", + "2025-11-28 22:48:48 OptionSignalEventScheduler ERROR: Event date 20250103 not found in backtest range\n", + "Processing event: SIGNAL 2025-01-02 00:00:00\n", + "Processing event: SIGNAL 2025-01-02 00:00:00\n", + "Processing event: SIGNAL 2025-01-02 00:00:00\n", + "Processing event: SIGNAL 2025-01-02 00:00:00\n", + "Processing event: SIGNAL 2025-01-02 00:00:00\n", + "Processing event: SIGNAL 2025-01-02 00:00:00\n", + "Processing event: SIGNAL 2025-01-02 00:00:00\n", + "Processing event: ORDER 2025-01-02 00:00:00\n", + "Processing event: ORDER 2025-01-02 00:00:00\n", + "Processing event: ORDER 2025-01-02 00:00:00\n", + "Processing event: ORDER 2025-01-02 00:00:00\n", + "Processing event: ORDER 2025-01-02 00:00:00\n", + "Processing event: ORDER 2025-01-02 00:00:00\n", + "Processing event: ORDER 2025-01-02 00:00:00\n", + "Processing event: FILL 2025-01-02 00:00:00\n", + "Processing event: FILL 2025-01-02 00:00:00\n", + "Processing event: FILL 2025-01-02 00:00:00\n", + "Processing event: FILL 2025-01-02 00:00:00\n", + "Processing event: FILL 2025-01-02 00:00:00\n", + "Processing event: FILL 2025-01-02 00:00:00\n", + "Processing event: FILL 2025-01-02 00:00:00\n", + "2025-11-28 22:48:48 OptionSignalEventScheduler ERROR: Event date 20250103 not found in backtest range\n", + "Position Analysis Meta: StrategyChangeMeta(date=2025-01-02 00:00:00, num_actions=1)\n", + "Event queue is empty, processed 23 event(s)\n", + "No more dates left.\n" + ] + } + ], + "source": [ + "evb_backtest.run()" + ] + }, + { + "cell_type": "code", + "execution_count": 94, + "id": "0b0b7dbb", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'&L:BA20240920C320&S:BA20240920C330': _LimitsMetaData(trade_id='&L:BA20240920C320&S:BA20240920C330', date='2024-01-04', signal_id='BA20240104LONG', scalar=np.float64(1.088255637448122), sizing_lev=4.5, delta_lmt=0.17614279465172783, delta=np.float64(0.03207156004023659), option_price=np.float64(1.2000000000000002), undl_price=np.float64(244.94000244140625)),\n", + " '&L:AAPL20240920C200&S:AAPL20240920C205': _LimitsMetaData(trade_id='&L:AAPL20240920C200&S:AAPL20240920C205', date='2024-01-04', signal_id='AAPL20240104LONG', scalar=np.float64(1.3907130389246365), sizing_lev=4.5, delta_lmt=0.6249621260643123, delta=np.float64(0.05557818518222568), option_price=np.float64(1.8250000000000002), undl_price=np.float64(180.20811462402344)),\n", + " '&L:AMD20240920C145&S:AMD20240920C150': _LimitsMetaData(trade_id='&L:AMD20240920C145&S:AMD20240920C150', date='2024-01-04', signal_id='AMD20240104LONG', scalar=np.float64(1.1564517484075953), sizing_lev=4.5, delta_lmt=0.9190236957587051, delta=np.float64(0.03771287213663044), option_price=np.float64(1.9500000000000028), undl_price=np.float64(136.00999450683594)),\n", + " '&L:META20240920C450&S:META20240920C460': _LimitsMetaData(trade_id='&L:META20240920C450&S:META20240920C460', date='2024-01-04', signal_id='META20240104LONG', scalar=np.float64(0.9869350200673996), sizing_lev=4.5, delta_lmt=0.29768576060298474, delta=np.float64(0.02443741865354454), option_price=np.float64(1.6500000000000004), undl_price=np.float64(344.9931945800781)),\n", + " '&L:COST20240920C755&S:COST20240920C765': _LimitsMetaData(trade_id='&L:COST20240920C755&S:COST20240920C765', date='2024-01-04', signal_id='COST20240104LONG', scalar=np.float64(1.5818051703609917), sizing_lev=4.5, delta_lmt=0.1742690919098203, delta=np.float64(0.026913454358101774), option_price=np.float64(2.2499999999999982), undl_price=np.float64(641.2393798828125)),\n", + " '&L:NFLX20240920C520&S:NFLX20240920C530': _LimitsMetaData(trade_id='&L:NFLX20240920C520&S:NFLX20240920C530', date='2024-01-04', signal_id='NFLX20240104LONG', scalar=np.float64(1.8238596542438952), sizing_lev=4.5, delta_lmt=0.16810553739848336, delta=np.float64(0.026196512394704996), option_price=np.float64(3.8500000000000014), undl_price=np.float64(474.6699905395508)),\n", + " '&L:NVDA20240920C630&S:NVDA20240920C640': _LimitsMetaData(trade_id='&L:NVDA20240920C630&S:NVDA20240920C640', date='2024-01-16', signal_id='NVDA20240116LONG', scalar=np.float64(1.048588130898491), sizing_lev=4.5, delta_lmt=0.4020769400843726, delta=np.float64(0.01917794176620191), option_price=np.float64(3.4250000000000043), undl_price=np.float64(563.5374450683594)),\n", + " '&L:AMD20240920C200&S:AMD20240920C210': _LimitsMetaData(trade_id='&L:AMD20240920C200&S:AMD20240920C210', date='2024-01-25', signal_id='AMD20240104LONG', scalar=np.float64(0.6656649518738391), sizing_lev=4.5, delta_lmt=0.5361324687361947, delta=np.float64(0.053159469399766124), option_price=np.float64(3.224999999999998), undl_price=np.float64(180.3300018310547)),\n", + " '&L:AMZN20240920C185&S:AMZN20240920C195': _LimitsMetaData(trade_id='&L:AMZN20240920C185&S:AMZN20240920C195', date='2024-02-01', signal_id='AMZN20240201LONG', scalar=np.float64(1.9801720634738202), sizing_lev=4.5, delta_lmt=0.2693766493049526, delta=np.float64(0.0840245884017321), option_price=np.float64(2.500000000000001), undl_price=np.float64(159.27999877929688)),\n", + " '&L:SBUX20240920C95&S:SBUX20240920C100': _LimitsMetaData(trade_id='&L:SBUX20240920C95&S:SBUX20240920C100', date='2024-02-13', signal_id='SBUX20240213LONG', scalar=np.float64(1.5807053569447227), sizing_lev=4.5, delta_lmt=1.0161812144302205, delta=np.float64(0.09383421371613743), option_price=np.float64(2.2), undl_price=np.float64(89.65399169921875)),\n", + " '&L:NVDA20240920C930&S:NVDA20240920C940': _LimitsMetaData(trade_id='&L:NVDA20240920C930&S:NVDA20240920C940', date='2024-02-23', signal_id='NVDA20240116LONG', scalar=np.float64(0.29474333318827367), sizing_lev=4.5, delta_lmt=0.12759300963745526, delta=np.float64(0.011880224373328474), option_price=np.float64(2.700000000000003), undl_price=np.float64(787.7750396728516)),\n", + " '&L:NFLX20241220C680&S:NFLX20241220C690': _LimitsMetaData(trade_id='&L:NFLX20241220C680&S:NFLX20241220C690', date='2024-03-21', signal_id='NFLX20240104LONG', scalar=np.float64(1.1480961719537333), sizing_lev=4.5, delta_lmt=0.11449603344216491, delta=np.float64(0.018984677856437315), option_price=np.float64(3.75), undl_price=np.float64(622.7099990844727)),\n", + " '&L:AMD20250117C165&S:AMD20250117C170': _LimitsMetaData(trade_id='&L:AMD20250117C165&S:AMD20250117C170', date='2024-05-08', signal_id='AMD20240508LONG', scalar=np.float64(1.23866971128297), sizing_lev=4.5, delta_lmt=0.40671390914529193, delta=np.float64(0.03205320635739639), option_price=np.float64(1.8499999999999979), undl_price=np.float64(153.6199951171875)),\n", + " '&L:AAPL20241220C215&S:AAPL20241220C230': _LimitsMetaData(trade_id='&L:AAPL20241220C215&S:AAPL20241220C230', date='2024-05-14', signal_id='AAPL20240514LONG', scalar=np.float64(1.8523637579476189), sizing_lev=4.5, delta_lmt=0.5933092250262724, delta=np.float64(0.12365818235425818), option_price=np.float64(2.475), undl_price=np.float64(186.16555786132812)),\n", + " '&L:META20250117C570&S:META20250117C580': _LimitsMetaData(trade_id='&L:META20250117C570&S:META20250117C580', date='2024-05-29', signal_id='META20240104LONG', scalar=np.float64(1.2021394253133386), sizing_lev=4.5, delta_lmt=0.5655314174255994, delta=np.float64(0.025635311116545267), option_price=np.float64(2.6750000000000007), undl_price=np.float64(471.953857421875)),\n", + " '&L:COST20250117C985&S:COST20250117C1000': _LimitsMetaData(trade_id='&L:COST20250117C985&S:COST20250117C1000', date='2024-05-29', signal_id='COST20240104LONG', scalar=np.float64(1.9883493741414688), sizing_lev=4.5, delta_lmt=0.3836219335473991, delta=np.float64(0.022831405261403148), option_price=np.float64(2.299999999999999), undl_price=np.float64(800.1295776367188)),\n", + " '&L:AMZN20250117C195&S:AMZN20250117C200': _LimitsMetaData(trade_id='&L:AMZN20250117C195&S:AMZN20250117C200', date='2024-05-29', signal_id='AMZN20240201LONG', scalar=np.float64(0.9108354242107425), sizing_lev=4.5, delta_lmt=0.1354747997649122, delta=np.float64(0.044501297236720916), option_price=np.float64(2.0), undl_price=np.float64(182.02000427246094)),\n", + " '&L:NVDA20250117C1530&S:NVDA20250117C1550': _LimitsMetaData(trade_id='&L:NVDA20250117C1530&S:NVDA20250117C1550', date='2024-06-04', signal_id='NVDA20240116LONG', scalar=np.float64(1.7163911128878835), sizing_lev=4.5, delta_lmt=0.7641013520395515, delta=np.float64(0.01236923770520093), option_price=np.float64(3.799999999999997), undl_price=np.float64(1163.8410949707031)),\n", + " '&L:TSLA20250321C260&S:TSLA20250321C265': _LimitsMetaData(trade_id='&L:TSLA20250321C260&S:TSLA20250321C265', date='2024-07-05', signal_id='TSLA20240705LONG', scalar=np.float64(1.2626113156650591), sizing_lev=4.5, delta_lmt=0.5644444997302794, delta=np.float64(0.01601996663112004), option_price=np.float64(1.9250000000000043), undl_price=np.float64(251.52000427246094)),\n", + " '&L:AMD20250321C200&S:AMD20250321C210': _LimitsMetaData(trade_id='&L:AMD20250321C200&S:AMD20250321C210', date='2024-07-17', signal_id='AMD20240717LONG', scalar=np.float64(0.9337638470047666), sizing_lev=4.5, delta_lmt=0.2757739605728462, delta=np.float64(0.04534001952558597), option_price=np.float64(2.1500000000000004), undl_price=np.float64(159.42999267578125)),\n", + " '&L:META20250620C580&S:META20250620C590': _LimitsMetaData(trade_id='&L:META20250620C580&S:META20250620C590', date='2024-08-05', signal_id='META20240805LONG', scalar=np.float64(0.9572496272894172), sizing_lev=4.5, delta_lmt=0.33267816337529266, delta=np.float64(0.019017222037831516), option_price=np.float64(2.9749999999999943), undl_price=np.float64(473.786865234375)),\n", + " '&L:SBUX20250321C90&S:SBUX20250321C95': _LimitsMetaData(trade_id='&L:SBUX20250321C90&S:SBUX20250321C95', date='2024-08-19', signal_id='SBUX20240819LONG', scalar=np.float64(0.438432045713268), sizing_lev=4.5, delta_lmt=0.24733830639007373, delta=np.float64(0.08180856039681217), option_price=np.float64(2.499999999999999), undl_price=np.float64(89.36015319824219)),\n", + " '&L:TSLA20250620C240&S:TSLA20250620C250': _LimitsMetaData(trade_id='&L:TSLA20250620C240&S:TSLA20250620C250', date='2024-08-19', signal_id='TSLA20240819LONG', scalar=np.float64(1.4224712655154965), sizing_lev=4.5, delta_lmt=0.3659142779596343, delta=np.float64(0.03233100908133224), option_price=np.float64(3.450000000000003), undl_price=np.float64(222.72000122070312)),\n", + " '&L:AAPL20250620C250&S:AAPL20250620C260': _LimitsMetaData(trade_id='&L:AAPL20250620C250&S:AAPL20250620C260', date='2024-08-27', signal_id='AAPL20240514LONG', scalar=np.float64(1.0734486130245275), sizing_lev=4.5, delta_lmt=0.7619857018172657, delta=np.float64(0.07583807403994669), option_price=np.float64(3.424999999999999), undl_price=np.float64(226.7538604736328)),\n", + " '&L:NFLX20250620C900&S:NFLX20250620C910': _LimitsMetaData(trade_id='&L:NFLX20250620C900&S:NFLX20250620C910', date='2024-08-27', signal_id='NFLX20240104LONG', scalar=np.float64(1.039338742030174), sizing_lev=4.5, delta_lmt=0.10327839714553758, delta=np.float64(0.013120724580772958), option_price=np.float64(1.975000000000005), undl_price=np.float64(695.7199859619141)),\n", + " '&L:NVDA20250815C125&S:NVDA20250815C130': _LimitsMetaData(trade_id='&L:NVDA20250815C125&S:NVDA20250815C130', date='2024-09-24', signal_id='NVDA20240116LONG', scalar=np.float64(1.5811714776293713), sizing_lev=4.5, delta_lmt=5.905266823155103, delta=np.float64(0.032983369118610995), option_price=np.float64(2.0), undl_price=np.float64(120.8353500366211)),\n", + " '&L:COST20250620C1060&S:COST20250620C1080': _LimitsMetaData(trade_id='&L:COST20250620C1060&S:COST20250620C1080', date='2024-09-24', signal_id='COST20240104LONG', scalar=np.float64(1.5171380061082866), sizing_lev=4.5, delta_lmt=0.36455883881409995, delta=np.float64(0.028465209323691454), option_price=np.float64(3.9750000000000014), undl_price=np.float64(895.6698608398438)),\n", + " '&L:META20250620C660&S:META20250620C670': _LimitsMetaData(trade_id='&L:META20250620C660&S:META20250620C670', date='2024-09-30', signal_id='META20240930LONG', scalar=np.float64(0.8158296456912039), sizing_lev=4.5, delta_lmt=0.19026906199760624, delta=np.float64(0.02051195732875044), option_price=np.float64(3.249999999999993), undl_price=np.float64(570.6456909179688)),\n", + " '&L:AMD20250620C210&S:AMD20250620C220': _LimitsMetaData(trade_id='&L:AMD20250620C210&S:AMD20250620C220', date='2024-10-09', signal_id='AMD20241009LONG', scalar=np.float64(1.121188783596806), sizing_lev=4.5, delta_lmt=0.23061174644735102, delta=np.float64(0.04519532839699636), option_price=np.float64(2.375), undl_price=np.float64(171.02000427246094)),\n", + " '&L:TSLA20250815C320&S:TSLA20250815C330': _LimitsMetaData(trade_id='&L:TSLA20250815C320&S:TSLA20250815C330', date='2024-11-07', signal_id='TSLA20240819LONG', scalar=np.float64(0.7118065065083627), sizing_lev=4.5, delta_lmt=0.21792023717035136, delta=np.float64(0.026523608013206967), option_price=np.float64(3.8500000000000014), undl_price=np.float64(296.9100036621094)),\n", + " '&L:AMZN20250620C215&S:AMZN20250620C220': _LimitsMetaData(trade_id='&L:AMZN20250620C215&S:AMZN20250620C220', date='2024-11-13', signal_id='AMZN20241113LONG', scalar=np.float64(1.631678292001307), sizing_lev=4.5, delta_lmt=0.18154094011676575, delta=np.float64(0.03897498805933708), option_price=np.float64(2.450000000000003), undl_price=np.float64(214.10000610351562)),\n", + " '&L:SBUX20250718C100&S:SBUX20250718C105': _LimitsMetaData(trade_id='&L:SBUX20250718C100&S:SBUX20250718C105', date='2024-11-26', signal_id='SBUX20240819LONG', scalar=np.float64(1.2506116526124726), sizing_lev=4.5, delta_lmt=0.7317456915018409, delta=np.float64(0.07646483467933507), option_price=np.float64(2.375), undl_price=np.float64(98.07616424560547)),\n", + " '&L:TSLA20250919C480&S:TSLA20250919C490': _LimitsMetaData(trade_id='&L:TSLA20250919C480&S:TSLA20250919C490', date='2024-12-18', signal_id='TSLA20240819LONG', scalar=np.float64(1.1807182083974397), sizing_lev=4.5, delta_lmt=0.3058225935061669, delta=np.float64(0.014087526080430735), option_price=np.float64(3.200000000000017), undl_price=np.float64(440.1300048828125)),\n", + " '&L:BA20250919C200&S:BA20250919C210': _LimitsMetaData(trade_id='&L:BA20250919C200&S:BA20250919C210', date='2024-12-24', signal_id='BA20241224LONG', scalar=np.float64(0.7256796768218939), sizing_lev=4.5, delta_lmt=0.06948818786427995, delta=np.float64(0.06501487688108654), option_price=np.float64(3.2749999999999986), undl_price=np.float64(179.33999633789062))}" + ] + }, + "execution_count": 94, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pm.trades\n", + "lmt_cog.position_metadata" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "id": "c6c66607", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'BA': {},\n", + " 'AAPL': {},\n", + " 'AMD': {},\n", + " 'META': {},\n", + " 'COST': {'COST20240104LONG': {'position': OrderData(trade_id=&L:COST20250620C1060&S:COST20250620C1080, quantity=12),\n", + " 'entry_price': np.float64(4470.836463425917),\n", + " 'quantity': 9,\n", + " 'market_value': np.float64(4612.499999999998)}},\n", + " 'NFLX': {},\n", + " 'NVDA': {},\n", + " 'AMZN': {},\n", + " 'SBUX': {},\n", + " 'TSLA': {}}" + ] + }, + "execution_count": 88, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pm.current_positions\n", + "# pm.trades_map[\"&L:META20240920C450&S:META20240920C460\"].entries()" + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "id": "046dc646", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
TradeIDSignalIDTickerEntryTimeExitTimeEntryPriceEntryCommissionEntrySlippageEntryQuantityEntryAuxilaryCostTotalEntryCostExitPriceExitCommissionExitSlippageExitQuantityExitAuxilaryCostTotalExitCostQuantityClosedQuantityClosedPnLTotalCommissionTotalSlippageTotalAuxilaryCostOpenQuantityUnrealizedPnLPnLReturnPctDuration
3&L:META20240920C450&S:META20240920C460META20240104LONGMETA2024-01-042024-05-29182.1045636.696198.55875112205.2547512185.254751400.5595306.696-424.08964212430.7856422124.16219212122621.45960713.392-225.530890-238.92289000.02621.4596071.199613146
14&L:META20250117C570&S:META20250117C580META20240104LONGMETA2024-05-292024-07-19282.8809509.486251.99015317261.4761534808.976153207.8913429.486-238.86119417248.3471943534.1528061717-1274.82334618.97213.128959-32.10095900.0-1274.823346-0.26509251
20&L:META20250620C580&S:META20250620C590META20240805LONGMETA2024-08-052024-08-07330.4097826.138355.86959811362.0075983634.507598266.6302966.138-415.92874511422.0667452932.9332551111-701.57434312.276-60.059147-72.33514700.0-701.574343-0.1930312
27&L:META20250620C660&S:META20250620C670META20240930LONGMETA2024-09-302025-01-02350.5647854.464200.0542768204.5182762804.518276301.6122294.464-217.6381698222.1021691868.55762088-391.6204458.928-17.583893-26.51189300.0-391.620445-0.13963994
\n", + "
" + ], + "text/plain": [ + " TradeID SignalID Ticker \\\n", + "3 &L:META20240920C450&S:META20240920C460 META20240104LONG META \n", + "14 &L:META20250117C570&S:META20250117C580 META20240104LONG META \n", + "20 &L:META20250620C580&S:META20250620C590 META20240805LONG META \n", + "27 &L:META20250620C660&S:META20250620C670 META20240930LONG META \n", + "\n", + " EntryTime ExitTime EntryPrice EntryCommission EntrySlippage \\\n", + "3 2024-01-04 2024-05-29 182.104563 6.696 198.558751 \n", + "14 2024-05-29 2024-07-19 282.880950 9.486 251.990153 \n", + "20 2024-08-05 2024-08-07 330.409782 6.138 355.869598 \n", + "27 2024-09-30 2025-01-02 350.564785 4.464 200.054276 \n", + "\n", + " EntryQuantity EntryAuxilaryCost TotalEntryCost ExitPrice \\\n", + "3 12 205.254751 2185.254751 400.559530 \n", + "14 17 261.476153 4808.976153 207.891342 \n", + "20 11 362.007598 3634.507598 266.630296 \n", + "27 8 204.518276 2804.518276 301.612229 \n", + "\n", + " ExitCommission ExitSlippage ExitQuantity ExitAuxilaryCost \\\n", + "3 6.696 -424.089642 12 430.785642 \n", + "14 9.486 -238.861194 17 248.347194 \n", + "20 6.138 -415.928745 11 422.066745 \n", + "27 4.464 -217.638169 8 222.102169 \n", + "\n", + " TotalExitCost Quantity ClosedQuantity ClosedPnL TotalCommission \\\n", + "3 2124.162192 12 12 2621.459607 13.392 \n", + "14 3534.152806 17 17 -1274.823346 18.972 \n", + "20 2932.933255 11 11 -701.574343 12.276 \n", + "27 1868.557620 8 8 -391.620445 8.928 \n", + "\n", + " TotalSlippage TotalAuxilaryCost OpenQuantity UnrealizedPnL \\\n", + "3 -225.530890 -238.922890 0 0.0 \n", + "14 13.128959 -32.100959 0 0.0 \n", + "20 -60.059147 -72.335147 0 0.0 \n", + "27 -17.583893 -26.511893 0 0.0 \n", + "\n", + " PnL ReturnPct Duration \n", + "3 2621.459607 1.199613 146 \n", + "14 -1274.823346 -0.265092 51 \n", + "20 -701.574343 -0.193031 2 \n", + "27 -391.620445 -0.139639 94 " + ] + }, + "execution_count": 89, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pm.trades_df = None\n", + "tr = pm.trades\n", + "\n", + "# pm.current_positions\n", + "# pm.trades_map[\"&L:BA20240920C320&S:BA20240920C330\"].stats\n", + "tr[tr[\"Ticker\"] == \"META\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "id": "ec0ff42b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Date: 2024-01-05. Action: ADJUST\n", + "position delta exceeds limit (0.30718639511029266 > 0.29768699815799265)\n", + "12\n", + "\n", + "\n", + "Date: 2024-01-08. Action: ADJUST\n", + "position delta exceeds limit (0.3226524216859872 > 0.29768699815799265)\n", + "12\n", + "\n", + "\n", + "Date: 2024-01-09. Action: ADJUST\n", + "position delta exceeds limit (0.2983810854722435 > 0.29768699815799265)\n", + "11\n", + "\n", + "\n", + "Date: 2024-01-18. Action: ADJUST\n", + "position delta exceeds limit (0.29928871757789466 > 0.29768699815799265)\n", + "10\n", + "\n", + "\n", + "Date: 2024-04-25. Action: ADJUST\n", + "position delta exceeds limit (0.3246935807517559 > 0.29768699815799265)\n", + "9\n", + "\n", + "\n", + "Date: 2024-04-29. Action: ADJUST\n", + "position delta exceeds limit (0.30270980939235415 > 0.29768699815799265)\n", + "8\n", + "\n", + "\n", + "Date: 2024-05-24. Action: ROLL\n", + "not enough DTE (119 < 120)\n", + "7\n", + "\n", + "\n", + "Date: 2024-05-28. Action: ROLL\n", + "not enough DTE (115 < 120)\n", + "7\n", + "\n", + "\n" + ] + } + ], + "source": [ + "## Extract tick specific Analysis\n", + "\n", + "##TODO: Convert to function for reuse\n", + "\n", + "for day, analysis in rm.analysis_cache.items():\n", + " actionables = analysis.actionables\n", + " nvda_acts = [act for act in actionables if act.underlier_tick == \"META\"]\n", + " if nvda_acts:\n", + " for act in nvda_acts:\n", + " if act.action.type.value != \"HOLD\":\n", + " print(f\"Date: {day}. Action: {act.action.type.value}\")\n", + " print(act.action.reason)\n", + " print(act.quantity)\n", + "\n", + " print(\"\\n\")" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "id": "82f379fe", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 91, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjkAAAGkCAYAAADT+zRtAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAiSJJREFUeJzt3Xl8VNX5P/DPuZnsIQkhCSEECAhR2XFBXEFRQaUuVbFV61asFrfW6re4VquoqNS9tRVR0PpT3BVRcK0LqICyI2GHkIQkkITsycw9vz/u3Dt31swkMzeTyef9evFiMvfOnTsnk7nPPOc55wgppQQRERFRjFG6+gSIiIiIIoFBDhEREcUkBjlEREQUkxjkEBERUUxikENEREQxiUEOERERxSQGOURERBSTGOQQERFRTGKQQ0RERDHJ1tUnEA2qq6tht9vDcqycnBxUVlaG5VixjO0UPLZVaNheoWF7BY9tFZpItpfNZkPv3r3b3y8iz97N2O12tLW1dfo4QgjjeFwtwz+2U/DYVqFhe4WG7RU8tlVooqW92F1FREREMYlBDhEREcUkBjlEREQUkxjkEBERUUxikENEREQxiUEOERERxSQGOURERBSTGOQQERFRTGKQQ0RERDGJQQ4RERHFJAY5REREFJMY5BCRpdSV38DxzAOQjfVdfSpEFOMY5BCRpeQXi4F1K4HijV19KkQU4xjkEJG1HA7tf9XRtedBRDGPQQ4RdQ0pu/oMiCjGMcghImupqvY/gxwiijAGOUTUJSSDHCKKMAY5RGQt6czk6BkdIqIIYZBDRNZSnRkcZnKIKMIY5BCRxRjkEJE1GOQQkbUkgxwisgaDHCKyFoMcIrIIgxwispYR5LDwmIgii0EOEVlLcp4cIrIGgxwispYe2zCTQ0QRxiCHiKxlZHK69jSIKPYxyCEia7Emh4gswiCHiKzF0VVEZBEGOURkLT24URnkEFFkMcghImsZGRwGOUQUWQxyiMharMkhIoswyCEia7G7iogswiCHiKzFwmMisgiDHCKyGLuriMgaDHKIyFoqJwMkImswyCEia7HwmIgswiCHiCzGmhwisgaDHCKylspMDhFZg0EOEVmMQ8iJyBoMcojIWpzxmIgswiCHiKzFeXKIyCIMcojIWpzxmIgswiCHiKylFxyz8JiIIoxBDhFZS3rdICKKCAY5RGQtPYPD7ioiijAGOURkLWNwFYMcIoosBjlEZC3W5BCRRRjkEJG1OISciCzCIIeIrMUgh4gswiCHiCwjzYENgxwiijBbqA84ePAgXn31VaxZswYtLS3Iy8vDzJkzcdhhhwHQPsQWLVqEzz//HA0NDTjiiCMwY8YM9OvXzzhGfX095s+fj9WrV0MIgeOOOw5XX301kpKSjH12796NF198Edu3b0d6ejqmTp2K8847z+1cVqxYgTfeeAOVlZXIy8vDZZddhqOOOqqjbUFEkeYW5LAmh4giK6RMTn19Pe655x7YbDbceeedeOKJJ3DFFVcgNTXV2Of999/Hxx9/jGuvvRYPPfQQEhMTMXv2bLS2thr7PP3009i7dy/uvvtuzJo1C5s3b8a///1vY3tjYyMefPBBZGdn45FHHsHll1+ON998E5999pmxz5YtW/DUU0/htNNOw5w5c3Dsscfisccew549ezrTHkQUSczkEJGFQgpy3n//ffTp0wczZ87E0KFDkZubizFjxiAvLw+AlsVZsmQJfv3rX+PYY4/FoEGDcOONN6K6uhorV64EAJSUlGDNmjW4/vrrMWzYMBxxxBG45pprsHz5chw8eBAA8O2338Jut2PmzJkYMGAATjzxRJx11llYvHixcS5LlizB2LFjce6556KgoAC/+c1vMGTIEHzyySfhahsiCjcGOURkoZC6q1atWoUxY8bgH//4BzZt2oSsrCyceeaZOP300wEAFRUVqKmpwejRo43HpKSkYOjQoSguLsaJJ56I4uJipKamGt1bADBq1CgIIbBt2zaMHz8excXFOPLII2GzuU5vzJgxeP/991FfX4+0tDQUFxdj2rRpbuc3ZswYI5jypa2tDW1tbcbPQggkJycbtztLP0Y4jhXL2E7Bi+m2kjLsryum2ysC2F7BY1uFJlraK6Qgp6KiAp9++inOOeccXHDBBdi+fTteeukl2Gw2TJo0CTU1NQCAjIwMt8dlZGQY22pqapCenu62PS4uDmlpaW775Obmuu2TmZlpbNP3DfQ8vrz77rt46623jJ8HDx6MOXPmICcnJ8gWCI6e2aLA2E7Bi5W2Uluasc95OyU5GVmmWr1wipX2sgrbK3hsq9B0dXuFFOSoqorDDjsMl156KQAtSNizZw8+/fRTTJo0KRLnF1YXXHCBW/ZHjzArKytht9s7fXwhBPLy8lBeXu4+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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "\n", + "pm._equity['Total'].plot()" + ] + }, + { + "cell_type": "markdown", + "id": "6acdb11b", + "metadata": {}, + "source": [ + "# Test New Config Management System\n", + "\n", + "Testing the new config export/import functionality with path verification and validation." + ] + }, + { + "cell_type": "code", + "execution_count": 117, + "id": "10600a9b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "✓ Exported 15 configs\n", + "✓ Run name: \n", + "✓ Created at: 2025-11-28 23:39:26.464696\n", + "\n", + "Configs exported:\n", + " BacktesterConfig_1 -> root.config\n", + " RiskManagerConfig_1 -> root.risk_manager.config\n", + " ChainConfig_1 -> root.risk_manager.order_picker._chain_config\n", + " OrderPickerConfig_1 -> root.risk_manager.order_picker._order_picker_config\n", + " OrderSchemaConfigs_1 -> root.risk_manager.order_picker._order_schema_config\n" + ] + } + ], + "source": [ + "## Test 1: Export configs with metadata\n", + "from EventDriven.configs.export_configs import export_run_configs\n", + "\n", + "bundle = export_run_configs(evb_backtest, debug=False)\n", + "\n", + "print(f\"✓ Exported {len(bundle.configs)} configs\")\n", + "print(f\"✓ Run name: {bundle.run_name}\")\n", + "print(f\"✓ Created at: {bundle.created_at}\")\n", + "print(f\"\\nConfigs exported:\")\n", + "for label in list(bundle.configs.keys())[:5]:\n", + " meta = bundle.metadata[label]\n", + " print(f\" {label} -> {meta['path']}\")" + ] + }, + { + "cell_type": "markdown", + "id": "6fad5bd9", + "metadata": {}, + "source": [ + "**Note:** The config export now sanitizes all objects to YAML-safe basic types (str, int, float, bool, list, dict). Complex objects like nested configs, enums, and datetime objects are properly converted for safe serialization and deserialization." + ] + }, + { + "cell_type": "code", + "execution_count": 118, + "id": "c981b335", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "✓ Saved to: /var/folders/j0/80hkbygd4lb27h9mw76gqzpw0000gn/T/test_config.yaml\n", + "✓ File size: 5468 bytes\n", + "\n", + "First 20 lines of YAML:\n", + "run_name: ''\n", + "created_at: '2025-11-28T23:39:31.122141'\n", + "configs:\n", + " BacktesterConfig_1:\n", + " run_name: ''\n", + " t_plus_n: 1\n", + " finalize_trades: false\n", + " raise_errors: false\n", + " min_slippage_pct: 0.075\n", + " max_slippage_pct: 0.15\n", + " RiskManagerConfig_1:\n", + " run_name: ''\n", + " min_slippage_pct: 0.25\n", + " max_slippage_pct: 0.16\n", + " cache_orders: false\n", + " cache_position_analysis: false\n", + " cache_order_requests: false\n", + " ChainConfig_1:\n", + " run_name: ''\n", + " max_pct_width: null\n", + "\n" + ] + } + ], + "source": [ + "## Test 2: Save to YAML (with proper sanitization)\n", + "import tempfile\n", + "import os\n", + "\n", + "# Re-export to ensure we use the fixed version\n", + "from EventDriven.configs.export_configs import export_run_configs\n", + "bundle = export_run_configs(evb_backtest, debug=False)\n", + "\n", + "# Save to temporary file\n", + "temp_path = os.path.join(tempfile.gettempdir(), 'test_config.yaml')\n", + "bundle.save_to_yaml(temp_path)\n", + "\n", + "print(f\"✓ Saved to: {temp_path}\")\n", + "print(f\"✓ File size: {os.path.getsize(temp_path)} bytes\")\n", + "\n", + "# Show first few lines of YAML\n", + "with open(temp_path, 'r') as f:\n", + " lines = f.readlines()[:20]\n", + " print(\"\\nFirst 20 lines of YAML:\")\n", + " print(\"\".join(lines))" + ] + }, + { + "cell_type": "code", + "execution_count": 145, + "id": "1fee32bd", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "✓ Loaded 15 configs\n", + "✓ Run name: \n", + "✓ Has metadata: 15 entries\n", + "\n", + "Sample metadata:\n", + " BacktesterConfig_1:\n", + " config_class: BacktesterConfig\n", + " path: root.config\n", + " parent_path: root\n", + " attribute_name: config\n" + ] + } + ], + "source": [ + "## Test 3: Load from YAML and validate\n", + "from EventDriven.configs.export_configs import RunConfigBundle\n", + "\n", + "# Load the bundle\n", + "loaded_bundle = RunConfigBundle.load_from_yaml(temp_path)\n", + "\n", + "print(f\"✓ Loaded {len(loaded_bundle.configs)} configs\")\n", + "print(f\"✓ Run name: {loaded_bundle.run_name}\")\n", + "print(f\"✓ Has metadata: {len(loaded_bundle.metadata)} entries\")\n", + "print(f\"\\nSample metadata:\")\n", + "sample_label = list(loaded_bundle.metadata.keys())[0]\n", + "print(f\" {sample_label}:\")\n", + "for key, val in loaded_bundle.metadata[sample_label].items():\n", + " print(f\" {key}: {val}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 148, + "id": "9985612e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "New backtest ChainConfig:\n", + "{'run_name': '', 'max_pct_width': None, 'min_oi': None}\n" + ] + } + ], + "source": [ + "# Check what the NEW backtest's ChainConfig looks like\n", + "print(\"New backtest ChainConfig:\")\n", + "print(dict(new_backtest.risk_manager.order_picker._chain_config.__dict__))" + ] + }, + { + "cell_type": "code", + "execution_count": 147, + "id": "01df65e2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "✗ Error: Failed to create/apply new config for ChainConfig_1: 2 validation errors for ChainConfig\n", + "max_pct_width\n", + " Input should be an instance of Number [type=is_instance_of, input_value=None, input_type=NoneType]\n", + " For further information visit https://errors.pydantic.dev/2.11/v/is_instance_of\n", + "min_oi\n", + " Input should be an instance of Number [type=is_instance_of, input_value=None, input_type=NoneType]\n", + " For further information visit https://errors.pydantic.dev/2.11/v/is_instance_of\n" + ] + } + ], + "source": [ + "## Test 4: Apply configs to new backtest with validation\n", + "# Create a new backtest instance\n", + "new_backtest = OptionSignalBacktest(trades_, initial_capital=cash)\n", + "\n", + "# Apply the loaded configs with full validation\n", + "try:\n", + " results = loaded_bundle.apply_to(new_backtest, strict=True, verify_paths=True)\n", + " print(f\"✓ Applied {len(results)} configs successfully!\")\n", + " print(f\"\\nSample applied configs:\")\n", + " for label, path in list(results.items())[:5]:\n", + " print(f\" {label} -> {path}\")\n", + "except Exception as e:\n", + " print(f\"✗ Error: {e}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 121, + "id": "2f729f2f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "✗ Found 3 validation errors:\n", + " - root.risk_manager.order_picker: Missing required config attribute 'config'\n", + " - root.risk_manager.order_picker: Missing required config attribute 'order_schema_configs'\n", + " - root.risk_manager.order_picker: Missing required config attribute 'chain_config'\n", + "\n", + "✗ New backtest has 3 validation errors\n" + ] + } + ], + "source": [ + "## Test 5: Validate config placement\n", + "from EventDriven.configs.export_configs import validate_config_placement\n", + "\n", + "# Validate the original backtest\n", + "errors = validate_config_placement(evb_backtest, raise_on_error=False)\n", + "\n", + "if errors:\n", + " print(f\"✗ Found {len(errors)} validation errors:\")\n", + " for err in errors[:5]: # Show first 5\n", + " print(f\" - {err}\")\n", + "else:\n", + " print(\"✓ All configs are correctly placed!\")\n", + "\n", + "# Validate the new backtest\n", + "errors_new = validate_config_placement(new_backtest, raise_on_error=False)\n", + "if errors_new:\n", + " print(f\"\\n✗ New backtest has {len(errors_new)} validation errors\")\n", + "else:\n", + " print(\"\\n✓ New backtest configs are correctly placed!\")" + ] + }, + { + "cell_type": "code", + "execution_count": 116, + "id": "a27ffe82", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Comparing config values between original and new backtest:\n", + "\n" + ] + }, + { + "ename": "AttributeError", + "evalue": "'OrderPicker' object has no attribute 'order_schema_configs'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[116], line 6\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mComparing config values between original and new backtest:\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 5\u001b[0m \u001b[38;5;66;03m# Check OrderSchemaConfigs\u001b[39;00m\n\u001b[0;32m----> 6\u001b[0m orig_schema \u001b[38;5;241m=\u001b[39m \u001b[43mevb_backtest\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrisk_manager\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43morder_picker\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43morder_schema_configs\u001b[49m\n\u001b[1;32m 7\u001b[0m new_schema \u001b[38;5;241m=\u001b[39m new_backtest\u001b[38;5;241m.\u001b[39mrisk_manager\u001b[38;5;241m.\u001b[39morder_picker\u001b[38;5;241m.\u001b[39morder_schema_configs\n\u001b[1;32m 9\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mOrderSchemaConfigs.target_dte:\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", + "\u001b[0;31mAttributeError\u001b[0m: 'OrderPicker' object has no attribute 'order_schema_configs'" + ] + } + ], + "source": [ + "## Test 6: Verify configs were applied correctly\n", + "# Check a few specific config values\n", + "print(\"Comparing config values between original and new backtest:\\n\")\n", + "\n", + "# Check OrderSchemaConfigs\n", + "orig_schema = evb_backtest.risk_manager.order_picker.order_schema_configs\n", + "new_schema = new_backtest.risk_manager.order_picker.order_schema_configs\n", + "\n", + "print(f\"OrderSchemaConfigs.target_dte:\")\n", + "print(f\" Original: {orig_schema.target_dte}\")\n", + "print(f\" New: {new_schema.target_dte}\")\n", + "print(f\" Match: {'✓' if orig_schema.target_dte == new_schema.target_dte else '✗'}\")\n", + "\n", + "print(f\"\\nBacktesterConfig.raise_errors:\")\n", + "print(f\" Original: {evb_backtest.config.raise_errors}\")\n", + "print(f\" New: {new_backtest.config.raise_errors}\")\n", + "print(f\" Match: {'✓' if evb_backtest.config.raise_errors == new_backtest.config.raise_errors else '✗'}\")\n", + "\n", + "print(f\"\\nRiskManagerConfig.cache_orders:\")\n", + "print(f\" Original: {evb_backtest.risk_manager.config.cache_orders}\")\n", + "print(f\" New: {new_backtest.risk_manager.config.cache_orders}\")\n", + "print(f\" Match: {'✓' if evb_backtest.risk_manager.config.cache_orders == new_backtest.risk_manager.config.cache_orders else '✗'}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "3d57de8e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Console Logging & File Logging Can be configured using STREAM_LOG_LEVEL and FILE_LOG_LEVEL in environment variables.\n", + "Propagate to root logger can be set using PROPAGATE_TO_ROOT_LOGGER in environment variables.\n", + "Example:\n", + "STREAM_LOG_LEVEL = 'DEBUG'\n", + "FILE_LOG_LEVEL = 'INFO'\n", + "PROPAGATE_TO_ROOT_LOGGER = 'False'\n", + "\n", + "2025-11-29 00:44:17 trade.helpers.Logging INFO: Logging Root Directory: /Users/chiemelienwanisobi/cloned_repos/QuantTools/logs\n", + "Using Proxy URL: http://54.205.248.219:5500/thetadata\n", + "Using Proxy URL: http://54.205.248.219:5500/thetadata\n", + "\n", + "\n", + "Scheduled Data Requests will be saved to: /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/scheduler/requests.jsonl\n", + "2025-11-29 00:44:38 DataManager.py CRITICAL: Using ProcessSaveManager for saving data.\n", + "\n", + "\n", + "Scheduled Data Requests will be saved to: /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/scheduler/requests.jsonl\n", + "2025-11-29 00:44:38 DataManager.py CRITICAL: Using ProcessSaveManager for saving data.\n" + ] + }, + { + "data": { + "text/html": [ + " \n", + "
\n", + " \n", + " Loading BokehJS ...\n", + "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": "'use strict';\n(function(root) {\n function now() {\n return new Date();\n }\n\n const force = true;\n\n if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n root._bokeh_onload_callbacks = [];\n root._bokeh_is_loading = undefined;\n }\n\nconst JS_MIME_TYPE = 'application/javascript';\n const HTML_MIME_TYPE = 'text/html';\n const EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n const CLASS_NAME = 'output_bokeh rendered_html';\n\n /**\n * Render data to the DOM node\n */\n function render(props, node) {\n const script = document.createElement(\"script\");\n node.appendChild(script);\n }\n\n /**\n * Handle when an output is cleared or removed\n */\n function handleClearOutput(event, handle) {\n function drop(id) {\n const view = Bokeh.index.get_by_id(id)\n if (view != null) {\n view.model.document.clear()\n Bokeh.index.delete(view)\n }\n }\n\n const cell = handle.cell;\n\n const id = cell.output_area._bokeh_element_id;\n const server_id = cell.output_area._bokeh_server_id;\n\n // Clean up Bokeh references\n if (id != null) {\n drop(id)\n }\n\n if (server_id !== undefined) {\n // Clean up Bokeh references\n const cmd_clean = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n cell.notebook.kernel.execute(cmd_clean, {\n iopub: {\n output: function(msg) {\n const id = msg.content.text.trim()\n drop(id)\n }\n }\n });\n // Destroy server and session\n const cmd_destroy = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n cell.notebook.kernel.execute(cmd_destroy);\n }\n }\n\n /**\n * Handle when a new output is added\n */\n function handleAddOutput(event, handle) {\n const output_area = handle.output_area;\n const output = handle.output;\n\n // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n if ((output.output_type != \"display_data\") || (!Object.prototype.hasOwnProperty.call(output.data, EXEC_MIME_TYPE))) {\n return\n }\n\n const toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n\n if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n // store reference to embed id on output_area\n output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n }\n if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n const bk_div = document.createElement(\"div\");\n bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n const script_attrs = bk_div.children[0].attributes;\n for (let i = 0; i < script_attrs.length; i++) {\n toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n toinsert[toinsert.length - 1].firstChild.textContent = bk_div.children[0].textContent\n }\n // store reference to server id on output_area\n output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n }\n }\n\n function register_renderer(events, OutputArea) {\n\n function append_mime(data, metadata, element) {\n // create a DOM node to render to\n const toinsert = this.create_output_subarea(\n metadata,\n CLASS_NAME,\n EXEC_MIME_TYPE\n );\n this.keyboard_manager.register_events(toinsert);\n // Render to node\n const props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n render(props, toinsert[toinsert.length - 1]);\n element.append(toinsert);\n return toinsert\n }\n\n /* Handle when an output is cleared or removed */\n events.on('clear_output.CodeCell', handleClearOutput);\n events.on('delete.Cell', handleClearOutput);\n\n /* Handle when a new output is added */\n events.on('output_added.OutputArea', handleAddOutput);\n\n /**\n * Register the mime type and append_mime function with output_area\n */\n OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n /* Is output safe? */\n safe: true,\n /* Index of renderer in `output_area.display_order` */\n index: 0\n });\n }\n\n // register the mime type if in Jupyter Notebook environment and previously unregistered\n if (root.Jupyter !== undefined) {\n const events = require('base/js/events');\n const OutputArea = require('notebook/js/outputarea').OutputArea;\n\n if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n register_renderer(events, OutputArea);\n }\n }\n if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n const NB_LOAD_WARNING = {'data': {'text/html':\n \"
\\n\"+\n \"

\\n\"+\n \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n \"

\\n\"+\n \"
    \\n\"+\n \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n \"
  • use INLINE resources instead, as so:
  • \\n\"+\n \"
\\n\"+\n \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"
\"}};\n\n function display_loaded(error = null) {\n const el = document.getElementById(\"fbfafe26-f6c1-4e2d-ac71-438f1bcc048f\");\n if (el != null) {\n const html = (() => {\n if (typeof root.Bokeh === \"undefined\") {\n if (error == null) {\n return \"BokehJS is loading ...\";\n } else {\n return \"BokehJS failed to load.\";\n }\n } else {\n const prefix = `BokehJS ${root.Bokeh.version}`;\n if (error == null) {\n return `${prefix} successfully loaded.`;\n } else {\n return `${prefix} encountered errors while loading and may not function as expected.`;\n }\n }\n })();\n el.innerHTML = html;\n\n if (error != null) {\n const wrapper = document.createElement(\"div\");\n wrapper.style.overflow = \"auto\";\n wrapper.style.height = \"5em\";\n wrapper.style.resize = \"vertical\";\n const content = document.createElement(\"div\");\n content.style.fontFamily = \"monospace\";\n content.style.whiteSpace = \"pre-wrap\";\n content.style.backgroundColor = \"rgb(255, 221, 221)\";\n content.textContent = error.stack ?? error.toString();\n wrapper.append(content);\n el.append(wrapper);\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(() => display_loaded(error), 100);\n }\n }\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n\n root._bokeh_onload_callbacks.push(callback);\n if (root._bokeh_is_loading > 0) {\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls == null || js_urls.length === 0) {\n run_callbacks();\n return null;\n }\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = css_urls.length + js_urls.length;\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n\n function on_error(url) {\n console.error(\"failed to load \" + url);\n }\n\n for (let i = 0; i < css_urls.length; i++) {\n const url = css_urls[i];\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n }\n\n for (let i = 0; i < js_urls.length; i++) {\n const url = js_urls[i];\n const element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n };\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.7.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.7.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.7.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.7.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.7.3.min.js\"];\n const css_urls = [];\n\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {\n }\n ];\n\n function run_inline_js() {\n if (root.Bokeh !== undefined || force === true) {\n try {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\n\n } catch (error) {display_loaded(error);throw error;\n }if (force === true) {\n display_loaded();\n }} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n } else if (force !== true) {\n const cell = $(document.getElementById(\"fbfafe26-f6c1-4e2d-ac71-438f1bcc048f\")).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\n }\n }\n\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(css_urls, js_urls, function() {\n console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n}(window));", + "application/vnd.bokehjs_load.v0+json": "" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2\n", + "import sys\n", + "sys.path.append(\"/Users/chiemelienwanisobi/cloned_repos/configs\")\n", + "# from configs.long_bbands._setup import setup_configs\n", + "from prod_strategies.long_bbands._setup import setup_backtest" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "57c840dc", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[get_engine] Creating engine for DB: securities_master, PID: 68293\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bkt = setup_backtest(\n", + " trades=trades_, initial_capital=cash\n", + ")\n", + "bkt" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "2b82e77d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "PortfolioManagerConfig(run_name='bkt_test_11', weights_haircut=0.05, roll_failed_orders=False)" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bkt.portfolio.config" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "openbb_new_use", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/EventDriven/demos/demo.ipynb b/EventDriven/demos/demo.ipynb deleted file mode 100644 index add86a8..0000000 --- a/EventDriven/demos/demo.ipynb +++ /dev/null @@ -1,16359 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Console Logging & File Logging Can be configured using STREAM_LOG_LEVEL and FILE_LOG_LEVEL in environment variables.\n", - "Propagate to root logger can be set using PROPAGATE_TO_ROOT_LOGGER in environment variables.\n", - "Example:\n", - "STREAM_LOG_LEVEL = 'DEBUG'\n", - "FILE_LOG_LEVEL = 'INFO'\n", - "PROPAGATE_TO_ROOT_LOGGER = 'False'\n", - "\n", - "2025-02-19 20:35:11 trade.helpers.Logging INFO: Logging Root Directory: /Users/chiemelienwanisobi/cloned_repos/QuantTools/logs\n" - ] - }, - { - "ename": "KeyboardInterrupt", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[1], line 9\u001b[0m\n\u001b[1;32m 5\u001b[0m sys\u001b[38;5;241m.\u001b[39mpath\u001b[38;5;241m.\u001b[39mappend(\n\u001b[1;32m 6\u001b[0m os\u001b[38;5;241m.\u001b[39menviron\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mWORK_DIR\u001b[39m\u001b[38;5;124m'\u001b[39m)) \u001b[38;5;66;03m#type: ignore\u001b[39;00m\n\u001b[1;32m 7\u001b[0m sys\u001b[38;5;241m.\u001b[39mpath\u001b[38;5;241m.\u001b[39mappend(\n\u001b[1;32m 8\u001b[0m os\u001b[38;5;241m.\u001b[39menviron\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mDBASE_DIR\u001b[39m\u001b[38;5;124m'\u001b[39m)) \u001b[38;5;66;03m#type: ignore\u001b[39;00m\n\u001b[0;32m----> 9\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mdbase\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mDataAPI\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mThetaData\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;241m*\u001b[39m \u001b[38;5;66;03m#type: ignore\u001b[39;00m\n\u001b[1;32m 10\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mdbase\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mdatabase\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mSQLHelpers\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;241m*\u001b[39m \u001b[38;5;66;03m#type: ignore\u001b[39;00m\n\u001b[1;32m 11\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mpd\u001b[39;00m\n", - "File \u001b[0;32m~/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:14\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mtime\u001b[39;00m\n\u001b[1;32m 13\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mio\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m StringIO\n\u001b[0;32m---> 14\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mpd\u001b[39;00m\n\u001b[1;32m 15\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mos\u001b[39;00m\n\u001b[1;32m 16\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mjson\u001b[39;00m\n", - "File \u001b[0;32m~/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/__init__.py:142\u001b[0m\n\u001b[1;32m 139\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m testing\n\u001b[1;32m 140\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mutil\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01m_print_versions\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m show_versions\n\u001b[0;32m--> 142\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mio\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mapi\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m (\n\u001b[1;32m 143\u001b[0m \u001b[38;5;66;03m# excel\u001b[39;00m\n\u001b[1;32m 144\u001b[0m ExcelFile,\n\u001b[1;32m 145\u001b[0m ExcelWriter,\n\u001b[1;32m 146\u001b[0m read_excel,\n\u001b[1;32m 147\u001b[0m \u001b[38;5;66;03m# parsers\u001b[39;00m\n\u001b[1;32m 148\u001b[0m read_csv,\n\u001b[1;32m 149\u001b[0m read_fwf,\n\u001b[1;32m 150\u001b[0m read_table,\n\u001b[1;32m 151\u001b[0m \u001b[38;5;66;03m# pickle\u001b[39;00m\n\u001b[1;32m 152\u001b[0m read_pickle,\n\u001b[1;32m 153\u001b[0m to_pickle,\n\u001b[1;32m 154\u001b[0m \u001b[38;5;66;03m# pytables\u001b[39;00m\n\u001b[1;32m 155\u001b[0m HDFStore,\n\u001b[1;32m 156\u001b[0m read_hdf,\n\u001b[1;32m 157\u001b[0m \u001b[38;5;66;03m# sql\u001b[39;00m\n\u001b[1;32m 158\u001b[0m read_sql,\n\u001b[1;32m 159\u001b[0m read_sql_query,\n\u001b[1;32m 160\u001b[0m read_sql_table,\n\u001b[1;32m 161\u001b[0m \u001b[38;5;66;03m# misc\u001b[39;00m\n\u001b[1;32m 162\u001b[0m read_clipboard,\n\u001b[1;32m 163\u001b[0m read_parquet,\n\u001b[1;32m 164\u001b[0m read_orc,\n\u001b[1;32m 165\u001b[0m read_feather,\n\u001b[1;32m 166\u001b[0m read_gbq,\n\u001b[1;32m 167\u001b[0m read_html,\n\u001b[1;32m 168\u001b[0m read_xml,\n\u001b[1;32m 169\u001b[0m read_json,\n\u001b[1;32m 170\u001b[0m read_stata,\n\u001b[1;32m 171\u001b[0m read_sas,\n\u001b[1;32m 172\u001b[0m read_spss,\n\u001b[1;32m 173\u001b[0m )\n\u001b[1;32m 175\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mio\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mjson\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01m_normalize\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m json_normalize\n\u001b[1;32m 177\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mutil\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01m_tester\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m test\n", - "File \u001b[0;32m~/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/api.py:26\u001b[0m\n\u001b[1;32m 17\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mio\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mparsers\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m (\n\u001b[1;32m 18\u001b[0m read_csv,\n\u001b[1;32m 19\u001b[0m read_fwf,\n\u001b[1;32m 20\u001b[0m read_table,\n\u001b[1;32m 21\u001b[0m )\n\u001b[1;32m 22\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mio\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpickle\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m (\n\u001b[1;32m 23\u001b[0m read_pickle,\n\u001b[1;32m 24\u001b[0m to_pickle,\n\u001b[1;32m 25\u001b[0m )\n\u001b[0;32m---> 26\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mio\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpytables\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m (\n\u001b[1;32m 27\u001b[0m HDFStore,\n\u001b[1;32m 28\u001b[0m read_hdf,\n\u001b[1;32m 29\u001b[0m )\n\u001b[1;32m 30\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mio\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01msas\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m read_sas\n\u001b[1;32m 31\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mio\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mspss\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m read_spss\n", - "File \u001b[0;32m:1176\u001b[0m, in \u001b[0;36m_find_and_load\u001b[0;34m(name, import_)\u001b[0m\n", - "File \u001b[0;32m:1147\u001b[0m, in \u001b[0;36m_find_and_load_unlocked\u001b[0;34m(name, import_)\u001b[0m\n", - "File \u001b[0;32m:690\u001b[0m, in \u001b[0;36m_load_unlocked\u001b[0;34m(spec)\u001b[0m\n", - "File \u001b[0;32m:936\u001b[0m, in \u001b[0;36mexec_module\u001b[0;34m(self, module)\u001b[0m\n", - "File \u001b[0;32m:1032\u001b[0m, in \u001b[0;36mget_code\u001b[0;34m(self, fullname)\u001b[0m\n", - "File \u001b[0;32m:1130\u001b[0m, in \u001b[0;36mget_data\u001b[0;34m(self, path)\u001b[0m\n", - "\u001b[0;31mKeyboardInterrupt\u001b[0m: " - ] - } - ], - "source": [ - "\n", - "from dotenv import load_dotenv\n", - "load_dotenv()\n", - "import os\n", - "import sys\n", - "sys.path.append(\n", - " os.environ.get('WORK_DIR')) #type: ignore\n", - "sys.path.append(\n", - " os.environ.get('DBASE_DIR')) #type: ignore\n", - "from dbase.DataAPI.ThetaData import * #type: ignore\n", - "from dbase.database.SQLHelpers import * #type: ignore\n", - "import pandas as pd\n", - "from data import HistoricTradeDataHandler\n", - "from event import *\n", - "from queue import Queue\n", - "from trade.backtester_.backtester_ import PTDataset, PTBacktester\n", - "import pandas_ta as ta\n", - "from trade.assets.Stock import Stock\n", - "from trade.backtester_.utils.WalkForwardUtils import prev_monday \n", - "from trade.backtester_.strats import BBandsTrend2\n", - "from trade.backtester_.strats import MAStrat\n", - "import yfinance as yf\n", - "from datetime import datetime\n", - "from backtest import OptionSignalBacktest\n", - "from copy import deepcopy\n", - "%load_ext autoreload\n", - "%autoreload 2" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "def create_datasate(stocks: list, start: str,interval: str, engine: str = 'yf', timewidth = None, timeframe = None, end: str = datetime.today(), return_object = False ):\n", - " dataset = []\n", - " if engine.lower() == 'yf':\n", - " for stock in stocks:\n", - " start = prev_monday(start)\n", - " data2 = yf.download(stock, start = start, end = end, interval=interval, progress = False)\n", - "\n", - " dataset.append(PTDataset(stock, data2))\n", - " else:\n", - " for stk in stocks:\n", - " stock = Stock(stk)\n", - " data = stock.spot(ts = True, ts_start = '2018-01-01')\n", - " data.rename(columns = {x:x.capitalize() for x in data.columns}, inplace= True)\n", - " data['Timestamp'] = pd.to_datetime(data['Timestamp'], format = '%Y-%m-%d')\n", - " data2 = data.set_index('Timestamp')\n", - " data2 = data2.asfreq('W', method = 'ffill')\n", - " data2 = data2.fillna(0)\n", - " data2['Next_Day_Open'] = data2.Open.shift(-1)\n", - " data2['EMA'] = ta.ma('ema', data2.Close, length = 21).fillna(0)\n", - " dataset.append(PTDataset(stk, data2))\n", - " return dataset if return_object else data2\n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
SizeEntryBarExitBarEntryPriceExitPricePnLReturnPctEntryTimeExitTimeTagDurationTicker
0-83738121.234194121.360001-1.006456-0.0010382023-07-242023-07-25None1 daysGOOGL
0-93738110.232833111.139999-8.164500-0.0082302023-07-242023-07-25None1 daysAMD
1-83940111.518319111.790001-2.173458-0.0024362023-07-262023-07-27None1 daysAMD
0-24041339.288331333.67001311.2366350.0165592023-07-272023-07-28None1 daysMSFT
2-84142112.983167114.160004-9.414691-0.0104162023-07-282023-07-31None3 daysAMD
.......................................
55-4238239152.594050154.289993-6.783774-0.0111142024-05-092024-05-10None1 daysAMD
56-4240241150.750519150.4299931.2821040.0021262024-05-132024-05-14None1 daysAMD
57-4242243155.045431160.919998-23.498267-0.0378892024-05-152024-05-16None1 daysAMD
59-4249249160.845069161.410004-2.259740-0.0035122024-05-242024-05-24None0 daysAMD
28-4249249181.014219181.649994-2.543100-0.0035122024-05-242024-05-24None0 daysAMZN
\n", - "

196 rows × 12 columns

\n", - "
" - ], - "text/plain": [ - " Size EntryBar ExitBar EntryPrice ExitPrice PnL ReturnPct \\\n", - "0 -8 37 38 121.234194 121.360001 -1.006456 -0.001038 \n", - "0 -9 37 38 110.232833 111.139999 -8.164500 -0.008230 \n", - "1 -8 39 40 111.518319 111.790001 -2.173458 -0.002436 \n", - "0 -2 40 41 339.288331 333.670013 11.236635 0.016559 \n", - "2 -8 41 42 112.983167 114.160004 -9.414691 -0.010416 \n", - ".. ... ... ... ... ... ... ... \n", - "55 -4 238 239 152.594050 154.289993 -6.783774 -0.011114 \n", - "56 -4 240 241 150.750519 150.429993 1.282104 0.002126 \n", - "57 -4 242 243 155.045431 160.919998 -23.498267 -0.037889 \n", - "59 -4 249 249 160.845069 161.410004 -2.259740 -0.003512 \n", - "28 -4 249 249 181.014219 181.649994 -2.543100 -0.003512 \n", - "\n", - " EntryTime ExitTime Tag Duration Ticker \n", - "0 2023-07-24 2023-07-25 None 1 days GOOGL \n", - "0 2023-07-24 2023-07-25 None 1 days AMD \n", - "1 2023-07-26 2023-07-27 None 1 days AMD \n", - "0 2023-07-27 2023-07-28 None 1 days MSFT \n", - "2 2023-07-28 2023-07-31 None 3 days AMD \n", - ".. ... ... ... ... ... \n", - "55 2024-05-09 2024-05-10 None 1 days AMD \n", - "56 2024-05-13 2024-05-14 None 1 days AMD \n", - "57 2024-05-15 2024-05-16 None 1 days AMD \n", - "59 2024-05-24 2024-05-24 None 0 days AMD \n", - "28 2024-05-24 2024-05-24 None 0 days AMZN \n", - "\n", - "[196 rows x 12 columns]" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "start, end, interval = '2023-05-29', '2024-05-28','1d'\n", - "STOCKS = ['AAPL', 'MSFT','GOOGL', 'AMD', 'AMZN']\n", - "dataset = create_datasate(STOCKS, start, interval,end = end , return_object=True)\n", - "MAStrat.start_date = pd.to_datetime('1994-03-22')\n", - "tt = PTBacktester(dataset, MAStrat, cash =1000, commission = 0.0035)\n", - "stats = tt.run()\n", - "trades = tt.trades()\n", - "shorts = tt.trades()[tt.trades()['Size'] < 0]\n", - "shorts" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
SizeEntryBarExitBarEntryPriceExitPricePnLReturnPctEntryTimeExitTimeTagDurationTicker
0-83738121.234194121.360001-1.006456-0.0010382023-07-242023-07-25None1 daysGOOGL
0-93738110.232833111.139999-8.164500-0.0082302023-07-242023-07-25None1 daysAMD
173940130.525252131.6699988.0132210.0087702023-07-262023-07-27None1 daysGOOGL
1-83940111.518319111.790001-2.173458-0.0024362023-07-262023-07-27None1 daysAMD
0-24041339.288331333.67001311.2366350.0165592023-07-272023-07-28None1 daysMSFT
2-84142112.983167114.160004-9.414691-0.0104162023-07-282023-07-31None3 daysAMD
074243133.666197133.550003-0.813357-0.0008692023-07-312023-08-01None1 daysAMZN
1-34344334.016837333.6300051.1604980.0011582023-08-012023-08-02None1 daysMSFT
3-84344113.860092119.489998-45.039246-0.0494462023-08-012023-08-02None1 daysAMD
2-34546324.859000331.880005-21.063015-0.0216122023-08-032023-08-04None1 daysMSFT
4-84546108.568672114.480003-47.290651-0.0544482023-08-032023-08-04None1 daysAMD
1-74546127.033823141.059998-98.183219-0.1104132023-08-032023-08-04None1 daysAMZN
0-54748181.492550179.6900029.0127370.0099322023-08-072023-08-08None1 daysAAPL
3-34748327.220700326.9599910.7821260.0007972023-08-072023-08-08None1 daysMSFT
574748116.767261114.940002-12.790807-0.0156492023-08-072023-08-08None1 daysAMD
264748141.483471140.619995-5.180852-0.0061032023-08-072023-08-08None1 daysAMZN
1-54950180.236950179.4799963.7847720.0042002023-08-092023-08-10None1 daysAAPL
4-34950325.327356326.019989-2.077898-0.0021292023-08-092023-08-10None1 daysMSFT
6-74950112.494884111.3000038.3641690.0106222023-08-092023-08-10None1 daysAMD
2-55152176.699387177.970001-6.353070-0.0071912023-08-112023-08-14None3 daysAAPL
\n", - "
" - ], - "text/plain": [ - " Size EntryBar ExitBar EntryPrice ExitPrice PnL ReturnPct \\\n", - "0 -8 37 38 121.234194 121.360001 -1.006456 -0.001038 \n", - "0 -9 37 38 110.232833 111.139999 -8.164500 -0.008230 \n", - "1 7 39 40 130.525252 131.669998 8.013221 0.008770 \n", - "1 -8 39 40 111.518319 111.790001 -2.173458 -0.002436 \n", - "0 -2 40 41 339.288331 333.670013 11.236635 0.016559 \n", - "2 -8 41 42 112.983167 114.160004 -9.414691 -0.010416 \n", - "0 7 42 43 133.666197 133.550003 -0.813357 -0.000869 \n", - "1 -3 43 44 334.016837 333.630005 1.160498 0.001158 \n", - "3 -8 43 44 113.860092 119.489998 -45.039246 -0.049446 \n", - "2 -3 45 46 324.859000 331.880005 -21.063015 -0.021612 \n", - "4 -8 45 46 108.568672 114.480003 -47.290651 -0.054448 \n", - "1 -7 45 46 127.033823 141.059998 -98.183219 -0.110413 \n", - "0 -5 47 48 181.492550 179.690002 9.012737 0.009932 \n", - "3 -3 47 48 327.220700 326.959991 0.782126 0.000797 \n", - "5 7 47 48 116.767261 114.940002 -12.790807 -0.015649 \n", - "2 6 47 48 141.483471 140.619995 -5.180852 -0.006103 \n", - "1 -5 49 50 180.236950 179.479996 3.784772 0.004200 \n", - "4 -3 49 50 325.327356 326.019989 -2.077898 -0.002129 \n", - "6 -7 49 50 112.494884 111.300003 8.364169 0.010622 \n", - "2 -5 51 52 176.699387 177.970001 -6.353070 -0.007191 \n", - "\n", - " EntryTime ExitTime Tag Duration Ticker \n", - "0 2023-07-24 2023-07-25 None 1 days GOOGL \n", - "0 2023-07-24 2023-07-25 None 1 days AMD \n", - "1 2023-07-26 2023-07-27 None 1 days GOOGL \n", - "1 2023-07-26 2023-07-27 None 1 days AMD \n", - "0 2023-07-27 2023-07-28 None 1 days MSFT \n", - "2 2023-07-28 2023-07-31 None 3 days AMD \n", - "0 2023-07-31 2023-08-01 None 1 days AMZN \n", - "1 2023-08-01 2023-08-02 None 1 days MSFT \n", - "3 2023-08-01 2023-08-02 None 1 days AMD \n", - "2 2023-08-03 2023-08-04 None 1 days MSFT \n", - "4 2023-08-03 2023-08-04 None 1 days AMD \n", - "1 2023-08-03 2023-08-04 None 1 days AMZN \n", - "0 2023-08-07 2023-08-08 None 1 days AAPL \n", - "3 2023-08-07 2023-08-08 None 1 days MSFT \n", - "5 2023-08-07 2023-08-08 None 1 days AMD \n", - "2 2023-08-07 2023-08-08 None 1 days AMZN \n", - "1 2023-08-09 2023-08-10 None 1 days AAPL \n", - "4 2023-08-09 2023-08-10 None 1 days MSFT \n", - "6 2023-08-09 2023-08-10 None 1 days AMD \n", - "2 2023-08-11 2023-08-14 None 3 days AAPL " - ] - }, - "execution_count": 36, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "trades_ = trades[:20]\n", - "trades_" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "( Size EntryBar ExitBar EntryPrice ExitPrice PnL ReturnPct \\\n", - " 0 27.0 504.0 568.0 336.262811 314.029999 -600.285939 -0.066117 \n", - " 1 9.0 504.0 571.0 52.904521 51.693333 -10.900697 -0.022894 \n", - " 2 37.0 504.0 584.0 192.240502 170.369995 -809.208768 -0.113766 \n", - " 3 21.0 504.0 584.0 130.695846 120.629997 -211.382813 -0.077017 \n", - " 4 42.0 504.0 585.0 279.795877 210.600006 -2906.226592 -0.247308 \n", - " 5 33.0 504.0 672.0 120.480208 132.740005 404.573332 0.101758 \n", - " 6 73.0 504.0 753.0 116.506348 161.250000 3266.286562 0.384045 \n", - " 7 64.0 504.0 753.0 87.043588 160.820007 4721.690846 0.847580 \n", - " 8 21.0 504.0 753.0 463.717356 911.770020 9409.105932 0.966219 \n", - " 9 422.0 504.0 753.0 42.282471 123.470001 34261.137831 1.920123 \n", - " 10 8.0 518.0 560.0 326.207752 306.160004 -160.381990 -0.061457 \n", - " 11 14.0 523.0 529.0 132.381718 117.230003 -212.124007 -0.114455 \n", - " 12 6.0 525.0 551.0 231.808500 213.759995 -108.291033 -0.077860 \n", - " 13 13.0 552.0 582.0 38.785277 33.639999 -66.888603 -0.132661 \n", - " 14 26.0 554.0 585.0 71.920843 64.919998 -182.021970 -0.097341 \n", - " 15 36.0 590.0 661.0 174.849846 183.419998 308.525496 0.049014 \n", - " 16 71.0 593.0 611.0 104.103088 97.379997 -477.339433 -0.064581 \n", - " 17 13.0 593.0 753.0 121.824902 199.470001 1009.386296 0.637350 \n", - " 18 24.0 595.0 753.0 362.755205 448.660004 2061.715163 0.236812 \n", - " 19 23.0 595.0 753.0 74.700542 130.500000 1283.387524 0.746975 \n", - " 20 11.0 597.0 680.0 38.935799 42.450001 38.656217 0.090256 \n", - " 21 18.0 597.0 753.0 145.507500 193.490005 863.685099 0.329760 \n", - " 22 37.0 599.0 638.0 240.328221 215.100006 -933.443933 -0.104974 \n", - " 23 7.0 610.0 699.0 320.738665 346.119995 177.669310 0.079134 \n", - " 24 5.0 613.0 639.0 237.729144 202.630005 -175.495695 -0.147643 \n", - " 25 138.0 618.0 753.0 32.734169 39.910000 990.264667 0.219215 \n", - " 26 9.0 648.0 753.0 55.092152 67.889999 115.180631 0.232299 \n", - " 27 31.0 648.0 753.0 96.857817 99.400002 78.807732 0.026247 \n", - " 28 71.0 657.0 658.0 97.259218 94.849998 -171.054598 -0.024771 \n", - " 29 30.0 679.0 753.0 142.798053 184.479996 1250.458280 0.291894 \n", - " 30 36.0 720.0 753.0 186.089042 212.089996 936.034340 0.139723 \n", - " \n", - " EntryTime ExitTime Duration Ticker \n", - " 0 2023-07-05 2023-10-04 91 days MSFT \n", - " 1 2023-07-05 2023-10-09 96 days WMT \n", - " 2 2023-07-05 2023-10-26 113 days AAPL \n", - " 3 2023-07-05 2023-10-26 113 days AMZN \n", - " 4 2023-07-05 2023-10-27 114 days TSLA \n", - " 5 2023-07-05 2024-03-05 244 days GOOG \n", - " 6 2023-07-05 2024-07-01 362 days AMD \n", - " 7 2023-07-05 2024-07-01 362 days AVGO \n", - " 8 2023-07-05 2024-07-01 362 days LLY \n", - " 9 2023-07-05 2024-07-01 362 days NVDA \n", - " 10 2023-07-25 2023-09-22 59 days HD \n", - " 11 2023-08-01 2023-08-09 8 days QCOM \n", - " 12 2023-08-03 2023-09-11 39 days BA \n", - " 13 2023-09-12 2023-10-24 42 days INTC \n", - " 14 2023-09-14 2023-10-27 43 days MU \n", - " 15 2023-11-03 2024-02-16 105 days AAPL \n", - " 16 2023-11-08 2023-12-05 27 days SBUX \n", - " 17 2023-11-08 2024-07-01 236 days QCOM \n", - " 18 2023-11-10 2024-07-01 234 days MSFT \n", - " 19 2023-11-10 2024-07-01 234 days MU \n", - " 20 2023-11-14 2024-03-15 122 days INTC \n", - " 21 2023-11-14 2024-07-01 230 days AMZN \n", - " 22 2023-11-16 2024-01-16 61 days TSLA \n", - " 23 2023-12-04 2024-04-12 130 days HD \n", - " 24 2023-12-07 2024-01-17 41 days BA \n", - " 25 2023-12-14 2024-07-01 200 days BAC \n", - " 26 2024-01-30 2024-07-01 153 days WMT \n", - " 27 2024-01-30 2024-07-01 153 days DIS \n", - " 28 2024-02-12 2024-02-13 1 days SBUX \n", - " 29 2024-03-14 2024-07-01 109 days GOOG \n", - " 30 2024-05-13 2024-07-01 49 days AAPL ,\n", - " {'NVDA': 0.17403567829056413,\n", - " 'TSLA': 0.11550642768233775,\n", - " 'AMD': 0.0834286994973343,\n", - " 'LLY': 0.09757539849722477,\n", - " 'AAPL': 0.07043488643087037,\n", - " 'MSFT': 0.0908514723319269,\n", - " 'AVGO': 0.055093156449691004,\n", - " 'SBUX': 0.07221176940610122,\n", - " 'GOOG': 0.038799601494671494,\n", - " 'BAC': 0.04413788909693789,\n", - " 'AMZN': 0.027623397184346542,\n", - " 'MU': 0.018678439659805944,\n", - " 'QCOM': 0.018379279730883966,\n", - " 'DIS': 0.02993136919118428,\n", - " 'HD': 0.025585512620229425,\n", - " 'BA': 0.014360292506341181,\n", - " 'PFE': 0.013366729929548736,\n", - " 'INTC': 0.005000000000000001,\n", - " 'WMT': 0.005000000000000001})" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import json\n", - "with open('profitable_weights.json', 'r') as f:\n", - " weights = json.load(f)\n", - "trades_ = pd.read_csv('profitable_trades.csv').iloc[:, 1:]\n", - "trades_, weights" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " long short close\n", - "10 GOOGL20240621P115 GOOGL20240621P100 5.0\n" - ] - }, - { - "data": { - "text/plain": [ - "{'result': 'SUCCESSFUL',\n", - " 'data': {'long': ['GOOGL20240621P115'],\n", - " 'short': ['GOOGL20240621P100'],\n", - " 'trade_id': '&L:GOOGL20240621P115&S:GOOGL20240621P100',\n", - " 'close': 5.0}}" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "from EventDriven.riskmanager_async import RiskManager, close_cache, spot_cache\n", - "from pandas.tseries.offsets import BDay\n", - "\n", - "rm = RiskManager(None, None, 1000000)\n", - "tick = 'GOOGL'\n", - "date = '2023-07-24'\n", - "start = (pd.to_datetime(date) - BDay(30)).strftime('%Y-%m-%d')\n", - "right = 'P'\n", - "order_settings = {'type': 'spread',\n", - " 'specifics': [{'direction': 'long',\n", - " 'rel_strike': 1.0,\n", - " 'dte': 365,\n", - " 'moneyness_width': 0.1},\n", - " {'direction': 'short',\n", - " 'rel_strike': 0.85,\n", - " 'dte': 365,\n", - " 'moneyness_width': 0.1}],\n", - " 'name': 'vertical_spread'}\n", - "\n", - "order = await rm.OrderPicker.get_order(tick, date, right, 5, order_settings)\n", - "order" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
SizeEntryBarExitBarEntryPriceExitPricePnLReturnPctEntryTimeExitTimeDurationTicker
027.0504.0568.0336.262811314.029999-600.285939-0.0661172023-07-052023-10-0491 daysMSFT
19.0504.0571.052.90452151.693333-10.900697-0.0228942023-07-052023-10-0996 daysWMT
237.0504.0584.0192.240502170.369995-809.208768-0.1137662023-07-052023-10-26113 daysAAPL
321.0504.0584.0130.695846120.629997-211.382813-0.0770172023-07-052023-10-26113 daysAMZN
442.0504.0585.0279.795877210.600006-2906.226592-0.2473082023-07-052023-10-27114 daysTSLA
533.0504.0672.0120.480208132.740005404.5733320.1017582023-07-052024-03-05244 daysGOOG
673.0504.0753.0116.506348161.2500003266.2865620.3840452023-07-052024-07-01362 daysAMD
764.0504.0753.087.043588160.8200074721.6908460.8475802023-07-052024-07-01362 daysAVGO
821.0504.0753.0463.717356911.7700209409.1059320.9662192023-07-052024-07-01362 daysLLY
9422.0504.0753.042.282471123.47000134261.1378311.9201232023-07-052024-07-01362 daysNVDA
108.0518.0560.0326.207752306.160004-160.381990-0.0614572023-07-252023-09-2259 daysHD
1114.0523.0529.0132.381718117.230003-212.124007-0.1144552023-08-012023-08-098 daysQCOM
126.0525.0551.0231.808500213.759995-108.291033-0.0778602023-08-032023-09-1139 daysBA
1313.0552.0582.038.78527733.639999-66.888603-0.1326612023-09-122023-10-2442 daysINTC
1426.0554.0585.071.92084364.919998-182.021970-0.0973412023-09-142023-10-2743 daysMU
1536.0590.0661.0174.849846183.419998308.5254960.0490142023-11-032024-02-16105 daysAAPL
1671.0593.0611.0104.10308897.379997-477.339433-0.0645812023-11-082023-12-0527 daysSBUX
1713.0593.0753.0121.824902199.4700011009.3862960.6373502023-11-082024-07-01236 daysQCOM
1824.0595.0753.0362.755205448.6600042061.7151630.2368122023-11-102024-07-01234 daysMSFT
1923.0595.0753.074.700542130.5000001283.3875240.7469752023-11-102024-07-01234 daysMU
2011.0597.0680.038.93579942.45000138.6562170.0902562023-11-142024-03-15122 daysINTC
2118.0597.0753.0145.507500193.490005863.6850990.3297602023-11-142024-07-01230 daysAMZN
2237.0599.0638.0240.328221215.100006-933.443933-0.1049742023-11-162024-01-1661 daysTSLA
237.0610.0699.0320.738665346.119995177.6693100.0791342023-12-042024-04-12130 daysHD
245.0613.0639.0237.729144202.630005-175.495695-0.1476432023-12-072024-01-1741 daysBA
25138.0618.0753.032.73416939.910000990.2646670.2192152023-12-142024-07-01200 daysBAC
269.0648.0753.055.09215267.889999115.1806310.2322992024-01-302024-07-01153 daysWMT
2731.0648.0753.096.85781799.40000278.8077320.0262472024-01-302024-07-01153 daysDIS
2871.0657.0658.097.25921894.849998-171.054598-0.0247712024-02-122024-02-131 daysSBUX
2930.0679.0753.0142.798053184.4799961250.4582800.2918942024-03-142024-07-01109 daysGOOG
3036.0720.0753.0186.089042212.089996936.0343400.1397232024-05-132024-07-0149 daysAAPL
\n", - "
" - ], - "text/plain": [ - " Size EntryBar ExitBar EntryPrice ExitPrice PnL ReturnPct \\\n", - "0 27.0 504.0 568.0 336.262811 314.029999 -600.285939 -0.066117 \n", - "1 9.0 504.0 571.0 52.904521 51.693333 -10.900697 -0.022894 \n", - "2 37.0 504.0 584.0 192.240502 170.369995 -809.208768 -0.113766 \n", - "3 21.0 504.0 584.0 130.695846 120.629997 -211.382813 -0.077017 \n", - "4 42.0 504.0 585.0 279.795877 210.600006 -2906.226592 -0.247308 \n", - "5 33.0 504.0 672.0 120.480208 132.740005 404.573332 0.101758 \n", - "6 73.0 504.0 753.0 116.506348 161.250000 3266.286562 0.384045 \n", - "7 64.0 504.0 753.0 87.043588 160.820007 4721.690846 0.847580 \n", - "8 21.0 504.0 753.0 463.717356 911.770020 9409.105932 0.966219 \n", - "9 422.0 504.0 753.0 42.282471 123.470001 34261.137831 1.920123 \n", - "10 8.0 518.0 560.0 326.207752 306.160004 -160.381990 -0.061457 \n", - "11 14.0 523.0 529.0 132.381718 117.230003 -212.124007 -0.114455 \n", - "12 6.0 525.0 551.0 231.808500 213.759995 -108.291033 -0.077860 \n", - "13 13.0 552.0 582.0 38.785277 33.639999 -66.888603 -0.132661 \n", - "14 26.0 554.0 585.0 71.920843 64.919998 -182.021970 -0.097341 \n", - "15 36.0 590.0 661.0 174.849846 183.419998 308.525496 0.049014 \n", - "16 71.0 593.0 611.0 104.103088 97.379997 -477.339433 -0.064581 \n", - "17 13.0 593.0 753.0 121.824902 199.470001 1009.386296 0.637350 \n", - "18 24.0 595.0 753.0 362.755205 448.660004 2061.715163 0.236812 \n", - "19 23.0 595.0 753.0 74.700542 130.500000 1283.387524 0.746975 \n", - "20 11.0 597.0 680.0 38.935799 42.450001 38.656217 0.090256 \n", - "21 18.0 597.0 753.0 145.507500 193.490005 863.685099 0.329760 \n", - "22 37.0 599.0 638.0 240.328221 215.100006 -933.443933 -0.104974 \n", - "23 7.0 610.0 699.0 320.738665 346.119995 177.669310 0.079134 \n", - "24 5.0 613.0 639.0 237.729144 202.630005 -175.495695 -0.147643 \n", - "25 138.0 618.0 753.0 32.734169 39.910000 990.264667 0.219215 \n", - "26 9.0 648.0 753.0 55.092152 67.889999 115.180631 0.232299 \n", - "27 31.0 648.0 753.0 96.857817 99.400002 78.807732 0.026247 \n", - "28 71.0 657.0 658.0 97.259218 94.849998 -171.054598 -0.024771 \n", - "29 30.0 679.0 753.0 142.798053 184.479996 1250.458280 0.291894 \n", - "30 36.0 720.0 753.0 186.089042 212.089996 936.034340 0.139723 \n", - "\n", - " EntryTime ExitTime Duration Ticker \n", - "0 2023-07-05 2023-10-04 91 days MSFT \n", - "1 2023-07-05 2023-10-09 96 days WMT \n", - "2 2023-07-05 2023-10-26 113 days AAPL \n", - "3 2023-07-05 2023-10-26 113 days AMZN \n", - "4 2023-07-05 2023-10-27 114 days TSLA \n", - "5 2023-07-05 2024-03-05 244 days GOOG \n", - "6 2023-07-05 2024-07-01 362 days AMD \n", - "7 2023-07-05 2024-07-01 362 days AVGO \n", - "8 2023-07-05 2024-07-01 362 days LLY \n", - "9 2023-07-05 2024-07-01 362 days NVDA \n", - "10 2023-07-25 2023-09-22 59 days HD \n", - "11 2023-08-01 2023-08-09 8 days QCOM \n", - "12 2023-08-03 2023-09-11 39 days BA \n", - "13 2023-09-12 2023-10-24 42 days INTC \n", - "14 2023-09-14 2023-10-27 43 days MU \n", - "15 2023-11-03 2024-02-16 105 days AAPL \n", - "16 2023-11-08 2023-12-05 27 days SBUX \n", - "17 2023-11-08 2024-07-01 236 days QCOM \n", - "18 2023-11-10 2024-07-01 234 days MSFT \n", - "19 2023-11-10 2024-07-01 234 days MU \n", - "20 2023-11-14 2024-03-15 122 days INTC \n", - "21 2023-11-14 2024-07-01 230 days AMZN \n", - "22 2023-11-16 2024-01-16 61 days TSLA \n", - "23 2023-12-04 2024-04-12 130 days HD \n", - "24 2023-12-07 2024-01-17 41 days BA \n", - "25 2023-12-14 2024-07-01 200 days BAC \n", - "26 2024-01-30 2024-07-01 153 days WMT \n", - "27 2024-01-30 2024-07-01 153 days DIS \n", - "28 2024-02-12 2024-02-13 1 days SBUX \n", - "29 2024-03-14 2024-07-01 109 days GOOG \n", - "30 2024-05-13 2024-07-01 49 days AAPL " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "trades_ = pd.read_csv('profitable_trades.csv').iloc[:, 1:]\n", - "trades_" - ] - }, - { - "cell_type": "code", - "execution_count": 157, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'NVDA': 0.1305267587179231,\n", - " 'TSLA': 0.08662982076175331,\n", - " 'AMD': 0.06257152462300072,\n", - " 'LLY': 0.07318154887291858,\n", - " 'AAPL': 0.05282616482315278,\n", - " 'MSFT': 0.06813860424894518,\n", - " 'AVGO': 0.04131986733726825,\n", - " 'SBUX': 0.05415882705457591,\n", - " 'GOOG': 0.029099701121003622,\n", - " 'BAC': 0.033103416822703416,\n", - " 'AMZN': 0.020717547888259906,\n", - " 'MU': 0.014008829744854458,\n", - " 'QCOM': 0.013784459798162976,\n", - " 'DIS': 0.02244852689338821,\n", - " 'HD': 0.019189134465172068,\n", - " 'BA': 0.010770219379755886,\n", - " 'PFE': 0.010025047447161551,\n", - " 'INTC': 0.0037500000000000007,\n", - " 'WMT': 0.0037500000000000007}" - ] - }, - "execution_count": 157, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "w_map = {x: w * 0.75 for x, w in weights.items()}\n", - "w_map" - ] - }, - { - "cell_type": "code", - "execution_count": 156, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "899.9999999999999" - ] - }, - "execution_count": 156, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "0.009*100_000" - ] - }, - { - "cell_type": "code", - "execution_count": 159, - "metadata": {}, - "outputs": [], - "source": [ - "#Backtest class \n", - "evb_backtest = OptionSignalBacktest(trades_)" - ] - }, - { - "cell_type": "code", - "execution_count": 158, - "metadata": {}, - "outputs": [], - "source": [ - "evb_backtest.portfolio.weight_map = w_map\n", - "evb_backtest.portfolio.weight_map\n", - "evb_backtest.portfolio.order_settings = {'type': 'naked',\n", - " 'specifics': [{'direction': 'long',\n", - " 'rel_strike': .900,\n", - " 'dte': 365,\n", - " 'moneyness_width': 0.15},\n", - " {'direction': 'short',\n", - " 'rel_strike': .80,\n", - " 'dte': 365,\n", - " 'moneyness_width': 0.15}],\n", - "\n", - " 'name': 'vertical_spread'}\n", - "evb_backtest.portfolio.max_price = int(10)" - ] - }, - { - "cell_type": "code", - "execution_count": 120, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
DateMSFTWMTAAPLAMZNTSLAGOOGAMDAVGOLLYNVDAHDQCOMBAINTCMUSBUXBACDIS
02023-07-05111111111100000000
12023-07-06000000000000000000
22023-07-07000000000000000000
32023-07-08000000000000000000
42023-07-09000000000000000000
............................................................
3582024-06-27000000000000000000
3592024-06-28000000000000000000
3602024-06-29000000000000000000
3612024-06-30000000000000000000
3622024-07-01-1-1-1-10-1-1-1-1-10-100-10-1-1
\n", - "

363 rows × 19 columns

\n", - "
" - ], - "text/plain": [ - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "0 2023-07-05 1 1 1 1 1 1 1 1 1 1 0 \n", - "1 2023-07-06 0 0 0 0 0 0 0 0 0 0 0 \n", - "2 2023-07-07 0 0 0 0 0 0 0 0 0 0 0 \n", - "3 2023-07-08 0 0 0 0 0 0 0 0 0 0 0 \n", - "4 2023-07-09 0 0 0 0 0 0 0 0 0 0 0 \n", - ".. ... ... ... ... ... ... ... ... ... ... ... .. \n", - "358 2024-06-27 0 0 0 0 0 0 0 0 0 0 0 \n", - "359 2024-06-28 0 0 0 0 0 0 0 0 0 0 0 \n", - "360 2024-06-29 0 0 0 0 0 0 0 0 0 0 0 \n", - "361 2024-06-30 0 0 0 0 0 0 0 0 0 0 0 \n", - "362 2024-07-01 -1 -1 -1 -1 0 -1 -1 -1 -1 -1 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "0 0 0 0 0 0 0 0 \n", - "1 0 0 0 0 0 0 0 \n", - "2 0 0 0 0 0 0 0 \n", - "3 0 0 0 0 0 0 0 \n", - "4 0 0 0 0 0 0 0 \n", - ".. ... .. ... .. ... ... ... \n", - "358 0 0 0 0 0 0 0 \n", - "359 0 0 0 0 0 0 0 \n", - "360 0 0 0 0 0 0 0 \n", - "361 0 0 0 0 0 0 0 \n", - "362 -1 0 0 -1 0 -1 -1 \n", - "\n", - "[363 rows x 19 columns]" - ] - }, - "execution_count": 120, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "signals = evb_backtest.bars.signal_df\n", - "signals" - ] - }, - { - "cell_type": "code", - "execution_count": 121, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "31.0" - ] - }, - "execution_count": 121, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "signals_df = deepcopy(signals).set_index('Date')\n", - "signals_df[signals_df!=-1].sum().sum()" - ] - }, - { - "cell_type": "code", - "execution_count": 122, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "0 2023-07-05 1 1 1 1 1 1 1 1 1 1 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "0 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - " long short close\n", - "72 MSFT20240621C350 MSFT20240621C370 9.375\n", - "Processing event: SIGNAL\n", - "Moneyness too tight\n", - "Processing event: SIGNAL\n", - " long short close\n", - "69 AAPL20240621C205 AAPL20240621C235 9.925\n", - "Processing event: SIGNAL\n", - " long short close\n", - "3 AMZN20240621C125 AMZN20240621C145 9.75\n", - "Processing event: SIGNAL\n", - " long short close\n", - "161 TSLA20240621C290 TSLA20240621C316.67 10.0\n", - "Processing event: SIGNAL\n", - " long short close\n", - "40 GOOG20240621C125 GOOG20240621C150 9.975\n", - "Processing event: SIGNAL\n", - " long short close\n", - "3 AMD20240621C110 AMD20240621C135 9.85\n", - "Processing event: SIGNAL\n", - "Moneyness too tight\n", - "Processing event: SIGNAL\n", - "2025-02-16 23:14:04 dbase.DataAPI.ThetaData ERROR: No contracts found for LLY on 20230705\n", - "2025-02-16 23:14:04 dbase.DataAPI.ThetaData ERROR: response: {\"content\":\"No listed contracts for the date\",\"cookies\":{},\"data\":\"No listed contracts for the date\",\"elapsed\":0.074464,\"headers\":{\"Access-control-allow-headers\":\"*\",\"Access-control-allow-origin\":\"https://http-docs.thetadata.us\",\"Access-control-request-headers\":\"*\",\"Content-length\":\"32\",\"Content-type\":\"text\",\"Date\":\"Mon, 17 Feb 2025 04:14:04 GMT\"},\"history\":[],\"reason\":\"\",\"status_code\":472,\"text\":\"No listed contracts for the date\",\"url\":\"http://127.0.0.1:25510/v2/list/contracts/option/trade?start_date=20230705&root=LLY&use_csv=true\"}\n", - "\n", - "2025-02-16 23:14:05 dbase.DataAPI.ThetaData ERROR: No contracts found for LLY on 20230705\n", - "2025-02-16 23:14:05 dbase.DataAPI.ThetaData ERROR: response: {\"content\":\"No listed contracts for the date\",\"cookies\":{},\"data\":\"No listed contracts for the date\",\"elapsed\":0.074216,\"headers\":{\"Access-control-allow-headers\":\"*\",\"Access-control-allow-origin\":\"https://http-docs.thetadata.us\",\"Access-control-request-headers\":\"*\",\"Content-length\":\"32\",\"Content-type\":\"text\",\"Date\":\"Mon, 17 Feb 2025 04:14:05 GMT\"},\"history\":[],\"reason\":\"\",\"status_code\":472,\"text\":\"No listed contracts for the date\",\"url\":\"http://127.0.0.1:25510/v2/list/contracts/option/trade?start_date=20230705&root=LLY&use_csv=true\"}\n", - "\n", - "Processing event: SIGNAL\n", - "Moneyness too tight\n", - "Processing event: ORDER\n", - "Processing event: ORDER\n", - "Processing event: ORDER\n", - "Processing event: ORDER\n", - "Processing event: ORDER\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Processing event: FILL\n", - "Processing event: FILL\n", - "Processing event: FILL\n", - "Processing event: FILL\n", - "Processing event: FILL\n", - "Event queue is empty, processed 23 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "1 2023-07-06 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "1 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "2 2023-07-07 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "2 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "3 2023-07-08 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "3 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "4 2023-07-09 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "4 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "5 2023-07-10 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "5 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "6 2023-07-11 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "6 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "7 2023-07-12 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "7 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "8 2023-07-13 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "8 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "9 2023-07-14 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "9 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "10 2023-07-15 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "10 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "11 2023-07-16 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "11 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "12 2023-07-17 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "12 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "13 2023-07-18 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "13 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "14 2023-07-19 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "14 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "15 2023-07-20 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "15 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "16 2023-07-21 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "16 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "17 2023-07-22 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "17 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "18 2023-07-23 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "18 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "19 2023-07-24 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "19 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "20 2023-07-25 0 0 0 0 0 0 0 0 0 0 1 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "20 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Moneyness too tight\n", - "Event queue is empty, processed 2 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "21 2023-07-26 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "21 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "22 2023-07-27 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "22 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "23 2023-07-28 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "23 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "24 2023-07-29 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "24 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "25 2023-07-30 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "25 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "26 2023-07-31 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "26 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "27 2023-08-01 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "27 1 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - " long short close\n", - "4 QCOM20240621C135 QCOM20240621C160 8.775\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "28 2023-08-02 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "28 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "29 2023-08-03 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "29 0 1 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - " long short close\n", - "0 BA20240621C230 BA20240621C250 9.625\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "30 2023-08-04 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "30 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "31 2023-08-05 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "31 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "32 2023-08-06 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "32 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "33 2023-08-07 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "33 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "34 2023-08-08 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "34 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "35 2023-08-09 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "35 -1 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "36 2023-08-10 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "36 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "37 2023-08-11 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "37 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "38 2023-08-12 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "38 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "39 2023-08-13 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "39 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "40 2023-08-14 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "40 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "41 2023-08-15 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "41 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "42 2023-08-16 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "42 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "43 2023-08-17 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "43 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "44 2023-08-18 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "44 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "45 2023-08-19 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "45 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "46 2023-08-20 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "46 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "47 2023-08-21 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "47 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "48 2023-08-22 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "48 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "49 2023-08-23 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "49 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "50 2023-08-24 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "50 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "51 2023-08-25 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "51 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "52 2023-08-26 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "52 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "53 2023-08-27 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "53 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "54 2023-08-28 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "54 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "55 2023-08-29 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "55 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "56 2023-08-30 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "56 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "57 2023-08-31 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "57 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "58 2023-09-01 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "58 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "59 2023-09-02 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "59 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "60 2023-09-03 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "60 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "61 2023-09-04 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "61 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "62 2023-09-05 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "62 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "63 2023-09-06 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "63 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "64 2023-09-07 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "64 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "65 2023-09-08 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "65 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "66 2023-09-09 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "66 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "67 2023-09-10 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "67 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "68 2023-09-11 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "68 0 -1 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "69 2023-09-12 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "69 0 0 1 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - " long short close\n", - "4 INTC20240621C40 INTC20240621C55 3.96\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "70 2023-09-13 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "70 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "71 2023-09-14 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "71 0 0 0 1 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - " long short close\n", - "2 MU20240621C70 MU20240621C85 6.1\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "72 2023-09-15 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "72 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "73 2023-09-16 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "73 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "74 2023-09-17 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "74 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "75 2023-09-18 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "75 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "76 2023-09-19 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "76 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "77 2023-09-20 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "77 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "78 2023-09-21 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "78 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "79 2023-09-22 0 0 0 0 0 0 0 0 0 0 -1 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "79 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Event queue is empty, processed 2 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "80 2023-09-23 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "80 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "81 2023-09-24 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "81 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "82 2023-09-25 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "82 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "83 2023-09-26 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "83 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "84 2023-09-27 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "84 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "85 2023-09-28 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "85 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "86 2023-09-29 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "86 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "87 2023-09-30 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "87 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "88 2023-10-01 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "88 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "89 2023-10-02 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "89 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "90 2023-10-03 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "90 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "91 2023-10-04 -1 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "91 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "92 2023-10-05 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "92 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "93 2023-10-06 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "93 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "94 2023-10-07 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "94 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "95 2023-10-08 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "95 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "96 2023-10-09 0 -1 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "96 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Event queue is empty, processed 2 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "97 2023-10-10 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "97 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "98 2023-10-11 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "98 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "99 2023-10-12 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "99 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "100 2023-10-13 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "100 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "101 2023-10-14 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "101 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "102 2023-10-15 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "102 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "103 2023-10-16 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "103 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "104 2023-10-17 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "104 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "105 2023-10-18 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "105 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "106 2023-10-19 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "106 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "107 2023-10-20 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "107 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "108 2023-10-21 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "108 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "109 2023-10-22 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "109 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "110 2023-10-23 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "110 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "111 2023-10-24 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "111 0 0 -1 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "112 2023-10-25 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "112 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "113 2023-10-26 0 0 -1 -1 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "113 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Processing event: FILL\n", - "Event queue is empty, processed 7 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "114 2023-10-27 0 0 0 0 -1 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "114 0 0 0 -1 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Processing event: FILL\n", - "Event queue is empty, processed 7 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "115 2023-10-28 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "115 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "116 2023-10-29 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "116 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "117 2023-10-30 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "117 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "118 2023-10-31 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "118 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "119 2023-11-01 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "119 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "120 2023-11-02 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "120 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "121 2023-11-03 0 0 1 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "121 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - " long short close\n", - "13 AAPL20240920C175 AAPL20240920C195 9.875\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "122 2023-11-04 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "122 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "123 2023-11-05 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "123 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "124 2023-11-06 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "124 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "125 2023-11-07 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "125 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "126 2023-11-08 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "126 1 0 0 0 1 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - " long short close\n", - "3 QCOM20250117C125 QCOM20250117C150 8.475\n", - "Processing event: SIGNAL\n", - " long short close\n", - "1 SBUX20250117C100 SBUX20250117C120 9.15\n", - "Processing event: ORDER\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Processing event: FILL\n", - "Event queue is empty, processed 7 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "127 2023-11-09 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "127 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "128 2023-11-10 1 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "128 0 0 0 1 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Event queue is empty, processed 3 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "129 2023-11-11 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "129 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "130 2023-11-12 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "130 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "131 2023-11-13 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "131 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "132 2023-11-14 0 0 0 1 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "132 0 0 1 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - " long short close\n", - "1 AMZN20240920C140 AMZN20240920C160 10.0\n", - "Processing event: SIGNAL\n", - " long short close\n", - "3 INTC20240920C40 INTC20240920C50 3.445\n", - "Processing event: ORDER\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Processing event: FILL\n", - "Event queue is empty, processed 7 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "133 2023-11-15 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "133 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "134 2023-11-16 0 0 0 0 1 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "134 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - " long short close\n", - "206 TSLA20240920C280 TSLA20240920C320 9.975\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "135 2023-11-17 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "135 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "136 2023-11-18 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "136 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "137 2023-11-19 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "137 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "138 2023-11-20 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "138 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "139 2023-11-21 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "139 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "140 2023-11-22 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "140 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "141 2023-11-23 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "141 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "142 2023-11-24 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "142 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "143 2023-11-25 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "143 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "144 2023-11-26 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "144 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "145 2023-11-27 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "145 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "146 2023-11-28 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "146 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "147 2023-11-29 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "147 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "148 2023-11-30 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "148 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "149 2023-12-01 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "149 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "150 2023-12-02 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "150 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "151 2023-12-03 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "151 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "152 2023-12-04 0 0 0 0 0 0 0 0 0 0 1 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "152 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - " long short close\n", - "8 HD20250117C350 HD20250117C370 7.2\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "153 2023-12-05 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "153 0 0 0 0 -1 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "154 2023-12-06 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "154 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "155 2023-12-07 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "155 0 1 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - " long short close\n", - "42 BA20250117C280 BA20250117C320 9.275\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "156 2023-12-08 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "156 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "157 2023-12-09 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "157 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "158 2023-12-10 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "158 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "159 2023-12-11 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "159 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "160 2023-12-12 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "160 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "161 2023-12-13 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "161 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "162 2023-12-14 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "162 0 0 0 0 0 1 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - " long short close\n", - "4 BAC20250117C35 BAC20250117C50 3.15\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "163 2023-12-15 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "163 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "164 2023-12-16 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "164 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "165 2023-12-17 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "165 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "166 2023-12-18 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "166 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "167 2023-12-19 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "167 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "168 2023-12-20 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "168 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "169 2023-12-21 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "169 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "170 2023-12-22 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "170 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "171 2023-12-23 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "171 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "172 2023-12-24 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "172 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "173 2023-12-25 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "173 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "174 2023-12-26 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "174 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "175 2023-12-27 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "175 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "176 2023-12-28 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "176 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "177 2023-12-29 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "177 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "178 2023-12-30 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "178 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "179 2023-12-31 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "179 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "180 2024-01-01 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "180 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "181 2024-01-02 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "181 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "182 2024-01-03 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "182 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "183 2024-01-04 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "183 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "184 2024-01-05 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "184 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "185 2024-01-06 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "185 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "186 2024-01-07 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "186 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "187 2024-01-08 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "187 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "188 2024-01-09 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "188 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "189 2024-01-10 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "189 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "190 2024-01-11 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "190 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "191 2024-01-12 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "191 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "192 2024-01-13 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "192 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "193 2024-01-14 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "193 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "194 2024-01-15 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "194 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "195 2024-01-16 0 0 0 0 -1 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "195 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "196 2024-01-17 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "196 0 -1 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "197 2024-01-18 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "197 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "198 2024-01-19 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "198 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "199 2024-01-20 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "199 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "200 2024-01-21 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "200 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "201 2024-01-22 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "201 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "202 2024-01-23 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "202 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "203 2024-01-24 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "203 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "204 2024-01-25 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "204 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "205 2024-01-26 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "205 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "206 2024-01-27 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "206 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "207 2024-01-28 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "207 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "208 2024-01-29 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "208 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "209 2024-01-30 0 1 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "209 0 0 0 0 0 0 1 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Moneyness too tight\n", - "Processing event: SIGNAL\n", - " long short close\n", - "17 DIS20250117C100 DIS20250117C145 9.755\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 5 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "210 2024-01-31 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "210 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "211 2024-02-01 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "211 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "212 2024-02-02 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "212 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "213 2024-02-03 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "213 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "214 2024-02-04 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "214 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "215 2024-02-05 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "215 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "216 2024-02-06 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "216 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "217 2024-02-07 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "217 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "218 2024-02-08 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "218 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "219 2024-02-09 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "219 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "220 2024-02-10 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "220 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "221 2024-02-11 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "221 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "222 2024-02-12 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "222 0 0 0 0 1 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - " long short close\n", - "13 SBUX20250117C95 SBUX20250117C145 9.925\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "223 2024-02-13 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "223 0 0 0 0 -1 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "224 2024-02-14 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "224 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "225 2024-02-15 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "225 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "226 2024-02-16 0 0 -1 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "226 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "227 2024-02-17 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "227 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "228 2024-02-18 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "228 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "229 2024-02-19 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "229 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "230 2024-02-20 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "230 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "231 2024-02-21 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "231 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "232 2024-02-22 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "232 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "233 2024-02-23 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "233 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "234 2024-02-24 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "234 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "235 2024-02-25 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "235 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "236 2024-02-26 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "236 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "237 2024-02-27 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "237 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "238 2024-02-28 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "238 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "239 2024-02-29 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "239 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "240 2024-03-01 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "240 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "241 2024-03-02 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "241 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "242 2024-03-03 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "242 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "243 2024-03-04 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "243 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "244 2024-03-05 0 0 0 0 0 -1 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "244 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "245 2024-03-06 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "245 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "246 2024-03-07 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "246 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "247 2024-03-08 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "247 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "248 2024-03-09 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "248 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "249 2024-03-10 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "249 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "250 2024-03-11 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "250 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "251 2024-03-12 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "251 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "252 2024-03-13 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "252 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "253 2024-03-14 0 0 0 0 0 1 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "253 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Moneyness too tight\n", - "Event queue is empty, processed 2 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "254 2024-03-15 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "254 0 0 -1 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "255 2024-03-16 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "255 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "256 2024-03-17 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "256 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "257 2024-03-18 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "257 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "258 2024-03-19 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "258 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "259 2024-03-20 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "259 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "260 2024-03-21 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "260 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "261 2024-03-22 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "261 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "262 2024-03-23 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "262 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "263 2024-03-24 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "263 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "264 2024-03-25 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "264 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "265 2024-03-26 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "265 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "266 2024-03-27 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "266 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "267 2024-03-28 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "267 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "268 2024-03-29 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "268 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "269 2024-03-30 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "269 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "270 2024-03-31 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "270 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "271 2024-04-01 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "271 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "272 2024-04-02 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "272 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "273 2024-04-03 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "273 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "274 2024-04-04 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "274 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "275 2024-04-05 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "275 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "276 2024-04-06 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "276 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "277 2024-04-07 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "277 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "278 2024-04-08 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "278 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "279 2024-04-09 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "279 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "280 2024-04-10 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "280 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "281 2024-04-11 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "281 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "282 2024-04-12 0 0 0 0 0 0 0 0 0 0 -1 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "282 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "283 2024-04-13 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "283 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "284 2024-04-14 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "284 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "285 2024-04-15 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "285 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "286 2024-04-16 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "286 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "287 2024-04-17 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "287 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "288 2024-04-18 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "288 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "289 2024-04-19 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "289 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "290 2024-04-20 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "290 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "291 2024-04-21 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "291 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "292 2024-04-22 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "292 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "293 2024-04-23 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "293 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "294 2024-04-24 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "294 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "295 2024-04-25 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "295 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "296 2024-04-26 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "296 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "297 2024-04-27 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "297 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "298 2024-04-28 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "298 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "299 2024-04-29 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "299 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "300 2024-04-30 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "300 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "301 2024-05-01 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "301 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "302 2024-05-02 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "302 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "303 2024-05-03 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "303 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "304 2024-05-04 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "304 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "305 2024-05-05 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "305 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "306 2024-05-06 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "306 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "307 2024-05-07 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "307 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "308 2024-05-08 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "308 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "309 2024-05-09 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "309 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "310 2024-05-10 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "310 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "311 2024-05-11 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "311 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "312 2024-05-12 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "312 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "313 2024-05-13 0 0 1 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "313 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - " long short close\n", - "15 AAPL20250620C185 AAPL20250620C205 9.825\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "314 2024-05-14 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "314 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "315 2024-05-15 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "315 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "316 2024-05-16 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "316 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "317 2024-05-17 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "317 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "318 2024-05-18 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "318 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "319 2024-05-19 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "319 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "320 2024-05-20 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "320 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "321 2024-05-21 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "321 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "322 2024-05-22 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "322 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "323 2024-05-23 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "323 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "324 2024-05-24 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "324 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "325 2024-05-25 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "325 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "326 2024-05-26 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "326 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "327 2024-05-27 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "327 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "328 2024-05-28 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "328 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "329 2024-05-29 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "329 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "330 2024-05-30 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "330 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "331 2024-05-31 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "331 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "332 2024-06-01 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "332 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "333 2024-06-02 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "333 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "334 2024-06-03 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "334 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "335 2024-06-04 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "335 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "336 2024-06-05 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "336 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "337 2024-06-06 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "337 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "338 2024-06-07 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "338 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "339 2024-06-08 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "339 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "340 2024-06-09 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "340 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "341 2024-06-10 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "341 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "342 2024-06-11 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "342 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "343 2024-06-12 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "343 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "344 2024-06-13 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "344 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "345 2024-06-14 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "345 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "346 2024-06-15 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "346 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "347 2024-06-16 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "347 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "348 2024-06-17 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "348 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "349 2024-06-18 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "349 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "350 2024-06-19 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "350 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "351 2024-06-20 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "351 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "352 2024-06-21 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "352 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "353 2024-06-22 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "353 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "354 2024-06-23 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "354 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "355 2024-06-24 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "355 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "356 2024-06-25 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "356 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "357 2024-06-26 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "357 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "358 2024-06-27 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "358 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "359 2024-06-28 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "359 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "360 2024-06-29 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "360 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "361 2024-06-30 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "361 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date MSFT WMT AAPL AMZN TSLA GOOG AMD AVGO LLY NVDA HD \\\n", - "362 2024-07-01 -1 -1 -1 -1 0 -1 -1 -1 -1 -1 0 \n", - "\n", - " QCOM BA INTC MU SBUX BAC DIS \n", - "362 -1 0 0 -1 0 -1 -1 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Processing event: ORDER\n", - "Processing event: ORDER\n", - "Processing event: ORDER\n", - "Processing event: ORDER\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Processing event: FILL\n", - "Processing event: FILL\n", - "Processing event: FILL\n", - "Processing event: FILL\n", - "Processing event: FILL\n", - "Event queue is empty, processed 26 event(s)\n", - "No more data to feed backtest\n" - ] - } - ], - "source": [ - "import cProfile\n", - "import pstats\n", - "import io\n", - "\n", - "profiler = cProfile.Profile()\n", - "profiler.enable()\n", - "#run backtest\n", - "\n", - "evb_backtest.run()\n", - "profiler.disable()\n", - "stream = io.StringIO()\n", - "stats = pstats.Stats(profiler, stream=stream).sort_stats('cumulative')" - ] - }, - { - "cell_type": "code", - "execution_count": 138, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "6" - ] - }, - "execution_count": 138, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.portfolio.moneyness_count" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " 291176502 function calls (264139354 primitive calls) in 826.490 seconds\n", - "\n", - " Ordered by: cumulative time\n", - " List reduced from 2981 to 30 due to restriction <30>\n", - "\n", - " ncalls tottime percall cumtime percall filename:lineno(function)\n", - " 2 0.000 0.000 826.504 413.252 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/IPython/core/interactiveshell.py:3541(run_code)\n", - " 2 0.000 0.000 826.504 413.252 {built-in method builtins.exec}\n", - " 1 0.000 0.000 826.504 826.504 /var/folders/j0/80hkbygd4lb27h9mw76gqzpw0000gn/T/ipykernel_43067/2161208997.py:1()\n", - " 1 0.051 0.051 826.504 826.504 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/backtest.py:37(run)\n", - " 62 0.001 0.000 664.107 10.711 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:270(update_signal)\n", - " 62 0.012 0.000 664.102 10.711 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:224(generate_order_new)\n", - " 57/31 0.005 0.000 663.957 21.418 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/decorators.py:36(wrapper)\n", - " 31 0.018 0.001 663.259 21.395 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:369(get_order)\n", - " 31 0.006 0.000 346.795 11.187 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:281(produce_order_candidates)\n", - " 61 0.033 0.001 346.789 5.685 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:149(chain_details)\n", - " 400 0.122 0.000 243.027 0.608 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:692(change_to_last_busday)\n", - " 400 0.023 0.000 240.548 0.601 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:680(is_USholiday)\n", - " 400 0.016 0.000 239.325 0.598 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas_market_calendars/calendars/nyse.py:1276(valid_days)\n", - " 400 0.005 0.000 238.947 0.597 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas_market_calendars/market_calendar.py:570(valid_days)\n", - " 400 28.608 0.072 238.737 0.597 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas_market_calendars/market_calendar.py:553(holidays)\n", - " 477 0.014 0.000 209.417 0.439 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:500(request)\n", - " 433 0.018 0.000 207.544 0.479 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:34(request_from_proxy)\n", - " 433 0.009 0.000 207.508 0.479 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/api.py:14(request)\n", - " 477 0.036 0.000 206.959 0.434 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:673(send)\n", - " 477 0.019 0.000 196.730 0.412 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:613(send)\n", - " 477 0.019 0.000 196.187 0.411 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:594(urlopen)\n", - " 477 0.020 0.000 195.996 0.411 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:379(_make_request)\n", - " 3137 0.031 0.000 193.569 0.062 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:704(readinto)\n", - " 22831 193.425 0.008 193.425 0.008 {method 'acquire' of '_thread.lock' objects}\n", - " 3499 0.046 0.000 193.257 0.055 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:295(wait)\n", - " 2956 191.850 0.065 191.850 0.065 {method 'recv_into' of '_socket.socket' objects}\n", - " 2499 0.031 0.000 190.015 0.076 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:428(result)\n", - " 400 0.028 0.000 186.528 0.466 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/holiday.py:443(holidays)\n", - " 400 0.175 0.000 185.286 0.463 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/holiday.py:476()\n", - " 11600 0.875 0.000 185.111 0.016 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/holiday.py:249(dates)\n", - "\n", - "\n", - "\n" - ] - } - ], - "source": [ - "stats.print_stats(30)\n", - "print(stream.getvalue())\n", - "with open('bactest_data.txt', 'w') as f:\n", - " stream.seek(0)\n", - " f.write(stream.read())\n", - " f.flush()" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "100.0" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "0.005 * 20_000" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
TickerPnLEntryPriceExitPriceReturnPctQuantityEntryTimeExitTimeDurationPositions
0MSFT-4021.729957485.231603270.536235-44.24595718.7322622023-07-052023-10-0491&L:MSFT20240621C355&S:MSFT20240621C365
1AAPL-5433.192644482.278316110.088399-77.17326414.5979042023-07-052023-10-26113&L:AAPL20240621C200&S:AAPL20240621C210
2AMZN-570.587808489.369516388.155308-20.6825735.6374282023-07-052023-10-26113&L:AMZN20240621C130&S:AMZN20240621C140
3TSLA-7212.238189498.356369187.716644-62.33284923.2173722023-07-052023-10-27114&L:TSLA20240621C293.33&S:TSLA20240621C306.67
4GOOG570.885387497.681533570.88215114.7083257.7989152023-07-052024-03-05244&L:GOOG20240621C127.5&S:GOOG20240621C137.5
5AMD17081.493376489.4876831492.731388204.95790617.0262652023-07-052024-07-01362&L:AMD20240621C125&S:AMD20240621C140
6BA-399.175537447.858690322.933226-27.8939473.1953102023-08-032023-09-1139&L:BA20240621C240&S:BA20240621C250
7INTC-217.222380473.481778266.664120-43.6801731.0503092023-09-122023-10-2442&L:INTC20240621C37&S:INTC20240621C50
8MU-540.438854447.419068317.373543-29.0657094.1557672023-09-142023-10-2743&L:MU20240621C70&S:MU20240621C80
9AAPL1575.913515498.242601609.89525922.40929614.1144292023-11-032024-02-16105&L:AAPL20240920C180&S:AAPL20240920C190
10QCOM2004.162729439.180028920.789532109.6610674.1613852023-11-082024-07-01236&L:QCOM20250117C120&S:QCOM20250117C130
11SBUX-2248.512724389.906891268.010781-31.26287718.4461402023-11-082023-12-0527&L:SBUX20250117C110&S:SBUX20250117C120
12AMZN3041.702523452.834792953.433239110.5477006.0761332023-11-142024-07-01230&L:AMZN20240920C150&S:AMZN20240920C160
13INTC115.198556432.725079532.95472423.1624301.1493462023-11-142024-03-15122&L:INTC20240920C37&S:INTC20240920C47
14TSLA-1405.942477415.649837364.882715-12.21391627.6939572023-11-162024-01-1661&L:TSLA20240920C240&S:TSLA20240920C250
15HD339.979895484.180263549.02528013.3927435.2429612023-12-042024-04-12130&L:HD20250117C340&S:HD20250117C350
16BA-811.585081429.397317184.936144-56.9312303.3198942023-12-072024-01-1741&L:BA20250117C260&S:BA20250117C270
17BAC3851.537354438.487018823.01647787.69460510.0162352023-12-142024-07-01200&L:BAC20250117C32&S:BAC20250117C45
18DIS126.366008476.690236496.9592974.2520406.2344282024-01-302024-07-01153&L:DIS20250117C95&S:DIS20250117C105
19SBUX-9.779012480.795202480.140086-0.13625714.9271372024-02-122024-02-131&L:SBUX20250117C100&S:SBUX20250117C115
20AAPL2740.259728489.870889681.28080839.07354414.3161852024-05-132024-07-0149&L:AAPL20250620C190&S:AAPL20250620C200
\n", - "
" - ], - "text/plain": [ - " Ticker PnL EntryPrice ExitPrice ReturnPct Quantity \\\n", - "0 MSFT -4021.729957 485.231603 270.536235 -44.245957 18.732262 \n", - "1 AAPL -5433.192644 482.278316 110.088399 -77.173264 14.597904 \n", - "2 AMZN -570.587808 489.369516 388.155308 -20.682573 5.637428 \n", - "3 TSLA -7212.238189 498.356369 187.716644 -62.332849 23.217372 \n", - "4 GOOG 570.885387 497.681533 570.882151 14.708325 7.798915 \n", - "5 AMD 17081.493376 489.487683 1492.731388 204.957906 17.026265 \n", - "6 BA -399.175537 447.858690 322.933226 -27.893947 3.195310 \n", - "7 INTC -217.222380 473.481778 266.664120 -43.680173 1.050309 \n", - "8 MU -540.438854 447.419068 317.373543 -29.065709 4.155767 \n", - "9 AAPL 1575.913515 498.242601 609.895259 22.409296 14.114429 \n", - "10 QCOM 2004.162729 439.180028 920.789532 109.661067 4.161385 \n", - "11 SBUX -2248.512724 389.906891 268.010781 -31.262877 18.446140 \n", - "12 AMZN 3041.702523 452.834792 953.433239 110.547700 6.076133 \n", - "13 INTC 115.198556 432.725079 532.954724 23.162430 1.149346 \n", - "14 TSLA -1405.942477 415.649837 364.882715 -12.213916 27.693957 \n", - "15 HD 339.979895 484.180263 549.025280 13.392743 5.242961 \n", - "16 BA -811.585081 429.397317 184.936144 -56.931230 3.319894 \n", - "17 BAC 3851.537354 438.487018 823.016477 87.694605 10.016235 \n", - "18 DIS 126.366008 476.690236 496.959297 4.252040 6.234428 \n", - "19 SBUX -9.779012 480.795202 480.140086 -0.136257 14.927137 \n", - "20 AAPL 2740.259728 489.870889 681.280808 39.073544 14.316185 \n", - "\n", - " EntryTime ExitTime Duration \\\n", - "0 2023-07-05 2023-10-04 91 \n", - "1 2023-07-05 2023-10-26 113 \n", - "2 2023-07-05 2023-10-26 113 \n", - "3 2023-07-05 2023-10-27 114 \n", - "4 2023-07-05 2024-03-05 244 \n", - "5 2023-07-05 2024-07-01 362 \n", - "6 2023-08-03 2023-09-11 39 \n", - "7 2023-09-12 2023-10-24 42 \n", - "8 2023-09-14 2023-10-27 43 \n", - "9 2023-11-03 2024-02-16 105 \n", - "10 2023-11-08 2024-07-01 236 \n", - "11 2023-11-08 2023-12-05 27 \n", - "12 2023-11-14 2024-07-01 230 \n", - "13 2023-11-14 2024-03-15 122 \n", - "14 2023-11-16 2024-01-16 61 \n", - "15 2023-12-04 2024-04-12 130 \n", - "16 2023-12-07 2024-01-17 41 \n", - "17 2023-12-14 2024-07-01 200 \n", - "18 2024-01-30 2024-07-01 153 \n", - "19 2024-02-12 2024-02-13 1 \n", - "20 2024-05-13 2024-07-01 49 \n", - "\n", - " Positions \n", - "0 &L:MSFT20240621C355&S:MSFT20240621C365 \n", - "1 &L:AAPL20240621C200&S:AAPL20240621C210 \n", - "2 &L:AMZN20240621C130&S:AMZN20240621C140 \n", - "3 &L:TSLA20240621C293.33&S:TSLA20240621C306.67 \n", - "4 &L:GOOG20240621C127.5&S:GOOG20240621C137.5 \n", - "5 &L:AMD20240621C125&S:AMD20240621C140 \n", - "6 &L:BA20240621C240&S:BA20240621C250 \n", - "7 &L:INTC20240621C37&S:INTC20240621C50 \n", - "8 &L:MU20240621C70&S:MU20240621C80 \n", - "9 &L:AAPL20240920C180&S:AAPL20240920C190 \n", - "10 &L:QCOM20250117C120&S:QCOM20250117C130 \n", - "11 &L:SBUX20250117C110&S:SBUX20250117C120 \n", - "12 &L:AMZN20240920C150&S:AMZN20240920C160 \n", - "13 &L:INTC20240920C37&S:INTC20240920C47 \n", - "14 &L:TSLA20240920C240&S:TSLA20240920C250 \n", - "15 &L:HD20250117C340&S:HD20250117C350 \n", - "16 &L:BA20250117C260&S:BA20250117C270 \n", - "17 &L:BAC20250117C32&S:BAC20250117C45 \n", - "18 &L:DIS20250117C95&S:DIS20250117C105 \n", - "19 &L:SBUX20250117C100&S:SBUX20250117C115 \n", - "20 &L:AAPL20250620C190&S:AAPL20250620C200 " - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.trades" - ] - }, - { - "cell_type": "code", - "execution_count": 71, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
TickerPnLEntryPriceExitPriceReturnPctQuantityEntryTimeExitTimeDurationPositions
0AAPL-4968.3947401429.343912422.402061-70.4478364.9341432023-07-052023-10-26113&L:AAPL20240621C205
1AMZN-1173.2757661427.543951821.227811-42.4726781.9350892023-07-052023-10-26113&L:AMZN20240621C142.5
2GOOG-117.5770051375.6665481333.999011-3.0288982.8217892023-07-052024-03-05244&L:GOOG20240621C127.5
3INTC-250.914264662.387877329.470486-50.2601880.7536832023-09-122023-10-2442&L:INTC20240621C37
4MU-787.5564141140.685126659.332998-42.1985101.6361342023-09-142023-10-2743&L:MU20240621C70
5AAPL-565.4614501297.5421831193.261653-8.0367745.4225032023-11-032024-02-16105&L:AAPL20240920C190
6QCOM8189.8856141336.3162257295.918927445.9724871.3742332023-11-082024-07-01236&L:QCOM20250117C130
7SBUX-2415.1740761253.764063834.097005-33.4725705.7549772023-11-082023-12-0527&L:SBUX20250117C105
8AMZN4764.7046751367.4685563732.663460172.9615572.0145082023-11-142024-07-01230&L:AMZN20240920C160
9INTC140.393101685.261683878.12384728.1443090.7279452023-11-142024-03-15122&L:INTC20240920C37
10BAC3279.356766514.586531898.20339674.5485638.5485212023-12-142024-07-01200&L:BAC20250117C32
11DIS-529.5155461349.6608651110.557418-17.7158172.2145882024-01-302024-07-01153&L:DIS20250117C95
12SBUX3.6736911277.8519601278.5040250.0510285.6339362024-02-122024-02-131&L:SBUX20250117C90
13AAPL7359.3517241385.7083972838.643337104.8514215.0651632024-05-132024-07-0149&L:AAPL20250620C205
\n", - "
" - ], - "text/plain": [ - " Ticker PnL EntryPrice ExitPrice ReturnPct Quantity \\\n", - "0 AAPL -4968.394740 1429.343912 422.402061 -70.447836 4.934143 \n", - "1 AMZN -1173.275766 1427.543951 821.227811 -42.472678 1.935089 \n", - "2 GOOG -117.577005 1375.666548 1333.999011 -3.028898 2.821789 \n", - "3 INTC -250.914264 662.387877 329.470486 -50.260188 0.753683 \n", - "4 MU -787.556414 1140.685126 659.332998 -42.198510 1.636134 \n", - "5 AAPL -565.461450 1297.542183 1193.261653 -8.036774 5.422503 \n", - "6 QCOM 8189.885614 1336.316225 7295.918927 445.972487 1.374233 \n", - "7 SBUX -2415.174076 1253.764063 834.097005 -33.472570 5.754977 \n", - "8 AMZN 4764.704675 1367.468556 3732.663460 172.961557 2.014508 \n", - "9 INTC 140.393101 685.261683 878.123847 28.144309 0.727945 \n", - "10 BAC 3279.356766 514.586531 898.203396 74.548563 8.548521 \n", - "11 DIS -529.515546 1349.660865 1110.557418 -17.715817 2.214588 \n", - "12 SBUX 3.673691 1277.851960 1278.504025 0.051028 5.633936 \n", - "13 AAPL 7359.351724 1385.708397 2838.643337 104.851421 5.065163 \n", - "\n", - " EntryTime ExitTime Duration Positions \n", - "0 2023-07-05 2023-10-26 113 &L:AAPL20240621C205 \n", - "1 2023-07-05 2023-10-26 113 &L:AMZN20240621C142.5 \n", - "2 2023-07-05 2024-03-05 244 &L:GOOG20240621C127.5 \n", - "3 2023-09-12 2023-10-24 42 &L:INTC20240621C37 \n", - "4 2023-09-14 2023-10-27 43 &L:MU20240621C70 \n", - "5 2023-11-03 2024-02-16 105 &L:AAPL20240920C190 \n", - "6 2023-11-08 2024-07-01 236 &L:QCOM20250117C130 \n", - "7 2023-11-08 2023-12-05 27 &L:SBUX20250117C105 \n", - "8 2023-11-14 2024-07-01 230 &L:AMZN20240920C160 \n", - "9 2023-11-14 2024-03-15 122 &L:INTC20240920C37 \n", - "10 2023-12-14 2024-07-01 200 &L:BAC20250117C32 \n", - "11 2024-01-30 2024-07-01 153 &L:DIS20250117C95 \n", - "12 2024-02-12 2024-02-13 1 &L:SBUX20250117C90 \n", - "13 2024-05-13 2024-07-01 49 &L:AAPL20250620C205 " - ] - }, - "execution_count": 71, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.trades" - ] - }, - { - "cell_type": "code", - "execution_count": 84, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
TickerPnLEntryPriceExitPriceReturnPctQuantityEntryTimeExitTimeDurationPositions
0MSFT-5788.966279778.989421281.981108-63.80167711.6476252023-07-052023-10-0491&L:MSFT20240621C440
1AAPL-5696.346495545.588925104.825974-80.78663812.9238322023-07-052023-10-26113&L:AAPL20240621C230
2AMZN-1312.193840956.742858501.901770-47.5405782.8849502023-07-052023-10-26113&L:AMZN20240621C155
3GOOG-1296.358956702.161320467.444434-33.4277725.5230752023-07-052024-03-05244&L:GOOG20240621C145
4AMD-2992.452021955.329169612.786171-35.8560188.7359892023-07-052024-07-01362&L:AMD20240621C155
5QCOM-1029.520276752.894353330.064102-56.1606352.4348312023-08-012023-08-098&L:QCOM20240621C160
6BA-822.129255987.848814420.634843-57.4191071.4494162023-08-032023-09-1139&L:BA20240621C290
7INTC-318.025324259.42844293.827476-63.8330031.9204322023-09-122023-10-2442&L:INTC20240621C47
8MU-1022.999527530.235876238.985683-54.9284213.5124422023-09-142023-10-2743&L:MU20240621C85
9AAPL-2090.634855591.821113415.458805-29.79993511.8542042023-11-032024-02-16105&L:AAPL20240920C210
10QCOM12627.855881699.9489715526.444096689.5495712.6163612023-11-082024-07-01236&L:QCOM20250117C150
11SBUX-3600.259450472.681398236.274400-50.01402615.2290732023-11-082023-12-0527&L:SBUX20250117C125
12AMZN5465.957497841.7549032516.256244198.9297993.2642302023-11-142024-07-01230&L:AMZN20240920C175
13INTC182.077339252.344849344.51978936.5273711.9753452023-11-142024-03-15122&L:INTC20240920C47
14HD1407.068810858.6340091332.46493055.1842712.9695592023-12-042024-04-12130&L:HD20250117C390
15BA-1056.388191853.640239221.739778-74.0242121.6717642023-12-072024-01-1741&L:BA20250117C320
16BAC3898.880242169.752295320.64277488.88862325.8391402023-12-142024-07-01200&L:BAC20250117C40
17DIS-1258.557244535.910100309.779144-42.1956885.5656122024-01-302024-07-01153&L:DIS20250117C115
18SBUX-13.837619279.182955278.645369-0.19255725.7403062024-02-122024-02-131&L:SBUX20250117C115
19GOOG7352.769513974.0457762825.769931190.1064823.9707692024-03-142024-07-01109&L:GOOG20250321C170
20AAPL9433.138806868.6642292035.923415134.3740368.0814432024-05-132024-07-0149&L:AAPL20250620C220
\n", - "
" - ], - "text/plain": [ - " Ticker PnL EntryPrice ExitPrice ReturnPct Quantity \\\n", - "0 MSFT -5788.966279 778.989421 281.981108 -63.801677 11.647625 \n", - "1 AAPL -5696.346495 545.588925 104.825974 -80.786638 12.923832 \n", - "2 AMZN -1312.193840 956.742858 501.901770 -47.540578 2.884950 \n", - "3 GOOG -1296.358956 702.161320 467.444434 -33.427772 5.523075 \n", - "4 AMD -2992.452021 955.329169 612.786171 -35.856018 8.735989 \n", - "5 QCOM -1029.520276 752.894353 330.064102 -56.160635 2.434831 \n", - "6 BA -822.129255 987.848814 420.634843 -57.419107 1.449416 \n", - "7 INTC -318.025324 259.428442 93.827476 -63.833003 1.920432 \n", - "8 MU -1022.999527 530.235876 238.985683 -54.928421 3.512442 \n", - "9 AAPL -2090.634855 591.821113 415.458805 -29.799935 11.854204 \n", - "10 QCOM 12627.855881 699.948971 5526.444096 689.549571 2.616361 \n", - "11 SBUX -3600.259450 472.681398 236.274400 -50.014026 15.229073 \n", - "12 AMZN 5465.957497 841.754903 2516.256244 198.929799 3.264230 \n", - "13 INTC 182.077339 252.344849 344.519789 36.527371 1.975345 \n", - "14 HD 1407.068810 858.634009 1332.464930 55.184271 2.969559 \n", - "15 BA -1056.388191 853.640239 221.739778 -74.024212 1.671764 \n", - "16 BAC 3898.880242 169.752295 320.642774 88.888623 25.839140 \n", - "17 DIS -1258.557244 535.910100 309.779144 -42.195688 5.565612 \n", - "18 SBUX -13.837619 279.182955 278.645369 -0.192557 25.740306 \n", - "19 GOOG 7352.769513 974.045776 2825.769931 190.106482 3.970769 \n", - "20 AAPL 9433.138806 868.664229 2035.923415 134.374036 8.081443 \n", - "\n", - " EntryTime ExitTime Duration Positions \n", - "0 2023-07-05 2023-10-04 91 &L:MSFT20240621C440 \n", - "1 2023-07-05 2023-10-26 113 &L:AAPL20240621C230 \n", - "2 2023-07-05 2023-10-26 113 &L:AMZN20240621C155 \n", - "3 2023-07-05 2024-03-05 244 &L:GOOG20240621C145 \n", - "4 2023-07-05 2024-07-01 362 &L:AMD20240621C155 \n", - "5 2023-08-01 2023-08-09 8 &L:QCOM20240621C160 \n", - "6 2023-08-03 2023-09-11 39 &L:BA20240621C290 \n", - "7 2023-09-12 2023-10-24 42 &L:INTC20240621C47 \n", - "8 2023-09-14 2023-10-27 43 &L:MU20240621C85 \n", - "9 2023-11-03 2024-02-16 105 &L:AAPL20240920C210 \n", - "10 2023-11-08 2024-07-01 236 &L:QCOM20250117C150 \n", - "11 2023-11-08 2023-12-05 27 &L:SBUX20250117C125 \n", - "12 2023-11-14 2024-07-01 230 &L:AMZN20240920C175 \n", - "13 2023-11-14 2024-03-15 122 &L:INTC20240920C47 \n", - "14 2023-12-04 2024-04-12 130 &L:HD20250117C390 \n", - "15 2023-12-07 2024-01-17 41 &L:BA20250117C320 \n", - "16 2023-12-14 2024-07-01 200 &L:BAC20250117C40 \n", - "17 2024-01-30 2024-07-01 153 &L:DIS20250117C115 \n", - "18 2024-02-12 2024-02-13 1 &L:SBUX20250117C115 \n", - "19 2024-03-14 2024-07-01 109 &L:GOOG20250321C170 \n", - "20 2024-05-13 2024-07-01 49 &L:AAPL20250620C220 " - ] - }, - "execution_count": 84, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.trades" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
SizeEntryBarExitBarEntryPriceExitPricePnLReturnPctEntryTimeExitTimeDurationTicker
027.0504.0568.0336.262811314.029999-600.285939-0.0661172023-07-052023-10-0491 daysMSFT
19.0504.0571.052.90452151.693333-10.900697-0.0228942023-07-052023-10-0996 daysWMT
237.0504.0584.0192.240502170.369995-809.208768-0.1137662023-07-052023-10-26113 daysAAPL
321.0504.0584.0130.695846120.629997-211.382813-0.0770172023-07-052023-10-26113 daysAMZN
442.0504.0585.0279.795877210.600006-2906.226592-0.2473082023-07-052023-10-27114 daysTSLA
533.0504.0672.0120.480208132.740005404.5733320.1017582023-07-052024-03-05244 daysGOOG
673.0504.0753.0116.506348161.2500003266.2865620.3840452023-07-052024-07-01362 daysAMD
764.0504.0753.087.043588160.8200074721.6908460.8475802023-07-052024-07-01362 daysAVGO
821.0504.0753.0463.717356911.7700209409.1059320.9662192023-07-052024-07-01362 daysLLY
9422.0504.0753.042.282471123.47000134261.1378311.9201232023-07-052024-07-01362 daysNVDA
108.0518.0560.0326.207752306.160004-160.381990-0.0614572023-07-252023-09-2259 daysHD
1114.0523.0529.0132.381718117.230003-212.124007-0.1144552023-08-012023-08-098 daysQCOM
126.0525.0551.0231.808500213.759995-108.291033-0.0778602023-08-032023-09-1139 daysBA
1313.0552.0582.038.78527733.639999-66.888603-0.1326612023-09-122023-10-2442 daysINTC
1426.0554.0585.071.92084364.919998-182.021970-0.0973412023-09-142023-10-2743 daysMU
1536.0590.0661.0174.849846183.419998308.5254960.0490142023-11-032024-02-16105 daysAAPL
1671.0593.0611.0104.10308897.379997-477.339433-0.0645812023-11-082023-12-0527 daysSBUX
1713.0593.0753.0121.824902199.4700011009.3862960.6373502023-11-082024-07-01236 daysQCOM
1824.0595.0753.0362.755205448.6600042061.7151630.2368122023-11-102024-07-01234 daysMSFT
1923.0595.0753.074.700542130.5000001283.3875240.7469752023-11-102024-07-01234 daysMU
2011.0597.0680.038.93579942.45000138.6562170.0902562023-11-142024-03-15122 daysINTC
2118.0597.0753.0145.507500193.490005863.6850990.3297602023-11-142024-07-01230 daysAMZN
2237.0599.0638.0240.328221215.100006-933.443933-0.1049742023-11-162024-01-1661 daysTSLA
237.0610.0699.0320.738665346.119995177.6693100.0791342023-12-042024-04-12130 daysHD
245.0613.0639.0237.729144202.630005-175.495695-0.1476432023-12-072024-01-1741 daysBA
25138.0618.0753.032.73416939.910000990.2646670.2192152023-12-142024-07-01200 daysBAC
269.0648.0753.055.09215267.889999115.1806310.2322992024-01-302024-07-01153 daysWMT
2731.0648.0753.096.85781799.40000278.8077320.0262472024-01-302024-07-01153 daysDIS
2871.0657.0658.097.25921894.849998-171.054598-0.0247712024-02-122024-02-131 daysSBUX
2930.0679.0753.0142.798053184.4799961250.4582800.2918942024-03-142024-07-01109 daysGOOG
3036.0720.0753.0186.089042212.089996936.0343400.1397232024-05-132024-07-0149 daysAAPL
\n", - "
" - ], - "text/plain": [ - " Size EntryBar ExitBar EntryPrice ExitPrice PnL ReturnPct \\\n", - "0 27.0 504.0 568.0 336.262811 314.029999 -600.285939 -0.066117 \n", - "1 9.0 504.0 571.0 52.904521 51.693333 -10.900697 -0.022894 \n", - "2 37.0 504.0 584.0 192.240502 170.369995 -809.208768 -0.113766 \n", - "3 21.0 504.0 584.0 130.695846 120.629997 -211.382813 -0.077017 \n", - "4 42.0 504.0 585.0 279.795877 210.600006 -2906.226592 -0.247308 \n", - "5 33.0 504.0 672.0 120.480208 132.740005 404.573332 0.101758 \n", - "6 73.0 504.0 753.0 116.506348 161.250000 3266.286562 0.384045 \n", - "7 64.0 504.0 753.0 87.043588 160.820007 4721.690846 0.847580 \n", - "8 21.0 504.0 753.0 463.717356 911.770020 9409.105932 0.966219 \n", - "9 422.0 504.0 753.0 42.282471 123.470001 34261.137831 1.920123 \n", - "10 8.0 518.0 560.0 326.207752 306.160004 -160.381990 -0.061457 \n", - "11 14.0 523.0 529.0 132.381718 117.230003 -212.124007 -0.114455 \n", - "12 6.0 525.0 551.0 231.808500 213.759995 -108.291033 -0.077860 \n", - "13 13.0 552.0 582.0 38.785277 33.639999 -66.888603 -0.132661 \n", - "14 26.0 554.0 585.0 71.920843 64.919998 -182.021970 -0.097341 \n", - "15 36.0 590.0 661.0 174.849846 183.419998 308.525496 0.049014 \n", - "16 71.0 593.0 611.0 104.103088 97.379997 -477.339433 -0.064581 \n", - "17 13.0 593.0 753.0 121.824902 199.470001 1009.386296 0.637350 \n", - "18 24.0 595.0 753.0 362.755205 448.660004 2061.715163 0.236812 \n", - "19 23.0 595.0 753.0 74.700542 130.500000 1283.387524 0.746975 \n", - "20 11.0 597.0 680.0 38.935799 42.450001 38.656217 0.090256 \n", - "21 18.0 597.0 753.0 145.507500 193.490005 863.685099 0.329760 \n", - "22 37.0 599.0 638.0 240.328221 215.100006 -933.443933 -0.104974 \n", - "23 7.0 610.0 699.0 320.738665 346.119995 177.669310 0.079134 \n", - "24 5.0 613.0 639.0 237.729144 202.630005 -175.495695 -0.147643 \n", - "25 138.0 618.0 753.0 32.734169 39.910000 990.264667 0.219215 \n", - "26 9.0 648.0 753.0 55.092152 67.889999 115.180631 0.232299 \n", - "27 31.0 648.0 753.0 96.857817 99.400002 78.807732 0.026247 \n", - "28 71.0 657.0 658.0 97.259218 94.849998 -171.054598 -0.024771 \n", - "29 30.0 679.0 753.0 142.798053 184.479996 1250.458280 0.291894 \n", - "30 36.0 720.0 753.0 186.089042 212.089996 936.034340 0.139723 \n", - "\n", - " EntryTime ExitTime Duration Ticker \n", - "0 2023-07-05 2023-10-04 91 days MSFT \n", - "1 2023-07-05 2023-10-09 96 days WMT \n", - "2 2023-07-05 2023-10-26 113 days AAPL \n", - "3 2023-07-05 2023-10-26 113 days AMZN \n", - "4 2023-07-05 2023-10-27 114 days TSLA \n", - "5 2023-07-05 2024-03-05 244 days GOOG \n", - "6 2023-07-05 2024-07-01 362 days AMD \n", - "7 2023-07-05 2024-07-01 362 days AVGO \n", - "8 2023-07-05 2024-07-01 362 days LLY \n", - "9 2023-07-05 2024-07-01 362 days NVDA \n", - "10 2023-07-25 2023-09-22 59 days HD \n", - "11 2023-08-01 2023-08-09 8 days QCOM \n", - "12 2023-08-03 2023-09-11 39 days BA \n", - "13 2023-09-12 2023-10-24 42 days INTC \n", - "14 2023-09-14 2023-10-27 43 days MU \n", - "15 2023-11-03 2024-02-16 105 days AAPL \n", - "16 2023-11-08 2023-12-05 27 days SBUX \n", - "17 2023-11-08 2024-07-01 236 days QCOM \n", - "18 2023-11-10 2024-07-01 234 days MSFT \n", - "19 2023-11-10 2024-07-01 234 days MU \n", - "20 2023-11-14 2024-03-15 122 days INTC \n", - "21 2023-11-14 2024-07-01 230 days AMZN \n", - "22 2023-11-16 2024-01-16 61 days TSLA \n", - "23 2023-12-04 2024-04-12 130 days HD \n", - "24 2023-12-07 2024-01-17 41 days BA \n", - "25 2023-12-14 2024-07-01 200 days BAC \n", - "26 2024-01-30 2024-07-01 153 days WMT \n", - "27 2024-01-30 2024-07-01 153 days DIS \n", - "28 2024-02-12 2024-02-13 1 days SBUX \n", - "29 2024-03-14 2024-07-01 109 days GOOG \n", - "30 2024-05-13 2024-07-01 49 days AAPL " - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "trades_" - ] - }, - { - "cell_type": "code", - "execution_count": 123, - "metadata": {}, - "outputs": [ - { - "ename": "KeyError", - "evalue": "'AAPL20240621C200'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[123], line 2\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mcopy\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m deepcopy\n\u001b[0;32m----> 2\u001b[0m test_data \u001b[38;5;241m=\u001b[39mdeepcopy(\u001b[43mevb_backtest\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mportfolio\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moptions_data\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mAAPL20240621C200\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m \u001b[38;5;241m-\u001b[39m evb_backtest\u001b[38;5;241m.\u001b[39mportfolio\u001b[38;5;241m.\u001b[39moptions_data[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mAAPL20240621C210\u001b[39m\u001b[38;5;124m'\u001b[39m])\n\u001b[1;32m 3\u001b[0m test_data[(test_data\u001b[38;5;241m.\u001b[39mindex \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m2023-07-05\u001b[39m\u001b[38;5;124m'\u001b[39m) \u001b[38;5;241m|\u001b[39m (test_data\u001b[38;5;241m.\u001b[39mindex \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m2023-10-26\u001b[39m\u001b[38;5;124m'\u001b[39m)]\n", - "\u001b[0;31mKeyError\u001b[0m: 'AAPL20240621C200'" - ] - } - ], - "source": [ - "from copy import deepcopy\n", - "test_data =deepcopy(evb_backtest.portfolio.options_data['AAPL20240621C200'] - evb_backtest.portfolio.options_data['AAPL20240621C210'])\n", - "test_data[(test_data.index == '2023-07-05') | (test_data.index == '2023-10-26')]" - ] - }, - { - "cell_type": "code", - "execution_count": 137, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'NVDA': 0.17403567829056413,\n", - " 'TSLA': 0.11550642768233775,\n", - " 'AMD': 0.0834286994973343,\n", - " 'LLY': 0.09757539849722477,\n", - " 'AAPL': 0.07043488643087037,\n", - " 'MSFT': 0.0908514723319269,\n", - " 'AVGO': 0.055093156449691004,\n", - " 'SBUX': 0.07221176940610122,\n", - " 'GOOG': 0.038799601494671494,\n", - " 'BAC': 0.04413788909693789,\n", - " 'AMZN': 0.027623397184346542,\n", - " 'MU': 0.018678439659805944,\n", - " 'QCOM': 0.018379279730883966,\n", - " 'DIS': 0.02993136919118428,\n", - " 'HD': 0.025585512620229425,\n", - " 'BA': 0.014360292506341181,\n", - " 'PFE': 0.013366729929548736,\n", - " 'INTC': 0.005000000000000001,\n", - " 'WMT': 0.005000000000000001}" - ] - }, - "execution_count": 137, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "weights" - ] - }, - { - "cell_type": "code", - "execution_count": 136, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
MSFTWMTAAPLAMZNTSLAGOOGAMDAVGOLLYNVDAHDQCOMBAINTCMUSBUXBACDISdatetimecashcommissiontotal
00.0000000.00.0000000.0000000.0000000.0000000.0000000.00.00.00.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000002023-07-05100000.0000000.000000100000.000000
19085.1472330.07043.4886432762.33971811550.6427683879.9601498342.8699500.00.00.00.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000002023-07-0599573.8525860.121451142238.301049
29303.1907670.07149.9393532656.09588310973.1106303520.1643468300.5203560.00.00.00.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000002023-07-0699573.8525860.121451141476.873921
39327.4178260.07008.0050732691.51049511290.7533063461.8190818406.3943400.00.00.00.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000002023-07-0799573.8525860.121451141759.752707
48140.2919210.06528.9768782578.18373710828.7275952654.7095768258.1707620.00.00.00.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000002023-07-1099573.8525860.121451138562.913056
58237.2001580.06369.3008132670.26172810713.2211682888.0906387940.5488100.00.00.00.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000002023-07-1199573.8525860.121451138392.475901
68503.6978100.06653.1693732755.25679610973.1106303374.3011838385.2195430.00.00.00.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000002023-07-1299573.8525860.121451140218.607922
79085.1472330.06812.8454382939.41277711435.1363413918.8569938660.4919020.00.00.00.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000002023-07-1399573.8525860.121451142425.743271
88745.9684030.06883.8125783010.24200111666.1491963675.7517218660.4919020.00.00.00.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000002023-07-1499573.8525860.121451142216.268387
99545.4613600.07504.7750532896.91524312590.2006174278.6527969020.4634480.00.00.00.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000002023-07-1799573.8525860.121451145410.321104
1010514.5437310.07433.8079132854.41770913283.2391833539.6127688872.2398700.00.00.00.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000002023-07-1899573.8525860.121451146071.713761
1110223.8190200.07682.1929033038.57369012272.5579413704.9243538660.4919020.00.00.00.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000002023-07-1999573.8525860.121451145156.412396
129787.7319530.07167.6811382719.8421849673.6633182849.1937947665.2764510.00.00.00.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000002023-07-2099573.8525860.121451139437.241425
139109.3742920.06866.0707932684.4275739731.4165323325.6801287771.1504350.00.00.00.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000002023-07-2199573.8525860.121451139061.972340
148818.6495810.07256.3900632620.68127110568.8381333559.0611907686.4512480.00.00.00.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000002023-07-2499573.8525860.121451140083.924073
158891.3307590.07345.0989882641.93003810222.3188504356.4464848088.7723880.00.00.00.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000002023-07-2599573.8525860.121451141119.750093
168479.4707510.07558.0004082592.34958210770.9743814336.9980627559.4024670.00.00.00.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000002023-07-2699573.8525860.121451140871.048238
177655.7507350.07380.5825582578.1837379500.4036774609.2759677728.8008420.00.00.00.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000002023-07-2799573.8525860.121451139026.850102
188285.6542770.07841.8689682783.58848510626.5913474735.6907097982.8984040.00.00.00.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000002023-07-2899573.8525860.121451141830.144776
197679.9777940.08001.5450332875.66647610742.0977744774.5875528109.9471850.00.00.00.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000002023-07-3199573.8525860.121451141757.674401
208334.1083950.07841.8689682726.9251079933.5527814716.2422878851.0650740.00.00.00.0000001830.0956910.0000000.0000000.0000000.0000000.0000000.0000002023-08-0199555.5622320.127270143789.420533
218261.4272170.07291.8736332549.8520489327.1440354541.2064917347.6544990.00.00.00.0000001725.8167340.0000000.0000000.0000000.0000000.0000000.0000002023-08-0299555.5622320.127270140600.536889
227316.5719050.07061.2304282585.2666609731.4165324385.6191168173.4715750.00.00.00.0000001188.7801071429.6469940.0000000.0000000.0000000.0000000.0000002023-08-0399541.2833830.131414141413.286700
237461.9342610.05127.3758643166.0662939269.3908224375.8949058596.9675120.00.00.00.0000001324.3427501459.3539450.0000000.0000000.0000000.0000000.0000002023-08-0499541.2833830.131414140322.609734
247340.7989640.04417.7044643293.5588959038.3779664259.2043758702.8414960.00.00.00.0000001204.4219501570.7550090.0000000.0000000.0000000.0000000.0000002023-08-0799541.2833830.131414139368.946502
257413.4801420.04651.8960263187.3150609182.7610014657.8970228215.8211690.00.00.00.0000001126.2127331581.8951160.0000000.0000000.0000000.0000000.0000002023-08-0899541.2833830.131414139558.561650
267074.3013120.04336.0922533095.2370698172.0797594550.9307027771.1504350.00.00.00.0000001126.1898931600.4619600.0000000.0000000.0000000.0000000.0000002023-08-0999552.5452820.137233137278.988664
277050.0742530.04240.2866143102.3199918691.8586834774.5875527749.9756390.00.00.00.0000000.0000001600.4619600.0000000.0000000.0000000.0000000.0000002023-08-1099552.5452820.137233136762.109974
286904.7118970.04211.8997583116.4858368143.2031524648.1728117220.6057180.00.00.00.0000000.0000001526.1945840.0000000.0000000.0000000.0000000.0000002023-08-1199552.5452820.137233135323.819037
297074.3013120.04343.1889673258.1442837912.1902964531.4822807834.6748260.00.00.00.0000000.0000001567.0416400.0000000.0000000.0000000.0000000.0000002023-08-1499552.5452820.137233136073.568887
306953.1660160.04087.7072633010.2420017248.0283374813.4843967898.1992160.00.00.00.0000000.0000001511.3411080.0000000.0000000.0000000.0000000.0000002023-08-1599552.5452820.137233135074.713619
317801.1130910.04006.0950522946.4957006497.2365574619.0001787072.3821400.00.00.00.0000000.0000001463.0673140.0000000.0000000.0000000.0000000.0000002023-08-1699552.5452820.137233133957.935313
326420.1707110.03615.7757822882.7493985890.8278124356.4464846670.0610000.00.00.00.0000000.0000001329.3860360.0000000.0000000.0000000.0000000.0000002023-08-1799552.5452820.137233130717.962506
337461.9342610.03626.4208532826.0860205688.6915634074.4443676860.6341720.00.00.00.0000000.0000001351.6662490.0000000.0000000.0000000.0000000.0000002023-08-1899552.5452820.137233131442.422767
347001.6201340.03796.7419892939.4127777103.6453024560.6549137347.6544990.00.00.00.0000000.0000001373.9464620.0000000.0000000.0000000.0000000.0000002023-08-2199552.5452820.137233133676.221359
357437.7072020.04073.5138352896.9152437392.4113724268.9285866881.8089690.00.00.00.0000000.0000001429.6469940.0000000.0000000.0000000.0000000.0000002023-08-2299552.5452820.137233133933.477482
367461.9342610.04744.1533082988.9932347681.1774414832.9328187580.5772640.00.00.00.0000000.0000001377.6598310.0000000.0000000.0000000.0000000.0000002023-08-2399552.5452820.137233136219.973438
377461.9342610.03988.3532672769.4226416988.1388754599.5517566204.2154700.00.00.00.0000000.0000001184.5646520.0000000.0000000.0000000.0000000.0000002023-08-2499552.5452820.137233132748.726204
386153.6730590.04314.8021112854.4177097825.5604754930.1749276225.3902670.00.00.00.0000000.0000001321.9592990.0000000.0000000.0000000.0000000.0000002023-08-2599552.5452820.137233133178.523129
397074.3013120.03952.8696972861.5006317738.9306554735.6907096288.9146580.00.00.00.0000000.0000001370.2330930.0000000.0000000.0000000.0000000.0000002023-08-2899552.5452820.137233133574.986037
407510.3883790.05233.8265742953.5786227623.4242275231.6254656902.9837660.00.00.00.0000000.0000001411.0801500.0000000.0000000.0000000.0000000.0000002023-08-2999552.5452820.137233136419.452464
416613.9871860.05837.0472632960.6615449587.0334985348.3159967008.8577500.00.00.00.0000000.0000001396.2266750.0000000.0000000.0000000.0000000.0000002023-08-3099552.5452820.137233138304.675193
427510.3883790.05819.3054783102.3199919587.0334985484.4549486733.5853910.00.00.00.0000000.0000001344.2395120.0000000.0000000.0000000.0000000.0000002023-08-3199552.5452820.137233139133.872479
439109.3742920.06085.4322533130.6516818374.2160075173.2801997474.7032800.00.00.00.0000000.0000001262.5453980.0000000.0000000.0000000.0000000.0000002023-09-0199552.5452820.137233140162.748392
448867.1037000.06191.8829633081.0712249442.6504636058.1833917686.4512480.00.00.00.0000000.0000001284.8256100.0000000.0000000.0000000.0000000.0000002023-09-0499552.5452820.137233142164.713882
458867.1037000.06191.8829633081.0712249442.6504636058.1833917686.4512480.00.00.00.0000000.0000001284.8256100.0000000.0000000.0000000.0000000.0000002023-09-0599552.5452820.137233142164.713882
467074.3013120.04910.9260872981.9103119038.3779664735.6907097538.2276700.00.00.00.0000000.0000001199.4181280.0000000.0000000.0000000.0000000.0000002023-09-0699552.5452820.137233137031.397465
477655.7507350.03906.7410563123.5687598980.6247525124.6591456987.6829530.00.00.00.0000000.0000001147.4309640.0000000.0000000.0000000.0000000.0000002023-09-0799552.5452820.137233136479.003646
487994.9295650.03974.1598393158.9833708691.8586835231.6254656966.5081560.00.00.00.0000000.0000001047.1700060.0000000.0000000.0000000.0000000.0000002023-09-0899552.5452820.137233136617.780366
499569.6884190.04105.4490483413.96857511088.6170585338.5917856818.2845780.00.00.00.0000000.0000001045.3555570.0000000.0000000.0000000.0000000.0000002023-09-1199562.9988380.141377140942.953857
507898.0213280.03491.5832873321.89058410539.9615264930.1749276733.5853910.00.00.00.0000000.0000000.000000497.8149940.0000000.0000000.0000000.0000002023-09-1299558.0264990.144884136971.058536
518649.0601660.03129.6508733399.80273010886.4808095873.4233847220.6057180.00.00.00.0000000.0000000.000000491.5294510.0000000.0000000.0000000.0000002023-09-1399558.0264990.144884139208.579631
528406.7895730.03449.0030033491.88072111377.3831275815.0781197030.0325460.00.00.00.0000000.0000000.000000487.1295711859.5885910.0000000.0000000.0000002023-09-1499539.4592570.153390141456.344508
537655.7507350.02696.7513193258.14428311204.1234856048.4591806013.6422990.00.00.00.0000000.0000000.000000439.3594461699.5420320.0000000.0000000.0000002023-09-1599539.4592570.153390138555.232037
547583.0695570.03665.4527803265.22720610337.8252785834.5265416204.2154700.00.00.00.0000000.0000000.000000434.9595661752.8908850.0000000.0000000.0000002023-09-1899539.4592570.153390138617.626539
557486.1613200.03906.7410563116.48583610482.2083125708.1117996034.8170960.00.00.00.0000000.0000000.000000358.2759431775.7546790.0000000.0000000.0000002023-09-1999539.4592570.153390138408.015298
566662.4413040.03342.5522932981.91031110135.6890294930.1749275823.0691270.00.00.00.0000000.0000000.000000274.0496691669.0569730.0000000.0000000.0000002023-09-2099539.4592570.153390135358.402891
576541.3060080.03111.9090882641.9300389471.5270704852.3812405060.7764420.00.00.00.0000000.0000000.000000277.8209941539.4954730.0000000.0000000.0000002023-09-2199539.4592570.153390133036.605610
585741.8130510.03218.3597982613.5983498403.0926144570.3791235039.6016450.00.00.00.0000000.0000000.000000256.4501491615.7081200.0000000.0000000.0000002023-09-2299539.4592570.153390130998.462106
596250.5812960.03452.5513602769.4226418691.8586834599.5517565314.8740040.00.00.00.0000000.0000000.000000257.7072571600.4655900.0000000.0000000.0000002023-09-2599539.4592570.153390132476.471845
605766.0401110.02537.0752542443.6082128316.4627934599.5517565060.7764420.00.00.00.0000000.0000000.000000245.1361711562.3592670.0000000.0000000.0000002023-09-2699539.4592570.153390130070.469264
615862.9483480.02643.5259642422.3594457912.1902964852.3812405463.0975810.00.00.00.0000000.0000000.000000280.9637661577.6017960.0000000.0000000.0000002023-09-2799539.4592570.153390130554.527694
625814.4942290.02618.6874652429.4423688489.7224354852.3812406310.0894540.00.00.00.0000000.0000000.000000299.8203941329.1485660.0000000.0000000.0000002023-09-2899539.4592570.153390131683.245409
635693.3589330.02331.2705482507.3545148951.7481454862.1054506267.7398610.00.00.00.0000000.0000000.000000316.7913601569.9805310.0000000.0000000.0000002023-09-2999539.4592570.153390132039.808600
646735.1224820.03026.7485202641.9300389009.5013595153.8317776098.3414860.00.00.00.0000000.0000000.000000313.6485891562.3592670.0000000.0000000.0000002023-10-0299539.4592570.153390134080.942776
655620.6777550.02948.6846662372.7789898547.4756484657.8970225865.4187210.00.00.00.0000000.0000000.000000332.5052171547.1167370.0000000.0000000.0000002023-10-0399539.4592570.153390131432.014013
665628.4422460.03087.0705892514.43743610020.1826015163.5559886606.5366100.00.00.00.0000000.0000000.000000335.0194341592.8443260.0000000.0000000.0000002023-10-0499595.7436800.180427134543.832911
670.0000000.03268.0367962450.6911359933.5527815114.9349346394.7886420.00.00.00.0000000.0000000.000000335.6479891653.8144430.0000000.0000000.0000002023-10-0599595.7436800.180427128747.210399
680.0000000.03587.3889262564.0178929962.4293885717.8360107199.4309210.00.00.00.0000000.0000000.000000344.4477491737.6483550.0000000.0000000.0000002023-10-0699595.7436800.180427130708.942920
690.0000000.03849.9673442606.5154279875.7995675853.9749627093.5569370.00.00.00.0000000.0000000.000000341.9335311684.2995020.0000000.0000000.0000002023-10-0999595.7436800.180427130901.790950
700.0000000.03647.7109952677.34465010251.1954575396.9370507517.0528730.00.00.00.0000000.0000000.000000350.7332911638.5719140.0000000.0000000.0000002023-10-1099595.7436800.180427131075.289910
710.0000000.03793.1936322833.16894210251.1954575601.1454797411.1788890.00.00.00.0000000.0000000.000000371.4755831745.2696200.0000000.0000000.0000002023-10-1199595.7436800.180427131602.371281
720.0000000.03956.4180542854.4177099818.0463535610.8696907495.8780770.00.00.00.0000000.0000000.000000369.5899201707.1632960.0000000.0000000.0000002023-10-1299595.7436800.180427131408.126778
730.0000000.03732.8715632684.4275739009.5013595445.5581056775.9349850.00.00.00.0000000.0000000.000000333.7623261676.6782370.0000000.0000000.0000002023-10-1399595.7436800.180427129254.477827
740.0000000.03537.7119282868.5835549269.3908225727.5602217072.3821400.00.00.00.0000000.0000000.000000357.6473891646.1931790.0000000.0000000.0000002023-10-1699595.7436800.180427130075.212911
750.0000000.03275.1335102804.8372539413.7738565776.1812756924.1585620.00.00.00.0000000.0000000.000000335.0194341646.1931790.0000000.0000000.0000002023-10-1799595.7436800.180427129771.040749
760.0000000.03143.8443012755.2567968085.4499385591.4212686246.5650640.00.00.00.0000000.0000000.000000319.9341311615.7081200.0000000.0000000.0000002023-10-1899595.7436800.180427127353.923298
770.0000000.03150.9410152606.5154275602.0617435571.9728466267.7398610.00.00.00.0000000.0000000.000000321.1912401516.6316780.0000000.0000000.0000002023-10-1999595.7436800.180427124632.797489
780.0000000.02753.5250312415.2765235371.0488875163.5559886204.2154700.00.00.00.0000000.0000000.000000289.1349711501.3891490.0000000.0000000.0000002023-10-2099595.7436800.180427123293.889700
790.0000000.02710.9447472528.6032814822.3933565192.7286215844.2439240.00.00.00.0000000.0000000.000000246.3932801457.1858140.0000000.0000000.0000002023-10-2399595.7436800.180427122398.236702
800.0000000.02679.0095342641.9300385168.9126395367.7644176119.5162830.00.00.00.0000000.0000000.000000246.4759711562.3592670.0000000.0000000.0000002023-10-2499598.2084390.183935123384.176589
810.0000000.02405.7860452188.6230084822.3933563860.5117285081.9512380.00.00.00.0000000.0000000.0000000.0000001438.8947780.0000000.0000000.0000002023-10-2599598.2084390.183935119396.368593
820.0000000.02406.6544562187.8736634215.9846103617.4064554658.4553020.00.00.00.0000000.0000000.0000000.0000001283.4209780.0000000.0000000.0000002023-10-2699644.1537210.211639118013.949185
830.0000000.00.0000000.0000004213.4603903607.6822445124.3008320.00.00.00.0000000.0000000.0000000.0000001282.9588430.0000000.0000000.0000002023-10-2799699.1179130.252371113927.520223
840.0000000.00.0000000.0000000.0000004191.1348985124.3008320.00.00.00.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000002023-10-3099699.1179130.252371109014.553643
850.0000000.00.0000000.0000000.0000003772.9938305378.3983940.00.00.00.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000002023-10-3199699.1179130.252371108850.510137
860.0000000.00.0000000.0000000.0000004268.9285867305.3049050.00.00.00.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000002023-11-0199699.1179130.252371111273.351404
870.0000000.00.0000000.0000000.0000004220.3075317262.9553120.00.00.00.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000002023-11-0299699.1179130.252371111182.380756
880.0000000.07022.2960470.0000000.0000004492.5854368131.1219810.00.00.00.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000002023-11-0399628.9642810.272211119274.967746
890.0000000.07448.9672000.0000000.0000004589.8275458046.4227940.00.00.00.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000002023-11-0699628.9642810.272211119714.181820
900.0000000.07822.3044580.0000000.0000004755.1391318300.5203560.00.00.00.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000002023-11-0799628.9642810.272211120506.928226
910.0000000.08124.5298570.0000000.0000004696.7938658448.7439340.00.00.00.0000001831.1086040.0000000.0000000.0000007194.3837950.0000000.0000002023-11-0899538.7681400.300176129834.328195
920.0000000.07893.4163170.0000000.0000004453.6885938448.7439340.00.00.00.0000001890.5251070.0000000.0000000.0000006781.5912820.0000000.0000002023-11-0999538.7681400.300176129006.733372
930.0000000.08480.0891510.0000000.0000005017.6928259443.9593850.00.00.00.0000002025.5626150.0000000.0000000.0000007351.6380850.0000000.0000002023-11-1099538.7681400.300176131857.710201
940.0000000.08248.9756100.0000000.0000005046.8654589062.8130420.00.00.00.0000002030.9641150.0000000.0000000.0000007233.6973670.0000000.0000002023-11-1399538.7681400.300176131162.083732
950.0000000.08657.8687982749.5989280.0000005173.2801999719.2317430.00.00.00.0000002203.8121250.000000497.6938410.0000007587.5195210.0000000.0000002023-11-1499506.3401290.311878136095.345284
960.0000000.08426.7552572605.2449840.0000005358.0402069232.2114160.00.00.00.0000002247.0241270.000000551.1471700.0000007725.1170260.0000000.0000002023-11-1599506.3401290.311878135651.880316
970.0000000.08960.0941972598.37098711493.6218805221.9012549676.8821500.00.00.00.0000002198.4106250.000000664.5549110.0000008019.9688200.0000000.0000002023-11-1699391.2989540.344025148225.103777
980.0000000.08977.8721622715.22894111320.7854615552.5244249740.4065400.00.00.00.0000002263.2286280.000000675.3900450.0000007646.4898800.0000000.0000002023-11-1799391.2989540.344025148283.225036
990.0000000.09173.4297732777.09491711781.6825795251.07388610121.5528830.00.00.00.0000002306.4406310.000000715.1188710.0000007292.6677260.0000000.0000002023-11-2099391.2989540.344025148810.360221
1000.0000000.09102.3179152653.36296512674.6707455708.1117999613.3577590.00.00.00.0000002187.6076240.000000671.7783340.0000007096.0998630.0000000.0000002023-11-2199391.2989540.344025149098.605958
1010.0000000.09173.4297732804.59090611580.0400905601.14547910290.9512580.00.00.00.0000002263.2286280.000000682.6134680.0000007430.2652310.0000000.0000002023-11-2299391.2989540.344025149217.563787
1020.0000000.09511.2111022790.84291111810.4886495474.73073710269.7764610.00.00.00.0000002387.4631350.000000682.6134680.0000006702.9641370.0000000.0000002023-11-2399391.2989540.344025149021.389554
1030.0000000.09511.2111022790.84291111810.4886495474.73073710269.7764610.00.00.00.0000002387.4631350.000000682.6134680.0000006702.9641370.0000000.0000002023-11-2499391.2989540.344025149021.389554
1040.0000000.09013.4280912845.83489011752.8765095455.28231510396.8252420.00.00.00.0000002166.0016230.000000686.2251790.0000006761.9344960.0000000.0000002023-11-2799391.2989540.344025148469.707299
1050.0000000.08711.2026922797.71690913481.2407015513.62758110290.9512580.00.00.00.0000002133.5926210.000000697.0603140.0000006368.7987690.0000000.0000002023-11-2899391.2989540.344025149385.489798
1060.0000000.08960.0941972756.47292512991.5375135367.76441710672.0976010.00.00.00.0000002268.6301290.000000722.3422940.0000006054.2901880.0000000.0000002023-11-2999391.2989540.344025149184.528218
1070.0000000.08551.2010102749.59892812300.1918374939.89913810058.0284930.00.00.00.0000002311.8421310.000000715.1188710.0000005739.7816070.0000000.0000002023-11-3099391.2989540.344025146756.960967
1080.0000000.09137.8738442790.84291112012.1311384774.58755210227.4268670.00.00.00.0000002333.4481320.000000668.1666220.0000005857.7223250.0000000.0000002023-12-0199391.2989540.344025147193.498346
1090.0000000.08924.5382682667.11096011493.6218804667.6212329507.4837750.00.00.02542.9773342403.6676360.000000613.2686080.0000005346.6458800.0000000.0000002023-12-0499365.8849250.353879147532.820499
1100.0000000.09368.9873852770.22092012012.1311384716.2422879465.1341820.00.00.03081.5940612376.6601350.000000582.2078890.0000005339.9571360.0000000.0000002023-12-0599419.2844970.375816149132.419628
1110.0000000.09244.5416322646.48896812069.7432784589.8275459105.1626350.00.00.02710.7431992360.4556340.000000561.9823050.0000000.0000000.0000000.0000002023-12-0699419.2844970.375816142708.229693
1120.0000000.09457.8772082770.22092012559.4464655299.69494111349.6910990.00.00.02648.9347232511.6976421427.690006607.4898690.0000000.0000000.0000000.0000002023-12-0799404.9805530.380111148037.723427
1130.0000000.09671.2127842797.71690912761.0889545124.65914511603.7886610.00.00.02684.2538522495.4931411647.038605621.2143730.0000000.0000000.0000000.0000002023-12-0899404.9805530.380111148811.446979
1140.0000000.09386.7653502722.10293812040.9372084794.03597412726.0528930.00.00.03143.4025382641.3336501766.333458697.0603140.0000000.0000000.0000000.0000002023-12-1199404.9805530.380111149323.004875
1150.0000000.09600.1009262735.85093311580.0400904657.89702213382.4715940.00.00.03063.9344962641.3336501747.092353693.4486020.0000000.0000000.0000000.0000002023-12-1299404.9805530.380111149507.150218
1160.0000000.09991.2161492873.33087911896.9068584628.72438913424.8211880.00.00.03311.1684032797.9771591804.815668700.6720250.0000000.0000000.0000000.0000002023-12-1399404.9805530.380111150834.613272
1170.0000000.010008.9941132797.71690913798.1074704716.24228713382.4715940.00.00.03611.3810052933.0146661958.744510715.1188710.0000000.0000004387.5260070.0000002023-12-1499361.1639480.418972157670.481381
1180.0000000.09706.7687142804.59090614028.5560294755.13913113721.2683440.00.00.03593.7214402922.2116662193.485993733.1774290.0000000.0000004143.7745630.0000002023-12-1599361.1639480.418972157963.858161
1190.0000000.09742.3246433134.54277713913.3317495202.45283213700.0935470.00.00.03302.3386212992.4311702101.128688765.6828320.0000000.0000004095.0242740.0000002023-12-1899361.1639480.418972158310.515081
1200.0000000.09884.5483603120.79478314777.5138465387.21283913869.4919220.00.00.03646.7001352922.2116662178.093109772.9062550.0000000.0000004129.8459090.0000002023-12-1999361.1639480.418972160050.482770
1210.0000000.09600.1009262907.70086613164.3739335562.24863513022.5000480.00.00.03390.6364452878.9996632058.798257801.7999470.0000000.0000003823.4155210.0000002023-12-2099361.1639480.418972156571.738188
1220.0000000.09528.9890673120.79478314345.4227985785.90548613784.7927340.00.00.03514.2533992808.7801592185.789551801.7999470.0000000.0000003969.6663880.0000002023-12-2199361.1639480.418972159207.358258
1230.0000000.09475.6551733107.04678814057.3620995912.32022813721.2683440.00.00.03417.1257923024.8401722089.584025845.1404840.0000000.0000004074.1312930.0000002023-12-2299361.1639480.418972159085.638345
1240.0000000.09351.2094203113.92078514691.0956365931.76865014420.0366390.00.00.03372.9768803084.2566752112.673351906.5395790.0000000.0000004394.4903340.0000002023-12-2599361.1639480.418972160740.131898
1250.0000000.09351.2094203113.92078514691.0956365931.76865014420.0366390.00.00.03372.9768803084.2566752112.673351906.5395790.0000000.0000004394.4903340.0000002023-12-2699361.1639480.418972160740.131898
1260.0000000.09422.3212793127.66878015497.6655935999.83812614885.8821690.00.00.03328.8279683035.6431722131.914457920.9864250.0000000.0000004276.0967750.0000002023-12-2799361.1639480.418972161988.008691
1270.0000000.09475.6551733107.04678814086.1681695941.49286015478.7764800.00.00.03620.2107883062.6506742035.708931906.5395790.0000000.0000004345.7400450.0000002023-12-2899361.1639480.418972161421.153435
1280.0000000.09208.9857033052.05481013366.0164225776.18127515224.6789180.00.00.03143.4025383068.0521742112.673351928.2098480.0000000.0000004164.6675430.0000002023-12-2999361.1639480.418972159406.086530
1290.0000000.08373.4213632942.07085313625.2710515688.66337713678.9187500.00.00.03302.3386212889.8026641793.271005823.4702150.0000000.0000004352.7043720.0000002024-01-0199361.1639480.418972156831.096218
1300.0000000.08373.4213632942.07085313625.2710515688.66337713678.9187500.00.00.03302.3386212889.8026641793.271005823.4702150.0000000.0000004352.7043720.0000002024-01-0299361.1639480.418972156831.096218
1310.0000000.08017.8620692852.70888711522.4279505678.93916612958.9756580.00.00.02852.0197182776.3711571704.761921762.0711200.0000000.0000004095.0242740.0000002024-01-0399361.1639480.418972152582.325869
1320.0000000.07697.8587052646.48896811493.6218805319.14336312831.9268770.00.00.03249.3599262722.3561541504.654427787.3531010.0000000.0000004283.0611020.0000002024-01-0499361.1639480.418972151896.988451
1330.0000000.07253.4095882673.98495711291.9793915319.14336313509.5203750.00.00.03046.2749312608.9246481716.306584765.6828320.0000000.0000004666.0990870.0000002024-01-0599361.1639480.418972152212.489704
1340.0000000.08373.4213632893.95287111752.8765095747.00864214907.0569660.00.00.03293.5088382727.7576551173.707417841.5287730.0000000.0000004478.0622580.0000002024-01-0899361.1639480.418972155550.045241
1350.0000000.08302.3095043024.55882010773.4701336038.73496915669.3496520.00.00.03116.9131902652.1366501112.135881827.0819270.0000000.0000004095.0242740.0000002024-01-0999361.1639480.418972154972.878948
1360.0000000.08444.5332223134.54277710571.8276446223.49497715076.4553410.00.00.03902.7638252846.5906611135.225207801.7999470.0000000.0000004039.3096580.0000002024-01-1099361.1639480.418972155537.707205
1370.0000000.08497.8671163278.8967219361.9727096145.70128915627.0000580.00.00.03911.5936072792.575658904.331945819.8585040.0000000.0000003718.9506160.0000002024-01-1199361.1639480.418972154419.912171
1380.0000000.08160.0857873182.6607598008.0874256194.32234414991.7561530.00.00.03787.9766532814.181660850.456850812.6350810.0000000.0000003391.6272470.0000002024-01-1299361.1639480.418972151554.953906
1390.0000000.08053.4179993107.0467888123.3117056622.18762416876.3130710.00.00.03761.4873062722.356154531.824148794.5765240.0000000.0000003008.5892620.0000002024-01-1599361.1639480.418972152962.274528
1400.0000000.08053.4179993107.0467888109.2135976622.18762416876.3130710.00.00.03761.4873062722.356154531.824148794.5765240.0000000.0000003008.5892620.0000002024-01-1699442.2560830.451120153029.268556
1410.0000000.07911.1942813024.5588200.0000006067.90760216601.0407120.00.00.03690.8490472765.568157530.991059754.8476970.0000000.0000002848.4097410.0000002024-01-1799447.5659940.455414143642.933112
1420.0000000.08817.8704802797.7169090.0000005912.32022816833.9634770.00.00.03885.1042603057.2491730.000000776.5179660.0000000.0000002667.3372390.0000002024-01-1899447.5659940.455414144195.645727
1430.0000000.09368.9873853045.1808120.0000006777.77499817744.4797410.00.00.04185.3168623397.5436930.000000744.0125630.0000000.0000002952.8746460.0000002024-01-1999447.5659940.455414147663.736694
1440.0000000.09688.9907493313.2667080.0000006641.63604517871.5285220.00.00.03787.9766533516.3766990.000000877.6458870.0000000.0000003106.0898400.0000002024-01-2299447.5659940.455414148251.077098
1450.0000000.09848.9924313251.4007320.0000006427.70340617680.9553500.00.00.03567.2320933289.5136870.000000783.7413890.0000000.0000003196.6260910.0000002024-01-2399447.5659940.455414147493.731173
1460.0000000.09688.9907493306.3927100.0000007040.32869217151.5854300.00.00.03708.5086123327.3241890.000000855.9756190.0000000.0000003308.0553230.0000002024-01-2499447.5659940.455414147834.727317
1470.0000000.09706.7687143333.8887000.0000007293.15817618379.7236460.00.00.03602.5512233343.5286900.000000819.8585040.0000000.0000003558.7710950.0000002024-01-2599447.5659940.455414149485.814740
1480.0000000.09368.9873853416.3766680.0000007351.50344117257.4594140.00.00.03743.8277413332.7256890.000000683.3358100.0000000.0000003593.5927300.0000002024-01-2699447.5659940.455414148195.374872
1490.0000000.09191.2077383512.6126300.0000007108.39816918104.4512870.00.00.03849.7851303235.4986830.000000684.0581530.0000000.0000003684.1289810.0000002024-01-2999447.5659940.455414148817.706765
1500.0000000.08586.7569393402.6286730.0000007157.01922317363.3333980.00.00.03840.9553483100.4611760.000000637.8282460.0000000.0000004617.3487982976.6018132024-01-3099417.8285010.463927151100.762114
1510.0000000.08106.7518933168.9127640.0000006009.56233718062.1016930.00.00.03885.1042603030.2416720.000000642.8846420.0000000.0000004067.1669662872.8555682024-01-3199417.8285010.463927149263.410295
1520.0000000.09280.0975613567.6046090.0000006135.97707818019.7521000.00.00.03717.3383942787.1741580.000000633.4941920.0000000.0000003802.5225402975.0761332024-02-0199417.8285010.463927150336.865266
1530.0000000.08391.1993283993.7924420.0000006038.73496918464.4228330.00.00.03664.3597002889.8026640.000000589.4313120.0000000.0000003795.5582133016.2694952024-02-0299417.8285010.463927150261.399456
1540.0000000.08693.4247273911.3044740.0000006340.18550718654.9960040.00.00.03708.5086123089.6581750.000000673.9453600.0000000.0000003321.9839772927.7800512024-02-0599417.8285010.463927150739.615389
1550.0000000.08906.7603033925.0524690.0000006593.01499117977.4025060.00.00.03682.0192643084.2566750.000000567.7610430.0000000.0000003384.6629203319.8798282024-02-0699417.8285010.463927150858.638501
1560.0000000.08960.0941973986.9184450.0000006612.46341318273.8496610.00.00.03991.0616493165.2791790.000000629.8824810.0000000.0000003475.1991713417.5233532024-02-0799417.8285010.463927151930.100050
1570.0000000.08835.6484453938.8004640.0000006933.36237218231.5000680.00.00.03946.9127373235.4986830.000000598.8217620.0000000.0000003440.3775365144.5931902024-02-0899417.8285010.463927153723.343757
1580.0000000.08942.3162334069.4064130.0000007108.39816918210.3252710.00.00.03911.5936073192.2866810.000000639.2729300.0000000.0000003384.6629204697.5689302024-02-0999417.8285010.463927153573.659654
1590.0000000.08693.4247274041.9104240.0000007263.98554318379.7236460.00.00.03920.4233893327.3241890.000000667.4442800.0000007179.1373073746.8079245002.7049432024-02-1299346.0264520.484109161568.912823
1600.0000000.08337.8654343870.0604910.0000006252.66760918104.4512870.00.00.03682.0192643262.5061850.000000634.9388770.0000007176.6284143238.4120535135.4391092024-02-1399417.7927360.504290159112.781459
1610.0000000.08231.1976464007.5404370.0000006836.12026318570.2968170.00.00.03717.3383943311.1196880.000000682.6134680.0000000.0000003447.3418635376.4965602024-02-1499417.7927360.504290153597.857872
1620.0000000.08693.4247273931.9264660.0000005941.49286018697.3455980.00.00.03717.3383943429.9526940.000000706.4507640.0000000.0000004067.1669665446.6778432024-02-1599417.7927360.504290154049.569049
1630.0000000.08692.6565313904.4304770.0000005960.94128218400.8984420.00.00.03496.5938343127.4686770.000000676.1123870.0000000.0000004108.9529285301.7382372024-02-1699504.7193010.524130153174.512097
1640.0000000.00.0000003801.3205170.0000005815.07811918506.7724270.00.00.03929.2531723246.3016840.000000697.0603140.0000000.0000004018.4166774944.7291012024-02-1999504.7193010.524130144463.651311
1650.0000000.00.0000003801.3205170.0000005815.07811918506.7724270.00.00.03929.2531723246.3016840.000000697.0603140.0000000.0000004018.4166774944.7291012024-02-2099504.7193010.524130144463.651311
1660.0000000.00.0000003883.8084850.0000005883.14759517426.8577880.00.00.03840.9553483483.9676980.000000707.1731060.0000000.0000003795.5582134616.7078862024-02-2199504.7193010.524130143142.895420
1670.0000000.00.0000004110.6503970.0000006699.98131118951.4431600.00.00.04114.6786023413.7481940.000000617.6026620.0000000.0000003705.0219624421.4208372024-02-2299504.7193010.524130145539.266426
1680.0000000.00.0000004158.7683780.0000006573.56656919036.1423470.00.00.04229.4657743176.0821800.000000561.2599630.0000000.0000003886.0944644540.4238832024-02-2399504.7193010.524130145666.522859
1690.0000000.00.0000004145.0203830.0000005455.28231518697.3455980.00.00.04176.4870793467.7631970.000000593.7653660.0000000.0000003663.2360004602.9767662024-02-2699504.7193010.524130144306.596005
1700.0000000.00.0000004131.2723890.0000006155.42550019120.8415350.00.00.04308.9338153694.6262090.000000564.8716740.0000000.0000004122.8815824938.6263812024-02-2799504.7193010.524130146542.198386
1710.0000000.00.0000004117.5243940.0000005581.69705718845.5691760.00.00.04459.0401163278.7106860.000000564.1493320.0000000.0000004143.7745635423.7926422024-02-2899504.7193010.524130145918.977267
1720.0000000.00.0000004213.7603570.0000005824.80233020666.6017030.00.00.04273.6146863662.2172080.000000572.0950970.0000000.0000004457.1692775289.5327962024-02-2999504.7193010.524130148464.512755
1730.0000000.00.0000004275.6263320.0000005212.17704320137.2317820.00.00.04653.2953293651.4142070.000000615.4356350.0000000.0000004387.5260075368.8681602024-03-0199504.7193010.524130147806.293797
1740.0000000.00.0000004234.3823480.0000004580.10333420073.7073920.00.00.04538.5081583743.2397120.000000729.5657170.0000000.0000004930.7435135660.2730532024-03-0499504.7193010.524130147995.242529
1750.0000000.00.0000004096.9024020.0000004583.87421920116.0569850.00.00.04485.5294643559.5887020.000000639.2729300.0000000.0000005118.7803425477.1914452024-03-0599550.5580440.534982147627.754532
1760.0000000.00.0000004096.9024020.0000000.00000019692.5610490.00.00.04308.9338153856.6712190.000000621.2143730.0000000.0000005132.7089964944.7291012024-03-0699550.5580440.534982142204.278998
1770.0000000.00.0000004179.3903700.0000000.00000019798.4350330.00.00.04635.6357654051.1252300.000000754.8476970.0000000.0000005299.8528444979.8197422024-03-0799550.5580440.534982143249.664724
1780.0000000.00.0000004179.3903700.0000000.00000020243.1057660.00.00.04467.8698993856.6712190.000000613.9909500.0000000.0000005237.1739015100.3484682024-03-0899550.5580440.534982143249.108616
1790.0000000.00.0000004041.9104240.0000000.00000019734.9106430.00.00.04335.4231633878.2772200.000000621.2143730.0000000.0000005480.9253465388.7020012024-03-1199550.5580440.534982143031.921212
1800.0000000.00.0000004186.2643670.0000000.00000019840.7846270.00.00.04388.4018574061.9282300.000000567.0387010.0000000.0000005508.7826545431.4210432024-03-1299550.5580440.534982143535.179522
1810.0000000.00.0000004248.1303430.0000000.00000019798.4350330.00.00.04573.8272883748.6412130.000000564.1493320.0000000.0000005613.2475595416.1642422024-03-1399550.5580440.534982143513.153052
1820.0000000.00.0000004330.6183110.0000000.00000019459.6382840.00.00.04644.4655473651.4142070.000000585.0972580.0000000.0000005313.7814985356.6627192024-03-1499550.5580440.534982142892.235868
1830.0000000.00.0000004165.6423750.0000000.00000019586.6870650.00.00.04273.6146863818.8607170.000000584.3472440.0000000.0000005118.7803425423.7926422024-03-1599556.4015160.539013142528.126587
1840.0000000.00.0000004200.0123620.0000000.00000019798.4350330.00.00.04194.1466443808.0577160.0000000.0000000.0000000.0000005536.6399625721.3002562024-03-1899556.4015160.539013142814.993488
1850.0000000.00.0000004392.4842870.0000000.00000019036.1423470.00.00.04874.0398903613.6037050.0000000.0000000.0000000.0000005515.7469815782.3274582024-03-1999556.4015160.539013142770.746184
1860.0000000.00.0000004316.8703160.0000000.00000019226.7155190.00.00.04476.6996813770.2472140.0000000.0000000.0000000.0000006079.8574676140.8622742024-03-2099556.4015160.539013143567.653988
1870.0000000.00.0000004364.9882980.0000000.00000019057.3171440.00.00.05006.4866264029.5192280.0000000.0000000.0000000.0000006678.7895895995.9226682024-03-2199556.4015160.539013144689.425069
1880.0000000.00.0000004330.6183110.0000000.00000019226.7155190.00.00.04962.3377143916.0877220.0000000.0000000.0000000.0000006302.7159315995.9226682024-03-2299556.4015160.539013144290.799380
1890.0000000.00.0000004337.4923080.0000000.00000019290.2399090.00.00.04803.4016303651.4142070.0000000.0000000.0000000.0000006149.5007376598.5662952024-03-2599556.4015160.539013144387.016603
1900.0000000.00.0000004316.8703160.0000000.00000019607.8618620.00.00.04838.7207603743.2397120.0000000.0000000.0000000.0000006365.3948746774.0195032024-03-2699556.4015160.539013145202.508543
1910.0000000.00.0000004433.7282710.0000000.00000019290.2399090.00.00.04688.6144593932.2922230.0000000.0000000.0000000.0000006901.6480536880.8171072024-03-2799556.4015160.539013145683.741538
1920.0000000.00.0000004440.6022680.0000000.00000019861.9594230.00.00.04617.9762003970.1027250.0000000.0000000.0000000.0000006992.1843046995.2431122024-03-2899556.4015160.539013146434.469549
1930.0000000.00.0000004440.6022680.0000000.00000019861.9594230.00.00.04617.9762003970.1027250.0000000.0000000.0000000.0000006992.1843046995.2431122024-03-2999556.4015160.539013146434.469549
1940.0000000.00.0000004468.0982570.0000000.00000019459.6382840.00.00.04211.8062094094.3372320.0000000.0000000.0000000.0000006741.4685326926.5875092024-04-0199556.4015160.539013145458.337540
1950.0000000.00.0000004433.7282710.0000000.00000020073.7073920.00.00.03682.0192644051.1252300.0000000.0000000.0000000.0000006511.6457417025.7567142024-04-0299556.4015160.539013145334.384128
1960.0000000.00.0000004509.3422410.0000000.00000019438.4634870.00.00.03840.9553484115.9432330.0000000.0000000.0000000.0000006769.3258406468.8834892024-04-0399556.4015160.539013144699.315154
1970.0000000.00.0000004406.2322810.0000000.00000018718.5203950.00.00.03576.0618763764.8457130.0000000.0000000.0000000.0000006219.1440076110.3486732024-04-0499556.4015160.539013142351.554461
1980.0000000.00.0000004564.3342200.0000000.00000019078.4919410.00.00.03655.5299173980.9057260.0000000.0000000.0000000.0000006365.3948746354.4574842024-04-0599556.4015160.539013143555.515678
1990.0000000.00.0000004591.8302090.0000000.00000019269.0651120.00.00.04088.1892554029.5192280.0000000.0000000.0000000.0000006650.9322816201.8894772024-04-0899556.4015160.539013144387.827079
2000.0000000.00.0000004612.4522010.0000000.00000019501.9878770.00.00.04079.3594734040.3222290.0000000.0000000.0000000.0000006783.2544946301.0586812024-04-0999556.4015160.539013144874.836472
2010.0000000.00.0000004612.4522010.0000000.00000019353.7643000.00.00.03390.6364454061.9282300.0000000.0000000.0000000.0000006017.1785246072.2066712024-04-1099556.4015160.539013143064.567888
2020.0000000.00.0000004667.4441800.0000000.00000019607.8618620.00.00.03505.4236164180.7612370.0000000.0000000.0000000.0000005634.1405406102.7202732024-04-1199556.4015160.539013143254.753223
2030.0000000.00.0000004619.3261980.0000000.00000018845.5691760.00.00.03502.1502253959.2997240.0000000.0000000.0000000.0000005334.6744795744.1854572024-04-1299591.4230180.548867141596.628277
2040.0000000.00.0000004516.2162390.0000000.00000019057.3171440.00.00.00.0000003943.0952240.0000000.0000000.0000000.0000005418.2464035422.2669622024-04-1599591.4230180.548867137948.564989
2050.0000000.00.0000004550.5862250.0000000.00000018993.7927540.00.00.00.0000003797.2547150.0000000.0000000.0000000.0000004422.3476425591.6174502024-04-1699591.4230180.548867136947.021804
2060.0000000.00.0000004248.1303430.0000000.00000017871.5285220.00.00.00.0000003818.8607170.0000000.0000000.0000000.0000004798.4213005432.9467232024-04-1799591.4230180.548867135761.310622
2070.0000000.00.0000004371.8622950.0000000.00000018019.7521000.00.00.00.0000003683.8232090.0000000.0000000.0000000.0000005153.6019775361.2397592024-04-1899591.4230180.548867136181.702358
2080.0000000.00.0000004206.8863590.0000000.00000016558.6911190.00.00.00.0000003602.8007040.0000000.0000000.0000000.0000006170.3937185288.0071162024-04-1999591.4230180.548867135418.202035
2090.0000000.00.0000004309.9963190.0000000.00000016770.4390870.00.00.00.0000003500.1721980.0000000.0000000.0000000.0000006783.2544945190.3635922024-04-2299591.4230180.548867136145.648708
2100.0000000.00.0000004433.7282710.0000000.00000018040.9268960.00.00.00.0000003678.4217090.0000000.0000000.0000000.0000007291.6503655522.9618472024-04-2399591.4230180.548867138559.112105
2110.0000000.00.0000004296.2483240.0000000.00000018019.7521000.00.00.00.0000003710.8307100.0000000.0000000.0000000.0000007270.7573845561.1038482024-04-2499591.4230180.548867138450.115385
2120.0000000.00.0000004151.8943810.0000000.00000018083.2764900.00.00.00.0000003770.2472140.0000000.0000000.0000000.0000006950.3983425321.5720782024-04-2599591.4230180.548867137868.811522
2130.0000000.00.0000004488.7202490.0000000.00000018591.4716140.00.00.00.0000003824.2622170.0000000.0000000.0000000.0000006811.1118025320.0463982024-04-2699591.4230180.548867138627.035298
2140.0000000.00.0000004406.2322810.0000000.00000019099.6667380.00.00.00.0000003964.7012250.0000000.0000000.0000000.0000006518.6100685185.7865522024-04-2999591.4230180.548867138766.419882
2150.0000000.00.0000004289.3743270.0000000.00000018782.0447850.00.00.00.0000003808.0577160.0000000.0000000.0000000.0000006086.8217945040.8469452024-04-3099591.4230180.548867137598.568586
2160.0000000.00.0000004488.7202490.0000000.00000017469.2073820.00.00.00.0000003845.8682180.0000000.0000000.0000000.0000006038.0715054920.3182202024-05-0199591.4230180.548867136353.608593
2170.0000000.00.0000004626.2001960.0000000.00000018040.9268960.00.00.00.0000004277.9882430.0000000.0000000.0000000.0000005898.7849655297.1611972024-05-0299591.4230180.548867137732.484515
2180.0000000.00.0000004729.3101550.0000000.00000018464.4228330.00.00.00.0000004332.0032460.0000000.0000000.0000000.0000006149.5007375504.6536862024-05-0399591.4230180.548867138771.313675
2190.0000000.00.0000004798.0501290.0000000.00000019586.6870650.00.00.00.0000004413.0257500.0000000.0000000.0000000.0000006247.0013155797.5842592024-05-0699591.4230180.548867140433.771536
2200.0000000.00.0000004722.4361580.0000000.00000019798.4350330.00.00.00.0000004364.4122470.0000000.0000000.0000000.0000006678.7895893840.1367312024-05-0799591.4230180.548867138995.632777
2210.0000000.00.0000004811.7981230.0000000.00000019671.3862520.00.00.00.0000004396.8212490.0000000.0000000.0000000.0000006525.5743953885.9071342024-05-0899591.4230180.548867138882.910172
2220.0000000.00.0000004859.9161040.0000000.00000019396.1138930.00.00.00.0000004369.8137480.0000000.0000000.0000000.0000007020.0416123898.1125742024-05-0999591.4230180.548867139135.420950
2230.0000000.00.0000004866.7901020.0000000.00000019184.3659250.00.00.00.0000004450.8362520.0000000.0000000.0000000.0000007166.2924793835.5596912024-05-1099591.4230180.548867139095.267467
2240.0000000.07014.7105704804.9241260.0000000.00000019565.5122680.00.00.00.0000004353.6092470.0000000.0000000.0000000.0000007033.9702663887.4328142024-05-1399521.1392700.568787146181.298560
2250.0000000.07068.2579794825.5461180.0000000.00000019946.6586110.00.00.00.0000004558.8662580.0000000.0000000.0000000.0000007215.0427683757.7500082024-05-1499521.1392700.568787146893.261012
2260.0000000.07371.6932964880.5380960.0000000.00000020497.2033280.00.00.00.0000004693.9037660.0000000.0000000.0000000.0000007563.2591173243.5958252024-05-1599521.1392700.568787147771.332699
2270.0000000.07407.3915694784.3021340.0000000.00000020666.6017030.00.00.00.0000004666.8962650.0000000.0000000.0000000.0000007869.6895053354.9704702024-05-1699521.1392700.568787148270.990915
2280.0000000.07460.9389784866.7901020.0000000.00000020666.6017030.00.00.00.0000004699.3052660.0000000.0000000.0000000.0000007876.6538323364.1245502024-05-1799521.1392700.568787148455.553701
2290.0000000.07496.6372504839.2941130.0000000.00000020730.1260930.00.00.00.0000004747.9187690.0000000.0000000.0000000.0000007437.9012323239.0187852024-05-2099521.1392700.568787148012.035512
2300.0000000.07728.6760224825.5461180.0000000.00000020793.6504840.00.00.00.0000004742.5172690.0000000.0000000.0000000.0000008197.0128743162.7347812024-05-2199521.1392700.568787148971.276818
2310.0000000.07782.2234314798.0501290.0000000.00000020878.3496710.00.00.00.0000004774.9262710.0000000.0000000.0000000.0000008162.1912393275.6351062024-05-2299521.1392700.568787149192.515117
2320.0000000.07032.5597064777.4281370.0000000.00000020687.7765000.00.00.00.0000004785.7292710.0000000.0000000.0000000.0000007730.4029652769.1093242024-05-2399521.1392700.568787147304.145173
2330.0000000.07460.9389784653.6961850.0000000.00000020899.5244680.00.00.00.0000004845.1457750.0000000.0000000.0000000.0000007827.9035432993.3842942024-05-2499521.1392700.568787148201.732512
2340.0000000.07532.3355234804.9241260.0000000.00000020963.0488580.00.00.00.0000004823.5397730.0000000.0000000.0000000.0000007813.9748893162.7347812024-05-2799521.1392700.568787148621.697221
2350.0000000.07532.3355234804.9241260.0000000.00000020963.0488580.00.00.00.0000004823.5397730.0000000.0000000.0000000.0000007813.9748893162.7347812024-05-2899521.1392700.568787148621.697221
2360.0000000.07514.4863864763.6801420.0000000.00000020878.3496710.00.00.00.0000004769.5247700.0000000.0000000.0000000.0000007291.6503652871.3298882024-05-2999521.1392700.568787147610.160493
2370.0000000.07657.2794774619.3261980.0000000.00000020984.2236550.00.00.00.0000004720.9112680.0000000.0000000.0000000.0000007180.2211332973.5504532024-05-3099521.1392700.568787147656.651454
2380.0000000.07764.3742954598.7042060.0000000.00000021280.6708110.00.00.00.0000004818.1382730.0000000.0000000.0000000.0000008482.5502813362.5988702024-05-3199521.1392700.568787149828.176007
2390.0000000.07889.3182494708.6881630.0000000.00000021090.0976390.00.00.00.0000004823.5397730.0000000.0000000.0000000.0000008287.5491253156.6320612024-06-0399521.1392700.568787149476.964282
2400.0000000.08174.9044304715.5621610.0000000.00000020899.5244680.00.00.00.0000004785.7292710.0000000.0000000.0000000.0000008169.1555663245.1215052024-06-0499521.1392700.568787149511.136671
2410.0000000.08032.1113394798.0501290.0000000.00000021068.9228430.00.00.00.0000004877.5547770.0000000.0000000.0000000.0000008433.7999922906.4205302024-06-0599521.1392700.568787149637.998879
2420.0000000.07907.1673854901.1600880.0000000.00000021005.3984520.00.00.00.0000004855.9487750.0000000.0000000.0000000.0000008162.1912392839.2906072024-06-0699521.1392700.568787149192.295817
2430.0000000.08264.1501114928.6560780.0000000.00000021090.0976390.00.00.00.0000004861.3502760.0000000.0000000.0000000.0000008461.6573002906.4205302024-06-0799521.1392700.568787150033.471204
2440.0000000.07710.8268865018.0180430.0000000.00000021132.4472330.00.00.00.0000004866.7517760.0000000.0000000.0000000.0000008315.4064333130.6955002024-06-1099521.1392700.568787149695.285141
2450.0000000.09513.5896535011.1440450.0000000.00000021047.7480460.00.00.00.0000004845.1457750.0000000.0000000.0000000.0000007584.1520982836.2392472024-06-1199521.1392700.568787150359.158135
2460.0000000.09317.2491544976.7740590.0000000.00000021386.5447950.00.00.00.0000004915.3652790.0000000.0000000.0000000.0000008106.4766232775.2120442024-06-1299521.1392700.568787150998.761224
2470.0000000.09799.1758344921.7820800.0000000.00000021090.0976390.00.00.00.0000004936.9712800.0000000.0000000.0000000.0000007862.7251782648.5805982024-06-1399521.1392700.568787150780.471881
2480.0000000.09656.3827444908.0340860.0000000.00000021111.2724360.00.00.00.0000004926.1682790.0000000.0000000.0000000.0000007897.5468132630.2724372024-06-1499521.1392700.568787150650.816066
2490.0000000.09888.4215164880.5380960.0000000.00000021132.4472330.00.00.00.0000004839.7442740.0000000.0000000.0000000.0000008162.1912392901.8434902024-06-1799521.1392700.568787151326.325119
2500.0000000.09424.3439725018.0180430.0000000.00000021323.0204050.00.00.00.0000005093.6147890.0000000.0000000.0000000.0000008580.0508592860.6501282024-06-1899521.1392700.568787151820.837465
2510.0000000.09245.8526094983.6480560.0000000.00000021174.7968270.00.00.00.0000004909.9637780.0000000.0000000.0000000.0000008621.8368213199.3511032024-06-1999521.1392700.568787151656.588464
2520.0000000.09245.8526094983.6480560.0000000.00000021174.7968270.00.00.00.0000004909.9637780.0000000.0000000.0000000.0000008621.8368213199.3511032024-06-2099521.1392700.568787151656.588464
2530.0000000.09174.4560635011.1440450.0000000.00000021280.6708110.00.00.00.0000004850.5472750.0000000.0000000.0000000.0000008078.6193152964.3963722024-06-2199521.1392700.568787150880.973152
2540.0000000.08585.4345654976.7740590.0000000.00000021280.6708110.00.00.00.0000004618.2827620.0000000.0000000.0000000.0000008552.1935512921.6773302024-06-2499521.1392700.568787150456.172348
2550.0000000.09299.4000175004.2700480.0000000.00000021280.6708110.00.00.00.0000004693.9037660.0000000.0000000.0000000.0000008029.8690262943.0368512024-06-2599521.1392700.568787150772.289791
2560.0000000.09638.5336075100.5060110.0000000.00000021280.6708110.00.00.00.0000004683.1007660.0000000.0000000.0000000.0000007667.7240222941.5111712024-06-2699521.1392700.568787150833.185658
2570.0000000.09727.7792895231.1119600.0000000.00000021280.6708110.00.00.00.0000004715.5097670.0000000.0000000.0000000.0000007807.0105622935.4084512024-06-2799521.1392700.568787151218.630111
2580.0000000.09727.7792895244.8599540.0000000.00000021280.6708110.00.00.00.0000004812.7367730.0000000.0000000.0000000.0000007800.0462352445.6651492024-06-2899521.1392700.568787150832.897482
2590.0000000.09728.6646705255.2999430.0000000.00000021275.4319980.00.00.00.0000004808.5206450.0000000.0000000.0000000.0000007801.3335212444.4628452024-07-01100034.2764070.673411151347.990030
\n", - "
" - ], - "text/plain": [ - " MSFT WMT AAPL AMZN TSLA GOOG \\\n", - "0 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 \n", - "1 9085.147233 0.0 7043.488643 2762.339718 11550.642768 3879.960149 \n", - "2 9303.190767 0.0 7149.939353 2656.095883 10973.110630 3520.164346 \n", - "3 9327.417826 0.0 7008.005073 2691.510495 11290.753306 3461.819081 \n", - "4 8140.291921 0.0 6528.976878 2578.183737 10828.727595 2654.709576 \n", - "5 8237.200158 0.0 6369.300813 2670.261728 10713.221168 2888.090638 \n", - "6 8503.697810 0.0 6653.169373 2755.256796 10973.110630 3374.301183 \n", - "7 9085.147233 0.0 6812.845438 2939.412777 11435.136341 3918.856993 \n", - "8 8745.968403 0.0 6883.812578 3010.242001 11666.149196 3675.751721 \n", - "9 9545.461360 0.0 7504.775053 2896.915243 12590.200617 4278.652796 \n", - "10 10514.543731 0.0 7433.807913 2854.417709 13283.239183 3539.612768 \n", - "11 10223.819020 0.0 7682.192903 3038.573690 12272.557941 3704.924353 \n", - "12 9787.731953 0.0 7167.681138 2719.842184 9673.663318 2849.193794 \n", - "13 9109.374292 0.0 6866.070793 2684.427573 9731.416532 3325.680128 \n", - "14 8818.649581 0.0 7256.390063 2620.681271 10568.838133 3559.061190 \n", - "15 8891.330759 0.0 7345.098988 2641.930038 10222.318850 4356.446484 \n", - "16 8479.470751 0.0 7558.000408 2592.349582 10770.974381 4336.998062 \n", - "17 7655.750735 0.0 7380.582558 2578.183737 9500.403677 4609.275967 \n", - "18 8285.654277 0.0 7841.868968 2783.588485 10626.591347 4735.690709 \n", - "19 7679.977794 0.0 8001.545033 2875.666476 10742.097774 4774.587552 \n", - "20 8334.108395 0.0 7841.868968 2726.925107 9933.552781 4716.242287 \n", - "21 8261.427217 0.0 7291.873633 2549.852048 9327.144035 4541.206491 \n", - "22 7316.571905 0.0 7061.230428 2585.266660 9731.416532 4385.619116 \n", - "23 7461.934261 0.0 5127.375864 3166.066293 9269.390822 4375.894905 \n", - "24 7340.798964 0.0 4417.704464 3293.558895 9038.377966 4259.204375 \n", - "25 7413.480142 0.0 4651.896026 3187.315060 9182.761001 4657.897022 \n", - "26 7074.301312 0.0 4336.092253 3095.237069 8172.079759 4550.930702 \n", - "27 7050.074253 0.0 4240.286614 3102.319991 8691.858683 4774.587552 \n", - "28 6904.711897 0.0 4211.899758 3116.485836 8143.203152 4648.172811 \n", - "29 7074.301312 0.0 4343.188967 3258.144283 7912.190296 4531.482280 \n", - "30 6953.166016 0.0 4087.707263 3010.242001 7248.028337 4813.484396 \n", - "31 7801.113091 0.0 4006.095052 2946.495700 6497.236557 4619.000178 \n", - "32 6420.170711 0.0 3615.775782 2882.749398 5890.827812 4356.446484 \n", - "33 7461.934261 0.0 3626.420853 2826.086020 5688.691563 4074.444367 \n", - "34 7001.620134 0.0 3796.741989 2939.412777 7103.645302 4560.654913 \n", - "35 7437.707202 0.0 4073.513835 2896.915243 7392.411372 4268.928586 \n", - "36 7461.934261 0.0 4744.153308 2988.993234 7681.177441 4832.932818 \n", - "37 7461.934261 0.0 3988.353267 2769.422641 6988.138875 4599.551756 \n", - "38 6153.673059 0.0 4314.802111 2854.417709 7825.560475 4930.174927 \n", - "39 7074.301312 0.0 3952.869697 2861.500631 7738.930655 4735.690709 \n", - "40 7510.388379 0.0 5233.826574 2953.578622 7623.424227 5231.625465 \n", - "41 6613.987186 0.0 5837.047263 2960.661544 9587.033498 5348.315996 \n", - "42 7510.388379 0.0 5819.305478 3102.319991 9587.033498 5484.454948 \n", - "43 9109.374292 0.0 6085.432253 3130.651681 8374.216007 5173.280199 \n", - "44 8867.103700 0.0 6191.882963 3081.071224 9442.650463 6058.183391 \n", - "45 8867.103700 0.0 6191.882963 3081.071224 9442.650463 6058.183391 \n", - "46 7074.301312 0.0 4910.926087 2981.910311 9038.377966 4735.690709 \n", - "47 7655.750735 0.0 3906.741056 3123.568759 8980.624752 5124.659145 \n", - "48 7994.929565 0.0 3974.159839 3158.983370 8691.858683 5231.625465 \n", - "49 9569.688419 0.0 4105.449048 3413.968575 11088.617058 5338.591785 \n", - "50 7898.021328 0.0 3491.583287 3321.890584 10539.961526 4930.174927 \n", - "51 8649.060166 0.0 3129.650873 3399.802730 10886.480809 5873.423384 \n", - "52 8406.789573 0.0 3449.003003 3491.880721 11377.383127 5815.078119 \n", - "53 7655.750735 0.0 2696.751319 3258.144283 11204.123485 6048.459180 \n", - "54 7583.069557 0.0 3665.452780 3265.227206 10337.825278 5834.526541 \n", - "55 7486.161320 0.0 3906.741056 3116.485836 10482.208312 5708.111799 \n", - "56 6662.441304 0.0 3342.552293 2981.910311 10135.689029 4930.174927 \n", - "57 6541.306008 0.0 3111.909088 2641.930038 9471.527070 4852.381240 \n", - "58 5741.813051 0.0 3218.359798 2613.598349 8403.092614 4570.379123 \n", - "59 6250.581296 0.0 3452.551360 2769.422641 8691.858683 4599.551756 \n", - "60 5766.040111 0.0 2537.075254 2443.608212 8316.462793 4599.551756 \n", - "61 5862.948348 0.0 2643.525964 2422.359445 7912.190296 4852.381240 \n", - "62 5814.494229 0.0 2618.687465 2429.442368 8489.722435 4852.381240 \n", - "63 5693.358933 0.0 2331.270548 2507.354514 8951.748145 4862.105450 \n", - "64 6735.122482 0.0 3026.748520 2641.930038 9009.501359 5153.831777 \n", - "65 5620.677755 0.0 2948.684666 2372.778989 8547.475648 4657.897022 \n", - "66 5628.442246 0.0 3087.070589 2514.437436 10020.182601 5163.555988 \n", - "67 0.000000 0.0 3268.036796 2450.691135 9933.552781 5114.934934 \n", - "68 0.000000 0.0 3587.388926 2564.017892 9962.429388 5717.836010 \n", - "69 0.000000 0.0 3849.967344 2606.515427 9875.799567 5853.974962 \n", - "70 0.000000 0.0 3647.710995 2677.344650 10251.195457 5396.937050 \n", - "71 0.000000 0.0 3793.193632 2833.168942 10251.195457 5601.145479 \n", - "72 0.000000 0.0 3956.418054 2854.417709 9818.046353 5610.869690 \n", - "73 0.000000 0.0 3732.871563 2684.427573 9009.501359 5445.558105 \n", - "74 0.000000 0.0 3537.711928 2868.583554 9269.390822 5727.560221 \n", - "75 0.000000 0.0 3275.133510 2804.837253 9413.773856 5776.181275 \n", - "76 0.000000 0.0 3143.844301 2755.256796 8085.449938 5591.421268 \n", - "77 0.000000 0.0 3150.941015 2606.515427 5602.061743 5571.972846 \n", - "78 0.000000 0.0 2753.525031 2415.276523 5371.048887 5163.555988 \n", - "79 0.000000 0.0 2710.944747 2528.603281 4822.393356 5192.728621 \n", - "80 0.000000 0.0 2679.009534 2641.930038 5168.912639 5367.764417 \n", - "81 0.000000 0.0 2405.786045 2188.623008 4822.393356 3860.511728 \n", - "82 0.000000 0.0 2406.654456 2187.873663 4215.984610 3617.406455 \n", - "83 0.000000 0.0 0.000000 0.000000 4213.460390 3607.682244 \n", - "84 0.000000 0.0 0.000000 0.000000 0.000000 4191.134898 \n", - "85 0.000000 0.0 0.000000 0.000000 0.000000 3772.993830 \n", - "86 0.000000 0.0 0.000000 0.000000 0.000000 4268.928586 \n", - "87 0.000000 0.0 0.000000 0.000000 0.000000 4220.307531 \n", - "88 0.000000 0.0 7022.296047 0.000000 0.000000 4492.585436 \n", - "89 0.000000 0.0 7448.967200 0.000000 0.000000 4589.827545 \n", - "90 0.000000 0.0 7822.304458 0.000000 0.000000 4755.139131 \n", - "91 0.000000 0.0 8124.529857 0.000000 0.000000 4696.793865 \n", - "92 0.000000 0.0 7893.416317 0.000000 0.000000 4453.688593 \n", - "93 0.000000 0.0 8480.089151 0.000000 0.000000 5017.692825 \n", - "94 0.000000 0.0 8248.975610 0.000000 0.000000 5046.865458 \n", - "95 0.000000 0.0 8657.868798 2749.598928 0.000000 5173.280199 \n", - "96 0.000000 0.0 8426.755257 2605.244984 0.000000 5358.040206 \n", - "97 0.000000 0.0 8960.094197 2598.370987 11493.621880 5221.901254 \n", - "98 0.000000 0.0 8977.872162 2715.228941 11320.785461 5552.524424 \n", - "99 0.000000 0.0 9173.429773 2777.094917 11781.682579 5251.073886 \n", - "100 0.000000 0.0 9102.317915 2653.362965 12674.670745 5708.111799 \n", - "101 0.000000 0.0 9173.429773 2804.590906 11580.040090 5601.145479 \n", - "102 0.000000 0.0 9511.211102 2790.842911 11810.488649 5474.730737 \n", - "103 0.000000 0.0 9511.211102 2790.842911 11810.488649 5474.730737 \n", - "104 0.000000 0.0 9013.428091 2845.834890 11752.876509 5455.282315 \n", - "105 0.000000 0.0 8711.202692 2797.716909 13481.240701 5513.627581 \n", - "106 0.000000 0.0 8960.094197 2756.472925 12991.537513 5367.764417 \n", - "107 0.000000 0.0 8551.201010 2749.598928 12300.191837 4939.899138 \n", - "108 0.000000 0.0 9137.873844 2790.842911 12012.131138 4774.587552 \n", - "109 0.000000 0.0 8924.538268 2667.110960 11493.621880 4667.621232 \n", - "110 0.000000 0.0 9368.987385 2770.220920 12012.131138 4716.242287 \n", - "111 0.000000 0.0 9244.541632 2646.488968 12069.743278 4589.827545 \n", - "112 0.000000 0.0 9457.877208 2770.220920 12559.446465 5299.694941 \n", - "113 0.000000 0.0 9671.212784 2797.716909 12761.088954 5124.659145 \n", - "114 0.000000 0.0 9386.765350 2722.102938 12040.937208 4794.035974 \n", - "115 0.000000 0.0 9600.100926 2735.850933 11580.040090 4657.897022 \n", - "116 0.000000 0.0 9991.216149 2873.330879 11896.906858 4628.724389 \n", - "117 0.000000 0.0 10008.994113 2797.716909 13798.107470 4716.242287 \n", - "118 0.000000 0.0 9706.768714 2804.590906 14028.556029 4755.139131 \n", - "119 0.000000 0.0 9742.324643 3134.542777 13913.331749 5202.452832 \n", - "120 0.000000 0.0 9884.548360 3120.794783 14777.513846 5387.212839 \n", - "121 0.000000 0.0 9600.100926 2907.700866 13164.373933 5562.248635 \n", - "122 0.000000 0.0 9528.989067 3120.794783 14345.422798 5785.905486 \n", - "123 0.000000 0.0 9475.655173 3107.046788 14057.362099 5912.320228 \n", - "124 0.000000 0.0 9351.209420 3113.920785 14691.095636 5931.768650 \n", - "125 0.000000 0.0 9351.209420 3113.920785 14691.095636 5931.768650 \n", - "126 0.000000 0.0 9422.321279 3127.668780 15497.665593 5999.838126 \n", - "127 0.000000 0.0 9475.655173 3107.046788 14086.168169 5941.492860 \n", - "128 0.000000 0.0 9208.985703 3052.054810 13366.016422 5776.181275 \n", - "129 0.000000 0.0 8373.421363 2942.070853 13625.271051 5688.663377 \n", - "130 0.000000 0.0 8373.421363 2942.070853 13625.271051 5688.663377 \n", - "131 0.000000 0.0 8017.862069 2852.708887 11522.427950 5678.939166 \n", - "132 0.000000 0.0 7697.858705 2646.488968 11493.621880 5319.143363 \n", - "133 0.000000 0.0 7253.409588 2673.984957 11291.979391 5319.143363 \n", - "134 0.000000 0.0 8373.421363 2893.952871 11752.876509 5747.008642 \n", - "135 0.000000 0.0 8302.309504 3024.558820 10773.470133 6038.734969 \n", - "136 0.000000 0.0 8444.533222 3134.542777 10571.827644 6223.494977 \n", - "137 0.000000 0.0 8497.867116 3278.896721 9361.972709 6145.701289 \n", - "138 0.000000 0.0 8160.085787 3182.660759 8008.087425 6194.322344 \n", - "139 0.000000 0.0 8053.417999 3107.046788 8123.311705 6622.187624 \n", - "140 0.000000 0.0 8053.417999 3107.046788 8109.213597 6622.187624 \n", - "141 0.000000 0.0 7911.194281 3024.558820 0.000000 6067.907602 \n", - "142 0.000000 0.0 8817.870480 2797.716909 0.000000 5912.320228 \n", - "143 0.000000 0.0 9368.987385 3045.180812 0.000000 6777.774998 \n", - "144 0.000000 0.0 9688.990749 3313.266708 0.000000 6641.636045 \n", - "145 0.000000 0.0 9848.992431 3251.400732 0.000000 6427.703406 \n", - "146 0.000000 0.0 9688.990749 3306.392710 0.000000 7040.328692 \n", - "147 0.000000 0.0 9706.768714 3333.888700 0.000000 7293.158176 \n", - "148 0.000000 0.0 9368.987385 3416.376668 0.000000 7351.503441 \n", - "149 0.000000 0.0 9191.207738 3512.612630 0.000000 7108.398169 \n", - "150 0.000000 0.0 8586.756939 3402.628673 0.000000 7157.019223 \n", - "151 0.000000 0.0 8106.751893 3168.912764 0.000000 6009.562337 \n", - "152 0.000000 0.0 9280.097561 3567.604609 0.000000 6135.977078 \n", - "153 0.000000 0.0 8391.199328 3993.792442 0.000000 6038.734969 \n", - "154 0.000000 0.0 8693.424727 3911.304474 0.000000 6340.185507 \n", - "155 0.000000 0.0 8906.760303 3925.052469 0.000000 6593.014991 \n", - "156 0.000000 0.0 8960.094197 3986.918445 0.000000 6612.463413 \n", - "157 0.000000 0.0 8835.648445 3938.800464 0.000000 6933.362372 \n", - "158 0.000000 0.0 8942.316233 4069.406413 0.000000 7108.398169 \n", - "159 0.000000 0.0 8693.424727 4041.910424 0.000000 7263.985543 \n", - "160 0.000000 0.0 8337.865434 3870.060491 0.000000 6252.667609 \n", - "161 0.000000 0.0 8231.197646 4007.540437 0.000000 6836.120263 \n", - "162 0.000000 0.0 8693.424727 3931.926466 0.000000 5941.492860 \n", - "163 0.000000 0.0 8692.656531 3904.430477 0.000000 5960.941282 \n", - "164 0.000000 0.0 0.000000 3801.320517 0.000000 5815.078119 \n", - "165 0.000000 0.0 0.000000 3801.320517 0.000000 5815.078119 \n", - "166 0.000000 0.0 0.000000 3883.808485 0.000000 5883.147595 \n", - "167 0.000000 0.0 0.000000 4110.650397 0.000000 6699.981311 \n", - "168 0.000000 0.0 0.000000 4158.768378 0.000000 6573.566569 \n", - "169 0.000000 0.0 0.000000 4145.020383 0.000000 5455.282315 \n", - "170 0.000000 0.0 0.000000 4131.272389 0.000000 6155.425500 \n", - "171 0.000000 0.0 0.000000 4117.524394 0.000000 5581.697057 \n", - "172 0.000000 0.0 0.000000 4213.760357 0.000000 5824.802330 \n", - "173 0.000000 0.0 0.000000 4275.626332 0.000000 5212.177043 \n", - "174 0.000000 0.0 0.000000 4234.382348 0.000000 4580.103334 \n", - "175 0.000000 0.0 0.000000 4096.902402 0.000000 4583.874219 \n", - "176 0.000000 0.0 0.000000 4096.902402 0.000000 0.000000 \n", - "177 0.000000 0.0 0.000000 4179.390370 0.000000 0.000000 \n", - "178 0.000000 0.0 0.000000 4179.390370 0.000000 0.000000 \n", - "179 0.000000 0.0 0.000000 4041.910424 0.000000 0.000000 \n", - "180 0.000000 0.0 0.000000 4186.264367 0.000000 0.000000 \n", - "181 0.000000 0.0 0.000000 4248.130343 0.000000 0.000000 \n", - "182 0.000000 0.0 0.000000 4330.618311 0.000000 0.000000 \n", - "183 0.000000 0.0 0.000000 4165.642375 0.000000 0.000000 \n", - "184 0.000000 0.0 0.000000 4200.012362 0.000000 0.000000 \n", - "185 0.000000 0.0 0.000000 4392.484287 0.000000 0.000000 \n", - "186 0.000000 0.0 0.000000 4316.870316 0.000000 0.000000 \n", - "187 0.000000 0.0 0.000000 4364.988298 0.000000 0.000000 \n", - "188 0.000000 0.0 0.000000 4330.618311 0.000000 0.000000 \n", - "189 0.000000 0.0 0.000000 4337.492308 0.000000 0.000000 \n", - "190 0.000000 0.0 0.000000 4316.870316 0.000000 0.000000 \n", - "191 0.000000 0.0 0.000000 4433.728271 0.000000 0.000000 \n", - "192 0.000000 0.0 0.000000 4440.602268 0.000000 0.000000 \n", - "193 0.000000 0.0 0.000000 4440.602268 0.000000 0.000000 \n", - "194 0.000000 0.0 0.000000 4468.098257 0.000000 0.000000 \n", - "195 0.000000 0.0 0.000000 4433.728271 0.000000 0.000000 \n", - "196 0.000000 0.0 0.000000 4509.342241 0.000000 0.000000 \n", - "197 0.000000 0.0 0.000000 4406.232281 0.000000 0.000000 \n", - "198 0.000000 0.0 0.000000 4564.334220 0.000000 0.000000 \n", - "199 0.000000 0.0 0.000000 4591.830209 0.000000 0.000000 \n", - "200 0.000000 0.0 0.000000 4612.452201 0.000000 0.000000 \n", - "201 0.000000 0.0 0.000000 4612.452201 0.000000 0.000000 \n", - "202 0.000000 0.0 0.000000 4667.444180 0.000000 0.000000 \n", - "203 0.000000 0.0 0.000000 4619.326198 0.000000 0.000000 \n", - "204 0.000000 0.0 0.000000 4516.216239 0.000000 0.000000 \n", - "205 0.000000 0.0 0.000000 4550.586225 0.000000 0.000000 \n", - "206 0.000000 0.0 0.000000 4248.130343 0.000000 0.000000 \n", - "207 0.000000 0.0 0.000000 4371.862295 0.000000 0.000000 \n", - "208 0.000000 0.0 0.000000 4206.886359 0.000000 0.000000 \n", - "209 0.000000 0.0 0.000000 4309.996319 0.000000 0.000000 \n", - "210 0.000000 0.0 0.000000 4433.728271 0.000000 0.000000 \n", - "211 0.000000 0.0 0.000000 4296.248324 0.000000 0.000000 \n", - "212 0.000000 0.0 0.000000 4151.894381 0.000000 0.000000 \n", - "213 0.000000 0.0 0.000000 4488.720249 0.000000 0.000000 \n", - "214 0.000000 0.0 0.000000 4406.232281 0.000000 0.000000 \n", - "215 0.000000 0.0 0.000000 4289.374327 0.000000 0.000000 \n", - "216 0.000000 0.0 0.000000 4488.720249 0.000000 0.000000 \n", - "217 0.000000 0.0 0.000000 4626.200196 0.000000 0.000000 \n", - "218 0.000000 0.0 0.000000 4729.310155 0.000000 0.000000 \n", - "219 0.000000 0.0 0.000000 4798.050129 0.000000 0.000000 \n", - "220 0.000000 0.0 0.000000 4722.436158 0.000000 0.000000 \n", - "221 0.000000 0.0 0.000000 4811.798123 0.000000 0.000000 \n", - "222 0.000000 0.0 0.000000 4859.916104 0.000000 0.000000 \n", - "223 0.000000 0.0 0.000000 4866.790102 0.000000 0.000000 \n", - "224 0.000000 0.0 7014.710570 4804.924126 0.000000 0.000000 \n", - "225 0.000000 0.0 7068.257979 4825.546118 0.000000 0.000000 \n", - "226 0.000000 0.0 7371.693296 4880.538096 0.000000 0.000000 \n", - "227 0.000000 0.0 7407.391569 4784.302134 0.000000 0.000000 \n", - "228 0.000000 0.0 7460.938978 4866.790102 0.000000 0.000000 \n", - "229 0.000000 0.0 7496.637250 4839.294113 0.000000 0.000000 \n", - "230 0.000000 0.0 7728.676022 4825.546118 0.000000 0.000000 \n", - "231 0.000000 0.0 7782.223431 4798.050129 0.000000 0.000000 \n", - "232 0.000000 0.0 7032.559706 4777.428137 0.000000 0.000000 \n", - "233 0.000000 0.0 7460.938978 4653.696185 0.000000 0.000000 \n", - "234 0.000000 0.0 7532.335523 4804.924126 0.000000 0.000000 \n", - "235 0.000000 0.0 7532.335523 4804.924126 0.000000 0.000000 \n", - "236 0.000000 0.0 7514.486386 4763.680142 0.000000 0.000000 \n", - "237 0.000000 0.0 7657.279477 4619.326198 0.000000 0.000000 \n", - "238 0.000000 0.0 7764.374295 4598.704206 0.000000 0.000000 \n", - "239 0.000000 0.0 7889.318249 4708.688163 0.000000 0.000000 \n", - "240 0.000000 0.0 8174.904430 4715.562161 0.000000 0.000000 \n", - "241 0.000000 0.0 8032.111339 4798.050129 0.000000 0.000000 \n", - "242 0.000000 0.0 7907.167385 4901.160088 0.000000 0.000000 \n", - "243 0.000000 0.0 8264.150111 4928.656078 0.000000 0.000000 \n", - "244 0.000000 0.0 7710.826886 5018.018043 0.000000 0.000000 \n", - "245 0.000000 0.0 9513.589653 5011.144045 0.000000 0.000000 \n", - "246 0.000000 0.0 9317.249154 4976.774059 0.000000 0.000000 \n", - "247 0.000000 0.0 9799.175834 4921.782080 0.000000 0.000000 \n", - "248 0.000000 0.0 9656.382744 4908.034086 0.000000 0.000000 \n", - "249 0.000000 0.0 9888.421516 4880.538096 0.000000 0.000000 \n", - "250 0.000000 0.0 9424.343972 5018.018043 0.000000 0.000000 \n", - "251 0.000000 0.0 9245.852609 4983.648056 0.000000 0.000000 \n", - "252 0.000000 0.0 9245.852609 4983.648056 0.000000 0.000000 \n", - "253 0.000000 0.0 9174.456063 5011.144045 0.000000 0.000000 \n", - "254 0.000000 0.0 8585.434565 4976.774059 0.000000 0.000000 \n", - "255 0.000000 0.0 9299.400017 5004.270048 0.000000 0.000000 \n", - "256 0.000000 0.0 9638.533607 5100.506011 0.000000 0.000000 \n", - "257 0.000000 0.0 9727.779289 5231.111960 0.000000 0.000000 \n", - "258 0.000000 0.0 9727.779289 5244.859954 0.000000 0.000000 \n", - "259 0.000000 0.0 9728.664670 5255.299943 0.000000 0.000000 \n", - "\n", - " AMD AVGO LLY NVDA HD QCOM BA \\\n", - "0 0.000000 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "1 8342.869950 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "2 8300.520356 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "3 8406.394340 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "4 8258.170762 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "5 7940.548810 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "6 8385.219543 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "7 8660.491902 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "8 8660.491902 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "9 9020.463448 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "10 8872.239870 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "11 8660.491902 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "12 7665.276451 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "13 7771.150435 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "14 7686.451248 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "15 8088.772388 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "16 7559.402467 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "17 7728.800842 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "18 7982.898404 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "19 8109.947185 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "20 8851.065074 0.0 0.0 0.0 0.000000 1830.095691 0.000000 \n", - "21 7347.654499 0.0 0.0 0.0 0.000000 1725.816734 0.000000 \n", - "22 8173.471575 0.0 0.0 0.0 0.000000 1188.780107 1429.646994 \n", - "23 8596.967512 0.0 0.0 0.0 0.000000 1324.342750 1459.353945 \n", - "24 8702.841496 0.0 0.0 0.0 0.000000 1204.421950 1570.755009 \n", - "25 8215.821169 0.0 0.0 0.0 0.000000 1126.212733 1581.895116 \n", - "26 7771.150435 0.0 0.0 0.0 0.000000 1126.189893 1600.461960 \n", - "27 7749.975639 0.0 0.0 0.0 0.000000 0.000000 1600.461960 \n", - "28 7220.605718 0.0 0.0 0.0 0.000000 0.000000 1526.194584 \n", - "29 7834.674826 0.0 0.0 0.0 0.000000 0.000000 1567.041640 \n", - "30 7898.199216 0.0 0.0 0.0 0.000000 0.000000 1511.341108 \n", - "31 7072.382140 0.0 0.0 0.0 0.000000 0.000000 1463.067314 \n", - "32 6670.061000 0.0 0.0 0.0 0.000000 0.000000 1329.386036 \n", - "33 6860.634172 0.0 0.0 0.0 0.000000 0.000000 1351.666249 \n", - "34 7347.654499 0.0 0.0 0.0 0.000000 0.000000 1373.946462 \n", - "35 6881.808969 0.0 0.0 0.0 0.000000 0.000000 1429.646994 \n", - "36 7580.577264 0.0 0.0 0.0 0.000000 0.000000 1377.659831 \n", - "37 6204.215470 0.0 0.0 0.0 0.000000 0.000000 1184.564652 \n", - "38 6225.390267 0.0 0.0 0.0 0.000000 0.000000 1321.959299 \n", - "39 6288.914658 0.0 0.0 0.0 0.000000 0.000000 1370.233093 \n", - "40 6902.983766 0.0 0.0 0.0 0.000000 0.000000 1411.080150 \n", - "41 7008.857750 0.0 0.0 0.0 0.000000 0.000000 1396.226675 \n", - "42 6733.585391 0.0 0.0 0.0 0.000000 0.000000 1344.239512 \n", - "43 7474.703280 0.0 0.0 0.0 0.000000 0.000000 1262.545398 \n", - "44 7686.451248 0.0 0.0 0.0 0.000000 0.000000 1284.825610 \n", - "45 7686.451248 0.0 0.0 0.0 0.000000 0.000000 1284.825610 \n", - "46 7538.227670 0.0 0.0 0.0 0.000000 0.000000 1199.418128 \n", - "47 6987.682953 0.0 0.0 0.0 0.000000 0.000000 1147.430964 \n", - "48 6966.508156 0.0 0.0 0.0 0.000000 0.000000 1047.170006 \n", - "49 6818.284578 0.0 0.0 0.0 0.000000 0.000000 1045.355557 \n", - "50 6733.585391 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "51 7220.605718 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "52 7030.032546 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "53 6013.642299 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "54 6204.215470 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "55 6034.817096 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "56 5823.069127 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "57 5060.776442 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "58 5039.601645 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "59 5314.874004 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "60 5060.776442 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "61 5463.097581 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "62 6310.089454 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "63 6267.739861 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "64 6098.341486 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "65 5865.418721 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "66 6606.536610 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "67 6394.788642 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "68 7199.430921 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "69 7093.556937 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "70 7517.052873 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "71 7411.178889 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "72 7495.878077 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "73 6775.934985 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "74 7072.382140 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "75 6924.158562 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "76 6246.565064 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "77 6267.739861 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "78 6204.215470 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "79 5844.243924 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "80 6119.516283 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "81 5081.951238 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "82 4658.455302 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "83 5124.300832 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "84 5124.300832 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "85 5378.398394 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "86 7305.304905 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "87 7262.955312 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "88 8131.121981 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "89 8046.422794 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "90 8300.520356 0.0 0.0 0.0 0.000000 0.000000 0.000000 \n", - "91 8448.743934 0.0 0.0 0.0 0.000000 1831.108604 0.000000 \n", - "92 8448.743934 0.0 0.0 0.0 0.000000 1890.525107 0.000000 \n", - "93 9443.959385 0.0 0.0 0.0 0.000000 2025.562615 0.000000 \n", - "94 9062.813042 0.0 0.0 0.0 0.000000 2030.964115 0.000000 \n", - "95 9719.231743 0.0 0.0 0.0 0.000000 2203.812125 0.000000 \n", - "96 9232.211416 0.0 0.0 0.0 0.000000 2247.024127 0.000000 \n", - "97 9676.882150 0.0 0.0 0.0 0.000000 2198.410625 0.000000 \n", - "98 9740.406540 0.0 0.0 0.0 0.000000 2263.228628 0.000000 \n", - "99 10121.552883 0.0 0.0 0.0 0.000000 2306.440631 0.000000 \n", - "100 9613.357759 0.0 0.0 0.0 0.000000 2187.607624 0.000000 \n", - "101 10290.951258 0.0 0.0 0.0 0.000000 2263.228628 0.000000 \n", - "102 10269.776461 0.0 0.0 0.0 0.000000 2387.463135 0.000000 \n", - "103 10269.776461 0.0 0.0 0.0 0.000000 2387.463135 0.000000 \n", - "104 10396.825242 0.0 0.0 0.0 0.000000 2166.001623 0.000000 \n", - "105 10290.951258 0.0 0.0 0.0 0.000000 2133.592621 0.000000 \n", - "106 10672.097601 0.0 0.0 0.0 0.000000 2268.630129 0.000000 \n", - "107 10058.028493 0.0 0.0 0.0 0.000000 2311.842131 0.000000 \n", - "108 10227.426867 0.0 0.0 0.0 0.000000 2333.448132 0.000000 \n", - "109 9507.483775 0.0 0.0 0.0 2542.977334 2403.667636 0.000000 \n", - "110 9465.134182 0.0 0.0 0.0 3081.594061 2376.660135 0.000000 \n", - "111 9105.162635 0.0 0.0 0.0 2710.743199 2360.455634 0.000000 \n", - "112 11349.691099 0.0 0.0 0.0 2648.934723 2511.697642 1427.690006 \n", - "113 11603.788661 0.0 0.0 0.0 2684.253852 2495.493141 1647.038605 \n", - "114 12726.052893 0.0 0.0 0.0 3143.402538 2641.333650 1766.333458 \n", - "115 13382.471594 0.0 0.0 0.0 3063.934496 2641.333650 1747.092353 \n", - "116 13424.821188 0.0 0.0 0.0 3311.168403 2797.977159 1804.815668 \n", - "117 13382.471594 0.0 0.0 0.0 3611.381005 2933.014666 1958.744510 \n", - "118 13721.268344 0.0 0.0 0.0 3593.721440 2922.211666 2193.485993 \n", - "119 13700.093547 0.0 0.0 0.0 3302.338621 2992.431170 2101.128688 \n", - "120 13869.491922 0.0 0.0 0.0 3646.700135 2922.211666 2178.093109 \n", - "121 13022.500048 0.0 0.0 0.0 3390.636445 2878.999663 2058.798257 \n", - "122 13784.792734 0.0 0.0 0.0 3514.253399 2808.780159 2185.789551 \n", - "123 13721.268344 0.0 0.0 0.0 3417.125792 3024.840172 2089.584025 \n", - "124 14420.036639 0.0 0.0 0.0 3372.976880 3084.256675 2112.673351 \n", - "125 14420.036639 0.0 0.0 0.0 3372.976880 3084.256675 2112.673351 \n", - "126 14885.882169 0.0 0.0 0.0 3328.827968 3035.643172 2131.914457 \n", - "127 15478.776480 0.0 0.0 0.0 3620.210788 3062.650674 2035.708931 \n", - "128 15224.678918 0.0 0.0 0.0 3143.402538 3068.052174 2112.673351 \n", - "129 13678.918750 0.0 0.0 0.0 3302.338621 2889.802664 1793.271005 \n", - "130 13678.918750 0.0 0.0 0.0 3302.338621 2889.802664 1793.271005 \n", - "131 12958.975658 0.0 0.0 0.0 2852.019718 2776.371157 1704.761921 \n", - "132 12831.926877 0.0 0.0 0.0 3249.359926 2722.356154 1504.654427 \n", - "133 13509.520375 0.0 0.0 0.0 3046.274931 2608.924648 1716.306584 \n", - "134 14907.056966 0.0 0.0 0.0 3293.508838 2727.757655 1173.707417 \n", - "135 15669.349652 0.0 0.0 0.0 3116.913190 2652.136650 1112.135881 \n", - "136 15076.455341 0.0 0.0 0.0 3902.763825 2846.590661 1135.225207 \n", - "137 15627.000058 0.0 0.0 0.0 3911.593607 2792.575658 904.331945 \n", - "138 14991.756153 0.0 0.0 0.0 3787.976653 2814.181660 850.456850 \n", - "139 16876.313071 0.0 0.0 0.0 3761.487306 2722.356154 531.824148 \n", - "140 16876.313071 0.0 0.0 0.0 3761.487306 2722.356154 531.824148 \n", - "141 16601.040712 0.0 0.0 0.0 3690.849047 2765.568157 530.991059 \n", - "142 16833.963477 0.0 0.0 0.0 3885.104260 3057.249173 0.000000 \n", - "143 17744.479741 0.0 0.0 0.0 4185.316862 3397.543693 0.000000 \n", - "144 17871.528522 0.0 0.0 0.0 3787.976653 3516.376699 0.000000 \n", - "145 17680.955350 0.0 0.0 0.0 3567.232093 3289.513687 0.000000 \n", - "146 17151.585430 0.0 0.0 0.0 3708.508612 3327.324189 0.000000 \n", - "147 18379.723646 0.0 0.0 0.0 3602.551223 3343.528690 0.000000 \n", - "148 17257.459414 0.0 0.0 0.0 3743.827741 3332.725689 0.000000 \n", - "149 18104.451287 0.0 0.0 0.0 3849.785130 3235.498683 0.000000 \n", - "150 17363.333398 0.0 0.0 0.0 3840.955348 3100.461176 0.000000 \n", - "151 18062.101693 0.0 0.0 0.0 3885.104260 3030.241672 0.000000 \n", - "152 18019.752100 0.0 0.0 0.0 3717.338394 2787.174158 0.000000 \n", - "153 18464.422833 0.0 0.0 0.0 3664.359700 2889.802664 0.000000 \n", - "154 18654.996004 0.0 0.0 0.0 3708.508612 3089.658175 0.000000 \n", - "155 17977.402506 0.0 0.0 0.0 3682.019264 3084.256675 0.000000 \n", - "156 18273.849661 0.0 0.0 0.0 3991.061649 3165.279179 0.000000 \n", - "157 18231.500068 0.0 0.0 0.0 3946.912737 3235.498683 0.000000 \n", - "158 18210.325271 0.0 0.0 0.0 3911.593607 3192.286681 0.000000 \n", - "159 18379.723646 0.0 0.0 0.0 3920.423389 3327.324189 0.000000 \n", - "160 18104.451287 0.0 0.0 0.0 3682.019264 3262.506185 0.000000 \n", - "161 18570.296817 0.0 0.0 0.0 3717.338394 3311.119688 0.000000 \n", - "162 18697.345598 0.0 0.0 0.0 3717.338394 3429.952694 0.000000 \n", - "163 18400.898442 0.0 0.0 0.0 3496.593834 3127.468677 0.000000 \n", - "164 18506.772427 0.0 0.0 0.0 3929.253172 3246.301684 0.000000 \n", - "165 18506.772427 0.0 0.0 0.0 3929.253172 3246.301684 0.000000 \n", - "166 17426.857788 0.0 0.0 0.0 3840.955348 3483.967698 0.000000 \n", - "167 18951.443160 0.0 0.0 0.0 4114.678602 3413.748194 0.000000 \n", - "168 19036.142347 0.0 0.0 0.0 4229.465774 3176.082180 0.000000 \n", - "169 18697.345598 0.0 0.0 0.0 4176.487079 3467.763197 0.000000 \n", - "170 19120.841535 0.0 0.0 0.0 4308.933815 3694.626209 0.000000 \n", - "171 18845.569176 0.0 0.0 0.0 4459.040116 3278.710686 0.000000 \n", - "172 20666.601703 0.0 0.0 0.0 4273.614686 3662.217208 0.000000 \n", - "173 20137.231782 0.0 0.0 0.0 4653.295329 3651.414207 0.000000 \n", - "174 20073.707392 0.0 0.0 0.0 4538.508158 3743.239712 0.000000 \n", - "175 20116.056985 0.0 0.0 0.0 4485.529464 3559.588702 0.000000 \n", - "176 19692.561049 0.0 0.0 0.0 4308.933815 3856.671219 0.000000 \n", - "177 19798.435033 0.0 0.0 0.0 4635.635765 4051.125230 0.000000 \n", - "178 20243.105766 0.0 0.0 0.0 4467.869899 3856.671219 0.000000 \n", - "179 19734.910643 0.0 0.0 0.0 4335.423163 3878.277220 0.000000 \n", - "180 19840.784627 0.0 0.0 0.0 4388.401857 4061.928230 0.000000 \n", - "181 19798.435033 0.0 0.0 0.0 4573.827288 3748.641213 0.000000 \n", - "182 19459.638284 0.0 0.0 0.0 4644.465547 3651.414207 0.000000 \n", - "183 19586.687065 0.0 0.0 0.0 4273.614686 3818.860717 0.000000 \n", - "184 19798.435033 0.0 0.0 0.0 4194.146644 3808.057716 0.000000 \n", - "185 19036.142347 0.0 0.0 0.0 4874.039890 3613.603705 0.000000 \n", - "186 19226.715519 0.0 0.0 0.0 4476.699681 3770.247214 0.000000 \n", - "187 19057.317144 0.0 0.0 0.0 5006.486626 4029.519228 0.000000 \n", - "188 19226.715519 0.0 0.0 0.0 4962.337714 3916.087722 0.000000 \n", - "189 19290.239909 0.0 0.0 0.0 4803.401630 3651.414207 0.000000 \n", - "190 19607.861862 0.0 0.0 0.0 4838.720760 3743.239712 0.000000 \n", - "191 19290.239909 0.0 0.0 0.0 4688.614459 3932.292223 0.000000 \n", - "192 19861.959423 0.0 0.0 0.0 4617.976200 3970.102725 0.000000 \n", - "193 19861.959423 0.0 0.0 0.0 4617.976200 3970.102725 0.000000 \n", - "194 19459.638284 0.0 0.0 0.0 4211.806209 4094.337232 0.000000 \n", - "195 20073.707392 0.0 0.0 0.0 3682.019264 4051.125230 0.000000 \n", - "196 19438.463487 0.0 0.0 0.0 3840.955348 4115.943233 0.000000 \n", - "197 18718.520395 0.0 0.0 0.0 3576.061876 3764.845713 0.000000 \n", - "198 19078.491941 0.0 0.0 0.0 3655.529917 3980.905726 0.000000 \n", - "199 19269.065112 0.0 0.0 0.0 4088.189255 4029.519228 0.000000 \n", - "200 19501.987877 0.0 0.0 0.0 4079.359473 4040.322229 0.000000 \n", - "201 19353.764300 0.0 0.0 0.0 3390.636445 4061.928230 0.000000 \n", - "202 19607.861862 0.0 0.0 0.0 3505.423616 4180.761237 0.000000 \n", - "203 18845.569176 0.0 0.0 0.0 3502.150225 3959.299724 0.000000 \n", - "204 19057.317144 0.0 0.0 0.0 0.000000 3943.095224 0.000000 \n", - "205 18993.792754 0.0 0.0 0.0 0.000000 3797.254715 0.000000 \n", - "206 17871.528522 0.0 0.0 0.0 0.000000 3818.860717 0.000000 \n", - "207 18019.752100 0.0 0.0 0.0 0.000000 3683.823209 0.000000 \n", - "208 16558.691119 0.0 0.0 0.0 0.000000 3602.800704 0.000000 \n", - "209 16770.439087 0.0 0.0 0.0 0.000000 3500.172198 0.000000 \n", - "210 18040.926896 0.0 0.0 0.0 0.000000 3678.421709 0.000000 \n", - "211 18019.752100 0.0 0.0 0.0 0.000000 3710.830710 0.000000 \n", - "212 18083.276490 0.0 0.0 0.0 0.000000 3770.247214 0.000000 \n", - "213 18591.471614 0.0 0.0 0.0 0.000000 3824.262217 0.000000 \n", - "214 19099.666738 0.0 0.0 0.0 0.000000 3964.701225 0.000000 \n", - "215 18782.044785 0.0 0.0 0.0 0.000000 3808.057716 0.000000 \n", - "216 17469.207382 0.0 0.0 0.0 0.000000 3845.868218 0.000000 \n", - "217 18040.926896 0.0 0.0 0.0 0.000000 4277.988243 0.000000 \n", - "218 18464.422833 0.0 0.0 0.0 0.000000 4332.003246 0.000000 \n", - "219 19586.687065 0.0 0.0 0.0 0.000000 4413.025750 0.000000 \n", - "220 19798.435033 0.0 0.0 0.0 0.000000 4364.412247 0.000000 \n", - "221 19671.386252 0.0 0.0 0.0 0.000000 4396.821249 0.000000 \n", - "222 19396.113893 0.0 0.0 0.0 0.000000 4369.813748 0.000000 \n", - "223 19184.365925 0.0 0.0 0.0 0.000000 4450.836252 0.000000 \n", - "224 19565.512268 0.0 0.0 0.0 0.000000 4353.609247 0.000000 \n", - "225 19946.658611 0.0 0.0 0.0 0.000000 4558.866258 0.000000 \n", - "226 20497.203328 0.0 0.0 0.0 0.000000 4693.903766 0.000000 \n", - "227 20666.601703 0.0 0.0 0.0 0.000000 4666.896265 0.000000 \n", - "228 20666.601703 0.0 0.0 0.0 0.000000 4699.305266 0.000000 \n", - "229 20730.126093 0.0 0.0 0.0 0.000000 4747.918769 0.000000 \n", - "230 20793.650484 0.0 0.0 0.0 0.000000 4742.517269 0.000000 \n", - "231 20878.349671 0.0 0.0 0.0 0.000000 4774.926271 0.000000 \n", - "232 20687.776500 0.0 0.0 0.0 0.000000 4785.729271 0.000000 \n", - "233 20899.524468 0.0 0.0 0.0 0.000000 4845.145775 0.000000 \n", - "234 20963.048858 0.0 0.0 0.0 0.000000 4823.539773 0.000000 \n", - "235 20963.048858 0.0 0.0 0.0 0.000000 4823.539773 0.000000 \n", - "236 20878.349671 0.0 0.0 0.0 0.000000 4769.524770 0.000000 \n", - "237 20984.223655 0.0 0.0 0.0 0.000000 4720.911268 0.000000 \n", - "238 21280.670811 0.0 0.0 0.0 0.000000 4818.138273 0.000000 \n", - "239 21090.097639 0.0 0.0 0.0 0.000000 4823.539773 0.000000 \n", - "240 20899.524468 0.0 0.0 0.0 0.000000 4785.729271 0.000000 \n", - "241 21068.922843 0.0 0.0 0.0 0.000000 4877.554777 0.000000 \n", - "242 21005.398452 0.0 0.0 0.0 0.000000 4855.948775 0.000000 \n", - "243 21090.097639 0.0 0.0 0.0 0.000000 4861.350276 0.000000 \n", - "244 21132.447233 0.0 0.0 0.0 0.000000 4866.751776 0.000000 \n", - "245 21047.748046 0.0 0.0 0.0 0.000000 4845.145775 0.000000 \n", - "246 21386.544795 0.0 0.0 0.0 0.000000 4915.365279 0.000000 \n", - "247 21090.097639 0.0 0.0 0.0 0.000000 4936.971280 0.000000 \n", - "248 21111.272436 0.0 0.0 0.0 0.000000 4926.168279 0.000000 \n", - "249 21132.447233 0.0 0.0 0.0 0.000000 4839.744274 0.000000 \n", - "250 21323.020405 0.0 0.0 0.0 0.000000 5093.614789 0.000000 \n", - "251 21174.796827 0.0 0.0 0.0 0.000000 4909.963778 0.000000 \n", - "252 21174.796827 0.0 0.0 0.0 0.000000 4909.963778 0.000000 \n", - "253 21280.670811 0.0 0.0 0.0 0.000000 4850.547275 0.000000 \n", - "254 21280.670811 0.0 0.0 0.0 0.000000 4618.282762 0.000000 \n", - "255 21280.670811 0.0 0.0 0.0 0.000000 4693.903766 0.000000 \n", - "256 21280.670811 0.0 0.0 0.0 0.000000 4683.100766 0.000000 \n", - "257 21280.670811 0.0 0.0 0.0 0.000000 4715.509767 0.000000 \n", - "258 21280.670811 0.0 0.0 0.0 0.000000 4812.736773 0.000000 \n", - "259 21275.431998 0.0 0.0 0.0 0.000000 4808.520645 0.000000 \n", - "\n", - " INTC MU SBUX BAC DIS \\\n", - "0 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "1 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "2 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "3 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "4 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "5 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "6 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "7 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "8 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "9 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "10 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "11 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "12 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "13 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "14 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "15 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "16 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "17 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "18 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "19 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "20 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "21 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "22 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "23 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "24 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "25 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "26 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "27 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "28 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "29 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "30 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "31 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "32 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "33 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "34 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "35 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "36 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "37 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "38 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "39 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "40 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "41 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "42 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "43 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "44 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "45 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "46 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "47 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "48 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "49 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "50 497.814994 0.000000 0.000000 0.000000 0.000000 \n", - "51 491.529451 0.000000 0.000000 0.000000 0.000000 \n", - "52 487.129571 1859.588591 0.000000 0.000000 0.000000 \n", - "53 439.359446 1699.542032 0.000000 0.000000 0.000000 \n", - "54 434.959566 1752.890885 0.000000 0.000000 0.000000 \n", - "55 358.275943 1775.754679 0.000000 0.000000 0.000000 \n", - "56 274.049669 1669.056973 0.000000 0.000000 0.000000 \n", - "57 277.820994 1539.495473 0.000000 0.000000 0.000000 \n", - "58 256.450149 1615.708120 0.000000 0.000000 0.000000 \n", - "59 257.707257 1600.465590 0.000000 0.000000 0.000000 \n", - "60 245.136171 1562.359267 0.000000 0.000000 0.000000 \n", - "61 280.963766 1577.601796 0.000000 0.000000 0.000000 \n", - "62 299.820394 1329.148566 0.000000 0.000000 0.000000 \n", - "63 316.791360 1569.980531 0.000000 0.000000 0.000000 \n", - "64 313.648589 1562.359267 0.000000 0.000000 0.000000 \n", - "65 332.505217 1547.116737 0.000000 0.000000 0.000000 \n", - "66 335.019434 1592.844326 0.000000 0.000000 0.000000 \n", - "67 335.647989 1653.814443 0.000000 0.000000 0.000000 \n", - "68 344.447749 1737.648355 0.000000 0.000000 0.000000 \n", - "69 341.933531 1684.299502 0.000000 0.000000 0.000000 \n", - "70 350.733291 1638.571914 0.000000 0.000000 0.000000 \n", - "71 371.475583 1745.269620 0.000000 0.000000 0.000000 \n", - "72 369.589920 1707.163296 0.000000 0.000000 0.000000 \n", - "73 333.762326 1676.678237 0.000000 0.000000 0.000000 \n", - "74 357.647389 1646.193179 0.000000 0.000000 0.000000 \n", - "75 335.019434 1646.193179 0.000000 0.000000 0.000000 \n", - "76 319.934131 1615.708120 0.000000 0.000000 0.000000 \n", - "77 321.191240 1516.631678 0.000000 0.000000 0.000000 \n", - "78 289.134971 1501.389149 0.000000 0.000000 0.000000 \n", - "79 246.393280 1457.185814 0.000000 0.000000 0.000000 \n", - "80 246.475971 1562.359267 0.000000 0.000000 0.000000 \n", - "81 0.000000 1438.894778 0.000000 0.000000 0.000000 \n", - "82 0.000000 1283.420978 0.000000 0.000000 0.000000 \n", - "83 0.000000 1282.958843 0.000000 0.000000 0.000000 \n", - "84 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "85 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "86 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "87 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "88 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "89 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "90 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "91 0.000000 0.000000 7194.383795 0.000000 0.000000 \n", - "92 0.000000 0.000000 6781.591282 0.000000 0.000000 \n", - "93 0.000000 0.000000 7351.638085 0.000000 0.000000 \n", - "94 0.000000 0.000000 7233.697367 0.000000 0.000000 \n", - "95 497.693841 0.000000 7587.519521 0.000000 0.000000 \n", - "96 551.147170 0.000000 7725.117026 0.000000 0.000000 \n", - "97 664.554911 0.000000 8019.968820 0.000000 0.000000 \n", - "98 675.390045 0.000000 7646.489880 0.000000 0.000000 \n", - "99 715.118871 0.000000 7292.667726 0.000000 0.000000 \n", - "100 671.778334 0.000000 7096.099863 0.000000 0.000000 \n", - "101 682.613468 0.000000 7430.265231 0.000000 0.000000 \n", - "102 682.613468 0.000000 6702.964137 0.000000 0.000000 \n", - "103 682.613468 0.000000 6702.964137 0.000000 0.000000 \n", - "104 686.225179 0.000000 6761.934496 0.000000 0.000000 \n", - "105 697.060314 0.000000 6368.798769 0.000000 0.000000 \n", - "106 722.342294 0.000000 6054.290188 0.000000 0.000000 \n", - "107 715.118871 0.000000 5739.781607 0.000000 0.000000 \n", - "108 668.166622 0.000000 5857.722325 0.000000 0.000000 \n", - "109 613.268608 0.000000 5346.645880 0.000000 0.000000 \n", - "110 582.207889 0.000000 5339.957136 0.000000 0.000000 \n", - "111 561.982305 0.000000 0.000000 0.000000 0.000000 \n", - "112 607.489869 0.000000 0.000000 0.000000 0.000000 \n", - "113 621.214373 0.000000 0.000000 0.000000 0.000000 \n", - "114 697.060314 0.000000 0.000000 0.000000 0.000000 \n", - "115 693.448602 0.000000 0.000000 0.000000 0.000000 \n", - "116 700.672025 0.000000 0.000000 0.000000 0.000000 \n", - "117 715.118871 0.000000 0.000000 4387.526007 0.000000 \n", - "118 733.177429 0.000000 0.000000 4143.774563 0.000000 \n", - "119 765.682832 0.000000 0.000000 4095.024274 0.000000 \n", - "120 772.906255 0.000000 0.000000 4129.845909 0.000000 \n", - "121 801.799947 0.000000 0.000000 3823.415521 0.000000 \n", - "122 801.799947 0.000000 0.000000 3969.666388 0.000000 \n", - "123 845.140484 0.000000 0.000000 4074.131293 0.000000 \n", - "124 906.539579 0.000000 0.000000 4394.490334 0.000000 \n", - "125 906.539579 0.000000 0.000000 4394.490334 0.000000 \n", - "126 920.986425 0.000000 0.000000 4276.096775 0.000000 \n", - "127 906.539579 0.000000 0.000000 4345.740045 0.000000 \n", - "128 928.209848 0.000000 0.000000 4164.667543 0.000000 \n", - "129 823.470215 0.000000 0.000000 4352.704372 0.000000 \n", - "130 823.470215 0.000000 0.000000 4352.704372 0.000000 \n", - "131 762.071120 0.000000 0.000000 4095.024274 0.000000 \n", - "132 787.353101 0.000000 0.000000 4283.061102 0.000000 \n", - "133 765.682832 0.000000 0.000000 4666.099087 0.000000 \n", - "134 841.528773 0.000000 0.000000 4478.062258 0.000000 \n", - "135 827.081927 0.000000 0.000000 4095.024274 0.000000 \n", - "136 801.799947 0.000000 0.000000 4039.309658 0.000000 \n", - "137 819.858504 0.000000 0.000000 3718.950616 0.000000 \n", - "138 812.635081 0.000000 0.000000 3391.627247 0.000000 \n", - "139 794.576524 0.000000 0.000000 3008.589262 0.000000 \n", - "140 794.576524 0.000000 0.000000 3008.589262 0.000000 \n", - "141 754.847697 0.000000 0.000000 2848.409741 0.000000 \n", - "142 776.517966 0.000000 0.000000 2667.337239 0.000000 \n", - "143 744.012563 0.000000 0.000000 2952.874646 0.000000 \n", - "144 877.645887 0.000000 0.000000 3106.089840 0.000000 \n", - "145 783.741389 0.000000 0.000000 3196.626091 0.000000 \n", - "146 855.975619 0.000000 0.000000 3308.055323 0.000000 \n", - "147 819.858504 0.000000 0.000000 3558.771095 0.000000 \n", - "148 683.335810 0.000000 0.000000 3593.592730 0.000000 \n", - "149 684.058153 0.000000 0.000000 3684.128981 0.000000 \n", - "150 637.828246 0.000000 0.000000 4617.348798 2976.601813 \n", - "151 642.884642 0.000000 0.000000 4067.166966 2872.855568 \n", - "152 633.494192 0.000000 0.000000 3802.522540 2975.076133 \n", - "153 589.431312 0.000000 0.000000 3795.558213 3016.269495 \n", - "154 673.945360 0.000000 0.000000 3321.983977 2927.780051 \n", - "155 567.761043 0.000000 0.000000 3384.662920 3319.879828 \n", - "156 629.882481 0.000000 0.000000 3475.199171 3417.523353 \n", - "157 598.821762 0.000000 0.000000 3440.377536 5144.593190 \n", - "158 639.272930 0.000000 0.000000 3384.662920 4697.568930 \n", - "159 667.444280 0.000000 7179.137307 3746.807924 5002.704943 \n", - "160 634.938877 0.000000 7176.628414 3238.412053 5135.439109 \n", - "161 682.613468 0.000000 0.000000 3447.341863 5376.496560 \n", - "162 706.450764 0.000000 0.000000 4067.166966 5446.677843 \n", - "163 676.112387 0.000000 0.000000 4108.952928 5301.738237 \n", - "164 697.060314 0.000000 0.000000 4018.416677 4944.729101 \n", - "165 697.060314 0.000000 0.000000 4018.416677 4944.729101 \n", - "166 707.173106 0.000000 0.000000 3795.558213 4616.707886 \n", - "167 617.602662 0.000000 0.000000 3705.021962 4421.420837 \n", - "168 561.259963 0.000000 0.000000 3886.094464 4540.423883 \n", - "169 593.765366 0.000000 0.000000 3663.236000 4602.976766 \n", - "170 564.871674 0.000000 0.000000 4122.881582 4938.626381 \n", - "171 564.149332 0.000000 0.000000 4143.774563 5423.792642 \n", - "172 572.095097 0.000000 0.000000 4457.169277 5289.532796 \n", - "173 615.435635 0.000000 0.000000 4387.526007 5368.868160 \n", - "174 729.565717 0.000000 0.000000 4930.743513 5660.273053 \n", - "175 639.272930 0.000000 0.000000 5118.780342 5477.191445 \n", - "176 621.214373 0.000000 0.000000 5132.708996 4944.729101 \n", - "177 754.847697 0.000000 0.000000 5299.852844 4979.819742 \n", - "178 613.990950 0.000000 0.000000 5237.173901 5100.348468 \n", - "179 621.214373 0.000000 0.000000 5480.925346 5388.702001 \n", - "180 567.038701 0.000000 0.000000 5508.782654 5431.421043 \n", - "181 564.149332 0.000000 0.000000 5613.247559 5416.164242 \n", - "182 585.097258 0.000000 0.000000 5313.781498 5356.662719 \n", - "183 584.347244 0.000000 0.000000 5118.780342 5423.792642 \n", - "184 0.000000 0.000000 0.000000 5536.639962 5721.300256 \n", - "185 0.000000 0.000000 0.000000 5515.746981 5782.327458 \n", - "186 0.000000 0.000000 0.000000 6079.857467 6140.862274 \n", - "187 0.000000 0.000000 0.000000 6678.789589 5995.922668 \n", - "188 0.000000 0.000000 0.000000 6302.715931 5995.922668 \n", - "189 0.000000 0.000000 0.000000 6149.500737 6598.566295 \n", - "190 0.000000 0.000000 0.000000 6365.394874 6774.019503 \n", - "191 0.000000 0.000000 0.000000 6901.648053 6880.817107 \n", - "192 0.000000 0.000000 0.000000 6992.184304 6995.243112 \n", - "193 0.000000 0.000000 0.000000 6992.184304 6995.243112 \n", - "194 0.000000 0.000000 0.000000 6741.468532 6926.587509 \n", - "195 0.000000 0.000000 0.000000 6511.645741 7025.756714 \n", - "196 0.000000 0.000000 0.000000 6769.325840 6468.883489 \n", - "197 0.000000 0.000000 0.000000 6219.144007 6110.348673 \n", - "198 0.000000 0.000000 0.000000 6365.394874 6354.457484 \n", - "199 0.000000 0.000000 0.000000 6650.932281 6201.889477 \n", - "200 0.000000 0.000000 0.000000 6783.254494 6301.058681 \n", - "201 0.000000 0.000000 0.000000 6017.178524 6072.206671 \n", - "202 0.000000 0.000000 0.000000 5634.140540 6102.720273 \n", - "203 0.000000 0.000000 0.000000 5334.674479 5744.185457 \n", - "204 0.000000 0.000000 0.000000 5418.246403 5422.266962 \n", - "205 0.000000 0.000000 0.000000 4422.347642 5591.617450 \n", - "206 0.000000 0.000000 0.000000 4798.421300 5432.946723 \n", - "207 0.000000 0.000000 0.000000 5153.601977 5361.239759 \n", - "208 0.000000 0.000000 0.000000 6170.393718 5288.007116 \n", - "209 0.000000 0.000000 0.000000 6783.254494 5190.363592 \n", - "210 0.000000 0.000000 0.000000 7291.650365 5522.961847 \n", - "211 0.000000 0.000000 0.000000 7270.757384 5561.103848 \n", - "212 0.000000 0.000000 0.000000 6950.398342 5321.572078 \n", - "213 0.000000 0.000000 0.000000 6811.111802 5320.046398 \n", - "214 0.000000 0.000000 0.000000 6518.610068 5185.786552 \n", - "215 0.000000 0.000000 0.000000 6086.821794 5040.846945 \n", - "216 0.000000 0.000000 0.000000 6038.071505 4920.318220 \n", - "217 0.000000 0.000000 0.000000 5898.784965 5297.161197 \n", - "218 0.000000 0.000000 0.000000 6149.500737 5504.653686 \n", - "219 0.000000 0.000000 0.000000 6247.001315 5797.584259 \n", - "220 0.000000 0.000000 0.000000 6678.789589 3840.136731 \n", - "221 0.000000 0.000000 0.000000 6525.574395 3885.907134 \n", - "222 0.000000 0.000000 0.000000 7020.041612 3898.112574 \n", - "223 0.000000 0.000000 0.000000 7166.292479 3835.559691 \n", - "224 0.000000 0.000000 0.000000 7033.970266 3887.432814 \n", - "225 0.000000 0.000000 0.000000 7215.042768 3757.750008 \n", - "226 0.000000 0.000000 0.000000 7563.259117 3243.595825 \n", - "227 0.000000 0.000000 0.000000 7869.689505 3354.970470 \n", - "228 0.000000 0.000000 0.000000 7876.653832 3364.124550 \n", - "229 0.000000 0.000000 0.000000 7437.901232 3239.018785 \n", - "230 0.000000 0.000000 0.000000 8197.012874 3162.734781 \n", - "231 0.000000 0.000000 0.000000 8162.191239 3275.635106 \n", - "232 0.000000 0.000000 0.000000 7730.402965 2769.109324 \n", - "233 0.000000 0.000000 0.000000 7827.903543 2993.384294 \n", - "234 0.000000 0.000000 0.000000 7813.974889 3162.734781 \n", - "235 0.000000 0.000000 0.000000 7813.974889 3162.734781 \n", - "236 0.000000 0.000000 0.000000 7291.650365 2871.329888 \n", - "237 0.000000 0.000000 0.000000 7180.221133 2973.550453 \n", - "238 0.000000 0.000000 0.000000 8482.550281 3362.598870 \n", - "239 0.000000 0.000000 0.000000 8287.549125 3156.632061 \n", - "240 0.000000 0.000000 0.000000 8169.155566 3245.121505 \n", - "241 0.000000 0.000000 0.000000 8433.799992 2906.420530 \n", - "242 0.000000 0.000000 0.000000 8162.191239 2839.290607 \n", - "243 0.000000 0.000000 0.000000 8461.657300 2906.420530 \n", - "244 0.000000 0.000000 0.000000 8315.406433 3130.695500 \n", - "245 0.000000 0.000000 0.000000 7584.152098 2836.239247 \n", - "246 0.000000 0.000000 0.000000 8106.476623 2775.212044 \n", - "247 0.000000 0.000000 0.000000 7862.725178 2648.580598 \n", - "248 0.000000 0.000000 0.000000 7897.546813 2630.272437 \n", - "249 0.000000 0.000000 0.000000 8162.191239 2901.843490 \n", - "250 0.000000 0.000000 0.000000 8580.050859 2860.650128 \n", - "251 0.000000 0.000000 0.000000 8621.836821 3199.351103 \n", - "252 0.000000 0.000000 0.000000 8621.836821 3199.351103 \n", - "253 0.000000 0.000000 0.000000 8078.619315 2964.396372 \n", - "254 0.000000 0.000000 0.000000 8552.193551 2921.677330 \n", - "255 0.000000 0.000000 0.000000 8029.869026 2943.036851 \n", - "256 0.000000 0.000000 0.000000 7667.724022 2941.511171 \n", - "257 0.000000 0.000000 0.000000 7807.010562 2935.408451 \n", - "258 0.000000 0.000000 0.000000 7800.046235 2445.665149 \n", - "259 0.000000 0.000000 0.000000 7801.333521 2444.462845 \n", - "\n", - " datetime cash commission total \n", - "0 2023-07-05 100000.000000 0.000000 100000.000000 \n", - "1 2023-07-05 99573.852586 0.121451 142238.301049 \n", - "2 2023-07-06 99573.852586 0.121451 141476.873921 \n", - "3 2023-07-07 99573.852586 0.121451 141759.752707 \n", - "4 2023-07-10 99573.852586 0.121451 138562.913056 \n", - "5 2023-07-11 99573.852586 0.121451 138392.475901 \n", - "6 2023-07-12 99573.852586 0.121451 140218.607922 \n", - "7 2023-07-13 99573.852586 0.121451 142425.743271 \n", - "8 2023-07-14 99573.852586 0.121451 142216.268387 \n", - "9 2023-07-17 99573.852586 0.121451 145410.321104 \n", - "10 2023-07-18 99573.852586 0.121451 146071.713761 \n", - "11 2023-07-19 99573.852586 0.121451 145156.412396 \n", - "12 2023-07-20 99573.852586 0.121451 139437.241425 \n", - "13 2023-07-21 99573.852586 0.121451 139061.972340 \n", - "14 2023-07-24 99573.852586 0.121451 140083.924073 \n", - "15 2023-07-25 99573.852586 0.121451 141119.750093 \n", - "16 2023-07-26 99573.852586 0.121451 140871.048238 \n", - "17 2023-07-27 99573.852586 0.121451 139026.850102 \n", - "18 2023-07-28 99573.852586 0.121451 141830.144776 \n", - "19 2023-07-31 99573.852586 0.121451 141757.674401 \n", - "20 2023-08-01 99555.562232 0.127270 143789.420533 \n", - "21 2023-08-02 99555.562232 0.127270 140600.536889 \n", - "22 2023-08-03 99541.283383 0.131414 141413.286700 \n", - "23 2023-08-04 99541.283383 0.131414 140322.609734 \n", - "24 2023-08-07 99541.283383 0.131414 139368.946502 \n", - "25 2023-08-08 99541.283383 0.131414 139558.561650 \n", - "26 2023-08-09 99552.545282 0.137233 137278.988664 \n", - "27 2023-08-10 99552.545282 0.137233 136762.109974 \n", - "28 2023-08-11 99552.545282 0.137233 135323.819037 \n", - "29 2023-08-14 99552.545282 0.137233 136073.568887 \n", - "30 2023-08-15 99552.545282 0.137233 135074.713619 \n", - "31 2023-08-16 99552.545282 0.137233 133957.935313 \n", - "32 2023-08-17 99552.545282 0.137233 130717.962506 \n", - "33 2023-08-18 99552.545282 0.137233 131442.422767 \n", - "34 2023-08-21 99552.545282 0.137233 133676.221359 \n", - "35 2023-08-22 99552.545282 0.137233 133933.477482 \n", - "36 2023-08-23 99552.545282 0.137233 136219.973438 \n", - "37 2023-08-24 99552.545282 0.137233 132748.726204 \n", - "38 2023-08-25 99552.545282 0.137233 133178.523129 \n", - "39 2023-08-28 99552.545282 0.137233 133574.986037 \n", - "40 2023-08-29 99552.545282 0.137233 136419.452464 \n", - "41 2023-08-30 99552.545282 0.137233 138304.675193 \n", - "42 2023-08-31 99552.545282 0.137233 139133.872479 \n", - "43 2023-09-01 99552.545282 0.137233 140162.748392 \n", - "44 2023-09-04 99552.545282 0.137233 142164.713882 \n", - "45 2023-09-05 99552.545282 0.137233 142164.713882 \n", - "46 2023-09-06 99552.545282 0.137233 137031.397465 \n", - "47 2023-09-07 99552.545282 0.137233 136479.003646 \n", - "48 2023-09-08 99552.545282 0.137233 136617.780366 \n", - "49 2023-09-11 99562.998838 0.141377 140942.953857 \n", - "50 2023-09-12 99558.026499 0.144884 136971.058536 \n", - "51 2023-09-13 99558.026499 0.144884 139208.579631 \n", - "52 2023-09-14 99539.459257 0.153390 141456.344508 \n", - "53 2023-09-15 99539.459257 0.153390 138555.232037 \n", - "54 2023-09-18 99539.459257 0.153390 138617.626539 \n", - "55 2023-09-19 99539.459257 0.153390 138408.015298 \n", - "56 2023-09-20 99539.459257 0.153390 135358.402891 \n", - "57 2023-09-21 99539.459257 0.153390 133036.605610 \n", - "58 2023-09-22 99539.459257 0.153390 130998.462106 \n", - "59 2023-09-25 99539.459257 0.153390 132476.471845 \n", - "60 2023-09-26 99539.459257 0.153390 130070.469264 \n", - "61 2023-09-27 99539.459257 0.153390 130554.527694 \n", - "62 2023-09-28 99539.459257 0.153390 131683.245409 \n", - "63 2023-09-29 99539.459257 0.153390 132039.808600 \n", - "64 2023-10-02 99539.459257 0.153390 134080.942776 \n", - "65 2023-10-03 99539.459257 0.153390 131432.014013 \n", - "66 2023-10-04 99595.743680 0.180427 134543.832911 \n", - "67 2023-10-05 99595.743680 0.180427 128747.210399 \n", - "68 2023-10-06 99595.743680 0.180427 130708.942920 \n", - "69 2023-10-09 99595.743680 0.180427 130901.790950 \n", - "70 2023-10-10 99595.743680 0.180427 131075.289910 \n", - "71 2023-10-11 99595.743680 0.180427 131602.371281 \n", - "72 2023-10-12 99595.743680 0.180427 131408.126778 \n", - "73 2023-10-13 99595.743680 0.180427 129254.477827 \n", - "74 2023-10-16 99595.743680 0.180427 130075.212911 \n", - "75 2023-10-17 99595.743680 0.180427 129771.040749 \n", - "76 2023-10-18 99595.743680 0.180427 127353.923298 \n", - "77 2023-10-19 99595.743680 0.180427 124632.797489 \n", - "78 2023-10-20 99595.743680 0.180427 123293.889700 \n", - "79 2023-10-23 99595.743680 0.180427 122398.236702 \n", - "80 2023-10-24 99598.208439 0.183935 123384.176589 \n", - "81 2023-10-25 99598.208439 0.183935 119396.368593 \n", - "82 2023-10-26 99644.153721 0.211639 118013.949185 \n", - "83 2023-10-27 99699.117913 0.252371 113927.520223 \n", - "84 2023-10-30 99699.117913 0.252371 109014.553643 \n", - "85 2023-10-31 99699.117913 0.252371 108850.510137 \n", - "86 2023-11-01 99699.117913 0.252371 111273.351404 \n", - "87 2023-11-02 99699.117913 0.252371 111182.380756 \n", - "88 2023-11-03 99628.964281 0.272211 119274.967746 \n", - "89 2023-11-06 99628.964281 0.272211 119714.181820 \n", - "90 2023-11-07 99628.964281 0.272211 120506.928226 \n", - "91 2023-11-08 99538.768140 0.300176 129834.328195 \n", - "92 2023-11-09 99538.768140 0.300176 129006.733372 \n", - "93 2023-11-10 99538.768140 0.300176 131857.710201 \n", - "94 2023-11-13 99538.768140 0.300176 131162.083732 \n", - "95 2023-11-14 99506.340129 0.311878 136095.345284 \n", - "96 2023-11-15 99506.340129 0.311878 135651.880316 \n", - "97 2023-11-16 99391.298954 0.344025 148225.103777 \n", - "98 2023-11-17 99391.298954 0.344025 148283.225036 \n", - "99 2023-11-20 99391.298954 0.344025 148810.360221 \n", - "100 2023-11-21 99391.298954 0.344025 149098.605958 \n", - "101 2023-11-22 99391.298954 0.344025 149217.563787 \n", - "102 2023-11-23 99391.298954 0.344025 149021.389554 \n", - "103 2023-11-24 99391.298954 0.344025 149021.389554 \n", - "104 2023-11-27 99391.298954 0.344025 148469.707299 \n", - "105 2023-11-28 99391.298954 0.344025 149385.489798 \n", - "106 2023-11-29 99391.298954 0.344025 149184.528218 \n", - "107 2023-11-30 99391.298954 0.344025 146756.960967 \n", - "108 2023-12-01 99391.298954 0.344025 147193.498346 \n", - "109 2023-12-04 99365.884925 0.353879 147532.820499 \n", - "110 2023-12-05 99419.284497 0.375816 149132.419628 \n", - "111 2023-12-06 99419.284497 0.375816 142708.229693 \n", - "112 2023-12-07 99404.980553 0.380111 148037.723427 \n", - "113 2023-12-08 99404.980553 0.380111 148811.446979 \n", - "114 2023-12-11 99404.980553 0.380111 149323.004875 \n", - "115 2023-12-12 99404.980553 0.380111 149507.150218 \n", - "116 2023-12-13 99404.980553 0.380111 150834.613272 \n", - "117 2023-12-14 99361.163948 0.418972 157670.481381 \n", - "118 2023-12-15 99361.163948 0.418972 157963.858161 \n", - "119 2023-12-18 99361.163948 0.418972 158310.515081 \n", - "120 2023-12-19 99361.163948 0.418972 160050.482770 \n", - "121 2023-12-20 99361.163948 0.418972 156571.738188 \n", - "122 2023-12-21 99361.163948 0.418972 159207.358258 \n", - "123 2023-12-22 99361.163948 0.418972 159085.638345 \n", - "124 2023-12-25 99361.163948 0.418972 160740.131898 \n", - "125 2023-12-26 99361.163948 0.418972 160740.131898 \n", - "126 2023-12-27 99361.163948 0.418972 161988.008691 \n", - "127 2023-12-28 99361.163948 0.418972 161421.153435 \n", - "128 2023-12-29 99361.163948 0.418972 159406.086530 \n", - "129 2024-01-01 99361.163948 0.418972 156831.096218 \n", - "130 2024-01-02 99361.163948 0.418972 156831.096218 \n", - "131 2024-01-03 99361.163948 0.418972 152582.325869 \n", - "132 2024-01-04 99361.163948 0.418972 151896.988451 \n", - "133 2024-01-05 99361.163948 0.418972 152212.489704 \n", - "134 2024-01-08 99361.163948 0.418972 155550.045241 \n", - "135 2024-01-09 99361.163948 0.418972 154972.878948 \n", - "136 2024-01-10 99361.163948 0.418972 155537.707205 \n", - "137 2024-01-11 99361.163948 0.418972 154419.912171 \n", - "138 2024-01-12 99361.163948 0.418972 151554.953906 \n", - "139 2024-01-15 99361.163948 0.418972 152962.274528 \n", - "140 2024-01-16 99442.256083 0.451120 153029.268556 \n", - "141 2024-01-17 99447.565994 0.455414 143642.933112 \n", - "142 2024-01-18 99447.565994 0.455414 144195.645727 \n", - "143 2024-01-19 99447.565994 0.455414 147663.736694 \n", - "144 2024-01-22 99447.565994 0.455414 148251.077098 \n", - "145 2024-01-23 99447.565994 0.455414 147493.731173 \n", - "146 2024-01-24 99447.565994 0.455414 147834.727317 \n", - "147 2024-01-25 99447.565994 0.455414 149485.814740 \n", - "148 2024-01-26 99447.565994 0.455414 148195.374872 \n", - "149 2024-01-29 99447.565994 0.455414 148817.706765 \n", - "150 2024-01-30 99417.828501 0.463927 151100.762114 \n", - "151 2024-01-31 99417.828501 0.463927 149263.410295 \n", - "152 2024-02-01 99417.828501 0.463927 150336.865266 \n", - "153 2024-02-02 99417.828501 0.463927 150261.399456 \n", - "154 2024-02-05 99417.828501 0.463927 150739.615389 \n", - "155 2024-02-06 99417.828501 0.463927 150858.638501 \n", - "156 2024-02-07 99417.828501 0.463927 151930.100050 \n", - "157 2024-02-08 99417.828501 0.463927 153723.343757 \n", - "158 2024-02-09 99417.828501 0.463927 153573.659654 \n", - "159 2024-02-12 99346.026452 0.484109 161568.912823 \n", - "160 2024-02-13 99417.792736 0.504290 159112.781459 \n", - "161 2024-02-14 99417.792736 0.504290 153597.857872 \n", - "162 2024-02-15 99417.792736 0.504290 154049.569049 \n", - "163 2024-02-16 99504.719301 0.524130 153174.512097 \n", - "164 2024-02-19 99504.719301 0.524130 144463.651311 \n", - "165 2024-02-20 99504.719301 0.524130 144463.651311 \n", - "166 2024-02-21 99504.719301 0.524130 143142.895420 \n", - "167 2024-02-22 99504.719301 0.524130 145539.266426 \n", - "168 2024-02-23 99504.719301 0.524130 145666.522859 \n", - "169 2024-02-26 99504.719301 0.524130 144306.596005 \n", - "170 2024-02-27 99504.719301 0.524130 146542.198386 \n", - "171 2024-02-28 99504.719301 0.524130 145918.977267 \n", - "172 2024-02-29 99504.719301 0.524130 148464.512755 \n", - "173 2024-03-01 99504.719301 0.524130 147806.293797 \n", - "174 2024-03-04 99504.719301 0.524130 147995.242529 \n", - "175 2024-03-05 99550.558044 0.534982 147627.754532 \n", - "176 2024-03-06 99550.558044 0.534982 142204.278998 \n", - "177 2024-03-07 99550.558044 0.534982 143249.664724 \n", - "178 2024-03-08 99550.558044 0.534982 143249.108616 \n", - "179 2024-03-11 99550.558044 0.534982 143031.921212 \n", - "180 2024-03-12 99550.558044 0.534982 143535.179522 \n", - "181 2024-03-13 99550.558044 0.534982 143513.153052 \n", - "182 2024-03-14 99550.558044 0.534982 142892.235868 \n", - "183 2024-03-15 99556.401516 0.539013 142528.126587 \n", - "184 2024-03-18 99556.401516 0.539013 142814.993488 \n", - "185 2024-03-19 99556.401516 0.539013 142770.746184 \n", - "186 2024-03-20 99556.401516 0.539013 143567.653988 \n", - "187 2024-03-21 99556.401516 0.539013 144689.425069 \n", - "188 2024-03-22 99556.401516 0.539013 144290.799380 \n", - "189 2024-03-25 99556.401516 0.539013 144387.016603 \n", - "190 2024-03-26 99556.401516 0.539013 145202.508543 \n", - "191 2024-03-27 99556.401516 0.539013 145683.741538 \n", - "192 2024-03-28 99556.401516 0.539013 146434.469549 \n", - "193 2024-03-29 99556.401516 0.539013 146434.469549 \n", - "194 2024-04-01 99556.401516 0.539013 145458.337540 \n", - "195 2024-04-02 99556.401516 0.539013 145334.384128 \n", - "196 2024-04-03 99556.401516 0.539013 144699.315154 \n", - "197 2024-04-04 99556.401516 0.539013 142351.554461 \n", - "198 2024-04-05 99556.401516 0.539013 143555.515678 \n", - "199 2024-04-08 99556.401516 0.539013 144387.827079 \n", - "200 2024-04-09 99556.401516 0.539013 144874.836472 \n", - "201 2024-04-10 99556.401516 0.539013 143064.567888 \n", - "202 2024-04-11 99556.401516 0.539013 143254.753223 \n", - "203 2024-04-12 99591.423018 0.548867 141596.628277 \n", - "204 2024-04-15 99591.423018 0.548867 137948.564989 \n", - "205 2024-04-16 99591.423018 0.548867 136947.021804 \n", - "206 2024-04-17 99591.423018 0.548867 135761.310622 \n", - "207 2024-04-18 99591.423018 0.548867 136181.702358 \n", - "208 2024-04-19 99591.423018 0.548867 135418.202035 \n", - "209 2024-04-22 99591.423018 0.548867 136145.648708 \n", - "210 2024-04-23 99591.423018 0.548867 138559.112105 \n", - "211 2024-04-24 99591.423018 0.548867 138450.115385 \n", - "212 2024-04-25 99591.423018 0.548867 137868.811522 \n", - "213 2024-04-26 99591.423018 0.548867 138627.035298 \n", - "214 2024-04-29 99591.423018 0.548867 138766.419882 \n", - "215 2024-04-30 99591.423018 0.548867 137598.568586 \n", - "216 2024-05-01 99591.423018 0.548867 136353.608593 \n", - "217 2024-05-02 99591.423018 0.548867 137732.484515 \n", - "218 2024-05-03 99591.423018 0.548867 138771.313675 \n", - "219 2024-05-06 99591.423018 0.548867 140433.771536 \n", - "220 2024-05-07 99591.423018 0.548867 138995.632777 \n", - "221 2024-05-08 99591.423018 0.548867 138882.910172 \n", - "222 2024-05-09 99591.423018 0.548867 139135.420950 \n", - "223 2024-05-10 99591.423018 0.548867 139095.267467 \n", - "224 2024-05-13 99521.139270 0.568787 146181.298560 \n", - "225 2024-05-14 99521.139270 0.568787 146893.261012 \n", - "226 2024-05-15 99521.139270 0.568787 147771.332699 \n", - "227 2024-05-16 99521.139270 0.568787 148270.990915 \n", - "228 2024-05-17 99521.139270 0.568787 148455.553701 \n", - "229 2024-05-20 99521.139270 0.568787 148012.035512 \n", - "230 2024-05-21 99521.139270 0.568787 148971.276818 \n", - "231 2024-05-22 99521.139270 0.568787 149192.515117 \n", - "232 2024-05-23 99521.139270 0.568787 147304.145173 \n", - "233 2024-05-24 99521.139270 0.568787 148201.732512 \n", - "234 2024-05-27 99521.139270 0.568787 148621.697221 \n", - "235 2024-05-28 99521.139270 0.568787 148621.697221 \n", - "236 2024-05-29 99521.139270 0.568787 147610.160493 \n", - "237 2024-05-30 99521.139270 0.568787 147656.651454 \n", - "238 2024-05-31 99521.139270 0.568787 149828.176007 \n", - "239 2024-06-03 99521.139270 0.568787 149476.964282 \n", - "240 2024-06-04 99521.139270 0.568787 149511.136671 \n", - "241 2024-06-05 99521.139270 0.568787 149637.998879 \n", - "242 2024-06-06 99521.139270 0.568787 149192.295817 \n", - "243 2024-06-07 99521.139270 0.568787 150033.471204 \n", - "244 2024-06-10 99521.139270 0.568787 149695.285141 \n", - "245 2024-06-11 99521.139270 0.568787 150359.158135 \n", - "246 2024-06-12 99521.139270 0.568787 150998.761224 \n", - "247 2024-06-13 99521.139270 0.568787 150780.471881 \n", - "248 2024-06-14 99521.139270 0.568787 150650.816066 \n", - "249 2024-06-17 99521.139270 0.568787 151326.325119 \n", - "250 2024-06-18 99521.139270 0.568787 151820.837465 \n", - "251 2024-06-19 99521.139270 0.568787 151656.588464 \n", - "252 2024-06-20 99521.139270 0.568787 151656.588464 \n", - "253 2024-06-21 99521.139270 0.568787 150880.973152 \n", - "254 2024-06-24 99521.139270 0.568787 150456.172348 \n", - "255 2024-06-25 99521.139270 0.568787 150772.289791 \n", - "256 2024-06-26 99521.139270 0.568787 150833.185658 \n", - "257 2024-06-27 99521.139270 0.568787 151218.630111 \n", - "258 2024-06-28 99521.139270 0.568787 150832.897482 \n", - "259 2024-07-01 100034.276407 0.673411 151347.990030 " - ] - }, - "execution_count": 136, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pd.set_option('display.max_rows', 270)\n", - "pd.set_option('display.max_columns', 270)\n", - "avail = 9100\n", - "boght = 9085\n", - "market_value = 9805 + (avail - boght)\n", - "pd.DataFrame(evb_backtest.portfolio.all_holdings)#.set_index('datetime').plot(y = 'AMD')" - ] - }, - { - "cell_type": "code", - "execution_count": 146, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
SizeEntryBarExitBarEntryPriceExitPricePnLReturnPctEntryTimeExitTimeDurationTicker
442.0504.0585.0279.795877210.600006-2906.226592-0.2473082023-07-052023-10-27114 daysTSLA
2237.0599.0638.0240.328221215.100006-933.443933-0.1049742023-11-162024-01-1661 daysTSLA
\n", - "
" - ], - "text/plain": [ - " Size EntryBar ExitBar EntryPrice ExitPrice PnL ReturnPct \\\n", - "4 42.0 504.0 585.0 279.795877 210.600006 -2906.226592 -0.247308 \n", - "22 37.0 599.0 638.0 240.328221 215.100006 -933.443933 -0.104974 \n", - "\n", - " EntryTime ExitTime Duration Ticker \n", - "4 2023-07-05 2023-10-27 114 days TSLA \n", - "22 2023-11-16 2024-01-16 61 days TSLA " - ] - }, - "execution_count": 146, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "0.1, 0.1, 0.1, 0.1\n", - "trades_[trades_['Ticker'] == 'TSLA']" - ] - }, - { - "cell_type": "code", - "execution_count": 150, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
TickerPnLEntryPriceExitPriceReturnPctQuantityEntryTimeExitTimeDurationPositions
0MSFT-3439.157496935.689267580.801221-37.9279819.6908242023-07-052023-10-0491&L:MSFT20240621C350&S:MSFT20240621C370
1AAPL-4647.365902993.984027339.122368-65.8825137.0967142023-07-052023-10-26113&L:AAPL20240621C205&S:AAPL20240621C235
2AMZN-573.710002974.733142772.235510-20.7746742.8331692023-07-052023-10-26113&L:AMZN20240621C125&S:AMZN20240621C145
3TSLA-7317.067788998.258574364.781465-63.45821911.5506432023-07-052023-10-27114&L:TSLA20240621C290&S:TSLA20240621C316.67
4GOOG709.401108996.0893361178.46945818.3096153.8896842023-07-052024-03-05244&L:GOOG20240621C125&S:GOOG20240621C150
5AMD12948.895694983.0715702511.881480155.5135928.4699192023-07-052024-07-01362&L:AMD20240621C110&S:AMD20240621C135
6QCOM-702.845564876.991636539.989049-38.4271152.0855792023-08-012023-08-098&L:QCOM20240621C135&S:QCOM20240621C160
7BA-382.529321961.313667703.778435-26.7899271.4853482023-08-032023-09-1139&L:BA20240621C230&S:BA20240621C250
8INTC-250.757931395.537755196.065779-50.4305781.2571092023-09-122023-10-2442&L:INTC20240621C40&S:INTC20240621C55
9MU-573.765282609.060371420.848406-30.9020213.0485062023-09-142023-10-2743&L:MU20240621C70&S:MU20240621C85
10AAPL1677.293340986.5250771222.39197423.9088607.1111862023-11-032024-02-16105&L:AAPL20240920C175&S:AAPL20240920C195
11QCOM2977.964592847.2442612225.548631162.6808742.1606002023-11-082024-07-01236&L:QCOM20250117C125&S:QCOM20250117C150
12SBUX-1849.100921914.322659679.149309-25.7210467.8627152023-11-082023-12-0527&L:SBUX20250117C100&S:SBUX20250117C120
13AMZN2510.726523998.1722761911.29691391.4796632.7495992023-11-142024-07-01230&L:AMZN20240920C140&S:AMZN20240920C160
14INTC86.119539344.869537404.48084617.2851771.4446852023-11-142024-03-15122&L:INTC20240920C40&S:INTC20240920C50
15TSLA-3394.903889998.410885703.776464-29.51033711.5224282023-11-162024-01-1661&L:TSLA20240920C280&S:TSLA20240920C320
16HD960.747373719.554213991.57319637.8038213.5319132023-12-042024-04-12130&L:HD20250117C350&S:HD20250117C370
17BA-899.403260929.256859344.958783-62.8779941.5392882023-12-072024-01-1741&L:BA20250117C280&S:BA20250117C320
18BAC3419.672922314.578896560.09242078.04513513.9286542023-12-142024-07-01200&L:BAC20250117C35&S:BAC20250117C50
19DIS-529.286458974.565168801.105978-17.7986243.0513602024-01-302024-07-01153&L:DIS20250117C100&S:DIS20250117C145
20SBUX-3.576490992.647593992.153151-0.0498107.2333882024-02-122024-02-131&L:SBUX20250117C95&S:SBUX20250117C145
21AAPL2700.289868984.4138511362.62400938.4198337.1396552024-05-132024-07-0149&L:AAPL20250620C185&S:AAPL20250620C205
\n", - "
" - ], - "text/plain": [ - " Ticker PnL EntryPrice ExitPrice ReturnPct Quantity \\\n", - "0 MSFT -3439.157496 935.689267 580.801221 -37.927981 9.690824 \n", - "1 AAPL -4647.365902 993.984027 339.122368 -65.882513 7.096714 \n", - "2 AMZN -573.710002 974.733142 772.235510 -20.774674 2.833169 \n", - "3 TSLA -7317.067788 998.258574 364.781465 -63.458219 11.550643 \n", - "4 GOOG 709.401108 996.089336 1178.469458 18.309615 3.889684 \n", - "5 AMD 12948.895694 983.071570 2511.881480 155.513592 8.469919 \n", - "6 QCOM -702.845564 876.991636 539.989049 -38.427115 2.085579 \n", - "7 BA -382.529321 961.313667 703.778435 -26.789927 1.485348 \n", - "8 INTC -250.757931 395.537755 196.065779 -50.430578 1.257109 \n", - "9 MU -573.765282 609.060371 420.848406 -30.902021 3.048506 \n", - "10 AAPL 1677.293340 986.525077 1222.391974 23.908860 7.111186 \n", - "11 QCOM 2977.964592 847.244261 2225.548631 162.680874 2.160600 \n", - "12 SBUX -1849.100921 914.322659 679.149309 -25.721046 7.862715 \n", - "13 AMZN 2510.726523 998.172276 1911.296913 91.479663 2.749599 \n", - "14 INTC 86.119539 344.869537 404.480846 17.285177 1.444685 \n", - "15 TSLA -3394.903889 998.410885 703.776464 -29.510337 11.522428 \n", - "16 HD 960.747373 719.554213 991.573196 37.803821 3.531913 \n", - "17 BA -899.403260 929.256859 344.958783 -62.877994 1.539288 \n", - "18 BAC 3419.672922 314.578896 560.092420 78.045135 13.928654 \n", - "19 DIS -529.286458 974.565168 801.105978 -17.798624 3.051360 \n", - "20 SBUX -3.576490 992.647593 992.153151 -0.049810 7.233388 \n", - "21 AAPL 2700.289868 984.413851 1362.624009 38.419833 7.139655 \n", - "\n", - " EntryTime ExitTime Duration Positions \n", - "0 2023-07-05 2023-10-04 91 &L:MSFT20240621C350&S:MSFT20240621C370 \n", - "1 2023-07-05 2023-10-26 113 &L:AAPL20240621C205&S:AAPL20240621C235 \n", - "2 2023-07-05 2023-10-26 113 &L:AMZN20240621C125&S:AMZN20240621C145 \n", - "3 2023-07-05 2023-10-27 114 &L:TSLA20240621C290&S:TSLA20240621C316.67 \n", - "4 2023-07-05 2024-03-05 244 &L:GOOG20240621C125&S:GOOG20240621C150 \n", - "5 2023-07-05 2024-07-01 362 &L:AMD20240621C110&S:AMD20240621C135 \n", - "6 2023-08-01 2023-08-09 8 &L:QCOM20240621C135&S:QCOM20240621C160 \n", - "7 2023-08-03 2023-09-11 39 &L:BA20240621C230&S:BA20240621C250 \n", - "8 2023-09-12 2023-10-24 42 &L:INTC20240621C40&S:INTC20240621C55 \n", - "9 2023-09-14 2023-10-27 43 &L:MU20240621C70&S:MU20240621C85 \n", - "10 2023-11-03 2024-02-16 105 &L:AAPL20240920C175&S:AAPL20240920C195 \n", - "11 2023-11-08 2024-07-01 236 &L:QCOM20250117C125&S:QCOM20250117C150 \n", - "12 2023-11-08 2023-12-05 27 &L:SBUX20250117C100&S:SBUX20250117C120 \n", - "13 2023-11-14 2024-07-01 230 &L:AMZN20240920C140&S:AMZN20240920C160 \n", - "14 2023-11-14 2024-03-15 122 &L:INTC20240920C40&S:INTC20240920C50 \n", - "15 2023-11-16 2024-01-16 61 &L:TSLA20240920C280&S:TSLA20240920C320 \n", - "16 2023-12-04 2024-04-12 130 &L:HD20250117C350&S:HD20250117C370 \n", - "17 2023-12-07 2024-01-17 41 &L:BA20250117C280&S:BA20250117C320 \n", - "18 2023-12-14 2024-07-01 200 &L:BAC20250117C35&S:BAC20250117C50 \n", - "19 2024-01-30 2024-07-01 153 &L:DIS20250117C100&S:DIS20250117C145 \n", - "20 2024-02-12 2024-02-13 1 &L:SBUX20250117C95&S:SBUX20250117C145 \n", - "21 2024-05-13 2024-07-01 49 &L:AAPL20250620C185&S:AAPL20250620C205 " - ] - }, - "execution_count": 150, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "(evb_backtest.trades)" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
OpenHighLowCloseVolumeBid_sizeCloseBidAsk_sizeCloseAskMidpointWeighted_midpoint
Datetime
2023-07-244.164.134.054.07-9-1345.85384.155.0005.381509
2023-07-244.164.134.054.07-9-1345.85384.155.0005.381509
2023-07-254.254.253.933.91-319823.30274.353.8253.857051
2023-07-254.254.253.933.91-319823.30274.353.8253.857051
2023-07-262.883.122.883.12-910183.02-1913.053.0352.938961
2023-07-262.883.122.883.12-910183.02-1913.053.0352.938961
2023-07-272.882.852.702.85-25-233.07143.103.0853.114296
2023-07-272.882.852.702.85-25-233.07143.103.0853.114296
2023-07-282.662.692.652.64174621.1062.771.9351.839688
2023-07-282.662.692.652.64174621.1062.771.9351.839688
\n", - "
" - ], - "text/plain": [ - " Open High Low Close Volume Bid_size CloseBid Ask_size \\\n", - "Datetime \n", - "2023-07-24 4.16 4.13 4.05 4.07 -9 -134 5.85 38 \n", - "2023-07-24 4.16 4.13 4.05 4.07 -9 -134 5.85 38 \n", - "2023-07-25 4.25 4.25 3.93 3.91 -3198 2 3.30 27 \n", - "2023-07-25 4.25 4.25 3.93 3.91 -3198 2 3.30 27 \n", - "2023-07-26 2.88 3.12 2.88 3.12 -910 18 3.02 -191 \n", - "2023-07-26 2.88 3.12 2.88 3.12 -910 18 3.02 -191 \n", - "2023-07-27 2.88 2.85 2.70 2.85 -25 -23 3.07 14 \n", - "2023-07-27 2.88 2.85 2.70 2.85 -25 -23 3.07 14 \n", - "2023-07-28 2.66 2.69 2.65 2.64 174 62 1.10 6 \n", - "2023-07-28 2.66 2.69 2.65 2.64 174 62 1.10 6 \n", - "\n", - " CloseAsk Midpoint Weighted_midpoint \n", - "Datetime \n", - "2023-07-24 4.15 5.000 5.381509 \n", - "2023-07-24 4.15 5.000 5.381509 \n", - "2023-07-25 4.35 3.825 3.857051 \n", - "2023-07-25 4.35 3.825 3.857051 \n", - "2023-07-26 3.05 3.035 2.938961 \n", - "2023-07-26 3.05 3.035 2.938961 \n", - "2023-07-27 3.10 3.085 3.114296 \n", - "2023-07-27 3.10 3.085 3.114296 \n", - "2023-07-28 2.77 1.935 1.839688 \n", - "2023-07-28 2.77 1.935 1.839688 " - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.portfolio.options_data['GOOGL20240621P115'] - evb_backtest.portfolio.options_data['GOOGL20240621P100']" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'AAPL20240312000145C'" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from trade.helpers.helper import generate_option_tick\n", - "import pandas as pd\n", - "\n", - "tick = 'AAPL'\n", - "exp = '2024-03-12'\n", - "right = 'C'\n", - "strike = 145.0\n", - "option_tick = generate_option_tick(tick, right, exp, strike)\n", - "option_tick\n" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'GOOGL': {}, 'AMD': {}, 'MSFT': {}}" - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.portfolio.current_positions" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " 53676519 function calls (52386882 primitive calls) in 216.194 seconds\n", - "\n", - " Ordered by: cumulative time\n", - " List reduced from 2937 to 20 due to restriction <20>\n", - "\n", - " ncalls tottime percall cumtime percall filename:lineno(function)\n", - " 2 0.000 0.000 216.195 108.097 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/IPython/core/interactiveshell.py:3541(run_code)\n", - " 2 0.000 0.000 216.195 108.097 {built-in method builtins.exec}\n", - " 1 0.000 0.000 216.195 216.195 /var/folders/j0/80hkbygd4lb27h9mw76gqzpw0000gn/T/ipykernel_40825/2620833521.py:1()\n", - " 1 0.003 0.003 216.195 216.195 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/backtest.py:55(run)\n", - " 21 0.000 0.000 215.775 10.275 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:270(update_signal)\n", - " 21 0.003 0.000 215.775 10.275 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:225(generate_order_new)\n", - " 10 0.018 0.002 215.750 21.575 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:365(get_order)\n", - " 10 0.003 0.000 135.667 13.567 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:278(produce_order_candidates)\n", - " 20 0.012 0.001 135.663 6.783 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:124(chain_details)\n", - " 162 0.013 0.000 132.339 0.817 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:672(is_USholiday)\n", - " 162 0.010 0.000 131.870 0.814 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas_market_calendars/calendars/nyse.py:1276(valid_days)\n", - " 162 0.004 0.000 131.685 0.813 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas_market_calendars/market_calendar.py:570(valid_days)\n", - " 162 15.094 0.093 131.573 0.812 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas_market_calendars/market_calendar.py:553(holidays)\n", - " 142 0.059 0.000 117.322 0.826 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:684(change_to_last_busday)\n", - " 162 0.019 0.000 104.041 0.642 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/holiday.py:443(holidays)\n", - " 162 0.101 0.001 103.277 0.638 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/holiday.py:476()\n", - " 4698 0.448 0.000 103.176 0.022 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/holiday.py:249(dates)\n", - " 10 0.002 0.000 59.197 5.920 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:99(load_chain)\n", - " 17 0.003 0.000 57.407 3.377 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:81(__init__)\n", - " 5078 0.098 0.000 57.090 0.011 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:821(date_range)\n", - "\n", - "\n", - "\n" - ] - } - ], - "source": [ - "stats.print_stats(20) # Show the top 20 functions by cumulative time\n", - "print(stream.getvalue())" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "ename": "KeyError", - "evalue": "'option'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[27], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m trades \u001b[38;5;241m=\u001b[39m \u001b[43mevb_backtest\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mportfolio\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_trades\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2\u001b[0m \u001b[38;5;28mprint\u001b[39m(trades\u001b[38;5;241m.\u001b[39mto_string())\n", - "File \u001b[0;32m~/cloned_repos/QuantTools/EventDriven/portfolio.py:613\u001b[0m, in \u001b[0;36mOptionSignalPortfolio.get_trades\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 611\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m ticker \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mdatetime\u001b[39m\u001b[38;5;124m'\u001b[39m:\n\u001b[1;32m 612\u001b[0m \u001b[38;5;28;01mcontinue\u001b[39;00m\n\u001b[0;32m--> 613\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[43mdata\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43moption\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mexit_price\u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;129;01min\u001b[39;00m data \u001b[38;5;129;01mand\u001b[39;00m data[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124moption\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m visited_option_id:\n\u001b[1;32m 614\u001b[0m entry_price_obj \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mnext\u001b[39m((pos \u001b[38;5;28;01mfor\u001b[39;00m pos \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mall_positions \u001b[38;5;28;01mif\u001b[39;00m pos[ticker][\u001b[38;5;124m'\u001b[39m\u001b[38;5;124moption\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m==\u001b[39m data[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124moption\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mentry_price\u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;129;01min\u001b[39;00m pos[ticker]), {})\n\u001b[1;32m 615\u001b[0m entry_price \u001b[38;5;241m=\u001b[39m entry_price_obj[ticker][\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mentry_price\u001b[39m\u001b[38;5;124m'\u001b[39m]\n", - "\u001b[0;31mKeyError\u001b[0m: 'option'" - ] - } - ], - "source": [ - "trades = evb_backtest.portfolio.get_trades()\n", - "print(trades.to_string())" - ] - }, - { - "cell_type": "code", - "execution_count": 80, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " AMD MSFT AMZN GOOGL AAPL cash commission total\n", - "datetime \n", - "2024-03-05 0.0 0.0 0.0 0.0 0.0 100000.0 0.0 100000.0\n", - "2024-03-05 0.0 0.0 0.0 0.0 0.0 100000.0 0.0 100000.0\n", - "2024-03-05 3680.0 0.0 0.0 0.0 0.0 96320.0 0.0 100000.0\n", - "2024-03-05 3680.0 1624.0 0.0 0.0 0.0 94696.0 0.0 100000.0\n", - "2024-03-05 3680.0 1624.0 416.0 0.0 0.0 94280.0 0.0 100000.0\n", - "2024-03-06 4596.0 1402.0 0.0 0.0 0.0 94280.0 0.0 100278.0\n", - "2024-03-07 4804.0 1770.0 0.0 0.0 0.0 94280.0 0.0 100854.0\n", - "2024-03-08 4630.0 1880.0 0.0 0.0 0.0 94280.0 0.0 100790.0\n", - "2024-03-11 3746.0 0.0 380.0 0.0 0.0 94280.0 0.0 98406.0\n", - "2024-03-12 3310.0 1990.0 378.0 0.0 0.0 94280.0 0.0 99958.0\n", - "2024-03-13 3178.0 2096.0 390.0 0.0 0.0 94280.0 0.0 99944.0\n", - "2024-03-13 3178.0 2096.0 390.0 540.0 0.0 93740.0 0.0 99944.0\n", - "2024-03-14 2710.0 2790.0 424.0 650.0 0.0 93740.0 0.0 100314.0\n", - "2024-03-15 2640.0 0.0 358.0 590.0 0.0 93740.0 0.0 97328.0\n", - "2024-03-18 0.0 2270.0 328.0 1130.0 0.0 93740.0 0.0 97468.0\n", - "2024-03-19 1862.0 2240.0 0.0 840.0 0.0 93740.0 0.0 98682.0\n", - "2024-03-20 1600.0 2370.0 0.0 0.0 0.0 93740.0 0.0 97710.0\n", - "2024-03-20 -1600.0 2370.0 0.0 0.0 0.0 95340.0 0.0 96110.0\n", - "2024-03-21 -1960.0 2820.0 376.0 890.0 0.0 95340.0 0.0 97466.0\n", - "2024-03-21 3760.0 2820.0 376.0 890.0 0.0 91580.0 0.0 99426.0\n", - "2024-03-22 3454.0 2750.0 376.0 1040.0 0.0 91580.0 0.0 99200.0\n", - "2024-03-25 3764.0 0.0 0.0 940.0 0.0 91580.0 0.0 96284.0\n", - "2024-03-26 3900.0 0.0 0.0 1092.0 0.0 91580.0 0.0 96572.0\n", - "2024-03-27 3500.0 2074.0 0.0 974.0 0.0 91580.0 0.0 98128.0\n", - "2024-03-28 3784.0 2020.0 0.0 0.0 0.0 91580.0 0.0 97384.0\n", - "2024-03-29 3784.0 2020.0 0.0 0.0 0.0 91580.0 0.0 97384.0\n", - "2024-04-01 4030.0 2110.0 0.0 1280.0 0.0 91580.0 0.0 99000.0\n", - "2024-04-02 3252.0 0.0 368.0 1180.0 0.0 91580.0 0.0 96380.0\n", - "2024-04-03 3690.0 2094.0 368.0 1220.0 0.0 91580.0 0.0 98952.0\n", - "2024-04-04 2600.0 2320.0 0.0 1150.0 0.0 91580.0 0.0 97650.0\n", - "2024-04-05 2920.0 2070.0 476.0 1100.0 0.0 91580.0 0.0 98146.0\n", - "2024-04-08 2786.0 0.0 540.0 1240.0 0.0 91580.0 0.0 96146.0\n", - "2024-04-09 2660.0 0.0 0.0 1362.0 0.0 91580.0 0.0 95602.0\n", - "2024-04-10 2610.0 1980.0 0.0 1350.0 0.0 91580.0 0.0 97520.0\n", - "2024-04-11 2500.0 2230.0 0.0 1480.0 0.0 91580.0 0.0 97790.0\n", - "2024-04-12 2230.0 0.0 0.0 1458.0 0.0 91580.0 0.0 95268.0\n", - "2024-04-15 2064.0 1744.0 0.0 1500.0 0.0 91580.0 0.0 96888.0\n", - "2024-04-15 -2064.0 1744.0 0.0 1500.0 0.0 93644.0 0.0 94824.0\n", - "2024-04-16 -0.0 1770.0 0.0 1180.0 0.0 93644.0 0.0 96594.0\n", - "2024-04-16 3320.0 1770.0 0.0 1180.0 0.0 90324.0 0.0 96594.0\n", - "2024-04-17 2694.0 1650.0 350.0 1322.0 0.0 90324.0 0.0 96340.0\n", - "2024-04-18 2608.0 1256.0 350.0 1324.0 0.0 90324.0 0.0 95862.0\n", - "2024-04-19 2050.0 1060.0 282.0 1158.0 0.0 90324.0 0.0 94874.0\n", - "2024-04-22 2030.0 900.0 252.0 1268.0 0.0 90324.0 0.0 94774.0\n", - "2024-04-22 -2030.0 900.0 252.0 1268.0 0.0 92354.0 0.0 92744.0\n", - "2024-04-23 -2250.0 1042.0 0.0 1340.0 0.0 92354.0 0.0 92486.0\n", - "2024-04-23 -2250.0 1042.0 0.0 1340.0 0.0 94604.0 0.0 94736.0\n", - "2024-04-24 -2270.0 1080.0 0.0 1370.0 0.0 94604.0 0.0 94784.0\n", - "2024-04-24 -2270.0 1080.0 0.0 1370.0 0.0 96874.0 0.0 97054.0\n", - "2024-04-25 -2310.0 908.0 0.0 1230.0 0.0 96874.0 0.0 96702.0\n", - "2024-04-25 -2310.0 908.0 0.0 1230.0 0.0 99184.0 0.0 99012.0\n", - "2024-04-26 -2504.0 932.0 282.0 2580.0 0.0 99184.0 0.0 100474.0\n", - "2024-04-26 -2504.0 932.0 282.0 2580.0 0.0 101688.0 0.0 102978.0\n", - "2024-04-29 -2764.0 660.0 0.0 1850.0 0.0 101688.0 0.0 101434.0\n", - "2024-04-29 -2764.0 660.0 0.0 1850.0 0.0 104452.0 0.0 104198.0\n", - "2024-04-30 -3060.0 558.0 310.0 1680.0 0.0 104452.0 0.0 103940.0\n", - "2024-04-30 2976.0 558.0 310.0 1680.0 0.0 101476.0 0.0 107000.0\n", - "2024-05-01 1890.0 494.0 250.0 1850.0 0.0 101476.0 0.0 105960.0\n", - "2024-05-02 1660.0 474.0 246.0 1780.0 0.0 101476.0 0.0 105636.0\n", - "2024-05-02 1660.0 -474.0 246.0 1780.0 0.0 101950.0 0.0 105162.0\n", - "2024-05-03 1860.0 -610.0 272.0 1948.0 0.0 101950.0 0.0 105420.0\n", - "2024-05-03 -1860.0 -610.0 272.0 1948.0 0.0 103810.0 0.0 103560.0\n", - "2024-05-03 -1860.0 0.0 272.0 1948.0 0.0 103810.0 0.0 104170.0\n", - "2024-05-06 -2260.0 0.0 250.0 1920.0 0.0 103810.0 0.0 103720.0\n", - "2024-05-06 -2260.0 0.0 250.0 1920.0 0.0 106070.0 0.0 105980.0\n", - "2024-05-07 -2186.0 3310.0 282.0 2340.0 0.0 106070.0 0.0 109816.0\n", - "2024-05-07 -2186.0 3310.0 282.0 2340.0 0.0 108256.0 0.0 112002.0\n", - "2024-05-08 -2160.0 0.0 254.0 2114.0 0.0 108256.0 0.0 108464.0\n", - "2024-05-08 0.0 0.0 254.0 2114.0 0.0 108256.0 0.0 110624.0\n", - "2024-05-09 4750.0 3196.0 304.0 2010.0 0.0 108256.0 0.0 118516.0\n", - "2024-05-09 -4750.0 3196.0 304.0 2010.0 0.0 113006.0 0.0 113766.0\n", - "2024-05-10 -0.0 0.0 232.0 1970.0 0.0 113006.0 0.0 115208.0\n", - "2024-05-10 -0.0 0.0 232.0 1970.0 0.0 113006.0 0.0 115208.0\n", - "2024-05-13 -4778.0 0.0 0.0 1680.0 0.0 113006.0 0.0 109908.0\n", - "2024-05-13 -4778.0 0.0 0.0 1680.0 0.0 117784.0 0.0 114686.0\n", - "2024-05-14 -4660.0 0.0 190.0 2170.0 0.0 117784.0 0.0 115484.0\n", - "2024-05-14 -4660.0 0.0 190.0 2170.0 0.0 122444.0 0.0 120144.0\n", - "2024-05-15 -5004.0 3842.0 152.0 2200.0 0.0 122444.0 0.0 123634.0\n", - "2024-05-15 -5004.0 3842.0 152.0 2200.0 0.0 127448.0 0.0 128638.0\n", - "2024-05-15 -5004.0 3842.0 152.0 2200.0 444.0 127004.0 0.0 128638.0\n", - "2024-05-16 -6060.0 3900.0 192.0 2570.0 414.0 127004.0 0.0 128020.0\n", - "2024-05-16 -6060.0 3900.0 192.0 2570.0 414.0 133064.0 0.0 134080.0\n", - "2024-05-17 -0.0 0.0 156.0 2700.0 400.0 133064.0 0.0 136320.0\n", - "2024-05-17 4240.0 0.0 156.0 2700.0 400.0 128824.0 0.0 136320.0\n", - "2024-05-20 4476.0 4262.0 140.0 2832.0 444.0 128824.0 0.0 140978.0\n", - "2024-05-21 4260.0 4262.0 114.0 2850.0 452.0 128824.0 0.0 140762.0\n", - "2024-05-22 4260.0 4454.0 126.0 2696.0 468.0 128824.0 0.0 140828.0\n", - "2024-05-23 4460.0 4466.0 130.0 2340.0 344.0 128824.0 0.0 140564.0\n", - "2024-05-24 4220.0 3950.0 130.0 2570.0 376.0 128824.0 0.0 140070.0\n", - "2024-05-24 -4220.0 3950.0 130.0 2570.0 376.0 133044.0 0.0 135850.0\n", - "2024-05-24 -4220.0 -3950.0 130.0 2570.0 376.0 136994.0 0.0 131900.0\n", - "2024-05-24 -4220.0 -3950.0 -130.0 2570.0 376.0 137124.0 0.0 131770.0\n", - "2024-05-24 -4220.0 -3950.0 -130.0 -2570.0 376.0 139694.0 0.0 129200.0\n", - "2024-05-24 -4220.0 -3950.0 -130.0 -2570.0 -376.0 140070.0 0.0 128824.0\n", - "2024-05-24 -4220.0 -3950.0 -130.0 -2570.0 -376.0 140070.0 0.0 128824.0\n", - "2024-05-24 -4220.0 -3950.0 -130.0 -2570.0 -376.0 144290.0 0.0 133044.0\n", - "2024-05-24 -4220.0 -3950.0 -130.0 -2570.0 -376.0 148240.0 0.0 136994.0\n", - "2024-05-24 -4220.0 -3950.0 -130.0 -2570.0 -376.0 148370.0 0.0 137124.0\n", - "2024-05-24 -4220.0 -3950.0 -130.0 -2570.0 -376.0 150940.0 0.0 139694.0\n", - "2024-05-24 -4220.0 -3950.0 -130.0 -2570.0 -376.0 151316.0 0.0 140070.0\n" - ] - } - ], - "source": [ - "#Get all holdings\n", - "holdings = evb_backtest.get_all_holdings()\n", - "print(holdings.to_string())" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " AMD AAPL MSFT GOOGL\n", - "datetime \n", - "2024-03-04 None None None None\n", - "2024-03-04 None None None None\n", - "2024-03-05 AMD-20240816-270.0-C None MSFT-20240816-480.0-C None\n", - "2024-03-06 AMD-20240816-270.0-C None MSFT-20240816-480.0-C None\n", - "2024-03-07 AMD-20240816-270.0-C None MSFT-20240816-480.0-C None\n", - "2024-03-08 AMD-20240816-270.0-C None MSFT-20240816-480.0-C None\n", - "2024-03-11 AMD-20240816-270.0-C None MSFT-20240816-480.0-C None\n", - "2024-03-12 AMD-20240816-270.0-C None MSFT-20240816-480.0-C None\n", - "2024-03-13 AMD-20240816-270.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-03-14 AMD-20240816-270.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-03-15 AMD-20240816-270.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-03-18 AMD-20240816-270.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-03-19 AMD-20240816-270.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-03-20 None None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-03-21 AMD-20240920-240.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-03-22 AMD-20240920-240.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-03-25 AMD-20240920-240.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-03-26 AMD-20240920-240.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-03-27 AMD-20240920-240.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-03-28 AMD-20240920-240.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-03-29 AMD-20240920-240.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-04-01 AMD-20240920-240.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-04-02 AMD-20240920-240.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-04-03 AMD-20240920-240.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-04-04 AMD-20240920-240.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-04-05 AMD-20240920-240.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-04-08 AMD-20240920-240.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-04-09 AMD-20240920-240.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-04-10 AMD-20240920-240.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-04-11 AMD-20240920-240.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-04-12 AMD-20240920-240.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-04-15 None None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-04-16 AMD-20250620-220.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-04-17 AMD-20250620-220.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-04-18 AMD-20250620-220.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-04-19 AMD-20250620-220.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-04-22 None None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-04-23 None None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-04-24 None None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-04-25 None None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-04-26 None None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-04-29 None None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-04-30 AMD-20250117-200.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-05-01 AMD-20250117-200.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-05-02 AMD-20250117-200.0-C None None GOOGL-20241220-175.0-C\n", - "2024-05-03 None None MSFT-20241115-450.0-C GOOGL-20241220-175.0-C\n", - "2024-05-06 None None MSFT-20241115-450.0-C GOOGL-20241220-175.0-C\n", - "2024-05-07 None None MSFT-20241115-450.0-C GOOGL-20241220-175.0-C\n", - "2024-05-08 AMD-20250117-195.0-C None MSFT-20241115-450.0-C GOOGL-20241220-175.0-C\n", - "2024-05-09 None None MSFT-20241115-450.0-C GOOGL-20241220-175.0-C\n", - "2024-05-10 None None MSFT-20241115-450.0-C GOOGL-20241220-175.0-C\n", - "2024-05-13 None None MSFT-20241115-450.0-C GOOGL-20241220-175.0-C\n", - "2024-05-14 None None MSFT-20241115-450.0-C GOOGL-20241220-175.0-C\n", - "2024-05-15 None AAPL-20241220-210.0-C MSFT-20241115-450.0-C GOOGL-20241220-175.0-C\n", - "2024-05-16 None AAPL-20241220-210.0-C MSFT-20241115-450.0-C GOOGL-20241220-175.0-C\n", - "2024-05-17 AMD-20250117-220.0-C AAPL-20241220-210.0-C MSFT-20241115-450.0-C GOOGL-20241220-175.0-C\n", - "2024-05-20 AMD-20250117-220.0-C AAPL-20241220-210.0-C MSFT-20241115-450.0-C GOOGL-20241220-175.0-C\n", - "2024-05-21 AMD-20250117-220.0-C AAPL-20241220-210.0-C MSFT-20241115-450.0-C GOOGL-20241220-175.0-C\n", - "2024-05-22 AMD-20250117-220.0-C AAPL-20241220-210.0-C MSFT-20241115-450.0-C GOOGL-20241220-175.0-C\n", - "2024-05-23 AMD-20250117-220.0-C AAPL-20241220-210.0-C MSFT-20241115-450.0-C GOOGL-20241220-175.0-C\n", - "2024-05-24 AMD-20250117-220.0-C AAPL-20241220-210.0-C MSFT-20241115-450.0-C GOOGL-20241220-175.0-C\n", - "2024-05-24 None None None None\n" - ] - } - ], - "source": [ - "positions = evb_backtest.get_all_positions()\n", - "print(positions.to_string())" - ] - }, - { - "cell_type": "code", - "execution_count": 64, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[{'AMD': {'quantity': 0.0, 'option': None},\n", - " 'MSFT': {'quantity': 0.0, 'option': None},\n", - " 'AMZN': {'quantity': 0.0, 'option': None},\n", - " 'GOOGL': {'quantity': 0.0, 'option': None},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-03-04 00:00:00')},\n", - " {'AMD': {'quantity': 0.0, 'option': None},\n", - " 'MSFT': {'quantity': 0.0, 'option': None},\n", - " 'AMZN': {'quantity': 0.0, 'option': None},\n", - " 'GOOGL': {'quantity': 0.0, 'option': None},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-03-04 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20240920-240.0-C',\n", - " 'entry_price': 2185.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 0.0, 'option': None},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-03-05 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20240920-240.0-C',\n", - " 'entry_price': 2185.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 0.0, 'option': None},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-03-06 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20240920-240.0-C',\n", - " 'entry_price': 2185.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 0.0, 'option': None},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-03-07 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20240920-240.0-C',\n", - " 'entry_price': 2185.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 0.0, 'option': None},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-03-08 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20240920-240.0-C',\n", - " 'entry_price': 2185.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 0.0, 'option': None},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-03-11 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20240920-240.0-C',\n", - " 'entry_price': 2185.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 0.0, 'option': None},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-03-12 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20240920-240.0-C',\n", - " 'entry_price': 2185.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-03-13 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20240920-240.0-C',\n", - " 'entry_price': 2185.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-03-14 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20240920-240.0-C',\n", - " 'entry_price': 2185.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-03-15 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20240920-240.0-C',\n", - " 'entry_price': 2185.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-03-18 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20240920-240.0-C',\n", - " 'entry_price': 2185.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-03-19 00:00:00')},\n", - " {'AMD': {'quantity': -2,\n", - " 'option': 'AMD-20240920-240.0-C',\n", - " 'exit_price': 931.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-03-20 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20250117-220.0-C',\n", - " 'entry_price': 1870.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-03-21 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20250117-220.0-C',\n", - " 'entry_price': 1870.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-03-22 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20250117-220.0-C',\n", - " 'entry_price': 1870.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-03-25 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20250117-220.0-C',\n", - " 'entry_price': 1870.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-03-26 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20250117-220.0-C',\n", - " 'entry_price': 1870.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-03-27 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20250117-220.0-C',\n", - " 'entry_price': 1870.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-03-28 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20250117-220.0-C',\n", - " 'entry_price': 1870.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-03-29 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20250117-220.0-C',\n", - " 'entry_price': 1870.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-04-01 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20250117-220.0-C',\n", - " 'entry_price': 1870.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-04-02 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20250117-220.0-C',\n", - " 'entry_price': 1870.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-04-03 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20250117-220.0-C',\n", - " 'entry_price': 1870.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-04-04 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20250117-220.0-C',\n", - " 'entry_price': 1870.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-04-05 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20250117-220.0-C',\n", - " 'entry_price': 1870.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-04-08 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20250117-220.0-C',\n", - " 'entry_price': 1870.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-04-09 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20250117-220.0-C',\n", - " 'entry_price': 1870.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-04-10 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20250117-220.0-C',\n", - " 'entry_price': 1870.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-04-11 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20250117-220.0-C',\n", - " 'entry_price': 1870.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-04-12 00:00:00')},\n", - " {'AMD': {'quantity': -2,\n", - " 'option': 'AMD-20250117-220.0-C',\n", - " 'exit_price': 1247.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-04-15 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20241018-220.0-C',\n", - " 'entry_price': 725.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-04-16 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20241018-220.0-C',\n", - " 'entry_price': 725.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-04-17 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20241018-220.0-C',\n", - " 'entry_price': 725.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-04-18 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20241018-220.0-C',\n", - " 'entry_price': 725.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-04-19 00:00:00')},\n", - " {'AMD': {'quantity': -2,\n", - " 'option': 'AMD-20241018-220.0-C',\n", - " 'exit_price': 413.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-04-22 00:00:00')},\n", - " {'AMD': {'quantity': -2,\n", - " 'option': 'AMD-20241018-220.0-C',\n", - " 'exit_price': 413.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-04-23 00:00:00')},\n", - " {'AMD': {'quantity': -2,\n", - " 'option': 'AMD-20241018-220.0-C',\n", - " 'exit_price': 413.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-04-24 00:00:00')},\n", - " {'AMD': {'quantity': -2,\n", - " 'option': 'AMD-20241018-220.0-C',\n", - " 'exit_price': 413.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-04-25 00:00:00')},\n", - " {'AMD': {'quantity': -2,\n", - " 'option': 'AMD-20241018-220.0-C',\n", - " 'exit_price': 413.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-04-26 00:00:00')},\n", - " {'AMD': {'quantity': -2,\n", - " 'option': 'AMD-20241018-220.0-C',\n", - " 'exit_price': 413.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-04-29 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20241220-200.0-C',\n", - " 'entry_price': 1325.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-04-30 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20241220-200.0-C',\n", - " 'entry_price': 1325.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-05-01 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20241220-200.0-C',\n", - " 'entry_price': 1325.0},\n", - " 'MSFT': {'quantity': -2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'exit_price': 0.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-05-02 00:00:00')},\n", - " {'AMD': {'quantity': -2,\n", - " 'option': 'AMD-20241220-200.0-C',\n", - " 'exit_price': 750.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20241018-440.0-C',\n", - " 'entry_price': 1190.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-05-03 00:00:00')},\n", - " {'AMD': {'quantity': -2,\n", - " 'option': 'AMD-20241220-200.0-C',\n", - " 'exit_price': 750.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20241018-440.0-C',\n", - " 'entry_price': 1190.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-05-06 00:00:00')},\n", - " {'AMD': {'quantity': -2,\n", - " 'option': 'AMD-20241220-200.0-C',\n", - " 'exit_price': 750.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20241018-440.0-C',\n", - " 'entry_price': 1190.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-05-07 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20241220-185.0-C',\n", - " 'entry_price': 1385.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20241018-440.0-C',\n", - " 'entry_price': 1190.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-05-08 00:00:00')},\n", - " {'AMD': {'quantity': -2, 'option': 'AMD-20241220-185.0-C', 'exit_price': 0.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20241018-440.0-C',\n", - " 'entry_price': 1190.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-05-09 00:00:00')},\n", - " {'AMD': {'quantity': -2, 'option': 'AMD-20241220-185.0-C', 'exit_price': 0.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20241018-440.0-C',\n", - " 'entry_price': 1190.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-05-10 00:00:00')},\n", - " {'AMD': {'quantity': -2, 'option': 'AMD-20241220-185.0-C', 'exit_price': 0.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20241018-440.0-C',\n", - " 'entry_price': 1190.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-05-13 00:00:00')},\n", - " {'AMD': {'quantity': -2, 'option': 'AMD-20241220-185.0-C', 'exit_price': 0.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20241018-440.0-C',\n", - " 'entry_price': 1190.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-05-14 00:00:00')},\n", - " {'AMD': {'quantity': -2, 'option': 'AMD-20241220-185.0-C', 'exit_price': 0.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20241018-440.0-C',\n", - " 'entry_price': 1190.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 2,\n", - " 'option': 'AAPL-20250117-215.0-C',\n", - " 'entry_price': 487.0},\n", - " 'datetime': Timestamp('2024-05-15 00:00:00')},\n", - " {'AMD': {'quantity': -2, 'option': 'AMD-20241220-185.0-C', 'exit_price': 0.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20241018-440.0-C',\n", - " 'entry_price': 1190.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 2,\n", - " 'option': 'AAPL-20250117-215.0-C',\n", - " 'entry_price': 487.0},\n", - " 'datetime': Timestamp('2024-05-16 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20241220-210.0-C',\n", - " 'entry_price': 1115.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20241018-440.0-C',\n", - " 'entry_price': 1190.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 2,\n", - " 'option': 'AAPL-20250117-215.0-C',\n", - " 'entry_price': 487.0},\n", - " 'datetime': Timestamp('2024-05-17 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20241220-210.0-C',\n", - " 'entry_price': 1115.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20241018-440.0-C',\n", - " 'entry_price': 1190.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 2,\n", - " 'option': 'AAPL-20250117-215.0-C',\n", - " 'entry_price': 487.0},\n", - " 'datetime': Timestamp('2024-05-20 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20241220-210.0-C',\n", - " 'entry_price': 1115.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20241018-440.0-C',\n", - " 'entry_price': 1190.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 2,\n", - " 'option': 'AAPL-20250117-215.0-C',\n", - " 'entry_price': 487.0},\n", - " 'datetime': Timestamp('2024-05-21 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20241220-210.0-C',\n", - " 'entry_price': 1115.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20241018-440.0-C',\n", - " 'entry_price': 1190.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 2,\n", - " 'option': 'AAPL-20250117-215.0-C',\n", - " 'entry_price': 487.0},\n", - " 'datetime': Timestamp('2024-05-22 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20241220-210.0-C',\n", - " 'entry_price': 1115.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20241018-440.0-C',\n", - " 'entry_price': 1190.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 2,\n", - " 'option': 'AAPL-20250117-215.0-C',\n", - " 'entry_price': 487.0},\n", - " 'datetime': Timestamp('2024-05-23 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20241220-210.0-C',\n", - " 'entry_price': 1115.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20241018-440.0-C',\n", - " 'entry_price': 1190.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 2,\n", - " 'option': 'AAPL-20250117-215.0-C',\n", - " 'entry_price': 487.0},\n", - " 'datetime': Timestamp('2024-05-24 00:00:00')},\n", - " {'AMD': {'quantity': -2,\n", - " 'option': 'AMD-20241220-210.0-C',\n", - " 'exit_price': 1025.0},\n", - " 'MSFT': {'quantity': -2,\n", - " 'option': 'MSFT-20241018-440.0-C',\n", - " 'exit_price': 2180.0},\n", - " 'AMZN': {'quantity': -2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'exit_price': 0.0},\n", - " 'GOOGL': {'quantity': -2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'exit_price': 0.0},\n", - " 'AAPL': {'quantity': -2,\n", - " 'option': 'AAPL-20250117-215.0-C',\n", - " 'exit_price': 565.0},\n", - " 'datetime': Timestamp('2024-05-24 00:00:00')}]" - ] - }, - "execution_count": 64, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.portfolio.all_positions" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "All positions:\n", - "[{'AAPL': {'option': None, 'quantity': 0.0},\n", - " 'AMD': {'option': None, 'quantity': 0.0},\n", - " 'AMZN': {'option': None, 'quantity': 0.0},\n", - " 'GOOGL': {'option': None, 'quantity': 0.0},\n", - " 'MSFT': {'option': None, 'quantity': 0.0},\n", - " 'datetime': '20240226'},\n", - " {'AAPL': {'option': None, 'quantity': 0.0},\n", - " 'AMD': {'option': None, 'quantity': 0.0},\n", - " 'AMZN': {'option': None, 'quantity': 0.0},\n", - " 'GOOGL': {'option': None, 'quantity': 0.0},\n", - " 'MSFT': {'option': None, 'quantity': 0.0},\n", - " 'datetime': Timestamp('2024-02-26 00:00:00')},\n", - " {'AAPL': {'option': None, 'quantity': 0.0},\n", - " 'AMD': {'option': None, 'quantity': 0.0},\n", - " 'AMZN': {'option': None, 'quantity': 0.0},\n", - " 'GOOGL': {'option': None, 'quantity': 0.0},\n", - " 'MSFT': {'option': None, 'quantity': 0.0},\n", - " 'datetime': Timestamp('2024-02-26 00:00:00')}]\n", - "\n", - "Current holdings:\n", - "{'AAPL': 0.0,\n", - " 'AMD': 0.0,\n", - " 'AMZN': 0.0,\n", - " 'GOOGL': 0.0,\n", - " 'MSFT': 0.0,\n", - " 'cash': 100000,\n", - " 'commission': 0.0,\n", - " 'total': 100000}\n", - "\n", - "Current positions:\n", - "{'AAPL': {'option': None, 'quantity': 0.0},\n", - " 'AMD': {'option': None, 'quantity': 0.0},\n", - " 'AMZN': {'option': None, 'quantity': 0.0},\n", - " 'GOOGL': {'option': None, 'quantity': 0.0},\n", - " 'MSFT': {'option': None, 'quantity': 0.0}}\n" - ] - } - ], - "source": [ - "from pprint import pprint\n", - "\n", - "print('All positions:')\n", - "pprint(portfolio.all_positions)\n", - "\n", - "print('\\nCurrent holdings:')\n", - "pprint(portfolio.current_holdings)\n", - "\n", - "print('\\nCurrent positions:')\n", - "pprint(portfolio.current_positions)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test RiskManager " - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " root expiration strike right\n", - "3444 NVDA 20240301 270.0 C\n", - "Exception: Cannot set a DataFrame with multiple columns to the single column option_id\n", - " root expiration strike right\n", - "3444 NVDA 20240301 270.0 C\n", - "Ticker: NVDA\n", - "Contract Date: 2024-02-09\n", - "Contract Right: C\n", - "Contract Expiration: 20240301, type: \n", - "Contract Strike: 270.0, type: \n", - "Max Close: 2\n", - "Order Settings: {'type': 'spread', 'specifics': [{'direction': 'long', 'rel_strike': 1.2305088940545148, 'dte': 284, 'moneyness_width': 0.08149699520032436}, {'direction': 'short', 'rel_strike': 0.9364378888363725, 'dte': 284, 'moneyness_width': 0.08149699520032436}], 'name': 'vertical_spread'}\n" - ] - }, - { - "ename": "ValueError", - "evalue": "Cannot set a DataFrame with multiple columns to the single column option_id", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m/var/folders/j0/80hkbygd4lb27h9mw76gqzpw0000gn/T/ipykernel_40825/3149993250.py\u001b[0m in \u001b[0;36m?\u001b[0;34m()\u001b[0m\n\u001b[1;32m 86\u001b[0m \u001b[0;32mraise\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 87\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 88\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 89\u001b[0m \u001b[0mops\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mRiskManagerOperations\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 90\u001b[0;31m \u001b[0mops\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtest_order_picker\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m/var/folders/j0/80hkbygd4lb27h9mw76gqzpw0000gn/T/ipykernel_40825/3149993250.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 82\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"Contract Expiration: {contract_expiration}, type: {type(contract_expiration)}\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 83\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"Contract Strike: {contract_strike}, type: {type(contract_strike)}\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 84\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"Max Close: {max_close}\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 85\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"Order Settings: {order_settings}\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 86\u001b[0;31m \u001b[0;32mraise\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m~/cloned_repos/QuantTools/EventDriven/riskmanager.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(self, tick, date, right, max_close, order_settings)\u001b[0m\n\u001b[1;32m 375\u001b[0m \u001b[0mstr_direction_index\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mindx\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'S'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 376\u001b[0m \u001b[0mdirection_index\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mindx\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 377\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 378\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 379\u001b[0;31m \u001b[0morder_candidates\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mproduce_order_candidates\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0morder_settings\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtick\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdate\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mright\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 380\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 381\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 382\u001b[0m \u001b[0mpopulate_cache\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0morder_candidates\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdate\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdate\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/cloned_repos/QuantTools/EventDriven/riskmanager.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(settings, tick, date, right)\u001b[0m\n\u001b[1;32m 273\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mproduce_order_candidates\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msettings\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtick\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdate\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mright\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'P'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 274\u001b[0m \u001b[0morder_candidates\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m'long'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'short'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 275\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mspec\u001b[0m \u001b[0;32min\u001b[0m \u001b[0msettings\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'specifics'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 276\u001b[0;31m \u001b[0morder_candidates\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mspec\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'direction'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mchain_details\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdate\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtick\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mspec\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'dte'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mspec\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'rel_strike'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mright\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmoneyness_width\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mspec\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'moneyness_width'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 277\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0morder_candidates\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/cloned_repos/QuantTools/EventDriven/riskmanager.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(date, ticker, tgt_dte, tgt_moneyness, right, moneyness_width, print_stderr)\u001b[0m\n\u001b[1;32m 178\u001b[0m \u001b[0mclear_context\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 179\u001b[0m \u001b[0mreturn_dataframe\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdrop_duplicates\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minplace\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 180\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 181\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mException\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 182\u001b[0;31m \u001b[0;32mraise\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 183\u001b[0m \u001b[0merrors\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mdate\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 184\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0merrors\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 185\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mreturn_dataframe\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msort_values\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'relative_moneyness'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mascending\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(self, key, value)\u001b[0m\n\u001b[1;32m 4297\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_setitem_frame\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4298\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mSeries\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mndarray\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mIndex\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4299\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_setitem_array\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4300\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvalue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mDataFrame\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 4301\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_set_item_frame_value\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4302\u001b[0m elif (\n\u001b[1;32m 4303\u001b[0m \u001b[0mis_list_like\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvalue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4304\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_unique\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(self, key, value)\u001b[0m\n\u001b[1;32m 4455\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4456\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0misetitem\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlocs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4457\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4458\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvalue\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 4459\u001b[0;31m raise ValueError(\n\u001b[0m\u001b[1;32m 4460\u001b[0m \u001b[0;34m\"Cannot set a DataFrame with multiple columns to the single \"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4461\u001b[0m \u001b[0;34mf\"column {key}\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4462\u001b[0m )\n", - "\u001b[0;31mValueError\u001b[0m: Cannot set a DataFrame with multiple columns to the single column option_id" - ] - } - ], - "source": [ - "from EventDriven.riskmanager import RiskManager\n", - "from dbase.DataAPI.ThetaData import list_contracts, retrieve_option_ohlc, is_theta_data_retrieval_successful #type: ignore\n", - "import datetime\n", - "import pandas as pd\n", - "import pandas_market_calendars as mcal\n", - "import unittest\n", - "import numpy as np\n", - "import pprint as pp\n", - "\n", - "tickers = ['AAPL', 'MSFT', 'GOOGL', 'AMZN', 'TSLA', 'META', 'NVDA', 'NFLX']\n", - "\n", - "\n", - "#generate date range \n", - "nyse = mcal.get_calendar('NYSE')\n", - "year_ago_date = datetime.datetime.now() - datetime.timedelta(days=365)\n", - "schedule = nyse.schedule(start_date=year_ago_date, end_date=datetime.datetime.now())\n", - "date_range = mcal.date_range(schedule, frequency='1D')\n", - "dates = [date.strftime('%Y-%m-%d') for date in date_range]\n", - "\n", - "\n", - "\n", - "\n", - "class RiskManagerOperations(unittest.TestCase):\n", - " def __init__(self):\n", - " self.events = Queue(maxsize=0) \n", - " self.bars = HistoricTradeDataHandler(self.events, trades)\n", - " self.risk_manager = RiskManager(bars=self.bars, events=self.events, initial_capital=1000000)\n", - " \n", - " def test_order_picker(self):\n", - " ticker = np.random.choice(tickers)\n", - " contract_date = np.random.choice(dates)\n", - " contracts = list_contracts(ticker, pd.to_datetime(contract_date).strftime('%Y%m%d'))\n", - " self.assertTrue(is_theta_data_retrieval_successful(contracts))\n", - " \n", - " contract = contracts.sample()\n", - " print(contract)\n", - " contract_right = contract['right'].values[0]\n", - " contract_expiration = f\"{contract['expiration'].values[0]}\"\n", - " contract_strike = float(contract['strike'].values[0])\n", - " max_close = np.random.randint(1, 10)\n", - " \n", - " #order settings \n", - " moneyness_width = np.random.uniform(0.05, 0.1)\n", - " rel_strike_long = np.random.uniform(1.05, 1.3) \n", - " rel_strike_short = np.random.uniform(0.7, 0.95)\n", - " dte = np.random.randint(30, 365)\n", - " \n", - " order_settings = {\n", - " 'type': 'spread',\n", - " 'specifics': [\n", - " {'direction': 'long', 'rel_strike': rel_strike_long, 'dte': dte, 'moneyness_width': moneyness_width},\n", - " {'direction': 'short', 'rel_strike': rel_strike_short, 'dte': dte, 'moneyness_width': moneyness_width} \n", - " ],\n", - " 'name': 'vertical_spread'\n", - " }\n", - " \n", - " try:\n", - " self.order = self.risk_manager.OrderPicker.get_order(ticker, contract_expiration, contract_right, max_close, order_settings)\n", - " self.assertIsInstance(self.order, dict)\n", - " self.assertIsInstance(self.order['long'], list)\n", - " self.assertIsInstance(self.order['short'], list)\n", - " self.assertGreater(len(self.order['long']), 0)\n", - " self.assertGreater(len(self.order['short']), 0)\n", - " self.assertIsInstance(self.order['close'], float)\n", - " except AssertionError as e:\n", - " print(f\"AssertionError: {e}\")\n", - " pp.pprint(contract)\n", - " print(f\"Ticker: {ticker}\")\n", - " print(f\"Contract Date: {contract_date}\")\n", - " print(f\"Contract Right: {contract_right}\")\n", - " print(f\"Contract Expiration: {contract_expiration}\")\n", - " print(f\"Contract Strike: {contract_strike}\")\n", - " print(f\"Max Close: {max_close}\")\n", - " print(f\"Order Settings: {order_settings}\")\n", - " raise\n", - " except Exception as e:\n", - " print(f\"Exception: {e}\")\n", - " pp.pprint(contract)\n", - " print(f\"Ticker: {ticker}\")\n", - " print(f\"Contract Date: {contract_date}\")\n", - " print(f\"Contract Right: {contract_right}\")\n", - " print(f\"Contract Expiration: {contract_expiration}, type: {type(contract_expiration)}\")\n", - " print(f\"Contract Strike: {contract_strike}, type: {type(contract_strike)}\")\n", - " print(f\"Max Close: {max_close}\")\n", - " print(f\"Order Settings: {order_settings}\")\n", - " raise\n", - "\n", - "\n", - "ops = RiskManagerOperations()\n", - "ops.test_order_picker()" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "from trade.assets.Stock import Stock\n", - "NVDA = Stock('NVDA', run_chain = False)" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "def generate_option_to_buy(underlier: Stock, contract_time):\n", - " \"\"\"\n", - " Buy an option based on the underlier.\n", - " \"\"\"\n", - " time = contract_time\n", - " next_day_time = time + pd.DateOffset(days=1)\n", - " print(time, next_day_time)\n", - " option_spot = underlier.spot(ts=True, ts_start = time, ts_end = next_day_time)\n", - " option_spot = option_spot.iloc[0] \n", - " stock_price = option_spot['open']#use open price as spot price on the assumption of making trades at start of day\n", - " oom_benchmark = 0.1#10% out of the money \n", - " expiry_benchmark = time + pd.DateOffset(months=5)\n", - " oom_price = stock_price * (1 + oom_benchmark)\n", - " time_str = time.strftime(\"%Y%m%d\")\n", - " contracts = list_contracts(underlier.ticker, time_str)\n", - " print(contracts)\n", - " contracts = contracts[contracts['right'] == 'C'] \n", - " \n", - " \n", - " #Filter out contracts that are out of the money\n", - " contracts = contracts[contracts['strike'] >= oom_price]\n", - " \n", - " print('comparing expiry')\n", - " print(type(expiry_benchmark))\n", - " print(type(contracts['expiration']))\n", - " #filter out contracts that are below the expiry benchmark\n", - " contracts = contracts[pd.to_datetime(contracts['expiration'], format=\"%Y%m%d\") >= expiry_benchmark]\n", - " \n", - " #select a random contract to buy\n", - " contract = contracts.sample(n=1); \n", - " \n", - " return contract\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "182.35000610351562" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "appl = Stock('AAPL')\n", - "c_time = pd.to_datetime('2024-05-06', format=\"%Y-%m-%d\")\n", - "c_time_next = c_time + pd.DateOffset(days=1)\n", - "aapl_spot = appl.spot(ts=True, ts_start = c_time, ts_end = c_time_next)\n", - "aapl_spot.iloc[0]['open']\n" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2024-05-06 00:00:00 2024-05-07 00:00:00\n", - " root expiration strike right\n", - "0 AAPL 20241018 220.0 C\n", - "1 AAPL 20250919 215.0 C\n", - "2 AAPL 20241115 220.0 C\n", - "3 AAPL 20250321 220.0 C\n", - "4 AAPL 20250321 220.0 P\n", - "... ... ... ... ...\n", - "1060 AAPL 20240621 220.0 C\n", - "1061 AAPL 20240621 220.0 P\n", - "1062 AAPL 20240719 220.0 C\n", - "1063 AAPL 20250620 215.0 C\n", - "1064 AAPL 20240816 220.0 C\n", - "\n", - "[1065 rows x 4 columns]\n", - "comparing expiry\n", - "\n", - "\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
rootexpirationstrikeright
456AAPL20250117235.0C
\n", - "
" - ], - "text/plain": [ - " root expiration strike right\n", - "456 AAPL 20250117 235.0 C" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "option = generate_option_to_buy(appl, c_time)\n", - "option" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": ".venv", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.10" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/EventDriven/demos/demoRun.py b/EventDriven/demos/demoRun.py deleted file mode 100644 index 0ae2640..0000000 --- a/EventDriven/demos/demoRun.py +++ /dev/null @@ -1,83 +0,0 @@ - -from dotenv import load_dotenv -load_dotenv() -import os -import sys -import cProfile -import pstats -import io -# sys.path.append( -# os.environ.get('WORK_DIR', '')) #type: ignore -# sys.path.append( -# os.environ.get('DBASE_DIR', '')) #type: ignore -from dbase.DataAPI.ThetaData import * #type: ignore -from dbase.database.SQLHelpers import * #type: ignore -import pandas as pd -from data import HistoricTradeDataHandler -from event import * -from queue import Queue -from trade.backtester_.backtester_ import PTDataset, PTBacktester -import pandas_ta as ta -from trade.assets.Stock import Stock -from trade.backtester_.utils.WalkForwardUtils import prev_monday -from trade.backtester_.strats import MAStrat -import yfinance as yf -from datetime import datetime -from backtest import OptionSignalBacktest -import asyncio - - -def create_datasate(stocks: list, start: str,interval: str, engine: str = 'yf', timewidth = None, timeframe = None, end: str = datetime.today(), return_object = False ): - dataset = [] - if engine.lower() == 'yf': - for stock in stocks: - start = prev_monday(start) - data2 = yf.download(stock, start = start, end = end, interval=interval, progress = False) - - dataset.append(PTDataset(stock, data2)) - else: - for stk in stocks: - stock = Stock(stk) - data = stock.spot(ts = True, ts_start = '2018-01-01') - data.rename(columns = {x:x.capitalize() for x in data.columns}, inplace= True) - data['Timestamp'] = pd.to_datetime(data['Timestamp'], format = '%Y-%m-%d') - data2 = data.set_index('Timestamp') - data2 = data2.asfreq('W', method = 'ffill') - data2 = data2.fillna(0) - data2['Next_Day_Open'] = data2.Open.shift(-1) - data2['EMA'] = ta.ma('ema', data2.Close, length = 21).fillna(0) - dataset.append(PTDataset(stk, data2)) - return dataset if return_object else data2 - - - - -async def main(): - start, end, interval = '2023-05-29', '2024-05-28','1d' - STOCKS = ['AAPL', 'MSFT','GOOGL', 'AMD', 'AMZN'] - dataset = create_datasate(STOCKS, start, interval,end = end , return_object=True) - MAStrat.start_date = pd.to_datetime('1994-03-22') - tt = PTBacktester(dataset, MAStrat, cash =1000, commission = 0.0035) - stats = tt.run() - trades = tt.__trades() - shorts = tt.__trades()[tt.__trades()['Size'] < 0] - trades = trades[:10] - - # Backtest class - evb_backtest = OptionSignalBacktest(trades) - profiler = cProfile.Profile() - profiler.enable() - # Run backtest - await evb_backtest.run() - profiler.disable() - stream = io.StringIO() - stats = pstats.Stats(profiler, stream=stream).sort_stats('cumulative') - stats.print_stats(15) - stream.seek(0) - - with open('backtest_stats.txt', 'w') as f: - f.write(stream.read()) - f.flush() - -if __name__ == '__main__': - asyncio.run(main()) \ No newline at end of file diff --git a/EventDriven/demos/demoRunV2.ipynb b/EventDriven/demos/demoRunV2.ipynb deleted file mode 100644 index 5f817b3..0000000 --- a/EventDriven/demos/demoRunV2.ipynb +++ /dev/null @@ -1,30548 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Console Logging & File Logging Can be configured using STREAM_LOG_LEVEL and FILE_LOG_LEVEL in environment variables.\n", - "Propagate to root logger can be set using PROPAGATE_TO_ROOT_LOGGER in environment variables.\n", - "Example:\n", - "STREAM_LOG_LEVEL = 'DEBUG'\n", - "FILE_LOG_LEVEL = 'INFO'\n", - "PROPAGATE_TO_ROOT_LOGGER = 'False'\n", - "\n", - "2025-04-05 22:08:04 trade.helpers.Logging INFO: Logging Root Directory: c:\\Users\\Zino\\python-playground\\QuantTools\\logs\n", - "Using Proxy URL: http://18.232.166.224:5500/thetadata\n" - ] - } - ], - "source": [ - "from dbase.DataAPI.ThetaData import * #type: ignore\n", - "from dbase.database.SQLHelpers import * #type: ignore\n", - "import pandas as pd\n", - "from EventDriven.eventScheduler import *\n", - "from trade.backtester_.backtester_ import PTDataset, PTBacktester\n", - "import pandas_ta as ta\n", - "from trade.assets.Stock import Stock\n", - "from trade.backtester_.utils.WalkForwardUtils import prev_monday \n", - "from trade.backtester_.strats import MAStrat\n", - "import yfinance as yf\n", - "from datetime import datetime\n", - "from EventDriven.backtest import OptionSignalBacktest\n", - "%load_ext autoreload\n", - "%autoreload 2\n", - "pd.set_option('display.max_rows', 5000)\n", - "pd.set_option('display.max_columns', 5000)" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
SizeEntryBarExitBarEntryPriceExitPricePnLReturnPctEntryTimeExitTimeDurationTicker
034.0504.0524.0279.795877253.010232-910.711955-0.0957332023-07-052023-08-0228 daysTSLA
128.0504.0526.0192.240502185.493749-188.909083-0.0350952023-07-052023-08-0430 daysAAPL
217.0504.0529.0336.262811322.011093-242.279208-0.0423832023-07-052023-08-0935 daysMSFT
348.0504.0536.087.04358882.000000-242.092217-0.0579432023-07-052023-08-1844 daysAVGO
411.0504.0583.0130.695846122.257034-92.826927-0.0645682023-07-052023-10-25112 daysAMZN
5178.0504.0753.042.282471123.47000114451.3804121.9201232023-07-052024-07-01362 daysNVDA
75.0522.0556.0332.810769318.700396-70.551863-0.0423982023-07-312023-09-1849 daysHD
85.0530.0535.0239.284572224.549052-73.677602-0.0615822023-08-102023-08-177 daysBA
95.0530.0535.053.78425752.084613-8.498219-0.0316012023-08-102023-08-177 daysWMT
1038.0535.0580.0226.851208217.009995-373.966096-0.0433822023-08-172023-10-2064 daysTSLA
1147.0537.0753.083.697919160.8200073624.7381410.9214342023-08-212024-07-01315 daysAVGO
1228.0545.0549.0188.497436175.179993-372.888422-0.0706512023-08-312023-09-077 daysAAPL
134.0553.0565.055.16908453.228411-7.762691-0.0351772023-09-132023-09-2916 daysWMT
147.0555.0558.038.55446835.955361-18.193748-0.0674142023-09-152023-09-205 daysINTC
1511.0596.0753.0124.434000199.470001825.3960130.6030182023-11-132024-07-01231 daysQCOM
1614.0597.0753.0372.308545448.6600041068.9204240.2050762023-11-142024-07-01230 daysMSFT
1741.0598.0607.0106.029814100.545486-224.857451-0.0517242023-11-152023-11-2914 daysSBUX
1813.0598.0753.0120.961891161.250000523.7454180.3330642023-11-152024-07-01229 daysAMD
197.0599.0753.077.159114130.500000373.3861990.6913102023-11-162024-07-01228 daysMU
2014.0600.0635.095.08162589.416964-79.305250-0.0595772023-11-172024-01-1054 daysDIS
215.0600.0692.043.06018540.347284-13.564503-0.0630032023-11-172024-04-03138 daysINTC
2225.0603.0631.0192.160221182.149994-250.255665-0.0520932023-11-222024-01-0443 daysAAPL
23102.0609.0753.030.50640039.910000959.1672230.3082502023-12-012024-07-01213 daysBAC
244.0610.0637.0232.109553219.970001-48.558207-0.0523012023-12-042024-01-1239 daysBA
255.0610.0702.0320.738665336.77999980.2066680.0500142023-12-042024-04-17135 daysHD
2622.0646.0649.0153.405040145.389999-176.330896-0.0522482024-01-262024-01-315 daysGOOG
274.0652.0753.056.86834367.88999944.0866250.1938102024-02-052024-07-01147 daysWMT
2813.0654.0723.097.730864103.04000169.0187750.0543242024-02-072024-05-1699 daysDIS
298.0655.0753.0170.243769193.490005185.9698930.1365472024-02-082024-07-01144 daysAMZN
3121.0692.0753.0155.462218184.479996609.3733290.1866552024-04-032024-07-0189 daysGOOG
3224.0726.0753.0191.758811212.089996487.9484400.1060252024-05-212024-07-0141 daysAAPL
\n", - "
" - ], - "text/plain": [ - " Size EntryBar ExitBar EntryPrice ExitPrice PnL ReturnPct \\\n", - "0 34.0 504.0 524.0 279.795877 253.010232 -910.711955 -0.095733 \n", - "1 28.0 504.0 526.0 192.240502 185.493749 -188.909083 -0.035095 \n", - "2 17.0 504.0 529.0 336.262811 322.011093 -242.279208 -0.042383 \n", - "3 48.0 504.0 536.0 87.043588 82.000000 -242.092217 -0.057943 \n", - "4 11.0 504.0 583.0 130.695846 122.257034 -92.826927 -0.064568 \n", - "5 178.0 504.0 753.0 42.282471 123.470001 14451.380412 1.920123 \n", - "7 5.0 522.0 556.0 332.810769 318.700396 -70.551863 -0.042398 \n", - "8 5.0 530.0 535.0 239.284572 224.549052 -73.677602 -0.061582 \n", - "9 5.0 530.0 535.0 53.784257 52.084613 -8.498219 -0.031601 \n", - "10 38.0 535.0 580.0 226.851208 217.009995 -373.966096 -0.043382 \n", - "11 47.0 537.0 753.0 83.697919 160.820007 3624.738141 0.921434 \n", - "12 28.0 545.0 549.0 188.497436 175.179993 -372.888422 -0.070651 \n", - "13 4.0 553.0 565.0 55.169084 53.228411 -7.762691 -0.035177 \n", - "14 7.0 555.0 558.0 38.554468 35.955361 -18.193748 -0.067414 \n", - "15 11.0 596.0 753.0 124.434000 199.470001 825.396013 0.603018 \n", - "16 14.0 597.0 753.0 372.308545 448.660004 1068.920424 0.205076 \n", - "17 41.0 598.0 607.0 106.029814 100.545486 -224.857451 -0.051724 \n", - "18 13.0 598.0 753.0 120.961891 161.250000 523.745418 0.333064 \n", - "19 7.0 599.0 753.0 77.159114 130.500000 373.386199 0.691310 \n", - "20 14.0 600.0 635.0 95.081625 89.416964 -79.305250 -0.059577 \n", - "21 5.0 600.0 692.0 43.060185 40.347284 -13.564503 -0.063003 \n", - "22 25.0 603.0 631.0 192.160221 182.149994 -250.255665 -0.052093 \n", - "23 102.0 609.0 753.0 30.506400 39.910000 959.167223 0.308250 \n", - "24 4.0 610.0 637.0 232.109553 219.970001 -48.558207 -0.052301 \n", - "25 5.0 610.0 702.0 320.738665 336.779999 80.206668 0.050014 \n", - "26 22.0 646.0 649.0 153.405040 145.389999 -176.330896 -0.052248 \n", - "27 4.0 652.0 753.0 56.868343 67.889999 44.086625 0.193810 \n", - "28 13.0 654.0 723.0 97.730864 103.040001 69.018775 0.054324 \n", - "29 8.0 655.0 753.0 170.243769 193.490005 185.969893 0.136547 \n", - "31 21.0 692.0 753.0 155.462218 184.479996 609.373329 0.186655 \n", - "32 24.0 726.0 753.0 191.758811 212.089996 487.948440 0.106025 \n", - "\n", - " EntryTime ExitTime Duration Ticker \n", - "0 2023-07-05 2023-08-02 28 days TSLA \n", - "1 2023-07-05 2023-08-04 30 days AAPL \n", - "2 2023-07-05 2023-08-09 35 days MSFT \n", - "3 2023-07-05 2023-08-18 44 days AVGO \n", - "4 2023-07-05 2023-10-25 112 days AMZN \n", - "5 2023-07-05 2024-07-01 362 days NVDA \n", - "7 2023-07-31 2023-09-18 49 days HD \n", - "8 2023-08-10 2023-08-17 7 days BA \n", - "9 2023-08-10 2023-08-17 7 days WMT \n", - "10 2023-08-17 2023-10-20 64 days TSLA \n", - "11 2023-08-21 2024-07-01 315 days AVGO \n", - "12 2023-08-31 2023-09-07 7 days AAPL \n", - "13 2023-09-13 2023-09-29 16 days WMT \n", - "14 2023-09-15 2023-09-20 5 days INTC \n", - "15 2023-11-13 2024-07-01 231 days QCOM \n", - "16 2023-11-14 2024-07-01 230 days MSFT \n", - "17 2023-11-15 2023-11-29 14 days SBUX \n", - "18 2023-11-15 2024-07-01 229 days AMD \n", - "19 2023-11-16 2024-07-01 228 days MU \n", - "20 2023-11-17 2024-01-10 54 days DIS \n", - "21 2023-11-17 2024-04-03 138 days INTC \n", - "22 2023-11-22 2024-01-04 43 days AAPL \n", - "23 2023-12-01 2024-07-01 213 days BAC \n", - "24 2023-12-04 2024-01-12 39 days BA \n", - "25 2023-12-04 2024-04-17 135 days HD \n", - "26 2024-01-26 2024-01-31 5 days GOOG \n", - "27 2024-02-05 2024-07-01 147 days WMT \n", - "28 2024-02-07 2024-05-16 99 days DIS \n", - "29 2024-02-08 2024-07-01 144 days AMZN \n", - "31 2024-04-03 2024-07-01 89 days GOOG \n", - "32 2024-05-21 2024-07-01 41 days AAPL " - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import json\n", - "with open('../input/profitable_weights.json', 'r') as f:\n", - " weights = json.load(f)\n", - "ttrades_ = pd.read_csv('../input/profitable_trades.csv').iloc[:, 1:]\n", - "\n", - "w_map = {x: w * 0.75 for x, w in weights.items()}\n", - "ttrades_ = ttrades_[ttrades_['EntryTime'] != ttrades_['ExitTime']]\n", - "ttrades_" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "new_trades = ttrades_.copy()[:10]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
SizeEntryBarExitBarEntryPriceExitPricePnLReturnPctEntryTimeExitTimeDurationTicker
034.0504.0524.0279.795877253.010232-910.711955-0.0957332023-07-052023-08-0228 daysTSLA
128.0504.0526.0192.240502185.493749-188.909083-0.0350952023-07-052023-08-0430 daysAAPL
217.0504.0529.0336.262811322.011093-242.279208-0.0423832023-07-052023-08-0935 daysMSFT
348.0504.0536.087.04358882.000000-242.092217-0.0579432023-07-052023-08-1844 daysAVGO
411.0504.0583.0130.695846122.257034-92.826927-0.0645682023-07-052023-10-25112 daysAMZN
510.0504.0529.0NaNNaNNaNNaN2023-08-092023-10-25NaNMSFT
\n", - "
" - ], - "text/plain": [ - " Size EntryBar ExitBar EntryPrice ExitPrice PnL ReturnPct \\\n", - "0 34.0 504.0 524.0 279.795877 253.010232 -910.711955 -0.095733 \n", - "1 28.0 504.0 526.0 192.240502 185.493749 -188.909083 -0.035095 \n", - "2 17.0 504.0 529.0 336.262811 322.011093 -242.279208 -0.042383 \n", - "3 48.0 504.0 536.0 87.043588 82.000000 -242.092217 -0.057943 \n", - "4 11.0 504.0 583.0 130.695846 122.257034 -92.826927 -0.064568 \n", - "5 10.0 504.0 529.0 NaN NaN NaN NaN \n", - "\n", - " EntryTime ExitTime Duration Ticker \n", - "0 2023-07-05 2023-08-02 28 days TSLA \n", - "1 2023-07-05 2023-08-04 30 days AAPL \n", - "2 2023-07-05 2023-08-09 35 days MSFT \n", - "3 2023-07-05 2023-08-18 44 days AVGO \n", - "4 2023-07-05 2023-10-25 112 days AMZN \n", - "5 2023-08-09 2023-10-25 NaN MSFT " - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "trades_ = ttrades_.copy()[:5]\n", - "msft_trade = pd.DataFrame([{\"Size\": -10.0, \"EntryBar\": 504, \"ExitBar\": 529.0, \"EntryTime\": \"2023-07-05\", \"ExitTime\": \"2023-08-10\", \"Ticker\": \"MSFT\"}])\n", - "trades_ = pd.concat([trades_, msft_trade], ignore_index=True)\n", - "trades_" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "#Backtest class \n", - "evb_backtest = OptionSignalBacktest(trades_)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The following symbols: ['NVDA', 'QCOM', 'MU', 'GOOG', 'AMD', 'BAC', 'BA', 'SBUX', 'DIS', 'HD', 'WMT', 'PFE', 'JNJ', 'INTC'] are not being processed but present in weight_map\n" - ] - }, - { - "data": { - "text/plain": [ - "{'type': 'naked',\n", - " 'specifics': [{'direction': 'long',\n", - " 'rel_strike': 0.9,\n", - " 'dte': 365,\n", - " 'moneyness_width': 0.1},\n", - " {'direction': 'short',\n", - " 'rel_strike': 0.8,\n", - " 'dte': 365,\n", - " 'moneyness_width': 0.1}],\n", - " 'name': 'vertical_spread'}" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.portfolio.weight_map = w_map\n", - "evb_backtest.portfolio.weight_map\n", - "evb_backtest.portfolio.order_settings = {'type': 'naked',\n", - " 'specifics': [{'direction': 'long',\n", - " 'rel_strike': .900,\n", - " 'dte': 365,\n", - " 'moneyness_width': 0.1},\n", - " {'direction': 'short',\n", - " 'rel_strike': .80,\n", - " 'dte': 365,\n", - " 'moneyness_width': 0.1}],\n", - "\n", - " 'name': 'vertical_spread'}\n", - "\n", - "evb_backtest.portfolio.order_settings" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
typesymbolsignal_typesignal_idmax_contract_priceorder_settings
datetime
2023-07-05MARKETNaNNaNNaNNaNNaN
2023-07-05SIGNALAAPLLONGAAPL20230705LONGNaNNaN
2023-07-05SIGNALMSFTLONGMSFT20230705LONGNaNNaN
2023-07-05SIGNALAVGOLONGAVGO20230705LONGNaNNaN
2023-07-05SIGNALAMZNLONGAMZN20230705LONGNaNNaN
2023-07-05SIGNALTSLALONGTSLA20230705LONGNaNNaN
2023-07-06MARKETNaNNaNNaNNaNNaN
2023-07-07MARKETNaNNaNNaNNaNNaN
2023-07-10MARKETNaNNaNNaNNaNNaN
2023-07-11MARKETNaNNaNNaNNaNNaN
2023-07-12MARKETNaNNaNNaNNaNNaN
2023-07-13MARKETNaNNaNNaNNaNNaN
2023-07-14MARKETNaNNaNNaNNaNNaN
2023-07-17MARKETNaNNaNNaNNaNNaN
2023-07-18MARKETNaNNaNNaNNaNNaN
2023-07-19MARKETNaNNaNNaNNaNNaN
2023-07-20MARKETNaNNaNNaNNaNNaN
2023-07-21MARKETNaNNaNNaNNaNNaN
2023-07-24MARKETNaNNaNNaNNaNNaN
2023-07-25MARKETNaNNaNNaNNaNNaN
2023-07-26MARKETNaNNaNNaNNaNNaN
2023-07-27MARKETNaNNaNNaNNaNNaN
2023-07-28MARKETNaNNaNNaNNaNNaN
2023-07-31MARKETNaNNaNNaNNaNNaN
2023-08-01MARKETNaNNaNNaNNaNNaN
2023-08-02SIGNALTSLACLOSETSLA20230802LONGNaNNaN
2023-08-02MARKETNaNNaNNaNNaNNaN
2023-08-03MARKETNaNNaNNaNNaNNaN
2023-08-04SIGNALAAPLCLOSEAAPL20230804LONGNaNNaN
2023-08-04MARKETNaNNaNNaNNaNNaN
2023-08-07MARKETNaNNaNNaNNaNNaN
2023-08-08MARKETNaNNaNNaNNaNNaN
2023-08-09MARKETNaNNaNNaNNaNNaN
2023-08-09SIGNALMSFTCLOSEMSFT20230809LONGNaNNaN
2023-08-09SIGNALMSFTLONGMSFT20230809LONGNaNNaN
2023-08-10MARKETNaNNaNNaNNaNNaN
2023-08-11MARKETNaNNaNNaNNaNNaN
2023-08-14MARKETNaNNaNNaNNaNNaN
2023-08-15MARKETNaNNaNNaNNaNNaN
2023-08-16MARKETNaNNaNNaNNaNNaN
2023-08-17MARKETNaNNaNNaNNaNNaN
2023-08-18MARKETNaNNaNNaNNaNNaN
2023-08-18SIGNALAVGOCLOSEAVGO20230818LONGNaNNaN
2023-08-21MARKETNaNNaNNaNNaNNaN
2023-08-22MARKETNaNNaNNaNNaNNaN
2023-08-23MARKETNaNNaNNaNNaNNaN
2023-08-24MARKETNaNNaNNaNNaNNaN
2023-08-25MARKETNaNNaNNaNNaNNaN
2023-08-28MARKETNaNNaNNaNNaNNaN
2023-08-29MARKETNaNNaNNaNNaNNaN
2023-08-30MARKETNaNNaNNaNNaNNaN
2023-08-31MARKETNaNNaNNaNNaNNaN
2023-09-01MARKETNaNNaNNaNNaNNaN
2023-09-04MARKETNaNNaNNaNNaNNaN
2023-09-05MARKETNaNNaNNaNNaNNaN
2023-09-06MARKETNaNNaNNaNNaNNaN
2023-09-07MARKETNaNNaNNaNNaNNaN
2023-09-08MARKETNaNNaNNaNNaNNaN
2023-09-11MARKETNaNNaNNaNNaNNaN
2023-09-12MARKETNaNNaNNaNNaNNaN
2023-09-13MARKETNaNNaNNaNNaNNaN
2023-09-14MARKETNaNNaNNaNNaNNaN
2023-09-15MARKETNaNNaNNaNNaNNaN
2023-09-18MARKETNaNNaNNaNNaNNaN
2023-09-19MARKETNaNNaNNaNNaNNaN
2023-09-20MARKETNaNNaNNaNNaNNaN
2023-09-21MARKETNaNNaNNaNNaNNaN
2023-09-22MARKETNaNNaNNaNNaNNaN
2023-09-25MARKETNaNNaNNaNNaNNaN
2023-09-26MARKETNaNNaNNaNNaNNaN
2023-09-27MARKETNaNNaNNaNNaNNaN
2023-09-28MARKETNaNNaNNaNNaNNaN
2023-09-29MARKETNaNNaNNaNNaNNaN
2023-10-02MARKETNaNNaNNaNNaNNaN
2023-10-03MARKETNaNNaNNaNNaNNaN
2023-10-04MARKETNaNNaNNaNNaNNaN
2023-10-05MARKETNaNNaNNaNNaNNaN
2023-10-06MARKETNaNNaNNaNNaNNaN
2023-10-09MARKETNaNNaNNaNNaNNaN
2023-10-10MARKETNaNNaNNaNNaNNaN
2023-10-11MARKETNaNNaNNaNNaNNaN
2023-10-12MARKETNaNNaNNaNNaNNaN
2023-10-13MARKETNaNNaNNaNNaNNaN
2023-10-16MARKETNaNNaNNaNNaNNaN
2023-10-17MARKETNaNNaNNaNNaNNaN
2023-10-18MARKETNaNNaNNaNNaNNaN
2023-10-19MARKETNaNNaNNaNNaNNaN
2023-10-20MARKETNaNNaNNaNNaNNaN
2023-10-23MARKETNaNNaNNaNNaNNaN
2023-10-24MARKETNaNNaNNaNNaNNaN
2023-10-25SIGNALAMZNCLOSEAMZN20231025LONGNaNNaN
2023-10-25MARKETNaNNaNNaNNaNNaN
2023-10-25SIGNALMSFTCLOSEMSFT20231025LONGNaNNaN
\n", - "
" - ], - "text/plain": [ - " type symbol signal_type signal_id max_contract_price \\\n", - "datetime \n", - "2023-07-05 MARKET NaN NaN NaN NaN \n", - "2023-07-05 SIGNAL AAPL LONG AAPL20230705LONG NaN \n", - "2023-07-05 SIGNAL MSFT LONG MSFT20230705LONG NaN \n", - "2023-07-05 SIGNAL AVGO LONG AVGO20230705LONG NaN \n", - "2023-07-05 SIGNAL AMZN LONG AMZN20230705LONG NaN \n", - "2023-07-05 SIGNAL TSLA LONG TSLA20230705LONG NaN \n", - "2023-07-06 MARKET NaN NaN NaN NaN \n", - "2023-07-07 MARKET NaN NaN NaN NaN \n", - "2023-07-10 MARKET NaN NaN NaN NaN \n", - "2023-07-11 MARKET NaN NaN NaN NaN \n", - "2023-07-12 MARKET NaN NaN NaN NaN \n", - "2023-07-13 MARKET NaN NaN NaN NaN \n", - "2023-07-14 MARKET NaN NaN NaN NaN \n", - "2023-07-17 MARKET NaN NaN NaN NaN \n", - "2023-07-18 MARKET NaN NaN NaN NaN \n", - "2023-07-19 MARKET NaN NaN NaN NaN \n", - "2023-07-20 MARKET NaN NaN NaN NaN \n", - "2023-07-21 MARKET NaN NaN NaN NaN \n", - "2023-07-24 MARKET NaN NaN NaN NaN \n", - "2023-07-25 MARKET NaN NaN NaN NaN \n", - "2023-07-26 MARKET NaN NaN NaN NaN \n", - "2023-07-27 MARKET NaN NaN NaN NaN \n", - "2023-07-28 MARKET NaN NaN NaN NaN \n", - "2023-07-31 MARKET NaN NaN NaN NaN \n", - "2023-08-01 MARKET NaN NaN NaN NaN \n", - "2023-08-02 SIGNAL TSLA CLOSE TSLA20230802LONG NaN \n", - "2023-08-02 MARKET NaN NaN NaN NaN \n", - "2023-08-03 MARKET NaN NaN NaN NaN \n", - "2023-08-04 SIGNAL AAPL CLOSE AAPL20230804LONG NaN \n", - "2023-08-04 MARKET NaN NaN NaN NaN \n", - "2023-08-07 MARKET NaN NaN NaN NaN \n", - "2023-08-08 MARKET NaN NaN NaN NaN \n", - "2023-08-09 MARKET NaN NaN NaN NaN \n", - "2023-08-09 SIGNAL MSFT CLOSE MSFT20230809LONG NaN \n", - "2023-08-09 SIGNAL MSFT LONG MSFT20230809LONG NaN \n", - "2023-08-10 MARKET NaN NaN NaN NaN \n", - "2023-08-11 MARKET NaN NaN NaN NaN \n", - "2023-08-14 MARKET NaN NaN NaN NaN \n", - "2023-08-15 MARKET NaN NaN NaN NaN \n", - "2023-08-16 MARKET NaN NaN NaN NaN \n", - "2023-08-17 MARKET NaN NaN NaN NaN \n", - "2023-08-18 MARKET NaN NaN NaN NaN \n", - "2023-08-18 SIGNAL AVGO CLOSE AVGO20230818LONG NaN \n", - "2023-08-21 MARKET NaN NaN NaN NaN \n", - "2023-08-22 MARKET NaN NaN NaN NaN \n", - "2023-08-23 MARKET NaN NaN NaN NaN \n", - "2023-08-24 MARKET NaN NaN NaN NaN \n", - "2023-08-25 MARKET NaN NaN NaN NaN \n", - "2023-08-28 MARKET NaN NaN NaN NaN \n", - "2023-08-29 MARKET NaN NaN NaN NaN \n", - "2023-08-30 MARKET NaN NaN NaN NaN \n", - "2023-08-31 MARKET NaN NaN NaN NaN \n", - "2023-09-01 MARKET NaN NaN NaN NaN \n", - "2023-09-04 MARKET NaN NaN NaN NaN \n", - "2023-09-05 MARKET NaN NaN NaN NaN \n", - "2023-09-06 MARKET NaN NaN NaN NaN \n", - "2023-09-07 MARKET NaN NaN NaN NaN \n", - "2023-09-08 MARKET NaN NaN NaN NaN \n", - "2023-09-11 MARKET NaN NaN NaN NaN \n", - "2023-09-12 MARKET NaN NaN NaN NaN \n", - "2023-09-13 MARKET NaN NaN NaN NaN \n", - "2023-09-14 MARKET NaN NaN NaN NaN \n", - "2023-09-15 MARKET NaN NaN NaN NaN \n", - "2023-09-18 MARKET NaN NaN NaN NaN \n", - "2023-09-19 MARKET NaN NaN NaN NaN \n", - "2023-09-20 MARKET NaN NaN NaN NaN \n", - "2023-09-21 MARKET NaN NaN NaN NaN \n", - "2023-09-22 MARKET NaN NaN NaN NaN \n", - "2023-09-25 MARKET NaN NaN NaN NaN \n", - "2023-09-26 MARKET NaN NaN NaN NaN \n", - "2023-09-27 MARKET NaN NaN NaN NaN \n", - "2023-09-28 MARKET NaN NaN NaN NaN \n", - "2023-09-29 MARKET NaN NaN NaN NaN \n", - "2023-10-02 MARKET NaN NaN NaN NaN \n", - "2023-10-03 MARKET NaN NaN NaN NaN \n", - "2023-10-04 MARKET NaN NaN NaN NaN \n", - "2023-10-05 MARKET NaN NaN NaN NaN \n", - "2023-10-06 MARKET NaN NaN NaN NaN \n", - "2023-10-09 MARKET NaN NaN NaN NaN \n", - "2023-10-10 MARKET NaN NaN NaN NaN \n", - "2023-10-11 MARKET NaN NaN NaN NaN \n", - "2023-10-12 MARKET NaN NaN NaN NaN \n", - "2023-10-13 MARKET NaN NaN NaN NaN \n", - "2023-10-16 MARKET NaN NaN NaN NaN \n", - "2023-10-17 MARKET NaN NaN NaN NaN \n", - "2023-10-18 MARKET NaN NaN NaN NaN \n", - "2023-10-19 MARKET NaN NaN NaN NaN \n", - "2023-10-20 MARKET NaN NaN NaN NaN \n", - "2023-10-23 MARKET NaN NaN NaN NaN \n", - "2023-10-24 MARKET NaN NaN NaN NaN \n", - "2023-10-25 SIGNAL AMZN CLOSE AMZN20231025LONG NaN \n", - "2023-10-25 MARKET NaN NaN NaN NaN \n", - "2023-10-25 SIGNAL MSFT CLOSE MSFT20231025LONG NaN \n", - "\n", - " order_settings \n", - "datetime \n", - "2023-07-05 NaN \n", - "2023-07-05 NaN \n", - "2023-07-05 NaN \n", - "2023-07-05 NaN \n", - "2023-07-05 NaN \n", - "2023-07-05 NaN \n", - "2023-07-06 NaN \n", - "2023-07-07 NaN \n", - "2023-07-10 NaN \n", - "2023-07-11 NaN \n", - "2023-07-12 NaN \n", - "2023-07-13 NaN \n", - "2023-07-14 NaN \n", - "2023-07-17 NaN \n", - "2023-07-18 NaN \n", - "2023-07-19 NaN \n", - "2023-07-20 NaN \n", - "2023-07-21 NaN \n", - "2023-07-24 NaN \n", - "2023-07-25 NaN \n", - "2023-07-26 NaN \n", - "2023-07-27 NaN \n", - "2023-07-28 NaN \n", - "2023-07-31 NaN \n", - "2023-08-01 NaN \n", - "2023-08-02 NaN \n", - "2023-08-02 NaN \n", - "2023-08-03 NaN \n", - "2023-08-04 NaN \n", - "2023-08-04 NaN \n", - "2023-08-07 NaN \n", - "2023-08-08 NaN \n", - "2023-08-09 NaN \n", - "2023-08-09 NaN \n", - "2023-08-09 NaN \n", - "2023-08-10 NaN \n", - "2023-08-11 NaN \n", - "2023-08-14 NaN \n", - "2023-08-15 NaN \n", - "2023-08-16 NaN \n", - "2023-08-17 NaN \n", - "2023-08-18 NaN \n", - "2023-08-18 NaN \n", - "2023-08-21 NaN \n", - "2023-08-22 NaN \n", - "2023-08-23 NaN \n", - "2023-08-24 NaN \n", - "2023-08-25 NaN \n", - "2023-08-28 NaN \n", - "2023-08-29 NaN \n", - "2023-08-30 NaN \n", - "2023-08-31 NaN \n", - "2023-09-01 NaN \n", - "2023-09-04 NaN \n", - "2023-09-05 NaN \n", - "2023-09-06 NaN \n", - "2023-09-07 NaN \n", - "2023-09-08 NaN \n", - "2023-09-11 NaN \n", - "2023-09-12 NaN \n", - "2023-09-13 NaN \n", - "2023-09-14 NaN \n", - "2023-09-15 NaN \n", - "2023-09-18 NaN \n", - "2023-09-19 NaN \n", - "2023-09-20 NaN \n", - "2023-09-21 NaN \n", - "2023-09-22 NaN \n", - "2023-09-25 NaN \n", - "2023-09-26 NaN \n", - "2023-09-27 NaN \n", - "2023-09-28 NaN \n", - "2023-09-29 NaN \n", - "2023-10-02 NaN \n", - "2023-10-03 NaN \n", - "2023-10-04 NaN \n", - "2023-10-05 NaN \n", - "2023-10-06 NaN \n", - "2023-10-09 NaN \n", - "2023-10-10 NaN \n", - "2023-10-11 NaN \n", - "2023-10-12 NaN \n", - "2023-10-13 NaN \n", - "2023-10-16 NaN \n", - "2023-10-17 NaN \n", - "2023-10-18 NaN \n", - "2023-10-19 NaN \n", - "2023-10-20 NaN \n", - "2023-10-23 NaN \n", - "2023-10-24 NaN \n", - "2023-10-25 NaN \n", - "2023-10-25 NaN \n", - "2023-10-25 NaN " - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.events.events" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'TSLA': 30, 'AAPL': 30, 'MSFT': 30, 'AVGO': 30, 'AMZN': 30}" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.portfolio.roll_map" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Saving to cache from db\n", - "Buy Details\n", - "Position: {'long': ['TSLA20240621C283.33'], 'short': ['TSLA20240621C400'], 'trade_id': '&L:TSLA20240621C283.33&S:TSLA20240621C400', 'close': 34.225}, Date: 2023-07-05, Signal: SignalEvent type:LONG, symbol=TSLA, date:2023-07-05 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:TSLA20230705LONG\n", - "Max Contract Price: 41.06437111050783, Cash at Hand: 73.9158679989141\n", - "Cash at Hand 73.9158679989141 Close 34.225\n", - "Processing event: SIGNAL\n", - "Buy Details\n", - "Position: {'long': ['AAPL20240621C195'], 'short': ['AAPL20240621C270'], 'trade_id': '&L:AAPL20240621C195&S:AAPL20240621C270', 'close': 18.665}, Date: 2023-07-05, Signal: SignalEvent type:LONG, symbol=AAPL, date:2023-07-05 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:AAPL20230705LONG\n", - "Max Contract Price: 23.253140269800777, Cash at Hand: 41.8556524856414\n", - "Cash at Hand 41.8556524856414 Close 18.665\n", - "Processing event: SIGNAL\n", - "Buy Details\n", - "Position: {'long': ['MSFT20240621C345'], 'short': ['MSFT20240621C450'], 'trade_id': '&L:MSFT20240621C345&S:MSFT20240621C450', 'close': 31.325}, Date: 2023-07-05, Signal: SignalEvent type:LONG, symbol=MSFT, date:2023-07-05 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:MSFT20230705LONG\n", - "Max Contract Price: 31.940905241689837, Cash at Hand: 57.49362943504171\n", - "Cash at Hand 57.49362943504171 Close 31.325\n", - "Processing event: SIGNAL\n", - "Not generating order because:TOO_ILLIQUID SignalEvent type:LONG, symbol=AVGO, date:2023-07-05 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:AVGO20230705LONG, adding new signal with adjusted dte. specifics: [{'direction': 'long', 'rel_strike': 0.9, 'dte': 305, 'moneyness_width': 0.1}, {'direction': 'short', 'rel_strike': 0.8, 'dte': 305, 'moneyness_width': 0.1}]\n", - "Processing event: SIGNAL\n", - "Buy Details\n", - "Position: {'long': ['AMZN20240621C132.5'], 'short': ['AMZN20240621C185'], 'trade_id': '&L:AMZN20240621C132.5&S:AMZN20240621C185', 'close': 15.250000000000004}, Date: 2023-07-05, Signal: SignalEvent type:LONG, symbol=AMZN, date:2023-07-05 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:AMZN20230705LONG\n", - "Max Contract Price: 16.230819302550866, Cash at Hand: 29.21547474459156\n", - "Cash at Hand 29.21547474459156 Close 15.250000000000004\n", - "Processing event: ORDER\n", - "Buy Order Position: {'long': ['TSLA20240621C283.33'], 'short': ['TSLA20240621C400'], 'trade_id': '&L:TSLA20240621C283.33&S:TSLA20240621C400', 'close': 34.225} Price: 34.26309252624952 Quantity: 2 Datetime: 2023-07-05 00:00:00\n", - "Processing event: ORDER\n", - "Buy Order Position: {'long': ['AAPL20240621C195'], 'short': ['AAPL20240621C270'], 'trade_id': '&L:AAPL20240621C195&S:AAPL20240621C270', 'close': 18.665} Price: 18.697138376605107 Quantity: 2 Datetime: 2023-07-05 00:00:00\n", - "Processing event: ORDER\n", - "Buy Order Position: {'long': ['MSFT20240621C345'], 'short': ['MSFT20240621C450'], 'trade_id': '&L:MSFT20240621C345&S:MSFT20240621C450', 'close': 31.325} Price: 31.35634152086264 Quantity: 1 Datetime: 2023-07-05 00:00:00\n", - "Processing event: SIGNAL\n", - "Not generating order because:TOO_ILLIQUID SignalEvent type:LONG, symbol=AVGO, date:2023-07-05 00:00:00, Order Settings={'type': 'naked', 'specifics': [{'direction': 'long', 'rel_strike': 0.9, 'dte': 305, 'moneyness_width': 0.1}, {'direction': 'short', 'rel_strike': 0.8, 'dte': 305, 'moneyness_width': 0.1}], 'name': 'vertical_spread'},Max Contract Price:None , signal_id:AVGO20230705LONG, adding new signal with adjusted dte. specifics: [{'direction': 'long', 'rel_strike': 0.9, 'dte': 245, 'moneyness_width': 0.1}, {'direction': 'short', 'rel_strike': 0.8, 'dte': 245, 'moneyness_width': 0.1}]\n", - "Processing event: ORDER\n", - "Buy Order Position: {'long': ['AMZN20240621C132.5'], 'short': ['AMZN20240621C185'], 'trade_id': '&L:AMZN20240621C132.5&S:AMZN20240621C185', 'close': 15.250000000000004} Price: 15.257969346497632 Quantity: 1 Datetime: 2023-07-05 00:00:00\n", - "Processing event: FILL\n", - "Processing event: FILL\n", - "Processing event: FILL\n", - "Processing event: SIGNAL\n", - "Buy Details\n", - "Position: {'long': ['AVGO20240119C900'], 'short': ['AVGO20240119C1000'], 'trade_id': '&L:AVGO20240119C900&S:AVGO20240119C1000', 'close': 32.800000000000004}, Date: 2023-07-05, Signal: SignalEvent type:LONG, symbol=AVGO, date:2023-07-05 00:00:00, Order Settings={'type': 'naked', 'specifics': [{'direction': 'long', 'rel_strike': 0.9, 'dte': 245, 'moneyness_width': 0.1}, {'direction': 'short', 'rel_strike': 0.8, 'dte': 245, 'moneyness_width': 0.1}], 'name': 'vertical_spread'},Max Contract Price:None , signal_id:AVGO20230705LONG\n", - "Max Contract Price: 44.35161718510337, Cash at Hand: 79.83291093318607\n", - "Cash at Hand 79.83291093318607 Close 32.800000000000004\n", - "Processing event: FILL\n", - "Processing event: ORDER\n", - "Buy Order Position: {'long': ['AVGO20240119C900'], 'short': ['AVGO20240119C1000'], 'trade_id': '&L:AVGO20240119C900&S:AVGO20240119C1000', 'close': 32.800000000000004} Price: 32.835827812304345 Quantity: 2 Datetime: 2023-07-05 00:00:00\n", - "Processing event: FILL\n", - "Event queue is empty, processed 18 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Sell Order Position: {'long': ['TSLA20240621C283.33'], 'short': ['TSLA20240621C400'], 'trade_id': '&L:TSLA20240621C283.33&S:TSLA20240621C400', 'close': 25.5} Price: 25.4806343153999 Quantity: 2 Datetime: 2023-08-02 00:00:00\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Sell Order Position: {'long': ['AAPL20240621C195'], 'short': ['AAPL20240621C270'], 'trade_id': '&L:AAPL20240621C195&S:AAPL20240621C270', 'close': 13.780000000000001} Price: 13.769283041088475 Quantity: 2 Datetime: 2023-08-04 00:00:00\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Pushing SignalEvent type:LONG, symbol=MSFT, date:2023-08-09 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:MSFT20230809LONG to back of queue because conflicting events were found: [\"OrderEvent type=MKT, symbol=MSFT, date:2023-08-09 00:00:00, cash:None, quantity=1, direction=SELL, position={'long': ['MSFT20240621C345'], 'short': ['MSFT20240621C450'], 'trade_id': '&L:MSFT20240621C345&S:MSFT20240621C450', 'close': 23.049999999999997}, signal_id=MSFT20230705LONG\"]\n", - "Processing event: ORDER\n", - "Sell Order Position: {'long': ['MSFT20240621C345'], 'short': ['MSFT20240621C450'], 'trade_id': '&L:MSFT20240621C345&S:MSFT20240621C450', 'close': 23.049999999999997} Price: 23.038100128987466 Quantity: 1 Datetime: 2023-08-09 00:00:00\n", - "Pushing SignalEvent type:LONG, symbol=MSFT, date:2023-08-09 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:MSFT20230809LONG to back of queue because conflicting events were found: [\"FillEvent symbol=MSFT, date:2023-08-09 00:00:00, exchange=ARCA, quantity=1, direction=SELL, fill_cost=23.032520128987468, commission=0.00558, market_value=23.038100128987466, slippage=-0.011899871012531094, position={'long': ['MSFT20240621C345'], 'short': ['MSFT20240621C450'], 'trade_id': '&L:MSFT20240621C345&S:MSFT20240621C450', 'close': 23.049999999999997}, signal_id=MSFT20230705LONG\"]\n", - "Processing event: FILL\n", - "Processing event: SIGNAL\n", - "Not generating order because:TOO_ILLIQUID SignalEvent type:LONG, symbol=MSFT, date:2023-08-09 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:MSFT20230809LONG, adding new signal with adjusted dte. specifics: [{'direction': 'long', 'rel_strike': 0.9, 'dte': 305, 'moneyness_width': 0.1}, {'direction': 'short', 'rel_strike': 0.8, 'dte': 305, 'moneyness_width': 0.1}]\n", - "Processing event: SIGNAL\n", - "Buy Details\n", - "Position: {'long': ['MSFT20240621C330'], 'short': ['MSFT20240621C460'], 'trade_id': '&L:MSFT20240621C330&S:MSFT20240621C460', 'close': 31.550000000000004}, Date: 2023-08-09, Signal: SignalEvent type:LONG, symbol=MSFT, date:2023-08-09 00:00:00, Order Settings={'type': 'naked', 'specifics': [{'direction': 'long', 'rel_strike': 0.9, 'dte': 305, 'moneyness_width': 0.1}, {'direction': 'short', 'rel_strike': 0.8, 'dte': 305, 'moneyness_width': 0.1}], 'name': 'vertical_spread'},Max Contract Price:None , signal_id:MSFT20230809LONG\n", - "Max Contract Price: 31.940905241689837, Cash at Hand: 49.99716818235405\n", - "Cash at Hand 49.99716818235405 Close 31.550000000000004\n", - "Processing event: ORDER\n", - "Buy Order Position: {'long': ['MSFT20240621C330'], 'short': ['MSFT20240621C460'], 'trade_id': '&L:MSFT20240621C330&S:MSFT20240621C460', 'close': 31.550000000000004} Price: 31.586682809586964 Quantity: 1 Datetime: 2023-08-09 00:00:00\n", - "Processing event: FILL\n", - "Event queue is empty, processed 8 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Sell Order Position: {'long': ['AVGO20240119C900'], 'short': ['AVGO20240119C1000'], 'trade_id': '&L:AVGO20240119C900&S:AVGO20240119C1000', 'close': 24.950000000000003} Price: 24.906857005068606 Quantity: 2 Datetime: 2023-08-18 00:00:00\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Sell Order Position: {'long': ['AMZN20240621C132.5'], 'short': ['AMZN20240621C185'], 'trade_id': '&L:AMZN20240621C132.5&S:AMZN20240621C185', 'close': 10.465} Price: 10.455459552776325 Quantity: 1 Datetime: 2023-10-25 00:00:00\n", - "Processing event: ORDER\n", - "Sell Order Position: {'long': ['MSFT20240621C330'], 'short': ['MSFT20240621C460'], 'trade_id': '&L:MSFT20240621C330&S:MSFT20240621C460', 'close': 38.96} Price: 38.93163409129954 Quantity: 1 Datetime: 2023-10-25 00:00:00\n", - "Processing event: FILL\n", - "Processing event: FILL\n", - "Event queue is empty, processed 7 event(s)\n", - "No more dates left.\n" - ] - } - ], - "source": [ - "import cProfile\n", - "import pstats\n", - "import io\n", - "\n", - "profiler = cProfile.Profile()\n", - "profiler.enable()\n", - "#run backtest \n", - "\n", - "evb_backtest.run()\n", - "profiler.disable()\n", - "stream = io.StringIO()\n", - "stats = pstats.Stats(profiler, stream=stream).sort_stats('cumulative')" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - "
" - ], - "text/plain": [ - "Empty DataFrame\n", - "Columns: []\n", - "Index: []" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pd.DataFrame(evb_backtest.portfolio.unprocessed_signals)" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
TickerPnLReturnPctEntryPriceEntryCommissionEntrySlippageEntryMarketValueTotalEntryCostAuxilaryEntryCostExitPriceExitCommissionExitSlippageExitMarketValueTotalExitCostAuxilaryExitCostQuantityEntryTimeExitTimeDurationPositionsSignalID
0TSLA-1758.723642-0.2566083426.8672531.1167.6185056852.61850568.5373458.7345052547.5054321.116-3.8731375096.12686350.9501094.98913722023-07-052023-08-0228&L:TSLA20240621C283.33&S:TSLA20240621C400TSLA20230705LONG
1AAPL-987.803067-0.2640801870.2718381.1166.4276753739.42767537.4054377.5436751376.3703041.116-2.1433922753.85660827.5274063.25939222023-07-052023-08-0430&L:AAPL20240621C195&S:AAPL20240621C270AAPL20230705LONG
2MSFT-832.940139-0.2655903136.1921520.5583.1341523135.63415231.3619223.6921522303.2520130.558-1.1899872303.81001323.0325201.74798712023-07-052023-08-0935&L:MSFT20240621C345&S:MSFT20240621C450MSFT20230705LONG
3AMZN-481.366979-0.3153701526.3549350.5580.7969351525.79693515.2635491.3549351044.9879550.558-0.9540451045.54595510.4498801.51204512023-07-052023-10-25112&L:AMZN20240621C132.5&S:AMZN20240621C185AMZN20230705LONG
4AVGO-1588.026161-0.2417723284.1407811.1167.1655626567.16556265.6828168.2815622490.1277011.116-8.6285994981.37140149.8025549.74459922023-07-052023-08-1844&L:AVGO20240119C900&S:AVGO20240119C1000AVGO20230705LONG
5MSFT733.3791280.2321393159.2262810.5583.6682813158.66828131.5922634.2262813892.6054090.558-2.8365913893.16340938.9260543.39459112023-08-092023-10-2577&L:MSFT20240621C330&S:MSFT20240621C460MSFT20230809LONG
\n", - "
" - ], - "text/plain": [ - " Ticker PnL ReturnPct EntryPrice EntryCommission EntrySlippage \\\n", - "0 TSLA -1758.723642 -0.256608 3426.867253 1.116 7.618505 \n", - "1 AAPL -987.803067 -0.264080 1870.271838 1.116 6.427675 \n", - "2 MSFT -832.940139 -0.265590 3136.192152 0.558 3.134152 \n", - "3 AMZN -481.366979 -0.315370 1526.354935 0.558 0.796935 \n", - "4 AVGO -1588.026161 -0.241772 3284.140781 1.116 7.165562 \n", - "5 MSFT 733.379128 0.232139 3159.226281 0.558 3.668281 \n", - "\n", - " EntryMarketValue TotalEntryCost AuxilaryEntryCost ExitPrice \\\n", - "0 6852.618505 68.537345 8.734505 2547.505432 \n", - "1 3739.427675 37.405437 7.543675 1376.370304 \n", - "2 3135.634152 31.361922 3.692152 2303.252013 \n", - "3 1525.796935 15.263549 1.354935 1044.987955 \n", - "4 6567.165562 65.682816 8.281562 2490.127701 \n", - "5 3158.668281 31.592263 4.226281 3892.605409 \n", - "\n", - " ExitCommission ExitSlippage ExitMarketValue TotalExitCost \\\n", - "0 1.116 -3.873137 5096.126863 50.950109 \n", - "1 1.116 -2.143392 2753.856608 27.527406 \n", - "2 0.558 -1.189987 2303.810013 23.032520 \n", - "3 0.558 -0.954045 1045.545955 10.449880 \n", - "4 1.116 -8.628599 4981.371401 49.802554 \n", - "5 0.558 -2.836591 3893.163409 38.926054 \n", - "\n", - " AuxilaryExitCost Quantity EntryTime ExitTime Duration \\\n", - "0 4.989137 2 2023-07-05 2023-08-02 28 \n", - "1 3.259392 2 2023-07-05 2023-08-04 30 \n", - "2 1.747987 1 2023-07-05 2023-08-09 35 \n", - "3 1.512045 1 2023-07-05 2023-10-25 112 \n", - "4 9.744599 2 2023-07-05 2023-08-18 44 \n", - "5 3.394591 1 2023-08-09 2023-10-25 77 \n", - "\n", - " Positions SignalID \n", - "0 &L:TSLA20240621C283.33&S:TSLA20240621C400 TSLA20230705LONG \n", - "1 &L:AAPL20240621C195&S:AAPL20240621C270 AAPL20230705LONG \n", - "2 &L:MSFT20240621C345&S:MSFT20240621C450 MSFT20230705LONG \n", - "3 &L:AMZN20240621C132.5&S:AMZN20240621C185 AMZN20230705LONG \n", - "4 &L:AVGO20240119C900&S:AVGO20240119C1000 AVGO20230705LONG \n", - "5 &L:MSFT20240621C330&S:MSFT20240621C460 MSFT20230809LONG " - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.portfolio.trades" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
TSLAAAPLMSFTAVGOAMZNcashcommissiontotal
datetime
2023-07-058212.8742224650.6280546388.1810488870.3234373246.16386168631.8293780.00000100000.000000
2023-07-058204.1397174650.6280546388.1810488870.3234373246.16386168631.8293780.0111699991.265495
2023-07-058204.1397174643.0843796388.1810488870.3234373246.16386168631.8293780.0223299983.721819
2023-07-058204.1397174643.0843796384.4888968870.3234373246.16386168631.8293780.0279099980.029667
2023-07-058204.1397174643.0843796384.4888968870.3234373244.80892668631.8293780.0334899978.674733
2023-07-058204.1397174643.0843796384.4888968862.0418753244.80892668631.8293780.0446499970.393170
2023-07-058204.1397174643.0843796384.4888968862.0418753244.80892668631.8293780.0446499970.393170
2023-07-067934.1397174751.0843796481.9888968342.0418753157.30892668631.8293780.0446499298.393170
2023-07-077784.1397174619.0843796349.4888968282.0418753227.30892668631.8293780.0446498893.893170
2023-07-107494.1397174374.0843796091.9888969552.0418753103.80892668631.8293780.0446499247.893170
2023-07-117449.1397174328.0843796091.9888969672.0418753172.30892668631.8293780.0446499345.393170
2023-07-127614.1397174476.0843796284.4888969882.0418753254.80892668631.8293780.04464100143.393170
2023-07-137889.1397174525.0843796571.98889610122.0418753407.30892668631.8293780.04464101147.393170
2023-07-148109.1397174538.0843796554.4888969752.0418753422.30892668631.8293780.04464101007.893170
2023-07-178624.1397174866.0843796636.98889610832.0418753374.80892668631.8293780.04464102965.893170
2023-07-188819.1397174840.0843797214.48889610602.0418753327.30892668631.8293780.04464103434.893170
2023-07-198579.1397175011.0843796976.98889610532.0418753357.30892668631.8293780.04464103088.393170
2023-07-206969.1397174790.0843796699.4888969872.0418753199.80892668631.8293780.04464100162.393170
2023-07-216764.1397174626.0843796541.9888969982.0418753184.80892668631.8293780.0446499730.893170
2023-07-247314.1397174717.0843796604.48889610352.0418753132.30892668631.8293780.04464100751.893170
2023-07-256999.1397174808.0843796929.48889611182.0418753132.30892668631.8293780.04464101682.893170
2023-07-267119.1397174939.0843796209.48889610132.0418753102.30892668631.8293780.04464100133.893170
2023-07-276529.1397174863.0843795889.48889610082.0418753099.80892668631.8293780.0446499095.393170
2023-07-287164.1397175134.0843796204.48889610372.0418753267.30892668631.8293780.04464100773.893170
2023-07-317209.1397175191.0843796071.98889610142.0418753337.30892668631.8293780.04464100583.393170
2023-08-016849.1397175084.0843796096.98889611122.0418753244.80892668631.8293780.04464101028.893170
2023-08-026454.1505804811.0843795796.9888969982.0418753112.30892668631.8293780.0558098788.404033
2023-08-026454.1505804811.0843795796.9888969982.0418753112.30892668631.8293780.0558098788.404033
2023-08-036454.1505804599.0843795754.4888969772.0418753129.80892668631.8293780.0558098341.404033
2023-08-046454.1505803662.8249875819.4888969652.0418753597.30892668631.8293780.0669697817.644642
2023-08-046454.1505803662.8249875819.4888969652.0418753597.30892668631.8293780.0669697817.644642
2023-08-076454.1505803662.8249875854.48889610212.0418753712.30892668631.8293780.0669698527.644642
2023-08-086454.1505803662.8249875694.4888969792.0418753614.80892668631.8293780.0669697850.144642
2023-08-096454.1505803662.8249875555.2409098452.0418753519.80892668631.8293780.0725496275.896654
2023-08-096454.1505803662.8249875551.0146288452.0418753519.80892668631.8293780.0781296271.670373
2023-08-096454.1505803662.8249875551.0146288452.0418753519.80892668631.8293780.0781296271.670373
2023-08-106454.1505803662.8249875528.5146288082.0418753549.80892668631.8293780.0781295909.170373
2023-08-116454.1505803662.8249875408.5146287552.0418753544.80892668631.8293780.0781295254.170373
2023-08-146454.1505803662.8249875513.5146288452.0418753632.30892668631.8293780.0781296346.670373
2023-08-156454.1505803662.8249875458.5146288122.0418753494.80892668631.8293780.0781295824.170373
2023-08-166454.1505803662.8249875433.5146287782.0418753394.80892668631.8293780.0781295359.170373
2023-08-176454.1505803662.8249875278.5146287462.0418753337.30892668631.8293780.0781294826.670373
2023-08-186454.1505803662.8249875238.5146287282.2972763317.30892668631.8293780.0892894586.925774
2023-08-186454.1505803662.8249875238.5146287282.2972763317.30892668631.8293780.0892894586.925774
2023-08-216454.1505803662.8249875491.0146287282.2972763374.80892668631.8293780.0892894896.925774
2023-08-226454.1505803662.8249875528.5146287282.2972763362.30892668631.8293780.0892894921.925774
2023-08-236454.1505803662.8249875666.0146287282.2972763412.30892668631.8293780.0892895109.425774
2023-08-246454.1505803662.8249875486.0146287282.2972763247.30892668631.8293780.0892894764.425774
2023-08-256454.1505803662.8249875536.0146287282.2972763302.30892668631.8293780.0892894869.425774
2023-08-286454.1505803662.8249875547.5146287282.2972763187.30892668631.8293780.0892894765.925774
2023-08-296454.1505803662.8249875723.5146287282.2972763369.80892668631.8293780.0892895124.425774
2023-08-306454.1505803662.8249875756.0146287282.2972763374.80892668631.8293780.0892895161.925774
2023-08-316454.1505803662.8249875683.5146287282.2972763507.30892668631.8293780.0892895221.925774
2023-09-016454.1505803662.8249875668.5146287282.2972763504.80892668631.8293780.0892895204.425774
2023-09-046454.1505803662.8249875998.5146287282.2972763464.80892668631.8293780.0892895494.425774
2023-09-056454.1505803662.8249875998.5146287282.2972763464.80892668631.8293780.0892895494.425774
2023-09-066454.1505803662.8249875953.5146287282.2972763377.30892668631.8293780.0892895361.925774
2023-09-076454.1505803662.8249875808.5146287282.2972763494.80892668631.8293780.0892895334.425774
2023-09-086454.1505803662.8249876026.0146287282.2972763519.80892668631.8293780.0892895576.925774
2023-09-116454.1505803662.8249876203.5146287282.2972763747.30892668631.8293780.0892895981.925774
2023-09-126454.1505803662.8249875781.0146287282.2972763657.30892668631.8293780.0892895469.425774
2023-09-136454.1505803662.8249876133.5146287282.2972763847.30892668631.8293780.0892896011.925774
2023-09-146454.1505803662.8249876238.5146287282.2972763809.80892668631.8293780.0892896079.425774
2023-09-156454.1505803662.8249875718.5146287282.2972763632.30892668631.8293780.0892895381.925774
2023-09-186454.1505803662.8249875711.0146287282.2972763617.30892668631.8293780.0892895359.425774
2023-09-196454.1505803662.8249875626.5146287282.2972763464.80892668631.8293780.0892895122.425774
2023-09-206454.1505803662.8249875218.0146287282.2972763349.80892668631.8293780.0892894598.925774
2023-09-216454.1505803662.8249875213.0146287282.2972763078.80892668631.8293780.0892894322.925774
2023-09-226454.1505803662.8249874953.0146287282.2972763062.80892668631.8293780.0892894046.925774
2023-09-256454.1505803662.8249875072.5146287282.2972763160.30892668631.8293780.0892894263.925774
2023-09-266454.1505803662.8249874819.0146287282.2972762942.30892668631.8293780.0892893792.425774
2023-09-276454.1505803662.8249874863.0146287282.2972762934.30892668631.8293780.0892893828.425774
2023-09-286454.1505803662.8249874836.5146287282.2972762926.80892668631.8293780.0892893794.425774
2023-09-296454.1505803662.8249874898.0146287282.2972762970.30892668631.8293780.0892893899.425774
2023-10-026454.1505803662.8249875282.5146287282.2972763075.80892668631.8293780.0892894389.425774
2023-10-036454.1505803662.8249874870.5146287282.2972762898.80892668631.8293780.0892893800.425774
2023-10-046454.1505803662.8249875147.5146287282.2972762981.80892668631.8293780.0892894160.425774
2023-10-056454.1505803662.8249875142.5146287282.2972762943.30892668631.8293780.0892894116.925774
2023-10-066454.1505803662.8249875526.0146287282.2972763014.80892668631.8293780.0892894571.925774
2023-10-096454.1505803662.8249875700.0146287282.2972763028.80892668631.8293780.0892894759.925774
2023-10-106454.1505803662.8249875621.0146287282.2972763076.30892668631.8293780.0892894728.425774
2023-10-116454.1505803662.8249875779.5146287282.2972763190.80892668631.8293780.0892895001.425774
2023-10-126454.1505803662.8249875665.5146287282.2972763208.30892668631.8293780.0892894904.925774
2023-10-136454.1505803662.8249875593.5146287282.2972763109.80892668631.8293780.0892894734.425774
2023-10-166454.1505803662.8249875789.0146287282.2972763232.30892668631.8293780.0892895052.425774
2023-10-176454.1505803662.8249875735.5146287282.2972763173.30892668631.8293780.0892894939.925774
2023-10-186454.1505803662.8249875675.0146287282.2972763065.80892668631.8293780.0892894771.925774
2023-10-196454.1505803662.8249875813.5146287282.2972763014.30892668631.8293780.0892894858.925774
2023-10-206454.1505803662.8249875563.5146287282.2972762905.30892668631.8293780.0892894499.925774
2023-10-236454.1505803662.8249875666.5146287282.2972762965.30892668631.8293780.0892894662.925774
2023-10-246454.1505803662.8249875739.0146287282.2972763063.80892668631.8293780.0892894833.925774
2023-10-256454.1505803662.8249876292.0146287282.2972762764.79688168631.8293780.0948695087.913730
2023-10-256454.1505803662.8249876288.6200377282.2972762764.79688168631.8293780.1004495084.519139
2023-10-256454.1505803662.8249876288.6200377282.2972762764.79688168631.8293780.1004495084.519139
\n", - "
" - ], - "text/plain": [ - " TSLA AAPL MSFT AVGO AMZN \\\n", - "datetime \n", - "2023-07-05 8212.874222 4650.628054 6388.181048 8870.323437 3246.163861 \n", - "2023-07-05 8204.139717 4650.628054 6388.181048 8870.323437 3246.163861 \n", - "2023-07-05 8204.139717 4643.084379 6388.181048 8870.323437 3246.163861 \n", - "2023-07-05 8204.139717 4643.084379 6384.488896 8870.323437 3246.163861 \n", - "2023-07-05 8204.139717 4643.084379 6384.488896 8870.323437 3244.808926 \n", - "2023-07-05 8204.139717 4643.084379 6384.488896 8862.041875 3244.808926 \n", - "2023-07-05 8204.139717 4643.084379 6384.488896 8862.041875 3244.808926 \n", - "2023-07-06 7934.139717 4751.084379 6481.988896 8342.041875 3157.308926 \n", - "2023-07-07 7784.139717 4619.084379 6349.488896 8282.041875 3227.308926 \n", - "2023-07-10 7494.139717 4374.084379 6091.988896 9552.041875 3103.808926 \n", - "2023-07-11 7449.139717 4328.084379 6091.988896 9672.041875 3172.308926 \n", - "2023-07-12 7614.139717 4476.084379 6284.488896 9882.041875 3254.808926 \n", - "2023-07-13 7889.139717 4525.084379 6571.988896 10122.041875 3407.308926 \n", - "2023-07-14 8109.139717 4538.084379 6554.488896 9752.041875 3422.308926 \n", - "2023-07-17 8624.139717 4866.084379 6636.988896 10832.041875 3374.808926 \n", - "2023-07-18 8819.139717 4840.084379 7214.488896 10602.041875 3327.308926 \n", - "2023-07-19 8579.139717 5011.084379 6976.988896 10532.041875 3357.308926 \n", - "2023-07-20 6969.139717 4790.084379 6699.488896 9872.041875 3199.808926 \n", - "2023-07-21 6764.139717 4626.084379 6541.988896 9982.041875 3184.808926 \n", - "2023-07-24 7314.139717 4717.084379 6604.488896 10352.041875 3132.308926 \n", - "2023-07-25 6999.139717 4808.084379 6929.488896 11182.041875 3132.308926 \n", - "2023-07-26 7119.139717 4939.084379 6209.488896 10132.041875 3102.308926 \n", - "2023-07-27 6529.139717 4863.084379 5889.488896 10082.041875 3099.808926 \n", - "2023-07-28 7164.139717 5134.084379 6204.488896 10372.041875 3267.308926 \n", - "2023-07-31 7209.139717 5191.084379 6071.988896 10142.041875 3337.308926 \n", - "2023-08-01 6849.139717 5084.084379 6096.988896 11122.041875 3244.808926 \n", - "2023-08-02 6454.150580 4811.084379 5796.988896 9982.041875 3112.308926 \n", - "2023-08-02 6454.150580 4811.084379 5796.988896 9982.041875 3112.308926 \n", - "2023-08-03 6454.150580 4599.084379 5754.488896 9772.041875 3129.808926 \n", - "2023-08-04 6454.150580 3662.824987 5819.488896 9652.041875 3597.308926 \n", - "2023-08-04 6454.150580 3662.824987 5819.488896 9652.041875 3597.308926 \n", - "2023-08-07 6454.150580 3662.824987 5854.488896 10212.041875 3712.308926 \n", - "2023-08-08 6454.150580 3662.824987 5694.488896 9792.041875 3614.808926 \n", - "2023-08-09 6454.150580 3662.824987 5555.240909 8452.041875 3519.808926 \n", - "2023-08-09 6454.150580 3662.824987 5551.014628 8452.041875 3519.808926 \n", - "2023-08-09 6454.150580 3662.824987 5551.014628 8452.041875 3519.808926 \n", - "2023-08-10 6454.150580 3662.824987 5528.514628 8082.041875 3549.808926 \n", - "2023-08-11 6454.150580 3662.824987 5408.514628 7552.041875 3544.808926 \n", - "2023-08-14 6454.150580 3662.824987 5513.514628 8452.041875 3632.308926 \n", - "2023-08-15 6454.150580 3662.824987 5458.514628 8122.041875 3494.808926 \n", - "2023-08-16 6454.150580 3662.824987 5433.514628 7782.041875 3394.808926 \n", - "2023-08-17 6454.150580 3662.824987 5278.514628 7462.041875 3337.308926 \n", - "2023-08-18 6454.150580 3662.824987 5238.514628 7282.297276 3317.308926 \n", - "2023-08-18 6454.150580 3662.824987 5238.514628 7282.297276 3317.308926 \n", - "2023-08-21 6454.150580 3662.824987 5491.014628 7282.297276 3374.808926 \n", - "2023-08-22 6454.150580 3662.824987 5528.514628 7282.297276 3362.308926 \n", - "2023-08-23 6454.150580 3662.824987 5666.014628 7282.297276 3412.308926 \n", - "2023-08-24 6454.150580 3662.824987 5486.014628 7282.297276 3247.308926 \n", - "2023-08-25 6454.150580 3662.824987 5536.014628 7282.297276 3302.308926 \n", - "2023-08-28 6454.150580 3662.824987 5547.514628 7282.297276 3187.308926 \n", - "2023-08-29 6454.150580 3662.824987 5723.514628 7282.297276 3369.808926 \n", - "2023-08-30 6454.150580 3662.824987 5756.014628 7282.297276 3374.808926 \n", - "2023-08-31 6454.150580 3662.824987 5683.514628 7282.297276 3507.308926 \n", - "2023-09-01 6454.150580 3662.824987 5668.514628 7282.297276 3504.808926 \n", - "2023-09-04 6454.150580 3662.824987 5998.514628 7282.297276 3464.808926 \n", - "2023-09-05 6454.150580 3662.824987 5998.514628 7282.297276 3464.808926 \n", - "2023-09-06 6454.150580 3662.824987 5953.514628 7282.297276 3377.308926 \n", - "2023-09-07 6454.150580 3662.824987 5808.514628 7282.297276 3494.808926 \n", - "2023-09-08 6454.150580 3662.824987 6026.014628 7282.297276 3519.808926 \n", - "2023-09-11 6454.150580 3662.824987 6203.514628 7282.297276 3747.308926 \n", - "2023-09-12 6454.150580 3662.824987 5781.014628 7282.297276 3657.308926 \n", - "2023-09-13 6454.150580 3662.824987 6133.514628 7282.297276 3847.308926 \n", - "2023-09-14 6454.150580 3662.824987 6238.514628 7282.297276 3809.808926 \n", - "2023-09-15 6454.150580 3662.824987 5718.514628 7282.297276 3632.308926 \n", - "2023-09-18 6454.150580 3662.824987 5711.014628 7282.297276 3617.308926 \n", - "2023-09-19 6454.150580 3662.824987 5626.514628 7282.297276 3464.808926 \n", - "2023-09-20 6454.150580 3662.824987 5218.014628 7282.297276 3349.808926 \n", - "2023-09-21 6454.150580 3662.824987 5213.014628 7282.297276 3078.808926 \n", - "2023-09-22 6454.150580 3662.824987 4953.014628 7282.297276 3062.808926 \n", - "2023-09-25 6454.150580 3662.824987 5072.514628 7282.297276 3160.308926 \n", - "2023-09-26 6454.150580 3662.824987 4819.014628 7282.297276 2942.308926 \n", - "2023-09-27 6454.150580 3662.824987 4863.014628 7282.297276 2934.308926 \n", - "2023-09-28 6454.150580 3662.824987 4836.514628 7282.297276 2926.808926 \n", - "2023-09-29 6454.150580 3662.824987 4898.014628 7282.297276 2970.308926 \n", - "2023-10-02 6454.150580 3662.824987 5282.514628 7282.297276 3075.808926 \n", - "2023-10-03 6454.150580 3662.824987 4870.514628 7282.297276 2898.808926 \n", - "2023-10-04 6454.150580 3662.824987 5147.514628 7282.297276 2981.808926 \n", - "2023-10-05 6454.150580 3662.824987 5142.514628 7282.297276 2943.308926 \n", - "2023-10-06 6454.150580 3662.824987 5526.014628 7282.297276 3014.808926 \n", - "2023-10-09 6454.150580 3662.824987 5700.014628 7282.297276 3028.808926 \n", - "2023-10-10 6454.150580 3662.824987 5621.014628 7282.297276 3076.308926 \n", - "2023-10-11 6454.150580 3662.824987 5779.514628 7282.297276 3190.808926 \n", - "2023-10-12 6454.150580 3662.824987 5665.514628 7282.297276 3208.308926 \n", - "2023-10-13 6454.150580 3662.824987 5593.514628 7282.297276 3109.808926 \n", - "2023-10-16 6454.150580 3662.824987 5789.014628 7282.297276 3232.308926 \n", - "2023-10-17 6454.150580 3662.824987 5735.514628 7282.297276 3173.308926 \n", - "2023-10-18 6454.150580 3662.824987 5675.014628 7282.297276 3065.808926 \n", - "2023-10-19 6454.150580 3662.824987 5813.514628 7282.297276 3014.308926 \n", - "2023-10-20 6454.150580 3662.824987 5563.514628 7282.297276 2905.308926 \n", - "2023-10-23 6454.150580 3662.824987 5666.514628 7282.297276 2965.308926 \n", - "2023-10-24 6454.150580 3662.824987 5739.014628 7282.297276 3063.808926 \n", - "2023-10-25 6454.150580 3662.824987 6292.014628 7282.297276 2764.796881 \n", - "2023-10-25 6454.150580 3662.824987 6288.620037 7282.297276 2764.796881 \n", - "2023-10-25 6454.150580 3662.824987 6288.620037 7282.297276 2764.796881 \n", - "\n", - " cash commission total \n", - "datetime \n", - "2023-07-05 68631.829378 0.00000 100000.000000 \n", - "2023-07-05 68631.829378 0.01116 99991.265495 \n", - "2023-07-05 68631.829378 0.02232 99983.721819 \n", - "2023-07-05 68631.829378 0.02790 99980.029667 \n", - "2023-07-05 68631.829378 0.03348 99978.674733 \n", - "2023-07-05 68631.829378 0.04464 99970.393170 \n", - "2023-07-05 68631.829378 0.04464 99970.393170 \n", - "2023-07-06 68631.829378 0.04464 99298.393170 \n", - "2023-07-07 68631.829378 0.04464 98893.893170 \n", - "2023-07-10 68631.829378 0.04464 99247.893170 \n", - "2023-07-11 68631.829378 0.04464 99345.393170 \n", - "2023-07-12 68631.829378 0.04464 100143.393170 \n", - "2023-07-13 68631.829378 0.04464 101147.393170 \n", - "2023-07-14 68631.829378 0.04464 101007.893170 \n", - "2023-07-17 68631.829378 0.04464 102965.893170 \n", - "2023-07-18 68631.829378 0.04464 103434.893170 \n", - "2023-07-19 68631.829378 0.04464 103088.393170 \n", - "2023-07-20 68631.829378 0.04464 100162.393170 \n", - "2023-07-21 68631.829378 0.04464 99730.893170 \n", - "2023-07-24 68631.829378 0.04464 100751.893170 \n", - "2023-07-25 68631.829378 0.04464 101682.893170 \n", - "2023-07-26 68631.829378 0.04464 100133.893170 \n", - "2023-07-27 68631.829378 0.04464 99095.393170 \n", - "2023-07-28 68631.829378 0.04464 100773.893170 \n", - "2023-07-31 68631.829378 0.04464 100583.393170 \n", - "2023-08-01 68631.829378 0.04464 101028.893170 \n", - "2023-08-02 68631.829378 0.05580 98788.404033 \n", - "2023-08-02 68631.829378 0.05580 98788.404033 \n", - "2023-08-03 68631.829378 0.05580 98341.404033 \n", - "2023-08-04 68631.829378 0.06696 97817.644642 \n", - "2023-08-04 68631.829378 0.06696 97817.644642 \n", - "2023-08-07 68631.829378 0.06696 98527.644642 \n", - "2023-08-08 68631.829378 0.06696 97850.144642 \n", - "2023-08-09 68631.829378 0.07254 96275.896654 \n", - "2023-08-09 68631.829378 0.07812 96271.670373 \n", - "2023-08-09 68631.829378 0.07812 96271.670373 \n", - "2023-08-10 68631.829378 0.07812 95909.170373 \n", - "2023-08-11 68631.829378 0.07812 95254.170373 \n", - "2023-08-14 68631.829378 0.07812 96346.670373 \n", - "2023-08-15 68631.829378 0.07812 95824.170373 \n", - "2023-08-16 68631.829378 0.07812 95359.170373 \n", - "2023-08-17 68631.829378 0.07812 94826.670373 \n", - "2023-08-18 68631.829378 0.08928 94586.925774 \n", - "2023-08-18 68631.829378 0.08928 94586.925774 \n", - "2023-08-21 68631.829378 0.08928 94896.925774 \n", - "2023-08-22 68631.829378 0.08928 94921.925774 \n", - "2023-08-23 68631.829378 0.08928 95109.425774 \n", - "2023-08-24 68631.829378 0.08928 94764.425774 \n", - "2023-08-25 68631.829378 0.08928 94869.425774 \n", - "2023-08-28 68631.829378 0.08928 94765.925774 \n", - "2023-08-29 68631.829378 0.08928 95124.425774 \n", - "2023-08-30 68631.829378 0.08928 95161.925774 \n", - "2023-08-31 68631.829378 0.08928 95221.925774 \n", - "2023-09-01 68631.829378 0.08928 95204.425774 \n", - "2023-09-04 68631.829378 0.08928 95494.425774 \n", - "2023-09-05 68631.829378 0.08928 95494.425774 \n", - "2023-09-06 68631.829378 0.08928 95361.925774 \n", - "2023-09-07 68631.829378 0.08928 95334.425774 \n", - "2023-09-08 68631.829378 0.08928 95576.925774 \n", - "2023-09-11 68631.829378 0.08928 95981.925774 \n", - "2023-09-12 68631.829378 0.08928 95469.425774 \n", - "2023-09-13 68631.829378 0.08928 96011.925774 \n", - "2023-09-14 68631.829378 0.08928 96079.425774 \n", - "2023-09-15 68631.829378 0.08928 95381.925774 \n", - "2023-09-18 68631.829378 0.08928 95359.425774 \n", - "2023-09-19 68631.829378 0.08928 95122.425774 \n", - "2023-09-20 68631.829378 0.08928 94598.925774 \n", - "2023-09-21 68631.829378 0.08928 94322.925774 \n", - "2023-09-22 68631.829378 0.08928 94046.925774 \n", - "2023-09-25 68631.829378 0.08928 94263.925774 \n", - "2023-09-26 68631.829378 0.08928 93792.425774 \n", - "2023-09-27 68631.829378 0.08928 93828.425774 \n", - "2023-09-28 68631.829378 0.08928 93794.425774 \n", - "2023-09-29 68631.829378 0.08928 93899.425774 \n", - "2023-10-02 68631.829378 0.08928 94389.425774 \n", - "2023-10-03 68631.829378 0.08928 93800.425774 \n", - "2023-10-04 68631.829378 0.08928 94160.425774 \n", - "2023-10-05 68631.829378 0.08928 94116.925774 \n", - "2023-10-06 68631.829378 0.08928 94571.925774 \n", - "2023-10-09 68631.829378 0.08928 94759.925774 \n", - "2023-10-10 68631.829378 0.08928 94728.425774 \n", - "2023-10-11 68631.829378 0.08928 95001.425774 \n", - "2023-10-12 68631.829378 0.08928 94904.925774 \n", - "2023-10-13 68631.829378 0.08928 94734.425774 \n", - "2023-10-16 68631.829378 0.08928 95052.425774 \n", - "2023-10-17 68631.829378 0.08928 94939.925774 \n", - "2023-10-18 68631.829378 0.08928 94771.925774 \n", - "2023-10-19 68631.829378 0.08928 94858.925774 \n", - "2023-10-20 68631.829378 0.08928 94499.925774 \n", - "2023-10-23 68631.829378 0.08928 94662.925774 \n", - "2023-10-24 68631.829378 0.08928 94833.925774 \n", - "2023-10-25 68631.829378 0.09486 95087.913730 \n", - "2023-10-25 68631.829378 0.10044 95084.519139 \n", - "2023-10-25 68631.829378 0.10044 95084.519139 " - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.portfolio.get_weighted_holdings()" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
longshorttrade_idclosequantitymarket_value
datetimesymbol
2023-07-05TSLA[TSLA20240621C283.33][TSLA20240621C400]&L:TSLA20240621C283.33&S:TSLA20240621C40034.22526845.0
TSLA[TSLA20240621C283.33][TSLA20240621C400]&L:TSLA20240621C283.33&S:TSLA20240621C40034.22526845.0
AAPL[AAPL20240621C195][AAPL20240621C270]&L:AAPL20240621C195&S:AAPL20240621C27018.66523733.0
TSLA[TSLA20240621C283.33][TSLA20240621C400]&L:TSLA20240621C283.33&S:TSLA20240621C40034.22526845.0
AAPL[AAPL20240621C195][AAPL20240621C270]&L:AAPL20240621C195&S:AAPL20240621C27018.66523733.0
MSFT[MSFT20240621C345][MSFT20240621C450]&L:MSFT20240621C345&S:MSFT20240621C45031.32513132.5
TSLA[TSLA20240621C283.33][TSLA20240621C400]&L:TSLA20240621C283.33&S:TSLA20240621C40034.22526845.0
AAPL[AAPL20240621C195][AAPL20240621C270]&L:AAPL20240621C195&S:AAPL20240621C27018.66523733.0
MSFT[MSFT20240621C345][MSFT20240621C450]&L:MSFT20240621C345&S:MSFT20240621C45031.32513132.5
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18515.25011525.0
TSLA[TSLA20240621C283.33][TSLA20240621C400]&L:TSLA20240621C283.33&S:TSLA20240621C40034.22526845.0
AAPL[AAPL20240621C195][AAPL20240621C270]&L:AAPL20240621C195&S:AAPL20240621C27018.66523733.0
MSFT[MSFT20240621C345][MSFT20240621C450]&L:MSFT20240621C345&S:MSFT20240621C45031.32513132.5
AVGO[AVGO20240119C900][AVGO20240119C1000]&L:AVGO20240119C900&S:AVGO20240119C100032.80026560.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18515.25011525.0
TSLA[TSLA20240621C283.33][TSLA20240621C400]&L:TSLA20240621C283.33&S:TSLA20240621C40034.22526845.0
AAPL[AAPL20240621C195][AAPL20240621C270]&L:AAPL20240621C195&S:AAPL20240621C27018.66523733.0
MSFT[MSFT20240621C345][MSFT20240621C450]&L:MSFT20240621C345&S:MSFT20240621C45031.32513132.5
AVGO[AVGO20240119C900][AVGO20240119C1000]&L:AVGO20240119C900&S:AVGO20240119C100032.80026560.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18515.25011525.0
2023-07-06TSLA[TSLA20240621C283.33][TSLA20240621C400]&L:TSLA20240621C283.33&S:TSLA20240621C40032.87526575.0
AAPL[AAPL20240621C195][AAPL20240621C270]&L:AAPL20240621C195&S:AAPL20240621C27019.20523841.0
MSFT[MSFT20240621C345][MSFT20240621C450]&L:MSFT20240621C345&S:MSFT20240621C45032.30013230.0
AVGO[AVGO20240119C900][AVGO20240119C1000]&L:AVGO20240119C900&S:AVGO20240119C100030.20026040.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18514.37511437.5
2023-07-07TSLA[TSLA20240621C283.33][TSLA20240621C400]&L:TSLA20240621C283.33&S:TSLA20240621C40032.12526425.0
AAPL[AAPL20240621C195][AAPL20240621C270]&L:AAPL20240621C195&S:AAPL20240621C27018.54523709.0
MSFT[MSFT20240621C345][MSFT20240621C450]&L:MSFT20240621C345&S:MSFT20240621C45030.97513097.5
AVGO[AVGO20240119C900][AVGO20240119C1000]&L:AVGO20240119C900&S:AVGO20240119C100029.90025980.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18515.07511507.5
2023-07-10TSLA[TSLA20240621C283.33][TSLA20240621C400]&L:TSLA20240621C283.33&S:TSLA20240621C40030.67526135.0
AAPL[AAPL20240621C195][AAPL20240621C270]&L:AAPL20240621C195&S:AAPL20240621C27017.32023464.0
MSFT[MSFT20240621C345][MSFT20240621C450]&L:MSFT20240621C345&S:MSFT20240621C45028.40012840.0
AVGO[AVGO20240119C900][AVGO20240119C1000]&L:AVGO20240119C900&S:AVGO20240119C100036.25027250.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18513.84011384.0
2023-07-11TSLA[TSLA20240621C283.33][TSLA20240621C400]&L:TSLA20240621C283.33&S:TSLA20240621C40030.45026090.0
AAPL[AAPL20240621C195][AAPL20240621C270]&L:AAPL20240621C195&S:AAPL20240621C27017.09023418.0
MSFT[MSFT20240621C345][MSFT20240621C450]&L:MSFT20240621C345&S:MSFT20240621C45028.40012840.0
AVGO[AVGO20240119C900][AVGO20240119C1000]&L:AVGO20240119C900&S:AVGO20240119C100036.85027370.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18514.52511452.5
2023-07-12TSLA[TSLA20240621C283.33][TSLA20240621C400]&L:TSLA20240621C283.33&S:TSLA20240621C40031.27526255.0
AAPL[AAPL20240621C195][AAPL20240621C270]&L:AAPL20240621C195&S:AAPL20240621C27017.83023566.0
MSFT[MSFT20240621C345][MSFT20240621C450]&L:MSFT20240621C345&S:MSFT20240621C45030.32513032.5
AVGO[AVGO20240119C900][AVGO20240119C1000]&L:AVGO20240119C900&S:AVGO20240119C100037.90027580.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18515.35011535.0
2023-07-13TSLA[TSLA20240621C283.33][TSLA20240621C400]&L:TSLA20240621C283.33&S:TSLA20240621C40032.65026530.0
AAPL[AAPL20240621C195][AAPL20240621C270]&L:AAPL20240621C195&S:AAPL20240621C27018.07523615.0
MSFT[MSFT20240621C345][MSFT20240621C450]&L:MSFT20240621C345&S:MSFT20240621C45033.20013320.0
AVGO[AVGO20240119C900][AVGO20240119C1000]&L:AVGO20240119C900&S:AVGO20240119C100039.10027820.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18516.87511687.5
2023-07-14TSLA[TSLA20240621C283.33][TSLA20240621C400]&L:TSLA20240621C283.33&S:TSLA20240621C40033.75026750.0
AAPL[AAPL20240621C195][AAPL20240621C270]&L:AAPL20240621C195&S:AAPL20240621C27018.14023628.0
MSFT[MSFT20240621C345][MSFT20240621C450]&L:MSFT20240621C345&S:MSFT20240621C45033.02513302.5
AVGO[AVGO20240119C900][AVGO20240119C1000]&L:AVGO20240119C900&S:AVGO20240119C100037.25027450.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18517.02511702.5
2023-07-17TSLA[TSLA20240621C283.33][TSLA20240621C400]&L:TSLA20240621C283.33&S:TSLA20240621C40036.32527265.0
AAPL[AAPL20240621C195][AAPL20240621C270]&L:AAPL20240621C195&S:AAPL20240621C27019.78023956.0
MSFT[MSFT20240621C345][MSFT20240621C450]&L:MSFT20240621C345&S:MSFT20240621C45033.85013385.0
AVGO[AVGO20240119C900][AVGO20240119C1000]&L:AVGO20240119C900&S:AVGO20240119C100042.65028530.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18516.55011655.0
2023-07-18TSLA[TSLA20240621C283.33][TSLA20240621C400]&L:TSLA20240621C283.33&S:TSLA20240621C40037.30027460.0
AAPL[AAPL20240621C195][AAPL20240621C270]&L:AAPL20240621C195&S:AAPL20240621C27019.65023930.0
MSFT[MSFT20240621C345][MSFT20240621C450]&L:MSFT20240621C345&S:MSFT20240621C45039.62513962.5
AVGO[AVGO20240119C900][AVGO20240119C1000]&L:AVGO20240119C900&S:AVGO20240119C100041.50028300.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18516.07511607.5
2023-07-19TSLA[TSLA20240621C283.33][TSLA20240621C400]&L:TSLA20240621C283.33&S:TSLA20240621C40036.10027220.0
AAPL[AAPL20240621C195][AAPL20240621C270]&L:AAPL20240621C195&S:AAPL20240621C27020.50524101.0
MSFT[MSFT20240621C345][MSFT20240621C450]&L:MSFT20240621C345&S:MSFT20240621C45037.25013725.0
AVGO[AVGO20240119C900][AVGO20240119C1000]&L:AVGO20240119C900&S:AVGO20240119C100041.15028230.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18516.37511637.5
2023-07-20TSLA[TSLA20240621C283.33][TSLA20240621C400]&L:TSLA20240621C283.33&S:TSLA20240621C40028.05025610.0
AAPL[AAPL20240621C195][AAPL20240621C270]&L:AAPL20240621C195&S:AAPL20240621C27019.40023880.0
MSFT[MSFT20240621C345][MSFT20240621C450]&L:MSFT20240621C345&S:MSFT20240621C45034.47513447.5
AVGO[AVGO20240119C900][AVGO20240119C1000]&L:AVGO20240119C900&S:AVGO20240119C100037.85027570.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18514.80011480.0
2023-07-21TSLA[TSLA20240621C283.33][TSLA20240621C400]&L:TSLA20240621C283.33&S:TSLA20240621C40027.02525405.0
AAPL[AAPL20240621C195][AAPL20240621C270]&L:AAPL20240621C195&S:AAPL20240621C27018.58023716.0
MSFT[MSFT20240621C345][MSFT20240621C450]&L:MSFT20240621C345&S:MSFT20240621C45032.90013290.0
AVGO[AVGO20240119C900][AVGO20240119C1000]&L:AVGO20240119C900&S:AVGO20240119C100038.40027680.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18514.65011465.0
2023-07-24TSLA[TSLA20240621C283.33][TSLA20240621C400]&L:TSLA20240621C283.33&S:TSLA20240621C40029.77525955.0
AAPL[AAPL20240621C195][AAPL20240621C270]&L:AAPL20240621C195&S:AAPL20240621C27019.03523807.0
MSFT[MSFT20240621C345][MSFT20240621C450]&L:MSFT20240621C345&S:MSFT20240621C45033.52513352.5
AVGO[AVGO20240119C900][AVGO20240119C1000]&L:AVGO20240119C900&S:AVGO20240119C100040.25028050.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18514.12511412.5
2023-07-25TSLA[TSLA20240621C283.33][TSLA20240621C400]&L:TSLA20240621C283.33&S:TSLA20240621C40028.20025640.0
AAPL[AAPL20240621C195][AAPL20240621C270]&L:AAPL20240621C195&S:AAPL20240621C27019.49023898.0
MSFT[MSFT20240621C345][MSFT20240621C450]&L:MSFT20240621C345&S:MSFT20240621C45036.77513677.5
AVGO[AVGO20240119C900][AVGO20240119C1000]&L:AVGO20240119C900&S:AVGO20240119C100044.40028880.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18514.12511412.5
2023-07-26TSLA[TSLA20240621C283.33][TSLA20240621C400]&L:TSLA20240621C283.33&S:TSLA20240621C40028.80025760.0
AAPL[AAPL20240621C195][AAPL20240621C270]&L:AAPL20240621C195&S:AAPL20240621C27020.14524029.0
MSFT[MSFT20240621C345][MSFT20240621C450]&L:MSFT20240621C345&S:MSFT20240621C45029.57512957.5
AVGO[AVGO20240119C900][AVGO20240119C1000]&L:AVGO20240119C900&S:AVGO20240119C100039.15027830.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18513.82511382.5
2023-07-27TSLA[TSLA20240621C283.33][TSLA20240621C400]&L:TSLA20240621C283.33&S:TSLA20240621C40025.85025170.0
AAPL[AAPL20240621C195][AAPL20240621C270]&L:AAPL20240621C195&S:AAPL20240621C27019.76523953.0
MSFT[MSFT20240621C345][MSFT20240621C450]&L:MSFT20240621C345&S:MSFT20240621C45026.37512637.5
AVGO[AVGO20240119C900][AVGO20240119C1000]&L:AVGO20240119C900&S:AVGO20240119C100038.90027780.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18513.80011380.0
2023-07-28TSLA[TSLA20240621C283.33][TSLA20240621C400]&L:TSLA20240621C283.33&S:TSLA20240621C40029.02525805.0
AAPL[AAPL20240621C195][AAPL20240621C270]&L:AAPL20240621C195&S:AAPL20240621C27021.12024224.0
MSFT[MSFT20240621C345][MSFT20240621C450]&L:MSFT20240621C345&S:MSFT20240621C45029.52512952.5
AVGO[AVGO20240119C900][AVGO20240119C1000]&L:AVGO20240119C900&S:AVGO20240119C100040.35028070.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18515.47511547.5
2023-07-31TSLA[TSLA20240621C283.33][TSLA20240621C400]&L:TSLA20240621C283.33&S:TSLA20240621C40029.25025850.0
AAPL[AAPL20240621C195][AAPL20240621C270]&L:AAPL20240621C195&S:AAPL20240621C27021.40524281.0
MSFT[MSFT20240621C345][MSFT20240621C450]&L:MSFT20240621C345&S:MSFT20240621C45028.20012820.0
AVGO[AVGO20240119C900][AVGO20240119C1000]&L:AVGO20240119C900&S:AVGO20240119C100039.20027840.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18516.17511617.5
2023-08-01TSLA[TSLA20240621C283.33][TSLA20240621C400]&L:TSLA20240621C283.33&S:TSLA20240621C40027.45025490.0
AAPL[AAPL20240621C195][AAPL20240621C270]&L:AAPL20240621C195&S:AAPL20240621C27020.87024174.0
MSFT[MSFT20240621C345][MSFT20240621C450]&L:MSFT20240621C345&S:MSFT20240621C45028.45012845.0
AVGO[AVGO20240119C900][AVGO20240119C1000]&L:AVGO20240119C900&S:AVGO20240119C100044.10028820.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18515.25011525.0
2023-08-02AAPL[AAPL20240621C195][AAPL20240621C270]&L:AAPL20240621C195&S:AAPL20240621C27019.50523901.0
MSFT[MSFT20240621C345][MSFT20240621C450]&L:MSFT20240621C345&S:MSFT20240621C45025.45012545.0
AVGO[AVGO20240119C900][AVGO20240119C1000]&L:AVGO20240119C900&S:AVGO20240119C100038.40027680.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18513.92511392.5
AAPL[AAPL20240621C195][AAPL20240621C270]&L:AAPL20240621C195&S:AAPL20240621C27019.50523901.0
MSFT[MSFT20240621C345][MSFT20240621C450]&L:MSFT20240621C345&S:MSFT20240621C45025.45012545.0
AVGO[AVGO20240119C900][AVGO20240119C1000]&L:AVGO20240119C900&S:AVGO20240119C100038.40027680.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18513.92511392.5
2023-08-03AAPL[AAPL20240621C195][AAPL20240621C270]&L:AAPL20240621C195&S:AAPL20240621C27018.44523689.0
MSFT[MSFT20240621C345][MSFT20240621C450]&L:MSFT20240621C345&S:MSFT20240621C45025.02512502.5
AVGO[AVGO20240119C900][AVGO20240119C1000]&L:AVGO20240119C900&S:AVGO20240119C100037.35027470.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18514.10011410.0
2023-08-04MSFT[MSFT20240621C345][MSFT20240621C450]&L:MSFT20240621C345&S:MSFT20240621C45025.67512567.5
AVGO[AVGO20240119C900][AVGO20240119C1000]&L:AVGO20240119C900&S:AVGO20240119C100036.75027350.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18518.77511877.5
MSFT[MSFT20240621C345][MSFT20240621C450]&L:MSFT20240621C345&S:MSFT20240621C45025.67512567.5
AVGO[AVGO20240119C900][AVGO20240119C1000]&L:AVGO20240119C900&S:AVGO20240119C100036.75027350.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18518.77511877.5
2023-08-07MSFT[MSFT20240621C345][MSFT20240621C450]&L:MSFT20240621C345&S:MSFT20240621C45026.02512602.5
AVGO[AVGO20240119C900][AVGO20240119C1000]&L:AVGO20240119C900&S:AVGO20240119C100039.55027910.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18519.92511992.5
2023-08-08MSFT[MSFT20240621C345][MSFT20240621C450]&L:MSFT20240621C345&S:MSFT20240621C45024.42512442.5
AVGO[AVGO20240119C900][AVGO20240119C1000]&L:AVGO20240119C900&S:AVGO20240119C100037.45027490.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18518.95011895.0
2023-08-09AVGO[AVGO20240119C900][AVGO20240119C1000]&L:AVGO20240119C900&S:AVGO20240119C100030.75026150.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18518.00011800.0
MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46031.55013155.0
AVGO[AVGO20240119C900][AVGO20240119C1000]&L:AVGO20240119C900&S:AVGO20240119C100030.75026150.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18518.00011800.0
MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46031.55013155.0
AVGO[AVGO20240119C900][AVGO20240119C1000]&L:AVGO20240119C900&S:AVGO20240119C100030.75026150.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18518.00011800.0
2023-08-10MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46031.32513132.5
AVGO[AVGO20240119C900][AVGO20240119C1000]&L:AVGO20240119C900&S:AVGO20240119C100028.90025780.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18518.30011830.0
2023-08-11MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46030.12513012.5
AVGO[AVGO20240119C900][AVGO20240119C1000]&L:AVGO20240119C900&S:AVGO20240119C100026.25025250.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18518.25011825.0
2023-08-14MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46031.17513117.5
AVGO[AVGO20240119C900][AVGO20240119C1000]&L:AVGO20240119C900&S:AVGO20240119C100030.75026150.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18519.12511912.5
2023-08-15MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46030.62513062.5
AVGO[AVGO20240119C900][AVGO20240119C1000]&L:AVGO20240119C900&S:AVGO20240119C100029.10025820.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18517.75011775.0
2023-08-16MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46030.37513037.5
AVGO[AVGO20240119C900][AVGO20240119C1000]&L:AVGO20240119C900&S:AVGO20240119C100027.40025480.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18516.75011675.0
2023-08-17MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46028.82512882.5
AVGO[AVGO20240119C900][AVGO20240119C1000]&L:AVGO20240119C900&S:AVGO20240119C100025.80025160.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18516.17511617.5
2023-08-18MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46028.42512842.5
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18515.97511597.5
MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46028.42512842.5
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18515.97511597.5
2023-08-21MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46030.95013095.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18516.55011655.0
2023-08-22MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46031.32513132.5
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18516.42511642.5
2023-08-23MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46032.70013270.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18516.92511692.5
2023-08-24MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46030.90013090.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18515.27511527.5
2023-08-25MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46031.40013140.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18515.82511582.5
2023-08-28MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46031.51513151.5
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18514.67511467.5
2023-08-29MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46033.27513327.5
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18516.50011650.0
2023-08-30MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46033.60013360.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18516.55011655.0
2023-08-31MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46032.87513287.5
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18517.87511787.5
2023-09-01MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46032.72513272.5
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18517.85011785.0
2023-09-04MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46036.02513602.5
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18517.45011745.0
2023-09-05MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46036.02513602.5
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18517.45011745.0
2023-09-06MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46035.57513557.5
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18516.57511657.5
2023-09-07MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46034.12513412.5
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18517.75011775.0
2023-09-08MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46036.30013630.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18518.00011800.0
2023-09-11MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46038.07513807.5
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18520.27512027.5
2023-09-12MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46033.85013385.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18519.37511937.5
2023-09-13MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46037.37513737.5
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18521.27512127.5
2023-09-14MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46038.42513842.5
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18520.90012090.0
2023-09-15MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46033.22513322.5
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18519.12511912.5
2023-09-18MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46033.15013315.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18518.97511897.5
2023-09-19MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46032.30513230.5
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18517.45011745.0
2023-09-20MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46028.22012822.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18516.30011630.0
2023-09-21MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46028.17012817.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18513.59011359.0
2023-09-22MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46025.57012557.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18513.43011343.0
2023-09-25MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46026.76512676.5
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18514.40511440.5
2023-09-26MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46024.23012423.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18512.22511222.5
2023-09-27MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46024.67012467.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18512.14511214.5
2023-09-28MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46024.40512440.5
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18512.07011207.0
2023-09-29MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46025.02012502.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18512.50511250.5
2023-10-02MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46028.86512886.5
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18513.56011356.0
2023-10-03MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46024.74512474.5
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18511.79011179.0
2023-10-04MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46027.51512751.5
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18512.62011262.0
2023-10-05MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46027.46512746.5
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18512.23511223.5
2023-10-06MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46031.30013130.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18512.95011295.0
2023-10-09MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46033.04013304.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18513.09011309.0
2023-10-10MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46032.25013225.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18513.56511356.5
2023-10-11MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46033.83513383.5
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18514.71011471.0
2023-10-12MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46032.69513269.5
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18514.88511488.5
2023-10-13MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46031.97513197.5
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18513.90011390.0
2023-10-16MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46033.93013393.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18515.12511512.5
2023-10-17MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46033.39513339.5
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18514.53511453.5
2023-10-18MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46032.79013279.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18513.46011346.0
2023-10-19MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46034.17513417.5
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18512.94511294.5
2023-10-20MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46031.67513167.5
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18511.85511185.5
2023-10-23MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46032.70513270.5
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18512.45511245.5
2023-10-24MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46033.43013343.0
AMZN[AMZN20240621C132.5][AMZN20240621C185]&L:AMZN20240621C132.5&S:AMZN20240621C18513.44011344.0
2023-10-25MSFT[MSFT20240621C330][MSFT20240621C460]&L:MSFT20240621C330&S:MSFT20240621C46038.96013896.0
\n", - "
" - ], - "text/plain": [ - " long short \\\n", - "datetime symbol \n", - "2023-07-05 TSLA [TSLA20240621C283.33] [TSLA20240621C400] \n", - " TSLA [TSLA20240621C283.33] [TSLA20240621C400] \n", - " AAPL [AAPL20240621C195] [AAPL20240621C270] \n", - " TSLA [TSLA20240621C283.33] [TSLA20240621C400] \n", - " AAPL [AAPL20240621C195] [AAPL20240621C270] \n", - " MSFT [MSFT20240621C345] [MSFT20240621C450] \n", - " TSLA [TSLA20240621C283.33] [TSLA20240621C400] \n", - " AAPL [AAPL20240621C195] [AAPL20240621C270] \n", - " MSFT [MSFT20240621C345] [MSFT20240621C450] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - " TSLA [TSLA20240621C283.33] [TSLA20240621C400] \n", - " AAPL [AAPL20240621C195] [AAPL20240621C270] \n", - " MSFT [MSFT20240621C345] [MSFT20240621C450] \n", - " AVGO [AVGO20240119C900] [AVGO20240119C1000] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - " TSLA [TSLA20240621C283.33] [TSLA20240621C400] \n", - " AAPL [AAPL20240621C195] [AAPL20240621C270] \n", - " MSFT [MSFT20240621C345] [MSFT20240621C450] \n", - " AVGO [AVGO20240119C900] [AVGO20240119C1000] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-07-06 TSLA [TSLA20240621C283.33] [TSLA20240621C400] \n", - " AAPL [AAPL20240621C195] [AAPL20240621C270] \n", - " MSFT [MSFT20240621C345] [MSFT20240621C450] \n", - " AVGO [AVGO20240119C900] [AVGO20240119C1000] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-07-07 TSLA [TSLA20240621C283.33] [TSLA20240621C400] \n", - " AAPL [AAPL20240621C195] [AAPL20240621C270] \n", - " MSFT [MSFT20240621C345] [MSFT20240621C450] \n", - " AVGO [AVGO20240119C900] [AVGO20240119C1000] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-07-10 TSLA [TSLA20240621C283.33] [TSLA20240621C400] \n", - " AAPL [AAPL20240621C195] [AAPL20240621C270] \n", - " MSFT [MSFT20240621C345] [MSFT20240621C450] \n", - " AVGO [AVGO20240119C900] [AVGO20240119C1000] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-07-11 TSLA [TSLA20240621C283.33] [TSLA20240621C400] \n", - " AAPL [AAPL20240621C195] [AAPL20240621C270] \n", - " MSFT [MSFT20240621C345] [MSFT20240621C450] \n", - " AVGO [AVGO20240119C900] [AVGO20240119C1000] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-07-12 TSLA [TSLA20240621C283.33] [TSLA20240621C400] \n", - " AAPL [AAPL20240621C195] [AAPL20240621C270] \n", - " MSFT [MSFT20240621C345] [MSFT20240621C450] \n", - " AVGO [AVGO20240119C900] [AVGO20240119C1000] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-07-13 TSLA [TSLA20240621C283.33] [TSLA20240621C400] \n", - " AAPL [AAPL20240621C195] [AAPL20240621C270] \n", - " MSFT [MSFT20240621C345] [MSFT20240621C450] \n", - " AVGO [AVGO20240119C900] [AVGO20240119C1000] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-07-14 TSLA [TSLA20240621C283.33] [TSLA20240621C400] \n", - " AAPL [AAPL20240621C195] [AAPL20240621C270] \n", - " MSFT [MSFT20240621C345] [MSFT20240621C450] \n", - " AVGO [AVGO20240119C900] [AVGO20240119C1000] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-07-17 TSLA [TSLA20240621C283.33] [TSLA20240621C400] \n", - " AAPL [AAPL20240621C195] [AAPL20240621C270] \n", - " MSFT [MSFT20240621C345] [MSFT20240621C450] \n", - " AVGO [AVGO20240119C900] [AVGO20240119C1000] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-07-18 TSLA [TSLA20240621C283.33] [TSLA20240621C400] \n", - " AAPL [AAPL20240621C195] [AAPL20240621C270] \n", - " MSFT [MSFT20240621C345] [MSFT20240621C450] \n", - " AVGO [AVGO20240119C900] [AVGO20240119C1000] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-07-19 TSLA [TSLA20240621C283.33] [TSLA20240621C400] \n", - " AAPL [AAPL20240621C195] [AAPL20240621C270] \n", - " MSFT [MSFT20240621C345] [MSFT20240621C450] \n", - " AVGO [AVGO20240119C900] [AVGO20240119C1000] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-07-20 TSLA [TSLA20240621C283.33] [TSLA20240621C400] \n", - " AAPL [AAPL20240621C195] [AAPL20240621C270] \n", - " MSFT [MSFT20240621C345] [MSFT20240621C450] \n", - " AVGO [AVGO20240119C900] [AVGO20240119C1000] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-07-21 TSLA [TSLA20240621C283.33] [TSLA20240621C400] \n", - " AAPL [AAPL20240621C195] [AAPL20240621C270] \n", - " MSFT [MSFT20240621C345] [MSFT20240621C450] \n", - " AVGO [AVGO20240119C900] [AVGO20240119C1000] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-07-24 TSLA [TSLA20240621C283.33] [TSLA20240621C400] \n", - " AAPL [AAPL20240621C195] [AAPL20240621C270] \n", - " MSFT [MSFT20240621C345] [MSFT20240621C450] \n", - " AVGO [AVGO20240119C900] [AVGO20240119C1000] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-07-25 TSLA [TSLA20240621C283.33] [TSLA20240621C400] \n", - " AAPL [AAPL20240621C195] [AAPL20240621C270] \n", - " MSFT [MSFT20240621C345] [MSFT20240621C450] \n", - " AVGO [AVGO20240119C900] [AVGO20240119C1000] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-07-26 TSLA [TSLA20240621C283.33] [TSLA20240621C400] \n", - " AAPL [AAPL20240621C195] [AAPL20240621C270] \n", - " MSFT [MSFT20240621C345] [MSFT20240621C450] \n", - " AVGO [AVGO20240119C900] [AVGO20240119C1000] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-07-27 TSLA [TSLA20240621C283.33] [TSLA20240621C400] \n", - " AAPL [AAPL20240621C195] [AAPL20240621C270] \n", - " MSFT [MSFT20240621C345] [MSFT20240621C450] \n", - " AVGO [AVGO20240119C900] [AVGO20240119C1000] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-07-28 TSLA [TSLA20240621C283.33] [TSLA20240621C400] \n", - " AAPL [AAPL20240621C195] [AAPL20240621C270] \n", - " MSFT [MSFT20240621C345] [MSFT20240621C450] \n", - " AVGO [AVGO20240119C900] [AVGO20240119C1000] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-07-31 TSLA [TSLA20240621C283.33] [TSLA20240621C400] \n", - " AAPL [AAPL20240621C195] [AAPL20240621C270] \n", - " MSFT [MSFT20240621C345] [MSFT20240621C450] \n", - " AVGO [AVGO20240119C900] [AVGO20240119C1000] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-08-01 TSLA [TSLA20240621C283.33] [TSLA20240621C400] \n", - " AAPL [AAPL20240621C195] [AAPL20240621C270] \n", - " MSFT [MSFT20240621C345] [MSFT20240621C450] \n", - " AVGO [AVGO20240119C900] [AVGO20240119C1000] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-08-02 AAPL [AAPL20240621C195] [AAPL20240621C270] \n", - " MSFT [MSFT20240621C345] [MSFT20240621C450] \n", - " AVGO [AVGO20240119C900] [AVGO20240119C1000] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - " AAPL [AAPL20240621C195] [AAPL20240621C270] \n", - " MSFT [MSFT20240621C345] [MSFT20240621C450] \n", - " AVGO [AVGO20240119C900] [AVGO20240119C1000] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-08-03 AAPL [AAPL20240621C195] [AAPL20240621C270] \n", - " MSFT [MSFT20240621C345] [MSFT20240621C450] \n", - " AVGO [AVGO20240119C900] [AVGO20240119C1000] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-08-04 MSFT [MSFT20240621C345] [MSFT20240621C450] \n", - " AVGO [AVGO20240119C900] [AVGO20240119C1000] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - " MSFT [MSFT20240621C345] [MSFT20240621C450] \n", - " AVGO [AVGO20240119C900] [AVGO20240119C1000] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-08-07 MSFT [MSFT20240621C345] [MSFT20240621C450] \n", - " AVGO [AVGO20240119C900] [AVGO20240119C1000] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-08-08 MSFT [MSFT20240621C345] [MSFT20240621C450] \n", - " AVGO [AVGO20240119C900] [AVGO20240119C1000] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-08-09 AVGO [AVGO20240119C900] [AVGO20240119C1000] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - " MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AVGO [AVGO20240119C900] [AVGO20240119C1000] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - " MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AVGO [AVGO20240119C900] [AVGO20240119C1000] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-08-10 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AVGO [AVGO20240119C900] [AVGO20240119C1000] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-08-11 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AVGO [AVGO20240119C900] [AVGO20240119C1000] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-08-14 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AVGO [AVGO20240119C900] [AVGO20240119C1000] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-08-15 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AVGO [AVGO20240119C900] [AVGO20240119C1000] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-08-16 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AVGO [AVGO20240119C900] [AVGO20240119C1000] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-08-17 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AVGO [AVGO20240119C900] [AVGO20240119C1000] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-08-18 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - " MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-08-21 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-08-22 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-08-23 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-08-24 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-08-25 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-08-28 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-08-29 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-08-30 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-08-31 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-09-01 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-09-04 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-09-05 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-09-06 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-09-07 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-09-08 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-09-11 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-09-12 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-09-13 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-09-14 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-09-15 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-09-18 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-09-19 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-09-20 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-09-21 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-09-22 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-09-25 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-09-26 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-09-27 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-09-28 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-09-29 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-10-02 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-10-03 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-10-04 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-10-05 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-10-06 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-10-09 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-10-10 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-10-11 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-10-12 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-10-13 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-10-16 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-10-17 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-10-18 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-10-19 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-10-20 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-10-23 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-10-24 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - " AMZN [AMZN20240621C132.5] [AMZN20240621C185] \n", - "2023-10-25 MSFT [MSFT20240621C330] [MSFT20240621C460] \n", - "\n", - " trade_id close \\\n", - "datetime symbol \n", - "2023-07-05 TSLA &L:TSLA20240621C283.33&S:TSLA20240621C400 34.225 \n", - " TSLA &L:TSLA20240621C283.33&S:TSLA20240621C400 34.225 \n", - " AAPL &L:AAPL20240621C195&S:AAPL20240621C270 18.665 \n", - " TSLA &L:TSLA20240621C283.33&S:TSLA20240621C400 34.225 \n", - " AAPL &L:AAPL20240621C195&S:AAPL20240621C270 18.665 \n", - " MSFT &L:MSFT20240621C345&S:MSFT20240621C450 31.325 \n", - " TSLA &L:TSLA20240621C283.33&S:TSLA20240621C400 34.225 \n", - " AAPL &L:AAPL20240621C195&S:AAPL20240621C270 18.665 \n", - " MSFT &L:MSFT20240621C345&S:MSFT20240621C450 31.325 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 15.250 \n", - " TSLA &L:TSLA20240621C283.33&S:TSLA20240621C400 34.225 \n", - " AAPL &L:AAPL20240621C195&S:AAPL20240621C270 18.665 \n", - " MSFT &L:MSFT20240621C345&S:MSFT20240621C450 31.325 \n", - " AVGO &L:AVGO20240119C900&S:AVGO20240119C1000 32.800 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 15.250 \n", - " TSLA &L:TSLA20240621C283.33&S:TSLA20240621C400 34.225 \n", - " AAPL &L:AAPL20240621C195&S:AAPL20240621C270 18.665 \n", - " MSFT &L:MSFT20240621C345&S:MSFT20240621C450 31.325 \n", - " AVGO &L:AVGO20240119C900&S:AVGO20240119C1000 32.800 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 15.250 \n", - "2023-07-06 TSLA &L:TSLA20240621C283.33&S:TSLA20240621C400 32.875 \n", - " AAPL &L:AAPL20240621C195&S:AAPL20240621C270 19.205 \n", - " MSFT &L:MSFT20240621C345&S:MSFT20240621C450 32.300 \n", - " AVGO &L:AVGO20240119C900&S:AVGO20240119C1000 30.200 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 14.375 \n", - "2023-07-07 TSLA &L:TSLA20240621C283.33&S:TSLA20240621C400 32.125 \n", - " AAPL &L:AAPL20240621C195&S:AAPL20240621C270 18.545 \n", - " MSFT &L:MSFT20240621C345&S:MSFT20240621C450 30.975 \n", - " AVGO &L:AVGO20240119C900&S:AVGO20240119C1000 29.900 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 15.075 \n", - "2023-07-10 TSLA &L:TSLA20240621C283.33&S:TSLA20240621C400 30.675 \n", - " AAPL &L:AAPL20240621C195&S:AAPL20240621C270 17.320 \n", - " MSFT &L:MSFT20240621C345&S:MSFT20240621C450 28.400 \n", - " AVGO &L:AVGO20240119C900&S:AVGO20240119C1000 36.250 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 13.840 \n", - "2023-07-11 TSLA &L:TSLA20240621C283.33&S:TSLA20240621C400 30.450 \n", - " AAPL &L:AAPL20240621C195&S:AAPL20240621C270 17.090 \n", - " MSFT &L:MSFT20240621C345&S:MSFT20240621C450 28.400 \n", - " AVGO &L:AVGO20240119C900&S:AVGO20240119C1000 36.850 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 14.525 \n", - "2023-07-12 TSLA &L:TSLA20240621C283.33&S:TSLA20240621C400 31.275 \n", - " AAPL &L:AAPL20240621C195&S:AAPL20240621C270 17.830 \n", - " MSFT &L:MSFT20240621C345&S:MSFT20240621C450 30.325 \n", - " AVGO &L:AVGO20240119C900&S:AVGO20240119C1000 37.900 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 15.350 \n", - "2023-07-13 TSLA &L:TSLA20240621C283.33&S:TSLA20240621C400 32.650 \n", - " AAPL &L:AAPL20240621C195&S:AAPL20240621C270 18.075 \n", - " MSFT &L:MSFT20240621C345&S:MSFT20240621C450 33.200 \n", - " AVGO &L:AVGO20240119C900&S:AVGO20240119C1000 39.100 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 16.875 \n", - "2023-07-14 TSLA &L:TSLA20240621C283.33&S:TSLA20240621C400 33.750 \n", - " AAPL &L:AAPL20240621C195&S:AAPL20240621C270 18.140 \n", - " MSFT &L:MSFT20240621C345&S:MSFT20240621C450 33.025 \n", - " AVGO &L:AVGO20240119C900&S:AVGO20240119C1000 37.250 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 17.025 \n", - "2023-07-17 TSLA &L:TSLA20240621C283.33&S:TSLA20240621C400 36.325 \n", - " AAPL &L:AAPL20240621C195&S:AAPL20240621C270 19.780 \n", - " MSFT &L:MSFT20240621C345&S:MSFT20240621C450 33.850 \n", - " AVGO &L:AVGO20240119C900&S:AVGO20240119C1000 42.650 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 16.550 \n", - "2023-07-18 TSLA &L:TSLA20240621C283.33&S:TSLA20240621C400 37.300 \n", - " AAPL &L:AAPL20240621C195&S:AAPL20240621C270 19.650 \n", - " MSFT &L:MSFT20240621C345&S:MSFT20240621C450 39.625 \n", - " AVGO &L:AVGO20240119C900&S:AVGO20240119C1000 41.500 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 16.075 \n", - "2023-07-19 TSLA &L:TSLA20240621C283.33&S:TSLA20240621C400 36.100 \n", - " AAPL &L:AAPL20240621C195&S:AAPL20240621C270 20.505 \n", - " MSFT &L:MSFT20240621C345&S:MSFT20240621C450 37.250 \n", - " AVGO &L:AVGO20240119C900&S:AVGO20240119C1000 41.150 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 16.375 \n", - "2023-07-20 TSLA &L:TSLA20240621C283.33&S:TSLA20240621C400 28.050 \n", - " AAPL &L:AAPL20240621C195&S:AAPL20240621C270 19.400 \n", - " MSFT &L:MSFT20240621C345&S:MSFT20240621C450 34.475 \n", - " AVGO &L:AVGO20240119C900&S:AVGO20240119C1000 37.850 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 14.800 \n", - "2023-07-21 TSLA &L:TSLA20240621C283.33&S:TSLA20240621C400 27.025 \n", - " AAPL &L:AAPL20240621C195&S:AAPL20240621C270 18.580 \n", - " MSFT &L:MSFT20240621C345&S:MSFT20240621C450 32.900 \n", - " AVGO &L:AVGO20240119C900&S:AVGO20240119C1000 38.400 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 14.650 \n", - "2023-07-24 TSLA &L:TSLA20240621C283.33&S:TSLA20240621C400 29.775 \n", - " AAPL &L:AAPL20240621C195&S:AAPL20240621C270 19.035 \n", - " MSFT &L:MSFT20240621C345&S:MSFT20240621C450 33.525 \n", - " AVGO &L:AVGO20240119C900&S:AVGO20240119C1000 40.250 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 14.125 \n", - "2023-07-25 TSLA &L:TSLA20240621C283.33&S:TSLA20240621C400 28.200 \n", - " AAPL &L:AAPL20240621C195&S:AAPL20240621C270 19.490 \n", - " MSFT &L:MSFT20240621C345&S:MSFT20240621C450 36.775 \n", - " AVGO &L:AVGO20240119C900&S:AVGO20240119C1000 44.400 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 14.125 \n", - "2023-07-26 TSLA &L:TSLA20240621C283.33&S:TSLA20240621C400 28.800 \n", - " AAPL &L:AAPL20240621C195&S:AAPL20240621C270 20.145 \n", - " MSFT &L:MSFT20240621C345&S:MSFT20240621C450 29.575 \n", - " AVGO &L:AVGO20240119C900&S:AVGO20240119C1000 39.150 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 13.825 \n", - "2023-07-27 TSLA &L:TSLA20240621C283.33&S:TSLA20240621C400 25.850 \n", - " AAPL &L:AAPL20240621C195&S:AAPL20240621C270 19.765 \n", - " MSFT &L:MSFT20240621C345&S:MSFT20240621C450 26.375 \n", - " AVGO &L:AVGO20240119C900&S:AVGO20240119C1000 38.900 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 13.800 \n", - "2023-07-28 TSLA &L:TSLA20240621C283.33&S:TSLA20240621C400 29.025 \n", - " AAPL &L:AAPL20240621C195&S:AAPL20240621C270 21.120 \n", - " MSFT &L:MSFT20240621C345&S:MSFT20240621C450 29.525 \n", - " AVGO &L:AVGO20240119C900&S:AVGO20240119C1000 40.350 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 15.475 \n", - "2023-07-31 TSLA &L:TSLA20240621C283.33&S:TSLA20240621C400 29.250 \n", - " AAPL &L:AAPL20240621C195&S:AAPL20240621C270 21.405 \n", - " MSFT &L:MSFT20240621C345&S:MSFT20240621C450 28.200 \n", - " AVGO &L:AVGO20240119C900&S:AVGO20240119C1000 39.200 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 16.175 \n", - "2023-08-01 TSLA &L:TSLA20240621C283.33&S:TSLA20240621C400 27.450 \n", - " AAPL &L:AAPL20240621C195&S:AAPL20240621C270 20.870 \n", - " MSFT &L:MSFT20240621C345&S:MSFT20240621C450 28.450 \n", - " AVGO &L:AVGO20240119C900&S:AVGO20240119C1000 44.100 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 15.250 \n", - "2023-08-02 AAPL &L:AAPL20240621C195&S:AAPL20240621C270 19.505 \n", - " MSFT &L:MSFT20240621C345&S:MSFT20240621C450 25.450 \n", - " AVGO &L:AVGO20240119C900&S:AVGO20240119C1000 38.400 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 13.925 \n", - " AAPL &L:AAPL20240621C195&S:AAPL20240621C270 19.505 \n", - " MSFT &L:MSFT20240621C345&S:MSFT20240621C450 25.450 \n", - " AVGO &L:AVGO20240119C900&S:AVGO20240119C1000 38.400 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 13.925 \n", - "2023-08-03 AAPL &L:AAPL20240621C195&S:AAPL20240621C270 18.445 \n", - " MSFT &L:MSFT20240621C345&S:MSFT20240621C450 25.025 \n", - " AVGO &L:AVGO20240119C900&S:AVGO20240119C1000 37.350 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 14.100 \n", - "2023-08-04 MSFT &L:MSFT20240621C345&S:MSFT20240621C450 25.675 \n", - " AVGO &L:AVGO20240119C900&S:AVGO20240119C1000 36.750 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 18.775 \n", - " MSFT &L:MSFT20240621C345&S:MSFT20240621C450 25.675 \n", - " AVGO &L:AVGO20240119C900&S:AVGO20240119C1000 36.750 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 18.775 \n", - "2023-08-07 MSFT &L:MSFT20240621C345&S:MSFT20240621C450 26.025 \n", - " AVGO &L:AVGO20240119C900&S:AVGO20240119C1000 39.550 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 19.925 \n", - "2023-08-08 MSFT &L:MSFT20240621C345&S:MSFT20240621C450 24.425 \n", - " AVGO &L:AVGO20240119C900&S:AVGO20240119C1000 37.450 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 18.950 \n", - "2023-08-09 AVGO &L:AVGO20240119C900&S:AVGO20240119C1000 30.750 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 18.000 \n", - " MSFT &L:MSFT20240621C330&S:MSFT20240621C460 31.550 \n", - " AVGO &L:AVGO20240119C900&S:AVGO20240119C1000 30.750 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 18.000 \n", - " MSFT &L:MSFT20240621C330&S:MSFT20240621C460 31.550 \n", - " AVGO &L:AVGO20240119C900&S:AVGO20240119C1000 30.750 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 18.000 \n", - "2023-08-10 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 31.325 \n", - " AVGO &L:AVGO20240119C900&S:AVGO20240119C1000 28.900 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 18.300 \n", - "2023-08-11 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 30.125 \n", - " AVGO &L:AVGO20240119C900&S:AVGO20240119C1000 26.250 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 18.250 \n", - "2023-08-14 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 31.175 \n", - " AVGO &L:AVGO20240119C900&S:AVGO20240119C1000 30.750 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 19.125 \n", - "2023-08-15 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 30.625 \n", - " AVGO &L:AVGO20240119C900&S:AVGO20240119C1000 29.100 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 17.750 \n", - "2023-08-16 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 30.375 \n", - " AVGO &L:AVGO20240119C900&S:AVGO20240119C1000 27.400 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 16.750 \n", - "2023-08-17 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 28.825 \n", - " AVGO &L:AVGO20240119C900&S:AVGO20240119C1000 25.800 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 16.175 \n", - "2023-08-18 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 28.425 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 15.975 \n", - " MSFT &L:MSFT20240621C330&S:MSFT20240621C460 28.425 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 15.975 \n", - "2023-08-21 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 30.950 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 16.550 \n", - "2023-08-22 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 31.325 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 16.425 \n", - "2023-08-23 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 32.700 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 16.925 \n", - "2023-08-24 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 30.900 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 15.275 \n", - "2023-08-25 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 31.400 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 15.825 \n", - "2023-08-28 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 31.515 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 14.675 \n", - "2023-08-29 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 33.275 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 16.500 \n", - "2023-08-30 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 33.600 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 16.550 \n", - "2023-08-31 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 32.875 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 17.875 \n", - "2023-09-01 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 32.725 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 17.850 \n", - "2023-09-04 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 36.025 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 17.450 \n", - "2023-09-05 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 36.025 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 17.450 \n", - "2023-09-06 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 35.575 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 16.575 \n", - "2023-09-07 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 34.125 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 17.750 \n", - "2023-09-08 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 36.300 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 18.000 \n", - "2023-09-11 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 38.075 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 20.275 \n", - "2023-09-12 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 33.850 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 19.375 \n", - "2023-09-13 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 37.375 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 21.275 \n", - "2023-09-14 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 38.425 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 20.900 \n", - "2023-09-15 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 33.225 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 19.125 \n", - "2023-09-18 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 33.150 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 18.975 \n", - "2023-09-19 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 32.305 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 17.450 \n", - "2023-09-20 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 28.220 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 16.300 \n", - "2023-09-21 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 28.170 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 13.590 \n", - "2023-09-22 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 25.570 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 13.430 \n", - "2023-09-25 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 26.765 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 14.405 \n", - "2023-09-26 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 24.230 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 12.225 \n", - "2023-09-27 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 24.670 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 12.145 \n", - "2023-09-28 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 24.405 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 12.070 \n", - "2023-09-29 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 25.020 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 12.505 \n", - "2023-10-02 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 28.865 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 13.560 \n", - "2023-10-03 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 24.745 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 11.790 \n", - "2023-10-04 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 27.515 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 12.620 \n", - "2023-10-05 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 27.465 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 12.235 \n", - "2023-10-06 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 31.300 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 12.950 \n", - "2023-10-09 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 33.040 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 13.090 \n", - "2023-10-10 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 32.250 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 13.565 \n", - "2023-10-11 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 33.835 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 14.710 \n", - "2023-10-12 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 32.695 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 14.885 \n", - "2023-10-13 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 31.975 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 13.900 \n", - "2023-10-16 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 33.930 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 15.125 \n", - "2023-10-17 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 33.395 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 14.535 \n", - "2023-10-18 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 32.790 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 13.460 \n", - "2023-10-19 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 34.175 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 12.945 \n", - "2023-10-20 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 31.675 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 11.855 \n", - "2023-10-23 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 32.705 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 12.455 \n", - "2023-10-24 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 33.430 \n", - " AMZN &L:AMZN20240621C132.5&S:AMZN20240621C185 13.440 \n", - "2023-10-25 MSFT &L:MSFT20240621C330&S:MSFT20240621C460 38.960 \n", - "\n", - " quantity market_value \n", - "datetime symbol \n", - "2023-07-05 TSLA 2 6845.0 \n", - " TSLA 2 6845.0 \n", - " AAPL 2 3733.0 \n", - " TSLA 2 6845.0 \n", - " AAPL 2 3733.0 \n", - " MSFT 1 3132.5 \n", - " TSLA 2 6845.0 \n", - " AAPL 2 3733.0 \n", - " MSFT 1 3132.5 \n", - " AMZN 1 1525.0 \n", - " TSLA 2 6845.0 \n", - " AAPL 2 3733.0 \n", - " MSFT 1 3132.5 \n", - " AVGO 2 6560.0 \n", - " AMZN 1 1525.0 \n", - " TSLA 2 6845.0 \n", - " AAPL 2 3733.0 \n", - " MSFT 1 3132.5 \n", - " AVGO 2 6560.0 \n", - " AMZN 1 1525.0 \n", - "2023-07-06 TSLA 2 6575.0 \n", - " AAPL 2 3841.0 \n", - " MSFT 1 3230.0 \n", - " AVGO 2 6040.0 \n", - " AMZN 1 1437.5 \n", - "2023-07-07 TSLA 2 6425.0 \n", - " AAPL 2 3709.0 \n", - " MSFT 1 3097.5 \n", - " AVGO 2 5980.0 \n", - " AMZN 1 1507.5 \n", - "2023-07-10 TSLA 2 6135.0 \n", - " AAPL 2 3464.0 \n", - " MSFT 1 2840.0 \n", - " AVGO 2 7250.0 \n", - " AMZN 1 1384.0 \n", - "2023-07-11 TSLA 2 6090.0 \n", - " AAPL 2 3418.0 \n", - " MSFT 1 2840.0 \n", - " AVGO 2 7370.0 \n", - " AMZN 1 1452.5 \n", - "2023-07-12 TSLA 2 6255.0 \n", - " AAPL 2 3566.0 \n", - " MSFT 1 3032.5 \n", - " AVGO 2 7580.0 \n", - " AMZN 1 1535.0 \n", - "2023-07-13 TSLA 2 6530.0 \n", - " AAPL 2 3615.0 \n", - " MSFT 1 3320.0 \n", - " AVGO 2 7820.0 \n", - " AMZN 1 1687.5 \n", - "2023-07-14 TSLA 2 6750.0 \n", - " AAPL 2 3628.0 \n", - " MSFT 1 3302.5 \n", - " AVGO 2 7450.0 \n", - " AMZN 1 1702.5 \n", - "2023-07-17 TSLA 2 7265.0 \n", - " AAPL 2 3956.0 \n", - " MSFT 1 3385.0 \n", - " AVGO 2 8530.0 \n", - " AMZN 1 1655.0 \n", - "2023-07-18 TSLA 2 7460.0 \n", - " AAPL 2 3930.0 \n", - " MSFT 1 3962.5 \n", - " AVGO 2 8300.0 \n", - " AMZN 1 1607.5 \n", - "2023-07-19 TSLA 2 7220.0 \n", - " AAPL 2 4101.0 \n", - " MSFT 1 3725.0 \n", - " AVGO 2 8230.0 \n", - " AMZN 1 1637.5 \n", - "2023-07-20 TSLA 2 5610.0 \n", - " AAPL 2 3880.0 \n", - " MSFT 1 3447.5 \n", - " AVGO 2 7570.0 \n", - " AMZN 1 1480.0 \n", - "2023-07-21 TSLA 2 5405.0 \n", - " AAPL 2 3716.0 \n", - " MSFT 1 3290.0 \n", - " AVGO 2 7680.0 \n", - " AMZN 1 1465.0 \n", - "2023-07-24 TSLA 2 5955.0 \n", - " AAPL 2 3807.0 \n", - " MSFT 1 3352.5 \n", - " AVGO 2 8050.0 \n", - " AMZN 1 1412.5 \n", - "2023-07-25 TSLA 2 5640.0 \n", - " AAPL 2 3898.0 \n", - " MSFT 1 3677.5 \n", - " AVGO 2 8880.0 \n", - " AMZN 1 1412.5 \n", - "2023-07-26 TSLA 2 5760.0 \n", - " AAPL 2 4029.0 \n", - " MSFT 1 2957.5 \n", - " AVGO 2 7830.0 \n", - " AMZN 1 1382.5 \n", - "2023-07-27 TSLA 2 5170.0 \n", - " AAPL 2 3953.0 \n", - " MSFT 1 2637.5 \n", - " AVGO 2 7780.0 \n", - " AMZN 1 1380.0 \n", - "2023-07-28 TSLA 2 5805.0 \n", - " AAPL 2 4224.0 \n", - " MSFT 1 2952.5 \n", - " AVGO 2 8070.0 \n", - " AMZN 1 1547.5 \n", - "2023-07-31 TSLA 2 5850.0 \n", - " AAPL 2 4281.0 \n", - " MSFT 1 2820.0 \n", - " AVGO 2 7840.0 \n", - " AMZN 1 1617.5 \n", - "2023-08-01 TSLA 2 5490.0 \n", - " AAPL 2 4174.0 \n", - " MSFT 1 2845.0 \n", - " AVGO 2 8820.0 \n", - " AMZN 1 1525.0 \n", - "2023-08-02 AAPL 2 3901.0 \n", - " MSFT 1 2545.0 \n", - " AVGO 2 7680.0 \n", - " AMZN 1 1392.5 \n", - " AAPL 2 3901.0 \n", - " MSFT 1 2545.0 \n", - " AVGO 2 7680.0 \n", - " AMZN 1 1392.5 \n", - "2023-08-03 AAPL 2 3689.0 \n", - " MSFT 1 2502.5 \n", - " AVGO 2 7470.0 \n", - " AMZN 1 1410.0 \n", - "2023-08-04 MSFT 1 2567.5 \n", - " AVGO 2 7350.0 \n", - " AMZN 1 1877.5 \n", - " MSFT 1 2567.5 \n", - " AVGO 2 7350.0 \n", - " AMZN 1 1877.5 \n", - "2023-08-07 MSFT 1 2602.5 \n", - " AVGO 2 7910.0 \n", - " AMZN 1 1992.5 \n", - "2023-08-08 MSFT 1 2442.5 \n", - " AVGO 2 7490.0 \n", - " AMZN 1 1895.0 \n", - "2023-08-09 AVGO 2 6150.0 \n", - " AMZN 1 1800.0 \n", - " MSFT 1 3155.0 \n", - " AVGO 2 6150.0 \n", - " AMZN 1 1800.0 \n", - " MSFT 1 3155.0 \n", - " AVGO 2 6150.0 \n", - " AMZN 1 1800.0 \n", - "2023-08-10 MSFT 1 3132.5 \n", - " AVGO 2 5780.0 \n", - " AMZN 1 1830.0 \n", - "2023-08-11 MSFT 1 3012.5 \n", - " AVGO 2 5250.0 \n", - " AMZN 1 1825.0 \n", - "2023-08-14 MSFT 1 3117.5 \n", - " AVGO 2 6150.0 \n", - " AMZN 1 1912.5 \n", - "2023-08-15 MSFT 1 3062.5 \n", - " AVGO 2 5820.0 \n", - " AMZN 1 1775.0 \n", - "2023-08-16 MSFT 1 3037.5 \n", - " AVGO 2 5480.0 \n", - " AMZN 1 1675.0 \n", - "2023-08-17 MSFT 1 2882.5 \n", - " AVGO 2 5160.0 \n", - " AMZN 1 1617.5 \n", - "2023-08-18 MSFT 1 2842.5 \n", - " AMZN 1 1597.5 \n", - " MSFT 1 2842.5 \n", - " AMZN 1 1597.5 \n", - "2023-08-21 MSFT 1 3095.0 \n", - " AMZN 1 1655.0 \n", - "2023-08-22 MSFT 1 3132.5 \n", - " AMZN 1 1642.5 \n", - "2023-08-23 MSFT 1 3270.0 \n", - " AMZN 1 1692.5 \n", - "2023-08-24 MSFT 1 3090.0 \n", - " AMZN 1 1527.5 \n", - "2023-08-25 MSFT 1 3140.0 \n", - " AMZN 1 1582.5 \n", - "2023-08-28 MSFT 1 3151.5 \n", - " AMZN 1 1467.5 \n", - "2023-08-29 MSFT 1 3327.5 \n", - " AMZN 1 1650.0 \n", - "2023-08-30 MSFT 1 3360.0 \n", - " AMZN 1 1655.0 \n", - "2023-08-31 MSFT 1 3287.5 \n", - " AMZN 1 1787.5 \n", - "2023-09-01 MSFT 1 3272.5 \n", - " AMZN 1 1785.0 \n", - "2023-09-04 MSFT 1 3602.5 \n", - " AMZN 1 1745.0 \n", - "2023-09-05 MSFT 1 3602.5 \n", - " AMZN 1 1745.0 \n", - "2023-09-06 MSFT 1 3557.5 \n", - " AMZN 1 1657.5 \n", - "2023-09-07 MSFT 1 3412.5 \n", - " AMZN 1 1775.0 \n", - "2023-09-08 MSFT 1 3630.0 \n", - " AMZN 1 1800.0 \n", - "2023-09-11 MSFT 1 3807.5 \n", - " AMZN 1 2027.5 \n", - "2023-09-12 MSFT 1 3385.0 \n", - " AMZN 1 1937.5 \n", - "2023-09-13 MSFT 1 3737.5 \n", - " AMZN 1 2127.5 \n", - "2023-09-14 MSFT 1 3842.5 \n", - " AMZN 1 2090.0 \n", - "2023-09-15 MSFT 1 3322.5 \n", - " AMZN 1 1912.5 \n", - "2023-09-18 MSFT 1 3315.0 \n", - " AMZN 1 1897.5 \n", - "2023-09-19 MSFT 1 3230.5 \n", - " AMZN 1 1745.0 \n", - "2023-09-20 MSFT 1 2822.0 \n", - " AMZN 1 1630.0 \n", - "2023-09-21 MSFT 1 2817.0 \n", - " AMZN 1 1359.0 \n", - "2023-09-22 MSFT 1 2557.0 \n", - " AMZN 1 1343.0 \n", - "2023-09-25 MSFT 1 2676.5 \n", - " AMZN 1 1440.5 \n", - "2023-09-26 MSFT 1 2423.0 \n", - " AMZN 1 1222.5 \n", - "2023-09-27 MSFT 1 2467.0 \n", - " AMZN 1 1214.5 \n", - "2023-09-28 MSFT 1 2440.5 \n", - " AMZN 1 1207.0 \n", - "2023-09-29 MSFT 1 2502.0 \n", - " AMZN 1 1250.5 \n", - "2023-10-02 MSFT 1 2886.5 \n", - " AMZN 1 1356.0 \n", - "2023-10-03 MSFT 1 2474.5 \n", - " AMZN 1 1179.0 \n", - "2023-10-04 MSFT 1 2751.5 \n", - " AMZN 1 1262.0 \n", - "2023-10-05 MSFT 1 2746.5 \n", - " AMZN 1 1223.5 \n", - "2023-10-06 MSFT 1 3130.0 \n", - " AMZN 1 1295.0 \n", - "2023-10-09 MSFT 1 3304.0 \n", - " AMZN 1 1309.0 \n", - "2023-10-10 MSFT 1 3225.0 \n", - " AMZN 1 1356.5 \n", - "2023-10-11 MSFT 1 3383.5 \n", - " AMZN 1 1471.0 \n", - "2023-10-12 MSFT 1 3269.5 \n", - " AMZN 1 1488.5 \n", - "2023-10-13 MSFT 1 3197.5 \n", - " AMZN 1 1390.0 \n", - "2023-10-16 MSFT 1 3393.0 \n", - " AMZN 1 1512.5 \n", - "2023-10-17 MSFT 1 3339.5 \n", - " AMZN 1 1453.5 \n", - "2023-10-18 MSFT 1 3279.0 \n", - " AMZN 1 1346.0 \n", - "2023-10-19 MSFT 1 3417.5 \n", - " AMZN 1 1294.5 \n", - "2023-10-20 MSFT 1 3167.5 \n", - " AMZN 1 1185.5 \n", - "2023-10-23 MSFT 1 3270.5 \n", - " AMZN 1 1245.5 \n", - "2023-10-24 MSFT 1 3343.0 \n", - " AMZN 1 1344.0 \n", - "2023-10-25 MSFT 1 3896.0 " - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.portfolio.get_all_positions()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " 179946728 function calls (179230715 primitive calls) in 771.171 seconds\n", - "\n", - " Ordered by: cumulative time\n", - " List reduced from 2996 to 30 due to restriction <30>\n", - "\n", - " ncalls tottime percall cumtime percall filename:lineno(function)\n", - " 2 0.000 0.000 771.173 385.587 c:\\Users\\Zino\\python-playground\\QuantTools\\.venv\\lib\\site-packages\\IPython\\core\\interactiveshell.py:3517(run_code)\n", - " 2 0.000 0.000 771.173 385.587 {built-in method builtins.exec}\n", - " 1 0.000 0.000 771.173 771.173 C:\\Users\\Zino\\AppData\\Local\\Temp\\ipykernel_28000\\3226836942.py:1()\n", - " 1 0.028 0.028 771.173 771.173 C:\\Users\\Zino\\python-playground\\QuantTools\\EventDriven\\backtest.py:37(run)\n", - " 79 0.000 0.000 629.085 7.963 C:\\Users\\Zino\\python-playground\\QuantTools\\EventDriven\\portfolio.py:378(update_signal)\n", - " 79 0.003 0.000 629.083 7.963 C:\\Users\\Zino\\python-playground\\QuantTools\\EventDriven\\portfolio.py:267(generate_order)\n", - " 45 0.002 0.000 621.001 13.800 C:\\Users\\Zino\\python-playground\\QuantTools\\EventDriven\\portfolio.py:296(create_order)\n", - " 90/45 0.006 0.000 620.970 13.799 C:\\Users\\Zino\\python-playground\\QuantTools\\trade\\helpers\\decorators.py:37(wrapper)\n", - " 45 0.011 0.000 620.926 13.798 C:\\Users\\Zino\\python-playground\\QuantTools\\EventDriven\\riskmanager.py:463(get_order)\n", - " 20753 464.060 0.022 464.060 0.022 {method 'acquire' of '_thread.lock' objects}\n", - " 5026 0.038 0.000 463.357 0.092 C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\\lib\\threading.py:288(wait)\n", - " 3736 0.034 0.000 460.912 0.123 C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\\lib\\concurrent\\futures\\_base.py:430(result)\n", - " 45 0.019 0.000 387.365 8.608 C:\\Users\\Zino\\python-playground\\QuantTools\\EventDriven\\riskmanager.py:72(populate_cache)\n", - " 176 0.007 0.000 386.928 2.198 C:\\Users\\Zino\\python-playground\\QuantTools\\trade\\helpers\\threads.py:4(runThreads)\n", - " 2892 0.016 0.000 384.527 0.133 C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\\lib\\concurrent\\futures\\_base.py:614(result_iterator)\n", - " 2716 0.006 0.000 384.509 0.142 C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\\lib\\concurrent\\futures\\_base.py:316(_result_or_cancel)\n", - " 45 0.005 0.000 232.584 5.169 C:\\Users\\Zino\\python-playground\\QuantTools\\EventDriven\\riskmanager.py:350(produce_order_candidates)\n", - " 90 0.016 0.000 232.579 2.584 C:\\Users\\Zino\\python-playground\\QuantTools\\EventDriven\\riskmanager.py:217(chain_details)\n", - " 140 0.003 0.000 161.314 1.152 c:\\Users\\Zino\\python-playground\\QuantTools\\.venv\\lib\\site-packages\\requests\\sessions.py:500(request)\n", - " 140 0.004 0.000 161.147 1.151 c:\\Users\\Zino\\python-playground\\QuantTools\\.venv\\lib\\site-packages\\requests\\sessions.py:673(send)\n", - " 82 0.002 0.000 159.095 1.940 C:\\Users\\Zino\\python-playground\\FinanceDatabase\\FinanceDatabase\\dbase\\DataAPI\\ThetaData.py:34(request_from_proxy)\n", - " 82 0.001 0.000 159.091 1.940 c:\\Users\\Zino\\python-playground\\QuantTools\\.venv\\lib\\site-packages\\requests\\api.py:14(request)\n", - " 1359 0.008 0.000 157.182 0.116 C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\\lib\\socket.py:691(readinto)\n", - " 1185 155.145 0.131 155.145 0.131 {method 'recv_into' of '_socket.socket' objects}\n", - " 140 0.003 0.000 151.908 1.085 c:\\Users\\Zino\\python-playground\\QuantTools\\.venv\\lib\\site-packages\\requests\\adapters.py:613(send)\n", - " 140 0.003 0.000 151.846 1.085 c:\\Users\\Zino\\python-playground\\QuantTools\\.venv\\lib\\site-packages\\urllib3\\connectionpool.py:594(urlopen)\n", - " 140 0.004 0.000 151.816 1.084 c:\\Users\\Zino\\python-playground\\QuantTools\\.venv\\lib\\site-packages\\urllib3\\connectionpool.py:379(_make_request)\n", - " 140 0.007 0.000 148.221 1.059 c:\\Users\\Zino\\python-playground\\QuantTools\\.venv\\lib\\site-packages\\urllib3\\connection.py:481(getresponse)\n", - " 140 0.002 0.000 148.182 1.058 C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\\lib\\http\\client.py:1331(getresponse)\n", - " 140 0.004 0.000 148.170 1.058 C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\\lib\\http\\client.py:311(begin)\n", - "\n", - "\n", - "\n" - ] - } - ], - "source": [ - "stats.print_stats(30)\n", - "print(stream.getvalue())\n", - "with open('bactest_data.txt', 'w') as f:\n", - " stream.seek(0)\n", - " f.write(stream.read())\n", - " f.flush()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "ename": "AttributeError", - "evalue": "'OptionSignalPortfolio' object has no attribute '_trades'", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[1;32mIn[31], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m \u001b[43mevb_backtest\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mportfolio\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mplot_portfolio\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[1;32m~\\python-playground\\QuantTools\\EventDriven\\portfolio.py:666\u001b[0m, in \u001b[0;36mOptionSignalPortfolio.plot_portfolio\u001b[1;34m(self, benchmark, plot_bnchmk, return_plot, start_plot, **kwargs)\u001b[0m\n\u001b[0;32m 664\u001b[0m eq \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_equity\n\u001b[0;32m 665\u001b[0m dd \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdd(\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[1;32m--> 666\u001b[0m tr \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_trades\u001b[49m\u001b[38;5;241m.\u001b[39mcopy()\n\u001b[0;32m 667\u001b[0m tr[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mSize\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m tr[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mQuantity\u001b[39m\u001b[38;5;124m'\u001b[39m]\n\u001b[0;32m 669\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m plot_portfolio(tr, eq, dd, _bnch,plot_bnchmk\u001b[38;5;241m=\u001b[39mplot_bnchmk, return_plot\u001b[38;5;241m=\u001b[39mreturn_plot, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n", - "\u001b[1;31mAttributeError\u001b[0m: 'OptionSignalPortfolio' object has no attribute '_trades'" - ] - } - ], - "source": [ - "evb_backtest.portfolio.plot_portfolio()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
TickerPnLReturnPctEntryPriceEntryCommissionEntrySlippageEntryMarketValueTotalEntryCostAuxilaryEntryCostExitPriceExitCommissionExitSlippageExitMarketValueTotalExitCostAuxilaryExitCostQuantityEntryTimeExitTimeDurationPositions
0TSLA-10806.520059-21.677784498.5066876.41716.73681011459.23681011488.807620-29.570810390.4414876.41716.5711968986.5711969003.142393-16.571196232023-07-052023-08-0228&L:TSLA20240621C330&S:TSLA20240621C346.67
1AAPL3656.9851317.479087488.9614563.627-10.6280666352.8719346349.4978673.374066525.5313083.627-2.4659996835.5340016833.0680012.465999132023-07-052023-08-0430&L:AAPL20240621C230&S:AAPL20240621C280
2MSFT-10309.332567-21.247498485.2021873.906-1.0753796788.9246216795.661241-6.736621382.1088623.906-1.5699395353.4300615351.8601221.569939142023-07-052023-08-0935&L:MSFT20240621C355&S:MSFT20240621C365
3AMZN-5391.261254-10.873383495.8218650.8371.6285941486.6285941489.931189-3.302594441.9092520.837-0.9352431326.5647571325.6295130.93524332023-07-052023-10-25112&L:AMZN20240621C145&S:AMZN20240621C160
\n", - "
" - ], - "text/plain": [ - " Ticker PnL ReturnPct EntryPrice EntryCommission EntrySlippage \\\n", - "0 TSLA -10806.520059 -21.677784 498.506687 6.417 16.736810 \n", - "1 AAPL 3656.985131 7.479087 488.961456 3.627 -10.628066 \n", - "2 MSFT -10309.332567 -21.247498 485.202187 3.906 -1.075379 \n", - "3 AMZN -5391.261254 -10.873383 495.821865 0.837 1.628594 \n", - "\n", - " EntryMarketValue TotalEntryCost AuxilaryEntryCost ExitPrice \\\n", - "0 11459.236810 11488.807620 -29.570810 390.441487 \n", - "1 6352.871934 6349.497867 3.374066 525.531308 \n", - "2 6788.924621 6795.661241 -6.736621 382.108862 \n", - "3 1486.628594 1489.931189 -3.302594 441.909252 \n", - "\n", - " ExitCommission ExitSlippage ExitMarketValue TotalExitCost \\\n", - "0 6.417 16.571196 8986.571196 9003.142393 \n", - "1 3.627 -2.465999 6835.534001 6833.068001 \n", - "2 3.906 -1.569939 5353.430061 5351.860122 \n", - "3 0.837 -0.935243 1326.564757 1325.629513 \n", - "\n", - " AuxilaryExitCost Quantity EntryTime ExitTime Duration \\\n", - "0 -16.571196 23 2023-07-05 2023-08-02 28 \n", - "1 2.465999 13 2023-07-05 2023-08-04 30 \n", - "2 1.569939 14 2023-07-05 2023-08-09 35 \n", - "3 0.935243 3 2023-07-05 2023-10-25 112 \n", - "\n", - " Positions \n", - "0 &L:TSLA20240621C330&S:TSLA20240621C346.67 \n", - "1 &L:AAPL20240621C230&S:AAPL20240621C280 \n", - "2 &L:MSFT20240621C355&S:MSFT20240621C365 \n", - "3 &L:AMZN20240621C145&S:AMZN20240621C160 " - ] - }, - "execution_count": 74, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "trades_df = evb_backtest.portfolio.get_trades().head(5)\n", - "trades_df" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "evb_backtest.portfolio.get_weighted_holdings()s" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
longshorttrade_idclosequantitymarket_value
datetimesymbol
2023-07-05TSLA[TSLA20240621C330][TSLA20240621C346.67]&L:TSLA20240621C330&S:TSLA20240621C346.673.9002311442.5
AAPL[AAPL20240621C230][AAPL20240621C280]&L:AAPL20240621C230&S:AAPL20240621C2805.260136363.5
MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825146790.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531485.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188775.0
2023-07-06TSLA[TSLA20240621C330][TSLA20240621C346.67]&L:TSLA20240621C330&S:TSLA20240621C346.673.9002310637.5
AAPL[AAPL20240621C230][AAPL20240621C280]&L:AAPL20240621C230&S:AAPL20240621C2805.260136805.5
MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825146545.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531380.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188190.0
2023-07-07TSLA[TSLA20240621C330][TSLA20240621C346.67]&L:TSLA20240621C330&S:TSLA20240621C346.673.9002310235.0
AAPL[AAPL20240621C230][AAPL20240621C280]&L:AAPL20240621C230&S:AAPL20240621C2805.260136474.0
MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825146335.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531485.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188145.0
2023-07-10TSLA[TSLA20240621C330][TSLA20240621C346.67]&L:TSLA20240621C330&S:TSLA20240621C346.673.9002310235.0
AAPL[AAPL20240621C230][AAPL20240621C280]&L:AAPL20240621C230&S:AAPL20240621C2805.260135759.0
MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825145950.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531350.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187560.0
2023-07-11TSLA[TSLA20240621C330][TSLA20240621C346.67]&L:TSLA20240621C330&S:TSLA20240621C346.673.900239832.5
AAPL[AAPL20240621C230][AAPL20240621C280]&L:AAPL20240621C230&S:AAPL20240621C2805.260135622.5
MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825145950.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531410.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188055.0
2023-07-12TSLA[TSLA20240621C330][TSLA20240621C346.67]&L:TSLA20240621C330&S:TSLA20240621C346.673.9002310120.0
AAPL[AAPL20240621C230][AAPL20240621C280]&L:AAPL20240621C230&S:AAPL20240621C2805.260135921.5
MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825146370.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531500.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188190.0
2023-07-13TSLA[TSLA20240621C330][TSLA20240621C346.67]&L:TSLA20240621C330&S:TSLA20240621C346.673.9002310867.5
AAPL[AAPL20240621C230][AAPL20240621C280]&L:AAPL20240621C230&S:AAPL20240621C2805.260136058.0
MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825146160.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531635.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187335.0
2023-07-14TSLA[TSLA20240621C330][TSLA20240621C346.67]&L:TSLA20240621C330&S:TSLA20240621C346.673.9002310982.5
AAPL[AAPL20240621C230][AAPL20240621C280]&L:AAPL20240621C230&S:AAPL20240621C2805.260136077.5
MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825145880.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531642.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200189810.0
2023-07-17TSLA[TSLA20240621C330][TSLA20240621C346.67]&L:TSLA20240621C330&S:TSLA20240621C346.673.9002312420.0
AAPL[AAPL20240621C230][AAPL20240621C280]&L:AAPL20240621C230&S:AAPL20240621C2805.260137026.5
MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825146090.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531567.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187380.0
2023-07-18TSLA[TSLA20240621C330][TSLA20240621C346.67]&L:TSLA20240621C330&S:TSLA20240621C346.673.9002311960.0
AAPL[AAPL20240621C230][AAPL20240621C280]&L:AAPL20240621C230&S:AAPL20240621C2805.260136896.5
MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825147525.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531567.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188550.0
2023-07-19TSLA[TSLA20240621C330][TSLA20240621C346.67]&L:TSLA20240621C330&S:TSLA20240621C346.673.9002313800.0
AAPL[AAPL20240621C230][AAPL20240621C280]&L:AAPL20240621C230&S:AAPL20240621C2805.260137527.0
MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825147420.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531665.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188325.0
2023-07-20TSLA[TSLA20240621C330][TSLA20240621C346.67]&L:TSLA20240621C330&S:TSLA20240621C346.673.900239430.0
AAPL[AAPL20240621C230][AAPL20240621C280]&L:AAPL20240621C230&S:AAPL20240621C2805.260137059.0
MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825146615.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531425.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188370.0
2023-07-21TSLA[TSLA20240621C330][TSLA20240621C346.67]&L:TSLA20240621C330&S:TSLA20240621C346.673.900238912.5
AAPL[AAPL20240621C230][AAPL20240621C280]&L:AAPL20240621C230&S:AAPL20240621C2805.260136597.5
MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825147140.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531417.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187875.0
2023-07-24TSLA[TSLA20240621C330][TSLA20240621C346.67]&L:TSLA20240621C330&S:TSLA20240621C346.673.900239142.5
AAPL[AAPL20240621C230][AAPL20240621C280]&L:AAPL20240621C230&S:AAPL20240621C2805.260136773.0
MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825146965.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531365.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200189360.0
2023-07-25TSLA[TSLA20240621C330][TSLA20240621C346.67]&L:TSLA20240621C330&S:TSLA20240621C346.673.900239430.0
AAPL[AAPL20240621C230][AAPL20240621C280]&L:AAPL20240621C230&S:AAPL20240621C2805.260137033.0
MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825147245.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531357.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188820.0
2023-07-26TSLA[TSLA20240621C330][TSLA20240621C346.67]&L:TSLA20240621C330&S:TSLA20240621C346.673.900238567.5
AAPL[AAPL20240621C230][AAPL20240621C280]&L:AAPL20240621C230&S:AAPL20240621C2805.260137254.0
MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825146090.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531327.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200185400.0
2023-07-27TSLA[TSLA20240621C330][TSLA20240621C346.67]&L:TSLA20240621C330&S:TSLA20240621C346.673.900238452.5
AAPL[AAPL20240621C230][AAPL20240621C280]&L:AAPL20240621C230&S:AAPL20240621C2805.260137104.5
MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825145600.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531335.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188145.0
2023-07-28TSLA[TSLA20240621C330][TSLA20240621C346.67]&L:TSLA20240621C330&S:TSLA20240621C346.673.900239602.5
AAPL[AAPL20240621C230][AAPL20240621C280]&L:AAPL20240621C230&S:AAPL20240621C2805.260137780.5
MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825145600.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531455.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200189135.0
2023-07-31TSLA[TSLA20240621C330][TSLA20240621C346.67]&L:TSLA20240621C330&S:TSLA20240621C346.673.900239372.5
AAPL[AAPL20240621C230][AAPL20240621C280]&L:AAPL20240621C230&S:AAPL20240621C2805.260138216.0
MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825145950.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531560.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001812465.0
2023-08-01TSLA[TSLA20240621C330][TSLA20240621C346.67]&L:TSLA20240621C330&S:TSLA20240621C346.673.900238970.0
AAPL[AAPL20240621C230][AAPL20240621C280]&L:AAPL20240621C230&S:AAPL20240621C2805.260137871.5
MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825145915.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531485.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200189225.0
2023-08-02AAPL[AAPL20240621C230][AAPL20240621C280]&L:AAPL20240621C230&S:AAPL20240621C2805.260137176.0
MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825145425.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531335.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001811565.0
2023-08-03AAPL[AAPL20240621C230][AAPL20240621C280]&L:AAPL20240621C230&S:AAPL20240621C2805.260136838.0
MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825145320.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531365.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200189900.0
2023-08-04MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825145425.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531807.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200184815.0
2023-08-07MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825145040.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531912.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188550.0
2023-08-08MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825145355.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531822.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188640.0
2023-08-09AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531725.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200189000.0
2023-08-10AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531762.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200186975.0
BA[BA20240621C250][BA20240621C260]&L:BA20240621C250&S:BA20240621C2603.77531327.5
WMT[WMT20240621C165][WMT20240621C175]&L:WMT20240621C165&S:WMT20240621C1754.55000.0
2023-08-11AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531762.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187110.0
BA[BA20240621C250][BA20240621C260]&L:BA20240621C250&S:BA20240621C2603.77531290.0
WMT[WMT20240621C165][WMT20240621C175]&L:WMT20240621C165&S:WMT20240621C1754.55000.0
2023-08-14AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531860.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187830.0
BA[BA20240621C250][BA20240621C260]&L:BA20240621C250&S:BA20240621C2603.77531327.5
WMT[WMT20240621C165][WMT20240621C175]&L:WMT20240621C165&S:WMT20240621C1754.55000.0
2023-08-15AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531807.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188100.0
BA[BA20240621C250][BA20240621C260]&L:BA20240621C250&S:BA20240621C2603.77531222.5
WMT[WMT20240621C165][WMT20240621C175]&L:WMT20240621C165&S:WMT20240621C1754.55000.0
2023-08-16AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531620.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187470.0
BA[BA20240621C250][BA20240621C260]&L:BA20240621C250&S:BA20240621C2603.77531132.5
WMT[WMT20240621C165][WMT20240621C175]&L:WMT20240621C165&S:WMT20240621C1754.55000.0
2023-08-17TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.850209450.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531560.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187605.0
2023-08-18TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.850209050.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531545.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187740.0
2023-08-21TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502011250.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531605.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188010.0
2023-08-22TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502011500.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531590.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188145.0
2023-08-23TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502011900.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531635.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188685.0
2023-08-24TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502011150.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531485.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188595.0
2023-08-25TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502012050.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531530.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188595.0
2023-08-28TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502012250.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531537.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188955.0
2023-08-29TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502014150.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531605.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200189405.0
2023-08-30TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502014100.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531597.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200189045.0
2023-08-31TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502014200.0
AAPL[AAPL20240920C210][AAPL20240920C225]&L:AAPL20240920C210&S:AAPL20240920C2254.475147000.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531740.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001810440.0
2023-09-01TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502012700.0
AAPL[AAPL20240920C210][AAPL20240920C225]&L:AAPL20240920C210&S:AAPL20240920C2254.475147315.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531740.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200189135.0
2023-09-04TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502013900.0
AAPL[AAPL20240920C210][AAPL20240920C225]&L:AAPL20240920C210&S:AAPL20240920C2254.475147280.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531702.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001810395.0
2023-09-05TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502013900.0
AAPL[AAPL20240920C210][AAPL20240920C225]&L:AAPL20240920C210&S:AAPL20240920C2254.475147280.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531702.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001810395.0
2023-09-06TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502013500.0
AAPL[AAPL20240920C210][AAPL20240920C225]&L:AAPL20240920C210&S:AAPL20240920C2254.475146265.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531612.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200189225.0
2023-09-07TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502013400.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531725.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188910.0
2023-09-08TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502013100.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531747.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188685.0
2023-09-11TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502015800.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531965.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188415.0
2023-09-12TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502015100.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531882.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188145.0
2023-09-13TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502015500.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42532055.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188550.0
WMT[WMT20240621C170][WMT20240621C180]&L:WMT20240621C170&S:WMT20240621C1804.10000.0
2023-09-14TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502016200.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42532025.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188460.0
WMT[WMT20240621C170][WMT20240621C180]&L:WMT20240621C170&S:WMT20240621C1804.10000.0
2023-09-15TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502016000.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531830.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188100.0
WMT[WMT20240621C170][WMT20240621C180]&L:WMT20240621C170&S:WMT20240621C1804.10000.0
INTC[INTC20240621C37][INTC20240621C55]&L:INTC20240621C37&S:INTC20240621C554.12500.0
2023-09-18TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502014950.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531680.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187155.0
WMT[WMT20240621C170][WMT20240621C180]&L:WMT20240621C170&S:WMT20240621C1804.10000.0
INTC[INTC20240621C37][INTC20240621C55]&L:INTC20240621C37&S:INTC20240621C554.12500.0
2023-09-19TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502015000.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531597.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188055.0
WMT[WMT20240621C170][WMT20240621C180]&L:WMT20240621C170&S:WMT20240621C1804.10000.0
INTC[INTC20240621C37][INTC20240621C55]&L:INTC20240621C37&S:INTC20240621C554.12500.0
2023-09-20TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502014600.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531590.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187740.0
WMT[WMT20240621C170][WMT20240621C180]&L:WMT20240621C170&S:WMT20240621C1804.10000.0
2023-09-21TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502014200.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531327.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187020.0
WMT[WMT20240621C170][WMT20240621C180]&L:WMT20240621C170&S:WMT20240621C1804.10000.0
2023-09-22TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502012750.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531312.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187245.0
WMT[WMT20240621C170][WMT20240621C180]&L:WMT20240621C170&S:WMT20240621C1804.10000.0
2023-09-25TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502014200.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531417.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187605.0
WMT[WMT20240621C170][WMT20240621C180]&L:WMT20240621C170&S:WMT20240621C1804.10000.0
2023-09-26TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502012700.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531200.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187110.0
WMT[WMT20240621C170][WMT20240621C180]&L:WMT20240621C170&S:WMT20240621C1804.10000.0
2023-09-27TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502012250.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531192.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187425.0
WMT[WMT20240621C170][WMT20240621C180]&L:WMT20240621C170&S:WMT20240621C1804.10000.0
2023-09-28TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502012900.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531177.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187650.0
WMT[WMT20240621C170][WMT20240621C180]&L:WMT20240621C170&S:WMT20240621C1804.10000.0
2023-09-29TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502013550.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531230.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187785.0
2023-10-02TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502013450.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531335.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188235.0
2023-10-03TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502012900.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531155.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187830.0
2023-10-04TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502019150.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531230.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188010.0
2023-10-05TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502014550.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531192.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188280.0
2023-10-06TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502014500.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531275.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188775.0
2023-10-09TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502014500.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531290.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188460.0
2023-10-10TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502015000.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531335.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188730.0
2023-10-11TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502014950.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531440.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200189225.0
2023-10-12TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502014450.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531462.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200189225.0
2023-10-13TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502013650.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531372.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188820.0
2023-10-16TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502014000.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531470.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188955.0
2023-10-17TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502014100.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531447.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188010.0
2023-10-18TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502012650.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531155.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187380.0
2023-10-19TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.850209700.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531305.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187380.0
2023-10-20AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531162.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200186975.0
2023-10-23AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531215.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187785.0
2023-10-24AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531327.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188145.0
2023-10-25NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200189855.0
2023-10-26NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200186615.0
2023-10-27NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200186570.0
2023-10-30NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187020.0
2023-10-31NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200186795.0
2023-11-01NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187830.0
2023-11-02NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187875.0
2023-11-03NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188640.0
2023-11-06NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200189540.0
2023-11-07NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200189045.0
2023-11-08NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200189270.0
2023-11-09NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200189720.0
2023-11-10NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001810125.0
2023-11-13NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001810575.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041570.0
2023-11-14MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300125460.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001811205.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041730.0
2023-11-15MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300125580.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001811025.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041770.0
SBUX[SBUX20250117C110][SBUX20250117C120]&L:SBUX20250117C110&S:SBUX20250117C1203.275125100.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40041970.0
2023-11-16MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300124830.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001811160.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041630.0
SBUX[SBUX20250117C110][SBUX20250117C120]&L:SBUX20250117C110&S:SBUX20250117C1203.275125130.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042020.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001462.5
2023-11-17MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300125850.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188955.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041790.0
SBUX[SBUX20250117C110][SBUX20250117C120]&L:SBUX20250117C110&S:SBUX20250117C1203.275125010.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042060.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001480.0
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531462.5
2023-11-20MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300126540.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200189990.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041780.0
SBUX[SBUX20250117C110][SBUX20250117C120]&L:SBUX20250117C110&S:SBUX20250117C1203.275124680.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042100.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001500.0
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531515.0
2023-11-21MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300126870.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001812285.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041680.0
SBUX[SBUX20250117C110][SBUX20250117C120]&L:SBUX20250117C110&S:SBUX20250117C1203.275124500.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40041990.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001480.0
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531470.0
2023-11-22AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525136337.5
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300124890.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001810350.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041690.0
SBUX[SBUX20250117C110][SBUX20250117C120]&L:SBUX20250117C110&S:SBUX20250117C1203.275124500.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042100.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001470.0
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531515.0
2023-11-23AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525136110.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300126180.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001810125.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041780.0
SBUX[SBUX20250117C110][SBUX20250117C120]&L:SBUX20250117C110&S:SBUX20250117C1203.275124380.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042130.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001462.5
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531582.5
2023-11-24AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525136110.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300126180.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001810125.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041780.0
SBUX[SBUX20250117C110][SBUX20250117C120]&L:SBUX20250117C110&S:SBUX20250117C1203.275124380.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042130.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001462.5
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531582.5
2023-11-27AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525136142.5
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300125910.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001811250.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041820.0
SBUX[SBUX20250117C110][SBUX20250117C120]&L:SBUX20250117C110&S:SBUX20250117C1203.275124320.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042160.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001482.5
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531530.0
2023-11-28AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525136175.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300125700.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001810395.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041770.0
SBUX[SBUX20250117C110][SBUX20250117C120]&L:SBUX20250117C110&S:SBUX20250117C1203.275123930.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042120.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001445.0
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531318.5
2023-11-29AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525135980.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300125910.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001810305.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041730.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042200.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001472.5
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531299.0
2023-11-30AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525136045.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300124380.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001810170.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041820.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042080.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001505.0
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531312.5
2023-12-01AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525136240.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300124680.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001810350.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041850.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042060.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001452.5
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531275.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09593573.0
2023-12-04AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525135980.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300123720.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200189225.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72541940.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531275.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041830.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40041950.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001415.0
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531230.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09593514.5
2023-12-05AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525136630.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300125280.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200189855.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72541370.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531312.5
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041650.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40041940.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001405.0
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531150.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09593402.0
2023-12-06AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525136435.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300125370.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200189990.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72541700.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531297.5
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041890.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40041850.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001397.5
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531186.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09593343.5
2023-12-07AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525136695.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300124110.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200189765.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72541890.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.4753892.5
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041960.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042280.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001402.5
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531249.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09593420.0
2023-12-08AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525137052.5
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300124800.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001810485.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72541910.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531455.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042020.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042420.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001425.0
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531302.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09593573.0
2023-12-11AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525136500.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127410.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200189225.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72541920.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531515.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042060.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042650.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001480.0
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531249.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09593505.5
2023-12-12AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525136760.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300125040.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001811070.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72541990.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531477.5
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041870.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043000.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001507.5
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531168.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09593411.0
2023-12-13AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525137215.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300125010.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001810665.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542200.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531560.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042310.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042830.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001525.0
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531275.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594072.5
2023-12-14AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525137280.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300124920.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001810575.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542230.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531620.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042400.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042820.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001562.5
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531357.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595112.0
2023-12-15AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525136695.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300123930.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001811835.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542620.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531650.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042070.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042900.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001547.5
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531329.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594914.0
2023-12-18AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525136857.5
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300123870.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001811565.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542330.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531687.5
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042210.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042890.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001540.0
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531308.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594833.0
2023-12-19AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525136987.5
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300124800.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001811025.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542320.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531710.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042300.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042940.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001567.5
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531353.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594882.5
2023-12-20AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525136630.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300123690.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001811520.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542340.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531732.5
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042180.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042730.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001472.5
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531177.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594581.0
2023-12-21AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525136565.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300125430.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001810980.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542400.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531312.5
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042570.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042980.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001615.0
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531207.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594711.5
2023-12-22AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525135297.5
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300124620.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001810170.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542260.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531687.5
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042330.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042940.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001630.0
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531137.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594806.0
2023-12-25AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525136272.5
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300125400.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001811205.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542240.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531672.5
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042270.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043120.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001647.5
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531131.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595071.5
2023-12-26AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525136272.5
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300125400.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001811205.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542240.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531672.5
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042270.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043120.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001647.5
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531131.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595071.5
2023-12-27AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525136240.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300124770.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001811610.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542400.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531710.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042310.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043180.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001640.0
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531080.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595040.0
2023-12-28AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525136337.5
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300124260.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001811520.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542290.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531777.5
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042400.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043330.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001625.0
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531075.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595058.0
2023-12-29AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525135232.5
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300124800.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001811610.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542620.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531657.5
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042300.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043330.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001612.5
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531066.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594909.5
2024-01-01AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525134842.5
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300125160.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001810845.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542050.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531627.5
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041950.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042870.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001600.0
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531095.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594959.0
2024-01-02AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525134842.5
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300125160.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001810845.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542050.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531627.5
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041950.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042870.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001600.0
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531095.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594959.0
2024-01-03AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525134582.5
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300125370.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001810350.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72541940.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531402.5
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041810.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042620.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001557.5
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531173.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594864.5
2024-01-04MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300124650.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001810890.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72541950.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531335.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042100.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042690.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001565.0
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531089.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594990.5
2024-01-05MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300124560.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001811880.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542450.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531485.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042200.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042890.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001595.0
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531101.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595332.5
2024-01-08MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300125130.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001813050.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542180.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531207.5
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041730.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043250.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001607.5
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531107.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595098.5
2024-01-09MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300125160.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001812645.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542570.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531177.5
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042010.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042950.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001575.0
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.3153994.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594873.5
2024-01-10MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300125910.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001813185.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542230.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531230.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042170.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043610.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001552.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594851.0
2024-01-11MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300125940.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001813500.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542210.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531042.5
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042070.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043310.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001575.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594545.0
2024-01-12MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300126270.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001813365.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542410.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042050.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043190.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001552.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594333.5
2024-01-15MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300126390.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001814310.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542650.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041800.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043630.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001605.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09593960.0
2024-01-16MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300126390.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001814310.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542650.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041800.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043630.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001605.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09593960.0
2024-01-17MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300125280.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001814625.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542420.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042070.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043790.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001605.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09593798.0
2024-01-18MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300126510.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001815030.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542460.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042360.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043800.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001600.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09593739.5
2024-01-19MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127170.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001815120.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542360.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042070.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044040.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001615.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09593987.0
2024-01-22MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300126780.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001815210.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542560.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042460.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044030.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001712.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594149.0
2024-01-23MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300126120.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001815840.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542480.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042720.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043860.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001652.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594293.0
2024-01-24MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128790.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001815255.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72541730.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042750.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043960.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001662.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594351.5
2024-01-25MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127980.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001816020.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542100.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042700.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044500.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001667.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594603.5
2024-01-26MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128430.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001815390.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542250.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042710.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044320.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001660.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594648.5
GOOG[GOOG20250117C160][GOOG20250117C170]&L:GOOG20250117C160&S:GOOG20250117C1704.20083960.0
2024-01-29MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300129540.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001815705.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542120.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042250.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044390.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001682.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594729.5
GOOG[GOOG20250117C160][GOOG20250117C170]&L:GOOG20250117C160&S:GOOG20250117C1704.20084580.0
2024-01-30MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300129570.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001815750.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542340.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042270.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044280.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001587.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595323.5
GOOG[GOOG20250117C160][GOOG20250117C170]&L:GOOG20250117C160&S:GOOG20250117C1704.20083360.0
2024-01-31MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300126930.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001815525.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542150.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042930.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044000.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001615.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594666.5
2024-02-01MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127290.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001815390.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542460.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042300.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044170.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001572.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594765.5
2024-02-02MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128130.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001816740.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542500.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042240.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044330.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001637.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594738.5
2024-02-05MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127530.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817055.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542320.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042480.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044440.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001647.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594437.0
2024-02-06MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128640.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001815795.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542390.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042170.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044100.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001595.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594441.5
2024-02-07MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128670.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001816695.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542490.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042400.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044200.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001607.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.8502985.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594522.5
2024-02-08MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128430.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531492.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001816200.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542410.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042580.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044270.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001595.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021525.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594486.5
2024-02-09MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128310.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531702.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818045.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542490.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042350.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044490.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001562.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021417.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594446.0
2024-02-12MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128490.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531612.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001816650.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542560.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042570.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044310.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001615.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021452.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594702.5
2024-02-13MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127980.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531455.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001815975.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542360.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042570.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044230.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001542.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021525.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594270.5
2024-02-14MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127470.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531545.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001816290.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542360.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042750.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044310.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001537.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021585.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594477.5
2024-02-15MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127650.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531485.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817010.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542540.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042630.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044490.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001530.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021645.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595022.0
2024-02-16MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127110.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531500.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001816515.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542850.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042800.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044240.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001487.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021580.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595031.0
2024-02-19MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127350.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531372.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001815435.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542470.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042590.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043940.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001510.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021450.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594963.5
2024-02-20MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127350.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531372.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001815435.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542470.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042590.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043940.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001510.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021450.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594963.5
2024-02-21MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127260.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531432.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001816245.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542830.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042370.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043790.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001517.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021318.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594833.0
2024-02-22MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128130.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531710.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818945.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542990.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042570.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044530.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001605.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021315.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594738.5
2024-02-23MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128040.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531717.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001816650.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542720.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042290.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044300.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001610.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021318.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594914.0
2024-02-26MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127740.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531717.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001815615.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542550.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042640.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044270.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001662.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021408.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594725.0
2024-02-27MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127680.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531642.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817640.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542740.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042520.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044790.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001710.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021421.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595098.5
2024-02-28MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127740.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531627.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817280.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542780.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042780.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044480.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001647.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021520.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595125.5
2024-02-29MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128310.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531747.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817685.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72543200.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042520.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044670.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001682.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021650.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595301.0
2024-03-01MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127200.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531875.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818225.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542940.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042960.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044680.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001700.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021565.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595260.5
2024-03-04MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128310.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531830.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817280.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542550.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042930.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044840.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001762.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021655.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595764.5
2024-03-05MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127230.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531657.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817775.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542810.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043070.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40045330.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001737.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021645.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595859.0
2024-03-06MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127110.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531627.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001816740.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542890.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042670.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40045010.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001725.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021440.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595841.0
2024-03-07MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127890.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531792.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001816830.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542840.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043110.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40045080.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001765.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021490.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595944.5
2024-03-08MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127500.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531717.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001819890.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542760.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042730.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40045000.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001780.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021400.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595958.0
2024-03-11MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127230.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531552.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001815345.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542540.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042930.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044720.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001682.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021600.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09596115.5
2024-03-12MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128430.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531702.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817010.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542720.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042560.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044760.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001767.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021620.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09596016.5
2024-03-13MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128370.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531770.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817730.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542930.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042750.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044770.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001715.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021605.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09596043.5
2024-03-14MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.3001210740.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531890.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818990.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542560.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042750.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044700.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001702.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021580.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595589.0
2024-03-15MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128490.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531672.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817370.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542830.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043010.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044460.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001700.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021630.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595553.0
2024-03-18MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128670.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531657.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817370.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542700.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042670.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044660.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001695.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021700.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09596192.0
2024-03-19MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300129000.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531725.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001813410.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542830.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043350.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044660.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001712.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021740.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09596214.5
2024-03-20MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300129750.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531852.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817550.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542880.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042930.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044550.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001800.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021900.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09596619.5
2024-03-21MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300129930.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531830.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817595.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72543020.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042970.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044160.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001917.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021845.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09596826.5
2024-03-22MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300129750.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531867.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001816425.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72543050.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043390.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044680.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001932.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021915.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09596790.5
2024-03-25MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300129060.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531920.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817550.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542940.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042970.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044550.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011025.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85022140.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09596646.5
2024-03-26MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128760.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531845.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001816785.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542750.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042900.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044700.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011040.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85022120.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09596786.0
2024-03-27MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128850.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531912.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817100.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72543210.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042950.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044420.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011050.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85022170.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597200.0
2024-03-28MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128340.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531927.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817100.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542940.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043250.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044980.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011042.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85022225.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597078.5
2024-03-29MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128340.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531927.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817100.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542940.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043250.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044980.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011042.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85022225.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597078.5
2024-04-01MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300129360.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531965.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817640.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542620.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043370.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044600.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011072.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85022195.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597056.0
2024-04-02MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128910.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531957.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817730.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542530.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043010.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044490.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011080.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85022190.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09596912.0
2024-04-03MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128370.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532032.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817595.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542470.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043050.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044570.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011152.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85022110.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597074.0
2024-04-04MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128550.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531920.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001816740.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542430.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043110.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044230.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011050.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021875.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09596282.0
2024-04-05MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300129360.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532197.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817595.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542480.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042820.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044250.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011065.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85022050.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09596759.0
2024-04-08MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300129240.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532212.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001816695.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542320.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043050.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044340.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011057.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021905.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09596961.5
2024-04-09MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300129510.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532235.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001819080.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542200.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043230.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044310.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011102.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021960.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597132.5
2024-04-10MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300129150.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532250.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818090.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542310.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042930.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044220.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011087.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021890.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09596520.5
2024-04-11MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300129720.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532422.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817505.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542200.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043280.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044250.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011127.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021860.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09596309.0
2024-04-12MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300129180.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532272.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818900.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542010.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043290.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044020.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011107.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021765.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595854.5
2024-04-15MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128130.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532130.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817730.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72541850.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043190.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043860.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011047.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021605.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09596057.0
2024-04-16MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128250.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532115.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818045.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542290.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042930.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044090.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011202.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021595.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595319.0
2024-04-17MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128010.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532002.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817325.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043070.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043630.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011032.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021600.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595670.0
2024-04-18MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127290.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531897.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001816155.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042530.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043890.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001942.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021540.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595971.5
2024-04-19MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300126570.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531657.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817595.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042630.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043280.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001957.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021565.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09596664.5
2024-04-22MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300126810.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531777.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001822185.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042850.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043390.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001930.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021530.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597105.5
2024-04-23MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127440.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531890.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818585.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042820.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043630.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011037.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021630.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597465.5
2024-04-24MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127590.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531702.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817820.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042730.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043660.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011012.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021645.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597443.0
2024-04-25MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300126840.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531590.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001815885.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042880.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043620.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001952.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021565.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597195.5
2024-04-26MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127170.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531905.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001819935.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042870.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044050.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011027.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021565.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597330.5
2024-04-29MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300126450.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531972.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817640.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042970.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044010.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011015.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021500.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597011.0
2024-04-30MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300125370.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531650.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001815930.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042950.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043900.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001982.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021375.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09596682.5
2024-05-01MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300125940.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531807.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001816785.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042540.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043240.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001962.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021413.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09596228.0
2024-05-02MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300126240.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532152.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817910.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043180.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043250.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001987.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021550.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09596498.0
2024-05-03MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127080.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532190.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818720.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043190.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043600.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011065.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021610.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09596799.5
2024-05-06MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127770.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532340.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817910.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043370.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043890.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011122.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021805.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597092.0
2024-05-07MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127230.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532332.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001816020.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043310.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043900.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011070.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.8502989.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597222.5
2024-05-08MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127350.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532287.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818045.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043230.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043910.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011090.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021003.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597101.0
2024-05-09MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127530.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532355.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818360.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043390.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043560.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011057.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.8502995.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597578.0
2024-05-10MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127740.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532220.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817100.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043270.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043760.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011115.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.8502991.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597677.0
2024-05-13MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127800.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532175.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818045.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043680.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043900.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011137.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.8502978.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597438.5
2024-05-14MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127980.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532182.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818135.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043770.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043880.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011055.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.8502929.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597564.5
2024-05-15MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128910.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532107.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818135.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043790.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044260.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011190.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.8502770.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597866.0
2024-05-16MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128730.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531965.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818180.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043560.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044350.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011147.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09598019.0
2024-05-17MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128070.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532010.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817955.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043350.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044450.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011145.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09598082.0
2024-05-20MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300129030.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531927.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818495.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043590.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044500.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011167.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597807.5
2024-05-21AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75094491.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300129480.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531905.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818540.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043350.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044460.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011105.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09598176.5
2024-05-22AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75093645.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.3001210680.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531897.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817640.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043660.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044500.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011140.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597821.0
2024-05-23AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75093618.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300129240.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531762.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001816200.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043530.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044280.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011150.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597974.0
2024-05-24AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75094153.5
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300129390.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531732.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001820070.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043590.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044600.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011240.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09598248.5
2024-05-27AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75094194.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300129660.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531815.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001819440.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043420.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044790.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011200.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09598131.5
2024-05-28AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75094194.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300129660.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531815.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001819440.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043420.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044790.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011200.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09598131.5
2024-05-29AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75094248.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300129510.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531822.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001819260.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043200.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044470.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011205.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597704.0
2024-05-30AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75094468.5
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127710.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531657.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817865.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043630.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044600.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011212.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597794.0
2024-05-31AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75094590.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127680.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531470.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818315.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043660.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044580.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011117.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09598491.5
2024-06-03AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75094815.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127380.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531575.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817865.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043550.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044410.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011162.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597488.0
2024-06-04AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75094716.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127620.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531612.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817775.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043550.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044260.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011140.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597897.5
2024-06-05AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75095040.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127950.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531725.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001820025.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043710.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044600.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011192.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09598388.0
2024-06-06AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75094801.5
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128700.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531950.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818450.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043540.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044540.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011182.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09598280.0
2024-06-07AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75095175.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128490.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531897.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818360.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043680.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044660.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011202.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09598478.0
2024-06-10AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75094509.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300129090.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532070.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818360.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043600.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044310.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011197.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09598487.0
2024-06-11AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75096952.5
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300129630.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532062.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818360.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043610.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044270.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011210.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597920.0
2024-06-12AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75098910.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.3001210590.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532032.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818360.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043680.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044410.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011275.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09598280.0
2024-06-13AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75098730.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.3001210500.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531837.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818360.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043830.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044370.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011250.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09598176.5
2024-06-14AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75098370.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.3001210860.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531837.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818360.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043680.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044350.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011220.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09598131.5
2024-06-17AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75099180.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.3001211730.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531852.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818360.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043690.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044260.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011315.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09598316.0
2024-06-18AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75098887.5
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.3001211100.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531755.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818360.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043720.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044030.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011287.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09598694.0
2024-06-19AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75097560.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.3001211250.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531957.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818360.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043710.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044410.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011270.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09598685.0
2024-06-20AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75097560.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.3001211250.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531957.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818360.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043710.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044410.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011270.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09598685.0
2024-06-21AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75096885.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.3001212060.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532122.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818360.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043590.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044400.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011222.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09598289.0
2024-06-24AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75096570.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.3001211940.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531905.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818360.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043560.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044350.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011310.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09598572.5
2024-06-25AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75097380.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.3001212120.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531950.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818360.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043190.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044410.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011222.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09598676.0
2024-06-26AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75098212.5
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.3001212090.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532415.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818360.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043260.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044260.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011262.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597969.5
2024-06-27AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75098392.5
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.3001211550.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532715.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818360.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043780.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044390.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011222.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09598451.0
2024-06-28AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75097875.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.3001212360.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532332.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818360.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043920.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044560.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011210.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09598185.5
\n", - "
" - ], - "text/plain": [ - " long short \\\n", - "datetime symbol \n", - "2023-07-05 TSLA [TSLA20240621C330] [TSLA20240621C346.67] \n", - " AAPL [AAPL20240621C230] [AAPL20240621C280] \n", - " MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-07-06 TSLA [TSLA20240621C330] [TSLA20240621C346.67] \n", - " AAPL [AAPL20240621C230] [AAPL20240621C280] \n", - " MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-07-07 TSLA [TSLA20240621C330] [TSLA20240621C346.67] \n", - " AAPL [AAPL20240621C230] [AAPL20240621C280] \n", - " MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-07-10 TSLA [TSLA20240621C330] [TSLA20240621C346.67] \n", - " AAPL [AAPL20240621C230] [AAPL20240621C280] \n", - " MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-07-11 TSLA [TSLA20240621C330] [TSLA20240621C346.67] \n", - " AAPL [AAPL20240621C230] [AAPL20240621C280] \n", - " MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-07-12 TSLA [TSLA20240621C330] [TSLA20240621C346.67] \n", - " AAPL [AAPL20240621C230] [AAPL20240621C280] \n", - " MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-07-13 TSLA [TSLA20240621C330] [TSLA20240621C346.67] \n", - " AAPL [AAPL20240621C230] [AAPL20240621C280] \n", - " MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-07-14 TSLA [TSLA20240621C330] [TSLA20240621C346.67] \n", - " AAPL [AAPL20240621C230] [AAPL20240621C280] \n", - " MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-07-17 TSLA [TSLA20240621C330] [TSLA20240621C346.67] \n", - " AAPL [AAPL20240621C230] [AAPL20240621C280] \n", - " MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-07-18 TSLA [TSLA20240621C330] [TSLA20240621C346.67] \n", - " AAPL [AAPL20240621C230] [AAPL20240621C280] \n", - " MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-07-19 TSLA [TSLA20240621C330] [TSLA20240621C346.67] \n", - " AAPL [AAPL20240621C230] [AAPL20240621C280] \n", - " MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-07-20 TSLA [TSLA20240621C330] [TSLA20240621C346.67] \n", - " AAPL [AAPL20240621C230] [AAPL20240621C280] \n", - " MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-07-21 TSLA [TSLA20240621C330] [TSLA20240621C346.67] \n", - " AAPL [AAPL20240621C230] [AAPL20240621C280] \n", - " MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-07-24 TSLA [TSLA20240621C330] [TSLA20240621C346.67] \n", - " AAPL [AAPL20240621C230] [AAPL20240621C280] \n", - " MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-07-25 TSLA [TSLA20240621C330] [TSLA20240621C346.67] \n", - " AAPL [AAPL20240621C230] [AAPL20240621C280] \n", - " MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-07-26 TSLA [TSLA20240621C330] [TSLA20240621C346.67] \n", - " AAPL [AAPL20240621C230] [AAPL20240621C280] \n", - " MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-07-27 TSLA [TSLA20240621C330] [TSLA20240621C346.67] \n", - " AAPL [AAPL20240621C230] [AAPL20240621C280] \n", - " MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-07-28 TSLA [TSLA20240621C330] [TSLA20240621C346.67] \n", - " AAPL [AAPL20240621C230] [AAPL20240621C280] \n", - " MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-07-31 TSLA [TSLA20240621C330] [TSLA20240621C346.67] \n", - " AAPL [AAPL20240621C230] [AAPL20240621C280] \n", - " MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-08-01 TSLA [TSLA20240621C330] [TSLA20240621C346.67] \n", - " AAPL [AAPL20240621C230] [AAPL20240621C280] \n", - " MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-08-02 AAPL [AAPL20240621C230] [AAPL20240621C280] \n", - " MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-08-03 AAPL [AAPL20240621C230] [AAPL20240621C280] \n", - " MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-08-04 MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-08-07 MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-08-08 MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-08-09 AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-08-10 AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " BA [BA20240621C250] [BA20240621C260] \n", - " WMT [WMT20240621C165] [WMT20240621C175] \n", - "2023-08-11 AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " BA [BA20240621C250] [BA20240621C260] \n", - " WMT [WMT20240621C165] [WMT20240621C175] \n", - "2023-08-14 AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " BA [BA20240621C250] [BA20240621C260] \n", - " WMT [WMT20240621C165] [WMT20240621C175] \n", - "2023-08-15 AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " BA [BA20240621C250] [BA20240621C260] \n", - " WMT [WMT20240621C165] [WMT20240621C175] \n", - "2023-08-16 AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " BA [BA20240621C250] [BA20240621C260] \n", - " WMT [WMT20240621C165] [WMT20240621C175] \n", - "2023-08-17 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-08-18 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-08-21 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-08-22 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-08-23 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-08-24 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-08-25 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-08-28 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-08-29 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-08-30 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-08-31 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AAPL [AAPL20240920C210] [AAPL20240920C225] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-09-01 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AAPL [AAPL20240920C210] [AAPL20240920C225] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-09-04 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AAPL [AAPL20240920C210] [AAPL20240920C225] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-09-05 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AAPL [AAPL20240920C210] [AAPL20240920C225] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-09-06 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AAPL [AAPL20240920C210] [AAPL20240920C225] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-09-07 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-09-08 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-09-11 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-09-12 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-09-13 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20240621C170] [WMT20240621C180] \n", - "2023-09-14 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20240621C170] [WMT20240621C180] \n", - "2023-09-15 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20240621C170] [WMT20240621C180] \n", - " INTC [INTC20240621C37] [INTC20240621C55] \n", - "2023-09-18 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20240621C170] [WMT20240621C180] \n", - " INTC [INTC20240621C37] [INTC20240621C55] \n", - "2023-09-19 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20240621C170] [WMT20240621C180] \n", - " INTC [INTC20240621C37] [INTC20240621C55] \n", - "2023-09-20 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20240621C170] [WMT20240621C180] \n", - "2023-09-21 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20240621C170] [WMT20240621C180] \n", - "2023-09-22 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20240621C170] [WMT20240621C180] \n", - "2023-09-25 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20240621C170] [WMT20240621C180] \n", - "2023-09-26 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20240621C170] [WMT20240621C180] \n", - "2023-09-27 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20240621C170] [WMT20240621C180] \n", - "2023-09-28 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20240621C170] [WMT20240621C180] \n", - "2023-09-29 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-10-02 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-10-03 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-10-04 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-10-05 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-10-06 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-10-09 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-10-10 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-10-11 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-10-12 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-10-13 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-10-16 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-10-17 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-10-18 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-10-19 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-10-20 AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-10-23 AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-10-24 AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-10-25 NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-10-26 NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-10-27 NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-10-30 NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-10-31 NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-11-01 NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-11-02 NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-11-03 NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-11-06 NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-11-07 NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-11-08 NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-11-09 NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-11-10 NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-11-13 NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - "2023-11-14 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - "2023-11-15 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " SBUX [SBUX20250117C110] [SBUX20250117C120] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - "2023-11-16 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " SBUX [SBUX20250117C110] [SBUX20250117C120] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - "2023-11-17 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " SBUX [SBUX20250117C110] [SBUX20250117C120] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - "2023-11-20 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " SBUX [SBUX20250117C110] [SBUX20250117C120] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - "2023-11-21 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " SBUX [SBUX20250117C110] [SBUX20250117C120] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - "2023-11-22 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " SBUX [SBUX20250117C110] [SBUX20250117C120] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - "2023-11-23 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " SBUX [SBUX20250117C110] [SBUX20250117C120] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - "2023-11-24 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " SBUX [SBUX20250117C110] [SBUX20250117C120] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - "2023-11-27 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " SBUX [SBUX20250117C110] [SBUX20250117C120] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - "2023-11-28 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " SBUX [SBUX20250117C110] [SBUX20250117C120] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - "2023-11-29 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - "2023-11-30 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - "2023-12-01 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2023-12-04 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2023-12-05 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2023-12-06 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2023-12-07 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2023-12-08 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2023-12-11 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2023-12-12 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2023-12-13 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2023-12-14 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2023-12-15 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2023-12-18 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2023-12-19 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2023-12-20 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2023-12-21 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2023-12-22 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2023-12-25 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2023-12-26 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2023-12-27 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2023-12-28 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2023-12-29 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-01-01 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-01-02 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-01-03 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-01-04 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-01-05 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-01-08 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-01-09 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-01-10 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-01-11 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-01-12 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-01-15 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-01-16 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-01-17 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-01-18 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-01-19 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-01-22 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-01-23 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-01-24 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-01-25 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-01-26 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - " GOOG [GOOG20250117C160] [GOOG20250117C170] \n", - "2024-01-29 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - " GOOG [GOOG20250117C160] [GOOG20250117C170] \n", - "2024-01-30 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - " GOOG [GOOG20250117C160] [GOOG20250117C170] \n", - "2024-01-31 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-02-01 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-02-02 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-02-05 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-02-06 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-02-07 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-02-08 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-02-09 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-02-12 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-02-13 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-02-14 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-02-15 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-02-16 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-02-19 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-02-20 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-02-21 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-02-22 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-02-23 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-02-26 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-02-27 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-02-28 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-02-29 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-03-01 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-03-04 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-03-05 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-03-06 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-03-07 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-03-08 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-03-11 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-03-12 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-03-13 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-03-14 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-03-15 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-03-18 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-03-19 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-03-20 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-03-21 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-03-22 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-03-25 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-03-26 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-03-27 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-03-28 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-03-29 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-04-01 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-04-02 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-04-03 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-04-04 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-04-05 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-04-08 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-04-09 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-04-10 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-04-11 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-04-12 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-04-15 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-04-16 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-04-17 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-04-18 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-04-19 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-04-22 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-04-23 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-04-24 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-04-25 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-04-26 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-04-29 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-04-30 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-05-01 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-05-02 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-05-03 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-05-06 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-05-07 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-05-08 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-05-09 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-05-10 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-05-13 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-05-14 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-05-15 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-05-16 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-05-17 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-05-20 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-05-21 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-05-22 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-05-23 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-05-24 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-05-27 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-05-28 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-05-29 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-05-30 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-05-31 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-06-03 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-06-04 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-06-05 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-06-06 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-06-07 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-06-10 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-06-11 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-06-12 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-06-13 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-06-14 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-06-17 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-06-18 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-06-19 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-06-20 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-06-21 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-06-24 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-06-25 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-06-26 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-06-27 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-06-28 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "\n", - " trade_id close \\\n", - "datetime symbol \n", - "2023-07-05 TSLA &L:TSLA20240621C330&S:TSLA20240621C346.67 3.900 \n", - " AAPL &L:AAPL20240621C230&S:AAPL20240621C280 5.260 \n", - " MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-07-06 TSLA &L:TSLA20240621C330&S:TSLA20240621C346.67 3.900 \n", - " AAPL &L:AAPL20240621C230&S:AAPL20240621C280 5.260 \n", - " MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-07-07 TSLA &L:TSLA20240621C330&S:TSLA20240621C346.67 3.900 \n", - " AAPL &L:AAPL20240621C230&S:AAPL20240621C280 5.260 \n", - " MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-07-10 TSLA &L:TSLA20240621C330&S:TSLA20240621C346.67 3.900 \n", - " AAPL &L:AAPL20240621C230&S:AAPL20240621C280 5.260 \n", - " MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-07-11 TSLA &L:TSLA20240621C330&S:TSLA20240621C346.67 3.900 \n", - " AAPL &L:AAPL20240621C230&S:AAPL20240621C280 5.260 \n", - " MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-07-12 TSLA &L:TSLA20240621C330&S:TSLA20240621C346.67 3.900 \n", - " AAPL &L:AAPL20240621C230&S:AAPL20240621C280 5.260 \n", - " MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-07-13 TSLA &L:TSLA20240621C330&S:TSLA20240621C346.67 3.900 \n", - " AAPL &L:AAPL20240621C230&S:AAPL20240621C280 5.260 \n", - " MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-07-14 TSLA &L:TSLA20240621C330&S:TSLA20240621C346.67 3.900 \n", - " AAPL &L:AAPL20240621C230&S:AAPL20240621C280 5.260 \n", - " MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-07-17 TSLA &L:TSLA20240621C330&S:TSLA20240621C346.67 3.900 \n", - " AAPL &L:AAPL20240621C230&S:AAPL20240621C280 5.260 \n", - " MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-07-18 TSLA &L:TSLA20240621C330&S:TSLA20240621C346.67 3.900 \n", - " AAPL &L:AAPL20240621C230&S:AAPL20240621C280 5.260 \n", - " MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-07-19 TSLA &L:TSLA20240621C330&S:TSLA20240621C346.67 3.900 \n", - " AAPL &L:AAPL20240621C230&S:AAPL20240621C280 5.260 \n", - " MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-07-20 TSLA &L:TSLA20240621C330&S:TSLA20240621C346.67 3.900 \n", - " AAPL &L:AAPL20240621C230&S:AAPL20240621C280 5.260 \n", - " MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-07-21 TSLA &L:TSLA20240621C330&S:TSLA20240621C346.67 3.900 \n", - " AAPL &L:AAPL20240621C230&S:AAPL20240621C280 5.260 \n", - " MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-07-24 TSLA &L:TSLA20240621C330&S:TSLA20240621C346.67 3.900 \n", - " AAPL &L:AAPL20240621C230&S:AAPL20240621C280 5.260 \n", - " MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-07-25 TSLA &L:TSLA20240621C330&S:TSLA20240621C346.67 3.900 \n", - " AAPL &L:AAPL20240621C230&S:AAPL20240621C280 5.260 \n", - " MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-07-26 TSLA &L:TSLA20240621C330&S:TSLA20240621C346.67 3.900 \n", - " AAPL &L:AAPL20240621C230&S:AAPL20240621C280 5.260 \n", - " MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-07-27 TSLA &L:TSLA20240621C330&S:TSLA20240621C346.67 3.900 \n", - " AAPL &L:AAPL20240621C230&S:AAPL20240621C280 5.260 \n", - " MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-07-28 TSLA &L:TSLA20240621C330&S:TSLA20240621C346.67 3.900 \n", - " AAPL &L:AAPL20240621C230&S:AAPL20240621C280 5.260 \n", - " MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-07-31 TSLA &L:TSLA20240621C330&S:TSLA20240621C346.67 3.900 \n", - " AAPL &L:AAPL20240621C230&S:AAPL20240621C280 5.260 \n", - " MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-08-01 TSLA &L:TSLA20240621C330&S:TSLA20240621C346.67 3.900 \n", - " AAPL &L:AAPL20240621C230&S:AAPL20240621C280 5.260 \n", - " MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-08-02 AAPL &L:AAPL20240621C230&S:AAPL20240621C280 5.260 \n", - " MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-08-03 AAPL &L:AAPL20240621C230&S:AAPL20240621C280 5.260 \n", - " MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-08-04 MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-08-07 MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-08-08 MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-08-09 AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-08-10 AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " BA &L:BA20240621C250&S:BA20240621C260 3.775 \n", - " WMT &L:WMT20240621C165&S:WMT20240621C175 4.550 \n", - "2023-08-11 AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " BA &L:BA20240621C250&S:BA20240621C260 3.775 \n", - " WMT &L:WMT20240621C165&S:WMT20240621C175 4.550 \n", - "2023-08-14 AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " BA &L:BA20240621C250&S:BA20240621C260 3.775 \n", - " WMT &L:WMT20240621C165&S:WMT20240621C175 4.550 \n", - "2023-08-15 AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " BA &L:BA20240621C250&S:BA20240621C260 3.775 \n", - " WMT &L:WMT20240621C165&S:WMT20240621C175 4.550 \n", - "2023-08-16 AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " BA &L:BA20240621C250&S:BA20240621C260 3.775 \n", - " WMT &L:WMT20240621C165&S:WMT20240621C175 4.550 \n", - "2023-08-17 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-08-18 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-08-21 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-08-22 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-08-23 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-08-24 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-08-25 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-08-28 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-08-29 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-08-30 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-08-31 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AAPL &L:AAPL20240920C210&S:AAPL20240920C225 4.475 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-09-01 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AAPL &L:AAPL20240920C210&S:AAPL20240920C225 4.475 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-09-04 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AAPL &L:AAPL20240920C210&S:AAPL20240920C225 4.475 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-09-05 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AAPL &L:AAPL20240920C210&S:AAPL20240920C225 4.475 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-09-06 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AAPL &L:AAPL20240920C210&S:AAPL20240920C225 4.475 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-09-07 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-09-08 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-09-11 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-09-12 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-09-13 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20240621C170&S:WMT20240621C180 4.100 \n", - "2023-09-14 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20240621C170&S:WMT20240621C180 4.100 \n", - "2023-09-15 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20240621C170&S:WMT20240621C180 4.100 \n", - " INTC &L:INTC20240621C37&S:INTC20240621C55 4.125 \n", - "2023-09-18 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20240621C170&S:WMT20240621C180 4.100 \n", - " INTC &L:INTC20240621C37&S:INTC20240621C55 4.125 \n", - "2023-09-19 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20240621C170&S:WMT20240621C180 4.100 \n", - " INTC &L:INTC20240621C37&S:INTC20240621C55 4.125 \n", - "2023-09-20 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20240621C170&S:WMT20240621C180 4.100 \n", - "2023-09-21 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20240621C170&S:WMT20240621C180 4.100 \n", - "2023-09-22 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20240621C170&S:WMT20240621C180 4.100 \n", - "2023-09-25 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20240621C170&S:WMT20240621C180 4.100 \n", - "2023-09-26 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20240621C170&S:WMT20240621C180 4.100 \n", - "2023-09-27 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20240621C170&S:WMT20240621C180 4.100 \n", - "2023-09-28 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20240621C170&S:WMT20240621C180 4.100 \n", - "2023-09-29 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-10-02 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-10-03 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-10-04 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-10-05 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-10-06 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-10-09 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-10-10 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-10-11 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-10-12 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-10-13 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-10-16 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-10-17 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-10-18 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-10-19 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-10-20 AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-10-23 AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-10-24 AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-10-25 NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-10-26 NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-10-27 NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-10-30 NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-10-31 NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-11-01 NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-11-02 NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-11-03 NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-11-06 NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-11-07 NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-11-08 NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-11-09 NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-11-10 NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-11-13 NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - "2023-11-14 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - "2023-11-15 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " SBUX &L:SBUX20250117C110&S:SBUX20250117C120 3.275 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - "2023-11-16 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " SBUX &L:SBUX20250117C110&S:SBUX20250117C120 3.275 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - "2023-11-17 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " SBUX &L:SBUX20250117C110&S:SBUX20250117C120 3.275 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - "2023-11-20 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " SBUX &L:SBUX20250117C110&S:SBUX20250117C120 3.275 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - "2023-11-21 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " SBUX &L:SBUX20250117C110&S:SBUX20250117C120 3.275 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - "2023-11-22 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " SBUX &L:SBUX20250117C110&S:SBUX20250117C120 3.275 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - "2023-11-23 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " SBUX &L:SBUX20250117C110&S:SBUX20250117C120 3.275 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - "2023-11-24 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " SBUX &L:SBUX20250117C110&S:SBUX20250117C120 3.275 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - "2023-11-27 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " SBUX &L:SBUX20250117C110&S:SBUX20250117C120 3.275 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - "2023-11-28 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " SBUX &L:SBUX20250117C110&S:SBUX20250117C120 3.275 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - "2023-11-29 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - "2023-11-30 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - "2023-12-01 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2023-12-04 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2023-12-05 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2023-12-06 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2023-12-07 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2023-12-08 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2023-12-11 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2023-12-12 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2023-12-13 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2023-12-14 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2023-12-15 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2023-12-18 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2023-12-19 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2023-12-20 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2023-12-21 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2023-12-22 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2023-12-25 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2023-12-26 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2023-12-27 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2023-12-28 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2023-12-29 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-01-01 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-01-02 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-01-03 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-01-04 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-01-05 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-01-08 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-01-09 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-01-10 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-01-11 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-01-12 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-01-15 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-01-16 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-01-17 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-01-18 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-01-19 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-01-22 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-01-23 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-01-24 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-01-25 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-01-26 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - " GOOG &L:GOOG20250117C160&S:GOOG20250117C170 4.200 \n", - "2024-01-29 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - " GOOG &L:GOOG20250117C160&S:GOOG20250117C170 4.200 \n", - "2024-01-30 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - " GOOG &L:GOOG20250117C160&S:GOOG20250117C170 4.200 \n", - "2024-01-31 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-02-01 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-02-02 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-02-05 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-02-06 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-02-07 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-02-08 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-02-09 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-02-12 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-02-13 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-02-14 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-02-15 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-02-16 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-02-19 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-02-20 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-02-21 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-02-22 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-02-23 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-02-26 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-02-27 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-02-28 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-02-29 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-03-01 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-03-04 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-03-05 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-03-06 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-03-07 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-03-08 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-03-11 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-03-12 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-03-13 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-03-14 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-03-15 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-03-18 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-03-19 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-03-20 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-03-21 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-03-22 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-03-25 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-03-26 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-03-27 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-03-28 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-03-29 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-04-01 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-04-02 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-04-03 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-04-04 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-04-05 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-04-08 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-04-09 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-04-10 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-04-11 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-04-12 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-04-15 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-04-16 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-04-17 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-04-18 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-04-19 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-04-22 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-04-23 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-04-24 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-04-25 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-04-26 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-04-29 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-04-30 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-05-01 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-05-02 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-05-03 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-05-06 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-05-07 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-05-08 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-05-09 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-05-10 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-05-13 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-05-14 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-05-15 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-05-16 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-05-17 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-05-20 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-05-21 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-05-22 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-05-23 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-05-24 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-05-27 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-05-28 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-05-29 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-05-30 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-05-31 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-06-03 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-06-04 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-06-05 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-06-06 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-06-07 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-06-10 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-06-11 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-06-12 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-06-13 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-06-14 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-06-17 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-06-18 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-06-19 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-06-20 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-06-21 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-06-24 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-06-25 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-06-26 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-06-27 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-06-28 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "\n", - " quantity market_value \n", - "datetime symbol \n", - "2023-07-05 TSLA 23 11442.5 \n", - " AAPL 13 6363.5 \n", - " MSFT 14 6790.0 \n", - " AMZN 3 1485.0 \n", - " NVDA 18 8775.0 \n", - "2023-07-06 TSLA 23 10637.5 \n", - " AAPL 13 6805.5 \n", - " MSFT 14 6545.0 \n", - " AMZN 3 1380.0 \n", - " NVDA 18 8190.0 \n", - "2023-07-07 TSLA 23 10235.0 \n", - " AAPL 13 6474.0 \n", - " MSFT 14 6335.0 \n", - " AMZN 3 1485.0 \n", - " NVDA 18 8145.0 \n", - "2023-07-10 TSLA 23 10235.0 \n", - " AAPL 13 5759.0 \n", - " MSFT 14 5950.0 \n", - " AMZN 3 1350.0 \n", - " NVDA 18 7560.0 \n", - "2023-07-11 TSLA 23 9832.5 \n", - " AAPL 13 5622.5 \n", - " MSFT 14 5950.0 \n", - " AMZN 3 1410.0 \n", - " NVDA 18 8055.0 \n", - "2023-07-12 TSLA 23 10120.0 \n", - " AAPL 13 5921.5 \n", - " MSFT 14 6370.0 \n", - " AMZN 3 1500.0 \n", - " NVDA 18 8190.0 \n", - "2023-07-13 TSLA 23 10867.5 \n", - " AAPL 13 6058.0 \n", - " MSFT 14 6160.0 \n", - " AMZN 3 1635.0 \n", - " NVDA 18 7335.0 \n", - "2023-07-14 TSLA 23 10982.5 \n", - " AAPL 13 6077.5 \n", - " MSFT 14 5880.0 \n", - " AMZN 3 1642.5 \n", - " NVDA 18 9810.0 \n", - "2023-07-17 TSLA 23 12420.0 \n", - " AAPL 13 7026.5 \n", - " MSFT 14 6090.0 \n", - " AMZN 3 1567.5 \n", - " NVDA 18 7380.0 \n", - "2023-07-18 TSLA 23 11960.0 \n", - " AAPL 13 6896.5 \n", - " MSFT 14 7525.0 \n", - " AMZN 3 1567.5 \n", - " NVDA 18 8550.0 \n", - "2023-07-19 TSLA 23 13800.0 \n", - " AAPL 13 7527.0 \n", - " MSFT 14 7420.0 \n", - " AMZN 3 1665.0 \n", - " NVDA 18 8325.0 \n", - "2023-07-20 TSLA 23 9430.0 \n", - " AAPL 13 7059.0 \n", - " MSFT 14 6615.0 \n", - " AMZN 3 1425.0 \n", - " NVDA 18 8370.0 \n", - "2023-07-21 TSLA 23 8912.5 \n", - " AAPL 13 6597.5 \n", - " MSFT 14 7140.0 \n", - " AMZN 3 1417.5 \n", - " NVDA 18 7875.0 \n", - "2023-07-24 TSLA 23 9142.5 \n", - " AAPL 13 6773.0 \n", - " MSFT 14 6965.0 \n", - " AMZN 3 1365.0 \n", - " NVDA 18 9360.0 \n", - "2023-07-25 TSLA 23 9430.0 \n", - " AAPL 13 7033.0 \n", - " MSFT 14 7245.0 \n", - " AMZN 3 1357.5 \n", - " NVDA 18 8820.0 \n", - "2023-07-26 TSLA 23 8567.5 \n", - " AAPL 13 7254.0 \n", - " MSFT 14 6090.0 \n", - " AMZN 3 1327.5 \n", - " NVDA 18 5400.0 \n", - "2023-07-27 TSLA 23 8452.5 \n", - " AAPL 13 7104.5 \n", - " MSFT 14 5600.0 \n", - " AMZN 3 1335.0 \n", - " NVDA 18 8145.0 \n", - "2023-07-28 TSLA 23 9602.5 \n", - " AAPL 13 7780.5 \n", - " MSFT 14 5600.0 \n", - " AMZN 3 1455.0 \n", - " NVDA 18 9135.0 \n", - "2023-07-31 TSLA 23 9372.5 \n", - " AAPL 13 8216.0 \n", - " MSFT 14 5950.0 \n", - " AMZN 3 1560.0 \n", - " NVDA 18 12465.0 \n", - "2023-08-01 TSLA 23 8970.0 \n", - " AAPL 13 7871.5 \n", - " MSFT 14 5915.0 \n", - " AMZN 3 1485.0 \n", - " NVDA 18 9225.0 \n", - "2023-08-02 AAPL 13 7176.0 \n", - " MSFT 14 5425.0 \n", - " AMZN 3 1335.0 \n", - " NVDA 18 11565.0 \n", - "2023-08-03 AAPL 13 6838.0 \n", - " MSFT 14 5320.0 \n", - " AMZN 3 1365.0 \n", - " NVDA 18 9900.0 \n", - "2023-08-04 MSFT 14 5425.0 \n", - " AMZN 3 1807.5 \n", - " NVDA 18 4815.0 \n", - "2023-08-07 MSFT 14 5040.0 \n", - " AMZN 3 1912.5 \n", - " NVDA 18 8550.0 \n", - "2023-08-08 MSFT 14 5355.0 \n", - " AMZN 3 1822.5 \n", - " NVDA 18 8640.0 \n", - "2023-08-09 AMZN 3 1725.0 \n", - " NVDA 18 9000.0 \n", - "2023-08-10 AMZN 3 1762.5 \n", - " NVDA 18 6975.0 \n", - " BA 3 1327.5 \n", - " WMT 0 0.0 \n", - "2023-08-11 AMZN 3 1762.5 \n", - " NVDA 18 7110.0 \n", - " BA 3 1290.0 \n", - " WMT 0 0.0 \n", - "2023-08-14 AMZN 3 1860.0 \n", - " NVDA 18 7830.0 \n", - " BA 3 1327.5 \n", - " WMT 0 0.0 \n", - "2023-08-15 AMZN 3 1807.5 \n", - " NVDA 18 8100.0 \n", - " BA 3 1222.5 \n", - " WMT 0 0.0 \n", - "2023-08-16 AMZN 3 1620.0 \n", - " NVDA 18 7470.0 \n", - " BA 3 1132.5 \n", - " WMT 0 0.0 \n", - "2023-08-17 TSLA 20 9450.0 \n", - " AMZN 3 1560.0 \n", - " NVDA 18 7605.0 \n", - "2023-08-18 TSLA 20 9050.0 \n", - " AMZN 3 1545.0 \n", - " NVDA 18 7740.0 \n", - "2023-08-21 TSLA 20 11250.0 \n", - " AMZN 3 1605.0 \n", - " NVDA 18 8010.0 \n", - "2023-08-22 TSLA 20 11500.0 \n", - " AMZN 3 1590.0 \n", - " NVDA 18 8145.0 \n", - "2023-08-23 TSLA 20 11900.0 \n", - " AMZN 3 1635.0 \n", - " NVDA 18 8685.0 \n", - "2023-08-24 TSLA 20 11150.0 \n", - " AMZN 3 1485.0 \n", - " NVDA 18 8595.0 \n", - "2023-08-25 TSLA 20 12050.0 \n", - " AMZN 3 1530.0 \n", - " NVDA 18 8595.0 \n", - "2023-08-28 TSLA 20 12250.0 \n", - " AMZN 3 1537.5 \n", - " NVDA 18 8955.0 \n", - "2023-08-29 TSLA 20 14150.0 \n", - " AMZN 3 1605.0 \n", - " NVDA 18 9405.0 \n", - "2023-08-30 TSLA 20 14100.0 \n", - " AMZN 3 1597.5 \n", - " NVDA 18 9045.0 \n", - "2023-08-31 TSLA 20 14200.0 \n", - " AAPL 14 7000.0 \n", - " AMZN 3 1740.0 \n", - " NVDA 18 10440.0 \n", - "2023-09-01 TSLA 20 12700.0 \n", - " AAPL 14 7315.0 \n", - " AMZN 3 1740.0 \n", - " NVDA 18 9135.0 \n", - "2023-09-04 TSLA 20 13900.0 \n", - " AAPL 14 7280.0 \n", - " AMZN 3 1702.5 \n", - " NVDA 18 10395.0 \n", - "2023-09-05 TSLA 20 13900.0 \n", - " AAPL 14 7280.0 \n", - " AMZN 3 1702.5 \n", - " NVDA 18 10395.0 \n", - "2023-09-06 TSLA 20 13500.0 \n", - " AAPL 14 6265.0 \n", - " AMZN 3 1612.5 \n", - " NVDA 18 9225.0 \n", - "2023-09-07 TSLA 20 13400.0 \n", - " AMZN 3 1725.0 \n", - " NVDA 18 8910.0 \n", - "2023-09-08 TSLA 20 13100.0 \n", - " AMZN 3 1747.5 \n", - " NVDA 18 8685.0 \n", - "2023-09-11 TSLA 20 15800.0 \n", - " AMZN 3 1965.0 \n", - " NVDA 18 8415.0 \n", - "2023-09-12 TSLA 20 15100.0 \n", - " AMZN 3 1882.5 \n", - " NVDA 18 8145.0 \n", - "2023-09-13 TSLA 20 15500.0 \n", - " AMZN 3 2055.0 \n", - " NVDA 18 8550.0 \n", - " WMT 0 0.0 \n", - "2023-09-14 TSLA 20 16200.0 \n", - " AMZN 3 2025.0 \n", - " NVDA 18 8460.0 \n", - " WMT 0 0.0 \n", - "2023-09-15 TSLA 20 16000.0 \n", - " AMZN 3 1830.0 \n", - " NVDA 18 8100.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - "2023-09-18 TSLA 20 14950.0 \n", - " AMZN 3 1680.0 \n", - " NVDA 18 7155.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - "2023-09-19 TSLA 20 15000.0 \n", - " AMZN 3 1597.5 \n", - " NVDA 18 8055.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - "2023-09-20 TSLA 20 14600.0 \n", - " AMZN 3 1590.0 \n", - " NVDA 18 7740.0 \n", - " WMT 0 0.0 \n", - "2023-09-21 TSLA 20 14200.0 \n", - " AMZN 3 1327.5 \n", - " NVDA 18 7020.0 \n", - " WMT 0 0.0 \n", - "2023-09-22 TSLA 20 12750.0 \n", - " AMZN 3 1312.5 \n", - " NVDA 18 7245.0 \n", - " WMT 0 0.0 \n", - "2023-09-25 TSLA 20 14200.0 \n", - " AMZN 3 1417.5 \n", - " NVDA 18 7605.0 \n", - " WMT 0 0.0 \n", - "2023-09-26 TSLA 20 12700.0 \n", - " AMZN 3 1200.0 \n", - " NVDA 18 7110.0 \n", - " WMT 0 0.0 \n", - "2023-09-27 TSLA 20 12250.0 \n", - " AMZN 3 1192.5 \n", - " NVDA 18 7425.0 \n", - " WMT 0 0.0 \n", - "2023-09-28 TSLA 20 12900.0 \n", - " AMZN 3 1177.5 \n", - " NVDA 18 7650.0 \n", - " WMT 0 0.0 \n", - "2023-09-29 TSLA 20 13550.0 \n", - " AMZN 3 1230.0 \n", - " NVDA 18 7785.0 \n", - "2023-10-02 TSLA 20 13450.0 \n", - " AMZN 3 1335.0 \n", - " NVDA 18 8235.0 \n", - "2023-10-03 TSLA 20 12900.0 \n", - " AMZN 3 1155.0 \n", - " NVDA 18 7830.0 \n", - "2023-10-04 TSLA 20 19150.0 \n", - " AMZN 3 1230.0 \n", - " NVDA 18 8010.0 \n", - "2023-10-05 TSLA 20 14550.0 \n", - " AMZN 3 1192.5 \n", - " NVDA 18 8280.0 \n", - "2023-10-06 TSLA 20 14500.0 \n", - " AMZN 3 1275.0 \n", - " NVDA 18 8775.0 \n", - "2023-10-09 TSLA 20 14500.0 \n", - " AMZN 3 1290.0 \n", - " NVDA 18 8460.0 \n", - "2023-10-10 TSLA 20 15000.0 \n", - " AMZN 3 1335.0 \n", - " NVDA 18 8730.0 \n", - "2023-10-11 TSLA 20 14950.0 \n", - " AMZN 3 1440.0 \n", - " NVDA 18 9225.0 \n", - "2023-10-12 TSLA 20 14450.0 \n", - " AMZN 3 1462.5 \n", - " NVDA 18 9225.0 \n", - "2023-10-13 TSLA 20 13650.0 \n", - " AMZN 3 1372.5 \n", - " NVDA 18 8820.0 \n", - "2023-10-16 TSLA 20 14000.0 \n", - " AMZN 3 1470.0 \n", - " NVDA 18 8955.0 \n", - "2023-10-17 TSLA 20 14100.0 \n", - " AMZN 3 1447.5 \n", - " NVDA 18 8010.0 \n", - "2023-10-18 TSLA 20 12650.0 \n", - " AMZN 3 1155.0 \n", - " NVDA 18 7380.0 \n", - "2023-10-19 TSLA 20 9700.0 \n", - " AMZN 3 1305.0 \n", - " NVDA 18 7380.0 \n", - "2023-10-20 AMZN 3 1162.5 \n", - " NVDA 18 6975.0 \n", - "2023-10-23 AMZN 3 1215.0 \n", - " NVDA 18 7785.0 \n", - "2023-10-24 AMZN 3 1327.5 \n", - " NVDA 18 8145.0 \n", - "2023-10-25 NVDA 18 9855.0 \n", - "2023-10-26 NVDA 18 6615.0 \n", - "2023-10-27 NVDA 18 6570.0 \n", - "2023-10-30 NVDA 18 7020.0 \n", - "2023-10-31 NVDA 18 6795.0 \n", - "2023-11-01 NVDA 18 7830.0 \n", - "2023-11-02 NVDA 18 7875.0 \n", - "2023-11-03 NVDA 18 8640.0 \n", - "2023-11-06 NVDA 18 9540.0 \n", - "2023-11-07 NVDA 18 9045.0 \n", - "2023-11-08 NVDA 18 9270.0 \n", - "2023-11-09 NVDA 18 9720.0 \n", - "2023-11-10 NVDA 18 10125.0 \n", - "2023-11-13 NVDA 18 10575.0 \n", - " QCOM 4 1570.0 \n", - "2023-11-14 MSFT 12 5460.0 \n", - " NVDA 18 11205.0 \n", - " QCOM 4 1730.0 \n", - "2023-11-15 MSFT 12 5580.0 \n", - " NVDA 18 11025.0 \n", - " QCOM 4 1770.0 \n", - " SBUX 12 5100.0 \n", - " AMD 4 1970.0 \n", - "2023-11-16 MSFT 12 4830.0 \n", - " NVDA 18 11160.0 \n", - " QCOM 4 1630.0 \n", - " SBUX 12 5130.0 \n", - " AMD 4 2020.0 \n", - " MU 1 462.5 \n", - "2023-11-17 MSFT 12 5850.0 \n", - " NVDA 18 8955.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 1790.0 \n", - " SBUX 12 5010.0 \n", - " AMD 4 2060.0 \n", - " MU 1 480.0 \n", - " DIS 3 1462.5 \n", - "2023-11-20 MSFT 12 6540.0 \n", - " NVDA 18 9990.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 1780.0 \n", - " SBUX 12 4680.0 \n", - " AMD 4 2100.0 \n", - " MU 1 500.0 \n", - " DIS 3 1515.0 \n", - "2023-11-21 MSFT 12 6870.0 \n", - " NVDA 18 12285.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 1680.0 \n", - " SBUX 12 4500.0 \n", - " AMD 4 1990.0 \n", - " MU 1 480.0 \n", - " DIS 3 1470.0 \n", - "2023-11-22 AAPL 13 6337.5 \n", - " MSFT 12 4890.0 \n", - " NVDA 18 10350.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 1690.0 \n", - " SBUX 12 4500.0 \n", - " AMD 4 2100.0 \n", - " MU 1 470.0 \n", - " DIS 3 1515.0 \n", - "2023-11-23 AAPL 13 6110.0 \n", - " MSFT 12 6180.0 \n", - " NVDA 18 10125.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 1780.0 \n", - " SBUX 12 4380.0 \n", - " AMD 4 2130.0 \n", - " MU 1 462.5 \n", - " DIS 3 1582.5 \n", - "2023-11-24 AAPL 13 6110.0 \n", - " MSFT 12 6180.0 \n", - " NVDA 18 10125.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 1780.0 \n", - " SBUX 12 4380.0 \n", - " AMD 4 2130.0 \n", - " MU 1 462.5 \n", - " DIS 3 1582.5 \n", - "2023-11-27 AAPL 13 6142.5 \n", - " MSFT 12 5910.0 \n", - " NVDA 18 11250.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 1820.0 \n", - " SBUX 12 4320.0 \n", - " AMD 4 2160.0 \n", - " MU 1 482.5 \n", - " DIS 3 1530.0 \n", - "2023-11-28 AAPL 13 6175.0 \n", - " MSFT 12 5700.0 \n", - " NVDA 18 10395.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 1770.0 \n", - " SBUX 12 3930.0 \n", - " AMD 4 2120.0 \n", - " MU 1 445.0 \n", - " DIS 3 1318.5 \n", - "2023-11-29 AAPL 13 5980.0 \n", - " MSFT 12 5910.0 \n", - " NVDA 18 10305.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 1730.0 \n", - " AMD 4 2200.0 \n", - " MU 1 472.5 \n", - " DIS 3 1299.0 \n", - "2023-11-30 AAPL 13 6045.0 \n", - " MSFT 12 4380.0 \n", - " NVDA 18 10170.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 1820.0 \n", - " AMD 4 2080.0 \n", - " MU 1 505.0 \n", - " DIS 3 1312.5 \n", - "2023-12-01 AAPL 13 6240.0 \n", - " MSFT 12 4680.0 \n", - " NVDA 18 10350.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 1850.0 \n", - " AMD 4 2060.0 \n", - " MU 1 452.5 \n", - " DIS 3 1275.0 \n", - " BAC 9 3573.0 \n", - "2023-12-04 AAPL 13 5980.0 \n", - " MSFT 12 3720.0 \n", - " NVDA 18 9225.0 \n", - " HD 4 1940.0 \n", - " BA 3 1275.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 1830.0 \n", - " AMD 4 1950.0 \n", - " MU 1 415.0 \n", - " DIS 3 1230.0 \n", - " BAC 9 3514.5 \n", - "2023-12-05 AAPL 13 6630.0 \n", - " MSFT 12 5280.0 \n", - " NVDA 18 9855.0 \n", - " HD 4 1370.0 \n", - " BA 3 1312.5 \n", - " INTC 0 0.0 \n", - " QCOM 4 1650.0 \n", - " AMD 4 1940.0 \n", - " MU 1 405.0 \n", - " DIS 3 1150.5 \n", - " BAC 9 3402.0 \n", - "2023-12-06 AAPL 13 6435.0 \n", - " MSFT 12 5370.0 \n", - " NVDA 18 9990.0 \n", - " HD 4 1700.0 \n", - " BA 3 1297.5 \n", - " INTC 0 0.0 \n", - " QCOM 4 1890.0 \n", - " AMD 4 1850.0 \n", - " MU 1 397.5 \n", - " DIS 3 1186.5 \n", - " BAC 9 3343.5 \n", - "2023-12-07 AAPL 13 6695.0 \n", - " MSFT 12 4110.0 \n", - " NVDA 18 9765.0 \n", - " HD 4 1890.0 \n", - " BA 3 892.5 \n", - " INTC 0 0.0 \n", - " QCOM 4 1960.0 \n", - " AMD 4 2280.0 \n", - " MU 1 402.5 \n", - " DIS 3 1249.5 \n", - " BAC 9 3420.0 \n", - "2023-12-08 AAPL 13 7052.5 \n", - " MSFT 12 4800.0 \n", - " NVDA 18 10485.0 \n", - " HD 4 1910.0 \n", - " BA 3 1455.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2020.0 \n", - " AMD 4 2420.0 \n", - " MU 1 425.0 \n", - " DIS 3 1302.0 \n", - " BAC 9 3573.0 \n", - "2023-12-11 AAPL 13 6500.0 \n", - " MSFT 12 7410.0 \n", - " NVDA 18 9225.0 \n", - " HD 4 1920.0 \n", - " BA 3 1515.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2060.0 \n", - " AMD 4 2650.0 \n", - " MU 1 480.0 \n", - " DIS 3 1249.5 \n", - " BAC 9 3505.5 \n", - "2023-12-12 AAPL 13 6760.0 \n", - " MSFT 12 5040.0 \n", - " NVDA 18 11070.0 \n", - " HD 4 1990.0 \n", - " BA 3 1477.5 \n", - " INTC 0 0.0 \n", - " QCOM 4 1870.0 \n", - " AMD 4 3000.0 \n", - " MU 1 507.5 \n", - " DIS 3 1168.5 \n", - " BAC 9 3411.0 \n", - "2023-12-13 AAPL 13 7215.0 \n", - " MSFT 12 5010.0 \n", - " NVDA 18 10665.0 \n", - " HD 4 2200.0 \n", - " BA 3 1560.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2310.0 \n", - " AMD 4 2830.0 \n", - " MU 1 525.0 \n", - " DIS 3 1275.0 \n", - " BAC 9 4072.5 \n", - "2023-12-14 AAPL 13 7280.0 \n", - " MSFT 12 4920.0 \n", - " NVDA 18 10575.0 \n", - " HD 4 2230.0 \n", - " BA 3 1620.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2400.0 \n", - " AMD 4 2820.0 \n", - " MU 1 562.5 \n", - " DIS 3 1357.5 \n", - " BAC 9 5112.0 \n", - "2023-12-15 AAPL 13 6695.0 \n", - " MSFT 12 3930.0 \n", - " NVDA 18 11835.0 \n", - " HD 4 2620.0 \n", - " BA 3 1650.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2070.0 \n", - " AMD 4 2900.0 \n", - " MU 1 547.5 \n", - " DIS 3 1329.0 \n", - " BAC 9 4914.0 \n", - "2023-12-18 AAPL 13 6857.5 \n", - " MSFT 12 3870.0 \n", - " NVDA 18 11565.0 \n", - " HD 4 2330.0 \n", - " BA 3 1687.5 \n", - " INTC 0 0.0 \n", - " QCOM 4 2210.0 \n", - " AMD 4 2890.0 \n", - " MU 1 540.0 \n", - " DIS 3 1308.0 \n", - " BAC 9 4833.0 \n", - "2023-12-19 AAPL 13 6987.5 \n", - " MSFT 12 4800.0 \n", - " NVDA 18 11025.0 \n", - " HD 4 2320.0 \n", - " BA 3 1710.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2300.0 \n", - " AMD 4 2940.0 \n", - " MU 1 567.5 \n", - " DIS 3 1353.0 \n", - " BAC 9 4882.5 \n", - "2023-12-20 AAPL 13 6630.0 \n", - " MSFT 12 3690.0 \n", - " NVDA 18 11520.0 \n", - " HD 4 2340.0 \n", - " BA 3 1732.5 \n", - " INTC 0 0.0 \n", - " QCOM 4 2180.0 \n", - " AMD 4 2730.0 \n", - " MU 1 472.5 \n", - " DIS 3 1177.5 \n", - " BAC 9 4581.0 \n", - "2023-12-21 AAPL 13 6565.0 \n", - " MSFT 12 5430.0 \n", - " NVDA 18 10980.0 \n", - " HD 4 2400.0 \n", - " BA 3 1312.5 \n", - " INTC 0 0.0 \n", - " QCOM 4 2570.0 \n", - " AMD 4 2980.0 \n", - " MU 1 615.0 \n", - " DIS 3 1207.5 \n", - " BAC 9 4711.5 \n", - "2023-12-22 AAPL 13 5297.5 \n", - " MSFT 12 4620.0 \n", - " NVDA 18 10170.0 \n", - " HD 4 2260.0 \n", - " BA 3 1687.5 \n", - " INTC 0 0.0 \n", - " QCOM 4 2330.0 \n", - " AMD 4 2940.0 \n", - " MU 1 630.0 \n", - " DIS 3 1137.0 \n", - " BAC 9 4806.0 \n", - "2023-12-25 AAPL 13 6272.5 \n", - " MSFT 12 5400.0 \n", - " NVDA 18 11205.0 \n", - " HD 4 2240.0 \n", - " BA 3 1672.5 \n", - " INTC 0 0.0 \n", - " QCOM 4 2270.0 \n", - " AMD 4 3120.0 \n", - " MU 1 647.5 \n", - " DIS 3 1131.0 \n", - " BAC 9 5071.5 \n", - "2023-12-26 AAPL 13 6272.5 \n", - " MSFT 12 5400.0 \n", - " NVDA 18 11205.0 \n", - " HD 4 2240.0 \n", - " BA 3 1672.5 \n", - " INTC 0 0.0 \n", - " QCOM 4 2270.0 \n", - " AMD 4 3120.0 \n", - " MU 1 647.5 \n", - " DIS 3 1131.0 \n", - " BAC 9 5071.5 \n", - "2023-12-27 AAPL 13 6240.0 \n", - " MSFT 12 4770.0 \n", - " NVDA 18 11610.0 \n", - " HD 4 2400.0 \n", - " BA 3 1710.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2310.0 \n", - " AMD 4 3180.0 \n", - " MU 1 640.0 \n", - " DIS 3 1080.0 \n", - " BAC 9 5040.0 \n", - "2023-12-28 AAPL 13 6337.5 \n", - " MSFT 12 4260.0 \n", - " NVDA 18 11520.0 \n", - " HD 4 2290.0 \n", - " BA 3 1777.5 \n", - " INTC 0 0.0 \n", - " QCOM 4 2400.0 \n", - " AMD 4 3330.0 \n", - " MU 1 625.0 \n", - " DIS 3 1075.5 \n", - " BAC 9 5058.0 \n", - "2023-12-29 AAPL 13 5232.5 \n", - " MSFT 12 4800.0 \n", - " NVDA 18 11610.0 \n", - " HD 4 2620.0 \n", - " BA 3 1657.5 \n", - " INTC 0 0.0 \n", - " QCOM 4 2300.0 \n", - " AMD 4 3330.0 \n", - " MU 1 612.5 \n", - " DIS 3 1066.5 \n", - " BAC 9 4909.5 \n", - "2024-01-01 AAPL 13 4842.5 \n", - " MSFT 12 5160.0 \n", - " NVDA 18 10845.0 \n", - " HD 4 2050.0 \n", - " BA 3 1627.5 \n", - " INTC 0 0.0 \n", - " QCOM 4 1950.0 \n", - " AMD 4 2870.0 \n", - " MU 1 600.0 \n", - " DIS 3 1095.0 \n", - " BAC 9 4959.0 \n", - "2024-01-02 AAPL 13 4842.5 \n", - " MSFT 12 5160.0 \n", - " NVDA 18 10845.0 \n", - " HD 4 2050.0 \n", - " BA 3 1627.5 \n", - " INTC 0 0.0 \n", - " QCOM 4 1950.0 \n", - " AMD 4 2870.0 \n", - " MU 1 600.0 \n", - " DIS 3 1095.0 \n", - " BAC 9 4959.0 \n", - "2024-01-03 AAPL 13 4582.5 \n", - " MSFT 12 5370.0 \n", - " NVDA 18 10350.0 \n", - " HD 4 1940.0 \n", - " BA 3 1402.5 \n", - " INTC 0 0.0 \n", - " QCOM 4 1810.0 \n", - " AMD 4 2620.0 \n", - " MU 1 557.5 \n", - " DIS 3 1173.0 \n", - " BAC 9 4864.5 \n", - "2024-01-04 MSFT 12 4650.0 \n", - " NVDA 18 10890.0 \n", - " HD 4 1950.0 \n", - " BA 3 1335.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2100.0 \n", - " AMD 4 2690.0 \n", - " MU 1 565.0 \n", - " DIS 3 1089.0 \n", - " BAC 9 4990.5 \n", - "2024-01-05 MSFT 12 4560.0 \n", - " NVDA 18 11880.0 \n", - " HD 4 2450.0 \n", - " BA 3 1485.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2200.0 \n", - " AMD 4 2890.0 \n", - " MU 1 595.0 \n", - " DIS 3 1101.0 \n", - " BAC 9 5332.5 \n", - "2024-01-08 MSFT 12 5130.0 \n", - " NVDA 18 13050.0 \n", - " HD 4 2180.0 \n", - " BA 3 1207.5 \n", - " INTC 0 0.0 \n", - " QCOM 4 1730.0 \n", - " AMD 4 3250.0 \n", - " MU 1 607.5 \n", - " DIS 3 1107.0 \n", - " BAC 9 5098.5 \n", - "2024-01-09 MSFT 12 5160.0 \n", - " NVDA 18 12645.0 \n", - " HD 4 2570.0 \n", - " BA 3 1177.5 \n", - " INTC 0 0.0 \n", - " QCOM 4 2010.0 \n", - " AMD 4 2950.0 \n", - " MU 1 575.0 \n", - " DIS 3 994.5 \n", - " BAC 9 4873.5 \n", - "2024-01-10 MSFT 12 5910.0 \n", - " NVDA 18 13185.0 \n", - " HD 4 2230.0 \n", - " BA 3 1230.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2170.0 \n", - " AMD 4 3610.0 \n", - " MU 1 552.5 \n", - " BAC 9 4851.0 \n", - "2024-01-11 MSFT 12 5940.0 \n", - " NVDA 18 13500.0 \n", - " HD 4 2210.0 \n", - " BA 3 1042.5 \n", - " INTC 0 0.0 \n", - " QCOM 4 2070.0 \n", - " AMD 4 3310.0 \n", - " MU 1 575.0 \n", - " BAC 9 4545.0 \n", - "2024-01-12 MSFT 12 6270.0 \n", - " NVDA 18 13365.0 \n", - " HD 4 2410.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2050.0 \n", - " AMD 4 3190.0 \n", - " MU 1 552.5 \n", - " BAC 9 4333.5 \n", - "2024-01-15 MSFT 12 6390.0 \n", - " NVDA 18 14310.0 \n", - " HD 4 2650.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 1800.0 \n", - " AMD 4 3630.0 \n", - " MU 1 605.0 \n", - " BAC 9 3960.0 \n", - "2024-01-16 MSFT 12 6390.0 \n", - " NVDA 18 14310.0 \n", - " HD 4 2650.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 1800.0 \n", - " AMD 4 3630.0 \n", - " MU 1 605.0 \n", - " BAC 9 3960.0 \n", - "2024-01-17 MSFT 12 5280.0 \n", - " NVDA 18 14625.0 \n", - " HD 4 2420.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2070.0 \n", - " AMD 4 3790.0 \n", - " MU 1 605.0 \n", - " BAC 9 3798.0 \n", - "2024-01-18 MSFT 12 6510.0 \n", - " NVDA 18 15030.0 \n", - " HD 4 2460.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2360.0 \n", - " AMD 4 3800.0 \n", - " MU 1 600.0 \n", - " BAC 9 3739.5 \n", - "2024-01-19 MSFT 12 7170.0 \n", - " NVDA 18 15120.0 \n", - " HD 4 2360.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2070.0 \n", - " AMD 4 4040.0 \n", - " MU 1 615.0 \n", - " BAC 9 3987.0 \n", - "2024-01-22 MSFT 12 6780.0 \n", - " NVDA 18 15210.0 \n", - " HD 4 2560.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2460.0 \n", - " AMD 4 4030.0 \n", - " MU 1 712.5 \n", - " BAC 9 4149.0 \n", - "2024-01-23 MSFT 12 6120.0 \n", - " NVDA 18 15840.0 \n", - " HD 4 2480.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2720.0 \n", - " AMD 4 3860.0 \n", - " MU 1 652.5 \n", - " BAC 9 4293.0 \n", - "2024-01-24 MSFT 12 8790.0 \n", - " NVDA 18 15255.0 \n", - " HD 4 1730.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2750.0 \n", - " AMD 4 3960.0 \n", - " MU 1 662.5 \n", - " BAC 9 4351.5 \n", - "2024-01-25 MSFT 12 7980.0 \n", - " NVDA 18 16020.0 \n", - " HD 4 2100.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2700.0 \n", - " AMD 4 4500.0 \n", - " MU 1 667.5 \n", - " BAC 9 4603.5 \n", - "2024-01-26 MSFT 12 8430.0 \n", - " NVDA 18 15390.0 \n", - " HD 4 2250.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2710.0 \n", - " AMD 4 4320.0 \n", - " MU 1 660.0 \n", - " BAC 9 4648.5 \n", - " GOOG 8 3960.0 \n", - "2024-01-29 MSFT 12 9540.0 \n", - " NVDA 18 15705.0 \n", - " HD 4 2120.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2250.0 \n", - " AMD 4 4390.0 \n", - " MU 1 682.5 \n", - " BAC 9 4729.5 \n", - " GOOG 8 4580.0 \n", - "2024-01-30 MSFT 12 9570.0 \n", - " NVDA 18 15750.0 \n", - " HD 4 2340.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2270.0 \n", - " AMD 4 4280.0 \n", - " MU 1 587.5 \n", - " BAC 9 5323.5 \n", - " GOOG 8 3360.0 \n", - "2024-01-31 MSFT 12 6930.0 \n", - " NVDA 18 15525.0 \n", - " HD 4 2150.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2930.0 \n", - " AMD 4 4000.0 \n", - " MU 1 615.0 \n", - " BAC 9 4666.5 \n", - "2024-02-01 MSFT 12 7290.0 \n", - " NVDA 18 15390.0 \n", - " HD 4 2460.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2300.0 \n", - " AMD 4 4170.0 \n", - " MU 1 572.5 \n", - " BAC 9 4765.5 \n", - "2024-02-02 MSFT 12 8130.0 \n", - " NVDA 18 16740.0 \n", - " HD 4 2500.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2240.0 \n", - " AMD 4 4330.0 \n", - " MU 1 637.5 \n", - " BAC 9 4738.5 \n", - "2024-02-05 MSFT 12 7530.0 \n", - " NVDA 18 17055.0 \n", - " HD 4 2320.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2480.0 \n", - " AMD 4 4440.0 \n", - " MU 1 647.5 \n", - " BAC 9 4437.0 \n", - "2024-02-06 MSFT 12 8640.0 \n", - " NVDA 18 15795.0 \n", - " HD 4 2390.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2170.0 \n", - " AMD 4 4100.0 \n", - " MU 1 595.0 \n", - " BAC 9 4441.5 \n", - "2024-02-07 MSFT 12 8670.0 \n", - " NVDA 18 16695.0 \n", - " HD 4 2490.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2400.0 \n", - " AMD 4 4200.0 \n", - " MU 1 607.5 \n", - " DIS 2 985.0 \n", - " BAC 9 4522.5 \n", - "2024-02-08 MSFT 12 8430.0 \n", - " AMZN 3 1492.5 \n", - " NVDA 18 16200.0 \n", - " HD 4 2410.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2580.0 \n", - " AMD 4 4270.0 \n", - " MU 1 595.0 \n", - " DIS 2 1525.0 \n", - " BAC 9 4486.5 \n", - "2024-02-09 MSFT 12 8310.0 \n", - " AMZN 3 1702.5 \n", - " NVDA 18 18045.0 \n", - " HD 4 2490.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2350.0 \n", - " AMD 4 4490.0 \n", - " MU 1 562.5 \n", - " DIS 2 1417.0 \n", - " BAC 9 4446.0 \n", - "2024-02-12 MSFT 12 8490.0 \n", - " AMZN 3 1612.5 \n", - " NVDA 18 16650.0 \n", - " HD 4 2560.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2570.0 \n", - " AMD 4 4310.0 \n", - " MU 1 615.0 \n", - " DIS 2 1452.0 \n", - " BAC 9 4702.5 \n", - "2024-02-13 MSFT 12 7980.0 \n", - " AMZN 3 1455.0 \n", - " NVDA 18 15975.0 \n", - " HD 4 2360.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2570.0 \n", - " AMD 4 4230.0 \n", - " MU 1 542.5 \n", - " DIS 2 1525.0 \n", - " BAC 9 4270.5 \n", - "2024-02-14 MSFT 12 7470.0 \n", - " AMZN 3 1545.0 \n", - " NVDA 18 16290.0 \n", - " HD 4 2360.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2750.0 \n", - " AMD 4 4310.0 \n", - " MU 1 537.5 \n", - " DIS 2 1585.0 \n", - " BAC 9 4477.5 \n", - "2024-02-15 MSFT 12 7650.0 \n", - " AMZN 3 1485.0 \n", - " NVDA 18 17010.0 \n", - " HD 4 2540.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2630.0 \n", - " AMD 4 4490.0 \n", - " MU 1 530.0 \n", - " DIS 2 1645.0 \n", - " BAC 9 5022.0 \n", - "2024-02-16 MSFT 12 7110.0 \n", - " AMZN 3 1500.0 \n", - " NVDA 18 16515.0 \n", - " HD 4 2850.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2800.0 \n", - " AMD 4 4240.0 \n", - " MU 1 487.5 \n", - " DIS 2 1580.0 \n", - " BAC 9 5031.0 \n", - "2024-02-19 MSFT 12 7350.0 \n", - " AMZN 3 1372.5 \n", - " NVDA 18 15435.0 \n", - " HD 4 2470.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2590.0 \n", - " AMD 4 3940.0 \n", - " MU 1 510.0 \n", - " DIS 2 1450.0 \n", - " BAC 9 4963.5 \n", - "2024-02-20 MSFT 12 7350.0 \n", - " AMZN 3 1372.5 \n", - " NVDA 18 15435.0 \n", - " HD 4 2470.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2590.0 \n", - " AMD 4 3940.0 \n", - " MU 1 510.0 \n", - " DIS 2 1450.0 \n", - " BAC 9 4963.5 \n", - "2024-02-21 MSFT 12 7260.0 \n", - " AMZN 3 1432.5 \n", - " NVDA 18 16245.0 \n", - " HD 4 2830.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2370.0 \n", - " AMD 4 3790.0 \n", - " MU 1 517.5 \n", - " DIS 2 1318.0 \n", - " BAC 9 4833.0 \n", - "2024-02-22 MSFT 12 8130.0 \n", - " AMZN 3 1710.0 \n", - " NVDA 18 18945.0 \n", - " HD 4 2990.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2570.0 \n", - " AMD 4 4530.0 \n", - " MU 1 605.0 \n", - " DIS 2 1315.0 \n", - " BAC 9 4738.5 \n", - "2024-02-23 MSFT 12 8040.0 \n", - " AMZN 3 1717.5 \n", - " NVDA 18 16650.0 \n", - " HD 4 2720.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2290.0 \n", - " AMD 4 4300.0 \n", - " MU 1 610.0 \n", - " DIS 2 1318.0 \n", - " BAC 9 4914.0 \n", - "2024-02-26 MSFT 12 7740.0 \n", - " AMZN 3 1717.5 \n", - " NVDA 18 15615.0 \n", - " HD 4 2550.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2640.0 \n", - " AMD 4 4270.0 \n", - " MU 1 662.5 \n", - " DIS 2 1408.0 \n", - " BAC 9 4725.0 \n", - "2024-02-27 MSFT 12 7680.0 \n", - " AMZN 3 1642.5 \n", - " NVDA 18 17640.0 \n", - " HD 4 2740.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2520.0 \n", - " AMD 4 4790.0 \n", - " MU 1 710.0 \n", - " DIS 2 1421.0 \n", - " BAC 9 5098.5 \n", - "2024-02-28 MSFT 12 7740.0 \n", - " AMZN 3 1627.5 \n", - " NVDA 18 17280.0 \n", - " HD 4 2780.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2780.0 \n", - " AMD 4 4480.0 \n", - " MU 1 647.5 \n", - " DIS 2 1520.0 \n", - " BAC 9 5125.5 \n", - "2024-02-29 MSFT 12 8310.0 \n", - " AMZN 3 1747.5 \n", - " NVDA 18 17685.0 \n", - " HD 4 3200.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2520.0 \n", - " AMD 4 4670.0 \n", - " MU 1 682.5 \n", - " DIS 2 1650.0 \n", - " BAC 9 5301.0 \n", - "2024-03-01 MSFT 12 7200.0 \n", - " AMZN 3 1875.0 \n", - " NVDA 18 18225.0 \n", - " HD 4 2940.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2960.0 \n", - " AMD 4 4680.0 \n", - " MU 1 700.0 \n", - " DIS 2 1565.0 \n", - " BAC 9 5260.5 \n", - "2024-03-04 MSFT 12 8310.0 \n", - " AMZN 3 1830.0 \n", - " NVDA 18 17280.0 \n", - " HD 4 2550.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2930.0 \n", - " AMD 4 4840.0 \n", - " MU 1 762.5 \n", - " DIS 2 1655.0 \n", - " BAC 9 5764.5 \n", - "2024-03-05 MSFT 12 7230.0 \n", - " AMZN 3 1657.5 \n", - " NVDA 18 17775.0 \n", - " HD 4 2810.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 3070.0 \n", - " AMD 4 5330.0 \n", - " MU 1 737.5 \n", - " DIS 2 1645.0 \n", - " BAC 9 5859.0 \n", - "2024-03-06 MSFT 12 7110.0 \n", - " AMZN 3 1627.5 \n", - " NVDA 18 16740.0 \n", - " HD 4 2890.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2670.0 \n", - " AMD 4 5010.0 \n", - " MU 1 725.0 \n", - " DIS 2 1440.0 \n", - " BAC 9 5841.0 \n", - "2024-03-07 MSFT 12 7890.0 \n", - " AMZN 3 1792.5 \n", - " NVDA 18 16830.0 \n", - " HD 4 2840.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 3110.0 \n", - " AMD 4 5080.0 \n", - " MU 1 765.0 \n", - " DIS 2 1490.0 \n", - " BAC 9 5944.5 \n", - "2024-03-08 MSFT 12 7500.0 \n", - " AMZN 3 1717.5 \n", - " NVDA 18 19890.0 \n", - " HD 4 2760.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2730.0 \n", - " AMD 4 5000.0 \n", - " MU 1 780.0 \n", - " DIS 2 1400.0 \n", - " BAC 9 5958.0 \n", - "2024-03-11 MSFT 12 7230.0 \n", - " AMZN 3 1552.5 \n", - " NVDA 18 15345.0 \n", - " HD 4 2540.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2930.0 \n", - " AMD 4 4720.0 \n", - " MU 1 682.5 \n", - " DIS 2 1600.0 \n", - " BAC 9 6115.5 \n", - "2024-03-12 MSFT 12 8430.0 \n", - " AMZN 3 1702.5 \n", - " NVDA 18 17010.0 \n", - " HD 4 2720.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2560.0 \n", - " AMD 4 4760.0 \n", - " MU 1 767.5 \n", - " DIS 2 1620.0 \n", - " BAC 9 6016.5 \n", - "2024-03-13 MSFT 12 8370.0 \n", - " AMZN 3 1770.0 \n", - " NVDA 18 17730.0 \n", - " HD 4 2930.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2750.0 \n", - " AMD 4 4770.0 \n", - " MU 1 715.0 \n", - " DIS 2 1605.0 \n", - " BAC 9 6043.5 \n", - "2024-03-14 MSFT 12 10740.0 \n", - " AMZN 3 1890.0 \n", - " NVDA 18 18990.0 \n", - " HD 4 2560.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2750.0 \n", - " AMD 4 4700.0 \n", - " MU 1 702.5 \n", - " DIS 2 1580.0 \n", - " BAC 9 5589.0 \n", - "2024-03-15 MSFT 12 8490.0 \n", - " AMZN 3 1672.5 \n", - " NVDA 18 17370.0 \n", - " HD 4 2830.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 3010.0 \n", - " AMD 4 4460.0 \n", - " MU 1 700.0 \n", - " DIS 2 1630.0 \n", - " BAC 9 5553.0 \n", - "2024-03-18 MSFT 12 8670.0 \n", - " AMZN 3 1657.5 \n", - " NVDA 18 17370.0 \n", - " HD 4 2700.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2670.0 \n", - " AMD 4 4660.0 \n", - " MU 1 695.0 \n", - " DIS 2 1700.0 \n", - " BAC 9 6192.0 \n", - "2024-03-19 MSFT 12 9000.0 \n", - " AMZN 3 1725.0 \n", - " NVDA 18 13410.0 \n", - " HD 4 2830.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 3350.0 \n", - " AMD 4 4660.0 \n", - " MU 1 712.5 \n", - " DIS 2 1740.0 \n", - " BAC 9 6214.5 \n", - "2024-03-20 MSFT 12 9750.0 \n", - " AMZN 3 1852.5 \n", - " NVDA 18 17550.0 \n", - " HD 4 2880.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2930.0 \n", - " AMD 4 4550.0 \n", - " MU 1 800.0 \n", - " DIS 2 1900.0 \n", - " BAC 9 6619.5 \n", - "2024-03-21 MSFT 12 9930.0 \n", - " AMZN 3 1830.0 \n", - " NVDA 18 17595.0 \n", - " HD 4 3020.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2970.0 \n", - " AMD 4 4160.0 \n", - " MU 1 917.5 \n", - " DIS 2 1845.0 \n", - " BAC 9 6826.5 \n", - "2024-03-22 MSFT 12 9750.0 \n", - " AMZN 3 1867.5 \n", - " NVDA 18 16425.0 \n", - " HD 4 3050.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 3390.0 \n", - " AMD 4 4680.0 \n", - " MU 1 932.5 \n", - " DIS 2 1915.0 \n", - " BAC 9 6790.5 \n", - "2024-03-25 MSFT 12 9060.0 \n", - " AMZN 3 1920.0 \n", - " NVDA 18 17550.0 \n", - " HD 4 2940.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2970.0 \n", - " AMD 4 4550.0 \n", - " MU 1 1025.0 \n", - " DIS 2 2140.0 \n", - " BAC 9 6646.5 \n", - "2024-03-26 MSFT 12 8760.0 \n", - " AMZN 3 1845.0 \n", - " NVDA 18 16785.0 \n", - " HD 4 2750.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2900.0 \n", - " AMD 4 4700.0 \n", - " MU 1 1040.0 \n", - " DIS 2 2120.0 \n", - " BAC 9 6786.0 \n", - "2024-03-27 MSFT 12 8850.0 \n", - " AMZN 3 1912.5 \n", - " NVDA 18 17100.0 \n", - " HD 4 3210.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2950.0 \n", - " AMD 4 4420.0 \n", - " MU 1 1050.0 \n", - " DIS 2 2170.0 \n", - " BAC 9 7200.0 \n", - "2024-03-28 MSFT 12 8340.0 \n", - " AMZN 3 1927.5 \n", - " NVDA 18 17100.0 \n", - " HD 4 2940.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 3250.0 \n", - " AMD 4 4980.0 \n", - " MU 1 1042.5 \n", - " DIS 2 2225.0 \n", - " BAC 9 7078.5 \n", - "2024-03-29 MSFT 12 8340.0 \n", - " AMZN 3 1927.5 \n", - " NVDA 18 17100.0 \n", - " HD 4 2940.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 3250.0 \n", - " AMD 4 4980.0 \n", - " MU 1 1042.5 \n", - " DIS 2 2225.0 \n", - " BAC 9 7078.5 \n", - "2024-04-01 MSFT 12 9360.0 \n", - " AMZN 3 1965.0 \n", - " NVDA 18 17640.0 \n", - " HD 4 2620.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 3370.0 \n", - " AMD 4 4600.0 \n", - " MU 1 1072.5 \n", - " DIS 2 2195.0 \n", - " BAC 9 7056.0 \n", - "2024-04-02 MSFT 12 8910.0 \n", - " AMZN 3 1957.5 \n", - " NVDA 18 17730.0 \n", - " HD 4 2530.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 3010.0 \n", - " AMD 4 4490.0 \n", - " MU 1 1080.0 \n", - " DIS 2 2190.0 \n", - " BAC 9 6912.0 \n", - "2024-04-03 MSFT 12 8370.0 \n", - " AMZN 3 2032.5 \n", - " NVDA 18 17595.0 \n", - " HD 4 2470.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3050.0 \n", - " AMD 4 4570.0 \n", - " MU 1 1152.5 \n", - " DIS 2 2110.0 \n", - " BAC 9 7074.0 \n", - "2024-04-04 MSFT 12 8550.0 \n", - " AMZN 3 1920.0 \n", - " NVDA 18 16740.0 \n", - " HD 4 2430.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3110.0 \n", - " AMD 4 4230.0 \n", - " MU 1 1050.0 \n", - " DIS 2 1875.0 \n", - " BAC 9 6282.0 \n", - "2024-04-05 MSFT 12 9360.0 \n", - " AMZN 3 2197.5 \n", - " NVDA 18 17595.0 \n", - " HD 4 2480.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 2820.0 \n", - " AMD 4 4250.0 \n", - " MU 1 1065.0 \n", - " DIS 2 2050.0 \n", - " BAC 9 6759.0 \n", - "2024-04-08 MSFT 12 9240.0 \n", - " AMZN 3 2212.5 \n", - " NVDA 18 16695.0 \n", - " HD 4 2320.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3050.0 \n", - " AMD 4 4340.0 \n", - " MU 1 1057.5 \n", - " DIS 2 1905.0 \n", - " BAC 9 6961.5 \n", - "2024-04-09 MSFT 12 9510.0 \n", - " AMZN 3 2235.0 \n", - " NVDA 18 19080.0 \n", - " HD 4 2200.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3230.0 \n", - " AMD 4 4310.0 \n", - " MU 1 1102.5 \n", - " DIS 2 1960.0 \n", - " BAC 9 7132.5 \n", - "2024-04-10 MSFT 12 9150.0 \n", - " AMZN 3 2250.0 \n", - " NVDA 18 18090.0 \n", - " HD 4 2310.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 2930.0 \n", - " AMD 4 4220.0 \n", - " MU 1 1087.5 \n", - " DIS 2 1890.0 \n", - " BAC 9 6520.5 \n", - "2024-04-11 MSFT 12 9720.0 \n", - " AMZN 3 2422.5 \n", - " NVDA 18 17505.0 \n", - " HD 4 2200.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3280.0 \n", - " AMD 4 4250.0 \n", - " MU 1 1127.5 \n", - " DIS 2 1860.0 \n", - " BAC 9 6309.0 \n", - "2024-04-12 MSFT 12 9180.0 \n", - " AMZN 3 2272.5 \n", - " NVDA 18 18900.0 \n", - " HD 4 2010.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3290.0 \n", - " AMD 4 4020.0 \n", - " MU 1 1107.5 \n", - " DIS 2 1765.0 \n", - " BAC 9 5854.5 \n", - "2024-04-15 MSFT 12 8130.0 \n", - " AMZN 3 2130.0 \n", - " NVDA 18 17730.0 \n", - " HD 4 1850.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3190.0 \n", - " AMD 4 3860.0 \n", - " MU 1 1047.5 \n", - " DIS 2 1605.0 \n", - " BAC 9 6057.0 \n", - "2024-04-16 MSFT 12 8250.0 \n", - " AMZN 3 2115.0 \n", - " NVDA 18 18045.0 \n", - " HD 4 2290.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 2930.0 \n", - " AMD 4 4090.0 \n", - " MU 1 1202.5 \n", - " DIS 2 1595.0 \n", - " BAC 9 5319.0 \n", - "2024-04-17 MSFT 12 8010.0 \n", - " AMZN 3 2002.5 \n", - " NVDA 18 17325.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3070.0 \n", - " AMD 4 3630.0 \n", - " MU 1 1032.5 \n", - " DIS 2 1600.0 \n", - " BAC 9 5670.0 \n", - "2024-04-18 MSFT 12 7290.0 \n", - " AMZN 3 1897.5 \n", - " NVDA 18 16155.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 2530.0 \n", - " AMD 4 3890.0 \n", - " MU 1 942.5 \n", - " DIS 2 1540.0 \n", - " BAC 9 5971.5 \n", - "2024-04-19 MSFT 12 6570.0 \n", - " AMZN 3 1657.5 \n", - " NVDA 18 17595.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 2630.0 \n", - " AMD 4 3280.0 \n", - " MU 1 957.5 \n", - " DIS 2 1565.0 \n", - " BAC 9 6664.5 \n", - "2024-04-22 MSFT 12 6810.0 \n", - " AMZN 3 1777.5 \n", - " NVDA 18 22185.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 2850.0 \n", - " AMD 4 3390.0 \n", - " MU 1 930.0 \n", - " DIS 2 1530.0 \n", - " BAC 9 7105.5 \n", - "2024-04-23 MSFT 12 7440.0 \n", - " AMZN 3 1890.0 \n", - " NVDA 18 18585.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 2820.0 \n", - " AMD 4 3630.0 \n", - " MU 1 1037.5 \n", - " DIS 2 1630.0 \n", - " BAC 9 7465.5 \n", - "2024-04-24 MSFT 12 7590.0 \n", - " AMZN 3 1702.5 \n", - " NVDA 18 17820.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 2730.0 \n", - " AMD 4 3660.0 \n", - " MU 1 1012.5 \n", - " DIS 2 1645.0 \n", - " BAC 9 7443.0 \n", - "2024-04-25 MSFT 12 6840.0 \n", - " AMZN 3 1590.0 \n", - " NVDA 18 15885.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 2880.0 \n", - " AMD 4 3620.0 \n", - " MU 1 952.5 \n", - " DIS 2 1565.0 \n", - " BAC 9 7195.5 \n", - "2024-04-26 MSFT 12 7170.0 \n", - " AMZN 3 1905.0 \n", - " NVDA 18 19935.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 2870.0 \n", - " AMD 4 4050.0 \n", - " MU 1 1027.5 \n", - " DIS 2 1565.0 \n", - " BAC 9 7330.5 \n", - "2024-04-29 MSFT 12 6450.0 \n", - " AMZN 3 1972.5 \n", - " NVDA 18 17640.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 2970.0 \n", - " AMD 4 4010.0 \n", - " MU 1 1015.0 \n", - " DIS 2 1500.0 \n", - " BAC 9 7011.0 \n", - "2024-04-30 MSFT 12 5370.0 \n", - " AMZN 3 1650.0 \n", - " NVDA 18 15930.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 2950.0 \n", - " AMD 4 3900.0 \n", - " MU 1 982.5 \n", - " DIS 2 1375.0 \n", - " BAC 9 6682.5 \n", - "2024-05-01 MSFT 12 5940.0 \n", - " AMZN 3 1807.5 \n", - " NVDA 18 16785.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 2540.0 \n", - " AMD 4 3240.0 \n", - " MU 1 962.5 \n", - " DIS 2 1413.0 \n", - " BAC 9 6228.0 \n", - "2024-05-02 MSFT 12 6240.0 \n", - " AMZN 3 2152.5 \n", - " NVDA 18 17910.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3180.0 \n", - " AMD 4 3250.0 \n", - " MU 1 987.5 \n", - " DIS 2 1550.0 \n", - " BAC 9 6498.0 \n", - "2024-05-03 MSFT 12 7080.0 \n", - " AMZN 3 2190.0 \n", - " NVDA 18 18720.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3190.0 \n", - " AMD 4 3600.0 \n", - " MU 1 1065.0 \n", - " DIS 2 1610.0 \n", - " BAC 9 6799.5 \n", - "2024-05-06 MSFT 12 7770.0 \n", - " AMZN 3 2340.0 \n", - " NVDA 18 17910.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3370.0 \n", - " AMD 4 3890.0 \n", - " MU 1 1122.5 \n", - " DIS 2 1805.0 \n", - " BAC 9 7092.0 \n", - "2024-05-07 MSFT 12 7230.0 \n", - " AMZN 3 2332.5 \n", - " NVDA 18 16020.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3310.0 \n", - " AMD 4 3900.0 \n", - " MU 1 1070.0 \n", - " DIS 2 989.0 \n", - " BAC 9 7222.5 \n", - "2024-05-08 MSFT 12 7350.0 \n", - " AMZN 3 2287.5 \n", - " NVDA 18 18045.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3230.0 \n", - " AMD 4 3910.0 \n", - " MU 1 1090.0 \n", - " DIS 2 1003.0 \n", - " BAC 9 7101.0 \n", - "2024-05-09 MSFT 12 7530.0 \n", - " AMZN 3 2355.0 \n", - " NVDA 18 18360.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3390.0 \n", - " AMD 4 3560.0 \n", - " MU 1 1057.5 \n", - " DIS 2 995.0 \n", - " BAC 9 7578.0 \n", - "2024-05-10 MSFT 12 7740.0 \n", - " AMZN 3 2220.0 \n", - " NVDA 18 17100.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3270.0 \n", - " AMD 4 3760.0 \n", - " MU 1 1115.0 \n", - " DIS 2 991.0 \n", - " BAC 9 7677.0 \n", - "2024-05-13 MSFT 12 7800.0 \n", - " AMZN 3 2175.0 \n", - " NVDA 18 18045.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3680.0 \n", - " AMD 4 3900.0 \n", - " MU 1 1137.5 \n", - " DIS 2 978.0 \n", - " BAC 9 7438.5 \n", - "2024-05-14 MSFT 12 7980.0 \n", - " AMZN 3 2182.5 \n", - " NVDA 18 18135.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3770.0 \n", - " AMD 4 3880.0 \n", - " MU 1 1055.0 \n", - " DIS 2 929.0 \n", - " BAC 9 7564.5 \n", - "2024-05-15 MSFT 12 8910.0 \n", - " AMZN 3 2107.5 \n", - " NVDA 18 18135.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3790.0 \n", - " AMD 4 4260.0 \n", - " MU 1 1190.0 \n", - " DIS 2 770.0 \n", - " BAC 9 7866.0 \n", - "2024-05-16 MSFT 12 8730.0 \n", - " AMZN 3 1965.0 \n", - " NVDA 18 18180.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3560.0 \n", - " AMD 4 4350.0 \n", - " MU 1 1147.5 \n", - " BAC 9 8019.0 \n", - "2024-05-17 MSFT 12 8070.0 \n", - " AMZN 3 2010.0 \n", - " NVDA 18 17955.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3350.0 \n", - " AMD 4 4450.0 \n", - " MU 1 1145.0 \n", - " BAC 9 8082.0 \n", - "2024-05-20 MSFT 12 9030.0 \n", - " AMZN 3 1927.5 \n", - " NVDA 18 18495.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3590.0 \n", - " AMD 4 4500.0 \n", - " MU 1 1167.5 \n", - " BAC 9 7807.5 \n", - "2024-05-21 AAPL 9 4491.0 \n", - " MSFT 12 9480.0 \n", - " AMZN 3 1905.0 \n", - " NVDA 18 18540.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3350.0 \n", - " AMD 4 4460.0 \n", - " MU 1 1105.0 \n", - " BAC 9 8176.5 \n", - "2024-05-22 AAPL 9 3645.0 \n", - " MSFT 12 10680.0 \n", - " AMZN 3 1897.5 \n", - " NVDA 18 17640.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3660.0 \n", - " AMD 4 4500.0 \n", - " MU 1 1140.0 \n", - " BAC 9 7821.0 \n", - "2024-05-23 AAPL 9 3618.0 \n", - " MSFT 12 9240.0 \n", - " AMZN 3 1762.5 \n", - " NVDA 18 16200.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3530.0 \n", - " AMD 4 4280.0 \n", - " MU 1 1150.0 \n", - " BAC 9 7974.0 \n", - "2024-05-24 AAPL 9 4153.5 \n", - " MSFT 12 9390.0 \n", - " AMZN 3 1732.5 \n", - " NVDA 18 20070.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3590.0 \n", - " AMD 4 4600.0 \n", - " MU 1 1240.0 \n", - " BAC 9 8248.5 \n", - "2024-05-27 AAPL 9 4194.0 \n", - " MSFT 12 9660.0 \n", - " AMZN 3 1815.0 \n", - " NVDA 18 19440.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3420.0 \n", - " AMD 4 4790.0 \n", - " MU 1 1200.0 \n", - " BAC 9 8131.5 \n", - "2024-05-28 AAPL 9 4194.0 \n", - " MSFT 12 9660.0 \n", - " AMZN 3 1815.0 \n", - " NVDA 18 19440.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3420.0 \n", - " AMD 4 4790.0 \n", - " MU 1 1200.0 \n", - " BAC 9 8131.5 \n", - "2024-05-29 AAPL 9 4248.0 \n", - " MSFT 12 9510.0 \n", - " AMZN 3 1822.5 \n", - " NVDA 18 19260.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3200.0 \n", - " AMD 4 4470.0 \n", - " MU 1 1205.0 \n", - " BAC 9 7704.0 \n", - "2024-05-30 AAPL 9 4468.5 \n", - " MSFT 12 7710.0 \n", - " AMZN 3 1657.5 \n", - " NVDA 18 17865.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3630.0 \n", - " AMD 4 4600.0 \n", - " MU 1 1212.5 \n", - " BAC 9 7794.0 \n", - "2024-05-31 AAPL 9 4590.0 \n", - " MSFT 12 7680.0 \n", - " AMZN 3 1470.0 \n", - " NVDA 18 18315.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3660.0 \n", - " AMD 4 4580.0 \n", - " MU 1 1117.5 \n", - " BAC 9 8491.5 \n", - "2024-06-03 AAPL 9 4815.0 \n", - " MSFT 12 7380.0 \n", - " AMZN 3 1575.0 \n", - " NVDA 18 17865.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3550.0 \n", - " AMD 4 4410.0 \n", - " MU 1 1162.5 \n", - " BAC 9 7488.0 \n", - "2024-06-04 AAPL 9 4716.0 \n", - " MSFT 12 7620.0 \n", - " AMZN 3 1612.5 \n", - " NVDA 18 17775.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3550.0 \n", - " AMD 4 4260.0 \n", - " MU 1 1140.0 \n", - " BAC 9 7897.5 \n", - "2024-06-05 AAPL 9 5040.0 \n", - " MSFT 12 7950.0 \n", - " AMZN 3 1725.0 \n", - " NVDA 18 20025.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3710.0 \n", - " AMD 4 4600.0 \n", - " MU 1 1192.5 \n", - " BAC 9 8388.0 \n", - "2024-06-06 AAPL 9 4801.5 \n", - " MSFT 12 8700.0 \n", - " AMZN 3 1950.0 \n", - " NVDA 18 18450.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3540.0 \n", - " AMD 4 4540.0 \n", - " MU 1 1182.5 \n", - " BAC 9 8280.0 \n", - "2024-06-07 AAPL 9 5175.0 \n", - " MSFT 12 8490.0 \n", - " AMZN 3 1897.5 \n", - " NVDA 18 18360.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3680.0 \n", - " AMD 4 4660.0 \n", - " MU 1 1202.5 \n", - " BAC 9 8478.0 \n", - "2024-06-10 AAPL 9 4509.0 \n", - " MSFT 12 9090.0 \n", - " AMZN 3 2070.0 \n", - " NVDA 18 18360.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3600.0 \n", - " AMD 4 4310.0 \n", - " MU 1 1197.5 \n", - " BAC 9 8487.0 \n", - "2024-06-11 AAPL 9 6952.5 \n", - " MSFT 12 9630.0 \n", - " AMZN 3 2062.5 \n", - " NVDA 18 18360.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3610.0 \n", - " AMD 4 4270.0 \n", - " MU 1 1210.0 \n", - " BAC 9 7920.0 \n", - "2024-06-12 AAPL 9 8910.0 \n", - " MSFT 12 10590.0 \n", - " AMZN 3 2032.5 \n", - " NVDA 18 18360.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3680.0 \n", - " AMD 4 4410.0 \n", - " MU 1 1275.0 \n", - " BAC 9 8280.0 \n", - "2024-06-13 AAPL 9 8730.0 \n", - " MSFT 12 10500.0 \n", - " AMZN 3 1837.5 \n", - " NVDA 18 18360.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3830.0 \n", - " AMD 4 4370.0 \n", - " MU 1 1250.0 \n", - " BAC 9 8176.5 \n", - "2024-06-14 AAPL 9 8370.0 \n", - " MSFT 12 10860.0 \n", - " AMZN 3 1837.5 \n", - " NVDA 18 18360.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3680.0 \n", - " AMD 4 4350.0 \n", - " MU 1 1220.0 \n", - " BAC 9 8131.5 \n", - "2024-06-17 AAPL 9 9180.0 \n", - " MSFT 12 11730.0 \n", - " AMZN 3 1852.5 \n", - " NVDA 18 18360.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3690.0 \n", - " AMD 4 4260.0 \n", - " MU 1 1315.0 \n", - " BAC 9 8316.0 \n", - "2024-06-18 AAPL 9 8887.5 \n", - " MSFT 12 11100.0 \n", - " AMZN 3 1755.0 \n", - " NVDA 18 18360.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3720.0 \n", - " AMD 4 4030.0 \n", - " MU 1 1287.5 \n", - " BAC 9 8694.0 \n", - "2024-06-19 AAPL 9 7560.0 \n", - " MSFT 12 11250.0 \n", - " AMZN 3 1957.5 \n", - " NVDA 18 18360.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3710.0 \n", - " AMD 4 4410.0 \n", - " MU 1 1270.0 \n", - " BAC 9 8685.0 \n", - "2024-06-20 AAPL 9 7560.0 \n", - " MSFT 12 11250.0 \n", - " AMZN 3 1957.5 \n", - " NVDA 18 18360.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3710.0 \n", - " AMD 4 4410.0 \n", - " MU 1 1270.0 \n", - " BAC 9 8685.0 \n", - "2024-06-21 AAPL 9 6885.0 \n", - " MSFT 12 12060.0 \n", - " AMZN 3 2122.5 \n", - " NVDA 18 18360.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3590.0 \n", - " AMD 4 4400.0 \n", - " MU 1 1222.5 \n", - " BAC 9 8289.0 \n", - "2024-06-24 AAPL 9 6570.0 \n", - " MSFT 12 11940.0 \n", - " AMZN 3 1905.0 \n", - " NVDA 18 18360.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3560.0 \n", - " AMD 4 4350.0 \n", - " MU 1 1310.0 \n", - " BAC 9 8572.5 \n", - "2024-06-25 AAPL 9 7380.0 \n", - " MSFT 12 12120.0 \n", - " AMZN 3 1950.0 \n", - " NVDA 18 18360.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3190.0 \n", - " AMD 4 4410.0 \n", - " MU 1 1222.5 \n", - " BAC 9 8676.0 \n", - "2024-06-26 AAPL 9 8212.5 \n", - " MSFT 12 12090.0 \n", - " AMZN 3 2415.0 \n", - " NVDA 18 18360.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3260.0 \n", - " AMD 4 4260.0 \n", - " MU 1 1262.5 \n", - " BAC 9 7969.5 \n", - "2024-06-27 AAPL 9 8392.5 \n", - " MSFT 12 11550.0 \n", - " AMZN 3 2715.0 \n", - " NVDA 18 18360.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3780.0 \n", - " AMD 4 4390.0 \n", - " MU 1 1222.5 \n", - " BAC 9 8451.0 \n", - "2024-06-28 AAPL 9 7875.0 \n", - " MSFT 12 12360.0 \n", - " AMZN 3 2332.5 \n", - " NVDA 18 18360.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3920.0 \n", - " AMD 4 4560.0 \n", - " MU 1 1210.0 \n", - " BAC 9 8185.5 " - ] - }, - "execution_count": 89, - "metadata": {}, - "output_type": "execute_result" - }, - { - "ename": "", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[1;31mThe Kernel crashed while executing code in the current cell or a previous cell. \n", - "\u001b[1;31mPlease review the code in the cell(s) to identify a possible cause of the failure. \n", - "\u001b[1;31mClick here for more info. \n", - "\u001b[1;31mView Jupyter log for further details." - ] - } - ], - "source": [ - "\n", - "pd.set_option('display.max_rows', 10000)\n", - "evb_backtest.portfolio.get_all_positions()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": ".venv", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.11" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/EventDriven/demos/demoRunV3.ipynb b/EventDriven/demos/demoRunV3.ipynb deleted file mode 100644 index a937bf3..0000000 --- a/EventDriven/demos/demoRunV3.ipynb +++ /dev/null @@ -1,39688 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The autoreload extension is already loaded. To reload it, use:\n", - " %reload_ext autoreload\n" - ] - } - ], - "source": [ - "%load_ext autoreload\n", - "%autoreload 2\n", - "from dbase.DataAPI.ThetaData import * #type: ignore\n", - "from dbase.database.SQLHelpers import * #type: ignore\n", - "import pandas as pd\n", - "from EventDriven.eventScheduler import *\n", - "from EventDriven.backtest import OptionSignalBacktest\n", - "\n", - "pd.set_option('display.max_rows', 5000)\n", - "pd.set_option('display.max_columns', 5000)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
SizeEntryBarExitBarEntryPriceExitPricePnLReturnPctEntryTimeExitTimeDurationTicker
034.0504.0524.0279.795877253.010232-910.711955-0.0957332023-07-052023-08-0228 daysTSLA
128.0504.0526.0192.240502185.493749-188.909083-0.0350952023-07-052023-08-0430 daysAAPL
217.0504.0529.0336.262811322.011093-242.279208-0.0423832023-07-052023-08-0935 daysMSFT
348.0504.0536.087.04358882.000000-242.092217-0.0579432023-07-052023-08-1844 daysAVGO
411.0504.0583.0130.695846122.257034-92.826927-0.0645682023-07-052023-10-25112 daysAMZN
5178.0504.0753.042.282471123.47000114451.3804121.9201232023-07-052024-07-01362 daysNVDA
75.0522.0556.0332.810769318.700396-70.551863-0.0423982023-07-312023-09-1849 daysHD
85.0530.0535.0239.284572224.549052-73.677602-0.0615822023-08-102023-08-177 daysBA
95.0530.0535.053.78425752.084613-8.498219-0.0316012023-08-102023-08-177 daysWMT
1038.0535.0580.0226.851208217.009995-373.966096-0.0433822023-08-172023-10-2064 daysTSLA
1147.0537.0753.083.697919160.8200073624.7381410.9214342023-08-212024-07-01315 daysAVGO
1228.0545.0549.0188.497436175.179993-372.888422-0.0706512023-08-312023-09-077 daysAAPL
134.0553.0565.055.16908453.228411-7.762691-0.0351772023-09-132023-09-2916 daysWMT
147.0555.0558.038.55446835.955361-18.193748-0.0674142023-09-152023-09-205 daysINTC
1511.0596.0753.0124.434000199.470001825.3960130.6030182023-11-132024-07-01231 daysQCOM
1614.0597.0753.0372.308545448.6600041068.9204240.2050762023-11-142024-07-01230 daysMSFT
1741.0598.0607.0106.029814100.545486-224.857451-0.0517242023-11-152023-11-2914 daysSBUX
1813.0598.0753.0120.961891161.250000523.7454180.3330642023-11-152024-07-01229 daysAMD
197.0599.0753.077.159114130.500000373.3861990.6913102023-11-162024-07-01228 daysMU
2014.0600.0635.095.08162589.416964-79.305250-0.0595772023-11-172024-01-1054 daysDIS
215.0600.0692.043.06018540.347284-13.564503-0.0630032023-11-172024-04-03138 daysINTC
2225.0603.0631.0192.160221182.149994-250.255665-0.0520932023-11-222024-01-0443 daysAAPL
23102.0609.0753.030.50640039.910000959.1672230.3082502023-12-012024-07-01213 daysBAC
244.0610.0637.0232.109553219.970001-48.558207-0.0523012023-12-042024-01-1239 daysBA
255.0610.0702.0320.738665336.77999980.2066680.0500142023-12-042024-04-17135 daysHD
2622.0646.0649.0153.405040145.389999-176.330896-0.0522482024-01-262024-01-315 daysGOOG
274.0652.0753.056.86834367.88999944.0866250.1938102024-02-052024-07-01147 daysWMT
2813.0654.0723.097.730864103.04000169.0187750.0543242024-02-072024-05-1699 daysDIS
298.0655.0753.0170.243769193.490005185.9698930.1365472024-02-082024-07-01144 daysAMZN
3121.0692.0753.0155.462218184.479996609.3733290.1866552024-04-032024-07-0189 daysGOOG
3224.0726.0753.0191.758811212.089996487.9484400.1060252024-05-212024-07-0141 daysAAPL
\n", - "
" - ], - "text/plain": [ - " Size EntryBar ExitBar EntryPrice ExitPrice PnL ReturnPct \\\n", - "0 34.0 504.0 524.0 279.795877 253.010232 -910.711955 -0.095733 \n", - "1 28.0 504.0 526.0 192.240502 185.493749 -188.909083 -0.035095 \n", - "2 17.0 504.0 529.0 336.262811 322.011093 -242.279208 -0.042383 \n", - "3 48.0 504.0 536.0 87.043588 82.000000 -242.092217 -0.057943 \n", - "4 11.0 504.0 583.0 130.695846 122.257034 -92.826927 -0.064568 \n", - "5 178.0 504.0 753.0 42.282471 123.470001 14451.380412 1.920123 \n", - "7 5.0 522.0 556.0 332.810769 318.700396 -70.551863 -0.042398 \n", - "8 5.0 530.0 535.0 239.284572 224.549052 -73.677602 -0.061582 \n", - "9 5.0 530.0 535.0 53.784257 52.084613 -8.498219 -0.031601 \n", - "10 38.0 535.0 580.0 226.851208 217.009995 -373.966096 -0.043382 \n", - "11 47.0 537.0 753.0 83.697919 160.820007 3624.738141 0.921434 \n", - "12 28.0 545.0 549.0 188.497436 175.179993 -372.888422 -0.070651 \n", - "13 4.0 553.0 565.0 55.169084 53.228411 -7.762691 -0.035177 \n", - "14 7.0 555.0 558.0 38.554468 35.955361 -18.193748 -0.067414 \n", - "15 11.0 596.0 753.0 124.434000 199.470001 825.396013 0.603018 \n", - "16 14.0 597.0 753.0 372.308545 448.660004 1068.920424 0.205076 \n", - "17 41.0 598.0 607.0 106.029814 100.545486 -224.857451 -0.051724 \n", - "18 13.0 598.0 753.0 120.961891 161.250000 523.745418 0.333064 \n", - "19 7.0 599.0 753.0 77.159114 130.500000 373.386199 0.691310 \n", - "20 14.0 600.0 635.0 95.081625 89.416964 -79.305250 -0.059577 \n", - "21 5.0 600.0 692.0 43.060185 40.347284 -13.564503 -0.063003 \n", - "22 25.0 603.0 631.0 192.160221 182.149994 -250.255665 -0.052093 \n", - "23 102.0 609.0 753.0 30.506400 39.910000 959.167223 0.308250 \n", - "24 4.0 610.0 637.0 232.109553 219.970001 -48.558207 -0.052301 \n", - "25 5.0 610.0 702.0 320.738665 336.779999 80.206668 0.050014 \n", - "26 22.0 646.0 649.0 153.405040 145.389999 -176.330896 -0.052248 \n", - "27 4.0 652.0 753.0 56.868343 67.889999 44.086625 0.193810 \n", - "28 13.0 654.0 723.0 97.730864 103.040001 69.018775 0.054324 \n", - "29 8.0 655.0 753.0 170.243769 193.490005 185.969893 0.136547 \n", - "31 21.0 692.0 753.0 155.462218 184.479996 609.373329 0.186655 \n", - "32 24.0 726.0 753.0 191.758811 212.089996 487.948440 0.106025 \n", - "\n", - " EntryTime ExitTime Duration Ticker \n", - "0 2023-07-05 2023-08-02 28 days TSLA \n", - "1 2023-07-05 2023-08-04 30 days AAPL \n", - "2 2023-07-05 2023-08-09 35 days MSFT \n", - "3 2023-07-05 2023-08-18 44 days AVGO \n", - "4 2023-07-05 2023-10-25 112 days AMZN \n", - "5 2023-07-05 2024-07-01 362 days NVDA \n", - "7 2023-07-31 2023-09-18 49 days HD \n", - "8 2023-08-10 2023-08-17 7 days BA \n", - "9 2023-08-10 2023-08-17 7 days WMT \n", - "10 2023-08-17 2023-10-20 64 days TSLA \n", - "11 2023-08-21 2024-07-01 315 days AVGO \n", - "12 2023-08-31 2023-09-07 7 days AAPL \n", - "13 2023-09-13 2023-09-29 16 days WMT \n", - "14 2023-09-15 2023-09-20 5 days INTC \n", - "15 2023-11-13 2024-07-01 231 days QCOM \n", - "16 2023-11-14 2024-07-01 230 days MSFT \n", - "17 2023-11-15 2023-11-29 14 days SBUX \n", - "18 2023-11-15 2024-07-01 229 days AMD \n", - "19 2023-11-16 2024-07-01 228 days MU \n", - "20 2023-11-17 2024-01-10 54 days DIS \n", - "21 2023-11-17 2024-04-03 138 days INTC \n", - "22 2023-11-22 2024-01-04 43 days AAPL \n", - "23 2023-12-01 2024-07-01 213 days BAC \n", - "24 2023-12-04 2024-01-12 39 days BA \n", - "25 2023-12-04 2024-04-17 135 days HD \n", - "26 2024-01-26 2024-01-31 5 days GOOG \n", - "27 2024-02-05 2024-07-01 147 days WMT \n", - "28 2024-02-07 2024-05-16 99 days DIS \n", - "29 2024-02-08 2024-07-01 144 days AMZN \n", - "31 2024-04-03 2024-07-01 89 days GOOG \n", - "32 2024-05-21 2024-07-01 41 days AAPL " - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import json\n", - "with open('../input/profitable_weights.json', 'r') as f:\n", - " weights = json.load(f)\n", - "ttrades_ = pd.read_csv('../input/profitable_trades.csv').iloc[:, 1:]\n", - "\n", - "w_map = {x: w * 0.75 for x, w in weights.items()}\n", - "ttrades_ = ttrades_[ttrades_['EntryTime'] != ttrades_['ExitTime']]\n", - "ttrades_" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
SizeEntryBarExitBarEntryPriceExitPricePnLReturnPctEntryTimeExitTimeDurationTicker
034.0504.0524.0279.795877253.010232-910.711955-0.0957332023-07-052023-08-0228 daysTSLA
411.0504.0583.0130.695846122.257034-92.826927-0.0645682023-07-052023-10-25112 daysAMZN
\n", - "
" - ], - "text/plain": [ - " Size EntryBar ExitBar EntryPrice ExitPrice PnL ReturnPct \\\n", - "0 34.0 504.0 524.0 279.795877 253.010232 -910.711955 -0.095733 \n", - "4 11.0 504.0 583.0 130.695846 122.257034 -92.826927 -0.064568 \n", - "\n", - " EntryTime ExitTime Duration Ticker \n", - "0 2023-07-05 2023-08-02 28 days TSLA \n", - "4 2023-07-05 2023-10-25 112 days AMZN " - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "trades_ = ttrades_.copy()[:5]\n", - "msft_trade = pd.DataFrame([{\"Size\": 10.0, \"EntryBar\": 504, \"ExitBar\": 529.0, \"EntryTime\": \"2023-08-09\", \"ExitTime\": \"2023-10-25\", \"Ticker\": \"MSFT\"}])\n", - "trades_ = pd.concat([trades_, msft_trade], ignore_index=True)\n", - "trades_ = trades_[trades_['Ticker'].isin(['TSLA', 'AMZN'])]\n", - "trades_" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[get_engine] Creating engine for DB: securities_master, PID: 18008\n", - "YF.download() has changed argument auto_adjust default to True\n" - ] - } - ], - "source": [ - "#Backtest class \n", - "evb_backtest = OptionSignalBacktest(trades_ )\n", - "evb_backtest.portfolio.allow_multiple_trades = False" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'TSLA': 50000.0, 'AMZN': 50000.0}" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.portfolio.allocated_cash_map" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
typesymbolsignal_typesignal_idmax_contract_priceorder_settingsparent_event
datetime
2023-07-05MARKETNaNNaNNaNNaNNaNNaN
2023-07-05SIGNALAMZNLONGAMZN20230705LONGNaNNaNNaN
2023-07-05SIGNALTSLALONGTSLA20230705LONGNaNNaNNaN
2023-07-06MARKETNaNNaNNaNNaNNaNNaN
2023-07-07MARKETNaNNaNNaNNaNNaNNaN
2023-07-10MARKETNaNNaNNaNNaNNaNNaN
2023-07-11MARKETNaNNaNNaNNaNNaNNaN
2023-07-12MARKETNaNNaNNaNNaNNaNNaN
2023-07-13MARKETNaNNaNNaNNaNNaNNaN
2023-07-14MARKETNaNNaNNaNNaNNaNNaN
2023-07-17MARKETNaNNaNNaNNaNNaNNaN
2023-07-18MARKETNaNNaNNaNNaNNaNNaN
2023-07-19MARKETNaNNaNNaNNaNNaNNaN
2023-07-20MARKETNaNNaNNaNNaNNaNNaN
2023-07-21MARKETNaNNaNNaNNaNNaNNaN
2023-07-24MARKETNaNNaNNaNNaNNaNNaN
2023-07-25MARKETNaNNaNNaNNaNNaNNaN
2023-07-26MARKETNaNNaNNaNNaNNaNNaN
2023-07-27MARKETNaNNaNNaNNaNNaNNaN
2023-07-28MARKETNaNNaNNaNNaNNaNNaN
2023-07-31MARKETNaNNaNNaNNaNNaNNaN
2023-08-01MARKETNaNNaNNaNNaNNaNNaN
2023-08-02MARKETNaNNaNNaNNaNNaNNaN
2023-08-02SIGNALTSLACLOSETSLA20230705LONGNaNNaNNaN
2023-08-03MARKETNaNNaNNaNNaNNaNNaN
2023-08-04MARKETNaNNaNNaNNaNNaNNaN
2023-08-07MARKETNaNNaNNaNNaNNaNNaN
2023-08-08MARKETNaNNaNNaNNaNNaNNaN
2023-08-09MARKETNaNNaNNaNNaNNaNNaN
2023-08-10MARKETNaNNaNNaNNaNNaNNaN
2023-08-11MARKETNaNNaNNaNNaNNaNNaN
2023-08-14MARKETNaNNaNNaNNaNNaNNaN
2023-08-15MARKETNaNNaNNaNNaNNaNNaN
2023-08-16MARKETNaNNaNNaNNaNNaNNaN
2023-08-17MARKETNaNNaNNaNNaNNaNNaN
2023-08-18MARKETNaNNaNNaNNaNNaNNaN
2023-08-21MARKETNaNNaNNaNNaNNaNNaN
2023-08-22MARKETNaNNaNNaNNaNNaNNaN
2023-08-23MARKETNaNNaNNaNNaNNaNNaN
2023-08-24MARKETNaNNaNNaNNaNNaNNaN
2023-08-25MARKETNaNNaNNaNNaNNaNNaN
2023-08-28MARKETNaNNaNNaNNaNNaNNaN
2023-08-29MARKETNaNNaNNaNNaNNaNNaN
2023-08-30MARKETNaNNaNNaNNaNNaNNaN
2023-08-31MARKETNaNNaNNaNNaNNaNNaN
2023-09-01MARKETNaNNaNNaNNaNNaNNaN
2023-09-04MARKETNaNNaNNaNNaNNaNNaN
2023-09-05MARKETNaNNaNNaNNaNNaNNaN
2023-09-06MARKETNaNNaNNaNNaNNaNNaN
2023-09-07MARKETNaNNaNNaNNaNNaNNaN
2023-09-08MARKETNaNNaNNaNNaNNaNNaN
2023-09-11MARKETNaNNaNNaNNaNNaNNaN
2023-09-12MARKETNaNNaNNaNNaNNaNNaN
2023-09-13MARKETNaNNaNNaNNaNNaNNaN
2023-09-14MARKETNaNNaNNaNNaNNaNNaN
2023-09-15MARKETNaNNaNNaNNaNNaNNaN
2023-09-18MARKETNaNNaNNaNNaNNaNNaN
2023-09-19MARKETNaNNaNNaNNaNNaNNaN
2023-09-20MARKETNaNNaNNaNNaNNaNNaN
2023-09-21MARKETNaNNaNNaNNaNNaNNaN
2023-09-22MARKETNaNNaNNaNNaNNaNNaN
2023-09-25MARKETNaNNaNNaNNaNNaNNaN
2023-09-26MARKETNaNNaNNaNNaNNaNNaN
2023-09-27MARKETNaNNaNNaNNaNNaNNaN
2023-09-28MARKETNaNNaNNaNNaNNaNNaN
2023-09-29MARKETNaNNaNNaNNaNNaNNaN
2023-10-02MARKETNaNNaNNaNNaNNaNNaN
2023-10-03MARKETNaNNaNNaNNaNNaNNaN
2023-10-04MARKETNaNNaNNaNNaNNaNNaN
2023-10-05MARKETNaNNaNNaNNaNNaNNaN
2023-10-06MARKETNaNNaNNaNNaNNaNNaN
2023-10-09MARKETNaNNaNNaNNaNNaNNaN
2023-10-10MARKETNaNNaNNaNNaNNaNNaN
2023-10-11MARKETNaNNaNNaNNaNNaNNaN
2023-10-12MARKETNaNNaNNaNNaNNaNNaN
2023-10-13MARKETNaNNaNNaNNaNNaNNaN
2023-10-16MARKETNaNNaNNaNNaNNaNNaN
2023-10-17MARKETNaNNaNNaNNaNNaNNaN
2023-10-18MARKETNaNNaNNaNNaNNaNNaN
2023-10-19MARKETNaNNaNNaNNaNNaNNaN
2023-10-20MARKETNaNNaNNaNNaNNaNNaN
2023-10-23MARKETNaNNaNNaNNaNNaNNaN
2023-10-24MARKETNaNNaNNaNNaNNaNNaN
2023-10-25MARKETNaNNaNNaNNaNNaNNaN
2023-10-25SIGNALAMZNCLOSEAMZN20230705LONGNaNNaNNaN
\n", - "
" - ], - "text/plain": [ - " type symbol signal_type signal_id max_contract_price \\\n", - "datetime \n", - "2023-07-05 MARKET NaN NaN NaN NaN \n", - "2023-07-05 SIGNAL AMZN LONG AMZN20230705LONG NaN \n", - "2023-07-05 SIGNAL TSLA LONG TSLA20230705LONG NaN \n", - "2023-07-06 MARKET NaN NaN NaN NaN \n", - "2023-07-07 MARKET NaN NaN NaN NaN \n", - "2023-07-10 MARKET NaN NaN NaN NaN \n", - "2023-07-11 MARKET NaN NaN NaN NaN \n", - "2023-07-12 MARKET NaN NaN NaN NaN \n", - "2023-07-13 MARKET NaN NaN NaN NaN \n", - "2023-07-14 MARKET NaN NaN NaN NaN \n", - "2023-07-17 MARKET NaN NaN NaN NaN \n", - "2023-07-18 MARKET NaN NaN NaN NaN \n", - "2023-07-19 MARKET NaN NaN NaN NaN \n", - "2023-07-20 MARKET NaN NaN NaN NaN \n", - "2023-07-21 MARKET NaN NaN NaN NaN \n", - "2023-07-24 MARKET NaN NaN NaN NaN \n", - "2023-07-25 MARKET NaN NaN NaN NaN \n", - "2023-07-26 MARKET NaN NaN NaN NaN \n", - "2023-07-27 MARKET NaN NaN NaN NaN \n", - "2023-07-28 MARKET NaN NaN NaN NaN \n", - "2023-07-31 MARKET NaN NaN NaN NaN \n", - "2023-08-01 MARKET NaN NaN NaN NaN \n", - "2023-08-02 MARKET NaN NaN NaN NaN \n", - "2023-08-02 SIGNAL TSLA CLOSE TSLA20230705LONG NaN \n", - "2023-08-03 MARKET NaN NaN NaN NaN \n", - "2023-08-04 MARKET NaN NaN NaN NaN \n", - "2023-08-07 MARKET NaN NaN NaN NaN \n", - "2023-08-08 MARKET NaN NaN NaN NaN \n", - "2023-08-09 MARKET NaN NaN NaN NaN \n", - "2023-08-10 MARKET NaN NaN NaN NaN \n", - "2023-08-11 MARKET NaN NaN NaN NaN \n", - "2023-08-14 MARKET NaN NaN NaN NaN \n", - "2023-08-15 MARKET NaN NaN NaN NaN \n", - "2023-08-16 MARKET NaN NaN NaN NaN \n", - "2023-08-17 MARKET NaN NaN NaN NaN \n", - "2023-08-18 MARKET NaN NaN NaN NaN \n", - "2023-08-21 MARKET NaN NaN NaN NaN \n", - "2023-08-22 MARKET NaN NaN NaN NaN \n", - "2023-08-23 MARKET NaN NaN NaN NaN \n", - "2023-08-24 MARKET NaN NaN NaN NaN \n", - "2023-08-25 MARKET NaN NaN NaN NaN \n", - "2023-08-28 MARKET NaN NaN NaN NaN \n", - "2023-08-29 MARKET NaN NaN NaN NaN \n", - "2023-08-30 MARKET NaN NaN NaN NaN \n", - "2023-08-31 MARKET NaN NaN NaN NaN \n", - "2023-09-01 MARKET NaN NaN NaN NaN \n", - "2023-09-04 MARKET NaN NaN NaN NaN \n", - "2023-09-05 MARKET NaN NaN NaN NaN \n", - "2023-09-06 MARKET NaN NaN NaN NaN \n", - "2023-09-07 MARKET NaN NaN NaN NaN \n", - "2023-09-08 MARKET NaN NaN NaN NaN \n", - "2023-09-11 MARKET NaN NaN NaN NaN \n", - "2023-09-12 MARKET NaN NaN NaN NaN \n", - "2023-09-13 MARKET NaN NaN NaN NaN \n", - "2023-09-14 MARKET NaN NaN NaN NaN \n", - "2023-09-15 MARKET NaN NaN NaN NaN \n", - "2023-09-18 MARKET NaN NaN NaN NaN \n", - "2023-09-19 MARKET NaN NaN NaN NaN \n", - "2023-09-20 MARKET NaN NaN NaN NaN \n", - "2023-09-21 MARKET NaN NaN NaN NaN \n", - "2023-09-22 MARKET NaN NaN NaN NaN \n", - "2023-09-25 MARKET NaN NaN NaN NaN \n", - "2023-09-26 MARKET NaN NaN NaN NaN \n", - "2023-09-27 MARKET NaN NaN NaN NaN \n", - "2023-09-28 MARKET NaN NaN NaN NaN \n", - "2023-09-29 MARKET NaN NaN NaN NaN \n", - "2023-10-02 MARKET NaN NaN NaN NaN \n", - "2023-10-03 MARKET NaN NaN NaN NaN \n", - "2023-10-04 MARKET NaN NaN NaN NaN \n", - "2023-10-05 MARKET NaN NaN NaN NaN \n", - "2023-10-06 MARKET NaN NaN NaN NaN \n", - "2023-10-09 MARKET NaN NaN NaN NaN \n", - "2023-10-10 MARKET NaN NaN NaN NaN \n", - "2023-10-11 MARKET NaN NaN NaN NaN \n", - "2023-10-12 MARKET NaN NaN NaN NaN \n", - "2023-10-13 MARKET NaN NaN NaN NaN \n", - "2023-10-16 MARKET NaN NaN NaN NaN \n", - "2023-10-17 MARKET NaN NaN NaN NaN \n", - "2023-10-18 MARKET NaN NaN NaN NaN \n", - "2023-10-19 MARKET NaN NaN NaN NaN \n", - "2023-10-20 MARKET NaN NaN NaN NaN \n", - "2023-10-23 MARKET NaN NaN NaN NaN \n", - "2023-10-24 MARKET NaN NaN NaN NaN \n", - "2023-10-25 MARKET NaN NaN NaN NaN \n", - "2023-10-25 SIGNAL AMZN CLOSE AMZN20230705LONG NaN \n", - "\n", - " order_settings parent_event \n", - "datetime \n", - "2023-07-05 NaN NaN \n", - "2023-07-05 NaN NaN \n", - "2023-07-05 NaN NaN \n", - "2023-07-06 NaN NaN \n", - "2023-07-07 NaN NaN \n", - "2023-07-10 NaN NaN \n", - "2023-07-11 NaN NaN \n", - "2023-07-12 NaN NaN \n", - "2023-07-13 NaN NaN \n", - "2023-07-14 NaN NaN \n", - "2023-07-17 NaN NaN \n", - "2023-07-18 NaN NaN \n", - "2023-07-19 NaN NaN \n", - "2023-07-20 NaN NaN \n", - "2023-07-21 NaN NaN \n", - "2023-07-24 NaN NaN \n", - "2023-07-25 NaN NaN \n", - "2023-07-26 NaN NaN \n", - "2023-07-27 NaN NaN \n", - "2023-07-28 NaN NaN \n", - "2023-07-31 NaN NaN \n", - "2023-08-01 NaN NaN \n", - "2023-08-02 NaN NaN \n", - "2023-08-02 NaN NaN \n", - "2023-08-03 NaN NaN \n", - "2023-08-04 NaN NaN \n", - "2023-08-07 NaN NaN \n", - "2023-08-08 NaN NaN \n", - "2023-08-09 NaN NaN \n", - "2023-08-10 NaN NaN \n", - "2023-08-11 NaN NaN \n", - "2023-08-14 NaN NaN \n", - "2023-08-15 NaN NaN \n", - "2023-08-16 NaN NaN \n", - "2023-08-17 NaN NaN \n", - "2023-08-18 NaN NaN \n", - "2023-08-21 NaN NaN \n", - "2023-08-22 NaN NaN \n", - "2023-08-23 NaN NaN \n", - "2023-08-24 NaN NaN \n", - "2023-08-25 NaN NaN \n", - "2023-08-28 NaN NaN \n", - "2023-08-29 NaN NaN \n", - "2023-08-30 NaN NaN \n", - "2023-08-31 NaN NaN \n", - "2023-09-01 NaN NaN \n", - "2023-09-04 NaN NaN \n", - "2023-09-05 NaN NaN \n", - "2023-09-06 NaN NaN \n", - "2023-09-07 NaN NaN \n", - "2023-09-08 NaN NaN \n", - "2023-09-11 NaN NaN \n", - "2023-09-12 NaN NaN \n", - "2023-09-13 NaN NaN \n", - "2023-09-14 NaN NaN \n", - "2023-09-15 NaN NaN \n", - "2023-09-18 NaN NaN \n", - "2023-09-19 NaN NaN \n", - "2023-09-20 NaN NaN \n", - "2023-09-21 NaN NaN \n", - "2023-09-22 NaN NaN \n", - "2023-09-25 NaN NaN \n", - "2023-09-26 NaN NaN \n", - "2023-09-27 NaN NaN \n", - "2023-09-28 NaN NaN \n", - "2023-09-29 NaN NaN \n", - "2023-10-02 NaN NaN \n", - "2023-10-03 NaN NaN \n", - "2023-10-04 NaN NaN \n", - "2023-10-05 NaN NaN \n", - "2023-10-06 NaN NaN \n", - "2023-10-09 NaN NaN \n", - "2023-10-10 NaN NaN \n", - "2023-10-11 NaN NaN \n", - "2023-10-12 NaN NaN \n", - "2023-10-13 NaN NaN \n", - "2023-10-16 NaN NaN \n", - "2023-10-17 NaN NaN \n", - "2023-10-18 NaN NaN \n", - "2023-10-19 NaN NaN \n", - "2023-10-20 NaN NaN \n", - "2023-10-23 NaN NaN \n", - "2023-10-24 NaN NaN \n", - "2023-10-25 NaN NaN \n", - "2023-10-25 NaN NaN " - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.eventScheduler.events" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# RUN BACKTEST" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Processing event: MARKET 2023-07-05 00:00:00\n", - "Processing event: SIGNAL 2023-07-05 00:00:00\n", - "\n", - "Order Received: {'result': 'SUCCESSFUL', 'data': {'trade_id': '&L:TSLA20240621C340&S:TSLA20240621C343.33', 'close': 0.7250000000000085, 'long': ['TSLA20240621C340'], 'short': ['TSLA20240621C343.33']}}\n", - "\n", - "===========================\n", - "Buy Details\n", - "Position: {'trade_id': '&L:TSLA20240621C340&S:TSLA20240621C343.33', 'close': 0.7250000000000085, 'long': ['TSLA20240621C340'], 'short': ['TSLA20240621C343.33'], 'quantity': 689, 'cash_equivalent_qty': 689.0}, Date: 2023-07-05, Signal: SignalEvent type:LONG, symbol=TSLA, date:2023-07-05 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:TSLA20230705LONG, parent_event:None\n", - "Max Contract Price: 250.0, Cash at Hand: 500.0\n", - "Cash at Hand 500.0 Close 0.7250000000000085\n", - "===========================\n", - "Processing event: SIGNAL 2023-07-05 00:00:00\n", - "\n", - "Order Received: {'result': 'SUCCESSFUL', 'data': {'trade_id': '&L:AMZN20240621C160&S:AMZN20240621C162.5', 'close': 0.6500000000000004, 'long': ['AMZN20240621C160'], 'short': ['AMZN20240621C162.5']}}\n", - "\n", - "===========================\n", - "Buy Details\n", - "Position: {'trade_id': '&L:AMZN20240621C160&S:AMZN20240621C162.5', 'close': 0.6500000000000004, 'long': ['AMZN20240621C160'], 'short': ['AMZN20240621C162.5'], 'quantity': 769, 'cash_equivalent_qty': 769.0}, Date: 2023-07-05, Signal: SignalEvent type:LONG, symbol=AMZN, date:2023-07-05 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:AMZN20230705LONG, parent_event:None\n", - "Max Contract Price: 250.0, Cash at Hand: 500.0\n", - "Cash at Hand 500.0 Close 0.6500000000000004\n", - "===========================\n", - "Processing event: ORDER 2023-07-05 00:00:00\n", - "Processing event: ORDER 2023-07-05 00:00:00\n", - "Processing event: FILL 2023-07-05 00:00:00\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Exception in thread Stock(Ticker: AMZN, Build Date: 2025-06-20 15:10:34)_SetVariables:\n", - "Traceback (most recent call last):\n", - " File \"C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\\lib\\threading.py\", line 1016, in _bootstrap_inner\n", - " self.run()\n", - " File \"c:\\Users\\Zino\\python-playground\\QuantTools\\.venv\\lib\\site-packages\\ipykernel\\ipkernel.py\", line 761, in run_closure\n", - " _threading_Thread_run(self)\n", - " File \"C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\\lib\\threading.py\", line 953, in run\n", - " self._target(*self._args, **self._kwargs)\n", - " File \"C:\\Users\\Zino\\python-playground\\QuantTools\\trade\\assets\\Stock.py\", line 129, in set_variables\n", - " self.prev_close()\n", - " File \"C:\\Users\\Zino\\python-playground\\QuantTools\\trade\\assets\\Stock.py\", line 328, in prev_close\n", - " close = float(obb.equity.price.quote(symbol=self.ticker, provider='fmp').to_dataframe()['prev_close'].values[0])\n", - " File \"c:\\Users\\Zino\\python-playground\\QuantTools\\.venv\\lib\\site-packages\\openbb_core\\app\\static\\utils\\decorators.py\", line 99, in wrapper\n", - " raise OpenBBError(f\"\\n[Error] -> {e}\").with_traceback(tb) from None\n", - " File \"c:\\Users\\Zino\\python-playground\\QuantTools\\.venv\\lib\\site-packages\\openbb_core\\provider\\query_executor.py\", line 57, in filter_credentials\n", - " raise OpenBBError(\n", - "openbb_core.app.model.abstract.error.OpenBBError: \n", - "[Error] -> Missing credential 'fmp_api_key'. Check https://financialmodelingprep.com to get it. Known more about how to set provider credentials at https://docs.openbb.co/platform/getting_started/api_keys.\n", - "Exception in thread Stock(Ticker: TSLA, Build Date: 2025-06-20 15:10:34)_SetVariables:\n", - "Traceback (most recent call last):\n", - " File \"C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\\lib\\threading.py\", line 1016, in _bootstrap_inner\n", - " self.run()\n", - " File \"c:\\Users\\Zino\\python-playground\\QuantTools\\.venv\\lib\\site-packages\\ipykernel\\ipkernel.py\", line 761, in run_closure\n", - " _threading_Thread_run(self)\n", - " File \"C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\\lib\\threading.py\", line 953, in run\n", - " self._target(*self._args, **self._kwargs)\n", - " File \"C:\\Users\\Zino\\python-playground\\QuantTools\\trade\\assets\\Stock.py\", line 129, in set_variables\n", - " self.prev_close()\n", - " File \"C:\\Users\\Zino\\python-playground\\QuantTools\\trade\\assets\\Stock.py\", line 328, in prev_close\n", - " close = float(obb.equity.price.quote(symbol=self.ticker, provider='fmp').to_dataframe()['prev_close'].values[0])\n", - " File \"c:\\Users\\Zino\\python-playground\\QuantTools\\.venv\\lib\\site-packages\\openbb_core\\app\\static\\utils\\decorators.py\", line 99, in wrapper\n", - " raise OpenBBError(f\"\\n[Error] -> {e}\").with_traceback(tb) from None\n", - " File \"c:\\Users\\Zino\\python-playground\\QuantTools\\.venv\\lib\\site-packages\\openbb_core\\provider\\query_executor.py\", line 57, in filter_credentials\n", - " raise OpenBBError(\n", - "openbb_core.app.model.abstract.error.OpenBBError: \n", - "[Error] -> Missing credential 'fmp_api_key'. Check https://financialmodelingprep.com to get it. Known more about how to set provider credentials at https://docs.openbb.co/platform/getting_started/api_keys.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Processing event: FILL 2023-07-05 00:00:00\n", - "Risk Manager Actions: {}\n", - "Event queue is empty, processed 7 event(s)\n", - "Processing event: MARKET 2023-07-06 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20240621C340&S:TSLA20240621C343.33': HOLD(&L:TSLA20240621C340&S:TSLA20240621C343.33) Reason: None), '&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-07-07 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20240621C340&S:TSLA20240621C343.33': HOLD(&L:TSLA20240621C340&S:TSLA20240621C343.33) Reason: None), '&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-07-10 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20240621C340&S:TSLA20240621C343.33': HOLD(&L:TSLA20240621C340&S:TSLA20240621C343.33) Reason: None), '&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-07-11 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20240621C340&S:TSLA20240621C343.33': HOLD(&L:TSLA20240621C340&S:TSLA20240621C343.33) Reason: None), '&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-07-12 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20240621C340&S:TSLA20240621C343.33': HOLD(&L:TSLA20240621C340&S:TSLA20240621C343.33) Reason: None), '&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-07-13 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20240621C340&S:TSLA20240621C343.33': HOLD(&L:TSLA20240621C340&S:TSLA20240621C343.33) Reason: None), '&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-07-14 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20240621C340&S:TSLA20240621C343.33': HOLD(&L:TSLA20240621C340&S:TSLA20240621C343.33) Reason: None), '&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Enforcing order event injection for testing purposes\n", - "Order event injected for TSLA at2023-07-18, position: {'trade_id': '&L:TSLA20240621C340&S:TSLA20240621C343.33', 'close': 0.9249999999999972, 'long': ['TSLA20240621C340'], 'short': ['TSLA20240621C343.33'], 'quantity': 689, 'cash_equivalent_qty': 689.0}\n", - "Processing event: MARKET 2023-07-17 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20240621C340&S:TSLA20240621C343.33': HOLD(&L:TSLA20240621C340&S:TSLA20240621C343.33) Reason: None), '&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-07-18 00:00:00\n", - "Processing event: ORDER 2023-07-18 00:00:00\n", - "Processing event: FILL 2023-07-18 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20240621C340&S:TSLA20240621C343.33': HOLD(&L:TSLA20240621C340&S:TSLA20240621C343.33) Reason: None), '&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 3 event(s)\n", - "Processing event: MARKET 2023-07-19 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20240621C340&S:TSLA20240621C343.33': HOLD(&L:TSLA20240621C340&S:TSLA20240621C343.33) Reason: None), '&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-07-20 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20240621C340&S:TSLA20240621C343.33': HOLD(&L:TSLA20240621C340&S:TSLA20240621C343.33) Reason: None), '&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-07-21 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20240621C340&S:TSLA20240621C343.33': HOLD(&L:TSLA20240621C340&S:TSLA20240621C343.33) Reason: None), '&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-07-24 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20240621C340&S:TSLA20240621C343.33': HOLD(&L:TSLA20240621C340&S:TSLA20240621C343.33) Reason: None), '&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-07-25 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20240621C340&S:TSLA20240621C343.33': HOLD(&L:TSLA20240621C340&S:TSLA20240621C343.33) Reason: None), '&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-07-26 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20240621C340&S:TSLA20240621C343.33': HOLD(&L:TSLA20240621C340&S:TSLA20240621C343.33) Reason: None), '&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-07-27 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20240621C340&S:TSLA20240621C343.33': HOLD(&L:TSLA20240621C340&S:TSLA20240621C343.33) Reason: None), '&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-07-28 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20240621C340&S:TSLA20240621C343.33': HOLD(&L:TSLA20240621C340&S:TSLA20240621C343.33) Reason: None), '&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-07-31 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20240621C340&S:TSLA20240621C343.33': HOLD(&L:TSLA20240621C340&S:TSLA20240621C343.33) Reason: None), '&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-08-01 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20240621C340&S:TSLA20240621C343.33': HOLD(&L:TSLA20240621C340&S:TSLA20240621C343.33) Reason: None), '&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-08-02 00:00:00\n", - "Processing event: SIGNAL 2023-08-02 00:00:00\n", - "Processing event: ORDER 2023-08-02 00:00:00\n", - "Processing event: FILL 2023-08-02 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 4 event(s)\n", - "Processing event: MARKET 2023-08-03 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-08-04 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-08-07 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-08-08 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-08-09 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-08-10 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-08-11 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-08-14 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-08-15 00:00:00\n", - "No positions need to be adjusted on 2023-08-15 00:00:00\n", - "Risk Manager Actions: NO_POSITIONS_TO_ADJUST\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-08-16 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-08-17 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-08-18 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-08-21 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-08-22 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-08-23 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-08-24 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-08-25 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-08-28 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-08-29 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-08-30 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-08-31 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-09-01 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-09-04 00:00:00\n", - "Risk Manager Actions: IS_HOLIDAY\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-09-05 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-09-06 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-09-07 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-09-08 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-09-11 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-09-12 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-09-13 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-09-14 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-09-15 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-09-18 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-09-19 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-09-20 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-09-21 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-09-22 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-09-25 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-09-26 00:00:00\n", - "No positions need to be adjusted on 2023-09-26 00:00:00\n", - "Risk Manager Actions: NO_POSITIONS_TO_ADJUST\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-09-27 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-09-28 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-09-29 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-10-02 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-10-03 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-10-04 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-10-05 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-10-06 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-10-09 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-10-10 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-10-11 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-10-12 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-10-13 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-10-16 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-10-17 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-10-18 00:00:00\n", - "No positions need to be adjusted on 2023-10-18 00:00:00\n", - "Risk Manager Actions: NO_POSITIONS_TO_ADJUST\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-10-19 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-10-20 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-10-23 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-10-24 00:00:00\n", - "Risk Manager Actions: {'&L:AMZN20240621C160&S:AMZN20240621C162.5': HOLD(&L:AMZN20240621C160&S:AMZN20240621C162.5) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2023-10-25 00:00:00\n", - "Processing event: SIGNAL 2023-10-25 00:00:00\n", - "Processing event: ORDER 2023-10-25 00:00:00\n", - "Processing event: FILL 2023-10-25 00:00:00\n", - "No positions need to be adjusted on 2023-10-25 00:00:00\n", - "Risk Manager Actions: NO_POSITIONS_TO_ADJUST\n", - "Event queue is empty, processed 4 event(s)\n", - "No more dates left.\n" - ] - } - ], - "source": [ - "import cProfile\n", - "import pstats\n", - "import io\n", - "\n", - "profiler = cProfile.Profile()\n", - "profiler.enable() \n", - "\n", - "evb_backtest.run()\n", - "profiler.disable()\n", - "stream = io.StringIO()\n", - "stats = pstats.Stats(profiler, stream=stream).sort_stats('cumulative')" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
typesymbolsignal_typesignal_idmax_contract_priceorder_settingsparent_eventorder_typecashquantitydirectionpositionexchangefill_costmarket_valueslippagecommission
datetime
2023-07-05MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-07-05SIGNALTSLALONGTSLA20230705LONGNaNNaNNoneNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-07-05SIGNALAMZNLONGAMZN20230705LONGNaNNaNNoneNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-07-05ORDERTSLANaNTSLA20230705LONGNaNNaNSignalEvent type:LONG, symbol=TSLA, date:2023-...MKT500.0689.0BUY{'trade_id': '&L:TSLA20240621C340&S:TSLA202406...NaNNaNNaNNaNNaN
2023-07-05ORDERAMZNNaNAMZN20230705LONGNaNNaNSignalEvent type:LONG, symbol=AMZN, date:2023-...MKT500.0769.0BUY{'trade_id': '&L:AMZN20240621C160&S:AMZN202406...NaNNaNNaNNaNNaN
2023-07-05FILLTSLANaNTSLA20230705LONGNaNNaNOrderEvent type=MKT, symbol=TSLA, date:2023-07...NaNNaN593.0BUY{'trade_id': '&L:TSLA20240621C340&S:TSLA202406...ARCA501.648193429.92568.4142533.30894
2023-07-05FILLAMZNNaNAMZN20230705LONGNaNNaNOrderEvent type=MKT, symbol=AMZN, date:2023-07...NaNNaN653.0BUY{'trade_id': '&L:AMZN20240621C160&S:AMZN202406...ARCA501.750267424.45073.6565273.64374
2023-07-06MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-07-07MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-07-10MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-07-11MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-07-12MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-07-13MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-07-14MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-07-17MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-07-18MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-07-18ORDERTSLANaNTSLA20230705LONGNaNNaNNoneMKTNaN33.0SELL{'trade_id': '&L:TSLA20240621C340&S:TSLA202406...NaNNaNNaNNaNNaN
2023-07-18FILLTSLANaNTSLA20230705LONGNaNNaNOrderEvent type=MKT, symbol=TSLA, date:2023-07...NaNNaN33.0SELL{'trade_id': '&L:TSLA20240621C340&S:TSLA202406...ARCA24.66245733.000-8.1534030.18414
2023-07-19MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-07-20MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-07-21MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-07-24MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-07-25MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-07-26MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-07-27MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-07-28MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-07-31MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-08-01MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-08-02MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-08-02SIGNALTSLACLOSETSLA20230705LONGNaNNaNNoneNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-08-02ORDERTSLANaNTSLA20230705LONGNaNNaNSignalEvent type:CLOSE, symbol=TSLA, date:2023...MKTNaN560.0SELL{'trade_id': '&L:TSLA20240621C340&S:TSLA202406...NaNNaNNaNNaNNaN
2023-08-02FILLTSLANaNTSLA20230705LONGNaNNaNOrderEvent type=MKT, symbol=TSLA, date:2023-08...NaNNaN560.0SELL{'trade_id': '&L:TSLA20240621C340&S:TSLA202406...ARCA310.756416406.000-92.1187843.12480
2023-08-03MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-08-04MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-08-07MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-08-08MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-08-09MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-08-10MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-08-11MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-08-14MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-08-15MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-08-16MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-08-17MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-08-18MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-08-21MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-08-22MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-08-23MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-08-24MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-08-25MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-08-28MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-08-29MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-08-30MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-08-31MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-09-01MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-09-04MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-09-05MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-09-06MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-09-07MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-09-08MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-09-11MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-09-12MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-09-13MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-09-14MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-09-15MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-09-18MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-09-19MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-09-20MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-09-21MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-09-22MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-09-25MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-09-26MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-09-27MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-09-28MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-09-29MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-10-02MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-10-03MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-10-04MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-10-05MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-10-06MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-10-09MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-10-10MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-10-11MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-10-12MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-10-13MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-10-16MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-10-17MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-10-18MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-10-19MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-10-20MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-10-23MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-10-24MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-10-25MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-10-25SIGNALAMZNCLOSEAMZN20230705LONGNaNNaNNoneNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-10-25ORDERAMZNNaNAMZN20230705LONGNaNNaNSignalEvent type:CLOSE, symbol=AMZN, date:2023...MKTNaN653.0SELL{'trade_id': '&L:AMZN20240621C160&S:AMZN202406...NaNNaNNaNNaNNaN
2023-10-25FILLAMZNNaNAMZN20230705LONGNaNNaNOrderEvent type=MKT, symbol=AMZN, date:2023-10...NaNNaN653.0SELL{'trade_id': '&L:AMZN20240621C160&S:AMZN202406...ARCA239.175710261.200-18.3805503.64374
\n", - "
" - ], - "text/plain": [ - " type symbol signal_type signal_id max_contract_price \\\n", - "datetime \n", - "2023-07-05 MARKET NaN NaN NaN NaN \n", - "2023-07-05 SIGNAL TSLA LONG TSLA20230705LONG NaN \n", - "2023-07-05 SIGNAL AMZN LONG AMZN20230705LONG NaN \n", - "2023-07-05 ORDER TSLA NaN TSLA20230705LONG NaN \n", - "2023-07-05 ORDER AMZN NaN AMZN20230705LONG NaN \n", - "2023-07-05 FILL TSLA NaN TSLA20230705LONG NaN \n", - "2023-07-05 FILL AMZN NaN AMZN20230705LONG NaN \n", - "2023-07-06 MARKET NaN NaN NaN NaN \n", - "2023-07-07 MARKET NaN NaN NaN NaN \n", - "2023-07-10 MARKET NaN NaN NaN NaN \n", - "2023-07-11 MARKET NaN NaN NaN NaN \n", - "2023-07-12 MARKET NaN NaN NaN NaN \n", - "2023-07-13 MARKET NaN NaN NaN NaN \n", - "2023-07-14 MARKET NaN NaN NaN NaN \n", - "2023-07-17 MARKET NaN NaN NaN NaN \n", - "2023-07-18 MARKET NaN NaN NaN NaN \n", - "2023-07-18 ORDER TSLA NaN TSLA20230705LONG NaN \n", - "2023-07-18 FILL TSLA NaN TSLA20230705LONG NaN \n", - "2023-07-19 MARKET NaN NaN NaN NaN \n", - "2023-07-20 MARKET NaN NaN NaN NaN \n", - "2023-07-21 MARKET NaN NaN NaN NaN \n", - "2023-07-24 MARKET NaN NaN NaN NaN \n", - "2023-07-25 MARKET NaN NaN NaN NaN \n", - "2023-07-26 MARKET NaN NaN NaN NaN \n", - "2023-07-27 MARKET NaN NaN NaN NaN \n", - "2023-07-28 MARKET NaN NaN NaN NaN \n", - "2023-07-31 MARKET NaN NaN NaN NaN \n", - "2023-08-01 MARKET NaN NaN NaN NaN \n", - "2023-08-02 MARKET NaN NaN NaN NaN \n", - "2023-08-02 SIGNAL TSLA CLOSE TSLA20230705LONG NaN \n", - "2023-08-02 ORDER TSLA NaN TSLA20230705LONG NaN \n", - "2023-08-02 FILL TSLA NaN TSLA20230705LONG NaN \n", - "2023-08-03 MARKET NaN NaN NaN NaN \n", - "2023-08-04 MARKET NaN NaN NaN NaN \n", - "2023-08-07 MARKET NaN NaN NaN NaN \n", - "2023-08-08 MARKET NaN NaN NaN NaN \n", - "2023-08-09 MARKET NaN NaN NaN NaN \n", - "2023-08-10 MARKET NaN NaN NaN NaN \n", - "2023-08-11 MARKET NaN NaN NaN NaN \n", - "2023-08-14 MARKET NaN NaN NaN NaN \n", - "2023-08-15 MARKET NaN NaN NaN NaN \n", - "2023-08-16 MARKET NaN NaN NaN NaN \n", - "2023-08-17 MARKET NaN NaN NaN NaN \n", - "2023-08-18 MARKET NaN NaN NaN NaN \n", - "2023-08-21 MARKET NaN NaN NaN NaN \n", - "2023-08-22 MARKET NaN NaN NaN NaN \n", - "2023-08-23 MARKET NaN NaN NaN NaN \n", - "2023-08-24 MARKET NaN NaN NaN NaN \n", - "2023-08-25 MARKET NaN NaN NaN NaN \n", - "2023-08-28 MARKET NaN NaN NaN NaN \n", - "2023-08-29 MARKET NaN NaN NaN NaN \n", - "2023-08-30 MARKET NaN NaN NaN NaN \n", - "2023-08-31 MARKET NaN NaN NaN NaN \n", - "2023-09-01 MARKET NaN NaN NaN NaN \n", - "2023-09-04 MARKET NaN NaN NaN NaN \n", - "2023-09-05 MARKET NaN NaN NaN NaN \n", - "2023-09-06 MARKET NaN NaN NaN NaN \n", - "2023-09-07 MARKET NaN NaN NaN NaN \n", - "2023-09-08 MARKET NaN NaN NaN NaN \n", - "2023-09-11 MARKET NaN NaN NaN NaN \n", - "2023-09-12 MARKET NaN NaN NaN NaN \n", - "2023-09-13 MARKET NaN NaN NaN NaN \n", - "2023-09-14 MARKET NaN NaN NaN NaN \n", - "2023-09-15 MARKET NaN NaN NaN NaN \n", - "2023-09-18 MARKET NaN NaN NaN NaN \n", - "2023-09-19 MARKET NaN NaN NaN NaN \n", - "2023-09-20 MARKET NaN NaN NaN NaN \n", - "2023-09-21 MARKET NaN NaN NaN NaN \n", - "2023-09-22 MARKET NaN NaN NaN NaN \n", - "2023-09-25 MARKET NaN NaN NaN NaN \n", - "2023-09-26 MARKET NaN NaN NaN NaN \n", - "2023-09-27 MARKET NaN NaN NaN NaN \n", - "2023-09-28 MARKET NaN NaN NaN NaN \n", - "2023-09-29 MARKET NaN NaN NaN NaN \n", - "2023-10-02 MARKET NaN NaN NaN NaN \n", - "2023-10-03 MARKET NaN NaN NaN NaN \n", - "2023-10-04 MARKET NaN NaN NaN NaN \n", - "2023-10-05 MARKET NaN NaN NaN NaN \n", - "2023-10-06 MARKET NaN NaN NaN NaN \n", - "2023-10-09 MARKET NaN NaN NaN NaN \n", - "2023-10-10 MARKET NaN NaN NaN NaN \n", - "2023-10-11 MARKET NaN NaN NaN NaN \n", - "2023-10-12 MARKET NaN NaN NaN NaN \n", - "2023-10-13 MARKET NaN NaN NaN NaN \n", - "2023-10-16 MARKET NaN NaN NaN NaN \n", - "2023-10-17 MARKET NaN NaN NaN NaN \n", - "2023-10-18 MARKET NaN NaN NaN NaN \n", - "2023-10-19 MARKET NaN NaN NaN NaN \n", - "2023-10-20 MARKET NaN NaN NaN NaN \n", - "2023-10-23 MARKET NaN NaN NaN NaN \n", - "2023-10-24 MARKET NaN NaN NaN NaN \n", - "2023-10-25 MARKET NaN NaN NaN NaN \n", - "2023-10-25 SIGNAL AMZN CLOSE AMZN20230705LONG NaN \n", - "2023-10-25 ORDER AMZN NaN AMZN20230705LONG NaN \n", - "2023-10-25 FILL AMZN NaN AMZN20230705LONG NaN \n", - "\n", - " order_settings parent_event \\\n", - "datetime \n", - "2023-07-05 NaN NaN \n", - "2023-07-05 NaN None \n", - "2023-07-05 NaN None \n", - "2023-07-05 NaN SignalEvent type:LONG, symbol=TSLA, date:2023-... \n", - "2023-07-05 NaN SignalEvent type:LONG, symbol=AMZN, date:2023-... \n", - "2023-07-05 NaN OrderEvent type=MKT, symbol=TSLA, date:2023-07... \n", - "2023-07-05 NaN OrderEvent type=MKT, symbol=AMZN, date:2023-07... \n", - "2023-07-06 NaN NaN \n", - "2023-07-07 NaN NaN \n", - "2023-07-10 NaN NaN \n", - "2023-07-11 NaN NaN \n", - "2023-07-12 NaN NaN \n", - "2023-07-13 NaN NaN \n", - "2023-07-14 NaN NaN \n", - "2023-07-17 NaN NaN \n", - "2023-07-18 NaN NaN \n", - "2023-07-18 NaN None \n", - "2023-07-18 NaN OrderEvent type=MKT, symbol=TSLA, date:2023-07... \n", - "2023-07-19 NaN NaN \n", - "2023-07-20 NaN NaN \n", - "2023-07-21 NaN NaN \n", - "2023-07-24 NaN NaN \n", - "2023-07-25 NaN NaN \n", - "2023-07-26 NaN NaN \n", - "2023-07-27 NaN NaN \n", - "2023-07-28 NaN NaN \n", - "2023-07-31 NaN NaN \n", - "2023-08-01 NaN NaN \n", - "2023-08-02 NaN NaN \n", - "2023-08-02 NaN None \n", - "2023-08-02 NaN SignalEvent type:CLOSE, symbol=TSLA, date:2023... \n", - "2023-08-02 NaN OrderEvent type=MKT, symbol=TSLA, date:2023-08... \n", - "2023-08-03 NaN NaN \n", - "2023-08-04 NaN NaN \n", - "2023-08-07 NaN NaN \n", - "2023-08-08 NaN NaN \n", - "2023-08-09 NaN NaN \n", - "2023-08-10 NaN NaN \n", - "2023-08-11 NaN NaN \n", - "2023-08-14 NaN NaN \n", - "2023-08-15 NaN NaN \n", - "2023-08-16 NaN NaN \n", - "2023-08-17 NaN NaN \n", - "2023-08-18 NaN NaN \n", - "2023-08-21 NaN NaN \n", - "2023-08-22 NaN NaN \n", - "2023-08-23 NaN NaN \n", - "2023-08-24 NaN NaN \n", - "2023-08-25 NaN NaN \n", - "2023-08-28 NaN NaN \n", - "2023-08-29 NaN NaN \n", - "2023-08-30 NaN NaN \n", - "2023-08-31 NaN NaN \n", - "2023-09-01 NaN NaN \n", - "2023-09-04 NaN NaN \n", - "2023-09-05 NaN NaN \n", - "2023-09-06 NaN NaN \n", - "2023-09-07 NaN NaN \n", - "2023-09-08 NaN NaN \n", - "2023-09-11 NaN NaN \n", - "2023-09-12 NaN NaN \n", - "2023-09-13 NaN NaN \n", - "2023-09-14 NaN NaN \n", - "2023-09-15 NaN NaN \n", - "2023-09-18 NaN NaN \n", - "2023-09-19 NaN NaN \n", - "2023-09-20 NaN NaN \n", - "2023-09-21 NaN NaN \n", - "2023-09-22 NaN NaN \n", - "2023-09-25 NaN NaN \n", - "2023-09-26 NaN NaN \n", - "2023-09-27 NaN NaN \n", - "2023-09-28 NaN NaN \n", - "2023-09-29 NaN NaN \n", - "2023-10-02 NaN NaN \n", - "2023-10-03 NaN NaN \n", - "2023-10-04 NaN NaN \n", - "2023-10-05 NaN NaN \n", - "2023-10-06 NaN NaN \n", - "2023-10-09 NaN NaN \n", - "2023-10-10 NaN NaN \n", - "2023-10-11 NaN NaN \n", - "2023-10-12 NaN NaN \n", - "2023-10-13 NaN NaN \n", - "2023-10-16 NaN NaN \n", - "2023-10-17 NaN NaN \n", - "2023-10-18 NaN NaN \n", - "2023-10-19 NaN NaN \n", - "2023-10-20 NaN NaN \n", - "2023-10-23 NaN NaN \n", - "2023-10-24 NaN NaN \n", - "2023-10-25 NaN NaN \n", - "2023-10-25 NaN None \n", - "2023-10-25 NaN SignalEvent type:CLOSE, symbol=AMZN, date:2023... \n", - "2023-10-25 NaN OrderEvent type=MKT, symbol=AMZN, date:2023-10... \n", - "\n", - " order_type cash quantity direction \\\n", - "datetime \n", - "2023-07-05 NaN NaN NaN NaN \n", - "2023-07-05 NaN NaN NaN NaN \n", - "2023-07-05 NaN NaN NaN NaN \n", - "2023-07-05 MKT 500.0 689.0 BUY \n", - "2023-07-05 MKT 500.0 769.0 BUY \n", - "2023-07-05 NaN NaN 593.0 BUY \n", - "2023-07-05 NaN NaN 653.0 BUY \n", - "2023-07-06 NaN NaN NaN NaN \n", - "2023-07-07 NaN NaN NaN NaN \n", - "2023-07-10 NaN NaN NaN NaN \n", - "2023-07-11 NaN NaN NaN NaN \n", - "2023-07-12 NaN NaN NaN NaN \n", - "2023-07-13 NaN NaN NaN NaN \n", - "2023-07-14 NaN NaN NaN NaN \n", - "2023-07-17 NaN NaN NaN NaN \n", - "2023-07-18 NaN NaN NaN NaN \n", - "2023-07-18 MKT NaN 33.0 SELL \n", - "2023-07-18 NaN NaN 33.0 SELL \n", - "2023-07-19 NaN NaN NaN NaN \n", - "2023-07-20 NaN NaN NaN NaN \n", - "2023-07-21 NaN NaN NaN NaN \n", - "2023-07-24 NaN NaN NaN NaN \n", - "2023-07-25 NaN NaN NaN NaN \n", - "2023-07-26 NaN NaN NaN NaN \n", - "2023-07-27 NaN NaN NaN NaN \n", - "2023-07-28 NaN NaN NaN NaN \n", - "2023-07-31 NaN NaN NaN NaN \n", - "2023-08-01 NaN NaN NaN NaN \n", - "2023-08-02 NaN NaN NaN NaN \n", - "2023-08-02 NaN NaN NaN NaN \n", - "2023-08-02 MKT NaN 560.0 SELL \n", - "2023-08-02 NaN NaN 560.0 SELL \n", - "2023-08-03 NaN NaN NaN NaN \n", - "2023-08-04 NaN NaN NaN NaN \n", - "2023-08-07 NaN NaN NaN NaN \n", - "2023-08-08 NaN NaN NaN NaN \n", - "2023-08-09 NaN NaN NaN NaN \n", - "2023-08-10 NaN NaN NaN NaN \n", - "2023-08-11 NaN NaN NaN NaN \n", - "2023-08-14 NaN NaN NaN NaN \n", - "2023-08-15 NaN NaN NaN NaN \n", - "2023-08-16 NaN NaN NaN NaN \n", - "2023-08-17 NaN NaN NaN NaN \n", - "2023-08-18 NaN NaN NaN NaN \n", - "2023-08-21 NaN NaN NaN NaN \n", - "2023-08-22 NaN NaN NaN NaN \n", - "2023-08-23 NaN NaN NaN NaN \n", - "2023-08-24 NaN NaN NaN NaN \n", - "2023-08-25 NaN NaN NaN NaN \n", - "2023-08-28 NaN NaN NaN NaN \n", - "2023-08-29 NaN NaN NaN NaN \n", - "2023-08-30 NaN NaN NaN NaN \n", - "2023-08-31 NaN NaN NaN NaN \n", - "2023-09-01 NaN NaN NaN NaN \n", - "2023-09-04 NaN NaN NaN NaN \n", - "2023-09-05 NaN NaN NaN NaN \n", - "2023-09-06 NaN NaN NaN NaN \n", - "2023-09-07 NaN NaN NaN NaN \n", - "2023-09-08 NaN NaN NaN NaN \n", - "2023-09-11 NaN NaN NaN NaN \n", - "2023-09-12 NaN NaN NaN NaN \n", - "2023-09-13 NaN NaN NaN NaN \n", - "2023-09-14 NaN NaN NaN NaN \n", - "2023-09-15 NaN NaN NaN NaN \n", - "2023-09-18 NaN NaN NaN NaN \n", - "2023-09-19 NaN NaN NaN NaN \n", - "2023-09-20 NaN NaN NaN NaN \n", - "2023-09-21 NaN NaN NaN NaN \n", - "2023-09-22 NaN NaN NaN NaN \n", - "2023-09-25 NaN NaN NaN NaN \n", - "2023-09-26 NaN NaN NaN NaN \n", - "2023-09-27 NaN NaN NaN NaN \n", - "2023-09-28 NaN NaN NaN NaN \n", - "2023-09-29 NaN NaN NaN NaN \n", - "2023-10-02 NaN NaN NaN NaN \n", - "2023-10-03 NaN NaN NaN NaN \n", - "2023-10-04 NaN NaN NaN NaN \n", - "2023-10-05 NaN NaN NaN NaN \n", - "2023-10-06 NaN NaN NaN NaN \n", - "2023-10-09 NaN NaN NaN NaN \n", - "2023-10-10 NaN NaN NaN NaN \n", - "2023-10-11 NaN NaN NaN NaN \n", - "2023-10-12 NaN NaN NaN NaN \n", - "2023-10-13 NaN NaN NaN NaN \n", - "2023-10-16 NaN NaN NaN NaN \n", - "2023-10-17 NaN NaN NaN NaN \n", - "2023-10-18 NaN NaN NaN NaN \n", - "2023-10-19 NaN NaN NaN NaN \n", - "2023-10-20 NaN NaN NaN NaN \n", - "2023-10-23 NaN NaN NaN NaN \n", - "2023-10-24 NaN NaN NaN NaN \n", - "2023-10-25 NaN NaN NaN NaN \n", - "2023-10-25 NaN NaN NaN NaN \n", - "2023-10-25 MKT NaN 653.0 SELL \n", - "2023-10-25 NaN NaN 653.0 SELL \n", - "\n", - " position exchange \\\n", - "datetime \n", - "2023-07-05 NaN NaN \n", - "2023-07-05 NaN NaN \n", - "2023-07-05 NaN NaN \n", - "2023-07-05 {'trade_id': '&L:TSLA20240621C340&S:TSLA202406... NaN \n", - "2023-07-05 {'trade_id': '&L:AMZN20240621C160&S:AMZN202406... NaN \n", - "2023-07-05 {'trade_id': '&L:TSLA20240621C340&S:TSLA202406... ARCA \n", - "2023-07-05 {'trade_id': '&L:AMZN20240621C160&S:AMZN202406... ARCA \n", - "2023-07-06 NaN NaN \n", - "2023-07-07 NaN NaN \n", - "2023-07-10 NaN NaN \n", - "2023-07-11 NaN NaN \n", - "2023-07-12 NaN NaN \n", - "2023-07-13 NaN NaN \n", - "2023-07-14 NaN NaN \n", - "2023-07-17 NaN NaN \n", - "2023-07-18 NaN NaN \n", - "2023-07-18 {'trade_id': '&L:TSLA20240621C340&S:TSLA202406... NaN \n", - "2023-07-18 {'trade_id': '&L:TSLA20240621C340&S:TSLA202406... ARCA \n", - "2023-07-19 NaN NaN \n", - "2023-07-20 NaN NaN \n", - "2023-07-21 NaN NaN \n", - "2023-07-24 NaN NaN \n", - "2023-07-25 NaN NaN \n", - "2023-07-26 NaN NaN \n", - "2023-07-27 NaN NaN \n", - "2023-07-28 NaN NaN \n", - "2023-07-31 NaN NaN \n", - "2023-08-01 NaN NaN \n", - "2023-08-02 NaN NaN \n", - "2023-08-02 NaN NaN \n", - "2023-08-02 {'trade_id': '&L:TSLA20240621C340&S:TSLA202406... NaN \n", - "2023-08-02 {'trade_id': '&L:TSLA20240621C340&S:TSLA202406... ARCA \n", - "2023-08-03 NaN NaN \n", - "2023-08-04 NaN NaN \n", - "2023-08-07 NaN NaN \n", - "2023-08-08 NaN NaN \n", - "2023-08-09 NaN NaN \n", - "2023-08-10 NaN NaN \n", - "2023-08-11 NaN NaN \n", - "2023-08-14 NaN NaN \n", - "2023-08-15 NaN NaN \n", - "2023-08-16 NaN NaN \n", - "2023-08-17 NaN NaN \n", - "2023-08-18 NaN NaN \n", - "2023-08-21 NaN NaN \n", - "2023-08-22 NaN NaN \n", - "2023-08-23 NaN NaN \n", - "2023-08-24 NaN NaN \n", - "2023-08-25 NaN NaN \n", - "2023-08-28 NaN NaN \n", - "2023-08-29 NaN NaN \n", - "2023-08-30 NaN NaN \n", - "2023-08-31 NaN NaN \n", - "2023-09-01 NaN NaN \n", - "2023-09-04 NaN NaN \n", - "2023-09-05 NaN NaN \n", - "2023-09-06 NaN NaN \n", - "2023-09-07 NaN NaN \n", - "2023-09-08 NaN NaN \n", - "2023-09-11 NaN NaN \n", - "2023-09-12 NaN NaN \n", - "2023-09-13 NaN NaN \n", - "2023-09-14 NaN NaN \n", - "2023-09-15 NaN NaN \n", - "2023-09-18 NaN NaN \n", - "2023-09-19 NaN NaN \n", - "2023-09-20 NaN NaN \n", - "2023-09-21 NaN NaN \n", - "2023-09-22 NaN NaN \n", - "2023-09-25 NaN NaN \n", - "2023-09-26 NaN NaN \n", - "2023-09-27 NaN NaN \n", - "2023-09-28 NaN NaN \n", - "2023-09-29 NaN NaN \n", - "2023-10-02 NaN NaN \n", - "2023-10-03 NaN NaN \n", - "2023-10-04 NaN NaN \n", - "2023-10-05 NaN NaN \n", - "2023-10-06 NaN NaN \n", - "2023-10-09 NaN NaN \n", - "2023-10-10 NaN NaN \n", - "2023-10-11 NaN NaN \n", - "2023-10-12 NaN NaN \n", - "2023-10-13 NaN NaN \n", - "2023-10-16 NaN NaN \n", - "2023-10-17 NaN NaN \n", - "2023-10-18 NaN NaN \n", - "2023-10-19 NaN NaN \n", - "2023-10-20 NaN NaN \n", - "2023-10-23 NaN NaN \n", - "2023-10-24 NaN NaN \n", - "2023-10-25 NaN NaN \n", - "2023-10-25 NaN NaN \n", - "2023-10-25 {'trade_id': '&L:AMZN20240621C160&S:AMZN202406... NaN \n", - "2023-10-25 {'trade_id': '&L:AMZN20240621C160&S:AMZN202406... ARCA \n", - "\n", - " fill_cost market_value slippage commission \n", - "datetime \n", - "2023-07-05 NaN NaN NaN NaN \n", - "2023-07-05 NaN NaN NaN NaN \n", - "2023-07-05 NaN NaN NaN NaN \n", - "2023-07-05 NaN NaN NaN NaN \n", - "2023-07-05 NaN NaN NaN NaN \n", - "2023-07-05 501.648193 429.925 68.414253 3.30894 \n", - "2023-07-05 501.750267 424.450 73.656527 3.64374 \n", - "2023-07-06 NaN NaN NaN NaN \n", - "2023-07-07 NaN NaN NaN NaN \n", - "2023-07-10 NaN NaN NaN NaN \n", - "2023-07-11 NaN NaN NaN NaN \n", - "2023-07-12 NaN NaN NaN NaN \n", - "2023-07-13 NaN NaN NaN NaN \n", - "2023-07-14 NaN NaN NaN NaN \n", - "2023-07-17 NaN NaN NaN NaN \n", - "2023-07-18 NaN NaN NaN NaN \n", - "2023-07-18 NaN NaN NaN NaN \n", - "2023-07-18 24.662457 33.000 -8.153403 0.18414 \n", - "2023-07-19 NaN NaN NaN NaN \n", - "2023-07-20 NaN NaN NaN NaN \n", - "2023-07-21 NaN NaN NaN NaN \n", - "2023-07-24 NaN NaN NaN NaN \n", - "2023-07-25 NaN NaN NaN NaN \n", - "2023-07-26 NaN NaN NaN NaN \n", - "2023-07-27 NaN NaN NaN NaN \n", - "2023-07-28 NaN NaN NaN NaN \n", - "2023-07-31 NaN NaN NaN NaN \n", - "2023-08-01 NaN NaN NaN NaN \n", - "2023-08-02 NaN NaN NaN NaN \n", - "2023-08-02 NaN NaN NaN NaN \n", - "2023-08-02 NaN NaN NaN NaN \n", - "2023-08-02 310.756416 406.000 -92.118784 3.12480 \n", - "2023-08-03 NaN NaN NaN NaN \n", - "2023-08-04 NaN NaN NaN NaN \n", - "2023-08-07 NaN NaN NaN NaN \n", - "2023-08-08 NaN NaN NaN NaN \n", - "2023-08-09 NaN NaN NaN NaN \n", - "2023-08-10 NaN NaN NaN NaN \n", - "2023-08-11 NaN NaN NaN NaN \n", - "2023-08-14 NaN NaN NaN NaN \n", - "2023-08-15 NaN NaN NaN NaN \n", - "2023-08-16 NaN NaN NaN NaN \n", - "2023-08-17 NaN NaN NaN NaN \n", - "2023-08-18 NaN NaN NaN NaN \n", - "2023-08-21 NaN NaN NaN NaN \n", - "2023-08-22 NaN NaN NaN NaN \n", - "2023-08-23 NaN NaN NaN NaN \n", - "2023-08-24 NaN NaN NaN NaN \n", - "2023-08-25 NaN NaN NaN NaN \n", - "2023-08-28 NaN NaN NaN NaN \n", - "2023-08-29 NaN NaN NaN NaN \n", - "2023-08-30 NaN NaN NaN NaN \n", - "2023-08-31 NaN NaN NaN NaN \n", - "2023-09-01 NaN NaN NaN NaN \n", - "2023-09-04 NaN NaN NaN NaN \n", - "2023-09-05 NaN NaN NaN NaN \n", - "2023-09-06 NaN NaN NaN NaN \n", - "2023-09-07 NaN NaN NaN NaN \n", - "2023-09-08 NaN NaN NaN NaN \n", - "2023-09-11 NaN NaN NaN NaN \n", - "2023-09-12 NaN NaN NaN NaN \n", - "2023-09-13 NaN NaN NaN NaN \n", - "2023-09-14 NaN NaN NaN NaN \n", - "2023-09-15 NaN NaN NaN NaN \n", - "2023-09-18 NaN NaN NaN NaN \n", - "2023-09-19 NaN NaN NaN NaN \n", - "2023-09-20 NaN NaN NaN NaN \n", - "2023-09-21 NaN NaN NaN NaN \n", - "2023-09-22 NaN NaN NaN NaN \n", - "2023-09-25 NaN NaN NaN NaN \n", - "2023-09-26 NaN NaN NaN NaN \n", - "2023-09-27 NaN NaN NaN NaN \n", - "2023-09-28 NaN NaN NaN NaN \n", - "2023-09-29 NaN NaN NaN NaN \n", - "2023-10-02 NaN NaN NaN NaN \n", - "2023-10-03 NaN NaN NaN NaN \n", - "2023-10-04 NaN NaN NaN NaN \n", - "2023-10-05 NaN NaN NaN NaN \n", - "2023-10-06 NaN NaN NaN NaN \n", - "2023-10-09 NaN NaN NaN NaN \n", - "2023-10-10 NaN NaN NaN NaN \n", - "2023-10-11 NaN NaN NaN NaN \n", - "2023-10-12 NaN NaN NaN NaN \n", - "2023-10-13 NaN NaN NaN NaN \n", - "2023-10-16 NaN NaN NaN NaN \n", - "2023-10-17 NaN NaN NaN NaN \n", - "2023-10-18 NaN NaN NaN NaN \n", - "2023-10-19 NaN NaN NaN NaN \n", - "2023-10-20 NaN NaN NaN NaN \n", - "2023-10-23 NaN NaN NaN NaN \n", - "2023-10-24 NaN NaN NaN NaN \n", - "2023-10-25 NaN NaN NaN NaN \n", - "2023-10-25 NaN NaN NaN NaN \n", - "2023-10-25 NaN NaN NaN NaN \n", - "2023-10-25 239.175710 261.200 -18.380550 3.64374 " - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.get_events()" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
datetimeuidpricequantitysymbolcommissionmarket_valueslippagetotal_costaux_costdirectiontransaction_type
02023-07-05&L:TSLA20240621C340&S:TSLA20240621C343.33_TSLA...73.168977689TSLA384.46250028.96327076.46327050413.425270460.925270BUYBUY
12023-08-02&L:TSLA20240621C340&S:TSLA20240621C343.33_TSLA...71.80351333TSLA18.4142387.929919-4.5700812369.51591922.984081SELLSELL
22023-08-02&L:TSLA20240621C340&S:TSLA20240621C343.33_TSLA...71.860452656TSLA366.04847506.504623-53.49537747140.456623419.543377SELLSELL
\n", - "
" - ], - "text/plain": [ - " datetime uid price \\\n", - "0 2023-07-05 &L:TSLA20240621C340&S:TSLA20240621C343.33_TSLA... 73.168977 \n", - "1 2023-08-02 &L:TSLA20240621C340&S:TSLA20240621C343.33_TSLA... 71.803513 \n", - "2 2023-08-02 &L:TSLA20240621C340&S:TSLA20240621C343.33_TSLA... 71.860452 \n", - "\n", - " quantity symbol commission market_value slippage total_cost \\\n", - "0 689 TSLA 384.462 50028.963270 76.463270 50413.425270 \n", - "1 33 TSLA 18.414 2387.929919 -4.570081 2369.515919 \n", - "2 656 TSLA 366.048 47506.504623 -53.495377 47140.456623 \n", - "\n", - " aux_cost direction transaction_type \n", - "0 460.925270 BUY BUY \n", - "1 22.984081 SELL SELL \n", - "2 419.543377 SELL SELL " - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.portfolio.trades_map['&L:TSLA20240621C340&S:TSLA20240621C343.33'].entries()" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
datetimeuidpricequantitysymbolcommissionmarket_valueslippagetotal_costaux_costdirectiontransaction_type
02023-08-04&L:AMZN20240621C170&S:AMZN20240621C172.5_AMZN2...63.120290937AMZN522.84658620.86541958.36541959143.711419581.211419BUYBUY
12023-10-25&L:AMZN20240621C170&S:AMZN20240621C172.5_AMZN2...22.925412937AMZN522.84622003.957456-15.54254421481.111456538.388544SELLSELL
\n", - "
" - ], - "text/plain": [ - " datetime uid price \\\n", - "0 2023-08-04 &L:AMZN20240621C170&S:AMZN20240621C172.5_AMZN2... 63.120290 \n", - "1 2023-10-25 &L:AMZN20240621C170&S:AMZN20240621C172.5_AMZN2... 22.925412 \n", - "\n", - " quantity symbol commission market_value slippage total_cost \\\n", - "0 937 AMZN 522.846 58620.865419 58.365419 59143.711419 \n", - "1 937 AMZN 522.846 22003.957456 -15.542544 21481.111456 \n", - "\n", - " aux_cost direction transaction_type \n", - "0 581.211419 BUY BUY \n", - "1 538.388544 SELL SELL " - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.portfolio.trades_map['&L:AMZN20240621C170&S:AMZN20240621C172.5'].entries()" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
TradeIDSignalIDTickerEntryTimeExitTimeEntryPriceEntryCommissionEntrySlippageEntryQuantityEntryAuxilaryCostTotalEntryCostExitPriceExitCommissionExitSlippageExitQuantityExitAuxilaryCostTotalExitCostQuantityClosedQuantityClosedPnLTotalCommissionTotalSlippageTotalAuxilaryCostOpenQuantityUnrealizedPnLPnLReturnPctDuration
0&L:TSLA20240621C340&S:TSLA20240621C343.33TSLA20230705LONGTSLA2023-07-052023-08-0273.168977384.46276.463270689460.92527050413.42527071.857725384.462-58.065458689442.52745844996.130000689689-903.452727768.92418.397812-787.32181200-1690.774539-0.03353828
1&L:AMZN20240621C160&S:AMZN20240621C162.5AMZN20230705LONGAMZN2023-07-052023-08-0465.674573429.10289.644992769518.74699250503.74699276.864600429.102-59.520754769488.62275459108.8772467697698605.130254858.20430.124239-888.328239007716.8020150.15279730
2&L:AMZN20240621C170&S:AMZN20240621C172.5AMZN20230705LONGAMZN2023-08-042023-10-2563.120290522.84658.365419937581.21141959143.71141922.925412522.846-15.542544937538.38854421481.111456937937-37662.5999631045.69242.822876-1088.51487600-38751.114838-0.65520382
\n", - "
" - ], - "text/plain": [ - " TradeID SignalID Ticker \\\n", - "0 &L:TSLA20240621C340&S:TSLA20240621C343.33 TSLA20230705LONG TSLA \n", - "1 &L:AMZN20240621C160&S:AMZN20240621C162.5 AMZN20230705LONG AMZN \n", - "2 &L:AMZN20240621C170&S:AMZN20240621C172.5 AMZN20230705LONG AMZN \n", - "\n", - " EntryTime ExitTime EntryPrice EntryCommission EntrySlippage \\\n", - "0 2023-07-05 2023-08-02 73.168977 384.462 76.463270 \n", - "1 2023-07-05 2023-08-04 65.674573 429.102 89.644992 \n", - "2 2023-08-04 2023-10-25 63.120290 522.846 58.365419 \n", - "\n", - " EntryQuantity EntryAuxilaryCost TotalEntryCost ExitPrice \\\n", - "0 689 460.925270 50413.425270 71.857725 \n", - "1 769 518.746992 50503.746992 76.864600 \n", - "2 937 581.211419 59143.711419 22.925412 \n", - "\n", - " ExitCommission ExitSlippage ExitQuantity ExitAuxilaryCost \\\n", - "0 384.462 -58.065458 689 442.527458 \n", - "1 429.102 -59.520754 769 488.622754 \n", - "2 522.846 -15.542544 937 538.388544 \n", - "\n", - " TotalExitCost Quantity ClosedQuantity ClosedPnL TotalCommission \\\n", - "0 44996.130000 689 689 -903.452727 768.924 \n", - "1 59108.877246 769 769 8605.130254 858.204 \n", - "2 21481.111456 937 937 -37662.599963 1045.692 \n", - "\n", - " TotalSlippage TotalAuxilaryCost OpenQuantity UnrealizedPnL \\\n", - "0 18.397812 -787.321812 0 0 \n", - "1 30.124239 -888.328239 0 0 \n", - "2 42.822876 -1088.514876 0 0 \n", - "\n", - " PnL ReturnPct Duration \n", - "0 -1690.774539 -0.033538 28 \n", - "1 7716.802015 0.152797 30 \n", - "2 -38751.114838 -0.655203 82 " - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.portfolio.trades" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'&L:AMZN20240621C160&S:AMZN20240621C162.5'" - ] - }, - "execution_count": 44, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "amzn_trade_id = evb_backtest.portfolio.all_positions[2]['AMZN']['AMZN20230705LONG']['position']['trade_id']\n", - "amzn_trade_id" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
uidpricequantitysymbolcommissionmarket_valueslippagetotal_costaux_costdirectiontransaction_type
datetime
2023-07-05&L:AMZN20240621C160&S:AMZN20240621C162.5_AMZN2...65.595858769AMZN429.10250014.11273029.11273050443.214730458.214730BUYBUY
2023-08-04&L:AMZN20240621C160&S:AMZN20240621C162.5_AMZN2...76.798555769AMZN429.10259487.190619-110.30938159058.088619539.411381SELLSELL
\n", - "
" - ], - "text/plain": [ - " uid price \\\n", - "datetime \n", - "2023-07-05 &L:AMZN20240621C160&S:AMZN20240621C162.5_AMZN2... 65.595858 \n", - "2023-08-04 &L:AMZN20240621C160&S:AMZN20240621C162.5_AMZN2... 76.798555 \n", - "\n", - " quantity symbol commission market_value slippage \\\n", - "datetime \n", - "2023-07-05 769 AMZN 429.102 50014.112730 29.112730 \n", - "2023-08-04 769 AMZN 429.102 59487.190619 -110.309381 \n", - "\n", - " total_cost aux_cost direction transaction_type \n", - "datetime \n", - "2023-07-05 50443.214730 458.214730 BUY BUY \n", - "2023-08-04 59058.088619 539.411381 SELL SELL " - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "trade_entries = evb_backtest.portfolio.trades_map[amzn_trade_id].entries()\n", - "trade_entries.set_index('datetime', inplace=True)\n", - "trade_entries" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "metadata": {}, - "outputs": [], - "source": [ - "tsla_trade_id = evb_backtest.portfolio.all_positions[1]['TSLA']['TSLA20230705LONG']['position']['trade_id']" - ] - }, - { - "cell_type": "code", - "execution_count": 62, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
uidpricequantitysymbolcommissionmarket_valueslippagetotal_costaux_costdirectiontransaction_type
datetime
2023-07-05&L:TSLA20240621C340&S:TSLA20240621C343.33_TSLA...73.104850689TSLA384.46249984.77964532.27964550369.241645416.741645BUYBUY
2023-08-02&L:TSLA20240621C340&S:TSLA20240621C343.33_TSLA...71.85513633TSLA18.4142389.633497-2.8665032371.21949721.280503SELLSELL
2023-08-02&L:TSLA20240621C340&S:TSLA20240621C343.33_TSLA...71.832829656TSLA366.04847488.383675-71.61632547122.335675437.664325SELLSELL
\n", - "
" - ], - "text/plain": [ - " uid price \\\n", - "datetime \n", - "2023-07-05 &L:TSLA20240621C340&S:TSLA20240621C343.33_TSLA... 73.104850 \n", - "2023-08-02 &L:TSLA20240621C340&S:TSLA20240621C343.33_TSLA... 71.855136 \n", - "2023-08-02 &L:TSLA20240621C340&S:TSLA20240621C343.33_TSLA... 71.832829 \n", - "\n", - " quantity symbol commission market_value slippage \\\n", - "datetime \n", - "2023-07-05 689 TSLA 384.462 49984.779645 32.279645 \n", - "2023-08-02 33 TSLA 18.414 2389.633497 -2.866503 \n", - "2023-08-02 656 TSLA 366.048 47488.383675 -71.616325 \n", - "\n", - " total_cost aux_cost direction transaction_type \n", - "datetime \n", - "2023-07-05 50369.241645 416.741645 BUY BUY \n", - "2023-08-02 2371.219497 21.280503 SELL SELL \n", - "2023-08-02 47122.335675 437.664325 SELL SELL " - ] - }, - "execution_count": 62, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "trade_entries = evb_backtest.portfolio.trades_map[tsla_trade_id].entries()\n", - "trade_entries.set_index('datetime', inplace=True)\n", - "trade_entries" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
pricequantitysymboluid
datetime
2023-07-0573.150713689TSLA&L:TSLA20240621C340&S:TSLA20240621C343.33_TSLA...
\n", - "
" - ], - "text/plain": [ - " price quantity symbol \\\n", - "datetime \n", - "2023-07-05 73.150713 689 TSLA \n", - "\n", - " uid \n", - "datetime \n", - "2023-07-05 &L:TSLA20240621C340&S:TSLA20240621C343.33_TSLA... " - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "buy_entries = trade_entries.loc[trade_entries['direction'] == 'BUY', ['price', 'quantity', 'symbol', 'uid']]\n", - "buy_entries" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
pricequantitysymboluid
datetime
2023-08-0271.86633233TSLA&L:TSLA20240621C340&S:TSLA20240621C343.33_TSLA...
\n", - "
" - ], - "text/plain": [ - " price quantity symbol \\\n", - "datetime \n", - "2023-08-02 71.866332 33 TSLA \n", - "\n", - " uid \n", - "datetime \n", - "2023-08-02 &L:TSLA20240621C340&S:TSLA20240621C343.33_TSLA... " - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "SELL_entries = trade_entries.loc[trade_entries['direction'] == 'SELL', ['price', 'quantity', 'symbol', 'uid']]\n", - "SELL_entries" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
TradeIDSignalIDTickerEntryTimeExitTimeEntryPriceEntryCommissionEntrySlippageEntryQuantityEntryAuxilaryCostTotalEntryCostExitPriceExitCommissionExitSlippageExitQuantityExitAuxilaryCostTotalExitCostQuantityClosedQuantityClosedPnLTotalCommissionTotalSlippageTotalAuxilaryCostOpenQuantityUnrealizedPnLPnLReturnPctDuration
0&L:TSLA20240621C340&S:TSLA20240621C343.33TSLA20230705LONGTSLA2023-07-052023-08-0273.125385769.48292.9242641379862.406264100839.90626472.48248769.482-162.1781321379931.66013294438.71277213791379-886.5663951538.964-69.253868-1608.21786800-2494.784263-0.0247428
\n", - "
" - ], - "text/plain": [ - " TradeID SignalID Ticker \\\n", - "0 &L:TSLA20240621C340&S:TSLA20240621C343.33 TSLA20230705LONG TSLA \n", - "\n", - " EntryTime ExitTime EntryPrice EntryCommission EntrySlippage \\\n", - "0 2023-07-05 2023-08-02 73.125385 769.482 92.924264 \n", - "\n", - " EntryQuantity EntryAuxilaryCost TotalEntryCost ExitPrice \\\n", - "0 1379 862.406264 100839.906264 72.48248 \n", - "\n", - " ExitCommission ExitSlippage ExitQuantity ExitAuxilaryCost \\\n", - "0 769.482 -162.178132 1379 931.660132 \n", - "\n", - " TotalExitCost Quantity ClosedQuantity ClosedPnL TotalCommission \\\n", - "0 94438.712772 1379 1379 -886.566395 1538.964 \n", - "\n", - " TotalSlippage TotalAuxilaryCost OpenQuantity UnrealizedPnL PnL \\\n", - "0 -69.253868 -1608.217868 0 0 -2494.784263 \n", - "\n", - " ReturnPct Duration \n", - "0 -0.02474 28 " - ] - }, - "execution_count": 43, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.portfolio.trades_map[tsla_trade_id].stats" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
typesymbolsignal_typesignal_idmax_contract_priceorder_settingsorder_typecashquantitydirectionpositionexchangefill_costmarket_valueslippagecommission
datetime
2023-07-05MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-07-05SIGNALTSLALONGTSLA20230705LONGNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-07-05SIGNALAMZNLONGAMZN20230705LONGNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-07-05ORDERTSLANaNTSLA20230705LONGNaNNaNMKT500.0689.0BUY{'trade_id': '&L:TSLA20240621C340&S:TSLA202406...NaNNaNNaNNaNNaN
2023-07-05ORDERAMZNNaNAMZN20230705LONGNaNNaNMKT500.0769.0BUY{'trade_id': '&L:AMZN20240621C160&S:AMZN202406...NaNNaNNaNNaNNaN
2023-07-05FILLTSLANaNTSLA20230705LONGNaNNaNNaNNaN689.0BUY{'trade_id': '&L:TSLA20240621C340&S:TSLA202406...ARCA504.008413500.1637930.6387933.84462
2023-07-05FILLAMZNNaNAMZN20230705LONGNaNNaNNaNNaN769.0BUY{'trade_id': '&L:AMZN20240621C160&S:AMZN202406...ARCA504.866086500.5750660.7250664.29102
2023-07-06MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-07-07MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-07-10MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-07-11MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-07-12MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-07-13MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-07-14MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-07-17MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-07-18MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-07-19MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-07-20MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-07-21MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-07-24MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-07-25MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-07-26MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-07-27MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-07-28MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-07-31MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-08-01MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-08-02MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-08-02SIGNALTSLACLOSETSLA20230705LONGNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-08-02ORDERTSLANaNTSLA20230705LONGNaNNaNMKTNaN33.0SELL{'trade_id': '&L:TSLA20240621C340&S:TSLA202406...NaNNaNNaNNaNNaN
2023-08-02ORDERTSLANaNTSLA20230705LONGNaNNaNMKTNaN689.0SELL{'trade_id': '&L:TSLA20240621C340&S:TSLA202406...NaNNaNNaNNaNNaN
2023-08-02FILLTSLANaNTSLA20230705LONGNaNNaNNaNNaN33.0SELL{'trade_id': '&L:TSLA20240621C340&S:TSLA202406...ARCA23.72220623.906346-0.0186540.18414
2023-08-02FILLTSLANaNTSLA20230705LONGNaNNaNNaNNaN689.0SELL{'trade_id': '&L:TSLA20240621C340&S:TSLA202406...ARCA495.367409499.212029-0.3129713.84462
2023-08-03MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-08-04MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-08-07MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-08-08MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-08-09MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-08-10MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-08-11MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-08-14MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-08-15MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-08-16MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-08-17MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-08-18MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-08-21MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-08-22MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-08-23MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-08-24MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-08-25MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-08-28MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-08-29MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-08-30MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-08-31MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-09-01MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-09-04MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-09-05MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-09-06MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-09-07MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-09-08MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-09-11MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-09-12MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-09-13MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-09-14MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-09-15MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-09-18MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-09-19MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-09-20MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-09-21MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-09-22MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-09-25MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-09-26MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-09-27MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-09-28MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-09-29MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-10-02MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-10-03MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-10-04MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-10-05MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-10-06MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-10-09MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-10-10MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-10-11MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-10-12MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-10-13MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-10-16MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-10-17MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-10-18MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-10-19MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-10-20MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-10-23MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-10-24MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-10-25MARKETNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-10-25SIGNALAMZNCLOSEAMZN20230705LONGNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-10-25ORDERAMZNNaNAMZN20230705LONGNaNNaNMKTNaN769.0SELL{'trade_id': '&L:AMZN20240621C160&S:AMZN202406...NaNNaNNaNNaNNaN
2023-10-25FILLAMZNNaNAMZN20230705LONGNaNNaNNaNNaN769.0SELL{'trade_id': '&L:AMZN20240621C160&S:AMZN202406...ARCA303.153311307.444331-0.1556694.29102
\n", - "
" - ], - "text/plain": [ - " type symbol signal_type signal_id max_contract_price \\\n", - "datetime \n", - "2023-07-05 MARKET NaN NaN NaN NaN \n", - "2023-07-05 SIGNAL TSLA LONG TSLA20230705LONG NaN \n", - "2023-07-05 SIGNAL AMZN LONG AMZN20230705LONG NaN \n", - "2023-07-05 ORDER TSLA NaN TSLA20230705LONG NaN \n", - "2023-07-05 ORDER AMZN NaN AMZN20230705LONG NaN \n", - "2023-07-05 FILL TSLA NaN TSLA20230705LONG NaN \n", - "2023-07-05 FILL AMZN NaN AMZN20230705LONG NaN \n", - "2023-07-06 MARKET NaN NaN NaN NaN \n", - "2023-07-07 MARKET NaN NaN NaN NaN \n", - "2023-07-10 MARKET NaN NaN NaN NaN \n", - "2023-07-11 MARKET NaN NaN NaN NaN \n", - "2023-07-12 MARKET NaN NaN NaN NaN \n", - "2023-07-13 MARKET NaN NaN NaN NaN \n", - "2023-07-14 MARKET NaN NaN NaN NaN \n", - "2023-07-17 MARKET NaN NaN NaN NaN \n", - "2023-07-18 MARKET NaN NaN NaN NaN \n", - "2023-07-19 MARKET NaN NaN NaN NaN \n", - "2023-07-20 MARKET NaN NaN NaN NaN \n", - "2023-07-21 MARKET NaN NaN NaN NaN \n", - "2023-07-24 MARKET NaN NaN NaN NaN \n", - "2023-07-25 MARKET NaN NaN NaN NaN \n", - "2023-07-26 MARKET NaN NaN NaN NaN \n", - "2023-07-27 MARKET NaN NaN NaN NaN \n", - "2023-07-28 MARKET NaN NaN NaN NaN \n", - "2023-07-31 MARKET NaN NaN NaN NaN \n", - "2023-08-01 MARKET NaN NaN NaN NaN \n", - "2023-08-02 MARKET NaN NaN NaN NaN \n", - "2023-08-02 SIGNAL TSLA CLOSE TSLA20230705LONG NaN \n", - "2023-08-02 ORDER TSLA NaN TSLA20230705LONG NaN \n", - "2023-08-02 ORDER TSLA NaN TSLA20230705LONG NaN \n", - "2023-08-02 FILL TSLA NaN TSLA20230705LONG NaN \n", - "2023-08-02 FILL TSLA NaN TSLA20230705LONG NaN \n", - "2023-08-03 MARKET NaN NaN NaN NaN \n", - "2023-08-04 MARKET NaN NaN NaN NaN \n", - "2023-08-07 MARKET NaN NaN NaN NaN \n", - "2023-08-08 MARKET NaN NaN NaN NaN \n", - "2023-08-09 MARKET NaN NaN NaN NaN \n", - "2023-08-10 MARKET NaN NaN NaN NaN \n", - "2023-08-11 MARKET NaN NaN NaN NaN \n", - "2023-08-14 MARKET NaN NaN NaN NaN \n", - "2023-08-15 MARKET NaN NaN NaN NaN \n", - "2023-08-16 MARKET NaN NaN NaN NaN \n", - "2023-08-17 MARKET NaN NaN NaN NaN \n", - "2023-08-18 MARKET NaN NaN NaN NaN \n", - "2023-08-21 MARKET NaN NaN NaN NaN \n", - "2023-08-22 MARKET NaN NaN NaN NaN \n", - "2023-08-23 MARKET NaN NaN NaN NaN \n", - "2023-08-24 MARKET NaN NaN NaN NaN \n", - "2023-08-25 MARKET NaN NaN NaN NaN \n", - "2023-08-28 MARKET NaN NaN NaN NaN \n", - "2023-08-29 MARKET NaN NaN NaN NaN \n", - "2023-08-30 MARKET NaN NaN NaN NaN \n", - "2023-08-31 MARKET NaN NaN NaN NaN \n", - "2023-09-01 MARKET NaN NaN NaN NaN \n", - "2023-09-04 MARKET NaN NaN NaN NaN \n", - "2023-09-05 MARKET NaN NaN NaN NaN \n", - "2023-09-06 MARKET NaN NaN NaN NaN \n", - "2023-09-07 MARKET NaN NaN NaN NaN \n", - "2023-09-08 MARKET NaN NaN NaN NaN \n", - "2023-09-11 MARKET NaN NaN NaN NaN \n", - "2023-09-12 MARKET NaN NaN NaN NaN \n", - "2023-09-13 MARKET NaN NaN NaN NaN \n", - "2023-09-14 MARKET NaN NaN NaN NaN \n", - "2023-09-15 MARKET NaN NaN NaN NaN \n", - "2023-09-18 MARKET NaN NaN NaN NaN \n", - "2023-09-19 MARKET NaN NaN NaN NaN \n", - "2023-09-20 MARKET NaN NaN NaN NaN \n", - "2023-09-21 MARKET NaN NaN NaN NaN \n", - "2023-09-22 MARKET NaN NaN NaN NaN \n", - "2023-09-25 MARKET NaN NaN NaN NaN \n", - "2023-09-26 MARKET NaN NaN NaN NaN \n", - "2023-09-27 MARKET NaN NaN NaN NaN \n", - "2023-09-28 MARKET NaN NaN NaN NaN \n", - "2023-09-29 MARKET NaN NaN NaN NaN \n", - "2023-10-02 MARKET NaN NaN NaN NaN \n", - "2023-10-03 MARKET NaN NaN NaN NaN \n", - "2023-10-04 MARKET NaN NaN NaN NaN \n", - "2023-10-05 MARKET NaN NaN NaN NaN \n", - "2023-10-06 MARKET NaN NaN NaN NaN \n", - "2023-10-09 MARKET NaN NaN NaN NaN \n", - "2023-10-10 MARKET NaN NaN NaN NaN \n", - "2023-10-11 MARKET NaN NaN NaN NaN \n", - "2023-10-12 MARKET NaN NaN NaN NaN \n", - "2023-10-13 MARKET NaN NaN NaN NaN \n", - "2023-10-16 MARKET NaN NaN NaN NaN \n", - "2023-10-17 MARKET NaN NaN NaN NaN \n", - "2023-10-18 MARKET NaN NaN NaN NaN \n", - "2023-10-19 MARKET NaN NaN NaN NaN \n", - "2023-10-20 MARKET NaN NaN NaN NaN \n", - "2023-10-23 MARKET NaN NaN NaN NaN \n", - "2023-10-24 MARKET NaN NaN NaN NaN \n", - "2023-10-25 MARKET NaN NaN NaN NaN \n", - "2023-10-25 SIGNAL AMZN CLOSE AMZN20230705LONG NaN \n", - "2023-10-25 ORDER AMZN NaN AMZN20230705LONG NaN \n", - "2023-10-25 FILL AMZN NaN AMZN20230705LONG NaN \n", - "\n", - " order_settings order_type cash quantity direction \\\n", - "datetime \n", - "2023-07-05 NaN NaN NaN NaN NaN \n", - "2023-07-05 NaN NaN NaN NaN NaN \n", - "2023-07-05 NaN NaN NaN NaN NaN \n", - "2023-07-05 NaN MKT 500.0 689.0 BUY \n", - "2023-07-05 NaN MKT 500.0 769.0 BUY \n", - "2023-07-05 NaN NaN NaN 689.0 BUY \n", - "2023-07-05 NaN NaN NaN 769.0 BUY \n", - "2023-07-06 NaN NaN NaN NaN NaN \n", - "2023-07-07 NaN NaN NaN NaN NaN \n", - "2023-07-10 NaN NaN NaN NaN NaN \n", - "2023-07-11 NaN NaN NaN NaN NaN \n", - "2023-07-12 NaN NaN NaN NaN NaN \n", - "2023-07-13 NaN NaN NaN NaN NaN \n", - "2023-07-14 NaN NaN NaN NaN NaN \n", - "2023-07-17 NaN NaN NaN NaN NaN \n", - "2023-07-18 NaN NaN NaN NaN NaN \n", - "2023-07-19 NaN NaN NaN NaN NaN \n", - "2023-07-20 NaN NaN NaN NaN NaN \n", - "2023-07-21 NaN NaN NaN NaN NaN \n", - "2023-07-24 NaN NaN NaN NaN NaN \n", - "2023-07-25 NaN NaN NaN NaN NaN \n", - "2023-07-26 NaN NaN NaN NaN NaN \n", - "2023-07-27 NaN NaN NaN NaN NaN \n", - "2023-07-28 NaN NaN NaN NaN NaN \n", - "2023-07-31 NaN NaN NaN NaN NaN \n", - "2023-08-01 NaN NaN NaN NaN NaN \n", - "2023-08-02 NaN NaN NaN NaN NaN \n", - "2023-08-02 NaN NaN NaN NaN NaN \n", - "2023-08-02 NaN MKT NaN 33.0 SELL \n", - "2023-08-02 NaN MKT NaN 689.0 SELL \n", - "2023-08-02 NaN NaN NaN 33.0 SELL \n", - "2023-08-02 NaN NaN NaN 689.0 SELL \n", - "2023-08-03 NaN NaN NaN NaN NaN \n", - "2023-08-04 NaN NaN NaN NaN NaN \n", - "2023-08-07 NaN NaN NaN NaN NaN \n", - "2023-08-08 NaN NaN NaN NaN NaN \n", - "2023-08-09 NaN NaN NaN NaN NaN \n", - "2023-08-10 NaN NaN NaN NaN NaN \n", - "2023-08-11 NaN NaN NaN NaN NaN \n", - "2023-08-14 NaN NaN NaN NaN NaN \n", - "2023-08-15 NaN NaN NaN NaN NaN \n", - "2023-08-16 NaN NaN NaN NaN NaN \n", - "2023-08-17 NaN NaN NaN NaN NaN \n", - "2023-08-18 NaN NaN NaN NaN NaN \n", - "2023-08-21 NaN NaN NaN NaN NaN \n", - "2023-08-22 NaN NaN NaN NaN NaN \n", - "2023-08-23 NaN NaN NaN NaN NaN \n", - "2023-08-24 NaN NaN NaN NaN NaN \n", - "2023-08-25 NaN NaN NaN NaN NaN \n", - "2023-08-28 NaN NaN NaN NaN NaN \n", - "2023-08-29 NaN NaN NaN NaN NaN \n", - "2023-08-30 NaN NaN NaN NaN NaN \n", - "2023-08-31 NaN NaN NaN NaN NaN \n", - "2023-09-01 NaN NaN NaN NaN NaN \n", - "2023-09-04 NaN NaN NaN NaN NaN \n", - "2023-09-05 NaN NaN NaN NaN NaN \n", - "2023-09-06 NaN NaN NaN NaN NaN \n", - "2023-09-07 NaN NaN NaN NaN NaN \n", - "2023-09-08 NaN NaN NaN NaN NaN \n", - "2023-09-11 NaN NaN NaN NaN NaN \n", - "2023-09-12 NaN NaN NaN NaN NaN \n", - "2023-09-13 NaN NaN NaN NaN NaN \n", - "2023-09-14 NaN NaN NaN NaN NaN \n", - "2023-09-15 NaN NaN NaN NaN NaN \n", - "2023-09-18 NaN NaN NaN NaN NaN \n", - "2023-09-19 NaN NaN NaN NaN NaN \n", - "2023-09-20 NaN NaN NaN NaN NaN \n", - "2023-09-21 NaN NaN NaN NaN NaN \n", - "2023-09-22 NaN NaN NaN NaN NaN \n", - "2023-09-25 NaN NaN NaN NaN NaN \n", - "2023-09-26 NaN NaN NaN NaN NaN \n", - "2023-09-27 NaN NaN NaN NaN NaN \n", - "2023-09-28 NaN NaN NaN NaN NaN \n", - "2023-09-29 NaN NaN NaN NaN NaN \n", - "2023-10-02 NaN NaN NaN NaN NaN \n", - "2023-10-03 NaN NaN NaN NaN NaN \n", - "2023-10-04 NaN NaN NaN NaN NaN \n", - "2023-10-05 NaN NaN NaN NaN NaN \n", - "2023-10-06 NaN NaN NaN NaN NaN \n", - "2023-10-09 NaN NaN NaN NaN NaN \n", - "2023-10-10 NaN NaN NaN NaN NaN \n", - "2023-10-11 NaN NaN NaN NaN NaN \n", - "2023-10-12 NaN NaN NaN NaN NaN \n", - "2023-10-13 NaN NaN NaN NaN NaN \n", - "2023-10-16 NaN NaN NaN NaN NaN \n", - "2023-10-17 NaN NaN NaN NaN NaN \n", - "2023-10-18 NaN NaN NaN NaN NaN \n", - "2023-10-19 NaN NaN NaN NaN NaN \n", - "2023-10-20 NaN NaN NaN NaN NaN \n", - "2023-10-23 NaN NaN NaN NaN NaN \n", - "2023-10-24 NaN NaN NaN NaN NaN \n", - "2023-10-25 NaN NaN NaN NaN NaN \n", - "2023-10-25 NaN NaN NaN NaN NaN \n", - "2023-10-25 NaN MKT NaN 769.0 SELL \n", - "2023-10-25 NaN NaN NaN 769.0 SELL \n", - "\n", - " position exchange \\\n", - "datetime \n", - "2023-07-05 NaN NaN \n", - "2023-07-05 NaN NaN \n", - "2023-07-05 NaN NaN \n", - "2023-07-05 {'trade_id': '&L:TSLA20240621C340&S:TSLA202406... NaN \n", - "2023-07-05 {'trade_id': '&L:AMZN20240621C160&S:AMZN202406... NaN \n", - "2023-07-05 {'trade_id': '&L:TSLA20240621C340&S:TSLA202406... ARCA \n", - "2023-07-05 {'trade_id': '&L:AMZN20240621C160&S:AMZN202406... ARCA \n", - "2023-07-06 NaN NaN \n", - "2023-07-07 NaN NaN \n", - "2023-07-10 NaN NaN \n", - "2023-07-11 NaN NaN \n", - "2023-07-12 NaN NaN \n", - "2023-07-13 NaN NaN \n", - "2023-07-14 NaN NaN \n", - "2023-07-17 NaN NaN \n", - "2023-07-18 NaN NaN \n", - "2023-07-19 NaN NaN \n", - "2023-07-20 NaN NaN \n", - "2023-07-21 NaN NaN \n", - "2023-07-24 NaN NaN \n", - "2023-07-25 NaN NaN \n", - "2023-07-26 NaN NaN \n", - "2023-07-27 NaN NaN \n", - "2023-07-28 NaN NaN \n", - "2023-07-31 NaN NaN \n", - "2023-08-01 NaN NaN \n", - "2023-08-02 NaN NaN \n", - "2023-08-02 NaN NaN \n", - "2023-08-02 {'trade_id': '&L:TSLA20240621C340&S:TSLA202406... NaN \n", - "2023-08-02 {'trade_id': '&L:TSLA20240621C340&S:TSLA202406... NaN \n", - "2023-08-02 {'trade_id': '&L:TSLA20240621C340&S:TSLA202406... ARCA \n", - "2023-08-02 {'trade_id': '&L:TSLA20240621C340&S:TSLA202406... ARCA \n", - "2023-08-03 NaN NaN \n", - "2023-08-04 NaN NaN \n", - "2023-08-07 NaN NaN \n", - "2023-08-08 NaN NaN \n", - "2023-08-09 NaN NaN \n", - "2023-08-10 NaN NaN \n", - "2023-08-11 NaN NaN \n", - "2023-08-14 NaN NaN \n", - "2023-08-15 NaN NaN \n", - "2023-08-16 NaN NaN \n", - "2023-08-17 NaN NaN \n", - "2023-08-18 NaN NaN \n", - "2023-08-21 NaN NaN \n", - "2023-08-22 NaN NaN \n", - "2023-08-23 NaN NaN \n", - "2023-08-24 NaN NaN \n", - "2023-08-25 NaN NaN \n", - "2023-08-28 NaN NaN \n", - "2023-08-29 NaN NaN \n", - "2023-08-30 NaN NaN \n", - "2023-08-31 NaN NaN \n", - "2023-09-01 NaN NaN \n", - "2023-09-04 NaN NaN \n", - "2023-09-05 NaN NaN \n", - "2023-09-06 NaN NaN \n", - "2023-09-07 NaN NaN \n", - "2023-09-08 NaN NaN \n", - "2023-09-11 NaN NaN \n", - "2023-09-12 NaN NaN \n", - "2023-09-13 NaN NaN \n", - "2023-09-14 NaN NaN \n", - "2023-09-15 NaN NaN \n", - "2023-09-18 NaN NaN \n", - "2023-09-19 NaN NaN \n", - "2023-09-20 NaN NaN \n", - "2023-09-21 NaN NaN \n", - "2023-09-22 NaN NaN \n", - "2023-09-25 NaN NaN \n", - "2023-09-26 NaN NaN \n", - "2023-09-27 NaN NaN \n", - "2023-09-28 NaN NaN \n", - "2023-09-29 NaN NaN \n", - "2023-10-02 NaN NaN \n", - "2023-10-03 NaN NaN \n", - "2023-10-04 NaN NaN \n", - "2023-10-05 NaN NaN \n", - "2023-10-06 NaN NaN \n", - "2023-10-09 NaN NaN \n", - "2023-10-10 NaN NaN \n", - "2023-10-11 NaN NaN \n", - "2023-10-12 NaN NaN \n", - "2023-10-13 NaN NaN \n", - "2023-10-16 NaN NaN \n", - "2023-10-17 NaN NaN \n", - "2023-10-18 NaN NaN \n", - "2023-10-19 NaN NaN \n", - "2023-10-20 NaN NaN \n", - "2023-10-23 NaN NaN \n", - "2023-10-24 NaN NaN \n", - "2023-10-25 NaN NaN \n", - "2023-10-25 NaN NaN \n", - "2023-10-25 {'trade_id': '&L:AMZN20240621C160&S:AMZN202406... NaN \n", - "2023-10-25 {'trade_id': '&L:AMZN20240621C160&S:AMZN202406... ARCA \n", - "\n", - " fill_cost market_value slippage commission \n", - "datetime \n", - "2023-07-05 NaN NaN NaN NaN \n", - "2023-07-05 NaN NaN NaN NaN \n", - "2023-07-05 NaN NaN NaN NaN \n", - "2023-07-05 NaN NaN NaN NaN \n", - "2023-07-05 NaN NaN NaN NaN \n", - "2023-07-05 504.008413 500.163793 0.638793 3.84462 \n", - "2023-07-05 504.866086 500.575066 0.725066 4.29102 \n", - "2023-07-06 NaN NaN NaN NaN \n", - "2023-07-07 NaN NaN NaN NaN \n", - "2023-07-10 NaN NaN NaN NaN \n", - "2023-07-11 NaN NaN NaN NaN \n", - "2023-07-12 NaN NaN NaN NaN \n", - "2023-07-13 NaN NaN NaN NaN \n", - "2023-07-14 NaN NaN NaN NaN \n", - "2023-07-17 NaN NaN NaN NaN \n", - "2023-07-18 NaN NaN NaN NaN \n", - "2023-07-19 NaN NaN NaN NaN \n", - "2023-07-20 NaN NaN NaN NaN \n", - "2023-07-21 NaN NaN NaN NaN \n", - "2023-07-24 NaN NaN NaN NaN \n", - "2023-07-25 NaN NaN NaN NaN \n", - "2023-07-26 NaN NaN NaN NaN \n", - "2023-07-27 NaN NaN NaN NaN \n", - "2023-07-28 NaN NaN NaN NaN \n", - "2023-07-31 NaN NaN NaN NaN \n", - "2023-08-01 NaN NaN NaN NaN \n", - "2023-08-02 NaN NaN NaN NaN \n", - "2023-08-02 NaN NaN NaN NaN \n", - "2023-08-02 NaN NaN NaN NaN \n", - "2023-08-02 NaN NaN NaN NaN \n", - "2023-08-02 23.722206 23.906346 -0.018654 0.18414 \n", - "2023-08-02 495.367409 499.212029 -0.312971 3.84462 \n", - "2023-08-03 NaN NaN NaN NaN \n", - "2023-08-04 NaN NaN NaN NaN \n", - "2023-08-07 NaN NaN NaN NaN \n", - "2023-08-08 NaN NaN NaN NaN \n", - "2023-08-09 NaN NaN NaN NaN \n", - "2023-08-10 NaN NaN NaN NaN \n", - "2023-08-11 NaN NaN NaN NaN \n", - "2023-08-14 NaN NaN NaN NaN \n", - "2023-08-15 NaN NaN NaN NaN \n", - "2023-08-16 NaN NaN NaN NaN \n", - "2023-08-17 NaN NaN NaN NaN \n", - "2023-08-18 NaN NaN NaN NaN \n", - "2023-08-21 NaN NaN NaN NaN \n", - "2023-08-22 NaN NaN NaN NaN \n", - "2023-08-23 NaN NaN NaN NaN \n", - "2023-08-24 NaN NaN NaN NaN \n", - "2023-08-25 NaN NaN NaN NaN \n", - "2023-08-28 NaN NaN NaN NaN \n", - "2023-08-29 NaN NaN NaN NaN \n", - "2023-08-30 NaN NaN NaN NaN \n", - "2023-08-31 NaN NaN NaN NaN \n", - "2023-09-01 NaN NaN NaN NaN \n", - "2023-09-04 NaN NaN NaN NaN \n", - "2023-09-05 NaN NaN NaN NaN \n", - "2023-09-06 NaN NaN NaN NaN \n", - "2023-09-07 NaN NaN NaN NaN \n", - "2023-09-08 NaN NaN NaN NaN \n", - "2023-09-11 NaN NaN NaN NaN \n", - "2023-09-12 NaN NaN NaN NaN \n", - "2023-09-13 NaN NaN NaN NaN \n", - "2023-09-14 NaN NaN NaN NaN \n", - "2023-09-15 NaN NaN NaN NaN \n", - "2023-09-18 NaN NaN NaN NaN \n", - "2023-09-19 NaN NaN NaN NaN \n", - "2023-09-20 NaN NaN NaN NaN \n", - "2023-09-21 NaN NaN NaN NaN \n", - "2023-09-22 NaN NaN NaN NaN \n", - "2023-09-25 NaN NaN NaN NaN \n", - "2023-09-26 NaN NaN NaN NaN \n", - "2023-09-27 NaN NaN NaN NaN \n", - "2023-09-28 NaN NaN NaN NaN \n", - "2023-09-29 NaN NaN NaN NaN \n", - "2023-10-02 NaN NaN NaN NaN \n", - "2023-10-03 NaN NaN NaN NaN \n", - "2023-10-04 NaN NaN NaN NaN \n", - "2023-10-05 NaN NaN NaN NaN \n", - "2023-10-06 NaN NaN NaN NaN \n", - "2023-10-09 NaN NaN NaN NaN \n", - "2023-10-10 NaN NaN NaN NaN \n", - "2023-10-11 NaN NaN NaN NaN \n", - "2023-10-12 NaN NaN NaN NaN \n", - "2023-10-13 NaN NaN NaN NaN \n", - "2023-10-16 NaN NaN NaN NaN \n", - "2023-10-17 NaN NaN NaN NaN \n", - "2023-10-18 NaN NaN NaN NaN \n", - "2023-10-19 NaN NaN NaN NaN \n", - "2023-10-20 NaN NaN NaN NaN \n", - "2023-10-23 NaN NaN NaN NaN \n", - "2023-10-24 NaN NaN NaN NaN \n", - "2023-10-25 NaN NaN NaN NaN \n", - "2023-10-25 NaN NaN NaN NaN \n", - "2023-10-25 NaN NaN NaN NaN \n", - "2023-10-25 303.153311 307.444331 -0.155669 4.29102 " - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.get_events()" - ] - }, - { - "cell_type": "code", - "execution_count": 195, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - "
" - ], - "text/plain": [ - "Empty DataFrame\n", - "Columns: []\n", - "Index: []" - ] - }, - "execution_count": 195, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pd.DataFrame(evb_backtest.portfolio.unprocessed_signals)" - ] - }, - { - "cell_type": "code", - "execution_count": 107, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
TickerPnLReturnPctEntryPriceEntryCommissionEntrySlippageEntryMarketValueTotalEntryCostAuxilaryEntryCostExitPriceExitCommissionExitSlippageExitMarketValueTotalExitCostAuxilaryExitCostQuantityEntryTimeExitTimeDurationPositionsSignalID
\n", - "
" - ], - "text/plain": [ - "Empty DataFrame\n", - "Columns: [Ticker, PnL, ReturnPct, EntryPrice, EntryCommission, EntrySlippage, EntryMarketValue, TotalEntryCost, AuxilaryEntryCost, ExitPrice, ExitCommission, ExitSlippage, ExitMarketValue, TotalExitCost, AuxilaryExitCost, Quantity, EntryTime, ExitTime, Duration, Positions, SignalID]\n", - "Index: []" - ] - }, - "execution_count": 107, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.portfolio.trades[evb_backtest.portfolio.trades['Positions'] == \"&L:TSLA20240621C283.33&S:TSLA20240621C400\"]" - ] - }, - { - "cell_type": "code", - "execution_count": 108, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
longshorttrade_idclosequantitymarket_valueTSLA20230705LONG
datetimesymbol
2023-07-05TSLA[TSLA20240621C266.67][TSLA20240621C300]&L:TSLA20240621C266.67&S:TSLA20240621C30014.7506798825.0TSLA20230705LONG
TSLA[TSLA20240621C266.67][TSLA20240621C300]&L:TSLA20240621C266.67&S:TSLA20240621C30014.7506798825.0TSLA20230705LONG
2023-07-06TSLA[TSLA20240621C266.67][TSLA20240621C300]&L:TSLA20240621C266.67&S:TSLA20240621C30014.7506798825.0TSLA20230705LONG
2023-07-07TSLA[TSLA20240621C266.67][TSLA20240621C300]&L:TSLA20240621C266.67&S:TSLA20240621C30014.0256793967.5TSLA20230705LONG
2023-07-10TSLA[TSLA20240621C266.67][TSLA20240621C300]&L:TSLA20240621C266.67&S:TSLA20240621C30013.4506790115.0TSLA20230705LONG
2023-07-11TSLA[TSLA20240621C266.67][TSLA20240621C300]&L:TSLA20240621C266.67&S:TSLA20240621C30013.4506790115.0TSLA20230705LONG
2023-07-12TSLA[TSLA20240621C266.67][TSLA20240621C300]&L:TSLA20240621C266.67&S:TSLA20240621C30013.4256789947.5TSLA20230705LONG
2023-07-13TSLA[TSLA20240621C266.67][TSLA20240621C300]&L:TSLA20240621C266.67&S:TSLA20240621C30013.7756792292.5TSLA20230705LONG
2023-07-14TSLA[TSLA20240621C266.67][TSLA20240621C300]&L:TSLA20240621C266.67&S:TSLA20240621C30014.3256795977.5TSLA20230705LONG
2023-07-17TSLA[TSLA20240621C266.67][TSLA20240621C300]&L:TSLA20240621C266.67&S:TSLA20240621C30015.40067103180.0TSLA20230705LONG
2023-07-18TSLA[TSLA20240621C266.67][TSLA20240621C300]&L:TSLA20240621C266.67&S:TSLA20240621C30015.40067103180.0TSLA20230705LONG
2023-07-19TSLA[TSLA20240621C266.67][TSLA20240621C300]&L:TSLA20240621C266.67&S:TSLA20240621C30015.47567103682.5TSLA20230705LONG
2023-07-20TSLA[TSLA20240621C266.67][TSLA20240621C300]&L:TSLA20240621C266.67&S:TSLA20240621C30015.40067103180.0TSLA20230705LONG
2023-07-21TSLA[TSLA20240621C266.67][TSLA20240621C300]&L:TSLA20240621C266.67&S:TSLA20240621C30012.6756784922.5TSLA20230705LONG
2023-07-24TSLA[TSLA20240621C266.67][TSLA20240621C300]&L:TSLA20240621C266.67&S:TSLA20240621C30013.4506790115.0TSLA20230705LONG
2023-07-25TSLA[TSLA20240621C266.67][TSLA20240621C300]&L:TSLA20240621C266.67&S:TSLA20240621C30013.4506790115.0TSLA20230705LONG
2023-07-26TSLA[TSLA20240621C266.67][TSLA20240621C300]&L:TSLA20240621C266.67&S:TSLA20240621C30013.3756789612.5TSLA20230705LONG
2023-07-27TSLA[TSLA20240621C266.67][TSLA20240621C300]&L:TSLA20240621C266.67&S:TSLA20240621C30012.7256785257.5TSLA20230705LONG
2023-07-28TSLA[TSLA20240621C266.67][TSLA20240621C300]&L:TSLA20240621C266.67&S:TSLA20240621C30012.0256780567.5TSLA20230705LONG
2023-07-31TSLA[TSLA20240621C266.67][TSLA20240621C300]&L:TSLA20240621C266.67&S:TSLA20240621C30013.5756790952.5TSLA20230705LONG
\n", - "
" - ], - "text/plain": [ - " long short \\\n", - "datetime symbol \n", - "2023-07-05 TSLA [TSLA20240621C266.67] [TSLA20240621C300] \n", - " TSLA [TSLA20240621C266.67] [TSLA20240621C300] \n", - "2023-07-06 TSLA [TSLA20240621C266.67] [TSLA20240621C300] \n", - "2023-07-07 TSLA [TSLA20240621C266.67] [TSLA20240621C300] \n", - "2023-07-10 TSLA [TSLA20240621C266.67] [TSLA20240621C300] \n", - "2023-07-11 TSLA [TSLA20240621C266.67] [TSLA20240621C300] \n", - "2023-07-12 TSLA [TSLA20240621C266.67] [TSLA20240621C300] \n", - "2023-07-13 TSLA [TSLA20240621C266.67] [TSLA20240621C300] \n", - "2023-07-14 TSLA [TSLA20240621C266.67] [TSLA20240621C300] \n", - "2023-07-17 TSLA [TSLA20240621C266.67] [TSLA20240621C300] \n", - "2023-07-18 TSLA [TSLA20240621C266.67] [TSLA20240621C300] \n", - "2023-07-19 TSLA [TSLA20240621C266.67] [TSLA20240621C300] \n", - "2023-07-20 TSLA [TSLA20240621C266.67] [TSLA20240621C300] \n", - "2023-07-21 TSLA [TSLA20240621C266.67] [TSLA20240621C300] \n", - "2023-07-24 TSLA [TSLA20240621C266.67] [TSLA20240621C300] \n", - "2023-07-25 TSLA [TSLA20240621C266.67] [TSLA20240621C300] \n", - "2023-07-26 TSLA [TSLA20240621C266.67] [TSLA20240621C300] \n", - "2023-07-27 TSLA [TSLA20240621C266.67] [TSLA20240621C300] \n", - "2023-07-28 TSLA [TSLA20240621C266.67] [TSLA20240621C300] \n", - "2023-07-31 TSLA [TSLA20240621C266.67] [TSLA20240621C300] \n", - "\n", - " trade_id close \\\n", - "datetime symbol \n", - "2023-07-05 TSLA &L:TSLA20240621C266.67&S:TSLA20240621C300 14.750 \n", - " TSLA &L:TSLA20240621C266.67&S:TSLA20240621C300 14.750 \n", - "2023-07-06 TSLA &L:TSLA20240621C266.67&S:TSLA20240621C300 14.750 \n", - "2023-07-07 TSLA &L:TSLA20240621C266.67&S:TSLA20240621C300 14.025 \n", - "2023-07-10 TSLA &L:TSLA20240621C266.67&S:TSLA20240621C300 13.450 \n", - "2023-07-11 TSLA &L:TSLA20240621C266.67&S:TSLA20240621C300 13.450 \n", - "2023-07-12 TSLA &L:TSLA20240621C266.67&S:TSLA20240621C300 13.425 \n", - "2023-07-13 TSLA &L:TSLA20240621C266.67&S:TSLA20240621C300 13.775 \n", - "2023-07-14 TSLA &L:TSLA20240621C266.67&S:TSLA20240621C300 14.325 \n", - "2023-07-17 TSLA &L:TSLA20240621C266.67&S:TSLA20240621C300 15.400 \n", - "2023-07-18 TSLA &L:TSLA20240621C266.67&S:TSLA20240621C300 15.400 \n", - "2023-07-19 TSLA &L:TSLA20240621C266.67&S:TSLA20240621C300 15.475 \n", - "2023-07-20 TSLA &L:TSLA20240621C266.67&S:TSLA20240621C300 15.400 \n", - "2023-07-21 TSLA &L:TSLA20240621C266.67&S:TSLA20240621C300 12.675 \n", - "2023-07-24 TSLA &L:TSLA20240621C266.67&S:TSLA20240621C300 13.450 \n", - "2023-07-25 TSLA &L:TSLA20240621C266.67&S:TSLA20240621C300 13.450 \n", - "2023-07-26 TSLA &L:TSLA20240621C266.67&S:TSLA20240621C300 13.375 \n", - "2023-07-27 TSLA &L:TSLA20240621C266.67&S:TSLA20240621C300 12.725 \n", - "2023-07-28 TSLA &L:TSLA20240621C266.67&S:TSLA20240621C300 12.025 \n", - "2023-07-31 TSLA &L:TSLA20240621C266.67&S:TSLA20240621C300 13.575 \n", - "\n", - " quantity market_value TSLA20230705LONG \n", - "datetime symbol \n", - "2023-07-05 TSLA 67 98825.0 TSLA20230705LONG \n", - " TSLA 67 98825.0 TSLA20230705LONG \n", - "2023-07-06 TSLA 67 98825.0 TSLA20230705LONG \n", - "2023-07-07 TSLA 67 93967.5 TSLA20230705LONG \n", - "2023-07-10 TSLA 67 90115.0 TSLA20230705LONG \n", - "2023-07-11 TSLA 67 90115.0 TSLA20230705LONG \n", - "2023-07-12 TSLA 67 89947.5 TSLA20230705LONG \n", - "2023-07-13 TSLA 67 92292.5 TSLA20230705LONG \n", - "2023-07-14 TSLA 67 95977.5 TSLA20230705LONG \n", - "2023-07-17 TSLA 67 103180.0 TSLA20230705LONG \n", - "2023-07-18 TSLA 67 103180.0 TSLA20230705LONG \n", - "2023-07-19 TSLA 67 103682.5 TSLA20230705LONG \n", - "2023-07-20 TSLA 67 103180.0 TSLA20230705LONG \n", - "2023-07-21 TSLA 67 84922.5 TSLA20230705LONG \n", - "2023-07-24 TSLA 67 90115.0 TSLA20230705LONG \n", - "2023-07-25 TSLA 67 90115.0 TSLA20230705LONG \n", - "2023-07-26 TSLA 67 89612.5 TSLA20230705LONG \n", - "2023-07-27 TSLA 67 85257.5 TSLA20230705LONG \n", - "2023-07-28 TSLA 67 80567.5 TSLA20230705LONG \n", - "2023-07-31 TSLA 67 90952.5 TSLA20230705LONG " - ] - }, - "execution_count": 108, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.portfolio.get_all_positions()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "ename": "KeyError", - "evalue": "'&L:TSLA20240621C283.33&S:TSLA20240621C400'", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mKeyError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[1;32mIn[109], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m pd\u001b[38;5;241m.\u001b[39mDataFrame([\u001b[43mevb_backtest\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mportfolio\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mnew_trades\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m&L:TSLA20240621C283.33&S:TSLA20240621C400\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m\u001b[38;5;241m.\u001b[39maggregate()])\n", - "\u001b[1;31mKeyError\u001b[0m: '&L:TSLA20240621C283.33&S:TSLA20240621C400'" - ] - } - ], - "source": [ - "pd.DataFrame([evb_backtest.portfolio.trades_map[\"&L:TSLA20240621C283.33&S:TSLA20240621C400\"].aggregate()])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
datetimeuidpricequantitysymbolcommissionmarket_valueslippagetotal_costaux_costdirectiontransaction_type
02023-07-05&L:TSLA20240621C283.33&S:TSLA20240621C400_TSLA...3425.9526552TSLA1.1166850.7893105.7893106851.9053106.905310BUYBUY
12023-08-02&L:TSLA20240621C283.33&S:TSLA20240621C400_TSLA...2546.9808492TSLA1.1165095.077698-4.9223025093.9616986.038302SELLSELL
\n", - "
" - ], - "text/plain": [ - " datetime uid price \\\n", - "0 2023-07-05 &L:TSLA20240621C283.33&S:TSLA20240621C400_TSLA... 3425.952655 \n", - "1 2023-08-02 &L:TSLA20240621C283.33&S:TSLA20240621C400_TSLA... 2546.980849 \n", - "\n", - " quantity symbol commission market_value slippage total_cost aux_cost \\\n", - "0 2 TSLA 1.116 6850.789310 5.789310 6851.905310 6.905310 \n", - "1 2 TSLA 1.116 5095.077698 -4.922302 5093.961698 6.038302 \n", - "\n", - " direction transaction_type \n", - "0 BUY BUY \n", - "1 SELL SELL " - ] - }, - "execution_count": 71, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.portfolio.trades_map[\"&L:TSLA20240621C283.33&S:TSLA20240621C400\"].entries()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
TickerPnLReturnPctEntryPriceEntryCommissionEntrySlippageEntryMarketValueTotalEntryCostAuxilaryEntryCostExitPriceExitCommissionExitSlippageExitMarketValueTotalExitCostAuxilaryExitCostQuantityEntryTimeExitTimeDurationPositionsSignalID
0TSLA-1758.187424-0.2566093425.8035591.1165.4911186850.49111868.5160716.6071182546.7098471.116-5.4643055094.53569550.9341976.58030522023-07-052023-08-0228&L:TSLA20240621C283.33&S:TSLA20240621C400TSLA20230705LONG
1AAPL-987.036652-0.2640681868.9041141.1163.6922283736.69222837.3780824.8082281375.3857881.116-4.1124232751.88757727.5077165.22842322023-07-052023-08-0430&L:AAPL20240621C195&S:AAPL20240621C270AAPL20230705LONG
2MSFT-834.910357-0.2663013135.2180160.5582.1600163134.66001631.3521802.7180162300.3076590.558-4.1343412300.86565923.0030774.69234112023-07-052023-08-0935&L:MSFT20240621C345&S:MSFT20240621C450MSFT20230705LONG
3AMZN-483.823998-0.3165821528.2745240.5582.7165241527.71652415.2827453.2745241044.4505260.558-1.4914741045.00852610.4445052.04947412023-07-052023-10-25112&L:AMZN20240621C132.5&S:AMZN20240621C185AMZN20230705LONG
5AVGO-1585.489899-0.2414693283.0097071.1164.9034146564.90341465.6601946.0194142490.2647581.116-8.3544854981.64551549.8052959.47048522023-07-052023-08-1844&L:AVGO20240119C900&S:AVGO20240119C1000AVGO20230705LONG
6BA-175.407686-0.245680713.9690260.5580.911026713.4110267.1396901.469026538.5613400.558-0.880660539.1193405.3856131.43866012023-08-102023-08-177&L:BA20240621C260&S:BA20240621C280BA20230810LONG
7WMT-281.398480-0.339162414.8436381.1160.571275828.5712758.2968731.687275274.1443981.116-0.595205549.4047955.4828881.71120522023-08-162023-08-171&L:WMT20231215C165&S:WMT20231215C180WMT20230810LONG
8TSLA-474.304591-0.0840212822.5271821.1163.9383645643.93836456.4505445.0543642585.3748871.116-8.1342275171.86577351.7074989.25022722023-08-172023-10-2064&L:TSLA20240920C220&S:TSLA20240920C310TSLA20230817LONG
9AAPL-510.410136-0.2500592041.1623050.5582.1043052040.60430520.4116232.6623051530.7521690.558-1.6898311531.31016915.3075222.24783112023-08-312023-09-077&L:AAPL20240920C190&S:AAPL20240920C260AAPL20230831LONG
10WMT-214.059682-0.464728460.6132050.5580.555205460.0552054.6061321.113205246.5535230.558-0.388477247.1115232.4655350.94647712023-09-142023-09-2915&L:WMT20240119C170&S:WMT20240119C200WMT20230913LONG
11INTC-57.534171-0.324527177.2859930.5580.227993176.7279931.7728600.785993119.7518220.558-0.190178120.3098221.1975180.74817812023-09-152023-09-205&L:INTC20240621C40&S:INTC20240621C45INTC20230915LONG
12QCOM3648.3613141.5459401179.9813241.1163.8466492358.84664923.5996264.9626493004.1619811.116-10.5600376009.43996360.08324011.67603722023-11-132024-07-01231&L:QCOM20250117C125&S:QCOM20250117C160QCOM20231113LONG
13MSFT3072.4239470.9846443120.3405110.5582.2825113119.78251131.2034052.8405116192.7644580.558-4.1775426193.32245861.9276454.73554212023-11-142024-07-01230&L:MSFT20241220C380&S:MSFT20241220C470MSFT20231114LONG
14SBUX-344.077913-0.295984581.2441241.1161.3722491161.37224911.6248822.488249409.2051681.116-0.473665819.5263358.1841031.58966522023-11-152023-11-2914&L:SBUX20250117C110&S:SBUX20250117C125SBUX20231115LONG
15AMD1129.8429331.223329923.5809170.5580.522917923.0229179.2358091.0809172053.4238500.558-3.5181502053.98185020.5342384.07615012023-11-152024-07-01229&L:AMD20240920C125&S:AMD20240920C155AMD20231115LONG
16MU2925.8769961.446230674.3686611.6743.9319842021.43198420.2310605.6059841649.6609931.674-6.8430204950.65698049.4898308.51702032023-11-162024-07-01228&L:MU20250117C80&S:MU20250117C100MU20231116LONG
17DIS-227.370915-0.309993733.4715570.5580.413557732.9135577.3347160.971557506.1006420.558-0.841358506.6586425.0610061.39935812023-11-172024-01-1054&L:DIS20240920C95&S:DIS20240920C115DIS20231117LONG
18INTC-111.874672-0.463237120.7530411.1160.390082240.3900822.4150611.50608264.8157051.116-0.252589130.7474111.2963141.36858922023-11-172024-04-03138&L:INTC20240920C47&S:INTC20240920C50INTC20231117LONG
19AAPL-520.586943-0.2853131824.6193990.5581.5613991824.06139918.2461942.1193991304.0324550.558-2.4095451304.59045513.0403252.96754512023-11-222024-01-0443&L:AAPL20241220C195&S:AAPL20241220C250AAPL20231122LONG
20BAC6031.1738481.505582267.0583748.3707.5056173997.50561740.05875615.875617669.1366318.370-12.08053510045.419465100.37049520.450535152023-12-012024-07-01213&L:BAC20250117C32&S:BAC20250117C42BAC20231201LONG
21BA-252.952595-0.349142724.4982240.5581.440224723.9402247.2449821.998224471.5456290.558-0.396371472.1036294.7154560.95437112023-12-042024-01-1239&L:BA20250117C280&S:BA20250117C310BA20231204LONG
22HD52.3142080.072514721.4386610.5580.880661720.8806617.2143871.438661773.7528690.558-0.689131774.3108697.7375291.24713112023-12-042024-04-17135&L:HD20250117C350&S:HD20250117C370HD20231204LONG
23GOOG-1047.172193-0.3296021588.5383871.1165.9607733175.96077331.7707687.0767731064.9522901.116-1.9794202131.02058021.2990463.09542022024-01-262024-01-315&L:GOOG20250117C155&S:GOOG20250117C210GOOG20240126LONG
24WMT55.3425680.149173370.9953090.5580.437309370.4373093.7099530.995309426.3378770.558-0.604123426.8958774.2633791.16212312024-02-052024-07-01147&L:WMT20250117C180&S:WMT20250117C190WMT20240205LONG
25DIS-122.949994-0.175196701.7858440.5581.227844701.2278447.0178581.785844578.8358500.558-1.106150579.3938505.7883591.66415012024-02-072024-05-1699&L:DIS20250117C110&S:DIS20250117C140DIS20240207LONG
26AMZN984.1685850.6074641620.1277740.5582.0697741619.56977416.2012782.6277742604.2963590.558-2.6456412604.85435926.0429643.20364112024-02-082024-07-01144&L:AMZN20250117C175&S:AMZN20250117C230AMZN20240208LONG
27GOOG2886.7692401.052930913.8840801.6742.4782402739.97824027.4165224.1522401876.1404931.674-9.9045205630.09548056.28421511.57852032024-04-032024-07-0189&L:GOOG20250321C170&S:GOOG20250321C210GOOG20240403LONG
28AAPL1339.4510100.7248701847.8508370.5582.7928371847.29283718.4785083.3508373187.3018470.558-4.6401533187.85984731.8730185.19815312024-05-212024-07-0141&L:AAPL20250620C195&S:AAPL20250620C270AAPL20240521LONG
29NVDA22126.3772070.5022118811.5870902.79042.64544844055.145448440.57935445.43544813236.8625312.790-125.39734566187.102655661.843127128.18734552024-05-222024-07-0140&L:NVDA20250620C950&S:NVDA20250620C1200NVDA20230705LONG
\n", - "
" - ], - "text/plain": [ - " Ticker PnL ReturnPct EntryPrice EntryCommission \\\n", - "0 TSLA -1758.187424 -0.256609 3425.803559 1.116 \n", - "1 AAPL -987.036652 -0.264068 1868.904114 1.116 \n", - "2 MSFT -834.910357 -0.266301 3135.218016 0.558 \n", - "3 AMZN -483.823998 -0.316582 1528.274524 0.558 \n", - "5 AVGO -1585.489899 -0.241469 3283.009707 1.116 \n", - "6 BA -175.407686 -0.245680 713.969026 0.558 \n", - "7 WMT -281.398480 -0.339162 414.843638 1.116 \n", - "8 TSLA -474.304591 -0.084021 2822.527182 1.116 \n", - "9 AAPL -510.410136 -0.250059 2041.162305 0.558 \n", - "10 WMT -214.059682 -0.464728 460.613205 0.558 \n", - "11 INTC -57.534171 -0.324527 177.285993 0.558 \n", - "12 QCOM 3648.361314 1.545940 1179.981324 1.116 \n", - "13 MSFT 3072.423947 0.984644 3120.340511 0.558 \n", - "14 SBUX -344.077913 -0.295984 581.244124 1.116 \n", - "15 AMD 1129.842933 1.223329 923.580917 0.558 \n", - "16 MU 2925.876996 1.446230 674.368661 1.674 \n", - "17 DIS -227.370915 -0.309993 733.471557 0.558 \n", - "18 INTC -111.874672 -0.463237 120.753041 1.116 \n", - "19 AAPL -520.586943 -0.285313 1824.619399 0.558 \n", - "20 BAC 6031.173848 1.505582 267.058374 8.370 \n", - "21 BA -252.952595 -0.349142 724.498224 0.558 \n", - "22 HD 52.314208 0.072514 721.438661 0.558 \n", - "23 GOOG -1047.172193 -0.329602 1588.538387 1.116 \n", - "24 WMT 55.342568 0.149173 370.995309 0.558 \n", - "25 DIS -122.949994 -0.175196 701.785844 0.558 \n", - "26 AMZN 984.168585 0.607464 1620.127774 0.558 \n", - "27 GOOG 2886.769240 1.052930 913.884080 1.674 \n", - "28 AAPL 1339.451010 0.724870 1847.850837 0.558 \n", - "29 NVDA 22126.377207 0.502211 8811.587090 2.790 \n", - "\n", - " EntrySlippage EntryMarketValue TotalEntryCost AuxilaryEntryCost \\\n", - "0 5.491118 6850.491118 68.516071 6.607118 \n", - "1 3.692228 3736.692228 37.378082 4.808228 \n", - "2 2.160016 3134.660016 31.352180 2.718016 \n", - "3 2.716524 1527.716524 15.282745 3.274524 \n", - "5 4.903414 6564.903414 65.660194 6.019414 \n", - "6 0.911026 713.411026 7.139690 1.469026 \n", - "7 0.571275 828.571275 8.296873 1.687275 \n", - "8 3.938364 5643.938364 56.450544 5.054364 \n", - "9 2.104305 2040.604305 20.411623 2.662305 \n", - "10 0.555205 460.055205 4.606132 1.113205 \n", - "11 0.227993 176.727993 1.772860 0.785993 \n", - "12 3.846649 2358.846649 23.599626 4.962649 \n", - "13 2.282511 3119.782511 31.203405 2.840511 \n", - "14 1.372249 1161.372249 11.624882 2.488249 \n", - "15 0.522917 923.022917 9.235809 1.080917 \n", - "16 3.931984 2021.431984 20.231060 5.605984 \n", - "17 0.413557 732.913557 7.334716 0.971557 \n", - "18 0.390082 240.390082 2.415061 1.506082 \n", - "19 1.561399 1824.061399 18.246194 2.119399 \n", - "20 7.505617 3997.505617 40.058756 15.875617 \n", - "21 1.440224 723.940224 7.244982 1.998224 \n", - "22 0.880661 720.880661 7.214387 1.438661 \n", - "23 5.960773 3175.960773 31.770768 7.076773 \n", - "24 0.437309 370.437309 3.709953 0.995309 \n", - "25 1.227844 701.227844 7.017858 1.785844 \n", - "26 2.069774 1619.569774 16.201278 2.627774 \n", - "27 2.478240 2739.978240 27.416522 4.152240 \n", - "28 2.792837 1847.292837 18.478508 3.350837 \n", - "29 42.645448 44055.145448 440.579354 45.435448 \n", - "\n", - " ExitPrice ExitCommission ExitSlippage ExitMarketValue \\\n", - "0 2546.709847 1.116 -5.464305 5094.535695 \n", - "1 1375.385788 1.116 -4.112423 2751.887577 \n", - "2 2300.307659 0.558 -4.134341 2300.865659 \n", - "3 1044.450526 0.558 -1.491474 1045.008526 \n", - "5 2490.264758 1.116 -8.354485 4981.645515 \n", - "6 538.561340 0.558 -0.880660 539.119340 \n", - "7 274.144398 1.116 -0.595205 549.404795 \n", - "8 2585.374887 1.116 -8.134227 5171.865773 \n", - "9 1530.752169 0.558 -1.689831 1531.310169 \n", - "10 246.553523 0.558 -0.388477 247.111523 \n", - "11 119.751822 0.558 -0.190178 120.309822 \n", - "12 3004.161981 1.116 -10.560037 6009.439963 \n", - "13 6192.764458 0.558 -4.177542 6193.322458 \n", - "14 409.205168 1.116 -0.473665 819.526335 \n", - "15 2053.423850 0.558 -3.518150 2053.981850 \n", - "16 1649.660993 1.674 -6.843020 4950.656980 \n", - "17 506.100642 0.558 -0.841358 506.658642 \n", - "18 64.815705 1.116 -0.252589 130.747411 \n", - "19 1304.032455 0.558 -2.409545 1304.590455 \n", - "20 669.136631 8.370 -12.080535 10045.419465 \n", - "21 471.545629 0.558 -0.396371 472.103629 \n", - "22 773.752869 0.558 -0.689131 774.310869 \n", - "23 1064.952290 1.116 -1.979420 2131.020580 \n", - "24 426.337877 0.558 -0.604123 426.895877 \n", - "25 578.835850 0.558 -1.106150 579.393850 \n", - "26 2604.296359 0.558 -2.645641 2604.854359 \n", - "27 1876.140493 1.674 -9.904520 5630.095480 \n", - "28 3187.301847 0.558 -4.640153 3187.859847 \n", - "29 13236.862531 2.790 -125.397345 66187.102655 \n", - "\n", - " TotalExitCost AuxilaryExitCost Quantity EntryTime ExitTime Duration \\\n", - "0 50.934197 6.580305 2 2023-07-05 2023-08-02 28 \n", - "1 27.507716 5.228423 2 2023-07-05 2023-08-04 30 \n", - "2 23.003077 4.692341 1 2023-07-05 2023-08-09 35 \n", - "3 10.444505 2.049474 1 2023-07-05 2023-10-25 112 \n", - "5 49.805295 9.470485 2 2023-07-05 2023-08-18 44 \n", - "6 5.385613 1.438660 1 2023-08-10 2023-08-17 7 \n", - "7 5.482888 1.711205 2 2023-08-16 2023-08-17 1 \n", - "8 51.707498 9.250227 2 2023-08-17 2023-10-20 64 \n", - "9 15.307522 2.247831 1 2023-08-31 2023-09-07 7 \n", - "10 2.465535 0.946477 1 2023-09-14 2023-09-29 15 \n", - "11 1.197518 0.748178 1 2023-09-15 2023-09-20 5 \n", - "12 60.083240 11.676037 2 2023-11-13 2024-07-01 231 \n", - "13 61.927645 4.735542 1 2023-11-14 2024-07-01 230 \n", - "14 8.184103 1.589665 2 2023-11-15 2023-11-29 14 \n", - "15 20.534238 4.076150 1 2023-11-15 2024-07-01 229 \n", - "16 49.489830 8.517020 3 2023-11-16 2024-07-01 228 \n", - "17 5.061006 1.399358 1 2023-11-17 2024-01-10 54 \n", - "18 1.296314 1.368589 2 2023-11-17 2024-04-03 138 \n", - "19 13.040325 2.967545 1 2023-11-22 2024-01-04 43 \n", - "20 100.370495 20.450535 15 2023-12-01 2024-07-01 213 \n", - "21 4.715456 0.954371 1 2023-12-04 2024-01-12 39 \n", - "22 7.737529 1.247131 1 2023-12-04 2024-04-17 135 \n", - "23 21.299046 3.095420 2 2024-01-26 2024-01-31 5 \n", - "24 4.263379 1.162123 1 2024-02-05 2024-07-01 147 \n", - "25 5.788359 1.664150 1 2024-02-07 2024-05-16 99 \n", - "26 26.042964 3.203641 1 2024-02-08 2024-07-01 144 \n", - "27 56.284215 11.578520 3 2024-04-03 2024-07-01 89 \n", - "28 31.873018 5.198153 1 2024-05-21 2024-07-01 41 \n", - "29 661.843127 128.187345 5 2024-05-22 2024-07-01 40 \n", - "\n", - " Positions SignalID \n", - "0 &L:TSLA20240621C283.33&S:TSLA20240621C400 TSLA20230705LONG \n", - "1 &L:AAPL20240621C195&S:AAPL20240621C270 AAPL20230705LONG \n", - "2 &L:MSFT20240621C345&S:MSFT20240621C450 MSFT20230705LONG \n", - "3 &L:AMZN20240621C132.5&S:AMZN20240621C185 AMZN20230705LONG \n", - "5 &L:AVGO20240119C900&S:AVGO20240119C1000 AVGO20230705LONG \n", - "6 &L:BA20240621C260&S:BA20240621C280 BA20230810LONG \n", - "7 &L:WMT20231215C165&S:WMT20231215C180 WMT20230810LONG \n", - "8 &L:TSLA20240920C220&S:TSLA20240920C310 TSLA20230817LONG \n", - "9 &L:AAPL20240920C190&S:AAPL20240920C260 AAPL20230831LONG \n", - "10 &L:WMT20240119C170&S:WMT20240119C200 WMT20230913LONG \n", - "11 &L:INTC20240621C40&S:INTC20240621C45 INTC20230915LONG \n", - "12 &L:QCOM20250117C125&S:QCOM20250117C160 QCOM20231113LONG \n", - "13 &L:MSFT20241220C380&S:MSFT20241220C470 MSFT20231114LONG \n", - "14 &L:SBUX20250117C110&S:SBUX20250117C125 SBUX20231115LONG \n", - "15 &L:AMD20240920C125&S:AMD20240920C155 AMD20231115LONG \n", - "16 &L:MU20250117C80&S:MU20250117C100 MU20231116LONG \n", - "17 &L:DIS20240920C95&S:DIS20240920C115 DIS20231117LONG \n", - "18 &L:INTC20240920C47&S:INTC20240920C50 INTC20231117LONG \n", - "19 &L:AAPL20241220C195&S:AAPL20241220C250 AAPL20231122LONG \n", - "20 &L:BAC20250117C32&S:BAC20250117C42 BAC20231201LONG \n", - "21 &L:BA20250117C280&S:BA20250117C310 BA20231204LONG \n", - "22 &L:HD20250117C350&S:HD20250117C370 HD20231204LONG \n", - "23 &L:GOOG20250117C155&S:GOOG20250117C210 GOOG20240126LONG \n", - "24 &L:WMT20250117C180&S:WMT20250117C190 WMT20240205LONG \n", - "25 &L:DIS20250117C110&S:DIS20250117C140 DIS20240207LONG \n", - "26 &L:AMZN20250117C175&S:AMZN20250117C230 AMZN20240208LONG \n", - "27 &L:GOOG20250321C170&S:GOOG20250321C210 GOOG20240403LONG \n", - "28 &L:AAPL20250620C195&S:AAPL20250620C270 AAPL20240521LONG \n", - "29 &L:NVDA20250620C950&S:NVDA20250620C1200 NVDA20230705LONG " - ] - }, - "execution_count": 111, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "trades =evb_backtest.portfolio.trades.drop_duplicates(subset=['SignalID'], keep='last')\n", - "trades" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
typesymbolsignal_typesignal_idmax_contract_priceorder_settingsreasonorder_typequantitydirectionpositionexchangefill_costmarket_valueslippagecommission
datetime
2023-07-31SIGNALJNJCLOSEJNJ20230731LONGNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-07-31SIGNALJNJLONGJNJ20230731LONGNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-07-31FILLJNJNaNJNJ20230731LONGNaNNaNNaNNaN7.0BUY{'long': ['JNJ20240621C160'], 'short': ['JNJ20...ARCA88.97458888.9355280.1755280.03906
2023-07-31ORDERJNJNaNJNJ20230731LONGNaNNaNNaNMKT7.0BUY{'long': ['JNJ20240621C160'], 'short': ['JNJ20...NaNNaNNaNNaNNaN
2024-05-22ROLLJNJLONGJNJ20230731LONGNaNNaNNaNNaNNaNNaN{'position': {'long': ['JNJ20240621C160'], 'sh...NaNNaNNaNNaNNaN
\n", - "
" - ], - "text/plain": [ - " type symbol signal_type signal_id max_contract_price \\\n", - "datetime \n", - "2023-07-31 SIGNAL JNJ CLOSE JNJ20230731LONG NaN \n", - "2023-07-31 SIGNAL JNJ LONG JNJ20230731LONG NaN \n", - "2023-07-31 FILL JNJ NaN JNJ20230731LONG NaN \n", - "2023-07-31 ORDER JNJ NaN JNJ20230731LONG NaN \n", - "2024-05-22 ROLL JNJ LONG JNJ20230731LONG NaN \n", - "\n", - " order_settings reason order_type quantity direction \\\n", - "datetime \n", - "2023-07-31 NaN NaN NaN NaN NaN \n", - "2023-07-31 NaN NaN NaN NaN NaN \n", - "2023-07-31 NaN NaN NaN 7.0 BUY \n", - "2023-07-31 NaN NaN MKT 7.0 BUY \n", - "2024-05-22 NaN NaN NaN NaN NaN \n", - "\n", - " position exchange \\\n", - "datetime \n", - "2023-07-31 NaN NaN \n", - "2023-07-31 NaN NaN \n", - "2023-07-31 {'long': ['JNJ20240621C160'], 'short': ['JNJ20... ARCA \n", - "2023-07-31 {'long': ['JNJ20240621C160'], 'short': ['JNJ20... NaN \n", - "2024-05-22 {'position': {'long': ['JNJ20240621C160'], 'sh... NaN \n", - "\n", - " fill_cost market_value slippage commission \n", - "datetime \n", - "2023-07-31 NaN NaN NaN NaN \n", - "2023-07-31 NaN NaN NaN NaN \n", - "2023-07-31 88.974588 88.935528 0.175528 0.03906 \n", - "2023-07-31 NaN NaN NaN NaN \n", - "2024-05-22 NaN NaN NaN NaN " - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "events_df = evb_backtest.eventScheduler.events\n", - "events_df = events_df[events_df['symbol'] == 'JNJ']\n", - "events_df" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
typesymbolsignal_typesignal_idmax_contract_priceorder_settingsreasonorder_typequantitydirectionpositionexchangefill_costmarket_valueslippagecommission
datetime
2023-07-05SIGNALNVDALONGNVDA20230705LONGNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2023-07-05ORDERNVDANaNNVDA20230705LONGNaNNaNNaNMKT1.0BUY{'long': ['NVDA20240621C410'], 'short': ['NVDA...NaNNaNNaNNaNNaN
2023-07-05FILLNVDANaNNVDA20230705LONGNaNNaNNaNNaN1.0BUY{'long': ['NVDA20240621C410'], 'short': ['NVDA...ARCA48.66880948.6632290.0632290.00558
2024-05-22ORDERNVDANaNNVDA20230705LONGNaNNaNNaNMKT3.0BUY{'long': ['NVDA20250620C1050'], 'short': ['NVD...NaNNaNNaNNaNNaN
2024-05-22ROLLNVDALONGNVDA20230705LONGNaNNaNNaNNaNNaNNaN{'position': {'long': ['NVDA20240621C410'], 's...NaNNaNNaNNaNNaN
2024-05-22SIGNALNVDACLOSENVDA20230705LONGNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2024-05-22ORDERNVDANaNNVDA20230705LONGNaNNaNNaNMKT1.0SELL{'long': ['NVDA20240621C410'], 'short': ['NVDA...NaNNaNNaNNaNNaN
2024-05-22FILLNVDANaNNVDA20230705LONGNaNNaNNaNNaN1.0SELL{'long': ['NVDA20240621C410'], 'short': ['NVDA...ARCA139.143749139.149329-0.1006710.00558
2024-05-22SIGNALNVDALONGNVDA20230705LONGNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2024-05-22FILLNVDANaNNVDA20230705LONGNaNNaNNaNNaN3.0BUY{'long': ['NVDA20250620C1050'], 'short': ['NVD...ARCA144.191648144.1749080.1749080.01674
2024-07-01SIGNALNVDACLOSENVDA20240701LONGNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
\n", - "
" - ], - "text/plain": [ - " type symbol signal_type signal_id max_contract_price \\\n", - "datetime \n", - "2023-07-05 SIGNAL NVDA LONG NVDA20230705LONG NaN \n", - "2023-07-05 ORDER NVDA NaN NVDA20230705LONG NaN \n", - "2023-07-05 FILL NVDA NaN NVDA20230705LONG NaN \n", - "2024-05-22 ORDER NVDA NaN NVDA20230705LONG NaN \n", - "2024-05-22 ROLL NVDA LONG NVDA20230705LONG NaN \n", - "2024-05-22 SIGNAL NVDA CLOSE NVDA20230705LONG NaN \n", - "2024-05-22 ORDER NVDA NaN NVDA20230705LONG NaN \n", - "2024-05-22 FILL NVDA NaN NVDA20230705LONG NaN \n", - "2024-05-22 SIGNAL NVDA LONG NVDA20230705LONG NaN \n", - "2024-05-22 FILL NVDA NaN NVDA20230705LONG NaN \n", - "2024-07-01 SIGNAL NVDA CLOSE NVDA20240701LONG NaN \n", - "\n", - " order_settings reason order_type quantity direction \\\n", - "datetime \n", - "2023-07-05 NaN NaN NaN NaN NaN \n", - "2023-07-05 NaN NaN MKT 1.0 BUY \n", - "2023-07-05 NaN NaN NaN 1.0 BUY \n", - "2024-05-22 NaN NaN MKT 3.0 BUY \n", - "2024-05-22 NaN NaN NaN NaN NaN \n", - "2024-05-22 NaN NaN NaN NaN NaN \n", - "2024-05-22 NaN NaN MKT 1.0 SELL \n", - "2024-05-22 NaN NaN NaN 1.0 SELL \n", - "2024-05-22 NaN NaN NaN NaN NaN \n", - "2024-05-22 NaN NaN NaN 3.0 BUY \n", - "2024-07-01 NaN NaN NaN NaN NaN \n", - "\n", - " position exchange \\\n", - "datetime \n", - "2023-07-05 NaN NaN \n", - "2023-07-05 {'long': ['NVDA20240621C410'], 'short': ['NVDA... NaN \n", - "2023-07-05 {'long': ['NVDA20240621C410'], 'short': ['NVDA... ARCA \n", - "2024-05-22 {'long': ['NVDA20250620C1050'], 'short': ['NVD... NaN \n", - "2024-05-22 {'position': {'long': ['NVDA20240621C410'], 's... NaN \n", - "2024-05-22 NaN NaN \n", - "2024-05-22 {'long': ['NVDA20240621C410'], 'short': ['NVDA... NaN \n", - "2024-05-22 {'long': ['NVDA20240621C410'], 'short': ['NVDA... ARCA \n", - "2024-05-22 NaN NaN \n", - "2024-05-22 {'long': ['NVDA20250620C1050'], 'short': ['NVD... ARCA \n", - "2024-07-01 NaN NaN \n", - "\n", - " fill_cost market_value slippage commission \n", - "datetime \n", - "2023-07-05 NaN NaN NaN NaN \n", - "2023-07-05 NaN NaN NaN NaN \n", - "2023-07-05 48.668809 48.663229 0.063229 0.00558 \n", - "2024-05-22 NaN NaN NaN NaN \n", - "2024-05-22 NaN NaN NaN NaN \n", - "2024-05-22 NaN NaN NaN NaN \n", - "2024-05-22 NaN NaN NaN NaN \n", - "2024-05-22 139.143749 139.149329 -0.100671 0.00558 \n", - "2024-05-22 NaN NaN NaN NaN \n", - "2024-05-22 144.191648 144.174908 0.174908 0.01674 \n", - "2024-07-01 NaN NaN NaN NaN " - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "events_df = evb_backtest.eventScheduler.events\n", - "events_df = events_df[events_df['symbol'] == 'NVDA']\n", - "events_df" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Buy Details\n", - "Position: {'long': ['TSLA20240621C260'], 'short': ['TSLA20240621C370'], 'trade_id': '&L:TSLA20240621C260&S:TSLA20240621C370', 'close': 39.22500000000001}, Date: 2023-07-05, Signal: SignalEvent type:LONG, symbol=TSLA, date:2023-07-05 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:TSLA20230705LONG\n", - "Max Contract Price: 50.0, Cash at Hand: 90.0\n", - "Order Quantity 2 Cash at Hand 90.0 Close 39.22500000000001\n", - "Processing event: SIGNAL\n", - "Buy Details\n", - "Position: {'long': ['AAPL20240621C175'], 'short': ['AAPL20240621C255'], 'trade_id': '&L:AAPL20240621C175&S:AAPL20240621C255', 'close': 30.55}, Date: 2023-07-05, Signal: SignalEvent type:LONG, symbol=AAPL, date:2023-07-05 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:AAPL20230705LONG\n", - "Max Contract Price: 50.0, Cash at Hand: 90.0\n", - "Order Quantity 2 Cash at Hand 90.0 Close 30.55\n", - "Processing event: SIGNAL\n", - "Buy Details\n", - "Position: {'long': ['MSFT20240621C315'], 'short': ['MSFT20240621C450'], 'trade_id': '&L:MSFT20240621C315&S:MSFT20240621C450', 'close': 49.60000000000001}, Date: 2023-07-05, Signal: SignalEvent type:LONG, symbol=MSFT, date:2023-07-05 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:MSFT20230705LONG\n", - "Max Contract Price: 50.0, Cash at Hand: 90.0\n", - "Order Quantity 1 Cash at Hand 90.0 Close 49.60000000000001\n", - "Processing event: SIGNAL\n", - "Not generating order because:TOO_ILLIQUID SignalEvent type:LONG, symbol=AVGO, date:2023-07-05 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:AVGO20230705LONG\n", - "Processing event: SIGNAL\n", - "Buy Details\n", - "Position: {'long': ['AMZN20240621C120'], 'short': ['AMZN20240621C170'], 'trade_id': '&L:AMZN20240621C120&S:AMZN20240621C170', 'close': 19.950000000000003}, Date: 2023-07-05, Signal: SignalEvent type:LONG, symbol=AMZN, date:2023-07-05 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:AMZN20230705LONG\n", - "Max Contract Price: 50.0, Cash at Hand: 90.0\n", - "Order Quantity 4 Cash at Hand 90.0 Close 19.950000000000003\n", - "Processing event: SIGNAL\n", - "Buy Details\n", - "Position: {'long': ['NVDA20240621C410'], 'short': ['NVDA20240621C550'], 'trade_id': '&L:NVDA20240621C410&S:NVDA20240621C550', 'close': 48.6}, Date: 2023-07-05, Signal: SignalEvent type:LONG, symbol=NVDA, date:2023-07-05 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:NVDA20230705LONG\n", - "Max Contract Price: 50.0, Cash at Hand: 90.0\n", - "Order Quantity 1 Cash at Hand 90.0 Close 48.6\n", - "Processing event: ORDER\n", - "Buy Order Position: {'long': ['TSLA20240621C260'], 'short': ['TSLA20240621C370'], 'trade_id': '&L:TSLA20240621C260&S:TSLA20240621C370', 'close': 39.22500000000001} Price: 39.27792583633039 Quantity: 2 Datetime: 2023-07-05 00:00:00\n", - "Processing event: ORDER\n", - "Buy Order Position: {'long': ['AAPL20240621C175'], 'short': ['AAPL20240621C255'], 'trade_id': '&L:AAPL20240621C175&S:AAPL20240621C255', 'close': 30.55} Price: 30.569138611398024 Quantity: 2 Datetime: 2023-07-05 00:00:00\n", - "Processing event: ORDER\n", - "Buy Order Position: {'long': ['MSFT20240621C315'], 'short': ['MSFT20240621C450'], 'trade_id': '&L:MSFT20240621C315&S:MSFT20240621C450', 'close': 49.60000000000001} Price: 49.676043269248446 Quantity: 1 Datetime: 2023-07-05 00:00:00\n", - "Processing event: ORDER\n", - "Buy Order Position: {'long': ['AMZN20240621C120'], 'short': ['AMZN20240621C170'], 'trade_id': '&L:AMZN20240621C120&S:AMZN20240621C170', 'close': 19.950000000000003} Price: 19.971959596181613 Quantity: 4 Datetime: 2023-07-05 00:00:00\n", - "Processing event: ORDER\n", - "Buy Order Position: {'long': ['NVDA20240621C410'], 'short': ['NVDA20240621C550'], 'trade_id': '&L:NVDA20240621C410&S:NVDA20240621C550', 'close': 48.6} Price: 48.66322876994031 Quantity: 1 Datetime: 2023-07-05 00:00:00\n", - "Processing event: FILL\n", - "2023-07-05 00:00:00\n", - "TSLA BUY\n", - "Processing event: FILL\n", - "2023-07-05 00:00:00\n", - "AAPL BUY\n", - "Processing event: FILL\n", - "2023-07-05 00:00:00\n", - "MSFT BUY\n", - "Processing event: FILL\n", - "2023-07-05 00:00:00\n", - "AMZN BUY\n", - "Processing event: FILL\n", - "2023-07-05 00:00:00\n", - "NVDA BUY\n", - "Event queue is empty, processed 17 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Buy Details\n", - "Position: {'long': ['JNJ20240621C160'], 'short': ['JNJ20240621C190'], 'trade_id': '&L:JNJ20240621C160&S:JNJ20240621C190', 'close': 12.68}, Date: 2023-07-31, Signal: SignalEvent type:LONG, symbol=JNJ, date:2023-07-31 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:JNJ20230731LONG\n", - "Max Contract Price: 50.0, Cash at Hand: 90.0\n", - "Order Quantity 7 Cash at Hand 90.0 Close 12.68\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Not generating order because:TOO_ILLIQUID SignalEvent type:LONG, symbol=HD, date:2023-07-31 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:HD20230731LONG\n", - "Processing event: ORDER\n", - "Buy Order Position: {'long': ['JNJ20240621C160'], 'short': ['JNJ20240621C190'], 'trade_id': '&L:JNJ20240621C160&S:JNJ20240621C190', 'close': 12.68} Price: 12.705075407081907 Quantity: 7 Datetime: 2023-07-31 00:00:00\n", - "Processing event: FILL\n", - "2023-07-31 00:00:00\n", - "JNJ BUY\n", - "Event queue is empty, processed 6 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Sell Order Position: {'long': ['TSLA20240621C260'], 'short': ['TSLA20240621C370'], 'trade_id': '&L:TSLA20240621C260&S:TSLA20240621C370', 'close': 32.75} Price: 32.72480369520586 Quantity: 2 Datetime: 2023-08-02 00:00:00\n", - "Processing event: FILL\n", - "2023-08-02 00:00:00\n", - "TSLA SELL\n", - "FillEvent symbol=TSLA, date:2023-08-02 00:00:00, exchange=ARCA, quantity=2, direction=SELL, fill_cost=65.43844739041171, commission=0.01116, market_value=65.44960739041171, slippage=-0.050392609588286064, position={'long': ['TSLA20240621C260'], 'short': ['TSLA20240621C370'], 'trade_id': '&L:TSLA20240621C260&S:TSLA20240621C370', 'close': 32.75}, signal_id=TSLA20230705LONG\n", - "65.43844739041171\n", - "{'long': ['TSLA20240621C260'], 'short': ['TSLA20240621C370'], 'trade_id': '&L:TSLA20240621C260&S:TSLA20240621C370', 'close': 32.75}\n", - "Current Cash at Sell: 2143.2988327339217\n", - "Cash at Sell if we add FillCost: 8687.143571775094\n", - "Event queue is empty, processed 4 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Sell Order Position: {'long': ['AAPL20240621C175'], 'short': ['AAPL20240621C255'], 'trade_id': '&L:AAPL20240621C175&S:AAPL20240621C255', 'close': 29.975} Price: 29.919379360520356 Quantity: 2 Datetime: 2023-08-04 00:00:00\n", - "Processing event: FILL\n", - "2023-08-04 00:00:00\n", - "AAPL SELL\n", - "FillEvent symbol=AAPL, date:2023-08-04 00:00:00, exchange=ARCA, quantity=2, direction=SELL, fill_cost=59.827598721040715, commission=0.01116, market_value=59.83875872104071, slippage=-0.11124127895929092, position={'long': ['AAPL20240621C175'], 'short': ['AAPL20240621C255'], 'trade_id': '&L:AAPL20240621C175&S:AAPL20240621C255', 'close': 29.975}, signal_id=AAPL20230705LONG\n", - "59.827598721040715\n", - "{'long': ['AAPL20240621C175'], 'short': ['AAPL20240621C255'], 'trade_id': '&L:AAPL20240621C175&S:AAPL20240621C255', 'close': 29.975}\n", - "Current Cash at Sell: 3885.056277720396\n", - "Cash at Sell if we add FillCost: 9867.816149824466\n", - "Event queue is empty, processed 4 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Sell Order Position: {'long': ['MSFT20240621C315'], 'short': ['MSFT20240621C450'], 'trade_id': '&L:MSFT20240621C315&S:MSFT20240621C450', 'close': 40.175} Price: 40.105329775904 Quantity: 1 Datetime: 2023-08-09 00:00:00\n", - "Processing event: FILL\n", - "2023-08-09 00:00:00\n", - "MSFT SELL\n", - "FillEvent symbol=MSFT, date:2023-08-09 00:00:00, exchange=ARCA, quantity=1, direction=SELL, fill_cost=40.099749775904, commission=0.00558, market_value=40.105329775904, slippage=-0.06967022409599366, position={'long': ['MSFT20240621C315'], 'short': ['MSFT20240621C450'], 'trade_id': '&L:MSFT20240621C315&S:MSFT20240621C450', 'close': 40.175}, signal_id=MSFT20230705LONG\n", - "40.099749775904\n", - "{'long': ['MSFT20240621C315'], 'short': ['MSFT20240621C450'], 'trade_id': '&L:MSFT20240621C315&S:MSFT20240621C450', 'close': 40.175}\n", - "Current Cash at Sell: 5031.837673075155\n", - "Cash at Sell if we add FillCost: 9041.812650665555\n", - "Event queue is empty, processed 4 event(s)\n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Buy Details\n", - "Position: {'long': ['BA20240621C220'], 'short': ['BA20240621C310'], 'trade_id': '&L:BA20240621C220&S:BA20240621C310', 'close': 35.474999999999994}, Date: 2023-08-10, Signal: SignalEvent type:LONG, symbol=BA, date:2023-08-10 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:BA20230810LONG\n", - "Max Contract Price: 50.0, Cash at Hand: 90.0\n", - "Order Quantity 2 Cash at Hand 90.0 Close 35.474999999999994\n", - "Processing event: SIGNAL\n", - "Buy Details\n", - "Position: {'long': ['WMT20240621C160'], 'short': ['WMT20240621C175'], 'trade_id': '&L:WMT20240621C160&S:WMT20240621C175', 'close': 7.625}, Date: 2023-08-10, Signal: SignalEvent type:LONG, symbol=WMT, date:2023-08-10 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:WMT20230810LONG\n", - "Max Contract Price: 50.0, Cash at Hand: 90.0\n", - "Order Quantity 11 Cash at Hand 90.0 Close 7.625\n", - "Processing event: ORDER\n", - "Buy Order Position: {'long': ['BA20240621C220'], 'short': ['BA20240621C310'], 'trade_id': '&L:BA20240621C220&S:BA20240621C310', 'close': 35.474999999999994} Price: 35.51816704318618 Quantity: 2 Datetime: 2023-08-10 00:00:00\n", - "Processing event: ORDER\n", - "Buy Order Position: {'long': ['WMT20240621C160'], 'short': ['WMT20240621C175'], 'trade_id': '&L:WMT20240621C160&S:WMT20240621C175', 'close': 7.625} Price: 7.631772170675608 Quantity: 11 Datetime: 2023-08-10 00:00:00\n", - "Processing event: FILL\n", - "2023-08-10 00:00:00\n", - "BA BUY\n", - "Processing event: FILL\n", - "2023-08-10 00:00:00\n", - "WMT BUY\n", - "Event queue is empty, processed 7 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Sell Order Position: {'long': ['BA20240621C220'], 'short': ['BA20240621C310'], 'trade_id': '&L:BA20240621C220&S:BA20240621C310', 'close': 30.974999999999998} Price: 30.93354619652879 Quantity: 2 Datetime: 2023-08-17 00:00:00\n", - "Processing event: ORDER\n", - "Sell Order Position: {'long': ['WMT20240621C160'], 'short': ['WMT20240621C175'], 'trade_id': '&L:WMT20240621C160&S:WMT20240621C175', 'close': 7.3999999999999995} Price: 7.386899940704534 Quantity: 11 Datetime: 2023-08-17 00:00:00\n", - "Processing event: FILL\n", - "2023-08-17 00:00:00\n", - "BA SELL\n", - "FillEvent symbol=BA, date:2023-08-17 00:00:00, exchange=ARCA, quantity=2, direction=SELL, fill_cost=61.855932393057586, commission=0.01116, market_value=61.86709239305758, slippage=-0.08290760694241328, position={'long': ['BA20240621C220'], 'short': ['BA20240621C310'], 'trade_id': '&L:BA20240621C220&S:BA20240621C310', 'close': 30.974999999999998}, signal_id=BA20230810LONG\n", - "61.855932393057586\n", - "{'long': ['BA20240621C220'], 'short': ['BA20240621C310'], 'trade_id': '&L:BA20240621C220&S:BA20240621C310', 'close': 30.974999999999998}\n", - "Current Cash at Sell: 2895.250591362763\n", - "Cash at Sell if we add FillCost: 9080.84383066852\n", - "Processing event: FILL\n", - "2023-08-17 00:00:00\n", - "WMT SELL\n", - "FillEvent symbol=WMT, date:2023-08-17 00:00:00, exchange=ARCA, quantity=11, direction=SELL, fill_cost=81.19451934774987, commission=0.06138, market_value=81.25589934774987, slippage=-0.14410065225011603, position={'long': ['WMT20240621C160'], 'short': ['WMT20240621C175'], 'trade_id': '&L:WMT20240621C160&S:WMT20240621C175', 'close': 7.3999999999999995}, signal_id=WMT20230810LONG\n", - "81.19451934774987\n", - "{'long': ['WMT20240621C160'], 'short': ['WMT20240621C175'], 'trade_id': '&L:WMT20240621C160&S:WMT20240621C175', 'close': 7.3999999999999995}\n", - "Current Cash at Sell: 1598.9126122568323\n", - "Cash at Sell if we add FillCost: 9718.364547031819\n", - "Event queue is empty, processed 7 event(s)\n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Event queue is empty, processed 2 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Event queue is empty, processed 2 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Sell Order Position: {'long': ['AMZN20240621C120'], 'short': ['AMZN20240621C170'], 'trade_id': '&L:AMZN20240621C120&S:AMZN20240621C170', 'close': 18.625} Price: 18.603487588377437 Quantity: 4 Datetime: 2023-10-25 00:00:00\n", - "Processing event: FILL\n", - "2023-10-25 00:00:00\n", - "AMZN SELL\n", - "FillEvent symbol=AMZN, date:2023-10-25 00:00:00, exchange=ARCA, quantity=4, direction=SELL, fill_cost=74.39163035350975, commission=0.02232, market_value=74.41395035350975, slippage=-0.08604964649025248, position={'long': ['AMZN20240621C120'], 'short': ['AMZN20240621C170'], 'trade_id': '&L:AMZN20240621C120&S:AMZN20240621C170', 'close': 18.625}, signal_id=AMZN20230705LONG\n", - "74.39163035350975\n", - "{'long': ['AMZN20240621C120'], 'short': ['AMZN20240621C170'], 'trade_id': '&L:AMZN20240621C120&S:AMZN20240621C170', 'close': 18.625}\n", - "Current Cash at Sell: 2008.9841615273554\n", - "Cash at Sell if we add FillCost: 9448.14719687833\n", - "Event queue is empty, processed 4 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Rolling contract for NVDA at 2024-05-22 00:00:00 is a holiday, skipping\n", - "Rolling contract for JNJ at 2024-05-22 00:00:00 is a holiday, skipping\n", - "Processing event: ROLL\n", - "\n", - "Performing Roll Operation\n", - "\n", - "Using roll function\n", - "Rolling contract for NVDA at 2024-05-22 00:00:00\n", - "\n", - "Sell Order Position: {'long': ['NVDA20240621C410'], 'short': ['NVDA20240621C550'], 'trade_id': '&L:NVDA20240621C410&S:NVDA20240621C550', 'close': 139.2499999999999} Price: 139.14932876765704 Quantity: 1 Datetime: 2024-05-22 00:00:00\n", - "2024-05-22 00:00:00\n", - "NVDA SELL\n", - "FillEvent symbol=NVDA, date:2024-05-22 00:00:00, exchange=ARCA, quantity=1, direction=SELL, fill_cost=139.14374876765703, commission=0.00558, market_value=139.14932876765704, slippage=-0.10067123234284736, position={'long': ['NVDA20240621C410'], 'short': ['NVDA20240621C550'], 'trade_id': '&L:NVDA20240621C410&S:NVDA20240621C550', 'close': 139.2499999999999}, signal_id=NVDA20230705LONG\n", - "139.14374876765703\n", - "{'long': ['NVDA20240621C410'], 'short': ['NVDA20240621C550'], 'trade_id': '&L:NVDA20240621C410&S:NVDA20240621C550', 'close': 139.2499999999999}\n", - "Current Cash at Sell: 5133.1191230059685\n", - "Cash at Sell if we add FillCost: 19047.493999771672\n", - "Rolling contract for NVDA at 2024-05-22 00:00:00\n", - "\n", - "Buy Details\n", - "Position: {'long': ['NVDA20250620C1050'], 'short': ['NVDA20250620C1200'], 'trade_id': '&L:NVDA20250620C1050&S:NVDA20250620C1200', 'close': 48.0}, Date: 2024-05-22, Signal: SignalEvent type:LONG, symbol=NVDA, date:2024-05-22 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:NVDA20230705LONG\n", - "Max Contract Price: 50.0, Cash at Hand: 171.42744599794506\n", - "Order Quantity 3 Cash at Hand 171.42744599794506 Close 48.0\n", - "Buy Order Position: {'long': ['NVDA20250620C1050'], 'short': ['NVDA20250620C1200'], 'trade_id': '&L:NVDA20250620C1050&S:NVDA20250620C1200', 'close': 48.0} Price: 48.05830282100561 Quantity: 3 Datetime: 2024-05-22 00:00:00\n" - ] - }, - { - "ename": "KeyboardInterrupt", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", - "Cell \u001b[1;32mIn[11], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m \u001b[43mevb_backtest\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mclean_run\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtrades\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mnew_trades\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[1;32m~\\python-playground\\QuantTools\\EventDriven\\backtest.py:111\u001b[0m, in \u001b[0;36mOptionSignalBacktest.clean_run\u001b[1;34m(self, trades, initial_capital)\u001b[0m\n\u001b[0;32m 109\u001b[0m clean_capital \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39minitial_capital \u001b[38;5;28;01mif\u001b[39;00m initial_capital \u001b[38;5;241m==\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;28;01melse\u001b[39;00m initial_capital\n\u001b[0;32m 110\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__construct_data(clean_trades, clean_capital)\n\u001b[1;32m--> 111\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[1;32m~\\python-playground\\QuantTools\\EventDriven\\backtest.py:96\u001b[0m, in \u001b[0;36mOptionSignalBacktest.run\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 94\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m event\u001b[38;5;241m.\u001b[39mtype \u001b[38;5;241m==\u001b[39m EventTypes\u001b[38;5;241m.\u001b[39mROLL\u001b[38;5;241m.\u001b[39mvalue:\n\u001b[0;32m 95\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124mPerforming Roll Operation\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m---> 96\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__roll\u001b[49m\u001b[43m(\u001b[49m\u001b[43mevent\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcurrent_event_queue\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 97\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 98\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mlogger\u001b[38;5;241m.\u001b[39mwarning(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mUnrecognized event type: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mevent\u001b[38;5;241m.\u001b[39mtype\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n", - "File \u001b[1;32m~\\python-playground\\QuantTools\\EventDriven\\backtest.py:140\u001b[0m, in \u001b[0;36mOptionSignalBacktest.__roll\u001b[1;34m(self, roll_event, current_event_queue)\u001b[0m\n\u001b[0;32m 138\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mexecutor\u001b[38;5;241m.\u001b[39mexecute_order_randomized_slippage(event)\n\u001b[0;32m 139\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m event\u001b[38;5;241m.\u001b[39mtype \u001b[38;5;241m==\u001b[39m EventTypes\u001b[38;5;241m.\u001b[39mFILL\u001b[38;5;241m.\u001b[39mvalue:\n\u001b[1;32m--> 140\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mportfolio\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mupdate_fill\u001b[49m\u001b[43m(\u001b[49m\u001b[43mevent\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 141\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mRoll processed \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mevent_count\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m event(s)\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 142\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mlogger\u001b[38;5;241m.\u001b[39minfo(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mRoll Function processed \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mevent_count\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m roll event(s)\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", - "File \u001b[1;32m~\\python-playground\\QuantTools\\EventDriven\\portfolio.py:773\u001b[0m, in \u001b[0;36mOptionSignalPortfolio.update_fill\u001b[1;34m(self, event)\u001b[0m\n\u001b[0;32m 768\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 769\u001b[0m \u001b[38;5;124;03mUpdates the portfolio current positions and holdings \u001b[39;00m\n\u001b[0;32m 770\u001b[0m \u001b[38;5;124;03mfrom a FillEvent.\u001b[39;00m\n\u001b[0;32m 771\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 772\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m event\u001b[38;5;241m.\u001b[39mtype \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mFILL\u001b[39m\u001b[38;5;124m'\u001b[39m: \n\u001b[1;32m--> 773\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mupdate_positions_on_fill\u001b[49m\u001b[43m(\u001b[49m\u001b[43mevent\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 774\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mupdate_holdings_on_fill(event)\n", - "File \u001b[1;32m~\\python-playground\\QuantTools\\EventDriven\\portfolio.py:647\u001b[0m, in \u001b[0;36mOptionSignalPortfolio.update_positions_on_fill\u001b[1;34m(self, fill_event)\u001b[0m\n\u001b[0;32m 645\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m option_id \u001b[38;5;129;01min\u001b[39;00m fill_event\u001b[38;5;241m.\u001b[39mposition[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlong\u001b[39m\u001b[38;5;124m'\u001b[39m]: \n\u001b[0;32m 646\u001b[0m option_meta \u001b[38;5;241m=\u001b[39m parse_option_tick(option_id)\n\u001b[1;32m--> 647\u001b[0m option_data \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_options_data_on_contract\u001b[49m\u001b[43m(\u001b[49m\u001b[43msymbol\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43moption_meta\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mticker\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mright\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moption_meta\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mput_call\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexp\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moption_meta\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mexp_date\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstrike\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moption_meta\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mstrike\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 648\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m option_data \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m: \n\u001b[0;32m 649\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moptions_data[option_id] \u001b[38;5;241m=\u001b[39m option_data[\u001b[38;5;241m~\u001b[39moption_data\u001b[38;5;241m.\u001b[39mindex\u001b[38;5;241m.\u001b[39mduplicated(keep\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlast\u001b[39m\u001b[38;5;124m'\u001b[39m)]\n", - "File \u001b[1;32m~\\python-playground\\QuantTools\\EventDriven\\portfolio.py:879\u001b[0m, in \u001b[0;36mOptionSignalPortfolio.get_options_data_on_contract\u001b[1;34m(self, symbol, exp, strike, right)\u001b[0m\n\u001b[0;32m 877\u001b[0m end_date \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mbars\u001b[38;5;241m.\u001b[39mend_date\u001b[38;5;241m.\u001b[39mstrftime(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m%\u001b[39m\u001b[38;5;124mY\u001b[39m\u001b[38;5;124m%\u001b[39m\u001b[38;5;124mm\u001b[39m\u001b[38;5;132;01m%d\u001b[39;00m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m 878\u001b[0m exp \u001b[38;5;241m=\u001b[39m pd\u001b[38;5;241m.\u001b[39mto_datetime(exp)\u001b[38;5;241m.\u001b[39mstrftime(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m%\u001b[39m\u001b[38;5;124mY\u001b[39m\u001b[38;5;124m%\u001b[39m\u001b[38;5;124mm\u001b[39m\u001b[38;5;132;01m%d\u001b[39;00m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m--> 879\u001b[0m options \u001b[38;5;241m=\u001b[39m \u001b[43mretrieve_eod_ohlc\u001b[49m\u001b[43m(\u001b[49m\u001b[43msymbol\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43msymbol\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexp\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mexp\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstrike\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;28;43mfloat\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mstrike\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mright\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mright\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstart_date\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstart_date\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mend_date\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mend_date\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 880\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(options, pd\u001b[38;5;241m.\u001b[39mDataFrame) \u001b[38;5;129;01mand\u001b[39;00m is_theta_data_retrieval_successful(options):\n\u001b[0;32m 881\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m options \u001b[38;5;66;03m# a dataframe with columns: ms_of_day,open,high,low,close,volume,count,date\u001b[39;00m\n", - "File \u001b[1;32m~\\python-playground\\FinanceDatabase\\FinanceDatabase\\dbase\\DataAPI\\ThetaData.py:224\u001b[0m, in \u001b[0;36mretrieve_eod_ohlc\u001b[1;34m(symbol, end_date, exp, right, start_date, strike, print_url, rt, proxy)\u001b[0m\n\u001b[0;32m 220\u001b[0m start_timer \u001b[38;5;241m=\u001b[39m time\u001b[38;5;241m.\u001b[39mtime()\n\u001b[0;32m 223\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m proxy:\n\u001b[1;32m--> 224\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[43mrequest_from_proxy\u001b[49m\u001b[43m(\u001b[49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mquerystring\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mproxy\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 225\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 226\u001b[0m response \u001b[38;5;241m=\u001b[39m requests\u001b[38;5;241m.\u001b[39mget(url, headers\u001b[38;5;241m=\u001b[39mheaders, params\u001b[38;5;241m=\u001b[39mquerystring)\n", - "File \u001b[1;32m~\\python-playground\\FinanceDatabase\\FinanceDatabase\\dbase\\DataAPI\\ThetaData.py:43\u001b[0m, in \u001b[0;36mrequest_from_proxy\u001b[1;34m(thetaUrl, queryparam, instanceUrl)\u001b[0m\n\u001b[0;32m 36\u001b[0m payload \u001b[38;5;241m=\u001b[39m json\u001b[38;5;241m.\u001b[39mdumps({\n\u001b[0;32m 37\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124murl\u001b[39m\u001b[38;5;124m\"\u001b[39m: request_string,\n\u001b[0;32m 38\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmethod\u001b[39m\u001b[38;5;124m\"\u001b[39m: \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mGET\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[0;32m 39\u001b[0m })\n\u001b[0;32m 40\u001b[0m headers \u001b[38;5;241m=\u001b[39m {\n\u001b[0;32m 41\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mContent-Type\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mapplication/json\u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[0;32m 42\u001b[0m }\n\u001b[1;32m---> 43\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[43mrequests\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrequest\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mPOST\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minstanceUrl\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mheaders\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mheaders\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdata\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mpayload\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 44\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m response\n", - "File \u001b[1;32mc:\\Users\\Zino\\python-playground\\QuantTools\\.venv\\lib\\site-packages\\requests\\api.py:59\u001b[0m, in \u001b[0;36mrequest\u001b[1;34m(method, url, **kwargs)\u001b[0m\n\u001b[0;32m 55\u001b[0m \u001b[38;5;66;03m# By using the 'with' statement we are sure the session is closed, thus we\u001b[39;00m\n\u001b[0;32m 56\u001b[0m \u001b[38;5;66;03m# avoid leaving sockets open which can trigger a ResourceWarning in some\u001b[39;00m\n\u001b[0;32m 57\u001b[0m \u001b[38;5;66;03m# cases, and look like a memory leak in others.\u001b[39;00m\n\u001b[0;32m 58\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m sessions\u001b[38;5;241m.\u001b[39mSession() \u001b[38;5;28;01mas\u001b[39;00m session:\n\u001b[1;32m---> 59\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m session\u001b[38;5;241m.\u001b[39mrequest(method\u001b[38;5;241m=\u001b[39mmethod, url\u001b[38;5;241m=\u001b[39murl, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n", - "File \u001b[1;32mc:\\Users\\Zino\\python-playground\\QuantTools\\.venv\\lib\\site-packages\\requests\\sessions.py:589\u001b[0m, in \u001b[0;36mSession.request\u001b[1;34m(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)\u001b[0m\n\u001b[0;32m 584\u001b[0m send_kwargs \u001b[38;5;241m=\u001b[39m {\n\u001b[0;32m 585\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtimeout\u001b[39m\u001b[38;5;124m\"\u001b[39m: timeout,\n\u001b[0;32m 586\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mallow_redirects\u001b[39m\u001b[38;5;124m\"\u001b[39m: allow_redirects,\n\u001b[0;32m 587\u001b[0m }\n\u001b[0;32m 588\u001b[0m send_kwargs\u001b[38;5;241m.\u001b[39mupdate(settings)\n\u001b[1;32m--> 589\u001b[0m resp \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msend(prep, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39msend_kwargs)\n\u001b[0;32m 591\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m resp\n", - "File \u001b[1;32mc:\\Users\\Zino\\python-playground\\QuantTools\\.venv\\lib\\site-packages\\requests\\sessions.py:703\u001b[0m, in \u001b[0;36mSession.send\u001b[1;34m(self, request, **kwargs)\u001b[0m\n\u001b[0;32m 700\u001b[0m start \u001b[38;5;241m=\u001b[39m preferred_clock()\n\u001b[0;32m 702\u001b[0m \u001b[38;5;66;03m# Send the request\u001b[39;00m\n\u001b[1;32m--> 703\u001b[0m r \u001b[38;5;241m=\u001b[39m adapter\u001b[38;5;241m.\u001b[39msend(request, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[0;32m 705\u001b[0m \u001b[38;5;66;03m# Total elapsed time of the request (approximately)\u001b[39;00m\n\u001b[0;32m 706\u001b[0m elapsed \u001b[38;5;241m=\u001b[39m preferred_clock() \u001b[38;5;241m-\u001b[39m start\n", - "File \u001b[1;32mc:\\Users\\Zino\\python-playground\\QuantTools\\.venv\\lib\\site-packages\\requests\\adapters.py:667\u001b[0m, in \u001b[0;36mHTTPAdapter.send\u001b[1;34m(self, request, stream, timeout, verify, cert, proxies)\u001b[0m\n\u001b[0;32m 664\u001b[0m timeout \u001b[38;5;241m=\u001b[39m TimeoutSauce(connect\u001b[38;5;241m=\u001b[39mtimeout, read\u001b[38;5;241m=\u001b[39mtimeout)\n\u001b[0;32m 666\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m--> 667\u001b[0m resp \u001b[38;5;241m=\u001b[39m \u001b[43mconn\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43murlopen\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 668\u001b[0m \u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrequest\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 669\u001b[0m \u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 670\u001b[0m \u001b[43m \u001b[49m\u001b[43mbody\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrequest\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbody\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 671\u001b[0m \u001b[43m \u001b[49m\u001b[43mheaders\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrequest\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mheaders\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 672\u001b[0m \u001b[43m \u001b[49m\u001b[43mredirect\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[0;32m 673\u001b[0m \u001b[43m \u001b[49m\u001b[43massert_same_host\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[0;32m 674\u001b[0m \u001b[43m \u001b[49m\u001b[43mpreload_content\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[0;32m 675\u001b[0m \u001b[43m \u001b[49m\u001b[43mdecode_content\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[0;32m 676\u001b[0m \u001b[43m \u001b[49m\u001b[43mretries\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmax_retries\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 677\u001b[0m \u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtimeout\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 678\u001b[0m \u001b[43m \u001b[49m\u001b[43mchunked\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mchunked\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 679\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 681\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m (ProtocolError, \u001b[38;5;167;01mOSError\u001b[39;00m) \u001b[38;5;28;01mas\u001b[39;00m err:\n\u001b[0;32m 682\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mConnectionError\u001b[39;00m(err, request\u001b[38;5;241m=\u001b[39mrequest)\n", - "File \u001b[1;32mc:\\Users\\Zino\\python-playground\\QuantTools\\.venv\\lib\\site-packages\\urllib3\\connectionpool.py:789\u001b[0m, in \u001b[0;36mHTTPConnectionPool.urlopen\u001b[1;34m(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, preload_content, decode_content, **response_kw)\u001b[0m\n\u001b[0;32m 786\u001b[0m response_conn \u001b[38;5;241m=\u001b[39m conn \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m release_conn \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m 788\u001b[0m \u001b[38;5;66;03m# Make the request on the HTTPConnection object\u001b[39;00m\n\u001b[1;32m--> 789\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_make_request(\n\u001b[0;32m 790\u001b[0m conn,\n\u001b[0;32m 791\u001b[0m method,\n\u001b[0;32m 792\u001b[0m url,\n\u001b[0;32m 793\u001b[0m timeout\u001b[38;5;241m=\u001b[39mtimeout_obj,\n\u001b[0;32m 794\u001b[0m body\u001b[38;5;241m=\u001b[39mbody,\n\u001b[0;32m 795\u001b[0m headers\u001b[38;5;241m=\u001b[39mheaders,\n\u001b[0;32m 796\u001b[0m chunked\u001b[38;5;241m=\u001b[39mchunked,\n\u001b[0;32m 797\u001b[0m retries\u001b[38;5;241m=\u001b[39mretries,\n\u001b[0;32m 798\u001b[0m response_conn\u001b[38;5;241m=\u001b[39mresponse_conn,\n\u001b[0;32m 799\u001b[0m preload_content\u001b[38;5;241m=\u001b[39mpreload_content,\n\u001b[0;32m 800\u001b[0m decode_content\u001b[38;5;241m=\u001b[39mdecode_content,\n\u001b[0;32m 801\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mresponse_kw,\n\u001b[0;32m 802\u001b[0m )\n\u001b[0;32m 804\u001b[0m \u001b[38;5;66;03m# Everything went great!\u001b[39;00m\n\u001b[0;32m 805\u001b[0m clean_exit \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m\n", - "File \u001b[1;32mc:\\Users\\Zino\\python-playground\\QuantTools\\.venv\\lib\\site-packages\\urllib3\\connectionpool.py:536\u001b[0m, in \u001b[0;36mHTTPConnectionPool._make_request\u001b[1;34m(self, conn, method, url, body, headers, retries, timeout, chunked, response_conn, preload_content, decode_content, enforce_content_length)\u001b[0m\n\u001b[0;32m 534\u001b[0m \u001b[38;5;66;03m# Receive the response from the server\u001b[39;00m\n\u001b[0;32m 535\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m--> 536\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[43mconn\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgetresponse\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 537\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m (BaseSSLError, \u001b[38;5;167;01mOSError\u001b[39;00m) \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[0;32m 538\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_raise_timeout(err\u001b[38;5;241m=\u001b[39me, url\u001b[38;5;241m=\u001b[39murl, timeout_value\u001b[38;5;241m=\u001b[39mread_timeout)\n", - "File \u001b[1;32mc:\\Users\\Zino\\python-playground\\QuantTools\\.venv\\lib\\site-packages\\urllib3\\connection.py:507\u001b[0m, in \u001b[0;36mHTTPConnection.getresponse\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 504\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mresponse\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m HTTPResponse\n\u001b[0;32m 506\u001b[0m \u001b[38;5;66;03m# Get the response from http.client.HTTPConnection\u001b[39;00m\n\u001b[1;32m--> 507\u001b[0m httplib_response \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgetresponse\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 509\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m 510\u001b[0m assert_header_parsing(httplib_response\u001b[38;5;241m.\u001b[39mmsg)\n", - "File \u001b[1;32mC:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\\lib\\http\\client.py:1375\u001b[0m, in \u001b[0;36mHTTPConnection.getresponse\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 1373\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m 1374\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m-> 1375\u001b[0m \u001b[43mresponse\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbegin\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1376\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mConnectionError\u001b[39;00m:\n\u001b[0;32m 1377\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mclose()\n", - "File \u001b[1;32mC:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\\lib\\http\\client.py:318\u001b[0m, in \u001b[0;36mHTTPResponse.begin\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 316\u001b[0m \u001b[38;5;66;03m# read until we get a non-100 response\u001b[39;00m\n\u001b[0;32m 317\u001b[0m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[1;32m--> 318\u001b[0m version, status, reason \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_read_status\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 319\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m status \u001b[38;5;241m!=\u001b[39m CONTINUE:\n\u001b[0;32m 320\u001b[0m \u001b[38;5;28;01mbreak\u001b[39;00m\n", - "File \u001b[1;32mC:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\\lib\\http\\client.py:279\u001b[0m, in \u001b[0;36mHTTPResponse._read_status\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 278\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_read_status\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[1;32m--> 279\u001b[0m line \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mstr\u001b[39m(\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mreadline\u001b[49m\u001b[43m(\u001b[49m\u001b[43m_MAXLINE\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m+\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m)\u001b[49m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miso-8859-1\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 280\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(line) \u001b[38;5;241m>\u001b[39m _MAXLINE:\n\u001b[0;32m 281\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m LineTooLong(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mstatus line\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", - "File \u001b[1;32mC:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\\lib\\socket.py:705\u001b[0m, in \u001b[0;36mSocketIO.readinto\u001b[1;34m(self, b)\u001b[0m\n\u001b[0;32m 703\u001b[0m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[0;32m 704\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m--> 705\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_sock\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrecv_into\u001b[49m\u001b[43m(\u001b[49m\u001b[43mb\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 706\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m timeout:\n\u001b[0;32m 707\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_timeout_occurred \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m\n", - "\u001b[1;31mKeyboardInterrupt\u001b[0m: " - ] - } - ], - "source": [ - "evb_backtest.clean_run(trades=new_trades)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'&L:TSLA20240621C260&S:TSLA20240621C370': {'entry_price': 3926.3755205046727,\n", - " 'entry_date': Timestamp('2023-07-05 00:00:00'),\n", - " 'quantity': 2,\n", - " 'symbol': 'TSLA',\n", - " 'entry_commission': 1.1159999999999999,\n", - " 'entry_market_value': 7851.6350410093455,\n", - " 'entry_slippage': 6.6350410093434675,\n", - " 'total_entry_cost': 78.52751041009346,\n", - " 'auxilary_entry_cost': 7.751041009343467,\n", - " 'signal_id': 'TSLA20230705LONG',\n", - " 'trade_id': '&L:TSLA20240621C260&S:TSLA20240621C370',\n", - " 'exit_price': 3914.302534382505,\n", - " 'exit_date': Timestamp('2023-08-02 00:00:00'),\n", - " 'exit_commission': 1.1159999999999999,\n", - " 'exit_slippage': -15.278931234990978,\n", - " 'exit_market_value': 7829.72106876501,\n", - " 'total_exit_cost': 78.2860506876501,\n", - " 'auxilary_exit_cost': 16.394931234990977,\n", - " 'pnl': -24.1459722443351,\n", - " 'return_pct': -0.0061496848985120815,\n", - " 'duration_days': 28,\n", - " 'exit_method': 'sell'},\n", - " '&L:AAPL20240621C175&S:AAPL20240621C255': {'entry_price': 3058.041873283369,\n", - " 'entry_date': Timestamp('2023-07-05 00:00:00'),\n", - " 'quantity': 2,\n", - " 'symbol': 'AAPL',\n", - " 'entry_commission': 1.1159999999999999,\n", - " 'entry_market_value': 6114.967746566739,\n", - " 'entry_slippage': 4.96774656673864,\n", - " 'total_entry_cost': 61.160837465667385,\n", - " 'auxilary_entry_cost': 6.08374656673864,\n", - " 'signal_id': 'AAPL20230705LONG',\n", - " 'trade_id': '&L:AAPL20240621C175&S:AAPL20240621C255',\n", - " 'exit_price': 3048.390654688523,\n", - " 'exit_date': Timestamp('2023-08-04 00:00:00'),\n", - " 'exit_commission': 1.1159999999999999,\n", - " 'exit_slippage': -12.102690622954526,\n", - " 'exit_market_value': 6097.8973093770455,\n", - " 'total_exit_cost': 60.96781309377046,\n", - " 'auxilary_exit_cost': 13.218690622954526,\n", - " 'pnl': -19.302437189692682,\n", - " 'return_pct': -0.006312025142078246,\n", - " 'duration_days': 30,\n", - " 'exit_method': 'sell'},\n", - " '&L:MSFT20240621C315&S:MSFT20240621C450': {'entry_price': 4966.17926292839,\n", - " 'entry_date': Timestamp('2023-07-05 00:00:00'),\n", - " 'quantity': 1,\n", - " 'symbol': 'MSFT',\n", - " 'entry_commission': 0.5579999999999999,\n", - " 'entry_market_value': 4965.62126292839,\n", - " 'entry_slippage': 5.621262928389115,\n", - " 'total_entry_cost': 49.6617926292839,\n", - " 'auxilary_entry_cost': 6.1792629283891145,\n", - " 'signal_id': 'MSFT20230705LONG',\n", - " 'trade_id': '&L:MSFT20240621C315&S:MSFT20240621C450',\n", - " 'exit_price': 4956.910670294933,\n", - " 'exit_date': Timestamp('2023-08-09 00:00:00'),\n", - " 'exit_commission': 0.5579999999999999,\n", - " 'exit_slippage': -2.531329705067975,\n", - " 'exit_market_value': 4957.468670294933,\n", - " 'total_exit_cost': 49.56910670294933,\n", - " 'auxilary_exit_cost': 3.089329705067975,\n", - " 'pnl': -9.268592633457047,\n", - " 'return_pct': -0.001866342744138412,\n", - " 'duration_days': 35,\n", - " 'exit_method': 'sell'},\n", - " '&L:AMZN20240621C120&S:AMZN20240621C170': {'entry_price': 1997.9203770196912,\n", - " 'entry_date': Timestamp('2023-07-05 00:00:00'),\n", - " 'quantity': 4,\n", - " 'symbol': 'AMZN',\n", - " 'entry_commission': 2.2319999999999998,\n", - " 'entry_market_value': 7989.449508078765,\n", - " 'entry_slippage': 9.449508078763813,\n", - " 'total_entry_cost': 79.91681508078764,\n", - " 'auxilary_entry_cost': 11.681508078763812,\n", - " 'signal_id': 'AMZN20230705LONG',\n", - " 'trade_id': '&L:AMZN20240621C120&S:AMZN20240621C170',\n", - " 'exit_price': 1991.4858729930036,\n", - " 'exit_date': Timestamp('2023-10-25 00:00:00'),\n", - " 'exit_commission': 2.2319999999999998,\n", - " 'exit_slippage': -11.82450802798769,\n", - " 'exit_market_value': 7968.175491972013,\n", - " 'total_exit_cost': 79.65943491972014,\n", - " 'auxilary_exit_cost': 14.05650802798769,\n", - " 'pnl': -25.738016106750365,\n", - " 'return_pct': -0.012882403324372668,\n", - " 'duration_days': 112,\n", - " 'exit_method': 'sell'},\n", - " '&L:NVDA20240621C410&S:NVDA20240621C550': {'entry_price': 4865.0533034869895,\n", - " 'entry_date': Timestamp('2023-07-05 00:00:00'),\n", - " 'quantity': 1,\n", - " 'symbol': 'NVDA',\n", - " 'entry_commission': 0.5579999999999999,\n", - " 'entry_market_value': 4864.4953034869895,\n", - " 'entry_slippage': 4.495303486989144,\n", - " 'total_entry_cost': 48.650533034869895,\n", - " 'auxilary_entry_cost': 5.053303486989144,\n", - " 'signal_id': 'NVDA20230705LONG',\n", - " 'trade_id': '&L:NVDA20240621C410&S:NVDA20240621C550',\n", - " 'exit_price': 4856.391132765095,\n", - " 'exit_date': Timestamp('2024-05-22 00:00:00'),\n", - " 'exit_commission': 0.5579999999999999,\n", - " 'exit_slippage': -3.0508672349050414,\n", - " 'exit_market_value': 4856.949132765095,\n", - " 'total_exit_cost': 48.56391132765095,\n", - " 'auxilary_exit_cost': 3.6088672349050412,\n", - " 'pnl': -8.662170721894654,\n", - " 'return_pct': -0.0017804883485420622,\n", - " 'duration_days': 322,\n", - " 'exit_method': 'sell'},\n", - " '&L:BA20240621C220&S:BA20240621C310': {'entry_price': 3554.403964310383,\n", - " 'entry_date': Timestamp('2023-08-10 00:00:00'),\n", - " 'quantity': 2,\n", - " 'symbol': 'BA',\n", - " 'entry_commission': 1.1159999999999999,\n", - " 'entry_market_value': 7107.691928620766,\n", - " 'entry_slippage': 12.691928620766646,\n", - " 'total_entry_cost': 71.08807928620766,\n", - " 'auxilary_entry_cost': 13.807928620766646,\n", - " 'signal_id': 'BA20230810LONG',\n", - " 'trade_id': '&L:BA20240621C220&S:BA20240621C310',\n", - " 'exit_price': 3543.876997456325,\n", - " 'exit_date': Timestamp('2023-08-17 00:00:00'),\n", - " 'exit_commission': 1.1159999999999999,\n", - " 'exit_slippage': -6.130005087348422,\n", - " 'exit_market_value': 7088.86999491265,\n", - " 'total_exit_cost': 70.8775399491265,\n", - " 'auxilary_exit_cost': 7.246005087348422,\n", - " 'pnl': -21.053933708115437,\n", - " 'return_pct': -0.005923337335743792,\n", - " 'duration_days': 7,\n", - " 'exit_method': 'sell'},\n", - " '&L:WMT20240621C160&S:WMT20240621C175': {'entry_price': 763.6755226809679,\n", - " 'entry_date': Timestamp('2023-08-10 00:00:00'),\n", - " 'quantity': 11,\n", - " 'symbol': 'WMT',\n", - " 'entry_commission': 6.138,\n", - " 'entry_market_value': 8394.292749490647,\n", - " 'entry_slippage': 6.792749490647232,\n", - " 'total_entry_cost': 84.00430749490647,\n", - " 'auxilary_entry_cost': 12.930749490647232,\n", - " 'signal_id': 'WMT20230810LONG',\n", - " 'trade_id': '&L:WMT20240621C160&S:WMT20240621C175',\n", - " 'exit_price': 761.1749732436729,\n", - " 'exit_date': Timestamp('2023-08-17 00:00:00'),\n", - " 'exit_commission': 6.138,\n", - " 'exit_slippage': -8.437294319598276,\n", - " 'exit_market_value': 8379.0627056804,\n", - " 'total_exit_cost': 83.72924705680401,\n", - " 'auxilary_exit_cost': 14.575294319598276,\n", - " 'pnl': -27.506043810245387,\n", - " 'return_pct': -0.03601797228446233,\n", - " 'duration_days': 7,\n", - " 'exit_method': 'sell'}}" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.portfolio.trades_dict" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Timestamp('2023-07-05 00:00:00')" - ] - }, - "execution_count": 51, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "tsla = evb_backtest.portfolio.trades.loc['&L:TSLA20240621C260&S:TSLA20240621C370']\n", - "tsla['entry_date']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 70, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "(pd.to_datetime('2024-06-21') - pd.to_datetime('2024-06-21')).days" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Open 73.530000\n", - "High 74.000000\n", - "Low 71.200000\n", - "Close 74.000000\n", - "Volume 78.000000\n", - "Bid_size 183.000000\n", - "CloseBid 72.650000\n", - "Ask_size 396.000000\n", - "CloseAsk 73.950000\n", - "Midpoint 73.300000\n", - "Weighted_midpoint 73.539119\n", - "Name: 2023-07-05 00:00:00, dtype: float64" - ] - }, - "execution_count": 57, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "tsla_option = evb_backtest.portfolio.get_option_data('TSLA20240621C260')\n", - "tsla_option = tsla_option[~tsla_option.index.duplicated(keep='last')]\n", - "tsla_option = tsla_option.loc[tsla['entry_date']]\n", - "tsla_option" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
longshorttrade_idclosequantitymarket_value
datetimesymbol
2023-07-05TSLA[TSLA20240621C260][TSLA20240621C370]&L:TSLA20240621C260&S:TSLA20240621C37032.75027845.0
AAPL[AAPL20240621C175][AAPL20240621C255]&L:AAPL20240621C175&S:AAPL20240621C25529.97526110.0
MSFT[MSFT20240621C315][MSFT20240621C450]&L:MSFT20240621C315&S:MSFT20240621C45040.17514960.0
AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62547980.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67514860.0
2023-07-06TSLA[TSLA20240621C260][TSLA20240621C370]&L:TSLA20240621C260&S:TSLA20240621C37032.75027515.0
AAPL[AAPL20240621C175][AAPL20240621C255]&L:AAPL20240621C175&S:AAPL20240621C25529.97526233.0
MSFT[MSFT20240621C315][MSFT20240621C450]&L:MSFT20240621C315&S:MSFT20240621C45040.17515167.5
AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62547650.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67514835.0
2023-07-07TSLA[TSLA20240621C260][TSLA20240621C370]&L:TSLA20240621C260&S:TSLA20240621C37032.75027380.0
AAPL[AAPL20240621C175][AAPL20240621C255]&L:AAPL20240621C175&S:AAPL20240621C25529.97526055.0
MSFT[MSFT20240621C315][MSFT20240621C450]&L:MSFT20240621C315&S:MSFT20240621C45040.17514852.5
AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62547900.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67514882.5
2023-07-10TSLA[TSLA20240621C260][TSLA20240621C370]&L:TSLA20240621C260&S:TSLA20240621C37032.75027085.0
AAPL[AAPL20240621C175][AAPL20240621C255]&L:AAPL20240621C175&S:AAPL20240621C25529.97525769.0
MSFT[MSFT20240621C315][MSFT20240621C450]&L:MSFT20240621C315&S:MSFT20240621C45040.17514560.0
AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62547400.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67514872.5
2023-07-11TSLA[TSLA20240621C260][TSLA20240621C370]&L:TSLA20240621C260&S:TSLA20240621C37032.75027120.0
AAPL[AAPL20240621C175][AAPL20240621C255]&L:AAPL20240621C175&S:AAPL20240621C25529.97525707.0
MSFT[MSFT20240621C315][MSFT20240621C450]&L:MSFT20240621C315&S:MSFT20240621C45040.17514560.0
AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62547720.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67514892.5
2023-07-12TSLA[TSLA20240621C260][TSLA20240621C370]&L:TSLA20240621C260&S:TSLA20240621C37032.75027300.0
AAPL[AAPL20240621C175][AAPL20240621C255]&L:AAPL20240621C175&S:AAPL20240621C25529.97525904.0
MSFT[MSFT20240621C315][MSFT20240621C450]&L:MSFT20240621C315&S:MSFT20240621C45040.17514827.5
AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62548090.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515160.0
2023-07-13TSLA[TSLA20240621C260][TSLA20240621C370]&L:TSLA20240621C260&S:TSLA20240621C37032.75027595.0
AAPL[AAPL20240621C175][AAPL20240621C255]&L:AAPL20240621C175&S:AAPL20240621C25529.97525976.0
MSFT[MSFT20240621C315][MSFT20240621C450]&L:MSFT20240621C315&S:MSFT20240621C45040.17515090.0
AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62548640.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515847.5
2023-07-14TSLA[TSLA20240621C260][TSLA20240621C370]&L:TSLA20240621C260&S:TSLA20240621C37032.75027790.0
AAPL[AAPL20240621C175][AAPL20240621C255]&L:AAPL20240621C175&S:AAPL20240621C25529.97526002.0
MSFT[MSFT20240621C315][MSFT20240621C450]&L:MSFT20240621C315&S:MSFT20240621C45040.17515172.5
AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62548730.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515582.5
2023-07-17TSLA[TSLA20240621C260][TSLA20240621C370]&L:TSLA20240621C260&S:TSLA20240621C37032.75028280.0
AAPL[AAPL20240621C175][AAPL20240621C255]&L:AAPL20240621C175&S:AAPL20240621C25529.97526436.0
MSFT[MSFT20240621C315][MSFT20240621C450]&L:MSFT20240621C315&S:MSFT20240621C45040.17515172.5
AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62548530.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515930.0
2023-07-18TSLA[TSLA20240621C260][TSLA20240621C370]&L:TSLA20240621C260&S:TSLA20240621C37032.75028405.0
AAPL[AAPL20240621C175][AAPL20240621C255]&L:AAPL20240621C175&S:AAPL20240621C25529.97526407.0
MSFT[MSFT20240621C315][MSFT20240621C450]&L:MSFT20240621C315&S:MSFT20240621C45040.17515870.0
AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62548360.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67516082.5
2023-07-19TSLA[TSLA20240621C260][TSLA20240621C370]&L:TSLA20240621C260&S:TSLA20240621C37032.75028325.0
AAPL[AAPL20240621C175][AAPL20240621C255]&L:AAPL20240621C175&S:AAPL20240621C25529.97526443.0
MSFT[MSFT20240621C315][MSFT20240621C450]&L:MSFT20240621C315&S:MSFT20240621C45040.17515687.5
AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62548870.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67516155.0
2023-07-20TSLA[TSLA20240621C260][TSLA20240621C370]&L:TSLA20240621C260&S:TSLA20240621C37032.75026600.0
AAPL[AAPL20240621C175][AAPL20240621C255]&L:AAPL20240621C175&S:AAPL20240621C25529.97526287.0
MSFT[MSFT20240621C315][MSFT20240621C450]&L:MSFT20240621C315&S:MSFT20240621C45040.17515237.5
AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62547810.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515770.0
2023-07-21TSLA[TSLA20240621C260][TSLA20240621C370]&L:TSLA20240621C260&S:TSLA20240621C37032.75026425.0
AAPL[AAPL20240621C175][AAPL20240621C255]&L:AAPL20240621C175&S:AAPL20240621C25529.97526132.0
MSFT[MSFT20240621C315][MSFT20240621C450]&L:MSFT20240621C315&S:MSFT20240621C45040.17515025.0
AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62547750.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515445.0
2023-07-24TSLA[TSLA20240621C260][TSLA20240621C370]&L:TSLA20240621C260&S:TSLA20240621C37032.75026965.0
AAPL[AAPL20240621C175][AAPL20240621C255]&L:AAPL20240621C175&S:AAPL20240621C25529.97526197.0
MSFT[MSFT20240621C315][MSFT20240621C450]&L:MSFT20240621C315&S:MSFT20240621C45040.17515107.5
AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62547560.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515362.5
2023-07-25TSLA[TSLA20240621C260][TSLA20240621C370]&L:TSLA20240621C260&S:TSLA20240621C37032.75026750.0
AAPL[AAPL20240621C175][AAPL20240621C255]&L:AAPL20240621C175&S:AAPL20240621C25529.97526361.0
MSFT[MSFT20240621C315][MSFT20240621C450]&L:MSFT20240621C315&S:MSFT20240621C45040.17515505.0
AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62547550.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515675.0
2023-07-26TSLA[TSLA20240621C260][TSLA20240621C370]&L:TSLA20240621C260&S:TSLA20240621C37032.75026775.0
AAPL[AAPL20240621C175][AAPL20240621C255]&L:AAPL20240621C175&S:AAPL20240621C25529.97526464.0
MSFT[MSFT20240621C315][MSFT20240621C450]&L:MSFT20240621C315&S:MSFT20240621C45040.17514692.5
AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62547370.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515612.5
2023-07-27TSLA[TSLA20240621C260][TSLA20240621C370]&L:TSLA20240621C260&S:TSLA20240621C37032.75026215.0
AAPL[AAPL20240621C175][AAPL20240621C255]&L:AAPL20240621C175&S:AAPL20240621C25529.97526329.0
MSFT[MSFT20240621C315][MSFT20240621C450]&L:MSFT20240621C315&S:MSFT20240621C45040.17514252.5
AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62547380.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515670.0
2023-07-28TSLA[TSLA20240621C260][TSLA20240621C370]&L:TSLA20240621C260&S:TSLA20240621C37032.75026895.0
AAPL[AAPL20240621C175][AAPL20240621C255]&L:AAPL20240621C175&S:AAPL20240621C25529.97526641.0
MSFT[MSFT20240621C315][MSFT20240621C450]&L:MSFT20240621C315&S:MSFT20240621C45040.17514730.0
AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62548100.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515927.5
2023-07-31TSLA[TSLA20240621C260][TSLA20240621C370]&L:TSLA20240621C260&S:TSLA20240621C37032.75026910.0
AAPL[AAPL20240621C175][AAPL20240621C255]&L:AAPL20240621C175&S:AAPL20240621C25529.97526739.0
MSFT[MSFT20240621C315][MSFT20240621C450]&L:MSFT20240621C315&S:MSFT20240621C45040.17514510.0
AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62548390.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515930.0
2023-08-01TSLA[TSLA20240621C260][TSLA20240621C370]&L:TSLA20240621C260&S:TSLA20240621C37032.75026550.0
AAPL[AAPL20240621C175][AAPL20240621C255]&L:AAPL20240621C175&S:AAPL20240621C25529.97526627.0
MSFT[MSFT20240621C315][MSFT20240621C450]&L:MSFT20240621C315&S:MSFT20240621C45040.17514607.5
AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62547960.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515967.5
2023-08-02AAPL[AAPL20240621C175][AAPL20240621C255]&L:AAPL20240621C175&S:AAPL20240621C25529.97526250.0
MSFT[MSFT20240621C315][MSFT20240621C450]&L:MSFT20240621C315&S:MSFT20240621C45040.17514122.5
AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62547340.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515135.0
2023-08-03AAPL[AAPL20240621C175][AAPL20240621C255]&L:AAPL20240621C175&S:AAPL20240621C25529.97525995.0
MSFT[MSFT20240621C315][MSFT20240621C450]&L:MSFT20240621C315&S:MSFT20240621C45040.17514100.0
AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62547500.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515267.5
2023-08-04MSFT[MSFT20240621C315][MSFT20240621C450]&L:MSFT20240621C315&S:MSFT20240621C45040.17514120.0
AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62549390.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515335.0
2023-08-07MSFT[MSFT20240621C315][MSFT20240621C450]&L:MSFT20240621C315&S:MSFT20240621C45040.17514240.0
AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62549870.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515587.5
2023-08-08MSFT[MSFT20240621C315][MSFT20240621C450]&L:MSFT20240621C315&S:MSFT20240621C45040.17514017.5
AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62549490.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515440.0
2023-08-09AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62549100.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67514932.5
2023-08-10AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62549250.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67514855.0
BA[BA20240621C220][BA20240621C310]&L:BA20240621C220&S:BA20240621C31030.97527095.0
WMT[WMT20240621C160][WMT20240621C175]&L:WMT20240621C160&S:WMT20240621C1757.400118387.5
2023-08-11AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62549210.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67514395.0
BA[BA20240621C220][BA20240621C310]&L:BA20240621C220&S:BA20240621C31030.97526785.0
WMT[WMT20240621C160][WMT20240621C175]&L:WMT20240621C160&S:WMT20240621C1757.400118772.5
2023-08-14AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62549620.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515185.0
BA[BA20240621C220][BA20240621C310]&L:BA20240621C220&S:BA20240621C31030.97526945.0
WMT[WMT20240621C160][WMT20240621C175]&L:WMT20240621C160&S:WMT20240621C1757.400118332.5
2023-08-15AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62549310.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515202.5
BA[BA20240621C220][BA20240621C310]&L:BA20240621C220&S:BA20240621C31030.97526450.0
WMT[WMT20240621C160][WMT20240621C175]&L:WMT20240621C160&S:WMT20240621C1757.400118085.0
2023-08-16AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62548630.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515105.0
BA[BA20240621C220][BA20240621C310]&L:BA20240621C220&S:BA20240621C31030.97526195.0
WMT[WMT20240621C160][WMT20240621C175]&L:WMT20240621C160&S:WMT20240621C1757.400118140.0
2023-08-17AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62548460.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515020.0
2023-08-18AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62548270.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515070.0
2023-08-21AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62548590.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515950.0
2023-08-22AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62548480.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515622.5
2023-08-23AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62548880.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67516097.5
2023-08-24AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62548040.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67516102.5
2023-08-25AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62548300.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515772.5
2023-08-28AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62548280.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515952.5
2023-08-29AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62548590.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67516400.0
2023-08-30AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62548590.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67516640.0
2023-08-31AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62549160.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67516705.0
2023-09-01AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62549190.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67516532.5
2023-09-04AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62548580.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67516542.5
2023-09-05AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62548580.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67516542.5
2023-09-06AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62548680.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67516207.5
2023-09-07AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62549130.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515995.0
2023-09-08AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62549250.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515757.5
2023-09-11AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.625410160.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515742.5
2023-09-12AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62549830.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515520.0
2023-09-13AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.625410590.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515725.0
2023-09-14AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.625410430.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515765.0
2023-09-15AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62549750.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515245.0
2023-09-18AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62549610.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515217.5
2023-09-19AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62549210.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515152.5
2023-09-20AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62548610.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67514760.0
2023-09-21AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62547440.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67514395.0
2023-09-22AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62547400.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67514570.0
2023-09-25AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62547830.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67514740.0
2023-09-26AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62546850.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67514662.5
2023-09-27AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62546810.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67514827.5
2023-09-28AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62546800.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515002.5
2023-09-29AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62547020.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515122.5
2023-10-02AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62547490.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515505.0
2023-10-03AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62546640.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515147.5
2023-10-04AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62547030.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515302.5
2023-10-05AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62546850.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515490.0
2023-10-06AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62547220.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515807.5
2023-10-09AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62547300.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515665.0
2023-10-10AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62547540.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515820.0
2023-10-11AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62548010.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67516130.0
2023-10-12AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62548110.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67516170.0
2023-10-13AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62547640.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515745.0
2023-10-16AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62548150.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515932.5
2023-10-17AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62547960.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515300.0
2023-10-18AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62547256.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67514762.5
2023-10-19AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62547360.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67514740.0
2023-10-20AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62546740.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67514515.0
2023-10-23AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62547030.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515030.0
2023-10-24AMZN[AMZN20240621C120][AMZN20240621C170]&L:AMZN20240621C120&S:AMZN20240621C17018.62547450.0
NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515245.0
2023-10-25NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67514640.0
2023-10-26NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67514215.0
2023-10-27NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67514275.0
2023-10-30NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67514490.0
2023-10-31NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67514362.5
2023-11-01NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67514780.0
2023-11-02NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515212.5
2023-11-03NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515687.5
2023-11-06NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515917.5
2023-11-07NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67516027.5
2023-11-08NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67516157.5
2023-11-09NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67516327.5
2023-11-10NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67516742.5
2023-11-13NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67516860.0
2023-11-14NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67517207.5
2023-11-15NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67516992.5
2023-11-16NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67517180.0
2023-11-17NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67517187.5
2023-11-20NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67517477.5
2023-11-21NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67517410.0
2023-11-22NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67517035.0
2023-11-23NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67516740.0
2023-11-24NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67516740.0
2023-11-27NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67516950.0
2023-11-28NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67516775.0
2023-11-29NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67516895.0
2023-11-30NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67516437.5
2023-12-01NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67516390.0
2023-12-04NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515945.0
2023-12-05NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67516315.0
2023-12-06NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67515912.5
2023-12-07NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67516365.0
2023-12-08NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67516695.0
2023-12-11NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67516345.0
2023-12-12NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67516740.0
2023-12-13NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67516940.0
2023-12-14NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67516980.0
2023-12-15NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67517247.5
2023-12-18NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67517630.0
2023-12-19NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67517467.5
2023-12-20NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67516910.0
2023-12-21NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67517197.5
2023-12-22NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67517140.0
2023-12-25NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67517357.5
2023-12-26NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67517357.5
2023-12-27NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67517437.5
2023-12-28NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67517505.0
2023-12-29NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67517510.0
2024-01-01NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67516995.0
2024-01-02NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67516995.0
2024-01-03NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67516785.0
2024-01-04NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67516920.0
2024-01-05NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67517432.5
2024-01-08NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67518537.5
2024-01-09NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67518817.5
2024-01-10NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67519182.5
2024-01-11NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67519340.0
2024-01-12NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67519330.0
2024-01-15NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67519897.5
2024-01-16NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67519897.5
2024-01-17NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.67519750.0
2024-01-18NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675110085.0
2024-01-19NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675110685.0
2024-01-22NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675110772.5
2024-01-23NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675110980.0
2024-01-24NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675111195.0
2024-01-25NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675111187.5
2024-01-26NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675111112.5
2024-01-29NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675111410.0
2024-01-30NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675111447.5
2024-01-31NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675111142.5
2024-02-01NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675111525.0
2024-02-02NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675112032.5
2024-02-05NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675112292.5
2024-02-06NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675112135.0
2024-02-07NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675112352.5
2024-02-08NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675112275.0
2024-02-09NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675112567.5
2024-02-12NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675112432.5
2024-02-13NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675112420.0
2024-02-14NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675112540.0
2024-02-15NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675112357.5
2024-02-16NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675112430.0
2024-02-19NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675112110.0
2024-02-20NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675112110.0
2024-02-21NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675112100.0
2024-02-22NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113120.0
2024-02-23NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113062.5
2024-02-26NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113177.5
2024-02-27NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113222.5
2024-02-28NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113190.0
2024-02-29NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113267.5
2024-03-01NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113417.5
2024-03-04NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113417.5
2024-03-05NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113285.0
2024-03-06NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113467.5
2024-03-07NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113547.5
2024-03-08NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113185.0
2024-03-11NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113242.5
2024-03-12NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113382.5
2024-03-13NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113380.0
2024-03-14NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113182.5
2024-03-15NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113432.5
2024-03-18NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113260.0
2024-03-19NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113402.5
2024-03-20NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113542.5
2024-03-21NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113565.0
2024-03-22NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113377.5
2024-03-25NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113602.5
2024-03-26NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113502.5
2024-03-27NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113450.0
2024-03-28NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113595.0
2024-03-29NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113595.0
2024-04-01NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113662.5
2024-04-02NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113765.0
2024-04-03NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113607.5
2024-04-04NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113625.0
2024-04-05NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113600.0
2024-04-08NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113607.5
2024-04-09NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113500.0
2024-04-10NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113632.5
2024-04-11NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113700.0
2024-04-12NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113642.5
2024-04-15NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113657.5
2024-04-16NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113627.5
2024-04-17NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113637.5
2024-04-18NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113690.0
2024-04-19NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113285.0
2024-04-22NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113687.5
2024-04-23NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113580.0
2024-04-24NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113532.5
2024-04-25NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113620.0
2024-04-26NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113647.5
2024-04-29NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113745.0
2024-04-30NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113795.0
2024-05-01NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113757.5
2024-05-02NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113717.5
2024-05-03NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113912.5
2024-05-06NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113855.0
2024-05-07NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113807.5
2024-05-08NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113787.5
2024-05-09NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113867.5
2024-05-10NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113885.0
2024-05-13NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113872.5
2024-05-14NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113875.0
2024-05-15NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113932.5
2024-05-16NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113917.5
2024-05-17NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113882.5
2024-05-20NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113827.5
2024-05-21NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113925.0
2024-05-22NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675114115.0
2024-05-23NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113952.5
2024-05-24NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113880.0
2024-05-27NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113977.5
2024-05-28NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113977.5
2024-05-29NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675114105.0
2024-05-30NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113935.0
2024-05-31NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113932.5
2024-06-03NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113967.5
2024-06-04NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113965.0
2024-06-05NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113985.0
2024-06-06NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113925.0
2024-06-07NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113967.5
2024-06-10NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113967.5
2024-06-11NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113967.5
2024-06-12NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113967.5
2024-06-13NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113967.5
2024-06-14NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113967.5
2024-06-17NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113967.5
2024-06-18NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113967.5
2024-06-19NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113967.5
2024-06-20NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113967.5
2024-06-21NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113967.5
2024-06-24NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113967.5
2024-06-25NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113967.5
2024-06-26NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113967.5
2024-06-27NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113967.5
2024-06-28NVDA[NVDA20240621C410][NVDA20240621C550]&L:NVDA20240621C410&S:NVDA20240621C550139.675113967.5
\n", - "
" - ], - "text/plain": [ - " long short \\\n", - "datetime symbol \n", - "2023-07-05 TSLA [TSLA20240621C260] [TSLA20240621C370] \n", - " AAPL [AAPL20240621C175] [AAPL20240621C255] \n", - " MSFT [MSFT20240621C315] [MSFT20240621C450] \n", - " AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-07-06 TSLA [TSLA20240621C260] [TSLA20240621C370] \n", - " AAPL [AAPL20240621C175] [AAPL20240621C255] \n", - " MSFT [MSFT20240621C315] [MSFT20240621C450] \n", - " AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-07-07 TSLA [TSLA20240621C260] [TSLA20240621C370] \n", - " AAPL [AAPL20240621C175] [AAPL20240621C255] \n", - " MSFT [MSFT20240621C315] [MSFT20240621C450] \n", - " AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-07-10 TSLA [TSLA20240621C260] [TSLA20240621C370] \n", - " AAPL [AAPL20240621C175] [AAPL20240621C255] \n", - " MSFT [MSFT20240621C315] [MSFT20240621C450] \n", - " AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-07-11 TSLA [TSLA20240621C260] [TSLA20240621C370] \n", - " AAPL [AAPL20240621C175] [AAPL20240621C255] \n", - " MSFT [MSFT20240621C315] [MSFT20240621C450] \n", - " AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-07-12 TSLA [TSLA20240621C260] [TSLA20240621C370] \n", - " AAPL [AAPL20240621C175] [AAPL20240621C255] \n", - " MSFT [MSFT20240621C315] [MSFT20240621C450] \n", - " AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-07-13 TSLA [TSLA20240621C260] [TSLA20240621C370] \n", - " AAPL [AAPL20240621C175] [AAPL20240621C255] \n", - " MSFT [MSFT20240621C315] [MSFT20240621C450] \n", - " AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-07-14 TSLA [TSLA20240621C260] [TSLA20240621C370] \n", - " AAPL [AAPL20240621C175] [AAPL20240621C255] \n", - " MSFT [MSFT20240621C315] [MSFT20240621C450] \n", - " AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-07-17 TSLA [TSLA20240621C260] [TSLA20240621C370] \n", - " AAPL [AAPL20240621C175] [AAPL20240621C255] \n", - " MSFT [MSFT20240621C315] [MSFT20240621C450] \n", - " AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-07-18 TSLA [TSLA20240621C260] [TSLA20240621C370] \n", - " AAPL [AAPL20240621C175] [AAPL20240621C255] \n", - " MSFT [MSFT20240621C315] [MSFT20240621C450] \n", - " AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-07-19 TSLA [TSLA20240621C260] [TSLA20240621C370] \n", - " AAPL [AAPL20240621C175] [AAPL20240621C255] \n", - " MSFT [MSFT20240621C315] [MSFT20240621C450] \n", - " AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-07-20 TSLA [TSLA20240621C260] [TSLA20240621C370] \n", - " AAPL [AAPL20240621C175] [AAPL20240621C255] \n", - " MSFT [MSFT20240621C315] [MSFT20240621C450] \n", - " AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-07-21 TSLA [TSLA20240621C260] [TSLA20240621C370] \n", - " AAPL [AAPL20240621C175] [AAPL20240621C255] \n", - " MSFT [MSFT20240621C315] [MSFT20240621C450] \n", - " AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-07-24 TSLA [TSLA20240621C260] [TSLA20240621C370] \n", - " AAPL [AAPL20240621C175] [AAPL20240621C255] \n", - " MSFT [MSFT20240621C315] [MSFT20240621C450] \n", - " AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-07-25 TSLA [TSLA20240621C260] [TSLA20240621C370] \n", - " AAPL [AAPL20240621C175] [AAPL20240621C255] \n", - " MSFT [MSFT20240621C315] [MSFT20240621C450] \n", - " AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-07-26 TSLA [TSLA20240621C260] [TSLA20240621C370] \n", - " AAPL [AAPL20240621C175] [AAPL20240621C255] \n", - " MSFT [MSFT20240621C315] [MSFT20240621C450] \n", - " AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-07-27 TSLA [TSLA20240621C260] [TSLA20240621C370] \n", - " AAPL [AAPL20240621C175] [AAPL20240621C255] \n", - " MSFT [MSFT20240621C315] [MSFT20240621C450] \n", - " AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-07-28 TSLA [TSLA20240621C260] [TSLA20240621C370] \n", - " AAPL [AAPL20240621C175] [AAPL20240621C255] \n", - " MSFT [MSFT20240621C315] [MSFT20240621C450] \n", - " AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-07-31 TSLA [TSLA20240621C260] [TSLA20240621C370] \n", - " AAPL [AAPL20240621C175] [AAPL20240621C255] \n", - " MSFT [MSFT20240621C315] [MSFT20240621C450] \n", - " AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-08-01 TSLA [TSLA20240621C260] [TSLA20240621C370] \n", - " AAPL [AAPL20240621C175] [AAPL20240621C255] \n", - " MSFT [MSFT20240621C315] [MSFT20240621C450] \n", - " AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-08-02 AAPL [AAPL20240621C175] [AAPL20240621C255] \n", - " MSFT [MSFT20240621C315] [MSFT20240621C450] \n", - " AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-08-03 AAPL [AAPL20240621C175] [AAPL20240621C255] \n", - " MSFT [MSFT20240621C315] [MSFT20240621C450] \n", - " AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-08-04 MSFT [MSFT20240621C315] [MSFT20240621C450] \n", - " AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-08-07 MSFT [MSFT20240621C315] [MSFT20240621C450] \n", - " AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-08-08 MSFT [MSFT20240621C315] [MSFT20240621C450] \n", - " AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-08-09 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-08-10 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - " BA [BA20240621C220] [BA20240621C310] \n", - " WMT [WMT20240621C160] [WMT20240621C175] \n", - "2023-08-11 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - " BA [BA20240621C220] [BA20240621C310] \n", - " WMT [WMT20240621C160] [WMT20240621C175] \n", - "2023-08-14 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - " BA [BA20240621C220] [BA20240621C310] \n", - " WMT [WMT20240621C160] [WMT20240621C175] \n", - "2023-08-15 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - " BA [BA20240621C220] [BA20240621C310] \n", - " WMT [WMT20240621C160] [WMT20240621C175] \n", - "2023-08-16 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - " BA [BA20240621C220] [BA20240621C310] \n", - " WMT [WMT20240621C160] [WMT20240621C175] \n", - "2023-08-17 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-08-18 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-08-21 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-08-22 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-08-23 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-08-24 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-08-25 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-08-28 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-08-29 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-08-30 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-08-31 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-09-01 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-09-04 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-09-05 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-09-06 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-09-07 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-09-08 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-09-11 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-09-12 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-09-13 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-09-14 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-09-15 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-09-18 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-09-19 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-09-20 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-09-21 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-09-22 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-09-25 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-09-26 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-09-27 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-09-28 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-09-29 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-10-02 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-10-03 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-10-04 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-10-05 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-10-06 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-10-09 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-10-10 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-10-11 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-10-12 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-10-13 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-10-16 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-10-17 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-10-18 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-10-19 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-10-20 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-10-23 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-10-24 AMZN [AMZN20240621C120] [AMZN20240621C170] \n", - " NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-10-25 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-10-26 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-10-27 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-10-30 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-10-31 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-11-01 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-11-02 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-11-03 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-11-06 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-11-07 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-11-08 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-11-09 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-11-10 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-11-13 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-11-14 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-11-15 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-11-16 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-11-17 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-11-20 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-11-21 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-11-22 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-11-23 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-11-24 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-11-27 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-11-28 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-11-29 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-11-30 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-12-01 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-12-04 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-12-05 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-12-06 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-12-07 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-12-08 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-12-11 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-12-12 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-12-13 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-12-14 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-12-15 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-12-18 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-12-19 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-12-20 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-12-21 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-12-22 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-12-25 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-12-26 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-12-27 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-12-28 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2023-12-29 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-01-01 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-01-02 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-01-03 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-01-04 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-01-05 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-01-08 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-01-09 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-01-10 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-01-11 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-01-12 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-01-15 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-01-16 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-01-17 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-01-18 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-01-19 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-01-22 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-01-23 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-01-24 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-01-25 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-01-26 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-01-29 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-01-30 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-01-31 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-02-01 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-02-02 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-02-05 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-02-06 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-02-07 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-02-08 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-02-09 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-02-12 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-02-13 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-02-14 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-02-15 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-02-16 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-02-19 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-02-20 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-02-21 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-02-22 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-02-23 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-02-26 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-02-27 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-02-28 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-02-29 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-03-01 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-03-04 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-03-05 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-03-06 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-03-07 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-03-08 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-03-11 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-03-12 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-03-13 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-03-14 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-03-15 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-03-18 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-03-19 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-03-20 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-03-21 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-03-22 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-03-25 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-03-26 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-03-27 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-03-28 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-03-29 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-04-01 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-04-02 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-04-03 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-04-04 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-04-05 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-04-08 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-04-09 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-04-10 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-04-11 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-04-12 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-04-15 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-04-16 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-04-17 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-04-18 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-04-19 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-04-22 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-04-23 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-04-24 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-04-25 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-04-26 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-04-29 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-04-30 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-05-01 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-05-02 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-05-03 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-05-06 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-05-07 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-05-08 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-05-09 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-05-10 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-05-13 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-05-14 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-05-15 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-05-16 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-05-17 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-05-20 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-05-21 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-05-22 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-05-23 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-05-24 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-05-27 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-05-28 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-05-29 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-05-30 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-05-31 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-06-03 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-06-04 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-06-05 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-06-06 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-06-07 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-06-10 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-06-11 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-06-12 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-06-13 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-06-14 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-06-17 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-06-18 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-06-19 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-06-20 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-06-21 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-06-24 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-06-25 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-06-26 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-06-27 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "2024-06-28 NVDA [NVDA20240621C410] [NVDA20240621C550] \n", - "\n", - " trade_id close quantity \\\n", - "datetime symbol \n", - "2023-07-05 TSLA &L:TSLA20240621C260&S:TSLA20240621C370 32.750 2 \n", - " AAPL &L:AAPL20240621C175&S:AAPL20240621C255 29.975 2 \n", - " MSFT &L:MSFT20240621C315&S:MSFT20240621C450 40.175 1 \n", - " AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-07-06 TSLA &L:TSLA20240621C260&S:TSLA20240621C370 32.750 2 \n", - " AAPL &L:AAPL20240621C175&S:AAPL20240621C255 29.975 2 \n", - " MSFT &L:MSFT20240621C315&S:MSFT20240621C450 40.175 1 \n", - " AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-07-07 TSLA &L:TSLA20240621C260&S:TSLA20240621C370 32.750 2 \n", - " AAPL &L:AAPL20240621C175&S:AAPL20240621C255 29.975 2 \n", - " MSFT &L:MSFT20240621C315&S:MSFT20240621C450 40.175 1 \n", - " AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-07-10 TSLA &L:TSLA20240621C260&S:TSLA20240621C370 32.750 2 \n", - " AAPL &L:AAPL20240621C175&S:AAPL20240621C255 29.975 2 \n", - " MSFT &L:MSFT20240621C315&S:MSFT20240621C450 40.175 1 \n", - " AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-07-11 TSLA &L:TSLA20240621C260&S:TSLA20240621C370 32.750 2 \n", - " AAPL &L:AAPL20240621C175&S:AAPL20240621C255 29.975 2 \n", - " MSFT &L:MSFT20240621C315&S:MSFT20240621C450 40.175 1 \n", - " AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-07-12 TSLA &L:TSLA20240621C260&S:TSLA20240621C370 32.750 2 \n", - " AAPL &L:AAPL20240621C175&S:AAPL20240621C255 29.975 2 \n", - " MSFT &L:MSFT20240621C315&S:MSFT20240621C450 40.175 1 \n", - " AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-07-13 TSLA &L:TSLA20240621C260&S:TSLA20240621C370 32.750 2 \n", - " AAPL &L:AAPL20240621C175&S:AAPL20240621C255 29.975 2 \n", - " MSFT &L:MSFT20240621C315&S:MSFT20240621C450 40.175 1 \n", - " AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-07-14 TSLA &L:TSLA20240621C260&S:TSLA20240621C370 32.750 2 \n", - " AAPL &L:AAPL20240621C175&S:AAPL20240621C255 29.975 2 \n", - " MSFT &L:MSFT20240621C315&S:MSFT20240621C450 40.175 1 \n", - " AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-07-17 TSLA &L:TSLA20240621C260&S:TSLA20240621C370 32.750 2 \n", - " AAPL &L:AAPL20240621C175&S:AAPL20240621C255 29.975 2 \n", - " MSFT &L:MSFT20240621C315&S:MSFT20240621C450 40.175 1 \n", - " AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-07-18 TSLA &L:TSLA20240621C260&S:TSLA20240621C370 32.750 2 \n", - " AAPL &L:AAPL20240621C175&S:AAPL20240621C255 29.975 2 \n", - " MSFT &L:MSFT20240621C315&S:MSFT20240621C450 40.175 1 \n", - " AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-07-19 TSLA &L:TSLA20240621C260&S:TSLA20240621C370 32.750 2 \n", - " AAPL &L:AAPL20240621C175&S:AAPL20240621C255 29.975 2 \n", - " MSFT &L:MSFT20240621C315&S:MSFT20240621C450 40.175 1 \n", - " AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-07-20 TSLA &L:TSLA20240621C260&S:TSLA20240621C370 32.750 2 \n", - " AAPL &L:AAPL20240621C175&S:AAPL20240621C255 29.975 2 \n", - " MSFT &L:MSFT20240621C315&S:MSFT20240621C450 40.175 1 \n", - " AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-07-21 TSLA &L:TSLA20240621C260&S:TSLA20240621C370 32.750 2 \n", - " AAPL &L:AAPL20240621C175&S:AAPL20240621C255 29.975 2 \n", - " MSFT &L:MSFT20240621C315&S:MSFT20240621C450 40.175 1 \n", - " AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-07-24 TSLA &L:TSLA20240621C260&S:TSLA20240621C370 32.750 2 \n", - " AAPL &L:AAPL20240621C175&S:AAPL20240621C255 29.975 2 \n", - " MSFT &L:MSFT20240621C315&S:MSFT20240621C450 40.175 1 \n", - " AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-07-25 TSLA &L:TSLA20240621C260&S:TSLA20240621C370 32.750 2 \n", - " AAPL &L:AAPL20240621C175&S:AAPL20240621C255 29.975 2 \n", - " MSFT &L:MSFT20240621C315&S:MSFT20240621C450 40.175 1 \n", - " AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-07-26 TSLA &L:TSLA20240621C260&S:TSLA20240621C370 32.750 2 \n", - " AAPL &L:AAPL20240621C175&S:AAPL20240621C255 29.975 2 \n", - " MSFT &L:MSFT20240621C315&S:MSFT20240621C450 40.175 1 \n", - " AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-07-27 TSLA &L:TSLA20240621C260&S:TSLA20240621C370 32.750 2 \n", - " AAPL &L:AAPL20240621C175&S:AAPL20240621C255 29.975 2 \n", - " MSFT &L:MSFT20240621C315&S:MSFT20240621C450 40.175 1 \n", - " AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-07-28 TSLA &L:TSLA20240621C260&S:TSLA20240621C370 32.750 2 \n", - " AAPL &L:AAPL20240621C175&S:AAPL20240621C255 29.975 2 \n", - " MSFT &L:MSFT20240621C315&S:MSFT20240621C450 40.175 1 \n", - " AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-07-31 TSLA &L:TSLA20240621C260&S:TSLA20240621C370 32.750 2 \n", - " AAPL &L:AAPL20240621C175&S:AAPL20240621C255 29.975 2 \n", - " MSFT &L:MSFT20240621C315&S:MSFT20240621C450 40.175 1 \n", - " AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-08-01 TSLA &L:TSLA20240621C260&S:TSLA20240621C370 32.750 2 \n", - " AAPL &L:AAPL20240621C175&S:AAPL20240621C255 29.975 2 \n", - " MSFT &L:MSFT20240621C315&S:MSFT20240621C450 40.175 1 \n", - " AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-08-02 AAPL &L:AAPL20240621C175&S:AAPL20240621C255 29.975 2 \n", - " MSFT &L:MSFT20240621C315&S:MSFT20240621C450 40.175 1 \n", - " AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-08-03 AAPL &L:AAPL20240621C175&S:AAPL20240621C255 29.975 2 \n", - " MSFT &L:MSFT20240621C315&S:MSFT20240621C450 40.175 1 \n", - " AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-08-04 MSFT &L:MSFT20240621C315&S:MSFT20240621C450 40.175 1 \n", - " AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-08-07 MSFT &L:MSFT20240621C315&S:MSFT20240621C450 40.175 1 \n", - " AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-08-08 MSFT &L:MSFT20240621C315&S:MSFT20240621C450 40.175 1 \n", - " AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-08-09 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-08-10 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - " BA &L:BA20240621C220&S:BA20240621C310 30.975 2 \n", - " WMT &L:WMT20240621C160&S:WMT20240621C175 7.400 11 \n", - "2023-08-11 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - " BA &L:BA20240621C220&S:BA20240621C310 30.975 2 \n", - " WMT &L:WMT20240621C160&S:WMT20240621C175 7.400 11 \n", - "2023-08-14 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - " BA &L:BA20240621C220&S:BA20240621C310 30.975 2 \n", - " WMT &L:WMT20240621C160&S:WMT20240621C175 7.400 11 \n", - "2023-08-15 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - " BA &L:BA20240621C220&S:BA20240621C310 30.975 2 \n", - " WMT &L:WMT20240621C160&S:WMT20240621C175 7.400 11 \n", - "2023-08-16 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - " BA &L:BA20240621C220&S:BA20240621C310 30.975 2 \n", - " WMT &L:WMT20240621C160&S:WMT20240621C175 7.400 11 \n", - "2023-08-17 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-08-18 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-08-21 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-08-22 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-08-23 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-08-24 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-08-25 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-08-28 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-08-29 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-08-30 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-08-31 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-09-01 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-09-04 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-09-05 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-09-06 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-09-07 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-09-08 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-09-11 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-09-12 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-09-13 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-09-14 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-09-15 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-09-18 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-09-19 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-09-20 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-09-21 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-09-22 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-09-25 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-09-26 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-09-27 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-09-28 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-09-29 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-10-02 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-10-03 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-10-04 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-10-05 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-10-06 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-10-09 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-10-10 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-10-11 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-10-12 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-10-13 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-10-16 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-10-17 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-10-18 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-10-19 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-10-20 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-10-23 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-10-24 AMZN &L:AMZN20240621C120&S:AMZN20240621C170 18.625 4 \n", - " NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-10-25 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-10-26 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-10-27 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-10-30 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-10-31 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-11-01 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-11-02 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-11-03 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-11-06 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-11-07 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-11-08 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-11-09 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-11-10 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-11-13 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-11-14 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-11-15 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-11-16 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-11-17 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-11-20 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-11-21 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-11-22 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-11-23 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-11-24 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-11-27 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-11-28 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-11-29 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-11-30 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-12-01 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-12-04 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-12-05 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-12-06 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-12-07 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-12-08 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-12-11 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-12-12 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-12-13 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-12-14 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-12-15 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-12-18 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-12-19 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-12-20 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-12-21 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-12-22 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-12-25 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-12-26 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-12-27 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-12-28 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2023-12-29 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-01-01 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-01-02 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-01-03 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-01-04 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-01-05 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-01-08 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-01-09 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-01-10 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-01-11 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-01-12 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-01-15 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-01-16 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-01-17 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-01-18 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-01-19 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-01-22 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-01-23 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-01-24 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-01-25 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-01-26 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-01-29 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-01-30 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-01-31 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-02-01 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-02-02 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-02-05 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-02-06 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-02-07 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-02-08 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-02-09 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-02-12 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-02-13 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-02-14 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-02-15 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-02-16 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-02-19 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-02-20 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-02-21 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-02-22 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-02-23 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-02-26 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-02-27 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-02-28 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-02-29 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-03-01 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-03-04 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-03-05 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-03-06 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-03-07 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-03-08 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-03-11 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-03-12 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-03-13 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-03-14 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-03-15 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-03-18 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-03-19 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-03-20 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-03-21 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-03-22 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-03-25 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-03-26 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-03-27 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-03-28 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-03-29 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-04-01 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-04-02 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-04-03 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-04-04 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-04-05 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-04-08 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-04-09 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-04-10 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-04-11 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-04-12 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-04-15 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-04-16 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-04-17 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-04-18 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-04-19 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-04-22 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-04-23 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-04-24 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-04-25 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-04-26 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-04-29 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-04-30 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-05-01 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-05-02 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-05-03 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-05-06 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-05-07 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-05-08 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-05-09 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-05-10 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-05-13 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-05-14 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-05-15 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-05-16 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-05-17 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-05-20 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-05-21 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-05-22 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-05-23 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-05-24 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-05-27 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-05-28 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-05-29 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-05-30 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-05-31 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-06-03 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-06-04 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-06-05 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-06-06 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-06-07 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-06-10 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-06-11 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-06-12 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-06-13 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-06-14 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-06-17 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-06-18 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-06-19 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-06-20 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-06-21 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-06-24 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-06-25 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-06-26 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-06-27 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "2024-06-28 NVDA &L:NVDA20240621C410&S:NVDA20240621C550 139.675 1 \n", - "\n", - " market_value \n", - "datetime symbol \n", - "2023-07-05 TSLA 7845.0 \n", - " AAPL 6110.0 \n", - " MSFT 4960.0 \n", - " AMZN 7980.0 \n", - " NVDA 4860.0 \n", - "2023-07-06 TSLA 7515.0 \n", - " AAPL 6233.0 \n", - " MSFT 5167.5 \n", - " AMZN 7650.0 \n", - " NVDA 4835.0 \n", - "2023-07-07 TSLA 7380.0 \n", - " AAPL 6055.0 \n", - " MSFT 4852.5 \n", - " AMZN 7900.0 \n", - " NVDA 4882.5 \n", - "2023-07-10 TSLA 7085.0 \n", - " AAPL 5769.0 \n", - " MSFT 4560.0 \n", - " AMZN 7400.0 \n", - " NVDA 4872.5 \n", - "2023-07-11 TSLA 7120.0 \n", - " AAPL 5707.0 \n", - " MSFT 4560.0 \n", - " AMZN 7720.0 \n", - " NVDA 4892.5 \n", - "2023-07-12 TSLA 7300.0 \n", - " AAPL 5904.0 \n", - " MSFT 4827.5 \n", - " AMZN 8090.0 \n", - " NVDA 5160.0 \n", - "2023-07-13 TSLA 7595.0 \n", - " AAPL 5976.0 \n", - " MSFT 5090.0 \n", - " AMZN 8640.0 \n", - " NVDA 5847.5 \n", - "2023-07-14 TSLA 7790.0 \n", - " AAPL 6002.0 \n", - " MSFT 5172.5 \n", - " AMZN 8730.0 \n", - " NVDA 5582.5 \n", - "2023-07-17 TSLA 8280.0 \n", - " AAPL 6436.0 \n", - " MSFT 5172.5 \n", - " AMZN 8530.0 \n", - " NVDA 5930.0 \n", - "2023-07-18 TSLA 8405.0 \n", - " AAPL 6407.0 \n", - " MSFT 5870.0 \n", - " AMZN 8360.0 \n", - " NVDA 6082.5 \n", - "2023-07-19 TSLA 8325.0 \n", - " AAPL 6443.0 \n", - " MSFT 5687.5 \n", - " AMZN 8870.0 \n", - " NVDA 6155.0 \n", - "2023-07-20 TSLA 6600.0 \n", - " AAPL 6287.0 \n", - " MSFT 5237.5 \n", - " AMZN 7810.0 \n", - " NVDA 5770.0 \n", - "2023-07-21 TSLA 6425.0 \n", - " AAPL 6132.0 \n", - " MSFT 5025.0 \n", - " AMZN 7750.0 \n", - " NVDA 5445.0 \n", - "2023-07-24 TSLA 6965.0 \n", - " AAPL 6197.0 \n", - " MSFT 5107.5 \n", - " AMZN 7560.0 \n", - " NVDA 5362.5 \n", - "2023-07-25 TSLA 6750.0 \n", - " AAPL 6361.0 \n", - " MSFT 5505.0 \n", - " AMZN 7550.0 \n", - " NVDA 5675.0 \n", - "2023-07-26 TSLA 6775.0 \n", - " AAPL 6464.0 \n", - " MSFT 4692.5 \n", - " AMZN 7370.0 \n", - " NVDA 5612.5 \n", - "2023-07-27 TSLA 6215.0 \n", - " AAPL 6329.0 \n", - " MSFT 4252.5 \n", - " AMZN 7380.0 \n", - " NVDA 5670.0 \n", - "2023-07-28 TSLA 6895.0 \n", - " AAPL 6641.0 \n", - " MSFT 4730.0 \n", - " AMZN 8100.0 \n", - " NVDA 5927.5 \n", - "2023-07-31 TSLA 6910.0 \n", - " AAPL 6739.0 \n", - " MSFT 4510.0 \n", - " AMZN 8390.0 \n", - " NVDA 5930.0 \n", - "2023-08-01 TSLA 6550.0 \n", - " AAPL 6627.0 \n", - " MSFT 4607.5 \n", - " AMZN 7960.0 \n", - " NVDA 5967.5 \n", - "2023-08-02 AAPL 6250.0 \n", - " MSFT 4122.5 \n", - " AMZN 7340.0 \n", - " NVDA 5135.0 \n", - "2023-08-03 AAPL 5995.0 \n", - " MSFT 4100.0 \n", - " AMZN 7500.0 \n", - " NVDA 5267.5 \n", - "2023-08-04 MSFT 4120.0 \n", - " AMZN 9390.0 \n", - " NVDA 5335.0 \n", - "2023-08-07 MSFT 4240.0 \n", - " AMZN 9870.0 \n", - " NVDA 5587.5 \n", - "2023-08-08 MSFT 4017.5 \n", - " AMZN 9490.0 \n", - " NVDA 5440.0 \n", - "2023-08-09 AMZN 9100.0 \n", - " NVDA 4932.5 \n", - "2023-08-10 AMZN 9250.0 \n", - " NVDA 4855.0 \n", - " BA 7095.0 \n", - " WMT 8387.5 \n", - "2023-08-11 AMZN 9210.0 \n", - " NVDA 4395.0 \n", - " BA 6785.0 \n", - " WMT 8772.5 \n", - "2023-08-14 AMZN 9620.0 \n", - " NVDA 5185.0 \n", - " BA 6945.0 \n", - " WMT 8332.5 \n", - "2023-08-15 AMZN 9310.0 \n", - " NVDA 5202.5 \n", - " BA 6450.0 \n", - " WMT 8085.0 \n", - "2023-08-16 AMZN 8630.0 \n", - " NVDA 5105.0 \n", - " BA 6195.0 \n", - " WMT 8140.0 \n", - "2023-08-17 AMZN 8460.0 \n", - " NVDA 5020.0 \n", - "2023-08-18 AMZN 8270.0 \n", - " NVDA 5070.0 \n", - "2023-08-21 AMZN 8590.0 \n", - " NVDA 5950.0 \n", - "2023-08-22 AMZN 8480.0 \n", - " NVDA 5622.5 \n", - "2023-08-23 AMZN 8880.0 \n", - " NVDA 6097.5 \n", - "2023-08-24 AMZN 8040.0 \n", - " NVDA 6102.5 \n", - "2023-08-25 AMZN 8300.0 \n", - " NVDA 5772.5 \n", - "2023-08-28 AMZN 8280.0 \n", - " NVDA 5952.5 \n", - "2023-08-29 AMZN 8590.0 \n", - " NVDA 6400.0 \n", - "2023-08-30 AMZN 8590.0 \n", - " NVDA 6640.0 \n", - "2023-08-31 AMZN 9160.0 \n", - " NVDA 6705.0 \n", - "2023-09-01 AMZN 9190.0 \n", - " NVDA 6532.5 \n", - "2023-09-04 AMZN 8580.0 \n", - " NVDA 6542.5 \n", - "2023-09-05 AMZN 8580.0 \n", - " NVDA 6542.5 \n", - "2023-09-06 AMZN 8680.0 \n", - " NVDA 6207.5 \n", - "2023-09-07 AMZN 9130.0 \n", - " NVDA 5995.0 \n", - "2023-09-08 AMZN 9250.0 \n", - " NVDA 5757.5 \n", - "2023-09-11 AMZN 10160.0 \n", - " NVDA 5742.5 \n", - "2023-09-12 AMZN 9830.0 \n", - " NVDA 5520.0 \n", - "2023-09-13 AMZN 10590.0 \n", - " NVDA 5725.0 \n", - "2023-09-14 AMZN 10430.0 \n", - " NVDA 5765.0 \n", - "2023-09-15 AMZN 9750.0 \n", - " NVDA 5245.0 \n", - "2023-09-18 AMZN 9610.0 \n", - " NVDA 5217.5 \n", - "2023-09-19 AMZN 9210.0 \n", - " NVDA 5152.5 \n", - "2023-09-20 AMZN 8610.0 \n", - " NVDA 4760.0 \n", - "2023-09-21 AMZN 7440.0 \n", - " NVDA 4395.0 \n", - "2023-09-22 AMZN 7400.0 \n", - " NVDA 4570.0 \n", - "2023-09-25 AMZN 7830.0 \n", - " NVDA 4740.0 \n", - "2023-09-26 AMZN 6850.0 \n", - " NVDA 4662.5 \n", - "2023-09-27 AMZN 6810.0 \n", - " NVDA 4827.5 \n", - "2023-09-28 AMZN 6800.0 \n", - " NVDA 5002.5 \n", - "2023-09-29 AMZN 7020.0 \n", - " NVDA 5122.5 \n", - "2023-10-02 AMZN 7490.0 \n", - " NVDA 5505.0 \n", - "2023-10-03 AMZN 6640.0 \n", - " NVDA 5147.5 \n", - "2023-10-04 AMZN 7030.0 \n", - " NVDA 5302.5 \n", - "2023-10-05 AMZN 6850.0 \n", - " NVDA 5490.0 \n", - "2023-10-06 AMZN 7220.0 \n", - " NVDA 5807.5 \n", - "2023-10-09 AMZN 7300.0 \n", - " NVDA 5665.0 \n", - "2023-10-10 AMZN 7540.0 \n", - " NVDA 5820.0 \n", - "2023-10-11 AMZN 8010.0 \n", - " NVDA 6130.0 \n", - "2023-10-12 AMZN 8110.0 \n", - " NVDA 6170.0 \n", - "2023-10-13 AMZN 7640.0 \n", - " NVDA 5745.0 \n", - "2023-10-16 AMZN 8150.0 \n", - " NVDA 5932.5 \n", - "2023-10-17 AMZN 7960.0 \n", - " NVDA 5300.0 \n", - "2023-10-18 AMZN 7256.0 \n", - " NVDA 4762.5 \n", - "2023-10-19 AMZN 7360.0 \n", - " NVDA 4740.0 \n", - "2023-10-20 AMZN 6740.0 \n", - " NVDA 4515.0 \n", - "2023-10-23 AMZN 7030.0 \n", - " NVDA 5030.0 \n", - "2023-10-24 AMZN 7450.0 \n", - " NVDA 5245.0 \n", - "2023-10-25 NVDA 4640.0 \n", - "2023-10-26 NVDA 4215.0 \n", - "2023-10-27 NVDA 4275.0 \n", - "2023-10-30 NVDA 4490.0 \n", - "2023-10-31 NVDA 4362.5 \n", - "2023-11-01 NVDA 4780.0 \n", - "2023-11-02 NVDA 5212.5 \n", - "2023-11-03 NVDA 5687.5 \n", - "2023-11-06 NVDA 5917.5 \n", - "2023-11-07 NVDA 6027.5 \n", - "2023-11-08 NVDA 6157.5 \n", - "2023-11-09 NVDA 6327.5 \n", - "2023-11-10 NVDA 6742.5 \n", - "2023-11-13 NVDA 6860.0 \n", - "2023-11-14 NVDA 7207.5 \n", - "2023-11-15 NVDA 6992.5 \n", - "2023-11-16 NVDA 7180.0 \n", - "2023-11-17 NVDA 7187.5 \n", - "2023-11-20 NVDA 7477.5 \n", - "2023-11-21 NVDA 7410.0 \n", - "2023-11-22 NVDA 7035.0 \n", - "2023-11-23 NVDA 6740.0 \n", - "2023-11-24 NVDA 6740.0 \n", - "2023-11-27 NVDA 6950.0 \n", - "2023-11-28 NVDA 6775.0 \n", - "2023-11-29 NVDA 6895.0 \n", - "2023-11-30 NVDA 6437.5 \n", - "2023-12-01 NVDA 6390.0 \n", - "2023-12-04 NVDA 5945.0 \n", - "2023-12-05 NVDA 6315.0 \n", - "2023-12-06 NVDA 5912.5 \n", - "2023-12-07 NVDA 6365.0 \n", - "2023-12-08 NVDA 6695.0 \n", - "2023-12-11 NVDA 6345.0 \n", - "2023-12-12 NVDA 6740.0 \n", - "2023-12-13 NVDA 6940.0 \n", - "2023-12-14 NVDA 6980.0 \n", - "2023-12-15 NVDA 7247.5 \n", - "2023-12-18 NVDA 7630.0 \n", - "2023-12-19 NVDA 7467.5 \n", - "2023-12-20 NVDA 6910.0 \n", - "2023-12-21 NVDA 7197.5 \n", - "2023-12-22 NVDA 7140.0 \n", - "2023-12-25 NVDA 7357.5 \n", - "2023-12-26 NVDA 7357.5 \n", - "2023-12-27 NVDA 7437.5 \n", - "2023-12-28 NVDA 7505.0 \n", - "2023-12-29 NVDA 7510.0 \n", - "2024-01-01 NVDA 6995.0 \n", - "2024-01-02 NVDA 6995.0 \n", - "2024-01-03 NVDA 6785.0 \n", - "2024-01-04 NVDA 6920.0 \n", - "2024-01-05 NVDA 7432.5 \n", - "2024-01-08 NVDA 8537.5 \n", - "2024-01-09 NVDA 8817.5 \n", - "2024-01-10 NVDA 9182.5 \n", - "2024-01-11 NVDA 9340.0 \n", - "2024-01-12 NVDA 9330.0 \n", - "2024-01-15 NVDA 9897.5 \n", - "2024-01-16 NVDA 9897.5 \n", - "2024-01-17 NVDA 9750.0 \n", - "2024-01-18 NVDA 10085.0 \n", - "2024-01-19 NVDA 10685.0 \n", - "2024-01-22 NVDA 10772.5 \n", - "2024-01-23 NVDA 10980.0 \n", - "2024-01-24 NVDA 11195.0 \n", - "2024-01-25 NVDA 11187.5 \n", - "2024-01-26 NVDA 11112.5 \n", - "2024-01-29 NVDA 11410.0 \n", - "2024-01-30 NVDA 11447.5 \n", - "2024-01-31 NVDA 11142.5 \n", - "2024-02-01 NVDA 11525.0 \n", - "2024-02-02 NVDA 12032.5 \n", - "2024-02-05 NVDA 12292.5 \n", - "2024-02-06 NVDA 12135.0 \n", - "2024-02-07 NVDA 12352.5 \n", - "2024-02-08 NVDA 12275.0 \n", - "2024-02-09 NVDA 12567.5 \n", - "2024-02-12 NVDA 12432.5 \n", - "2024-02-13 NVDA 12420.0 \n", - "2024-02-14 NVDA 12540.0 \n", - "2024-02-15 NVDA 12357.5 \n", - "2024-02-16 NVDA 12430.0 \n", - "2024-02-19 NVDA 12110.0 \n", - "2024-02-20 NVDA 12110.0 \n", - "2024-02-21 NVDA 12100.0 \n", - "2024-02-22 NVDA 13120.0 \n", - "2024-02-23 NVDA 13062.5 \n", - "2024-02-26 NVDA 13177.5 \n", - "2024-02-27 NVDA 13222.5 \n", - "2024-02-28 NVDA 13190.0 \n", - "2024-02-29 NVDA 13267.5 \n", - "2024-03-01 NVDA 13417.5 \n", - "2024-03-04 NVDA 13417.5 \n", - "2024-03-05 NVDA 13285.0 \n", - "2024-03-06 NVDA 13467.5 \n", - "2024-03-07 NVDA 13547.5 \n", - "2024-03-08 NVDA 13185.0 \n", - "2024-03-11 NVDA 13242.5 \n", - "2024-03-12 NVDA 13382.5 \n", - "2024-03-13 NVDA 13380.0 \n", - "2024-03-14 NVDA 13182.5 \n", - "2024-03-15 NVDA 13432.5 \n", - "2024-03-18 NVDA 13260.0 \n", - "2024-03-19 NVDA 13402.5 \n", - "2024-03-20 NVDA 13542.5 \n", - "2024-03-21 NVDA 13565.0 \n", - "2024-03-22 NVDA 13377.5 \n", - "2024-03-25 NVDA 13602.5 \n", - "2024-03-26 NVDA 13502.5 \n", - "2024-03-27 NVDA 13450.0 \n", - "2024-03-28 NVDA 13595.0 \n", - "2024-03-29 NVDA 13595.0 \n", - "2024-04-01 NVDA 13662.5 \n", - "2024-04-02 NVDA 13765.0 \n", - "2024-04-03 NVDA 13607.5 \n", - "2024-04-04 NVDA 13625.0 \n", - "2024-04-05 NVDA 13600.0 \n", - "2024-04-08 NVDA 13607.5 \n", - "2024-04-09 NVDA 13500.0 \n", - "2024-04-10 NVDA 13632.5 \n", - "2024-04-11 NVDA 13700.0 \n", - "2024-04-12 NVDA 13642.5 \n", - "2024-04-15 NVDA 13657.5 \n", - "2024-04-16 NVDA 13627.5 \n", - "2024-04-17 NVDA 13637.5 \n", - "2024-04-18 NVDA 13690.0 \n", - "2024-04-19 NVDA 13285.0 \n", - "2024-04-22 NVDA 13687.5 \n", - "2024-04-23 NVDA 13580.0 \n", - "2024-04-24 NVDA 13532.5 \n", - "2024-04-25 NVDA 13620.0 \n", - "2024-04-26 NVDA 13647.5 \n", - "2024-04-29 NVDA 13745.0 \n", - "2024-04-30 NVDA 13795.0 \n", - "2024-05-01 NVDA 13757.5 \n", - "2024-05-02 NVDA 13717.5 \n", - "2024-05-03 NVDA 13912.5 \n", - "2024-05-06 NVDA 13855.0 \n", - "2024-05-07 NVDA 13807.5 \n", - "2024-05-08 NVDA 13787.5 \n", - "2024-05-09 NVDA 13867.5 \n", - "2024-05-10 NVDA 13885.0 \n", - "2024-05-13 NVDA 13872.5 \n", - "2024-05-14 NVDA 13875.0 \n", - "2024-05-15 NVDA 13932.5 \n", - "2024-05-16 NVDA 13917.5 \n", - "2024-05-17 NVDA 13882.5 \n", - "2024-05-20 NVDA 13827.5 \n", - "2024-05-21 NVDA 13925.0 \n", - "2024-05-22 NVDA 14115.0 \n", - "2024-05-23 NVDA 13952.5 \n", - "2024-05-24 NVDA 13880.0 \n", - "2024-05-27 NVDA 13977.5 \n", - "2024-05-28 NVDA 13977.5 \n", - "2024-05-29 NVDA 14105.0 \n", - "2024-05-30 NVDA 13935.0 \n", - "2024-05-31 NVDA 13932.5 \n", - "2024-06-03 NVDA 13967.5 \n", - "2024-06-04 NVDA 13965.0 \n", - "2024-06-05 NVDA 13985.0 \n", - "2024-06-06 NVDA 13925.0 \n", - "2024-06-07 NVDA 13967.5 \n", - "2024-06-10 NVDA 13967.5 \n", - "2024-06-11 NVDA 13967.5 \n", - "2024-06-12 NVDA 13967.5 \n", - "2024-06-13 NVDA 13967.5 \n", - "2024-06-14 NVDA 13967.5 \n", - "2024-06-17 NVDA 13967.5 \n", - "2024-06-18 NVDA 13967.5 \n", - "2024-06-19 NVDA 13967.5 \n", - "2024-06-20 NVDA 13967.5 \n", - "2024-06-21 NVDA 13967.5 \n", - "2024-06-24 NVDA 13967.5 \n", - "2024-06-25 NVDA 13967.5 \n", - "2024-06-26 NVDA 13967.5 \n", - "2024-06-27 NVDA 13967.5 \n", - "2024-06-28 NVDA 13967.5 " - ] - }, - "execution_count": 41, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.portfolio.get_all_positions()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "AMZN20240621C120\n", - "AMZN20240621C170\n", - "BA20240621C220\n", - "BA20240621C310\n" - ] - } - ], - "source": [ - "import re\n", - "input_string = \"&L:AMZN20240621C120&S:AMZN20240621C170\"\n", - "\n", - "# Regular expression to match the desired patterns\n", - "pattern = r'&[LS]:(\\w+)'\n", - "\n", - "# Find all matches\n", - "matches = re.findall(pattern, input_string)\n", - "\n", - "# Output the results\n", - "for match in matches:\n", - " print(match)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "set()" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from pandas.tseries.holiday import USFederalHolidayCalendar\n", - "HOLIDAY_SET = set(USFederalHolidayCalendar().holidays(start='2022-08-16', end='2022-08-16').strftime('%Y-%m-%d'))\n", - "HOLIDAY_SET" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'result': 'TOO_ILLIQUID', 'data': None}\n" - ] - } - ], - "source": [ - "order_result = evb_backtest.risk_manager.OrderPicker.get_order('MSFT', '2023-09-05', 'C', 5.0, {'type': 'naked',\n", - " 'specifics': [{'direction': 'long',\n", - " 'rel_strike': .900,\n", - " 'dte': 365,\n", - " 'moneyness_width': 0.02},\n", - " {'direction': 'short',\n", - " 'rel_strike': .80,\n", - " 'dte': 365,\n", - " 'moneyness_width': 0.02}],\n", - "\n", - " 'name': 'vertical_spread'})\n", - "\n", - "print(order_result)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " 179946728 function calls (179230715 primitive calls) in 771.171 seconds\n", - "\n", - " Ordered by: cumulative time\n", - " List reduced from 2996 to 30 due to restriction <30>\n", - "\n", - " ncalls tottime percall cumtime percall filename:lineno(function)\n", - " 2 0.000 0.000 771.173 385.587 c:\\Users\\Zino\\python-playground\\QuantTools\\.venv\\lib\\site-packages\\IPython\\core\\interactiveshell.py:3517(run_code)\n", - " 2 0.000 0.000 771.173 385.587 {built-in method builtins.exec}\n", - " 1 0.000 0.000 771.173 771.173 C:\\Users\\Zino\\AppData\\Local\\Temp\\ipykernel_28000\\3226836942.py:1()\n", - " 1 0.028 0.028 771.173 771.173 C:\\Users\\Zino\\python-playground\\QuantTools\\EventDriven\\backtest.py:37(run)\n", - " 79 0.000 0.000 629.085 7.963 C:\\Users\\Zino\\python-playground\\QuantTools\\EventDriven\\portfolio.py:378(update_signal)\n", - " 79 0.003 0.000 629.083 7.963 C:\\Users\\Zino\\python-playground\\QuantTools\\EventDriven\\portfolio.py:267(generate_order)\n", - " 45 0.002 0.000 621.001 13.800 C:\\Users\\Zino\\python-playground\\QuantTools\\EventDriven\\portfolio.py:296(create_order)\n", - " 90/45 0.006 0.000 620.970 13.799 C:\\Users\\Zino\\python-playground\\QuantTools\\trade\\helpers\\decorators.py:37(wrapper)\n", - " 45 0.011 0.000 620.926 13.798 C:\\Users\\Zino\\python-playground\\QuantTools\\EventDriven\\riskmanager.py:463(get_order)\n", - " 20753 464.060 0.022 464.060 0.022 {method 'acquire' of '_thread.lock' objects}\n", - " 5026 0.038 0.000 463.357 0.092 C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\\lib\\threading.py:288(wait)\n", - " 3736 0.034 0.000 460.912 0.123 C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\\lib\\concurrent\\futures\\_base.py:430(result)\n", - " 45 0.019 0.000 387.365 8.608 C:\\Users\\Zino\\python-playground\\QuantTools\\EventDriven\\riskmanager.py:72(populate_cache)\n", - " 176 0.007 0.000 386.928 2.198 C:\\Users\\Zino\\python-playground\\QuantTools\\trade\\helpers\\threads.py:4(runThreads)\n", - " 2892 0.016 0.000 384.527 0.133 C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\\lib\\concurrent\\futures\\_base.py:614(result_iterator)\n", - " 2716 0.006 0.000 384.509 0.142 C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\\lib\\concurrent\\futures\\_base.py:316(_result_or_cancel)\n", - " 45 0.005 0.000 232.584 5.169 C:\\Users\\Zino\\python-playground\\QuantTools\\EventDriven\\riskmanager.py:350(produce_order_candidates)\n", - " 90 0.016 0.000 232.579 2.584 C:\\Users\\Zino\\python-playground\\QuantTools\\EventDriven\\riskmanager.py:217(chain_details)\n", - " 140 0.003 0.000 161.314 1.152 c:\\Users\\Zino\\python-playground\\QuantTools\\.venv\\lib\\site-packages\\requests\\sessions.py:500(request)\n", - " 140 0.004 0.000 161.147 1.151 c:\\Users\\Zino\\python-playground\\QuantTools\\.venv\\lib\\site-packages\\requests\\sessions.py:673(send)\n", - " 82 0.002 0.000 159.095 1.940 C:\\Users\\Zino\\python-playground\\FinanceDatabase\\FinanceDatabase\\dbase\\DataAPI\\ThetaData.py:34(request_from_proxy)\n", - " 82 0.001 0.000 159.091 1.940 c:\\Users\\Zino\\python-playground\\QuantTools\\.venv\\lib\\site-packages\\requests\\api.py:14(request)\n", - " 1359 0.008 0.000 157.182 0.116 C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\\lib\\socket.py:691(readinto)\n", - " 1185 155.145 0.131 155.145 0.131 {method 'recv_into' of '_socket.socket' objects}\n", - " 140 0.003 0.000 151.908 1.085 c:\\Users\\Zino\\python-playground\\QuantTools\\.venv\\lib\\site-packages\\requests\\adapters.py:613(send)\n", - " 140 0.003 0.000 151.846 1.085 c:\\Users\\Zino\\python-playground\\QuantTools\\.venv\\lib\\site-packages\\urllib3\\connectionpool.py:594(urlopen)\n", - " 140 0.004 0.000 151.816 1.084 c:\\Users\\Zino\\python-playground\\QuantTools\\.venv\\lib\\site-packages\\urllib3\\connectionpool.py:379(_make_request)\n", - " 140 0.007 0.000 148.221 1.059 c:\\Users\\Zino\\python-playground\\QuantTools\\.venv\\lib\\site-packages\\urllib3\\connection.py:481(getresponse)\n", - " 140 0.002 0.000 148.182 1.058 C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\\lib\\http\\client.py:1331(getresponse)\n", - " 140 0.004 0.000 148.170 1.058 C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\\lib\\http\\client.py:311(begin)\n", - "\n", - "\n", - "\n" - ] - } - ], - "source": [ - "stats.print_stats(30)\n", - "print(stream.getvalue())\n", - "with open('bactest_data.txt', 'w') as f:\n", - " stream.seek(0)\n", - " f.write(stream.read())\n", - " f.flush()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "ename": "AttributeError", - "evalue": "'OptionSignalPortfolio' object has no attribute '_trades'", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[1;32mIn[31], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m \u001b[43mevb_backtest\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mportfolio\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mplot_portfolio\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[1;32m~\\python-playground\\QuantTools\\EventDriven\\portfolio.py:666\u001b[0m, in \u001b[0;36mOptionSignalPortfolio.plot_portfolio\u001b[1;34m(self, benchmark, plot_bnchmk, return_plot, start_plot, **kwargs)\u001b[0m\n\u001b[0;32m 664\u001b[0m eq \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_equity\n\u001b[0;32m 665\u001b[0m dd \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdd(\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[1;32m--> 666\u001b[0m tr \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_trades\u001b[49m\u001b[38;5;241m.\u001b[39mcopy()\n\u001b[0;32m 667\u001b[0m tr[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mSize\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m tr[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mQuantity\u001b[39m\u001b[38;5;124m'\u001b[39m]\n\u001b[0;32m 669\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m plot_portfolio(tr, eq, dd, _bnch,plot_bnchmk\u001b[38;5;241m=\u001b[39mplot_bnchmk, return_plot\u001b[38;5;241m=\u001b[39mreturn_plot, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n", - "\u001b[1;31mAttributeError\u001b[0m: 'OptionSignalPortfolio' object has no attribute '_trades'" - ] - } - ], - "source": [ - "evb_backtest.portfolio.plot_portfolio()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
TickerPnLReturnPctEntryPriceEntryCommissionEntrySlippageEntryMarketValueTotalEntryCostAuxilaryEntryCostExitPriceExitCommissionExitSlippageExitMarketValueTotalExitCostAuxilaryExitCostQuantityEntryTimeExitTimeDurationPositions
0TSLA-10806.520059-21.677784498.5066876.41716.73681011459.23681011488.807620-29.570810390.4414876.41716.5711968986.5711969003.142393-16.571196232023-07-052023-08-0228&L:TSLA20240621C330&S:TSLA20240621C346.67
1AAPL3656.9851317.479087488.9614563.627-10.6280666352.8719346349.4978673.374066525.5313083.627-2.4659996835.5340016833.0680012.465999132023-07-052023-08-0430&L:AAPL20240621C230&S:AAPL20240621C280
2MSFT-10309.332567-21.247498485.2021873.906-1.0753796788.9246216795.661241-6.736621382.1088623.906-1.5699395353.4300615351.8601221.569939142023-07-052023-08-0935&L:MSFT20240621C355&S:MSFT20240621C365
3AMZN-5391.261254-10.873383495.8218650.8371.6285941486.6285941489.931189-3.302594441.9092520.837-0.9352431326.5647571325.6295130.93524332023-07-052023-10-25112&L:AMZN20240621C145&S:AMZN20240621C160
\n", - "
" - ], - "text/plain": [ - " Ticker PnL ReturnPct EntryPrice EntryCommission EntrySlippage \\\n", - "0 TSLA -10806.520059 -21.677784 498.506687 6.417 16.736810 \n", - "1 AAPL 3656.985131 7.479087 488.961456 3.627 -10.628066 \n", - "2 MSFT -10309.332567 -21.247498 485.202187 3.906 -1.075379 \n", - "3 AMZN -5391.261254 -10.873383 495.821865 0.837 1.628594 \n", - "\n", - " EntryMarketValue TotalEntryCost AuxilaryEntryCost ExitPrice \\\n", - "0 11459.236810 11488.807620 -29.570810 390.441487 \n", - "1 6352.871934 6349.497867 3.374066 525.531308 \n", - "2 6788.924621 6795.661241 -6.736621 382.108862 \n", - "3 1486.628594 1489.931189 -3.302594 441.909252 \n", - "\n", - " ExitCommission ExitSlippage ExitMarketValue TotalExitCost \\\n", - "0 6.417 16.571196 8986.571196 9003.142393 \n", - "1 3.627 -2.465999 6835.534001 6833.068001 \n", - "2 3.906 -1.569939 5353.430061 5351.860122 \n", - "3 0.837 -0.935243 1326.564757 1325.629513 \n", - "\n", - " AuxilaryExitCost Quantity EntryTime ExitTime Duration \\\n", - "0 -16.571196 23 2023-07-05 2023-08-02 28 \n", - "1 2.465999 13 2023-07-05 2023-08-04 30 \n", - "2 1.569939 14 2023-07-05 2023-08-09 35 \n", - "3 0.935243 3 2023-07-05 2023-10-25 112 \n", - "\n", - " Positions \n", - "0 &L:TSLA20240621C330&S:TSLA20240621C346.67 \n", - "1 &L:AAPL20240621C230&S:AAPL20240621C280 \n", - "2 &L:MSFT20240621C355&S:MSFT20240621C365 \n", - "3 &L:AMZN20240621C145&S:AMZN20240621C160 " - ] - }, - "execution_count": 74, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "trades_df = evb_backtest.portfolio.get_trades().head(5)\n", - "trades_df" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "evb_backtest.portfolio.get_weighted_holdings()s" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
longshorttrade_idclosequantitymarket_value
datetimesymbol
2023-07-05TSLA[TSLA20240621C330][TSLA20240621C346.67]&L:TSLA20240621C330&S:TSLA20240621C346.673.9002311442.5
AAPL[AAPL20240621C230][AAPL20240621C280]&L:AAPL20240621C230&S:AAPL20240621C2805.260136363.5
MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825146790.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531485.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188775.0
2023-07-06TSLA[TSLA20240621C330][TSLA20240621C346.67]&L:TSLA20240621C330&S:TSLA20240621C346.673.9002310637.5
AAPL[AAPL20240621C230][AAPL20240621C280]&L:AAPL20240621C230&S:AAPL20240621C2805.260136805.5
MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825146545.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531380.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188190.0
2023-07-07TSLA[TSLA20240621C330][TSLA20240621C346.67]&L:TSLA20240621C330&S:TSLA20240621C346.673.9002310235.0
AAPL[AAPL20240621C230][AAPL20240621C280]&L:AAPL20240621C230&S:AAPL20240621C2805.260136474.0
MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825146335.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531485.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188145.0
2023-07-10TSLA[TSLA20240621C330][TSLA20240621C346.67]&L:TSLA20240621C330&S:TSLA20240621C346.673.9002310235.0
AAPL[AAPL20240621C230][AAPL20240621C280]&L:AAPL20240621C230&S:AAPL20240621C2805.260135759.0
MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825145950.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531350.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187560.0
2023-07-11TSLA[TSLA20240621C330][TSLA20240621C346.67]&L:TSLA20240621C330&S:TSLA20240621C346.673.900239832.5
AAPL[AAPL20240621C230][AAPL20240621C280]&L:AAPL20240621C230&S:AAPL20240621C2805.260135622.5
MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825145950.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531410.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188055.0
2023-07-12TSLA[TSLA20240621C330][TSLA20240621C346.67]&L:TSLA20240621C330&S:TSLA20240621C346.673.9002310120.0
AAPL[AAPL20240621C230][AAPL20240621C280]&L:AAPL20240621C230&S:AAPL20240621C2805.260135921.5
MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825146370.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531500.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188190.0
2023-07-13TSLA[TSLA20240621C330][TSLA20240621C346.67]&L:TSLA20240621C330&S:TSLA20240621C346.673.9002310867.5
AAPL[AAPL20240621C230][AAPL20240621C280]&L:AAPL20240621C230&S:AAPL20240621C2805.260136058.0
MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825146160.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531635.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187335.0
2023-07-14TSLA[TSLA20240621C330][TSLA20240621C346.67]&L:TSLA20240621C330&S:TSLA20240621C346.673.9002310982.5
AAPL[AAPL20240621C230][AAPL20240621C280]&L:AAPL20240621C230&S:AAPL20240621C2805.260136077.5
MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825145880.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531642.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200189810.0
2023-07-17TSLA[TSLA20240621C330][TSLA20240621C346.67]&L:TSLA20240621C330&S:TSLA20240621C346.673.9002312420.0
AAPL[AAPL20240621C230][AAPL20240621C280]&L:AAPL20240621C230&S:AAPL20240621C2805.260137026.5
MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825146090.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531567.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187380.0
2023-07-18TSLA[TSLA20240621C330][TSLA20240621C346.67]&L:TSLA20240621C330&S:TSLA20240621C346.673.9002311960.0
AAPL[AAPL20240621C230][AAPL20240621C280]&L:AAPL20240621C230&S:AAPL20240621C2805.260136896.5
MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825147525.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531567.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188550.0
2023-07-19TSLA[TSLA20240621C330][TSLA20240621C346.67]&L:TSLA20240621C330&S:TSLA20240621C346.673.9002313800.0
AAPL[AAPL20240621C230][AAPL20240621C280]&L:AAPL20240621C230&S:AAPL20240621C2805.260137527.0
MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825147420.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531665.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188325.0
2023-07-20TSLA[TSLA20240621C330][TSLA20240621C346.67]&L:TSLA20240621C330&S:TSLA20240621C346.673.900239430.0
AAPL[AAPL20240621C230][AAPL20240621C280]&L:AAPL20240621C230&S:AAPL20240621C2805.260137059.0
MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825146615.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531425.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188370.0
2023-07-21TSLA[TSLA20240621C330][TSLA20240621C346.67]&L:TSLA20240621C330&S:TSLA20240621C346.673.900238912.5
AAPL[AAPL20240621C230][AAPL20240621C280]&L:AAPL20240621C230&S:AAPL20240621C2805.260136597.5
MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825147140.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531417.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187875.0
2023-07-24TSLA[TSLA20240621C330][TSLA20240621C346.67]&L:TSLA20240621C330&S:TSLA20240621C346.673.900239142.5
AAPL[AAPL20240621C230][AAPL20240621C280]&L:AAPL20240621C230&S:AAPL20240621C2805.260136773.0
MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825146965.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531365.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200189360.0
2023-07-25TSLA[TSLA20240621C330][TSLA20240621C346.67]&L:TSLA20240621C330&S:TSLA20240621C346.673.900239430.0
AAPL[AAPL20240621C230][AAPL20240621C280]&L:AAPL20240621C230&S:AAPL20240621C2805.260137033.0
MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825147245.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531357.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188820.0
2023-07-26TSLA[TSLA20240621C330][TSLA20240621C346.67]&L:TSLA20240621C330&S:TSLA20240621C346.673.900238567.5
AAPL[AAPL20240621C230][AAPL20240621C280]&L:AAPL20240621C230&S:AAPL20240621C2805.260137254.0
MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825146090.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531327.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200185400.0
2023-07-27TSLA[TSLA20240621C330][TSLA20240621C346.67]&L:TSLA20240621C330&S:TSLA20240621C346.673.900238452.5
AAPL[AAPL20240621C230][AAPL20240621C280]&L:AAPL20240621C230&S:AAPL20240621C2805.260137104.5
MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825145600.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531335.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188145.0
2023-07-28TSLA[TSLA20240621C330][TSLA20240621C346.67]&L:TSLA20240621C330&S:TSLA20240621C346.673.900239602.5
AAPL[AAPL20240621C230][AAPL20240621C280]&L:AAPL20240621C230&S:AAPL20240621C2805.260137780.5
MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825145600.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531455.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200189135.0
2023-07-31TSLA[TSLA20240621C330][TSLA20240621C346.67]&L:TSLA20240621C330&S:TSLA20240621C346.673.900239372.5
AAPL[AAPL20240621C230][AAPL20240621C280]&L:AAPL20240621C230&S:AAPL20240621C2805.260138216.0
MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825145950.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531560.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001812465.0
2023-08-01TSLA[TSLA20240621C330][TSLA20240621C346.67]&L:TSLA20240621C330&S:TSLA20240621C346.673.900238970.0
AAPL[AAPL20240621C230][AAPL20240621C280]&L:AAPL20240621C230&S:AAPL20240621C2805.260137871.5
MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825145915.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531485.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200189225.0
2023-08-02AAPL[AAPL20240621C230][AAPL20240621C280]&L:AAPL20240621C230&S:AAPL20240621C2805.260137176.0
MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825145425.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531335.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001811565.0
2023-08-03AAPL[AAPL20240621C230][AAPL20240621C280]&L:AAPL20240621C230&S:AAPL20240621C2805.260136838.0
MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825145320.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531365.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200189900.0
2023-08-04MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825145425.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531807.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200184815.0
2023-08-07MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825145040.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531912.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188550.0
2023-08-08MSFT[MSFT20240621C355][MSFT20240621C365]&L:MSFT20240621C355&S:MSFT20240621C3653.825145355.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531822.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188640.0
2023-08-09AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531725.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200189000.0
2023-08-10AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531762.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200186975.0
BA[BA20240621C250][BA20240621C260]&L:BA20240621C250&S:BA20240621C2603.77531327.5
WMT[WMT20240621C165][WMT20240621C175]&L:WMT20240621C165&S:WMT20240621C1754.55000.0
2023-08-11AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531762.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187110.0
BA[BA20240621C250][BA20240621C260]&L:BA20240621C250&S:BA20240621C2603.77531290.0
WMT[WMT20240621C165][WMT20240621C175]&L:WMT20240621C165&S:WMT20240621C1754.55000.0
2023-08-14AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531860.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187830.0
BA[BA20240621C250][BA20240621C260]&L:BA20240621C250&S:BA20240621C2603.77531327.5
WMT[WMT20240621C165][WMT20240621C175]&L:WMT20240621C165&S:WMT20240621C1754.55000.0
2023-08-15AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531807.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188100.0
BA[BA20240621C250][BA20240621C260]&L:BA20240621C250&S:BA20240621C2603.77531222.5
WMT[WMT20240621C165][WMT20240621C175]&L:WMT20240621C165&S:WMT20240621C1754.55000.0
2023-08-16AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531620.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187470.0
BA[BA20240621C250][BA20240621C260]&L:BA20240621C250&S:BA20240621C2603.77531132.5
WMT[WMT20240621C165][WMT20240621C175]&L:WMT20240621C165&S:WMT20240621C1754.55000.0
2023-08-17TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.850209450.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531560.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187605.0
2023-08-18TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.850209050.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531545.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187740.0
2023-08-21TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502011250.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531605.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188010.0
2023-08-22TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502011500.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531590.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188145.0
2023-08-23TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502011900.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531635.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188685.0
2023-08-24TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502011150.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531485.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188595.0
2023-08-25TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502012050.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531530.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188595.0
2023-08-28TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502012250.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531537.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188955.0
2023-08-29TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502014150.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531605.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200189405.0
2023-08-30TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502014100.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531597.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200189045.0
2023-08-31TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502014200.0
AAPL[AAPL20240920C210][AAPL20240920C225]&L:AAPL20240920C210&S:AAPL20240920C2254.475147000.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531740.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001810440.0
2023-09-01TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502012700.0
AAPL[AAPL20240920C210][AAPL20240920C225]&L:AAPL20240920C210&S:AAPL20240920C2254.475147315.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531740.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200189135.0
2023-09-04TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502013900.0
AAPL[AAPL20240920C210][AAPL20240920C225]&L:AAPL20240920C210&S:AAPL20240920C2254.475147280.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531702.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001810395.0
2023-09-05TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502013900.0
AAPL[AAPL20240920C210][AAPL20240920C225]&L:AAPL20240920C210&S:AAPL20240920C2254.475147280.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531702.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001810395.0
2023-09-06TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502013500.0
AAPL[AAPL20240920C210][AAPL20240920C225]&L:AAPL20240920C210&S:AAPL20240920C2254.475146265.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531612.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200189225.0
2023-09-07TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502013400.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531725.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188910.0
2023-09-08TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502013100.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531747.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188685.0
2023-09-11TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502015800.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531965.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188415.0
2023-09-12TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502015100.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531882.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188145.0
2023-09-13TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502015500.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42532055.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188550.0
WMT[WMT20240621C170][WMT20240621C180]&L:WMT20240621C170&S:WMT20240621C1804.10000.0
2023-09-14TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502016200.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42532025.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188460.0
WMT[WMT20240621C170][WMT20240621C180]&L:WMT20240621C170&S:WMT20240621C1804.10000.0
2023-09-15TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502016000.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531830.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188100.0
WMT[WMT20240621C170][WMT20240621C180]&L:WMT20240621C170&S:WMT20240621C1804.10000.0
INTC[INTC20240621C37][INTC20240621C55]&L:INTC20240621C37&S:INTC20240621C554.12500.0
2023-09-18TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502014950.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531680.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187155.0
WMT[WMT20240621C170][WMT20240621C180]&L:WMT20240621C170&S:WMT20240621C1804.10000.0
INTC[INTC20240621C37][INTC20240621C55]&L:INTC20240621C37&S:INTC20240621C554.12500.0
2023-09-19TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502015000.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531597.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188055.0
WMT[WMT20240621C170][WMT20240621C180]&L:WMT20240621C170&S:WMT20240621C1804.10000.0
INTC[INTC20240621C37][INTC20240621C55]&L:INTC20240621C37&S:INTC20240621C554.12500.0
2023-09-20TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502014600.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531590.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187740.0
WMT[WMT20240621C170][WMT20240621C180]&L:WMT20240621C170&S:WMT20240621C1804.10000.0
2023-09-21TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502014200.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531327.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187020.0
WMT[WMT20240621C170][WMT20240621C180]&L:WMT20240621C170&S:WMT20240621C1804.10000.0
2023-09-22TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502012750.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531312.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187245.0
WMT[WMT20240621C170][WMT20240621C180]&L:WMT20240621C170&S:WMT20240621C1804.10000.0
2023-09-25TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502014200.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531417.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187605.0
WMT[WMT20240621C170][WMT20240621C180]&L:WMT20240621C170&S:WMT20240621C1804.10000.0
2023-09-26TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502012700.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531200.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187110.0
WMT[WMT20240621C170][WMT20240621C180]&L:WMT20240621C170&S:WMT20240621C1804.10000.0
2023-09-27TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502012250.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531192.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187425.0
WMT[WMT20240621C170][WMT20240621C180]&L:WMT20240621C170&S:WMT20240621C1804.10000.0
2023-09-28TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502012900.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531177.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187650.0
WMT[WMT20240621C170][WMT20240621C180]&L:WMT20240621C170&S:WMT20240621C1804.10000.0
2023-09-29TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502013550.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531230.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187785.0
2023-10-02TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502013450.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531335.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188235.0
2023-10-03TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502012900.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531155.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187830.0
2023-10-04TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502019150.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531230.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188010.0
2023-10-05TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502014550.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531192.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188280.0
2023-10-06TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502014500.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531275.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188775.0
2023-10-09TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502014500.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531290.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188460.0
2023-10-10TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502015000.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531335.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188730.0
2023-10-11TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502014950.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531440.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200189225.0
2023-10-12TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502014450.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531462.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200189225.0
2023-10-13TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502013650.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531372.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188820.0
2023-10-16TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502014000.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531470.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188955.0
2023-10-17TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502014100.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531447.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188010.0
2023-10-18TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.8502012650.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531155.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187380.0
2023-10-19TSLA[TSLA20240920C280][TSLA20240920C300]&L:TSLA20240920C280&S:TSLA20240920C3004.850209700.0
AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531305.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187380.0
2023-10-20AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531162.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200186975.0
2023-10-23AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531215.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187785.0
2023-10-24AMZN[AMZN20240621C145][AMZN20240621C160]&L:AMZN20240621C145&S:AMZN20240621C1604.42531327.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188145.0
2023-10-25NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200189855.0
2023-10-26NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200186615.0
2023-10-27NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200186570.0
2023-10-30NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187020.0
2023-10-31NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200186795.0
2023-11-01NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187830.0
2023-11-02NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200187875.0
2023-11-03NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188640.0
2023-11-06NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200189540.0
2023-11-07NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200189045.0
2023-11-08NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200189270.0
2023-11-09NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200189720.0
2023-11-10NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001810125.0
2023-11-13NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001810575.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041570.0
2023-11-14MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300125460.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001811205.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041730.0
2023-11-15MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300125580.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001811025.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041770.0
SBUX[SBUX20250117C110][SBUX20250117C120]&L:SBUX20250117C110&S:SBUX20250117C1203.275125100.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40041970.0
2023-11-16MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300124830.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001811160.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041630.0
SBUX[SBUX20250117C110][SBUX20250117C120]&L:SBUX20250117C110&S:SBUX20250117C1203.275125130.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042020.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001462.5
2023-11-17MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300125850.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200188955.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041790.0
SBUX[SBUX20250117C110][SBUX20250117C120]&L:SBUX20250117C110&S:SBUX20250117C1203.275125010.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042060.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001480.0
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531462.5
2023-11-20MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300126540.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200189990.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041780.0
SBUX[SBUX20250117C110][SBUX20250117C120]&L:SBUX20250117C110&S:SBUX20250117C1203.275124680.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042100.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001500.0
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531515.0
2023-11-21MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300126870.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001812285.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041680.0
SBUX[SBUX20250117C110][SBUX20250117C120]&L:SBUX20250117C110&S:SBUX20250117C1203.275124500.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40041990.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001480.0
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531470.0
2023-11-22AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525136337.5
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300124890.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001810350.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041690.0
SBUX[SBUX20250117C110][SBUX20250117C120]&L:SBUX20250117C110&S:SBUX20250117C1203.275124500.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042100.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001470.0
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531515.0
2023-11-23AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525136110.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300126180.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001810125.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041780.0
SBUX[SBUX20250117C110][SBUX20250117C120]&L:SBUX20250117C110&S:SBUX20250117C1203.275124380.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042130.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001462.5
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531582.5
2023-11-24AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525136110.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300126180.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001810125.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041780.0
SBUX[SBUX20250117C110][SBUX20250117C120]&L:SBUX20250117C110&S:SBUX20250117C1203.275124380.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042130.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001462.5
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531582.5
2023-11-27AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525136142.5
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300125910.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001811250.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041820.0
SBUX[SBUX20250117C110][SBUX20250117C120]&L:SBUX20250117C110&S:SBUX20250117C1203.275124320.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042160.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001482.5
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531530.0
2023-11-28AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525136175.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300125700.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001810395.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041770.0
SBUX[SBUX20250117C110][SBUX20250117C120]&L:SBUX20250117C110&S:SBUX20250117C1203.275123930.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042120.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001445.0
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531318.5
2023-11-29AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525135980.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300125910.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001810305.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041730.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042200.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001472.5
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531299.0
2023-11-30AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525136045.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300124380.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001810170.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041820.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042080.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001505.0
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531312.5
2023-12-01AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525136240.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300124680.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001810350.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041850.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042060.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001452.5
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531275.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09593573.0
2023-12-04AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525135980.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300123720.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200189225.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72541940.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531275.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041830.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40041950.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001415.0
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531230.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09593514.5
2023-12-05AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525136630.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300125280.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200189855.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72541370.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531312.5
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041650.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40041940.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001405.0
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531150.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09593402.0
2023-12-06AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525136435.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300125370.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200189990.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72541700.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531297.5
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041890.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40041850.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001397.5
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531186.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09593343.5
2023-12-07AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525136695.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300124110.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200189765.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72541890.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.4753892.5
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041960.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042280.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001402.5
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531249.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09593420.0
2023-12-08AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525137052.5
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300124800.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001810485.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72541910.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531455.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042020.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042420.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001425.0
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531302.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09593573.0
2023-12-11AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525136500.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127410.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.200189225.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72541920.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531515.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042060.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042650.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001480.0
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531249.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09593505.5
2023-12-12AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525136760.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300125040.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001811070.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72541990.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531477.5
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041870.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043000.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001507.5
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531168.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09593411.0
2023-12-13AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525137215.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300125010.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001810665.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542200.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531560.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042310.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042830.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001525.0
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531275.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594072.5
2023-12-14AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525137280.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300124920.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001810575.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542230.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531620.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042400.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042820.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001562.5
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531357.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595112.0
2023-12-15AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525136695.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300123930.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001811835.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542620.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531650.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042070.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042900.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001547.5
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531329.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594914.0
2023-12-18AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525136857.5
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300123870.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001811565.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542330.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531687.5
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042210.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042890.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001540.0
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531308.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594833.0
2023-12-19AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525136987.5
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300124800.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001811025.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542320.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531710.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042300.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042940.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001567.5
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531353.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594882.5
2023-12-20AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525136630.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300123690.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001811520.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542340.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531732.5
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042180.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042730.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001472.5
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531177.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594581.0
2023-12-21AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525136565.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300125430.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001810980.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542400.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531312.5
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042570.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042980.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001615.0
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531207.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594711.5
2023-12-22AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525135297.5
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300124620.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001810170.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542260.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531687.5
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042330.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042940.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001630.0
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531137.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594806.0
2023-12-25AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525136272.5
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300125400.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001811205.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542240.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531672.5
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042270.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043120.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001647.5
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531131.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595071.5
2023-12-26AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525136272.5
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300125400.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001811205.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542240.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531672.5
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042270.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043120.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001647.5
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531131.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595071.5
2023-12-27AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525136240.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300124770.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001811610.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542400.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531710.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042310.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043180.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001640.0
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531080.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595040.0
2023-12-28AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525136337.5
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300124260.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001811520.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542290.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531777.5
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042400.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043330.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001625.0
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531075.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595058.0
2023-12-29AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525135232.5
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300124800.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001811610.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542620.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531657.5
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042300.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043330.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001612.5
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531066.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594909.5
2024-01-01AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525134842.5
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300125160.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001810845.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542050.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531627.5
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041950.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042870.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001600.0
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531095.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594959.0
2024-01-02AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525134842.5
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300125160.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001810845.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542050.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531627.5
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041950.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042870.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001600.0
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531095.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594959.0
2024-01-03AAPL[AAPL20241220C215][AAPL20241220C230]&L:AAPL20241220C215&S:AAPL20241220C2303.525134582.5
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300125370.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001810350.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72541940.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531402.5
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041810.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042620.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001557.5
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531173.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594864.5
2024-01-04MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300124650.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001810890.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72541950.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531335.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042100.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042690.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001565.0
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531089.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594990.5
2024-01-05MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300124560.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001811880.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542450.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531485.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042200.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042890.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001595.0
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531101.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595332.5
2024-01-08MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300125130.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001813050.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542180.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531207.5
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041730.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043250.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001607.5
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.31531107.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595098.5
2024-01-09MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300125160.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001812645.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542570.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531177.5
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042010.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40042950.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001575.0
DIS[DIS20240920C100][DIS20240920C115]&L:DIS20240920C100&S:DIS20240920C1153.3153994.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594873.5
2024-01-10MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300125910.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001813185.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542230.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531230.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042170.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043610.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001552.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594851.0
2024-01-11MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300125940.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001813500.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542210.0
BA[BA20250117C250][BA20250117C260]&L:BA20250117C250&S:BA20250117C2603.47531042.5
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042070.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043310.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001575.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594545.0
2024-01-12MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300126270.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001813365.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542410.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042050.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043190.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001552.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594333.5
2024-01-15MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300126390.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001814310.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542650.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041800.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043630.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001605.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09593960.0
2024-01-16MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300126390.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001814310.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542650.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80041800.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043630.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001605.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09593960.0
2024-01-17MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300125280.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001814625.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542420.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042070.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043790.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001605.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09593798.0
2024-01-18MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300126510.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001815030.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542460.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042360.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043800.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001600.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09593739.5
2024-01-19MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127170.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001815120.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542360.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042070.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044040.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001615.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09593987.0
2024-01-22MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300126780.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001815210.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542560.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042460.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044030.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001712.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594149.0
2024-01-23MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300126120.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001815840.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542480.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042720.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043860.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001652.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594293.0
2024-01-24MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128790.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001815255.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72541730.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042750.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043960.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001662.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594351.5
2024-01-25MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127980.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001816020.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542100.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042700.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044500.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001667.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594603.5
2024-01-26MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128430.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001815390.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542250.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042710.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044320.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001660.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594648.5
GOOG[GOOG20250117C160][GOOG20250117C170]&L:GOOG20250117C160&S:GOOG20250117C1704.20083960.0
2024-01-29MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300129540.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001815705.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542120.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042250.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044390.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001682.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594729.5
GOOG[GOOG20250117C160][GOOG20250117C170]&L:GOOG20250117C160&S:GOOG20250117C1704.20084580.0
2024-01-30MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300129570.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001815750.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542340.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042270.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044280.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001587.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595323.5
GOOG[GOOG20250117C160][GOOG20250117C170]&L:GOOG20250117C160&S:GOOG20250117C1704.20083360.0
2024-01-31MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300126930.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001815525.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542150.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042930.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044000.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001615.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594666.5
2024-02-01MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127290.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001815390.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542460.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042300.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044170.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001572.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594765.5
2024-02-02MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128130.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001816740.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542500.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042240.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044330.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001637.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594738.5
2024-02-05MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127530.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817055.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542320.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042480.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044440.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001647.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594437.0
2024-02-06MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128640.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001815795.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542390.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042170.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044100.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001595.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594441.5
2024-02-07MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128670.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001816695.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542490.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042400.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044200.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001607.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.8502985.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594522.5
2024-02-08MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128430.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531492.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001816200.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542410.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042580.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044270.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001595.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021525.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594486.5
2024-02-09MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128310.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531702.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818045.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542490.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042350.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044490.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001562.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021417.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594446.0
2024-02-12MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128490.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531612.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001816650.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542560.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042570.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044310.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001615.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021452.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594702.5
2024-02-13MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127980.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531455.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001815975.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542360.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042570.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044230.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001542.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021525.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594270.5
2024-02-14MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127470.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531545.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001816290.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542360.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042750.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044310.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001537.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021585.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594477.5
2024-02-15MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127650.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531485.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817010.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542540.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042630.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044490.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001530.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021645.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595022.0
2024-02-16MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127110.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531500.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001816515.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542850.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042800.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044240.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001487.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021580.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595031.0
2024-02-19MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127350.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531372.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001815435.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542470.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042590.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043940.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001510.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021450.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594963.5
2024-02-20MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127350.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531372.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001815435.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542470.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042590.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043940.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001510.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021450.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594963.5
2024-02-21MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127260.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531432.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001816245.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542830.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042370.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043790.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001517.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021318.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594833.0
2024-02-22MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128130.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531710.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818945.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542990.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042570.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044530.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001605.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021315.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594738.5
2024-02-23MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128040.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531717.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001816650.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542720.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042290.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044300.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001610.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021318.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594914.0
2024-02-26MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127740.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531717.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001815615.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542550.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042640.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044270.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001662.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021408.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09594725.0
2024-02-27MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127680.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531642.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817640.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542740.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042520.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044790.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001710.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021421.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595098.5
2024-02-28MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127740.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531627.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817280.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542780.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042780.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044480.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001647.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021520.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595125.5
2024-02-29MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128310.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531747.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817685.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72543200.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042520.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044670.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001682.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021650.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595301.0
2024-03-01MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127200.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531875.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818225.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542940.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042960.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044680.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001700.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021565.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595260.5
2024-03-04MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128310.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531830.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817280.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542550.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042930.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044840.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001762.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021655.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595764.5
2024-03-05MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127230.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531657.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817775.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542810.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043070.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40045330.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001737.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021645.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595859.0
2024-03-06MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127110.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531627.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001816740.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542890.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042670.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40045010.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001725.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021440.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595841.0
2024-03-07MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127890.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531792.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001816830.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542840.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043110.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40045080.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001765.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021490.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595944.5
2024-03-08MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127500.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531717.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001819890.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542760.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042730.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40045000.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001780.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021400.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595958.0
2024-03-11MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127230.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531552.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001815345.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542540.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042930.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044720.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001682.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021600.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09596115.5
2024-03-12MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128430.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531702.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817010.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542720.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042560.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044760.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001767.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021620.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09596016.5
2024-03-13MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128370.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531770.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817730.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542930.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042750.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044770.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001715.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021605.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09596043.5
2024-03-14MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.3001210740.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531890.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818990.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542560.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042750.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044700.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001702.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021580.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595589.0
2024-03-15MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128490.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531672.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817370.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542830.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043010.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044460.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001700.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021630.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595553.0
2024-03-18MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128670.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531657.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817370.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542700.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042670.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044660.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001695.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021700.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09596192.0
2024-03-19MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300129000.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531725.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001813410.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542830.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043350.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044660.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001712.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021740.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09596214.5
2024-03-20MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300129750.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531852.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817550.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542880.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042930.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044550.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001800.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021900.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09596619.5
2024-03-21MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300129930.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531830.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817595.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72543020.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042970.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044160.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001917.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021845.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09596826.5
2024-03-22MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300129750.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531867.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001816425.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72543050.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043390.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044680.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001932.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021915.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09596790.5
2024-03-25MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300129060.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531920.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817550.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542940.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042970.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044550.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011025.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85022140.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09596646.5
2024-03-26MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128760.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531845.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001816785.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542750.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042900.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044700.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011040.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85022120.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09596786.0
2024-03-27MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128850.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531912.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817100.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72543210.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042950.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044420.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011050.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85022170.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597200.0
2024-03-28MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128340.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531927.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817100.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542940.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043250.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044980.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011042.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85022225.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597078.5
2024-03-29MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128340.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531927.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817100.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542940.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043250.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044980.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011042.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85022225.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597078.5
2024-04-01MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300129360.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531965.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817640.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542620.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043370.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044600.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011072.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85022195.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597056.0
2024-04-02MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128910.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531957.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817730.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542530.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
INTC[INTC20240920C42][INTC20240920C50]&L:INTC20240920C42&S:INTC20240920C502.76500.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043010.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044490.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011080.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85022190.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09596912.0
2024-04-03MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128370.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532032.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817595.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542470.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043050.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044570.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011152.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85022110.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597074.0
2024-04-04MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128550.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531920.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001816740.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542430.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043110.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044230.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011050.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021875.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09596282.0
2024-04-05MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300129360.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532197.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817595.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542480.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042820.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044250.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011065.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85022050.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09596759.0
2024-04-08MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300129240.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532212.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001816695.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542320.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043050.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044340.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011057.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021905.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09596961.5
2024-04-09MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300129510.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532235.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001819080.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542200.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043230.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044310.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011102.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021960.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597132.5
2024-04-10MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300129150.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532250.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818090.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542310.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042930.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044220.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011087.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021890.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09596520.5
2024-04-11MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300129720.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532422.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817505.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542200.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043280.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044250.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011127.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021860.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09596309.0
2024-04-12MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300129180.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532272.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818900.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542010.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043290.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044020.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011107.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021765.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595854.5
2024-04-15MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128130.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532130.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817730.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72541850.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043190.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043860.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011047.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021605.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09596057.0
2024-04-16MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128250.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532115.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818045.0
HD[HD20250117C340][HD20250117C350]&L:HD20250117C340&S:HD20250117C3505.72542290.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042930.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044090.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011202.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021595.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595319.0
2024-04-17MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128010.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532002.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817325.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043070.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043630.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011032.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021600.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595670.0
2024-04-18MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127290.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531897.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001816155.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042530.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043890.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001942.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021540.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09595971.5
2024-04-19MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300126570.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531657.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817595.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042630.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043280.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001957.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021565.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09596664.5
2024-04-22MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300126810.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531777.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001822185.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042850.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043390.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001930.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021530.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597105.5
2024-04-23MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127440.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531890.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818585.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042820.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043630.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011037.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021630.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597465.5
2024-04-24MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127590.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531702.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817820.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042730.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043660.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011012.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021645.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597443.0
2024-04-25MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300126840.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531590.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001815885.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042880.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043620.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001952.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021565.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597195.5
2024-04-26MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127170.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531905.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001819935.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042870.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044050.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011027.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021565.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597330.5
2024-04-29MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300126450.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531972.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817640.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042970.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044010.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011015.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021500.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597011.0
2024-04-30MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300125370.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531650.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001815930.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042950.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043900.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001982.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021375.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09596682.5
2024-05-01MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300125940.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531807.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001816785.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80042540.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043240.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001962.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021413.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09596228.0
2024-05-02MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300126240.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532152.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817910.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043180.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043250.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.1001987.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021550.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09596498.0
2024-05-03MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127080.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532190.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818720.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043190.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043600.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011065.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021610.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09596799.5
2024-05-06MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127770.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532340.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817910.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043370.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043890.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011122.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021805.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597092.0
2024-05-07MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127230.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532332.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001816020.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043310.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043900.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011070.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.8502989.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597222.5
2024-05-08MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127350.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532287.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818045.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043230.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043910.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011090.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.85021003.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597101.0
2024-05-09MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127530.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532355.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818360.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043390.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043560.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011057.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.8502995.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597578.0
2024-05-10MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127740.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532220.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817100.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043270.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043760.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011115.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.8502991.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597677.0
2024-05-13MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127800.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532175.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818045.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043680.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043900.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011137.5
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.8502978.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597438.5
2024-05-14MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127980.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532182.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818135.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043770.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40043880.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011055.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.8502929.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597564.5
2024-05-15MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128910.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532107.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818135.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043790.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044260.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011190.0
DIS[DIS20250117C115][DIS20250117C140]&L:DIS20250117C115&S:DIS20250117C1403.8502770.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597866.0
2024-05-16MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128730.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531965.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818180.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043560.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044350.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011147.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09598019.0
2024-05-17MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128070.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532010.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817955.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043350.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044450.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011145.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09598082.0
2024-05-20MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300129030.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531927.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818495.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043590.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044500.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011167.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597807.5
2024-05-21AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75094491.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300129480.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531905.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818540.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043350.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044460.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011105.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09598176.5
2024-05-22AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75093645.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.3001210680.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531897.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817640.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043660.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044500.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011140.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597821.0
2024-05-23AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75093618.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300129240.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531762.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001816200.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043530.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044280.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011150.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597974.0
2024-05-24AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75094153.5
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300129390.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531732.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001820070.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043590.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044600.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011240.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09598248.5
2024-05-27AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75094194.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300129660.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531815.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001819440.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043420.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044790.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011200.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09598131.5
2024-05-28AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75094194.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300129660.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531815.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001819440.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043420.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044790.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011200.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09598131.5
2024-05-29AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75094248.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300129510.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531822.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001819260.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043200.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044470.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011205.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597704.0
2024-05-30AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75094468.5
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127710.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531657.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817865.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043630.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044600.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011212.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597794.0
2024-05-31AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75094590.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127680.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531470.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818315.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043660.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044580.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011117.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09598491.5
2024-06-03AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75094815.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127380.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531575.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817865.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043550.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044410.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011162.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597488.0
2024-06-04AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75094716.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127620.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531612.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001817775.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043550.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044260.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011140.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597897.5
2024-06-05AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75095040.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300127950.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531725.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001820025.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043710.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044600.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011192.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09598388.0
2024-06-06AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75094801.5
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128700.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531950.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818450.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043540.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044540.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011182.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09598280.0
2024-06-07AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75095175.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300128490.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531897.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818360.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043680.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044660.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011202.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09598478.0
2024-06-10AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75094509.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300129090.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532070.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818360.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043600.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044310.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011197.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09598487.0
2024-06-11AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75096952.5
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.300129630.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532062.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818360.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043610.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044270.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011210.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597920.0
2024-06-12AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75098910.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.3001210590.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532032.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818360.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043680.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044410.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011275.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09598280.0
2024-06-13AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75098730.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.3001210500.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531837.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818360.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043830.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044370.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011250.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09598176.5
2024-06-14AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75098370.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.3001210860.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531837.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818360.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043680.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044350.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011220.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09598131.5
2024-06-17AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75099180.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.3001211730.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531852.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818360.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043690.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044260.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011315.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09598316.0
2024-06-18AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75098887.5
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.3001211100.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531755.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818360.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043720.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044030.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011287.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09598694.0
2024-06-19AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75097560.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.3001211250.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531957.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818360.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043710.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044410.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011270.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09598685.0
2024-06-20AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75097560.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.3001211250.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531957.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818360.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043710.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044410.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011270.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09598685.0
2024-06-21AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75096885.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.3001212060.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532122.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818360.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043590.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044400.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011222.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09598289.0
2024-06-24AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75096570.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.3001211940.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531905.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818360.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043560.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044350.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011310.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09598572.5
2024-06-25AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75097380.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.3001212120.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77531950.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818360.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043190.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044410.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011222.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09598676.0
2024-06-26AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75098212.5
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.3001212090.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532415.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818360.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043260.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044260.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011262.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09597969.5
2024-06-27AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75098392.5
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.3001211550.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532715.0
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818360.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043780.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044390.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011222.5
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09598451.0
2024-06-28AAPL[AAPL20250620C230][AAPL20250620C260]&L:AAPL20250620C230&S:AAPL20250620C2608.75097875.0
MSFT[MSFT20241220C450][MSFT20241220C470]&L:MSFT20241220C450&S:MSFT20241220C47010.3001212360.0
AMZN[AMZN20250117C205][AMZN20250117C230]&L:AMZN20250117C205&S:AMZN20250117C2307.77532332.5
NVDA[NVDA20240621C440][NVDA20240621C450]&L:NVDA20240621C440&S:NVDA20240621C45010.2001818360.0
WMT[WMT20250117C175][WMT20250117C185]&L:WMT20250117C175&S:WMT20250117C1855.45000.0
QCOM[QCOM20250117C130][QCOM20250117C140]&L:QCOM20250117C130&S:QCOM20250117C1409.80043920.0
AMD[AMD20240920C130][AMD20240920C145]&L:AMD20240920C130&S:AMD20240920C14511.40044560.0
MU[MU20250117C85][MU20250117C100]&L:MU20250117C85&S:MU20250117C10012.10011210.0
BAC[BAC20250117C30][BAC20250117C45]&L:BAC20250117C30&S:BAC20250117C459.09598185.5
\n", - "
" - ], - "text/plain": [ - " long short \\\n", - "datetime symbol \n", - "2023-07-05 TSLA [TSLA20240621C330] [TSLA20240621C346.67] \n", - " AAPL [AAPL20240621C230] [AAPL20240621C280] \n", - " MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-07-06 TSLA [TSLA20240621C330] [TSLA20240621C346.67] \n", - " AAPL [AAPL20240621C230] [AAPL20240621C280] \n", - " MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-07-07 TSLA [TSLA20240621C330] [TSLA20240621C346.67] \n", - " AAPL [AAPL20240621C230] [AAPL20240621C280] \n", - " MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-07-10 TSLA [TSLA20240621C330] [TSLA20240621C346.67] \n", - " AAPL [AAPL20240621C230] [AAPL20240621C280] \n", - " MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-07-11 TSLA [TSLA20240621C330] [TSLA20240621C346.67] \n", - " AAPL [AAPL20240621C230] [AAPL20240621C280] \n", - " MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-07-12 TSLA [TSLA20240621C330] [TSLA20240621C346.67] \n", - " AAPL [AAPL20240621C230] [AAPL20240621C280] \n", - " MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-07-13 TSLA [TSLA20240621C330] [TSLA20240621C346.67] \n", - " AAPL [AAPL20240621C230] [AAPL20240621C280] \n", - " MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-07-14 TSLA [TSLA20240621C330] [TSLA20240621C346.67] \n", - " AAPL [AAPL20240621C230] [AAPL20240621C280] \n", - " MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-07-17 TSLA [TSLA20240621C330] [TSLA20240621C346.67] \n", - " AAPL [AAPL20240621C230] [AAPL20240621C280] \n", - " MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-07-18 TSLA [TSLA20240621C330] [TSLA20240621C346.67] \n", - " AAPL [AAPL20240621C230] [AAPL20240621C280] \n", - " MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-07-19 TSLA [TSLA20240621C330] [TSLA20240621C346.67] \n", - " AAPL [AAPL20240621C230] [AAPL20240621C280] \n", - " MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-07-20 TSLA [TSLA20240621C330] [TSLA20240621C346.67] \n", - " AAPL [AAPL20240621C230] [AAPL20240621C280] \n", - " MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-07-21 TSLA [TSLA20240621C330] [TSLA20240621C346.67] \n", - " AAPL [AAPL20240621C230] [AAPL20240621C280] \n", - " MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-07-24 TSLA [TSLA20240621C330] [TSLA20240621C346.67] \n", - " AAPL [AAPL20240621C230] [AAPL20240621C280] \n", - " MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-07-25 TSLA [TSLA20240621C330] [TSLA20240621C346.67] \n", - " AAPL [AAPL20240621C230] [AAPL20240621C280] \n", - " MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-07-26 TSLA [TSLA20240621C330] [TSLA20240621C346.67] \n", - " AAPL [AAPL20240621C230] [AAPL20240621C280] \n", - " MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-07-27 TSLA [TSLA20240621C330] [TSLA20240621C346.67] \n", - " AAPL [AAPL20240621C230] [AAPL20240621C280] \n", - " MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-07-28 TSLA [TSLA20240621C330] [TSLA20240621C346.67] \n", - " AAPL [AAPL20240621C230] [AAPL20240621C280] \n", - " MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-07-31 TSLA [TSLA20240621C330] [TSLA20240621C346.67] \n", - " AAPL [AAPL20240621C230] [AAPL20240621C280] \n", - " MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-08-01 TSLA [TSLA20240621C330] [TSLA20240621C346.67] \n", - " AAPL [AAPL20240621C230] [AAPL20240621C280] \n", - " MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-08-02 AAPL [AAPL20240621C230] [AAPL20240621C280] \n", - " MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-08-03 AAPL [AAPL20240621C230] [AAPL20240621C280] \n", - " MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-08-04 MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-08-07 MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-08-08 MSFT [MSFT20240621C355] [MSFT20240621C365] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-08-09 AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-08-10 AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " BA [BA20240621C250] [BA20240621C260] \n", - " WMT [WMT20240621C165] [WMT20240621C175] \n", - "2023-08-11 AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " BA [BA20240621C250] [BA20240621C260] \n", - " WMT [WMT20240621C165] [WMT20240621C175] \n", - "2023-08-14 AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " BA [BA20240621C250] [BA20240621C260] \n", - " WMT [WMT20240621C165] [WMT20240621C175] \n", - "2023-08-15 AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " BA [BA20240621C250] [BA20240621C260] \n", - " WMT [WMT20240621C165] [WMT20240621C175] \n", - "2023-08-16 AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " BA [BA20240621C250] [BA20240621C260] \n", - " WMT [WMT20240621C165] [WMT20240621C175] \n", - "2023-08-17 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-08-18 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-08-21 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-08-22 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-08-23 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-08-24 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-08-25 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-08-28 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-08-29 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-08-30 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-08-31 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AAPL [AAPL20240920C210] [AAPL20240920C225] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-09-01 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AAPL [AAPL20240920C210] [AAPL20240920C225] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-09-04 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AAPL [AAPL20240920C210] [AAPL20240920C225] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-09-05 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AAPL [AAPL20240920C210] [AAPL20240920C225] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-09-06 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AAPL [AAPL20240920C210] [AAPL20240920C225] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-09-07 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-09-08 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-09-11 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-09-12 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-09-13 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20240621C170] [WMT20240621C180] \n", - "2023-09-14 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20240621C170] [WMT20240621C180] \n", - "2023-09-15 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20240621C170] [WMT20240621C180] \n", - " INTC [INTC20240621C37] [INTC20240621C55] \n", - "2023-09-18 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20240621C170] [WMT20240621C180] \n", - " INTC [INTC20240621C37] [INTC20240621C55] \n", - "2023-09-19 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20240621C170] [WMT20240621C180] \n", - " INTC [INTC20240621C37] [INTC20240621C55] \n", - "2023-09-20 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20240621C170] [WMT20240621C180] \n", - "2023-09-21 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20240621C170] [WMT20240621C180] \n", - "2023-09-22 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20240621C170] [WMT20240621C180] \n", - "2023-09-25 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20240621C170] [WMT20240621C180] \n", - "2023-09-26 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20240621C170] [WMT20240621C180] \n", - "2023-09-27 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20240621C170] [WMT20240621C180] \n", - "2023-09-28 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20240621C170] [WMT20240621C180] \n", - "2023-09-29 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-10-02 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-10-03 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-10-04 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-10-05 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-10-06 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-10-09 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-10-10 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-10-11 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-10-12 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-10-13 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-10-16 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-10-17 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-10-18 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-10-19 TSLA [TSLA20240920C280] [TSLA20240920C300] \n", - " AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-10-20 AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-10-23 AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-10-24 AMZN [AMZN20240621C145] [AMZN20240621C160] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-10-25 NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-10-26 NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-10-27 NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-10-30 NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-10-31 NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-11-01 NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-11-02 NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-11-03 NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-11-06 NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-11-07 NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-11-08 NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-11-09 NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-11-10 NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - "2023-11-13 NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - "2023-11-14 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - "2023-11-15 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " SBUX [SBUX20250117C110] [SBUX20250117C120] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - "2023-11-16 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " SBUX [SBUX20250117C110] [SBUX20250117C120] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - "2023-11-17 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " SBUX [SBUX20250117C110] [SBUX20250117C120] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - "2023-11-20 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " SBUX [SBUX20250117C110] [SBUX20250117C120] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - "2023-11-21 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " SBUX [SBUX20250117C110] [SBUX20250117C120] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - "2023-11-22 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " SBUX [SBUX20250117C110] [SBUX20250117C120] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - "2023-11-23 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " SBUX [SBUX20250117C110] [SBUX20250117C120] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - "2023-11-24 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " SBUX [SBUX20250117C110] [SBUX20250117C120] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - "2023-11-27 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " SBUX [SBUX20250117C110] [SBUX20250117C120] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - "2023-11-28 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " SBUX [SBUX20250117C110] [SBUX20250117C120] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - "2023-11-29 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - "2023-11-30 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - "2023-12-01 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2023-12-04 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2023-12-05 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2023-12-06 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2023-12-07 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2023-12-08 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2023-12-11 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2023-12-12 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2023-12-13 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2023-12-14 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2023-12-15 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2023-12-18 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2023-12-19 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2023-12-20 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2023-12-21 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2023-12-22 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2023-12-25 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2023-12-26 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2023-12-27 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2023-12-28 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2023-12-29 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-01-01 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-01-02 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-01-03 AAPL [AAPL20241220C215] [AAPL20241220C230] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-01-04 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-01-05 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-01-08 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-01-09 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20240920C100] [DIS20240920C115] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-01-10 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-01-11 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " BA [BA20250117C250] [BA20250117C260] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-01-12 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-01-15 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-01-16 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-01-17 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-01-18 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-01-19 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-01-22 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-01-23 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-01-24 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-01-25 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-01-26 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - " GOOG [GOOG20250117C160] [GOOG20250117C170] \n", - "2024-01-29 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - " GOOG [GOOG20250117C160] [GOOG20250117C170] \n", - "2024-01-30 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - " GOOG [GOOG20250117C160] [GOOG20250117C170] \n", - "2024-01-31 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-02-01 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-02-02 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-02-05 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-02-06 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-02-07 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-02-08 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-02-09 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-02-12 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-02-13 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-02-14 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-02-15 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-02-16 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-02-19 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-02-20 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-02-21 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-02-22 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-02-23 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-02-26 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-02-27 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-02-28 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-02-29 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-03-01 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-03-04 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-03-05 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-03-06 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-03-07 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-03-08 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-03-11 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-03-12 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-03-13 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-03-14 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-03-15 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-03-18 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-03-19 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-03-20 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-03-21 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-03-22 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-03-25 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-03-26 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-03-27 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-03-28 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-03-29 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-04-01 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-04-02 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " INTC [INTC20240920C42] [INTC20240920C50] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-04-03 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-04-04 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-04-05 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-04-08 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-04-09 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-04-10 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-04-11 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-04-12 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-04-15 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-04-16 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " HD [HD20250117C340] [HD20250117C350] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-04-17 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-04-18 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-04-19 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-04-22 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-04-23 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-04-24 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-04-25 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-04-26 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-04-29 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-04-30 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-05-01 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-05-02 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-05-03 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-05-06 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-05-07 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-05-08 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-05-09 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-05-10 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-05-13 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-05-14 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-05-15 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " DIS [DIS20250117C115] [DIS20250117C140] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-05-16 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-05-17 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-05-20 MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-05-21 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-05-22 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-05-23 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-05-24 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-05-27 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-05-28 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-05-29 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-05-30 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-05-31 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-06-03 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-06-04 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-06-05 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-06-06 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-06-07 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-06-10 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-06-11 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-06-12 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-06-13 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-06-14 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-06-17 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-06-18 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-06-19 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-06-20 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-06-21 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-06-24 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-06-25 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-06-26 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-06-27 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "2024-06-28 AAPL [AAPL20250620C230] [AAPL20250620C260] \n", - " MSFT [MSFT20241220C450] [MSFT20241220C470] \n", - " AMZN [AMZN20250117C205] [AMZN20250117C230] \n", - " NVDA [NVDA20240621C440] [NVDA20240621C450] \n", - " WMT [WMT20250117C175] [WMT20250117C185] \n", - " QCOM [QCOM20250117C130] [QCOM20250117C140] \n", - " AMD [AMD20240920C130] [AMD20240920C145] \n", - " MU [MU20250117C85] [MU20250117C100] \n", - " BAC [BAC20250117C30] [BAC20250117C45] \n", - "\n", - " trade_id close \\\n", - "datetime symbol \n", - "2023-07-05 TSLA &L:TSLA20240621C330&S:TSLA20240621C346.67 3.900 \n", - " AAPL &L:AAPL20240621C230&S:AAPL20240621C280 5.260 \n", - " MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-07-06 TSLA &L:TSLA20240621C330&S:TSLA20240621C346.67 3.900 \n", - " AAPL &L:AAPL20240621C230&S:AAPL20240621C280 5.260 \n", - " MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-07-07 TSLA &L:TSLA20240621C330&S:TSLA20240621C346.67 3.900 \n", - " AAPL &L:AAPL20240621C230&S:AAPL20240621C280 5.260 \n", - " MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-07-10 TSLA &L:TSLA20240621C330&S:TSLA20240621C346.67 3.900 \n", - " AAPL &L:AAPL20240621C230&S:AAPL20240621C280 5.260 \n", - " MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-07-11 TSLA &L:TSLA20240621C330&S:TSLA20240621C346.67 3.900 \n", - " AAPL &L:AAPL20240621C230&S:AAPL20240621C280 5.260 \n", - " MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-07-12 TSLA &L:TSLA20240621C330&S:TSLA20240621C346.67 3.900 \n", - " AAPL &L:AAPL20240621C230&S:AAPL20240621C280 5.260 \n", - " MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-07-13 TSLA &L:TSLA20240621C330&S:TSLA20240621C346.67 3.900 \n", - " AAPL &L:AAPL20240621C230&S:AAPL20240621C280 5.260 \n", - " MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-07-14 TSLA &L:TSLA20240621C330&S:TSLA20240621C346.67 3.900 \n", - " AAPL &L:AAPL20240621C230&S:AAPL20240621C280 5.260 \n", - " MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-07-17 TSLA &L:TSLA20240621C330&S:TSLA20240621C346.67 3.900 \n", - " AAPL &L:AAPL20240621C230&S:AAPL20240621C280 5.260 \n", - " MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-07-18 TSLA &L:TSLA20240621C330&S:TSLA20240621C346.67 3.900 \n", - " AAPL &L:AAPL20240621C230&S:AAPL20240621C280 5.260 \n", - " MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-07-19 TSLA &L:TSLA20240621C330&S:TSLA20240621C346.67 3.900 \n", - " AAPL &L:AAPL20240621C230&S:AAPL20240621C280 5.260 \n", - " MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-07-20 TSLA &L:TSLA20240621C330&S:TSLA20240621C346.67 3.900 \n", - " AAPL &L:AAPL20240621C230&S:AAPL20240621C280 5.260 \n", - " MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-07-21 TSLA &L:TSLA20240621C330&S:TSLA20240621C346.67 3.900 \n", - " AAPL &L:AAPL20240621C230&S:AAPL20240621C280 5.260 \n", - " MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-07-24 TSLA &L:TSLA20240621C330&S:TSLA20240621C346.67 3.900 \n", - " AAPL &L:AAPL20240621C230&S:AAPL20240621C280 5.260 \n", - " MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-07-25 TSLA &L:TSLA20240621C330&S:TSLA20240621C346.67 3.900 \n", - " AAPL &L:AAPL20240621C230&S:AAPL20240621C280 5.260 \n", - " MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-07-26 TSLA &L:TSLA20240621C330&S:TSLA20240621C346.67 3.900 \n", - " AAPL &L:AAPL20240621C230&S:AAPL20240621C280 5.260 \n", - " MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-07-27 TSLA &L:TSLA20240621C330&S:TSLA20240621C346.67 3.900 \n", - " AAPL &L:AAPL20240621C230&S:AAPL20240621C280 5.260 \n", - " MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-07-28 TSLA &L:TSLA20240621C330&S:TSLA20240621C346.67 3.900 \n", - " AAPL &L:AAPL20240621C230&S:AAPL20240621C280 5.260 \n", - " MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-07-31 TSLA &L:TSLA20240621C330&S:TSLA20240621C346.67 3.900 \n", - " AAPL &L:AAPL20240621C230&S:AAPL20240621C280 5.260 \n", - " MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-08-01 TSLA &L:TSLA20240621C330&S:TSLA20240621C346.67 3.900 \n", - " AAPL &L:AAPL20240621C230&S:AAPL20240621C280 5.260 \n", - " MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-08-02 AAPL &L:AAPL20240621C230&S:AAPL20240621C280 5.260 \n", - " MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-08-03 AAPL &L:AAPL20240621C230&S:AAPL20240621C280 5.260 \n", - " MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-08-04 MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-08-07 MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-08-08 MSFT &L:MSFT20240621C355&S:MSFT20240621C365 3.825 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-08-09 AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-08-10 AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " BA &L:BA20240621C250&S:BA20240621C260 3.775 \n", - " WMT &L:WMT20240621C165&S:WMT20240621C175 4.550 \n", - "2023-08-11 AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " BA &L:BA20240621C250&S:BA20240621C260 3.775 \n", - " WMT &L:WMT20240621C165&S:WMT20240621C175 4.550 \n", - "2023-08-14 AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " BA &L:BA20240621C250&S:BA20240621C260 3.775 \n", - " WMT &L:WMT20240621C165&S:WMT20240621C175 4.550 \n", - "2023-08-15 AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " BA &L:BA20240621C250&S:BA20240621C260 3.775 \n", - " WMT &L:WMT20240621C165&S:WMT20240621C175 4.550 \n", - "2023-08-16 AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " BA &L:BA20240621C250&S:BA20240621C260 3.775 \n", - " WMT &L:WMT20240621C165&S:WMT20240621C175 4.550 \n", - "2023-08-17 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-08-18 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-08-21 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-08-22 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-08-23 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-08-24 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-08-25 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-08-28 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-08-29 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-08-30 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-08-31 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AAPL &L:AAPL20240920C210&S:AAPL20240920C225 4.475 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-09-01 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AAPL &L:AAPL20240920C210&S:AAPL20240920C225 4.475 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-09-04 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AAPL &L:AAPL20240920C210&S:AAPL20240920C225 4.475 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-09-05 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AAPL &L:AAPL20240920C210&S:AAPL20240920C225 4.475 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-09-06 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AAPL &L:AAPL20240920C210&S:AAPL20240920C225 4.475 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-09-07 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-09-08 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-09-11 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-09-12 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-09-13 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20240621C170&S:WMT20240621C180 4.100 \n", - "2023-09-14 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20240621C170&S:WMT20240621C180 4.100 \n", - "2023-09-15 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20240621C170&S:WMT20240621C180 4.100 \n", - " INTC &L:INTC20240621C37&S:INTC20240621C55 4.125 \n", - "2023-09-18 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20240621C170&S:WMT20240621C180 4.100 \n", - " INTC &L:INTC20240621C37&S:INTC20240621C55 4.125 \n", - "2023-09-19 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20240621C170&S:WMT20240621C180 4.100 \n", - " INTC &L:INTC20240621C37&S:INTC20240621C55 4.125 \n", - "2023-09-20 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20240621C170&S:WMT20240621C180 4.100 \n", - "2023-09-21 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20240621C170&S:WMT20240621C180 4.100 \n", - "2023-09-22 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20240621C170&S:WMT20240621C180 4.100 \n", - "2023-09-25 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20240621C170&S:WMT20240621C180 4.100 \n", - "2023-09-26 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20240621C170&S:WMT20240621C180 4.100 \n", - "2023-09-27 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20240621C170&S:WMT20240621C180 4.100 \n", - "2023-09-28 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20240621C170&S:WMT20240621C180 4.100 \n", - "2023-09-29 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-10-02 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-10-03 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-10-04 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-10-05 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-10-06 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-10-09 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-10-10 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-10-11 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-10-12 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-10-13 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-10-16 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-10-17 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-10-18 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-10-19 TSLA &L:TSLA20240920C280&S:TSLA20240920C300 4.850 \n", - " AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-10-20 AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-10-23 AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-10-24 AMZN &L:AMZN20240621C145&S:AMZN20240621C160 4.425 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-10-25 NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-10-26 NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-10-27 NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-10-30 NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-10-31 NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-11-01 NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-11-02 NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-11-03 NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-11-06 NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-11-07 NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-11-08 NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-11-09 NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-11-10 NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - "2023-11-13 NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - "2023-11-14 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - "2023-11-15 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " SBUX &L:SBUX20250117C110&S:SBUX20250117C120 3.275 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - "2023-11-16 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " SBUX &L:SBUX20250117C110&S:SBUX20250117C120 3.275 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - "2023-11-17 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " SBUX &L:SBUX20250117C110&S:SBUX20250117C120 3.275 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - "2023-11-20 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " SBUX &L:SBUX20250117C110&S:SBUX20250117C120 3.275 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - "2023-11-21 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " SBUX &L:SBUX20250117C110&S:SBUX20250117C120 3.275 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - "2023-11-22 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " SBUX &L:SBUX20250117C110&S:SBUX20250117C120 3.275 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - "2023-11-23 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " SBUX &L:SBUX20250117C110&S:SBUX20250117C120 3.275 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - "2023-11-24 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " SBUX &L:SBUX20250117C110&S:SBUX20250117C120 3.275 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - "2023-11-27 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " SBUX &L:SBUX20250117C110&S:SBUX20250117C120 3.275 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - "2023-11-28 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " SBUX &L:SBUX20250117C110&S:SBUX20250117C120 3.275 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - "2023-11-29 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - "2023-11-30 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - "2023-12-01 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2023-12-04 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2023-12-05 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2023-12-06 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2023-12-07 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2023-12-08 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2023-12-11 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2023-12-12 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2023-12-13 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2023-12-14 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2023-12-15 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2023-12-18 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2023-12-19 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2023-12-20 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2023-12-21 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2023-12-22 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2023-12-25 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2023-12-26 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2023-12-27 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2023-12-28 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2023-12-29 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-01-01 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-01-02 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-01-03 AAPL &L:AAPL20241220C215&S:AAPL20241220C230 3.525 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-01-04 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-01-05 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-01-08 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-01-09 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20240920C100&S:DIS20240920C115 3.315 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-01-10 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-01-11 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " BA &L:BA20250117C250&S:BA20250117C260 3.475 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-01-12 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-01-15 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-01-16 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-01-17 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-01-18 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-01-19 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-01-22 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-01-23 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-01-24 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-01-25 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-01-26 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - " GOOG &L:GOOG20250117C160&S:GOOG20250117C170 4.200 \n", - "2024-01-29 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - " GOOG &L:GOOG20250117C160&S:GOOG20250117C170 4.200 \n", - "2024-01-30 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - " GOOG &L:GOOG20250117C160&S:GOOG20250117C170 4.200 \n", - "2024-01-31 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-02-01 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-02-02 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-02-05 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-02-06 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-02-07 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-02-08 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-02-09 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-02-12 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-02-13 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-02-14 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-02-15 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-02-16 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-02-19 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-02-20 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-02-21 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-02-22 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-02-23 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-02-26 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-02-27 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-02-28 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-02-29 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-03-01 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-03-04 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-03-05 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-03-06 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-03-07 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-03-08 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-03-11 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-03-12 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-03-13 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-03-14 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-03-15 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-03-18 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-03-19 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-03-20 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-03-21 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-03-22 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-03-25 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-03-26 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-03-27 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-03-28 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-03-29 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-04-01 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-04-02 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " INTC &L:INTC20240920C42&S:INTC20240920C50 2.765 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-04-03 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-04-04 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-04-05 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-04-08 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-04-09 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-04-10 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-04-11 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-04-12 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-04-15 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-04-16 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " HD &L:HD20250117C340&S:HD20250117C350 5.725 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-04-17 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-04-18 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-04-19 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-04-22 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-04-23 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-04-24 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-04-25 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-04-26 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-04-29 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-04-30 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-05-01 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-05-02 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-05-03 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-05-06 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-05-07 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-05-08 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-05-09 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-05-10 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-05-13 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-05-14 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-05-15 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " DIS &L:DIS20250117C115&S:DIS20250117C140 3.850 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-05-16 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-05-17 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-05-20 MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-05-21 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-05-22 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-05-23 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-05-24 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-05-27 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-05-28 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-05-29 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-05-30 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-05-31 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-06-03 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-06-04 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-06-05 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-06-06 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-06-07 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-06-10 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-06-11 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-06-12 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-06-13 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-06-14 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-06-17 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-06-18 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-06-19 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-06-20 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-06-21 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-06-24 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-06-25 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-06-26 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-06-27 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "2024-06-28 AAPL &L:AAPL20250620C230&S:AAPL20250620C260 8.750 \n", - " MSFT &L:MSFT20241220C450&S:MSFT20241220C470 10.300 \n", - " AMZN &L:AMZN20250117C205&S:AMZN20250117C230 7.775 \n", - " NVDA &L:NVDA20240621C440&S:NVDA20240621C450 10.200 \n", - " WMT &L:WMT20250117C175&S:WMT20250117C185 5.450 \n", - " QCOM &L:QCOM20250117C130&S:QCOM20250117C140 9.800 \n", - " AMD &L:AMD20240920C130&S:AMD20240920C145 11.400 \n", - " MU &L:MU20250117C85&S:MU20250117C100 12.100 \n", - " BAC &L:BAC20250117C30&S:BAC20250117C45 9.095 \n", - "\n", - " quantity market_value \n", - "datetime symbol \n", - "2023-07-05 TSLA 23 11442.5 \n", - " AAPL 13 6363.5 \n", - " MSFT 14 6790.0 \n", - " AMZN 3 1485.0 \n", - " NVDA 18 8775.0 \n", - "2023-07-06 TSLA 23 10637.5 \n", - " AAPL 13 6805.5 \n", - " MSFT 14 6545.0 \n", - " AMZN 3 1380.0 \n", - " NVDA 18 8190.0 \n", - "2023-07-07 TSLA 23 10235.0 \n", - " AAPL 13 6474.0 \n", - " MSFT 14 6335.0 \n", - " AMZN 3 1485.0 \n", - " NVDA 18 8145.0 \n", - "2023-07-10 TSLA 23 10235.0 \n", - " AAPL 13 5759.0 \n", - " MSFT 14 5950.0 \n", - " AMZN 3 1350.0 \n", - " NVDA 18 7560.0 \n", - "2023-07-11 TSLA 23 9832.5 \n", - " AAPL 13 5622.5 \n", - " MSFT 14 5950.0 \n", - " AMZN 3 1410.0 \n", - " NVDA 18 8055.0 \n", - "2023-07-12 TSLA 23 10120.0 \n", - " AAPL 13 5921.5 \n", - " MSFT 14 6370.0 \n", - " AMZN 3 1500.0 \n", - " NVDA 18 8190.0 \n", - "2023-07-13 TSLA 23 10867.5 \n", - " AAPL 13 6058.0 \n", - " MSFT 14 6160.0 \n", - " AMZN 3 1635.0 \n", - " NVDA 18 7335.0 \n", - "2023-07-14 TSLA 23 10982.5 \n", - " AAPL 13 6077.5 \n", - " MSFT 14 5880.0 \n", - " AMZN 3 1642.5 \n", - " NVDA 18 9810.0 \n", - "2023-07-17 TSLA 23 12420.0 \n", - " AAPL 13 7026.5 \n", - " MSFT 14 6090.0 \n", - " AMZN 3 1567.5 \n", - " NVDA 18 7380.0 \n", - "2023-07-18 TSLA 23 11960.0 \n", - " AAPL 13 6896.5 \n", - " MSFT 14 7525.0 \n", - " AMZN 3 1567.5 \n", - " NVDA 18 8550.0 \n", - "2023-07-19 TSLA 23 13800.0 \n", - " AAPL 13 7527.0 \n", - " MSFT 14 7420.0 \n", - " AMZN 3 1665.0 \n", - " NVDA 18 8325.0 \n", - "2023-07-20 TSLA 23 9430.0 \n", - " AAPL 13 7059.0 \n", - " MSFT 14 6615.0 \n", - " AMZN 3 1425.0 \n", - " NVDA 18 8370.0 \n", - "2023-07-21 TSLA 23 8912.5 \n", - " AAPL 13 6597.5 \n", - " MSFT 14 7140.0 \n", - " AMZN 3 1417.5 \n", - " NVDA 18 7875.0 \n", - "2023-07-24 TSLA 23 9142.5 \n", - " AAPL 13 6773.0 \n", - " MSFT 14 6965.0 \n", - " AMZN 3 1365.0 \n", - " NVDA 18 9360.0 \n", - "2023-07-25 TSLA 23 9430.0 \n", - " AAPL 13 7033.0 \n", - " MSFT 14 7245.0 \n", - " AMZN 3 1357.5 \n", - " NVDA 18 8820.0 \n", - "2023-07-26 TSLA 23 8567.5 \n", - " AAPL 13 7254.0 \n", - " MSFT 14 6090.0 \n", - " AMZN 3 1327.5 \n", - " NVDA 18 5400.0 \n", - "2023-07-27 TSLA 23 8452.5 \n", - " AAPL 13 7104.5 \n", - " MSFT 14 5600.0 \n", - " AMZN 3 1335.0 \n", - " NVDA 18 8145.0 \n", - "2023-07-28 TSLA 23 9602.5 \n", - " AAPL 13 7780.5 \n", - " MSFT 14 5600.0 \n", - " AMZN 3 1455.0 \n", - " NVDA 18 9135.0 \n", - "2023-07-31 TSLA 23 9372.5 \n", - " AAPL 13 8216.0 \n", - " MSFT 14 5950.0 \n", - " AMZN 3 1560.0 \n", - " NVDA 18 12465.0 \n", - "2023-08-01 TSLA 23 8970.0 \n", - " AAPL 13 7871.5 \n", - " MSFT 14 5915.0 \n", - " AMZN 3 1485.0 \n", - " NVDA 18 9225.0 \n", - "2023-08-02 AAPL 13 7176.0 \n", - " MSFT 14 5425.0 \n", - " AMZN 3 1335.0 \n", - " NVDA 18 11565.0 \n", - "2023-08-03 AAPL 13 6838.0 \n", - " MSFT 14 5320.0 \n", - " AMZN 3 1365.0 \n", - " NVDA 18 9900.0 \n", - "2023-08-04 MSFT 14 5425.0 \n", - " AMZN 3 1807.5 \n", - " NVDA 18 4815.0 \n", - "2023-08-07 MSFT 14 5040.0 \n", - " AMZN 3 1912.5 \n", - " NVDA 18 8550.0 \n", - "2023-08-08 MSFT 14 5355.0 \n", - " AMZN 3 1822.5 \n", - " NVDA 18 8640.0 \n", - "2023-08-09 AMZN 3 1725.0 \n", - " NVDA 18 9000.0 \n", - "2023-08-10 AMZN 3 1762.5 \n", - " NVDA 18 6975.0 \n", - " BA 3 1327.5 \n", - " WMT 0 0.0 \n", - "2023-08-11 AMZN 3 1762.5 \n", - " NVDA 18 7110.0 \n", - " BA 3 1290.0 \n", - " WMT 0 0.0 \n", - "2023-08-14 AMZN 3 1860.0 \n", - " NVDA 18 7830.0 \n", - " BA 3 1327.5 \n", - " WMT 0 0.0 \n", - "2023-08-15 AMZN 3 1807.5 \n", - " NVDA 18 8100.0 \n", - " BA 3 1222.5 \n", - " WMT 0 0.0 \n", - "2023-08-16 AMZN 3 1620.0 \n", - " NVDA 18 7470.0 \n", - " BA 3 1132.5 \n", - " WMT 0 0.0 \n", - "2023-08-17 TSLA 20 9450.0 \n", - " AMZN 3 1560.0 \n", - " NVDA 18 7605.0 \n", - "2023-08-18 TSLA 20 9050.0 \n", - " AMZN 3 1545.0 \n", - " NVDA 18 7740.0 \n", - "2023-08-21 TSLA 20 11250.0 \n", - " AMZN 3 1605.0 \n", - " NVDA 18 8010.0 \n", - "2023-08-22 TSLA 20 11500.0 \n", - " AMZN 3 1590.0 \n", - " NVDA 18 8145.0 \n", - "2023-08-23 TSLA 20 11900.0 \n", - " AMZN 3 1635.0 \n", - " NVDA 18 8685.0 \n", - "2023-08-24 TSLA 20 11150.0 \n", - " AMZN 3 1485.0 \n", - " NVDA 18 8595.0 \n", - "2023-08-25 TSLA 20 12050.0 \n", - " AMZN 3 1530.0 \n", - " NVDA 18 8595.0 \n", - "2023-08-28 TSLA 20 12250.0 \n", - " AMZN 3 1537.5 \n", - " NVDA 18 8955.0 \n", - "2023-08-29 TSLA 20 14150.0 \n", - " AMZN 3 1605.0 \n", - " NVDA 18 9405.0 \n", - "2023-08-30 TSLA 20 14100.0 \n", - " AMZN 3 1597.5 \n", - " NVDA 18 9045.0 \n", - "2023-08-31 TSLA 20 14200.0 \n", - " AAPL 14 7000.0 \n", - " AMZN 3 1740.0 \n", - " NVDA 18 10440.0 \n", - "2023-09-01 TSLA 20 12700.0 \n", - " AAPL 14 7315.0 \n", - " AMZN 3 1740.0 \n", - " NVDA 18 9135.0 \n", - "2023-09-04 TSLA 20 13900.0 \n", - " AAPL 14 7280.0 \n", - " AMZN 3 1702.5 \n", - " NVDA 18 10395.0 \n", - "2023-09-05 TSLA 20 13900.0 \n", - " AAPL 14 7280.0 \n", - " AMZN 3 1702.5 \n", - " NVDA 18 10395.0 \n", - "2023-09-06 TSLA 20 13500.0 \n", - " AAPL 14 6265.0 \n", - " AMZN 3 1612.5 \n", - " NVDA 18 9225.0 \n", - "2023-09-07 TSLA 20 13400.0 \n", - " AMZN 3 1725.0 \n", - " NVDA 18 8910.0 \n", - "2023-09-08 TSLA 20 13100.0 \n", - " AMZN 3 1747.5 \n", - " NVDA 18 8685.0 \n", - "2023-09-11 TSLA 20 15800.0 \n", - " AMZN 3 1965.0 \n", - " NVDA 18 8415.0 \n", - "2023-09-12 TSLA 20 15100.0 \n", - " AMZN 3 1882.5 \n", - " NVDA 18 8145.0 \n", - "2023-09-13 TSLA 20 15500.0 \n", - " AMZN 3 2055.0 \n", - " NVDA 18 8550.0 \n", - " WMT 0 0.0 \n", - "2023-09-14 TSLA 20 16200.0 \n", - " AMZN 3 2025.0 \n", - " NVDA 18 8460.0 \n", - " WMT 0 0.0 \n", - "2023-09-15 TSLA 20 16000.0 \n", - " AMZN 3 1830.0 \n", - " NVDA 18 8100.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - "2023-09-18 TSLA 20 14950.0 \n", - " AMZN 3 1680.0 \n", - " NVDA 18 7155.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - "2023-09-19 TSLA 20 15000.0 \n", - " AMZN 3 1597.5 \n", - " NVDA 18 8055.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - "2023-09-20 TSLA 20 14600.0 \n", - " AMZN 3 1590.0 \n", - " NVDA 18 7740.0 \n", - " WMT 0 0.0 \n", - "2023-09-21 TSLA 20 14200.0 \n", - " AMZN 3 1327.5 \n", - " NVDA 18 7020.0 \n", - " WMT 0 0.0 \n", - "2023-09-22 TSLA 20 12750.0 \n", - " AMZN 3 1312.5 \n", - " NVDA 18 7245.0 \n", - " WMT 0 0.0 \n", - "2023-09-25 TSLA 20 14200.0 \n", - " AMZN 3 1417.5 \n", - " NVDA 18 7605.0 \n", - " WMT 0 0.0 \n", - "2023-09-26 TSLA 20 12700.0 \n", - " AMZN 3 1200.0 \n", - " NVDA 18 7110.0 \n", - " WMT 0 0.0 \n", - "2023-09-27 TSLA 20 12250.0 \n", - " AMZN 3 1192.5 \n", - " NVDA 18 7425.0 \n", - " WMT 0 0.0 \n", - "2023-09-28 TSLA 20 12900.0 \n", - " AMZN 3 1177.5 \n", - " NVDA 18 7650.0 \n", - " WMT 0 0.0 \n", - "2023-09-29 TSLA 20 13550.0 \n", - " AMZN 3 1230.0 \n", - " NVDA 18 7785.0 \n", - "2023-10-02 TSLA 20 13450.0 \n", - " AMZN 3 1335.0 \n", - " NVDA 18 8235.0 \n", - "2023-10-03 TSLA 20 12900.0 \n", - " AMZN 3 1155.0 \n", - " NVDA 18 7830.0 \n", - "2023-10-04 TSLA 20 19150.0 \n", - " AMZN 3 1230.0 \n", - " NVDA 18 8010.0 \n", - "2023-10-05 TSLA 20 14550.0 \n", - " AMZN 3 1192.5 \n", - " NVDA 18 8280.0 \n", - "2023-10-06 TSLA 20 14500.0 \n", - " AMZN 3 1275.0 \n", - " NVDA 18 8775.0 \n", - "2023-10-09 TSLA 20 14500.0 \n", - " AMZN 3 1290.0 \n", - " NVDA 18 8460.0 \n", - "2023-10-10 TSLA 20 15000.0 \n", - " AMZN 3 1335.0 \n", - " NVDA 18 8730.0 \n", - "2023-10-11 TSLA 20 14950.0 \n", - " AMZN 3 1440.0 \n", - " NVDA 18 9225.0 \n", - "2023-10-12 TSLA 20 14450.0 \n", - " AMZN 3 1462.5 \n", - " NVDA 18 9225.0 \n", - "2023-10-13 TSLA 20 13650.0 \n", - " AMZN 3 1372.5 \n", - " NVDA 18 8820.0 \n", - "2023-10-16 TSLA 20 14000.0 \n", - " AMZN 3 1470.0 \n", - " NVDA 18 8955.0 \n", - "2023-10-17 TSLA 20 14100.0 \n", - " AMZN 3 1447.5 \n", - " NVDA 18 8010.0 \n", - "2023-10-18 TSLA 20 12650.0 \n", - " AMZN 3 1155.0 \n", - " NVDA 18 7380.0 \n", - "2023-10-19 TSLA 20 9700.0 \n", - " AMZN 3 1305.0 \n", - " NVDA 18 7380.0 \n", - "2023-10-20 AMZN 3 1162.5 \n", - " NVDA 18 6975.0 \n", - "2023-10-23 AMZN 3 1215.0 \n", - " NVDA 18 7785.0 \n", - "2023-10-24 AMZN 3 1327.5 \n", - " NVDA 18 8145.0 \n", - "2023-10-25 NVDA 18 9855.0 \n", - "2023-10-26 NVDA 18 6615.0 \n", - "2023-10-27 NVDA 18 6570.0 \n", - "2023-10-30 NVDA 18 7020.0 \n", - "2023-10-31 NVDA 18 6795.0 \n", - "2023-11-01 NVDA 18 7830.0 \n", - "2023-11-02 NVDA 18 7875.0 \n", - "2023-11-03 NVDA 18 8640.0 \n", - "2023-11-06 NVDA 18 9540.0 \n", - "2023-11-07 NVDA 18 9045.0 \n", - "2023-11-08 NVDA 18 9270.0 \n", - "2023-11-09 NVDA 18 9720.0 \n", - "2023-11-10 NVDA 18 10125.0 \n", - "2023-11-13 NVDA 18 10575.0 \n", - " QCOM 4 1570.0 \n", - "2023-11-14 MSFT 12 5460.0 \n", - " NVDA 18 11205.0 \n", - " QCOM 4 1730.0 \n", - "2023-11-15 MSFT 12 5580.0 \n", - " NVDA 18 11025.0 \n", - " QCOM 4 1770.0 \n", - " SBUX 12 5100.0 \n", - " AMD 4 1970.0 \n", - "2023-11-16 MSFT 12 4830.0 \n", - " NVDA 18 11160.0 \n", - " QCOM 4 1630.0 \n", - " SBUX 12 5130.0 \n", - " AMD 4 2020.0 \n", - " MU 1 462.5 \n", - "2023-11-17 MSFT 12 5850.0 \n", - " NVDA 18 8955.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 1790.0 \n", - " SBUX 12 5010.0 \n", - " AMD 4 2060.0 \n", - " MU 1 480.0 \n", - " DIS 3 1462.5 \n", - "2023-11-20 MSFT 12 6540.0 \n", - " NVDA 18 9990.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 1780.0 \n", - " SBUX 12 4680.0 \n", - " AMD 4 2100.0 \n", - " MU 1 500.0 \n", - " DIS 3 1515.0 \n", - "2023-11-21 MSFT 12 6870.0 \n", - " NVDA 18 12285.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 1680.0 \n", - " SBUX 12 4500.0 \n", - " AMD 4 1990.0 \n", - " MU 1 480.0 \n", - " DIS 3 1470.0 \n", - "2023-11-22 AAPL 13 6337.5 \n", - " MSFT 12 4890.0 \n", - " NVDA 18 10350.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 1690.0 \n", - " SBUX 12 4500.0 \n", - " AMD 4 2100.0 \n", - " MU 1 470.0 \n", - " DIS 3 1515.0 \n", - "2023-11-23 AAPL 13 6110.0 \n", - " MSFT 12 6180.0 \n", - " NVDA 18 10125.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 1780.0 \n", - " SBUX 12 4380.0 \n", - " AMD 4 2130.0 \n", - " MU 1 462.5 \n", - " DIS 3 1582.5 \n", - "2023-11-24 AAPL 13 6110.0 \n", - " MSFT 12 6180.0 \n", - " NVDA 18 10125.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 1780.0 \n", - " SBUX 12 4380.0 \n", - " AMD 4 2130.0 \n", - " MU 1 462.5 \n", - " DIS 3 1582.5 \n", - "2023-11-27 AAPL 13 6142.5 \n", - " MSFT 12 5910.0 \n", - " NVDA 18 11250.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 1820.0 \n", - " SBUX 12 4320.0 \n", - " AMD 4 2160.0 \n", - " MU 1 482.5 \n", - " DIS 3 1530.0 \n", - "2023-11-28 AAPL 13 6175.0 \n", - " MSFT 12 5700.0 \n", - " NVDA 18 10395.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 1770.0 \n", - " SBUX 12 3930.0 \n", - " AMD 4 2120.0 \n", - " MU 1 445.0 \n", - " DIS 3 1318.5 \n", - "2023-11-29 AAPL 13 5980.0 \n", - " MSFT 12 5910.0 \n", - " NVDA 18 10305.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 1730.0 \n", - " AMD 4 2200.0 \n", - " MU 1 472.5 \n", - " DIS 3 1299.0 \n", - "2023-11-30 AAPL 13 6045.0 \n", - " MSFT 12 4380.0 \n", - " NVDA 18 10170.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 1820.0 \n", - " AMD 4 2080.0 \n", - " MU 1 505.0 \n", - " DIS 3 1312.5 \n", - "2023-12-01 AAPL 13 6240.0 \n", - " MSFT 12 4680.0 \n", - " NVDA 18 10350.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 1850.0 \n", - " AMD 4 2060.0 \n", - " MU 1 452.5 \n", - " DIS 3 1275.0 \n", - " BAC 9 3573.0 \n", - "2023-12-04 AAPL 13 5980.0 \n", - " MSFT 12 3720.0 \n", - " NVDA 18 9225.0 \n", - " HD 4 1940.0 \n", - " BA 3 1275.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 1830.0 \n", - " AMD 4 1950.0 \n", - " MU 1 415.0 \n", - " DIS 3 1230.0 \n", - " BAC 9 3514.5 \n", - "2023-12-05 AAPL 13 6630.0 \n", - " MSFT 12 5280.0 \n", - " NVDA 18 9855.0 \n", - " HD 4 1370.0 \n", - " BA 3 1312.5 \n", - " INTC 0 0.0 \n", - " QCOM 4 1650.0 \n", - " AMD 4 1940.0 \n", - " MU 1 405.0 \n", - " DIS 3 1150.5 \n", - " BAC 9 3402.0 \n", - "2023-12-06 AAPL 13 6435.0 \n", - " MSFT 12 5370.0 \n", - " NVDA 18 9990.0 \n", - " HD 4 1700.0 \n", - " BA 3 1297.5 \n", - " INTC 0 0.0 \n", - " QCOM 4 1890.0 \n", - " AMD 4 1850.0 \n", - " MU 1 397.5 \n", - " DIS 3 1186.5 \n", - " BAC 9 3343.5 \n", - "2023-12-07 AAPL 13 6695.0 \n", - " MSFT 12 4110.0 \n", - " NVDA 18 9765.0 \n", - " HD 4 1890.0 \n", - " BA 3 892.5 \n", - " INTC 0 0.0 \n", - " QCOM 4 1960.0 \n", - " AMD 4 2280.0 \n", - " MU 1 402.5 \n", - " DIS 3 1249.5 \n", - " BAC 9 3420.0 \n", - "2023-12-08 AAPL 13 7052.5 \n", - " MSFT 12 4800.0 \n", - " NVDA 18 10485.0 \n", - " HD 4 1910.0 \n", - " BA 3 1455.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2020.0 \n", - " AMD 4 2420.0 \n", - " MU 1 425.0 \n", - " DIS 3 1302.0 \n", - " BAC 9 3573.0 \n", - "2023-12-11 AAPL 13 6500.0 \n", - " MSFT 12 7410.0 \n", - " NVDA 18 9225.0 \n", - " HD 4 1920.0 \n", - " BA 3 1515.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2060.0 \n", - " AMD 4 2650.0 \n", - " MU 1 480.0 \n", - " DIS 3 1249.5 \n", - " BAC 9 3505.5 \n", - "2023-12-12 AAPL 13 6760.0 \n", - " MSFT 12 5040.0 \n", - " NVDA 18 11070.0 \n", - " HD 4 1990.0 \n", - " BA 3 1477.5 \n", - " INTC 0 0.0 \n", - " QCOM 4 1870.0 \n", - " AMD 4 3000.0 \n", - " MU 1 507.5 \n", - " DIS 3 1168.5 \n", - " BAC 9 3411.0 \n", - "2023-12-13 AAPL 13 7215.0 \n", - " MSFT 12 5010.0 \n", - " NVDA 18 10665.0 \n", - " HD 4 2200.0 \n", - " BA 3 1560.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2310.0 \n", - " AMD 4 2830.0 \n", - " MU 1 525.0 \n", - " DIS 3 1275.0 \n", - " BAC 9 4072.5 \n", - "2023-12-14 AAPL 13 7280.0 \n", - " MSFT 12 4920.0 \n", - " NVDA 18 10575.0 \n", - " HD 4 2230.0 \n", - " BA 3 1620.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2400.0 \n", - " AMD 4 2820.0 \n", - " MU 1 562.5 \n", - " DIS 3 1357.5 \n", - " BAC 9 5112.0 \n", - "2023-12-15 AAPL 13 6695.0 \n", - " MSFT 12 3930.0 \n", - " NVDA 18 11835.0 \n", - " HD 4 2620.0 \n", - " BA 3 1650.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2070.0 \n", - " AMD 4 2900.0 \n", - " MU 1 547.5 \n", - " DIS 3 1329.0 \n", - " BAC 9 4914.0 \n", - "2023-12-18 AAPL 13 6857.5 \n", - " MSFT 12 3870.0 \n", - " NVDA 18 11565.0 \n", - " HD 4 2330.0 \n", - " BA 3 1687.5 \n", - " INTC 0 0.0 \n", - " QCOM 4 2210.0 \n", - " AMD 4 2890.0 \n", - " MU 1 540.0 \n", - " DIS 3 1308.0 \n", - " BAC 9 4833.0 \n", - "2023-12-19 AAPL 13 6987.5 \n", - " MSFT 12 4800.0 \n", - " NVDA 18 11025.0 \n", - " HD 4 2320.0 \n", - " BA 3 1710.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2300.0 \n", - " AMD 4 2940.0 \n", - " MU 1 567.5 \n", - " DIS 3 1353.0 \n", - " BAC 9 4882.5 \n", - "2023-12-20 AAPL 13 6630.0 \n", - " MSFT 12 3690.0 \n", - " NVDA 18 11520.0 \n", - " HD 4 2340.0 \n", - " BA 3 1732.5 \n", - " INTC 0 0.0 \n", - " QCOM 4 2180.0 \n", - " AMD 4 2730.0 \n", - " MU 1 472.5 \n", - " DIS 3 1177.5 \n", - " BAC 9 4581.0 \n", - "2023-12-21 AAPL 13 6565.0 \n", - " MSFT 12 5430.0 \n", - " NVDA 18 10980.0 \n", - " HD 4 2400.0 \n", - " BA 3 1312.5 \n", - " INTC 0 0.0 \n", - " QCOM 4 2570.0 \n", - " AMD 4 2980.0 \n", - " MU 1 615.0 \n", - " DIS 3 1207.5 \n", - " BAC 9 4711.5 \n", - "2023-12-22 AAPL 13 5297.5 \n", - " MSFT 12 4620.0 \n", - " NVDA 18 10170.0 \n", - " HD 4 2260.0 \n", - " BA 3 1687.5 \n", - " INTC 0 0.0 \n", - " QCOM 4 2330.0 \n", - " AMD 4 2940.0 \n", - " MU 1 630.0 \n", - " DIS 3 1137.0 \n", - " BAC 9 4806.0 \n", - "2023-12-25 AAPL 13 6272.5 \n", - " MSFT 12 5400.0 \n", - " NVDA 18 11205.0 \n", - " HD 4 2240.0 \n", - " BA 3 1672.5 \n", - " INTC 0 0.0 \n", - " QCOM 4 2270.0 \n", - " AMD 4 3120.0 \n", - " MU 1 647.5 \n", - " DIS 3 1131.0 \n", - " BAC 9 5071.5 \n", - "2023-12-26 AAPL 13 6272.5 \n", - " MSFT 12 5400.0 \n", - " NVDA 18 11205.0 \n", - " HD 4 2240.0 \n", - " BA 3 1672.5 \n", - " INTC 0 0.0 \n", - " QCOM 4 2270.0 \n", - " AMD 4 3120.0 \n", - " MU 1 647.5 \n", - " DIS 3 1131.0 \n", - " BAC 9 5071.5 \n", - "2023-12-27 AAPL 13 6240.0 \n", - " MSFT 12 4770.0 \n", - " NVDA 18 11610.0 \n", - " HD 4 2400.0 \n", - " BA 3 1710.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2310.0 \n", - " AMD 4 3180.0 \n", - " MU 1 640.0 \n", - " DIS 3 1080.0 \n", - " BAC 9 5040.0 \n", - "2023-12-28 AAPL 13 6337.5 \n", - " MSFT 12 4260.0 \n", - " NVDA 18 11520.0 \n", - " HD 4 2290.0 \n", - " BA 3 1777.5 \n", - " INTC 0 0.0 \n", - " QCOM 4 2400.0 \n", - " AMD 4 3330.0 \n", - " MU 1 625.0 \n", - " DIS 3 1075.5 \n", - " BAC 9 5058.0 \n", - "2023-12-29 AAPL 13 5232.5 \n", - " MSFT 12 4800.0 \n", - " NVDA 18 11610.0 \n", - " HD 4 2620.0 \n", - " BA 3 1657.5 \n", - " INTC 0 0.0 \n", - " QCOM 4 2300.0 \n", - " AMD 4 3330.0 \n", - " MU 1 612.5 \n", - " DIS 3 1066.5 \n", - " BAC 9 4909.5 \n", - "2024-01-01 AAPL 13 4842.5 \n", - " MSFT 12 5160.0 \n", - " NVDA 18 10845.0 \n", - " HD 4 2050.0 \n", - " BA 3 1627.5 \n", - " INTC 0 0.0 \n", - " QCOM 4 1950.0 \n", - " AMD 4 2870.0 \n", - " MU 1 600.0 \n", - " DIS 3 1095.0 \n", - " BAC 9 4959.0 \n", - "2024-01-02 AAPL 13 4842.5 \n", - " MSFT 12 5160.0 \n", - " NVDA 18 10845.0 \n", - " HD 4 2050.0 \n", - " BA 3 1627.5 \n", - " INTC 0 0.0 \n", - " QCOM 4 1950.0 \n", - " AMD 4 2870.0 \n", - " MU 1 600.0 \n", - " DIS 3 1095.0 \n", - " BAC 9 4959.0 \n", - "2024-01-03 AAPL 13 4582.5 \n", - " MSFT 12 5370.0 \n", - " NVDA 18 10350.0 \n", - " HD 4 1940.0 \n", - " BA 3 1402.5 \n", - " INTC 0 0.0 \n", - " QCOM 4 1810.0 \n", - " AMD 4 2620.0 \n", - " MU 1 557.5 \n", - " DIS 3 1173.0 \n", - " BAC 9 4864.5 \n", - "2024-01-04 MSFT 12 4650.0 \n", - " NVDA 18 10890.0 \n", - " HD 4 1950.0 \n", - " BA 3 1335.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2100.0 \n", - " AMD 4 2690.0 \n", - " MU 1 565.0 \n", - " DIS 3 1089.0 \n", - " BAC 9 4990.5 \n", - "2024-01-05 MSFT 12 4560.0 \n", - " NVDA 18 11880.0 \n", - " HD 4 2450.0 \n", - " BA 3 1485.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2200.0 \n", - " AMD 4 2890.0 \n", - " MU 1 595.0 \n", - " DIS 3 1101.0 \n", - " BAC 9 5332.5 \n", - "2024-01-08 MSFT 12 5130.0 \n", - " NVDA 18 13050.0 \n", - " HD 4 2180.0 \n", - " BA 3 1207.5 \n", - " INTC 0 0.0 \n", - " QCOM 4 1730.0 \n", - " AMD 4 3250.0 \n", - " MU 1 607.5 \n", - " DIS 3 1107.0 \n", - " BAC 9 5098.5 \n", - "2024-01-09 MSFT 12 5160.0 \n", - " NVDA 18 12645.0 \n", - " HD 4 2570.0 \n", - " BA 3 1177.5 \n", - " INTC 0 0.0 \n", - " QCOM 4 2010.0 \n", - " AMD 4 2950.0 \n", - " MU 1 575.0 \n", - " DIS 3 994.5 \n", - " BAC 9 4873.5 \n", - "2024-01-10 MSFT 12 5910.0 \n", - " NVDA 18 13185.0 \n", - " HD 4 2230.0 \n", - " BA 3 1230.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2170.0 \n", - " AMD 4 3610.0 \n", - " MU 1 552.5 \n", - " BAC 9 4851.0 \n", - "2024-01-11 MSFT 12 5940.0 \n", - " NVDA 18 13500.0 \n", - " HD 4 2210.0 \n", - " BA 3 1042.5 \n", - " INTC 0 0.0 \n", - " QCOM 4 2070.0 \n", - " AMD 4 3310.0 \n", - " MU 1 575.0 \n", - " BAC 9 4545.0 \n", - "2024-01-12 MSFT 12 6270.0 \n", - " NVDA 18 13365.0 \n", - " HD 4 2410.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2050.0 \n", - " AMD 4 3190.0 \n", - " MU 1 552.5 \n", - " BAC 9 4333.5 \n", - "2024-01-15 MSFT 12 6390.0 \n", - " NVDA 18 14310.0 \n", - " HD 4 2650.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 1800.0 \n", - " AMD 4 3630.0 \n", - " MU 1 605.0 \n", - " BAC 9 3960.0 \n", - "2024-01-16 MSFT 12 6390.0 \n", - " NVDA 18 14310.0 \n", - " HD 4 2650.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 1800.0 \n", - " AMD 4 3630.0 \n", - " MU 1 605.0 \n", - " BAC 9 3960.0 \n", - "2024-01-17 MSFT 12 5280.0 \n", - " NVDA 18 14625.0 \n", - " HD 4 2420.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2070.0 \n", - " AMD 4 3790.0 \n", - " MU 1 605.0 \n", - " BAC 9 3798.0 \n", - "2024-01-18 MSFT 12 6510.0 \n", - " NVDA 18 15030.0 \n", - " HD 4 2460.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2360.0 \n", - " AMD 4 3800.0 \n", - " MU 1 600.0 \n", - " BAC 9 3739.5 \n", - "2024-01-19 MSFT 12 7170.0 \n", - " NVDA 18 15120.0 \n", - " HD 4 2360.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2070.0 \n", - " AMD 4 4040.0 \n", - " MU 1 615.0 \n", - " BAC 9 3987.0 \n", - "2024-01-22 MSFT 12 6780.0 \n", - " NVDA 18 15210.0 \n", - " HD 4 2560.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2460.0 \n", - " AMD 4 4030.0 \n", - " MU 1 712.5 \n", - " BAC 9 4149.0 \n", - "2024-01-23 MSFT 12 6120.0 \n", - " NVDA 18 15840.0 \n", - " HD 4 2480.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2720.0 \n", - " AMD 4 3860.0 \n", - " MU 1 652.5 \n", - " BAC 9 4293.0 \n", - "2024-01-24 MSFT 12 8790.0 \n", - " NVDA 18 15255.0 \n", - " HD 4 1730.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2750.0 \n", - " AMD 4 3960.0 \n", - " MU 1 662.5 \n", - " BAC 9 4351.5 \n", - "2024-01-25 MSFT 12 7980.0 \n", - " NVDA 18 16020.0 \n", - " HD 4 2100.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2700.0 \n", - " AMD 4 4500.0 \n", - " MU 1 667.5 \n", - " BAC 9 4603.5 \n", - "2024-01-26 MSFT 12 8430.0 \n", - " NVDA 18 15390.0 \n", - " HD 4 2250.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2710.0 \n", - " AMD 4 4320.0 \n", - " MU 1 660.0 \n", - " BAC 9 4648.5 \n", - " GOOG 8 3960.0 \n", - "2024-01-29 MSFT 12 9540.0 \n", - " NVDA 18 15705.0 \n", - " HD 4 2120.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2250.0 \n", - " AMD 4 4390.0 \n", - " MU 1 682.5 \n", - " BAC 9 4729.5 \n", - " GOOG 8 4580.0 \n", - "2024-01-30 MSFT 12 9570.0 \n", - " NVDA 18 15750.0 \n", - " HD 4 2340.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2270.0 \n", - " AMD 4 4280.0 \n", - " MU 1 587.5 \n", - " BAC 9 5323.5 \n", - " GOOG 8 3360.0 \n", - "2024-01-31 MSFT 12 6930.0 \n", - " NVDA 18 15525.0 \n", - " HD 4 2150.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2930.0 \n", - " AMD 4 4000.0 \n", - " MU 1 615.0 \n", - " BAC 9 4666.5 \n", - "2024-02-01 MSFT 12 7290.0 \n", - " NVDA 18 15390.0 \n", - " HD 4 2460.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2300.0 \n", - " AMD 4 4170.0 \n", - " MU 1 572.5 \n", - " BAC 9 4765.5 \n", - "2024-02-02 MSFT 12 8130.0 \n", - " NVDA 18 16740.0 \n", - " HD 4 2500.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2240.0 \n", - " AMD 4 4330.0 \n", - " MU 1 637.5 \n", - " BAC 9 4738.5 \n", - "2024-02-05 MSFT 12 7530.0 \n", - " NVDA 18 17055.0 \n", - " HD 4 2320.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2480.0 \n", - " AMD 4 4440.0 \n", - " MU 1 647.5 \n", - " BAC 9 4437.0 \n", - "2024-02-06 MSFT 12 8640.0 \n", - " NVDA 18 15795.0 \n", - " HD 4 2390.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2170.0 \n", - " AMD 4 4100.0 \n", - " MU 1 595.0 \n", - " BAC 9 4441.5 \n", - "2024-02-07 MSFT 12 8670.0 \n", - " NVDA 18 16695.0 \n", - " HD 4 2490.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2400.0 \n", - " AMD 4 4200.0 \n", - " MU 1 607.5 \n", - " DIS 2 985.0 \n", - " BAC 9 4522.5 \n", - "2024-02-08 MSFT 12 8430.0 \n", - " AMZN 3 1492.5 \n", - " NVDA 18 16200.0 \n", - " HD 4 2410.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2580.0 \n", - " AMD 4 4270.0 \n", - " MU 1 595.0 \n", - " DIS 2 1525.0 \n", - " BAC 9 4486.5 \n", - "2024-02-09 MSFT 12 8310.0 \n", - " AMZN 3 1702.5 \n", - " NVDA 18 18045.0 \n", - " HD 4 2490.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2350.0 \n", - " AMD 4 4490.0 \n", - " MU 1 562.5 \n", - " DIS 2 1417.0 \n", - " BAC 9 4446.0 \n", - "2024-02-12 MSFT 12 8490.0 \n", - " AMZN 3 1612.5 \n", - " NVDA 18 16650.0 \n", - " HD 4 2560.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2570.0 \n", - " AMD 4 4310.0 \n", - " MU 1 615.0 \n", - " DIS 2 1452.0 \n", - " BAC 9 4702.5 \n", - "2024-02-13 MSFT 12 7980.0 \n", - " AMZN 3 1455.0 \n", - " NVDA 18 15975.0 \n", - " HD 4 2360.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2570.0 \n", - " AMD 4 4230.0 \n", - " MU 1 542.5 \n", - " DIS 2 1525.0 \n", - " BAC 9 4270.5 \n", - "2024-02-14 MSFT 12 7470.0 \n", - " AMZN 3 1545.0 \n", - " NVDA 18 16290.0 \n", - " HD 4 2360.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2750.0 \n", - " AMD 4 4310.0 \n", - " MU 1 537.5 \n", - " DIS 2 1585.0 \n", - " BAC 9 4477.5 \n", - "2024-02-15 MSFT 12 7650.0 \n", - " AMZN 3 1485.0 \n", - " NVDA 18 17010.0 \n", - " HD 4 2540.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2630.0 \n", - " AMD 4 4490.0 \n", - " MU 1 530.0 \n", - " DIS 2 1645.0 \n", - " BAC 9 5022.0 \n", - "2024-02-16 MSFT 12 7110.0 \n", - " AMZN 3 1500.0 \n", - " NVDA 18 16515.0 \n", - " HD 4 2850.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2800.0 \n", - " AMD 4 4240.0 \n", - " MU 1 487.5 \n", - " DIS 2 1580.0 \n", - " BAC 9 5031.0 \n", - "2024-02-19 MSFT 12 7350.0 \n", - " AMZN 3 1372.5 \n", - " NVDA 18 15435.0 \n", - " HD 4 2470.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2590.0 \n", - " AMD 4 3940.0 \n", - " MU 1 510.0 \n", - " DIS 2 1450.0 \n", - " BAC 9 4963.5 \n", - "2024-02-20 MSFT 12 7350.0 \n", - " AMZN 3 1372.5 \n", - " NVDA 18 15435.0 \n", - " HD 4 2470.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2590.0 \n", - " AMD 4 3940.0 \n", - " MU 1 510.0 \n", - " DIS 2 1450.0 \n", - " BAC 9 4963.5 \n", - "2024-02-21 MSFT 12 7260.0 \n", - " AMZN 3 1432.5 \n", - " NVDA 18 16245.0 \n", - " HD 4 2830.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2370.0 \n", - " AMD 4 3790.0 \n", - " MU 1 517.5 \n", - " DIS 2 1318.0 \n", - " BAC 9 4833.0 \n", - "2024-02-22 MSFT 12 8130.0 \n", - " AMZN 3 1710.0 \n", - " NVDA 18 18945.0 \n", - " HD 4 2990.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2570.0 \n", - " AMD 4 4530.0 \n", - " MU 1 605.0 \n", - " DIS 2 1315.0 \n", - " BAC 9 4738.5 \n", - "2024-02-23 MSFT 12 8040.0 \n", - " AMZN 3 1717.5 \n", - " NVDA 18 16650.0 \n", - " HD 4 2720.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2290.0 \n", - " AMD 4 4300.0 \n", - " MU 1 610.0 \n", - " DIS 2 1318.0 \n", - " BAC 9 4914.0 \n", - "2024-02-26 MSFT 12 7740.0 \n", - " AMZN 3 1717.5 \n", - " NVDA 18 15615.0 \n", - " HD 4 2550.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2640.0 \n", - " AMD 4 4270.0 \n", - " MU 1 662.5 \n", - " DIS 2 1408.0 \n", - " BAC 9 4725.0 \n", - "2024-02-27 MSFT 12 7680.0 \n", - " AMZN 3 1642.5 \n", - " NVDA 18 17640.0 \n", - " HD 4 2740.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2520.0 \n", - " AMD 4 4790.0 \n", - " MU 1 710.0 \n", - " DIS 2 1421.0 \n", - " BAC 9 5098.5 \n", - "2024-02-28 MSFT 12 7740.0 \n", - " AMZN 3 1627.5 \n", - " NVDA 18 17280.0 \n", - " HD 4 2780.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2780.0 \n", - " AMD 4 4480.0 \n", - " MU 1 647.5 \n", - " DIS 2 1520.0 \n", - " BAC 9 5125.5 \n", - "2024-02-29 MSFT 12 8310.0 \n", - " AMZN 3 1747.5 \n", - " NVDA 18 17685.0 \n", - " HD 4 3200.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2520.0 \n", - " AMD 4 4670.0 \n", - " MU 1 682.5 \n", - " DIS 2 1650.0 \n", - " BAC 9 5301.0 \n", - "2024-03-01 MSFT 12 7200.0 \n", - " AMZN 3 1875.0 \n", - " NVDA 18 18225.0 \n", - " HD 4 2940.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2960.0 \n", - " AMD 4 4680.0 \n", - " MU 1 700.0 \n", - " DIS 2 1565.0 \n", - " BAC 9 5260.5 \n", - "2024-03-04 MSFT 12 8310.0 \n", - " AMZN 3 1830.0 \n", - " NVDA 18 17280.0 \n", - " HD 4 2550.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2930.0 \n", - " AMD 4 4840.0 \n", - " MU 1 762.5 \n", - " DIS 2 1655.0 \n", - " BAC 9 5764.5 \n", - "2024-03-05 MSFT 12 7230.0 \n", - " AMZN 3 1657.5 \n", - " NVDA 18 17775.0 \n", - " HD 4 2810.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 3070.0 \n", - " AMD 4 5330.0 \n", - " MU 1 737.5 \n", - " DIS 2 1645.0 \n", - " BAC 9 5859.0 \n", - "2024-03-06 MSFT 12 7110.0 \n", - " AMZN 3 1627.5 \n", - " NVDA 18 16740.0 \n", - " HD 4 2890.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2670.0 \n", - " AMD 4 5010.0 \n", - " MU 1 725.0 \n", - " DIS 2 1440.0 \n", - " BAC 9 5841.0 \n", - "2024-03-07 MSFT 12 7890.0 \n", - " AMZN 3 1792.5 \n", - " NVDA 18 16830.0 \n", - " HD 4 2840.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 3110.0 \n", - " AMD 4 5080.0 \n", - " MU 1 765.0 \n", - " DIS 2 1490.0 \n", - " BAC 9 5944.5 \n", - "2024-03-08 MSFT 12 7500.0 \n", - " AMZN 3 1717.5 \n", - " NVDA 18 19890.0 \n", - " HD 4 2760.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2730.0 \n", - " AMD 4 5000.0 \n", - " MU 1 780.0 \n", - " DIS 2 1400.0 \n", - " BAC 9 5958.0 \n", - "2024-03-11 MSFT 12 7230.0 \n", - " AMZN 3 1552.5 \n", - " NVDA 18 15345.0 \n", - " HD 4 2540.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2930.0 \n", - " AMD 4 4720.0 \n", - " MU 1 682.5 \n", - " DIS 2 1600.0 \n", - " BAC 9 6115.5 \n", - "2024-03-12 MSFT 12 8430.0 \n", - " AMZN 3 1702.5 \n", - " NVDA 18 17010.0 \n", - " HD 4 2720.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2560.0 \n", - " AMD 4 4760.0 \n", - " MU 1 767.5 \n", - " DIS 2 1620.0 \n", - " BAC 9 6016.5 \n", - "2024-03-13 MSFT 12 8370.0 \n", - " AMZN 3 1770.0 \n", - " NVDA 18 17730.0 \n", - " HD 4 2930.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2750.0 \n", - " AMD 4 4770.0 \n", - " MU 1 715.0 \n", - " DIS 2 1605.0 \n", - " BAC 9 6043.5 \n", - "2024-03-14 MSFT 12 10740.0 \n", - " AMZN 3 1890.0 \n", - " NVDA 18 18990.0 \n", - " HD 4 2560.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2750.0 \n", - " AMD 4 4700.0 \n", - " MU 1 702.5 \n", - " DIS 2 1580.0 \n", - " BAC 9 5589.0 \n", - "2024-03-15 MSFT 12 8490.0 \n", - " AMZN 3 1672.5 \n", - " NVDA 18 17370.0 \n", - " HD 4 2830.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 3010.0 \n", - " AMD 4 4460.0 \n", - " MU 1 700.0 \n", - " DIS 2 1630.0 \n", - " BAC 9 5553.0 \n", - "2024-03-18 MSFT 12 8670.0 \n", - " AMZN 3 1657.5 \n", - " NVDA 18 17370.0 \n", - " HD 4 2700.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2670.0 \n", - " AMD 4 4660.0 \n", - " MU 1 695.0 \n", - " DIS 2 1700.0 \n", - " BAC 9 6192.0 \n", - "2024-03-19 MSFT 12 9000.0 \n", - " AMZN 3 1725.0 \n", - " NVDA 18 13410.0 \n", - " HD 4 2830.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 3350.0 \n", - " AMD 4 4660.0 \n", - " MU 1 712.5 \n", - " DIS 2 1740.0 \n", - " BAC 9 6214.5 \n", - "2024-03-20 MSFT 12 9750.0 \n", - " AMZN 3 1852.5 \n", - " NVDA 18 17550.0 \n", - " HD 4 2880.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2930.0 \n", - " AMD 4 4550.0 \n", - " MU 1 800.0 \n", - " DIS 2 1900.0 \n", - " BAC 9 6619.5 \n", - "2024-03-21 MSFT 12 9930.0 \n", - " AMZN 3 1830.0 \n", - " NVDA 18 17595.0 \n", - " HD 4 3020.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2970.0 \n", - " AMD 4 4160.0 \n", - " MU 1 917.5 \n", - " DIS 2 1845.0 \n", - " BAC 9 6826.5 \n", - "2024-03-22 MSFT 12 9750.0 \n", - " AMZN 3 1867.5 \n", - " NVDA 18 16425.0 \n", - " HD 4 3050.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 3390.0 \n", - " AMD 4 4680.0 \n", - " MU 1 932.5 \n", - " DIS 2 1915.0 \n", - " BAC 9 6790.5 \n", - "2024-03-25 MSFT 12 9060.0 \n", - " AMZN 3 1920.0 \n", - " NVDA 18 17550.0 \n", - " HD 4 2940.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2970.0 \n", - " AMD 4 4550.0 \n", - " MU 1 1025.0 \n", - " DIS 2 2140.0 \n", - " BAC 9 6646.5 \n", - "2024-03-26 MSFT 12 8760.0 \n", - " AMZN 3 1845.0 \n", - " NVDA 18 16785.0 \n", - " HD 4 2750.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2900.0 \n", - " AMD 4 4700.0 \n", - " MU 1 1040.0 \n", - " DIS 2 2120.0 \n", - " BAC 9 6786.0 \n", - "2024-03-27 MSFT 12 8850.0 \n", - " AMZN 3 1912.5 \n", - " NVDA 18 17100.0 \n", - " HD 4 3210.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 2950.0 \n", - " AMD 4 4420.0 \n", - " MU 1 1050.0 \n", - " DIS 2 2170.0 \n", - " BAC 9 7200.0 \n", - "2024-03-28 MSFT 12 8340.0 \n", - " AMZN 3 1927.5 \n", - " NVDA 18 17100.0 \n", - " HD 4 2940.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 3250.0 \n", - " AMD 4 4980.0 \n", - " MU 1 1042.5 \n", - " DIS 2 2225.0 \n", - " BAC 9 7078.5 \n", - "2024-03-29 MSFT 12 8340.0 \n", - " AMZN 3 1927.5 \n", - " NVDA 18 17100.0 \n", - " HD 4 2940.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 3250.0 \n", - " AMD 4 4980.0 \n", - " MU 1 1042.5 \n", - " DIS 2 2225.0 \n", - " BAC 9 7078.5 \n", - "2024-04-01 MSFT 12 9360.0 \n", - " AMZN 3 1965.0 \n", - " NVDA 18 17640.0 \n", - " HD 4 2620.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 3370.0 \n", - " AMD 4 4600.0 \n", - " MU 1 1072.5 \n", - " DIS 2 2195.0 \n", - " BAC 9 7056.0 \n", - "2024-04-02 MSFT 12 8910.0 \n", - " AMZN 3 1957.5 \n", - " NVDA 18 17730.0 \n", - " HD 4 2530.0 \n", - " WMT 0 0.0 \n", - " INTC 0 0.0 \n", - " QCOM 4 3010.0 \n", - " AMD 4 4490.0 \n", - " MU 1 1080.0 \n", - " DIS 2 2190.0 \n", - " BAC 9 6912.0 \n", - "2024-04-03 MSFT 12 8370.0 \n", - " AMZN 3 2032.5 \n", - " NVDA 18 17595.0 \n", - " HD 4 2470.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3050.0 \n", - " AMD 4 4570.0 \n", - " MU 1 1152.5 \n", - " DIS 2 2110.0 \n", - " BAC 9 7074.0 \n", - "2024-04-04 MSFT 12 8550.0 \n", - " AMZN 3 1920.0 \n", - " NVDA 18 16740.0 \n", - " HD 4 2430.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3110.0 \n", - " AMD 4 4230.0 \n", - " MU 1 1050.0 \n", - " DIS 2 1875.0 \n", - " BAC 9 6282.0 \n", - "2024-04-05 MSFT 12 9360.0 \n", - " AMZN 3 2197.5 \n", - " NVDA 18 17595.0 \n", - " HD 4 2480.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 2820.0 \n", - " AMD 4 4250.0 \n", - " MU 1 1065.0 \n", - " DIS 2 2050.0 \n", - " BAC 9 6759.0 \n", - "2024-04-08 MSFT 12 9240.0 \n", - " AMZN 3 2212.5 \n", - " NVDA 18 16695.0 \n", - " HD 4 2320.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3050.0 \n", - " AMD 4 4340.0 \n", - " MU 1 1057.5 \n", - " DIS 2 1905.0 \n", - " BAC 9 6961.5 \n", - "2024-04-09 MSFT 12 9510.0 \n", - " AMZN 3 2235.0 \n", - " NVDA 18 19080.0 \n", - " HD 4 2200.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3230.0 \n", - " AMD 4 4310.0 \n", - " MU 1 1102.5 \n", - " DIS 2 1960.0 \n", - " BAC 9 7132.5 \n", - "2024-04-10 MSFT 12 9150.0 \n", - " AMZN 3 2250.0 \n", - " NVDA 18 18090.0 \n", - " HD 4 2310.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 2930.0 \n", - " AMD 4 4220.0 \n", - " MU 1 1087.5 \n", - " DIS 2 1890.0 \n", - " BAC 9 6520.5 \n", - "2024-04-11 MSFT 12 9720.0 \n", - " AMZN 3 2422.5 \n", - " NVDA 18 17505.0 \n", - " HD 4 2200.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3280.0 \n", - " AMD 4 4250.0 \n", - " MU 1 1127.5 \n", - " DIS 2 1860.0 \n", - " BAC 9 6309.0 \n", - "2024-04-12 MSFT 12 9180.0 \n", - " AMZN 3 2272.5 \n", - " NVDA 18 18900.0 \n", - " HD 4 2010.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3290.0 \n", - " AMD 4 4020.0 \n", - " MU 1 1107.5 \n", - " DIS 2 1765.0 \n", - " BAC 9 5854.5 \n", - "2024-04-15 MSFT 12 8130.0 \n", - " AMZN 3 2130.0 \n", - " NVDA 18 17730.0 \n", - " HD 4 1850.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3190.0 \n", - " AMD 4 3860.0 \n", - " MU 1 1047.5 \n", - " DIS 2 1605.0 \n", - " BAC 9 6057.0 \n", - "2024-04-16 MSFT 12 8250.0 \n", - " AMZN 3 2115.0 \n", - " NVDA 18 18045.0 \n", - " HD 4 2290.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 2930.0 \n", - " AMD 4 4090.0 \n", - " MU 1 1202.5 \n", - " DIS 2 1595.0 \n", - " BAC 9 5319.0 \n", - "2024-04-17 MSFT 12 8010.0 \n", - " AMZN 3 2002.5 \n", - " NVDA 18 17325.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3070.0 \n", - " AMD 4 3630.0 \n", - " MU 1 1032.5 \n", - " DIS 2 1600.0 \n", - " BAC 9 5670.0 \n", - "2024-04-18 MSFT 12 7290.0 \n", - " AMZN 3 1897.5 \n", - " NVDA 18 16155.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 2530.0 \n", - " AMD 4 3890.0 \n", - " MU 1 942.5 \n", - " DIS 2 1540.0 \n", - " BAC 9 5971.5 \n", - "2024-04-19 MSFT 12 6570.0 \n", - " AMZN 3 1657.5 \n", - " NVDA 18 17595.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 2630.0 \n", - " AMD 4 3280.0 \n", - " MU 1 957.5 \n", - " DIS 2 1565.0 \n", - " BAC 9 6664.5 \n", - "2024-04-22 MSFT 12 6810.0 \n", - " AMZN 3 1777.5 \n", - " NVDA 18 22185.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 2850.0 \n", - " AMD 4 3390.0 \n", - " MU 1 930.0 \n", - " DIS 2 1530.0 \n", - " BAC 9 7105.5 \n", - "2024-04-23 MSFT 12 7440.0 \n", - " AMZN 3 1890.0 \n", - " NVDA 18 18585.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 2820.0 \n", - " AMD 4 3630.0 \n", - " MU 1 1037.5 \n", - " DIS 2 1630.0 \n", - " BAC 9 7465.5 \n", - "2024-04-24 MSFT 12 7590.0 \n", - " AMZN 3 1702.5 \n", - " NVDA 18 17820.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 2730.0 \n", - " AMD 4 3660.0 \n", - " MU 1 1012.5 \n", - " DIS 2 1645.0 \n", - " BAC 9 7443.0 \n", - "2024-04-25 MSFT 12 6840.0 \n", - " AMZN 3 1590.0 \n", - " NVDA 18 15885.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 2880.0 \n", - " AMD 4 3620.0 \n", - " MU 1 952.5 \n", - " DIS 2 1565.0 \n", - " BAC 9 7195.5 \n", - "2024-04-26 MSFT 12 7170.0 \n", - " AMZN 3 1905.0 \n", - " NVDA 18 19935.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 2870.0 \n", - " AMD 4 4050.0 \n", - " MU 1 1027.5 \n", - " DIS 2 1565.0 \n", - " BAC 9 7330.5 \n", - "2024-04-29 MSFT 12 6450.0 \n", - " AMZN 3 1972.5 \n", - " NVDA 18 17640.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 2970.0 \n", - " AMD 4 4010.0 \n", - " MU 1 1015.0 \n", - " DIS 2 1500.0 \n", - " BAC 9 7011.0 \n", - "2024-04-30 MSFT 12 5370.0 \n", - " AMZN 3 1650.0 \n", - " NVDA 18 15930.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 2950.0 \n", - " AMD 4 3900.0 \n", - " MU 1 982.5 \n", - " DIS 2 1375.0 \n", - " BAC 9 6682.5 \n", - "2024-05-01 MSFT 12 5940.0 \n", - " AMZN 3 1807.5 \n", - " NVDA 18 16785.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 2540.0 \n", - " AMD 4 3240.0 \n", - " MU 1 962.5 \n", - " DIS 2 1413.0 \n", - " BAC 9 6228.0 \n", - "2024-05-02 MSFT 12 6240.0 \n", - " AMZN 3 2152.5 \n", - " NVDA 18 17910.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3180.0 \n", - " AMD 4 3250.0 \n", - " MU 1 987.5 \n", - " DIS 2 1550.0 \n", - " BAC 9 6498.0 \n", - "2024-05-03 MSFT 12 7080.0 \n", - " AMZN 3 2190.0 \n", - " NVDA 18 18720.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3190.0 \n", - " AMD 4 3600.0 \n", - " MU 1 1065.0 \n", - " DIS 2 1610.0 \n", - " BAC 9 6799.5 \n", - "2024-05-06 MSFT 12 7770.0 \n", - " AMZN 3 2340.0 \n", - " NVDA 18 17910.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3370.0 \n", - " AMD 4 3890.0 \n", - " MU 1 1122.5 \n", - " DIS 2 1805.0 \n", - " BAC 9 7092.0 \n", - "2024-05-07 MSFT 12 7230.0 \n", - " AMZN 3 2332.5 \n", - " NVDA 18 16020.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3310.0 \n", - " AMD 4 3900.0 \n", - " MU 1 1070.0 \n", - " DIS 2 989.0 \n", - " BAC 9 7222.5 \n", - "2024-05-08 MSFT 12 7350.0 \n", - " AMZN 3 2287.5 \n", - " NVDA 18 18045.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3230.0 \n", - " AMD 4 3910.0 \n", - " MU 1 1090.0 \n", - " DIS 2 1003.0 \n", - " BAC 9 7101.0 \n", - "2024-05-09 MSFT 12 7530.0 \n", - " AMZN 3 2355.0 \n", - " NVDA 18 18360.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3390.0 \n", - " AMD 4 3560.0 \n", - " MU 1 1057.5 \n", - " DIS 2 995.0 \n", - " BAC 9 7578.0 \n", - "2024-05-10 MSFT 12 7740.0 \n", - " AMZN 3 2220.0 \n", - " NVDA 18 17100.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3270.0 \n", - " AMD 4 3760.0 \n", - " MU 1 1115.0 \n", - " DIS 2 991.0 \n", - " BAC 9 7677.0 \n", - "2024-05-13 MSFT 12 7800.0 \n", - " AMZN 3 2175.0 \n", - " NVDA 18 18045.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3680.0 \n", - " AMD 4 3900.0 \n", - " MU 1 1137.5 \n", - " DIS 2 978.0 \n", - " BAC 9 7438.5 \n", - "2024-05-14 MSFT 12 7980.0 \n", - " AMZN 3 2182.5 \n", - " NVDA 18 18135.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3770.0 \n", - " AMD 4 3880.0 \n", - " MU 1 1055.0 \n", - " DIS 2 929.0 \n", - " BAC 9 7564.5 \n", - "2024-05-15 MSFT 12 8910.0 \n", - " AMZN 3 2107.5 \n", - " NVDA 18 18135.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3790.0 \n", - " AMD 4 4260.0 \n", - " MU 1 1190.0 \n", - " DIS 2 770.0 \n", - " BAC 9 7866.0 \n", - "2024-05-16 MSFT 12 8730.0 \n", - " AMZN 3 1965.0 \n", - " NVDA 18 18180.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3560.0 \n", - " AMD 4 4350.0 \n", - " MU 1 1147.5 \n", - " BAC 9 8019.0 \n", - "2024-05-17 MSFT 12 8070.0 \n", - " AMZN 3 2010.0 \n", - " NVDA 18 17955.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3350.0 \n", - " AMD 4 4450.0 \n", - " MU 1 1145.0 \n", - " BAC 9 8082.0 \n", - "2024-05-20 MSFT 12 9030.0 \n", - " AMZN 3 1927.5 \n", - " NVDA 18 18495.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3590.0 \n", - " AMD 4 4500.0 \n", - " MU 1 1167.5 \n", - " BAC 9 7807.5 \n", - "2024-05-21 AAPL 9 4491.0 \n", - " MSFT 12 9480.0 \n", - " AMZN 3 1905.0 \n", - " NVDA 18 18540.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3350.0 \n", - " AMD 4 4460.0 \n", - " MU 1 1105.0 \n", - " BAC 9 8176.5 \n", - "2024-05-22 AAPL 9 3645.0 \n", - " MSFT 12 10680.0 \n", - " AMZN 3 1897.5 \n", - " NVDA 18 17640.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3660.0 \n", - " AMD 4 4500.0 \n", - " MU 1 1140.0 \n", - " BAC 9 7821.0 \n", - "2024-05-23 AAPL 9 3618.0 \n", - " MSFT 12 9240.0 \n", - " AMZN 3 1762.5 \n", - " NVDA 18 16200.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3530.0 \n", - " AMD 4 4280.0 \n", - " MU 1 1150.0 \n", - " BAC 9 7974.0 \n", - "2024-05-24 AAPL 9 4153.5 \n", - " MSFT 12 9390.0 \n", - " AMZN 3 1732.5 \n", - " NVDA 18 20070.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3590.0 \n", - " AMD 4 4600.0 \n", - " MU 1 1240.0 \n", - " BAC 9 8248.5 \n", - "2024-05-27 AAPL 9 4194.0 \n", - " MSFT 12 9660.0 \n", - " AMZN 3 1815.0 \n", - " NVDA 18 19440.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3420.0 \n", - " AMD 4 4790.0 \n", - " MU 1 1200.0 \n", - " BAC 9 8131.5 \n", - "2024-05-28 AAPL 9 4194.0 \n", - " MSFT 12 9660.0 \n", - " AMZN 3 1815.0 \n", - " NVDA 18 19440.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3420.0 \n", - " AMD 4 4790.0 \n", - " MU 1 1200.0 \n", - " BAC 9 8131.5 \n", - "2024-05-29 AAPL 9 4248.0 \n", - " MSFT 12 9510.0 \n", - " AMZN 3 1822.5 \n", - " NVDA 18 19260.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3200.0 \n", - " AMD 4 4470.0 \n", - " MU 1 1205.0 \n", - " BAC 9 7704.0 \n", - "2024-05-30 AAPL 9 4468.5 \n", - " MSFT 12 7710.0 \n", - " AMZN 3 1657.5 \n", - " NVDA 18 17865.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3630.0 \n", - " AMD 4 4600.0 \n", - " MU 1 1212.5 \n", - " BAC 9 7794.0 \n", - "2024-05-31 AAPL 9 4590.0 \n", - " MSFT 12 7680.0 \n", - " AMZN 3 1470.0 \n", - " NVDA 18 18315.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3660.0 \n", - " AMD 4 4580.0 \n", - " MU 1 1117.5 \n", - " BAC 9 8491.5 \n", - "2024-06-03 AAPL 9 4815.0 \n", - " MSFT 12 7380.0 \n", - " AMZN 3 1575.0 \n", - " NVDA 18 17865.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3550.0 \n", - " AMD 4 4410.0 \n", - " MU 1 1162.5 \n", - " BAC 9 7488.0 \n", - "2024-06-04 AAPL 9 4716.0 \n", - " MSFT 12 7620.0 \n", - " AMZN 3 1612.5 \n", - " NVDA 18 17775.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3550.0 \n", - " AMD 4 4260.0 \n", - " MU 1 1140.0 \n", - " BAC 9 7897.5 \n", - "2024-06-05 AAPL 9 5040.0 \n", - " MSFT 12 7950.0 \n", - " AMZN 3 1725.0 \n", - " NVDA 18 20025.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3710.0 \n", - " AMD 4 4600.0 \n", - " MU 1 1192.5 \n", - " BAC 9 8388.0 \n", - "2024-06-06 AAPL 9 4801.5 \n", - " MSFT 12 8700.0 \n", - " AMZN 3 1950.0 \n", - " NVDA 18 18450.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3540.0 \n", - " AMD 4 4540.0 \n", - " MU 1 1182.5 \n", - " BAC 9 8280.0 \n", - "2024-06-07 AAPL 9 5175.0 \n", - " MSFT 12 8490.0 \n", - " AMZN 3 1897.5 \n", - " NVDA 18 18360.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3680.0 \n", - " AMD 4 4660.0 \n", - " MU 1 1202.5 \n", - " BAC 9 8478.0 \n", - "2024-06-10 AAPL 9 4509.0 \n", - " MSFT 12 9090.0 \n", - " AMZN 3 2070.0 \n", - " NVDA 18 18360.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3600.0 \n", - " AMD 4 4310.0 \n", - " MU 1 1197.5 \n", - " BAC 9 8487.0 \n", - "2024-06-11 AAPL 9 6952.5 \n", - " MSFT 12 9630.0 \n", - " AMZN 3 2062.5 \n", - " NVDA 18 18360.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3610.0 \n", - " AMD 4 4270.0 \n", - " MU 1 1210.0 \n", - " BAC 9 7920.0 \n", - "2024-06-12 AAPL 9 8910.0 \n", - " MSFT 12 10590.0 \n", - " AMZN 3 2032.5 \n", - " NVDA 18 18360.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3680.0 \n", - " AMD 4 4410.0 \n", - " MU 1 1275.0 \n", - " BAC 9 8280.0 \n", - "2024-06-13 AAPL 9 8730.0 \n", - " MSFT 12 10500.0 \n", - " AMZN 3 1837.5 \n", - " NVDA 18 18360.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3830.0 \n", - " AMD 4 4370.0 \n", - " MU 1 1250.0 \n", - " BAC 9 8176.5 \n", - "2024-06-14 AAPL 9 8370.0 \n", - " MSFT 12 10860.0 \n", - " AMZN 3 1837.5 \n", - " NVDA 18 18360.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3680.0 \n", - " AMD 4 4350.0 \n", - " MU 1 1220.0 \n", - " BAC 9 8131.5 \n", - "2024-06-17 AAPL 9 9180.0 \n", - " MSFT 12 11730.0 \n", - " AMZN 3 1852.5 \n", - " NVDA 18 18360.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3690.0 \n", - " AMD 4 4260.0 \n", - " MU 1 1315.0 \n", - " BAC 9 8316.0 \n", - "2024-06-18 AAPL 9 8887.5 \n", - " MSFT 12 11100.0 \n", - " AMZN 3 1755.0 \n", - " NVDA 18 18360.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3720.0 \n", - " AMD 4 4030.0 \n", - " MU 1 1287.5 \n", - " BAC 9 8694.0 \n", - "2024-06-19 AAPL 9 7560.0 \n", - " MSFT 12 11250.0 \n", - " AMZN 3 1957.5 \n", - " NVDA 18 18360.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3710.0 \n", - " AMD 4 4410.0 \n", - " MU 1 1270.0 \n", - " BAC 9 8685.0 \n", - "2024-06-20 AAPL 9 7560.0 \n", - " MSFT 12 11250.0 \n", - " AMZN 3 1957.5 \n", - " NVDA 18 18360.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3710.0 \n", - " AMD 4 4410.0 \n", - " MU 1 1270.0 \n", - " BAC 9 8685.0 \n", - "2024-06-21 AAPL 9 6885.0 \n", - " MSFT 12 12060.0 \n", - " AMZN 3 2122.5 \n", - " NVDA 18 18360.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3590.0 \n", - " AMD 4 4400.0 \n", - " MU 1 1222.5 \n", - " BAC 9 8289.0 \n", - "2024-06-24 AAPL 9 6570.0 \n", - " MSFT 12 11940.0 \n", - " AMZN 3 1905.0 \n", - " NVDA 18 18360.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3560.0 \n", - " AMD 4 4350.0 \n", - " MU 1 1310.0 \n", - " BAC 9 8572.5 \n", - "2024-06-25 AAPL 9 7380.0 \n", - " MSFT 12 12120.0 \n", - " AMZN 3 1950.0 \n", - " NVDA 18 18360.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3190.0 \n", - " AMD 4 4410.0 \n", - " MU 1 1222.5 \n", - " BAC 9 8676.0 \n", - "2024-06-26 AAPL 9 8212.5 \n", - " MSFT 12 12090.0 \n", - " AMZN 3 2415.0 \n", - " NVDA 18 18360.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3260.0 \n", - " AMD 4 4260.0 \n", - " MU 1 1262.5 \n", - " BAC 9 7969.5 \n", - "2024-06-27 AAPL 9 8392.5 \n", - " MSFT 12 11550.0 \n", - " AMZN 3 2715.0 \n", - " NVDA 18 18360.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3780.0 \n", - " AMD 4 4390.0 \n", - " MU 1 1222.5 \n", - " BAC 9 8451.0 \n", - "2024-06-28 AAPL 9 7875.0 \n", - " MSFT 12 12360.0 \n", - " AMZN 3 2332.5 \n", - " NVDA 18 18360.0 \n", - " WMT 0 0.0 \n", - " QCOM 4 3920.0 \n", - " AMD 4 4560.0 \n", - " MU 1 1210.0 \n", - " BAC 9 8185.5 " - ] - }, - "execution_count": 89, - "metadata": {}, - "output_type": "execute_result" - }, - { - "ename": "", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[1;31mThe Kernel crashed while executing code in the current cell or a previous cell. \n", - "\u001b[1;31mPlease review the code in the cell(s) to identify a possible cause of the failure. \n", - "\u001b[1;31mClick here for more info. \n", - "\u001b[1;31mView Jupyter log for further details." - ] - } - ], - "source": [ - "\n", - "pd.set_option('display.max_rows', 10000)\n", - "evb_backtest.portfolio.get_all_positions()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": ".venv", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.11" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/EventDriven/demos/demo_chidi_mino.ipynb b/EventDriven/demos/demo_chidi_mino.ipynb deleted file mode 100644 index b3f841b..0000000 --- a/EventDriven/demos/demo_chidi_mino.ipynb +++ /dev/null @@ -1,11780 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Console Logging & File Logging Can be configured using STREAM_LOG_LEVEL and FILE_LOG_LEVEL in environment variables.\n", - "Propagate to root logger can be set using PROPAGATE_TO_ROOT_LOGGER in environment variables.\n", - "Example:\n", - "STREAM_LOG_LEVEL = 'DEBUG'\n", - "FILE_LOG_LEVEL = 'INFO'\n", - "PROPAGATE_TO_ROOT_LOGGER = 'False'\n", - "\n", - "2025-02-26 06:59:49 trade.helpers.Logging INFO: Logging Root Directory: /Users/chiemelienwanisobi/cloned_repos/QuantTools/logs\n", - "Using Proxy URL: http://18.232.166.224:5500/thetadata\n" - ] - } - ], - "source": [ - "\n", - "from dotenv import load_dotenv\n", - "load_dotenv()\n", - "import os\n", - "import sys\n", - "sys.path.append(\n", - " os.environ.get('WORK_DIR')) #type: ignore\n", - "sys.path.append(\n", - " os.environ.get('DBASE_DIR')) #type: ignore\n", - "from dbase.DataAPI.ThetaData import * #type: ignore\n", - "from dbase.database.SQLHelpers import * #type: ignore\n", - "import pandas as pd\n", - "from EventDriven.data import HistoricTradeDataHandler\n", - "from EventDriven.event import *\n", - "from queue import Queue\n", - "from trade.backtester_.backtester_ import PTDataset, PTBacktester\n", - "import pandas_ta as ta\n", - "from trade.assets.Stock import Stock\n", - "from trade.backtester_.utils.WalkForwardUtils import prev_monday \n", - "from trade.backtester_.strats import BBandsTrend2\n", - "from trade.backtester_.strats import MAStrat\n", - "import yfinance as yf\n", - "from datetime import datetime\n", - "from EventDriven.backtest import OptionSignalBacktest\n", - "from copy import deepcopy\n", - "import matplotlib.pyplot as plt\n", - "%load_ext autoreload\n", - "%autoreload 2" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "import json\n", - "with open('/Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/input/profitable_weights.json', 'r') as f:\n", - " weights = json.load(f)\n", - "ttrades__ = pd.read_csv('/Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/input/profitable_trades.csv').iloc[:, 1:]\n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
SizeEntryBarExitBarEntryPriceExitPricePnLReturnPctEntryTimeExitTimeDurationTicker
034.0504.0524.0279.795877253.010232-910.711955-0.0957332023-07-052023-08-0228 daysTSLA
128.0504.0526.0192.240502185.493749-188.909083-0.0350952023-07-052023-08-0430 daysAAPL
217.0504.0529.0336.262811322.011093-242.279208-0.0423832023-07-052023-08-0935 daysMSFT
348.0504.0536.087.04358882.000000-242.092217-0.0579432023-07-052023-08-1844 daysAVGO
411.0504.0583.0130.695846122.257034-92.826927-0.0645682023-07-052023-10-25112 daysAMZN
5178.0504.0753.042.282471123.47000114451.3804121.9201232023-07-052024-07-01362 daysNVDA
61.0522.0522.0170.283917168.355807-1.928110-0.0113232023-07-312023-07-310 daysJNJ
75.0522.0556.0332.810769318.700396-70.551863-0.0423982023-07-312023-09-1849 daysHD
85.0530.0535.0239.284572224.549052-73.677602-0.0615822023-08-102023-08-177 daysBA
95.0530.0535.053.78425752.084613-8.498219-0.0316012023-08-102023-08-177 daysWMT
1038.0535.0580.0226.851208217.009995-373.966096-0.0433822023-08-172023-10-2064 daysTSLA
1147.0537.0753.083.697919160.8200073624.7381410.9214342023-08-212024-07-01315 daysAVGO
1228.0545.0549.0188.497436175.179993-372.888422-0.0706512023-08-312023-09-077 daysAAPL
134.0553.0565.055.16908453.228411-7.762691-0.0351772023-09-132023-09-2916 daysWMT
147.0555.0558.038.55446835.955361-18.193748-0.0674142023-09-152023-09-205 daysINTC
1511.0596.0753.0124.434000199.470001825.3960130.6030182023-11-132024-07-01231 daysQCOM
1614.0597.0753.0372.308545448.6600041068.9204240.2050762023-11-142024-07-01230 daysMSFT
1741.0598.0607.0106.029814100.545486-224.857451-0.0517242023-11-152023-11-2914 daysSBUX
1813.0598.0753.0120.961891161.250000523.7454180.3330642023-11-152024-07-01229 daysAMD
197.0599.0753.077.159114130.500000373.3861990.6913102023-11-162024-07-01228 daysMU
2014.0600.0635.095.08162589.416964-79.305250-0.0595772023-11-172024-01-1054 daysDIS
215.0600.0692.043.06018540.347284-13.564503-0.0630032023-11-172024-04-03138 daysINTC
2225.0603.0631.0192.160221182.149994-250.255665-0.0520932023-11-222024-01-0443 daysAAPL
23102.0609.0753.030.50640039.910000959.1672230.3082502023-12-012024-07-01213 daysBAC
244.0610.0637.0232.109553219.970001-48.558207-0.0523012023-12-042024-01-1239 daysBA
255.0610.0702.0320.738665336.77999980.2066680.0500142023-12-042024-04-17135 daysHD
2622.0646.0649.0153.405040145.389999-176.330896-0.0522482024-01-262024-01-315 daysGOOG
274.0652.0753.056.86834367.88999944.0866250.1938102024-02-052024-07-01147 daysWMT
2813.0654.0723.097.730864103.04000169.0187750.0543242024-02-072024-05-1699 daysDIS
298.0655.0753.0170.243769193.490005185.9698930.1365472024-02-082024-07-01144 daysAMZN
3042.0657.0657.097.25921895.887818-57.598795-0.0141002024-02-122024-02-120 daysSBUX
3121.0692.0753.0155.462218184.479996609.3733290.1866552024-04-032024-07-0189 daysGOOG
3224.0726.0753.0191.758811212.089996487.9484400.1060252024-05-212024-07-0141 daysAAPL
\n", - "
" - ], - "text/plain": [ - " Size EntryBar ExitBar EntryPrice ExitPrice PnL ReturnPct \\\n", - "0 34.0 504.0 524.0 279.795877 253.010232 -910.711955 -0.095733 \n", - "1 28.0 504.0 526.0 192.240502 185.493749 -188.909083 -0.035095 \n", - "2 17.0 504.0 529.0 336.262811 322.011093 -242.279208 -0.042383 \n", - "3 48.0 504.0 536.0 87.043588 82.000000 -242.092217 -0.057943 \n", - "4 11.0 504.0 583.0 130.695846 122.257034 -92.826927 -0.064568 \n", - "5 178.0 504.0 753.0 42.282471 123.470001 14451.380412 1.920123 \n", - "6 1.0 522.0 522.0 170.283917 168.355807 -1.928110 -0.011323 \n", - "7 5.0 522.0 556.0 332.810769 318.700396 -70.551863 -0.042398 \n", - "8 5.0 530.0 535.0 239.284572 224.549052 -73.677602 -0.061582 \n", - "9 5.0 530.0 535.0 53.784257 52.084613 -8.498219 -0.031601 \n", - "10 38.0 535.0 580.0 226.851208 217.009995 -373.966096 -0.043382 \n", - "11 47.0 537.0 753.0 83.697919 160.820007 3624.738141 0.921434 \n", - "12 28.0 545.0 549.0 188.497436 175.179993 -372.888422 -0.070651 \n", - "13 4.0 553.0 565.0 55.169084 53.228411 -7.762691 -0.035177 \n", - "14 7.0 555.0 558.0 38.554468 35.955361 -18.193748 -0.067414 \n", - "15 11.0 596.0 753.0 124.434000 199.470001 825.396013 0.603018 \n", - "16 14.0 597.0 753.0 372.308545 448.660004 1068.920424 0.205076 \n", - "17 41.0 598.0 607.0 106.029814 100.545486 -224.857451 -0.051724 \n", - "18 13.0 598.0 753.0 120.961891 161.250000 523.745418 0.333064 \n", - "19 7.0 599.0 753.0 77.159114 130.500000 373.386199 0.691310 \n", - "20 14.0 600.0 635.0 95.081625 89.416964 -79.305250 -0.059577 \n", - "21 5.0 600.0 692.0 43.060185 40.347284 -13.564503 -0.063003 \n", - "22 25.0 603.0 631.0 192.160221 182.149994 -250.255665 -0.052093 \n", - "23 102.0 609.0 753.0 30.506400 39.910000 959.167223 0.308250 \n", - "24 4.0 610.0 637.0 232.109553 219.970001 -48.558207 -0.052301 \n", - "25 5.0 610.0 702.0 320.738665 336.779999 80.206668 0.050014 \n", - "26 22.0 646.0 649.0 153.405040 145.389999 -176.330896 -0.052248 \n", - "27 4.0 652.0 753.0 56.868343 67.889999 44.086625 0.193810 \n", - "28 13.0 654.0 723.0 97.730864 103.040001 69.018775 0.054324 \n", - "29 8.0 655.0 753.0 170.243769 193.490005 185.969893 0.136547 \n", - "30 42.0 657.0 657.0 97.259218 95.887818 -57.598795 -0.014100 \n", - "31 21.0 692.0 753.0 155.462218 184.479996 609.373329 0.186655 \n", - "32 24.0 726.0 753.0 191.758811 212.089996 487.948440 0.106025 \n", - "\n", - " EntryTime ExitTime Duration Ticker \n", - "0 2023-07-05 2023-08-02 28 days TSLA \n", - "1 2023-07-05 2023-08-04 30 days AAPL \n", - "2 2023-07-05 2023-08-09 35 days MSFT \n", - "3 2023-07-05 2023-08-18 44 days AVGO \n", - "4 2023-07-05 2023-10-25 112 days AMZN \n", - "5 2023-07-05 2024-07-01 362 days NVDA \n", - "6 2023-07-31 2023-07-31 0 days JNJ \n", - "7 2023-07-31 2023-09-18 49 days HD \n", - "8 2023-08-10 2023-08-17 7 days BA \n", - "9 2023-08-10 2023-08-17 7 days WMT \n", - "10 2023-08-17 2023-10-20 64 days TSLA \n", - "11 2023-08-21 2024-07-01 315 days AVGO \n", - "12 2023-08-31 2023-09-07 7 days AAPL \n", - "13 2023-09-13 2023-09-29 16 days WMT \n", - "14 2023-09-15 2023-09-20 5 days INTC \n", - "15 2023-11-13 2024-07-01 231 days QCOM \n", - "16 2023-11-14 2024-07-01 230 days MSFT \n", - "17 2023-11-15 2023-11-29 14 days SBUX \n", - "18 2023-11-15 2024-07-01 229 days AMD \n", - "19 2023-11-16 2024-07-01 228 days MU \n", - "20 2023-11-17 2024-01-10 54 days DIS \n", - "21 2023-11-17 2024-04-03 138 days INTC \n", - "22 2023-11-22 2024-01-04 43 days AAPL \n", - "23 2023-12-01 2024-07-01 213 days BAC \n", - "24 2023-12-04 2024-01-12 39 days BA \n", - "25 2023-12-04 2024-04-17 135 days HD \n", - "26 2024-01-26 2024-01-31 5 days GOOG \n", - "27 2024-02-05 2024-07-01 147 days WMT \n", - "28 2024-02-07 2024-05-16 99 days DIS \n", - "29 2024-02-08 2024-07-01 144 days AMZN \n", - "30 2024-02-12 2024-02-12 0 days SBUX \n", - "31 2024-04-03 2024-07-01 89 days GOOG \n", - "32 2024-05-21 2024-07-01 41 days AAPL " - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "trades_ = ttrades__.copy()\n", - "trades_" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'TSLA': 0.17420799855438768,\n", - " 'NVDA': 0.13696693517022676,\n", - " 'AAPL': 0.10023373641816916,\n", - " 'MSFT': 0.10467300141772679,\n", - " 'AVGO': 0.07698902053627323,\n", - " 'SBUX': 0.0790869263496488,\n", - " 'AMD': 0.030287217010091606,\n", - " 'GOOG': 0.06259616627482918,\n", - " 'BAC': 0.056805302639254644,\n", - " 'QCOM': 0.025190453887818636,\n", - " 'AMZN': 0.02757812121505515,\n", - " 'HD': 0.03573121193888573,\n", - " 'BA': 0.02198114951948728,\n", - " 'DIS': 0.024661026395236287,\n", - " 'MU': 0.010524714558475388,\n", - " 'WMT': 0.005,\n", - " 'JNJ': 0.005,\n", - " 'INTC': 0.005}" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "symbol_list = trades_.Ticker.unique()\n", - "untraded_symbols = [s for s in weights.keys() if s not in trades_.Ticker.unique()]\n", - "for s in untraded_symbols:\n", - " weights.pop(s)\n", - "weights" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'result': 'SUCCESSFUL',\n", - " 'data': {'long': ['BAC20250117C35'],\n", - " 'short': ['BAC20250117C55'],\n", - " 'trade_id': '&L:BAC20250117C35&S:BAC20250117C55',\n", - " 'close': 1.9900000000000002}}" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "from EventDriven.riskmanager import RiskManager, close_cache, spot_cache, chain_cache, oi_cache, LOOKBACKS, order_cache\n", - "from pandas.tseries.offsets import BDay\n", - "\n", - "rm = RiskManager(None, None, 1000000)\n", - "rm.OrderPicker.liquidity_threshold = 100\n", - "rm.OrderPicker.lookback = 10\n", - "rm.OrderPicker.data_availability_threshold = 0.5\n", - "date, tick = '2023-07-05', 'AVGO'\n", - "date, tick = '2023-12-01', 'BAC'\n", - "start = (pd.to_datetime(date) - BDay(30)).strftime('%Y-%m-%d')\n", - "right = 'C'\n", - "order_settings = {'type': 'naked',\n", - " 'specifics': [{'direction': 'long',\n", - " 'rel_strike': .800,\n", - " 'dte': 365,\n", - " 'moneyness_width': 0.35},\n", - " {'direction': 'short',\n", - " 'rel_strike': .60,\n", - " 'dte': 365,\n", - " 'moneyness_width': 0.35}\n", - "],\n", - " 'name': 'vertical_spread'}\n", - "\n", - "\n", - "\n", - "order = rm.OrderPicker.get_order(tick, date, right, 2, order_settings)\n", - "order" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{Timestamp('2023-12-01 16:00:00'): 30.959999084472656}" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "list(Stock.list_instances().values())[0].spot(spot_type = 'chain_price')" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "BAC {'result': 'SUCCESSFUL', 'data': {'long': ['BAC20250117C35'], 'short': ['BAC20250117C55'], 'trade_id': '&L:BAC20250117C35&S:BAC20250117C55', 'close': 5.699999999999999}}\n" - ] - } - ], - "source": [ - "for i, item in order_cache.items():\n", - " for k, order in item.items():\n", - " if order['result'] == 'SUCCESSFUL' and k == 'BAC':\n", - " print(k,order)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "#Backtest class \n", - "## Find a way to not always reinitialize the backtest class, when want to redo\n", - "evb_backtest = OptionSignalBacktest(trades_, initial_capital=20_000)" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "20000" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.portfolio.initial_capital" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'TSLA': 2613.1199783158154,\n", - " 'AAPL': 1503.5060462725376,\n", - " 'MSFT': 1570.0950212659018,\n", - " 'AVGO': 1154.8353080440984,\n", - " 'AMZN': 413.6718182258273,\n", - " 'NVDA': 2054.5040275534016,\n", - " 'JNJ': 75.0,\n", - " 'HD': 535.968179083286,\n", - " 'BA': 329.71724279230926,\n", - " 'WMT': 75.0,\n", - " 'INTC': 75.0,\n", - " 'QCOM': 377.8568083172795,\n", - " 'SBUX': 1186.3038952447318,\n", - " 'AMD': 454.3082551513741,\n", - " 'MU': 157.87071837713083,\n", - " 'DIS': 369.9153959285443,\n", - " 'BAC': 852.0795395888197,\n", - " 'GOOG': 938.9424941224378}" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "w_map = {x: w * 0.75 for x, w in weights.items()}\n", - "evb_backtest.portfolio.weight_map = w_map\n", - "evb_backtest.portfolio.weight_map\n", - "evb_backtest.portfolio.risk_manager.OrderPicker.liquidity_threshold = 100\n", - "evb_backtest.portfolio.risk_manager.OrderPicker.lookback = 10\n", - "evb_backtest.portfolio.risk_manager.OrderPicker.data_availability_threshold = 0.5\n", - "evb_backtest.portfolio.order_settings = {'type': 'naked',\n", - " 'specifics': [{'direction': 'long',\n", - " 'rel_strike': .800,\n", - " 'dte': 365,\n", - " 'moneyness_width': 0.35},\n", - " {'direction': 'short',\n", - " 'rel_strike': .60,\n", - " 'dte': 365,\n", - " 'moneyness_width': 0.35}\n", - "],\n", - " 'name': 'vertical_spread'}\n", - "\n", - "evb_backtest.portfolio.max_contract_price = 2\n", - "evb_backtest.executor.commission_rate = 0.65\n", - "evb_backtest.executor.commission_rate\n", - "evb_backtest.portfolio.allocated_cash_map" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
DateTSLAAAPLMSFTAVGOAMZNNVDAJNJHDBAWMTINTCQCOMSBUXAMDMUDISBACGOOG
02023-07-05111111000000000000
12023-07-06000000000000000000
22023-07-07000000000000000000
32023-07-08000000000000000000
42023-07-09000000000000000000
............................................................
3582024-06-27000000000000000000
3592024-06-28000000000000000000
3602024-06-29000000000000000000
3612024-06-30000000000000000000
3622024-07-010-1-1-1-1-1000-10-10-1-10-1-1
\n", - "

363 rows × 19 columns

\n", - "
" - ], - "text/plain": [ - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "0 2023-07-05 1 1 1 1 1 1 0 0 0 0 0 \n", - "1 2023-07-06 0 0 0 0 0 0 0 0 0 0 0 \n", - "2 2023-07-07 0 0 0 0 0 0 0 0 0 0 0 \n", - "3 2023-07-08 0 0 0 0 0 0 0 0 0 0 0 \n", - "4 2023-07-09 0 0 0 0 0 0 0 0 0 0 0 \n", - ".. ... ... ... ... ... ... ... ... .. .. ... ... \n", - "358 2024-06-27 0 0 0 0 0 0 0 0 0 0 0 \n", - "359 2024-06-28 0 0 0 0 0 0 0 0 0 0 0 \n", - "360 2024-06-29 0 0 0 0 0 0 0 0 0 0 0 \n", - "361 2024-06-30 0 0 0 0 0 0 0 0 0 0 0 \n", - "362 2024-07-01 0 -1 -1 -1 -1 -1 0 0 0 -1 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "0 0 0 0 0 0 0 0 \n", - "1 0 0 0 0 0 0 0 \n", - "2 0 0 0 0 0 0 0 \n", - "3 0 0 0 0 0 0 0 \n", - "4 0 0 0 0 0 0 0 \n", - ".. ... ... ... .. ... ... ... \n", - "358 0 0 0 0 0 0 0 \n", - "359 0 0 0 0 0 0 0 \n", - "360 0 0 0 0 0 0 0 \n", - "361 0 0 0 0 0 0 0 \n", - "362 -1 0 -1 -1 0 -1 -1 \n", - "\n", - "[363 rows x 19 columns]" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "signals = evb_backtest.bars.signal_df\n", - "signals" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "31.0" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "signals_df = deepcopy(signals).set_index('Date')\n", - "signals_df[signals_df!=-1].sum().sum()" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "0 2023-07-05 1 1 1 1 1 1 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "0 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Processing event: ORDER\n", - "Processing event: ORDER\n", - "Processing event: ORDER\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Processing event: FILL\n", - "Processing event: FILL\n", - "Processing event: FILL\n", - "Processing event: FILL\n", - "Event queue is empty, processed 17 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "1 2023-07-06 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "1 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "2 2023-07-07 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "2 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "3 2023-07-08 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "3 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "4 2023-07-09 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "4 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "5 2023-07-10 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "5 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "6 2023-07-11 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "6 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "7 2023-07-12 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "7 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "8 2023-07-13 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "8 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "9 2023-07-14 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "9 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "10 2023-07-15 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "10 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "11 2023-07-16 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "11 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "12 2023-07-17 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "12 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "13 2023-07-18 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "13 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "14 2023-07-19 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "14 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "15 2023-07-20 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "15 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "16 2023-07-21 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "16 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "17 2023-07-22 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "17 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "18 2023-07-23 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "18 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "19 2023-07-24 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "19 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "20 2023-07-25 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "20 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "21 2023-07-26 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "21 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "22 2023-07-27 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "22 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "23 2023-07-28 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "23 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "24 2023-07-29 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "24 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "25 2023-07-30 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "25 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "26 2023-07-31 0 0 0 0 0 0 -1 1 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "26 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Event queue is empty, processed 3 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "27 2023-08-01 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "27 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "28 2023-08-02 -1 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "28 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "29 2023-08-03 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "29 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "30 2023-08-04 0 -1 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "30 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "31 2023-08-05 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "31 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "32 2023-08-06 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "32 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "33 2023-08-07 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "33 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "34 2023-08-08 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "34 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "35 2023-08-09 0 0 -1 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "35 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "36 2023-08-10 0 0 0 0 0 0 0 0 1 1 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "36 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Processing event: FILL\n", - "Event queue is empty, processed 7 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "37 2023-08-11 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "37 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "38 2023-08-12 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "38 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "39 2023-08-13 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "39 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "40 2023-08-14 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "40 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "41 2023-08-15 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "41 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "42 2023-08-16 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "42 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "43 2023-08-17 1 0 0 0 0 0 0 0 -1 -1 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "43 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Processing event: ORDER\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Processing event: FILL\n", - "Processing event: FILL\n", - "Event queue is empty, processed 10 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "44 2023-08-18 0 0 0 -1 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "44 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Event queue is empty, processed 2 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "45 2023-08-19 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "45 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "46 2023-08-20 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "46 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "47 2023-08-21 0 0 0 1 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "47 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Event queue is empty, processed 2 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "48 2023-08-22 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "48 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "49 2023-08-23 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "49 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "50 2023-08-24 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "50 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "51 2023-08-25 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "51 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "52 2023-08-26 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "52 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "53 2023-08-27 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "53 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "54 2023-08-28 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "54 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "55 2023-08-29 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "55 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "56 2023-08-30 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "56 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "57 2023-08-31 0 1 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "57 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "58 2023-09-01 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "58 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "59 2023-09-02 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "59 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "60 2023-09-03 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "60 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "61 2023-09-04 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "61 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "62 2023-09-05 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "62 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "63 2023-09-06 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "63 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "64 2023-09-07 0 -1 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "64 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "65 2023-09-08 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "65 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "66 2023-09-09 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "66 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "67 2023-09-10 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "67 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "68 2023-09-11 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "68 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "69 2023-09-12 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "69 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "70 2023-09-13 0 0 0 0 0 0 0 0 0 1 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "70 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Event queue is empty, processed 2 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "71 2023-09-14 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "71 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "72 2023-09-15 0 0 0 0 0 0 0 0 0 0 1 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "72 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "73 2023-09-16 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "73 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "74 2023-09-17 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "74 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "75 2023-09-18 0 0 0 0 0 0 0 -1 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "75 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Event queue is empty, processed 2 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "76 2023-09-19 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "76 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "77 2023-09-20 0 0 0 0 0 0 0 0 0 0 -1 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "77 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "78 2023-09-21 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "78 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "79 2023-09-22 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "79 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "80 2023-09-23 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "80 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "81 2023-09-24 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "81 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "82 2023-09-25 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "82 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "83 2023-09-26 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "83 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "84 2023-09-27 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "84 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "85 2023-09-28 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "85 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "86 2023-09-29 0 0 0 0 0 0 0 0 0 -1 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "86 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Event queue is empty, processed 2 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "87 2023-09-30 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "87 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "88 2023-10-01 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "88 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "89 2023-10-02 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "89 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "90 2023-10-03 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "90 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "91 2023-10-04 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "91 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "92 2023-10-05 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "92 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "93 2023-10-06 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "93 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "94 2023-10-07 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "94 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "95 2023-10-08 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "95 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "96 2023-10-09 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "96 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "97 2023-10-10 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "97 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "98 2023-10-11 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "98 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "99 2023-10-12 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "99 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "100 2023-10-13 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "100 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "101 2023-10-14 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "101 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "102 2023-10-15 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "102 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "103 2023-10-16 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "103 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "104 2023-10-17 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "104 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "105 2023-10-18 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "105 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "106 2023-10-19 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "106 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "107 2023-10-20 -1 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "107 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "108 2023-10-21 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "108 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "109 2023-10-22 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "109 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "110 2023-10-23 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "110 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "111 2023-10-24 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "111 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "112 2023-10-25 0 0 0 0 -1 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "112 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "113 2023-10-26 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "113 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "114 2023-10-27 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "114 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "115 2023-10-28 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "115 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "116 2023-10-29 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "116 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "117 2023-10-30 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "117 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "118 2023-10-31 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "118 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "119 2023-11-01 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "119 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "120 2023-11-02 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "120 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "121 2023-11-03 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "121 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "122 2023-11-04 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "122 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "123 2023-11-05 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "123 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "124 2023-11-06 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "124 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "125 2023-11-07 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "125 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "126 2023-11-08 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "126 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "127 2023-11-09 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "127 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "128 2023-11-10 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "128 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "129 2023-11-11 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "129 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "130 2023-11-12 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "130 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "131 2023-11-13 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "131 1 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "132 2023-11-14 0 0 1 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "132 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "133 2023-11-15 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "133 0 1 1 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Processing event: FILL\n", - "Event queue is empty, processed 7 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "134 2023-11-16 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "134 0 0 0 1 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "135 2023-11-17 0 0 0 0 0 0 0 0 0 0 1 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "135 0 0 0 0 1 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Processing event: FILL\n", - "Event queue is empty, processed 7 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "136 2023-11-18 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "136 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "137 2023-11-19 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "137 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "138 2023-11-20 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "138 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "139 2023-11-21 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "139 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "140 2023-11-22 0 1 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "140 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "141 2023-11-23 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "141 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "142 2023-11-24 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "142 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "143 2023-11-25 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "143 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "144 2023-11-26 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "144 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "145 2023-11-27 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "145 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "146 2023-11-28 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "146 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "147 2023-11-29 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "147 0 -1 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "148 2023-11-30 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "148 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "149 2023-12-01 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "149 0 0 0 0 0 1 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "150 2023-12-02 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "150 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "151 2023-12-03 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "151 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "152 2023-12-04 0 0 0 0 0 0 0 1 1 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "152 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Processing event: FILL\n", - "Event queue is empty, processed 7 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "153 2023-12-05 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "153 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "154 2023-12-06 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "154 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "155 2023-12-07 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "155 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "156 2023-12-08 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "156 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "157 2023-12-09 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "157 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "158 2023-12-10 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "158 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "159 2023-12-11 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "159 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "160 2023-12-12 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "160 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "161 2023-12-13 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "161 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "162 2023-12-14 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "162 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "163 2023-12-15 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "163 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "164 2023-12-16 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "164 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "165 2023-12-17 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "165 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "166 2023-12-18 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "166 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "167 2023-12-19 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "167 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "168 2023-12-20 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "168 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "169 2023-12-21 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "169 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "170 2023-12-22 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "170 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "171 2023-12-23 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "171 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "172 2023-12-24 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "172 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "173 2023-12-25 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "173 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "174 2023-12-26 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "174 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "175 2023-12-27 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "175 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "176 2023-12-28 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "176 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "177 2023-12-29 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "177 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "178 2023-12-30 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "178 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "179 2023-12-31 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "179 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "180 2024-01-01 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "180 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "181 2024-01-02 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "181 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "182 2024-01-03 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "182 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "183 2024-01-04 0 -1 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "183 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "184 2024-01-05 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "184 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "185 2024-01-06 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "185 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "186 2024-01-07 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "186 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "187 2024-01-08 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "187 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "188 2024-01-09 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "188 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "189 2024-01-10 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "189 0 0 0 0 -1 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "190 2024-01-11 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "190 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "191 2024-01-12 0 0 0 0 0 0 0 0 -1 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "191 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "192 2024-01-13 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "192 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "193 2024-01-14 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "193 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "194 2024-01-15 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "194 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "195 2024-01-16 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "195 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "196 2024-01-17 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "196 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "197 2024-01-18 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "197 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "198 2024-01-19 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "198 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "199 2024-01-20 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "199 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "200 2024-01-21 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "200 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "201 2024-01-22 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "201 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "202 2024-01-23 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "202 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "203 2024-01-24 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "203 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "204 2024-01-25 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "204 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "205 2024-01-26 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "205 0 0 0 0 0 0 1 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "206 2024-01-27 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "206 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "207 2024-01-28 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "207 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "208 2024-01-29 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "208 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "209 2024-01-30 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "209 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "210 2024-01-31 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "210 0 0 0 0 0 0 -1 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "211 2024-02-01 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "211 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "212 2024-02-02 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "212 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "213 2024-02-03 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "213 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "214 2024-02-04 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "214 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "215 2024-02-05 0 0 0 0 0 0 0 0 0 1 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "215 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "216 2024-02-06 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "216 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "217 2024-02-07 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "217 0 0 0 0 1 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "218 2024-02-08 0 0 0 0 1 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "218 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "219 2024-02-09 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "219 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "220 2024-02-10 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "220 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "221 2024-02-11 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "221 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "222 2024-02-12 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "222 0 -1 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Event queue is empty, processed 2 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "223 2024-02-13 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "223 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "224 2024-02-14 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "224 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "225 2024-02-15 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "225 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "226 2024-02-16 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "226 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "227 2024-02-17 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "227 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "228 2024-02-18 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "228 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "229 2024-02-19 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "229 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "230 2024-02-20 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "230 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "231 2024-02-21 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "231 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "232 2024-02-22 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "232 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "233 2024-02-23 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "233 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "234 2024-02-24 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "234 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "235 2024-02-25 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "235 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "236 2024-02-26 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "236 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "237 2024-02-27 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "237 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "238 2024-02-28 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "238 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "239 2024-02-29 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "239 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "240 2024-03-01 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "240 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "241 2024-03-02 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "241 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "242 2024-03-03 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "242 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "243 2024-03-04 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "243 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "244 2024-03-05 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "244 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "245 2024-03-06 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "245 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "246 2024-03-07 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "246 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "247 2024-03-08 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "247 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "248 2024-03-09 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "248 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "249 2024-03-10 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "249 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "250 2024-03-11 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "250 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "251 2024-03-12 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "251 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "252 2024-03-13 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "252 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "253 2024-03-14 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "253 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "254 2024-03-15 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "254 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "255 2024-03-16 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "255 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "256 2024-03-17 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "256 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "257 2024-03-18 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "257 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "258 2024-03-19 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "258 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "259 2024-03-20 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "259 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "260 2024-03-21 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "260 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "261 2024-03-22 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "261 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "262 2024-03-23 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "262 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "263 2024-03-24 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "263 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "264 2024-03-25 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "264 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "265 2024-03-26 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "265 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "266 2024-03-27 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "266 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "267 2024-03-28 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "267 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "268 2024-03-29 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "268 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "269 2024-03-30 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "269 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "270 2024-03-31 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "270 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "271 2024-04-01 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "271 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "272 2024-04-02 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "272 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "273 2024-04-03 0 0 0 0 0 0 0 0 0 0 -1 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "273 0 0 0 0 0 0 1 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "2025-02-26 07:25:02 dbase.DataAPI.ThetaData ERROR: \n", - "2025-02-26 07:25:02 dbase.DataAPI.ThetaData ERROR: Error in retrieve_openInterest. Error: 'Ms_of_day'\n", - "2025-02-26 07:25:02 dbase.DataAPI.ThetaData ERROR: Error in retrieving data: {\"content\":\"No data for the specified timeframe & contract.\",\"cookies\":{},\"data\":\"No data for the specified timeframe & contract.\",\"elapsed\":0.638983,\"headers\":{\"Access-control-allow-headers\":\"*\",\"Access-control-allow-origin\":\"https://http-docs.thetadata.us\",\"Access-control-request-headers\":\"*\",\"Content-length\":\"47\",\"Content-type\":\"text\",\"Date\":\"Wed, 26 Feb 2025 12:25:02 GMT\"},\"history\":[],\"reason\":\"\",\"status_code\":472,\"text\":\"No data for the specified timeframe & contract.\",\"url\":\"http://127.0.0.1:25510/v2/hist/option/open_interest?end_date=20240403&root=GOOG&use_csv=true&exp=20250321&right=C&start_date=20240306&strike=230000&rth=False\"}\n", - "\n", - "2025-02-26 07:25:02 dbase.DataAPI.ThetaData ERROR: Nothing returned at all\n", - "2025-02-26 07:25:02 dbase.DataAPI.ThetaData ERROR: \n", - "2025-02-26 07:25:02 dbase.DataAPI.ThetaData ERROR: Error in retrieve_openInterest. Error: 'Ms_of_day'\n", - "2025-02-26 07:25:02 dbase.DataAPI.ThetaData ERROR: Error in retrieving data: {\"content\":\"No data for the specified timeframe & contract.\",\"cookies\":{},\"data\":\"No data for the specified timeframe & contract.\",\"elapsed\":0.585463,\"headers\":{\"Access-control-allow-headers\":\"*\",\"Access-control-allow-origin\":\"https://http-docs.thetadata.us\",\"Access-control-request-headers\":\"*\",\"Content-length\":\"47\",\"Content-type\":\"text\",\"Date\":\"Wed, 26 Feb 2025 12:25:02 GMT\"},\"history\":[],\"reason\":\"\",\"status_code\":472,\"text\":\"No data for the specified timeframe & contract.\",\"url\":\"http://127.0.0.1:25510/v2/hist/option/open_interest?end_date=20240403&root=GOOG&use_csv=true&exp=20250321&right=C&start_date=20240306&strike=230000&rth=False\"}\n", - "\n", - "2025-02-26 07:25:02 dbase.DataAPI.ThetaData ERROR: Nothing returned at all\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 5 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "274 2024-04-04 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "274 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "275 2024-04-05 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "275 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "276 2024-04-06 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "276 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "277 2024-04-07 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "277 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "278 2024-04-08 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "278 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "279 2024-04-09 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "279 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "280 2024-04-10 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "280 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "281 2024-04-11 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "281 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "282 2024-04-12 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "282 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "283 2024-04-13 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "283 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "284 2024-04-14 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "284 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "285 2024-04-15 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "285 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "286 2024-04-16 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "286 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "287 2024-04-17 0 0 0 0 0 0 0 -1 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "287 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "288 2024-04-18 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "288 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "289 2024-04-19 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "289 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "290 2024-04-20 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "290 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "291 2024-04-21 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "291 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "292 2024-04-22 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "292 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "293 2024-04-23 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "293 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "294 2024-04-24 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "294 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "295 2024-04-25 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "295 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "296 2024-04-26 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "296 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "297 2024-04-27 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "297 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "298 2024-04-28 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "298 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "299 2024-04-29 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "299 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "300 2024-04-30 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "300 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "301 2024-05-01 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "301 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "302 2024-05-02 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "302 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "303 2024-05-03 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "303 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "304 2024-05-04 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "304 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "305 2024-05-05 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "305 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "306 2024-05-06 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "306 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "307 2024-05-07 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "307 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "308 2024-05-08 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "308 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "309 2024-05-09 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "309 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "310 2024-05-10 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "310 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "311 2024-05-11 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "311 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "312 2024-05-12 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "312 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "313 2024-05-13 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "313 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "314 2024-05-14 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "314 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "315 2024-05-15 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "315 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "316 2024-05-16 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "316 0 0 0 0 -1 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "317 2024-05-17 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "317 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "318 2024-05-18 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "318 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "319 2024-05-19 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "319 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "320 2024-05-20 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "320 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "321 2024-05-21 0 1 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "321 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Event queue is empty, processed 4 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "322 2024-05-22 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "322 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "323 2024-05-23 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "323 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "324 2024-05-24 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "324 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "325 2024-05-25 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "325 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "326 2024-05-26 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "326 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "327 2024-05-27 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "327 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "328 2024-05-28 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "328 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "329 2024-05-29 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "329 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "330 2024-05-30 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "330 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "331 2024-05-31 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "331 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "332 2024-06-01 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "332 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "333 2024-06-02 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "333 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "334 2024-06-03 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "334 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "335 2024-06-04 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "335 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "336 2024-06-05 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "336 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "337 2024-06-06 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "337 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "338 2024-06-07 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "338 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "339 2024-06-08 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "339 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "340 2024-06-09 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "340 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "341 2024-06-10 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "341 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "342 2024-06-11 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "342 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "343 2024-06-12 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "343 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "344 2024-06-13 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "344 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "345 2024-06-14 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "345 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "346 2024-06-15 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "346 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "347 2024-06-16 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "347 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "348 2024-06-17 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "348 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "349 2024-06-18 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "349 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "350 2024-06-19 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "350 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "351 2024-06-20 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "351 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "352 2024-06-21 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "352 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "353 2024-06-22 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "353 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "354 2024-06-23 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "354 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "355 2024-06-24 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "355 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "356 2024-06-25 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "356 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "357 2024-06-26 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "357 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "358 2024-06-27 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "358 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "359 2024-06-28 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "359 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "360 2024-06-29 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "360 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "361 2024-06-30 0 0 0 0 0 0 0 0 0 0 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "361 0 0 0 0 0 0 0 \n", - "Processing event: MARKET\n", - "Event queue is empty, processed 1 event(s)\n", - " Date TSLA AAPL MSFT AVGO AMZN NVDA JNJ HD BA WMT INTC \\\n", - "362 2024-07-01 0 -1 -1 -1 -1 -1 0 0 0 -1 0 \n", - "\n", - " QCOM SBUX AMD MU DIS BAC GOOG \n", - "362 -1 0 -1 -1 0 -1 -1 \n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Processing event: ORDER\n", - "Processing event: ORDER\n", - "Processing event: ORDER\n", - "Processing event: ORDER\n", - "Processing event: ORDER\n", - "Processing event: ORDER\n", - "Processing event: ORDER\n", - "Processing event: ORDER\n", - "Processing event: FILL\n", - "Processing event: FILL\n", - "Processing event: FILL\n", - "Processing event: FILL\n", - "Processing event: FILL\n", - "Processing event: FILL\n", - "Processing event: FILL\n", - "Processing event: FILL\n", - "Processing event: FILL\n", - "Event queue is empty, processed 30 event(s)\n", - "No more data to feed backtest\n" - ] - } - ], - "source": [ - "import cProfile\n", - "import pstats\n", - "import io\n", - "\n", - "profiler = cProfile.Profile()\n", - "profiler.enable()\n", - "#run backtest\n", - "\n", - "evb_backtest.run()\n", - "profiler.disable()\n", - "stream = io.StringIO()\n", - "stats = pstats.Stats(profiler, stream=stream).sort_stats('cumulative')" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'result': 'SUCCESSFUL',\n", - " 'data': {'long': ['TSLA20240621C333.33'],\n", - " 'short': ['TSLA20240621C340'],\n", - " 'trade_id': '&L:TSLA20240621C333.33&S:TSLA20240621C340',\n", - " 'close': 1.5749999999999993}}" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "order_cache['2023-07-05']['TSLA']" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
OpenHighLowCloseVolumeBid_sizeCloseBidAsk_sizeCloseAskMidpointWeighted_midpoint
Datetime
2023-07-052.402.402.752.3721691.9582.052.0001.935204
2023-07-052.402.402.752.3721691.9582.052.0001.935204
2023-07-061.110.732.741.26-28-31.90191.951.9251.945209
2023-07-061.110.732.741.26-28-31.90191.951.9251.945209
2023-07-070.800.803.202.80-651561.60-1661.601.6001.229533
2023-07-070.800.803.202.80-651561.60-1661.601.6001.229533
2023-07-101.800.982.171.708881.40-381.751.5751.415262
2023-07-101.800.982.171.708881.40-381.751.5751.415262
2023-07-111.500.602.401.30-33321.75641.901.8251.852402
2023-07-111.500.602.401.30-33321.75641.901.8251.852402
2023-07-12-35.02-35.02-33.54-33.55-3171.751092.001.8751.989135
2023-07-12-35.02-35.02-33.54-33.55-3171.751092.001.8751.989135
2023-07-133.602.073.602.07231.90-891.701.8001.678548
2023-07-133.602.073.602.07231.90-891.701.8001.678548
2023-07-143.25-1.333.251.22-35-81.95-91.801.8751.874065
2023-07-143.25-1.333.251.22-35-81.95-91.801.8751.874065
2023-07-172.811.242.553.46-34-612.151482.502.3252.687185
2023-07-172.811.242.553.46-34-612.151482.502.3252.687185
2023-07-181.101.551.951.53-322-92.2002.152.1752.249985
2023-07-181.101.551.951.53-322-92.2002.152.1752.249985
2023-07-192.762.170.581.9083-353.70-1162.152.9252.717677
2023-07-192.762.170.581.9083-353.70-1162.152.9252.717677
2023-07-201.591.850.850.95-145-101.15221.651.4001.661432
2023-07-201.591.850.850.95-145-101.15221.651.4001.661432
2023-07-212.301.553.224.15-911.5501.551.5501.547020
2023-07-212.301.553.224.15-911.5501.551.5501.547020
2023-07-244.021.704.021.85-12901.401081.951.6751.660008
2023-07-244.021.704.021.85-12901.401081.951.6751.660008
2023-07-252.872.192.872.19-10501.65-211.651.6501.609513
2023-07-252.872.192.872.19-10501.65-211.651.6501.609513
2023-07-263.052.653.353.35-521.15-21.601.3751.549038
2023-07-263.052.653.353.35-521.15-21.601.3751.549038
2023-07-270.720.721.240.64-30171.50241.551.5251.533358
2023-07-270.720.721.240.64-30171.50241.551.5251.533358
2023-07-281.151.401.151.40-4-41.75-61.701.7251.718425
2023-07-281.151.401.151.40-4-41.75-61.701.7251.718425
2023-07-312.250.732.250.7332-31.7061.751.7251.740705
2023-07-312.250.732.250.7332-31.7061.751.7251.740705
2023-08-011.500.932.132.13-12-241.60-51.551.5751.589664
2023-08-011.500.932.132.13-12-241.60-51.551.5751.589664
2023-08-021.170.892.631.28-27241.4511.451.4501.434178
2023-08-021.170.892.631.28-27241.4511.451.4501.434178
2023-08-032.37-0.082.37-0.08-72101.3511.451.4001.330921
2023-08-032.37-0.082.37-0.08-72101.3511.451.4001.330921
2023-08-041.711.953.313.65-30-1381.45621.451.4502.002083
2023-08-041.711.953.313.65-30-1381.45621.451.4502.002083
2023-08-072.782.302.050.24-4-211.45-141.301.3751.363562
2023-08-072.782.302.050.24-4-211.45-141.301.3751.363562
2023-08-081.401.401.951.551591.35131.401.3751.370246
2023-08-081.401.401.951.551591.35131.401.3751.370246
\n", - "
" - ], - "text/plain": [ - " Open High Low Close Volume Bid_size CloseBid Ask_size \\\n", - "Datetime \n", - "2023-07-05 2.40 2.40 2.75 2.37 21 69 1.95 8 \n", - "2023-07-05 2.40 2.40 2.75 2.37 21 69 1.95 8 \n", - "2023-07-06 1.11 0.73 2.74 1.26 -28 -3 1.90 19 \n", - "2023-07-06 1.11 0.73 2.74 1.26 -28 -3 1.90 19 \n", - "2023-07-07 0.80 0.80 3.20 2.80 -65 156 1.60 -166 \n", - "2023-07-07 0.80 0.80 3.20 2.80 -65 156 1.60 -166 \n", - "2023-07-10 1.80 0.98 2.17 1.70 8 88 1.40 -38 \n", - "2023-07-10 1.80 0.98 2.17 1.70 8 88 1.40 -38 \n", - "2023-07-11 1.50 0.60 2.40 1.30 -33 32 1.75 64 \n", - "2023-07-11 1.50 0.60 2.40 1.30 -33 32 1.75 64 \n", - "2023-07-12 -35.02 -35.02 -33.54 -33.55 -31 7 1.75 109 \n", - "2023-07-12 -35.02 -35.02 -33.54 -33.55 -31 7 1.75 109 \n", - "2023-07-13 3.60 2.07 3.60 2.07 2 3 1.90 -89 \n", - "2023-07-13 3.60 2.07 3.60 2.07 2 3 1.90 -89 \n", - "2023-07-14 3.25 -1.33 3.25 1.22 -35 -8 1.95 -9 \n", - "2023-07-14 3.25 -1.33 3.25 1.22 -35 -8 1.95 -9 \n", - "2023-07-17 2.81 1.24 2.55 3.46 -34 -61 2.15 148 \n", - "2023-07-17 2.81 1.24 2.55 3.46 -34 -61 2.15 148 \n", - "2023-07-18 1.10 1.55 1.95 1.53 -322 -9 2.20 0 \n", - "2023-07-18 1.10 1.55 1.95 1.53 -322 -9 2.20 0 \n", - "2023-07-19 2.76 2.17 0.58 1.90 83 -35 3.70 -116 \n", - "2023-07-19 2.76 2.17 0.58 1.90 83 -35 3.70 -116 \n", - "2023-07-20 1.59 1.85 0.85 0.95 -145 -10 1.15 22 \n", - "2023-07-20 1.59 1.85 0.85 0.95 -145 -10 1.15 22 \n", - "2023-07-21 2.30 1.55 3.22 4.15 -9 1 1.55 0 \n", - "2023-07-21 2.30 1.55 3.22 4.15 -9 1 1.55 0 \n", - "2023-07-24 4.02 1.70 4.02 1.85 -12 90 1.40 108 \n", - "2023-07-24 4.02 1.70 4.02 1.85 -12 90 1.40 108 \n", - "2023-07-25 2.87 2.19 2.87 2.19 -105 0 1.65 -21 \n", - "2023-07-25 2.87 2.19 2.87 2.19 -105 0 1.65 -21 \n", - "2023-07-26 3.05 2.65 3.35 3.35 -5 2 1.15 -2 \n", - "2023-07-26 3.05 2.65 3.35 3.35 -5 2 1.15 -2 \n", - "2023-07-27 0.72 0.72 1.24 0.64 -30 17 1.50 24 \n", - "2023-07-27 0.72 0.72 1.24 0.64 -30 17 1.50 24 \n", - "2023-07-28 1.15 1.40 1.15 1.40 -4 -4 1.75 -6 \n", - "2023-07-28 1.15 1.40 1.15 1.40 -4 -4 1.75 -6 \n", - "2023-07-31 2.25 0.73 2.25 0.73 32 -3 1.70 6 \n", - "2023-07-31 2.25 0.73 2.25 0.73 32 -3 1.70 6 \n", - "2023-08-01 1.50 0.93 2.13 2.13 -12 -24 1.60 -5 \n", - "2023-08-01 1.50 0.93 2.13 2.13 -12 -24 1.60 -5 \n", - "2023-08-02 1.17 0.89 2.63 1.28 -27 24 1.45 1 \n", - "2023-08-02 1.17 0.89 2.63 1.28 -27 24 1.45 1 \n", - "2023-08-03 2.37 -0.08 2.37 -0.08 -72 10 1.35 1 \n", - "2023-08-03 2.37 -0.08 2.37 -0.08 -72 10 1.35 1 \n", - "2023-08-04 1.71 1.95 3.31 3.65 -30 -138 1.45 62 \n", - "2023-08-04 1.71 1.95 3.31 3.65 -30 -138 1.45 62 \n", - "2023-08-07 2.78 2.30 2.05 0.24 -4 -21 1.45 -14 \n", - "2023-08-07 2.78 2.30 2.05 0.24 -4 -21 1.45 -14 \n", - "2023-08-08 1.40 1.40 1.95 1.55 15 9 1.35 13 \n", - "2023-08-08 1.40 1.40 1.95 1.55 15 9 1.35 13 \n", - "\n", - " CloseAsk Midpoint Weighted_midpoint \n", - "Datetime \n", - "2023-07-05 2.05 2.000 1.935204 \n", - "2023-07-05 2.05 2.000 1.935204 \n", - "2023-07-06 1.95 1.925 1.945209 \n", - "2023-07-06 1.95 1.925 1.945209 \n", - "2023-07-07 1.60 1.600 1.229533 \n", - "2023-07-07 1.60 1.600 1.229533 \n", - "2023-07-10 1.75 1.575 1.415262 \n", - "2023-07-10 1.75 1.575 1.415262 \n", - "2023-07-11 1.90 1.825 1.852402 \n", - "2023-07-11 1.90 1.825 1.852402 \n", - "2023-07-12 2.00 1.875 1.989135 \n", - "2023-07-12 2.00 1.875 1.989135 \n", - "2023-07-13 1.70 1.800 1.678548 \n", - "2023-07-13 1.70 1.800 1.678548 \n", - "2023-07-14 1.80 1.875 1.874065 \n", - "2023-07-14 1.80 1.875 1.874065 \n", - "2023-07-17 2.50 2.325 2.687185 \n", - "2023-07-17 2.50 2.325 2.687185 \n", - "2023-07-18 2.15 2.175 2.249985 \n", - "2023-07-18 2.15 2.175 2.249985 \n", - "2023-07-19 2.15 2.925 2.717677 \n", - "2023-07-19 2.15 2.925 2.717677 \n", - "2023-07-20 1.65 1.400 1.661432 \n", - "2023-07-20 1.65 1.400 1.661432 \n", - "2023-07-21 1.55 1.550 1.547020 \n", - "2023-07-21 1.55 1.550 1.547020 \n", - "2023-07-24 1.95 1.675 1.660008 \n", - "2023-07-24 1.95 1.675 1.660008 \n", - "2023-07-25 1.65 1.650 1.609513 \n", - "2023-07-25 1.65 1.650 1.609513 \n", - "2023-07-26 1.60 1.375 1.549038 \n", - "2023-07-26 1.60 1.375 1.549038 \n", - "2023-07-27 1.55 1.525 1.533358 \n", - "2023-07-27 1.55 1.525 1.533358 \n", - "2023-07-28 1.70 1.725 1.718425 \n", - "2023-07-28 1.70 1.725 1.718425 \n", - "2023-07-31 1.75 1.725 1.740705 \n", - "2023-07-31 1.75 1.725 1.740705 \n", - "2023-08-01 1.55 1.575 1.589664 \n", - "2023-08-01 1.55 1.575 1.589664 \n", - "2023-08-02 1.45 1.450 1.434178 \n", - "2023-08-02 1.45 1.450 1.434178 \n", - "2023-08-03 1.45 1.400 1.330921 \n", - "2023-08-03 1.45 1.400 1.330921 \n", - "2023-08-04 1.45 1.450 2.002083 \n", - "2023-08-04 1.45 1.450 2.002083 \n", - "2023-08-07 1.30 1.375 1.363562 \n", - "2023-08-07 1.30 1.375 1.363562 \n", - "2023-08-08 1.40 1.375 1.370246 \n", - "2023-08-08 1.40 1.375 1.370246 " - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "(evb_backtest.portfolio.options_data['TSLA20240621C333.33'] - evb_backtest.portfolio.options_data['TSLA20240621C340']).head(50)" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "pd.set_option('display.max_columns', 100)" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "eq = pd.DataFrame(evb_backtest.portfolio.weighted_holdings).set_index('datetime').copy()" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "name": "Equity Curve", - "showlegend": true, - "type": "scatter", - "x": [ - "2023-07-05T00:00:00", - "2023-07-05T00:00:00", - "2023-07-06T00:00:00", - "2023-07-07T00:00:00", - "2023-07-10T00:00:00", - "2023-07-11T00:00:00", - "2023-07-12T00:00:00", - "2023-07-13T00:00:00", - "2023-07-14T00:00:00", - "2023-07-17T00:00:00", - "2023-07-18T00:00:00", - "2023-07-19T00:00:00", - "2023-07-20T00:00:00", - "2023-07-21T00:00:00", - "2023-07-24T00:00:00", - "2023-07-25T00:00:00", - "2023-07-26T00:00:00", - "2023-07-27T00:00:00", - "2023-07-28T00:00:00", - "2023-07-31T00:00:00", - "2023-08-01T00:00:00", - "2023-08-02T00:00:00", - "2023-08-03T00:00:00", - "2023-08-04T00:00:00", - "2023-08-07T00:00:00", - "2023-08-08T00:00:00", - "2023-08-09T00:00:00", - "2023-08-10T00:00:00", - "2023-08-11T00:00:00", - "2023-08-14T00:00:00", - "2023-08-15T00:00:00", - "2023-08-16T00:00:00", - "2023-08-17T00:00:00", - "2023-08-18T00:00:00", - "2023-08-21T00:00:00", - "2023-08-22T00:00:00", - "2023-08-23T00:00:00", - "2023-08-24T00:00:00", - "2023-08-25T00:00:00", - "2023-08-28T00:00:00", - "2023-08-29T00:00:00", - "2023-08-30T00:00:00", - "2023-08-31T00:00:00", - "2023-09-01T00:00:00", - "2023-09-04T00:00:00", - "2023-09-05T00:00:00", - "2023-09-06T00:00:00", - "2023-09-07T00:00:00", - "2023-09-08T00:00:00", - "2023-09-11T00:00:00", - "2023-09-12T00:00:00", - "2023-09-13T00:00:00", - "2023-09-14T00:00:00", - "2023-09-15T00:00:00", - "2023-09-18T00:00:00", - "2023-09-19T00:00:00", - "2023-09-20T00:00:00", - "2023-09-21T00:00:00", - "2023-09-22T00:00:00", - "2023-09-25T00:00:00", - "2023-09-26T00:00:00", - "2023-09-27T00:00:00", - "2023-09-28T00:00:00", - "2023-09-29T00:00:00", - "2023-10-02T00:00:00", - "2023-10-03T00:00:00", - "2023-10-04T00:00:00", - "2023-10-05T00:00:00", - "2023-10-06T00:00:00", - "2023-10-09T00:00:00", - "2023-10-10T00:00:00", - "2023-10-11T00:00:00", - "2023-10-12T00:00:00", - "2023-10-13T00:00:00", - "2023-10-16T00:00:00", - "2023-10-17T00:00:00", - "2023-10-18T00:00:00", - "2023-10-19T00:00:00", - "2023-10-20T00:00:00", - "2023-10-23T00:00:00", - "2023-10-24T00:00:00", - "2023-10-25T00:00:00", - "2023-10-26T00:00:00", - "2023-10-27T00:00:00", - "2023-10-30T00:00:00", - "2023-10-31T00:00:00", - "2023-11-01T00:00:00", - "2023-11-02T00:00:00", - "2023-11-03T00:00:00", - "2023-11-06T00:00:00", - "2023-11-07T00:00:00", - "2023-11-08T00:00:00", - "2023-11-09T00:00:00", - "2023-11-10T00:00:00", - "2023-11-13T00:00:00", - "2023-11-14T00:00:00", - "2023-11-15T00:00:00", - "2023-11-16T00:00:00", - "2023-11-17T00:00:00", - "2023-11-20T00:00:00", - "2023-11-21T00:00:00", - "2023-11-22T00:00:00", - "2023-11-23T00:00:00", - "2023-11-24T00:00:00", - "2023-11-27T00:00:00", - "2023-11-28T00:00:00", - "2023-11-29T00:00:00", - "2023-11-30T00:00:00", - "2023-12-01T00:00:00", - "2023-12-04T00:00:00", - "2023-12-05T00:00:00", - "2023-12-06T00:00:00", - "2023-12-07T00:00:00", - "2023-12-08T00:00:00", - "2023-12-11T00:00:00", - "2023-12-12T00:00:00", - "2023-12-13T00:00:00", - "2023-12-14T00:00:00", - "2023-12-15T00:00:00", - "2023-12-18T00:00:00", - "2023-12-19T00:00:00", - "2023-12-20T00:00:00", - "2023-12-21T00:00:00", - "2023-12-22T00:00:00", - "2023-12-25T00:00:00", - "2023-12-26T00:00:00", - "2023-12-27T00:00:00", - "2023-12-28T00:00:00", - "2023-12-29T00:00:00", - "2024-01-01T00:00:00", - "2024-01-02T00:00:00", - "2024-01-03T00:00:00", - "2024-01-04T00:00:00", - "2024-01-05T00:00:00", - "2024-01-08T00:00:00", - "2024-01-09T00:00:00", - "2024-01-10T00:00:00", - "2024-01-11T00:00:00", - "2024-01-12T00:00:00", - "2024-01-15T00:00:00", - "2024-01-16T00:00:00", - "2024-01-17T00:00:00", - "2024-01-18T00:00:00", - "2024-01-19T00:00:00", - "2024-01-22T00:00:00", - "2024-01-23T00:00:00", - "2024-01-24T00:00:00", - "2024-01-25T00:00:00", - "2024-01-26T00:00:00", - "2024-01-29T00:00:00", - "2024-01-30T00:00:00", - "2024-01-31T00:00:00", - "2024-02-01T00:00:00", - "2024-02-02T00:00:00", - "2024-02-05T00:00:00", - "2024-02-06T00:00:00", - "2024-02-07T00:00:00", - "2024-02-08T00:00:00", - "2024-02-09T00:00:00", - "2024-02-12T00:00:00", - "2024-02-13T00:00:00", - "2024-02-14T00:00:00", - "2024-02-15T00:00:00", - "2024-02-16T00:00:00", - "2024-02-19T00:00:00", - "2024-02-20T00:00:00", - "2024-02-21T00:00:00", - "2024-02-22T00:00:00", - "2024-02-23T00:00:00", - "2024-02-26T00:00:00", - "2024-02-27T00:00:00", - "2024-02-28T00:00:00", - "2024-02-29T00:00:00", - "2024-03-01T00:00:00", - "2024-03-04T00:00:00", - "2024-03-05T00:00:00", - "2024-03-06T00:00:00", - "2024-03-07T00:00:00", - "2024-03-08T00:00:00", - "2024-03-11T00:00:00", - "2024-03-12T00:00:00", - "2024-03-13T00:00:00", - "2024-03-14T00:00:00", - "2024-03-15T00:00:00", - "2024-03-18T00:00:00", - "2024-03-19T00:00:00", - "2024-03-20T00:00:00", - "2024-03-21T00:00:00", - "2024-03-22T00:00:00", - "2024-03-25T00:00:00", - "2024-03-26T00:00:00", - "2024-03-27T00:00:00", - "2024-03-28T00:00:00", - "2024-03-29T00:00:00", - "2024-04-01T00:00:00", - "2024-04-02T00:00:00", - "2024-04-03T00:00:00", - "2024-04-04T00:00:00", - "2024-04-05T00:00:00", - "2024-04-08T00:00:00", - "2024-04-09T00:00:00", - "2024-04-10T00:00:00", - "2024-04-11T00:00:00", - "2024-04-12T00:00:00", - "2024-04-15T00:00:00", - "2024-04-16T00:00:00", - "2024-04-17T00:00:00", - "2024-04-18T00:00:00", - "2024-04-19T00:00:00", - "2024-04-22T00:00:00", - "2024-04-23T00:00:00", - "2024-04-24T00:00:00", - "2024-04-25T00:00:00", - "2024-04-26T00:00:00", - "2024-04-29T00:00:00", - "2024-04-30T00:00:00", - "2024-05-01T00:00:00", - "2024-05-02T00:00:00", - "2024-05-03T00:00:00", - "2024-05-06T00:00:00", - "2024-05-07T00:00:00", - "2024-05-08T00:00:00", - "2024-05-09T00:00:00", - "2024-05-10T00:00:00", - "2024-05-13T00:00:00", - "2024-05-14T00:00:00", - "2024-05-15T00:00:00", - "2024-05-16T00:00:00", - "2024-05-17T00:00:00", - "2024-05-20T00:00:00", - "2024-05-21T00:00:00", - "2024-05-22T00:00:00", - "2024-05-23T00:00:00", - "2024-05-24T00:00:00", - "2024-05-27T00:00:00", - "2024-05-28T00:00:00", - "2024-05-29T00:00:00", - "2024-05-30T00:00:00", - "2024-05-31T00:00:00", - "2024-06-03T00:00:00", - "2024-06-04T00:00:00", - "2024-06-05T00:00:00", - "2024-06-06T00:00:00", - "2024-06-07T00:00:00", - "2024-06-10T00:00:00", - "2024-06-11T00:00:00", - "2024-06-12T00:00:00", - "2024-06-13T00:00:00", - "2024-06-14T00:00:00", - "2024-06-17T00:00:00", - "2024-06-18T00:00:00", - "2024-06-19T00:00:00", - "2024-06-20T00:00:00", - "2024-06-21T00:00:00", - "2024-06-24T00:00:00", - "2024-06-25T00:00:00", - "2024-06-26T00:00:00", - "2024-06-27T00:00:00", - "2024-06-28T00:00:00", - "2024-07-01T00:00:00" - ], - "xaxis": "x", - "y": [ - 1, - 0.8896755, - 0.8819254999999999, - 0.8651754999999999, - 0.8484254999999999, - 0.8603004999999999, - 0.8854254999999999, - 0.9053005, - 0.9075504999999999, - 0.9500504999999999, - 0.9835504999999999, - 1.0370504999999999, - 0.9044254999999999, - 0.9049254999999999, - 0.9064254999999999, - 0.9403004999999999, - 0.8726754999999999, - 0.9080504999999999, - 0.9081754999999999, - 0.9326754999999999, - 0.9078004999999999, - 0.9101245000000001, - 0.8358745000000001, - 0.8259764999999999, - 0.8374765, - 0.8196015, - 0.7812775, - 0.7691425000000001, - 0.7533925, - 0.7845175, - 0.7810175, - 0.7810175, - 0.7643725, - 0.7616225000000001, - 0.8117475000000001, - 0.7983725, - 0.8869975, - 0.7984975000000001, - 0.7923725, - 0.7958725, - 0.8329975000000001, - 0.8327475000000001, - 0.8234115, - 0.8074865, - 0.8096614999999999, - 0.8096614999999999, - 0.7826115, - 0.765738, - 0.757238, - 0.762988, - 0.753988, - 0.766863, - 0.764613, - 0.740738, - 0.765613, - 0.731863, - 0.7186130000000001, - 0.707238, - 0.705238, - 0.719363, - 0.710413, - 0.718188, - 0.715438, - 0.722863, - 0.736488, - 0.7230880000000001, - 0.732113, - 0.735438, - 0.744488, - 0.740013, - 0.744863, - 0.753363, - 0.755488, - 0.734738, - 0.741488, - 0.721988, - 0.703913, - 0.693113, - 0.6777255, - 0.6891505, - 0.6945005, - 0.6777485, - 0.6676234999999999, - 0.6721235, - 0.6743735, - 0.6687485, - 0.6754985, - 0.6856234999999999, - 0.6968734999999999, - 0.7024984999999999, - 0.7013735, - 0.7081235, - 0.7126235, - 0.7227485, - 0.7206060000000001, - 0.725962, - 0.6927285, - 0.7026034999999999, - 0.689714, - 0.701164, - 0.673589, - 0.665989, - 0.661139, - 0.661139, - 0.657289, - 0.643914, - 0.6252445, - 0.6191445, - 0.6029765, - 0.5707885, - 0.6273635000000001, - 0.6162135, - 0.6599385, - 0.6442635, - 0.6367635, - 0.6554635, - 0.6973385, - 0.7044385, - 0.6937385, - 0.7151885, - 0.7405135, - 0.6945385000000001, - 0.7074885000000001, - 0.6967135, - 0.7189385, - 0.7189385, - 0.7110635000000001, - 0.7035385000000001, - 0.7052885, - 0.6787385, - 0.6787385, - 0.6280635, - 0.6761135, - 0.6603135, - 0.7184135, - 0.7362635000000001, - 0.7695415, - 0.7409665, - 0.7320665, - 0.7892665, - 0.7892665, - 0.7783915, - 0.8071165, - 0.8619665000000001, - 0.8524165000000001, - 0.7855915, - 0.8828415000000001, - 0.9002165000000001, - 0.869843, - 0.908918, - 0.949693, - 0.8991645, - 0.9282645, - 1.0126145, - 1.0634395, - 1.0422895, - 1.1324645, - 1.101256, - 1.160406, - 1.157656, - 1.145381, - 1.195281, - 1.182031, - 1.160406, - 1.085356, - 1.085356, - 0.993431, - 1.350006, - 1.3619059999999998, - 1.354606, - 1.3716059999999999, - 1.323856, - 1.413956, - 1.479406, - 1.576656, - 1.601481, - 1.665056, - 1.6421810000000001, - 1.575131, - 1.5373809999999999, - 1.569806, - 1.6062809999999998, - 1.538881, - 1.5641559999999999, - 1.571931, - 1.592381, - 1.7187310000000002, - 1.686881, - 1.7345560000000002, - 1.747556, - 1.688231, - 1.6750060000000002, - 1.7512310000000002, - 1.7512310000000002, - 1.6731310000000001, - 1.641806, - 1.637306, - 1.521081, - 1.563131, - 1.599756, - 1.657631, - 1.554456, - 1.641231, - 1.562406, - 1.493106, - 1.525031, - 1.4025485, - 1.4015235000000001, - 1.1832235, - 1.2967985, - 1.5199235, - 1.3151235000000001, - 1.4081485, - 1.4839235, - 1.5486485, - 1.5069485, - 1.3843985, - 1.4871235, - 1.5826735, - 1.6949735000000001, - 1.6522235, - 1.7009235, - 1.6203235, - 1.7006735, - 1.6833985, - 1.7319985, - 1.8180485, - 1.8129485, - 1.7655235, - 1.8395735, - 1.8784235, - 1.7943985, - 1.9805735, - 1.9507235, - 2.0297485, - 2.0297485, - 1.8881235, - 1.9921485, - 2.0037485, - 1.9986235, - 1.9864485, - 1.9603235, - 2.0113485, - 2.0128235, - 1.9967735, - 1.9875485000000002, - 1.9966235, - 1.9943235000000001, - 1.9955735000000001, - 1.9939985, - 1.9936485000000002, - 2.0076735, - 2.0076735, - 1.9983735, - 1.9994485, - 1.9913985, - 1.9823485, - 1.9918985, - 1.9984735, - 1.942825 - ], - "yaxis": "y" - }, - { - "name": "Benchmark", - "showlegend": true, - "type": "scatter", - "x": [ - "2023-07-05T00:00:00", - "2023-07-06T00:00:00", - "2023-07-07T00:00:00", - "2023-07-10T00:00:00", - "2023-07-11T00:00:00", - "2023-07-12T00:00:00", - "2023-07-13T00:00:00", - "2023-07-14T00:00:00", - "2023-07-17T00:00:00", - "2023-07-18T00:00:00", - "2023-07-19T00:00:00", - "2023-07-20T00:00:00", - "2023-07-21T00:00:00", - "2023-07-24T00:00:00", - "2023-07-25T00:00:00", - "2023-07-26T00:00:00", - "2023-07-27T00:00:00", - "2023-07-28T00:00:00", - "2023-07-31T00:00:00", - "2023-08-01T00:00:00", - "2023-08-02T00:00:00", - "2023-08-03T00:00:00", - "2023-08-04T00:00:00", - "2023-08-07T00:00:00", - "2023-08-08T00:00:00", - "2023-08-09T00:00:00", - "2023-08-10T00:00:00", - "2023-08-11T00:00:00", - "2023-08-14T00:00:00", - "2023-08-15T00:00:00", - "2023-08-16T00:00:00", - "2023-08-17T00:00:00", - "2023-08-18T00:00:00", - "2023-08-21T00:00:00", - "2023-08-22T00:00:00", - "2023-08-23T00:00:00", - "2023-08-24T00:00:00", - "2023-08-25T00:00:00", - "2023-08-28T00:00:00", - "2023-08-29T00:00:00", - "2023-08-30T00:00:00", - "2023-08-31T00:00:00", - "2023-09-01T00:00:00", - "2023-09-04T00:00:00", - "2023-09-05T00:00:00", - "2023-09-06T00:00:00", - "2023-09-07T00:00:00", - "2023-09-08T00:00:00", - "2023-09-11T00:00:00", - "2023-09-12T00:00:00", - "2023-09-13T00:00:00", - "2023-09-14T00:00:00", - "2023-09-15T00:00:00", - "2023-09-18T00:00:00", - "2023-09-19T00:00:00", - "2023-09-20T00:00:00", - "2023-09-21T00:00:00", - "2023-09-22T00:00:00", - "2023-09-25T00:00:00", - "2023-09-26T00:00:00", - "2023-09-27T00:00:00", - "2023-09-28T00:00:00", - "2023-09-29T00:00:00", - "2023-10-02T00:00:00", - "2023-10-03T00:00:00", - "2023-10-04T00:00:00", - "2023-10-05T00:00:00", - "2023-10-06T00:00:00", - "2023-10-09T00:00:00", - "2023-10-10T00:00:00", - "2023-10-11T00:00:00", - "2023-10-12T00:00:00", - "2023-10-13T00:00:00", - "2023-10-16T00:00:00", - "2023-10-17T00:00:00", - "2023-10-18T00:00:00", - "2023-10-19T00:00:00", - "2023-10-20T00:00:00", - "2023-10-23T00:00:00", - "2023-10-24T00:00:00", - "2023-10-25T00:00:00", - "2023-10-26T00:00:00", - "2023-10-27T00:00:00", - "2023-10-30T00:00:00", - "2023-10-31T00:00:00", - "2023-11-01T00:00:00", - "2023-11-02T00:00:00", - "2023-11-03T00:00:00", - "2023-11-06T00:00:00", - "2023-11-07T00:00:00", - "2023-11-08T00:00:00", - "2023-11-09T00:00:00", - "2023-11-10T00:00:00", - "2023-11-13T00:00:00", - "2023-11-14T00:00:00", - "2023-11-15T00:00:00", - "2023-11-16T00:00:00", - "2023-11-17T00:00:00", - "2023-11-20T00:00:00", - "2023-11-21T00:00:00", - "2023-11-22T00:00:00", - "2023-11-23T00:00:00", - "2023-11-24T00:00:00", - "2023-11-27T00:00:00", - "2023-11-28T00:00:00", - "2023-11-29T00:00:00", - "2023-11-30T00:00:00", - "2023-12-01T00:00:00", - "2023-12-04T00:00:00", - "2023-12-05T00:00:00", - "2023-12-06T00:00:00", - "2023-12-07T00:00:00", - "2023-12-08T00:00:00", - "2023-12-11T00:00:00", - "2023-12-12T00:00:00", - "2023-12-13T00:00:00", - "2023-12-14T00:00:00", - "2023-12-15T00:00:00", - "2023-12-18T00:00:00", - "2023-12-19T00:00:00", - "2023-12-20T00:00:00", - "2023-12-21T00:00:00", - "2023-12-22T00:00:00", - "2023-12-25T00:00:00", - "2023-12-26T00:00:00", - "2023-12-27T00:00:00", - "2023-12-28T00:00:00", - "2023-12-29T00:00:00", - "2024-01-01T00:00:00", - "2024-01-02T00:00:00", - "2024-01-03T00:00:00", - "2024-01-04T00:00:00", - "2024-01-05T00:00:00", - "2024-01-08T00:00:00", - "2024-01-09T00:00:00", - "2024-01-10T00:00:00", - "2024-01-11T00:00:00", - "2024-01-12T00:00:00", - "2024-01-15T00:00:00", - "2024-01-16T00:00:00", - "2024-01-17T00:00:00", - "2024-01-18T00:00:00", - "2024-01-19T00:00:00", - "2024-01-22T00:00:00", - "2024-01-23T00:00:00", - "2024-01-24T00:00:00", - "2024-01-25T00:00:00", - "2024-01-26T00:00:00", - "2024-01-29T00:00:00", - "2024-01-30T00:00:00", - "2024-01-31T00:00:00", - "2024-02-01T00:00:00", - "2024-02-02T00:00:00", - "2024-02-05T00:00:00", - "2024-02-06T00:00:00", - "2024-02-07T00:00:00", - "2024-02-08T00:00:00", - "2024-02-09T00:00:00", - "2024-02-12T00:00:00", - "2024-02-13T00:00:00", - "2024-02-14T00:00:00", - "2024-02-15T00:00:00", - "2024-02-16T00:00:00", - "2024-02-19T00:00:00", - "2024-02-20T00:00:00", - "2024-02-21T00:00:00", - "2024-02-22T00:00:00", - "2024-02-23T00:00:00", - "2024-02-26T00:00:00", - "2024-02-27T00:00:00", - "2024-02-28T00:00:00", - "2024-02-29T00:00:00", - "2024-03-01T00:00:00", - "2024-03-04T00:00:00", - "2024-03-05T00:00:00", - "2024-03-06T00:00:00", - "2024-03-07T00:00:00", - "2024-03-08T00:00:00", - "2024-03-11T00:00:00", - "2024-03-12T00:00:00", - "2024-03-13T00:00:00", - "2024-03-14T00:00:00", - "2024-03-15T00:00:00", - "2024-03-18T00:00:00", - "2024-03-19T00:00:00", - "2024-03-20T00:00:00", - "2024-03-21T00:00:00", - "2024-03-22T00:00:00", - "2024-03-25T00:00:00", - "2024-03-26T00:00:00", - "2024-03-27T00:00:00", - "2024-03-28T00:00:00", - "2024-03-29T00:00:00", - "2024-04-01T00:00:00", - "2024-04-02T00:00:00", - "2024-04-03T00:00:00", - "2024-04-04T00:00:00", - "2024-04-05T00:00:00", - "2024-04-08T00:00:00", - "2024-04-09T00:00:00", - "2024-04-10T00:00:00", - "2024-04-11T00:00:00", - "2024-04-12T00:00:00", - "2024-04-15T00:00:00", - "2024-04-16T00:00:00", - "2024-04-17T00:00:00", - "2024-04-18T00:00:00", - "2024-04-19T00:00:00", - "2024-04-22T00:00:00", - "2024-04-23T00:00:00", - "2024-04-24T00:00:00", - "2024-04-25T00:00:00", - "2024-04-26T00:00:00", - "2024-04-29T00:00:00", - "2024-04-30T00:00:00", - "2024-05-01T00:00:00", - "2024-05-02T00:00:00", - "2024-05-03T00:00:00", - "2024-05-06T00:00:00", - "2024-05-07T00:00:00", - "2024-05-08T00:00:00", - "2024-05-09T00:00:00", - "2024-05-10T00:00:00", - "2024-05-13T00:00:00", - "2024-05-14T00:00:00", - "2024-05-15T00:00:00", - "2024-05-16T00:00:00", - "2024-05-17T00:00:00", - "2024-05-20T00:00:00", - "2024-05-21T00:00:00", - "2024-05-22T00:00:00", - "2024-05-23T00:00:00", - "2024-05-24T00:00:00", - "2024-05-27T00:00:00", - "2024-05-28T00:00:00", - "2024-05-29T00:00:00", - "2024-05-30T00:00:00", - "2024-05-31T00:00:00", - "2024-06-03T00:00:00", - "2024-06-04T00:00:00", - "2024-06-05T00:00:00", - "2024-06-06T00:00:00", - "2024-06-07T00:00:00", - "2024-06-10T00:00:00", - "2024-06-11T00:00:00", - "2024-06-12T00:00:00", - "2024-06-13T00:00:00", - "2024-06-14T00:00:00", - "2024-06-17T00:00:00", - "2024-06-18T00:00:00", - "2024-06-19T00:00:00", - "2024-06-20T00:00:00", - "2024-06-21T00:00:00", - "2024-06-24T00:00:00", - "2024-06-25T00:00:00", - "2024-06-26T00:00:00", - "2024-06-27T00:00:00", - "2024-06-28T00:00:00", - "2024-07-01T00:00:00", - "2024-07-02T00:00:00" - ], - "xaxis": "x", - "y": [ - null, - 0.9921693381570477, - 0.9896643941069733, - 0.9921693381570478, - 0.9984879980584669, - 1.0065217523052263, - 1.0145103978627712, - 1.0138785318726293, - 1.0173989379417383, - 1.024958809912948, - 1.0272380727804944, - 1.0204228729565767, - 1.0204228729565767, - 1.0249813986916692, - 1.0277796525239795, - 1.027937636238572, - 1.0211224364146543, - 1.0311195549680028, - 1.0330828504063643, - 1.0301266128594615, - 1.0157967186217762, - 1.012885589764088, - 1.0083045441185021, - 1.0171055592912746, - 1.012682497360281, - 1.0059124750938055, - 1.006273551212205, - 1.0056867939112777, - 1.0112381928866836, - 0.999458420256515, - 0.9921242294678332, - 0.9845643574966234, - 0.9850382397721728, - 0.9914471859202487, - 0.9887617382450885, - 0.9997743188174716, - 0.9859183757235637, - 0.9928689016151249, - 0.9991650416060509, - 1.0136077420008862, - 1.0177826028388581, - 1.0162931896760463, - 1.0181887876464721, - 1.0181887876464721, - 1.013788245625972, - 1.006973114670282, - 1.0038814821875082, - 1.0053934152608135, - 1.0120055226809244, - 1.0064540548372904, - 1.0076275694391452, - 1.0163157095865398, - 1.0005415797434851, - 1.0011283370444126, - 0.9990521665806732, - 0.9898675553790081, - 0.9735066682350257, - 0.9713176916141363, - 0.9754022662054517, - 0.9610723719677665, - 0.9614559679966592, - 0.9670299557507864, - 0.9646830642835323, - 0.9642993993864118, - 0.951391220843603, - 0.9583192268246707, - 0.9579581507062713, - 0.9693318073970537, - 0.9755376611413228, - 0.9806151778411792, - 0.9846320549645589, - 0.9786292936240967, - 0.9737548693280471, - 0.9840001889744171, - 0.9839550114169748, - 0.970843740470359, - 0.9623135151693292, - 0.9504885649817184, - 0.9488411681043141, - 0.95599485526791, - 0.9422742382416456, - 0.9309908677975198, - 0.9267708982703332, - 0.937851176310652, - 0.943741131493964, - 0.9538058786470203, - 0.9720849525401494, - 0.9809536651808576, - 0.9832103392696828, - 0.9860085931019932, - 0.9867307453387919, - 0.9790354784317108, - 0.9943131372204951, - 0.9933653726693961, - 1.0126373886710665, - 1.0147811877345136, - 1.0160223998043043, - 1.0172861317845883, - 1.0251167936275407, - 1.0228826394492088, - 1.0268318191046528, - 1.0268318191046528, - 1.027463685094795, - 1.0256132646818115, - 1.026628726700846, - 1.0259065744640472, - 1.029946040366148, - 1.036039087953267, - 1.0306004951350112, - 1.0303974027312042, - 1.0262451306719533, - 1.0340757925149058, - 1.0385214432246204, - 1.0425608402584932, - 1.0473224583973926, - 1.0617651587922279, - 1.0651727587041866, - 1.0591248198062821, - 1.0650824724575298, - 1.0715591160735416, - 1.0567102308710925, - 1.0667298693349343, - 1.0688736683983815, - 1.0688736683983815, - 1.0733870165760317, - 1.0753277921039, - 1.0757339769115137, - 1.0726197556500185, - 1.0726197556500185, - 1.0666169943095563, - 1.0579062653834406, - 1.0544986654714816, - 1.055942969945079, - 1.0710175363300563, - 1.069392728231373, - 1.0754405982610498, - 1.0749667159855003, - 1.0757113881327924, - 1.0757113881327924, - 1.0717622084773484, - 1.0658046246943285, - 1.0752826145464573, - 1.088687264143537, - 1.0909891157898046, - 1.0941709656510075, - 1.0953670690315835, - 1.1013246528146035, - 1.0999255258984484, - 1.108636254824564, - 1.107778776520122, - 1.0897027950307996, - 1.1039649918005492, - 1.115586849584353, - 1.1115247949035312, - 1.1147518911904042, - 1.1240493774174474, - 1.1245458484717181, - 1.131045080866451, - 1.1305486098121802, - 1.1149775035047045, - 1.125110016993924, - 1.1328729813689409, - 1.127231296146878, - 1.127231296146878, - 1.121025442402609, - 1.1220409044216435, - 1.145262100078758, - 1.1460519497834922, - 1.141854500166799, - 1.143975779319753, - 1.1424638462464476, - 1.146570940748256, - 1.15733525135939, - 1.1560941081578273, - 1.1445399478419591, - 1.1503396167786144, - 1.1617583821586115, - 1.154785267488329, - 1.1537923253797877, - 1.1662041017365536, - 1.164376063497608, - 1.162074349587796, - 1.1505201204036999, - 1.1573578401381108, - 1.1637894439331358, - 1.174553685676042, - 1.1784352367317779, - 1.176201151421674, - 1.1729515352243074, - 1.1707850785139113, - 1.1806241444844394, - 1.1803985321701391, - 1.1803985321701391, - 1.178344881616893, - 1.1708528448500746, - 1.172139027872624, - 1.1578317912818878, - 1.1699275313412412, - 1.1705819172418763, - 1.1719360043370448, - 1.160201271527863, - 1.168957178011421, - 1.1528219720499668, - 1.1383792716551315, - 1.1363031011913922, - 1.1295781876141313, - 1.1272538160573706, - 1.1174147500868423, - 1.1277051784224268, - 1.1410872392407854, - 1.1405456594973002, - 1.1362128149447357, - 1.1469771944240974, - 1.1510391802366917, - 1.1328052839010048, - 1.1291268941173034, - 1.1396881123246305, - 1.1538149141585088, - 1.1657301505927764, - 1.1670164713517814, - 1.1671292775089315, - 1.1738541222179648, - 1.1753661930277257, - 1.1755240390058626, - 1.180917523134904, - 1.1955408648912806, - 1.1930810295304208, - 1.194796123875761, - 1.196172662013195, - 1.1991063107813764, - 1.195653671048431, - 1.186920353343594, - 1.1947735350970394, - 1.1947735350970394, - 1.1956084934909883, - 1.1872361830363232, - 1.1793604125041564, - 1.1901022032047968, - 1.191072556534617, - 1.1924040548510642, - 1.206575896505929, - 1.206553307727208, - 1.205086552211345, - 1.2088099818160332, - 1.2117211795419494, - 1.2216730516696277, - 1.2241328870304875, - 1.2248776280460074, - 1.2346263389016512, - 1.2377631489418675, - 1.2377631489418675, - 1.234400726587351, - 1.228781630144009, - 1.2247872729311229, - 1.229503782380808, - 1.2310383042328346, - 1.2329790108924747, - 1.2281271065069184, - 1.2306547082039418, - 1.2389366635437224 - ], - "yaxis": "y" - }, - { - "customdata": [ - 11, - 6, - 7, - 1, - 9, - 1, - 0, - 3, - 3, - 0, - 1, - 1, - 5, - 2, - 0, - 0, - 1, - 0, - 3, - 6, - 0, - 4, - 0, - 0, - 1, - 0 - ], - "hovertemplate": "%{text}

Date: %{x}
Size: %{customdata}
PnL: %{y}
", - "marker": { - "color": [ - "red", - "red", - "red", - "red", - "green", - "red", - "green", - "red", - "red", - "green", - "green", - "green", - "red", - "green", - "green", - "green", - "red", - "green", - "green", - "green", - "green", - "red", - "green", - "green", - "green", - "green" - ] - }, - "mode": "markers", - "name": "Ticker", - "showlegend": false, - "text": [ - "TSLA", - "AAPL", - "MSFT", - "AMZN", - "NVDA", - "BA", - "WMT", - "TSLA", - "AAPL", - "INTC", - "QCOM", - "MSFT", - "SBUX", - "AMD", - "MU", - "INTC", - "DIS", - "AAPL", - "BAC", - "HD", - "BA", - "GOOG", - "WMT", - "DIS", - "AMZN", - "AAPL" - ], - "type": "scatter", - "x": [ - "2023-07-05T00:00:00", - "2023-07-05T00:00:00", - "2023-07-05T00:00:00", - "2023-07-05T00:00:00", - "2023-07-05T00:00:00", - "2023-08-10T00:00:00", - "2023-08-10T00:00:00", - "2023-08-17T00:00:00", - "2023-08-31T00:00:00", - "2023-09-15T00:00:00", - "2023-11-13T00:00:00", - "2023-11-14T00:00:00", - "2023-11-15T00:00:00", - "2023-11-15T00:00:00", - "2023-11-16T00:00:00", - "2023-11-17T00:00:00", - "2023-11-17T00:00:00", - "2023-11-22T00:00:00", - "2023-12-01T00:00:00", - "2023-12-04T00:00:00", - "2023-12-04T00:00:00", - "2024-01-26T00:00:00", - "2024-02-05T00:00:00", - "2024-02-07T00:00:00", - "2024-02-08T00:00:00", - "2024-05-21T00:00:00" - ], - "xaxis": "x2", - "y": [ - -0.6501993553998596, - -0.4889186803325959, - -0.6424292881235012, - -0.6569235629398011, - 10.403156000328119, - -0.6412509894586769, - null, - -0.5104828145837723, - -0.6808587157037782, - null, - 0.5598992423549543, - 0.4944752940479427, - -0.6791647504412722, - 0.44127410591160654, - null, - null, - -0.8882806196035345, - null, - 0.9158456754087038, - 0.015576414850613698, - null, - -0.01516121348762828, - null, - null, - 0.02066998964195627, - null - ], - "yaxis": "y2" - }, - { - "fill": "tozeroy", - "line": { - "color": "red" - }, - "name": "Drawdown", - "showlegend": false, - "type": "scatter", - "x": [ - "2023-07-05T00:00:00", - "2023-07-05T00:00:00", - "2023-07-06T00:00:00", - "2023-07-07T00:00:00", - "2023-07-10T00:00:00", - "2023-07-11T00:00:00", - "2023-07-12T00:00:00", - "2023-07-13T00:00:00", - "2023-07-14T00:00:00", - "2023-07-17T00:00:00", - "2023-07-18T00:00:00", - "2023-07-19T00:00:00", - "2023-07-20T00:00:00", - "2023-07-21T00:00:00", - "2023-07-24T00:00:00", - "2023-07-25T00:00:00", - "2023-07-26T00:00:00", - "2023-07-27T00:00:00", - "2023-07-28T00:00:00", - "2023-07-31T00:00:00", - "2023-08-01T00:00:00", - "2023-08-02T00:00:00", - "2023-08-03T00:00:00", - "2023-08-04T00:00:00", - "2023-08-07T00:00:00", - "2023-08-08T00:00:00", - "2023-08-09T00:00:00", - "2023-08-10T00:00:00", - "2023-08-11T00:00:00", - "2023-08-14T00:00:00", - "2023-08-15T00:00:00", - "2023-08-16T00:00:00", - "2023-08-17T00:00:00", - "2023-08-18T00:00:00", - "2023-08-21T00:00:00", - "2023-08-22T00:00:00", - "2023-08-23T00:00:00", - "2023-08-24T00:00:00", - "2023-08-25T00:00:00", - "2023-08-28T00:00:00", - "2023-08-29T00:00:00", - "2023-08-30T00:00:00", - "2023-08-31T00:00:00", - "2023-09-01T00:00:00", - "2023-09-04T00:00:00", - "2023-09-05T00:00:00", - "2023-09-06T00:00:00", - "2023-09-07T00:00:00", - "2023-09-08T00:00:00", - "2023-09-11T00:00:00", - "2023-09-12T00:00:00", - "2023-09-13T00:00:00", - "2023-09-14T00:00:00", - "2023-09-15T00:00:00", - "2023-09-18T00:00:00", - "2023-09-19T00:00:00", - "2023-09-20T00:00:00", - "2023-09-21T00:00:00", - "2023-09-22T00:00:00", - "2023-09-25T00:00:00", - "2023-09-26T00:00:00", - "2023-09-27T00:00:00", - "2023-09-28T00:00:00", - "2023-09-29T00:00:00", - "2023-10-02T00:00:00", - "2023-10-03T00:00:00", - "2023-10-04T00:00:00", - "2023-10-05T00:00:00", - "2023-10-06T00:00:00", - "2023-10-09T00:00:00", - "2023-10-10T00:00:00", - "2023-10-11T00:00:00", - "2023-10-12T00:00:00", - "2023-10-13T00:00:00", - "2023-10-16T00:00:00", - "2023-10-17T00:00:00", - "2023-10-18T00:00:00", - "2023-10-19T00:00:00", - "2023-10-20T00:00:00", - "2023-10-23T00:00:00", - "2023-10-24T00:00:00", - "2023-10-25T00:00:00", - "2023-10-26T00:00:00", - "2023-10-27T00:00:00", - "2023-10-30T00:00:00", - "2023-10-31T00:00:00", - "2023-11-01T00:00:00", - "2023-11-02T00:00:00", - "2023-11-03T00:00:00", - "2023-11-06T00:00:00", - "2023-11-07T00:00:00", - "2023-11-08T00:00:00", - "2023-11-09T00:00:00", - "2023-11-10T00:00:00", - "2023-11-13T00:00:00", - "2023-11-14T00:00:00", - "2023-11-15T00:00:00", - "2023-11-16T00:00:00", - "2023-11-17T00:00:00", - "2023-11-20T00:00:00", - "2023-11-21T00:00:00", - "2023-11-22T00:00:00", - "2023-11-23T00:00:00", - "2023-11-24T00:00:00", - "2023-11-27T00:00:00", - "2023-11-28T00:00:00", - "2023-11-29T00:00:00", - "2023-11-30T00:00:00", - "2023-12-01T00:00:00", - "2023-12-04T00:00:00", - "2023-12-05T00:00:00", - "2023-12-06T00:00:00", - "2023-12-07T00:00:00", - "2023-12-08T00:00:00", - "2023-12-11T00:00:00", - "2023-12-12T00:00:00", - "2023-12-13T00:00:00", - "2023-12-14T00:00:00", - "2023-12-15T00:00:00", - "2023-12-18T00:00:00", - "2023-12-19T00:00:00", - "2023-12-20T00:00:00", - "2023-12-21T00:00:00", - "2023-12-22T00:00:00", - "2023-12-25T00:00:00", - "2023-12-26T00:00:00", - "2023-12-27T00:00:00", - "2023-12-28T00:00:00", - "2023-12-29T00:00:00", - "2024-01-01T00:00:00", - "2024-01-02T00:00:00", - "2024-01-03T00:00:00", - "2024-01-04T00:00:00", - "2024-01-05T00:00:00", - "2024-01-08T00:00:00", - "2024-01-09T00:00:00", - "2024-01-10T00:00:00", - "2024-01-11T00:00:00", - "2024-01-12T00:00:00", - "2024-01-15T00:00:00", - "2024-01-16T00:00:00", - "2024-01-17T00:00:00", - "2024-01-18T00:00:00", - "2024-01-19T00:00:00", - "2024-01-22T00:00:00", - "2024-01-23T00:00:00", - "2024-01-24T00:00:00", - "2024-01-25T00:00:00", - "2024-01-26T00:00:00", - "2024-01-29T00:00:00", - "2024-01-30T00:00:00", - "2024-01-31T00:00:00", - "2024-02-01T00:00:00", - "2024-02-02T00:00:00", - "2024-02-05T00:00:00", - "2024-02-06T00:00:00", - "2024-02-07T00:00:00", - "2024-02-08T00:00:00", - "2024-02-09T00:00:00", - "2024-02-12T00:00:00", - "2024-02-13T00:00:00", - "2024-02-14T00:00:00", - "2024-02-15T00:00:00", - "2024-02-16T00:00:00", - "2024-02-19T00:00:00", - "2024-02-20T00:00:00", - "2024-02-21T00:00:00", - "2024-02-22T00:00:00", - "2024-02-23T00:00:00", - "2024-02-26T00:00:00", - "2024-02-27T00:00:00", - "2024-02-28T00:00:00", - "2024-02-29T00:00:00", - "2024-03-01T00:00:00", - "2024-03-04T00:00:00", - "2024-03-05T00:00:00", - "2024-03-06T00:00:00", - "2024-03-07T00:00:00", - "2024-03-08T00:00:00", - "2024-03-11T00:00:00", - "2024-03-12T00:00:00", - "2024-03-13T00:00:00", - "2024-03-14T00:00:00", - "2024-03-15T00:00:00", - "2024-03-18T00:00:00", - "2024-03-19T00:00:00", - "2024-03-20T00:00:00", - "2024-03-21T00:00:00", - "2024-03-22T00:00:00", - "2024-03-25T00:00:00", - "2024-03-26T00:00:00", - "2024-03-27T00:00:00", - "2024-03-28T00:00:00", - "2024-03-29T00:00:00", - "2024-04-01T00:00:00", - "2024-04-02T00:00:00", - "2024-04-03T00:00:00", - "2024-04-04T00:00:00", - "2024-04-05T00:00:00", - "2024-04-08T00:00:00", - "2024-04-09T00:00:00", - "2024-04-10T00:00:00", - "2024-04-11T00:00:00", - "2024-04-12T00:00:00", - "2024-04-15T00:00:00", - "2024-04-16T00:00:00", - "2024-04-17T00:00:00", - "2024-04-18T00:00:00", - "2024-04-19T00:00:00", - "2024-04-22T00:00:00", - "2024-04-23T00:00:00", - "2024-04-24T00:00:00", - "2024-04-25T00:00:00", - "2024-04-26T00:00:00", - "2024-04-29T00:00:00", - "2024-04-30T00:00:00", - "2024-05-01T00:00:00", - "2024-05-02T00:00:00", - "2024-05-03T00:00:00", - "2024-05-06T00:00:00", - "2024-05-07T00:00:00", - "2024-05-08T00:00:00", - "2024-05-09T00:00:00", - "2024-05-10T00:00:00", - "2024-05-13T00:00:00", - "2024-05-14T00:00:00", - "2024-05-15T00:00:00", - "2024-05-16T00:00:00", - "2024-05-17T00:00:00", - "2024-05-20T00:00:00", - "2024-05-21T00:00:00", - "2024-05-22T00:00:00", - "2024-05-23T00:00:00", - "2024-05-24T00:00:00", - "2024-05-27T00:00:00", - "2024-05-28T00:00:00", - "2024-05-29T00:00:00", - "2024-05-30T00:00:00", - "2024-05-31T00:00:00", - "2024-06-03T00:00:00", - "2024-06-04T00:00:00", - "2024-06-05T00:00:00", - "2024-06-06T00:00:00", - "2024-06-07T00:00:00", - "2024-06-10T00:00:00", - "2024-06-11T00:00:00", - "2024-06-12T00:00:00", - "2024-06-13T00:00:00", - "2024-06-14T00:00:00", - "2024-06-17T00:00:00", - "2024-06-18T00:00:00", - "2024-06-19T00:00:00", - "2024-06-20T00:00:00", - "2024-06-21T00:00:00", - "2024-06-24T00:00:00", - "2024-06-25T00:00:00", - "2024-06-26T00:00:00", - "2024-06-27T00:00:00", - "2024-06-28T00:00:00", - "2024-07-01T00:00:00" - ], - "xaxis": "x3", - "y": [ - 0, - -0.11032460789731446, - -0.11807460789731483, - -0.13482460789731454, - -0.15157460789731447, - -0.13969960789731484, - -0.11457460789731444, - -0.09469960789731413, - -0.09244960789731482, - -0.04994960789731462, - -0.016449607897314533, - 0, - -0.12788674591896532, - -0.12740460927082653, - -0.12595819932640784, - -0.09329344141496665, - -0.15850242307581497, - -0.12439125521995509, - -0.12427072105792047, - -0.1006460252990915, - -0.12463232354402476, - -0.12239121648526308, - -0.193988508733958, - -0.20353277208861575, - -0.19244362918141056, - -0.20968001435239236, - -0.2466350431361667, - -0.2583365796586743, - -0.2735238840750641, - -0.24351087772838875, - -0.24688583426536448, - -0.24688583426536426, - -0.26293583803088416, - -0.26558758959565065, - -0.2172533906196794, - -0.23015054595740736, - -0.14469182507470557, - -0.23003001179537275, - -0.2359361857350799, - -0.2325612291981043, - -0.1967625830737566, - -0.19700365139782638, - -0.20600620512867973, - -0.2213622573719185, - -0.21926496295251208, - -0.21926496295251208, - -0.24534855561685165, - -0.2616190810067206, - -0.26981540402508986, - -0.264270832571487, - -0.2729492922379956, - -0.26053427354840686, - -0.2627038884650339, - -0.2857259134136888, - -0.2617396151687553, - -0.29428383891816223, - -0.30706046009385546, - -0.31802906883902593, - -0.3199576154315833, - -0.30633725512164645, - -0.3149675011233407, - -0.30747027624477374, - -0.31012202780954023, - -0.30296229858467105, - -0.2898240749228731, - -0.3027453370930081, - -0.29404277059409256, - -0.2908365618839658, - -0.2821098885526434, - -0.28642501155349076, - -0.281748286066539, - -0.27355196304816976, - -0.27150288229357744, - -0.291511553191361, - -0.2850027084414797, - -0.3038060377189148, - -0.3212352775491526, - -0.3316494291489629, - -0.34648761908439896, - -0.3354707966744145, - -0.3303119345393233, - -0.34646524988416305, - -0.35622851700898506, - -0.35188928717573087, - -0.3497196722591037, - -0.35514370955067154, - -0.3486348648007901, - -0.3388715976759681, - -0.32802352309283245, - -0.3225994858012645, - -0.32368429325957815, - -0.3171754485096968, - -0.3128362186764425, - -0.3030729515516205, - -0.30513888972130776, - -0.299973992037626, - -0.3320205469109717, - -0.32249834811021927, - -0.3349271221992063, - -0.3238861929568152, - -0.35047602910170095, - -0.3578045061534191, - -0.36248123164037116, - -0.36248123164037116, - -0.366193683831044, - -0.3790908391687722, - -0.3970934508386278, - -0.402975517945928, - -0.4185656307383572, - -0.4496038641867237, - -0.3950501024497549, - -0.40580174970326266, - -0.3636388998234754, - -0.3787538837426444, - -0.38598593346473486, - -0.36795402282432266, - -0.3275750785426511, - -0.3207287381390722, - -0.3310464624092546, - -0.3103628002040759, - -0.2859425789758173, - -0.3302750437722316, - -0.31778770458542216, - -0.3281777493528253, - -0.30674677534303074, - -0.30674677534303074, - -0.3143404275512257, - -0.3215965841057231, - -0.3199091058372353, - -0.3455105618534354, - -0.3455105618534354, - -0.3943751111423598, - -0.3480417792561671, - -0.3632772973373709, - -0.3072530188235769, - -0.29004074048500184, - -0.25795153371479185, - -0.2855056431559565, - -0.2940876754928371, - -0.2389312429456939, - -0.2389312429456939, - -0.24941771504272514, - -0.2217189646071187, - -0.16882857430623066, - -0.17803738428569238, - -0.24247494730951824, - -0.14869936924641258, - -0.1319451207235698, - -0.16123357045975029, - -0.12355459140765923, - -0.08423634775189426, - -0.1329598929832987, - -0.10489954006158775, - -0.023563087520477644, - 0, - -0.019888300478538956, - 0, - -0.027557793188302093, - 0, - -0.0023698600683969007, - -0.012948053646422708, - 0, - -0.011085258833203548, - -0.02917723787229831, - -0.09196581715017627, - -0.09196581715017627, - -0.16887241475335957, - 0, - 0, - -0.0053601347257670184, - 0, - -0.03481320268848498, - 0, - 0, - 0, - 0, - 0, - -0.01373827612231815, - -0.05400719039560564, - -0.0766790996247867, - -0.05720528090276711, - -0.03529911165417454, - -0.07577822905938858, - -0.06059856003243391, - -0.05592904760178674, - -0.04364717889352898, - 0, - -0.018531113227520435, - 0, - 0, - -0.03394740869206481, - -0.041515120111409454, - 0, - 0, - -0.044597198791373804, - -0.06248461559213925, - -0.06505423652122, - -0.1314218348506362, - -0.10741015483556204, - -0.08649629560721339, - -0.053448115324873036, - -0.11236381295995634, - -0.06281295604418824, - -0.10782414931858064, - -0.14739631162641953, - -0.12916627870177755, - -0.19910700494683642, - -0.1996923074917939, - -0.3243474738958523, - -0.25949309678022714, - -0.13208272571332103, - -0.24902902933013837, - -0.19590925445731389, - -0.1526396931459647, - -0.11567997878269098, - -0.13949179939216905, - -0.2094711426941278, - -0.15081240715195177, - -0.0962507894244764, - -0.03212447157209164, - -0.05653587039835528, - -0.028726861676973137, - -0.07475162765116983, - -0.028869618395255814, - -0.038734107628558556, - -0.010982201594489704, - 0, - -0.0028052053926211906, - -0.028890865342628635, - 0, - 0, - -0.04473165467176499, - 0, - -0.015071390725261757, - 0, - 0, - -0.0697746476842126, - -0.01852446074440517, - -0.0128094675360243, - -0.015334410656107189, - -0.021332690165764445, - -0.03420374168032758, - -0.009065161640879893, - -0.008338470694126077, - -0.01624585353847985, - -0.020790751154627363, - -0.016319754312726142, - -0.017452899517836018, - -0.0168370597324502, - -0.017613017862036395, - -0.017785453001944562, - -0.010875730609915757, - -0.010875730609915757, - -0.015457578613186196, - -0.014927956397754238, - -0.01889396461563886, - -0.023352644661831956, - -0.01864762870148451, - -0.015408311430355148, - -0.042824911691848655 - ], - "yaxis": "y3" - }, - { - "histnorm": "percent", - "marker": { - "color": "purple" - }, - "showlegend": false, - "type": "histogram", - "xaxis": "x4", - "y": [ - null, - 0.04897850815776583, - -0.0028924013727966713, - 0.0035914562994507904, - -0.09050976476023209, - -0.08787695153508024, - 0.01092437081611286, - 0.040374322983247835, - 0.019074229260788167, - -0.06222809915382577, - -0.021789708350880677, - -0.047925162988197045, - 0.02499155528033481, - 0.02991575633525545, - -0.013096244799587264, - -0.07759627717385598, - -0.00826559411738148, - 0.03682359141835301, - 0.03713012642354552, - -0.0457066069088653, - -0.041430210674472834, - -0.0879729380239177, - 0.06847160935166108, - 0.07679310998481426, - 0.0042883591986988545, - 0.012307784548107215, - -0.06376822844176522, - 0.10866523457573996, - 0.1774428591738455, - 0.009137710479087957, - 0.16413446949078958, - 0.1459507198206773, - 6.661338147750939e-16, - 0.17364611046617062, - 0.0862761411339299, - 0.06470502059644012, - -0.006967674140763047, - 0.1089405358296418, - 0.009613410787088661, - -0.10741015483556204, - -0.00046381267416528704, - -0.24269130845886178, - 0.25413622256393364, - 0.06654654845804786, - 0.07455737746792734, - 0.03813194749527171, - 0.10489805412775755, - 0.02718221968980572, - 0.004529011062068156, - -0.008570050150350061, - 0.001403105286788664, - 0.00005004069074199258, - -0.027845654782362228 - ], - "yaxis": "y4" - }, - { - "histnorm": "percent", - "marker": { - "color": "purple" - }, - "showlegend": false, - "type": "histogram", - "xaxis": "x5", - "y": [ - null, - -0.117150958124833, - -0.12211190324441346, - -0.07486167657796206, - -0.0741743689309875, - 0.1391340131026142, - 0.27488856924644334, - 0.5725225003467984, - 0.2385328710016641, - -0.13949179939216905, - 0.32967280308322233, - -0.0026325656586719814, - -0.027845654782362228 - ], - "yaxis": "y5" - } - ], - "layout": { - "annotations": [ - { - "font": { - "size": 16 - }, - "showarrow": false, - "text": "EQUITY CURVE", - "x": 0.5, - "xanchor": "center", - "xref": "paper", - "y": 0.9999999999999999, - "yanchor": "bottom", - "yref": "paper" - }, - { - "font": { - "size": 16 - }, - "showarrow": false, - "text": "TRADES", - "x": 0.5, - "xanchor": "center", - "xref": "paper", - "y": 0.5576923076923076, - "yanchor": "bottom", - "yref": "paper" - }, - { - "font": { - "size": 16 - }, - "showarrow": false, - "text": "PORTFOLIO DRAWDOWN", - "x": 0.5, - "xanchor": "center", - "xref": "paper", - "y": 0.3769230769230769, - "yanchor": "bottom", - "yref": "paper" - }, - { - "font": { - "size": 16 - }, - "showarrow": false, - "text": "WEEKLY PORTFOLIO RTRNS", - "x": 0.2375, - "xanchor": "center", - "xref": "paper", - "y": 0.13076923076923078, - "yanchor": "bottom", - "yref": "paper" - }, - { - "font": { - "size": 16 - }, - "showarrow": false, - "text": "MONTHLY PORTFOLIO RTRNS", - "x": 0.7625, - "xanchor": "center", - "xref": "paper", - "y": 0.13076923076923078, - "yanchor": "bottom", - "yref": "paper" - } - ], - "height": 1050, - "hovermode": "x unified", - "margin": { - "b": 20, - "l": 15, - "r": 15, - "t": 50 - }, - "paper_bgcolor": "WHITE", - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "heatmapgl": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmapgl" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "width": 1200, - "xaxis": { - "anchor": "y", - "domain": [ - 0, - 1 - ] - }, - "xaxis2": { - "anchor": "y2", - "domain": [ - 0, - 1 - ] - }, - "xaxis3": { - "anchor": "y3", - "domain": [ - 0, - 1 - ] - }, - "xaxis4": { - "anchor": "y4", - "domain": [ - 0, - 0.475 - ] - }, - "xaxis5": { - "anchor": "y5", - "domain": [ - 0.525, - 1 - ] - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0.6076923076923076, - 0.9999999999999999 - ] - }, - "yaxis2": { - "anchor": "x2", - "domain": [ - 0.42692307692307685, - 0.5576923076923076 - ] - }, - "yaxis3": { - "anchor": "x3", - "domain": [ - 0.1807692307692308, - 0.3769230769230769 - ] - }, - "yaxis4": { - "anchor": "x4", - "domain": [ - 0, - 0.13076923076923078 - ] - }, - "yaxis5": { - "anchor": "x5", - "domain": [ - 0, - 0.13076923076923078 - ] - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "evb_backtest.portfolio.plot_portfolio()" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Start 2023-07-05 00:00:00\n", - "End 2024-07-01 00:00:00\n", - "Duration 362 days 00:00:00\n", - "Exposure Time [%] 100.0\n", - "Equity Final [$] 38856.5\n", - "Equity Peak [$] 40594.973877\n", - "Return [%] 94.282489\n", - "Buy & Hold Return [%] 20.506831\n", - "CAGR [%] 95.354757\n", - "Volatility Ann. [%] 76.683863\n", - "Sharpe Ratio 1.241244\n", - "Sortino Ratio 1.99267\n", - "Skew 1.586575\n", - "Calmar Ratio 2.120862\n", - "Max. Drawdown [%] -44.960386\n", - "Max. Drawdown Value [$] -11360.15\n", - "Avg. Drawdown [%] -17.535628\n", - "Max. Drawdown Duration 198 days 00:00:00\n", - "Avg Dradown Duration 60 days 01:28:36.923076923\n", - "# Trades 26\n", - "Win Rate [%] 41.18\n", - "Lose Rate [%] 58.82\n", - "Avg. Trade [%] 41.160157\n", - "Avg. Winning Trade [%] 183.584239\n", - "Avg. Losing Trade [%] -58.5367\n", - "Best Trade [%] 1040.3156\n", - "Worst Trade [%] -88.828062\n", - "Avg Trade Duration 101.807692\n", - "Avg Win Trade Duration 220.571429\n", - "Avg Lose Duration 35.6\n", - "Max Trade Duration 362\n", - "Max Win Trade Duration 362\n", - "Max Lose Duration 112\n", - "Profit Factor 2.176023\n", - "Expectancy [%] 41.168703\n", - "SQN 0.821978\n", - "2023 Return [%] datetime\n", - "2023-07-05 -29.471147\n", - "2023-07-05 ...\n", - "2024 Return [%] 186.240548\n", - "Winning Streak 2\n", - "Losing Streak 4\n", - "_strategy None\n", - "equity_curve TSLA AAPL M...\n", - "_trades Ticker PnL ReturnPct EntryPric...\n", - "_tickers [TSLA, AAPL, MSFT, AVGO, AMZN, NVDA, JNJ, HD, ...\n", - "dtype: object" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.portfolio.aggregate()" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
TickerPnLReturnPctEntryPriceEntryCommissionEntrySlippageEntryMarketValueTotalEntryCostAuxilaryEntryCostExitPriceExitCommissionExitSlippageExitMarketValueTotalExitCostAuxilaryExitCostQuantityEntryTimeExitTimeDurationPositions
0TSLA-17218.689932-65.019936264.821701715.0-1.9612882198.0387123626.077423-1428.03871292.634802715.01.4828191733.9828191735.465638-1.482819112023-07-052023-08-0228&L:TSLA20240621C333.33&S:TSLA20240621C340
1AAPL-12947.146348-48.891868264.811857390.0-1.1288601198.8711401977.742280-778.871140135.340393390.02.0423591202.0423591204.084718-2.04235962023-07-052023-08-0430&L:AAPL20240621C230&S:AAPL20240621C240
2MSFT-17030.068631-64.242929265.088609455.00.6202621400.6202622311.240525-910.62026294.787923455.0-1.4845421118.5154581117.0309161.48454272023-07-052023-08-0935&L:MSFT20240621C370&S:MSFT20240621C375
3AMZN-17417.800259-65.692356265.14196265.00.141962200.141962330.283925-130.14196290.96396065.0-0.036040155.963960155.9279200.03604012023-07-052023-10-25112&L:AMZN20240621C165&S:AMZN20240621C175
4NVDA265144.0905251040.315600254.868898585.0-1.1799181708.8200822877.640164-1168.8200822906.309803585.0-10.71177126741.78822926731.07645810.71177192023-07-052024-07-01362&L:NVDA20240621C770&S:NVDA20240621C800
5BA-16044.206254-64.125099250.20166165.00.201661185.201661315.403322-130.20166189.75959865.0-0.240402154.759598154.5191960.24040212023-08-102023-08-177&L:BA20240621C300&S:BA20240621C310
6WMTNaNNaNNaN0.0-0.0000000.000000NaNNaNNaN0.00.0000000.000000NaNNaN02023-08-102023-08-177&L:WMT20240621C175&S:WMT20240621C180
7TSLA-13530.395534-51.048281265.050951195.00.152852600.152852990.305704-390.152852129.746995195.0-0.759014584.240986583.4819720.75901432023-08-172023-10-2064&L:TSLA20240920C305&S:TSLA20240920C315
8AAPL-17922.971075-68.085872263.240679195.0-0.777962594.722038983.944075-389.22203884.010968195.00.032905447.032905447.065811-0.03290532023-08-312023-09-077&L:AAPL20240920C260&S:AAPL20240920C310
9INTCNaNNaNNaN0.0-0.0000000.000000NaNNaNNaN0.00.0000000.000000NaNNaN02023-09-152023-09-205&L:INTC20240621C40&S:INTC20240621C45
10QCOM14017.05736455.989924250.34964065.00.349640185.349640315.699280-130.349640390.52021365.00.520213455.520213456.040427-0.52021312023-11-132024-07-01231&L:QCOM20250117C135&S:QCOM20250117C140
11MSFT12874.89140249.447529260.37481765.00.374817195.374817325.749633-130.374817389.12373165.0-0.876269454.123731453.2474610.87626912023-11-142024-07-01230&L:MSFT20241220C395&S:MSFT20241220C400
12SBUX-17511.028733-67.916475257.831825325.01.659127964.1591271615.818254-651.65912782.721538325.01.107690738.607690739.715380-1.10769052023-11-152023-11-2914&L:SBUX20250117C115&S:SBUX20250117C120
13AMD11043.29751344.127411250.259360130.00.518719370.518719631.037438-260.518719360.692335130.01.384669851.384669852.769339-1.38466922023-11-152024-07-01229&L:AMD20240920C180&S:AMD20240920C200
14MUNaNNaNNaN0.00.0000000.000000NaNNaNNaN0.00.0000000.000000NaNNaN02023-11-162024-07-01228&L:MU20250117C85&S:MU20250117C90
15INTCNaNNaNNaN0.00.0000000.000000NaNNaNNaN0.0-0.0000000.000000NaNNaN02023-11-172024-04-03138&L:INTC20240920C47&S:INTC20240920C50
16DIS-20722.281158-88.828062233.28530165.00.285301168.285301298.570602-130.28530126.06248965.00.06248991.06248991.124979-0.06248912023-11-172024-01-1054&L:DIS20240920C115&S:DIS20240920C125
17AAPLNaNNaNNaN0.0-0.0000000.000000NaNNaNNaN0.00.0000000.000000NaNNaN02023-11-222024-01-0443&L:AAPL20241220C215&S:AAPL20241220C220
18BAC24158.62451591.584568263.784884195.0-0.645348596.354652985.709303-389.354652505.371129195.01.1133871711.1133871712.226774-1.11338732023-12-012024-07-01213&L:BAC20250117C35&S:BAC20250117C55
19HD218.1384071.557641140.044041390.00.264243450.2642431230.528487-780.264243142.225425390.0-1.6474521243.3525481241.7050961.64745262023-12-042024-04-17135&L:HD20250117C390&S:HD20250117C400
20BANaNNaNNaN0.0-0.0000000.000000NaNNaNNaN0.00.0000000.000000NaNNaN02023-12-042024-01-1239&L:BA20250117C310&S:BA20250117C320
21GOOG-388.684985-1.516121256.367991260.0-0.528034765.4719661284.943931-519.471966252.481142260.0-0.0754341269.9245661269.8491330.07543442024-01-262024-01-315&L:GOOG20250117C190&S:GOOG20250117C200
22WMTNaNNaNNaN0.00.0000000.000000NaNNaNNaN0.00.0000000.000000NaNNaN02024-02-052024-07-01147&L:WMT20250117C185&S:WMT20250117C190
23DISNaNNaNNaN0.0-0.0000000.000000NaNNaNNaN0.0-0.0000000.000000NaNNaN02024-02-072024-05-1699&L:DIS20250117C130&S:DIS20250117C150
24AMZN542.9268982.066999262.66433065.00.164330197.664330327.828660-130.164330268.09359965.00.593599333.093599333.687198-0.59359912024-02-082024-07-01144&L:AMZN20250117C185&S:AMZN20250117C190
25AAPLNaNNaNNaN0.00.0000000.000000NaNNaNNaN0.0-0.0000000.000000NaNNaN02024-05-212024-07-0141&L:AAPL20250620C225&S:AAPL20250620C230
\n", - "
" - ], - "text/plain": [ - " Ticker PnL ReturnPct EntryPrice EntryCommission \\\n", - "0 TSLA -17218.689932 -65.019936 264.821701 715.0 \n", - "1 AAPL -12947.146348 -48.891868 264.811857 390.0 \n", - "2 MSFT -17030.068631 -64.242929 265.088609 455.0 \n", - "3 AMZN -17417.800259 -65.692356 265.141962 65.0 \n", - "4 NVDA 265144.090525 1040.315600 254.868898 585.0 \n", - "5 BA -16044.206254 -64.125099 250.201661 65.0 \n", - "6 WMT NaN NaN NaN 0.0 \n", - "7 TSLA -13530.395534 -51.048281 265.050951 195.0 \n", - "8 AAPL -17922.971075 -68.085872 263.240679 195.0 \n", - "9 INTC NaN NaN NaN 0.0 \n", - "10 QCOM 14017.057364 55.989924 250.349640 65.0 \n", - "11 MSFT 12874.891402 49.447529 260.374817 65.0 \n", - "12 SBUX -17511.028733 -67.916475 257.831825 325.0 \n", - "13 AMD 11043.297513 44.127411 250.259360 130.0 \n", - "14 MU NaN NaN NaN 0.0 \n", - "15 INTC NaN NaN NaN 0.0 \n", - "16 DIS -20722.281158 -88.828062 233.285301 65.0 \n", - "17 AAPL NaN NaN NaN 0.0 \n", - "18 BAC 24158.624515 91.584568 263.784884 195.0 \n", - "19 HD 218.138407 1.557641 140.044041 390.0 \n", - "20 BA NaN NaN NaN 0.0 \n", - "21 GOOG -388.684985 -1.516121 256.367991 260.0 \n", - "22 WMT NaN NaN NaN 0.0 \n", - "23 DIS NaN NaN NaN 0.0 \n", - "24 AMZN 542.926898 2.066999 262.664330 65.0 \n", - "25 AAPL NaN NaN NaN 0.0 \n", - "\n", - " EntrySlippage EntryMarketValue TotalEntryCost AuxilaryEntryCost \\\n", - "0 -1.961288 2198.038712 3626.077423 -1428.038712 \n", - "1 -1.128860 1198.871140 1977.742280 -778.871140 \n", - "2 0.620262 1400.620262 2311.240525 -910.620262 \n", - "3 0.141962 200.141962 330.283925 -130.141962 \n", - "4 -1.179918 1708.820082 2877.640164 -1168.820082 \n", - "5 0.201661 185.201661 315.403322 -130.201661 \n", - "6 -0.000000 0.000000 NaN NaN \n", - "7 0.152852 600.152852 990.305704 -390.152852 \n", - "8 -0.777962 594.722038 983.944075 -389.222038 \n", - "9 -0.000000 0.000000 NaN NaN \n", - "10 0.349640 185.349640 315.699280 -130.349640 \n", - "11 0.374817 195.374817 325.749633 -130.374817 \n", - "12 1.659127 964.159127 1615.818254 -651.659127 \n", - "13 0.518719 370.518719 631.037438 -260.518719 \n", - "14 0.000000 0.000000 NaN NaN \n", - "15 0.000000 0.000000 NaN NaN \n", - "16 0.285301 168.285301 298.570602 -130.285301 \n", - "17 -0.000000 0.000000 NaN NaN \n", - "18 -0.645348 596.354652 985.709303 -389.354652 \n", - "19 0.264243 450.264243 1230.528487 -780.264243 \n", - "20 -0.000000 0.000000 NaN NaN \n", - "21 -0.528034 765.471966 1284.943931 -519.471966 \n", - "22 0.000000 0.000000 NaN NaN \n", - "23 -0.000000 0.000000 NaN NaN \n", - "24 0.164330 197.664330 327.828660 -130.164330 \n", - "25 0.000000 0.000000 NaN NaN \n", - "\n", - " ExitPrice ExitCommission ExitSlippage ExitMarketValue TotalExitCost \\\n", - "0 92.634802 715.0 1.482819 1733.982819 1735.465638 \n", - "1 135.340393 390.0 2.042359 1202.042359 1204.084718 \n", - "2 94.787923 455.0 -1.484542 1118.515458 1117.030916 \n", - "3 90.963960 65.0 -0.036040 155.963960 155.927920 \n", - "4 2906.309803 585.0 -10.711771 26741.788229 26731.076458 \n", - "5 89.759598 65.0 -0.240402 154.759598 154.519196 \n", - "6 NaN 0.0 0.000000 0.000000 NaN \n", - "7 129.746995 195.0 -0.759014 584.240986 583.481972 \n", - "8 84.010968 195.0 0.032905 447.032905 447.065811 \n", - "9 NaN 0.0 0.000000 0.000000 NaN \n", - "10 390.520213 65.0 0.520213 455.520213 456.040427 \n", - "11 389.123731 65.0 -0.876269 454.123731 453.247461 \n", - "12 82.721538 325.0 1.107690 738.607690 739.715380 \n", - "13 360.692335 130.0 1.384669 851.384669 852.769339 \n", - "14 NaN 0.0 0.000000 0.000000 NaN \n", - "15 NaN 0.0 -0.000000 0.000000 NaN \n", - "16 26.062489 65.0 0.062489 91.062489 91.124979 \n", - "17 NaN 0.0 0.000000 0.000000 NaN \n", - "18 505.371129 195.0 1.113387 1711.113387 1712.226774 \n", - "19 142.225425 390.0 -1.647452 1243.352548 1241.705096 \n", - "20 NaN 0.0 0.000000 0.000000 NaN \n", - "21 252.481142 260.0 -0.075434 1269.924566 1269.849133 \n", - "22 NaN 0.0 0.000000 0.000000 NaN \n", - "23 NaN 0.0 -0.000000 0.000000 NaN \n", - "24 268.093599 65.0 0.593599 333.093599 333.687198 \n", - "25 NaN 0.0 -0.000000 0.000000 NaN \n", - "\n", - " AuxilaryExitCost Quantity EntryTime ExitTime Duration \\\n", - "0 -1.482819 11 2023-07-05 2023-08-02 28 \n", - "1 -2.042359 6 2023-07-05 2023-08-04 30 \n", - "2 1.484542 7 2023-07-05 2023-08-09 35 \n", - "3 0.036040 1 2023-07-05 2023-10-25 112 \n", - "4 10.711771 9 2023-07-05 2024-07-01 362 \n", - "5 0.240402 1 2023-08-10 2023-08-17 7 \n", - "6 NaN 0 2023-08-10 2023-08-17 7 \n", - "7 0.759014 3 2023-08-17 2023-10-20 64 \n", - "8 -0.032905 3 2023-08-31 2023-09-07 7 \n", - "9 NaN 0 2023-09-15 2023-09-20 5 \n", - "10 -0.520213 1 2023-11-13 2024-07-01 231 \n", - "11 0.876269 1 2023-11-14 2024-07-01 230 \n", - "12 -1.107690 5 2023-11-15 2023-11-29 14 \n", - "13 -1.384669 2 2023-11-15 2024-07-01 229 \n", - "14 NaN 0 2023-11-16 2024-07-01 228 \n", - "15 NaN 0 2023-11-17 2024-04-03 138 \n", - "16 -0.062489 1 2023-11-17 2024-01-10 54 \n", - "17 NaN 0 2023-11-22 2024-01-04 43 \n", - "18 -1.113387 3 2023-12-01 2024-07-01 213 \n", - "19 1.647452 6 2023-12-04 2024-04-17 135 \n", - "20 NaN 0 2023-12-04 2024-01-12 39 \n", - "21 0.075434 4 2024-01-26 2024-01-31 5 \n", - "22 NaN 0 2024-02-05 2024-07-01 147 \n", - "23 NaN 0 2024-02-07 2024-05-16 99 \n", - "24 -0.593599 1 2024-02-08 2024-07-01 144 \n", - "25 NaN 0 2024-05-21 2024-07-01 41 \n", - "\n", - " Positions \n", - "0 &L:TSLA20240621C333.33&S:TSLA20240621C340 \n", - "1 &L:AAPL20240621C230&S:AAPL20240621C240 \n", - "2 &L:MSFT20240621C370&S:MSFT20240621C375 \n", - "3 &L:AMZN20240621C165&S:AMZN20240621C175 \n", - "4 &L:NVDA20240621C770&S:NVDA20240621C800 \n", - "5 &L:BA20240621C300&S:BA20240621C310 \n", - "6 &L:WMT20240621C175&S:WMT20240621C180 \n", - "7 &L:TSLA20240920C305&S:TSLA20240920C315 \n", - "8 &L:AAPL20240920C260&S:AAPL20240920C310 \n", - "9 &L:INTC20240621C40&S:INTC20240621C45 \n", - "10 &L:QCOM20250117C135&S:QCOM20250117C140 \n", - "11 &L:MSFT20241220C395&S:MSFT20241220C400 \n", - "12 &L:SBUX20250117C115&S:SBUX20250117C120 \n", - "13 &L:AMD20240920C180&S:AMD20240920C200 \n", - "14 &L:MU20250117C85&S:MU20250117C90 \n", - "15 &L:INTC20240920C47&S:INTC20240920C50 \n", - "16 &L:DIS20240920C115&S:DIS20240920C125 \n", - "17 &L:AAPL20241220C215&S:AAPL20241220C220 \n", - "18 &L:BAC20250117C35&S:BAC20250117C55 \n", - "19 &L:HD20250117C390&S:HD20250117C400 \n", - "20 &L:BA20250117C310&S:BA20250117C320 \n", - "21 &L:GOOG20250117C190&S:GOOG20250117C200 \n", - "22 &L:WMT20250117C185&S:WMT20250117C190 \n", - "23 &L:DIS20250117C130&S:DIS20250117C150 \n", - "24 &L:AMZN20250117C185&S:AMZN20250117C190 \n", - "25 &L:AAPL20250620C225&S:AAPL20250620C230 " - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.portfolio.get_trades()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Extend for get_port_stats\n", - "- Buy & Hold\n", - "- Dates\n", - "- Trades\n", - "- _strategy in Aggregate\n", - "- The function" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "evb_backtest.trades.to_csv('/Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/output/profitable_trades_options.csv')" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
TickerPnLEntryPriceExitPriceReturnPctQuantityEntryTimeExitTimeDurationPositions
10QCOM270.205981185.344291455.550271145.78597512023-11-132024-07-01231&L:QCOM20250117C135&S:QCOM20250117C140
\n", - "
" - ], - "text/plain": [ - " Ticker PnL EntryPrice ExitPrice ReturnPct Quantity \\\n", - "10 QCOM 270.205981 185.344291 455.550271 145.785975 1 \n", - "\n", - " EntryTime ExitTime Duration Positions \n", - "10 2023-11-13 2024-07-01 231 &L:QCOM20250117C135&S:QCOM20250117C140 " - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "op_trades = evb_backtest.trades.copy()\n", - "duration = op_trades.Duration.unique()\n", - "op_trades[op_trades.Ticker=='QCOM']" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "469.31964200000004" - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "(200.595187 - 157.929765) * 11" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
SizeEntryBarExitBarEntryPriceExitPricePnLReturnPctEntryTimeExitTimeDurationTicker
\n", - "
" - ], - "text/plain": [ - "Empty DataFrame\n", - "Columns: [Size, EntryBar, ExitBar, EntryPrice, ExitPrice, PnL, ReturnPct, EntryTime, ExitTime, Duration, Ticker]\n", - "Index: []" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "trades_[trades_.Duration.isin(duration)]" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{}" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t = {'p': {}}\n", - "t.setdefault('p', [])\n" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " 158689244 function calls (158065791 primitive calls) in 1277.285 seconds\n", - "\n", - " Ordered by: cumulative time\n", - " List reduced from 2860 to 30 due to restriction <30>\n", - "\n", - " ncalls tottime percall cumtime percall filename:lineno(function)\n", - " 2 0.000 0.000 1277.289 638.644 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/IPython/core/interactiveshell.py:3541(run_code)\n", - " 2 0.000 0.000 1277.289 638.644 {built-in method builtins.exec}\n", - " 1 0.042 0.042 1277.288 1277.288 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/backtest.py:37(run)\n", - " 64 0.000 0.000 1050.625 16.416 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:290(update_signal)\n", - " 64 0.008 0.000 1050.623 16.416 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:246(generate_order)\n", - " 62/31 0.017 0.000 1050.551 33.889 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/decorators.py:36(wrapper)\n", - " 31 0.017 0.001 1050.546 33.889 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:462(get_order)\n", - " 28549 698.014 0.024 698.014 0.024 {method 'acquire' of '_thread.lock' objects}\n", - " 7466 0.078 0.000 697.924 0.093 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:295(wait)\n", - " 5246 0.053 0.000 691.806 0.132 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:428(result)\n", - " 31 0.028 0.001 550.308 17.752 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:72(populate_cache)\n", - " 124 0.008 0.000 549.584 4.432 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/threads.py:4(runThreads)\n", - " 4520 0.015 0.000 542.936 0.120 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:612(result_iterator)\n", - " 4396 0.027 0.000 542.919 0.124 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:314(_result_or_cancel)\n", - " 31 0.006 0.000 498.068 16.067 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:350(produce_order_candidates)\n", - " 62 0.021 0.000 498.062 8.033 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:218(chain_details)\n", - " 142 0.004 0.000 243.475 1.715 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:500(request)\n", - " 142 0.006 0.000 242.777 1.710 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:673(send)\n", - " 82 0.002 0.000 236.811 2.888 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:34(request_from_proxy)\n", - " 82 0.002 0.000 236.804 2.888 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/api.py:14(request)\n", - " 80 0.033 0.000 236.409 2.955 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:361(spot)\n", - " 1958 0.015 0.000 235.893 0.120 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:704(readinto)\n", - " 142 0.004 0.000 232.023 1.634 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:613(send)\n", - " 142 0.005 0.000 231.920 1.633 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:594(urlopen)\n", - " 142 0.004 0.000 231.844 1.633 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:379(_make_request)\n", - " 1770 229.708 0.130 229.708 0.130 {method 'recv_into' of '_socket.socket' objects}\n", - " 142 0.007 0.000 225.491 1.588 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:481(getresponse)\n", - " 142 0.002 0.000 225.446 1.588 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1351(getresponse)\n", - " 142 0.005 0.000 225.435 1.588 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:318(begin)\n", - " 142 0.004 0.000 225.352 1.587 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:285(_read_status)\n", - "\n", - "\n", - "\n" - ] - } - ], - "source": [ - "stats.print_stats(30)\n", - "print(stream.getvalue())\n", - "with open('bactest_data.txt', 'w') as f:\n", - " stream.seek(0)\n", - " f.write(stream.read())\n", - " f.flush()" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
TickerPnLEntryPriceExitPriceReturnPctQuantityEntryTimeExitTimeDurationPositions
0TSLA-469.319634200.595187157.929765-21.269414112023-07-052023-08-0228&L:TSLA20240621C333.33&S:TSLA20240621C340
1AAPL1.565517200.443306200.7042260.13017162023-07-052023-08-0430&L:AAPL20240621C230&S:AAPL20240621C240
2MSFT-276.544545200.353116160.846753-19.71836772023-07-052023-08-0935&L:MSFT20240621C370&S:MSFT20240621C375
3AMZN-43.770957200.305228156.534271-21.85212912023-07-052023-10-25112&L:AMZN20240621C165&S:AMZN20240621C175
4NVDA25078.793707190.9552512977.4878851459.25949492023-07-052024-07-01362&L:NVDA20240621C770&S:NVDA20240621C800
5BA-30.225169185.573604155.348435-16.28742912023-08-102023-08-177&L:BA20240621C300&S:BA20240621C310
6WMT0.000000NaNNaNNaN02023-08-102023-08-177&L:WMT20240621C175&S:WMT20240621C180
7TSLA-43.298192200.384529195.573618-2.40083992023-08-172023-10-2064&L:TSLA20240920C305&S:TSLA20240920C315
8AAPL-298.098050199.060910149.377901-24.95869762023-08-312023-09-077&L:AAPL20240920C260&S:AAPL20240920C310
9INTC0.000000NaNNaNNaN02023-09-152023-09-205&L:INTC20240621C40&S:INTC20240621C45
10QCOM270.205981185.344291455.550271145.78597512023-11-132024-07-01231&L:QCOM20250117C135&S:QCOM20250117C140
11MSFT1304.375600195.612225456.487345133.36340352023-11-142024-07-01230&L:MSFT20241220C395&S:MSFT20241220C400
12SBUX-223.069814193.018583148.404621-23.11381752023-11-152023-11-2914&L:SBUX20250117C115&S:SBUX20250117C120
13AMD478.825829185.555172424.968086129.02519122023-11-152024-07-01229&L:AMD20240920C180&S:AMD20240920C200
14MU0.000000NaNNaNNaN02023-11-162024-07-01228&L:MU20250117C85&S:MU20250117C90
15INTC0.000000NaNNaNNaN02023-11-172024-04-03138&L:INTC20240920C47&S:INTC20240920C50
16DIS-77.019783168.78972791.769945-45.63061012023-11-172024-01-1054&L:DIS20240920C115&S:DIS20240920C125
17AAPL-223.014459185.293680140.690788-24.07145952023-11-222024-01-0443&L:AAPL20241220C215&S:AAPL20241220C220
18BAC1112.010436199.689612570.359757185.62314932023-12-012024-07-01213&L:BAC20250117C35&S:BAC20250117C55
19HD796.51830775.628672208.381723175.53270262023-12-042024-04-17135&L:HD20250117C390&S:HD20250117C400
20BA-85.187057163.41361678.226558-52.12971812023-12-042024-01-1239&L:BA20250117C310&S:BA20250117C320
21GOOG502.670424192.213727317.88133365.37910142024-01-262024-01-315&L:GOOG20250117C190&S:GOOG20250117C200
22WMT0.000000NaNNaNNaN02024-02-052024-07-01147&L:WMT20250117C185&S:WMT20250117C190
23DIS-69.548144198.011080128.462936-35.12336012024-02-072024-05-1699&L:DIS20250117C130&S:DIS20250117C150
24AMZN134.166232198.531193332.69742567.57942212024-02-082024-07-01144&L:AMZN20250117C185&S:AMZN20250117C190
25AAPL48.790640188.225814200.4234746.48033342024-05-212024-07-0141&L:AAPL20250620C225&S:AAPL20250620C230
\n", - "
" - ], - "text/plain": [ - " Ticker PnL EntryPrice ExitPrice ReturnPct Quantity \\\n", - "0 TSLA -469.319634 200.595187 157.929765 -21.269414 11 \n", - "1 AAPL 1.565517 200.443306 200.704226 0.130171 6 \n", - "2 MSFT -276.544545 200.353116 160.846753 -19.718367 7 \n", - "3 AMZN -43.770957 200.305228 156.534271 -21.852129 1 \n", - "4 NVDA 25078.793707 190.955251 2977.487885 1459.259494 9 \n", - "5 BA -30.225169 185.573604 155.348435 -16.287429 1 \n", - "6 WMT 0.000000 NaN NaN NaN 0 \n", - "7 TSLA -43.298192 200.384529 195.573618 -2.400839 9 \n", - "8 AAPL -298.098050 199.060910 149.377901 -24.958697 6 \n", - "9 INTC 0.000000 NaN NaN NaN 0 \n", - "10 QCOM 270.205981 185.344291 455.550271 145.785975 1 \n", - "11 MSFT 1304.375600 195.612225 456.487345 133.363403 5 \n", - "12 SBUX -223.069814 193.018583 148.404621 -23.113817 5 \n", - "13 AMD 478.825829 185.555172 424.968086 129.025191 2 \n", - "14 MU 0.000000 NaN NaN NaN 0 \n", - "15 INTC 0.000000 NaN NaN NaN 0 \n", - "16 DIS -77.019783 168.789727 91.769945 -45.630610 1 \n", - "17 AAPL -223.014459 185.293680 140.690788 -24.071459 5 \n", - "18 BAC 1112.010436 199.689612 570.359757 185.623149 3 \n", - "19 HD 796.518307 75.628672 208.381723 175.532702 6 \n", - "20 BA -85.187057 163.413616 78.226558 -52.129718 1 \n", - "21 GOOG 502.670424 192.213727 317.881333 65.379101 4 \n", - "22 WMT 0.000000 NaN NaN NaN 0 \n", - "23 DIS -69.548144 198.011080 128.462936 -35.123360 1 \n", - "24 AMZN 134.166232 198.531193 332.697425 67.579422 1 \n", - "25 AAPL 48.790640 188.225814 200.423474 6.480333 4 \n", - "\n", - " EntryTime ExitTime Duration Positions \n", - "0 2023-07-05 2023-08-02 28 &L:TSLA20240621C333.33&S:TSLA20240621C340 \n", - "1 2023-07-05 2023-08-04 30 &L:AAPL20240621C230&S:AAPL20240621C240 \n", - "2 2023-07-05 2023-08-09 35 &L:MSFT20240621C370&S:MSFT20240621C375 \n", - "3 2023-07-05 2023-10-25 112 &L:AMZN20240621C165&S:AMZN20240621C175 \n", - "4 2023-07-05 2024-07-01 362 &L:NVDA20240621C770&S:NVDA20240621C800 \n", - "5 2023-08-10 2023-08-17 7 &L:BA20240621C300&S:BA20240621C310 \n", - "6 2023-08-10 2023-08-17 7 &L:WMT20240621C175&S:WMT20240621C180 \n", - "7 2023-08-17 2023-10-20 64 &L:TSLA20240920C305&S:TSLA20240920C315 \n", - "8 2023-08-31 2023-09-07 7 &L:AAPL20240920C260&S:AAPL20240920C310 \n", - "9 2023-09-15 2023-09-20 5 &L:INTC20240621C40&S:INTC20240621C45 \n", - "10 2023-11-13 2024-07-01 231 &L:QCOM20250117C135&S:QCOM20250117C140 \n", - "11 2023-11-14 2024-07-01 230 &L:MSFT20241220C395&S:MSFT20241220C400 \n", - "12 2023-11-15 2023-11-29 14 &L:SBUX20250117C115&S:SBUX20250117C120 \n", - "13 2023-11-15 2024-07-01 229 &L:AMD20240920C180&S:AMD20240920C200 \n", - "14 2023-11-16 2024-07-01 228 &L:MU20250117C85&S:MU20250117C90 \n", - "15 2023-11-17 2024-04-03 138 &L:INTC20240920C47&S:INTC20240920C50 \n", - "16 2023-11-17 2024-01-10 54 &L:DIS20240920C115&S:DIS20240920C125 \n", - "17 2023-11-22 2024-01-04 43 &L:AAPL20241220C215&S:AAPL20241220C220 \n", - "18 2023-12-01 2024-07-01 213 &L:BAC20250117C35&S:BAC20250117C55 \n", - "19 2023-12-04 2024-04-17 135 &L:HD20250117C390&S:HD20250117C400 \n", - "20 2023-12-04 2024-01-12 39 &L:BA20250117C310&S:BA20250117C320 \n", - "21 2024-01-26 2024-01-31 5 &L:GOOG20250117C190&S:GOOG20250117C200 \n", - "22 2024-02-05 2024-07-01 147 &L:WMT20250117C185&S:WMT20250117C190 \n", - "23 2024-02-07 2024-05-16 99 &L:DIS20250117C130&S:DIS20250117C150 \n", - "24 2024-02-08 2024-07-01 144 &L:AMZN20250117C185&S:AMZN20250117C190 \n", - "25 2024-05-21 2024-07-01 41 &L:AAPL20250620C225&S:AAPL20250620C230 " - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.trades" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
SizeEntryBarExitBarEntryPriceExitPricePnLReturnPctEntryTimeExitTimeDurationTicker
034.0504.0524.0279.795877253.010232-910.711955-0.0957332023-07-052023-08-0228 daysTSLA
128.0504.0526.0192.240502185.493749-188.909083-0.0350952023-07-052023-08-0430 daysAAPL
217.0504.0529.0336.262811322.011093-242.279208-0.0423832023-07-052023-08-0935 daysMSFT
348.0504.0536.087.04358882.000000-242.092217-0.0579432023-07-052023-08-1844 daysAVGO
411.0504.0583.0130.695846122.257034-92.826927-0.0645682023-07-052023-10-25112 daysAMZN
5178.0504.0753.042.282471123.47000114451.3804121.9201232023-07-052024-07-01362 daysNVDA
61.0522.0522.0170.283917168.355807-1.928110-0.0113232023-07-312023-07-310 daysJNJ
75.0522.0556.0332.810769318.700396-70.551863-0.0423982023-07-312023-09-1849 daysHD
85.0530.0535.0239.284572224.549052-73.677602-0.0615822023-08-102023-08-177 daysBA
95.0530.0535.053.78425752.084613-8.498219-0.0316012023-08-102023-08-177 daysWMT
1038.0535.0580.0226.851208217.009995-373.966096-0.0433822023-08-172023-10-2064 daysTSLA
1147.0537.0753.083.697919160.8200073624.7381410.9214342023-08-212024-07-01315 daysAVGO
1228.0545.0549.0188.497436175.179993-372.888422-0.0706512023-08-312023-09-077 daysAAPL
134.0553.0565.055.16908453.228411-7.762691-0.0351772023-09-132023-09-2916 daysWMT
147.0555.0558.038.55446835.955361-18.193748-0.0674142023-09-152023-09-205 daysINTC
1511.0596.0753.0124.434000199.470001825.3960130.6030182023-11-132024-07-01231 daysQCOM
1614.0597.0753.0372.308545448.6600041068.9204240.2050762023-11-142024-07-01230 daysMSFT
1741.0598.0607.0106.029814100.545486-224.857451-0.0517242023-11-152023-11-2914 daysSBUX
1813.0598.0753.0120.961891161.250000523.7454180.3330642023-11-152024-07-01229 daysAMD
197.0599.0753.077.159114130.500000373.3861990.6913102023-11-162024-07-01228 daysMU
2014.0600.0635.095.08162589.416964-79.305250-0.0595772023-11-172024-01-1054 daysDIS
215.0600.0692.043.06018540.347284-13.564503-0.0630032023-11-172024-04-03138 daysINTC
2225.0603.0631.0192.160221182.149994-250.255665-0.0520932023-11-222024-01-0443 daysAAPL
23102.0609.0753.030.50640039.910000959.1672230.3082502023-12-012024-07-01213 daysBAC
244.0610.0637.0232.109553219.970001-48.558207-0.0523012023-12-042024-01-1239 daysBA
255.0610.0702.0320.738665336.77999980.2066680.0500142023-12-042024-04-17135 daysHD
2622.0646.0649.0153.405040145.389999-176.330896-0.0522482024-01-262024-01-315 daysGOOG
274.0652.0753.056.86834367.88999944.0866250.1938102024-02-052024-07-01147 daysWMT
2813.0654.0723.097.730864103.04000169.0187750.0543242024-02-072024-05-1699 daysDIS
298.0655.0753.0170.243769193.490005185.9698930.1365472024-02-082024-07-01144 daysAMZN
3042.0657.0657.097.25921895.887818-57.598795-0.0141002024-02-122024-02-120 daysSBUX
3121.0692.0753.0155.462218184.479996609.3733290.1866552024-04-032024-07-0189 daysGOOG
3224.0726.0753.0191.758811212.089996487.9484400.1060252024-05-212024-07-0141 daysAAPL
\n", - "
" - ], - "text/plain": [ - " Size EntryBar ExitBar EntryPrice ExitPrice PnL ReturnPct \\\n", - "0 34.0 504.0 524.0 279.795877 253.010232 -910.711955 -0.095733 \n", - "1 28.0 504.0 526.0 192.240502 185.493749 -188.909083 -0.035095 \n", - "2 17.0 504.0 529.0 336.262811 322.011093 -242.279208 -0.042383 \n", - "3 48.0 504.0 536.0 87.043588 82.000000 -242.092217 -0.057943 \n", - "4 11.0 504.0 583.0 130.695846 122.257034 -92.826927 -0.064568 \n", - "5 178.0 504.0 753.0 42.282471 123.470001 14451.380412 1.920123 \n", - "6 1.0 522.0 522.0 170.283917 168.355807 -1.928110 -0.011323 \n", - "7 5.0 522.0 556.0 332.810769 318.700396 -70.551863 -0.042398 \n", - "8 5.0 530.0 535.0 239.284572 224.549052 -73.677602 -0.061582 \n", - "9 5.0 530.0 535.0 53.784257 52.084613 -8.498219 -0.031601 \n", - "10 38.0 535.0 580.0 226.851208 217.009995 -373.966096 -0.043382 \n", - "11 47.0 537.0 753.0 83.697919 160.820007 3624.738141 0.921434 \n", - "12 28.0 545.0 549.0 188.497436 175.179993 -372.888422 -0.070651 \n", - "13 4.0 553.0 565.0 55.169084 53.228411 -7.762691 -0.035177 \n", - "14 7.0 555.0 558.0 38.554468 35.955361 -18.193748 -0.067414 \n", - "15 11.0 596.0 753.0 124.434000 199.470001 825.396013 0.603018 \n", - "16 14.0 597.0 753.0 372.308545 448.660004 1068.920424 0.205076 \n", - "17 41.0 598.0 607.0 106.029814 100.545486 -224.857451 -0.051724 \n", - "18 13.0 598.0 753.0 120.961891 161.250000 523.745418 0.333064 \n", - "19 7.0 599.0 753.0 77.159114 130.500000 373.386199 0.691310 \n", - "20 14.0 600.0 635.0 95.081625 89.416964 -79.305250 -0.059577 \n", - "21 5.0 600.0 692.0 43.060185 40.347284 -13.564503 -0.063003 \n", - "22 25.0 603.0 631.0 192.160221 182.149994 -250.255665 -0.052093 \n", - "23 102.0 609.0 753.0 30.506400 39.910000 959.167223 0.308250 \n", - "24 4.0 610.0 637.0 232.109553 219.970001 -48.558207 -0.052301 \n", - "25 5.0 610.0 702.0 320.738665 336.779999 80.206668 0.050014 \n", - "26 22.0 646.0 649.0 153.405040 145.389999 -176.330896 -0.052248 \n", - "27 4.0 652.0 753.0 56.868343 67.889999 44.086625 0.193810 \n", - "28 13.0 654.0 723.0 97.730864 103.040001 69.018775 0.054324 \n", - "29 8.0 655.0 753.0 170.243769 193.490005 185.969893 0.136547 \n", - "30 42.0 657.0 657.0 97.259218 95.887818 -57.598795 -0.014100 \n", - "31 21.0 692.0 753.0 155.462218 184.479996 609.373329 0.186655 \n", - "32 24.0 726.0 753.0 191.758811 212.089996 487.948440 0.106025 \n", - "\n", - " EntryTime ExitTime Duration Ticker \n", - "0 2023-07-05 2023-08-02 28 days TSLA \n", - "1 2023-07-05 2023-08-04 30 days AAPL \n", - "2 2023-07-05 2023-08-09 35 days MSFT \n", - "3 2023-07-05 2023-08-18 44 days AVGO \n", - "4 2023-07-05 2023-10-25 112 days AMZN \n", - "5 2023-07-05 2024-07-01 362 days NVDA \n", - "6 2023-07-31 2023-07-31 0 days JNJ \n", - "7 2023-07-31 2023-09-18 49 days HD \n", - "8 2023-08-10 2023-08-17 7 days BA \n", - "9 2023-08-10 2023-08-17 7 days WMT \n", - "10 2023-08-17 2023-10-20 64 days TSLA \n", - "11 2023-08-21 2024-07-01 315 days AVGO \n", - "12 2023-08-31 2023-09-07 7 days AAPL \n", - "13 2023-09-13 2023-09-29 16 days WMT \n", - "14 2023-09-15 2023-09-20 5 days INTC \n", - "15 2023-11-13 2024-07-01 231 days QCOM \n", - "16 2023-11-14 2024-07-01 230 days MSFT \n", - "17 2023-11-15 2023-11-29 14 days SBUX \n", - "18 2023-11-15 2024-07-01 229 days AMD \n", - "19 2023-11-16 2024-07-01 228 days MU \n", - "20 2023-11-17 2024-01-10 54 days DIS \n", - "21 2023-11-17 2024-04-03 138 days INTC \n", - "22 2023-11-22 2024-01-04 43 days AAPL \n", - "23 2023-12-01 2024-07-01 213 days BAC \n", - "24 2023-12-04 2024-01-12 39 days BA \n", - "25 2023-12-04 2024-04-17 135 days HD \n", - "26 2024-01-26 2024-01-31 5 days GOOG \n", - "27 2024-02-05 2024-07-01 147 days WMT \n", - "28 2024-02-07 2024-05-16 99 days DIS \n", - "29 2024-02-08 2024-07-01 144 days AMZN \n", - "30 2024-02-12 2024-02-12 0 days SBUX \n", - "31 2024-04-03 2024-07-01 89 days GOOG \n", - "32 2024-05-21 2024-07-01 41 days AAPL " - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "trades_" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "ename": "KeyError", - "evalue": "'AAPL20240621C200'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[24], line 2\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mcopy\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m deepcopy\n\u001b[0;32m----> 2\u001b[0m test_data \u001b[38;5;241m=\u001b[39mdeepcopy(\u001b[43mevb_backtest\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mportfolio\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moptions_data\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mAAPL20240621C200\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m \u001b[38;5;241m-\u001b[39m evb_backtest\u001b[38;5;241m.\u001b[39mportfolio\u001b[38;5;241m.\u001b[39moptions_data[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mAAPL20240621C210\u001b[39m\u001b[38;5;124m'\u001b[39m])\n\u001b[1;32m 3\u001b[0m test_data[(test_data\u001b[38;5;241m.\u001b[39mindex \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m2023-07-05\u001b[39m\u001b[38;5;124m'\u001b[39m) \u001b[38;5;241m|\u001b[39m (test_data\u001b[38;5;241m.\u001b[39mindex \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m2023-10-26\u001b[39m\u001b[38;5;124m'\u001b[39m)]\n", - "\u001b[0;31mKeyError\u001b[0m: 'AAPL20240621C200'" - ] - } - ], - "source": [ - "from copy import deepcopy\n", - "test_data =deepcopy(evb_backtest.portfolio.options_data['AAPL20240621C200'] - evb_backtest.portfolio.options_data['AAPL20240621C210'])\n", - "test_data[(test_data.index == '2023-07-05') | (test_data.index == '2023-10-26')]" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[{'GOOGL': {},\n", - " 'AMD': {},\n", - " 'MSFT': {},\n", - " 'datetime': Timestamp('2023-07-24 00:00:00')},\n", - " {'GOOGL': {'position': {'long': ['GOOGL20240621P115'],\n", - " 'short': ['GOOGL20240621P100'],\n", - " 'trade_id': '&L:GOOGL20240621P115&S:GOOGL20240621P100',\n", - " 'close': 5.0},\n", - " 'quantity': 66.0,\n", - " 'market_value': 33000.0},\n", - " 'AMD': {'position': {'long': ['AMD20240621P110'],\n", - " 'short': ['AMD20240621P100'],\n", - " 'trade_id': '&L:AMD20240621P110&S:AMD20240621P100',\n", - " 'close': 4.75},\n", - " 'quantity': 69.47368421052632,\n", - " 'market_value': 33000.0},\n", - " 'MSFT': {},\n", - " 'datetime': Timestamp('2023-07-24 00:00:00')},\n", - " {'GOOGL': {},\n", - " 'AMD': {},\n", - " 'MSFT': {},\n", - " 'datetime': Timestamp('2023-07-25 00:00:00')},\n", - " {'GOOGL': {'position': {'long': ['GOOGL20240621C135'],\n", - " 'short': ['GOOGL20240621C147.5'],\n", - " 'trade_id': '&L:GOOGL20240621C135&S:GOOGL20240621C147.5',\n", - " 'close': 4.85},\n", - " 'quantity': 68.04121145934306,\n", - " 'market_value': 32999.98755778139},\n", - " 'AMD': {'position': {'long': ['AMD20240621P110'],\n", - " 'short': ['AMD20240621P100'],\n", - " 'trade_id': '&L:AMD20240621P110&S:AMD20240621P100',\n", - " 'close': 4.75},\n", - " 'quantity': 69.47365801638185,\n", - " 'market_value': 32999.98755778138},\n", - " 'MSFT': {},\n", - " 'datetime': Timestamp('2023-07-26 00:00:00')},\n", - " {'GOOGL': {},\n", - " 'AMD': {},\n", - " 'MSFT': {'position': {'long': ['MSFT20240621P300'],\n", - " 'short': ['MSFT20240621P285'],\n", - " 'trade_id': '&L:MSFT20240621P300&S:MSFT20240621P285',\n", - " 'close': 4.75},\n", - " 'quantity': 69.01495685165446,\n", - " 'market_value': 32782.10450453587},\n", - " 'datetime': Timestamp('2023-07-27 00:00:00')},\n", - " {'GOOGL': {},\n", - " 'AMD': {},\n", - " 'MSFT': {},\n", - " 'datetime': Timestamp('2023-07-28 00:00:00')}]" - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.portfolio.all_positions\n" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
OpenHighLowCloseVolumeBid_sizeCloseBidAsk_sizeCloseAskMidpointWeighted_midpoint
Datetime
2023-07-244.164.134.054.07-9-1345.85384.155.0005.381509
2023-07-244.164.134.054.07-9-1345.85384.155.0005.381509
2023-07-254.254.253.933.91-319823.30274.353.8253.857051
2023-07-254.254.253.933.91-319823.30274.353.8253.857051
2023-07-262.883.122.883.12-910183.02-1913.053.0352.938961
2023-07-262.883.122.883.12-910183.02-1913.053.0352.938961
2023-07-272.882.852.702.85-25-233.07143.103.0853.114296
2023-07-272.882.852.702.85-25-233.07143.103.0853.114296
2023-07-282.662.692.652.64174621.1062.771.9351.839688
2023-07-282.662.692.652.64174621.1062.771.9351.839688
\n", - "
" - ], - "text/plain": [ - " Open High Low Close Volume Bid_size CloseBid Ask_size \\\n", - "Datetime \n", - "2023-07-24 4.16 4.13 4.05 4.07 -9 -134 5.85 38 \n", - "2023-07-24 4.16 4.13 4.05 4.07 -9 -134 5.85 38 \n", - "2023-07-25 4.25 4.25 3.93 3.91 -3198 2 3.30 27 \n", - "2023-07-25 4.25 4.25 3.93 3.91 -3198 2 3.30 27 \n", - "2023-07-26 2.88 3.12 2.88 3.12 -910 18 3.02 -191 \n", - "2023-07-26 2.88 3.12 2.88 3.12 -910 18 3.02 -191 \n", - "2023-07-27 2.88 2.85 2.70 2.85 -25 -23 3.07 14 \n", - "2023-07-27 2.88 2.85 2.70 2.85 -25 -23 3.07 14 \n", - "2023-07-28 2.66 2.69 2.65 2.64 174 62 1.10 6 \n", - "2023-07-28 2.66 2.69 2.65 2.64 174 62 1.10 6 \n", - "\n", - " CloseAsk Midpoint Weighted_midpoint \n", - "Datetime \n", - "2023-07-24 4.15 5.000 5.381509 \n", - "2023-07-24 4.15 5.000 5.381509 \n", - "2023-07-25 4.35 3.825 3.857051 \n", - "2023-07-25 4.35 3.825 3.857051 \n", - "2023-07-26 3.05 3.035 2.938961 \n", - "2023-07-26 3.05 3.035 2.938961 \n", - "2023-07-27 3.10 3.085 3.114296 \n", - "2023-07-27 3.10 3.085 3.114296 \n", - "2023-07-28 2.77 1.935 1.839688 \n", - "2023-07-28 2.77 1.935 1.839688 " - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.portfolio.options_data['GOOGL20240621P115'] - evb_backtest.portfolio.options_data['GOOGL20240621P100']" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'AAPL20240312000145C'" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from trade.helpers.helper import generate_option_tick\n", - "import pandas as pd\n", - "\n", - "tick = 'AAPL'\n", - "exp = '2024-03-12'\n", - "right = 'C'\n", - "strike = 145.0\n", - "option_tick = generate_option_tick(tick, right, exp, strike)\n", - "option_tick\n" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'GOOGL': {}, 'AMD': {}, 'MSFT': {}}" - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.portfolio.current_positions" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " 53676519 function calls (52386882 primitive calls) in 216.194 seconds\n", - "\n", - " Ordered by: cumulative time\n", - " List reduced from 2937 to 20 due to restriction <20>\n", - "\n", - " ncalls tottime percall cumtime percall filename:lineno(function)\n", - " 2 0.000 0.000 216.195 108.097 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/IPython/core/interactiveshell.py:3541(run_code)\n", - " 2 0.000 0.000 216.195 108.097 {built-in method builtins.exec}\n", - " 1 0.000 0.000 216.195 216.195 /var/folders/j0/80hkbygd4lb27h9mw76gqzpw0000gn/T/ipykernel_40825/2620833521.py:1()\n", - " 1 0.003 0.003 216.195 216.195 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/backtest.py:55(run)\n", - " 21 0.000 0.000 215.775 10.275 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:270(update_signal)\n", - " 21 0.003 0.000 215.775 10.275 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/portfolio.py:225(generate_order_new)\n", - " 10 0.018 0.002 215.750 21.575 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:365(get_order)\n", - " 10 0.003 0.000 135.667 13.567 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:278(produce_order_candidates)\n", - " 20 0.012 0.001 135.663 6.783 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:124(chain_details)\n", - " 162 0.013 0.000 132.339 0.817 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:672(is_USholiday)\n", - " 162 0.010 0.000 131.870 0.814 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas_market_calendars/calendars/nyse.py:1276(valid_days)\n", - " 162 0.004 0.000 131.685 0.813 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas_market_calendars/market_calendar.py:570(valid_days)\n", - " 162 15.094 0.093 131.573 0.812 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas_market_calendars/market_calendar.py:553(holidays)\n", - " 142 0.059 0.000 117.322 0.826 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:684(change_to_last_busday)\n", - " 162 0.019 0.000 104.041 0.642 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/holiday.py:443(holidays)\n", - " 162 0.101 0.001 103.277 0.638 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/holiday.py:476()\n", - " 4698 0.448 0.000 103.176 0.022 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/holiday.py:249(dates)\n", - " 10 0.002 0.000 59.197 5.920 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager.py:99(load_chain)\n", - " 17 0.003 0.000 57.407 3.377 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:81(__init__)\n", - " 5078 0.098 0.000 57.090 0.011 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:821(date_range)\n", - "\n", - "\n", - "\n" - ] - } - ], - "source": [ - "stats.print_stats(20) # Show the top 20 functions by cumulative time\n", - "print(stream.getvalue())" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "ename": "KeyError", - "evalue": "'option'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[27], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m trades \u001b[38;5;241m=\u001b[39m \u001b[43mevb_backtest\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mportfolio\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_trades\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2\u001b[0m \u001b[38;5;28mprint\u001b[39m(trades\u001b[38;5;241m.\u001b[39mto_string())\n", - "File \u001b[0;32m~/cloned_repos/QuantTools/EventDriven/portfolio.py:613\u001b[0m, in \u001b[0;36mOptionSignalPortfolio.get_trades\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 611\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m ticker \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mdatetime\u001b[39m\u001b[38;5;124m'\u001b[39m:\n\u001b[1;32m 612\u001b[0m \u001b[38;5;28;01mcontinue\u001b[39;00m\n\u001b[0;32m--> 613\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[43mdata\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43moption\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mexit_price\u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;129;01min\u001b[39;00m data \u001b[38;5;129;01mand\u001b[39;00m data[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124moption\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m visited_option_id:\n\u001b[1;32m 614\u001b[0m entry_price_obj \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mnext\u001b[39m((pos \u001b[38;5;28;01mfor\u001b[39;00m pos \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mall_positions \u001b[38;5;28;01mif\u001b[39;00m pos[ticker][\u001b[38;5;124m'\u001b[39m\u001b[38;5;124moption\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m==\u001b[39m data[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124moption\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mentry_price\u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;129;01min\u001b[39;00m pos[ticker]), {})\n\u001b[1;32m 615\u001b[0m entry_price \u001b[38;5;241m=\u001b[39m entry_price_obj[ticker][\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mentry_price\u001b[39m\u001b[38;5;124m'\u001b[39m]\n", - "\u001b[0;31mKeyError\u001b[0m: 'option'" - ] - } - ], - "source": [ - "trades = evb_backtest.portfolio.get_trades()\n", - "print(trades.to_string())" - ] - }, - { - "cell_type": "code", - "execution_count": 80, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " AMD MSFT AMZN GOOGL AAPL cash commission total\n", - "datetime \n", - "2024-03-05 0.0 0.0 0.0 0.0 0.0 100000.0 0.0 100000.0\n", - "2024-03-05 0.0 0.0 0.0 0.0 0.0 100000.0 0.0 100000.0\n", - "2024-03-05 3680.0 0.0 0.0 0.0 0.0 96320.0 0.0 100000.0\n", - "2024-03-05 3680.0 1624.0 0.0 0.0 0.0 94696.0 0.0 100000.0\n", - "2024-03-05 3680.0 1624.0 416.0 0.0 0.0 94280.0 0.0 100000.0\n", - "2024-03-06 4596.0 1402.0 0.0 0.0 0.0 94280.0 0.0 100278.0\n", - "2024-03-07 4804.0 1770.0 0.0 0.0 0.0 94280.0 0.0 100854.0\n", - "2024-03-08 4630.0 1880.0 0.0 0.0 0.0 94280.0 0.0 100790.0\n", - "2024-03-11 3746.0 0.0 380.0 0.0 0.0 94280.0 0.0 98406.0\n", - "2024-03-12 3310.0 1990.0 378.0 0.0 0.0 94280.0 0.0 99958.0\n", - "2024-03-13 3178.0 2096.0 390.0 0.0 0.0 94280.0 0.0 99944.0\n", - "2024-03-13 3178.0 2096.0 390.0 540.0 0.0 93740.0 0.0 99944.0\n", - "2024-03-14 2710.0 2790.0 424.0 650.0 0.0 93740.0 0.0 100314.0\n", - "2024-03-15 2640.0 0.0 358.0 590.0 0.0 93740.0 0.0 97328.0\n", - "2024-03-18 0.0 2270.0 328.0 1130.0 0.0 93740.0 0.0 97468.0\n", - "2024-03-19 1862.0 2240.0 0.0 840.0 0.0 93740.0 0.0 98682.0\n", - "2024-03-20 1600.0 2370.0 0.0 0.0 0.0 93740.0 0.0 97710.0\n", - "2024-03-20 -1600.0 2370.0 0.0 0.0 0.0 95340.0 0.0 96110.0\n", - "2024-03-21 -1960.0 2820.0 376.0 890.0 0.0 95340.0 0.0 97466.0\n", - "2024-03-21 3760.0 2820.0 376.0 890.0 0.0 91580.0 0.0 99426.0\n", - "2024-03-22 3454.0 2750.0 376.0 1040.0 0.0 91580.0 0.0 99200.0\n", - "2024-03-25 3764.0 0.0 0.0 940.0 0.0 91580.0 0.0 96284.0\n", - "2024-03-26 3900.0 0.0 0.0 1092.0 0.0 91580.0 0.0 96572.0\n", - "2024-03-27 3500.0 2074.0 0.0 974.0 0.0 91580.0 0.0 98128.0\n", - "2024-03-28 3784.0 2020.0 0.0 0.0 0.0 91580.0 0.0 97384.0\n", - "2024-03-29 3784.0 2020.0 0.0 0.0 0.0 91580.0 0.0 97384.0\n", - "2024-04-01 4030.0 2110.0 0.0 1280.0 0.0 91580.0 0.0 99000.0\n", - "2024-04-02 3252.0 0.0 368.0 1180.0 0.0 91580.0 0.0 96380.0\n", - "2024-04-03 3690.0 2094.0 368.0 1220.0 0.0 91580.0 0.0 98952.0\n", - "2024-04-04 2600.0 2320.0 0.0 1150.0 0.0 91580.0 0.0 97650.0\n", - "2024-04-05 2920.0 2070.0 476.0 1100.0 0.0 91580.0 0.0 98146.0\n", - "2024-04-08 2786.0 0.0 540.0 1240.0 0.0 91580.0 0.0 96146.0\n", - "2024-04-09 2660.0 0.0 0.0 1362.0 0.0 91580.0 0.0 95602.0\n", - "2024-04-10 2610.0 1980.0 0.0 1350.0 0.0 91580.0 0.0 97520.0\n", - "2024-04-11 2500.0 2230.0 0.0 1480.0 0.0 91580.0 0.0 97790.0\n", - "2024-04-12 2230.0 0.0 0.0 1458.0 0.0 91580.0 0.0 95268.0\n", - "2024-04-15 2064.0 1744.0 0.0 1500.0 0.0 91580.0 0.0 96888.0\n", - "2024-04-15 -2064.0 1744.0 0.0 1500.0 0.0 93644.0 0.0 94824.0\n", - "2024-04-16 -0.0 1770.0 0.0 1180.0 0.0 93644.0 0.0 96594.0\n", - "2024-04-16 3320.0 1770.0 0.0 1180.0 0.0 90324.0 0.0 96594.0\n", - "2024-04-17 2694.0 1650.0 350.0 1322.0 0.0 90324.0 0.0 96340.0\n", - "2024-04-18 2608.0 1256.0 350.0 1324.0 0.0 90324.0 0.0 95862.0\n", - "2024-04-19 2050.0 1060.0 282.0 1158.0 0.0 90324.0 0.0 94874.0\n", - "2024-04-22 2030.0 900.0 252.0 1268.0 0.0 90324.0 0.0 94774.0\n", - "2024-04-22 -2030.0 900.0 252.0 1268.0 0.0 92354.0 0.0 92744.0\n", - "2024-04-23 -2250.0 1042.0 0.0 1340.0 0.0 92354.0 0.0 92486.0\n", - "2024-04-23 -2250.0 1042.0 0.0 1340.0 0.0 94604.0 0.0 94736.0\n", - "2024-04-24 -2270.0 1080.0 0.0 1370.0 0.0 94604.0 0.0 94784.0\n", - "2024-04-24 -2270.0 1080.0 0.0 1370.0 0.0 96874.0 0.0 97054.0\n", - "2024-04-25 -2310.0 908.0 0.0 1230.0 0.0 96874.0 0.0 96702.0\n", - "2024-04-25 -2310.0 908.0 0.0 1230.0 0.0 99184.0 0.0 99012.0\n", - "2024-04-26 -2504.0 932.0 282.0 2580.0 0.0 99184.0 0.0 100474.0\n", - "2024-04-26 -2504.0 932.0 282.0 2580.0 0.0 101688.0 0.0 102978.0\n", - "2024-04-29 -2764.0 660.0 0.0 1850.0 0.0 101688.0 0.0 101434.0\n", - "2024-04-29 -2764.0 660.0 0.0 1850.0 0.0 104452.0 0.0 104198.0\n", - "2024-04-30 -3060.0 558.0 310.0 1680.0 0.0 104452.0 0.0 103940.0\n", - "2024-04-30 2976.0 558.0 310.0 1680.0 0.0 101476.0 0.0 107000.0\n", - "2024-05-01 1890.0 494.0 250.0 1850.0 0.0 101476.0 0.0 105960.0\n", - "2024-05-02 1660.0 474.0 246.0 1780.0 0.0 101476.0 0.0 105636.0\n", - "2024-05-02 1660.0 -474.0 246.0 1780.0 0.0 101950.0 0.0 105162.0\n", - "2024-05-03 1860.0 -610.0 272.0 1948.0 0.0 101950.0 0.0 105420.0\n", - "2024-05-03 -1860.0 -610.0 272.0 1948.0 0.0 103810.0 0.0 103560.0\n", - "2024-05-03 -1860.0 0.0 272.0 1948.0 0.0 103810.0 0.0 104170.0\n", - "2024-05-06 -2260.0 0.0 250.0 1920.0 0.0 103810.0 0.0 103720.0\n", - "2024-05-06 -2260.0 0.0 250.0 1920.0 0.0 106070.0 0.0 105980.0\n", - "2024-05-07 -2186.0 3310.0 282.0 2340.0 0.0 106070.0 0.0 109816.0\n", - "2024-05-07 -2186.0 3310.0 282.0 2340.0 0.0 108256.0 0.0 112002.0\n", - "2024-05-08 -2160.0 0.0 254.0 2114.0 0.0 108256.0 0.0 108464.0\n", - "2024-05-08 0.0 0.0 254.0 2114.0 0.0 108256.0 0.0 110624.0\n", - "2024-05-09 4750.0 3196.0 304.0 2010.0 0.0 108256.0 0.0 118516.0\n", - "2024-05-09 -4750.0 3196.0 304.0 2010.0 0.0 113006.0 0.0 113766.0\n", - "2024-05-10 -0.0 0.0 232.0 1970.0 0.0 113006.0 0.0 115208.0\n", - "2024-05-10 -0.0 0.0 232.0 1970.0 0.0 113006.0 0.0 115208.0\n", - "2024-05-13 -4778.0 0.0 0.0 1680.0 0.0 113006.0 0.0 109908.0\n", - "2024-05-13 -4778.0 0.0 0.0 1680.0 0.0 117784.0 0.0 114686.0\n", - "2024-05-14 -4660.0 0.0 190.0 2170.0 0.0 117784.0 0.0 115484.0\n", - "2024-05-14 -4660.0 0.0 190.0 2170.0 0.0 122444.0 0.0 120144.0\n", - "2024-05-15 -5004.0 3842.0 152.0 2200.0 0.0 122444.0 0.0 123634.0\n", - "2024-05-15 -5004.0 3842.0 152.0 2200.0 0.0 127448.0 0.0 128638.0\n", - "2024-05-15 -5004.0 3842.0 152.0 2200.0 444.0 127004.0 0.0 128638.0\n", - "2024-05-16 -6060.0 3900.0 192.0 2570.0 414.0 127004.0 0.0 128020.0\n", - "2024-05-16 -6060.0 3900.0 192.0 2570.0 414.0 133064.0 0.0 134080.0\n", - "2024-05-17 -0.0 0.0 156.0 2700.0 400.0 133064.0 0.0 136320.0\n", - "2024-05-17 4240.0 0.0 156.0 2700.0 400.0 128824.0 0.0 136320.0\n", - "2024-05-20 4476.0 4262.0 140.0 2832.0 444.0 128824.0 0.0 140978.0\n", - "2024-05-21 4260.0 4262.0 114.0 2850.0 452.0 128824.0 0.0 140762.0\n", - "2024-05-22 4260.0 4454.0 126.0 2696.0 468.0 128824.0 0.0 140828.0\n", - "2024-05-23 4460.0 4466.0 130.0 2340.0 344.0 128824.0 0.0 140564.0\n", - "2024-05-24 4220.0 3950.0 130.0 2570.0 376.0 128824.0 0.0 140070.0\n", - "2024-05-24 -4220.0 3950.0 130.0 2570.0 376.0 133044.0 0.0 135850.0\n", - "2024-05-24 -4220.0 -3950.0 130.0 2570.0 376.0 136994.0 0.0 131900.0\n", - "2024-05-24 -4220.0 -3950.0 -130.0 2570.0 376.0 137124.0 0.0 131770.0\n", - "2024-05-24 -4220.0 -3950.0 -130.0 -2570.0 376.0 139694.0 0.0 129200.0\n", - "2024-05-24 -4220.0 -3950.0 -130.0 -2570.0 -376.0 140070.0 0.0 128824.0\n", - "2024-05-24 -4220.0 -3950.0 -130.0 -2570.0 -376.0 140070.0 0.0 128824.0\n", - "2024-05-24 -4220.0 -3950.0 -130.0 -2570.0 -376.0 144290.0 0.0 133044.0\n", - "2024-05-24 -4220.0 -3950.0 -130.0 -2570.0 -376.0 148240.0 0.0 136994.0\n", - "2024-05-24 -4220.0 -3950.0 -130.0 -2570.0 -376.0 148370.0 0.0 137124.0\n", - "2024-05-24 -4220.0 -3950.0 -130.0 -2570.0 -376.0 150940.0 0.0 139694.0\n", - "2024-05-24 -4220.0 -3950.0 -130.0 -2570.0 -376.0 151316.0 0.0 140070.0\n" - ] - } - ], - "source": [ - "#Get all holdings\n", - "holdings = evb_backtest.get_all_holdings()\n", - "print(holdings.to_string())" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " AMD AAPL MSFT GOOGL\n", - "datetime \n", - "2024-03-04 None None None None\n", - "2024-03-04 None None None None\n", - "2024-03-05 AMD-20240816-270.0-C None MSFT-20240816-480.0-C None\n", - "2024-03-06 AMD-20240816-270.0-C None MSFT-20240816-480.0-C None\n", - "2024-03-07 AMD-20240816-270.0-C None MSFT-20240816-480.0-C None\n", - "2024-03-08 AMD-20240816-270.0-C None MSFT-20240816-480.0-C None\n", - "2024-03-11 AMD-20240816-270.0-C None MSFT-20240816-480.0-C None\n", - "2024-03-12 AMD-20240816-270.0-C None MSFT-20240816-480.0-C None\n", - "2024-03-13 AMD-20240816-270.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-03-14 AMD-20240816-270.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-03-15 AMD-20240816-270.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-03-18 AMD-20240816-270.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-03-19 AMD-20240816-270.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-03-20 None None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-03-21 AMD-20240920-240.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-03-22 AMD-20240920-240.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-03-25 AMD-20240920-240.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-03-26 AMD-20240920-240.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-03-27 AMD-20240920-240.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-03-28 AMD-20240920-240.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-03-29 AMD-20240920-240.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-04-01 AMD-20240920-240.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-04-02 AMD-20240920-240.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-04-03 AMD-20240920-240.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-04-04 AMD-20240920-240.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-04-05 AMD-20240920-240.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-04-08 AMD-20240920-240.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-04-09 AMD-20240920-240.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-04-10 AMD-20240920-240.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-04-11 AMD-20240920-240.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-04-12 AMD-20240920-240.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-04-15 None None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-04-16 AMD-20250620-220.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-04-17 AMD-20250620-220.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-04-18 AMD-20250620-220.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-04-19 AMD-20250620-220.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-04-22 None None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-04-23 None None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-04-24 None None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-04-25 None None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-04-26 None None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-04-29 None None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-04-30 AMD-20250117-200.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-05-01 AMD-20250117-200.0-C None MSFT-20240816-480.0-C GOOGL-20241220-175.0-C\n", - "2024-05-02 AMD-20250117-200.0-C None None GOOGL-20241220-175.0-C\n", - "2024-05-03 None None MSFT-20241115-450.0-C GOOGL-20241220-175.0-C\n", - "2024-05-06 None None MSFT-20241115-450.0-C GOOGL-20241220-175.0-C\n", - "2024-05-07 None None MSFT-20241115-450.0-C GOOGL-20241220-175.0-C\n", - "2024-05-08 AMD-20250117-195.0-C None MSFT-20241115-450.0-C GOOGL-20241220-175.0-C\n", - "2024-05-09 None None MSFT-20241115-450.0-C GOOGL-20241220-175.0-C\n", - "2024-05-10 None None MSFT-20241115-450.0-C GOOGL-20241220-175.0-C\n", - "2024-05-13 None None MSFT-20241115-450.0-C GOOGL-20241220-175.0-C\n", - "2024-05-14 None None MSFT-20241115-450.0-C GOOGL-20241220-175.0-C\n", - "2024-05-15 None AAPL-20241220-210.0-C MSFT-20241115-450.0-C GOOGL-20241220-175.0-C\n", - "2024-05-16 None AAPL-20241220-210.0-C MSFT-20241115-450.0-C GOOGL-20241220-175.0-C\n", - "2024-05-17 AMD-20250117-220.0-C AAPL-20241220-210.0-C MSFT-20241115-450.0-C GOOGL-20241220-175.0-C\n", - "2024-05-20 AMD-20250117-220.0-C AAPL-20241220-210.0-C MSFT-20241115-450.0-C GOOGL-20241220-175.0-C\n", - "2024-05-21 AMD-20250117-220.0-C AAPL-20241220-210.0-C MSFT-20241115-450.0-C GOOGL-20241220-175.0-C\n", - "2024-05-22 AMD-20250117-220.0-C AAPL-20241220-210.0-C MSFT-20241115-450.0-C GOOGL-20241220-175.0-C\n", - "2024-05-23 AMD-20250117-220.0-C AAPL-20241220-210.0-C MSFT-20241115-450.0-C GOOGL-20241220-175.0-C\n", - "2024-05-24 AMD-20250117-220.0-C AAPL-20241220-210.0-C MSFT-20241115-450.0-C GOOGL-20241220-175.0-C\n", - "2024-05-24 None None None None\n" - ] - } - ], - "source": [ - "positions = evb_backtest.get_all_positions()\n", - "print(positions.to_string())" - ] - }, - { - "cell_type": "code", - "execution_count": 64, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[{'AMD': {'quantity': 0.0, 'option': None},\n", - " 'MSFT': {'quantity': 0.0, 'option': None},\n", - " 'AMZN': {'quantity': 0.0, 'option': None},\n", - " 'GOOGL': {'quantity': 0.0, 'option': None},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-03-04 00:00:00')},\n", - " {'AMD': {'quantity': 0.0, 'option': None},\n", - " 'MSFT': {'quantity': 0.0, 'option': None},\n", - " 'AMZN': {'quantity': 0.0, 'option': None},\n", - " 'GOOGL': {'quantity': 0.0, 'option': None},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-03-04 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20240920-240.0-C',\n", - " 'entry_price': 2185.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 0.0, 'option': None},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-03-05 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20240920-240.0-C',\n", - " 'entry_price': 2185.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 0.0, 'option': None},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-03-06 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20240920-240.0-C',\n", - " 'entry_price': 2185.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 0.0, 'option': None},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-03-07 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20240920-240.0-C',\n", - " 'entry_price': 2185.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 0.0, 'option': None},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-03-08 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20240920-240.0-C',\n", - " 'entry_price': 2185.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 0.0, 'option': None},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-03-11 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20240920-240.0-C',\n", - " 'entry_price': 2185.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 0.0, 'option': None},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-03-12 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20240920-240.0-C',\n", - " 'entry_price': 2185.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-03-13 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20240920-240.0-C',\n", - " 'entry_price': 2185.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-03-14 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20240920-240.0-C',\n", - " 'entry_price': 2185.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-03-15 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20240920-240.0-C',\n", - " 'entry_price': 2185.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-03-18 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20240920-240.0-C',\n", - " 'entry_price': 2185.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-03-19 00:00:00')},\n", - " {'AMD': {'quantity': -2,\n", - " 'option': 'AMD-20240920-240.0-C',\n", - " 'exit_price': 931.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-03-20 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20250117-220.0-C',\n", - " 'entry_price': 1870.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-03-21 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20250117-220.0-C',\n", - " 'entry_price': 1870.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-03-22 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20250117-220.0-C',\n", - " 'entry_price': 1870.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-03-25 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20250117-220.0-C',\n", - " 'entry_price': 1870.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-03-26 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20250117-220.0-C',\n", - " 'entry_price': 1870.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-03-27 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20250117-220.0-C',\n", - " 'entry_price': 1870.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-03-28 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20250117-220.0-C',\n", - " 'entry_price': 1870.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-03-29 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20250117-220.0-C',\n", - " 'entry_price': 1870.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-04-01 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20250117-220.0-C',\n", - " 'entry_price': 1870.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-04-02 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20250117-220.0-C',\n", - " 'entry_price': 1870.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-04-03 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20250117-220.0-C',\n", - " 'entry_price': 1870.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-04-04 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20250117-220.0-C',\n", - " 'entry_price': 1870.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-04-05 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20250117-220.0-C',\n", - " 'entry_price': 1870.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-04-08 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20250117-220.0-C',\n", - " 'entry_price': 1870.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-04-09 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20250117-220.0-C',\n", - " 'entry_price': 1870.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-04-10 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20250117-220.0-C',\n", - " 'entry_price': 1870.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-04-11 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20250117-220.0-C',\n", - " 'entry_price': 1870.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-04-12 00:00:00')},\n", - " {'AMD': {'quantity': -2,\n", - " 'option': 'AMD-20250117-220.0-C',\n", - " 'exit_price': 1247.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-04-15 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20241018-220.0-C',\n", - " 'entry_price': 725.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-04-16 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20241018-220.0-C',\n", - " 'entry_price': 725.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-04-17 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20241018-220.0-C',\n", - " 'entry_price': 725.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-04-18 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20241018-220.0-C',\n", - " 'entry_price': 725.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-04-19 00:00:00')},\n", - " {'AMD': {'quantity': -2,\n", - " 'option': 'AMD-20241018-220.0-C',\n", - " 'exit_price': 413.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-04-22 00:00:00')},\n", - " {'AMD': {'quantity': -2,\n", - " 'option': 'AMD-20241018-220.0-C',\n", - " 'exit_price': 413.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-04-23 00:00:00')},\n", - " {'AMD': {'quantity': -2,\n", - " 'option': 'AMD-20241018-220.0-C',\n", - " 'exit_price': 413.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-04-24 00:00:00')},\n", - " {'AMD': {'quantity': -2,\n", - " 'option': 'AMD-20241018-220.0-C',\n", - " 'exit_price': 413.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-04-25 00:00:00')},\n", - " {'AMD': {'quantity': -2,\n", - " 'option': 'AMD-20241018-220.0-C',\n", - " 'exit_price': 413.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-04-26 00:00:00')},\n", - " {'AMD': {'quantity': -2,\n", - " 'option': 'AMD-20241018-220.0-C',\n", - " 'exit_price': 413.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-04-29 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20241220-200.0-C',\n", - " 'entry_price': 1325.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-04-30 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20241220-200.0-C',\n", - " 'entry_price': 1325.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'entry_price': 778.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-05-01 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20241220-200.0-C',\n", - " 'entry_price': 1325.0},\n", - " 'MSFT': {'quantity': -2,\n", - " 'option': 'MSFT-20250117-540.0-C',\n", - " 'exit_price': 0.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-05-02 00:00:00')},\n", - " {'AMD': {'quantity': -2,\n", - " 'option': 'AMD-20241220-200.0-C',\n", - " 'exit_price': 750.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20241018-440.0-C',\n", - " 'entry_price': 1190.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-05-03 00:00:00')},\n", - " {'AMD': {'quantity': -2,\n", - " 'option': 'AMD-20241220-200.0-C',\n", - " 'exit_price': 750.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20241018-440.0-C',\n", - " 'entry_price': 1190.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-05-06 00:00:00')},\n", - " {'AMD': {'quantity': -2,\n", - " 'option': 'AMD-20241220-200.0-C',\n", - " 'exit_price': 750.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20241018-440.0-C',\n", - " 'entry_price': 1190.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-05-07 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20241220-185.0-C',\n", - " 'entry_price': 1385.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20241018-440.0-C',\n", - " 'entry_price': 1190.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-05-08 00:00:00')},\n", - " {'AMD': {'quantity': -2, 'option': 'AMD-20241220-185.0-C', 'exit_price': 0.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20241018-440.0-C',\n", - " 'entry_price': 1190.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-05-09 00:00:00')},\n", - " {'AMD': {'quantity': -2, 'option': 'AMD-20241220-185.0-C', 'exit_price': 0.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20241018-440.0-C',\n", - " 'entry_price': 1190.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-05-10 00:00:00')},\n", - " {'AMD': {'quantity': -2, 'option': 'AMD-20241220-185.0-C', 'exit_price': 0.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20241018-440.0-C',\n", - " 'entry_price': 1190.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-05-13 00:00:00')},\n", - " {'AMD': {'quantity': -2, 'option': 'AMD-20241220-185.0-C', 'exit_price': 0.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20241018-440.0-C',\n", - " 'entry_price': 1190.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 0.0, 'option': None},\n", - " 'datetime': Timestamp('2024-05-14 00:00:00')},\n", - " {'AMD': {'quantity': -2, 'option': 'AMD-20241220-185.0-C', 'exit_price': 0.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20241018-440.0-C',\n", - " 'entry_price': 1190.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 2,\n", - " 'option': 'AAPL-20250117-215.0-C',\n", - " 'entry_price': 487.0},\n", - " 'datetime': Timestamp('2024-05-15 00:00:00')},\n", - " {'AMD': {'quantity': -2, 'option': 'AMD-20241220-185.0-C', 'exit_price': 0.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20241018-440.0-C',\n", - " 'entry_price': 1190.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 2,\n", - " 'option': 'AAPL-20250117-215.0-C',\n", - " 'entry_price': 487.0},\n", - " 'datetime': Timestamp('2024-05-16 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20241220-210.0-C',\n", - " 'entry_price': 1115.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20241018-440.0-C',\n", - " 'entry_price': 1190.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 2,\n", - " 'option': 'AAPL-20250117-215.0-C',\n", - " 'entry_price': 487.0},\n", - " 'datetime': Timestamp('2024-05-17 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20241220-210.0-C',\n", - " 'entry_price': 1115.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20241018-440.0-C',\n", - " 'entry_price': 1190.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 2,\n", - " 'option': 'AAPL-20250117-215.0-C',\n", - " 'entry_price': 487.0},\n", - " 'datetime': Timestamp('2024-05-20 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20241220-210.0-C',\n", - " 'entry_price': 1115.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20241018-440.0-C',\n", - " 'entry_price': 1190.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 2,\n", - " 'option': 'AAPL-20250117-215.0-C',\n", - " 'entry_price': 487.0},\n", - " 'datetime': Timestamp('2024-05-21 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20241220-210.0-C',\n", - " 'entry_price': 1115.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20241018-440.0-C',\n", - " 'entry_price': 1190.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 2,\n", - " 'option': 'AAPL-20250117-215.0-C',\n", - " 'entry_price': 487.0},\n", - " 'datetime': Timestamp('2024-05-22 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20241220-210.0-C',\n", - " 'entry_price': 1115.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20241018-440.0-C',\n", - " 'entry_price': 1190.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 2,\n", - " 'option': 'AAPL-20250117-215.0-C',\n", - " 'entry_price': 487.0},\n", - " 'datetime': Timestamp('2024-05-23 00:00:00')},\n", - " {'AMD': {'quantity': 2,\n", - " 'option': 'AMD-20241220-210.0-C',\n", - " 'entry_price': 1115.0},\n", - " 'MSFT': {'quantity': 2,\n", - " 'option': 'MSFT-20241018-440.0-C',\n", - " 'entry_price': 1190.0},\n", - " 'AMZN': {'quantity': 2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'entry_price': 0.0},\n", - " 'GOOGL': {'quantity': 2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'entry_price': 1450.0},\n", - " 'AAPL': {'quantity': 2,\n", - " 'option': 'AAPL-20250117-215.0-C',\n", - " 'entry_price': 487.0},\n", - " 'datetime': Timestamp('2024-05-24 00:00:00')},\n", - " {'AMD': {'quantity': -2,\n", - " 'option': 'AMD-20241220-210.0-C',\n", - " 'exit_price': 1025.0},\n", - " 'MSFT': {'quantity': -2,\n", - " 'option': 'MSFT-20241018-440.0-C',\n", - " 'exit_price': 2180.0},\n", - " 'AMZN': {'quantity': -2,\n", - " 'option': 'AMZN-20250321-205.0-C',\n", - " 'exit_price': 0.0},\n", - " 'GOOGL': {'quantity': -2,\n", - " 'option': 'GOOGL-20250620-155.0-C',\n", - " 'exit_price': 0.0},\n", - " 'AAPL': {'quantity': -2,\n", - " 'option': 'AAPL-20250117-215.0-C',\n", - " 'exit_price': 565.0},\n", - " 'datetime': Timestamp('2024-05-24 00:00:00')}]" - ] - }, - "execution_count": 64, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.portfolio.all_positions" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "All positions:\n", - "[{'AAPL': {'option': None, 'quantity': 0.0},\n", - " 'AMD': {'option': None, 'quantity': 0.0},\n", - " 'AMZN': {'option': None, 'quantity': 0.0},\n", - " 'GOOGL': {'option': None, 'quantity': 0.0},\n", - " 'MSFT': {'option': None, 'quantity': 0.0},\n", - " 'datetime': '20240226'},\n", - " {'AAPL': {'option': None, 'quantity': 0.0},\n", - " 'AMD': {'option': None, 'quantity': 0.0},\n", - " 'AMZN': {'option': None, 'quantity': 0.0},\n", - " 'GOOGL': {'option': None, 'quantity': 0.0},\n", - " 'MSFT': {'option': None, 'quantity': 0.0},\n", - " 'datetime': Timestamp('2024-02-26 00:00:00')},\n", - " {'AAPL': {'option': None, 'quantity': 0.0},\n", - " 'AMD': {'option': None, 'quantity': 0.0},\n", - " 'AMZN': {'option': None, 'quantity': 0.0},\n", - " 'GOOGL': {'option': None, 'quantity': 0.0},\n", - " 'MSFT': {'option': None, 'quantity': 0.0},\n", - " 'datetime': Timestamp('2024-02-26 00:00:00')}]\n", - "\n", - "Current holdings:\n", - "{'AAPL': 0.0,\n", - " 'AMD': 0.0,\n", - " 'AMZN': 0.0,\n", - " 'GOOGL': 0.0,\n", - " 'MSFT': 0.0,\n", - " 'cash': 100000,\n", - " 'commission': 0.0,\n", - " 'total': 100000}\n", - "\n", - "Current positions:\n", - "{'AAPL': {'option': None, 'quantity': 0.0},\n", - " 'AMD': {'option': None, 'quantity': 0.0},\n", - " 'AMZN': {'option': None, 'quantity': 0.0},\n", - " 'GOOGL': {'option': None, 'quantity': 0.0},\n", - " 'MSFT': {'option': None, 'quantity': 0.0}}\n" - ] - } - ], - "source": [ - "from pprint import pprint\n", - "\n", - "print('All positions:')\n", - "pprint(portfolio.all_positions)\n", - "\n", - "print('\\nCurrent holdings:')\n", - "pprint(portfolio.current_holdings)\n", - "\n", - "print('\\nCurrent positions:')\n", - "pprint(portfolio.current_positions)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test RiskManager " - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " root expiration strike right\n", - "3444 NVDA 20240301 270.0 C\n", - "Exception: Cannot set a DataFrame with multiple columns to the single column option_id\n", - " root expiration strike right\n", - "3444 NVDA 20240301 270.0 C\n", - "Ticker: NVDA\n", - "Contract Date: 2024-02-09\n", - "Contract Right: C\n", - "Contract Expiration: 20240301, type: \n", - "Contract Strike: 270.0, type: \n", - "Max Close: 2\n", - "Order Settings: {'type': 'spread', 'specifics': [{'direction': 'long', 'rel_strike': 1.2305088940545148, 'dte': 284, 'moneyness_width': 0.08149699520032436}, {'direction': 'short', 'rel_strike': 0.9364378888363725, 'dte': 284, 'moneyness_width': 0.08149699520032436}], 'name': 'vertical_spread'}\n" - ] - }, - { - "ename": "ValueError", - "evalue": "Cannot set a DataFrame with multiple columns to the single column option_id", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m/var/folders/j0/80hkbygd4lb27h9mw76gqzpw0000gn/T/ipykernel_40825/3149993250.py\u001b[0m in \u001b[0;36m?\u001b[0;34m()\u001b[0m\n\u001b[1;32m 86\u001b[0m \u001b[0;32mraise\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 87\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 88\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 89\u001b[0m \u001b[0mops\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mRiskManagerOperations\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 90\u001b[0;31m \u001b[0mops\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtest_order_picker\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m/var/folders/j0/80hkbygd4lb27h9mw76gqzpw0000gn/T/ipykernel_40825/3149993250.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 82\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"Contract Expiration: {contract_expiration}, type: {type(contract_expiration)}\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 83\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"Contract Strike: {contract_strike}, type: {type(contract_strike)}\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 84\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"Max Close: {max_close}\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 85\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"Order Settings: {order_settings}\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 86\u001b[0;31m \u001b[0;32mraise\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m~/cloned_repos/QuantTools/EventDriven/riskmanager.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(self, tick, date, right, max_close, order_settings)\u001b[0m\n\u001b[1;32m 375\u001b[0m \u001b[0mstr_direction_index\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mindx\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'S'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 376\u001b[0m \u001b[0mdirection_index\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mindx\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 377\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 378\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 379\u001b[0;31m \u001b[0morder_candidates\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mproduce_order_candidates\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0morder_settings\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtick\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdate\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mright\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 380\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 381\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 382\u001b[0m \u001b[0mpopulate_cache\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0morder_candidates\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdate\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdate\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/cloned_repos/QuantTools/EventDriven/riskmanager.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(settings, tick, date, right)\u001b[0m\n\u001b[1;32m 273\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mproduce_order_candidates\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msettings\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtick\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdate\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mright\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'P'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 274\u001b[0m \u001b[0morder_candidates\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m'long'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'short'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 275\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mspec\u001b[0m \u001b[0;32min\u001b[0m \u001b[0msettings\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'specifics'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 276\u001b[0;31m \u001b[0morder_candidates\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mspec\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'direction'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mchain_details\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdate\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtick\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mspec\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'dte'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mspec\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'rel_strike'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mright\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmoneyness_width\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mspec\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'moneyness_width'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 277\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0morder_candidates\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/cloned_repos/QuantTools/EventDriven/riskmanager.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(date, ticker, tgt_dte, tgt_moneyness, right, moneyness_width, print_stderr)\u001b[0m\n\u001b[1;32m 178\u001b[0m \u001b[0mclear_context\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 179\u001b[0m \u001b[0mreturn_dataframe\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdrop_duplicates\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minplace\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 180\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 181\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mException\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 182\u001b[0;31m \u001b[0;32mraise\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 183\u001b[0m \u001b[0merrors\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mdate\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 184\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0merrors\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 185\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mreturn_dataframe\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msort_values\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'relative_moneyness'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mascending\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(self, key, value)\u001b[0m\n\u001b[1;32m 4297\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_setitem_frame\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4298\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mSeries\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mndarray\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mIndex\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4299\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_setitem_array\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4300\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvalue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mDataFrame\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 4301\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_set_item_frame_value\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4302\u001b[0m elif (\n\u001b[1;32m 4303\u001b[0m \u001b[0mis_list_like\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvalue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4304\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_unique\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(self, key, value)\u001b[0m\n\u001b[1;32m 4455\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4456\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0misetitem\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlocs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4457\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4458\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvalue\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 4459\u001b[0;31m raise ValueError(\n\u001b[0m\u001b[1;32m 4460\u001b[0m \u001b[0;34m\"Cannot set a DataFrame with multiple columns to the single \"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4461\u001b[0m \u001b[0;34mf\"column {key}\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4462\u001b[0m )\n", - "\u001b[0;31mValueError\u001b[0m: Cannot set a DataFrame with multiple columns to the single column option_id" - ] - } - ], - "source": [ - "from EventDriven.riskmanager import RiskManager\n", - "from dbase.DataAPI.ThetaData import list_contracts, retrieve_option_ohlc, is_theta_data_retrieval_successful #type: ignore\n", - "import datetime\n", - "import pandas as pd\n", - "import pandas_market_calendars as mcal\n", - "import unittest\n", - "import numpy as np\n", - "import pprint as pp\n", - "\n", - "tickers = ['AAPL', 'MSFT', 'GOOGL', 'AMZN', 'TSLA', 'META', 'NVDA', 'NFLX']\n", - "\n", - "\n", - "#generate date range \n", - "nyse = mcal.get_calendar('NYSE')\n", - "year_ago_date = datetime.datetime.now() - datetime.timedelta(days=365)\n", - "schedule = nyse.schedule(start_date=year_ago_date, end_date=datetime.datetime.now())\n", - "date_range = mcal.date_range(schedule, frequency='1D')\n", - "dates = [date.strftime('%Y-%m-%d') for date in date_range]\n", - "\n", - "\n", - "\n", - "\n", - "class RiskManagerOperations(unittest.TestCase):\n", - " def __init__(self):\n", - " self.events = Queue(maxsize=0) \n", - " self.bars = HistoricTradeDataHandler(self.events, trades)\n", - " self.risk_manager = RiskManager(bars=self.bars, events=self.events, initial_capital=1000000)\n", - " \n", - " def test_order_picker(self):\n", - " ticker = np.random.choice(tickers)\n", - " contract_date = np.random.choice(dates)\n", - " contracts = list_contracts(ticker, pd.to_datetime(contract_date).strftime('%Y%m%d'))\n", - " self.assertTrue(is_theta_data_retrieval_successful(contracts))\n", - " \n", - " contract = contracts.sample()\n", - " print(contract)\n", - " contract_right = contract['right'].values[0]\n", - " contract_expiration = f\"{contract['expiration'].values[0]}\"\n", - " contract_strike = float(contract['strike'].values[0])\n", - " max_close = np.random.randint(1, 10)\n", - " \n", - " #order settings \n", - " moneyness_width = np.random.uniform(0.05, 0.1)\n", - " rel_strike_long = np.random.uniform(1.05, 1.3) \n", - " rel_strike_short = np.random.uniform(0.7, 0.95)\n", - " dte = np.random.randint(30, 365)\n", - " \n", - " order_settings = {\n", - " 'type': 'spread',\n", - " 'specifics': [\n", - " {'direction': 'long', 'rel_strike': rel_strike_long, 'dte': dte, 'moneyness_width': moneyness_width},\n", - " {'direction': 'short', 'rel_strike': rel_strike_short, 'dte': dte, 'moneyness_width': moneyness_width} \n", - " ],\n", - " 'name': 'vertical_spread'\n", - " }\n", - " \n", - " try:\n", - " self.order = self.risk_manager.OrderPicker.get_order(ticker, contract_expiration, contract_right, max_close, order_settings)\n", - " self.assertIsInstance(self.order, dict)\n", - " self.assertIsInstance(self.order['long'], list)\n", - " self.assertIsInstance(self.order['short'], list)\n", - " self.assertGreater(len(self.order['long']), 0)\n", - " self.assertGreater(len(self.order['short']), 0)\n", - " self.assertIsInstance(self.order['close'], float)\n", - " except AssertionError as e:\n", - " print(f\"AssertionError: {e}\")\n", - " pp.pprint(contract)\n", - " print(f\"Ticker: {ticker}\")\n", - " print(f\"Contract Date: {contract_date}\")\n", - " print(f\"Contract Right: {contract_right}\")\n", - " print(f\"Contract Expiration: {contract_expiration}\")\n", - " print(f\"Contract Strike: {contract_strike}\")\n", - " print(f\"Max Close: {max_close}\")\n", - " print(f\"Order Settings: {order_settings}\")\n", - " raise\n", - " except Exception as e:\n", - " print(f\"Exception: {e}\")\n", - " pp.pprint(contract)\n", - " print(f\"Ticker: {ticker}\")\n", - " print(f\"Contract Date: {contract_date}\")\n", - " print(f\"Contract Right: {contract_right}\")\n", - " print(f\"Contract Expiration: {contract_expiration}, type: {type(contract_expiration)}\")\n", - " print(f\"Contract Strike: {contract_strike}, type: {type(contract_strike)}\")\n", - " print(f\"Max Close: {max_close}\")\n", - " print(f\"Order Settings: {order_settings}\")\n", - " raise\n", - "\n", - "\n", - "ops = RiskManagerOperations()\n", - "ops.test_order_picker()" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "from trade.assets.Stock import Stock\n", - "NVDA = Stock('NVDA', run_chain = False)" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "def generate_option_to_buy(underlier: Stock, contract_time):\n", - " \"\"\"\n", - " Buy an option based on the underlier.\n", - " \"\"\"\n", - " time = contract_time\n", - " next_day_time = time + pd.DateOffset(days=1)\n", - " print(time, next_day_time)\n", - " option_spot = underlier.spot(ts=True, ts_start = time, ts_end = next_day_time)\n", - " option_spot = option_spot.iloc[0] \n", - " stock_price = option_spot['open']#use open price as spot price on the assumption of making trades at start of day\n", - " oom_benchmark = 0.1#10% out of the money \n", - " expiry_benchmark = time + pd.DateOffset(months=5)\n", - " oom_price = stock_price * (1 + oom_benchmark)\n", - " time_str = time.strftime(\"%Y%m%d\")\n", - " contracts = list_contracts(underlier.ticker, time_str)\n", - " print(contracts)\n", - " contracts = contracts[contracts['right'] == 'C'] \n", - " \n", - " \n", - " #Filter out contracts that are out of the money\n", - " contracts = contracts[contracts['strike'] >= oom_price]\n", - " \n", - " print('comparing expiry')\n", - " print(type(expiry_benchmark))\n", - " print(type(contracts['expiration']))\n", - " #filter out contracts that are below the expiry benchmark\n", - " contracts = contracts[pd.to_datetime(contracts['expiration'], format=\"%Y%m%d\") >= expiry_benchmark]\n", - " \n", - " #select a random contract to buy\n", - " contract = contracts.sample(n=1); \n", - " \n", - " return contract\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "182.35000610351562" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "appl = Stock('AAPL')\n", - "c_time = pd.to_datetime('2024-05-06', format=\"%Y-%m-%d\")\n", - "c_time_next = c_time + pd.DateOffset(days=1)\n", - "aapl_spot = appl.spot(ts=True, ts_start = c_time, ts_end = c_time_next)\n", - "aapl_spot.iloc[0]['open']\n" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2024-05-06 00:00:00 2024-05-07 00:00:00\n", - " root expiration strike right\n", - "0 AAPL 20241018 220.0 C\n", - "1 AAPL 20250919 215.0 C\n", - "2 AAPL 20241115 220.0 C\n", - "3 AAPL 20250321 220.0 C\n", - "4 AAPL 20250321 220.0 P\n", - "... ... ... ... ...\n", - "1060 AAPL 20240621 220.0 C\n", - "1061 AAPL 20240621 220.0 P\n", - "1062 AAPL 20240719 220.0 C\n", - "1063 AAPL 20250620 215.0 C\n", - "1064 AAPL 20240816 220.0 C\n", - "\n", - "[1065 rows x 4 columns]\n", - "comparing expiry\n", - "\n", - "\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
rootexpirationstrikeright
456AAPL20250117235.0C
\n", - "
" - ], - "text/plain": [ - " root expiration strike right\n", - "456 AAPL 20250117 235.0 C" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "option = generate_option_to_buy(appl, c_time)\n", - "option" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": ".venv", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.10" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/EventDriven/demos/demo_zino.ipynb b/EventDriven/demos/demo_zino.ipynb deleted file mode 100644 index 3080f3d..0000000 --- a/EventDriven/demos/demo_zino.ipynb +++ /dev/null @@ -1,18176 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The autoreload extension is already loaded. To reload it, use:\n", - " %reload_ext autoreload\n" - ] - } - ], - "source": [ - "\n", - "from dotenv import load_dotenv\n", - "load_dotenv()\n", - "import os\n", - "import sys\n", - "sys.path.append(\n", - " os.environ.get('WORK_DIR')) #type: ignore\n", - "sys.path.append(\n", - " os.environ.get('DBASE_DIR')) #type: ignore\n", - "from dbase.DataAPI.ThetaData import * #type: ignore\n", - "from dbase.database.SQLHelpers import * #type: ignore\n", - "import pandas as pd\n", - "from EventDriven.data import HistoricTradeDataHandler\n", - "from EventDriven.event import *\n", - "from queue import Queue\n", - "from trade.backtester_.backtester_ import PTDataset, PTBacktester\n", - "import pandas_ta as ta\n", - "from trade.assets.Stock import Stock\n", - "from trade.backtester_.utils.WalkForwardUtils import prev_monday \n", - "from trade.backtester_.strats import BBandsTrend2\n", - "from trade.backtester_.strats import MAStrat\n", - "import yfinance as yf\n", - "from datetime import datetime\n", - "from EventDriven.backtest import OptionSignalBacktest\n", - "from copy import deepcopy\n", - "import matplotlib.pyplot as plt\n", - "%load_ext autoreload\n", - "%autoreload 2" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "thetadata_start = '2021-01-01'" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "import json\n", - "pd.set_option('display.max_columns', 100)\n", - "pd.set_option('display.max_rows', 100)\n", - "key = 10\n", - "with open(f'../input/profitable_weights_{key}.json', 'r') as f:\n", - " weights = json.load(f)\n", - "ttrades__ = pd.read_csv(f'../input/profitable_trades_{key}.csv').iloc[:, 1:]\n" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
SizeEntryBarExitBarEntryPriceExitPricePnLReturnPctEntryTimeExitTimeDurationTicker
666525540148.548104147.710007-55.314406-0.0056422023-02-032023-02-2724 daysAAPL
0105504551103.049417100.110001-308.638768-0.0285242023-01-042023-03-1469 daysSBUX
896575587109.251048104.269997-478.180907-0.0455932023-04-182023-05-0416 daysSBUX
112504675195.863123213.759995214.7624620.0913742023-01-042023-09-11250 daysBA
513952468384.58501698.5999981948.0825750.1656912023-02-022023-09-21231 daysAMD
314517687358.781354382.399994330.6609620.0658302023-01-242023-09-27246 daysNFLX
1046607705210.885519210.000000-40.733868-0.0041992023-06-022023-10-23143 daysTSLA
955583708108.107058120.629997688.7616390.1158382023-04-282023-10-26181 daysAMZN
763545708154.328258170.3699951010.6294220.1039462023-03-062023-10-26234 daysAAPL
1496717735104.10308897.379997-645.416698-0.0645812023-11-082023-12-0527 daysSBUX
426521752149.932939358.9899905435.4833411.3943372023-01-302023-12-29333 daysMETA
1740722752240.127508255.100006598.8999140.0623522023-11-152023-12-2944 daysTSLA
289451475217.09562549.81300029249.3327401.9137862023-01-192023-12-29344 daysNVDA
1114627752539.130375661.0000001706.1747500.2260492023-07-032023-12-29179 daysCOST
1213704752407.049710490.3699951083.1637080.2046932023-10-202023-12-2970 daysNFLX
1361714752174.849846193.8999941162.0590510.1089512023-11-032023-12-2956 daysAAPL
15120718752114.499348149.5000004200.0781840.3056842023-11-092023-12-2950 daysAMD
1646721752145.507500153.100006349.2552810.0521792023-11-142023-12-2945 daysAMZN
1812728752221.382136260.670013471.4545340.1774662023-11-242023-12-2935 daysBA
\n", - "
" - ], - "text/plain": [ - " Size EntryBar ExitBar EntryPrice ExitPrice PnL ReturnPct \\\n", - "6 66 525 540 148.548104 147.710007 -55.314406 -0.005642 \n", - "0 105 504 551 103.049417 100.110001 -308.638768 -0.028524 \n", - "8 96 575 587 109.251048 104.269997 -478.180907 -0.045593 \n", - "1 12 504 675 195.863123 213.759995 214.762462 0.091374 \n", - "5 139 524 683 84.585016 98.599998 1948.082575 0.165691 \n", - "3 14 517 687 358.781354 382.399994 330.660962 0.065830 \n", - "10 46 607 705 210.885519 210.000000 -40.733868 -0.004199 \n", - "9 55 583 708 108.107058 120.629997 688.761639 0.115838 \n", - "7 63 545 708 154.328258 170.369995 1010.629422 0.103946 \n", - "14 96 717 735 104.103088 97.379997 -645.416698 -0.064581 \n", - "4 26 521 752 149.932939 358.989990 5435.483341 1.394337 \n", - "17 40 722 752 240.127508 255.100006 598.899914 0.062352 \n", - "2 894 514 752 17.095625 49.813000 29249.332740 1.913786 \n", - "11 14 627 752 539.130375 661.000000 1706.174750 0.226049 \n", - "12 13 704 752 407.049710 490.369995 1083.163708 0.204693 \n", - "13 61 714 752 174.849846 193.899994 1162.059051 0.108951 \n", - "15 120 718 752 114.499348 149.500000 4200.078184 0.305684 \n", - "16 46 721 752 145.507500 153.100006 349.255281 0.052179 \n", - "18 12 728 752 221.382136 260.670013 471.454534 0.177466 \n", - "\n", - " EntryTime ExitTime Duration Ticker \n", - "6 2023-02-03 2023-02-27 24 days AAPL \n", - "0 2023-01-04 2023-03-14 69 days SBUX \n", - "8 2023-04-18 2023-05-04 16 days SBUX \n", - "1 2023-01-04 2023-09-11 250 days BA \n", - "5 2023-02-02 2023-09-21 231 days AMD \n", - "3 2023-01-24 2023-09-27 246 days NFLX \n", - "10 2023-06-02 2023-10-23 143 days TSLA \n", - "9 2023-04-28 2023-10-26 181 days AMZN \n", - "7 2023-03-06 2023-10-26 234 days AAPL \n", - "14 2023-11-08 2023-12-05 27 days SBUX \n", - "4 2023-01-30 2023-12-29 333 days META \n", - "17 2023-11-15 2023-12-29 44 days TSLA \n", - "2 2023-01-19 2023-12-29 344 days NVDA \n", - "11 2023-07-03 2023-12-29 179 days COST \n", - "12 2023-10-20 2023-12-29 70 days NFLX \n", - "13 2023-11-03 2023-12-29 56 days AAPL \n", - "15 2023-11-09 2023-12-29 50 days AMD \n", - "16 2023-11-14 2023-12-29 45 days AMZN \n", - "18 2023-11-24 2023-12-29 35 days BA " - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "trades_ = ttrades__.copy()\n", - "trades_.sort_values('ExitTime', inplace=True)\n", - "trades_" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "NVDA 0.183382\n", - "AMD 0.141877\n", - "SBUX 0.130273\n", - "AAPL 0.118067\n", - "TSLA 0.118042\n", - "COST 0.095599\n", - "AMZN 0.072041\n", - "NFLX 0.064065\n", - "META 0.047216\n", - "BA 0.029439\n", - "dtype: float64" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "symbol_list = trades_.Ticker.unique()\n", - "untraded_symbols = [s for s in weights.keys() if s not in trades_.Ticker.unique()]\n", - "for s in untraded_symbols:\n", - " weights.pop(s)\n", - "pd.Series(weights).sort_values(ascending=False)" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'NVDA': 2,\n", - " 'AMD': 2,\n", - " 'TSLA': 2,\n", - " 'AAPL': 2,\n", - " 'SBUX': 2,\n", - " 'NFLX': 2,\n", - " 'COST': 2,\n", - " 'AMZN': 2,\n", - " 'META': 2,\n", - " 'BA': 2}" - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "max_cash = {}\n", - "cash = 20_000\n", - "for s, w in weights.items():\n", - " if w * cash > 200:\n", - " max_cash[s] = 2\n", - " elif w * cash > 100:\n", - " max_cash[s] = 1\n", - " else:\n", - " max_cash[s] = 0.5\n", - "max_cash" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
SizeEntryBarExitBarEntryPriceExitPricePnLReturnPctEntryTimeExitTimeDurationTicker
\n", - "
" - ], - "text/plain": [ - "Empty DataFrame\n", - "Columns: [Size, EntryBar, ExitBar, EntryPrice, ExitPrice, PnL, ReturnPct, EntryTime, ExitTime, Duration, Ticker]\n", - "Index: []" - ] - }, - "execution_count": 36, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "msft_trades = trades_[trades_['Ticker'] == 'MSFT']\n", - "msft_trades" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
SizeEntryBarExitBarEntryPriceExitPricePnLReturnPctEntryTimeExitTimeDurationTicker
\n", - "
" - ], - "text/plain": [ - "Empty DataFrame\n", - "Columns: [Size, EntryBar, ExitBar, EntryPrice, ExitPrice, PnL, ReturnPct, EntryTime, ExitTime, Duration, Ticker]\n", - "Index: []" - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "BAC_trades = trades_[trades_['Ticker'] == 'BAC']\n", - "BAC_trades" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
SizeEntryBarExitBarEntryPriceExitPricePnLReturnPctEntryTimeExitTimeDurationTicker
289451475217.09562549.81329249.332741.9137862023-01-192023-12-29344 daysNVDA
\n", - "
" - ], - "text/plain": [ - " Size EntryBar ExitBar EntryPrice ExitPrice PnL ReturnPct \\\n", - "2 894 514 752 17.095625 49.813 29249.33274 1.913786 \n", - "\n", - " EntryTime ExitTime Duration Ticker \n", - "2 2023-01-19 2023-12-29 344 days NVDA " - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "NVDA_trades = trades_[trades_['Ticker'] == 'NVDA']\n", - "NVDA_trades" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [], - "source": [ - "#Backtest class \n", - "## Find a way to not always reinitialize the backtest class, when want to redo\n", - "evb_backtest = OptionSignalBacktest(trades_, initial_capital=cash)" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
typesymbolsignal_typesignal_idmax_contract_priceorder_settings
datetime
2023-01-04MARKETNaNNaNNaNNaNNaN
2023-01-04SIGNALBALONGBA20230104LONGNaNNaN
2023-01-04SIGNALSBUXLONGSBUX20230104LONGNaNNaN
2023-01-05MARKETNaNNaNNaNNaNNaN
2023-01-06MARKETNaNNaNNaNNaNNaN
2023-01-09MARKETNaNNaNNaNNaNNaN
2023-01-10MARKETNaNNaNNaNNaNNaN
2023-01-11MARKETNaNNaNNaNNaNNaN
2023-01-12MARKETNaNNaNNaNNaNNaN
2023-01-13MARKETNaNNaNNaNNaNNaN
2023-01-16MARKETNaNNaNNaNNaNNaN
2023-01-17MARKETNaNNaNNaNNaNNaN
2023-01-18MARKETNaNNaNNaNNaNNaN
2023-01-19SIGNALNVDALONGNVDA20230119LONGNaNNaN
2023-01-19MARKETNaNNaNNaNNaNNaN
2023-01-20MARKETNaNNaNNaNNaNNaN
2023-01-23MARKETNaNNaNNaNNaNNaN
2023-01-24MARKETNaNNaNNaNNaNNaN
2023-01-24SIGNALNFLXLONGNFLX20230124LONGNaNNaN
2023-01-25MARKETNaNNaNNaNNaNNaN
2023-01-26MARKETNaNNaNNaNNaNNaN
2023-01-27MARKETNaNNaNNaNNaNNaN
2023-01-30MARKETNaNNaNNaNNaNNaN
2023-01-30SIGNALMETALONGMETA20230130LONGNaNNaN
2023-01-31MARKETNaNNaNNaNNaNNaN
2023-02-01MARKETNaNNaNNaNNaNNaN
2023-02-02MARKETNaNNaNNaNNaNNaN
2023-02-02SIGNALAMDLONGAMD20230202LONGNaNNaN
2023-02-03SIGNALAAPLLONGAAPL20230203LONGNaNNaN
2023-02-03MARKETNaNNaNNaNNaNNaN
2023-02-06MARKETNaNNaNNaNNaNNaN
2023-02-07MARKETNaNNaNNaNNaNNaN
2023-02-08MARKETNaNNaNNaNNaNNaN
2023-02-09MARKETNaNNaNNaNNaNNaN
2023-02-10MARKETNaNNaNNaNNaNNaN
2023-02-13MARKETNaNNaNNaNNaNNaN
2023-02-14MARKETNaNNaNNaNNaNNaN
2023-02-15MARKETNaNNaNNaNNaNNaN
2023-02-16MARKETNaNNaNNaNNaNNaN
2023-02-17MARKETNaNNaNNaNNaNNaN
2023-02-20MARKETNaNNaNNaNNaNNaN
2023-02-21MARKETNaNNaNNaNNaNNaN
2023-02-22MARKETNaNNaNNaNNaNNaN
2023-02-23MARKETNaNNaNNaNNaNNaN
2023-02-24MARKETNaNNaNNaNNaNNaN
2023-02-27SIGNALAAPLCLOSEAAPL20230227LONGNaNNaN
2023-02-27MARKETNaNNaNNaNNaNNaN
2023-02-28MARKETNaNNaNNaNNaNNaN
2023-03-01MARKETNaNNaNNaNNaNNaN
2023-03-02MARKETNaNNaNNaNNaNNaN
2023-03-03MARKETNaNNaNNaNNaNNaN
2023-03-06MARKETNaNNaNNaNNaNNaN
2023-03-06SIGNALAAPLLONGAAPL20230306LONGNaNNaN
2023-03-07MARKETNaNNaNNaNNaNNaN
2023-03-08MARKETNaNNaNNaNNaNNaN
2023-03-09MARKETNaNNaNNaNNaNNaN
2023-03-10MARKETNaNNaNNaNNaNNaN
2023-03-13MARKETNaNNaNNaNNaNNaN
2023-03-14MARKETNaNNaNNaNNaNNaN
2023-03-14SIGNALSBUXCLOSESBUX20230314LONGNaNNaN
2023-03-15MARKETNaNNaNNaNNaNNaN
2023-03-16MARKETNaNNaNNaNNaNNaN
2023-03-17MARKETNaNNaNNaNNaNNaN
2023-03-20MARKETNaNNaNNaNNaNNaN
2023-03-21MARKETNaNNaNNaNNaNNaN
2023-03-22MARKETNaNNaNNaNNaNNaN
2023-03-23MARKETNaNNaNNaNNaNNaN
2023-03-24MARKETNaNNaNNaNNaNNaN
2023-03-27MARKETNaNNaNNaNNaNNaN
2023-03-28MARKETNaNNaNNaNNaNNaN
2023-03-29MARKETNaNNaNNaNNaNNaN
2023-03-30MARKETNaNNaNNaNNaNNaN
2023-03-31MARKETNaNNaNNaNNaNNaN
2023-04-03MARKETNaNNaNNaNNaNNaN
2023-04-04MARKETNaNNaNNaNNaNNaN
2023-04-05MARKETNaNNaNNaNNaNNaN
2023-04-06MARKETNaNNaNNaNNaNNaN
2023-04-07MARKETNaNNaNNaNNaNNaN
2023-04-10MARKETNaNNaNNaNNaNNaN
2023-04-11MARKETNaNNaNNaNNaNNaN
2023-04-12MARKETNaNNaNNaNNaNNaN
2023-04-13MARKETNaNNaNNaNNaNNaN
2023-04-14MARKETNaNNaNNaNNaNNaN
2023-04-17MARKETNaNNaNNaNNaNNaN
2023-04-18SIGNALSBUXLONGSBUX20230418LONGNaNNaN
2023-04-18MARKETNaNNaNNaNNaNNaN
2023-04-19MARKETNaNNaNNaNNaNNaN
2023-04-20MARKETNaNNaNNaNNaNNaN
2023-04-21MARKETNaNNaNNaNNaNNaN
2023-04-24MARKETNaNNaNNaNNaNNaN
2023-04-25MARKETNaNNaNNaNNaNNaN
2023-04-26MARKETNaNNaNNaNNaNNaN
2023-04-27MARKETNaNNaNNaNNaNNaN
2023-04-28MARKETNaNNaNNaNNaNNaN
2023-04-28SIGNALAMZNLONGAMZN20230428LONGNaNNaN
2023-05-01MARKETNaNNaNNaNNaNNaN
2023-05-02MARKETNaNNaNNaNNaNNaN
2023-05-03MARKETNaNNaNNaNNaNNaN
2023-05-04SIGNALSBUXCLOSESBUX20230504LONGNaNNaN
2023-05-04MARKETNaNNaNNaNNaNNaN
2023-05-05MARKETNaNNaNNaNNaNNaN
2023-05-08MARKETNaNNaNNaNNaNNaN
2023-05-09MARKETNaNNaNNaNNaNNaN
2023-05-10MARKETNaNNaNNaNNaNNaN
2023-05-11MARKETNaNNaNNaNNaNNaN
2023-05-12MARKETNaNNaNNaNNaNNaN
2023-05-15MARKETNaNNaNNaNNaNNaN
2023-05-16MARKETNaNNaNNaNNaNNaN
2023-05-17MARKETNaNNaNNaNNaNNaN
2023-05-18MARKETNaNNaNNaNNaNNaN
2023-05-19MARKETNaNNaNNaNNaNNaN
2023-05-22MARKETNaNNaNNaNNaNNaN
2023-05-23MARKETNaNNaNNaNNaNNaN
2023-05-24MARKETNaNNaNNaNNaNNaN
2023-05-25MARKETNaNNaNNaNNaNNaN
2023-05-26MARKETNaNNaNNaNNaNNaN
2023-05-29MARKETNaNNaNNaNNaNNaN
2023-05-30MARKETNaNNaNNaNNaNNaN
2023-05-31MARKETNaNNaNNaNNaNNaN
2023-06-01MARKETNaNNaNNaNNaNNaN
2023-06-02SIGNALTSLALONGTSLA20230602LONGNaNNaN
2023-06-02MARKETNaNNaNNaNNaNNaN
2023-06-05MARKETNaNNaNNaNNaNNaN
2023-06-06MARKETNaNNaNNaNNaNNaN
2023-06-07MARKETNaNNaNNaNNaNNaN
2023-06-08MARKETNaNNaNNaNNaNNaN
2023-06-09MARKETNaNNaNNaNNaNNaN
2023-06-12MARKETNaNNaNNaNNaNNaN
2023-06-13MARKETNaNNaNNaNNaNNaN
2023-06-14MARKETNaNNaNNaNNaNNaN
2023-06-15MARKETNaNNaNNaNNaNNaN
2023-06-16MARKETNaNNaNNaNNaNNaN
2023-06-19MARKETNaNNaNNaNNaNNaN
2023-06-20MARKETNaNNaNNaNNaNNaN
2023-06-21MARKETNaNNaNNaNNaNNaN
2023-06-22MARKETNaNNaNNaNNaNNaN
2023-06-23MARKETNaNNaNNaNNaNNaN
2023-06-26MARKETNaNNaNNaNNaNNaN
2023-06-27MARKETNaNNaNNaNNaNNaN
2023-06-28MARKETNaNNaNNaNNaNNaN
2023-06-29MARKETNaNNaNNaNNaNNaN
2023-06-30MARKETNaNNaNNaNNaNNaN
2023-07-03MARKETNaNNaNNaNNaNNaN
2023-07-03SIGNALCOSTLONGCOST20230703LONGNaNNaN
2023-07-04MARKETNaNNaNNaNNaNNaN
2023-07-05MARKETNaNNaNNaNNaNNaN
2023-07-06MARKETNaNNaNNaNNaNNaN
2023-07-07MARKETNaNNaNNaNNaNNaN
2023-07-10MARKETNaNNaNNaNNaNNaN
2023-07-11MARKETNaNNaNNaNNaNNaN
2023-07-12MARKETNaNNaNNaNNaNNaN
2023-07-13MARKETNaNNaNNaNNaNNaN
2023-07-14MARKETNaNNaNNaNNaNNaN
2023-07-17MARKETNaNNaNNaNNaNNaN
2023-07-18MARKETNaNNaNNaNNaNNaN
2023-07-19MARKETNaNNaNNaNNaNNaN
2023-07-20MARKETNaNNaNNaNNaNNaN
2023-07-21MARKETNaNNaNNaNNaNNaN
2023-07-24MARKETNaNNaNNaNNaNNaN
2023-07-25MARKETNaNNaNNaNNaNNaN
2023-07-26MARKETNaNNaNNaNNaNNaN
2023-07-27MARKETNaNNaNNaNNaNNaN
2023-07-28MARKETNaNNaNNaNNaNNaN
2023-07-31MARKETNaNNaNNaNNaNNaN
2023-08-01MARKETNaNNaNNaNNaNNaN
2023-08-02MARKETNaNNaNNaNNaNNaN
2023-08-03MARKETNaNNaNNaNNaNNaN
2023-08-04MARKETNaNNaNNaNNaNNaN
2023-08-07MARKETNaNNaNNaNNaNNaN
2023-08-08MARKETNaNNaNNaNNaNNaN
2023-08-09MARKETNaNNaNNaNNaNNaN
2023-08-10MARKETNaNNaNNaNNaNNaN
2023-08-11MARKETNaNNaNNaNNaNNaN
2023-08-14MARKETNaNNaNNaNNaNNaN
2023-08-15MARKETNaNNaNNaNNaNNaN
2023-08-16MARKETNaNNaNNaNNaNNaN
2023-08-17MARKETNaNNaNNaNNaNNaN
2023-08-18MARKETNaNNaNNaNNaNNaN
2023-08-21MARKETNaNNaNNaNNaNNaN
2023-08-22MARKETNaNNaNNaNNaNNaN
2023-08-23MARKETNaNNaNNaNNaNNaN
2023-08-24MARKETNaNNaNNaNNaNNaN
2023-08-25MARKETNaNNaNNaNNaNNaN
2023-08-28MARKETNaNNaNNaNNaNNaN
2023-08-29MARKETNaNNaNNaNNaNNaN
2023-08-30MARKETNaNNaNNaNNaNNaN
2023-08-31MARKETNaNNaNNaNNaNNaN
2023-09-01MARKETNaNNaNNaNNaNNaN
2023-09-04MARKETNaNNaNNaNNaNNaN
2023-09-05MARKETNaNNaNNaNNaNNaN
2023-09-06MARKETNaNNaNNaNNaNNaN
2023-09-07MARKETNaNNaNNaNNaNNaN
2023-09-08MARKETNaNNaNNaNNaNNaN
2023-09-11MARKETNaNNaNNaNNaNNaN
2023-09-11SIGNALBACLOSEBA20230911LONGNaNNaN
2023-09-12MARKETNaNNaNNaNNaNNaN
2023-09-13MARKETNaNNaNNaNNaNNaN
2023-09-14MARKETNaNNaNNaNNaNNaN
2023-09-15MARKETNaNNaNNaNNaNNaN
2023-09-18MARKETNaNNaNNaNNaNNaN
2023-09-19MARKETNaNNaNNaNNaNNaN
2023-09-20MARKETNaNNaNNaNNaNNaN
2023-09-21SIGNALAMDCLOSEAMD20230921LONGNaNNaN
2023-09-21MARKETNaNNaNNaNNaNNaN
2023-09-22MARKETNaNNaNNaNNaNNaN
2023-09-25MARKETNaNNaNNaNNaNNaN
2023-09-26MARKETNaNNaNNaNNaNNaN
2023-09-27MARKETNaNNaNNaNNaNNaN
2023-09-27SIGNALNFLXCLOSENFLX20230927LONGNaNNaN
2023-09-28MARKETNaNNaNNaNNaNNaN
2023-09-29MARKETNaNNaNNaNNaNNaN
2023-10-02MARKETNaNNaNNaNNaNNaN
2023-10-03MARKETNaNNaNNaNNaNNaN
2023-10-04MARKETNaNNaNNaNNaNNaN
2023-10-05MARKETNaNNaNNaNNaNNaN
2023-10-06MARKETNaNNaNNaNNaNNaN
2023-10-09MARKETNaNNaNNaNNaNNaN
2023-10-10MARKETNaNNaNNaNNaNNaN
2023-10-11MARKETNaNNaNNaNNaNNaN
2023-10-12MARKETNaNNaNNaNNaNNaN
2023-10-13MARKETNaNNaNNaNNaNNaN
2023-10-16MARKETNaNNaNNaNNaNNaN
2023-10-17MARKETNaNNaNNaNNaNNaN
2023-10-18MARKETNaNNaNNaNNaNNaN
2023-10-19MARKETNaNNaNNaNNaNNaN
2023-10-20MARKETNaNNaNNaNNaNNaN
2023-10-20SIGNALNFLXLONGNFLX20231020LONGNaNNaN
2023-10-23SIGNALTSLACLOSETSLA20231023LONGNaNNaN
2023-10-23MARKETNaNNaNNaNNaNNaN
2023-10-24MARKETNaNNaNNaNNaNNaN
2023-10-25MARKETNaNNaNNaNNaNNaN
2023-10-26SIGNALAAPLCLOSEAAPL20231026LONGNaNNaN
2023-10-26MARKETNaNNaNNaNNaNNaN
2023-10-26SIGNALAMZNCLOSEAMZN20231026LONGNaNNaN
2023-10-27MARKETNaNNaNNaNNaNNaN
2023-10-30MARKETNaNNaNNaNNaNNaN
2023-10-31MARKETNaNNaNNaNNaNNaN
2023-11-01MARKETNaNNaNNaNNaNNaN
2023-11-02MARKETNaNNaNNaNNaNNaN
2023-11-03MARKETNaNNaNNaNNaNNaN
2023-11-03SIGNALAAPLLONGAAPL20231103LONGNaNNaN
2023-11-06MARKETNaNNaNNaNNaNNaN
2023-11-07MARKETNaNNaNNaNNaNNaN
2023-11-08SIGNALSBUXLONGSBUX20231108LONGNaNNaN
2023-11-08MARKETNaNNaNNaNNaNNaN
2023-11-09SIGNALAMDLONGAMD20231109LONGNaNNaN
2023-11-09MARKETNaNNaNNaNNaNNaN
2023-11-10MARKETNaNNaNNaNNaNNaN
2023-11-13MARKETNaNNaNNaNNaNNaN
2023-11-14MARKETNaNNaNNaNNaNNaN
2023-11-14SIGNALAMZNLONGAMZN20231114LONGNaNNaN
2023-11-15MARKETNaNNaNNaNNaNNaN
2023-11-15SIGNALTSLALONGTSLA20231115LONGNaNNaN
2023-11-16MARKETNaNNaNNaNNaNNaN
2023-11-17MARKETNaNNaNNaNNaNNaN
2023-11-20MARKETNaNNaNNaNNaNNaN
2023-11-21MARKETNaNNaNNaNNaNNaN
2023-11-22MARKETNaNNaNNaNNaNNaN
2023-11-23MARKETNaNNaNNaNNaNNaN
2023-11-24MARKETNaNNaNNaNNaNNaN
2023-11-24SIGNALBALONGBA20231124LONGNaNNaN
2023-11-27MARKETNaNNaNNaNNaNNaN
2023-11-28MARKETNaNNaNNaNNaNNaN
2023-11-29MARKETNaNNaNNaNNaNNaN
2023-11-30MARKETNaNNaNNaNNaNNaN
2023-12-01MARKETNaNNaNNaNNaNNaN
2023-12-04MARKETNaNNaNNaNNaNNaN
2023-12-05SIGNALSBUXCLOSESBUX20231205LONGNaNNaN
2023-12-05MARKETNaNNaNNaNNaNNaN
2023-12-06MARKETNaNNaNNaNNaNNaN
2023-12-07MARKETNaNNaNNaNNaNNaN
2023-12-08MARKETNaNNaNNaNNaNNaN
2023-12-11MARKETNaNNaNNaNNaNNaN
2023-12-12MARKETNaNNaNNaNNaNNaN
2023-12-13MARKETNaNNaNNaNNaNNaN
2023-12-14MARKETNaNNaNNaNNaNNaN
2023-12-15MARKETNaNNaNNaNNaNNaN
2023-12-18MARKETNaNNaNNaNNaNNaN
2023-12-19MARKETNaNNaNNaNNaNNaN
2023-12-20MARKETNaNNaNNaNNaNNaN
2023-12-21MARKETNaNNaNNaNNaNNaN
2023-12-22MARKETNaNNaNNaNNaNNaN
2023-12-25MARKETNaNNaNNaNNaNNaN
2023-12-26MARKETNaNNaNNaNNaNNaN
2023-12-27MARKETNaNNaNNaNNaNNaN
2023-12-28MARKETNaNNaNNaNNaNNaN
2023-12-29SIGNALAAPLCLOSEAAPL20231229LONGNaNNaN
2023-12-29SIGNALAMDCLOSEAMD20231229LONGNaNNaN
2023-12-29SIGNALAMZNCLOSEAMZN20231229LONGNaNNaN
2023-12-29MARKETNaNNaNNaNNaNNaN
2023-12-29SIGNALCOSTCLOSECOST20231229LONGNaNNaN
2023-12-29SIGNALNVDACLOSENVDA20231229LONGNaNNaN
2023-12-29SIGNALTSLACLOSETSLA20231229LONGNaNNaN
2023-12-29SIGNALMETACLOSEMETA20231229LONGNaNNaN
2023-12-29SIGNALNFLXCLOSENFLX20231229LONGNaNNaN
2023-12-29SIGNALBACLOSEBA20231229LONGNaNNaN
\n", - "
" - ], - "text/plain": [ - " type symbol signal_type signal_id max_contract_price \\\n", - "datetime \n", - "2023-01-04 MARKET NaN NaN NaN NaN \n", - "2023-01-04 SIGNAL BA LONG BA20230104LONG NaN \n", - "2023-01-04 SIGNAL SBUX LONG SBUX20230104LONG NaN \n", - "2023-01-05 MARKET NaN NaN NaN NaN \n", - "2023-01-06 MARKET NaN NaN NaN NaN \n", - "2023-01-09 MARKET NaN NaN NaN NaN \n", - "2023-01-10 MARKET NaN NaN NaN NaN \n", - "2023-01-11 MARKET NaN NaN NaN NaN \n", - "2023-01-12 MARKET NaN NaN NaN NaN \n", - "2023-01-13 MARKET NaN NaN NaN NaN \n", - "2023-01-16 MARKET NaN NaN NaN NaN \n", - "2023-01-17 MARKET NaN NaN NaN NaN \n", - "2023-01-18 MARKET NaN NaN NaN NaN \n", - "2023-01-19 SIGNAL NVDA LONG NVDA20230119LONG NaN \n", - "2023-01-19 MARKET NaN NaN NaN NaN \n", - "2023-01-20 MARKET NaN NaN NaN NaN \n", - "2023-01-23 MARKET NaN NaN NaN NaN \n", - "2023-01-24 MARKET NaN NaN NaN NaN \n", - "2023-01-24 SIGNAL NFLX LONG NFLX20230124LONG NaN \n", - "2023-01-25 MARKET NaN NaN NaN NaN \n", - "2023-01-26 MARKET NaN NaN NaN NaN \n", - "2023-01-27 MARKET NaN NaN NaN NaN \n", - "2023-01-30 MARKET NaN NaN NaN NaN \n", - "2023-01-30 SIGNAL META LONG META20230130LONG NaN \n", - "2023-01-31 MARKET NaN NaN NaN NaN \n", - "2023-02-01 MARKET NaN NaN NaN NaN \n", - "2023-02-02 MARKET NaN NaN NaN NaN \n", - "2023-02-02 SIGNAL AMD LONG AMD20230202LONG NaN \n", - "2023-02-03 SIGNAL AAPL LONG AAPL20230203LONG NaN \n", - "2023-02-03 MARKET NaN NaN NaN NaN \n", - "2023-02-06 MARKET NaN NaN NaN NaN \n", - "2023-02-07 MARKET NaN NaN NaN NaN \n", - "2023-02-08 MARKET NaN NaN NaN NaN \n", - "2023-02-09 MARKET NaN NaN NaN NaN \n", - "2023-02-10 MARKET NaN NaN NaN NaN \n", - "2023-02-13 MARKET NaN NaN NaN NaN \n", - "2023-02-14 MARKET NaN NaN NaN NaN \n", - "2023-02-15 MARKET NaN NaN NaN NaN \n", - "2023-02-16 MARKET NaN NaN NaN NaN \n", - "2023-02-17 MARKET NaN NaN NaN NaN \n", - "2023-02-20 MARKET NaN NaN NaN NaN \n", - "2023-02-21 MARKET NaN NaN NaN NaN \n", - "2023-02-22 MARKET NaN NaN NaN NaN \n", - "2023-02-23 MARKET NaN NaN NaN NaN \n", - "2023-02-24 MARKET NaN NaN NaN NaN \n", - "2023-02-27 SIGNAL AAPL CLOSE AAPL20230227LONG NaN \n", - "2023-02-27 MARKET NaN NaN NaN NaN \n", - "2023-02-28 MARKET NaN NaN NaN NaN \n", - "2023-03-01 MARKET NaN NaN NaN NaN \n", - "2023-03-02 MARKET NaN NaN NaN NaN \n", - "2023-03-03 MARKET NaN NaN NaN NaN \n", - "2023-03-06 MARKET NaN NaN NaN NaN \n", - "2023-03-06 SIGNAL AAPL LONG AAPL20230306LONG NaN \n", - "2023-03-07 MARKET NaN NaN NaN NaN \n", - "2023-03-08 MARKET NaN NaN NaN NaN \n", - "2023-03-09 MARKET NaN NaN NaN NaN \n", - "2023-03-10 MARKET NaN NaN NaN NaN \n", - "2023-03-13 MARKET NaN NaN NaN NaN \n", - "2023-03-14 MARKET NaN NaN NaN NaN \n", - "2023-03-14 SIGNAL SBUX CLOSE SBUX20230314LONG NaN \n", - "2023-03-15 MARKET NaN NaN NaN NaN \n", - "2023-03-16 MARKET NaN NaN NaN NaN \n", - "2023-03-17 MARKET NaN NaN NaN NaN \n", - "2023-03-20 MARKET NaN NaN NaN NaN \n", - "2023-03-21 MARKET NaN NaN NaN NaN \n", - "2023-03-22 MARKET NaN NaN NaN NaN \n", - "2023-03-23 MARKET NaN NaN NaN NaN \n", - "2023-03-24 MARKET NaN NaN NaN NaN \n", - "2023-03-27 MARKET NaN NaN NaN NaN \n", - "2023-03-28 MARKET NaN NaN NaN NaN \n", - "2023-03-29 MARKET NaN NaN NaN NaN \n", - "2023-03-30 MARKET NaN NaN NaN NaN \n", - "2023-03-31 MARKET NaN NaN NaN NaN \n", - "2023-04-03 MARKET NaN NaN NaN NaN \n", - "2023-04-04 MARKET NaN NaN NaN NaN \n", - "2023-04-05 MARKET NaN NaN NaN NaN \n", - "2023-04-06 MARKET NaN NaN NaN NaN \n", - "2023-04-07 MARKET NaN NaN NaN NaN \n", - "2023-04-10 MARKET NaN NaN NaN NaN \n", - "2023-04-11 MARKET NaN NaN NaN NaN \n", - "2023-04-12 MARKET NaN NaN NaN NaN \n", - "2023-04-13 MARKET NaN NaN NaN NaN \n", - "2023-04-14 MARKET NaN NaN NaN NaN \n", - "2023-04-17 MARKET NaN NaN NaN NaN \n", - "2023-04-18 SIGNAL SBUX LONG SBUX20230418LONG NaN \n", - "2023-04-18 MARKET NaN NaN NaN NaN \n", - "2023-04-19 MARKET NaN NaN NaN NaN \n", - "2023-04-20 MARKET NaN NaN NaN NaN \n", - "2023-04-21 MARKET NaN NaN NaN NaN \n", - "2023-04-24 MARKET NaN NaN NaN NaN \n", - "2023-04-25 MARKET NaN NaN NaN NaN \n", - "2023-04-26 MARKET NaN NaN NaN NaN \n", - "2023-04-27 MARKET NaN NaN NaN NaN \n", - "2023-04-28 MARKET NaN NaN NaN NaN \n", - "2023-04-28 SIGNAL AMZN LONG AMZN20230428LONG NaN \n", - "2023-05-01 MARKET NaN NaN NaN NaN \n", - "2023-05-02 MARKET NaN NaN NaN NaN \n", - "2023-05-03 MARKET NaN NaN NaN NaN \n", - "2023-05-04 SIGNAL SBUX CLOSE SBUX20230504LONG NaN \n", - "2023-05-04 MARKET NaN NaN NaN NaN \n", - "2023-05-05 MARKET NaN NaN NaN NaN \n", - "2023-05-08 MARKET NaN NaN NaN NaN \n", - "2023-05-09 MARKET NaN NaN NaN NaN \n", - "2023-05-10 MARKET NaN NaN NaN NaN \n", - "2023-05-11 MARKET NaN NaN NaN NaN \n", - "2023-05-12 MARKET NaN NaN NaN NaN \n", - "2023-05-15 MARKET NaN NaN NaN NaN \n", - "2023-05-16 MARKET NaN NaN NaN NaN \n", - "2023-05-17 MARKET NaN NaN NaN NaN \n", - "2023-05-18 MARKET NaN NaN NaN NaN \n", - "2023-05-19 MARKET NaN NaN NaN NaN \n", - "2023-05-22 MARKET NaN NaN NaN NaN \n", - "2023-05-23 MARKET NaN NaN NaN NaN \n", - "2023-05-24 MARKET NaN NaN NaN NaN \n", - "2023-05-25 MARKET NaN NaN NaN NaN \n", - "2023-05-26 MARKET NaN NaN NaN NaN \n", - "2023-05-29 MARKET NaN NaN NaN NaN \n", - "2023-05-30 MARKET NaN NaN NaN NaN \n", - "2023-05-31 MARKET NaN NaN NaN NaN \n", - "2023-06-01 MARKET NaN NaN NaN NaN \n", - "2023-06-02 SIGNAL TSLA LONG TSLA20230602LONG NaN \n", - "2023-06-02 MARKET NaN NaN NaN NaN \n", - "2023-06-05 MARKET NaN NaN NaN NaN \n", - "2023-06-06 MARKET NaN NaN NaN NaN \n", - "2023-06-07 MARKET NaN NaN NaN NaN \n", - "2023-06-08 MARKET NaN NaN NaN NaN \n", - "2023-06-09 MARKET NaN NaN NaN NaN \n", - "2023-06-12 MARKET NaN NaN NaN NaN \n", - "2023-06-13 MARKET NaN NaN NaN NaN \n", - "2023-06-14 MARKET NaN NaN NaN NaN \n", - "2023-06-15 MARKET NaN NaN NaN NaN \n", - "2023-06-16 MARKET NaN NaN NaN NaN \n", - "2023-06-19 MARKET NaN NaN NaN NaN \n", - "2023-06-20 MARKET NaN NaN NaN NaN \n", - "2023-06-21 MARKET NaN NaN NaN NaN \n", - "2023-06-22 MARKET NaN NaN NaN NaN \n", - "2023-06-23 MARKET NaN NaN NaN NaN \n", - "2023-06-26 MARKET NaN NaN NaN NaN \n", - "2023-06-27 MARKET NaN NaN NaN NaN \n", - "2023-06-28 MARKET NaN NaN NaN NaN \n", - "2023-06-29 MARKET NaN NaN NaN NaN \n", - "2023-06-30 MARKET NaN NaN NaN NaN \n", - "2023-07-03 MARKET NaN NaN NaN NaN \n", - "2023-07-03 SIGNAL COST LONG COST20230703LONG NaN \n", - "2023-07-04 MARKET NaN NaN NaN NaN \n", - "2023-07-05 MARKET NaN NaN NaN NaN \n", - "2023-07-06 MARKET NaN NaN NaN NaN \n", - "2023-07-07 MARKET NaN NaN NaN NaN \n", - "2023-07-10 MARKET NaN NaN NaN NaN \n", - "2023-07-11 MARKET NaN NaN NaN NaN \n", - "2023-07-12 MARKET NaN NaN NaN NaN \n", - "2023-07-13 MARKET NaN NaN NaN NaN \n", - "2023-07-14 MARKET NaN NaN NaN NaN \n", - "2023-07-17 MARKET NaN NaN NaN NaN \n", - "2023-07-18 MARKET NaN NaN NaN NaN \n", - "2023-07-19 MARKET NaN NaN NaN NaN \n", - "2023-07-20 MARKET NaN NaN NaN NaN \n", - "2023-07-21 MARKET NaN NaN NaN NaN \n", - "2023-07-24 MARKET NaN NaN NaN NaN \n", - "2023-07-25 MARKET NaN NaN NaN NaN \n", - "2023-07-26 MARKET NaN NaN NaN NaN \n", - "2023-07-27 MARKET NaN NaN NaN NaN \n", - "2023-07-28 MARKET NaN NaN NaN NaN \n", - "2023-07-31 MARKET NaN NaN NaN NaN \n", - "2023-08-01 MARKET NaN NaN NaN NaN \n", - "2023-08-02 MARKET NaN NaN NaN NaN \n", - "2023-08-03 MARKET NaN NaN NaN NaN \n", - "2023-08-04 MARKET NaN NaN NaN NaN \n", - "2023-08-07 MARKET NaN NaN NaN NaN \n", - "2023-08-08 MARKET NaN NaN NaN NaN \n", - "2023-08-09 MARKET NaN NaN NaN NaN \n", - "2023-08-10 MARKET NaN NaN NaN NaN \n", - "2023-08-11 MARKET NaN NaN NaN NaN \n", - "2023-08-14 MARKET NaN NaN NaN NaN \n", - "2023-08-15 MARKET NaN NaN NaN NaN \n", - "2023-08-16 MARKET NaN NaN NaN NaN \n", - "2023-08-17 MARKET NaN NaN NaN NaN \n", - "2023-08-18 MARKET NaN NaN NaN NaN \n", - "2023-08-21 MARKET NaN NaN NaN NaN \n", - "2023-08-22 MARKET NaN NaN NaN NaN \n", - "2023-08-23 MARKET NaN NaN NaN NaN \n", - "2023-08-24 MARKET NaN NaN NaN NaN \n", - "2023-08-25 MARKET NaN NaN NaN NaN \n", - "2023-08-28 MARKET NaN NaN NaN NaN \n", - "2023-08-29 MARKET NaN NaN NaN NaN \n", - "2023-08-30 MARKET NaN NaN NaN NaN \n", - "2023-08-31 MARKET NaN NaN NaN NaN \n", - "2023-09-01 MARKET NaN NaN NaN NaN \n", - "2023-09-04 MARKET NaN NaN NaN NaN \n", - "2023-09-05 MARKET NaN NaN NaN NaN \n", - "2023-09-06 MARKET NaN NaN NaN NaN \n", - "2023-09-07 MARKET NaN NaN NaN NaN \n", - "2023-09-08 MARKET NaN NaN NaN NaN \n", - "2023-09-11 MARKET NaN NaN NaN NaN \n", - "2023-09-11 SIGNAL BA CLOSE BA20230911LONG NaN \n", - "2023-09-12 MARKET NaN NaN NaN NaN \n", - "2023-09-13 MARKET NaN NaN NaN NaN \n", - "2023-09-14 MARKET NaN NaN NaN NaN \n", - "2023-09-15 MARKET NaN NaN NaN NaN \n", - "2023-09-18 MARKET NaN NaN NaN NaN \n", - "2023-09-19 MARKET NaN NaN NaN NaN \n", - "2023-09-20 MARKET NaN NaN NaN NaN \n", - "2023-09-21 SIGNAL AMD CLOSE AMD20230921LONG NaN \n", - "2023-09-21 MARKET NaN NaN NaN NaN \n", - "2023-09-22 MARKET NaN NaN NaN NaN \n", - "2023-09-25 MARKET NaN NaN NaN NaN \n", - "2023-09-26 MARKET NaN NaN NaN NaN \n", - "2023-09-27 MARKET NaN NaN NaN NaN \n", - "2023-09-27 SIGNAL NFLX CLOSE NFLX20230927LONG NaN \n", - "2023-09-28 MARKET NaN NaN NaN NaN \n", - "2023-09-29 MARKET NaN NaN NaN NaN \n", - "2023-10-02 MARKET NaN NaN NaN NaN \n", - "2023-10-03 MARKET NaN NaN NaN NaN \n", - "2023-10-04 MARKET NaN NaN NaN NaN \n", - "2023-10-05 MARKET NaN NaN NaN NaN \n", - "2023-10-06 MARKET NaN NaN NaN NaN \n", - "2023-10-09 MARKET NaN NaN NaN NaN \n", - "2023-10-10 MARKET NaN NaN NaN NaN \n", - "2023-10-11 MARKET NaN NaN NaN NaN \n", - "2023-10-12 MARKET NaN NaN NaN NaN \n", - "2023-10-13 MARKET NaN NaN NaN NaN \n", - "2023-10-16 MARKET NaN NaN NaN NaN \n", - "2023-10-17 MARKET NaN NaN NaN NaN \n", - "2023-10-18 MARKET NaN NaN NaN NaN \n", - "2023-10-19 MARKET NaN NaN NaN NaN \n", - "2023-10-20 MARKET NaN NaN NaN NaN \n", - "2023-10-20 SIGNAL NFLX LONG NFLX20231020LONG NaN \n", - "2023-10-23 SIGNAL TSLA CLOSE TSLA20231023LONG NaN \n", - "2023-10-23 MARKET NaN NaN NaN NaN \n", - "2023-10-24 MARKET NaN NaN NaN NaN \n", - "2023-10-25 MARKET NaN NaN NaN NaN \n", - "2023-10-26 SIGNAL AAPL CLOSE AAPL20231026LONG NaN \n", - "2023-10-26 MARKET NaN NaN NaN NaN \n", - "2023-10-26 SIGNAL AMZN CLOSE AMZN20231026LONG NaN \n", - "2023-10-27 MARKET NaN NaN NaN NaN \n", - "2023-10-30 MARKET NaN NaN NaN NaN \n", - "2023-10-31 MARKET NaN NaN NaN NaN \n", - "2023-11-01 MARKET NaN NaN NaN NaN \n", - "2023-11-02 MARKET NaN NaN NaN NaN \n", - "2023-11-03 MARKET NaN NaN NaN NaN \n", - "2023-11-03 SIGNAL AAPL LONG AAPL20231103LONG NaN \n", - "2023-11-06 MARKET NaN NaN NaN NaN \n", - "2023-11-07 MARKET NaN NaN NaN NaN \n", - "2023-11-08 SIGNAL SBUX LONG SBUX20231108LONG NaN \n", - "2023-11-08 MARKET NaN NaN NaN NaN \n", - "2023-11-09 SIGNAL AMD LONG AMD20231109LONG NaN \n", - "2023-11-09 MARKET NaN NaN NaN NaN \n", - "2023-11-10 MARKET NaN NaN NaN NaN \n", - "2023-11-13 MARKET NaN NaN NaN NaN \n", - "2023-11-14 MARKET NaN NaN NaN NaN \n", - "2023-11-14 SIGNAL AMZN LONG AMZN20231114LONG NaN \n", - "2023-11-15 MARKET NaN NaN NaN NaN \n", - "2023-11-15 SIGNAL TSLA LONG TSLA20231115LONG NaN \n", - "2023-11-16 MARKET NaN NaN NaN NaN \n", - "2023-11-17 MARKET NaN NaN NaN NaN \n", - "2023-11-20 MARKET NaN NaN NaN NaN \n", - "2023-11-21 MARKET NaN NaN NaN NaN \n", - "2023-11-22 MARKET NaN NaN NaN NaN \n", - "2023-11-23 MARKET NaN NaN NaN NaN \n", - "2023-11-24 MARKET NaN NaN NaN NaN \n", - "2023-11-24 SIGNAL BA LONG BA20231124LONG NaN \n", - "2023-11-27 MARKET NaN NaN NaN NaN \n", - "2023-11-28 MARKET NaN NaN NaN NaN \n", - "2023-11-29 MARKET NaN NaN NaN NaN \n", - "2023-11-30 MARKET NaN NaN NaN NaN \n", - "2023-12-01 MARKET NaN NaN NaN NaN \n", - "2023-12-04 MARKET NaN NaN NaN NaN \n", - "2023-12-05 SIGNAL SBUX CLOSE SBUX20231205LONG NaN \n", - "2023-12-05 MARKET NaN NaN NaN NaN \n", - "2023-12-06 MARKET NaN NaN NaN NaN \n", - "2023-12-07 MARKET NaN NaN NaN NaN \n", - "2023-12-08 MARKET NaN NaN NaN NaN \n", - "2023-12-11 MARKET NaN NaN NaN NaN \n", - "2023-12-12 MARKET NaN NaN NaN NaN \n", - "2023-12-13 MARKET NaN NaN NaN NaN \n", - "2023-12-14 MARKET NaN NaN NaN NaN \n", - "2023-12-15 MARKET NaN NaN NaN NaN \n", - "2023-12-18 MARKET NaN NaN NaN NaN \n", - "2023-12-19 MARKET NaN NaN NaN NaN \n", - "2023-12-20 MARKET NaN NaN NaN NaN \n", - "2023-12-21 MARKET NaN NaN NaN NaN \n", - "2023-12-22 MARKET NaN NaN NaN NaN \n", - "2023-12-25 MARKET NaN NaN NaN NaN \n", - "2023-12-26 MARKET NaN NaN NaN NaN \n", - "2023-12-27 MARKET NaN NaN NaN NaN \n", - "2023-12-28 MARKET NaN NaN NaN NaN \n", - "2023-12-29 SIGNAL AAPL CLOSE AAPL20231229LONG NaN \n", - "2023-12-29 SIGNAL AMD CLOSE AMD20231229LONG NaN \n", - "2023-12-29 SIGNAL AMZN CLOSE AMZN20231229LONG NaN \n", - "2023-12-29 MARKET NaN NaN NaN NaN \n", - "2023-12-29 SIGNAL COST CLOSE COST20231229LONG NaN \n", - "2023-12-29 SIGNAL NVDA CLOSE NVDA20231229LONG NaN \n", - "2023-12-29 SIGNAL TSLA CLOSE TSLA20231229LONG NaN \n", - "2023-12-29 SIGNAL META CLOSE META20231229LONG NaN \n", - "2023-12-29 SIGNAL NFLX CLOSE NFLX20231229LONG NaN \n", - "2023-12-29 SIGNAL BA CLOSE BA20231229LONG NaN \n", - "\n", - " order_settings \n", - "datetime \n", - "2023-01-04 NaN \n", - "2023-01-04 NaN \n", - "2023-01-04 NaN \n", - "2023-01-05 NaN \n", - "2023-01-06 NaN \n", - "2023-01-09 NaN \n", - "2023-01-10 NaN \n", - "2023-01-11 NaN \n", - "2023-01-12 NaN \n", - "2023-01-13 NaN \n", - "2023-01-16 NaN \n", - "2023-01-17 NaN \n", - "2023-01-18 NaN \n", - "2023-01-19 NaN \n", - "2023-01-19 NaN \n", - "2023-01-20 NaN \n", - "2023-01-23 NaN \n", - "2023-01-24 NaN \n", - "2023-01-24 NaN \n", - "2023-01-25 NaN \n", - "2023-01-26 NaN \n", - "2023-01-27 NaN \n", - "2023-01-30 NaN \n", - "2023-01-30 NaN \n", - "2023-01-31 NaN \n", - "2023-02-01 NaN \n", - "2023-02-02 NaN \n", - "2023-02-02 NaN \n", - "2023-02-03 NaN \n", - "2023-02-03 NaN \n", - "2023-02-06 NaN \n", - "2023-02-07 NaN \n", - "2023-02-08 NaN \n", - "2023-02-09 NaN \n", - "2023-02-10 NaN \n", - "2023-02-13 NaN \n", - "2023-02-14 NaN \n", - "2023-02-15 NaN \n", - "2023-02-16 NaN \n", - "2023-02-17 NaN \n", - "2023-02-20 NaN \n", - "2023-02-21 NaN \n", - "2023-02-22 NaN \n", - "2023-02-23 NaN \n", - "2023-02-24 NaN \n", - "2023-02-27 NaN \n", - "2023-02-27 NaN \n", - "2023-02-28 NaN \n", - "2023-03-01 NaN \n", - "2023-03-02 NaN \n", - "2023-03-03 NaN \n", - "2023-03-06 NaN \n", - "2023-03-06 NaN \n", - "2023-03-07 NaN \n", - "2023-03-08 NaN \n", - "2023-03-09 NaN \n", - "2023-03-10 NaN \n", - "2023-03-13 NaN \n", - "2023-03-14 NaN \n", - "2023-03-14 NaN \n", - "2023-03-15 NaN \n", - "2023-03-16 NaN \n", - "2023-03-17 NaN \n", - "2023-03-20 NaN \n", - "2023-03-21 NaN \n", - "2023-03-22 NaN \n", - "2023-03-23 NaN \n", - "2023-03-24 NaN \n", - "2023-03-27 NaN \n", - "2023-03-28 NaN \n", - "2023-03-29 NaN \n", - "2023-03-30 NaN \n", - "2023-03-31 NaN \n", - "2023-04-03 NaN \n", - "2023-04-04 NaN \n", - "2023-04-05 NaN \n", - "2023-04-06 NaN \n", - "2023-04-07 NaN \n", - "2023-04-10 NaN \n", - "2023-04-11 NaN \n", - "2023-04-12 NaN \n", - "2023-04-13 NaN \n", - "2023-04-14 NaN \n", - "2023-04-17 NaN \n", - "2023-04-18 NaN \n", - "2023-04-18 NaN \n", - "2023-04-19 NaN \n", - "2023-04-20 NaN \n", - "2023-04-21 NaN \n", - "2023-04-24 NaN \n", - "2023-04-25 NaN \n", - "2023-04-26 NaN \n", - "2023-04-27 NaN \n", - "2023-04-28 NaN \n", - "2023-04-28 NaN \n", - "2023-05-01 NaN \n", - "2023-05-02 NaN \n", - "2023-05-03 NaN \n", - "2023-05-04 NaN \n", - "2023-05-04 NaN \n", - "2023-05-05 NaN \n", - "2023-05-08 NaN \n", - "2023-05-09 NaN \n", - "2023-05-10 NaN \n", - "2023-05-11 NaN \n", - "2023-05-12 NaN \n", - "2023-05-15 NaN \n", - "2023-05-16 NaN \n", - "2023-05-17 NaN \n", - "2023-05-18 NaN \n", - "2023-05-19 NaN \n", - "2023-05-22 NaN \n", - "2023-05-23 NaN \n", - "2023-05-24 NaN \n", - "2023-05-25 NaN \n", - "2023-05-26 NaN \n", - "2023-05-29 NaN \n", - "2023-05-30 NaN \n", - "2023-05-31 NaN \n", - "2023-06-01 NaN \n", - "2023-06-02 NaN \n", - "2023-06-02 NaN \n", - "2023-06-05 NaN \n", - "2023-06-06 NaN \n", - "2023-06-07 NaN \n", - "2023-06-08 NaN \n", - "2023-06-09 NaN \n", - "2023-06-12 NaN \n", - "2023-06-13 NaN \n", - "2023-06-14 NaN \n", - "2023-06-15 NaN \n", - "2023-06-16 NaN \n", - "2023-06-19 NaN \n", - "2023-06-20 NaN \n", - "2023-06-21 NaN \n", - "2023-06-22 NaN \n", - "2023-06-23 NaN \n", - "2023-06-26 NaN \n", - "2023-06-27 NaN \n", - "2023-06-28 NaN \n", - "2023-06-29 NaN \n", - "2023-06-30 NaN \n", - "2023-07-03 NaN \n", - "2023-07-03 NaN \n", - "2023-07-04 NaN \n", - "2023-07-05 NaN \n", - "2023-07-06 NaN \n", - "2023-07-07 NaN \n", - "2023-07-10 NaN \n", - "2023-07-11 NaN \n", - "2023-07-12 NaN \n", - "2023-07-13 NaN \n", - "2023-07-14 NaN \n", - "2023-07-17 NaN \n", - "2023-07-18 NaN \n", - "2023-07-19 NaN \n", - "2023-07-20 NaN \n", - "2023-07-21 NaN \n", - "2023-07-24 NaN \n", - "2023-07-25 NaN \n", - "2023-07-26 NaN \n", - "2023-07-27 NaN \n", - "2023-07-28 NaN \n", - "2023-07-31 NaN \n", - "2023-08-01 NaN \n", - "2023-08-02 NaN \n", - "2023-08-03 NaN \n", - "2023-08-04 NaN \n", - "2023-08-07 NaN \n", - "2023-08-08 NaN \n", - "2023-08-09 NaN \n", - "2023-08-10 NaN \n", - "2023-08-11 NaN \n", - "2023-08-14 NaN \n", - "2023-08-15 NaN \n", - "2023-08-16 NaN \n", - "2023-08-17 NaN \n", - "2023-08-18 NaN \n", - "2023-08-21 NaN \n", - "2023-08-22 NaN \n", - "2023-08-23 NaN \n", - "2023-08-24 NaN \n", - "2023-08-25 NaN \n", - "2023-08-28 NaN \n", - "2023-08-29 NaN \n", - "2023-08-30 NaN \n", - "2023-08-31 NaN \n", - "2023-09-01 NaN \n", - "2023-09-04 NaN \n", - "2023-09-05 NaN \n", - "2023-09-06 NaN \n", - "2023-09-07 NaN \n", - "2023-09-08 NaN \n", - "2023-09-11 NaN \n", - "2023-09-11 NaN \n", - "2023-09-12 NaN \n", - "2023-09-13 NaN \n", - "2023-09-14 NaN \n", - "2023-09-15 NaN \n", - "2023-09-18 NaN \n", - "2023-09-19 NaN \n", - "2023-09-20 NaN \n", - "2023-09-21 NaN \n", - "2023-09-21 NaN \n", - "2023-09-22 NaN \n", - "2023-09-25 NaN \n", - "2023-09-26 NaN \n", - "2023-09-27 NaN \n", - "2023-09-27 NaN \n", - "2023-09-28 NaN \n", - "2023-09-29 NaN \n", - "2023-10-02 NaN \n", - "2023-10-03 NaN \n", - "2023-10-04 NaN \n", - "2023-10-05 NaN \n", - "2023-10-06 NaN \n", - "2023-10-09 NaN \n", - "2023-10-10 NaN \n", - "2023-10-11 NaN \n", - "2023-10-12 NaN \n", - "2023-10-13 NaN \n", - "2023-10-16 NaN \n", - "2023-10-17 NaN \n", - "2023-10-18 NaN \n", - "2023-10-19 NaN \n", - "2023-10-20 NaN \n", - "2023-10-20 NaN \n", - "2023-10-23 NaN \n", - "2023-10-23 NaN \n", - "2023-10-24 NaN \n", - "2023-10-25 NaN \n", - "2023-10-26 NaN \n", - "2023-10-26 NaN \n", - "2023-10-26 NaN \n", - "2023-10-27 NaN \n", - "2023-10-30 NaN \n", - "2023-10-31 NaN \n", - "2023-11-01 NaN \n", - "2023-11-02 NaN \n", - "2023-11-03 NaN \n", - "2023-11-03 NaN \n", - "2023-11-06 NaN \n", - "2023-11-07 NaN \n", - "2023-11-08 NaN \n", - "2023-11-08 NaN \n", - "2023-11-09 NaN \n", - "2023-11-09 NaN \n", - "2023-11-10 NaN \n", - "2023-11-13 NaN \n", - "2023-11-14 NaN \n", - "2023-11-14 NaN \n", - "2023-11-15 NaN \n", - "2023-11-15 NaN \n", - "2023-11-16 NaN \n", - "2023-11-17 NaN \n", - "2023-11-20 NaN \n", - "2023-11-21 NaN \n", - "2023-11-22 NaN \n", - "2023-11-23 NaN \n", - "2023-11-24 NaN \n", - "2023-11-24 NaN \n", - "2023-11-27 NaN \n", - "2023-11-28 NaN \n", - "2023-11-29 NaN \n", - "2023-11-30 NaN \n", - "2023-12-01 NaN \n", - "2023-12-04 NaN \n", - "2023-12-05 NaN \n", - "2023-12-05 NaN \n", - "2023-12-06 NaN \n", - "2023-12-07 NaN \n", - "2023-12-08 NaN \n", - "2023-12-11 NaN \n", - "2023-12-12 NaN \n", - "2023-12-13 NaN \n", - "2023-12-14 NaN \n", - "2023-12-15 NaN \n", - "2023-12-18 NaN \n", - "2023-12-19 NaN \n", - "2023-12-20 NaN \n", - "2023-12-21 NaN \n", - "2023-12-22 NaN \n", - "2023-12-25 NaN \n", - "2023-12-26 NaN \n", - "2023-12-27 NaN \n", - "2023-12-28 NaN \n", - "2023-12-29 NaN \n", - "2023-12-29 NaN \n", - "2023-12-29 NaN \n", - "2023-12-29 NaN \n", - "2023-12-29 NaN \n", - "2023-12-29 NaN \n", - "2023-12-29 NaN \n", - "2023-12-29 NaN \n", - "2023-12-29 NaN \n", - "2023-12-29 NaN " - ] - }, - "execution_count": 40, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pd.set_option('display.max_columns', 1000)\n", - "pd.set_option('display.max_rows', 1000)\n", - "evb_backtest.events.events" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
DateAAPLSBUXBAAMDNFLXTSLAAMZNMETANVDACOST
02023-01-040110000000
12023-01-050000000000
22023-01-060000000000
32023-01-090000000000
42023-01-100000000000
52023-01-110000000000
62023-01-120000000000
72023-01-130000000000
82023-01-160000000000
92023-01-170000000000
102023-01-180000000000
112023-01-190000000010
122023-01-200000000000
132023-01-230000000000
142023-01-240000100000
152023-01-250000000000
162023-01-260000000000
172023-01-270000000000
182023-01-300000000100
192023-01-310000000000
202023-02-010000000000
212023-02-020001000000
222023-02-031000000000
232023-02-060000000000
242023-02-070000000000
252023-02-080000000000
262023-02-090000000000
272023-02-100000000000
282023-02-130000000000
292023-02-140000000000
302023-02-150000000000
312023-02-160000000000
322023-02-170000000000
332023-02-200000000000
342023-02-210000000000
352023-02-220000000000
362023-02-230000000000
372023-02-240000000000
382023-02-27-1000000000
392023-02-280000000000
402023-03-010000000000
412023-03-020000000000
422023-03-030000000000
432023-03-061000000000
442023-03-070000000000
452023-03-080000000000
462023-03-090000000000
472023-03-100000000000
482023-03-130000000000
492023-03-140-100000000
502023-03-150000000000
512023-03-160000000000
522023-03-170000000000
532023-03-200000000000
542023-03-210000000000
552023-03-220000000000
562023-03-230000000000
572023-03-240000000000
582023-03-270000000000
592023-03-280000000000
602023-03-290000000000
612023-03-300000000000
622023-03-310000000000
632023-04-030000000000
642023-04-040000000000
652023-04-050000000000
662023-04-060000000000
672023-04-070000000000
682023-04-100000000000
692023-04-110000000000
702023-04-120000000000
712023-04-130000000000
722023-04-140000000000
732023-04-170000000000
742023-04-180100000000
752023-04-190000000000
762023-04-200000000000
772023-04-210000000000
782023-04-240000000000
792023-04-250000000000
802023-04-260000000000
812023-04-270000000000
822023-04-280000001000
832023-05-010000000000
842023-05-020000000000
852023-05-030000000000
862023-05-040-100000000
872023-05-050000000000
882023-05-080000000000
892023-05-090000000000
902023-05-100000000000
912023-05-110000000000
922023-05-120000000000
932023-05-150000000000
942023-05-160000000000
952023-05-170000000000
962023-05-180000000000
972023-05-190000000000
982023-05-220000000000
992023-05-230000000000
1002023-05-240000000000
1012023-05-250000000000
1022023-05-260000000000
1032023-05-290000000000
1042023-05-300000000000
1052023-05-310000000000
1062023-06-010000000000
1072023-06-020000010000
1082023-06-050000000000
1092023-06-060000000000
1102023-06-070000000000
1112023-06-080000000000
1122023-06-090000000000
1132023-06-120000000000
1142023-06-130000000000
1152023-06-140000000000
1162023-06-150000000000
1172023-06-160000000000
1182023-06-190000000000
1192023-06-200000000000
1202023-06-210000000000
1212023-06-220000000000
1222023-06-230000000000
1232023-06-260000000000
1242023-06-270000000000
1252023-06-280000000000
1262023-06-290000000000
1272023-06-300000000000
1282023-07-030000000001
1292023-07-040000000000
1302023-07-050000000000
1312023-07-060000000000
1322023-07-070000000000
1332023-07-100000000000
1342023-07-110000000000
1352023-07-120000000000
1362023-07-130000000000
1372023-07-140000000000
1382023-07-170000000000
1392023-07-180000000000
1402023-07-190000000000
1412023-07-200000000000
1422023-07-210000000000
1432023-07-240000000000
1442023-07-250000000000
1452023-07-260000000000
1462023-07-270000000000
1472023-07-280000000000
1482023-07-310000000000
1492023-08-010000000000
1502023-08-020000000000
1512023-08-030000000000
1522023-08-040000000000
1532023-08-070000000000
1542023-08-080000000000
1552023-08-090000000000
1562023-08-100000000000
1572023-08-110000000000
1582023-08-140000000000
1592023-08-150000000000
1602023-08-160000000000
1612023-08-170000000000
1622023-08-180000000000
1632023-08-210000000000
1642023-08-220000000000
1652023-08-230000000000
1662023-08-240000000000
1672023-08-250000000000
1682023-08-280000000000
1692023-08-290000000000
1702023-08-300000000000
1712023-08-310000000000
1722023-09-010000000000
1732023-09-040000000000
1742023-09-050000000000
1752023-09-060000000000
1762023-09-070000000000
1772023-09-080000000000
1782023-09-1100-10000000
1792023-09-120000000000
1802023-09-130000000000
1812023-09-140000000000
1822023-09-150000000000
1832023-09-180000000000
1842023-09-190000000000
1852023-09-200000000000
1862023-09-21000-1000000
1872023-09-220000000000
1882023-09-250000000000
1892023-09-260000000000
1902023-09-270000-100000
1912023-09-280000000000
1922023-09-290000000000
1932023-10-020000000000
1942023-10-030000000000
1952023-10-040000000000
1962023-10-050000000000
1972023-10-060000000000
1982023-10-090000000000
1992023-10-100000000000
2002023-10-110000000000
2012023-10-120000000000
2022023-10-130000000000
2032023-10-160000000000
2042023-10-170000000000
2052023-10-180000000000
2062023-10-190000000000
2072023-10-200000100000
2082023-10-2300000-10000
2092023-10-240000000000
2102023-10-250000000000
2112023-10-26-100000-1000
2122023-10-270000000000
2132023-10-300000000000
2142023-10-310000000000
2152023-11-010000000000
2162023-11-020000000000
2172023-11-031000000000
2182023-11-060000000000
2192023-11-070000000000
2202023-11-080100000000
2212023-11-090001000000
2222023-11-100000000000
2232023-11-130000000000
2242023-11-140000001000
2252023-11-150000010000
2262023-11-160000000000
2272023-11-170000000000
2282023-11-200000000000
2292023-11-210000000000
2302023-11-220000000000
2312023-11-230000000000
2322023-11-240010000000
2332023-11-270000000000
2342023-11-280000000000
2352023-11-290000000000
2362023-11-300000000000
2372023-12-010000000000
2382023-12-040000000000
2392023-12-050-100000000
2402023-12-060000000000
2412023-12-070000000000
2422023-12-080000000000
2432023-12-110000000000
2442023-12-120000000000
2452023-12-130000000000
2462023-12-140000000000
2472023-12-150000000000
2482023-12-180000000000
2492023-12-190000000000
2502023-12-200000000000
2512023-12-210000000000
2522023-12-220000000000
2532023-12-250000000000
2542023-12-260000000000
2552023-12-270000000000
2562023-12-280000000000
2572023-12-29-10-1-1-1-1-1-1-1-1
\n", - "
" - ], - "text/plain": [ - " Date AAPL SBUX BA AMD NFLX TSLA AMZN META NVDA COST\n", - "0 2023-01-04 0 1 1 0 0 0 0 0 0 0\n", - "1 2023-01-05 0 0 0 0 0 0 0 0 0 0\n", - "2 2023-01-06 0 0 0 0 0 0 0 0 0 0\n", - "3 2023-01-09 0 0 0 0 0 0 0 0 0 0\n", - "4 2023-01-10 0 0 0 0 0 0 0 0 0 0\n", - "5 2023-01-11 0 0 0 0 0 0 0 0 0 0\n", - "6 2023-01-12 0 0 0 0 0 0 0 0 0 0\n", - "7 2023-01-13 0 0 0 0 0 0 0 0 0 0\n", - "8 2023-01-16 0 0 0 0 0 0 0 0 0 0\n", - "9 2023-01-17 0 0 0 0 0 0 0 0 0 0\n", - "10 2023-01-18 0 0 0 0 0 0 0 0 0 0\n", - "11 2023-01-19 0 0 0 0 0 0 0 0 1 0\n", - "12 2023-01-20 0 0 0 0 0 0 0 0 0 0\n", - "13 2023-01-23 0 0 0 0 0 0 0 0 0 0\n", - "14 2023-01-24 0 0 0 0 1 0 0 0 0 0\n", - "15 2023-01-25 0 0 0 0 0 0 0 0 0 0\n", - "16 2023-01-26 0 0 0 0 0 0 0 0 0 0\n", - "17 2023-01-27 0 0 0 0 0 0 0 0 0 0\n", - "18 2023-01-30 0 0 0 0 0 0 0 1 0 0\n", - "19 2023-01-31 0 0 0 0 0 0 0 0 0 0\n", - "20 2023-02-01 0 0 0 0 0 0 0 0 0 0\n", - "21 2023-02-02 0 0 0 1 0 0 0 0 0 0\n", - "22 2023-02-03 1 0 0 0 0 0 0 0 0 0\n", - "23 2023-02-06 0 0 0 0 0 0 0 0 0 0\n", - "24 2023-02-07 0 0 0 0 0 0 0 0 0 0\n", - "25 2023-02-08 0 0 0 0 0 0 0 0 0 0\n", - "26 2023-02-09 0 0 0 0 0 0 0 0 0 0\n", - "27 2023-02-10 0 0 0 0 0 0 0 0 0 0\n", - "28 2023-02-13 0 0 0 0 0 0 0 0 0 0\n", - "29 2023-02-14 0 0 0 0 0 0 0 0 0 0\n", - "30 2023-02-15 0 0 0 0 0 0 0 0 0 0\n", - "31 2023-02-16 0 0 0 0 0 0 0 0 0 0\n", - "32 2023-02-17 0 0 0 0 0 0 0 0 0 0\n", - "33 2023-02-20 0 0 0 0 0 0 0 0 0 0\n", - "34 2023-02-21 0 0 0 0 0 0 0 0 0 0\n", - "35 2023-02-22 0 0 0 0 0 0 0 0 0 0\n", - "36 2023-02-23 0 0 0 0 0 0 0 0 0 0\n", - "37 2023-02-24 0 0 0 0 0 0 0 0 0 0\n", - "38 2023-02-27 -1 0 0 0 0 0 0 0 0 0\n", - "39 2023-02-28 0 0 0 0 0 0 0 0 0 0\n", - "40 2023-03-01 0 0 0 0 0 0 0 0 0 0\n", - "41 2023-03-02 0 0 0 0 0 0 0 0 0 0\n", - "42 2023-03-03 0 0 0 0 0 0 0 0 0 0\n", - "43 2023-03-06 1 0 0 0 0 0 0 0 0 0\n", - "44 2023-03-07 0 0 0 0 0 0 0 0 0 0\n", - "45 2023-03-08 0 0 0 0 0 0 0 0 0 0\n", - "46 2023-03-09 0 0 0 0 0 0 0 0 0 0\n", - "47 2023-03-10 0 0 0 0 0 0 0 0 0 0\n", - "48 2023-03-13 0 0 0 0 0 0 0 0 0 0\n", - "49 2023-03-14 0 -1 0 0 0 0 0 0 0 0\n", - "50 2023-03-15 0 0 0 0 0 0 0 0 0 0\n", - "51 2023-03-16 0 0 0 0 0 0 0 0 0 0\n", - "52 2023-03-17 0 0 0 0 0 0 0 0 0 0\n", - "53 2023-03-20 0 0 0 0 0 0 0 0 0 0\n", - "54 2023-03-21 0 0 0 0 0 0 0 0 0 0\n", - "55 2023-03-22 0 0 0 0 0 0 0 0 0 0\n", - "56 2023-03-23 0 0 0 0 0 0 0 0 0 0\n", - "57 2023-03-24 0 0 0 0 0 0 0 0 0 0\n", - "58 2023-03-27 0 0 0 0 0 0 0 0 0 0\n", - "59 2023-03-28 0 0 0 0 0 0 0 0 0 0\n", - "60 2023-03-29 0 0 0 0 0 0 0 0 0 0\n", - "61 2023-03-30 0 0 0 0 0 0 0 0 0 0\n", - "62 2023-03-31 0 0 0 0 0 0 0 0 0 0\n", - "63 2023-04-03 0 0 0 0 0 0 0 0 0 0\n", - "64 2023-04-04 0 0 0 0 0 0 0 0 0 0\n", - "65 2023-04-05 0 0 0 0 0 0 0 0 0 0\n", - "66 2023-04-06 0 0 0 0 0 0 0 0 0 0\n", - "67 2023-04-07 0 0 0 0 0 0 0 0 0 0\n", - "68 2023-04-10 0 0 0 0 0 0 0 0 0 0\n", - "69 2023-04-11 0 0 0 0 0 0 0 0 0 0\n", - "70 2023-04-12 0 0 0 0 0 0 0 0 0 0\n", - "71 2023-04-13 0 0 0 0 0 0 0 0 0 0\n", - "72 2023-04-14 0 0 0 0 0 0 0 0 0 0\n", - "73 2023-04-17 0 0 0 0 0 0 0 0 0 0\n", - "74 2023-04-18 0 1 0 0 0 0 0 0 0 0\n", - "75 2023-04-19 0 0 0 0 0 0 0 0 0 0\n", - "76 2023-04-20 0 0 0 0 0 0 0 0 0 0\n", - "77 2023-04-21 0 0 0 0 0 0 0 0 0 0\n", - "78 2023-04-24 0 0 0 0 0 0 0 0 0 0\n", - "79 2023-04-25 0 0 0 0 0 0 0 0 0 0\n", - "80 2023-04-26 0 0 0 0 0 0 0 0 0 0\n", - "81 2023-04-27 0 0 0 0 0 0 0 0 0 0\n", - "82 2023-04-28 0 0 0 0 0 0 1 0 0 0\n", - "83 2023-05-01 0 0 0 0 0 0 0 0 0 0\n", - "84 2023-05-02 0 0 0 0 0 0 0 0 0 0\n", - "85 2023-05-03 0 0 0 0 0 0 0 0 0 0\n", - "86 2023-05-04 0 -1 0 0 0 0 0 0 0 0\n", - "87 2023-05-05 0 0 0 0 0 0 0 0 0 0\n", - "88 2023-05-08 0 0 0 0 0 0 0 0 0 0\n", - "89 2023-05-09 0 0 0 0 0 0 0 0 0 0\n", - "90 2023-05-10 0 0 0 0 0 0 0 0 0 0\n", - "91 2023-05-11 0 0 0 0 0 0 0 0 0 0\n", - "92 2023-05-12 0 0 0 0 0 0 0 0 0 0\n", - "93 2023-05-15 0 0 0 0 0 0 0 0 0 0\n", - "94 2023-05-16 0 0 0 0 0 0 0 0 0 0\n", - "95 2023-05-17 0 0 0 0 0 0 0 0 0 0\n", - "96 2023-05-18 0 0 0 0 0 0 0 0 0 0\n", - "97 2023-05-19 0 0 0 0 0 0 0 0 0 0\n", - "98 2023-05-22 0 0 0 0 0 0 0 0 0 0\n", - "99 2023-05-23 0 0 0 0 0 0 0 0 0 0\n", - "100 2023-05-24 0 0 0 0 0 0 0 0 0 0\n", - "101 2023-05-25 0 0 0 0 0 0 0 0 0 0\n", - "102 2023-05-26 0 0 0 0 0 0 0 0 0 0\n", - "103 2023-05-29 0 0 0 0 0 0 0 0 0 0\n", - "104 2023-05-30 0 0 0 0 0 0 0 0 0 0\n", - "105 2023-05-31 0 0 0 0 0 0 0 0 0 0\n", - "106 2023-06-01 0 0 0 0 0 0 0 0 0 0\n", - "107 2023-06-02 0 0 0 0 0 1 0 0 0 0\n", - "108 2023-06-05 0 0 0 0 0 0 0 0 0 0\n", - "109 2023-06-06 0 0 0 0 0 0 0 0 0 0\n", - "110 2023-06-07 0 0 0 0 0 0 0 0 0 0\n", - "111 2023-06-08 0 0 0 0 0 0 0 0 0 0\n", - "112 2023-06-09 0 0 0 0 0 0 0 0 0 0\n", - "113 2023-06-12 0 0 0 0 0 0 0 0 0 0\n", - "114 2023-06-13 0 0 0 0 0 0 0 0 0 0\n", - "115 2023-06-14 0 0 0 0 0 0 0 0 0 0\n", - "116 2023-06-15 0 0 0 0 0 0 0 0 0 0\n", - "117 2023-06-16 0 0 0 0 0 0 0 0 0 0\n", - "118 2023-06-19 0 0 0 0 0 0 0 0 0 0\n", - "119 2023-06-20 0 0 0 0 0 0 0 0 0 0\n", - "120 2023-06-21 0 0 0 0 0 0 0 0 0 0\n", - "121 2023-06-22 0 0 0 0 0 0 0 0 0 0\n", - "122 2023-06-23 0 0 0 0 0 0 0 0 0 0\n", - "123 2023-06-26 0 0 0 0 0 0 0 0 0 0\n", - "124 2023-06-27 0 0 0 0 0 0 0 0 0 0\n", - "125 2023-06-28 0 0 0 0 0 0 0 0 0 0\n", - "126 2023-06-29 0 0 0 0 0 0 0 0 0 0\n", - "127 2023-06-30 0 0 0 0 0 0 0 0 0 0\n", - "128 2023-07-03 0 0 0 0 0 0 0 0 0 1\n", - "129 2023-07-04 0 0 0 0 0 0 0 0 0 0\n", - "130 2023-07-05 0 0 0 0 0 0 0 0 0 0\n", - "131 2023-07-06 0 0 0 0 0 0 0 0 0 0\n", - "132 2023-07-07 0 0 0 0 0 0 0 0 0 0\n", - "133 2023-07-10 0 0 0 0 0 0 0 0 0 0\n", - "134 2023-07-11 0 0 0 0 0 0 0 0 0 0\n", - "135 2023-07-12 0 0 0 0 0 0 0 0 0 0\n", - "136 2023-07-13 0 0 0 0 0 0 0 0 0 0\n", - "137 2023-07-14 0 0 0 0 0 0 0 0 0 0\n", - "138 2023-07-17 0 0 0 0 0 0 0 0 0 0\n", - "139 2023-07-18 0 0 0 0 0 0 0 0 0 0\n", - "140 2023-07-19 0 0 0 0 0 0 0 0 0 0\n", - "141 2023-07-20 0 0 0 0 0 0 0 0 0 0\n", - "142 2023-07-21 0 0 0 0 0 0 0 0 0 0\n", - "143 2023-07-24 0 0 0 0 0 0 0 0 0 0\n", - "144 2023-07-25 0 0 0 0 0 0 0 0 0 0\n", - "145 2023-07-26 0 0 0 0 0 0 0 0 0 0\n", - "146 2023-07-27 0 0 0 0 0 0 0 0 0 0\n", - "147 2023-07-28 0 0 0 0 0 0 0 0 0 0\n", - "148 2023-07-31 0 0 0 0 0 0 0 0 0 0\n", - "149 2023-08-01 0 0 0 0 0 0 0 0 0 0\n", - "150 2023-08-02 0 0 0 0 0 0 0 0 0 0\n", - "151 2023-08-03 0 0 0 0 0 0 0 0 0 0\n", - "152 2023-08-04 0 0 0 0 0 0 0 0 0 0\n", - "153 2023-08-07 0 0 0 0 0 0 0 0 0 0\n", - "154 2023-08-08 0 0 0 0 0 0 0 0 0 0\n", - "155 2023-08-09 0 0 0 0 0 0 0 0 0 0\n", - "156 2023-08-10 0 0 0 0 0 0 0 0 0 0\n", - "157 2023-08-11 0 0 0 0 0 0 0 0 0 0\n", - "158 2023-08-14 0 0 0 0 0 0 0 0 0 0\n", - "159 2023-08-15 0 0 0 0 0 0 0 0 0 0\n", - "160 2023-08-16 0 0 0 0 0 0 0 0 0 0\n", - "161 2023-08-17 0 0 0 0 0 0 0 0 0 0\n", - "162 2023-08-18 0 0 0 0 0 0 0 0 0 0\n", - "163 2023-08-21 0 0 0 0 0 0 0 0 0 0\n", - "164 2023-08-22 0 0 0 0 0 0 0 0 0 0\n", - "165 2023-08-23 0 0 0 0 0 0 0 0 0 0\n", - "166 2023-08-24 0 0 0 0 0 0 0 0 0 0\n", - "167 2023-08-25 0 0 0 0 0 0 0 0 0 0\n", - "168 2023-08-28 0 0 0 0 0 0 0 0 0 0\n", - "169 2023-08-29 0 0 0 0 0 0 0 0 0 0\n", - "170 2023-08-30 0 0 0 0 0 0 0 0 0 0\n", - "171 2023-08-31 0 0 0 0 0 0 0 0 0 0\n", - "172 2023-09-01 0 0 0 0 0 0 0 0 0 0\n", - "173 2023-09-04 0 0 0 0 0 0 0 0 0 0\n", - "174 2023-09-05 0 0 0 0 0 0 0 0 0 0\n", - "175 2023-09-06 0 0 0 0 0 0 0 0 0 0\n", - "176 2023-09-07 0 0 0 0 0 0 0 0 0 0\n", - "177 2023-09-08 0 0 0 0 0 0 0 0 0 0\n", - "178 2023-09-11 0 0 -1 0 0 0 0 0 0 0\n", - "179 2023-09-12 0 0 0 0 0 0 0 0 0 0\n", - "180 2023-09-13 0 0 0 0 0 0 0 0 0 0\n", - "181 2023-09-14 0 0 0 0 0 0 0 0 0 0\n", - "182 2023-09-15 0 0 0 0 0 0 0 0 0 0\n", - "183 2023-09-18 0 0 0 0 0 0 0 0 0 0\n", - "184 2023-09-19 0 0 0 0 0 0 0 0 0 0\n", - "185 2023-09-20 0 0 0 0 0 0 0 0 0 0\n", - "186 2023-09-21 0 0 0 -1 0 0 0 0 0 0\n", - "187 2023-09-22 0 0 0 0 0 0 0 0 0 0\n", - "188 2023-09-25 0 0 0 0 0 0 0 0 0 0\n", - "189 2023-09-26 0 0 0 0 0 0 0 0 0 0\n", - "190 2023-09-27 0 0 0 0 -1 0 0 0 0 0\n", - "191 2023-09-28 0 0 0 0 0 0 0 0 0 0\n", - "192 2023-09-29 0 0 0 0 0 0 0 0 0 0\n", - "193 2023-10-02 0 0 0 0 0 0 0 0 0 0\n", - "194 2023-10-03 0 0 0 0 0 0 0 0 0 0\n", - "195 2023-10-04 0 0 0 0 0 0 0 0 0 0\n", - "196 2023-10-05 0 0 0 0 0 0 0 0 0 0\n", - "197 2023-10-06 0 0 0 0 0 0 0 0 0 0\n", - "198 2023-10-09 0 0 0 0 0 0 0 0 0 0\n", - "199 2023-10-10 0 0 0 0 0 0 0 0 0 0\n", - "200 2023-10-11 0 0 0 0 0 0 0 0 0 0\n", - "201 2023-10-12 0 0 0 0 0 0 0 0 0 0\n", - "202 2023-10-13 0 0 0 0 0 0 0 0 0 0\n", - "203 2023-10-16 0 0 0 0 0 0 0 0 0 0\n", - "204 2023-10-17 0 0 0 0 0 0 0 0 0 0\n", - "205 2023-10-18 0 0 0 0 0 0 0 0 0 0\n", - "206 2023-10-19 0 0 0 0 0 0 0 0 0 0\n", - "207 2023-10-20 0 0 0 0 1 0 0 0 0 0\n", - "208 2023-10-23 0 0 0 0 0 -1 0 0 0 0\n", - "209 2023-10-24 0 0 0 0 0 0 0 0 0 0\n", - "210 2023-10-25 0 0 0 0 0 0 0 0 0 0\n", - "211 2023-10-26 -1 0 0 0 0 0 -1 0 0 0\n", - "212 2023-10-27 0 0 0 0 0 0 0 0 0 0\n", - "213 2023-10-30 0 0 0 0 0 0 0 0 0 0\n", - "214 2023-10-31 0 0 0 0 0 0 0 0 0 0\n", - "215 2023-11-01 0 0 0 0 0 0 0 0 0 0\n", - "216 2023-11-02 0 0 0 0 0 0 0 0 0 0\n", - "217 2023-11-03 1 0 0 0 0 0 0 0 0 0\n", - "218 2023-11-06 0 0 0 0 0 0 0 0 0 0\n", - "219 2023-11-07 0 0 0 0 0 0 0 0 0 0\n", - "220 2023-11-08 0 1 0 0 0 0 0 0 0 0\n", - "221 2023-11-09 0 0 0 1 0 0 0 0 0 0\n", - "222 2023-11-10 0 0 0 0 0 0 0 0 0 0\n", - "223 2023-11-13 0 0 0 0 0 0 0 0 0 0\n", - "224 2023-11-14 0 0 0 0 0 0 1 0 0 0\n", - "225 2023-11-15 0 0 0 0 0 1 0 0 0 0\n", - "226 2023-11-16 0 0 0 0 0 0 0 0 0 0\n", - "227 2023-11-17 0 0 0 0 0 0 0 0 0 0\n", - "228 2023-11-20 0 0 0 0 0 0 0 0 0 0\n", - "229 2023-11-21 0 0 0 0 0 0 0 0 0 0\n", - "230 2023-11-22 0 0 0 0 0 0 0 0 0 0\n", - "231 2023-11-23 0 0 0 0 0 0 0 0 0 0\n", - "232 2023-11-24 0 0 1 0 0 0 0 0 0 0\n", - "233 2023-11-27 0 0 0 0 0 0 0 0 0 0\n", - "234 2023-11-28 0 0 0 0 0 0 0 0 0 0\n", - "235 2023-11-29 0 0 0 0 0 0 0 0 0 0\n", - "236 2023-11-30 0 0 0 0 0 0 0 0 0 0\n", - "237 2023-12-01 0 0 0 0 0 0 0 0 0 0\n", - "238 2023-12-04 0 0 0 0 0 0 0 0 0 0\n", - "239 2023-12-05 0 -1 0 0 0 0 0 0 0 0\n", - "240 2023-12-06 0 0 0 0 0 0 0 0 0 0\n", - "241 2023-12-07 0 0 0 0 0 0 0 0 0 0\n", - "242 2023-12-08 0 0 0 0 0 0 0 0 0 0\n", - "243 2023-12-11 0 0 0 0 0 0 0 0 0 0\n", - "244 2023-12-12 0 0 0 0 0 0 0 0 0 0\n", - "245 2023-12-13 0 0 0 0 0 0 0 0 0 0\n", - "246 2023-12-14 0 0 0 0 0 0 0 0 0 0\n", - "247 2023-12-15 0 0 0 0 0 0 0 0 0 0\n", - "248 2023-12-18 0 0 0 0 0 0 0 0 0 0\n", - "249 2023-12-19 0 0 0 0 0 0 0 0 0 0\n", - "250 2023-12-20 0 0 0 0 0 0 0 0 0 0\n", - "251 2023-12-21 0 0 0 0 0 0 0 0 0 0\n", - "252 2023-12-22 0 0 0 0 0 0 0 0 0 0\n", - "253 2023-12-25 0 0 0 0 0 0 0 0 0 0\n", - "254 2023-12-26 0 0 0 0 0 0 0 0 0 0\n", - "255 2023-12-27 0 0 0 0 0 0 0 0 0 0\n", - "256 2023-12-28 0 0 0 0 0 0 0 0 0 0\n", - "257 2023-12-29 -1 0 -1 -1 -1 -1 -1 -1 -1 -1" - ] - }, - "execution_count": 41, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.bars.signal_df" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'AAPL': 250,\n", - " 'SBUX': 250,\n", - " 'BA': 250,\n", - " 'AMD': 250,\n", - " 'NFLX': 250,\n", - " 'TSLA': 250,\n", - " 'AMZN': 250,\n", - " 'META': 250,\n", - " 'NVDA': 250,\n", - " 'COST': 250}" - ] - }, - "execution_count": 42, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "w_map = {x: w * 0.75 for x, w in weights.items()} ## 75% of the weights for each stock\n", - "evb_backtest.portfolio.weight_map = w_map\n", - "evb_backtest.portfolio.weight_map\n", - "evb_backtest.portfolio.risk_manager.OrderPicker.liquidity_threshold = 100\n", - "evb_backtest.portfolio.risk_manager.OrderPicker.lookback = 10\n", - "evb_backtest.portfolio.risk_manager.OrderPicker.data_availability_threshold = 0.5\n", - "evb_backtest.portfolio.order_settings = {'type': 'naked',\n", - " 'specifics': [{'direction': 'long',\n", - " 'rel_strike': .850,\n", - " 'dte': 270,\n", - " 'moneyness_width': 0.35},\n", - " {'direction': 'short',\n", - " 'rel_strike': .60,\n", - " 'dte': 270,\n", - " 'moneyness_width': 0.35}\n", - "],\n", - " 'name': 'vertical_spread'}\n", - "\n", - "# evb_backtest.portfolio.order_settings = {'type': 'naked',\n", - "# 'specifics': [{'direction': 'long',\n", - "# 'rel_strike': .750,\n", - "# 'dte': 210,\n", - "# 'moneyness_width': 0.5},\n", - "\n", - "# ],\n", - "# 'name': 'vertical_spread'}\n", - "\n", - "\n", - "evb_backtest.portfolio.max_contract_price = 2\n", - "evb_backtest.executor.commission_rate = 0.65/100\n", - "evb_backtest.executor.commission_rate\n", - "evb_backtest.executor.max_slippage_pct = 0.075\n", - "evb_backtest.portfolio.roll_map = 90\n", - "evb_backtest.portfolio.allocated_cash_map\n", - "evb_backtest.portfolio.max_contract_price\n", - "evb_backtest.portfolio.roll_map" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "19.0" - ] - }, - "execution_count": 43, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "signals_df = deepcopy(signals).set_index('Date')\n", - "signals_df[signals_df!=-1].sum().sum()" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Exception ignored When destroying _lsprof profiler:\n", - "Traceback (most recent call last):\n", - " File \"C:\\Users\\Zino\\AppData\\Local\\Temp\\ipykernel_23584\\2161208997.py\", line 6, in \n", - "RuntimeError: Cannot install a profile function while another profile function is being installed\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Not generating order because:MAX_PRICE_TOO_LOW at 2, adjusted to 2.4 SignalEvent type:LONG, symbol=SBUX, date:2023-01-04 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:SBUX20230104LONG \n", - "Processing event: SIGNAL\n", - "Buy Details\n", - "Position: {'long': ['BA20230915C230'], 'short': ['BA20230915C235'], 'trade_id': '&L:BA20230915C230&S:BA20230915C235', 'close': 1.6750000000000007}, Date: 2023-01-04, Signal: SignalEvent type:LONG, symbol=BA, date:2023-01-04 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:BA20230104LONG\n", - "Max Contract Price: 2, Cash at Hand: 3.9742181520308857\n", - "Cash at Hand 3.9742181520308857 Close 1.6750000000000007\n", - "Processing event: SIGNAL\n", - "Not generating order because:MAX_PRICE_TOO_LOW at 2.4, adjusted to 2.88 SignalEvent type:LONG, symbol=SBUX, date:2023-01-04 00:00:00, Order Settings=None,Max Contract Price:2.4 , signal_id:SBUX20230104LONG \n", - "Processing event: ORDER\n", - "Buy Order Position: {'long': ['BA20230915C230'], 'short': ['BA20230915C235'], 'trade_id': '&L:BA20230915C230&S:BA20230915C235', 'close': 1.6750000000000007} Price: 1.7664351068965845 Quantity: 2 Datetime: 2023-01-04 00:00:00\n", - "Processing event: SIGNAL\n", - "Buy Details\n", - "Position: {'long': ['SBUX20230915C105'], 'short': ['SBUX20230915C110'], 'trade_id': '&L:SBUX20230915C105&S:SBUX20230915C110', 'close': 2.4000000000000004}, Date: 2023-01-04, Signal: SignalEvent type:LONG, symbol=SBUX, date:2023-01-04 00:00:00, Order Settings=None,Max Contract Price:2.88 , signal_id:SBUX20230104LONG\n", - "Max Contract Price: 2.88, Cash at Hand: 17.586810294806195\n", - "Cash at Hand 17.586810294806195 Close 2.4000000000000004\n", - "Processing event: FILL\n", - "Processing event: ORDER\n", - "Buy Order Position: {'long': ['SBUX20230915C105'], 'short': ['SBUX20230915C110'], 'trade_id': '&L:SBUX20230915C105&S:SBUX20230915C110', 'close': 2.4000000000000004} Price: 2.575886948733456 Quantity: 6 Datetime: 2023-01-04 00:00:00\n", - "Processing event: FILL\n", - "Using If statement for last event\n", - "Event queue is empty, processed 9 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Processing event: ROLL\n", - "\n", - "Performing Roll Operation\n", - "\n", - "Rolling contract for SBUX at 2023-01-09 00:00:00\n", - "Processing event: ROLL\n", - "\n", - "Performing Roll Operation\n", - "\n", - "Rolling contract for BA at 2023-01-09 00:00:00\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Not generating order because:MAX_PRICE_TOO_LOW at 2, adjusted to 2.4 SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:SBUX20230104LONG \n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Not generating order because:MAX_PRICE_TOO_LOW SignalEvent type:LONG, symbol=BA, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:BA20230104LONG, performing resolve on reduced dte with intial max cash 2\n", - "Not generating order because:TOO_ILLIQUID SignalEvent type:LONG, symbol=BA, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:BA20230104LONG, adding new signal with adjusted dte. specifics: [{'direction': 'long', 'rel_strike': 0.85, 'dte': 210, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 210, 'moneyness_width': 0.35}]\n", - "Processing event: ORDER\n", - "Sell Order Position: {'long': ['SBUX20230915C105'], 'short': ['SBUX20230915C110'], 'trade_id': '&L:SBUX20230915C105&S:SBUX20230915C110', 'close': 2.400000000000002} Price: 2.2898379156436337 Quantity: 6 Datetime: 2023-01-09 00:00:00\n", - "Processing event: SIGNAL\n", - "Not generating order because:MAX_PRICE_TOO_LOW at 2.4, adjusted to 2.88 SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:2.4 , signal_id:SBUX20230104LONG \n", - "Processing event: ORDER\n", - "Sell Order Position: {'long': ['BA20230915C230'], 'short': ['BA20230915C235'], 'trade_id': '&L:BA20230915C230&S:BA20230915C235', 'close': 2.0749999999999993} Price: 1.9728478199360735 Quantity: 2 Datetime: 2023-01-09 00:00:00\n", - "Processing event: SIGNAL\n", - "Not generating order because:MAX_PRICE_TOO_LOW SignalEvent type:LONG, symbol=BA, date:2023-01-09 00:00:00, Order Settings={'type': 'naked', 'specifics': [{'direction': 'long', 'rel_strike': 0.85, 'dte': 210, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 210, 'moneyness_width': 0.35}], 'name': 'vertical_spread'},Max Contract Price:None , signal_id:BA20230104LONG, performing resolve on reduced dte with intial max cash 2\n", - "Not generating order because:TOO_ILLIQUID SignalEvent type:LONG, symbol=BA, date:2023-01-09 00:00:00, Order Settings={'type': 'naked', 'specifics': [{'direction': 'long', 'rel_strike': 0.85, 'dte': 210, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 210, 'moneyness_width': 0.35}], 'name': 'vertical_spread'},Max Contract Price:None , signal_id:BA20230104LONG, adding new signal with adjusted dte. specifics: [{'direction': 'long', 'rel_strike': 0.85, 'dte': 150, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 150, 'moneyness_width': 0.35}]\n", - "Processing event: FILL\n", - "Processing event: SIGNAL\n", - "Not generating order because:MAX_PRICE_TOO_LOW at 2.88, adjusted to 3.456 SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:2.88 , signal_id:SBUX20230104LONG \n", - "Processing event: FILL\n", - "Processing event: SIGNAL\n", - "Buy Details\n", - "Position: {'long': ['BA20230616C215'], 'short': ['BA20230616C220'], 'trade_id': '&L:BA20230616C215&S:BA20230616C220', 'close': 2.0}, Date: 2023-01-09, Signal: SignalEvent type:LONG, symbol=BA, date:2023-01-09 00:00:00, Order Settings={'type': 'naked', 'specifics': [{'direction': 'long', 'rel_strike': 0.85, 'dte': 150, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 150, 'moneyness_width': 0.35}], 'name': 'vertical_spread'},Max Contract Price:None , signal_id:BA20230104LONG\n", - "Max Contract Price: 2, Cash at Hand: 4.298961035501966\n", - "Cash at Hand 4.298961035501966 Close 2.0\n", - "Processing event: SIGNAL\n", - "Not generating order because:MAX_PRICE_TOO_LOW at 3.456, adjusted to 4.1472 SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:3.456 , signal_id:SBUX20230104LONG \n", - "Processing event: ORDER\n", - "Buy Order Position: {'long': ['BA20230616C215'], 'short': ['BA20230616C220'], 'trade_id': '&L:BA20230616C215&S:BA20230616C220', 'close': 2.0} Price: 2.0791143984356895 Quantity: 2 Datetime: 2023-01-09 00:00:00\n", - "Processing event: SIGNAL\n", - "Buy Details\n", - "Position: {'long': ['SBUX20230915C110'], 'short': ['SBUX20230915C120'], 'trade_id': '&L:SBUX20230915C110&S:SBUX20230915C120', 'close': 3.6499999999999995}, Date: 2023-01-09, Signal: SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:4.1472 , signal_id:SBUX20230104LONG\n", - "Max Contract Price: 4.1472, Cash at Hand: 15.901745516121156\n", - "Cash at Hand 15.901745516121156 Close 3.6499999999999995\n", - "Processing event: FILL\n", - "Processing event: ORDER\n", - "Buy Order Position: {'long': ['SBUX20230915C110'], 'short': ['SBUX20230915C120'], 'trade_id': '&L:SBUX20230915C110&S:SBUX20230915C120', 'close': 3.6499999999999995} Price: 3.9080311018238167 Quantity: 4 Datetime: 2023-01-09 00:00:00\n", - "Processing event: FILL\n", - "Using If statement for last event\n", - "Processing event: ROLL\n", - "\n", - "Performing Roll Operation\n", - "\n", - "Rolling contract for SBUX at 2023-01-09 00:00:00\n", - "Processing event: ROLL\n", - "\n", - "Performing Roll Operation\n", - "\n", - "Rolling contract for BA at 2023-01-09 00:00:00\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Not generating order because:MAX_PRICE_TOO_LOW SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:SBUX20230104LONG, performing resolve on reduced dte with intial max cash 2\n", - "Not generating order because:TOO_ILLIQUID SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:SBUX20230104LONG, adding new signal with adjusted dte. specifics: [{'direction': 'long', 'rel_strike': 0.85, 'dte': 210, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 210, 'moneyness_width': 0.35}]\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Not generating order because:MAX_PRICE_TOO_LOW SignalEvent type:LONG, symbol=BA, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:BA20230104LONG, performing resolve on reduced dte with intial max cash 2\n", - "Not generating order because:TOO_ILLIQUID SignalEvent type:LONG, symbol=BA, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:BA20230104LONG, adding new signal with adjusted dte. specifics: [{'direction': 'long', 'rel_strike': 0.85, 'dte': 210, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 210, 'moneyness_width': 0.35}]\n", - "Processing event: ORDER\n", - "Sell Order Position: {'long': ['SBUX20230915C110'], 'short': ['SBUX20230915C120'], 'trade_id': '&L:SBUX20230915C110&S:SBUX20230915C120', 'close': 3.6499999999999995} Price: 3.508728285993157 Quantity: 4 Datetime: 2023-01-09 00:00:00\n", - "Processing event: SIGNAL\n", - "Not generating order because:TOO_ILLIQUID SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings={'type': 'naked', 'specifics': [{'direction': 'long', 'rel_strike': 0.85, 'dte': 210, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 210, 'moneyness_width': 0.35}], 'name': 'vertical_spread'},Max Contract Price:None , signal_id:SBUX20230104LONG, adding new signal with adjusted dte. specifics: [{'direction': 'long', 'rel_strike': 0.85, 'dte': 150, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 150, 'moneyness_width': 0.35}]\n", - "Processing event: ORDER\n", - "Sell Order Position: {'long': ['BA20230616C215'], 'short': ['BA20230616C220'], 'trade_id': '&L:BA20230616C215&S:BA20230616C220', 'close': 2.0} Price: 1.9339598850392392 Quantity: 2 Datetime: 2023-01-09 00:00:00\n", - "Processing event: SIGNAL\n", - "Not generating order because:MAX_PRICE_TOO_LOW SignalEvent type:LONG, symbol=BA, date:2023-01-09 00:00:00, Order Settings={'type': 'naked', 'specifics': [{'direction': 'long', 'rel_strike': 0.85, 'dte': 210, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 210, 'moneyness_width': 0.35}], 'name': 'vertical_spread'},Max Contract Price:None , signal_id:BA20230104LONG, performing resolve on reduced dte with intial max cash 2\n", - "Not generating order because:TOO_ILLIQUID SignalEvent type:LONG, symbol=BA, date:2023-01-09 00:00:00, Order Settings={'type': 'naked', 'specifics': [{'direction': 'long', 'rel_strike': 0.85, 'dte': 210, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 210, 'moneyness_width': 0.35}], 'name': 'vertical_spread'},Max Contract Price:None , signal_id:BA20230104LONG, adding new signal with adjusted dte. specifics: [{'direction': 'long', 'rel_strike': 0.85, 'dte': 150, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 150, 'moneyness_width': 0.35}]\n", - "Processing event: FILL\n", - "Processing event: SIGNAL\n", - "Buy Details\n", - "Position: {'long': ['SBUX20230616C110'], 'short': ['SBUX20230616C115'], 'trade_id': '&L:SBUX20230616C110&S:SBUX20230616C115', 'close': 1.9249999999999998}, Date: 2023-01-09, Signal: SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings={'type': 'naked', 'specifics': [{'direction': 'long', 'rel_strike': 0.85, 'dte': 150, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 150, 'moneyness_width': 0.35}], 'name': 'vertical_spread'},Max Contract Price:None , signal_id:SBUX20230104LONG\n", - "Max Contract Price: 2, Cash at Hand: 14.370655379130783\n", - "Cash at Hand 14.370655379130783 Close 1.9249999999999998\n", - "Processing event: FILL\n", - "Processing event: SIGNAL\n", - "Buy Details\n", - "Position: {'long': ['BA20230616C215'], 'short': ['BA20230616C220'], 'trade_id': '&L:BA20230616C215&S:BA20230616C220', 'close': 2.0}, Date: 2023-01-09, Signal: SignalEvent type:LONG, symbol=BA, date:2023-01-09 00:00:00, Order Settings={'type': 'naked', 'specifics': [{'direction': 'long', 'rel_strike': 0.85, 'dte': 150, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 150, 'moneyness_width': 0.35}], 'name': 'vertical_spread'},Max Contract Price:None , signal_id:BA20230104LONG\n", - "Max Contract Price: 2, Cash at Hand: 3.9908829113883564\n", - "Cash at Hand 3.9908829113883564 Close 2.0\n", - "Processing event: ORDER\n", - "Buy Order Position: {'long': ['SBUX20230616C110'], 'short': ['SBUX20230616C115'], 'trade_id': '&L:SBUX20230616C110&S:SBUX20230616C115', 'close': 1.9249999999999998} Price: 2.0595636915566637 Quantity: 6 Datetime: 2023-01-09 00:00:00\n", - "Processing event: ORDER\n", - "Buy Order Position: {'long': ['BA20230616C215'], 'short': ['BA20230616C220'], 'trade_id': '&L:BA20230616C215&S:BA20230616C220', 'close': 2.0} Price: 2.056928132274432 Quantity: 1 Datetime: 2023-01-09 00:00:00\n", - "Processing event: FILL\n", - "Processing event: FILL\n", - "Using If statement for last event\n", - "Processing event: ROLL\n", - "\n", - "Performing Roll Operation\n", - "\n", - "Rolling contract for SBUX at 2023-01-09 00:00:00\n", - "Processing event: ROLL\n", - "\n", - "Performing Roll Operation\n", - "\n", - "Rolling contract for BA at 2023-01-09 00:00:00\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Not generating order because:MAX_PRICE_TOO_LOW at 2, adjusted to 2.4 SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:SBUX20230104LONG \n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Buy Details\n", - "Position: {'long': ['BA20230915C235'], 'short': ['BA20230915C240'], 'trade_id': '&L:BA20230915C235&S:BA20230915C240', 'close': 1.6750000000000043}, Date: 2023-01-09, Signal: SignalEvent type:LONG, symbol=BA, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:BA20230104LONG\n", - "Max Contract Price: 2, Cash at Hand: 2.1279475923413678\n", - "Cash at Hand 2.1279475923413678 Close 1.6750000000000043\n", - "Processing event: ORDER\n", - "Sell Order Position: {'long': ['SBUX20230616C110'], 'short': ['SBUX20230616C115'], 'trade_id': '&L:SBUX20230616C110&S:SBUX20230616C115', 'close': 1.9249999999999998} Price: 1.8543306311343415 Quantity: 6 Datetime: 2023-01-09 00:00:00\n", - "Processing event: SIGNAL\n", - "Not generating order because:MAX_PRICE_TOO_LOW at 2.4, adjusted to 2.88 SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:2.4 , signal_id:SBUX20230104LONG \n", - "Processing event: ORDER\n", - "Sell Order Position: {'long': ['BA20230616C215'], 'short': ['BA20230616C220'], 'trade_id': '&L:BA20230616C215&S:BA20230616C220', 'close': 2.0} Price: 1.9340649081406736 Quantity: 1 Datetime: 2023-01-09 00:00:00\n", - "Processing event: ORDER\n", - "Buy Order Position: {'long': ['BA20230915C235'], 'short': ['BA20230915C240'], 'trade_id': '&L:BA20230915C235&S:BA20230915C240', 'close': 1.6750000000000043} Price: 1.7092100954082496 Quantity: 1 Datetime: 2023-01-09 00:00:00\n", - "Processing event: FILL\n", - "Processing event: SIGNAL\n", - "Not generating order because:MAX_PRICE_TOO_LOW at 2.88, adjusted to 3.456 SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:2.88 , signal_id:SBUX20230104LONG \n", - "Processing event: FILL\n", - "Processing event: FILL\n", - "Processing event: SIGNAL\n", - "Not generating order because:MAX_PRICE_TOO_LOW at 3.456, adjusted to 4.1472 SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:3.456 , signal_id:SBUX20230104LONG \n", - "Processing event: SIGNAL\n", - "Buy Details\n", - "Position: {'long': ['SBUX20230915C110'], 'short': ['SBUX20230915C120'], 'trade_id': '&L:SBUX20230915C110&S:SBUX20230915C120', 'close': 3.6499999999999995}, Date: 2023-01-09, Signal: SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:4.1472 , signal_id:SBUX20230104LONG\n", - "Max Contract Price: 4.1472, Cash at Hand: 13.121996852850243\n", - "Cash at Hand 13.121996852850243 Close 3.6499999999999995\n", - "Processing event: ORDER\n", - "Buy Order Position: {'long': ['SBUX20230915C110'], 'short': ['SBUX20230915C120'], 'trade_id': '&L:SBUX20230915C110&S:SBUX20230915C120', 'close': 3.6499999999999995} Price: 3.8001326882987394 Quantity: 3 Datetime: 2023-01-09 00:00:00\n", - "Processing event: FILL\n", - "Using If statement for last event\n", - "Processing event: ROLL\n", - "\n", - "Performing Roll Operation\n", - "\n", - "Rolling contract for SBUX at 2023-01-09 00:00:00\n", - "Processing event: ROLL\n", - "\n", - "Performing Roll Operation\n", - "\n", - "Rolling contract for BA at 2023-01-09 00:00:00\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Not generating order because:MAX_PRICE_TOO_LOW at 2, adjusted to 2.4 SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:SBUX20230104LONG \n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Buy Details\n", - "Position: {'long': ['BA20230915C235'], 'short': ['BA20230915C240'], 'trade_id': '&L:BA20230915C235&S:BA20230915C240', 'close': 1.6750000000000043}, Date: 2023-01-09, Signal: SignalEvent type:LONG, symbol=BA, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:BA20230104LONG\n", - "Max Contract Price: 2, Cash at Hand: 2.3069169238005496\n", - "Cash at Hand 2.3069169238005496 Close 1.6750000000000043\n", - "Processing event: ORDER\n", - "Sell Order Position: {'long': ['SBUX20230915C110'], 'short': ['SBUX20230915C120'], 'trade_id': '&L:SBUX20230915C110&S:SBUX20230915C120', 'close': 3.6499999999999995} Price: 3.536290244316696 Quantity: 3 Datetime: 2023-01-09 00:00:00\n", - "Processing event: SIGNAL\n", - "Not generating order because:MAX_PRICE_TOO_LOW at 2.4, adjusted to 2.88 SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:2.4 , signal_id:SBUX20230104LONG \n", - "Processing event: ORDER\n", - "Sell Order Position: {'long': ['BA20230915C235'], 'short': ['BA20230915C240'], 'trade_id': '&L:BA20230915C235&S:BA20230915C240', 'close': 1.6750000000000043} Price: 1.623508805483435 Quantity: 1 Datetime: 2023-01-09 00:00:00\n", - "Processing event: ORDER\n", - "Buy Order Position: {'long': ['BA20230915C235'], 'short': ['BA20230915C240'], 'trade_id': '&L:BA20230915C235&S:BA20230915C240', 'close': 1.6750000000000043} Price: 1.7828170483006909 Quantity: 1 Datetime: 2023-01-09 00:00:00\n", - "Processing event: FILL\n", - "Processing event: SIGNAL\n", - "Not generating order because:MAX_PRICE_TOO_LOW at 2.88, adjusted to 3.456 SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:2.88 , signal_id:SBUX20230104LONG \n", - "Processing event: FILL\n", - "Processing event: FILL\n", - "Processing event: SIGNAL\n", - "Not generating order because:MAX_PRICE_TOO_LOW at 3.456, adjusted to 4.1472 SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:3.456 , signal_id:SBUX20230104LONG \n", - "Processing event: SIGNAL\n", - "Buy Details\n", - "Position: {'long': ['SBUX20230915C110'], 'short': ['SBUX20230915C120'], 'trade_id': '&L:SBUX20230915C110&S:SBUX20230915C120', 'close': 3.6499999999999995}, Date: 2023-01-09, Signal: SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:4.1472 , signal_id:SBUX20230104LONG\n", - "Max Contract Price: 4.1472, Cash at Hand: 12.339422254098727\n", - "Cash at Hand 12.339422254098727 Close 3.6499999999999995\n", - "Processing event: ORDER\n", - "Buy Order Position: {'long': ['SBUX20230915C110'], 'short': ['SBUX20230915C120'], 'trade_id': '&L:SBUX20230915C110&S:SBUX20230915C120', 'close': 3.6499999999999995} Price: 3.7960015225185635 Quantity: 3 Datetime: 2023-01-09 00:00:00\n", - "Processing event: FILL\n", - "Using If statement for last event\n", - "Processing event: ROLL\n", - "\n", - "Performing Roll Operation\n", - "\n", - "Rolling contract for SBUX at 2023-01-09 00:00:00\n", - "Processing event: ROLL\n", - "\n", - "Performing Roll Operation\n", - "\n", - "Rolling contract for BA at 2023-01-09 00:00:00\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Not generating order because:MAX_PRICE_TOO_LOW SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:SBUX20230104LONG, performing resolve on reduced dte with intial max cash 2\n", - "Not generating order because:TOO_ILLIQUID SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:SBUX20230104LONG, adding new signal with adjusted dte. specifics: [{'direction': 'long', 'rel_strike': 0.85, 'dte': 210, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 210, 'moneyness_width': 0.35}]\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Buy Details\n", - "Position: {'long': ['BA20230915C235'], 'short': ['BA20230915C240'], 'trade_id': '&L:BA20230915C235&S:BA20230915C240', 'close': 1.6750000000000043}, Date: 2023-01-09, Signal: SignalEvent type:LONG, symbol=BA, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:BA20230104LONG\n", - "Max Contract Price: 2, Cash at Hand: 2.1401395052650196\n", - "Cash at Hand 2.1401395052650196 Close 1.6750000000000043\n", - "Processing event: ORDER\n", - "Sell Order Position: {'long': ['SBUX20230915C110'], 'short': ['SBUX20230915C120'], 'trade_id': '&L:SBUX20230915C110&S:SBUX20230915C120', 'close': 3.6499999999999995} Price: 3.4645922392262976 Quantity: 3 Datetime: 2023-01-09 00:00:00\n", - "Processing event: SIGNAL\n", - "Not generating order because:TOO_ILLIQUID SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings={'type': 'naked', 'specifics': [{'direction': 'long', 'rel_strike': 0.85, 'dte': 210, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 210, 'moneyness_width': 0.35}], 'name': 'vertical_spread'},Max Contract Price:None , signal_id:SBUX20230104LONG, adding new signal with adjusted dte. specifics: [{'direction': 'long', 'rel_strike': 0.85, 'dte': 150, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 150, 'moneyness_width': 0.35}]\n", - "Processing event: ORDER\n", - "Sell Order Position: {'long': ['BA20230915C235'], 'short': ['BA20230915C240'], 'trade_id': '&L:BA20230915C235&S:BA20230915C240', 'close': 1.6750000000000043} Price: 1.6095314819344975 Quantity: 1 Datetime: 2023-01-09 00:00:00\n", - "Processing event: ORDER\n", - "Buy Order Position: {'long': ['BA20230915C235'], 'short': ['BA20230915C240'], 'trade_id': '&L:BA20230915C235&S:BA20230915C240', 'close': 1.6750000000000043} Price: 1.7487217601047467 Quantity: 1 Datetime: 2023-01-09 00:00:00\n", - "Processing event: FILL\n", - "Processing event: SIGNAL\n", - "Buy Details\n", - "Position: {'long': ['SBUX20230616C110'], 'short': ['SBUX20230616C115'], 'trade_id': '&L:SBUX20230616C110&S:SBUX20230616C115', 'close': 1.9249999999999998}, Date: 2023-01-09, Signal: SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings={'type': 'naked', 'specifics': [{'direction': 'long', 'rel_strike': 0.85, 'dte': 150, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 150, 'moneyness_width': 0.35}], 'name': 'vertical_spread'},Max Contract Price:None , signal_id:SBUX20230104LONG\n", - "Max Contract Price: 2, Cash at Hand: 11.374417189209613\n", - "Cash at Hand 11.374417189209613 Close 1.9249999999999998\n", - "Processing event: FILL\n", - "Processing event: FILL\n", - "Processing event: ORDER\n", - "Buy Order Position: {'long': ['SBUX20230616C110'], 'short': ['SBUX20230616C115'], 'trade_id': '&L:SBUX20230616C110&S:SBUX20230616C115', 'close': 1.9249999999999998} Price: 2.0565865478526195 Quantity: 5 Datetime: 2023-01-09 00:00:00\n", - "Processing event: FILL\n", - "Using If statement for last event\n", - "Processing event: ROLL\n", - "\n", - "Performing Roll Operation\n", - "\n", - "Rolling contract for SBUX at 2023-01-09 00:00:00\n", - "Processing event: ROLL\n", - "\n", - "Performing Roll Operation\n", - "\n", - "Rolling contract for BA at 2023-01-09 00:00:00\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Not generating order because:MAX_PRICE_TOO_LOW SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:SBUX20230104LONG, performing resolve on reduced dte with intial max cash 2\n", - "Not generating order because:TOO_ILLIQUID SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:SBUX20230104LONG, adding new signal with adjusted dte. specifics: [{'direction': 'long', 'rel_strike': 0.85, 'dte': 210, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 210, 'moneyness_width': 0.35}]\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Buy Details\n", - "Position: {'long': ['BA20230915C235'], 'short': ['BA20230915C240'], 'trade_id': '&L:BA20230915C235&S:BA20230915C240', 'close': 1.6750000000000043}, Date: 2023-01-09, Signal: SignalEvent type:LONG, symbol=BA, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:BA20230104LONG\n", - "Max Contract Price: 1.9914682549117955, Cash at Hand: 1.9914682549117955\n", - "Cash at Hand 1.9914682549117955 Close 1.6750000000000043\n", - "Processing event: ORDER\n", - "Sell Order Position: {'long': ['SBUX20230616C110'], 'short': ['SBUX20230616C115'], 'trade_id': '&L:SBUX20230616C110&S:SBUX20230616C115', 'close': 1.9249999999999998} Price: 1.8161550512248843 Quantity: 5 Datetime: 2023-01-09 00:00:00\n", - "Processing event: SIGNAL\n", - "Not generating order because:TOO_ILLIQUID SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings={'type': 'naked', 'specifics': [{'direction': 'long', 'rel_strike': 0.85, 'dte': 210, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 210, 'moneyness_width': 0.35}], 'name': 'vertical_spread'},Max Contract Price:None , signal_id:SBUX20230104LONG, adding new signal with adjusted dte. specifics: [{'direction': 'long', 'rel_strike': 0.85, 'dte': 150, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 150, 'moneyness_width': 0.35}]\n", - "Processing event: ORDER\n", - "Sell Order Position: {'long': ['BA20230915C235'], 'short': ['BA20230915C240'], 'trade_id': '&L:BA20230915C235&S:BA20230915C240', 'close': 1.6750000000000043} Price: 1.6282434367986964 Quantity: 1 Datetime: 2023-01-09 00:00:00\n", - "Processing event: ORDER\n", - "Buy Order Position: {'long': ['BA20230915C235'], 'short': ['BA20230915C240'], 'trade_id': '&L:BA20230915C235&S:BA20230915C240', 'close': 1.6750000000000043} Price: 1.7263211660420583 Quantity: 1 Datetime: 2023-01-09 00:00:00\n", - "Processing event: FILL\n", - "Processing event: SIGNAL\n", - "Buy Details\n", - "Position: {'long': ['SBUX20230616C110'], 'short': ['SBUX20230616C115'], 'trade_id': '&L:SBUX20230616C110&S:SBUX20230616C115', 'close': 1.9249999999999998}, Date: 2023-01-09, Signal: SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings={'type': 'naked', 'specifics': [{'direction': 'long', 'rel_strike': 0.85, 'dte': 150, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 150, 'moneyness_width': 0.35}], 'name': 'vertical_spread'},Max Contract Price:None , signal_id:SBUX20230104LONG\n", - "Max Contract Price: 2, Cash at Hand: 10.175475454384804\n", - "Cash at Hand 10.175475454384804 Close 1.9249999999999998\n", - "Processing event: FILL\n", - "Processing event: FILL\n", - "Processing event: ORDER\n", - "Buy Order Position: {'long': ['SBUX20230616C110'], 'short': ['SBUX20230616C115'], 'trade_id': '&L:SBUX20230616C110&S:SBUX20230616C115', 'close': 1.9249999999999998} Price: 2.0387000332234195 Quantity: 4 Datetime: 2023-01-09 00:00:00\n", - "Processing event: FILL\n", - "Using If statement for last event\n", - "Processing event: ROLL\n", - "\n", - "Performing Roll Operation\n", - "\n", - "Rolling contract for SBUX at 2023-01-09 00:00:00\n", - "Processing event: ROLL\n", - "\n", - "Performing Roll Operation\n", - "\n", - "Rolling contract for BA at 2023-01-09 00:00:00\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Not generating order because:MAX_PRICE_TOO_LOW at 2, adjusted to 2.4 SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:SBUX20230104LONG \n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Buy Details\n", - "Position: {'long': ['BA20230915C235'], 'short': ['BA20230915C240'], 'trade_id': '&L:BA20230915C235&S:BA20230915C240', 'close': 1.6750000000000043}, Date: 2023-01-09, Signal: SignalEvent type:LONG, symbol=BA, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:BA20230104LONG\n", - "Max Contract Price: 1.8797982985927701, Cash at Hand: 1.8797982985927701\n", - "Cash at Hand 1.8797982985927701 Close 1.6750000000000043\n", - "Processing event: ORDER\n", - "Sell Order Position: {'long': ['SBUX20230616C110'], 'short': ['SBUX20230616C115'], 'trade_id': '&L:SBUX20230616C110&S:SBUX20230616C115', 'close': 1.9249999999999998} Price: 1.825239072698007 Quantity: 4 Datetime: 2023-01-09 00:00:00\n", - "Processing event: SIGNAL\n", - "Not generating order because:MAX_PRICE_TOO_LOW at 2.4, adjusted to 2.88 SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:2.4 , signal_id:SBUX20230104LONG \n", - "Processing event: ORDER\n", - "Sell Order Position: {'long': ['BA20230915C235'], 'short': ['BA20230915C240'], 'trade_id': '&L:BA20230915C235&S:BA20230915C240', 'close': 1.6750000000000043} Price: 1.6228700437178392 Quantity: 1 Datetime: 2023-01-09 00:00:00\n", - "Processing event: ORDER\n", - "Buy Order Position: {'long': ['BA20230915C235'], 'short': ['BA20230915C240'], 'trade_id': '&L:BA20230915C235&S:BA20230915C240', 'close': 1.6750000000000043} Price: 1.742173004779499 Quantity: 1 Datetime: 2023-01-09 00:00:00\n", - "Processing event: FILL\n", - "Processing event: SIGNAL\n", - "Not generating order because:MAX_PRICE_TOO_LOW at 2.88, adjusted to 3.456 SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:2.88 , signal_id:SBUX20230104LONG \n", - "Processing event: FILL\n", - "Processing event: FILL\n", - "Processing event: SIGNAL\n", - "Not generating order because:MAX_PRICE_TOO_LOW at 3.456, adjusted to 4.1472 SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:3.456 , signal_id:SBUX20230104LONG \n", - "Processing event: SIGNAL\n", - "Buy Details\n", - "Position: {'long': ['SBUX20230915C110'], 'short': ['SBUX20230915C120'], 'trade_id': '&L:SBUX20230915C110&S:SBUX20230915C120', 'close': 3.6499999999999995}, Date: 2023-01-09, Signal: SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:4.1472 , signal_id:SBUX20230104LONG\n", - "Max Contract Price: 4.1472, Cash at Hand: 9.31341599649332\n", - "Cash at Hand 9.31341599649332 Close 3.6499999999999995\n", - "Processing event: ORDER\n", - "Buy Order Position: {'long': ['SBUX20230915C110'], 'short': ['SBUX20230915C120'], 'trade_id': '&L:SBUX20230915C110&S:SBUX20230915C120', 'close': 3.6499999999999995} Price: 3.7353733326024483 Quantity: 2 Datetime: 2023-01-09 00:00:00\n", - "Processing event: FILL\n", - "Using If statement for last event\n", - "Processing event: ROLL\n", - "\n", - "Performing Roll Operation\n", - "\n", - "Rolling contract for SBUX at 2023-01-09 00:00:00\n", - "Processing event: ROLL\n", - "\n", - "Performing Roll Operation\n", - "\n", - "Rolling contract for BA at 2023-01-09 00:00:00\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Not generating order because:MAX_PRICE_TOO_LOW at 2, adjusted to 2.4 SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:SBUX20230104LONG \n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Buy Details\n", - "Position: {'long': ['BA20230915C235'], 'short': ['BA20230915C240'], 'trade_id': '&L:BA20230915C235&S:BA20230915C240', 'close': 1.6750000000000043}, Date: 2023-01-09, Signal: SignalEvent type:LONG, symbol=BA, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:BA20230104LONG\n", - "Max Contract Price: 1.7490256336372765, Cash at Hand: 1.7490256336372765\n", - "Cash at Hand 1.7490256336372765 Close 1.6750000000000043\n", - "Processing event: ORDER\n", - "Sell Order Position: {'long': ['SBUX20230915C110'], 'short': ['SBUX20230915C120'], 'trade_id': '&L:SBUX20230915C110&S:SBUX20230915C120', 'close': 3.6499999999999995} Price: 3.44024086373966 Quantity: 2 Datetime: 2023-01-09 00:00:00\n", - "Processing event: SIGNAL\n", - "Not generating order because:MAX_PRICE_TOO_LOW SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:2.4 , signal_id:SBUX20230104LONG, performing resolve on reduced dte with intial max cash 2\n", - "Not generating order because:TOO_ILLIQUID SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:SBUX20230104LONG, adding new signal with adjusted dte. specifics: [{'direction': 'long', 'rel_strike': 0.85, 'dte': 210, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 210, 'moneyness_width': 0.35}]\n", - "Processing event: ORDER\n", - "Sell Order Position: {'long': ['BA20230915C235'], 'short': ['BA20230915C240'], 'trade_id': '&L:BA20230915C235&S:BA20230915C240', 'close': 1.6750000000000043} Price: 1.58110868883209 Quantity: 1 Datetime: 2023-01-09 00:00:00\n", - "Processing event: ORDER\n", - "Buy Order Position: {'long': ['BA20230915C235'], 'short': ['BA20230915C240'], 'trade_id': '&L:BA20230915C235&S:BA20230915C240', 'close': 1.6750000000000043} Price: 1.7353336696351185 Quantity: 1 Datetime: 2023-01-09 00:00:00\n", - "Processing event: FILL\n", - "Processing event: SIGNAL\n", - "Not generating order because:TOO_ILLIQUID SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings={'type': 'naked', 'specifics': [{'direction': 'long', 'rel_strike': 0.85, 'dte': 210, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 210, 'moneyness_width': 0.35}], 'name': 'vertical_spread'},Max Contract Price:None , signal_id:SBUX20230104LONG, adding new signal with adjusted dte. specifics: [{'direction': 'long', 'rel_strike': 0.85, 'dte': 150, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 150, 'moneyness_width': 0.35}]\n", - "Processing event: FILL\n", - "Processing event: FILL\n", - "Processing event: SIGNAL\n", - "Buy Details\n", - "Position: {'long': ['SBUX20230616C110'], 'short': ['SBUX20230616C115'], 'trade_id': '&L:SBUX20230616C110&S:SBUX20230616C115', 'close': 1.9249999999999998}, Date: 2023-01-09, Signal: SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings={'type': 'naked', 'specifics': [{'direction': 'long', 'rel_strike': 0.85, 'dte': 150, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 150, 'moneyness_width': 0.35}], 'name': 'vertical_spread'},Max Contract Price:None , signal_id:SBUX20230104LONG\n", - "Max Contract Price: 2, Cash at Hand: 8.735377552540303\n", - "Cash at Hand 8.735377552540303 Close 1.9249999999999998\n", - "Processing event: ORDER\n", - "Buy Order Position: {'long': ['SBUX20230616C110'], 'short': ['SBUX20230616C115'], 'trade_id': '&L:SBUX20230616C110&S:SBUX20230616C115', 'close': 1.9249999999999998} Price: 2.027794446736828 Quantity: 4 Datetime: 2023-01-09 00:00:00\n", - "Processing event: FILL\n", - "Using If statement for last event\n", - "Processing event: ROLL\n", - "\n", - "Performing Roll Operation\n", - "\n", - "Rolling contract for SBUX at 2023-01-09 00:00:00\n", - "Processing event: ROLL\n", - "\n", - "Performing Roll Operation\n", - "\n", - "Rolling contract for BA at 2023-01-09 00:00:00\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Not generating order because:MAX_PRICE_TOO_LOW SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:SBUX20230104LONG, performing resolve on reduced dte with intial max cash 2\n", - "Not generating order because:TOO_ILLIQUID SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:SBUX20230104LONG, adding new signal with adjusted dte. specifics: [{'direction': 'long', 'rel_strike': 0.85, 'dte': 210, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 210, 'moneyness_width': 0.35}]\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Not generating order because:MAX_PRICE_TOO_LOW SignalEvent type:LONG, symbol=BA, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:BA20230104LONG, performing resolve on reduced dte with intial max cash 2\n", - "Not generating order because:TOO_ILLIQUID SignalEvent type:LONG, symbol=BA, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:BA20230104LONG, adding new signal with adjusted dte. specifics: [{'direction': 'long', 'rel_strike': 0.85, 'dte': 210, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 210, 'moneyness_width': 0.35}]\n", - "Processing event: ORDER\n", - "Sell Order Position: {'long': ['SBUX20230616C110'], 'short': ['SBUX20230616C115'], 'trade_id': '&L:SBUX20230616C110&S:SBUX20230616C115', 'close': 1.9249999999999998} Price: 1.8115547341475335 Quantity: 4 Datetime: 2023-01-09 00:00:00\n", - "Processing event: SIGNAL\n", - "Not generating order because:TOO_ILLIQUID SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings={'type': 'naked', 'specifics': [{'direction': 'long', 'rel_strike': 0.85, 'dte': 210, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 210, 'moneyness_width': 0.35}], 'name': 'vertical_spread'},Max Contract Price:None , signal_id:SBUX20230104LONG, adding new signal with adjusted dte. specifics: [{'direction': 'long', 'rel_strike': 0.85, 'dte': 150, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 150, 'moneyness_width': 0.35}]\n", - "Processing event: ORDER\n", - "Sell Order Position: {'long': ['BA20230915C235'], 'short': ['BA20230915C240'], 'trade_id': '&L:BA20230915C235&S:BA20230915C240', 'close': 1.6750000000000043} Price: 1.6108238550568688 Quantity: 1 Datetime: 2023-01-09 00:00:00\n", - "Processing event: SIGNAL\n", - "Not generating order because:MAX_PRICE_TOO_LOW SignalEvent type:LONG, symbol=BA, date:2023-01-09 00:00:00, Order Settings={'type': 'naked', 'specifics': [{'direction': 'long', 'rel_strike': 0.85, 'dte': 210, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 210, 'moneyness_width': 0.35}], 'name': 'vertical_spread'},Max Contract Price:None , signal_id:BA20230104LONG, performing resolve on reduced dte with intial max cash 2\n", - "Not generating order because:TOO_ILLIQUID SignalEvent type:LONG, symbol=BA, date:2023-01-09 00:00:00, Order Settings={'type': 'naked', 'specifics': [{'direction': 'long', 'rel_strike': 0.85, 'dte': 210, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 210, 'moneyness_width': 0.35}], 'name': 'vertical_spread'},Max Contract Price:None , signal_id:BA20230104LONG, adding new signal with adjusted dte. specifics: [{'direction': 'long', 'rel_strike': 0.85, 'dte': 150, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 150, 'moneyness_width': 0.35}]\n", - "Processing event: FILL\n", - "Processing event: SIGNAL\n", - "Buy Details\n", - "Position: {'long': ['SBUX20230616C110'], 'short': ['SBUX20230616C115'], 'trade_id': '&L:SBUX20230616C110&S:SBUX20230616C115', 'close': 1.9249999999999998}, Date: 2023-01-09, Signal: SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings={'type': 'naked', 'specifics': [{'direction': 'long', 'rel_strike': 0.85, 'dte': 150, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 150, 'moneyness_width': 0.35}], 'name': 'vertical_spread'},Max Contract Price:None , signal_id:SBUX20230104LONG\n", - "Max Contract Price: 2, Cash at Hand: 7.863314587218843\n", - "Cash at Hand 7.863314587218843 Close 1.9249999999999998\n", - "Processing event: FILL\n", - "Processing event: SIGNAL\n", - "Buy Details\n", - "Position: {'long': ['BA20230616C215'], 'short': ['BA20230616C220'], 'trade_id': '&L:BA20230616C215&S:BA20230616C220', 'close': 2.0}, Date: 2023-01-09, Signal: SignalEvent type:LONG, symbol=BA, date:2023-01-09 00:00:00, Order Settings={'type': 'naked', 'specifics': [{'direction': 'long', 'rel_strike': 0.85, 'dte': 150, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 150, 'moneyness_width': 0.35}], 'name': 'vertical_spread'},Max Contract Price:None , signal_id:BA20230104LONG\n", - "Max Contract Price: 2, Cash at Hand: 3.024864620465733\n", - "Cash at Hand 3.024864620465733 Close 2.0\n", - "Processing event: ORDER\n", - "Buy Order Position: {'long': ['SBUX20230616C110'], 'short': ['SBUX20230616C115'], 'trade_id': '&L:SBUX20230616C110&S:SBUX20230616C115', 'close': 1.9249999999999998} Price: 2.0120576134152977 Quantity: 3 Datetime: 2023-01-09 00:00:00\n", - "Processing event: ORDER\n", - "Buy Order Position: {'long': ['BA20230616C215'], 'short': ['BA20230616C220'], 'trade_id': '&L:BA20230616C215&S:BA20230616C220', 'close': 2.0} Price: 2.0498394258550388 Quantity: 1 Datetime: 2023-01-09 00:00:00\n", - "Processing event: FILL\n", - "Processing event: FILL\n", - "Using If statement for last event\n", - "Processing event: ROLL\n", - "\n", - "Performing Roll Operation\n", - "\n", - "Rolling contract for SBUX at 2023-01-09 00:00:00\n", - "Processing event: ROLL\n", - "\n", - "Performing Roll Operation\n", - "\n", - "Rolling contract for BA at 2023-01-09 00:00:00\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Not generating order because:MAX_PRICE_TOO_LOW at 2, adjusted to 2.4 SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:SBUX20230104LONG \n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Not generating order because:MAX_PRICE_TOO_LOW SignalEvent type:LONG, symbol=BA, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:BA20230104LONG, performing resolve on reduced dte with intial max cash 2\n", - "Not generating order because:TOO_ILLIQUID SignalEvent type:LONG, symbol=BA, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:BA20230104LONG, adding new signal with adjusted dte. specifics: [{'direction': 'long', 'rel_strike': 0.85, 'dte': 210, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 210, 'moneyness_width': 0.35}]\n", - "Processing event: ORDER\n", - "Sell Order Position: {'long': ['SBUX20230616C110'], 'short': ['SBUX20230616C115'], 'trade_id': '&L:SBUX20230616C110&S:SBUX20230616C115', 'close': 1.9249999999999998} Price: 1.8370149912997409 Quantity: 3 Datetime: 2023-01-09 00:00:00\n", - "Processing event: SIGNAL\n", - "Not generating order because:MAX_PRICE_TOO_LOW SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:2.4 , signal_id:SBUX20230104LONG, performing resolve on reduced dte with intial max cash 2\n", - "Not generating order because:TOO_ILLIQUID SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:SBUX20230104LONG, adding new signal with adjusted dte. specifics: [{'direction': 'long', 'rel_strike': 0.85, 'dte': 210, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 210, 'moneyness_width': 0.35}]\n", - "Processing event: ORDER\n", - "Sell Order Position: {'long': ['BA20230616C215'], 'short': ['BA20230616C220'], 'trade_id': '&L:BA20230616C215&S:BA20230616C220', 'close': 2.0} Price: 1.932667141764584 Quantity: 1 Datetime: 2023-01-09 00:00:00\n", - "Processing event: SIGNAL\n", - "Not generating order because:MAX_PRICE_TOO_LOW SignalEvent type:LONG, symbol=BA, date:2023-01-09 00:00:00, Order Settings={'type': 'naked', 'specifics': [{'direction': 'long', 'rel_strike': 0.85, 'dte': 210, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 210, 'moneyness_width': 0.35}], 'name': 'vertical_spread'},Max Contract Price:None , signal_id:BA20230104LONG, performing resolve on reduced dte with intial max cash 2\n", - "Not generating order because:TOO_ILLIQUID SignalEvent type:LONG, symbol=BA, date:2023-01-09 00:00:00, Order Settings={'type': 'naked', 'specifics': [{'direction': 'long', 'rel_strike': 0.85, 'dte': 210, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 210, 'moneyness_width': 0.35}], 'name': 'vertical_spread'},Max Contract Price:None , signal_id:BA20230104LONG, adding new signal with adjusted dte. specifics: [{'direction': 'long', 'rel_strike': 0.85, 'dte': 150, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 150, 'moneyness_width': 0.35}]\n", - "Processing event: FILL\n", - "Processing event: SIGNAL\n", - "Not generating order because:TOO_ILLIQUID SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings={'type': 'naked', 'specifics': [{'direction': 'long', 'rel_strike': 0.85, 'dte': 210, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 210, 'moneyness_width': 0.35}], 'name': 'vertical_spread'},Max Contract Price:None , signal_id:SBUX20230104LONG, adding new signal with adjusted dte. specifics: [{'direction': 'long', 'rel_strike': 0.85, 'dte': 150, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 150, 'moneyness_width': 0.35}]\n", - "Processing event: FILL\n", - "Processing event: SIGNAL\n", - "Buy Details\n", - "Position: {'long': ['BA20230616C215'], 'short': ['BA20230616C220'], 'trade_id': '&L:BA20230616C215&S:BA20230616C220', 'close': 2.0}, Date: 2023-01-09, Signal: SignalEvent type:LONG, symbol=BA, date:2023-01-09 00:00:00, Order Settings={'type': 'naked', 'specifics': [{'direction': 'long', 'rel_strike': 0.85, 'dte': 150, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 150, 'moneyness_width': 0.35}], 'name': 'vertical_spread'},Max Contract Price:None , signal_id:BA20230104LONG\n", - "Max Contract Price: 2, Cash at Hand: 2.896009564784324\n", - "Cash at Hand 2.896009564784324 Close 2.0\n", - "Processing event: SIGNAL\n", - "Buy Details\n", - "Position: {'long': ['SBUX20230616C110'], 'short': ['SBUX20230616C115'], 'trade_id': '&L:SBUX20230616C110&S:SBUX20230616C115', 'close': 1.9249999999999998}, Date: 2023-01-09, Signal: SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings={'type': 'naked', 'specifics': [{'direction': 'long', 'rel_strike': 0.85, 'dte': 150, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 150, 'moneyness_width': 0.35}], 'name': 'vertical_spread'},Max Contract Price:None , signal_id:SBUX20230104LONG\n", - "Max Contract Price: 2, Cash at Hand: 7.320499507506841\n", - "Cash at Hand 7.320499507506841 Close 1.9249999999999998\n", - "Processing event: ORDER\n", - "Buy Order Position: {'long': ['BA20230616C215'], 'short': ['BA20230616C220'], 'trade_id': '&L:BA20230616C215&S:BA20230616C220', 'close': 2.0} Price: 2.040376299782114 Quantity: 1 Datetime: 2023-01-09 00:00:00\n", - "Processing event: ORDER\n", - "Buy Order Position: {'long': ['SBUX20230616C110'], 'short': ['SBUX20230616C115'], 'trade_id': '&L:SBUX20230616C110&S:SBUX20230616C115', 'close': 1.9249999999999998} Price: 2.0277486382946273 Quantity: 3 Datetime: 2023-01-09 00:00:00\n", - "Processing event: FILL\n", - "Processing event: FILL\n", - "Using If statement for last event\n", - "Processing event: ROLL\n", - "\n", - "Performing Roll Operation\n", - "\n", - "Rolling contract for SBUX at 2023-01-09 00:00:00\n", - "Processing event: ROLL\n", - "\n", - "Performing Roll Operation\n", - "\n", - "Rolling contract for BA at 2023-01-09 00:00:00\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Not generating order because:MAX_PRICE_TOO_LOW SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:SBUX20230104LONG, performing resolve on reduced dte with intial max cash 2\n", - "Not generating order because:TOO_ILLIQUID SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:SBUX20230104LONG, adding new signal with adjusted dte. specifics: [{'direction': 'long', 'rel_strike': 0.85, 'dte': 210, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 210, 'moneyness_width': 0.35}]\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Not generating order because:MAX_PRICE_TOO_LOW SignalEvent type:LONG, symbol=BA, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:BA20230104LONG, performing resolve on reduced dte with intial max cash 2\n", - "Not generating order because:TOO_ILLIQUID SignalEvent type:LONG, symbol=BA, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:BA20230104LONG, adding new signal with adjusted dte. specifics: [{'direction': 'long', 'rel_strike': 0.85, 'dte': 210, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 210, 'moneyness_width': 0.35}]\n", - "Processing event: ORDER\n", - "Sell Order Position: {'long': ['SBUX20230616C110'], 'short': ['SBUX20230616C115'], 'trade_id': '&L:SBUX20230616C110&S:SBUX20230616C115', 'close': 1.9249999999999998} Price: 1.794414619324812 Quantity: 3 Datetime: 2023-01-09 00:00:00\n", - "Processing event: SIGNAL\n", - "Not generating order because:TOO_ILLIQUID SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings={'type': 'naked', 'specifics': [{'direction': 'long', 'rel_strike': 0.85, 'dte': 210, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 210, 'moneyness_width': 0.35}], 'name': 'vertical_spread'},Max Contract Price:None , signal_id:SBUX20230104LONG, adding new signal with adjusted dte. specifics: [{'direction': 'long', 'rel_strike': 0.85, 'dte': 150, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 150, 'moneyness_width': 0.35}]\n", - "Processing event: ORDER\n", - "Sell Order Position: {'long': ['BA20230616C215'], 'short': ['BA20230616C220'], 'trade_id': '&L:BA20230616C215&S:BA20230616C220', 'close': 2.0} Price: 1.939418996859549 Quantity: 1 Datetime: 2023-01-09 00:00:00\n", - "Processing event: SIGNAL\n", - "Not generating order because:MAX_PRICE_TOO_LOW SignalEvent type:LONG, symbol=BA, date:2023-01-09 00:00:00, Order Settings={'type': 'naked', 'specifics': [{'direction': 'long', 'rel_strike': 0.85, 'dte': 210, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 210, 'moneyness_width': 0.35}], 'name': 'vertical_spread'},Max Contract Price:None , signal_id:BA20230104LONG, performing resolve on reduced dte with intial max cash 2\n", - "Not generating order because:TOO_ILLIQUID SignalEvent type:LONG, symbol=BA, date:2023-01-09 00:00:00, Order Settings={'type': 'naked', 'specifics': [{'direction': 'long', 'rel_strike': 0.85, 'dte': 210, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 210, 'moneyness_width': 0.35}], 'name': 'vertical_spread'},Max Contract Price:None , signal_id:BA20230104LONG, adding new signal with adjusted dte. specifics: [{'direction': 'long', 'rel_strike': 0.85, 'dte': 150, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 150, 'moneyness_width': 0.35}]\n", - "Processing event: FILL\n", - "Processing event: SIGNAL\n", - "Buy Details\n", - "Position: {'long': ['SBUX20230616C110'], 'short': ['SBUX20230616C115'], 'trade_id': '&L:SBUX20230616C110&S:SBUX20230616C115', 'close': 1.9249999999999998}, Date: 2023-01-09, Signal: SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings={'type': 'naked', 'specifics': [{'direction': 'long', 'rel_strike': 0.85, 'dte': 150, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 150, 'moneyness_width': 0.35}], 'name': 'vertical_spread'},Max Contract Price:None , signal_id:SBUX20230104LONG\n", - "Max Contract Price: 2, Cash at Hand: 6.62029765628834\n", - "Cash at Hand 6.62029765628834 Close 1.9249999999999998\n", - "Processing event: FILL\n", - "Processing event: SIGNAL\n", - "Buy Details\n", - "Position: {'long': ['BA20230616C215'], 'short': ['BA20230616C220'], 'trade_id': '&L:BA20230616C215&S:BA20230616C220', 'close': 2.0}, Date: 2023-01-09, Signal: SignalEvent type:LONG, symbol=BA, date:2023-01-09 00:00:00, Order Settings={'type': 'naked', 'specifics': [{'direction': 'long', 'rel_strike': 0.85, 'dte': 150, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 150, 'moneyness_width': 0.35}], 'name': 'vertical_spread'},Max Contract Price:None , signal_id:BA20230104LONG\n", - "Max Contract Price: 2, Cash at Hand: 2.7817479921540156\n", - "Cash at Hand 2.7817479921540156 Close 2.0\n", - "Processing event: ORDER\n", - "Buy Order Position: {'long': ['SBUX20230616C110'], 'short': ['SBUX20230616C115'], 'trade_id': '&L:SBUX20230616C110&S:SBUX20230616C115', 'close': 1.9249999999999998} Price: 1.9960090447244367 Quantity: 3 Datetime: 2023-01-09 00:00:00\n", - "Processing event: ORDER\n", - "Buy Order Position: {'long': ['BA20230616C215'], 'short': ['BA20230616C220'], 'trade_id': '&L:BA20230616C215&S:BA20230616C220', 'close': 2.0} Price: 2.0516367193997525 Quantity: 1 Datetime: 2023-01-09 00:00:00\n", - "Processing event: FILL\n", - "Processing event: FILL\n", - "Using If statement for last event\n", - "Processing event: ROLL\n", - "\n", - "Performing Roll Operation\n", - "\n", - "Rolling contract for SBUX at 2023-01-09 00:00:00\n", - "Processing event: ROLL\n", - "\n", - "Performing Roll Operation\n", - "\n", - "Rolling contract for BA at 2023-01-09 00:00:00\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Not generating order because:MAX_PRICE_TOO_LOW SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:SBUX20230104LONG, performing resolve on reduced dte with intial max cash 2\n", - "Not generating order because:TOO_ILLIQUID SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:SBUX20230104LONG, adding new signal with adjusted dte. specifics: [{'direction': 'long', 'rel_strike': 0.85, 'dte': 210, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 210, 'moneyness_width': 0.35}]\n", - "Processing event: SIGNAL\n", - "Processing event: SIGNAL\n", - "Not generating order because:MAX_PRICE_TOO_LOW SignalEvent type:LONG, symbol=BA, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:BA20230104LONG, performing resolve on reduced dte with intial max cash 2\n", - "Not generating order because:TOO_ILLIQUID SignalEvent type:LONG, symbol=BA, date:2023-01-09 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:BA20230104LONG, adding new signal with adjusted dte. specifics: [{'direction': 'long', 'rel_strike': 0.85, 'dte': 210, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 210, 'moneyness_width': 0.35}]\n", - "Processing event: ORDER\n", - "Sell Order Position: {'long': ['SBUX20230616C110'], 'short': ['SBUX20230616C115'], 'trade_id': '&L:SBUX20230616C110&S:SBUX20230616C115', 'close': 1.9249999999999998} Price: 1.838429802239995 Quantity: 3 Datetime: 2023-01-09 00:00:00\n", - "Processing event: SIGNAL\n", - "Not generating order because:TOO_ILLIQUID SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings={'type': 'naked', 'specifics': [{'direction': 'long', 'rel_strike': 0.85, 'dte': 210, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 210, 'moneyness_width': 0.35}], 'name': 'vertical_spread'},Max Contract Price:None , signal_id:SBUX20230104LONG, adding new signal with adjusted dte. specifics: [{'direction': 'long', 'rel_strike': 0.85, 'dte': 150, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 150, 'moneyness_width': 0.35}]\n", - "Processing event: ORDER\n", - "Sell Order Position: {'long': ['BA20230616C215'], 'short': ['BA20230616C220'], 'trade_id': '&L:BA20230616C215&S:BA20230616C220', 'close': 2.0} Price: 1.8769787469426762 Quantity: 1 Datetime: 2023-01-09 00:00:00\n", - "Processing event: SIGNAL\n", - "Not generating order because:MAX_PRICE_TOO_LOW SignalEvent type:LONG, symbol=BA, date:2023-01-09 00:00:00, Order Settings={'type': 'naked', 'specifics': [{'direction': 'long', 'rel_strike': 0.85, 'dte': 210, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 210, 'moneyness_width': 0.35}], 'name': 'vertical_spread'},Max Contract Price:None , signal_id:BA20230104LONG, performing resolve on reduced dte with intial max cash 2\n", - "Not generating order because:TOO_ILLIQUID SignalEvent type:LONG, symbol=BA, date:2023-01-09 00:00:00, Order Settings={'type': 'naked', 'specifics': [{'direction': 'long', 'rel_strike': 0.85, 'dte': 210, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 210, 'moneyness_width': 0.35}], 'name': 'vertical_spread'},Max Contract Price:None , signal_id:BA20230104LONG, adding new signal with adjusted dte. specifics: [{'direction': 'long', 'rel_strike': 0.85, 'dte': 150, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 150, 'moneyness_width': 0.35}]\n", - "Processing event: FILL\n", - "Processing event: SIGNAL\n", - "Buy Details\n", - "Position: {'long': ['SBUX20230616C110'], 'short': ['SBUX20230616C115'], 'trade_id': '&L:SBUX20230616C110&S:SBUX20230616C115', 'close': 1.9249999999999998}, Date: 2023-01-09, Signal: SignalEvent type:LONG, symbol=SBUX, date:2023-01-09 00:00:00, Order Settings={'type': 'naked', 'specifics': [{'direction': 'long', 'rel_strike': 0.85, 'dte': 150, 'moneyness_width': 0.35}, {'direction': 'short', 'rel_strike': 0.6, 'dte': 150, 'moneyness_width': 0.35}], 'name': 'vertical_spread'},Max Contract Price:None , signal_id:SBUX20230104LONG\n", - "Max Contract Price: 2, Cash at Hand: 6.124633701580348\n", - "Cash at Hand 6.124633701580348 Close 1.9249999999999998\n", - "Processing event: FILL\n", - "Processing event: SIGNAL\n" - ] - }, - { - "ename": "KeyboardInterrupt", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", - "Cell \u001b[1;32mIn[44], line 9\u001b[0m\n\u001b[0;32m 6\u001b[0m profiler\u001b[38;5;241m.\u001b[39menable()\n\u001b[0;32m 7\u001b[0m \u001b[38;5;66;03m#run backtest\u001b[39;00m\n\u001b[1;32m----> 9\u001b[0m \u001b[43mevb_backtest\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 10\u001b[0m profiler\u001b[38;5;241m.\u001b[39mdisable()\n\u001b[0;32m 11\u001b[0m stream \u001b[38;5;241m=\u001b[39m io\u001b[38;5;241m.\u001b[39mStringIO()\n", - "File \u001b[1;32m~\\python-playground\\QuantTools\\EventDriven\\backtest.py:94\u001b[0m, in \u001b[0;36mOptionSignalBacktest.run\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 91\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mProcessing event: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mevent\u001b[38;5;241m.\u001b[39mtype\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 93\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m event\u001b[38;5;241m.\u001b[39mtype \u001b[38;5;241m==\u001b[39m EventTypes\u001b[38;5;241m.\u001b[39mSIGNAL\u001b[38;5;241m.\u001b[39mvalue:\n\u001b[1;32m---> 94\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mportfolio\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43manalyze_signal\u001b[49m\u001b[43m(\u001b[49m\u001b[43mevent\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 95\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m event\u001b[38;5;241m.\u001b[39mtype \u001b[38;5;241m==\u001b[39m EventTypes\u001b[38;5;241m.\u001b[39mORDER\u001b[38;5;241m.\u001b[39mvalue:\n\u001b[0;32m 96\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mexecutor\u001b[38;5;241m.\u001b[39mexecute_order_randomized_slippage(event)\n", - "File \u001b[1;32m~\\python-playground\\QuantTools\\EventDriven\\portfolio.py:489\u001b[0m, in \u001b[0;36mOptionSignalPortfolio.analyze_signal\u001b[1;34m(self, event)\u001b[0m\n\u001b[0;32m 483\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 484\u001b[0m \u001b[38;5;124;03mActs on a SignalEvent to generate new orders \u001b[39;00m\n\u001b[0;32m 485\u001b[0m \u001b[38;5;124;03mbased on the portfolio logic.\u001b[39;00m\n\u001b[0;32m 486\u001b[0m \u001b[38;5;124;03mthrows: AssertionError if event type is not 'SIGNAL'\u001b[39;00m\n\u001b[0;32m 487\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 488\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m event\u001b[38;5;241m.\u001b[39mtype \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mSIGNAL\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mExpected \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mSIGNAL\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m event type, got \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mevent\u001b[38;5;241m.\u001b[39mtype\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m--> 489\u001b[0m order_event \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgenerate_order\u001b[49m\u001b[43m(\u001b[49m\u001b[43mevent\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 490\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m order_event \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m 491\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mevents\u001b[38;5;241m.\u001b[39mput(order_event)\n", - "File \u001b[1;32m~\\python-playground\\QuantTools\\EventDriven\\portfolio.py:317\u001b[0m, in \u001b[0;36mOptionSignalPortfolio.generate_order\u001b[1;34m(self, signal)\u001b[0m\n\u001b[0;32m 314\u001b[0m order_type \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mMKT\u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[0;32m 316\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m signal_type \u001b[38;5;241m!=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mCLOSE\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[38;5;66;03m#generate order for LONG or SHORT\u001b[39;00m\n\u001b[1;32m--> 317\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcreate_order\u001b[49m\u001b[43m(\u001b[49m\u001b[43m \u001b[49m\u001b[43msignal\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43morder_type\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 318\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m signal_type \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mCLOSE\u001b[39m\u001b[38;5;124m'\u001b[39m:\n\u001b[0;32m 319\u001b[0m current_position \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcurrent_positions[symbol]\n", - "File \u001b[1;32m~\\python-playground\\QuantTools\\EventDriven\\portfolio.py:356\u001b[0m, in \u001b[0;36mOptionSignalPortfolio.create_order\u001b[1;34m(self, signal, position_type, order_type)\u001b[0m\n\u001b[0;32m 354\u001b[0m max_contract_price \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__max_contract_price[signal\u001b[38;5;241m.\u001b[39msymbol] \u001b[38;5;28;01mif\u001b[39;00m signal\u001b[38;5;241m.\u001b[39mmax_contract_price \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;28;01melse\u001b[39;00m signal\u001b[38;5;241m.\u001b[39mmax_contract_price\n\u001b[0;32m 355\u001b[0m max_contract_price \u001b[38;5;241m=\u001b[39m max_contract_price \u001b[38;5;28;01mif\u001b[39;00m max_contract_price \u001b[38;5;241m<\u001b[39m\u001b[38;5;241m=\u001b[39m cash_at_hand \u001b[38;5;28;01melse\u001b[39;00m cash_at_hand \n\u001b[1;32m--> 356\u001b[0m position_result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrisk_manager\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mOrderPicker\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_order\u001b[49m\u001b[43m(\u001b[49m\u001b[43msignal\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msymbol\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdate_str\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mposition_type\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmax_contract_price\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msignal\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43morder_settings\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43msignal\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43morder_settings\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mis\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mnot\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01melse\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_order_settings\u001b[49m\u001b[43m)\u001b[49m \n\u001b[0;32m 357\u001b[0m position \u001b[38;5;241m=\u001b[39m position_result[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mdata\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;28;01mif\u001b[39;00m position_result[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mdata\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m 358\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m position \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m :\n", - "File \u001b[1;32m~\\python-playground\\QuantTools\\trade\\helpers\\decorators.py:40\u001b[0m, in \u001b[0;36mlog_error_with_stack..decorator..wrapper\u001b[1;34m(*args, **kwargs)\u001b[0m\n\u001b[0;32m 37\u001b[0m \u001b[38;5;129m@wraps\u001b[39m(func)\n\u001b[0;32m 38\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mwrapper\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[0;32m 39\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m---> 40\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m func(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[0;32m 41\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[0;32m 42\u001b[0m stack \u001b[38;5;241m=\u001b[39m inspect\u001b[38;5;241m.\u001b[39mstack()\n", - "File \u001b[1;32m~\\python-playground\\QuantTools\\EventDriven\\riskmanager.py:526\u001b[0m, in \u001b[0;36mOrderPicker.get_order\u001b[1;34m(self, tick, date, right, max_close, order_settings)\u001b[0m\n\u001b[0;32m 522\u001b[0m order_cache[date][tick] \u001b[38;5;241m=\u001b[39m return_item\n\u001b[0;32m 523\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m return_item\n\u001b[1;32m--> 526\u001b[0m returned \u001b[38;5;241m=\u001b[39m \u001b[43mpopulate_cache\u001b[49m\u001b[43m(\u001b[49m\u001b[43morder_candidates\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdate\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdate\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 528\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m returned \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mholiday\u001b[39m\u001b[38;5;124m'\u001b[39m:\n\u001b[0;32m 529\u001b[0m return_item \u001b[38;5;241m=\u001b[39m {\n\u001b[0;32m 530\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mresult\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mIS_HOLIDAY\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[0;32m 531\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mdata\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m 532\u001b[0m }\n", - "File \u001b[1;32m~\\python-playground\\QuantTools\\trade\\helpers\\decorators.py:40\u001b[0m, in \u001b[0;36mlog_error_with_stack..decorator..wrapper\u001b[1;34m(*args, **kwargs)\u001b[0m\n\u001b[0;32m 37\u001b[0m \u001b[38;5;129m@wraps\u001b[39m(func)\n\u001b[0;32m 38\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mwrapper\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[0;32m 39\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m---> 40\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m func(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[0;32m 41\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[0;32m 42\u001b[0m stack \u001b[38;5;241m=\u001b[39m inspect\u001b[38;5;241m.\u001b[39mstack()\n", - "File \u001b[1;32m~\\python-playground\\QuantTools\\EventDriven\\riskmanager.py:136\u001b[0m, in \u001b[0;36mpopulate_cache\u001b[1;34m(order_candidates, date)\u001b[0m\n\u001b[0;32m 132\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m position, \u001b[38;5;28mvars\u001b[39m \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28menumerate\u001b[39m(tempholder2[i]):\n\u001b[0;32m 133\u001b[0m tickOrderedList[position]\u001b[38;5;241m.\u001b[39mextend(\u001b[38;5;28mvars\u001b[39m)\n\u001b[1;32m--> 136\u001b[0m eod_results \u001b[38;5;241m=\u001b[39m (\u001b[43mrunThreads\u001b[49m\u001b[43m(\u001b[49m\u001b[43mretrieve_eod_ohlc\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mOrderedList\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mmap\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m)\n\u001b[0;32m 137\u001b[0m oi_results \u001b[38;5;241m=\u001b[39m (runThreads(_retrieve_openInterest, OrderedList, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmap\u001b[39m\u001b[38;5;124m'\u001b[39m))\n\u001b[0;32m 138\u001b[0m tick_results \u001b[38;5;241m=\u001b[39m (runThreads(generate_option_tick_new, tickOrderedList, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmap\u001b[39m\u001b[38;5;124m'\u001b[39m))\n", - "File \u001b[1;32m~\\python-playground\\QuantTools\\trade\\helpers\\threads.py:27\u001b[0m, in \u001b[0;36mrunThreads\u001b[1;34m(func, OrderedInputs, run_type)\u001b[0m\n\u001b[0;32m 25\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m ThreadPoolExecutor(max_workers\u001b[38;5;241m=\u001b[39mnum_threads) \u001b[38;5;28;01mas\u001b[39;00m executor:\n\u001b[0;32m 26\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m run_type \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmap\u001b[39m\u001b[38;5;124m'\u001b[39m:\n\u001b[1;32m---> 27\u001b[0m results \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mlist\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mexecutor\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmap\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfunc\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mOrderedInputs\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 28\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 29\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mRun type \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mrun_type\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m not recognized\u001b[39m\u001b[38;5;124m'\u001b[39m)\n", - "File \u001b[1;32mC:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\\lib\\concurrent\\futures\\_base.py:621\u001b[0m, in \u001b[0;36mExecutor.map..result_iterator\u001b[1;34m()\u001b[0m\n\u001b[0;32m 618\u001b[0m \u001b[38;5;28;01mwhile\u001b[39;00m fs:\n\u001b[0;32m 619\u001b[0m \u001b[38;5;66;03m# Careful not to keep a reference to the popped future\u001b[39;00m\n\u001b[0;32m 620\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m timeout \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m--> 621\u001b[0m \u001b[38;5;28;01myield\u001b[39;00m \u001b[43m_result_or_cancel\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfs\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpop\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 622\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 623\u001b[0m \u001b[38;5;28;01myield\u001b[39;00m _result_or_cancel(fs\u001b[38;5;241m.\u001b[39mpop(), end_time \u001b[38;5;241m-\u001b[39m time\u001b[38;5;241m.\u001b[39mmonotonic())\n", - "File \u001b[1;32mC:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\\lib\\concurrent\\futures\\_base.py:319\u001b[0m, in \u001b[0;36m_result_or_cancel\u001b[1;34m(***failed resolving arguments***)\u001b[0m\n\u001b[0;32m 317\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m 318\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m--> 319\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfut\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mresult\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtimeout\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 320\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[0;32m 321\u001b[0m fut\u001b[38;5;241m.\u001b[39mcancel()\n", - "File \u001b[1;32mC:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\\lib\\concurrent\\futures\\_base.py:453\u001b[0m, in \u001b[0;36mFuture.result\u001b[1;34m(self, timeout)\u001b[0m\n\u001b[0;32m 450\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_state \u001b[38;5;241m==\u001b[39m FINISHED:\n\u001b[0;32m 451\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__get_result()\n\u001b[1;32m--> 453\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_condition\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mwait\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtimeout\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 455\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_state \u001b[38;5;129;01min\u001b[39;00m [CANCELLED, CANCELLED_AND_NOTIFIED]:\n\u001b[0;32m 456\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m CancelledError()\n", - "File \u001b[1;32mC:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\\lib\\threading.py:320\u001b[0m, in \u001b[0;36mCondition.wait\u001b[1;34m(self, timeout)\u001b[0m\n\u001b[0;32m 318\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m: \u001b[38;5;66;03m# restore state no matter what (e.g., KeyboardInterrupt)\u001b[39;00m\n\u001b[0;32m 319\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m timeout \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m--> 320\u001b[0m \u001b[43mwaiter\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43macquire\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 321\u001b[0m gotit \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m\n\u001b[0;32m 322\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n", - "\u001b[1;31mKeyboardInterrupt\u001b[0m: " - ] - } - ], - "source": [ - "import cProfile\n", - "import pstats\n", - "import io\n", - "\n", - "profiler = cProfile.Profile()\n", - "profiler.enable()\n", - "#run backtest\n", - "\n", - "evb_backtest.run()\n", - "profiler.disable()\n", - "stream = io.StringIO()\n", - "stats = pstats.Stats(profiler, stream=stream).sort_stats('cumulative')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
typesymbolsignal_typesignal_idorder_settingsorder_typequantitydirectionpositionexchangefill_costmarket_valueslippagecommission
datetime
2022-01-21SIGNALMSFTLONGMSFT20220121LONGNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2022-01-24SIGNALMSFTCLOSEMSFT20220124LONGNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2022-01-24SIGNALMSFTCLOSEMSFT20220121LONGNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2022-01-25SIGNALMSFTLONGMSFT20220125LONGNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2022-01-25SIGNALMSFTCLOSEMSFT20220125LONGNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2022-01-25SIGNALMSFTLONGMSFT20220121LONGNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2022-01-26SIGNALMSFTCLOSEMSFT20220121LONGNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2022-01-27SIGNALMSFTLONGMSFT20220121LONGNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2022-01-27SIGNALMSFTLONGMSFT20220127LONGNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2022-01-28SIGNALMSFTCLOSEMSFT20220121LONGNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2022-01-31SIGNALMSFTLONGMSFT20220121LONGNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2022-02-14SIGNALMSFTCLOSEMSFT20220214LONGNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2022-02-16SIGNALMSFTLONGMSFT20220216LONGNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2022-02-16SIGNALMSFTCLOSEMSFT20220216LONGNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2022-02-17SIGNALMSFTLONGMSFT20220217LONGNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2022-02-17SIGNALMSFTCLOSEMSFT20220217LONGNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2022-03-23SIGNALMSFTLONGMSFT20220323LONGNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2022-03-23SIGNALMSFTCLOSEMSFT20220323LONGNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
\n", - "
" - ], - "text/plain": [ - " type symbol signal_type signal_id order_settings \\\n", - "datetime \n", - "2022-01-21 SIGNAL MSFT LONG MSFT20220121LONG NaN \n", - "2022-01-24 SIGNAL MSFT CLOSE MSFT20220124LONG NaN \n", - "2022-01-24 SIGNAL MSFT CLOSE MSFT20220121LONG NaN \n", - "2022-01-25 SIGNAL MSFT LONG MSFT20220125LONG NaN \n", - "2022-01-25 SIGNAL MSFT CLOSE MSFT20220125LONG NaN \n", - "2022-01-25 SIGNAL MSFT LONG MSFT20220121LONG NaN \n", - "2022-01-26 SIGNAL MSFT CLOSE MSFT20220121LONG NaN \n", - "2022-01-27 SIGNAL MSFT LONG MSFT20220121LONG NaN \n", - "2022-01-27 SIGNAL MSFT LONG MSFT20220127LONG NaN \n", - "2022-01-28 SIGNAL MSFT CLOSE MSFT20220121LONG NaN \n", - "2022-01-31 SIGNAL MSFT LONG MSFT20220121LONG NaN \n", - "2022-02-14 SIGNAL MSFT CLOSE MSFT20220214LONG NaN \n", - "2022-02-16 SIGNAL MSFT LONG MSFT20220216LONG NaN \n", - "2022-02-16 SIGNAL MSFT CLOSE MSFT20220216LONG NaN \n", - "2022-02-17 SIGNAL MSFT LONG MSFT20220217LONG NaN \n", - "2022-02-17 SIGNAL MSFT CLOSE MSFT20220217LONG NaN \n", - "2022-03-23 SIGNAL MSFT LONG MSFT20220323LONG NaN \n", - "2022-03-23 SIGNAL MSFT CLOSE MSFT20220323LONG NaN \n", - "\n", - " order_type quantity direction position exchange fill_cost \\\n", - "datetime \n", - "2022-01-21 NaN NaN NaN NaN NaN NaN \n", - "2022-01-24 NaN NaN NaN NaN NaN NaN \n", - "2022-01-24 NaN NaN NaN NaN NaN NaN \n", - "2022-01-25 NaN NaN NaN NaN NaN NaN \n", - "2022-01-25 NaN NaN NaN NaN NaN NaN \n", - "2022-01-25 NaN NaN NaN NaN NaN NaN \n", - "2022-01-26 NaN NaN NaN NaN NaN NaN \n", - "2022-01-27 NaN NaN NaN NaN NaN NaN \n", - "2022-01-27 NaN NaN NaN NaN NaN NaN \n", - "2022-01-28 NaN NaN NaN NaN NaN NaN \n", - "2022-01-31 NaN NaN NaN NaN NaN NaN \n", - "2022-02-14 NaN NaN NaN NaN NaN NaN \n", - "2022-02-16 NaN NaN NaN NaN NaN NaN \n", - "2022-02-16 NaN NaN NaN NaN NaN NaN \n", - "2022-02-17 NaN NaN NaN NaN NaN NaN \n", - "2022-02-17 NaN NaN NaN NaN NaN NaN \n", - "2022-03-23 NaN NaN NaN NaN NaN NaN \n", - "2022-03-23 NaN NaN NaN NaN NaN NaN \n", - "\n", - " market_value slippage commission \n", - "datetime \n", - "2022-01-21 NaN NaN NaN \n", - "2022-01-24 NaN NaN NaN \n", - "2022-01-24 NaN NaN NaN \n", - "2022-01-25 NaN NaN NaN \n", - "2022-01-25 NaN NaN NaN \n", - "2022-01-25 NaN NaN NaN \n", - "2022-01-26 NaN NaN NaN \n", - "2022-01-27 NaN NaN NaN \n", - "2022-01-27 NaN NaN NaN \n", - "2022-01-28 NaN NaN NaN \n", - "2022-01-31 NaN NaN NaN \n", - "2022-02-14 NaN NaN NaN \n", - "2022-02-16 NaN NaN NaN \n", - "2022-02-16 NaN NaN NaN \n", - "2022-02-17 NaN NaN NaN \n", - "2022-02-17 NaN NaN NaN \n", - "2022-03-23 NaN NaN NaN \n", - "2022-03-23 NaN NaN NaN " - ] - }, - "execution_count": 178, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "events_df = evb_backtest.events.events\n", - "events_df = events_df[events_df['type'] == '']\n", - "events_df" - ] - }, - { - "cell_type": "code", - "execution_count": 179, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
TickerPnLReturnPctEntryPriceEntryCommissionEntrySlippageEntryMarketValueTotalEntryCostAuxilaryEntryCostExitPriceExitCommissionExitSlippageExitMarketValueTotalExitCostAuxilaryExitCostQuantityEntryTimeExitTimeDurationPositionsSignalID
0MSFT-176.144871-0.838824209.9902687.882.1416051252.14160512.59941689.941605180.6327897.8-78.4032661091.59673410.83796786.20326662022-01-212022-01-243&L:MSFT20220916C370&S:MSFT20220916C385MSFT20220121LONG
1MSFT-99.518767-0.471089211.2525346.554.7626721049.76267210.56262761.262672191.3487816.5-31.756094963.2439069.56743938.25609452022-01-252022-01-261&L:MSFT20220916C410&S:MSFT20220916C480MSFT20220121LONG
2MSFT-19.464357-0.141937137.1342411.39.334241135.8342411.37134210.634241117.6698851.3-7.530115118.9698851.1766998.83011512022-01-272022-01-281&L:MSFT20220916C395&S:MSFT20220916C410MSFT20220121LONG
\n", - "
" - ], - "text/plain": [ - " Ticker PnL ReturnPct EntryPrice EntryCommission EntrySlippage \\\n", - "0 MSFT -176.144871 -0.838824 209.990268 7.8 82.141605 \n", - "1 MSFT -99.518767 -0.471089 211.252534 6.5 54.762672 \n", - "2 MSFT -19.464357 -0.141937 137.134241 1.3 9.334241 \n", - "\n", - " EntryMarketValue TotalEntryCost AuxilaryEntryCost ExitPrice \\\n", - "0 1252.141605 12.599416 89.941605 180.632789 \n", - "1 1049.762672 10.562627 61.262672 191.348781 \n", - "2 135.834241 1.371342 10.634241 117.669885 \n", - "\n", - " ExitCommission ExitSlippage ExitMarketValue TotalExitCost \\\n", - "0 7.8 -78.403266 1091.596734 10.837967 \n", - "1 6.5 -31.756094 963.243906 9.567439 \n", - "2 1.3 -7.530115 118.969885 1.176699 \n", - "\n", - " AuxilaryExitCost Quantity EntryTime ExitTime Duration \\\n", - "0 86.203266 6 2022-01-21 2022-01-24 3 \n", - "1 38.256094 5 2022-01-25 2022-01-26 1 \n", - "2 8.830115 1 2022-01-27 2022-01-28 1 \n", - "\n", - " Positions SignalID \n", - "0 &L:MSFT20220916C370&S:MSFT20220916C385 MSFT20220121LONG \n", - "1 &L:MSFT20220916C410&S:MSFT20220916C480 MSFT20220121LONG \n", - "2 &L:MSFT20220916C395&S:MSFT20220916C410 MSFT20220121LONG " - ] - }, - "execution_count": 179, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.portfolio.trades" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
longshorttrade_idclosequantitymarket_value
datetimesymbol
2022-11-14BAC[BAC20230616C33][BAC20230616C40]&L:BAC20230616C33&S:BAC20230616C404.061406.0
2022-11-16BAC[BAC20230616C38][BAC20230616C60]&L:BAC20230616C38&S:BAC20230616C603.381338.0
\n", - "
" - ], - "text/plain": [ - " long short \\\n", - "datetime symbol \n", - "2022-11-14 BAC [BAC20230616C33] [BAC20230616C40] \n", - "2022-11-16 BAC [BAC20230616C38] [BAC20230616C60] \n", - "\n", - " trade_id close quantity \\\n", - "datetime symbol \n", - "2022-11-14 BAC &L:BAC20230616C33&S:BAC20230616C40 4.06 1 \n", - "2022-11-16 BAC &L:BAC20230616C38&S:BAC20230616C60 3.38 1 \n", - "\n", - " market_value \n", - "datetime symbol \n", - "2022-11-14 BAC 406.0 \n", - "2022-11-16 BAC 338.0 " - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.portfolio.get_all_positions()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'&L:BAC20221021C42&S:BAC20221021C50'\n", - "'&L:MSFT20220916C370&S:MSFT20220916C385'" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
OpenHighLowCloseVolumeBid_sizeCloseBidAsk_sizeCloseAskMidpointWeighted_midpoint
Datetime
2022-01-044.574.414.584.51-6446134.45-16744.504.4754.317283
2022-01-054.354.404.754.80-643654.20-1724.254.2254.195248
2022-01-06-3.70-3.83-3.37-3.83-9010374.403524.504.4504.421560
2022-01-075.004.725.004.86-1181424.70-304.804.7504.713734
2022-01-104.194.194.554.65-78-4334.65694.754.7004.726993
2022-01-11-4.27-4.36-4.25-4.35-453-6294.7520155.204.9755.034994
2022-01-124.604.524.754.74-68-8154.70-1014.754.7254.801264
2022-01-134.604.594.834.83-88-16414.65-13174.654.6504.695664
2022-01-144.704.404.454.25-98-6904.4012794.504.4504.488559
2022-01-184.404.364.084.03-220-83.95-8384.003.9753.995012
2022-01-193.183.184.173.70-42-8554.00-1274.154.0754.130409
2022-01-203.803.754.254.25-218023.8117543.873.8403.898290
2022-01-213.923.883.943.94-43-2363.66-2433.793.7253.617116
2022-01-243.343.312.963.31-113213.53-17983.543.5353.437751
2022-01-254.083.544.083.62-1564113.80-2893.863.8303.815335
2022-01-26-2.80-3.02-2.58-2.83-128-73.927984.234.0754.230505
2022-01-274.153.984.444.42-152833.801153.893.8453.848859
2022-01-28-2.47-2.64-2.38-2.63-10123873.5213484.093.8053.682347
2022-01-313.953.964.034.04-5031624.0518394.174.1104.186803
2022-02-01-2.81-2.98-2.81-2.98-1171924.27-5034.354.3104.318599
2022-02-02-2.90-2.95-2.75-2.95-33-3094.277504.324.2954.362588
2022-02-034.124.124.304.30-512054.11-5624.134.1204.092208
2022-02-04-3.10-3.85-3.05-3.85-20427094.10-3254.754.4254.274928
2022-02-074.454.454.704.45-396904.6514295.154.9004.981528
2022-02-08-4.00-4.50-4.00-4.20-10112744.85-11575.104.9754.841016
2022-02-09-4.33-4.45-4.20-4.25-3420134.905755.105.0004.895449
2022-02-105.205.104.894.89-145-13064.90-104.954.9255.042717
2022-02-114.754.755.205.20-133984.50-1914.604.5504.379863
2022-02-14-3.65-3.65-3.35-3.60-90-8294.40-6664.454.4254.502324
2022-02-15-3.50-3.55-3.50-3.55-3-13144.50-13764.504.5004.439718
2022-02-164.184.184.354.35-10-6744.25-17244.504.3754.250713
2022-02-174.054.054.404.40-1013983.99944.124.0554.043917
2022-02-18-2.92-2.92-2.70-2.74-197143.94204.033.9853.942233
2022-02-22-2.51-2.70-2.50-2.57-457003.8413.923.8803.840070
2022-02-233.663.663.563.566702613.63-9433.693.6603.524326
2022-02-243.203.222.913.2937456393.292303.303.2953.311361
2022-02-253.323.153.353.24-295393.687223.813.7453.831785
2022-02-283.583.433.343.20-14823073.41-763.533.4703.356455
2022-03-012.952.922.922.83945993.01-4583.033.0202.934793
2022-03-023.153.213.253.24-11124063.17-2953.223.1953.083118
2022-03-033.493.493.203.15-1511563.09-3553.083.0852.993304
2022-03-042.702.662.522.52709382.687482.742.7102.744454
2022-03-072.352.351.962.00-702-5552.037252.052.0402.110725
2022-03-082.002.352.022.1420613272.04-13982.082.0601.991548
2022-03-092.532.792.532.791261-4952.7210292.782.7502.815162
2022-03-102.952.882.592.59-95-2642.578422.622.5952.655119
2022-03-112.582.582.502.50-80182.513502.562.5352.576919
2022-03-143.102.922.752.75-61014902.73332.812.7702.726907
2022-03-152.632.832.712.85213152.816862.862.8352.933835
2022-03-163.153.403.003.26391316503.119583.233.1703.121545
2022-03-173.163.233.163.25-383693.18903.253.2153.193190
2022-03-182.882.882.972.97-391783.106363.203.1503.162459
2022-03-213.143.103.293.29-986753.109323.123.1103.170548
2022-03-223.223.553.413.49-16910643.5120913.673.5903.658761
2022-03-233.413.433.683.6913433.1615553.263.2103.263928
2022-03-243.273.253.213.21-5052233.1511373.213.1803.217698
2022-03-253.453.223.453.40-9310803.361533.433.3953.369481
2022-03-283.233.253.183.12-15-1163.342103.403.3703.406980
2022-03-293.223.223.273.3328-3193.3015643.313.3053.424965
2022-03-303.173.173.323.30-20710543.10163.173.1353.053242
2022-03-313.033.032.572.573194312.50-4092.602.5502.538175
2022-04-012.382.482.392.44-169-122.4126562.522.4652.533417
2022-04-042.392.392.192.4060-2852.318232.392.3502.440185
2022-04-052.132.102.182.18-65-6182.1092.192.1452.205106
2022-04-062.112.051.992.08-2291241.99-1332.102.0451.967310
2022-04-071.891.891.901.89-6181.84-19331.981.9101.837813
2022-04-082.042.001.991.997-741.97-11072.001.9851.929420
2022-04-112.672.752.612.62116-2361.95-52.021.9851.959428
2022-04-121.951.951.761.76208-31.85-15641.871.8601.820655
2022-04-131.701.651.731.72-247391.692011.731.7101.725463
2022-04-141.641.641.281.32189-1431.284491.331.3051.365634
2022-04-181.251.731.251.623601.60211.661.6301.647752
2022-04-191.801.861.921.760-11.78-1921.831.8051.792152
2022-04-201.911.971.911.91-20451.834131.851.8401.861822
2022-04-211.861.851.881.87-78-581.60-1561.661.6301.616659
2022-04-221.541.541.291.29872-2011.284651.341.3101.358069
2022-04-251.041.221.041.22-522-1551.22181.241.2301.251992
2022-04-261.321.321.071.092201.056071.091.0701.107626
2022-04-271.031.051.031.03-115340.966310.990.9750.996783
2022-04-280.991.060.991.06-469191.036891.081.0551.045141
2022-04-291.031.040.890.88734460.863820.960.9100.907359
2022-05-020.991.041.001.00300-5170.97-13641.010.9900.958870
2022-05-031.321.351.321.3312-16891.163381.251.2051.286895
2022-05-041.291.521.291.52-6715311.50-401.571.5351.463354
2022-05-051.181.221.191.23118-21991.292341.391.3401.425348
2022-05-061.201.351.111.3592-12791.30-24461.331.3151.287405
2022-05-091.131.131.111.111121.072481.121.0951.127118
2022-05-101.131.130.840.923900.92-1810.940.9300.916493
2022-05-110.940.970.981.001413330.89-240.920.9050.874479
2022-05-120.880.880.770.833413980.808460.880.8400.829460
2022-05-130.830.840.740.74-1600.7411260.790.7650.793873
2022-05-160.640.660.580.66-4110.61-1560.630.6200.616166
2022-05-170.800.800.760.83176-8820.78-19480.820.8000.747917
2022-05-180.800.810.700.70577190.59-20.630.6100.586837
2022-05-190.580.580.540.55-12140.53-8470.570.5500.568256
2022-05-200.520.520.420.4432970.42-4070.440.4300.409757
2022-05-230.560.870.560.8124611820.76-740.790.7750.735313
2022-05-240.710.790.690.797916480.7290.760.7400.715361
2022-05-250.760.750.710.71292260.72-130.810.7650.717816
2022-05-260.890.930.880.881024620.87-7120.920.8950.853402
2022-05-270.970.960.830.89-229500.87-17050.900.8850.850731
2022-05-310.890.970.870.95-751360.89-2370.960.9250.894068
2022-06-010.910.910.770.863800.8200.840.8300.830000
2022-06-020.780.820.780.81-6124810.80-1890.840.8200.787905
2022-06-030.720.720.700.7038730.70-1540.730.7150.688159
2022-06-060.790.830.730.744720.71410.710.7100.721940
2022-06-070.740.820.740.826190.70-40.720.7100.702959
2022-06-080.600.640.570.64159520.63330.660.6450.643065
2022-06-090.530.530.480.50-262990.446450.500.4700.482377
2022-06-100.350.360.290.3211-1160.33-280.300.3150.330739
2022-06-130.280.280.220.22-22890.23-1100.250.2400.231855
2022-06-140.260.260.170.171954460.17-270.180.1750.155655
2022-06-150.200.180.150.1645730.176780.180.1750.181294
2022-06-160.150.210.150.202261940.18-670.180.1800.167351
2022-06-170.170.220.160.187711630.17860.180.1750.155115
2022-06-210.150.200.170.199420.2000.200.2000.199778
2022-06-220.220.220.220.221501530.182180.190.1850.187467
2022-06-230.140.140.140.140270.18-9130.160.1700.147442
2022-06-240.140.130.130.13-1730.14-14610.150.1450.123661
2022-06-27-0.04-0.04-0.03-0.03-551580.1300.140.1350.129901
2022-06-280.170.160.130.13-624520.13-1370.140.1350.122553
2022-06-290.120.130.100.10994690.1121770.120.1150.120874
2022-06-300.100.100.100.10-991920.10-5940.080.0900.061176
2022-07-010.100.120.100.1292780.11-150.090.1000.080414
2022-07-05-0.02-0.02-0.02-0.02-43790.08-80.080.0800.073231
2022-07-060.100.100.100.103310.0818440.080.0800.079536
2022-07-070.100.100.100.1024210.10-200.090.0950.075254
2022-07-080.110.110.110.115018260.0624180.100.0800.082364
2022-07-110.080.080.070.081131500.08-1370.060.0700.050798
2022-07-120.060.060.060.06131570.06-740.070.0650.052086
2022-07-130.070.080.070.08752350.06500.060.0600.040417
2022-07-140.060.060.060.06100200.04-990.030.0350.026581
2022-07-150.080.080.090.09-23700.04-420.120.0800.010885
2022-07-180.110.150.070.07344-160.05-2530.060.0550.052926
2022-07-190.080.110.080.1110811690.08-1010.100.0900.072073
2022-07-200.090.090.080.08-38218450.097570.090.0900.070462
2022-07-210.090.090.090.092-170.09-780.090.0900.090528
2022-07-220.100.100.090.09231930.08-3640.070.0750.061313
2022-07-250.080.090.080.08-893390.09-1010.090.0900.074826
2022-07-260.100.100.100.1012540.07-1760.070.0700.064305
2022-07-270.080.080.080.0810960.07-3650.080.0750.072361
2022-07-28-0.02-0.02-0.02-0.02-103400.05-4660.060.0550.042295
2022-07-29-0.02-0.02-0.02-0.02-11600.062690.080.0700.075075
2022-08-010.050.050.040.05-311040.07-1610.070.0700.066543
2022-08-020.070.070.070.0736660.04600.050.0450.033839
2022-08-030.050.050.050.05-1165850.06-530.060.0600.050168
2022-08-04-0.01-0.03-0.01-0.03-141770.06240.060.0600.051611
2022-08-050.070.070.070.07-94520.08730.080.0800.071551
2022-08-080.000.000.000.0009470.0580.060.0550.040373
2022-08-09-0.01-0.01-0.01-0.01-29120.0780.080.0750.060345
2022-08-100.090.120.090.12191250.121120.120.1200.118264
2022-08-110.140.190.140.19454230.19-4270.200.1950.188064
2022-08-120.200.200.170.20551350.20-1130.210.2050.195556
2022-08-150.220.220.160.19410200.18-16290.170.1750.150271
2022-08-160.200.230.200.2179-780.2170.220.2150.217068
2022-08-170.180.190.170.1958550.18-3950.180.1800.174639
2022-08-180.180.180.150.155461580.15-8510.160.1550.133184
2022-08-190.130.130.120.1257180.12-14860.100.1100.099551
2022-08-220.070.100.070.09244200.0917690.080.0850.076567
2022-08-230.080.080.070.08232060.078810.070.0700.066823
2022-08-240.080.080.070.07797210.082430.070.0750.069484
2022-08-250.090.110.090.114129780.095140.090.0900.077299
2022-08-260.110.110.060.06412790.063420.050.0550.046255
2022-08-290.070.070.050.056192020.053070.040.0450.036181
2022-08-300.060.080.050.082104450.06-21710.040.0500.031744
2022-08-31-0.01-0.01-0.01-0.01-440480.051430.040.0450.037647
2022-09-010.050.050.050.05348680.04-2860.030.0350.022000
2022-09-020.060.060.060.0656513760.04-920.030.0350.011176
2022-09-060.040.040.040.0414150.043760.030.0350.029631
2022-09-070.040.040.030.03531140.03-570.020.0250.010952
2022-09-080.060.070.060.07245880.0600.050.0550.040249
2022-09-090.070.070.050.0532620.05-370.070.0600.041418
2022-09-120.070.070.060.066483510.053280.060.0550.049841
2022-09-130.040.040.040.041700.04990.040.0400.035882
2022-09-140.040.040.040.041011100.0370.040.0350.020337
2022-09-150.040.050.040.055316340.04140.040.0400.030231
2022-09-160.000.000.000.0008860.0340.030.0300.020188
2022-09-190.020.030.010.0160513410.03-1450.020.0250.010096
2022-09-200.030.040.030.0437550.021160.020.0200.016866
2022-09-210.030.030.020.0283120.02-210.010.0150.005862
2022-09-22-0.01-0.01-0.01-0.01-20100.01-23300.010.0100.009810
2022-09-230.010.020.010.016240.02500.010.0150.009690
2022-09-260.020.020.020.022310720.01-1520.000.005-0.009693
2022-09-270.020.030.020.034150.01-380.010.0100.005455
2022-09-280.020.020.020.027150.01-34030.000.005-0.000336
2022-09-290.010.010.000.0015360.01220.020.0150.015689
2022-09-300.010.020.010.022010.01-6430.000.005-0.000032
2022-10-030.010.020.010.023100.00-540.000.0000.000000
2022-10-040.010.020.010.012200.00-2740.000.0000.000000
2022-10-050.010.010.010.01300.00-240.010.0050.010000
2022-10-060.000.000.000.00000.00-40.010.0050.010000
2022-10-070.020.020.020.02100.00650.010.0050.010000
2022-10-100.020.020.020.021500.00100.000.0000.000000
2022-10-110.010.020.010.021000.00-610.010.0050.010000
2022-10-120.020.020.020.022800.0000.010.0050.010000
2022-10-130.010.020.010.011700.00-380.000.0000.000000
2022-10-140.010.020.010.01700.00-180.000.0000.000000
2022-10-170.010.010.010.0116800.00-2530.000.0000.000000
2022-10-180.020.020.010.0160100.00-19150.000.0000.000000
2022-10-19-0.01-0.01-0.01-0.01-400.00-18100.010.0050.010000
2022-10-200.000.000.000.00000.00-18500.000.0000.000000
2022-10-210.010.010.010.011600.00-17330.000.0000.000000
\n", - "
" - ], - "text/plain": [ - " Open High Low Close Volume Bid_size CloseBid Ask_size \\\n", - "Datetime \n", - "2022-01-04 4.57 4.41 4.58 4.51 -644 613 4.45 -1674 \n", - "2022-01-05 4.35 4.40 4.75 4.80 -64 365 4.20 -172 \n", - "2022-01-06 -3.70 -3.83 -3.37 -3.83 -90 1037 4.40 352 \n", - "2022-01-07 5.00 4.72 5.00 4.86 -118 142 4.70 -30 \n", - "2022-01-10 4.19 4.19 4.55 4.65 -78 -433 4.65 69 \n", - "2022-01-11 -4.27 -4.36 -4.25 -4.35 -453 -629 4.75 2015 \n", - "2022-01-12 4.60 4.52 4.75 4.74 -68 -815 4.70 -101 \n", - "2022-01-13 4.60 4.59 4.83 4.83 -88 -1641 4.65 -1317 \n", - "2022-01-14 4.70 4.40 4.45 4.25 -98 -690 4.40 1279 \n", - "2022-01-18 4.40 4.36 4.08 4.03 -220 -8 3.95 -838 \n", - "2022-01-19 3.18 3.18 4.17 3.70 -42 -855 4.00 -127 \n", - "2022-01-20 3.80 3.75 4.25 4.25 -21 802 3.81 1754 \n", - "2022-01-21 3.92 3.88 3.94 3.94 -43 -236 3.66 -243 \n", - "2022-01-24 3.34 3.31 2.96 3.31 -11 321 3.53 -1798 \n", - "2022-01-25 4.08 3.54 4.08 3.62 -156 411 3.80 -289 \n", - "2022-01-26 -2.80 -3.02 -2.58 -2.83 -128 -7 3.92 798 \n", - "2022-01-27 4.15 3.98 4.44 4.42 -15 283 3.80 115 \n", - "2022-01-28 -2.47 -2.64 -2.38 -2.63 -101 2387 3.52 1348 \n", - "2022-01-31 3.95 3.96 4.03 4.04 -503 162 4.05 1839 \n", - "2022-02-01 -2.81 -2.98 -2.81 -2.98 -117 192 4.27 -503 \n", - "2022-02-02 -2.90 -2.95 -2.75 -2.95 -33 -309 4.27 750 \n", - "2022-02-03 4.12 4.12 4.30 4.30 -51 205 4.11 -562 \n", - "2022-02-04 -3.10 -3.85 -3.05 -3.85 -204 2709 4.10 -325 \n", - "2022-02-07 4.45 4.45 4.70 4.45 -39 690 4.65 1429 \n", - "2022-02-08 -4.00 -4.50 -4.00 -4.20 -101 1274 4.85 -1157 \n", - "2022-02-09 -4.33 -4.45 -4.20 -4.25 -34 2013 4.90 575 \n", - "2022-02-10 5.20 5.10 4.89 4.89 -145 -1306 4.90 -10 \n", - "2022-02-11 4.75 4.75 5.20 5.20 -13 398 4.50 -191 \n", - "2022-02-14 -3.65 -3.65 -3.35 -3.60 -90 -829 4.40 -666 \n", - "2022-02-15 -3.50 -3.55 -3.50 -3.55 -3 -1314 4.50 -1376 \n", - "2022-02-16 4.18 4.18 4.35 4.35 -10 -674 4.25 -1724 \n", - "2022-02-17 4.05 4.05 4.40 4.40 -101 398 3.99 94 \n", - "2022-02-18 -2.92 -2.92 -2.70 -2.74 -19 714 3.94 20 \n", - "2022-02-22 -2.51 -2.70 -2.50 -2.57 -45 700 3.84 1 \n", - "2022-02-23 3.66 3.66 3.56 3.56 670 261 3.63 -943 \n", - "2022-02-24 3.20 3.22 2.91 3.29 3745 639 3.29 230 \n", - "2022-02-25 3.32 3.15 3.35 3.24 -295 39 3.68 722 \n", - "2022-02-28 3.58 3.43 3.34 3.20 -148 2307 3.41 -76 \n", - "2022-03-01 2.95 2.92 2.92 2.83 94 599 3.01 -458 \n", - "2022-03-02 3.15 3.21 3.25 3.24 -111 2406 3.17 -295 \n", - "2022-03-03 3.49 3.49 3.20 3.15 -15 1156 3.09 -355 \n", - "2022-03-04 2.70 2.66 2.52 2.52 70 938 2.68 748 \n", - "2022-03-07 2.35 2.35 1.96 2.00 -702 -555 2.03 725 \n", - "2022-03-08 2.00 2.35 2.02 2.14 206 1327 2.04 -1398 \n", - "2022-03-09 2.53 2.79 2.53 2.79 1261 -495 2.72 1029 \n", - "2022-03-10 2.95 2.88 2.59 2.59 -95 -264 2.57 842 \n", - "2022-03-11 2.58 2.58 2.50 2.50 -80 18 2.51 350 \n", - "2022-03-14 3.10 2.92 2.75 2.75 -610 1490 2.73 33 \n", - "2022-03-15 2.63 2.83 2.71 2.85 213 15 2.81 686 \n", - "2022-03-16 3.15 3.40 3.00 3.26 3913 1650 3.11 958 \n", - "2022-03-17 3.16 3.23 3.16 3.25 -38 369 3.18 90 \n", - "2022-03-18 2.88 2.88 2.97 2.97 -39 178 3.10 636 \n", - "2022-03-21 3.14 3.10 3.29 3.29 -98 675 3.10 932 \n", - "2022-03-22 3.22 3.55 3.41 3.49 -169 1064 3.51 2091 \n", - "2022-03-23 3.41 3.43 3.68 3.69 1 343 3.16 1555 \n", - "2022-03-24 3.27 3.25 3.21 3.21 -505 223 3.15 1137 \n", - "2022-03-25 3.45 3.22 3.45 3.40 -93 1080 3.36 153 \n", - "2022-03-28 3.23 3.25 3.18 3.12 -15 -116 3.34 210 \n", - "2022-03-29 3.22 3.22 3.27 3.33 28 -319 3.30 1564 \n", - "2022-03-30 3.17 3.17 3.32 3.30 -207 1054 3.10 16 \n", - "2022-03-31 3.03 3.03 2.57 2.57 319 431 2.50 -409 \n", - "2022-04-01 2.38 2.48 2.39 2.44 -169 -12 2.41 2656 \n", - "2022-04-04 2.39 2.39 2.19 2.40 60 -285 2.31 823 \n", - "2022-04-05 2.13 2.10 2.18 2.18 -65 -618 2.10 9 \n", - "2022-04-06 2.11 2.05 1.99 2.08 -229 124 1.99 -133 \n", - "2022-04-07 1.89 1.89 1.90 1.89 -6 18 1.84 -1933 \n", - "2022-04-08 2.04 2.00 1.99 1.99 7 -74 1.97 -1107 \n", - "2022-04-11 2.67 2.75 2.61 2.62 116 -236 1.95 -5 \n", - "2022-04-12 1.95 1.95 1.76 1.76 208 -3 1.85 -1564 \n", - "2022-04-13 1.70 1.65 1.73 1.72 -247 39 1.69 201 \n", - "2022-04-14 1.64 1.64 1.28 1.32 189 -143 1.28 449 \n", - "2022-04-18 1.25 1.73 1.25 1.62 36 0 1.60 21 \n", - "2022-04-19 1.80 1.86 1.92 1.76 0 -1 1.78 -192 \n", - "2022-04-20 1.91 1.97 1.91 1.91 -204 5 1.83 413 \n", - "2022-04-21 1.86 1.85 1.88 1.87 -78 -58 1.60 -156 \n", - "2022-04-22 1.54 1.54 1.29 1.29 872 -201 1.28 465 \n", - "2022-04-25 1.04 1.22 1.04 1.22 -522 -155 1.22 18 \n", - "2022-04-26 1.32 1.32 1.07 1.09 22 0 1.05 607 \n", - "2022-04-27 1.03 1.05 1.03 1.03 -115 34 0.96 631 \n", - "2022-04-28 0.99 1.06 0.99 1.06 -46 919 1.03 689 \n", - "2022-04-29 1.03 1.04 0.89 0.88 73 446 0.86 382 \n", - "2022-05-02 0.99 1.04 1.00 1.00 300 -517 0.97 -1364 \n", - "2022-05-03 1.32 1.35 1.32 1.33 12 -1689 1.16 338 \n", - "2022-05-04 1.29 1.52 1.29 1.52 -67 1531 1.50 -40 \n", - "2022-05-05 1.18 1.22 1.19 1.23 118 -2199 1.29 234 \n", - "2022-05-06 1.20 1.35 1.11 1.35 92 -1279 1.30 -2446 \n", - "2022-05-09 1.13 1.13 1.11 1.11 11 2 1.07 248 \n", - "2022-05-10 1.13 1.13 0.84 0.92 39 0 0.92 -181 \n", - "2022-05-11 0.94 0.97 0.98 1.00 14 1333 0.89 -24 \n", - "2022-05-12 0.88 0.88 0.77 0.83 34 1398 0.80 846 \n", - "2022-05-13 0.83 0.84 0.74 0.74 -16 0 0.74 1126 \n", - "2022-05-16 0.64 0.66 0.58 0.66 -4 11 0.61 -156 \n", - "2022-05-17 0.80 0.80 0.76 0.83 176 -882 0.78 -1948 \n", - "2022-05-18 0.80 0.81 0.70 0.70 57 719 0.59 -2 \n", - "2022-05-19 0.58 0.58 0.54 0.55 -12 14 0.53 -847 \n", - "2022-05-20 0.52 0.52 0.42 0.44 32 97 0.42 -407 \n", - "2022-05-23 0.56 0.87 0.56 0.81 246 1182 0.76 -74 \n", - "2022-05-24 0.71 0.79 0.69 0.79 79 1648 0.72 9 \n", - "2022-05-25 0.76 0.75 0.71 0.71 29 226 0.72 -13 \n", - "2022-05-26 0.89 0.93 0.88 0.88 10 2462 0.87 -712 \n", - "2022-05-27 0.97 0.96 0.83 0.89 -229 50 0.87 -1705 \n", - "2022-05-31 0.89 0.97 0.87 0.95 -75 136 0.89 -237 \n", - "2022-06-01 0.91 0.91 0.77 0.86 38 0 0.82 0 \n", - "2022-06-02 0.78 0.82 0.78 0.81 -61 2481 0.80 -189 \n", - "2022-06-03 0.72 0.72 0.70 0.70 38 73 0.70 -154 \n", - "2022-06-06 0.79 0.83 0.73 0.74 47 2 0.71 41 \n", - "2022-06-07 0.74 0.82 0.74 0.82 6 19 0.70 -4 \n", - "2022-06-08 0.60 0.64 0.57 0.64 159 52 0.63 33 \n", - "2022-06-09 0.53 0.53 0.48 0.50 -26 299 0.44 645 \n", - "2022-06-10 0.35 0.36 0.29 0.32 11 -116 0.33 -28 \n", - "2022-06-13 0.28 0.28 0.22 0.22 -228 9 0.23 -110 \n", - "2022-06-14 0.26 0.26 0.17 0.17 195 446 0.17 -27 \n", - "2022-06-15 0.20 0.18 0.15 0.16 457 3 0.17 678 \n", - "2022-06-16 0.15 0.21 0.15 0.20 226 194 0.18 -67 \n", - "2022-06-17 0.17 0.22 0.16 0.18 771 163 0.17 86 \n", - "2022-06-21 0.15 0.20 0.17 0.19 94 2 0.20 0 \n", - "2022-06-22 0.22 0.22 0.22 0.22 150 153 0.18 218 \n", - "2022-06-23 0.14 0.14 0.14 0.14 0 27 0.18 -913 \n", - "2022-06-24 0.14 0.13 0.13 0.13 -1 73 0.14 -1461 \n", - "2022-06-27 -0.04 -0.04 -0.03 -0.03 -55 158 0.13 0 \n", - "2022-06-28 0.17 0.16 0.13 0.13 -62 452 0.13 -137 \n", - "2022-06-29 0.12 0.13 0.10 0.10 99 469 0.11 2177 \n", - "2022-06-30 0.10 0.10 0.10 0.10 -99 192 0.10 -594 \n", - "2022-07-01 0.10 0.12 0.10 0.12 9 278 0.11 -15 \n", - "2022-07-05 -0.02 -0.02 -0.02 -0.02 -4 379 0.08 -8 \n", - "2022-07-06 0.10 0.10 0.10 0.10 3 31 0.08 1844 \n", - "2022-07-07 0.10 0.10 0.10 0.10 2 421 0.10 -20 \n", - "2022-07-08 0.11 0.11 0.11 0.11 50 1826 0.06 2418 \n", - "2022-07-11 0.08 0.08 0.07 0.08 113 150 0.08 -137 \n", - "2022-07-12 0.06 0.06 0.06 0.06 13 157 0.06 -74 \n", - "2022-07-13 0.07 0.08 0.07 0.08 75 235 0.06 50 \n", - "2022-07-14 0.06 0.06 0.06 0.06 100 20 0.04 -99 \n", - "2022-07-15 0.08 0.08 0.09 0.09 -2 370 0.04 -42 \n", - "2022-07-18 0.11 0.15 0.07 0.07 344 -16 0.05 -253 \n", - "2022-07-19 0.08 0.11 0.08 0.11 108 1169 0.08 -101 \n", - "2022-07-20 0.09 0.09 0.08 0.08 -382 1845 0.09 757 \n", - "2022-07-21 0.09 0.09 0.09 0.09 2 -17 0.09 -78 \n", - "2022-07-22 0.10 0.10 0.09 0.09 23 193 0.08 -364 \n", - "2022-07-25 0.08 0.09 0.08 0.08 -89 339 0.09 -101 \n", - "2022-07-26 0.10 0.10 0.10 0.10 12 54 0.07 -176 \n", - "2022-07-27 0.08 0.08 0.08 0.08 10 96 0.07 -365 \n", - "2022-07-28 -0.02 -0.02 -0.02 -0.02 -10 340 0.05 -466 \n", - "2022-07-29 -0.02 -0.02 -0.02 -0.02 -1 160 0.06 269 \n", - "2022-08-01 0.05 0.05 0.04 0.05 -31 104 0.07 -161 \n", - "2022-08-02 0.07 0.07 0.07 0.07 3 666 0.04 60 \n", - "2022-08-03 0.05 0.05 0.05 0.05 -116 585 0.06 -53 \n", - "2022-08-04 -0.01 -0.03 -0.01 -0.03 -14 177 0.06 24 \n", - "2022-08-05 0.07 0.07 0.07 0.07 -9 452 0.08 73 \n", - "2022-08-08 0.00 0.00 0.00 0.00 0 947 0.05 8 \n", - "2022-08-09 -0.01 -0.01 -0.01 -0.01 -2 912 0.07 8 \n", - "2022-08-10 0.09 0.12 0.09 0.12 191 25 0.12 112 \n", - "2022-08-11 0.14 0.19 0.14 0.19 454 23 0.19 -427 \n", - "2022-08-12 0.20 0.20 0.17 0.20 55 135 0.20 -113 \n", - "2022-08-15 0.22 0.22 0.16 0.19 4 1020 0.18 -1629 \n", - "2022-08-16 0.20 0.23 0.20 0.21 79 -78 0.21 7 \n", - "2022-08-17 0.18 0.19 0.17 0.19 585 5 0.18 -395 \n", - "2022-08-18 0.18 0.18 0.15 0.15 546 158 0.15 -851 \n", - "2022-08-19 0.13 0.13 0.12 0.12 57 18 0.12 -1486 \n", - "2022-08-22 0.07 0.10 0.07 0.09 24 420 0.09 1769 \n", - "2022-08-23 0.08 0.08 0.07 0.08 23 206 0.07 881 \n", - "2022-08-24 0.08 0.08 0.07 0.07 797 21 0.08 243 \n", - "2022-08-25 0.09 0.11 0.09 0.11 412 978 0.09 514 \n", - "2022-08-26 0.11 0.11 0.06 0.06 41 279 0.06 342 \n", - "2022-08-29 0.07 0.07 0.05 0.05 619 202 0.05 307 \n", - "2022-08-30 0.06 0.08 0.05 0.08 210 445 0.06 -2171 \n", - "2022-08-31 -0.01 -0.01 -0.01 -0.01 -440 48 0.05 143 \n", - "2022-09-01 0.05 0.05 0.05 0.05 348 68 0.04 -286 \n", - "2022-09-02 0.06 0.06 0.06 0.06 565 1376 0.04 -92 \n", - "2022-09-06 0.04 0.04 0.04 0.04 14 15 0.04 376 \n", - "2022-09-07 0.04 0.04 0.03 0.03 53 114 0.03 -57 \n", - "2022-09-08 0.06 0.07 0.06 0.07 24 588 0.06 0 \n", - "2022-09-09 0.07 0.07 0.05 0.05 3 262 0.05 -37 \n", - "2022-09-12 0.07 0.07 0.06 0.06 648 351 0.05 328 \n", - "2022-09-13 0.04 0.04 0.04 0.04 1 70 0.04 99 \n", - "2022-09-14 0.04 0.04 0.04 0.04 10 1110 0.03 7 \n", - "2022-09-15 0.04 0.05 0.04 0.05 531 634 0.04 14 \n", - "2022-09-16 0.00 0.00 0.00 0.00 0 886 0.03 4 \n", - "2022-09-19 0.02 0.03 0.01 0.01 605 1341 0.03 -145 \n", - "2022-09-20 0.03 0.04 0.03 0.04 37 55 0.02 116 \n", - "2022-09-21 0.03 0.03 0.02 0.02 83 12 0.02 -21 \n", - "2022-09-22 -0.01 -0.01 -0.01 -0.01 -20 10 0.01 -2330 \n", - "2022-09-23 0.01 0.02 0.01 0.01 62 4 0.02 50 \n", - "2022-09-26 0.02 0.02 0.02 0.02 23 1072 0.01 -152 \n", - "2022-09-27 0.02 0.03 0.02 0.03 4 15 0.01 -38 \n", - "2022-09-28 0.02 0.02 0.02 0.02 7 15 0.01 -3403 \n", - "2022-09-29 0.01 0.01 0.00 0.00 15 36 0.01 22 \n", - "2022-09-30 0.01 0.02 0.01 0.02 20 1 0.01 -643 \n", - "2022-10-03 0.01 0.02 0.01 0.02 31 0 0.00 -54 \n", - "2022-10-04 0.01 0.02 0.01 0.01 22 0 0.00 -274 \n", - "2022-10-05 0.01 0.01 0.01 0.01 3 0 0.00 -24 \n", - "2022-10-06 0.00 0.00 0.00 0.00 0 0 0.00 -4 \n", - "2022-10-07 0.02 0.02 0.02 0.02 1 0 0.00 65 \n", - "2022-10-10 0.02 0.02 0.02 0.02 15 0 0.00 10 \n", - "2022-10-11 0.01 0.02 0.01 0.02 10 0 0.00 -61 \n", - "2022-10-12 0.02 0.02 0.02 0.02 28 0 0.00 0 \n", - "2022-10-13 0.01 0.02 0.01 0.01 17 0 0.00 -38 \n", - "2022-10-14 0.01 0.02 0.01 0.01 7 0 0.00 -18 \n", - "2022-10-17 0.01 0.01 0.01 0.01 168 0 0.00 -253 \n", - "2022-10-18 0.02 0.02 0.01 0.01 601 0 0.00 -1915 \n", - "2022-10-19 -0.01 -0.01 -0.01 -0.01 -4 0 0.00 -1810 \n", - "2022-10-20 0.00 0.00 0.00 0.00 0 0 0.00 -1850 \n", - "2022-10-21 0.01 0.01 0.01 0.01 16 0 0.00 -1733 \n", - "\n", - " CloseAsk Midpoint Weighted_midpoint \n", - "Datetime \n", - "2022-01-04 4.50 4.475 4.317283 \n", - "2022-01-05 4.25 4.225 4.195248 \n", - "2022-01-06 4.50 4.450 4.421560 \n", - "2022-01-07 4.80 4.750 4.713734 \n", - "2022-01-10 4.75 4.700 4.726993 \n", - "2022-01-11 5.20 4.975 5.034994 \n", - "2022-01-12 4.75 4.725 4.801264 \n", - "2022-01-13 4.65 4.650 4.695664 \n", - "2022-01-14 4.50 4.450 4.488559 \n", - "2022-01-18 4.00 3.975 3.995012 \n", - "2022-01-19 4.15 4.075 4.130409 \n", - "2022-01-20 3.87 3.840 3.898290 \n", - "2022-01-21 3.79 3.725 3.617116 \n", - "2022-01-24 3.54 3.535 3.437751 \n", - "2022-01-25 3.86 3.830 3.815335 \n", - "2022-01-26 4.23 4.075 4.230505 \n", - "2022-01-27 3.89 3.845 3.848859 \n", - "2022-01-28 4.09 3.805 3.682347 \n", - "2022-01-31 4.17 4.110 4.186803 \n", - "2022-02-01 4.35 4.310 4.318599 \n", - "2022-02-02 4.32 4.295 4.362588 \n", - "2022-02-03 4.13 4.120 4.092208 \n", - "2022-02-04 4.75 4.425 4.274928 \n", - "2022-02-07 5.15 4.900 4.981528 \n", - "2022-02-08 5.10 4.975 4.841016 \n", - "2022-02-09 5.10 5.000 4.895449 \n", - "2022-02-10 4.95 4.925 5.042717 \n", - "2022-02-11 4.60 4.550 4.379863 \n", - "2022-02-14 4.45 4.425 4.502324 \n", - "2022-02-15 4.50 4.500 4.439718 \n", - "2022-02-16 4.50 4.375 4.250713 \n", - "2022-02-17 4.12 4.055 4.043917 \n", - "2022-02-18 4.03 3.985 3.942233 \n", - "2022-02-22 3.92 3.880 3.840070 \n", - "2022-02-23 3.69 3.660 3.524326 \n", - "2022-02-24 3.30 3.295 3.311361 \n", - "2022-02-25 3.81 3.745 3.831785 \n", - "2022-02-28 3.53 3.470 3.356455 \n", - "2022-03-01 3.03 3.020 2.934793 \n", - "2022-03-02 3.22 3.195 3.083118 \n", - "2022-03-03 3.08 3.085 2.993304 \n", - "2022-03-04 2.74 2.710 2.744454 \n", - "2022-03-07 2.05 2.040 2.110725 \n", - "2022-03-08 2.08 2.060 1.991548 \n", - "2022-03-09 2.78 2.750 2.815162 \n", - "2022-03-10 2.62 2.595 2.655119 \n", - "2022-03-11 2.56 2.535 2.576919 \n", - "2022-03-14 2.81 2.770 2.726907 \n", - "2022-03-15 2.86 2.835 2.933835 \n", - "2022-03-16 3.23 3.170 3.121545 \n", - "2022-03-17 3.25 3.215 3.193190 \n", - "2022-03-18 3.20 3.150 3.162459 \n", - "2022-03-21 3.12 3.110 3.170548 \n", - "2022-03-22 3.67 3.590 3.658761 \n", - "2022-03-23 3.26 3.210 3.263928 \n", - "2022-03-24 3.21 3.180 3.217698 \n", - "2022-03-25 3.43 3.395 3.369481 \n", - "2022-03-28 3.40 3.370 3.406980 \n", - "2022-03-29 3.31 3.305 3.424965 \n", - "2022-03-30 3.17 3.135 3.053242 \n", - "2022-03-31 2.60 2.550 2.538175 \n", - "2022-04-01 2.52 2.465 2.533417 \n", - "2022-04-04 2.39 2.350 2.440185 \n", - "2022-04-05 2.19 2.145 2.205106 \n", - "2022-04-06 2.10 2.045 1.967310 \n", - "2022-04-07 1.98 1.910 1.837813 \n", - "2022-04-08 2.00 1.985 1.929420 \n", - "2022-04-11 2.02 1.985 1.959428 \n", - "2022-04-12 1.87 1.860 1.820655 \n", - "2022-04-13 1.73 1.710 1.725463 \n", - "2022-04-14 1.33 1.305 1.365634 \n", - "2022-04-18 1.66 1.630 1.647752 \n", - "2022-04-19 1.83 1.805 1.792152 \n", - "2022-04-20 1.85 1.840 1.861822 \n", - "2022-04-21 1.66 1.630 1.616659 \n", - "2022-04-22 1.34 1.310 1.358069 \n", - "2022-04-25 1.24 1.230 1.251992 \n", - "2022-04-26 1.09 1.070 1.107626 \n", - "2022-04-27 0.99 0.975 0.996783 \n", - "2022-04-28 1.08 1.055 1.045141 \n", - "2022-04-29 0.96 0.910 0.907359 \n", - "2022-05-02 1.01 0.990 0.958870 \n", - "2022-05-03 1.25 1.205 1.286895 \n", - "2022-05-04 1.57 1.535 1.463354 \n", - "2022-05-05 1.39 1.340 1.425348 \n", - "2022-05-06 1.33 1.315 1.287405 \n", - "2022-05-09 1.12 1.095 1.127118 \n", - "2022-05-10 0.94 0.930 0.916493 \n", - "2022-05-11 0.92 0.905 0.874479 \n", - "2022-05-12 0.88 0.840 0.829460 \n", - "2022-05-13 0.79 0.765 0.793873 \n", - "2022-05-16 0.63 0.620 0.616166 \n", - "2022-05-17 0.82 0.800 0.747917 \n", - "2022-05-18 0.63 0.610 0.586837 \n", - "2022-05-19 0.57 0.550 0.568256 \n", - "2022-05-20 0.44 0.430 0.409757 \n", - "2022-05-23 0.79 0.775 0.735313 \n", - "2022-05-24 0.76 0.740 0.715361 \n", - "2022-05-25 0.81 0.765 0.717816 \n", - "2022-05-26 0.92 0.895 0.853402 \n", - "2022-05-27 0.90 0.885 0.850731 \n", - "2022-05-31 0.96 0.925 0.894068 \n", - "2022-06-01 0.84 0.830 0.830000 \n", - "2022-06-02 0.84 0.820 0.787905 \n", - "2022-06-03 0.73 0.715 0.688159 \n", - "2022-06-06 0.71 0.710 0.721940 \n", - "2022-06-07 0.72 0.710 0.702959 \n", - "2022-06-08 0.66 0.645 0.643065 \n", - "2022-06-09 0.50 0.470 0.482377 \n", - "2022-06-10 0.30 0.315 0.330739 \n", - "2022-06-13 0.25 0.240 0.231855 \n", - "2022-06-14 0.18 0.175 0.155655 \n", - "2022-06-15 0.18 0.175 0.181294 \n", - "2022-06-16 0.18 0.180 0.167351 \n", - "2022-06-17 0.18 0.175 0.155115 \n", - "2022-06-21 0.20 0.200 0.199778 \n", - "2022-06-22 0.19 0.185 0.187467 \n", - "2022-06-23 0.16 0.170 0.147442 \n", - "2022-06-24 0.15 0.145 0.123661 \n", - "2022-06-27 0.14 0.135 0.129901 \n", - "2022-06-28 0.14 0.135 0.122553 \n", - "2022-06-29 0.12 0.115 0.120874 \n", - "2022-06-30 0.08 0.090 0.061176 \n", - "2022-07-01 0.09 0.100 0.080414 \n", - "2022-07-05 0.08 0.080 0.073231 \n", - "2022-07-06 0.08 0.080 0.079536 \n", - "2022-07-07 0.09 0.095 0.075254 \n", - "2022-07-08 0.10 0.080 0.082364 \n", - "2022-07-11 0.06 0.070 0.050798 \n", - "2022-07-12 0.07 0.065 0.052086 \n", - "2022-07-13 0.06 0.060 0.040417 \n", - "2022-07-14 0.03 0.035 0.026581 \n", - "2022-07-15 0.12 0.080 0.010885 \n", - "2022-07-18 0.06 0.055 0.052926 \n", - "2022-07-19 0.10 0.090 0.072073 \n", - "2022-07-20 0.09 0.090 0.070462 \n", - "2022-07-21 0.09 0.090 0.090528 \n", - "2022-07-22 0.07 0.075 0.061313 \n", - "2022-07-25 0.09 0.090 0.074826 \n", - "2022-07-26 0.07 0.070 0.064305 \n", - "2022-07-27 0.08 0.075 0.072361 \n", - "2022-07-28 0.06 0.055 0.042295 \n", - "2022-07-29 0.08 0.070 0.075075 \n", - "2022-08-01 0.07 0.070 0.066543 \n", - "2022-08-02 0.05 0.045 0.033839 \n", - "2022-08-03 0.06 0.060 0.050168 \n", - "2022-08-04 0.06 0.060 0.051611 \n", - "2022-08-05 0.08 0.080 0.071551 \n", - "2022-08-08 0.06 0.055 0.040373 \n", - "2022-08-09 0.08 0.075 0.060345 \n", - "2022-08-10 0.12 0.120 0.118264 \n", - "2022-08-11 0.20 0.195 0.188064 \n", - "2022-08-12 0.21 0.205 0.195556 \n", - "2022-08-15 0.17 0.175 0.150271 \n", - "2022-08-16 0.22 0.215 0.217068 \n", - "2022-08-17 0.18 0.180 0.174639 \n", - "2022-08-18 0.16 0.155 0.133184 \n", - "2022-08-19 0.10 0.110 0.099551 \n", - "2022-08-22 0.08 0.085 0.076567 \n", - "2022-08-23 0.07 0.070 0.066823 \n", - "2022-08-24 0.07 0.075 0.069484 \n", - "2022-08-25 0.09 0.090 0.077299 \n", - "2022-08-26 0.05 0.055 0.046255 \n", - "2022-08-29 0.04 0.045 0.036181 \n", - "2022-08-30 0.04 0.050 0.031744 \n", - "2022-08-31 0.04 0.045 0.037647 \n", - "2022-09-01 0.03 0.035 0.022000 \n", - "2022-09-02 0.03 0.035 0.011176 \n", - "2022-09-06 0.03 0.035 0.029631 \n", - "2022-09-07 0.02 0.025 0.010952 \n", - "2022-09-08 0.05 0.055 0.040249 \n", - "2022-09-09 0.07 0.060 0.041418 \n", - "2022-09-12 0.06 0.055 0.049841 \n", - "2022-09-13 0.04 0.040 0.035882 \n", - "2022-09-14 0.04 0.035 0.020337 \n", - "2022-09-15 0.04 0.040 0.030231 \n", - "2022-09-16 0.03 0.030 0.020188 \n", - "2022-09-19 0.02 0.025 0.010096 \n", - "2022-09-20 0.02 0.020 0.016866 \n", - "2022-09-21 0.01 0.015 0.005862 \n", - "2022-09-22 0.01 0.010 0.009810 \n", - "2022-09-23 0.01 0.015 0.009690 \n", - "2022-09-26 0.00 0.005 -0.009693 \n", - "2022-09-27 0.01 0.010 0.005455 \n", - "2022-09-28 0.00 0.005 -0.000336 \n", - "2022-09-29 0.02 0.015 0.015689 \n", - "2022-09-30 0.00 0.005 -0.000032 \n", - "2022-10-03 0.00 0.000 0.000000 \n", - "2022-10-04 0.00 0.000 0.000000 \n", - "2022-10-05 0.01 0.005 0.010000 \n", - "2022-10-06 0.01 0.005 0.010000 \n", - "2022-10-07 0.01 0.005 0.010000 \n", - "2022-10-10 0.00 0.000 0.000000 \n", - "2022-10-11 0.01 0.005 0.010000 \n", - "2022-10-12 0.01 0.005 0.010000 \n", - "2022-10-13 0.00 0.000 0.000000 \n", - "2022-10-14 0.00 0.000 0.000000 \n", - "2022-10-17 0.00 0.000 0.000000 \n", - "2022-10-18 0.00 0.000 0.000000 \n", - "2022-10-19 0.01 0.005 0.010000 \n", - "2022-10-20 0.00 0.000 0.000000 \n", - "2022-10-21 0.00 0.000 0.000000 " - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.portfolio.get_option_data('BAC20221021C42') - evb_backtest.portfolio.get_option_data('BAC20221021C50')" - ] - }, - { - "cell_type": "code", - "execution_count": 163, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "&L:AAPL20220916C210&S:AAPL20220916C220\n", - "-106.18300649785866\n", - "\n", - "&L:MU20220916C100&S:MU20220916C105\n", - "-62.092960877754365\n", - "\n", - "&L:TSM20220916C140&S:TSM20220916C145\n", - "-49.96978426202608\n", - "\n", - "&L:BAC20221021C42&S:BAC20221021C50\n", - "nan\n", - "\n", - "&L:TSM20220916C145&S:TSM20220916C155\n", - "-31.7738395414745\n", - "\n", - "&L:MSFT20220916C380&S:MSFT20220916C400\n", - "-129.75637149420805\n", - "\n", - "&L:AAPL20221021C200&S:AAPL20221021C210\n", - "-53.1233905066091\n", - "\n", - "&L:MSFT20220916C365&S:MSFT20220916C380\n", - "-105.32385094867692\n", - "\n", - "&L:COST20230120C700&S:COST20230120C720\n", - "-113.52465910391857\n", - "\n", - "&L:MU20221021C100&S:MU20221021C110\n", - "-35.814418475026514\n", - "\n", - "&L:AAPL20221021C190&S:AAPL20221021C195\n", - "-118.84684540270086\n", - "\n", - "&L:GLD20221230C195&S:GLD20221230C205\n", - "-13.170875118207334\n", - "\n", - "&L:AAPL20221118C185&S:AAPL20221118C195\n", - "-116.35869072994024\n", - "\n", - "&L:TSLA20221216C1650&S:TSLA20221216C1700\n", - "-149.3253338395146\n", - "\n", - "&L:COST20230120C680&S:COST20230120C700\n", - "-96.36519599386861\n", - "\n", - "&L:TSLA20221216C1600&S:TSLA20221216C1700\n", - "-155.02359165198698\n", - "\n", - "&L:TSLA20221216C1700&S:TSLA20221216C1800\n", - "-75.81758131082745\n", - "\n", - "&L:AAPL20230616C185&S:AAPL20230616C190\n", - "-34.4578011118239\n", - "\n", - "&L:CAT20230616C250&S:CAT20230616C260\n", - "-24.423756304459857\n", - "\n", - "&L:CAT20230616C220&S:CAT20230616C230\n", - "-20.006966310029384\n", - "\n", - "&L:BAC20230616C35&S:BAC20230616C45\n", - "nan\n", - "\n", - "&L:BAC20230616C33&S:BAC20230616C40\n", - "-22.70709605894399\n", - "\n", - "&L:BA20230616C220&S:BA20230616C230\n", - "-70.30200004016882\n", - "\n" - ] - } - ], - "source": [ - "for positio, whole in evb_backtest.portfolio._OptionSignalPortfolio__trades.items():\n", - " if positio == '&L:MSFT20220916C370&S:MSFT20220916C385':\n", - " continue\n", - " print(positio)\n", - " print(whole['pnl'])\n", - " print('')" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [ - { - "ename": "KeyError", - "evalue": "'&L:MSFT20220916C370&S:MSFT20220916C385'", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mKeyError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[1;32mIn[45], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m \u001b[43mevb_backtest\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mportfolio\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_OptionSignalPortfolio__trades\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43m&L:MSFT20220916C370&S:MSFT20220916C385\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\n", - "\u001b[1;31mKeyError\u001b[0m: '&L:MSFT20220916C370&S:MSFT20220916C385'" - ] - } - ], - "source": [ - "evb_backtest.portfolio._OptionSignalPortfolio__trades['&L:MSFT20220916C370&S:MSFT20220916C385']" - ] - }, - { - "cell_type": "code", - "execution_count": 162, - "metadata": {}, - "outputs": [ - { - "ename": "KeyError", - "evalue": "'pnl'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[162], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mevb_backtest\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mportfolio\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mplot_portfolio\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/cloned_repos/QuantTools/EventDriven/portfolio.py:874\u001b[0m, in \u001b[0;36mOptionSignalPortfolio.plot_portfolio\u001b[0;34m(self, benchmark, plot_bnchmk, return_plot, start_plot, **kwargs)\u001b[0m\n\u001b[1;32m 872\u001b[0m eq \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_equity\n\u001b[1;32m 873\u001b[0m dd \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdd(\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[0;32m--> 874\u001b[0m tr \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtrades\u001b[49m\u001b[38;5;241m.\u001b[39mcopy()\n\u001b[1;32m 875\u001b[0m tr[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mSize\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m tr[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mQuantity\u001b[39m\u001b[38;5;124m'\u001b[39m]\n\u001b[1;32m 877\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m plot_portfolio(tr, eq, dd, _bnch,plot_bnchmk\u001b[38;5;241m=\u001b[39mplot_bnchmk, return_plot\u001b[38;5;241m=\u001b[39mreturn_plot, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n", - "File \u001b[0;32m~/cloned_repos/QuantTools/EventDriven/portfolio.py:241\u001b[0m, in \u001b[0;36mOptionSignalPortfolio.trades\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 237\u001b[0m trades_data \u001b[38;5;241m=\u001b[39m []\n\u001b[1;32m 238\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m trade_id, data \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__trades\u001b[38;5;241m.\u001b[39mitems():\n\u001b[1;32m 239\u001b[0m trades_data\u001b[38;5;241m.\u001b[39mappend({\n\u001b[1;32m 240\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mTicker\u001b[39m\u001b[38;5;124m'\u001b[39m: data[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124msymbol\u001b[39m\u001b[38;5;124m'\u001b[39m],\n\u001b[0;32m--> 241\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mPnL\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[43mdata\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mpnl\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m,\n\u001b[1;32m 242\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mReturnPct\u001b[39m\u001b[38;5;124m'\u001b[39m: data[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mreturn_pct\u001b[39m\u001b[38;5;124m'\u001b[39m],\n\u001b[1;32m 243\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mEntryPrice\u001b[39m\u001b[38;5;124m'\u001b[39m: data[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mentry_price\u001b[39m\u001b[38;5;124m'\u001b[39m],\n\u001b[1;32m 244\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mEntryCommission\u001b[39m\u001b[38;5;124m'\u001b[39m: data[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mentry_commission\u001b[39m\u001b[38;5;124m'\u001b[39m],\n\u001b[1;32m 245\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mEntrySlippage\u001b[39m\u001b[38;5;124m'\u001b[39m: data[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mentry_slippage\u001b[39m\u001b[38;5;124m'\u001b[39m],\n\u001b[1;32m 246\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mEntryMarketValue\u001b[39m\u001b[38;5;124m'\u001b[39m: data[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mentry_market_value\u001b[39m\u001b[38;5;124m'\u001b[39m],\n\u001b[1;32m 247\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mTotalEntryCost\u001b[39m\u001b[38;5;124m'\u001b[39m: data[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mtotal_entry_cost\u001b[39m\u001b[38;5;124m'\u001b[39m],\n\u001b[1;32m 248\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mAuxilaryEntryCost\u001b[39m\u001b[38;5;124m'\u001b[39m: data[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mauxilary_entry_cost\u001b[39m\u001b[38;5;124m'\u001b[39m],\n\u001b[1;32m 249\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mExitPrice\u001b[39m\u001b[38;5;124m'\u001b[39m: data[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mexit_price\u001b[39m\u001b[38;5;124m'\u001b[39m],\n\u001b[1;32m 250\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mExitCommission\u001b[39m\u001b[38;5;124m'\u001b[39m: data[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mexit_commission\u001b[39m\u001b[38;5;124m'\u001b[39m], \n\u001b[1;32m 251\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mExitSlippage\u001b[39m\u001b[38;5;124m'\u001b[39m: data[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mexit_slippage\u001b[39m\u001b[38;5;124m'\u001b[39m],\n\u001b[1;32m 252\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mExitMarketValue\u001b[39m\u001b[38;5;124m'\u001b[39m: data[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mexit_market_value\u001b[39m\u001b[38;5;124m'\u001b[39m],\n\u001b[1;32m 253\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mTotalExitCost\u001b[39m\u001b[38;5;124m'\u001b[39m: data[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mtotal_exit_cost\u001b[39m\u001b[38;5;124m'\u001b[39m],\n\u001b[1;32m 254\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mAuxilaryExitCost\u001b[39m\u001b[38;5;124m'\u001b[39m: data[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mauxilary_exit_cost\u001b[39m\u001b[38;5;124m'\u001b[39m],\n\u001b[1;32m 255\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mQuantity\u001b[39m\u001b[38;5;124m'\u001b[39m: data[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mquantity\u001b[39m\u001b[38;5;124m'\u001b[39m],\n\u001b[1;32m 256\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mEntryTime\u001b[39m\u001b[38;5;124m'\u001b[39m: data[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mentry_date\u001b[39m\u001b[38;5;124m'\u001b[39m],\n\u001b[1;32m 257\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mExitTime\u001b[39m\u001b[38;5;124m'\u001b[39m: data[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mexit_date\u001b[39m\u001b[38;5;124m'\u001b[39m],\n\u001b[1;32m 258\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mDuration\u001b[39m\u001b[38;5;124m'\u001b[39m: (data[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mexit_date\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m-\u001b[39m data[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mentry_date\u001b[39m\u001b[38;5;124m'\u001b[39m])\u001b[38;5;241m.\u001b[39mdays,\n\u001b[1;32m 259\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mPositions\u001b[39m\u001b[38;5;124m'\u001b[39m: data[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mtrade_id\u001b[39m\u001b[38;5;124m'\u001b[39m],\n\u001b[1;32m 260\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mSignalID\u001b[39m\u001b[38;5;124m'\u001b[39m: data[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124msignal_id\u001b[39m\u001b[38;5;124m'\u001b[39m]\n\u001b[1;32m 261\u001b[0m }) \n\u001b[1;32m 263\u001b[0m trades \u001b[38;5;241m=\u001b[39m pd\u001b[38;5;241m.\u001b[39mDataFrame(trades_data)\n\u001b[1;32m 264\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m trades\n", - "\u001b[0;31mKeyError\u001b[0m: 'pnl'" - ] - } - ], - "source": [ - "evb_backtest.portfolio.plot_portfolio()" - ] - }, - { - "cell_type": "code", - "execution_count": 80, - "metadata": {}, - "outputs": [ - { - "ename": "AttributeError", - "evalue": "'DataFrame' object has no attribute 'ReturnPct'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m/var/folders/j0/80hkbygd4lb27h9mw76gqzpw0000gn/T/ipykernel_22058/2439170326.py\u001b[0m in \u001b[0;36m?\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mevb_backtest\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mportfolio\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0maggregate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m~/cloned_repos/QuantTools/trade/backtester_/utils/aggregators.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(self, risk_free_rate, MAR)\u001b[0m\n\u001b[1;32m 913\u001b[0m \u001b[0;34m'Avg. Drawdown [%]'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mavg_dd_percent\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 914\u001b[0m \u001b[0;34m'Max. Drawdown Duration'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmdd_duration\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 915\u001b[0m \u001b[0;34m'Avg Dradown Duration'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mavg_dd_duration\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 916\u001b[0m \u001b[0;34m'# Trades'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnumOfTrades\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 917\u001b[0;31m \u001b[0;34m'Win Rate [%]'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwinRate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 918\u001b[0m \u001b[0;34m'Lose Rate [%]'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlossRate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 919\u001b[0m \u001b[0;34m'Avg. Trade [%]'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mavgPnL\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'A'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 920\u001b[0m \u001b[0;34m'Avg. Winning Trade [%]'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mavgPnL\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'W'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/cloned_repos/QuantTools/trade/backtester_/utils/aggregators.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 748\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mwinRate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 749\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mwinRate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_trades\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m~/cloned_repos/QuantTools/trade/backtester_/utils/aggregators.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(trades_df)\u001b[0m\n\u001b[1;32m 380\u001b[0m \u001b[0mparams\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 381\u001b[0m \u001b[0mtrades_df\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDataFrame\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mDataFrame\u001b[0m \u001b[0mContatining\u001b[0m \u001b[0mTrades\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 382\u001b[0m \"\"\"\n\u001b[1;32m 383\u001b[0m \u001b[0mtrades_\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtrades_df\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 384\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mround\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtrades_\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mReturnPct\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msum\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtrades_\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mReturnPct\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcount\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0;36m100\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m~/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(self, name)\u001b[0m\n\u001b[1;32m 6295\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mname\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_accessors\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6296\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_info_axis\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_can_hold_identifiers_and_holds_name\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6297\u001b[0m ):\n\u001b[1;32m 6298\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 6299\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mobject\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__getattribute__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m: 'DataFrame' object has no attribute 'ReturnPct'" - ] - } - ], - "source": [ - "evb_backtest.portfolio.aggregate()" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
TickerPnLReturnPctEntryPriceEntryCommissionEntrySlippageEntryMarketValueTotalEntryCostAuxilaryEntryCostExitPriceExitCommissionExitSlippageExitMarketValueTotalExitCostAuxilaryExitCostQuantityEntryTimeExitTimeDurationPositionsSignalID
0AAPL-810.127534-4.178392193.8849816.525.424905962.924905969.42490531.924905159.2973706.5-47.013148802.986852796.48685253.51314852022-01-042022-01-062&L:AAPL20220916C210&S:AAPL20220916C220AAPL20220104C
1MU-457.904886-2.269172201.7938613.916.481583601.481583605.38158320.381583147.4766973.9-26.169908446.330092442.43009230.06990832022-01-042022-01-2016&L:MU20220916C100&S:MU20220916C105MU20220104C
2COST-62.284835-0.162419383.4824021.39.682402382.182402383.48240210.982402321.1975671.3-17.502433322.497567321.19756718.80243312022-04-052022-04-2924&L:COST20230120C680&S:COST20230120C700COST20220405C
3COST-361.527791-1.034702349.4029302.631.205861696.205861698.80586133.805861337.2780692.6-32.843861677.156139674.55613935.44386122022-01-102022-01-144&L:COST20230120C560&S:COST20230120C570COST20220110C
4COST-442.400087-1.232661358.8983732.635.196746715.196746717.79674637.796746275.3966592.6-41.606682553.393318550.79331844.20668222022-01-182022-01-202&L:COST20230120C540&S:COST20230120C550COST20220118C
5TSM-426.870311-2.204257193.6571943.929.571582577.071582580.97158233.471582154.1012713.9-21.296187466.203813462.30381325.19618732022-01-182022-01-202&L:TSM20220916C140&S:TSM20220916C145TSM20220118C
6HD-441.258227-2.040509216.2490813.944.847244644.847244648.74724448.747244207.4890173.9-18.632950626.367050622.46705022.53295032022-01-192022-01-245&L:HD20230120C420&S:HD20230120C430HD20220119C
7BACNaNNaNNaN0.00.0000000.000000NaN0.000000NaN0.0-0.0000000.000000NaN0.00000002022-01-192022-01-245&L:BAC20221021C42&S:BAC20221021C50BAC20220119C
8TSM-265.206651-1.258266210.7715992.618.943197418.943197421.54319721.543197156.3365462.6-24.726908315.273092312.67309227.32690822022-01-212022-01-276&L:TSM20230120C150&S:TSM20220916C145TSM20220121C
9MSFT-1098.846926-5.117004214.7442187.880.6653101280.6653101288.46531088.465310189.6183847.8-54.4896961145.5103041137.71030462.28969662022-01-212022-01-243&L:MSFT20230120C385&S:MSFT20220916C365MSFT20220121C
10AAPL-275.798698-0.467825589.5339531.327.733953588.233953589.53395329.033953313.7352551.3-6.464745315.035255313.7352557.76474512022-01-252022-03-1448&L:AAPL20221118C200&S:AAPL20221118C300AAPL20220125C
11MSFT-892.930279-4.354406205.0636096.518.8180451018.8180451025.31804525.318045132.3877666.5-31.561172668.438828661.93882838.06117252022-01-272022-02-1418&L:MSFT20230120C420&S:MSFT20230120C450MSFT20220127C
12HD-494.320663-3.684007134.1801825.221.520728531.520728536.72072826.72072842.4000655.2-5.199740174.800260169.60026010.39974042022-01-312022-02-1414&L:HD20230120C450&S:HD20230120C460HD20220131C
13COST-347.663178-0.992228350.3863472.618.172693698.172693700.77269320.772693353.1095152.6-41.180970708.819030706.21903043.78097022022-02-012022-02-2423&L:COST20230120C680&S:COST20230120C740COST20220201C
14MU-464.364317-2.325755199.6617113.940.085134595.085134598.98513443.985134134.6208173.9-27.237548407.762452403.86245231.13754832022-02-112022-03-0421&L:MU20230120C120&S:MU20230120C130MU20220211C
15GLD-71.769883-0.374664191.5579101.312.757910190.257910191.55791014.057910119.7880271.3-6.411973121.088027119.7880277.71197312022-02-282022-05-1071&L:GLD20221230C195&S:GLD20221230C205GLD20220228C
16AAPL59.3184040.093382635.2210511.343.921051633.921051635.22105145.221051694.5394551.3-24.160545695.839455694.53945525.46054512022-03-172022-04-2640&L:AAPL20230120C160&S:AAPL20230120C175AAPL20220317C
17TSLA-1505.631282-8.224805183.05982011.760.8383791635.8383791647.53837972.538379141.90709711.7-83.6361271288.8638731277.16387395.33612792022-03-222022-04-2635&L:TSLA20230120C1825&S:TSLA20230120C1850TSLA20220322C
18AAPL-115.389258-0.191203603.4910891.339.691089602.191089603.49108940.991089488.1018311.3-35.598169489.401831488.10183136.89816912022-08-102022-08-2919&L:AAPL20230616C180&S:AAPL20230616C195AAPL20220810C
19CAT68.1053520.200779339.2051401.320.405140337.905140339.20514021.705140407.3104931.3-8.889507408.610493407.31049310.18950712022-11-042022-12-3056&L:CAT20230616C250&S:CAT20230616C260CAT20221104C
20BA-353.646295-1.758589201.0965623.929.389685599.389685603.28968533.289685249.6433913.9-19.669828752.830172748.93017223.56982832022-11-162022-12-3044&L:BA20230616C220&S:BA20230616C230BA20221116C
\n", - "
" - ], - "text/plain": [ - " Ticker PnL ReturnPct EntryPrice EntryCommission EntrySlippage \\\n", - "0 AAPL -810.127534 -4.178392 193.884981 6.5 25.424905 \n", - "1 MU -457.904886 -2.269172 201.793861 3.9 16.481583 \n", - "2 COST -62.284835 -0.162419 383.482402 1.3 9.682402 \n", - "3 COST -361.527791 -1.034702 349.402930 2.6 31.205861 \n", - "4 COST -442.400087 -1.232661 358.898373 2.6 35.196746 \n", - "5 TSM -426.870311 -2.204257 193.657194 3.9 29.571582 \n", - "6 HD -441.258227 -2.040509 216.249081 3.9 44.847244 \n", - "7 BAC NaN NaN NaN 0.0 0.000000 \n", - "8 TSM -265.206651 -1.258266 210.771599 2.6 18.943197 \n", - "9 MSFT -1098.846926 -5.117004 214.744218 7.8 80.665310 \n", - "10 AAPL -275.798698 -0.467825 589.533953 1.3 27.733953 \n", - "11 MSFT -892.930279 -4.354406 205.063609 6.5 18.818045 \n", - "12 HD -494.320663 -3.684007 134.180182 5.2 21.520728 \n", - "13 COST -347.663178 -0.992228 350.386347 2.6 18.172693 \n", - "14 MU -464.364317 -2.325755 199.661711 3.9 40.085134 \n", - "15 GLD -71.769883 -0.374664 191.557910 1.3 12.757910 \n", - "16 AAPL 59.318404 0.093382 635.221051 1.3 43.921051 \n", - "17 TSLA -1505.631282 -8.224805 183.059820 11.7 60.838379 \n", - "18 AAPL -115.389258 -0.191203 603.491089 1.3 39.691089 \n", - "19 CAT 68.105352 0.200779 339.205140 1.3 20.405140 \n", - "20 BA -353.646295 -1.758589 201.096562 3.9 29.389685 \n", - "\n", - " EntryMarketValue TotalEntryCost AuxilaryEntryCost ExitPrice \\\n", - "0 962.924905 969.424905 31.924905 159.297370 \n", - "1 601.481583 605.381583 20.381583 147.476697 \n", - "2 382.182402 383.482402 10.982402 321.197567 \n", - "3 696.205861 698.805861 33.805861 337.278069 \n", - "4 715.196746 717.796746 37.796746 275.396659 \n", - "5 577.071582 580.971582 33.471582 154.101271 \n", - "6 644.847244 648.747244 48.747244 207.489017 \n", - "7 0.000000 NaN 0.000000 NaN \n", - "8 418.943197 421.543197 21.543197 156.336546 \n", - "9 1280.665310 1288.465310 88.465310 189.618384 \n", - "10 588.233953 589.533953 29.033953 313.735255 \n", - "11 1018.818045 1025.318045 25.318045 132.387766 \n", - "12 531.520728 536.720728 26.720728 42.400065 \n", - "13 698.172693 700.772693 20.772693 353.109515 \n", - "14 595.085134 598.985134 43.985134 134.620817 \n", - "15 190.257910 191.557910 14.057910 119.788027 \n", - "16 633.921051 635.221051 45.221051 694.539455 \n", - "17 1635.838379 1647.538379 72.538379 141.907097 \n", - "18 602.191089 603.491089 40.991089 488.101831 \n", - "19 337.905140 339.205140 21.705140 407.310493 \n", - "20 599.389685 603.289685 33.289685 249.643391 \n", - "\n", - " ExitCommission ExitSlippage ExitMarketValue TotalExitCost \\\n", - "0 6.5 -47.013148 802.986852 796.486852 \n", - "1 3.9 -26.169908 446.330092 442.430092 \n", - "2 1.3 -17.502433 322.497567 321.197567 \n", - "3 2.6 -32.843861 677.156139 674.556139 \n", - "4 2.6 -41.606682 553.393318 550.793318 \n", - "5 3.9 -21.296187 466.203813 462.303813 \n", - "6 3.9 -18.632950 626.367050 622.467050 \n", - "7 0.0 -0.000000 0.000000 NaN \n", - "8 2.6 -24.726908 315.273092 312.673092 \n", - "9 7.8 -54.489696 1145.510304 1137.710304 \n", - "10 1.3 -6.464745 315.035255 313.735255 \n", - "11 6.5 -31.561172 668.438828 661.938828 \n", - "12 5.2 -5.199740 174.800260 169.600260 \n", - "13 2.6 -41.180970 708.819030 706.219030 \n", - "14 3.9 -27.237548 407.762452 403.862452 \n", - "15 1.3 -6.411973 121.088027 119.788027 \n", - "16 1.3 -24.160545 695.839455 694.539455 \n", - "17 11.7 -83.636127 1288.863873 1277.163873 \n", - "18 1.3 -35.598169 489.401831 488.101831 \n", - "19 1.3 -8.889507 408.610493 407.310493 \n", - "20 3.9 -19.669828 752.830172 748.930172 \n", - "\n", - " AuxilaryExitCost Quantity EntryTime ExitTime Duration \\\n", - "0 53.513148 5 2022-01-04 2022-01-06 2 \n", - "1 30.069908 3 2022-01-04 2022-01-20 16 \n", - "2 18.802433 1 2022-04-05 2022-04-29 24 \n", - "3 35.443861 2 2022-01-10 2022-01-14 4 \n", - "4 44.206682 2 2022-01-18 2022-01-20 2 \n", - "5 25.196187 3 2022-01-18 2022-01-20 2 \n", - "6 22.532950 3 2022-01-19 2022-01-24 5 \n", - "7 0.000000 0 2022-01-19 2022-01-24 5 \n", - "8 27.326908 2 2022-01-21 2022-01-27 6 \n", - "9 62.289696 6 2022-01-21 2022-01-24 3 \n", - "10 7.764745 1 2022-01-25 2022-03-14 48 \n", - "11 38.061172 5 2022-01-27 2022-02-14 18 \n", - "12 10.399740 4 2022-01-31 2022-02-14 14 \n", - "13 43.780970 2 2022-02-01 2022-02-24 23 \n", - "14 31.137548 3 2022-02-11 2022-03-04 21 \n", - "15 7.711973 1 2022-02-28 2022-05-10 71 \n", - "16 25.460545 1 2022-03-17 2022-04-26 40 \n", - "17 95.336127 9 2022-03-22 2022-04-26 35 \n", - "18 36.898169 1 2022-08-10 2022-08-29 19 \n", - "19 10.189507 1 2022-11-04 2022-12-30 56 \n", - "20 23.569828 3 2022-11-16 2022-12-30 44 \n", - "\n", - " Positions SignalID \n", - "0 &L:AAPL20220916C210&S:AAPL20220916C220 AAPL20220104C \n", - "1 &L:MU20220916C100&S:MU20220916C105 MU20220104C \n", - "2 &L:COST20230120C680&S:COST20230120C700 COST20220405C \n", - "3 &L:COST20230120C560&S:COST20230120C570 COST20220110C \n", - "4 &L:COST20230120C540&S:COST20230120C550 COST20220118C \n", - "5 &L:TSM20220916C140&S:TSM20220916C145 TSM20220118C \n", - "6 &L:HD20230120C420&S:HD20230120C430 HD20220119C \n", - "7 &L:BAC20221021C42&S:BAC20221021C50 BAC20220119C \n", - "8 &L:TSM20230120C150&S:TSM20220916C145 TSM20220121C \n", - "9 &L:MSFT20230120C385&S:MSFT20220916C365 MSFT20220121C \n", - "10 &L:AAPL20221118C200&S:AAPL20221118C300 AAPL20220125C \n", - "11 &L:MSFT20230120C420&S:MSFT20230120C450 MSFT20220127C \n", - "12 &L:HD20230120C450&S:HD20230120C460 HD20220131C \n", - "13 &L:COST20230120C680&S:COST20230120C740 COST20220201C \n", - "14 &L:MU20230120C120&S:MU20230120C130 MU20220211C \n", - "15 &L:GLD20221230C195&S:GLD20221230C205 GLD20220228C \n", - "16 &L:AAPL20230120C160&S:AAPL20230120C175 AAPL20220317C \n", - "17 &L:TSLA20230120C1825&S:TSLA20230120C1850 TSLA20220322C \n", - "18 &L:AAPL20230616C180&S:AAPL20230616C195 AAPL20220810C \n", - "19 &L:CAT20230616C250&S:CAT20230616C260 CAT20221104C \n", - "20 &L:BA20230616C220&S:BA20230616C230 BA20221116C " - ] - }, - "execution_count": 48, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.portfolio.trades" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
AAPLCOSTHDMUBACTSMMSFTGLDTSLAUNGSBUXCATBAcashcommissiontotal
datetime
2022-01-041198.9800171080.288130671.056371789.926183422.192655706.2353581440.510835272.7778871929.996497114.221328586.633211586.139486661.7947289539.2473130.00020000.000000
2022-01-041167.0551121042.498855671.056371769.544600422.192655706.2353581440.510835272.7778871929.996497114.221328586.633211586.139486661.7947289539.2473130.13019909.904237
2022-01-051079.5551121257.498855671.056371687.044600422.192655706.2353581440.510835272.7778871929.996497114.221328586.633211586.139486661.7947289539.2473130.13019954.904237
2022-01-061026.0419651037.498855671.056371732.044600422.192655706.2353581440.510835272.7778871929.996497114.221328586.633211586.139486661.7947289539.2473130.19519726.391089
2022-01-071026.0419651011.499666671.056371717.044600422.192655706.2353581440.510835272.7778871929.996497114.221328586.633211586.139486661.7947289539.2473130.22119685.391901
...................................................
2022-12-26694.172412763.408019277.655708431.852010422.192655478.697484926.376614201.0080041559.621991114.221328586.633211681.934346838.5050429539.2473131.50817515.526139
2022-12-27694.172412763.408019277.655708431.852010422.192655478.697484926.376614201.0080041559.621991114.221328586.633211681.934346838.5050429539.2473131.50817515.526139
2022-12-28694.172412763.408019277.655708431.852010422.192655478.697484926.376614201.0080041559.621991114.221328586.633211654.434346823.5050429539.2473131.50817473.026139
2022-12-29694.172412763.408019277.655708431.852010422.192655478.697484926.376614201.0080041559.621991114.221328586.633211664.434346831.0050429539.2473131.50817490.526139
2022-12-30694.172412763.408019277.655708431.852010422.192655478.697484926.376614201.0080041559.621991114.221328586.633211654.244838807.4352159539.2473131.56017456.766804
\n", - "

260 rows × 16 columns

\n", - "
" - ], - "text/plain": [ - " AAPL COST HD MU BAC \\\n", - "datetime \n", - "2022-01-04 1198.980017 1080.288130 671.056371 789.926183 422.192655 \n", - "2022-01-04 1167.055112 1042.498855 671.056371 769.544600 422.192655 \n", - "2022-01-05 1079.555112 1257.498855 671.056371 687.044600 422.192655 \n", - "2022-01-06 1026.041965 1037.498855 671.056371 732.044600 422.192655 \n", - "2022-01-07 1026.041965 1011.499666 671.056371 717.044600 422.192655 \n", - "... ... ... ... ... ... \n", - "2022-12-26 694.172412 763.408019 277.655708 431.852010 422.192655 \n", - "2022-12-27 694.172412 763.408019 277.655708 431.852010 422.192655 \n", - "2022-12-28 694.172412 763.408019 277.655708 431.852010 422.192655 \n", - "2022-12-29 694.172412 763.408019 277.655708 431.852010 422.192655 \n", - "2022-12-30 694.172412 763.408019 277.655708 431.852010 422.192655 \n", - "\n", - " TSM MSFT GLD TSLA UNG \\\n", - "datetime \n", - "2022-01-04 706.235358 1440.510835 272.777887 1929.996497 114.221328 \n", - "2022-01-04 706.235358 1440.510835 272.777887 1929.996497 114.221328 \n", - "2022-01-05 706.235358 1440.510835 272.777887 1929.996497 114.221328 \n", - "2022-01-06 706.235358 1440.510835 272.777887 1929.996497 114.221328 \n", - "2022-01-07 706.235358 1440.510835 272.777887 1929.996497 114.221328 \n", - "... ... ... ... ... ... \n", - "2022-12-26 478.697484 926.376614 201.008004 1559.621991 114.221328 \n", - "2022-12-27 478.697484 926.376614 201.008004 1559.621991 114.221328 \n", - "2022-12-28 478.697484 926.376614 201.008004 1559.621991 114.221328 \n", - "2022-12-29 478.697484 926.376614 201.008004 1559.621991 114.221328 \n", - "2022-12-30 478.697484 926.376614 201.008004 1559.621991 114.221328 \n", - "\n", - " SBUX CAT BA cash commission \\\n", - "datetime \n", - "2022-01-04 586.633211 586.139486 661.794728 9539.247313 0.000 \n", - "2022-01-04 586.633211 586.139486 661.794728 9539.247313 0.130 \n", - "2022-01-05 586.633211 586.139486 661.794728 9539.247313 0.130 \n", - "2022-01-06 586.633211 586.139486 661.794728 9539.247313 0.195 \n", - "2022-01-07 586.633211 586.139486 661.794728 9539.247313 0.221 \n", - "... ... ... ... ... ... \n", - "2022-12-26 586.633211 681.934346 838.505042 9539.247313 1.508 \n", - "2022-12-27 586.633211 681.934346 838.505042 9539.247313 1.508 \n", - "2022-12-28 586.633211 654.434346 823.505042 9539.247313 1.508 \n", - "2022-12-29 586.633211 664.434346 831.005042 9539.247313 1.508 \n", - "2022-12-30 586.633211 654.244838 807.435215 9539.247313 1.560 \n", - "\n", - " total \n", - "datetime \n", - "2022-01-04 20000.000000 \n", - "2022-01-04 19909.904237 \n", - "2022-01-05 19954.904237 \n", - "2022-01-06 19726.391089 \n", - "2022-01-07 19685.391901 \n", - "... ... \n", - "2022-12-26 17515.526139 \n", - "2022-12-27 17515.526139 \n", - "2022-12-28 17473.026139 \n", - "2022-12-29 17490.526139 \n", - "2022-12-30 17456.766804 \n", - "\n", - "[260 rows x 16 columns]" - ] - }, - "execution_count": 49, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.portfolio.get_weighted_holdings()" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
longshorttrade_idclosequantitymarket_value
datetimesymbol
2022-01-04AAPL[AAPL20220916C210][AAPL20220916C220]&L:AAPL20220916C210&S:AAPL20220916C2201.7005937.5
COST[COST20230120C680][COST20230120C700]&L:COST20230120C680&S:COST20230120C7003.3252670.0
MU[MU20220916C100][MU20220916C105]&L:MU20220916C100&S:MU20220916C1051.5753585.0
2022-01-05AAPL[AAPL20220916C210][AAPL20220916C220]&L:AAPL20220916C210&S:AAPL20220916C2201.7005850.0
COST[COST20230120C680][COST20230120C700]&L:COST20230120C680&S:COST20230120C7003.3252885.0
MU[MU20220916C100][MU20220916C105]&L:MU20220916C100&S:MU20220916C1051.5753502.5
2022-01-06COST[COST20230120C680][COST20230120C700]&L:COST20230120C680&S:COST20230120C7003.3252665.0
MU[MU20220916C100][MU20220916C105]&L:MU20220916C100&S:MU20220916C1051.5753547.5
2022-01-07MU[MU20220916C100][MU20220916C105]&L:MU20220916C100&S:MU20220916C1051.5753532.5
2022-01-10COST[COST20230120C560][COST20230120C570]&L:COST20230120C560&S:COST20230120C5703.5502665.0
MU[MU20220916C100][MU20220916C105]&L:MU20220916C100&S:MU20220916C1051.5753480.0
2022-01-11COST[COST20230120C560][COST20230120C570]&L:COST20230120C560&S:COST20230120C5703.5502785.0
MU[MU20220916C100][MU20220916C105]&L:MU20220916C100&S:MU20220916C1051.5753517.5
2022-01-12COST[COST20230120C560][COST20230120C570]&L:COST20230120C560&S:COST20230120C5703.5502775.0
MU[MU20220916C100][MU20220916C105]&L:MU20220916C100&S:MU20220916C1051.5753517.5
2022-01-13COST[COST20230120C560][COST20230120C570]&L:COST20230120C560&S:COST20230120C5703.5502710.0
MU[MU20220916C100][MU20220916C105]&L:MU20220916C100&S:MU20220916C1051.5753540.0
2022-01-14MU[MU20220916C100][MU20220916C105]&L:MU20220916C100&S:MU20220916C1051.5753577.5
2022-01-17MU[MU20220916C100][MU20220916C105]&L:MU20220916C100&S:MU20220916C1051.5753517.5
2022-01-18COST[COST20230120C540][COST20230120C550]&L:COST20230120C540&S:COST20230120C5502.9752680.0
MU[MU20220916C100][MU20220916C105]&L:MU20220916C100&S:MU20220916C1051.5753517.5
TSM[TSM20220916C140][TSM20220916C145]&L:TSM20220916C140&S:TSM20220916C1451.6253547.5
2022-01-19COST[COST20230120C540][COST20230120C550]&L:COST20230120C540&S:COST20230120C5502.9752595.0
HD[HD20230120C420][HD20230120C430]&L:HD20230120C420&S:HD20230120C4302.1503600.0
MU[MU20220916C100][MU20220916C105]&L:MU20220916C100&S:MU20220916C1051.5753472.5
BAC[BAC20221021C42][BAC20221021C50]&L:BAC20221021C42&S:BAC20221021C503.72500.0
TSM[TSM20220916C140][TSM20220916C145]&L:TSM20220916C140&S:TSM20220916C1451.6253487.5
2022-01-20HD[HD20230120C420][HD20230120C430]&L:HD20230120C420&S:HD20230120C4302.1503540.0
BAC[BAC20221021C42][BAC20221021C50]&L:BAC20221021C42&S:BAC20221021C503.72500.0
2022-01-21HD[HD20230120C420][HD20230120C430]&L:HD20230120C420&S:HD20230120C4302.1503645.0
BAC[BAC20221021C42][BAC20221021C50]&L:BAC20221021C42&S:BAC20221021C503.72500.0
TSM[TSM20230120C150][TSM20220916C145]&L:TSM20230120C150&S:TSM20220916C1451.7002400.0
MSFT[MSFT20230120C385][MSFT20220916C365]&L:MSFT20230120C385&S:MSFT20220916C3652.00061200.0
2022-01-24TSM[TSM20230120C150][TSM20220916C145]&L:TSM20230120C150&S:TSM20220916C1451.7002230.0
2022-01-25AAPL[AAPL20221118C200][AAPL20221118C300]&L:AAPL20221118C200&S:AAPL20221118C3003.2151560.5
TSM[TSM20230120C150][TSM20220916C145]&L:TSM20230120C150&S:TSM20220916C1451.7002310.0
2022-01-26AAPL[AAPL20221118C200][AAPL20221118C300]&L:AAPL20221118C200&S:AAPL20221118C3003.2151560.5
TSM[TSM20230120C150][TSM20220916C145]&L:TSM20230120C150&S:TSM20220916C1451.7002340.0
2022-01-27AAPL[AAPL20221118C200][AAPL20221118C300]&L:AAPL20221118C200&S:AAPL20221118C3003.2151534.0
MSFT[MSFT20230120C420][MSFT20230120C450]&L:MSFT20230120C420&S:MSFT20230120C4501.40051000.0
2022-01-28AAPL[AAPL20221118C200][AAPL20221118C300]&L:AAPL20221118C200&S:AAPL20221118C3003.2151793.0
MSFT[MSFT20230120C420][MSFT20230120C450]&L:MSFT20230120C420&S:MSFT20230120C4501.40051337.5
2022-01-31AAPL[AAPL20221118C200][AAPL20221118C300]&L:AAPL20221118C200&S:AAPL20221118C3003.2151877.5
HD[HD20230120C450][HD20230120C460]&L:HD20230120C450&S:HD20230120C4600.4504510.0
MSFT[MSFT20230120C420][MSFT20230120C450]&L:MSFT20230120C420&S:MSFT20230120C4501.40051237.5
2022-02-01AAPL[AAPL20221118C200][AAPL20221118C300]&L:AAPL20221118C200&S:AAPL20221118C3003.2151866.5
COST[COST20230120C680][COST20230120C740]&L:COST20230120C680&S:COST20230120C7403.7502680.0
HD[HD20230120C450][HD20230120C460]&L:HD20230120C450&S:HD20230120C4600.4504510.0
MSFT[MSFT20230120C420][MSFT20230120C450]&L:MSFT20230120C420&S:MSFT20230120C4501.40051062.5
2022-02-02AAPL[AAPL20221118C200][AAPL20221118C300]&L:AAPL20221118C200&S:AAPL20221118C3003.2151858.5
COST[COST20230120C680][COST20230120C740]&L:COST20230120C680&S:COST20230120C7403.7502920.0
HD[HD20230120C450][HD20230120C460]&L:HD20230120C450&S:HD20230120C4600.4504710.0
MSFT[MSFT20230120C420][MSFT20230120C450]&L:MSFT20230120C420&S:MSFT20230120C4501.40051150.0
2022-02-03AAPL[AAPL20221118C200][AAPL20221118C300]&L:AAPL20221118C200&S:AAPL20221118C3003.2151830.0
COST[COST20230120C680][COST20230120C740]&L:COST20230120C680&S:COST20230120C7403.7502755.0
HD[HD20230120C450][HD20230120C460]&L:HD20230120C450&S:HD20230120C4600.4504640.0
MSFT[MSFT20230120C420][MSFT20230120C450]&L:MSFT20230120C420&S:MSFT20230120C4501.4005960.0
2022-02-04AAPL[AAPL20221118C200][AAPL20221118C300]&L:AAPL20221118C200&S:AAPL20221118C3003.2151800.0
COST[COST20230120C680][COST20230120C740]&L:COST20230120C680&S:COST20230120C7403.7502950.0
HD[HD20230120C450][HD20230120C460]&L:HD20230120C450&S:HD20230120C4600.4504560.0
MSFT[MSFT20230120C420][MSFT20230120C450]&L:MSFT20230120C420&S:MSFT20230120C4501.4005972.5
2022-02-07AAPL[AAPL20221118C200][AAPL20221118C300]&L:AAPL20221118C200&S:AAPL20221118C3003.2151777.0
COST[COST20230120C680][COST20230120C740]&L:COST20230120C680&S:COST20230120C7403.75021080.0
HD[HD20230120C450][HD20230120C460]&L:HD20230120C450&S:HD20230120C4600.4504460.0
MSFT[MSFT20230120C420][MSFT20230120C450]&L:MSFT20230120C420&S:MSFT20230120C4501.4005825.0
2022-02-08AAPL[AAPL20221118C200][AAPL20221118C300]&L:AAPL20221118C200&S:AAPL20221118C3003.2151846.0
COST[COST20230120C680][COST20230120C740]&L:COST20230120C680&S:COST20230120C7403.7502960.0
HD[HD20230120C450][HD20230120C460]&L:HD20230120C450&S:HD20230120C4600.4504550.0
MSFT[MSFT20230120C420][MSFT20230120C450]&L:MSFT20230120C420&S:MSFT20230120C4501.4005927.5
2022-02-09AAPL[AAPL20221118C200][AAPL20221118C300]&L:AAPL20221118C200&S:AAPL20221118C3003.2151851.5
COST[COST20230120C680][COST20230120C740]&L:COST20230120C680&S:COST20230120C7403.75021035.0
HD[HD20230120C450][HD20230120C460]&L:HD20230120C450&S:HD20230120C4600.4504610.0
MSFT[MSFT20230120C420][MSFT20230120C450]&L:MSFT20230120C420&S:MSFT20230120C4501.4005845.0
2022-02-10AAPL[AAPL20221118C200][AAPL20221118C300]&L:AAPL20221118C200&S:AAPL20221118C3003.2151768.0
COST[COST20230120C680][COST20230120C740]&L:COST20230120C680&S:COST20230120C7403.7502780.0
HD[HD20230120C450][HD20230120C460]&L:HD20230120C450&S:HD20230120C4600.4504600.0
MSFT[MSFT20230120C420][MSFT20230120C450]&L:MSFT20230120C420&S:MSFT20230120C4501.4005660.0
2022-02-11AAPL[AAPL20221118C200][AAPL20221118C300]&L:AAPL20221118C200&S:AAPL20221118C3003.2151681.0
COST[COST20230120C680][COST20230120C740]&L:COST20230120C680&S:COST20230120C7403.7502875.0
HD[HD20230120C450][HD20230120C460]&L:HD20230120C450&S:HD20230120C4600.4504180.0
MU[MU20230120C120][MU20230120C130]&L:MU20230120C120&S:MU20230120C1301.4503555.0
MSFT[MSFT20230120C420][MSFT20230120C450]&L:MSFT20230120C420&S:MSFT20230120C4501.4005700.0
2022-02-14AAPL[AAPL20221118C200][AAPL20221118C300]&L:AAPL20221118C200&S:AAPL20221118C3003.2151694.0
COST[COST20230120C680][COST20230120C740]&L:COST20230120C680&S:COST20230120C7403.75021355.0
MU[MU20230120C120][MU20230120C130]&L:MU20230120C120&S:MU20230120C1301.4503480.0
2022-02-15AAPL[AAPL20221118C200][AAPL20221118C300]&L:AAPL20221118C200&S:AAPL20221118C3003.2151772.0
COST[COST20230120C680][COST20230120C740]&L:COST20230120C680&S:COST20230120C7403.7502945.0
MU[MU20230120C120][MU20230120C130]&L:MU20230120C120&S:MU20230120C1301.4503622.5
2022-02-16AAPL[AAPL20221118C200][AAPL20221118C300]&L:AAPL20221118C200&S:AAPL20221118C3003.2151723.5
COST[COST20230120C680][COST20230120C740]&L:COST20230120C680&S:COST20230120C7403.7502880.0
MU[MU20230120C120][MU20230120C130]&L:MU20230120C120&S:MU20230120C1301.4503570.0
2022-02-17AAPL[AAPL20221118C200][AAPL20221118C300]&L:AAPL20221118C200&S:AAPL20221118C3003.2151654.0
COST[COST20230120C680][COST20230120C740]&L:COST20230120C680&S:COST20230120C7403.7502895.0
MU[MU20230120C120][MU20230120C130]&L:MU20230120C120&S:MU20230120C1301.4503592.5
2022-02-18AAPL[AAPL20221118C200][AAPL20221118C300]&L:AAPL20221118C200&S:AAPL20221118C3003.2151594.5
COST[COST20230120C680][COST20230120C740]&L:COST20230120C680&S:COST20230120C7403.7502887.0
MU[MU20230120C120][MU20230120C130]&L:MU20230120C120&S:MU20230120C1301.4503562.5
2022-02-21AAPL[AAPL20221118C200][AAPL20221118C300]&L:AAPL20221118C200&S:AAPL20221118C3003.2151538.0
COST[COST20230120C680][COST20230120C740]&L:COST20230120C680&S:COST20230120C7403.7502615.0
MU[MU20230120C120][MU20230120C130]&L:MU20230120C120&S:MU20230120C1301.4503517.5
2022-02-22AAPL[AAPL20221118C200][AAPL20221118C300]&L:AAPL20221118C200&S:AAPL20221118C3003.2151538.0
COST[COST20230120C680][COST20230120C740]&L:COST20230120C680&S:COST20230120C7403.7502615.0
MU[MU20230120C120][MU20230120C130]&L:MU20230120C120&S:MU20230120C1301.4503517.5
2022-02-23AAPL[AAPL20221118C200][AAPL20221118C300]&L:AAPL20221118C200&S:AAPL20221118C3003.2151420.0
COST[COST20230120C680][COST20230120C740]&L:COST20230120C680&S:COST20230120C7403.7502750.0
MU[MU20230120C120][MU20230120C130]&L:MU20230120C120&S:MU20230120C1301.4503487.5
2022-02-24AAPL[AAPL20221118C200][AAPL20221118C300]&L:AAPL20221118C200&S:AAPL20221118C3003.2151400.0
MU[MU20230120C120][MU20230120C130]&L:MU20230120C120&S:MU20230120C1301.4503420.0
2022-02-25AAPL[AAPL20221118C200][AAPL20221118C300]&L:AAPL20221118C200&S:AAPL20221118C3003.2151472.5
MU[MU20230120C120][MU20230120C130]&L:MU20230120C120&S:MU20230120C1301.4503502.5
2022-02-28AAPL[AAPL20221118C200][AAPL20221118C300]&L:AAPL20221118C200&S:AAPL20221118C3003.2151494.0
MU[MU20230120C120][MU20230120C130]&L:MU20230120C120&S:MU20230120C1301.4503502.5
GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751177.5
2022-03-01AAPL[AAPL20221118C200][AAPL20221118C300]&L:AAPL20221118C200&S:AAPL20221118C3003.2151527.5
MU[MU20230120C120][MU20230120C130]&L:MU20230120C120&S:MU20230120C1301.4503292.5
GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751207.5
2022-03-02AAPL[AAPL20221118C200][AAPL20221118C300]&L:AAPL20221118C200&S:AAPL20221118C3003.2151549.5
MU[MU20230120C120][MU20230120C130]&L:MU20230120C120&S:MU20230120C1301.4503607.5
GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751195.0
2022-03-03AAPL[AAPL20221118C200][AAPL20221118C300]&L:AAPL20221118C200&S:AAPL20221118C3003.2151577.0
MU[MU20230120C120][MU20230120C130]&L:MU20230120C120&S:MU20230120C1301.4503435.0
GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751210.0
2022-03-04AAPL[AAPL20221118C200][AAPL20221118C300]&L:AAPL20221118C200&S:AAPL20221118C3003.2151521.0
GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751240.0
2022-03-07AAPL[AAPL20221118C200][AAPL20221118C300]&L:AAPL20221118C200&S:AAPL20221118C3003.2151448.5
GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751257.5
2022-03-08AAPL[AAPL20221118C200][AAPL20221118C300]&L:AAPL20221118C200&S:AAPL20221118C3003.2151361.5
GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751292.5
2022-03-09AAPL[AAPL20221118C200][AAPL20221118C300]&L:AAPL20221118C200&S:AAPL20221118C3003.2151458.5
GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751247.5
2022-03-10AAPL[AAPL20221118C200][AAPL20221118C300]&L:AAPL20221118C200&S:AAPL20221118C3003.2151384.5
GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751250.0
2022-03-11AAPL[AAPL20221118C200][AAPL20221118C300]&L:AAPL20221118C200&S:AAPL20221118C3003.2151321.5
GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751240.0
2022-03-14GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751215.0
2022-03-15GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751187.5
2022-03-16GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751192.5
2022-03-17AAPL[AAPL20230120C160][AAPL20230120C175]&L:AAPL20230120C160&S:AAPL20230120C1757.2001590.0
GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751200.0
2022-03-18AAPL[AAPL20230120C160][AAPL20230120C175]&L:AAPL20230120C160&S:AAPL20230120C1757.2001730.0
GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751187.5
2022-03-21AAPL[AAPL20230120C160][AAPL20230120C175]&L:AAPL20230120C160&S:AAPL20230120C1757.2001757.5
GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751197.5
2022-03-22AAPL[AAPL20230120C160][AAPL20230120C175]&L:AAPL20230120C160&S:AAPL20230120C1757.2001817.5
GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751185.0
TSLA[TSLA20230120C1825][TSLA20230120C1850]&L:TSLA20230120C1825&S:TSLA20230120C18501.52591575.0
2022-03-23AAPL[AAPL20230120C160][AAPL20230120C175]&L:AAPL20230120C160&S:AAPL20230120C1757.2001807.5
GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751207.5
TSLA[TSLA20230120C1825][TSLA20230120C1850]&L:TSLA20230120C1825&S:TSLA20230120C18501.52591867.5
2022-03-24AAPL[AAPL20230120C160][AAPL20230120C175]&L:AAPL20230120C160&S:AAPL20230120C1757.2001847.5
GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751215.0
TSLA[TSLA20230120C1825][TSLA20230120C1850]&L:TSLA20230120C1825&S:TSLA20230120C18501.52591845.0
2022-03-25AAPL[AAPL20230120C160][AAPL20230120C175]&L:AAPL20230120C160&S:AAPL20230120C1757.2001860.0
GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751215.0
TSLA[TSLA20230120C1825][TSLA20230120C1850]&L:TSLA20230120C1825&S:TSLA20230120C18501.52591822.5
2022-03-28AAPL[AAPL20230120C160][AAPL20230120C175]&L:AAPL20230120C160&S:AAPL20230120C1757.2001855.0
GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751185.0
TSLA[TSLA20230120C1825][TSLA20230120C1850]&L:TSLA20230120C1825&S:TSLA20230120C18501.52592520.0
2022-03-29AAPL[AAPL20230120C160][AAPL20230120C175]&L:AAPL20230120C160&S:AAPL20230120C1757.2001920.0
GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751177.5
TSLA[TSLA20230120C1825][TSLA20230120C1850]&L:TSLA20230120C1825&S:TSLA20230120C18501.52592520.0
2022-03-30AAPL[AAPL20230120C160][AAPL20230120C175]&L:AAPL20230120C160&S:AAPL20230120C1757.2001880.0
GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751192.5
TSLA[TSLA20230120C1825][TSLA20230120C1850]&L:TSLA20230120C1825&S:TSLA20230120C18501.52592430.0
2022-03-31AAPL[AAPL20230120C160][AAPL20230120C175]&L:AAPL20230120C160&S:AAPL20230120C1757.2001922.5
GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751195.0
TSLA[TSLA20230120C1825][TSLA20230120C1850]&L:TSLA20230120C1825&S:TSLA20230120C18501.52592340.0
2022-04-01AAPL[AAPL20230120C160][AAPL20230120C175]&L:AAPL20230120C160&S:AAPL20230120C1757.2001867.5
GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751180.0
TSLA[TSLA20230120C1825][TSLA20230120C1850]&L:TSLA20230120C1825&S:TSLA20230120C18501.52592340.0
2022-04-04AAPL[AAPL20230120C160][AAPL20230120C175]&L:AAPL20230120C160&S:AAPL20230120C1757.2001937.5
GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751182.5
TSLA[TSLA20230120C1825][TSLA20230120C1850]&L:TSLA20230120C1825&S:TSLA20230120C18501.52592880.0
2022-04-05AAPL[AAPL20230120C160][AAPL20230120C175]&L:AAPL20230120C160&S:AAPL20230120C1757.2001867.5
COST[COST20230120C680][COST20230120C700]&L:COST20230120C680&S:COST20230120C7003.4001372.5
GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751167.5
TSLA[TSLA20230120C1825][TSLA20230120C1850]&L:TSLA20230120C1825&S:TSLA20230120C18501.52592722.5
2022-04-06AAPL[AAPL20230120C160][AAPL20230120C175]&L:AAPL20230120C160&S:AAPL20230120C1757.2001822.5
COST[COST20230120C680][COST20230120C700]&L:COST20230120C680&S:COST20230120C7003.4001410.0
GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751172.5
TSLA[TSLA20230120C1825][TSLA20230120C1850]&L:TSLA20230120C1825&S:TSLA20230120C18501.52592092.5
2022-04-07AAPL[AAPL20230120C160][AAPL20230120C175]&L:AAPL20230120C160&S:AAPL20230120C1757.2001817.5
COST[COST20230120C680][COST20230120C700]&L:COST20230120C680&S:COST20230120C7003.4001482.5
GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751177.5
TSLA[TSLA20230120C1825][TSLA20230120C1850]&L:TSLA20230120C1825&S:TSLA20230120C18501.52592160.0
2022-04-08AAPL[AAPL20230120C160][AAPL20230120C175]&L:AAPL20230120C160&S:AAPL20230120C1757.2001805.0
COST[COST20230120C680][COST20230120C700]&L:COST20230120C680&S:COST20230120C7003.4001555.0
GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751187.5
TSLA[TSLA20230120C1825][TSLA20230120C1850]&L:TSLA20230120C1825&S:TSLA20230120C18501.52591890.0
2022-04-11AAPL[AAPL20230120C160][AAPL20230120C175]&L:AAPL20230120C160&S:AAPL20230120C1757.2001837.5
COST[COST20230120C680][COST20230120C700]&L:COST20230120C680&S:COST20230120C7003.4001462.5
GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751195.0
TSLA[TSLA20230120C1825][TSLA20230120C1850]&L:TSLA20230120C1825&S:TSLA20230120C18501.52591957.5
2022-04-12AAPL[AAPL20230120C160][AAPL20230120C175]&L:AAPL20230120C160&S:AAPL20230120C1757.2001782.5
COST[COST20230120C680][COST20230120C700]&L:COST20230120C680&S:COST20230120C7003.4001397.5
GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751210.0
TSLA[TSLA20230120C1825][TSLA20230120C1850]&L:TSLA20230120C1825&S:TSLA20230120C18501.52591462.5
2022-04-13AAPL[AAPL20230120C160][AAPL20230120C175]&L:AAPL20230120C160&S:AAPL20230120C1757.2001810.0
COST[COST20230120C680][COST20230120C700]&L:COST20230120C680&S:COST20230120C7003.4001452.5
GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751217.5
TSLA[TSLA20230120C1825][TSLA20230120C1850]&L:TSLA20230120C1825&S:TSLA20230120C18501.52591732.5
2022-04-14AAPL[AAPL20230120C160][AAPL20230120C175]&L:AAPL20230120C160&S:AAPL20230120C1757.2001747.5
COST[COST20230120C680][COST20230120C700]&L:COST20230120C680&S:COST20230120C7003.4001512.5
GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751217.5
TSLA[TSLA20230120C1825][TSLA20230120C1850]&L:TSLA20230120C1825&S:TSLA20230120C18501.52591732.5
2022-04-15AAPL[AAPL20230120C160][AAPL20230120C175]&L:AAPL20230120C160&S:AAPL20230120C1757.2001747.5
COST[COST20230120C680][COST20230120C700]&L:COST20230120C680&S:COST20230120C7003.4001512.5
GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751217.5
TSLA[TSLA20230120C1825][TSLA20230120C1850]&L:TSLA20230120C1825&S:TSLA20230120C18501.52591732.5
2022-04-18AAPL[AAPL20230120C160][AAPL20230120C175]&L:AAPL20230120C160&S:AAPL20230120C1757.2001745.0
COST[COST20230120C680][COST20230120C700]&L:COST20230120C680&S:COST20230120C7003.4001405.0
GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751220.0
TSLA[TSLA20230120C1825][TSLA20230120C1850]&L:TSLA20230120C1825&S:TSLA20230120C18501.52591485.0
2022-04-19AAPL[AAPL20230120C160][AAPL20230120C175]&L:AAPL20230120C160&S:AAPL20230120C1757.2001762.5
COST[COST20230120C680][COST20230120C700]&L:COST20230120C680&S:COST20230120C7003.4001482.5
GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751195.0
TSLA[TSLA20230120C1825][TSLA20230120C1850]&L:TSLA20230120C1825&S:TSLA20230120C18501.52591620.0
2022-04-20AAPL[AAPL20230120C160][AAPL20230120C175]&L:AAPL20230120C160&S:AAPL20230120C1757.2001777.5
COST[COST20230120C680][COST20230120C700]&L:COST20230120C680&S:COST20230120C7003.4001540.0
GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751190.0
TSLA[TSLA20230120C1825][TSLA20230120C1850]&L:TSLA20230120C1825&S:TSLA20230120C18501.52591350.0
2022-04-21AAPL[AAPL20230120C160][AAPL20230120C175]&L:AAPL20230120C160&S:AAPL20230120C1757.2001795.0
COST[COST20230120C680][COST20230120C700]&L:COST20230120C680&S:COST20230120C7003.4001460.0
GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751197.5
TSLA[TSLA20230120C1825][TSLA20230120C1850]&L:TSLA20230120C1825&S:TSLA20230120C18501.52591597.5
2022-04-22AAPL[AAPL20230120C160][AAPL20230120C175]&L:AAPL20230120C160&S:AAPL20230120C1757.2001702.5
COST[COST20230120C680][COST20230120C700]&L:COST20230120C680&S:COST20230120C7003.4001435.0
GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751185.0
TSLA[TSLA20230120C1825][TSLA20230120C1850]&L:TSLA20230120C1825&S:TSLA20230120C18501.5259967.5
2022-04-25AAPL[AAPL20230120C160][AAPL20230120C175]&L:AAPL20230120C160&S:AAPL20230120C1757.2001720.0
COST[COST20230120C680][COST20230120C700]&L:COST20230120C680&S:COST20230120C7003.4001405.0
GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751150.0
TSLA[TSLA20230120C1825][TSLA20230120C1850]&L:TSLA20230120C1825&S:TSLA20230120C18501.52591372.5
2022-04-26COST[COST20230120C680][COST20230120C700]&L:COST20230120C680&S:COST20230120C7003.4001282.5
GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751197.5
2022-04-27COST[COST20230120C680][COST20230120C700]&L:COST20230120C680&S:COST20230120C7003.4001325.0
GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751145.0
2022-04-28COST[COST20230120C680][COST20230120C700]&L:COST20230120C680&S:COST20230120C7003.4001340.0
GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751152.5
2022-04-29GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751155.0
2022-05-02GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751132.5
2022-05-03GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751132.5
2022-05-04GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751145.0
2022-05-05GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751137.5
2022-05-06GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751142.5
2022-05-09GLD[GLD20221230C195][GLD20221230C205]&L:GLD20221230C195&S:GLD20221230C2051.2751127.5
2022-08-10AAPL[AAPL20230616C180][AAPL20230616C195]&L:AAPL20230616C180&S:AAPL20230616C1955.2501562.5
2022-08-11AAPL[AAPL20230616C180][AAPL20230616C195]&L:AAPL20230616C180&S:AAPL20230616C1955.2501557.5
2022-08-12AAPL[AAPL20230616C180][AAPL20230616C195]&L:AAPL20230616C180&S:AAPL20230616C1955.2501600.0
2022-08-15AAPL[AAPL20230616C180][AAPL20230616C195]&L:AAPL20230616C180&S:AAPL20230616C1955.2501630.0
2022-08-16AAPL[AAPL20230616C180][AAPL20230616C195]&L:AAPL20230616C180&S:AAPL20230616C1955.2501620.0
2022-08-17AAPL[AAPL20230616C180][AAPL20230616C195]&L:AAPL20230616C180&S:AAPL20230616C1955.2501642.5
2022-08-18AAPL[AAPL20230616C180][AAPL20230616C195]&L:AAPL20230616C180&S:AAPL20230616C1955.2501635.0
2022-08-19AAPL[AAPL20230616C180][AAPL20230616C195]&L:AAPL20230616C180&S:AAPL20230616C1955.2501602.5
2022-08-22AAPL[AAPL20230616C180][AAPL20230616C195]&L:AAPL20230616C180&S:AAPL20230616C1955.2501552.5
2022-08-23AAPL[AAPL20230616C180][AAPL20230616C195]&L:AAPL20230616C180&S:AAPL20230616C1955.2501540.0
2022-08-24AAPL[AAPL20230616C180][AAPL20230616C195]&L:AAPL20230616C180&S:AAPL20230616C1955.2501550.0
2022-08-25AAPL[AAPL20230616C180][AAPL20230616C195]&L:AAPL20230616C180&S:AAPL20230616C1955.2501577.5
2022-08-26AAPL[AAPL20230616C180][AAPL20230616C195]&L:AAPL20230616C180&S:AAPL20230616C1955.2501525.0
2022-11-04CAT[CAT20230616C250][CAT20230616C260]&L:CAT20230616C250&S:CAT20230616C2604.1751317.5
2022-11-07CAT[CAT20230616C250][CAT20230616C260]&L:CAT20230616C250&S:CAT20230616C2604.1751335.0
2022-11-08CAT[CAT20230616C250][CAT20230616C260]&L:CAT20230616C250&S:CAT20230616C2604.1751357.5
2022-11-09CAT[CAT20230616C250][CAT20230616C260]&L:CAT20230616C250&S:CAT20230616C2604.1751332.5
2022-11-10CAT[CAT20230616C250][CAT20230616C260]&L:CAT20230616C250&S:CAT20230616C2604.1751367.5
2022-11-11CAT[CAT20230616C250][CAT20230616C260]&L:CAT20230616C250&S:CAT20230616C2604.1751397.5
2022-11-14CAT[CAT20230616C250][CAT20230616C260]&L:CAT20230616C250&S:CAT20230616C2604.1751395.0
2022-11-15CAT[CAT20230616C250][CAT20230616C260]&L:CAT20230616C250&S:CAT20230616C2604.1751385.0
2022-11-16CAT[CAT20230616C250][CAT20230616C260]&L:CAT20230616C250&S:CAT20230616C2604.1751357.5
BA[BA20230616C220][BA20230616C230]&L:BA20230616C220&S:BA20230616C2302.5753570.0
2022-11-17CAT[CAT20230616C250][CAT20230616C260]&L:CAT20230616C250&S:CAT20230616C2604.1751367.5
BA[BA20230616C220][BA20230616C230]&L:BA20230616C220&S:BA20230616C2302.5753547.5
2022-11-18CAT[CAT20230616C250][CAT20230616C260]&L:CAT20230616C250&S:CAT20230616C2604.1751367.5
BA[BA20230616C220][BA20230616C230]&L:BA20230616C220&S:BA20230616C2302.5753540.0
2022-11-21CAT[CAT20230616C250][CAT20230616C260]&L:CAT20230616C250&S:CAT20230616C2604.1751365.0
BA[BA20230616C220][BA20230616C230]&L:BA20230616C220&S:BA20230616C2302.5753555.0
2022-11-22CAT[CAT20230616C250][CAT20230616C260]&L:CAT20230616C250&S:CAT20230616C2604.1751412.5
BA[BA20230616C220][BA20230616C230]&L:BA20230616C220&S:BA20230616C2302.5753502.5
2022-11-23CAT[CAT20230616C250][CAT20230616C260]&L:CAT20230616C250&S:CAT20230616C2604.1751395.0
BA[BA20230616C220][BA20230616C230]&L:BA20230616C220&S:BA20230616C2302.5753525.0
2022-11-24CAT[CAT20230616C250][CAT20230616C260]&L:CAT20230616C250&S:CAT20230616C2604.1751395.0
BA[BA20230616C220][BA20230616C230]&L:BA20230616C220&S:BA20230616C2302.5753600.0
2022-11-25CAT[CAT20230616C250][CAT20230616C260]&L:CAT20230616C250&S:CAT20230616C2604.1751422.5
BA[BA20230616C220][BA20230616C230]&L:BA20230616C220&S:BA20230616C2302.5753600.0
2022-11-28CAT[CAT20230616C250][CAT20230616C260]&L:CAT20230616C250&S:CAT20230616C2604.1751375.0
BA[BA20230616C220][BA20230616C230]&L:BA20230616C220&S:BA20230616C2302.5753517.5
2022-11-29CAT[CAT20230616C250][CAT20230616C260]&L:CAT20230616C250&S:CAT20230616C2604.1751390.0
BA[BA20230616C220][BA20230616C230]&L:BA20230616C220&S:BA20230616C2302.5753570.0
2022-11-30CAT[CAT20230616C250][CAT20230616C260]&L:CAT20230616C250&S:CAT20230616C2604.1751382.5
BA[BA20230616C220][BA20230616C230]&L:BA20230616C220&S:BA20230616C2302.5753645.0
2022-12-01CAT[CAT20230616C250][CAT20230616C260]&L:CAT20230616C250&S:CAT20230616C2604.1751392.5
BA[BA20230616C220][BA20230616C230]&L:BA20230616C220&S:BA20230616C2302.5753532.5
2022-12-02CAT[CAT20230616C250][CAT20230616C260]&L:CAT20230616C250&S:CAT20230616C2604.1751395.0
BA[BA20230616C220][BA20230616C230]&L:BA20230616C220&S:BA20230616C2302.5753682.5
2022-12-05CAT[CAT20230616C250][CAT20230616C260]&L:CAT20230616C250&S:CAT20230616C2604.1751370.0
BA[BA20230616C220][BA20230616C230]&L:BA20230616C220&S:BA20230616C2302.5753727.5
2022-12-06CAT[CAT20230616C250][CAT20230616C260]&L:CAT20230616C250&S:CAT20230616C2604.1751337.5
BA[BA20230616C220][BA20230616C230]&L:BA20230616C220&S:BA20230616C2302.5753585.0
2022-12-07CAT[CAT20230616C250][CAT20230616C260]&L:CAT20230616C250&S:CAT20230616C2604.1751327.5
BA[BA20230616C220][BA20230616C230]&L:BA20230616C220&S:BA20230616C2302.5753577.5
2022-12-08CAT[CAT20230616C250][CAT20230616C260]&L:CAT20230616C250&S:CAT20230616C2604.1751342.5
BA[BA20230616C220][BA20230616C230]&L:BA20230616C220&S:BA20230616C2302.5753600.0
2022-12-09CAT[CAT20230616C250][CAT20230616C260]&L:CAT20230616C250&S:CAT20230616C2604.1751315.0
BA[BA20230616C220][BA20230616C230]&L:BA20230616C220&S:BA20230616C2302.5753607.5
2022-12-12CAT[CAT20230616C250][CAT20230616C260]&L:CAT20230616C250&S:CAT20230616C2604.1751382.5
BA[BA20230616C220][BA20230616C230]&L:BA20230616C220&S:BA20230616C2302.5753765.0
2022-12-13CAT[CAT20230616C250][CAT20230616C260]&L:CAT20230616C250&S:CAT20230616C2604.1751370.0
BA[BA20230616C220][BA20230616C230]&L:BA20230616C220&S:BA20230616C2302.5753742.5
2022-12-14CAT[CAT20230616C250][CAT20230616C260]&L:CAT20230616C250&S:CAT20230616C2604.1751375.0
BA[BA20230616C220][BA20230616C230]&L:BA20230616C220&S:BA20230616C2302.5753780.0
2022-12-15CAT[CAT20230616C250][CAT20230616C260]&L:CAT20230616C250&S:CAT20230616C2604.1751352.5
BA[BA20230616C220][BA20230616C230]&L:BA20230616C220&S:BA20230616C2302.5753682.5
2022-12-16CAT[CAT20230616C250][CAT20230616C260]&L:CAT20230616C250&S:CAT20230616C2604.1751352.5
BA[BA20230616C220][BA20230616C230]&L:BA20230616C220&S:BA20230616C2302.5753727.5
2022-12-19CAT[CAT20230616C250][CAT20230616C260]&L:CAT20230616C250&S:CAT20230616C2604.1751362.5
BA[BA20230616C220][BA20230616C230]&L:BA20230616C220&S:BA20230616C2302.5753720.0
2022-12-20CAT[CAT20230616C250][CAT20230616C260]&L:CAT20230616C250&S:CAT20230616C2604.1751372.5
BA[BA20230616C220][BA20230616C230]&L:BA20230616C220&S:BA20230616C2302.5753765.0
2022-12-21CAT[CAT20230616C250][CAT20230616C260]&L:CAT20230616C250&S:CAT20230616C2604.1751432.5
BA[BA20230616C220][BA20230616C230]&L:BA20230616C220&S:BA20230616C2302.5753930.0
2022-12-22CAT[CAT20230616C250][CAT20230616C260]&L:CAT20230616C250&S:CAT20230616C2604.1751392.5
BA[BA20230616C220][BA20230616C230]&L:BA20230616C220&S:BA20230616C2302.5753802.5
2022-12-23CAT[CAT20230616C250][CAT20230616C260]&L:CAT20230616C250&S:CAT20230616C2604.1751410.0
BA[BA20230616C220][BA20230616C230]&L:BA20230616C220&S:BA20230616C2302.5753795.0
2022-12-26CAT[CAT20230616C250][CAT20230616C260]&L:CAT20230616C250&S:CAT20230616C2604.1751435.0
BA[BA20230616C220][BA20230616C230]&L:BA20230616C220&S:BA20230616C2302.5753780.0
2022-12-27CAT[CAT20230616C250][CAT20230616C260]&L:CAT20230616C250&S:CAT20230616C2604.1751435.0
BA[BA20230616C220][BA20230616C230]&L:BA20230616C220&S:BA20230616C2302.5753780.0
2022-12-28CAT[CAT20230616C250][CAT20230616C260]&L:CAT20230616C250&S:CAT20230616C2604.1751407.5
BA[BA20230616C220][BA20230616C230]&L:BA20230616C220&S:BA20230616C2302.5753765.0
2022-12-29CAT[CAT20230616C250][CAT20230616C260]&L:CAT20230616C250&S:CAT20230616C2604.1751417.5
BA[BA20230616C220][BA20230616C230]&L:BA20230616C220&S:BA20230616C2302.5753772.5
\n", - "
" - ], - "text/plain": [ - " long short \\\n", - "datetime symbol \n", - "2022-01-04 AAPL [AAPL20220916C210] [AAPL20220916C220] \n", - " COST [COST20230120C680] [COST20230120C700] \n", - " MU [MU20220916C100] [MU20220916C105] \n", - "2022-01-05 AAPL [AAPL20220916C210] [AAPL20220916C220] \n", - " COST [COST20230120C680] [COST20230120C700] \n", - " MU [MU20220916C100] [MU20220916C105] \n", - "2022-01-06 COST [COST20230120C680] [COST20230120C700] \n", - " MU [MU20220916C100] [MU20220916C105] \n", - "2022-01-07 MU [MU20220916C100] [MU20220916C105] \n", - "2022-01-10 COST [COST20230120C560] [COST20230120C570] \n", - " MU [MU20220916C100] [MU20220916C105] \n", - "2022-01-11 COST [COST20230120C560] [COST20230120C570] \n", - " MU [MU20220916C100] [MU20220916C105] \n", - "2022-01-12 COST [COST20230120C560] [COST20230120C570] \n", - " MU [MU20220916C100] [MU20220916C105] \n", - "2022-01-13 COST [COST20230120C560] [COST20230120C570] \n", - " MU [MU20220916C100] [MU20220916C105] \n", - "2022-01-14 MU [MU20220916C100] [MU20220916C105] \n", - "2022-01-17 MU [MU20220916C100] [MU20220916C105] \n", - "2022-01-18 COST [COST20230120C540] [COST20230120C550] \n", - " MU [MU20220916C100] [MU20220916C105] \n", - " TSM [TSM20220916C140] [TSM20220916C145] \n", - "2022-01-19 COST [COST20230120C540] [COST20230120C550] \n", - " HD [HD20230120C420] [HD20230120C430] \n", - " MU [MU20220916C100] [MU20220916C105] \n", - " BAC [BAC20221021C42] [BAC20221021C50] \n", - " TSM [TSM20220916C140] [TSM20220916C145] \n", - "2022-01-20 HD [HD20230120C420] [HD20230120C430] \n", - " BAC [BAC20221021C42] [BAC20221021C50] \n", - "2022-01-21 HD [HD20230120C420] [HD20230120C430] \n", - " BAC [BAC20221021C42] [BAC20221021C50] \n", - " TSM [TSM20230120C150] [TSM20220916C145] \n", - " MSFT [MSFT20230120C385] [MSFT20220916C365] \n", - "2022-01-24 TSM [TSM20230120C150] [TSM20220916C145] \n", - "2022-01-25 AAPL [AAPL20221118C200] [AAPL20221118C300] \n", - " TSM [TSM20230120C150] [TSM20220916C145] \n", - "2022-01-26 AAPL [AAPL20221118C200] [AAPL20221118C300] \n", - " TSM [TSM20230120C150] [TSM20220916C145] \n", - "2022-01-27 AAPL [AAPL20221118C200] [AAPL20221118C300] \n", - " MSFT [MSFT20230120C420] [MSFT20230120C450] \n", - "2022-01-28 AAPL [AAPL20221118C200] [AAPL20221118C300] \n", - " MSFT [MSFT20230120C420] [MSFT20230120C450] \n", - "2022-01-31 AAPL [AAPL20221118C200] [AAPL20221118C300] \n", - " HD [HD20230120C450] [HD20230120C460] \n", - " MSFT [MSFT20230120C420] [MSFT20230120C450] \n", - "2022-02-01 AAPL [AAPL20221118C200] [AAPL20221118C300] \n", - " COST [COST20230120C680] [COST20230120C740] \n", - " HD [HD20230120C450] [HD20230120C460] \n", - " MSFT [MSFT20230120C420] [MSFT20230120C450] \n", - "2022-02-02 AAPL [AAPL20221118C200] [AAPL20221118C300] \n", - " COST [COST20230120C680] [COST20230120C740] \n", - " HD [HD20230120C450] [HD20230120C460] \n", - " MSFT [MSFT20230120C420] [MSFT20230120C450] \n", - "2022-02-03 AAPL [AAPL20221118C200] [AAPL20221118C300] \n", - " COST [COST20230120C680] [COST20230120C740] \n", - " HD [HD20230120C450] [HD20230120C460] \n", - " MSFT [MSFT20230120C420] [MSFT20230120C450] \n", - "2022-02-04 AAPL [AAPL20221118C200] [AAPL20221118C300] \n", - " COST [COST20230120C680] [COST20230120C740] \n", - " HD [HD20230120C450] [HD20230120C460] \n", - " MSFT [MSFT20230120C420] [MSFT20230120C450] \n", - "2022-02-07 AAPL [AAPL20221118C200] [AAPL20221118C300] \n", - " COST [COST20230120C680] [COST20230120C740] \n", - " HD [HD20230120C450] [HD20230120C460] \n", - " MSFT [MSFT20230120C420] [MSFT20230120C450] \n", - "2022-02-08 AAPL [AAPL20221118C200] [AAPL20221118C300] \n", - " COST [COST20230120C680] [COST20230120C740] \n", - " HD [HD20230120C450] [HD20230120C460] \n", - " MSFT [MSFT20230120C420] [MSFT20230120C450] \n", - "2022-02-09 AAPL [AAPL20221118C200] [AAPL20221118C300] \n", - " COST [COST20230120C680] [COST20230120C740] \n", - " HD [HD20230120C450] [HD20230120C460] \n", - " MSFT [MSFT20230120C420] [MSFT20230120C450] \n", - "2022-02-10 AAPL [AAPL20221118C200] [AAPL20221118C300] \n", - " COST [COST20230120C680] [COST20230120C740] \n", - " HD [HD20230120C450] [HD20230120C460] \n", - " MSFT [MSFT20230120C420] [MSFT20230120C450] \n", - "2022-02-11 AAPL [AAPL20221118C200] [AAPL20221118C300] \n", - " COST [COST20230120C680] [COST20230120C740] \n", - " HD [HD20230120C450] [HD20230120C460] \n", - " MU [MU20230120C120] [MU20230120C130] \n", - " MSFT [MSFT20230120C420] [MSFT20230120C450] \n", - "2022-02-14 AAPL [AAPL20221118C200] [AAPL20221118C300] \n", - " COST [COST20230120C680] [COST20230120C740] \n", - " MU [MU20230120C120] [MU20230120C130] \n", - "2022-02-15 AAPL [AAPL20221118C200] [AAPL20221118C300] \n", - " COST [COST20230120C680] [COST20230120C740] \n", - " MU [MU20230120C120] [MU20230120C130] \n", - "2022-02-16 AAPL [AAPL20221118C200] [AAPL20221118C300] \n", - " COST [COST20230120C680] [COST20230120C740] \n", - " MU [MU20230120C120] [MU20230120C130] \n", - "2022-02-17 AAPL [AAPL20221118C200] [AAPL20221118C300] \n", - " COST [COST20230120C680] [COST20230120C740] \n", - " MU [MU20230120C120] [MU20230120C130] \n", - "2022-02-18 AAPL [AAPL20221118C200] [AAPL20221118C300] \n", - " COST [COST20230120C680] [COST20230120C740] \n", - " MU [MU20230120C120] [MU20230120C130] \n", - "2022-02-21 AAPL [AAPL20221118C200] [AAPL20221118C300] \n", - " COST [COST20230120C680] [COST20230120C740] \n", - " MU [MU20230120C120] [MU20230120C130] \n", - "2022-02-22 AAPL [AAPL20221118C200] [AAPL20221118C300] \n", - " COST [COST20230120C680] [COST20230120C740] \n", - " MU [MU20230120C120] [MU20230120C130] \n", - "2022-02-23 AAPL [AAPL20221118C200] [AAPL20221118C300] \n", - " COST [COST20230120C680] [COST20230120C740] \n", - " MU [MU20230120C120] [MU20230120C130] \n", - "2022-02-24 AAPL [AAPL20221118C200] [AAPL20221118C300] \n", - " MU [MU20230120C120] [MU20230120C130] \n", - "2022-02-25 AAPL [AAPL20221118C200] [AAPL20221118C300] \n", - " MU [MU20230120C120] [MU20230120C130] \n", - "2022-02-28 AAPL [AAPL20221118C200] [AAPL20221118C300] \n", - " MU [MU20230120C120] [MU20230120C130] \n", - " GLD [GLD20221230C195] [GLD20221230C205] \n", - "2022-03-01 AAPL [AAPL20221118C200] [AAPL20221118C300] \n", - " MU [MU20230120C120] [MU20230120C130] \n", - " GLD [GLD20221230C195] [GLD20221230C205] \n", - "2022-03-02 AAPL [AAPL20221118C200] [AAPL20221118C300] \n", - " MU [MU20230120C120] [MU20230120C130] \n", - " GLD [GLD20221230C195] [GLD20221230C205] \n", - "2022-03-03 AAPL [AAPL20221118C200] [AAPL20221118C300] \n", - " MU [MU20230120C120] [MU20230120C130] \n", - " GLD [GLD20221230C195] [GLD20221230C205] \n", - "2022-03-04 AAPL [AAPL20221118C200] [AAPL20221118C300] \n", - " GLD [GLD20221230C195] [GLD20221230C205] \n", - "2022-03-07 AAPL [AAPL20221118C200] [AAPL20221118C300] \n", - " GLD [GLD20221230C195] [GLD20221230C205] \n", - "2022-03-08 AAPL [AAPL20221118C200] [AAPL20221118C300] \n", - " GLD [GLD20221230C195] [GLD20221230C205] \n", - "2022-03-09 AAPL [AAPL20221118C200] [AAPL20221118C300] \n", - " GLD [GLD20221230C195] [GLD20221230C205] \n", - "2022-03-10 AAPL [AAPL20221118C200] [AAPL20221118C300] \n", - " GLD [GLD20221230C195] [GLD20221230C205] \n", - "2022-03-11 AAPL [AAPL20221118C200] [AAPL20221118C300] \n", - " GLD [GLD20221230C195] [GLD20221230C205] \n", - "2022-03-14 GLD [GLD20221230C195] [GLD20221230C205] \n", - "2022-03-15 GLD [GLD20221230C195] [GLD20221230C205] \n", - "2022-03-16 GLD [GLD20221230C195] [GLD20221230C205] \n", - "2022-03-17 AAPL [AAPL20230120C160] [AAPL20230120C175] \n", - " GLD [GLD20221230C195] [GLD20221230C205] \n", - "2022-03-18 AAPL [AAPL20230120C160] [AAPL20230120C175] \n", - " GLD [GLD20221230C195] [GLD20221230C205] \n", - "2022-03-21 AAPL [AAPL20230120C160] [AAPL20230120C175] \n", - " GLD [GLD20221230C195] [GLD20221230C205] \n", - "2022-03-22 AAPL [AAPL20230120C160] [AAPL20230120C175] \n", - " GLD [GLD20221230C195] [GLD20221230C205] \n", - " TSLA [TSLA20230120C1825] [TSLA20230120C1850] \n", - "2022-03-23 AAPL [AAPL20230120C160] [AAPL20230120C175] \n", - " GLD [GLD20221230C195] [GLD20221230C205] \n", - " TSLA [TSLA20230120C1825] [TSLA20230120C1850] \n", - "2022-03-24 AAPL [AAPL20230120C160] [AAPL20230120C175] \n", - " GLD [GLD20221230C195] [GLD20221230C205] \n", - " TSLA [TSLA20230120C1825] [TSLA20230120C1850] \n", - "2022-03-25 AAPL [AAPL20230120C160] [AAPL20230120C175] \n", - " GLD [GLD20221230C195] [GLD20221230C205] \n", - " TSLA [TSLA20230120C1825] [TSLA20230120C1850] \n", - "2022-03-28 AAPL [AAPL20230120C160] [AAPL20230120C175] \n", - " GLD [GLD20221230C195] [GLD20221230C205] \n", - " TSLA [TSLA20230120C1825] [TSLA20230120C1850] \n", - "2022-03-29 AAPL [AAPL20230120C160] [AAPL20230120C175] \n", - " GLD [GLD20221230C195] [GLD20221230C205] \n", - " TSLA [TSLA20230120C1825] [TSLA20230120C1850] \n", - "2022-03-30 AAPL [AAPL20230120C160] [AAPL20230120C175] \n", - " GLD [GLD20221230C195] [GLD20221230C205] \n", - " TSLA [TSLA20230120C1825] [TSLA20230120C1850] \n", - "2022-03-31 AAPL [AAPL20230120C160] [AAPL20230120C175] \n", - " GLD [GLD20221230C195] [GLD20221230C205] \n", - " TSLA [TSLA20230120C1825] [TSLA20230120C1850] \n", - "2022-04-01 AAPL [AAPL20230120C160] [AAPL20230120C175] \n", - " GLD [GLD20221230C195] [GLD20221230C205] \n", - " TSLA [TSLA20230120C1825] [TSLA20230120C1850] \n", - "2022-04-04 AAPL [AAPL20230120C160] [AAPL20230120C175] \n", - " GLD [GLD20221230C195] [GLD20221230C205] \n", - " TSLA [TSLA20230120C1825] [TSLA20230120C1850] \n", - "2022-04-05 AAPL [AAPL20230120C160] [AAPL20230120C175] \n", - " COST [COST20230120C680] [COST20230120C700] \n", - " GLD [GLD20221230C195] [GLD20221230C205] \n", - " TSLA [TSLA20230120C1825] [TSLA20230120C1850] \n", - "2022-04-06 AAPL [AAPL20230120C160] [AAPL20230120C175] \n", - " COST [COST20230120C680] [COST20230120C700] \n", - " GLD [GLD20221230C195] [GLD20221230C205] \n", - " TSLA [TSLA20230120C1825] [TSLA20230120C1850] \n", - "2022-04-07 AAPL [AAPL20230120C160] [AAPL20230120C175] \n", - " COST [COST20230120C680] [COST20230120C700] \n", - " GLD [GLD20221230C195] [GLD20221230C205] \n", - " TSLA [TSLA20230120C1825] [TSLA20230120C1850] \n", - "2022-04-08 AAPL [AAPL20230120C160] [AAPL20230120C175] \n", - " COST [COST20230120C680] [COST20230120C700] \n", - " GLD [GLD20221230C195] [GLD20221230C205] \n", - " TSLA [TSLA20230120C1825] [TSLA20230120C1850] \n", - "2022-04-11 AAPL [AAPL20230120C160] [AAPL20230120C175] \n", - " COST [COST20230120C680] [COST20230120C700] \n", - " GLD [GLD20221230C195] [GLD20221230C205] \n", - " TSLA [TSLA20230120C1825] [TSLA20230120C1850] \n", - "2022-04-12 AAPL [AAPL20230120C160] [AAPL20230120C175] \n", - " COST [COST20230120C680] [COST20230120C700] \n", - " GLD [GLD20221230C195] [GLD20221230C205] \n", - " TSLA [TSLA20230120C1825] [TSLA20230120C1850] \n", - "2022-04-13 AAPL [AAPL20230120C160] [AAPL20230120C175] \n", - " COST [COST20230120C680] [COST20230120C700] \n", - " GLD [GLD20221230C195] [GLD20221230C205] \n", - " TSLA [TSLA20230120C1825] [TSLA20230120C1850] \n", - "2022-04-14 AAPL [AAPL20230120C160] [AAPL20230120C175] \n", - " COST [COST20230120C680] [COST20230120C700] \n", - " GLD [GLD20221230C195] [GLD20221230C205] \n", - " TSLA [TSLA20230120C1825] [TSLA20230120C1850] \n", - "2022-04-15 AAPL [AAPL20230120C160] [AAPL20230120C175] \n", - " COST [COST20230120C680] [COST20230120C700] \n", - " GLD [GLD20221230C195] [GLD20221230C205] \n", - " TSLA [TSLA20230120C1825] [TSLA20230120C1850] \n", - "2022-04-18 AAPL [AAPL20230120C160] [AAPL20230120C175] \n", - " COST [COST20230120C680] [COST20230120C700] \n", - " GLD [GLD20221230C195] [GLD20221230C205] \n", - " TSLA [TSLA20230120C1825] [TSLA20230120C1850] \n", - "2022-04-19 AAPL [AAPL20230120C160] [AAPL20230120C175] \n", - " COST [COST20230120C680] [COST20230120C700] \n", - " GLD [GLD20221230C195] [GLD20221230C205] \n", - " TSLA [TSLA20230120C1825] [TSLA20230120C1850] \n", - "2022-04-20 AAPL [AAPL20230120C160] [AAPL20230120C175] \n", - " COST [COST20230120C680] [COST20230120C700] \n", - " GLD [GLD20221230C195] [GLD20221230C205] \n", - " TSLA [TSLA20230120C1825] [TSLA20230120C1850] \n", - "2022-04-21 AAPL [AAPL20230120C160] [AAPL20230120C175] \n", - " COST [COST20230120C680] [COST20230120C700] \n", - " GLD [GLD20221230C195] [GLD20221230C205] \n", - " TSLA [TSLA20230120C1825] [TSLA20230120C1850] \n", - "2022-04-22 AAPL [AAPL20230120C160] [AAPL20230120C175] \n", - " COST [COST20230120C680] [COST20230120C700] \n", - " GLD [GLD20221230C195] [GLD20221230C205] \n", - " TSLA [TSLA20230120C1825] [TSLA20230120C1850] \n", - "2022-04-25 AAPL [AAPL20230120C160] [AAPL20230120C175] \n", - " COST [COST20230120C680] [COST20230120C700] \n", - " GLD [GLD20221230C195] [GLD20221230C205] \n", - " TSLA [TSLA20230120C1825] [TSLA20230120C1850] \n", - "2022-04-26 COST [COST20230120C680] [COST20230120C700] \n", - " GLD [GLD20221230C195] [GLD20221230C205] \n", - "2022-04-27 COST [COST20230120C680] [COST20230120C700] \n", - " GLD [GLD20221230C195] [GLD20221230C205] \n", - "2022-04-28 COST [COST20230120C680] [COST20230120C700] \n", - " GLD [GLD20221230C195] [GLD20221230C205] \n", - "2022-04-29 GLD [GLD20221230C195] [GLD20221230C205] \n", - "2022-05-02 GLD [GLD20221230C195] [GLD20221230C205] \n", - "2022-05-03 GLD [GLD20221230C195] [GLD20221230C205] \n", - "2022-05-04 GLD [GLD20221230C195] [GLD20221230C205] \n", - "2022-05-05 GLD [GLD20221230C195] [GLD20221230C205] \n", - "2022-05-06 GLD [GLD20221230C195] [GLD20221230C205] \n", - "2022-05-09 GLD [GLD20221230C195] [GLD20221230C205] \n", - "2022-08-10 AAPL [AAPL20230616C180] [AAPL20230616C195] \n", - "2022-08-11 AAPL [AAPL20230616C180] [AAPL20230616C195] \n", - "2022-08-12 AAPL [AAPL20230616C180] [AAPL20230616C195] \n", - "2022-08-15 AAPL [AAPL20230616C180] [AAPL20230616C195] \n", - "2022-08-16 AAPL [AAPL20230616C180] [AAPL20230616C195] \n", - "2022-08-17 AAPL [AAPL20230616C180] [AAPL20230616C195] \n", - "2022-08-18 AAPL [AAPL20230616C180] [AAPL20230616C195] \n", - "2022-08-19 AAPL [AAPL20230616C180] [AAPL20230616C195] \n", - "2022-08-22 AAPL [AAPL20230616C180] [AAPL20230616C195] \n", - "2022-08-23 AAPL [AAPL20230616C180] [AAPL20230616C195] \n", - "2022-08-24 AAPL [AAPL20230616C180] [AAPL20230616C195] \n", - "2022-08-25 AAPL [AAPL20230616C180] [AAPL20230616C195] \n", - "2022-08-26 AAPL [AAPL20230616C180] [AAPL20230616C195] \n", - "2022-11-04 CAT [CAT20230616C250] [CAT20230616C260] \n", - "2022-11-07 CAT [CAT20230616C250] [CAT20230616C260] \n", - "2022-11-08 CAT [CAT20230616C250] [CAT20230616C260] \n", - "2022-11-09 CAT [CAT20230616C250] [CAT20230616C260] \n", - "2022-11-10 CAT [CAT20230616C250] [CAT20230616C260] \n", - "2022-11-11 CAT [CAT20230616C250] [CAT20230616C260] \n", - "2022-11-14 CAT [CAT20230616C250] [CAT20230616C260] \n", - "2022-11-15 CAT [CAT20230616C250] [CAT20230616C260] \n", - "2022-11-16 CAT [CAT20230616C250] [CAT20230616C260] \n", - " BA [BA20230616C220] [BA20230616C230] \n", - "2022-11-17 CAT [CAT20230616C250] [CAT20230616C260] \n", - " BA [BA20230616C220] [BA20230616C230] \n", - "2022-11-18 CAT [CAT20230616C250] [CAT20230616C260] \n", - " BA [BA20230616C220] [BA20230616C230] \n", - "2022-11-21 CAT [CAT20230616C250] [CAT20230616C260] \n", - " BA [BA20230616C220] [BA20230616C230] \n", - "2022-11-22 CAT [CAT20230616C250] [CAT20230616C260] \n", - " BA [BA20230616C220] [BA20230616C230] \n", - "2022-11-23 CAT [CAT20230616C250] [CAT20230616C260] \n", - " BA [BA20230616C220] [BA20230616C230] \n", - "2022-11-24 CAT [CAT20230616C250] [CAT20230616C260] \n", - " BA [BA20230616C220] [BA20230616C230] \n", - "2022-11-25 CAT [CAT20230616C250] [CAT20230616C260] \n", - " BA [BA20230616C220] [BA20230616C230] \n", - "2022-11-28 CAT [CAT20230616C250] [CAT20230616C260] \n", - " BA [BA20230616C220] [BA20230616C230] \n", - "2022-11-29 CAT [CAT20230616C250] [CAT20230616C260] \n", - " BA [BA20230616C220] [BA20230616C230] \n", - "2022-11-30 CAT [CAT20230616C250] [CAT20230616C260] \n", - " BA [BA20230616C220] [BA20230616C230] \n", - "2022-12-01 CAT [CAT20230616C250] [CAT20230616C260] \n", - " BA [BA20230616C220] [BA20230616C230] \n", - "2022-12-02 CAT [CAT20230616C250] [CAT20230616C260] \n", - " BA [BA20230616C220] [BA20230616C230] \n", - "2022-12-05 CAT [CAT20230616C250] [CAT20230616C260] \n", - " BA [BA20230616C220] [BA20230616C230] \n", - "2022-12-06 CAT [CAT20230616C250] [CAT20230616C260] \n", - " BA [BA20230616C220] [BA20230616C230] \n", - "2022-12-07 CAT [CAT20230616C250] [CAT20230616C260] \n", - " BA [BA20230616C220] [BA20230616C230] \n", - "2022-12-08 CAT [CAT20230616C250] [CAT20230616C260] \n", - " BA [BA20230616C220] [BA20230616C230] \n", - "2022-12-09 CAT [CAT20230616C250] [CAT20230616C260] \n", - " BA [BA20230616C220] [BA20230616C230] \n", - "2022-12-12 CAT [CAT20230616C250] [CAT20230616C260] \n", - " BA [BA20230616C220] [BA20230616C230] \n", - "2022-12-13 CAT [CAT20230616C250] [CAT20230616C260] \n", - " BA [BA20230616C220] [BA20230616C230] \n", - "2022-12-14 CAT [CAT20230616C250] [CAT20230616C260] \n", - " BA [BA20230616C220] [BA20230616C230] \n", - "2022-12-15 CAT [CAT20230616C250] [CAT20230616C260] \n", - " BA [BA20230616C220] [BA20230616C230] \n", - "2022-12-16 CAT [CAT20230616C250] [CAT20230616C260] \n", - " BA [BA20230616C220] [BA20230616C230] \n", - "2022-12-19 CAT [CAT20230616C250] [CAT20230616C260] \n", - " BA [BA20230616C220] [BA20230616C230] \n", - "2022-12-20 CAT [CAT20230616C250] [CAT20230616C260] \n", - " BA [BA20230616C220] [BA20230616C230] \n", - "2022-12-21 CAT [CAT20230616C250] [CAT20230616C260] \n", - " BA [BA20230616C220] [BA20230616C230] \n", - "2022-12-22 CAT [CAT20230616C250] [CAT20230616C260] \n", - " BA [BA20230616C220] [BA20230616C230] \n", - "2022-12-23 CAT [CAT20230616C250] [CAT20230616C260] \n", - " BA [BA20230616C220] [BA20230616C230] \n", - "2022-12-26 CAT [CAT20230616C250] [CAT20230616C260] \n", - " BA [BA20230616C220] [BA20230616C230] \n", - "2022-12-27 CAT [CAT20230616C250] [CAT20230616C260] \n", - " BA [BA20230616C220] [BA20230616C230] \n", - "2022-12-28 CAT [CAT20230616C250] [CAT20230616C260] \n", - " BA [BA20230616C220] [BA20230616C230] \n", - "2022-12-29 CAT [CAT20230616C250] [CAT20230616C260] \n", - " BA [BA20230616C220] [BA20230616C230] \n", - "\n", - " trade_id close quantity \\\n", - "datetime symbol \n", - "2022-01-04 AAPL &L:AAPL20220916C210&S:AAPL20220916C220 1.700 5 \n", - " COST &L:COST20230120C680&S:COST20230120C700 3.325 2 \n", - " MU &L:MU20220916C100&S:MU20220916C105 1.575 3 \n", - "2022-01-05 AAPL &L:AAPL20220916C210&S:AAPL20220916C220 1.700 5 \n", - " COST &L:COST20230120C680&S:COST20230120C700 3.325 2 \n", - " MU &L:MU20220916C100&S:MU20220916C105 1.575 3 \n", - "2022-01-06 COST &L:COST20230120C680&S:COST20230120C700 3.325 2 \n", - " MU &L:MU20220916C100&S:MU20220916C105 1.575 3 \n", - "2022-01-07 MU &L:MU20220916C100&S:MU20220916C105 1.575 3 \n", - "2022-01-10 COST &L:COST20230120C560&S:COST20230120C570 3.550 2 \n", - " MU &L:MU20220916C100&S:MU20220916C105 1.575 3 \n", - "2022-01-11 COST &L:COST20230120C560&S:COST20230120C570 3.550 2 \n", - " MU &L:MU20220916C100&S:MU20220916C105 1.575 3 \n", - "2022-01-12 COST &L:COST20230120C560&S:COST20230120C570 3.550 2 \n", - " MU &L:MU20220916C100&S:MU20220916C105 1.575 3 \n", - "2022-01-13 COST &L:COST20230120C560&S:COST20230120C570 3.550 2 \n", - " MU &L:MU20220916C100&S:MU20220916C105 1.575 3 \n", - "2022-01-14 MU &L:MU20220916C100&S:MU20220916C105 1.575 3 \n", - "2022-01-17 MU &L:MU20220916C100&S:MU20220916C105 1.575 3 \n", - "2022-01-18 COST &L:COST20230120C540&S:COST20230120C550 2.975 2 \n", - " MU &L:MU20220916C100&S:MU20220916C105 1.575 3 \n", - " TSM &L:TSM20220916C140&S:TSM20220916C145 1.625 3 \n", - "2022-01-19 COST &L:COST20230120C540&S:COST20230120C550 2.975 2 \n", - " HD &L:HD20230120C420&S:HD20230120C430 2.150 3 \n", - " MU &L:MU20220916C100&S:MU20220916C105 1.575 3 \n", - " BAC &L:BAC20221021C42&S:BAC20221021C50 3.725 0 \n", - " TSM &L:TSM20220916C140&S:TSM20220916C145 1.625 3 \n", - "2022-01-20 HD &L:HD20230120C420&S:HD20230120C430 2.150 3 \n", - " BAC &L:BAC20221021C42&S:BAC20221021C50 3.725 0 \n", - "2022-01-21 HD &L:HD20230120C420&S:HD20230120C430 2.150 3 \n", - " BAC &L:BAC20221021C42&S:BAC20221021C50 3.725 0 \n", - " TSM &L:TSM20230120C150&S:TSM20220916C145 1.700 2 \n", - " MSFT &L:MSFT20230120C385&S:MSFT20220916C365 2.000 6 \n", - "2022-01-24 TSM &L:TSM20230120C150&S:TSM20220916C145 1.700 2 \n", - "2022-01-25 AAPL &L:AAPL20221118C200&S:AAPL20221118C300 3.215 1 \n", - " TSM &L:TSM20230120C150&S:TSM20220916C145 1.700 2 \n", - "2022-01-26 AAPL &L:AAPL20221118C200&S:AAPL20221118C300 3.215 1 \n", - " TSM &L:TSM20230120C150&S:TSM20220916C145 1.700 2 \n", - "2022-01-27 AAPL &L:AAPL20221118C200&S:AAPL20221118C300 3.215 1 \n", - " MSFT &L:MSFT20230120C420&S:MSFT20230120C450 1.400 5 \n", - "2022-01-28 AAPL &L:AAPL20221118C200&S:AAPL20221118C300 3.215 1 \n", - " MSFT &L:MSFT20230120C420&S:MSFT20230120C450 1.400 5 \n", - "2022-01-31 AAPL &L:AAPL20221118C200&S:AAPL20221118C300 3.215 1 \n", - " HD &L:HD20230120C450&S:HD20230120C460 0.450 4 \n", - " MSFT &L:MSFT20230120C420&S:MSFT20230120C450 1.400 5 \n", - "2022-02-01 AAPL &L:AAPL20221118C200&S:AAPL20221118C300 3.215 1 \n", - " COST &L:COST20230120C680&S:COST20230120C740 3.750 2 \n", - " HD &L:HD20230120C450&S:HD20230120C460 0.450 4 \n", - " MSFT &L:MSFT20230120C420&S:MSFT20230120C450 1.400 5 \n", - "2022-02-02 AAPL &L:AAPL20221118C200&S:AAPL20221118C300 3.215 1 \n", - " COST &L:COST20230120C680&S:COST20230120C740 3.750 2 \n", - " HD &L:HD20230120C450&S:HD20230120C460 0.450 4 \n", - " MSFT &L:MSFT20230120C420&S:MSFT20230120C450 1.400 5 \n", - "2022-02-03 AAPL &L:AAPL20221118C200&S:AAPL20221118C300 3.215 1 \n", - " COST &L:COST20230120C680&S:COST20230120C740 3.750 2 \n", - " HD &L:HD20230120C450&S:HD20230120C460 0.450 4 \n", - " MSFT &L:MSFT20230120C420&S:MSFT20230120C450 1.400 5 \n", - "2022-02-04 AAPL &L:AAPL20221118C200&S:AAPL20221118C300 3.215 1 \n", - " COST &L:COST20230120C680&S:COST20230120C740 3.750 2 \n", - " HD &L:HD20230120C450&S:HD20230120C460 0.450 4 \n", - " MSFT &L:MSFT20230120C420&S:MSFT20230120C450 1.400 5 \n", - "2022-02-07 AAPL &L:AAPL20221118C200&S:AAPL20221118C300 3.215 1 \n", - " COST &L:COST20230120C680&S:COST20230120C740 3.750 2 \n", - " HD &L:HD20230120C450&S:HD20230120C460 0.450 4 \n", - " MSFT &L:MSFT20230120C420&S:MSFT20230120C450 1.400 5 \n", - "2022-02-08 AAPL &L:AAPL20221118C200&S:AAPL20221118C300 3.215 1 \n", - " COST &L:COST20230120C680&S:COST20230120C740 3.750 2 \n", - " HD &L:HD20230120C450&S:HD20230120C460 0.450 4 \n", - " MSFT &L:MSFT20230120C420&S:MSFT20230120C450 1.400 5 \n", - "2022-02-09 AAPL &L:AAPL20221118C200&S:AAPL20221118C300 3.215 1 \n", - " COST &L:COST20230120C680&S:COST20230120C740 3.750 2 \n", - " HD &L:HD20230120C450&S:HD20230120C460 0.450 4 \n", - " MSFT &L:MSFT20230120C420&S:MSFT20230120C450 1.400 5 \n", - "2022-02-10 AAPL &L:AAPL20221118C200&S:AAPL20221118C300 3.215 1 \n", - " COST &L:COST20230120C680&S:COST20230120C740 3.750 2 \n", - " HD &L:HD20230120C450&S:HD20230120C460 0.450 4 \n", - " MSFT &L:MSFT20230120C420&S:MSFT20230120C450 1.400 5 \n", - "2022-02-11 AAPL &L:AAPL20221118C200&S:AAPL20221118C300 3.215 1 \n", - " COST &L:COST20230120C680&S:COST20230120C740 3.750 2 \n", - " HD &L:HD20230120C450&S:HD20230120C460 0.450 4 \n", - " MU &L:MU20230120C120&S:MU20230120C130 1.450 3 \n", - " MSFT &L:MSFT20230120C420&S:MSFT20230120C450 1.400 5 \n", - "2022-02-14 AAPL &L:AAPL20221118C200&S:AAPL20221118C300 3.215 1 \n", - " COST &L:COST20230120C680&S:COST20230120C740 3.750 2 \n", - " MU &L:MU20230120C120&S:MU20230120C130 1.450 3 \n", - "2022-02-15 AAPL &L:AAPL20221118C200&S:AAPL20221118C300 3.215 1 \n", - " COST &L:COST20230120C680&S:COST20230120C740 3.750 2 \n", - " MU &L:MU20230120C120&S:MU20230120C130 1.450 3 \n", - "2022-02-16 AAPL &L:AAPL20221118C200&S:AAPL20221118C300 3.215 1 \n", - " COST &L:COST20230120C680&S:COST20230120C740 3.750 2 \n", - " MU &L:MU20230120C120&S:MU20230120C130 1.450 3 \n", - "2022-02-17 AAPL &L:AAPL20221118C200&S:AAPL20221118C300 3.215 1 \n", - " COST &L:COST20230120C680&S:COST20230120C740 3.750 2 \n", - " MU &L:MU20230120C120&S:MU20230120C130 1.450 3 \n", - "2022-02-18 AAPL &L:AAPL20221118C200&S:AAPL20221118C300 3.215 1 \n", - " COST &L:COST20230120C680&S:COST20230120C740 3.750 2 \n", - " MU &L:MU20230120C120&S:MU20230120C130 1.450 3 \n", - "2022-02-21 AAPL &L:AAPL20221118C200&S:AAPL20221118C300 3.215 1 \n", - " COST &L:COST20230120C680&S:COST20230120C740 3.750 2 \n", - " MU &L:MU20230120C120&S:MU20230120C130 1.450 3 \n", - "2022-02-22 AAPL &L:AAPL20221118C200&S:AAPL20221118C300 3.215 1 \n", - " COST &L:COST20230120C680&S:COST20230120C740 3.750 2 \n", - " MU &L:MU20230120C120&S:MU20230120C130 1.450 3 \n", - "2022-02-23 AAPL &L:AAPL20221118C200&S:AAPL20221118C300 3.215 1 \n", - " COST &L:COST20230120C680&S:COST20230120C740 3.750 2 \n", - " MU &L:MU20230120C120&S:MU20230120C130 1.450 3 \n", - "2022-02-24 AAPL &L:AAPL20221118C200&S:AAPL20221118C300 3.215 1 \n", - " MU &L:MU20230120C120&S:MU20230120C130 1.450 3 \n", - "2022-02-25 AAPL &L:AAPL20221118C200&S:AAPL20221118C300 3.215 1 \n", - " MU &L:MU20230120C120&S:MU20230120C130 1.450 3 \n", - "2022-02-28 AAPL &L:AAPL20221118C200&S:AAPL20221118C300 3.215 1 \n", - " MU &L:MU20230120C120&S:MU20230120C130 1.450 3 \n", - " GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - "2022-03-01 AAPL &L:AAPL20221118C200&S:AAPL20221118C300 3.215 1 \n", - " MU &L:MU20230120C120&S:MU20230120C130 1.450 3 \n", - " GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - "2022-03-02 AAPL &L:AAPL20221118C200&S:AAPL20221118C300 3.215 1 \n", - " MU &L:MU20230120C120&S:MU20230120C130 1.450 3 \n", - " GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - "2022-03-03 AAPL &L:AAPL20221118C200&S:AAPL20221118C300 3.215 1 \n", - " MU &L:MU20230120C120&S:MU20230120C130 1.450 3 \n", - " GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - "2022-03-04 AAPL &L:AAPL20221118C200&S:AAPL20221118C300 3.215 1 \n", - " GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - "2022-03-07 AAPL &L:AAPL20221118C200&S:AAPL20221118C300 3.215 1 \n", - " GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - "2022-03-08 AAPL &L:AAPL20221118C200&S:AAPL20221118C300 3.215 1 \n", - " GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - "2022-03-09 AAPL &L:AAPL20221118C200&S:AAPL20221118C300 3.215 1 \n", - " GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - "2022-03-10 AAPL &L:AAPL20221118C200&S:AAPL20221118C300 3.215 1 \n", - " GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - "2022-03-11 AAPL &L:AAPL20221118C200&S:AAPL20221118C300 3.215 1 \n", - " GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - "2022-03-14 GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - "2022-03-15 GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - "2022-03-16 GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - "2022-03-17 AAPL &L:AAPL20230120C160&S:AAPL20230120C175 7.200 1 \n", - " GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - "2022-03-18 AAPL &L:AAPL20230120C160&S:AAPL20230120C175 7.200 1 \n", - " GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - "2022-03-21 AAPL &L:AAPL20230120C160&S:AAPL20230120C175 7.200 1 \n", - " GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - "2022-03-22 AAPL &L:AAPL20230120C160&S:AAPL20230120C175 7.200 1 \n", - " GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - " TSLA &L:TSLA20230120C1825&S:TSLA20230120C1850 1.525 9 \n", - "2022-03-23 AAPL &L:AAPL20230120C160&S:AAPL20230120C175 7.200 1 \n", - " GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - " TSLA &L:TSLA20230120C1825&S:TSLA20230120C1850 1.525 9 \n", - "2022-03-24 AAPL &L:AAPL20230120C160&S:AAPL20230120C175 7.200 1 \n", - " GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - " TSLA &L:TSLA20230120C1825&S:TSLA20230120C1850 1.525 9 \n", - "2022-03-25 AAPL &L:AAPL20230120C160&S:AAPL20230120C175 7.200 1 \n", - " GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - " TSLA &L:TSLA20230120C1825&S:TSLA20230120C1850 1.525 9 \n", - "2022-03-28 AAPL &L:AAPL20230120C160&S:AAPL20230120C175 7.200 1 \n", - " GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - " TSLA &L:TSLA20230120C1825&S:TSLA20230120C1850 1.525 9 \n", - "2022-03-29 AAPL &L:AAPL20230120C160&S:AAPL20230120C175 7.200 1 \n", - " GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - " TSLA &L:TSLA20230120C1825&S:TSLA20230120C1850 1.525 9 \n", - "2022-03-30 AAPL &L:AAPL20230120C160&S:AAPL20230120C175 7.200 1 \n", - " GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - " TSLA &L:TSLA20230120C1825&S:TSLA20230120C1850 1.525 9 \n", - "2022-03-31 AAPL &L:AAPL20230120C160&S:AAPL20230120C175 7.200 1 \n", - " GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - " TSLA &L:TSLA20230120C1825&S:TSLA20230120C1850 1.525 9 \n", - "2022-04-01 AAPL &L:AAPL20230120C160&S:AAPL20230120C175 7.200 1 \n", - " GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - " TSLA &L:TSLA20230120C1825&S:TSLA20230120C1850 1.525 9 \n", - "2022-04-04 AAPL &L:AAPL20230120C160&S:AAPL20230120C175 7.200 1 \n", - " GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - " TSLA &L:TSLA20230120C1825&S:TSLA20230120C1850 1.525 9 \n", - "2022-04-05 AAPL &L:AAPL20230120C160&S:AAPL20230120C175 7.200 1 \n", - " COST &L:COST20230120C680&S:COST20230120C700 3.400 1 \n", - " GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - " TSLA &L:TSLA20230120C1825&S:TSLA20230120C1850 1.525 9 \n", - "2022-04-06 AAPL &L:AAPL20230120C160&S:AAPL20230120C175 7.200 1 \n", - " COST &L:COST20230120C680&S:COST20230120C700 3.400 1 \n", - " GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - " TSLA &L:TSLA20230120C1825&S:TSLA20230120C1850 1.525 9 \n", - "2022-04-07 AAPL &L:AAPL20230120C160&S:AAPL20230120C175 7.200 1 \n", - " COST &L:COST20230120C680&S:COST20230120C700 3.400 1 \n", - " GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - " TSLA &L:TSLA20230120C1825&S:TSLA20230120C1850 1.525 9 \n", - "2022-04-08 AAPL &L:AAPL20230120C160&S:AAPL20230120C175 7.200 1 \n", - " COST &L:COST20230120C680&S:COST20230120C700 3.400 1 \n", - " GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - " TSLA &L:TSLA20230120C1825&S:TSLA20230120C1850 1.525 9 \n", - "2022-04-11 AAPL &L:AAPL20230120C160&S:AAPL20230120C175 7.200 1 \n", - " COST &L:COST20230120C680&S:COST20230120C700 3.400 1 \n", - " GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - " TSLA &L:TSLA20230120C1825&S:TSLA20230120C1850 1.525 9 \n", - "2022-04-12 AAPL &L:AAPL20230120C160&S:AAPL20230120C175 7.200 1 \n", - " COST &L:COST20230120C680&S:COST20230120C700 3.400 1 \n", - " GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - " TSLA &L:TSLA20230120C1825&S:TSLA20230120C1850 1.525 9 \n", - "2022-04-13 AAPL &L:AAPL20230120C160&S:AAPL20230120C175 7.200 1 \n", - " COST &L:COST20230120C680&S:COST20230120C700 3.400 1 \n", - " GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - " TSLA &L:TSLA20230120C1825&S:TSLA20230120C1850 1.525 9 \n", - "2022-04-14 AAPL &L:AAPL20230120C160&S:AAPL20230120C175 7.200 1 \n", - " COST &L:COST20230120C680&S:COST20230120C700 3.400 1 \n", - " GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - " TSLA &L:TSLA20230120C1825&S:TSLA20230120C1850 1.525 9 \n", - "2022-04-15 AAPL &L:AAPL20230120C160&S:AAPL20230120C175 7.200 1 \n", - " COST &L:COST20230120C680&S:COST20230120C700 3.400 1 \n", - " GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - " TSLA &L:TSLA20230120C1825&S:TSLA20230120C1850 1.525 9 \n", - "2022-04-18 AAPL &L:AAPL20230120C160&S:AAPL20230120C175 7.200 1 \n", - " COST &L:COST20230120C680&S:COST20230120C700 3.400 1 \n", - " GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - " TSLA &L:TSLA20230120C1825&S:TSLA20230120C1850 1.525 9 \n", - "2022-04-19 AAPL &L:AAPL20230120C160&S:AAPL20230120C175 7.200 1 \n", - " COST &L:COST20230120C680&S:COST20230120C700 3.400 1 \n", - " GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - " TSLA &L:TSLA20230120C1825&S:TSLA20230120C1850 1.525 9 \n", - "2022-04-20 AAPL &L:AAPL20230120C160&S:AAPL20230120C175 7.200 1 \n", - " COST &L:COST20230120C680&S:COST20230120C700 3.400 1 \n", - " GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - " TSLA &L:TSLA20230120C1825&S:TSLA20230120C1850 1.525 9 \n", - "2022-04-21 AAPL &L:AAPL20230120C160&S:AAPL20230120C175 7.200 1 \n", - " COST &L:COST20230120C680&S:COST20230120C700 3.400 1 \n", - " GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - " TSLA &L:TSLA20230120C1825&S:TSLA20230120C1850 1.525 9 \n", - "2022-04-22 AAPL &L:AAPL20230120C160&S:AAPL20230120C175 7.200 1 \n", - " COST &L:COST20230120C680&S:COST20230120C700 3.400 1 \n", - " GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - " TSLA &L:TSLA20230120C1825&S:TSLA20230120C1850 1.525 9 \n", - "2022-04-25 AAPL &L:AAPL20230120C160&S:AAPL20230120C175 7.200 1 \n", - " COST &L:COST20230120C680&S:COST20230120C700 3.400 1 \n", - " GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - " TSLA &L:TSLA20230120C1825&S:TSLA20230120C1850 1.525 9 \n", - "2022-04-26 COST &L:COST20230120C680&S:COST20230120C700 3.400 1 \n", - " GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - "2022-04-27 COST &L:COST20230120C680&S:COST20230120C700 3.400 1 \n", - " GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - "2022-04-28 COST &L:COST20230120C680&S:COST20230120C700 3.400 1 \n", - " GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - "2022-04-29 GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - "2022-05-02 GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - "2022-05-03 GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - "2022-05-04 GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - "2022-05-05 GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - "2022-05-06 GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - "2022-05-09 GLD &L:GLD20221230C195&S:GLD20221230C205 1.275 1 \n", - "2022-08-10 AAPL &L:AAPL20230616C180&S:AAPL20230616C195 5.250 1 \n", - "2022-08-11 AAPL &L:AAPL20230616C180&S:AAPL20230616C195 5.250 1 \n", - "2022-08-12 AAPL &L:AAPL20230616C180&S:AAPL20230616C195 5.250 1 \n", - "2022-08-15 AAPL &L:AAPL20230616C180&S:AAPL20230616C195 5.250 1 \n", - "2022-08-16 AAPL &L:AAPL20230616C180&S:AAPL20230616C195 5.250 1 \n", - "2022-08-17 AAPL &L:AAPL20230616C180&S:AAPL20230616C195 5.250 1 \n", - "2022-08-18 AAPL &L:AAPL20230616C180&S:AAPL20230616C195 5.250 1 \n", - "2022-08-19 AAPL &L:AAPL20230616C180&S:AAPL20230616C195 5.250 1 \n", - "2022-08-22 AAPL &L:AAPL20230616C180&S:AAPL20230616C195 5.250 1 \n", - "2022-08-23 AAPL &L:AAPL20230616C180&S:AAPL20230616C195 5.250 1 \n", - "2022-08-24 AAPL &L:AAPL20230616C180&S:AAPL20230616C195 5.250 1 \n", - "2022-08-25 AAPL &L:AAPL20230616C180&S:AAPL20230616C195 5.250 1 \n", - "2022-08-26 AAPL &L:AAPL20230616C180&S:AAPL20230616C195 5.250 1 \n", - "2022-11-04 CAT &L:CAT20230616C250&S:CAT20230616C260 4.175 1 \n", - "2022-11-07 CAT &L:CAT20230616C250&S:CAT20230616C260 4.175 1 \n", - "2022-11-08 CAT &L:CAT20230616C250&S:CAT20230616C260 4.175 1 \n", - "2022-11-09 CAT &L:CAT20230616C250&S:CAT20230616C260 4.175 1 \n", - "2022-11-10 CAT &L:CAT20230616C250&S:CAT20230616C260 4.175 1 \n", - "2022-11-11 CAT &L:CAT20230616C250&S:CAT20230616C260 4.175 1 \n", - "2022-11-14 CAT &L:CAT20230616C250&S:CAT20230616C260 4.175 1 \n", - "2022-11-15 CAT &L:CAT20230616C250&S:CAT20230616C260 4.175 1 \n", - "2022-11-16 CAT &L:CAT20230616C250&S:CAT20230616C260 4.175 1 \n", - " BA &L:BA20230616C220&S:BA20230616C230 2.575 3 \n", - "2022-11-17 CAT &L:CAT20230616C250&S:CAT20230616C260 4.175 1 \n", - " BA &L:BA20230616C220&S:BA20230616C230 2.575 3 \n", - "2022-11-18 CAT &L:CAT20230616C250&S:CAT20230616C260 4.175 1 \n", - " BA &L:BA20230616C220&S:BA20230616C230 2.575 3 \n", - "2022-11-21 CAT &L:CAT20230616C250&S:CAT20230616C260 4.175 1 \n", - " BA &L:BA20230616C220&S:BA20230616C230 2.575 3 \n", - "2022-11-22 CAT &L:CAT20230616C250&S:CAT20230616C260 4.175 1 \n", - " BA &L:BA20230616C220&S:BA20230616C230 2.575 3 \n", - "2022-11-23 CAT &L:CAT20230616C250&S:CAT20230616C260 4.175 1 \n", - " BA &L:BA20230616C220&S:BA20230616C230 2.575 3 \n", - "2022-11-24 CAT &L:CAT20230616C250&S:CAT20230616C260 4.175 1 \n", - " BA &L:BA20230616C220&S:BA20230616C230 2.575 3 \n", - "2022-11-25 CAT &L:CAT20230616C250&S:CAT20230616C260 4.175 1 \n", - " BA &L:BA20230616C220&S:BA20230616C230 2.575 3 \n", - "2022-11-28 CAT &L:CAT20230616C250&S:CAT20230616C260 4.175 1 \n", - " BA &L:BA20230616C220&S:BA20230616C230 2.575 3 \n", - "2022-11-29 CAT &L:CAT20230616C250&S:CAT20230616C260 4.175 1 \n", - " BA &L:BA20230616C220&S:BA20230616C230 2.575 3 \n", - "2022-11-30 CAT &L:CAT20230616C250&S:CAT20230616C260 4.175 1 \n", - " BA &L:BA20230616C220&S:BA20230616C230 2.575 3 \n", - "2022-12-01 CAT &L:CAT20230616C250&S:CAT20230616C260 4.175 1 \n", - " BA &L:BA20230616C220&S:BA20230616C230 2.575 3 \n", - "2022-12-02 CAT &L:CAT20230616C250&S:CAT20230616C260 4.175 1 \n", - " BA &L:BA20230616C220&S:BA20230616C230 2.575 3 \n", - "2022-12-05 CAT &L:CAT20230616C250&S:CAT20230616C260 4.175 1 \n", - " BA &L:BA20230616C220&S:BA20230616C230 2.575 3 \n", - "2022-12-06 CAT &L:CAT20230616C250&S:CAT20230616C260 4.175 1 \n", - " BA &L:BA20230616C220&S:BA20230616C230 2.575 3 \n", - "2022-12-07 CAT &L:CAT20230616C250&S:CAT20230616C260 4.175 1 \n", - " BA &L:BA20230616C220&S:BA20230616C230 2.575 3 \n", - "2022-12-08 CAT &L:CAT20230616C250&S:CAT20230616C260 4.175 1 \n", - " BA &L:BA20230616C220&S:BA20230616C230 2.575 3 \n", - "2022-12-09 CAT &L:CAT20230616C250&S:CAT20230616C260 4.175 1 \n", - " BA &L:BA20230616C220&S:BA20230616C230 2.575 3 \n", - "2022-12-12 CAT &L:CAT20230616C250&S:CAT20230616C260 4.175 1 \n", - " BA &L:BA20230616C220&S:BA20230616C230 2.575 3 \n", - "2022-12-13 CAT &L:CAT20230616C250&S:CAT20230616C260 4.175 1 \n", - " BA &L:BA20230616C220&S:BA20230616C230 2.575 3 \n", - "2022-12-14 CAT &L:CAT20230616C250&S:CAT20230616C260 4.175 1 \n", - " BA &L:BA20230616C220&S:BA20230616C230 2.575 3 \n", - "2022-12-15 CAT &L:CAT20230616C250&S:CAT20230616C260 4.175 1 \n", - " BA &L:BA20230616C220&S:BA20230616C230 2.575 3 \n", - "2022-12-16 CAT &L:CAT20230616C250&S:CAT20230616C260 4.175 1 \n", - " BA &L:BA20230616C220&S:BA20230616C230 2.575 3 \n", - "2022-12-19 CAT &L:CAT20230616C250&S:CAT20230616C260 4.175 1 \n", - " BA &L:BA20230616C220&S:BA20230616C230 2.575 3 \n", - "2022-12-20 CAT &L:CAT20230616C250&S:CAT20230616C260 4.175 1 \n", - " BA &L:BA20230616C220&S:BA20230616C230 2.575 3 \n", - "2022-12-21 CAT &L:CAT20230616C250&S:CAT20230616C260 4.175 1 \n", - " BA &L:BA20230616C220&S:BA20230616C230 2.575 3 \n", - "2022-12-22 CAT &L:CAT20230616C250&S:CAT20230616C260 4.175 1 \n", - " BA &L:BA20230616C220&S:BA20230616C230 2.575 3 \n", - "2022-12-23 CAT &L:CAT20230616C250&S:CAT20230616C260 4.175 1 \n", - " BA &L:BA20230616C220&S:BA20230616C230 2.575 3 \n", - "2022-12-26 CAT &L:CAT20230616C250&S:CAT20230616C260 4.175 1 \n", - " BA &L:BA20230616C220&S:BA20230616C230 2.575 3 \n", - "2022-12-27 CAT &L:CAT20230616C250&S:CAT20230616C260 4.175 1 \n", - " BA &L:BA20230616C220&S:BA20230616C230 2.575 3 \n", - "2022-12-28 CAT &L:CAT20230616C250&S:CAT20230616C260 4.175 1 \n", - " BA &L:BA20230616C220&S:BA20230616C230 2.575 3 \n", - "2022-12-29 CAT &L:CAT20230616C250&S:CAT20230616C260 4.175 1 \n", - " BA &L:BA20230616C220&S:BA20230616C230 2.575 3 \n", - "\n", - " market_value \n", - "datetime symbol \n", - "2022-01-04 AAPL 937.5 \n", - " COST 670.0 \n", - " MU 585.0 \n", - "2022-01-05 AAPL 850.0 \n", - " COST 885.0 \n", - " MU 502.5 \n", - "2022-01-06 COST 665.0 \n", - " MU 547.5 \n", - "2022-01-07 MU 532.5 \n", - "2022-01-10 COST 665.0 \n", - " MU 480.0 \n", - "2022-01-11 COST 785.0 \n", - " MU 517.5 \n", - "2022-01-12 COST 775.0 \n", - " MU 517.5 \n", - "2022-01-13 COST 710.0 \n", - " MU 540.0 \n", - "2022-01-14 MU 577.5 \n", - "2022-01-17 MU 517.5 \n", - "2022-01-18 COST 680.0 \n", - " MU 517.5 \n", - " TSM 547.5 \n", - "2022-01-19 COST 595.0 \n", - " HD 600.0 \n", - " MU 472.5 \n", - " BAC 0.0 \n", - " TSM 487.5 \n", - "2022-01-20 HD 540.0 \n", - " BAC 0.0 \n", - "2022-01-21 HD 645.0 \n", - " BAC 0.0 \n", - " TSM 400.0 \n", - " MSFT 1200.0 \n", - "2022-01-24 TSM 230.0 \n", - "2022-01-25 AAPL 560.5 \n", - " TSM 310.0 \n", - "2022-01-26 AAPL 560.5 \n", - " TSM 340.0 \n", - "2022-01-27 AAPL 534.0 \n", - " MSFT 1000.0 \n", - "2022-01-28 AAPL 793.0 \n", - " MSFT 1337.5 \n", - "2022-01-31 AAPL 877.5 \n", - " HD 510.0 \n", - " MSFT 1237.5 \n", - "2022-02-01 AAPL 866.5 \n", - " COST 680.0 \n", - " HD 510.0 \n", - " MSFT 1062.5 \n", - "2022-02-02 AAPL 858.5 \n", - " COST 920.0 \n", - " HD 710.0 \n", - " MSFT 1150.0 \n", - "2022-02-03 AAPL 830.0 \n", - " COST 755.0 \n", - " HD 640.0 \n", - " MSFT 960.0 \n", - "2022-02-04 AAPL 800.0 \n", - " COST 950.0 \n", - " HD 560.0 \n", - " MSFT 972.5 \n", - "2022-02-07 AAPL 777.0 \n", - " COST 1080.0 \n", - " HD 460.0 \n", - " MSFT 825.0 \n", - "2022-02-08 AAPL 846.0 \n", - " COST 960.0 \n", - " HD 550.0 \n", - " MSFT 927.5 \n", - "2022-02-09 AAPL 851.5 \n", - " COST 1035.0 \n", - " HD 610.0 \n", - " MSFT 845.0 \n", - "2022-02-10 AAPL 768.0 \n", - " COST 780.0 \n", - " HD 600.0 \n", - " MSFT 660.0 \n", - "2022-02-11 AAPL 681.0 \n", - " COST 875.0 \n", - " HD 180.0 \n", - " MU 555.0 \n", - " MSFT 700.0 \n", - "2022-02-14 AAPL 694.0 \n", - " COST 1355.0 \n", - " MU 480.0 \n", - "2022-02-15 AAPL 772.0 \n", - " COST 945.0 \n", - " MU 622.5 \n", - "2022-02-16 AAPL 723.5 \n", - " COST 880.0 \n", - " MU 570.0 \n", - "2022-02-17 AAPL 654.0 \n", - " COST 895.0 \n", - " MU 592.5 \n", - "2022-02-18 AAPL 594.5 \n", - " COST 887.0 \n", - " MU 562.5 \n", - "2022-02-21 AAPL 538.0 \n", - " COST 615.0 \n", - " MU 517.5 \n", - "2022-02-22 AAPL 538.0 \n", - " COST 615.0 \n", - " MU 517.5 \n", - "2022-02-23 AAPL 420.0 \n", - " COST 750.0 \n", - " MU 487.5 \n", - "2022-02-24 AAPL 400.0 \n", - " MU 420.0 \n", - "2022-02-25 AAPL 472.5 \n", - " MU 502.5 \n", - "2022-02-28 AAPL 494.0 \n", - " MU 502.5 \n", - " GLD 177.5 \n", - "2022-03-01 AAPL 527.5 \n", - " MU 292.5 \n", - " GLD 207.5 \n", - "2022-03-02 AAPL 549.5 \n", - " MU 607.5 \n", - " GLD 195.0 \n", - "2022-03-03 AAPL 577.0 \n", - " MU 435.0 \n", - " GLD 210.0 \n", - "2022-03-04 AAPL 521.0 \n", - " GLD 240.0 \n", - "2022-03-07 AAPL 448.5 \n", - " GLD 257.5 \n", - "2022-03-08 AAPL 361.5 \n", - " GLD 292.5 \n", - "2022-03-09 AAPL 458.5 \n", - " GLD 247.5 \n", - "2022-03-10 AAPL 384.5 \n", - " GLD 250.0 \n", - "2022-03-11 AAPL 321.5 \n", - " GLD 240.0 \n", - "2022-03-14 GLD 215.0 \n", - "2022-03-15 GLD 187.5 \n", - "2022-03-16 GLD 192.5 \n", - "2022-03-17 AAPL 590.0 \n", - " GLD 200.0 \n", - "2022-03-18 AAPL 730.0 \n", - " GLD 187.5 \n", - "2022-03-21 AAPL 757.5 \n", - " GLD 197.5 \n", - "2022-03-22 AAPL 817.5 \n", - " GLD 185.0 \n", - " TSLA 1575.0 \n", - "2022-03-23 AAPL 807.5 \n", - " GLD 207.5 \n", - " TSLA 1867.5 \n", - "2022-03-24 AAPL 847.5 \n", - " GLD 215.0 \n", - " TSLA 1845.0 \n", - "2022-03-25 AAPL 860.0 \n", - " GLD 215.0 \n", - " TSLA 1822.5 \n", - "2022-03-28 AAPL 855.0 \n", - " GLD 185.0 \n", - " TSLA 2520.0 \n", - "2022-03-29 AAPL 920.0 \n", - " GLD 177.5 \n", - " TSLA 2520.0 \n", - "2022-03-30 AAPL 880.0 \n", - " GLD 192.5 \n", - " TSLA 2430.0 \n", - "2022-03-31 AAPL 922.5 \n", - " GLD 195.0 \n", - " TSLA 2340.0 \n", - "2022-04-01 AAPL 867.5 \n", - " GLD 180.0 \n", - " TSLA 2340.0 \n", - "2022-04-04 AAPL 937.5 \n", - " GLD 182.5 \n", - " TSLA 2880.0 \n", - "2022-04-05 AAPL 867.5 \n", - " COST 372.5 \n", - " GLD 167.5 \n", - " TSLA 2722.5 \n", - "2022-04-06 AAPL 822.5 \n", - " COST 410.0 \n", - " GLD 172.5 \n", - " TSLA 2092.5 \n", - "2022-04-07 AAPL 817.5 \n", - " COST 482.5 \n", - " GLD 177.5 \n", - " TSLA 2160.0 \n", - "2022-04-08 AAPL 805.0 \n", - " COST 555.0 \n", - " GLD 187.5 \n", - " TSLA 1890.0 \n", - "2022-04-11 AAPL 837.5 \n", - " COST 462.5 \n", - " GLD 195.0 \n", - " TSLA 1957.5 \n", - "2022-04-12 AAPL 782.5 \n", - " COST 397.5 \n", - " GLD 210.0 \n", - " TSLA 1462.5 \n", - "2022-04-13 AAPL 810.0 \n", - " COST 452.5 \n", - " GLD 217.5 \n", - " TSLA 1732.5 \n", - "2022-04-14 AAPL 747.5 \n", - " COST 512.5 \n", - " GLD 217.5 \n", - " TSLA 1732.5 \n", - "2022-04-15 AAPL 747.5 \n", - " COST 512.5 \n", - " GLD 217.5 \n", - " TSLA 1732.5 \n", - "2022-04-18 AAPL 745.0 \n", - " COST 405.0 \n", - " GLD 220.0 \n", - " TSLA 1485.0 \n", - "2022-04-19 AAPL 762.5 \n", - " COST 482.5 \n", - " GLD 195.0 \n", - " TSLA 1620.0 \n", - "2022-04-20 AAPL 777.5 \n", - " COST 540.0 \n", - " GLD 190.0 \n", - " TSLA 1350.0 \n", - "2022-04-21 AAPL 795.0 \n", - " COST 460.0 \n", - " GLD 197.5 \n", - " TSLA 1597.5 \n", - "2022-04-22 AAPL 702.5 \n", - " COST 435.0 \n", - " GLD 185.0 \n", - " TSLA 967.5 \n", - "2022-04-25 AAPL 720.0 \n", - " COST 405.0 \n", - " GLD 150.0 \n", - " TSLA 1372.5 \n", - "2022-04-26 COST 282.5 \n", - " GLD 197.5 \n", - "2022-04-27 COST 325.0 \n", - " GLD 145.0 \n", - "2022-04-28 COST 340.0 \n", - " GLD 152.5 \n", - "2022-04-29 GLD 155.0 \n", - "2022-05-02 GLD 132.5 \n", - "2022-05-03 GLD 132.5 \n", - "2022-05-04 GLD 145.0 \n", - "2022-05-05 GLD 137.5 \n", - "2022-05-06 GLD 142.5 \n", - "2022-05-09 GLD 127.5 \n", - "2022-08-10 AAPL 562.5 \n", - "2022-08-11 AAPL 557.5 \n", - "2022-08-12 AAPL 600.0 \n", - "2022-08-15 AAPL 630.0 \n", - "2022-08-16 AAPL 620.0 \n", - "2022-08-17 AAPL 642.5 \n", - "2022-08-18 AAPL 635.0 \n", - "2022-08-19 AAPL 602.5 \n", - "2022-08-22 AAPL 552.5 \n", - "2022-08-23 AAPL 540.0 \n", - "2022-08-24 AAPL 550.0 \n", - "2022-08-25 AAPL 577.5 \n", - "2022-08-26 AAPL 525.0 \n", - "2022-11-04 CAT 317.5 \n", - "2022-11-07 CAT 335.0 \n", - "2022-11-08 CAT 357.5 \n", - "2022-11-09 CAT 332.5 \n", - "2022-11-10 CAT 367.5 \n", - "2022-11-11 CAT 397.5 \n", - "2022-11-14 CAT 395.0 \n", - "2022-11-15 CAT 385.0 \n", - "2022-11-16 CAT 357.5 \n", - " BA 570.0 \n", - "2022-11-17 CAT 367.5 \n", - " BA 547.5 \n", - "2022-11-18 CAT 367.5 \n", - " BA 540.0 \n", - "2022-11-21 CAT 365.0 \n", - " BA 555.0 \n", - "2022-11-22 CAT 412.5 \n", - " BA 502.5 \n", - "2022-11-23 CAT 395.0 \n", - " BA 525.0 \n", - "2022-11-24 CAT 395.0 \n", - " BA 600.0 \n", - "2022-11-25 CAT 422.5 \n", - " BA 600.0 \n", - "2022-11-28 CAT 375.0 \n", - " BA 517.5 \n", - "2022-11-29 CAT 390.0 \n", - " BA 570.0 \n", - "2022-11-30 CAT 382.5 \n", - " BA 645.0 \n", - "2022-12-01 CAT 392.5 \n", - " BA 532.5 \n", - "2022-12-02 CAT 395.0 \n", - " BA 682.5 \n", - "2022-12-05 CAT 370.0 \n", - " BA 727.5 \n", - "2022-12-06 CAT 337.5 \n", - " BA 585.0 \n", - "2022-12-07 CAT 327.5 \n", - " BA 577.5 \n", - "2022-12-08 CAT 342.5 \n", - " BA 600.0 \n", - "2022-12-09 CAT 315.0 \n", - " BA 607.5 \n", - "2022-12-12 CAT 382.5 \n", - " BA 765.0 \n", - "2022-12-13 CAT 370.0 \n", - " BA 742.5 \n", - "2022-12-14 CAT 375.0 \n", - " BA 780.0 \n", - "2022-12-15 CAT 352.5 \n", - " BA 682.5 \n", - "2022-12-16 CAT 352.5 \n", - " BA 727.5 \n", - "2022-12-19 CAT 362.5 \n", - " BA 720.0 \n", - "2022-12-20 CAT 372.5 \n", - " BA 765.0 \n", - "2022-12-21 CAT 432.5 \n", - " BA 930.0 \n", - "2022-12-22 CAT 392.5 \n", - " BA 802.5 \n", - "2022-12-23 CAT 410.0 \n", - " BA 795.0 \n", - "2022-12-26 CAT 435.0 \n", - " BA 780.0 \n", - "2022-12-27 CAT 435.0 \n", - " BA 780.0 \n", - "2022-12-28 CAT 407.5 \n", - " BA 765.0 \n", - "2022-12-29 CAT 417.5 \n", - " BA 772.5 " - ] - }, - "execution_count": 50, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "pd.set_option('display.max_rows', 10000)\n", - "evb_backtest.portfolio.get_all_positions()" - ] - }, - { - "cell_type": "code", - "execution_count": 373, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'\"\\nWhy do these two return weird stuff after run?\\n current_weighted_holdings\\n current_positions\\n\\nI can\\'t reconcile the cost with the data (NVM, haha)\\n\\n'" - ] - }, - "execution_count": 373, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "\n", - "\"\"\"\"\n", - "Why do these two return weird stuff after run?\n", - " current_weighted_holdings\n", - " current_positions\n", - "\n", - "I can't reconcile the cost with the data (NVM, haha)\n", - "\n", - "\"\"\"\n", - "# evb_backtest.portfolio.all_positions" - ] - }, - { - "cell_type": "code", - "execution_count": 269, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'BA': {'result': 'TOO_ILLIQUID', 'data': None},\n", - " 'BAC': {'result': 'SUCCESSFUL',\n", - " 'data': {'long': ['BAC20240719C32'],\n", - " 'trade_id': '&L:BAC20240719C32',\n", - " 'close': 3.2}},\n", - " 'INTC': {'result': 'SUCCESSFUL',\n", - " 'data': {'long': ['INTC20240719C39'],\n", - " 'trade_id': '&L:INTC20240719C39',\n", - " 'close': 12.25}},\n", - " 'HD': {'result': 'TOO_ILLIQUID', 'data': None},\n", - " 'AMD': {'result': 'SUCCESSFUL',\n", - " 'data': {'long': ['AMD20240719C135'],\n", - " 'trade_id': '&L:AMD20240719C135',\n", - " 'close': 16.625}},\n", - " 'QCOM': {'result': 'SUCCESSFUL',\n", - " 'data': {'long': ['QCOM20240719C140'],\n", - " 'trade_id': '&L:QCOM20240719C140',\n", - " 'close': 45.9}},\n", - " 'MU': {'result': 'SUCCESSFUL',\n", - " 'data': {'long': ['MU20240719C85'],\n", - " 'trade_id': '&L:MU20240719C85',\n", - " 'close': 29.375}}}" - ] - }, - "execution_count": 269, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "order_cache['2024-01-03']" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Extend for get_port_stats\n", - "- Buy & Hold\n", - "- Dates\n", - "- Trades\n", - "- _strategy in Aggregate\n", - "- The function" - ] - }, - { - "cell_type": "code", - "execution_count": 214, - "metadata": {}, - "outputs": [], - "source": [ - "evb_backtest.trades.to_csv(f'/Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/output/profitable_trades_options_{key}.csv')" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": ".venv", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.11" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/EventDriven/demos/faulthandler_log.txt b/EventDriven/demos/faulthandler_log.txt deleted file mode 100644 index e69de29..0000000 diff --git a/EventDriven/demos/investigate.txt b/EventDriven/demos/investigate.txt deleted file mode 100644 index f785129..0000000 --- a/EventDriven/demos/investigate.txt +++ /dev/null @@ -1,19 +0,0 @@ -1: -&L:AMD20240119C150&S:AMD20240119C200 2023-02-02 2023-09-21 - - Why is the equity return of this +16% but this is -72%? - -2: -COST -948.660096 -1.158994 204.630063 5.2 33.320253 813.320253 8.185203 38.520253 -32.534961 5.2 5.060157 -124.939843 -1.301398 10.260157 4 2022-01-11 2022-01-21 10 &L:COST20230120C680&S:COST20230120C700 COST20220111LONG -15.0 506.0 510.0 566.204785 529.289978 -553.722111 -0.065197 2022-01-04 2022-01-10 6 COST -{'type': 'naked', - 'specifics': [{'direction': 'long', - 'rel_strike': .850, - 'dte': 300, - 'moneyness_width': 0.35}, - {'direction': 'short', - 'rel_strike': .60, - 'dte': 300, - 'moneyness_width': 0.35} -], - 'name': 'vertical_spread'} -This is causing exit price to go negative. The possible solution is to move ahead and use a different price. \ No newline at end of file diff --git a/EventDriven/demos/load_structures.ipynb b/EventDriven/demos/load_structures.ipynb deleted file mode 100644 index 87668b6..0000000 --- a/EventDriven/demos/load_structures.ipynb +++ /dev/null @@ -1,8711 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The autoreload extension is already loaded. To reload it, use:\n", - " %reload_ext autoreload\n" - ] - } - ], - "source": [ - "%load_ext autoreload\n", - "%autoreload 2\n", - "from trade.assets.OptionStructure import OptionStructure\n", - "from trade.assets.helpers.loaders import create_object_from_id\n", - "from trade.helpers.Context import Context\n", - "from trade.assets.Calculate import Calculate\n", - "import yfinance as yf \n", - "import pandas as pd\n", - "import numpy as np\n", - "from trade.assets.Stock import Stock\n", - "from pandas.tseries.offsets import BDay\n", - "from trade.assets.Option import Option\n", - "import threading\n", - "import time\n", - "from IPython.display import clear_output" - ] - }, - { - "cell_type": "code", - "execution_count": 64, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[0;31mSignature:\u001b[0m\n", - "\u001b[0mcreate_object_from_id\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0moption_id\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mdate\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'2025-02-26'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mrun_chain\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mbool\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mdefault_fill\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'midpoint'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mDocstring:\u001b[0m\n", - "return an Option object from an option id, or an OptionStructure object from a structure id\n", - "\n", - "Args:\n", - "option_id: str: the option id to create an object from\n", - "date: str: the date to use for the option object build date\n", - "run_chain: bool: whether to run the chain for the option object\n", - "\n", - "Returns:\n", - "Option or OptionStructure: the object created from the option id\n", - "\u001b[0;31mFile:\u001b[0m ~/cloned_repos/QuantTools/trade/assets/helpers/loaders.py\n", - "\u001b[0;31mType:\u001b[0m function" - ] - } - ], - "source": [ - "create_object_from_id?" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "Option.clear_instances()" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving to cache from db\n", - "Updating db rates data\n", - "Rows inserted into rates_timeseries: 9\r" - ] - }, - { - "data": { - "text/plain": [ - "({Timestamp('2023-02-15 16:00:00'): 227.63999938964844},\n", - " {Timestamp('2023-02-15 16:00:00'): 22.763999938964844})" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# aapl = Stock('AAPL')\n", - "with Context(end_date = '2023-02-15'):\n", - " nvda = Stock('NVDA')\n", - "# ts = aapl.spot(ts = True, spot_type = 'chain_price')\n", - "# ts\n", - "no_chain = nvda.spot(ts = False, spot_type = 'chain_price')\n", - "chain = nvda.spot(ts = False, spot_type = 'close')\n", - "no_chain, chain" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "with Context(end_date = '2025-02-21'):\n", - " option = Option('NVDA', 300.0, '2027-01-15', 'c', run_chain = False)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Start: 2024-02-19 09:30:00, End: 2025-02-25 16:00:00, ts_start: 2024-02-21 09:30:00, ts_end: 2025-02-21 16:00:00\n", - "Using available dataing available data\r" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Delta_PnLGamma_PnLTheta_PnLVega_PnLRho_PnLTotalUnexplainedActual_PnLPrice
Datetime
2025-01-07NaNNaNNaNNaNNaN0.000000NaNNaN1335.0
2025-01-08-0.8681800.000150-2.692931-41.7920800.110041-45.2430010.243001-45.01290.0
2025-01-090.0000000.000000-2.6397100.0000000.000000-2.6397102.6397100.01290.0
2025-01-10-119.1600852.941274-2.639710-9.7074240.433844-128.132101-1.867899-130.01160.0
2025-01-13-71.7646671.205050-7.440157-20.3716280.249707-98.1216961.121696-97.01063.0
2025-01-14-37.4787810.363673-2.3577630.680291-0.234090-39.0266690.026669-39.01024.0
2025-01-15111.8681083.379772-2.305877-43.908053-0.36317368.670776-2.67077666.01090.0
2025-01-16-68.8534081.199198-2.39901852.099147-0.484791-18.438872-1.561128-20.01070.0
2025-01-17105.8886202.881807-2.375316-43.929391-0.09376662.371953-2.37195360.01130.0
2025-01-200.0000000.000000-7.3762670.0000000.000000-7.3762677.3762670.01130.0
2025-01-2182.0575621.635026-2.458756-12.2332230.19886769.199477-8.19947761.01191.0
2025-01-22168.7465236.528939-2.55170932.6006550.934795206.2592042.740796209.01400.0
2025-01-234.4305900.003734-2.818648-36.599475-0.116690-35.1004890.100489-35.01365.0
2025-01-24-133.9132463.523203-2.778157-1.612467-0.462325-135.2429930.242993-135.01230.0
2025-01-27-665.77190098.073971-7.836686213.853917-0.904790-362.585488-59.414512-422.0808.0
2025-01-28232.57705918.823966-2.014702-48.8905860.070741200.566478-8.566478192.01000.0
2025-01-29-130.5730904.705290-2.31245262.536221-0.085818-65.729848-4.270152-70.0930.0
2025-01-3022.6094060.152039-2.21187519.381443-0.23711539.6938990.30610140.0970.0
2025-01-31-111.6832313.531874-2.27496426.9042590.243322-83.278740-1.721260-85.0885.0
2025-02-03-79.1912951.962171-6.445279-12.5171640.074486-96.1170811.117081-95.0790.0
2025-02-0443.3020130.667284-2.003508-61.5406150.783622-18.791205-1.208795-20.0770.0
2025-02-05131.8108606.412692-1.973388-9.951223-0.102771126.196170-1.196170125.0895.0
2025-02-0689.2956182.492974-2.178060-9.1112340.11659380.615891-0.61589180.0975.0
2025-02-0728.1986250.226184-2.30309317.9131710.62667244.6615580.33844245.01020.0
2025-02-1093.0571022.337497-7.1210176.7314480.00000095.005029-0.00502995.01115.0
2025-02-11-20.1671020.099309-2.519333-7.394945-0.137960-30.1200310.120031-30.01085.0
2025-02-12-42.8105810.461952-2.4798476.8191620.135251-37.874063-0.125937-38.01047.0
2025-02-13104.9756622.890043-2.428671-20.485848-0.65516784.296018-1.29601883.01130.0
2025-02-1493.7655052.120913-2.548748-22.2495160.00000071.088153-1.08815370.01200.0
2025-02-170.0000000.000000-7.9419320.0000000.000000-7.9419327.9419320.01200.0
2025-02-1814.9509770.050503-2.647311-4.3408590.0000008.013311-8.0133110.01200.0
2025-02-19-4.6177550.004824-2.660787-23.1225320.246695-30.1495540.149554-30.01170.0
2025-02-2023.5545280.129485-2.6226614.549901-0.63306624.9781870.02181325.01195.0
2025-02-21-153.7786255.387663-2.65973528.046563-0.395344-123.399479-1.600521-125.01070.0
\n", - "
" - ], - "text/plain": [ - " Delta_PnL Gamma_PnL Theta_PnL Vega_PnL Rho_PnL \\\n", - "Datetime \n", - "2025-01-07 NaN NaN NaN NaN NaN \n", - "2025-01-08 -0.868180 0.000150 -2.692931 -41.792080 0.110041 \n", - "2025-01-09 0.000000 0.000000 -2.639710 0.000000 0.000000 \n", - "2025-01-10 -119.160085 2.941274 -2.639710 -9.707424 0.433844 \n", - "2025-01-13 -71.764667 1.205050 -7.440157 -20.371628 0.249707 \n", - "2025-01-14 -37.478781 0.363673 -2.357763 0.680291 -0.234090 \n", - "2025-01-15 111.868108 3.379772 -2.305877 -43.908053 -0.363173 \n", - "2025-01-16 -68.853408 1.199198 -2.399018 52.099147 -0.484791 \n", - "2025-01-17 105.888620 2.881807 -2.375316 -43.929391 -0.093766 \n", - "2025-01-20 0.000000 0.000000 -7.376267 0.000000 0.000000 \n", - "2025-01-21 82.057562 1.635026 -2.458756 -12.233223 0.198867 \n", - "2025-01-22 168.746523 6.528939 -2.551709 32.600655 0.934795 \n", - "2025-01-23 4.430590 0.003734 -2.818648 -36.599475 -0.116690 \n", - "2025-01-24 -133.913246 3.523203 -2.778157 -1.612467 -0.462325 \n", - "2025-01-27 -665.771900 98.073971 -7.836686 213.853917 -0.904790 \n", - "2025-01-28 232.577059 18.823966 -2.014702 -48.890586 0.070741 \n", - "2025-01-29 -130.573090 4.705290 -2.312452 62.536221 -0.085818 \n", - "2025-01-30 22.609406 0.152039 -2.211875 19.381443 -0.237115 \n", - "2025-01-31 -111.683231 3.531874 -2.274964 26.904259 0.243322 \n", - "2025-02-03 -79.191295 1.962171 -6.445279 -12.517164 0.074486 \n", - "2025-02-04 43.302013 0.667284 -2.003508 -61.540615 0.783622 \n", - "2025-02-05 131.810860 6.412692 -1.973388 -9.951223 -0.102771 \n", - "2025-02-06 89.295618 2.492974 -2.178060 -9.111234 0.116593 \n", - "2025-02-07 28.198625 0.226184 -2.303093 17.913171 0.626672 \n", - "2025-02-10 93.057102 2.337497 -7.121017 6.731448 0.000000 \n", - "2025-02-11 -20.167102 0.099309 -2.519333 -7.394945 -0.137960 \n", - "2025-02-12 -42.810581 0.461952 -2.479847 6.819162 0.135251 \n", - "2025-02-13 104.975662 2.890043 -2.428671 -20.485848 -0.655167 \n", - "2025-02-14 93.765505 2.120913 -2.548748 -22.249516 0.000000 \n", - "2025-02-17 0.000000 0.000000 -7.941932 0.000000 0.000000 \n", - "2025-02-18 14.950977 0.050503 -2.647311 -4.340859 0.000000 \n", - "2025-02-19 -4.617755 0.004824 -2.660787 -23.122532 0.246695 \n", - "2025-02-20 23.554528 0.129485 -2.622661 4.549901 -0.633066 \n", - "2025-02-21 -153.778625 5.387663 -2.659735 28.046563 -0.395344 \n", - "\n", - " Total Unexplained Actual_PnL Price \n", - "Datetime \n", - "2025-01-07 0.000000 NaN NaN 1335.0 \n", - "2025-01-08 -45.243001 0.243001 -45.0 1290.0 \n", - "2025-01-09 -2.639710 2.639710 0.0 1290.0 \n", - "2025-01-10 -128.132101 -1.867899 -130.0 1160.0 \n", - "2025-01-13 -98.121696 1.121696 -97.0 1063.0 \n", - "2025-01-14 -39.026669 0.026669 -39.0 1024.0 \n", - "2025-01-15 68.670776 -2.670776 66.0 1090.0 \n", - "2025-01-16 -18.438872 -1.561128 -20.0 1070.0 \n", - "2025-01-17 62.371953 -2.371953 60.0 1130.0 \n", - "2025-01-20 -7.376267 7.376267 0.0 1130.0 \n", - "2025-01-21 69.199477 -8.199477 61.0 1191.0 \n", - "2025-01-22 206.259204 2.740796 209.0 1400.0 \n", - "2025-01-23 -35.100489 0.100489 -35.0 1365.0 \n", - "2025-01-24 -135.242993 0.242993 -135.0 1230.0 \n", - "2025-01-27 -362.585488 -59.414512 -422.0 808.0 \n", - "2025-01-28 200.566478 -8.566478 192.0 1000.0 \n", - "2025-01-29 -65.729848 -4.270152 -70.0 930.0 \n", - "2025-01-30 39.693899 0.306101 40.0 970.0 \n", - "2025-01-31 -83.278740 -1.721260 -85.0 885.0 \n", - "2025-02-03 -96.117081 1.117081 -95.0 790.0 \n", - "2025-02-04 -18.791205 -1.208795 -20.0 770.0 \n", - "2025-02-05 126.196170 -1.196170 125.0 895.0 \n", - "2025-02-06 80.615891 -0.615891 80.0 975.0 \n", - "2025-02-07 44.661558 0.338442 45.0 1020.0 \n", - "2025-02-10 95.005029 -0.005029 95.0 1115.0 \n", - "2025-02-11 -30.120031 0.120031 -30.0 1085.0 \n", - "2025-02-12 -37.874063 -0.125937 -38.0 1047.0 \n", - "2025-02-13 84.296018 -1.296018 83.0 1130.0 \n", - "2025-02-14 71.088153 -1.088153 70.0 1200.0 \n", - "2025-02-17 -7.941932 7.941932 0.0 1200.0 \n", - "2025-02-18 8.013311 -8.013311 0.0 1200.0 \n", - "2025-02-19 -30.149554 0.149554 -30.0 1170.0 \n", - "2025-02-20 24.978187 0.021813 25.0 1195.0 \n", - "2025-02-21 -123.399479 -1.600521 -125.0 1070.0 " - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "Calculate.attribution(option, method = 'GB')" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
rootexpirationstrikeright
0NVDA2025022187.0P
1NVDA20250919215.0C
2NVDA2025091984.0P
3NVDA20250321218.0C
4NVDA2026061880.0C
...............
3066NVDA2027011575.0P
3067NVDA20260116212.0C
3068NVDA2026011681.0P
3069NVDA2026121876.0C
3070NVDA2025121982.0C
\n", - "

3071 rows × 4 columns

\n", - "
" - ], - "text/plain": [ - " root expiration strike right\n", - "0 NVDA 20250221 87.0 P\n", - "1 NVDA 20250919 215.0 C\n", - "2 NVDA 20250919 84.0 P\n", - "3 NVDA 20250321 218.0 C\n", - "4 NVDA 20260618 80.0 C\n", - "... ... ... ... ...\n", - "3066 NVDA 20270115 75.0 P\n", - "3067 NVDA 20260116 212.0 C\n", - "3068 NVDA 20260116 81.0 P\n", - "3069 NVDA 20261218 76.0 C\n", - "3070 NVDA 20251219 82.0 C\n", - "\n", - "[3071 rows x 4 columns]" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from dbase.DataAPI.ThetaData import list_contracts\n", - "list_contracts('NVDA', start_date = '2025-02-18')" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "with Context(end_date = '2025-02-18'):\n", - " option = Option('NVDA', 212.0, '2026-01-16', 'c', run_chain = False)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
OpenHighLowCloseMidpointVolume
Datetime
2025-01-240.00.000.000.0010.4750
2025-01-277.17.105.305.755.67527
2025-01-285.67.395.607.397.4504
2025-01-296.96.906.236.406.8253
2025-01-306.66.806.606.807.1752
2025-01-317.57.606.256.256.3253
\n", - "
" - ], - "text/plain": [ - " Open High Low Close Midpoint Volume\n", - "Datetime \n", - "2025-01-24 0.0 0.00 0.00 0.00 10.475 0\n", - "2025-01-27 7.1 7.10 5.30 5.75 5.675 27\n", - "2025-01-28 5.6 7.39 5.60 7.39 7.450 4\n", - "2025-01-29 6.9 6.90 6.23 6.40 6.825 3\n", - "2025-01-30 6.6 6.80 6.60 6.80 7.175 2\n", - "2025-01-31 7.5 7.60 6.25 6.25 6.325 3" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "option.spot(ts = True, ts_start = '2025-01-24', ts_end = '2025-01-31')" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "# greeks = Calculate.greeks(option)\n", - "# pct_slides = Calculate.pct_spot_slides(option)\n", - "vol_slides = Calculate.pct_vol_slides(option)\n", - "# greeks" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(0.490366933998826, 9.100000000000001)" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "option.sigma, option.pv" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "8" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "[<_MainThread(MainThread, started 140704397355776)>,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ]" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "yf.__version__\n", - "display(threading.active_count())\n", - "display(threading.enumerate())" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "def _create_object_from_id(*args ,**kwargs):\n", - " try:\n", - " return create_object_from_id(*args, **kwargs)\n", - " except Exception as e:\n", - " print(e)\n", - " print(kwargs, args)\n", - " return None" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Import Trades" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
TickerPnLEntryPriceExitPriceReturnPctQuantityEntryTimeExitTimeDurationPositions
0TSLA-469.319634200.595187157.929765-21.269414112023-07-052023-08-0228&L:TSLA20240621C333.33&S:TSLA20240621C340
1AAPL1.565517200.443306200.7042260.13017162023-07-052023-08-0430&L:AAPL20240621C230&S:AAPL20240621C240
2MSFT-276.544545200.353116160.846753-19.71836772023-07-052023-08-0935&L:MSFT20240621C370&S:MSFT20240621C375
3AMZN-43.770957200.305228156.534271-21.85212912023-07-052023-10-25112&L:AMZN20240621C165&S:AMZN20240621C175
4NVDA25078.793707190.9552512977.4878851459.25949492023-07-052024-07-01362&L:NVDA20240621C770&S:NVDA20240621C800
5BA-30.225169185.573604155.348435-16.28742912023-08-102023-08-177&L:BA20240621C300&S:BA20240621C310
6WMT0.000000NaNNaNNaN02023-08-102023-08-177&L:WMT20240621C175&S:WMT20240621C180
7TSLA-43.298192200.384529195.573618-2.40083992023-08-172023-10-2064&L:TSLA20240920C305&S:TSLA20240920C315
8AAPL-298.098050199.060910149.377901-24.95869762023-08-312023-09-077&L:AAPL20240920C260&S:AAPL20240920C310
9INTC0.000000NaNNaNNaN02023-09-152023-09-205&L:INTC20240621C40&S:INTC20240621C45
10QCOM270.205981185.344291455.550271145.78597512023-11-132024-07-01231&L:QCOM20250117C135&S:QCOM20250117C140
11MSFT1304.375600195.612225456.487345133.36340352023-11-142024-07-01230&L:MSFT20241220C395&S:MSFT20241220C400
12SBUX-223.069814193.018583148.404621-23.11381752023-11-152023-11-2914&L:SBUX20250117C115&S:SBUX20250117C120
13AMD478.825829185.555172424.968086129.02519122023-11-152024-07-01229&L:AMD20240920C180&S:AMD20240920C200
14MU0.000000NaNNaNNaN02023-11-162024-07-01228&L:MU20250117C85&S:MU20250117C90
15INTC0.000000NaNNaNNaN02023-11-172024-04-03138&L:INTC20240920C47&S:INTC20240920C50
16DIS-77.019783168.78972791.769945-45.63061012023-11-172024-01-1054&L:DIS20240920C115&S:DIS20240920C125
17AAPL-223.014459185.293680140.690788-24.07145952023-11-222024-01-0443&L:AAPL20241220C215&S:AAPL20241220C220
18BAC1112.010436199.689612570.359757185.62314932023-12-012024-07-01213&L:BAC20250117C35&S:BAC20250117C55
19HD796.51830775.628672208.381723175.53270262023-12-042024-04-17135&L:HD20250117C390&S:HD20250117C400
20BA-85.187057163.41361678.226558-52.12971812023-12-042024-01-1239&L:BA20250117C310&S:BA20250117C320
21GOOG502.670424192.213727317.88133365.37910142024-01-262024-01-315&L:GOOG20250117C190&S:GOOG20250117C200
22WMT0.000000NaNNaNNaN02024-02-052024-07-01147&L:WMT20250117C185&S:WMT20250117C190
23DIS-69.548144198.011080128.462936-35.12336012024-02-072024-05-1699&L:DIS20250117C130&S:DIS20250117C150
24AMZN134.166232198.531193332.69742567.57942212024-02-082024-07-01144&L:AMZN20250117C185&S:AMZN20250117C190
25AAPL48.790640188.225814200.4234746.48033342024-05-212024-07-0141&L:AAPL20250620C225&S:AAPL20250620C230
\n", - "
" - ], - "text/plain": [ - " Ticker PnL EntryPrice ExitPrice ReturnPct Quantity \\\n", - "0 TSLA -469.319634 200.595187 157.929765 -21.269414 11 \n", - "1 AAPL 1.565517 200.443306 200.704226 0.130171 6 \n", - "2 MSFT -276.544545 200.353116 160.846753 -19.718367 7 \n", - "3 AMZN -43.770957 200.305228 156.534271 -21.852129 1 \n", - "4 NVDA 25078.793707 190.955251 2977.487885 1459.259494 9 \n", - "5 BA -30.225169 185.573604 155.348435 -16.287429 1 \n", - "6 WMT 0.000000 NaN NaN NaN 0 \n", - "7 TSLA -43.298192 200.384529 195.573618 -2.400839 9 \n", - "8 AAPL -298.098050 199.060910 149.377901 -24.958697 6 \n", - "9 INTC 0.000000 NaN NaN NaN 0 \n", - "10 QCOM 270.205981 185.344291 455.550271 145.785975 1 \n", - "11 MSFT 1304.375600 195.612225 456.487345 133.363403 5 \n", - "12 SBUX -223.069814 193.018583 148.404621 -23.113817 5 \n", - "13 AMD 478.825829 185.555172 424.968086 129.025191 2 \n", - "14 MU 0.000000 NaN NaN NaN 0 \n", - "15 INTC 0.000000 NaN NaN NaN 0 \n", - "16 DIS -77.019783 168.789727 91.769945 -45.630610 1 \n", - "17 AAPL -223.014459 185.293680 140.690788 -24.071459 5 \n", - "18 BAC 1112.010436 199.689612 570.359757 185.623149 3 \n", - "19 HD 796.518307 75.628672 208.381723 175.532702 6 \n", - "20 BA -85.187057 163.413616 78.226558 -52.129718 1 \n", - "21 GOOG 502.670424 192.213727 317.881333 65.379101 4 \n", - "22 WMT 0.000000 NaN NaN NaN 0 \n", - "23 DIS -69.548144 198.011080 128.462936 -35.123360 1 \n", - "24 AMZN 134.166232 198.531193 332.697425 67.579422 1 \n", - "25 AAPL 48.790640 188.225814 200.423474 6.480333 4 \n", - "\n", - " EntryTime ExitTime Duration \\\n", - "0 2023-07-05 2023-08-02 28 \n", - "1 2023-07-05 2023-08-04 30 \n", - "2 2023-07-05 2023-08-09 35 \n", - "3 2023-07-05 2023-10-25 112 \n", - "4 2023-07-05 2024-07-01 362 \n", - "5 2023-08-10 2023-08-17 7 \n", - "6 2023-08-10 2023-08-17 7 \n", - "7 2023-08-17 2023-10-20 64 \n", - "8 2023-08-31 2023-09-07 7 \n", - "9 2023-09-15 2023-09-20 5 \n", - "10 2023-11-13 2024-07-01 231 \n", - "11 2023-11-14 2024-07-01 230 \n", - "12 2023-11-15 2023-11-29 14 \n", - "13 2023-11-15 2024-07-01 229 \n", - "14 2023-11-16 2024-07-01 228 \n", - "15 2023-11-17 2024-04-03 138 \n", - "16 2023-11-17 2024-01-10 54 \n", - "17 2023-11-22 2024-01-04 43 \n", - "18 2023-12-01 2024-07-01 213 \n", - "19 2023-12-04 2024-04-17 135 \n", - "20 2023-12-04 2024-01-12 39 \n", - "21 2024-01-26 2024-01-31 5 \n", - "22 2024-02-05 2024-07-01 147 \n", - "23 2024-02-07 2024-05-16 99 \n", - "24 2024-02-08 2024-07-01 144 \n", - "25 2024-05-21 2024-07-01 41 \n", - "\n", - " Positions \n", - "0 &L:TSLA20240621C333.33&S:TSLA20240621C340 \n", - "1 &L:AAPL20240621C230&S:AAPL20240621C240 \n", - "2 &L:MSFT20240621C370&S:MSFT20240621C375 \n", - "3 &L:AMZN20240621C165&S:AMZN20240621C175 \n", - "4 &L:NVDA20240621C770&S:NVDA20240621C800 \n", - "5 &L:BA20240621C300&S:BA20240621C310 \n", - "6 &L:WMT20240621C175&S:WMT20240621C180 \n", - "7 &L:TSLA20240920C305&S:TSLA20240920C315 \n", - "8 &L:AAPL20240920C260&S:AAPL20240920C310 \n", - "9 &L:INTC20240621C40&S:INTC20240621C45 \n", - "10 &L:QCOM20250117C135&S:QCOM20250117C140 \n", - "11 &L:MSFT20241220C395&S:MSFT20241220C400 \n", - "12 &L:SBUX20250117C115&S:SBUX20250117C120 \n", - "13 &L:AMD20240920C180&S:AMD20240920C200 \n", - "14 &L:MU20250117C85&S:MU20250117C90 \n", - "15 &L:INTC20240920C47&S:INTC20240920C50 \n", - "16 &L:DIS20240920C115&S:DIS20240920C125 \n", - "17 &L:AAPL20241220C215&S:AAPL20241220C220 \n", - "18 &L:BAC20250117C35&S:BAC20250117C55 \n", - "19 &L:HD20250117C390&S:HD20250117C400 \n", - "20 &L:BA20250117C310&S:BA20250117C320 \n", - "21 &L:GOOG20250117C190&S:GOOG20250117C200 \n", - "22 &L:WMT20250117C185&S:WMT20250117C190 \n", - "23 &L:DIS20250117C130&S:DIS20250117C150 \n", - "24 &L:AMZN20250117C185&S:AMZN20250117C190 \n", - "25 &L:AAPL20250620C225&S:AAPL20250620C230 " - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "trades = pd.read_csv('/Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/output/profitable_trades_options.csv').iloc[:, 1:]\n", - "trades = trades\n", - "trades" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "# Stock\n", - "Option.clear_instances()\n", - "# Option.list_instances()\n" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "structure = _create_object_from_id(trades.iloc[3]['Positions'], trades.iloc[3]['EntryTime'])" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
TickerPnLEntryPriceExitPriceReturnPctQuantityEntryTimeExitTimeDurationPositionsStructure
0TSLA-469.319634200.595187157.929765-21.269414112023-07-052023-08-0228&L:TSLA20240621C333.33&S:TSLA20240621C340None
1AAPL1.565517200.443306200.7042260.13017162023-07-052023-08-0430&L:AAPL20240621C230&S:AAPL20240621C240None
2MSFT-276.544545200.353116160.846753-19.71836772023-07-052023-08-0935&L:MSFT20240621C370&S:MSFT20240621C375None
3AMZN-43.770957200.305228156.534271-21.85212912023-07-052023-10-25112&L:AMZN20240621C165&S:AMZN20240621C175None
4NVDA25078.793707190.9552512977.4878851459.25949492023-07-052024-07-01362&L:NVDA20240621C770&S:NVDA20240621C800None
5BA-30.225169185.573604155.348435-16.28742912023-08-102023-08-177&L:BA20240621C300&S:BA20240621C310None
6WMT0.000000NaNNaNNaN02023-08-102023-08-177&L:WMT20240621C175&S:WMT20240621C180None
7TSLA-43.298192200.384529195.573618-2.40083992023-08-172023-10-2064&L:TSLA20240920C305&S:TSLA20240920C315None
8AAPL-298.098050199.060910149.377901-24.95869762023-08-312023-09-077&L:AAPL20240920C260&S:AAPL20240920C310None
9INTC0.000000NaNNaNNaN02023-09-152023-09-205&L:INTC20240621C40&S:INTC20240621C45None
10QCOM270.205981185.344291455.550271145.78597512023-11-132024-07-01231&L:QCOM20250117C135&S:QCOM20250117C140None
11MSFT1304.375600195.612225456.487345133.36340352023-11-142024-07-01230&L:MSFT20241220C395&S:MSFT20241220C400None
12SBUX-223.069814193.018583148.404621-23.11381752023-11-152023-11-2914&L:SBUX20250117C115&S:SBUX20250117C120None
13AMD478.825829185.555172424.968086129.02519122023-11-152024-07-01229&L:AMD20240920C180&S:AMD20240920C200None
14MU0.000000NaNNaNNaN02023-11-162024-07-01228&L:MU20250117C85&S:MU20250117C90None
15INTC0.000000NaNNaNNaN02023-11-172024-04-03138&L:INTC20240920C47&S:INTC20240920C50None
16DIS-77.019783168.78972791.769945-45.63061012023-11-172024-01-1054&L:DIS20240920C115&S:DIS20240920C125None
17AAPL-223.014459185.293680140.690788-24.07145952023-11-222024-01-0443&L:AAPL20241220C215&S:AAPL20241220C220None
18BAC1112.010436199.689612570.359757185.62314932023-12-012024-07-01213&L:BAC20250117C35&S:BAC20250117C55None
19HD796.51830775.628672208.381723175.53270262023-12-042024-04-17135&L:HD20250117C390&S:HD20250117C400None
20BA-85.187057163.41361678.226558-52.12971812023-12-042024-01-1239&L:BA20250117C310&S:BA20250117C320None
21GOOG502.670424192.213727317.88133365.37910142024-01-262024-01-315&L:GOOG20250117C190&S:GOOG20250117C200None
22WMT0.000000NaNNaNNaN02024-02-052024-07-01147&L:WMT20250117C185&S:WMT20250117C190None
23DIS-69.548144198.011080128.462936-35.12336012024-02-072024-05-1699&L:DIS20250117C130&S:DIS20250117C150None
24AMZN134.166232198.531193332.69742567.57942212024-02-082024-07-01144&L:AMZN20250117C185&S:AMZN20250117C190None
25AAPL48.790640188.225814200.4234746.48033342024-05-212024-07-0141&L:AAPL20250620C225&S:AAPL20250620C230None
\n", - "
" - ], - "text/plain": [ - " Ticker PnL EntryPrice ExitPrice ReturnPct Quantity \\\n", - "0 TSLA -469.319634 200.595187 157.929765 -21.269414 11 \n", - "1 AAPL 1.565517 200.443306 200.704226 0.130171 6 \n", - "2 MSFT -276.544545 200.353116 160.846753 -19.718367 7 \n", - "3 AMZN -43.770957 200.305228 156.534271 -21.852129 1 \n", - "4 NVDA 25078.793707 190.955251 2977.487885 1459.259494 9 \n", - "5 BA -30.225169 185.573604 155.348435 -16.287429 1 \n", - "6 WMT 0.000000 NaN NaN NaN 0 \n", - "7 TSLA -43.298192 200.384529 195.573618 -2.400839 9 \n", - "8 AAPL -298.098050 199.060910 149.377901 -24.958697 6 \n", - "9 INTC 0.000000 NaN NaN NaN 0 \n", - "10 QCOM 270.205981 185.344291 455.550271 145.785975 1 \n", - "11 MSFT 1304.375600 195.612225 456.487345 133.363403 5 \n", - "12 SBUX -223.069814 193.018583 148.404621 -23.113817 5 \n", - "13 AMD 478.825829 185.555172 424.968086 129.025191 2 \n", - "14 MU 0.000000 NaN NaN NaN 0 \n", - "15 INTC 0.000000 NaN NaN NaN 0 \n", - "16 DIS -77.019783 168.789727 91.769945 -45.630610 1 \n", - "17 AAPL -223.014459 185.293680 140.690788 -24.071459 5 \n", - "18 BAC 1112.010436 199.689612 570.359757 185.623149 3 \n", - "19 HD 796.518307 75.628672 208.381723 175.532702 6 \n", - "20 BA -85.187057 163.413616 78.226558 -52.129718 1 \n", - "21 GOOG 502.670424 192.213727 317.881333 65.379101 4 \n", - "22 WMT 0.000000 NaN NaN NaN 0 \n", - "23 DIS -69.548144 198.011080 128.462936 -35.123360 1 \n", - "24 AMZN 134.166232 198.531193 332.697425 67.579422 1 \n", - "25 AAPL 48.790640 188.225814 200.423474 6.480333 4 \n", - "\n", - " EntryTime ExitTime Duration \\\n", - "0 2023-07-05 2023-08-02 28 \n", - "1 2023-07-05 2023-08-04 30 \n", - "2 2023-07-05 2023-08-09 35 \n", - "3 2023-07-05 2023-10-25 112 \n", - "4 2023-07-05 2024-07-01 362 \n", - "5 2023-08-10 2023-08-17 7 \n", - "6 2023-08-10 2023-08-17 7 \n", - "7 2023-08-17 2023-10-20 64 \n", - "8 2023-08-31 2023-09-07 7 \n", - "9 2023-09-15 2023-09-20 5 \n", - "10 2023-11-13 2024-07-01 231 \n", - "11 2023-11-14 2024-07-01 230 \n", - "12 2023-11-15 2023-11-29 14 \n", - "13 2023-11-15 2024-07-01 229 \n", - "14 2023-11-16 2024-07-01 228 \n", - "15 2023-11-17 2024-04-03 138 \n", - "16 2023-11-17 2024-01-10 54 \n", - "17 2023-11-22 2024-01-04 43 \n", - "18 2023-12-01 2024-07-01 213 \n", - "19 2023-12-04 2024-04-17 135 \n", - "20 2023-12-04 2024-01-12 39 \n", - "21 2024-01-26 2024-01-31 5 \n", - "22 2024-02-05 2024-07-01 147 \n", - "23 2024-02-07 2024-05-16 99 \n", - "24 2024-02-08 2024-07-01 144 \n", - "25 2024-05-21 2024-07-01 41 \n", - "\n", - " Positions Structure \n", - "0 &L:TSLA20240621C333.33&S:TSLA20240621C340 None \n", - "1 &L:AAPL20240621C230&S:AAPL20240621C240 None \n", - "2 &L:MSFT20240621C370&S:MSFT20240621C375 None \n", - "3 &L:AMZN20240621C165&S:AMZN20240621C175 None \n", - "4 &L:NVDA20240621C770&S:NVDA20240621C800 None \n", - "5 &L:BA20240621C300&S:BA20240621C310 None \n", - "6 &L:WMT20240621C175&S:WMT20240621C180 None \n", - "7 &L:TSLA20240920C305&S:TSLA20240920C315 None \n", - "8 &L:AAPL20240920C260&S:AAPL20240920C310 None \n", - "9 &L:INTC20240621C40&S:INTC20240621C45 None \n", - "10 &L:QCOM20250117C135&S:QCOM20250117C140 None \n", - "11 &L:MSFT20241220C395&S:MSFT20241220C400 None \n", - "12 &L:SBUX20250117C115&S:SBUX20250117C120 None \n", - "13 &L:AMD20240920C180&S:AMD20240920C200 None \n", - "14 &L:MU20250117C85&S:MU20250117C90 None \n", - "15 &L:INTC20240920C47&S:INTC20240920C50 None \n", - "16 &L:DIS20240920C115&S:DIS20240920C125 None \n", - "17 &L:AAPL20241220C215&S:AAPL20241220C220 None \n", - "18 &L:BAC20250117C35&S:BAC20250117C55 None \n", - "19 &L:HD20250117C390&S:HD20250117C400 None \n", - "20 &L:BA20250117C310&S:BA20250117C320 None \n", - "21 &L:GOOG20250117C190&S:GOOG20250117C200 None \n", - "22 &L:WMT20250117C185&S:WMT20250117C190 None \n", - "23 &L:DIS20250117C130&S:DIS20250117C150 None \n", - "24 &L:AMZN20250117C185&S:AMZN20250117C190 None \n", - "25 &L:AAPL20250620C225&S:AAPL20250620C230 None " - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "trades['Structure'] = None\n", - "trades[trades.Structure.isna()]" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Start: 2022-07-01 09:30:00, End: 2023-07-14 00:00:00, ts_start: 2022-07-05 09:30:00, ts_end: 2023-07-12\n", - "OptionDataManager Using available data\r" - ] - }, - { - "data": { - "text/plain": [ - "( Datetime Option_Close Midpoint Bs_iv Midpoint_bs_iv Stock_Close \\\n", - " 1 2022-07-06 10.525 10.525 0.364095 0.364095 114.330002 \n", - " 2 2022-07-07 10.750 10.975 0.356311 0.360025 116.330002 \n", - " 3 2022-07-08 10.550 10.700 0.357963 0.360469 115.540001 \n", - " 4 2022-07-11 9.900 9.500 0.368822 0.361757 111.750000 \n", - " 5 2022-07-12 8.800 9.350 0.362617 0.372713 109.220001 \n", - " .. ... ... ... ... ... ... \n", - " 262 2023-07-06 6.350 6.225 0.305476 0.302621 128.360001 \n", - " 263 2023-07-07 7.000 6.725 0.310722 0.304641 129.779999 \n", - " 264 2023-07-10 5.950 6.000 0.306709 0.307887 127.129997 \n", - " 265 2023-07-11 6.200 6.325 0.301651 0.304515 128.779999 \n", - " 266 2023-07-12 6.350 6.875 0.291797 0.303439 130.800003 \n", - " \n", - " RF_rate DATA_FILL prev_day_Option_Close prev_day_Midpoint ... \\\n", - " 1 0.01840 YES 9.500 10.225 ... \n", - " 2 0.01853 NO 10.525 10.525 ... \n", - " 3 0.01843 NO 10.750 10.975 ... \n", - " 4 0.01953 NO 10.550 10.700 ... \n", - " 5 0.02113 NO 9.900 9.500 ... \n", - " .. ... ... ... ... ... \n", - " 262 0.05213 NO 6.950 6.875 ... \n", - " 263 0.05213 NO 6.350 6.225 ... \n", - " 264 0.05225 NO 7.000 6.725 ... \n", - " 265 0.05243 NO 5.950 6.000 ... \n", - " 266 0.05230 NO 6.200 6.325 ... \n", - " \n", - " prev_day_DATA_FILL Stock_Close_Change_Mark Vol_Change_Mark \\\n", - " 1 NO 0.830002 0.011024 \n", - " 2 YES 2.000000 -0.007784 \n", - " 3 NO -0.790001 0.001652 \n", - " 4 NO -3.790001 0.010859 \n", - " 5 NO -2.529999 -0.006205 \n", - " .. ... ... ... \n", - " 262 NO -2.020004 0.000602 \n", - " 263 NO 1.419998 0.005247 \n", - " 264 NO -2.650002 -0.004014 \n", - " 265 NO 1.650002 -0.005057 \n", - " 266 NO 2.020004 -0.009855 \n", - " \n", - " Option_Close_Change_Mark Option_Close_Change_Percent \\\n", - " 1 1.025 0.107895 \n", - " 2 0.225 0.021378 \n", - " 3 -0.200 -0.018605 \n", - " 4 -0.650 -0.061611 \n", - " 5 -1.100 -0.111111 \n", - " .. ... ... \n", - " 262 -0.600 -0.086331 \n", - " 263 0.650 0.102362 \n", - " 264 -1.050 -0.150000 \n", - " 265 0.250 0.042017 \n", - " 266 0.150 0.024194 \n", - " \n", - " Midpoint_Change_Percent Stock_Close_Change_Percent RF_rate_Change_Mark \\\n", - " 1 0.029340 0.007313 0.00210 \n", - " 2 0.042755 0.017493 0.00013 \n", - " 3 -0.025057 -0.006791 -0.00010 \n", - " 4 -0.112150 -0.032803 0.00110 \n", - " 5 -0.015789 -0.022640 0.00160 \n", - " .. ... ... ... \n", - " 262 -0.094545 -0.015493 0.00020 \n", - " 263 0.080321 0.011063 0.00000 \n", - " 264 -0.107807 -0.020419 0.00012 \n", - " 265 0.054167 0.012979 0.00018 \n", - " 266 0.086957 0.015686 -0.00013 \n", - " \n", - " total_seconds prev_day_Datetime \n", - " 1 1.0 2022-07-05 \n", - " 2 1.0 2022-07-06 \n", - " 3 1.0 2022-07-07 \n", - " 4 3.0 2022-07-08 \n", - " 5 1.0 2022-07-11 \n", - " .. ... ... \n", - " 262 1.0 2023-07-05 \n", - " 263 1.0 2023-07-06 \n", - " 264 3.0 2023-07-07 \n", - " 265 1.0 2023-07-10 \n", - " 266 1.0 2023-07-11 \n", - " \n", - " [266 rows x 24 columns],\n", - " Delta_PnL Gamma_PnL Vega_PnL Volga_PnL Theta_PnL Rho_PnL \\\n", - " Datetime \n", - " 2022-07-06 27.269129 0.221645 67.018394 -3.222704 -1.540249 11.511835 \n", - " 2022-07-07 69.384059 1.264705 -48.717943 2.879610 -1.650328 0.743318 \n", - " 2022-07-08 -27.843347 0.199845 10.569034 -0.574532 -1.660327 -0.592520 \n", - " 2022-07-11 -132.080085 4.601168 68.680034 -3.454608 -4.946859 6.407574 \n", - " 2022-07-12 -84.793502 2.029598 -37.345066 2.200689 -1.621711 8.613512 \n", - " ... ... ... ... ... ... ... \n", - " 2023-07-06 -64.503557 1.861522 2.946026 -0.191242 -2.474795 0.669045 \n", - " 2023-07-07 42.761799 0.915597 24.582512 -1.496879 -2.369427 0.000000 \n", - " 2023-07-10 -84.327272 3.159209 -19.475539 1.320934 -7.510925 0.394866 \n", - " 2023-07-11 47.688399 1.228041 -22.886027 1.546971 -2.313249 0.527284 \n", - " 2023-07-12 60.361963 1.879538 -45.829824 3.257921 -2.360986 -0.397857 \n", - " \n", - " Vanna_PnL Dividend_PnL Total_PnL Unexplained_PnL Actual_PnL \\\n", - " Datetime \n", - " 2022-07-06 0.861185 0.0 102.119234 0.380766 102.5 \n", - " 2022-07-07 -1.425249 0.0 22.478172 0.021828 22.5 \n", - " 2022-07-08 -0.119636 0.0 -20.021483 0.021483 -20.0 \n", - " 2022-07-11 -3.810030 0.0 -64.602806 -0.397194 -65.0 \n", - " 2022-07-12 1.491470 0.0 -109.425010 -0.574990 -110.0 \n", - " ... ... ... ... ... ... \n", - " 2023-07-06 -0.111717 0.0 -61.804718 1.804718 -60.0 \n", - " 2023-07-07 0.680749 0.0 65.074351 -0.074351 65.0 \n", - " 2023-07-10 0.981217 0.0 -105.457509 0.457509 -105.0 \n", - " 2023-07-11 -0.792062 0.0 24.999356 0.000644 25.0 \n", - " 2023-07-12 -1.883268 0.0 15.027489 -0.027489 15.0 \n", - " \n", - " Price \n", - " Datetime \n", - " 2022-07-06 1052.5 \n", - " 2022-07-07 1075.0 \n", - " 2022-07-08 1055.0 \n", - " 2022-07-11 990.0 \n", - " 2022-07-12 880.0 \n", - " ... ... \n", - " 2023-07-06 635.0 \n", - " 2023-07-07 700.0 \n", - " 2023-07-10 595.0 \n", - " 2023-07-11 620.0 \n", - " 2023-07-12 635.0 \n", - " \n", - " [266 rows x 12 columns])" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "att = Calculate.attribution(structure.Structure['long'][0], ts_end = '2023-07-12', method = 'RV', return_both_data = True)\n", - "att" - ] - }, - { - "cell_type": "code", - "execution_count": 84, - "metadata": {}, - "outputs": [], - "source": [ - "class EVBAttributor:\n", - " \"\"\"\n", - " Class to load data from Event Driven Backtester and calculate PnL and Greeks\n", - " \"\"\"\n", - " def __init__(self, \n", - " trades: pd.DataFrame, \n", - " attribution_fill: str = 'default_fill',\n", - " option_fill: str = 'midpoint',\n", - " retries: int = 3):\n", - " \"\"\"\n", - " trades: DataFrame containing trades data from Event Driven Backtester\n", - " Eexpected columns: EntryTime, ExitTime, Quantity, Positions\n", - " retries: Number of retries for each trade\n", - " attribution_fill: Method to fill missing data in attribution calculation\n", - " option_fill: Method to fill missing data in option class. Default is midpoint\n", - " \"\"\"\n", - " assert 'EntryTime' in trades.columns, 'EntryTime column not found'\n", - " assert 'ExitTime' in trades.columns, 'ExitTime column not found'\n", - " assert 'Quantity' in trades.columns, 'Quantity column not found'\n", - " assert 'Positions' in trades.columns, 'Positions column not found'\n", - "\n", - " self.trades = trades\n", - " self.trades['Structure'] = None\n", - " self.retries = retries\n", - " self.stored_data = {\n", - " 'attribution': {},\n", - " 'greeks': {},\n", - " 'vol_slides': {},\n", - " 'pct_spot_slides': {}\n", - " }\n", - " self.attribution_fill = attribution_fill\n", - " self.option_fill = option_fill\n", - "\n", - " def _create_object_from_id(self, *args ,**kwargs):\n", - " try:\n", - " return create_object_from_id(*args, **kwargs)\n", - " except Exception as e:\n", - " print(e)\n", - " print(kwargs, args)\n", - " return None\n", - " \n", - " def load_data(self, \n", - " attribution: bool = True, \n", - " greeks: bool = True, \n", - " attribution_method: str = 'RV', \n", - " print_output: bool = True) -> None:\n", - " \n", - " \"\"\"\n", - " Load data from trades DataFrame and calculate PnL and Greeks\n", - "\n", - " params:\n", - " attribution: bool - Calculate attribution data if True\n", - " greeks: bool - Calculate greeks data if True\n", - " attribution_method: str - Method to calculate attribution data. available methods are 'RV', 'GB'\n", - " print_output: bool - Print output if True\n", - "\n", - " return: None\n", - " use self.attribution and self.greeks to access the calculated data\n", - " \"\"\"\n", - " trades = self.trades\n", - " \n", - " date_range = pd.date_range(trades['EntryTime'].min(), trades['ExitTime'].max(), freq = 'B')\n", - " tries = 0\n", - " failed = ['start'] ## Making sure the loop runs at least once\n", - " ## Load Data\n", - " while len(failed) > 0 :\n", - " if tries >= self.retries:\n", - " print(f\"Retries exceeded for {failed}\")\n", - " break\n", - " tries += 1\n", - " for index in trades[trades.Structure.isna()].index:\n", - " clear_output(wait=True)\n", - " print(f\"Starting {index}\") if print_output else None\n", - " start = (pd.to_datetime(trades.loc[index]['EntryTime']) + BDay(1)).strftime('%Y-%m-%d') ## Calculate PnL from the day after trade entry. This replicates buy at close and sell at open\n", - " end = (pd.to_datetime(trades.loc[index]['ExitTime']) - BDay(1)).strftime('%Y-%m-%d') ## Temp fix for trades enddate issue\n", - " quantity = trades.loc[index]['Quantity']\n", - " id = trades.loc[index]['Positions']\n", - " structure = self._create_object_from_id(id, start, default_fill = self.option_fill)\n", - " \n", - " ## Create PnL and Greeks Data from structure object\n", - " if structure is not None:\n", - " if attribution:\n", - " pnl = Calculate.attribution(structure, start, end, method = attribution_method, replace = self.attribution_fill) * quantity\n", - " self.stored_data['attribution'][index] = pnl\n", - " if greeks:\n", - " greeks_data = structure.greeks('greek', ts_start = start, ts_end = end) * quantity * 100\n", - " self.stored_data['greeks'][index] = greeks_data\n", - " else:\n", - " trades.loc[index, 'Structure'] = None\n", - " print(f\"Failed to load {index}\") if print_output else None\n", - " self.stored_data['attribution'][index] = 0\n", - " self.stored_data['greeks'][index] = 0\n", - " continue\n", - "\n", - "\n", - "\n", - " trades.loc[index, 'Structure'] = structure\n", - " print(f\"Completed {index}\") if print_output else None\n", - " \n", - "\n", - " ## Produce Empty DataFrames based on Date Range from Trades Entry to Exit\n", - " ## Columns off the DataFrames are based on the first successful attribution and greeks data\n", - " for ind in self.stored_data['attribution'].keys():\n", - " if isinstance(self.stored_data['attribution'][ind], pd.DataFrame):\n", - " pnl_sample = self.stored_data['attribution'][ind].copy()\n", - " greeks_sample = self.stored_data['greeks'][ind].copy()\n", - " \n", - " attribution = pd.DataFrame(index = date_range,\n", - "\n", - " data = {x: [0] * len(date_range) for x in pnl_sample.columns})\n", - " \n", - " pt_greeks = pd.DataFrame(index = date_range,\n", - " data = {x: [0] * len(date_range) for x in greeks_sample.columns})\n", - " \n", - " pct_spot_slides = pd.DataFrame(index = date_range,\n", - " data = {x: [0] * len(date_range) for x in greeks_sample.columns})\n", - " \n", - " vol_slides = pd.DataFrame(index = date_range,\n", - " data = {x: [0] * len(date_range) for x in greeks_sample.columns})\n", - " \n", - "\n", - " ## Fill DataFrames with PnL and Greeks Data\n", - " ## This is done by adding the pnl and greeks data to the corresponding columns in the dataframes\n", - " failed = []\n", - " for index, pnl in self.stored_data['attribution'].items():\n", - " if not isinstance(pnl, pd.DataFrame):\n", - " print(f\"{index} failed\") if print_output else None\n", - " failed.append(index)\n", - " continue\n", - " days_mask = attribution.index.isin(pnl.index)\n", - " attribution.loc[days_mask, :] += pnl\n", - " attribution.fillna(0, inplace=True)\n", - " \n", - " for index, greeks in self.stored_data['greeks'].items():\n", - " days_mask = pt_greeks.index.isin(greeks.index)\n", - " pt_greeks.loc[days_mask, :] += greeks\n", - " pt_greeks.fillna(0, inplace=True)\n", - "\n", - " self.attribution = attribution\n", - " self.greeks = pt_greeks\n", - " \n", - "\n", - " \n" - ] - }, - { - "cell_type": "code", - "execution_count": 91, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Starting 25\n", - "Completed 25ble dataing available data\n" - ] - } - ], - "source": [ - "attributor = EVBAttributor(trades)\n", - "attributor.load_data(attribution = True, greeks = True, print_output = True)" - ] - }, - { - "cell_type": "code", - "execution_count": 95, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Delta_PnL 29225.88\n", - "Gamma_PnL -2650.29\n", - "Vega_PnL -2072.70\n", - "Volga_PnL 2836.56\n", - "Theta_PnL 1118.84\n", - "Rho_PnL 15.27\n", - "Vanna_PnL -517.27\n", - "Dividend_PnL 0.00\n", - "Total_PnL 27956.29\n", - "Unexplained_PnL -111.29\n", - "Actual_PnL 27845.00\n", - "Price 3070427.50\n", - "dtype: float64" - ] - }, - "execution_count": 95, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "attributor.attribution.sum().round(2)" - ] - }, - { - "cell_type": "code", - "execution_count": 93, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "27888.826867781576" - ] - }, - "execution_count": 93, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "attributor.trades.PnL.sum()" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "stored_data = {\n", - " 'greek': {},\n", - " 'attribution': {}\n", - "}\n", - "\n", - "## Make a class\n", - "## Produce Scenario Analysis\n", - "## Add Retry to the class" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Starting 25\n", - "Start: 2024-05-17 00:00:00, End: 2024-07-02 00:00:00, ts_start: 2024-05-21, ts_end: 2024-06-28\n", - "Start: 2024-05-17 00:00:00, End: 2024-07-02 00:00:00, ts_start: 2024-05-21, ts_end: 2024-06-28\n", - "Start: 2024-05-17 00:00:00, End: 2024-07-02 00:00:00, ts_start: 2024-05-21, ts_end: 2024-06-28\n", - "25 donevailable dataing available data\n" - ] - } - ], - "source": [ - "\n", - "\n", - "## Make sure to clear the variables before running this cell\n", - "try:\n", - " del attribution, greeks\n", - "except:\n", - " pass\n", - "\n", - "## Produce date range, serves as the index for the attribution and greeks dataframes\n", - "date_range = pd.date_range(trades.EntryTime.min(), trades.ExitTime.max(), freq='B')\n", - "\n", - "\n", - "## Loop through the trades dataframe and calculate the attribution and greeks for each trade\n", - "## And store the results in the attribution and greeks dataframes as a time series\n", - "for index in trades[trades.Structure.isna()].index:\n", - " clear_output(wait=True)\n", - " print(f\"Starting {index}\")\n", - " start = trades.loc[index]['EntryTime']\n", - " end = (pd.to_datetime(trades.loc[index]['ExitTime']) - BDay(1)).strftime('%Y-%m-%d')\n", - " if index == 4:\n", - " end = '2024-06-07'\n", - " quantity = trades.loc[index]['Quantity']\n", - " id = trades.loc[index]['Positions']\n", - " # trades.loc[index]\n", - " structure = _create_object_from_id(id, start)\n", - " \n", - " if structure is not None:\n", - "\n", - " try:\n", - " pnl = Calculate.attribution(structure, start, end, method = 'RV', replace = 'default_fill') * quantity\n", - " greeks = structure.greeks('greek', start, end) * quantity * 100\n", - " attribution += pnl\n", - " pt_greeks += greeks\n", - "\n", - " except NameError as e:\n", - " attribution = pd.DataFrame(index = date_range,\n", - " data = {x: [0] * len(date_range) for x in pnl.columns})\n", - " pt_greeks = pd.DataFrame(index = date_range,\n", - " data = {x: [0] * len(date_range) for x in greeks.columns})\n", - " \n", - " attribution += pnl\n", - " pt_greeks += greeks\n", - " \n", - " except TypeError as j:\n", - " trades.loc[index, 'Structure'] = None\n", - " print(f\"{index} failed\")\n", - " continue\n", - " \n", - " stored_data['attribution'][index] = pnl\n", - " stored_data['greek'][index] = greeks\n", - " \n", - " attribution.fillna(0, inplace=True)\n", - " pt_greeks.fillna(0, inplace=True)\n", - " # time.sleep(20) ## Relax, we are not in a hurry\n", - " trades.loc[index, 'Structure'] = structure\n", - " print(f\"{index} done\") if structure is not None else print(f\"{index} failed\")\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
TickerPnLEntryPriceExitPriceReturnPctQuantityEntryTimeExitTimeDurationPositionsStructure
0TSLA-469.319634200.595187157.929765-21.269414112023-07-052023-08-0228&L:TSLA20240621C333.33&S:TSLA20240621C340CallVertical(TSLA, Build On: 2023-07-05 16:00:00)
1AAPL1.565517200.443306200.7042260.13017162023-07-052023-08-0430&L:AAPL20240621C230&S:AAPL20240621C240CallVertical(AAPL, Build On: 2023-07-05 16:00:00)
2MSFT-276.544545200.353116160.846753-19.71836772023-07-052023-08-0935&L:MSFT20240621C370&S:MSFT20240621C375CallVertical(MSFT, Build On: 2023-07-05 16:00:00)
3AMZN-43.770957200.305228156.534271-21.85212912023-07-052023-10-25112&L:AMZN20240621C165&S:AMZN20240621C175CallVertical(AMZN, Build On: 2023-07-05 16:00:00)
4NVDA25078.793707190.9552512977.4878851459.25949492023-07-052024-07-01362&L:NVDA20240621C770&S:NVDA20240621C800CallVertical(NVDA, Build On: 2023-07-05 16:00:00)
5BA-30.225169185.573604155.348435-16.28742912023-08-102023-08-177&L:BA20240621C300&S:BA20240621C310CallVertical(BA, Build On: 2023-08-10 16:00:00)
6WMT0.000000NaNNaNNaN02023-08-102023-08-177&L:WMT20240621C175&S:WMT20240621C180CallVertical(WMT, Build On: 2023-08-10 16:00:00)
7TSLA-43.298192200.384529195.573618-2.40083992023-08-172023-10-2064&L:TSLA20240920C305&S:TSLA20240920C315CallVertical(TSLA, Build On: 2023-08-17 16:00:00)
8AAPL-298.098050199.060910149.377901-24.95869762023-08-312023-09-077&L:AAPL20240920C260&S:AAPL20240920C310CallVertical(AAPL, Build On: 2023-08-31 16:00:00)
9INTC0.000000NaNNaNNaN02023-09-152023-09-205&L:INTC20240621C40&S:INTC20240621C45CallVertical(INTC, Build On: 2023-09-15 16:00:00)
10QCOM270.205981185.344291455.550271145.78597512023-11-132024-07-01231&L:QCOM20250117C135&S:QCOM20250117C140CallVertical(QCOM, Build On: 2023-11-13 16:00:00)
11MSFT1304.375600195.612225456.487345133.36340352023-11-142024-07-01230&L:MSFT20241220C395&S:MSFT20241220C400CallVertical(MSFT, Build On: 2023-11-14 16:00:00)
12SBUX-223.069814193.018583148.404621-23.11381752023-11-152023-11-2914&L:SBUX20250117C115&S:SBUX20250117C120CallVertical(SBUX, Build On: 2023-11-15 16:00:00)
13AMD478.825829185.555172424.968086129.02519122023-11-152024-07-01229&L:AMD20240920C180&S:AMD20240920C200CallVertical(AMD, Build On: 2023-11-15 16:00:00)
14MU0.000000NaNNaNNaN02023-11-162024-07-01228&L:MU20250117C85&S:MU20250117C90CallVertical(MU, Build On: 2023-11-16 16:00:00)
15INTC0.000000NaNNaNNaN02023-11-172024-04-03138&L:INTC20240920C47&S:INTC20240920C50CallVertical(INTC, Build On: 2023-11-17 16:00:00)
16DIS-77.019783168.78972791.769945-45.63061012023-11-172024-01-1054&L:DIS20240920C115&S:DIS20240920C125CallVertical(DIS, Build On: 2023-11-17 16:00:00)
17AAPL-223.014459185.293680140.690788-24.07145952023-11-222024-01-0443&L:AAPL20241220C215&S:AAPL20241220C220CallVertical(AAPL, Build On: 2023-11-22 16:00:00)
18BAC1112.010436199.689612570.359757185.62314932023-12-012024-07-01213&L:BAC20250117C35&S:BAC20250117C55CallVertical(BAC, Build On: 2023-12-01 16:00:00)
19HD796.51830775.628672208.381723175.53270262023-12-042024-04-17135&L:HD20250117C390&S:HD20250117C400CallVertical(HD, Build On: 2023-12-04 16:00:00)
20BA-85.187057163.41361678.226558-52.12971812023-12-042024-01-1239&L:BA20250117C310&S:BA20250117C320CallVertical(BA, Build On: 2023-12-04 16:00:00)
21GOOG502.670424192.213727317.88133365.37910142024-01-262024-01-315&L:GOOG20250117C190&S:GOOG20250117C200CallVertical(GOOG, Build On: 2024-01-26 16:00:00)
22WMT0.000000NaNNaNNaN02024-02-052024-07-01147&L:WMT20250117C185&S:WMT20250117C190CallVertical(WMT, Build On: 2024-02-05 16:00:00)
23DIS-69.548144198.011080128.462936-35.12336012024-02-072024-05-1699&L:DIS20250117C130&S:DIS20250117C150CallVertical(DIS, Build On: 2024-02-07 16:00:00)
24AMZN134.166232198.531193332.69742567.57942212024-02-082024-07-01144&L:AMZN20250117C185&S:AMZN20250117C190CallVertical(AMZN, Build On: 2024-02-08 16:00:00)
25AAPL48.790640188.225814200.4234746.48033342024-05-212024-07-0141&L:AAPL20250620C225&S:AAPL20250620C230CallVertical(AAPL, Build On: 2024-05-21 16:00:00)
\n", - "
" - ], - "text/plain": [ - " Ticker PnL EntryPrice ExitPrice ReturnPct Quantity \\\n", - "0 TSLA -469.319634 200.595187 157.929765 -21.269414 11 \n", - "1 AAPL 1.565517 200.443306 200.704226 0.130171 6 \n", - "2 MSFT -276.544545 200.353116 160.846753 -19.718367 7 \n", - "3 AMZN -43.770957 200.305228 156.534271 -21.852129 1 \n", - "4 NVDA 25078.793707 190.955251 2977.487885 1459.259494 9 \n", - "5 BA -30.225169 185.573604 155.348435 -16.287429 1 \n", - "6 WMT 0.000000 NaN NaN NaN 0 \n", - "7 TSLA -43.298192 200.384529 195.573618 -2.400839 9 \n", - "8 AAPL -298.098050 199.060910 149.377901 -24.958697 6 \n", - "9 INTC 0.000000 NaN NaN NaN 0 \n", - "10 QCOM 270.205981 185.344291 455.550271 145.785975 1 \n", - "11 MSFT 1304.375600 195.612225 456.487345 133.363403 5 \n", - "12 SBUX -223.069814 193.018583 148.404621 -23.113817 5 \n", - "13 AMD 478.825829 185.555172 424.968086 129.025191 2 \n", - "14 MU 0.000000 NaN NaN NaN 0 \n", - "15 INTC 0.000000 NaN NaN NaN 0 \n", - "16 DIS -77.019783 168.789727 91.769945 -45.630610 1 \n", - "17 AAPL -223.014459 185.293680 140.690788 -24.071459 5 \n", - "18 BAC 1112.010436 199.689612 570.359757 185.623149 3 \n", - "19 HD 796.518307 75.628672 208.381723 175.532702 6 \n", - "20 BA -85.187057 163.413616 78.226558 -52.129718 1 \n", - "21 GOOG 502.670424 192.213727 317.881333 65.379101 4 \n", - "22 WMT 0.000000 NaN NaN NaN 0 \n", - "23 DIS -69.548144 198.011080 128.462936 -35.123360 1 \n", - "24 AMZN 134.166232 198.531193 332.697425 67.579422 1 \n", - "25 AAPL 48.790640 188.225814 200.423474 6.480333 4 \n", - "\n", - " EntryTime ExitTime Duration \\\n", - "0 2023-07-05 2023-08-02 28 \n", - "1 2023-07-05 2023-08-04 30 \n", - "2 2023-07-05 2023-08-09 35 \n", - "3 2023-07-05 2023-10-25 112 \n", - "4 2023-07-05 2024-07-01 362 \n", - "5 2023-08-10 2023-08-17 7 \n", - "6 2023-08-10 2023-08-17 7 \n", - "7 2023-08-17 2023-10-20 64 \n", - "8 2023-08-31 2023-09-07 7 \n", - "9 2023-09-15 2023-09-20 5 \n", - "10 2023-11-13 2024-07-01 231 \n", - "11 2023-11-14 2024-07-01 230 \n", - "12 2023-11-15 2023-11-29 14 \n", - "13 2023-11-15 2024-07-01 229 \n", - "14 2023-11-16 2024-07-01 228 \n", - "15 2023-11-17 2024-04-03 138 \n", - "16 2023-11-17 2024-01-10 54 \n", - "17 2023-11-22 2024-01-04 43 \n", - "18 2023-12-01 2024-07-01 213 \n", - "19 2023-12-04 2024-04-17 135 \n", - "20 2023-12-04 2024-01-12 39 \n", - "21 2024-01-26 2024-01-31 5 \n", - "22 2024-02-05 2024-07-01 147 \n", - "23 2024-02-07 2024-05-16 99 \n", - "24 2024-02-08 2024-07-01 144 \n", - "25 2024-05-21 2024-07-01 41 \n", - "\n", - " Positions \\\n", - "0 &L:TSLA20240621C333.33&S:TSLA20240621C340 \n", - "1 &L:AAPL20240621C230&S:AAPL20240621C240 \n", - "2 &L:MSFT20240621C370&S:MSFT20240621C375 \n", - "3 &L:AMZN20240621C165&S:AMZN20240621C175 \n", - "4 &L:NVDA20240621C770&S:NVDA20240621C800 \n", - "5 &L:BA20240621C300&S:BA20240621C310 \n", - "6 &L:WMT20240621C175&S:WMT20240621C180 \n", - "7 &L:TSLA20240920C305&S:TSLA20240920C315 \n", - "8 &L:AAPL20240920C260&S:AAPL20240920C310 \n", - "9 &L:INTC20240621C40&S:INTC20240621C45 \n", - "10 &L:QCOM20250117C135&S:QCOM20250117C140 \n", - "11 &L:MSFT20241220C395&S:MSFT20241220C400 \n", - "12 &L:SBUX20250117C115&S:SBUX20250117C120 \n", - "13 &L:AMD20240920C180&S:AMD20240920C200 \n", - "14 &L:MU20250117C85&S:MU20250117C90 \n", - "15 &L:INTC20240920C47&S:INTC20240920C50 \n", - "16 &L:DIS20240920C115&S:DIS20240920C125 \n", - "17 &L:AAPL20241220C215&S:AAPL20241220C220 \n", - "18 &L:BAC20250117C35&S:BAC20250117C55 \n", - "19 &L:HD20250117C390&S:HD20250117C400 \n", - "20 &L:BA20250117C310&S:BA20250117C320 \n", - "21 &L:GOOG20250117C190&S:GOOG20250117C200 \n", - "22 &L:WMT20250117C185&S:WMT20250117C190 \n", - "23 &L:DIS20250117C130&S:DIS20250117C150 \n", - "24 &L:AMZN20250117C185&S:AMZN20250117C190 \n", - "25 &L:AAPL20250620C225&S:AAPL20250620C230 \n", - "\n", - " Structure \n", - "0 CallVertical(TSLA, Build On: 2023-07-05 16:00:00) \n", - "1 CallVertical(AAPL, Build On: 2023-07-05 16:00:00) \n", - "2 CallVertical(MSFT, Build On: 2023-07-05 16:00:00) \n", - "3 CallVertical(AMZN, Build On: 2023-07-05 16:00:00) \n", - "4 CallVertical(NVDA, Build On: 2023-07-05 16:00:00) \n", - "5 CallVertical(BA, Build On: 2023-08-10 16:00:00) \n", - "6 CallVertical(WMT, Build On: 2023-08-10 16:00:00) \n", - "7 CallVertical(TSLA, Build On: 2023-08-17 16:00:00) \n", - "8 CallVertical(AAPL, Build On: 2023-08-31 16:00:00) \n", - "9 CallVertical(INTC, Build On: 2023-09-15 16:00:00) \n", - "10 CallVertical(QCOM, Build On: 2023-11-13 16:00:00) \n", - "11 CallVertical(MSFT, Build On: 2023-11-14 16:00:00) \n", - "12 CallVertical(SBUX, Build On: 2023-11-15 16:00:00) \n", - "13 CallVertical(AMD, Build On: 2023-11-15 16:00:00) \n", - "14 CallVertical(MU, Build On: 2023-11-16 16:00:00) \n", - "15 CallVertical(INTC, Build On: 2023-11-17 16:00:00) \n", - "16 CallVertical(DIS, Build On: 2023-11-17 16:00:00) \n", - "17 CallVertical(AAPL, Build On: 2023-11-22 16:00:00) \n", - "18 CallVertical(BAC, Build On: 2023-12-01 16:00:00) \n", - "19 CallVertical(HD, Build On: 2023-12-04 16:00:00) \n", - "20 CallVertical(BA, Build On: 2023-12-04 16:00:00) \n", - "21 CallVertical(GOOG, Build On: 2024-01-26 16:00:00) \n", - "22 CallVertical(WMT, Build On: 2024-02-05 16:00:00) \n", - "23 CallVertical(DIS, Build On: 2024-02-07 16:00:00) \n", - "24 CallVertical(AMZN, Build On: 2024-02-08 16:00:00) \n", - "25 CallVertical(AAPL, Build On: 2024-05-21 16:00:00) " - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "trades#.loc[failed, 'Structure'] = None\n", - "trades" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{0: Delta_PnL Gamma_PnL Vega_PnL Volga_PnL Theta_PnL \\\n", - " Datetime \n", - " 2023-07-05 46.313686 -0.002559 8.723780 -0.402952 -0.501017 \n", - " 2023-07-06 -103.690540 -0.016682 22.778507 -0.667192 -0.451834 \n", - " 2023-07-07 -37.202332 0.005605 -337.608264 15.448639 -0.643391 \n", - " 2023-07-10 -79.786022 0.270221 57.213318 -1.242215 -0.779639 \n", - " 2023-07-11 3.078424 0.000435 283.282279 -11.352877 -0.525344 \n", - " 2023-07-12 40.910151 0.028230 14.520843 0.213290 -0.993928 \n", - " 2023-07-13 112.088751 0.143576 -194.286526 6.776201 -1.013301 \n", - " 2023-07-14 62.631247 0.075201 23.896942 -2.596955 -0.537026 \n", - " 2023-07-17 160.440614 0.188912 346.649874 -17.218142 -1.327164 \n", - " 2023-07-18 54.903681 -0.086673 -227.674157 9.931748 -0.636723 \n", - " 2023-07-19 -37.098228 -0.021456 908.316563 -39.125865 -0.245582 \n", - " 2023-07-20 -590.316144 -17.359511 -1243.852940 56.779238 -1.577633 \n", - " 2023-07-21 -48.508050 0.176474 227.062878 -9.119250 -0.632262 \n", - " 2023-07-24 163.584488 1.235144 -24.780407 1.085774 -3.355444 \n", - " 2023-07-25 -69.265505 0.189411 44.810368 -2.208483 -0.885311 \n", - " 2023-07-26 -17.091496 0.011802 -299.391634 13.467178 -1.039196 \n", - " 2023-07-27 -147.418108 1.875597 342.418138 -14.030493 -0.608212 \n", - " 2023-07-28 200.171479 2.027052 16.058656 -0.113320 -1.407518 \n", - " 2023-07-31 19.169532 0.012433 -15.720758 0.472937 -3.770405 \n", - " 2023-08-01 -122.977812 0.587577 -45.092109 1.824311 -1.211994 \n", - " \n", - " Rho_PnL Vanna_PnL Dividend_PnL Total_PnL Unexplained_PnL \\\n", - " Datetime \n", - " 2023-07-05 1.265948 0.064855 0.0 55.461741 -0.461741 \n", - " 2023-07-06 0.526750 -0.878395 0.0 -82.399385 -0.100615 \n", - " 2023-07-07 0.000000 2.272015 0.0 -357.727728 0.227728 \n", - " 2023-07-10 0.320190 -2.856218 0.0 -26.860363 -0.639637 \n", - " 2023-07-11 0.492500 0.264188 0.0 275.239606 -0.239606 \n", - " 2023-07-12 -0.370928 0.705950 0.0 55.013609 -0.013609 \n", - " 2023-07-13 -0.204881 -6.286719 0.0 -82.782899 0.282899 \n", - " 2023-07-14 -0.227832 -0.809329 0.0 82.432247 0.067753 \n", - " 2023-07-17 0.499605 6.257391 0.0 495.491090 -0.491090 \n", - " 2023-07-18 0.395225 -2.059636 0.0 -165.226535 0.226535 \n", - " 2023-07-19 -0.079127 -5.999922 0.0 825.746383 -0.746383 \n", - " 2023-07-20 -0.052703 118.339316 0.0 -1678.040377 0.540377 \n", - " 2023-07-21 0.133340 -3.855210 0.0 165.257920 -0.257920 \n", - " 2023-07-24 0.055242 -0.968512 0.0 136.856285 0.643715 \n", - " 2023-07-25 0.422616 -0.479578 0.0 -27.416481 -0.083519 \n", - " 2023-07-26 0.083515 1.213054 0.0 -302.746776 0.246776 \n", - " 2023-07-27 0.000000 -16.797460 0.0 165.439462 -0.439462 \n", - " 2023-07-28 -0.363592 3.548820 0.0 219.921577 0.078423 \n", - " 2023-07-31 -0.205834 -0.125044 0.0 -0.167138 0.167138 \n", - " 2023-08-01 0.350893 1.563639 0.0 -164.955494 -0.044506 \n", - " \n", - " Actual_PnL Price \n", - " Datetime \n", - " 2023-07-05 55.0 2200.0 \n", - " 2023-07-06 -82.5 2117.5 \n", - " 2023-07-07 -357.5 1760.0 \n", - " 2023-07-10 -27.5 1732.5 \n", - " 2023-07-11 275.0 2007.5 \n", - " 2023-07-12 55.0 2062.5 \n", - " 2023-07-13 -82.5 1980.0 \n", - " 2023-07-14 82.5 2062.5 \n", - " 2023-07-17 495.0 2557.5 \n", - " 2023-07-18 -165.0 2392.5 \n", - " 2023-07-19 825.0 3217.5 \n", - " 2023-07-20 -1677.5 1540.0 \n", - " 2023-07-21 165.0 1705.0 \n", - " 2023-07-24 137.5 1842.5 \n", - " 2023-07-25 -27.5 1815.0 \n", - " 2023-07-26 -302.5 1512.5 \n", - " 2023-07-27 165.0 1677.5 \n", - " 2023-07-28 220.0 1897.5 \n", - " 2023-07-31 0.0 1897.5 \n", - " 2023-08-01 -165.0 1732.5 ,\n", - " 1: Delta_PnL Gamma_PnL Vega_PnL Volga_PnL Theta_PnL Rho_PnL \\\n", - " Datetime \n", - " 2023-07-05 -53.198548 0.477029 -36.875150 1.499314 -3.065833 3.611517 \n", - " 2023-07-06 21.822259 0.089243 133.427068 -4.938158 -2.988922 1.446958 \n", - " 2023-07-07 -54.434817 0.456841 -98.441939 2.517221 -3.277794 0.000000 \n", - " 2023-07-10 -92.106224 1.620143 -23.365895 0.823512 -8.913489 0.838447 \n", - " 2023-07-11 -22.401550 0.112546 -6.171157 0.130355 -2.905798 1.179829 \n", - " 2023-07-12 70.278779 1.136679 5.929371 -0.240422 -2.879979 -0.834359 \n", - " 2023-07-13 33.687321 0.236408 -31.429821 1.315110 -2.991183 -0.474910 \n", - " 2023-07-14 6.546266 0.008980 12.273812 -0.431932 -2.918078 -0.542120 \n", - " 2023-07-17 145.720464 4.220346 6.024067 -0.143149 -8.938676 1.232006 \n", - " 2023-07-18 -12.241881 0.024910 -0.842683 0.059295 -3.031859 1.096389 \n", - " 2023-07-19 64.294965 0.688573 15.967237 -2.042469 -3.045892 -0.217862 \n", - " 2023-07-20 -92.959343 1.337617 37.667558 -2.125926 -2.971504 -0.145528 \n", - " 2023-07-21 -54.774818 0.499957 29.889341 -1.180749 -3.035346 0.350937 \n", - " 2023-07-24 37.572758 0.241511 32.732709 -1.506990 -9.590052 0.140743 \n", - " 2023-07-25 41.266730 0.266865 -71.217440 2.976037 -3.269365 1.070976 \n", - " 2023-07-26 40.928134 0.273354 -8.900053 0.448555 -3.082141 0.210568 \n", - " 2023-07-27 -60.219130 0.582802 35.317391 -2.692855 -3.069138 0.000000 \n", - " 2023-07-28 119.782000 2.276857 -57.650730 2.306607 -3.075680 -0.890698 \n", - " 2023-07-31 28.728954 0.122706 88.827562 -4.010565 -8.686036 -0.487470 \n", - " 2023-08-01 -40.300802 0.211382 -34.484788 1.258643 -3.070239 0.854543 \n", - " 2023-08-02 -141.382739 2.985383 39.096081 -3.496200 -2.994449 0.000000 \n", - " 2023-08-03 -62.428390 0.657448 -10.653715 -0.139174 -3.012796 -0.128725 \n", - " \n", - " Vanna_PnL Dividend_PnL Total_PnL Unexplained_PnL Actual_PnL \\\n", - " Datetime \n", - " 2023-07-05 0.934881 0.0 -86.616790 -3.383210 -90.0 \n", - " 2023-07-06 1.115042 0.0 149.973490 0.026510 150.0 \n", - " 2023-07-07 3.233423 0.0 -149.947064 -0.052936 -150.0 \n", - " 2023-07-10 1.326571 0.0 -119.776935 -0.223065 -120.0 \n", - " 2023-07-11 0.145163 0.0 -29.910613 -0.089387 -30.0 \n", - " 2023-07-12 1.404794 0.0 74.794863 0.205137 75.0 \n", - " 2023-07-13 -0.549055 0.0 -0.206129 0.206129 0.0 \n", - " 2023-07-14 0.062072 0.0 14.999001 0.000999 15.0 \n", - " 2023-07-17 1.169808 0.0 149.284865 0.715135 150.0 \n", - " 2023-07-18 -0.003377 0.0 -14.939207 -0.060793 -15.0 \n", - " 2023-07-19 -0.989057 0.0 74.655496 0.344504 75.0 \n", - " 2023-07-20 -0.352902 0.0 -59.550028 -0.449972 -60.0 \n", - " 2023-07-21 -1.430108 0.0 -29.680786 -0.319214 -30.0 \n", - " 2023-07-24 0.356120 0.0 59.946800 0.053200 60.0 \n", - " 2023-07-25 -1.366697 0.0 -30.272894 0.272894 -30.0 \n", - " 2023-07-26 -0.086560 0.0 29.791856 0.208144 30.0 \n", - " 2023-07-27 0.350085 0.0 -29.730845 -0.269155 -30.0 \n", - " 2023-07-28 -3.381867 0.0 59.366490 0.633510 60.0 \n", - " 2023-07-31 0.744713 0.0 105.239864 -0.239864 105.0 \n", - " 2023-08-01 0.704506 0.0 -74.826756 -0.173244 -75.0 \n", - " 2023-08-02 1.417188 0.0 -104.374735 -0.625265 -105.0 \n", - " 2023-08-03 0.925467 0.0 -74.779885 -0.220115 -75.0 \n", - " \n", - " Price \n", - " Datetime \n", - " 2023-07-05 1200.0 \n", - " 2023-07-06 1350.0 \n", - " 2023-07-07 1200.0 \n", - " 2023-07-10 1080.0 \n", - " 2023-07-11 1050.0 \n", - " 2023-07-12 1125.0 \n", - " 2023-07-13 1125.0 \n", - " 2023-07-14 1140.0 \n", - " 2023-07-17 1290.0 \n", - " 2023-07-18 1275.0 \n", - " 2023-07-19 1350.0 \n", - " 2023-07-20 1290.0 \n", - " 2023-07-21 1260.0 \n", - " 2023-07-24 1320.0 \n", - " 2023-07-25 1290.0 \n", - " 2023-07-26 1320.0 \n", - " 2023-07-27 1290.0 \n", - " 2023-07-28 1350.0 \n", - " 2023-07-31 1455.0 \n", - " 2023-08-01 1380.0 \n", - " 2023-08-02 1275.0 \n", - " 2023-08-03 1200.0 ,\n", - " 2: Delta_PnL Gamma_PnL Vega_PnL Volga_PnL Theta_PnL Rho_PnL \\\n", - " Datetime \n", - " 2023-07-05 2.538384 0.000072 88.311925 -3.582577 -0.800851 1.880026 \n", - " 2023-07-06 49.789253 -0.048421 -137.429310 3.047615 -0.903395 0.770784 \n", - " 2023-07-07 -60.507400 0.047751 157.226450 -5.250727 -0.594962 0.000000 \n", - " 2023-07-10 -84.399756 -0.059583 -17.527584 1.020066 -2.761551 0.446495 \n", - " 2023-07-11 10.158639 0.001554 -46.764953 1.870830 -1.039076 0.679603 \n", - " 2023-07-12 74.986076 0.111873 14.796381 -0.913693 -0.978214 -0.494242 \n", - " 2023-07-13 86.119394 -0.062014 -15.868559 0.544890 -0.883216 -0.262771 \n", - " 2023-07-14 40.533625 -0.039908 -74.363101 1.307218 -0.742237 -0.299096 \n", - " 2023-07-17 7.359448 -0.000754 -61.707309 2.574146 -1.637315 0.643315 \n", - " 2023-07-18 207.259299 -0.707892 117.154370 -5.815538 -0.466959 0.541900 \n", - " 2023-07-19 -63.954912 -0.341468 600.234056 -23.588920 -0.274630 -0.099505 \n", - " 2023-07-20 -128.562436 -3.264695 -563.051295 21.405951 -1.174230 -0.063157 \n", - " 2023-07-21 -46.243363 -0.086011 -78.916303 3.214066 -0.610700 0.170253 \n", - " 2023-07-24 19.943225 -0.004352 253.772750 -9.623728 -1.757102 0.069076 \n", - " 2023-07-25 90.848960 -0.711368 338.186852 -12.644036 -0.909455 0.508310 \n", - " 2023-07-26 -209.384411 -7.050364 -571.912763 22.738157 -1.238826 0.095977 \n", - " 2023-07-27 -107.532907 0.295025 437.158443 -15.034417 -0.785735 0.000000 \n", - " 2023-07-28 134.127116 -1.150632 -637.064346 20.651794 -1.657251 -0.494381 \n", - " 2023-07-31 -35.464311 0.114101 480.892740 -16.789554 -1.327035 -0.240596 \n", - " 2023-08-01 6.933243 -0.001907 -259.851602 8.932812 -1.253660 0.433034 \n", - " 2023-08-02 -135.999675 0.761074 14.157904 -1.088826 -0.832693 0.000000 \n", - " 2023-08-03 -12.637000 0.010769 -3.804725 0.034926 -1.015657 -0.067243 \n", - " 2023-08-04 16.766337 0.019783 73.979289 -2.517392 -1.023837 -0.166801 \n", - " 2023-08-07 35.842452 0.050106 -52.901113 2.209977 -3.403230 0.236769 \n", - " 2023-08-08 -62.790321 0.225426 -6.711069 0.324177 -1.037557 0.513235 \n", - " \n", - " Vanna_PnL Dividend_PnL Total_PnL Unexplained_PnL Actual_PnL \\\n", - " Datetime \n", - " 2023-07-05 0.011712 0.0 88.358691 -0.858691 87.5 \n", - " 2023-07-06 -3.218427 0.0 -87.991902 0.491902 -87.5 \n", - " 2023-07-07 -2.777845 0.0 88.143267 -0.643267 87.5 \n", - " 2023-07-10 -0.809075 0.0 -104.090989 -0.909011 -105.0 \n", - " 2023-07-11 -0.030368 0.0 -35.123771 0.123771 -35.0 \n", - " 2023-07-12 -0.633165 0.0 86.875015 0.624985 87.5 \n", - " 2023-07-13 -0.310105 0.0 69.277618 0.722382 70.0 \n", - " 2023-07-14 -1.788314 0.0 -35.391812 0.391812 -35.0 \n", - " 2023-07-17 -0.010645 0.0 -52.779113 0.279113 -52.5 \n", - " 2023-07-18 -4.457410 0.0 313.507771 1.492229 315.0 \n", - " 2023-07-19 -3.643703 0.0 508.330918 -0.830918 507.5 \n", - " 2023-07-20 10.379262 0.0 -664.330601 -0.669399 -665.0 \n", - " 2023-07-21 0.289455 0.0 -122.182602 -0.317398 -122.5 \n", - " 2023-07-24 0.738720 0.0 263.138590 -0.638590 262.5 \n", - " 2023-07-25 4.246863 0.0 419.526126 0.473874 420.0 \n", - " 2023-07-26 15.481711 0.0 -751.270519 -1.229481 -752.5 \n", - " 2023-07-27 -15.232672 0.0 298.867737 -1.367737 297.5 \n", - " 2023-07-28 -23.595055 0.0 -509.182755 1.682755 -507.5 \n", - " 2023-07-31 -4.848203 0.0 422.337142 -2.337142 420.0 \n", - " 2023-08-01 -0.480586 0.0 -245.288666 0.288666 -245.0 \n", - " 2023-08-02 1.523092 0.0 -121.479124 -1.020876 -122.5 \n", - " 2023-08-03 0.056213 0.0 -17.422716 -0.077284 -17.5 \n", - " 2023-08-04 0.407727 0.0 87.465105 0.034895 87.5 \n", - " 2023-08-07 -0.071245 0.0 -18.036283 0.536283 -17.5 \n", - " 2023-08-08 -0.059736 0.0 -69.535845 -0.464155 -70.0 \n", - " \n", - " Price \n", - " Datetime \n", - " 2023-07-05 1400.0 \n", - " 2023-07-06 1312.5 \n", - " 2023-07-07 1400.0 \n", - " 2023-07-10 1295.0 \n", - " 2023-07-11 1260.0 \n", - " 2023-07-12 1347.5 \n", - " 2023-07-13 1417.5 \n", - " 2023-07-14 1382.5 \n", - " 2023-07-17 1330.0 \n", - " 2023-07-18 1645.0 \n", - " 2023-07-19 2152.5 \n", - " 2023-07-20 1487.5 \n", - " 2023-07-21 1365.0 \n", - " 2023-07-24 1627.5 \n", - " 2023-07-25 2047.5 \n", - " 2023-07-26 1295.0 \n", - " 2023-07-27 1592.5 \n", - " 2023-07-28 1085.0 \n", - " 2023-07-31 1505.0 \n", - " 2023-08-01 1260.0 \n", - " 2023-08-02 1137.5 \n", - " 2023-08-03 1120.0 \n", - " 2023-08-04 1207.5 \n", - " 2023-08-07 1190.0 \n", - " 2023-08-08 1120.0 ,\n", - " 3: Delta_PnL Gamma_PnL Vega_PnL Volga_PnL Theta_PnL Rho_PnL \\\n", - " Datetime \n", - " 2023-07-05 1.139971 0.001214 0.000000 0.000000 -0.356807 0.338175 \n", - " 2023-07-06 -14.440062 0.198995 -9.839059 0.545450 -0.358152 0.141091 \n", - " 2023-07-07 9.533854 0.104185 8.513754 -0.538606 -0.339515 0.000000 \n", - " 2023-07-10 -18.614743 0.351844 4.760608 -0.390854 -1.069020 0.082482 \n", - " 2023-07-11 11.220462 0.140011 -6.472218 0.489906 -0.368780 0.117180 \n", - " ... ... ... ... ... ... ... \n", - " 2023-10-18 -24.420585 0.807695 17.622015 -3.052373 -0.501126 -0.053606 \n", - " 2023-10-19 1.808112 0.004514 -7.864848 0.608782 -0.484596 -0.094027 \n", - " 2023-10-20 -22.133099 0.755775 -0.206033 -0.090904 -0.503799 -0.048696 \n", - " 2023-10-23 8.775709 0.143341 -4.128657 0.320771 -1.481014 -0.030774 \n", - " 2023-10-24 12.849487 0.295621 4.164763 -0.260402 -0.488660 0.067074 \n", - " \n", - " Vanna_PnL Dividend_PnL Total_PnL Unexplained_PnL Actual_PnL \\\n", - " Datetime \n", - " 2023-07-05 0.000000 0.0 1.122552 -1.122552 0.0 \n", - " 2023-07-06 0.479574 0.0 -23.272162 0.772162 -22.5 \n", - " 2023-07-07 0.233875 0.0 17.507546 -0.007546 17.5 \n", - " 2023-07-10 -0.092715 0.0 -14.972398 -0.027602 -15.0 \n", - " 2023-07-11 -0.137150 0.0 4.989411 0.010589 5.0 \n", - " ... ... ... ... ... ... \n", - " 2023-10-18 0.580745 0.0 -9.017234 0.017234 -9.0 \n", - " 2023-10-19 0.032991 0.0 -5.989073 -0.010927 -6.0 \n", - " 2023-10-20 0.213878 0.0 -22.012878 0.012878 -22.0 \n", - " 2023-10-23 -0.124685 0.0 3.474691 0.025309 3.5 \n", - " 2023-10-24 0.379504 0.0 17.007388 -0.007388 17.0 \n", - " \n", - " Price \n", - " Datetime \n", - " 2023-07-05 200.0 \n", - " 2023-07-06 177.5 \n", - " 2023-07-07 195.0 \n", - " 2023-07-10 180.0 \n", - " 2023-07-11 185.0 \n", - " ... ... \n", - " 2023-10-18 163.5 \n", - " 2023-10-19 157.5 \n", - " 2023-10-20 135.5 \n", - " 2023-10-23 139.0 \n", - " 2023-10-24 156.0 \n", - " \n", - " [80 rows x 12 columns],\n", - " 4: Delta_PnL Gamma_PnL Vega_PnL Volga_PnL Theta_PnL \\\n", - " Datetime \n", - " 2023-07-05 -16.274791 0.044615 0.000000 0.000000 -5.382468 \n", - " 2023-07-06 -36.081110 0.222728 20.231168 -0.538940 -5.384809 \n", - " 2023-07-07 66.776352 0.771489 5.273024 -0.086689 -5.357388 \n", - " 2023-07-10 -55.221858 0.502920 3.061227 -0.034051 -16.426566 \n", - " 2023-07-11 37.724388 0.247161 -11.146001 0.218086 -5.461634 \n", - " ... ... ... ... ... ... \n", - " 2024-06-03 200.436538 -68.737019 -100.907982 -221.620545 95.972027 \n", - " 2024-06-04 39.347654 -3.721626 -587.221146 340.342212 29.681645 \n", - " 2024-06-05 240.002022 -72.103340 -1521.521436 689.403240 56.475531 \n", - " 2024-06-06 -81.274015 -6.765807 1295.899642 -939.039824 104.783528 \n", - " 2024-06-07 -2.085900 -0.014815 -1601.839409 1523.777706 24.151212 \n", - " \n", - " Rho_PnL Vanna_PnL Dividend_PnL Total_PnL Unexplained_PnL \\\n", - " Datetime \n", - " 2023-07-05 2.580299 0.000000 0.0 -19.032346 86.532346 \n", - " 2023-07-06 1.064727 -0.112366 0.0 -20.598602 -91.901398 \n", - " 2023-07-07 0.000000 0.142884 0.0 67.519672 -0.019672 \n", - " 2023-07-10 0.644896 -0.118658 0.0 -67.592089 0.092089 \n", - " 2023-07-11 0.937414 -0.022376 0.0 22.497038 0.002962 \n", - " ... ... ... ... ... ... \n", - " 2024-06-03 0.026019 138.699782 0.0 43.868820 1.131180 \n", - " 2024-06-04 0.034914 34.996651 0.0 -146.539696 11.539696 \n", - " 2024-06-05 0.000000 373.976573 0.0 -233.767410 -621.232590 \n", - " 2024-06-06 0.060016 59.932850 0.0 433.596389 623.903611 \n", - " 2024-06-07 -0.050378 -1.200091 0.0 -57.261677 12.261677 \n", - " \n", - " Actual_PnL Price \n", - " Datetime \n", - " 2023-07-05 67.5 1710.0 \n", - " 2023-07-06 -112.5 1597.5 \n", - " 2023-07-07 67.5 1665.0 \n", - " 2023-07-10 -67.5 1597.5 \n", - " 2023-07-11 22.5 1620.0 \n", - " ... ... ... \n", - " 2024-06-03 45.0 26730.0 \n", - " 2024-06-04 -135.0 26595.0 \n", - " 2024-06-05 -855.0 25740.0 \n", - " 2024-06-06 1057.5 26797.5 \n", - " 2024-06-07 -45.0 26752.5 \n", - " \n", - " [243 rows x 12 columns],\n", - " 5: Delta_PnL Gamma_PnL Vega_PnL Volga_PnL Theta_PnL Rho_PnL \\\n", - " Datetime \n", - " 2023-08-10 1.804080 0.003018 -24.720880 1.043496 -0.460268 -0.090194 \n", - " 2023-08-11 -10.751329 0.135849 -12.359454 0.476588 -0.402170 -0.021391 \n", - " 2023-08-14 3.924697 0.022054 15.107031 -0.600461 -1.128238 0.033317 \n", - " 2023-08-15 -19.056200 0.457220 -1.324012 -0.156587 -0.430729 0.071282 \n", - " 2023-08-16 -9.197445 0.126428 4.762943 -0.177225 -0.414997 0.032591 \n", - " \n", - " Vanna_PnL Dividend_PnL Total_PnL Unexplained_PnL Actual_PnL \\\n", - " Datetime \n", - " 2023-08-10 -0.117415 0.0 -22.538163 0.038163 -22.5 \n", - " 2023-08-11 0.403852 0.0 -22.518056 0.018056 -22.5 \n", - " 2023-08-14 0.268187 0.0 17.626588 -0.126588 17.5 \n", - " 2023-08-15 0.434682 0.0 -20.004343 0.004343 -20.0 \n", - " 2023-08-16 -0.127054 0.0 -4.994758 -0.005242 -5.0 \n", - " \n", - " Price \n", - " Datetime \n", - " 2023-08-10 185.0 \n", - " 2023-08-11 162.5 \n", - " 2023-08-14 180.0 \n", - " 2023-08-15 160.0 \n", - " 2023-08-16 155.0 ,\n", - " 6: Delta_PnL Gamma_PnL Vega_PnL Volga_PnL Theta_PnL Rho_PnL \\\n", - " Datetime \n", - " 2023-08-10 -0.0 0.0 0.0 -0.0 -0.0 -0.0 \n", - " 2023-08-11 0.0 0.0 0.0 0.0 -0.0 -0.0 \n", - " 2023-08-14 -0.0 0.0 -0.0 0.0 -0.0 0.0 \n", - " 2023-08-15 -0.0 0.0 0.0 -0.0 -0.0 0.0 \n", - " 2023-08-16 0.0 0.0 -0.0 -0.0 -0.0 0.0 \n", - " \n", - " Vanna_PnL Dividend_PnL Total_PnL Unexplained_PnL Actual_PnL \\\n", - " Datetime \n", - " 2023-08-10 0.0 0.0 -0.0 -0.0 -0.0 \n", - " 2023-08-11 0.0 0.0 0.0 0.0 0.0 \n", - " 2023-08-14 0.0 0.0 -0.0 -0.0 -0.0 \n", - " 2023-08-15 -0.0 0.0 0.0 -0.0 0.0 \n", - " 2023-08-16 -0.0 0.0 0.0 -0.0 -0.0 \n", - " \n", - " Price \n", - " Datetime \n", - " 2023-08-10 0.0 \n", - " 2023-08-11 0.0 \n", - " 2023-08-14 0.0 \n", - " 2023-08-15 0.0 \n", - " 2023-08-16 0.0 ,\n", - " 7: Delta_PnL Gamma_PnL Vega_PnL Volga_PnL Theta_PnL \\\n", - " Datetime \n", - " 2023-08-17 -145.484074 1.105453 0.000000 0.000000 -1.411600 \n", - " 2023-08-18 -83.776832 0.456254 -66.063481 2.340239 -1.541595 \n", - " 2023-08-21 341.799084 7.926105 144.206568 -6.412059 -4.485223 \n", - " 2023-08-22 44.468681 0.058788 -89.587292 2.354730 -1.378964 \n", - " 2023-08-23 82.752276 0.212734 30.779632 -1.044515 -1.159966 \n", - " 2023-08-24 -156.439860 0.705496 47.915075 -2.273181 -1.136399 \n", - " 2023-08-25 196.308633 1.110404 8.991316 -1.376280 -1.362591 \n", - " 2023-08-28 5.293513 0.000503 21.205236 -0.823295 -3.420865 \n", - " 2023-08-29 426.508923 1.496915 3.874406 -0.809274 -1.181183 \n", - " 2023-08-30 -6.493644 -0.000339 8.214885 -0.916088 -0.658226 \n", - " 2023-08-31 27.307210 -0.006837 -27.202442 1.222610 -0.667387 \n", - " 2023-09-01 -301.379123 -0.284312 13.591744 0.050098 -0.603699 \n", - " 2023-09-04 0.000000 0.000000 0.000000 0.000000 -3.080215 \n", - " 2023-09-05 268.307362 0.285573 -12.622846 -0.835752 -1.039498 \n", - " 2023-09-06 -105.390499 -0.045848 -7.558314 0.517629 -0.653304 \n", - " 2023-09-07 -9.938247 0.000072 -12.349025 1.208162 -0.789094 \n", - " 2023-09-08 -69.502686 0.017868 26.477408 -0.921561 -0.813129 \n", - " 2023-09-11 587.811101 -1.836232 -5.188458 -2.721112 -2.868513 \n", - " 2023-09-12 -138.181554 -0.442477 -20.261180 1.803416 -0.108597 \n", - " 2023-09-13 87.538632 -0.141617 50.207422 -2.678837 -0.299304 \n", - " 2023-09-14 108.797482 -0.297550 50.476282 -1.978154 -0.235154 \n", - " 2023-09-15 -38.054291 -0.043062 -78.819704 4.265433 -0.152488 \n", - " 2023-09-18 -209.814562 -0.954971 1571.222414 -73.080832 -0.387880 \n", - " 2023-09-19 34.787798 -0.074019 -1516.427936 70.962365 -2.374539 \n", - " 2023-09-20 -92.589594 -0.112890 -116.502098 5.533781 -0.443005 \n", - " 2023-09-21 -161.145192 -0.034217 174.320170 -9.012837 -0.431364 \n", - " 2023-09-22 -258.670242 0.011776 13.400828 -0.646289 -0.858973 \n", - " 2023-09-25 50.550518 0.021891 -3.410985 0.781654 -3.658229 \n", - " 2023-09-26 -69.518411 0.044701 -20.600278 0.011737 -1.193846 \n", - " 2023-09-27 -86.582188 0.108550 454.052088 -20.419766 -1.224507 \n", - " 2023-09-28 153.983174 -0.162323 -452.918286 21.191893 -2.006325 \n", - " 2023-09-29 92.696291 0.077149 -1.453000 0.080280 -1.188704 \n", - " 2023-10-02 33.401557 0.005576 -7.806658 -0.311612 -3.251620 \n", - " 2023-10-03 -122.298054 0.098383 83.075361 -5.228412 -1.020664 \n", - " 2023-10-04 353.856975 -0.064957 -55.575063 1.649190 -1.257555 \n", - " 2023-10-05 -26.362395 -0.006905 -18.376582 0.626589 -0.683273 \n", - " 2023-10-06 11.366854 -0.001071 34.219329 -0.765872 -0.695185 \n", - " 2023-10-09 -20.656952 -0.003997 24.528340 -1.415231 -2.289508 \n", - " 2023-10-10 95.457078 -0.099811 -28.291280 1.899410 -0.831333 \n", - " 2023-10-11 -15.230882 -0.002771 -7.730964 0.796620 -0.679320 \n", - " 2023-10-12 -100.044819 -0.090609 11.590703 0.774487 -0.708637 \n", - " 2023-10-13 -191.418598 -0.060242 13.087429 -1.827518 -0.914553 \n", - " 2023-10-16 68.723442 0.013151 -46.790752 3.410141 -3.522183 \n", - " 2023-10-17 23.055468 0.002004 46.766826 -1.884860 -1.078622 \n", - " 2023-10-18 -305.428722 0.617299 -8.201193 0.960251 -1.134223 \n", - " 2023-10-19 -565.936879 10.423392 -85.464821 4.326452 -1.552305 \n", - " \n", - " Rho_PnL Vanna_PnL Dividend_PnL Total_PnL Unexplained_PnL \\\n", - " Datetime \n", - " 2023-08-17 -0.246858 0.000000 0.0 -146.037079 11.037079 \n", - " 2023-08-18 0.000000 2.147072 0.0 -146.438344 -11.061656 \n", - " 2023-08-21 0.066081 11.545582 0.0 494.646136 0.353864 \n", - " 2023-08-22 0.528522 -1.569970 0.0 -45.125505 0.125505 \n", - " 2023-08-23 0.000000 0.938386 0.0 112.478547 0.021453 \n", - " 2023-08-24 0.278802 -1.417248 0.0 -112.367316 -0.132684 \n", - " 2023-08-25 0.412129 -1.728850 0.0 202.354761 0.145239 \n", - " 2023-08-28 0.274617 0.031061 0.0 22.560771 -0.060771 \n", - " 2023-08-29 -0.103292 -2.606918 0.0 427.179577 0.320423 \n", - " 2023-08-30 -0.171138 0.022945 0.0 -0.001605 0.001605 \n", - " 2023-08-31 -0.576931 -0.120388 0.0 -0.044165 0.044165 \n", - " 2023-09-01 -1.017407 -2.602379 0.0 -292.245078 -0.254922 \n", - " 2023-09-04 0.000000 0.000000 0.0 -3.080215 3.080215 \n", - " 2023-09-05 0.342970 -4.095995 0.0 250.341815 -2.841815 \n", - " 2023-09-06 0.738284 -0.036300 0.0 -112.428352 -0.071648 \n", - " 2023-09-07 -0.572667 -0.044722 0.0 -22.485522 -0.014478 \n", - " 2023-09-08 0.340698 -0.525890 0.0 -44.927293 -0.072707 \n", - " 2023-09-11 0.000000 -14.918908 0.0 560.277878 2.222122 \n", - " 2023-09-12 0.383977 -0.595310 0.0 -157.401725 -0.098275 \n", - " 2023-09-13 0.000000 0.331652 0.0 134.957948 0.042052 \n", - " 2023-09-14 -0.323684 1.005425 0.0 157.444646 0.055354 \n", - " 2023-09-15 0.096271 0.186596 0.0 -112.521246 0.021246 \n", - " 2023-09-18 0.065358 -43.796112 0.0 1243.253415 -5.753415 \n", - " 2023-09-19 0.324871 -5.851647 0.0 -1418.653106 1.153106 \n", - " 2023-09-20 0.170223 1.430298 0.0 -202.513284 0.013284 \n", - " 2023-09-21 -0.342883 -3.114027 0.0 0.239650 -0.239650 \n", - " 2023-09-22 0.000000 -0.538844 0.0 -247.301744 -0.198256 \n", - " 2023-09-25 0.270639 0.325617 0.0 44.881106 0.118894 \n", - " 2023-09-26 0.410993 0.861989 0.0 -89.983115 -0.016885 \n", - " 2023-09-27 0.168132 -8.164385 0.0 337.937924 -0.437924 \n", - " 2023-09-28 -0.764236 -12.321154 0.0 -292.997256 0.497256 \n", - " 2023-09-29 -0.272520 -0.011503 0.0 89.927995 0.072005 \n", - " 2023-10-02 0.512247 -0.254278 0.0 22.295211 0.204789 \n", - " 2023-10-03 0.844174 -0.325921 0.0 -44.855133 -0.144867 \n", - " 2023-10-04 -0.165427 -6.283578 0.0 292.159585 0.340415 \n", - " 2023-10-05 -0.324805 0.126865 0.0 -45.000506 0.000506 \n", - " 2023-10-06 0.744923 0.149557 0.0 45.018536 -0.018536 \n", - " 2023-10-09 0.000000 -0.030268 0.0 0.132385 -0.132385 \n", - " 2023-10-10 -0.817866 0.094982 0.0 67.411180 0.088820 \n", - " 2023-10-11 0.394814 -0.040305 0.0 -22.492809 -0.007191 \n", - " 2023-10-12 0.000000 -1.411021 0.0 -89.889896 -0.110104 \n", - " 2023-10-13 -0.237790 1.502327 0.0 -179.868944 -0.131056 \n", - " 2023-10-16 0.000000 0.370142 0.0 22.203940 0.296060 \n", - " 2023-10-17 0.409412 0.250129 0.0 67.520357 -0.020357 \n", - " 2023-10-18 -0.343335 -1.243684 0.0 -314.773607 -0.226393 \n", - " 2023-10-19 -0.685448 9.093192 0.0 -629.796417 -0.203583 \n", - " \n", - " Actual_PnL Price \n", - " Datetime \n", - " 2023-08-17 -1.350000e+02 1800.0 \n", - " 2023-08-18 -1.575000e+02 1642.5 \n", - " 2023-08-21 4.950000e+02 2137.5 \n", - " 2023-08-22 -4.500000e+01 2092.5 \n", - " 2023-08-23 1.125000e+02 2205.0 \n", - " 2023-08-24 -1.125000e+02 2092.5 \n", - " 2023-08-25 2.025000e+02 2295.0 \n", - " 2023-08-28 2.250000e+01 2317.5 \n", - " 2023-08-29 4.275000e+02 2745.0 \n", - " 2023-08-30 6.394885e-12 2745.0 \n", - " 2023-08-31 0.000000e+00 2745.0 \n", - " 2023-09-01 -2.925000e+02 2452.5 \n", - " 2023-09-04 0.000000e+00 2452.5 \n", - " 2023-09-05 2.475000e+02 2700.0 \n", - " 2023-09-06 -1.125000e+02 2587.5 \n", - " 2023-09-07 -2.250000e+01 2565.0 \n", - " 2023-09-08 -4.500000e+01 2520.0 \n", - " 2023-09-11 5.625000e+02 3082.5 \n", - " 2023-09-12 -1.575000e+02 2925.0 \n", - " 2023-09-13 1.350000e+02 3060.0 \n", - " 2023-09-14 1.575000e+02 3217.5 \n", - " 2023-09-15 -1.125000e+02 3105.0 \n", - " 2023-09-18 1.237500e+03 4342.5 \n", - " 2023-09-19 -1.417500e+03 2925.0 \n", - " 2023-09-20 -2.025000e+02 2722.5 \n", - " 2023-09-21 -6.139089e-12 2722.5 \n", - " 2023-09-22 -2.475000e+02 2475.0 \n", - " 2023-09-25 4.500000e+01 2520.0 \n", - " 2023-09-26 -9.000000e+01 2430.0 \n", - " 2023-09-27 3.375000e+02 2767.5 \n", - " 2023-09-28 -2.925000e+02 2475.0 \n", - " 2023-09-29 9.000000e+01 2565.0 \n", - " 2023-10-02 2.250000e+01 2587.5 \n", - " 2023-10-03 -4.500000e+01 2542.5 \n", - " 2023-10-04 2.925000e+02 2835.0 \n", - " 2023-10-05 -4.500000e+01 2790.0 \n", - " 2023-10-06 4.500000e+01 2835.0 \n", - " 2023-10-09 0.000000e+00 2835.0 \n", - " 2023-10-10 6.750000e+01 2902.5 \n", - " 2023-10-11 -2.250000e+01 2880.0 \n", - " 2023-10-12 -9.000000e+01 2790.0 \n", - " 2023-10-13 -1.800000e+02 2610.0 \n", - " 2023-10-16 2.250000e+01 2632.5 \n", - " 2023-10-17 6.750000e+01 2700.0 \n", - " 2023-10-18 -3.150000e+02 2385.0 \n", - " 2023-10-19 -6.300000e+02 1755.0 ,\n", - " 8: Delta_PnL Gamma_PnL Vega_PnL Volga_PnL Theta_PnL Rho_PnL \\\n", - " Datetime \n", - " 2023-08-31 12.784924 0.049477 22.198714 -0.744027 -5.671542 -1.755172 \n", - " 2023-09-01 94.211508 2.637384 -69.385218 2.681905 -5.825695 -3.151322 \n", - " 2023-09-04 0.000000 0.000000 0.000000 0.000000 -17.339111 0.000000 \n", - " 2023-09-05 14.287606 0.060341 35.676316 -1.204889 -5.778599 1.056377 \n", - " 2023-09-06 -412.389276 46.570116 34.344112 -4.280771 -5.892724 2.364406 \n", - " \n", - " Vanna_PnL Dividend_PnL Total_PnL Unexplained_PnL Actual_PnL \\\n", - " Datetime \n", - " 2023-08-31 0.201530 0.0 27.063904 -0.063904 27.0 \n", - " 2023-09-01 -3.620288 0.0 17.548274 0.451726 18.0 \n", - " 2023-09-04 0.000000 0.0 -17.339111 17.339111 0.0 \n", - " 2023-09-05 0.195153 0.0 44.292306 -17.292306 27.0 \n", - " 2023-09-06 -0.989757 0.0 -340.273895 -1.726105 -342.0 \n", - " \n", - " Price \n", - " Datetime \n", - " 2023-08-31 1191.0 \n", - " 2023-09-01 1209.0 \n", - " 2023-09-04 1209.0 \n", - " 2023-09-05 1236.0 \n", - " 2023-09-06 894.0 ,\n", - " 9: Delta_PnL Gamma_PnL Vega_PnL Volga_PnL Theta_PnL Rho_PnL \\\n", - " Datetime \n", - " 2023-09-15 -0.0 -0.0 -0.0 0.0 -0.0 0.0 \n", - " 2023-09-18 0.0 0.0 -0.0 0.0 -0.0 0.0 \n", - " 2023-09-19 -0.0 0.0 0.0 -0.0 -0.0 0.0 \n", - " \n", - " Vanna_PnL Dividend_PnL Total_PnL Unexplained_PnL Actual_PnL \\\n", - " Datetime \n", - " 2023-09-15 -0.0 0.0 -0.0 -0.0 -0.0 \n", - " 2023-09-18 -0.0 0.0 -0.0 0.0 -0.0 \n", - " 2023-09-19 -0.0 0.0 -0.0 -0.0 -0.0 \n", - " \n", - " Price \n", - " Datetime \n", - " 2023-09-15 0.0 \n", - " 2023-09-18 0.0 \n", - " 2023-09-19 0.0 ,\n", - " 10: Delta_PnL Gamma_PnL Vega_PnL Volga_PnL Theta_PnL Rho_PnL \\\n", - " Datetime \n", - " 2023-11-13 -1.621734 -0.000865 -11.710988 0.949776 -0.175490 0.043051 \n", - " 2023-11-14 15.515187 -0.057583 -1.242854 0.234872 -0.048711 -0.029962 \n", - " 2023-11-15 6.917484 -0.019006 0.414677 -0.013486 -0.030528 0.008606 \n", - " 2023-11-16 -0.973411 -0.000438 -42.250951 3.271783 -0.022720 -0.051287 \n", - " 2023-11-17 3.133237 0.000856 47.657600 -3.717811 0.019880 -0.041836 \n", - " ... ... ... ... ... ... ... \n", - " 2024-06-24 -13.643109 -1.989602 6.517982 2.357383 0.952232 0.005487 \n", - " 2024-06-25 1.965767 -0.033157 -39.742275 3.972009 0.334994 -0.010093 \n", - " 2024-06-26 -8.910986 -0.412874 -43.168043 16.537608 0.468384 -0.001133 \n", - " 2024-06-27 -5.624665 -0.101666 138.119311 -42.250945 0.661120 -0.005750 \n", - " 2024-06-28 4.609148 -0.307572 -12.943171 5.190438 0.184103 0.013041 \n", - " \n", - " Vanna_PnL Dividend_PnL Total_PnL Unexplained_PnL Actual_PnL \\\n", - " Datetime \n", - " 2023-11-13 0.037296 0.0 -12.478954 -0.021046 -12.5 \n", - " 2023-11-14 0.158300 0.0 14.529248 0.470752 15.0 \n", - " 2023-11-15 0.016077 0.0 7.293825 0.206175 7.5 \n", - " 2023-11-16 0.079699 0.0 -39.947324 -0.052676 -40.0 \n", - " 2023-11-17 0.319302 0.0 47.371229 0.128771 47.5 \n", - " ... ... ... ... ... ... \n", - " 2024-06-24 0.664971 0.0 -5.134656 0.134656 -5.0 \n", - " 2024-06-25 0.548675 0.0 -32.964080 0.464080 -32.5 \n", - " 2024-06-26 -2.677157 0.0 -38.164200 0.664200 -37.5 \n", - " 2024-06-27 3.322148 0.0 94.119554 -1.619554 92.5 \n", - " 2024-06-28 0.664905 0.0 -2.589109 0.089109 -2.5 \n", - " \n", - " Price \n", - " Datetime \n", - " 2023-11-13 185.0 \n", - " 2023-11-14 200.0 \n", - " 2023-11-15 207.5 \n", - " 2023-11-16 167.5 \n", - " 2023-11-17 215.0 \n", - " ... ... \n", - " 2024-06-24 435.0 \n", - " 2024-06-25 402.5 \n", - " 2024-06-26 365.0 \n", - " 2024-06-27 457.5 \n", - " 2024-06-28 455.0 \n", - " \n", - " [165 rows x 12 columns],\n", - " 11: Delta_PnL Gamma_PnL Vega_PnL Volga_PnL Theta_PnL Rho_PnL \\\n", - " Datetime \n", - " 2023-11-14 36.355343 -0.200165 -280.033359 8.939046 -0.596639 -0.193297 \n", - " 2023-11-15 -5.663406 -0.000711 -167.157684 4.899052 -0.226487 0.055522 \n", - " 2023-11-16 57.797596 0.223745 404.832371 -12.738445 -0.028654 -0.326927 \n", - " 2023-11-17 -61.580127 -0.639686 -339.796211 11.348836 -0.422605 -0.263341 \n", - " 2023-11-20 69.754519 0.108893 339.779878 -11.862344 -0.354709 0.137907 \n", - " ... ... ... ... ... ... ... \n", - " 2024-06-24 -14.197693 -0.244075 -151.341049 15.380408 1.463742 -0.022508 \n", - " 2024-06-25 26.827881 -0.570400 -87.104085 7.272012 1.032109 0.107536 \n", - " 2024-06-26 10.281259 -0.074260 42.124108 -3.327659 1.392171 0.065103 \n", - " 2024-06-27 5.588566 -0.024929 7.243167 -1.391577 1.280847 -0.057314 \n", - " 2024-06-28 -46.675427 -1.810686 353.346530 -33.651610 1.244007 -0.076975 \n", - " \n", - " Vanna_PnL Dividend_PnL Total_PnL Unexplained_PnL Actual_PnL \\\n", - " Datetime \n", - " 2023-11-14 -2.292114 0.0 -238.021184 0.521184 -237.5 \n", - " 2023-11-15 0.333800 0.0 -167.759913 -7.240087 -175.0 \n", - " 2023-11-16 5.891523 0.0 455.651208 6.848792 462.5 \n", - " 2023-11-17 4.128631 0.0 -387.224503 -0.275497 -387.5 \n", - " 2023-11-20 2.614383 0.0 400.178527 -0.178527 400.0 \n", - " ... ... ... ... ... ... \n", - " 2024-06-24 -2.487539 0.0 -151.448713 1.448713 -150.0 \n", - " 2024-06-25 2.119126 0.0 -50.315821 0.315821 -50.0 \n", - " 2024-06-26 -0.344141 0.0 50.116581 -0.116581 50.0 \n", - " 2024-06-27 -0.090270 0.0 12.548490 -0.048490 12.5 \n", - " 2024-06-28 16.206140 0.0 288.581979 -1.081979 287.5 \n", - " \n", - " Price \n", - " Datetime \n", - " 2023-11-14 975.0 \n", - " 2023-11-15 800.0 \n", - " 2023-11-16 1262.5 \n", - " 2023-11-17 875.0 \n", - " 2023-11-20 1275.0 \n", - " ... ... \n", - " 2024-06-24 1975.0 \n", - " 2024-06-25 1925.0 \n", - " 2024-06-26 1975.0 \n", - " 2024-06-27 1987.5 \n", - " 2024-06-28 2275.0 \n", - " \n", - " [164 rows x 12 columns],\n", - " 12: Delta_PnL Gamma_PnL Vega_PnL Volga_PnL Theta_PnL Rho_PnL \\\n", - " Datetime \n", - " 2023-11-15 14.905424 -0.004372 -30.545291 3.263314 -0.528702 0.063280 \n", - " 2023-11-16 40.824440 -0.028826 -30.813799 2.799743 -0.488198 -0.381689 \n", - " 2023-11-17 -56.144573 -0.018347 23.467276 -0.837233 -0.409592 -0.316194 \n", - " 2023-11-20 -44.949705 0.036985 -31.023552 3.176351 -1.571001 0.163695 \n", - " 2023-11-21 -21.468016 0.028076 -73.053675 6.832719 -0.547109 0.554294 \n", - " 2023-11-22 -8.542504 0.008674 133.566359 -11.220055 -0.491376 0.320606 \n", - " 2023-11-23 0.000000 0.000000 0.000000 0.000000 -0.680067 0.000000 \n", - " 2023-11-24 -24.370133 0.030395 -53.523330 4.268504 -0.682343 -0.405665 \n", - " 2023-11-27 -14.973911 0.021475 46.624649 -3.931232 -1.907942 0.163955 \n", - " 2023-11-28 -43.190538 0.162885 -62.381804 5.565793 -0.717127 0.066385 \n", - " \n", - " Vanna_PnL Dividend_PnL Total_PnL Unexplained_PnL Actual_PnL \\\n", - " Datetime \n", - " 2023-11-15 -0.039486 0.0 -12.885833 0.385833 -12.5 \n", - " 2023-11-16 -0.430520 0.0 11.481151 1.018849 12.5 \n", - " 2023-11-17 -1.808085 0.0 -36.066749 -1.433251 -37.5 \n", - " 2023-11-20 0.268322 0.0 -73.898906 -1.101094 -75.0 \n", - " 2023-11-21 0.572083 0.0 -87.081627 -0.418373 -87.5 \n", - " 2023-11-22 -0.682012 0.0 112.959691 -0.459691 112.5 \n", - " 2023-11-23 0.000000 0.0 -0.680067 0.680067 0.0 \n", - " 2023-11-24 0.782055 0.0 -73.900517 -1.099483 -75.0 \n", - " 2023-11-27 -0.393179 0.0 25.603814 -0.603814 25.0 \n", - " 2023-11-28 1.305479 0.0 -99.188928 -0.811072 -100.0 \n", - " \n", - " Price \n", - " Datetime \n", - " 2023-11-15 962.5 \n", - " 2023-11-16 975.0 \n", - " 2023-11-17 937.5 \n", - " 2023-11-20 862.5 \n", - " 2023-11-21 775.0 \n", - " 2023-11-22 887.5 \n", - " 2023-11-23 887.5 \n", - " 2023-11-24 812.5 \n", - " 2023-11-27 837.5 \n", - " 2023-11-28 737.5 ,\n", - " 13: Delta_PnL Gamma_PnL Vega_PnL Volga_PnL Theta_PnL Rho_PnL \\\n", - " Datetime \n", - " 2023-11-15 -27.938967 0.482890 -7.195002 0.448075 -1.166474 0.023471 \n", - " 2023-11-16 25.921729 0.463239 -5.450681 0.446244 -1.132352 -0.132681 \n", - " 2023-11-17 11.536731 0.086025 -0.315064 -0.021571 -1.145486 -0.115160 \n", - " 2023-11-20 13.447839 0.112779 4.970149 -0.235844 -3.457782 0.058351 \n", - " 2023-11-21 -36.076085 0.787369 -7.626976 0.503556 -1.199215 0.203946 \n", - " ... ... ... ... ... ... ... \n", - " 2024-06-24 -30.008601 0.211751 -4.257229 0.357082 -11.360327 -0.050789 \n", - " 2024-06-25 0.000000 0.000000 -2.453948 1.324326 -3.958140 0.126747 \n", - " 2024-06-26 -84.306185 1.941599 -10.055315 0.487778 -4.237032 0.069624 \n", - " 2024-06-27 56.595357 1.029328 -4.881813 1.066921 -4.347643 -0.064359 \n", - " 2024-06-28 84.262825 2.027321 -2.094607 0.227929 -4.378374 -0.096331 \n", - " \n", - " Vanna_PnL Dividend_PnL Total_PnL Unexplained_PnL Actual_PnL \\\n", - " Datetime \n", - " 2023-11-15 0.324240 0.0 -35.021767 0.021767 -35.0 \n", - " 2023-11-16 -0.106825 0.0 20.008673 -0.008673 20.0 \n", - " 2023-11-17 -0.026423 0.0 9.999052 0.000948 10.0 \n", - " 2023-11-20 0.192656 0.0 15.088149 -0.088149 15.0 \n", - " 2023-11-21 0.396489 0.0 -43.010916 0.010916 -43.0 \n", - " ... ... ... ... ... ... \n", - " 2024-06-24 0.100974 0.0 -45.007139 0.007139 -45.0 \n", - " 2024-06-25 0.000000 0.0 -4.961015 -0.038985 -5.0 \n", - " 2024-06-26 1.079147 0.0 -95.020385 0.020385 -95.0 \n", - " 2024-06-27 0.547994 0.0 49.945785 0.054215 50.0 \n", - " 2024-06-28 -0.085746 0.0 79.863018 0.136982 80.0 \n", - " \n", - " Price \n", - " Datetime \n", - " 2023-11-15 370.0 \n", - " 2023-11-16 390.0 \n", - " 2023-11-17 400.0 \n", - " 2023-11-20 415.0 \n", - " 2023-11-21 372.0 \n", - " ... ... \n", - " 2024-06-24 820.0 \n", - " 2024-06-25 815.0 \n", - " 2024-06-26 720.0 \n", - " 2024-06-27 770.0 \n", - " 2024-06-28 850.0 \n", - " \n", - " [163 rows x 12 columns],\n", - " 14: Delta_PnL Gamma_PnL Vega_PnL Volga_PnL Theta_PnL Rho_PnL \\\n", - " Datetime \n", - " 2023-11-16 -0.0 -0.0 0.0 0.0 -0.0 -0.0 \n", - " 2023-11-17 0.0 -0.0 -0.0 0.0 -0.0 -0.0 \n", - " 2023-11-20 0.0 -0.0 0.0 -0.0 -0.0 0.0 \n", - " 2023-11-21 -0.0 -0.0 0.0 -0.0 -0.0 0.0 \n", - " 2023-11-22 0.0 -0.0 -0.0 0.0 -0.0 0.0 \n", - " ... ... ... ... ... ... ... \n", - " 2024-06-24 -0.0 -0.0 0.0 -0.0 0.0 0.0 \n", - " 2024-06-25 0.0 -0.0 -0.0 0.0 0.0 -0.0 \n", - " 2024-06-26 0.0 -0.0 -0.0 0.0 0.0 -0.0 \n", - " 2024-06-27 -0.0 -0.0 0.0 -0.0 0.0 -0.0 \n", - " 2024-06-28 -0.0 -0.0 0.0 -0.0 0.0 0.0 \n", - " \n", - " Vanna_PnL Dividend_PnL Total_PnL Unexplained_PnL Actual_PnL \\\n", - " Datetime \n", - " 2023-11-16 -0.0 0.0 -0.0 -0.0 -0.0 \n", - " 2023-11-17 -0.0 0.0 0.0 0.0 0.0 \n", - " 2023-11-20 0.0 0.0 0.0 0.0 0.0 \n", - " 2023-11-21 0.0 0.0 -0.0 -0.0 -0.0 \n", - " 2023-11-22 0.0 0.0 -0.0 0.0 0.0 \n", - " ... ... ... ... ... ... \n", - " 2024-06-24 0.0 0.0 0.0 -0.0 0.0 \n", - " 2024-06-25 0.0 0.0 -0.0 0.0 -0.0 \n", - " 2024-06-26 0.0 0.0 -0.0 0.0 -0.0 \n", - " 2024-06-27 0.0 0.0 0.0 -0.0 0.0 \n", - " 2024-06-28 0.0 0.0 0.0 -0.0 0.0 \n", - " \n", - " Price \n", - " Datetime \n", - " 2023-11-16 0.0 \n", - " 2023-11-17 0.0 \n", - " 2023-11-20 0.0 \n", - " 2023-11-21 0.0 \n", - " 2023-11-22 0.0 \n", - " ... ... \n", - " 2024-06-24 0.0 \n", - " 2024-06-25 0.0 \n", - " 2024-06-26 0.0 \n", - " 2024-06-27 0.0 \n", - " 2024-06-28 0.0 \n", - " \n", - " [162 rows x 12 columns],\n", - " 15: Delta_PnL Gamma_PnL Vega_PnL Volga_PnL Theta_PnL Rho_PnL \\\n", - " Datetime \n", - " 2023-11-17 0.0 -0.0 0.0 -0.0 -0.0 -0.0 \n", - " 2023-11-20 0.0 -0.0 -0.0 0.0 -0.0 0.0 \n", - " 2023-11-21 -0.0 -0.0 -0.0 0.0 -0.0 0.0 \n", - " 2023-11-22 0.0 -0.0 0.0 -0.0 -0.0 0.0 \n", - " 2023-11-23 0.0 0.0 0.0 0.0 -0.0 0.0 \n", - " ... ... ... ... ... ... ... \n", - " 2024-03-27 0.0 0.0 -0.0 0.0 -0.0 -0.0 \n", - " 2024-03-28 0.0 0.0 0.0 -0.0 -0.0 -0.0 \n", - " 2024-03-29 0.0 0.0 0.0 0.0 -0.0 0.0 \n", - " 2024-04-01 0.0 0.0 0.0 -0.0 -0.0 0.0 \n", - " 2024-04-02 -0.0 0.0 -0.0 0.0 -0.0 -0.0 \n", - " \n", - " Vanna_PnL Dividend_PnL Total_PnL Unexplained_PnL Actual_PnL \\\n", - " Datetime \n", - " 2023-11-17 0.0 0.0 0.0 0.0 0.0 \n", - " 2023-11-20 -0.0 0.0 0.0 0.0 0.0 \n", - " 2023-11-21 0.0 0.0 -0.0 -0.0 -0.0 \n", - " 2023-11-22 0.0 0.0 0.0 -0.0 0.0 \n", - " 2023-11-23 0.0 0.0 -0.0 0.0 0.0 \n", - " ... ... ... ... ... ... \n", - " 2024-03-27 0.0 0.0 0.0 0.0 0.0 \n", - " 2024-03-28 0.0 0.0 0.0 0.0 0.0 \n", - " 2024-03-29 0.0 0.0 -0.0 0.0 0.0 \n", - " 2024-04-01 -0.0 0.0 0.0 -0.0 0.0 \n", - " 2024-04-02 0.0 0.0 -0.0 -0.0 -0.0 \n", - " \n", - " Price \n", - " Datetime \n", - " 2023-11-17 0.0 \n", - " 2023-11-20 0.0 \n", - " 2023-11-21 0.0 \n", - " 2023-11-22 0.0 \n", - " 2023-11-23 0.0 \n", - " ... ... \n", - " 2024-03-27 0.0 \n", - " 2024-03-28 0.0 \n", - " 2024-03-29 0.0 \n", - " 2024-04-01 0.0 \n", - " 2024-04-02 0.0 \n", - " \n", - " [98 rows x 12 columns],\n", - " 16: Delta_PnL Gamma_PnL Vega_PnL Volga_PnL Theta_PnL Rho_PnL \\\n", - " Datetime \n", - " 2023-11-17 -4.093016 0.023486 2.862142 -0.248995 -0.429202 -0.076581 \n", - " 2023-11-20 9.974242 0.139655 -2.384869 0.143178 -1.317607 0.037944 \n", - " 2023-11-21 -6.678286 0.060185 -1.793225 0.206570 -0.431203 0.130700 \n", - " 2023-11-22 7.004488 0.070646 3.454679 -0.269931 -0.432415 0.075073 \n", - " 2023-11-23 0.000000 0.000000 0.000000 0.000000 -0.445700 0.000000 \n", - " 2023-11-24 11.573987 0.175378 -2.912147 0.249007 -0.447198 -0.092936 \n", - " 2023-11-27 -10.623639 0.140948 -3.126523 0.294745 -1.319934 0.039707 \n", - " 2023-11-28 -30.786249 1.387614 -1.939190 0.232987 -0.437766 0.015150 \n", - " 2023-11-29 0.000000 0.000000 -2.702974 0.267328 -0.433917 -0.134873 \n", - " 2023-11-30 1.970226 0.007737 0.489981 -0.030247 -0.429815 -0.013373 \n", - " 2023-12-01 -1.152894 0.002604 -2.558072 0.298254 -0.434547 -0.155105 \n", - " 2023-12-04 -5.944892 0.072726 1.922780 -0.374196 -1.312723 0.053668 \n", - " 2023-12-05 -12.286290 0.329676 -2.604286 0.220712 -0.428701 0.127488 \n", - " 2023-12-06 6.681479 0.113504 4.555338 -0.486393 -0.413464 0.000000 \n", - " 2023-12-07 8.324237 0.155405 -33.541588 1.118838 -0.423359 -0.061177 \n", - " 2023-12-08 3.849284 0.045137 39.578338 -4.115500 -0.276548 0.000000 \n", - " 2023-12-11 -6.436351 0.080935 1.219100 -0.172466 -1.308844 0.000000 \n", - " 2023-12-12 -11.402323 0.273047 -7.780054 0.786654 -0.434441 0.093354 \n", - " 2023-12-13 16.457407 0.686983 1.992515 -0.135874 -0.411810 -0.143210 \n", - " 2023-12-14 11.416070 0.268916 4.116075 -0.349751 -0.436708 -0.050897 \n", - " 2023-12-15 -5.246245 0.049297 -4.487863 0.357745 -0.455158 0.067788 \n", - " 2023-12-18 -6.306836 0.078574 -6.950123 0.578883 -1.321046 0.000000 \n", - " 2023-12-19 10.612447 0.254615 9.508427 -0.783891 -0.416203 0.078739 \n", - " 2023-12-20 -28.760899 1.566384 -5.418778 -0.295676 -0.454880 -0.052797 \n", - " 2023-12-21 6.822833 0.120614 2.853934 -0.268516 -0.396562 -0.108375 \n", - " 2023-12-22 -9.496973 0.212183 5.488576 -0.446721 -0.408225 -0.011319 \n", - " 2023-12-25 0.000000 0.000000 0.000000 0.000000 -1.300321 0.000000 \n", - " 2023-12-26 -0.657247 0.001092 1.060720 -0.209956 -0.435967 -0.027406 \n", - " 2023-12-27 -5.295538 0.071119 -47.517350 1.735823 -0.430337 0.172621 \n", - " 2023-12-28 0.126954 0.000082 46.532088 -6.238940 -0.206132 -0.063610 \n", - " 2023-12-29 -0.984878 0.002768 1.208010 -0.115478 -0.424603 -0.196031 \n", - " 2024-01-01 0.000000 0.000000 0.000000 0.000000 -1.283503 0.000000 \n", - " 2024-01-02 3.735409 0.040709 2.555674 -0.291215 -0.430175 0.166791 \n", - " 2024-01-03 8.576984 0.198839 4.025995 -0.446540 -0.437413 0.113724 \n", - " 2024-01-04 -10.471645 0.259177 -1.663818 0.154747 -0.449974 -0.038070 \n", - " 2024-01-05 3.077734 0.025626 -1.257149 0.155603 -0.437604 -0.040569 \n", - " 2024-01-08 5.982632 0.095159 4.609763 -0.372503 -1.335598 0.000000 \n", - " 2024-01-09 -18.347244 0.817051 -9.568418 0.898340 -0.477445 0.054372 \n", - " \n", - " Vanna_PnL Dividend_PnL Total_PnL Unexplained_PnL Actual_PnL \\\n", - " Datetime \n", - " 2023-11-17 -0.035323 0.0 -1.997488 -0.002512 -2.0 \n", - " 2023-11-20 -0.123935 0.0 6.468607 0.031393 6.5 \n", - " 2023-11-21 0.006948 0.0 -8.498312 -0.001688 -8.5 \n", - " 2023-11-22 0.100094 0.0 10.002634 -0.002634 10.0 \n", - " 2023-11-23 0.000000 0.0 -0.445700 0.445700 0.0 \n", - " 2023-11-24 -0.105351 0.0 8.440740 -0.440740 8.0 \n", - " 2023-11-27 0.079989 0.0 -14.514707 0.014707 -14.5 \n", - " 2023-11-28 0.025360 0.0 -31.502095 0.002095 -31.5 \n", - " 2023-11-29 0.000000 0.0 -3.004435 0.004435 -3.0 \n", - " 2023-11-30 0.006631 0.0 2.001140 -0.001140 2.0 \n", - " 2023-12-01 -0.001080 0.0 -4.000840 0.000840 -4.0 \n", - " 2023-12-04 0.053501 0.0 -5.529135 0.029135 -5.5 \n", - " 2023-12-05 0.141100 0.0 -14.500301 0.000301 -14.5 \n", - " 2023-12-06 0.053351 0.0 10.503815 -0.003815 10.5 \n", - " 2023-12-07 -1.660716 0.0 -26.088360 0.088360 -26.0 \n", - " 2023-12-08 0.940268 0.0 40.020979 -2.520979 37.5 \n", - " 2023-12-11 0.010309 0.0 -6.607317 0.107317 -6.5 \n", - " 2023-12-12 0.276677 0.0 -18.187086 0.187086 -18.0 \n", - " 2023-12-13 0.290973 0.0 18.736985 -0.236985 18.5 \n", - " 2023-12-14 0.188629 0.0 15.152335 -0.152335 15.0 \n", - " 2023-12-15 0.101546 0.0 -9.612890 0.112890 -9.5 \n", - " 2023-12-18 0.189058 0.0 -13.731491 0.231491 -13.5 \n", - " 2023-12-19 0.452107 0.0 19.706242 -0.206242 19.5 \n", - " 2023-12-20 1.478960 0.0 -31.937686 0.437686 -31.5 \n", - " 2023-12-21 0.068663 0.0 9.092591 -0.092591 9.0 \n", - " 2023-12-22 -0.353725 0.0 -5.016205 0.016205 -5.0 \n", - " 2023-12-25 0.000000 0.0 -1.300321 1.300321 0.0 \n", - " 2023-12-26 0.004143 0.0 -0.264621 -1.235379 -1.5 \n", - " 2023-12-27 1.542810 0.0 -49.720851 0.720851 -49.0 \n", - " 2023-12-28 0.052269 0.0 40.202711 -0.702711 39.5 \n", - " 2023-12-29 -0.004523 0.0 -0.514734 0.014734 -0.5 \n", - " 2024-01-01 0.000000 0.0 -1.283503 1.283503 0.0 \n", - " 2024-01-02 0.015977 0.0 5.793169 -1.293169 4.5 \n", - " 2024-01-03 0.063178 0.0 12.094767 -0.094767 12.0 \n", - " 2024-01-04 0.072677 0.0 -12.136906 0.136906 -12.0 \n", - " 2024-01-05 0.003725 0.0 1.527366 -0.027366 1.5 \n", - " 2024-01-08 0.185617 0.0 9.165069 -0.165069 9.0 \n", - " 2024-01-09 0.818504 0.0 -25.804840 0.304840 -25.5 \n", - " \n", - " Price \n", - " Datetime \n", - " 2023-11-17 168.0 \n", - " 2023-11-20 174.5 \n", - " 2023-11-21 166.0 \n", - " 2023-11-22 176.0 \n", - " 2023-11-23 176.0 \n", - " 2023-11-24 184.0 \n", - " 2023-11-27 169.5 \n", - " 2023-11-28 138.0 \n", - " 2023-11-29 135.0 \n", - " 2023-11-30 137.0 \n", - " 2023-12-01 133.0 \n", - " 2023-12-04 127.5 \n", - " 2023-12-05 113.0 \n", - " 2023-12-06 123.5 \n", - " 2023-12-07 97.5 \n", - " 2023-12-08 135.0 \n", - " 2023-12-11 128.5 \n", - " 2023-12-12 110.5 \n", - " 2023-12-13 129.0 \n", - " 2023-12-14 144.0 \n", - " 2023-12-15 134.5 \n", - " 2023-12-18 121.0 \n", - " 2023-12-19 140.5 \n", - " 2023-12-20 109.0 \n", - " 2023-12-21 118.0 \n", - " 2023-12-22 113.0 \n", - " 2023-12-25 113.0 \n", - " 2023-12-26 111.5 \n", - " 2023-12-27 62.5 \n", - " 2023-12-28 102.0 \n", - " 2023-12-29 101.5 \n", - " 2024-01-01 101.5 \n", - " 2024-01-02 106.0 \n", - " 2024-01-03 118.0 \n", - " 2024-01-04 106.0 \n", - " 2024-01-05 107.5 \n", - " 2024-01-08 116.5 \n", - " 2024-01-09 91.0 ,\n", - " 17: Delta_PnL Gamma_PnL Vega_PnL Volga_PnL Theta_PnL Rho_PnL \\\n", - " Datetime \n", - " 2023-11-22 14.431873 0.009471 11.437994 -0.524905 -0.883550 0.347024 \n", - " 2023-11-23 0.000000 0.000000 0.000000 0.000000 -0.890568 0.000000 \n", - " 2023-11-24 -29.166053 0.034546 6.959479 -0.304582 -0.893500 -0.418695 \n", - " 2023-11-27 -3.931262 0.000789 -5.924507 -0.087066 -2.825261 0.174488 \n", - " 2023-11-28 13.171060 0.009454 0.101162 -0.003609 -0.927438 0.068413 \n", - " 2023-11-29 -22.296211 0.026950 -1.071239 0.060788 -0.917233 -0.684985 \n", - " 2023-11-30 12.530550 0.009927 0.981925 -0.081338 -0.940987 -0.068216 \n", - " 2023-12-01 27.924432 0.040633 -1.439646 0.057319 -0.931269 -0.784335 \n", - " 2023-12-04 -39.280942 0.077999 4.721823 -0.533814 -2.713457 0.273237 \n", - " 2023-12-05 85.947879 0.354273 -9.867769 -0.024159 -0.946677 0.670967 \n", - " 2023-12-06 -23.433621 0.012008 -0.728159 0.298629 -0.821848 0.000000 \n", - " 2023-12-07 41.869699 0.043896 -4.042911 0.396560 -0.861173 -0.333663 \n", - " 2023-12-08 31.148522 0.005510 20.019280 -0.909333 -0.817541 0.000000 \n", - " 2023-12-11 -55.460445 -0.014712 -4.335116 0.412523 -2.458366 0.000000 \n", - " 2023-12-12 33.763390 0.017552 29.463175 -1.275262 -0.892221 0.510615 \n", - " 2023-12-13 73.381138 -0.136053 -50.661165 3.404323 -0.911127 -0.867139 \n", - " 2023-12-14 3.397932 -0.000300 10.875799 -0.727942 -0.778248 -0.281908 \n", - " 2023-12-15 -12.245556 -0.004446 -464.890051 25.638658 -0.787214 0.350940 \n", - " 2023-12-18 -32.569598 0.318042 641.622136 -34.998142 -0.522231 0.000000 \n", - " 2023-12-19 25.872986 -0.053905 -195.884149 9.926960 -1.134739 0.480362 \n", - " 2023-12-20 -48.025035 0.014613 26.114136 -2.115130 -0.810883 -0.280212 \n", - " 2023-12-21 -3.390020 0.000132 -21.417093 1.386986 -0.888450 -0.687674 \n", - " 2023-12-22 -24.401521 0.018320 -294.253736 17.280825 -0.873036 -0.068983 \n", - " 2023-12-25 0.000000 0.000000 0.000000 0.000000 -1.522405 0.000000 \n", - " 2023-12-26 -11.269901 0.032696 306.250891 -16.110166 -0.512351 -0.164127 \n", - " 2023-12-27 2.299191 0.000229 -2.783423 0.314838 -0.969682 1.109160 \n", - " 2023-12-28 9.944813 0.004191 -8.655525 0.287734 -0.975363 -0.592358 \n", - " 2023-12-29 -24.123146 0.028312 -186.027968 10.864701 -0.946068 -1.313203 \n", - " 2024-01-01 0.000000 0.000000 0.000000 0.000000 -2.152741 0.000000 \n", - " 2024-01-02 -148.445474 4.890765 166.077245 -9.088758 -0.723507 1.096568 \n", - " 2024-01-03 -30.471870 0.177915 6.291870 -0.322915 -1.108887 0.711644 \n", - " \n", - " Vanna_PnL Dividend_PnL Total_PnL Unexplained_PnL \\\n", - " Datetime \n", - " 2023-11-22 0.102706 0.0 24.920614 0.079386 \n", - " 2023-11-23 0.000000 0.0 -0.890568 0.890568 \n", - " 2023-11-24 -0.142182 0.0 -23.930986 -1.069014 \n", - " 2023-11-27 0.054825 0.0 -12.537994 0.037994 \n", - " 2023-11-28 0.001303 0.0 12.420346 0.079654 \n", - " 2023-11-29 0.006939 0.0 -24.874992 -0.125008 \n", - " 2023-11-30 -0.007431 0.0 12.424430 0.075570 \n", - " 2023-12-01 -0.033414 0.0 24.833719 0.166281 \n", - " 2023-12-04 0.249503 0.0 -37.205651 -0.294349 \n", - " 2023-12-05 -1.647745 0.0 74.486770 0.513230 \n", - " 2023-12-06 -0.186212 0.0 -24.859203 -0.140797 \n", - " 2023-12-07 0.183115 0.0 37.255523 0.244477 \n", - " 2023-12-08 0.383573 0.0 49.830011 0.169989 \n", - " 2023-12-11 -0.191005 0.0 -62.047120 -0.452880 \n", - " 2023-12-12 0.729915 0.0 62.317165 0.182835 \n", - " 2023-12-13 0.348448 0.0 24.558425 0.441575 \n", - " 2023-12-14 -0.000305 0.0 12.485027 0.014973 \n", - " 2023-12-15 1.763823 0.0 -450.173844 0.173844 \n", - " 2023-12-18 -8.840735 0.0 565.009472 -2.509472 \n", - " 2023-12-19 -1.951180 0.0 -162.743666 0.243666 \n", - " 2023-12-20 0.383120 0.0 -24.719390 -0.280610 \n", - " 2023-12-21 0.004172 0.0 -24.991946 -0.008054 \n", - " 2023-12-22 2.223943 0.0 -300.074188 0.074188 \n", - " 2023-12-25 0.000000 0.0 -1.522405 1.522405 \n", - " 2023-12-26 -1.401738 0.0 276.825304 -1.825304 \n", - " 2023-12-27 0.009889 0.0 -0.019799 0.019799 \n", - " 2023-12-28 -0.085086 0.0 -0.071593 0.071593 \n", - " 2023-12-29 1.462981 0.0 -200.054392 0.054392 \n", - " 2024-01-01 0.000000 0.0 -2.152741 2.152741 \n", - " 2024-01-02 -10.689153 0.0 3.117684 -3.117684 \n", - " 2024-01-03 -0.112806 0.0 -24.835049 -0.164951 \n", - " \n", - " Actual_PnL Price \n", - " Datetime \n", - " 2023-11-22 2.500000e+01 925.0 \n", - " 2023-11-23 0.000000e+00 925.0 \n", - " 2023-11-24 -2.500000e+01 900.0 \n", - " 2023-11-27 -1.250000e+01 887.5 \n", - " 2023-11-28 1.250000e+01 900.0 \n", - " 2023-11-29 -2.500000e+01 875.0 \n", - " 2023-11-30 1.250000e+01 887.5 \n", - " 2023-12-01 2.500000e+01 912.5 \n", - " 2023-12-04 -3.750000e+01 875.0 \n", - " 2023-12-05 7.500000e+01 950.0 \n", - " 2023-12-06 -2.500000e+01 925.0 \n", - " 2023-12-07 3.750000e+01 962.5 \n", - " 2023-12-08 5.000000e+01 1012.5 \n", - " 2023-12-11 -6.250000e+01 950.0 \n", - " 2023-12-12 6.250000e+01 1012.5 \n", - " 2023-12-13 2.500000e+01 1037.5 \n", - " 2023-12-14 1.250000e+01 1050.0 \n", - " 2023-12-15 -4.500000e+02 600.0 \n", - " 2023-12-18 5.625000e+02 1162.5 \n", - " 2023-12-19 -1.625000e+02 1000.0 \n", - " 2023-12-20 -2.500000e+01 975.0 \n", - " 2023-12-21 -2.500000e+01 950.0 \n", - " 2023-12-22 -3.000000e+02 650.0 \n", - " 2023-12-25 0.000000e+00 650.0 \n", - " 2023-12-26 2.750000e+02 925.0 \n", - " 2023-12-27 0.000000e+00 925.0 \n", - " 2023-12-28 0.000000e+00 925.0 \n", - " 2023-12-29 -2.000000e+02 725.0 \n", - " 2024-01-01 0.000000e+00 725.0 \n", - " 2024-01-02 -4.263256e-13 725.0 \n", - " 2024-01-03 -2.500000e+01 700.0 ,\n", - " 18: Delta_PnL Gamma_PnL Vega_PnL Volga_PnL Theta_PnL \\\n", - " Datetime \n", - " 2023-12-01 50.266512 1.188622 -38.909393 9.813008 -1.082224 \n", - " 2023-12-04 -15.548284 0.110315 5.544522 -1.640533 -3.249741 \n", - " 2023-12-05 -26.233087 0.324332 0.369515 -0.185779 -1.079572 \n", - " 2023-12-06 -5.326363 0.014157 3.119662 -1.097115 -1.071558 \n", - " 2023-12-07 13.733789 0.094606 2.572239 -0.508568 -1.063305 \n", - " ... ... ... ... ... ... \n", - " 2024-06-24 114.024575 0.929847 3.248296 -1.534412 -4.788298 \n", - " 2024-06-25 -140.257816 1.316131 31.307205 -14.914179 -1.482198 \n", - " 2024-06-26 -81.331292 0.538908 -6.095195 1.390390 -1.697718 \n", - " 2024-06-27 52.630746 0.240325 -30.398888 13.999199 -1.749388 \n", - " 2024-06-28 111.266106 0.978867 -297.454588 141.516630 -1.658658 \n", - " \n", - " Rho_PnL Vanna_PnL Dividend_PnL Total_PnL Unexplained_PnL \\\n", - " Datetime \n", - " 2023-12-01 -0.700043 -0.446756 0.0 20.129725 27.870275 \n", - " 2023-12-04 0.257272 0.017159 0.0 -14.509289 -0.490711 \n", - " 2023-12-05 0.626245 0.027091 0.0 -26.151255 -0.848745 \n", - " 2023-12-06 0.000000 0.014201 0.0 -4.347016 -0.152984 \n", - " 2023-12-07 -0.298818 0.039590 0.0 14.569533 0.430467 \n", - " ... ... ... ... ... ... \n", - " 2024-06-24 -0.193111 -0.081477 0.0 111.605420 2.394580 \n", - " 2024-06-25 0.506905 0.745242 0.0 -122.778709 -3.221291 \n", - " 2024-06-26 0.262975 0.335378 0.0 -86.596553 -1.903447 \n", - " 2024-06-27 -0.256524 0.325523 0.0 34.790993 1.209007 \n", - " 2024-06-28 -0.373226 5.802054 0.0 -39.922815 3.922815 \n", - " \n", - " Actual_PnL Price \n", - " Datetime \n", - " 2023-12-01 48.0 597.0 \n", - " 2023-12-04 -15.0 582.0 \n", - " 2023-12-05 -27.0 555.0 \n", - " 2023-12-06 -4.5 550.5 \n", - " 2023-12-07 15.0 565.5 \n", - " ... ... ... \n", - " 2024-06-24 114.0 1924.5 \n", - " 2024-06-25 -126.0 1798.5 \n", - " 2024-06-26 -88.5 1710.0 \n", - " 2024-06-27 36.0 1746.0 \n", - " 2024-06-28 -36.0 1710.0 \n", - " \n", - " [151 rows x 12 columns],\n", - " 19: Delta_PnL Gamma_PnL Vega_PnL Volga_PnL Theta_PnL Rho_PnL \\\n", - " Datetime \n", - " 2023-12-04 102.232613 2.264506 -691.775631 14.579783 -6.030620 0.575693 \n", - " 2023-12-05 -7.500754 0.037980 971.052904 -11.561403 -0.428492 0.949611 \n", - " 2023-12-06 70.452682 0.664283 -113.478006 1.961735 -2.478059 0.000000 \n", - " 2023-12-07 1.553471 0.000350 572.833486 -16.399185 -2.198315 -0.792627 \n", - " 2023-12-08 10.009723 0.006800 -637.976453 18.162284 -3.420739 0.000000 \n", - " ... ... ... ... ... ... ... \n", - " 2024-04-10 -336.754067 5.896962 62.080735 -1.735811 -1.833633 1.630350 \n", - " 2024-04-11 -97.361331 0.751634 -146.128169 5.155933 -2.461145 -0.344309 \n", - " 2024-04-12 -131.240702 2.036004 239.644679 -6.567272 -2.320989 -0.528520 \n", - " 2024-04-15 -149.229296 2.313454 -154.957415 3.883517 -8.914265 0.534947 \n", - " 2024-04-16 -85.046012 1.130469 -17.867510 -0.209583 -2.697255 -0.300728 \n", - " \n", - " Vanna_PnL Dividend_PnL Total_PnL Unexplained_PnL Actual_PnL \\\n", - " Datetime \n", - " 2023-12-04 -43.796236 0.0 -621.949891 6.949891 -615.0 \n", - " 2023-12-05 -6.588972 0.0 945.960874 -0.960874 945.0 \n", - " 2023-12-06 -4.269686 0.0 -47.147051 2.147051 -45.0 \n", - " 2023-12-07 0.448476 0.0 555.445656 -0.445656 555.0 \n", - " 2023-12-08 -2.310841 0.0 -615.529226 0.529226 -615.0 \n", - " ... ... ... ... ... ... \n", - " 2024-04-10 -6.925944 0.0 -277.641409 -7.358591 -285.0 \n", - " 2024-04-11 2.731612 0.0 -237.655774 -2.344226 -240.0 \n", - " 2024-04-12 -8.313035 0.0 92.710165 -2.710165 90.0 \n", - " 2024-04-15 9.074065 0.0 -297.294994 -2.705006 -300.0 \n", - " 2024-04-16 1.730580 0.0 -103.260040 -1.739960 -105.0 \n", - " \n", - " Price \n", - " Datetime \n", - " 2023-12-04 450.0 \n", - " 2023-12-05 1395.0 \n", - " 2023-12-06 1350.0 \n", - " 2023-12-07 1905.0 \n", - " 2023-12-08 1290.0 \n", - " ... ... \n", - " 2024-04-10 1800.0 \n", - " 2024-04-11 1560.0 \n", - " 2024-04-12 1650.0 \n", - " 2024-04-15 1350.0 \n", - " 2024-04-16 1245.0 \n", - " \n", - " [97 rows x 12 columns],\n", - " 20: Delta_PnL Gamma_PnL Vega_PnL Volga_PnL Theta_PnL Rho_PnL \\\n", - " Datetime \n", - " 2023-12-04 3.565878 0.017790 -0.163417 -0.052793 -0.910739 0.061021 \n", - " 2023-12-05 -2.533333 0.008818 5.398227 -0.165381 -0.299305 0.151823 \n", - " 2023-12-06 9.889913 0.128504 3.003124 -0.176480 -0.313342 0.000000 \n", - " 2023-12-07 1.629031 0.003096 -1.319571 0.070741 -0.310929 -0.078200 \n", - " 2023-12-08 27.517617 0.845582 4.140315 -0.126053 -0.314020 0.000000 \n", - " 2023-12-11 13.576343 0.151921 7.352846 -0.275811 -0.950950 0.000000 \n", - " 2023-12-12 2.284607 0.003583 -12.403720 0.369506 -0.321268 0.132601 \n", - " 2023-12-13 9.182384 0.062952 11.273224 -0.387412 -0.295787 -0.215136 \n", - " 2023-12-14 22.710353 0.302565 0.449122 -0.186505 -0.320976 -0.072877 \n", - " 2023-12-15 34.499069 0.499662 0.799581 -0.160230 -0.296317 0.091889 \n", - " 2023-12-18 -16.818402 0.087763 -5.432833 -0.076198 -0.784984 0.000000 \n", - " 2023-12-19 12.985175 0.062559 4.612849 -0.151275 -0.259321 0.115076 \n", - " 2023-12-20 -13.931649 0.062975 -0.897914 -0.090775 -0.256510 -0.072178 \n", - " 2023-12-21 7.399375 0.019916 8.006293 -0.218534 -0.262703 -0.174992 \n", - " 2023-12-22 -6.865231 0.015054 -24.020609 0.877441 -0.279245 -0.018219 \n", - " 2023-12-25 0.000000 0.000000 0.000000 0.000000 -0.750248 0.000000 \n", - " 2023-12-26 9.790881 0.044074 -8.750508 0.197891 -0.252020 -0.043879 \n", - " 2023-12-27 -2.828116 0.003778 -18.080422 0.800005 -0.224335 0.277140 \n", - " 2023-12-28 -7.054436 0.030541 15.657158 -0.607077 -0.208390 -0.146734 \n", - " 2023-12-29 1.267712 0.000879 48.587575 -1.854126 -0.237015 -0.327394 \n", - " 2024-01-01 0.000000 0.000000 0.000000 0.000000 -0.989971 0.000000 \n", - " 2024-01-02 -40.806266 0.620202 -83.211322 2.681652 -0.332283 0.310401 \n", - " 2024-01-03 -28.586905 0.966761 67.920792 -2.276786 -0.213101 0.168678 \n", - " 2024-01-04 4.234051 0.014472 14.114131 -0.525102 -0.360173 -0.057409 \n", - " 2024-01-05 17.159278 0.190222 -34.664333 1.449921 -0.377769 -0.066686 \n", - " 2024-01-08 -80.529773 6.203958 -1.031297 -0.157030 -0.932857 0.000000 \n", - " 2024-01-09 -10.706483 0.201449 14.381726 -0.422079 -0.318266 0.063381 \n", - " 2024-01-10 7.052425 0.083204 0.660095 -0.062524 -0.353502 -0.031922 \n", - " 2024-01-11 -18.384565 0.544871 -61.419581 1.829086 -0.370757 -0.047122 \n", - " \n", - " Vanna_PnL Dividend_PnL Total_PnL Unexplained_PnL Actual_PnL \\\n", - " Datetime \n", - " 2023-12-04 -0.034675 0.0 2.483065 0.016935 2.5 \n", - " 2023-12-05 -0.054848 0.0 2.506001 -0.006001 2.5 \n", - " 2023-12-06 -0.034261 0.0 12.497459 0.002541 12.5 \n", - " 2023-12-07 0.007627 0.0 0.001793 -0.001793 0.0 \n", - " 2023-12-08 0.436652 0.0 32.500093 -0.000093 32.5 \n", - " 2023-12-11 0.149878 0.0 20.004228 -0.004228 20.0 \n", - " 2023-12-12 -0.078677 0.0 -10.013368 0.013368 -10.0 \n", - " 2023-12-13 0.406836 0.0 20.027062 -0.027062 20.0 \n", - " 2023-12-14 -0.397172 0.0 22.484509 0.015491 22.5 \n", - " 2023-12-15 -0.458003 0.0 34.975651 0.024349 35.0 \n", - " 2023-12-18 0.511877 0.0 -22.512777 0.012777 -22.5 \n", - " 2023-12-19 0.129774 0.0 17.494836 0.005164 17.5 \n", - " 2023-12-20 0.186528 0.0 -14.999523 -0.000477 -15.0 \n", - " 2023-12-21 0.246823 0.0 15.016177 -0.016177 15.0 \n", - " 2023-12-22 0.270915 0.0 -30.019895 0.019895 -30.0 \n", - " 2023-12-25 0.000000 0.0 -0.750248 0.750248 0.0 \n", - " 2023-12-26 -0.256090 0.0 0.730348 -0.730348 0.0 \n", - " 2023-12-27 0.041977 0.0 -20.009974 0.009974 -20.0 \n", - " 2023-12-28 -0.155104 0.0 7.515957 -0.015957 7.5 \n", - " 2023-12-29 0.147531 0.0 47.585162 -0.085162 47.5 \n", - " 2024-01-01 0.000000 0.0 -0.989971 0.989971 0.0 \n", - " 2024-01-02 6.710576 0.0 -114.027040 -0.972960 -115.0 \n", - " 2024-01-03 -5.405307 0.0 32.574132 -0.074132 32.5 \n", - " 2024-01-04 0.090120 0.0 17.510089 -0.010089 17.5 \n", - " 2024-01-05 -1.233529 0.0 -17.542897 0.042897 -17.5 \n", - " 2024-01-08 1.459706 0.0 -74.987293 -0.012707 -75.0 \n", - " 2024-01-09 -0.680633 0.0 2.519095 -0.019095 2.5 \n", - " 2024-01-10 0.163087 0.0 7.510862 -0.010862 7.5 \n", - " 2024-01-11 5.225696 0.0 -72.622372 0.122372 -72.5 \n", - " \n", - " Price \n", - " Datetime \n", - " 2023-12-04 162.5 \n", - " 2023-12-05 165.0 \n", - " 2023-12-06 177.5 \n", - " 2023-12-07 177.5 \n", - " 2023-12-08 210.0 \n", - " 2023-12-11 230.0 \n", - " 2023-12-12 220.0 \n", - " 2023-12-13 240.0 \n", - " 2023-12-14 262.5 \n", - " 2023-12-15 297.5 \n", - " 2023-12-18 275.0 \n", - " 2023-12-19 292.5 \n", - " 2023-12-20 277.5 \n", - " 2023-12-21 292.5 \n", - " 2023-12-22 262.5 \n", - " 2023-12-25 262.5 \n", - " 2023-12-26 262.5 \n", - " 2023-12-27 242.5 \n", - " 2023-12-28 250.0 \n", - " 2023-12-29 297.5 \n", - " 2024-01-01 297.5 \n", - " 2024-01-02 182.5 \n", - " 2024-01-03 215.0 \n", - " 2024-01-04 232.5 \n", - " 2024-01-05 215.0 \n", - " 2024-01-08 140.0 \n", - " 2024-01-09 142.5 \n", - " 2024-01-10 150.0 \n", - " 2024-01-11 77.5 ,\n", - " 21: Delta_PnL Gamma_PnL Vega_PnL Volga_PnL Theta_PnL Rho_PnL \\\n", - " Datetime \n", - " 2024-01-26 2.900838 0.006832 435.931338 -33.469346 -0.565118 0.128080 \n", - " 2024-01-29 32.227500 0.293763 22.260520 -13.342063 -5.300435 0.000000 \n", - " 2024-01-30 -51.047303 0.677793 592.670942 -44.770801 -1.509300 0.105234 \n", - " \n", - " Vanna_PnL Dividend_PnL Total_PnL Unexplained_PnL Actual_PnL \\\n", - " Datetime \n", - " 2024-01-26 1.689120 0.0 406.621743 -0.621743 406.0 \n", - " 2024-01-29 -2.837098 0.0 33.302187 0.697813 34.0 \n", - " 2024-01-30 -25.284695 0.0 470.841869 -0.841869 470.0 \n", - " \n", - " Price \n", - " Datetime \n", - " 2024-01-26 766.0 \n", - " 2024-01-29 800.0 \n", - " 2024-01-30 1270.0 ,\n", - " 22: Delta_PnL Gamma_PnL Vega_PnL Volga_PnL Theta_PnL Rho_PnL \\\n", - " Datetime \n", - " 2024-02-05 -0.0 0.0 -0.0 0.0 -0.0 0.0 \n", - " 2024-02-06 0.0 0.0 0.0 -0.0 -0.0 -0.0 \n", - " 2024-02-07 -0.0 0.0 -0.0 0.0 -0.0 0.0 \n", - " 2024-02-08 -0.0 0.0 0.0 -0.0 -0.0 -0.0 \n", - " 2024-02-09 -0.0 0.0 -0.0 0.0 -0.0 0.0 \n", - " 2024-02-12 0.0 0.0 0.0 -0.0 -0.0 0.0 \n", - " 2024-02-13 -0.0 0.0 -0.0 0.0 -0.0 0.0 \n", - " 2024-02-14 -0.0 0.0 0.0 -0.0 -0.0 -0.0 \n", - " 2024-02-15 0.0 0.0 -0.0 0.0 -0.0 0.0 \n", - " 2024-02-16 0.0 0.0 0.0 -0.0 -0.0 0.0 \n", - " 2024-02-19 0.0 0.0 0.0 0.0 -0.0 0.0 \n", - " 2024-02-20 0.0 0.0 0.0 -0.0 -0.0 -0.0 \n", - " 2024-02-21 -0.0 0.0 0.0 -0.0 -0.0 0.0 \n", - " 2024-02-22 0.0 0.0 -0.0 0.0 -0.0 -0.0 \n", - " 2024-02-23 0.0 -0.0 -0.0 0.0 -0.0 0.0 \n", - " \n", - " Vanna_PnL Dividend_PnL Total_PnL Unexplained_PnL Actual_PnL \\\n", - " Datetime \n", - " 2024-02-05 0.0 0.0 -0.0 -0.0 -0.0 \n", - " 2024-02-06 0.0 0.0 0.0 0.0 0.0 \n", - " 2024-02-07 0.0 0.0 -0.0 -0.0 -0.0 \n", - " 2024-02-08 -0.0 0.0 0.0 -0.0 0.0 \n", - " 2024-02-09 0.0 0.0 -0.0 -0.0 -0.0 \n", - " 2024-02-12 0.0 0.0 0.0 0.0 0.0 \n", - " 2024-02-13 0.0 0.0 -0.0 -0.0 -0.0 \n", - " 2024-02-14 -0.0 0.0 0.0 -0.0 0.0 \n", - " 2024-02-15 -0.0 0.0 -0.0 0.0 -0.0 \n", - " 2024-02-16 0.0 0.0 0.0 0.0 0.0 \n", - " 2024-02-19 0.0 0.0 -0.0 0.0 0.0 \n", - " 2024-02-20 0.0 0.0 0.0 -0.0 0.0 \n", - " 2024-02-21 -0.0 0.0 -0.0 -0.0 -0.0 \n", - " 2024-02-22 0.0 0.0 0.0 0.0 0.0 \n", - " 2024-02-23 -0.0 0.0 -0.0 0.0 -0.0 \n", - " \n", - " Price \n", - " Datetime \n", - " 2024-02-05 0.0 \n", - " 2024-02-06 0.0 \n", - " 2024-02-07 0.0 \n", - " 2024-02-08 0.0 \n", - " 2024-02-09 0.0 \n", - " 2024-02-12 0.0 \n", - " 2024-02-13 0.0 \n", - " 2024-02-14 0.0 \n", - " 2024-02-15 0.0 \n", - " 2024-02-16 0.0 \n", - " 2024-02-19 0.0 \n", - " 2024-02-20 0.0 \n", - " 2024-02-21 0.0 \n", - " 2024-02-22 0.0 \n", - " 2024-02-23 0.0 ,\n", - " 23: Delta_PnL Gamma_PnL Vega_PnL Volga_PnL Theta_PnL Rho_PnL \\\n", - " Datetime \n", - " 2024-02-07 -1.901897 0.005857 18.918535 -1.717357 -0.593649 0.000000 \n", - " 2024-02-08 155.537271 33.469033 -26.135054 2.301540 -0.679210 -0.054626 \n", - " 2024-02-09 -40.058497 1.054953 23.716492 -1.977170 -0.678664 0.032191 \n", - " 2024-02-12 16.291638 0.183259 -32.120141 2.329479 -2.183963 0.122455 \n", - " 2024-02-13 20.558604 0.314664 22.101275 -1.666429 -0.650921 0.074681 \n", - " ... ... ... ... ... ... ... \n", - " 2024-05-09 5.414396 0.047020 -20.233627 1.482720 -0.854003 -0.048546 \n", - " 2024-05-10 -0.142971 0.000036 3.647330 -0.250156 -0.771512 0.027789 \n", - " 2024-05-13 0.580265 0.000586 -0.190946 0.049250 -2.398691 -0.028087 \n", - " 2024-05-14 -6.972214 0.085996 -0.275403 0.034700 -0.811067 -0.046418 \n", - " 2024-05-15 -36.502591 2.485830 -7.764563 0.540716 -0.803757 0.044925 \n", - " \n", - " Vanna_PnL Dividend_PnL Total_PnL Unexplained_PnL Actual_PnL \\\n", - " Datetime \n", - " 2024-02-07 -0.158867 0.0 14.552621 -0.052621 14.5 \n", - " 2024-02-08 -9.022394 0.0 155.416561 0.583439 156.0 \n", - " 2024-02-09 -0.933842 0.0 -18.844538 -0.155462 -19.0 \n", - " 2024-02-12 -0.860283 0.0 -16.237555 0.237555 -16.0 \n", - " 2024-02-13 0.695775 0.0 41.427649 0.072351 41.5 \n", - " ... ... ... ... ... ... \n", - " 2024-05-09 -0.354673 0.0 -14.546713 0.046713 -14.5 \n", - " 2024-05-10 -0.002374 0.0 2.508143 -0.008143 2.5 \n", - " 2024-05-13 0.002084 0.0 -1.985538 -0.014462 -2.0 \n", - " 2024-05-14 -0.003124 0.0 -7.987532 -0.012468 -8.0 \n", - " 2024-05-15 1.048045 0.0 -40.951396 -0.048604 -41.0 \n", - " \n", - " Price \n", - " Datetime \n", - " 2024-02-07 197.0 \n", - " 2024-02-08 353.0 \n", - " 2024-02-09 334.0 \n", - " 2024-02-12 318.0 \n", - " 2024-02-13 359.5 \n", - " ... ... \n", - " 2024-05-09 176.5 \n", - " 2024-05-10 179.0 \n", - " 2024-05-13 177.0 \n", - " 2024-05-14 169.0 \n", - " 2024-05-15 128.0 \n", - " \n", - " [71 rows x 12 columns],\n", - " 24: Delta_PnL Gamma_PnL Vega_PnL Volga_PnL Theta_PnL Rho_PnL \\\n", - " Datetime \n", - " 2024-02-08 -2.706420 -0.001128 3.109621 -0.284317 -0.097481 -0.022281 \n", - " 2024-02-09 18.088112 -0.082336 -2.657908 0.040257 -0.104760 0.008841 \n", - " 2024-02-12 -8.066956 -0.022996 -1.820736 0.015936 -0.218855 0.034163 \n", - " 2024-02-13 -14.107103 -0.037345 4.610616 -0.445057 -0.081867 0.021176 \n", - " 2024-02-14 8.947470 -0.012637 1.130671 0.004030 -0.107335 -0.063030 \n", - " ... ... ... ... ... ... ... \n", - " 2024-06-24 -15.346535 -0.183573 3.423713 -0.408398 0.086789 -0.016303 \n", - " 2024-06-25 3.459283 -0.008090 9.932998 -0.915058 -0.017913 0.043215 \n", - " 2024-06-26 32.685712 -1.000766 -0.801336 -0.274518 -0.030039 0.022825 \n", - " 2024-06-27 17.533270 -0.408484 -6.770947 0.063943 0.053010 -0.020075 \n", - " 2024-06-28 -17.698501 -0.442254 56.187458 -6.761150 0.106751 -0.025778 \n", - " \n", - " Vanna_PnL Dividend_PnL Total_PnL Unexplained_PnL Actual_PnL \\\n", - " Datetime \n", - " 2024-02-08 0.005438 0.0 0.003434 -0.003434 0.0 \n", - " 2024-02-09 -0.310685 0.0 14.981519 0.018481 15.0 \n", - " 2024-02-12 0.099769 0.0 -9.979675 -0.020325 -10.0 \n", - " 2024-02-13 0.053609 0.0 -9.985971 -0.014029 -10.0 \n", - " 2024-02-14 0.095588 0.0 9.994758 0.005242 10.0 \n", - " ... ... ... ... ... ... \n", - " 2024-06-24 0.059433 0.0 -12.384874 -0.115126 -12.5 \n", - " 2024-06-25 0.011844 0.0 12.506279 -0.006279 12.5 \n", - " 2024-06-26 -0.638435 0.0 29.963444 0.036556 30.0 \n", - " 2024-06-27 -0.477605 0.0 9.973112 0.026888 10.0 \n", - " 2024-06-28 1.210116 0.0 32.576642 -0.076642 32.5 \n", - " \n", - " Price \n", - " Datetime \n", - " 2024-02-08 197.5 \n", - " 2024-02-09 212.5 \n", - " 2024-02-12 202.5 \n", - " 2024-02-13 192.5 \n", - " 2024-02-14 202.5 \n", - " ... ... \n", - " 2024-06-24 247.5 \n", - " 2024-06-25 260.0 \n", - " 2024-06-26 290.0 \n", - " 2024-06-27 300.0 \n", - " 2024-06-28 332.5 \n", - " \n", - " [102 rows x 12 columns],\n", - " 25: Delta_PnL Gamma_PnL Vega_PnL Volga_PnL Theta_PnL Rho_PnL \\\n", - " Datetime \n", - " 2024-05-21 20.708971 0.101932 174.208473 -7.317531 -0.801478 0.000000 \n", - " 2024-05-22 -26.589885 0.047097 140.346736 -7.951932 -1.087049 0.150287 \n", - " 2024-05-23 -86.271556 0.327634 -337.305121 8.431093 -1.437172 0.000000 \n", - " 2024-05-24 45.160898 0.784797 -4.824754 0.033355 -0.769541 0.000000 \n", - " 2024-05-27 0.000000 0.000000 0.000000 0.000000 -2.188538 0.000000 \n", - " 2024-05-28 0.148985 0.000007 13.596194 -0.901832 -0.734029 0.074502 \n", - " 2024-05-29 4.458887 0.006221 6.557148 -0.363402 -0.740736 0.049194 \n", - " 2024-05-30 14.947313 0.065453 16.736851 -1.038434 -0.746683 -0.049287 \n", - " 2024-05-31 14.482221 0.051897 -14.465246 0.766792 -0.748723 -0.074115 \n", - " 2024-06-03 26.866454 0.175793 15.408593 -0.710450 -2.173278 -0.049614 \n", - " 2024-06-04 4.964321 0.004934 -88.132628 4.210393 -0.733433 -0.075989 \n", - " 2024-06-05 22.003445 0.148040 80.374618 -3.689330 -0.585253 0.000000 \n", - " 2024-06-06 -21.912738 0.089965 -29.051210 1.354529 -0.711669 -0.180613 \n", - " 2024-06-07 36.800272 0.310112 13.479279 -0.630636 -0.683561 0.125122 \n", - " 2024-06-10 -59.144477 0.702055 -20.875904 1.083193 -2.033335 -0.128380 \n", - " 2024-06-11 212.032091 9.137551 181.692149 -7.945570 -0.701778 0.294534 \n", - " 2024-06-12 102.226285 -1.604479 -375.353569 18.568756 -0.741641 -0.053867 \n", - " 2024-06-13 17.396444 0.027489 205.078810 -12.640432 -0.106055 -0.076323 \n", - " 2024-06-14 -26.533868 -0.065925 7.396584 0.116396 -0.316151 0.000000 \n", - " 2024-06-17 64.885033 -0.415261 0.709823 -1.773241 -1.126740 0.074097 \n", - " 2024-06-18 -34.964052 -0.158176 -207.946886 11.529611 -0.260479 -0.181905 \n", - " 2024-06-19 0.000000 0.000000 0.000000 0.000000 -0.049226 0.000000 \n", - " 2024-06-20 -63.963816 0.354023 189.755862 -10.123897 -0.050100 -0.228113 \n", - " 2024-06-21 -32.884786 -0.025127 164.963777 -8.797176 -0.396790 -0.234012 \n", - " 2024-06-24 10.538579 -0.013766 -63.406943 4.580432 -2.027177 -0.121457 \n", - " 2024-06-25 15.421689 -0.019684 -309.085516 15.792455 -0.617328 0.330789 \n", - " 2024-06-26 60.610592 0.606751 218.880227 -12.840489 -0.160958 0.167967 \n", - " 2024-06-27 12.917685 -0.014343 -2.298716 -0.077926 -0.345674 -0.163355 \n", - " 2024-06-28 -52.507854 -0.211496 -28.696826 1.217923 -0.321611 -0.230723 \n", - " \n", - " Vanna_PnL Dividend_PnL Total_PnL Unexplained_PnL \\\n", - " Datetime \n", - " 2024-05-21 3.155434 0.0 190.055799 -0.055799 \n", - " 2024-05-22 -4.563756 0.0 100.351498 -0.351498 \n", - " 2024-05-23 26.112558 0.0 -390.142565 0.142565 \n", - " 2024-05-24 -0.655059 0.0 39.729696 0.270304 \n", - " 2024-05-27 0.000000 0.0 -2.188538 2.188538 \n", - " 2024-05-28 -0.000320 0.0 12.183509 -2.183509 \n", - " 2024-05-29 0.009839 0.0 9.977151 0.022849 \n", - " 2024-05-30 0.003905 0.0 29.919119 0.080881 \n", - " 2024-05-31 -0.108502 0.0 -0.095675 0.095675 \n", - " 2024-06-03 0.344522 0.0 39.862019 0.137981 \n", - " 2024-06-04 -0.347042 0.0 -80.109444 0.109444 \n", - " 2024-06-05 1.681776 0.0 99.933297 0.066703 \n", - " 2024-06-06 0.508136 0.0 -49.903600 -0.096400 \n", - " 2024-06-07 0.386503 0.0 49.787090 0.212910 \n", - " 2024-06-10 0.749189 0.0 -79.647659 -0.352341 \n", - " 2024-06-11 24.221753 0.0 418.730729 1.269271 \n", - " 2024-06-12 -13.688668 0.0 -270.647183 0.647183 \n", - " 2024-06-13 0.320530 0.0 210.000463 -0.000463 \n", - " 2024-06-14 -0.461392 0.0 -19.864355 -0.135645 \n", - " 2024-06-17 -2.868191 0.0 59.485521 0.514479 \n", - " 2024-06-18 2.132796 0.0 -229.849091 -0.150909 \n", - " 2024-06-19 0.000000 0.0 -0.049226 0.049226 \n", - " 2024-06-20 -5.258714 0.0 110.485245 -0.485245 \n", - " 2024-06-21 -2.380092 0.0 120.245794 -0.245794 \n", - " 2024-06-24 0.218111 0.0 -50.232221 0.232221 \n", - " 2024-06-25 -1.971004 0.0 -280.148600 0.148600 \n", - " 2024-06-26 2.476546 0.0 269.740636 0.259364 \n", - " 2024-06-27 -0.082909 0.0 9.934762 0.065238 \n", - " 2024-06-28 1.046270 0.0 -79.704318 -0.295682 \n", - " \n", - " Actual_PnL Price \n", - " Datetime \n", - " 2024-05-21 1.900000e+02 750.0 \n", - " 2024-05-22 1.000000e+02 850.0 \n", - " 2024-05-23 -3.900000e+02 460.0 \n", - " 2024-05-24 4.000000e+01 500.0 \n", - " 2024-05-27 0.000000e+00 500.0 \n", - " 2024-05-28 1.000000e+01 510.0 \n", - " 2024-05-29 1.000000e+01 520.0 \n", - " 2024-05-30 3.000000e+01 550.0 \n", - " 2024-05-31 3.552714e-13 550.0 \n", - " 2024-06-03 4.000000e+01 590.0 \n", - " 2024-06-04 -8.000000e+01 510.0 \n", - " 2024-06-05 1.000000e+02 610.0 \n", - " 2024-06-06 -5.000000e+01 560.0 \n", - " 2024-06-07 5.000000e+01 610.0 \n", - " 2024-06-10 -8.000000e+01 530.0 \n", - " 2024-06-11 4.200000e+02 950.0 \n", - " 2024-06-12 -2.700000e+02 680.0 \n", - " 2024-06-13 2.100000e+02 890.0 \n", - " 2024-06-14 -2.000000e+01 870.0 \n", - " 2024-06-17 6.000000e+01 930.0 \n", - " 2024-06-18 -2.300000e+02 700.0 \n", - " 2024-06-19 0.000000e+00 700.0 \n", - " 2024-06-20 1.100000e+02 810.0 \n", - " 2024-06-21 1.200000e+02 930.0 \n", - " 2024-06-24 -5.000000e+01 880.0 \n", - " 2024-06-25 -2.800000e+02 600.0 \n", - " 2024-06-26 2.700000e+02 870.0 \n", - " 2024-06-27 1.000000e+01 880.0 \n", - " 2024-06-28 -8.000000e+01 800.0 }" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "stored_data['attribution']" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Ticker AAPL\n", - "PnL 1.565517\n", - "EntryPrice 200.443306\n", - "ExitPrice 200.704226\n", - "ReturnPct 0.130171\n", - "Quantity 6\n", - "EntryTime 2023-07-05\n", - "ExitTime 2023-08-04\n", - "Duration 30\n", - "Positions &L:AAPL20240621C230&S:AAPL20240621C240\n", - "Structure CallVertical(AAPL, Build On: 2023-07-05 16:00:00)\n", - "Name: 1, dtype: object" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "Delta_PnL -75.82\n", - "Gamma_PnL 18.53\n", - "Vega_PnL 57.12\n", - "Volga_PnL -9.61\n", - "Theta_PnL -90.81\n", - "Rho_PnL 8.31\n", - "Vanna_PnL 5.73\n", - "Dividend_PnL 0.00\n", - "Total_PnL -86.56\n", - "Unexplained_PnL -3.44\n", - "Actual_PnL -90.00\n", - "Price 27615.00\n", - "dtype: float64" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ind = 1\n", - "display(trades.loc[ind, :])\n", - "(stored_data['attribution'][ind].sum()).round(2)" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "pnl_sample = stored_data['attribution'][ind].copy()\n", - "greeks_sample = stored_data['greek'][ind].copy()\n", - "failed = []" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "-412.5000000000062 0\n", - "824.9999999999922 0\n", - "-412.50000000000614 0\n", - "\n", - "\n", - "-90.00000000000026 1\n", - "899.9999999999922 1\n", - "-502.5000000000066 1\n", - "\n", - "\n", - "-192.5 2\n", - "1407.4999999999884 2\n", - "-695.0000000000066 2\n", - "\n", - "\n", - "-43.99999999999986 3\n", - "1429.9999999999884 3\n", - "-739.000000000006 3\n", - "\n", - "\n", - "25109.99999999994 4\n", - "5557.499999999992 4\n", - "24370.999999999927 4\n", - "\n", - "\n", - "-52.499999999999964 5\n", - "5557.499999999992 5\n", - "24318.499999999927 5\n", - "\n", - "\n", - "0.0 6\n", - "5557.499999999992 6\n", - "24318.499999999927 6\n", - "\n", - "\n", - "-180.00000000000068 7\n", - "5557.499999999992 7\n", - "24138.499999999927 7\n", - "\n", - "\n", - "-270.00000000000006 8\n", - "5557.499999999992 8\n", - "23868.499999999927 8\n", - "\n", - "\n", - "0.0 9\n", - "5557.499999999992 9\n", - "23868.499999999927 9\n", - "\n", - "\n", - "257.5000000000002 10\n", - "5657.499999999992 10\n", - "24125.99999999993 10\n", - "\n", - "\n", - "1062.500000000004 11\n", - "5407.499999999992 11\n", - "25188.499999999938 11\n", - "\n", - "\n", - "-237.5000000000003 12\n", - "5407.499999999992 12\n", - "24950.999999999935 12\n", - "\n", - "\n", - "445.00000000000136 13\n", - "5832.499999999992 13\n", - "25395.99999999993 13\n", - "\n", - "\n", - "0.0 14\n", - "5832.499999999992 14\n", - "25395.99999999993 14\n", - "\n", - "\n", - "0.0 15\n", - "5832.499999999992 15\n", - "25395.99999999993 15\n", - "\n", - "\n", - "-79.00000000000001 16\n", - "5832.499999999992 16\n", - "25316.99999999993 16\n", - "\n", - "\n", - "-199.99999999999957 17\n", - "5832.499999999992 17\n", - "25116.999999999935 17\n", - "\n", - "\n", - "1161.0 18\n", - "5811.499999999992 18\n", - "26277.999999999935 18\n", - "\n", - "\n", - "179.99999999999955 19\n", - "6906.499999999991 19\n", - "26457.99999999994 19\n", - "\n", - "\n", - "-82.49999999999999 20\n", - "6906.499999999991 20\n", - "26375.49999999994 20\n", - "\n", - "\n", - "909.9999999999998 21\n", - "6906.499999999991 21\n", - "27285.49999999994 21\n", - "\n", - "\n", - "0.0 22\n", - "6906.499999999991 22\n", - "27285.49999999994 22\n", - "\n", - "\n", - "-54.49999999999992 23\n", - "6890.499999999991 23\n", - "27230.99999999994 23\n", - "\n", - "\n", - "135.00000000000028 24\n", - "6915.499999999992 24\n", - "27365.999999999938 24\n", - "\n", - "\n", - "239.99999999999955 25\n", - "6915.499999999992 25\n", - "27605.999999999938 25\n", - "\n", - "\n", - "0 greeks\n", - "20.80248409601637 0\n", - "20.80248409601637 0\n", - "0.0 0\n", - "\n", - "\n", - "1 greeks\n", - "48.17251451137761 1\n", - "67.99922944524361 1\n", - "0.0 1\n", - "\n", - "\n", - "2 greeks\n", - "17.52148174883672 2\n", - "83.80879230755589 2\n", - "0.0 2\n", - "\n", - "\n", - "3 greeks\n", - "8.581424511211466 3\n", - "91.16264864382995 3\n", - "0.0 3\n", - "\n", - "\n", - "4 greeks\n", - "60.93584441451583 4\n", - "112.95052784576765 4\n", - "-891.8262259882681 4\n", - "\n", - "\n", - "5 greeks\n", - "4.2819450888842425 5\n", - "112.95052784576765 5\n", - "-891.8262259882681 5\n", - "\n", - "\n", - "6 greeks\n", - "0.0 6\n", - "112.95052784576765 6\n", - "-891.8262259882681 6\n", - "\n", - "\n", - "7 greeks\n", - "28.49992326840578 7\n", - "112.95052784576765 7\n", - "-891.8262259882681 7\n", - "\n", - "\n", - "8 greeks\n", - "60.82098245583811 8\n", - "114.22897774350903 8\n", - "-891.8262259882681 8\n", - "\n", - "\n", - "9 greeks\n", - "0.0 9\n", - "114.22897774350903 9\n", - "-891.8262259882681 9\n", - "\n", - "\n", - "10 greeks\n", - "5.499922086302789 10\n", - "114.22897774350903 10\n", - "-891.2495928532849 10\n", - "\n", - "\n", - "11 greeks\n", - "12.360306548053757 11\n", - "114.22897774350903 11\n", - "-880.5762822078477 11\n", - "\n", - "\n", - "12 greeks\n", - "36.84385971525206 12\n", - "114.22897774350903 12\n", - "-880.5762822078477 12\n", - "\n", - "\n", - "13 greeks\n", - "33.242122533483354 13\n", - "114.22897774350903 13\n", - "-848.3737393490287 13\n", - "\n", - "\n", - "14 greeks\n", - "0.0 14\n", - "114.22897774350903 14\n", - "-848.3737393490287 14\n", - "\n", - "\n", - "15 greeks\n", - "0.0 15\n", - "114.22897774350903 15\n", - "-848.3737393490287 15\n", - "\n", - "\n", - "16 greeks\n", - "11.935368722815198 16\n", - "114.22897774350903 16\n", - "-848.3737393490287 16\n", - "\n", - "\n", - "17 greeks\n", - "24.628510836510742 17\n", - "118.42593119994693 17\n", - "-848.3737393490287 17\n", - "\n", - "\n", - "18 greeks\n", - "230.76879073117397 18\n", - "308.97820395066253 18\n", - "-626.7830857248391 18\n", - "\n", - "\n", - "19 greeks\n", - "33.378135260520025 19\n", - "308.97820395066253 19\n", - "-626.7830857248391 19\n", - "\n", - "\n", - "20 greeks\n", - "4.5712145054288555 20\n", - "308.97820395066253 20\n", - "-626.7830857248391 20\n", - "\n", - "\n", - "21 greeks\n", - "41.97758763584858 21\n", - "308.97820395066253 21\n", - "-626.7830857248391 21\n", - "\n", - "\n", - "22 greeks\n", - "0.0 22\n", - "308.97820395066253 22\n", - "-626.7830857248391 22\n", - "\n", - "\n", - "23 greeks\n", - "23.278505406265637 23\n", - "325.77961294736696 23\n", - "-626.7830857248391 23\n", - "\n", - "\n", - "24 greeks\n", - "4.608833352541808 24\n", - "329.52254495339037 24\n", - "-622.3437488991913 24\n", - "\n", - "\n", - "25 greeks\n", - "21.453592693116974 25\n", - "334.74462131463076 25\n", - "-607.4026352165241 25\n", - "\n", - "\n" - ] - } - ], - "source": [ - "attribution = pd.DataFrame(index = date_range,\n", - "\n", - " data = {x: [0] * len(date_range) for x in pnl_sample.columns})\n", - "pt_greeks = pd.DataFrame(index = date_range,\n", - " data = {x: [0] * len(date_range) for x in greeks_sample.columns})\n", - "\n", - "for index, pnl in stored_data['attribution'].items():\n", - " if not isinstance(pnl, pd.DataFrame):\n", - " print(f\"{index} failed\")\n", - " failed.append(index)\n", - " continue\n", - " pnl_copy = pnl.copy()\n", - " days_mask = attribution.index.isin(pnl.index)\n", - " attribution.loc[days_mask, :] += pnl\n", - " attribution.fillna(0, inplace=True)\n", - " print(pnl_copy.Actual_PnL.sum(), index)\n", - " print(attribution.Actual_PnL.max(), index)\n", - " print(attribution.Actual_PnL.sum(), index)\n", - " print(\"\\n\")\n", - " \n", - "for index, greeks in stored_data['greek'].items():\n", - " greeks_copy = greeks.copy()\n", - " days_mask = pt_greeks.index.isin(greeks.index)\n", - " pt_greeks.loc[days_mask, :] += greeks\n", - " pt_greeks.fillna(0, inplace=True)\n", - " print(f\"{index} greeks\")\n", - " print(greeks_copy.Midpoint_delta.max(), index)\n", - " print(pt_greeks.Midpoint_delta.max(), index)\n", - " print(pt_greeks.Midpoint_delta.min(), index)\n", - " print(\"\\n\")" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[]" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "failed" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(27888.826867781576, 27605.999999999938)" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "trades.PnL.sum(), attribution.Actual_PnL.sum()" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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9tln8Xg8VFdX8/XXX/Pggw/y0Ucf8fe//x2TKXie9ujoaJYvX46qqmzatIk777yTiooK/vGPfwx0aEIIcVhwePQvwOFGqXvsTc5IN2maRptbPfQ/rs7X9XS6covFQnJyMqmpqYwbN47bbruNV199lX//+98sWbIEgIaGBu6++27GjRvHEUccweWXX87GjRu7PN78+fN55513+Oyzz/yVm5UrVwLwyCOPcNJJJzF8+HCOP/54nn766R4tVqooCsnJyaSkpHDaaacxY8YMvvvuO+x2O4sXL2bUqFF88803TJ48mdzcXK655hoqKip6dD6EEGIwa3PpnyHhZvnI31vwlASCnMOjMX1x4YDc9+LpeYSbDm72zpNOOonRo0fzySefcPXVV/O73/2O8PBw3nzzTaKjo3nzzTeZPn063333HXFxcQG3vfnmm9m6dSvNzc08++yzQPsSGFFRUTz33HOkpKSwefNmZs+eTVRUFDNnzuxVnOHh4aiqisejl2/tdjsvvvgif/7znzEYDNx66608+uijLFiwoPcnQwghBhG721sJMkkStDdJggaRESNGsHnzZn744QfWrl3LunXrCAsLA+DBBx/ks88+46OPPuLaa68NuF1kZCTh4eE4nU6Sk5MDtt15553+ys/QoUMpKipi2bJlvUqCioqKeOONN8jPzycqKgoAl8vFU089RVZWFgA33HADzz//fI+PLYQQg5XDnwQNjqUwekKSoG4KMyosnp53yO/HbDLjcgc2J4UZ++aFq2kaiqKwadMmWlpaGDt2bMD2trY2du3a1aNjvvfee/ztb39j165dtLS04PF4/AlMdzQ2NpKbm4uqqjgcDo499lieeeYZ/3ar1epPgACGDBnSo47TQggx2EklaN8kCeomRVH6JYs2mw0YD1FXrW3btjF06FBaWlpITk5m6dKlnfaJjY3t9vHWrFnD73//e+666y6mTJlCdHQ0y5Yt429/+1u3jxEVFcWnn36KwWAgOTkZq9UasN1sDhzOqShKj/tICSHEYNYmSdA+SRI0SKxYsYLNmzdz0003kZqaSlVVFSaTiaFDh3br9haLxd9Px2fNmjVkZGQwa9Ys/3V79uzpUVwGg4Hs7Owe3UYIIUT3tbkkCdoXSYIOQ06nk8rKyoAh8gsWLOD000/nsssuw2AwcPTRRzNjxgzmzp1LTk4O5eXlfPXVV5x99tnk5+d3OmZGRgbffPMN27ZtIz4+nujoaHJyctizZw/Lli0jPz+fr776ik8++aTfH29bWxsFBQUB10VFRQU0owkhxGDV5pbRYfsiSdBh6Ouvv2bChAmYTCZiY2MZPXo0jz76KJdffjkGg/5P8MYbbzBv3jzuvPNOampqSEpK4rjjjiMxMbHLY15zzTWsWrWKc845h5aWFt555x3OPPNMfve733H//ffjdDqZOnUqt99+u38EWX8pKipi2rRpAdeddNJJLF68uF/jEEKIYORrDrNKJagTRZMOFlRVVXU5t01jYyMxMf27zorZbO7RPDsDLRTiPVQx9uXrQ1EUUlNTKSsrC+o+T6EQZyjE2FGwxxvs8UFoxAgDF+fvlm2nvNnFU2cOY1RSRLdvF8zn1Ww2k5SUdNDHkbRQCCGEOIxJJWjfpDlMHDKnnnoqJSUlXW6bN28el1xyST9HJIQQg4+MDts3SYLEIfPGG2/ssxmqL8qYQggh9k/VtPaO0ZIEdSJJkDhkMjIyBjoEIYQY1Jye9r48MjqsMzkjQgghxGHKN0eQAlj6aPWBw4kkQUIIIcRhyrdkRpjJgEGRJGhvkgQJIYQQhylZPHX/JAkSQgghDlOyeOr+yVkRQgghDlO+kWFW6RTdJTkrQgghxGHKN0dQmFE+7rsiZ+UwVVlZyYMPPsiJJ55ITk4O+fn5XHjhhbz++uvY7faBDq/P3X777aSnp5Oenk5WVhYnnngizz33HG63u9vHuOyyy3jwwQcPYZRCCNG//CvISyWoSz2aJ+jdd9/lhx9+YM+ePVgsFvLy8rj22mtJS0vz7/PHP/6RTZs2Bdzu9NNP57e//a3/cnV1NS+//DIbN24kPDycyZMnc/XVV2M0Gv37bNy4kUWLFlFcXExCQgKXXnopU6ZMCTjup59+ygcffEB9fT2ZmZnMmDGDESNG9OQhHZZ27drFRRddRExMDPfccw+jRo3CYrHwyy+/8Oabb5KamsqZZ5450GH2uVNPPZVnn30Wp9PJV199xf3334/JZOLOO+8c6NCEEGJAtC+ZIR2ju9Kj1HDTpk1MmzaNxx9/nLlz5+LxeHjsscdoa2sL2G/q1Kn87W9/8/9ce+21/m2qqvLkk0/idrt57LHHuOWWW/jmm28CVvyurKzkqaeeYsyYMTz99NOce+65vPjii6xdu9a/z8qVK1m0aBGXXXYZ8+bNIzMzk8cff5yGhoZenor90zQNt3tgfnq6cN19992H0Wjkk08+4YILLiA3N5fMzEymTZvGG2+8wRlnnAHASy+9xNSpUxkxYgQTJ07k3nvvpaWlxX+cxYsXM2rUKL744gtOPvlkhg8fzk033YTdbmfJkiVMmjSJ3NxcHnjgATwej/92kyZN4vnnn+e2224jNzeXY489ls8//5yamhp+/etfk5uby+mnn866dev8t6mtrWXmzJkcffTRDB8+nKlTp/Lee+/16HFbLBaSk5PJyMjg+uuv5+STT+bzzz8H9ErRjBkzePHFF5kwYQJjxozhvvvuC/rFX4UQ4mB0HCIvOutRJej+++8PuHzLLbdw4403UlRUxOjRo/3Xh4WFYbPZujzGunXrKCkp4YEHHsBms5GVlcX06dN56623uOKKKzCZTHz++eckJydz3XXXAfrMw7/88gsfffQR48ePB+DDDz9k6tSpnHrqqQDcdNNN/PTTT3z99ddcdNFFPXlY3eLxwCf/OjQJ1oGcfWkspm4+U7W1tXz77bfMmTOHiIiuVwtWvHNFGAwGHnnkEYYNG8auXbu47777eOyxx3jyySf9+9rtdl599VVeeOEFmpubufHGG/nNb35DTEwMb7zxBnv27GHGjBlMnDiRCy+80H+7l19+mTlz5nD77bfz8ssvc9tttzFx4kSmT5/O3LlzeeKJJ5g1axZff/01iqLgcDg48sgjmTlzJtHR0Xz11VfcdtttZGZmMmHChF6dt/DwcOrq6vyXV65cSXJyMu+88w47duzg97//PWPGjOGaa67p1fGFECLYOWTx1P06qGUzWltbAYiKigq4/rvvvuO7777DZrNx9NFHc+mllxIWFgZAYWEhw4YNC0iSxo8fzyuvvEJxcTHZ2dls3bqVcePGBRwzPz+f1157DQC3201RUVFAsmMwGBg3bhyFhYX7jNflcgV881cUBavViqIo/sQg1O3cuRNN0xg+fHjA9WPHjsXhcABwww03cP/993PTTTf5tw8dOpTZs2czZ86cgCTI5XLx5JNPkpWVBcC5557Lv/71L9atW0dkZCRjxozhhBNOYOXKlQFJ0GmnncavfvUrAO644w4WLVpEfn4+559/PgAzZ87kggsuoKqqiuTkZFJTU7n55pv9t58xYwbffPMNH3zwQY+TIE3T+O677/j222/59a9/7b8+NjaWxx9/HKPRyIgRI5g6dSorVqw4qCSor143vuME++swFOIMhRg7CvZ4gz0+CI0YYWDi9K8bZjb0+H6D+bz2VUy9ToJUVeW1117jiCOOYNiwYf7rTzrpJBITE4mPj2fXrl289dZblJaWcvfddwNQX1/fqUoUGxvr3+b77buu4z52ux2n00lzczOqqnY6js1mo7S0dJ8xv/vuuyxdutR/OTs7m3nz5pGYmNjl/na7HbPZDIDJpHHBlV3vd6gZjd1/wk3ekpHRaPTHDvDZZ5+hqiozZ87E7XZjNpv59ttv+fOf/8zWrVtpamrC4/HQ1taGy+UiIiICk8lEREQEubm5/uMMGTKkUxKbnJxMbW2t//4URWHs2LH+y74+Yx2vS01NBfTnOj09HY/Hw/PPP8/7779PWVkZTqcTp9NJZGRkwOPYF4PBwJdffklubi5utxtVVbnkkku45557/NtHjhxJeHi4/zapqals3rw5IO69z9v+WCwW/+PoKykpKX16vEMlFOIMhRg7CvZ4gz0+CI0YoX/jNFj0FowkW2yv369C5bz2Rq+ToIULF1JcXMwjjzwScP3pp5/u/3vYsGHExcXxyCOPUF5ePuAn8uKLL+a8887zX/YlFtXV1V32DXE6nf3eZ8RsNne6zx4McCIjIwNFUSgsLAzo/Jyeng7oTZUej4eioiKuvfZafvWrX/GHP/wBm83G6tWrueuuu2htbcVsNuN2uzGZTAHxaJqG0Wj0X2c2m9E0DY/H479O0zQMBkOnx6Eoiv86Xx8i3zlesGABf/vb33j44YcZOXIkERERPPTQQzgcjm49B6qqcsIJJ/Dkk09isVgYMmSIPyH0be8Yt++6vePuePlAnE4nZWVl3dr3QBRFISUlhfLy8h73AetPoRBnKMTYUbDHG+zxQWjECAMTZ21jMwCutpYev18F83k1m837LGD0RK+SoIULF/LTTz/x8MMPk5CQsN99faO1fEmQzWZj27ZtAfv4OjP7qgs2m61TB+eGhgasVisWi4WYmBgMBoO/cuTTVZWpI7PZ3OW3fE3reefjYBUfH88pp5zC3//+d2bMmLHPfkHr169HVVUeeughDAa9rfiDDz7oz1ADrF69mmnTpnHppZcCeoJSVFREXl5et48RERFBdnb2oQqxS339ugmV12IoxBkKMXYU7PEGe3wQGjFC/8Zpd7Uvm9Hb+wzG89pX8fSop5SmaSxcuJAffviBBx98kOTk5APeZufOnQDExcUBkJeXx+7duwOSnPXr12O1WsnIyAAgNzeXDRs2BBxn/fr1/g9Ek8lETk4OBQUF/u2qqlJQUNCjD83D1RNPPIHH4+Hss89m2bJlbN26lW3btvGvf/2Lbdu2YTQaycrKwuVy8eqrr7Jr1y6WLl3KG2+8MWAxZ2dns3z5clavXs3WrVu55557qK6u7vc4amtrKSgoCPipqqrq9ziEEKIvtMmyGfvVo0rQwoULWbFiBbNnz8ZqtforMREREVgsFsrLy1mxYgVHHXUUUVFR7N69m9dff51Ro0aRmZkJ6B2cMzIyWLBgAddccw319fW8/fbbTJs2zV+lOfPMM/nss8948803OfXUUykoKGDVqlXMmTPHH8t5553HX/7yF3JychgxYgQff/wxDoej01xCg1FWVhafffYZ//u//8tTTz1FWVmZf16nm2++meuvvx6r1cpDDz3EX//6V5588kmOO+447r33XmbNmjUgMc+aNYvdu3dzzTXXYLVaueaaa5g2bRpNTU39Gse7777Lu+++G3DdH/7wB26//fZ+jUMIIfqCv2O0JEFdUrQe1JSuuOKKLq+fOXMmU6ZMobq6mv/93/+luLgYh8NBQkICxx57LJdccklAs0xVVRWvvPIKGzduJCwsjMmTJ3PNNdd0mizx9ddfp6SkZL+TJb7//vvU19eTlZXln4Omp6qqqrrsB9LY2EhMTEyPj3cwuuoTFMxCId5DFWNfvj4URSE1NZWysrKgKzt3FApxhkKMHQV7vMEeH4RGjDAwcd720Q521Tt4+LShjE+N7NFtg/m8ms1mkpKSDvo4PaoELVmyZL/bExMTefjhhw94nKSkJO6999797uObKHF/zjrrLM4666wD3p8QQggxGPlnjJZlM7p0UPMECdEf9uzZs99mzm+++cY/+k0IIUS79gVUg2+un2AgSZAIekOGDPEvf7Gv7UIIITrzLaAqlaCuSRIkgp7JZOr3oe9CCBHqPKqGwyMdo/dHzooQQghxGHJ4VP/fkgR1Tc6KEEIIcRhyeIfHK4BF+gR1SZIgIYQQ4jDUcaLEYFwENRhInyAhhBDiMPOfXY1Uterzo4WbJAHaF0mChBBCiMPImj3NPL2i1H85XEaG7ZOcmUFm5cqVpKend1qgVgghxOHhXxtrAi7HhBn3saeQJOgwkp6evt+f+fPn9+l9ffrpp312PIDLLrvMH2tOTg5Tpkzhtdde69ExJk2axMsvv9yncQkhRKjYVNnKpio7JoPCn87JYsZRyfx2YspAhxW0pDnsMPLzzz/7/37//ff5n//5H5YvX+6/LjIyknXr1g1EaN12zTXXcPfdd2O321m6dCn3338/NpuNiy66aKBDE0KIoPd/m/Qq0KnZMWTFhZMVFz7AEQU3qQR1k6ZpuFyuAfnp7sJ1ycnJ/p/o6GgURQm4LjKyffG89evXc/bZZzN8+HAuuOACtm3bFnCszz77jGnTppGTk8Pxxx/Ps88+i9vtBvRqC8BvfvMbkpOT/Zd37tzJr3/9a/Lz88nNzeWcc84JSMK6Izw8nOTkZDIzM7nrrrvIzs72zxZ92WWX8cADD/DYY48xZswYxo8f36fVLSGECGU1rS5W72lBAS4enTDQ4YQEqQR1k9vt5oUXXhiQ+/7973+P2Wzu02POmzePBx98kISEBObMmcNdd93FsmXLAPj++++ZNWsWjzzyCJMmTWLXrl3Mnj0bgDvvvJOPP/6YI488kmeffZYzzjjDn6S1tLRw2mmncc8992CxWFi6dCm//vWvWb58ea/X9goPDw9YAf6dd97ht7/9LR988AE//vgjd9xxB8cccwynnHLKQZ4RIYQIbTvqHAAMjbWQHmMZ4GhCg1SCBql77rmH448/nry8PG655RbWrFlDW1sbAM8++yy33HILV1xxBZmZmZxyyin84Q9/4M033wQgIUH/hhEbG8uQIUP8l8eMGcOvfvUrRo4cSU5ODrNnzyYzM3O/637ti8fj4V//+hebN2/mxBNP9F8/atQo7rzzTnJycrj88svJz89nxYoVB3s6hBAi5O2s15OgLJs0gXWXVIK6yWQy8fvf//6Q34/ZbA6ofPjuu6+NHj3a/7dvAdKamhrS09PZtGkTa9as4c9//rN/H1VVaWtrw263Y7VauzxmS0sL8+fP56uvvqKyshK3201bWxt79uzpdlyLFi3in//8Jy6XC6PRyE033cR1113n3z5q1KiA/ZOTk6muru728YUQ4nDhUTXq29xEmI1YzQZ2eZOgTFvYAEcWOiQJ6iZFUfq8Saor/XEf0HVipar67KKtra3cddddnH322Z32CQvb9z/XI488wnfffccDDzxAVlYW4eHh/Pa3v8XpdHY7rosvvpjbbruN8PBwhgwZgsEQWKzcO25FUfxxCyHEYPH3nyr5cEstblUfAv/CBTns8jaHZcVJEtRdkgSJTsaOHcv27dv3u3K72WzG4/EEXLdmzRouv/xyf/LU0tJCSUlJj+47OjpaVowXQogD+GJbPd5VMWh0ePihpJmSRqkE9ZQkQaKTO+64g+uvv5709HTOPfdcDAYDmzZt4pdffuGee+4BICMjgxUrVnD88cdjMBiw2WxkZ2fzySefcMYZZ6AoCs8888yAVGnKy8spKCjwXzaZTKSkpGCz2fo9FiGE6GttbpUWl/7eeuaIWD7f1sCyzbV4NIg0G0iMkI/27pKO0aKTKVOm8Prrr/Ptt99yzjnncP755/Pyyy+TkZHh3+fBBx9k+fLlTJgwgWnTpgHw0EMPERsby4UXXsgNN9zAlClTGDduXL/H/+KLLzJt2jT/z9SpU/nqq6/6PQ4hhDgU6uz6dCXhJoXJWbFAe6foTFuYLJbaA4rW3UloDmNVVVWdOiMDNDY2EhMT06+xdNUxOpiFQryHKsa+fH0oikJqaiplZWXdnhdqIIRCnKEQY0fBHu9AxLekoJrvdjbS5tYYmWjlzhNT9/vBHuzn0Kev4txY0cp9X+4mLdrM/56Xw3VLt/orQ2fn2rj52L6ZITqYz6vZbCYpKemgjyOVICGEEEHD4Vb55/pqdjc4qWxxsXxXI3uauj+4YjCo8VaC4q0mTAaF8antE+FKf6CekYZD0S++//57rr322n1u37p1az9GI4QIVkW1baga2MKNxFtNFNU52FbTRkaMfLj71PmTIH008cT0KP6zuwmQkWE9JUmQ6BdHHnlkryZNFEIMLoU1+qStRyRaSYo060lQbRtTsmMHOLLgUetLgrwdoI9Oi8RkUDAoUgnqKUmCRL+wWq0y9F0IcUCFNXYAchPCSYzQKx3bvYmR0NW2tjeHAcSGm3hk6lAAIszGAYsrFEkSJIQQImhs9SY8eYlW/4f89to2PKqG0SCjngBq7fpAjzhr+0f4mOSIgQonpEnHaCGEEEGhoc1NRbP+AT8iPpy0aAvhJgWHR2NPo3SO9vE1hyVYpY5xsCQJEkIIERR8VaCMGAuRFiNGg0JOnL4Y6LZaaRID0DStU58g0XuSBAkhhAgKWzv0B/IZkSBJUEd2t0qbW5+zJ04qQQdNkiAhhBBBwVcJyk2w+q8bEe9NgqRzNNDeKTrSbCDcJB/hB0vOoBBCiAGnaZp/eHxeYsdKkJ4QFdW2YXf1/1qEwcbXFCZVoL4hSdBh5Prrr+eaa67pctv3339Peno6mzZt6ueoem7+/Pmkp6eTnp7OsGHDmDRpEg899BAtLS3dPsbtt9/OjBkzDmGUQoi+VNHsosnhwWRQyOow101atJnUaDMuVWNVcdMARhgcalqlP1BfkiToMHLVVVexfPlySktLO21bvHgx+fn5jB49egAi67kjjjiCn3/+mf/+97/cd999vPXWWzz88MMDHZYQ4hDxVYGy48IwG9s/mhRF4VTvRIlf72gYkNgOpfo2N3/8dzErdjV2a38ZGda3JAnqLk0D1dkPP47O13Vz4brTTz+dhIQElixZEnB9S0sLH374IdOmTWPmzJkcffTRDB8+nKlTp/Lee+8F7HvZZZfxwAMP8NhjjzFmzBjGjx/P/PnzA/ZJT0/nH//4B7/5zW/IzMzkxBNPDJgN2uPxcNddd3HccccxfPhwTj75ZF555ZUenW6j0UhycjJpaWlceOGFXHLJJXzxxReAXik644wzWLp0KZMmTWLkyJH8/ve/p7m5uUf3IYQ4eA63istz8M1Uvk7ReR06RftMydYXKt5Q3kpVS3Av2NxTP+5p5ueyFt4pqOnW/rX2wIkSxcGRs9hdmovkoocG5K4rcx4GxXLA/UwmE5dddhnvvPMOs2bN8q+6/OGHH+LxeLj00kv58MMPmTlzJtHR0Xz11VfcdtttZGZmMmHCBP9x3nnnHX7729/ywQcf8OOPP3LHHXdwzDHHcMopp/j3efbZZ5k7dy5//OMfefnll/l//+//8f333xMXF4eqqqSmpvLSSy8RFxfHmjVrmD17NsnJyVxwwQW9Ogfh4eE4ne3zhOzatYvPPvuM119/nYaGBm6++WYWLFjAnDlzenV8IUTPOT0qN79fRLTFyJ/OzQpY6X13vYMhUWbCutl5t6tO0T5DoiyMTbZSUGln0doqosOM2F0qBgVOHx7L6OTITrcJFXVtHgCKGxy4PGpAFawrMjy+b0kl6DBz5ZVXsnPnTlatWuW/bvHixZxzzjlkZGRw8803M3bsWDIzM5kxYwZTpkzhgw8+CDjGqFGjuPPOO8nJyeHyyy8nPz+fFStWBOxzxRVXcNFFF5GTk8OcOXNoaWlh7dq1AJjNZu6++27y8/MZNmwYl1xyCdOnT+90P921fv163n33XU488UT/daqq8txzzzFy5EgmTZrEpZde2ilGIcShVdHsotbuZleDA7u7vRq0raaNWz/awRPflnTrOG5VY7t3CHxuYudKEMCpOXqT2PKdjXy0pY5/FzXw5fYGnl9ZhtbNankwqvcmNR4NdtUfeELImla9EiaVoL4hZ7G7FLNekTnEzGYTLpe7031314gRI5g4cSJvv/02J5xwAjt27OD777/nnXfewePx8Oc//5kPP/yQ8vJynE4nTqcTqzXwm9eoUaMCLicnJ1NdXb3PfSIiIoiOjg7Y57XXXuPtt99mz549tLW14XK5GDNmTLcfxy+//EJubi6qquJ0Opk6dSqPP/64f/vQoUOJiooKiLGmpnvlZCFE3/B10gVoaPP4163a3eAAYG15K5srWxl1gCUddtc7cHo0Is0G0qK7rnqfOCyGb3c00upSGZVkJc5qYklBDeXNLjZW2klL66MH1c/q29rPYVFdm39epK60uVW21+rndmisLJTaFyQJ6i5F6VaT1EEzmMFwcAW6q666irlz5/LEE0+wePFisrKyOP744/nLX/7CwoULefjhhxk5ciQRERE89NBDuFyBbewmU+DLQlEUVDWwzd9sNu9zn2XLlvHoo4/ywAMPMHHiRCIjI3nhhRf4+eefu/0Yhg8fzt///ndMJhNDhgzBYgk8992JUQhxaPmaZkCvaKR6E5hmp8d//dKNNTxwgCTI1xQ2IiEcg9L1+mBWs4FHTx8WcF1pk5Mvtzfw5fZ6zhjfm0cw8HzNYaBPA7A/68pbcKsaQ6LMZMT0w+fRICDNYYeh888/H4PBwLvvvsvSpUuZPn06iqKwevVqpk2bxqWXXsqYMWPIzMykqKioz+9/9erVHH300dxwww2MHTuW7Oxsdu3a1aNjmM1msrOzGTp0aKcESAgRHGo7VILqHe0f5i0dkqA1pS3srNv/h3v7yvGd+wPtz+nD9Say/+xqpNnhPsDewaneHlgJ2p8f9+jThBydFhnQ/0r0niRBh6HIyEguuOACnnrqKSorK7niiisAyM7OZvny5axevZqtW7dyzz33dGrm6gvZ2dmsX7+eb775hu3bt/P000+zbt26Pr+fA2lsbKSgoIANGzZQUFBAQUEBe/bs6fc4hDhc1djbq8gdP8xbnIFV2Q+31O33OL9U7Xtk2P6MTLSSHmPB4dH4cktlj24bLDo2h+2sc+BRu+7fpGkaa0r1EbAT06K63Ef0nCRBh6krr7yS+vp6Jk+eTEpKCgCzZs1i3LhxXHPNNVx22WUkJSUxbdq0Pr/va6+9lrPPPpvf//73nH/++dTV1XH99df3+f0cyKpVq5g2bRpTp05l2rRpTJs2jeeee67f4xDicNWxOayhQyXI1xx2RKJ3tuc6xz6PUWd3U9LoRAFGH6DZbG+KojDV22H6y18qenTbYODyqDR7E0ajAg6PRmlT152jd9Y7qGl1YzEqjB3Ss/Mk9k3RQrlbfR+pqqrq1C8G9EpCTExMv8ZiNpu7jCVYhUK8hyrGvnx9KIpCamoqZWXBPdIlFOIMhRg7CvZ49xff3Z/u9PfnOTvXxs3H6l+4Hv+2hB9Kmjn/iDg+2FJHpNnAW5fndtmE8+2OBp5dWcbw+DCePTu7x/Htqndw20c7CDMZ+MfluZgMwdtMtPe5rGpxceN72zEZYHh8OFuq27jzhFQmeyeH7OidgmreXFfNMemRzJ0ydEDiDSZms5mkpKSDPo5UgoQQQvRKxz5BAZUg79853sVPW1wqjR22d7S+ohWAcUN6N9fPsFgLtnAjDrfqb1YLFb6msNgwEzlx+rlaWdzUaY20VcVN/skUJ6ZLU1hf6tHosHfffZcffviBPXv2YLFYyMvL49prryWtw9hEp9PJokWLWLlyJS6Xi/z8fG688UZsNpt/n+rqal5++WU2btxIeHg4kydP5uqrr8ZoNPr32bhxI4sWLaK4uJiEhAQuvfRSpkyZEhDPp59+ygcffEB9fb1/3psRI0b07kyIfpObm7vPbW+++SaTJk3qx2iEEL3hUTXq2gJHh/m0eD/E460mEiNMVLe6KW1yEhve+SNngzcJOrKXTTyKonBkSiTLdzayvqI1pJqK6u16YmizmpiYHsUnW+v5b3EzN1dt54EpQxmREM43Oxp4bmUZAONTIjgtp3OVSPRej5KgTZs2MW3aNIYPH47H4+Gf//wnjz32GM8++yzh4XoW+/rrr/PTTz9x5513EhERwcKFC5k/fz6PPvoooE9y9+STT2Kz2Xjssceoq6tjwYIFGI1Grr76agAqKyt56qmnOOOMM7j11lspKCjgxRdfxGazMX78eABWrlzJokWLuOmmm8jNzeWjjz7i8ccf5/nnnyc2Vl4kwazjEht78/VfEkIEtwaHh459eBu6GB0WadHn/aludVPW5GLUXq0XFc1OKppdGBUYldyzkWEd+ZKgdeUtXH1kYq+P0998lSBbuJGJ6VHMPimNRWurKG928faGKuZOGcr7v9QCcMbwWH5/bArGIG7uC0U9ag67//77mTJlCkOHDiUrK4tbbrmF6upq/zDr1tZW/v3vf3P99dczduxYcnJymDlzJlu2bKGwsBCAdevWUVJSwq233kpWVhYTJkxg+vTpfPbZZ7jd+gvi888/Jzk5meuuu46MjAzOOussjjvuOD766CN/LB9++CFTp07l1FNPJSMjg5tuugmLxcLXX3/dV+dGHCLZ2dn7/Nl74kYhRHDq2BQGgaOcfJ19oyxG/9xBZV10+PVVgXITrP6JFnvjyBS9+rO12k6rq+tmt2Dkq6TFeWd/PjEzhjmnpAOwrryVimanf3LEa/OTJAE6BA5qssTWVv0F7Ju5t6ioCI/Hw7hx4/z7pKenk5iYSGFhIXl5eRQWFjJs2LCA5rHx48fzyiuvUFxcTHZ2Nlu3bg04BkB+fj6vvfYaAG63m6KiIi666CL/doPBwLhx4/zJVldcLldAB1lFUbBarSiKInMuiF7pq9eN7zjB/joMhThDIcaOgj3efcXnGxk2JMpMRbOLFqeKWwWDos9sDHoSlBbjS4JcnY6xtszbFJYScVCPPzU6jLTYcEob2thUaeeYjOheH+tQ2vtc1nsnSrSFm/zXZceF+5sQ31irT2EyIj6cuIjurxxwqOINJn0VU6+TIFVVee211zjiiCMYNkyfxbO+vh6TyURkZGAHt9jYWOrr6/37dEyAfNt923y/927Sio2NxW6343Q6aW5uRlXVTsex2WyUlpbuM2bf5IE+2dnZzJs3j8TErsundru908zI/WEg7vNghEK8hyJGi8VCampqnx4zVJoDQyHOUIixo2CPd+/43OX6B3jekFiqW2vwqBphsfGEmYzALwAMz0yn3B0OP1VS3aYF/L/UtTr5b4m+3znjs0lNPbiRlsdk1rFsfRnrazxccEzf/l/2Nd+5dKB3ds4cEh9wbk4e0ci760v5blcjAFOOSOnz95qeCPbX5sHodRK0cOFCiouLeeSRR/oynkPq4osv5rzzzvNf9mWS1dXVXQ6hdjqd/T78OxSGnHcUCvEeqhidTidlZWV9cixFUUhJSaG8vDzohqJ2FApxhkKMHQV7vPuKb0e5/gEeZXQTG2ak1u5m665SrBa9WctqMlBVUUG4W2/O2VXbQmlpqf99d2lBNS6PRm5COPG0UFbWclAxnjM6hWXry/igoIzThoWTHde9iRe/29mIW9X8C7QeSnufy9K6JgCMrtaA95JRcQbe7XC7vBj67L2mJ4L5tWk2m/dZwOiJXiVBCxcu5KeffuLhhx8mISHBf73NZsPtdtPS0hJQDWpoaPBXbWw2G9u2bQs4XkNDg3+b77fvuo77WK1WLBYLMTExGAwGf+XIp6sqU0dms7nLioCmaUH3BIvQ0Nevm1B5LYZCnKEQY0fBHu/e8fkWT423mogN15OgOrsbj3efCIsBTdMYEmVCAVpdKvVtbmzhJjyqxieF+izS5+TF9cnjPmpoHCcMi2bl7iZeXl3OY6cPO2CTicOt8ux/9qABE9MjibL0vl9ST/jOpW90WGyYMeAcHDkkApNBwa1qRIcZGREfNqCvjWB8bfZVPD3qGK1pGgsXLuSHH37gwQcfJDk5OWB7Tk4ORqORDRs2+K8rLS2lurqavLw8APLy8ti9e3dAkrN+/XqsVisZGRmAPoS64zF8+/iOYTKZyMnJoaCgwL9dVVUKCgr8+wghhDh0auwdkyD9+3SDw+NfMsOXUFiMBhIj9O2+ztFr9jRT1eomOszISZl9139nxlFDsBgVCirtfF/SfMD9a+1uPBqoGlS19H9F2z86zBqYfFnNBv9Q/6NSI6VD9CHUoyRo4cKFfPfdd8yaNQur1Up9fT319fU4nfoLOyIigtNOO41FixZRUFBAUVERf/3rX8nLy/MnJ/n5+WRkZLBgwQJ27tzJ2rVrefvtt5k2bZq/SnPmmWdSWVnJm2++yZ49e/jss89YtWoV5557rj+W8847j6+++opvvvmGkpISXnnlFRwOR6e5hETPTJo0iZdffnmgwxBCBLk6byUoIcKMLVz/EK+3u9uHx5vbP17aR4i5UDWNJd6J/84YHovF2Hdz9iZHmTnDu6iqb+TZ/tR0GOFW3dK/C7A63Cqt3vmUbF3MnzR9bAJHJFq5eHR8v8Y12PSoOcw3v8sf//jHgOtnzpzpTz6uv/56FEVh/vz5uN1u/2SJPgaDgTlz5vDKK68wd+5cwsLCmDx5MtOnT/fvk5yczJw5c3j99df5+OOPSUhI4Oabb/bPEQRwwgkn0NjYyJIlS6ivrycrK4v77rtvv81hh7vrr78et9vNW2+91Wnb999/zyWXXMIXX3zB6NGjByC6ri1evJg777wT0NufhwwZwimnnML999/f7fbe+fPn8+mnn/LFF18cylCFEB34Fk+Nt5r8H+INDg9RYXpCFNmhaSk12sL6ilaKavUlNrbVtmE1GbhwZN9/wKd4E66OQ/b3pePaZ9Wt/VsJ8sVnNigBCaPP6OQInp6W2a8xDUY9SoKWLFlywH0sFgs33nhjQOKzt6SkJO699979HmfMmDE8/fTT+93nrLPO4qyzzjpgTIPFVVddxU033URpaWnALN6gJxv5+flBlQD5REdHs3z5clRVZdOmTdx5551UVFTwj3/8Y6BDE0J0we5qX/gzIULvEwR6JSjWmwRFWdo/2I9IDOezbfDBljrCTfr1V4xNwGY9qFlauuRLyHzDz/enpkPi09/NYe3D441BOQR9sJC1ww4jp59+OgkJCZ2S1ZaWFj788EOuvPJKPvroI0499VSys7OZNGkSL7744n6PuW3bNi666CJycnKYMmUKy5cvJz09nU8//dS/z+OPP85JJ53E8OHDOf7443n66ad7NBpLURSSk5NJSUnhtNNOY8aMGXz33XfY7XYWL17MqFGj+Oabb5g8eTK5ublcc801VFSE3orRQhwufH17osOMRFmM7YmHw+NfMqNjJWhKdiwXj9KrPm1ulZQoM+ePjDsksXVsmjuQwEpQ/zaH+eI7FImg6D45+92kaRoezXHI70fxeHCrgQmEUQnr1jcFk8nEZZddxjvvvMOsWbP8t/nwww/xeDzk5uZyxRVXcOedd3LBBRewZs0a7rvvPuLi4gKaI308Hg8zZswgPT2dDz74gJaWli6nRIiMjOS5554jJSWFzZs3M3v2bKKiopg5c2avzkF4eDiqquLx6N+U7HY7L774In/+858xGAzceuutPProoyxYsKBXxxdCHJxSbxKU5m168iUeDW1umjssmeFjNCjccFQyGbEWPt1az68nJGPuw75AHfmSiuBvDmufKFEMHDn73eTRHPxr800Dct+XjnoZk9K9OS+uvPJKXnjhBVatWsUJJ5wA6E1h55xzDm+99RYnnXQSd9xxBwDDhw9n69atvPjii10mQcuXL2fXrl0sXbrUPxJw9uzZXHXVVQH73X777f6/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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "attribution.cumsum().plot(y = ['Vega_PnL', 'Delta_PnL', 'Gamma_PnL', 'Theta_PnL', 'Vanna_PnL', 'Volga_PnL'])" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAi8AAAGtCAYAAADeRJQKAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB6DElEQVR4nO3dd3hUZfrw8e8z6Q0SCCGNEAIEkI4iiCDNLr5rAbGtFXUXZVGxt5+gqChgWXXXVVBRURBFXduyFlwRFARRegg1AQIESCC9zPP+cWYmGVJnMpmZk9yf6+JK5pwzZ+4nE5I799OU1lojhBBCCGESFl8HIIQQQgjhCklehBBCCGEqkrwIIYQQwlQkeRFCCCGEqUjyIoQQQghTkeRFCCGEEKYiyYsQQgghTEWSFyGEEEKYiiQvQgghhDCVQF8H0BTHjh2joqLC12HUqUOHDhw+fNjXYXiU2dtk9vjtpB3+wezx18bsbZL4/UNd7QgMDCQmJqbJ9zd18lJRUUF5ebmvw6iVUgowYmwpOzCYvU1mj99O2uEfzB5/bczeJonfP3ijHdJtJIQQQghTkeRFCCGEEKYiyYsQQgghTEWSFyGEEEKYiqkH7NanoqKCoqIin8ZQXFxMWVmZT2PwNLO3yRPxh4eHExjYYv/rCCGE32uRP4ErKiooLCwkKioKi8V3xaWgoCC/nQ3lLrO3qanxW61WTpw4QUREhCQwQgjhIy2y26ioqMjniYtomSwWC1FRUT6v6gkhRGvWYn+7S+Iimot8bwkhhG/JT2EhhBBCmIokL0IIIYQwFUlehBBCCGEqkryY1Pjx43nsscfqvWbIkCG8/vrrHn3dKVOmcNNNN3n0no0xZ84czjnnnEZfn5WVRVJSEhs3bmzGqIQQQviCJC9+5M477yQpKYn777+/xrmHHnqIpKQk7rzzTgBef/117rvvPi9HCDNnzuT555936TlJSUl8/fXXzRRR46xcuZKkpCTy8/N9GocQQoimk+TFzyQmJvLZZ59RXFzsOFZSUsInn3xCUlKS41hMTAyRkZFej69Nmza0bdvW668rhBDCmdYavXEt1tdno7f+4etwvKpVJC9aa3Rpiff/ubEVeN++fUlMTOSrr75yHPvqq69ITEykT58+jmMndxvl5uZy/fXX07VrV4YOHcrHH39c495JSUm8/fbbXHvttXTt2pUzzjiDzz//3OmaLVu2MGHCBLp27Urv3r257777KCwsdJw/udto/PjxPProozz55JP07t2bAQMGMGfOHMf5IUOGAHDzzTeTlJTkeNyQl19+mf79+5Oens60adMoLS2tcc3ChQsZOXIkaWlpnHXWWbz11lu13isrK4sJEyYA0L17d6cK1vfff88ll1xCr1696N27N9dddx27d+9uVIxCCOEr+uhhrHMewfridPTq/2Fd8pavQ/Kq1rFEaFkp1juu8P7rvrYULAEuP23ixIksWrSIyy67DIAPPviAiRMnsmrVqjqfc9ddd5GTk8PixYsJCgri0UcfJTc3t8Z1zz33HA899BDTp0/no48+YvLkyfTo0YPu3btTVFTENddcw6mnnsoXX3xBbm4u9957Lw8//DAvvPBCna/94Ycfcuutt/Lvf/+btWvXctdddzF48GDOOussvvzyS/r168fcuXMZPXo0AQENfz0+++wz5s6dy8yZMxk8eDAfffQR8+fPJyUlxXHNxx9/zOzZs3nyySfp06cPGzdu5N577yU8PJwrrnB+rxMTE3n99de55ZZbWLVqFaGhoYSGhgLGgoa33norvXr1orCwkNmzZzNp0iSWLVsm67kIIfyWXjwftm2AwECoqIC9O9FFhajwCF+H5hXy09kPXX755axZs4bs7Gyys7P59ddfufzyy+u8fseOHXz33Xc899xznHrqqfTr1485c+ZQUlJS49px48Zx9dVX07VrV+677z769evH/PnzAVi6dCmlpaW8+OKL9OzZk+HDh/Pkk0/y0Ucfcfjw4Tpfv1evXtx9992kpaUxYcIE+vfvz4oVKwBo3749AG3btiUuLs7xuD5vvPEGV155JVdddRXdunXj/vvvp3v37k7XzJkzh8cee4wLL7yQlJQULrzwQm655RbefffdGvcLCAggOjoagNjYWOLi4mjTpg0AF110ERdeeCFdunShT58+zJ07ly1btpCRkdFgnEII4Qtaa3TmZgAsUx6DuATQVrAdaw1aR+UlOATLy4t98rpUVLj8tPbt2zN27FgWL16M1poxY8bQrl27Oq/PzMwkMDCQfv36OY5169at1rEpp556ao3HmzZtAmD79u306tWL8PBwx/nBgwdjtVrZsWMHHTp0qPX1e/Xq5fQ4Li6u1qpPY2VmZvLnP/+5RpwrV64EjGrJ7t27mTZtGvfee6/j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kpJqPZ+UlERhYSE7duxg1apV/PWvf+X000+nY8eO9O3bl2HDhmGxWBxdNW3btiU6OtprVaPqTj/9dFJTU2sd4/L555/Tt29fxo8fT2JiIqNGjeL888/ns88+A6BTp0507tyZFStWOJ7z448/0r17d78Y15CUlMShQ4ca9T318ccfM2zYMK644gqSk5NJTU3l0ksv9VnsQ4cOZciQIcTHx5Oamspf//pX9u7dW+MX+MUXX8ygQYNITEzkiiuu4PDhw07JpC+tW7eOP//5z45/c+fOZcmSJVxyySWMGjWKjh070q9fPyZOnMg333zj9NyhQ4cyduxYEhMTufLKK+natStff/21V+M/66yz2Lp1K4cPH+bw4cNs3brV8bO4epyNeZ8uuugihgwZQlxcHDExMV6JvzG/OyZMmEC/fv1ISUnhjjvuID8/32mwdGVlJTfffDM9evQgMTGRkJAQr8Ru54n34PTTTweMip/dDz/8wKhRo1BKNToW6TZywf79+8nMzOSee+4BjF/8w4YN47vvvqN3796Nvse5557rdKxbt25s3LjR4/E21tChQxk0aBBbt24lIyOD9evX89lnn/GXv/yFkpISSkpKuOmmm5yeU1ZW5vRDOTY21qn/Nj09Ha01+/fvr7VU7QuHDh3CYrE4usf81TXXXMOMGTMc3UF2+/bt47TTTnM61qNHD7744gusVisWi8XxF9348eMdu7eOGzfOm+HXSWuNUordu3c3+D21e/duxo4d64swa3XgwAEWLVpEZmYmJ06ccPwVmZub6/THR/XP7d/3+fn5dSbW3tS7d29uueUWx+OQkBDuuecetm7d6lRpsVqtlJeXU1pa6vjleHLXV/fu3R1/4HhLmzZtGDhwIMuXL0drzaBBg2qM2Wns+5SWlubV2Bv7u6P61zkyMpLExET27dvnOBYYGEjnzp29F/hJPPEeBAcHc9ZZZ/H9998zbNgwdu7cyd69e10eGC/Jiwu+++47Kisrue222xzHtNYEBQVx8803o5SqUQb055JxdcHBwfTr149+/foxfvx4/vnPf7J48WLOPfdcYmJiePzxx2s8xxeVidrEx8ejlCI7O9uR1Ve3b98+IiIianQp+atTTjmF/v37s3DhQpf74s8880zee+89du7cSVlZGUeOHGHYsGHNE6iL9u3bR1xcHCUlJQ1+T/nbezVr1iw6dOjAbbfdRkxMDFprpk2b5lTSB5wGftr/ivSXHVhCQkJqVOBKSkq44oorGDJkSI3r/XF/nTFjxjBv3jwApzETdo19n0JDQ70Sr11DvzsaKzg42KXqRHPwxHswduxY7r33Xo4cOcLy5cvp06eP07iZxpDkpZEqKyv54YcfuO666+jXr5/Tueeee44VK1bQoUMHR6XC/p9j9+7dTtcmJiayY8cORo4c6Ti2Y8eOZo/fVcnJyaxZs4a0tDTy8vKwWCz1DgzLzc11Gj2fkZGBUorExMRmjzUqKop+/fqxbNkyxo0b5/SLLy8vjxUrVnDWWWeRkpKC1prNmzfXeA+h6hfPyf3jvnDNNddw7733On39kpKS2LZtm9N127ZtIzEx0THjoH379pxyyimsWLGCsrIy+vXr5/V+8dps3LiRvXv3ctFFF9G+ffsGv6c6d+7Mhg0bGD16tJcjrenEiRPs37+f2267jV69egFGd2pLkJaWxv79+xvsVty+fbvTz6zt27fTpUuX5g6vhgEDBlBRUYFSigEDBjid89f3qTG/O+yVuYyMDMfMnYKCAg4cOOAXVbvqPPEepKSk0LVrV7799ltWrFhRowrbGJK8NNLatWspLCxkzJgxNSoOQ4YM4fvvv+fhhx8mODiY999/nwsuuIDMzEynwU0A559/Pq+99hppaWn06NGDlStXsmfPHjp27OjF1lQ5ceIEc+fOZfTo0XTu3JmwsDB27NjBp59+ymmnnUbfvn1JT0/nueee49prryUhIYFjx46xbt06Tj/9dLp27QoYf6W98sor/PnPf6a4uJg333yTM844w2tdRjfddBOPPPIIM2fOZOLEicTFxZGdnc0777xDu3btuOqqq4iMjGTkyJH84x//4MYbbyQ1NZXDhw+Tn5/PsGHD6NChA0op1q5dy6BBgwgODvb6X2h2KSkpjBgxgq+++spxbNy4cTz44IMsWbKEYcOGkZGRwddff82kSZOcnjt8+HAWL15MRUUF119/vbdDp6Kigry8PKep0p988gmDBg1i5MiRKKUa/J4aP348M2bMID4+nmHDhmG1Wlm3bp3TGjjeEhERQVRUFN988w0xMTHk5uby3nvveT2O5nD55Zcza9YsYmNjGTp0KEop9uzZQ1ZWFldeeaXjulWrVpGWlkbPnj1ZsWIFmZmZ/PWvf/V6vBaLheeff97xeXX++j415neHfXbhRx99RFRUFG3btuWDDz4gKiqq1mqyL3nqPRgzZgzz588nJCTErTZK8tJI3333HX379q21q2To0KF89tlnHDlyhClTpvDuu+/y7bff0qdPHyZMmMC//vUvx7UjRozg4MGDvPPOO5SXl3PGGWcwatQoMjMzvdkch9DQULp3784XX3zBwYMHqayspH379owdO5bLLrsMpRQPPvgg77//Pq+++irHjx8nOjqaXr16Of1FHx8fz5AhQ3j66acpKCjg1FNPrfFLtTklJCTwzDPPsHjxYp5//nkKCgqIjo5m8ODBTJgwwTEYd9KkSbz//vvMmzePEydOEBsb6xgI2q5dOyZMmMDChQv5xz/+wVlnneXTha+uuOIKVq5c6XiclpbGXXfdxeLFi/noo4+IiYnhiiuuqNG1NHToUObPn4/FYvHJD77169dz6623EhAQQEREBJ07d+bGG29k5MiRjh92DX1P9e7dm7vvvpuPPvqITz75hLCwMMdfct6itSYgIACLxcLUqVN58803mTZtGomJidx44421dnuZzYABA7j//vv56KOP+PTTTwkICCApKYkxY8Y4XWf/Xpw3bx7R0dFMnTqV5ORkn8RcV3e1v75PjfndYR8/dPXVV/PWW285pkrff//9XluDxhWeeA+GDx/O22+/zZlnnulWN7HS/tIh24o98cQTREdHM2XKFF+H4hb7Oi++WKdGiOYyc+ZM4uPjXRqTIIQ7fLm6t68cOnSIKVOm8PTTT7s1gFqmSntZaWkpn3/+OVlZWezbt4/FixezYcMGp/5kIYTvFBQUsHbtWjZv3tzoBbOEEI1j71b+4IMPSE9Pd3vml//Vo1o4pRS//fYbH3/8MeXl5SQmJjJt2rRaB5AKIbzvH//4Bzt27GDcuHEMHjzY1+EI0aJs27aN6dOnk5CQ4FgY1B3SbSSEEEIIU5FuIyGEEEKYiiQvQgghhDAVSV6EEEIIYSoyYFcI0WotXbqU1atXs2/fPoKDg0lPT+faa691Wtm4rKyMBQsWsHLlSsrLy+nfvz+TJk1yLMC4e/duPvnkE7Zt28bx48eJi4vjnHPO4cILL6z1Nbdu3crjjz9Op06dZHkBIdwkyYsQotXavHkz5513Hl27dqWyspL333+fJ598krlz5zpWV3777bdZt24dd999N+Hh4cybN485c+bwxBNPALBz507atm3LlClTaN++Pdu2beNf//oXFouF888/3+n1CgsLeeWVV+jbt69XdlwXoqWS5EUI0Wo9/PDDTo9vv/12Jk2axM6dOznllFMoKiriu+++Y+rUqfTp0weAyZMnc9ddd5GRkUF6enqN1Wg7duxIRkYGv/zyS43k5fXXX+fMM8/EYrGwZs2a5m2cEC2YjHkRQgiboqIiAMd2Ejt37qSystJpsbqkpCRiY2PJyMio9z72e9h9//33HDx4kAkTJjRD5EK0LpK8CCEExm7ib731Fj169CAlJQUwdiUPDAyssWR727Zt6+z22bZtG6tWreLss892HDtw4AALFy5kypQpBAQENFsbhGgtJHkRQghg3rx5ZGVlceedd7p9j7179/Lss88yfvx4+vfvDxhJ0UsvvcSECROcBgILIdwnY16EEK3evHnzWLduHdOnT6d9+/aO49HR0VRUVFBYWOhUfcnPz3fMNrLLzs7miSee4Oyzz+byyy93HC8uLmbHjh3s2rWL+fPnA8aO1VprrrzySh555BHHeBohRONI8iKEaLW01syfP5/Vq1fz+OOPExcX53Q+LS2NgIAANmzYwNChQwHYv38/ubm5pKenO67LyspixowZjBw5kquuusrpHmFhYcyePdvp2LJly9i4cSN33313jdcUQjRMkhchRKs1b948VqxYwX333UdYWJhjHEt4eDjBwcGEh4czZswYFixYQGRkJOHh4cyfP5/09HRH8rJ3715mzJhB//79GTdunOMeFouFNm3aYLFYHGNo7Nq0aUNQUFCN40KIxpHkRQjRai1btgyAxx9/3On45MmTGTVqFADXX389SinmzJlDRUWFY5E6u59//pnjx4/z448/8uOPPzqOd+jQgVdeeaXZ2yBEayS7SgshhBDCVGS2kRBCCCFMRZIXIYQQQpiKJC9CCCGEMBVJXoQQQghhKpK8CCGEEMJUJHkRQgghhKlI8iKEEEIIU5HkRQghhBCmIsmLEEIIIUxFkhchhBBCmIokL0IIIYQwlf8PqA49R86vHXEAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "pt_greeks.iloc[1:-40].plot(y = 'Midpoint_delta')" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Start: 2023-08-15 00:00:00, End: 2023-10-24 00:00:00, ts_start: 2023-08-17, ts_end: 2023-10-20\n", - "Start: 2023-08-15 00:00:00, End: 2023-10-24 00:00:00, ts_start: 2023-08-17, ts_end: 2023-10-20\n", - "Start: 2023-08-15 00:00:00, End: 2023-10-24 00:00:00, ts_start: 2023-08-17, ts_end: 2023-10-20\n", - "Successfully updated column0920C315: 0cessfully saved TSLA20240920C305Successfully updated column\r" - ] - } - ], - "source": [ - "ind = 7\n", - "end = '2024-07-01' if ind == 4 else trades.ExitTime.loc[ind]\n", - "start = trades.EntryTime.loc[ind]\n", - "structure = trades.Structure.loc[ind]\n", - "att = Calculate.attribution(structure,\n", - " ts_start = start,\n", - " ts_end = end,\n", - " method = 'RV',\n", - " return_all=True,\n", - " replace = 'default_fill')\n" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Delta_PnL -185.57\n", - "Gamma_PnL 20.03\n", - "Vega_PnL 143.00\n", - "Volga_PnL -10.62\n", - "Theta_PnL -62.43\n", - "Rho_PnL 0.81\n", - "Vanna_PnL -83.24\n", - "Dividend_PnL 0.00\n", - "Total_PnL -178.01\n", - "Unexplained_PnL -1.99\n", - "Actual_PnL -180.00\n", - "Price 120510.00\n", - "dtype: float64" - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pd.set_option.float_format = '{:.2f}'.format\n", - "(att['total'].iloc[:-1].sum() * 9).round(2)" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Delta_PnLGamma_PnLVega_PnLVolga_PnLTheta_PnLRho_PnLVanna_PnLDividend_PnLTotal_PnLUnexplained_PnLActual_PnLPrice
Datetime
2023-08-17-16.160.120.000.00-0.16-0.030.000.0-16.231.23-15.0200.0
2023-08-18-9.310.05-7.340.26-0.170.000.240.0-16.27-1.23-17.5182.5
2023-08-2137.980.8816.02-0.71-0.500.011.280.054.960.0455.0237.5
2023-08-224.940.01-9.950.26-0.150.06-0.170.0-5.010.01-5.0232.5
2023-08-239.190.023.42-0.12-0.130.000.100.012.500.0012.5245.0
2023-08-24-17.380.085.32-0.25-0.130.03-0.160.0-12.49-0.01-12.5232.5
2023-08-2521.810.121.00-0.15-0.150.05-0.190.022.480.0222.5255.0
2023-08-280.590.002.36-0.09-0.380.030.000.02.51-0.012.5257.5
2023-08-2947.390.170.43-0.09-0.13-0.01-0.290.047.460.0447.5305.0
2023-08-30-0.72-0.000.91-0.10-0.07-0.020.000.0-0.000.000.0305.0
2023-08-313.03-0.00-3.020.14-0.07-0.06-0.010.0-0.000.000.0305.0
2023-09-01-33.49-0.031.510.01-0.07-0.11-0.290.0-32.47-0.03-32.5272.5
2023-09-040.000.000.000.00-0.340.000.000.0-0.340.340.0272.5
2023-09-0529.810.03-1.40-0.09-0.120.04-0.460.027.82-0.3227.5300.0
2023-09-06-11.71-0.01-0.840.06-0.070.08-0.000.0-12.49-0.01-12.5287.5
2023-09-07-1.100.00-1.370.13-0.09-0.06-0.000.0-2.50-0.00-2.5285.0
2023-09-08-7.720.002.94-0.10-0.090.04-0.060.0-4.99-0.01-5.0280.0
2023-09-1165.31-0.20-0.58-0.30-0.320.00-1.660.062.250.2562.5342.5
2023-09-12-15.35-0.05-2.250.20-0.010.04-0.070.0-17.49-0.01-17.5325.0
2023-09-139.73-0.025.58-0.30-0.030.000.040.015.000.0015.0340.0
2023-09-1412.09-0.035.61-0.22-0.03-0.040.110.017.490.0117.5357.5
2023-09-15-4.23-0.00-8.760.47-0.020.010.020.0-12.500.00-12.5345.0
2023-09-18-23.31-0.11174.58-8.12-0.040.01-4.870.0138.14-0.64137.5482.5
2023-09-193.87-0.01-168.497.88-0.260.04-0.650.0-157.630.13-157.5325.0
2023-09-20-10.29-0.01-12.940.61-0.050.020.160.0-22.500.00-22.5302.5
2023-09-21-17.91-0.0019.37-1.00-0.05-0.04-0.350.00.03-0.03-0.0302.5
2023-09-22-28.740.001.49-0.07-0.100.00-0.060.0-27.48-0.02-27.5275.0
2023-09-255.620.00-0.380.09-0.410.030.040.04.990.015.0280.0
2023-09-26-7.720.00-2.290.00-0.130.050.100.0-10.00-0.00-10.0270.0
2023-09-27-9.620.0150.45-2.27-0.140.02-0.910.037.55-0.0537.5307.5
2023-09-2817.11-0.02-50.322.35-0.22-0.08-1.370.0-32.560.06-32.5275.0
2023-09-2910.300.01-0.160.01-0.13-0.03-0.000.09.990.0110.0285.0
2023-10-023.710.00-0.87-0.03-0.360.06-0.030.02.480.022.5287.5
2023-10-03-13.590.019.23-0.58-0.110.09-0.040.0-4.98-0.02-5.0282.5
2023-10-0439.32-0.01-6.180.18-0.14-0.02-0.700.032.460.0432.5315.0
2023-10-05-2.93-0.00-2.040.07-0.08-0.040.010.0-5.000.00-5.0310.0
2023-10-061.26-0.003.80-0.09-0.080.080.020.05.00-0.005.0315.0
2023-10-09-2.30-0.002.73-0.16-0.250.00-0.000.00.01-0.010.0315.0
2023-10-1010.61-0.01-3.140.21-0.09-0.090.010.07.490.017.5322.5
2023-10-11-1.69-0.00-0.860.09-0.080.04-0.000.0-2.50-0.00-2.5320.0
2023-10-12-11.12-0.011.290.09-0.080.00-0.160.0-9.99-0.01-10.0310.0
2023-10-13-21.27-0.011.45-0.20-0.10-0.030.170.0-19.99-0.01-20.0290.0
2023-10-167.640.00-5.200.38-0.390.000.040.02.470.032.5292.5
2023-10-172.560.005.20-0.21-0.120.050.030.07.50-0.007.5300.0
2023-10-18-33.940.07-0.910.11-0.13-0.04-0.140.0-34.97-0.03-35.0265.0
2023-10-19-62.881.16-9.500.48-0.17-0.081.010.0-69.98-0.02-70.0195.0
2023-10-20-21.210.32-18.350.80-0.23-0.041.190.0-37.520.02-37.5157.5
\n", - "
" - ], - "text/plain": [ - " Delta_PnL Gamma_PnL Vega_PnL Volga_PnL Theta_PnL Rho_PnL \\\n", - "Datetime \n", - "2023-08-17 -16.16 0.12 0.00 0.00 -0.16 -0.03 \n", - "2023-08-18 -9.31 0.05 -7.34 0.26 -0.17 0.00 \n", - "2023-08-21 37.98 0.88 16.02 -0.71 -0.50 0.01 \n", - "2023-08-22 4.94 0.01 -9.95 0.26 -0.15 0.06 \n", - "2023-08-23 9.19 0.02 3.42 -0.12 -0.13 0.00 \n", - "2023-08-24 -17.38 0.08 5.32 -0.25 -0.13 0.03 \n", - "2023-08-25 21.81 0.12 1.00 -0.15 -0.15 0.05 \n", - "2023-08-28 0.59 0.00 2.36 -0.09 -0.38 0.03 \n", - "2023-08-29 47.39 0.17 0.43 -0.09 -0.13 -0.01 \n", - "2023-08-30 -0.72 -0.00 0.91 -0.10 -0.07 -0.02 \n", - "2023-08-31 3.03 -0.00 -3.02 0.14 -0.07 -0.06 \n", - "2023-09-01 -33.49 -0.03 1.51 0.01 -0.07 -0.11 \n", - "2023-09-04 0.00 0.00 0.00 0.00 -0.34 0.00 \n", - "2023-09-05 29.81 0.03 -1.40 -0.09 -0.12 0.04 \n", - "2023-09-06 -11.71 -0.01 -0.84 0.06 -0.07 0.08 \n", - "2023-09-07 -1.10 0.00 -1.37 0.13 -0.09 -0.06 \n", - "2023-09-08 -7.72 0.00 2.94 -0.10 -0.09 0.04 \n", - "2023-09-11 65.31 -0.20 -0.58 -0.30 -0.32 0.00 \n", - "2023-09-12 -15.35 -0.05 -2.25 0.20 -0.01 0.04 \n", - "2023-09-13 9.73 -0.02 5.58 -0.30 -0.03 0.00 \n", - "2023-09-14 12.09 -0.03 5.61 -0.22 -0.03 -0.04 \n", - "2023-09-15 -4.23 -0.00 -8.76 0.47 -0.02 0.01 \n", - "2023-09-18 -23.31 -0.11 174.58 -8.12 -0.04 0.01 \n", - "2023-09-19 3.87 -0.01 -168.49 7.88 -0.26 0.04 \n", - "2023-09-20 -10.29 -0.01 -12.94 0.61 -0.05 0.02 \n", - "2023-09-21 -17.91 -0.00 19.37 -1.00 -0.05 -0.04 \n", - "2023-09-22 -28.74 0.00 1.49 -0.07 -0.10 0.00 \n", - "2023-09-25 5.62 0.00 -0.38 0.09 -0.41 0.03 \n", - "2023-09-26 -7.72 0.00 -2.29 0.00 -0.13 0.05 \n", - "2023-09-27 -9.62 0.01 50.45 -2.27 -0.14 0.02 \n", - "2023-09-28 17.11 -0.02 -50.32 2.35 -0.22 -0.08 \n", - "2023-09-29 10.30 0.01 -0.16 0.01 -0.13 -0.03 \n", - "2023-10-02 3.71 0.00 -0.87 -0.03 -0.36 0.06 \n", - "2023-10-03 -13.59 0.01 9.23 -0.58 -0.11 0.09 \n", - "2023-10-04 39.32 -0.01 -6.18 0.18 -0.14 -0.02 \n", - "2023-10-05 -2.93 -0.00 -2.04 0.07 -0.08 -0.04 \n", - "2023-10-06 1.26 -0.00 3.80 -0.09 -0.08 0.08 \n", - "2023-10-09 -2.30 -0.00 2.73 -0.16 -0.25 0.00 \n", - "2023-10-10 10.61 -0.01 -3.14 0.21 -0.09 -0.09 \n", - "2023-10-11 -1.69 -0.00 -0.86 0.09 -0.08 0.04 \n", - "2023-10-12 -11.12 -0.01 1.29 0.09 -0.08 0.00 \n", - "2023-10-13 -21.27 -0.01 1.45 -0.20 -0.10 -0.03 \n", - "2023-10-16 7.64 0.00 -5.20 0.38 -0.39 0.00 \n", - "2023-10-17 2.56 0.00 5.20 -0.21 -0.12 0.05 \n", - "2023-10-18 -33.94 0.07 -0.91 0.11 -0.13 -0.04 \n", - "2023-10-19 -62.88 1.16 -9.50 0.48 -0.17 -0.08 \n", - "2023-10-20 -21.21 0.32 -18.35 0.80 -0.23 -0.04 \n", - "\n", - " Vanna_PnL Dividend_PnL Total_PnL Unexplained_PnL Actual_PnL \\\n", - "Datetime \n", - "2023-08-17 0.00 0.0 -16.23 1.23 -15.0 \n", - "2023-08-18 0.24 0.0 -16.27 -1.23 -17.5 \n", - "2023-08-21 1.28 0.0 54.96 0.04 55.0 \n", - "2023-08-22 -0.17 0.0 -5.01 0.01 -5.0 \n", - "2023-08-23 0.10 0.0 12.50 0.00 12.5 \n", - "2023-08-24 -0.16 0.0 -12.49 -0.01 -12.5 \n", - "2023-08-25 -0.19 0.0 22.48 0.02 22.5 \n", - "2023-08-28 0.00 0.0 2.51 -0.01 2.5 \n", - "2023-08-29 -0.29 0.0 47.46 0.04 47.5 \n", - "2023-08-30 0.00 0.0 -0.00 0.00 0.0 \n", - "2023-08-31 -0.01 0.0 -0.00 0.00 0.0 \n", - "2023-09-01 -0.29 0.0 -32.47 -0.03 -32.5 \n", - "2023-09-04 0.00 0.0 -0.34 0.34 0.0 \n", - "2023-09-05 -0.46 0.0 27.82 -0.32 27.5 \n", - "2023-09-06 -0.00 0.0 -12.49 -0.01 -12.5 \n", - "2023-09-07 -0.00 0.0 -2.50 -0.00 -2.5 \n", - "2023-09-08 -0.06 0.0 -4.99 -0.01 -5.0 \n", - "2023-09-11 -1.66 0.0 62.25 0.25 62.5 \n", - "2023-09-12 -0.07 0.0 -17.49 -0.01 -17.5 \n", - "2023-09-13 0.04 0.0 15.00 0.00 15.0 \n", - "2023-09-14 0.11 0.0 17.49 0.01 17.5 \n", - "2023-09-15 0.02 0.0 -12.50 0.00 -12.5 \n", - "2023-09-18 -4.87 0.0 138.14 -0.64 137.5 \n", - "2023-09-19 -0.65 0.0 -157.63 0.13 -157.5 \n", - "2023-09-20 0.16 0.0 -22.50 0.00 -22.5 \n", - "2023-09-21 -0.35 0.0 0.03 -0.03 -0.0 \n", - "2023-09-22 -0.06 0.0 -27.48 -0.02 -27.5 \n", - "2023-09-25 0.04 0.0 4.99 0.01 5.0 \n", - "2023-09-26 0.10 0.0 -10.00 -0.00 -10.0 \n", - "2023-09-27 -0.91 0.0 37.55 -0.05 37.5 \n", - "2023-09-28 -1.37 0.0 -32.56 0.06 -32.5 \n", - "2023-09-29 -0.00 0.0 9.99 0.01 10.0 \n", - "2023-10-02 -0.03 0.0 2.48 0.02 2.5 \n", - "2023-10-03 -0.04 0.0 -4.98 -0.02 -5.0 \n", - "2023-10-04 -0.70 0.0 32.46 0.04 32.5 \n", - "2023-10-05 0.01 0.0 -5.00 0.00 -5.0 \n", - "2023-10-06 0.02 0.0 5.00 -0.00 5.0 \n", - "2023-10-09 -0.00 0.0 0.01 -0.01 0.0 \n", - "2023-10-10 0.01 0.0 7.49 0.01 7.5 \n", - "2023-10-11 -0.00 0.0 -2.50 -0.00 -2.5 \n", - "2023-10-12 -0.16 0.0 -9.99 -0.01 -10.0 \n", - "2023-10-13 0.17 0.0 -19.99 -0.01 -20.0 \n", - "2023-10-16 0.04 0.0 2.47 0.03 2.5 \n", - "2023-10-17 0.03 0.0 7.50 -0.00 7.5 \n", - "2023-10-18 -0.14 0.0 -34.97 -0.03 -35.0 \n", - "2023-10-19 1.01 0.0 -69.98 -0.02 -70.0 \n", - "2023-10-20 1.19 0.0 -37.52 0.02 -37.5 \n", - "\n", - " Price \n", - "Datetime \n", - "2023-08-17 200.0 \n", - "2023-08-18 182.5 \n", - "2023-08-21 237.5 \n", - "2023-08-22 232.5 \n", - "2023-08-23 245.0 \n", - "2023-08-24 232.5 \n", - "2023-08-25 255.0 \n", - "2023-08-28 257.5 \n", - "2023-08-29 305.0 \n", - "2023-08-30 305.0 \n", - "2023-08-31 305.0 \n", - "2023-09-01 272.5 \n", - "2023-09-04 272.5 \n", - "2023-09-05 300.0 \n", - "2023-09-06 287.5 \n", - "2023-09-07 285.0 \n", - "2023-09-08 280.0 \n", - "2023-09-11 342.5 \n", - "2023-09-12 325.0 \n", - "2023-09-13 340.0 \n", - "2023-09-14 357.5 \n", - "2023-09-15 345.0 \n", - "2023-09-18 482.5 \n", - "2023-09-19 325.0 \n", - "2023-09-20 302.5 \n", - "2023-09-21 302.5 \n", - "2023-09-22 275.0 \n", - "2023-09-25 280.0 \n", - "2023-09-26 270.0 \n", - "2023-09-27 307.5 \n", - "2023-09-28 275.0 \n", - "2023-09-29 285.0 \n", - "2023-10-02 287.5 \n", - "2023-10-03 282.5 \n", - "2023-10-04 315.0 \n", - "2023-10-05 310.0 \n", - "2023-10-06 315.0 \n", - "2023-10-09 315.0 \n", - "2023-10-10 322.5 \n", - "2023-10-11 320.0 \n", - "2023-10-12 310.0 \n", - "2023-10-13 290.0 \n", - "2023-10-16 292.5 \n", - "2023-10-17 300.0 \n", - "2023-10-18 265.0 \n", - "2023-10-19 195.0 \n", - "2023-10-20 157.5 " - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "att['total'].round(2)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "CallVertical(AAPL, Build On: 2023-10-20 16:00:00)" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "structure = _create_object_from_id(id, end)\n", - "structure" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Start: 2023-08-15 00:00:00, End: 2023-10-24 00:00:00, ts_start: 2023-08-17, ts_end: 2023-10-20\n", - "Start: 2023-08-15 00:00:00, End: 2023-10-24 00:00:00, ts_start: 2023-08-17, ts_end: 2023-10-20\n", - "Start: 2023-08-15 00:00:00, End: 2023-10-24 00:00:00, ts_start: 2023-08-17, ts_end: 2023-10-20\n", - "Successfully updated column0620C230: 0\r" - ] - }, - { - "data": { - "text/plain": [ - "{'long': [ Delta_PnL Gamma_PnL Vega_PnL Volga_PnL Theta_PnL Rho_PnL \\\n", - " Datetime \n", - " 2023-08-17 -95.424394 2.175902 18.311434 -0.710280 -2.259594 -0.687584 \n", - " 2023-08-18 17.442612 0.078586 7.247356 -0.280551 -2.192072 0.000000 \n", - " 2023-08-21 48.556402 0.595427 -8.305251 0.329817 -6.648348 0.187681 \n", - " 2023-08-22 50.962847 0.634130 11.438025 -0.446363 -2.253189 1.439467 \n", - " 2023-08-23 146.645544 4.944698 14.164581 -0.558737 -2.313132 0.000000 \n", - " 2023-08-24 -191.222475 7.299935 2.725695 -0.111858 -2.449952 0.858026 \n", - " 2023-08-25 83.116370 1.618543 28.446920 -1.102303 -2.304150 1.164858 \n", - " 2023-08-28 61.625467 0.803402 44.585741 -1.752159 -7.219963 0.816240 \n", - " 2023-08-29 158.601845 4.880075 -75.562684 3.289679 -2.499967 -0.315829 \n", - " 2023-08-30 148.879695 4.017569 1.064303 -0.044685 -2.552835 -0.562531 \n", - " 2023-08-31 9.771676 0.015499 -13.228121 0.570801 -2.656917 -2.037863 \n", - " 2023-09-01 70.593027 0.812267 -3.471638 0.149307 -2.649552 -3.597175 \n", - " 2023-09-04 0.000000 0.000000 0.000000 0.000000 -8.059947 0.000000 \n", - " 2023-09-05 10.851792 0.018505 16.765426 -0.725069 -2.688609 1.223727 \n", - " 2023-09-06 -308.792230 14.828560 16.645541 -0.723223 -2.711919 2.702550 \n", - " 2023-09-07 -220.680062 9.291701 -2.481028 0.103870 -2.532097 -1.839134 \n", - " 2023-09-08 23.360792 0.125354 -12.779187 0.522808 -2.356877 0.967102 \n", - " 2023-09-11 44.768732 0.456301 -13.918321 0.570903 -7.102971 0.000000 \n", - " 2023-09-12 -117.732944 3.088910 -8.575807 0.351605 -2.393575 1.190958 \n", - " 2023-09-13 -75.980261 1.445897 -34.798110 1.447936 -2.286747 0.000000 \n", - " 2023-09-14 52.822410 0.783996 -21.500350 0.869630 -2.179295 -0.873243 \n", - " 2023-09-15 -25.721786 0.180061 26.466747 -0.999428 -2.206934 0.269505 \n", - " 2023-09-18 103.695884 2.935285 11.583638 -0.447526 -6.633261 0.177350 \n", - " 2023-09-19 40.755834 0.404630 20.356645 -0.799546 -2.325321 0.944373 \n", - " 2023-09-20 -136.000075 4.256801 8.087155 -0.326132 -2.385127 0.484495 \n", - " 2023-09-21 -55.656781 0.805594 16.971025 -0.660158 -2.273870 -0.894366 \n", - " 2023-09-22 29.921188 0.243298 -0.721708 0.028579 -2.236361 0.000000 \n", - " 2023-09-25 45.556559 0.548274 -10.655763 0.430142 -6.797533 0.703338 \n", - " 2023-09-26 -148.137539 5.618518 11.096270 -0.437742 -2.301074 1.076927 \n", - " 2023-09-27 -51.034399 0.768868 -8.031393 0.319030 -2.171644 0.407919 \n", - " 2023-09-28 8.376962 0.022226 -2.217122 0.086262 -2.108690 -1.720032 \n", - " 2023-09-29 16.785714 0.089022 49.672383 -1.724516 -2.111176 -0.627006 \n", - " 2023-10-02 84.411868 2.094353 -42.311250 1.796751 -6.561358 1.204979 \n", - " 2023-10-03 -46.273335 0.602307 27.795140 -1.050373 -2.231592 2.096623 \n", - " 2023-10-04 42.522516 0.519943 -11.051905 0.445235 -2.220193 -0.408227 \n", - " 2023-10-05 42.988332 0.514676 6.897453 -0.270967 -2.251497 -0.836370 \n", - " 2023-10-06 90.925846 2.191036 -1.272850 0.051103 -2.301463 1.979204 \n", - " 2023-10-09 55.408291 0.742084 8.337200 -0.336604 -7.185076 0.000000 \n", - " 2023-10-10 -22.748943 0.118552 -23.546760 0.992531 -2.455814 -2.335942 \n", - " 2023-10-11 52.432808 0.660320 -28.080640 1.182103 -2.406420 1.099502 \n", - " 2023-10-12 34.414774 0.278042 -2.682727 0.110370 -2.428382 0.000000 \n", - " 2023-10-13 -71.364652 1.163370 22.851069 -0.923980 -2.457044 -0.668069 \n", - " 2023-10-16 -4.850480 0.005640 -16.088716 0.669818 -7.249151 0.000000 \n", - " 2023-10-17 -58.005072 0.828550 6.960102 -0.281752 -2.395899 1.087713 \n", - " 2023-10-18 -47.104571 0.575322 16.037691 -0.635655 -2.351318 -0.874102 \n", - " 2023-10-19 -13.380469 0.048107 10.421395 -0.413285 -2.320796 -1.696814 \n", - " 2023-10-20 -90.324295 2.206780 2.126723 -0.085277 -2.315169 -0.840251 \n", - " \n", - " Vanna_PnL Dividend_PnL Total_PnL Unexplained_PnL Actual_PnL \\\n", - " Datetime \n", - " 2023-08-17 -0.519881 0.0 -79.114396 -0.885604 -80.0 \n", - " 2023-08-18 0.041023 0.0 22.336954 0.163046 22.5 \n", - " 2023-08-21 -0.126532 0.0 34.589195 0.410805 35.0 \n", - " 2023-08-22 0.172413 0.0 61.947330 0.552670 62.5 \n", - " 2023-08-23 0.549000 0.0 163.431954 1.568046 165.0 \n", - " 2023-08-24 -0.124339 0.0 -183.024967 -1.975033 -185.0 \n", - " 2023-08-25 0.655635 0.0 111.595874 0.904126 112.5 \n", - " 2023-08-28 0.664818 0.0 99.523546 0.476454 100.0 \n", - " 2023-08-29 -2.594169 0.0 85.798950 1.701050 87.5 \n", - " 2023-08-30 0.029126 0.0 150.830640 1.669360 152.5 \n", - " 2023-08-31 -0.020721 0.0 -7.585646 0.085646 -7.5 \n", - " 2023-09-01 -0.038349 0.0 61.797887 0.702113 62.5 \n", - " 2023-09-04 0.000000 0.0 -8.059947 8.059947 0.0 \n", - " 2023-09-05 0.026954 0.0 25.472726 -7.972726 17.5 \n", - " 2023-09-06 -0.837452 0.0 -278.888173 -3.611827 -282.5 \n", - " 2023-09-07 0.122807 0.0 -218.013941 -1.986059 -220.0 \n", - " 2023-09-08 -0.082548 0.0 9.757445 0.242555 10.0 \n", - " 2023-09-11 -0.168087 0.0 24.606558 0.393442 25.0 \n", - " 2023-09-12 0.274382 0.0 -123.796471 -1.203529 -125.0 \n", - " 2023-09-13 0.843407 0.0 -109.327877 -0.672123 -110.0 \n", - " 2023-09-14 -0.402962 0.0 29.520185 0.479815 30.0 \n", - " 2023-09-15 -0.231192 0.0 -2.243027 -0.256973 -2.5 \n", - " 2023-09-18 0.399314 0.0 111.710684 0.789316 112.5 \n", - " 2023-09-19 0.239307 0.0 59.575922 0.424078 60.0 \n", - " 2023-09-20 -0.311125 0.0 -126.194009 -1.305991 -127.5 \n", - " 2023-09-21 -0.310647 0.0 -42.019204 -0.480796 -42.5 \n", - " 2023-09-22 -0.007445 0.0 27.227551 0.272449 27.5 \n", - " 2023-09-25 -0.160566 0.0 29.624451 0.375549 30.0 \n", - " 2023-09-26 -0.543086 0.0 -133.627724 -1.372276 -135.0 \n", - " 2023-09-27 0.161557 0.0 -59.580063 -0.419937 -60.0 \n", - " 2023-09-28 -0.007870 0.0 2.431736 0.068264 2.5 \n", - " 2023-09-29 0.345415 0.0 62.429836 0.070164 62.5 \n", - " 2023-10-02 -1.378701 0.0 39.256641 0.743359 40.0 \n", - " 2023-10-03 -0.467609 0.0 -19.528840 -0.471160 -20.0 \n", - " 2023-10-04 -0.175216 0.0 29.632153 0.367847 30.0 \n", - " 2023-10-05 0.104812 0.0 47.146439 0.353561 47.5 \n", - " 2023-10-06 -0.037841 0.0 91.535036 0.964964 92.5 \n", - " 2023-10-09 0.133485 0.0 57.099380 0.400620 57.5 \n", - " 2023-10-10 0.148116 0.0 -49.828261 -0.171739 -50.0 \n", - " 2023-10-11 -0.422987 0.0 24.464687 0.535313 25.0 \n", - " 2023-10-12 -0.025295 0.0 29.666782 0.333218 30.0 \n", - " 2023-10-13 -0.439269 0.0 -51.838575 -0.661425 -52.5 \n", - " 2023-10-16 0.022551 0.0 -27.490338 -0.009662 -27.5 \n", - " 2023-10-17 -0.121414 0.0 -51.927772 -0.572228 -52.5 \n", - " 2023-10-18 -0.243487 0.0 -34.596119 -0.403881 -35.0 \n", - " 2023-10-19 -0.047098 0.0 -7.388960 -0.111040 -7.5 \n", - " 2023-10-20 -0.067295 0.0 -89.298784 -0.701216 -90.0 \n", - " \n", - " Price \n", - " Datetime \n", - " 2023-08-17 1157.5 \n", - " 2023-08-18 1180.0 \n", - " 2023-08-21 1215.0 \n", - " 2023-08-22 1277.5 \n", - " 2023-08-23 1442.5 \n", - " 2023-08-24 1257.5 \n", - " 2023-08-25 1370.0 \n", - " 2023-08-28 1470.0 \n", - " 2023-08-29 1557.5 \n", - " 2023-08-30 1710.0 \n", - " 2023-08-31 1702.5 \n", - " 2023-09-01 1765.0 \n", - " 2023-09-04 1765.0 \n", - " 2023-09-05 1782.5 \n", - " 2023-09-06 1500.0 \n", - " 2023-09-07 1280.0 \n", - " 2023-09-08 1290.0 \n", - " 2023-09-11 1315.0 \n", - " 2023-09-12 1190.0 \n", - " 2023-09-13 1080.0 \n", - " 2023-09-14 1110.0 \n", - " 2023-09-15 1107.5 \n", - " 2023-09-18 1220.0 \n", - " 2023-09-19 1280.0 \n", - " 2023-09-20 1152.5 \n", - " 2023-09-21 1110.0 \n", - " 2023-09-22 1137.5 \n", - " 2023-09-25 1167.5 \n", - " 2023-09-26 1032.5 \n", - " 2023-09-27 972.5 \n", - " 2023-09-28 975.0 \n", - " 2023-09-29 1037.5 \n", - " 2023-10-02 1077.5 \n", - " 2023-10-03 1057.5 \n", - " 2023-10-04 1087.5 \n", - " 2023-10-05 1135.0 \n", - " 2023-10-06 1227.5 \n", - " 2023-10-09 1285.0 \n", - " 2023-10-10 1235.0 \n", - " 2023-10-11 1260.0 \n", - " 2023-10-12 1290.0 \n", - " 2023-10-13 1237.5 \n", - " 2023-10-16 1210.0 \n", - " 2023-10-17 1157.5 \n", - " 2023-10-18 1122.5 \n", - " 2023-10-19 1115.0 \n", - " 2023-10-20 1025.0 ],\n", - " 'short': [ Delta_PnL Gamma_PnL Vega_PnL Volga_PnL Theta_PnL Rho_PnL \\\n", - " Datetime \n", - " 2023-08-17 88.474217 -2.132289 -8.008020 0.298240 2.164898 0.642328 \n", - " 2023-08-18 -16.081917 -0.077123 -13.690449 0.495560 2.084798 -0.000000 \n", - " 2023-08-21 -44.923653 -0.583798 7.354776 -0.279403 6.350300 -0.174993 \n", - " 2023-08-22 -47.194665 -0.622415 -2.534054 0.095133 2.155292 -1.343433 \n", - " 2023-08-23 -135.672087 -4.883918 -5.166935 0.195126 2.208234 -0.000000 \n", - " 2023-08-24 177.336240 -7.244346 -44.945910 1.671843 2.342675 -0.803812 \n", - " 2023-08-25 -77.711731 -1.579214 19.259259 -0.759115 2.231870 -1.094770 \n", - " 2023-08-28 -56.940543 -0.799347 -10.605386 0.404287 6.868219 -0.762344 \n", - " 2023-08-29 -145.734791 -4.932896 7.099618 -0.279945 2.354722 0.294461 \n", - " 2023-08-30 -139.382881 -3.977671 12.023550 -0.485582 2.474453 0.530552 \n", - " 2023-08-31 -9.150481 -0.015464 20.554485 -0.848414 2.572707 1.925562 \n", - " 2023-09-01 -65.977785 -0.813060 9.248347 -0.378749 2.558351 3.394943 \n", - " 2023-09-04 -0.000000 -0.000000 -0.000000 -0.000000 7.779060 -0.000000 \n", - " 2023-09-05 -10.141312 -0.018583 -37.919726 1.533060 2.594549 -1.155693 \n", - " 2023-09-06 289.948683 -14.739060 -4.113786 0.170114 2.637266 -2.558917 \n", - " 2023-09-07 205.469708 -9.204516 -5.267737 0.208336 2.434975 1.728015 \n", - " 2023-09-08 -21.671604 -0.123289 18.771457 -0.743118 2.258897 -0.904328 \n", - " 2023-09-11 -41.441505 -0.450056 10.727846 -0.419623 6.787704 -0.000000 \n", - " 2023-09-12 109.113420 -3.040699 7.171799 -0.280350 2.291906 -1.113111 \n", - " 2023-09-13 70.170838 -1.416916 27.810107 -1.110226 2.181421 -0.000000 \n", - " 2023-09-14 -48.681735 -0.764825 24.964872 -0.984721 2.076085 0.810589 \n", - " 2023-09-15 23.670502 -0.175927 -26.786751 0.943741 2.098979 -0.249948 \n", - " 2023-09-18 -95.532878 -2.871445 -12.022779 0.438449 6.314478 -0.164636 \n", - " 2023-09-19 -37.696797 -0.397078 -13.174512 0.492947 2.223871 -0.880260 \n", - " 2023-09-20 125.784080 -4.186540 -21.353440 0.799394 2.278899 -0.451951 \n", - " 2023-09-21 51.540154 -0.785881 -1.798216 0.068086 2.177950 0.833850 \n", - " 2023-09-22 -27.519821 -0.238308 -11.923974 0.437129 2.122505 -0.000000 \n", - " 2023-09-25 -42.154041 -0.535523 15.029857 -0.588084 6.502353 -0.655363 \n", - " 2023-09-26 136.882147 -5.488762 23.391386 -0.932283 2.197592 -1.002695 \n", - " 2023-09-27 46.252272 -0.755035 -26.572820 0.911559 2.023601 -0.373886 \n", - " 2023-09-28 -7.699598 -0.021569 6.933191 -0.261752 2.002002 1.591882 \n", - " 2023-09-29 -15.390014 -0.086527 -4.618709 0.168246 1.998229 0.579211 \n", - " 2023-10-02 -76.063213 -2.070599 6.229866 -0.235245 6.064500 -1.100068 \n", - " 2023-10-03 42.402685 -0.589242 -36.878949 1.266204 2.109265 -1.938486 \n", - " 2023-10-04 -39.143319 -0.507299 12.771186 -0.496795 2.110195 0.378653 \n", - " 2023-10-05 -39.560391 -0.503118 -7.687567 0.285804 2.139318 0.775791 \n", - " 2023-10-06 -83.854610 -2.146523 1.549261 -0.059352 2.192187 -1.839818 \n", - " 2023-10-09 -51.235580 -0.729303 -7.188353 0.275577 6.864018 -0.000000 \n", - " 2023-10-10 21.065896 -0.116672 20.329445 -0.821181 2.349921 2.181040 \n", - " 2023-10-11 -48.495715 -0.648762 26.486852 -1.074540 2.300998 -1.025063 \n", - " 2023-10-12 -31.839153 -0.273321 5.246609 -0.206396 2.323887 -0.000000 \n", - " 2023-10-13 66.015753 -1.144446 -22.286889 0.847324 2.350580 0.623115 \n", - " 2023-10-16 4.482298 -0.005541 14.178623 -0.564687 6.924368 -0.000000 \n", - " 2023-10-17 53.556058 -0.812271 -4.827602 0.185831 2.287639 -1.012313 \n", - " 2023-10-18 43.394804 -0.563269 -11.899694 0.447684 2.238810 0.811760 \n", - " 2023-10-19 12.299092 -0.047105 -14.235268 0.528739 2.203047 1.572772 \n", - " 2023-10-20 83.165386 -2.154826 -4.997157 0.189377 2.202544 0.779763 \n", - " \n", - " Vanna_PnL Dividend_PnL Total_PnL Unexplained_PnL \\\n", - " Datetime \n", - " 2023-08-17 0.254150 -0.0 81.693523 0.806477 \n", - " 2023-08-18 -0.086743 -0.0 -27.355873 -0.144127 \n", - " 2023-08-21 0.125311 -0.0 -32.131461 -0.368539 \n", - " 2023-08-22 -0.042970 -0.0 -49.487111 -0.512889 \n", - " 2023-08-23 -0.228599 -0.0 -143.548178 -1.451822 \n", - " 2023-08-24 2.303628 -0.0 130.660317 1.839683 \n", - " 2023-08-25 0.497857 -0.0 -59.155844 -0.844156 \n", - " 2023-08-28 -0.183211 -0.0 -62.018324 -0.481676 \n", - " 2023-08-29 0.282990 -0.0 -140.915841 -1.584159 \n", - " 2023-08-30 0.379988 -0.0 -128.437591 -1.562409 \n", - " 2023-08-31 0.037651 -0.0 15.076045 -0.076045 \n", - " 2023-09-01 0.120557 -0.0 -51.847396 -0.652604 \n", - " 2023-09-04 -0.000000 -0.0 7.779060 -7.779060 \n", - " 2023-09-05 -0.071876 -0.0 -45.179581 7.679581 \n", - " 2023-09-06 0.238450 -0.0 271.582750 3.417250 \n", - " 2023-09-07 0.294851 -0.0 195.663632 1.836368 \n", - " 2023-09-08 0.136595 -0.0 -2.275391 -0.224609 \n", - " 2023-09-11 0.146697 -0.0 -24.648938 -0.351062 \n", - " 2023-09-12 -0.258127 -0.0 113.884838 1.115162 \n", - " 2023-09-13 -0.752261 -0.0 96.882963 0.617037 \n", - " 2023-09-14 0.522925 -0.0 -22.056810 -0.443190 \n", - " 2023-09-15 0.262011 -0.0 -0.237393 0.237393 \n", - " 2023-09-18 -0.465784 -0.0 -104.304594 -0.695406 \n", - " 2023-09-19 -0.174973 -0.0 -49.606802 -0.393198 \n", - " 2023-09-20 0.920501 -0.0 103.790943 1.209057 \n", - " 2023-09-21 0.036645 -0.0 52.072588 0.427412 \n", - " 2023-09-22 -0.137389 -0.0 -37.259858 -0.240142 \n", - " 2023-09-25 0.252459 -0.0 -22.148343 -0.351657 \n", - " 2023-09-26 -1.283596 -0.0 153.763791 1.236209 \n", - " 2023-09-27 0.600214 -0.0 22.085905 0.414095 \n", - " 2023-09-28 0.027187 -0.0 2.571343 -0.071343 \n", - " 2023-09-29 -0.036102 -0.0 -17.385667 -0.114333 \n", - " 2023-10-02 0.231624 -0.0 -66.943135 -0.556865 \n", - " 2023-10-03 0.693131 -0.0 7.064608 0.435392 \n", - " 2023-10-04 0.225389 -0.0 -24.661990 -0.338010 \n", - " 2023-10-05 -0.130542 -0.0 -44.680706 -0.319294 \n", - " 2023-10-06 0.051704 -0.0 -84.107152 -0.892848 \n", - " 2023-10-09 -0.129847 -0.0 -52.143489 -0.356511 \n", - " 2023-10-10 -0.144138 -0.0 44.844311 0.155689 \n", - " 2023-10-11 0.450441 -0.0 -22.005788 -0.494212 \n", - " 2023-10-12 0.056101 -0.0 -24.692272 -0.307728 \n", - " 2023-10-13 0.484835 -0.0 46.890272 0.609728 \n", - " 2023-10-16 -0.022426 -0.0 24.992636 0.007364 \n", - " 2023-10-17 0.094757 -0.0 49.472099 0.527901 \n", - " 2023-10-18 0.202957 -0.0 34.633053 0.366947 \n", - " 2023-10-19 0.072166 -0.0 2.393444 0.106556 \n", - " 2023-10-20 0.175900 -0.0 79.360987 0.639013 \n", - " \n", - " Actual_PnL Price \n", - " Datetime \n", - " 2023-08-17 8.250000e+01 -1027.5 \n", - " 2023-08-18 -2.750000e+01 -1055.0 \n", - " 2023-08-21 -3.250000e+01 -1087.5 \n", - " 2023-08-22 -5.000000e+01 -1137.5 \n", - " 2023-08-23 -1.450000e+02 -1282.5 \n", - " 2023-08-24 1.325000e+02 -1150.0 \n", - " 2023-08-25 -6.000000e+01 -1210.0 \n", - " 2023-08-28 -6.250000e+01 -1272.5 \n", - " 2023-08-29 -1.425000e+02 -1415.0 \n", - " 2023-08-30 -1.300000e+02 -1545.0 \n", - " 2023-08-31 1.500000e+01 -1530.0 \n", - " 2023-09-01 -5.250000e+01 -1582.5 \n", - " 2023-09-04 -0.000000e+00 -1582.5 \n", - " 2023-09-05 -3.750000e+01 -1620.0 \n", - " 2023-09-06 2.750000e+02 -1345.0 \n", - " 2023-09-07 1.975000e+02 -1147.5 \n", - " 2023-09-08 -2.500000e+00 -1150.0 \n", - " 2023-09-11 -2.500000e+01 -1175.0 \n", - " 2023-09-12 1.150000e+02 -1060.0 \n", - " 2023-09-13 9.750000e+01 -962.5 \n", - " 2023-09-14 -2.250000e+01 -985.0 \n", - " 2023-09-15 1.776357e-13 -985.0 \n", - " 2023-09-18 -1.050000e+02 -1090.0 \n", - " 2023-09-19 -5.000000e+01 -1140.0 \n", - " 2023-09-20 1.050000e+02 -1035.0 \n", - " 2023-09-21 5.250000e+01 -982.5 \n", - " 2023-09-22 -3.750000e+01 -1020.0 \n", - " 2023-09-25 -2.250000e+01 -1042.5 \n", - " 2023-09-26 1.550000e+02 -887.5 \n", - " 2023-09-27 2.250000e+01 -865.0 \n", - " 2023-09-28 2.500000e+00 -862.5 \n", - " 2023-09-29 -1.750000e+01 -880.0 \n", - " 2023-10-02 -6.750000e+01 -947.5 \n", - " 2023-10-03 7.500000e+00 -940.0 \n", - " 2023-10-04 -2.500000e+01 -965.0 \n", - " 2023-10-05 -4.500000e+01 -1010.0 \n", - " 2023-10-06 -8.500000e+01 -1095.0 \n", - " 2023-10-09 -5.250000e+01 -1147.5 \n", - " 2023-10-10 4.500000e+01 -1102.5 \n", - " 2023-10-11 -2.250000e+01 -1125.0 \n", - " 2023-10-12 -2.500000e+01 -1150.0 \n", - " 2023-10-13 4.750000e+01 -1102.5 \n", - " 2023-10-16 2.500000e+01 -1077.5 \n", - " 2023-10-17 5.000000e+01 -1027.5 \n", - " 2023-10-18 3.500000e+01 -992.5 \n", - " 2023-10-19 2.500000e+00 -990.0 \n", - " 2023-10-20 8.000000e+01 -910.0 ],\n", - " 'total': Delta_PnL Gamma_PnL Vega_PnL Volga_PnL Theta_PnL Rho_PnL \\\n", - " Datetime \n", - " 2023-08-17 -6.950176 0.043613 10.303414 -0.412040 -0.094696 -0.045257 \n", - " 2023-08-18 1.360695 0.001463 -6.443093 0.215008 -0.107274 0.000000 \n", - " 2023-08-21 3.632749 0.011629 -0.950476 0.050414 -0.298048 0.012688 \n", - " 2023-08-22 3.768182 0.011715 8.903971 -0.351230 -0.097897 0.096034 \n", - " 2023-08-23 10.973457 0.060780 8.997646 -0.363610 -0.104898 0.000000 \n", - " 2023-08-24 -13.886235 0.055589 -42.220215 1.559985 -0.107277 0.054215 \n", - " 2023-08-25 5.404640 0.039329 47.706179 -1.861418 -0.072280 0.070088 \n", - " 2023-08-28 4.684923 0.004055 33.980356 -1.347871 -0.351743 0.053896 \n", - " 2023-08-29 12.867054 -0.052821 -68.463065 3.009734 -0.145245 -0.021368 \n", - " 2023-08-30 9.496814 0.039897 13.087853 -0.530268 -0.078383 -0.031979 \n", - " 2023-08-31 0.621195 0.000035 7.326364 -0.277613 -0.084210 -0.112301 \n", - " 2023-09-01 4.615242 -0.000793 5.776709 -0.229442 -0.091200 -0.202232 \n", - " 2023-09-04 0.000000 0.000000 0.000000 0.000000 -0.280887 0.000000 \n", - " 2023-09-05 0.710480 -0.000077 -21.154300 0.807990 -0.094060 0.068033 \n", - " 2023-09-06 -18.843547 0.089500 12.531755 -0.553109 -0.074653 0.143633 \n", - " 2023-09-07 -15.210354 0.087186 -7.748765 0.312206 -0.097122 -0.111119 \n", - " 2023-09-08 1.689188 0.002064 5.992270 -0.220309 -0.097980 0.062774 \n", - " 2023-09-11 3.327227 0.006245 -3.190475 0.151280 -0.315267 0.000000 \n", - " 2023-09-12 -8.619524 0.048212 -1.404008 0.071254 -0.101669 0.077847 \n", - " 2023-09-13 -5.809423 0.028981 -6.988003 0.337710 -0.105326 0.000000 \n", - " 2023-09-14 4.140675 0.019171 3.464521 -0.115091 -0.103210 -0.062654 \n", - " 2023-09-15 -2.051284 0.004134 -0.320004 -0.055687 -0.107955 0.019557 \n", - " 2023-09-18 8.163006 0.063841 -0.439141 -0.009077 -0.318783 0.012713 \n", - " 2023-09-19 3.059037 0.007552 7.182133 -0.306599 -0.101450 0.064113 \n", - " 2023-09-20 -10.215996 0.070261 -13.266285 0.473262 -0.106228 0.032543 \n", - " 2023-09-21 -4.116627 0.019713 15.172808 -0.592072 -0.095920 -0.060517 \n", - " 2023-09-22 2.401367 0.004989 -12.645681 0.465708 -0.113856 0.000000 \n", - " 2023-09-25 3.402518 0.012750 4.374094 -0.157942 -0.295180 0.047975 \n", - " 2023-09-26 -11.255391 0.129757 34.487657 -1.370025 -0.103481 0.074232 \n", - " 2023-09-27 -4.782127 0.013833 -34.604213 1.230589 -0.148042 0.034033 \n", - " 2023-09-28 0.677363 0.000657 4.716069 -0.175491 -0.106688 -0.128150 \n", - " 2023-09-29 1.395700 0.002496 45.053673 -1.556271 -0.112947 -0.047795 \n", - " 2023-10-02 8.348654 0.023754 -36.081384 1.561506 -0.496858 0.104911 \n", - " 2023-10-03 -3.870650 0.013065 -9.083809 0.215831 -0.122327 0.158137 \n", - " 2023-10-04 3.379197 0.012644 1.719281 -0.051560 -0.109998 -0.029574 \n", - " 2023-10-05 3.427940 0.011558 -0.790114 0.014837 -0.112179 -0.060579 \n", - " 2023-10-06 7.071236 0.044512 0.276411 -0.008249 -0.109276 0.139387 \n", - " 2023-10-09 4.172711 0.012781 1.148847 -0.061028 -0.321058 0.000000 \n", - " 2023-10-10 -1.683048 0.001879 -3.217315 0.171349 -0.105893 -0.154902 \n", - " 2023-10-11 3.937094 0.011559 -1.593788 0.107563 -0.105423 0.074439 \n", - " 2023-10-12 2.575622 0.004721 2.563882 -0.096026 -0.104495 0.000000 \n", - " 2023-10-13 -5.348899 0.018924 0.564180 -0.076656 -0.106464 -0.044954 \n", - " 2023-10-16 -0.368182 0.000099 -1.910093 0.105131 -0.324782 0.000000 \n", - " 2023-10-17 -4.449014 0.016278 2.132500 -0.095921 -0.108260 0.075400 \n", - " 2023-10-18 -3.709766 0.012053 4.137997 -0.187971 -0.112508 -0.062342 \n", - " 2023-10-19 -1.081377 0.001002 -3.813872 0.115455 -0.117748 -0.124042 \n", - " 2023-10-20 -7.158909 0.051953 -2.870434 0.104100 -0.112624 -0.060488 \n", - " \n", - " Vanna_PnL Dividend_PnL Total_PnL Unexplained_PnL Actual_PnL \\\n", - " Datetime \n", - " 2023-08-17 -0.265731 0.0 2.579127 -0.079127 2.500000e+00 \n", - " 2023-08-18 -0.045719 0.0 -5.018920 0.018920 -5.000000e+00 \n", - " 2023-08-21 -0.001221 0.0 2.457734 0.042266 2.500000e+00 \n", - " 2023-08-22 0.129444 0.0 12.460219 0.039781 1.250000e+01 \n", - " 2023-08-23 0.320401 0.0 19.883776 0.116224 2.000000e+01 \n", - " 2023-08-24 2.179289 0.0 -52.364650 -0.135350 -5.250000e+01 \n", - " 2023-08-25 1.153492 0.0 52.440031 0.059969 5.250000e+01 \n", - " 2023-08-28 0.481607 0.0 37.505222 -0.005222 3.750000e+01 \n", - " 2023-08-29 -2.311179 0.0 -55.116891 0.116891 -5.500000e+01 \n", - " 2023-08-30 0.409114 0.0 22.393049 0.106951 2.250000e+01 \n", - " 2023-08-31 0.016930 0.0 7.490399 0.009601 7.500000e+00 \n", - " 2023-09-01 0.082208 0.0 9.950491 0.049509 1.000000e+01 \n", - " 2023-09-04 0.000000 0.0 -0.280887 0.280887 0.000000e+00 \n", - " 2023-09-05 -0.044922 0.0 -19.706856 -0.293144 -2.000000e+01 \n", - " 2023-09-06 -0.599003 0.0 -7.305423 -0.194577 -7.500000e+00 \n", - " 2023-09-07 0.417659 0.0 -22.350309 -0.149691 -2.250000e+01 \n", - " 2023-09-08 0.054048 0.0 7.482054 0.017946 7.500000e+00 \n", - " 2023-09-11 -0.021390 0.0 -0.042379 0.042379 1.776357e-13 \n", - " 2023-09-12 0.016255 0.0 -9.911633 -0.088367 -1.000000e+01 \n", - " 2023-09-13 0.091146 0.0 -12.444915 -0.055085 -1.250000e+01 \n", - " 2023-09-14 0.119963 0.0 7.463375 0.036625 7.500000e+00 \n", - " 2023-09-15 0.030819 0.0 -2.480420 -0.019580 -2.500000e+00 \n", - " 2023-09-18 -0.066470 0.0 7.406090 0.093910 7.500000e+00 \n", - " 2023-09-19 0.064334 0.0 9.969119 0.030881 1.000000e+01 \n", - " 2023-09-20 0.609376 0.0 -22.403066 -0.096934 -2.250000e+01 \n", - " 2023-09-21 -0.274002 0.0 10.053384 -0.053384 1.000000e+01 \n", - " 2023-09-22 -0.144834 0.0 -10.032307 0.032307 -1.000000e+01 \n", - " 2023-09-25 0.091893 0.0 7.476109 0.023891 7.500000e+00 \n", - " 2023-09-26 -1.826682 0.0 20.136067 -0.136067 2.000000e+01 \n", - " 2023-09-27 0.761770 0.0 -37.494158 -0.005842 -3.750000e+01 \n", - " 2023-09-28 0.019318 0.0 5.003079 -0.003079 5.000000e+00 \n", - " 2023-09-29 0.309314 0.0 45.044169 -0.044169 4.500000e+01 \n", - " 2023-10-02 -1.147076 0.0 -27.686494 0.186494 -2.750000e+01 \n", - " 2023-10-03 0.225522 0.0 -12.464232 -0.035768 -1.250000e+01 \n", - " 2023-10-04 0.050173 0.0 4.970163 0.029837 5.000000e+00 \n", - " 2023-10-05 -0.025731 0.0 2.465733 0.034267 2.500000e+00 \n", - " 2023-10-06 0.013863 0.0 7.427884 0.072116 7.500000e+00 \n", - " 2023-10-09 0.003637 0.0 4.955891 0.044109 5.000000e+00 \n", - " 2023-10-10 0.003979 0.0 -4.983951 -0.016049 -5.000000e+00 \n", - " 2023-10-11 0.027455 0.0 2.458899 0.041101 2.500000e+00 \n", - " 2023-10-12 0.030806 0.0 4.974510 0.025490 5.000000e+00 \n", - " 2023-10-13 0.045566 0.0 -4.948303 -0.051697 -5.000000e+00 \n", - " 2023-10-16 0.000126 0.0 -2.497702 -0.002298 -2.500000e+00 \n", - " 2023-10-17 -0.026657 0.0 -2.455673 -0.044327 -2.500000e+00 \n", - " 2023-10-18 -0.040529 0.0 0.036934 -0.036934 0.000000e+00 \n", - " 2023-10-19 0.025067 0.0 -4.995516 -0.004484 -5.000000e+00 \n", - " 2023-10-20 0.108605 0.0 -9.937797 -0.062203 -1.000000e+01 \n", - " \n", - " Price \n", - " Datetime \n", - " 2023-08-17 130.0 \n", - " 2023-08-18 125.0 \n", - " 2023-08-21 127.5 \n", - " 2023-08-22 140.0 \n", - " 2023-08-23 160.0 \n", - " 2023-08-24 107.5 \n", - " 2023-08-25 160.0 \n", - " 2023-08-28 197.5 \n", - " 2023-08-29 142.5 \n", - " 2023-08-30 165.0 \n", - " 2023-08-31 172.5 \n", - " 2023-09-01 182.5 \n", - " 2023-09-04 182.5 \n", - " 2023-09-05 162.5 \n", - " 2023-09-06 155.0 \n", - " 2023-09-07 132.5 \n", - " 2023-09-08 140.0 \n", - " 2023-09-11 140.0 \n", - " 2023-09-12 130.0 \n", - " 2023-09-13 117.5 \n", - " 2023-09-14 125.0 \n", - " 2023-09-15 122.5 \n", - " 2023-09-18 130.0 \n", - " 2023-09-19 140.0 \n", - " 2023-09-20 117.5 \n", - " 2023-09-21 127.5 \n", - " 2023-09-22 117.5 \n", - " 2023-09-25 125.0 \n", - " 2023-09-26 145.0 \n", - " 2023-09-27 107.5 \n", - " 2023-09-28 112.5 \n", - " 2023-09-29 157.5 \n", - " 2023-10-02 130.0 \n", - " 2023-10-03 117.5 \n", - " 2023-10-04 122.5 \n", - " 2023-10-05 125.0 \n", - " 2023-10-06 132.5 \n", - " 2023-10-09 137.5 \n", - " 2023-10-10 132.5 \n", - " 2023-10-11 135.0 \n", - " 2023-10-12 140.0 \n", - " 2023-10-13 135.0 \n", - " 2023-10-16 132.5 \n", - " 2023-10-17 130.0 \n", - " 2023-10-18 130.0 \n", - " 2023-10-19 125.0 \n", - " 2023-10-20 115.0 }" - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rt = Calculate.attribution(structure, start, end, method = 'RV', replace = 'default_fill', return_all = True)\n", - "# grt = structure.greeks('greek', '2023-11-14', '2024-07-01', return_all = True)\n", - "rt" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Delta_PnL -11.790617\n", - "Gamma_PnL 4.042348\n", - "Vega_PnL 21.089885\n", - "Volga_PnL -0.343042\n", - "Theta_PnL -27.484506\n", - "Rho_PnL 0.707536\n", - "Vanna_PnL 3.773689\n", - "Dividend_PnL 0.000000\n", - "Total_PnL -10.004708\n", - "Unexplained_PnL 0.004708\n", - "Actual_PnL -10.000000\n", - "dtype: float64" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rt['total'].iloc[:-1, :-1].sum() * quantity" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
OpenHighLowCloseMidpointVolume
Datetime
2023-08-171.551.551.701.701.300-8
2023-08-181.741.161.741.141.250-8
2023-08-210.000.000.000.001.2750
2023-08-221.301.451.301.451.4001
2023-08-232.252.252.022.021.60020
2023-08-240.000.000.000.001.0750
2023-08-2513.0013.3013.0013.101.60025
2023-08-28-12.34-12.34-12.34-12.341.975-1
2023-08-291.471.251.471.251.425-8
2023-08-301.921.601.921.601.650-7
2023-08-3117.0517.0517.0517.051.7252
2023-09-0117.2917.2917.2917.291.8251
2023-09-0417.2917.2917.2917.291.8250
2023-09-051.701.801.701.801.6258
2023-09-062.602.601.111.111.550-68
2023-09-071.650.801.551.501.32526
2023-09-081.501.420.880.881.4002
2023-09-11-11.25-11.50-11.25-11.491.400-203
2023-09-12-0.10-0.101.151.151.300-211
2023-09-131.300.841.061.021.175-3
2023-09-14-10.00-10.04-10.00-10.041.250-3
2023-09-151.201.260.800.801.22534
2023-09-181.621.531.621.301.30088
2023-09-191.451.451.601.601.400-5
2023-09-200.000.000.000.001.1750
2023-09-210.000.000.000.001.2750
2023-09-220.980.980.980.981.175-2
2023-09-2511.5012.0011.3512.001.250116
2023-09-261.251.290.851.101.45071
2023-09-271.401.401.301.301.0753
2023-09-28-8.70-8.70-8.70-8.701.125-1
2023-09-2910.5010.509.759.751.57545
2023-10-020.000.000.000.001.3000
2023-10-030.000.000.000.001.1750
2023-10-040.000.000.000.001.2250
2023-10-0510.6510.7210.6510.721.2503
2023-10-06-10.75-11.00-10.75-11.001.325-3
2023-10-0912.2012.2012.2012.201.3752
2023-10-1012.8012.8012.8012.801.3251
2023-10-11-11.00-11.01-11.00-11.011.350-75
2023-10-120.901.300.650.651.4008
2023-10-130.000.000.000.001.3500
2023-10-160.000.000.000.001.3250
2023-10-17-10.57-10.57-10.20-10.201.300-2
2023-10-18-10.17-10.17-10.17-10.171.300-5
2023-10-191.261.261.271.271.250-1
2023-10-201.601.601.601.601.1501
\n", - "
" - ], - "text/plain": [ - " Open High Low Close Midpoint Volume\n", - "Datetime \n", - "2023-08-17 1.55 1.55 1.70 1.70 1.300 -8\n", - "2023-08-18 1.74 1.16 1.74 1.14 1.250 -8\n", - "2023-08-21 0.00 0.00 0.00 0.00 1.275 0\n", - "2023-08-22 1.30 1.45 1.30 1.45 1.400 1\n", - "2023-08-23 2.25 2.25 2.02 2.02 1.600 20\n", - "2023-08-24 0.00 0.00 0.00 0.00 1.075 0\n", - "2023-08-25 13.00 13.30 13.00 13.10 1.600 25\n", - "2023-08-28 -12.34 -12.34 -12.34 -12.34 1.975 -1\n", - "2023-08-29 1.47 1.25 1.47 1.25 1.425 -8\n", - "2023-08-30 1.92 1.60 1.92 1.60 1.650 -7\n", - "2023-08-31 17.05 17.05 17.05 17.05 1.725 2\n", - "2023-09-01 17.29 17.29 17.29 17.29 1.825 1\n", - "2023-09-04 17.29 17.29 17.29 17.29 1.825 0\n", - "2023-09-05 1.70 1.80 1.70 1.80 1.625 8\n", - "2023-09-06 2.60 2.60 1.11 1.11 1.550 -68\n", - "2023-09-07 1.65 0.80 1.55 1.50 1.325 26\n", - "2023-09-08 1.50 1.42 0.88 0.88 1.400 2\n", - "2023-09-11 -11.25 -11.50 -11.25 -11.49 1.400 -203\n", - "2023-09-12 -0.10 -0.10 1.15 1.15 1.300 -211\n", - "2023-09-13 1.30 0.84 1.06 1.02 1.175 -3\n", - "2023-09-14 -10.00 -10.04 -10.00 -10.04 1.250 -3\n", - "2023-09-15 1.20 1.26 0.80 0.80 1.225 34\n", - "2023-09-18 1.62 1.53 1.62 1.30 1.300 88\n", - "2023-09-19 1.45 1.45 1.60 1.60 1.400 -5\n", - "2023-09-20 0.00 0.00 0.00 0.00 1.175 0\n", - "2023-09-21 0.00 0.00 0.00 0.00 1.275 0\n", - "2023-09-22 0.98 0.98 0.98 0.98 1.175 -2\n", - "2023-09-25 11.50 12.00 11.35 12.00 1.250 116\n", - "2023-09-26 1.25 1.29 0.85 1.10 1.450 71\n", - "2023-09-27 1.40 1.40 1.30 1.30 1.075 3\n", - "2023-09-28 -8.70 -8.70 -8.70 -8.70 1.125 -1\n", - "2023-09-29 10.50 10.50 9.75 9.75 1.575 45\n", - "2023-10-02 0.00 0.00 0.00 0.00 1.300 0\n", - "2023-10-03 0.00 0.00 0.00 0.00 1.175 0\n", - "2023-10-04 0.00 0.00 0.00 0.00 1.225 0\n", - "2023-10-05 10.65 10.72 10.65 10.72 1.250 3\n", - "2023-10-06 -10.75 -11.00 -10.75 -11.00 1.325 -3\n", - "2023-10-09 12.20 12.20 12.20 12.20 1.375 2\n", - "2023-10-10 12.80 12.80 12.80 12.80 1.325 1\n", - "2023-10-11 -11.00 -11.01 -11.00 -11.01 1.350 -75\n", - "2023-10-12 0.90 1.30 0.65 0.65 1.400 8\n", - "2023-10-13 0.00 0.00 0.00 0.00 1.350 0\n", - "2023-10-16 0.00 0.00 0.00 0.00 1.325 0\n", - "2023-10-17 -10.57 -10.57 -10.20 -10.20 1.300 -2\n", - "2023-10-18 -10.17 -10.17 -10.17 -10.17 1.300 -5\n", - "2023-10-19 1.26 1.26 1.27 1.27 1.250 -1\n", - "2023-10-20 1.60 1.60 1.60 1.60 1.150 1" - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "structure.spot(ts = True, ts_start = start, ts_end = end, return_all = False)" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [ - { - "ename": "NameError", - "evalue": "name 'grt' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[36], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m (\u001b[43mgrt\u001b[49m[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mtotal\u001b[39m\u001b[38;5;124m'\u001b[39m]\u001b[38;5;241m*\u001b[39m\u001b[38;5;241m100\u001b[39m)\u001b[38;5;241m.\u001b[39mplot(y \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mMidpoint_delta\u001b[39m\u001b[38;5;124m'\u001b[39m)\n", - "\u001b[0;31mNameError\u001b[0m: name 'grt' is not defined" - ] - } - ], - "source": [ - "(grt['total']*100).plot(y = 'Midpoint_delta')" - ] - }, - { - "cell_type": "code", - "execution_count": 212, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
DeltaGammaThetaRhoVegaVannaVolgaMidpoint_deltaMidpoint_gammaMidpoint_thetaMidpoint_rhoMidpoint_vegaMidpoint_vannaMidpoint_volga
Datetime
2023-11-1452.5592710.405525-6.665496174.847125153.41462739.450651-1149.29411252.5640960.405257-6.668423174.839269153.41322139.438846-1150.825278
2023-11-1551.9955440.398194-6.615940171.830319152.75568741.574112-1024.81363151.9852270.398712-6.610056171.843350152.75822241.602626-1021.293842
2023-11-1654.8871940.394517-6.852899183.353007154.50688728.304318-1495.91130654.9022460.393336-6.866067183.289026154.49892028.314661-1500.739961
2023-11-170.0000000.0000000.0000000.0000000.0000000.0000000.00000052.2802910.405032-6.679414172.447980152.71971640.560585-1068.213245
2023-11-2055.2076720.402129-6.826058183.907490154.09849825.844715-1445.24092955.4536640.381228-7.062921182.685084153.95790626.252212-1532.893757
.............................................
2024-06-2582.5693410.311637-9.422345146.60785780.026553-245.19698573278.13800382.0841810.309366-9.641291145.27873281.464096-230.42367467486.408612
2024-06-2682.8847160.306381-9.439657146.46599779.076598-248.64265875271.66217382.6039060.305220-9.566382145.70264079.922980-239.93526971793.191775
2024-06-2781.2494850.294854-10.327622141.05592483.768133-197.76567855847.05791182.6113030.301840-9.657071144.82395579.805421-236.56403670708.953815
2024-06-2878.1461290.304721-11.297687132.65262490.524531-144.29312135133.21009980.7388490.326650-9.899695139.99177983.835799-209.18218956906.726556
2024-07-010.0000000.0000000.0000000.0000000.0000000.0000000.00000083.9688580.287733-9.523968144.66777475.442594-259.11130681669.520835
\n", - "

165 rows × 14 columns

\n", - "
" - ], - "text/plain": [ - " Delta Gamma Theta Rho Vega \\\n", - "Datetime \n", - "2023-11-14 52.559271 0.405525 -6.665496 174.847125 153.414627 \n", - "2023-11-15 51.995544 0.398194 -6.615940 171.830319 152.755687 \n", - "2023-11-16 54.887194 0.394517 -6.852899 183.353007 154.506887 \n", - "2023-11-17 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "2023-11-20 55.207672 0.402129 -6.826058 183.907490 154.098498 \n", - "... ... ... ... ... ... \n", - "2024-06-25 82.569341 0.311637 -9.422345 146.607857 80.026553 \n", - "2024-06-26 82.884716 0.306381 -9.439657 146.465997 79.076598 \n", - "2024-06-27 81.249485 0.294854 -10.327622 141.055924 83.768133 \n", - "2024-06-28 78.146129 0.304721 -11.297687 132.652624 90.524531 \n", - "2024-07-01 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "\n", - " Vanna Volga Midpoint_delta Midpoint_gamma \\\n", - "Datetime \n", - "2023-11-14 39.450651 -1149.294112 52.564096 0.405257 \n", - "2023-11-15 41.574112 -1024.813631 51.985227 0.398712 \n", - "2023-11-16 28.304318 -1495.911306 54.902246 0.393336 \n", - "2023-11-17 0.000000 0.000000 52.280291 0.405032 \n", - "2023-11-20 25.844715 -1445.240929 55.453664 0.381228 \n", - "... ... ... ... ... \n", - "2024-06-25 -245.196985 73278.138003 82.084181 0.309366 \n", - "2024-06-26 -248.642658 75271.662173 82.603906 0.305220 \n", - "2024-06-27 -197.765678 55847.057911 82.611303 0.301840 \n", - "2024-06-28 -144.293121 35133.210099 80.738849 0.326650 \n", - "2024-07-01 0.000000 0.000000 83.968858 0.287733 \n", - "\n", - " Midpoint_theta Midpoint_rho Midpoint_vega Midpoint_vanna \\\n", - "Datetime \n", - "2023-11-14 -6.668423 174.839269 153.413221 39.438846 \n", - "2023-11-15 -6.610056 171.843350 152.758222 41.602626 \n", - "2023-11-16 -6.866067 183.289026 154.498920 28.314661 \n", - "2023-11-17 -6.679414 172.447980 152.719716 40.560585 \n", - "2023-11-20 -7.062921 182.685084 153.957906 26.252212 \n", - "... ... ... ... ... \n", - "2024-06-25 -9.641291 145.278732 81.464096 -230.423674 \n", - "2024-06-26 -9.566382 145.702640 79.922980 -239.935269 \n", - "2024-06-27 -9.657071 144.823955 79.805421 -236.564036 \n", - "2024-06-28 -9.899695 139.991779 83.835799 -209.182189 \n", - "2024-07-01 -9.523968 144.667774 75.442594 -259.111306 \n", - "\n", - " Midpoint_volga \n", - "Datetime \n", - "2023-11-14 -1150.825278 \n", - "2023-11-15 -1021.293842 \n", - "2023-11-16 -1500.739961 \n", - "2023-11-17 -1068.213245 \n", - "2023-11-20 -1532.893757 \n", - "... ... \n", - "2024-06-25 67486.408612 \n", - "2024-06-26 71793.191775 \n", - "2024-06-27 70708.953815 \n", - "2024-06-28 56906.726556 \n", - "2024-07-01 81669.520835 \n", - "\n", - "[165 rows x 14 columns]" - ] - }, - "execution_count": 212, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "grt['long'][0]*100" - ] - }, - { - "cell_type": "code", - "execution_count": 183, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 183, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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R1lZmff14uJi3nnnHW6++WaeeuopEhISarsZJ8QXn4H+/fuzYMGCSs9bmT9/PvXr16d9+/a10Qy/MWPGDHr27On9PTFhwgTv7w+pTOHkdzRq1Ihdu3axZs0a1q9fz+jRo2nZsiVpaWlcd911xMbGsmjRIgDeeustevXqxaBBg2jcuDHNmzdn4MCBDrfg+PTo0YPu3buTmppK8+bNueWWW9i6dethv1wvvvhiTjnlFNLT0xk0aBC7d+8mJyfHoap9b9myZfzxj3/0/vfUU08xY8YMLrvsMvr27UvDhg3p2LEjgwcP5rPPPqv03h49etC/f3/S09O5+uqradmyJR9//LFDLam+M888kzVr1rB79252797NmjVrvH9BVzjWz8lFF11E9+7dSUlJoV69erXZjOM2d+5cb3s7d+5MYWEhWVlZlba56qqr6NixI02bNuXWW28lPz+/0sC/8vJybrzxRk466STS09OJioqq1TacKF98Brp16wZ4ehsrfPHFF/Tt2xdjTO01xg/06dOH3r17k5qayjXXXENRURHr1693uiy/pMs6v8NaizGGzZs3U1RUxJ/+9KdKr5eUlHh/GW/evJn+/fs7UabPZWdn88Ybb7B+/XoOHDjg/SsoNzfX220NVPq64vJHfn4+jRo1qtV6a0q7du0YPny4dzkqKoq77rqLNWvWVOopcbvdlJaWUlxc7P0F9NvLW61bt2bLli21U7gP1K1bly5dujBv3jystZxyyimHjbc51s9JRkZGrdZ+onbu3Mn69eu56667AM9A+V69ejFnzhzatWvn3e7X3+M6deqQnp7Ojh07vOvCw8Np1qxZ7RXuY774DERGRnLmmWcyd+5cevXqxcaNG9m6dWtIDiT99WchOjqamJgY8vPzHazIfymc/I4dO3aQkpJCUVER9erV48EHHzxsm9jYWADvoLFgMG7cOBo0aMCIESOoV68e1lruvPPOSl3WQKWBjRV/BQXTpMNRUVGH3ZlTVFTEoEGD6N69+2HbB9s01f369WPSpEkAlcYMVDjWz0l0dHSt1Osrc+bMoby8nBEjRnjXWWuJiIio8jwcSWRkZMD3DvjiM9C/f3/uvvtu9uzZw7x582jfvn2lcSuBzhhz2M+9qi5v//bGiqreF2iOte3VpXByFKtWrWLr1q1cdNFFJCUlkZeXh8vlOuKAtmbNmrFy5UrOOuusWq7Utw4cOMDOnTsZMWIEbdu2BWDNmjUOV+U/MjIy2Llz5+/eTvzjjz/Sp0+fSsstWrSo6fJ8qnPnzpSVlWGMoXPnzpVeC9bPSXl5OV988QXXXXcdHTt2rPTaE088wYIFC7w9g+vWrfPeuXLw4EGys7ODptewgi8+A02bNqVly5Z8/vnnLFiw4LAe6EBXt25d8vLyvMuFhYXs2rXLuYJqUU21XeHkZ2VlZeTl5VW6lfjtt9/mlFNOoU+fPhhjyMzM5IknnmDIkCGkpaWxb98+li1bRrdu3WjZsiVXXnklDz30EKmpqfTq1Qu3282yZcu47LLLnG5etcTFxREfH89nn31GvXr1yM3N5dVXX3W6LL9xxRVXMG7cOJKTk+nRowfGGLZs2cK2bdu4+uqrvdt9/fXXZGRk0KZNGxYsWMD69eu55ZZbHKy8+lwuF08//bT3618L1s/Jt99+S0FBAf369fP2ilbo3r07c+fOZciQIQDMnDmT+Ph4EhISeP3114mPj/eOsQgWvvoM9OvXj8mTJxMVFRV056h9+/bMmzePU089lbi4ON54442AuWX8RNVU2xVOfrZ8+XJuuukmwsLCiIuLo1mzZtxwww306dPHe6Lvu+8+pk2bxvPPP8/+/ftJTEykbdu23hH47dq1Y/To0cycOZO3336bmJgY718TgcBaS1hYGC6Xi9tvv53//e9/3HnnnaSnp3PDDTdUeUkrFHXu3Jl7772XmTNn8s477xAWFkajRo3o169fpe0GDRrEwoULmTRpEomJidx+++00btzYoaqP329/QVcI1s/JnDlz6NChQ5Xt7tGjB++++6537NC1117LSy+95L2V+N577w2YOVyqwxefgd69ezNlyhROP/30oLgEXvHzEuCyyy5j165dPPbYY8TGxjJ48OCg7jmpjbbrqcTi9eijj5Kamlqta+oioahinpP//e9/xMXFOV1OQNi1axe33XYb//znPwNugHRVQvnnZW20PTT6neSoDh48yLfffktWVlZQTIgkIv6j4pL566+/TmZmZsAHk1D+eVmbbQ++/keptn/9619s2LCBAQMG0LVrV6fLEZEgsnbtWsaOHUtaWhp33nmn0+WcsFD+eVmbbddlHREREfEruqwjIiIifkXhRERERPyKwomIiIj4FQ2IDTGzZs1iyZIl7Nixg8jISDIzMxkyZAjp6enebUpKSpg6dSoLFy6ktLSUTp06MWzYMO+zczZv3szbb7/N2rVr2b9/PykpKZxzzjlceOGFVR5zzZo1PPjggzRp0oQnnniiNpopIiIBTOEkxGRlZXHeeefRsmVLysvLmTZtGo888ghPPfWU9/knU6ZMYdmyZYwePZrY2FgmTZrE+PHjefjhhwHYuHEjCQkJ3HbbbSQlJbF27Vr++9//4nK5OP/88ysdr6CggIkTJ9KhQ4dKUxyLiIgcicJJiBkzZkyl5VGjRjFs2DA2btzIySefTGFhIXPmzOH222+nffv2AIwcOZK//OUvrFu3jszMzMNmQm3YsCHr1q1j8eLFh4WTF154gdNPPx2Xy1XpkekiIiJHojEnIa6wsBDwPO4dPL0i5eXllSbYadSoEcnJyaxbt+6o+6nYR4W5c+fy008/cdVVV9VA5SIiEqwUTkKY2+3mpZde4qSTTqJp06YA5OXlER4eftiU3AkJCUe8LLN27Vq+/vprzj77bO+67OxsXnvtNW677bbDHhMuIiJyNAonIWzSpEls27aNO+6447j3sXXrVh5//HGuvPJKOnXqBHhCz4QJE7jqqqsqDbQVERE5FhpzEqImTZrEsmXLGDt2LElJSd71iYmJlJWVUVBQUKn3JD8/33u3ToXt27fz8MMPc/bZZ3PFFVd41x86dIgNGzawadMmJk+eDHieYmmt5eqrr+b//u//vONZREREfkvhJMRYa5k8eTJLlizhwQcfJCUlpdLrGRkZhIWFsXLlSnr06AHAzp07yc3NJTMz07vdtm3beOihh+jTpw/XXHNNpX3ExMTw5JNPVlo3e/ZsVq1axejRow87poiIyK8pnISYSZMmsWDBAu655x5iYmK840hiY2OJjIwkNjaWfv36MXXqVOrUqUNsbCyTJ08mMzPTG062bt3KQw89RKdOnRgwYIB3Hy6Xi7p16+JyubxjWCrUrVuXiIiIw9aLiIj8lsJJiJk9ezYADz74YKX1I0eOpG/fvgAMHToUYwzjx4+nrKzMOwlbhUWLFrF//36+/PJLvvzyS+/6Bg0aMHHixBpvg4iIBDc9lVhERET8iu7WEREREb+icCIiIiJ+ReFERERE/IrCiYiIiPgVhRMRERHxKwonIiIi4lcUTkRERMSvKJyIiF/ZtWsXgwYNYt68eU6XIiIO0QyxIkFs3rx5PP/8897liIgI6tSpQ9OmTenSpQtnnXUWMTEx1d7v2rVrWbFiBRdddFGlB0RWx4IFC8jPz+eiiy46rveLSPBSOBEJAYMGDSIlJYXy8nLy8vLIyspiypQpfPDBB9xzzz00a9asWvtbu3YtM2bMoG/fvicUTrZt23ZYOGnQoAGvvPIK4eH68SQSqvSvXyQEdOnShZYtW3qXBw4cyKpVq3jsscd4/PHHefrpp4mMjHSwwl8YY/ymFhFxhsKJSIhq3749V1xxBdOmTWP+/PmcffbZbNmyhffff58ffviBffv2ERsbS5cuXfjjH/9IfHw8ANOnT2fGjBkA3Hrrrd79Pffcc6SkpAAwf/58PvjgA7Zv305kZCSdOnViyJAhJCcnA54HT2ZlZQGeXh345cGRu3bt4tZbb630MMqJEyeyaNEinn76aV588UVWr15NbGwsAwcO5Pzzz2fr1q3873//Y/369cTHx3PttdfSu3fvSu0tKCjgzTffZPHixeTn55OUlET//v255JJLcLk0/E7EnyiciISwM888k2nTpvH9999z9tln8/3337Nr1y769u1LYmIi27dv57PPPmP79u08+uijGGPo3r072dnZfPXVVwwdOtQbWurWrQvAW2+9xRtvvEHPnj3p378/+/fv56OPPuLvf/87jz/+OHFxcVx++eUUFhayZ88ehg4dCkB0dPRRa3W73fzjH/+gbdu2DBkyhAULFjB58mSio6OZNm0aZ5xxBt27d+fTTz/lueeeIzMz0xuWiouLefDBB9m7dy9nn302ycnJrF27lmnTppGXl8f1119fcydZRKpN4UQkhCUlJREbG8tPP/0EwHnnncfFF19caZvWrVvz7LPPsmbNGtq2bUuzZs1o0aIFX331FV27dvUGAIDdu3czffp0Bg8ezOWXX+5d361bN+69914++eQTLr/8cjp27Ej9+vUpKCjgzDPPPKZaS0tLOeOMMxg4cCAAvXv3ZsSIEfzrX//i9ttvp1evXgB07NiRO+64g3nz5nl7Zd5//31ycnJ4/PHHSUtLA+Ccc86hfv36vPvuuwwYMMDbqyMizlNfpkiIi46O5tChQwCVxnqUlJSwf/9+WrduDcCmTZt+d1+LFy/GWkuvXr3Yv3+/97/ExERSU1NZvXr1CdXav39/79dxcXGkp6cTFRVFz549vevT09OJi4tj165d3nWLFi2ibdu2xMXFVaqrQ4cOuN1ufvjhhxOqS0R8Sz0nIiGuqKiIhIQEAA4ePMibb77JwoULyc/Pr7RdYWHh7+4rJycHay1//vOfq3z9RO7AiYiI8F46qhAbG0tSUhLGmMPWHzx40LucnZ3Nli1bGDZsWJX7/m1bRcRZCiciIWzPnj0UFhbSsGFDAJ5++mnWrl3LJZdcQvPmzYmOjvaO9XC73b+7P7fbjTGG++67r8pBpr83ruRojjRo9VgGs1pr6dixI5dcckmVr6enpx93XSLiewonIiFs/vz5AHTu3JmDBw+ycuVKBg0axJVXXundJjs7+7D3/banokJqairWWlJSUvzqF37Dhg0pKiqiY8eOTpciIsdAY05EQtSqVauYOXMmKSkp9O7d29sDYa2ttN0HH3xw2HujoqKAwy/1dOvWDZfLxYwZMw7bj7WWAwcOeJejo6OP6VKRL/Ts2ZN169axfPnyw14rKCigvLy8VuoQkWOjnhOREPDdd9+xY8cO3G43eXl5rF69mu+//57k5GTuueceIiMjiYyMpG3btrz77ruUl5dTv359VqxYUWlgaYWMjAwApk2bxumnn05YWBinnnoqqampXH311bz22mvs3r2brl27Eh0dza5du1i6dKl3XpGKfSxcuJApU6bQsmVLoqOjOe2002qk/ZdccgnffPMN48aNo0+fPmRkZFBcXMzWrVtZtGgREydOPGw8i4g4R+FEJARMnz4d8AxIrXi2ztChQw97ts7tt9/O5MmT+eSTT7zjNO6//35GjBhRaX+tWrVi8ODBfPrppyxfvhxrLc899xzR0dFcdtllpKWl8cEHH/Dmm28CkJycTMeOHSuFj3PPPZfNmzczb948PvjgAxo0aFBj4SQqKoqxY8fy1ltvsWjRIubPn09MTAzp6ekMGjSI2NjYGjmuiBwfY3/b9yoiIiLiII05EREREb+icCIiIiJ+ReFERERE/IrCiYiIiPgVhRMRERHxKwonIiIi4lcUTkRERMSvKJyIiIiIX1E4EREREb+icCIiIiJ+ReFERERE/IrCiYiIiPgVhRMRERHxK/8fUsyvcGbTmHUAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "rt['total'].cumsum().plot(y = 'Theta_PnL')" - ] - }, - { - "cell_type": "code", - "execution_count": 151, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
OpenHighLowCloseMidpointVolume
Datetime
2023-07-052.402.402.752.372.00021
2023-07-061.110.732.741.261.925-28
2023-07-070.800.803.202.801.600-65
2023-07-101.800.982.171.701.5758
2023-07-111.500.602.401.301.825-33
2023-07-12-35.02-35.02-33.54-33.551.875-31
2023-07-133.602.073.602.071.8002
2023-07-143.25-1.333.251.221.875-35
2023-07-172.811.242.553.462.325-34
2023-07-181.101.551.951.532.175-322
2023-07-192.762.170.581.902.92583
2023-07-201.591.850.850.951.400-145
2023-07-212.301.553.224.151.550-9
2023-07-244.021.704.021.851.675-12
2023-07-252.872.192.872.191.650-105
2023-07-263.052.653.353.351.375-5
2023-07-270.720.721.240.641.525-30
2023-07-281.151.401.151.401.725-4
2023-07-312.250.732.250.731.72532
2023-08-011.500.932.132.131.575-12
2023-08-021.170.892.631.281.450-27
\n", - "
" - ], - "text/plain": [ - " Open High Low Close Midpoint Volume\n", - "Datetime \n", - "2023-07-05 2.40 2.40 2.75 2.37 2.000 21\n", - "2023-07-06 1.11 0.73 2.74 1.26 1.925 -28\n", - "2023-07-07 0.80 0.80 3.20 2.80 1.600 -65\n", - "2023-07-10 1.80 0.98 2.17 1.70 1.575 8\n", - "2023-07-11 1.50 0.60 2.40 1.30 1.825 -33\n", - "2023-07-12 -35.02 -35.02 -33.54 -33.55 1.875 -31\n", - "2023-07-13 3.60 2.07 3.60 2.07 1.800 2\n", - "2023-07-14 3.25 -1.33 3.25 1.22 1.875 -35\n", - "2023-07-17 2.81 1.24 2.55 3.46 2.325 -34\n", - "2023-07-18 1.10 1.55 1.95 1.53 2.175 -322\n", - "2023-07-19 2.76 2.17 0.58 1.90 2.925 83\n", - "2023-07-20 1.59 1.85 0.85 0.95 1.400 -145\n", - "2023-07-21 2.30 1.55 3.22 4.15 1.550 -9\n", - "2023-07-24 4.02 1.70 4.02 1.85 1.675 -12\n", - "2023-07-25 2.87 2.19 2.87 2.19 1.650 -105\n", - "2023-07-26 3.05 2.65 3.35 3.35 1.375 -5\n", - "2023-07-27 0.72 0.72 1.24 0.64 1.525 -30\n", - "2023-07-28 1.15 1.40 1.15 1.40 1.725 -4\n", - "2023-07-31 2.25 0.73 2.25 0.73 1.725 32\n", - "2023-08-01 1.50 0.93 2.13 2.13 1.575 -12\n", - "2023-08-02 1.17 0.89 2.63 1.28 1.450 -27" - ] - }, - "execution_count": 151, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "structure.spot(ts = True, ts_start = '2023-07-05')" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Delta_PnLGamma_PnLVega_PnLVolga_PnLTheta_PnLRho_PnLVanna_PnLDividend_PnLTotal_PnLUnexplained_PnLActual_PnLPrice
2023-07-07100.197319-0.64256194.109883-3.9922679.1698780.000000-0.7917420.0198.050510-0.228027197.822483-3859.441764
2023-07-10223.900381-3.441802157.605718-6.68829626.883864-1.045598-3.2771070.0393.937159-1.305178392.631981-3661.619281
2023-07-11-7.955254-0.00499226.812441-1.1012678.526938-1.4795930.0224970.024.820769-0.02932624.791443-3268.987299
2023-07-12-96.992218-0.74839418.898604-0.7741778.5073931.0658890.1923370.0-69.8505650.092523-69.758042-3244.195856
2023-07-13-263.728899-5.376353-3.2223590.1318498.5867080.583759-0.0833920.0-263.1086870.305369-262.803318-3313.953898
2023-07-14-161.480329-1.838722-107.1150734.3955548.8687170.702534-1.4823060.0-257.9496240.331414-257.618211-3576.757216
2023-07-17-430.417749-11.88333540.176855-1.69791327.593970-1.6278451.2923100.0-376.5637070.826231-375.737476-3834.375426
2023-07-18-148.632423-1.269861-161.4403656.9487189.538938-1.449220-1.5006390.0-297.8048520.311053-297.493799-4210.112902
2023-07-19107.200166-0.607747-81.8516163.5893189.8958690.2956690.5160160.039.0376760.02675239.064429-4507.606702
2023-07-201451.033987-115.805471204.821360-8.9283659.9400240.193222-22.2386780.01519.016078-1.6158191517.400259-4468.542273
2023-07-21120.681078-1.304719123.620452-5.2425208.376014-0.372347-1.9145230.0243.843434-0.344318243.499116-2951.142014
2023-07-24-364.068061-13.113308-70.2955022.73083324.096955-0.142937-3.4084420.0-424.2004621.741388-422.459074-2707.642898
2023-07-25163.968075-2.249712-98.0690983.9425708.635374-1.1690081.8121730.076.8703740.01386276.884236-3130.101972
2023-07-2639.650755-0.134983171.738925-7.4313708.619464-0.225307-0.8234570.0211.394027-0.333318211.060709-3053.217736
2023-07-27357.746038-12.093212-60.4189872.3958098.2899910.0000002.8970030.0298.816643-0.358198298.458444-2842.157027
2023-07-28-417.327889-18.556538169.388899-7.4258407.9385150.86986810.6671930.0-254.4457920.356178-254.089614-2543.698582
2023-07-31-40.924260-0.160870-73.1314192.86887324.6412300.518384-0.3835030.0-86.5715670.536670-86.034896-2797.788196
2023-08-01266.409425-6.59641371.137146-2.9629518.406740-0.891605-2.4644630.0333.037879-0.396628332.641252-2883.823092
2023-08-02273.976974-8.090558-79.1210723.0333967.9540810.0000003.3354240.0201.088245-0.242565200.845681-2551.181841
\n", - "
" - ], - "text/plain": [ - " Delta_PnL Gamma_PnL Vega_PnL Volga_PnL Theta_PnL \\\n", - "2023-07-07 100.197319 -0.642561 94.109883 -3.992267 9.169878 \n", - "2023-07-10 223.900381 -3.441802 157.605718 -6.688296 26.883864 \n", - "2023-07-11 -7.955254 -0.004992 26.812441 -1.101267 8.526938 \n", - "2023-07-12 -96.992218 -0.748394 18.898604 -0.774177 8.507393 \n", - "2023-07-13 -263.728899 -5.376353 -3.222359 0.131849 8.586708 \n", - "2023-07-14 -161.480329 -1.838722 -107.115073 4.395554 8.868717 \n", - "2023-07-17 -430.417749 -11.883335 40.176855 -1.697913 27.593970 \n", - "2023-07-18 -148.632423 -1.269861 -161.440365 6.948718 9.538938 \n", - "2023-07-19 107.200166 -0.607747 -81.851616 3.589318 9.895869 \n", - "2023-07-20 1451.033987 -115.805471 204.821360 -8.928365 9.940024 \n", - "2023-07-21 120.681078 -1.304719 123.620452 -5.242520 8.376014 \n", - "2023-07-24 -364.068061 -13.113308 -70.295502 2.730833 24.096955 \n", - "2023-07-25 163.968075 -2.249712 -98.069098 3.942570 8.635374 \n", - "2023-07-26 39.650755 -0.134983 171.738925 -7.431370 8.619464 \n", - "2023-07-27 357.746038 -12.093212 -60.418987 2.395809 8.289991 \n", - "2023-07-28 -417.327889 -18.556538 169.388899 -7.425840 7.938515 \n", - "2023-07-31 -40.924260 -0.160870 -73.131419 2.868873 24.641230 \n", - "2023-08-01 266.409425 -6.596413 71.137146 -2.962951 8.406740 \n", - "2023-08-02 273.976974 -8.090558 -79.121072 3.033396 7.954081 \n", - "\n", - " Rho_PnL Vanna_PnL Dividend_PnL Total_PnL Unexplained_PnL \\\n", - "2023-07-07 0.000000 -0.791742 0.0 198.050510 -0.228027 \n", - "2023-07-10 -1.045598 -3.277107 0.0 393.937159 -1.305178 \n", - "2023-07-11 -1.479593 0.022497 0.0 24.820769 -0.029326 \n", - "2023-07-12 1.065889 0.192337 0.0 -69.850565 0.092523 \n", - "2023-07-13 0.583759 -0.083392 0.0 -263.108687 0.305369 \n", - "2023-07-14 0.702534 -1.482306 0.0 -257.949624 0.331414 \n", - "2023-07-17 -1.627845 1.292310 0.0 -376.563707 0.826231 \n", - "2023-07-18 -1.449220 -1.500639 0.0 -297.804852 0.311053 \n", - "2023-07-19 0.295669 0.516016 0.0 39.037676 0.026752 \n", - "2023-07-20 0.193222 -22.238678 0.0 1519.016078 -1.615819 \n", - "2023-07-21 -0.372347 -1.914523 0.0 243.843434 -0.344318 \n", - "2023-07-24 -0.142937 -3.408442 0.0 -424.200462 1.741388 \n", - "2023-07-25 -1.169008 1.812173 0.0 76.870374 0.013862 \n", - "2023-07-26 -0.225307 -0.823457 0.0 211.394027 -0.333318 \n", - "2023-07-27 0.000000 2.897003 0.0 298.816643 -0.358198 \n", - "2023-07-28 0.869868 10.667193 0.0 -254.445792 0.356178 \n", - "2023-07-31 0.518384 -0.383503 0.0 -86.571567 0.536670 \n", - "2023-08-01 -0.891605 -2.464463 0.0 333.037879 -0.396628 \n", - "2023-08-02 0.000000 3.335424 0.0 201.088245 -0.242565 \n", - "\n", - " Actual_PnL Price \n", - "2023-07-07 197.822483 -3859.441764 \n", - "2023-07-10 392.631981 -3661.619281 \n", - "2023-07-11 24.791443 -3268.987299 \n", - "2023-07-12 -69.758042 -3244.195856 \n", - "2023-07-13 -262.803318 -3313.953898 \n", - "2023-07-14 -257.618211 -3576.757216 \n", - "2023-07-17 -375.737476 -3834.375426 \n", - "2023-07-18 -297.493799 -4210.112902 \n", - "2023-07-19 39.064429 -4507.606702 \n", - "2023-07-20 1517.400259 -4468.542273 \n", - "2023-07-21 243.499116 -2951.142014 \n", - "2023-07-24 -422.459074 -2707.642898 \n", - "2023-07-25 76.884236 -3130.101972 \n", - "2023-07-26 211.060709 -3053.217736 \n", - "2023-07-27 298.458444 -2842.157027 \n", - "2023-07-28 -254.089614 -2543.698582 \n", - "2023-07-31 -86.034896 -2797.788196 \n", - "2023-08-01 332.641252 -2883.823092 \n", - "2023-08-02 200.845681 -2551.181841 " - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# pnl\n", - "\n", - "# attribution\n", - "# pt_greeks\n", - "# attribution += pnl\n", - "# # pnl\n", - "pt_greeks\n", - "attribution[attribution.Total_PnL != 0 ]/quantity" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
TickerPnLEntryPriceExitPriceReturnPctQuantityEntryTimeExitTimeDurationPositionsStructure
0TSLA-2435.488156200.386768158.395593-20.955064582023-07-052023-08-0228&L:TSLA20240621C333.33&S:TSLA20240621C340CallVertical(TSLA, Build On: 2023-08-02 16:00:00)
1AAPL-2.688171200.843021200.761561-0.040559332023-07-052023-08-0430&L:AAPL20240621C230&S:AAPL20240621C240CallVertical(AAPL, Build On: 2023-08-04 16:00:00)
2MSFT-1405.469374200.989909160.833641-19.979246352023-07-052023-08-0935&L:MSFT20240621C370&S:MSFT20240621C375CallVertical(MSFT, Build On: 2023-08-09 16:00:00)
3AMZN-433.030018200.892755152.778308-23.95031492023-07-052023-10-25112&L:AMZN20240621C170&S:AMZN20240621C182.5CallVertical(AMZN, Build On: 2023-10-25 16:00:00)
4NVDA133674.653341190.3941732975.2827841462.696347482023-07-052024-07-01362&L:NVDA20240621C770&S:NVDA20240621C800CallVertical(NVDA, Build On: 2023-07-05 16:00:00)
5BA-240.652620185.467519155.385942-16.21932482023-08-102023-08-177&L:BA20240621C300&S:BA20240621C310CallVertical(BA, Build On: 2023-08-10 16:00:00)
6WMT2.122548175.943801178.0663491.20637912023-08-102023-08-177&L:WMT20240621C175&S:WMT20240621C180CallVertical(WMT, Build On: 2023-08-17 16:00:00)
7TSLA-221.844005200.276447195.556361-2.356785472023-08-172023-10-2064&L:TSLA20240920C305&S:TSLA20240920C315CallVertical(TSLA, Build On: 2023-10-20 16:00:00)
8AAPL-1682.755271199.079386149.586584-24.860837342023-08-312023-09-077&L:AAPL20240920C260&S:AAPL20240920C310CallVertical(AAPL, Build On: 2023-09-07 16:00:00)
9INTC-25.909441177.260283151.350843-14.61660812023-09-152023-09-205&L:INTC20240621C40&S:INTC20240621C45CallVertical(INTC, Build On: 2023-09-20 16:00:00)
10QCOM2432.613758185.857070456.147487145.42918392023-11-132024-07-01231&L:QCOM20250117C135&S:QCOM20250117C140CallVertical(QCOM, Build On: 2024-07-01 16:00:00)
11MSFT7546.018559195.435111455.642648133.142676292023-11-142024-07-01230&L:MSFT20241220C395&S:MSFT20241220C400CallVertical(MSFT, Build On: 2024-07-01 16:00:00)
12SBUX-1213.093853192.861999147.932597-23.296140272023-11-152023-11-2914&L:SBUX20250117C115&S:SBUX20250117C120CallVertical(SBUX, Build On: 2023-11-15 16:00:00)
13AMD2646.105174185.885113426.440129129.410587112023-11-152024-07-01229&L:AMD20240920C180&S:AMD20240920C200CallVertical(AMD, Build On: 2024-07-01 16:00:00)
14MU796.020252183.107704448.447788144.90929632023-11-162024-07-01228&L:MU20250117C85&S:MU20250117C90CallVertical(MU, Build On: 2024-07-01 16:00:00)
15INTC-87.617504185.84175298.224247-47.14629712023-11-172024-04-03138&L:INTC20240920C42&S:INTC20240920C45CallVertical(INTC, Build On: 2023-11-17 16:00:00)
16DIS-694.352361168.91517291.764910-45.67396892023-11-172024-01-1054&L:DIS20240920C115&S:DIS20240920C125CallVertical(DIS, Build On: 2024-01-10 16:00:00)
17AAPL-1270.636567185.860919140.481042-24.416041282023-11-222024-01-0443&L:AAPL20241220C215&S:AAPL20241220C220CallVertical(AAPL, Build On: 2024-01-04 16:00:00)
18BAC7062.499686199.745100571.455610186.092430192023-12-012024-07-01213&L:BAC20250117C35&S:BAC20250117C55CallVertical(BAC, Build On: 2023-12-01 16:00:00)
19HD4255.41113975.521298208.502896176.084894322023-12-042024-04-17135&L:HD20250117C390&S:HD20250117C400CallVertical(HD, Build On: 2023-12-04 16:00:00)
20BA-593.864676162.98018778.142376-52.05406472023-12-042024-01-1239&L:BA20250117C310&S:BA20250117C320CallVertical(BA, Build On: 2023-12-04 16:00:00)
21GOOG955.275739200.338480245.82780022.706232212024-01-262024-01-315&L:GOOG20250117C155&S:GOOG20250117C160CallVertical(GOOG, Build On: 2024-01-31 16:00:00)
22WMT80.566735168.121610208.40497823.96085022024-02-052024-07-01147&L:WMT20250117C185&S:WMT20250117C190CallVertical(WMT, Build On: 2024-02-05 16:00:00)
23DIS-342.441420197.292521128.804237-34.71408052024-02-072024-05-1699&L:DIS20250117C130&S:DIS20250117C150CallVertical(DIS, Build On: 2024-02-07 16:00:00)
24AMZN944.895306198.140959333.12600368.12576572024-02-082024-07-01144&L:AMZN20250117C185&S:AMZN20250117C190CallVertical(AMZN, Build On: 2024-07-01 16:00:00)
25AAPL271.607733187.779672200.7133746.887701212024-05-212024-07-0141&L:AAPL20250620C225&S:AAPL20250620C230CallVertical(AAPL, Build On: 2024-07-01 16:00:00)
\n", - "
" - ], - "text/plain": [ - " Ticker PnL EntryPrice ExitPrice ReturnPct Quantity \\\n", - "0 TSLA -2435.488156 200.386768 158.395593 -20.955064 58 \n", - "1 AAPL -2.688171 200.843021 200.761561 -0.040559 33 \n", - "2 MSFT -1405.469374 200.989909 160.833641 -19.979246 35 \n", - "3 AMZN -433.030018 200.892755 152.778308 -23.950314 9 \n", - "4 NVDA 133674.653341 190.394173 2975.282784 1462.696347 48 \n", - "5 BA -240.652620 185.467519 155.385942 -16.219324 8 \n", - "6 WMT 2.122548 175.943801 178.066349 1.206379 1 \n", - "7 TSLA -221.844005 200.276447 195.556361 -2.356785 47 \n", - "8 AAPL -1682.755271 199.079386 149.586584 -24.860837 34 \n", - "9 INTC -25.909441 177.260283 151.350843 -14.616608 1 \n", - "10 QCOM 2432.613758 185.857070 456.147487 145.429183 9 \n", - "11 MSFT 7546.018559 195.435111 455.642648 133.142676 29 \n", - "12 SBUX -1213.093853 192.861999 147.932597 -23.296140 27 \n", - "13 AMD 2646.105174 185.885113 426.440129 129.410587 11 \n", - "14 MU 796.020252 183.107704 448.447788 144.909296 3 \n", - "15 INTC -87.617504 185.841752 98.224247 -47.146297 1 \n", - "16 DIS -694.352361 168.915172 91.764910 -45.673968 9 \n", - "17 AAPL -1270.636567 185.860919 140.481042 -24.416041 28 \n", - "18 BAC 7062.499686 199.745100 571.455610 186.092430 19 \n", - "19 HD 4255.411139 75.521298 208.502896 176.084894 32 \n", - "20 BA -593.864676 162.980187 78.142376 -52.054064 7 \n", - "21 GOOG 955.275739 200.338480 245.827800 22.706232 21 \n", - "22 WMT 80.566735 168.121610 208.404978 23.960850 2 \n", - "23 DIS -342.441420 197.292521 128.804237 -34.714080 5 \n", - "24 AMZN 944.895306 198.140959 333.126003 68.125765 7 \n", - "25 AAPL 271.607733 187.779672 200.713374 6.887701 21 \n", - "\n", - " EntryTime ExitTime Duration \\\n", - "0 2023-07-05 2023-08-02 28 \n", - "1 2023-07-05 2023-08-04 30 \n", - "2 2023-07-05 2023-08-09 35 \n", - "3 2023-07-05 2023-10-25 112 \n", - "4 2023-07-05 2024-07-01 362 \n", - "5 2023-08-10 2023-08-17 7 \n", - "6 2023-08-10 2023-08-17 7 \n", - "7 2023-08-17 2023-10-20 64 \n", - "8 2023-08-31 2023-09-07 7 \n", - "9 2023-09-15 2023-09-20 5 \n", - "10 2023-11-13 2024-07-01 231 \n", - "11 2023-11-14 2024-07-01 230 \n", - "12 2023-11-15 2023-11-29 14 \n", - "13 2023-11-15 2024-07-01 229 \n", - "14 2023-11-16 2024-07-01 228 \n", - "15 2023-11-17 2024-04-03 138 \n", - "16 2023-11-17 2024-01-10 54 \n", - "17 2023-11-22 2024-01-04 43 \n", - "18 2023-12-01 2024-07-01 213 \n", - "19 2023-12-04 2024-04-17 135 \n", - "20 2023-12-04 2024-01-12 39 \n", - "21 2024-01-26 2024-01-31 5 \n", - "22 2024-02-05 2024-07-01 147 \n", - "23 2024-02-07 2024-05-16 99 \n", - "24 2024-02-08 2024-07-01 144 \n", - "25 2024-05-21 2024-07-01 41 \n", - "\n", - " Positions \\\n", - "0 &L:TSLA20240621C333.33&S:TSLA20240621C340 \n", - "1 &L:AAPL20240621C230&S:AAPL20240621C240 \n", - "2 &L:MSFT20240621C370&S:MSFT20240621C375 \n", - "3 &L:AMZN20240621C170&S:AMZN20240621C182.5 \n", - "4 &L:NVDA20240621C770&S:NVDA20240621C800 \n", - "5 &L:BA20240621C300&S:BA20240621C310 \n", - "6 &L:WMT20240621C175&S:WMT20240621C180 \n", - "7 &L:TSLA20240920C305&S:TSLA20240920C315 \n", - "8 &L:AAPL20240920C260&S:AAPL20240920C310 \n", - "9 &L:INTC20240621C40&S:INTC20240621C45 \n", - "10 &L:QCOM20250117C135&S:QCOM20250117C140 \n", - "11 &L:MSFT20241220C395&S:MSFT20241220C400 \n", - "12 &L:SBUX20250117C115&S:SBUX20250117C120 \n", - "13 &L:AMD20240920C180&S:AMD20240920C200 \n", - "14 &L:MU20250117C85&S:MU20250117C90 \n", - "15 &L:INTC20240920C42&S:INTC20240920C45 \n", - "16 &L:DIS20240920C115&S:DIS20240920C125 \n", - "17 &L:AAPL20241220C215&S:AAPL20241220C220 \n", - "18 &L:BAC20250117C35&S:BAC20250117C55 \n", - "19 &L:HD20250117C390&S:HD20250117C400 \n", - "20 &L:BA20250117C310&S:BA20250117C320 \n", - "21 &L:GOOG20250117C155&S:GOOG20250117C160 \n", - "22 &L:WMT20250117C185&S:WMT20250117C190 \n", - "23 &L:DIS20250117C130&S:DIS20250117C150 \n", - "24 &L:AMZN20250117C185&S:AMZN20250117C190 \n", - "25 &L:AAPL20250620C225&S:AAPL20250620C230 \n", - "\n", - " Structure \n", - "0 CallVertical(TSLA, Build On: 2023-08-02 16:00:00) \n", - "1 CallVertical(AAPL, Build On: 2023-08-04 16:00:00) \n", - "2 CallVertical(MSFT, Build On: 2023-08-09 16:00:00) \n", - "3 CallVertical(AMZN, Build On: 2023-10-25 16:00:00) \n", - "4 CallVertical(NVDA, Build On: 2023-07-05 16:00:00) \n", - "5 CallVertical(BA, Build On: 2023-08-10 16:00:00) \n", - "6 CallVertical(WMT, Build On: 2023-08-17 16:00:00) \n", - "7 CallVertical(TSLA, Build On: 2023-10-20 16:00:00) \n", - "8 CallVertical(AAPL, Build On: 2023-09-07 16:00:00) \n", - "9 CallVertical(INTC, Build On: 2023-09-20 16:00:00) \n", - "10 CallVertical(QCOM, Build On: 2024-07-01 16:00:00) \n", - "11 CallVertical(MSFT, Build On: 2024-07-01 16:00:00) \n", - "12 CallVertical(SBUX, Build On: 2023-11-15 16:00:00) \n", - "13 CallVertical(AMD, Build On: 2024-07-01 16:00:00) \n", - "14 CallVertical(MU, Build On: 2024-07-01 16:00:00) \n", - "15 CallVertical(INTC, Build On: 2023-11-17 16:00:00) \n", - "16 CallVertical(DIS, Build On: 2024-01-10 16:00:00) \n", - "17 CallVertical(AAPL, Build On: 2024-01-04 16:00:00) \n", - "18 CallVertical(BAC, Build On: 2023-12-01 16:00:00) \n", - "19 CallVertical(HD, Build On: 2023-12-04 16:00:00) \n", - "20 CallVertical(BA, Build On: 2023-12-04 16:00:00) \n", - "21 CallVertical(GOOG, Build On: 2024-01-31 16:00:00) \n", - "22 CallVertical(WMT, Build On: 2024-02-05 16:00:00) \n", - "23 CallVertical(DIS, Build On: 2024-02-07 16:00:00) \n", - "24 CallVertical(AMZN, Build On: 2024-07-01 16:00:00) \n", - "25 CallVertical(AAPL, Build On: 2024-07-01 16:00:00) " - ] - }, - "execution_count": 43, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "trades" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "threading.active_count()" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 48, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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5szh2muvxel0Akbjwb///e/s2LGD9vZ2cnNzOeOMMzj77LPD97F9+3aefvppqqur8Xg85OTksGTJEs4999yRfspxTQIeIYQQIga2bt3KmWeeyaRJkwgEAqxcuZJ77rmHBx98MNxJ+cknn+TLL7/k3//933E4HKxYsYLf/e533H333QDs3buX9PR0br75ZrKystixYwd/+tOfUFWVZcuWAWCz2TjzzDMpKSnBZrOxfft2/vznP2O321myZMmoPf94I0XLQgghxAhob2/n2muv5Y477mDGjBm43W6uueYabrnlFk444QQAqqur+clPfsI999xDWVnZgPfz2GOPUV1dza9+9atDPtZvf/tbbDab9ObpRWp4hBBCiBHgdrsBSElJAYzsTSAQYNasWeHrFBUVkZ2dzc6dOw97P6H7GMi+ffvYsWMHM2bMiNKRJwZZ0hJCCCFiTNM0nnjiCaZOnUpxcTEALpcLs9lMcnJyn+ump6fjcrkGvJ8dO3bw8ccf87Of/azfZT/84Q9pb28nEAjw7W9/m9NPPz3qz2Msk4BHCCGEiLEVK1ZQWVnJXXfdNeT7qKioYPny5VxyySXMmTOn3+V33XUXPT097Ny5k2eeeYb8/HxOOeWU4Rx2QpGARwghhIihFStW8OWXX3LnnXeSlZUVPt/pdOL3++nq6uqT5Wlrawvv0gqpqqri7rvvZsmSJVx88cUDPk5ubi4AxcXFtLW18dxzz0nA04vU8AghhBAxoOs6K1as4LPPPuO///u/wwFJyMSJEzGZTGzatCl8Xk1NDU1NTX0KlisrK7nzzjtZuHAh3/3udyN+bL/fH50nkiAkwyOEEELEwIoVK1i3bh233XYbSUlJ4boch8OB1WrF4XCwePFinnrqKVJSUnA4HDz++OOUlZWFA56Kigruuusu5syZw7nnnhu+D1VVSUtLA+D1118nOzuboqIiALZt28Y///lPzjrrrBF/zvFMtqULIYQQMXDppZcOeP4NN9zAokWLgAONBz/88EP8fn+/xoOrVq3i+eef73cfOTk5/P73vwfgtdde4+2336ahoQFVVcnPz+f0009nyZIlqKos5IRIwCOEEEKIhCehnxBCCCESngQ8QgghhEh4EvAIIYQQIuFJwCOEEEKIhCcBjxBCCCESngQ8QgghhEh4EvAIIYQQIuFJwCOE+MZraGjg0ksvZe3ataN9KEKIGJHREkKIqFq7di1/+MMfwqctFgspKSkUFxczb948TjvtNJKSkgZ9vzt27ODrr7/mnHPO6TNocTDWrVtHW1sb55xzzpBuL4QYuyTgEULExKWXXkpubi6BQACXy8XWrVt58skneeWVV7jtttsoKSkZ1P3t2LGD559/nkWLFg0r4KmsrOwX8OTk5PDXv/4Vs1l+JQqRqOSnWwgRE/PmzWPSpEnh0xdeeCGbN2/m/vvvZ/ny5Tz00ENYrdZRPMIDFEWJm2MRQsSGBDxCiBFz1FFHcfHFF7Ny5Uref/99lixZwv79+3n55ZfZtm0bra2tOBwO5s2bxxVXXEFqairQd4DiTTfdFL6/Rx55hNzcXADef/99XnnlFaqqqrBarcyZM4fLL7+c7OxsAO644w62bt0KHBjqGBrA2NDQwE033dRnqOPvf/97PvnkEx566CEee+wxtmzZgsPh4MILL2TZsmVUVFTwl7/8hd27d5Oamsr3vvc9TjnllD7Pt6uri+eee45PP/2UtrY2srKyOP300zn//PNlqKMQI0wCHiHEiDr11FNZuXIlGzduZMmSJWzcuJGGhgYWLVqE0+mkqqqKt99+m6qqKu69914UReH444+ntraWDz/8kKuuuiocCKWlpQGwevVqnn32WU488UROP/102tvbee211/jVr37F8uXLSU5O5qKLLsLtdtPc3MxVV10FgN1uP+yxaprGfffdx/Tp07n88stZt24djz/+OHa7nZUrV7JgwQKOP/543nrrLR555BHKysrCAZjH4+GOO+6gpaWFJUuWkJ2dzY4dO1i5ciUul4urr746di+yEKIfCXiEECMqKysLh8NBfX09AGeeeSbnnXden+tMmTKFhx9+mO3btzN9+nRKSkooLS3lww8/ZP78+eGgAqCxsZFVq1Zx2WWXcdFFF4XPP+6447j99tt54403uOiii5g9ezaZmZl0dXVx6qmnRnSsPp+PBQsWcOGFFwJwyimncP311/PHP/6RW265hZNOOgmA2bNn8+Mf/5i1a9eGs0cvv/wydXV1LF++nIKCAgDOOOMMMjMz+cc//sG5554bzj4JIWJPcqpCiBFnt9vp7u4G6FM74/V6aW9vZ8qUKQDs27fviPf16aefous6J510Eu3t7eE/TqeT/Px8tmzZMqxjPf3008P/Tk5OprCwEJvNxoknnhg+v7CwkOTkZBoaGsLnffLJJ0yfPp3k5OQ+xzVr1iw0TWPbtm3DOi4hxOBIhkcIMeJ6enpIT08HoLOzk+eee46PPvqItra2Ptdzu91HvK+6ujp0XedHP/rRgJcPZ+eVxWIJL5uFOBwOsrKyUBSl3/mdnZ3h07W1tezfv59rr712wPs++LkKIWJLAh4hxIhqbm7G7XaTl5cHwEMPPcSOHTs4//zzmTBhAna7PVw7o2naEe9P0zQUReHnP//5gIXAR6rTOZxDFRZHUnCs6zqzZ8/m/PPPH/DywsLCIR+XEGLwJOARQoyo999/H4C5c+fS2dnJpk2buPTSS7nkkkvC16mtre13u4MzKiH5+fnouk5ubm5cBRF5eXn09PQwe/bs0T4UIQRSwyOEGEGbN2/mhRdeIDc3l1NOOSWcKdF1vc/1XnnllX63tdlsQP9lruOOOw5VVXn++ef73Y+u63R0dIRP2+32iJbJouHEE09k586dbNiwod9lXV1dBAKBETkOIYRBMjxCiJj46quvqK6uRtM0XC4XW7ZsYePGjWRnZ3PbbbdhtVqxWq1Mnz6df/zjHwQCATIzM/n666/7FP+GTJw4EYCVK1dy8sknYzKZOOaYY8jPz+c73/kOzzzzDI2NjcyfPx+73U5DQwPr168P970J3cdHH33Ek08+yaRJk7Db7Rx77LExef7nn38+n3/+OQ888AALFy5k4sSJeDweKioq+OSTT/j973/frz5ICBE7EvAIIWJi1apVgFE0HJqlddVVV/WbpXXLLbfw+OOP88Ybb4TrXn7xi19w/fXX97m/yZMnc9lll/HWW2+xYcMGdF3nkUcewW63c8EFF1BQUMArr7zCc889B0B2djazZ8/uE9AsXbqU8vJy1q5dyyuvvEJOTk7MAh6bzcadd97J6tWr+eSTT3j//fdJSkqisLCQSy+9FIfDEZPHFUIMTNEPzgELIYQQQiQYqeERQgghRMKTgEcIIYQQCU8CHiGEEEIkPAl4hBBCCJHwJOARQgghRMKTgEcIIYQQCU8CHiGEEEIkPAl4hBBCCJHwJOARQgghRMKTgEcIIYQQCU8CHiGEEEIkPAl4hBBCCJHwJOARQgghRML7/wHA/fKPSdc5vQAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "attribution = pnl.copy() * quantity\n", - "attribution.cumsum().plot(y = ['Delta_PnL', 'Total_PnL', 'Vega_PnL', 'Theta_PnL', 'Gamma_PnL'])" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "openbb", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.10" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/EventDriven/demos/notes/backtest_notes.txt b/EventDriven/demos/notes/backtest_notes.txt deleted file mode 100644 index cc4dcfc..0000000 --- a/EventDriven/demos/notes/backtest_notes.txt +++ /dev/null @@ -1,5 +0,0 @@ -LONG_BBANDS: -- EQ Signal: `On Close` ie strategy EQ Signal is made on close. -- Option Signal: Made on EQ Signal Close. Therefore, expectation is it should be the same day - - Will begin to test with an offset max T+1 -- \ No newline at end of file diff --git a/EventDriven/demos/notes/data_notes.txt b/EventDriven/demos/notes/data_notes.txt deleted file mode 100644 index 02a6cb3..0000000 --- a/EventDriven/demos/notes/data_notes.txt +++ /dev/null @@ -1,23 +0,0 @@ -Per leg data cleans by ffilling 0 values -Trade data adds skips based on 5 criteria's: - - Rolling Z-Score of absolute value - - Rolling Z-score of 1day change - - Median Absolute Deviation band - - abs 50% change in first n {window} days - - Zero values -Skips are used to skip a trade on a specific date -Splits: - - Position Data is labeled with pre-split option ID - - Leg Data is labeled with post splits. - -Limits Calculation: Eg Spot 3326.0198974609375, Cash 1095.4378642132353 - - This yields a limit of very close to 0 - -Entry on Skip Days: - - As mentioned before, skip days are calculated based on 5 criteria's. If paraventure a skip day were to fall on entry date, the entry close will be swapped with 3 Exponential Moving Average price to avoid under pricing or over pricing. - -Problematic dates for specific ticks are ffwd. This is for every child option from underlying -Specific contracts from AAPL are causing issues with pulling data. We have filtered these ticks out and provided an avenue to handle this effortlessly in the future. - - -##PS: There are too many data adjustments. It makes me wonder how efficient this backtest is. \ No newline at end of file diff --git a/EventDriven/demos/notes/improvements.txt b/EventDriven/demos/notes/improvements.txt deleted file mode 100644 index f1dba81..0000000 --- a/EventDriven/demos/notes/improvements.txt +++ /dev/null @@ -1,14 +0,0 @@ -- RiskManager: - - Daily, by tick activities which will allow user to test other types of events - - Hedge extension - - Daily dynamic limits / scaling up & down - -- Portfolio: - - Hedge cash designation. - - -- Portfolio & Risk Manager: - - Full fledge `option_price` use. - - Where can I add assert? - - Add columns function with factory format. - - Use names to assert. Create potential columns list. \ No newline at end of file diff --git a/EventDriven/demos/notes/system_notes.txt b/EventDriven/demos/notes/system_notes.txt deleted file mode 100644 index 7328393..0000000 --- a/EventDriven/demos/notes/system_notes.txt +++ /dev/null @@ -1,23 +0,0 @@ -- Due to added skips: - - In real trading, since we can't close position on close price, we will opt for close to close price. - - This will lead to event discrepancy in situations where "close-eod" price doesn't generate a skip, but eod price generates a skip bool. - -- Adding checks for ExitDate in RiskManager.analyze_position isn't lookahead bias. - - This is because we are first checking if position is meant to be closed. If yes, no analysis need. Close takes priority - - Since we are checking for this bool on a day to day basis. The underlying assumption is we are carrying out this operation on each specific day. - - In cases where t_plus_n is set to 1, we get a roll on ExitDate - 1, and placed for ExitDate, the roll will still enter queue. We need to enforce priortization at signal level - -- Considering adding `change_to_last_busday` with offset shifting forward in shifting EntryTime & ExitTime. This is for two reasons: - 1. Our idea is to get signal on T-1 close, and open Option on T close. If T is a holiday, we skip. This could be handled by RiskManager - 2. Because our trades dataframe follows a yearly interval, the final day to close all trades will usually be 12/31 on the Signals, but adding t_plus_n makes it 01/01 which is a holiday. Portfolio by default moves the trade to the next day - But event scheduler creates the daily queue based on min EntryTime & max ExitTime, max ExitTime being 01/01. To avoid `outside date range error`, solution is to shift forward by business day - -- Exit Date used in RiskManager: - - We are opting to use unadjusted t_plus_n date for risk manager when evaluating current date is and/or after exit signal date. - - This isn't look ahead because the trades dataframe acts as a signal dataframe. Therefore in real life. If we got Exit on T, even though we place trades on T+1, we stop evaluating on T not T+1 - -- Conflict with contract search: - - There are situations when the current option chain isn't as enriched enough. This leads to picking an option that is above the max_moneyness limit. - - This then creates a persistent roll situation. A situation where the only spread that works is already in the money and leads to continous rolls. - -- Might need to build a new stock backtest engine \ No newline at end of file diff --git a/EventDriven/demos/opt_wfa/analysis.ipynb b/EventDriven/demos/opt_wfa/analysis.ipynb deleted file mode 100644 index f08f368..0000000 --- a/EventDriven/demos/opt_wfa/analysis.ipynb +++ /dev/null @@ -1,66810 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The autoreload extension is already loaded. To reload it, use:\n", - " %reload_ext autoreload\n" - ] - } - ], - "source": [ - "%load_ext autoreload\n", - "%autoreload 2\n", - "import os, sys\n", - "# os.environ['PROXY_URL'] = ''\n", - "from trade.helpers.Context import Context\n", - "from trade.helpers.helper import change_to_last_busday, is_USholiday, retrieve_timeseries, find_split_dates_within_range\n", - "from scipy.stats import percentileofscore\n", - "from _strategy.trend.bbands import LongBBandsTrend, LongBBandsTrend_SL\n", - "import pandas as pd\n", - "from pandas.tseries.offsets import BDay\n", - "from dateutil.relativedelta import relativedelta\n", - "from datetime import datetime\n", - "import yfinance as yf\n", - "import numpy as np\n", - "from scipy.stats import norm, skew, kurtosis\n", - "from trade.helpers.Logging import setup_logger\n", - "from trade.assets.Stock import Stock\n", - "import matplotlib.pyplot as plt\n", - "import pandas_datareader.data as web\n", - "import pandas_ta as ta\n", - "from trade.backtester_.utils.aggregators import dd, mdd, cagr\n", - "from wfa.aggregator import Aggregator, MonteCarloBacktest, BaseAggregator, median_dd, EVBOptionAggregator\n", - "from wfa.utils import load_result_dict, results_dict, get_equity_tick\n", - "import statsmodels.api as sm\n", - "from dbase.DataAPI.ThetaData import retrieve_quote, list_contracts, retrieve_eod_ohlc\n", - "import statsmodels.formula.api as smf \n", - "from EventDriven.riskmanager.utils import add_skip_columns\n", - "from scipy.stats.mstats import winsorize\n", - "logger = setup_logger('Opt_WFA_Analysis')\n", - "pd.options.plotting.backend = 'plotly'\n", - "pd.options.display.float_format = '{:,.2f}'.format" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## To check:\n", - "- Sanity Checks:\n", - " - Yearly aggregates\n", - " - Aggregates\n", - " - Trades\n", - " - Comparing trades and equity moves\n", - " - Monte Carlo Backtest\n", - "\n", - "\n", - "## Disturbing Findings:\n", - "- Why are some trades going to 0? I'm guessing slippage. (Add to data notes)\n", - "\n", - "## Investigate:\n", - "- why is `ZSCORE2_DTE270_ROLL120` performing so well. Obviously from scaling, but check trades and make sure they make sense\n", - " - Esp. 2024, why's it so good?\n", - " - Investigate 2020 & 2025, SMOOTH vs ACTUAL, why do they have significant diff?" - ] - }, - { - "cell_type": "code", - "execution_count": 156, - "metadata": {}, - "outputs": [], - "source": [ - "load_result_dict('OPTION', 'BASE', '/Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/demos/opt_wfa/base.pkl')\n", - "load_result_dict('OPTION', 'ZSCORE_1NORM', '/Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/demos/opt_wfa/vol_zscore_1scale.pkl')\n", - "load_result_dict('OPTION', 'ZSCORE_2NORM', '/Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/demos/opt_wfa/vol_zscore_2scale.pkl')\n", - "load_result_dict('OPTION', 'DTE270_ROLL120', '/Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/demos/opt_wfa/dte_270_roll_120.pkl')\n", - "load_result_dict('OPTION', 'BASE_ROLL120', '/Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/demos/opt_wfa/base_roll_120.pkl')\n", - "load_result_dict('OPTION', 'ZSCORE2_DTE270_ROLL120', '/Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/demos/opt_wfa/zscore2_dte180_roll120.pkl')\n", - "load_result_dict('OPTION', 'CHOICE_SMOOTH', '/Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/demos/opt_wfa/zscore2_dte180_roll120_smooth.pkl')\n" - ] - }, - { - "cell_type": "code", - "execution_count": 157, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ]" - ] - }, - "execution_count": 157, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - " \n", - "\n", - "\n", - "option_aggregator_base = EVBOptionAggregator(\n", - " optimization = 'OPTION', \n", - " target = 'BASE')\n", - "\n", - "option_aggregator_zscore1 = EVBOptionAggregator(\n", - " optimization = 'OPTION', \n", - " target = 'ZSCORE_1NORM')\n", - "\n", - "option_aggregator_zscore2 = EVBOptionAggregator(\n", - " optimization = 'OPTION', \n", - " target = 'ZSCORE_2NORM')\n", - "\n", - "option_aggregator_dte270_roll120 = EVBOptionAggregator(\n", - " optimization = 'OPTION', \n", - " target = 'DTE270_ROLL120')\n", - "\n", - "option_aggregator_base_roll120 = EVBOptionAggregator(\n", - " optimization = 'OPTION', \n", - " target = 'BASE_ROLL120')\n", - "\n", - "option_aggregator_zscore2_dte270_roll120 = EVBOptionAggregator(\n", - " optimization = 'OPTION', \n", - " target = 'ZSCORE2_DTE270_ROLL120')\n", - "\n", - "option_aggregator_smooth = EVBOptionAggregator(\n", - " optimization = 'OPTION', \n", - " target = 'CHOICE_SMOOTH')\n", - "\n", - "aggregators = [\n", - " option_aggregator_base,\n", - " option_aggregator_zscore1,\n", - " option_aggregator_zscore2,\n", - " option_aggregator_dte270_roll120,\n", - " option_aggregator_base_roll120,\n", - " option_aggregator_zscore2_dte270_roll120,\n", - " option_aggregator_smooth\n", - "]\n", - "aggregators" - ] - }, - { - "cell_type": "code", - "execution_count": 446, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(0.5, 0.3, 0.2)" - ] - }, - "execution_count": 446, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "option_aggregator_zscore2_dte270_roll120.backtesters[4].portfolio.risk_manager.sizer.weights" - ] - }, - { - "cell_type": "code", - "execution_count": 452, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['CASH_USE_RULES',\n", - " 'VOL_TYPES',\n", - " '_BaseSizer__CASH_USE_RULES',\n", - " '_ZscoreRVolSizer__rolling_window',\n", - " '_ZscoreRVolSizer__rvol_window',\n", - " '__abstractmethods__',\n", - " '__class__',\n", - " '__delattr__',\n", - " '__dict__',\n", - " '__dir__',\n", - " '__doc__',\n", - " '__eq__',\n", - " '__format__',\n", - " '__ge__',\n", - " '__getattribute__',\n", - " '__getstate__',\n", - " '__gt__',\n", - " '__hash__',\n", - " '__init__',\n", - " '__init_subclass__',\n", - " '__le__',\n", - " '__lt__',\n", - " '__module__',\n", - " '__ne__',\n", - " '__new__',\n", - " '__reduce__',\n", - " '__reduce_ex__',\n", - " '__repr__',\n", - " '__setattr__',\n", - " '__sizeof__',\n", - " '__slots__',\n", - " '__str__',\n", - " '__subclasshook__',\n", - " '__weakref__',\n", - " '_abc_impl',\n", - " 'calculate_position_size',\n", - " 'calculate_scaler',\n", - " 'cash_rule',\n", - " 'daily_update',\n", - " 'delta_limit_log',\n", - " 'get_cash',\n", - " 'get_daily_delta_limit',\n", - " 'load_rvol_timeseries',\n", - " 'log_daily_delta_limit',\n", - " 'norm_constant',\n", - " 'pm',\n", - " 'position_id_starting_cash',\n", - " 'post_analyze_task',\n", - " 'pre_analyze_task',\n", - " 're_update_on_roll',\n", - " 'register_position_id_starting_cash',\n", - " 'register_signal_starting_cash',\n", - " 'rm',\n", - " 'rolling_window',\n", - " 'rvol_timeseries',\n", - " 'rvol_window',\n", - " 'scaler',\n", - " 'set_cash_rule',\n", - " 'signal_starting_cash',\n", - " 'sizing_lev',\n", - " 'ticker_starting_cash',\n", - " 'update_delta_limit',\n", - " 'vol_type',\n", - " 'weights',\n", - " 'z_i']" - ] - }, - "execution_count": 452, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "dir(option_aggregator_zscore2_dte270_roll120.backtesters[4].portfolio.risk_manager.sizer)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## MONTE CARLO SIMULATION" - ] - }, - { - "cell_type": "code", - "execution_count": 437, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'ewm_span': 3,\n", - " 'size': 252,\n", - " 'num_simulations': 2500,\n", - " 'cutoff': 0.5,\n", - " 'initial_equity': 20000,\n", - " 'log': True,\n", - " 'skip_window': 15,\n", - " 'skip_thresh': 2.5,\n", - " 'plot_ewm_span': 8}" - ] - }, - "execution_count": 437, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "carlo_config = {\n", - "'ewm_span': 3,\n", - "'size': 252, # Number of days to simulate \n", - "'num_simulations': 2500, # Number of simulations to run\n", - "'cutoff': 0.5, # Cutoff return for ruin prob\n", - "'initial_equity': 20_000, # Initial equity to start with\n", - "'log': True, # Whether to use log returns\n", - "'skip_window': 15, # Window for skip calcs\n", - "'skip_thresh': 2.5, # zscore thresh for skips,\n", - "'plot_ewm_span': 8\n", - "}\n", - "carlo_config" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### SMOOTHED EQ" - ] - }, - { - "cell_type": "code", - "execution_count": 434, - "metadata": {}, - "outputs": [], - "source": [ - "pd.options.display.float_format = '{:,.2f}'.format\n", - "smooth_eq_full = pd.DataFrame()\n", - "for agg in aggregators:\n", - "\n", - " historical_eq = agg._equity['Total']\n", - " smoothed_eq = agg._equity['Total'].ewm(span =carlo_config['ewm_span']).mean()\n", - "\n", - " # historical_returns = smoothed_eq.pct_change(periods = 1).dropna()\n", - " historical_returns = np.log(smoothed_eq/smoothed_eq.shift(1)).dropna()\n", - " monte_smooth = MonteCarloBacktest(returns = historical_returns, \n", - " initial_price = carlo_config['initial_equity'], \n", - " size = carlo_config['size'], \n", - " num_simulations = carlo_config['num_simulations'],\n", - " log = carlo_config['log'])\n", - " summary_smooth = monte_smooth.summary(carlo_config['cutoff'])\n", - " summary_smooth.name = agg.target\n", - " smooth_eq_full = pd.concat([smooth_eq_full, summary_smooth], axis = 1)\n", - "\n", - "smooth_eq_full = smooth_eq_full.T\n", - "float_cols = [\n", - " 'CAGR/DD',\n", - " 'Median Skew',\n", - " 'Median $ Profit',\n", - " 'Median Var95',\n", - " 'Median Var05',\n", - " 'Best Case Final Equity (95%)',\n", - " 'Worst Case Final Equity (05%)'\n", - "]\n", - "smooth_eq_full[float_cols] = smooth_eq_full[float_cols].astype(float).round(2)\n", - "smooth_eq_full = smooth_eq_full.T\n", - "## Add median CAGR\n", - "## Median Vol\n", - "## Median Sharpe\n", - "## Median Skew" - ] - }, - { - "cell_type": "code", - "execution_count": 435, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
BASEZSCORE_1NORMZSCORE_2NORMDTE270_ROLL120BASE_ROLL120ZSCORE2_DTE270_ROLL120CHOICE_SMOOTH
Ruin13.80%4.60%12.90%15.40%15.40%11.90%0.80%
Median Drawdown-46.37%-33.87%-44.29%-45.70%-46.65%-45.44%-27.34%
Worst Drawdown-90.53%-78.77%-88.53%-90.12%-92.92%-89.87%-69.11%
Median Vol Annualized81.29%54.37%76.53%80.08%80.72%81.78%47.38%
Median $ Profit20,215.9113,835.7220,239.3320,827.1118,976.7625,063.6417,959.30
Median Return100.08%69.87%103.76%103.86%95.59%126.80%90.86%
Median CAGR174.16%116.09%181.53%181.72%165.27%228.98%155.98%
Median Skew0.620.390.510.520.730.480.49
CAGR/DD3.763.434.103.983.545.045.71
Prob>079.80%81.40%82.60%80.40%79.20%85.60%91.20%
Median Var956,415.812,776.345,764.326,258.995,975.226,841.472,442.18
Median Var05-4,865.05-1,985.84-4,348.83-4,502.10-4,272.50-4,874.89-1,802.48
Best Case Final Equity (95%)142,529.9087,645.31143,209.28158,961.37143,890.78160,326.2482,082.44
Worst Case Final Equity (05%)10,207.5013,816.7110,394.189,244.3410,291.2111,568.9517,291.70
\n", - "
" - ], - "text/plain": [ - " BASE ZSCORE_1NORM ZSCORE_2NORM \\\n", - "Ruin 13.80% 4.60% 12.90% \n", - "Median Drawdown -46.37% -33.87% -44.29% \n", - "Worst Drawdown -90.53% -78.77% -88.53% \n", - "Median Vol Annualized 81.29% 54.37% 76.53% \n", - "Median $ Profit 20,215.91 13,835.72 20,239.33 \n", - "Median Return 100.08% 69.87% 103.76% \n", - "Median CAGR 174.16% 116.09% 181.53% \n", - "Median Skew 0.62 0.39 0.51 \n", - "CAGR/DD 3.76 3.43 4.10 \n", - "Prob>0 79.80% 81.40% 82.60% \n", - "Median Var95 6,415.81 2,776.34 5,764.32 \n", - "Median Var05 -4,865.05 -1,985.84 -4,348.83 \n", - "Best Case Final Equity (95%) 142,529.90 87,645.31 143,209.28 \n", - "Worst Case Final Equity (05%) 10,207.50 13,816.71 10,394.18 \n", - "\n", - " DTE270_ROLL120 BASE_ROLL120 \\\n", - "Ruin 15.40% 15.40% \n", - "Median Drawdown -45.70% -46.65% \n", - "Worst Drawdown -90.12% -92.92% \n", - "Median Vol Annualized 80.08% 80.72% \n", - "Median $ Profit 20,827.11 18,976.76 \n", - "Median Return 103.86% 95.59% \n", - "Median CAGR 181.72% 165.27% \n", - "Median Skew 0.52 0.73 \n", - "CAGR/DD 3.98 3.54 \n", - "Prob>0 80.40% 79.20% \n", - "Median Var95 6,258.99 5,975.22 \n", - "Median Var05 -4,502.10 -4,272.50 \n", - "Best Case Final Equity (95%) 158,961.37 143,890.78 \n", - "Worst Case Final Equity (05%) 9,244.34 10,291.21 \n", - "\n", - " ZSCORE2_DTE270_ROLL120 CHOICE_SMOOTH \n", - "Ruin 11.90% 0.80% \n", - "Median Drawdown -45.44% -27.34% \n", - "Worst Drawdown -89.87% -69.11% \n", - "Median Vol Annualized 81.78% 47.38% \n", - "Median $ Profit 25,063.64 17,959.30 \n", - "Median Return 126.80% 90.86% \n", - "Median CAGR 228.98% 155.98% \n", - "Median Skew 0.48 0.49 \n", - "CAGR/DD 5.04 5.71 \n", - "Prob>0 85.60% 91.20% \n", - "Median Var95 6,841.47 2,442.18 \n", - "Median Var05 -4,874.89 -1,802.48 \n", - "Best Case Final Equity (95%) 160,326.24 82,082.44 \n", - "Worst Case Final Equity (05%) 11,568.95 17,291.70 " - ] - }, - "execution_count": 435, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "smooth_eq_full" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### WINSORIZE & SKIP ADJUSTED" - ] - }, - { - "cell_type": "code", - "execution_count": 432, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
BASEZSCORE_1NORMZSCORE_2NORMDTE270_ROLL120BASE_ROLL120ZSCORE2_DTE270_ROLL120CHOICE_SMOOTH
Ruin18.10%5.10%19.80%18.70%18.10%17.70%5.00%
Median Drawdown-51.19%-36.10%-51.41%-50.54%-50.74%-51.26%-34.80%
Worst Drawdown-94.31%-82.96%-93.78%-94.36%-92.52%-94.33%-81.83%
Median Vol Annualized90.07%58.54%89.13%90.72%88.19%93.89%58.85%
Median $ Profit20,230.0912,592.7415,712.5220,597.9418,224.0621,274.4214,455.40
Median Return100.40%62.46%77.92%103.06%89.58%104.88%71.98%
Median CAGR174.80%102.51%131.13%180.12%153.48%183.78%120.00%
Median Skew0.540.420.450.690.530.640.60
CAGR/DD3.412.842.553.563.023.593.45
Prob>077.40%80.00%75.70%78.50%78.80%78.70%83.80%
Median Var958,985.363,422.158,417.978,144.137,701.149,899.223,713.05
Median Var05-6,555.11-2,659.50-6,157.20-6,065.88-5,810.75-7,245.75-2,481.76
Best Case Final Equity (95%)177,320.0386,284.55162,943.54177,056.53149,381.17201,199.0189,810.25
Worst Case Final Equity (05%)10,053.8013,450.389,623.638,741.628,920.549,983.9113,558.06
\n", - "
" - ], - "text/plain": [ - " BASE ZSCORE_1NORM ZSCORE_2NORM \\\n", - "Ruin 18.10% 5.10% 19.80% \n", - "Median Drawdown -51.19% -36.10% -51.41% \n", - "Worst Drawdown -94.31% -82.96% -93.78% \n", - "Median Vol Annualized 90.07% 58.54% 89.13% \n", - "Median $ Profit 20,230.09 12,592.74 15,712.52 \n", - "Median Return 100.40% 62.46% 77.92% \n", - "Median CAGR 174.80% 102.51% 131.13% \n", - "Median Skew 0.54 0.42 0.45 \n", - "CAGR/DD 3.41 2.84 2.55 \n", - "Prob>0 77.40% 80.00% 75.70% \n", - "Median Var95 8,985.36 3,422.15 8,417.97 \n", - "Median Var05 -6,555.11 -2,659.50 -6,157.20 \n", - "Best Case Final Equity (95%) 177,320.03 86,284.55 162,943.54 \n", - "Worst Case Final Equity (05%) 10,053.80 13,450.38 9,623.63 \n", - "\n", - " DTE270_ROLL120 BASE_ROLL120 \\\n", - "Ruin 18.70% 18.10% \n", - "Median Drawdown -50.54% -50.74% \n", - "Worst Drawdown -94.36% -92.52% \n", - "Median Vol Annualized 90.72% 88.19% \n", - "Median $ Profit 20,597.94 18,224.06 \n", - "Median Return 103.06% 89.58% \n", - "Median CAGR 180.12% 153.48% \n", - "Median Skew 0.69 0.53 \n", - "CAGR/DD 3.56 3.02 \n", - "Prob>0 78.50% 78.80% \n", - "Median Var95 8,144.13 7,701.14 \n", - "Median Var05 -6,065.88 -5,810.75 \n", - "Best Case Final Equity (95%) 177,056.53 149,381.17 \n", - "Worst Case Final Equity (05%) 8,741.62 8,920.54 \n", - "\n", - " ZSCORE2_DTE270_ROLL120 CHOICE_SMOOTH \n", - "Ruin 17.70% 5.00% \n", - "Median Drawdown -51.26% -34.80% \n", - "Worst Drawdown -94.33% -81.83% \n", - "Median Vol Annualized 93.89% 58.85% \n", - "Median $ Profit 21,274.42 14,455.40 \n", - "Median Return 104.88% 71.98% \n", - "Median CAGR 183.78% 120.00% \n", - "Median Skew 0.64 0.60 \n", - "CAGR/DD 3.59 3.45 \n", - "Prob>0 78.70% 83.80% \n", - "Median Var95 9,899.22 3,713.05 \n", - "Median Var05 -7,245.75 -2,481.76 \n", - "Best Case Final Equity (95%) 201,199.01 89,810.25 \n", - "Worst Case Final Equity (05%) 9,983.91 13,558.06 " - ] - }, - "execution_count": 432, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "full_monte_win_skip = pd.DataFrame()\n", - "for agg in aggregators:\n", - " equity2 = agg._equity.copy()\n", - " equity2 = add_skip_columns(\n", - " equity2, \n", - " 'IGNORE',\n", - " ['Total'],\n", - " carlo_config['skip_window'],\n", - " carlo_config['skip_thresh']\n", - "\n", - " )\n", - "\n", - " equity2['ffwd_total'] = equity2.Total\n", - " equity2.loc[equity2.Total_skip_day == True, 'ffwd_total'] = np.nan\n", - " equity2.ffwd_total.fillna(method = 'ffill', inplace = True)\n", - "\n", - "\n", - " log_returns = np.log(equity2.ffwd_total/ equity2.ffwd_total.shift(1)).dropna()\n", - " clipped_returns = winsorize(log_returns, limits=[0.01, 0.01])\n", - "\n", - "\n", - " monte_winsorize_skip = MonteCarloBacktest(returns = clipped_returns, \n", - " initial_price = carlo_config['initial_equity'], \n", - " size = carlo_config['size'], \n", - " num_simulations = carlo_config['num_simulations'],\n", - " log = carlo_config['log'])\n", - " summary_winsorize_skip = monte_winsorize_skip.summary(carlo_config['cutoff'])\n", - " summary_winsorize_skip.name = agg.target\n", - " full_monte_win_skip = pd.concat([full_monte_win_skip, summary_winsorize_skip], axis = 1)\n", - "\n", - "full_monte_win_skip = full_monte_win_skip.T\n", - "full_monte_win_skip[float_cols] = full_monte_win_skip[float_cols].astype(float).round(2)\n", - "full_monte_win_skip = full_monte_win_skip.T\n", - "full_monte_win_skip" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## STRATEGY STATS" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "stats_interest = [\n", - " 'Duration',\n", - " 'Exposure Time [%]',\n", - " 'Equity Final [$]',\n", - " 'Return [%]',\n", - " 'Median Daily Return [%]',\n", - " 'VaR 95% [%]',\n", - " 'VaR 05% [%]',\n", - " 'CAGR [%]',\n", - " 'Volatility Ann. [%]',\n", - " 'Sharpe Ratio',\n", - " 'Log Return Skew',\n", - " 'Max. Drawdown [%]',\n", - " 'Avg. Drawdown [%]',\n", - " 'Avg Dradown Duration',\n", - " '# Trades',\n", - " 'Best Trade [%]',\n", - " 'Worst Trade [%]',\n", - " 'Avg. Winning Trade [%]',\n", - " 'Avg. Losing Trade [%]',\n", - " 'Avg Win Trade Duration',\n", - " 'Avg Lose Duration',\n", - " 'Expectancy [%]',\n", - "\n", - "]\n", - "\n", - "agg_stats = pd.DataFrame()\n", - "for agg in aggregators:\n", - " aggregate = agg.aggregate()\n", - " add_stats = [ x for x in aggregate.index if x.endswith(' Return [%]')]\n", - " agg_stats[agg.target] = aggregate[stats_interest + add_stats]\n", - "\n", - "\n", - "## What's calmar & sortino ratio" - ] - }, - { - "cell_type": "code", - "execution_count": 175, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
BASEZSCORE_1NORMZSCORE_2NORMDTE270_ROLL120BASE_ROLL120ZSCORE2_DTE270_ROLL120CHOICE_SMOOTH
Duration2979 days 00:00:002979 days 00:00:002979 days 00:00:002979 days 00:00:002979 days 00:00:002979 days 00:00:002979 days 00:00:00
Exposure Time [%]100.00100.00100.00100.00100.00100.00100.00
Equity Final [$]3,123,689.73985,139.884,208,470.694,912,997.002,725,686.5111,139,994.623,600,435.93
Return [%]15,983.324,910.0321,540.9324,791.1613,785.1556,594.6618,231.45
Median Daily Return [%]0.1537%0.1313%0.2248%0.1892%0.1338%0.2874%0.2063%
VaR 95% [%]-13.64%-9.32%-13.94%-12.97%-13.29%-13.59%-6.52%
VaR 05% [%]16.20%11.14%15.29%16.64%16.77%16.69%7.46%
CAGR [%]86.3561.5493.2596.6083.03117.4689.36
Volatility Ann. [%]209.59138.60193.38199.18211.38207.1783.28
Sharpe Ratio1.230.991.221.221.211.271.17
Log Return Skew-0.33-0.11-0.38-0.13-0.25-0.07-0.01
Max. Drawdown [%]-73.47-61.01-64.40-87.94-73.69-88.04-81.86
Avg. Drawdown [%]-26.46-16.84-23.67-35.42-27.69-31.69-29.41
Avg Dradown Duration135 days 22:10:14.634146342116 days 21:33:17.972630512114 days 18:13:54.146341464161 days 23:01:30.936106984142 days 15:39:02.102590148166 days 16:39:07.514910536167 days 22:20:50.048496606
# Trades225225225252208251251
Best Trade [%]462.39465.08455.52473.87514.89509.28353.12
Worst Trade [%]-100.65-100.79-100.79-107.20-100.79-101.05-91.05
Avg. Winning Trade [%]84.0779.3687.6290.9991.1395.1491.06
Avg. Losing Trade [%]-33.98-31.51-33.05-35.01-33.85-36.72-33.58
Avg Win Trade Duration95.3096.2394.6784.11102.6983.5385.21
Avg Lose Duration47.5146.0849.0046.3950.7245.9046.11
Expectancy [%]26.3525.6627.5526.7326.2428.4225.51
Median Daily Return [%]0.1537%0.1313%0.2248%0.1892%0.1338%0.2874%0.2063%
2017 Return [%]151.9282.75149.83147.17144.27158.51169.36
2018 Return [%]21.3826.6633.9034.0511.8059.1748.75
2019 Return [%]11.599.6428.8719.9111.5027.0229.91
2020 Return [%]411.89308.03466.04420.55370.00552.07248.64
2021 Return [%]43.8627.6258.55133.4232.69145.9288.35
2022 Return [%]-24.78-12.63-23.16-40.46-25.11-39.23-37.84
2023 Return [%]207.28102.88162.76181.62196.97173.82160.53
2024 Return [%]90.8761.43117.64137.28127.17211.74215.77
2025 Return [%]23.9822.9314.8534.4724.9132.5613.86
\n", - "
" - ], - "text/plain": [ - " BASE \\\n", - "Duration 2979 days 00:00:00 \n", - "Exposure Time [%] 100.00 \n", - "Equity Final [$] 3,123,689.73 \n", - "Return [%] 15,983.32 \n", - "Median Daily Return [%] 0.1537% \n", - "VaR 95% [%] -13.64% \n", - "VaR 05% [%] 16.20% \n", - "CAGR [%] 86.35 \n", - "Volatility Ann. [%] 209.59 \n", - "Sharpe Ratio 1.23 \n", - "Log Return Skew -0.33 \n", - "Max. Drawdown [%] -73.47 \n", - "Avg. Drawdown [%] -26.46 \n", - "Avg Dradown Duration 135 days 22:10:14.634146342 \n", - "# Trades 225 \n", - "Best Trade [%] 462.39 \n", - "Worst Trade [%] -100.65 \n", - "Avg. Winning Trade [%] 84.07 \n", - "Avg. Losing Trade [%] -33.98 \n", - "Avg Win Trade Duration 95.30 \n", - "Avg Lose Duration 47.51 \n", - "Expectancy [%] 26.35 \n", - "Median Daily Return [%] 0.1537% \n", - "2017 Return [%] 151.92 \n", - "2018 Return [%] 21.38 \n", - "2019 Return [%] 11.59 \n", - "2020 Return [%] 411.89 \n", - "2021 Return [%] 43.86 \n", - "2022 Return [%] -24.78 \n", - "2023 Return [%] 207.28 \n", - "2024 Return [%] 90.87 \n", - "2025 Return [%] 23.98 \n", - "\n", - " ZSCORE_1NORM \\\n", - "Duration 2979 days 00:00:00 \n", - "Exposure Time [%] 100.00 \n", - "Equity Final [$] 985,139.88 \n", - "Return [%] 4,910.03 \n", - "Median Daily Return [%] 0.1313% \n", - "VaR 95% [%] -9.32% \n", - "VaR 05% [%] 11.14% \n", - "CAGR [%] 61.54 \n", - "Volatility Ann. [%] 138.60 \n", - "Sharpe Ratio 0.99 \n", - "Log Return Skew -0.11 \n", - "Max. Drawdown [%] -61.01 \n", - "Avg. Drawdown [%] -16.84 \n", - "Avg Dradown Duration 116 days 21:33:17.972630512 \n", - "# Trades 225 \n", - "Best Trade [%] 465.08 \n", - "Worst Trade [%] -100.79 \n", - "Avg. Winning Trade [%] 79.36 \n", - "Avg. Losing Trade [%] -31.51 \n", - "Avg Win Trade Duration 96.23 \n", - "Avg Lose Duration 46.08 \n", - "Expectancy [%] 25.66 \n", - "Median Daily Return [%] 0.1313% \n", - "2017 Return [%] 82.75 \n", - "2018 Return [%] 26.66 \n", - "2019 Return [%] 9.64 \n", - "2020 Return [%] 308.03 \n", - "2021 Return [%] 27.62 \n", - "2022 Return [%] -12.63 \n", - "2023 Return [%] 102.88 \n", - "2024 Return [%] 61.43 \n", - "2025 Return [%] 22.93 \n", - "\n", - " ZSCORE_2NORM \\\n", - "Duration 2979 days 00:00:00 \n", - "Exposure Time [%] 100.00 \n", - "Equity Final [$] 4,208,470.69 \n", - "Return [%] 21,540.93 \n", - "Median Daily Return [%] 0.2248% \n", - "VaR 95% [%] -13.94% \n", - "VaR 05% [%] 15.29% \n", - "CAGR [%] 93.25 \n", - "Volatility Ann. [%] 193.38 \n", - "Sharpe Ratio 1.22 \n", - "Log Return Skew -0.38 \n", - "Max. Drawdown [%] -64.40 \n", - "Avg. Drawdown [%] -23.67 \n", - "Avg Dradown Duration 114 days 18:13:54.146341464 \n", - "# Trades 225 \n", - "Best Trade [%] 455.52 \n", - "Worst Trade [%] -100.79 \n", - "Avg. Winning Trade [%] 87.62 \n", - "Avg. Losing Trade [%] -33.05 \n", - "Avg Win Trade Duration 94.67 \n", - "Avg Lose Duration 49.00 \n", - "Expectancy [%] 27.55 \n", - "Median Daily Return [%] 0.2248% \n", - "2017 Return [%] 149.83 \n", - "2018 Return [%] 33.90 \n", - "2019 Return [%] 28.87 \n", - "2020 Return [%] 466.04 \n", - "2021 Return [%] 58.55 \n", - "2022 Return [%] -23.16 \n", - "2023 Return [%] 162.76 \n", - "2024 Return [%] 117.64 \n", - "2025 Return [%] 14.85 \n", - "\n", - " DTE270_ROLL120 \\\n", - "Duration 2979 days 00:00:00 \n", - "Exposure Time [%] 100.00 \n", - "Equity Final [$] 4,912,997.00 \n", - "Return [%] 24,791.16 \n", - "Median Daily Return [%] 0.1892% \n", - "VaR 95% [%] -12.97% \n", - "VaR 05% [%] 16.64% \n", - "CAGR [%] 96.60 \n", - "Volatility Ann. [%] 199.18 \n", - "Sharpe Ratio 1.22 \n", - "Log Return Skew -0.13 \n", - "Max. Drawdown [%] -87.94 \n", - "Avg. Drawdown [%] -35.42 \n", - "Avg Dradown Duration 161 days 23:01:30.936106984 \n", - "# Trades 252 \n", - "Best Trade [%] 473.87 \n", - "Worst Trade [%] -107.20 \n", - "Avg. Winning Trade [%] 90.99 \n", - "Avg. Losing Trade [%] -35.01 \n", - "Avg Win Trade Duration 84.11 \n", - "Avg Lose Duration 46.39 \n", - "Expectancy [%] 26.73 \n", - "Median Daily Return [%] 0.1892% \n", - "2017 Return [%] 147.17 \n", - "2018 Return [%] 34.05 \n", - "2019 Return [%] 19.91 \n", - "2020 Return [%] 420.55 \n", - "2021 Return [%] 133.42 \n", - "2022 Return [%] -40.46 \n", - "2023 Return [%] 181.62 \n", - "2024 Return [%] 137.28 \n", - "2025 Return [%] 34.47 \n", - "\n", - " BASE_ROLL120 \\\n", - "Duration 2979 days 00:00:00 \n", - "Exposure Time [%] 100.00 \n", - "Equity Final [$] 2,725,686.51 \n", - "Return [%] 13,785.15 \n", - "Median Daily Return [%] 0.1338% \n", - "VaR 95% [%] -13.29% \n", - "VaR 05% [%] 16.77% \n", - "CAGR [%] 83.03 \n", - "Volatility Ann. [%] 211.38 \n", - "Sharpe Ratio 1.21 \n", - "Log Return Skew -0.25 \n", - "Max. Drawdown [%] -73.69 \n", - "Avg. Drawdown [%] -27.69 \n", - "Avg Dradown Duration 142 days 15:39:02.102590148 \n", - "# Trades 208 \n", - "Best Trade [%] 514.89 \n", - "Worst Trade [%] -100.79 \n", - "Avg. Winning Trade [%] 91.13 \n", - "Avg. Losing Trade [%] -33.85 \n", - "Avg Win Trade Duration 102.69 \n", - "Avg Lose Duration 50.72 \n", - "Expectancy [%] 26.24 \n", - "Median Daily Return [%] 0.1338% \n", - "2017 Return [%] 144.27 \n", - "2018 Return [%] 11.80 \n", - "2019 Return [%] 11.50 \n", - "2020 Return [%] 370.00 \n", - "2021 Return [%] 32.69 \n", - "2022 Return [%] -25.11 \n", - "2023 Return [%] 196.97 \n", - "2024 Return [%] 127.17 \n", - "2025 Return [%] 24.91 \n", - "\n", - " ZSCORE2_DTE270_ROLL120 \\\n", - "Duration 2979 days 00:00:00 \n", - "Exposure Time [%] 100.00 \n", - "Equity Final [$] 11,139,994.62 \n", - "Return [%] 56,594.66 \n", - "Median Daily Return [%] 0.2874% \n", - "VaR 95% [%] -13.59% \n", - "VaR 05% [%] 16.69% \n", - "CAGR [%] 117.46 \n", - "Volatility Ann. [%] 207.17 \n", - "Sharpe Ratio 1.27 \n", - "Log Return Skew -0.07 \n", - "Max. Drawdown [%] -88.04 \n", - "Avg. Drawdown [%] -31.69 \n", - "Avg Dradown Duration 166 days 16:39:07.514910536 \n", - "# Trades 251 \n", - "Best Trade [%] 509.28 \n", - "Worst Trade [%] -101.05 \n", - "Avg. Winning Trade [%] 95.14 \n", - "Avg. Losing Trade [%] -36.72 \n", - "Avg Win Trade Duration 83.53 \n", - "Avg Lose Duration 45.90 \n", - "Expectancy [%] 28.42 \n", - "Median Daily Return [%] 0.2874% \n", - "2017 Return [%] 158.51 \n", - "2018 Return [%] 59.17 \n", - "2019 Return [%] 27.02 \n", - "2020 Return [%] 552.07 \n", - "2021 Return [%] 145.92 \n", - "2022 Return [%] -39.23 \n", - "2023 Return [%] 173.82 \n", - "2024 Return [%] 211.74 \n", - "2025 Return [%] 32.56 \n", - "\n", - " CHOICE_SMOOTH \n", - "Duration 2979 days 00:00:00 \n", - "Exposure Time [%] 100.00 \n", - "Equity Final [$] 3,600,435.93 \n", - "Return [%] 18,231.45 \n", - "Median Daily Return [%] 0.2063% \n", - "VaR 95% [%] -6.52% \n", - "VaR 05% [%] 7.46% \n", - "CAGR [%] 89.36 \n", - "Volatility Ann. [%] 83.28 \n", - "Sharpe Ratio 1.17 \n", - "Log Return Skew -0.01 \n", - "Max. Drawdown [%] -81.86 \n", - "Avg. Drawdown [%] -29.41 \n", - "Avg Dradown Duration 167 days 22:20:50.048496606 \n", - "# Trades 251 \n", - "Best Trade [%] 353.12 \n", - "Worst Trade [%] -91.05 \n", - "Avg. Winning Trade [%] 91.06 \n", - "Avg. Losing Trade [%] -33.58 \n", - "Avg Win Trade Duration 85.21 \n", - "Avg Lose Duration 46.11 \n", - "Expectancy [%] 25.51 \n", - "Median Daily Return [%] 0.2063% \n", - "2017 Return [%] 169.36 \n", - "2018 Return [%] 48.75 \n", - "2019 Return [%] 29.91 \n", - "2020 Return [%] 248.64 \n", - "2021 Return [%] 88.35 \n", - "2022 Return [%] -37.84 \n", - "2023 Return [%] 160.53 \n", - "2024 Return [%] 215.77 \n", - "2025 Return [%] 13.86 " - ] - }, - "execution_count": 175, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "agg_stats\n", - "# aggregators[-1].daily_rtrns().median()\n", - "# aggregators[-1].aggregate()" - ] - }, - { - "cell_type": "code", - "execution_count": 171, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
BASEZSCORE_1NORMZSCORE_2NORMDTE270_ROLL120BASE_ROLL120ZSCORE2_DTE270_ROLL120CHOICE_SMOOTH
Duration2979 days 00:00:002979 days 00:00:002979 days 00:00:002979 days 00:00:002979 days 00:00:002979 days 00:00:002979 days 00:00:00
Exposure Time [%]95.4795.4795.4797.2695.4797.2697.26
Equity Final [$]3,123,689.73985,139.884,208,470.694,912,997.002,725,686.5111,139,994.623,600,435.93
Return [%]15,983.324,910.0321,540.9324,791.1613,785.1556,594.6618,231.45
Median Daily Return [%]0.0000%0.0000%0.0000%0.0000%0.0000%0.0594%0.1249%
VaR 95% [%]-13.22%-8.84%-13.08%-12.80%-12.75%-13.05%-6.44%
VaR 05% [%]15.18%10.50%14.74%16.06%16.03%15.76%7.28%
CAGR [%]86.3561.5493.2596.6083.03117.4689.36
Volatility Ann. [%]209.64138.62193.42199.20211.42207.2083.28
Sharpe Ratio1.230.991.221.221.211.271.17
Log Return Skew-0.34-0.11-0.39-0.13-0.25-0.07-0.00
Max. Drawdown [%]-73.47-61.01-64.40-87.94-73.69-88.04-81.86
Avg. Drawdown [%]-26.99-17.44-24.34-35.92-28.07-32.11-29.93
Avg Dradown Duration135 days 18:50:56.603773584117 days 08:28:45.283018868115 days 02:40:58.867924528162 days 17:49:07.924528302141 days 19:18:06.792452830167 days 09:40:04.528301886168 days 20:38:15.849056604
# Trades225225225252208251251
Best Trade [%]462.39465.08455.52473.87514.89509.28353.12
Worst Trade [%]-100.65-100.79-100.79-107.20-100.79-101.05-91.05
Avg. Winning Trade [%]84.0779.3687.6290.9991.1395.1491.06
Avg. Losing Trade [%]-33.98-31.51-33.05-35.01-33.85-36.72-33.58
Avg Win Trade Duration95.3096.2394.6784.11102.6983.5385.21
Avg Lose Duration47.5146.0849.0046.3950.7245.9046.11
Expectancy [%]26.3525.6627.5526.7326.2428.4225.51
Median Daily Return [%]0.0000%0.0000%0.0000%0.0000%0.0000%0.0594%0.1249%
2017 Return [%]151.9282.75149.83147.17144.27158.51169.36
2018 Return [%]21.3826.6633.9034.0511.8059.1748.75
2019 Return [%]11.599.6428.8719.9111.5027.0229.91
2020 Return [%]411.89308.03466.04420.55370.00552.07248.64
2021 Return [%]43.8627.6258.55133.4232.69145.9288.35
2022 Return [%]-24.78-12.63-23.16-40.46-25.11-39.23-37.84
2023 Return [%]207.28102.88162.76181.62196.97173.82160.53
2024 Return [%]90.8761.43117.64137.28127.17211.74215.77
2025 Return [%]23.9822.9314.8534.4724.9132.5613.86
\n", - "
" - ], - "text/plain": [ - " BASE \\\n", - "Duration 2979 days 00:00:00 \n", - "Exposure Time [%] 95.47 \n", - "Equity Final [$] 3,123,689.73 \n", - "Return [%] 15,983.32 \n", - "Median Daily Return [%] 0.0000% \n", - "VaR 95% [%] -13.22% \n", - "VaR 05% [%] 15.18% \n", - "CAGR [%] 86.35 \n", - "Volatility Ann. [%] 209.64 \n", - "Sharpe Ratio 1.23 \n", - "Log Return Skew -0.34 \n", - "Max. Drawdown [%] -73.47 \n", - "Avg. Drawdown [%] -26.99 \n", - "Avg Dradown Duration 135 days 18:50:56.603773584 \n", - "# Trades 225 \n", - "Best Trade [%] 462.39 \n", - "Worst Trade [%] -100.65 \n", - "Avg. Winning Trade [%] 84.07 \n", - "Avg. Losing Trade [%] -33.98 \n", - "Avg Win Trade Duration 95.30 \n", - "Avg Lose Duration 47.51 \n", - "Expectancy [%] 26.35 \n", - "Median Daily Return [%] 0.0000% \n", - "2017 Return [%] 151.92 \n", - "2018 Return [%] 21.38 \n", - "2019 Return [%] 11.59 \n", - "2020 Return [%] 411.89 \n", - "2021 Return [%] 43.86 \n", - "2022 Return [%] -24.78 \n", - "2023 Return [%] 207.28 \n", - "2024 Return [%] 90.87 \n", - "2025 Return [%] 23.98 \n", - "\n", - " ZSCORE_1NORM \\\n", - "Duration 2979 days 00:00:00 \n", - "Exposure Time [%] 95.47 \n", - "Equity Final [$] 985,139.88 \n", - "Return [%] 4,910.03 \n", - "Median Daily Return [%] 0.0000% \n", - "VaR 95% [%] -8.84% \n", - "VaR 05% [%] 10.50% \n", - "CAGR [%] 61.54 \n", - "Volatility Ann. [%] 138.62 \n", - "Sharpe Ratio 0.99 \n", - "Log Return Skew -0.11 \n", - "Max. Drawdown [%] -61.01 \n", - "Avg. Drawdown [%] -17.44 \n", - "Avg Dradown Duration 117 days 08:28:45.283018868 \n", - "# Trades 225 \n", - "Best Trade [%] 465.08 \n", - "Worst Trade [%] -100.79 \n", - "Avg. Winning Trade [%] 79.36 \n", - "Avg. Losing Trade [%] -31.51 \n", - "Avg Win Trade Duration 96.23 \n", - "Avg Lose Duration 46.08 \n", - "Expectancy [%] 25.66 \n", - "Median Daily Return [%] 0.0000% \n", - "2017 Return [%] 82.75 \n", - "2018 Return [%] 26.66 \n", - "2019 Return [%] 9.64 \n", - "2020 Return [%] 308.03 \n", - "2021 Return [%] 27.62 \n", - "2022 Return [%] -12.63 \n", - "2023 Return [%] 102.88 \n", - "2024 Return [%] 61.43 \n", - "2025 Return [%] 22.93 \n", - "\n", - " ZSCORE_2NORM \\\n", - "Duration 2979 days 00:00:00 \n", - "Exposure Time [%] 95.47 \n", - "Equity Final [$] 4,208,470.69 \n", - "Return [%] 21,540.93 \n", - "Median Daily Return [%] 0.0000% \n", - "VaR 95% [%] -13.08% \n", - "VaR 05% [%] 14.74% \n", - "CAGR [%] 93.25 \n", - "Volatility Ann. [%] 193.42 \n", - "Sharpe Ratio 1.22 \n", - "Log Return Skew -0.39 \n", - "Max. Drawdown [%] -64.40 \n", - "Avg. Drawdown [%] -24.34 \n", - "Avg Dradown Duration 115 days 02:40:58.867924528 \n", - "# Trades 225 \n", - "Best Trade [%] 455.52 \n", - "Worst Trade [%] -100.79 \n", - "Avg. Winning Trade [%] 87.62 \n", - "Avg. Losing Trade [%] -33.05 \n", - "Avg Win Trade Duration 94.67 \n", - "Avg Lose Duration 49.00 \n", - "Expectancy [%] 27.55 \n", - "Median Daily Return [%] 0.0000% \n", - "2017 Return [%] 149.83 \n", - "2018 Return [%] 33.90 \n", - "2019 Return [%] 28.87 \n", - "2020 Return [%] 466.04 \n", - "2021 Return [%] 58.55 \n", - "2022 Return [%] -23.16 \n", - "2023 Return [%] 162.76 \n", - "2024 Return [%] 117.64 \n", - "2025 Return [%] 14.85 \n", - "\n", - " DTE270_ROLL120 \\\n", - "Duration 2979 days 00:00:00 \n", - "Exposure Time [%] 97.26 \n", - "Equity Final [$] 4,912,997.00 \n", - "Return [%] 24,791.16 \n", - "Median Daily Return [%] 0.0000% \n", - "VaR 95% [%] -12.80% \n", - "VaR 05% [%] 16.06% \n", - "CAGR [%] 96.60 \n", - "Volatility Ann. [%] 199.20 \n", - "Sharpe Ratio 1.22 \n", - "Log Return Skew -0.13 \n", - "Max. Drawdown [%] -87.94 \n", - "Avg. Drawdown [%] -35.92 \n", - "Avg Dradown Duration 162 days 17:49:07.924528302 \n", - "# Trades 252 \n", - "Best Trade [%] 473.87 \n", - "Worst Trade [%] -107.20 \n", - "Avg. Winning Trade [%] 90.99 \n", - "Avg. Losing Trade [%] -35.01 \n", - "Avg Win Trade Duration 84.11 \n", - "Avg Lose Duration 46.39 \n", - "Expectancy [%] 26.73 \n", - "Median Daily Return [%] 0.0000% \n", - "2017 Return [%] 147.17 \n", - "2018 Return [%] 34.05 \n", - "2019 Return [%] 19.91 \n", - "2020 Return [%] 420.55 \n", - "2021 Return [%] 133.42 \n", - "2022 Return [%] -40.46 \n", - "2023 Return [%] 181.62 \n", - "2024 Return [%] 137.28 \n", - "2025 Return [%] 34.47 \n", - "\n", - " BASE_ROLL120 \\\n", - "Duration 2979 days 00:00:00 \n", - "Exposure Time [%] 95.47 \n", - "Equity Final [$] 2,725,686.51 \n", - "Return [%] 13,785.15 \n", - "Median Daily Return [%] 0.0000% \n", - "VaR 95% [%] -12.75% \n", - "VaR 05% [%] 16.03% \n", - "CAGR [%] 83.03 \n", - "Volatility Ann. [%] 211.42 \n", - "Sharpe Ratio 1.21 \n", - "Log Return Skew -0.25 \n", - "Max. Drawdown [%] -73.69 \n", - "Avg. Drawdown [%] -28.07 \n", - "Avg Dradown Duration 141 days 19:18:06.792452830 \n", - "# Trades 208 \n", - "Best Trade [%] 514.89 \n", - "Worst Trade [%] -100.79 \n", - "Avg. Winning Trade [%] 91.13 \n", - "Avg. Losing Trade [%] -33.85 \n", - "Avg Win Trade Duration 102.69 \n", - "Avg Lose Duration 50.72 \n", - "Expectancy [%] 26.24 \n", - "Median Daily Return [%] 0.0000% \n", - "2017 Return [%] 144.27 \n", - "2018 Return [%] 11.80 \n", - "2019 Return [%] 11.50 \n", - "2020 Return [%] 370.00 \n", - "2021 Return [%] 32.69 \n", - "2022 Return [%] -25.11 \n", - "2023 Return [%] 196.97 \n", - "2024 Return [%] 127.17 \n", - "2025 Return [%] 24.91 \n", - "\n", - " ZSCORE2_DTE270_ROLL120 \\\n", - "Duration 2979 days 00:00:00 \n", - "Exposure Time [%] 97.26 \n", - "Equity Final [$] 11,139,994.62 \n", - "Return [%] 56,594.66 \n", - "Median Daily Return [%] 0.0594% \n", - "VaR 95% [%] -13.05% \n", - "VaR 05% [%] 15.76% \n", - "CAGR [%] 117.46 \n", - "Volatility Ann. [%] 207.20 \n", - "Sharpe Ratio 1.27 \n", - "Log Return Skew -0.07 \n", - "Max. Drawdown [%] -88.04 \n", - "Avg. Drawdown [%] -32.11 \n", - "Avg Dradown Duration 167 days 09:40:04.528301886 \n", - "# Trades 251 \n", - "Best Trade [%] 509.28 \n", - "Worst Trade [%] -101.05 \n", - "Avg. Winning Trade [%] 95.14 \n", - "Avg. Losing Trade [%] -36.72 \n", - "Avg Win Trade Duration 83.53 \n", - "Avg Lose Duration 45.90 \n", - "Expectancy [%] 28.42 \n", - "Median Daily Return [%] 0.0594% \n", - "2017 Return [%] 158.51 \n", - "2018 Return [%] 59.17 \n", - "2019 Return [%] 27.02 \n", - "2020 Return [%] 552.07 \n", - "2021 Return [%] 145.92 \n", - "2022 Return [%] -39.23 \n", - "2023 Return [%] 173.82 \n", - "2024 Return [%] 211.74 \n", - "2025 Return [%] 32.56 \n", - "\n", - " CHOICE_SMOOTH \n", - "Duration 2979 days 00:00:00 \n", - "Exposure Time [%] 97.26 \n", - "Equity Final [$] 3,600,435.93 \n", - "Return [%] 18,231.45 \n", - "Median Daily Return [%] 0.1249% \n", - "VaR 95% [%] -6.44% \n", - "VaR 05% [%] 7.28% \n", - "CAGR [%] 89.36 \n", - "Volatility Ann. [%] 83.28 \n", - "Sharpe Ratio 1.17 \n", - "Log Return Skew -0.00 \n", - "Max. Drawdown [%] -81.86 \n", - "Avg. Drawdown [%] -29.93 \n", - "Avg Dradown Duration 168 days 20:38:15.849056604 \n", - "# Trades 251 \n", - "Best Trade [%] 353.12 \n", - "Worst Trade [%] -91.05 \n", - "Avg. Winning Trade [%] 91.06 \n", - "Avg. Losing Trade [%] -33.58 \n", - "Avg Win Trade Duration 85.21 \n", - "Avg Lose Duration 46.11 \n", - "Expectancy [%] 25.51 \n", - "Median Daily Return [%] 0.1249% \n", - "2017 Return [%] 169.36 \n", - "2018 Return [%] 48.75 \n", - "2019 Return [%] 29.91 \n", - "2020 Return [%] 248.64 \n", - "2021 Return [%] 88.35 \n", - "2022 Return [%] -37.84 \n", - "2023 Return [%] 160.53 \n", - "2024 Return [%] 215.77 \n", - "2025 Return [%] 13.86 " - ] - }, - "execution_count": 171, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "agg_stats" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## YEARLY STATISTICS DRILL DOWN" - ] - }, - { - "cell_type": "code", - "execution_count": 163, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
BASEZSCORE_1NORMZSCORE_2NORMDTE270_ROLL120BASE_ROLL120ZSCORE2_DTE270_ROLL120CHOICE_SMOOTH
Return [%]-0.25-0.13-0.23-0.40-0.25-0.39-0.38
Vol Annualized [%]1.200.861.210.511.150.520.26
Sharpe0.340.240.36-0.860.30-0.79-1.89
Max DrawDown [%]-49.95-40.57-49.89-41.73-48.10-42.26-40.85
Max DrawDown Duration277 days 00:00:00277 days 00:00:00277 days 00:00:00361 days 00:00:00277 days 00:00:00361 days 00:00:00361 days 00:00:00
#Trades18.0018.0018.0023.0018.0023.0023.00
Win Rate [%]22.2222.2222.2213.0422.2213.0413.04
Expectancy [%]-19.59-15.01-19.13-21.06-19.28-20.23-21.12
95 Quantile ($)59,396.2525,630.3390,204.4835,111.3844,341.5069,610.3211,686.55
5 Quantile ($)-66,684.25-20,259.38-94,079.40-54,779.95-50,754.75-95,299.36-17,676.51
95 Quantile (%)0.130.100.130.050.130.050.03
5 Quantile (%)-0.12-0.08-0.12-0.07-0.12-0.07-0.03
\n", - "
" - ], - "text/plain": [ - " BASE ZSCORE_1NORM \\\n", - "Return [%] -0.25 -0.13 \n", - "Vol Annualized [%] 1.20 0.86 \n", - "Sharpe 0.34 0.24 \n", - "Max DrawDown [%] -49.95 -40.57 \n", - "Max DrawDown Duration 277 days 00:00:00 277 days 00:00:00 \n", - "#Trades 18.00 18.00 \n", - "Win Rate [%] 22.22 22.22 \n", - "Expectancy [%] -19.59 -15.01 \n", - "95 Quantile ($) 59,396.25 25,630.33 \n", - "5 Quantile ($) -66,684.25 -20,259.38 \n", - "95 Quantile (%) 0.13 0.10 \n", - "5 Quantile (%) -0.12 -0.08 \n", - "\n", - " ZSCORE_2NORM DTE270_ROLL120 \\\n", - "Return [%] -0.23 -0.40 \n", - "Vol Annualized [%] 1.21 0.51 \n", - "Sharpe 0.36 -0.86 \n", - "Max DrawDown [%] -49.89 -41.73 \n", - "Max DrawDown Duration 277 days 00:00:00 361 days 00:00:00 \n", - "#Trades 18.00 23.00 \n", - "Win Rate [%] 22.22 13.04 \n", - "Expectancy [%] -19.13 -21.06 \n", - "95 Quantile ($) 90,204.48 35,111.38 \n", - "5 Quantile ($) -94,079.40 -54,779.95 \n", - "95 Quantile (%) 0.13 0.05 \n", - "5 Quantile (%) -0.12 -0.07 \n", - "\n", - " BASE_ROLL120 ZSCORE2_DTE270_ROLL120 \\\n", - "Return [%] -0.25 -0.39 \n", - "Vol Annualized [%] 1.15 0.52 \n", - "Sharpe 0.30 -0.79 \n", - "Max DrawDown [%] -48.10 -42.26 \n", - "Max DrawDown Duration 277 days 00:00:00 361 days 00:00:00 \n", - "#Trades 18.00 23.00 \n", - "Win Rate [%] 22.22 13.04 \n", - "Expectancy [%] -19.28 -20.23 \n", - "95 Quantile ($) 44,341.50 69,610.32 \n", - "5 Quantile ($) -50,754.75 -95,299.36 \n", - "95 Quantile (%) 0.13 0.05 \n", - "5 Quantile (%) -0.12 -0.07 \n", - "\n", - " CHOICE_SMOOTH \n", - "Return [%] -0.38 \n", - "Vol Annualized [%] 0.26 \n", - "Sharpe -1.89 \n", - "Max DrawDown [%] -40.85 \n", - "Max DrawDown Duration 361 days 00:00:00 \n", - "#Trades 23.00 \n", - "Win Rate [%] 13.04 \n", - "Expectancy [%] -21.12 \n", - "95 Quantile ($) 11,686.55 \n", - "5 Quantile ($) -17,676.51 \n", - "95 Quantile (%) 0.03 \n", - "5 Quantile (%) -0.03 " - ] - }, - "execution_count": 163, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "year = 2022\n", - "yearly_journal = pd.DataFrame()\n", - "for agg in aggregators:\n", - " year_info = agg.yearly_agg().loc[year]\n", - " year_info.name = agg.target\n", - " yearly_journal[agg.target] = year_info\n", - "yearly_journal" - ] - }, - { - "cell_type": "code", - "execution_count": 165, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
BASEZSCORE_1NORMZSCORE_2NORMDTE270_ROLL120BASE_ROLL120ZSCORE2_DTE270_ROLL120CHOICE_SMOOTH
Return [%]4.123.084.664.213.705.522.49
Vol Annualized [%]2.051.321.951.952.032.150.82
Sharpe1.761.681.811.811.731.891.88
Max DrawDown [%]-63.47-41.38-61.21-63.52-63.27-57.75-41.64
Max DrawDown Duration80 days 00:00:0080 days 00:00:0080 days 00:00:0055 days 00:00:00119 days 00:00:00113 days 00:00:00120 days 00:00:00
#Trades38.0038.0038.0044.0035.0043.0043.00
Win Rate [%]63.1660.5363.1667.4457.1467.4462.79
Expectancy [%]46.4846.0247.2548.0346.0848.7932.34
95 Quantile ($)33,680.1517,200.7746,524.7564,209.5528,614.5090,776.3219,467.61
5 Quantile ($)-33,380.00-14,244.38-45,606.68-69,683.24-28,291.42-86,386.25-22,587.00
95 Quantile (%)0.200.140.180.200.210.190.09
5 Quantile (%)-0.15-0.10-0.14-0.18-0.15-0.19-0.09
\n", - "
" - ], - "text/plain": [ - " BASE ZSCORE_1NORM ZSCORE_2NORM \\\n", - "Return [%] 4.12 3.08 4.66 \n", - "Vol Annualized [%] 2.05 1.32 1.95 \n", - "Sharpe 1.76 1.68 1.81 \n", - "Max DrawDown [%] -63.47 -41.38 -61.21 \n", - "Max DrawDown Duration 80 days 00:00:00 80 days 00:00:00 80 days 00:00:00 \n", - "#Trades 38.00 38.00 38.00 \n", - "Win Rate [%] 63.16 60.53 63.16 \n", - "Expectancy [%] 46.48 46.02 47.25 \n", - "95 Quantile ($) 33,680.15 17,200.77 46,524.75 \n", - "5 Quantile ($) -33,380.00 -14,244.38 -45,606.68 \n", - "95 Quantile (%) 0.20 0.14 0.18 \n", - "5 Quantile (%) -0.15 -0.10 -0.14 \n", - "\n", - " DTE270_ROLL120 BASE_ROLL120 \\\n", - "Return [%] 4.21 3.70 \n", - "Vol Annualized [%] 1.95 2.03 \n", - "Sharpe 1.81 1.73 \n", - "Max DrawDown [%] -63.52 -63.27 \n", - "Max DrawDown Duration 55 days 00:00:00 119 days 00:00:00 \n", - "#Trades 44.00 35.00 \n", - "Win Rate [%] 67.44 57.14 \n", - "Expectancy [%] 48.03 46.08 \n", - "95 Quantile ($) 64,209.55 28,614.50 \n", - "5 Quantile ($) -69,683.24 -28,291.42 \n", - "95 Quantile (%) 0.20 0.21 \n", - "5 Quantile (%) -0.18 -0.15 \n", - "\n", - " ZSCORE2_DTE270_ROLL120 CHOICE_SMOOTH \n", - "Return [%] 5.52 2.49 \n", - "Vol Annualized [%] 2.15 0.82 \n", - "Sharpe 1.89 1.88 \n", - "Max DrawDown [%] -57.75 -41.64 \n", - "Max DrawDown Duration 113 days 00:00:00 120 days 00:00:00 \n", - "#Trades 43.00 43.00 \n", - "Win Rate [%] 67.44 62.79 \n", - "Expectancy [%] 48.79 32.34 \n", - "95 Quantile ($) 90,776.32 19,467.61 \n", - "5 Quantile ($) -86,386.25 -22,587.00 \n", - "95 Quantile (%) 0.19 0.09 \n", - "5 Quantile (%) -0.19 -0.09 " - ] - }, - "execution_count": 165, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "year = 2020\n", - "yearly_journal = pd.DataFrame()\n", - "for agg in aggregators:\n", - " year_info = agg.yearly_agg().loc[year]\n", - " year_info.name = agg.target\n", - " yearly_journal[agg.target] = year_info\n", - "yearly_journal" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## PLOT EQUITY, DD & HEATMAP" - ] - }, - { - "cell_type": "code", - "execution_count": 252, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "hovertemplate": "variable=BASE
datetime=%{x}
value=%{y}", - "legendgroup": "BASE", - "line": { - "color": "#636efa", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "BASE", - "showlegend": true, - "type": "scattergl", - "x": [ - "2017-01-05T00:00:00", - "2017-01-06T00:00:00", - "2017-01-09T00:00:00", - "2017-01-10T00:00:00", - "2017-01-11T00:00:00", - "2017-01-12T00:00:00", - "2017-01-13T00:00:00", - "2017-01-17T00:00:00", - "2017-01-18T00:00:00", - "2017-01-19T00:00:00", - "2017-01-20T00:00:00", - "2017-01-23T00:00:00", - "2017-01-24T00:00:00", - "2017-01-25T00:00:00", - "2017-01-26T00:00:00", - "2017-01-27T00:00:00", - "2017-01-30T00:00:00", - "2017-01-31T00:00:00", - "2017-02-01T00:00:00", - "2017-02-02T00:00:00", - "2017-02-03T00:00:00", - "2017-02-06T00:00:00", - "2017-02-07T00:00:00", - "2017-02-08T00:00:00", - "2017-02-09T00:00:00", - "2017-02-10T00:00:00", - "2017-02-13T00:00:00", - "2017-02-14T00:00:00", - "2017-02-15T00:00:00", - "2017-02-16T00:00:00", - "2017-02-17T00:00:00", - "2017-02-21T00:00:00", - "2017-02-22T00:00:00", - "2017-02-23T00:00:00", - "2017-02-24T00:00:00", - "2017-02-27T00:00:00", - "2017-02-28T00:00:00", - "2017-03-01T00:00:00", - "2017-03-02T00:00:00", - "2017-03-03T00:00:00", - "2017-03-06T00:00:00", - "2017-03-07T00:00:00", - "2017-03-08T00:00:00", - "2017-03-09T00:00:00", - "2017-03-10T00:00:00", - "2017-03-13T00:00:00", - "2017-03-14T00:00:00", - "2017-03-15T00:00:00", - "2017-03-16T00:00:00", - "2017-03-17T00:00:00", - "2017-03-20T00:00:00", - "2017-03-21T00:00:00", - "2017-03-22T00:00:00", - "2017-03-23T00:00:00", - "2017-03-24T00:00:00", - "2017-03-27T00:00:00", - "2017-03-28T00:00:00", - "2017-03-29T00:00:00", - "2017-03-30T00:00:00", - "2017-03-31T00:00:00", - "2017-04-03T00:00:00", - "2017-04-04T00:00:00", - "2017-04-05T00:00:00", - "2017-04-06T00:00:00", - "2017-04-07T00:00:00", - "2017-04-10T00:00:00", - "2017-04-11T00:00:00", - "2017-04-12T00:00:00", - "2017-04-13T00:00:00", - "2017-04-17T00:00:00", - "2017-04-18T00:00:00", - "2017-04-19T00:00:00", - "2017-04-20T00:00:00", - "2017-04-21T00:00:00", - "2017-04-24T00:00:00", - "2017-04-25T00:00:00", - "2017-04-26T00:00:00", - "2017-04-27T00:00:00", - "2017-04-28T00:00:00", - "2017-05-01T00:00:00", - "2017-05-02T00:00:00", - "2017-05-03T00:00:00", - "2017-05-04T00:00:00", - "2017-05-05T00:00:00", - "2017-05-08T00:00:00", - "2017-05-09T00:00:00", - "2017-05-10T00:00:00", - "2017-05-11T00:00:00", - "2017-05-12T00:00:00", - "2017-05-15T00:00:00", - "2017-05-16T00:00:00", - "2017-05-17T00:00:00", - "2017-05-18T00:00:00", - "2017-05-19T00:00:00", - "2017-05-22T00:00:00", - "2017-05-23T00:00:00", - "2017-05-24T00:00:00", - "2017-05-25T00:00:00", - "2017-05-26T00:00:00", - "2017-05-29T00:00:00", - "2017-05-30T00:00:00", - "2017-05-31T00:00:00", - "2017-06-01T00:00:00", - "2017-06-02T00:00:00", - "2017-06-05T00:00:00", - "2017-06-06T00:00:00", - "2017-06-07T00:00:00", - "2017-06-08T00:00:00", - "2017-06-09T00:00:00", - "2017-06-12T00:00:00", - "2017-06-13T00:00:00", - "2017-06-14T00:00:00", - "2017-06-15T00:00:00", - "2017-06-16T00:00:00", - "2017-06-19T00:00:00", - "2017-06-20T00:00:00", - "2017-06-21T00:00:00", - "2017-06-22T00:00:00", - "2017-06-23T00:00:00", - "2017-06-26T00:00:00", - "2017-06-27T00:00:00", - "2017-06-28T00:00:00", - "2017-06-29T00:00:00", - "2017-06-30T00:00:00", - "2017-07-03T00:00:00", - "2017-07-05T00:00:00", - "2017-07-06T00:00:00", - "2017-07-07T00:00:00", - "2017-07-10T00:00:00", - "2017-07-11T00:00:00", - "2017-07-12T00:00:00", - "2017-07-13T00:00:00", - "2017-07-14T00:00:00", - "2017-07-17T00:00:00", - "2017-07-18T00:00:00", - "2017-07-19T00:00:00", - "2017-07-20T00:00:00", - "2017-07-21T00:00:00", - "2017-07-24T00:00:00", - "2017-07-25T00:00:00", - "2017-07-26T00:00:00", - "2017-07-27T00:00:00", - "2017-07-28T00:00:00", - "2017-07-31T00:00:00", - "2017-08-01T00:00:00", - "2017-08-02T00:00:00", - "2017-08-03T00:00:00", - "2017-08-04T00:00:00", - "2017-08-07T00:00:00", - "2017-08-08T00:00:00", - "2017-08-09T00:00:00", - "2017-08-10T00:00:00", - "2017-08-11T00:00:00", - "2017-08-14T00:00:00", - "2017-08-15T00:00:00", - "2017-08-16T00:00:00", - "2017-08-17T00:00:00", - "2017-08-18T00:00:00", - "2017-08-21T00:00:00", - "2017-08-22T00:00:00", - "2017-08-23T00:00:00", - "2017-08-24T00:00:00", - "2017-08-25T00:00:00", - "2017-08-28T00:00:00", - "2017-08-29T00:00:00", - "2017-08-30T00:00:00", - "2017-08-31T00:00:00", - "2017-09-01T00:00:00", - "2017-09-05T00:00:00", - "2017-09-06T00:00:00", - "2017-09-07T00:00:00", - "2017-09-08T00:00:00", - "2017-09-11T00:00:00", - "2017-09-12T00:00:00", - "2017-09-13T00:00:00", - "2017-09-14T00:00:00", - "2017-09-15T00:00:00", - "2017-09-18T00:00:00", - "2017-09-19T00:00:00", - "2017-09-20T00:00:00", - "2017-09-21T00:00:00", - "2017-09-22T00:00:00", - "2017-09-25T00:00:00", - "2017-09-26T00:00:00", - "2017-09-27T00:00:00", - "2017-09-28T00:00:00", - "2017-09-29T00:00:00", - "2017-10-02T00:00:00", - "2017-10-03T00:00:00", - "2017-10-04T00:00:00", - "2017-10-05T00:00:00", - "2017-10-06T00:00:00", - "2017-10-09T00:00:00", - "2017-10-10T00:00:00", - "2017-10-11T00:00:00", - "2017-10-12T00:00:00", - "2017-10-13T00:00:00", - "2017-10-16T00:00:00", - "2017-10-17T00:00:00", - "2017-10-18T00:00:00", - "2017-10-19T00:00:00", - "2017-10-20T00:00:00", - "2017-10-23T00:00:00", - "2017-10-24T00:00:00", - "2017-10-25T00:00:00", - "2017-10-26T00:00:00", - "2017-10-27T00:00:00", - "2017-10-30T00:00:00", - "2017-10-31T00:00:00", - "2017-11-01T00:00:00", - "2017-11-02T00:00:00", - "2017-11-03T00:00:00", - "2017-11-06T00:00:00", - "2017-11-07T00:00:00", - "2017-11-08T00:00:00", - "2017-11-09T00:00:00", - "2017-11-10T00:00:00", - "2017-11-13T00:00:00", - "2017-11-14T00:00:00", - "2017-11-15T00:00:00", - "2017-11-16T00:00:00", - "2017-11-17T00:00:00", - "2017-11-20T00:00:00", - "2017-11-21T00:00:00", - "2017-11-22T00:00:00", - "2017-11-24T00:00:00", - "2017-11-27T00:00:00", - "2017-11-28T00:00:00", - "2017-11-29T00:00:00", - "2017-11-30T00:00:00", - "2017-12-01T00:00:00", - "2017-12-04T00:00:00", - "2017-12-05T00:00:00", - "2017-12-06T00:00:00", - "2017-12-07T00:00:00", - "2017-12-08T00:00:00", - "2017-12-11T00:00:00", - "2017-12-12T00:00:00", - "2017-12-13T00:00:00", - "2017-12-14T00:00:00", - "2017-12-15T00:00:00", - "2017-12-18T00:00:00", - "2017-12-19T00:00:00", - "2017-12-20T00:00:00", - "2017-12-21T00:00:00", - "2017-12-22T00:00:00", - "2017-12-26T00:00:00", - "2017-12-27T00:00:00", - "2017-12-28T00:00:00", - "2017-12-29T00:00:00", - "2018-01-01T00:00:00", - "2018-01-02T00:00:00", - "2018-01-04T00:00:00", - "2018-01-05T00:00:00", - "2018-01-08T00:00:00", - "2018-01-09T00:00:00", - "2018-01-10T00:00:00", - "2018-01-11T00:00:00", - "2018-01-12T00:00:00", - "2018-01-15T00:00:00", - "2018-01-16T00:00:00", - "2018-01-17T00:00:00", - "2018-01-18T00:00:00", - "2018-01-19T00:00:00", - "2018-01-22T00:00:00", - "2018-01-23T00:00:00", - "2018-01-24T00:00:00", - "2018-01-25T00:00:00", - "2018-01-26T00:00:00", - "2018-01-29T00:00:00", - "2018-01-30T00:00:00", - "2018-01-31T00:00:00", - "2018-02-01T00:00:00", - "2018-02-02T00:00:00", - "2018-02-05T00:00:00", - "2018-02-06T00:00:00", - "2018-02-07T00:00:00", - "2018-02-08T00:00:00", - "2018-02-09T00:00:00", - "2018-02-12T00:00:00", - "2018-02-13T00:00:00", - "2018-02-14T00:00:00", - "2018-02-15T00:00:00", - "2018-02-16T00:00:00", - "2018-02-20T00:00:00", - "2018-02-21T00:00:00", - "2018-02-22T00:00:00", - "2018-02-23T00:00:00", - "2018-02-26T00:00:00", - "2018-02-27T00:00:00", - "2018-02-28T00:00:00", - "2018-03-01T00:00:00", - "2018-03-02T00:00:00", - "2018-03-05T00:00:00", - "2018-03-06T00:00:00", - "2018-03-07T00:00:00", - "2018-03-08T00:00:00", - "2018-03-09T00:00:00", - "2018-03-12T00:00:00", - "2018-03-13T00:00:00", - "2018-03-14T00:00:00", - "2018-03-15T00:00:00", - "2018-03-16T00:00:00", - "2018-03-19T00:00:00", - "2018-03-20T00:00:00", - "2018-03-21T00:00:00", - "2018-03-22T00:00:00", - "2018-03-23T00:00:00", - "2018-03-26T00:00:00", - "2018-03-27T00:00:00", - "2018-03-28T00:00:00", - "2018-03-29T00:00:00", - "2018-04-02T00:00:00", - "2018-04-03T00:00:00", - "2018-04-04T00:00:00", - "2018-04-05T00:00:00", - "2018-04-06T00:00:00", - "2018-04-09T00:00:00", - "2018-04-10T00:00:00", - "2018-04-11T00:00:00", - "2018-04-12T00:00:00", - "2018-04-13T00:00:00", - "2018-04-16T00:00:00", - "2018-04-17T00:00:00", - "2018-04-18T00:00:00", - "2018-04-19T00:00:00", - "2018-04-20T00:00:00", - "2018-04-23T00:00:00", - "2018-04-24T00:00:00", - "2018-04-25T00:00:00", - "2018-04-26T00:00:00", - "2018-04-27T00:00:00", - "2018-04-30T00:00:00", - "2018-05-01T00:00:00", - "2018-05-02T00:00:00", - "2018-05-03T00:00:00", - "2018-05-04T00:00:00", - "2018-05-07T00:00:00", - "2018-05-08T00:00:00", - "2018-05-09T00:00:00", - "2018-05-10T00:00:00", - "2018-05-11T00:00:00", - "2018-05-14T00:00:00", - "2018-05-15T00:00:00", - "2018-05-16T00:00:00", - "2018-05-17T00:00:00", - "2018-05-18T00:00:00", - "2018-05-21T00:00:00", - "2018-05-22T00:00:00", - "2018-05-23T00:00:00", - "2018-05-24T00:00:00", - "2018-05-25T00:00:00", - "2018-05-28T00:00:00", - "2018-05-29T00:00:00", - "2018-05-30T00:00:00", - "2018-05-31T00:00:00", - "2018-06-01T00:00:00", - "2018-06-04T00:00:00", - "2018-06-05T00:00:00", - "2018-06-06T00:00:00", - "2018-06-07T00:00:00", - "2018-06-08T00:00:00", - "2018-06-11T00:00:00", - "2018-06-12T00:00:00", - "2018-06-13T00:00:00", - "2018-06-14T00:00:00", - "2018-06-15T00:00:00", - "2018-06-18T00:00:00", - "2018-06-19T00:00:00", - "2018-06-20T00:00:00", - "2018-06-21T00:00:00", - "2018-06-22T00:00:00", - "2018-06-25T00:00:00", - "2018-06-26T00:00:00", - "2018-06-27T00:00:00", - "2018-06-28T00:00:00", - "2018-06-29T00:00:00", - "2018-07-02T00:00:00", - "2018-07-03T00:00:00", - "2018-07-05T00:00:00", - "2018-07-06T00:00:00", - "2018-07-09T00:00:00", - "2018-07-10T00:00:00", - "2018-07-11T00:00:00", - "2018-07-12T00:00:00", - "2018-07-13T00:00:00", - "2018-07-16T00:00:00", - "2018-07-17T00:00:00", - "2018-07-18T00:00:00", - "2018-07-19T00:00:00", - "2018-07-20T00:00:00", - "2018-07-23T00:00:00", - "2018-07-24T00:00:00", - "2018-07-25T00:00:00", - "2018-07-26T00:00:00", - "2018-07-27T00:00:00", - "2018-07-30T00:00:00", - "2018-07-31T00:00:00", - "2018-08-01T00:00:00", - "2018-08-02T00:00:00", - "2018-08-03T00:00:00", - "2018-08-06T00:00:00", - "2018-08-07T00:00:00", - "2018-08-08T00:00:00", - "2018-08-09T00:00:00", - "2018-08-10T00:00:00", - "2018-08-13T00:00:00", - "2018-08-14T00:00:00", - "2018-08-15T00:00:00", - "2018-08-16T00:00:00", - "2018-08-17T00:00:00", - "2018-08-20T00:00:00", - "2018-08-21T00:00:00", - "2018-08-22T00:00:00", - "2018-08-23T00:00:00", - "2018-08-24T00:00:00", - "2018-08-27T00:00:00", - "2018-08-28T00:00:00", - "2018-08-29T00:00:00", - "2018-08-30T00:00:00", - "2018-08-31T00:00:00", - "2018-09-03T00:00:00", - "2018-09-04T00:00:00", - "2018-09-05T00:00:00", - "2018-09-06T00:00:00", - "2018-09-07T00:00:00", - "2018-09-10T00:00:00", - "2018-09-11T00:00:00", - "2018-09-12T00:00:00", - "2018-09-13T00:00:00", - "2018-09-14T00:00:00", - "2018-09-17T00:00:00", - "2018-09-18T00:00:00", - "2018-09-19T00:00:00", - "2018-09-20T00:00:00", - "2018-09-21T00:00:00", - "2018-09-24T00:00:00", - "2018-09-25T00:00:00", - "2018-09-26T00:00:00", - "2018-09-27T00:00:00", - "2018-09-28T00:00:00", - "2018-10-01T00:00:00", - "2018-10-02T00:00:00", - "2018-10-03T00:00:00", - "2018-10-04T00:00:00", - "2018-10-05T00:00:00", - "2018-10-08T00:00:00", - "2018-10-09T00:00:00", - "2018-10-10T00:00:00", - "2018-10-11T00:00:00", - "2018-10-12T00:00:00", - "2018-10-15T00:00:00", - "2018-10-16T00:00:00", - "2018-10-17T00:00:00", - "2018-10-18T00:00:00", - "2018-10-19T00:00:00", - "2018-10-22T00:00:00", - "2018-10-23T00:00:00", - "2018-10-24T00:00:00", - "2018-10-25T00:00:00", - "2018-10-26T00:00:00", - "2018-10-29T00:00:00", - "2018-10-30T00:00:00", - "2018-10-31T00:00:00", - "2018-11-01T00:00:00", - "2018-11-02T00:00:00", - "2018-11-05T00:00:00", - "2018-11-06T00:00:00", - "2018-11-07T00:00:00", - "2018-11-08T00:00:00", - "2018-11-09T00:00:00", - "2018-11-12T00:00:00", - "2018-11-13T00:00:00", - "2018-11-14T00:00:00", - "2018-11-15T00:00:00", - "2018-11-16T00:00:00", - "2018-11-19T00:00:00", - "2018-11-20T00:00:00", - "2018-11-21T00:00:00", - "2018-11-23T00:00:00", - "2018-11-26T00:00:00", - "2018-11-27T00:00:00", - "2018-11-28T00:00:00", - "2018-11-29T00:00:00", - "2018-11-30T00:00:00", - "2018-12-03T00:00:00", - "2018-12-04T00:00:00", - "2018-12-06T00:00:00", - "2018-12-07T00:00:00", - "2018-12-10T00:00:00", - "2018-12-11T00:00:00", - "2018-12-12T00:00:00", - "2018-12-13T00:00:00", - "2018-12-14T00:00:00", - "2018-12-17T00:00:00", - "2018-12-18T00:00:00", - "2018-12-19T00:00:00", - "2018-12-20T00:00:00", - "2018-12-21T00:00:00", - "2018-12-24T00:00:00", - "2018-12-26T00:00:00", - "2018-12-27T00:00:00", - "2018-12-28T00:00:00", - "2018-12-31T00:00:00", - "2019-01-01T00:00:00", - "2019-01-02T00:00:00", - "2019-01-04T00:00:00", - "2019-01-08T00:00:00", - "2019-01-09T00:00:00", - "2019-01-10T00:00:00", - "2019-01-11T00:00:00", - "2019-01-16T00:00:00", - "2019-01-18T00:00:00", - "2019-01-22T00:00:00", - "2019-01-23T00:00:00", - "2019-01-24T00:00:00", - "2019-01-28T00:00:00", - "2019-01-29T00:00:00", - "2019-01-30T00:00:00", - "2019-01-31T00:00:00", - "2019-02-01T00:00:00", - "2019-02-04T00:00:00", - "2019-02-05T00:00:00", - "2019-02-06T00:00:00", - "2019-02-07T00:00:00", - "2019-02-08T00:00:00", - "2019-02-11T00:00:00", - "2019-02-12T00:00:00", - "2019-02-13T00:00:00", - "2019-02-14T00:00:00", - "2019-02-15T00:00:00", - "2019-02-18T00:00:00", - "2019-02-19T00:00:00", - "2019-02-20T00:00:00", - "2019-02-21T00:00:00", - "2019-02-22T00:00:00", - "2019-02-25T00:00:00", - "2019-02-26T00:00:00", - "2019-02-27T00:00:00", - "2019-02-28T00:00:00", - "2019-03-01T00:00:00", - "2019-03-04T00:00:00", - "2019-03-05T00:00:00", - "2019-03-06T00:00:00", - "2019-03-07T00:00:00", - "2019-03-08T00:00:00", - "2019-03-11T00:00:00", - "2019-03-12T00:00:00", - "2019-03-13T00:00:00", - "2019-03-14T00:00:00", - "2019-03-15T00:00:00", - "2019-03-18T00:00:00", - "2019-03-19T00:00:00", - "2019-03-20T00:00:00", - "2019-03-21T00:00:00", - "2019-03-22T00:00:00", - "2019-03-25T00:00:00", - "2019-03-26T00:00:00", - "2019-03-27T00:00:00", - "2019-03-28T00:00:00", - "2019-03-29T00:00:00", - "2019-04-01T00:00:00", - "2019-04-02T00:00:00", - "2019-04-03T00:00:00", - "2019-04-04T00:00:00", - "2019-04-05T00:00:00", - "2019-04-08T00:00:00", - "2019-04-09T00:00:00", - "2019-04-10T00:00:00", - "2019-04-11T00:00:00", - "2019-04-12T00:00:00", - "2019-04-15T00:00:00", - "2019-04-16T00:00:00", - "2019-04-17T00:00:00", - "2019-04-18T00:00:00", - "2019-04-19T00:00:00", - "2019-04-22T00:00:00", - "2019-04-23T00:00:00", - "2019-04-24T00:00:00", - "2019-04-25T00:00:00", - "2019-04-26T00:00:00", - "2019-04-29T00:00:00", - "2019-04-30T00:00:00", - "2019-05-01T00:00:00", - "2019-05-02T00:00:00", - "2019-05-03T00:00:00", - "2019-05-06T00:00:00", - "2019-05-07T00:00:00", - "2019-05-08T00:00:00", - "2019-05-09T00:00:00", - "2019-05-10T00:00:00", - "2019-05-13T00:00:00", - "2019-05-14T00:00:00", - "2019-05-15T00:00:00", - "2019-05-16T00:00:00", - "2019-05-17T00:00:00", - "2019-05-20T00:00:00", - "2019-05-21T00:00:00", - "2019-05-22T00:00:00", - "2019-05-23T00:00:00", - "2019-05-24T00:00:00", - "2019-05-28T00:00:00", - "2019-05-29T00:00:00", - "2019-05-30T00:00:00", - "2019-05-31T00:00:00", - "2019-06-03T00:00:00", - "2019-06-04T00:00:00", - "2019-06-05T00:00:00", - "2019-06-06T00:00:00", - "2019-06-07T00:00:00", - "2019-06-10T00:00:00", - "2019-06-11T00:00:00", - "2019-06-12T00:00:00", - "2019-06-13T00:00:00", - "2019-06-14T00:00:00", - "2019-06-17T00:00:00", - "2019-06-18T00:00:00", - "2019-06-19T00:00:00", - "2019-06-20T00:00:00", - "2019-06-21T00:00:00", - "2019-06-24T00:00:00", - "2019-06-25T00:00:00", - "2019-06-26T00:00:00", - "2019-06-27T00:00:00", - "2019-06-28T00:00:00", - "2019-07-01T00:00:00", - "2019-07-02T00:00:00", - "2019-07-03T00:00:00", - "2019-07-04T00:00:00", - "2019-07-05T00:00:00", - "2019-07-08T00:00:00", - "2019-07-09T00:00:00", - "2019-07-10T00:00:00", - "2019-07-11T00:00:00", - "2019-07-12T00:00:00", - "2019-07-15T00:00:00", - "2019-07-16T00:00:00", - "2019-07-17T00:00:00", - "2019-07-18T00:00:00", - "2019-07-19T00:00:00", - "2019-07-22T00:00:00", - "2019-07-23T00:00:00", - "2019-07-24T00:00:00", - "2019-07-25T00:00:00", - "2019-07-26T00:00:00", - "2019-07-29T00:00:00", - "2019-07-30T00:00:00", - "2019-07-31T00:00:00", - "2019-08-01T00:00:00", - "2019-08-02T00:00:00", - "2019-08-05T00:00:00", - "2019-08-06T00:00:00", - "2019-08-07T00:00:00", - "2019-08-08T00:00:00", - "2019-08-09T00:00:00", - "2019-08-12T00:00:00", - "2019-08-13T00:00:00", - "2019-08-14T00:00:00", - "2019-08-15T00:00:00", - "2019-08-16T00:00:00", - "2019-08-19T00:00:00", - "2019-08-20T00:00:00", - "2019-08-21T00:00:00", - "2019-08-22T00:00:00", - "2019-08-23T00:00:00", - "2019-08-26T00:00:00", - "2019-08-27T00:00:00", - "2019-08-28T00:00:00", - "2019-08-29T00:00:00", - "2019-08-30T00:00:00", - "2019-09-03T00:00:00", - "2019-09-04T00:00:00", - "2019-09-05T00:00:00", - "2019-09-06T00:00:00", - "2019-09-09T00:00:00", - "2019-09-10T00:00:00", - "2019-09-11T00:00:00", - "2019-09-12T00:00:00", - "2019-09-13T00:00:00", - "2019-09-16T00:00:00", - "2019-09-17T00:00:00", - "2019-09-18T00:00:00", - "2019-09-19T00:00:00", - "2019-09-20T00:00:00", - "2019-09-23T00:00:00", - "2019-09-24T00:00:00", - "2019-09-25T00:00:00", - "2019-09-26T00:00:00", - "2019-09-27T00:00:00", - "2019-09-30T00:00:00", - "2019-10-01T00:00:00", - "2019-10-02T00:00:00", - "2019-10-03T00:00:00", - "2019-10-04T00:00:00", - "2019-10-07T00:00:00", - "2019-10-08T00:00:00", - "2019-10-09T00:00:00", - "2019-10-10T00:00:00", - "2019-10-11T00:00:00", - "2019-10-14T00:00:00", - "2019-10-15T00:00:00", - "2019-10-16T00:00:00", - "2019-10-17T00:00:00", - "2019-10-18T00:00:00", - "2019-10-21T00:00:00", - "2019-10-22T00:00:00", - "2019-10-23T00:00:00", - "2019-10-24T00:00:00", - "2019-10-25T00:00:00", - "2019-10-28T00:00:00", - "2019-10-29T00:00:00", - "2019-10-30T00:00:00", - "2019-10-31T00:00:00", - "2019-11-01T00:00:00", - "2019-11-04T00:00:00", - "2019-11-05T00:00:00", - "2019-11-06T00:00:00", - "2019-11-07T00:00:00", - "2019-11-08T00:00:00", - "2019-11-11T00:00:00", - "2019-11-12T00:00:00", - "2019-11-13T00:00:00", - "2019-11-14T00:00:00", - "2019-11-15T00:00:00", - "2019-11-18T00:00:00", - "2019-11-19T00:00:00", - "2019-11-20T00:00:00", - "2019-11-21T00:00:00", - "2019-11-22T00:00:00", - "2019-11-25T00:00:00", - "2019-11-26T00:00:00", - "2019-11-27T00:00:00", - "2019-11-28T00:00:00", - "2019-11-29T00:00:00", - "2019-12-02T00:00:00", - "2019-12-03T00:00:00", - "2019-12-04T00:00:00", - "2019-12-05T00:00:00", - "2019-12-06T00:00:00", - "2019-12-09T00:00:00", - "2019-12-10T00:00:00", - "2019-12-11T00:00:00", - "2019-12-12T00:00:00", - "2019-12-13T00:00:00", - "2019-12-16T00:00:00", - "2019-12-17T00:00:00", - "2019-12-18T00:00:00", - "2019-12-19T00:00:00", - "2019-12-20T00:00:00", - "2019-12-23T00:00:00", - "2019-12-24T00:00:00", - "2019-12-26T00:00:00", - "2019-12-27T00:00:00", - "2019-12-30T00:00:00", - "2019-12-31T00:00:00", - "2020-01-01T00:00:00", - "2020-01-02T00:00:00", - "2020-01-06T00:00:00", - "2020-01-07T00:00:00", - "2020-01-08T00:00:00", - "2020-01-09T00:00:00", - "2020-01-10T00:00:00", - "2020-01-13T00:00:00", - "2020-01-14T00:00:00", - "2020-01-15T00:00:00", - "2020-01-16T00:00:00", - "2020-01-17T00:00:00", - "2020-01-21T00:00:00", - "2020-01-22T00:00:00", - "2020-01-23T00:00:00", - "2020-01-24T00:00:00", - "2020-01-27T00:00:00", - "2020-01-28T00:00:00", - "2020-01-29T00:00:00", - "2020-01-30T00:00:00", - "2020-01-31T00:00:00", - "2020-02-03T00:00:00", - "2020-02-04T00:00:00", - "2020-02-05T00:00:00", - "2020-02-06T00:00:00", - "2020-02-07T00:00:00", - "2020-02-10T00:00:00", - "2020-02-11T00:00:00", - "2020-02-12T00:00:00", - "2020-02-13T00:00:00", - "2020-02-14T00:00:00", - "2020-02-18T00:00:00", - "2020-02-19T00:00:00", - "2020-02-20T00:00:00", - "2020-02-21T00:00:00", - "2020-02-24T00:00:00", - "2020-02-25T00:00:00", - "2020-02-26T00:00:00", - "2020-02-27T00:00:00", - "2020-02-28T00:00:00", - "2020-03-02T00:00:00", - "2020-03-03T00:00:00", - "2020-03-04T00:00:00", - "2020-03-05T00:00:00", - "2020-03-06T00:00:00", - "2020-03-09T00:00:00", - "2020-03-10T00:00:00", - "2020-03-11T00:00:00", - "2020-03-12T00:00:00", - "2020-03-13T00:00:00", - "2020-03-16T00:00:00", - "2020-03-17T00:00:00", - "2020-03-18T00:00:00", - "2020-03-19T00:00:00", - "2020-03-20T00:00:00", - "2020-03-23T00:00:00", - "2020-03-24T00:00:00", - "2020-03-25T00:00:00", - "2020-03-26T00:00:00", - "2020-03-27T00:00:00", - "2020-03-30T00:00:00", - "2020-03-31T00:00:00", - "2020-04-01T00:00:00", - "2020-04-02T00:00:00", - "2020-04-03T00:00:00", - "2020-04-06T00:00:00", - "2020-04-07T00:00:00", - "2020-04-08T00:00:00", - "2020-04-09T00:00:00", - "2020-04-13T00:00:00", - "2020-04-14T00:00:00", - "2020-04-15T00:00:00", - "2020-04-16T00:00:00", - "2020-04-17T00:00:00", - "2020-04-20T00:00:00", - "2020-04-21T00:00:00", - "2020-04-22T00:00:00", - "2020-04-23T00:00:00", - "2020-04-24T00:00:00", - "2020-04-27T00:00:00", - "2020-04-28T00:00:00", - "2020-04-29T00:00:00", - "2020-04-30T00:00:00", - "2020-05-01T00:00:00", - "2020-05-04T00:00:00", - "2020-05-05T00:00:00", - "2020-05-06T00:00:00", - "2020-05-07T00:00:00", - "2020-05-08T00:00:00", - "2020-05-11T00:00:00", - "2020-05-12T00:00:00", - "2020-05-13T00:00:00", - "2020-05-14T00:00:00", - "2020-05-15T00:00:00", - "2020-05-18T00:00:00", - "2020-05-19T00:00:00", - "2020-05-20T00:00:00", - "2020-05-21T00:00:00", - "2020-05-22T00:00:00", - "2020-05-26T00:00:00", - "2020-05-27T00:00:00", - "2020-05-28T00:00:00", - "2020-05-29T00:00:00", - "2020-06-01T00:00:00", - "2020-06-02T00:00:00", - "2020-06-03T00:00:00", - "2020-06-04T00:00:00", - "2020-06-05T00:00:00", - "2020-06-08T00:00:00", - "2020-06-09T00:00:00", - "2020-06-10T00:00:00", - "2020-06-11T00:00:00", - "2020-06-12T00:00:00", - "2020-06-15T00:00:00", - "2020-06-16T00:00:00", - "2020-06-17T00:00:00", - "2020-06-18T00:00:00", - "2020-06-19T00:00:00", - "2020-06-22T00:00:00", - "2020-06-23T00:00:00", - "2020-06-24T00:00:00", - "2020-06-25T00:00:00", - "2020-06-26T00:00:00", - "2020-06-29T00:00:00", - "2020-06-30T00:00:00", - "2020-07-01T00:00:00", - "2020-07-02T00:00:00", - "2020-07-06T00:00:00", - "2020-07-07T00:00:00", - "2020-07-08T00:00:00", - "2020-07-09T00:00:00", - "2020-07-10T00:00:00", - "2020-07-13T00:00:00", - "2020-07-14T00:00:00", - "2020-07-15T00:00:00", - "2020-07-16T00:00:00", - "2020-07-17T00:00:00", - "2020-07-20T00:00:00", - "2020-07-21T00:00:00", - "2020-07-22T00:00:00", - "2020-07-23T00:00:00", - "2020-07-24T00:00:00", - "2020-07-27T00:00:00", - "2020-07-28T00:00:00", - "2020-07-29T00:00:00", - "2020-07-30T00:00:00", - "2020-07-31T00:00:00", - "2020-08-03T00:00:00", - "2020-08-04T00:00:00", - "2020-08-05T00:00:00", - "2020-08-06T00:00:00", - "2020-08-07T00:00:00", - "2020-08-10T00:00:00", - "2020-08-11T00:00:00", - "2020-08-12T00:00:00", - "2020-08-13T00:00:00", - "2020-08-14T00:00:00", - "2020-08-17T00:00:00", - "2020-08-18T00:00:00", - "2020-08-19T00:00:00", - "2020-08-20T00:00:00", - "2020-08-21T00:00:00", - "2020-08-24T00:00:00", - "2020-08-25T00:00:00", - "2020-08-26T00:00:00", - "2020-08-27T00:00:00", - "2020-08-28T00:00:00", - "2020-08-31T00:00:00", - "2020-09-01T00:00:00", - "2020-09-02T00:00:00", - "2020-09-03T00:00:00", - "2020-09-04T00:00:00", - "2020-09-08T00:00:00", - "2020-09-09T00:00:00", - "2020-09-10T00:00:00", - "2020-09-11T00:00:00", - "2020-09-14T00:00:00", - "2020-09-15T00:00:00", - "2020-09-16T00:00:00", - "2020-09-17T00:00:00", - "2020-09-18T00:00:00", - "2020-09-21T00:00:00", - "2020-09-22T00:00:00", - "2020-09-23T00:00:00", - "2020-09-24T00:00:00", - "2020-09-25T00:00:00", - "2020-09-28T00:00:00", - "2020-09-29T00:00:00", - "2020-09-30T00:00:00", - "2020-10-01T00:00:00", - "2020-10-02T00:00:00", - "2020-10-05T00:00:00", - "2020-10-06T00:00:00", - "2020-10-07T00:00:00", - "2020-10-08T00:00:00", - "2020-10-09T00:00:00", - "2020-10-12T00:00:00", - "2020-10-13T00:00:00", - "2020-10-14T00:00:00", - "2020-10-15T00:00:00", - "2020-10-16T00:00:00", - "2020-10-19T00:00:00", - "2020-10-20T00:00:00", - "2020-10-21T00:00:00", - "2020-10-22T00:00:00", - "2020-10-23T00:00:00", - "2020-10-26T00:00:00", - "2020-10-27T00:00:00", - "2020-10-28T00:00:00", - "2020-10-29T00:00:00", - "2020-10-30T00:00:00", - "2020-11-02T00:00:00", - "2020-11-03T00:00:00", - "2020-11-04T00:00:00", - "2020-11-05T00:00:00", - "2020-11-06T00:00:00", - "2020-11-09T00:00:00", - "2020-11-10T00:00:00", - "2020-11-11T00:00:00", - "2020-11-12T00:00:00", - "2020-11-13T00:00:00", - "2020-11-16T00:00:00", - "2020-11-17T00:00:00", - "2020-11-18T00:00:00", - "2020-11-19T00:00:00", - "2020-11-20T00:00:00", - "2020-11-23T00:00:00", - "2020-11-24T00:00:00", - "2020-11-25T00:00:00", - "2020-11-27T00:00:00", - "2020-11-30T00:00:00", - "2020-12-01T00:00:00", - "2020-12-02T00:00:00", - "2020-12-03T00:00:00", - "2020-12-04T00:00:00", - "2020-12-07T00:00:00", - "2020-12-08T00:00:00", - "2020-12-09T00:00:00", - "2020-12-10T00:00:00", - "2020-12-11T00:00:00", - "2020-12-14T00:00:00", - "2020-12-15T00:00:00", - "2020-12-16T00:00:00", - "2020-12-17T00:00:00", - "2020-12-18T00:00:00", - "2020-12-21T00:00:00", - "2020-12-22T00:00:00", - "2020-12-23T00:00:00", - "2020-12-24T00:00:00", - "2020-12-28T00:00:00", - "2020-12-29T00:00:00", - "2020-12-30T00:00:00", - "2020-12-31T00:00:00", - "2021-01-01T00:00:00", - "2021-01-04T00:00:00", - "2021-01-06T00:00:00", - "2021-01-07T00:00:00", - "2021-01-08T00:00:00", - "2021-01-11T00:00:00", - "2021-01-12T00:00:00", - "2021-01-13T00:00:00", - "2021-01-14T00:00:00", - "2021-01-15T00:00:00", - "2021-01-19T00:00:00", - "2021-01-20T00:00:00", - "2021-01-21T00:00:00", - "2021-01-22T00:00:00", - "2021-01-25T00:00:00", - "2021-01-26T00:00:00", - "2021-01-27T00:00:00", - "2021-01-28T00:00:00", - "2021-01-29T00:00:00", - "2021-02-01T00:00:00", - "2021-02-02T00:00:00", - "2021-02-03T00:00:00", - "2021-02-04T00:00:00", - "2021-02-05T00:00:00", - "2021-02-08T00:00:00", - "2021-02-09T00:00:00", - "2021-02-10T00:00:00", - "2021-02-11T00:00:00", - "2021-02-12T00:00:00", - "2021-02-16T00:00:00", - "2021-02-17T00:00:00", - "2021-02-18T00:00:00", - "2021-02-19T00:00:00", - "2021-02-22T00:00:00", - "2021-02-23T00:00:00", - "2021-02-24T00:00:00", - "2021-02-25T00:00:00", - "2021-02-26T00:00:00", - "2021-03-01T00:00:00", - "2021-03-02T00:00:00", - "2021-03-03T00:00:00", - "2021-03-04T00:00:00", - "2021-03-05T00:00:00", - "2021-03-08T00:00:00", - "2021-03-09T00:00:00", - "2021-03-10T00:00:00", - "2021-03-11T00:00:00", - "2021-03-12T00:00:00", - "2021-03-15T00:00:00", - "2021-03-16T00:00:00", - "2021-03-17T00:00:00", - "2021-03-18T00:00:00", - "2021-03-19T00:00:00", - "2021-03-22T00:00:00", - "2021-03-23T00:00:00", - "2021-03-24T00:00:00", - "2021-03-25T00:00:00", - "2021-03-26T00:00:00", - "2021-03-29T00:00:00", - "2021-03-30T00:00:00", - "2021-03-31T00:00:00", - "2021-04-01T00:00:00", - "2021-04-05T00:00:00", - "2021-04-06T00:00:00", - "2021-04-07T00:00:00", - "2021-04-08T00:00:00", - "2021-04-09T00:00:00", - "2021-04-12T00:00:00", - "2021-04-13T00:00:00", - "2021-04-14T00:00:00", - "2021-04-15T00:00:00", - "2021-04-16T00:00:00", - "2021-04-19T00:00:00", - "2021-04-20T00:00:00", - "2021-04-21T00:00:00", - "2021-04-22T00:00:00", - "2021-04-23T00:00:00", - "2021-04-26T00:00:00", - "2021-04-27T00:00:00", - "2021-04-28T00:00:00", - "2021-04-29T00:00:00", - "2021-04-30T00:00:00", - "2021-05-03T00:00:00", - "2021-05-04T00:00:00", - "2021-05-05T00:00:00", - "2021-05-06T00:00:00", - "2021-05-07T00:00:00", - "2021-05-10T00:00:00", - "2021-05-11T00:00:00", - "2021-05-12T00:00:00", - "2021-05-13T00:00:00", - "2021-05-14T00:00:00", - "2021-05-17T00:00:00", - "2021-05-18T00:00:00", - "2021-05-19T00:00:00", - "2021-05-20T00:00:00", - "2021-05-21T00:00:00", - "2021-05-24T00:00:00", - "2021-05-25T00:00:00", - "2021-05-26T00:00:00", - "2021-05-27T00:00:00", - "2021-05-28T00:00:00", - "2021-06-01T00:00:00", - "2021-06-02T00:00:00", - "2021-06-03T00:00:00", - "2021-06-04T00:00:00", - "2021-06-07T00:00:00", - "2021-06-08T00:00:00", - "2021-06-09T00:00:00", - "2021-06-10T00:00:00", - "2021-06-11T00:00:00", - "2021-06-14T00:00:00", - "2021-06-15T00:00:00", - "2021-06-16T00:00:00", - "2021-06-17T00:00:00", - "2021-06-18T00:00:00", - "2021-06-21T00:00:00", - "2021-06-22T00:00:00", - "2021-06-23T00:00:00", - "2021-06-24T00:00:00", - "2021-06-25T00:00:00", - "2021-06-28T00:00:00", - "2021-06-29T00:00:00", - "2021-06-30T00:00:00", - "2021-07-01T00:00:00", - "2021-07-02T00:00:00", - "2021-07-05T00:00:00", - "2021-07-06T00:00:00", - "2021-07-07T00:00:00", - "2021-07-08T00:00:00", - "2021-07-09T00:00:00", - "2021-07-12T00:00:00", - "2021-07-13T00:00:00", - "2021-07-14T00:00:00", - "2021-07-15T00:00:00", - "2021-07-16T00:00:00", - "2021-07-19T00:00:00", - "2021-07-20T00:00:00", - "2021-07-21T00:00:00", - "2021-07-22T00:00:00", - "2021-07-23T00:00:00", - "2021-07-26T00:00:00", - "2021-07-27T00:00:00", - "2021-07-28T00:00:00", - "2021-07-29T00:00:00", - "2021-07-30T00:00:00", - "2021-08-02T00:00:00", - "2021-08-03T00:00:00", - "2021-08-04T00:00:00", - "2021-08-05T00:00:00", - "2021-08-06T00:00:00", - "2021-08-09T00:00:00", - "2021-08-10T00:00:00", - "2021-08-11T00:00:00", - "2021-08-12T00:00:00", - "2021-08-13T00:00:00", - "2021-08-16T00:00:00", - "2021-08-17T00:00:00", - "2021-08-18T00:00:00", - "2021-08-19T00:00:00", - "2021-08-20T00:00:00", - "2021-08-23T00:00:00", - "2021-08-24T00:00:00", - "2021-08-25T00:00:00", - "2021-08-26T00:00:00", - "2021-08-27T00:00:00", - "2021-08-30T00:00:00", - "2021-08-31T00:00:00", - "2021-09-01T00:00:00", - "2021-09-02T00:00:00", - "2021-09-03T00:00:00", - "2021-09-07T00:00:00", - "2021-09-08T00:00:00", - "2021-09-09T00:00:00", - "2021-09-10T00:00:00", - "2021-09-13T00:00:00", - "2021-09-14T00:00:00", - "2021-09-15T00:00:00", - "2021-09-16T00:00:00", - "2021-09-17T00:00:00", - "2021-09-20T00:00:00", - "2021-09-21T00:00:00", - "2021-09-22T00:00:00", - "2021-09-23T00:00:00", - "2021-09-24T00:00:00", - "2021-09-27T00:00:00", - "2021-09-28T00:00:00", - "2021-09-29T00:00:00", - "2021-09-30T00:00:00", - "2021-10-01T00:00:00", - "2021-10-04T00:00:00", - "2021-10-05T00:00:00", - "2021-10-06T00:00:00", - "2021-10-07T00:00:00", - "2021-10-08T00:00:00", - "2021-10-11T00:00:00", - "2021-10-12T00:00:00", - "2021-10-13T00:00:00", - "2021-10-14T00:00:00", - "2021-10-15T00:00:00", - "2021-10-18T00:00:00", - "2021-10-19T00:00:00", - "2021-10-20T00:00:00", - "2021-10-21T00:00:00", - "2021-10-22T00:00:00", - "2021-10-25T00:00:00", - "2021-10-26T00:00:00", - "2021-10-27T00:00:00", - "2021-10-28T00:00:00", - "2021-10-29T00:00:00", - "2021-11-01T00:00:00", - "2021-11-02T00:00:00", - "2021-11-03T00:00:00", - "2021-11-04T00:00:00", - "2021-11-05T00:00:00", - "2021-11-08T00:00:00", - "2021-11-09T00:00:00", - "2021-11-10T00:00:00", - "2021-11-11T00:00:00", - "2021-11-12T00:00:00", - "2021-11-15T00:00:00", - "2021-11-16T00:00:00", - "2021-11-17T00:00:00", - "2021-11-18T00:00:00", - "2021-11-19T00:00:00", - "2021-11-22T00:00:00", - "2021-11-23T00:00:00", - "2021-11-24T00:00:00", - "2021-11-25T00:00:00", - "2021-11-26T00:00:00", - "2021-11-29T00:00:00", - "2021-11-30T00:00:00", - "2021-12-01T00:00:00", - "2021-12-02T00:00:00", - "2021-12-03T00:00:00", - "2021-12-06T00:00:00", - "2021-12-07T00:00:00", - "2021-12-08T00:00:00", - "2021-12-09T00:00:00", - "2021-12-10T00:00:00", - "2021-12-13T00:00:00", - "2021-12-14T00:00:00", - "2021-12-15T00:00:00", - "2021-12-16T00:00:00", - "2021-12-17T00:00:00", - "2021-12-20T00:00:00", - "2021-12-21T00:00:00", - "2021-12-22T00:00:00", - "2021-12-23T00:00:00", - "2021-12-27T00:00:00", - "2021-12-28T00:00:00", - "2021-12-29T00:00:00", - "2021-12-30T00:00:00", - "2021-12-31T00:00:00", - "2022-01-03T00:00:00", - "2022-01-05T00:00:00", - "2022-01-06T00:00:00", - "2022-01-07T00:00:00", - "2022-01-10T00:00:00", - "2022-01-11T00:00:00", - "2022-01-12T00:00:00", - "2022-01-13T00:00:00", - "2022-01-14T00:00:00", - "2022-01-18T00:00:00", - "2022-01-19T00:00:00", - "2022-01-20T00:00:00", - "2022-01-21T00:00:00", - "2022-01-24T00:00:00", - "2022-01-25T00:00:00", - "2022-01-26T00:00:00", - "2022-01-27T00:00:00", - "2022-01-28T00:00:00", - "2022-01-31T00:00:00", - "2022-02-01T00:00:00", - "2022-02-02T00:00:00", - "2022-02-03T00:00:00", - "2022-02-04T00:00:00", - "2022-02-07T00:00:00", - "2022-02-08T00:00:00", - "2022-02-09T00:00:00", - "2022-02-10T00:00:00", - "2022-02-11T00:00:00", - "2022-02-14T00:00:00", - "2022-02-15T00:00:00", - "2022-02-16T00:00:00", - "2022-02-17T00:00:00", - "2022-02-18T00:00:00", - "2022-02-22T00:00:00", - "2022-02-23T00:00:00", - "2022-02-24T00:00:00", - "2022-02-25T00:00:00", - "2022-02-28T00:00:00", - "2022-03-01T00:00:00", - "2022-03-02T00:00:00", - "2022-03-03T00:00:00", - "2022-03-04T00:00:00", - "2022-03-07T00:00:00", - "2022-03-08T00:00:00", - "2022-03-09T00:00:00", - "2022-03-10T00:00:00", - "2022-03-11T00:00:00", - "2022-03-14T00:00:00", - "2022-03-15T00:00:00", - "2022-03-16T00:00:00", - "2022-03-17T00:00:00", - "2022-03-18T00:00:00", - "2022-03-21T00:00:00", - "2022-03-22T00:00:00", - "2022-03-23T00:00:00", - "2022-03-24T00:00:00", - "2022-03-25T00:00:00", - "2022-03-28T00:00:00", - "2022-03-29T00:00:00", - "2022-03-30T00:00:00", - "2022-03-31T00:00:00", - "2022-04-01T00:00:00", - "2022-04-04T00:00:00", - "2022-04-05T00:00:00", - "2022-04-06T00:00:00", - "2022-04-07T00:00:00", - "2022-04-08T00:00:00", - "2022-04-11T00:00:00", - "2022-04-12T00:00:00", - "2022-04-13T00:00:00", - "2022-04-14T00:00:00", - "2022-04-18T00:00:00", - "2022-04-19T00:00:00", - "2022-04-20T00:00:00", - "2022-04-21T00:00:00", - "2022-04-22T00:00:00", - "2022-04-25T00:00:00", - "2022-04-26T00:00:00", - "2022-04-27T00:00:00", - "2022-04-28T00:00:00", - "2022-04-29T00:00:00", - "2022-05-03T00:00:00", - "2022-05-04T00:00:00", - "2022-05-05T00:00:00", - "2022-05-06T00:00:00", - "2022-05-09T00:00:00", - "2022-05-10T00:00:00", - "2022-08-01T00:00:00", - "2022-08-02T00:00:00", - "2022-08-03T00:00:00", - "2022-08-04T00:00:00", - "2022-08-05T00:00:00", - "2022-08-08T00:00:00", - "2022-08-09T00:00:00", - "2022-08-10T00:00:00", - "2022-08-11T00:00:00", - "2022-08-12T00:00:00", - "2022-08-15T00:00:00", - "2022-08-16T00:00:00", - "2022-08-17T00:00:00", - "2022-08-18T00:00:00", - "2022-08-19T00:00:00", - "2022-08-22T00:00:00", - "2022-08-23T00:00:00", - "2022-08-24T00:00:00", - "2022-08-25T00:00:00", - "2022-08-26T00:00:00", - "2022-08-29T00:00:00", - "2022-08-30T00:00:00", - "2022-08-31T00:00:00", - "2022-09-01T00:00:00", - "2022-09-02T00:00:00", - "2022-09-06T00:00:00", - "2022-09-07T00:00:00", - "2022-09-14T00:00:00", - "2022-09-15T00:00:00", - "2022-10-27T00:00:00", - "2022-10-28T00:00:00", - "2022-10-31T00:00:00", - "2022-11-01T00:00:00", - "2022-11-02T00:00:00", - "2022-11-03T00:00:00", - "2022-11-04T00:00:00", - "2022-11-14T00:00:00", - "2022-11-15T00:00:00", - "2022-11-16T00:00:00", - "2022-11-17T00:00:00", - "2022-11-18T00:00:00", - "2022-11-21T00:00:00", - "2022-11-22T00:00:00", - "2022-11-23T00:00:00", - "2022-11-25T00:00:00", - "2022-11-28T00:00:00", - "2022-11-29T00:00:00", - "2022-11-30T00:00:00", - "2022-12-01T00:00:00", - "2022-12-02T00:00:00", - "2022-12-05T00:00:00", - "2022-12-06T00:00:00", - "2022-12-07T00:00:00", - "2022-12-08T00:00:00", - "2022-12-09T00:00:00", - "2022-12-12T00:00:00", - "2022-12-13T00:00:00", - "2022-12-14T00:00:00", - "2022-12-15T00:00:00", - "2022-12-16T00:00:00", - "2022-12-19T00:00:00", - "2022-12-20T00:00:00", - "2022-12-21T00:00:00", - "2022-12-22T00:00:00", - "2022-12-23T00:00:00", - "2022-12-27T00:00:00", - "2022-12-28T00:00:00", - "2022-12-29T00:00:00", - "2022-12-30T00:00:00", - "2023-01-02T00:00:00", - "2023-01-03T00:00:00", - "2023-01-05T00:00:00", - "2023-01-06T00:00:00", - "2023-01-09T00:00:00", - "2023-01-10T00:00:00", - "2023-01-11T00:00:00", - "2023-01-12T00:00:00", - "2023-01-13T00:00:00", - "2023-01-17T00:00:00", - "2023-01-18T00:00:00", - "2023-01-19T00:00:00", - "2023-01-20T00:00:00", - "2023-01-23T00:00:00", - "2023-01-24T00:00:00", - "2023-01-25T00:00:00", - "2023-01-26T00:00:00", - "2023-01-27T00:00:00", - "2023-01-30T00:00:00", - "2023-01-31T00:00:00", - "2023-02-01T00:00:00", - "2023-02-02T00:00:00", - "2023-02-03T00:00:00", - "2023-02-06T00:00:00", - "2023-02-07T00:00:00", - "2023-02-08T00:00:00", - "2023-02-09T00:00:00", - "2023-02-10T00:00:00", - "2023-02-13T00:00:00", - "2023-02-14T00:00:00", - "2023-02-15T00:00:00", - "2023-02-16T00:00:00", - "2023-02-17T00:00:00", - "2023-02-21T00:00:00", - "2023-02-22T00:00:00", - "2023-02-23T00:00:00", - "2023-02-24T00:00:00", - "2023-02-27T00:00:00", - "2023-02-28T00:00:00", - "2023-03-01T00:00:00", - "2023-03-02T00:00:00", - "2023-03-03T00:00:00", - "2023-03-06T00:00:00", - "2023-03-07T00:00:00", - "2023-03-08T00:00:00", - "2023-03-09T00:00:00", - "2023-03-10T00:00:00", - "2023-03-13T00:00:00", - "2023-03-14T00:00:00", - "2023-03-15T00:00:00", - "2023-03-16T00:00:00", - "2023-03-17T00:00:00", - "2023-03-20T00:00:00", - "2023-03-21T00:00:00", - "2023-03-22T00:00:00", - "2023-03-23T00:00:00", - "2023-03-24T00:00:00", - "2023-03-27T00:00:00", - "2023-03-28T00:00:00", - "2023-03-29T00:00:00", - "2023-03-30T00:00:00", - "2023-03-31T00:00:00", - "2023-04-03T00:00:00", - "2023-04-04T00:00:00", - "2023-04-05T00:00:00", - "2023-04-06T00:00:00", - "2023-04-07T00:00:00", - "2023-04-10T00:00:00", - "2023-04-11T00:00:00", - "2023-04-12T00:00:00", - "2023-04-13T00:00:00", - "2023-04-14T00:00:00", - "2023-04-17T00:00:00", - "2023-04-18T00:00:00", - "2023-04-19T00:00:00", - "2023-04-20T00:00:00", - "2023-04-21T00:00:00", - "2023-04-24T00:00:00", - "2023-04-25T00:00:00", - "2023-04-26T00:00:00", - "2023-04-27T00:00:00", - "2023-04-28T00:00:00", - "2023-05-01T00:00:00", - "2023-05-02T00:00:00", - "2023-05-03T00:00:00", - "2023-05-04T00:00:00", - "2023-05-05T00:00:00", - "2023-05-08T00:00:00", - "2023-05-09T00:00:00", - "2023-05-10T00:00:00", - "2023-05-11T00:00:00", - "2023-05-12T00:00:00", - "2023-05-15T00:00:00", - "2023-05-16T00:00:00", - "2023-05-17T00:00:00", - "2023-05-18T00:00:00", - "2023-05-19T00:00:00", - "2023-05-22T00:00:00", - "2023-05-23T00:00:00", - "2023-05-24T00:00:00", - "2023-05-25T00:00:00", - "2023-05-26T00:00:00", - "2023-05-30T00:00:00", - "2023-05-31T00:00:00", - "2023-06-01T00:00:00", - "2023-06-02T00:00:00", - "2023-06-05T00:00:00", - "2023-06-06T00:00:00", - "2023-06-07T00:00:00", - "2023-06-08T00:00:00", - "2023-06-09T00:00:00", - "2023-06-12T00:00:00", - "2023-06-13T00:00:00", - "2023-06-14T00:00:00", - "2023-06-15T00:00:00", - "2023-06-16T00:00:00", - "2023-06-19T00:00:00", - "2023-06-20T00:00:00", - "2023-06-21T00:00:00", - "2023-06-22T00:00:00", - "2023-06-23T00:00:00", - "2023-06-26T00:00:00", - "2023-06-27T00:00:00", - "2023-06-28T00:00:00", - "2023-06-29T00:00:00", - "2023-06-30T00:00:00", - "2023-07-03T00:00:00", - "2023-07-05T00:00:00", - "2023-07-06T00:00:00", - "2023-07-07T00:00:00", - "2023-07-10T00:00:00", - "2023-07-11T00:00:00", - "2023-07-12T00:00:00", - "2023-07-13T00:00:00", - "2023-07-14T00:00:00", - "2023-07-17T00:00:00", - "2023-07-18T00:00:00", - "2023-07-19T00:00:00", - "2023-07-20T00:00:00", - "2023-07-21T00:00:00", - "2023-07-24T00:00:00", - "2023-07-25T00:00:00", - "2023-07-26T00:00:00", - "2023-07-27T00:00:00", - "2023-07-28T00:00:00", - "2023-07-31T00:00:00", - "2023-08-01T00:00:00", - "2023-08-02T00:00:00", - "2023-08-03T00:00:00", - "2023-08-04T00:00:00", - "2023-08-07T00:00:00", - "2023-08-08T00:00:00", - "2023-08-09T00:00:00", - "2023-08-10T00:00:00", - "2023-08-11T00:00:00", - "2023-08-14T00:00:00", - "2023-08-15T00:00:00", - "2023-08-16T00:00:00", - "2023-08-17T00:00:00", - "2023-08-18T00:00:00", - "2023-08-21T00:00:00", - "2023-08-22T00:00:00", - "2023-08-23T00:00:00", - "2023-08-24T00:00:00", - "2023-08-25T00:00:00", - "2023-08-28T00:00:00", - "2023-08-29T00:00:00", - "2023-08-30T00:00:00", - "2023-08-31T00:00:00", - "2023-09-01T00:00:00", - "2023-09-05T00:00:00", - "2023-09-06T00:00:00", - "2023-09-07T00:00:00", - "2023-09-08T00:00:00", - "2023-09-11T00:00:00", - "2023-09-12T00:00:00", - "2023-09-13T00:00:00", - "2023-09-14T00:00:00", - "2023-09-15T00:00:00", - "2023-09-18T00:00:00", - "2023-09-19T00:00:00", - "2023-09-20T00:00:00", - "2023-09-21T00:00:00", - "2023-09-22T00:00:00", - "2023-09-25T00:00:00", - "2023-09-26T00:00:00", - "2023-09-27T00:00:00", - "2023-09-28T00:00:00", - "2023-09-29T00:00:00", - "2023-10-02T00:00:00", - "2023-10-03T00:00:00", - "2023-10-04T00:00:00", - "2023-10-05T00:00:00", - "2023-10-06T00:00:00", - "2023-10-09T00:00:00", - "2023-10-10T00:00:00", - "2023-10-11T00:00:00", - "2023-10-12T00:00:00", - "2023-10-13T00:00:00", - "2023-10-16T00:00:00", - "2023-10-17T00:00:00", - "2023-10-18T00:00:00", - "2023-10-19T00:00:00", - "2023-10-20T00:00:00", - "2023-10-23T00:00:00", - "2023-10-24T00:00:00", - "2023-10-25T00:00:00", - "2023-10-26T00:00:00", - "2023-10-27T00:00:00", - "2023-10-30T00:00:00", - "2023-10-31T00:00:00", - "2023-11-01T00:00:00", - "2023-11-02T00:00:00", - "2023-11-03T00:00:00", - "2023-11-06T00:00:00", - "2023-11-07T00:00:00", - "2023-11-08T00:00:00", - "2023-11-09T00:00:00", - "2023-11-10T00:00:00", - "2023-11-13T00:00:00", - "2023-11-14T00:00:00", - "2023-11-15T00:00:00", - "2023-11-16T00:00:00", - "2023-11-17T00:00:00", - "2023-11-20T00:00:00", - "2023-11-21T00:00:00", - "2023-11-22T00:00:00", - "2023-11-23T00:00:00", - "2023-11-24T00:00:00", - "2023-11-27T00:00:00", - "2023-11-28T00:00:00", - "2023-11-29T00:00:00", - "2023-11-30T00:00:00", - "2023-12-01T00:00:00", - "2023-12-04T00:00:00", - "2023-12-05T00:00:00", - "2023-12-06T00:00:00", - "2023-12-07T00:00:00", - "2023-12-08T00:00:00", - "2023-12-11T00:00:00", - "2023-12-12T00:00:00", - "2023-12-13T00:00:00", - "2023-12-14T00:00:00", - "2023-12-15T00:00:00", - "2023-12-18T00:00:00", - "2023-12-19T00:00:00", - "2023-12-20T00:00:00", - "2023-12-21T00:00:00", - "2023-12-22T00:00:00", - "2023-12-25T00:00:00", - "2023-12-26T00:00:00", - "2023-12-27T00:00:00", - "2023-12-28T00:00:00", - "2023-12-29T00:00:00", - "2024-01-01T00:00:00", - "2024-01-02T00:00:00", - "2024-01-04T00:00:00", - "2024-01-05T00:00:00", - "2024-01-08T00:00:00", - "2024-01-09T00:00:00", - "2024-01-10T00:00:00", - "2024-01-11T00:00:00", - "2024-01-12T00:00:00", - "2024-01-15T00:00:00", - "2024-01-16T00:00:00", - "2024-01-17T00:00:00", - "2024-01-18T00:00:00", - "2024-01-19T00:00:00", - "2024-01-22T00:00:00", - "2024-01-23T00:00:00", - "2024-01-24T00:00:00", - "2024-01-25T00:00:00", - "2024-01-26T00:00:00", - "2024-01-29T00:00:00", - "2024-01-30T00:00:00", - "2024-01-31T00:00:00", - "2024-02-01T00:00:00", - "2024-02-02T00:00:00", - "2024-02-05T00:00:00", - "2024-02-06T00:00:00", - "2024-02-07T00:00:00", - "2024-02-08T00:00:00", - "2024-02-09T00:00:00", - "2024-02-12T00:00:00", - "2024-02-13T00:00:00", - "2024-02-14T00:00:00", - "2024-02-15T00:00:00", - "2024-02-16T00:00:00", - "2024-02-20T00:00:00", - "2024-02-21T00:00:00", - "2024-02-22T00:00:00", - "2024-02-23T00:00:00", - "2024-02-26T00:00:00", - "2024-02-27T00:00:00", - "2024-02-28T00:00:00", - "2024-02-29T00:00:00", - "2024-03-01T00:00:00", - "2024-03-04T00:00:00", - "2024-03-05T00:00:00", - "2024-03-06T00:00:00", - "2024-03-07T00:00:00", - "2024-03-08T00:00:00", - "2024-03-11T00:00:00", - "2024-03-12T00:00:00", - "2024-03-13T00:00:00", - "2024-03-14T00:00:00", - "2024-03-15T00:00:00", - "2024-03-18T00:00:00", - "2024-03-19T00:00:00", - "2024-03-20T00:00:00", - "2024-03-21T00:00:00", - "2024-03-22T00:00:00", - "2024-03-25T00:00:00", - "2024-03-26T00:00:00", - "2024-03-27T00:00:00", - "2024-03-28T00:00:00", - "2024-04-01T00:00:00", - "2024-04-02T00:00:00", - "2024-04-03T00:00:00", - "2024-04-04T00:00:00", - "2024-04-05T00:00:00", - "2024-04-08T00:00:00", - "2024-04-09T00:00:00", - "2024-04-10T00:00:00", - "2024-04-11T00:00:00", - "2024-04-12T00:00:00", - "2024-04-15T00:00:00", - "2024-04-16T00:00:00", - "2024-04-17T00:00:00", - "2024-04-18T00:00:00", - "2024-04-19T00:00:00", - "2024-04-22T00:00:00", - "2024-04-23T00:00:00", - "2024-04-24T00:00:00", - "2024-04-25T00:00:00", - "2024-04-26T00:00:00", - "2024-04-29T00:00:00", - "2024-04-30T00:00:00", - "2024-05-01T00:00:00", - "2024-05-02T00:00:00", - "2024-05-03T00:00:00", - "2024-05-06T00:00:00", - "2024-05-07T00:00:00", - "2024-05-08T00:00:00", - "2024-05-09T00:00:00", - "2024-05-10T00:00:00", - "2024-05-13T00:00:00", - "2024-05-14T00:00:00", - "2024-05-15T00:00:00", - "2024-05-16T00:00:00", - "2024-05-17T00:00:00", - "2024-05-20T00:00:00", - "2024-05-21T00:00:00", - "2024-05-22T00:00:00", - "2024-05-23T00:00:00", - "2024-05-24T00:00:00", - "2024-05-28T00:00:00", - "2024-05-29T00:00:00", - "2024-05-30T00:00:00", - "2024-05-31T00:00:00", - "2024-06-03T00:00:00", - "2024-06-04T00:00:00", - "2024-06-05T00:00:00", - "2024-06-06T00:00:00", - "2024-06-07T00:00:00", - "2024-06-10T00:00:00", - "2024-06-11T00:00:00", - "2024-06-12T00:00:00", - "2024-06-13T00:00:00", - "2024-06-14T00:00:00", - "2024-06-17T00:00:00", - "2024-06-18T00:00:00", - "2024-06-20T00:00:00", - "2024-06-21T00:00:00", - "2024-06-24T00:00:00", - "2024-06-25T00:00:00", - "2024-06-26T00:00:00", - "2024-06-27T00:00:00", - "2024-06-28T00:00:00", - "2024-07-01T00:00:00", - "2024-07-02T00:00:00", - "2024-07-03T00:00:00", - "2024-07-05T00:00:00", - "2024-07-08T00:00:00", - "2024-07-09T00:00:00", - "2024-07-10T00:00:00", - "2024-07-11T00:00:00", - "2024-07-12T00:00:00", - "2024-07-15T00:00:00", - "2024-07-16T00:00:00", - "2024-07-17T00:00:00", - "2024-07-18T00:00:00", - "2024-07-19T00:00:00", - "2024-07-22T00:00:00", - "2024-07-23T00:00:00", - "2024-07-24T00:00:00", - "2024-07-25T00:00:00", - "2024-07-26T00:00:00", - "2024-07-29T00:00:00", - "2024-07-30T00:00:00", - "2024-07-31T00:00:00", - "2024-08-01T00:00:00", - "2024-08-02T00:00:00", - "2024-08-05T00:00:00", - "2024-08-06T00:00:00", - "2024-08-07T00:00:00", - "2024-08-08T00:00:00", - "2024-08-09T00:00:00", - "2024-08-12T00:00:00", - "2024-08-13T00:00:00", - "2024-08-14T00:00:00", - "2024-08-15T00:00:00", - "2024-08-16T00:00:00", - "2024-08-19T00:00:00", - "2024-08-20T00:00:00", - "2024-08-21T00:00:00", - "2024-08-22T00:00:00", - "2024-08-23T00:00:00", - "2024-08-26T00:00:00", - "2024-08-27T00:00:00", - "2024-08-28T00:00:00", - "2024-08-29T00:00:00", - "2024-08-30T00:00:00", - "2024-09-03T00:00:00", - "2024-09-04T00:00:00", - "2024-09-05T00:00:00", - "2024-09-06T00:00:00", - "2024-09-09T00:00:00", - "2024-09-10T00:00:00", - "2024-09-11T00:00:00", - "2024-09-12T00:00:00", - "2024-09-13T00:00:00", - "2024-09-16T00:00:00", - "2024-09-17T00:00:00", - "2024-09-18T00:00:00", - "2024-09-19T00:00:00", - "2024-09-20T00:00:00", - "2024-09-23T00:00:00", - "2024-09-24T00:00:00", - "2024-09-25T00:00:00", - "2024-09-26T00:00:00", - "2024-09-27T00:00:00", - "2024-09-30T00:00:00", - "2024-10-01T00:00:00", - "2024-10-02T00:00:00", - "2024-10-03T00:00:00", - "2024-10-04T00:00:00", - "2024-10-07T00:00:00", - "2024-10-08T00:00:00", - "2024-10-09T00:00:00", - "2024-10-10T00:00:00", - "2024-10-11T00:00:00", - "2024-10-14T00:00:00", - "2024-10-15T00:00:00", - "2024-10-16T00:00:00", - "2024-10-17T00:00:00", - "2024-10-18T00:00:00", - "2024-10-21T00:00:00", - "2024-10-22T00:00:00", - "2024-10-23T00:00:00", - "2024-10-24T00:00:00", - "2024-10-25T00:00:00", - "2024-10-28T00:00:00", - "2024-10-29T00:00:00", - "2024-10-30T00:00:00", - "2024-10-31T00:00:00", - "2024-11-01T00:00:00", - "2024-11-04T00:00:00", - "2024-11-05T00:00:00", - "2024-11-06T00:00:00", - "2024-11-07T00:00:00", - "2024-11-08T00:00:00", - "2024-11-11T00:00:00", - "2024-11-12T00:00:00", - "2024-11-13T00:00:00", - "2024-11-14T00:00:00", - "2024-11-15T00:00:00", - "2024-11-18T00:00:00", - "2024-11-19T00:00:00", - "2024-11-20T00:00:00", - "2024-11-21T00:00:00", - "2024-11-22T00:00:00", - "2024-11-25T00:00:00", - "2024-11-26T00:00:00", - "2024-11-27T00:00:00", - "2024-11-28T00:00:00", - "2024-11-29T00:00:00", - "2024-12-02T00:00:00", - "2024-12-03T00:00:00", - "2024-12-04T00:00:00", - "2024-12-05T00:00:00", - "2024-12-06T00:00:00", - "2024-12-09T00:00:00", - "2024-12-10T00:00:00", - "2024-12-11T00:00:00", - "2024-12-12T00:00:00", - "2024-12-13T00:00:00", - "2024-12-16T00:00:00", - "2024-12-17T00:00:00", - "2024-12-18T00:00:00", - "2024-12-19T00:00:00", - "2024-12-20T00:00:00", - "2024-12-23T00:00:00", - "2024-12-24T00:00:00", - "2024-12-25T00:00:00", - "2024-12-26T00:00:00", - "2024-12-27T00:00:00", - "2024-12-30T00:00:00", - "2024-12-31T00:00:00", - "2025-01-01T00:00:00", - "2025-01-02T00:00:00", - "2025-01-06T00:00:00", - "2025-01-07T00:00:00", - "2025-01-08T00:00:00", - "2025-01-09T00:00:00", - "2025-01-10T00:00:00", - "2025-01-13T00:00:00", - "2025-01-14T00:00:00", - "2025-01-15T00:00:00", - "2025-01-16T00:00:00", - "2025-01-17T00:00:00", - "2025-01-21T00:00:00", - "2025-01-22T00:00:00", - "2025-01-23T00:00:00", - "2025-01-24T00:00:00", - "2025-01-27T00:00:00", - "2025-01-28T00:00:00", - "2025-01-29T00:00:00", - "2025-01-30T00:00:00", - "2025-01-31T00:00:00", - "2025-02-03T00:00:00", - "2025-02-04T00:00:00", - "2025-02-05T00:00:00", - "2025-02-06T00:00:00", - "2025-02-07T00:00:00", - "2025-02-10T00:00:00", - "2025-02-11T00:00:00", - "2025-02-12T00:00:00", - "2025-02-13T00:00:00", - "2025-02-14T00:00:00", - "2025-02-18T00:00:00", - "2025-02-19T00:00:00", - "2025-02-20T00:00:00", - "2025-02-21T00:00:00", - "2025-02-24T00:00:00", - "2025-02-25T00:00:00", - "2025-02-26T00:00:00", - "2025-02-27T00:00:00", - "2025-02-28T00:00:00", - "2025-03-03T00:00:00" - ], - "xaxis": "x", - "y": [ - 19421.915245125037, - 19394.91524512504, - 19530.98983490838, - 19705.875929044865, - 19710.878155199192, - 19553.36377461795, - 19505.07487459448, - 19559.83091444795, - 19271.89139915714, - 18972.207359558775, - 19173.818940962512, - 19183.393597392027, - 19138.781954956645, - 19625.497799757817, - 20049.44278236768, - 20486.348981743555, - 20729.38603237387, - 20830.925491378788, - 20993.728334773918, - 21221.02632939988, - 21324.6285044535, - 21523.54080846799, - 21777.132619982214, - 22173.428307119757, - 22490.62450343779, - 22679.792743513186, - 22822.921603761333, - 22866.898737882868, - 23083.99070735542, - 23161.5085785842, - 23237.901743050785, - 23527.935900461758, - 23726.228256018218, - 23594.26925009146, - 23421.634017681812, - 23370.160015228856, - 23247.89732351773, - 23302.819222618, - 23133.85632043397, - 22930.21909347273, - 22742.948192279895, - 22610.629206379406, - 22324.711870110717, - 22261.780966798524, - 22057.277637841962, - 22084.133111804214, - 22187.243433536107, - 22336.884893358045, - 22450.494564177552, - 22600.749520589965, - 22894.83698277418, - 22841.348542253767, - 22846.96876621293, - 22765.78438305686, - 22802.08555811, - 22870.31982203011, - 23181.724383918274, - 23505.59456296635, - 23778.049094347974, - 24024.402589370195, - 24343.977340943355, - 24473.65675262221, - 24390.518484025168, - 24284.516197916953, - 24188.02179444019, - 24249.85949225946, - 24123.288802754458, - 23949.844932733977, - 23740.926404498863, - 23908.87867031445, - 23877.1748726486, - 23835.960807791118, - 23926.07103573208, - 24099.156769054705, - 24308.445672663715, - 24852.003710195666, - 25176.659960133748, - 25560.28148775972, - 25873.209342149807, - 26412.375451373748, - 26755.97929517577, - 27109.1156180334, - 27135.9348461623, - 27297.90535701579, - 27470.75926770647, - 27693.645642688385, - 28531.026773931633, - 29249.323209254013, - 29814.442658879936, - 30394.78891700307, - 30886.058228846814, - 30562.601026860655, - 30681.13431424256, - 31005.326871104597, - 31297.032193103056, - 31500.57553491671, - 31819.66480077325, - 32364.57192863847, - 33182.47335319742, - 33814.89016198101, - 34316.21434658753, - 34832.79982350276, - 35264.032972213274, - 35577.76986565372, - 36087.34300499664, - 36497.98707092797, - 37098.13271428183, - 37917.19166610378, - 37535.42453457488, - 37172.27232116363, - 37243.82059962198, - 37319.913705089566, - 37243.98612045316, - 37072.70911018038, - 37205.27143552388, - 37247.81991079101, - 37651.913169332176, - 37933.76348153083, - 38096.091502129755, - 38012.124407040006, - 37179.10601456292, - 36978.86948708078, - 36267.359948399935, - 35615.63030720373, - 34581.2234659878, - 33702.68481170876, - 32806.26585838061, - 32325.940005792054, - 32443.908787112072, - 32823.88450591653, - 33664.532287208895, - 34308.14722821407, - 34933.84773788475, - 35554.72591207306, - 36601.29782533064, - 37507.964868975425, - 38347.92812514359, - 39233.74507327071, - 40071.4915884807, - 40119.54865798116, - 40846.496975048896, - 41077.790110546026, - 40586.5725499693, - 40189.51444729851, - 39941.24703411013, - 39694.48349051916, - 40332.00073439285, - 40577.98582954204, - 41990.3112994528, - 43501.505816663965, - 43666.32377449487, - 43180.933491096825, - 42695.296604009454, - 43574.419722129445, - 43425.626591778324, - 43106.59633459285, - 42564.350579004145, - 41837.60388021293, - 40754.578670041985, - 40478.114617686806, - 40405.86479918833, - 40153.55938480063, - 39849.43295138798, - 40042.7790587337, - 40113.49269778037, - 40781.49219481667, - 41616.52394779798, - 42238.659755672335, - 41994.65427290794, - 41746.20556409118, - 41753.88091079006, - 41650.9617360003, - 42126.46904449716, - 43163.78325856616, - 43553.36098061982, - 43597.47698666156, - 44554.56511372377, - 45623.96699032771, - 46421.34203230727, - 46903.74484273581, - 46975.83591751357, - 46347.35119789627, - 45585.30752708281, - 45631.53132676818, - 44979.92761541235, - 44570.235839913374, - 44703.58668119194, - 44847.63733551972, - 45028.343399996884, - 45184.003672368, - 45769.73943976778, - 46927.20059218982, - 47303.114821851406, - 47344.38144492153, - 48526.81104064273, - 49010.70072620368, - 49402.927423199595, - 50676.88152086309, - 51196.29109346989, - 51926.38742771962, - 52560.90679880275, - 51921.73311386819, - 51368.59802558576, - 51838.04851247719, - 50859.73222450386, - 50935.70844496906, - 51126.57883866421, - 51795.58914487155, - 52140.374938588364, - 52202.43055592367, - 52588.90660524691, - 53277.83242138722, - 54356.795703237745, - 54945.1250525086, - 55606.20195698558, - 53234.78645959465, - 54386.46329495727, - 55005.86686508345, - 55169.29186407047, - 54800.28908550482, - 55118.84247995377, - 55179.93956452517, - 55287.64060805386, - 56033.99605881713, - 56411.82807607747, - 56330.69742283551, - 56726.4846925362, - 57137.31923563676, - 56271.412769159404, - 55209.041073010354, - 54623.19642044998, - 53655.7616906808, - 52554.64578974922, - 52012.66675569132, - 51964.23861809073, - 51920.68339995694, - 51984.362674741766, - 51879.3521977969, - 51492.01071572867, - 51407.09992752258, - 51350.261304081156, - 51937.05348584894, - 51916.64299487131, - 51781.79857894528, - 51663.17296374691, - 51700.69573593271, - 51680.88011429944, - 51408.579075251335, - 51071.78937821393, - 50595.39739162929, - 50224.87029095235, - 50647.42899412079, - 50972.30617409207, - 51525.54398073639, - 52485.28449701532, - 53383.41375556325, - 54495.84762332276, - 55622.18507602461, - 57645.18043610637, - 59209.57133887981, - 59984.09759659247, - 61540.95135259121, - 60495.726496145784, - 61278.06271891046, - 62812.102003282984, - 64125.79922446161, - 66675.8970631561, - 68328.1953821407, - 70150.76074135094, - 71936.97824295891, - 72852.59185532067, - 73821.18022049093, - 73409.19339340113, - 73385.53697233128, - 72946.69308927695, - 72342.52562467914, - 71783.83981888085, - 70437.08528006838, - 70081.51855780857, - 70076.07777382871, - 70329.62383073328, - 71421.78187499238, - 72838.46035386057, - 74257.52139298028, - 75399.0133122956, - 76110.72924954086, - 76828.1749785094, - 77703.67721215158, - 78595.4456160955, - 79236.53215249634, - 79454.04390303032, - 78460.99748677897, - 78531.40582969457, - 79134.50120751782, - 80778.01983471369, - 81430.66646112163, - 81291.61383721668, - 82020.1284630684, - 82007.30650539754, - 82321.1781086378, - 83002.5971840464, - 82749.03424269754, - 82449.04084387065, - 81341.37931144972, - 81096.86478623346, - 81634.0201555097, - 80398.03207508956, - 75925.37467920723, - 76708.3078157432, - 77039.27905223508, - 74051.14556950655, - 75598.70841627325, - 72180.14618598067, - 70617.93111797534, - 69788.98606508232, - 69374.2510239433, - 67597.23488083517, - 66375.11121397329, - 66965.68169530292, - 67639.4587363371, - 69720.17421269702, - 70774.61958319918, - 70996.41042692307, - 73696.25860277607, - 75451.1405173284, - 76165.95471923512, - 76467.47687627368, - 75453.10522063701, - 72935.84377706563, - 72002.41820984344, - 71776.42054644841, - 71786.38161838529, - 71778.01800766954, - 72154.95535398624, - 72166.61417322388, - 71160.68214374204, - 71711.35625950393, - 73270.21390509649, - 74488.76985166848, - 75822.1283608205, - 77264.18497904985, - 77180.91824899265, - 77415.8215195486, - 77104.00257323678, - 77018.69894832757, - 76908.13148491795, - 76566.91927336808, - 76744.86533105151, - 76698.16851207415, - 78076.66983741835, - 79427.3429683519, - 80696.52328521613, - 81679.97346877772, - 82222.10138932562, - 82889.31199419618, - 83438.25357576218, - 84782.39452637408, - 86441.10356451235, - 88241.80881518619, - 89933.49197771342, - 90704.43856722218, - 90991.67871249345, - 91288.33896744323, - 92122.63620234004, - 93469.00590341972, - 95499.1525173066, - 96530.9332169964, - 97579.54042786623, - 98863.85350543991, - 100790.97715634335, - 101726.31825819975, - 101964.91689297695, - 99167.93694774671, - 98369.67053949375, - 96956.01888863034, - 96719.84538240323, - 96620.59932200439, - 96465.07460836084, - 95386.88871997142, - 95514.9663623352, - 96679.58230639591, - 98557.61692955423, - 99505.53274756628, - 100594.10867830267, - 101640.22329109763, - 101711.41049115524, - 102327.77450191458, - 101086.05762139404, - 99634.16671432252, - 97632.1404532669, - 95683.89780577917, - 94139.15352439982, - 92444.85639588714, - 91878.06974037728, - 90327.68785139611, - 88608.83527107742, - 84882.83881971842, - 81570.28602421698, - 79701.85607216031, - 78958.07722056066, - 78689.58255820538, - 79071.90874304944, - 80423.82910903927, - 80924.376900011, - 81510.97497585876, - 81252.21792374035, - 81324.34698155639, - 81267.11402652442, - 80522.04395038844, - 78732.41451987257, - 76430.41613691485, - 75223.82294598952, - 74669.67616128204, - 75908.11755095392, - 77205.91910369614, - 78832.05970569719, - 79471.73108533163, - 81524.95341170992, - 83575.23744333751, - 85307.68057904782, - 86930.69190682251, - 88192.26678602688, - 88858.49169207476, - 88438.33328566757, - 87745.43230290632, - 87372.06487186985, - 87108.89020328595, - 87431.42101660956, - 88049.60036344372, - 88546.51763320356, - 88705.78662079455, - 87215.21805558752, - 86481.44250487092, - 86312.39485431359, - 86155.35779276898, - 85155.4400782343, - 85262.72630026286, - 85823.94891739619, - 86295.74410937949, - 87250.47370314425, - 88502.59672051684, - 90507.58128958437, - 93216.45817663695, - 93386.23786838287, - 94070.62248565236, - 94750.03274352863, - 91355.12961076573, - 88889.64939639452, - 83498.164785217, - 77413.78786541219, - 76002.92062441712, - 74083.35721475427, - 72947.68757597046, - 72714.83341247194, - 71924.8357297509, - 71305.39308763455, - 70848.04881043288, - 70616.62251702497, - 70183.40206659665, - 70907.936797647, - 70164.96544228161, - 69566.7607679029, - 67936.54141839365, - 66840.25970210867, - 65935.92947833147, - 64887.56152650476, - 64228.275341750654, - 63762.719420275236, - 63549.509259127684, - 63383.6791337907, - 63184.144591861936, - 62663.16714111669, - 62397.96245720372, - 62246.69214749363, - 61800.55005070003, - 61673.55064208279, - 61542.55110204714, - 61356.99590424164, - 61197.11963928182, - 60778.475017092205, - 60696.19586650028, - 60682.20097159545, - 60509.649386669465, - 60493.22037617148, - 60484.88670133971, - 60529.51606535945, - 60569.7833484859, - 60551.102346473155, - 60566.57267824102, - 60590.27182517158, - 60619.260050562014, - 60674.02867031013, - 60771.07093011422, - 60739.88157662851, - 60615.06763502852, - 60455.76790267296, - 60354.09033306309, - 60184.45222336651, - 60029.73369360252, - 59931.063726008295, - 59934.87597343501, - 59793.23793041362, - 59693.07500806364, - 59625.17051290255, - 59572.35590555503, - 59502.364197459676, - 59441.57064671884, - 59357.62010725375, - 59304.54746544757, - 59324.37985515387, - 59303.138380480996, - 59298.839455735426, - 59307.7180698222, - 59363.51254744525, - 59431.352696707625, - 59997.45059057836, - 59948.86006358893, - 59898.84520926382, - 59908.83365589984, - 60234.380225505636, - 60157.98093442496, - 60303.00370802888, - 60638.02142083193, - 61000.8129752343, - 61096.31751754726, - 61294.487717124, - 61321.89244310264, - 61526.540563308256, - 61685.909920746344, - 61762.08608764262, - 61823.55643967308, - 61869.467811609706, - 62025.1766564493, - 62214.061313546765, - 62306.527157955905, - 62435.11170360746, - 62645.121905780885, - 62809.57428524911, - 63101.5484914622, - 63340.86176296127, - 63526.99430746055, - 63641.76406429332, - 63627.14054182992, - 63503.54446880283, - 63356.30307867065, - 63141.78199745673, - 62714.37671206812, - 62202.50593454366, - 61784.93977424684, - 61453.19904069421, - 61104.62291459773, - 60959.06370541156, - 60924.184320488996, - 61351.46346980631, - 61482.12503038644, - 60959.918732698396, - 60761.49161227437, - 60474.15940750011, - 60403.745470453476, - 60289.4235194172, - 60282.06200194454, - 60259.714155021364, - 60635.11027408112, - 60691.529477794254, - 60737.67130123979, - 60819.11494169744, - 60729.64864940283, - 60533.9526442848, - 60434.52241808189, - 60166.4569520346, - 59987.51714510892, - 59733.341739722295, - 59778.98309108825, - 59695.59303103955, - 59817.95533350578, - 59912.17714571338, - 60008.036855185404, - 60467.149962552525, - 60847.276338702555, - 61378.48510545429, - 61623.86970181675, - 61750.83549898755, - 61715.14223012041, - 62030.15857655708, - 62112.15264983703, - 62557.558974648964, - 62704.62321056137, - 62979.67317182657, - 62592.71203058839, - 61978.85336518092, - 61513.07440319734, - 60362.46854387676, - 59344.886208849646, - 58971.29930927051, - 58897.60939584287, - 58836.96168539916, - 58434.79124394294, - 58285.32534503255, - 58262.96297921334, - 58051.681139131746, - 57837.90637462384, - 58531.637113339915, - 57990.00042613959, - 57743.17189165045, - 57255.63858704778, - 56872.00157235682, - 56784.72833870829, - 56807.568666851854, - 56870.33336651907, - 57147.48368848246, - 56960.267272231766, - 57322.43228181456, - 57456.92651991852, - 57764.86648288826, - 57332.701407454864, - 57687.47673308083, - 58160.02441095358, - 58497.05416258811, - 58924.18841385941, - 59275.84838707042, - 59438.67831244582, - 59128.65714329336, - 59220.86290061923, - 59287.02293409489, - 59442.3696267982, - 59602.546904962415, - 59902.68478797902, - 60020.014252547495, - 60108.68512421542, - 60473.762468846035, - 60805.80701043211, - 61225.174987221275, - 62139.68341361286, - 62819.85663413965, - 62735.66368133577, - 62829.06916248832, - 63298.94009227364, - 63234.39525988444, - 63635.30483469284, - 63438.81638209603, - 64068.76980785407, - 64046.265273835175, - 64080.98396959826, - 64504.12073296954, - 64448.22710448053, - 63184.198726766874, - 63748.84332187846, - 62834.59788467836, - 62083.74225837087, - 59675.29899346503, - 58642.62089853827, - 56937.20460248412, - 56481.59894549381, - 56118.86088081673, - 55333.84238606788, - 54772.05022348544, - 54377.100763699105, - 53745.584517198615, - 53692.62743658713, - 55036.549707222635, - 55045.04480660581, - 54842.0965505705, - 55069.95708719023, - 55355.95972678335, - 55652.406224244674, - 55195.08683338125, - 55642.505084931916, - 55587.36374955631, - 55960.34972163844, - 55921.0433181083, - 55866.582782029305, - 56567.93113277033, - 56815.090961124464, - 57148.79093788069, - 57415.557586468865, - 57153.042757592986, - 57686.08677957842, - 57462.7876855671, - 57164.52607576563, - 56025.3226014756, - 55411.93865301433, - 55177.08447087778, - 54802.753440327135, - 53898.94041656552, - 53379.75250919538, - 52992.05080346305, - 53291.61614344901, - 52624.72251899365, - 53108.24969997282, - 52565.88195184549, - 51954.81814774647, - 51461.32407789167, - 51352.85048961795, - 51644.593254293955, - 52060.393182375294, - 51476.570904216336, - 51213.598021203805, - 51305.730223305174, - 51752.38860271735, - 52180.90067559349, - 52341.41006560826, - 52826.80625784198, - 52986.00329624597, - 53626.4898816713, - 53731.312781446555, - 53930.063925716204, - 54106.87037125927, - 54303.275384459426, - 54279.92372805955, - 54869.53910641519, - 55027.01773402513, - 55255.61222216621, - 55565.07460183148, - 55525.767563793364, - 56254.6398675415, - 57137.6516593456, - 57738.32749741546, - 58038.29759369203, - 58083.902255785586, - 57797.70588185836, - 58293.442035470514, - 58744.01459939108, - 58050.571037995964, - 57991.44826802198, - 58504.13055804221, - 59558.55011694684, - 59820.209773872666, - 59600.941806818846, - 59269.135196565185, - 59816.16689088816, - 60405.57609057457, - 60565.894356997334, - 60689.05354794702, - 60130.28847424122, - 58603.736686988734, - 58326.97418579235, - 58173.381129306275, - 58676.586529817105, - 58952.19073021442, - 58902.42201225009, - 58843.15745383339, - 60774.5887640577, - 60872.70200534328, - 60261.31086280763, - 60698.339974168804, - 60437.33356509559, - 61466.884135816435, - 62462.99917135849, - 63834.37800530934, - 64528.00598727112, - 65762.31831170456, - 66690.67234181945, - 66589.42953482928, - 66153.90735161472, - 66180.16787578116, - 66200.59272791063, - 67024.0688444323, - 67463.55785001832, - 67494.27152102964, - 67704.27104292736, - 68272.91395326232, - 68790.84833258664, - 70177.90840539444, - 70790.6938487205, - 70935.19363797411, - 71359.14166130954, - 72047.33122136763, - 72907.03421252393, - 73240.13653897884, - 73622.65741459535, - 73534.61809563042, - 72235.16003456681, - 72783.35932040622, - 72053.84765383687, - 72320.19630208587, - 72020.39505416673, - 71600.43852800742, - 72140.28526775187, - 73222.07348414272, - 73407.9617598116, - 74800.87486310962, - 78028.69616567474, - 80731.44606766982, - 80099.24292227141, - 82414.19603140598, - 86671.62590286846, - 89031.84913622812, - 91558.13387328565, - 95718.57755766372, - 96181.14486773554, - 93008.82359591026, - 90655.90705115728, - 89797.52751634941, - 85016.5656559433, - 85858.70643118299, - 86099.24987838585, - 82281.33922621027, - 83784.84629958872, - 84167.57402332754, - 87586.69558623551, - 84928.64499407164, - 84910.16120016637, - 84525.22936046231, - 78397.1712629147, - 83910.30991288573, - 74216.63997397429, - 71449.66540864977, - 69396.12106086274, - 67422.75230548537, - 69023.8490012414, - 67929.37245316604, - 75138.21579184789, - 76904.33736169752, - 85144.0985826917, - 86900.57953235383, - 93208.39804875772, - 96078.36800596076, - 94930.56686156309, - 97294.49930480939, - 96739.78009400093, - 99209.44293003877, - 100730.29180251269, - 102297.06314777018, - 105591.21863852601, - 107373.89513133609, - 109788.19907018836, - 108096.2646646905, - 113117.15273352062, - 116581.58300453877, - 120291.13988199737, - 122397.93385328425, - 121836.55138650736, - 122946.70702665037, - 127321.27252453935, - 130865.49418679439, - 129399.93456821603, - 129030.05486487731, - 130004.59287339164, - 127622.01132445836, - 127140.55900862132, - 124904.98498519257, - 126282.31630030354, - 127638.74119959965, - 129427.62723238551, - 131676.3820228981, - 130960.41352663006, - 129452.6386680616, - 129915.48044473062, - 131898.8018265843, - 139522.49623469278, - 142370.3696632215, - 147010.29999928302, - 148117.66413996732, - 148413.94736049956, - 148204.38986535795, - 144661.95625802554, - 143707.84123010043, - 143450.75176393645, - 142714.6821791422, - 145387.1836131912, - 145408.018061896, - 142385.2986874375, - 143752.62806285868, - 144668.32868818624, - 147112.20695233002, - 150340.79062868672, - 148520.80295881396, - 147248.49863493853, - 151372.81749414647, - 154730.06549575273, - 158459.24355970544, - 161387.5841463362, - 169104.62682482685, - 175595.07738385262, - 177993.20559642828, - 177577.30531732042, - 181274.3828780144, - 179508.77653633192, - 180219.41604835662, - 182972.04129859386, - 185049.63871544503, - 189159.43670632932, - 191953.16847701714, - 192624.29122501667, - 198516.27558457176, - 206749.28726628597, - 215966.07412984152, - 217030.24169038472, - 220778.48312636273, - 221514.89313212348, - 222320.21690968584, - 221004.8020700122, - 225843.47941693265, - 225433.56179787082, - 226700.848094156, - 223693.40410237788, - 223528.83655321712, - 223544.8957902253, - 224658.60853012057, - 225864.0517722613, - 229009.99556453794, - 232733.8407363087, - 238688.72031435271, - 245945.51554172026, - 250594.43810519224, - 254798.60009900373, - 253936.28164974606, - 255622.2561892123, - 251391.90305324178, - 254992.1839474868, - 257875.73575412182, - 259024.60938150462, - 265515.1209960616, - 271661.51016367436, - 275231.4795162621, - 276591.455679386, - 281503.1038062601, - 286590.98678277066, - 286749.18534405425, - 299285.56200283003, - 306336.78121014097, - 315319.95170471625, - 322309.27417320316, - 323671.75524442346, - 339427.4837340136, - 351599.71700369485, - 342248.12065789173, - 334694.10127782245, - 331821.5306488796, - 328741.7378264727, - 318396.9916061078, - 311923.3001013798, - 311452.651153258, - 303344.92419360764, - 298695.5810027685, - 285649.4251876714, - 281732.9706648181, - 284404.0615914879, - 276458.2434233419, - 274314.8292925618, - 280416.61830195517, - 285016.8986425943, - 289072.1166853135, - 295807.8418296509, - 312506.18360858, - 311373.7827699691, - 319540.8043399385, - 323694.59889435925, - 331199.2168811312, - 338262.80864861986, - 341651.15780111117, - 353783.7626974935, - 359842.45539467933, - 363976.9941591575, - 365043.3020870849, - 367820.43047547294, - 361498.7525553304, - 358900.5789305382, - 351768.11055569974, - 341308.41293082567, - 336433.64811147907, - 332256.6088075426, - 332331.13379336987, - 322604.0976712355, - 320025.84735401993, - 308502.20821840776, - 293658.8222240427, - 289365.74422842555, - 307037.9057873899, - 319212.6981110288, - 330942.53658497054, - 334330.4109535916, - 330163.53546251927, - 322603.7434139072, - 318382.2384872092, - 310962.73465533275, - 307654.7872305399, - 303841.6870887423, - 293786.4980895668, - 273773.3543423566, - 277472.2425389709, - 274245.2666918931, - 270571.70586196485, - 275953.6840432457, - 277271.11151757534, - 280890.22177538695, - 285362.8551948325, - 289839.9034099565, - 295209.2742439421, - 297223.78489259735, - 295889.51539710764, - 295007.3057895042, - 286101.69831692404, - 284348.4480604722, - 277482.03119434335, - 281278.7069651315, - 281605.0103424114, - 282904.7500672984, - 287928.43651998806, - 284682.9704276354, - 287008.16346691706, - 289053.94876088004, - 281849.0039895182, - 280992.4913895692, - 278669.53714516456, - 279398.92787996, - 284917.89845146757, - 296989.3200070845, - 306378.20343923103, - 301126.9960219632, - 296457.41212735936, - 295637.18020933424, - 297033.1109397592, - 295649.3903967565, - 295883.7188633099, - 296843.7521150736, - 296338.2224220009, - 296267.8104384999, - 295796.93445133255, - 296492.3642390911, - 298227.1429629035, - 303994.1930814243, - 306663.3209513847, - 301769.30929468723, - 297674.52245058934, - 300769.13268295745, - 299042.71841924376, - 298719.951769689, - 301683.3554867019, - 304402.66948882316, - 303546.58037936146, - 304669.6221831137, - 304816.9880304766, - 304967.1614673142, - 304082.85191818804, - 302497.83337997884, - 302785.59673914954, - 302208.85712961556, - 300475.8374333111, - 298669.5998917413, - 296541.04509975313, - 291751.0580393178, - 286521.0681034237, - 290175.5203755059, - 282080.6499204587, - 273665.1951220889, - 270873.17472335673, - 267177.71441323153, - 258813.4675053565, - 250898.49768812043, - 244267.41005249237, - 235132.88762306576, - 229687.67391175852, - 225691.3965807418, - 223706.51421217315, - 222305.43759336733, - 218514.29791942655, - 216963.19877022918, - 214569.85379898458, - 210758.91882134986, - 208702.63606096726, - 207236.4939187536, - 203865.6055859207, - 199317.71573108638, - 195396.02362177084, - 191216.44736585888, - 185704.58098857722, - 184852.01825069144, - 185975.482628266, - 199765.39936637957, - 199025.89016269, - 197469.96640842463, - 197364.3564897577, - 198105.439093534, - 195966.7154586293, - 199439.37485370337, - 208615.30939682137, - 209643.4204344336, - 212047.68518392625, - 213427.8924210337, - 215383.3581576144, - 221970.98508593324, - 215347.40587340278, - 214771.06648587916, - 214615.1358511385, - 220396.57190120383, - 218573.98467900694, - 219815.6390617428, - 219249.45301580298, - 219568.08609118316, - 218390.02292758995, - 215717.19602257304, - 210252.2195408932, - 207141.0156106977, - 207322.58076580154, - 203309.6771817237, - 199668.19661632986, - 195336.26728769028, - 187868.8886614268, - 185970.18348539094, - 185676.49993861574, - 183638.34632389486, - 183346.44906800086, - 184999.6999179819, - 187523.6728013005, - 189693.00800296347, - 191686.40478228583, - 193618.4911662032, - 193445.11390925004, - 194925.59826495315, - 195205.08609716673, - 196229.62716275698, - 197250.25955149572, - 199859.97363162588, - 202012.64013839376, - 202943.93631032435, - 204246.16666627038, - 205225.0487561306, - 207086.30379792035, - 207395.6339259443, - 209133.1129144074, - 209758.75855198238, - 210461.4829367629, - 212203.82412492554, - 213211.16886099515, - 215285.22979683298, - 217031.1660802624, - 218413.83323353328, - 219993.1299082995, - 222511.4717664511, - 223953.51543390236, - 224976.77161969774, - 226516.97112923808, - 222955.65950450377, - 220168.99863243251, - 223979.37350971042, - 223098.55396981546, - 224372.91654989717, - 223112.42077884963, - 224014.73776044452, - 224729.3176350183, - 225383.4353152424, - 228446.70462208329, - 224613.350345473, - 220157.3402658887, - 206256.88703547243, - 207517.87783950104, - 209593.09290930114, - 205682.86043365148, - 209151.54628592398, - 211369.67972658033, - 212773.0400508727, - 217941.83262254953, - 214302.50170770675, - 217803.51975979033, - 227100.756022522, - 226016.9221185392, - 253852.7179709971, - 247623.33696735319, - 235085.37396451904, - 240305.84636685473, - 241357.21379089364, - 234417.76911746673, - 234360.98995759545, - 226111.6532042102, - 245926.61350713277, - 239530.91596496146, - 259553.70676549492, - 241675.54405479867, - 251419.35321427762, - 253540.62039625965, - 255416.0504266901, - 256160.61272095304, - 256473.60561649088, - 259892.31612243043, - 268060.7173399369, - 262961.72192091704, - 256096.73085649978, - 254033.70223926852, - 258280.79109253304, - 273763.3314769731, - 281623.9285122933, - 304168.9987352951, - 294677.3866865187, - 289452.2439819148, - 284104.91076722293, - 280394.76271135145, - 267275.2031123403, - 257336.10120199827, - 253741.79971617673, - 253299.225394539, - 254082.7786999319, - 255007.05366217898, - 254604.82307726, - 250623.0881778786, - 245741.7388116931, - 241907.91152688215, - 239392.15697202913, - 231823.7923182546, - 230403.95314309662, - 229533.5226735293, - 230366.52119719915, - 231023.29782672017, - 230339.67964968097, - 228431.2029382573, - 227995.21130814147, - 230464.50732416505, - 237213.9597810723, - 244636.61842932392, - 250225.90848907523, - 255700.35631332625, - 266326.1302564294, - 268821.73221217626, - 276517.20039997937, - 285658.67565715953, - 295404.79277931736, - 301488.43942988454, - 298409.1206267959, - 315802.9837799492, - 336091.3665474569, - 354681.98601395503, - 364769.13448789815, - 389101.36107874283, - 406345.8706493997, - 424751.0447599105, - 425725.62462364126, - 432184.1867398762, - 441761.40171917, - 446772.22604604135, - 450851.20052249683, - 453697.3417735393, - 455641.5627465725, - 450749.45144541905, - 478198.36487785546, - 497676.5371440353, - 530367.3929153101, - 555417.7385033511, - 554268.5628496056, - 551955.4811880183, - 552025.7669707821, - 555249.8781351537, - 574471.4090407761, - 556783.8469457995, - 532559.0764274844, - 524514.8716214715, - 550126.0456612393, - 540529.7365810587, - 520210.940629807, - 508714.6096173715, - 499521.352163255, - 513987.70747672, - 511683.81818028924, - 483245.7931719542, - 478876.2181654714, - 480198.83269621315, - 487641.97733123467, - 494652.74749373086, - 513083.9020645612, - 520455.93596188165, - 521459.7401042421, - 521439.36554830027, - 514016.2964492344, - 526694.3120184107, - 521918.5320388579, - 534151.8142769835, - 534323.1546785427, - 541316.3145013076, - 545212.6888450447, - 549904.8688901735, - 536391.0089252737, - 534715.228952574, - 535616.2889738075, - 529524.7801014336, - 524947.0509784761, - 525733.3727717312, - 511100.95638870756, - 495361.08444745187, - 496448.40627091954, - 492589.7575352132, - 494508.5862963304, - 491890.1272411338, - 498893.54797598085, - 501281.97901707306, - 497276.8698268115, - 500009.0071232747, - 504854.0027983017, - 504613.4438788782, - 512395.23138599325, - 514358.28833597165, - 487237.88818595477, - 470312.02140260837, - 487516.34723778337, - 502786.3784429195, - 492278.6249358032, - 482620.92776360153, - 480769.38551855594, - 471877.8901248568, - 440311.72704086854, - 444362.0401445468, - 450638.9503362965, - 454136.5471521019, - 456279.1224532838, - 461300.56990975863, - 460525.5845981279, - 459837.8182446374, - 460946.77774747805, - 462122.6351385764, - 459315.5242205417, - 456939.4379509592, - 452659.7041857284, - 452021.39080785925, - 451238.25818062766, - 451847.48835944757, - 446881.43473283027, - 437005.6152454613, - 432714.5370126002, - 435685.36064877233, - 444017.11236579495, - 463441.09546546615, - 518993.0823207659, - 552087.4054304434, - 552365.9918141279, - 545776.5590014382, - 504558.0055767337, - 503262.64277026535, - 490737.5753512529, - 489698.490099048, - 502033.6460139999, - 533129.3228367402, - 494004.77189700364, - 491543.6218885056, - 488848.8840772018, - 483719.53778960626, - 480268.37956592086, - 478402.47872527665, - 477479.0002936645, - 474212.40595796617, - 471204.499252423, - 469235.0162592228, - 465201.5294867337, - 462024.9286636867, - 461229.1626639835, - 460003.5668864365, - 458770.32572612213, - 457857.8048236554, - 456494.73301062576, - 455201.2327116027, - 454008.51025680697, - 452926.4953026116, - 451730.7218318122, - 450620.6757989682, - 450027.3066623117, - 448944.7692065917, - 447469.7583750178, - 445242.5277282381, - 443373.5705585205, - 445152.71498207346, - 444540.8543838602, - 442838.29614080547, - 445047.973062874, - 447512.7217800384, - 449863.9713989262, - 451446.05443583895, - 451993.2301312155, - 451571.03344984166, - 450177.6582532176, - 449019.4775447322, - 448402.55921591027, - 441823.84496015985, - 439724.28942790953, - 438289.0795694926, - 436280.02745739056, - 434730.779547931, - 433196.92006279575, - 431757.2515743573, - 430942.02048329904, - 429766.65842797904, - 427959.33090298105, - 425935.1635519955, - 425511.9222790067, - 424360.51240001543, - 423218.3047163555, - 420603.25429573114, - 418322.6595241344, - 418023.45720302896, - 417048.6343892695, - 418993.77220079, - 419844.99049863924, - 420198.71584141086, - 418350.50221912214, - 417506.3360684531, - 416338.0957290439, - 415169.7241712957, - 415927.65740415826, - 415136.30608705856, - 414823.03284042544, - 416529.3758708219, - 416395.9760055747, - 417987.2205548269, - 418182.5631994143, - 418484.4963674268, - 418862.66660921427, - 419450.1323528267, - 422795.3834867475, - 421567.2454797971, - 421330.36036328, - 421389.44971710007, - 419729.3414367379, - 417498.1461075673, - 418775.0386293234, - 420553.17725735594, - 423417.8406347146, - 423037.5788171047, - 424121.8196256303, - 423441.78469892795, - 424311.2019781595, - 423227.4154175618, - 424637.80364820804, - 425734.772272044, - 425659.570090583, - 425079.0764535312, - 425358.692513602, - 425298.3938936571, - 426084.8283003666, - 426804.2772833629, - 426201.62649236, - 427512.8980993578, - 427812.7760159116, - 426935.82233326585, - 425755.96946898586, - 423915.2924643281, - 417825.877016261, - 446720.7761122088, - 457636.5878854937, - 461417.1977892157, - 471962.2261802762, - 472659.57206107955, - 471138.24458357604, - 482971.1009899623, - 480482.76708381815, - 487229.9944840098, - 486519.1152644063, - 488393.8758713815, - 491286.13412125094, - 482566.33498226054, - 479674.93565193476, - 486674.9583950147, - 493305.9760840768, - 496985.21206445846, - 500679.27675423946, - 498716.8826240692, - 500523.7983006035, - 500962.06604901905, - 497815.94096445333, - 479052.51034312457, - 479316.50874875754, - 468827.34464090614, - 455986.10589035525, - 459304.9201954823, - 461303.3313216923, - 469335.65108652215, - 476176.2787905441, - 491427.7670047834, - 488419.1467269694, - 482739.7753997809, - 487292.37547863426, - 485826.50887329795, - 482698.8687119463, - 497925.7041420063, - 496358.8856287943, - 502783.5823407405, - 520237.7908944764, - 486303.84199182666, - 501385.2150675436, - 574774.060793101, - 526740.4029878757, - 524832.0024727006, - 536516.0242942311, - 545032.485710977, - 572610.8445906682, - 576972.3459415393, - 580560.1964934363, - 583084.6358115785, - 588337.5330590225, - 592409.2459622207, - 588363.9115535971, - 582340.3181246676, - 613026.9676799447, - 599980.4728896045, - 580885.5910876028, - 576256.6341155083, - 549493.088007201, - 567685.2854785174, - 560203.5724006525, - 554860.0177845353, - 549920.8086386663, - 539323.023747435, - 528738.0577209216, - 584573.328589189, - 596467.9837089524, - 631076.7522276068, - 633870.7944087827, - 582739.1605496972, - 574221.5564370751, - 581124.6583255344, - 589757.6870606615, - 592795.598299094, - 598687.8625956525, - 619073.5126040867, - 615859.775256522, - 632386.3128750827, - 645315.317969214, - 639515.0997090938, - 668896.1867164347, - 646327.5233308154, - 641004.6728623501, - 641881.6489712526, - 655497.6303892881, - 701839.5048255374, - 740213.7404981762, - 782127.5904657848, - 786642.8856313288, - 824213.1152045301, - 852479.404872575, - 870063.8492216184, - 883906.2546046012, - 892227.5699024766, - 899723.8754920226, - 979614.3809574316, - 1155605.3296527495, - 1115210.6750718672, - 1134060.9437311809, - 1159703.3749106473, - 1272076.183220522, - 1359473.074432051, - 1322953.434263239, - 1223850.8002038463, - 1182039.3070465408, - 1146722.5901464145, - 1070050.3829767774, - 1065235.3329559485, - 1059704.889462466, - 1029232.3223008685, - 1019818.1033974033, - 1036082.8038704898, - 1039039.6992055167, - 1056177.8400216477, - 1065333.1808777247, - 1060002.3348768959, - 1067285.3333525206, - 1080892.2067051611, - 1144019.9482080094, - 1159601.808433516, - 1154531.7601630378, - 1130305.2753528145, - 1091697.7871670849, - 1090160.9748716117, - 952357.898641799, - 985297.728240833, - 1004017.0118202652, - 952773.6023793655, - 995872.5331707201, - 1006532.2571195517, - 1199969.2032744202, - 1225903.105701644, - 1207386.6964783738, - 1173428.422134142, - 1197810.2127857956, - 1218754.3832926382, - 1193944.2936868488, - 1170941.0017712354, - 1157529.7435730926, - 1086863.3205300926, - 1079605.102607759, - 1069550.4886681656, - 1051894.7889373715, - 1030993.35581342, - 1015330.2411614582, - 1027367.2630988202, - 1024771.2121367881, - 993882.950277432, - 1013281.4132757086, - 1057680.551163257, - 1068068.3757549054, - 1092978.4615484085, - 1125005.6393878004, - 1141594.4443739937, - 1151774.9593632547, - 1166267.1376882363, - 1159650.8319410007, - 1158341.14969315, - 1142860.1746114884, - 1133917.944155491, - 1098420.660168492, - 1095628.1059563812, - 1101481.7860136277, - 1083072.7593914862, - 1099714.0558349264, - 1072487.8756110969, - 1038537.290992563, - 998214.0585114809, - 966794.6554706392, - 952445.4471903809, - 930185.7296390684, - 923610.8382102696, - 918346.178205971, - 919133.8870915158, - 932221.9940024951, - 928086.0771554799, - 931079.8084966901, - 942335.9328731861, - 964400.5851660167, - 977792.7591715521, - 997247.8945091909, - 1020394.5553273546, - 1036589.8470748141, - 1034833.6295450605, - 1044261.1270219189, - 1033072.7361705872, - 1022427.5432862177, - 992710.6154872642, - 953833.6716436329, - 941630.3806598485, - 939899.4015029757, - 883291.6399365194, - 858721.0476070531, - 839419.1698338279, - 828550.4871213193, - 818913.1783449239, - 828872.2552349345, - 846959.5396294249, - 876859.2746206246, - 901721.85426806, - 928574.97177162, - 953386.2853855002, - 975559.154794081, - 1011624.5539755949, - 1042161.8097953195, - 1073587.6618814208, - 1098413.2887284618, - 1121183.1553885378, - 1138911.8909579047, - 1166798.4895989324, - 1179477.1881906083, - 1189653.2628058244, - 1197529.2562530518, - 1188816.1400453392, - 1149837.6023110303, - 1148226.424929373, - 1149081.8925622816, - 1130495.9229434328, - 1116388.946573216, - 1089478.9649519373, - 1078626.738057841, - 1061899.9797738434, - 1060260.789590445, - 1072062.965534755, - 1074625.0365263715, - 1084540.7278676324, - 1102565.7100219466, - 1121799.3278016853, - 1124501.593308812, - 1161163.3553699104, - 1187251.6293051413, - 1192138.3484394737, - 1209122.6046023204, - 1219799.2067042403, - 1228072.2151280267, - 1240838.9994576385, - 1230280.1448008441, - 1220085.6597517936, - 1242291.0602691993, - 1259561.9273382926, - 1197849.419537598, - 1139848.9332201157, - 1097794.9994176296, - 1090375.8286823623, - 1061398.14033271, - 1049207.1605052026, - 1021734.957372778, - 996856.5485401221, - 977502.3898393486, - 1001530.3180909558, - 1020511.2712469099, - 1030003.1872755488, - 1075773.398566681, - 1093231.4362575025, - 1157436.3686720275, - 1181710.3240131605, - 1202996.6258782798, - 1219848.2580001813, - 1233471.749650549, - 1269561.132045279, - 1262734.0848667712, - 1280905.599738252, - 1321138.142557647, - 1383585.120306064, - 1402053.3252214997, - 1434266.3734890604, - 1446352.6332527199, - 1490068.0575133436, - 1491665.054160496, - 1492671.0474531115, - 1505506.6177995193, - 1515868.1725133923, - 1515812.715068626, - 1488542.0438006027, - 1479357.632814363, - 1491709.7576028432, - 1518499.7435494387, - 1493053.621507904, - 1510084.4154755971, - 1523666.1441171372, - 1558456.9330605564, - 1600234.768905437, - 1631302.3741802757, - 1653351.622727373, - 1662081.5231420614, - 1620868.66790904, - 1505679.7805055797, - 1560853.9791917775, - 1589769.4670588202, - 1628705.4020665195, - 1509690.5737391757, - 1561767.9294845744, - 1574468.650619884, - 1604373.1003917914, - 1603091.0057699422, - 1615514.93217517, - 1620975.7638236808, - 1631803.632883634, - 1641576.9754858196, - 1632937.3530652968, - 1628494.868960446, - 1628277.3813233399, - 1627271.0020500359, - 1638658.262615243, - 1620743.9097215151, - 1608843.3019152833, - 1581520.0513993246, - 1607305.8565535792, - 1588313.1494513324, - 1602148.8217051402, - 1578528.233458102, - 1555216.109265961, - 1552191.1237831837, - 1520543.3572965811, - 1504945.0944736663, - 1441254.4456114003, - 1412773.1631629714, - 1344585.276814193, - 1337065.9207651434, - 1329503.5327269933, - 1338058.0086973216, - 1352936.4900075758, - 1365901.1976933302, - 1340703.5258933613, - 1343233.8535079062, - 1362887.1711081362, - 1407180.3109895724, - 1436412.7531195786, - 1433805.127897761, - 1465302.5305030132, - 1475149.9547515423, - 1481028.5069448436, - 1497908.4150562987, - 1521792.7880318738, - 1543077.6559017664, - 1559346.5531339059, - 1565291.0954255692, - 1573517.1616524193, - 1587085.2131621907, - 1636320.8310031241, - 1661146.3115460721, - 1749128.9075239194, - 1798965.3710622475, - 1839135.9538142805, - 1739423.007065862, - 1824285.715150424, - 1895680.5992161962, - 1991751.6201562397, - 2109864.414220718, - 2147353.254048645, - 2040167.9072481443, - 2085143.193069977, - 2181977.304264736, - 2262401.6129717706, - 2331909.964188353, - 2051305.0818012506, - 2212234.617722393, - 1991893.6789943932, - 1939364.0599837266, - 1965399.3563087652, - 2071362.3645615715, - 2159674.148758198, - 2107228.314244464, - 2191597.1937213885, - 2258367.988870109, - 2292629.1628746665, - 2346833.9648782127, - 2381588.612799101, - 2395148.7518798686, - 2458568.5250532967, - 2493509.3020333196, - 2457657.6841288945, - 2153376.98131434, - 2185920.323569686, - 2198616.8119905116, - 2145921.5442070244, - 2105728.002597647, - 2042898.642388214, - 2047367.9683188125, - 2052356.6460932372, - 2051941.1732511227, - 1993570.2499294777, - 1940888.4206793096, - 1906877.907979077, - 1855164.3708071122, - 1841617.1752289173, - 1792969.0742857964, - 1789139.4402189243, - 1729198.6218015696, - 1708283.3490910963, - 1662468.6853460444, - 1999617.2802110042, - 1919979.2712399901, - 2177200.2642625347, - 2111820.7143909205, - 2092610.274550977, - 2123141.7183924196, - 2122370.935753741, - 2111916.3074305076, - 2138869.3742902153, - 2167632.3151811007, - 2180594.046985122, - 2181912.6161660277, - 2212088.615258223, - 2235083.5716357497, - 1967194.2440158224, - 1983592.987810904, - 1901279.7885404113, - 1853452.300218917, - 1772748.6981910884, - 1762343.118836111, - 1712122.0015600168, - 1707762.6881230553, - 1727495.6665609735, - 1750036.3164571326, - 1828658.4885985893, - 1878775.7335975005, - 2010039.146374431, - 1887116.800756488, - 1901684.4208314216, - 1937641.644095458, - 1945519.4844119311, - 1957397.8046580767, - 1757712.7936516234, - 1844006.7850910488, - 1883216.000655046, - 1931260.3905381546, - 1960981.4771005635, - 1970250.6555379927, - 2002241.1276559932, - 2084743.1615255496, - 2164997.5918096295, - 2330153.9407504234, - 2353133.8788154856, - 2387642.0084216446, - 2493508.887004213, - 2523435.348123988, - 2500465.9289949248, - 2478857.447450097, - 2815810.695137454, - 2725566.9544498427, - 2709486.2672483665, - 2745642.9549805527, - 2770862.045438919, - 2727221.893573203, - 2726894.553233203, - 2733238.84407987, - 2795041.048071721, - 2814811.2067320514, - 2648582.441245639, - 2843171.6903117644, - 2770985.0840298617, - 2732361.323588382, - 2758989.5099116755, - 2999745.877052015, - 2994870.8070500563, - 2987953.241492978, - 2980204.0238374737, - 2991879.8236596454, - 2974535.907666784, - 2986361.750783446, - 2943183.5176519607, - 2618663.7807719177, - 2704873.9854207714, - 2783883.1223698817, - 2840894.6733303005, - 2852438.1018550703, - 2823179.10181878, - 2772889.524012777, - 2742725.296830329, - 2719260.475688425, - 2698147.8370224996, - 2733207.5180601142, - 2790410.781089369, - 2893310.6967787906, - 2973717.008981674, - 3019286.6962505826, - 3030781.986348623, - 2828835.211980432, - 2895213.2763607274, - 2908180.748656513, - 2948298.8937754575, - 2944908.0066457475, - 2931903.183322641, - 2720326.231849113, - 2755167.491814146, - 2784323.8717869497, - 2887928.5895435745, - 2933291.182752005, - 2968553.087410604, - 3038529.568811737, - 2994623.3228034074, - 2990122.9092413723, - 2885544.711589732, - 2804206.113416235, - 2855023.3079943676, - 2884389.2934441394, - 2913447.615460628, - 3011502.643695676, - 3086932.6770854993, - 3085079.48083314, - 3087988.550414638, - 3087186.2202249, - 3077455.9634106616, - 3091853.565576842, - 3160294.36726165, - 3166489.879683166, - 3174078.3615562483, - 3200085.492403775, - 3223085.0885439683, - 3308285.55220856, - 3388346.750000691, - 3502313.4914580053, - 3539723.052772011, - 3581446.265166827, - 3566928.865801191, - 3605733.3329612534, - 3620812.2202585437, - 3624471.254068089, - 3649919.541861294, - 3606361.987922673, - 3609048.5570815243, - 3606938.2219828544, - 3653244.6280172225, - 3700209.832710619, - 3737081.2141388175, - 3724451.066360749, - 3700224.395866695, - 3627975.652149097, - 3586449.316374659, - 3541130.7297822456, - 3489672.1624325905, - 3479658.2767161913, - 3452187.5878256587, - 3379188.063155045 - ], - "yaxis": "y" - }, - { - "hovertemplate": "variable=ZSCORE_1NORM
datetime=%{x}
value=%{y}", - "legendgroup": "ZSCORE_1NORM", - "line": { - "color": "#EF553B", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "ZSCORE_1NORM", - "showlegend": true, - "type": "scattergl", - "x": [ - "2017-01-05T00:00:00", - "2017-01-06T00:00:00", - "2017-01-09T00:00:00", - "2017-01-10T00:00:00", - "2017-01-11T00:00:00", - "2017-01-12T00:00:00", - "2017-01-13T00:00:00", - "2017-01-17T00:00:00", - "2017-01-18T00:00:00", - "2017-01-19T00:00:00", - "2017-01-20T00:00:00", - "2017-01-23T00:00:00", - "2017-01-24T00:00:00", - "2017-01-25T00:00:00", - "2017-01-26T00:00:00", - "2017-01-27T00:00:00", - "2017-01-30T00:00:00", - "2017-01-31T00:00:00", - "2017-02-01T00:00:00", - "2017-02-02T00:00:00", - "2017-02-03T00:00:00", - "2017-02-06T00:00:00", - "2017-02-07T00:00:00", - "2017-02-08T00:00:00", - "2017-02-09T00:00:00", - "2017-02-10T00:00:00", - "2017-02-13T00:00:00", - "2017-02-14T00:00:00", - "2017-02-15T00:00:00", - "2017-02-16T00:00:00", - "2017-02-17T00:00:00", - "2017-02-21T00:00:00", - "2017-02-22T00:00:00", - "2017-02-23T00:00:00", - "2017-02-24T00:00:00", - "2017-02-27T00:00:00", - "2017-02-28T00:00:00", - "2017-03-01T00:00:00", - "2017-03-02T00:00:00", - "2017-03-03T00:00:00", - "2017-03-06T00:00:00", - "2017-03-07T00:00:00", - "2017-03-08T00:00:00", - "2017-03-09T00:00:00", - "2017-03-10T00:00:00", - "2017-03-13T00:00:00", - "2017-03-14T00:00:00", - "2017-03-15T00:00:00", - "2017-03-16T00:00:00", - "2017-03-17T00:00:00", - "2017-03-20T00:00:00", - "2017-03-21T00:00:00", - "2017-03-22T00:00:00", - "2017-03-23T00:00:00", - "2017-03-24T00:00:00", - "2017-03-27T00:00:00", - "2017-03-28T00:00:00", - "2017-03-29T00:00:00", - "2017-03-30T00:00:00", - "2017-03-31T00:00:00", - "2017-04-03T00:00:00", - "2017-04-04T00:00:00", - "2017-04-05T00:00:00", - "2017-04-06T00:00:00", - "2017-04-07T00:00:00", - "2017-04-10T00:00:00", - "2017-04-11T00:00:00", - "2017-04-12T00:00:00", - "2017-04-13T00:00:00", - "2017-04-17T00:00:00", - "2017-04-18T00:00:00", - "2017-04-19T00:00:00", - "2017-04-20T00:00:00", - "2017-04-21T00:00:00", - "2017-04-24T00:00:00", - "2017-04-25T00:00:00", - "2017-04-26T00:00:00", - "2017-04-27T00:00:00", - "2017-04-28T00:00:00", - "2017-05-01T00:00:00", - "2017-05-02T00:00:00", - "2017-05-03T00:00:00", - "2017-05-04T00:00:00", - "2017-05-05T00:00:00", - "2017-05-08T00:00:00", - "2017-05-09T00:00:00", - "2017-05-10T00:00:00", - "2017-05-11T00:00:00", - "2017-05-12T00:00:00", - "2017-05-15T00:00:00", - "2017-05-16T00:00:00", - "2017-05-17T00:00:00", - "2017-05-18T00:00:00", - "2017-05-19T00:00:00", - "2017-05-22T00:00:00", - "2017-05-23T00:00:00", - "2017-05-24T00:00:00", - "2017-05-25T00:00:00", - "2017-05-26T00:00:00", - "2017-05-29T00:00:00", - "2017-05-30T00:00:00", - "2017-05-31T00:00:00", - "2017-06-01T00:00:00", - "2017-06-02T00:00:00", - "2017-06-05T00:00:00", - "2017-06-06T00:00:00", - "2017-06-07T00:00:00", - "2017-06-08T00:00:00", - "2017-06-09T00:00:00", - "2017-06-12T00:00:00", - "2017-06-13T00:00:00", - "2017-06-14T00:00:00", - "2017-06-15T00:00:00", - "2017-06-16T00:00:00", - "2017-06-19T00:00:00", - "2017-06-20T00:00:00", - "2017-06-21T00:00:00", - "2017-06-22T00:00:00", - "2017-06-23T00:00:00", - "2017-06-26T00:00:00", - "2017-06-27T00:00:00", - "2017-06-28T00:00:00", - "2017-06-29T00:00:00", - "2017-06-30T00:00:00", - "2017-07-03T00:00:00", - "2017-07-05T00:00:00", - "2017-07-06T00:00:00", - "2017-07-07T00:00:00", - "2017-07-10T00:00:00", - "2017-07-11T00:00:00", - "2017-07-12T00:00:00", - "2017-07-13T00:00:00", - "2017-07-14T00:00:00", - "2017-07-17T00:00:00", - "2017-07-18T00:00:00", - "2017-07-19T00:00:00", - "2017-07-20T00:00:00", - "2017-07-21T00:00:00", - "2017-07-24T00:00:00", - "2017-07-25T00:00:00", - "2017-07-26T00:00:00", - "2017-07-27T00:00:00", - "2017-07-28T00:00:00", - "2017-07-31T00:00:00", - "2017-08-01T00:00:00", - "2017-08-02T00:00:00", - "2017-08-03T00:00:00", - "2017-08-04T00:00:00", - "2017-08-07T00:00:00", - "2017-08-08T00:00:00", - "2017-08-09T00:00:00", - "2017-08-10T00:00:00", - "2017-08-11T00:00:00", - "2017-08-14T00:00:00", - "2017-08-15T00:00:00", - "2017-08-16T00:00:00", - "2017-08-17T00:00:00", - "2017-08-18T00:00:00", - "2017-08-21T00:00:00", - "2017-08-22T00:00:00", - "2017-08-23T00:00:00", - "2017-08-24T00:00:00", - "2017-08-25T00:00:00", - "2017-08-28T00:00:00", - "2017-08-29T00:00:00", - "2017-08-30T00:00:00", - "2017-08-31T00:00:00", - "2017-09-01T00:00:00", - "2017-09-05T00:00:00", - "2017-09-06T00:00:00", - "2017-09-07T00:00:00", - "2017-09-08T00:00:00", - "2017-09-11T00:00:00", - "2017-09-12T00:00:00", - "2017-09-13T00:00:00", - "2017-09-14T00:00:00", - "2017-09-15T00:00:00", - "2017-09-18T00:00:00", - "2017-09-19T00:00:00", - "2017-09-20T00:00:00", - "2017-09-21T00:00:00", - "2017-09-22T00:00:00", - "2017-09-25T00:00:00", - "2017-09-26T00:00:00", - "2017-09-27T00:00:00", - "2017-09-28T00:00:00", - "2017-09-29T00:00:00", - "2017-10-02T00:00:00", - "2017-10-03T00:00:00", - "2017-10-04T00:00:00", - "2017-10-05T00:00:00", - "2017-10-06T00:00:00", - "2017-10-09T00:00:00", - "2017-10-10T00:00:00", - "2017-10-11T00:00:00", - "2017-10-12T00:00:00", - "2017-10-13T00:00:00", - "2017-10-16T00:00:00", - "2017-10-17T00:00:00", - "2017-10-18T00:00:00", - "2017-10-19T00:00:00", - "2017-10-20T00:00:00", - "2017-10-23T00:00:00", - "2017-10-24T00:00:00", - "2017-10-25T00:00:00", - "2017-10-26T00:00:00", - "2017-10-27T00:00:00", - "2017-10-30T00:00:00", - "2017-10-31T00:00:00", - "2017-11-01T00:00:00", - "2017-11-02T00:00:00", - "2017-11-03T00:00:00", - "2017-11-06T00:00:00", - "2017-11-07T00:00:00", - "2017-11-08T00:00:00", - "2017-11-09T00:00:00", - "2017-11-10T00:00:00", - "2017-11-13T00:00:00", - "2017-11-14T00:00:00", - "2017-11-15T00:00:00", - "2017-11-16T00:00:00", - "2017-11-17T00:00:00", - "2017-11-20T00:00:00", - "2017-11-21T00:00:00", - "2017-11-22T00:00:00", - "2017-11-24T00:00:00", - "2017-11-27T00:00:00", - "2017-11-28T00:00:00", - "2017-11-29T00:00:00", - "2017-11-30T00:00:00", - "2017-12-01T00:00:00", - "2017-12-04T00:00:00", - "2017-12-05T00:00:00", - "2017-12-06T00:00:00", - "2017-12-07T00:00:00", - "2017-12-08T00:00:00", - "2017-12-11T00:00:00", - "2017-12-12T00:00:00", - "2017-12-13T00:00:00", - "2017-12-14T00:00:00", - "2017-12-15T00:00:00", - "2017-12-18T00:00:00", - "2017-12-19T00:00:00", - "2017-12-20T00:00:00", - "2017-12-21T00:00:00", - "2017-12-22T00:00:00", - "2017-12-26T00:00:00", - "2017-12-27T00:00:00", - "2017-12-28T00:00:00", - "2017-12-29T00:00:00", - "2018-01-01T00:00:00", - "2018-01-02T00:00:00", - "2018-01-04T00:00:00", - "2018-01-05T00:00:00", - "2018-01-08T00:00:00", - "2018-01-09T00:00:00", - "2018-01-10T00:00:00", - "2018-01-11T00:00:00", - "2018-01-12T00:00:00", - "2018-01-15T00:00:00", - "2018-01-16T00:00:00", - "2018-01-17T00:00:00", - "2018-01-18T00:00:00", - "2018-01-19T00:00:00", - "2018-01-22T00:00:00", - "2018-01-23T00:00:00", - "2018-01-24T00:00:00", - "2018-01-25T00:00:00", - "2018-01-26T00:00:00", - "2018-01-29T00:00:00", - "2018-01-30T00:00:00", - "2018-01-31T00:00:00", - "2018-02-01T00:00:00", - "2018-02-02T00:00:00", - "2018-02-05T00:00:00", - "2018-02-06T00:00:00", - "2018-02-07T00:00:00", - "2018-02-08T00:00:00", - "2018-02-09T00:00:00", - "2018-02-12T00:00:00", - "2018-02-13T00:00:00", - "2018-02-14T00:00:00", - "2018-02-15T00:00:00", - "2018-02-16T00:00:00", - "2018-02-20T00:00:00", - "2018-02-21T00:00:00", - "2018-02-22T00:00:00", - "2018-02-23T00:00:00", - "2018-02-26T00:00:00", - "2018-02-27T00:00:00", - "2018-02-28T00:00:00", - "2018-03-01T00:00:00", - "2018-03-02T00:00:00", - "2018-03-05T00:00:00", - "2018-03-06T00:00:00", - "2018-03-07T00:00:00", - "2018-03-08T00:00:00", - "2018-03-09T00:00:00", - "2018-03-12T00:00:00", - "2018-03-13T00:00:00", - "2018-03-14T00:00:00", - "2018-03-15T00:00:00", - "2018-03-16T00:00:00", - "2018-03-19T00:00:00", - "2018-03-20T00:00:00", - "2018-03-21T00:00:00", - "2018-03-22T00:00:00", - "2018-03-23T00:00:00", - "2018-03-26T00:00:00", - "2018-03-27T00:00:00", - "2018-03-28T00:00:00", - "2018-03-29T00:00:00", - "2018-04-02T00:00:00", - "2018-04-03T00:00:00", - "2018-04-04T00:00:00", - "2018-04-05T00:00:00", - "2018-04-06T00:00:00", - "2018-04-09T00:00:00", - "2018-04-10T00:00:00", - "2018-04-11T00:00:00", - "2018-04-12T00:00:00", - "2018-04-13T00:00:00", - "2018-04-16T00:00:00", - "2018-04-17T00:00:00", - "2018-04-18T00:00:00", - "2018-04-19T00:00:00", - "2018-04-20T00:00:00", - "2018-04-23T00:00:00", - "2018-04-24T00:00:00", - "2018-04-25T00:00:00", - "2018-04-26T00:00:00", - "2018-04-27T00:00:00", - "2018-04-30T00:00:00", - "2018-05-01T00:00:00", - "2018-05-02T00:00:00", - "2018-05-03T00:00:00", - "2018-05-04T00:00:00", - "2018-05-07T00:00:00", - "2018-05-08T00:00:00", - "2018-05-09T00:00:00", - "2018-05-10T00:00:00", - "2018-05-11T00:00:00", - "2018-05-14T00:00:00", - "2018-05-15T00:00:00", - "2018-05-16T00:00:00", - "2018-05-17T00:00:00", - "2018-05-18T00:00:00", - "2018-05-21T00:00:00", - "2018-05-22T00:00:00", - "2018-05-23T00:00:00", - "2018-05-24T00:00:00", - "2018-05-25T00:00:00", - "2018-05-28T00:00:00", - "2018-05-29T00:00:00", - "2018-05-30T00:00:00", - "2018-05-31T00:00:00", - "2018-06-01T00:00:00", - "2018-06-04T00:00:00", - "2018-06-05T00:00:00", - "2018-06-06T00:00:00", - "2018-06-07T00:00:00", - "2018-06-08T00:00:00", - "2018-06-11T00:00:00", - "2018-06-12T00:00:00", - "2018-06-13T00:00:00", - "2018-06-14T00:00:00", - "2018-06-15T00:00:00", - "2018-06-18T00:00:00", - "2018-06-19T00:00:00", - "2018-06-20T00:00:00", - "2018-06-21T00:00:00", - "2018-06-22T00:00:00", - "2018-06-25T00:00:00", - "2018-06-26T00:00:00", - "2018-06-27T00:00:00", - "2018-06-28T00:00:00", - "2018-06-29T00:00:00", - "2018-07-02T00:00:00", - "2018-07-03T00:00:00", - "2018-07-05T00:00:00", - "2018-07-06T00:00:00", - "2018-07-09T00:00:00", - "2018-07-10T00:00:00", - "2018-07-11T00:00:00", - "2018-07-12T00:00:00", - "2018-07-13T00:00:00", - "2018-07-16T00:00:00", - "2018-07-17T00:00:00", - "2018-07-18T00:00:00", - "2018-07-19T00:00:00", - "2018-07-20T00:00:00", - "2018-07-23T00:00:00", - "2018-07-24T00:00:00", - "2018-07-25T00:00:00", - "2018-07-26T00:00:00", - "2018-07-27T00:00:00", - "2018-07-30T00:00:00", - "2018-07-31T00:00:00", - "2018-08-01T00:00:00", - "2018-08-02T00:00:00", - "2018-08-03T00:00:00", - "2018-08-06T00:00:00", - "2018-08-07T00:00:00", - "2018-08-08T00:00:00", - "2018-08-09T00:00:00", - "2018-08-10T00:00:00", - "2018-08-13T00:00:00", - "2018-08-14T00:00:00", - "2018-08-15T00:00:00", - "2018-08-16T00:00:00", - "2018-08-17T00:00:00", - "2018-08-20T00:00:00", - "2018-08-21T00:00:00", - "2018-08-22T00:00:00", - "2018-08-23T00:00:00", - "2018-08-24T00:00:00", - "2018-08-27T00:00:00", - "2018-08-28T00:00:00", - "2018-08-29T00:00:00", - "2018-08-30T00:00:00", - "2018-08-31T00:00:00", - "2018-09-03T00:00:00", - "2018-09-04T00:00:00", - "2018-09-05T00:00:00", - "2018-09-06T00:00:00", - "2018-09-07T00:00:00", - "2018-09-10T00:00:00", - "2018-09-11T00:00:00", - "2018-09-12T00:00:00", - "2018-09-13T00:00:00", - "2018-09-14T00:00:00", - "2018-09-17T00:00:00", - "2018-09-18T00:00:00", - "2018-09-19T00:00:00", - "2018-09-20T00:00:00", - "2018-09-21T00:00:00", - "2018-09-24T00:00:00", - "2018-09-25T00:00:00", - "2018-09-26T00:00:00", - "2018-09-27T00:00:00", - "2018-09-28T00:00:00", - "2018-10-01T00:00:00", - "2018-10-02T00:00:00", - "2018-10-03T00:00:00", - "2018-10-04T00:00:00", - "2018-10-05T00:00:00", - "2018-10-08T00:00:00", - "2018-10-09T00:00:00", - "2018-10-10T00:00:00", - "2018-10-11T00:00:00", - "2018-10-12T00:00:00", - "2018-10-15T00:00:00", - "2018-10-16T00:00:00", - "2018-10-17T00:00:00", - "2018-10-18T00:00:00", - "2018-10-19T00:00:00", - "2018-10-22T00:00:00", - "2018-10-23T00:00:00", - "2018-10-24T00:00:00", - "2018-10-25T00:00:00", - "2018-10-26T00:00:00", - "2018-10-29T00:00:00", - "2018-10-30T00:00:00", - "2018-10-31T00:00:00", - "2018-11-01T00:00:00", - "2018-11-02T00:00:00", - "2018-11-05T00:00:00", - "2018-11-06T00:00:00", - "2018-11-07T00:00:00", - "2018-11-08T00:00:00", - "2018-11-09T00:00:00", - "2018-11-12T00:00:00", - "2018-11-13T00:00:00", - "2018-11-14T00:00:00", - "2018-11-15T00:00:00", - "2018-11-16T00:00:00", - "2018-11-19T00:00:00", - "2018-11-20T00:00:00", - "2018-11-21T00:00:00", - "2018-11-23T00:00:00", - "2018-11-26T00:00:00", - "2018-11-27T00:00:00", - "2018-11-28T00:00:00", - "2018-11-29T00:00:00", - "2018-11-30T00:00:00", - "2018-12-03T00:00:00", - "2018-12-04T00:00:00", - "2018-12-06T00:00:00", - "2018-12-07T00:00:00", - "2018-12-10T00:00:00", - "2018-12-11T00:00:00", - "2018-12-12T00:00:00", - "2018-12-13T00:00:00", - "2018-12-14T00:00:00", - "2018-12-17T00:00:00", - "2018-12-18T00:00:00", - "2018-12-19T00:00:00", - "2018-12-20T00:00:00", - "2018-12-21T00:00:00", - "2018-12-24T00:00:00", - "2018-12-26T00:00:00", - "2018-12-27T00:00:00", - "2018-12-28T00:00:00", - "2018-12-31T00:00:00", - "2019-01-01T00:00:00", - "2019-01-02T00:00:00", - "2019-01-04T00:00:00", - "2019-01-08T00:00:00", - "2019-01-09T00:00:00", - "2019-01-10T00:00:00", - "2019-01-11T00:00:00", - "2019-01-16T00:00:00", - "2019-01-18T00:00:00", - "2019-01-22T00:00:00", - "2019-01-23T00:00:00", - "2019-01-24T00:00:00", - "2019-01-28T00:00:00", - "2019-01-29T00:00:00", - "2019-01-30T00:00:00", - "2019-01-31T00:00:00", - "2019-02-01T00:00:00", - "2019-02-04T00:00:00", - "2019-02-05T00:00:00", - "2019-02-06T00:00:00", - "2019-02-07T00:00:00", - "2019-02-08T00:00:00", - "2019-02-11T00:00:00", - "2019-02-12T00:00:00", - "2019-02-13T00:00:00", - "2019-02-14T00:00:00", - "2019-02-15T00:00:00", - "2019-02-18T00:00:00", - "2019-02-19T00:00:00", - "2019-02-20T00:00:00", - "2019-02-21T00:00:00", - "2019-02-22T00:00:00", - "2019-02-25T00:00:00", - "2019-02-26T00:00:00", - "2019-02-27T00:00:00", - "2019-02-28T00:00:00", - "2019-03-01T00:00:00", - "2019-03-04T00:00:00", - "2019-03-05T00:00:00", - "2019-03-06T00:00:00", - "2019-03-07T00:00:00", - "2019-03-08T00:00:00", - "2019-03-11T00:00:00", - "2019-03-12T00:00:00", - "2019-03-13T00:00:00", - "2019-03-14T00:00:00", - "2019-03-15T00:00:00", - "2019-03-18T00:00:00", - "2019-03-19T00:00:00", - "2019-03-20T00:00:00", - "2019-03-21T00:00:00", - "2019-03-22T00:00:00", - "2019-03-25T00:00:00", - "2019-03-26T00:00:00", - "2019-03-27T00:00:00", - "2019-03-28T00:00:00", - "2019-03-29T00:00:00", - "2019-04-01T00:00:00", - "2019-04-02T00:00:00", - "2019-04-03T00:00:00", - "2019-04-04T00:00:00", - "2019-04-05T00:00:00", - "2019-04-08T00:00:00", - "2019-04-09T00:00:00", - "2019-04-10T00:00:00", - "2019-04-11T00:00:00", - "2019-04-12T00:00:00", - "2019-04-15T00:00:00", - "2019-04-16T00:00:00", - "2019-04-17T00:00:00", - "2019-04-18T00:00:00", - "2019-04-19T00:00:00", - "2019-04-22T00:00:00", - "2019-04-23T00:00:00", - "2019-04-24T00:00:00", - "2019-04-25T00:00:00", - "2019-04-26T00:00:00", - "2019-04-29T00:00:00", - "2019-04-30T00:00:00", - "2019-05-01T00:00:00", - "2019-05-02T00:00:00", - "2019-05-03T00:00:00", - "2019-05-06T00:00:00", - "2019-05-07T00:00:00", - "2019-05-08T00:00:00", - "2019-05-09T00:00:00", - "2019-05-10T00:00:00", - "2019-05-13T00:00:00", - "2019-05-14T00:00:00", - "2019-05-15T00:00:00", - "2019-05-16T00:00:00", - "2019-05-17T00:00:00", - "2019-05-20T00:00:00", - "2019-05-21T00:00:00", - "2019-05-22T00:00:00", - "2019-05-23T00:00:00", - "2019-05-24T00:00:00", - "2019-05-28T00:00:00", - "2019-05-29T00:00:00", - "2019-05-30T00:00:00", - "2019-05-31T00:00:00", - "2019-06-03T00:00:00", - "2019-06-04T00:00:00", - "2019-06-05T00:00:00", - "2019-06-06T00:00:00", - "2019-06-07T00:00:00", - "2019-06-10T00:00:00", - "2019-06-11T00:00:00", - "2019-06-12T00:00:00", - "2019-06-13T00:00:00", - "2019-06-14T00:00:00", - "2019-06-17T00:00:00", - "2019-06-18T00:00:00", - "2019-06-19T00:00:00", - "2019-06-20T00:00:00", - "2019-06-21T00:00:00", - "2019-06-24T00:00:00", - "2019-06-25T00:00:00", - "2019-06-26T00:00:00", - "2019-06-27T00:00:00", - "2019-06-28T00:00:00", - "2019-07-01T00:00:00", - "2019-07-02T00:00:00", - "2019-07-03T00:00:00", - "2019-07-04T00:00:00", - "2019-07-05T00:00:00", - "2019-07-08T00:00:00", - "2019-07-09T00:00:00", - "2019-07-10T00:00:00", - "2019-07-11T00:00:00", - "2019-07-12T00:00:00", - "2019-07-15T00:00:00", - "2019-07-16T00:00:00", - "2019-07-17T00:00:00", - "2019-07-18T00:00:00", - "2019-07-19T00:00:00", - "2019-07-22T00:00:00", - "2019-07-23T00:00:00", - "2019-07-24T00:00:00", - "2019-07-25T00:00:00", - "2019-07-26T00:00:00", - "2019-07-29T00:00:00", - "2019-07-30T00:00:00", - "2019-07-31T00:00:00", - "2019-08-01T00:00:00", - "2019-08-02T00:00:00", - "2019-08-05T00:00:00", - "2019-08-06T00:00:00", - "2019-08-07T00:00:00", - "2019-08-08T00:00:00", - "2019-08-09T00:00:00", - "2019-08-12T00:00:00", - "2019-08-13T00:00:00", - "2019-08-14T00:00:00", - "2019-08-15T00:00:00", - "2019-08-16T00:00:00", - "2019-08-19T00:00:00", - "2019-08-20T00:00:00", - "2019-08-21T00:00:00", - "2019-08-22T00:00:00", - "2019-08-23T00:00:00", - "2019-08-26T00:00:00", - "2019-08-27T00:00:00", - "2019-08-28T00:00:00", - "2019-08-29T00:00:00", - "2019-08-30T00:00:00", - "2019-09-03T00:00:00", - "2019-09-04T00:00:00", - "2019-09-05T00:00:00", - "2019-09-06T00:00:00", - "2019-09-09T00:00:00", - "2019-09-10T00:00:00", - "2019-09-11T00:00:00", - "2019-09-12T00:00:00", - "2019-09-13T00:00:00", - "2019-09-16T00:00:00", - "2019-09-17T00:00:00", - "2019-09-18T00:00:00", - "2019-09-19T00:00:00", - "2019-09-20T00:00:00", - "2019-09-23T00:00:00", - "2019-09-24T00:00:00", - "2019-09-25T00:00:00", - "2019-09-26T00:00:00", - "2019-09-27T00:00:00", - "2019-09-30T00:00:00", - "2019-10-01T00:00:00", - "2019-10-02T00:00:00", - "2019-10-03T00:00:00", - "2019-10-04T00:00:00", - "2019-10-07T00:00:00", - "2019-10-08T00:00:00", - "2019-10-09T00:00:00", - "2019-10-10T00:00:00", - "2019-10-11T00:00:00", - "2019-10-14T00:00:00", - "2019-10-15T00:00:00", - "2019-10-16T00:00:00", - "2019-10-17T00:00:00", - "2019-10-18T00:00:00", - "2019-10-21T00:00:00", - "2019-10-22T00:00:00", - "2019-10-23T00:00:00", - "2019-10-24T00:00:00", - "2019-10-25T00:00:00", - "2019-10-28T00:00:00", - "2019-10-29T00:00:00", - "2019-10-30T00:00:00", - "2019-10-31T00:00:00", - "2019-11-01T00:00:00", - "2019-11-04T00:00:00", - "2019-11-05T00:00:00", - "2019-11-06T00:00:00", - "2019-11-07T00:00:00", - "2019-11-08T00:00:00", - "2019-11-11T00:00:00", - "2019-11-12T00:00:00", - "2019-11-13T00:00:00", - "2019-11-14T00:00:00", - "2019-11-15T00:00:00", - "2019-11-18T00:00:00", - "2019-11-19T00:00:00", - "2019-11-20T00:00:00", - "2019-11-21T00:00:00", - "2019-11-22T00:00:00", - "2019-11-25T00:00:00", - "2019-11-26T00:00:00", - "2019-11-27T00:00:00", - "2019-11-28T00:00:00", - "2019-11-29T00:00:00", - "2019-12-02T00:00:00", - "2019-12-03T00:00:00", - "2019-12-04T00:00:00", - "2019-12-05T00:00:00", - "2019-12-06T00:00:00", - "2019-12-09T00:00:00", - "2019-12-10T00:00:00", - "2019-12-11T00:00:00", - "2019-12-12T00:00:00", - "2019-12-13T00:00:00", - "2019-12-16T00:00:00", - "2019-12-17T00:00:00", - "2019-12-18T00:00:00", - "2019-12-19T00:00:00", - "2019-12-20T00:00:00", - "2019-12-23T00:00:00", - "2019-12-24T00:00:00", - "2019-12-26T00:00:00", - "2019-12-27T00:00:00", - "2019-12-30T00:00:00", - "2019-12-31T00:00:00", - "2020-01-01T00:00:00", - "2020-01-02T00:00:00", - "2020-01-06T00:00:00", - "2020-01-07T00:00:00", - "2020-01-08T00:00:00", - "2020-01-09T00:00:00", - "2020-01-10T00:00:00", - "2020-01-13T00:00:00", - "2020-01-14T00:00:00", - "2020-01-15T00:00:00", - "2020-01-16T00:00:00", - "2020-01-17T00:00:00", - "2020-01-21T00:00:00", - "2020-01-22T00:00:00", - "2020-01-23T00:00:00", - "2020-01-24T00:00:00", - "2020-01-27T00:00:00", - "2020-01-28T00:00:00", - "2020-01-29T00:00:00", - "2020-01-30T00:00:00", - "2020-01-31T00:00:00", - "2020-02-03T00:00:00", - "2020-02-04T00:00:00", - "2020-02-05T00:00:00", - "2020-02-06T00:00:00", - "2020-02-07T00:00:00", - "2020-02-10T00:00:00", - "2020-02-11T00:00:00", - "2020-02-12T00:00:00", - "2020-02-13T00:00:00", - "2020-02-14T00:00:00", - "2020-02-18T00:00:00", - "2020-02-19T00:00:00", - "2020-02-20T00:00:00", - "2020-02-21T00:00:00", - "2020-02-24T00:00:00", - "2020-02-25T00:00:00", - "2020-02-26T00:00:00", - "2020-02-27T00:00:00", - "2020-02-28T00:00:00", - "2020-03-02T00:00:00", - "2020-03-03T00:00:00", - "2020-03-04T00:00:00", - "2020-03-05T00:00:00", - "2020-03-06T00:00:00", - "2020-03-09T00:00:00", - "2020-03-10T00:00:00", - "2020-03-11T00:00:00", - "2020-03-12T00:00:00", - "2020-03-13T00:00:00", - "2020-03-16T00:00:00", - "2020-03-17T00:00:00", - "2020-03-18T00:00:00", - "2020-03-19T00:00:00", - "2020-03-20T00:00:00", - "2020-03-23T00:00:00", - "2020-03-24T00:00:00", - "2020-03-25T00:00:00", - "2020-03-26T00:00:00", - "2020-03-27T00:00:00", - "2020-03-30T00:00:00", - "2020-03-31T00:00:00", - "2020-04-01T00:00:00", - "2020-04-02T00:00:00", - "2020-04-03T00:00:00", - "2020-04-06T00:00:00", - "2020-04-07T00:00:00", - "2020-04-08T00:00:00", - "2020-04-09T00:00:00", - "2020-04-13T00:00:00", - "2020-04-14T00:00:00", - "2020-04-15T00:00:00", - "2020-04-16T00:00:00", - "2020-04-17T00:00:00", - "2020-04-20T00:00:00", - "2020-04-21T00:00:00", - "2020-04-22T00:00:00", - "2020-04-23T00:00:00", - "2020-04-24T00:00:00", - "2020-04-27T00:00:00", - "2020-04-28T00:00:00", - "2020-04-29T00:00:00", - "2020-04-30T00:00:00", - "2020-05-01T00:00:00", - "2020-05-04T00:00:00", - "2020-05-05T00:00:00", - "2020-05-06T00:00:00", - "2020-05-07T00:00:00", - "2020-05-08T00:00:00", - "2020-05-11T00:00:00", - "2020-05-12T00:00:00", - "2020-05-13T00:00:00", - "2020-05-14T00:00:00", - "2020-05-15T00:00:00", - "2020-05-18T00:00:00", - "2020-05-19T00:00:00", - "2020-05-20T00:00:00", - "2020-05-21T00:00:00", - "2020-05-22T00:00:00", - "2020-05-26T00:00:00", - "2020-05-27T00:00:00", - "2020-05-28T00:00:00", - "2020-05-29T00:00:00", - "2020-06-01T00:00:00", - "2020-06-02T00:00:00", - "2020-06-03T00:00:00", - "2020-06-04T00:00:00", - "2020-06-05T00:00:00", - "2020-06-08T00:00:00", - "2020-06-09T00:00:00", - "2020-06-10T00:00:00", - "2020-06-11T00:00:00", - "2020-06-12T00:00:00", - "2020-06-15T00:00:00", - "2020-06-16T00:00:00", - "2020-06-17T00:00:00", - "2020-06-18T00:00:00", - "2020-06-19T00:00:00", - "2020-06-22T00:00:00", - "2020-06-23T00:00:00", - "2020-06-24T00:00:00", - "2020-06-25T00:00:00", - "2020-06-26T00:00:00", - "2020-06-29T00:00:00", - "2020-06-30T00:00:00", - "2020-07-01T00:00:00", - "2020-07-02T00:00:00", - "2020-07-06T00:00:00", - "2020-07-07T00:00:00", - "2020-07-08T00:00:00", - "2020-07-09T00:00:00", - "2020-07-10T00:00:00", - "2020-07-13T00:00:00", - "2020-07-14T00:00:00", - "2020-07-15T00:00:00", - "2020-07-16T00:00:00", - "2020-07-17T00:00:00", - "2020-07-20T00:00:00", - "2020-07-21T00:00:00", - "2020-07-22T00:00:00", - "2020-07-23T00:00:00", - "2020-07-24T00:00:00", - "2020-07-27T00:00:00", - "2020-07-28T00:00:00", - "2020-07-29T00:00:00", - "2020-07-30T00:00:00", - "2020-07-31T00:00:00", - "2020-08-03T00:00:00", - "2020-08-04T00:00:00", - "2020-08-05T00:00:00", - "2020-08-06T00:00:00", - "2020-08-07T00:00:00", - "2020-08-10T00:00:00", - "2020-08-11T00:00:00", - "2020-08-12T00:00:00", - "2020-08-13T00:00:00", - "2020-08-14T00:00:00", - "2020-08-17T00:00:00", - "2020-08-18T00:00:00", - "2020-08-19T00:00:00", - "2020-08-20T00:00:00", - "2020-08-21T00:00:00", - "2020-08-24T00:00:00", - "2020-08-25T00:00:00", - "2020-08-26T00:00:00", - "2020-08-27T00:00:00", - "2020-08-28T00:00:00", - "2020-08-31T00:00:00", - "2020-09-01T00:00:00", - "2020-09-02T00:00:00", - "2020-09-03T00:00:00", - "2020-09-04T00:00:00", - "2020-09-08T00:00:00", - "2020-09-09T00:00:00", - "2020-09-10T00:00:00", - "2020-09-11T00:00:00", - "2020-09-14T00:00:00", - "2020-09-15T00:00:00", - "2020-09-16T00:00:00", - "2020-09-17T00:00:00", - "2020-09-18T00:00:00", - "2020-09-21T00:00:00", - "2020-09-22T00:00:00", - "2020-09-23T00:00:00", - "2020-09-24T00:00:00", - "2020-09-25T00:00:00", - "2020-09-28T00:00:00", - "2020-09-29T00:00:00", - "2020-09-30T00:00:00", - "2020-10-01T00:00:00", - "2020-10-02T00:00:00", - "2020-10-05T00:00:00", - "2020-10-06T00:00:00", - "2020-10-07T00:00:00", - "2020-10-08T00:00:00", - "2020-10-09T00:00:00", - "2020-10-12T00:00:00", - "2020-10-13T00:00:00", - "2020-10-14T00:00:00", - "2020-10-15T00:00:00", - "2020-10-16T00:00:00", - "2020-10-19T00:00:00", - "2020-10-20T00:00:00", - "2020-10-21T00:00:00", - "2020-10-22T00:00:00", - "2020-10-23T00:00:00", - "2020-10-26T00:00:00", - "2020-10-27T00:00:00", - "2020-10-28T00:00:00", - "2020-10-29T00:00:00", - "2020-10-30T00:00:00", - "2020-11-02T00:00:00", - "2020-11-03T00:00:00", - "2020-11-04T00:00:00", - "2020-11-05T00:00:00", - "2020-11-06T00:00:00", - "2020-11-09T00:00:00", - "2020-11-10T00:00:00", - "2020-11-11T00:00:00", - "2020-11-12T00:00:00", - "2020-11-13T00:00:00", - "2020-11-16T00:00:00", - "2020-11-17T00:00:00", - "2020-11-18T00:00:00", - "2020-11-19T00:00:00", - "2020-11-20T00:00:00", - "2020-11-23T00:00:00", - "2020-11-24T00:00:00", - "2020-11-25T00:00:00", - "2020-11-27T00:00:00", - "2020-11-30T00:00:00", - "2020-12-01T00:00:00", - "2020-12-02T00:00:00", - "2020-12-03T00:00:00", - "2020-12-04T00:00:00", - "2020-12-07T00:00:00", - "2020-12-08T00:00:00", - "2020-12-09T00:00:00", - "2020-12-10T00:00:00", - "2020-12-11T00:00:00", - "2020-12-14T00:00:00", - "2020-12-15T00:00:00", - "2020-12-16T00:00:00", - "2020-12-17T00:00:00", - "2020-12-18T00:00:00", - "2020-12-21T00:00:00", - "2020-12-22T00:00:00", - "2020-12-23T00:00:00", - "2020-12-24T00:00:00", - "2020-12-28T00:00:00", - "2020-12-29T00:00:00", - "2020-12-30T00:00:00", - "2020-12-31T00:00:00", - "2021-01-01T00:00:00", - "2021-01-04T00:00:00", - "2021-01-06T00:00:00", - "2021-01-07T00:00:00", - "2021-01-08T00:00:00", - "2021-01-11T00:00:00", - "2021-01-12T00:00:00", - "2021-01-13T00:00:00", - "2021-01-14T00:00:00", - "2021-01-15T00:00:00", - "2021-01-19T00:00:00", - "2021-01-20T00:00:00", - "2021-01-21T00:00:00", - "2021-01-22T00:00:00", - "2021-01-25T00:00:00", - "2021-01-26T00:00:00", - "2021-01-27T00:00:00", - "2021-01-28T00:00:00", - "2021-01-29T00:00:00", - "2021-02-01T00:00:00", - "2021-02-02T00:00:00", - "2021-02-03T00:00:00", - "2021-02-04T00:00:00", - "2021-02-05T00:00:00", - "2021-02-08T00:00:00", - "2021-02-09T00:00:00", - "2021-02-10T00:00:00", - "2021-02-11T00:00:00", - "2021-02-12T00:00:00", - "2021-02-16T00:00:00", - "2021-02-17T00:00:00", - "2021-02-18T00:00:00", - "2021-02-19T00:00:00", - "2021-02-22T00:00:00", - "2021-02-23T00:00:00", - "2021-02-24T00:00:00", - "2021-02-25T00:00:00", - "2021-02-26T00:00:00", - "2021-03-01T00:00:00", - "2021-03-02T00:00:00", - "2021-03-03T00:00:00", - "2021-03-04T00:00:00", - "2021-03-05T00:00:00", - "2021-03-08T00:00:00", - "2021-03-09T00:00:00", - "2021-03-10T00:00:00", - "2021-03-11T00:00:00", - "2021-03-12T00:00:00", - "2021-03-15T00:00:00", - "2021-03-16T00:00:00", - "2021-03-17T00:00:00", - "2021-03-18T00:00:00", - "2021-03-19T00:00:00", - "2021-03-22T00:00:00", - "2021-03-23T00:00:00", - "2021-03-24T00:00:00", - "2021-03-25T00:00:00", - "2021-03-26T00:00:00", - "2021-03-29T00:00:00", - "2021-03-30T00:00:00", - "2021-03-31T00:00:00", - "2021-04-01T00:00:00", - "2021-04-05T00:00:00", - "2021-04-06T00:00:00", - "2021-04-07T00:00:00", - "2021-04-08T00:00:00", - "2021-04-09T00:00:00", - "2021-04-12T00:00:00", - "2021-04-13T00:00:00", - "2021-04-14T00:00:00", - "2021-04-15T00:00:00", - "2021-04-16T00:00:00", - "2021-04-19T00:00:00", - "2021-04-20T00:00:00", - "2021-04-21T00:00:00", - "2021-04-22T00:00:00", - "2021-04-23T00:00:00", - "2021-04-26T00:00:00", - "2021-04-27T00:00:00", - "2021-04-28T00:00:00", - "2021-04-29T00:00:00", - "2021-04-30T00:00:00", - "2021-05-03T00:00:00", - "2021-05-04T00:00:00", - "2021-05-05T00:00:00", - "2021-05-06T00:00:00", - "2021-05-07T00:00:00", - "2021-05-10T00:00:00", - "2021-05-11T00:00:00", - "2021-05-12T00:00:00", - "2021-05-13T00:00:00", - "2021-05-14T00:00:00", - "2021-05-17T00:00:00", - "2021-05-18T00:00:00", - "2021-05-19T00:00:00", - "2021-05-20T00:00:00", - "2021-05-21T00:00:00", - "2021-05-24T00:00:00", - "2021-05-25T00:00:00", - "2021-05-26T00:00:00", - "2021-05-27T00:00:00", - "2021-05-28T00:00:00", - "2021-06-01T00:00:00", - "2021-06-02T00:00:00", - "2021-06-03T00:00:00", - "2021-06-04T00:00:00", - "2021-06-07T00:00:00", - "2021-06-08T00:00:00", - "2021-06-09T00:00:00", - "2021-06-10T00:00:00", - "2021-06-11T00:00:00", - "2021-06-14T00:00:00", - "2021-06-15T00:00:00", - "2021-06-16T00:00:00", - "2021-06-17T00:00:00", - "2021-06-18T00:00:00", - "2021-06-21T00:00:00", - "2021-06-22T00:00:00", - "2021-06-23T00:00:00", - "2021-06-24T00:00:00", - "2021-06-25T00:00:00", - "2021-06-28T00:00:00", - "2021-06-29T00:00:00", - "2021-06-30T00:00:00", - "2021-07-01T00:00:00", - "2021-07-02T00:00:00", - "2021-07-05T00:00:00", - "2021-07-06T00:00:00", - "2021-07-07T00:00:00", - "2021-07-08T00:00:00", - "2021-07-09T00:00:00", - "2021-07-12T00:00:00", - "2021-07-13T00:00:00", - "2021-07-14T00:00:00", - "2021-07-15T00:00:00", - "2021-07-16T00:00:00", - "2021-07-19T00:00:00", - "2021-07-20T00:00:00", - "2021-07-21T00:00:00", - "2021-07-22T00:00:00", - "2021-07-23T00:00:00", - "2021-07-26T00:00:00", - "2021-07-27T00:00:00", - "2021-07-28T00:00:00", - "2021-07-29T00:00:00", - "2021-07-30T00:00:00", - "2021-08-02T00:00:00", - "2021-08-03T00:00:00", - "2021-08-04T00:00:00", - "2021-08-05T00:00:00", - "2021-08-06T00:00:00", - "2021-08-09T00:00:00", - "2021-08-10T00:00:00", - "2021-08-11T00:00:00", - "2021-08-12T00:00:00", - "2021-08-13T00:00:00", - "2021-08-16T00:00:00", - "2021-08-17T00:00:00", - "2021-08-18T00:00:00", - "2021-08-19T00:00:00", - "2021-08-20T00:00:00", - "2021-08-23T00:00:00", - "2021-08-24T00:00:00", - "2021-08-25T00:00:00", - "2021-08-26T00:00:00", - "2021-08-27T00:00:00", - "2021-08-30T00:00:00", - "2021-08-31T00:00:00", - "2021-09-01T00:00:00", - "2021-09-02T00:00:00", - "2021-09-03T00:00:00", - "2021-09-07T00:00:00", - "2021-09-08T00:00:00", - "2021-09-09T00:00:00", - "2021-09-10T00:00:00", - "2021-09-13T00:00:00", - "2021-09-14T00:00:00", - "2021-09-15T00:00:00", - "2021-09-16T00:00:00", - "2021-09-17T00:00:00", - "2021-09-20T00:00:00", - "2021-09-21T00:00:00", - "2021-09-22T00:00:00", - "2021-09-23T00:00:00", - "2021-09-24T00:00:00", - "2021-09-27T00:00:00", - "2021-09-28T00:00:00", - "2021-09-29T00:00:00", - "2021-09-30T00:00:00", - "2021-10-01T00:00:00", - "2021-10-04T00:00:00", - "2021-10-05T00:00:00", - "2021-10-06T00:00:00", - "2021-10-07T00:00:00", - "2021-10-08T00:00:00", - "2021-10-11T00:00:00", - "2021-10-12T00:00:00", - "2021-10-13T00:00:00", - "2021-10-14T00:00:00", - "2021-10-15T00:00:00", - "2021-10-18T00:00:00", - "2021-10-19T00:00:00", - "2021-10-20T00:00:00", - "2021-10-21T00:00:00", - "2021-10-22T00:00:00", - "2021-10-25T00:00:00", - "2021-10-26T00:00:00", - "2021-10-27T00:00:00", - "2021-10-28T00:00:00", - "2021-10-29T00:00:00", - "2021-11-01T00:00:00", - "2021-11-02T00:00:00", - "2021-11-03T00:00:00", - "2021-11-04T00:00:00", - "2021-11-05T00:00:00", - "2021-11-08T00:00:00", - "2021-11-09T00:00:00", - "2021-11-10T00:00:00", - "2021-11-11T00:00:00", - "2021-11-12T00:00:00", - "2021-11-15T00:00:00", - "2021-11-16T00:00:00", - "2021-11-17T00:00:00", - "2021-11-18T00:00:00", - "2021-11-19T00:00:00", - "2021-11-22T00:00:00", - "2021-11-23T00:00:00", - "2021-11-24T00:00:00", - "2021-11-25T00:00:00", - "2021-11-26T00:00:00", - "2021-11-29T00:00:00", - "2021-11-30T00:00:00", - "2021-12-01T00:00:00", - "2021-12-02T00:00:00", - "2021-12-03T00:00:00", - "2021-12-06T00:00:00", - "2021-12-07T00:00:00", - "2021-12-08T00:00:00", - "2021-12-09T00:00:00", - "2021-12-10T00:00:00", - "2021-12-13T00:00:00", - "2021-12-14T00:00:00", - "2021-12-15T00:00:00", - "2021-12-16T00:00:00", - "2021-12-17T00:00:00", - "2021-12-20T00:00:00", - "2021-12-21T00:00:00", - "2021-12-22T00:00:00", - "2021-12-23T00:00:00", - "2021-12-27T00:00:00", - "2021-12-28T00:00:00", - "2021-12-29T00:00:00", - "2021-12-30T00:00:00", - "2021-12-31T00:00:00", - "2022-01-03T00:00:00", - "2022-01-05T00:00:00", - "2022-01-06T00:00:00", - "2022-01-07T00:00:00", - "2022-01-10T00:00:00", - "2022-01-11T00:00:00", - "2022-01-12T00:00:00", - "2022-01-13T00:00:00", - "2022-01-14T00:00:00", - "2022-01-18T00:00:00", - "2022-01-19T00:00:00", - "2022-01-20T00:00:00", - "2022-01-21T00:00:00", - "2022-01-24T00:00:00", - "2022-01-25T00:00:00", - "2022-01-26T00:00:00", - "2022-01-27T00:00:00", - "2022-01-28T00:00:00", - "2022-01-31T00:00:00", - "2022-02-01T00:00:00", - "2022-02-02T00:00:00", - "2022-02-03T00:00:00", - "2022-02-04T00:00:00", - "2022-02-07T00:00:00", - "2022-02-08T00:00:00", - "2022-02-09T00:00:00", - "2022-02-10T00:00:00", - "2022-02-11T00:00:00", - "2022-02-14T00:00:00", - "2022-02-15T00:00:00", - "2022-02-16T00:00:00", - "2022-02-17T00:00:00", - "2022-02-18T00:00:00", - "2022-02-22T00:00:00", - "2022-02-23T00:00:00", - "2022-02-24T00:00:00", - "2022-02-25T00:00:00", - "2022-02-28T00:00:00", - "2022-03-01T00:00:00", - "2022-03-02T00:00:00", - "2022-03-03T00:00:00", - "2022-03-04T00:00:00", - "2022-03-07T00:00:00", - "2022-03-08T00:00:00", - "2022-03-09T00:00:00", - "2022-03-10T00:00:00", - "2022-03-11T00:00:00", - "2022-03-14T00:00:00", - "2022-03-15T00:00:00", - "2022-03-16T00:00:00", - "2022-03-17T00:00:00", - "2022-03-18T00:00:00", - "2022-03-21T00:00:00", - "2022-03-22T00:00:00", - "2022-03-23T00:00:00", - "2022-03-24T00:00:00", - "2022-03-25T00:00:00", - "2022-03-28T00:00:00", - "2022-03-29T00:00:00", - "2022-03-30T00:00:00", - "2022-03-31T00:00:00", - "2022-04-01T00:00:00", - "2022-04-04T00:00:00", - "2022-04-05T00:00:00", - "2022-04-06T00:00:00", - "2022-04-07T00:00:00", - "2022-04-08T00:00:00", - "2022-04-11T00:00:00", - "2022-04-12T00:00:00", - "2022-04-13T00:00:00", - "2022-04-14T00:00:00", - "2022-04-18T00:00:00", - "2022-04-19T00:00:00", - "2022-04-20T00:00:00", - "2022-04-21T00:00:00", - "2022-04-22T00:00:00", - "2022-04-25T00:00:00", - "2022-04-26T00:00:00", - "2022-04-27T00:00:00", - "2022-04-28T00:00:00", - "2022-04-29T00:00:00", - "2022-05-03T00:00:00", - "2022-05-04T00:00:00", - "2022-05-05T00:00:00", - "2022-05-06T00:00:00", - "2022-05-09T00:00:00", - "2022-05-10T00:00:00", - "2022-08-01T00:00:00", - "2022-08-02T00:00:00", - "2022-08-03T00:00:00", - "2022-08-04T00:00:00", - "2022-08-05T00:00:00", - "2022-08-08T00:00:00", - "2022-08-09T00:00:00", - "2022-08-10T00:00:00", - "2022-08-11T00:00:00", - "2022-08-12T00:00:00", - "2022-08-15T00:00:00", - "2022-08-16T00:00:00", - "2022-08-17T00:00:00", - "2022-08-18T00:00:00", - "2022-08-19T00:00:00", - "2022-08-22T00:00:00", - "2022-08-23T00:00:00", - "2022-08-24T00:00:00", - "2022-08-25T00:00:00", - "2022-08-26T00:00:00", - "2022-08-29T00:00:00", - "2022-08-30T00:00:00", - "2022-08-31T00:00:00", - "2022-09-01T00:00:00", - "2022-09-02T00:00:00", - "2022-09-06T00:00:00", - "2022-09-07T00:00:00", - "2022-09-14T00:00:00", - "2022-09-15T00:00:00", - "2022-10-27T00:00:00", - "2022-10-28T00:00:00", - "2022-10-31T00:00:00", - "2022-11-01T00:00:00", - "2022-11-02T00:00:00", - "2022-11-03T00:00:00", - "2022-11-04T00:00:00", - "2022-11-14T00:00:00", - "2022-11-15T00:00:00", - "2022-11-16T00:00:00", - "2022-11-17T00:00:00", - "2022-11-18T00:00:00", - "2022-11-21T00:00:00", - "2022-11-22T00:00:00", - "2022-11-23T00:00:00", - "2022-11-25T00:00:00", - "2022-11-28T00:00:00", - "2022-11-29T00:00:00", - "2022-11-30T00:00:00", - "2022-12-01T00:00:00", - "2022-12-02T00:00:00", - "2022-12-05T00:00:00", - "2022-12-06T00:00:00", - "2022-12-07T00:00:00", - "2022-12-08T00:00:00", - "2022-12-09T00:00:00", - "2022-12-12T00:00:00", - "2022-12-13T00:00:00", - "2022-12-14T00:00:00", - "2022-12-15T00:00:00", - "2022-12-16T00:00:00", - "2022-12-19T00:00:00", - "2022-12-20T00:00:00", - "2022-12-21T00:00:00", - "2022-12-22T00:00:00", - "2022-12-23T00:00:00", - "2022-12-27T00:00:00", - "2022-12-28T00:00:00", - "2022-12-29T00:00:00", - "2022-12-30T00:00:00", - "2023-01-02T00:00:00", - "2023-01-03T00:00:00", - "2023-01-05T00:00:00", - "2023-01-06T00:00:00", - "2023-01-09T00:00:00", - "2023-01-10T00:00:00", - "2023-01-11T00:00:00", - "2023-01-12T00:00:00", - "2023-01-13T00:00:00", - "2023-01-17T00:00:00", - "2023-01-18T00:00:00", - "2023-01-19T00:00:00", - "2023-01-20T00:00:00", - "2023-01-23T00:00:00", - "2023-01-24T00:00:00", - "2023-01-25T00:00:00", - "2023-01-26T00:00:00", - "2023-01-27T00:00:00", - "2023-01-30T00:00:00", - "2023-01-31T00:00:00", - "2023-02-01T00:00:00", - "2023-02-02T00:00:00", - "2023-02-03T00:00:00", - "2023-02-06T00:00:00", - "2023-02-07T00:00:00", - "2023-02-08T00:00:00", - "2023-02-09T00:00:00", - "2023-02-10T00:00:00", - "2023-02-13T00:00:00", - "2023-02-14T00:00:00", - "2023-02-15T00:00:00", - "2023-02-16T00:00:00", - "2023-02-17T00:00:00", - "2023-02-21T00:00:00", - "2023-02-22T00:00:00", - "2023-02-23T00:00:00", - "2023-02-24T00:00:00", - "2023-02-27T00:00:00", - "2023-02-28T00:00:00", - "2023-03-01T00:00:00", - "2023-03-02T00:00:00", - "2023-03-03T00:00:00", - "2023-03-06T00:00:00", - "2023-03-07T00:00:00", - "2023-03-08T00:00:00", - "2023-03-09T00:00:00", - "2023-03-10T00:00:00", - "2023-03-13T00:00:00", - "2023-03-14T00:00:00", - "2023-03-15T00:00:00", - "2023-03-16T00:00:00", - "2023-03-17T00:00:00", - "2023-03-20T00:00:00", - "2023-03-21T00:00:00", - "2023-03-22T00:00:00", - "2023-03-23T00:00:00", - "2023-03-24T00:00:00", - "2023-03-27T00:00:00", - "2023-03-28T00:00:00", - "2023-03-29T00:00:00", - "2023-03-30T00:00:00", - "2023-03-31T00:00:00", - "2023-04-03T00:00:00", - "2023-04-04T00:00:00", - "2023-04-05T00:00:00", - "2023-04-06T00:00:00", - "2023-04-07T00:00:00", - "2023-04-10T00:00:00", - "2023-04-11T00:00:00", - "2023-04-12T00:00:00", - "2023-04-13T00:00:00", - "2023-04-14T00:00:00", - "2023-04-17T00:00:00", - "2023-04-18T00:00:00", - "2023-04-19T00:00:00", - "2023-04-20T00:00:00", - "2023-04-21T00:00:00", - "2023-04-24T00:00:00", - "2023-04-25T00:00:00", - "2023-04-26T00:00:00", - "2023-04-27T00:00:00", - "2023-04-28T00:00:00", - "2023-05-01T00:00:00", - "2023-05-02T00:00:00", - "2023-05-03T00:00:00", - "2023-05-04T00:00:00", - "2023-05-05T00:00:00", - "2023-05-08T00:00:00", - "2023-05-09T00:00:00", - "2023-05-10T00:00:00", - "2023-05-11T00:00:00", - "2023-05-12T00:00:00", - "2023-05-15T00:00:00", - "2023-05-16T00:00:00", - "2023-05-17T00:00:00", - "2023-05-18T00:00:00", - "2023-05-19T00:00:00", - "2023-05-22T00:00:00", - "2023-05-23T00:00:00", - "2023-05-24T00:00:00", - "2023-05-25T00:00:00", - "2023-05-26T00:00:00", - "2023-05-30T00:00:00", - "2023-05-31T00:00:00", - "2023-06-01T00:00:00", - "2023-06-02T00:00:00", - "2023-06-05T00:00:00", - "2023-06-06T00:00:00", - "2023-06-07T00:00:00", - "2023-06-08T00:00:00", - "2023-06-09T00:00:00", - "2023-06-12T00:00:00", - "2023-06-13T00:00:00", - "2023-06-14T00:00:00", - "2023-06-15T00:00:00", - "2023-06-16T00:00:00", - "2023-06-19T00:00:00", - "2023-06-20T00:00:00", - "2023-06-21T00:00:00", - "2023-06-22T00:00:00", - "2023-06-23T00:00:00", - "2023-06-26T00:00:00", - "2023-06-27T00:00:00", - "2023-06-28T00:00:00", - "2023-06-29T00:00:00", - "2023-06-30T00:00:00", - "2023-07-03T00:00:00", - "2023-07-05T00:00:00", - "2023-07-06T00:00:00", - "2023-07-07T00:00:00", - "2023-07-10T00:00:00", - "2023-07-11T00:00:00", - "2023-07-12T00:00:00", - "2023-07-13T00:00:00", - "2023-07-14T00:00:00", - "2023-07-17T00:00:00", - "2023-07-18T00:00:00", - "2023-07-19T00:00:00", - "2023-07-20T00:00:00", - "2023-07-21T00:00:00", - "2023-07-24T00:00:00", - "2023-07-25T00:00:00", - "2023-07-26T00:00:00", - "2023-07-27T00:00:00", - "2023-07-28T00:00:00", - "2023-07-31T00:00:00", - "2023-08-01T00:00:00", - "2023-08-02T00:00:00", - "2023-08-03T00:00:00", - "2023-08-04T00:00:00", - "2023-08-07T00:00:00", - "2023-08-08T00:00:00", - "2023-08-09T00:00:00", - "2023-08-10T00:00:00", - "2023-08-11T00:00:00", - "2023-08-14T00:00:00", - "2023-08-15T00:00:00", - "2023-08-16T00:00:00", - "2023-08-17T00:00:00", - "2023-08-18T00:00:00", - "2023-08-21T00:00:00", - "2023-08-22T00:00:00", - "2023-08-23T00:00:00", - "2023-08-24T00:00:00", - "2023-08-25T00:00:00", - "2023-08-28T00:00:00", - "2023-08-29T00:00:00", - "2023-08-30T00:00:00", - "2023-08-31T00:00:00", - "2023-09-01T00:00:00", - "2023-09-05T00:00:00", - "2023-09-06T00:00:00", - "2023-09-07T00:00:00", - "2023-09-08T00:00:00", - "2023-09-11T00:00:00", - "2023-09-12T00:00:00", - "2023-09-13T00:00:00", - "2023-09-14T00:00:00", - "2023-09-15T00:00:00", - "2023-09-18T00:00:00", - "2023-09-19T00:00:00", - "2023-09-20T00:00:00", - "2023-09-21T00:00:00", - "2023-09-22T00:00:00", - "2023-09-25T00:00:00", - "2023-09-26T00:00:00", - "2023-09-27T00:00:00", - "2023-09-28T00:00:00", - "2023-09-29T00:00:00", - "2023-10-02T00:00:00", - "2023-10-03T00:00:00", - "2023-10-04T00:00:00", - "2023-10-05T00:00:00", - "2023-10-06T00:00:00", - "2023-10-09T00:00:00", - "2023-10-10T00:00:00", - "2023-10-11T00:00:00", - "2023-10-12T00:00:00", - "2023-10-13T00:00:00", - "2023-10-16T00:00:00", - "2023-10-17T00:00:00", - "2023-10-18T00:00:00", - "2023-10-19T00:00:00", - "2023-10-20T00:00:00", - "2023-10-23T00:00:00", - "2023-10-24T00:00:00", - "2023-10-25T00:00:00", - "2023-10-26T00:00:00", - "2023-10-27T00:00:00", - "2023-10-30T00:00:00", - "2023-10-31T00:00:00", - "2023-11-01T00:00:00", - "2023-11-02T00:00:00", - "2023-11-03T00:00:00", - "2023-11-06T00:00:00", - "2023-11-07T00:00:00", - "2023-11-08T00:00:00", - "2023-11-09T00:00:00", - "2023-11-10T00:00:00", - "2023-11-13T00:00:00", - "2023-11-14T00:00:00", - "2023-11-15T00:00:00", - "2023-11-16T00:00:00", - "2023-11-17T00:00:00", - "2023-11-20T00:00:00", - "2023-11-21T00:00:00", - "2023-11-22T00:00:00", - "2023-11-23T00:00:00", - "2023-11-24T00:00:00", - "2023-11-27T00:00:00", - "2023-11-28T00:00:00", - "2023-11-29T00:00:00", - "2023-11-30T00:00:00", - "2023-12-01T00:00:00", - "2023-12-04T00:00:00", - "2023-12-05T00:00:00", - "2023-12-06T00:00:00", - "2023-12-07T00:00:00", - "2023-12-08T00:00:00", - "2023-12-11T00:00:00", - "2023-12-12T00:00:00", - "2023-12-13T00:00:00", - "2023-12-14T00:00:00", - "2023-12-15T00:00:00", - "2023-12-18T00:00:00", - "2023-12-19T00:00:00", - "2023-12-20T00:00:00", - "2023-12-21T00:00:00", - "2023-12-22T00:00:00", - "2023-12-25T00:00:00", - "2023-12-26T00:00:00", - "2023-12-27T00:00:00", - "2023-12-28T00:00:00", - "2023-12-29T00:00:00", - "2024-01-01T00:00:00", - "2024-01-02T00:00:00", - "2024-01-04T00:00:00", - "2024-01-05T00:00:00", - "2024-01-08T00:00:00", - "2024-01-09T00:00:00", - "2024-01-10T00:00:00", - "2024-01-11T00:00:00", - "2024-01-12T00:00:00", - "2024-01-15T00:00:00", - "2024-01-16T00:00:00", - "2024-01-17T00:00:00", - "2024-01-18T00:00:00", - "2024-01-19T00:00:00", - "2024-01-22T00:00:00", - "2024-01-23T00:00:00", - "2024-01-24T00:00:00", - "2024-01-25T00:00:00", - "2024-01-26T00:00:00", - "2024-01-29T00:00:00", - "2024-01-30T00:00:00", - "2024-01-31T00:00:00", - "2024-02-01T00:00:00", - "2024-02-02T00:00:00", - "2024-02-05T00:00:00", - "2024-02-06T00:00:00", - "2024-02-07T00:00:00", - "2024-02-08T00:00:00", - "2024-02-09T00:00:00", - "2024-02-12T00:00:00", - "2024-02-13T00:00:00", - "2024-02-14T00:00:00", - "2024-02-15T00:00:00", - "2024-02-16T00:00:00", - "2024-02-20T00:00:00", - "2024-02-21T00:00:00", - "2024-02-22T00:00:00", - "2024-02-23T00:00:00", - "2024-02-26T00:00:00", - "2024-02-27T00:00:00", - "2024-02-28T00:00:00", - "2024-02-29T00:00:00", - "2024-03-01T00:00:00", - "2024-03-04T00:00:00", - "2024-03-05T00:00:00", - "2024-03-06T00:00:00", - "2024-03-07T00:00:00", - "2024-03-08T00:00:00", - "2024-03-11T00:00:00", - "2024-03-12T00:00:00", - "2024-03-13T00:00:00", - "2024-03-14T00:00:00", - "2024-03-15T00:00:00", - "2024-03-18T00:00:00", - "2024-03-19T00:00:00", - "2024-03-20T00:00:00", - "2024-03-21T00:00:00", - "2024-03-22T00:00:00", - "2024-03-25T00:00:00", - "2024-03-26T00:00:00", - "2024-03-27T00:00:00", - "2024-03-28T00:00:00", - "2024-04-01T00:00:00", - "2024-04-02T00:00:00", - "2024-04-03T00:00:00", - "2024-04-04T00:00:00", - "2024-04-05T00:00:00", - "2024-04-08T00:00:00", - "2024-04-09T00:00:00", - "2024-04-10T00:00:00", - "2024-04-11T00:00:00", - "2024-04-12T00:00:00", - "2024-04-15T00:00:00", - "2024-04-16T00:00:00", - "2024-04-17T00:00:00", - "2024-04-18T00:00:00", - "2024-04-19T00:00:00", - "2024-04-22T00:00:00", - "2024-04-23T00:00:00", - "2024-04-24T00:00:00", - "2024-04-25T00:00:00", - "2024-04-26T00:00:00", - "2024-04-29T00:00:00", - "2024-04-30T00:00:00", - "2024-05-01T00:00:00", - "2024-05-02T00:00:00", - "2024-05-03T00:00:00", - "2024-05-06T00:00:00", - "2024-05-07T00:00:00", - "2024-05-08T00:00:00", - "2024-05-09T00:00:00", - "2024-05-10T00:00:00", - "2024-05-13T00:00:00", - "2024-05-14T00:00:00", - "2024-05-15T00:00:00", - "2024-05-16T00:00:00", - "2024-05-17T00:00:00", - "2024-05-20T00:00:00", - "2024-05-21T00:00:00", - "2024-05-22T00:00:00", - "2024-05-23T00:00:00", - "2024-05-24T00:00:00", - "2024-05-28T00:00:00", - "2024-05-29T00:00:00", - "2024-05-30T00:00:00", - "2024-05-31T00:00:00", - "2024-06-03T00:00:00", - "2024-06-04T00:00:00", - "2024-06-05T00:00:00", - "2024-06-06T00:00:00", - "2024-06-07T00:00:00", - "2024-06-10T00:00:00", - "2024-06-11T00:00:00", - "2024-06-12T00:00:00", - "2024-06-13T00:00:00", - "2024-06-14T00:00:00", - "2024-06-17T00:00:00", - "2024-06-18T00:00:00", - "2024-06-20T00:00:00", - "2024-06-21T00:00:00", - "2024-06-24T00:00:00", - "2024-06-25T00:00:00", - "2024-06-26T00:00:00", - "2024-06-27T00:00:00", - "2024-06-28T00:00:00", - "2024-07-01T00:00:00", - "2024-07-02T00:00:00", - "2024-07-03T00:00:00", - "2024-07-05T00:00:00", - "2024-07-08T00:00:00", - "2024-07-09T00:00:00", - "2024-07-10T00:00:00", - "2024-07-11T00:00:00", - "2024-07-12T00:00:00", - "2024-07-15T00:00:00", - "2024-07-16T00:00:00", - "2024-07-17T00:00:00", - "2024-07-18T00:00:00", - "2024-07-19T00:00:00", - "2024-07-22T00:00:00", - "2024-07-23T00:00:00", - "2024-07-24T00:00:00", - "2024-07-25T00:00:00", - "2024-07-26T00:00:00", - "2024-07-29T00:00:00", - "2024-07-30T00:00:00", - "2024-07-31T00:00:00", - "2024-08-01T00:00:00", - "2024-08-02T00:00:00", - "2024-08-05T00:00:00", - "2024-08-06T00:00:00", - "2024-08-07T00:00:00", - "2024-08-08T00:00:00", - "2024-08-09T00:00:00", - "2024-08-12T00:00:00", - "2024-08-13T00:00:00", - "2024-08-14T00:00:00", - "2024-08-15T00:00:00", - "2024-08-16T00:00:00", - "2024-08-19T00:00:00", - "2024-08-20T00:00:00", - "2024-08-21T00:00:00", - "2024-08-22T00:00:00", - "2024-08-23T00:00:00", - "2024-08-26T00:00:00", - "2024-08-27T00:00:00", - "2024-08-28T00:00:00", - "2024-08-29T00:00:00", - "2024-08-30T00:00:00", - "2024-09-03T00:00:00", - "2024-09-04T00:00:00", - "2024-09-05T00:00:00", - "2024-09-06T00:00:00", - "2024-09-09T00:00:00", - "2024-09-10T00:00:00", - "2024-09-11T00:00:00", - "2024-09-12T00:00:00", - "2024-09-13T00:00:00", - "2024-09-16T00:00:00", - "2024-09-17T00:00:00", - "2024-09-18T00:00:00", - "2024-09-19T00:00:00", - "2024-09-20T00:00:00", - "2024-09-23T00:00:00", - "2024-09-24T00:00:00", - "2024-09-25T00:00:00", - "2024-09-26T00:00:00", - "2024-09-27T00:00:00", - "2024-09-30T00:00:00", - "2024-10-01T00:00:00", - "2024-10-02T00:00:00", - "2024-10-03T00:00:00", - "2024-10-04T00:00:00", - "2024-10-07T00:00:00", - "2024-10-08T00:00:00", - "2024-10-09T00:00:00", - "2024-10-10T00:00:00", - "2024-10-11T00:00:00", - "2024-10-14T00:00:00", - "2024-10-15T00:00:00", - "2024-10-16T00:00:00", - "2024-10-17T00:00:00", - "2024-10-18T00:00:00", - "2024-10-21T00:00:00", - "2024-10-22T00:00:00", - "2024-10-23T00:00:00", - "2024-10-24T00:00:00", - "2024-10-25T00:00:00", - "2024-10-28T00:00:00", - "2024-10-29T00:00:00", - "2024-10-30T00:00:00", - "2024-10-31T00:00:00", - "2024-11-01T00:00:00", - "2024-11-04T00:00:00", - "2024-11-05T00:00:00", - "2024-11-06T00:00:00", - "2024-11-07T00:00:00", - "2024-11-08T00:00:00", - "2024-11-11T00:00:00", - "2024-11-12T00:00:00", - "2024-11-13T00:00:00", - "2024-11-14T00:00:00", - "2024-11-15T00:00:00", - "2024-11-18T00:00:00", - "2024-11-19T00:00:00", - "2024-11-20T00:00:00", - "2024-11-21T00:00:00", - "2024-11-22T00:00:00", - "2024-11-25T00:00:00", - "2024-11-26T00:00:00", - "2024-11-27T00:00:00", - "2024-11-28T00:00:00", - "2024-11-29T00:00:00", - "2024-12-02T00:00:00", - "2024-12-03T00:00:00", - "2024-12-04T00:00:00", - "2024-12-05T00:00:00", - "2024-12-06T00:00:00", - "2024-12-09T00:00:00", - "2024-12-10T00:00:00", - "2024-12-11T00:00:00", - "2024-12-12T00:00:00", - "2024-12-13T00:00:00", - "2024-12-16T00:00:00", - "2024-12-17T00:00:00", - "2024-12-18T00:00:00", - "2024-12-19T00:00:00", - "2024-12-20T00:00:00", - "2024-12-23T00:00:00", - "2024-12-24T00:00:00", - "2024-12-25T00:00:00", - "2024-12-26T00:00:00", - "2024-12-27T00:00:00", - "2024-12-30T00:00:00", - "2024-12-31T00:00:00", - "2025-01-01T00:00:00", - "2025-01-02T00:00:00", - "2025-01-06T00:00:00", - "2025-01-07T00:00:00", - "2025-01-08T00:00:00", - "2025-01-09T00:00:00", - "2025-01-10T00:00:00", - "2025-01-13T00:00:00", - "2025-01-14T00:00:00", - "2025-01-15T00:00:00", - "2025-01-16T00:00:00", - "2025-01-17T00:00:00", - "2025-01-21T00:00:00", - "2025-01-22T00:00:00", - "2025-01-23T00:00:00", - "2025-01-24T00:00:00", - "2025-01-27T00:00:00", - "2025-01-28T00:00:00", - "2025-01-29T00:00:00", - "2025-01-30T00:00:00", - "2025-01-31T00:00:00", - "2025-02-03T00:00:00", - "2025-02-04T00:00:00", - "2025-02-05T00:00:00", - "2025-02-06T00:00:00", - "2025-02-07T00:00:00", - "2025-02-10T00:00:00", - "2025-02-11T00:00:00", - "2025-02-12T00:00:00", - "2025-02-13T00:00:00", - "2025-02-14T00:00:00", - "2025-02-18T00:00:00", - "2025-02-19T00:00:00", - "2025-02-20T00:00:00", - "2025-02-21T00:00:00", - "2025-02-24T00:00:00", - "2025-02-25T00:00:00", - "2025-02-26T00:00:00", - "2025-02-27T00:00:00", - "2025-02-28T00:00:00", - "2025-03-03T00:00:00" - ], - "xaxis": "x", - "y": [ - 19663.35728679153, - 19628.201036791528, - 19731.946289397336, - 19899.633892583228, - 19889.052998657, - 19736.795292659335, - 19691.9053356162, - 19741.725402699605, - 19472.846836415178, - 19188.706265589997, - 19391.877757315622, - 19432.184620024487, - 19445.689260771884, - 19796.080891049583, - 20123.610954848795, - 20473.071564890895, - 20693.94066524819, - 20771.60049521401, - 20894.194520044413, - 21027.720624519465, - 21099.955535924193, - 21269.744892091545, - 21446.118253376942, - 21755.718707108517, - 21962.82902756668, - 22074.137485714404, - 22111.702569572997, - 22064.725005277036, - 22181.641448705628, - 22195.95340506525, - 22194.85464041465, - 22368.500796958466, - 22487.0203533385, - 22329.43184845274, - 22149.088603887398, - 22086.619353164, - 21953.72095367122, - 21928.69925025213, - 21745.340663454324, - 21516.617620710695, - 21369.837966582858, - 21267.900496841878, - 21038.947147540704, - 20995.32071724028, - 20833.362634361467, - 20874.953174363498, - 20969.41278723475, - 21081.32576446441, - 21175.035632733656, - 21305.476676133272, - 21558.819942309347, - 21542.641760907627, - 21559.06093269178, - 21512.419267301088, - 21536.698055674347, - 21603.803807690532, - 21830.77503268243, - 22059.085955774346, - 22258.06419226276, - 22426.49168482273, - 22649.534610997474, - 22701.679069008198, - 22592.616542139087, - 22491.2345808148, - 22395.15972476484, - 22415.768179079783, - 22318.988572641505, - 22190.604434150955, - 22037.416771230277, - 22162.604151892145, - 22137.08322241853, - 22096.45583271966, - 22142.19008623181, - 22249.094506033314, - 22370.561008836758, - 22746.923845466943, - 22972.872717384333, - 23236.944062127895, - 23453.999552191854, - 23829.487155753824, - 24048.755291477326, - 24297.07495255789, - 24312.707434431966, - 24410.421587053395, - 24497.1348425747, - 24593.68959686291, - 25263.00996148347, - 25856.592467233117, - 26320.773456956198, - 26798.49517862951, - 27198.27873990591, - 27009.777065279228, - 27134.942429484472, - 27386.959934982446, - 27601.75132814287, - 27749.040599586213, - 27957.265588487076, - 28292.85482476884, - 28805.684264733776, - 29202.901627907086, - 29527.404021484566, - 29844.794772044086, - 30115.543133589596, - 30318.347414791016, - 30644.41741128123, - 30908.027408550985, - 31290.27962864977, - 31839.222691853476, - 31558.682816848974, - 31218.59624740105, - 31139.772029025215, - 31104.730982986992, - 30975.365724957228, - 30817.859413156304, - 30812.57672620009, - 30763.023525234137, - 30945.037702260655, - 31074.348611378264, - 31184.368207358624, - 31165.272337565555, - 30753.41999439315, - 30647.86817192574, - 30272.03480441561, - 29995.275518574406, - 29439.64224885246, - 28943.371927957618, - 28400.606122817186, - 28111.677163263517, - 28117.28797249956, - 28279.42030980559, - 28679.07879437695, - 29003.368726821347, - 29291.37200761143, - 29634.220920601918, - 30304.88118626119, - 30873.505837329518, - 31348.10278816044, - 31845.567083251146, - 32351.150423877258, - 32398.556144684153, - 32718.245356204236, - 32670.56822782981, - 32305.09120085166, - 31980.27573542421, - 31784.30815120286, - 31628.903422619143, - 31955.255300387376, - 32039.40543955814, - 32941.29617660366, - 33886.62861657135, - 34070.48356943022, - 33897.81519943155, - 33669.18424498814, - 34186.8882041681, - 34147.43572797473, - 33998.832791287394, - 33718.69717386391, - 33340.25836031231, - 32767.0281719944, - 32633.293581080467, - 32602.611121480742, - 32468.746986236514, - 32320.4082143799, - 32451.922502935864, - 32478.544727368273, - 32823.25090192682, - 33281.466815472355, - 33616.41252600777, - 33492.14807864642, - 33380.60906403205, - 33394.25986735202, - 33326.54382548978, - 33564.986904041376, - 34110.998187359284, - 34289.56251882877, - 34258.44588774947, - 34731.13367262497, - 35249.33528308369, - 35611.554518348654, - 35799.39170133251, - 35814.93173254218, - 35250.351756816366, - 34770.1228868074, - 34806.8405239577, - 34381.73201951903, - 34148.86984940008, - 34236.08816152978, - 34307.70240429732, - 34425.18014867208, - 34491.55172763022, - 34788.17406681989, - 35462.769219522976, - 35622.45433829204, - 35577.20943066797, - 36279.241169182584, - 36516.37696580506, - 36701.371474289204, - 37433.033869776875, - 37761.28370258551, - 38222.70023921446, - 38617.13532325919, - 38173.38298841968, - 37780.46450576674, - 38071.52790814777, - 37445.688332221915, - 37516.701995390686, - 37605.268177855294, - 38028.59743088332, - 38248.40907212734, - 38294.92923753936, - 38507.115787463255, - 38916.59421518184, - 39533.43707087867, - 39872.09262530953, - 40255.600562315456, - 38935.55117998673, - 39597.179438175495, - 39950.77481801038, - 40029.68233565972, - 39807.72151605366, - 39976.75198969339, - 39984.88680252429, - 40052.203485527534, - 40482.22757230781, - 40704.35741758137, - 40776.61281067552, - 40961.75527082561, - 41134.97718427569, - 40662.37200584797, - 40104.23464484862, - 39724.68336407135, - 39147.4768123557, - 38510.98282768798, - 38150.93195072419, - 38074.55904641902, - 37987.60234307055, - 38036.9693515773, - 37938.92002115228, - 37676.99276415503, - 37630.78167824697, - 37577.48096492327, - 37904.24707678262, - 37824.51886821367, - 37676.13181119108, - 37588.27521128463, - 37575.497855801834, - 37599.78213487075, - 37441.69755677087, - 37230.40955158207, - 36942.28534539419, - 36718.1887405814, - 37046.86663944186, - 37292.51026330317, - 37635.23308186197, - 38137.90638518548, - 38597.76679866562, - 39087.65823137241, - 39692.57379014434, - 40699.58581992751, - 41475.605983195506, - 41874.732776848396, - 42507.777839970906, - 41992.89080754739, - 42387.35644899577, - 43102.4963923445, - 43880.383014949075, - 45086.517054752636, - 45949.06575237763, - 46897.15918386374, - 47854.565186130705, - 48415.880965671684, - 48880.23768309245, - 48640.292907753035, - 48638.66919360016, - 48453.5174159257, - 48224.51047773446, - 47999.72730358571, - 47440.102460354894, - 47292.50773830283, - 47329.37851004012, - 47441.94466583579, - 47957.20723145464, - 48560.189226935974, - 49191.66411231035, - 49710.589023157074, - 50021.419509371204, - 50342.0654430933, - 50714.23450265494, - 51072.03266009176, - 51365.320115875955, - 51438.98813704144, - 51011.84104239237, - 51091.83774655421, - 51415.16851645786, - 52217.75911527181, - 52614.729872484866, - 52600.15157253947, - 52873.81289480417, - 52925.431315384194, - 53107.85920765029, - 53412.193620072, - 53359.45371862221, - 53288.281995766025, - 52895.703989100104, - 52795.92109502661, - 53046.089955191674, - 52585.913599481806, - 50936.8875450408, - 51216.53394714224, - 51355.31607741976, - 50221.035512080045, - 50767.706183482485, - 49447.33892790661, - 48814.83106245871, - 48471.76938933256, - 48300.49919912333, - 47588.40016229393, - 47112.8786892044, - 47299.695321245876, - 47572.40317280395, - 48365.620390682445, - 48745.34489347683, - 48884.3849371139, - 49925.30497105385, - 50549.71099796609, - 50844.69394403589, - 51032.45845764575, - 50770.71974600896, - 49850.530364764796, - 49572.04973490822, - 49538.850714594526, - 49632.60416846659, - 49696.07907703376, - 49876.55956147488, - 49944.9402488487, - 49639.236339028335, - 49854.63717478353, - 50399.94893592646, - 50828.05599728715, - 51323.25037834546, - 51861.179341390816, - 51864.1144363028, - 51965.66183716649, - 51820.70934936698, - 51757.96852552291, - 51708.7135754915, - 51561.91074856259, - 51609.397438728985, - 51555.96021670171, - 51955.91169897087, - 52333.4401846955, - 52725.962340259095, - 53025.77731889359, - 53137.30008005375, - 53320.15111651164, - 53565.70192264557, - 54059.73469802981, - 54682.3157455509, - 55341.73030588162, - 56056.83051947218, - 56401.25109322516, - 56550.49093416518, - 56712.12192156298, - 57039.59470286176, - 57472.65703423763, - 58166.14587822671, - 58519.4149791071, - 58842.098385520134, - 59138.629923841385, - 59658.37432073441, - 59860.0623954074, - 59771.375342375286, - 58721.12473222467, - 58343.74672769185, - 57794.11939083298, - 57639.96479549831, - 57709.51122134912, - 57576.93621923309, - 57138.266773142845, - 57150.96831507265, - 57504.1806254625, - 58148.90131132127, - 58479.79517810031, - 58807.03025857835, - 59196.546432283496, - 59247.281234054164, - 59466.1860798758, - 59131.445404403734, - 58700.535990147684, - 58110.38422350409, - 57515.26618278129, - 57061.28548444134, - 56584.0052930478, - 56469.0095886306, - 55711.67486609503, - 54930.303415234026, - 53538.40217918744, - 52311.59010670676, - 51662.5140503329, - 51424.34378426434, - 51355.76691065546, - 51519.38924963828, - 51939.76217995826, - 52108.75592506558, - 52314.9917068023, - 52192.28620370863, - 52169.84645299035, - 52152.28220243169, - 51962.789974523774, - 51471.852822402994, - 50903.33547919275, - 50617.93922494455, - 50472.271159419135, - 50860.08488623268, - 51239.29612636973, - 51719.08191473629, - 51889.47086124363, - 52645.687891161186, - 53315.28763811811, - 53969.42077464015, - 54520.41321415729, - 54520.41321415729, - 54537.29622267064, - 54105.9830070699, - 53796.62828382487, - 53637.685721300964, - 53507.39706156015, - 53692.72810398396, - 54317.98558142472, - 54612.63028610085, - 54858.4650564045, - 54169.114322196234, - 54044.61930670089, - 54063.34540576009, - 54117.910149472795, - 53774.23828347157, - 54199.1601654706, - 54409.09940702542, - 54726.765244817245, - 55238.838674210885, - 55625.56245262815, - 56360.72450423444, - 57201.96165548379, - 57310.25721756661, - 57246.46658388036, - 57212.62942434661, - 55851.53385582036, - 54944.015080299934, - 52822.94492156184, - 50453.77924254331, - 50149.09029484409, - 49626.665557744695, - 49387.620539584575, - 49410.36330323782, - 49186.94100830148, - 49042.057001128764, - 48948.2583288833, - 48914.39527822206, - 48783.50179437446, - 49038.55010892221, - 48776.170177740954, - 48577.207471556634, - 48268.2017508717, - 48146.1973014501, - 48007.416063011064, - 47729.475099780706, - 47583.29879504599, - 47501.82833580787, - 47521.24020084489, - 47562.44942920702, - 47537.27882904423, - 47244.55175113363, - 47174.65291275871, - 47189.176038467114, - 46893.20204633791, - 46876.88894134854, - 46838.64541524569, - 46781.90045049904, - 46733.32103347386, - 46391.40014753441, - 46375.90596421189, - 46423.85493273881, - 46318.57650223927, - 46332.24883407297, - 46338.43842549918, - 46398.80810771957, - 46440.20674944653, - 46415.739026345276, - 46437.81968615542, - 46461.10464378553, - 46486.437388608945, - 46545.0295234716, - 46642.823406142554, - 46612.21864821996, - 46493.414947613506, - 46356.5676249196, - 46263.46415171322, - 46100.2725614416, - 45949.90132456367, - 45850.39036254749, - 45859.548503201586, - 45759.673533007845, - 45693.32633396827, - 45653.05629027082, - 45621.7351451728, - 45550.568924661624, - 45493.195197597386, - 45436.90452099186, - 45397.011772520906, - 45385.42852371016, - 45366.13044130179, - 45350.55778414455, - 45345.67542163965, - 45355.21136191362, - 45369.2948710156, - 45520.24871142825, - 45504.32392063808, - 45488.6046389124, - 45489.71186423687, - 45577.23970615591, - 45557.34694038579, - 45628.541455897925, - 45780.58163462959, - 45942.16844030977, - 45991.180400283236, - 46075.9674802626, - 46093.824798423666, - 46184.380490326716, - 46248.14602847353, - 46279.96366925439, - 46348.04405652839, - 46399.14206219477, - 46453.884955490845, - 46524.79609472112, - 46553.28253634467, - 46598.77199094076, - 46685.8193445155, - 46751.856175073626, - 46886.55148772995, - 46994.6478420182, - 47078.722784242396, - 47127.827486968876, - 47120.464477978356, - 47074.73769320795, - 47015.839082830964, - 46933.362385871085, - 46755.88051045785, - 46542.28349624756, - 46366.15248519511, - 46234.50615608789, - 46079.55901122672, - 46021.82234300137, - 46002.582712159434, - 46171.476499002805, - 46218.7272221032, - 46017.4287829025, - 45935.263330190835, - 45802.912422526206, - 45769.261716564826, - 45731.644500817085, - 45748.1644441244, - 45771.8355111412, - 45894.690785487604, - 45913.57822109036, - 45935.716262933805, - 45969.60140658981, - 45934.49054910446, - 45856.07099328252, - 45808.26211569897, - 45694.966322022876, - 45630.18070471924, - 45544.791891260866, - 45556.711703015455, - 45522.093778824594, - 45559.05761556503, - 45559.05761556503, - 45587.75111347584, - 45740.57454198577, - 45866.10387527127, - 46024.29335671554, - 46093.99628672776, - 46134.320787848366, - 46129.01762205329, - 46222.115159768226, - 46242.85768910207, - 46385.6574341395, - 46423.423441272134, - 46519.68589126418, - 46365.00113014687, - 46140.57964927787, - 45990.47405304642, - 45610.39192264418, - 45272.772487886876, - 45124.618990229064, - 45100.708945434926, - 45084.3344661506, - 44964.9320933739, - 44925.39691454758, - 44928.53621990488, - 44873.75567962723, - 44810.0374816335, - 45064.92332763838, - 44864.834541197735, - 44768.09881841056, - 44580.637700687206, - 44439.27905356904, - 44387.66677247713, - 44373.184019596476, - 44390.25298957819, - 44496.86218845286, - 44445.89156535538, - 44570.13663627956, - 44597.81466467623, - 44709.89757565143, - 44469.85994897249, - 44543.39568049301, - 44725.590138342304, - 44827.773315206185, - 44971.138008322545, - 45103.199436301926, - 45138.69165806367, - 45056.296719433914, - 45079.43398938855, - 45106.87408824215, - 45153.21638735052, - 45187.576513865584, - 45274.29374949227, - 45346.74048831303, - 45402.100797617044, - 45528.49214929794, - 45594.57431171642, - 45700.41599359745, - 45938.848412838255, - 46130.96251669222, - 46084.12602822555, - 46194.3643149737, - 46371.21631577782, - 46348.212316403245, - 46468.09809466747, - 46375.973930679334, - 46576.54402535523, - 46589.25232187831, - 46662.80321917404, - 46735.32058373738, - 46665.545200619985, - 46305.83101375089, - 46457.386646186045, - 45909.43991163959, - 45415.49935552138, - 43937.434478540556, - 43039.49512977769, - 41992.208969628795, - 41725.98411447639, - 41489.069616429624, - 41017.80278461547, - 40819.81747098224, - 40689.05111593418, - 40407.67728423013, - 40339.05319290475, - 40718.23445520724, - 40737.26432588695, - 40773.9542253045, - 40791.11378223327, - 40722.46010428896, - 41089.39613255451, - 40840.56859898327, - 41069.70273953897, - 40957.19202207978, - 41032.47196131198, - 40989.35635849258, - 40921.37755629972, - 41151.83848792749, - 41223.30810141575, - 41348.19430550112, - 41476.43913090084, - 41520.07399510063, - 41735.1233339227, - 41770.16170856207, - 41690.08094718411, - 41431.6847994457, - 41302.9322400936, - 41202.23580504197, - 41039.89389498678, - 40670.29463161052, - 40490.050760095655, - 40330.41663780632, - 40401.81232047017, - 40292.897851430935, - 40335.40881995598, - 40190.47290658657, - 40061.633862854804, - 39996.4257177301, - 40118.73356928404, - 40383.30634271489, - 40606.30738871667, - 40479.197091162496, - 40449.77797084257, - 40518.563099482635, - 40682.06264398046, - 40922.00673414545, - 41085.8521376071, - 41345.50967363283, - 41494.132201652836, - 41773.060834557284, - 41911.67199348297, - 42046.70289486962, - 42175.61581817034, - 42309.770314070905, - 42358.001588660234, - 42699.95924667415, - 42796.481869573865, - 42892.6661318292, - 43069.14278025002, - 43056.40239568843, - 43449.27098547386, - 43915.94655530697, - 44156.13866517717, - 44297.399195076214, - 44346.44677636484, - 44176.81711736711, - 44389.88293814665, - 44659.48968764185, - 44285.29493724923, - 44230.36568694386, - 44525.42071448412, - 45080.4635136821, - 45205.4968019472, - 45117.559652088195, - 44985.27520219785, - 45277.942852283144, - 45650.416215627876, - 45705.11772045156, - 45745.30423879916, - 45415.00486418063, - 44669.7720172551, - 44552.92424742413, - 44504.820426444494, - 44849.184121238104, - 45027.24477274425, - 45028.79253588021, - 45033.88524054151, - 46158.983646778725, - 46224.28240718545, - 46031.4191562108, - 46339.41440545275, - 46166.9506760642, - 46796.36777542867, - 47372.8757706245, - 48091.49310022126, - 48548.97324546319, - 49258.95461416973, - 49824.49567871927, - 49860.83264984962, - 49795.872516284326, - 49819.23685684466, - 49837.40912172492, - 50376.06538480579, - 50723.40042790242, - 50845.21657253312, - 51032.18468502367, - 51368.24580371684, - 51704.02211238874, - 52528.181463578, - 52907.94983280733, - 52991.88078665237, - 53208.38783462531, - 53653.57191358605, - 54412.22973899312, - 54585.731360138576, - 54813.93717566672, - 54804.31191445024, - 54216.633347959265, - 54595.66112957739, - 54212.66188981714, - 54356.1342778538, - 54031.34772910888, - 53895.84708008506, - 54210.870948638854, - 54577.666759716354, - 54626.53649642978, - 55007.879624984664, - 56015.16926219311, - 57074.83000537724, - 57549.539382655574, - 58325.34409571661, - 59859.48889659788, - 61107.712630616654, - 62111.886645964594, - 63739.021991235204, - 63561.79392644567, - 62266.53503123945, - 61051.33366830128, - 60346.1770526827, - 58681.944129423806, - 58988.096300222445, - 59041.963089753546, - 57658.85948161106, - 58391.0416717855, - 58630.51670858783, - 60435.99729276742, - 59295.82255955524, - 59218.464433723544, - 59062.185891409994, - 56454.63591405502, - 58846.17488379837, - 54814.03852693208, - 53807.983084161926, - 52985.65889461354, - 52276.67269088392, - 52733.03295136492, - 52139.85566821528, - 55466.278666229904, - 56473.720182427205, - 59898.9524728029, - 60847.315802587, - 63428.68961852651, - 64572.98036425725, - 64112.428722047815, - 64960.88855588493, - 64656.357315536006, - 65718.38857304241, - 66420.6351066585, - 67135.1601883599, - 68430.34636301656, - 69313.26894330507, - 70530.04691105412, - 70282.35638274178, - 73227.0914043718, - 75491.94518451262, - 77218.49812462217, - 78536.46023425888, - 78249.31965286518, - 78850.91305699546, - 81044.93014909676, - 82796.93826534374, - 82002.18852643266, - 81790.16095172404, - 81921.36172695065, - 80655.0734410158, - 80324.07144084424, - 78992.1809962664, - 79504.5995393725, - 80241.69557514136, - 81191.65915851716, - 82383.40276362222, - 82065.87001203722, - 81600.49629055533, - 81710.20561829163, - 82884.42398430877, - 86968.26049121103, - 88436.24444102384, - 90983.0097353227, - 91487.16454466408, - 91788.17384081849, - 91848.9588489386, - 89946.79163303199, - 89555.10602066023, - 89455.4616554822, - 89052.40492701037, - 90522.24969375454, - 90519.90673455554, - 88966.9733218452, - 89698.66879272423, - 90132.209714519, - 91300.51932035945, - 92926.04314614108, - 91862.80973489395, - 91082.34859646746, - 93285.32326658016, - 95155.41467666786, - 97075.48577340267, - 98505.79774503969, - 102921.0403896463, - 106107.3402243403, - 107364.43597063245, - 106497.73266219298, - 108506.96342229568, - 107911.92068015327, - 108017.3318807092, - 108863.13801295221, - 109322.09833803013, - 111351.84525753518, - 113177.20397270584, - 114119.14964006074, - 117896.93610331183, - 122126.02043675087, - 128159.23084844825, - 129879.50561310175, - 132283.6082078322, - 133835.68800373375, - 134847.48096097092, - 135144.65326104435, - 138482.11501673103, - 138725.69638226513, - 139993.29795714896, - 138794.0911944424, - 139143.52163321894, - 137602.29794494587, - 138796.56840962233, - 140234.44543770407, - 142393.30454648324, - 145319.86163108927, - 148509.73936356063, - 153908.86648881616, - 155971.94367246097, - 157837.11481529585, - 156809.47014861187, - 158052.41318563547, - 155366.85361717886, - 157671.9739528237, - 157770.40088054744, - 158666.9551576659, - 163250.9418176469, - 167158.2554916476, - 170323.38834920363, - 171708.49168285847, - 174853.5720534788, - 176409.24480672865, - 177134.03998672616, - 183193.32512672414, - 186066.81166464995, - 187425.90119414785, - 193197.2479672948, - 192688.31911662265, - 197879.71979037457, - 201805.7771514678, - 196558.98872592478, - 189376.4919139456, - 188359.15492136107, - 185296.82249758203, - 181228.29868767786, - 179252.1082151223, - 178739.5156253569, - 175918.054722206, - 175315.25179753307, - 169403.62730056522, - 167510.69713625684, - 167515.64034179485, - 164357.8183905466, - 163861.73465068688, - 166268.6695196849, - 168000.72997334998, - 169249.55477064502, - 171740.30739076345, - 178133.67053974443, - 178485.73076672957, - 182352.33316549586, - 184290.10945646456, - 187246.35113549576, - 190983.17039612326, - 191955.69648772245, - 197675.0036240671, - 200699.94547016115, - 202570.68533871826, - 202981.81634759597, - 202711.58491005647, - 201309.73823641465, - 200401.4967424306, - 197741.19780266524, - 193318.1875161811, - 191274.73507113787, - 188442.60539165974, - 188887.69202035016, - 185697.7593982205, - 184923.6809237478, - 180584.95322138007, - 173643.16500842743, - 171677.1075094643, - 177429.95167693737, - 182925.38602941646, - 188909.31567753415, - 190391.09774303058, - 188194.5537186647, - 185156.06620368105, - 183274.72069351014, - 180848.62300893557, - 180314.99147648865, - 178876.73791406213, - 175778.91540905027, - 169818.94234959644, - 171524.18552557685, - 170548.6810518696, - 169195.75433834083, - 173345.49678012027, - 173641.1853459487, - 176468.38756381517, - 177361.51323431463, - 178748.70233435387, - 181551.51607882895, - 183035.59996261823, - 182527.66520556563, - 183953.1603945246, - 181993.5455414928, - 182347.7339891345, - 179810.4361150782, - 182200.3155463676, - 181707.27283408554, - 181845.37670566497, - 183815.56860578223, - 179110.04437768366, - 182197.49563957393, - 183531.93224899456, - 181697.60516743298, - 181455.90632621813, - 181245.69611638444, - 181303.09942729992, - 182972.74644690086, - 187558.58301770157, - 191125.34479499105, - 189533.37237355168, - 187850.18561446446, - 188228.81813517446, - 189666.77351253782, - 189428.75518973975, - 189955.85204978555, - 190742.48294093233, - 190745.70683695166, - 190915.99208941116, - 190917.32506354636, - 191379.37670426318, - 192239.3057581541, - 194802.89892935657, - 196079.00472918068, - 193195.0870179327, - 192638.70657585104, - 193710.41067645408, - 193025.6249769231, - 192943.01387728806, - 194203.20524423858, - 195951.95408520012, - 194825.42540594778, - 195182.01421097384, - 195532.0943926608, - 195731.04564508388, - 194958.56328585747, - 194186.07700645915, - 194401.60990026052, - 194204.24659543933, - 193560.29735835607, - 192891.67017395812, - 192101.25746911048, - 189956.49203200673, - 187098.59220805843, - 189306.89234498746, - 184735.57022926555, - 181055.65302814866, - 178771.27298283545, - 175407.31072536955, - 171038.1178584517, - 168582.6345175156, - 164308.9252523431, - 158877.2008927061, - 156573.79102639412, - 154875.02779704038, - 153892.10084087632, - 153405.49016531356, - 152585.74228771217, - 152058.89876497883, - 151143.2068135838, - 149461.5575180543, - 148230.27473264243, - 147648.0651993923, - 145884.23269710224, - 143625.405939423, - 142026.8740167836, - 139731.704224511, - 136647.21510177964, - 136517.61245076638, - 137303.50144927046, - 144374.06623518866, - 144414.50551312495, - 143744.19802638007, - 144062.09349691513, - 144844.42948211817, - 143673.76916858705, - 146060.4778136184, - 151292.67581371008, - 152044.38536933693, - 153736.51868592307, - 154922.99335940098, - 156393.19463825773, - 160471.8711693159, - 156279.30257680916, - 155903.68269342597, - 155991.3116730168, - 158508.3656509914, - 157796.90162793233, - 158654.75663790127, - 158484.49775120046, - 158929.51861709985, - 158262.20151279937, - 156576.36751861495, - 153462.94107869372, - 152023.2808429362, - 151994.47070879128, - 149970.12586645156, - 148261.07987796512, - 145684.15522025348, - 141941.87207613364, - 140831.4950258938, - 140839.075863656, - 139916.89114880128, - 139873.52525946978, - 140717.67027415134, - 142441.0052855703, - 144034.43842571712, - 145406.6736980394, - 146697.30113206783, - 146458.34469186774, - 147672.04523837875, - 148137.5901078873, - 149139.45786539512, - 150044.0366951071, - 151853.26467377195, - 153416.77532384463, - 154184.61694056782, - 155002.0493091303, - 155714.24983293554, - 156791.37820533427, - 156785.03360608884, - 157723.32114000907, - 158151.663119243, - 158460.9291030916, - 159748.02486830717, - 160542.08660590183, - 161864.4235470349, - 163057.3522790273, - 163652.94035652556, - 164749.5088612464, - 166355.1732538071, - 167573.4677813543, - 168262.69685833543, - 169308.2283225466, - 168018.4792159622, - 167009.37174345346, - 168774.5103759467, - 168084.42458596433, - 168420.4689715336, - 167851.4725820892, - 167962.3756393956, - 168468.0780173006, - 169155.2909778934, - 170767.45661390998, - 168821.9503830217, - 167048.5395717995, - 161667.09308016594, - 162023.18920385742, - 162509.0417445063, - 160718.80793249703, - 161826.95941204537, - 162415.5216739163, - 162873.85065508625, - 164745.21764044065, - 163541.24188433177, - 164997.59620354034, - 169670.7606740359, - 169923.76185531588, - 181012.42944075586, - 178887.5042294314, - 174180.56239840123, - 176273.3449328255, - 177062.95357071105, - 174931.0461721131, - 175157.50236990093, - 172265.07941262476, - 179433.75044585444, - 177217.93902725528, - 184327.86347945593, - 177986.24916450088, - 181568.618171888, - 182583.26679687065, - 183281.88239407938, - 183513.07538183825, - 184103.44770565073, - 186294.35353580705, - 189500.61362592864, - 187810.4355444703, - 185663.81049126506, - 186007.96303018683, - 188128.4176940644, - 194035.9258957848, - 196657.29152915563, - 204614.58195493135, - 201296.91895275694, - 199398.73661773241, - 197470.7059127133, - 196166.12647547625, - 191168.67580206963, - 187453.99194497557, - 186154.2378339024, - 186017.9253866577, - 186407.4601499118, - 186715.5141990294, - 186643.44512612085, - 184930.72473608085, - 183884.71998827197, - 182192.82740664287, - 181535.79984315354, - 178700.33396043963, - 177650.52716277327, - 177815.12187569943, - 178820.9177635309, - 179749.31456517757, - 179520.28985534722, - 178440.93105319625, - 178425.8742070788, - 178864.48591793247, - 182460.07280415195, - 185405.4008070985, - 187715.1003649458, - 190620.08720318208, - 195716.18348013872, - 197255.92502888278, - 200750.72401123928, - 204509.4565530721, - 208500.87344517084, - 210983.0865834699, - 210122.79467408382, - 215628.12318900577, - 221044.00059595963, - 226788.88451210383, - 229531.01644688268, - 237234.341285044, - 242963.59393694723, - 249790.79044398302, - 249969.7210605665, - 252335.55598457583, - 255452.87203658305, - 257380.11513567477, - 259422.97087941278, - 260656.91355206684, - 261812.75785301998, - 260427.37420500204, - 264925.4091454326, - 267470.34566400555, - 272885.21922819957, - 277069.9004859657, - 277149.097019784, - 277910.6943238648, - 279126.5492940369, - 278015.5476041706, - 279911.99073427473, - 276752.66207544797, - 271417.6286741382, - 268756.6328054585, - 272082.5249075965, - 269397.66320925934, - 265156.1041105527, - 263202.64665117516, - 260634.95751610378, - 265117.31041104824, - 265464.695996005, - 261221.55145097137, - 259540.7723603897, - 260304.25815098226, - 261192.07670712657, - 261310.20574407073, - 264933.19499502727, - 266680.39633449476, - 266818.77515408065, - 267008.62534709193, - 265415.7310527673, - 268669.400967491, - 265884.8014782808, - 269881.22409778397, - 270184.5884951535, - 272108.0022481176, - 272541.68001540855, - 273308.0449614967, - 269342.43991956534, - 268598.63599806314, - 268585.1218368948, - 266770.38860043045, - 265436.48497206933, - 265520.4488166773, - 261596.531806928, - 255549.94670632988, - 257602.60273919793, - 256362.6144182369, - 256679.29016860056, - 255847.59234279403, - 257595.71625605566, - 257428.48068668356, - 253794.44625408063, - 254037.4194731672, - 255031.95419912346, - 255207.77682549853, - 258260.08331267914, - 259835.8881396911, - 249714.06267058858, - 243289.30952795336, - 249676.72375034814, - 256164.78375309633, - 252836.85657554585, - 249819.02432633998, - 247119.56780100247, - 244664.2233350313, - 233703.39986149815, - 235985.95295680317, - 238681.2720309293, - 240304.2979774718, - 241413.318158116, - 243235.88940972814, - 243386.77816098204, - 243504.13607862394, - 244062.0811256788, - 244536.03838449923, - 243984.6718080262, - 243462.49780410275, - 242496.36246771784, - 242466.24656160816, - 242362.82307907846, - 242622.3825926665, - 241509.46780947948, - 237083.86742255624, - 235092.64673737058, - 236662.719571398, - 239933.88733119704, - 248018.22779788869, - 271067.1592719822, - 284609.6615296104, - 284005.98658595537, - 280761.8670967639, - 264825.64108779735, - 264030.62603724207, - 258930.0587756991, - 258633.41429432988, - 263435.80807250825, - 275525.44767775806, - 261206.14099285606, - 261100.13127038607, - 260263.04642285727, - 258707.26237464644, - 257663.87478159356, - 257095.68443144133, - 256785.42527021182, - 255788.5570337, - 254968.77062752412, - 254393.93675605403, - 253204.06596713286, - 252261.3886868608, - 252211.09669171326, - 252005.86958437625, - 251769.58183422525, - 251598.58025077445, - 251286.69013031272, - 250980.22003662027, - 250690.7432970817, - 250408.06814235408, - 250057.51106072226, - 249691.52221945307, - 249546.86423179926, - 249112.42838910175, - 248446.8889662303, - 247425.9138595525, - 246515.15544324755, - 247347.34334167704, - 247087.39489500067, - 246445.212769808, - 247465.1822279914, - 248645.71402880078, - 249747.69054898832, - 250478.11673135642, - 250769.5593176427, - 250635.12577364314, - 250002.23301719906, - 249508.87198440923, - 249252.368958906, - 246440.6443835146, - 245487.63638043238, - 244810.8523780351, - 243881.68704283723, - 243236.65996895326, - 242566.08335593238, - 241917.8571013606, - 241589.20198462225, - 241201.2175845583, - 240584.28295509247, - 239801.00891760504, - 239759.57355511477, - 239336.35033204575, - 238897.1767141032, - 237785.59723348118, - 236811.03541521964, - 236667.9501271746, - 236233.7748460605, - 237189.41629408288, - 237587.13742032254, - 237825.09612687287, - 237017.95289863422, - 236713.50816555973, - 236210.05115094624, - 235750.42813935905, - 236036.2769081246, - 235655.81924523602, - 235501.01884076712, - 236192.84074840244, - 236252.03556545213, - 237151.40931204634, - 237450.67637525106, - 237770.10631329918, - 238088.55182066993, - 238492.89832640273, - 240117.3900530838, - 239590.88361828018, - 239391.3786134329, - 239556.20805410724, - 238921.09761907614, - 237901.56728071862, - 238775.28812866274, - 239831.51545484152, - 241329.69226409163, - 241308.27422684172, - 241858.2824200918, - 241649.39990373075, - 242243.6023910055, - 241765.75988110807, - 242414.1045956323, - 242918.3727069289, - 242800.31457127072, - 242513.85435737172, - 242585.4964132281, - 242541.52081817543, - 242790.65091091223, - 243008.86320526307, - 242791.13729742268, - 243232.90603576906, - 243337.61505448289, - 243030.4959482118, - 242616.6881165121, - 241859.47903083998, - 238380.53863087276, - 254973.5653651348, - 261229.13750360394, - 263471.62264717114, - 268778.8813963604, - 269397.38746473665, - 268775.6366567081, - 275089.3568510579, - 274254.47255777445, - 278255.9830683688, - 278677.5126579104, - 279895.9245608872, - 281701.3560409802, - 278618.3583032748, - 276893.80450728175, - 280081.92933262046, - 282953.80419677275, - 284467.9338548753, - 286603.0118961118, - 285959.73926151806, - 287513.7494346119, - 288264.86845812923, - 287019.1832541983, - 278695.21310084866, - 279194.3474260211, - 274707.13962070504, - 268789.3113276815, - 270343.7782108854, - 271029.4746755996, - 274955.0163703772, - 278308.1231064485, - 285603.3172345039, - 284172.9126674359, - 281713.15355971636, - 284204.4520314901, - 283182.684176203, - 281480.4877262906, - 287339.3349319144, - 286118.73297932796, - 289453.26479398296, - 297990.42645756685, - 284958.96672391956, - 292397.8313755272, - 322770.28166011086, - 303647.89440100227, - 303206.0376439178, - 308216.86175126885, - 311916.9471680974, - 323245.58603058284, - 325370.5369764465, - 327288.1927402836, - 328520.4180378908, - 330870.30537670467, - 332694.07538286166, - 331201.45205431705, - 328869.96724322677, - 341238.10053992044, - 336431.09310401557, - 328739.44431390706, - 327103.7252448873, - 316603.17340336205, - 323732.7219710647, - 320997.8153015, - 319276.19900294975, - 317657.430770744, - 313855.03325680614, - 310321.7685237434, - 331228.9403980279, - 335527.85185580474, - 348298.5426326359, - 349046.8576812825, - 330372.3607253884, - 327294.1964263596, - 329961.96872179845, - 333017.4909827584, - 333933.3548024801, - 335940.7688654459, - 343486.16988021875, - 342300.5829854191, - 348235.6820672416, - 352546.66519413394, - 349850.23504556046, - 360342.73666678934, - 351730.4932288929, - 349435.97055497346, - 349394.5369460641, - 354304.03947687993, - 370541.9858897365, - 383969.83309973613, - 407124.9729133505, - 407888.6688970987, - 414946.1544413944, - 420111.9598399317, - 423351.4907234059, - 426476.4544367525, - 428372.8175936996, - 431030.5808402449, - 444129.89021770697, - 469674.90862239955, - 463977.2654226706, - 467891.8762673257, - 473825.0995980576, - 488392.1022902183, - 488392.1022902183, - 487053.6599396763, - 475652.115685693, - 470474.8034881504, - 466471.89400117286, - 454612.30451182276, - 454448.73490899487, - 454769.99363608955, - 451066.52820160764, - 451913.2773081216, - 456224.0821687436, - 458175.3406472231, - 461564.65279715153, - 463313.8757966478, - 462707.7159073671, - 463925.54742784, - 466840.8384045041, - 477191.8003387066, - 480081.08283822733, - 480391.0803378546, - 478266.8440916274, - 472895.76220814633, - 469274.34022974345, - 447324.90091320785, - 450745.89255590236, - 451490.8414559692, - 442536.2384933134, - 447394.72679098556, - 450192.43991139723, - 477964.3175071342, - 482901.58930324763, - 479114.4844175131, - 470851.9253034379, - 475035.78312083706, - 477074.2643794411, - 474143.0831361331, - 470358.94216911576, - 468457.7214169912, - 457906.32749867206, - 456945.91000664607, - 456465.6964017369, - 451887.30804236315, - 446323.2282072947, - 441493.610557797, - 442602.79683040973, - 441535.8438433997, - 438387.43596461444, - 439004.67428111454, - 444146.1946586823, - 444826.21851736633, - 451109.1259630094, - 455471.8983454159, - 458348.9435317321, - 459981.97867664456, - 463247.7837893544, - 462516.1556933371, - 461725.2988569137, - 459405.63242858433, - 459298.7196755894, - 454810.05876622803, - 454874.76694783574, - 456485.20664464164, - 453198.9797648301, - 464408.08023105946, - 457927.5005005862, - 449922.6680998848, - 440238.33313731296, - 432286.6019808516, - 429726.20694331767, - 423635.566358569, - 421993.290348209, - 419261.3703472617, - 417971.49582788313, - 419038.6875551814, - 416681.5033430801, - 416044.80451144575, - 417365.5943090634, - 421507.20859609946, - 424714.7974860164, - 428795.2555115074, - 433344.00589235, - 436312.58952189406, - 435600.0434559839, - 437741.5076269427, - 436742.47257482895, - 439573.42315391946, - 433004.6069376565, - 424050.66066016705, - 420625.42305115366, - 418961.4521798134, - 410607.0921685331, - 405928.0343819819, - 401110.53265738, - 398489.69798268954, - 395990.7317610305, - 396600.98025529576, - 398810.06241750217, - 402534.86604027345, - 405357.07658304257, - 409010.09449850523, - 412375.37755370856, - 414919.63046615117, - 420966.82675489166, - 425884.0905350234, - 431422.1040091666, - 436770.31179322297, - 440336.1410037885, - 443707.51438659243, - 448621.44781488966, - 450911.96022191877, - 453403.0612962037, - 455327.1812955551, - 454583.16351727274, - 450223.67572596757, - 450671.7407771747, - 449978.3665582714, - 446595.2977213466, - 444158.7997370717, - 438919.0790826357, - 436824.00827037945, - 433797.8804030632, - 434859.2342141622, - 438057.0099842258, - 439553.48258999287, - 442656.503393049, - 446853.2973509816, - 451033.82582008664, - 451020.762105629, - 458325.5324098637, - 464647.60799044016, - 466593.3348762577, - 470991.16770611476, - 473517.53082397114, - 475481.01652237267, - 478314.2831766849, - 477784.20612834394, - 475976.74008599034, - 480517.60876106896, - 484049.39550835226, - 468592.1303751522, - 453220.2155363961, - 442864.170661808, - 444002.34828180465, - 436156.4886223389, - 433348.04222053225, - 424964.41573400766, - 416973.16719335096, - 416973.16719335096, - 423842.360221909, - 429853.2752574225, - 431897.28727800015, - 445472.9311745206, - 450487.203846986, - 469765.8730819997, - 477805.8312152481, - 485022.792411063, - 490723.85488545895, - 494766.9034766558, - 506884.8301586976, - 504961.8225931098, - 510868.19228399516, - 522229.69977595774, - 539656.4278252615, - 543938.8829747202, - 553136.3480909657, - 556211.5987369347, - 569607.3492393547, - 568593.4941501502, - 569301.2607833692, - 573150.0587214902, - 575835.7904511399, - 575659.6929075338, - 565899.3297679514, - 563991.2695482764, - 567192.7782663069, - 575303.3961581083, - 566559.9878517322, - 572115.6702801058, - 575707.8677243966, - 587454.0212921782, - 601088.8074004524, - 612896.4323988275, - 621169.5851753415, - 624371.0693791716, - 613410.5570932613, - 581931.8253153312, - 596948.3672658303, - 605510.8061719083, - 615052.147543302, - 584930.4130543864, - 597422.3973407852, - 600882.8295635398, - 610322.6101812378, - 609341.883995003, - 612177.9858501535, - 613408.842848604, - 616571.176069621, - 620102.4352415231, - 618109.5257085579, - 616531.1516273629, - 616228.5273419891, - 615412.0417866985, - 618920.3307992499, - 614007.3333645676, - 610791.1131375929, - 602884.6085166124, - 608339.5493669611, - 603490.0589172321, - 607500.4552341094, - 602133.5412583473, - 596493.1637216435, - 595340.092304207, - 586857.7034239791, - 582233.6231838015, - 564718.7829969969, - 556502.7961850378, - 539041.4731090695, - 536403.2218277609, - 534447.9152756319, - 536492.1212906429, - 540833.7259689845, - 544221.0851632504, - 537861.8089810128, - 538479.3627059036, - 543572.4285677193, - 555475.6506953987, - 563702.6012391492, - 563010.4817572873, - 570257.7221602832, - 573912.79802928, - 575860.457846695, - 580375.0367395638, - 587436.531434017, - 593973.3161963697, - 600901.3043448664, - 601726.650682586, - 603722.9645008126, - 607489.7196927664, - 618944.3292865081, - 627059.2034149738, - 648073.5499593357, - 660858.0417160623, - 669268.2019712941, - 648137.4821698078, - 667242.4778797625, - 682898.0300986166, - 705385.1262688361, - 733145.0010678958, - 742298.2370227199, - 717780.1983209164, - 727400.6126639582, - 751270.379375213, - 770422.4201506334, - 786901.7851981824, - 724695.069124054, - 765354.845510843, - 714542.6493672344, - 701530.3856999833, - 705124.1806254551, - 729117.6877897106, - 749875.4155841315, - 740842.5372020145, - 758924.5865358388, - 774116.7360177025, - 782501.185614707, - 795253.0755295653, - 802916.8282633346, - 806618.60364683, - 823054.4289451042, - 832310.2753595016, - 820013.7114595888, - 732314.7173152119, - 741023.2774251407, - 744362.1575106411, - 728783.9010520068, - 716784.7015841802, - 697695.9461402606, - 697305.9123796754, - 697126.4596601869, - 695464.1075450291, - 677241.722566573, - 660896.1714041857, - 650801.5110056342, - 635692.7399527379, - 631997.7610888862, - 616552.5780564834, - 614867.9912535034, - 597323.2316178118, - 587799.4829406897, - 572288.8557147128, - 666121.7012056196, - 641970.261758823, - 714053.5866335366, - 695157.8242191795, - 689274.0924292196, - 697935.2287477556, - 697643.1012888787, - 694645.03259524, - 701561.53472241, - 710145.7030435426, - 715083.2784044233, - 716158.3003076894, - 724904.6812755954, - 730892.6206387572, - 654653.917951612, - 659170.744951723, - 635772.165951809, - 621830.4933963205, - 598741.4147420516, - 597240.4646776204, - 582619.9479608405, - 581580.3238477897, - 586969.6162043054, - 593226.8435927068, - 615968.0204503523, - 630215.6024507432, - 666847.6106732694, - 631670.2837352342, - 636426.8072278736, - 647019.2593736546, - 649466.7221537065, - 653327.5265381914, - 595820.0274286197, - 621272.7503433973, - 634132.6459437797, - 647574.7869662995, - 657577.603970792, - 658230.9060853972, - 664473.0825883711, - 677799.1349003433, - 690530.3777056158, - 744302.4788342662, - 746751.3352676608, - 754848.290271412, - 784360.0330521074, - 790318.9441037594, - 786099.2304772665, - 777759.3865455497, - 872493.8412653259, - 847012.2393807071, - 842651.2156926703, - 852518.1972686417, - 858683.0718277305, - 845925.1964847994, - 847750.1823291865, - 850243.5046525986, - 866226.755348586, - 866604.439223243, - 820557.0822368647, - 878246.404580793, - 862604.9664038483, - 852714.9589328913, - 854939.3975665914, - 921062.8498372472, - 921316.5793810902, - 921035.9245818573, - 921002.9041824541, - 924481.1330166523, - 921044.7936023698, - 926134.307391261, - 914215.307004843, - 824658.8622598514, - 850384.4052359689, - 873691.4942173939, - 890368.1189807245, - 893144.9382410925, - 884616.3532213786, - 871558.0537616013, - 863824.8875151078, - 857808.7582122794, - 857008.4354211907, - 864172.184361455, - 877505.3446483273, - 903250.8026492281, - 923951.7144277066, - 936921.1346998564, - 938095.950467084, - 893731.4738415943, - 905032.4364662134, - 902246.2740631395, - 910264.592194082, - 905894.9507403707, - 900366.5184985952, - 843953.0934216586, - 858841.5405840412, - 869030.843932561, - 892929.4576480763, - 906451.2687272344, - 916962.3082748161, - 937044.7834784908, - 928364.7199231817, - 930468.5593801633, - 901779.8951108838, - 879466.4895681108, - 898322.2777889061, - 909999.3018369502, - 922824.0983187619, - 945890.2427011784, - 963724.4505053572, - 966171.945464163, - 969109.1082099008, - 969670.5311689617, - 968502.9712482318, - 966332.1350572105, - 994574.5095681647, - 1014851.9092511982, - 1014035.8983350839, - 1018100.2233702735, - 1020944.6162310421, - 1038024.0329005282, - 1054555.802637082, - 1075870.1215673843, - 1084219.8221767286, - 1091961.832587137, - 1086974.7230770763, - 1095019.3045692516, - 1095436.7100439412, - 1092665.1307572827, - 1097256.7164313148, - 1087140.3941777837, - 1087087.2546472596, - 1085947.3683457412, - 1094818.5678890045, - 1104136.2786448759, - 1110728.1647883314, - 1108704.2984554635, - 1104207.180196566, - 1088690.9771063125, - 1080527.1680868142, - 1070780.6722185262, - 1057934.064320969, - 1054227.2581784243, - 1049423.8534008898, - 1035138.5257372175 - ], - "yaxis": "y" - }, - { - "hovertemplate": "variable=ZSCORE_2NORM
datetime=%{x}
value=%{y}", - "legendgroup": "ZSCORE_2NORM", - "line": { - "color": "#00cc96", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "ZSCORE_2NORM", - "showlegend": true, - "type": "scattergl", - "x": [ - "2017-01-05T00:00:00", - "2017-01-06T00:00:00", - "2017-01-09T00:00:00", - "2017-01-10T00:00:00", - "2017-01-11T00:00:00", - "2017-01-12T00:00:00", - "2017-01-13T00:00:00", - "2017-01-17T00:00:00", - "2017-01-18T00:00:00", - "2017-01-19T00:00:00", - "2017-01-20T00:00:00", - "2017-01-23T00:00:00", - "2017-01-24T00:00:00", - "2017-01-25T00:00:00", - "2017-01-26T00:00:00", - "2017-01-27T00:00:00", - "2017-01-30T00:00:00", - "2017-01-31T00:00:00", - "2017-02-01T00:00:00", - "2017-02-02T00:00:00", - "2017-02-03T00:00:00", - "2017-02-06T00:00:00", - "2017-02-07T00:00:00", - "2017-02-08T00:00:00", - "2017-02-09T00:00:00", - "2017-02-10T00:00:00", - "2017-02-13T00:00:00", - "2017-02-14T00:00:00", - "2017-02-15T00:00:00", - "2017-02-16T00:00:00", - "2017-02-17T00:00:00", - "2017-02-21T00:00:00", - "2017-02-22T00:00:00", - "2017-02-23T00:00:00", - "2017-02-24T00:00:00", - "2017-02-27T00:00:00", - "2017-02-28T00:00:00", - "2017-03-01T00:00:00", - "2017-03-02T00:00:00", - "2017-03-03T00:00:00", - "2017-03-06T00:00:00", - "2017-03-07T00:00:00", - "2017-03-08T00:00:00", - "2017-03-09T00:00:00", - "2017-03-10T00:00:00", - "2017-03-13T00:00:00", - "2017-03-14T00:00:00", - "2017-03-15T00:00:00", - "2017-03-16T00:00:00", - "2017-03-17T00:00:00", - "2017-03-20T00:00:00", - "2017-03-21T00:00:00", - "2017-03-22T00:00:00", - "2017-03-23T00:00:00", - "2017-03-24T00:00:00", - "2017-03-27T00:00:00", - "2017-03-28T00:00:00", - "2017-03-29T00:00:00", - "2017-03-30T00:00:00", - "2017-03-31T00:00:00", - "2017-04-03T00:00:00", - "2017-04-04T00:00:00", - "2017-04-05T00:00:00", - "2017-04-06T00:00:00", - "2017-04-07T00:00:00", - "2017-04-10T00:00:00", - "2017-04-11T00:00:00", - "2017-04-12T00:00:00", - "2017-04-13T00:00:00", - "2017-04-17T00:00:00", - "2017-04-18T00:00:00", - "2017-04-19T00:00:00", - "2017-04-20T00:00:00", - "2017-04-21T00:00:00", - "2017-04-24T00:00:00", - "2017-04-25T00:00:00", - "2017-04-26T00:00:00", - "2017-04-27T00:00:00", - "2017-04-28T00:00:00", - "2017-05-01T00:00:00", - "2017-05-02T00:00:00", - "2017-05-03T00:00:00", - "2017-05-04T00:00:00", - "2017-05-05T00:00:00", - "2017-05-08T00:00:00", - "2017-05-09T00:00:00", - "2017-05-10T00:00:00", - "2017-05-11T00:00:00", - "2017-05-12T00:00:00", - "2017-05-15T00:00:00", - "2017-05-16T00:00:00", - "2017-05-17T00:00:00", - "2017-05-18T00:00:00", - "2017-05-19T00:00:00", - "2017-05-22T00:00:00", - "2017-05-23T00:00:00", - "2017-05-24T00:00:00", - "2017-05-25T00:00:00", - "2017-05-26T00:00:00", - "2017-05-29T00:00:00", - "2017-05-30T00:00:00", - "2017-05-31T00:00:00", - "2017-06-01T00:00:00", - "2017-06-02T00:00:00", - "2017-06-05T00:00:00", - "2017-06-06T00:00:00", - "2017-06-07T00:00:00", - "2017-06-08T00:00:00", - "2017-06-09T00:00:00", - "2017-06-12T00:00:00", - "2017-06-13T00:00:00", - "2017-06-14T00:00:00", - "2017-06-15T00:00:00", - "2017-06-16T00:00:00", - "2017-06-19T00:00:00", - "2017-06-20T00:00:00", - "2017-06-21T00:00:00", - "2017-06-22T00:00:00", - "2017-06-23T00:00:00", - "2017-06-26T00:00:00", - "2017-06-27T00:00:00", - "2017-06-28T00:00:00", - "2017-06-29T00:00:00", - "2017-06-30T00:00:00", - "2017-07-03T00:00:00", - "2017-07-05T00:00:00", - "2017-07-06T00:00:00", - "2017-07-07T00:00:00", - "2017-07-10T00:00:00", - "2017-07-11T00:00:00", - "2017-07-12T00:00:00", - "2017-07-13T00:00:00", - "2017-07-14T00:00:00", - "2017-07-17T00:00:00", - "2017-07-18T00:00:00", - "2017-07-19T00:00:00", - "2017-07-20T00:00:00", - "2017-07-21T00:00:00", - "2017-07-24T00:00:00", - "2017-07-25T00:00:00", - "2017-07-26T00:00:00", - "2017-07-27T00:00:00", - "2017-07-28T00:00:00", - "2017-07-31T00:00:00", - "2017-08-01T00:00:00", - "2017-08-02T00:00:00", - "2017-08-03T00:00:00", - "2017-08-04T00:00:00", - "2017-08-07T00:00:00", - "2017-08-08T00:00:00", - "2017-08-09T00:00:00", - "2017-08-10T00:00:00", - "2017-08-11T00:00:00", - "2017-08-14T00:00:00", - "2017-08-15T00:00:00", - "2017-08-16T00:00:00", - "2017-08-17T00:00:00", - "2017-08-18T00:00:00", - "2017-08-21T00:00:00", - "2017-08-22T00:00:00", - "2017-08-23T00:00:00", - "2017-08-24T00:00:00", - "2017-08-25T00:00:00", - "2017-08-28T00:00:00", - "2017-08-29T00:00:00", - "2017-08-30T00:00:00", - "2017-08-31T00:00:00", - "2017-09-01T00:00:00", - "2017-09-05T00:00:00", - "2017-09-06T00:00:00", - "2017-09-07T00:00:00", - "2017-09-08T00:00:00", - "2017-09-11T00:00:00", - "2017-09-12T00:00:00", - "2017-09-13T00:00:00", - "2017-09-14T00:00:00", - "2017-09-15T00:00:00", - "2017-09-18T00:00:00", - "2017-09-19T00:00:00", - "2017-09-20T00:00:00", - "2017-09-21T00:00:00", - "2017-09-22T00:00:00", - "2017-09-25T00:00:00", - "2017-09-26T00:00:00", - "2017-09-27T00:00:00", - "2017-09-28T00:00:00", - "2017-09-29T00:00:00", - "2017-10-02T00:00:00", - "2017-10-03T00:00:00", - "2017-10-04T00:00:00", - "2017-10-05T00:00:00", - "2017-10-06T00:00:00", - "2017-10-09T00:00:00", - "2017-10-10T00:00:00", - "2017-10-11T00:00:00", - "2017-10-12T00:00:00", - "2017-10-13T00:00:00", - "2017-10-16T00:00:00", - "2017-10-17T00:00:00", - "2017-10-18T00:00:00", - "2017-10-19T00:00:00", - "2017-10-20T00:00:00", - "2017-10-23T00:00:00", - "2017-10-24T00:00:00", - "2017-10-25T00:00:00", - "2017-10-26T00:00:00", - "2017-10-27T00:00:00", - "2017-10-30T00:00:00", - "2017-10-31T00:00:00", - "2017-11-01T00:00:00", - "2017-11-02T00:00:00", - "2017-11-03T00:00:00", - "2017-11-06T00:00:00", - "2017-11-07T00:00:00", - "2017-11-08T00:00:00", - "2017-11-09T00:00:00", - "2017-11-10T00:00:00", - "2017-11-13T00:00:00", - "2017-11-14T00:00:00", - "2017-11-15T00:00:00", - "2017-11-16T00:00:00", - "2017-11-17T00:00:00", - "2017-11-20T00:00:00", - "2017-11-21T00:00:00", - "2017-11-22T00:00:00", - "2017-11-24T00:00:00", - "2017-11-27T00:00:00", - "2017-11-28T00:00:00", - "2017-11-29T00:00:00", - "2017-11-30T00:00:00", - "2017-12-01T00:00:00", - "2017-12-04T00:00:00", - "2017-12-05T00:00:00", - "2017-12-06T00:00:00", - "2017-12-07T00:00:00", - "2017-12-08T00:00:00", - "2017-12-11T00:00:00", - "2017-12-12T00:00:00", - "2017-12-13T00:00:00", - "2017-12-14T00:00:00", - "2017-12-15T00:00:00", - "2017-12-18T00:00:00", - "2017-12-19T00:00:00", - "2017-12-20T00:00:00", - "2017-12-21T00:00:00", - "2017-12-22T00:00:00", - "2017-12-26T00:00:00", - "2017-12-27T00:00:00", - "2017-12-28T00:00:00", - "2017-12-29T00:00:00", - "2018-01-01T00:00:00", - "2018-01-02T00:00:00", - "2018-01-04T00:00:00", - "2018-01-05T00:00:00", - "2018-01-08T00:00:00", - "2018-01-09T00:00:00", - "2018-01-10T00:00:00", - "2018-01-11T00:00:00", - "2018-01-12T00:00:00", - "2018-01-15T00:00:00", - "2018-01-16T00:00:00", - "2018-01-17T00:00:00", - "2018-01-18T00:00:00", - "2018-01-19T00:00:00", - "2018-01-22T00:00:00", - "2018-01-23T00:00:00", - "2018-01-24T00:00:00", - "2018-01-25T00:00:00", - "2018-01-26T00:00:00", - "2018-01-29T00:00:00", - "2018-01-30T00:00:00", - "2018-01-31T00:00:00", - "2018-02-01T00:00:00", - "2018-02-02T00:00:00", - "2018-02-05T00:00:00", - "2018-02-06T00:00:00", - "2018-02-07T00:00:00", - "2018-02-08T00:00:00", - "2018-02-09T00:00:00", - "2018-02-12T00:00:00", - "2018-02-13T00:00:00", - "2018-02-14T00:00:00", - "2018-02-15T00:00:00", - "2018-02-16T00:00:00", - "2018-02-20T00:00:00", - "2018-02-21T00:00:00", - "2018-02-22T00:00:00", - "2018-02-23T00:00:00", - "2018-02-26T00:00:00", - "2018-02-27T00:00:00", - "2018-02-28T00:00:00", - "2018-03-01T00:00:00", - "2018-03-02T00:00:00", - "2018-03-05T00:00:00", - "2018-03-06T00:00:00", - "2018-03-07T00:00:00", - "2018-03-08T00:00:00", - "2018-03-09T00:00:00", - "2018-03-12T00:00:00", - "2018-03-13T00:00:00", - "2018-03-14T00:00:00", - "2018-03-15T00:00:00", - "2018-03-16T00:00:00", - "2018-03-19T00:00:00", - "2018-03-20T00:00:00", - "2018-03-21T00:00:00", - "2018-03-22T00:00:00", - "2018-03-23T00:00:00", - "2018-03-26T00:00:00", - "2018-03-27T00:00:00", - "2018-03-28T00:00:00", - "2018-03-29T00:00:00", - "2018-04-02T00:00:00", - "2018-04-03T00:00:00", - "2018-04-04T00:00:00", - "2018-04-05T00:00:00", - "2018-04-06T00:00:00", - "2018-04-09T00:00:00", - "2018-04-10T00:00:00", - "2018-04-11T00:00:00", - "2018-04-12T00:00:00", - "2018-04-13T00:00:00", - "2018-04-16T00:00:00", - "2018-04-17T00:00:00", - "2018-04-18T00:00:00", - "2018-04-19T00:00:00", - "2018-04-20T00:00:00", - "2018-04-23T00:00:00", - "2018-04-24T00:00:00", - "2018-04-25T00:00:00", - "2018-04-26T00:00:00", - "2018-04-27T00:00:00", - "2018-04-30T00:00:00", - "2018-05-01T00:00:00", - "2018-05-02T00:00:00", - "2018-05-03T00:00:00", - "2018-05-04T00:00:00", - "2018-05-07T00:00:00", - "2018-05-08T00:00:00", - "2018-05-09T00:00:00", - "2018-05-10T00:00:00", - "2018-05-11T00:00:00", - "2018-05-14T00:00:00", - "2018-05-15T00:00:00", - "2018-05-16T00:00:00", - "2018-05-17T00:00:00", - "2018-05-18T00:00:00", - "2018-05-21T00:00:00", - "2018-05-22T00:00:00", - "2018-05-23T00:00:00", - "2018-05-24T00:00:00", - "2018-05-25T00:00:00", - "2018-05-28T00:00:00", - "2018-05-29T00:00:00", - "2018-05-30T00:00:00", - "2018-05-31T00:00:00", - "2018-06-01T00:00:00", - "2018-06-04T00:00:00", - "2018-06-05T00:00:00", - "2018-06-06T00:00:00", - "2018-06-07T00:00:00", - "2018-06-08T00:00:00", - "2018-06-11T00:00:00", - "2018-06-12T00:00:00", - "2018-06-13T00:00:00", - "2018-06-14T00:00:00", - "2018-06-15T00:00:00", - "2018-06-18T00:00:00", - "2018-06-19T00:00:00", - "2018-06-20T00:00:00", - "2018-06-21T00:00:00", - "2018-06-22T00:00:00", - "2018-06-25T00:00:00", - "2018-06-26T00:00:00", - "2018-06-27T00:00:00", - "2018-06-28T00:00:00", - "2018-06-29T00:00:00", - "2018-07-02T00:00:00", - "2018-07-03T00:00:00", - "2018-07-05T00:00:00", - "2018-07-06T00:00:00", - "2018-07-09T00:00:00", - "2018-07-10T00:00:00", - "2018-07-11T00:00:00", - "2018-07-12T00:00:00", - "2018-07-13T00:00:00", - "2018-07-16T00:00:00", - "2018-07-17T00:00:00", - "2018-07-18T00:00:00", - "2018-07-19T00:00:00", - "2018-07-20T00:00:00", - "2018-07-23T00:00:00", - "2018-07-24T00:00:00", - "2018-07-25T00:00:00", - "2018-07-26T00:00:00", - "2018-07-27T00:00:00", - "2018-07-30T00:00:00", - "2018-07-31T00:00:00", - "2018-08-01T00:00:00", - "2018-08-02T00:00:00", - "2018-08-03T00:00:00", - "2018-08-06T00:00:00", - "2018-08-07T00:00:00", - "2018-08-08T00:00:00", - "2018-08-09T00:00:00", - "2018-08-10T00:00:00", - "2018-08-13T00:00:00", - "2018-08-14T00:00:00", - "2018-08-15T00:00:00", - "2018-08-16T00:00:00", - "2018-08-17T00:00:00", - "2018-08-20T00:00:00", - "2018-08-21T00:00:00", - "2018-08-22T00:00:00", - "2018-08-23T00:00:00", - "2018-08-24T00:00:00", - "2018-08-27T00:00:00", - "2018-08-28T00:00:00", - "2018-08-29T00:00:00", - "2018-08-30T00:00:00", - "2018-08-31T00:00:00", - "2018-09-03T00:00:00", - "2018-09-04T00:00:00", - "2018-09-05T00:00:00", - "2018-09-06T00:00:00", - "2018-09-07T00:00:00", - "2018-09-10T00:00:00", - "2018-09-11T00:00:00", - "2018-09-12T00:00:00", - "2018-09-13T00:00:00", - "2018-09-14T00:00:00", - "2018-09-17T00:00:00", - "2018-09-18T00:00:00", - "2018-09-19T00:00:00", - "2018-09-20T00:00:00", - "2018-09-21T00:00:00", - "2018-09-24T00:00:00", - "2018-09-25T00:00:00", - "2018-09-26T00:00:00", - "2018-09-27T00:00:00", - "2018-09-28T00:00:00", - "2018-10-01T00:00:00", - "2018-10-02T00:00:00", - "2018-10-03T00:00:00", - "2018-10-04T00:00:00", - "2018-10-05T00:00:00", - "2018-10-08T00:00:00", - "2018-10-09T00:00:00", - "2018-10-10T00:00:00", - "2018-10-11T00:00:00", - "2018-10-12T00:00:00", - "2018-10-15T00:00:00", - "2018-10-16T00:00:00", - "2018-10-17T00:00:00", - "2018-10-18T00:00:00", - "2018-10-19T00:00:00", - "2018-10-22T00:00:00", - "2018-10-23T00:00:00", - "2018-10-24T00:00:00", - "2018-10-25T00:00:00", - "2018-10-26T00:00:00", - "2018-10-29T00:00:00", - "2018-10-30T00:00:00", - "2018-10-31T00:00:00", - "2018-11-01T00:00:00", - "2018-11-02T00:00:00", - "2018-11-05T00:00:00", - "2018-11-06T00:00:00", - "2018-11-07T00:00:00", - "2018-11-08T00:00:00", - "2018-11-09T00:00:00", - "2018-11-12T00:00:00", - "2018-11-13T00:00:00", - "2018-11-14T00:00:00", - "2018-11-15T00:00:00", - "2018-11-16T00:00:00", - "2018-11-19T00:00:00", - "2018-11-20T00:00:00", - "2018-11-21T00:00:00", - "2018-11-23T00:00:00", - "2018-11-26T00:00:00", - "2018-11-27T00:00:00", - "2018-11-28T00:00:00", - "2018-11-29T00:00:00", - "2018-11-30T00:00:00", - "2018-12-03T00:00:00", - "2018-12-04T00:00:00", - "2018-12-06T00:00:00", - "2018-12-07T00:00:00", - "2018-12-10T00:00:00", - "2018-12-11T00:00:00", - "2018-12-12T00:00:00", - "2018-12-13T00:00:00", - "2018-12-14T00:00:00", - "2018-12-17T00:00:00", - "2018-12-18T00:00:00", - "2018-12-19T00:00:00", - "2018-12-20T00:00:00", - "2018-12-21T00:00:00", - "2018-12-24T00:00:00", - "2018-12-26T00:00:00", - "2018-12-27T00:00:00", - "2018-12-28T00:00:00", - "2018-12-31T00:00:00", - "2019-01-01T00:00:00", - "2019-01-02T00:00:00", - "2019-01-04T00:00:00", - "2019-01-08T00:00:00", - "2019-01-09T00:00:00", - "2019-01-10T00:00:00", - "2019-01-11T00:00:00", - "2019-01-16T00:00:00", - "2019-01-18T00:00:00", - "2019-01-22T00:00:00", - "2019-01-23T00:00:00", - "2019-01-24T00:00:00", - "2019-01-28T00:00:00", - "2019-01-29T00:00:00", - "2019-01-30T00:00:00", - "2019-01-31T00:00:00", - "2019-02-01T00:00:00", - "2019-02-04T00:00:00", - "2019-02-05T00:00:00", - "2019-02-06T00:00:00", - "2019-02-07T00:00:00", - "2019-02-08T00:00:00", - "2019-02-11T00:00:00", - "2019-02-12T00:00:00", - "2019-02-13T00:00:00", - "2019-02-14T00:00:00", - "2019-02-15T00:00:00", - "2019-02-18T00:00:00", - "2019-02-19T00:00:00", - "2019-02-20T00:00:00", - "2019-02-21T00:00:00", - "2019-02-22T00:00:00", - "2019-02-25T00:00:00", - "2019-02-26T00:00:00", - "2019-02-27T00:00:00", - "2019-02-28T00:00:00", - "2019-03-01T00:00:00", - "2019-03-04T00:00:00", - "2019-03-05T00:00:00", - "2019-03-06T00:00:00", - "2019-03-07T00:00:00", - "2019-03-08T00:00:00", - "2019-03-11T00:00:00", - "2019-03-12T00:00:00", - "2019-03-13T00:00:00", - "2019-03-14T00:00:00", - "2019-03-15T00:00:00", - "2019-03-18T00:00:00", - "2019-03-19T00:00:00", - "2019-03-20T00:00:00", - "2019-03-21T00:00:00", - "2019-03-22T00:00:00", - "2019-03-25T00:00:00", - "2019-03-26T00:00:00", - "2019-03-27T00:00:00", - "2019-03-28T00:00:00", - "2019-03-29T00:00:00", - "2019-04-01T00:00:00", - "2019-04-02T00:00:00", - "2019-04-03T00:00:00", - "2019-04-04T00:00:00", - "2019-04-05T00:00:00", - "2019-04-08T00:00:00", - "2019-04-09T00:00:00", - "2019-04-10T00:00:00", - "2019-04-11T00:00:00", - "2019-04-12T00:00:00", - "2019-04-15T00:00:00", - "2019-04-16T00:00:00", - "2019-04-17T00:00:00", - "2019-04-18T00:00:00", - "2019-04-19T00:00:00", - "2019-04-22T00:00:00", - "2019-04-23T00:00:00", - "2019-04-24T00:00:00", - "2019-04-25T00:00:00", - "2019-04-26T00:00:00", - "2019-04-29T00:00:00", - "2019-04-30T00:00:00", - "2019-05-01T00:00:00", - "2019-05-02T00:00:00", - "2019-05-03T00:00:00", - "2019-05-06T00:00:00", - "2019-05-07T00:00:00", - "2019-05-08T00:00:00", - "2019-05-09T00:00:00", - "2019-05-10T00:00:00", - "2019-05-13T00:00:00", - "2019-05-14T00:00:00", - "2019-05-15T00:00:00", - "2019-05-16T00:00:00", - "2019-05-17T00:00:00", - "2019-05-20T00:00:00", - "2019-05-21T00:00:00", - "2019-05-22T00:00:00", - "2019-05-23T00:00:00", - "2019-05-24T00:00:00", - "2019-05-28T00:00:00", - "2019-05-29T00:00:00", - "2019-05-30T00:00:00", - "2019-05-31T00:00:00", - "2019-06-03T00:00:00", - "2019-06-04T00:00:00", - "2019-06-05T00:00:00", - "2019-06-06T00:00:00", - "2019-06-07T00:00:00", - "2019-06-10T00:00:00", - "2019-06-11T00:00:00", - "2019-06-12T00:00:00", - "2019-06-13T00:00:00", - "2019-06-14T00:00:00", - "2019-06-17T00:00:00", - "2019-06-18T00:00:00", - "2019-06-19T00:00:00", - "2019-06-20T00:00:00", - "2019-06-21T00:00:00", - "2019-06-24T00:00:00", - "2019-06-25T00:00:00", - "2019-06-26T00:00:00", - "2019-06-27T00:00:00", - "2019-06-28T00:00:00", - "2019-07-01T00:00:00", - "2019-07-02T00:00:00", - "2019-07-03T00:00:00", - "2019-07-04T00:00:00", - "2019-07-05T00:00:00", - "2019-07-08T00:00:00", - "2019-07-09T00:00:00", - "2019-07-10T00:00:00", - "2019-07-11T00:00:00", - "2019-07-12T00:00:00", - "2019-07-15T00:00:00", - "2019-07-16T00:00:00", - "2019-07-17T00:00:00", - "2019-07-18T00:00:00", - "2019-07-19T00:00:00", - "2019-07-22T00:00:00", - "2019-07-23T00:00:00", - "2019-07-24T00:00:00", - "2019-07-25T00:00:00", - "2019-07-26T00:00:00", - "2019-07-29T00:00:00", - "2019-07-30T00:00:00", - "2019-07-31T00:00:00", - "2019-08-01T00:00:00", - "2019-08-02T00:00:00", - "2019-08-05T00:00:00", - "2019-08-06T00:00:00", - "2019-08-07T00:00:00", - "2019-08-08T00:00:00", - "2019-08-09T00:00:00", - "2019-08-12T00:00:00", - "2019-08-13T00:00:00", - "2019-08-14T00:00:00", - "2019-08-15T00:00:00", - "2019-08-16T00:00:00", - "2019-08-19T00:00:00", - "2019-08-20T00:00:00", - "2019-08-21T00:00:00", - "2019-08-22T00:00:00", - "2019-08-23T00:00:00", - "2019-08-26T00:00:00", - "2019-08-27T00:00:00", - "2019-08-28T00:00:00", - "2019-08-29T00:00:00", - "2019-08-30T00:00:00", - "2019-09-03T00:00:00", - "2019-09-04T00:00:00", - "2019-09-05T00:00:00", - "2019-09-06T00:00:00", - "2019-09-09T00:00:00", - "2019-09-10T00:00:00", - "2019-09-11T00:00:00", - "2019-09-12T00:00:00", - "2019-09-13T00:00:00", - "2019-09-16T00:00:00", - "2019-09-17T00:00:00", - "2019-09-18T00:00:00", - "2019-09-19T00:00:00", - "2019-09-20T00:00:00", - "2019-09-23T00:00:00", - "2019-09-24T00:00:00", - "2019-09-25T00:00:00", - "2019-09-26T00:00:00", - "2019-09-27T00:00:00", - "2019-09-30T00:00:00", - "2019-10-01T00:00:00", - "2019-10-02T00:00:00", - "2019-10-03T00:00:00", - "2019-10-04T00:00:00", - "2019-10-07T00:00:00", - "2019-10-08T00:00:00", - "2019-10-09T00:00:00", - "2019-10-10T00:00:00", - "2019-10-11T00:00:00", - "2019-10-14T00:00:00", - "2019-10-15T00:00:00", - "2019-10-16T00:00:00", - "2019-10-17T00:00:00", - "2019-10-18T00:00:00", - "2019-10-21T00:00:00", - "2019-10-22T00:00:00", - "2019-10-23T00:00:00", - "2019-10-24T00:00:00", - "2019-10-25T00:00:00", - "2019-10-28T00:00:00", - "2019-10-29T00:00:00", - "2019-10-30T00:00:00", - "2019-10-31T00:00:00", - "2019-11-01T00:00:00", - "2019-11-04T00:00:00", - "2019-11-05T00:00:00", - "2019-11-06T00:00:00", - "2019-11-07T00:00:00", - "2019-11-08T00:00:00", - "2019-11-11T00:00:00", - "2019-11-12T00:00:00", - "2019-11-13T00:00:00", - "2019-11-14T00:00:00", - "2019-11-15T00:00:00", - "2019-11-18T00:00:00", - "2019-11-19T00:00:00", - "2019-11-20T00:00:00", - "2019-11-21T00:00:00", - "2019-11-22T00:00:00", - "2019-11-25T00:00:00", - "2019-11-26T00:00:00", - "2019-11-27T00:00:00", - "2019-11-28T00:00:00", - "2019-11-29T00:00:00", - "2019-12-02T00:00:00", - "2019-12-03T00:00:00", - "2019-12-04T00:00:00", - "2019-12-05T00:00:00", - "2019-12-06T00:00:00", - "2019-12-09T00:00:00", - "2019-12-10T00:00:00", - "2019-12-11T00:00:00", - "2019-12-12T00:00:00", - "2019-12-13T00:00:00", - "2019-12-16T00:00:00", - "2019-12-17T00:00:00", - "2019-12-18T00:00:00", - "2019-12-19T00:00:00", - "2019-12-20T00:00:00", - "2019-12-23T00:00:00", - "2019-12-24T00:00:00", - "2019-12-26T00:00:00", - "2019-12-27T00:00:00", - "2019-12-30T00:00:00", - "2019-12-31T00:00:00", - "2020-01-01T00:00:00", - "2020-01-02T00:00:00", - "2020-01-06T00:00:00", - "2020-01-07T00:00:00", - "2020-01-08T00:00:00", - "2020-01-09T00:00:00", - "2020-01-10T00:00:00", - "2020-01-13T00:00:00", - "2020-01-14T00:00:00", - "2020-01-15T00:00:00", - "2020-01-16T00:00:00", - "2020-01-17T00:00:00", - "2020-01-21T00:00:00", - "2020-01-22T00:00:00", - "2020-01-23T00:00:00", - "2020-01-24T00:00:00", - "2020-01-27T00:00:00", - "2020-01-28T00:00:00", - "2020-01-29T00:00:00", - "2020-01-30T00:00:00", - "2020-01-31T00:00:00", - "2020-02-03T00:00:00", - "2020-02-04T00:00:00", - "2020-02-05T00:00:00", - "2020-02-06T00:00:00", - "2020-02-07T00:00:00", - "2020-02-10T00:00:00", - "2020-02-11T00:00:00", - "2020-02-12T00:00:00", - "2020-02-13T00:00:00", - "2020-02-14T00:00:00", - "2020-02-18T00:00:00", - "2020-02-19T00:00:00", - "2020-02-20T00:00:00", - "2020-02-21T00:00:00", - "2020-02-24T00:00:00", - "2020-02-25T00:00:00", - "2020-02-26T00:00:00", - "2020-02-27T00:00:00", - "2020-02-28T00:00:00", - "2020-03-02T00:00:00", - "2020-03-03T00:00:00", - "2020-03-04T00:00:00", - "2020-03-05T00:00:00", - "2020-03-06T00:00:00", - "2020-03-09T00:00:00", - "2020-03-10T00:00:00", - "2020-03-11T00:00:00", - "2020-03-12T00:00:00", - "2020-03-13T00:00:00", - "2020-03-16T00:00:00", - "2020-03-17T00:00:00", - "2020-03-18T00:00:00", - "2020-03-19T00:00:00", - "2020-03-20T00:00:00", - "2020-03-23T00:00:00", - "2020-03-24T00:00:00", - "2020-03-25T00:00:00", - "2020-03-26T00:00:00", - "2020-03-27T00:00:00", - "2020-03-30T00:00:00", - "2020-03-31T00:00:00", - "2020-04-01T00:00:00", - "2020-04-02T00:00:00", - "2020-04-03T00:00:00", - "2020-04-06T00:00:00", - "2020-04-07T00:00:00", - "2020-04-08T00:00:00", - "2020-04-09T00:00:00", - "2020-04-13T00:00:00", - "2020-04-14T00:00:00", - "2020-04-15T00:00:00", - "2020-04-16T00:00:00", - "2020-04-17T00:00:00", - "2020-04-20T00:00:00", - "2020-04-21T00:00:00", - "2020-04-22T00:00:00", - "2020-04-23T00:00:00", - "2020-04-24T00:00:00", - "2020-04-27T00:00:00", - "2020-04-28T00:00:00", - "2020-04-29T00:00:00", - "2020-04-30T00:00:00", - "2020-05-01T00:00:00", - "2020-05-04T00:00:00", - "2020-05-05T00:00:00", - "2020-05-06T00:00:00", - "2020-05-07T00:00:00", - "2020-05-08T00:00:00", - "2020-05-11T00:00:00", - "2020-05-12T00:00:00", - "2020-05-13T00:00:00", - "2020-05-14T00:00:00", - "2020-05-15T00:00:00", - "2020-05-18T00:00:00", - "2020-05-19T00:00:00", - "2020-05-20T00:00:00", - "2020-05-21T00:00:00", - "2020-05-22T00:00:00", - "2020-05-26T00:00:00", - "2020-05-27T00:00:00", - "2020-05-28T00:00:00", - "2020-05-29T00:00:00", - "2020-06-01T00:00:00", - "2020-06-02T00:00:00", - "2020-06-03T00:00:00", - "2020-06-04T00:00:00", - "2020-06-05T00:00:00", - "2020-06-08T00:00:00", - "2020-06-09T00:00:00", - "2020-06-10T00:00:00", - "2020-06-11T00:00:00", - "2020-06-12T00:00:00", - "2020-06-15T00:00:00", - "2020-06-16T00:00:00", - "2020-06-17T00:00:00", - "2020-06-18T00:00:00", - "2020-06-19T00:00:00", - "2020-06-22T00:00:00", - "2020-06-23T00:00:00", - "2020-06-24T00:00:00", - "2020-06-25T00:00:00", - "2020-06-26T00:00:00", - "2020-06-29T00:00:00", - "2020-06-30T00:00:00", - "2020-07-01T00:00:00", - "2020-07-02T00:00:00", - "2020-07-06T00:00:00", - "2020-07-07T00:00:00", - "2020-07-08T00:00:00", - "2020-07-09T00:00:00", - "2020-07-10T00:00:00", - "2020-07-13T00:00:00", - "2020-07-14T00:00:00", - "2020-07-15T00:00:00", - "2020-07-16T00:00:00", - "2020-07-17T00:00:00", - "2020-07-20T00:00:00", - "2020-07-21T00:00:00", - "2020-07-22T00:00:00", - "2020-07-23T00:00:00", - "2020-07-24T00:00:00", - "2020-07-27T00:00:00", - "2020-07-28T00:00:00", - "2020-07-29T00:00:00", - "2020-07-30T00:00:00", - "2020-07-31T00:00:00", - "2020-08-03T00:00:00", - "2020-08-04T00:00:00", - "2020-08-05T00:00:00", - "2020-08-06T00:00:00", - "2020-08-07T00:00:00", - "2020-08-10T00:00:00", - "2020-08-11T00:00:00", - "2020-08-12T00:00:00", - "2020-08-13T00:00:00", - "2020-08-14T00:00:00", - "2020-08-17T00:00:00", - "2020-08-18T00:00:00", - "2020-08-19T00:00:00", - "2020-08-20T00:00:00", - "2020-08-21T00:00:00", - "2020-08-24T00:00:00", - "2020-08-25T00:00:00", - "2020-08-26T00:00:00", - "2020-08-27T00:00:00", - "2020-08-28T00:00:00", - "2020-08-31T00:00:00", - "2020-09-01T00:00:00", - "2020-09-02T00:00:00", - "2020-09-03T00:00:00", - "2020-09-04T00:00:00", - "2020-09-08T00:00:00", - "2020-09-09T00:00:00", - "2020-09-10T00:00:00", - "2020-09-11T00:00:00", - "2020-09-14T00:00:00", - "2020-09-15T00:00:00", - "2020-09-16T00:00:00", - "2020-09-17T00:00:00", - "2020-09-18T00:00:00", - "2020-09-21T00:00:00", - "2020-09-22T00:00:00", - "2020-09-23T00:00:00", - "2020-09-24T00:00:00", - "2020-09-25T00:00:00", - "2020-09-28T00:00:00", - "2020-09-29T00:00:00", - "2020-09-30T00:00:00", - "2020-10-01T00:00:00", - "2020-10-02T00:00:00", - "2020-10-05T00:00:00", - "2020-10-06T00:00:00", - "2020-10-07T00:00:00", - "2020-10-08T00:00:00", - "2020-10-09T00:00:00", - "2020-10-12T00:00:00", - "2020-10-13T00:00:00", - "2020-10-14T00:00:00", - "2020-10-15T00:00:00", - "2020-10-16T00:00:00", - "2020-10-19T00:00:00", - "2020-10-20T00:00:00", - "2020-10-21T00:00:00", - "2020-10-22T00:00:00", - "2020-10-23T00:00:00", - "2020-10-26T00:00:00", - "2020-10-27T00:00:00", - "2020-10-28T00:00:00", - "2020-10-29T00:00:00", - "2020-10-30T00:00:00", - "2020-11-02T00:00:00", - "2020-11-03T00:00:00", - "2020-11-04T00:00:00", - "2020-11-05T00:00:00", - "2020-11-06T00:00:00", - "2020-11-09T00:00:00", - "2020-11-10T00:00:00", - "2020-11-11T00:00:00", - "2020-11-12T00:00:00", - "2020-11-13T00:00:00", - "2020-11-16T00:00:00", - "2020-11-17T00:00:00", - "2020-11-18T00:00:00", - "2020-11-19T00:00:00", - "2020-11-20T00:00:00", - "2020-11-23T00:00:00", - "2020-11-24T00:00:00", - "2020-11-25T00:00:00", - "2020-11-27T00:00:00", - "2020-11-30T00:00:00", - "2020-12-01T00:00:00", - "2020-12-02T00:00:00", - "2020-12-03T00:00:00", - "2020-12-04T00:00:00", - "2020-12-07T00:00:00", - "2020-12-08T00:00:00", - "2020-12-09T00:00:00", - "2020-12-10T00:00:00", - "2020-12-11T00:00:00", - "2020-12-14T00:00:00", - "2020-12-15T00:00:00", - "2020-12-16T00:00:00", - "2020-12-17T00:00:00", - "2020-12-18T00:00:00", - "2020-12-21T00:00:00", - "2020-12-22T00:00:00", - "2020-12-23T00:00:00", - "2020-12-24T00:00:00", - "2020-12-28T00:00:00", - "2020-12-29T00:00:00", - "2020-12-30T00:00:00", - "2020-12-31T00:00:00", - "2021-01-01T00:00:00", - "2021-01-04T00:00:00", - "2021-01-06T00:00:00", - "2021-01-07T00:00:00", - "2021-01-08T00:00:00", - "2021-01-11T00:00:00", - "2021-01-12T00:00:00", - "2021-01-13T00:00:00", - "2021-01-14T00:00:00", - "2021-01-15T00:00:00", - "2021-01-19T00:00:00", - "2021-01-20T00:00:00", - "2021-01-21T00:00:00", - "2021-01-22T00:00:00", - "2021-01-25T00:00:00", - "2021-01-26T00:00:00", - "2021-01-27T00:00:00", - "2021-01-28T00:00:00", - "2021-01-29T00:00:00", - "2021-02-01T00:00:00", - "2021-02-02T00:00:00", - "2021-02-03T00:00:00", - "2021-02-04T00:00:00", - "2021-02-05T00:00:00", - "2021-02-08T00:00:00", - "2021-02-09T00:00:00", - "2021-02-10T00:00:00", - "2021-02-11T00:00:00", - "2021-02-12T00:00:00", - "2021-02-16T00:00:00", - "2021-02-17T00:00:00", - "2021-02-18T00:00:00", - "2021-02-19T00:00:00", - "2021-02-22T00:00:00", - "2021-02-23T00:00:00", - "2021-02-24T00:00:00", - "2021-02-25T00:00:00", - "2021-02-26T00:00:00", - "2021-03-01T00:00:00", - "2021-03-02T00:00:00", - "2021-03-03T00:00:00", - "2021-03-04T00:00:00", - "2021-03-05T00:00:00", - "2021-03-08T00:00:00", - "2021-03-09T00:00:00", - "2021-03-10T00:00:00", - "2021-03-11T00:00:00", - "2021-03-12T00:00:00", - "2021-03-15T00:00:00", - "2021-03-16T00:00:00", - "2021-03-17T00:00:00", - "2021-03-18T00:00:00", - "2021-03-19T00:00:00", - "2021-03-22T00:00:00", - "2021-03-23T00:00:00", - "2021-03-24T00:00:00", - "2021-03-25T00:00:00", - "2021-03-26T00:00:00", - "2021-03-29T00:00:00", - "2021-03-30T00:00:00", - "2021-03-31T00:00:00", - "2021-04-01T00:00:00", - "2021-04-05T00:00:00", - "2021-04-06T00:00:00", - "2021-04-07T00:00:00", - "2021-04-08T00:00:00", - "2021-04-09T00:00:00", - "2021-04-12T00:00:00", - "2021-04-13T00:00:00", - "2021-04-14T00:00:00", - "2021-04-15T00:00:00", - "2021-04-16T00:00:00", - "2021-04-19T00:00:00", - "2021-04-20T00:00:00", - "2021-04-21T00:00:00", - "2021-04-22T00:00:00", - "2021-04-23T00:00:00", - "2021-04-26T00:00:00", - "2021-04-27T00:00:00", - "2021-04-28T00:00:00", - "2021-04-29T00:00:00", - "2021-04-30T00:00:00", - "2021-05-03T00:00:00", - "2021-05-04T00:00:00", - "2021-05-05T00:00:00", - "2021-05-06T00:00:00", - "2021-05-07T00:00:00", - "2021-05-10T00:00:00", - "2021-05-11T00:00:00", - "2021-05-12T00:00:00", - "2021-05-13T00:00:00", - "2021-05-14T00:00:00", - "2021-05-17T00:00:00", - "2021-05-18T00:00:00", - "2021-05-19T00:00:00", - "2021-05-20T00:00:00", - "2021-05-21T00:00:00", - "2021-05-24T00:00:00", - "2021-05-25T00:00:00", - "2021-05-26T00:00:00", - "2021-05-27T00:00:00", - "2021-05-28T00:00:00", - "2021-06-01T00:00:00", - "2021-06-02T00:00:00", - "2021-06-03T00:00:00", - "2021-06-04T00:00:00", - "2021-06-07T00:00:00", - "2021-06-08T00:00:00", - "2021-06-09T00:00:00", - "2021-06-10T00:00:00", - "2021-06-11T00:00:00", - "2021-06-14T00:00:00", - "2021-06-15T00:00:00", - "2021-06-16T00:00:00", - "2021-06-17T00:00:00", - "2021-06-18T00:00:00", - "2021-06-21T00:00:00", - "2021-06-22T00:00:00", - "2021-06-23T00:00:00", - "2021-06-24T00:00:00", - "2021-06-25T00:00:00", - "2021-06-28T00:00:00", - "2021-06-29T00:00:00", - "2021-06-30T00:00:00", - "2021-07-01T00:00:00", - "2021-07-02T00:00:00", - "2021-07-05T00:00:00", - "2021-07-06T00:00:00", - "2021-07-07T00:00:00", - "2021-07-08T00:00:00", - "2021-07-09T00:00:00", - "2021-07-12T00:00:00", - "2021-07-13T00:00:00", - "2021-07-14T00:00:00", - "2021-07-15T00:00:00", - "2021-07-16T00:00:00", - "2021-07-19T00:00:00", - "2021-07-20T00:00:00", - "2021-07-21T00:00:00", - "2021-07-22T00:00:00", - "2021-07-23T00:00:00", - "2021-07-26T00:00:00", - "2021-07-27T00:00:00", - "2021-07-28T00:00:00", - "2021-07-29T00:00:00", - "2021-07-30T00:00:00", - "2021-08-02T00:00:00", - "2021-08-03T00:00:00", - "2021-08-04T00:00:00", - "2021-08-05T00:00:00", - "2021-08-06T00:00:00", - "2021-08-09T00:00:00", - "2021-08-10T00:00:00", - "2021-08-11T00:00:00", - "2021-08-12T00:00:00", - "2021-08-13T00:00:00", - "2021-08-16T00:00:00", - "2021-08-17T00:00:00", - "2021-08-18T00:00:00", - "2021-08-19T00:00:00", - "2021-08-20T00:00:00", - "2021-08-23T00:00:00", - "2021-08-24T00:00:00", - "2021-08-25T00:00:00", - "2021-08-26T00:00:00", - "2021-08-27T00:00:00", - "2021-08-30T00:00:00", - "2021-08-31T00:00:00", - "2021-09-01T00:00:00", - "2021-09-02T00:00:00", - "2021-09-03T00:00:00", - "2021-09-07T00:00:00", - "2021-09-08T00:00:00", - "2021-09-09T00:00:00", - "2021-09-10T00:00:00", - "2021-09-13T00:00:00", - "2021-09-14T00:00:00", - "2021-09-15T00:00:00", - "2021-09-16T00:00:00", - "2021-09-17T00:00:00", - "2021-09-20T00:00:00", - "2021-09-21T00:00:00", - "2021-09-22T00:00:00", - "2021-09-23T00:00:00", - "2021-09-24T00:00:00", - "2021-09-27T00:00:00", - "2021-09-28T00:00:00", - "2021-09-29T00:00:00", - "2021-09-30T00:00:00", - "2021-10-01T00:00:00", - "2021-10-04T00:00:00", - "2021-10-05T00:00:00", - "2021-10-06T00:00:00", - "2021-10-07T00:00:00", - "2021-10-08T00:00:00", - "2021-10-11T00:00:00", - "2021-10-12T00:00:00", - "2021-10-13T00:00:00", - "2021-10-14T00:00:00", - "2021-10-15T00:00:00", - "2021-10-18T00:00:00", - "2021-10-19T00:00:00", - "2021-10-20T00:00:00", - "2021-10-21T00:00:00", - "2021-10-22T00:00:00", - "2021-10-25T00:00:00", - "2021-10-26T00:00:00", - "2021-10-27T00:00:00", - "2021-10-28T00:00:00", - "2021-10-29T00:00:00", - "2021-11-01T00:00:00", - "2021-11-02T00:00:00", - "2021-11-03T00:00:00", - "2021-11-04T00:00:00", - "2021-11-05T00:00:00", - "2021-11-08T00:00:00", - "2021-11-09T00:00:00", - "2021-11-10T00:00:00", - "2021-11-11T00:00:00", - "2021-11-12T00:00:00", - "2021-11-15T00:00:00", - "2021-11-16T00:00:00", - "2021-11-17T00:00:00", - "2021-11-18T00:00:00", - "2021-11-19T00:00:00", - "2021-11-22T00:00:00", - "2021-11-23T00:00:00", - "2021-11-24T00:00:00", - "2021-11-25T00:00:00", - "2021-11-26T00:00:00", - "2021-11-29T00:00:00", - "2021-11-30T00:00:00", - "2021-12-01T00:00:00", - "2021-12-02T00:00:00", - "2021-12-03T00:00:00", - "2021-12-06T00:00:00", - "2021-12-07T00:00:00", - "2021-12-08T00:00:00", - "2021-12-09T00:00:00", - "2021-12-10T00:00:00", - "2021-12-13T00:00:00", - "2021-12-14T00:00:00", - "2021-12-15T00:00:00", - "2021-12-16T00:00:00", - "2021-12-17T00:00:00", - "2021-12-20T00:00:00", - "2021-12-21T00:00:00", - "2021-12-22T00:00:00", - "2021-12-23T00:00:00", - "2021-12-27T00:00:00", - "2021-12-28T00:00:00", - "2021-12-29T00:00:00", - "2021-12-30T00:00:00", - "2021-12-31T00:00:00", - "2022-01-03T00:00:00", - "2022-01-05T00:00:00", - "2022-01-06T00:00:00", - "2022-01-07T00:00:00", - "2022-01-10T00:00:00", - "2022-01-11T00:00:00", - "2022-01-12T00:00:00", - "2022-01-13T00:00:00", - "2022-01-14T00:00:00", - "2022-01-18T00:00:00", - "2022-01-19T00:00:00", - "2022-01-20T00:00:00", - "2022-01-21T00:00:00", - "2022-01-24T00:00:00", - "2022-01-25T00:00:00", - "2022-01-26T00:00:00", - "2022-01-27T00:00:00", - "2022-01-28T00:00:00", - "2022-01-31T00:00:00", - "2022-02-01T00:00:00", - "2022-02-02T00:00:00", - "2022-02-03T00:00:00", - "2022-02-04T00:00:00", - "2022-02-07T00:00:00", - "2022-02-08T00:00:00", - "2022-02-09T00:00:00", - "2022-02-10T00:00:00", - "2022-02-11T00:00:00", - "2022-02-14T00:00:00", - "2022-02-15T00:00:00", - "2022-02-16T00:00:00", - "2022-02-17T00:00:00", - "2022-02-18T00:00:00", - "2022-02-22T00:00:00", - "2022-02-23T00:00:00", - "2022-02-24T00:00:00", - "2022-02-25T00:00:00", - "2022-02-28T00:00:00", - "2022-03-01T00:00:00", - "2022-03-02T00:00:00", - "2022-03-03T00:00:00", - "2022-03-04T00:00:00", - "2022-03-07T00:00:00", - "2022-03-08T00:00:00", - "2022-03-09T00:00:00", - "2022-03-10T00:00:00", - "2022-03-11T00:00:00", - "2022-03-14T00:00:00", - "2022-03-15T00:00:00", - "2022-03-16T00:00:00", - "2022-03-17T00:00:00", - "2022-03-18T00:00:00", - "2022-03-21T00:00:00", - "2022-03-22T00:00:00", - "2022-03-23T00:00:00", - "2022-03-24T00:00:00", - "2022-03-25T00:00:00", - "2022-03-28T00:00:00", - "2022-03-29T00:00:00", - "2022-03-30T00:00:00", - "2022-03-31T00:00:00", - "2022-04-01T00:00:00", - "2022-04-04T00:00:00", - "2022-04-05T00:00:00", - "2022-04-06T00:00:00", - "2022-04-07T00:00:00", - "2022-04-08T00:00:00", - "2022-04-11T00:00:00", - "2022-04-12T00:00:00", - "2022-04-13T00:00:00", - "2022-04-14T00:00:00", - "2022-04-18T00:00:00", - "2022-04-19T00:00:00", - "2022-04-20T00:00:00", - "2022-04-21T00:00:00", - "2022-04-22T00:00:00", - "2022-04-25T00:00:00", - "2022-04-26T00:00:00", - "2022-04-27T00:00:00", - "2022-04-28T00:00:00", - "2022-04-29T00:00:00", - "2022-05-03T00:00:00", - "2022-05-04T00:00:00", - "2022-05-05T00:00:00", - "2022-05-06T00:00:00", - "2022-05-09T00:00:00", - "2022-05-10T00:00:00", - "2022-08-01T00:00:00", - "2022-08-02T00:00:00", - "2022-08-03T00:00:00", - "2022-08-04T00:00:00", - "2022-08-05T00:00:00", - "2022-08-08T00:00:00", - "2022-08-09T00:00:00", - "2022-08-10T00:00:00", - "2022-08-11T00:00:00", - "2022-08-12T00:00:00", - "2022-08-15T00:00:00", - "2022-08-16T00:00:00", - "2022-08-17T00:00:00", - "2022-08-18T00:00:00", - "2022-08-19T00:00:00", - "2022-08-22T00:00:00", - "2022-08-23T00:00:00", - "2022-08-24T00:00:00", - "2022-08-25T00:00:00", - "2022-08-26T00:00:00", - "2022-08-29T00:00:00", - "2022-08-30T00:00:00", - "2022-08-31T00:00:00", - "2022-09-01T00:00:00", - "2022-09-02T00:00:00", - "2022-09-06T00:00:00", - "2022-09-07T00:00:00", - "2022-09-14T00:00:00", - "2022-09-15T00:00:00", - "2022-10-27T00:00:00", - "2022-10-28T00:00:00", - "2022-10-31T00:00:00", - "2022-11-01T00:00:00", - "2022-11-02T00:00:00", - "2022-11-03T00:00:00", - "2022-11-04T00:00:00", - "2022-11-14T00:00:00", - "2022-11-15T00:00:00", - "2022-11-16T00:00:00", - "2022-11-17T00:00:00", - "2022-11-18T00:00:00", - "2022-11-21T00:00:00", - "2022-11-22T00:00:00", - "2022-11-23T00:00:00", - "2022-11-25T00:00:00", - "2022-11-28T00:00:00", - "2022-11-29T00:00:00", - "2022-11-30T00:00:00", - "2022-12-01T00:00:00", - "2022-12-02T00:00:00", - "2022-12-05T00:00:00", - "2022-12-06T00:00:00", - "2022-12-07T00:00:00", - "2022-12-08T00:00:00", - "2022-12-09T00:00:00", - "2022-12-12T00:00:00", - "2022-12-13T00:00:00", - "2022-12-14T00:00:00", - "2022-12-15T00:00:00", - "2022-12-16T00:00:00", - "2022-12-19T00:00:00", - "2022-12-20T00:00:00", - "2022-12-21T00:00:00", - "2022-12-22T00:00:00", - "2022-12-23T00:00:00", - "2022-12-27T00:00:00", - "2022-12-28T00:00:00", - "2022-12-29T00:00:00", - "2022-12-30T00:00:00", - "2023-01-02T00:00:00", - "2023-01-03T00:00:00", - "2023-01-05T00:00:00", - "2023-01-06T00:00:00", - "2023-01-09T00:00:00", - "2023-01-10T00:00:00", - "2023-01-11T00:00:00", - "2023-01-12T00:00:00", - "2023-01-13T00:00:00", - "2023-01-17T00:00:00", - "2023-01-18T00:00:00", - "2023-01-19T00:00:00", - "2023-01-20T00:00:00", - "2023-01-23T00:00:00", - "2023-01-24T00:00:00", - "2023-01-25T00:00:00", - "2023-01-26T00:00:00", - "2023-01-27T00:00:00", - "2023-01-30T00:00:00", - "2023-01-31T00:00:00", - "2023-02-01T00:00:00", - "2023-02-02T00:00:00", - "2023-02-03T00:00:00", - "2023-02-06T00:00:00", - "2023-02-07T00:00:00", - "2023-02-08T00:00:00", - "2023-02-09T00:00:00", - "2023-02-10T00:00:00", - "2023-02-13T00:00:00", - "2023-02-14T00:00:00", - "2023-02-15T00:00:00", - "2023-02-16T00:00:00", - "2023-02-17T00:00:00", - "2023-02-21T00:00:00", - "2023-02-22T00:00:00", - "2023-02-23T00:00:00", - "2023-02-24T00:00:00", - "2023-02-27T00:00:00", - "2023-02-28T00:00:00", - "2023-03-01T00:00:00", - "2023-03-02T00:00:00", - "2023-03-03T00:00:00", - "2023-03-06T00:00:00", - "2023-03-07T00:00:00", - "2023-03-08T00:00:00", - "2023-03-09T00:00:00", - "2023-03-10T00:00:00", - "2023-03-13T00:00:00", - "2023-03-14T00:00:00", - "2023-03-15T00:00:00", - "2023-03-16T00:00:00", - "2023-03-17T00:00:00", - "2023-03-20T00:00:00", - "2023-03-21T00:00:00", - "2023-03-22T00:00:00", - "2023-03-23T00:00:00", - "2023-03-24T00:00:00", - "2023-03-27T00:00:00", - "2023-03-28T00:00:00", - "2023-03-29T00:00:00", - "2023-03-30T00:00:00", - "2023-03-31T00:00:00", - "2023-04-03T00:00:00", - "2023-04-04T00:00:00", - "2023-04-05T00:00:00", - "2023-04-06T00:00:00", - "2023-04-07T00:00:00", - "2023-04-10T00:00:00", - "2023-04-11T00:00:00", - "2023-04-12T00:00:00", - "2023-04-13T00:00:00", - "2023-04-14T00:00:00", - "2023-04-17T00:00:00", - "2023-04-18T00:00:00", - "2023-04-19T00:00:00", - "2023-04-20T00:00:00", - "2023-04-21T00:00:00", - "2023-04-24T00:00:00", - "2023-04-25T00:00:00", - "2023-04-26T00:00:00", - "2023-04-27T00:00:00", - "2023-04-28T00:00:00", - "2023-05-01T00:00:00", - "2023-05-02T00:00:00", - "2023-05-03T00:00:00", - "2023-05-04T00:00:00", - "2023-05-05T00:00:00", - "2023-05-08T00:00:00", - "2023-05-09T00:00:00", - "2023-05-10T00:00:00", - "2023-05-11T00:00:00", - "2023-05-12T00:00:00", - "2023-05-15T00:00:00", - "2023-05-16T00:00:00", - "2023-05-17T00:00:00", - "2023-05-18T00:00:00", - "2023-05-19T00:00:00", - "2023-05-22T00:00:00", - "2023-05-23T00:00:00", - "2023-05-24T00:00:00", - "2023-05-25T00:00:00", - "2023-05-26T00:00:00", - "2023-05-30T00:00:00", - "2023-05-31T00:00:00", - "2023-06-01T00:00:00", - "2023-06-02T00:00:00", - "2023-06-05T00:00:00", - "2023-06-06T00:00:00", - "2023-06-07T00:00:00", - "2023-06-08T00:00:00", - "2023-06-09T00:00:00", - "2023-06-12T00:00:00", - "2023-06-13T00:00:00", - "2023-06-14T00:00:00", - "2023-06-15T00:00:00", - "2023-06-16T00:00:00", - "2023-06-19T00:00:00", - "2023-06-20T00:00:00", - "2023-06-21T00:00:00", - "2023-06-22T00:00:00", - "2023-06-23T00:00:00", - "2023-06-26T00:00:00", - "2023-06-27T00:00:00", - "2023-06-28T00:00:00", - "2023-06-29T00:00:00", - "2023-06-30T00:00:00", - "2023-07-03T00:00:00", - "2023-07-05T00:00:00", - "2023-07-06T00:00:00", - "2023-07-07T00:00:00", - "2023-07-10T00:00:00", - "2023-07-11T00:00:00", - "2023-07-12T00:00:00", - "2023-07-13T00:00:00", - "2023-07-14T00:00:00", - "2023-07-17T00:00:00", - "2023-07-18T00:00:00", - "2023-07-19T00:00:00", - "2023-07-20T00:00:00", - "2023-07-21T00:00:00", - "2023-07-24T00:00:00", - "2023-07-25T00:00:00", - "2023-07-26T00:00:00", - "2023-07-27T00:00:00", - "2023-07-28T00:00:00", - "2023-07-31T00:00:00", - "2023-08-01T00:00:00", - "2023-08-02T00:00:00", - "2023-08-03T00:00:00", - "2023-08-04T00:00:00", - "2023-08-07T00:00:00", - "2023-08-08T00:00:00", - "2023-08-09T00:00:00", - "2023-08-10T00:00:00", - "2023-08-11T00:00:00", - "2023-08-14T00:00:00", - "2023-08-15T00:00:00", - "2023-08-16T00:00:00", - "2023-08-17T00:00:00", - "2023-08-18T00:00:00", - "2023-08-21T00:00:00", - "2023-08-22T00:00:00", - "2023-08-23T00:00:00", - "2023-08-24T00:00:00", - "2023-08-25T00:00:00", - "2023-08-28T00:00:00", - "2023-08-29T00:00:00", - "2023-08-30T00:00:00", - "2023-08-31T00:00:00", - "2023-09-01T00:00:00", - "2023-09-05T00:00:00", - "2023-09-06T00:00:00", - "2023-09-07T00:00:00", - "2023-09-08T00:00:00", - "2023-09-11T00:00:00", - "2023-09-12T00:00:00", - "2023-09-13T00:00:00", - "2023-09-14T00:00:00", - "2023-09-15T00:00:00", - "2023-09-18T00:00:00", - "2023-09-19T00:00:00", - "2023-09-20T00:00:00", - "2023-09-21T00:00:00", - "2023-09-22T00:00:00", - "2023-09-25T00:00:00", - "2023-09-26T00:00:00", - "2023-09-27T00:00:00", - "2023-09-28T00:00:00", - "2023-09-29T00:00:00", - "2023-10-02T00:00:00", - "2023-10-03T00:00:00", - "2023-10-04T00:00:00", - "2023-10-05T00:00:00", - "2023-10-06T00:00:00", - "2023-10-09T00:00:00", - "2023-10-10T00:00:00", - "2023-10-11T00:00:00", - "2023-10-12T00:00:00", - "2023-10-13T00:00:00", - "2023-10-16T00:00:00", - "2023-10-17T00:00:00", - "2023-10-18T00:00:00", - "2023-10-19T00:00:00", - "2023-10-20T00:00:00", - "2023-10-23T00:00:00", - "2023-10-24T00:00:00", - "2023-10-25T00:00:00", - "2023-10-26T00:00:00", - "2023-10-27T00:00:00", - "2023-10-30T00:00:00", - "2023-10-31T00:00:00", - "2023-11-01T00:00:00", - "2023-11-02T00:00:00", - "2023-11-03T00:00:00", - "2023-11-06T00:00:00", - "2023-11-07T00:00:00", - "2023-11-08T00:00:00", - "2023-11-09T00:00:00", - "2023-11-10T00:00:00", - "2023-11-13T00:00:00", - "2023-11-14T00:00:00", - "2023-11-15T00:00:00", - "2023-11-16T00:00:00", - "2023-11-17T00:00:00", - "2023-11-20T00:00:00", - "2023-11-21T00:00:00", - "2023-11-22T00:00:00", - "2023-11-23T00:00:00", - "2023-11-24T00:00:00", - "2023-11-27T00:00:00", - "2023-11-28T00:00:00", - "2023-11-29T00:00:00", - "2023-11-30T00:00:00", - "2023-12-01T00:00:00", - "2023-12-04T00:00:00", - "2023-12-05T00:00:00", - "2023-12-06T00:00:00", - "2023-12-07T00:00:00", - "2023-12-08T00:00:00", - "2023-12-11T00:00:00", - "2023-12-12T00:00:00", - "2023-12-13T00:00:00", - "2023-12-14T00:00:00", - "2023-12-15T00:00:00", - "2023-12-18T00:00:00", - "2023-12-19T00:00:00", - "2023-12-20T00:00:00", - "2023-12-21T00:00:00", - "2023-12-22T00:00:00", - "2023-12-25T00:00:00", - "2023-12-26T00:00:00", - "2023-12-27T00:00:00", - "2023-12-28T00:00:00", - "2023-12-29T00:00:00", - "2024-01-01T00:00:00", - "2024-01-02T00:00:00", - "2024-01-04T00:00:00", - "2024-01-05T00:00:00", - "2024-01-08T00:00:00", - "2024-01-09T00:00:00", - "2024-01-10T00:00:00", - "2024-01-11T00:00:00", - "2024-01-12T00:00:00", - "2024-01-15T00:00:00", - "2024-01-16T00:00:00", - "2024-01-17T00:00:00", - "2024-01-18T00:00:00", - "2024-01-19T00:00:00", - "2024-01-22T00:00:00", - "2024-01-23T00:00:00", - "2024-01-24T00:00:00", - "2024-01-25T00:00:00", - "2024-01-26T00:00:00", - "2024-01-29T00:00:00", - "2024-01-30T00:00:00", - "2024-01-31T00:00:00", - "2024-02-01T00:00:00", - "2024-02-02T00:00:00", - "2024-02-05T00:00:00", - "2024-02-06T00:00:00", - "2024-02-07T00:00:00", - "2024-02-08T00:00:00", - "2024-02-09T00:00:00", - "2024-02-12T00:00:00", - "2024-02-13T00:00:00", - "2024-02-14T00:00:00", - "2024-02-15T00:00:00", - "2024-02-16T00:00:00", - "2024-02-20T00:00:00", - "2024-02-21T00:00:00", - "2024-02-22T00:00:00", - "2024-02-23T00:00:00", - "2024-02-26T00:00:00", - "2024-02-27T00:00:00", - "2024-02-28T00:00:00", - "2024-02-29T00:00:00", - "2024-03-01T00:00:00", - "2024-03-04T00:00:00", - "2024-03-05T00:00:00", - "2024-03-06T00:00:00", - "2024-03-07T00:00:00", - "2024-03-08T00:00:00", - "2024-03-11T00:00:00", - "2024-03-12T00:00:00", - "2024-03-13T00:00:00", - "2024-03-14T00:00:00", - "2024-03-15T00:00:00", - "2024-03-18T00:00:00", - "2024-03-19T00:00:00", - "2024-03-20T00:00:00", - "2024-03-21T00:00:00", - "2024-03-22T00:00:00", - "2024-03-25T00:00:00", - "2024-03-26T00:00:00", - "2024-03-27T00:00:00", - "2024-03-28T00:00:00", - "2024-04-01T00:00:00", - "2024-04-02T00:00:00", - "2024-04-03T00:00:00", - "2024-04-04T00:00:00", - "2024-04-05T00:00:00", - "2024-04-08T00:00:00", - "2024-04-09T00:00:00", - "2024-04-10T00:00:00", - "2024-04-11T00:00:00", - "2024-04-12T00:00:00", - "2024-04-15T00:00:00", - "2024-04-16T00:00:00", - "2024-04-17T00:00:00", - "2024-04-18T00:00:00", - "2024-04-19T00:00:00", - "2024-04-22T00:00:00", - "2024-04-23T00:00:00", - "2024-04-24T00:00:00", - "2024-04-25T00:00:00", - "2024-04-26T00:00:00", - "2024-04-29T00:00:00", - "2024-04-30T00:00:00", - "2024-05-01T00:00:00", - "2024-05-02T00:00:00", - "2024-05-03T00:00:00", - "2024-05-06T00:00:00", - "2024-05-07T00:00:00", - "2024-05-08T00:00:00", - "2024-05-09T00:00:00", - "2024-05-10T00:00:00", - "2024-05-13T00:00:00", - "2024-05-14T00:00:00", - "2024-05-15T00:00:00", - "2024-05-16T00:00:00", - "2024-05-17T00:00:00", - "2024-05-20T00:00:00", - "2024-05-21T00:00:00", - "2024-05-22T00:00:00", - "2024-05-23T00:00:00", - "2024-05-24T00:00:00", - "2024-05-28T00:00:00", - "2024-05-29T00:00:00", - "2024-05-30T00:00:00", - "2024-05-31T00:00:00", - "2024-06-03T00:00:00", - "2024-06-04T00:00:00", - "2024-06-05T00:00:00", - "2024-06-06T00:00:00", - "2024-06-07T00:00:00", - "2024-06-10T00:00:00", - "2024-06-11T00:00:00", - "2024-06-12T00:00:00", - "2024-06-13T00:00:00", - "2024-06-14T00:00:00", - "2024-06-17T00:00:00", - "2024-06-18T00:00:00", - "2024-06-20T00:00:00", - "2024-06-21T00:00:00", - "2024-06-24T00:00:00", - "2024-06-25T00:00:00", - "2024-06-26T00:00:00", - "2024-06-27T00:00:00", - "2024-06-28T00:00:00", - "2024-07-01T00:00:00", - "2024-07-02T00:00:00", - "2024-07-03T00:00:00", - "2024-07-05T00:00:00", - "2024-07-08T00:00:00", - "2024-07-09T00:00:00", - "2024-07-10T00:00:00", - "2024-07-11T00:00:00", - "2024-07-12T00:00:00", - "2024-07-15T00:00:00", - "2024-07-16T00:00:00", - "2024-07-17T00:00:00", - "2024-07-18T00:00:00", - "2024-07-19T00:00:00", - "2024-07-22T00:00:00", - "2024-07-23T00:00:00", - "2024-07-24T00:00:00", - "2024-07-25T00:00:00", - "2024-07-26T00:00:00", - "2024-07-29T00:00:00", - "2024-07-30T00:00:00", - "2024-07-31T00:00:00", - "2024-08-01T00:00:00", - "2024-08-02T00:00:00", - "2024-08-05T00:00:00", - "2024-08-06T00:00:00", - "2024-08-07T00:00:00", - "2024-08-08T00:00:00", - "2024-08-09T00:00:00", - "2024-08-12T00:00:00", - "2024-08-13T00:00:00", - "2024-08-14T00:00:00", - "2024-08-15T00:00:00", - "2024-08-16T00:00:00", - "2024-08-19T00:00:00", - "2024-08-20T00:00:00", - "2024-08-21T00:00:00", - "2024-08-22T00:00:00", - "2024-08-23T00:00:00", - "2024-08-26T00:00:00", - "2024-08-27T00:00:00", - "2024-08-28T00:00:00", - "2024-08-29T00:00:00", - "2024-08-30T00:00:00", - "2024-09-03T00:00:00", - "2024-09-04T00:00:00", - "2024-09-05T00:00:00", - "2024-09-06T00:00:00", - "2024-09-09T00:00:00", - "2024-09-10T00:00:00", - "2024-09-11T00:00:00", - "2024-09-12T00:00:00", - "2024-09-13T00:00:00", - "2024-09-16T00:00:00", - "2024-09-17T00:00:00", - "2024-09-18T00:00:00", - "2024-09-19T00:00:00", - "2024-09-20T00:00:00", - "2024-09-23T00:00:00", - "2024-09-24T00:00:00", - "2024-09-25T00:00:00", - "2024-09-26T00:00:00", - "2024-09-27T00:00:00", - "2024-09-30T00:00:00", - "2024-10-01T00:00:00", - "2024-10-02T00:00:00", - "2024-10-03T00:00:00", - "2024-10-04T00:00:00", - "2024-10-07T00:00:00", - "2024-10-08T00:00:00", - "2024-10-09T00:00:00", - "2024-10-10T00:00:00", - "2024-10-11T00:00:00", - "2024-10-14T00:00:00", - "2024-10-15T00:00:00", - "2024-10-16T00:00:00", - "2024-10-17T00:00:00", - "2024-10-18T00:00:00", - "2024-10-21T00:00:00", - "2024-10-22T00:00:00", - "2024-10-23T00:00:00", - "2024-10-24T00:00:00", - "2024-10-25T00:00:00", - "2024-10-28T00:00:00", - "2024-10-29T00:00:00", - "2024-10-30T00:00:00", - "2024-10-31T00:00:00", - "2024-11-01T00:00:00", - "2024-11-04T00:00:00", - "2024-11-05T00:00:00", - "2024-11-06T00:00:00", - "2024-11-07T00:00:00", - "2024-11-08T00:00:00", - "2024-11-11T00:00:00", - "2024-11-12T00:00:00", - "2024-11-13T00:00:00", - "2024-11-14T00:00:00", - "2024-11-15T00:00:00", - "2024-11-18T00:00:00", - "2024-11-19T00:00:00", - "2024-11-20T00:00:00", - "2024-11-21T00:00:00", - "2024-11-22T00:00:00", - "2024-11-25T00:00:00", - "2024-11-26T00:00:00", - "2024-11-27T00:00:00", - "2024-11-28T00:00:00", - "2024-11-29T00:00:00", - "2024-12-02T00:00:00", - "2024-12-03T00:00:00", - "2024-12-04T00:00:00", - "2024-12-05T00:00:00", - "2024-12-06T00:00:00", - "2024-12-09T00:00:00", - "2024-12-10T00:00:00", - "2024-12-11T00:00:00", - "2024-12-12T00:00:00", - "2024-12-13T00:00:00", - "2024-12-16T00:00:00", - "2024-12-17T00:00:00", - "2024-12-18T00:00:00", - "2024-12-19T00:00:00", - "2024-12-20T00:00:00", - "2024-12-23T00:00:00", - "2024-12-24T00:00:00", - "2024-12-25T00:00:00", - "2024-12-26T00:00:00", - "2024-12-27T00:00:00", - "2024-12-30T00:00:00", - "2024-12-31T00:00:00", - "2025-01-01T00:00:00", - "2025-01-02T00:00:00", - "2025-01-06T00:00:00", - "2025-01-07T00:00:00", - "2025-01-08T00:00:00", - "2025-01-09T00:00:00", - "2025-01-10T00:00:00", - "2025-01-13T00:00:00", - "2025-01-14T00:00:00", - "2025-01-15T00:00:00", - "2025-01-16T00:00:00", - "2025-01-17T00:00:00", - "2025-01-21T00:00:00", - "2025-01-22T00:00:00", - "2025-01-23T00:00:00", - "2025-01-24T00:00:00", - "2025-01-27T00:00:00", - "2025-01-28T00:00:00", - "2025-01-29T00:00:00", - "2025-01-30T00:00:00", - "2025-01-31T00:00:00", - "2025-02-03T00:00:00", - "2025-02-04T00:00:00", - "2025-02-05T00:00:00", - "2025-02-06T00:00:00", - "2025-02-07T00:00:00", - "2025-02-10T00:00:00", - "2025-02-11T00:00:00", - "2025-02-12T00:00:00", - "2025-02-13T00:00:00", - "2025-02-14T00:00:00", - "2025-02-18T00:00:00", - "2025-02-19T00:00:00", - "2025-02-20T00:00:00", - "2025-02-21T00:00:00", - "2025-02-24T00:00:00", - "2025-02-25T00:00:00", - "2025-02-26T00:00:00", - "2025-02-27T00:00:00", - "2025-02-28T00:00:00", - "2025-03-03T00:00:00" - ], - "xaxis": "x", - "y": [ - 19446.80754200207, - 19417.838792002065, - 19538.380183997917, - 19707.38314573375, - 19715.366646124166, - 19554.175107337338, - 19504.62267730574, - 19564.011762738006, - 19283.880366306064, - 18988.468810487924, - 19189.4689153932, - 19193.092643330707, - 19147.20668115873, - 19632.555412575297, - 20056.896785241075, - 20503.158828766358, - 20738.450599338103, - 20841.513595737033, - 20951.595564304203, - 21191.191801412948, - 21282.54939026629, - 21457.72332331831, - 21705.706664337617, - 22122.707255277972, - 22470.39159513838, - 22679.912119450593, - 22861.106201713203, - 22932.448433669284, - 23170.814859584836, - 23257.27603962539, - 23346.736870959325, - 23658.603054046707, - 23877.231135609632, - 23722.36257307431, - 23536.911314741035, - 23473.803195583667, - 23339.158648960234, - 23398.896137349384, - 23220.900072558376, - 22995.79218344503, - 22767.376980316283, - 22600.279565107638, - 22283.8684058455, - 22211.66500094597, - 21991.83857349838, - 22008.865320748162, - 22117.775658444774, - 22279.119348476615, - 22420.164142823905, - 22577.310009543347, - 22868.201480356536, - 22798.782799371005, - 22797.56841426433, - 22700.57956069463, - 22745.143953816085, - 22818.805161107728, - 23147.430685106297, - 23507.91717478262, - 23804.607761395244, - 24084.478188929923, - 24459.14096273327, - 24641.54529117144, - 24587.193063754774, - 24501.91910750493, - 24419.23404107558, - 24545.812337316733, - 24424.95084599079, - 24250.169685336597, - 24032.339893919518, - 24219.361177959378, - 24200.599949817337, - 24179.34121685763, - 24294.584426092017, - 24504.48652048057, - 24745.854815930295, - 25328.69682488397, - 25693.46283033128, - 26110.503056630976, - 26465.201009986664, - 27111.22424851227, - 27519.68676675634, - 27925.04650303391, - 27943.992964144694, - 28115.951322886634, - 28300.388355382314, - 28580.17271400759, - 29463.44943755006, - 30176.713515867774, - 30729.80779893344, - 31301.994878247464, - 31790.36260657391, - 31332.981950729132, - 31423.352551786727, - 31718.08524150801, - 32018.43288906565, - 32228.025730223213, - 32567.15349556978, - 33203.14175751002, - 34225.02151680008, - 35016.5254204828, - 35632.13956778779, - 36306.50612680191, - 36851.9476762488, - 37188.67323900013, - 37824.45978780742, - 38351.1826591012, - 39163.633781218865, - 40208.16984897288, - 39745.03236222399, - 39263.92542808607, - 39365.63359213511, - 39519.342826234955, - 39396.561119423575, - 39138.28645857024, - 39179.51727790665, - 39130.8592070713, - 39551.45848531055, - 39892.54724563647, - 40143.39405922329, - 40094.16380312412, - 39191.430061584564, - 38990.081595942735, - 38195.79507683098, - 37615.794450855195, - 36452.337725635014, - 35377.64916157488, - 34180.780278417005, - 33483.882258183105, - 33415.96157577897, - 33686.16048863832, - 34426.77223097372, - 35043.80358612348, - 35593.49464012885, - 36185.86415830213, - 37327.0404502147, - 38296.510899480025, - 39149.321248908615, - 40030.26640762071, - 41015.66819773013, - 41115.48368770961, - 42020.295455714426, - 42308.592835291, - 41651.15746385054, - 41097.0410638413, - 40816.61719716744, - 40536.95418975444, - 41269.43851732212, - 41602.8937992473, - 43063.914574078, - 44660.82155074439, - 44882.304754818244, - 44113.56946909791, - 43733.88646909321, - 44686.91080242289, - 44598.040839457084, - 44276.58642381701, - 43667.23298943028, - 42759.402540462834, - 41472.20108015481, - 41121.15549991524, - 41038.67560417335, - 40747.85790748522, - 40390.333032283335, - 40538.70257379299, - 40655.87888385605, - 41528.0160139051, - 42522.34489283214, - 43272.71179866428, - 43029.99716986704, - 42774.4413474692, - 42795.12015227088, - 42678.9814448944, - 43240.318005823814, - 44353.024219880026, - 44836.24016414596, - 44897.07478746392, - 45929.3906056001, - 47065.63624192824, - 47741.08442845175, - 48093.65524019225, - 47970.76587154599, - 47151.51858482111, - 46135.21513959065, - 46118.02113153392, - 45317.09245860091, - 44794.92571298635, - 44891.46268861946, - 44999.435891889676, - 45146.97060554429, - 45281.49760505342, - 46035.685271338305, - 47465.16456733767, - 47900.09290867051, - 47897.81495192937, - 49212.59876335294, - 49740.65283890461, - 50159.694897667, - 51697.83872114887, - 52349.858353483185, - 53165.31806752099, - 53793.45340066151, - 53007.00310421524, - 52257.875095868156, - 52748.66442270929, - 51575.61167691908, - 51665.01509686003, - 51891.551090147426, - 52842.74575159318, - 53399.78604382877, - 53533.03960445645, - 54036.84026270196, - 54921.46299689292, - 56189.91696104228, - 56900.38115538068, - 57742.377598311214, - 55596.62957605954, - 56794.38111430823, - 57378.19590627409, - 57432.82963335864, - 56840.32253220219, - 57079.48367574718, - 57020.497898504385, - 57051.59685728345, - 57894.22938077827, - 58385.83245460759, - 58357.634845363726, - 58787.91710929864, - 59232.80331458138, - 58086.71480757906, - 56761.42374657724, - 56059.419588020275, - 54997.63857580931, - 53740.47556631189, - 53168.23767003613, - 53126.71930626607, - 53104.205023333816, - 53183.58280327539, - 52993.098854341064, - 52655.0557829477, - 52597.35687043041, - 52618.67764131141, - 53344.260463107756, - 53057.34632076558, - 52767.524210054995, - 52343.551457280104, - 52333.79487178853, - 52108.20641640618, - 51671.748728886574, - 51221.726083038, - 50635.5973584891, - 50179.719461617744, - 50594.56425687932, - 50876.111203803564, - 51421.20327363353, - 52360.16377239018, - 53236.17043476353, - 54297.50894994282, - 55407.438906193376, - 57472.93998327714, - 57472.93998327714, - 58623.32970989785, - 60373.07727504728, - 59415.65871460796, - 60418.622056488486, - 62148.704655728885, - 63835.99112180476, - 66605.547262086, - 68542.4242600825, - 70693.26192519089, - 72842.02455360854, - 74230.17326460006, - 75359.6222620379, - 74887.19370448955, - 74822.08260417417, - 74451.55174837331, - 73966.916638306, - 73417.31155269808, - 72028.07297604754, - 71659.93378949969, - 71802.49219996246, - 72080.03763032242, - 73354.0618539357, - 74789.96958341272, - 76247.6089285615, - 77462.99508589944, - 78181.62876382898, - 79041.12162444081, - 79925.43829380558, - 80748.7957033115, - 81489.45146626055, - 81712.18372633205, - 80531.53103972098, - 80723.8011723568, - 81467.23349774024, - 83299.34752859401, - 84031.08204714114, - 83952.43111712224, - 84731.81372710755, - 84671.88909042948, - 85050.83659523538, - 85800.11860708577, - 85561.00461630273, - 85336.13817902704, - 84236.90872781261, - 83896.73026575695, - 84538.36923971366, - 83247.08844167998, - 78663.09226543155, - 79454.42857279388, - 79936.51168096771, - 76837.57632065847, - 78395.07104041794, - 74768.67804467531, - 73002.0390479866, - 72074.65316167317, - 71631.1308056516, - 69707.83563985705, - 68428.05051090573, - 68959.32874394358, - 69721.98959186191, - 71892.94802913174, - 72952.5823692305, - 73195.07574486286, - 76113.05629277539, - 77903.25740705732, - 78767.30271816545, - 79238.22684902734, - 78401.1678396977, - 75740.76937077213, - 74848.23722827446, - 74699.29352156546, - 74899.65004250716, - 75046.33276860662, - 75579.49500707221, - 75777.51008143435, - 74750.41069482711, - 75390.00250808135, - 77050.24058505689, - 78332.64797826008, - 79772.4549122888, - 81313.97141653336, - 81278.37069841231, - 81566.79236209595, - 81246.39015157451, - 81169.41065450224, - 81072.20443839683, - 80682.71071475929, - 80887.96992965064, - 80831.81127039742, - 82199.6941550525, - 83564.71417645087, - 84879.72974864962, - 85900.16649812246, - 86401.61730326798, - 87042.74570727005, - 87684.98414765068, - 89182.7402467303, - 91039.42480536565, - 93058.91820989984, - 95084.52959665323, - 96061.67178635033, - 96458.89348944803, - 96856.51149090547, - 97812.99215870569, - 99305.59537883593, - 101396.12856648782, - 102377.0988235504, - 103374.06137232242, - 104559.81904764811, - 106498.1232947786, - 107356.8043758801, - 107585.22299451461, - 104351.35740307049, - 103414.0379973699, - 101866.67845960279, - 101573.176596895, - 101770.45292590008, - 101501.66784845959, - 100238.16834378365, - 100334.33539570235, - 101581.9097694169, - 103682.80094897267, - 104709.60519973826, - 105896.34005324513, - 107129.91160597268, - 107273.81381240708, - 108017.64727520499, - 106702.85107960335, - 105130.23181635763, - 102973.75016716651, - 100844.26444001784, - 99171.88665223557, - 97304.54445675493, - 96728.16719360332, - 94911.36790360326, - 92916.84658032957, - 88837.20176817433, - 85164.58913649803, - 83233.89042297202, - 82560.01364578512, - 82392.55393019528, - 82926.63259026386, - 84349.92823071055, - 84937.60261772462, - 85665.72992669321, - 85244.27338922433, - 85196.38490978137, - 85154.70174157959, - 84502.90629237804, - 82826.32670741063, - 80867.90266527643, - 79891.71304520703, - 79346.52344282436, - 80818.70558629157, - 82151.5139200994, - 83876.39149501837, - 84307.9629421776, - 86720.38140736711, - 89063.37354695896, - 91059.58965553033, - 92881.64662886366, - 92881.64662886366, - 93999.91316367852, - 93851.53452865298, - 93320.01781252188, - 93036.0603666422, - 92732.42679762469, - 93270.1562439444, - 94322.27914663758, - 95042.26362650997, - 95043.91822196628, - 93135.20512954342, - 92167.87272432557, - 91911.61418693396, - 91902.3019911849, - 90825.05917226899, - 90877.20364644547, - 91658.87157080497, - 92320.99998640257, - 93583.21097631179, - 94721.15285735228, - 96717.09659068947, - 100031.16393884073, - 100050.54965406946, - 101126.85315975342, - 102579.2003308409, - 98607.02590835342, - 95814.22357975197, - 90411.9328797287, - 83386.70677971054, - 81945.47678919203, - 79895.5201298998, - 78674.63276760602, - 78599.83148582197, - 77673.31937776775, - 77042.69884928115, - 76565.54954934704, - 76379.04301425243, - 75970.42682029003, - 76930.15067886982, - 76168.46655566266, - 75479.2320655435, - 74117.04251365617, - 73376.45063996602, - 72687.65696042923, - 71560.8174319006, - 70913.83113193391, - 70474.50845418203, - 70368.36859370834, - 70304.70425778437, - 70136.85421873239, - 69387.19696938415, - 69019.13021989107, - 68763.411636952, - 68144.02390628734, - 67935.6112268815, - 67729.06803178806, - 67475.97888004871, - 67261.35398425144, - 66722.05205223925, - 66595.92832734087, - 66577.83209686434, - 66377.09058427149, - 66345.40274114371, - 66311.86775204433, - 66363.56276052259, - 66392.6588782279, - 66335.2891919987, - 66350.66832493154, - 66369.29653943487, - 66392.67403960411, - 66466.4120952913, - 66594.87502749247, - 66548.12397476002, - 66382.87315596812, - 66198.78918579663, - 66071.16832010771, - 65847.01875790521, - 65640.23576508106, - 65502.071215106705, - 65515.498787348886, - 65381.12048210992, - 65292.604022479616, - 65239.7578872116, - 65198.655337558695, - 65121.86445200358, - 65056.36042990516, - 64972.07952382861, - 64917.6388191024, - 64930.851604315365, - 64909.172659480995, - 64914.382019710014, - 64917.47409367683, - 64962.10126231769, - 65017.9223934828, - 65504.67216216677, - 65461.033093365426, - 65416.536039853265, - 65424.14944267714, - 65704.51542265125, - 65626.09092505973, - 65819.53853804411, - 66252.7755703653, - 66716.95992883731, - 66851.88109653778, - 67096.26422697149, - 67138.36201271764, - 67402.77140163131, - 67589.83153160308, - 67683.10052158112, - 67856.19862489737, - 67988.62976696089, - 68146.63176634363, - 68355.07776586355, - 68437.75798771236, - 68572.62038248366, - 68831.95780063912, - 69027.86316127778, - 69419.12288621896, - 69733.9915611732, - 69978.88941947094, - 70122.54807209849, - 70092.0603574755, - 69942.79213499093, - 69753.91685083628, - 69492.01385204932, - 68934.42263077057, - 68264.62945866487, - 67712.56810258266, - 67294.80532352661, - 66806.76760648302, - 66623.29382656021, - 66561.8142199536, - 67144.87745135033, - 67334.25996465891, - 66745.6524324614, - 66520.97990741889, - 66149.12349905251, - 66070.36851476754, - 65969.53686032369, - 66022.66779575624, - 66094.59185664821, - 66468.86612623086, - 66529.96833590625, - 66605.6608218726, - 66712.31053317977, - 66595.82830040036, - 66342.45323046081, - 66186.23909656511, - 65824.07254797958, - 65622.49856574638, - 65362.3854684539, - 65398.40861500419, - 65286.42661787663, - 65398.0868061523, - 65483.45012169833, - 65529.395616580914, - 65973.01989037848, - 66330.69029520323, - 66817.21172117801, - 67008.39505249175, - 67105.87097684687, - 67075.13002912307, - 67344.10929200456, - 67405.98205202351, - 67831.28085009617, - 67946.81429808395, - 68231.34031318554, - 67763.74943604234, - 67091.5120871532, - 66651.43859357275, - 65508.8258763435, - 64503.46042960965, - 64063.05824925312, - 64008.86757602391, - 63975.1520383288, - 63609.484397899265, - 63490.63178867629, - 63499.85753705843, - 63327.033119133426, - 63126.503016302864, - 63881.090714101316, - 63283.7322220646, - 63000.23117270271, - 62449.73035653235, - 62043.78527728874, - 61933.050215654825, - 61934.775440518744, - 62018.339504301795, - 62348.4501308331, - 62222.425062579685, - 62596.07223171591, - 62758.918637500596, - 63152.243619777575, - 62642.60749488189, - 63015.28236743136, - 63576.48340756, - 64006.888350645764, - 64532.20330637913, - 64983.59098308691, - 65156.89250941519, - 64922.23814100385, - 65034.17363223947, - 65136.23456986718, - 65301.72641024428, - 65434.33117498203, - 65739.13488088916, - 65963.42665215027, - 66129.20577034733, - 66534.81175116726, - 66799.1084319516, - 67167.45029478386, - 67976.71618809785, - 68628.92299400872, - 68621.32815064909, - 68903.19882803604, - 69473.43706944078, - 69483.62236831113, - 69933.76648965474, - 69725.8857102782, - 70393.0895485409, - 70389.07110042457, - 70525.05675188964, - 70783.57892525135, - 70693.31839342158, - 69583.56020199842, - 69982.41494200262, - 69105.07083360205, - 68462.28187388464, - 65743.55712743776, - 64512.54899131242, - 62499.542663214925, - 62316.894372547045, - 61989.31851422308, - 60884.20395774888, - 60460.44819160227, - 60095.193706821585, - 59389.77355199216, - 59281.3356537915, - 60551.77284407988, - 60671.223992081956, - 60798.24155163912, - 60927.629223672724, - 60832.375190809966, - 61861.39983191671, - 61211.9745527775, - 62017.31044678034, - 61797.91497177558, - 62169.29738875572, - 62113.35943701709, - 62029.29658566482, - 62884.704927229424, - 63161.53369932716, - 63608.226876273155, - 64031.14503213286, - 64080.0813755793, - 64573.698531593196, - 64661.06743071511, - 64320.637964653986, - 63696.41504660646, - 63398.51428388108, - 63152.924801761335, - 62716.69538699297, - 61697.62806439535, - 61192.57570237498, - 60775.312754136925, - 61013.5526832851, - 60681.961517067015, - 60849.057276675165, - 60404.46508970373, - 59982.11561094817, - 59753.95490524941, - 59958.18259212521, - 60621.47079302861, - 61267.91717150903, - 60761.264354771585, - 60572.75660842023, - 60755.02836125807, - 61364.01750235416, - 62002.12016765112, - 62272.31112954877, - 62917.45965546915, - 63192.57517562945, - 64040.99835797634, - 64262.54972202394, - 64554.31189406096, - 64843.460250089745, - 65180.02008255659, - 65111.788841141904, - 65909.27565337492, - 66120.67764108119, - 66376.76807596385, - 66863.17174753925, - 66844.81904765345, - 67812.76694774228, - 69031.17087003357, - 69756.5961429268, - 70144.14913295487, - 70240.71179125647, - 69844.14941437992, - 70530.15645458708, - 71237.05081919263, - 70366.85754721917, - 70263.2627801287, - 70880.57796128055, - 72152.04532439867, - 72480.18660682387, - 72211.524116883, - 71783.11995804009, - 72504.69450116226, - 73401.14136803508, - 73573.82226449171, - 73705.4717048776, - 72824.19904739995, - 70900.98698047288, - 70565.71092841851, - 70352.16288793177, - 71085.73663421987, - 71505.07177022171, - 71355.59636548249, - 71271.00438401864, - 74830.87728732455, - 74877.22287878468, - 73975.04722769813, - 74655.91061018637, - 73356.02657434388, - 75261.33899091084, - 76884.13753712959, - 78720.39588280673, - 79946.26348500006, - 81839.31687420452, - 83722.24728803021, - 84008.80445697292, - 83967.34892170614, - 83937.88350538755, - 83914.96595936197, - 86033.14231232594, - 87492.77512282485, - 88177.48953099066, - 89016.71184845295, - 90225.55142870141, - 91243.4594958164, - 93509.83243690582, - 94564.74283140046, - 94907.45091600741, - 95590.86924289269, - 96594.25030072224, - 98594.40541930914, - 99104.49292493943, - 99589.74614359174, - 99554.94309143242, - 97811.05632445285, - 98588.58883902429, - 97744.22523924653, - 98105.35867329898, - 97230.49145581751, - 96390.81695333193, - 97013.58733068833, - 98147.28410406774, - 98268.23176580133, - 99508.96883603856, - 102625.38562548997, - 105711.808680443, - 106776.83130834282, - 109038.81629490864, - 113875.45926552457, - 120412.15339334826, - 122716.86181184383, - 127347.7461373404, - 126628.43394605991, - 122567.30305261358, - 118921.42346882202, - 116974.62823698414, - 111786.23194555467, - 113132.70149666509, - 113475.09421621541, - 108924.17744253231, - 111030.69702731965, - 111728.54559326536, - 116155.2055890009, - 112833.16336346189, - 112728.24163248709, - 112295.52473061782, - 104714.63380694171, - 111590.02994033533, - 99167.56026630814, - 95974.00025948897, - 93761.16348925981, - 91563.78795655404, - 93672.71077349554, - 92618.01083862237, - 102681.1433892955, - 105405.58366218986, - 116681.25942999661, - 119219.59697139144, - 127778.03727346922, - 131569.37973064085, - 130235.95631553845, - 133446.62699268106, - 132753.8152971253, - 136034.4062005819, - 138102.31023660375, - 140246.79115350964, - 144576.94297776977, - 149558.99123109397, - 152132.39653951678, - 150048.9865030091, - 157196.3467344338, - 162166.64054911488, - 167171.31351608902, - 170320.95665114967, - 169583.45686730795, - 171047.31415529837, - 176935.86982373532, - 181677.95785140235, - 179631.8159268037, - 179061.48331878253, - 180354.55795698825, - 177098.0604533705, - 176435.22906166778, - 173365.80464589904, - 175278.4745447456, - 177165.35015434062, - 179660.69785069232, - 182798.46126929973, - 181881.16615043877, - 180044.93661354692, - 180705.0914181866, - 183426.87848846198, - 193963.26843200953, - 197852.12727699085, - 204179.11017394272, - 205564.39744155013, - 205884.0653163559, - 205570.47366342705, - 200667.1246000379, - 199369.51977295757, - 199211.38268522843, - 198133.38717255014, - 201742.16844046715, - 201745.1094266248, - 197532.1117874823, - 199287.5580681493, - 200582.3496197791, - 203905.52082660244, - 208347.98732079825, - 205746.39550672067, - 203992.66597148022, - 209508.65411073764, - 214120.69070691298, - 219210.05250393806, - 223096.83466649504, - 234132.10968181727, - 242962.27851112382, - 246517.35074561078, - 245498.51803910063, - 250831.09260070397, - 248922.53948195092, - 249706.22038958743, - 253033.9694362308, - 255539.98827405408, - 261310.78070347218, - 265532.5081485753, - 267366.8424792988, - 276358.5469587504, - 287948.973023881, - 302055.0773550615, - 304909.82516820193, - 310541.85124508885, - 313005.6493048899, - 314770.0207114456, - 314113.97624987795, - 321408.7194464364, - 321128.51971042634, - 323195.5865824185, - 318893.86081619014, - 318811.9629980126, - 316599.6203454884, - 318408.7982824141, - 320934.4922333562, - 325535.41955792153, - 331945.91858813894, - 340298.19561164145, - 352702.41107436566, - 358401.13191188104, - 364069.0258966152, - 362442.9434402973, - 364371.5459742724, - 358026.5701673643, - 363003.2556508801, - 364664.01102694793, - 367291.2652083341, - 378198.5740160787, - 388218.703088769, - 394559.91458975023, - 397621.9679794026, - 405590.2317269098, - 410815.1870371727, - 410020.3437944633, - 426993.2434945778, - 436201.2319249417, - 446724.35625966935, - 459035.8252672897, - 458544.2923429229, - 475167.53335637815, - 488251.720811288, - 472926.0888317737, - 460287.8195143735, - 454892.4989341732, - 448198.5000776005, - 433194.07567687856, - 424064.52336520626, - 423036.5382339055, - 411944.2164651161, - 405860.7439782798, - 388220.8209329627, - 382934.76967549376, - 385033.3964752404, - 374419.5506528208, - 371664.892790939, - 379660.71445391997, - 385973.0201917939, - 391632.03576569573, - 400715.7145453974, - 422988.5758184986, - 421622.4679197994, - 432158.8284430335, - 438071.5532944379, - 448366.450401086, - 457983.592595145, - 462413.5920794132, - 479068.0361227331, - 488075.3814897593, - 493597.2056641133, - 494942.51335527736, - 498126.08600396063, - 490083.8647307145, - 486858.4093191486, - 477594.1662212639, - 463617.5327006872, - 457229.5955180163, - 450649.5332648276, - 451110.04040123656, - 438648.7681739991, - 435536.66755281435, - 420125.58929189283, - 400106.97286673164, - 394584.826758273, - 417381.60200724954, - 433963.3160897869, - 450657.42704287183, - 454796.9577841598, - 448619.1483607174, - 438604.7410313729, - 432551.3131085498, - 423018.6469463538, - 418958.2399313123, - 414364.5900307246, - 401851.75121915695, - 376497.9040048465, - 381483.4672826051, - 377432.23872086185, - 372939.0609506171, - 381348.20720179984, - 383435.0987304977, - 389451.56991948443, - 394922.33240040584, - 401142.92544112203, - 408719.4978061238, - 412081.83186779154, - 410719.2028046452, - 411166.6024221975, - 399619.5799025163, - 397999.11794276343, - 388852.09197406727, - 394439.4051095252, - 394921.2042148817, - 396596.39975892124, - 403573.77407095156, - 395286.1763136417, - 400948.60028017894, - 404154.6146010158, - 395369.29240611155, - 394571.93069896265, - 392347.76048229146, - 393417.29475821427, - 400638.0436394875, - 417060.84832492226, - 429834.1408580382, - 424784.69155282696, - 420241.0837026525, - 420819.38870807237, - 424246.4037122879, - 423300.74871556694, - 424481.35038478376, - 426534.596127508, - 426303.78726073774, - 426595.9359199166, - 426218.71821038914, - 427473.1044363119, - 430188.18261202984, - 438741.5767486994, - 442770.30552166444, - 435533.20567841496, - 432092.12802255445, - 436325.73429021816, - 433682.42805395665, - 432990.41209242033, - 436889.9552334476, - 440904.8221209134, - 438403.05192227504, - 439396.1195455566, - 440056.68325255346, - 440358.78835799516, - 438437.09232889453, - 436214.1065284829, - 436710.673128163, - 436031.89159458067, - 433788.3948462385, - 431479.56404197286, - 428724.1757180642, - 422408.3181328018, - 414797.0955664867, - 418829.4780149081, - 407313.553252569, - 396831.72288186126, - 392179.74370464386, - 385113.7599001413, - 373780.21694108384, - 365480.79463959485, - 355322.91062732565, - 341984.0252638247, - 335733.48344110174, - 331168.61757898383, - 328784.8330195588, - 327206.04635291407, - 323881.108098699, - 322670.2728452107, - 320178.92410168983, - 315394.541745618, - 312960.02213533985, - 311361.8018520767, - 306974.8527428719, - 300680.54226729524, - 295304.4118974023, - 289618.0558412506, - 282050.8917776433, - 281016.9863948376, - 282704.3329080439, - 302968.3801960934, - 301870.41697568726, - 299608.66780426033, - 299533.7283366024, - 300752.6643062018, - 297978.503393668, - 303461.37823947496, - 317481.392008436, - 319826.402717628, - 324256.56290293956, - 327032.52800542006, - 330197.13851269643, - 340359.69154543575, - 330475.9463633038, - 328717.83072274656, - 328307.96300231304, - 338048.48426776775, - 334036.277806701, - 336109.45055920474, - 335009.7176768137, - 335744.70321273187, - 333321.4697406682, - 328718.25851443195, - 320242.42756069265, - 315335.89237445086, - 315559.5872295963, - 309351.0165613759, - 303553.1282638711, - 296540.9929213675, - 284299.9417104749, - 281432.5344564604, - 281082.0061829456, - 277640.40791904274, - 277425.2759360072, - 280545.711500395, - 285514.27249491884, - 289729.534693377, - 293808.25541891716, - 297703.3715387818, - 296901.7951875654, - 299704.346914397, - 300435.88714637724, - 302603.1962156952, - 304741.2143807202, - 310061.2285090731, - 314384.9061644586, - 316230.43322975846, - 318665.06539165834, - 320708.4459620249, - 324338.2975167544, - 324720.0709482108, - 328128.7836171213, - 329541.7494183141, - 330779.0561525751, - 334419.8502792226, - 336657.690155504, - 340797.4252127636, - 344378.3302572989, - 346995.67484331044, - 350576.9428546528, - 355376.81797458587, - 358436.1652900893, - 360662.8798688142, - 363824.3730556148, - 357780.0441787527, - 353058.6152201155, - 360529.17047450884, - 359926.8245612592, - 362987.2221842872, - 361030.30922442017, - 363206.7544670589, - 364357.8785446668, - 365120.975049473, - 370420.98344209994, - 364457.190048494, - 356854.87368173525, - 332330.5165075895, - 334524.74590310873, - 337374.70209962374, - 329204.31153820263, - 334552.8522126528, - 337523.36162611406, - 339801.07693771634, - 347767.7444022958, - 341371.7079858577, - 348857.0722211526, - 365301.91107082646, - 361528.9337505485, - 412228.0625014435, - 401062.38486325066, - 379173.30225576734, - 389597.15383513866, - 392661.59395242744, - 380380.6380231598, - 380394.34157417214, - 366150.75244031625, - 402276.8497806506, - 390841.36993424385, - 426256.5522759276, - 394842.69409723714, - 412969.40977801627, - 416807.76792082895, - 420748.71314301656, - 422420.50680717814, - 424207.4574348595, - 432602.3691428385, - 447901.6290120879, - 439283.5120085625, - 427901.9966334404, - 426488.23042459966, - 434729.74559550127, - 463337.2431651409, - 477034.8264486143, - 517086.6665909977, - 500683.65336840705, - 491352.9764175032, - 481859.6721223557, - 475354.3243372411, - 451276.83161548525, - 433857.11505411955, - 427765.1132841685, - 427010.6071976798, - 428458.21357485524, - 430041.4475838277, - 429370.07403525076, - 421869.56127524644, - 415232.4957952432, - 407754.77819968504, - 404058.2200698064, - 390588.1193021231, - 386916.3742605916, - 386396.6836727338, - 389145.0340663512, - 391769.30659472034, - 390448.7407834518, - 386116.15143594955, - 385238.1702108406, - 389235.2308027344, - 400634.05570754065, - 411597.39449582767, - 420052.76910893986, - 429933.60377737856, - 446785.08407797146, - 451500.124311766, - 465340.58742485114, - 480720.39206836186, - 497087.47080456495, - 507620.19871050067, - 502541.35059678345, - 526307.8020638924, - 548713.1036030721, - 572705.8293972105, - 582690.1716815406, - 619283.5490137974, - 645195.7831840147, - 678167.5208719615, - 678936.6501848091, - 689541.5285392461, - 703117.5450371413, - 712123.6296373251, - 719661.695437468, - 725521.9496348579, - 731286.036232828, - 724030.625694793, - 754310.3063874327, - 775695.1068794463, - 810004.1954814369, - 836531.354502601, - 836660.8115190623, - 834464.6034971485, - 835754.2241619688, - 835732.2624568288, - 853037.9589083868, - 832694.4746800145, - 805942.8758357249, - 795054.0960907217, - 817983.3785112748, - 806303.9315050384, - 786062.1393890767, - 775350.1137059599, - 765687.9826190912, - 783381.3251070824, - 781895.7247845731, - 752251.9245337326, - 750168.9687830787, - 753020.4825206355, - 760198.8820942908, - 766326.5338500881, - 783182.4852157084, - 792913.4409747572, - 793496.4065651287, - 792054.2686909732, - 783242.0503444077, - 794498.2871386455, - 782686.8987934258, - 796831.3745249214, - 793910.6213050944, - 801576.7938770275, - 805739.6716035834, - 811320.2431686824, - 791052.3543859817, - 787626.2186661033, - 787918.6686617534, - 778068.9075472592, - 770786.3155693192, - 771592.0773642546, - 750518.2254269823, - 727218.7758838781, - 728207.5373503523, - 721674.6573152066, - 723614.6395100933, - 719713.8918303277, - 730371.6436349546, - 734837.8099248668, - 729907.6059281317, - 734238.5583751157, - 742996.5213894367, - 742397.7148450196, - 753913.0875326952, - 756879.4885119983, - 716247.244829234, - 692028.833075973, - 717229.5128234365, - 739648.9304047973, - 724485.1440791889, - 709454.4213814934, - 707344.9703943972, - 694246.7902226064, - 648110.9834223246, - 654421.740661736, - 664925.662959056, - 670184.2691903048, - 673349.8518146094, - 681637.5271890686, - 680433.496924759, - 679509.2511636293, - 681620.3933494175, - 683480.1706050304, - 679416.6640260627, - 675670.6033535321, - 669427.0006082307, - 669091.4799070082, - 668346.0749171686, - 669825.2043695155, - 662278.2377727667, - 648262.8193086289, - 642300.5490000946, - 646609.6034736977, - 659312.201397611, - 688739.5316193018, - 773094.121791728, - 823040.4697036148, - 823268.1410452425, - 813166.3298665086, - 751433.2526952828, - 749782.8103257581, - 731063.5084640069, - 730775.9474568883, - 751759.5111180184, - 800359.505076675, - 742119.8884977426, - 738972.7631133338, - 734932.2044711252, - 727160.0786844062, - 721910.0919614027, - 719091.7689546221, - 717858.0732826816, - 712946.8655378391, - 707872.0372918504, - 704763.2819894147, - 698472.0278652981, - 693548.8302132074, - 692299.2879565447, - 690309.0884235848, - 688291.155453505, - 686799.985365665, - 684543.5197417896, - 682396.8242565531, - 680413.8388791468, - 678678.5854287125, - 676760.3944225672, - 674904.0236400097, - 674006.8463646873, - 672033.4862616587, - 669703.4885192349, - 666219.6013862387, - 662769.9113939082, - 665429.0413998734, - 664100.0314045129, - 661545.245852566, - 665253.7459788295, - 669687.0238548121, - 673858.4622027987, - 676556.247584566, - 677663.4139926073, - 677168.9878655282, - 674554.989766689, - 672618.5468009252, - 671610.7578275532, - 660973.5886260418, - 657163.0125804218, - 654375.8978782728, - 650622.0308877126, - 647962.6030801598, - 645165.270340952, - 642442.9004326792, - 641196.5902346685, - 639646.7879490674, - 637196.6530512469, - 634239.2741490452, - 633650.201669555, - 631969.8119632849, - 630296.1755250747, - 626427.791628689, - 623052.3819315003, - 622839.8161974079, - 621303.9708799608, - 624034.980077502, - 625216.876120034, - 625647.2397086701, - 622889.1891664981, - 621584.5943003643, - 619838.7982933713, - 618129.3104874137, - 618937.4866383354, - 617645.9145723669, - 617099.6918543914, - 619457.6297404104, - 619637.6925406473, - 622377.7413852762, - 622995.0926629505, - 623686.3658789195, - 624431.2450468952, - 625428.9288442098, - 630423.7940198989, - 628737.0224898793, - 628523.9779665306, - 628623.8322261485, - 626183.4744280734, - 622872.0850295704, - 624794.6488307347, - 627427.7540094181, - 631637.9469261718, - 631104.208083647, - 632730.1889839055, - 631746.5074618843, - 632971.4218336456, - 631414.133011682, - 633495.1305945993, - 635113.6842702017, - 635054.7149067813, - 633934.149197471, - 634134.2647568963, - 633880.4657475603, - 634911.3998514101, - 635874.3485988489, - 634907.1976246346, - 636777.1913113568, - 637168.8530676963, - 635831.2566559603, - 633972.0150023879, - 631550.6387095338, - 622650.6793706473, - 666636.822107069, - 683437.41021439, - 689640.6454089732, - 706057.9395893526, - 707239.7638003218, - 705127.1936487299, - 722990.7501974918, - 719381.8497354178, - 728896.6102444234, - 727712.656584379, - 730641.4704043446, - 734899.5478198732, - 720506.1635875065, - 716768.8647401104, - 728060.9656365803, - 738404.4885560566, - 744505.895271205, - 750279.4400557027, - 747336.6415547566, - 749740.9093873542, - 750092.1177015966, - 744718.6130571186, - 715540.7761114136, - 715379.1251536428, - 698921.3219895761, - 678960.6973064133, - 683697.3225528422, - 686654.9199667316, - 698839.2735108675, - 708847.958839897, - 731498.2696513642, - 726491.4002825054, - 716251.9463289487, - 722643.7043650713, - 720426.4050598333, - 715514.6340302258, - 738711.0343405312, - 736230.6681363238, - 746202.6055330515, - 772864.6679527287, - 721293.4942791442, - 744752.0258663563, - 856337.5504341876, - 784097.3918181797, - 781092.824005729, - 799246.4934849343, - 812729.9030798716, - 856398.666098156, - 863549.370667933, - 869118.9441915556, - 873150.8347099288, - 881545.7732627447, - 888054.6312669725, - 881489.8541591496, - 871862.8052975095, - 917910.4652479165, - 898556.9785426776, - 869300.2844776725, - 862392.1543559643, - 820878.3345309779, - 849041.6524448773, - 837862.6108223548, - 830277.2451159484, - 822674.4051220766, - 806144.8851268431, - 790319.1251305504, - 873909.6006889892, - 891484.4150122195, - 943279.9752755641, - 947030.966591499, - 870488.1311554635, - 858040.0369274359, - 869843.3364395164, - 883719.5604558765, - 888411.8015658169, - 897571.8178264423, - 928665.1638069287, - 923692.1326323745, - 948460.3306077211, - 967493.2835661293, - 958105.0247560021, - 1001919.899100492, - 967668.8049016073, - 959293.1834800477, - 959802.7499496721, - 979972.9683149359, - 1048865.9159323627, - 1105700.4307459174, - 1168638.386712016, - 1181236.3825946315, - 1229832.0460588883, - 1266524.9508408085, - 1290355.22453728, - 1310716.7006574753, - 1323167.2111924237, - 1336603.2498818405, - 1414444.8244916252, - 1575727.160299235, - 1541258.6420190206, - 1563678.1278010763, - 1593580.1283649863, - 1688131.867763777, - 1761658.752887861, - 1734387.441317703, - 1651053.087874248, - 1613890.2574182271, - 1583814.1670635445, - 1513121.652343236, - 1508519.1408941068, - 1505668.8542114508, - 1480329.1867916074, - 1478061.1121317286, - 1497320.9429518234, - 1503887.7872026018, - 1520927.5549532066, - 1529660.8463465732, - 1525058.9618747474, - 1531921.797367728, - 1546745.837804381, - 1606031.2025884436, - 1621009.0709829286, - 1619167.0962545136, - 1601342.7567822644, - 1570368.3816371814, - 1560535.2994626774, - 1435572.9022158408, - 1459661.5932460786, - 1468832.5227583565, - 1417610.5324395413, - 1451265.4975035335, - 1464883.8036644163, - 1632445.429690969, - 1658997.1560964554, - 1640014.774826929, - 1601387.3671728524, - 1621296.605664126, - 1636069.2244713686, - 1614451.2613214455, - 1590849.0677603947, - 1577589.361657355, - 1514402.4791327685, - 1507483.348280312, - 1498401.35761729, - 1476676.0315460511, - 1450768.7779350874, - 1430148.3584598938, - 1437879.6988680756, - 1433343.9712333304, - 1412413.9937194115, - 1422423.3445419173, - 1456260.199362959, - 1461842.5192216681, - 1491247.7680006633, - 1519294.2499590688, - 1536031.9581489395, - 1546644.3978521721, - 1564054.1842880202, - 1558712.3531369863, - 1554856.706686182, - 1540657.2038911115, - 1535405.147504206, - 1506151.0314332591, - 1503377.6078225223, - 1510422.278347504, - 1492222.1190561492, - 1528014.7671753527, - 1498426.683376687, - 1461013.507088836, - 1416407.3458422865, - 1380455.7794525805, - 1367077.2271652555, - 1340440.7976084466, - 1332694.0190642618, - 1322489.4061810535, - 1319022.5803764437, - 1327624.1217791322, - 1319381.4317590017, - 1318792.6728544554, - 1327689.638150919, - 1348750.5000481687, - 1363608.0593015857, - 1383084.6053875766, - 1405500.7198016683, - 1420574.4754570723, - 1417972.6187446085, - 1427476.2857460256, - 1419719.163755778, - 1421600.5133189184, - 1390892.0074235837, - 1349453.4973139644, - 1334446.4412457529, - 1328687.6696343329, - 1281537.81231826, - 1257828.9232946478, - 1236147.4357780481, - 1223856.8343762483, - 1212507.021203511, - 1217901.8426077508, - 1230997.9584674146, - 1253264.9068967395, - 1271275.7162996312, - 1292407.5242026788, - 1311784.8874943946, - 1327820.6284970979, - 1359207.0448659721, - 1385114.7515355235, - 1414084.2157460528, - 1438755.7344043364, - 1457976.0183526154, - 1473930.692676373, - 1498913.2505426311, - 1510191.2605773876, - 1521275.3736775415, - 1529878.2657658237, - 1524458.848501154, - 1497715.4160636025, - 1497854.0827907976, - 1496167.2680230604, - 1479401.189870376, - 1467205.7957516205, - 1442384.822548145, - 1433204.3659847847, - 1418664.5990236287, - 1420980.5611926035, - 1433910.4636773998, - 1438002.3545415597, - 1449822.6005404838, - 1468165.5696507585, - 1485985.8565856551, - 1485925.4788152522, - 1519989.0738827165, - 1547322.981157411, - 1554914.9090377293, - 1573561.9640557547, - 1584835.7846253295, - 1593596.4197128692, - 1605499.6914476224, - 1598470.6091595078, - 1587550.211824307, - 1608921.0138969296, - 1625542.7488423025, - 1559194.6953537222, - 1493693.3656140908, - 1441427.4424832663, - 1438082.8356037363, - 1402630.3635863238, - 1388275.6631283364, - 1354110.3405499018, - 1322633.4229888972, - 1322633.4229888972, - 1365005.1268852672, - 1390854.3066704276, - 1404704.200724589, - 1468364.673877825, - 1493752.1926537969, - 1578394.7072573307, - 1612594.8867052656, - 1642266.6929425478, - 1665346.0703085524, - 1683903.3638154445, - 1739359.5920985823, - 1726684.2484109183, - 1753516.7775713154, - 1805646.2018486767, - 1888803.531842178, - 1912596.4551704575, - 1955110.9510924523, - 1970621.670142894, - 2028500.5627376814, - 2030343.0347558504, - 2030545.2228337447, - 2047247.3548636276, - 2061626.235331315, - 2060124.253472848, - 2023141.2823178784, - 2011351.1936417918, - 2027955.5691159463, - 2063280.6389291775, - 2030339.026561693, - 2050405.5502758692, - 2068363.9576091187, - 2115750.4966460895, - 2172824.4714526213, - 2218647.059273208, - 2251740.738689221, - 2264134.38946024, - 2209206.1178376977, - 2050611.9065757212, - 2122736.408927518, - 2161686.5774233597, - 2213750.597364569, - 2056072.6128744003, - 2125869.180493157, - 2141678.177529967, - 2182526.841891931, - 2181507.469729014, - 2198899.624713412, - 2205185.745256833, - 2219509.3945683823, - 2232496.6773662544, - 2222262.8973201537, - 2214939.4017287428, - 2214131.1273798672, - 2212609.136219632, - 2230637.587539448, - 2203490.82745486, - 2187175.569611293, - 2151217.591288517, - 2185699.719259693, - 2162521.92990394, - 2183736.982627243, - 2152119.801412034, - 2120539.771577982, - 2121043.6372626075, - 2077007.199461763, - 2054253.8589499933, - 1967517.2607741735, - 1928937.2399707588, - 1837602.3349014353, - 1827392.6309586286, - 1815756.5278920007, - 1826743.3366179578, - 1846447.5211825892, - 1862819.7758439707, - 1828693.8628028228, - 1831865.4859930405, - 1859644.3737133346, - 1922429.2902748154, - 1966149.2253781892, - 1966262.793362408, - 2010481.6795723545, - 2025552.479957868, - 2033798.1024799354, - 2057526.8072763218, - 2091105.2443401765, - 2122816.6287231757, - 2147239.905465509, - 2156177.542931767, - 2165971.9498499692, - 2191832.5996752367, - 2256379.9273171113, - 2290138.959927458, - 2408332.09640217, - 2476298.424771394, - 2530988.9023919012, - 2400036.407207852, - 2514275.0220647007, - 2610518.3891755855, - 2740479.3413729374, - 2904890.4153042124, - 2955876.250584092, - 2812478.0113573326, - 2868846.0475142975, - 3007915.075636381, - 3119354.3197313347, - 3217937.6206940766, - 2850013.210331765, - 3079517.5578277446, - 2782473.939213507, - 2702823.3469579886, - 2729504.5529814763, - 2871383.8243330764, - 2993654.924273209, - 2936741.890893313, - 3047569.026990607, - 3139057.9106218372, - 3186983.2651474206, - 3262401.2834694185, - 3311681.8527298267, - 3337509.7903351733, - 3425637.8503450486, - 3465310.434660635, - 3408161.3335727593, - 3005859.254948854, - 3044296.52713026, - 3055387.1832713545, - 2979885.5776859163, - 2926463.2177861324, - 2846832.2281066235, - 2844890.347244782, - 2843990.730028022, - 2857117.1388594303, - 2765666.567950525, - 2683063.901688043, - 2635559.1348317536, - 2582033.760610196, - 2563475.6917712055, - 2477057.193785324, - 2468335.028685194, - 2390672.990829635, - 2355015.316265936, - 2289887.290472363, - 2734244.3815218066, - 2624636.563449152, - 2960521.5938370866, - 2891871.8838054617, - 2875759.331558642, - 2929073.5288726427, - 2916985.6823390876, - 2898461.598924826, - 2934266.200713733, - 2973475.002105107, - 2994487.2920761756, - 2976411.9620536733, - 3042018.9981232462, - 3083928.5227148132, - 2737941.569731918, - 2762244.9055004893, - 2646131.944431599, - 2573183.530266907, - 2480547.5414721468, - 2469775.6612984454, - 2402321.198941121, - 2384178.617107647, - 2415518.720126055, - 2452217.133584818, - 2565194.788497189, - 2626816.297873478, - 2810816.3607217018, - 2640520.2984925425, - 2662270.5834254194, - 2712291.5715466347, - 2733054.0067520253, - 2755898.6785784396, - 2492808.1170083005, - 2599598.7913426375, - 2672033.204713788, - 2729789.970669127, - 2767469.144628649, - 2764259.057708278, - 2807759.791174536, - 2893796.413681721, - 2968585.114088829, - 3199368.1310365694, - 3193844.366440367, - 3246059.527309987, - 3386305.7635419136, - 3427550.613944523, - 3395849.3864798867, - 3375375.098451836, - 3802821.207763352, - 3659076.270561198, - 3654313.541626189, - 3728370.3080100715, - 3777159.4596419795, - 3724049.355355685, - 3730522.607577457, - 3740960.1370832794, - 3826782.104476697, - 3833692.14578269, - 3629352.1779095707, - 3898464.758452702, - 3825068.854430692, - 3767262.573524684, - 3778138.2439311235, - 4081825.987580576, - 4084033.0770857045, - 4073111.902256361, - 4076714.2996113175, - 4100601.9798401794, - 4081770.95853626, - 4126064.053077654, - 4056448.9488320723, - 3667572.2010855093, - 3789498.8417270696, - 3899114.3844482857, - 3987979.2510092305, - 4012846.369445521, - 3981713.5726737464, - 3926693.641851256, - 3895395.9178782073, - 3871052.954788057, - 3849535.6501623853, - 3897036.1021201955, - 3990581.7203096035, - 4150526.823345811, - 4278415.236818417, - 4335536.002852665, - 4368241.043101526, - 4112954.185517305, - 4197963.5629517995, - 4198907.967623074, - 4290726.282367398, - 4282894.971612985, - 4271773.9521373315, - 4007135.1814340437, - 4094574.4708870407, - 4144037.7849060395, - 4262022.473587482, - 4300671.636769237, - 4300671.636769237, - 4427627.65257727, - 4343649.088880573, - 4343077.428227585, - 4192260.7233930635, - 4074958.8418551027, - 4095243.631768414, - 4092838.5137433913, - 4098995.7552794837, - 4203815.165363112, - 4284471.408468104, - 4260898.15310532, - 4247600.954489822, - 4233263.109442532, - 4209842.3410724215, - 4207222.299006777, - 4297489.821844611, - 4296562.672940701, - 4298620.569265438, - 4327945.989238733, - 4354015.700259668, - 4471146.586609281, - 4587756.286926713, - 4752176.387173604, - 4808813.940544724, - 4869255.70427782, - 4844302.983539174, - 4896491.867409118, - 4914508.110419071, - 4918985.743871259, - 4951084.949791316, - 4882879.665506913, - 4885333.777730158, - 4883733.30945935, - 4953280.167470942, - 5026533.168146624, - 5081915.168672156, - 5064067.057969792, - 5032402.082979063, - 4931647.769097385, - 4875177.969411635, - 4813193.680767163, - 4734677.234043685, - 4717198.331036535, - 4679115.739808751, - 4574527.951826011 - ], - "yaxis": "y" - }, - { - "hovertemplate": "variable=DTE270_ROLL120
datetime=%{x}
value=%{y}", - "legendgroup": "DTE270_ROLL120", - "line": { - "color": "#ab63fa", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "DTE270_ROLL120", - "showlegend": true, - "type": "scattergl", - "x": [ - "2017-01-05T00:00:00", - "2017-01-06T00:00:00", - "2017-01-09T00:00:00", - "2017-01-10T00:00:00", - "2017-01-11T00:00:00", - "2017-01-12T00:00:00", - "2017-01-13T00:00:00", - "2017-01-17T00:00:00", - "2017-01-18T00:00:00", - "2017-01-19T00:00:00", - "2017-01-20T00:00:00", - "2017-01-23T00:00:00", - "2017-01-24T00:00:00", - "2017-01-25T00:00:00", - "2017-01-26T00:00:00", - "2017-01-27T00:00:00", - "2017-01-30T00:00:00", - "2017-01-31T00:00:00", - "2017-02-01T00:00:00", - "2017-02-02T00:00:00", - "2017-02-03T00:00:00", - "2017-02-06T00:00:00", - "2017-02-07T00:00:00", - "2017-02-08T00:00:00", - "2017-02-09T00:00:00", - "2017-02-10T00:00:00", - "2017-02-13T00:00:00", - "2017-02-14T00:00:00", - "2017-02-15T00:00:00", - "2017-02-16T00:00:00", - "2017-02-17T00:00:00", - "2017-02-21T00:00:00", - "2017-02-22T00:00:00", - "2017-02-23T00:00:00", - "2017-02-24T00:00:00", - "2017-02-27T00:00:00", - "2017-02-28T00:00:00", - "2017-03-01T00:00:00", - "2017-03-02T00:00:00", - "2017-03-03T00:00:00", - "2017-03-06T00:00:00", - "2017-03-07T00:00:00", - "2017-03-08T00:00:00", - "2017-03-09T00:00:00", - "2017-03-10T00:00:00", - "2017-03-13T00:00:00", - "2017-03-14T00:00:00", - "2017-03-15T00:00:00", - "2017-03-16T00:00:00", - "2017-03-17T00:00:00", - "2017-03-20T00:00:00", - "2017-03-21T00:00:00", - "2017-03-22T00:00:00", - "2017-03-23T00:00:00", - "2017-03-24T00:00:00", - "2017-03-27T00:00:00", - "2017-03-28T00:00:00", - "2017-03-29T00:00:00", - "2017-03-30T00:00:00", - "2017-03-31T00:00:00", - "2017-04-03T00:00:00", - "2017-04-04T00:00:00", - "2017-04-05T00:00:00", - "2017-04-06T00:00:00", - "2017-04-07T00:00:00", - "2017-04-10T00:00:00", - "2017-04-11T00:00:00", - "2017-04-12T00:00:00", - "2017-04-13T00:00:00", - "2017-04-17T00:00:00", - "2017-04-18T00:00:00", - "2017-04-19T00:00:00", - "2017-04-20T00:00:00", - "2017-04-21T00:00:00", - "2017-04-24T00:00:00", - "2017-04-25T00:00:00", - "2017-04-26T00:00:00", - "2017-04-27T00:00:00", - "2017-04-28T00:00:00", - "2017-05-01T00:00:00", - "2017-05-02T00:00:00", - "2017-05-03T00:00:00", - "2017-05-04T00:00:00", - "2017-05-05T00:00:00", - "2017-05-08T00:00:00", - "2017-05-09T00:00:00", - "2017-05-10T00:00:00", - "2017-05-11T00:00:00", - "2017-05-12T00:00:00", - "2017-05-15T00:00:00", - "2017-05-16T00:00:00", - "2017-05-17T00:00:00", - "2017-05-18T00:00:00", - "2017-05-19T00:00:00", - "2017-05-22T00:00:00", - "2017-05-23T00:00:00", - "2017-05-24T00:00:00", - "2017-05-25T00:00:00", - "2017-05-26T00:00:00", - "2017-05-29T00:00:00", - "2017-05-30T00:00:00", - "2017-05-31T00:00:00", - "2017-06-01T00:00:00", - "2017-06-02T00:00:00", - "2017-06-05T00:00:00", - "2017-06-06T00:00:00", - "2017-06-07T00:00:00", - "2017-06-08T00:00:00", - "2017-06-09T00:00:00", - "2017-06-12T00:00:00", - "2017-06-13T00:00:00", - "2017-06-14T00:00:00", - "2017-06-15T00:00:00", - "2017-06-16T00:00:00", - "2017-06-19T00:00:00", - "2017-06-20T00:00:00", - "2017-06-21T00:00:00", - "2017-06-22T00:00:00", - "2017-06-23T00:00:00", - "2017-06-26T00:00:00", - "2017-06-27T00:00:00", - "2017-06-28T00:00:00", - "2017-06-29T00:00:00", - "2017-06-30T00:00:00", - "2017-07-03T00:00:00", - "2017-07-05T00:00:00", - "2017-07-06T00:00:00", - "2017-07-07T00:00:00", - "2017-07-10T00:00:00", - "2017-07-11T00:00:00", - "2017-07-12T00:00:00", - "2017-07-13T00:00:00", - "2017-07-14T00:00:00", - "2017-07-17T00:00:00", - "2017-07-18T00:00:00", - "2017-07-19T00:00:00", - "2017-07-20T00:00:00", - "2017-07-21T00:00:00", - "2017-07-24T00:00:00", - "2017-07-25T00:00:00", - "2017-07-26T00:00:00", - "2017-07-27T00:00:00", - "2017-07-28T00:00:00", - "2017-07-31T00:00:00", - "2017-08-01T00:00:00", - "2017-08-02T00:00:00", - "2017-08-03T00:00:00", - "2017-08-04T00:00:00", - "2017-08-07T00:00:00", - "2017-08-08T00:00:00", - "2017-08-09T00:00:00", - "2017-08-10T00:00:00", - "2017-08-11T00:00:00", - "2017-08-14T00:00:00", - "2017-08-15T00:00:00", - "2017-08-16T00:00:00", - "2017-08-17T00:00:00", - "2017-08-18T00:00:00", - "2017-08-21T00:00:00", - "2017-08-22T00:00:00", - "2017-08-23T00:00:00", - "2017-08-24T00:00:00", - "2017-08-25T00:00:00", - "2017-08-28T00:00:00", - "2017-08-29T00:00:00", - "2017-08-30T00:00:00", - "2017-08-31T00:00:00", - "2017-09-01T00:00:00", - "2017-09-05T00:00:00", - "2017-09-06T00:00:00", - "2017-09-07T00:00:00", - "2017-09-08T00:00:00", - "2017-09-11T00:00:00", - "2017-09-12T00:00:00", - "2017-09-13T00:00:00", - "2017-09-14T00:00:00", - "2017-09-15T00:00:00", - "2017-09-18T00:00:00", - "2017-09-19T00:00:00", - "2017-09-20T00:00:00", - "2017-09-21T00:00:00", - "2017-09-22T00:00:00", - "2017-09-25T00:00:00", - "2017-09-26T00:00:00", - "2017-09-27T00:00:00", - "2017-09-28T00:00:00", - "2017-09-29T00:00:00", - "2017-10-02T00:00:00", - "2017-10-03T00:00:00", - "2017-10-04T00:00:00", - "2017-10-05T00:00:00", - "2017-10-06T00:00:00", - "2017-10-09T00:00:00", - "2017-10-10T00:00:00", - "2017-10-11T00:00:00", - "2017-10-12T00:00:00", - "2017-10-13T00:00:00", - "2017-10-16T00:00:00", - "2017-10-17T00:00:00", - "2017-10-18T00:00:00", - "2017-10-19T00:00:00", - "2017-10-20T00:00:00", - "2017-10-23T00:00:00", - "2017-10-24T00:00:00", - "2017-10-25T00:00:00", - "2017-10-26T00:00:00", - "2017-10-27T00:00:00", - "2017-10-30T00:00:00", - "2017-10-31T00:00:00", - "2017-11-01T00:00:00", - "2017-11-02T00:00:00", - "2017-11-03T00:00:00", - "2017-11-06T00:00:00", - "2017-11-07T00:00:00", - "2017-11-08T00:00:00", - "2017-11-09T00:00:00", - "2017-11-10T00:00:00", - "2017-11-13T00:00:00", - "2017-11-14T00:00:00", - "2017-11-15T00:00:00", - "2017-11-16T00:00:00", - "2017-11-17T00:00:00", - "2017-11-20T00:00:00", - "2017-11-21T00:00:00", - "2017-11-22T00:00:00", - "2017-11-24T00:00:00", - "2017-11-27T00:00:00", - "2017-11-28T00:00:00", - "2017-11-29T00:00:00", - "2017-11-30T00:00:00", - "2017-12-01T00:00:00", - "2017-12-04T00:00:00", - "2017-12-05T00:00:00", - "2017-12-06T00:00:00", - "2017-12-07T00:00:00", - "2017-12-08T00:00:00", - "2017-12-11T00:00:00", - "2017-12-12T00:00:00", - "2017-12-13T00:00:00", - "2017-12-14T00:00:00", - "2017-12-15T00:00:00", - "2017-12-18T00:00:00", - "2017-12-19T00:00:00", - "2017-12-20T00:00:00", - "2017-12-21T00:00:00", - "2017-12-22T00:00:00", - "2017-12-26T00:00:00", - "2017-12-27T00:00:00", - "2017-12-28T00:00:00", - "2017-12-29T00:00:00", - "2018-01-01T00:00:00", - "2018-01-02T00:00:00", - "2018-01-04T00:00:00", - "2018-01-05T00:00:00", - "2018-01-08T00:00:00", - "2018-01-09T00:00:00", - "2018-01-10T00:00:00", - "2018-01-11T00:00:00", - "2018-01-12T00:00:00", - "2018-01-15T00:00:00", - "2018-01-16T00:00:00", - "2018-01-17T00:00:00", - "2018-01-18T00:00:00", - "2018-01-19T00:00:00", - "2018-01-22T00:00:00", - "2018-01-23T00:00:00", - "2018-01-24T00:00:00", - "2018-01-25T00:00:00", - "2018-01-26T00:00:00", - "2018-01-29T00:00:00", - "2018-01-30T00:00:00", - "2018-01-31T00:00:00", - "2018-02-01T00:00:00", - "2018-02-02T00:00:00", - "2018-02-05T00:00:00", - "2018-02-06T00:00:00", - "2018-02-07T00:00:00", - "2018-02-08T00:00:00", - "2018-02-09T00:00:00", - "2018-02-12T00:00:00", - "2018-02-13T00:00:00", - "2018-02-14T00:00:00", - "2018-02-15T00:00:00", - "2018-02-16T00:00:00", - "2018-02-20T00:00:00", - "2018-02-21T00:00:00", - "2018-02-22T00:00:00", - "2018-02-23T00:00:00", - "2018-02-26T00:00:00", - "2018-02-27T00:00:00", - "2018-02-28T00:00:00", - "2018-03-01T00:00:00", - "2018-03-02T00:00:00", - "2018-03-05T00:00:00", - "2018-03-06T00:00:00", - "2018-03-07T00:00:00", - "2018-03-08T00:00:00", - "2018-03-09T00:00:00", - "2018-03-12T00:00:00", - "2018-03-13T00:00:00", - "2018-03-14T00:00:00", - "2018-03-15T00:00:00", - "2018-03-16T00:00:00", - "2018-03-19T00:00:00", - "2018-03-20T00:00:00", - "2018-03-21T00:00:00", - "2018-03-22T00:00:00", - "2018-03-23T00:00:00", - "2018-03-26T00:00:00", - "2018-03-27T00:00:00", - "2018-03-28T00:00:00", - "2018-03-29T00:00:00", - "2018-04-02T00:00:00", - "2018-04-03T00:00:00", - "2018-04-04T00:00:00", - "2018-04-05T00:00:00", - "2018-04-06T00:00:00", - "2018-04-09T00:00:00", - "2018-04-10T00:00:00", - "2018-04-11T00:00:00", - "2018-04-12T00:00:00", - "2018-04-13T00:00:00", - "2018-04-16T00:00:00", - "2018-04-17T00:00:00", - "2018-04-18T00:00:00", - "2018-04-19T00:00:00", - "2018-04-20T00:00:00", - "2018-04-23T00:00:00", - "2018-04-24T00:00:00", - "2018-04-25T00:00:00", - "2018-04-26T00:00:00", - "2018-04-27T00:00:00", - "2018-04-30T00:00:00", - "2018-05-01T00:00:00", - "2018-05-02T00:00:00", - "2018-05-03T00:00:00", - "2018-05-04T00:00:00", - "2018-05-07T00:00:00", - "2018-05-08T00:00:00", - "2018-05-09T00:00:00", - "2018-05-10T00:00:00", - "2018-05-11T00:00:00", - "2018-05-14T00:00:00", - "2018-05-15T00:00:00", - "2018-05-16T00:00:00", - "2018-05-17T00:00:00", - "2018-05-18T00:00:00", - "2018-05-21T00:00:00", - "2018-05-22T00:00:00", - "2018-05-23T00:00:00", - "2018-05-24T00:00:00", - "2018-05-25T00:00:00", - "2018-05-28T00:00:00", - "2018-05-29T00:00:00", - "2018-05-30T00:00:00", - "2018-05-31T00:00:00", - "2018-06-01T00:00:00", - "2018-06-04T00:00:00", - "2018-06-05T00:00:00", - "2018-06-06T00:00:00", - "2018-06-07T00:00:00", - "2018-06-08T00:00:00", - "2018-06-11T00:00:00", - "2018-06-12T00:00:00", - "2018-06-13T00:00:00", - "2018-06-14T00:00:00", - "2018-06-15T00:00:00", - "2018-06-18T00:00:00", - "2018-06-19T00:00:00", - "2018-06-20T00:00:00", - "2018-06-21T00:00:00", - "2018-06-22T00:00:00", - "2018-06-25T00:00:00", - "2018-06-26T00:00:00", - "2018-06-27T00:00:00", - "2018-06-28T00:00:00", - "2018-06-29T00:00:00", - "2018-07-02T00:00:00", - "2018-07-03T00:00:00", - "2018-07-05T00:00:00", - "2018-07-06T00:00:00", - "2018-07-09T00:00:00", - "2018-07-10T00:00:00", - "2018-07-11T00:00:00", - "2018-07-12T00:00:00", - "2018-07-13T00:00:00", - "2018-07-16T00:00:00", - "2018-07-17T00:00:00", - "2018-07-18T00:00:00", - "2018-07-19T00:00:00", - "2018-07-20T00:00:00", - "2018-07-23T00:00:00", - "2018-07-24T00:00:00", - "2018-07-25T00:00:00", - "2018-07-26T00:00:00", - "2018-07-27T00:00:00", - "2018-07-30T00:00:00", - "2018-07-31T00:00:00", - "2018-08-01T00:00:00", - "2018-08-02T00:00:00", - "2018-08-03T00:00:00", - "2018-08-06T00:00:00", - "2018-08-07T00:00:00", - "2018-08-08T00:00:00", - "2018-08-09T00:00:00", - "2018-08-10T00:00:00", - "2018-08-13T00:00:00", - "2018-08-14T00:00:00", - "2018-08-15T00:00:00", - "2018-08-16T00:00:00", - "2018-08-17T00:00:00", - "2018-08-20T00:00:00", - "2018-08-21T00:00:00", - "2018-08-22T00:00:00", - "2018-08-23T00:00:00", - "2018-08-24T00:00:00", - "2018-08-27T00:00:00", - "2018-08-28T00:00:00", - "2018-08-29T00:00:00", - "2018-08-30T00:00:00", - "2018-08-31T00:00:00", - "2018-09-03T00:00:00", - "2018-09-04T00:00:00", - "2018-09-05T00:00:00", - "2018-09-06T00:00:00", - "2018-09-07T00:00:00", - "2018-09-10T00:00:00", - "2018-09-11T00:00:00", - "2018-09-12T00:00:00", - "2018-09-13T00:00:00", - "2018-09-14T00:00:00", - "2018-09-17T00:00:00", - "2018-09-18T00:00:00", - "2018-09-19T00:00:00", - "2018-09-20T00:00:00", - "2018-09-21T00:00:00", - "2018-09-24T00:00:00", - "2018-09-25T00:00:00", - "2018-09-26T00:00:00", - "2018-09-27T00:00:00", - "2018-09-28T00:00:00", - "2018-10-01T00:00:00", - "2018-10-02T00:00:00", - "2018-10-03T00:00:00", - "2018-10-04T00:00:00", - "2018-10-05T00:00:00", - "2018-10-08T00:00:00", - "2018-10-09T00:00:00", - "2018-10-10T00:00:00", - "2018-10-11T00:00:00", - "2018-10-12T00:00:00", - "2018-10-15T00:00:00", - "2018-10-16T00:00:00", - "2018-10-17T00:00:00", - "2018-10-18T00:00:00", - "2018-10-19T00:00:00", - "2018-10-22T00:00:00", - "2018-10-23T00:00:00", - "2018-10-24T00:00:00", - "2018-10-25T00:00:00", - "2018-10-26T00:00:00", - "2018-10-29T00:00:00", - "2018-10-30T00:00:00", - "2018-10-31T00:00:00", - "2018-11-01T00:00:00", - "2018-11-02T00:00:00", - "2018-11-05T00:00:00", - "2018-11-06T00:00:00", - "2018-11-07T00:00:00", - "2018-11-08T00:00:00", - "2018-11-09T00:00:00", - "2018-11-12T00:00:00", - "2018-11-13T00:00:00", - "2018-11-14T00:00:00", - "2018-11-15T00:00:00", - "2018-11-16T00:00:00", - "2018-11-19T00:00:00", - "2018-11-20T00:00:00", - "2018-11-21T00:00:00", - "2018-11-23T00:00:00", - "2018-11-26T00:00:00", - "2018-11-27T00:00:00", - "2018-11-28T00:00:00", - "2018-11-29T00:00:00", - "2018-11-30T00:00:00", - "2018-12-03T00:00:00", - "2018-12-04T00:00:00", - "2018-12-06T00:00:00", - "2018-12-07T00:00:00", - "2018-12-10T00:00:00", - "2018-12-11T00:00:00", - "2018-12-12T00:00:00", - "2018-12-13T00:00:00", - "2018-12-14T00:00:00", - "2018-12-17T00:00:00", - "2018-12-18T00:00:00", - "2018-12-19T00:00:00", - "2018-12-20T00:00:00", - "2018-12-21T00:00:00", - "2018-12-24T00:00:00", - "2018-12-26T00:00:00", - "2018-12-27T00:00:00", - "2018-12-28T00:00:00", - "2018-12-31T00:00:00", - "2019-01-01T00:00:00", - "2019-01-02T00:00:00", - "2019-01-04T00:00:00", - "2019-01-08T00:00:00", - "2019-01-09T00:00:00", - "2019-01-10T00:00:00", - "2019-01-11T00:00:00", - "2019-01-16T00:00:00", - "2019-01-18T00:00:00", - "2019-01-22T00:00:00", - "2019-01-23T00:00:00", - "2019-01-24T00:00:00", - "2019-01-28T00:00:00", - "2019-01-29T00:00:00", - "2019-01-30T00:00:00", - "2019-01-31T00:00:00", - "2019-02-01T00:00:00", - "2019-02-04T00:00:00", - "2019-02-05T00:00:00", - "2019-02-06T00:00:00", - "2019-02-07T00:00:00", - "2019-02-08T00:00:00", - "2019-02-11T00:00:00", - "2019-02-12T00:00:00", - "2019-02-13T00:00:00", - "2019-02-14T00:00:00", - "2019-02-15T00:00:00", - "2019-02-18T00:00:00", - "2019-02-19T00:00:00", - "2019-02-20T00:00:00", - "2019-02-21T00:00:00", - "2019-02-22T00:00:00", - "2019-02-25T00:00:00", - "2019-02-26T00:00:00", - "2019-02-27T00:00:00", - "2019-02-28T00:00:00", - "2019-03-01T00:00:00", - "2019-03-04T00:00:00", - "2019-03-05T00:00:00", - "2019-03-06T00:00:00", - "2019-03-07T00:00:00", - "2019-03-08T00:00:00", - "2019-03-11T00:00:00", - "2019-03-12T00:00:00", - "2019-03-13T00:00:00", - "2019-03-14T00:00:00", - "2019-03-15T00:00:00", - "2019-03-18T00:00:00", - "2019-03-19T00:00:00", - "2019-03-20T00:00:00", - "2019-03-21T00:00:00", - "2019-03-22T00:00:00", - "2019-03-25T00:00:00", - "2019-03-26T00:00:00", - "2019-03-27T00:00:00", - "2019-03-28T00:00:00", - "2019-03-29T00:00:00", - "2019-04-01T00:00:00", - "2019-04-02T00:00:00", - "2019-04-03T00:00:00", - "2019-04-04T00:00:00", - "2019-04-05T00:00:00", - "2019-04-08T00:00:00", - "2019-04-09T00:00:00", - "2019-04-10T00:00:00", - "2019-04-11T00:00:00", - "2019-04-12T00:00:00", - "2019-04-15T00:00:00", - "2019-04-16T00:00:00", - "2019-04-17T00:00:00", - "2019-04-18T00:00:00", - "2019-04-19T00:00:00", - "2019-04-22T00:00:00", - "2019-04-23T00:00:00", - "2019-04-24T00:00:00", - "2019-04-25T00:00:00", - "2019-04-26T00:00:00", - "2019-04-29T00:00:00", - "2019-04-30T00:00:00", - "2019-05-01T00:00:00", - "2019-05-02T00:00:00", - "2019-05-03T00:00:00", - "2019-05-06T00:00:00", - "2019-05-07T00:00:00", - "2019-05-08T00:00:00", - "2019-05-09T00:00:00", - "2019-05-10T00:00:00", - "2019-05-13T00:00:00", - "2019-05-14T00:00:00", - "2019-05-15T00:00:00", - "2019-05-16T00:00:00", - "2019-05-17T00:00:00", - "2019-05-20T00:00:00", - "2019-05-21T00:00:00", - "2019-05-22T00:00:00", - "2019-05-23T00:00:00", - "2019-05-24T00:00:00", - "2019-05-28T00:00:00", - "2019-05-29T00:00:00", - "2019-05-30T00:00:00", - "2019-05-31T00:00:00", - "2019-06-03T00:00:00", - "2019-06-04T00:00:00", - "2019-06-05T00:00:00", - "2019-06-06T00:00:00", - "2019-06-07T00:00:00", - "2019-06-10T00:00:00", - "2019-06-11T00:00:00", - "2019-06-12T00:00:00", - "2019-06-13T00:00:00", - "2019-06-14T00:00:00", - "2019-06-17T00:00:00", - "2019-06-18T00:00:00", - "2019-06-19T00:00:00", - "2019-06-20T00:00:00", - "2019-06-21T00:00:00", - "2019-06-24T00:00:00", - "2019-06-25T00:00:00", - "2019-06-26T00:00:00", - "2019-06-27T00:00:00", - "2019-06-28T00:00:00", - "2019-07-01T00:00:00", - "2019-07-02T00:00:00", - "2019-07-03T00:00:00", - "2019-07-04T00:00:00", - "2019-07-05T00:00:00", - "2019-07-08T00:00:00", - "2019-07-09T00:00:00", - "2019-07-10T00:00:00", - "2019-07-11T00:00:00", - "2019-07-12T00:00:00", - "2019-07-15T00:00:00", - "2019-07-16T00:00:00", - "2019-07-17T00:00:00", - "2019-07-18T00:00:00", - "2019-07-19T00:00:00", - "2019-07-22T00:00:00", - "2019-07-23T00:00:00", - "2019-07-24T00:00:00", - "2019-07-25T00:00:00", - "2019-07-26T00:00:00", - "2019-07-29T00:00:00", - "2019-07-30T00:00:00", - "2019-07-31T00:00:00", - "2019-08-01T00:00:00", - "2019-08-02T00:00:00", - "2019-08-05T00:00:00", - "2019-08-06T00:00:00", - "2019-08-07T00:00:00", - "2019-08-08T00:00:00", - "2019-08-09T00:00:00", - "2019-08-12T00:00:00", - "2019-08-13T00:00:00", - "2019-08-14T00:00:00", - "2019-08-15T00:00:00", - "2019-08-16T00:00:00", - "2019-08-19T00:00:00", - "2019-08-20T00:00:00", - "2019-08-21T00:00:00", - "2019-08-22T00:00:00", - "2019-08-23T00:00:00", - "2019-08-26T00:00:00", - "2019-08-27T00:00:00", - "2019-08-28T00:00:00", - "2019-08-29T00:00:00", - "2019-08-30T00:00:00", - "2019-09-03T00:00:00", - "2019-09-04T00:00:00", - "2019-09-05T00:00:00", - "2019-09-06T00:00:00", - "2019-09-09T00:00:00", - "2019-09-10T00:00:00", - "2019-09-11T00:00:00", - "2019-09-12T00:00:00", - "2019-09-13T00:00:00", - "2019-09-16T00:00:00", - "2019-09-17T00:00:00", - "2019-09-18T00:00:00", - "2019-09-19T00:00:00", - "2019-09-20T00:00:00", - "2019-09-23T00:00:00", - "2019-09-24T00:00:00", - "2019-09-25T00:00:00", - "2019-09-26T00:00:00", - "2019-09-27T00:00:00", - "2019-09-30T00:00:00", - "2019-10-01T00:00:00", - "2019-10-02T00:00:00", - "2019-10-03T00:00:00", - "2019-10-04T00:00:00", - "2019-10-07T00:00:00", - "2019-10-08T00:00:00", - "2019-10-09T00:00:00", - "2019-10-10T00:00:00", - "2019-10-11T00:00:00", - "2019-10-14T00:00:00", - "2019-10-15T00:00:00", - "2019-10-16T00:00:00", - "2019-10-17T00:00:00", - "2019-10-18T00:00:00", - "2019-10-21T00:00:00", - "2019-10-22T00:00:00", - "2019-10-23T00:00:00", - "2019-10-24T00:00:00", - "2019-10-25T00:00:00", - "2019-10-28T00:00:00", - "2019-10-29T00:00:00", - "2019-10-30T00:00:00", - "2019-10-31T00:00:00", - "2019-11-01T00:00:00", - "2019-11-04T00:00:00", - "2019-11-05T00:00:00", - "2019-11-06T00:00:00", - "2019-11-07T00:00:00", - "2019-11-08T00:00:00", - "2019-11-11T00:00:00", - "2019-11-12T00:00:00", - "2019-11-13T00:00:00", - "2019-11-14T00:00:00", - "2019-11-15T00:00:00", - "2019-11-18T00:00:00", - "2019-11-19T00:00:00", - "2019-11-20T00:00:00", - "2019-11-21T00:00:00", - "2019-11-22T00:00:00", - "2019-11-25T00:00:00", - "2019-11-26T00:00:00", - "2019-11-27T00:00:00", - "2019-11-28T00:00:00", - "2019-11-29T00:00:00", - "2019-12-02T00:00:00", - "2019-12-03T00:00:00", - "2019-12-04T00:00:00", - "2019-12-05T00:00:00", - "2019-12-06T00:00:00", - "2019-12-09T00:00:00", - "2019-12-10T00:00:00", - "2019-12-11T00:00:00", - "2019-12-12T00:00:00", - "2019-12-13T00:00:00", - "2019-12-16T00:00:00", - "2019-12-17T00:00:00", - "2019-12-18T00:00:00", - "2019-12-19T00:00:00", - "2019-12-20T00:00:00", - "2019-12-23T00:00:00", - "2019-12-24T00:00:00", - "2019-12-26T00:00:00", - "2019-12-27T00:00:00", - "2019-12-30T00:00:00", - "2019-12-31T00:00:00", - "2020-01-01T00:00:00", - "2020-01-02T00:00:00", - "2020-01-06T00:00:00", - "2020-01-07T00:00:00", - "2020-01-08T00:00:00", - "2020-01-09T00:00:00", - "2020-01-10T00:00:00", - "2020-01-13T00:00:00", - "2020-01-14T00:00:00", - "2020-01-15T00:00:00", - "2020-01-16T00:00:00", - "2020-01-17T00:00:00", - "2020-01-21T00:00:00", - "2020-01-22T00:00:00", - "2020-01-23T00:00:00", - "2020-01-24T00:00:00", - "2020-01-27T00:00:00", - "2020-01-28T00:00:00", - "2020-01-29T00:00:00", - "2020-01-30T00:00:00", - "2020-01-31T00:00:00", - "2020-02-03T00:00:00", - "2020-02-04T00:00:00", - "2020-02-05T00:00:00", - "2020-02-06T00:00:00", - "2020-02-07T00:00:00", - "2020-02-10T00:00:00", - "2020-02-11T00:00:00", - "2020-02-12T00:00:00", - "2020-02-13T00:00:00", - "2020-02-14T00:00:00", - "2020-02-18T00:00:00", - "2020-02-19T00:00:00", - "2020-02-20T00:00:00", - "2020-02-21T00:00:00", - "2020-02-24T00:00:00", - "2020-02-25T00:00:00", - "2020-02-26T00:00:00", - "2020-02-27T00:00:00", - "2020-02-28T00:00:00", - "2020-03-02T00:00:00", - "2020-03-03T00:00:00", - "2020-03-04T00:00:00", - "2020-03-05T00:00:00", - "2020-03-06T00:00:00", - "2020-03-09T00:00:00", - "2020-03-10T00:00:00", - "2020-03-11T00:00:00", - "2020-03-12T00:00:00", - "2020-03-13T00:00:00", - "2020-03-16T00:00:00", - "2020-03-17T00:00:00", - "2020-03-18T00:00:00", - "2020-03-19T00:00:00", - "2020-03-20T00:00:00", - "2020-03-23T00:00:00", - "2020-03-24T00:00:00", - "2020-03-25T00:00:00", - "2020-03-26T00:00:00", - "2020-03-27T00:00:00", - "2020-03-30T00:00:00", - "2020-03-31T00:00:00", - "2020-04-01T00:00:00", - "2020-04-02T00:00:00", - "2020-04-03T00:00:00", - "2020-04-06T00:00:00", - "2020-04-07T00:00:00", - "2020-04-08T00:00:00", - "2020-04-09T00:00:00", - "2020-04-13T00:00:00", - "2020-04-14T00:00:00", - "2020-04-15T00:00:00", - "2020-04-16T00:00:00", - "2020-04-17T00:00:00", - "2020-04-20T00:00:00", - "2020-04-21T00:00:00", - "2020-04-22T00:00:00", - "2020-04-23T00:00:00", - "2020-04-24T00:00:00", - "2020-04-27T00:00:00", - "2020-04-28T00:00:00", - "2020-04-29T00:00:00", - "2020-04-30T00:00:00", - "2020-05-01T00:00:00", - "2020-05-04T00:00:00", - "2020-05-05T00:00:00", - "2020-05-06T00:00:00", - "2020-05-07T00:00:00", - "2020-05-08T00:00:00", - "2020-05-11T00:00:00", - "2020-05-12T00:00:00", - "2020-05-13T00:00:00", - "2020-05-14T00:00:00", - "2020-05-15T00:00:00", - "2020-05-18T00:00:00", - "2020-05-19T00:00:00", - "2020-05-20T00:00:00", - "2020-05-21T00:00:00", - "2020-05-22T00:00:00", - "2020-05-26T00:00:00", - "2020-05-27T00:00:00", - "2020-05-28T00:00:00", - "2020-05-29T00:00:00", - "2020-06-01T00:00:00", - "2020-06-02T00:00:00", - "2020-06-03T00:00:00", - "2020-06-04T00:00:00", - "2020-06-05T00:00:00", - "2020-06-08T00:00:00", - "2020-06-09T00:00:00", - "2020-06-10T00:00:00", - "2020-06-11T00:00:00", - "2020-06-12T00:00:00", - "2020-06-15T00:00:00", - "2020-06-16T00:00:00", - "2020-06-17T00:00:00", - "2020-06-18T00:00:00", - "2020-06-19T00:00:00", - "2020-06-22T00:00:00", - "2020-06-23T00:00:00", - "2020-06-24T00:00:00", - "2020-06-25T00:00:00", - "2020-06-26T00:00:00", - "2020-06-29T00:00:00", - "2020-06-30T00:00:00", - "2020-07-01T00:00:00", - "2020-07-02T00:00:00", - "2020-07-06T00:00:00", - "2020-07-07T00:00:00", - "2020-07-08T00:00:00", - "2020-07-09T00:00:00", - "2020-07-10T00:00:00", - "2020-07-13T00:00:00", - "2020-07-14T00:00:00", - "2020-07-15T00:00:00", - "2020-07-16T00:00:00", - "2020-07-17T00:00:00", - "2020-07-20T00:00:00", - "2020-07-21T00:00:00", - "2020-07-22T00:00:00", - "2020-07-23T00:00:00", - "2020-07-24T00:00:00", - "2020-07-27T00:00:00", - "2020-07-28T00:00:00", - "2020-07-29T00:00:00", - "2020-07-30T00:00:00", - "2020-07-31T00:00:00", - "2020-08-03T00:00:00", - "2020-08-04T00:00:00", - "2020-08-05T00:00:00", - "2020-08-06T00:00:00", - "2020-08-07T00:00:00", - "2020-08-10T00:00:00", - "2020-08-11T00:00:00", - "2020-08-12T00:00:00", - "2020-08-13T00:00:00", - "2020-08-14T00:00:00", - "2020-08-17T00:00:00", - "2020-08-18T00:00:00", - "2020-08-19T00:00:00", - "2020-08-20T00:00:00", - "2020-08-21T00:00:00", - "2020-08-24T00:00:00", - "2020-08-25T00:00:00", - "2020-08-26T00:00:00", - "2020-08-27T00:00:00", - "2020-08-28T00:00:00", - "2020-08-31T00:00:00", - "2020-09-01T00:00:00", - "2020-09-02T00:00:00", - "2020-09-03T00:00:00", - "2020-09-04T00:00:00", - "2020-09-08T00:00:00", - "2020-09-09T00:00:00", - "2020-09-10T00:00:00", - "2020-09-11T00:00:00", - "2020-09-14T00:00:00", - "2020-09-15T00:00:00", - "2020-09-16T00:00:00", - "2020-09-17T00:00:00", - "2020-09-18T00:00:00", - "2020-09-21T00:00:00", - "2020-09-22T00:00:00", - "2020-09-23T00:00:00", - "2020-09-24T00:00:00", - "2020-09-25T00:00:00", - "2020-09-28T00:00:00", - "2020-09-29T00:00:00", - "2020-09-30T00:00:00", - "2020-10-01T00:00:00", - "2020-10-02T00:00:00", - "2020-10-05T00:00:00", - "2020-10-06T00:00:00", - "2020-10-07T00:00:00", - "2020-10-08T00:00:00", - "2020-10-09T00:00:00", - "2020-10-12T00:00:00", - "2020-10-13T00:00:00", - "2020-10-14T00:00:00", - "2020-10-15T00:00:00", - "2020-10-16T00:00:00", - "2020-10-19T00:00:00", - "2020-10-20T00:00:00", - "2020-10-21T00:00:00", - "2020-10-22T00:00:00", - "2020-10-23T00:00:00", - "2020-10-26T00:00:00", - "2020-10-27T00:00:00", - "2020-10-28T00:00:00", - "2020-10-29T00:00:00", - "2020-10-30T00:00:00", - "2020-11-02T00:00:00", - "2020-11-03T00:00:00", - "2020-11-04T00:00:00", - "2020-11-05T00:00:00", - "2020-11-06T00:00:00", - "2020-11-09T00:00:00", - "2020-11-10T00:00:00", - "2020-11-11T00:00:00", - "2020-11-12T00:00:00", - "2020-11-13T00:00:00", - "2020-11-16T00:00:00", - "2020-11-17T00:00:00", - "2020-11-18T00:00:00", - "2020-11-19T00:00:00", - "2020-11-20T00:00:00", - "2020-11-23T00:00:00", - "2020-11-24T00:00:00", - "2020-11-25T00:00:00", - "2020-11-27T00:00:00", - "2020-11-30T00:00:00", - "2020-12-01T00:00:00", - "2020-12-02T00:00:00", - "2020-12-03T00:00:00", - "2020-12-04T00:00:00", - "2020-12-07T00:00:00", - "2020-12-08T00:00:00", - "2020-12-09T00:00:00", - "2020-12-10T00:00:00", - "2020-12-11T00:00:00", - "2020-12-14T00:00:00", - "2020-12-15T00:00:00", - "2020-12-16T00:00:00", - "2020-12-17T00:00:00", - "2020-12-18T00:00:00", - "2020-12-21T00:00:00", - "2020-12-22T00:00:00", - "2020-12-23T00:00:00", - "2020-12-24T00:00:00", - "2020-12-28T00:00:00", - "2020-12-29T00:00:00", - "2020-12-30T00:00:00", - "2020-12-31T00:00:00", - "2021-01-01T00:00:00", - "2021-01-04T00:00:00", - "2021-01-06T00:00:00", - "2021-01-07T00:00:00", - "2021-01-08T00:00:00", - "2021-01-11T00:00:00", - "2021-01-12T00:00:00", - "2021-01-13T00:00:00", - "2021-01-14T00:00:00", - "2021-01-15T00:00:00", - "2021-01-19T00:00:00", - "2021-01-20T00:00:00", - "2021-01-21T00:00:00", - "2021-01-22T00:00:00", - "2021-01-25T00:00:00", - "2021-01-26T00:00:00", - "2021-01-27T00:00:00", - "2021-01-28T00:00:00", - "2021-01-29T00:00:00", - "2021-02-01T00:00:00", - "2021-02-02T00:00:00", - "2021-02-03T00:00:00", - "2021-02-04T00:00:00", - "2021-02-05T00:00:00", - "2021-02-08T00:00:00", - "2021-02-09T00:00:00", - "2021-02-10T00:00:00", - "2021-02-11T00:00:00", - "2021-02-12T00:00:00", - "2021-02-16T00:00:00", - "2021-02-17T00:00:00", - "2021-02-18T00:00:00", - "2021-02-19T00:00:00", - "2021-02-22T00:00:00", - "2021-02-23T00:00:00", - "2021-02-24T00:00:00", - "2021-02-25T00:00:00", - "2021-02-26T00:00:00", - "2021-03-01T00:00:00", - "2021-03-02T00:00:00", - "2021-03-03T00:00:00", - "2021-03-04T00:00:00", - "2021-03-05T00:00:00", - "2021-03-08T00:00:00", - "2021-03-09T00:00:00", - "2021-03-10T00:00:00", - "2021-03-11T00:00:00", - "2021-03-12T00:00:00", - "2021-03-15T00:00:00", - "2021-03-16T00:00:00", - "2021-03-17T00:00:00", - "2021-03-18T00:00:00", - "2021-03-19T00:00:00", - "2021-03-22T00:00:00", - "2021-03-23T00:00:00", - "2021-03-24T00:00:00", - "2021-03-25T00:00:00", - "2021-03-26T00:00:00", - "2021-03-29T00:00:00", - "2021-03-30T00:00:00", - "2021-03-31T00:00:00", - "2021-04-01T00:00:00", - "2021-04-05T00:00:00", - "2021-04-06T00:00:00", - "2021-04-07T00:00:00", - "2021-04-08T00:00:00", - "2021-04-09T00:00:00", - "2021-04-12T00:00:00", - "2021-04-13T00:00:00", - "2021-04-14T00:00:00", - "2021-04-15T00:00:00", - "2021-04-16T00:00:00", - "2021-04-19T00:00:00", - "2021-04-20T00:00:00", - "2021-04-21T00:00:00", - "2021-04-22T00:00:00", - "2021-04-23T00:00:00", - "2021-04-26T00:00:00", - "2021-04-27T00:00:00", - "2021-04-28T00:00:00", - "2021-04-29T00:00:00", - "2021-04-30T00:00:00", - "2021-05-03T00:00:00", - "2021-05-04T00:00:00", - "2021-05-05T00:00:00", - "2021-05-06T00:00:00", - "2021-05-07T00:00:00", - "2021-05-10T00:00:00", - "2021-05-11T00:00:00", - "2021-05-12T00:00:00", - "2021-05-13T00:00:00", - "2021-05-14T00:00:00", - "2021-05-17T00:00:00", - "2021-05-18T00:00:00", - "2021-05-19T00:00:00", - "2021-05-20T00:00:00", - "2021-05-21T00:00:00", - "2021-05-24T00:00:00", - "2021-05-25T00:00:00", - "2021-05-26T00:00:00", - "2021-05-27T00:00:00", - "2021-05-28T00:00:00", - "2021-06-01T00:00:00", - "2021-06-02T00:00:00", - "2021-06-03T00:00:00", - "2021-06-04T00:00:00", - "2021-06-07T00:00:00", - "2021-06-08T00:00:00", - "2021-06-09T00:00:00", - "2021-06-10T00:00:00", - "2021-06-11T00:00:00", - "2021-06-14T00:00:00", - "2021-06-15T00:00:00", - "2021-06-16T00:00:00", - "2021-06-17T00:00:00", - "2021-06-18T00:00:00", - "2021-06-21T00:00:00", - "2021-06-22T00:00:00", - "2021-06-23T00:00:00", - "2021-06-24T00:00:00", - "2021-06-25T00:00:00", - "2021-06-28T00:00:00", - "2021-06-29T00:00:00", - "2021-06-30T00:00:00", - "2021-07-01T00:00:00", - "2021-07-02T00:00:00", - "2021-07-05T00:00:00", - "2021-07-06T00:00:00", - "2021-07-07T00:00:00", - "2021-07-08T00:00:00", - "2021-07-09T00:00:00", - "2021-07-12T00:00:00", - "2021-07-13T00:00:00", - "2021-07-14T00:00:00", - "2021-07-15T00:00:00", - "2021-07-16T00:00:00", - "2021-07-19T00:00:00", - "2021-07-20T00:00:00", - "2021-07-21T00:00:00", - "2021-07-22T00:00:00", - "2021-07-23T00:00:00", - "2021-07-26T00:00:00", - "2021-07-27T00:00:00", - "2021-07-28T00:00:00", - "2021-07-29T00:00:00", - "2021-07-30T00:00:00", - "2021-08-02T00:00:00", - "2021-08-03T00:00:00", - "2021-08-04T00:00:00", - "2021-08-05T00:00:00", - "2021-08-06T00:00:00", - "2021-08-09T00:00:00", - "2021-08-10T00:00:00", - "2021-08-11T00:00:00", - "2021-08-12T00:00:00", - "2021-08-13T00:00:00", - "2021-08-16T00:00:00", - "2021-08-17T00:00:00", - "2021-08-18T00:00:00", - "2021-08-19T00:00:00", - "2021-08-20T00:00:00", - "2021-08-23T00:00:00", - "2021-08-24T00:00:00", - "2021-08-25T00:00:00", - "2021-08-26T00:00:00", - "2021-08-27T00:00:00", - "2021-08-30T00:00:00", - "2021-08-31T00:00:00", - "2021-09-01T00:00:00", - "2021-09-02T00:00:00", - "2021-09-03T00:00:00", - "2021-09-07T00:00:00", - "2021-09-08T00:00:00", - "2021-09-09T00:00:00", - "2021-09-10T00:00:00", - "2021-09-13T00:00:00", - "2021-09-14T00:00:00", - "2021-09-15T00:00:00", - "2021-09-16T00:00:00", - "2021-09-17T00:00:00", - "2021-09-20T00:00:00", - "2021-09-21T00:00:00", - "2021-09-22T00:00:00", - "2021-09-23T00:00:00", - "2021-09-24T00:00:00", - "2021-09-27T00:00:00", - "2021-09-28T00:00:00", - "2021-09-29T00:00:00", - "2021-09-30T00:00:00", - "2021-10-01T00:00:00", - "2021-10-04T00:00:00", - "2021-10-05T00:00:00", - "2021-10-06T00:00:00", - "2021-10-07T00:00:00", - "2021-10-08T00:00:00", - "2021-10-11T00:00:00", - "2021-10-12T00:00:00", - "2021-10-13T00:00:00", - "2021-10-14T00:00:00", - "2021-10-15T00:00:00", - "2021-10-18T00:00:00", - "2021-10-19T00:00:00", - "2021-10-20T00:00:00", - "2021-10-21T00:00:00", - "2021-10-22T00:00:00", - "2021-10-25T00:00:00", - "2021-10-26T00:00:00", - "2021-10-27T00:00:00", - "2021-10-28T00:00:00", - "2021-10-29T00:00:00", - "2021-11-01T00:00:00", - "2021-11-02T00:00:00", - "2021-11-03T00:00:00", - "2021-11-04T00:00:00", - "2021-11-05T00:00:00", - "2021-11-08T00:00:00", - "2021-11-09T00:00:00", - "2021-11-10T00:00:00", - "2021-11-11T00:00:00", - "2021-11-12T00:00:00", - "2021-11-15T00:00:00", - "2021-11-16T00:00:00", - "2021-11-17T00:00:00", - "2021-11-18T00:00:00", - "2021-11-19T00:00:00", - "2021-11-22T00:00:00", - "2021-11-23T00:00:00", - "2021-11-24T00:00:00", - "2021-11-25T00:00:00", - "2021-11-26T00:00:00", - "2021-11-29T00:00:00", - "2021-11-30T00:00:00", - "2021-12-01T00:00:00", - "2021-12-02T00:00:00", - "2021-12-03T00:00:00", - "2021-12-06T00:00:00", - "2021-12-07T00:00:00", - "2021-12-08T00:00:00", - "2021-12-09T00:00:00", - "2021-12-10T00:00:00", - "2021-12-13T00:00:00", - "2021-12-14T00:00:00", - "2021-12-15T00:00:00", - "2021-12-16T00:00:00", - "2021-12-17T00:00:00", - "2021-12-20T00:00:00", - "2021-12-21T00:00:00", - "2021-12-22T00:00:00", - "2021-12-23T00:00:00", - "2021-12-27T00:00:00", - "2021-12-28T00:00:00", - "2021-12-29T00:00:00", - "2021-12-30T00:00:00", - "2021-12-31T00:00:00", - "2022-01-03T00:00:00", - "2022-01-05T00:00:00", - "2022-01-06T00:00:00", - "2022-01-07T00:00:00", - "2022-01-10T00:00:00", - "2022-01-11T00:00:00", - "2022-01-12T00:00:00", - "2022-01-13T00:00:00", - "2022-01-14T00:00:00", - "2022-01-18T00:00:00", - "2022-01-19T00:00:00", - "2022-01-20T00:00:00", - "2022-01-21T00:00:00", - "2022-01-24T00:00:00", - "2022-01-25T00:00:00", - "2022-01-26T00:00:00", - "2022-01-27T00:00:00", - "2022-01-28T00:00:00", - "2022-01-31T00:00:00", - "2022-02-01T00:00:00", - "2022-02-02T00:00:00", - "2022-02-03T00:00:00", - "2022-02-04T00:00:00", - "2022-02-07T00:00:00", - "2022-02-08T00:00:00", - "2022-02-09T00:00:00", - "2022-02-10T00:00:00", - "2022-02-11T00:00:00", - "2022-02-14T00:00:00", - "2022-02-15T00:00:00", - "2022-02-16T00:00:00", - "2022-02-17T00:00:00", - "2022-02-18T00:00:00", - "2022-02-22T00:00:00", - "2022-02-23T00:00:00", - "2022-02-24T00:00:00", - "2022-02-25T00:00:00", - "2022-02-28T00:00:00", - "2022-03-01T00:00:00", - "2022-03-02T00:00:00", - "2022-03-03T00:00:00", - "2022-03-04T00:00:00", - "2022-03-07T00:00:00", - "2022-03-08T00:00:00", - "2022-03-09T00:00:00", - "2022-03-10T00:00:00", - "2022-03-11T00:00:00", - "2022-03-14T00:00:00", - "2022-03-15T00:00:00", - "2022-03-16T00:00:00", - "2022-03-17T00:00:00", - "2022-03-18T00:00:00", - "2022-03-21T00:00:00", - "2022-03-22T00:00:00", - "2022-03-23T00:00:00", - "2022-03-24T00:00:00", - "2022-03-25T00:00:00", - "2022-03-28T00:00:00", - "2022-03-29T00:00:00", - "2022-03-30T00:00:00", - "2022-03-31T00:00:00", - "2022-04-01T00:00:00", - "2022-04-04T00:00:00", - "2022-04-05T00:00:00", - "2022-04-06T00:00:00", - "2022-04-07T00:00:00", - "2022-04-08T00:00:00", - "2022-04-11T00:00:00", - "2022-04-12T00:00:00", - "2022-04-13T00:00:00", - "2022-04-14T00:00:00", - "2022-04-18T00:00:00", - "2022-04-19T00:00:00", - "2022-04-20T00:00:00", - "2022-04-21T00:00:00", - "2022-04-22T00:00:00", - "2022-04-25T00:00:00", - "2022-04-26T00:00:00", - "2022-04-27T00:00:00", - "2022-04-28T00:00:00", - "2022-04-29T00:00:00", - "2022-05-03T00:00:00", - "2022-05-04T00:00:00", - "2022-05-05T00:00:00", - "2022-05-06T00:00:00", - "2022-05-09T00:00:00", - "2022-05-10T00:00:00", - "2022-08-01T00:00:00", - "2022-08-02T00:00:00", - "2022-08-03T00:00:00", - "2022-08-04T00:00:00", - "2022-08-05T00:00:00", - "2022-08-08T00:00:00", - "2022-08-09T00:00:00", - "2022-08-10T00:00:00", - "2022-08-11T00:00:00", - "2022-08-12T00:00:00", - "2022-08-15T00:00:00", - "2022-08-16T00:00:00", - "2022-08-17T00:00:00", - "2022-08-18T00:00:00", - "2022-08-19T00:00:00", - "2022-08-22T00:00:00", - "2022-08-23T00:00:00", - "2022-08-24T00:00:00", - "2022-08-25T00:00:00", - "2022-08-26T00:00:00", - "2022-08-29T00:00:00", - "2022-08-30T00:00:00", - "2022-08-31T00:00:00", - "2022-09-01T00:00:00", - "2022-09-02T00:00:00", - "2022-09-06T00:00:00", - "2022-09-07T00:00:00", - "2022-09-14T00:00:00", - "2022-09-15T00:00:00", - "2022-10-27T00:00:00", - "2022-10-28T00:00:00", - "2022-10-31T00:00:00", - "2022-11-01T00:00:00", - "2022-11-02T00:00:00", - "2022-11-03T00:00:00", - "2022-11-04T00:00:00", - "2022-11-14T00:00:00", - "2022-11-15T00:00:00", - "2022-11-16T00:00:00", - "2022-11-17T00:00:00", - "2022-11-18T00:00:00", - "2022-11-21T00:00:00", - "2022-11-22T00:00:00", - "2022-11-23T00:00:00", - "2022-11-25T00:00:00", - "2022-11-28T00:00:00", - "2022-11-29T00:00:00", - "2022-11-30T00:00:00", - "2022-12-01T00:00:00", - "2022-12-02T00:00:00", - "2022-12-05T00:00:00", - "2022-12-06T00:00:00", - "2022-12-07T00:00:00", - "2022-12-08T00:00:00", - "2022-12-09T00:00:00", - "2022-12-12T00:00:00", - "2022-12-13T00:00:00", - "2022-12-14T00:00:00", - "2022-12-15T00:00:00", - "2022-12-16T00:00:00", - "2022-12-19T00:00:00", - "2022-12-20T00:00:00", - "2022-12-21T00:00:00", - "2022-12-22T00:00:00", - "2022-12-23T00:00:00", - "2022-12-27T00:00:00", - "2022-12-28T00:00:00", - "2022-12-29T00:00:00", - "2022-12-30T00:00:00", - "2023-01-02T00:00:00", - "2023-01-03T00:00:00", - "2023-01-05T00:00:00", - "2023-01-06T00:00:00", - "2023-01-09T00:00:00", - "2023-01-10T00:00:00", - "2023-01-11T00:00:00", - "2023-01-12T00:00:00", - "2023-01-13T00:00:00", - "2023-01-17T00:00:00", - "2023-01-18T00:00:00", - "2023-01-19T00:00:00", - "2023-01-20T00:00:00", - "2023-01-23T00:00:00", - "2023-01-24T00:00:00", - "2023-01-25T00:00:00", - "2023-01-26T00:00:00", - "2023-01-27T00:00:00", - "2023-01-30T00:00:00", - "2023-01-31T00:00:00", - "2023-02-01T00:00:00", - "2023-02-02T00:00:00", - "2023-02-03T00:00:00", - "2023-02-06T00:00:00", - "2023-02-07T00:00:00", - "2023-02-08T00:00:00", - "2023-02-09T00:00:00", - "2023-02-10T00:00:00", - "2023-02-13T00:00:00", - "2023-02-14T00:00:00", - "2023-02-15T00:00:00", - "2023-02-16T00:00:00", - "2023-02-17T00:00:00", - "2023-02-21T00:00:00", - "2023-02-22T00:00:00", - "2023-02-23T00:00:00", - "2023-02-24T00:00:00", - "2023-02-27T00:00:00", - "2023-02-28T00:00:00", - "2023-03-01T00:00:00", - "2023-03-02T00:00:00", - "2023-03-03T00:00:00", - "2023-03-06T00:00:00", - "2023-03-07T00:00:00", - "2023-03-08T00:00:00", - "2023-03-09T00:00:00", - "2023-03-10T00:00:00", - "2023-03-13T00:00:00", - "2023-03-14T00:00:00", - "2023-03-15T00:00:00", - "2023-03-16T00:00:00", - "2023-03-17T00:00:00", - "2023-03-20T00:00:00", - "2023-03-21T00:00:00", - "2023-03-22T00:00:00", - "2023-03-23T00:00:00", - "2023-03-24T00:00:00", - "2023-03-27T00:00:00", - "2023-03-28T00:00:00", - "2023-03-29T00:00:00", - "2023-03-30T00:00:00", - "2023-03-31T00:00:00", - "2023-04-03T00:00:00", - "2023-04-04T00:00:00", - "2023-04-05T00:00:00", - "2023-04-06T00:00:00", - "2023-04-07T00:00:00", - "2023-04-10T00:00:00", - "2023-04-11T00:00:00", - "2023-04-12T00:00:00", - "2023-04-13T00:00:00", - "2023-04-14T00:00:00", - "2023-04-17T00:00:00", - "2023-04-18T00:00:00", - "2023-04-19T00:00:00", - "2023-04-20T00:00:00", - "2023-04-21T00:00:00", - "2023-04-24T00:00:00", - "2023-04-25T00:00:00", - "2023-04-26T00:00:00", - "2023-04-27T00:00:00", - "2023-04-28T00:00:00", - "2023-05-01T00:00:00", - "2023-05-02T00:00:00", - "2023-05-03T00:00:00", - "2023-05-04T00:00:00", - "2023-05-05T00:00:00", - "2023-05-08T00:00:00", - "2023-05-09T00:00:00", - "2023-05-10T00:00:00", - "2023-05-11T00:00:00", - "2023-05-12T00:00:00", - "2023-05-15T00:00:00", - "2023-05-16T00:00:00", - "2023-05-17T00:00:00", - "2023-05-18T00:00:00", - "2023-05-19T00:00:00", - "2023-05-22T00:00:00", - "2023-05-23T00:00:00", - "2023-05-24T00:00:00", - "2023-05-25T00:00:00", - "2023-05-26T00:00:00", - "2023-05-30T00:00:00", - "2023-05-31T00:00:00", - "2023-06-01T00:00:00", - "2023-06-02T00:00:00", - "2023-06-05T00:00:00", - "2023-06-06T00:00:00", - "2023-06-07T00:00:00", - "2023-06-08T00:00:00", - "2023-06-09T00:00:00", - "2023-06-12T00:00:00", - "2023-06-13T00:00:00", - "2023-06-14T00:00:00", - "2023-06-15T00:00:00", - "2023-06-16T00:00:00", - "2023-06-19T00:00:00", - "2023-06-20T00:00:00", - "2023-06-21T00:00:00", - "2023-06-22T00:00:00", - "2023-06-23T00:00:00", - "2023-06-26T00:00:00", - "2023-06-27T00:00:00", - "2023-06-28T00:00:00", - "2023-06-29T00:00:00", - "2023-06-30T00:00:00", - "2023-07-03T00:00:00", - "2023-07-05T00:00:00", - "2023-07-06T00:00:00", - "2023-07-07T00:00:00", - "2023-07-10T00:00:00", - "2023-07-11T00:00:00", - "2023-07-12T00:00:00", - "2023-07-13T00:00:00", - "2023-07-14T00:00:00", - "2023-07-17T00:00:00", - "2023-07-18T00:00:00", - "2023-07-19T00:00:00", - "2023-07-20T00:00:00", - "2023-07-21T00:00:00", - "2023-07-24T00:00:00", - "2023-07-25T00:00:00", - "2023-07-26T00:00:00", - "2023-07-27T00:00:00", - "2023-07-28T00:00:00", - "2023-07-31T00:00:00", - "2023-08-01T00:00:00", - "2023-08-02T00:00:00", - "2023-08-03T00:00:00", - "2023-08-04T00:00:00", - "2023-08-07T00:00:00", - "2023-08-08T00:00:00", - "2023-08-09T00:00:00", - "2023-08-10T00:00:00", - "2023-08-11T00:00:00", - "2023-08-14T00:00:00", - "2023-08-15T00:00:00", - "2023-08-16T00:00:00", - "2023-08-17T00:00:00", - "2023-08-18T00:00:00", - "2023-08-21T00:00:00", - "2023-08-22T00:00:00", - "2023-08-23T00:00:00", - "2023-08-24T00:00:00", - "2023-08-25T00:00:00", - "2023-08-28T00:00:00", - "2023-08-29T00:00:00", - "2023-08-30T00:00:00", - "2023-08-31T00:00:00", - "2023-09-01T00:00:00", - "2023-09-05T00:00:00", - "2023-09-06T00:00:00", - "2023-09-07T00:00:00", - "2023-09-08T00:00:00", - "2023-09-11T00:00:00", - "2023-09-12T00:00:00", - "2023-09-13T00:00:00", - "2023-09-14T00:00:00", - "2023-09-15T00:00:00", - "2023-09-18T00:00:00", - "2023-09-19T00:00:00", - "2023-09-20T00:00:00", - "2023-09-21T00:00:00", - "2023-09-22T00:00:00", - "2023-09-25T00:00:00", - "2023-09-26T00:00:00", - "2023-09-27T00:00:00", - "2023-09-28T00:00:00", - "2023-09-29T00:00:00", - "2023-10-02T00:00:00", - "2023-10-03T00:00:00", - "2023-10-04T00:00:00", - "2023-10-05T00:00:00", - "2023-10-06T00:00:00", - "2023-10-09T00:00:00", - "2023-10-10T00:00:00", - "2023-10-11T00:00:00", - "2023-10-12T00:00:00", - "2023-10-13T00:00:00", - "2023-10-16T00:00:00", - "2023-10-17T00:00:00", - "2023-10-18T00:00:00", - "2023-10-19T00:00:00", - "2023-10-20T00:00:00", - "2023-10-23T00:00:00", - "2023-10-24T00:00:00", - "2023-10-25T00:00:00", - "2023-10-26T00:00:00", - "2023-10-27T00:00:00", - "2023-10-30T00:00:00", - "2023-10-31T00:00:00", - "2023-11-01T00:00:00", - "2023-11-02T00:00:00", - "2023-11-03T00:00:00", - "2023-11-06T00:00:00", - "2023-11-07T00:00:00", - "2023-11-08T00:00:00", - "2023-11-09T00:00:00", - "2023-11-10T00:00:00", - "2023-11-13T00:00:00", - "2023-11-14T00:00:00", - "2023-11-15T00:00:00", - "2023-11-16T00:00:00", - "2023-11-17T00:00:00", - "2023-11-20T00:00:00", - "2023-11-21T00:00:00", - "2023-11-22T00:00:00", - "2023-11-23T00:00:00", - "2023-11-24T00:00:00", - "2023-11-27T00:00:00", - "2023-11-28T00:00:00", - "2023-11-29T00:00:00", - "2023-11-30T00:00:00", - "2023-12-01T00:00:00", - "2023-12-04T00:00:00", - "2023-12-05T00:00:00", - "2023-12-06T00:00:00", - "2023-12-07T00:00:00", - "2023-12-08T00:00:00", - "2023-12-11T00:00:00", - "2023-12-12T00:00:00", - "2023-12-13T00:00:00", - "2023-12-14T00:00:00", - "2023-12-15T00:00:00", - "2023-12-18T00:00:00", - "2023-12-19T00:00:00", - "2023-12-20T00:00:00", - "2023-12-21T00:00:00", - "2023-12-22T00:00:00", - "2023-12-25T00:00:00", - "2023-12-26T00:00:00", - "2023-12-27T00:00:00", - "2023-12-28T00:00:00", - "2023-12-29T00:00:00", - "2024-01-01T00:00:00", - "2024-01-02T00:00:00", - "2024-01-04T00:00:00", - "2024-01-05T00:00:00", - "2024-01-08T00:00:00", - "2024-01-09T00:00:00", - "2024-01-10T00:00:00", - "2024-01-11T00:00:00", - "2024-01-12T00:00:00", - "2024-01-15T00:00:00", - "2024-01-16T00:00:00", - "2024-01-17T00:00:00", - "2024-01-18T00:00:00", - "2024-01-19T00:00:00", - "2024-01-22T00:00:00", - "2024-01-23T00:00:00", - "2024-01-24T00:00:00", - "2024-01-25T00:00:00", - "2024-01-26T00:00:00", - "2024-01-29T00:00:00", - "2024-01-30T00:00:00", - "2024-01-31T00:00:00", - "2024-02-01T00:00:00", - "2024-02-02T00:00:00", - "2024-02-05T00:00:00", - "2024-02-06T00:00:00", - "2024-02-07T00:00:00", - "2024-02-08T00:00:00", - "2024-02-09T00:00:00", - "2024-02-12T00:00:00", - "2024-02-13T00:00:00", - "2024-02-14T00:00:00", - "2024-02-15T00:00:00", - "2024-02-16T00:00:00", - "2024-02-20T00:00:00", - "2024-02-21T00:00:00", - "2024-02-22T00:00:00", - "2024-02-23T00:00:00", - "2024-02-26T00:00:00", - "2024-02-27T00:00:00", - "2024-02-28T00:00:00", - "2024-02-29T00:00:00", - "2024-03-01T00:00:00", - "2024-03-04T00:00:00", - "2024-03-05T00:00:00", - "2024-03-06T00:00:00", - "2024-03-07T00:00:00", - "2024-03-08T00:00:00", - "2024-03-11T00:00:00", - "2024-03-12T00:00:00", - "2024-03-13T00:00:00", - "2024-03-14T00:00:00", - "2024-03-15T00:00:00", - "2024-03-18T00:00:00", - "2024-03-19T00:00:00", - "2024-03-20T00:00:00", - "2024-03-21T00:00:00", - "2024-03-22T00:00:00", - "2024-03-25T00:00:00", - "2024-03-26T00:00:00", - "2024-03-27T00:00:00", - "2024-03-28T00:00:00", - "2024-04-01T00:00:00", - "2024-04-02T00:00:00", - "2024-04-03T00:00:00", - "2024-04-04T00:00:00", - "2024-04-05T00:00:00", - "2024-04-08T00:00:00", - "2024-04-09T00:00:00", - "2024-04-10T00:00:00", - "2024-04-11T00:00:00", - "2024-04-12T00:00:00", - "2024-04-15T00:00:00", - "2024-04-16T00:00:00", - "2024-04-17T00:00:00", - "2024-04-18T00:00:00", - "2024-04-19T00:00:00", - "2024-04-22T00:00:00", - "2024-04-23T00:00:00", - "2024-04-24T00:00:00", - "2024-04-25T00:00:00", - "2024-04-26T00:00:00", - "2024-04-29T00:00:00", - "2024-04-30T00:00:00", - "2024-05-01T00:00:00", - "2024-05-02T00:00:00", - "2024-05-03T00:00:00", - "2024-05-06T00:00:00", - "2024-05-07T00:00:00", - "2024-05-08T00:00:00", - "2024-05-09T00:00:00", - "2024-05-10T00:00:00", - "2024-05-13T00:00:00", - "2024-05-14T00:00:00", - "2024-05-15T00:00:00", - "2024-05-16T00:00:00", - "2024-05-17T00:00:00", - "2024-05-20T00:00:00", - "2024-05-21T00:00:00", - "2024-05-22T00:00:00", - "2024-05-23T00:00:00", - "2024-05-24T00:00:00", - "2024-05-28T00:00:00", - "2024-05-29T00:00:00", - "2024-05-30T00:00:00", - "2024-05-31T00:00:00", - "2024-06-03T00:00:00", - "2024-06-04T00:00:00", - "2024-06-05T00:00:00", - "2024-06-06T00:00:00", - "2024-06-07T00:00:00", - "2024-06-10T00:00:00", - "2024-06-11T00:00:00", - "2024-06-12T00:00:00", - "2024-06-13T00:00:00", - "2024-06-14T00:00:00", - "2024-06-17T00:00:00", - "2024-06-18T00:00:00", - "2024-06-20T00:00:00", - "2024-06-21T00:00:00", - "2024-06-24T00:00:00", - "2024-06-25T00:00:00", - "2024-06-26T00:00:00", - "2024-06-27T00:00:00", - "2024-06-28T00:00:00", - "2024-07-01T00:00:00", - "2024-07-02T00:00:00", - "2024-07-03T00:00:00", - "2024-07-05T00:00:00", - "2024-07-08T00:00:00", - "2024-07-09T00:00:00", - "2024-07-10T00:00:00", - "2024-07-11T00:00:00", - "2024-07-12T00:00:00", - "2024-07-15T00:00:00", - "2024-07-16T00:00:00", - "2024-07-17T00:00:00", - "2024-07-18T00:00:00", - "2024-07-19T00:00:00", - "2024-07-22T00:00:00", - "2024-07-23T00:00:00", - "2024-07-24T00:00:00", - "2024-07-25T00:00:00", - "2024-07-26T00:00:00", - "2024-07-29T00:00:00", - "2024-07-30T00:00:00", - "2024-07-31T00:00:00", - "2024-08-01T00:00:00", - "2024-08-02T00:00:00", - "2024-08-05T00:00:00", - "2024-08-06T00:00:00", - "2024-08-07T00:00:00", - "2024-08-08T00:00:00", - "2024-08-09T00:00:00", - "2024-08-12T00:00:00", - "2024-08-13T00:00:00", - "2024-08-14T00:00:00", - "2024-08-15T00:00:00", - "2024-08-16T00:00:00", - "2024-08-19T00:00:00", - "2024-08-20T00:00:00", - "2024-08-21T00:00:00", - "2024-08-22T00:00:00", - "2024-08-23T00:00:00", - "2024-08-26T00:00:00", - "2024-08-27T00:00:00", - "2024-08-28T00:00:00", - "2024-08-29T00:00:00", - "2024-08-30T00:00:00", - "2024-09-03T00:00:00", - "2024-09-04T00:00:00", - "2024-09-05T00:00:00", - "2024-09-06T00:00:00", - "2024-09-09T00:00:00", - "2024-09-10T00:00:00", - "2024-09-11T00:00:00", - "2024-09-12T00:00:00", - "2024-09-13T00:00:00", - "2024-09-16T00:00:00", - "2024-09-17T00:00:00", - "2024-09-18T00:00:00", - "2024-09-19T00:00:00", - "2024-09-20T00:00:00", - "2024-09-23T00:00:00", - "2024-09-24T00:00:00", - "2024-09-25T00:00:00", - "2024-09-26T00:00:00", - "2024-09-27T00:00:00", - "2024-09-30T00:00:00", - "2024-10-01T00:00:00", - "2024-10-02T00:00:00", - "2024-10-03T00:00:00", - "2024-10-04T00:00:00", - "2024-10-07T00:00:00", - "2024-10-08T00:00:00", - "2024-10-09T00:00:00", - "2024-10-10T00:00:00", - "2024-10-11T00:00:00", - "2024-10-14T00:00:00", - "2024-10-15T00:00:00", - "2024-10-16T00:00:00", - "2024-10-17T00:00:00", - "2024-10-18T00:00:00", - "2024-10-21T00:00:00", - "2024-10-22T00:00:00", - "2024-10-23T00:00:00", - "2024-10-24T00:00:00", - "2024-10-25T00:00:00", - "2024-10-28T00:00:00", - "2024-10-29T00:00:00", - "2024-10-30T00:00:00", - "2024-10-31T00:00:00", - "2024-11-01T00:00:00", - "2024-11-04T00:00:00", - "2024-11-05T00:00:00", - "2024-11-06T00:00:00", - "2024-11-07T00:00:00", - "2024-11-08T00:00:00", - "2024-11-11T00:00:00", - "2024-11-12T00:00:00", - "2024-11-13T00:00:00", - "2024-11-14T00:00:00", - "2024-11-15T00:00:00", - "2024-11-18T00:00:00", - "2024-11-19T00:00:00", - "2024-11-20T00:00:00", - "2024-11-21T00:00:00", - "2024-11-22T00:00:00", - "2024-11-25T00:00:00", - "2024-11-26T00:00:00", - "2024-11-27T00:00:00", - "2024-11-28T00:00:00", - "2024-11-29T00:00:00", - "2024-12-02T00:00:00", - "2024-12-03T00:00:00", - "2024-12-04T00:00:00", - "2024-12-05T00:00:00", - "2024-12-06T00:00:00", - "2024-12-09T00:00:00", - "2024-12-10T00:00:00", - "2024-12-11T00:00:00", - "2024-12-12T00:00:00", - "2024-12-13T00:00:00", - "2024-12-16T00:00:00", - "2024-12-17T00:00:00", - "2024-12-18T00:00:00", - "2024-12-19T00:00:00", - "2024-12-20T00:00:00", - "2024-12-23T00:00:00", - "2024-12-24T00:00:00", - "2024-12-25T00:00:00", - "2024-12-26T00:00:00", - "2024-12-27T00:00:00", - "2024-12-30T00:00:00", - "2024-12-31T00:00:00", - "2025-01-01T00:00:00", - "2025-01-02T00:00:00", - "2025-01-06T00:00:00", - "2025-01-07T00:00:00", - "2025-01-08T00:00:00", - "2025-01-09T00:00:00", - "2025-01-10T00:00:00", - "2025-01-13T00:00:00", - "2025-01-14T00:00:00", - "2025-01-15T00:00:00", - "2025-01-16T00:00:00", - "2025-01-17T00:00:00", - "2025-01-21T00:00:00", - "2025-01-22T00:00:00", - "2025-01-23T00:00:00", - "2025-01-24T00:00:00", - "2025-01-27T00:00:00", - "2025-01-28T00:00:00", - "2025-01-29T00:00:00", - "2025-01-30T00:00:00", - "2025-01-31T00:00:00", - "2025-02-03T00:00:00", - "2025-02-04T00:00:00", - "2025-02-05T00:00:00", - "2025-02-06T00:00:00", - "2025-02-07T00:00:00", - "2025-02-10T00:00:00", - "2025-02-11T00:00:00", - "2025-02-12T00:00:00", - "2025-02-13T00:00:00", - "2025-02-14T00:00:00", - "2025-02-18T00:00:00", - "2025-02-19T00:00:00", - "2025-02-20T00:00:00", - "2025-02-21T00:00:00", - "2025-02-24T00:00:00", - "2025-02-25T00:00:00", - "2025-02-26T00:00:00", - "2025-02-27T00:00:00", - "2025-02-28T00:00:00", - "2025-03-03T00:00:00" - ], - "xaxis": "x", - "y": [ - 19737.922246825536, - 19755.640996825536, - 20040.220898567735, - 20090.448555217677, - 20096.06585919034, - 19954.21017330264, - 19978.45637827126, - 19847.425751721137, - 19824.210158869886, - 19973.017688320342, - 19991.01846000924, - 19892.030390379616, - 20035.922048370176, - 20219.6616117786, - 20516.074523049676, - 20874.52691222535, - 20933.55739784852, - 20863.23616974459, - 21135.70127304569, - 21458.3663350972, - 21610.618776066396, - 21936.341049098395, - 22330.276367061233, - 22708.65643685659, - 22993.91030526689, - 23179.336468577138, - 23209.785265197017, - 23200.100946511622, - 23217.028763922037, - 23141.26562336387, - 22976.863148693676, - 23080.184395364173, - 23285.681066904235, - 23032.100117451948, - 22753.764993280405, - 22529.31663580013, - 22340.86393151096, - 22288.188996382767, - 22031.76702990035, - 21676.21574495376, - 21481.46047145385, - 21214.094914884725, - 20958.546921306068, - 20815.900761224708, - 20619.73140386163, - 20729.157919225883, - 20831.044985110468, - 20969.29051331705, - 21155.037063180385, - 21354.11013893002, - 21630.334880392234, - 21486.964186171215, - 21574.45399334641, - 21554.08021358985, - 21546.298053046423, - 21625.35642613777, - 21914.62413733371, - 22240.7212293877, - 22541.574489731247, - 22764.485158088803, - 23085.659807161494, - 23218.6930996008, - 23197.052307119404, - 23134.442799057048, - 23028.413180077336, - 22995.056814771888, - 22990.77964321829, - 22809.119615711523, - 22685.053853819205, - 22792.11382154038, - 22712.493793424423, - 22640.789327442446, - 22633.405470119287, - 22708.985361328385, - 22916.21416616012, - 23415.05879305685, - 23736.49350188413, - 24084.609386372133, - 24353.262292461415, - 25000.436775410784, - 25414.35026167982, - 25559.394083995554, - 25630.761501274075, - 25832.82504810451, - 25936.018605462737, - 26293.61359459099, - 27206.590888179482, - 27982.57322756031, - 28738.44838037571, - 29419.48927214583, - 29991.965521272792, - 29597.113714958236, - 29803.45119897507, - 30088.37561572944, - 30473.761273205695, - 30616.33991227322, - 30826.017318831833, - 31414.877523937976, - 32092.502763368295, - 32092.502763368295, - 32966.989060703025, - 33654.080101961605, - 33837.4842451587, - 34637.576356536745, - 35437.20355427442, - 36059.930206899, - 36780.43860585398, - 37921.72291615264, - 37726.81377859186, - 37516.3288938224, - 37651.17398344647, - 37869.64227416738, - 37918.33983361686, - 37885.88237985531, - 38085.6376935964, - 38287.78071539501, - 38621.89195457172, - 38915.37773504109, - 38896.088897628324, - 38856.9753574184, - 38188.93266072925, - 37982.62495423766, - 37328.70386062583, - 36934.209676705534, - 35923.49832012051, - 34409.6559788537, - 33701.320737728194, - 33212.39332796392, - 33426.89423148059, - 33971.17271199357, - 34845.722641281434, - 35592.261475172, - 36330.23612375354, - 36790.66085042808, - 38187.99119339717, - 39233.5814601509, - 40091.81833429268, - 40831.449797746194, - 41569.8298248767, - 42235.583393700836, - 43176.91602075537, - 43264.252860598215, - 43096.37824103576, - 42847.586870264975, - 42938.526915221024, - 43288.95801414506, - 43562.62664664153, - 44322.1466941388, - 44933.44006441444, - 45663.001574628826, - 46241.581287264984, - 45287.80995264866, - 44912.77319912823, - 45249.70681935753, - 45479.14186489929, - 45430.20736658278, - 44955.94793425828, - 45840.40653726679, - 48881.56830516398, - 51196.97801048755, - 50441.18555907256, - 49834.45809686089, - 48044.250260591085, - 46798.80432455314, - 45893.501034451496, - 45617.25447028995, - 46233.31813632894, - 46221.41721129089, - 45730.49426959463, - 45503.66531494199, - 45558.03592859542, - 45092.695970984154, - 45477.431559508725, - 46021.96544752237, - 46396.26958264411, - 46714.31234496508, - 47685.67893788139, - 48936.139788434615, - 49548.49822775379, - 50070.4436805576, - 50238.179032738335, - 49315.09659925446, - 47544.36581765589, - 46253.339428495594, - 45504.273873608225, - 44786.1117753625, - 44461.34455894196, - 44310.970057281535, - 44328.99949391505, - 44608.57794463, - 45312.694517408294, - 45833.87201252867, - 46356.45450873341, - 47168.32502284858, - 47992.00208938259, - 48577.48932920457, - 49500.64607128831, - 50786.20144977967, - 51322.47077027712, - 51597.90246399736, - 51598.731552461344, - 51627.70973237778, - 51621.065740553335, - 51524.78708024543, - 50763.88978386747, - 50801.525220017946, - 51133.345839356276, - 51907.876257496275, - 52936.3999160496, - 53776.36276159108, - 54033.685118053465, - 54789.935839746424, - 55234.539725809074, - 56015.26086570256, - 56404.30053976074, - 56388.55361958377, - 56700.19490389057, - 56885.531359182125, - 57192.80960290901, - 56777.35934802992, - 56962.009149790625, - 56717.080729790585, - 56690.20691328852, - 57057.74950045359, - 57349.05657633282, - 57691.18430201667, - 57739.505866437445, - 57205.30595010461, - 55586.854156216774, - 55854.99741649875, - 54952.88661894028, - 53370.800443061475, - 51888.06675071129, - 51034.82943443893, - 50800.08929956042, - 50583.624750210474, - 50498.04121182718, - 50078.14290419573, - 49771.55533159349, - 49668.09833068064, - 49827.63177441509, - 50616.478915729705, - 51033.915581196634, - 51351.92187655979, - 51351.2601062867, - 51298.37165481669, - 51165.458414784465, - 50998.19256142606, - 51160.652453258415, - 50632.91123930528, - 50222.44585067507, - 50883.78689544687, - 51536.43562416577, - 52540.940190947134, - 53775.606651099886, - 54806.32959964824, - 55955.669670741416, - 57231.267503813884, - 58811.17692953692, - 58811.17692953692, - 60002.106482877054, - 61178.801923636216, - 61758.56604345271, - 62679.459463776504, - 64059.69337723241, - 66132.58549576293, - 67764.61829832752, - 69711.5327003222, - 71624.4472321932, - 73370.98477155725, - 74487.51396884042, - 75504.14778894953, - 75764.5296490344, - 75813.31098063923, - 74109.91868299853, - 73748.28022927798, - 73748.33920971755, - 72569.08175727655, - 72377.21285890514, - 72459.64816017183, - 72815.54228337924, - 73718.37104587391, - 75608.06008336975, - 76349.17952423706, - 77366.27242268945, - 77826.56689926352, - 77305.12926993224, - 78604.1222248968, - 80108.72957329554, - 81177.86862205011, - 81715.97677108145, - 81131.28310921694, - 81557.52137221118, - 82801.04002120673, - 84635.3323037588, - 85826.55963463265, - 86142.44411305156, - 88199.24315182184, - 88969.51654391081, - 89400.30268510044, - 90085.77347948076, - 90462.02854177656, - 90143.89359022884, - 89047.78862791395, - 89233.81810166905, - 89322.28547014522, - 87596.76009007115, - 85150.60355732805, - 86163.25958741676, - 83947.78719369257, - 81646.30866524043, - 80771.26980977767, - 78430.68403330664, - 76773.56176271803, - 76071.91110781579, - 75597.2939317807, - 74125.147239309, - 72785.9220340532, - 73333.74687440982, - 74005.94397246497, - 75678.76393761898, - 76589.29057718319, - 78125.81129684426, - 80586.43852324727, - 82845.81569422407, - 83715.70086804754, - 83498.81416149467, - 82219.01338973129, - 80414.16834502645, - 78709.28886581157, - 78542.12316702351, - 78549.284453482, - 78036.5449691112, - 77544.96981460055, - 77271.52247220339, - 77407.17453922784, - 78730.9510828049, - 80880.55506114263, - 82723.02482207198, - 84879.94574723924, - 86986.43980014708, - 87800.86885544956, - 88232.39910651546, - 88340.1750278578, - 88180.22296667962, - 87848.14914131882, - 87482.96997627453, - 87293.1020836079, - 87169.98261153385, - 88205.10580271104, - 89029.77042301104, - 89483.03648575861, - 89483.03648575861, - 89732.35453456224, - 91242.91457320929, - 92535.24254962351, - 94419.16719477015, - 96788.55302988422, - 98310.40612915329, - 99791.742270241, - 99986.55528680177, - 99633.52833682534, - 99649.61848684367, - 99784.80960678177, - 102350.9730535161, - 106433.1330173529, - 109458.28235472199, - 111850.13084391074, - 115317.56855772421, - 119573.39146298946, - 122253.90119906848, - 122572.77458986414, - 120540.34278270522, - 119922.48054396958, - 118782.92102495296, - 118735.5969546067, - 117701.01156655962, - 117779.33404252303, - 116514.25152382787, - 116706.74289817607, - 117557.68063378023, - 120519.31846095543, - 122172.11602132907, - 123972.24415324678, - 124991.78825584946, - 122815.1209644141, - 122080.15751551991, - 120478.11546570944, - 117840.54671458279, - 114723.88213037318, - 111847.58745376571, - 109273.02492751545, - 107048.9207404319, - 105729.01158907838, - 104308.82822925982, - 102209.25819925067, - 98430.48150924356, - 95578.65519479358, - 93637.90139466581, - 92992.42621678865, - 92615.246380102, - 93106.24455957573, - 93681.4653658331, - 94059.57047727406, - 93974.49370964781, - 93944.15873752911, - 93696.21132480857, - 93640.16153378673, - 92931.61212195111, - 92941.32626955955, - 90619.16474683059, - 89561.91332600034, - 88976.27333202126, - 89236.33111448197, - 89562.4389066245, - 90199.92294924251, - 90931.89476056925, - 91921.99146973502, - 93135.53067791187, - 94443.83895093828, - 95583.63427440327, - 95583.63427440327, - 95667.91952598716, - 94862.89660776105, - 94020.65656025188, - 93248.35874552249, - 92999.90488962187, - 92997.77411281028, - 93594.45017529016, - 94352.42044610782, - 95818.61954563267, - 94775.43700886564, - 94782.40614693571, - 94846.15992099023, - 94561.30174525487, - 94212.21469071707, - 95121.81364829882, - 95159.25230322623, - 95291.75178815301, - 95812.0291653183, - 97498.46413016996, - 99614.34383019012, - 100428.29753711622, - 101036.92819805877, - 99645.12982323628, - 96829.50886504103, - 94479.47034200029, - 92946.10704630194, - 88795.60226075878, - 84309.20964978077, - 83456.74873013118, - 83335.83468151484, - 83781.7904214799, - 83381.53377478606, - 82469.11193846863, - 81647.35244818882, - 81420.4284001934, - 81514.59547821172, - 79618.25883426469, - 80084.02600333418, - 78306.55335018573, - 76350.94652552533, - 74584.18643626882, - 73263.92858906931, - 72443.72804124748, - 71978.01650405272, - 71130.24086401235, - 70408.63758842538, - 69980.72392963554, - 69617.90219502122, - 69253.48529032119, - 68825.52716832602, - 68366.8930734409, - 67988.62211075246, - 67828.75618832494, - 67734.97158199242, - 67616.69466595603, - 67421.70150903883, - 67171.26238699211, - 66833.17520172973, - 66762.32961319231, - 66699.89415544101, - 66947.66657718999, - 66836.64404602039, - 66787.29318844405, - 66810.1314103291, - 66822.56113846193, - 66855.89537145413, - 66814.26644155917, - 66841.66616275198, - 66876.31039034639, - 66927.70034514205, - 67011.559198872, - 66969.22719621751, - 66889.19119415291, - 66686.05208143599, - 66540.72166043396, - 66194.13133298793, - 66023.00552275212, - 65760.12989256873, - 65754.55995798163, - 65665.3874515307, - 65596.03105762441, - 65551.42052903063, - 65516.72345123546, - 65481.52353989202, - 65421.743858994436, - 65353.595903435635, - 65318.952485704496, - 65322.34093858027, - 65305.59526887568, - 65259.6393255156, - 65295.381950513576, - 65372.68118113026, - 65459.98439154844, - 65393.88688854035, - 65568.49281030694, - 65632.28232535251, - 65741.89639261019, - 66107.15177825505, - 66087.09756780618, - 66122.61095967928, - 66464.11613200413, - 66774.17571047902, - 66917.55538262615, - 67105.73957207392, - 67156.54949719996, - 67332.73499452021, - 67496.55244228359, - 67643.9660127662, - 67908.62101203047, - 68110.71150934497, - 68171.22634058956, - 68321.62676489093, - 68369.08724345417, - 68550.44539344781, - 68709.945420124, - 68829.00099642771, - 69039.9331113306, - 69255.8123693211, - 69492.60734775815, - 69570.1145532092, - 69572.62015744891, - 69525.68007185757, - 69365.8377830643, - 69214.8493362251, - 68847.41387757238, - 68384.29740973139, - 67926.31793474394, - 67567.02894575233, - 67155.91528764773, - 66983.04910912194, - 67204.48652582412, - 66864.87344681751, - 66741.50771870126, - 66417.71876270778, - 66128.97179693506, - 65377.83526800072, - 65358.59574549625, - 65430.565005770535, - 66011.80776376167, - 66297.32990886587, - 66429.0471328358, - 66479.27164036797, - 66641.12896659503, - 66791.68466477164, - 66958.67243002012, - 66820.88513632449, - 66909.63470959876, - 66983.77296272521, - 66952.99160404579, - 66662.6061028507, - 66557.52849081007, - 66411.28556508044, - 66487.44475646417, - 66487.44475646417, - 66779.21030941476, - 67201.50580329033, - 67572.51340963799, - 68121.26549095684, - 68427.26647391278, - 68663.71168287851, - 68712.83573429631, - 69256.70999651014, - 69602.49379152662, - 70189.4367432061, - 70222.11956097595, - 69713.18490865768, - 69449.12462352126, - 69184.00990400852, - 68960.36512216527, - 67911.41918073162, - 66974.68344850546, - 66750.66676788511, - 66567.18171010932, - 66479.67644882732, - 66137.50569005244, - 66108.15065544975, - 66160.5411840921, - 65987.62270636948, - 65795.13055702967, - 65541.08110754314, - 64940.709313498075, - 64114.420140351904, - 63888.52856123822, - 62867.1684441498, - 63137.5550197477, - 63509.68341876096, - 63869.56106243793, - 64358.13256307558, - 64790.132619127085, - 65192.79932938935, - 65443.4512151489, - 65790.624904073, - 65785.09332879174, - 66250.2132146841, - 66745.30645926704, - 67046.80120505377, - 67595.7415628879, - 68057.198754212, - 68148.20076866046, - 68123.2023354537, - 68092.64799851511, - 68075.32795867398, - 68277.30126101976, - 68385.18942722125, - 68721.88022315575, - 69060.52861999368, - 69321.07395325258, - 69454.94254578727, - 69960.19250526412, - 69941.37940427868, - 70220.63588129, - 70547.70203007659, - 71241.99122217347, - 71983.66059380438, - 72726.25756272531, - 72718.2774274416, - 72917.62621110982, - 72567.67526507398, - 72721.60230704612, - 72902.71411309249, - 73368.152817719, - 73004.27946723075, - 73139.47681096036, - 73352.96363386116, - 73906.19043678216, - 72294.40091494867, - 71483.47616448815, - 69831.07125848433, - 68674.53410937024, - 67442.22743783706, - 66876.87780442236, - 66706.10131677442, - 66304.05293749268, - 65898.79308694023, - 66316.03542539943, - 65935.11279975659, - 65992.5063131455, - 66158.81237911462, - 66553.6059859795, - 66532.88990242998, - 66835.54059841133, - 66716.31366803341, - 65006.20811918987, - 65155.01491453377, - 64759.54315245859, - 65323.06511528901, - 66137.17274114046, - 66294.22061499658, - 66481.92451688467, - 66827.91644057541, - 67411.4657145571, - 68102.70617949606, - 68142.55987444859, - 67872.44608163388, - 67829.94219553036, - 67601.3280618943, - 67764.29978106746, - 66672.16667375767, - 66173.84092362787, - 65886.25422908243, - 65529.24235554711, - 64100.368519005366, - 63585.133312806225, - 62765.69939821255, - 62431.139686861905, - 61937.21720791173, - 61696.38861317271, - 61634.07748393126, - 60935.61327229901, - 60389.02999658505, - 60722.0936002973, - 60588.76661828221, - 60943.95674338158, - 61052.4379517922, - 61092.31438006268, - 61359.996046495275, - 61632.08178705396, - 62244.88619279645, - 63324.28961948507, - 64022.956097123526, - 64472.72959675663, - 64469.77565202682, - 65138.84344803008, - 65583.63068459016, - 65872.90964635911, - 65894.5710610683, - 66174.75216139767, - 67219.33746165385, - 67483.17047296421, - 68015.04059287226, - 68125.38401946741, - 68382.0289068192, - 69419.41937475948, - 70275.16751649081, - 70732.12718228185, - 71329.20692234155, - 71579.71338683242, - 71788.15174810309, - 72056.38158464695, - 72178.33812418107, - 71337.08209937427, - 71709.43852452454, - 72807.93796630806, - 73537.88197658416, - 73410.61620679889, - 73351.05298322641, - 73915.83714267003, - 74437.3359333484, - 74826.66749517669, - 74925.03648770982, - 74925.03648770982, - 74937.65681523559, - 72967.82177358278, - 72055.72785229725, - 72556.87702463074, - 73004.43749200122, - 73459.58415331293, - 73375.43994058203, - 73052.77221956912, - 73247.91954767017, - 73971.42471283463, - 73939.48428574034, - 74510.41950911144, - 75191.36912728896, - 76266.32994142703, - 77205.2927573825, - 77469.6929933772, - 77534.78206581753, - 78170.35745202274, - 78880.24941907123, - 78909.29772802777, - 79270.22419054952, - 79079.67234021895, - 78931.4653455174, - 79867.11778850057, - 80228.16924690665, - 80414.98704788914, - 80595.84533754218, - 81578.84622949455, - 82183.59183601048, - 83570.03686520077, - 83783.31324074703, - 84255.19486617189, - 85057.3250192801, - 86262.30142008541, - 88266.2104612459, - 88659.26978775191, - 89404.56581982892, - 88879.01828922216, - 87123.77044462287, - 87817.91100993456, - 86108.13912188826, - 86152.72981253212, - 84942.49061969816, - 85751.86013638283, - 87722.99414776017, - 89507.86920020678, - 91202.3886483447, - 92036.4947814099, - 95073.02177379395, - 98850.43165675932, - 101493.52823239904, - 103437.90939762363, - 109537.64318661709, - 117522.36828850486, - 119065.4872655275, - 126109.46869210068, - 124474.63628605395, - 120272.211081351, - 114319.65814435977, - 112187.00586003323, - 107161.49852777926, - 106947.54838047063, - 106438.47662066149, - 102065.3096963655, - 105688.69553397069, - 105159.10674099694, - 105293.46849370858, - 101425.37230823367, - 100311.1863861976, - 100640.93066905846, - 94529.50955572803, - 97738.14397898226, - 88241.91561887818, - 85801.049116575, - 84020.46405922808, - 81437.02322521906, - 82635.02545814015, - 82929.35975475519, - 91018.61976323358, - 99219.650874062, - 105845.45284915071, - 108169.40994088646, - 113823.04323445866, - 112946.98024057038, - 110971.7090231017, - 113343.16474284827, - 113790.40808042896, - 116151.59734299178, - 116786.4112138739, - 121326.26644678222, - 122176.41714462222, - 123340.9787984978, - 127255.08230706764, - 137131.6072581775, - 145205.8073526513, - 140399.33835964708, - 145168.924012429, - 143294.436222086, - 144604.27905181926, - 146262.13018199967, - 148499.3477276956, - 151147.4826867043, - 153151.00834298402, - 155389.86163120155, - 153827.85863314857, - 152782.9674124407, - 152949.16312966787, - 153868.42646528903, - 155272.85350410547, - 157601.33349267184, - 159789.15018197015, - 165484.21363373386, - 167182.12179578282, - 165245.38369959855, - 168728.03184701092, - 176907.86929499835, - 189987.18731009978, - 197389.4346551785, - 209843.96036801758, - 220693.92785035135, - 224685.0136699444, - 226921.60141550438, - 220927.41946781293, - 216224.16684183077, - 221444.97035495567, - 224700.63129593927, - 221322.8120278154, - 219706.73037483022, - 219267.22706762527, - 220259.61338424357, - 223990.35829716892, - 229220.38211833304, - 238511.51175701633, - 230470.1681426589, - 227128.22717999044, - 229737.82865347064, - 233545.85202173298, - 236824.8701970482, - 241187.66600132055, - 243843.15656470077, - 250114.70931763583, - 250315.33408384895, - 249318.04223534826, - 254419.59301984764, - 248990.0088163266, - 251424.7766580324, - 256439.01591414586, - 259575.06504947238, - 264213.65882139304, - 270073.93906719354, - 273284.17833342234, - 286703.1527549442, - 298388.5012523318, - 302516.55008363305, - 298534.08409858803, - 304483.2772213307, - 308502.8753820998, - 303985.2838999026, - 306579.17848050565, - 310377.20759875234, - 309055.11913516646, - 307209.05033015524, - 298258.39439404616, - 293235.66199929465, - 299795.20347004343, - 305112.06905840366, - 306640.74229379505, - 309092.48814354365, - 313767.17936001514, - 325743.0503061596, - 335604.34073562425, - 346127.0110696519, - 352695.19910722954, - 359984.3453586783, - 361309.23688758304, - 345564.15252117574, - 349908.53134730295, - 353204.0540453959, - 366620.01614391257, - 394111.8755538698, - 411583.8773171702, - 428577.65646640334, - 440165.0402491406, - 456114.8593667974, - 463990.2742360858, - 473000.04135664407, - 473433.74911707826, - 485210.7710368128, - 498820.88766832615, - 527398.7509653528, - 538154.0543859092, - 553423.6776206695, - 534730.8751957151, - 546881.4733096393, - 522191.38295380253, - 528926.8682325962, - 519635.5790049914, - 506921.79849463206, - 510114.9692087969, - 518166.87976425875, - 506168.9213073955, - 516290.50917427964, - 490642.5689113819, - 485465.6486240534, - 488083.5995116867, - 477503.6724242904, - 479078.17357853777, - 488519.4522540636, - 500870.4467794725, - 514369.55363256845, - 532709.4145183096, - 547824.8618738862, - 558505.765372668, - 574987.0236494982, - 586481.8911981441, - 603312.3437359795, - 611637.1401542958, - 615275.8707018754, - 640215.4389055483, - 654403.4363972939, - 658347.4344464294, - 658223.3218179793, - 652966.2342180737, - 638399.0549737028, - 630675.6933391916, - 618461.9676234609, - 600391.2920667814, - 596288.3525255348, - 608869.5890937325, - 595846.6619801082, - 566892.1631139562, - 555834.7751069491, - 527059.9177681658, - 507661.8065046676, - 506152.6088552802, - 526173.1217946454, - 549313.8540808184, - 592068.6367444415, - 582354.7567449225, - 542998.7389675189, - 538456.417474418, - 537758.3692871894, - 531978.7762526784, - 529814.3855034873, - 529228.6374129616, - 526550.0838029559, - 495447.8754396182, - 485400.3842528514, - 479950.6688853661, - 471700.89026621083, - 472604.0588725936, - 477689.8566775579, - 504369.3660814191, - 507972.31783997786, - 514431.7750039577, - 517590.7972426086, - 523920.5923171152, - 526286.2644710883, - 520760.2662352368, - 500107.55176008586, - 488888.44050163525, - 481971.7984117291, - 485054.41154304973, - 486964.7756887495, - 487570.3344682697, - 490430.81669637724, - 493601.33979819395, - 481558.19109960686, - 481448.2007184021, - 471674.87486635393, - 461020.03500453464, - 442039.54016974574, - 437317.166932472, - 440475.09764389787, - 433298.4881972291, - 427716.6808498201, - 429355.7088947093, - 430548.91799396207, - 435711.9695156031, - 441139.3429213239, - 441899.5222368845, - 444591.3283712093, - 446646.62203123973, - 447496.85043348576, - 446525.3614130104, - 447011.42550819606, - 448295.0309155628, - 450836.7240101814, - 455639.4235157172, - 460970.78892685194, - 472330.7398021788, - 467562.38272402436, - 464922.5494410153, - 460261.567998675, - 458453.02687685477, - 462721.9393376612, - 460491.09347384394, - 461421.1379394324, - 462368.6344012239, - 463751.5915588261, - 463968.3360147388, - 463109.3419476471, - 461694.013228798, - 461092.6464474709, - 458151.6303941076, - 455482.88187594933, - 451674.4108062706, - 446761.4347862865, - 441298.00899296545, - 421368.6715653036, - 421739.74245490006, - 411570.42719725054, - 398243.1819968566, - 426908.10239655024, - 415902.48492964526, - 400036.44912205247, - 387740.08793836914, - 370850.6959066155, - 355721.3930568844, - 347720.82417376013, - 339524.35618087224, - 334475.99218640383, - 332000.078359982, - 330572.94517049496, - 329343.50824533845, - 327375.07952577225, - 322247.968299443, - 319039.6595678536, - 318020.4416655062, - 314447.7166303472, - 307670.395445455, - 302645.81230165, - 296743.1011570468, - 288295.5111867047, - 287314.052320883, - 289028.67128521163, - 296293.3749241339, - 298994.81108774006, - 299212.456477396, - 300183.81281675346, - 303164.4633974781, - 300301.05725882255, - 306763.4080398682, - 316858.9837872788, - 319556.3609075672, - 325098.4622646668, - 328139.15796936955, - 332909.1566863361, - 332127.7917440814, - 326689.0111516549, - 326916.30904282717, - 326180.65184707224, - 322314.60437148204, - 321368.81395937165, - 322490.4214166192, - 315428.44943892286, - 315348.24901182577, - 314483.4264574169, - 309544.5952075868, - 306020.726457719, - 303770.6692439396, - 303113.24367541034, - 297193.35712210985, - 290678.8898028761, - 282852.7886154731, - 274065.57326216745, - 272864.1510798294, - 271041.71160467755, - 269616.614235115, - 268407.18294767744, - 269137.1586130038, - 270581.1841304799, - 274445.07840700366, - 276870.95656433975, - 279194.6395756012, - 279825.28191769344, - 282090.8926282096, - 282745.58984749997, - 285420.91129241243, - 287344.7142057972, - 290862.22758287424, - 293818.8490983786, - 295661.99916599307, - 297010.33810747106, - 298245.4546592145, - 299840.1161499744, - 299266.1596793788, - 300274.7490911377, - 301154.48023694695, - 300844.9377947986, - 303320.6270064609, - 305085.1081561632, - 307913.41233710793, - 310618.2044778427, - 310983.4837036837, - 312263.7008793378, - 316137.2031270688, - 319837.704875304, - 320855.3173461536, - 322735.6425551533, - 329530.5502740709, - 334807.30492509634, - 340889.22520922736, - 322334.0728797602, - 320428.4299122785, - 332159.59649312607, - 323540.26253634196, - 319526.3361255099, - 316371.6185177685, - 301498.88260063634, - 302981.99531034223, - 300543.5808479988, - 288846.2618458367, - 289653.3504259003, - 287779.9465440948, - 291876.11890187376, - 293150.58629125735, - 291508.7720385557, - 295376.6942864545, - 289602.41159037576, - 291506.74727120344, - 287446.8113401728, - 289441.27817952126, - 304529.9746101256, - 304275.2068986392, - 299922.4324286698, - 306180.05228536023, - 307615.6455072306, - 300063.6624575742, - 297628.1609302842, - 297326.34037641715, - 301267.92439007614, - 296284.26751181093, - 288939.19498156314, - 287439.17953227204, - 289982.1675161567, - 296868.7019366498, - 301436.7549720154, - 309514.1295550776, - 312920.74070279795, - 319261.9938176917, - 328366.30179594224, - 329970.5454336464, - 335047.2294594221, - 332766.8835547053, - 340581.0589621477, - 348555.4601410359, - 332803.23340562196, - 334434.23135325307, - 342363.2467066701, - 335058.32367856376, - 332286.71687892545, - 335625.46714587347, - 332783.38402016636, - 326079.5415890608, - 313735.99747597874, - 308891.57427691494, - 306808.1340109764, - 310993.8650571193, - 315055.16539422, - 313191.3989897426, - 304783.35845292703, - 302454.66025762603, - 296288.00610572525, - 291728.64306066424, - 283864.47180339455, - 279808.4497144071, - 276598.54364519456, - 279507.83892469597, - 279387.735253197, - 278706.7657309201, - 275005.7894358158, - 274482.03009517916, - 277434.2047943145, - 281078.6740047531, - 291483.4833906498, - 299833.73023996915, - 305443.2555672176, - 313877.75628755736, - 323589.36795893277, - 335202.1033212126, - 355688.9271055892, - 369573.7536928, - 386332.8445400931, - 401092.58421168, - 415544.04840069206, - 430708.47272087756, - 448123.94436306495, - 477672.50617525715, - 448669.1163958232, - 491189.7449460124, - 533569.1227072707, - 578828.0831882495, - 584890.6080067884, - 589092.571754541, - 593379.6546694597, - 596266.830269952, - 626460.3047048599, - 636370.7848208994, - 622694.7104676916, - 630063.1142126024, - 718620.5255829266, - 714349.0328450202, - 714349.0328450202, - 752144.5384933151, - 835252.1896018126, - 942993.125875603, - 950636.6456968117, - 1001927.7166688632, - 1012827.9940915696, - 1010439.3209758968, - 1037875.2037355445, - 1028454.411635813, - 1006433.2400026884, - 1014768.9953991473, - 987107.360707504, - 947783.3115028926, - 953056.8287881948, - 937899.2049494932, - 1001836.6086305032, - 971120.1448268443, - 961861.7840906653, - 949399.170184748, - 943592.692702368, - 944069.9564407194, - 954011.0483787403, - 958059.1262701766, - 955339.3650859329, - 954769.550831521, - 946677.4142593519, - 924952.1470209243, - 910305.8280577027, - 887285.7436833365, - 872612.453806552, - 859457.7941464657, - 856564.5704437535, - 832565.7179743206, - 825709.3882758728, - 822704.4651770801, - 808505.9957186836, - 797849.9639177085, - 790788.6058502834, - 766083.6606867304, - 755073.4020586679, - 749596.5342368413, - 739626.2317436258, - 748501.3298044584, - 739555.299365656, - 752235.6090243653, - 761472.427647806, - 751649.5532438153, - 749782.3175962669, - 755077.800981507, - 759723.1769478049, - 781767.6026993701, - 779192.2449505875, - 767006.9667015342, - 763711.7502856038, - 769742.5152954359, - 770729.2214141941, - 758238.3261732282, - 733003.1854302548, - 719379.1870746088, - 696029.9661313285, - 694172.9720643328, - 697646.6655677806, - 701705.0938482399, - 709093.3158441528, - 712887.4885076407, - 718615.7339125756, - 717707.1470053027, - 717142.1349663127, - 710460.1256026537, - 711730.0072086968, - 711912.4706800637, - 707808.386713349, - 704499.2102947931, - 705211.2286359164, - 704808.3540123455, - 704221.6737495682, - 701789.3333414096, - 711047.5130239528, - 712654.928527011, - 712795.4103988443, - 728993.5925560202, - 749178.15394064, - 763522.9677685187, - 771261.937717678, - 780076.6614706508, - 773407.8126614167, - 775013.7908429845, - 772100.5313353338, - 762451.8850516055, - 745607.5035040308, - 740862.4289670279, - 726911.6675918457, - 712183.2976333707, - 701305.1209990012, - 692240.6200413826, - 684873.7859632347, - 677279.5816802309, - 673285.2005712279, - 672764.0152642255, - 667803.0933587793, - 664473.4874323212, - 658942.6828228537, - 653939.8347932679, - 649243.3974369233, - 645973.657308563, - 638624.9705420606, - 626712.4653834399, - 625566.2657114093, - 619484.7770776077, - 613985.8414735397, - 610477.7804481535, - 607728.0511785484, - 604833.1770172061, - 601517.1637806067, - 601132.486818807, - 599217.3278117023, - 595720.7101613405, - 593640.1186555036, - 586732.7697065193, - 586984.0538573094, - 586942.0190044267, - 590159.769674407, - 593737.2355208878, - 599669.1623975706, - 604858.1216190273, - 607609.9524748988, - 608520.9320294656, - 606556.8050163508, - 602545.8173394838, - 600952.8269241428, - 601717.1677122108, - 597512.3216584859, - 592107.2191722555, - 586231.5839051873, - 581296.3120308011, - 577930.0738255855, - 573133.555221529, - 570617.9296405962, - 571925.6437902616, - 576783.1789977428, - 576778.526705697, - 551854.2022385142, - 552669.4420698995, - 551646.8508276436, - 551389.2798614446, - 547772.2802210676, - 545316.8360563299, - 546209.126205253, - 557901.3781379323, - 562341.008468011, - 563678.4987247388, - 563220.9911466383, - 563093.1400911525, - 562933.3753840739, - 563592.5925846413, - 563368.428397967, - 569726.0263981854, - 570759.4947600268, - 572818.8590414588, - 577595.12055368, - 577162.2128409632, - 583507.7290644057, - 585514.8103722516, - 582434.9568035607, - 581612.8484723567, - 581025.0975480869, - 580362.9579403214, - 583749.6271342818, - 584950.3698406953, - 586886.5632869403, - 583422.0324782549, - 578315.1751826105, - 571703.5275078588, - 567443.9126497187, - 567224.2122044986, - 566378.3340804385, - 563579.3228723459, - 559255.9808216073, - 556565.2703376994, - 555795.6066279933, - 553792.8387065337, - 552235.1303231762, - 555261.7111512098, - 557373.0187986564, - 561749.0358577815, - 562989.7157926566, - 565264.9112975595, - 566551.9522458173, - 567045.4285389067, - 568401.8696674593, - 568926.5461007779, - 567465.6578169292, - 565444.744707269, - 563666.5394238845, - 590519.6019812521, - 598613.1526220439, - 616202.0410191702, - 631200.3178289104, - 641658.8215755823, - 650084.5313276912, - 651777.7039301246, - 662127.1492875731, - 688778.0512322552, - 690233.2307557428, - 691443.5574058573, - 696881.5892448348, - 700523.7912808813, - 702462.7261978062, - 701449.609011789, - 700235.5178671087, - 702999.478192086, - 704169.0101667898, - 680221.805652388, - 662456.3132522977, - 625549.6371270684, - 661837.2334455668, - 661257.2528043988, - 609289.0456390459, - 615381.4400659938, - 618274.7194802334, - 616373.4269152485, - 620694.7549202603, - 628949.9392630201, - 687981.9939067907, - 677367.9481343839, - 679998.4680891784, - 671955.7613873521, - 696933.7672859315, - 683467.8829848266, - 685023.0840839673, - 722682.183193237, - 752187.593611558, - 700519.6209016066, - 724111.8643494219, - 787269.9425866121, - 859537.5859716533, - 865100.7530489076, - 867760.1934819095, - 865515.9808201302, - 857837.2598609686, - 876660.2546705096, - 884681.8061890414, - 891886.3462590106, - 903314.808470191, - 945359.0722558714, - 933164.6225806093, - 924252.0624157256, - 917301.1434252714, - 904448.6508771405, - 900401.0455619274, - 888523.4636500952, - 879669.6777186703, - 899218.756444249, - 889580.5984246172, - 883563.9684442653, - 905272.1804709481, - 903934.6996364117, - 890232.660939273, - 877085.870525308, - 855119.3569059115, - 866736.7352019363, - 881588.8788920013, - 894898.3615675921, - 917905.6759445567, - 926447.4760155291, - 877338.7649596188, - 877439.7674716885, - 892929.4226736835, - 907372.233173421, - 910853.0011200834, - 930193.1539674876, - 944017.8284043574, - 947696.5273096315, - 951593.9827957606, - 970968.5808846762, - 999492.9775017127, - 1080512.7769776462, - 1129778.2621704203, - 1130617.2645607202, - 1104403.5837431075, - 1085256.2764405196, - 1162046.48187184, - 1222747.419429534, - 1327713.7041966289, - 1372710.8145710363, - 1458005.3712210814, - 1486475.3135621857, - 1525580.8603243465, - 1546661.7336398128, - 1522907.5229754185, - 1538484.7715880973, - 1629157.9737696568, - 1650793.0820486571, - 1690554.0659736616, - 1779316.4979153327, - 1791445.3898287266, - 1827576.9561533723, - 1855675.320375801, - 1984416.27032658, - 1943709.2313994062, - 1922513.2011227156, - 1810147.9553519557, - 1799114.430863588, - 1813144.4673726354, - 1849153.9402130041, - 1834509.630990578, - 1839669.1388730537, - 1875678.756114979, - 1909913.211597374, - 1912218.0670220794, - 1854797.6212412957, - 1817217.385634018, - 1821631.15507587, - 1844307.1259358653, - 1869614.8810491934, - 1958983.5794706712, - 2121985.8143953527, - 2104051.99711455, - 2209619.821339005, - 2108057.69535525, - 1857939.0609235945, - 1803060.6785878618, - 1811271.2010328681, - 1822161.591194529, - 1802632.8000309304, - 1859726.5180147968, - 1891583.8255867965, - 1916093.6895056085, - 1668122.4725535729, - 1682364.8593686558, - 1706425.9699695702, - 1740440.8381851413, - 1761892.365254487, - 1748197.9974195329, - 1707525.1557701246, - 1636441.2789316971, - 1436447.7080573635, - 1451557.1529328816, - 1469377.3836143215, - 1470357.118588774, - 1466650.134680016, - 1521069.3694176488, - 1563583.1075469183, - 1812570.2126366333, - 1740705.8632549695, - 1746408.9248470087, - 1747789.0704908778, - 1824938.2303589385, - 1876849.7248832553, - 1915996.2800299989, - 1932562.711810799, - 1945783.825418087, - 1919325.3153685802, - 1879634.627237823, - 1827782.2771669086, - 1811143.449333975, - 1725850.8617033227, - 1703818.393250489, - 1686256.5844538405, - 1620423.1945433384, - 1582844.7906223778, - 1542459.1431282973, - 1476621.8617440127, - 1399499.209435935, - 1336968.0388217329, - 1291111.7965620833, - 1261831.4896078021, - 1253366.9175322494, - 1250506.2013129808, - 1246986.8664757719, - 1279647.2727134973, - 1277263.350217203, - 1294840.2993867518, - 1331412.3709630673, - 1377930.5377446478, - 1394144.9462543617, - 1421643.3865859655, - 1483766.6179549906, - 1525800.923327413, - 1510876.9849485918, - 1525987.6830524658, - 1488707.8947537444, - 1427710.387278282, - 1362642.5481307, - 1293867.9005443302, - 1258567.8795364706, - 1273550.8631970247, - 1219765.1838219, - 1142384.4284939058, - 1094616.0832813089, - 1055886.481449289, - 1023884.9983614548, - 1018062.1781820285, - 1033999.6898349039, - 1082900.5322315854, - 1127776.4586130904, - 1172474.9408891671, - 1223683.9580548254, - 1272130.8497245072, - 1351525.8186211858, - 1423092.192866879, - 1497311.5937521483, - 1531348.9055518017, - 1567652.10837264, - 1574143.3266636585, - 1600707.6955741933, - 1605633.8384377558, - 1574021.9495538608, - 1549381.3902792493, - 1510871.621954551, - 1492459.6939020294, - 1470049.017471004, - 1434607.2798154652, - 1387109.81719449, - 1346623.7907115095, - 1293206.4289189577, - 1258495.1475247506, - 1217061.6034340102, - 1207501.767768512, - 1212288.0283827337, - 1216952.342193795, - 1227978.475157954, - 1256678.3525822863, - 1285596.5905789882, - 1306444.6645764238, - 1373549.2611345525, - 1419083.3192923893, - 1425230.0016239122, - 1459531.054691926, - 1466239.468942065, - 1471452.9958133998, - 1483095.1833799938, - 1502722.7647976435, - 1518012.3047424462, - 1522859.99685544, - 1526630.4240544352, - 1461567.0827977387, - 1403684.0788665798, - 1363712.2980312342, - 1335304.848228913, - 1326796.8234922173, - 1315355.4115269606, - 1310798.1664448828, - 1307218.4156478473, - 1307218.4156478473, - 1304565.2520073724, - 1320393.3086414712, - 1362201.5968477153, - 1427008.7775788798, - 1434868.082179974, - 1497858.4084610597, - 1543924.044884931, - 1578055.6013367148, - 1609131.256354769, - 1640983.4324799224, - 1647972.3472439304, - 1644433.658352493, - 1668185.160769382, - 1727259.0195035867, - 1762176.9615108238, - 1797986.958310438, - 1851096.9558212499, - 1882178.2832275333, - 1894722.0934324197, - 1929377.168036221, - 1931956.6825373007, - 1963010.3458489692, - 1987417.8617580438, - 2003430.818576213, - 1988779.0843782036, - 1965102.7355575296, - 2025340.0198081164, - 2062086.7964474603, - 2100653.178278064, - 2121586.47525742, - 2127410.706241365, - 2191602.330339989, - 2269600.8157500294, - 2307481.352133978, - 2317072.1718666954, - 2403092.253881029, - 2387299.539892179, - 2444840.5235561267, - 2415932.026601622, - 2474948.751192562, - 2508700.6480966276, - 2512526.0123553444, - 2467551.2956676795, - 2474119.2937994967, - 2442108.847902021, - 2465961.278870651, - 2462339.8362906966, - 2487833.1587285083, - 2480211.853957917, - 2476978.061358569, - 2441226.778225744, - 2423310.2246779925, - 2408273.4608075162, - 2364112.088908258, - 2346153.2440977236, - 2298112.4759117533, - 2343280.767322665, - 2318242.7717533745, - 2270587.1085328143, - 2244961.0278013805, - 2265192.1688796044, - 2236990.1783005544, - 2175698.2967390725, - 2149361.1666356977, - 2082493.7321108496, - 2045365.949702635, - 1933460.4522740236, - 1837203.722463047, - 1834753.4724061263, - 1816217.7110740412, - 1774299.342261277, - 1804330.2776291287, - 1810274.227359679, - 1815797.985736452, - 1767536.3067989915, - 1753873.000958744, - 1795207.9053589432, - 1848095.0532257636, - 1877706.3606370597, - 1894179.1879105112, - 1892727.4980120857, - 1911433.8752356917, - 1911795.6025494228, - 1931036.3131689595, - 1982113.53253971, - 1998981.9920502943, - 2018754.549447416, - 2036614.3163118442, - 2064125.601650844, - 2079324.9569145096, - 2175972.766564028, - 2203413.1616928186, - 2491916.6961217704, - 2637246.1974205077, - 2738861.8960008807, - 2479100.645716722, - 2631460.417696741, - 2821685.7959034224, - 3016498.2012437386, - 3135023.778370971, - 3242900.338358822, - 3542930.440571592, - 3602826.075625967, - 4641689.760238383, - 5532086.51493693, - 5241936.213035798, - 4679898.265829929, - 4607777.047005309, - 4476394.696274711, - 4548159.84982145, - 4075862.74702447, - 3823810.8327503907, - 3587385.7666019727, - 3294612.9702236676, - 3157095.7952627633, - 3084487.4369598376, - 3006434.824946451, - 2967154.8749029655, - 2943299.718222898, - 2607421.2630272885, - 2759888.575652927, - 2867998.7672901317, - 2838208.3678653613, - 3554783.6127572083, - 3403288.803228647, - 3280777.284706433, - 3098247.5694037075, - 2911402.2352793682, - 2813991.1263547568, - 2849793.6433972586, - 2810972.0243088705, - 2603838.5427956823, - 2535103.6127298707, - 2441947.5560120153, - 2381119.605951672, - 2262611.755904736, - 2177813.4280904555, - 2153350.2842349033, - 2056312.8390139171, - 2034879.6348582096, - 2011908.5128726694, - 1975246.039356646, - 1974928.0043997392, - 1949913.9772110344, - 2052023.0671753741, - 2123355.2328597815, - 2208966.917280985, - 2324177.876087952, - 2377283.0662711468, - 2448292.9113852326, - 2516615.0131406286, - 2634742.6478392724, - 2629622.7174154283, - 2530110.215974662, - 2512261.9034275347, - 2401907.535877136, - 2112301.526933039, - 2199678.5362940426, - 1942634.5435748228, - 1993201.4381265412, - 2081286.2450000995, - 2058726.6503462004, - 1956896.9656153892, - 1984624.4330469817, - 1996000.7966048867, - 2222970.13531613, - 2304114.0654248744, - 2352247.122176118, - 2346557.2774270847, - 2374431.287066725, - 2178299.9612308913, - 2276948.101930004, - 2286760.2525215996, - 2289308.3913760516, - 2350589.166040625, - 2399755.563935135, - 2297012.783460794, - 2364625.62086964, - 2410273.1471328577, - 2388320.7717300784, - 2397248.171596008, - 2446867.8159361756, - 2488785.7531668143, - 2579911.4850181127, - 2652497.6097913445, - 2717100.1982751344, - 2633552.433762527, - 2691697.83914161, - 2728054.3525889763, - 2759844.6408258155, - 3007700.3774541887, - 2979635.81392006, - 2973036.9311712924, - 3014837.2445889167, - 3054077.488358181, - 3078988.7890676092, - 3086560.3562860535, - 3138075.4641226204, - 3134276.062574507, - 3184845.972481529, - 3209455.899079203, - 3116347.1753218393, - 3100967.390177222, - 3053361.7671576133, - 3055640.7917715865, - 3128891.1442491217, - 3221759.2911561397, - 3328239.8033136525, - 3369894.155032078, - 3409017.6464398564, - 3386189.1326157027, - 3468445.5257952674, - 3401571.209108302, - 3107973.407240661, - 3197503.450232495, - 3553906.0336542185, - 3567991.376315559, - 3512918.4392049783, - 3515378.9325634153, - 3500439.8350445605, - 3455979.425863228, - 3421385.615152686, - 3465789.3179333746, - 3524598.7460719915, - 3529651.8637012728, - 3625658.524812445, - 3993899.5732455575, - 4010175.1426308295, - 4081619.474374929, - 4181879.7108287206, - 4122964.8947372255, - 4055953.419035536, - 4230712.068042858, - 4110602.1283818856, - 3976724.511588946, - 3986401.809638881, - 3888934.708122162, - 3862180.0595822325, - 3754373.110717843, - 3794361.7719460228, - 3825445.3412385955, - 3842320.8951328206, - 3854388.4485645997, - 3833999.8790115374, - 3793918.213803601, - 3762743.585308539, - 3961784.3457144243, - 4064490.6362072625, - 4198076.084368358, - 4350714.766271434, - 4350714.766271434, - 4440006.518862714, - 4478176.41787341, - 4496652.406740708, - 4507716.175859721, - 4461061.2581150625, - 4644340.360643511, - 4766820.145848519, - 4744696.938207916, - 4773193.554487447, - 4863566.93250825, - 4929314.226524427, - 4999002.899648121, - 5103997.756345745, - 5133516.390718215, - 5315418.661896805, - 5371241.6562625915, - 5409056.428591357, - 5449984.990804703, - 5562820.185506124, - 5575877.962460135, - 5572214.321455131, - 5565016.890650941, - 5640944.666692128, - 5665911.954420054, - 5692827.814306425, - 5674636.8164402675, - 5692108.262544367, - 5648216.6095142225, - 5579980.11993974, - 5499292.121144832, - 5440589.478914187, - 5350644.627449789, - 5247582.076310813, - 5130300.980980501, - 5082011.206696278 - ], - "yaxis": "y" - }, - { - "hovertemplate": "variable=BASE_ROLL120
datetime=%{x}
value=%{y}", - "legendgroup": "BASE_ROLL120", - "line": { - "color": "#FFA15A", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "BASE_ROLL120", - "showlegend": true, - "type": "scattergl", - "x": [ - "2017-01-05T00:00:00", - "2017-01-06T00:00:00", - "2017-01-09T00:00:00", - "2017-01-10T00:00:00", - "2017-01-11T00:00:00", - "2017-01-12T00:00:00", - "2017-01-13T00:00:00", - "2017-01-17T00:00:00", - "2017-01-18T00:00:00", - "2017-01-19T00:00:00", - "2017-01-20T00:00:00", - "2017-01-23T00:00:00", - "2017-01-24T00:00:00", - "2017-01-25T00:00:00", - "2017-01-26T00:00:00", - "2017-01-27T00:00:00", - "2017-01-30T00:00:00", - "2017-01-31T00:00:00", - "2017-02-01T00:00:00", - "2017-02-02T00:00:00", - "2017-02-03T00:00:00", - "2017-02-06T00:00:00", - "2017-02-07T00:00:00", - "2017-02-08T00:00:00", - "2017-02-09T00:00:00", - "2017-02-10T00:00:00", - "2017-02-13T00:00:00", - "2017-02-14T00:00:00", - "2017-02-15T00:00:00", - "2017-02-16T00:00:00", - "2017-02-17T00:00:00", - "2017-02-21T00:00:00", - "2017-02-22T00:00:00", - "2017-02-23T00:00:00", - "2017-02-24T00:00:00", - "2017-02-27T00:00:00", - "2017-02-28T00:00:00", - "2017-03-01T00:00:00", - "2017-03-02T00:00:00", - "2017-03-03T00:00:00", - "2017-03-06T00:00:00", - "2017-03-07T00:00:00", - "2017-03-08T00:00:00", - "2017-03-09T00:00:00", - "2017-03-10T00:00:00", - "2017-03-13T00:00:00", - "2017-03-14T00:00:00", - "2017-03-15T00:00:00", - "2017-03-16T00:00:00", - "2017-03-17T00:00:00", - "2017-03-20T00:00:00", - "2017-03-21T00:00:00", - "2017-03-22T00:00:00", - "2017-03-23T00:00:00", - "2017-03-24T00:00:00", - "2017-03-27T00:00:00", - "2017-03-28T00:00:00", - "2017-03-29T00:00:00", - "2017-03-30T00:00:00", - "2017-03-31T00:00:00", - "2017-04-03T00:00:00", - "2017-04-04T00:00:00", - "2017-04-05T00:00:00", - "2017-04-06T00:00:00", - "2017-04-07T00:00:00", - "2017-04-10T00:00:00", - "2017-04-11T00:00:00", - "2017-04-12T00:00:00", - "2017-04-13T00:00:00", - "2017-04-17T00:00:00", - "2017-04-18T00:00:00", - "2017-04-19T00:00:00", - "2017-04-20T00:00:00", - "2017-04-21T00:00:00", - "2017-04-24T00:00:00", - "2017-04-25T00:00:00", - "2017-04-26T00:00:00", - "2017-04-27T00:00:00", - "2017-04-28T00:00:00", - "2017-05-01T00:00:00", - "2017-05-02T00:00:00", - "2017-05-03T00:00:00", - "2017-05-04T00:00:00", - "2017-05-05T00:00:00", - "2017-05-08T00:00:00", - "2017-05-09T00:00:00", - "2017-05-10T00:00:00", - "2017-05-11T00:00:00", - "2017-05-12T00:00:00", - "2017-05-15T00:00:00", - "2017-05-16T00:00:00", - "2017-05-17T00:00:00", - "2017-05-18T00:00:00", - "2017-05-19T00:00:00", - "2017-05-22T00:00:00", - "2017-05-23T00:00:00", - "2017-05-24T00:00:00", - "2017-05-25T00:00:00", - "2017-05-26T00:00:00", - "2017-05-29T00:00:00", - "2017-05-30T00:00:00", - "2017-05-31T00:00:00", - "2017-06-01T00:00:00", - "2017-06-02T00:00:00", - "2017-06-05T00:00:00", - "2017-06-06T00:00:00", - "2017-06-07T00:00:00", - "2017-06-08T00:00:00", - "2017-06-09T00:00:00", - "2017-06-12T00:00:00", - "2017-06-13T00:00:00", - "2017-06-14T00:00:00", - "2017-06-15T00:00:00", - "2017-06-16T00:00:00", - "2017-06-19T00:00:00", - "2017-06-20T00:00:00", - "2017-06-21T00:00:00", - "2017-06-22T00:00:00", - "2017-06-23T00:00:00", - "2017-06-26T00:00:00", - "2017-06-27T00:00:00", - "2017-06-28T00:00:00", - "2017-06-29T00:00:00", - "2017-06-30T00:00:00", - "2017-07-03T00:00:00", - "2017-07-05T00:00:00", - "2017-07-06T00:00:00", - "2017-07-07T00:00:00", - "2017-07-10T00:00:00", - "2017-07-11T00:00:00", - "2017-07-12T00:00:00", - "2017-07-13T00:00:00", - "2017-07-14T00:00:00", - "2017-07-17T00:00:00", - "2017-07-18T00:00:00", - "2017-07-19T00:00:00", - "2017-07-20T00:00:00", - "2017-07-21T00:00:00", - "2017-07-24T00:00:00", - "2017-07-25T00:00:00", - "2017-07-26T00:00:00", - "2017-07-27T00:00:00", - "2017-07-28T00:00:00", - "2017-07-31T00:00:00", - "2017-08-01T00:00:00", - "2017-08-02T00:00:00", - "2017-08-03T00:00:00", - "2017-08-04T00:00:00", - "2017-08-07T00:00:00", - "2017-08-08T00:00:00", - "2017-08-09T00:00:00", - "2017-08-10T00:00:00", - "2017-08-11T00:00:00", - "2017-08-14T00:00:00", - "2017-08-15T00:00:00", - "2017-08-16T00:00:00", - "2017-08-17T00:00:00", - "2017-08-18T00:00:00", - "2017-08-21T00:00:00", - "2017-08-22T00:00:00", - "2017-08-23T00:00:00", - "2017-08-24T00:00:00", - "2017-08-25T00:00:00", - "2017-08-28T00:00:00", - "2017-08-29T00:00:00", - "2017-08-30T00:00:00", - "2017-08-31T00:00:00", - "2017-09-01T00:00:00", - "2017-09-05T00:00:00", - "2017-09-06T00:00:00", - "2017-09-07T00:00:00", - "2017-09-08T00:00:00", - "2017-09-11T00:00:00", - "2017-09-12T00:00:00", - "2017-09-13T00:00:00", - "2017-09-14T00:00:00", - "2017-09-15T00:00:00", - "2017-09-18T00:00:00", - "2017-09-19T00:00:00", - "2017-09-20T00:00:00", - "2017-09-21T00:00:00", - "2017-09-22T00:00:00", - "2017-09-25T00:00:00", - "2017-09-26T00:00:00", - "2017-09-27T00:00:00", - "2017-09-28T00:00:00", - "2017-09-29T00:00:00", - "2017-10-02T00:00:00", - "2017-10-03T00:00:00", - "2017-10-04T00:00:00", - "2017-10-05T00:00:00", - "2017-10-06T00:00:00", - "2017-10-09T00:00:00", - "2017-10-10T00:00:00", - "2017-10-11T00:00:00", - "2017-10-12T00:00:00", - "2017-10-13T00:00:00", - "2017-10-16T00:00:00", - "2017-10-17T00:00:00", - "2017-10-18T00:00:00", - "2017-10-19T00:00:00", - "2017-10-20T00:00:00", - "2017-10-23T00:00:00", - "2017-10-24T00:00:00", - "2017-10-25T00:00:00", - "2017-10-26T00:00:00", - "2017-10-27T00:00:00", - "2017-10-30T00:00:00", - "2017-10-31T00:00:00", - "2017-11-01T00:00:00", - "2017-11-02T00:00:00", - "2017-11-03T00:00:00", - "2017-11-06T00:00:00", - "2017-11-07T00:00:00", - "2017-11-08T00:00:00", - "2017-11-09T00:00:00", - "2017-11-10T00:00:00", - "2017-11-13T00:00:00", - "2017-11-14T00:00:00", - "2017-11-15T00:00:00", - "2017-11-16T00:00:00", - "2017-11-17T00:00:00", - "2017-11-20T00:00:00", - "2017-11-21T00:00:00", - "2017-11-22T00:00:00", - "2017-11-24T00:00:00", - "2017-11-27T00:00:00", - "2017-11-28T00:00:00", - "2017-11-29T00:00:00", - "2017-11-30T00:00:00", - "2017-12-01T00:00:00", - "2017-12-04T00:00:00", - "2017-12-05T00:00:00", - "2017-12-06T00:00:00", - "2017-12-07T00:00:00", - "2017-12-08T00:00:00", - "2017-12-11T00:00:00", - "2017-12-12T00:00:00", - "2017-12-13T00:00:00", - "2017-12-14T00:00:00", - "2017-12-15T00:00:00", - "2017-12-18T00:00:00", - "2017-12-19T00:00:00", - "2017-12-20T00:00:00", - "2017-12-21T00:00:00", - "2017-12-22T00:00:00", - "2017-12-26T00:00:00", - "2017-12-27T00:00:00", - "2017-12-28T00:00:00", - "2017-12-29T00:00:00", - "2018-01-01T00:00:00", - "2018-01-02T00:00:00", - "2018-01-04T00:00:00", - "2018-01-05T00:00:00", - "2018-01-08T00:00:00", - "2018-01-09T00:00:00", - "2018-01-10T00:00:00", - "2018-01-11T00:00:00", - "2018-01-12T00:00:00", - "2018-01-15T00:00:00", - "2018-01-16T00:00:00", - "2018-01-17T00:00:00", - "2018-01-18T00:00:00", - "2018-01-19T00:00:00", - "2018-01-22T00:00:00", - "2018-01-23T00:00:00", - "2018-01-24T00:00:00", - "2018-01-25T00:00:00", - "2018-01-26T00:00:00", - "2018-01-29T00:00:00", - "2018-01-30T00:00:00", - "2018-01-31T00:00:00", - "2018-02-01T00:00:00", - "2018-02-02T00:00:00", - "2018-02-05T00:00:00", - "2018-02-06T00:00:00", - "2018-02-07T00:00:00", - "2018-02-08T00:00:00", - "2018-02-09T00:00:00", - "2018-02-12T00:00:00", - "2018-02-13T00:00:00", - "2018-02-14T00:00:00", - "2018-02-15T00:00:00", - "2018-02-16T00:00:00", - "2018-02-20T00:00:00", - "2018-02-21T00:00:00", - "2018-02-22T00:00:00", - "2018-02-23T00:00:00", - "2018-02-26T00:00:00", - "2018-02-27T00:00:00", - "2018-02-28T00:00:00", - "2018-03-01T00:00:00", - "2018-03-02T00:00:00", - "2018-03-05T00:00:00", - "2018-03-06T00:00:00", - "2018-03-07T00:00:00", - "2018-03-08T00:00:00", - "2018-03-09T00:00:00", - "2018-03-12T00:00:00", - "2018-03-13T00:00:00", - "2018-03-14T00:00:00", - "2018-03-15T00:00:00", - "2018-03-16T00:00:00", - "2018-03-19T00:00:00", - "2018-03-20T00:00:00", - "2018-03-21T00:00:00", - "2018-03-22T00:00:00", - "2018-03-23T00:00:00", - "2018-03-26T00:00:00", - "2018-03-27T00:00:00", - "2018-03-28T00:00:00", - "2018-03-29T00:00:00", - "2018-04-02T00:00:00", - "2018-04-03T00:00:00", - "2018-04-04T00:00:00", - "2018-04-05T00:00:00", - "2018-04-06T00:00:00", - "2018-04-09T00:00:00", - "2018-04-10T00:00:00", - "2018-04-11T00:00:00", - "2018-04-12T00:00:00", - "2018-04-13T00:00:00", - "2018-04-16T00:00:00", - "2018-04-17T00:00:00", - "2018-04-18T00:00:00", - "2018-04-19T00:00:00", - "2018-04-20T00:00:00", - "2018-04-23T00:00:00", - "2018-04-24T00:00:00", - "2018-04-25T00:00:00", - "2018-04-26T00:00:00", - "2018-04-27T00:00:00", - "2018-04-30T00:00:00", - "2018-05-01T00:00:00", - "2018-05-02T00:00:00", - "2018-05-03T00:00:00", - "2018-05-04T00:00:00", - "2018-05-07T00:00:00", - "2018-05-08T00:00:00", - "2018-05-09T00:00:00", - "2018-05-10T00:00:00", - "2018-05-11T00:00:00", - "2018-05-14T00:00:00", - "2018-05-15T00:00:00", - "2018-05-16T00:00:00", - "2018-05-17T00:00:00", - "2018-05-18T00:00:00", - "2018-05-21T00:00:00", - "2018-05-22T00:00:00", - "2018-05-23T00:00:00", - "2018-05-24T00:00:00", - "2018-05-25T00:00:00", - "2018-05-28T00:00:00", - "2018-05-29T00:00:00", - "2018-05-30T00:00:00", - "2018-05-31T00:00:00", - "2018-06-01T00:00:00", - "2018-06-04T00:00:00", - "2018-06-05T00:00:00", - "2018-06-06T00:00:00", - "2018-06-07T00:00:00", - "2018-06-08T00:00:00", - "2018-06-11T00:00:00", - "2018-06-12T00:00:00", - "2018-06-13T00:00:00", - "2018-06-14T00:00:00", - "2018-06-15T00:00:00", - "2018-06-18T00:00:00", - "2018-06-19T00:00:00", - "2018-06-20T00:00:00", - "2018-06-21T00:00:00", - "2018-06-22T00:00:00", - "2018-06-25T00:00:00", - "2018-06-26T00:00:00", - "2018-06-27T00:00:00", - "2018-06-28T00:00:00", - "2018-06-29T00:00:00", - "2018-07-02T00:00:00", - "2018-07-03T00:00:00", - "2018-07-05T00:00:00", - "2018-07-06T00:00:00", - "2018-07-09T00:00:00", - "2018-07-10T00:00:00", - "2018-07-11T00:00:00", - "2018-07-12T00:00:00", - "2018-07-13T00:00:00", - "2018-07-16T00:00:00", - "2018-07-17T00:00:00", - "2018-07-18T00:00:00", - "2018-07-19T00:00:00", - "2018-07-20T00:00:00", - "2018-07-23T00:00:00", - "2018-07-24T00:00:00", - "2018-07-25T00:00:00", - "2018-07-26T00:00:00", - "2018-07-27T00:00:00", - "2018-07-30T00:00:00", - "2018-07-31T00:00:00", - "2018-08-01T00:00:00", - "2018-08-02T00:00:00", - "2018-08-03T00:00:00", - "2018-08-06T00:00:00", - "2018-08-07T00:00:00", - "2018-08-08T00:00:00", - "2018-08-09T00:00:00", - "2018-08-10T00:00:00", - "2018-08-13T00:00:00", - "2018-08-14T00:00:00", - "2018-08-15T00:00:00", - "2018-08-16T00:00:00", - "2018-08-17T00:00:00", - "2018-08-20T00:00:00", - "2018-08-21T00:00:00", - "2018-08-22T00:00:00", - "2018-08-23T00:00:00", - "2018-08-24T00:00:00", - "2018-08-27T00:00:00", - "2018-08-28T00:00:00", - "2018-08-29T00:00:00", - "2018-08-30T00:00:00", - "2018-08-31T00:00:00", - "2018-09-03T00:00:00", - "2018-09-04T00:00:00", - "2018-09-05T00:00:00", - "2018-09-06T00:00:00", - "2018-09-07T00:00:00", - "2018-09-10T00:00:00", - "2018-09-11T00:00:00", - "2018-09-12T00:00:00", - "2018-09-13T00:00:00", - "2018-09-14T00:00:00", - "2018-09-17T00:00:00", - "2018-09-18T00:00:00", - "2018-09-19T00:00:00", - "2018-09-20T00:00:00", - "2018-09-21T00:00:00", - "2018-09-24T00:00:00", - "2018-09-25T00:00:00", - "2018-09-26T00:00:00", - "2018-09-27T00:00:00", - "2018-09-28T00:00:00", - "2018-10-01T00:00:00", - "2018-10-02T00:00:00", - "2018-10-03T00:00:00", - "2018-10-04T00:00:00", - "2018-10-05T00:00:00", - "2018-10-08T00:00:00", - "2018-10-09T00:00:00", - "2018-10-10T00:00:00", - "2018-10-11T00:00:00", - "2018-10-12T00:00:00", - "2018-10-15T00:00:00", - "2018-10-16T00:00:00", - "2018-10-17T00:00:00", - "2018-10-18T00:00:00", - "2018-10-19T00:00:00", - "2018-10-22T00:00:00", - "2018-10-23T00:00:00", - "2018-10-24T00:00:00", - "2018-10-25T00:00:00", - "2018-10-26T00:00:00", - "2018-10-29T00:00:00", - "2018-10-30T00:00:00", - "2018-10-31T00:00:00", - "2018-11-01T00:00:00", - "2018-11-02T00:00:00", - "2018-11-05T00:00:00", - "2018-11-06T00:00:00", - "2018-11-07T00:00:00", - "2018-11-08T00:00:00", - "2018-11-09T00:00:00", - "2018-11-12T00:00:00", - "2018-11-13T00:00:00", - "2018-11-14T00:00:00", - "2018-11-15T00:00:00", - "2018-11-16T00:00:00", - "2018-11-19T00:00:00", - "2018-11-20T00:00:00", - "2018-11-21T00:00:00", - "2018-11-23T00:00:00", - "2018-11-26T00:00:00", - "2018-11-27T00:00:00", - "2018-11-28T00:00:00", - "2018-11-29T00:00:00", - "2018-11-30T00:00:00", - "2018-12-03T00:00:00", - "2018-12-04T00:00:00", - "2018-12-06T00:00:00", - "2018-12-07T00:00:00", - "2018-12-10T00:00:00", - "2018-12-11T00:00:00", - "2018-12-12T00:00:00", - "2018-12-13T00:00:00", - "2018-12-14T00:00:00", - "2018-12-17T00:00:00", - "2018-12-18T00:00:00", - "2018-12-19T00:00:00", - "2018-12-20T00:00:00", - "2018-12-21T00:00:00", - "2018-12-24T00:00:00", - "2018-12-26T00:00:00", - "2018-12-27T00:00:00", - "2018-12-28T00:00:00", - "2018-12-31T00:00:00", - "2019-01-01T00:00:00", - "2019-01-02T00:00:00", - "2019-01-04T00:00:00", - "2019-01-08T00:00:00", - "2019-01-09T00:00:00", - "2019-01-10T00:00:00", - "2019-01-11T00:00:00", - "2019-01-16T00:00:00", - "2019-01-18T00:00:00", - "2019-01-22T00:00:00", - "2019-01-23T00:00:00", - "2019-01-24T00:00:00", - "2019-01-28T00:00:00", - "2019-01-29T00:00:00", - "2019-01-30T00:00:00", - "2019-01-31T00:00:00", - "2019-02-01T00:00:00", - "2019-02-04T00:00:00", - "2019-02-05T00:00:00", - "2019-02-06T00:00:00", - "2019-02-07T00:00:00", - "2019-02-08T00:00:00", - "2019-02-11T00:00:00", - "2019-02-12T00:00:00", - "2019-02-13T00:00:00", - "2019-02-14T00:00:00", - "2019-02-15T00:00:00", - "2019-02-18T00:00:00", - "2019-02-19T00:00:00", - "2019-02-20T00:00:00", - "2019-02-21T00:00:00", - "2019-02-22T00:00:00", - "2019-02-25T00:00:00", - "2019-02-26T00:00:00", - "2019-02-27T00:00:00", - "2019-02-28T00:00:00", - "2019-03-01T00:00:00", - "2019-03-04T00:00:00", - "2019-03-05T00:00:00", - "2019-03-06T00:00:00", - "2019-03-07T00:00:00", - "2019-03-08T00:00:00", - "2019-03-11T00:00:00", - "2019-03-12T00:00:00", - "2019-03-13T00:00:00", - "2019-03-14T00:00:00", - "2019-03-15T00:00:00", - "2019-03-18T00:00:00", - "2019-03-19T00:00:00", - "2019-03-20T00:00:00", - "2019-03-21T00:00:00", - "2019-03-22T00:00:00", - "2019-03-25T00:00:00", - "2019-03-26T00:00:00", - "2019-03-27T00:00:00", - "2019-03-28T00:00:00", - "2019-03-29T00:00:00", - "2019-04-01T00:00:00", - "2019-04-02T00:00:00", - "2019-04-03T00:00:00", - "2019-04-04T00:00:00", - "2019-04-05T00:00:00", - "2019-04-08T00:00:00", - "2019-04-09T00:00:00", - "2019-04-10T00:00:00", - "2019-04-11T00:00:00", - "2019-04-12T00:00:00", - "2019-04-15T00:00:00", - "2019-04-16T00:00:00", - "2019-04-17T00:00:00", - "2019-04-18T00:00:00", - "2019-04-19T00:00:00", - "2019-04-22T00:00:00", - "2019-04-23T00:00:00", - "2019-04-24T00:00:00", - "2019-04-25T00:00:00", - "2019-04-26T00:00:00", - "2019-04-29T00:00:00", - "2019-04-30T00:00:00", - "2019-05-01T00:00:00", - "2019-05-02T00:00:00", - "2019-05-03T00:00:00", - "2019-05-06T00:00:00", - "2019-05-07T00:00:00", - "2019-05-08T00:00:00", - "2019-05-09T00:00:00", - "2019-05-10T00:00:00", - "2019-05-13T00:00:00", - "2019-05-14T00:00:00", - "2019-05-15T00:00:00", - "2019-05-16T00:00:00", - "2019-05-17T00:00:00", - "2019-05-20T00:00:00", - "2019-05-21T00:00:00", - "2019-05-22T00:00:00", - "2019-05-23T00:00:00", - "2019-05-24T00:00:00", - "2019-05-28T00:00:00", - "2019-05-29T00:00:00", - "2019-05-30T00:00:00", - "2019-05-31T00:00:00", - "2019-06-03T00:00:00", - "2019-06-04T00:00:00", - "2019-06-05T00:00:00", - "2019-06-06T00:00:00", - "2019-06-07T00:00:00", - "2019-06-10T00:00:00", - "2019-06-11T00:00:00", - "2019-06-12T00:00:00", - "2019-06-13T00:00:00", - "2019-06-14T00:00:00", - "2019-06-17T00:00:00", - "2019-06-18T00:00:00", - "2019-06-19T00:00:00", - "2019-06-20T00:00:00", - "2019-06-21T00:00:00", - "2019-06-24T00:00:00", - "2019-06-25T00:00:00", - "2019-06-26T00:00:00", - "2019-06-27T00:00:00", - "2019-06-28T00:00:00", - "2019-07-01T00:00:00", - "2019-07-02T00:00:00", - "2019-07-03T00:00:00", - "2019-07-04T00:00:00", - "2019-07-05T00:00:00", - "2019-07-08T00:00:00", - "2019-07-09T00:00:00", - "2019-07-10T00:00:00", - "2019-07-11T00:00:00", - "2019-07-12T00:00:00", - "2019-07-15T00:00:00", - "2019-07-16T00:00:00", - "2019-07-17T00:00:00", - "2019-07-18T00:00:00", - "2019-07-19T00:00:00", - "2019-07-22T00:00:00", - "2019-07-23T00:00:00", - "2019-07-24T00:00:00", - "2019-07-25T00:00:00", - "2019-07-26T00:00:00", - "2019-07-29T00:00:00", - "2019-07-30T00:00:00", - "2019-07-31T00:00:00", - "2019-08-01T00:00:00", - "2019-08-02T00:00:00", - "2019-08-05T00:00:00", - "2019-08-06T00:00:00", - "2019-08-07T00:00:00", - "2019-08-08T00:00:00", - "2019-08-09T00:00:00", - "2019-08-12T00:00:00", - "2019-08-13T00:00:00", - "2019-08-14T00:00:00", - "2019-08-15T00:00:00", - "2019-08-16T00:00:00", - "2019-08-19T00:00:00", - "2019-08-20T00:00:00", - "2019-08-21T00:00:00", - "2019-08-22T00:00:00", - "2019-08-23T00:00:00", - "2019-08-26T00:00:00", - "2019-08-27T00:00:00", - "2019-08-28T00:00:00", - "2019-08-29T00:00:00", - "2019-08-30T00:00:00", - "2019-09-03T00:00:00", - "2019-09-04T00:00:00", - "2019-09-05T00:00:00", - "2019-09-06T00:00:00", - "2019-09-09T00:00:00", - "2019-09-10T00:00:00", - "2019-09-11T00:00:00", - "2019-09-12T00:00:00", - "2019-09-13T00:00:00", - "2019-09-16T00:00:00", - "2019-09-17T00:00:00", - "2019-09-18T00:00:00", - "2019-09-19T00:00:00", - "2019-09-20T00:00:00", - "2019-09-23T00:00:00", - "2019-09-24T00:00:00", - "2019-09-25T00:00:00", - "2019-09-26T00:00:00", - "2019-09-27T00:00:00", - "2019-09-30T00:00:00", - "2019-10-01T00:00:00", - "2019-10-02T00:00:00", - "2019-10-03T00:00:00", - "2019-10-04T00:00:00", - "2019-10-07T00:00:00", - "2019-10-08T00:00:00", - "2019-10-09T00:00:00", - "2019-10-10T00:00:00", - "2019-10-11T00:00:00", - "2019-10-14T00:00:00", - "2019-10-15T00:00:00", - "2019-10-16T00:00:00", - "2019-10-17T00:00:00", - "2019-10-18T00:00:00", - "2019-10-21T00:00:00", - "2019-10-22T00:00:00", - "2019-10-23T00:00:00", - "2019-10-24T00:00:00", - "2019-10-25T00:00:00", - "2019-10-28T00:00:00", - "2019-10-29T00:00:00", - "2019-10-30T00:00:00", - "2019-10-31T00:00:00", - "2019-11-01T00:00:00", - "2019-11-04T00:00:00", - "2019-11-05T00:00:00", - "2019-11-06T00:00:00", - "2019-11-07T00:00:00", - "2019-11-08T00:00:00", - "2019-11-11T00:00:00", - "2019-11-12T00:00:00", - "2019-11-13T00:00:00", - "2019-11-14T00:00:00", - "2019-11-15T00:00:00", - "2019-11-18T00:00:00", - "2019-11-19T00:00:00", - "2019-11-20T00:00:00", - "2019-11-21T00:00:00", - "2019-11-22T00:00:00", - "2019-11-25T00:00:00", - "2019-11-26T00:00:00", - "2019-11-27T00:00:00", - "2019-11-28T00:00:00", - "2019-11-29T00:00:00", - "2019-12-02T00:00:00", - "2019-12-03T00:00:00", - "2019-12-04T00:00:00", - "2019-12-05T00:00:00", - "2019-12-06T00:00:00", - "2019-12-09T00:00:00", - "2019-12-10T00:00:00", - "2019-12-11T00:00:00", - "2019-12-12T00:00:00", - "2019-12-13T00:00:00", - "2019-12-16T00:00:00", - "2019-12-17T00:00:00", - "2019-12-18T00:00:00", - "2019-12-19T00:00:00", - "2019-12-20T00:00:00", - "2019-12-23T00:00:00", - "2019-12-24T00:00:00", - "2019-12-26T00:00:00", - "2019-12-27T00:00:00", - "2019-12-30T00:00:00", - "2019-12-31T00:00:00", - "2020-01-01T00:00:00", - "2020-01-02T00:00:00", - "2020-01-06T00:00:00", - "2020-01-07T00:00:00", - "2020-01-08T00:00:00", - "2020-01-09T00:00:00", - "2020-01-10T00:00:00", - "2020-01-13T00:00:00", - "2020-01-14T00:00:00", - "2020-01-15T00:00:00", - "2020-01-16T00:00:00", - "2020-01-17T00:00:00", - "2020-01-21T00:00:00", - "2020-01-22T00:00:00", - "2020-01-23T00:00:00", - "2020-01-24T00:00:00", - "2020-01-27T00:00:00", - "2020-01-28T00:00:00", - "2020-01-29T00:00:00", - "2020-01-30T00:00:00", - "2020-01-31T00:00:00", - "2020-02-03T00:00:00", - "2020-02-04T00:00:00", - "2020-02-05T00:00:00", - "2020-02-06T00:00:00", - "2020-02-07T00:00:00", - "2020-02-10T00:00:00", - "2020-02-11T00:00:00", - "2020-02-12T00:00:00", - "2020-02-13T00:00:00", - "2020-02-14T00:00:00", - "2020-02-18T00:00:00", - "2020-02-19T00:00:00", - "2020-02-20T00:00:00", - "2020-02-21T00:00:00", - "2020-02-24T00:00:00", - "2020-02-25T00:00:00", - "2020-02-26T00:00:00", - "2020-02-27T00:00:00", - "2020-02-28T00:00:00", - "2020-03-02T00:00:00", - "2020-03-03T00:00:00", - "2020-03-04T00:00:00", - "2020-03-05T00:00:00", - "2020-03-06T00:00:00", - "2020-03-09T00:00:00", - "2020-03-10T00:00:00", - "2020-03-11T00:00:00", - "2020-03-12T00:00:00", - "2020-03-13T00:00:00", - "2020-03-16T00:00:00", - "2020-03-17T00:00:00", - "2020-03-18T00:00:00", - "2020-03-19T00:00:00", - "2020-03-20T00:00:00", - "2020-03-23T00:00:00", - "2020-03-24T00:00:00", - "2020-03-25T00:00:00", - "2020-03-26T00:00:00", - "2020-03-27T00:00:00", - "2020-03-30T00:00:00", - "2020-03-31T00:00:00", - "2020-04-01T00:00:00", - "2020-04-02T00:00:00", - "2020-04-03T00:00:00", - "2020-04-06T00:00:00", - "2020-04-07T00:00:00", - "2020-04-08T00:00:00", - "2020-04-09T00:00:00", - "2020-04-13T00:00:00", - "2020-04-14T00:00:00", - "2020-04-15T00:00:00", - "2020-04-16T00:00:00", - "2020-04-17T00:00:00", - "2020-04-20T00:00:00", - "2020-04-21T00:00:00", - "2020-04-22T00:00:00", - "2020-04-23T00:00:00", - "2020-04-24T00:00:00", - "2020-04-27T00:00:00", - "2020-04-28T00:00:00", - "2020-04-29T00:00:00", - "2020-04-30T00:00:00", - "2020-05-01T00:00:00", - "2020-05-04T00:00:00", - "2020-05-05T00:00:00", - "2020-05-06T00:00:00", - "2020-05-07T00:00:00", - "2020-05-08T00:00:00", - "2020-05-11T00:00:00", - "2020-05-12T00:00:00", - "2020-05-13T00:00:00", - "2020-05-14T00:00:00", - "2020-05-15T00:00:00", - "2020-05-18T00:00:00", - "2020-05-19T00:00:00", - "2020-05-20T00:00:00", - "2020-05-21T00:00:00", - "2020-05-22T00:00:00", - "2020-05-26T00:00:00", - "2020-05-27T00:00:00", - "2020-05-28T00:00:00", - "2020-05-29T00:00:00", - "2020-06-01T00:00:00", - "2020-06-02T00:00:00", - "2020-06-03T00:00:00", - "2020-06-04T00:00:00", - "2020-06-05T00:00:00", - "2020-06-08T00:00:00", - "2020-06-09T00:00:00", - "2020-06-10T00:00:00", - "2020-06-11T00:00:00", - "2020-06-12T00:00:00", - "2020-06-15T00:00:00", - "2020-06-16T00:00:00", - "2020-06-17T00:00:00", - "2020-06-18T00:00:00", - "2020-06-19T00:00:00", - "2020-06-22T00:00:00", - "2020-06-23T00:00:00", - "2020-06-24T00:00:00", - "2020-06-25T00:00:00", - "2020-06-26T00:00:00", - "2020-06-29T00:00:00", - "2020-06-30T00:00:00", - "2020-07-01T00:00:00", - "2020-07-02T00:00:00", - "2020-07-06T00:00:00", - "2020-07-07T00:00:00", - "2020-07-08T00:00:00", - "2020-07-09T00:00:00", - "2020-07-10T00:00:00", - "2020-07-13T00:00:00", - "2020-07-14T00:00:00", - "2020-07-15T00:00:00", - "2020-07-16T00:00:00", - "2020-07-17T00:00:00", - "2020-07-20T00:00:00", - "2020-07-21T00:00:00", - "2020-07-22T00:00:00", - "2020-07-23T00:00:00", - "2020-07-24T00:00:00", - "2020-07-27T00:00:00", - "2020-07-28T00:00:00", - "2020-07-29T00:00:00", - "2020-07-30T00:00:00", - "2020-07-31T00:00:00", - "2020-08-03T00:00:00", - "2020-08-04T00:00:00", - "2020-08-05T00:00:00", - "2020-08-06T00:00:00", - "2020-08-07T00:00:00", - "2020-08-10T00:00:00", - "2020-08-11T00:00:00", - "2020-08-12T00:00:00", - "2020-08-13T00:00:00", - "2020-08-14T00:00:00", - "2020-08-17T00:00:00", - "2020-08-18T00:00:00", - "2020-08-19T00:00:00", - "2020-08-20T00:00:00", - "2020-08-21T00:00:00", - "2020-08-24T00:00:00", - "2020-08-25T00:00:00", - "2020-08-26T00:00:00", - "2020-08-27T00:00:00", - "2020-08-28T00:00:00", - "2020-08-31T00:00:00", - "2020-09-01T00:00:00", - "2020-09-02T00:00:00", - "2020-09-03T00:00:00", - "2020-09-04T00:00:00", - "2020-09-08T00:00:00", - "2020-09-09T00:00:00", - "2020-09-10T00:00:00", - "2020-09-11T00:00:00", - "2020-09-14T00:00:00", - "2020-09-15T00:00:00", - "2020-09-16T00:00:00", - "2020-09-17T00:00:00", - "2020-09-18T00:00:00", - "2020-09-21T00:00:00", - "2020-09-22T00:00:00", - "2020-09-23T00:00:00", - "2020-09-24T00:00:00", - "2020-09-25T00:00:00", - "2020-09-28T00:00:00", - "2020-09-29T00:00:00", - "2020-09-30T00:00:00", - "2020-10-01T00:00:00", - "2020-10-02T00:00:00", - "2020-10-05T00:00:00", - "2020-10-06T00:00:00", - "2020-10-07T00:00:00", - "2020-10-08T00:00:00", - "2020-10-09T00:00:00", - "2020-10-12T00:00:00", - "2020-10-13T00:00:00", - "2020-10-14T00:00:00", - "2020-10-15T00:00:00", - "2020-10-16T00:00:00", - "2020-10-19T00:00:00", - "2020-10-20T00:00:00", - "2020-10-21T00:00:00", - "2020-10-22T00:00:00", - "2020-10-23T00:00:00", - "2020-10-26T00:00:00", - "2020-10-27T00:00:00", - "2020-10-28T00:00:00", - "2020-10-29T00:00:00", - "2020-10-30T00:00:00", - "2020-11-02T00:00:00", - "2020-11-03T00:00:00", - "2020-11-04T00:00:00", - "2020-11-05T00:00:00", - "2020-11-06T00:00:00", - "2020-11-09T00:00:00", - "2020-11-10T00:00:00", - "2020-11-11T00:00:00", - "2020-11-12T00:00:00", - "2020-11-13T00:00:00", - "2020-11-16T00:00:00", - "2020-11-17T00:00:00", - "2020-11-18T00:00:00", - "2020-11-19T00:00:00", - "2020-11-20T00:00:00", - "2020-11-23T00:00:00", - "2020-11-24T00:00:00", - "2020-11-25T00:00:00", - "2020-11-27T00:00:00", - "2020-11-30T00:00:00", - "2020-12-01T00:00:00", - "2020-12-02T00:00:00", - "2020-12-03T00:00:00", - "2020-12-04T00:00:00", - "2020-12-07T00:00:00", - "2020-12-08T00:00:00", - "2020-12-09T00:00:00", - "2020-12-10T00:00:00", - "2020-12-11T00:00:00", - "2020-12-14T00:00:00", - "2020-12-15T00:00:00", - "2020-12-16T00:00:00", - "2020-12-17T00:00:00", - "2020-12-18T00:00:00", - "2020-12-21T00:00:00", - "2020-12-22T00:00:00", - "2020-12-23T00:00:00", - "2020-12-24T00:00:00", - "2020-12-28T00:00:00", - "2020-12-29T00:00:00", - "2020-12-30T00:00:00", - "2020-12-31T00:00:00", - "2021-01-01T00:00:00", - "2021-01-04T00:00:00", - "2021-01-06T00:00:00", - "2021-01-07T00:00:00", - "2021-01-08T00:00:00", - "2021-01-11T00:00:00", - "2021-01-12T00:00:00", - "2021-01-13T00:00:00", - "2021-01-14T00:00:00", - "2021-01-15T00:00:00", - "2021-01-19T00:00:00", - "2021-01-20T00:00:00", - "2021-01-21T00:00:00", - "2021-01-22T00:00:00", - "2021-01-25T00:00:00", - "2021-01-26T00:00:00", - "2021-01-27T00:00:00", - "2021-01-28T00:00:00", - "2021-01-29T00:00:00", - "2021-02-01T00:00:00", - "2021-02-02T00:00:00", - "2021-02-03T00:00:00", - "2021-02-04T00:00:00", - "2021-02-05T00:00:00", - "2021-02-08T00:00:00", - "2021-02-09T00:00:00", - "2021-02-10T00:00:00", - "2021-02-11T00:00:00", - "2021-02-12T00:00:00", - "2021-02-16T00:00:00", - "2021-02-17T00:00:00", - "2021-02-18T00:00:00", - "2021-02-19T00:00:00", - "2021-02-22T00:00:00", - "2021-02-23T00:00:00", - "2021-02-24T00:00:00", - "2021-02-25T00:00:00", - "2021-02-26T00:00:00", - "2021-03-01T00:00:00", - "2021-03-02T00:00:00", - "2021-03-03T00:00:00", - "2021-03-04T00:00:00", - "2021-03-05T00:00:00", - "2021-03-08T00:00:00", - "2021-03-09T00:00:00", - "2021-03-10T00:00:00", - "2021-03-11T00:00:00", - "2021-03-12T00:00:00", - "2021-03-15T00:00:00", - "2021-03-16T00:00:00", - "2021-03-17T00:00:00", - "2021-03-18T00:00:00", - "2021-03-19T00:00:00", - "2021-03-22T00:00:00", - "2021-03-23T00:00:00", - "2021-03-24T00:00:00", - "2021-03-25T00:00:00", - "2021-03-26T00:00:00", - "2021-03-29T00:00:00", - "2021-03-30T00:00:00", - "2021-03-31T00:00:00", - "2021-04-01T00:00:00", - "2021-04-05T00:00:00", - "2021-04-06T00:00:00", - "2021-04-07T00:00:00", - "2021-04-08T00:00:00", - "2021-04-09T00:00:00", - "2021-04-12T00:00:00", - "2021-04-13T00:00:00", - "2021-04-14T00:00:00", - "2021-04-15T00:00:00", - "2021-04-16T00:00:00", - "2021-04-19T00:00:00", - "2021-04-20T00:00:00", - "2021-04-21T00:00:00", - "2021-04-22T00:00:00", - "2021-04-23T00:00:00", - "2021-04-26T00:00:00", - "2021-04-27T00:00:00", - "2021-04-28T00:00:00", - "2021-04-29T00:00:00", - "2021-04-30T00:00:00", - "2021-05-03T00:00:00", - "2021-05-04T00:00:00", - "2021-05-05T00:00:00", - "2021-05-06T00:00:00", - "2021-05-07T00:00:00", - "2021-05-10T00:00:00", - "2021-05-11T00:00:00", - "2021-05-12T00:00:00", - "2021-05-13T00:00:00", - "2021-05-14T00:00:00", - "2021-05-17T00:00:00", - "2021-05-18T00:00:00", - "2021-05-19T00:00:00", - "2021-05-20T00:00:00", - "2021-05-21T00:00:00", - "2021-05-24T00:00:00", - "2021-05-25T00:00:00", - "2021-05-26T00:00:00", - "2021-05-27T00:00:00", - "2021-05-28T00:00:00", - "2021-06-01T00:00:00", - "2021-06-02T00:00:00", - "2021-06-03T00:00:00", - "2021-06-04T00:00:00", - "2021-06-07T00:00:00", - "2021-06-08T00:00:00", - "2021-06-09T00:00:00", - "2021-06-10T00:00:00", - "2021-06-11T00:00:00", - "2021-06-14T00:00:00", - "2021-06-15T00:00:00", - "2021-06-16T00:00:00", - "2021-06-17T00:00:00", - "2021-06-18T00:00:00", - "2021-06-21T00:00:00", - "2021-06-22T00:00:00", - "2021-06-23T00:00:00", - "2021-06-24T00:00:00", - "2021-06-25T00:00:00", - "2021-06-28T00:00:00", - "2021-06-29T00:00:00", - "2021-06-30T00:00:00", - "2021-07-01T00:00:00", - "2021-07-02T00:00:00", - "2021-07-05T00:00:00", - "2021-07-06T00:00:00", - "2021-07-07T00:00:00", - "2021-07-08T00:00:00", - "2021-07-09T00:00:00", - "2021-07-12T00:00:00", - "2021-07-13T00:00:00", - "2021-07-14T00:00:00", - "2021-07-15T00:00:00", - "2021-07-16T00:00:00", - "2021-07-19T00:00:00", - "2021-07-20T00:00:00", - "2021-07-21T00:00:00", - "2021-07-22T00:00:00", - "2021-07-23T00:00:00", - "2021-07-26T00:00:00", - "2021-07-27T00:00:00", - "2021-07-28T00:00:00", - "2021-07-29T00:00:00", - "2021-07-30T00:00:00", - "2021-08-02T00:00:00", - "2021-08-03T00:00:00", - "2021-08-04T00:00:00", - "2021-08-05T00:00:00", - "2021-08-06T00:00:00", - "2021-08-09T00:00:00", - "2021-08-10T00:00:00", - "2021-08-11T00:00:00", - "2021-08-12T00:00:00", - "2021-08-13T00:00:00", - "2021-08-16T00:00:00", - "2021-08-17T00:00:00", - "2021-08-18T00:00:00", - "2021-08-19T00:00:00", - "2021-08-20T00:00:00", - "2021-08-23T00:00:00", - "2021-08-24T00:00:00", - "2021-08-25T00:00:00", - "2021-08-26T00:00:00", - "2021-08-27T00:00:00", - "2021-08-30T00:00:00", - "2021-08-31T00:00:00", - "2021-09-01T00:00:00", - "2021-09-02T00:00:00", - "2021-09-03T00:00:00", - "2021-09-07T00:00:00", - "2021-09-08T00:00:00", - "2021-09-09T00:00:00", - "2021-09-10T00:00:00", - "2021-09-13T00:00:00", - "2021-09-14T00:00:00", - "2021-09-15T00:00:00", - "2021-09-16T00:00:00", - "2021-09-17T00:00:00", - "2021-09-20T00:00:00", - "2021-09-21T00:00:00", - "2021-09-22T00:00:00", - "2021-09-23T00:00:00", - "2021-09-24T00:00:00", - "2021-09-27T00:00:00", - "2021-09-28T00:00:00", - "2021-09-29T00:00:00", - "2021-09-30T00:00:00", - "2021-10-01T00:00:00", - "2021-10-04T00:00:00", - "2021-10-05T00:00:00", - "2021-10-06T00:00:00", - "2021-10-07T00:00:00", - "2021-10-08T00:00:00", - "2021-10-11T00:00:00", - "2021-10-12T00:00:00", - "2021-10-13T00:00:00", - "2021-10-14T00:00:00", - "2021-10-15T00:00:00", - "2021-10-18T00:00:00", - "2021-10-19T00:00:00", - "2021-10-20T00:00:00", - "2021-10-21T00:00:00", - "2021-10-22T00:00:00", - "2021-10-25T00:00:00", - "2021-10-26T00:00:00", - "2021-10-27T00:00:00", - "2021-10-28T00:00:00", - "2021-10-29T00:00:00", - "2021-11-01T00:00:00", - "2021-11-02T00:00:00", - "2021-11-03T00:00:00", - "2021-11-04T00:00:00", - "2021-11-05T00:00:00", - "2021-11-08T00:00:00", - "2021-11-09T00:00:00", - "2021-11-10T00:00:00", - "2021-11-11T00:00:00", - "2021-11-12T00:00:00", - "2021-11-15T00:00:00", - "2021-11-16T00:00:00", - "2021-11-17T00:00:00", - "2021-11-18T00:00:00", - "2021-11-19T00:00:00", - "2021-11-22T00:00:00", - "2021-11-23T00:00:00", - "2021-11-24T00:00:00", - "2021-11-25T00:00:00", - "2021-11-26T00:00:00", - "2021-11-29T00:00:00", - "2021-11-30T00:00:00", - "2021-12-01T00:00:00", - "2021-12-02T00:00:00", - "2021-12-03T00:00:00", - "2021-12-06T00:00:00", - "2021-12-07T00:00:00", - "2021-12-08T00:00:00", - "2021-12-09T00:00:00", - "2021-12-10T00:00:00", - "2021-12-13T00:00:00", - "2021-12-14T00:00:00", - "2021-12-15T00:00:00", - "2021-12-16T00:00:00", - "2021-12-17T00:00:00", - "2021-12-20T00:00:00", - "2021-12-21T00:00:00", - "2021-12-22T00:00:00", - "2021-12-23T00:00:00", - "2021-12-27T00:00:00", - "2021-12-28T00:00:00", - "2021-12-29T00:00:00", - "2021-12-30T00:00:00", - "2021-12-31T00:00:00", - "2022-01-03T00:00:00", - "2022-01-05T00:00:00", - "2022-01-06T00:00:00", - "2022-01-07T00:00:00", - "2022-01-10T00:00:00", - "2022-01-11T00:00:00", - "2022-01-12T00:00:00", - "2022-01-13T00:00:00", - "2022-01-14T00:00:00", - "2022-01-18T00:00:00", - "2022-01-19T00:00:00", - "2022-01-20T00:00:00", - "2022-01-21T00:00:00", - "2022-01-24T00:00:00", - "2022-01-25T00:00:00", - "2022-01-26T00:00:00", - "2022-01-27T00:00:00", - "2022-01-28T00:00:00", - "2022-01-31T00:00:00", - "2022-02-01T00:00:00", - "2022-02-02T00:00:00", - "2022-02-03T00:00:00", - "2022-02-04T00:00:00", - "2022-02-07T00:00:00", - "2022-02-08T00:00:00", - "2022-02-09T00:00:00", - "2022-02-10T00:00:00", - "2022-02-11T00:00:00", - "2022-02-14T00:00:00", - "2022-02-15T00:00:00", - "2022-02-16T00:00:00", - "2022-02-17T00:00:00", - "2022-02-18T00:00:00", - "2022-02-22T00:00:00", - "2022-02-23T00:00:00", - "2022-02-24T00:00:00", - "2022-02-25T00:00:00", - "2022-02-28T00:00:00", - "2022-03-01T00:00:00", - "2022-03-02T00:00:00", - "2022-03-03T00:00:00", - "2022-03-04T00:00:00", - "2022-03-07T00:00:00", - "2022-03-08T00:00:00", - "2022-03-09T00:00:00", - "2022-03-10T00:00:00", - "2022-03-11T00:00:00", - "2022-03-14T00:00:00", - "2022-03-15T00:00:00", - "2022-03-16T00:00:00", - "2022-03-17T00:00:00", - "2022-03-18T00:00:00", - "2022-03-21T00:00:00", - "2022-03-22T00:00:00", - "2022-03-23T00:00:00", - "2022-03-24T00:00:00", - "2022-03-25T00:00:00", - "2022-03-28T00:00:00", - "2022-03-29T00:00:00", - "2022-03-30T00:00:00", - "2022-03-31T00:00:00", - "2022-04-01T00:00:00", - "2022-04-04T00:00:00", - "2022-04-05T00:00:00", - "2022-04-06T00:00:00", - "2022-04-07T00:00:00", - "2022-04-08T00:00:00", - "2022-04-11T00:00:00", - "2022-04-12T00:00:00", - "2022-04-13T00:00:00", - "2022-04-14T00:00:00", - "2022-04-18T00:00:00", - "2022-04-19T00:00:00", - "2022-04-20T00:00:00", - "2022-04-21T00:00:00", - "2022-04-22T00:00:00", - "2022-04-25T00:00:00", - "2022-04-26T00:00:00", - "2022-04-27T00:00:00", - "2022-04-28T00:00:00", - "2022-04-29T00:00:00", - "2022-05-03T00:00:00", - "2022-05-04T00:00:00", - "2022-05-05T00:00:00", - "2022-05-06T00:00:00", - "2022-05-09T00:00:00", - "2022-05-10T00:00:00", - "2022-08-01T00:00:00", - "2022-08-02T00:00:00", - "2022-08-03T00:00:00", - "2022-08-04T00:00:00", - "2022-08-05T00:00:00", - "2022-08-08T00:00:00", - "2022-08-09T00:00:00", - "2022-08-10T00:00:00", - "2022-08-11T00:00:00", - "2022-08-12T00:00:00", - "2022-08-15T00:00:00", - "2022-08-16T00:00:00", - "2022-08-17T00:00:00", - "2022-08-18T00:00:00", - "2022-08-19T00:00:00", - "2022-08-22T00:00:00", - "2022-08-23T00:00:00", - "2022-08-24T00:00:00", - "2022-08-25T00:00:00", - "2022-08-26T00:00:00", - "2022-08-29T00:00:00", - "2022-08-30T00:00:00", - "2022-08-31T00:00:00", - "2022-09-01T00:00:00", - "2022-09-02T00:00:00", - "2022-09-06T00:00:00", - "2022-09-07T00:00:00", - "2022-09-14T00:00:00", - "2022-09-15T00:00:00", - "2022-10-27T00:00:00", - "2022-10-28T00:00:00", - "2022-10-31T00:00:00", - "2022-11-01T00:00:00", - "2022-11-02T00:00:00", - "2022-11-03T00:00:00", - "2022-11-04T00:00:00", - "2022-11-14T00:00:00", - "2022-11-15T00:00:00", - "2022-11-16T00:00:00", - "2022-11-17T00:00:00", - "2022-11-18T00:00:00", - "2022-11-21T00:00:00", - "2022-11-22T00:00:00", - "2022-11-23T00:00:00", - "2022-11-25T00:00:00", - "2022-11-28T00:00:00", - "2022-11-29T00:00:00", - "2022-11-30T00:00:00", - "2022-12-01T00:00:00", - "2022-12-02T00:00:00", - "2022-12-05T00:00:00", - "2022-12-06T00:00:00", - "2022-12-07T00:00:00", - "2022-12-08T00:00:00", - "2022-12-09T00:00:00", - "2022-12-12T00:00:00", - "2022-12-13T00:00:00", - "2022-12-14T00:00:00", - "2022-12-15T00:00:00", - "2022-12-16T00:00:00", - "2022-12-19T00:00:00", - "2022-12-20T00:00:00", - "2022-12-21T00:00:00", - "2022-12-22T00:00:00", - "2022-12-23T00:00:00", - "2022-12-27T00:00:00", - "2022-12-28T00:00:00", - "2022-12-29T00:00:00", - "2022-12-30T00:00:00", - "2023-01-02T00:00:00", - "2023-01-03T00:00:00", - "2023-01-05T00:00:00", - "2023-01-06T00:00:00", - "2023-01-09T00:00:00", - "2023-01-10T00:00:00", - "2023-01-11T00:00:00", - "2023-01-12T00:00:00", - "2023-01-13T00:00:00", - "2023-01-17T00:00:00", - "2023-01-18T00:00:00", - "2023-01-19T00:00:00", - "2023-01-20T00:00:00", - "2023-01-23T00:00:00", - "2023-01-24T00:00:00", - "2023-01-25T00:00:00", - "2023-01-26T00:00:00", - "2023-01-27T00:00:00", - "2023-01-30T00:00:00", - "2023-01-31T00:00:00", - "2023-02-01T00:00:00", - "2023-02-02T00:00:00", - "2023-02-03T00:00:00", - "2023-02-06T00:00:00", - "2023-02-07T00:00:00", - "2023-02-08T00:00:00", - "2023-02-09T00:00:00", - "2023-02-10T00:00:00", - "2023-02-13T00:00:00", - "2023-02-14T00:00:00", - "2023-02-15T00:00:00", - "2023-02-16T00:00:00", - "2023-02-17T00:00:00", - "2023-02-21T00:00:00", - "2023-02-22T00:00:00", - "2023-02-23T00:00:00", - "2023-02-24T00:00:00", - "2023-02-27T00:00:00", - "2023-02-28T00:00:00", - "2023-03-01T00:00:00", - "2023-03-02T00:00:00", - "2023-03-03T00:00:00", - "2023-03-06T00:00:00", - "2023-03-07T00:00:00", - "2023-03-08T00:00:00", - "2023-03-09T00:00:00", - "2023-03-10T00:00:00", - "2023-03-13T00:00:00", - "2023-03-14T00:00:00", - "2023-03-15T00:00:00", - "2023-03-16T00:00:00", - "2023-03-17T00:00:00", - "2023-03-20T00:00:00", - "2023-03-21T00:00:00", - "2023-03-22T00:00:00", - "2023-03-23T00:00:00", - "2023-03-24T00:00:00", - "2023-03-27T00:00:00", - "2023-03-28T00:00:00", - "2023-03-29T00:00:00", - "2023-03-30T00:00:00", - "2023-03-31T00:00:00", - "2023-04-03T00:00:00", - "2023-04-04T00:00:00", - "2023-04-05T00:00:00", - "2023-04-06T00:00:00", - "2023-04-07T00:00:00", - "2023-04-10T00:00:00", - "2023-04-11T00:00:00", - "2023-04-12T00:00:00", - "2023-04-13T00:00:00", - "2023-04-14T00:00:00", - "2023-04-17T00:00:00", - "2023-04-18T00:00:00", - "2023-04-19T00:00:00", - "2023-04-20T00:00:00", - "2023-04-21T00:00:00", - "2023-04-24T00:00:00", - "2023-04-25T00:00:00", - "2023-04-26T00:00:00", - "2023-04-27T00:00:00", - "2023-04-28T00:00:00", - "2023-05-01T00:00:00", - "2023-05-02T00:00:00", - "2023-05-03T00:00:00", - "2023-05-04T00:00:00", - "2023-05-05T00:00:00", - "2023-05-08T00:00:00", - "2023-05-09T00:00:00", - "2023-05-10T00:00:00", - "2023-05-11T00:00:00", - "2023-05-12T00:00:00", - "2023-05-15T00:00:00", - "2023-05-16T00:00:00", - "2023-05-17T00:00:00", - "2023-05-18T00:00:00", - "2023-05-19T00:00:00", - "2023-05-22T00:00:00", - "2023-05-23T00:00:00", - "2023-05-24T00:00:00", - "2023-05-25T00:00:00", - "2023-05-26T00:00:00", - "2023-05-30T00:00:00", - "2023-05-31T00:00:00", - "2023-06-01T00:00:00", - "2023-06-02T00:00:00", - "2023-06-05T00:00:00", - "2023-06-06T00:00:00", - "2023-06-07T00:00:00", - "2023-06-08T00:00:00", - "2023-06-09T00:00:00", - "2023-06-12T00:00:00", - "2023-06-13T00:00:00", - "2023-06-14T00:00:00", - "2023-06-15T00:00:00", - "2023-06-16T00:00:00", - "2023-06-19T00:00:00", - "2023-06-20T00:00:00", - "2023-06-21T00:00:00", - "2023-06-22T00:00:00", - "2023-06-23T00:00:00", - "2023-06-26T00:00:00", - "2023-06-27T00:00:00", - "2023-06-28T00:00:00", - "2023-06-29T00:00:00", - "2023-06-30T00:00:00", - "2023-07-03T00:00:00", - "2023-07-05T00:00:00", - "2023-07-06T00:00:00", - "2023-07-07T00:00:00", - "2023-07-10T00:00:00", - "2023-07-11T00:00:00", - "2023-07-12T00:00:00", - "2023-07-13T00:00:00", - "2023-07-14T00:00:00", - "2023-07-17T00:00:00", - "2023-07-18T00:00:00", - "2023-07-19T00:00:00", - "2023-07-20T00:00:00", - "2023-07-21T00:00:00", - "2023-07-24T00:00:00", - "2023-07-25T00:00:00", - "2023-07-26T00:00:00", - "2023-07-27T00:00:00", - "2023-07-28T00:00:00", - "2023-07-31T00:00:00", - "2023-08-01T00:00:00", - "2023-08-02T00:00:00", - "2023-08-03T00:00:00", - "2023-08-04T00:00:00", - "2023-08-07T00:00:00", - "2023-08-08T00:00:00", - "2023-08-09T00:00:00", - "2023-08-10T00:00:00", - "2023-08-11T00:00:00", - "2023-08-14T00:00:00", - "2023-08-15T00:00:00", - "2023-08-16T00:00:00", - "2023-08-17T00:00:00", - "2023-08-18T00:00:00", - "2023-08-21T00:00:00", - "2023-08-22T00:00:00", - "2023-08-23T00:00:00", - "2023-08-24T00:00:00", - "2023-08-25T00:00:00", - "2023-08-28T00:00:00", - "2023-08-29T00:00:00", - "2023-08-30T00:00:00", - "2023-08-31T00:00:00", - "2023-09-01T00:00:00", - "2023-09-05T00:00:00", - "2023-09-06T00:00:00", - "2023-09-07T00:00:00", - "2023-09-08T00:00:00", - "2023-09-11T00:00:00", - "2023-09-12T00:00:00", - "2023-09-13T00:00:00", - "2023-09-14T00:00:00", - "2023-09-15T00:00:00", - "2023-09-18T00:00:00", - "2023-09-19T00:00:00", - "2023-09-20T00:00:00", - "2023-09-21T00:00:00", - "2023-09-22T00:00:00", - "2023-09-25T00:00:00", - "2023-09-26T00:00:00", - "2023-09-27T00:00:00", - "2023-09-28T00:00:00", - "2023-09-29T00:00:00", - "2023-10-02T00:00:00", - "2023-10-03T00:00:00", - "2023-10-04T00:00:00", - "2023-10-05T00:00:00", - "2023-10-06T00:00:00", - "2023-10-09T00:00:00", - "2023-10-10T00:00:00", - "2023-10-11T00:00:00", - "2023-10-12T00:00:00", - "2023-10-13T00:00:00", - "2023-10-16T00:00:00", - "2023-10-17T00:00:00", - "2023-10-18T00:00:00", - "2023-10-19T00:00:00", - "2023-10-20T00:00:00", - "2023-10-23T00:00:00", - "2023-10-24T00:00:00", - "2023-10-25T00:00:00", - "2023-10-26T00:00:00", - "2023-10-27T00:00:00", - "2023-10-30T00:00:00", - "2023-10-31T00:00:00", - "2023-11-01T00:00:00", - "2023-11-02T00:00:00", - "2023-11-03T00:00:00", - "2023-11-06T00:00:00", - "2023-11-07T00:00:00", - "2023-11-08T00:00:00", - "2023-11-09T00:00:00", - "2023-11-10T00:00:00", - "2023-11-13T00:00:00", - "2023-11-14T00:00:00", - "2023-11-15T00:00:00", - "2023-11-16T00:00:00", - "2023-11-17T00:00:00", - "2023-11-20T00:00:00", - "2023-11-21T00:00:00", - "2023-11-22T00:00:00", - "2023-11-23T00:00:00", - "2023-11-24T00:00:00", - "2023-11-27T00:00:00", - "2023-11-28T00:00:00", - "2023-11-29T00:00:00", - "2023-11-30T00:00:00", - "2023-12-01T00:00:00", - "2023-12-04T00:00:00", - "2023-12-05T00:00:00", - "2023-12-06T00:00:00", - "2023-12-07T00:00:00", - "2023-12-08T00:00:00", - "2023-12-11T00:00:00", - "2023-12-12T00:00:00", - "2023-12-13T00:00:00", - "2023-12-14T00:00:00", - "2023-12-15T00:00:00", - "2023-12-18T00:00:00", - "2023-12-19T00:00:00", - "2023-12-20T00:00:00", - "2023-12-21T00:00:00", - "2023-12-22T00:00:00", - "2023-12-25T00:00:00", - "2023-12-26T00:00:00", - "2023-12-27T00:00:00", - "2023-12-28T00:00:00", - "2023-12-29T00:00:00", - "2024-01-01T00:00:00", - "2024-01-02T00:00:00", - "2024-01-04T00:00:00", - "2024-01-05T00:00:00", - "2024-01-08T00:00:00", - "2024-01-09T00:00:00", - "2024-01-10T00:00:00", - "2024-01-11T00:00:00", - "2024-01-12T00:00:00", - "2024-01-15T00:00:00", - "2024-01-16T00:00:00", - "2024-01-17T00:00:00", - "2024-01-18T00:00:00", - "2024-01-19T00:00:00", - "2024-01-22T00:00:00", - "2024-01-23T00:00:00", - "2024-01-24T00:00:00", - "2024-01-25T00:00:00", - "2024-01-26T00:00:00", - "2024-01-29T00:00:00", - "2024-01-30T00:00:00", - "2024-01-31T00:00:00", - "2024-02-01T00:00:00", - "2024-02-02T00:00:00", - "2024-02-05T00:00:00", - "2024-02-06T00:00:00", - "2024-02-07T00:00:00", - "2024-02-08T00:00:00", - "2024-02-09T00:00:00", - "2024-02-12T00:00:00", - "2024-02-13T00:00:00", - "2024-02-14T00:00:00", - "2024-02-15T00:00:00", - "2024-02-16T00:00:00", - "2024-02-20T00:00:00", - "2024-02-21T00:00:00", - "2024-02-22T00:00:00", - "2024-02-23T00:00:00", - "2024-02-26T00:00:00", - "2024-02-27T00:00:00", - "2024-02-28T00:00:00", - "2024-02-29T00:00:00", - "2024-03-01T00:00:00", - "2024-03-04T00:00:00", - "2024-03-05T00:00:00", - "2024-03-06T00:00:00", - "2024-03-07T00:00:00", - "2024-03-08T00:00:00", - "2024-03-11T00:00:00", - "2024-03-12T00:00:00", - "2024-03-13T00:00:00", - "2024-03-14T00:00:00", - "2024-03-15T00:00:00", - "2024-03-18T00:00:00", - "2024-03-19T00:00:00", - "2024-03-20T00:00:00", - "2024-03-21T00:00:00", - "2024-03-22T00:00:00", - "2024-03-25T00:00:00", - "2024-03-26T00:00:00", - "2024-03-27T00:00:00", - "2024-03-28T00:00:00", - "2024-04-01T00:00:00", - "2024-04-02T00:00:00", - "2024-04-03T00:00:00", - "2024-04-04T00:00:00", - "2024-04-05T00:00:00", - "2024-04-08T00:00:00", - "2024-04-09T00:00:00", - "2024-04-10T00:00:00", - "2024-04-11T00:00:00", - "2024-04-12T00:00:00", - "2024-04-15T00:00:00", - "2024-04-16T00:00:00", - "2024-04-17T00:00:00", - "2024-04-18T00:00:00", - "2024-04-19T00:00:00", - "2024-04-22T00:00:00", - "2024-04-23T00:00:00", - "2024-04-24T00:00:00", - "2024-04-25T00:00:00", - "2024-04-26T00:00:00", - "2024-04-29T00:00:00", - "2024-04-30T00:00:00", - "2024-05-01T00:00:00", - "2024-05-02T00:00:00", - "2024-05-03T00:00:00", - "2024-05-06T00:00:00", - "2024-05-07T00:00:00", - "2024-05-08T00:00:00", - "2024-05-09T00:00:00", - "2024-05-10T00:00:00", - "2024-05-13T00:00:00", - "2024-05-14T00:00:00", - "2024-05-15T00:00:00", - "2024-05-16T00:00:00", - "2024-05-17T00:00:00", - "2024-05-20T00:00:00", - "2024-05-21T00:00:00", - "2024-05-22T00:00:00", - "2024-05-23T00:00:00", - "2024-05-24T00:00:00", - "2024-05-28T00:00:00", - "2024-05-29T00:00:00", - "2024-05-30T00:00:00", - "2024-05-31T00:00:00", - "2024-06-03T00:00:00", - "2024-06-04T00:00:00", - "2024-06-05T00:00:00", - "2024-06-06T00:00:00", - "2024-06-07T00:00:00", - "2024-06-10T00:00:00", - "2024-06-11T00:00:00", - "2024-06-12T00:00:00", - "2024-06-13T00:00:00", - "2024-06-14T00:00:00", - "2024-06-17T00:00:00", - "2024-06-18T00:00:00", - "2024-06-20T00:00:00", - "2024-06-21T00:00:00", - "2024-06-24T00:00:00", - "2024-06-25T00:00:00", - "2024-06-26T00:00:00", - "2024-06-27T00:00:00", - "2024-06-28T00:00:00", - "2024-07-01T00:00:00", - "2024-07-02T00:00:00", - "2024-07-03T00:00:00", - "2024-07-05T00:00:00", - "2024-07-08T00:00:00", - "2024-07-09T00:00:00", - "2024-07-10T00:00:00", - "2024-07-11T00:00:00", - "2024-07-12T00:00:00", - "2024-07-15T00:00:00", - "2024-07-16T00:00:00", - "2024-07-17T00:00:00", - "2024-07-18T00:00:00", - "2024-07-19T00:00:00", - "2024-07-22T00:00:00", - "2024-07-23T00:00:00", - "2024-07-24T00:00:00", - "2024-07-25T00:00:00", - "2024-07-26T00:00:00", - "2024-07-29T00:00:00", - "2024-07-30T00:00:00", - "2024-07-31T00:00:00", - "2024-08-01T00:00:00", - "2024-08-02T00:00:00", - "2024-08-05T00:00:00", - "2024-08-06T00:00:00", - "2024-08-07T00:00:00", - "2024-08-08T00:00:00", - "2024-08-09T00:00:00", - "2024-08-12T00:00:00", - "2024-08-13T00:00:00", - "2024-08-14T00:00:00", - "2024-08-15T00:00:00", - "2024-08-16T00:00:00", - "2024-08-19T00:00:00", - "2024-08-20T00:00:00", - "2024-08-21T00:00:00", - "2024-08-22T00:00:00", - "2024-08-23T00:00:00", - "2024-08-26T00:00:00", - "2024-08-27T00:00:00", - "2024-08-28T00:00:00", - "2024-08-29T00:00:00", - "2024-08-30T00:00:00", - "2024-09-03T00:00:00", - "2024-09-04T00:00:00", - "2024-09-05T00:00:00", - "2024-09-06T00:00:00", - "2024-09-09T00:00:00", - "2024-09-10T00:00:00", - "2024-09-11T00:00:00", - "2024-09-12T00:00:00", - "2024-09-13T00:00:00", - "2024-09-16T00:00:00", - "2024-09-17T00:00:00", - "2024-09-18T00:00:00", - "2024-09-19T00:00:00", - "2024-09-20T00:00:00", - "2024-09-23T00:00:00", - "2024-09-24T00:00:00", - "2024-09-25T00:00:00", - "2024-09-26T00:00:00", - "2024-09-27T00:00:00", - "2024-09-30T00:00:00", - "2024-10-01T00:00:00", - "2024-10-02T00:00:00", - "2024-10-03T00:00:00", - "2024-10-04T00:00:00", - "2024-10-07T00:00:00", - "2024-10-08T00:00:00", - "2024-10-09T00:00:00", - "2024-10-10T00:00:00", - "2024-10-11T00:00:00", - "2024-10-14T00:00:00", - "2024-10-15T00:00:00", - "2024-10-16T00:00:00", - "2024-10-17T00:00:00", - "2024-10-18T00:00:00", - "2024-10-21T00:00:00", - "2024-10-22T00:00:00", - "2024-10-23T00:00:00", - "2024-10-24T00:00:00", - "2024-10-25T00:00:00", - "2024-10-28T00:00:00", - "2024-10-29T00:00:00", - "2024-10-30T00:00:00", - "2024-10-31T00:00:00", - "2024-11-01T00:00:00", - "2024-11-04T00:00:00", - "2024-11-05T00:00:00", - "2024-11-06T00:00:00", - "2024-11-07T00:00:00", - "2024-11-08T00:00:00", - "2024-11-11T00:00:00", - "2024-11-12T00:00:00", - "2024-11-13T00:00:00", - "2024-11-14T00:00:00", - "2024-11-15T00:00:00", - "2024-11-18T00:00:00", - "2024-11-19T00:00:00", - "2024-11-20T00:00:00", - "2024-11-21T00:00:00", - "2024-11-22T00:00:00", - "2024-11-25T00:00:00", - "2024-11-26T00:00:00", - "2024-11-27T00:00:00", - "2024-11-28T00:00:00", - "2024-11-29T00:00:00", - "2024-12-02T00:00:00", - "2024-12-03T00:00:00", - "2024-12-04T00:00:00", - "2024-12-05T00:00:00", - "2024-12-06T00:00:00", - "2024-12-09T00:00:00", - "2024-12-10T00:00:00", - "2024-12-11T00:00:00", - "2024-12-12T00:00:00", - "2024-12-13T00:00:00", - "2024-12-16T00:00:00", - "2024-12-17T00:00:00", - "2024-12-18T00:00:00", - "2024-12-19T00:00:00", - "2024-12-20T00:00:00", - "2024-12-23T00:00:00", - "2024-12-24T00:00:00", - "2024-12-25T00:00:00", - "2024-12-26T00:00:00", - "2024-12-27T00:00:00", - "2024-12-30T00:00:00", - "2024-12-31T00:00:00", - "2025-01-01T00:00:00", - "2025-01-02T00:00:00", - "2025-01-06T00:00:00", - "2025-01-07T00:00:00", - "2025-01-08T00:00:00", - "2025-01-09T00:00:00", - "2025-01-10T00:00:00", - "2025-01-13T00:00:00", - "2025-01-14T00:00:00", - "2025-01-15T00:00:00", - "2025-01-16T00:00:00", - "2025-01-17T00:00:00", - "2025-01-21T00:00:00", - "2025-01-22T00:00:00", - "2025-01-23T00:00:00", - "2025-01-24T00:00:00", - "2025-01-27T00:00:00", - "2025-01-28T00:00:00", - "2025-01-29T00:00:00", - "2025-01-30T00:00:00", - "2025-01-31T00:00:00", - "2025-02-03T00:00:00", - "2025-02-04T00:00:00", - "2025-02-05T00:00:00", - "2025-02-06T00:00:00", - "2025-02-07T00:00:00", - "2025-02-10T00:00:00", - "2025-02-11T00:00:00", - "2025-02-12T00:00:00", - "2025-02-13T00:00:00", - "2025-02-14T00:00:00", - "2025-02-18T00:00:00", - "2025-02-19T00:00:00", - "2025-02-20T00:00:00", - "2025-02-21T00:00:00", - "2025-02-24T00:00:00", - "2025-02-25T00:00:00", - "2025-02-26T00:00:00", - "2025-02-27T00:00:00", - "2025-02-28T00:00:00", - "2025-03-03T00:00:00" - ], - "xaxis": "x", - "y": [ - 19630.23159499681, - 19601.825344996807, - 19736.7974047349, - 19915.494906023992, - 19920.361504109977, - 19759.19366864282, - 19712.475826595608, - 19772.82062534328, - 19478.75519075677, - 19169.744604240415, - 19384.71050551084, - 19400.81718441933, - 19361.732095756688, - 19847.608061817562, - 20275.918401918392, - 20717.310788800893, - 20964.93169038349, - 21067.61228156899, - 21232.418306353393, - 21459.030705629088, - 21562.659832637946, - 21763.946071889666, - 22021.609648107114, - 22419.396604770936, - 22741.295747724605, - 22931.336539825134, - 23070.137893576506, - 23107.414857307336, - 23326.525074053672, - 23406.467420777124, - 23483.63420813061, - 23773.15847719028, - 23972.087803249553, - 23844.51380157813, - 23670.84367375772, - 23620.787298354982, - 23498.515926691533, - 23552.875479915052, - 23380.697281800385, - 23173.44818049248, - 22987.812698511734, - 22856.210113653233, - 22566.99433643768, - 22505.386955656744, - 22298.57965066985, - 22326.607319301234, - 22431.184903258047, - 22583.63423901447, - 22695.538900602605, - 22845.90139666562, - 23144.51695715936, - 23091.21702565442, - 23094.761641708643, - 23011.962898195077, - 23045.89734823657, - 23113.957494919385, - 23429.67107945768, - 23756.89271954413, - 24031.953942225726, - 24279.223752015052, - 24601.594863329865, - 24732.699611354972, - 24645.669936932532, - 24536.972800559877, - 24437.28774337668, - 24498.310488518906, - 24372.217058117105, - 24197.47772288239, - 23988.153580968985, - 24159.679258461907, - 24130.32627450609, - 24090.940620295423, - 24182.842333475528, - 24357.321444198755, - 24567.694085781397, - 25112.095030623375, - 25437.40687513424, - 25821.538309649128, - 26134.862758285533, - 26674.33732970068, - 27018.192828949363, - 27371.52488382092, - 27398.902599490488, - 27561.307489542076, - 27734.52324530902, - 27957.691055350173, - 28795.314076099352, - 29513.798647704087, - 30079.0644255496, - 30658.91027163597, - 31149.2348185622, - 30821.709466084387, - 30938.745303084146, - 31261.77317631567, - 31554.794855490523, - 31793.033939288573, - 32126.886560021096, - 32555.327487257484, - 32893.00376399357, - 32893.00376399357, - 33462.30753478994, - 33877.321578739684, - 34361.221390700215, - 34883.14346666895, - 35331.860636865866, - 35671.129547018194, - 36147.22758824789, - 36779.45939809326, - 36418.60758842509, - 36184.500625350134, - 36492.83040087481, - 36613.90284083083, - 36690.73696079657, - 36678.83016521431, - 36968.68043531711, - 37082.13395450744, - 37471.37558054441, - 37738.89684523979, - 37944.52449555839, - 37831.670953287256, - 36946.44642306057, - 36730.60512177321, - 35966.32958476529, - 35101.89305598136, - 34110.59253451618, - 33154.469906709935, - 32270.48564063842, - 31807.608989249475, - 31946.927149280295, - 32358.50794041538, - 33210.40411129823, - 33673.87891087378, - 34296.13708832142, - 34919.89344855848, - 36038.703950965086, - 36962.667675059114, - 37784.41723824336, - 38672.11371719035, - 39434.099867482444, - 39919.75576215408, - 40484.710346898675, - 40422.23057947782, - 40475.20446454555, - 40335.51748626489, - 40095.0693491005, - 40328.60968686153, - 40265.80772734233, - 40691.40620327185, - 41349.88182714789, - 41867.989600766276, - 42256.51786913613, - 41566.484300090466, - 41094.235968610505, - 41326.09971835756, - 41480.25238290151, - 41655.20340864658, - 41048.19888570928, - 40308.306478980274, - 39620.279051524376, - 39559.222659377934, - 39693.682633475655, - 39693.29256119551, - 39525.698453217956, - 39447.141776985525, - 39494.59769547141, - 39930.92424070652, - 40581.5655173627, - 41059.46669902493, - 41080.61206253999, - 41038.28067860727, - 41188.57849110403, - 40923.54912864859, - 41467.30406896103, - 41898.267054014745, - 42212.90493127875, - 42777.62328026186, - 43911.84866280428, - 45270.135071448385, - 45931.024500393796, - 46336.1607229069, - 46426.488895972645, - 45271.68676424749, - 43419.17399512792, - 42504.441841368265, - 42176.75617616205, - 41846.77843655722, - 41554.90686130902, - 41267.34231383988, - 41213.014332475, - 41428.64812474676, - 42093.25218540257, - 42762.656613545965, - 43280.08227987972, - 44078.63557591708, - 44736.21095880104, - 45644.10292326635, - 46615.241117850484, - 47852.9617673845, - 48725.5505851543, - 49263.24000847603, - 49351.84208885306, - 49423.80771413651, - 49254.70796978983, - 49644.74813052718, - 49177.44603332291, - 49168.65551327514, - 49789.70733101576, - 50638.30318925846, - 51440.544412336116, - 51984.509808063194, - 52437.03662672372, - 53121.22415234857, - 53581.65707430181, - 54288.678763279626, - 54580.83322956335, - 54584.17638320093, - 54823.99883603016, - 54969.99104220949, - 55230.469080238916, - 54744.174220928464, - 54944.278219242566, - 54655.47021793131, - 54753.82009489895, - 55105.36035301702, - 55370.002775997746, - 55946.99835000711, - 56044.76073282974, - 55700.360412521375, - 54413.7157189482, - 54309.65873505796, - 53276.39219203221, - 52333.96265856774, - 50685.40635476204, - 49443.751451802054, - 48996.353193944284, - 48723.57199032275, - 48586.964387506, - 48166.269585315196, - 47646.84029472235, - 47566.0682225326, - 47591.57883305168, - 48419.19819678875, - 48836.106000897795, - 48968.700959649264, - 49172.71926090041, - 49108.30899048376, - 48917.54544682637, - 48625.17380175951, - 48798.77363337416, - 48610.23502581484, - 48463.593886602044, - 48984.36134778962, - 49312.88888208293, - 49865.632519866616, - 50806.65534925394, - 51697.90156060105, - 52796.64861387103, - 53907.35231808833, - 55878.70521009774, - 57403.10199445445, - 58162.6328267319, - 59679.490140725466, - 58660.37916272047, - 59416.38173538325, - 60904.383736343174, - 62176.16307042313, - 64646.99144137421, - 66253.19128544728, - 68026.1244975041, - 69764.1836624372, - 70667.4519018296, - 71611.3271991348, - 71211.34131926106, - 71188.4634126926, - 70772.78059647269, - 70195.07173941277, - 69648.40929503282, - 68375.38156324472, - 68044.67884883039, - 68063.57673761924, - 68322.71954001057, - 69392.5639418705, - 70784.10958776154, - 72175.84509012125, - 73288.86159195658, - 73980.65220449519, - 74692.60045869187, - 75551.89354528929, - 76431.61039042061, - 77073.32349218942, - 77282.43368245405, - 76311.18605265986, - 76394.66011837548, - 76990.69550282099, - 78600.38969072304, - 79231.87440611578, - 79082.47362919901, - 79777.9396915971, - 79762.74662901786, - 80064.54548971303, - 80717.56473310117, - 80465.80192240304, - 80166.09751408228, - 79080.88297427725, - 78825.68152822283, - 79341.63595906939, - 78122.7041190833, - 73759.09046576076, - 74520.1687353988, - 74859.90186655447, - 71960.80541300887, - 73459.28594914007, - 70136.99303279766, - 68613.54298675359, - 67816.9707287193, - 67426.8589724704, - 65695.10538427682, - 64509.852593459575, - 65087.433756157276, - 65749.99688269994, - 67772.54598112202, - 68798.97305767254, - 69011.19411721181, - 71649.00191096203, - 73361.27125039858, - 74062.68735236126, - 74361.01098722113, - 73375.26270322324, - 70910.96590804594, - 70002.62395624137, - 69783.44768108982, - 69802.26632742815, - 69796.69670029677, - 70169.58699030569, - 70187.86471024758, - 69204.30293686905, - 69709.08584370404, - 71205.58366013128, - 72373.41529513022, - 73661.24407691129, - 75057.88868496324, - 74959.33268657317, - 75169.56159702127, - 74855.22720466854, - 74765.18934394974, - 74656.20162874986, - 74319.17989264532, - 74490.94076456402, - 74442.86588716746, - 75796.48112761592, - 77121.5134517293, - 78364.23002914678, - 79328.55502345019, - 79863.58557457506, - 80515.83155878328, - 81064.80065761191, - 82389.06748420688, - 84019.60493522268, - 85776.88589256212, - 87432.71313943213, - 88195.09770766235, - 88478.83001554079, - 88772.90653145227, - 89590.50214449078, - 90923.9779609982, - 92930.58012251784, - 93960.71513703311, - 94992.50959196479, - 96258.29233021161, - 98088.54864123103, - 98967.04206627586, - 99187.53695242183, - 96435.0301952345, - 95672.73701188878, - 94313.73120261989, - 94093.39335096629, - 94039.79724412462, - 93885.88916102555, - 92834.51620750406, - 92959.55946587621, - 94096.81533349902, - 95933.01434165008, - 96857.28023687868, - 97919.81799539815, - 98949.56958535773, - 99017.35945752342, - 99616.10737369744, - 98402.35575294388, - 96979.43782569113, - 95026.05721560564, - 93121.20562998361, - 91609.65439672202, - 90101.02647161635, - 89787.64919653417, - 88560.25310946985, - 87097.37805998315, - 83779.69466848914, - 81062.05203066044, - 79404.99664568258, - 78836.73134625534, - 78319.74722447862, - 78972.65171694475, - 79611.02187775173, - 80096.97644726827, - 80640.77717320272, - 81146.51107115173, - 81278.53246612182, - 81284.5491066541, - 79872.54348002114, - 78539.92151516551, - 76594.38202071948, - 75655.12363132108, - 75433.47821734457, - 75460.83352570017, - 75687.10987664343, - 76283.65814959929, - 76803.75125078717, - 77584.06878097744, - 78922.09352668098, - 79800.55721778375, - 80721.02897753034, - 80721.02897753034, - 81076.95145733326, - 80301.55783051327, - 79714.58500965331, - 79000.82837120669, - 78896.79543019264, - 79131.67468204744, - 79816.58076682338, - 80058.17438831578, - 80743.30276058764, - 79557.41247898409, - 79621.72003773686, - 79337.65617989113, - 79019.49540156667, - 77783.7036850921, - 78203.36091642578, - 78179.20542968529, - 78232.93661440177, - 79204.40493438764, - 79944.8000642148, - 81861.79781099688, - 82832.35820823422, - 83535.01976493176, - 83492.4843801049, - 81626.63258218668, - 79503.85896158362, - 78095.59059000348, - 74953.49296766338, - 71015.41703917662, - 69601.18085634186, - 67229.33049191482, - 66812.1135418049, - 66518.94480283052, - 65833.14689473933, - 65144.75218706427, - 65304.33408109475, - 64609.34222089624, - 63829.79299629738, - 63710.185356345115, - 62597.245607633595, - 61670.16236818604, - 60492.48229672276, - 59793.17557447354, - 59142.04812383527, - 58320.615662227734, - 57821.168192088524, - 57498.820159758034, - 57341.43835683431, - 57236.808065671416, - 57070.984505878056, - 56546.2685317955, - 56299.26721862017, - 56163.266197261575, - 55725.70222084254, - 55633.15246140552, - 55500.61375962116, - 55337.528102677774, - 55194.01703616627, - 54821.86667986607, - 54761.305291632576, - 54760.86865633986, - 54608.30682888997, - 54600.75874087338, - 54599.33245019382, - 54646.00089077639, - 54687.85412234061, - 54673.73996911278, - 54690.5400721578, - 54714.7179300817, - 54743.52293068918, - 54795.92682005055, - 54887.796511776054, - 54859.250716451446, - 54742.60398675453, - 54592.989863656934, - 54497.73443458102, - 54338.757989744205, - 54193.77631042668, - 54101.45722651305, - 54104.986827913555, - 53975.82995425458, - 53884.707941408706, - 53823.168598084136, - 53775.304664387244, - 53708.10034559804, - 53650.05254209533, - 53571.57091714877, - 53521.64076441256, - 53538.36175672884, - 53518.0336396415, - 53513.333993018015, - 53520.78982342197, - 53571.03324706949, - 53632.33368768424, - 54146.67847482904, - 54102.27997594166, - 54056.63669902925, - 54065.580816986265, - 54361.42624206394, - 54281.68868544056, - 54401.89280806682, - 54693.16268122057, - 55010.817027006815, - 55091.21485150723, - 55264.857603896446, - 55284.26934004977, - 55466.03402372457, - 55608.00882125016, - 55675.100330436726, - 55728.39372647072, - 55767.75791209131, - 55908.37450090732, - 56078.85406998643, - 56162.56040149242, - 56278.77643710818, - 56468.05557592044, - 56616.38379499665, - 56889.52796538925, - 57113.08454236127, - 57284.85637632909, - 57391.79002497073, - 57382.182862803114, - 57273.59951445053, - 57143.59024350962, - 56952.4719216667, - 56571.04656023331, - 56113.826834674015, - 55740.98927035012, - 55449.33660650422, - 55142.82897906852, - 55014.43415772965, - 54984.460407799415, - 55409.272447147196, - 55558.79292219547, - 55115.13451029494, - 54957.40018992787, - 54717.38460742014, - 54667.92804324747, - 54575.239604446506, - 54577.25970760131, - 54562.43089894394, - 54904.7862699882, - 54961.062669689294, - 55004.94342696416, - 55081.85068262238, - 54983.88488697369, - 54793.80037924693, - 54692.930790692095, - 54442.0966524879, - 54273.11454499575, - 54039.46179472408, - 54077.17632229054, - 53998.176510397796, - 54103.82750226989, - 54185.19186484984, - 54263.53472462068, - 54670.579171109115, - 55009.94707393344, - 55486.47023925251, - 55707.09936783401, - 55821.58869006407, - 55791.63594068745, - 56072.672691172294, - 56144.14571932718, - 56544.737891840436, - 56677.61526143215, - 56929.96432667014, - 56583.01359963303, - 56035.27414527083, - 55621.476791878005, - 54597.74551701691, - 53693.510081013854, - 53360.76913360479, - 53303.07161227752, - 53255.41798457853, - 52899.465163034874, - 52769.279635167586, - 52752.46866904858, - 52565.50458428936, - 52375.64362947663, - 53000.7517757334, - 52516.05092827818, - 52295.72804692412, - 51859.6991392043, - 51518.34332208888, - 51442.73324211022, - 51465.84325449111, - 51524.3732641207, - 51774.34104938815, - 51610.42710459617, - 51934.605147535745, - 52065.9815625802, - 52353.71877428145, - 51972.325603639816, - 52291.692061615075, - 52719.81688015416, - 53007.80052679123, - 53378.45447417562, - 53682.85198880792, - 53820.16116685526, - 53535.8460831143, - 53611.378795760225, - 53666.793127818164, - 53800.44871941878, - 53937.42228339608, - 54205.068388711756, - 54303.97136990926, - 54379.792704785636, - 54706.54263191171, - 54999.64769361575, - 55371.50718605223, - 56187.39790239172, - 56790.86845954466, - 56690.8194613172, - 56778.00357380696, - 57193.1345863468, - 57131.569818322234, - 57488.68610985869, - 57311.443225498144, - 57879.69875988439, - 57836.11973107369, - 57890.00270866537, - 58373.75613568113, - 58372.231023360044, - 57261.04482488809, - 57921.23333718768, - 57083.00130493137, - 56368.32271589168, - 54461.01714663859, - 53209.112814997294, - 51650.9650014985, - 51410.936277016306, - 51024.130241354134, - 50446.05888028355, - 49909.225599450874, - 50089.466381025464, - 49426.32032225014, - 49381.095609869335, - 50400.92083357315, - 50394.67378534279, - 50134.25941449695, - 50373.07512252863, - 50716.04289544215, - 50902.24005215268, - 50445.39339626086, - 50582.8459972339, - 50471.503962132636, - 50639.28543487708, - 50587.55991367832, - 50249.551174968175, - 50432.21104486028, - 50593.72427699859, - 50799.34567977283, - 50968.71788193057, - 50805.45181694215, - 51509.57821084004, - 51157.78762831618, - 51055.18294642974, - 49746.49041607362, - 49054.17400357441, - 48911.261238297244, - 48663.440198637225, - 47923.178836479165, - 47584.642221467344, - 47306.533157283346, - 47456.55944069579, - 46491.02432779436, - 47556.49701775991, - 46833.08688773311, - 46258.87900882338, - 45961.3839918936, - 45829.711532989975, - 46058.966287176045, - 46159.39668022283, - 46746.28924044572, - 46801.87234284131, - 46866.10823157073, - 46788.84725613806, - 46885.97760857932, - 47541.523438255856, - 47745.28130578205, - 48099.31520274687, - 48119.11934483061, - 48324.5225664513, - 48597.61396104517, - 48740.57393461818, - 48859.54280295275, - 49012.6297005463, - 49580.03062089683, - 49486.898003391696, - 49732.79485644326, - 49929.923147390575, - 49867.57848479405, - 50508.754858330096, - 51504.395267321685, - 51637.671140981816, - 52071.21904271747, - 52580.146629744646, - 52440.97919743245, - 52569.848972300744, - 53069.969908309424, - 52396.82346126294, - 51812.48733578234, - 52348.225904852974, - 52878.35590301903, - 53258.34590159263, - 53160.52341590723, - 53059.88370481859, - 53471.60837397187, - 54383.187247256195, - 54365.52648848829, - 54365.52648848829, - 53953.679231668815, - 52846.35358747588, - 52536.65586421472, - 52109.44652390048, - 52625.61703698941, - 52889.749658280794, - 52848.89639128523, - 52801.12162806645, - 54600.74125667407, - 54795.42771761801, - 54525.63038831309, - 54838.56579885371, - 54543.763146953825, - 55419.58330658724, - 56297.47068729193, - 57527.60531672891, - 58125.598917402116, - 59251.70505125904, - 60091.232044258875, - 60201.191733411186, - 60318.60482497409, - 60197.69595860264, - 60103.65572920263, - 61062.41998243169, - 61664.55840740245, - 61850.110515713044, - 62159.42882217684, - 62772.77168466756, - 63324.235264201896, - 64681.929159395266, - 65308.37925839411, - 65478.84044650433, - 65903.37391244786, - 66582.57901036108, - 67800.79295557737, - 68031.74770082459, - 68341.93472490576, - 68215.41352141334, - 67012.1867843074, - 67528.01043322499, - 66832.873271272, - 67090.02955168513, - 66830.45898636314, - 66472.79299111271, - 67009.77707970171, - 68011.37960464283, - 68171.55672277843, - 69457.2500368839, - 72447.78928118813, - 74982.09758231365, - 74354.10807063724, - 76530.67178377781, - 80536.20729567243, - 82725.51269381268, - 85072.19467014399, - 88942.94731840167, - 89425.75493371318, - 86476.33771548285, - 84341.23543463706, - 83582.82254953479, - 79125.8347500108, - 79886.6220170477, - 80118.41640384553, - 76584.81203802161, - 77974.73615643007, - 78333.5660263033, - 81496.54481398249, - 79049.50541539364, - 79028.47477204674, - 78673.22871611029, - 73014.9262281597, - 78064.39416810307, - 69081.2025658368, - 66542.00126663918, - 64670.52695294983, - 62895.49980970449, - 64374.493607685305, - 63335.83177170181, - 70013.92859827734, - 71623.85799332615, - 79267.13641169747, - 80910.79740376405, - 86777.53373092694, - 89484.43976316476, - 88404.81112157195, - 90609.54440033312, - 90101.00361714735, - 92409.3607857806, - 93823.08302805095, - 95274.31143870566, - 98352.48909143712, - 100013.849488006, - 102268.79646311513, - 100720.52650428606, - 105575.75279517197, - 108907.3855517878, - 112459.2110291557, - 114532.9490375591, - 114059.74526631727, - 115128.58123105935, - 119238.78698141428, - 122561.51071090848, - 121222.56889450211, - 120873.94748174156, - 121850.01971626113, - 119641.96478755414, - 119217.3665096709, - 117172.67896020622, - 118516.25531062255, - 119793.14216538097, - 121479.05416352641, - 123622.54524438745, - 122975.8160850571, - 121623.17682362511, - 122082.23517584469, - 123909.28056090439, - 131049.20474928418, - 133718.0346735795, - 138032.1246146981, - 139070.49782349824, - 139313.12143034278, - 139069.050902333, - 135741.4404916587, - 134817.74350557875, - 134575.42362751657, - 133870.44601810316, - 136361.57454411505, - 136366.89673101317, - 133522.26019775463, - 134796.43178299803, - 135658.00968263173, - 137945.90360456918, - 140977.56594200875, - 139248.3570763144, - 138071.1473646414, - 141882.20647778458, - 144988.03023245157, - 148461.44870830356, - 151173.92579446518, - 158388.07463925765, - 164460.74596298506, - 166751.95366716004, - 166375.67077040722, - 169842.45073959956, - 168218.2796045269, - 168870.03538835928, - 171401.3439606419, - 173380.6950724173, - 177268.52371490927, - 179877.9459924031, - 180579.16331934268, - 186123.4434625179, - 193820.58088377854, - 202537.32680184027, - 203629.24029366602, - 207138.5063428638, - 207940.71327001773, - 208735.1653543383, - 207496.7391976988, - 212040.96329809024, - 211664.80426506142, - 212856.6805727056, - 209988.02881198446, - 209827.63299809027, - 209761.40341801805, - 210858.11374462856, - 211967.99955421453, - 214910.9888380504, - 218418.86939214493, - 223937.77648977414, - 230785.02984439814, - 234951.04135531042, - 238754.60586379768, - 237876.82270373226, - 239255.213579237, - 235274.4750898591, - 238515.5673758984, - 241079.75026504011, - 242218.0036232614, - 248327.7296099167, - 254154.73871064858, - 257463.52356677337, - 258733.66208020225, - 263316.54759064695, - 267925.4312098991, - 268364.5629137619, - 276122.77646121074, - 278459.9395241825, - 279879.3996842718, - 284964.56658731046, - 281902.6909636869, - 293884.20875307225, - 305185.38925592764, - 294770.19631370425, - 287401.1573586413, - 283072.4603935924, - 273811.25164299883, - 265261.9781703149, - 259996.98769156076, - 258934.77287475218, - 252085.8280172342, - 249614.98201694246, - 238590.43512782667, - 234945.23199184777, - 236760.07399719735, - 230482.72889024703, - 229180.9049181746, - 233146.7084954516, - 236616.22238888938, - 240264.73319489651, - 244936.35271068005, - 260218.16788962256, - 260956.80191768912, - 264744.07282840763, - 269178.0613145219, - 276152.2745814997, - 282787.77378914884, - 285886.49539509835, - 298252.72331083665, - 304202.5672452997, - 306825.2236387712, - 308287.8452781379, - 311237.6621087565, - 305260.2974214597, - 302800.12488689576, - 295257.2129155681, - 284366.059160091, - 279942.9395724977, - 271621.6243377029, - 271125.04582175135, - 267647.15142045566, - 265719.9002194481, - 255994.81595199762, - 242893.0837439807, - 241027.18091552306, - 239350.25649338934, - 252711.75972061857, - 268211.81778624124, - 267918.3073928368, - 258980.79930907782, - 256073.84857726522, - 254584.55356363326, - 252376.21299747506, - 251369.7258904631, - 248362.30178090872, - 241800.41636236652, - 229582.28325905572, - 231571.84640092513, - 227939.28440015687, - 224097.7103741047, - 228320.03912334365, - 229322.07259497393, - 233424.2097395751, - 236780.91845803004, - 240261.6919057173, - 242189.51569836287, - 244452.2675370872, - 243319.407856095, - 243988.8503264344, - 245822.3055811428, - 242409.43744591606, - 234847.76222962854, - 239487.0148391827, - 238019.76686883587, - 239391.75477595875, - 241928.85648149883, - 237218.87089312432, - 241704.9932132775, - 243683.64390672982, - 238271.4833349707, - 237811.35844582468, - 237231.37242093345, - 236551.3224180986, - 242114.06130478272, - 250741.92529773308, - 257452.4861811389, - 249574.13333866294, - 243048.0260650517, - 240206.60929668744, - 239618.84069907086, - 237200.57623425807, - 236359.7038727369, - 236317.91425822044, - 235298.74455804087, - 234761.61256901242, - 234022.7321331014, - 234280.26957183713, - 235413.90980196506, - 239761.18553650906, - 241723.8444411543, - 237691.46803365604, - 234436.8419389353, - 236783.79942081904, - 235382.54412895083, - 235098.7900130536, - 237405.8701451335, - 239573.5991367513, - 238839.61057467587, - 239711.50835972847, - 239831.87330365833, - 239951.6015933814, - 239227.5013742773, - 237964.8678705296, - 238195.0418120593, - 237739.62154436007, - 236377.07244726046, - 234956.2009272944, - 233289.29190807158, - 229532.25155978705, - 225411.22017778805, - 228255.9735473443, - 221889.11505699906, - 215289.3362311752, - 213091.73047775653, - 210168.03711398636, - 203586.83116438743, - 197372.55987025495, - 192143.12664148523, - 184942.6642759924, - 180712.0155539773, - 177610.95543685448, - 176084.01979020334, - 174939.2278822786, - 171774.4856233873, - 170364.4335977898, - 168417.20080196176, - 165371.01973853994, - 163672.87891143406, - 162472.09570043444, - 159818.15320299024, - 156303.18720042615, - 153252.6580873208, - 150090.46126422862, - 145956.1709960301, - 145383.94523187567, - 146308.72079954407, - 157316.87957439732, - 156704.33639928306, - 155478.70500345036, - 155383.26578235044, - 155969.59083260605, - 154348.8288786547, - 157068.2362478036, - 164337.33415442295, - 165191.69733054098, - 167235.13633372582, - 168496.38799763905, - 170185.37000311396, - 175457.82407330704, - 170513.9864795047, - 170186.7794621029, - 170207.72955967922, - 174844.8757454169, - 173438.5908566272, - 174370.70260979084, - 173901.84488689693, - 174120.62221353504, - 173183.7823564758, - 171054.12913431862, - 166747.17662819638, - 164260.54690121234, - 164422.58011673435, - 161224.90295309332, - 158334.82071470591, - 154904.42341818238, - 148989.28203516486, - 147493.8647488001, - 147214.57907534865, - 145596.69259577405, - 145350.00311166048, - 146711.91921196145, - 148750.9650677511, - 150504.13111148556, - 152104.14109010383, - 153648.03774014028, - 153542.1795790575, - 154741.8454537709, - 154977.36335632575, - 155790.89957168308, - 156604.98329473878, - 158667.38174600434, - 160377.13609698866, - 161121.72281442094, - 162155.4013724238, - 162920.2733207029, - 164370.7196715112, - 164623.6800811823, - 165975.64928870424, - 166459.75077201007, - 167009.0519256924, - 168373.73060077862, - 169161.3745019775, - 170792.09853705447, - 172165.43945322547, - 173245.11756429775, - 174480.97831735393, - 176449.98112528658, - 177577.53886478976, - 178379.52821773666, - 179586.9431709777, - 176972.14225043464, - 174928.50205784044, - 178091.2263524894, - 177531.67858166085, - 178635.91920434975, - 177737.55079977444, - 178508.65638073717, - 179117.8496103748, - 179686.66656675967, - 182142.47975505897, - 179147.22106013223, - 175435.8811418064, - 164325.5784850231, - 165224.49062962877, - 166784.14156472505, - 163644.61225342803, - 166352.73390019697, - 168065.98406990615, - 169231.8453130133, - 170423.6262798744, - 167754.45592076637, - 169040.89816616103, - 174823.20154007876, - 172775.77514579275, - 193727.22128357034, - 188162.79050184175, - 177543.78878271955, - 180888.58644657806, - 181632.31796291244, - 175918.70408200525, - 175594.04352434943, - 169015.9742017282, - 184481.3647285784, - 179562.38158243033, - 195035.7809341775, - 181004.5359855364, - 188464.5504561251, - 190092.4568372956, - 191358.6062448727, - 191843.27967522142, - 191740.80345438153, - 194367.90209823337, - 200653.88262758908, - 196699.1401222581, - 191537.45780467495, - 189902.75850226614, - 192174.7082512157, - 204533.4737322472, - 210899.73139869093, - 228615.48168013155, - 221359.39856569644, - 217398.55614335803, - 213284.56759265036, - 210483.13205321107, - 201552.57107809163, - 193435.46809744314, - 190868.83244582766, - 190677.56130990625, - 191382.68375974515, - 192167.2234429532, - 191829.64319655942, - 188831.5252271421, - 185164.65569537305, - 182230.979392886, - 180244.0965611786, - 174267.07658096173, - 172934.94992968193, - 172186.0736453532, - 172867.75779388237, - 173460.7343538495, - 172970.2716782684, - 171577.68959726082, - 171294.30176726208, - 173164.17014461439, - 178485.17888255508, - 184048.5728042249, - 188248.43474330148, - 192063.32736258325, - 200523.65985716676, - 203427.80735295388, - 208679.92207189943, - 216096.17411957963, - 224139.32934541488, - 229207.8945210645, - 227043.9784399657, - 240693.15482133327, - 256573.8080421685, - 271129.78266482946, - 279074.42959356576, - 298044.154982583, - 311525.5267998038, - 325896.59376875317, - 326676.3125223806, - 331725.5382196464, - 339198.8248730752, - 343119.5309859306, - 346351.1912959293, - 349070.5553733242, - 351455.6163224092, - 347076.42364353593, - 367621.4960044125, - 382019.3610049195, - 406720.65870163904, - 425566.8051656702, - 425605.4746376946, - 423345.9582618989, - 423305.3021966971, - 425498.6808126512, - 440200.1975139488, - 426372.67002806335, - 407413.48198348575, - 401004.18170593656, - 420810.281490065, - 413225.58132216486, - 397417.48119157576, - 388439.35630290455, - 381213.59250060475, - 392708.5539877049, - 391007.402987713, - 368938.17443216377, - 365444.8855556255, - 366828.43865165126, - 372246.75772633805, - 377461.5397001678, - 391613.5923464798, - 397466.8555158335, - 398137.72686977533, - 397040.07125617453, - 391649.6724455961, - 400596.6580968688, - 396087.2044856379, - 404627.62945468054, - 404376.74346397666, - 409039.8864436741, - 411748.5241681801, - 415049.13128724037, - 405169.6034909539, - 403836.08187162003, - 404409.4539454714, - 399846.0766695781, - 396347.2276772166, - 396932.4562387132, - 386189.9673420994, - 374067.93843728217, - 374426.3604002019, - 370738.15740861534, - 371506.22174849245, - 369151.74975882063, - 374072.1604335203, - 375446.3690902023, - 372449.64248984394, - 374109.4106895652, - 377550.3415115707, - 377156.6210397972, - 382625.94956175116, - 383804.87174549303, - 364045.7001106256, - 351777.4555057288, - 364139.37636858673, - 375131.42592858744, - 367573.5755863657, - 360474.6919868599, - 359155.0047427999, - 352683.20939213334, - 329783.4796749482, - 332243.23823341005, - 336551.9393344359, - 338814.2624130116, - 340138.291474126, - 343726.98074388166, - 342979.2946203583, - 342343.3165242846, - 343100.8891162272, - 343907.8900210715, - 341758.89072483924, - 339924.1134944364, - 336700.39787078975, - 336168.8138332107, - 335537.5818039825, - 335972.1791145828, - 332274.4896264569, - 325441.28669124795, - 322521.9248596861, - 324612.17493821017, - 330667.3694437287, - 344556.5359704746, - 384210.3321579436, - 407890.5069704194, - 408328.1136023557, - 403929.5854271951, - 374680.42648233974, - 373920.9609847053, - 365208.70801270456, - 364541.09613897064, - 374031.8424593999, - 396612.4229308448, - 368799.65437574935, - 367386.2091040716, - 365791.5563688441, - 362300.88345927105, - 359985.9156407142, - 358795.38511517004, - 358267.750261969, - 355957.36759836815, - 353793.7366377897, - 352395.9125573398, - 349443.7160503232, - 347119.2298781992, - 346610.0802795099, - 345759.0750360848, - 344887.1820689765, - 344244.0430945589, - 343253.8238922341, - 342308.6534015371, - 341433.5207976616, - 340616.7875859616, - 339695.33520011837, - 338834.2055666848, - 338381.10474068084, - 337534.88915204356, - 336476.2293518837, - 334831.71617398155, - 333411.53925783554, - 334788.6238786108, - 334335.10940966726, - 333101.26482271124, - 334804.3856995232, - 336724.035270377, - 338541.4990288, - 339758.4152853512, - 340198.79459600215, - 339904.0896153974, - 338835.43018603814, - 337964.2506298698, - 337503.33319729444, - 332553.1751941803, - 330944.1634139804, - 329831.04314049147, - 328282.50515000016, - 327134.80575046834, - 325979.9284397214, - 324885.02386469604, - 324339.60151997145, - 323499.54212885693, - 322109.4678582751, - 320585.676104125, - 320248.28251756367, - 319380.30972801603, - 318523.5531139234, - 316585.52019185136, - 314896.4945857953, - 314550.4133288123, - 313828.21891331894, - 315323.1788123796, - 315963.1476227601, - 316269.2344752783, - 314901.74647168134, - 314311.4780244393, - 313450.7136765843, - 312643.44741885643, - 313348.9069961793, - 312836.14863932756, - 312658.4476951095, - 313985.7914051622, - 313787.6142907587, - 314881.80986844486, - 314978.73997480975, - 315175.24116864905, - 315438.07543052407, - 315873.6131897602, - 318384.0314469439, - 317433.24564697564, - 317182.078913667, - 317263.3936766492, - 316069.0829367464, - 314467.9523612664, - 315405.6285803375, - 316734.3767507262, - 318883.9586610284, - 318593.0779245969, - 319377.94846292795, - 318867.2922149632, - 319576.2262443239, - 318740.9527116045, - 319784.6288528227, - 320596.37696265907, - 320489.8254925318, - 320112.46286652697, - 320372.2919351898, - 320363.2700997054, - 320989.58644988417, - 321559.4991666899, - 321118.32016864984, - 322127.4031701743, - 322364.46772691555, - 321688.0096553695, - 320787.4311552782, - 319238.2904416685, - 314590.0698866386, - 335918.67612161546, - 343872.3910105313, - 346583.4915264185, - 354324.02114030736, - 354765.0380117573, - 353601.58886142145, - 362412.7950778269, - 360585.95546836447, - 365447.6949747172, - 364788.3997942077, - 366095.39243158925, - 368160.7200384415, - 361563.4192882154, - 359393.5187047064, - 364579.7071397549, - 369493.1870336814, - 372226.1158400688, - 374938.2876321381, - 373461.0879148588, - 374764.59924586385, - 375057.2191699788, - 372685.367999846, - 358713.4837564095, - 358868.6849004032, - 350830.5206202904, - 341114.8372913139, - 343433.3058132211, - 344838.00355248223, - 350734.3240163519, - 355736.1227150411, - 366996.1883695771, - 364705.017211994, - 360488.77297831833, - 363811.4719076817, - 362694.4599638532, - 360394.2180561896, - 371694.0299057846, - 370665.56134772947, - 375566.19691368664, - 388672.24679832, - 363439.73004192376, - 374737.21700917115, - 429488.5957614745, - 393665.0675419498, - 392272.8789267639, - 400987.84333717497, - 407333.371211939, - 427848.2262256444, - 431095.8912363042, - 433789.50217995234, - 435677.86624723434, - 439606.7040767155, - 442655.4450983305, - 439660.577004031, - 435192.3462640203, - 458112.0556884564, - 448389.05190746224, - 433721.30360440037, - 430046.53971319506, - 409952.27733688883, - 423301.18437753955, - 417546.37874249014, - 413448.19658189616, - 409705.6771236563, - 401716.16198946984, - 394070.1391073247, - 435634.0324212119, - 444292.6161097907, - 469956.4033291737, - 471972.1267220272, - 433749.0226942466, - 427374.1640059728, - 432489.5153205705, - 438901.1055099356, - 441160.12010166416, - 445546.57589523075, - 460729.93040133803, - 458335.9482734739, - 470629.5177295795, - 480232.08814211714, - 475877.42068520194, - 497688.7878409346, - 480839.89503594, - 476813.4220035566, - 477421.72075614735, - 487536.50867482927, - 522024.67705602595, - 550500.4746858458, - 581663.8728423727, - 585421.6743827092, - 613920.5200251936, - 635329.6221915698, - 648858.7482072542, - 659504.0897673932, - 666047.1332030568, - 671893.9388824656, - 732158.7713506364, - 864647.5299369912, - 835353.1028971557, - 850246.3263106169, - 870002.1667433091, - 954734.5343809046, - 1020635.6184362686, - 993354.794923773, - 918888.442088699, - 887408.5009947524, - 860757.4356994608, - 802965.3651337209, - 799370.4213603676, - 795236.7863169013, - 772307.2923942056, - 765222.6860098861, - 777493.3382715947, - 779591.2410511243, - 792446.2765463132, - 799258.3745034294, - 795177.2284700754, - 800560.2579125417, - 810706.6957227673, - 857987.1108217054, - 869885.1363069895, - 866310.184638655, - 847738.0592369377, - 818195.2950356018, - 816843.7381208875, - 712993.0827427763, - 737709.7952264672, - 753095.5716026723, - 714704.0148899674, - 746952.925073103, - 753299.855215542, - 898403.1927167079, - 917028.3913057969, - 902722.7719313952, - 877686.5761212254, - 896070.2575757779, - 911217.2380627828, - 893810.9692168892, - 877743.8712256389, - 867744.4616768885, - 815089.9836876835, - 809705.3896960794, - 802566.2610359427, - 790274.6376397994, - 774140.5972205766, - 761937.4546722926, - 770657.232690293, - 768881.3029014723, - 745226.876090214, - 758567.639076381, - 791718.7880656221, - 801429.1595975361, - 819501.0043797547, - 840072.6609975011, - 853777.2828113035, - 863599.6732126726, - 873732.0879692937, - 868961.9227812805, - 868076.4535532286, - 855802.3206558103, - 850539.6617355966, - 824012.0587945523, - 820008.1291531045, - 823221.4060986445, - 808738.8971074733, - 822163.5779074924, - 803899.4407519518, - 780820.1118531981, - 751962.8560430564, - 728830.6053668597, - 718547.2315473239, - 699355.7185765734, - 694117.3195993229, - 691252.8190645003, - 692009.3186485266, - 703152.7888506496, - 700249.9323411904, - 701673.821722722, - 711022.957908357, - 726761.1749416292, - 735949.5481588037, - 750103.7035405521, - 766064.1577263565, - 777399.8510457013, - 776816.7157390458, - 782844.2771672027, - 773386.2693891029, - 757335.0411172474, - 737087.9746835823, - 709637.4785685089, - 702199.2300138776, - 701100.7978192606, - 656204.23944567, - 646637.6940439882, - 633562.7019453557, - 625742.1525353083, - 619480.1475035418, - 628641.8841978966, - 641803.3954745337, - 664457.8299864037, - 684133.434765526, - 704282.2384826203, - 722774.0858181384, - 738911.4844748772, - 764909.7615750548, - 786458.3398563025, - 810597.170003388, - 826060.5223897744, - 840493.8580577213, - 849728.4485896048, - 868766.3623351894, - 876456.8341161695, - 884109.7823015852, - 890032.7019279029, - 882686.083859483, - 852716.1478309717, - 852158.9544073388, - 852763.3468755647, - 838147.3187952958, - 826450.408066197, - 805811.1441657877, - 797492.9943199317, - 783527.705414489, - 782263.9796774841, - 790788.9052256842, - 791883.1708763528, - 799941.5671542143, - 814728.1022930202, - 828921.3237157225, - 843542.0534259628, - 869557.0654228163, - 888451.108427882, - 892444.110774187, - 902334.7053973587, - 908915.5324040578, - 914021.5157645497, - 922437.2806004881, - 931354.2523873976, - 941999.8854133041, - 946116.4888778982, - 949318.2915725826, - 926105.7361226728, - 898980.910687522, - 880443.6020157383, - 887660.1397154619, - 873584.1134819136, - 871347.7597447094, - 853863.7694051304, - 837185.0083473577, - 824211.0960066732, - 847094.0896688679, - 865170.097116635, - 874413.314824097, - 914487.3456771239, - 929981.4864036347, - 984806.4853031759, - 1006154.8767694499, - 1024900.0573997194, - 1039796.3090010403, - 1051751.171357623, - 1082876.0643016316, - 1077051.2996230496, - 1092667.4435093908, - 1127040.2618037413, - 1180243.0093660126, - 1195939.0352477797, - 1223224.2776002649, - 1233451.6883188651, - 1270251.8966555537, - 1271423.725361868, - 1272320.6306620014, - 1283572.253152653, - 1292586.8484231604, - 1292682.6447446651, - 1269135.4262983801, - 1261600.9230623813, - 1272113.531656604, - 1294790.5605632216, - 1273590.471935037, - 1287822.0696686695, - 1299158.86790594, - 1328933.5998682608, - 1364584.5025056207, - 1395628.0431822436, - 1417966.908152951, - 1429271.522462948, - 1395966.2224818338, - 1297419.8780520784, - 1347510.4990511583, - 1373961.537605998, - 1408596.2342597619, - 1304700.442768246, - 1350990.9382748439, - 1362697.4347799753, - 1389275.2653950774, - 1388252.466984602, - 1398940.845998676, - 1404007.3630096226, - 1413716.3206848036, - 1422314.9544321664, - 1414697.2251245594, - 1410813.4356630873, - 1410682.710526387, - 1409647.1465311763, - 1419307.818979345, - 1403735.0086612536, - 1393323.933969406, - 1368980.875875746, - 1391648.4973584553, - 1374711.0918450067, - 1386670.332001213, - 1365959.18545604, - 1345559.96036535, - 1342837.7852948124, - 1315054.4269066183, - 1301327.370382466, - 1245652.5486414596, - 1220651.4650651214, - 1160721.6222835246, - 1154119.3001200608, - 1147761.605104033, - 1155580.7312026785, - 1168902.2737238463, - 1180571.6956847555, - 1158521.1349876847, - 1160684.5055859874, - 1177745.2903233813, - 1216208.72004794, - 1241485.83205593, - 1239018.5227379927, - 1266310.615490707, - 1274975.5765205962, - 1280168.879543844, - 1294898.656103585, - 1315913.4823167156, - 1334594.0138158181, - 1348825.671648454, - 1354031.2721849477, - 1361264.8726022216, - 1373079.8951489893, - 1416285.3793520308, - 1438080.2003988407, - 1515404.5056574696, - 1559018.4097475167, - 1594438.1129286643, - 1506673.659847335, - 1581137.418561855, - 1643807.5642287058, - 1727940.4553029216, - 1831366.9483606452, - 1864252.5540722073, - 1769983.0251812006, - 1809500.058265973, - 1894229.9728874625, - 1964777.6842597325, - 2025591.4597714979, - 1779150.2851695379, - 1920193.81603468, - 1726871.6067075683, - 1680909.888342037, - 1703923.5518355141, - 1796793.6234415506, - 1874099.7902462452, - 1827578.4755387863, - 1901638.9967764749, - 1960005.5132946782, - 1990190.0261421667, - 2037881.8694679928, - 2068292.7856188947, - 2080899.4652489824, - 2136448.8930769735, - 2170606.8570461893, - 2141840.273466692, - 1873588.4862381923, - 1904560.98506047, - 1917657.9285889084, - 1873445.4564018212, - 1838445.2002563095, - 1783297.6287937646, - 1787969.2982482205, - 1797215.0411572426, - 1770897.6088482116, - 1731992.6235798704, - 1702216.523926716, - 1677973.4132580003, - 1609988.954161431, - 1594991.0155183235, - 1565055.95212924, - 1563843.1250488413, - 1506916.0744688225, - 1501217.4070449518, - 1457180.7474853196, - 1745617.2344944947, - 1677753.3910571863, - 1906655.9572726127, - 1836080.5948318932, - 1816465.868489111, - 1829850.8123989413, - 1843616.3243288093, - 1836842.8964528453, - 1863294.6747715406, - 1885486.1199014592, - 1877527.7994469507, - 1906967.4390934445, - 1925844.5138808645, - 1921860.0203955064, - 1675085.993136147, - 1718725.7856025503, - 1662370.6241875298, - 1580078.594030478, - 1490599.778213148, - 1468803.4770218919, - 1418093.7983175812, - 1437918.1593253398, - 1465693.3289980406, - 1507253.7587164382, - 1580580.875034577, - 1618896.409948685, - 1715665.1593263242, - 1614596.9643978216, - 1631754.479453431, - 1666736.9054890943, - 1665279.401086557, - 1650600.2309956944, - 1509455.9875916902, - 1602943.687166354, - 1677406.152583735, - 1710320.847908365, - 1752890.6208748443, - 1758194.3331821058, - 1751824.4427544207, - 1826521.194643999, - 1926489.3553220232, - 2061353.7901448405, - 2092542.2394514764, - 2115591.7444677483, - 2220565.2483692933, - 2242854.57362605, - 2212630.693270194, - 2183275.4529934176, - 2498963.5994448145, - 2438277.491129234, - 2414562.740217115, - 2433773.4895076896, - 2443275.1834003585, - 2401175.389761322, - 2404088.883597628, - 2428091.0454703113, - 2465728.2824823977, - 2489157.2446029102, - 2337466.437363307, - 2499697.47617695, - 2444703.8396986723, - 2385052.122437789, - 2439226.342345992, - 2648077.4022745937, - 2660366.5599968396, - 2657779.7937808083, - 2644197.8645016747, - 2651872.2155043567, - 2633559.734775248, - 2626084.160874829, - 2593268.4256189484, - 2301310.631531041, - 2378535.3472404457, - 2462747.2150144284, - 2492114.2232830813, - 2504676.815650555, - 2490883.276380813, - 2434387.2829524935, - 2407565.3991749105, - 2386695.9917550078, - 2369269.7859839723, - 2400206.6360876556, - 2474981.963946075, - 2564984.4411692917, - 2612107.050457854, - 2659298.394066244, - 2652164.940355187, - 2501061.4397874754, - 2567570.9393459223, - 2611231.1759557105, - 2598974.4710966568, - 2573603.1450951705, - 2556402.3359829034, - 2384593.4844511403, - 2402742.155481991, - 2389382.835270718, - 2493348.3639952834, - 2572300.899713264, - 2633702.6041710484, - 2641553.9298604354, - 2640312.3008356015, - 2634943.256038508, - 2534299.172199512, - 2456020.440324738, - 2495067.998954189, - 2515041.6794998823, - 2535955.986590976, - 2616367.892106272, - 2678264.3734380216, - 2674172.858918272, - 2674783.792069577, - 2672711.388867554, - 2663130.519710426, - 2674703.746442046, - 2733813.367233307, - 2738661.8500709534, - 2746239.1682963613, - 2770075.8859533984, - 2790936.758808996, - 2865857.3265855694, - 2936294.721908538, - 3035579.4034792287, - 3068461.892830828, - 3105287.335530653, - 3092970.319499979, - 3126981.195920566, - 3140202.778421614, - 3143385.5284982566, - 3165450.1195034734, - 3127554.1347297514, - 3129848.035461302, - 3127963.402696953, - 3168145.9105469044, - 3208908.0833190875, - 3240899.3288085633, - 3229944.6308559338, - 3208892.199114999, - 3146081.1966498275, - 3110009.006127558, - 3070630.9689988564, - 3025871.495676533, - 3017141.3497591703, - 2993306.45849011, - 2933835.358392956 - ], - "yaxis": "y" - }, - { - "hovertemplate": "variable=ZSCORE2_DTE270_ROLL120
datetime=%{x}
value=%{y}", - "legendgroup": "ZSCORE2_DTE270_ROLL120", - "line": { - "color": "#19d3f3", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "ZSCORE2_DTE270_ROLL120", - "showlegend": true, - "type": "scattergl", - "x": [ - "2017-01-05T00:00:00", - "2017-01-06T00:00:00", - "2017-01-09T00:00:00", - "2017-01-10T00:00:00", - "2017-01-11T00:00:00", - "2017-01-12T00:00:00", - "2017-01-13T00:00:00", - "2017-01-17T00:00:00", - "2017-01-18T00:00:00", - "2017-01-19T00:00:00", - "2017-01-20T00:00:00", - "2017-01-23T00:00:00", - "2017-01-24T00:00:00", - "2017-01-25T00:00:00", - "2017-01-26T00:00:00", - "2017-01-27T00:00:00", - "2017-01-30T00:00:00", - "2017-01-31T00:00:00", - "2017-02-01T00:00:00", - "2017-02-02T00:00:00", - "2017-02-03T00:00:00", - "2017-02-06T00:00:00", - "2017-02-07T00:00:00", - "2017-02-08T00:00:00", - "2017-02-09T00:00:00", - "2017-02-10T00:00:00", - "2017-02-13T00:00:00", - "2017-02-14T00:00:00", - "2017-02-15T00:00:00", - "2017-02-16T00:00:00", - "2017-02-17T00:00:00", - "2017-02-21T00:00:00", - "2017-02-22T00:00:00", - "2017-02-23T00:00:00", - "2017-02-24T00:00:00", - "2017-02-27T00:00:00", - "2017-02-28T00:00:00", - "2017-03-01T00:00:00", - "2017-03-02T00:00:00", - "2017-03-03T00:00:00", - "2017-03-06T00:00:00", - "2017-03-07T00:00:00", - "2017-03-08T00:00:00", - "2017-03-09T00:00:00", - "2017-03-10T00:00:00", - "2017-03-13T00:00:00", - "2017-03-14T00:00:00", - "2017-03-15T00:00:00", - "2017-03-16T00:00:00", - "2017-03-17T00:00:00", - "2017-03-20T00:00:00", - "2017-03-21T00:00:00", - "2017-03-22T00:00:00", - "2017-03-23T00:00:00", - "2017-03-24T00:00:00", - "2017-03-27T00:00:00", - "2017-03-28T00:00:00", - "2017-03-29T00:00:00", - "2017-03-30T00:00:00", - "2017-03-31T00:00:00", - "2017-04-03T00:00:00", - "2017-04-04T00:00:00", - "2017-04-05T00:00:00", - "2017-04-06T00:00:00", - "2017-04-07T00:00:00", - "2017-04-10T00:00:00", - "2017-04-11T00:00:00", - "2017-04-12T00:00:00", - "2017-04-13T00:00:00", - "2017-04-17T00:00:00", - "2017-04-18T00:00:00", - "2017-04-19T00:00:00", - "2017-04-20T00:00:00", - "2017-04-21T00:00:00", - "2017-04-24T00:00:00", - "2017-04-25T00:00:00", - "2017-04-26T00:00:00", - "2017-04-27T00:00:00", - "2017-04-28T00:00:00", - "2017-05-01T00:00:00", - "2017-05-02T00:00:00", - "2017-05-03T00:00:00", - "2017-05-04T00:00:00", - "2017-05-05T00:00:00", - "2017-05-08T00:00:00", - "2017-05-09T00:00:00", - "2017-05-10T00:00:00", - "2017-05-11T00:00:00", - "2017-05-12T00:00:00", - "2017-05-15T00:00:00", - "2017-05-16T00:00:00", - "2017-05-17T00:00:00", - "2017-05-18T00:00:00", - "2017-05-19T00:00:00", - "2017-05-22T00:00:00", - "2017-05-23T00:00:00", - "2017-05-24T00:00:00", - "2017-05-25T00:00:00", - "2017-05-26T00:00:00", - "2017-05-29T00:00:00", - "2017-05-30T00:00:00", - "2017-05-31T00:00:00", - "2017-06-01T00:00:00", - "2017-06-02T00:00:00", - "2017-06-05T00:00:00", - "2017-06-06T00:00:00", - "2017-06-07T00:00:00", - "2017-06-08T00:00:00", - "2017-06-09T00:00:00", - "2017-06-12T00:00:00", - "2017-06-13T00:00:00", - "2017-06-14T00:00:00", - "2017-06-15T00:00:00", - "2017-06-16T00:00:00", - "2017-06-19T00:00:00", - "2017-06-20T00:00:00", - "2017-06-21T00:00:00", - "2017-06-22T00:00:00", - "2017-06-23T00:00:00", - "2017-06-26T00:00:00", - "2017-06-27T00:00:00", - "2017-06-28T00:00:00", - "2017-06-29T00:00:00", - "2017-06-30T00:00:00", - "2017-07-03T00:00:00", - "2017-07-05T00:00:00", - "2017-07-06T00:00:00", - "2017-07-07T00:00:00", - "2017-07-10T00:00:00", - "2017-07-11T00:00:00", - "2017-07-12T00:00:00", - "2017-07-13T00:00:00", - "2017-07-14T00:00:00", - "2017-07-17T00:00:00", - "2017-07-18T00:00:00", - "2017-07-19T00:00:00", - "2017-07-20T00:00:00", - "2017-07-21T00:00:00", - "2017-07-24T00:00:00", - "2017-07-25T00:00:00", - "2017-07-26T00:00:00", - "2017-07-27T00:00:00", - "2017-07-28T00:00:00", - "2017-07-31T00:00:00", - "2017-08-01T00:00:00", - "2017-08-02T00:00:00", - "2017-08-03T00:00:00", - "2017-08-04T00:00:00", - "2017-08-07T00:00:00", - "2017-08-08T00:00:00", - "2017-08-09T00:00:00", - "2017-08-10T00:00:00", - "2017-08-11T00:00:00", - "2017-08-14T00:00:00", - "2017-08-15T00:00:00", - "2017-08-16T00:00:00", - "2017-08-17T00:00:00", - "2017-08-18T00:00:00", - "2017-08-21T00:00:00", - "2017-08-22T00:00:00", - "2017-08-23T00:00:00", - "2017-08-24T00:00:00", - "2017-08-25T00:00:00", - "2017-08-28T00:00:00", - "2017-08-29T00:00:00", - "2017-08-30T00:00:00", - "2017-08-31T00:00:00", - "2017-09-01T00:00:00", - "2017-09-05T00:00:00", - "2017-09-06T00:00:00", - "2017-09-07T00:00:00", - "2017-09-08T00:00:00", - "2017-09-11T00:00:00", - "2017-09-12T00:00:00", - "2017-09-13T00:00:00", - "2017-09-14T00:00:00", - "2017-09-15T00:00:00", - "2017-09-18T00:00:00", - "2017-09-19T00:00:00", - "2017-09-20T00:00:00", - "2017-09-21T00:00:00", - "2017-09-22T00:00:00", - "2017-09-25T00:00:00", - "2017-09-26T00:00:00", - "2017-09-27T00:00:00", - "2017-09-28T00:00:00", - "2017-09-29T00:00:00", - "2017-10-02T00:00:00", - "2017-10-03T00:00:00", - "2017-10-04T00:00:00", - "2017-10-05T00:00:00", - "2017-10-06T00:00:00", - "2017-10-09T00:00:00", - "2017-10-10T00:00:00", - "2017-10-11T00:00:00", - "2017-10-12T00:00:00", - "2017-10-13T00:00:00", - "2017-10-16T00:00:00", - "2017-10-17T00:00:00", - "2017-10-18T00:00:00", - "2017-10-19T00:00:00", - "2017-10-20T00:00:00", - "2017-10-23T00:00:00", - "2017-10-24T00:00:00", - "2017-10-25T00:00:00", - "2017-10-26T00:00:00", - "2017-10-27T00:00:00", - "2017-10-30T00:00:00", - "2017-10-31T00:00:00", - "2017-11-01T00:00:00", - "2017-11-02T00:00:00", - "2017-11-03T00:00:00", - "2017-11-06T00:00:00", - "2017-11-07T00:00:00", - "2017-11-08T00:00:00", - "2017-11-09T00:00:00", - "2017-11-10T00:00:00", - "2017-11-13T00:00:00", - "2017-11-14T00:00:00", - "2017-11-15T00:00:00", - "2017-11-16T00:00:00", - "2017-11-17T00:00:00", - "2017-11-20T00:00:00", - "2017-11-21T00:00:00", - "2017-11-22T00:00:00", - "2017-11-24T00:00:00", - "2017-11-27T00:00:00", - "2017-11-28T00:00:00", - "2017-11-29T00:00:00", - "2017-11-30T00:00:00", - "2017-12-01T00:00:00", - "2017-12-04T00:00:00", - "2017-12-05T00:00:00", - "2017-12-06T00:00:00", - "2017-12-07T00:00:00", - "2017-12-08T00:00:00", - "2017-12-11T00:00:00", - "2017-12-12T00:00:00", - "2017-12-13T00:00:00", - "2017-12-14T00:00:00", - "2017-12-15T00:00:00", - "2017-12-18T00:00:00", - "2017-12-19T00:00:00", - "2017-12-20T00:00:00", - "2017-12-21T00:00:00", - "2017-12-22T00:00:00", - "2017-12-26T00:00:00", - "2017-12-27T00:00:00", - "2017-12-28T00:00:00", - "2017-12-29T00:00:00", - "2018-01-01T00:00:00", - "2018-01-02T00:00:00", - "2018-01-04T00:00:00", - "2018-01-05T00:00:00", - "2018-01-08T00:00:00", - "2018-01-09T00:00:00", - "2018-01-10T00:00:00", - "2018-01-11T00:00:00", - "2018-01-12T00:00:00", - "2018-01-15T00:00:00", - "2018-01-16T00:00:00", - "2018-01-17T00:00:00", - "2018-01-18T00:00:00", - "2018-01-19T00:00:00", - "2018-01-22T00:00:00", - "2018-01-23T00:00:00", - "2018-01-24T00:00:00", - "2018-01-25T00:00:00", - "2018-01-26T00:00:00", - "2018-01-29T00:00:00", - "2018-01-30T00:00:00", - "2018-01-31T00:00:00", - "2018-02-01T00:00:00", - "2018-02-02T00:00:00", - "2018-02-05T00:00:00", - "2018-02-06T00:00:00", - "2018-02-07T00:00:00", - "2018-02-08T00:00:00", - "2018-02-09T00:00:00", - "2018-02-12T00:00:00", - "2018-02-13T00:00:00", - "2018-02-14T00:00:00", - "2018-02-15T00:00:00", - "2018-02-16T00:00:00", - "2018-02-20T00:00:00", - "2018-02-21T00:00:00", - "2018-02-22T00:00:00", - "2018-02-23T00:00:00", - "2018-02-26T00:00:00", - "2018-02-27T00:00:00", - "2018-02-28T00:00:00", - "2018-03-01T00:00:00", - "2018-03-02T00:00:00", - "2018-03-05T00:00:00", - "2018-03-06T00:00:00", - "2018-03-07T00:00:00", - "2018-03-08T00:00:00", - "2018-03-09T00:00:00", - "2018-03-12T00:00:00", - "2018-03-13T00:00:00", - "2018-03-14T00:00:00", - "2018-03-15T00:00:00", - "2018-03-16T00:00:00", - "2018-03-19T00:00:00", - "2018-03-20T00:00:00", - "2018-03-21T00:00:00", - "2018-03-22T00:00:00", - "2018-03-23T00:00:00", - "2018-03-26T00:00:00", - "2018-03-27T00:00:00", - "2018-03-28T00:00:00", - "2018-03-29T00:00:00", - "2018-04-02T00:00:00", - "2018-04-03T00:00:00", - "2018-04-04T00:00:00", - "2018-04-05T00:00:00", - "2018-04-06T00:00:00", - "2018-04-09T00:00:00", - "2018-04-10T00:00:00", - "2018-04-11T00:00:00", - "2018-04-12T00:00:00", - "2018-04-13T00:00:00", - "2018-04-16T00:00:00", - "2018-04-17T00:00:00", - "2018-04-18T00:00:00", - "2018-04-19T00:00:00", - "2018-04-20T00:00:00", - "2018-04-23T00:00:00", - "2018-04-24T00:00:00", - "2018-04-25T00:00:00", - "2018-04-26T00:00:00", - "2018-04-27T00:00:00", - "2018-04-30T00:00:00", - "2018-05-01T00:00:00", - "2018-05-02T00:00:00", - "2018-05-03T00:00:00", - "2018-05-04T00:00:00", - "2018-05-07T00:00:00", - "2018-05-08T00:00:00", - "2018-05-09T00:00:00", - "2018-05-10T00:00:00", - "2018-05-11T00:00:00", - "2018-05-14T00:00:00", - "2018-05-15T00:00:00", - "2018-05-16T00:00:00", - "2018-05-17T00:00:00", - "2018-05-18T00:00:00", - "2018-05-21T00:00:00", - "2018-05-22T00:00:00", - "2018-05-23T00:00:00", - "2018-05-24T00:00:00", - "2018-05-25T00:00:00", - "2018-05-28T00:00:00", - "2018-05-29T00:00:00", - "2018-05-30T00:00:00", - "2018-05-31T00:00:00", - "2018-06-01T00:00:00", - "2018-06-04T00:00:00", - "2018-06-05T00:00:00", - "2018-06-06T00:00:00", - "2018-06-07T00:00:00", - "2018-06-08T00:00:00", - "2018-06-11T00:00:00", - "2018-06-12T00:00:00", - "2018-06-13T00:00:00", - "2018-06-14T00:00:00", - "2018-06-15T00:00:00", - "2018-06-18T00:00:00", - "2018-06-19T00:00:00", - "2018-06-20T00:00:00", - "2018-06-21T00:00:00", - "2018-06-22T00:00:00", - "2018-06-25T00:00:00", - "2018-06-26T00:00:00", - "2018-06-27T00:00:00", - "2018-06-28T00:00:00", - "2018-06-29T00:00:00", - "2018-07-02T00:00:00", - "2018-07-03T00:00:00", - "2018-07-05T00:00:00", - "2018-07-06T00:00:00", - "2018-07-09T00:00:00", - "2018-07-10T00:00:00", - "2018-07-11T00:00:00", - "2018-07-12T00:00:00", - "2018-07-13T00:00:00", - "2018-07-16T00:00:00", - "2018-07-17T00:00:00", - "2018-07-18T00:00:00", - "2018-07-19T00:00:00", - "2018-07-20T00:00:00", - "2018-07-23T00:00:00", - "2018-07-24T00:00:00", - "2018-07-25T00:00:00", - "2018-07-26T00:00:00", - "2018-07-27T00:00:00", - "2018-07-30T00:00:00", - "2018-07-31T00:00:00", - "2018-08-01T00:00:00", - "2018-08-02T00:00:00", - "2018-08-03T00:00:00", - "2018-08-06T00:00:00", - "2018-08-07T00:00:00", - "2018-08-08T00:00:00", - "2018-08-09T00:00:00", - "2018-08-10T00:00:00", - "2018-08-13T00:00:00", - "2018-08-14T00:00:00", - "2018-08-15T00:00:00", - "2018-08-16T00:00:00", - "2018-08-17T00:00:00", - "2018-08-20T00:00:00", - "2018-08-21T00:00:00", - "2018-08-22T00:00:00", - "2018-08-23T00:00:00", - "2018-08-24T00:00:00", - "2018-08-27T00:00:00", - "2018-08-28T00:00:00", - "2018-08-29T00:00:00", - "2018-08-30T00:00:00", - "2018-08-31T00:00:00", - "2018-09-03T00:00:00", - "2018-09-04T00:00:00", - "2018-09-05T00:00:00", - "2018-09-06T00:00:00", - "2018-09-07T00:00:00", - "2018-09-10T00:00:00", - "2018-09-11T00:00:00", - "2018-09-12T00:00:00", - "2018-09-13T00:00:00", - "2018-09-14T00:00:00", - "2018-09-17T00:00:00", - "2018-09-18T00:00:00", - "2018-09-19T00:00:00", - "2018-09-20T00:00:00", - "2018-09-21T00:00:00", - "2018-09-24T00:00:00", - "2018-09-25T00:00:00", - "2018-09-26T00:00:00", - "2018-09-27T00:00:00", - "2018-09-28T00:00:00", - "2018-10-01T00:00:00", - "2018-10-02T00:00:00", - "2018-10-03T00:00:00", - "2018-10-04T00:00:00", - "2018-10-05T00:00:00", - "2018-10-08T00:00:00", - "2018-10-09T00:00:00", - "2018-10-10T00:00:00", - "2018-10-11T00:00:00", - "2018-10-12T00:00:00", - "2018-10-15T00:00:00", - "2018-10-16T00:00:00", - "2018-10-17T00:00:00", - "2018-10-18T00:00:00", - "2018-10-19T00:00:00", - "2018-10-22T00:00:00", - "2018-10-23T00:00:00", - "2018-10-24T00:00:00", - "2018-10-25T00:00:00", - "2018-10-26T00:00:00", - "2018-10-29T00:00:00", - "2018-10-30T00:00:00", - "2018-10-31T00:00:00", - "2018-11-01T00:00:00", - "2018-11-02T00:00:00", - "2018-11-05T00:00:00", - "2018-11-06T00:00:00", - "2018-11-07T00:00:00", - "2018-11-08T00:00:00", - "2018-11-09T00:00:00", - "2018-11-12T00:00:00", - "2018-11-13T00:00:00", - "2018-11-14T00:00:00", - "2018-11-15T00:00:00", - "2018-11-16T00:00:00", - "2018-11-19T00:00:00", - "2018-11-20T00:00:00", - "2018-11-21T00:00:00", - "2018-11-23T00:00:00", - "2018-11-26T00:00:00", - "2018-11-27T00:00:00", - "2018-11-28T00:00:00", - "2018-11-29T00:00:00", - "2018-11-30T00:00:00", - "2018-12-03T00:00:00", - "2018-12-04T00:00:00", - "2018-12-06T00:00:00", - "2018-12-07T00:00:00", - "2018-12-10T00:00:00", - "2018-12-11T00:00:00", - "2018-12-12T00:00:00", - "2018-12-13T00:00:00", - "2018-12-14T00:00:00", - "2018-12-17T00:00:00", - "2018-12-18T00:00:00", - "2018-12-19T00:00:00", - "2018-12-20T00:00:00", - "2018-12-21T00:00:00", - "2018-12-24T00:00:00", - "2018-12-26T00:00:00", - "2018-12-27T00:00:00", - "2018-12-28T00:00:00", - "2018-12-31T00:00:00", - "2019-01-01T00:00:00", - "2019-01-02T00:00:00", - "2019-01-04T00:00:00", - "2019-01-08T00:00:00", - "2019-01-09T00:00:00", - "2019-01-10T00:00:00", - "2019-01-11T00:00:00", - "2019-01-16T00:00:00", - "2019-01-18T00:00:00", - "2019-01-22T00:00:00", - "2019-01-23T00:00:00", - "2019-01-24T00:00:00", - "2019-01-28T00:00:00", - "2019-01-29T00:00:00", - "2019-01-30T00:00:00", - "2019-01-31T00:00:00", - "2019-02-01T00:00:00", - "2019-02-04T00:00:00", - "2019-02-05T00:00:00", - "2019-02-06T00:00:00", - "2019-02-07T00:00:00", - "2019-02-08T00:00:00", - "2019-02-11T00:00:00", - "2019-02-12T00:00:00", - "2019-02-13T00:00:00", - "2019-02-14T00:00:00", - "2019-02-15T00:00:00", - "2019-02-18T00:00:00", - "2019-02-19T00:00:00", - "2019-02-20T00:00:00", - "2019-02-21T00:00:00", - "2019-02-22T00:00:00", - "2019-02-25T00:00:00", - "2019-02-26T00:00:00", - "2019-02-27T00:00:00", - "2019-02-28T00:00:00", - "2019-03-01T00:00:00", - "2019-03-04T00:00:00", - "2019-03-05T00:00:00", - "2019-03-06T00:00:00", - "2019-03-07T00:00:00", - "2019-03-08T00:00:00", - "2019-03-11T00:00:00", - "2019-03-12T00:00:00", - "2019-03-13T00:00:00", - "2019-03-14T00:00:00", - "2019-03-15T00:00:00", - "2019-03-18T00:00:00", - "2019-03-19T00:00:00", - "2019-03-20T00:00:00", - "2019-03-21T00:00:00", - "2019-03-22T00:00:00", - "2019-03-25T00:00:00", - "2019-03-26T00:00:00", - "2019-03-27T00:00:00", - "2019-03-28T00:00:00", - "2019-03-29T00:00:00", - "2019-04-01T00:00:00", - "2019-04-02T00:00:00", - "2019-04-03T00:00:00", - "2019-04-04T00:00:00", - "2019-04-05T00:00:00", - "2019-04-08T00:00:00", - "2019-04-09T00:00:00", - "2019-04-10T00:00:00", - "2019-04-11T00:00:00", - "2019-04-12T00:00:00", - "2019-04-15T00:00:00", - "2019-04-16T00:00:00", - "2019-04-17T00:00:00", - "2019-04-18T00:00:00", - "2019-04-19T00:00:00", - "2019-04-22T00:00:00", - "2019-04-23T00:00:00", - "2019-04-24T00:00:00", - "2019-04-25T00:00:00", - "2019-04-26T00:00:00", - "2019-04-29T00:00:00", - "2019-04-30T00:00:00", - "2019-05-01T00:00:00", - "2019-05-02T00:00:00", - "2019-05-03T00:00:00", - "2019-05-06T00:00:00", - "2019-05-07T00:00:00", - "2019-05-08T00:00:00", - "2019-05-09T00:00:00", - "2019-05-10T00:00:00", - "2019-05-13T00:00:00", - "2019-05-14T00:00:00", - "2019-05-15T00:00:00", - "2019-05-16T00:00:00", - "2019-05-17T00:00:00", - "2019-05-20T00:00:00", - "2019-05-21T00:00:00", - "2019-05-22T00:00:00", - "2019-05-23T00:00:00", - "2019-05-24T00:00:00", - "2019-05-28T00:00:00", - "2019-05-29T00:00:00", - "2019-05-30T00:00:00", - "2019-05-31T00:00:00", - "2019-06-03T00:00:00", - "2019-06-04T00:00:00", - "2019-06-05T00:00:00", - "2019-06-06T00:00:00", - "2019-06-07T00:00:00", - "2019-06-10T00:00:00", - "2019-06-11T00:00:00", - "2019-06-12T00:00:00", - "2019-06-13T00:00:00", - "2019-06-14T00:00:00", - "2019-06-17T00:00:00", - "2019-06-18T00:00:00", - "2019-06-19T00:00:00", - "2019-06-20T00:00:00", - "2019-06-21T00:00:00", - "2019-06-24T00:00:00", - "2019-06-25T00:00:00", - "2019-06-26T00:00:00", - "2019-06-27T00:00:00", - "2019-06-28T00:00:00", - "2019-07-01T00:00:00", - "2019-07-02T00:00:00", - "2019-07-03T00:00:00", - "2019-07-04T00:00:00", - "2019-07-05T00:00:00", - "2019-07-08T00:00:00", - "2019-07-09T00:00:00", - "2019-07-10T00:00:00", - "2019-07-11T00:00:00", - "2019-07-12T00:00:00", - "2019-07-15T00:00:00", - "2019-07-16T00:00:00", - "2019-07-17T00:00:00", - "2019-07-18T00:00:00", - "2019-07-19T00:00:00", - "2019-07-22T00:00:00", - "2019-07-23T00:00:00", - "2019-07-24T00:00:00", - "2019-07-25T00:00:00", - "2019-07-26T00:00:00", - "2019-07-29T00:00:00", - "2019-07-30T00:00:00", - "2019-07-31T00:00:00", - "2019-08-01T00:00:00", - "2019-08-02T00:00:00", - "2019-08-05T00:00:00", - "2019-08-06T00:00:00", - "2019-08-07T00:00:00", - "2019-08-08T00:00:00", - "2019-08-09T00:00:00", - "2019-08-12T00:00:00", - "2019-08-13T00:00:00", - "2019-08-14T00:00:00", - "2019-08-15T00:00:00", - "2019-08-16T00:00:00", - "2019-08-19T00:00:00", - "2019-08-20T00:00:00", - "2019-08-21T00:00:00", - "2019-08-22T00:00:00", - "2019-08-23T00:00:00", - "2019-08-26T00:00:00", - "2019-08-27T00:00:00", - "2019-08-28T00:00:00", - "2019-08-29T00:00:00", - "2019-08-30T00:00:00", - "2019-09-03T00:00:00", - "2019-09-04T00:00:00", - "2019-09-05T00:00:00", - "2019-09-06T00:00:00", - "2019-09-09T00:00:00", - "2019-09-10T00:00:00", - "2019-09-11T00:00:00", - "2019-09-12T00:00:00", - "2019-09-13T00:00:00", - "2019-09-16T00:00:00", - "2019-09-17T00:00:00", - "2019-09-18T00:00:00", - "2019-09-19T00:00:00", - "2019-09-20T00:00:00", - "2019-09-23T00:00:00", - "2019-09-24T00:00:00", - "2019-09-25T00:00:00", - "2019-09-26T00:00:00", - "2019-09-27T00:00:00", - "2019-09-30T00:00:00", - "2019-10-01T00:00:00", - "2019-10-02T00:00:00", - "2019-10-03T00:00:00", - "2019-10-04T00:00:00", - "2019-10-07T00:00:00", - "2019-10-08T00:00:00", - "2019-10-09T00:00:00", - "2019-10-10T00:00:00", - "2019-10-11T00:00:00", - "2019-10-14T00:00:00", - "2019-10-15T00:00:00", - "2019-10-16T00:00:00", - "2019-10-17T00:00:00", - "2019-10-18T00:00:00", - "2019-10-21T00:00:00", - "2019-10-22T00:00:00", - "2019-10-23T00:00:00", - "2019-10-24T00:00:00", - "2019-10-25T00:00:00", - "2019-10-28T00:00:00", - "2019-10-29T00:00:00", - "2019-10-30T00:00:00", - "2019-10-31T00:00:00", - "2019-11-01T00:00:00", - "2019-11-04T00:00:00", - "2019-11-05T00:00:00", - "2019-11-06T00:00:00", - "2019-11-07T00:00:00", - "2019-11-08T00:00:00", - "2019-11-11T00:00:00", - "2019-11-12T00:00:00", - "2019-11-13T00:00:00", - "2019-11-14T00:00:00", - "2019-11-15T00:00:00", - "2019-11-18T00:00:00", - "2019-11-19T00:00:00", - "2019-11-20T00:00:00", - "2019-11-21T00:00:00", - "2019-11-22T00:00:00", - "2019-11-25T00:00:00", - "2019-11-26T00:00:00", - "2019-11-27T00:00:00", - "2019-11-28T00:00:00", - "2019-11-29T00:00:00", - "2019-12-02T00:00:00", - "2019-12-03T00:00:00", - "2019-12-04T00:00:00", - "2019-12-05T00:00:00", - "2019-12-06T00:00:00", - "2019-12-09T00:00:00", - "2019-12-10T00:00:00", - "2019-12-11T00:00:00", - "2019-12-12T00:00:00", - "2019-12-13T00:00:00", - "2019-12-16T00:00:00", - "2019-12-17T00:00:00", - "2019-12-18T00:00:00", - "2019-12-19T00:00:00", - "2019-12-20T00:00:00", - "2019-12-23T00:00:00", - "2019-12-24T00:00:00", - "2019-12-26T00:00:00", - "2019-12-27T00:00:00", - "2019-12-30T00:00:00", - "2019-12-31T00:00:00", - "2020-01-01T00:00:00", - "2020-01-02T00:00:00", - "2020-01-06T00:00:00", - "2020-01-07T00:00:00", - "2020-01-08T00:00:00", - "2020-01-09T00:00:00", - "2020-01-10T00:00:00", - "2020-01-13T00:00:00", - "2020-01-14T00:00:00", - "2020-01-15T00:00:00", - "2020-01-16T00:00:00", - "2020-01-17T00:00:00", - "2020-01-21T00:00:00", - "2020-01-22T00:00:00", - "2020-01-23T00:00:00", - "2020-01-24T00:00:00", - "2020-01-27T00:00:00", - "2020-01-28T00:00:00", - "2020-01-29T00:00:00", - "2020-01-30T00:00:00", - "2020-01-31T00:00:00", - "2020-02-03T00:00:00", - "2020-02-04T00:00:00", - "2020-02-05T00:00:00", - "2020-02-06T00:00:00", - "2020-02-07T00:00:00", - "2020-02-10T00:00:00", - "2020-02-11T00:00:00", - "2020-02-12T00:00:00", - "2020-02-13T00:00:00", - "2020-02-14T00:00:00", - "2020-02-18T00:00:00", - "2020-02-19T00:00:00", - "2020-02-20T00:00:00", - "2020-02-21T00:00:00", - "2020-02-24T00:00:00", - "2020-02-25T00:00:00", - "2020-02-26T00:00:00", - "2020-02-27T00:00:00", - "2020-02-28T00:00:00", - "2020-03-02T00:00:00", - "2020-03-03T00:00:00", - "2020-03-04T00:00:00", - "2020-03-05T00:00:00", - "2020-03-06T00:00:00", - "2020-03-09T00:00:00", - "2020-03-10T00:00:00", - "2020-03-11T00:00:00", - "2020-03-12T00:00:00", - "2020-03-13T00:00:00", - "2020-03-16T00:00:00", - "2020-03-17T00:00:00", - "2020-03-18T00:00:00", - "2020-03-19T00:00:00", - "2020-03-20T00:00:00", - "2020-03-23T00:00:00", - "2020-03-24T00:00:00", - "2020-03-25T00:00:00", - "2020-03-26T00:00:00", - "2020-03-27T00:00:00", - "2020-03-30T00:00:00", - "2020-03-31T00:00:00", - "2020-04-01T00:00:00", - "2020-04-02T00:00:00", - "2020-04-03T00:00:00", - "2020-04-06T00:00:00", - "2020-04-07T00:00:00", - "2020-04-08T00:00:00", - "2020-04-09T00:00:00", - "2020-04-13T00:00:00", - "2020-04-14T00:00:00", - "2020-04-15T00:00:00", - "2020-04-16T00:00:00", - "2020-04-17T00:00:00", - "2020-04-20T00:00:00", - "2020-04-21T00:00:00", - "2020-04-22T00:00:00", - "2020-04-23T00:00:00", - "2020-04-24T00:00:00", - "2020-04-27T00:00:00", - "2020-04-28T00:00:00", - "2020-04-29T00:00:00", - "2020-04-30T00:00:00", - "2020-05-01T00:00:00", - "2020-05-04T00:00:00", - "2020-05-05T00:00:00", - "2020-05-06T00:00:00", - "2020-05-07T00:00:00", - "2020-05-08T00:00:00", - "2020-05-11T00:00:00", - "2020-05-12T00:00:00", - "2020-05-13T00:00:00", - "2020-05-14T00:00:00", - "2020-05-15T00:00:00", - "2020-05-18T00:00:00", - "2020-05-19T00:00:00", - "2020-05-20T00:00:00", - "2020-05-21T00:00:00", - "2020-05-22T00:00:00", - "2020-05-26T00:00:00", - "2020-05-27T00:00:00", - "2020-05-28T00:00:00", - "2020-05-29T00:00:00", - "2020-06-01T00:00:00", - "2020-06-02T00:00:00", - "2020-06-03T00:00:00", - "2020-06-04T00:00:00", - "2020-06-05T00:00:00", - "2020-06-08T00:00:00", - "2020-06-09T00:00:00", - "2020-06-10T00:00:00", - "2020-06-11T00:00:00", - "2020-06-12T00:00:00", - "2020-06-15T00:00:00", - "2020-06-16T00:00:00", - "2020-06-17T00:00:00", - "2020-06-18T00:00:00", - "2020-06-19T00:00:00", - "2020-06-22T00:00:00", - "2020-06-23T00:00:00", - "2020-06-24T00:00:00", - "2020-06-25T00:00:00", - "2020-06-26T00:00:00", - "2020-06-29T00:00:00", - "2020-06-30T00:00:00", - "2020-07-01T00:00:00", - "2020-07-02T00:00:00", - "2020-07-06T00:00:00", - "2020-07-07T00:00:00", - "2020-07-08T00:00:00", - "2020-07-09T00:00:00", - "2020-07-10T00:00:00", - "2020-07-13T00:00:00", - "2020-07-14T00:00:00", - "2020-07-15T00:00:00", - "2020-07-16T00:00:00", - "2020-07-17T00:00:00", - "2020-07-20T00:00:00", - "2020-07-21T00:00:00", - "2020-07-22T00:00:00", - "2020-07-23T00:00:00", - "2020-07-24T00:00:00", - "2020-07-27T00:00:00", - "2020-07-28T00:00:00", - "2020-07-29T00:00:00", - "2020-07-30T00:00:00", - "2020-07-31T00:00:00", - "2020-08-03T00:00:00", - "2020-08-04T00:00:00", - "2020-08-05T00:00:00", - "2020-08-06T00:00:00", - "2020-08-07T00:00:00", - "2020-08-10T00:00:00", - "2020-08-11T00:00:00", - "2020-08-12T00:00:00", - "2020-08-13T00:00:00", - "2020-08-14T00:00:00", - "2020-08-17T00:00:00", - "2020-08-18T00:00:00", - "2020-08-19T00:00:00", - "2020-08-20T00:00:00", - "2020-08-21T00:00:00", - "2020-08-24T00:00:00", - "2020-08-25T00:00:00", - "2020-08-26T00:00:00", - "2020-08-27T00:00:00", - "2020-08-28T00:00:00", - "2020-08-31T00:00:00", - "2020-09-01T00:00:00", - "2020-09-02T00:00:00", - "2020-09-03T00:00:00", - "2020-09-04T00:00:00", - "2020-09-08T00:00:00", - "2020-09-09T00:00:00", - "2020-09-10T00:00:00", - "2020-09-11T00:00:00", - "2020-09-14T00:00:00", - "2020-09-15T00:00:00", - "2020-09-16T00:00:00", - "2020-09-17T00:00:00", - "2020-09-18T00:00:00", - "2020-09-21T00:00:00", - "2020-09-22T00:00:00", - "2020-09-23T00:00:00", - "2020-09-24T00:00:00", - "2020-09-25T00:00:00", - "2020-09-28T00:00:00", - "2020-09-29T00:00:00", - "2020-09-30T00:00:00", - "2020-10-01T00:00:00", - "2020-10-02T00:00:00", - "2020-10-05T00:00:00", - "2020-10-06T00:00:00", - "2020-10-07T00:00:00", - "2020-10-08T00:00:00", - "2020-10-09T00:00:00", - "2020-10-12T00:00:00", - "2020-10-13T00:00:00", - "2020-10-14T00:00:00", - "2020-10-15T00:00:00", - "2020-10-16T00:00:00", - "2020-10-19T00:00:00", - "2020-10-20T00:00:00", - "2020-10-21T00:00:00", - "2020-10-22T00:00:00", - "2020-10-23T00:00:00", - "2020-10-26T00:00:00", - "2020-10-27T00:00:00", - "2020-10-28T00:00:00", - "2020-10-29T00:00:00", - "2020-10-30T00:00:00", - "2020-11-02T00:00:00", - "2020-11-03T00:00:00", - "2020-11-04T00:00:00", - "2020-11-05T00:00:00", - "2020-11-06T00:00:00", - "2020-11-09T00:00:00", - "2020-11-10T00:00:00", - "2020-11-11T00:00:00", - "2020-11-12T00:00:00", - "2020-11-13T00:00:00", - "2020-11-16T00:00:00", - "2020-11-17T00:00:00", - "2020-11-18T00:00:00", - "2020-11-19T00:00:00", - "2020-11-20T00:00:00", - "2020-11-23T00:00:00", - "2020-11-24T00:00:00", - "2020-11-25T00:00:00", - "2020-11-27T00:00:00", - "2020-11-30T00:00:00", - "2020-12-01T00:00:00", - "2020-12-02T00:00:00", - "2020-12-03T00:00:00", - "2020-12-04T00:00:00", - "2020-12-07T00:00:00", - "2020-12-08T00:00:00", - "2020-12-09T00:00:00", - "2020-12-10T00:00:00", - "2020-12-11T00:00:00", - "2020-12-14T00:00:00", - "2020-12-15T00:00:00", - "2020-12-16T00:00:00", - "2020-12-17T00:00:00", - "2020-12-18T00:00:00", - "2020-12-21T00:00:00", - "2020-12-22T00:00:00", - "2020-12-23T00:00:00", - "2020-12-24T00:00:00", - "2020-12-28T00:00:00", - "2020-12-29T00:00:00", - "2020-12-30T00:00:00", - "2020-12-31T00:00:00", - "2021-01-01T00:00:00", - "2021-01-04T00:00:00", - "2021-01-06T00:00:00", - "2021-01-07T00:00:00", - "2021-01-08T00:00:00", - "2021-01-11T00:00:00", - "2021-01-12T00:00:00", - "2021-01-13T00:00:00", - "2021-01-14T00:00:00", - "2021-01-15T00:00:00", - "2021-01-19T00:00:00", - "2021-01-20T00:00:00", - "2021-01-21T00:00:00", - "2021-01-22T00:00:00", - "2021-01-25T00:00:00", - "2021-01-26T00:00:00", - "2021-01-27T00:00:00", - "2021-01-28T00:00:00", - "2021-01-29T00:00:00", - "2021-02-01T00:00:00", - "2021-02-02T00:00:00", - "2021-02-03T00:00:00", - "2021-02-04T00:00:00", - "2021-02-05T00:00:00", - "2021-02-08T00:00:00", - "2021-02-09T00:00:00", - "2021-02-10T00:00:00", - "2021-02-11T00:00:00", - "2021-02-12T00:00:00", - "2021-02-16T00:00:00", - "2021-02-17T00:00:00", - "2021-02-18T00:00:00", - "2021-02-19T00:00:00", - "2021-02-22T00:00:00", - "2021-02-23T00:00:00", - "2021-02-24T00:00:00", - "2021-02-25T00:00:00", - "2021-02-26T00:00:00", - "2021-03-01T00:00:00", - "2021-03-02T00:00:00", - "2021-03-03T00:00:00", - "2021-03-04T00:00:00", - "2021-03-05T00:00:00", - "2021-03-08T00:00:00", - "2021-03-09T00:00:00", - "2021-03-10T00:00:00", - "2021-03-11T00:00:00", - "2021-03-12T00:00:00", - "2021-03-15T00:00:00", - "2021-03-16T00:00:00", - "2021-03-17T00:00:00", - "2021-03-18T00:00:00", - "2021-03-19T00:00:00", - "2021-03-22T00:00:00", - "2021-03-23T00:00:00", - "2021-03-24T00:00:00", - "2021-03-25T00:00:00", - "2021-03-26T00:00:00", - "2021-03-29T00:00:00", - "2021-03-30T00:00:00", - "2021-03-31T00:00:00", - "2021-04-01T00:00:00", - "2021-04-05T00:00:00", - "2021-04-06T00:00:00", - "2021-04-07T00:00:00", - "2021-04-08T00:00:00", - "2021-04-09T00:00:00", - "2021-04-12T00:00:00", - "2021-04-13T00:00:00", - "2021-04-14T00:00:00", - "2021-04-15T00:00:00", - "2021-04-16T00:00:00", - "2021-04-19T00:00:00", - "2021-04-20T00:00:00", - "2021-04-21T00:00:00", - "2021-04-22T00:00:00", - "2021-04-23T00:00:00", - "2021-04-26T00:00:00", - "2021-04-27T00:00:00", - "2021-04-28T00:00:00", - "2021-04-29T00:00:00", - "2021-04-30T00:00:00", - "2021-05-03T00:00:00", - "2021-05-04T00:00:00", - "2021-05-05T00:00:00", - "2021-05-06T00:00:00", - "2021-05-07T00:00:00", - "2021-05-10T00:00:00", - "2021-05-11T00:00:00", - "2021-05-12T00:00:00", - "2021-05-13T00:00:00", - "2021-05-14T00:00:00", - "2021-05-17T00:00:00", - "2021-05-18T00:00:00", - "2021-05-19T00:00:00", - "2021-05-20T00:00:00", - "2021-05-21T00:00:00", - "2021-05-24T00:00:00", - "2021-05-25T00:00:00", - "2021-05-26T00:00:00", - "2021-05-27T00:00:00", - "2021-05-28T00:00:00", - "2021-06-01T00:00:00", - "2021-06-02T00:00:00", - "2021-06-03T00:00:00", - "2021-06-04T00:00:00", - "2021-06-07T00:00:00", - "2021-06-08T00:00:00", - "2021-06-09T00:00:00", - "2021-06-10T00:00:00", - "2021-06-11T00:00:00", - "2021-06-14T00:00:00", - "2021-06-15T00:00:00", - "2021-06-16T00:00:00", - "2021-06-17T00:00:00", - "2021-06-18T00:00:00", - "2021-06-21T00:00:00", - "2021-06-22T00:00:00", - "2021-06-23T00:00:00", - "2021-06-24T00:00:00", - "2021-06-25T00:00:00", - "2021-06-28T00:00:00", - "2021-06-29T00:00:00", - "2021-06-30T00:00:00", - "2021-07-01T00:00:00", - "2021-07-02T00:00:00", - "2021-07-05T00:00:00", - "2021-07-06T00:00:00", - "2021-07-07T00:00:00", - "2021-07-08T00:00:00", - "2021-07-09T00:00:00", - "2021-07-12T00:00:00", - "2021-07-13T00:00:00", - "2021-07-14T00:00:00", - "2021-07-15T00:00:00", - "2021-07-16T00:00:00", - "2021-07-19T00:00:00", - "2021-07-20T00:00:00", - "2021-07-21T00:00:00", - "2021-07-22T00:00:00", - "2021-07-23T00:00:00", - "2021-07-26T00:00:00", - "2021-07-27T00:00:00", - "2021-07-28T00:00:00", - "2021-07-29T00:00:00", - "2021-07-30T00:00:00", - "2021-08-02T00:00:00", - "2021-08-03T00:00:00", - "2021-08-04T00:00:00", - "2021-08-05T00:00:00", - "2021-08-06T00:00:00", - "2021-08-09T00:00:00", - "2021-08-10T00:00:00", - "2021-08-11T00:00:00", - "2021-08-12T00:00:00", - "2021-08-13T00:00:00", - "2021-08-16T00:00:00", - "2021-08-17T00:00:00", - "2021-08-18T00:00:00", - "2021-08-19T00:00:00", - "2021-08-20T00:00:00", - "2021-08-23T00:00:00", - "2021-08-24T00:00:00", - "2021-08-25T00:00:00", - "2021-08-26T00:00:00", - "2021-08-27T00:00:00", - "2021-08-30T00:00:00", - "2021-08-31T00:00:00", - "2021-09-01T00:00:00", - "2021-09-02T00:00:00", - "2021-09-03T00:00:00", - "2021-09-07T00:00:00", - "2021-09-08T00:00:00", - "2021-09-09T00:00:00", - "2021-09-10T00:00:00", - "2021-09-13T00:00:00", - "2021-09-14T00:00:00", - "2021-09-15T00:00:00", - "2021-09-16T00:00:00", - "2021-09-17T00:00:00", - "2021-09-20T00:00:00", - "2021-09-21T00:00:00", - "2021-09-22T00:00:00", - "2021-09-23T00:00:00", - "2021-09-24T00:00:00", - "2021-09-27T00:00:00", - "2021-09-28T00:00:00", - "2021-09-29T00:00:00", - "2021-09-30T00:00:00", - "2021-10-01T00:00:00", - "2021-10-04T00:00:00", - "2021-10-05T00:00:00", - "2021-10-06T00:00:00", - "2021-10-07T00:00:00", - "2021-10-08T00:00:00", - "2021-10-11T00:00:00", - "2021-10-12T00:00:00", - "2021-10-13T00:00:00", - "2021-10-14T00:00:00", - "2021-10-15T00:00:00", - "2021-10-18T00:00:00", - "2021-10-19T00:00:00", - "2021-10-20T00:00:00", - "2021-10-21T00:00:00", - "2021-10-22T00:00:00", - "2021-10-25T00:00:00", - "2021-10-26T00:00:00", - "2021-10-27T00:00:00", - "2021-10-28T00:00:00", - "2021-10-29T00:00:00", - "2021-11-01T00:00:00", - "2021-11-02T00:00:00", - "2021-11-03T00:00:00", - "2021-11-04T00:00:00", - "2021-11-05T00:00:00", - "2021-11-08T00:00:00", - "2021-11-09T00:00:00", - "2021-11-10T00:00:00", - "2021-11-11T00:00:00", - "2021-11-12T00:00:00", - "2021-11-15T00:00:00", - "2021-11-16T00:00:00", - "2021-11-17T00:00:00", - "2021-11-18T00:00:00", - "2021-11-19T00:00:00", - "2021-11-22T00:00:00", - "2021-11-23T00:00:00", - "2021-11-24T00:00:00", - "2021-11-25T00:00:00", - "2021-11-26T00:00:00", - "2021-11-29T00:00:00", - "2021-11-30T00:00:00", - "2021-12-01T00:00:00", - "2021-12-02T00:00:00", - "2021-12-03T00:00:00", - "2021-12-06T00:00:00", - "2021-12-07T00:00:00", - "2021-12-08T00:00:00", - "2021-12-09T00:00:00", - "2021-12-10T00:00:00", - "2021-12-13T00:00:00", - "2021-12-14T00:00:00", - "2021-12-15T00:00:00", - "2021-12-16T00:00:00", - "2021-12-17T00:00:00", - "2021-12-20T00:00:00", - "2021-12-21T00:00:00", - "2021-12-22T00:00:00", - "2021-12-23T00:00:00", - "2021-12-27T00:00:00", - "2021-12-28T00:00:00", - "2021-12-29T00:00:00", - "2021-12-30T00:00:00", - "2021-12-31T00:00:00", - "2022-01-03T00:00:00", - "2022-01-05T00:00:00", - "2022-01-06T00:00:00", - "2022-01-07T00:00:00", - "2022-01-10T00:00:00", - "2022-01-11T00:00:00", - "2022-01-12T00:00:00", - "2022-01-13T00:00:00", - "2022-01-14T00:00:00", - "2022-01-18T00:00:00", - "2022-01-19T00:00:00", - "2022-01-20T00:00:00", - "2022-01-21T00:00:00", - "2022-01-24T00:00:00", - "2022-01-25T00:00:00", - "2022-01-26T00:00:00", - "2022-01-27T00:00:00", - "2022-01-28T00:00:00", - "2022-01-31T00:00:00", - "2022-02-01T00:00:00", - "2022-02-02T00:00:00", - "2022-02-03T00:00:00", - "2022-02-04T00:00:00", - "2022-02-07T00:00:00", - "2022-02-08T00:00:00", - "2022-02-09T00:00:00", - "2022-02-10T00:00:00", - "2022-02-11T00:00:00", - "2022-02-14T00:00:00", - "2022-02-15T00:00:00", - "2022-02-16T00:00:00", - "2022-02-17T00:00:00", - "2022-02-18T00:00:00", - "2022-02-22T00:00:00", - "2022-02-23T00:00:00", - "2022-02-24T00:00:00", - "2022-02-25T00:00:00", - "2022-02-28T00:00:00", - "2022-03-01T00:00:00", - "2022-03-02T00:00:00", - "2022-03-03T00:00:00", - "2022-03-04T00:00:00", - "2022-03-07T00:00:00", - "2022-03-08T00:00:00", - "2022-03-09T00:00:00", - "2022-03-10T00:00:00", - "2022-03-11T00:00:00", - "2022-03-14T00:00:00", - "2022-03-15T00:00:00", - "2022-03-16T00:00:00", - "2022-03-17T00:00:00", - "2022-03-18T00:00:00", - "2022-03-21T00:00:00", - "2022-03-22T00:00:00", - "2022-03-23T00:00:00", - "2022-03-24T00:00:00", - "2022-03-25T00:00:00", - "2022-03-28T00:00:00", - "2022-03-29T00:00:00", - "2022-03-30T00:00:00", - "2022-03-31T00:00:00", - "2022-04-01T00:00:00", - "2022-04-04T00:00:00", - "2022-04-05T00:00:00", - "2022-04-06T00:00:00", - "2022-04-07T00:00:00", - "2022-04-08T00:00:00", - "2022-04-11T00:00:00", - "2022-04-12T00:00:00", - "2022-04-13T00:00:00", - "2022-04-14T00:00:00", - "2022-04-18T00:00:00", - "2022-04-19T00:00:00", - "2022-04-20T00:00:00", - "2022-04-21T00:00:00", - "2022-04-22T00:00:00", - "2022-04-25T00:00:00", - "2022-04-26T00:00:00", - "2022-04-27T00:00:00", - "2022-04-28T00:00:00", - "2022-04-29T00:00:00", - "2022-05-03T00:00:00", - "2022-05-04T00:00:00", - "2022-05-05T00:00:00", - "2022-05-06T00:00:00", - "2022-05-09T00:00:00", - "2022-05-10T00:00:00", - "2022-08-01T00:00:00", - "2022-08-02T00:00:00", - "2022-08-03T00:00:00", - "2022-08-04T00:00:00", - "2022-08-05T00:00:00", - "2022-08-08T00:00:00", - "2022-08-09T00:00:00", - "2022-08-10T00:00:00", - "2022-08-11T00:00:00", - "2022-08-12T00:00:00", - "2022-08-15T00:00:00", - "2022-08-16T00:00:00", - "2022-08-17T00:00:00", - "2022-08-18T00:00:00", - "2022-08-19T00:00:00", - "2022-08-22T00:00:00", - "2022-08-23T00:00:00", - "2022-08-24T00:00:00", - "2022-08-25T00:00:00", - "2022-08-26T00:00:00", - "2022-08-29T00:00:00", - "2022-08-30T00:00:00", - "2022-08-31T00:00:00", - "2022-09-01T00:00:00", - "2022-09-02T00:00:00", - "2022-09-06T00:00:00", - "2022-09-07T00:00:00", - "2022-09-14T00:00:00", - "2022-09-15T00:00:00", - "2022-10-27T00:00:00", - "2022-10-28T00:00:00", - "2022-10-31T00:00:00", - "2022-11-01T00:00:00", - "2022-11-02T00:00:00", - "2022-11-03T00:00:00", - "2022-11-04T00:00:00", - "2022-11-14T00:00:00", - "2022-11-15T00:00:00", - "2022-11-16T00:00:00", - "2022-11-17T00:00:00", - "2022-11-18T00:00:00", - "2022-11-21T00:00:00", - "2022-11-22T00:00:00", - "2022-11-23T00:00:00", - "2022-11-25T00:00:00", - "2022-11-28T00:00:00", - "2022-11-29T00:00:00", - "2022-11-30T00:00:00", - "2022-12-01T00:00:00", - "2022-12-02T00:00:00", - "2022-12-05T00:00:00", - "2022-12-06T00:00:00", - "2022-12-07T00:00:00", - "2022-12-08T00:00:00", - "2022-12-09T00:00:00", - "2022-12-12T00:00:00", - "2022-12-13T00:00:00", - "2022-12-14T00:00:00", - "2022-12-15T00:00:00", - "2022-12-16T00:00:00", - "2022-12-19T00:00:00", - "2022-12-20T00:00:00", - "2022-12-21T00:00:00", - "2022-12-22T00:00:00", - "2022-12-23T00:00:00", - "2022-12-27T00:00:00", - "2022-12-28T00:00:00", - "2022-12-29T00:00:00", - "2022-12-30T00:00:00", - "2023-01-02T00:00:00", - "2023-01-03T00:00:00", - "2023-01-05T00:00:00", - "2023-01-06T00:00:00", - "2023-01-09T00:00:00", - "2023-01-10T00:00:00", - "2023-01-11T00:00:00", - "2023-01-12T00:00:00", - "2023-01-13T00:00:00", - "2023-01-17T00:00:00", - "2023-01-18T00:00:00", - "2023-01-19T00:00:00", - "2023-01-20T00:00:00", - "2023-01-23T00:00:00", - "2023-01-24T00:00:00", - "2023-01-25T00:00:00", - "2023-01-26T00:00:00", - "2023-01-27T00:00:00", - "2023-01-30T00:00:00", - "2023-01-31T00:00:00", - "2023-02-01T00:00:00", - "2023-02-02T00:00:00", - "2023-02-03T00:00:00", - "2023-02-06T00:00:00", - "2023-02-07T00:00:00", - "2023-02-08T00:00:00", - "2023-02-09T00:00:00", - "2023-02-10T00:00:00", - "2023-02-13T00:00:00", - "2023-02-14T00:00:00", - "2023-02-15T00:00:00", - "2023-02-16T00:00:00", - "2023-02-17T00:00:00", - "2023-02-21T00:00:00", - "2023-02-22T00:00:00", - "2023-02-23T00:00:00", - "2023-02-24T00:00:00", - "2023-02-27T00:00:00", - "2023-02-28T00:00:00", - "2023-03-01T00:00:00", - "2023-03-02T00:00:00", - "2023-03-03T00:00:00", - "2023-03-06T00:00:00", - "2023-03-07T00:00:00", - "2023-03-08T00:00:00", - "2023-03-09T00:00:00", - "2023-03-10T00:00:00", - "2023-03-13T00:00:00", - "2023-03-14T00:00:00", - "2023-03-15T00:00:00", - "2023-03-16T00:00:00", - "2023-03-17T00:00:00", - "2023-03-20T00:00:00", - "2023-03-21T00:00:00", - "2023-03-22T00:00:00", - "2023-03-23T00:00:00", - "2023-03-24T00:00:00", - "2023-03-27T00:00:00", - "2023-03-28T00:00:00", - "2023-03-29T00:00:00", - "2023-03-30T00:00:00", - "2023-03-31T00:00:00", - "2023-04-03T00:00:00", - "2023-04-04T00:00:00", - "2023-04-05T00:00:00", - "2023-04-06T00:00:00", - "2023-04-07T00:00:00", - "2023-04-10T00:00:00", - "2023-04-11T00:00:00", - "2023-04-12T00:00:00", - "2023-04-13T00:00:00", - "2023-04-14T00:00:00", - "2023-04-17T00:00:00", - "2023-04-18T00:00:00", - "2023-04-19T00:00:00", - "2023-04-20T00:00:00", - "2023-04-21T00:00:00", - "2023-04-24T00:00:00", - "2023-04-25T00:00:00", - "2023-04-26T00:00:00", - "2023-04-27T00:00:00", - "2023-04-28T00:00:00", - "2023-05-01T00:00:00", - "2023-05-02T00:00:00", - "2023-05-03T00:00:00", - "2023-05-04T00:00:00", - "2023-05-05T00:00:00", - "2023-05-08T00:00:00", - "2023-05-09T00:00:00", - "2023-05-10T00:00:00", - "2023-05-11T00:00:00", - "2023-05-12T00:00:00", - "2023-05-15T00:00:00", - "2023-05-16T00:00:00", - "2023-05-17T00:00:00", - "2023-05-18T00:00:00", - "2023-05-19T00:00:00", - "2023-05-22T00:00:00", - "2023-05-23T00:00:00", - "2023-05-24T00:00:00", - "2023-05-25T00:00:00", - "2023-05-26T00:00:00", - "2023-05-30T00:00:00", - "2023-05-31T00:00:00", - "2023-06-01T00:00:00", - "2023-06-02T00:00:00", - "2023-06-05T00:00:00", - "2023-06-06T00:00:00", - "2023-06-07T00:00:00", - "2023-06-08T00:00:00", - "2023-06-09T00:00:00", - "2023-06-12T00:00:00", - "2023-06-13T00:00:00", - "2023-06-14T00:00:00", - "2023-06-15T00:00:00", - "2023-06-16T00:00:00", - "2023-06-19T00:00:00", - "2023-06-20T00:00:00", - "2023-06-21T00:00:00", - "2023-06-22T00:00:00", - "2023-06-23T00:00:00", - "2023-06-26T00:00:00", - "2023-06-27T00:00:00", - "2023-06-28T00:00:00", - "2023-06-29T00:00:00", - "2023-06-30T00:00:00", - "2023-07-03T00:00:00", - "2023-07-05T00:00:00", - "2023-07-06T00:00:00", - "2023-07-07T00:00:00", - "2023-07-10T00:00:00", - "2023-07-11T00:00:00", - "2023-07-12T00:00:00", - "2023-07-13T00:00:00", - "2023-07-14T00:00:00", - "2023-07-17T00:00:00", - "2023-07-18T00:00:00", - "2023-07-19T00:00:00", - "2023-07-20T00:00:00", - "2023-07-21T00:00:00", - "2023-07-24T00:00:00", - "2023-07-25T00:00:00", - "2023-07-26T00:00:00", - "2023-07-27T00:00:00", - "2023-07-28T00:00:00", - "2023-07-31T00:00:00", - "2023-08-01T00:00:00", - "2023-08-02T00:00:00", - "2023-08-03T00:00:00", - "2023-08-04T00:00:00", - "2023-08-07T00:00:00", - "2023-08-08T00:00:00", - "2023-08-09T00:00:00", - "2023-08-10T00:00:00", - "2023-08-11T00:00:00", - "2023-08-14T00:00:00", - "2023-08-15T00:00:00", - "2023-08-16T00:00:00", - "2023-08-17T00:00:00", - "2023-08-18T00:00:00", - "2023-08-21T00:00:00", - "2023-08-22T00:00:00", - "2023-08-23T00:00:00", - "2023-08-24T00:00:00", - "2023-08-25T00:00:00", - "2023-08-28T00:00:00", - "2023-08-29T00:00:00", - "2023-08-30T00:00:00", - "2023-08-31T00:00:00", - "2023-09-01T00:00:00", - "2023-09-05T00:00:00", - "2023-09-06T00:00:00", - "2023-09-07T00:00:00", - "2023-09-08T00:00:00", - "2023-09-11T00:00:00", - "2023-09-12T00:00:00", - "2023-09-13T00:00:00", - "2023-09-14T00:00:00", - "2023-09-15T00:00:00", - "2023-09-18T00:00:00", - "2023-09-19T00:00:00", - "2023-09-20T00:00:00", - "2023-09-21T00:00:00", - "2023-09-22T00:00:00", - "2023-09-25T00:00:00", - "2023-09-26T00:00:00", - "2023-09-27T00:00:00", - "2023-09-28T00:00:00", - "2023-09-29T00:00:00", - "2023-10-02T00:00:00", - "2023-10-03T00:00:00", - "2023-10-04T00:00:00", - "2023-10-05T00:00:00", - "2023-10-06T00:00:00", - "2023-10-09T00:00:00", - "2023-10-10T00:00:00", - "2023-10-11T00:00:00", - "2023-10-12T00:00:00", - "2023-10-13T00:00:00", - "2023-10-16T00:00:00", - "2023-10-17T00:00:00", - "2023-10-18T00:00:00", - "2023-10-19T00:00:00", - "2023-10-20T00:00:00", - "2023-10-23T00:00:00", - "2023-10-24T00:00:00", - "2023-10-25T00:00:00", - "2023-10-26T00:00:00", - "2023-10-27T00:00:00", - "2023-10-30T00:00:00", - "2023-10-31T00:00:00", - "2023-11-01T00:00:00", - "2023-11-02T00:00:00", - "2023-11-03T00:00:00", - "2023-11-06T00:00:00", - "2023-11-07T00:00:00", - "2023-11-08T00:00:00", - "2023-11-09T00:00:00", - "2023-11-10T00:00:00", - "2023-11-13T00:00:00", - "2023-11-14T00:00:00", - "2023-11-15T00:00:00", - "2023-11-16T00:00:00", - "2023-11-17T00:00:00", - "2023-11-20T00:00:00", - "2023-11-21T00:00:00", - "2023-11-22T00:00:00", - "2023-11-23T00:00:00", - "2023-11-24T00:00:00", - "2023-11-27T00:00:00", - "2023-11-28T00:00:00", - "2023-11-29T00:00:00", - "2023-11-30T00:00:00", - "2023-12-01T00:00:00", - "2023-12-04T00:00:00", - "2023-12-05T00:00:00", - "2023-12-06T00:00:00", - "2023-12-07T00:00:00", - "2023-12-08T00:00:00", - "2023-12-11T00:00:00", - "2023-12-12T00:00:00", - "2023-12-13T00:00:00", - "2023-12-14T00:00:00", - "2023-12-15T00:00:00", - "2023-12-18T00:00:00", - "2023-12-19T00:00:00", - "2023-12-20T00:00:00", - "2023-12-21T00:00:00", - "2023-12-22T00:00:00", - "2023-12-25T00:00:00", - "2023-12-26T00:00:00", - "2023-12-27T00:00:00", - "2023-12-28T00:00:00", - "2023-12-29T00:00:00", - "2024-01-01T00:00:00", - "2024-01-02T00:00:00", - "2024-01-04T00:00:00", - "2024-01-05T00:00:00", - "2024-01-08T00:00:00", - "2024-01-09T00:00:00", - "2024-01-10T00:00:00", - "2024-01-11T00:00:00", - "2024-01-12T00:00:00", - "2024-01-15T00:00:00", - "2024-01-16T00:00:00", - "2024-01-17T00:00:00", - "2024-01-18T00:00:00", - "2024-01-19T00:00:00", - "2024-01-22T00:00:00", - "2024-01-23T00:00:00", - "2024-01-24T00:00:00", - "2024-01-25T00:00:00", - "2024-01-26T00:00:00", - "2024-01-29T00:00:00", - "2024-01-30T00:00:00", - "2024-01-31T00:00:00", - "2024-02-01T00:00:00", - "2024-02-02T00:00:00", - "2024-02-05T00:00:00", - "2024-02-06T00:00:00", - "2024-02-07T00:00:00", - "2024-02-08T00:00:00", - "2024-02-09T00:00:00", - "2024-02-12T00:00:00", - "2024-02-13T00:00:00", - "2024-02-14T00:00:00", - "2024-02-15T00:00:00", - "2024-02-16T00:00:00", - "2024-02-20T00:00:00", - "2024-02-21T00:00:00", - "2024-02-22T00:00:00", - "2024-02-23T00:00:00", - "2024-02-26T00:00:00", - "2024-02-27T00:00:00", - "2024-02-28T00:00:00", - "2024-02-29T00:00:00", - "2024-03-01T00:00:00", - "2024-03-04T00:00:00", - "2024-03-05T00:00:00", - "2024-03-06T00:00:00", - "2024-03-07T00:00:00", - "2024-03-08T00:00:00", - "2024-03-11T00:00:00", - "2024-03-12T00:00:00", - "2024-03-13T00:00:00", - "2024-03-14T00:00:00", - "2024-03-15T00:00:00", - "2024-03-18T00:00:00", - "2024-03-19T00:00:00", - "2024-03-20T00:00:00", - "2024-03-21T00:00:00", - "2024-03-22T00:00:00", - "2024-03-25T00:00:00", - "2024-03-26T00:00:00", - "2024-03-27T00:00:00", - "2024-03-28T00:00:00", - "2024-04-01T00:00:00", - "2024-04-02T00:00:00", - "2024-04-03T00:00:00", - "2024-04-04T00:00:00", - "2024-04-05T00:00:00", - "2024-04-08T00:00:00", - "2024-04-09T00:00:00", - "2024-04-10T00:00:00", - "2024-04-11T00:00:00", - "2024-04-12T00:00:00", - "2024-04-15T00:00:00", - "2024-04-16T00:00:00", - "2024-04-17T00:00:00", - "2024-04-18T00:00:00", - "2024-04-19T00:00:00", - "2024-04-22T00:00:00", - "2024-04-23T00:00:00", - "2024-04-24T00:00:00", - "2024-04-25T00:00:00", - "2024-04-26T00:00:00", - "2024-04-29T00:00:00", - "2024-04-30T00:00:00", - "2024-05-01T00:00:00", - "2024-05-02T00:00:00", - "2024-05-03T00:00:00", - "2024-05-06T00:00:00", - "2024-05-07T00:00:00", - "2024-05-08T00:00:00", - "2024-05-09T00:00:00", - "2024-05-10T00:00:00", - "2024-05-13T00:00:00", - "2024-05-14T00:00:00", - "2024-05-15T00:00:00", - "2024-05-16T00:00:00", - "2024-05-17T00:00:00", - "2024-05-20T00:00:00", - "2024-05-21T00:00:00", - "2024-05-22T00:00:00", - "2024-05-23T00:00:00", - "2024-05-24T00:00:00", - "2024-05-28T00:00:00", - "2024-05-29T00:00:00", - "2024-05-30T00:00:00", - "2024-05-31T00:00:00", - "2024-06-03T00:00:00", - "2024-06-04T00:00:00", - "2024-06-05T00:00:00", - "2024-06-06T00:00:00", - "2024-06-07T00:00:00", - "2024-06-10T00:00:00", - "2024-06-11T00:00:00", - "2024-06-12T00:00:00", - "2024-06-13T00:00:00", - "2024-06-14T00:00:00", - "2024-06-17T00:00:00", - "2024-06-18T00:00:00", - "2024-06-20T00:00:00", - "2024-06-21T00:00:00", - "2024-06-24T00:00:00", - "2024-06-25T00:00:00", - "2024-06-26T00:00:00", - "2024-06-27T00:00:00", - "2024-06-28T00:00:00", - "2024-07-01T00:00:00", - "2024-07-02T00:00:00", - "2024-07-03T00:00:00", - "2024-07-05T00:00:00", - "2024-07-08T00:00:00", - "2024-07-09T00:00:00", - "2024-07-10T00:00:00", - "2024-07-11T00:00:00", - "2024-07-12T00:00:00", - "2024-07-15T00:00:00", - "2024-07-16T00:00:00", - "2024-07-17T00:00:00", - "2024-07-18T00:00:00", - "2024-07-19T00:00:00", - "2024-07-22T00:00:00", - "2024-07-23T00:00:00", - "2024-07-24T00:00:00", - "2024-07-25T00:00:00", - "2024-07-26T00:00:00", - "2024-07-29T00:00:00", - "2024-07-30T00:00:00", - "2024-07-31T00:00:00", - "2024-08-01T00:00:00", - "2024-08-02T00:00:00", - "2024-08-05T00:00:00", - "2024-08-06T00:00:00", - "2024-08-07T00:00:00", - "2024-08-08T00:00:00", - "2024-08-09T00:00:00", - "2024-08-12T00:00:00", - "2024-08-13T00:00:00", - "2024-08-14T00:00:00", - "2024-08-15T00:00:00", - "2024-08-16T00:00:00", - "2024-08-19T00:00:00", - "2024-08-20T00:00:00", - "2024-08-21T00:00:00", - "2024-08-22T00:00:00", - "2024-08-23T00:00:00", - "2024-08-26T00:00:00", - "2024-08-27T00:00:00", - "2024-08-28T00:00:00", - "2024-08-29T00:00:00", - "2024-08-30T00:00:00", - "2024-09-03T00:00:00", - "2024-09-04T00:00:00", - "2024-09-05T00:00:00", - "2024-09-06T00:00:00", - "2024-09-09T00:00:00", - "2024-09-10T00:00:00", - "2024-09-11T00:00:00", - "2024-09-12T00:00:00", - "2024-09-13T00:00:00", - "2024-09-16T00:00:00", - "2024-09-17T00:00:00", - "2024-09-18T00:00:00", - "2024-09-19T00:00:00", - "2024-09-20T00:00:00", - "2024-09-23T00:00:00", - "2024-09-24T00:00:00", - "2024-09-25T00:00:00", - "2024-09-26T00:00:00", - "2024-09-27T00:00:00", - "2024-09-30T00:00:00", - "2024-10-01T00:00:00", - "2024-10-02T00:00:00", - "2024-10-03T00:00:00", - "2024-10-04T00:00:00", - "2024-10-07T00:00:00", - "2024-10-08T00:00:00", - "2024-10-09T00:00:00", - "2024-10-10T00:00:00", - "2024-10-11T00:00:00", - "2024-10-14T00:00:00", - "2024-10-15T00:00:00", - "2024-10-16T00:00:00", - "2024-10-17T00:00:00", - "2024-10-18T00:00:00", - "2024-10-21T00:00:00", - "2024-10-22T00:00:00", - "2024-10-23T00:00:00", - "2024-10-24T00:00:00", - "2024-10-25T00:00:00", - "2024-10-28T00:00:00", - "2024-10-29T00:00:00", - "2024-10-30T00:00:00", - "2024-10-31T00:00:00", - "2024-11-01T00:00:00", - "2024-11-04T00:00:00", - "2024-11-05T00:00:00", - "2024-11-06T00:00:00", - "2024-11-07T00:00:00", - "2024-11-08T00:00:00", - "2024-11-11T00:00:00", - "2024-11-12T00:00:00", - "2024-11-13T00:00:00", - "2024-11-14T00:00:00", - "2024-11-15T00:00:00", - "2024-11-18T00:00:00", - "2024-11-19T00:00:00", - "2024-11-20T00:00:00", - "2024-11-21T00:00:00", - "2024-11-22T00:00:00", - "2024-11-25T00:00:00", - "2024-11-26T00:00:00", - "2024-11-27T00:00:00", - "2024-11-28T00:00:00", - "2024-11-29T00:00:00", - "2024-12-02T00:00:00", - "2024-12-03T00:00:00", - "2024-12-04T00:00:00", - "2024-12-05T00:00:00", - "2024-12-06T00:00:00", - "2024-12-09T00:00:00", - "2024-12-10T00:00:00", - "2024-12-11T00:00:00", - "2024-12-12T00:00:00", - "2024-12-13T00:00:00", - "2024-12-16T00:00:00", - "2024-12-17T00:00:00", - "2024-12-18T00:00:00", - "2024-12-19T00:00:00", - "2024-12-20T00:00:00", - "2024-12-23T00:00:00", - "2024-12-24T00:00:00", - "2024-12-25T00:00:00", - "2024-12-26T00:00:00", - "2024-12-27T00:00:00", - "2024-12-30T00:00:00", - "2024-12-31T00:00:00", - "2025-01-01T00:00:00", - "2025-01-02T00:00:00", - "2025-01-06T00:00:00", - "2025-01-07T00:00:00", - "2025-01-08T00:00:00", - "2025-01-09T00:00:00", - "2025-01-10T00:00:00", - "2025-01-13T00:00:00", - "2025-01-14T00:00:00", - "2025-01-15T00:00:00", - "2025-01-16T00:00:00", - "2025-01-17T00:00:00", - "2025-01-21T00:00:00", - "2025-01-22T00:00:00", - "2025-01-23T00:00:00", - "2025-01-24T00:00:00", - "2025-01-27T00:00:00", - "2025-01-28T00:00:00", - "2025-01-29T00:00:00", - "2025-01-30T00:00:00", - "2025-01-31T00:00:00", - "2025-02-03T00:00:00", - "2025-02-04T00:00:00", - "2025-02-05T00:00:00", - "2025-02-06T00:00:00", - "2025-02-07T00:00:00", - "2025-02-10T00:00:00", - "2025-02-11T00:00:00", - "2025-02-12T00:00:00", - "2025-02-13T00:00:00", - "2025-02-14T00:00:00", - "2025-02-18T00:00:00", - "2025-02-19T00:00:00", - "2025-02-20T00:00:00", - "2025-02-21T00:00:00", - "2025-02-24T00:00:00", - "2025-02-25T00:00:00", - "2025-02-26T00:00:00", - "2025-02-27T00:00:00", - "2025-02-28T00:00:00", - "2025-03-03T00:00:00" - ], - "xaxis": "x", - "y": [ - 19649.108197709047, - 19638.139447709047, - 19904.930556586078, - 19934.893483680185, - 19938.62984704069, - 19796.439058213266, - 19834.955977331378, - 19693.31285092401, - 19684.72209923249, - 19859.690484956194, - 19896.026025815874, - 19773.901301289363, - 19946.59417827607, - 20147.756023973532, - 20475.88379911707, - 20905.228186388584, - 20985.583525883023, - 20910.70441790135, - 21196.802789206213, - 21557.05169614972, - 21730.209285866793, - 22085.971535005225, - 22559.948893075427, - 23034.94180141479, - 23386.97138733194, - 23622.12289249989, - 23627.460659403558, - 23556.792963167434, - 23530.488398311158, - 23387.193306809808, - 23155.342015020313, - 23218.462748976915, - 23407.02796819872, - 23095.24863436879, - 22763.74786972103, - 22449.81604700106, - 22218.440398772294, - 22128.496339058398, - 21847.086223237857, - 21462.65515889147, - 21230.439777158797, - 20930.161102206574, - 20657.835549212672, - 20492.140804211915, - 20277.489316072955, - 20372.54169670452, - 20497.879793082495, - 20628.698137524272, - 20845.22373337635, - 21060.75695449893, - 21320.596757173436, - 21141.915521261217, - 21217.941728684757, - 21187.06921490295, - 21175.173154725388, - 21291.25409829999, - 21644.53939923202, - 22025.31682118895, - 22361.707877284378, - 22623.445727265902, - 23053.89922762494, - 23299.39724560181, - 23339.371813257527, - 23338.35202712261, - 23256.66996477282, - 23313.250593058838, - 23371.03552544191, - 23185.09046299838, - 23087.57764082183, - 23200.289895692877, - 23126.510534474695, - 23084.015476474928, - 23097.18598765024, - 23197.22487827903, - 23461.032905204902, - 24062.55026081066, - 24421.183801252566, - 24791.009887982986, - 25119.449190114312, - 25900.241523223784, - 26371.44607533758, - 26482.271837537144, - 26493.469652466636, - 26720.401286444994, - 26825.938327439653, - 27288.356026125257, - 28266.01423633645, - 29043.570683189497, - 29797.447919583254, - 30443.162179726045, - 30952.206604244006, - 30336.463378753582, - 30467.99642565966, - 30638.455725712993, - 31013.03518131668, - 31104.635185461244, - 31303.888657485208, - 31949.773034747246, - 32647.634016334265, - 32647.634016334265, - 33597.85922423592, - 34415.56027510302, - 34548.66702165488, - 35529.08338008876, - 36383.781973082514, - 37101.35525055093, - 37913.24799972396, - 39099.275693525495, - 38807.297233145946, - 38529.53620840642, - 38767.27763360961, - 39098.298742101, - 39252.09293759413, - 39170.48842297753, - 39355.351578275855, - 39595.4673657301, - 39905.44631152785, - 40190.53512036079, - 40240.38197167524, - 40288.48507825315, - 39642.67638336924, - 39446.60295401512, - 38729.0741249112, - 38438.7815264218, - 37441.921081665954, - 35778.05975641103, - 34763.516666567346, - 34051.87204113338, - 34079.92622135141, - 34583.41280596543, - 35343.01348288744, - 35948.702898271236, - 36655.01688801418, - 37057.14999114758, - 38359.03129358468, - 39365.62360342665, - 40211.30651108151, - 40938.56522600304, - 41835.98867094201, - 42601.909959387674, - 43866.276055653994, - 44245.00510787215, - 44059.90548181961, - 43846.16132822319, - 44001.02698653709, - 44635.58916522567, - 45057.47085976123, - 46081.15662217779, - 46957.912215168435, - 47953.05545416116, - 48685.16686226661, - 47672.03129079308, - 47570.61758568983, - 48113.05788559363, - 48544.985612489545, - 48543.1020920105, - 48016.00883223643, - 49530.89202364793, - 54181.69006141244, - 57653.75969156479, - 56559.2582927944, - 55679.64609375076, - 53151.610851275465, - 51342.104735144916, - 49980.178763337644, - 49465.69433507583, - 50060.539779761086, - 49636.16755969685, - 48879.98916631356, - 48354.07263812655, - 48237.43811070898, - 47555.341107582164, - 47894.821216261305, - 48430.19463412286, - 48750.81840357073, - 49110.08813267018, - 50236.075699747526, - 51829.84380747434, - 52391.330113484095, - 52939.59724038057, - 53064.8050057445, - 52139.472845386736, - 50091.43672066402, - 48654.724055944076, - 47788.32878187516, - 46903.14251268934, - 46421.0945416937, - 46301.16834203044, - 46187.341560373294, - 46478.8096190844, - 47384.39588697082, - 48043.65064148681, - 48576.95989499925, - 49591.75598106446, - 50463.26404800409, - 51085.54810006823, - 51997.94898506151, - 53122.09041059396, - 53625.86707489699, - 53774.37953300503, - 53678.778111533495, - 53578.310339277865, - 53411.83540530126, - 53117.9104566528, - 52091.52438548176, - 52054.89077457096, - 51955.28685497367, - 52625.59491750911, - 53700.834521703335, - 54836.57643607663, - 54980.13763049958, - 55715.99780285622, - 56010.76315933176, - 56708.91399214608, - 57020.75280208013, - 56849.270177081, - 56930.89480208169, - 57095.122041576484, - 57293.40989451688, - 56813.18933569275, - 57110.24001216287, - 56802.532885563094, - 56763.596386715726, - 57220.42355427889, - 57445.6754601967, - 57713.09360924387, - 57732.7521696139, - 57086.70882767948, - 55349.383079461004, - 55888.12971973552, - 55045.206809430194, - 53440.044545859375, - 51915.47389641542, - 51182.47450240344, - 51120.71997330416, - 51108.24422844916, - 51076.3186491175, - 50688.15430963731, - 50570.69315670829, - 50749.890037763485, - 51214.82094525086, - 52171.989428852154, - 52729.78713831983, - 53251.963134572456, - 53282.21113165784, - 53278.60943783227, - 53177.14145374572, - 53080.77746612285, - 53289.27214241617, - 52734.76800175542, - 52303.48700346373, - 53148.31206746507, - 53928.465089701866, - 55049.69521810827, - 56467.67087282999, - 57593.38443026241, - 58890.43081196448, - 60454.24466439942, - 62443.87766073771, - 62443.87766073771, - 64010.36999122303, - 65309.860399591984, - 66101.38829626073, - 67184.75157115028, - 68971.8947466045, - 71984.80254225587, - 74537.24340754963, - 77342.3640805559, - 80269.23571511633, - 82930.80254199664, - 84700.79896290357, - 86155.46284583116, - 86413.09031033042, - 86549.02277957302, - 84620.74803342838, - 84366.75656420477, - 84393.76319925307, - 82674.63723720366, - 82302.89690233085, - 82450.43219742978, - 82990.51520472894, - 84233.97976596165, - 86619.98553580929, - 87479.01537268114, - 88715.26080135928, - 89388.89613477563, - 88739.70742428993, - 90361.22731613436, - 92225.82558911112, - 93506.1314004753, - 94199.36925375852, - 93656.66536186768, - 94357.0067792859, - 96002.16121505566, - 98379.7257762099, - 99984.275990441, - 100453.1483792874, - 102946.16023727904, - 103878.40399942106, - 104477.37136997597, - 105477.53074547532, - 106086.09914864146, - 105645.4301288818, - 104398.24311351318, - 104703.54210155981, - 104930.55242559606, - 102952.78267762427, - 99980.58909245345, - 101308.88297065393, - 98727.32887494261, - 95848.89791161161, - 94722.3404956875, - 91754.4625055243, - 89572.77962428625, - 88588.69293887888, - 88032.18107245093, - 86297.67184300696, - 84737.49799788385, - 85246.48713382446, - 86064.4698918739, - 87960.67870369014, - 89040.07485665416, - 90869.04964229284, - 93915.68228311703, - 96601.39655931362, - 97869.63024927331, - 97699.34973166842, - 96196.02044019794, - 93845.20876905424, - 91810.91080260913, - 91722.58712906139, - 91901.98208998944, - 91307.11544870933, - 90790.55250549146, - 90486.00354965535, - 90625.24325067173, - 92094.68493831708, - 94504.25069537458, - 96536.69072864152, - 98933.5885322936, - 101263.39793513405, - 102166.39112903901, - 102697.96350658216, - 102622.0896561167, - 102422.07666131023, - 101997.56563909126, - 101521.26916938978, - 101293.1377019266, - 101075.14656056634, - 102252.43064921029, - 103165.80876206335, - 103602.43044104644, - 103602.43044104644, - 103751.46952469992, - 105570.72500912097, - 107151.38427205206, - 109377.75908068106, - 112130.60615405918, - 113612.69847812447, - 115121.99250795304, - 115350.00196462356, - 114916.91639943677, - 114890.6276265137, - 115043.45470339325, - 117512.52273060531, - 121571.92033517687, - 124468.55071656429, - 126773.61470526327, - 129988.7142829032, - 134207.15655584968, - 136779.31491764556, - 136983.50765961772, - 134685.76868115162, - 134009.77329190483, - 132723.88798915735, - 132576.6438647982, - 131499.89843474107, - 131614.87421136332, - 130201.9664820695, - 130410.26047039653, - 131235.1557946509, - 134446.9999634671, - 136302.59561320386, - 138193.46906157, - 139532.99220043267, - 137643.52648839823, - 137058.2753790381, - 136030.71379879993, - 133522.63386150074, - 130427.0161324903, - 127590.78915566047, - 125085.72372923729, - 123099.37741000032, - 122077.54433367835, - 120160.4727345759, - 117660.26739043553, - 113478.99656721525, - 110315.23037137724, - 108360.41221905878, - 107868.64507982097, - 107575.2373145195, - 108372.85023683435, - 109145.10473196814, - 109722.08045040554, - 109911.51479014654, - 109997.48333647389, - 109827.73617836622, - 109961.74886160086, - 109373.1164980064, - 109533.82069973428, - 107441.92488464431, - 106655.49630697942, - 106267.16296879562, - 106688.45926131934, - 107110.75083830534, - 107816.5320744111, - 108648.83557885131, - 109859.12039070907, - 111346.75104033633, - 113021.5748789353, - 114380.8823089567, - 114380.8823089567, - 114305.34364341781, - 113166.55441228893, - 112130.82945474426, - 111038.04337665395, - 110580.87642702817, - 110529.19102176366, - 111390.1023732246, - 112454.14453547199, - 114397.84399499772, - 113005.57133262047, - 113091.58148410481, - 113202.9227130371, - 112980.6325577622, - 112681.20216178823, - 114078.86740936409, - 114226.61981612664, - 114484.24179230627, - 115313.5033293349, - 117414.66471152964, - 120106.63662470688, - 121171.61593498413, - 122034.8220651998, - 120139.2490553675, - 116516.00338105352, - 113502.03452325377, - 111617.83652274286, - 106516.23807790101, - 100681.32817635736, - 99772.86491960118, - 99775.06016434637, - 100548.54535470375, - 100074.0338360928, - 98888.30265495097, - 97909.29008718398, - 97570.05809003187, - 97600.08486743287, - 95565.95692912971, - 95905.77098046844, - 94207.4004954659, - 92417.19716123595, - 90853.86786792734, - 89773.50063979844, - 89267.10390680928, - 89220.46200337328, - 88221.96274514527, - 87304.24109985681, - 86791.01315352136, - 86379.05808414934, - 85910.31525241553, - 85302.94003910282, - 84636.64820652627, - 84072.31011452229, - 83904.85555573141, - 83827.9464544496, - 83724.90604234154, - 83531.20794403527, - 83258.66497868593, - 82831.23934619782, - 82752.35274315151, - 82692.8853852266, - 83051.18855128501, - 82918.86879155265, - 82864.95342287194, - 82924.90813612027, - 82944.20624642452, - 82984.88255443895, - 82910.2974606724, - 82937.3979432984, - 82981.80942978528, - 83044.12947483065, - 83173.15617653259, - 83097.28805563411, - 82961.83507271306, - 82666.92719710781, - 82446.22107163705, - 81936.33852960425, - 81665.54099691207, - 81269.80958259593, - 81257.57403812782, - 81141.77001422101, - 81051.70021784905, - 81006.97926511531, - 80972.19630187795, - 80926.16267851292, - 80865.99704314176, - 80794.13578192964, - 80760.19574090275, - 80758.35348677073, - 80741.80951133471, - 80697.96376524442, - 80725.78132649092, - 80788.52898035906, - 80860.7139459114, - 80805.191141341, - 80950.08553502144, - 81003.03571064882, - 81094.21918058123, - 81398.47299052867, - 81324.60215354204, - 81344.92483588579, - 81825.69928964844, - 82252.96830924161, - 82438.6219911474, - 82671.35263262969, - 82715.69868711592, - 82961.85672949409, - 83183.20601218336, - 83372.03323205281, - 83723.89884750682, - 83991.2251854203, - 84082.47900379747, - 84311.78752920193, - 84364.9833039577, - 84609.69112876775, - 84845.0080833519, - 85006.36571469514, - 85341.31053907321, - 85682.30653823762, - 86033.63675980995, - 86131.89359881065, - 86102.76002914453, - 86010.65614162643, - 85767.35311800125, - 85573.11743295944, - 85007.04523348248, - 84288.10018944484, - 83590.03182186, - 83009.279411445, - 82328.3608700111, - 82044.64644889586, - 82347.20189913956, - 81806.04191149394, - 81668.2508099918, - 81293.83531266499, - 80896.88992585524, - 79933.0435138921, - 79930.20741569855, - 80013.93489488133, - 80752.98960091239, - 81151.58770560322, - 81321.6306759183, - 81368.66409727448, - 81628.98837063048, - 81844.01836101849, - 82023.15279798693, - 81797.57453091606, - 81853.68032319425, - 81885.55685952528, - 81806.68305444943, - 81442.00342827932, - 81312.47483014701, - 81104.84147604411, - 81173.08841585298, - 81173.08841585298, - 81452.69171183358, - 81878.19245642031, - 82269.69303554331, - 82822.50551227946, - 83119.40988480397, - 83350.89106343416, - 83391.48753570206, - 83933.61812524378, - 84295.45030617977, - 84936.87533579663, - 84957.05201796132, - 84349.7858414366, - 84008.57881525072, - 83753.23268509272, - 83582.9634727476, - 82458.30964092362, - 81453.02332728275, - 81225.57841667318, - 81008.01217560307, - 80929.96254153611, - 80582.47949281737, - 80583.6593438139, - 80678.02145014453, - 80505.96975506836, - 80285.9295477869, - 79970.67605323464, - 79221.01160648625, - 78151.60592568193, - 77842.95706283413, - 76664.78572506363, - 76993.43024013101, - 77435.94585647204, - 77885.34689140395, - 78508.10548842499, - 79058.02884166357, - 79559.63589418247, - 79873.53026836383, - 80369.89255939377, - 80329.84100797262, - 80859.77869020062, - 81523.04133193349, - 81930.2011643924, - 82664.65881186044, - 83311.72269647838, - 83387.24183533255, - 83306.756721108, - 83288.6016322667, - 83291.9254520568, - 83491.84397856021, - 83577.19125777896, - 83976.90580828245, - 84431.57268089626, - 84783.57499010072, - 84928.91011948198, - 85356.40417929941, - 85410.11169320231, - 85813.81753734902, - 86288.72208279646, - 87147.27977325507, - 88220.04686583398, - 89385.11332285716, - 89363.2874393653, - 89677.97841887164, - 89165.51584737656, - 89341.07435280149, - 89616.95860184802, - 90116.29143315836, - 89763.34872407012, - 89840.83736994708, - 89999.4396500736, - 90771.3419920341, - 88666.17868244862, - 87638.60581387968, - 85209.58823128253, - 83416.90788926251, - 81719.26762324694, - 80982.43630523483, - 80661.80197856271, - 80112.97528003994, - 79442.2211811889, - 80037.19021541589, - 79478.05501981462, - 79527.8387565692, - 79781.78166293386, - 80413.40392343972, - 80436.44345938873, - 81175.0511414159, - 81239.54997605516, - 79136.31319207886, - 79572.12902676396, - 79301.0968981857, - 80370.29413151373, - 81662.76919074846, - 81914.13868126435, - 82266.31495166558, - 82863.0076064221, - 83877.10189345498, - 85035.84189448053, - 85177.0841175004, - 85095.82806873809, - 85226.14816137632, - 85010.28601120604, - 85662.10546412216, - 84286.2983719458, - 83685.93893319184, - 83386.77048082765, - 82955.19501787772, - 80868.40683253779, - 80135.34935505118, - 78962.04702292802, - 78525.03409794334, - 77787.075499006, - 77292.55214427695, - 77401.25620170993, - 76405.47046860225, - 75817.63712062959, - 76505.8174923679, - 76322.70957109636, - 76909.18118788517, - 77193.65911205426, - 77305.72321503569, - 77751.21751735458, - 78286.60197471372, - 79262.36943631634, - 80917.4107953406, - 81955.08315432607, - 82634.3118017643, - 82584.82297199404, - 83611.3316599505, - 84267.79159636244, - 84680.03821357172, - 84706.78558251227, - 84997.0335361327, - 86515.55972228193, - 86876.05786706466, - 87692.00086856235, - 87853.2898697272, - 88286.49242618875, - 89786.76108121441, - 91086.97003512326, - 91782.66588816348, - 92735.98488497252, - 93080.23299360178, - 93452.4259669801, - 93870.2427240521, - 94066.87797955256, - 92957.03873383072, - 93603.27487604704, - 95280.90298665976, - 96221.83596158076, - 95963.11716429707, - 95912.20815480154, - 96850.13994327668, - 97547.42022320179, - 98139.00088243705, - 98289.67472850894, - 98289.67472850894, - 98388.53216434263, - 95491.53815216103, - 94054.43169824201, - 94843.904456305, - 95387.93882368733, - 96060.9185971768, - 95923.7917543353, - 95432.13754323634, - 95697.51760127048, - 97050.03542418593, - 96961.77150867572, - 97792.7884632789, - 98953.24609463692, - 100499.4909190265, - 101840.25115892198, - 102371.16191222458, - 102421.87027590438, - 103449.50749208109, - 104462.11421577408, - 104398.87934681693, - 104870.25222651692, - 104387.95490466095, - 104012.83476543962, - 105577.56758006637, - 106244.05713439999, - 106603.99345443724, - 106966.16614779955, - 108477.85602041468, - 109436.92511807657, - 111544.73471347278, - 111928.4610805594, - 112684.69269940455, - 113895.650625173, - 115775.26149844262, - 118770.55392486164, - 119367.63259774035, - 120510.3752502004, - 119857.73064655824, - 117615.4782412131, - 118658.05970372247, - 116634.40569436946, - 116681.6672692535, - 114939.13359077099, - 115625.05184084014, - 118013.95440450254, - 119420.9171508401, - 120675.89175158345, - 121437.21692322614, - 124787.692056726, - 128552.06161232376, - 131900.14682339213, - 134305.7394711237, - 140596.11721407628, - 145947.41101415048, - 149585.6395253193, - 157140.8172562284, - 155534.90417003288, - 150873.7495474364, - 144708.07372986132, - 141517.21476063627, - 136339.48851386926, - 136922.7014330505, - 136608.8799343366, - 131753.46321311468, - 135293.2946481933, - 135384.83020880996, - 136989.59030609624, - 133344.62593731892, - 131727.7647616032, - 132241.09495826878, - 124832.46288900866, - 129544.43133537233, - 117994.43160202754, - 114877.76514275937, - 112800.13567443968, - 109815.18278757884, - 111633.86477585147, - 112014.22083966594, - 121057.72000041055, - 130910.42481595192, - 138847.52856137292, - 141856.88429411198, - 148480.2720862423, - 147698.58683564345, - 145604.45536789272, - 148331.40510234266, - 149002.87747677034, - 151607.09076565428, - 152368.7011014528, - 157312.1758070739, - 158340.35226278714, - 159625.04506167528, - 163802.58390525487, - 174318.44745026124, - 182800.17785028537, - 177923.86419568709, - 183853.3980198884, - 181776.7695887312, - 183644.39192005337, - 185903.97961645725, - 188926.99226921587, - 192500.5647027961, - 194877.2414456576, - 197486.32335677207, - 196080.05373208335, - 194952.9551351032, - 195212.43400411858, - 196197.58423557508, - 197779.36774893012, - 200261.9489461722, - 201943.73995307824, - 207964.48894149103, - 209377.29371025652, - 206255.69741929616, - 210062.67808188274, - 219103.10748611676, - 234247.8859116322, - 242575.49135369962, - 256757.61660740033, - 269142.6665086327, - 273641.0386540359, - 276111.09396410733, - 269404.37667378434, - 263994.1521146443, - 270070.08856864634, - 273782.4473098516, - 269905.9485530112, - 268153.6717421354, - 267589.5956002004, - 269010.18964614335, - 273345.0961263212, - 279648.05252139905, - 290257.0186064597, - 281408.9922281736, - 277471.4422287565, - 281056.6811180989, - 286095.20025425404, - 290639.6040268192, - 296663.74104952713, - 298804.0561179495, - 306291.52339338907, - 305928.90790958185, - 305040.7625332875, - 311855.5383517252, - 306345.76339005696, - 309145.93841987057, - 317847.3492586314, - 319942.05027928477, - 325376.79505802813, - 332678.81877482875, - 339985.3927767846, - 358260.23630456463, - 376011.47150065366, - 385600.76554205595, - 381881.327574258, - 389663.98693263705, - 395233.44431775366, - 389919.221917182, - 391824.1472585143, - 396476.3114128837, - 396037.4390885044, - 395560.538391765, - 385373.8513839576, - 379270.8726001074, - 387966.8891015572, - 399239.90193601814, - 400153.356362821, - 402087.15425033425, - 406951.21927395614, - 420713.8254034397, - 432266.05353441474, - 444032.230969617, - 452163.1467525527, - 460818.3034726134, - 462437.3142548826, - 442567.1004188701, - 448433.0452130821, - 450992.915921219, - 465474.4820275476, - 496876.2556658029, - 518456.52405111276, - 538157.8439063533, - 553511.6482382076, - 572644.6854516908, - 583311.492173289, - 593662.8974011992, - 593846.9655354635, - 617576.5846475579, - 636635.732845854, - 667109.7085996103, - 695940.618528404, - 753124.2517101644, - 700976.20694363, - 714396.061014103, - 672698.8399676515, - 736664.611972679, - 705785.3487896962, - 669730.921869598, - 663764.1453761886, - 650143.8747702048, - 636079.2198544395, - 653338.3771421765, - 623001.9308457408, - 616752.2690490911, - 638493.6432072533, - 625867.6152032263, - 618257.3712000942, - 622624.9591976582, - 632400.9538350265, - 644139.9860925326, - 660129.1404916964, - 670404.4685351447, - 687043.0570133822, - 709548.6258297891, - 721031.8460203278, - 721353.2395018578, - 725551.5151559446, - 734756.6120429086, - 762191.1975984068, - 774181.7327212763, - 770157.1476894636, - 771254.489384963, - 768479.644037018, - 756236.8345204841, - 749016.8715631798, - 738331.34481861, - 720779.2684617222, - 717072.0979619208, - 727486.3988393145, - 717033.6328550647, - 691638.1482006486, - 681458.8823583248, - 639913.8978142953, - 639105.0209467168, - 638302.0056052668, - 655349.104784139, - 672269.6263677063, - 707974.215171344, - 696048.3201880987, - 663619.8463122414, - 661828.8110754635, - 661358.5614468585, - 657616.1450690546, - 655986.4878863181, - 657722.3100775231, - 668956.2828929047, - 648498.2617493127, - 651298.9726171002, - 648707.8588476015, - 649641.9925824361, - 650954.0501036063, - 660909.5392867387, - 699077.8627766742, - 704173.6774436742, - 708925.5952668876, - 709002.5725539582, - 717510.7771105694, - 725675.3272273403, - 736015.5328737174, - 713962.8781622895, - 705627.2578311791, - 697960.7753514264, - 702367.222311619, - 704143.5921695463, - 708917.6576146011, - 713894.7085163103, - 684974.5657079712, - 682144.177442268, - 686674.6373669249, - 682783.3284194357, - 680185.8365439482, - 673751.6415837908, - 676065.7562357205, - 683037.0421620405, - 680067.4867714007, - 677757.8325786807, - 692952.5255074337, - 704473.3272968904, - 720683.9509109125, - 735708.880388485, - 741474.9366488192, - 749569.6470735234, - 755785.5329594044, - 759343.4442039788, - 759314.0418386477, - 761434.5066656121, - 764607.090419918, - 769684.6555621559, - 778497.206228341, - 788204.0115900404, - 807385.4157602511, - 800992.2860508852, - 797243.1851658229, - 790050.5511441078, - 787372.9469049961, - 794532.0324967981, - 791380.2101793106, - 792095.4594879317, - 793446.2341455385, - 796445.7255458992, - 796476.4410795129, - 793662.5531612128, - 790979.5292247572, - 789998.2883852917, - 785327.3232879296, - 780594.3504344259, - 774416.4826594784, - 765393.512579488, - 756241.2025172731, - 721184.862536698, - 719579.9314406953, - 701559.0134534882, - 678101.0772412161, - 725908.2379650046, - 707897.1407501735, - 682037.954027527, - 662838.5865765795, - 637072.9674480649, - 612144.8653392706, - 599324.6748102081, - 586109.9346264496, - 578111.803372415, - 574178.1421503865, - 571956.347961203, - 570021.0635918381, - 566831.8868601099, - 558299.1938465434, - 553021.5437248808, - 551363.3047413653, - 545386.3410875199, - 533933.4821031654, - 525311.2584486675, - 516155.20412431256, - 502290.940151382, - 500993.1792835471, - 503995.0140423108, - 516542.55218801607, - 521178.9707457868, - 521561.18517960847, - 523293.8704280396, - 528080.9589545971, - 522803.13891969743, - 534233.7233369977, - 552004.1778837868, - 557610.0869757339, - 567569.6243818036, - 573019.4228013161, - 581140.8252779857, - 578274.9706363817, - 566012.6497789607, - 565433.3661045987, - 563132.4788023172, - 554368.8558348462, - 551443.8157490351, - 553821.0067934045, - 539384.8220501362, - 539640.3450275944, - 538223.196232284, - 528891.1370060216, - 523359.8687189288, - 519610.40723056183, - 518739.71496183187, - 507727.62097504194, - 495271.54787420534, - 480588.67220321833, - 464193.7138919014, - 462039.5051725927, - 459065.3428353525, - 456787.3276841658, - 454755.91589990945, - 456660.6845121545, - 460474.77121056727, - 469197.85886742815, - 474364.7957159086, - 479351.6354869489, - 479644.1775310915, - 484523.8213432023, - 485895.9887526219, - 492050.1189599482, - 496628.33134342416, - 504872.38541946106, - 511720.3163674898, - 515925.7071048455, - 518920.1221227888, - 521917.6671367447, - 525558.0910364882, - 523947.6429585109, - 526290.0722311953, - 528596.5172210608, - 527781.4188798451, - 533825.453503344, - 538243.8137660654, - 544849.913810874, - 551327.991623503, - 551886.2475849545, - 555620.3980392467, - 564255.2928370296, - 573188.5443464164, - 575829.4066314949, - 580425.7425660638, - 594246.5461290003, - 604963.4447029732, - 616168.2547049522, - 578577.3312401787, - 574205.0494611649, - 597065.8393396193, - 578952.3036585549, - 572066.775906616, - 565725.2414203746, - 535502.781264409, - 541542.5891839039, - 537288.3401975374, - 513014.6043169747, - 513985.33226887445, - 509387.0174340531, - 516382.2566819424, - 517743.77609696734, - 513548.00230865343, - 521543.84491774277, - 509978.0558359233, - 515628.33099450823, - 509005.5584765065, - 514704.21111317276, - 545624.7187194688, - 545115.237911198, - 537528.7509433973, - 551052.7055239965, - 554255.1146422406, - 540602.0995119859, - 535943.0833807401, - 535632.572414801, - 543654.841663515, - 534247.2733014036, - 520377.2756864282, - 517709.38865255844, - 523110.0320706595, - 537678.6316902105, - 547576.3061473435, - 564538.3862806691, - 571902.4755839749, - 584421.767264324, - 603508.9941268176, - 607223.9143139627, - 618476.6546975912, - 613426.0118371695, - 630289.9562790637, - 647322.4444229562, - 615515.2404460702, - 620557.1616151399, - 638143.1718505863, - 623757.0954122375, - 618793.9248490772, - 626055.2366332859, - 620462.7013543369, - 607422.507248488, - 582734.4673883832, - 573457.3252749683, - 569511.5480756457, - 578224.3211402987, - 588796.6225816434, - 586739.9681471336, - 571935.9035869595, - 565892.6311512685, - 555838.19703462, - 547930.798918485, - 533943.6003837133, - 526487.4459677797, - 520589.2147553869, - 527080.146034637, - 527288.9814740537, - 526658.2979269334, - 520139.8773902843, - 519093.10586177954, - 525790.5899162181, - 532854.2997363368, - 553718.0740408736, - 569239.2206992658, - 579199.4458780154, - 595433.3140882489, - 613947.7671406529, - 635215.2241396012, - 675961.6247524415, - 703920.8251598375, - 737775.8089110446, - 769262.0940424338, - 795870.3196110954, - 827669.5949304976, - 861842.3466382246, - 922231.2291466171, - 846189.5949387539, - 940281.2327762127, - 1037488.0622053477, - 1142768.3739835636, - 1154789.1720332871, - 1162460.3482941834, - 1171203.4853859916, - 1174387.6269977973, - 1243738.5601833174, - 1263677.619327611, - 1229121.0610568249, - 1248534.5489243688, - 1362965.7273529987, - 1370912.8300892636, - 1370912.8300892636, - 1421674.465550803, - 1527444.9355161167, - 1655831.4832366735, - 1664255.5472891547, - 1724193.7082188628, - 1737453.3889419686, - 1730620.9183932731, - 1760156.303335484, - 1747715.0555699486, - 1718359.0850856432, - 1727368.330264517, - 1688633.85429253, - 1636710.9285365404, - 1646416.4307263258, - 1626140.1941960182, - 1698818.6768946678, - 1662399.7189936175, - 1653741.6406261337, - 1644097.5796736465, - 1636794.9767106008, - 1642115.1442290696, - 1656654.503793619, - 1662049.921551794, - 1658418.8579350922, - 1655847.4751221018, - 1647888.7136570136, - 1614260.0387179304, - 1598824.402654199, - 1565581.4500288717, - 1543619.7763888203, - 1521957.2229840367, - 1519563.0044604926, - 1483146.3737938767, - 1471058.9943865088, - 1465149.3659585558, - 1439407.5642952672, - 1420871.7185571538, - 1408701.0607608433, - 1367121.1046970463, - 1352493.8799101983, - 1346067.7050759832, - 1326564.0297954492, - 1342116.8379105898, - 1328207.1232343132, - 1349575.1229305426, - 1364964.3226942765, - 1346420.1669549583, - 1343505.8236021553, - 1352474.6676610862, - 1360343.7685958103, - 1397413.2915450402, - 1392957.6316166637, - 1371967.873894593, - 1366099.5734440933, - 1376590.9175381495, - 1378478.0740557483, - 1357819.1957916585, - 1313649.5126973665, - 1290028.6480684727, - 1251309.642246, - 1249594.948828521, - 1255535.876170482, - 1261957.7085475626, - 1275060.800396403, - 1281925.9829455013, - 1292740.5693725776, - 1291380.8032603038, - 1291085.9851729795, - 1278922.9044383941, - 1281534.8416448277, - 1282471.7928053872, - 1276299.1992636002, - 1271387.5153977657, - 1274093.005724339, - 1274256.7204227848, - 1273829.6096326872, - 1274092.3863552685, - 1302655.6571394987, - 1311146.3408100556, - 1314041.6946662306, - 1345087.20669755, - 1385715.3333528433, - 1418831.473889878, - 1436467.608333524, - 1461346.648208322, - 1463743.2472643026, - 1472796.7336512813, - 1457079.9657479138, - 1434930.257378628, - 1404837.2841999049, - 1402597.193949787, - 1379824.568643616, - 1354189.1934054832, - 1333505.012664713, - 1316927.6323181132, - 1305170.7809374244, - 1290497.6743080001, - 1283569.7024851143, - 1287232.3910673142, - 1275880.0377423586, - 1269953.2073785043, - 1255386.2282066175, - 1243954.1332951502, - 1232802.837252898, - 1224974.9321527244, - 1203400.450408145, - 1167925.241082307, - 1165222.9129089315, - 1146396.102107417, - 1129275.2492617948, - 1118436.8081596442, - 1110475.6044070143, - 1101589.7358711334, - 1092530.7270098925, - 1089743.1645622607, - 1083686.1715474362, - 1074745.6199530265, - 1068828.7464907079, - 1053012.40046446, - 1052977.1999048986, - 1051484.641121501, - 1058166.7620677473, - 1066042.041624561, - 1079194.4224768714, - 1091198.2791138317, - 1097603.1008664442, - 1099975.4066740316, - 1095845.7556354885, - 1086191.5826055105, - 1082155.5591377497, - 1083471.9853294916, - 1073669.983478624, - 1060740.759816838, - 1046736.9191910045, - 1034420.487593134, - 1026200.4278533696, - 1014993.1591668861, - 1008238.0612996212, - 1009628.0564443966, - 1016069.7580448225, - 1016583.0241466968, - 966908.2763668922, - 968825.8461309914, - 966999.067058624, - 966855.0166690052, - 959871.8663659684, - 955197.5272413839, - 958609.7271193005, - 989304.0522564298, - 998806.5032313887, - 1001963.9651008012, - 1001876.616112232, - 1002675.1575184262, - 1003301.3229380827, - 1005173.1184732422, - 1006409.9745319717, - 1017354.8248516119, - 1018514.4881961623, - 1021140.8930197015, - 1031593.9912187324, - 1034060.8453735342, - 1048126.1763828245, - 1054129.4917614183, - 1049292.0703892135, - 1048516.2982108319, - 1048663.475405424, - 1047674.0576678845, - 1054422.8438720207, - 1056963.0109196818, - 1060963.6964011963, - 1053892.5629745582, - 1043520.5703093954, - 1029998.0741793646, - 1021200.021633785, - 1020680.4252094453, - 1018517.9613238478, - 1014360.3592475363, - 1006890.7798548493, - 1002240.8847716486, - 1000441.7441513812, - 996902.1476864491, - 994149.1282137244, - 1000640.8885310034, - 1004881.0946302401, - 1013860.6993740909, - 1016385.9985099105, - 1021179.7867266592, - 1023764.6220063525, - 1024689.7161127807, - 1027374.7917650967, - 1028442.8506057869, - 1025278.4934542315, - 1021002.3267807995, - 1016204.6989286835, - 1062337.6550437047, - 1075600.368937815, - 1105281.568237552, - 1131185.670133024, - 1149467.3995866545, - 1164101.6332883069, - 1167334.928826669, - 1186003.3364676177, - 1232961.2090772442, - 1235163.4170505975, - 1239260.9069726153, - 1250350.6213564065, - 1257044.1245884392, - 1258739.0715466868, - 1258994.5858475463, - 1258902.208081548, - 1264648.1364857717, - 1271924.1832617642, - 1232904.2948232067, - 1204225.048259884, - 1158979.7453772996, - 1222745.9542464006, - 1218472.7833668124, - 1121393.872682688, - 1130477.164372814, - 1133788.0929102376, - 1128731.037328234, - 1134872.4385422312, - 1148959.6394864512, - 1256100.4672605286, - 1235405.994632821, - 1237899.9603668263, - 1221287.6058132113, - 1264131.5522715105, - 1238726.5106279657, - 1240376.700460764, - 1306744.6319551063, - 1356948.429865242, - 1257746.301931187, - 1298379.2024269213, - 1412322.9028124928, - 1542316.445215153, - 1548276.3115283332, - 1553267.606037816, - 1549974.0510844702, - 1536672.7305652015, - 1572146.0368279926, - 1587468.4972546075, - 1603207.6331419747, - 1625032.737350861, - 1703194.9912238587, - 1679707.855347301, - 1662729.4628964707, - 1649476.109142842, - 1621850.3895566866, - 1612941.7187674544, - 1589951.085931385, - 1574174.1492811092, - 1612002.8307201297, - 1594630.1516495342, - 1584998.965079275, - 1629487.8238198862, - 1628164.1233865265, - 1602588.0438417243, - 1577644.188250512, - 1535976.5700226105, - 1559994.3114009092, - 1586417.666547426, - 1609180.6809165943, - 1652919.0827501323, - 1666929.5063984396, - 1575682.502569345, - 1576984.8329244938, - 1609006.4853287605, - 1634260.5513195933, - 1636971.9151828815, - 1672981.4204098836, - 1698501.7022531072, - 1704884.6093844476, - 1709832.8855346625, - 1745338.2006591135, - 1799085.2773901545, - 1962727.7459788404, - 2062292.765536295, - 2062022.619822093, - 1998525.541490549, - 1951781.7027882366, - 2073244.6060197714, - 2170184.3085331875, - 2345670.7438213993, - 2419680.749045565, - 2564428.6125911484, - 2611647.94663547, - 2677572.3412232837, - 2712646.1421402646, - 2669836.443775896, - 2695810.577753632, - 2850919.1879373253, - 2888204.2180801993, - 2956934.4796271836, - 3110675.794163728, - 3132452.927692151, - 3196202.882035277, - 3245777.197982588, - 3467897.77705272, - 3397034.8941072645, - 3360528.2073719106, - 3167877.45102219, - 3148394.0849724086, - 3172969.800267024, - 3236482.5788294994, - 3211966.6917004376, - 3223207.8088259455, - 3287043.122145785, - 3348830.328607806, - 3351914.123209062, - 3252434.296787819, - 3186246.654015738, - 3193280.97199425, - 3232320.293209021, - 3276203.6541538397, - 3430532.9348887, - 3712105.8121324847, - 3682671.383322095, - 3865376.406002465, - 3694365.1393599855, - 3264406.1171078864, - 3174260.7664673645, - 3193314.2779219276, - 3218078.4437548383, - 3187289.36383374, - 3291267.301672883, - 3349607.364436662, - 3394994.635475159, - 2960817.512949546, - 2983529.1954296236, - 3020680.9577525235, - 3075772.611983511, - 3110377.7333300635, - 3080923.938821825, - 3005470.987537641, - 2874604.245730684, - 2523582.3354363823, - 2548246.9607630363, - 2574577.8142312737, - 2569529.4780399017, - 2557732.5498910584, - 2654017.2724419585, - 2727615.1677593254, - 3162393.910417833, - 3033915.2835804923, - 3042219.1293736715, - 3044346.2551538376, - 3183104.0397651973, - 3276392.0583753986, - 3346286.628405555, - 3377676.405095676, - 3403481.7869657674, - 3357113.7506425064, - 3286943.587626359, - 3194695.4608360226, - 3167147.5844435394, - 3015583.680582719, - 2974343.7373075425, - 2943554.114760183, - 2823701.3678920725, - 2756425.3681222294, - 2685724.9238567953, - 2569681.3560947916, - 2430845.358946567, - 2317777.0237180702, - 2235222.3321496085, - 2183254.806324774, - 2167488.1751276786, - 2162672.3005869472, - 2157713.6203886005, - 2215795.9802343296, - 2211498.9267810085, - 2243258.9963173144, - 2308215.1615122184, - 2394149.6233304804, - 2427497.599352035, - 2480527.457290253, - 2595478.538254234, - 2671645.5077971458, - 2644742.8704981864, - 2672656.1525989934, - 2612056.8164551784, - 2520849.3327877666, - 2397368.623268668, - 2265494.186925582, - 2194401.318589378, - 2208387.08766122, - 2109657.4636059864, - 1975525.1631335681, - 1891831.1775192895, - 1822128.522041517, - 1764645.5216019612, - 1751654.299037862, - 1777751.1259324509, - 1861401.435739354, - 1937228.1983441436, - 2014399.2524721224, - 2105404.516793885, - 2190740.4378617024, - 2332825.0138890212, - 2458232.2266246034, - 2590572.995159846, - 2650180.259576145, - 2718751.384592463, - 2742245.467509874, - 2797421.976445642, - 2810914.521059871, - 2758694.833537606, - 2718069.00534734, - 2649713.3611993534, - 2613716.044964591, - 2575371.971627379, - 2512807.097413098, - 2426086.6396908783, - 2356818.5059069307, - 2260398.8462971924, - 2199834.1110451743, - 2125817.6052448233, - 2111450.775628412, - 2122905.6812881553, - 2130687.830134622, - 2151196.723681874, - 2200377.5297741815, - 2255729.2678459743, - 2305631.175235148, - 2423079.8809822826, - 2504733.011070692, - 2514681.089031012, - 2576720.2946038023, - 2588051.953963773, - 2588051.953963773, - 2609641.022354862, - 2643989.1866590423, - 2672486.827898404, - 2677666.620111362, - 2681695.3473881073, - 2565874.647587114, - 2459361.383271105, - 2380009.066580876, - 2321413.665811567, - 2300418.996609084, - 2278788.887637867, - 2270285.215266654, - 2264464.664982276, - 2264464.664982276, - 2254087.865099839, - 2277211.869431884, - 2351116.6526507894, - 2469864.475490698, - 2486839.682360637, - 2600535.784918266, - 2691001.1914954972, - 2757572.1209330927, - 2821543.9549401114, - 2886541.4925011257, - 2901810.688381915, - 2898444.845529308, - 2943310.429365311, - 3054150.384392076, - 3119184.571635116, - 3182265.735517567, - 3281500.5296483636, - 3336750.6873666425, - 3361141.3655919693, - 3430526.5597672244, - 3431059.262509696, - 3481466.53673613, - 3522626.1944677983, - 3550379.483814652, - 3523835.8386276583, - 3480350.225704442, - 3589373.0823197174, - 3660543.6374649294, - 3733877.9581334307, - 3775701.318653374, - 3787137.8212799993, - 3901811.767767374, - 4051725.392813109, - 4114925.975707164, - 4133755.9366944516, - 4286039.795240116, - 4267098.907442302, - 4371833.038268267, - 4313562.917799573, - 4418683.9352128105, - 4492621.393200886, - 4499754.971636055, - 4407495.532641185, - 4423727.635645177, - 4372305.937981616, - 4419822.950909957, - 4417240.627632, - 4461292.70952692, - 4449589.884334079, - 4450434.909184094, - 4384517.706289662, - 4359142.104038439, - 4329047.191176373, - 4246420.036728099, - 4216731.138823887, - 4130329.2182317236, - 4234293.835548931, - 4193380.7601289805, - 4112471.701469017, - 4070621.322511269, - 4108598.805544132, - 4060739.736791912, - 3937445.9055401864, - 3883924.925677733, - 3758271.4968958246, - 3688457.0522876736, - 3480462.150925779, - 3287323.6720887492, - 3289308.2996599493, - 3267373.4544375488, - 3158402.1303756805, - 3179337.656105341, - 3162505.1761172977, - 3152409.1729576783, - 3056064.026781266, - 3025497.135310722, - 3103668.1008831956, - 3203293.7407728955, - 3267317.350565196, - 3305737.3610137836, - 3312140.1469182423, - 3356030.174667743, - 3357985.9910015725, - 3397490.4417773224, - 3500583.3479362386, - 3533920.0527265067, - 3578602.445341162, - 3621243.6395970043, - 3677422.2795737716, - 3718694.8884445885, - 3904526.4731218913, - 3962227.8566739657, - 4589512.15499225, - 4895415.831462017, - 5116346.886248358, - 4561664.621379178, - 4869974.637592036, - 5311546.539090925, - 5754977.838276843, - 6013297.4796125805, - 6247164.978429273, - 6894550.255286696, - 7044185.470620242, - 9275287.867494408, - 11138677.509507649, - 10534860.564406836, - 9369853.73333735, - 9246301.467808308, - 8998204.61323399, - 9139846.845927851, - 8178273.026911966, - 7668805.002884422, - 7184395.503060602, - 6625649.238903016, - 6338534.922336005, - 6228333.231672775, - 6084965.250045816, - 6014520.249231417, - 5952130.365678127, - 5298763.78958112, - 5640315.89706123, - 5863545.994330775, - 5762248.382687891, - 7142970.2402989855, - 6841256.6851076195, - 6593131.697736558, - 6223870.890021964, - 5822418.039577285, - 5656836.356714797, - 5719500.042655288, - 5628100.13172011, - 5220075.200992754, - 5064724.143760367, - 4864072.210357397, - 4743823.583631996, - 4499662.985067791, - 4369380.852851193, - 4292548.638904949, - 4084124.139168979, - 4048392.2271718956, - 3975525.976436877, - 3869921.654958192, - 3855269.96047477, - 3785602.5314321094, - 4004770.642176706, - 4183330.033112545, - 4362006.781618193, - 4642323.300781785, - 4761874.482353463, - 4938215.608677283, - 5079740.373595801, - 5328121.524087988, - 5312236.752741567, - 5107990.375027686, - 5102945.343794272, - 4871186.805527038, - 4299343.268221672, - 4489287.964660615, - 3960926.617446459, - 4054931.680724339, - 4202399.5077182455, - 4171994.484269061, - 3930053.02158636, - 3998159.328388707, - 4047022.1225683084, - 4494136.091889467, - 4670761.956917034, - 4777229.296382916, - 4779696.11596749, - 4830532.531199935, - 4405408.076380729, - 4616389.7325009, - 4655571.235716049, - 4669148.246089339, - 4810816.254157454, - 4934647.54346631, - 4738036.121388479, - 4871903.348661277, - 4972143.209780326, - 4914893.101761809, - 4962030.262508517, - 5050080.276422625, - 5138314.833820297, - 5298722.259531252, - 5458655.257306439, - 5620188.572794619, - 5453707.262618759, - 5550589.021370867, - 5598816.821174529, - 5672528.998799597, - 6159742.35917465, - 6100741.03248209, - 6100763.889498986, - 6203857.222734349, - 6305450.370806299, - 6366556.708195594, - 6392671.637276157, - 6528091.582116593, - 6498092.817438532, - 6600734.333800037, - 6637839.91981322, - 6436489.820045697, - 6427701.964670953, - 6348126.546885886, - 6346938.831605121, - 6551153.386386748, - 6759166.373439124, - 6989219.90209826, - 7055935.104367104, - 7160206.094049403, - 7128756.500964152, - 7313189.058781049, - 7167282.714860859, - 6621803.891811821, - 6821080.918329233, - 7520468.902883172, - 7585658.446425123, - 7485650.023817503, - 7614249.028456018, - 7636598.797510882, - 7597263.61788688, - 7566644.770548295, - 7749859.00039606, - 7974606.965569294, - 7850044.827370698, - 8120889.754444816, - 9018589.341398628, - 9035949.376204588, - 9169544.403275885, - 9381097.942823464, - 9276730.695804914, - 9113347.106691856, - 9530944.315159481, - 9299110.477300964, - 8958201.381188786, - 8971565.417545978, - 8874916.334712679, - 8858670.297943586, - 8623468.93601207, - 8638942.785028031, - 8638942.785028031, - 8691506.334262673, - 8754641.719240973, - 8734407.57422409, - 8660951.572544293, - 8603819.126793342, - 8996690.730863849, - 9182725.307722516, - 9437791.089723699, - 9751887.253502399, - 9751887.253502399, - 9919370.38088583, - 9973119.889020672, - 9985374.946877241, - 9992431.88076569, - 9862997.821564835, - 10255174.379685663, - 10496302.842841059, - 10449122.367132794, - 10517160.552693034, - 10733317.186604237, - 10907358.235201836, - 11090986.384111082, - 11380032.012677046, - 11464961.754668705, - 11931574.887328887, - 12086876.831153646, - 12205324.373571267, - 12333154.899515409, - 12659843.935957141, - 12721339.034891265, - 12726946.440194525, - 12724827.535494242, - 12941677.49850514, - 13024731.53853182, - 13111178.469229333, - 13075102.19310517, - 13114321.200564157, - 13002040.98414337, - 12831874.149149427, - 12632638.941670679, - 12496448.669187205, - 12268961.679477833, - 12005819.687481657, - 11699995.582595743, - 11575550.9231573 - ], - "yaxis": "y" - }, - { - "hovertemplate": "variable=CHOICE_SMOOTH
datetime=%{x}
value=%{y}", - "legendgroup": "CHOICE_SMOOTH", - "line": { - "color": "#FF6692", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "CHOICE_SMOOTH", - "showlegend": true, - "type": "scattergl", - "x": [ - "2017-01-05T00:00:00", - "2017-01-06T00:00:00", - "2017-01-09T00:00:00", - "2017-01-10T00:00:00", - "2017-01-11T00:00:00", - "2017-01-12T00:00:00", - "2017-01-13T00:00:00", - "2017-01-17T00:00:00", - "2017-01-18T00:00:00", - "2017-01-19T00:00:00", - "2017-01-20T00:00:00", - "2017-01-23T00:00:00", - "2017-01-24T00:00:00", - "2017-01-25T00:00:00", - "2017-01-26T00:00:00", - "2017-01-27T00:00:00", - "2017-01-30T00:00:00", - "2017-01-31T00:00:00", - "2017-02-01T00:00:00", - "2017-02-02T00:00:00", - "2017-02-03T00:00:00", - "2017-02-06T00:00:00", - "2017-02-07T00:00:00", - "2017-02-08T00:00:00", - "2017-02-09T00:00:00", - "2017-02-10T00:00:00", - "2017-02-13T00:00:00", - "2017-02-14T00:00:00", - "2017-02-15T00:00:00", - "2017-02-16T00:00:00", - "2017-02-17T00:00:00", - "2017-02-21T00:00:00", - "2017-02-22T00:00:00", - "2017-02-23T00:00:00", - "2017-02-24T00:00:00", - "2017-02-27T00:00:00", - "2017-02-28T00:00:00", - "2017-03-01T00:00:00", - "2017-03-02T00:00:00", - "2017-03-03T00:00:00", - "2017-03-06T00:00:00", - "2017-03-07T00:00:00", - "2017-03-08T00:00:00", - "2017-03-09T00:00:00", - "2017-03-10T00:00:00", - "2017-03-13T00:00:00", - "2017-03-14T00:00:00", - "2017-03-15T00:00:00", - "2017-03-16T00:00:00", - "2017-03-17T00:00:00", - "2017-03-20T00:00:00", - "2017-03-21T00:00:00", - "2017-03-22T00:00:00", - "2017-03-23T00:00:00", - "2017-03-24T00:00:00", - "2017-03-27T00:00:00", - "2017-03-28T00:00:00", - "2017-03-29T00:00:00", - "2017-03-30T00:00:00", - "2017-03-31T00:00:00", - "2017-04-03T00:00:00", - "2017-04-04T00:00:00", - "2017-04-05T00:00:00", - "2017-04-06T00:00:00", - "2017-04-07T00:00:00", - "2017-04-10T00:00:00", - "2017-04-11T00:00:00", - "2017-04-12T00:00:00", - "2017-04-13T00:00:00", - "2017-04-17T00:00:00", - "2017-04-18T00:00:00", - "2017-04-19T00:00:00", - "2017-04-20T00:00:00", - "2017-04-21T00:00:00", - "2017-04-24T00:00:00", - "2017-04-25T00:00:00", - "2017-04-26T00:00:00", - "2017-04-27T00:00:00", - "2017-04-28T00:00:00", - "2017-05-01T00:00:00", - "2017-05-02T00:00:00", - "2017-05-03T00:00:00", - "2017-05-04T00:00:00", - "2017-05-05T00:00:00", - "2017-05-08T00:00:00", - "2017-05-09T00:00:00", - "2017-05-10T00:00:00", - "2017-05-11T00:00:00", - "2017-05-12T00:00:00", - "2017-05-15T00:00:00", - "2017-05-16T00:00:00", - "2017-05-17T00:00:00", - "2017-05-18T00:00:00", - "2017-05-19T00:00:00", - "2017-05-22T00:00:00", - "2017-05-23T00:00:00", - "2017-05-24T00:00:00", - "2017-05-25T00:00:00", - "2017-05-26T00:00:00", - "2017-05-29T00:00:00", - "2017-05-30T00:00:00", - "2017-05-31T00:00:00", - "2017-06-01T00:00:00", - "2017-06-02T00:00:00", - "2017-06-05T00:00:00", - "2017-06-06T00:00:00", - "2017-06-07T00:00:00", - "2017-06-08T00:00:00", - "2017-06-09T00:00:00", - "2017-06-12T00:00:00", - "2017-06-13T00:00:00", - "2017-06-14T00:00:00", - "2017-06-15T00:00:00", - "2017-06-16T00:00:00", - "2017-06-19T00:00:00", - "2017-06-20T00:00:00", - "2017-06-21T00:00:00", - "2017-06-22T00:00:00", - "2017-06-23T00:00:00", - "2017-06-26T00:00:00", - "2017-06-27T00:00:00", - "2017-06-28T00:00:00", - "2017-06-29T00:00:00", - "2017-06-30T00:00:00", - "2017-07-03T00:00:00", - "2017-07-05T00:00:00", - "2017-07-06T00:00:00", - "2017-07-07T00:00:00", - "2017-07-10T00:00:00", - "2017-07-11T00:00:00", - "2017-07-12T00:00:00", - "2017-07-13T00:00:00", - "2017-07-14T00:00:00", - "2017-07-17T00:00:00", - "2017-07-18T00:00:00", - "2017-07-19T00:00:00", - "2017-07-20T00:00:00", - "2017-07-21T00:00:00", - "2017-07-24T00:00:00", - "2017-07-25T00:00:00", - "2017-07-26T00:00:00", - "2017-07-27T00:00:00", - "2017-07-28T00:00:00", - "2017-07-31T00:00:00", - "2017-08-01T00:00:00", - "2017-08-02T00:00:00", - "2017-08-03T00:00:00", - "2017-08-04T00:00:00", - "2017-08-07T00:00:00", - "2017-08-08T00:00:00", - "2017-08-09T00:00:00", - "2017-08-10T00:00:00", - "2017-08-11T00:00:00", - "2017-08-14T00:00:00", - "2017-08-15T00:00:00", - "2017-08-16T00:00:00", - "2017-08-17T00:00:00", - "2017-08-18T00:00:00", - "2017-08-21T00:00:00", - "2017-08-22T00:00:00", - "2017-08-23T00:00:00", - "2017-08-24T00:00:00", - "2017-08-25T00:00:00", - "2017-08-28T00:00:00", - "2017-08-29T00:00:00", - "2017-08-30T00:00:00", - "2017-08-31T00:00:00", - "2017-09-01T00:00:00", - "2017-09-05T00:00:00", - "2017-09-06T00:00:00", - "2017-09-07T00:00:00", - "2017-09-08T00:00:00", - "2017-09-11T00:00:00", - "2017-09-12T00:00:00", - "2017-09-13T00:00:00", - "2017-09-14T00:00:00", - "2017-09-15T00:00:00", - "2017-09-18T00:00:00", - "2017-09-19T00:00:00", - "2017-09-20T00:00:00", - "2017-09-21T00:00:00", - "2017-09-22T00:00:00", - "2017-09-25T00:00:00", - "2017-09-26T00:00:00", - "2017-09-27T00:00:00", - "2017-09-28T00:00:00", - "2017-09-29T00:00:00", - "2017-10-02T00:00:00", - "2017-10-03T00:00:00", - "2017-10-04T00:00:00", - "2017-10-05T00:00:00", - "2017-10-06T00:00:00", - "2017-10-09T00:00:00", - "2017-10-10T00:00:00", - "2017-10-11T00:00:00", - "2017-10-12T00:00:00", - "2017-10-13T00:00:00", - "2017-10-16T00:00:00", - "2017-10-17T00:00:00", - "2017-10-18T00:00:00", - "2017-10-19T00:00:00", - "2017-10-20T00:00:00", - "2017-10-23T00:00:00", - "2017-10-24T00:00:00", - "2017-10-25T00:00:00", - "2017-10-26T00:00:00", - "2017-10-27T00:00:00", - "2017-10-30T00:00:00", - "2017-10-31T00:00:00", - "2017-11-01T00:00:00", - "2017-11-02T00:00:00", - "2017-11-03T00:00:00", - "2017-11-06T00:00:00", - "2017-11-07T00:00:00", - "2017-11-08T00:00:00", - "2017-11-09T00:00:00", - "2017-11-10T00:00:00", - "2017-11-13T00:00:00", - "2017-11-14T00:00:00", - "2017-11-15T00:00:00", - "2017-11-16T00:00:00", - "2017-11-17T00:00:00", - "2017-11-20T00:00:00", - "2017-11-21T00:00:00", - "2017-11-22T00:00:00", - "2017-11-24T00:00:00", - "2017-11-27T00:00:00", - "2017-11-28T00:00:00", - "2017-11-29T00:00:00", - "2017-11-30T00:00:00", - "2017-12-01T00:00:00", - "2017-12-04T00:00:00", - "2017-12-05T00:00:00", - "2017-12-06T00:00:00", - "2017-12-07T00:00:00", - "2017-12-08T00:00:00", - "2017-12-11T00:00:00", - "2017-12-12T00:00:00", - "2017-12-13T00:00:00", - "2017-12-14T00:00:00", - "2017-12-15T00:00:00", - "2017-12-18T00:00:00", - "2017-12-19T00:00:00", - "2017-12-20T00:00:00", - "2017-12-21T00:00:00", - "2017-12-22T00:00:00", - "2017-12-26T00:00:00", - "2017-12-27T00:00:00", - "2017-12-28T00:00:00", - "2017-12-29T00:00:00", - "2018-01-01T00:00:00", - "2018-01-02T00:00:00", - "2018-01-04T00:00:00", - "2018-01-05T00:00:00", - "2018-01-08T00:00:00", - "2018-01-09T00:00:00", - "2018-01-10T00:00:00", - "2018-01-11T00:00:00", - "2018-01-12T00:00:00", - "2018-01-15T00:00:00", - "2018-01-16T00:00:00", - "2018-01-17T00:00:00", - "2018-01-18T00:00:00", - "2018-01-19T00:00:00", - "2018-01-22T00:00:00", - "2018-01-23T00:00:00", - "2018-01-24T00:00:00", - "2018-01-25T00:00:00", - "2018-01-26T00:00:00", - "2018-01-29T00:00:00", - "2018-01-30T00:00:00", - "2018-01-31T00:00:00", - "2018-02-01T00:00:00", - "2018-02-02T00:00:00", - "2018-02-05T00:00:00", - "2018-02-06T00:00:00", - "2018-02-07T00:00:00", - "2018-02-08T00:00:00", - "2018-02-09T00:00:00", - "2018-02-12T00:00:00", - "2018-02-13T00:00:00", - "2018-02-14T00:00:00", - "2018-02-15T00:00:00", - "2018-02-16T00:00:00", - "2018-02-20T00:00:00", - "2018-02-21T00:00:00", - "2018-02-22T00:00:00", - "2018-02-23T00:00:00", - "2018-02-26T00:00:00", - "2018-02-27T00:00:00", - "2018-02-28T00:00:00", - "2018-03-01T00:00:00", - "2018-03-02T00:00:00", - "2018-03-05T00:00:00", - "2018-03-06T00:00:00", - "2018-03-07T00:00:00", - "2018-03-08T00:00:00", - "2018-03-09T00:00:00", - "2018-03-12T00:00:00", - "2018-03-13T00:00:00", - "2018-03-14T00:00:00", - "2018-03-15T00:00:00", - "2018-03-16T00:00:00", - "2018-03-19T00:00:00", - "2018-03-20T00:00:00", - "2018-03-21T00:00:00", - "2018-03-22T00:00:00", - "2018-03-23T00:00:00", - "2018-03-26T00:00:00", - "2018-03-27T00:00:00", - "2018-03-28T00:00:00", - "2018-03-29T00:00:00", - "2018-04-02T00:00:00", - "2018-04-03T00:00:00", - "2018-04-04T00:00:00", - "2018-04-05T00:00:00", - "2018-04-06T00:00:00", - "2018-04-09T00:00:00", - "2018-04-10T00:00:00", - "2018-04-11T00:00:00", - "2018-04-12T00:00:00", - "2018-04-13T00:00:00", - "2018-04-16T00:00:00", - "2018-04-17T00:00:00", - "2018-04-18T00:00:00", - "2018-04-19T00:00:00", - "2018-04-20T00:00:00", - "2018-04-23T00:00:00", - "2018-04-24T00:00:00", - "2018-04-25T00:00:00", - "2018-04-26T00:00:00", - "2018-04-27T00:00:00", - "2018-04-30T00:00:00", - "2018-05-01T00:00:00", - "2018-05-02T00:00:00", - "2018-05-03T00:00:00", - "2018-05-04T00:00:00", - "2018-05-07T00:00:00", - "2018-05-08T00:00:00", - "2018-05-09T00:00:00", - "2018-05-10T00:00:00", - "2018-05-11T00:00:00", - "2018-05-14T00:00:00", - "2018-05-15T00:00:00", - "2018-05-16T00:00:00", - "2018-05-17T00:00:00", - "2018-05-18T00:00:00", - "2018-05-21T00:00:00", - "2018-05-22T00:00:00", - "2018-05-23T00:00:00", - "2018-05-24T00:00:00", - "2018-05-25T00:00:00", - "2018-05-28T00:00:00", - "2018-05-29T00:00:00", - "2018-05-30T00:00:00", - "2018-05-31T00:00:00", - "2018-06-01T00:00:00", - "2018-06-04T00:00:00", - "2018-06-05T00:00:00", - "2018-06-06T00:00:00", - "2018-06-07T00:00:00", - "2018-06-08T00:00:00", - "2018-06-11T00:00:00", - "2018-06-12T00:00:00", - "2018-06-13T00:00:00", - "2018-06-14T00:00:00", - "2018-06-15T00:00:00", - "2018-06-18T00:00:00", - "2018-06-19T00:00:00", - "2018-06-20T00:00:00", - "2018-06-21T00:00:00", - "2018-06-22T00:00:00", - "2018-06-25T00:00:00", - "2018-06-26T00:00:00", - "2018-06-27T00:00:00", - "2018-06-28T00:00:00", - "2018-06-29T00:00:00", - "2018-07-02T00:00:00", - "2018-07-03T00:00:00", - "2018-07-05T00:00:00", - "2018-07-06T00:00:00", - "2018-07-09T00:00:00", - "2018-07-10T00:00:00", - "2018-07-11T00:00:00", - "2018-07-12T00:00:00", - "2018-07-13T00:00:00", - "2018-07-16T00:00:00", - "2018-07-17T00:00:00", - "2018-07-18T00:00:00", - "2018-07-19T00:00:00", - "2018-07-20T00:00:00", - "2018-07-23T00:00:00", - "2018-07-24T00:00:00", - "2018-07-25T00:00:00", - "2018-07-26T00:00:00", - "2018-07-27T00:00:00", - "2018-07-30T00:00:00", - "2018-07-31T00:00:00", - "2018-08-01T00:00:00", - "2018-08-02T00:00:00", - "2018-08-03T00:00:00", - "2018-08-06T00:00:00", - "2018-08-07T00:00:00", - "2018-08-08T00:00:00", - "2018-08-09T00:00:00", - "2018-08-10T00:00:00", - "2018-08-13T00:00:00", - "2018-08-14T00:00:00", - "2018-08-15T00:00:00", - "2018-08-16T00:00:00", - "2018-08-17T00:00:00", - "2018-08-20T00:00:00", - "2018-08-21T00:00:00", - "2018-08-22T00:00:00", - "2018-08-23T00:00:00", - "2018-08-24T00:00:00", - "2018-08-27T00:00:00", - "2018-08-28T00:00:00", - "2018-08-29T00:00:00", - "2018-08-30T00:00:00", - "2018-08-31T00:00:00", - "2018-09-03T00:00:00", - "2018-09-04T00:00:00", - "2018-09-05T00:00:00", - "2018-09-06T00:00:00", - "2018-09-07T00:00:00", - "2018-09-10T00:00:00", - "2018-09-11T00:00:00", - "2018-09-12T00:00:00", - "2018-09-13T00:00:00", - "2018-09-14T00:00:00", - "2018-09-17T00:00:00", - "2018-09-18T00:00:00", - "2018-09-19T00:00:00", - "2018-09-20T00:00:00", - "2018-09-21T00:00:00", - "2018-09-24T00:00:00", - "2018-09-25T00:00:00", - "2018-09-26T00:00:00", - "2018-09-27T00:00:00", - "2018-09-28T00:00:00", - "2018-10-01T00:00:00", - "2018-10-02T00:00:00", - "2018-10-03T00:00:00", - "2018-10-04T00:00:00", - "2018-10-05T00:00:00", - "2018-10-08T00:00:00", - "2018-10-09T00:00:00", - "2018-10-10T00:00:00", - "2018-10-11T00:00:00", - "2018-10-12T00:00:00", - "2018-10-15T00:00:00", - "2018-10-16T00:00:00", - "2018-10-17T00:00:00", - "2018-10-18T00:00:00", - "2018-10-19T00:00:00", - "2018-10-22T00:00:00", - "2018-10-23T00:00:00", - "2018-10-24T00:00:00", - "2018-10-25T00:00:00", - "2018-10-26T00:00:00", - "2018-10-29T00:00:00", - "2018-10-30T00:00:00", - "2018-10-31T00:00:00", - "2018-11-01T00:00:00", - "2018-11-02T00:00:00", - "2018-11-05T00:00:00", - "2018-11-06T00:00:00", - "2018-11-07T00:00:00", - "2018-11-08T00:00:00", - "2018-11-09T00:00:00", - "2018-11-12T00:00:00", - "2018-11-13T00:00:00", - "2018-11-14T00:00:00", - "2018-11-15T00:00:00", - "2018-11-16T00:00:00", - "2018-11-19T00:00:00", - "2018-11-20T00:00:00", - "2018-11-21T00:00:00", - "2018-11-23T00:00:00", - "2018-11-26T00:00:00", - "2018-11-27T00:00:00", - "2018-11-28T00:00:00", - "2018-11-29T00:00:00", - "2018-11-30T00:00:00", - "2018-12-03T00:00:00", - "2018-12-04T00:00:00", - "2018-12-06T00:00:00", - "2018-12-07T00:00:00", - "2018-12-10T00:00:00", - "2018-12-11T00:00:00", - "2018-12-12T00:00:00", - "2018-12-13T00:00:00", - "2018-12-14T00:00:00", - "2018-12-17T00:00:00", - "2018-12-18T00:00:00", - "2018-12-19T00:00:00", - "2018-12-20T00:00:00", - "2018-12-21T00:00:00", - "2018-12-24T00:00:00", - "2018-12-26T00:00:00", - "2018-12-27T00:00:00", - "2018-12-28T00:00:00", - "2018-12-31T00:00:00", - "2019-01-01T00:00:00", - "2019-01-02T00:00:00", - "2019-01-04T00:00:00", - "2019-01-08T00:00:00", - "2019-01-09T00:00:00", - "2019-01-10T00:00:00", - "2019-01-11T00:00:00", - "2019-01-16T00:00:00", - "2019-01-18T00:00:00", - "2019-01-22T00:00:00", - "2019-01-23T00:00:00", - "2019-01-24T00:00:00", - "2019-01-28T00:00:00", - "2019-01-29T00:00:00", - "2019-01-30T00:00:00", - "2019-01-31T00:00:00", - "2019-02-01T00:00:00", - "2019-02-04T00:00:00", - "2019-02-05T00:00:00", - "2019-02-06T00:00:00", - "2019-02-07T00:00:00", - "2019-02-08T00:00:00", - "2019-02-11T00:00:00", - "2019-02-12T00:00:00", - "2019-02-13T00:00:00", - "2019-02-14T00:00:00", - "2019-02-15T00:00:00", - "2019-02-18T00:00:00", - "2019-02-19T00:00:00", - "2019-02-20T00:00:00", - "2019-02-21T00:00:00", - "2019-02-22T00:00:00", - "2019-02-25T00:00:00", - "2019-02-26T00:00:00", - "2019-02-27T00:00:00", - "2019-02-28T00:00:00", - "2019-03-01T00:00:00", - "2019-03-04T00:00:00", - "2019-03-05T00:00:00", - "2019-03-06T00:00:00", - "2019-03-07T00:00:00", - "2019-03-08T00:00:00", - "2019-03-11T00:00:00", - "2019-03-12T00:00:00", - "2019-03-13T00:00:00", - "2019-03-14T00:00:00", - "2019-03-15T00:00:00", - "2019-03-18T00:00:00", - "2019-03-19T00:00:00", - "2019-03-20T00:00:00", - "2019-03-21T00:00:00", - "2019-03-22T00:00:00", - "2019-03-25T00:00:00", - "2019-03-26T00:00:00", - "2019-03-27T00:00:00", - "2019-03-28T00:00:00", - "2019-03-29T00:00:00", - "2019-04-01T00:00:00", - "2019-04-02T00:00:00", - "2019-04-03T00:00:00", - "2019-04-04T00:00:00", - "2019-04-05T00:00:00", - "2019-04-08T00:00:00", - "2019-04-09T00:00:00", - "2019-04-10T00:00:00", - "2019-04-11T00:00:00", - "2019-04-12T00:00:00", - "2019-04-15T00:00:00", - "2019-04-16T00:00:00", - "2019-04-17T00:00:00", - "2019-04-18T00:00:00", - "2019-04-19T00:00:00", - "2019-04-22T00:00:00", - "2019-04-23T00:00:00", - "2019-04-24T00:00:00", - "2019-04-25T00:00:00", - "2019-04-26T00:00:00", - "2019-04-29T00:00:00", - "2019-04-30T00:00:00", - "2019-05-01T00:00:00", - "2019-05-02T00:00:00", - "2019-05-03T00:00:00", - "2019-05-06T00:00:00", - "2019-05-07T00:00:00", - "2019-05-08T00:00:00", - "2019-05-09T00:00:00", - "2019-05-10T00:00:00", - "2019-05-13T00:00:00", - "2019-05-14T00:00:00", - "2019-05-15T00:00:00", - "2019-05-16T00:00:00", - "2019-05-17T00:00:00", - "2019-05-20T00:00:00", - "2019-05-21T00:00:00", - "2019-05-22T00:00:00", - "2019-05-23T00:00:00", - "2019-05-24T00:00:00", - "2019-05-28T00:00:00", - "2019-05-29T00:00:00", - "2019-05-30T00:00:00", - "2019-05-31T00:00:00", - "2019-06-03T00:00:00", - "2019-06-04T00:00:00", - "2019-06-05T00:00:00", - "2019-06-06T00:00:00", - "2019-06-07T00:00:00", - "2019-06-10T00:00:00", - "2019-06-11T00:00:00", - "2019-06-12T00:00:00", - "2019-06-13T00:00:00", - "2019-06-14T00:00:00", - "2019-06-17T00:00:00", - "2019-06-18T00:00:00", - "2019-06-19T00:00:00", - "2019-06-20T00:00:00", - "2019-06-21T00:00:00", - "2019-06-24T00:00:00", - "2019-06-25T00:00:00", - "2019-06-26T00:00:00", - "2019-06-27T00:00:00", - "2019-06-28T00:00:00", - "2019-07-01T00:00:00", - "2019-07-02T00:00:00", - "2019-07-03T00:00:00", - "2019-07-04T00:00:00", - "2019-07-05T00:00:00", - "2019-07-08T00:00:00", - "2019-07-09T00:00:00", - "2019-07-10T00:00:00", - "2019-07-11T00:00:00", - "2019-07-12T00:00:00", - "2019-07-15T00:00:00", - "2019-07-16T00:00:00", - "2019-07-17T00:00:00", - "2019-07-18T00:00:00", - "2019-07-19T00:00:00", - "2019-07-22T00:00:00", - "2019-07-23T00:00:00", - "2019-07-24T00:00:00", - "2019-07-25T00:00:00", - "2019-07-26T00:00:00", - "2019-07-29T00:00:00", - "2019-07-30T00:00:00", - "2019-07-31T00:00:00", - "2019-08-01T00:00:00", - "2019-08-02T00:00:00", - "2019-08-05T00:00:00", - "2019-08-06T00:00:00", - "2019-08-07T00:00:00", - "2019-08-08T00:00:00", - "2019-08-09T00:00:00", - "2019-08-12T00:00:00", - "2019-08-13T00:00:00", - "2019-08-14T00:00:00", - "2019-08-15T00:00:00", - "2019-08-16T00:00:00", - "2019-08-19T00:00:00", - "2019-08-20T00:00:00", - "2019-08-21T00:00:00", - "2019-08-22T00:00:00", - "2019-08-23T00:00:00", - "2019-08-26T00:00:00", - "2019-08-27T00:00:00", - "2019-08-28T00:00:00", - "2019-08-29T00:00:00", - "2019-08-30T00:00:00", - "2019-09-03T00:00:00", - "2019-09-04T00:00:00", - "2019-09-05T00:00:00", - "2019-09-06T00:00:00", - "2019-09-09T00:00:00", - "2019-09-10T00:00:00", - "2019-09-11T00:00:00", - "2019-09-12T00:00:00", - "2019-09-13T00:00:00", - "2019-09-16T00:00:00", - "2019-09-17T00:00:00", - "2019-09-18T00:00:00", - "2019-09-19T00:00:00", - "2019-09-20T00:00:00", - "2019-09-23T00:00:00", - "2019-09-24T00:00:00", - "2019-09-25T00:00:00", - "2019-09-26T00:00:00", - "2019-09-27T00:00:00", - "2019-09-30T00:00:00", - "2019-10-01T00:00:00", - "2019-10-02T00:00:00", - "2019-10-03T00:00:00", - "2019-10-04T00:00:00", - "2019-10-07T00:00:00", - "2019-10-08T00:00:00", - "2019-10-09T00:00:00", - "2019-10-10T00:00:00", - "2019-10-11T00:00:00", - "2019-10-14T00:00:00", - "2019-10-15T00:00:00", - "2019-10-16T00:00:00", - "2019-10-17T00:00:00", - "2019-10-18T00:00:00", - "2019-10-21T00:00:00", - "2019-10-22T00:00:00", - "2019-10-23T00:00:00", - "2019-10-24T00:00:00", - "2019-10-25T00:00:00", - "2019-10-28T00:00:00", - "2019-10-29T00:00:00", - "2019-10-30T00:00:00", - "2019-10-31T00:00:00", - "2019-11-01T00:00:00", - "2019-11-04T00:00:00", - "2019-11-05T00:00:00", - "2019-11-06T00:00:00", - "2019-11-07T00:00:00", - "2019-11-08T00:00:00", - "2019-11-11T00:00:00", - "2019-11-12T00:00:00", - "2019-11-13T00:00:00", - "2019-11-14T00:00:00", - "2019-11-15T00:00:00", - "2019-11-18T00:00:00", - "2019-11-19T00:00:00", - "2019-11-20T00:00:00", - "2019-11-21T00:00:00", - "2019-11-22T00:00:00", - "2019-11-25T00:00:00", - "2019-11-26T00:00:00", - "2019-11-27T00:00:00", - "2019-11-28T00:00:00", - "2019-11-29T00:00:00", - "2019-12-02T00:00:00", - "2019-12-03T00:00:00", - "2019-12-04T00:00:00", - "2019-12-05T00:00:00", - "2019-12-06T00:00:00", - "2019-12-09T00:00:00", - "2019-12-10T00:00:00", - "2019-12-11T00:00:00", - "2019-12-12T00:00:00", - "2019-12-13T00:00:00", - "2019-12-16T00:00:00", - "2019-12-17T00:00:00", - "2019-12-18T00:00:00", - "2019-12-19T00:00:00", - "2019-12-20T00:00:00", - "2019-12-23T00:00:00", - "2019-12-24T00:00:00", - "2019-12-26T00:00:00", - "2019-12-27T00:00:00", - "2019-12-30T00:00:00", - "2019-12-31T00:00:00", - "2020-01-01T00:00:00", - "2020-01-02T00:00:00", - "2020-01-06T00:00:00", - "2020-01-07T00:00:00", - "2020-01-08T00:00:00", - "2020-01-09T00:00:00", - "2020-01-10T00:00:00", - "2020-01-13T00:00:00", - "2020-01-14T00:00:00", - "2020-01-15T00:00:00", - "2020-01-16T00:00:00", - "2020-01-17T00:00:00", - "2020-01-21T00:00:00", - "2020-01-22T00:00:00", - "2020-01-23T00:00:00", - "2020-01-24T00:00:00", - "2020-01-27T00:00:00", - "2020-01-28T00:00:00", - "2020-01-29T00:00:00", - "2020-01-30T00:00:00", - "2020-01-31T00:00:00", - "2020-02-03T00:00:00", - "2020-02-04T00:00:00", - "2020-02-05T00:00:00", - "2020-02-06T00:00:00", - "2020-02-07T00:00:00", - "2020-02-10T00:00:00", - "2020-02-11T00:00:00", - "2020-02-12T00:00:00", - "2020-02-13T00:00:00", - "2020-02-14T00:00:00", - "2020-02-18T00:00:00", - "2020-02-19T00:00:00", - "2020-02-20T00:00:00", - "2020-02-21T00:00:00", - "2020-02-24T00:00:00", - "2020-02-25T00:00:00", - "2020-02-26T00:00:00", - "2020-02-27T00:00:00", - "2020-02-28T00:00:00", - "2020-03-02T00:00:00", - "2020-03-03T00:00:00", - "2020-03-04T00:00:00", - "2020-03-05T00:00:00", - "2020-03-06T00:00:00", - "2020-03-09T00:00:00", - "2020-03-10T00:00:00", - "2020-03-11T00:00:00", - "2020-03-12T00:00:00", - "2020-03-13T00:00:00", - "2020-03-16T00:00:00", - "2020-03-17T00:00:00", - "2020-03-18T00:00:00", - "2020-03-19T00:00:00", - "2020-03-20T00:00:00", - "2020-03-23T00:00:00", - "2020-03-24T00:00:00", - "2020-03-25T00:00:00", - "2020-03-26T00:00:00", - "2020-03-27T00:00:00", - "2020-03-30T00:00:00", - "2020-03-31T00:00:00", - "2020-04-01T00:00:00", - "2020-04-02T00:00:00", - "2020-04-03T00:00:00", - "2020-04-06T00:00:00", - "2020-04-07T00:00:00", - "2020-04-08T00:00:00", - "2020-04-09T00:00:00", - "2020-04-13T00:00:00", - "2020-04-14T00:00:00", - "2020-04-15T00:00:00", - "2020-04-16T00:00:00", - "2020-04-17T00:00:00", - "2020-04-20T00:00:00", - "2020-04-21T00:00:00", - "2020-04-22T00:00:00", - "2020-04-23T00:00:00", - "2020-04-24T00:00:00", - "2020-04-27T00:00:00", - "2020-04-28T00:00:00", - "2020-04-29T00:00:00", - "2020-04-30T00:00:00", - "2020-05-01T00:00:00", - "2020-05-04T00:00:00", - "2020-05-05T00:00:00", - "2020-05-06T00:00:00", - "2020-05-07T00:00:00", - "2020-05-08T00:00:00", - "2020-05-11T00:00:00", - "2020-05-12T00:00:00", - "2020-05-13T00:00:00", - "2020-05-14T00:00:00", - "2020-05-15T00:00:00", - "2020-05-18T00:00:00", - "2020-05-19T00:00:00", - "2020-05-20T00:00:00", - "2020-05-21T00:00:00", - "2020-05-22T00:00:00", - "2020-05-26T00:00:00", - "2020-05-27T00:00:00", - "2020-05-28T00:00:00", - "2020-05-29T00:00:00", - "2020-06-01T00:00:00", - "2020-06-02T00:00:00", - "2020-06-03T00:00:00", - "2020-06-04T00:00:00", - "2020-06-05T00:00:00", - "2020-06-08T00:00:00", - "2020-06-09T00:00:00", - "2020-06-10T00:00:00", - "2020-06-11T00:00:00", - "2020-06-12T00:00:00", - "2020-06-15T00:00:00", - "2020-06-16T00:00:00", - "2020-06-17T00:00:00", - "2020-06-18T00:00:00", - "2020-06-19T00:00:00", - "2020-06-22T00:00:00", - "2020-06-23T00:00:00", - "2020-06-24T00:00:00", - "2020-06-25T00:00:00", - "2020-06-26T00:00:00", - "2020-06-29T00:00:00", - "2020-06-30T00:00:00", - "2020-07-01T00:00:00", - "2020-07-02T00:00:00", - "2020-07-06T00:00:00", - "2020-07-07T00:00:00", - "2020-07-08T00:00:00", - "2020-07-09T00:00:00", - "2020-07-10T00:00:00", - "2020-07-13T00:00:00", - "2020-07-14T00:00:00", - "2020-07-15T00:00:00", - "2020-07-16T00:00:00", - "2020-07-17T00:00:00", - "2020-07-20T00:00:00", - "2020-07-21T00:00:00", - "2020-07-22T00:00:00", - "2020-07-23T00:00:00", - "2020-07-24T00:00:00", - "2020-07-27T00:00:00", - "2020-07-28T00:00:00", - "2020-07-29T00:00:00", - "2020-07-30T00:00:00", - "2020-07-31T00:00:00", - "2020-08-03T00:00:00", - "2020-08-04T00:00:00", - "2020-08-05T00:00:00", - "2020-08-06T00:00:00", - "2020-08-07T00:00:00", - "2020-08-10T00:00:00", - "2020-08-11T00:00:00", - "2020-08-12T00:00:00", - "2020-08-13T00:00:00", - "2020-08-14T00:00:00", - "2020-08-17T00:00:00", - "2020-08-18T00:00:00", - "2020-08-19T00:00:00", - "2020-08-20T00:00:00", - "2020-08-21T00:00:00", - "2020-08-24T00:00:00", - "2020-08-25T00:00:00", - "2020-08-26T00:00:00", - "2020-08-27T00:00:00", - "2020-08-28T00:00:00", - "2020-08-31T00:00:00", - "2020-09-01T00:00:00", - "2020-09-02T00:00:00", - "2020-09-03T00:00:00", - "2020-09-04T00:00:00", - "2020-09-08T00:00:00", - "2020-09-09T00:00:00", - "2020-09-10T00:00:00", - "2020-09-11T00:00:00", - "2020-09-14T00:00:00", - "2020-09-15T00:00:00", - "2020-09-16T00:00:00", - "2020-09-17T00:00:00", - "2020-09-18T00:00:00", - "2020-09-21T00:00:00", - "2020-09-22T00:00:00", - "2020-09-23T00:00:00", - "2020-09-24T00:00:00", - "2020-09-25T00:00:00", - "2020-09-28T00:00:00", - "2020-09-29T00:00:00", - "2020-09-30T00:00:00", - "2020-10-01T00:00:00", - "2020-10-02T00:00:00", - "2020-10-05T00:00:00", - "2020-10-06T00:00:00", - "2020-10-07T00:00:00", - "2020-10-08T00:00:00", - "2020-10-09T00:00:00", - "2020-10-12T00:00:00", - "2020-10-13T00:00:00", - "2020-10-14T00:00:00", - "2020-10-15T00:00:00", - "2020-10-16T00:00:00", - "2020-10-19T00:00:00", - "2020-10-20T00:00:00", - "2020-10-21T00:00:00", - "2020-10-22T00:00:00", - "2020-10-23T00:00:00", - "2020-10-26T00:00:00", - "2020-10-27T00:00:00", - "2020-10-28T00:00:00", - "2020-10-29T00:00:00", - "2020-10-30T00:00:00", - "2020-11-02T00:00:00", - "2020-11-03T00:00:00", - "2020-11-04T00:00:00", - "2020-11-05T00:00:00", - "2020-11-06T00:00:00", - "2020-11-09T00:00:00", - "2020-11-10T00:00:00", - "2020-11-11T00:00:00", - "2020-11-12T00:00:00", - "2020-11-13T00:00:00", - "2020-11-16T00:00:00", - "2020-11-17T00:00:00", - "2020-11-18T00:00:00", - "2020-11-19T00:00:00", - "2020-11-20T00:00:00", - "2020-11-23T00:00:00", - "2020-11-24T00:00:00", - "2020-11-25T00:00:00", - "2020-11-27T00:00:00", - "2020-11-30T00:00:00", - "2020-12-01T00:00:00", - "2020-12-02T00:00:00", - "2020-12-03T00:00:00", - "2020-12-04T00:00:00", - "2020-12-07T00:00:00", - "2020-12-08T00:00:00", - "2020-12-09T00:00:00", - "2020-12-10T00:00:00", - "2020-12-11T00:00:00", - "2020-12-14T00:00:00", - "2020-12-15T00:00:00", - "2020-12-16T00:00:00", - "2020-12-17T00:00:00", - "2020-12-18T00:00:00", - "2020-12-21T00:00:00", - "2020-12-22T00:00:00", - "2020-12-23T00:00:00", - "2020-12-24T00:00:00", - "2020-12-28T00:00:00", - "2020-12-29T00:00:00", - "2020-12-30T00:00:00", - "2020-12-31T00:00:00", - "2021-01-01T00:00:00", - "2021-01-04T00:00:00", - "2021-01-06T00:00:00", - "2021-01-07T00:00:00", - "2021-01-08T00:00:00", - "2021-01-11T00:00:00", - "2021-01-12T00:00:00", - "2021-01-13T00:00:00", - "2021-01-14T00:00:00", - "2021-01-15T00:00:00", - "2021-01-19T00:00:00", - "2021-01-20T00:00:00", - "2021-01-21T00:00:00", - "2021-01-22T00:00:00", - "2021-01-25T00:00:00", - "2021-01-26T00:00:00", - "2021-01-27T00:00:00", - "2021-01-28T00:00:00", - "2021-01-29T00:00:00", - "2021-02-01T00:00:00", - "2021-02-02T00:00:00", - "2021-02-03T00:00:00", - "2021-02-04T00:00:00", - "2021-02-05T00:00:00", - "2021-02-08T00:00:00", - "2021-02-09T00:00:00", - "2021-02-10T00:00:00", - "2021-02-11T00:00:00", - "2021-02-12T00:00:00", - "2021-02-16T00:00:00", - "2021-02-17T00:00:00", - "2021-02-18T00:00:00", - "2021-02-19T00:00:00", - "2021-02-22T00:00:00", - "2021-02-23T00:00:00", - "2021-02-24T00:00:00", - "2021-02-25T00:00:00", - "2021-02-26T00:00:00", - "2021-03-01T00:00:00", - "2021-03-02T00:00:00", - "2021-03-03T00:00:00", - "2021-03-04T00:00:00", - "2021-03-05T00:00:00", - "2021-03-08T00:00:00", - "2021-03-09T00:00:00", - "2021-03-10T00:00:00", - "2021-03-11T00:00:00", - "2021-03-12T00:00:00", - "2021-03-15T00:00:00", - "2021-03-16T00:00:00", - "2021-03-17T00:00:00", - "2021-03-18T00:00:00", - "2021-03-19T00:00:00", - "2021-03-22T00:00:00", - "2021-03-23T00:00:00", - "2021-03-24T00:00:00", - "2021-03-25T00:00:00", - "2021-03-26T00:00:00", - "2021-03-29T00:00:00", - "2021-03-30T00:00:00", - "2021-03-31T00:00:00", - "2021-04-01T00:00:00", - "2021-04-05T00:00:00", - "2021-04-06T00:00:00", - "2021-04-07T00:00:00", - "2021-04-08T00:00:00", - "2021-04-09T00:00:00", - "2021-04-12T00:00:00", - "2021-04-13T00:00:00", - "2021-04-14T00:00:00", - "2021-04-15T00:00:00", - "2021-04-16T00:00:00", - "2021-04-19T00:00:00", - "2021-04-20T00:00:00", - "2021-04-21T00:00:00", - "2021-04-22T00:00:00", - "2021-04-23T00:00:00", - "2021-04-26T00:00:00", - "2021-04-27T00:00:00", - "2021-04-28T00:00:00", - "2021-04-29T00:00:00", - "2021-04-30T00:00:00", - "2021-05-03T00:00:00", - "2021-05-04T00:00:00", - "2021-05-05T00:00:00", - "2021-05-06T00:00:00", - "2021-05-07T00:00:00", - "2021-05-10T00:00:00", - "2021-05-11T00:00:00", - "2021-05-12T00:00:00", - "2021-05-13T00:00:00", - "2021-05-14T00:00:00", - "2021-05-17T00:00:00", - "2021-05-18T00:00:00", - "2021-05-19T00:00:00", - "2021-05-20T00:00:00", - "2021-05-21T00:00:00", - "2021-05-24T00:00:00", - "2021-05-25T00:00:00", - "2021-05-26T00:00:00", - "2021-05-27T00:00:00", - "2021-05-28T00:00:00", - "2021-06-01T00:00:00", - "2021-06-02T00:00:00", - "2021-06-03T00:00:00", - "2021-06-04T00:00:00", - "2021-06-07T00:00:00", - "2021-06-08T00:00:00", - "2021-06-09T00:00:00", - "2021-06-10T00:00:00", - "2021-06-11T00:00:00", - "2021-06-14T00:00:00", - "2021-06-15T00:00:00", - "2021-06-16T00:00:00", - "2021-06-17T00:00:00", - "2021-06-18T00:00:00", - "2021-06-21T00:00:00", - "2021-06-22T00:00:00", - "2021-06-23T00:00:00", - "2021-06-24T00:00:00", - "2021-06-25T00:00:00", - "2021-06-28T00:00:00", - "2021-06-29T00:00:00", - "2021-06-30T00:00:00", - "2021-07-01T00:00:00", - "2021-07-02T00:00:00", - "2021-07-05T00:00:00", - "2021-07-06T00:00:00", - "2021-07-07T00:00:00", - "2021-07-08T00:00:00", - "2021-07-09T00:00:00", - "2021-07-12T00:00:00", - "2021-07-13T00:00:00", - "2021-07-14T00:00:00", - "2021-07-15T00:00:00", - "2021-07-16T00:00:00", - "2021-07-19T00:00:00", - "2021-07-20T00:00:00", - "2021-07-21T00:00:00", - "2021-07-22T00:00:00", - "2021-07-23T00:00:00", - "2021-07-26T00:00:00", - "2021-07-27T00:00:00", - "2021-07-28T00:00:00", - "2021-07-29T00:00:00", - "2021-07-30T00:00:00", - "2021-08-02T00:00:00", - "2021-08-03T00:00:00", - "2021-08-04T00:00:00", - "2021-08-05T00:00:00", - "2021-08-06T00:00:00", - "2021-08-09T00:00:00", - "2021-08-10T00:00:00", - "2021-08-11T00:00:00", - "2021-08-12T00:00:00", - "2021-08-13T00:00:00", - "2021-08-16T00:00:00", - "2021-08-17T00:00:00", - "2021-08-18T00:00:00", - "2021-08-19T00:00:00", - "2021-08-20T00:00:00", - "2021-08-23T00:00:00", - "2021-08-24T00:00:00", - "2021-08-25T00:00:00", - "2021-08-26T00:00:00", - "2021-08-27T00:00:00", - "2021-08-30T00:00:00", - "2021-08-31T00:00:00", - "2021-09-01T00:00:00", - "2021-09-02T00:00:00", - "2021-09-03T00:00:00", - "2021-09-07T00:00:00", - "2021-09-08T00:00:00", - "2021-09-09T00:00:00", - "2021-09-10T00:00:00", - "2021-09-13T00:00:00", - "2021-09-14T00:00:00", - "2021-09-15T00:00:00", - "2021-09-16T00:00:00", - "2021-09-17T00:00:00", - "2021-09-20T00:00:00", - "2021-09-21T00:00:00", - "2021-09-22T00:00:00", - "2021-09-23T00:00:00", - "2021-09-24T00:00:00", - "2021-09-27T00:00:00", - "2021-09-28T00:00:00", - "2021-09-29T00:00:00", - "2021-09-30T00:00:00", - "2021-10-01T00:00:00", - "2021-10-04T00:00:00", - "2021-10-05T00:00:00", - "2021-10-06T00:00:00", - "2021-10-07T00:00:00", - "2021-10-08T00:00:00", - "2021-10-11T00:00:00", - "2021-10-12T00:00:00", - "2021-10-13T00:00:00", - "2021-10-14T00:00:00", - "2021-10-15T00:00:00", - "2021-10-18T00:00:00", - "2021-10-19T00:00:00", - "2021-10-20T00:00:00", - "2021-10-21T00:00:00", - "2021-10-22T00:00:00", - "2021-10-25T00:00:00", - "2021-10-26T00:00:00", - "2021-10-27T00:00:00", - "2021-10-28T00:00:00", - "2021-10-29T00:00:00", - "2021-11-01T00:00:00", - "2021-11-02T00:00:00", - "2021-11-03T00:00:00", - "2021-11-04T00:00:00", - "2021-11-05T00:00:00", - "2021-11-08T00:00:00", - "2021-11-09T00:00:00", - "2021-11-10T00:00:00", - "2021-11-11T00:00:00", - "2021-11-12T00:00:00", - "2021-11-15T00:00:00", - "2021-11-16T00:00:00", - "2021-11-17T00:00:00", - "2021-11-18T00:00:00", - "2021-11-19T00:00:00", - "2021-11-22T00:00:00", - "2021-11-23T00:00:00", - "2021-11-24T00:00:00", - "2021-11-25T00:00:00", - "2021-11-26T00:00:00", - "2021-11-29T00:00:00", - "2021-11-30T00:00:00", - "2021-12-01T00:00:00", - "2021-12-02T00:00:00", - "2021-12-03T00:00:00", - "2021-12-06T00:00:00", - "2021-12-07T00:00:00", - "2021-12-08T00:00:00", - "2021-12-09T00:00:00", - "2021-12-10T00:00:00", - "2021-12-13T00:00:00", - "2021-12-14T00:00:00", - "2021-12-15T00:00:00", - "2021-12-16T00:00:00", - "2021-12-17T00:00:00", - "2021-12-20T00:00:00", - "2021-12-21T00:00:00", - "2021-12-22T00:00:00", - "2021-12-23T00:00:00", - "2021-12-27T00:00:00", - "2021-12-28T00:00:00", - "2021-12-29T00:00:00", - "2021-12-30T00:00:00", - "2021-12-31T00:00:00", - "2022-01-03T00:00:00", - "2022-01-05T00:00:00", - "2022-01-06T00:00:00", - "2022-01-07T00:00:00", - "2022-01-10T00:00:00", - "2022-01-11T00:00:00", - "2022-01-12T00:00:00", - "2022-01-13T00:00:00", - "2022-01-14T00:00:00", - "2022-01-18T00:00:00", - "2022-01-19T00:00:00", - "2022-01-20T00:00:00", - "2022-01-21T00:00:00", - "2022-01-24T00:00:00", - "2022-01-25T00:00:00", - "2022-01-26T00:00:00", - "2022-01-27T00:00:00", - "2022-01-28T00:00:00", - "2022-01-31T00:00:00", - "2022-02-01T00:00:00", - "2022-02-02T00:00:00", - "2022-02-03T00:00:00", - "2022-02-04T00:00:00", - "2022-02-07T00:00:00", - "2022-02-08T00:00:00", - "2022-02-09T00:00:00", - "2022-02-10T00:00:00", - "2022-02-11T00:00:00", - "2022-02-14T00:00:00", - "2022-02-15T00:00:00", - "2022-02-16T00:00:00", - "2022-02-17T00:00:00", - "2022-02-18T00:00:00", - "2022-02-22T00:00:00", - "2022-02-23T00:00:00", - "2022-02-24T00:00:00", - "2022-02-25T00:00:00", - "2022-02-28T00:00:00", - "2022-03-01T00:00:00", - "2022-03-02T00:00:00", - "2022-03-03T00:00:00", - "2022-03-04T00:00:00", - "2022-03-07T00:00:00", - "2022-03-08T00:00:00", - "2022-03-09T00:00:00", - "2022-03-10T00:00:00", - "2022-03-11T00:00:00", - "2022-03-14T00:00:00", - "2022-03-15T00:00:00", - "2022-03-16T00:00:00", - "2022-03-17T00:00:00", - "2022-03-18T00:00:00", - "2022-03-21T00:00:00", - "2022-03-22T00:00:00", - "2022-03-23T00:00:00", - "2022-03-24T00:00:00", - "2022-03-25T00:00:00", - "2022-03-28T00:00:00", - "2022-03-29T00:00:00", - "2022-03-30T00:00:00", - "2022-03-31T00:00:00", - "2022-04-01T00:00:00", - "2022-04-04T00:00:00", - "2022-04-05T00:00:00", - "2022-04-06T00:00:00", - "2022-04-07T00:00:00", - "2022-04-08T00:00:00", - "2022-04-11T00:00:00", - "2022-04-12T00:00:00", - "2022-04-13T00:00:00", - "2022-04-14T00:00:00", - "2022-04-18T00:00:00", - "2022-04-19T00:00:00", - "2022-04-20T00:00:00", - "2022-04-21T00:00:00", - "2022-04-22T00:00:00", - "2022-04-25T00:00:00", - "2022-04-26T00:00:00", - "2022-04-27T00:00:00", - "2022-04-28T00:00:00", - "2022-04-29T00:00:00", - "2022-05-03T00:00:00", - "2022-05-04T00:00:00", - "2022-05-05T00:00:00", - "2022-05-06T00:00:00", - "2022-05-09T00:00:00", - "2022-05-10T00:00:00", - "2022-08-01T00:00:00", - "2022-08-02T00:00:00", - "2022-08-03T00:00:00", - "2022-08-04T00:00:00", - "2022-08-05T00:00:00", - "2022-08-08T00:00:00", - "2022-08-09T00:00:00", - "2022-08-10T00:00:00", - "2022-08-11T00:00:00", - "2022-08-12T00:00:00", - "2022-08-15T00:00:00", - "2022-08-16T00:00:00", - "2022-08-17T00:00:00", - "2022-08-18T00:00:00", - "2022-08-19T00:00:00", - "2022-08-22T00:00:00", - "2022-08-23T00:00:00", - "2022-08-24T00:00:00", - "2022-08-25T00:00:00", - "2022-08-26T00:00:00", - "2022-08-29T00:00:00", - "2022-08-30T00:00:00", - "2022-08-31T00:00:00", - "2022-09-01T00:00:00", - "2022-09-02T00:00:00", - "2022-09-06T00:00:00", - "2022-09-07T00:00:00", - "2022-09-14T00:00:00", - "2022-09-15T00:00:00", - "2022-10-27T00:00:00", - "2022-10-28T00:00:00", - "2022-10-31T00:00:00", - "2022-11-01T00:00:00", - "2022-11-02T00:00:00", - "2022-11-03T00:00:00", - "2022-11-04T00:00:00", - "2022-11-14T00:00:00", - "2022-11-15T00:00:00", - "2022-11-16T00:00:00", - "2022-11-17T00:00:00", - "2022-11-18T00:00:00", - "2022-11-21T00:00:00", - "2022-11-22T00:00:00", - "2022-11-23T00:00:00", - "2022-11-25T00:00:00", - "2022-11-28T00:00:00", - "2022-11-29T00:00:00", - "2022-11-30T00:00:00", - "2022-12-01T00:00:00", - "2022-12-02T00:00:00", - "2022-12-05T00:00:00", - "2022-12-06T00:00:00", - "2022-12-07T00:00:00", - "2022-12-08T00:00:00", - "2022-12-09T00:00:00", - "2022-12-12T00:00:00", - "2022-12-13T00:00:00", - "2022-12-14T00:00:00", - "2022-12-15T00:00:00", - "2022-12-16T00:00:00", - "2022-12-19T00:00:00", - "2022-12-20T00:00:00", - "2022-12-21T00:00:00", - "2022-12-22T00:00:00", - "2022-12-23T00:00:00", - "2022-12-27T00:00:00", - "2022-12-28T00:00:00", - "2022-12-29T00:00:00", - "2022-12-30T00:00:00", - "2023-01-02T00:00:00", - "2023-01-03T00:00:00", - "2023-01-05T00:00:00", - "2023-01-06T00:00:00", - "2023-01-09T00:00:00", - "2023-01-10T00:00:00", - "2023-01-11T00:00:00", - "2023-01-12T00:00:00", - "2023-01-13T00:00:00", - "2023-01-17T00:00:00", - "2023-01-18T00:00:00", - "2023-01-19T00:00:00", - "2023-01-20T00:00:00", - "2023-01-23T00:00:00", - "2023-01-24T00:00:00", - "2023-01-25T00:00:00", - "2023-01-26T00:00:00", - "2023-01-27T00:00:00", - "2023-01-30T00:00:00", - "2023-01-31T00:00:00", - "2023-02-01T00:00:00", - "2023-02-02T00:00:00", - "2023-02-03T00:00:00", - "2023-02-06T00:00:00", - "2023-02-07T00:00:00", - "2023-02-08T00:00:00", - "2023-02-09T00:00:00", - "2023-02-10T00:00:00", - "2023-02-13T00:00:00", - "2023-02-14T00:00:00", - "2023-02-15T00:00:00", - "2023-02-16T00:00:00", - "2023-02-17T00:00:00", - "2023-02-21T00:00:00", - "2023-02-22T00:00:00", - "2023-02-23T00:00:00", - "2023-02-24T00:00:00", - "2023-02-27T00:00:00", - "2023-02-28T00:00:00", - "2023-03-01T00:00:00", - "2023-03-02T00:00:00", - "2023-03-03T00:00:00", - "2023-03-06T00:00:00", - "2023-03-07T00:00:00", - "2023-03-08T00:00:00", - "2023-03-09T00:00:00", - "2023-03-10T00:00:00", - "2023-03-13T00:00:00", - "2023-03-14T00:00:00", - "2023-03-15T00:00:00", - "2023-03-16T00:00:00", - "2023-03-17T00:00:00", - "2023-03-20T00:00:00", - "2023-03-21T00:00:00", - "2023-03-22T00:00:00", - "2023-03-23T00:00:00", - "2023-03-24T00:00:00", - "2023-03-27T00:00:00", - "2023-03-28T00:00:00", - "2023-03-29T00:00:00", - "2023-03-30T00:00:00", - "2023-03-31T00:00:00", - "2023-04-03T00:00:00", - "2023-04-04T00:00:00", - "2023-04-05T00:00:00", - "2023-04-06T00:00:00", - "2023-04-07T00:00:00", - "2023-04-10T00:00:00", - "2023-04-11T00:00:00", - "2023-04-12T00:00:00", - "2023-04-13T00:00:00", - "2023-04-14T00:00:00", - "2023-04-17T00:00:00", - "2023-04-18T00:00:00", - "2023-04-19T00:00:00", - "2023-04-20T00:00:00", - "2023-04-21T00:00:00", - "2023-04-24T00:00:00", - "2023-04-25T00:00:00", - "2023-04-26T00:00:00", - "2023-04-27T00:00:00", - "2023-04-28T00:00:00", - "2023-05-01T00:00:00", - "2023-05-02T00:00:00", - "2023-05-03T00:00:00", - "2023-05-04T00:00:00", - "2023-05-05T00:00:00", - "2023-05-08T00:00:00", - "2023-05-09T00:00:00", - "2023-05-10T00:00:00", - "2023-05-11T00:00:00", - "2023-05-12T00:00:00", - "2023-05-15T00:00:00", - "2023-05-16T00:00:00", - "2023-05-17T00:00:00", - "2023-05-18T00:00:00", - "2023-05-19T00:00:00", - "2023-05-22T00:00:00", - "2023-05-23T00:00:00", - "2023-05-24T00:00:00", - "2023-05-25T00:00:00", - "2023-05-26T00:00:00", - "2023-05-30T00:00:00", - "2023-05-31T00:00:00", - "2023-06-01T00:00:00", - "2023-06-02T00:00:00", - "2023-06-05T00:00:00", - "2023-06-06T00:00:00", - "2023-06-07T00:00:00", - "2023-06-08T00:00:00", - "2023-06-09T00:00:00", - "2023-06-12T00:00:00", - "2023-06-13T00:00:00", - "2023-06-14T00:00:00", - "2023-06-15T00:00:00", - "2023-06-16T00:00:00", - "2023-06-19T00:00:00", - "2023-06-20T00:00:00", - "2023-06-21T00:00:00", - "2023-06-22T00:00:00", - "2023-06-23T00:00:00", - "2023-06-26T00:00:00", - "2023-06-27T00:00:00", - "2023-06-28T00:00:00", - "2023-06-29T00:00:00", - "2023-06-30T00:00:00", - "2023-07-03T00:00:00", - "2023-07-05T00:00:00", - "2023-07-06T00:00:00", - "2023-07-07T00:00:00", - "2023-07-10T00:00:00", - "2023-07-11T00:00:00", - "2023-07-12T00:00:00", - "2023-07-13T00:00:00", - "2023-07-14T00:00:00", - "2023-07-17T00:00:00", - "2023-07-18T00:00:00", - "2023-07-19T00:00:00", - "2023-07-20T00:00:00", - "2023-07-21T00:00:00", - "2023-07-24T00:00:00", - "2023-07-25T00:00:00", - "2023-07-26T00:00:00", - "2023-07-27T00:00:00", - "2023-07-28T00:00:00", - "2023-07-31T00:00:00", - "2023-08-01T00:00:00", - "2023-08-02T00:00:00", - "2023-08-03T00:00:00", - "2023-08-04T00:00:00", - "2023-08-07T00:00:00", - "2023-08-08T00:00:00", - "2023-08-09T00:00:00", - "2023-08-10T00:00:00", - "2023-08-11T00:00:00", - "2023-08-14T00:00:00", - "2023-08-15T00:00:00", - "2023-08-16T00:00:00", - "2023-08-17T00:00:00", - "2023-08-18T00:00:00", - "2023-08-21T00:00:00", - "2023-08-22T00:00:00", - "2023-08-23T00:00:00", - "2023-08-24T00:00:00", - "2023-08-25T00:00:00", - "2023-08-28T00:00:00", - "2023-08-29T00:00:00", - "2023-08-30T00:00:00", - "2023-08-31T00:00:00", - "2023-09-01T00:00:00", - "2023-09-05T00:00:00", - "2023-09-06T00:00:00", - "2023-09-07T00:00:00", - "2023-09-08T00:00:00", - "2023-09-11T00:00:00", - "2023-09-12T00:00:00", - "2023-09-13T00:00:00", - "2023-09-14T00:00:00", - "2023-09-15T00:00:00", - "2023-09-18T00:00:00", - "2023-09-19T00:00:00", - "2023-09-20T00:00:00", - "2023-09-21T00:00:00", - "2023-09-22T00:00:00", - "2023-09-25T00:00:00", - "2023-09-26T00:00:00", - "2023-09-27T00:00:00", - "2023-09-28T00:00:00", - "2023-09-29T00:00:00", - "2023-10-02T00:00:00", - "2023-10-03T00:00:00", - "2023-10-04T00:00:00", - "2023-10-05T00:00:00", - "2023-10-06T00:00:00", - "2023-10-09T00:00:00", - "2023-10-10T00:00:00", - "2023-10-11T00:00:00", - "2023-10-12T00:00:00", - "2023-10-13T00:00:00", - "2023-10-16T00:00:00", - "2023-10-17T00:00:00", - "2023-10-18T00:00:00", - "2023-10-19T00:00:00", - "2023-10-20T00:00:00", - "2023-10-23T00:00:00", - "2023-10-24T00:00:00", - "2023-10-25T00:00:00", - "2023-10-26T00:00:00", - "2023-10-27T00:00:00", - "2023-10-30T00:00:00", - "2023-10-31T00:00:00", - "2023-11-01T00:00:00", - "2023-11-02T00:00:00", - "2023-11-03T00:00:00", - "2023-11-06T00:00:00", - "2023-11-07T00:00:00", - "2023-11-08T00:00:00", - "2023-11-09T00:00:00", - "2023-11-10T00:00:00", - "2023-11-13T00:00:00", - "2023-11-14T00:00:00", - "2023-11-15T00:00:00", - "2023-11-16T00:00:00", - "2023-11-17T00:00:00", - "2023-11-20T00:00:00", - "2023-11-21T00:00:00", - "2023-11-22T00:00:00", - "2023-11-23T00:00:00", - "2023-11-24T00:00:00", - "2023-11-27T00:00:00", - "2023-11-28T00:00:00", - "2023-11-29T00:00:00", - "2023-11-30T00:00:00", - "2023-12-01T00:00:00", - "2023-12-04T00:00:00", - "2023-12-05T00:00:00", - "2023-12-06T00:00:00", - "2023-12-07T00:00:00", - "2023-12-08T00:00:00", - "2023-12-11T00:00:00", - "2023-12-12T00:00:00", - "2023-12-13T00:00:00", - "2023-12-14T00:00:00", - "2023-12-15T00:00:00", - "2023-12-18T00:00:00", - "2023-12-19T00:00:00", - "2023-12-20T00:00:00", - "2023-12-21T00:00:00", - "2023-12-22T00:00:00", - "2023-12-25T00:00:00", - "2023-12-26T00:00:00", - "2023-12-27T00:00:00", - "2023-12-28T00:00:00", - "2023-12-29T00:00:00", - "2024-01-01T00:00:00", - "2024-01-02T00:00:00", - "2024-01-04T00:00:00", - "2024-01-05T00:00:00", - "2024-01-08T00:00:00", - "2024-01-09T00:00:00", - "2024-01-10T00:00:00", - "2024-01-11T00:00:00", - "2024-01-12T00:00:00", - "2024-01-15T00:00:00", - "2024-01-16T00:00:00", - "2024-01-17T00:00:00", - "2024-01-18T00:00:00", - "2024-01-19T00:00:00", - "2024-01-22T00:00:00", - "2024-01-23T00:00:00", - "2024-01-24T00:00:00", - "2024-01-25T00:00:00", - "2024-01-26T00:00:00", - "2024-01-29T00:00:00", - "2024-01-30T00:00:00", - "2024-01-31T00:00:00", - "2024-02-01T00:00:00", - "2024-02-02T00:00:00", - "2024-02-05T00:00:00", - "2024-02-06T00:00:00", - "2024-02-07T00:00:00", - "2024-02-08T00:00:00", - "2024-02-09T00:00:00", - "2024-02-12T00:00:00", - "2024-02-13T00:00:00", - "2024-02-14T00:00:00", - "2024-02-15T00:00:00", - "2024-02-16T00:00:00", - "2024-02-20T00:00:00", - "2024-02-21T00:00:00", - "2024-02-22T00:00:00", - "2024-02-23T00:00:00", - "2024-02-26T00:00:00", - "2024-02-27T00:00:00", - "2024-02-28T00:00:00", - "2024-02-29T00:00:00", - "2024-03-01T00:00:00", - "2024-03-04T00:00:00", - "2024-03-05T00:00:00", - "2024-03-06T00:00:00", - "2024-03-07T00:00:00", - "2024-03-08T00:00:00", - "2024-03-11T00:00:00", - "2024-03-12T00:00:00", - "2024-03-13T00:00:00", - "2024-03-14T00:00:00", - "2024-03-15T00:00:00", - "2024-03-18T00:00:00", - "2024-03-19T00:00:00", - "2024-03-20T00:00:00", - "2024-03-21T00:00:00", - "2024-03-22T00:00:00", - "2024-03-25T00:00:00", - "2024-03-26T00:00:00", - "2024-03-27T00:00:00", - "2024-03-28T00:00:00", - "2024-04-01T00:00:00", - "2024-04-02T00:00:00", - "2024-04-03T00:00:00", - "2024-04-04T00:00:00", - "2024-04-05T00:00:00", - "2024-04-08T00:00:00", - "2024-04-09T00:00:00", - "2024-04-10T00:00:00", - "2024-04-11T00:00:00", - "2024-04-12T00:00:00", - "2024-04-15T00:00:00", - "2024-04-16T00:00:00", - "2024-04-17T00:00:00", - "2024-04-18T00:00:00", - "2024-04-19T00:00:00", - "2024-04-22T00:00:00", - "2024-04-23T00:00:00", - "2024-04-24T00:00:00", - "2024-04-25T00:00:00", - "2024-04-26T00:00:00", - "2024-04-29T00:00:00", - "2024-04-30T00:00:00", - "2024-05-01T00:00:00", - "2024-05-02T00:00:00", - "2024-05-03T00:00:00", - "2024-05-06T00:00:00", - "2024-05-07T00:00:00", - "2024-05-08T00:00:00", - "2024-05-09T00:00:00", - "2024-05-10T00:00:00", - "2024-05-13T00:00:00", - "2024-05-14T00:00:00", - "2024-05-15T00:00:00", - "2024-05-16T00:00:00", - "2024-05-17T00:00:00", - "2024-05-20T00:00:00", - "2024-05-21T00:00:00", - "2024-05-22T00:00:00", - "2024-05-23T00:00:00", - "2024-05-24T00:00:00", - "2024-05-28T00:00:00", - "2024-05-29T00:00:00", - "2024-05-30T00:00:00", - "2024-05-31T00:00:00", - "2024-06-03T00:00:00", - "2024-06-04T00:00:00", - "2024-06-05T00:00:00", - "2024-06-06T00:00:00", - "2024-06-07T00:00:00", - "2024-06-10T00:00:00", - "2024-06-11T00:00:00", - "2024-06-12T00:00:00", - "2024-06-13T00:00:00", - "2024-06-14T00:00:00", - "2024-06-17T00:00:00", - "2024-06-18T00:00:00", - "2024-06-20T00:00:00", - "2024-06-21T00:00:00", - "2024-06-24T00:00:00", - "2024-06-25T00:00:00", - "2024-06-26T00:00:00", - "2024-06-27T00:00:00", - "2024-06-28T00:00:00", - "2024-07-01T00:00:00", - "2024-07-02T00:00:00", - "2024-07-03T00:00:00", - "2024-07-05T00:00:00", - "2024-07-08T00:00:00", - "2024-07-09T00:00:00", - "2024-07-10T00:00:00", - "2024-07-11T00:00:00", - "2024-07-12T00:00:00", - "2024-07-15T00:00:00", - "2024-07-16T00:00:00", - "2024-07-17T00:00:00", - "2024-07-18T00:00:00", - "2024-07-19T00:00:00", - "2024-07-22T00:00:00", - "2024-07-23T00:00:00", - "2024-07-24T00:00:00", - "2024-07-25T00:00:00", - "2024-07-26T00:00:00", - "2024-07-29T00:00:00", - "2024-07-30T00:00:00", - "2024-07-31T00:00:00", - "2024-08-01T00:00:00", - "2024-08-02T00:00:00", - "2024-08-05T00:00:00", - "2024-08-06T00:00:00", - "2024-08-07T00:00:00", - "2024-08-08T00:00:00", - "2024-08-09T00:00:00", - "2024-08-12T00:00:00", - "2024-08-13T00:00:00", - "2024-08-14T00:00:00", - "2024-08-15T00:00:00", - "2024-08-16T00:00:00", - "2024-08-19T00:00:00", - "2024-08-20T00:00:00", - "2024-08-21T00:00:00", - "2024-08-22T00:00:00", - "2024-08-23T00:00:00", - "2024-08-26T00:00:00", - "2024-08-27T00:00:00", - "2024-08-28T00:00:00", - "2024-08-29T00:00:00", - "2024-08-30T00:00:00", - "2024-09-03T00:00:00", - "2024-09-04T00:00:00", - "2024-09-05T00:00:00", - "2024-09-06T00:00:00", - "2024-09-09T00:00:00", - "2024-09-10T00:00:00", - "2024-09-11T00:00:00", - "2024-09-12T00:00:00", - "2024-09-13T00:00:00", - "2024-09-16T00:00:00", - "2024-09-17T00:00:00", - "2024-09-18T00:00:00", - "2024-09-19T00:00:00", - "2024-09-20T00:00:00", - "2024-09-23T00:00:00", - "2024-09-24T00:00:00", - "2024-09-25T00:00:00", - "2024-09-26T00:00:00", - "2024-09-27T00:00:00", - "2024-09-30T00:00:00", - "2024-10-01T00:00:00", - "2024-10-02T00:00:00", - "2024-10-03T00:00:00", - "2024-10-04T00:00:00", - "2024-10-07T00:00:00", - "2024-10-08T00:00:00", - "2024-10-09T00:00:00", - "2024-10-10T00:00:00", - "2024-10-11T00:00:00", - "2024-10-14T00:00:00", - "2024-10-15T00:00:00", - "2024-10-16T00:00:00", - "2024-10-17T00:00:00", - "2024-10-18T00:00:00", - "2024-10-21T00:00:00", - "2024-10-22T00:00:00", - "2024-10-23T00:00:00", - "2024-10-24T00:00:00", - "2024-10-25T00:00:00", - "2024-10-28T00:00:00", - "2024-10-29T00:00:00", - "2024-10-30T00:00:00", - "2024-10-31T00:00:00", - "2024-11-01T00:00:00", - "2024-11-04T00:00:00", - "2024-11-05T00:00:00", - "2024-11-06T00:00:00", - "2024-11-07T00:00:00", - "2024-11-08T00:00:00", - "2024-11-11T00:00:00", - "2024-11-12T00:00:00", - "2024-11-13T00:00:00", - "2024-11-14T00:00:00", - "2024-11-15T00:00:00", - "2024-11-18T00:00:00", - "2024-11-19T00:00:00", - "2024-11-20T00:00:00", - "2024-11-21T00:00:00", - "2024-11-22T00:00:00", - "2024-11-25T00:00:00", - "2024-11-26T00:00:00", - "2024-11-27T00:00:00", - "2024-11-28T00:00:00", - "2024-11-29T00:00:00", - "2024-12-02T00:00:00", - "2024-12-03T00:00:00", - "2024-12-04T00:00:00", - "2024-12-05T00:00:00", - "2024-12-06T00:00:00", - "2024-12-09T00:00:00", - "2024-12-10T00:00:00", - "2024-12-11T00:00:00", - "2024-12-12T00:00:00", - "2024-12-13T00:00:00", - "2024-12-16T00:00:00", - "2024-12-17T00:00:00", - "2024-12-18T00:00:00", - "2024-12-19T00:00:00", - "2024-12-20T00:00:00", - "2024-12-23T00:00:00", - "2024-12-24T00:00:00", - "2024-12-25T00:00:00", - "2024-12-26T00:00:00", - "2024-12-27T00:00:00", - "2024-12-30T00:00:00", - "2024-12-31T00:00:00", - "2025-01-01T00:00:00", - "2025-01-02T00:00:00", - "2025-01-06T00:00:00", - "2025-01-07T00:00:00", - "2025-01-08T00:00:00", - "2025-01-09T00:00:00", - "2025-01-10T00:00:00", - "2025-01-13T00:00:00", - "2025-01-14T00:00:00", - "2025-01-15T00:00:00", - "2025-01-16T00:00:00", - "2025-01-17T00:00:00", - "2025-01-21T00:00:00", - "2025-01-22T00:00:00", - "2025-01-23T00:00:00", - "2025-01-24T00:00:00", - "2025-01-27T00:00:00", - "2025-01-28T00:00:00", - "2025-01-29T00:00:00", - "2025-01-30T00:00:00", - "2025-01-31T00:00:00", - "2025-02-03T00:00:00", - "2025-02-04T00:00:00", - "2025-02-05T00:00:00", - "2025-02-06T00:00:00", - "2025-02-07T00:00:00", - "2025-02-10T00:00:00", - "2025-02-11T00:00:00", - "2025-02-12T00:00:00", - "2025-02-13T00:00:00", - "2025-02-14T00:00:00", - "2025-02-18T00:00:00", - "2025-02-19T00:00:00", - "2025-02-20T00:00:00", - "2025-02-21T00:00:00", - "2025-02-24T00:00:00", - "2025-02-25T00:00:00", - "2025-02-26T00:00:00", - "2025-02-27T00:00:00", - "2025-02-28T00:00:00", - "2025-03-03T00:00:00" - ], - "xaxis": "x", - "y": [ - 19640.761147979378, - 19650.596862265094, - 19788.20726429218, - 19850.471881606, - 19881.122089076056, - 19825.614502929093, - 19824.15238677068, - 19777.849387695802, - 19736.471666322162, - 19807.091473402994, - 19853.842628572587, - 19859.952013607726, - 19988.51317559066, - 20171.184833992345, - 20452.37329857427, - 20831.319029062965, - 21070.05001908033, - 21157.806496217767, - 21350.083527571518, - 21628.74772741103, - 21856.614474964525, - 22154.178933326257, - 22543.547503861053, - 22978.78350991469, - 23381.319241099398, - 23709.27203901598, - 23897.79471057608, - 23971.969091874, - 24004.818636560023, - 23954.058192098953, - 23734.628607194052, - 23542.41142219211, - 23662.230715094818, - 23589.454494791975, - 23404.587982563866, - 23162.097965129593, - 22934.08332485303, - 22781.48113801222, - 22567.880426828047, - 22272.902352021818, - 22013.500005135473, - 21735.03257750189, - 21461.592380304053, - 21241.601308535304, - 21024.6170991031, - 20964.857046413505, - 21001.824049940617, - 21089.8551276483, - 21244.685490160933, - 21428.777071658977, - 21647.98027880814, - 21661.328300882727, - 21702.083054506315, - 21702.73026151888, - 21684.67844226686, - 21737.34591309995, - 21948.163423158177, - 22250.773858662724, - 22574.77326373554, - 22865.30078246634, - 23226.164565440995, - 23531.47063720897, - 23703.35186504054, - 23788.46996195632, - 23788.333718332255, - 23815.835928615623, - 23860.086180680468, - 23789.821751276646, - 23708.553217297605, - 23666.477598795555, - 23643.244424814227, - 23603.996638035413, - 23586.659589453728, - 23609.87282720228, - 23750.045482324716, - 24133.405393949906, - 24511.764628436955, - 24896.883957880193, - 25261.70241592428, - 25843.79243530807, - 26381.60106041517, - 26712.654851506148, - 26892.575785908328, - 27101.842727819145, - 27252.48551989128, - 27560.187665696663, - 28196.501544000643, - 28897.95959810962, - 29626.47855984175, - 30251.453931217897, - 30810.625085992662, - 30782.66447264447, - 30827.75935097248, - 30916.20516513926, - 31131.429291896613, - 31222.395202709125, - 31350.272652085034, - 31732.422273199027, - 32264.018196823992, - 32796.397916715236, - 33477.318033188174, - 34180.289931790816, - 34550.07091802951, - 35204.30199594827, - 35937.62925588997, - 36648.53713104213, - 37395.33511756448, - 38353.20965322591, - 38673.354807137686, - 38698.64249002448, - 38843.84252497054, - 39097.430692944654, - 39305.193543935246, - 39374.098201835346, - 39497.73526710027, - 39687.808594644375, - 39933.15454334767, - 40200.06849552311, - 40369.664349338556, - 40488.07029225672, - 40231.0794983906, - 40003.43339509348, - 39527.625795534004, - 39164.59419181615, - 38480.34888445364, - 36918.35162013874, - 35947.83027944141, - 35069.68181610463, - 34610.028189889934, - 34617.13962546878, - 34981.53620334747, - 35438.88849457847, - 36006.46219753191, - 36466.16937138259, - 37352.07209793213, - 38295.463149578114, - 39193.03200244664, - 40007.52904179937, - 40871.67870088214, - 41687.742850355455, - 42699.187899794495, - 43328.24509365752, - 43504.339642329025, - 43460.16043468478, - 43485.228011544874, - 43811.272940505536, - 44182.02629206524, - 44898.69365779571, - 45692.75343284476, - 46586.38244449172, - 47396.459395849575, - 47293.09088472191, - 47205.23773397039, - 47434.01207365888, - 47752.48388709279, - 47907.093739771524, - 47717.73778459479, - 48445.903386053884, - 51376.23095747358, - 54728.289644349454, - 55833.9308773401, - 55928.39407470172, - 54361.45081247227, - 53132.527426962566, - 52210.06904411818, - 51856.18081287599, - 52466.81705131841, - 52668.61464559246, - 52458.62113051052, - 52178.17036559495, - 52070.76295195973, - 51696.37237167158, - 51827.69973353248, - 52328.20403298591, - 52853.99241621267, - 53343.45252780234, - 54350.90768266585, - 55864.97646894373, - 56936.33087040385, - 57742.645986795105, - 58175.79971711717, - 57705.289857956835, - 56314.8732614751, - 54842.44488982035, - 53561.25266840722, - 52385.65997457166, - 51498.606129536594, - 50982.60115306998, - 50644.707286697674, - 50682.09949015547, - 51238.22603145104, - 51923.82479400118, - 52492.367884685125, - 53286.47254926054, - 54107.53436046388, - 54835.90597188897, - 55604.17791640158, - 56563.77748595919, - 57300.613994415035, - 57650.1552367166, - 57734.94852258876, - 57615.82444760642, - 57380.484518914855, - 57009.4317503021, - 56211.82985156587, - 55744.74794653008, - 55273.932917381775, - 55275.09000987285, - 55847.16325050247, - 56384.084633116, - 56568.639477101664, - 57039.63793896803, - 57267.7300148959, - 57703.874589600695, - 58065.46383241359, - 58163.73417602253, - 58244.2393539845, - 58352.313552761756, - 58495.213332260464, - 58328.83419542876, - 58385.66649522764, - 58212.69345516762, - 58076.74742924421, - 58223.124582175566, - 58394.91883064493, - 58744.01037692652, - 58830.47663894144, - 58565.26642802483, - 57585.6942927266, - 57419.69006710019, - 56908.097371899836, - 55837.096500906504, - 54550.04810287506, - 53526.431044125624, - 52978.71695719044, - 52684.98892450644, - 52494.05858321741, - 52199.87515983766, - 51997.66925157621, - 51981.75525566753, - 52187.278558552505, - 52752.30453673678, - 53278.91747639576, - 53771.52390777726, - 54016.28264911956, - 54099.16849513534, - 54081.17857215165, - 53981.62306181867, - 54040.19750329718, - 53787.92532142701, - 53442.7985840179, - 53550.129561096655, - 53560.97854780827, - 53955.40722336729, - 54701.38947836653, - 55478.68445394764, - 56408.762334996056, - 57562.41359786364, - 59046.21551122457, - 60493.54234878561, - 61773.98142193013, - 62880.70968217383, - 63693.657341332255, - 64518.08742244487, - 65714.89045473302, - 67699.6952916131, - 69857.60844999863, - 72244.63581504657, - 74806.53805626297, - 77324.08194307773, - 79402.52444885693, - 81117.7672502763, - 82094.73874428356, - 82640.4604845302, - 81996.49116608285, - 81553.4163601961, - 81349.53106540377, - 80433.0557698128, - 79772.9330666395, - 79505.72035289471, - 79620.66293656596, - 80259.69451549106, - 81714.71063654165, - 82624.64605681703, - 84503.10260748719, - 85329.34720264435, - 85431.97044280783, - 86261.44951786275, - 87564.55456091945, - 88817.31684106958, - 89769.59686272407, - 89975.54711439673, - 90407.04131737229, - 91406.1921454476, - 93044.5815690017, - 94636.68717690939, - 95659.67067780491, - 97372.38630368901, - 98684.95970741009, - 99621.69165438543, - 100562.63314475118, - 101317.21710632491, - 101491.1526998599, - 100980.12108432032, - 100865.49462253421, - 100915.03977185066, - 99995.36886444957, - 98116.67343122771, - 97793.5357043635, - 96380.57847713075, - 94303.55813216524, - 92728.79327974428, - 89602.41042350096, - 87678.92577301634, - 86306.60617502115, - 85389.1640527713, - 84132.89007356131, - 82782.37859211236, - 82361.61829357405, - 82541.35730224545, - 83538.01082938997, - 84549.39183292464, - 85909.1245213294, - 88029.91256624977, - 90360.53791878249, - 92126.80925094192, - 92925.01277342105, - 92634.28151776687, - 91384.15687628234, - 89800.6153249698, - 88977.52274659372, - 88677.26815633908, - 88250.33143256824, - 87796.0596218907, - 87427.18770084431, - 87322.51261700885, - 87891.01595585888, - 89300.1175050028, - 90945.32691320805, - 92894.96393109794, - 94974.14090632186, - 96428.18992280496, - 97409.13084760455, - 97817.72608905916, - 97912.77097672467, - 97750.5975482388, - 97439.11086719105, - 97163.07314264137, - 96913.76552702452, - 97288.09020236888, - 97936.03598730241, - 98394.28556435737, - 98653.57272032076, - 98704.50960832956, - 99517.94304162166, - 100519.08833815086, - 101949.78485137381, - 103889.45587381095, - 105197.18061480603, - 106794.64241130346, - 107885.7459196173, - 108363.16489579968, - 108687.67490105612, - 109008.81864016775, - 110405.1663320633, - 113040.91689513817, - 115742.03817330989, - 118189.245417277, - 120931.36019341894, - 124283.08887318299, - 127117.59071635269, - 128565.25898295692, - 128151.44237853095, - 127565.07413901988, - 126617.95577684979, - 126043.94774055341, - 125231.5946127964, - 124869.25763033328, - 123998.01992464697, - 122752.22828397172, - 123088.56010917768, - 124847.96633664006, - 126650.35762421021, - 128457.40151928975, - 130016.48264488362, - 129920.8406027133, - 129615.60975289145, - 129012.28296186164, - 127535.31653276399, - 125338.17304581184, - 122903.49862458637, - 120503.22932456886, - 118368.68587713096, - 116830.22857445106, - 115144.91505371849, - 113116.28298531275, - 110113.28553070962, - 107106.59014309675, - 104679.58949127041, - 103246.4701980084, - 102393.7985982147, - 102351.53613064387, - 102632.26046370801, - 103000.51029334527, - 103235.72793639876, - 103293.70473564923, - 103163.3016469917, - 103117.93872234828, - 102783.28363423701, - 102673.5375107635, - 101576.47611149236, - 100634.84230639794, - 99938.43406519455, - 99765.60334786029, - 99854.65530453571, - 100221.84988355263, - 100789.45798249026, - 101274.98362269138, - 102353.94371557783, - 103791.86214365537, - 105238.21787674303, - 106524.8774451448, - 107060.06928691418, - 106718.90036839474, - 106004.10504912201, - 105074.26560947554, - 104356.89117186666, - 103943.51695034005, - 104131.5177263484, - 104724.99758184163, - 105954.94376207973, - 105896.85504858103, - 105902.37373346233, - 105955.90433050459, - 105871.6466771465, - 105624.21363130806, - 106233.09955968191, - 106560.20065758734, - 106883.74535851969, - 107485.16116516509, - 108862.76118140605, - 110903.7399506723, - 112472.96015921042, - 113702.9720154056, - 113407.56138317553, - 111539.74093640137, - 109167.73887500468, - 107084.06118393943, - 103572.24269414302, - 98986.7411325238, - 96208.68089859285, - 94368.41374778785, - 93467.87455545593, - 92511.01187085251, - 91243.00791653144, - 89953.9157639289, - 89452.68473049105, - 89444.61933556841, - 88676.59122876164, - 88558.2329452562, - 87825.78042678708, - 87141.82139029868, - 86167.30862157691, - 85473.47548444013, - 85124.77699704604, - 85114.04181648455, - 84767.04071975368, - 84256.71411081593, - 83834.01942590193, - 83486.81434309871, - 83137.54467031671, - 82684.2892692686, - 82146.72543527762, - 81611.99319225231, - 81228.28099695951, - 80959.63886621516, - 80747.9262725996, - 80532.42151145596, - 80286.94575760992, - 79760.31758406984, - 79584.76434882724, - 79477.74715340997, - 79585.49588578215, - 79586.01482528987, - 79565.99784884007, - 79585.99657785227, - 79605.8904337231, - 79649.00662624175, - 79627.36179680353, - 79627.13146904673, - 79645.81015067804, - 79681.43359352458, - 79756.35517213079, - 79759.23473919054, - 79699.55579431726, - 79539.84619979719, - 79362.0924186953, - 79048.29409626727, - 78770.56715470541, - 78456.50429920979, - 78041.1286180016, - 77945.30731882624, - 77875.81875740134, - 77836.29165637108, - 77812.80813449762, - 77780.34112562431, - 77728.98668118738, - 77673.2343818449, - 77653.80925541765, - 77649.53535053399, - 77643.3352306665, - 77617.49206133925, - 77631.1235000101, - 77676.42681067939, - 77729.3449777902, - 77728.55976302669, - 77820.53805184584, - 77874.03689397924, - 77946.56728437018, - 78135.10656681782, - 78190.76486846882, - 78291.49876088416, - 78622.51566417981, - 79033.01284444149, - 79357.6970421608, - 79656.26683838907, - 79845.11771710218, - 80072.81670225145, - 80293.7264068359, - 80501.59715730102, - 80780.46712019005, - 81045.27854170348, - 81221.97696946735, - 81420.60940773746, - 81543.12538361682, - 81721.8609627597, - 81919.23682412949, - 82093.94766143312, - 82339.87645190087, - 82620.05617089233, - 82926.16860395533, - 83125.02015548322, - 83210.06452513325, - 83208.06783853637, - 83089.94370635424, - 82936.45047113145, - 82588.7573886398, - 82071.17470804269, - 81478.3663704709, - 80901.61094190947, - 80294.60352812638, - 79860.44343918771, - 79792.40839745499, - 79477.93520100586, - 79299.88317751892, - 79026.1276311461, - 78735.25680839001, - 78088.75276502372, - 77744.21727574347, - 77611.80291781909, - 77914.04830506201, - 78254.37488487021, - 78503.69344912883, - 78650.12805787004, - 78840.76267275313, - 79054.25933452456, - 79261.5905681608, - 79261.37306253985, - 79293.63374569472, - 79331.91381470648, - 79315.45430051343, - 79126.47982517957, - 78969.52457886144, - 78781.02601080936, - 78716.15513300229, - 78705.36992907988, - 78825.26580433454, - 79081.77147168007, - 79374.0859566991, - 79770.2667364471, - 80088.5359668174, - 80340.36422294064, - 80471.98451633025, - 80792.78834716952, - 81113.68056325102, - 81577.51977843663, - 81801.24513601919, - 81597.33620475078, - 81314.84957687421, - 81042.00896858622, - 80804.08656981782, - 80122.01263016954, - 79280.22130680716, - 78739.01670348516, - 78331.9032794588, - 78076.53857903754, - 77767.90169707706, - 77607.72973140249, - 77567.50431705592, - 77458.2484815428, - 77295.56479729971, - 76906.61990460112, - 76434.72123513433, - 75672.62392062132, - 75156.84905686954, - 74328.28568660843, - 74089.2560494005, - 74164.29259930269, - 74355.8629073429, - 74708.02186487678, - 75115.66985748774, - 75535.43603122747, - 75862.67414499063, - 76265.52063526773, - 76459.95410637297, - 76812.27667660867, - 77302.84249982802, - 77729.18762115377, - 78289.68981365941, - 78784.11919888607, - 79081.0413803514, - 79204.72974831128, - 79261.47292567206, - 79293.8770649631, - 79411.38222952373, - 79510.51808005488, - 79749.77627128002, - 80083.49779598147, - 80415.24624970435, - 80651.95469235664, - 80988.40407846776, - 81118.69712120581, - 81448.0925721184, - 81897.06269606737, - 82558.55768458138, - 83441.64379417323, - 84465.71481604989, - 84995.26600892289, - 85431.24387140575, - 85424.05678665292, - 85518.50273068005, - 85699.81004514669, - 86029.37481235822, - 85893.24931951748, - 85833.75984373516, - 85861.61454551193, - 86219.21048488042, - 85379.97817697401, - 84459.88108585202, - 82840.69873983576, - 81360.34809100271, - 79953.74872983398, - 79006.11924288685, - 78450.01268285175, - 77882.79233138838, - 77272.49665564332, - 77236.48231776038, - 76950.91231547749, - 76829.74511062603, - 76886.97534975919, - 77203.00123498267, - 77361.44477310534, - 77724.63587572906, - 77930.17656670274, - 77211.98223721441, - 77062.98550915522, - 76846.34303999235, - 77260.24305742886, - 78040.01653484619, - 78482.83902078467, - 78999.84822755307, - 79400.88750706606, - 80074.93880801731, - 80935.2668616444, - 81381.88831313132, - 81528.55481362074, - 81637.77708154242, - 81573.46530621895, - 81705.91960757218, - 81112.08051276319, - 80542.60944109212, - 80122.833830827, - 79719.8593011381, - 78413.45868288395, - 77452.70876040433, - 76400.1487450936, - 75661.68181699188, - 74922.1132315499, - 74315.61212863703, - 74031.5818361188, - 73373.18244656555, - 72742.35056259125, - 72665.044337818, - 72503.28199150981, - 72673.48499808536, - 72861.09641893952, - 72991.92693512602, - 73252.5379038327, - 73614.10671866318, - 74250.20300116493, - 75364.99802331478, - 76424.44041303954, - 77267.7136139388, - 77664.02417821548, - 78358.25534327328, - 79012.96373223267, - 79531.16582753095, - 79800.0930202612, - 80105.25472946721, - 80993.10078294645, - 81611.79124307675, - 82310.55400069973, - 82732.80876628046, - 83137.3059216415, - 84074.8203483594, - 85179.88575474621, - 86062.31461272041, - 86953.32803493495, - 87567.84109030227, - 88043.49404222061, - 88482.85066874759, - 88789.55109435905, - 88368.91841704925, - 88448.55999063751, - 89299.18154938398, - 90218.44841472252, - 90565.04768353923, - 90699.18611234977, - 91202.40453328981, - 91803.04242325635, - 92399.07352541617, - 92765.12216456892, - 93001.06112251586, - 93154.9086401046, - 91777.64846982663, - 90387.33158812302, - 90057.52788468338, - 90173.45749070912, - 90549.01344224488, - 90666.71483000336, - 90482.20596475503, - 90532.33854062035, - 91213.15027982721, - 91505.1359449565, - 92069.96861874, - 92932.427054272, - 94120.80012648569, - 95400.82077162067, - 96151.54040804184, - 96813.60551732064, - 97852.74227830452, - 99993.55368722565, - 100501.81383211708, - 100991.54332486901, - 100988.19560493843, - 100800.19069819688, - 101375.63541305951, - 101439.36080597204, - 101718.22639499573, - 102072.10760622233, - 103019.54032358523, - 103942.50084060892, - 105435.9758373911, - 106334.7282859292, - 107140.90846749909, - 108130.90032781426, - 109456.96089744668, - 112277.97279243634, - 113282.05596358521, - 114331.296990721, - 114523.49097344857, - 113467.82406663567, - 113460.90946237819, - 112431.88261812906, - 111903.64304320778, - 110700.39654509338, - 110326.86257074475, - 111036.53705381542, - 112070.89484497985, - 112944.14741682544, - 113574.21636804097, - 115402.91266463824, - 118069.11886309255, - 120972.66456106548, - 123517.4750477877, - 127845.122699681, - 136757.58320770244, - 140318.06312451075, - 145527.79417200192, - 147060.6377690208, - 145349.74317601396, - 141330.9414846665, - 137651.0443172116, - 133211.22170297266, - 131377.46113918273, - 130203.4935627426, - 127051.65210026076, - 127137.18665469831, - 127200.9379838874, - 128097.47950294141, - 126773.32481953126, - 125328.77433147162, - 124850.90685762353, - 121012.90190270556, - 121423.36230513388, - 115928.72462613958, - 111671.19234287496, - 108438.16297132605, - 105578.36911732004, - 104945.18903911089, - 103812.72576031186, - 105464.82412715591, - 108896.85203194349, - 113076.24319948636, - 115834.72791835736, - 119377.94336820686, - 120558.04972141972, - 120097.7192677637, - 120750.94711912161, - 121164.63683859023, - 122352.64848092772, - 123192.56179964499, - 125576.27984599929, - 126978.05131892441, - 128799.1865853043, - 130885.54905554489, - 136144.44313918034, - 142092.17923687937, - 142922.31673908152, - 144649.3492673388, - 143541.05414503868, - 142942.23984920766, - 142988.59963218175, - 143910.6045528268, - 145535.882323454, - 146950.56042483746, - 148488.57833722018, - 148537.55070590726, - 147893.85390218563, - 147565.12846920275, - 147689.58176845327, - 148309.22606265752, - 149548.36458608494, - 150054.55389926094, - 153058.44556232347, - 155513.59686174075, - 155705.6097259144, - 157569.23459248783, - 162186.9723776806, - 170555.17207833208, - 178109.3069980846, - 187515.01284146536, - 197119.33103623625, - 203757.12532420096, - 210483.4664809888, - 208866.42340236984, - 205954.62152642745, - 206920.3358822173, - 208848.18540757353, - 208355.7550803952, - 207401.26373580645, - 206688.72460229692, - 206866.49058531845, - 208647.2836995325, - 212125.1234307414, - 218049.21409674032, - 217638.6144967132, - 215783.81580473733, - 216098.37723134278, - 218219.4052122181, - 220865.6115218789, - 224298.3498205727, - 227148.79162334863, - 231444.42467575037, - 233696.11941962977, - 234404.71844268686, - 237254.22838654715, - 236307.55870780657, - 236900.1446896948, - 239954.49078448105, - 242789.64515674653, - 246304.5554957727, - 252548.81848707236, - 255644.47812704297, - 263272.2127577309, - 272647.2984947646, - 279788.5286704719, - 281606.49264433974, - 285342.8048947107, - 289159.0780123765, - 289132.7979085544, - 289642.95796904014, - 291433.2438421664, - 291722.43576763885, - 291420.1809439712, - 286812.1679089807, - 282292.5175241269, - 283086.913768199, - 286075.173007512, - 288346.23905171733, - 290658.83373735787, - 293975.0679295966, - 301193.135908597, - 309244.3222895079, - 318216.25118292536, - 325936.2307001921, - 333234.74011687835, - 337436.5582458986, - 331982.5132240502, - 331378.94643978233, - 330869.01844140206, - 334031.1368002069, - 345102.2992843607, - 357022.33597195195, - 368641.9348705424, - 378675.02542062616, - 389490.7530570713, - 397977.7693802149, - 405648.3423564159, - 409687.6906188567, - 417132.7084254267, - 425968.45639730984, - 444201.58469050314, - 457931.3516910999, - 472536.61027583055, - 467187.805936357, - 463603.09398203105, - 445195.6118199973, - 437935.11663804034, - 425946.8170301443, - 412017.5679310741, - 402569.80047047854, - 397556.25547861506, - 389370.3024671642, - 391199.07916951616, - 380599.68810045184, - 371577.2805456675, - 367077.16490291874, - 360400.4534671713, - 357544.4227597892, - 358253.4934803359, - 362217.1513524272, - 368161.6311310391, - 377003.98834292794, - 385096.09153182094, - 395578.41780486814, - 406632.23902282625, - 415436.49480630964, - 424703.5022782996, - 431582.9317362122, - 436233.7397456233, - 447996.6697749292, - 457838.4563344286, - 463568.55931768887, - 466434.0087337333, - 466103.0497186662, - 461091.20815208927, - 456023.0473233241, - 449446.4374009645, - 439290.89750756905, - 432978.51987079025, - 433362.3137680652, - 429627.6560431461, - 418656.4868000777, - 409660.2500873454, - 394739.29572375753, - 382265.8593573176, - 375750.24383080215, - 378558.4632278212, - 386141.2050152792, - 403138.97791594354, - 408640.1587297217, - 399285.7007337402, - 394213.82298583136, - 391749.82394799846, - 389287.1109789123, - 387821.8662512492, - 387084.275262988, - 386267.0597379331, - 377110.069712918, - 369779.27596541797, - 364234.92557281215, - 359467.6754180496, - 357441.62100677955, - 358231.8737475371, - 372789.5799911932, - 380712.57493821037, - 386166.2246947221, - 389592.0302066179, - 392445.6803054044, - 394761.8564006442, - 394991.9240888773, - 388317.03683300037, - 382433.68791439687, - 377778.4729648416, - 376217.8949676152, - 376271.5052410869, - 377548.73038562783, - 379841.20835584233, - 380090.0735282974, - 377347.29524564365, - 376524.60251168156, - 373953.62529628666, - 370144.7689312913, - 361974.3453982851, - 359247.0726089089, - 359159.4554530522, - 356930.90917834314, - 354117.39559014735, - 352979.35385521874, - 351818.285408924, - 352344.2470664493, - 354018.9469135129, - 354612.0782957232, - 355563.1406769116, - 356507.7248486816, - 357060.3914754812, - 356759.23832070344, - 356025.8511313673, - 356394.9664771679, - 357465.25726848096, - 359755.97286734736, - 362904.32707230106, - 368722.6466448199, - 370252.75899739045, - 370014.2630370312, - 368135.58561723924, - 366531.1351209781, - 367287.7118167857, - 366931.7350099747, - 366879.3181529022, - 367131.8551867086, - 367925.04064598156, - 368315.90210857225, - 367871.3196321653, - 367035.68478797126, - 366385.266783437, - 364620.9324951013, - 362981.15073731396, - 360819.6238275665, - 356862.8046927068, - 352571.23055281246, - 342312.4265877419, - 336762.6225830984, - 329844.193947439, - 321073.619287244, - 327403.66280305636, - 326462.83077290235, - 320125.3618117777, - 312580.30837330146, - 302920.6446867994, - 292082.41035338293, - 285080.48462409404, - 279534.83818796405, - 275750.5757636725, - 272911.29260909924, - 271211.4656084173, - 270514.5812210152, - 269726.5172262666, - 267515.84645289415, - 265518.6809764898, - 264267.5304486081, - 262303.8120849715, - 258356.98537766575, - 254213.2603214942, - 249638.72324188813, - 244024.35855997488, - 240798.7450814886, - 239598.3117847383, - 242654.66921392764, - 250164.38642323329, - 251630.66823247503, - 252717.84146386033, - 254487.68025281446, - 254250.79578205044, - 257248.172762592, - 263449.7206430256, - 268454.94077559124, - 273378.3318317334, - 276527.81556138647, - 279035.08235457604, - 279316.9402783448, - 276695.0411546021, - 274844.13381783693, - 273222.2100891351, - 270417.6249338912, - 268144.97243084083, - 267143.6440150936, - 263783.4781239362, - 262098.3938691368, - 260479.01739012104, - 257185.0064469, - 254006.7955703474, - 251277.52484784555, - 249581.03588394762, - 246058.68304438432, - 241361.86679090263, - 235380.61783191396, - 228536.05630269233, - 224919.31981192945, - 222325.01089830205, - 220321.7650665783, - 218743.28024873644, - 218373.9008049422, - 219543.440312063, - 222643.51253318397, - 225765.76277285296, - 228863.78395468785, - 230303.43592716116, - 232730.37187683012, - 236864.73161380453, - 239403.10210780214, - 242015.91012910375, - 245757.2985197679, - 249740.0916773326, - 252991.0652267403, - 255518.00075637497, - 257711.03977502737, - 259907.28137066972, - 260436.46379118128, - 261416.88070797402, - 262558.0647158991, - 262939.3599250507, - 265098.1655781068, - 267563.19133123074, - 270757.8248679315, - 274346.28108085255, - 276243.6975585402, - 278361.3018259381, - 281938.6897596236, - 286396.5615709004, - 289437.08024443185, - 292403.55934270035, - 294883.0768533632, - 299895.81836406287, - 305600.1707319708, - 297341.5462810304, - 291750.35535787564, - 295527.0297589683, - 291811.6534186067, - 288435.1259502074, - 285059.7575984491, - 274466.2643340901, - 272105.4655521472, - 268969.932211541, - 259101.4752627741, - 253937.62466176227, - 249349.9414389108, - 248483.87924701776, - 248074.6055943175, - 246424.04975036008, - 248059.4792591313, - 245360.07757076682, - 246054.73060444565, - 243042.1425770101, - 243637.41588677734, - 252219.88934581247, - 255591.8703376001, - 255961.4117084947, - 260264.4028440493, - 263138.90320635453, - 261160.7682276955, - 259196.73450295694, - 258075.50612465772, - 260046.6211448959, - 258340.41248453886, - 253955.04557732333, - 251210.6578971312, - 251555.19410302505, - 255939.25938924743, - 261226.89211278415, - 269016.73075932794, - 275097.17969579395, - 281292.4167977286, - 289182.8229526861, - 293317.91567343567, - 298079.1923167105, - 298911.3139356385, - 303980.17401832045, - 313653.7639777854, - 305497.75482813735, - 302565.01482690003, - 306458.76864896715, - 303894.5589639915, - 301050.55143062334, - 301974.23445992114, - 300682.88792700035, - 296256.45729020797, - 287153.43068377586, - 280239.67526764295, - 275865.10924953007, - 276311.4199105397, - 277628.27565301966, - 277058.24149648217, - 272617.6428410532, - 268410.7800644364, - 263421.13266031496, - 258703.58052266642, - 252858.1867554823, - 247779.7872176104, - 243409.7631620123, - 242755.3322445872, - 242427.79098283214, - 242098.26694958823, - 240237.0856200146, - 238851.44660070984, - 239630.94200728956, - 241740.17504944248, - 247730.01826265056, - 254394.87776313777, - 260080.34623234658, - 266692.0937184325, - 274506.51309420523, - 283763.43705670506, - 298994.8283898584, - 314387.63767874305, - 331514.82966603705, - 348961.8143441772, - 364556.03076493175, - 380416.54161943466, - 396937.73347027646, - 420659.8148964796, - 410328.14306772384, - 429972.01973097015, - 465860.3353060106, - 512948.89761618874, - 539212.7156222339, - 553659.8199537781, - 562687.9684861779, - 567080.0621486438, - 587902.6105183588, - 603147.4814887799, - 600043.1185303908, - 600228.284455721, - 616231.5184125216, - 611317.0055488372, - 599523.4411414752, - 598459.2940385889, - 618636.465986036, - 657205.3469860118, - 672717.5308974964, - 691815.5227454623, - 701388.5703341521, - 702538.579309662, - 709243.4729346015, - 708081.5805933963, - 699397.1795785787, - 696514.236414558, - 685641.0760996274, - 667163.7380387796, - 659181.4239723915, - 650061.6153003549, - 664676.6862648664, - 662458.9247586454, - 658425.9241256084, - 652626.497235814, - 647559.5075672576, - 642857.3947870688, - 645697.5340441344, - 648302.8433285656, - 648722.9978484828, - 648655.8568497698, - 644535.2761729389, - 638869.4071913474, - 632090.5132500426, - 621129.7936981097, - 610666.8406610026, - 600201.4933439473, - 594177.7753258693, - 584013.3564594571, - 576615.0928989055, - 567600.7622991827, - 561155.9455313486, - 554807.9791262979, - 549389.3952406686, - 539049.0249887729, - 535664.3694369029, - 532191.2162044089, - 526041.1584421872, - 526335.500703045, - 523315.765847473, - 525479.2801375882, - 528823.2417065448, - 529040.4617375177, - 530275.6548028394, - 534385.4387297914, - 539277.0283354888, - 550691.665557408, - 556115.8046636633, - 554673.6760571464, - 553004.7117544797, - 555164.3361604782, - 557157.5238500847, - 553825.9069750865, - 542801.7688914627, - 520065.79354736634, - 507969.4399376227, - 502617.27964056376, - 499757.3818161613, - 498440.9623786049, - 499446.8866956617, - 500598.0642153951, - 502741.9871450878, - 503135.1529642434, - 502952.39481606166, - 500246.6949192689, - 499206.42877543776, - 498717.0275515174, - 497155.8961546646, - 495329.99540132156, - 494823.4622041595, - 494650.02403311443, - 494517.6159467865, - 492199.0680194843, - 494542.24367647595, - 496284.4744501094, - 497057.6897474751, - 503752.80529914465, - 515158.65522466245, - 526362.5898305068, - 534951.5138609835, - 543160.4683959835, - 545787.7986989849, - 547805.0152120664, - 545931.9405209353, - 540409.6639699064, - 531025.7581615796, - 524577.4261266395, - 515641.1713192049, - 507294.5040723015, - 500075.6394597031, - 493746.9883416917, - 488838.599173022, - 481122.51559297886, - 478435.05630119465, - 478003.45640277956, - 476101.53514605406, - 474274.1468340663, - 471033.5089241418, - 467495.289271678, - 463842.3677918338, - 460471.09064618556, - 455174.7107824525, - 443654.38421495596, - 440376.7259015181, - 435588.07166638545, - 430329.4361544973, - 425886.76742519194, - 422004.354583681, - 418459.64341413556, - 415719.90353176015, - 414315.9569146592, - 413155.81285817624, - 411267.3744067052, - 409776.0257871689, - 406873.47306, - 405720.79126065946, - 405398.1101199517, - 406504.4054495639, - 408357.0550816833, - 411284.6736105821, - 414557.85725479794, - 417150.95755323465, - 418672.3792445083, - 418540.37906729913, - 417028.65929425886, - 415647.2396531776, - 415248.87224575615, - 413495.56597447145, - 410657.5952862715, - 407096.4740679601, - 403561.5300010844, - 400485.65850246744, - 397332.8484492734, - 392632.0438401485, - 392523.30798648065, - 396332.6045006143, - 396889.4310524504, - 382814.8579630118, - 382657.33841195644, - 382205.1133754557, - 381972.50373608375, - 380434.31984946755, - 378719.81137004436, - 378726.3009850555, - 391788.34807542694, - 395667.5520028237, - 398524.2998586344, - 400138.2315851976, - 401269.55973052606, - 402078.0579074592, - 402957.42519396613, - 403697.7232361246, - 406142.0411991842, - 406992.49760916556, - 407625.08398222836, - 410266.3105723659, - 412677.7791347725, - 417121.3197273272, - 420865.2916254007, - 422152.1060329632, - 422904.54648227216, - 423625.2925645634, - 424004.74127276125, - 425623.19114567665, - 427016.98037454725, - 428577.4249941926, - 427504.3633240055, - 423558.981362237, - 417632.4230408886, - 412676.22821438656, - 409948.36306104716, - 407987.38890875323, - 405506.7559997233, - 401060.85920486785, - 398913.5428127836, - 397604.4141051544, - 396293.4577867024, - 395147.0223670648, - 395383.0473970818, - 395005.34868092823, - 396053.5273917579, - 396663.1645120657, - 397584.69434980204, - 398304.2349020177, - 398655.4972717616, - 399203.51749944926, - 400078.85855030443, - 399475.07022744964, - 398274.75410188833, - 396294.42141917814, - 401213.4195750363, - 404681.7672230409, - 410147.784734498, - 416393.51665545657, - 422077.3270349585, - 426874.6247126451, - 429540.46710581996, - 433868.5913736667, - 443794.8745772613, - 448416.4166680403, - 450429.72364547814, - 453573.37032621057, - 456352.0696478153, - 457501.67920838273, - 458129.95141417935, - 458863.2243478437, - 460447.2270404092, - 460586.1174001795, - 454104.0782728425, - 445806.5802587675, - 426829.654072333, - 430555.4121103503, - 431618.29902710405, - 417245.0264081541, - 411068.11096013786, - 407948.7234562894, - 405438.55644438136, - 405109.7715145737, - 407273.66683139553, - 424418.37796283007, - 429552.9475422088, - 432833.1989310952, - 431966.09310533135, - 437390.39524696814, - 436179.822471308, - 436291.250869551, - 446493.2164206826, - 460267.94138138863, - 453083.7596702291, - 456076.9980405931, - 474921.7066237315, - 503685.31026623835, - 519950.2934236119, - 529196.0000915255, - 533582.3587575544, - 533703.7386047081, - 539238.0289281713, - 544831.3077342586, - 550833.2733051346, - 557373.5476215512, - 572423.7705100026, - 576432.2311395386, - 575934.0663762145, - 573714.2892809199, - 568486.9515855926, - 564359.7111786223, - 558556.0908734542, - 553334.5584195612, - 555828.8665060549, - 554310.3376110914, - 550654.335400964, - 555294.0039249478, - 557191.6488008411, - 554125.2060104079, - 548689.0325831114, - 539343.1407521563, - 537943.0014117958, - 541830.3981110741, - 548105.00980422, - 558413.1340531372, - 565748.9256572281, - 553671.9443878764, - 547457.8826976696, - 549287.0886149266, - 554487.9761780261, - 557691.8069569005, - 565053.3103756333, - 572964.5194411185, - 577827.1089590304, - 581213.1692343487, - 588557.9834939621, - 600760.6859881635, - 632130.9018390942, - 663224.6561708003, - 677968.0178047506, - 675340.3360872994, - 670332.940962094, - 691289.09018603, - 721194.9900111278, - 794502.2904002988, - 827580.2620677697, - 867531.8641586566, - 894397.8326769826, - 918445.077340735, - 936402.4172963501, - 938057.4294797016, - 944022.4511349021, - 973039.7599749102, - 994663.148773666, - 1016909.8091436817, - 1054245.626990716, - 1077047.137429138, - 1099710.8244521886, - 1119801.402342172, - 1165906.25568846, - 1176512.2324515001, - 1175046.0375696062, - 1142423.8531460036, - 1121969.0266143593, - 1115523.7088775483, - 1122593.5131983731, - 1122119.3392862934, - 1124063.752571128, - 1136047.7515637705, - 1160094.8660244665, - 1164591.1810651307, - 1151312.6495658043, - 1134121.5692093493, - 1127094.6295325647, - 1130788.5781778276, - 1140580.5663910143, - 1171924.8491078643, - 1234700.3350912498, - 1262733.913683596, - 1307210.1470563516, - 1295176.2341271862, - 1219396.6334859529, - 1171814.9731511022, - 1156479.377209649, - 1157080.9524503695, - 1154583.185505199, - 1174530.1053174462, - 1197136.9677520508, - 1218129.4342660808, - 1151423.806067723, - 1122807.8775247298, - 1115492.081180536, - 1122182.993040153, - 1131972.9317705343, - 1131688.8267602273, - 1117989.994185223, - 1087456.1412913068, - 1008817.1657789215, - 973917.4731941274, - 960941.7521867555, - 953118.7709461908, - 946767.297530558, - 961382.7964263578, - 981935.4513437368, - 1070551.7303943215, - 1091436.2263427407, - 1103318.2923967538, - 1109659.047233555, - 1138605.865217522, - 1170265.5404320841, - 1198819.97399026, - 1219003.0987311543, - 1244949.766885828, - 1241526.5434044534, - 1226642.2756913386, - 1201939.2436375543, - 1184268.516375019, - 1147668.544004918, - 1121346.0857548635, - 1102215.3791583015, - 1070383.0866991756, - 1042040.7146866297, - 1014886.0418716501, - 980420.7712796107, - 937815.8006941924, - 894844.5554211672, - 858392.496568359, - 831409.7142806123, - 816283.448002064, - 807835.3314000905, - 803125.556950871, - 811348.7238331912, - 814765.7382464081, - 822447.080653505, - 838198.845901878, - 861650.5238942617, - 879408.6752118354, - 897858.4667562563, - 927740.9748013527, - 956356.2216572693, - 965736.2817677244, - 975351.5714024686, - 969070.0292261317, - 949165.5015873007, - 916587.3715618141, - 874457.4772405501, - 842438.6985984182, - 831626.3259428467, - 809088.3298257897, - 773349.059741685, - 739883.3047371187, - 711227.1544052681, - 686847.6769237512, - 673104.4780599606, - 671471.7885045992, - 686207.352405927, - 707499.984481839, - 733551.708940176, - 764210.3192967881, - 796100.4633149952, - 839049.7958865557, - 884077.9007329296, - 931600.3980674716, - 967063.8429794014, - 997848.7931967075, - 1008628.6842016116, - 1023155.6962311382, - 1032099.1051382372, - 1027456.1346733783, - 1018033.5478658522, - 1001300.9436053041, - 986460.7073539514, - 972151.3874751931, - 953709.1536481444, - 928498.8125999229, - 903513.4677487845, - 873732.6147365619, - 848115.1733483195, - 822097.6311232653, - 807122.1175122424, - 802443.5504671399, - 801721.2474285143, - 805613.3029522548, - 817154.0473031673, - 833188.6434923221, - 851345.3380419983, - 881232.3825596914, - 911005.6923811736, - 927842.2907114342, - 947505.3870987563, - 959284.5928788056, - 966845.0507292958, - 974313.4446237921, - 984281.214324902, - 994398.7945986792, - 999873.1663154995, - 1002987.1130661904, - 979726.6389886747, - 956044.1215097022, - 937449.3316250439, - 923231.0321813665, - 917013.2074832232, - 913796.5960818183, - 913654.4748813031, - 914935.5613609828, - 916630.6481545168, - 916459.3436820838, - 921670.1696641345, - 940133.9430766471, - 972479.032338822, - 992382.6263701684, - 1024838.5064765114, - 1058538.652211908, - 1088353.462943123, - 1115725.034667808, - 1142458.674326206, - 1159064.1077125273, - 1166562.567051561, - 1178954.207268173, - 1207972.3930376451, - 1235893.833648549, - 1262958.116995181, - 1296952.6749961444, - 1325162.3768488544, - 1344800.2008198088, - 1368833.422427241, - 1380361.874258062, - 1395638.4386387705, - 1411887.5333992615, - 1425765.2682916361, - 1436276.06455013, - 1426451.1541267126, - 1443440.9579523613, - 1466500.6724386003, - 1492861.4950137993, - 1514718.2126698503, - 1527995.0875618507, - 1556963.7597244193, - 1601734.3894741894, - 1627131.7403900805, - 1648751.294322676, - 1698681.7280659233, - 1725141.1954857267, - 1764727.017424147, - 1775855.5219910885, - 1806119.6414357838, - 1838957.3599939346, - 1858545.4559330558, - 1850355.5222330543, - 1850656.4570501614, - 1840896.0880128979, - 1846457.8254667567, - 1849206.8568642323, - 1860237.1848384633, - 1863735.1803415632, - 1866017.7642401448, - 1853556.8394135516, - 1842117.4331854046, - 1822177.7455710284, - 1800593.3162936384, - 1784167.9396930153, - 1758430.8476432161, - 1767602.487637866, - 1763919.2856189029, - 1745320.3897051907, - 1727454.9901646841, - 1726588.7724976575, - 1716279.7608537076, - 1685523.8306236689, - 1659076.6465248864, - 1619714.9397102415, - 1585551.2192633632, - 1525104.629120227, - 1454623.7663333775, - 1419819.00449475, - 1397821.42211805, - 1364219.1964628464, - 1351949.4123832486, - 1342382.6649252286, - 1335639.8364176427, - 1312137.4863288435, - 1294019.872870071, - 1300997.6955114186, - 1325523.8695632285, - 1351131.231405873, - 1371397.9714954686, - 1382917.956161823, - 1397898.7390031784, - 1405845.8249047683, - 1417654.9995586667, - 1445400.7303467952, - 1466488.2848064867, - 1486584.440359368, - 1505722.567942614, - 1527094.2613431595, - 1546768.0700746537, - 1594575.7115757957, - 1629897.5480902628, - 1784924.679559128, - 1909719.585133535, - 2013807.8965145275, - 1952732.4851036093, - 1982840.695327489, - 2083644.846162248, - 2219636.1013300032, - 2336853.0725021795, - 2440441.159491722, - 2619461.281855846, - 2737711.0710474034, - 3240792.574891779, - 3862258.0396483787, - 4052670.548675665, - 3916213.7108335337, - 3828471.630984529, - 3711884.7516261376, - 3625353.4512030883, - 3411645.977879639, - 3222038.5823374516, - 3044853.2389771827, - 2852999.2708225525, - 2708362.29220592, - 2621538.807144801, - 2554618.456806506, - 2511449.7709056027, - 2462658.1648098337, - 2320993.0931519866, - 2325330.2697147327, - 2377379.3437381973, - 2384587.9862998896, - 2679828.434264056, - 2764898.978999833, - 2755808.389731706, - 2674209.681975685, - 2548787.3253814834, - 2449652.8645002665, - 2412734.7589437664, - 2374770.780598217, - 2269999.1270953217, - 2185183.8391982256, - 2100699.9476919496, - 2032919.4146727964, - 1947962.8061206588, - 1878023.1802559325, - 1827075.6727546134, - 1758325.9343392102, - 1717118.1007336513, - 1682833.3774107373, - 1643797.3575575887, - 1621952.571828536, - 1597566.8533398598, - 1631592.7963878494, - 1685611.07489357, - 1750042.3739052655, - 1841069.4705221707, - 1911479.3014280915, - 1982525.8268147085, - 2048062.4843906602, - 2133187.175865137, - 2172743.7353195213, - 2150370.1775310924, - 2137898.820115814, - 2082640.5825460649, - 1934368.4881325297, - 1899140.8437411275, - 1770893.0140148865, - 1584253.7765272125, - 1612459.6187155296, - 1631647.1698842456, - 1600263.268859926, - 1605373.2365410172, - 1622913.101198536, - 1729785.9762391807, - 1823678.3557781484, - 1894960.556006578, - 1932430.775366639, - 1963182.9777934388, - 1891277.6511432156, - 1900354.306889267, - 1904363.1698873348, - 1904707.3954301162, - 1928854.6916935744, - 1962085.1819763824, - 1942409.8455687822, - 1955472.4942335486, - 1978414.6013525748, - 1975474.6167583163, - 1981041.8956900777, - 1998041.7313737816, - 2022616.8846655297, - 2063828.4970846015, - 2115963.3898072, - 2174092.4515753975, - 2168719.9309092527, - 2184649.519370436, - 2197889.648314443, - 2221918.8733221767, - 2325580.666242723, - 2367520.927848141, - 2386370.1587234624, - 2414459.0742175984, - 2447974.9320085924, - 2475395.338716032, - 2494765.524812374, - 2538540.048882583, - 2555324.485824556, - 2583356.665185566, - 2603176.5054337974, - 2572579.506678633, - 2555479.181506055, - 2529678.8166199545, - 2517091.464426029, - 2548855.6738507096, - 2608388.6895243274, - 2686730.6621531285, - 2739774.792076896, - 2785395.687512672, - 2801006.471803062, - 2843690.5538521428, - 2833742.6062887656, - 2727531.4191609183, - 2713024.3263277602, - 2844234.953528938, - 2922244.242409899, - 2936594.716747877, - 2949080.2260541157, - 2947878.2975937403, - 2925681.55297359, - 2897774.9892747793, - 2914378.0673288335, - 2954595.20047197, - 2962840.8456237162, - 3006381.5038923346, - 3185234.372366579, - 3280719.6337845293, - 3358690.221338288, - 3442248.070707781, - 3463938.0104829185, - 3449173.580019503, - 3517585.298777484, - 3509613.6623706766, - 3447624.569667208, - 3413104.032037645, - 3368906.603340108, - 3346951.9665643675, - 3292029.5771313813, - 3273994.136206194, - 3272399.199986715, - 3275860.2862882875, - 3293545.573197099, - 3290605.9081769395, - 3270804.835742199, - 3246646.668472314, - 3304249.0841800226, - 3333848.372005796, - 3367665.0671505053, - 3415234.456785635, - 3462762.1841067877, - 3492075.413332637, - 3498389.1997905765, - 3488732.347623627, - 3471584.392858698, - 3430588.4272419824, - 3469557.5805992046, - 3551106.604598077, - 3543044.3794745984, - 3543301.9048639266, - 3571742.113976129, - 3610298.290080082, - 3657330.5838814583, - 3724342.943663963, - 3769556.507663064, - 3865491.612319793, - 3937051.9263450834, - 3991353.883839369, - 4038659.876566922, - 4116438.5827772883, - 4163314.009911967, - 4185859.952390842, - 4195127.840617416, - 4235034.723293669, - 4266690.613889253, - 4295579.801245391, - 4323058.404883921, - 4328511.75572717, - 4310314.465536653, - 4270727.180520539, - 4215920.319475585, - 4164182.2314913655, - 4099020.3983624014, - 4021390.368024827, - 3930456.5976992017, - 3857118.671242515 - ], - "yaxis": "y" - } - ], - "layout": { - "legend": { - "title": { - "text": "variable" - }, - "tracegroupgap": 0 - }, - "margin": { - "t": 60 - }, - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "heatmapgl": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmapgl" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "xaxis": { - "anchor": "y", - "domain": [ - 0, - 1 - ], - "title": { - "text": "datetime" - } - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0, - 1 - ], - "title": { - "text": "value" - } - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "all_eq = pd.DataFrame()\n", - "smoothen = True\n", - "for agg in aggregators:\n", - " agg_eq = agg._equity.Total\n", - " if smoothen:\n", - " agg_eq = agg_eq.ewm(span = carlo_config['plot_ewm_span']).mean()\n", - " all_eq[agg.target] = agg_eq\n", - "\n", - "all_eq.ffill().plot()" - ] - }, - { - "cell_type": "code", - "execution_count": 137, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "hovertemplate": "variable=BASE
datetime=%{x}
value=%{y}", - "legendgroup": "BASE", - "line": { - "color": "#636efa", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "BASE", - "showlegend": true, - "type": "scattergl", - "x": [ - "2017-01-05T00:00:00", - "2017-01-06T00:00:00", - "2017-01-09T00:00:00", - "2017-01-10T00:00:00", - "2017-01-11T00:00:00", - "2017-01-12T00:00:00", - "2017-01-13T00:00:00", - "2017-01-17T00:00:00", - "2017-01-18T00:00:00", - "2017-01-19T00:00:00", - "2017-01-20T00:00:00", - "2017-01-23T00:00:00", - "2017-01-24T00:00:00", - "2017-01-25T00:00:00", - "2017-01-26T00:00:00", - "2017-01-27T00:00:00", - "2017-01-30T00:00:00", - "2017-01-31T00:00:00", - "2017-02-01T00:00:00", - "2017-02-02T00:00:00", - "2017-02-03T00:00:00", - "2017-02-06T00:00:00", - "2017-02-07T00:00:00", - "2017-02-08T00:00:00", - "2017-02-09T00:00:00", - "2017-02-10T00:00:00", - "2017-02-13T00:00:00", - "2017-02-14T00:00:00", - "2017-02-15T00:00:00", - "2017-02-16T00:00:00", - "2017-02-17T00:00:00", - "2017-02-21T00:00:00", - "2017-02-22T00:00:00", - "2017-02-23T00:00:00", - "2017-02-24T00:00:00", - "2017-02-27T00:00:00", - "2017-02-28T00:00:00", - "2017-03-01T00:00:00", - "2017-03-02T00:00:00", - "2017-03-03T00:00:00", - "2017-03-06T00:00:00", - "2017-03-07T00:00:00", - "2017-03-08T00:00:00", - "2017-03-09T00:00:00", - "2017-03-10T00:00:00", - "2017-03-13T00:00:00", - "2017-03-14T00:00:00", - "2017-03-15T00:00:00", - "2017-03-16T00:00:00", - "2017-03-17T00:00:00", - "2017-03-20T00:00:00", - "2017-03-21T00:00:00", - "2017-03-22T00:00:00", - "2017-03-23T00:00:00", - "2017-03-24T00:00:00", - "2017-03-27T00:00:00", - "2017-03-28T00:00:00", - "2017-03-29T00:00:00", - "2017-03-30T00:00:00", - "2017-03-31T00:00:00", - "2017-04-03T00:00:00", - "2017-04-04T00:00:00", - "2017-04-05T00:00:00", - "2017-04-06T00:00:00", - "2017-04-07T00:00:00", - "2017-04-10T00:00:00", - "2017-04-11T00:00:00", - "2017-04-12T00:00:00", - "2017-04-13T00:00:00", - "2017-04-17T00:00:00", - "2017-04-18T00:00:00", - "2017-04-19T00:00:00", - "2017-04-20T00:00:00", - "2017-04-21T00:00:00", - "2017-04-24T00:00:00", - "2017-04-25T00:00:00", - "2017-04-26T00:00:00", - "2017-04-27T00:00:00", - "2017-04-28T00:00:00", - "2017-05-01T00:00:00", - "2017-05-02T00:00:00", - "2017-05-03T00:00:00", - "2017-05-04T00:00:00", - "2017-05-05T00:00:00", - "2017-05-08T00:00:00", - "2017-05-09T00:00:00", - "2017-05-10T00:00:00", - "2017-05-11T00:00:00", - "2017-05-12T00:00:00", - "2017-05-15T00:00:00", - "2017-05-16T00:00:00", - "2017-05-17T00:00:00", - "2017-05-18T00:00:00", - "2017-05-19T00:00:00", - "2017-05-22T00:00:00", - "2017-05-23T00:00:00", - "2017-05-24T00:00:00", - "2017-05-25T00:00:00", - "2017-05-26T00:00:00", - "2017-05-29T00:00:00", - "2017-05-30T00:00:00", - "2017-05-31T00:00:00", - "2017-06-01T00:00:00", - "2017-06-02T00:00:00", - "2017-06-05T00:00:00", - "2017-06-06T00:00:00", - "2017-06-07T00:00:00", - "2017-06-08T00:00:00", - "2017-06-09T00:00:00", - "2017-06-12T00:00:00", - "2017-06-13T00:00:00", - "2017-06-14T00:00:00", - "2017-06-15T00:00:00", - "2017-06-16T00:00:00", - "2017-06-19T00:00:00", - "2017-06-20T00:00:00", - "2017-06-21T00:00:00", - "2017-06-22T00:00:00", - "2017-06-23T00:00:00", - "2017-06-26T00:00:00", - "2017-06-27T00:00:00", - "2017-06-28T00:00:00", - "2017-06-29T00:00:00", - "2017-06-30T00:00:00", - "2017-07-03T00:00:00", - "2017-07-05T00:00:00", - "2017-07-06T00:00:00", - "2017-07-07T00:00:00", - "2017-07-10T00:00:00", - "2017-07-11T00:00:00", - "2017-07-12T00:00:00", - "2017-07-13T00:00:00", - "2017-07-14T00:00:00", - "2017-07-17T00:00:00", - "2017-07-18T00:00:00", - "2017-07-19T00:00:00", - "2017-07-20T00:00:00", - "2017-07-21T00:00:00", - "2017-07-24T00:00:00", - "2017-07-25T00:00:00", - "2017-07-26T00:00:00", - "2017-07-27T00:00:00", - "2017-07-28T00:00:00", - "2017-07-31T00:00:00", - "2017-08-01T00:00:00", - "2017-08-02T00:00:00", - "2017-08-03T00:00:00", - "2017-08-04T00:00:00", - "2017-08-07T00:00:00", - "2017-08-08T00:00:00", - "2017-08-09T00:00:00", - "2017-08-10T00:00:00", - "2017-08-11T00:00:00", - "2017-08-14T00:00:00", - "2017-08-15T00:00:00", - "2017-08-16T00:00:00", - "2017-08-17T00:00:00", - "2017-08-18T00:00:00", - "2017-08-21T00:00:00", - "2017-08-22T00:00:00", - "2017-08-23T00:00:00", - "2017-08-24T00:00:00", - "2017-08-25T00:00:00", - "2017-08-28T00:00:00", - "2017-08-29T00:00:00", - "2017-08-30T00:00:00", - "2017-08-31T00:00:00", - "2017-09-01T00:00:00", - "2017-09-05T00:00:00", - "2017-09-06T00:00:00", - "2017-09-07T00:00:00", - "2017-09-08T00:00:00", - "2017-09-11T00:00:00", - "2017-09-12T00:00:00", - "2017-09-13T00:00:00", - "2017-09-14T00:00:00", - "2017-09-15T00:00:00", - "2017-09-18T00:00:00", - "2017-09-19T00:00:00", - "2017-09-20T00:00:00", - "2017-09-21T00:00:00", - "2017-09-22T00:00:00", - "2017-09-25T00:00:00", - "2017-09-26T00:00:00", - "2017-09-27T00:00:00", - "2017-09-28T00:00:00", - "2017-09-29T00:00:00", - "2017-10-02T00:00:00", - "2017-10-03T00:00:00", - "2017-10-04T00:00:00", - "2017-10-05T00:00:00", - "2017-10-06T00:00:00", - "2017-10-09T00:00:00", - "2017-10-10T00:00:00", - "2017-10-11T00:00:00", - "2017-10-12T00:00:00", - "2017-10-13T00:00:00", - "2017-10-16T00:00:00", - "2017-10-17T00:00:00", - "2017-10-18T00:00:00", - "2017-10-19T00:00:00", - "2017-10-20T00:00:00", - "2017-10-23T00:00:00", - "2017-10-24T00:00:00", - "2017-10-25T00:00:00", - "2017-10-26T00:00:00", - "2017-10-27T00:00:00", - "2017-10-30T00:00:00", - "2017-10-31T00:00:00", - "2017-11-01T00:00:00", - "2017-11-02T00:00:00", - "2017-11-03T00:00:00", - "2017-11-06T00:00:00", - "2017-11-07T00:00:00", - "2017-11-08T00:00:00", - "2017-11-09T00:00:00", - "2017-11-10T00:00:00", - "2017-11-13T00:00:00", - "2017-11-14T00:00:00", - "2017-11-15T00:00:00", - "2017-11-16T00:00:00", - "2017-11-17T00:00:00", - "2017-11-20T00:00:00", - "2017-11-21T00:00:00", - "2017-11-22T00:00:00", - "2017-11-24T00:00:00", - "2017-11-27T00:00:00", - "2017-11-28T00:00:00", - "2017-11-29T00:00:00", - "2017-11-30T00:00:00", - "2017-12-01T00:00:00", - "2017-12-04T00:00:00", - "2017-12-05T00:00:00", - "2017-12-06T00:00:00", - "2017-12-07T00:00:00", - "2017-12-08T00:00:00", - "2017-12-11T00:00:00", - "2017-12-12T00:00:00", - "2017-12-13T00:00:00", - "2017-12-14T00:00:00", - "2017-12-15T00:00:00", - "2017-12-18T00:00:00", - "2017-12-19T00:00:00", - "2017-12-20T00:00:00", - "2017-12-21T00:00:00", - "2017-12-22T00:00:00", - "2017-12-26T00:00:00", - "2017-12-27T00:00:00", - "2017-12-28T00:00:00", - "2017-12-29T00:00:00", - "2018-01-01T00:00:00", - "2018-01-02T00:00:00", - "2018-01-04T00:00:00", - "2018-01-05T00:00:00", - "2018-01-08T00:00:00", - "2018-01-09T00:00:00", - "2018-01-10T00:00:00", - "2018-01-11T00:00:00", - "2018-01-12T00:00:00", - "2018-01-15T00:00:00", - "2018-01-16T00:00:00", - "2018-01-17T00:00:00", - "2018-01-18T00:00:00", - "2018-01-19T00:00:00", - "2018-01-22T00:00:00", - "2018-01-23T00:00:00", - "2018-01-24T00:00:00", - "2018-01-25T00:00:00", - "2018-01-26T00:00:00", - "2018-01-29T00:00:00", - "2018-01-30T00:00:00", - "2018-01-31T00:00:00", - "2018-02-01T00:00:00", - "2018-02-02T00:00:00", - "2018-02-05T00:00:00", - "2018-02-06T00:00:00", - "2018-02-07T00:00:00", - "2018-02-08T00:00:00", - "2018-02-09T00:00:00", - "2018-02-12T00:00:00", - "2018-02-13T00:00:00", - "2018-02-14T00:00:00", - "2018-02-15T00:00:00", - "2018-02-16T00:00:00", - "2018-02-20T00:00:00", - "2018-02-21T00:00:00", - "2018-02-22T00:00:00", - "2018-02-23T00:00:00", - "2018-02-26T00:00:00", - "2018-02-27T00:00:00", - "2018-02-28T00:00:00", - "2018-03-01T00:00:00", - "2018-03-02T00:00:00", - "2018-03-05T00:00:00", - "2018-03-06T00:00:00", - "2018-03-07T00:00:00", - "2018-03-08T00:00:00", - "2018-03-09T00:00:00", - "2018-03-12T00:00:00", - "2018-03-13T00:00:00", - "2018-03-14T00:00:00", - "2018-03-15T00:00:00", - "2018-03-16T00:00:00", - "2018-03-19T00:00:00", - "2018-03-20T00:00:00", - "2018-03-21T00:00:00", - "2018-03-22T00:00:00", - "2018-03-23T00:00:00", - "2018-03-26T00:00:00", - "2018-03-27T00:00:00", - "2018-03-28T00:00:00", - "2018-03-29T00:00:00", - "2018-04-02T00:00:00", - "2018-04-03T00:00:00", - "2018-04-04T00:00:00", - "2018-04-05T00:00:00", - "2018-04-06T00:00:00", - "2018-04-09T00:00:00", - "2018-04-10T00:00:00", - "2018-04-11T00:00:00", - "2018-04-12T00:00:00", - "2018-04-13T00:00:00", - "2018-04-16T00:00:00", - "2018-04-17T00:00:00", - "2018-04-18T00:00:00", - "2018-04-19T00:00:00", - "2018-04-20T00:00:00", - "2018-04-23T00:00:00", - "2018-04-24T00:00:00", - "2018-04-25T00:00:00", - "2018-04-26T00:00:00", - "2018-04-27T00:00:00", - "2018-04-30T00:00:00", - "2018-05-01T00:00:00", - "2018-05-02T00:00:00", - "2018-05-03T00:00:00", - "2018-05-04T00:00:00", - "2018-05-07T00:00:00", - "2018-05-08T00:00:00", - "2018-05-09T00:00:00", - "2018-05-10T00:00:00", - "2018-05-11T00:00:00", - "2018-05-14T00:00:00", - "2018-05-15T00:00:00", - "2018-05-16T00:00:00", - "2018-05-17T00:00:00", - "2018-05-18T00:00:00", - "2018-05-21T00:00:00", - "2018-05-22T00:00:00", - "2018-05-23T00:00:00", - "2018-05-24T00:00:00", - "2018-05-25T00:00:00", - "2018-05-28T00:00:00", - "2018-05-29T00:00:00", - "2018-05-30T00:00:00", - "2018-05-31T00:00:00", - "2018-06-01T00:00:00", - "2018-06-04T00:00:00", - "2018-06-05T00:00:00", - "2018-06-06T00:00:00", - "2018-06-07T00:00:00", - "2018-06-08T00:00:00", - "2018-06-11T00:00:00", - "2018-06-12T00:00:00", - "2018-06-13T00:00:00", - "2018-06-14T00:00:00", - "2018-06-15T00:00:00", - "2018-06-18T00:00:00", - "2018-06-19T00:00:00", - "2018-06-20T00:00:00", - "2018-06-21T00:00:00", - "2018-06-22T00:00:00", - "2018-06-25T00:00:00", - "2018-06-26T00:00:00", - "2018-06-27T00:00:00", - "2018-06-28T00:00:00", - "2018-06-29T00:00:00", - "2018-07-02T00:00:00", - "2018-07-03T00:00:00", - "2018-07-05T00:00:00", - "2018-07-06T00:00:00", - "2018-07-09T00:00:00", - "2018-07-10T00:00:00", - "2018-07-11T00:00:00", - "2018-07-12T00:00:00", - "2018-07-13T00:00:00", - "2018-07-16T00:00:00", - "2018-07-17T00:00:00", - "2018-07-18T00:00:00", - "2018-07-19T00:00:00", - "2018-07-20T00:00:00", - "2018-07-23T00:00:00", - "2018-07-24T00:00:00", - "2018-07-25T00:00:00", - "2018-07-26T00:00:00", - "2018-07-27T00:00:00", - "2018-07-30T00:00:00", - "2018-07-31T00:00:00", - "2018-08-01T00:00:00", - "2018-08-02T00:00:00", - "2018-08-03T00:00:00", - "2018-08-06T00:00:00", - "2018-08-07T00:00:00", - "2018-08-08T00:00:00", - "2018-08-09T00:00:00", - "2018-08-10T00:00:00", - "2018-08-13T00:00:00", - "2018-08-14T00:00:00", - "2018-08-15T00:00:00", - "2018-08-16T00:00:00", - "2018-08-17T00:00:00", - "2018-08-20T00:00:00", - "2018-08-21T00:00:00", - "2018-08-22T00:00:00", - "2018-08-23T00:00:00", - "2018-08-24T00:00:00", - "2018-08-27T00:00:00", - "2018-08-28T00:00:00", - "2018-08-29T00:00:00", - "2018-08-30T00:00:00", - "2018-08-31T00:00:00", - "2018-09-03T00:00:00", - "2018-09-04T00:00:00", - "2018-09-05T00:00:00", - "2018-09-06T00:00:00", - "2018-09-07T00:00:00", - "2018-09-10T00:00:00", - "2018-09-11T00:00:00", - "2018-09-12T00:00:00", - "2018-09-13T00:00:00", - "2018-09-14T00:00:00", - "2018-09-17T00:00:00", - "2018-09-18T00:00:00", - "2018-09-19T00:00:00", - "2018-09-20T00:00:00", - "2018-09-21T00:00:00", - "2018-09-24T00:00:00", - "2018-09-25T00:00:00", - "2018-09-26T00:00:00", - "2018-09-27T00:00:00", - "2018-09-28T00:00:00", - "2018-10-01T00:00:00", - "2018-10-02T00:00:00", - "2018-10-03T00:00:00", - "2018-10-04T00:00:00", - "2018-10-05T00:00:00", - "2018-10-08T00:00:00", - "2018-10-09T00:00:00", - "2018-10-10T00:00:00", - "2018-10-11T00:00:00", - "2018-10-12T00:00:00", - "2018-10-15T00:00:00", - "2018-10-16T00:00:00", - "2018-10-17T00:00:00", - "2018-10-18T00:00:00", - "2018-10-19T00:00:00", - "2018-10-22T00:00:00", - "2018-10-23T00:00:00", - "2018-10-24T00:00:00", - "2018-10-25T00:00:00", - "2018-10-26T00:00:00", - "2018-10-29T00:00:00", - "2018-10-30T00:00:00", - "2018-10-31T00:00:00", - "2018-11-01T00:00:00", - "2018-11-02T00:00:00", - "2018-11-05T00:00:00", - "2018-11-06T00:00:00", - "2018-11-07T00:00:00", - "2018-11-08T00:00:00", - "2018-11-09T00:00:00", - "2018-11-12T00:00:00", - "2018-11-13T00:00:00", - "2018-11-14T00:00:00", - "2018-11-15T00:00:00", - "2018-11-16T00:00:00", - "2018-11-19T00:00:00", - "2018-11-20T00:00:00", - "2018-11-21T00:00:00", - "2018-11-23T00:00:00", - "2018-11-26T00:00:00", - "2018-11-27T00:00:00", - "2018-11-28T00:00:00", - "2018-11-29T00:00:00", - "2018-11-30T00:00:00", - "2018-12-03T00:00:00", - "2018-12-04T00:00:00", - "2018-12-06T00:00:00", - "2018-12-07T00:00:00", - "2018-12-10T00:00:00", - "2018-12-11T00:00:00", - "2018-12-12T00:00:00", - "2018-12-13T00:00:00", - "2018-12-14T00:00:00", - "2018-12-17T00:00:00", - "2018-12-18T00:00:00", - "2018-12-19T00:00:00", - "2018-12-20T00:00:00", - "2018-12-21T00:00:00", - "2018-12-24T00:00:00", - "2018-12-26T00:00:00", - "2018-12-27T00:00:00", - "2018-12-28T00:00:00", - "2018-12-31T00:00:00", - "2019-01-01T00:00:00", - "2019-01-02T00:00:00", - "2019-01-04T00:00:00", - "2019-01-08T00:00:00", - "2019-01-09T00:00:00", - "2019-01-10T00:00:00", - "2019-01-11T00:00:00", - "2019-01-16T00:00:00", - "2019-01-18T00:00:00", - "2019-01-22T00:00:00", - "2019-01-23T00:00:00", - "2019-01-24T00:00:00", - "2019-01-28T00:00:00", - "2019-01-29T00:00:00", - "2019-01-30T00:00:00", - "2019-01-31T00:00:00", - "2019-02-01T00:00:00", - "2019-02-04T00:00:00", - "2019-02-05T00:00:00", - "2019-02-06T00:00:00", - "2019-02-07T00:00:00", - "2019-02-08T00:00:00", - "2019-02-11T00:00:00", - "2019-02-12T00:00:00", - "2019-02-13T00:00:00", - "2019-02-14T00:00:00", - "2019-02-15T00:00:00", - "2019-02-18T00:00:00", - "2019-02-19T00:00:00", - "2019-02-20T00:00:00", - "2019-02-21T00:00:00", - "2019-02-22T00:00:00", - "2019-02-25T00:00:00", - "2019-02-26T00:00:00", - "2019-02-27T00:00:00", - "2019-02-28T00:00:00", - "2019-03-01T00:00:00", - "2019-03-04T00:00:00", - "2019-03-05T00:00:00", - "2019-03-06T00:00:00", - "2019-03-07T00:00:00", - "2019-03-08T00:00:00", - "2019-03-11T00:00:00", - "2019-03-12T00:00:00", - "2019-03-13T00:00:00", - "2019-03-14T00:00:00", - "2019-03-15T00:00:00", - "2019-03-18T00:00:00", - "2019-03-19T00:00:00", - "2019-03-20T00:00:00", - "2019-03-21T00:00:00", - "2019-03-22T00:00:00", - "2019-03-25T00:00:00", - "2019-03-26T00:00:00", - "2019-03-27T00:00:00", - "2019-03-28T00:00:00", - "2019-03-29T00:00:00", - "2019-04-01T00:00:00", - "2019-04-02T00:00:00", - "2019-04-03T00:00:00", - "2019-04-04T00:00:00", - "2019-04-05T00:00:00", - "2019-04-08T00:00:00", - "2019-04-09T00:00:00", - "2019-04-10T00:00:00", - "2019-04-11T00:00:00", - "2019-04-12T00:00:00", - "2019-04-15T00:00:00", - "2019-04-16T00:00:00", - "2019-04-17T00:00:00", - "2019-04-18T00:00:00", - "2019-04-19T00:00:00", - "2019-04-22T00:00:00", - "2019-04-23T00:00:00", - "2019-04-24T00:00:00", - "2019-04-25T00:00:00", - "2019-04-26T00:00:00", - "2019-04-29T00:00:00", - "2019-04-30T00:00:00", - "2019-05-01T00:00:00", - "2019-05-02T00:00:00", - "2019-05-03T00:00:00", - "2019-05-06T00:00:00", - "2019-05-07T00:00:00", - "2019-05-08T00:00:00", - "2019-05-09T00:00:00", - "2019-05-10T00:00:00", - "2019-05-13T00:00:00", - "2019-05-14T00:00:00", - "2019-05-15T00:00:00", - "2019-05-16T00:00:00", - "2019-05-17T00:00:00", - "2019-05-20T00:00:00", - "2019-05-21T00:00:00", - "2019-05-22T00:00:00", - "2019-05-23T00:00:00", - "2019-05-24T00:00:00", - "2019-05-28T00:00:00", - "2019-05-29T00:00:00", - "2019-05-30T00:00:00", - "2019-05-31T00:00:00", - "2019-06-03T00:00:00", - "2019-06-04T00:00:00", - "2019-06-05T00:00:00", - "2019-06-06T00:00:00", - "2019-06-07T00:00:00", - "2019-06-10T00:00:00", - "2019-06-11T00:00:00", - "2019-06-12T00:00:00", - "2019-06-13T00:00:00", - "2019-06-14T00:00:00", - "2019-06-17T00:00:00", - "2019-06-18T00:00:00", - "2019-06-19T00:00:00", - "2019-06-20T00:00:00", - "2019-06-21T00:00:00", - "2019-06-24T00:00:00", - "2019-06-25T00:00:00", - "2019-06-26T00:00:00", - "2019-06-27T00:00:00", - "2019-06-28T00:00:00", - "2019-07-01T00:00:00", - "2019-07-02T00:00:00", - "2019-07-03T00:00:00", - "2019-07-04T00:00:00", - "2019-07-05T00:00:00", - "2019-07-08T00:00:00", - "2019-07-09T00:00:00", - "2019-07-10T00:00:00", - "2019-07-11T00:00:00", - "2019-07-12T00:00:00", - "2019-07-15T00:00:00", - "2019-07-16T00:00:00", - "2019-07-17T00:00:00", - "2019-07-18T00:00:00", - "2019-07-19T00:00:00", - "2019-07-22T00:00:00", - "2019-07-23T00:00:00", - "2019-07-24T00:00:00", - "2019-07-25T00:00:00", - "2019-07-26T00:00:00", - "2019-07-29T00:00:00", - "2019-07-30T00:00:00", - "2019-07-31T00:00:00", - "2019-08-01T00:00:00", - "2019-08-02T00:00:00", - "2019-08-05T00:00:00", - "2019-08-06T00:00:00", - "2019-08-07T00:00:00", - "2019-08-08T00:00:00", - "2019-08-09T00:00:00", - "2019-08-12T00:00:00", - "2019-08-13T00:00:00", - "2019-08-14T00:00:00", - "2019-08-15T00:00:00", - "2019-08-16T00:00:00", - "2019-08-19T00:00:00", - "2019-08-20T00:00:00", - "2019-08-21T00:00:00", - "2019-08-22T00:00:00", - "2019-08-23T00:00:00", - "2019-08-26T00:00:00", - "2019-08-27T00:00:00", - "2019-08-28T00:00:00", - "2019-08-29T00:00:00", - "2019-08-30T00:00:00", - "2019-09-03T00:00:00", - "2019-09-04T00:00:00", - "2019-09-05T00:00:00", - "2019-09-06T00:00:00", - "2019-09-09T00:00:00", - "2019-09-10T00:00:00", - "2019-09-11T00:00:00", - "2019-09-12T00:00:00", - "2019-09-13T00:00:00", - "2019-09-16T00:00:00", - "2019-09-17T00:00:00", - "2019-09-18T00:00:00", - "2019-09-19T00:00:00", - "2019-09-20T00:00:00", - "2019-09-23T00:00:00", - "2019-09-24T00:00:00", - "2019-09-25T00:00:00", - "2019-09-26T00:00:00", - "2019-09-27T00:00:00", - "2019-09-30T00:00:00", - "2019-10-01T00:00:00", - "2019-10-02T00:00:00", - "2019-10-03T00:00:00", - "2019-10-04T00:00:00", - "2019-10-07T00:00:00", - "2019-10-08T00:00:00", - "2019-10-09T00:00:00", - "2019-10-10T00:00:00", - "2019-10-11T00:00:00", - "2019-10-14T00:00:00", - "2019-10-15T00:00:00", - "2019-10-16T00:00:00", - "2019-10-17T00:00:00", - "2019-10-18T00:00:00", - "2019-10-21T00:00:00", - "2019-10-22T00:00:00", - "2019-10-23T00:00:00", - "2019-10-24T00:00:00", - "2019-10-25T00:00:00", - "2019-10-28T00:00:00", - "2019-10-29T00:00:00", - "2019-10-30T00:00:00", - "2019-10-31T00:00:00", - "2019-11-01T00:00:00", - "2019-11-04T00:00:00", - "2019-11-05T00:00:00", - "2019-11-06T00:00:00", - "2019-11-07T00:00:00", - "2019-11-08T00:00:00", - "2019-11-11T00:00:00", - "2019-11-12T00:00:00", - "2019-11-13T00:00:00", - "2019-11-14T00:00:00", - "2019-11-15T00:00:00", - "2019-11-18T00:00:00", - "2019-11-19T00:00:00", - "2019-11-20T00:00:00", - "2019-11-21T00:00:00", - "2019-11-22T00:00:00", - "2019-11-25T00:00:00", - "2019-11-26T00:00:00", - "2019-11-27T00:00:00", - "2019-11-28T00:00:00", - "2019-11-29T00:00:00", - "2019-12-02T00:00:00", - "2019-12-03T00:00:00", - "2019-12-04T00:00:00", - "2019-12-05T00:00:00", - "2019-12-06T00:00:00", - "2019-12-09T00:00:00", - "2019-12-10T00:00:00", - "2019-12-11T00:00:00", - "2019-12-12T00:00:00", - "2019-12-13T00:00:00", - "2019-12-16T00:00:00", - "2019-12-17T00:00:00", - "2019-12-18T00:00:00", - "2019-12-19T00:00:00", - "2019-12-20T00:00:00", - "2019-12-23T00:00:00", - "2019-12-24T00:00:00", - "2019-12-26T00:00:00", - "2019-12-27T00:00:00", - "2019-12-30T00:00:00", - "2019-12-31T00:00:00", - "2020-01-01T00:00:00", - "2020-01-02T00:00:00", - "2020-01-06T00:00:00", - "2020-01-07T00:00:00", - "2020-01-08T00:00:00", - "2020-01-09T00:00:00", - "2020-01-10T00:00:00", - "2020-01-13T00:00:00", - "2020-01-14T00:00:00", - "2020-01-15T00:00:00", - "2020-01-16T00:00:00", - "2020-01-17T00:00:00", - "2020-01-21T00:00:00", - "2020-01-22T00:00:00", - "2020-01-23T00:00:00", - "2020-01-24T00:00:00", - "2020-01-27T00:00:00", - "2020-01-28T00:00:00", - "2020-01-29T00:00:00", - "2020-01-30T00:00:00", - "2020-01-31T00:00:00", - "2020-02-03T00:00:00", - "2020-02-04T00:00:00", - "2020-02-05T00:00:00", - "2020-02-06T00:00:00", - "2020-02-07T00:00:00", - "2020-02-10T00:00:00", - "2020-02-11T00:00:00", - "2020-02-12T00:00:00", - "2020-02-13T00:00:00", - "2020-02-14T00:00:00", - "2020-02-18T00:00:00", - "2020-02-19T00:00:00", - "2020-02-20T00:00:00", - "2020-02-21T00:00:00", - "2020-02-24T00:00:00", - "2020-02-25T00:00:00", - "2020-02-26T00:00:00", - "2020-02-27T00:00:00", - "2020-02-28T00:00:00", - "2020-03-02T00:00:00", - "2020-03-03T00:00:00", - "2020-03-04T00:00:00", - "2020-03-05T00:00:00", - "2020-03-06T00:00:00", - "2020-03-09T00:00:00", - "2020-03-10T00:00:00", - "2020-03-11T00:00:00", - "2020-03-12T00:00:00", - "2020-03-13T00:00:00", - "2020-03-16T00:00:00", - "2020-03-17T00:00:00", - "2020-03-18T00:00:00", - "2020-03-19T00:00:00", - "2020-03-20T00:00:00", - "2020-03-23T00:00:00", - "2020-03-24T00:00:00", - "2020-03-25T00:00:00", - "2020-03-26T00:00:00", - "2020-03-27T00:00:00", - "2020-03-30T00:00:00", - "2020-03-31T00:00:00", - "2020-04-01T00:00:00", - "2020-04-02T00:00:00", - "2020-04-03T00:00:00", - "2020-04-06T00:00:00", - "2020-04-07T00:00:00", - "2020-04-08T00:00:00", - "2020-04-09T00:00:00", - "2020-04-13T00:00:00", - "2020-04-14T00:00:00", - "2020-04-15T00:00:00", - "2020-04-16T00:00:00", - "2020-04-17T00:00:00", - "2020-04-20T00:00:00", - "2020-04-21T00:00:00", - "2020-04-22T00:00:00", - "2020-04-23T00:00:00", - "2020-04-24T00:00:00", - "2020-04-27T00:00:00", - "2020-04-28T00:00:00", - "2020-04-29T00:00:00", - "2020-04-30T00:00:00", - "2020-05-01T00:00:00", - "2020-05-04T00:00:00", - "2020-05-05T00:00:00", - "2020-05-06T00:00:00", - "2020-05-07T00:00:00", - "2020-05-08T00:00:00", - "2020-05-11T00:00:00", - "2020-05-12T00:00:00", - "2020-05-13T00:00:00", - "2020-05-14T00:00:00", - "2020-05-15T00:00:00", - "2020-05-18T00:00:00", - "2020-05-19T00:00:00", - "2020-05-20T00:00:00", - "2020-05-21T00:00:00", - "2020-05-22T00:00:00", - "2020-05-26T00:00:00", - "2020-05-27T00:00:00", - "2020-05-28T00:00:00", - "2020-05-29T00:00:00", - "2020-06-01T00:00:00", - "2020-06-02T00:00:00", - "2020-06-03T00:00:00", - "2020-06-04T00:00:00", - "2020-06-05T00:00:00", - "2020-06-08T00:00:00", - "2020-06-09T00:00:00", - "2020-06-10T00:00:00", - "2020-06-11T00:00:00", - "2020-06-12T00:00:00", - "2020-06-15T00:00:00", - "2020-06-16T00:00:00", - "2020-06-17T00:00:00", - "2020-06-18T00:00:00", - "2020-06-19T00:00:00", - "2020-06-22T00:00:00", - "2020-06-23T00:00:00", - "2020-06-24T00:00:00", - "2020-06-25T00:00:00", - "2020-06-26T00:00:00", - "2020-06-29T00:00:00", - "2020-06-30T00:00:00", - "2020-07-01T00:00:00", - "2020-07-02T00:00:00", - "2020-07-06T00:00:00", - "2020-07-07T00:00:00", - "2020-07-08T00:00:00", - "2020-07-09T00:00:00", - "2020-07-10T00:00:00", - "2020-07-13T00:00:00", - "2020-07-14T00:00:00", - "2020-07-15T00:00:00", - "2020-07-16T00:00:00", - "2020-07-17T00:00:00", - "2020-07-20T00:00:00", - "2020-07-21T00:00:00", - "2020-07-22T00:00:00", - "2020-07-23T00:00:00", - "2020-07-24T00:00:00", - "2020-07-27T00:00:00", - "2020-07-28T00:00:00", - "2020-07-29T00:00:00", - "2020-07-30T00:00:00", - "2020-07-31T00:00:00", - "2020-08-03T00:00:00", - "2020-08-04T00:00:00", - "2020-08-05T00:00:00", - "2020-08-06T00:00:00", - "2020-08-07T00:00:00", - "2020-08-10T00:00:00", - "2020-08-11T00:00:00", - "2020-08-12T00:00:00", - "2020-08-13T00:00:00", - "2020-08-14T00:00:00", - "2020-08-17T00:00:00", - "2020-08-18T00:00:00", - "2020-08-19T00:00:00", - "2020-08-20T00:00:00", - "2020-08-21T00:00:00", - "2020-08-24T00:00:00", - "2020-08-25T00:00:00", - "2020-08-26T00:00:00", - "2020-08-27T00:00:00", - "2020-08-28T00:00:00", - "2020-08-31T00:00:00", - "2020-09-01T00:00:00", - "2020-09-02T00:00:00", - "2020-09-03T00:00:00", - "2020-09-04T00:00:00", - "2020-09-08T00:00:00", - "2020-09-09T00:00:00", - "2020-09-10T00:00:00", - "2020-09-11T00:00:00", - "2020-09-14T00:00:00", - "2020-09-15T00:00:00", - "2020-09-16T00:00:00", - "2020-09-17T00:00:00", - "2020-09-18T00:00:00", - "2020-09-21T00:00:00", - "2020-09-22T00:00:00", - "2020-09-23T00:00:00", - "2020-09-24T00:00:00", - "2020-09-25T00:00:00", - "2020-09-28T00:00:00", - "2020-09-29T00:00:00", - "2020-09-30T00:00:00", - "2020-10-01T00:00:00", - "2020-10-02T00:00:00", - "2020-10-05T00:00:00", - "2020-10-06T00:00:00", - "2020-10-07T00:00:00", - "2020-10-08T00:00:00", - "2020-10-09T00:00:00", - "2020-10-12T00:00:00", - "2020-10-13T00:00:00", - "2020-10-14T00:00:00", - "2020-10-15T00:00:00", - "2020-10-16T00:00:00", - "2020-10-19T00:00:00", - "2020-10-20T00:00:00", - "2020-10-21T00:00:00", - "2020-10-22T00:00:00", - "2020-10-23T00:00:00", - "2020-10-26T00:00:00", - "2020-10-27T00:00:00", - "2020-10-28T00:00:00", - "2020-10-29T00:00:00", - "2020-10-30T00:00:00", - "2020-11-02T00:00:00", - "2020-11-03T00:00:00", - "2020-11-04T00:00:00", - "2020-11-05T00:00:00", - "2020-11-06T00:00:00", - "2020-11-09T00:00:00", - "2020-11-10T00:00:00", - "2020-11-11T00:00:00", - "2020-11-12T00:00:00", - "2020-11-13T00:00:00", - "2020-11-16T00:00:00", - "2020-11-17T00:00:00", - "2020-11-18T00:00:00", - "2020-11-19T00:00:00", - "2020-11-20T00:00:00", - "2020-11-23T00:00:00", - "2020-11-24T00:00:00", - "2020-11-25T00:00:00", - "2020-11-27T00:00:00", - "2020-11-30T00:00:00", - "2020-12-01T00:00:00", - "2020-12-02T00:00:00", - "2020-12-03T00:00:00", - "2020-12-04T00:00:00", - "2020-12-07T00:00:00", - "2020-12-08T00:00:00", - "2020-12-09T00:00:00", - "2020-12-10T00:00:00", - "2020-12-11T00:00:00", - "2020-12-14T00:00:00", - "2020-12-15T00:00:00", - "2020-12-16T00:00:00", - "2020-12-17T00:00:00", - "2020-12-18T00:00:00", - "2020-12-21T00:00:00", - "2020-12-22T00:00:00", - "2020-12-23T00:00:00", - "2020-12-24T00:00:00", - "2020-12-28T00:00:00", - "2020-12-29T00:00:00", - "2020-12-30T00:00:00", - "2020-12-31T00:00:00", - "2021-01-01T00:00:00", - "2021-01-04T00:00:00", - "2021-01-06T00:00:00", - "2021-01-07T00:00:00", - "2021-01-08T00:00:00", - "2021-01-11T00:00:00", - "2021-01-12T00:00:00", - "2021-01-13T00:00:00", - "2021-01-14T00:00:00", - "2021-01-15T00:00:00", - "2021-01-19T00:00:00", - "2021-01-20T00:00:00", - "2021-01-21T00:00:00", - "2021-01-22T00:00:00", - "2021-01-25T00:00:00", - "2021-01-26T00:00:00", - "2021-01-27T00:00:00", - "2021-01-28T00:00:00", - "2021-01-29T00:00:00", - "2021-02-01T00:00:00", - "2021-02-02T00:00:00", - "2021-02-03T00:00:00", - "2021-02-04T00:00:00", - "2021-02-05T00:00:00", - "2021-02-08T00:00:00", - "2021-02-09T00:00:00", - "2021-02-10T00:00:00", - "2021-02-11T00:00:00", - "2021-02-12T00:00:00", - "2021-02-16T00:00:00", - "2021-02-17T00:00:00", - "2021-02-18T00:00:00", - "2021-02-19T00:00:00", - "2021-02-22T00:00:00", - "2021-02-23T00:00:00", - "2021-02-24T00:00:00", - "2021-02-25T00:00:00", - "2021-02-26T00:00:00", - "2021-03-01T00:00:00", - "2021-03-02T00:00:00", - "2021-03-03T00:00:00", - "2021-03-04T00:00:00", - "2021-03-05T00:00:00", - "2021-03-08T00:00:00", - "2021-03-09T00:00:00", - "2021-03-10T00:00:00", - "2021-03-11T00:00:00", - "2021-03-12T00:00:00", - "2021-03-15T00:00:00", - "2021-03-16T00:00:00", - "2021-03-17T00:00:00", - "2021-03-18T00:00:00", - "2021-03-19T00:00:00", - "2021-03-22T00:00:00", - "2021-03-23T00:00:00", - "2021-03-24T00:00:00", - "2021-03-25T00:00:00", - "2021-03-26T00:00:00", - "2021-03-29T00:00:00", - "2021-03-30T00:00:00", - "2021-03-31T00:00:00", - "2021-04-01T00:00:00", - "2021-04-05T00:00:00", - "2021-04-06T00:00:00", - "2021-04-07T00:00:00", - "2021-04-08T00:00:00", - "2021-04-09T00:00:00", - "2021-04-12T00:00:00", - "2021-04-13T00:00:00", - "2021-04-14T00:00:00", - "2021-04-15T00:00:00", - "2021-04-16T00:00:00", - "2021-04-19T00:00:00", - "2021-04-20T00:00:00", - "2021-04-21T00:00:00", - "2021-04-22T00:00:00", - "2021-04-23T00:00:00", - "2021-04-26T00:00:00", - "2021-04-27T00:00:00", - "2021-04-28T00:00:00", - "2021-04-29T00:00:00", - "2021-04-30T00:00:00", - "2021-05-03T00:00:00", - "2021-05-04T00:00:00", - "2021-05-05T00:00:00", - "2021-05-06T00:00:00", - "2021-05-07T00:00:00", - "2021-05-10T00:00:00", - "2021-05-11T00:00:00", - "2021-05-12T00:00:00", - "2021-05-13T00:00:00", - "2021-05-14T00:00:00", - "2021-05-17T00:00:00", - "2021-05-18T00:00:00", - "2021-05-19T00:00:00", - "2021-05-20T00:00:00", - "2021-05-21T00:00:00", - "2021-05-24T00:00:00", - "2021-05-25T00:00:00", - "2021-05-26T00:00:00", - "2021-05-27T00:00:00", - "2021-05-28T00:00:00", - "2021-06-01T00:00:00", - "2021-06-02T00:00:00", - "2021-06-03T00:00:00", - "2021-06-04T00:00:00", - "2021-06-07T00:00:00", - "2021-06-08T00:00:00", - "2021-06-09T00:00:00", - "2021-06-10T00:00:00", - "2021-06-11T00:00:00", - "2021-06-14T00:00:00", - "2021-06-15T00:00:00", - "2021-06-16T00:00:00", - "2021-06-17T00:00:00", - "2021-06-18T00:00:00", - "2021-06-21T00:00:00", - "2021-06-22T00:00:00", - "2021-06-23T00:00:00", - "2021-06-24T00:00:00", - "2021-06-25T00:00:00", - "2021-06-28T00:00:00", - "2021-06-29T00:00:00", - "2021-06-30T00:00:00", - "2021-07-01T00:00:00", - "2021-07-02T00:00:00", - "2021-07-05T00:00:00", - "2021-07-06T00:00:00", - "2021-07-07T00:00:00", - "2021-07-08T00:00:00", - "2021-07-09T00:00:00", - "2021-07-12T00:00:00", - "2021-07-13T00:00:00", - "2021-07-14T00:00:00", - "2021-07-15T00:00:00", - "2021-07-16T00:00:00", - "2021-07-19T00:00:00", - "2021-07-20T00:00:00", - "2021-07-21T00:00:00", - "2021-07-22T00:00:00", - "2021-07-23T00:00:00", - "2021-07-26T00:00:00", - "2021-07-27T00:00:00", - "2021-07-28T00:00:00", - "2021-07-29T00:00:00", - "2021-07-30T00:00:00", - "2021-08-02T00:00:00", - "2021-08-03T00:00:00", - "2021-08-04T00:00:00", - "2021-08-05T00:00:00", - "2021-08-06T00:00:00", - "2021-08-09T00:00:00", - "2021-08-10T00:00:00", - "2021-08-11T00:00:00", - "2021-08-12T00:00:00", - "2021-08-13T00:00:00", - "2021-08-16T00:00:00", - "2021-08-17T00:00:00", - "2021-08-18T00:00:00", - "2021-08-19T00:00:00", - "2021-08-20T00:00:00", - "2021-08-23T00:00:00", - "2021-08-24T00:00:00", - "2021-08-25T00:00:00", - "2021-08-26T00:00:00", - "2021-08-27T00:00:00", - "2021-08-30T00:00:00", - "2021-08-31T00:00:00", - "2021-09-01T00:00:00", - "2021-09-02T00:00:00", - "2021-09-03T00:00:00", - "2021-09-07T00:00:00", - "2021-09-08T00:00:00", - "2021-09-09T00:00:00", - "2021-09-10T00:00:00", - "2021-09-13T00:00:00", - "2021-09-14T00:00:00", - "2021-09-15T00:00:00", - "2021-09-16T00:00:00", - "2021-09-17T00:00:00", - "2021-09-20T00:00:00", - "2021-09-21T00:00:00", - "2021-09-22T00:00:00", - "2021-09-23T00:00:00", - "2021-09-24T00:00:00", - "2021-09-27T00:00:00", - "2021-09-28T00:00:00", - "2021-09-29T00:00:00", - "2021-09-30T00:00:00", - "2021-10-01T00:00:00", - "2021-10-04T00:00:00", - "2021-10-05T00:00:00", - "2021-10-06T00:00:00", - "2021-10-07T00:00:00", - "2021-10-08T00:00:00", - "2021-10-11T00:00:00", - "2021-10-12T00:00:00", - "2021-10-13T00:00:00", - "2021-10-14T00:00:00", - "2021-10-15T00:00:00", - "2021-10-18T00:00:00", - "2021-10-19T00:00:00", - "2021-10-20T00:00:00", - "2021-10-21T00:00:00", - "2021-10-22T00:00:00", - "2021-10-25T00:00:00", - "2021-10-26T00:00:00", - "2021-10-27T00:00:00", - "2021-10-28T00:00:00", - "2021-10-29T00:00:00", - "2021-11-01T00:00:00", - "2021-11-02T00:00:00", - "2021-11-03T00:00:00", - "2021-11-04T00:00:00", - "2021-11-05T00:00:00", - "2021-11-08T00:00:00", - "2021-11-09T00:00:00", - "2021-11-10T00:00:00", - "2021-11-11T00:00:00", - "2021-11-12T00:00:00", - "2021-11-15T00:00:00", - "2021-11-16T00:00:00", - "2021-11-17T00:00:00", - "2021-11-18T00:00:00", - "2021-11-19T00:00:00", - "2021-11-22T00:00:00", - "2021-11-23T00:00:00", - "2021-11-24T00:00:00", - "2021-11-25T00:00:00", - "2021-11-26T00:00:00", - "2021-11-29T00:00:00", - "2021-11-30T00:00:00", - "2021-12-01T00:00:00", - "2021-12-02T00:00:00", - "2021-12-03T00:00:00", - "2021-12-06T00:00:00", - "2021-12-07T00:00:00", - "2021-12-08T00:00:00", - "2021-12-09T00:00:00", - "2021-12-10T00:00:00", - "2021-12-13T00:00:00", - "2021-12-14T00:00:00", - "2021-12-15T00:00:00", - "2021-12-16T00:00:00", - "2021-12-17T00:00:00", - "2021-12-20T00:00:00", - "2021-12-21T00:00:00", - "2021-12-22T00:00:00", - "2021-12-23T00:00:00", - "2021-12-27T00:00:00", - "2021-12-28T00:00:00", - "2021-12-29T00:00:00", - "2021-12-30T00:00:00", - "2021-12-31T00:00:00", - "2022-01-03T00:00:00", - "2022-01-05T00:00:00", - "2022-01-06T00:00:00", - "2022-01-07T00:00:00", - "2022-01-10T00:00:00", - "2022-01-11T00:00:00", - "2022-01-12T00:00:00", - "2022-01-13T00:00:00", - "2022-01-14T00:00:00", - "2022-01-18T00:00:00", - "2022-01-19T00:00:00", - "2022-01-20T00:00:00", - "2022-01-21T00:00:00", - "2022-01-24T00:00:00", - "2022-01-25T00:00:00", - "2022-01-26T00:00:00", - "2022-01-27T00:00:00", - "2022-01-28T00:00:00", - "2022-01-31T00:00:00", - "2022-02-01T00:00:00", - "2022-02-02T00:00:00", - "2022-02-03T00:00:00", - "2022-02-04T00:00:00", - "2022-02-07T00:00:00", - "2022-02-08T00:00:00", - "2022-02-09T00:00:00", - "2022-02-10T00:00:00", - "2022-02-11T00:00:00", - "2022-02-14T00:00:00", - "2022-02-15T00:00:00", - "2022-02-16T00:00:00", - "2022-02-17T00:00:00", - "2022-02-18T00:00:00", - "2022-02-22T00:00:00", - "2022-02-23T00:00:00", - "2022-02-24T00:00:00", - "2022-02-25T00:00:00", - "2022-02-28T00:00:00", - "2022-03-01T00:00:00", - "2022-03-02T00:00:00", - "2022-03-03T00:00:00", - "2022-03-04T00:00:00", - "2022-03-07T00:00:00", - "2022-03-08T00:00:00", - "2022-03-09T00:00:00", - "2022-03-10T00:00:00", - "2022-03-11T00:00:00", - "2022-03-14T00:00:00", - "2022-03-15T00:00:00", - "2022-03-16T00:00:00", - "2022-03-17T00:00:00", - "2022-03-18T00:00:00", - "2022-03-21T00:00:00", - "2022-03-22T00:00:00", - "2022-03-23T00:00:00", - "2022-03-24T00:00:00", - "2022-03-25T00:00:00", - "2022-03-28T00:00:00", - "2022-03-29T00:00:00", - "2022-03-30T00:00:00", - "2022-03-31T00:00:00", - "2022-04-01T00:00:00", - "2022-04-04T00:00:00", - "2022-04-05T00:00:00", - "2022-04-06T00:00:00", - "2022-04-07T00:00:00", - "2022-04-08T00:00:00", - "2022-04-11T00:00:00", - "2022-04-12T00:00:00", - "2022-04-13T00:00:00", - "2022-04-14T00:00:00", - "2022-04-18T00:00:00", - "2022-04-19T00:00:00", - "2022-04-20T00:00:00", - "2022-04-21T00:00:00", - "2022-04-22T00:00:00", - "2022-04-25T00:00:00", - "2022-04-26T00:00:00", - "2022-04-27T00:00:00", - "2022-04-28T00:00:00", - "2022-04-29T00:00:00", - "2022-05-03T00:00:00", - "2022-05-04T00:00:00", - "2022-05-05T00:00:00", - "2022-05-06T00:00:00", - "2022-05-09T00:00:00", - "2022-05-10T00:00:00", - "2022-08-01T00:00:00", - "2022-08-02T00:00:00", - "2022-08-03T00:00:00", - "2022-08-04T00:00:00", - "2022-08-05T00:00:00", - "2022-08-08T00:00:00", - "2022-08-09T00:00:00", - "2022-08-10T00:00:00", - "2022-08-11T00:00:00", - "2022-08-12T00:00:00", - "2022-08-15T00:00:00", - "2022-08-16T00:00:00", - "2022-08-17T00:00:00", - "2022-08-18T00:00:00", - "2022-08-19T00:00:00", - "2022-08-22T00:00:00", - "2022-08-23T00:00:00", - "2022-08-24T00:00:00", - "2022-08-25T00:00:00", - "2022-08-26T00:00:00", - "2022-08-29T00:00:00", - "2022-08-30T00:00:00", - "2022-08-31T00:00:00", - "2022-09-01T00:00:00", - "2022-09-02T00:00:00", - "2022-09-06T00:00:00", - "2022-09-07T00:00:00", - "2022-09-14T00:00:00", - "2022-09-15T00:00:00", - "2022-10-27T00:00:00", - "2022-10-28T00:00:00", - "2022-10-31T00:00:00", - "2022-11-01T00:00:00", - "2022-11-02T00:00:00", - "2022-11-03T00:00:00", - "2022-11-04T00:00:00", - "2022-11-14T00:00:00", - "2022-11-15T00:00:00", - "2022-11-16T00:00:00", - "2022-11-17T00:00:00", - "2022-11-18T00:00:00", - "2022-11-21T00:00:00", - "2022-11-22T00:00:00", - "2022-11-23T00:00:00", - "2022-11-25T00:00:00", - "2022-11-28T00:00:00", - "2022-11-29T00:00:00", - "2022-11-30T00:00:00", - "2022-12-01T00:00:00", - "2022-12-02T00:00:00", - "2022-12-05T00:00:00", - "2022-12-06T00:00:00", - "2022-12-07T00:00:00", - "2022-12-08T00:00:00", - "2022-12-09T00:00:00", - "2022-12-12T00:00:00", - "2022-12-13T00:00:00", - "2022-12-14T00:00:00", - "2022-12-15T00:00:00", - "2022-12-16T00:00:00", - "2022-12-19T00:00:00", - "2022-12-20T00:00:00", - "2022-12-21T00:00:00", - "2022-12-22T00:00:00", - "2022-12-23T00:00:00", - "2022-12-27T00:00:00", - "2022-12-28T00:00:00", - "2022-12-29T00:00:00", - "2022-12-30T00:00:00", - "2023-01-02T00:00:00", - "2023-01-03T00:00:00", - "2023-01-05T00:00:00", - "2023-01-06T00:00:00", - "2023-01-09T00:00:00", - "2023-01-10T00:00:00", - "2023-01-11T00:00:00", - "2023-01-12T00:00:00", - "2023-01-13T00:00:00", - "2023-01-17T00:00:00", - "2023-01-18T00:00:00", - "2023-01-19T00:00:00", - "2023-01-20T00:00:00", - "2023-01-23T00:00:00", - "2023-01-24T00:00:00", - "2023-01-25T00:00:00", - "2023-01-26T00:00:00", - "2023-01-27T00:00:00", - "2023-01-30T00:00:00", - "2023-01-31T00:00:00", - "2023-02-01T00:00:00", - "2023-02-02T00:00:00", - "2023-02-03T00:00:00", - "2023-02-06T00:00:00", - "2023-02-07T00:00:00", - "2023-02-08T00:00:00", - "2023-02-09T00:00:00", - "2023-02-10T00:00:00", - "2023-02-13T00:00:00", - "2023-02-14T00:00:00", - "2023-02-15T00:00:00", - "2023-02-16T00:00:00", - "2023-02-17T00:00:00", - "2023-02-21T00:00:00", - "2023-02-22T00:00:00", - "2023-02-23T00:00:00", - "2023-02-24T00:00:00", - "2023-02-27T00:00:00", - "2023-02-28T00:00:00", - "2023-03-01T00:00:00", - "2023-03-02T00:00:00", - "2023-03-03T00:00:00", - "2023-03-06T00:00:00", - "2023-03-07T00:00:00", - "2023-03-08T00:00:00", - "2023-03-09T00:00:00", - "2023-03-10T00:00:00", - "2023-03-13T00:00:00", - "2023-03-14T00:00:00", - "2023-03-15T00:00:00", - "2023-03-16T00:00:00", - "2023-03-17T00:00:00", - "2023-03-20T00:00:00", - "2023-03-21T00:00:00", - "2023-03-22T00:00:00", - "2023-03-23T00:00:00", - "2023-03-24T00:00:00", - "2023-03-27T00:00:00", - "2023-03-28T00:00:00", - "2023-03-29T00:00:00", - "2023-03-30T00:00:00", - "2023-03-31T00:00:00", - "2023-04-03T00:00:00", - "2023-04-04T00:00:00", - "2023-04-05T00:00:00", - "2023-04-06T00:00:00", - "2023-04-07T00:00:00", - "2023-04-10T00:00:00", - "2023-04-11T00:00:00", - "2023-04-12T00:00:00", - "2023-04-13T00:00:00", - "2023-04-14T00:00:00", - "2023-04-17T00:00:00", - "2023-04-18T00:00:00", - "2023-04-19T00:00:00", - "2023-04-20T00:00:00", - "2023-04-21T00:00:00", - "2023-04-24T00:00:00", - "2023-04-25T00:00:00", - "2023-04-26T00:00:00", - "2023-04-27T00:00:00", - "2023-04-28T00:00:00", - "2023-05-01T00:00:00", - "2023-05-02T00:00:00", - "2023-05-03T00:00:00", - "2023-05-04T00:00:00", - "2023-05-05T00:00:00", - "2023-05-08T00:00:00", - "2023-05-09T00:00:00", - "2023-05-10T00:00:00", - "2023-05-11T00:00:00", - "2023-05-12T00:00:00", - "2023-05-15T00:00:00", - "2023-05-16T00:00:00", - "2023-05-17T00:00:00", - "2023-05-18T00:00:00", - "2023-05-19T00:00:00", - "2023-05-22T00:00:00", - "2023-05-23T00:00:00", - "2023-05-24T00:00:00", - "2023-05-25T00:00:00", - "2023-05-26T00:00:00", - "2023-05-30T00:00:00", - "2023-05-31T00:00:00", - "2023-06-01T00:00:00", - "2023-06-02T00:00:00", - "2023-06-05T00:00:00", - "2023-06-06T00:00:00", - "2023-06-07T00:00:00", - "2023-06-08T00:00:00", - "2023-06-09T00:00:00", - "2023-06-12T00:00:00", - "2023-06-13T00:00:00", - "2023-06-14T00:00:00", - "2023-06-15T00:00:00", - "2023-06-16T00:00:00", - "2023-06-19T00:00:00", - "2023-06-20T00:00:00", - "2023-06-21T00:00:00", - "2023-06-22T00:00:00", - "2023-06-23T00:00:00", - "2023-06-26T00:00:00", - "2023-06-27T00:00:00", - "2023-06-28T00:00:00", - "2023-06-29T00:00:00", - "2023-06-30T00:00:00", - "2023-07-03T00:00:00", - "2023-07-05T00:00:00", - "2023-07-06T00:00:00", - "2023-07-07T00:00:00", - "2023-07-10T00:00:00", - "2023-07-11T00:00:00", - "2023-07-12T00:00:00", - "2023-07-13T00:00:00", - "2023-07-14T00:00:00", - "2023-07-17T00:00:00", - "2023-07-18T00:00:00", - "2023-07-19T00:00:00", - "2023-07-20T00:00:00", - "2023-07-21T00:00:00", - "2023-07-24T00:00:00", - "2023-07-25T00:00:00", - "2023-07-26T00:00:00", - "2023-07-27T00:00:00", - "2023-07-28T00:00:00", - "2023-07-31T00:00:00", - "2023-08-01T00:00:00", - "2023-08-02T00:00:00", - "2023-08-03T00:00:00", - "2023-08-04T00:00:00", - "2023-08-07T00:00:00", - "2023-08-08T00:00:00", - "2023-08-09T00:00:00", - "2023-08-10T00:00:00", - "2023-08-11T00:00:00", - "2023-08-14T00:00:00", - "2023-08-15T00:00:00", - "2023-08-16T00:00:00", - "2023-08-17T00:00:00", - "2023-08-18T00:00:00", - "2023-08-21T00:00:00", - "2023-08-22T00:00:00", - "2023-08-23T00:00:00", - "2023-08-24T00:00:00", - "2023-08-25T00:00:00", - "2023-08-28T00:00:00", - "2023-08-29T00:00:00", - "2023-08-30T00:00:00", - "2023-08-31T00:00:00", - "2023-09-01T00:00:00", - "2023-09-05T00:00:00", - "2023-09-06T00:00:00", - "2023-09-07T00:00:00", - "2023-09-08T00:00:00", - "2023-09-11T00:00:00", - "2023-09-12T00:00:00", - "2023-09-13T00:00:00", - "2023-09-14T00:00:00", - "2023-09-15T00:00:00", - "2023-09-18T00:00:00", - "2023-09-19T00:00:00", - "2023-09-20T00:00:00", - "2023-09-21T00:00:00", - "2023-09-22T00:00:00", - "2023-09-25T00:00:00", - "2023-09-26T00:00:00", - "2023-09-27T00:00:00", - "2023-09-28T00:00:00", - "2023-09-29T00:00:00", - "2023-10-02T00:00:00", - "2023-10-03T00:00:00", - "2023-10-04T00:00:00", - "2023-10-05T00:00:00", - "2023-10-06T00:00:00", - "2023-10-09T00:00:00", - "2023-10-10T00:00:00", - "2023-10-11T00:00:00", - "2023-10-12T00:00:00", - "2023-10-13T00:00:00", - "2023-10-16T00:00:00", - "2023-10-17T00:00:00", - "2023-10-18T00:00:00", - "2023-10-19T00:00:00", - "2023-10-20T00:00:00", - "2023-10-23T00:00:00", - "2023-10-24T00:00:00", - "2023-10-25T00:00:00", - "2023-10-26T00:00:00", - "2023-10-27T00:00:00", - "2023-10-30T00:00:00", - "2023-10-31T00:00:00", - "2023-11-01T00:00:00", - "2023-11-02T00:00:00", - "2023-11-03T00:00:00", - "2023-11-06T00:00:00", - "2023-11-07T00:00:00", - "2023-11-08T00:00:00", - "2023-11-09T00:00:00", - "2023-11-10T00:00:00", - "2023-11-13T00:00:00", - "2023-11-14T00:00:00", - "2023-11-15T00:00:00", - "2023-11-16T00:00:00", - "2023-11-17T00:00:00", - "2023-11-20T00:00:00", - "2023-11-21T00:00:00", - "2023-11-22T00:00:00", - "2023-11-23T00:00:00", - "2023-11-24T00:00:00", - "2023-11-27T00:00:00", - "2023-11-28T00:00:00", - "2023-11-29T00:00:00", - "2023-11-30T00:00:00", - "2023-12-01T00:00:00", - "2023-12-04T00:00:00", - "2023-12-05T00:00:00", - "2023-12-06T00:00:00", - "2023-12-07T00:00:00", - "2023-12-08T00:00:00", - "2023-12-11T00:00:00", - "2023-12-12T00:00:00", - "2023-12-13T00:00:00", - "2023-12-14T00:00:00", - "2023-12-15T00:00:00", - "2023-12-18T00:00:00", - "2023-12-19T00:00:00", - "2023-12-20T00:00:00", - "2023-12-21T00:00:00", - "2023-12-22T00:00:00", - "2023-12-25T00:00:00", - "2023-12-26T00:00:00", - "2023-12-27T00:00:00", - "2023-12-28T00:00:00", - "2023-12-29T00:00:00", - "2024-01-01T00:00:00", - "2024-01-02T00:00:00", - "2024-01-04T00:00:00", - "2024-01-05T00:00:00", - "2024-01-08T00:00:00", - "2024-01-09T00:00:00", - "2024-01-10T00:00:00", - "2024-01-11T00:00:00", - "2024-01-12T00:00:00", - "2024-01-15T00:00:00", - "2024-01-16T00:00:00", - "2024-01-17T00:00:00", - "2024-01-18T00:00:00", - "2024-01-19T00:00:00", - "2024-01-22T00:00:00", - "2024-01-23T00:00:00", - "2024-01-24T00:00:00", - "2024-01-25T00:00:00", - "2024-01-26T00:00:00", - "2024-01-29T00:00:00", - "2024-01-30T00:00:00", - "2024-01-31T00:00:00", - "2024-02-01T00:00:00", - "2024-02-02T00:00:00", - "2024-02-05T00:00:00", - "2024-02-06T00:00:00", - "2024-02-07T00:00:00", - "2024-02-08T00:00:00", - "2024-02-09T00:00:00", - "2024-02-12T00:00:00", - "2024-02-13T00:00:00", - "2024-02-14T00:00:00", - "2024-02-15T00:00:00", - "2024-02-16T00:00:00", - "2024-02-20T00:00:00", - "2024-02-21T00:00:00", - "2024-02-22T00:00:00", - "2024-02-23T00:00:00", - "2024-02-26T00:00:00", - "2024-02-27T00:00:00", - "2024-02-28T00:00:00", - "2024-02-29T00:00:00", - "2024-03-01T00:00:00", - "2024-03-04T00:00:00", - "2024-03-05T00:00:00", - "2024-03-06T00:00:00", - "2024-03-07T00:00:00", - "2024-03-08T00:00:00", - "2024-03-11T00:00:00", - "2024-03-12T00:00:00", - "2024-03-13T00:00:00", - "2024-03-14T00:00:00", - "2024-03-15T00:00:00", - "2024-03-18T00:00:00", - "2024-03-19T00:00:00", - "2024-03-20T00:00:00", - "2024-03-21T00:00:00", - "2024-03-22T00:00:00", - "2024-03-25T00:00:00", - "2024-03-26T00:00:00", - "2024-03-27T00:00:00", - "2024-03-28T00:00:00", - "2024-04-01T00:00:00", - "2024-04-02T00:00:00", - "2024-04-03T00:00:00", - "2024-04-04T00:00:00", - "2024-04-05T00:00:00", - "2024-04-08T00:00:00", - "2024-04-09T00:00:00", - "2024-04-10T00:00:00", - "2024-04-11T00:00:00", - "2024-04-12T00:00:00", - "2024-04-15T00:00:00", - "2024-04-16T00:00:00", - "2024-04-17T00:00:00", - "2024-04-18T00:00:00", - "2024-04-19T00:00:00", - "2024-04-22T00:00:00", - "2024-04-23T00:00:00", - "2024-04-24T00:00:00", - "2024-04-25T00:00:00", - "2024-04-26T00:00:00", - "2024-04-29T00:00:00", - "2024-04-30T00:00:00", - "2024-05-01T00:00:00", - "2024-05-02T00:00:00", - "2024-05-03T00:00:00", - "2024-05-06T00:00:00", - "2024-05-07T00:00:00", - "2024-05-08T00:00:00", - "2024-05-09T00:00:00", - "2024-05-10T00:00:00", - "2024-05-13T00:00:00", - "2024-05-14T00:00:00", - "2024-05-15T00:00:00", - "2024-05-16T00:00:00", - "2024-05-17T00:00:00", - "2024-05-20T00:00:00", - "2024-05-21T00:00:00", - "2024-05-22T00:00:00", - "2024-05-23T00:00:00", - "2024-05-24T00:00:00", - "2024-05-28T00:00:00", - "2024-05-29T00:00:00", - "2024-05-30T00:00:00", - "2024-05-31T00:00:00", - "2024-06-03T00:00:00", - "2024-06-04T00:00:00", - "2024-06-05T00:00:00", - "2024-06-06T00:00:00", - "2024-06-07T00:00:00", - "2024-06-10T00:00:00", - "2024-06-11T00:00:00", - "2024-06-12T00:00:00", - "2024-06-13T00:00:00", - "2024-06-14T00:00:00", - "2024-06-17T00:00:00", - "2024-06-18T00:00:00", - "2024-06-20T00:00:00", - "2024-06-21T00:00:00", - "2024-06-24T00:00:00", - "2024-06-25T00:00:00", - "2024-06-26T00:00:00", - "2024-06-27T00:00:00", - "2024-06-28T00:00:00", - "2024-07-01T00:00:00", - "2024-07-02T00:00:00", - "2024-07-03T00:00:00", - "2024-07-05T00:00:00", - "2024-07-08T00:00:00", - "2024-07-09T00:00:00", - "2024-07-10T00:00:00", - "2024-07-11T00:00:00", - "2024-07-12T00:00:00", - "2024-07-15T00:00:00", - "2024-07-16T00:00:00", - "2024-07-17T00:00:00", - "2024-07-18T00:00:00", - "2024-07-19T00:00:00", - "2024-07-22T00:00:00", - "2024-07-23T00:00:00", - "2024-07-24T00:00:00", - "2024-07-25T00:00:00", - "2024-07-26T00:00:00", - "2024-07-29T00:00:00", - "2024-07-30T00:00:00", - "2024-07-31T00:00:00", - "2024-08-01T00:00:00", - "2024-08-02T00:00:00", - "2024-08-05T00:00:00", - "2024-08-06T00:00:00", - "2024-08-07T00:00:00", - "2024-08-08T00:00:00", - "2024-08-09T00:00:00", - "2024-08-12T00:00:00", - "2024-08-13T00:00:00", - "2024-08-14T00:00:00", - "2024-08-15T00:00:00", - "2024-08-16T00:00:00", - "2024-08-19T00:00:00", - "2024-08-20T00:00:00", - "2024-08-21T00:00:00", - "2024-08-22T00:00:00", - "2024-08-23T00:00:00", - "2024-08-26T00:00:00", - "2024-08-27T00:00:00", - "2024-08-28T00:00:00", - "2024-08-29T00:00:00", - "2024-08-30T00:00:00", - "2024-09-03T00:00:00", - "2024-09-04T00:00:00", - "2024-09-05T00:00:00", - "2024-09-06T00:00:00", - "2024-09-09T00:00:00", - "2024-09-10T00:00:00", - "2024-09-11T00:00:00", - "2024-09-12T00:00:00", - "2024-09-13T00:00:00", - "2024-09-16T00:00:00", - "2024-09-17T00:00:00", - "2024-09-18T00:00:00", - "2024-09-19T00:00:00", - "2024-09-20T00:00:00", - "2024-09-23T00:00:00", - "2024-09-24T00:00:00", - "2024-09-25T00:00:00", - "2024-09-26T00:00:00", - "2024-09-27T00:00:00", - "2024-09-30T00:00:00", - "2024-10-01T00:00:00", - "2024-10-02T00:00:00", - "2024-10-03T00:00:00", - "2024-10-04T00:00:00", - "2024-10-07T00:00:00", - "2024-10-08T00:00:00", - "2024-10-09T00:00:00", - "2024-10-10T00:00:00", - "2024-10-11T00:00:00", - "2024-10-14T00:00:00", - "2024-10-15T00:00:00", - "2024-10-16T00:00:00", - "2024-10-17T00:00:00", - "2024-10-18T00:00:00", - "2024-10-21T00:00:00", - "2024-10-22T00:00:00", - "2024-10-23T00:00:00", - "2024-10-24T00:00:00", - "2024-10-25T00:00:00", - "2024-10-28T00:00:00", - "2024-10-29T00:00:00", - "2024-10-30T00:00:00", - "2024-10-31T00:00:00", - "2024-11-01T00:00:00", - "2024-11-04T00:00:00", - "2024-11-05T00:00:00", - "2024-11-06T00:00:00", - "2024-11-07T00:00:00", - "2024-11-08T00:00:00", - "2024-11-11T00:00:00", - "2024-11-12T00:00:00", - "2024-11-13T00:00:00", - "2024-11-14T00:00:00", - "2024-11-15T00:00:00", - "2024-11-18T00:00:00", - "2024-11-19T00:00:00", - "2024-11-20T00:00:00", - "2024-11-21T00:00:00", - "2024-11-22T00:00:00", - "2024-11-25T00:00:00", - "2024-11-26T00:00:00", - "2024-11-27T00:00:00", - "2024-11-28T00:00:00", - "2024-11-29T00:00:00", - "2024-12-02T00:00:00", - "2024-12-03T00:00:00", - "2024-12-04T00:00:00", - "2024-12-05T00:00:00", - "2024-12-06T00:00:00", - "2024-12-09T00:00:00", - "2024-12-10T00:00:00", - "2024-12-11T00:00:00", - "2024-12-12T00:00:00", - "2024-12-13T00:00:00", - "2024-12-16T00:00:00", - "2024-12-17T00:00:00", - "2024-12-18T00:00:00", - "2024-12-19T00:00:00", - "2024-12-20T00:00:00", - "2024-12-23T00:00:00", - "2024-12-24T00:00:00", - "2024-12-25T00:00:00", - "2024-12-26T00:00:00", - "2024-12-27T00:00:00", - "2024-12-30T00:00:00", - "2024-12-31T00:00:00", - "2025-01-01T00:00:00", - "2025-01-02T00:00:00", - "2025-01-06T00:00:00", - "2025-01-07T00:00:00", - "2025-01-08T00:00:00", - "2025-01-09T00:00:00", - "2025-01-10T00:00:00", - "2025-01-13T00:00:00", - "2025-01-14T00:00:00", - "2025-01-15T00:00:00", - "2025-01-16T00:00:00", - "2025-01-17T00:00:00", - "2025-01-21T00:00:00", - "2025-01-22T00:00:00", - "2025-01-23T00:00:00", - "2025-01-24T00:00:00", - "2025-01-27T00:00:00", - "2025-01-28T00:00:00", - "2025-01-29T00:00:00", - "2025-01-30T00:00:00", - "2025-01-31T00:00:00", - "2025-02-03T00:00:00", - "2025-02-04T00:00:00", - "2025-02-05T00:00:00", - "2025-02-06T00:00:00", - "2025-02-07T00:00:00", - "2025-02-10T00:00:00", - "2025-02-11T00:00:00", - "2025-02-12T00:00:00", - "2025-02-13T00:00:00", - "2025-02-14T00:00:00", - "2025-02-18T00:00:00", - "2025-02-19T00:00:00", - "2025-02-20T00:00:00", - "2025-02-21T00:00:00", - "2025-02-24T00:00:00", - "2025-02-25T00:00:00", - "2025-02-26T00:00:00", - "2025-02-27T00:00:00", - "2025-02-28T00:00:00", - "2025-03-03T00:00:00" - ], - "xaxis": "x", - "y": [ - 0, - -0.0024714349431654847, - 0, - 0, - -0.015376950746622486, - -0.04348481850749453, - -0.03277587066609666, - -0.015551688823288834, - -0.08142361178962843, - -0.09972118467481428, - -0.010368738972465374, - -0.040698276565235836, - -0.05190647605425136, - 0, - 0, - 0, - -0.018903324971910607, - -0.036346423401865335, - -0.019240165424877276, - 0, - -0.014766111867748122, - 0, - 0, - 0, - 0, - -0.010911874747633554, - -0.011653458468346756, - -0.024472262783527987, - 0, - -0.01721707091419955, - -0.01417636463567562, - 0, - -0.004995689359561739, - -0.05745541773165053, - -0.07029022506152116, - -0.05511255607619836, - -0.07018836151128394, - -0.0426852029472764, - -0.08149521558759842, - -0.09473747711841696, - -0.10003438173074419, - -0.09758965652505458, - -0.1311435508044989, - -0.10190871188646089, - -0.13043050595283923, - -0.09634293439458019, - -0.08126712895949473, - -0.06853418517986154, - -0.06904350293104655, - -0.05769535784272206, - -0.025200885317097965, - -0.07694756883752762, - -0.06828916706737664, - -0.08397615380388535, - -0.06574257831145036, - -0.05840840269438141, - -0.011041851834145744, - 0, - 0, - 0, - 0, - -0.021009496313806553, - -0.053527920227941395, - -0.06083381834066459, - -0.06331656185925427, - -0.03912411121782089, - -0.06999304986094823, - -0.08324784221725356, - -0.09632903936031323, - -0.03792940607490458, - -0.06661866775277314, - -0.06954454043586888, - -0.047954143156174855, - -0.02975089498684924, - -0.01655501281879368, - 0, - -0.01650192350453139, - 0, - 0, - 0, - -0.012044898421979089, - 0, - -0.039346867259443696, - -0.016944400430895845, - -0.009502342925796214, - 0, - 0, - 0, - 0, - 0, - 0, - -0.09737620708614969, - -0.04629586916426531, - -0.01427673209404745, - -0.008817530562918452, - -0.012038569533830978, - 0, - 0, - 0, - -0.00046550940946299413, - 0, - 0, - 0, - -0.00265137668095905, - 0, - 0, - 0, - 0, - -0.11241344374519069, - -0.11972024899510703, - -0.08066071623297011, - -0.07840492400816412, - -0.09331276827644985, - -0.10569510603218046, - -0.07636980710969754, - -0.0830513656016506, - -0.042116092565626095, - -0.045695936748471166, - -0.05197292380880236, - -0.07516835255518106, - -0.15987575187111913, - -0.11048125799207098, - -0.171803622961478, - -0.1826534931731828, - -0.24085727353355835, - -0.24902226060812926, - -0.2725364426036655, - -0.24860542943615416, - -0.19436833811798326, - -0.16256657164435395, - -0.10242028547641857, - -0.10354818158882184, - -0.08974371395223524, - -0.07493394760676686, - -0.012740284800012214, - -0.002515661346270348, - 0, - 0, - 0, - -0.06315414786501095, - 0, - -0.034650189502362316, - -0.10425028623559984, - -0.10580591496284286, - -0.09952578417508495, - -0.10509147806588681, - -0.019070971037240203, - -0.04498376841790086, - 0, - 0, - -0.09320426323929842, - -0.14979537352256522, - -0.15976653879269576, - -0.043847220427801425, - -0.12063441607948588, - -0.13938512988069895, - -0.16651120847271894, - -0.19464157709194663, - -0.24239659267140035, - -0.19020425482887704, - -0.17703575804355554, - -0.19512322639070934, - -0.20507389594599867, - -0.16542493558614724, - -0.1727726493566344, - -0.11623521996782582, - -0.08713858807074415, - -0.08965956099618322, - -0.15679327495777207, - -0.16220414367578717, - -0.14367377233837964, - -0.15371667261045352, - -0.10247738550803531, - -0.04091566971296956, - -0.07939637432688584, - -0.1032738821166127, - -0.018165619911009623, - 0, - -0.0031340627439701008, - -0.015693091811631144, - -0.04332295576048417, - -0.10572309937811186, - -0.1306284642792236, - -0.07238779114792682, - -0.13506139749525325, - -0.1262093076524019, - -0.08500758971107691, - -0.08133103523401108, - -0.07507177719867653, - -0.07369433530093394, - -0.03133799694532202, - 0, - -0.04628438616156283, - -0.06845067408805838, - 0, - -0.03723513310303561, - -0.03587928366919402, - 0, - -0.03847770976596476, - -0.011861570953618727, - -0.006420452286699296, - -0.09886686091697228, - -0.10343740059718376, - -0.030009504187111347, - -0.1396571138566426, - -0.07135293752458394, - -0.060597659626307254, - -0.018111591368780156, - -0.03243987052500097, - -0.04926199573689205, - -0.02165833811769835, - 0, - 0, - -0.019419024789651518, - -0.0036673740201323968, - -0.22703622749326668, - 0, - -0.02128739555488801, - -0.045809227442666245, - -0.08402562513164336, - -0.03737851037130013, - -0.05175780446256173, - -0.04712193887963512, - 0, - -0.0155508690391305, - -0.04432509217897118, - -0.009113968751552015, - -0.0012106487958076784, - -0.09217129670068547, - -0.12201123180866835, - -0.1035616262161897, - -0.1428309808182947, - -0.1695846140665377, - -0.14545689510779747, - -0.1168276087956247, - -0.11727947067011635, - -0.10979390980588544, - -0.12165186704884479, - -0.1451060560437194, - -0.12850487857615223, - -0.1277987130463839, - -0.079381286909745, - -0.1159670908861472, - -0.12509577760160373, - -0.12615057348464076, - -0.11619184251277981, - -0.11995167433638687, - -0.13966308289914564, - -0.14925449061242557, - -0.16570908340054136, - -0.16570908340054136, - -0.1111726116815751, - -0.11146262432653287, - -0.08840061733593463, - -0.04777567711035191, - -0.03613827537920766, - -0.00438005872856817, - 0, - 0, - -0.0006291893379746227, - -0.031374335404948606, - 0, - -0.15155260739135523, - -0.04439024758430632, - 0, - 0, - 0, - -0.019708671575786374, - 0, - 0, - -0.02726095872204881, - -0.012501800211495495, - -0.07957028134610677, - -0.06248981670932707, - -0.0866876745099916, - -0.10181517250503636, - -0.10692460389582159, - -0.15942570738830475, - -0.11960423621941874, - -0.10400096639023826, - -0.08916507048708167, - -0.03765765361572104, - -0.005012287846060448, - 0, - 0, - -0.009981833060064171, - -0.0006927455120547821, - 0, - 0, - -0.002891700079348025, - -0.018372024245132734, - -0.08237368067758866, - -0.03596330170625306, - -0.005767491525165203, - 0, - -0.03253662863291851, - -0.06616645335270643, - -0.02265570075133083, - -0.05278964162997091, - -0.035948159785186506, - -0.013206594907182678, - -0.05395531035803214, - -0.05930025672672645, - -0.10476985994322319, - -0.07268284676985859, - -0.03485796144069575, - -0.12086236847073872, - -0.303468849706946, - -0.08184137081906784, - -0.09629751978960133, - -0.2650822586323833, - -0.06373668434355262, - -0.30411481292485176, - -0.24708279059077887, - -0.2270031272056824, - -0.21504200398060347, - -0.2906802179981325, - -0.28235943662416463, - -0.2022141326957363, - -0.19106197432645944, - -0.11010770554222837, - -0.13943268156506716, - -0.17054893691146866, - -0.039114696718418274, - -0.05705638155603687, - -0.09086444194713705, - -0.10409679565990537, - -0.16904511694004531, - -0.2589254542651632, - -0.20564934019017378, - -0.17964689839652337, - -0.16998766565103884, - -0.1708255221088335, - -0.15088464593709505, - -0.1655247837003586, - -0.21830974054146857, - -0.14898381429789076, - -0.0901894042422483, - -0.08987159662032618, - -0.06981888935203062, - -0.048756911499173716, - -0.11141584431373752, - -0.09583173416050594, - -0.12154926668340804, - -0.1133729433194054, - -0.11567260965135984, - -0.12894505138689571, - -0.10588955299652614, - -0.11551562097606638, - -0.04193801575507938, - -0.027454373110412433, - -0.016083153210691536, - -0.016275054501630803, - -0.02786058690080173, - -0.015090498819921083, - -0.013530352312301486, - 0, - 0, - 0, - 0, - -0.025576622978889296, - -0.04024191385950726, - -0.036803045146905244, - -0.00846812108409889, - 0, - 0, - -0.02399988328033842, - -0.013206027145120869, - 0, - 0, - -0.023581869734050853, - -0.04404015200775724, - -0.16884966897219045, - -0.11122025964332516, - -0.14439522419398332, - -0.10826775754246121, - -0.10473405424063831, - -0.10801202901403906, - -0.14806841578403496, - -0.10761681219738806, - -0.06305030410796142, - -0.02236622004093103, - -0.04382416838028513, - -0.029123159887080585, - -0.020777110641330032, - -0.051846348317916346, - -0.02837062890704356, - -0.10039308172970651, - -0.12073512376322137, - -0.15725780723139549, - -0.17362443305036113, - -0.17485657959639078, - -0.19547975649450955, - -0.1640530451563318, - -0.2104837231426121, - -0.23195097070118142, - -0.33192687648509966, - -0.3492745699312815, - -0.3196472575112679, - -0.28995950016635563, - -0.2769870893609827, - -0.2522493143083335, - -0.20811986952202655, - -0.2311750166175559, - -0.22291941089985168, - -0.25283964872514764, - -0.24139946615417307, - -0.2461420679539864, - -0.27545785653028687, - -0.3260975653881195, - -0.3641805622121431, - -0.3397484912621851, - -0.32366627613880716, - -0.2538058917837097, - -0.23980533955510608, - -0.21399696283613678, - -0.24015539586899004, - -0.1750548109179204, - -0.1560844037186645, - -0.15031888780516667, - -0.13878785597816812, - -0.1388199633067233, - -0.1520016065444395, - -0.19126755968113296, - -0.20658802333837833, - -0.1996601050229625, - -0.19852095066908448, - -0.1764585530807351, - -0.16108741598683085, - -0.16041322259372282, - -0.16992167424138904, - -0.23748050184069702, - -0.219672497043359, - -0.20286415831166438, - -0.20393356852142763, - -0.24066548442194535, - -0.20363134389692938, - -0.18363802258398854, - -0.1821613139751631, - -0.15756487915063955, - -0.1362417694899083, - -0.09309339233082015, - -0.04499318093956828, - -0.12605503736628665, - -0.10294181074165709, - -0.09678572762111526, - -0.2609634428676104, - -0.2536403077355467, - -0.39901035211905267, - -0.4781420580318304, - -0.3391520532609389, - -0.3735591643576288, - -0.3586064052256128, - -0.33138759058236744, - -0.35686745123234576, - -0.3570766836646905, - -0.35605376955100765, - -0.3508528403896619, - -0.3614493006855174, - -0.3170299260865126, - -0.3717022923816531, - -0.37255336892883684, - -0.42130239347011744, - -0.4141187466262818, - -0.41628081509384385, - -0.43071785292563003, - -0.42418515142686686, - -0.4222090673436112, - -0.41597859046934604, - -0.41597859046934604, - -0.41893109257021044, - -0.434237864350962, - -0.42837935624530965, - -0.4260777994895175, - -0.43982384350854564, - -0.43061761648537733, - -0.4319660032715993, - -0.43546715930616753, - -0.4361181046512397, - -0.44843337564583574, - -0.43825073060505904, - -0.43615840628161184, - -0.44292358826075806, - -0.4379950020766379, - -0.43780901769233116, - -0.4356701972728072, - -0.4354377167924246, - -0.4375300411158717, - -0.43627464652180337, - -0.43578643751299895, - -0.4353447246002712, - -0.4339963378140498, - -0.4317180291062961, - -0.43618165432965006, - -0.4403895510245831, - -0.44299333240487304, - -0.44206341048334097, - -0.44585284231358413, - -0.44680601228315464, - -0.4458993384096608, - -0.44252837144410684, - -0.448579504130724, - -0.44816103926603457, - -0.44774257440134513, - -0.44774257440134513, - -0.4489525103268608, - -0.44921846799641907, - -0.4507528391669471, - -0.45024138211010445, - -0.44768409682589105, - -0.44921846799641907, - -0.44870701093957643, - -0.4481955538827337, - -0.44614972565536304, - -0.44512681154167777, - -0.4236456151542858, - -0.4441038974279924, - -0.444615354484835, - -0.4425695262574644, - -0.4292716427795551, - -0.44306433588446004, - -0.43450905420636454, - -0.42520983499104337, - -0.4209321941519957, - -0.4287435382928655, - -0.42355922358032394, - -0.42886233053280187, - -0.4211904746801618, - -0.4211821640818483, - -0.4231814962131424, - -0.4230885040209892, - -0.4231679663921817, - -0.4181463880159082, - -0.4153101261552353, - -0.417588434862989, - -0.415217133963082, - -0.4106140204514981, - -0.41056752435542154, - -0.4037019052308909, - -0.40319044817404837, - -0.40319044817404837, - -0.40444584276811657, - -0.40879322775127935, - -0.4134893334550165, - -0.41562815387454044, - -0.41981280252143494, - -0.430716137051399, - -0.4382252565677709, - -0.43903893824911144, - -0.4393304849516698, - -0.4431199167819132, - -0.4378658579252568, - -0.4345878831518559, - -0.4155725233487696, - -0.4240115647866738, - -0.4501167402888516, - -0.44142383016636955, - -0.4469894128667391, - -0.4405841106712258, - -0.443076301420932, - -0.4396634879689091, - -0.4403590695662153, - -0.4239226996031351, - -0.43377987197137546, - -0.4336852896823973, - -0.43177894974325626, - -0.4381735676652726, - -0.44345087456996746, - -0.44124231000632863, - -0.44922372575875347, - -0.4479869296031157, - -0.45279927554704436, - -0.44261663050626765, - -0.4475917127864645, - -0.4397571617813014, - -0.43979686855181366, - -0.4388521390195178, - -0.4227598401674044, - -0.4217957639164721, - -0.41193861820111755, - -0.418959528708685, - -0.42163305423308983, - -0.42725908185835915, - -0.4129150362187263, - -0.4197367935574169, - -0.4037667868292476, - -0.412109423961182, - -0.40538608846850477, - -0.4305311772267333, - -0.4436244778819055, - -0.4431362688731011, - -0.4761252490394531, - -0.4812584180463103, - -0.4637721929738299, - -0.45469662427592217, - -0.4548361125641518, - -0.4696916152606275, - -0.46285668913736633, - -0.4589277690188933, - -0.46704133778426093, - -0.4691104140596699, - -0.4331224356963769, - -0.47836706775343574, - -0.47106718066940867, - -0.48343514222578576, - -0.48362112661009227, - -0.4747868683555371, - -0.4709905756132845, - -0.4691074837221819, - -0.45955253597843937, - -0.4764073708062091, - -0.45515865489920015, - -0.46131802494103447, - -0.4528092393590156, - -0.48091643361333714, - -0.45200454054220096, - -0.44377704787230754, - -0.445053672492705, - -0.43814900222532893, - -0.4373353205439885, - -0.4419670314055284, - -0.4602399971636345, - -0.44629116834065263, - -0.4465236488210357, - -0.442176263837873, - -0.4405295178589226, - -0.43318313467881886, - -0.43804197671882417, - -0.4381501657274176, - -0.4257589561230021, - -0.42374632861036876, - -0.417004394679261, - -0.392384711806698, - -0.39368660249684295, - -0.41934756134437434, - -0.41269861960541965, - -0.39607626525803297, - -0.4140702544396794, - -0.3951928394325773, - -0.41646370188129944, - -0.3837072021953306, - -0.40515220037912536, - -0.40296688386352497, - -0.3863900956902937, - -0.4025009929808374, - -0.4535769545209889, - -0.38880789268627713, - -0.44544349054377763, - -0.4471079697702275, - -0.5234545595280142, - -0.48828026284606196, - -0.5260350928602662, - -0.48959394885432594, - -0.4899445432892803, - -0.5109886763735523, - -0.5089474977557892, - -0.5071899453240936, - -0.5207621557688549, - -0.5024240954762415, - -0.44446206210714445, - -0.4878475693562254, - -0.4966167330762733, - -0.4804761590859712, - -0.4759241912800716, - -0.47282755128136944, - -0.5016132843623965, - -0.46800590611822557, - -0.4848756186702692, - -0.46747276645723634, - -0.48125727545591324, - -0.4822569415215603, - -0.4511354356297198, - -0.46361963742628864, - -0.45769984285207377, - -0.45739761822757596, - -0.47706546686798035, - -0.4462153071211521, - -0.47290871587873173, - -0.47812214100721584, - -0.5160862034537645, - -0.5046762066193426, - -0.4945400576746427, - -0.5025606342478571, - -0.5281985816244976, - -0.5205081273334269, - -0.5198339339403162, - -0.49467954596287245, - -0.5323367341753156, - -0.490397255514217, - -0.5288309285311396, - -0.5367492136929854, - -0.5375117496686418, - -0.525989104832933, - -0.5102501763110019, - -0.5023458399779785, - -0.5403099024245275, - -0.5323125738993513, - -0.5198981162468974, - -0.5042056838210431, - -0.5008114688074508, - -0.508041611747363, - -0.4929536285705044, - -0.5020901114495575, - -0.4804694267739358, - -0.4969290447850543, - -0.4920237066489723, - -0.49109378472744014, - -0.48862949163538005, - -0.495999122863522, - -0.4705657583096188, - -0.4831662003463789, - -0.47872582317106305, - -0.47321603578598526, - -0.48493305199729, - -0.45315297032892965, - -0.43992483099513546, - -0.44352827844107234, - -0.4505259409006014, - -0.4583807529169909, - -0.4718413727311682, - -0.4417816466176423, - -0.43906162499716084, - -0.4827447072611323, - -0.46264909453682324, - -0.4392708574295058, - -0.41183351113470046, - -0.4352024490228027, - -0.4528943498226501, - -0.45964271752507735, - -0.42595196471006114, - -0.41909164736204474, - -0.43156654993939836, - -0.4316306919846955, - -0.45902154218342406, - -0.5047160947069358, - -0.46661254397215735, - -0.46403201063990573, - -0.4379755983985756, - -0.4428204916097581, - -0.4538733011591818, - -0.4547334789365991, - -0.37198096532614355, - -0.43073808193815055, - -0.45951597099674213, - -0.4213287272890255, - -0.4464750317397016, - -0.3948969123619226, - -0.38672205558197115, - -0.3617554920403896, - -0.3773642314933062, - -0.3482882928139517, - -0.349613431552135, - -0.3840654740290552, - -0.3989953704792535, - -0.38372140291808843, - -0.38372140291808843, - -0.34992659387143765, - -0.3583374203873402, - -0.3713563272887904, - -0.3635682311959586, - -0.3466074339053028, - -0.3434414726836569, - -0.3022552307789993, - -0.32175732790299494, - -0.3356550110202926, - -0.3226173490571803, - -0.3076173835612833, - -0.294040523506914, - -0.30808234452204875, - -0.3029167603184054, - -0.31905090565698724, - -0.3705632205830691, - -0.30532919778759116, - -0.3536990865360843, - -0.31880972025464127, - -0.3400242697562641, - -0.34784026350674135, - -0.3115811369249102, - -0.2838826370799058, - -0.311313116058087, - -0.25907475211602027, - -0.16933728668817083, - -0.1612934620669184, - -0.2757160658163982, - -0.15826692712689183, - -0.0554538431408651, - -0.09525450138244074, - -0.06635717767082949, - 0, - -0.11316635144279596, - -0.25729413985923233, - -0.2526242142988918, - -0.21297518611911426, - -0.38082047179268264, - -0.19472167125899054, - -0.21163357726839704, - -0.37505830233873216, - -0.19253703554173263, - -0.22463710638367917, - -0.09726602020249164, - -0.31424212493348835, - -0.23063685567847547, - -0.24575743989569088, - -0.4835972020746234, - -0.06414424099922766, - -0.6346685933150973, - -0.43992399921629755, - -0.4359027724388844, - -0.45125235694690424, - -0.3232898154014999, - -0.4187647015685394, - -0.08987079481174243, - -0.24659353851969623, - 0, - -0.18366731637097133, - 0, - -0.07947642252609177, - -0.21140945244389586, - -0.0842905468919285, - -0.17771058188303668, - -0.06447023306141231, - -0.08008360938304437, - -0.06509910516325446, - 0, - -0.029947721603448385, - 0, - -0.13585930833797677, - 0, - -0.015174596840937138, - 0, - -0.026283151408156402, - -0.1005658791041596, - -0.048338826152512615, - 0, - 0, - -0.1326150505675293, - -0.10842999109994722, - -0.06878464109248117, - -0.16742687858905037, - -0.12434396962407157, - -0.18279992143965607, - -0.0849254636087241, - -0.07596859876926976, - -0.05291775926228748, - -0.02598757030940979, - -0.10341116977381593, - -0.133278476692969, - -0.08190703724667381, - -0.03091948763319774, - 0, - -0.08343590385957866, - -0.01778143197192439, - -0.08550856801757933, - -0.10080590247317467, - -0.11271887089877164, - -0.20421708672314665, - -0.15545213263755786, - -0.14232079244116158, - -0.15683596230315888, - -0.06897782016438103, - -0.12469200583156581, - -0.20697065358746503, - -0.106297045415093, - -0.11029811814389345, - -0.06341336740830306, - -0.027463562765555394, - -0.14472800937827346, - -0.14084975221148566, - -0.0023915775175249454, - 0, - 0, - 0, - 0, - 0, - -0.060132623267456276, - -0.11189458367336402, - -0.020661922334454963, - -0.12597595478232537, - -0.07868927346655352, - -0.028769991783862636, - -0.030207123660695223, - 0, - -0.008904720390546239, - -0.042106474343956535, - 0, - 0, - 0, - -0.11066580327390652, - -0.05771985061546814, - -0.09722033117974238, - -0.09300430659163816, - -0.1282062646916512, - -0.021939699028780346, - -0.09759691728447473, - -0.06884274288085346, - -0.14123276177523936, - -0.10181083902544685, - -0.09919928322974014, - -0.07923552683644364, - -0.07308585997449957, - -0.03305080066264199, - -0.009900417025455965, - 0, - 0, - -0.016505346820809952, - -0.0067483701261003, - -0.07527754166080536, - -0.036194354560748265, - -0.12809788858315685, - -0.013824251241809193, - -0.012442243211396531, - -0.03058340195727416, - 0, - 0, - -0.018581123748124262, - -0.04032589913027773, - 0, - 0, - -0.05616221024826662, - 0, - -0.03539669518420652, - 0, - 0, - -0.05286317510303906, - 0, - -0.0009377236594920735, - -0.21556239421134993, - -0.2187620594008396, - -0.18451613791731858, - -0.19415966395367035, - -0.284820011749953, - -0.2668892147474774, - -0.2148328797042559, - -0.30312463102208675, - -0.2842307664774315, - -0.3917775326682358, - -0.3207196215789305, - -0.255516147390784, - -0.3698297302595569, - -0.3237925673549724, - -0.2351903534742007, - -0.2368503777903319, - -0.2314077789828688, - -0.19055977605885832, - -0.059867709002318414, - -0.220902739608275, - -0.11771512123997863, - -0.14278655719007916, - -0.09404393480844253, - -0.08005411156411668, - -0.10406744041195026, - 0, - -0.03835982669822102, - -0.044921376001860414, - -0.06933160124781557, - -0.04721160907611266, - -0.14353389101717684, - -0.11720165824085704, - -0.1752524420320245, - -0.23103822947702723, - -0.19400964018560773, - -0.1983882125093871, - -0.16064668564939677, - -0.27177030861579365, - -0.21513278159771942, - -0.3232279971932054, - -0.39001068890383406, - -0.30765567412469486, - -0.06904114818852747, - -0.08687342025757971, - -0.06120135860707543, - -0.12633483013696534, - -0.20358066931409313, - -0.25262825035882286, - -0.2337953420209613, - -0.28076720218021123, - -0.252798598273437, - -0.2668835560368459, - -0.3473950278289376, - -0.4858588232395319, - -0.26707910374643196, - -0.3363980866302, - -0.3496135725328319, - -0.2560449590276508, - -0.28862178948382944, - -0.2591579094376696, - -0.24033139990965902, - -0.2289937998148115, - -0.20756150848358468, - -0.23211053573404128, - -0.26505708425674557, - -0.26329051329038433, - -0.3566348613167165, - -0.29788375832103353, - -0.3603762062561997, - -0.25660908952831496, - -0.2864389021317948, - -0.27456056238276216, - -0.2289893406325645, - -0.31022005917525364, - -0.25514720929881307, - -0.2524522846324839, - -0.3523455635984126, - -0.29843234137776464, - -0.31724758400595754, - -0.28844592034342176, - -0.2322121809748019, - -0.14387101429249416, - -0.14387101429249416, - -0.2864371408639864, - -0.2930842466261112, - -0.2611534764090586, - -0.23805556102383252, - -0.26609987511487865, - -0.25121651472325357, - -0.24238365989142674, - -0.25660455617066813, - -0.2529389214154597, - -0.2576644987504859, - -0.2456076519050453, - -0.23204921973819015, - -0.18187860429341662, - -0.2025060963658224, - -0.28166109402303185, - -0.28493555949282845, - -0.21362287508987943, - -0.2605631893390131, - -0.24897953114527183, - -0.21247460396173867, - -0.2077679541727787, - -0.24150945963036008, - -0.22119389351715757, - -0.22943999442086882, - -0.22903620677141623, - -0.2404053527763791, - -0.25059468174309296, - -0.23332645054687118, - -0.2424179818416311, - -0.2570048106781926, - -0.26220988584694305, - -0.270428643180888, - -0.30602504815314857, - -0.3231103130707089, - -0.2354126829547214, - -0.3596215494362677, - -0.38369107885299114, - -0.34106624510740824, - -0.35837233139576663, - -0.4207196681444132, - -0.4367260629360863, - -0.4421204135655231, - -0.4872854355592847, - -0.4684402450052728, - -0.4657272967354972, - -0.4529701306855318, - -0.4513493182142282, - -0.48202799432974497, - -0.46615650830431565, - -0.4796359630098811, - -0.5017748827276516, - -0.4914656793025063, - -0.4899531159504261, - -0.5152844817716998, - -0.5371581513177732, - -0.5415241052775039, - -0.5543498414583963, - -0.5800279139980318, - -0.5410245507334965, - -0.5207353335772134, - -0.37405316073069284, - -0.5042557501338358, - -0.5153936638133243, - -0.5028497771230044, - -0.4935008149686283, - -0.5243351641022591, - -0.46600677630209264, - -0.3924735183489725, - -0.46184744469809613, - -0.44362450116062135, - -0.4491866610317594, - -0.43917053050661614, - -0.38163030818692467, - -0.5150387209399161, - -0.46307882147349555, - -0.4597589298931338, - -0.3927245789258602, - -0.4644894264424395, - -0.4342898957724248, - -0.45168715616705, - -0.4430675516875915, - -0.4592606982671381, - -0.4792090699866154, - -0.5176635344151734, - -0.504724663922953, - -0.47518190155276474, - -0.5223582906832391, - -0.5282674705657306, - -0.5452984765178959, - -0.5918386653906639, - -0.5474430918242048, - -0.5340073299524783, - -0.5545596136793347, - -0.5398718379304124, - -0.518518362868109, - -0.5044577198122462, - -0.5021154907099596, - -0.49863884800412517, - -0.49430443995450757, - -0.5133392421170933, - -0.4949946644677946, - -0.5048975565706761, - -0.49573100308924756, - -0.4931897856569215, - -0.47256759329741616, - -0.4711720022339877, - -0.47960990227119094, - -0.47304709113114385, - -0.47343280131211396, - -0.46094173038043784, - -0.47386900982049807, - -0.45686954977844607, - -0.46511128748034813, - -0.46265701567350503, - -0.44907713228777435, - -0.4530270407312176, - -0.4383706402037312, - -0.4368627457002977, - -0.43658204969313597, - -0.430859621598517, - -0.4162097009417304, - -0.42207724022287196, - -0.42319396544089605, - -0.41474092048316946, - -0.4687894130672121, - -0.46897965569458444, - -0.4010928571299769, - -0.4447523967272896, - -0.4224999117331101, - -0.44807102647124697, - -0.42669006256709974, - -0.42654495138057724, - -0.42542822616255305, - -0.3964178501201844, - -0.46700885701806083, - -0.483754196810817, - -0.6022557879812247, - -0.4651546255794712, - -0.45272553699468654, - -0.5154622736431851, - -0.4415315310680804, - -0.446979635928351, - -0.4506347862942919, - -0.4043309286050836, - -0.49131628517539183, - -0.419411195239763, - -0.344750858855549, - -0.4391805867901952, - -0.11348925424907419, - -0.43010293569588676, - -0.5174674410010754, - -0.3474349947744506, - -0.38160678644597723, - -0.469701357523828, - -0.4090510642084645, - -0.5022333629909208, - -0.20433902460555753, - -0.4519946083803018, - -0.16811296326742842, - -0.5480052167294442, - -0.2794341627986282, - -0.34140958522737064, - -0.3388480573261411, - -0.3469578162569974, - -0.34997991444588605, - -0.3139198548985609, - -0.2513521543008317, - -0.38140933888019923, - -0.41433311333357026, - -0.377124485355383, - -0.3106698711099365, - -0.17235589258114414, - -0.219841836719046, - -0.03323963606952396, - -0.3401687231114411, - -0.3156701693171685, - -0.3302443797896817, - -0.3251465607153132, - -0.4413680027560788, - -0.43835852293123545, - -0.39138666277198764, - -0.36466482704274794, - -0.3518571875366001, - -0.34828164597956446, - -0.36101357530143974, - -0.4026794133795686, - -0.42294450603658684, - -0.42336722123211024, - -0.41807381751503747, - -0.4818028651266637, - -0.43107704166389016, - -0.4284208760323195, - -0.41127251929453124, - -0.4111715723821673, - -0.42473631373104326, - -0.4403716821381922, - -0.42846573539488586, - -0.39657205615859725, - -0.34173264601700193, - -0.3170539516551968, - -0.3191422909047211, - -0.3063409605805958, - -0.2340240680055996, - -0.29953861412965954, - -0.23418810673819057, - -0.198345643667044, - -0.1684089190730248, - -0.18540585544226773, - -0.27411219225733274, - -0.04937912860758198, - 0, - 0, - -0.04687323322901382, - 0, - -0.015945754984597382, - 0, - -0.12272339637751573, - -0.070282436471228, - -0.028389974883484492, - -0.0508189094628646, - -0.049147708421118375, - -0.05215029970360652, - -0.054628992380201136, - -0.11354373386891747, - 0, - -0.014661097112631527, - 0, - -0.002623260521183113, - -0.14662078545186863, - -0.15652602339112587, - -0.14347971062869325, - -0.12135994758365853, - -0.004712608195421186, - -0.23249287478379843, - -0.30554819034813885, - -0.2301932333614325, - -0.007785898078465525, - -0.2137807956805151, - -0.3034966935068215, - -0.27343661982852185, - -0.27519301819125674, - -0.124328867431864, - -0.21893359414475888, - -0.40489857134529106, - -0.2810278982930924, - -0.2480785196275106, - -0.2033116863027108, - -0.1947856563864141, - -0.10420900704459557, - -0.1528063993514862, - -0.18581738314910712, - -0.19140839074085825, - -0.24310388603962407, - -0.11432954741698131, - -0.21647836408399346, - -0.1051777649655381, - -0.1703862154072513, - -0.1225105526425595, - -0.13327750698244833, - -0.12168062507750532, - -0.24146466706056025, - -0.17980461592906094, - -0.16441965190404817, - -0.2118237968543042, - -0.21070637078776977, - -0.18036992030276255, - -0.28675880762008765, - -0.3171812811386342, - -0.22415420405896203, - -0.25698612935229304, - -0.22264912294969275, - -0.25133923713851225, - -0.1882484774069052, - -0.20959516599625627, - -0.2505118810557233, - -0.209703729250465, - -0.19072066880024652, - -0.2186989703134763, - -0.16308356608595864, - -0.19162407016562666, - -0.3915549345683015, - -0.3624677369585103, - -0.1505212466703738, - -0.13733856580216608, - -0.29356108860857666, - -0.3039250021264349, - -0.2644234866307599, - -0.316427350291544, - -0.488465212880724, - -0.28885153966020016, - -0.26703032556423867, - -0.2766924551888187, - -0.28072480463085836, - -0.25731003705347555, - -0.28997594479307653, - -0.29056916543214595, - -0.27909635581772696, - -0.2769095816972361, - -0.30288334026668273, - -0.30422874916705567, - -0.3211995121553327, - -0.3024232523314333, - -0.30442391801613766, - -0.2959210888561442, - -0.3338865071129393, - -0.375853959382784, - -0.35219412397224437, - -0.3081678778738519, - -0.2661461439769034, - -0.17581098128153982, - 0, - -0.06378736052648326, - -0.22438796511027237, - -0.26731819385333255, - -0.49498118197308016, - -0.30093724279126655, - -0.373585427148063, - -0.3186926909273958, - -0.23578979715518633, - -0.10016587722679893, - -0.49950054254808707, - -0.3230829137232618, - -0.32800605903264013, - -0.34713978053074923, - -0.34374418901560566, - -0.33858246940589787, - -0.3352534581165413, - -0.351327326310519, - -0.354274377357202, - -0.3519405652322425, - -0.36772007874379287, - -0.36796887853489213, - -0.35740413031560003, - -0.36123074118715515, - -0.36299686928171915, - -0.3627025145992918, - -0.36682348015327426, - -0.3682952535654108, - -0.36947267229512015, - -0.37044619952887436, - -0.372680391206739, - -0.3738157592675301, - -0.3721127071763435, - -0.37602990440126893, - -0.38002285040408823, - -0.38683505876883484, - -0.3876970974816577, - -0.36730602727874606, - -0.3798937242578, - -0.38763104733874665, - -0.3653406885896968, - -0.3606345178932695, - -0.35789561376815726, - -0.35945148851813014, - -0.3637616820822446, - -0.3691091254796742, - -0.3758267198393549, - -0.3762962856422747, - -0.37450562799084175, - -0.41297498160616464, - -0.3939435496982745, - -0.39269604652036827, - -0.39832733193299563, - -0.39824313696263236, - -0.400317636629263, - -0.401873511379236, - -0.39995277727260603, - -0.40336703988780676, - -0.4090007175193553, - -0.41290176752500174, - -0.4056410186917945, - -0.4108272678583711, - -0.41238314260834397, - -0.4232742658581551, - -0.42483014060812796, - -0.4155289934408025, - -0.4202099260799216, - -0.4031583798335958, - -0.40733190872372615, - -0.4092767521611923, - -0.42266989021163537, - -0.4189273806779167, - -0.42215476951738773, - -0.42379310678120563, - -0.4132804395516584, - -0.42199032065433106, - -0.4200840236633734, - -0.407784203004803, - -0.41699680372029635, - -0.40630542114784685, - -0.41287978254952973, - -0.4119336424988703, - -0.4110295531171295, - -0.4091793236847291, - -0.39096087137592395, - -0.4151189806694232, - -0.4105880210934886, - -0.4090531716779745, - -0.4198143583608285, - -0.4257435026782932, - -0.4067433284342994, - -0.4017918621691826, - -0.3924461010021151, - -0.40889842521635633, - -0.40019393675029136, - -0.40980251459809747, - -0.40098238679250753, - -0.41208376338690933, - -0.39787063729256145, - -0.39787063729256145, - -0.4037266134461086, - -0.4070192000698627, - -0.4024076433785012, - -0.4041597545834261, - -0.3989034209686523, - -0.3982236018211417, - -0.40555443510254596, - -0.39432690650138935, - -0.39886837874455383, - -0.40587102657095175, - -0.40901080985017635, - -0.4148328111601356, - -0.44421221184431026, - -0.2320806040416875, - -0.30498384013322344, - -0.33468926896038254, - -0.2867227814461031, - -0.3340571770534626, - -0.34707421985245634, - -0.26497379301210267, - -0.3387201536273765, - -0.2839537941872615, - -0.32153903583705523, - -0.3062262847504962, - -0.2971804850217128, - -0.3663706556597003, - -0.34182988527904445, - -0.2834915905998776, - -0.2760072723769228, - -0.2853313073650485, - -0.2800806293232029, - -0.3105813811785285, - -0.2895567475639157, - -0.2956568979349815, - -0.3176515003126398, - -0.4205691108009423, - -0.3268521866719398, - -0.3943087945219681, - -0.42384728690354867, - -0.339915553431808, - -0.34359218358422117, - -0.3027315485964184, - -0.2989894518724424, - -0.23634867291846273, - -0.3301482966963384, - -0.35121147675745834, - -0.29463300257251723, - -0.3262137557745596, - -0.33875024826101763, - -0.22736153051914487, - -0.3119459006253793, - -0.2637348087106759, - -0.18515962961463062, - -0.48483021743769195, - -0.22322599765281992, - 0, - -0.5687740514936833, - -0.37694711298850314, - -0.30569289868103267, - -0.3087831966310006, - -0.19539812068073437, - -0.2878635629405101, - -0.28680531895914574, - -0.2882452535097625, - -0.270445979033344, - -0.27052105078970146, - -0.30954658385047806, - -0.32511531253032366, - -0.1337182501018418, - -0.33346031944580046, - -0.38187607315288774, - -0.3265612069192263, - -0.45189817021918843, - -0.24082324479785477, - -0.3578702636963039, - -0.355297019488938, - -0.35953445527714323, - -0.3960923192900886, - -0.4087662684817047, - -0.06209243587737756, - -0.23271716480948335, - -0.09550773692784043, - -0.2260427640498608, - -0.5144763845578866, - -0.345373958040045, - -0.27217409107039636, - -0.2545127705024378, - -0.2744073150869548, - -0.25530939400121255, - -0.16980012825527435, - -0.27298432678464213, - -0.17003351560513236, - -0.16962751868320103, - -0.2554253725645459, - -0.07203283662880466, - -0.317805061993198, - -0.2516251953896059, - -0.22447822759225622, - -0.15449259863000486, - 0, - 0, - 0, - -0.13606384591902143, - 0, - -0.0044966620232022025, - -0.025216374772325634, - -0.024436567252295927, - -0.03594896374101231, - -0.031126604631284138, - 0, - 0, - -0.4503026255830197, - -0.3226153008201049, - -0.2947220207424792, - -0.059942547562785053, - -0.059953170114480425, - -0.3253824397229349, - -0.5049646505223087, - -0.4153790439672195, - -0.4224828976508558, - -0.5474658037254245, - -0.4082195465980538, - -0.4127546787656492, - -0.4792322988150657, - -0.4429425289842358, - -0.38302917551691407, - -0.40765159109983673, - -0.3699605247438089, - -0.38056378642767774, - -0.4121924460644182, - -0.38316093831947884, - -0.36298653833308625, - -0.22951719032316908, - -0.3146554651207407, - -0.3583181872450255, - -0.4098396200089873, - -0.46004413732931726, - -0.3876731391976991, - -0.7346725427901118, - -0.3787516924380758, - -0.39627996595222614, - -0.5634267481351886, - -0.3527117594661896, - -0.41078301153916097, - 0, - -0.2985227458607358, - -0.3912732188236945, - -0.4381591388566176, - -0.31638385968991833, - -0.3116355874192418, - -0.410170561496239, - -0.4190568231892211, - -0.40831581319168453, - -0.5527269556941101, - -0.4383579254016218, - -0.4489290579003292, - -0.4725089913156336, - -0.4896968045958996, - -0.48827378801974464, - -0.4302090111221176, - -0.45887808341233904, - -0.5280901786668167, - -0.42398673987475277, - -0.3537141749479239, - -0.411600087529281, - -0.3712494961984184, - -0.34091542850973444, - -0.36086509799770583, - -0.3673906758835248, - -0.35162987492045306, - -0.39451536436787926, - -0.3853179676391527, - -0.4199906109504157, - -0.412562061794003, - -0.48099044377280464, - -0.4214943924342037, - -0.4022533010242151, - -0.45730315811485966, - -0.38307964324617616, - -0.47938358122609004, - -0.5100101371589915, - -0.5433759067670321, - -0.5435122947279067, - -0.519326621152015, - -0.5459363918075268, - -0.5201920986615498, - -0.5205537665122107, - -0.5088483763232658, - -0.47893918909863487, - -0.5132599408155296, - -0.4983704777821869, - -0.4769668913206787, - -0.4450571697480651, - -0.4540936713041981, - -0.4324231693411329, - -0.4132079170565418, - -0.41754169778987404, - -0.45195115495788674, - -0.4260744695920754, - -0.47047727510422943, - -0.47513577639284477, - -0.5265305959616984, - -0.5643233802606988, - -0.5210870679327617, - -0.5024817723176325, - -0.6349680252565781, - -0.58831934689651, - -0.5887782587281294, - -0.5788435145859245, - -0.5816818226388858, - -0.5398349985192022, - -0.5150422188271415, - -0.4770862420283807, - -0.4732329966010834, - -0.4552148683324506, - -0.44580356626664774, - -0.4389104789317876, - -0.3937909688638416, - -0.38782998702760674, - -0.3694304311697818, - -0.3685114967664166, - -0.36021383116745287, - -0.3601686650412057, - -0.32637049264465356, - -0.34797357397954753, - -0.3472187035380302, - -0.34731155957353443, - -0.3828869739773819, - -0.46008869360237925, - -0.39126893544436336, - -0.38621367029152065, - -0.4323676759106838, - -0.43153150050212286, - -0.4697417065485605, - -0.4455808378568368, - -0.46544639334572735, - -0.4381862235774511, - -0.4068345965373822, - -0.4226994446487421, - -0.40370456410750544, - -0.378980250457988, - -0.3664795253463228, - -0.39586551953418103, - -0.3130098333030139, - -0.3188270646002762, - -0.35575768661283036, - -0.3241510362642297, - -0.3302246623333682, - -0.33029902011712786, - -0.3151178679877735, - -0.36423809391306183, - -0.3689899311423097, - -0.2967442692893153, - -0.2967442692893153, - -0.4769012151662906, - -0.5008801425713776, - -0.49354982243985324, - -0.4329197797937472, - -0.48855780996566356, - -0.4637509176679607, - -0.5068817374638153, - -0.5152995005354126, - -0.5153097739794419, - -0.42161485030384405, - -0.42091344307801193, - -0.43355048766261206, - -0.34151831856590387, - -0.3850103987491682, - -0.2636362675768996, - -0.3251624027891217, - -0.3193928112771487, - -0.318684079751717, - -0.31744540002893296, - -0.2563265450621157, - -0.3399891316040108, - -0.28369367840447857, - -0.2211224298339498, - -0.14643004255004055, - -0.21859712149588784, - -0.17580539877156143, - -0.20689625981345294, - -0.12462794751534922, - -0.2023144767528301, - -0.20288054989560322, - -0.17398383548345386, - -0.173076802267091, - -0.19253073348321437, - -0.2578072473867973, - -0.22897531194688303, - -0.182235797073811, - -0.14104103885229935, - -0.252001435653869, - -0.1637221969160625, - -0.16291772105309021, - -0.10483429736393668, - -0.06954790822874246, - -0.07296730449871491, - -0.07803656796636782, - -0.09822188923842412, - -0.21330589079456186, - -0.4126161177590083, - -0.06554871474419888, - -0.09910761183589978, - -0.05967897115461851, - -0.41761345788791726, - -0.07083641205544122, - -0.13749469601910014, - -0.08948320358123207, - -0.14831915849982025, - -0.1161427878083906, - -0.126217382887038, - -0.11044086534253894, - -0.10720031935809293, - -0.14613748389130432, - -0.1406779697152889, - -0.13291557678583832, - -0.13492277070221936, - -0.10574586961908194, - -0.16992812605085195, - -0.16505465389421614, - -0.20836981869494742, - -0.09560068311537018, - -0.1892168999706002, - -0.12063133691138472, - -0.20305947885113906, - -0.2149041872110573, - -0.17868679041325308, - -0.24891993069513707, - -0.22730297166202817, - -0.3509120199210154, - -0.30043169228513245, - -0.41079992026439616, - -0.30167862987273597, - -0.3057878499595489, - -0.2711775402085286, - -0.2514585581700083, - -0.24811998333868113, - -0.332705026292498, - -0.27965313265523506, - -0.23725364116820546, - -0.16771042265456582, - -0.1802197559410098, - -0.2409805184311985, - -0.16060485547296321, - -0.19572875113915011, - -0.19999753448487378, - -0.17049050323908177, - -0.1447046543862779, - -0.13821205468318487, - -0.13889772384585986, - -0.15498228638636613, - -0.14634541221090147, - -0.12915573425148597, - -0.03641612970415842, - -0.06870704497210534, - 0, - -0.040676827536361704, - -0.0375947709294836, - -0.32407305063509695, - 0, - 0, - 0, - 0, - -0.09697576873416092, - -0.3401315260156742, - -0.11124600307771104, - -0.0009362890685734593, - 0, - 0, - -0.5848118669620963, - 0, - -0.5601853092757865, - -0.36749487023846505, - -0.2590409692629351, - -0.12007081305590062, - -0.11051123288021725, - -0.3069082273140269, - -0.10398161412955953, - -0.10211617640753301, - -0.13076789465952532, - -0.08608836432366396, - -0.09809378155014525, - -0.11993521700322485, - -0.034210294733861835, - -0.05753437678709117, - -0.15972361365992283, - -0.6078547181492528, - -0.17138102312319803, - -0.19183418312030065, - -0.29328171781093104, - -0.29199815974531673, - -0.3431800512343276, - -0.25670346477910155, - -0.2542511359475995, - -0.261215676974491, - -0.35533065805774333, - -0.367137590776378, - -0.355846208756877, - -0.39680265428697425, - -0.35355440378708713, - -0.41534579691338336, - -0.3602077453846604, - -0.4525626625197017, - -0.41088561778495736, - -0.45879161942504143, - 0, - -0.48382596728387406, - -0.03213058935909685, - -0.40779652667224164, - -0.3630173807979866, - -0.2986616026339498, - -0.33336008008593065, - -0.3473076103124447, - -0.2976541492369782, - -0.28661594078691244, - -0.29993271096418617, - -0.31233428243529215, - -0.27107894767933083, - -0.2717515693906023, - -0.6761952763628101, - -0.3581064887044544, - -0.4926517060555432, - -0.4697332119953588, - -0.531303126327408, - -0.4571948324702364, - -0.5168165686629913, - -0.4677049932819318, - -0.4349792487565418, - -0.4247996287833963, - -0.33834086991207857, - -0.3539558581461605, - -0.223351341753241, - -0.5418066826123578, - -0.38588245493534146, - -0.35102916136733486, - -0.37946007650048685, - -0.37132078353980136, - -0.6670012537581756, - -0.32506902182760333, - -0.36456645052544445, - -0.33973107120268753, - -0.3505532094341425, - -0.3701505700451443, - -0.3350789605199944, - -0.2535311390358904, - -0.2307650781653655, - -0.0853670306616593, - -0.2346411289084701, - -0.2110985699710881, - -0.0992548408014029, - -0.17343468369831738, - -0.23888397124018312, - -0.24418180809417644, - 0, - -0.39683975968313356, - -0.3358933173573099, - -0.28107994087849586, - -0.2843495326600114, - -0.35559784857417676, - -0.31773503710544393, - -0.3103022694153318, - -0.24624833196925333, - -0.27812250281263395, - -0.4826769252929074, - -0.11787125547242461, - -0.36965224985853873, - -0.3499167560768216, - -0.28608681539133785, - -0.038234862854304774, - -0.25464369251021146, - -0.2581645391227523, - -0.260832776320144, - -0.24089274413687434, - -0.2706570855988538, - -0.24214249070888882, - -0.30113719011288564, - -0.6288385186668428, - -0.24743453620099887, - -0.23396684673564805, - -0.23896791420318242, - -0.275911485417935, - -0.31898061336938577, - -0.34999238792384557, - -0.33991153248234474, - -0.33991576261448686, - -0.3431396739749396, - -0.2851536232983657, - -0.25143626623789594, - -0.1856468983076992, - -0.18522671352502917, - -0.20433952684934054, - -0.23131352763740787, - -0.46885021533937843, - -0.21716611350665205, - -0.26071134408222596, - -0.22688392849495487, - -0.2658493276611087, - -0.27752689528890384, - -0.5044470526501097, - -0.27984831171137325, - -0.2775306748744284, - -0.186376608617415, - -0.22604594750508022, - -0.22606860130590511, - -0.17814107898284093, - -0.2888994027866071, - -0.2555038861940936, - -0.3693546243275321, - -0.3693546243275321, - -0.2408581106231542, - -0.2523003043120421, - -0.2452964319725629, - -0.1603074454028539, - -0.16124794859588, - -0.22941677837125152, - -0.22451658328557045, - -0.22796882901642146, - -0.23822577309472903, - -0.2134844789539585, - -0.14900825417432073, - -0.2019882813705559, - -0.19886852763934026, - -0.17622295268225363, - -0.1731008586840057, - -0.09728299884155012, - -0.0817457066531696, - -0.023516024322907336, - -0.08122117650062688, - -0.06699867347502086, - -0.1199027436493797, - -0.06347653542746867, - -0.08048733407067454, - -0.0895759740715737, - -0.0641174176889221, - -0.1354734893360604, - -0.09428827200995415, - -0.09901888635443068, - -0.045012113474923066, - -0.03267940100280731, - -0.03229318242911294, - -0.0788210065900925, - -0.09504431426649484, - -0.1551987957581209, - -0.13867822943061536, - -0.15334388842775049, - -0.1716031662133075, - -0.13780153190477373, - -0.1599708034295878, - -0.21812897540488185 - ], - "yaxis": "y" - }, - { - "hovertemplate": "variable=ZSCORE_1NORM
datetime=%{x}
value=%{y}", - "legendgroup": "ZSCORE_1NORM", - "line": { - "color": "#EF553B", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "ZSCORE_1NORM", - "showlegend": true, - "type": "scattergl", - "x": [ - "2017-01-05T00:00:00", - "2017-01-06T00:00:00", - "2017-01-09T00:00:00", - "2017-01-10T00:00:00", - "2017-01-11T00:00:00", - "2017-01-12T00:00:00", - "2017-01-13T00:00:00", - "2017-01-17T00:00:00", - "2017-01-18T00:00:00", - "2017-01-19T00:00:00", - "2017-01-20T00:00:00", - "2017-01-23T00:00:00", - "2017-01-24T00:00:00", - "2017-01-25T00:00:00", - "2017-01-26T00:00:00", - "2017-01-27T00:00:00", - "2017-01-30T00:00:00", - "2017-01-31T00:00:00", - "2017-02-01T00:00:00", - "2017-02-02T00:00:00", - "2017-02-03T00:00:00", - "2017-02-06T00:00:00", - "2017-02-07T00:00:00", - "2017-02-08T00:00:00", - "2017-02-09T00:00:00", - "2017-02-10T00:00:00", - "2017-02-13T00:00:00", - "2017-02-14T00:00:00", - "2017-02-15T00:00:00", - "2017-02-16T00:00:00", - "2017-02-17T00:00:00", - "2017-02-21T00:00:00", - "2017-02-22T00:00:00", - "2017-02-23T00:00:00", - "2017-02-24T00:00:00", - "2017-02-27T00:00:00", - "2017-02-28T00:00:00", - "2017-03-01T00:00:00", - "2017-03-02T00:00:00", - "2017-03-03T00:00:00", - "2017-03-06T00:00:00", - "2017-03-07T00:00:00", - "2017-03-08T00:00:00", - "2017-03-09T00:00:00", - "2017-03-10T00:00:00", - "2017-03-13T00:00:00", - "2017-03-14T00:00:00", - "2017-03-15T00:00:00", - "2017-03-16T00:00:00", - "2017-03-17T00:00:00", - "2017-03-20T00:00:00", - "2017-03-21T00:00:00", - "2017-03-22T00:00:00", - "2017-03-23T00:00:00", - "2017-03-24T00:00:00", - "2017-03-27T00:00:00", - "2017-03-28T00:00:00", - "2017-03-29T00:00:00", - "2017-03-30T00:00:00", - "2017-03-31T00:00:00", - "2017-04-03T00:00:00", - "2017-04-04T00:00:00", - "2017-04-05T00:00:00", - "2017-04-06T00:00:00", - "2017-04-07T00:00:00", - "2017-04-10T00:00:00", - "2017-04-11T00:00:00", - "2017-04-12T00:00:00", - "2017-04-13T00:00:00", - "2017-04-17T00:00:00", - "2017-04-18T00:00:00", - "2017-04-19T00:00:00", - "2017-04-20T00:00:00", - "2017-04-21T00:00:00", - "2017-04-24T00:00:00", - "2017-04-25T00:00:00", - "2017-04-26T00:00:00", - "2017-04-27T00:00:00", - "2017-04-28T00:00:00", - "2017-05-01T00:00:00", - "2017-05-02T00:00:00", - "2017-05-03T00:00:00", - "2017-05-04T00:00:00", - "2017-05-05T00:00:00", - "2017-05-08T00:00:00", - "2017-05-09T00:00:00", - "2017-05-10T00:00:00", - "2017-05-11T00:00:00", - "2017-05-12T00:00:00", - "2017-05-15T00:00:00", - "2017-05-16T00:00:00", - "2017-05-17T00:00:00", - "2017-05-18T00:00:00", - "2017-05-19T00:00:00", - "2017-05-22T00:00:00", - "2017-05-23T00:00:00", - "2017-05-24T00:00:00", - "2017-05-25T00:00:00", - "2017-05-26T00:00:00", - "2017-05-29T00:00:00", - "2017-05-30T00:00:00", - "2017-05-31T00:00:00", - "2017-06-01T00:00:00", - "2017-06-02T00:00:00", - "2017-06-05T00:00:00", - "2017-06-06T00:00:00", - "2017-06-07T00:00:00", - "2017-06-08T00:00:00", - "2017-06-09T00:00:00", - "2017-06-12T00:00:00", - "2017-06-13T00:00:00", - "2017-06-14T00:00:00", - "2017-06-15T00:00:00", - "2017-06-16T00:00:00", - "2017-06-19T00:00:00", - "2017-06-20T00:00:00", - "2017-06-21T00:00:00", - "2017-06-22T00:00:00", - "2017-06-23T00:00:00", - "2017-06-26T00:00:00", - "2017-06-27T00:00:00", - "2017-06-28T00:00:00", - "2017-06-29T00:00:00", - "2017-06-30T00:00:00", - "2017-07-03T00:00:00", - "2017-07-05T00:00:00", - "2017-07-06T00:00:00", - "2017-07-07T00:00:00", - "2017-07-10T00:00:00", - "2017-07-11T00:00:00", - "2017-07-12T00:00:00", - "2017-07-13T00:00:00", - "2017-07-14T00:00:00", - "2017-07-17T00:00:00", - "2017-07-18T00:00:00", - "2017-07-19T00:00:00", - "2017-07-20T00:00:00", - "2017-07-21T00:00:00", - "2017-07-24T00:00:00", - "2017-07-25T00:00:00", - "2017-07-26T00:00:00", - "2017-07-27T00:00:00", - "2017-07-28T00:00:00", - "2017-07-31T00:00:00", - "2017-08-01T00:00:00", - "2017-08-02T00:00:00", - "2017-08-03T00:00:00", - "2017-08-04T00:00:00", - "2017-08-07T00:00:00", - "2017-08-08T00:00:00", - "2017-08-09T00:00:00", - "2017-08-10T00:00:00", - "2017-08-11T00:00:00", - "2017-08-14T00:00:00", - "2017-08-15T00:00:00", - "2017-08-16T00:00:00", - "2017-08-17T00:00:00", - "2017-08-18T00:00:00", - "2017-08-21T00:00:00", - "2017-08-22T00:00:00", - "2017-08-23T00:00:00", - "2017-08-24T00:00:00", - "2017-08-25T00:00:00", - "2017-08-28T00:00:00", - "2017-08-29T00:00:00", - "2017-08-30T00:00:00", - "2017-08-31T00:00:00", - "2017-09-01T00:00:00", - "2017-09-05T00:00:00", - "2017-09-06T00:00:00", - "2017-09-07T00:00:00", - "2017-09-08T00:00:00", - "2017-09-11T00:00:00", - "2017-09-12T00:00:00", - "2017-09-13T00:00:00", - "2017-09-14T00:00:00", - "2017-09-15T00:00:00", - "2017-09-18T00:00:00", - "2017-09-19T00:00:00", - "2017-09-20T00:00:00", - "2017-09-21T00:00:00", - "2017-09-22T00:00:00", - "2017-09-25T00:00:00", - "2017-09-26T00:00:00", - "2017-09-27T00:00:00", - "2017-09-28T00:00:00", - "2017-09-29T00:00:00", - "2017-10-02T00:00:00", - "2017-10-03T00:00:00", - "2017-10-04T00:00:00", - "2017-10-05T00:00:00", - "2017-10-06T00:00:00", - "2017-10-09T00:00:00", - "2017-10-10T00:00:00", - "2017-10-11T00:00:00", - "2017-10-12T00:00:00", - "2017-10-13T00:00:00", - "2017-10-16T00:00:00", - "2017-10-17T00:00:00", - "2017-10-18T00:00:00", - "2017-10-19T00:00:00", - "2017-10-20T00:00:00", - "2017-10-23T00:00:00", - "2017-10-24T00:00:00", - "2017-10-25T00:00:00", - "2017-10-26T00:00:00", - "2017-10-27T00:00:00", - "2017-10-30T00:00:00", - "2017-10-31T00:00:00", - "2017-11-01T00:00:00", - "2017-11-02T00:00:00", - "2017-11-03T00:00:00", - "2017-11-06T00:00:00", - "2017-11-07T00:00:00", - "2017-11-08T00:00:00", - "2017-11-09T00:00:00", - "2017-11-10T00:00:00", - "2017-11-13T00:00:00", - "2017-11-14T00:00:00", - "2017-11-15T00:00:00", - "2017-11-16T00:00:00", - "2017-11-17T00:00:00", - "2017-11-20T00:00:00", - "2017-11-21T00:00:00", - "2017-11-22T00:00:00", - "2017-11-24T00:00:00", - "2017-11-27T00:00:00", - "2017-11-28T00:00:00", - "2017-11-29T00:00:00", - "2017-11-30T00:00:00", - "2017-12-01T00:00:00", - "2017-12-04T00:00:00", - "2017-12-05T00:00:00", - "2017-12-06T00:00:00", - "2017-12-07T00:00:00", - "2017-12-08T00:00:00", - "2017-12-11T00:00:00", - "2017-12-12T00:00:00", - "2017-12-13T00:00:00", - "2017-12-14T00:00:00", - "2017-12-15T00:00:00", - "2017-12-18T00:00:00", - "2017-12-19T00:00:00", - "2017-12-20T00:00:00", - "2017-12-21T00:00:00", - "2017-12-22T00:00:00", - "2017-12-26T00:00:00", - "2017-12-27T00:00:00", - "2017-12-28T00:00:00", - "2017-12-29T00:00:00", - "2018-01-01T00:00:00", - "2018-01-02T00:00:00", - "2018-01-04T00:00:00", - "2018-01-05T00:00:00", - "2018-01-08T00:00:00", - "2018-01-09T00:00:00", - "2018-01-10T00:00:00", - "2018-01-11T00:00:00", - "2018-01-12T00:00:00", - "2018-01-15T00:00:00", - "2018-01-16T00:00:00", - "2018-01-17T00:00:00", - "2018-01-18T00:00:00", - "2018-01-19T00:00:00", - "2018-01-22T00:00:00", - "2018-01-23T00:00:00", - "2018-01-24T00:00:00", - "2018-01-25T00:00:00", - "2018-01-26T00:00:00", - "2018-01-29T00:00:00", - "2018-01-30T00:00:00", - "2018-01-31T00:00:00", - "2018-02-01T00:00:00", - "2018-02-02T00:00:00", - "2018-02-05T00:00:00", - "2018-02-06T00:00:00", - "2018-02-07T00:00:00", - "2018-02-08T00:00:00", - "2018-02-09T00:00:00", - "2018-02-12T00:00:00", - "2018-02-13T00:00:00", - "2018-02-14T00:00:00", - "2018-02-15T00:00:00", - "2018-02-16T00:00:00", - "2018-02-20T00:00:00", - "2018-02-21T00:00:00", - "2018-02-22T00:00:00", - "2018-02-23T00:00:00", - "2018-02-26T00:00:00", - "2018-02-27T00:00:00", - "2018-02-28T00:00:00", - "2018-03-01T00:00:00", - "2018-03-02T00:00:00", - "2018-03-05T00:00:00", - "2018-03-06T00:00:00", - "2018-03-07T00:00:00", - "2018-03-08T00:00:00", - "2018-03-09T00:00:00", - "2018-03-12T00:00:00", - "2018-03-13T00:00:00", - "2018-03-14T00:00:00", - "2018-03-15T00:00:00", - "2018-03-16T00:00:00", - "2018-03-19T00:00:00", - "2018-03-20T00:00:00", - "2018-03-21T00:00:00", - "2018-03-22T00:00:00", - "2018-03-23T00:00:00", - "2018-03-26T00:00:00", - "2018-03-27T00:00:00", - "2018-03-28T00:00:00", - "2018-03-29T00:00:00", - "2018-04-02T00:00:00", - "2018-04-03T00:00:00", - "2018-04-04T00:00:00", - "2018-04-05T00:00:00", - "2018-04-06T00:00:00", - "2018-04-09T00:00:00", - "2018-04-10T00:00:00", - "2018-04-11T00:00:00", - "2018-04-12T00:00:00", - "2018-04-13T00:00:00", - "2018-04-16T00:00:00", - "2018-04-17T00:00:00", - "2018-04-18T00:00:00", - "2018-04-19T00:00:00", - "2018-04-20T00:00:00", - "2018-04-23T00:00:00", - "2018-04-24T00:00:00", - "2018-04-25T00:00:00", - "2018-04-26T00:00:00", - "2018-04-27T00:00:00", - "2018-04-30T00:00:00", - "2018-05-01T00:00:00", - "2018-05-02T00:00:00", - "2018-05-03T00:00:00", - "2018-05-04T00:00:00", - "2018-05-07T00:00:00", - "2018-05-08T00:00:00", - "2018-05-09T00:00:00", - "2018-05-10T00:00:00", - "2018-05-11T00:00:00", - "2018-05-14T00:00:00", - "2018-05-15T00:00:00", - "2018-05-16T00:00:00", - "2018-05-17T00:00:00", - "2018-05-18T00:00:00", - "2018-05-21T00:00:00", - "2018-05-22T00:00:00", - "2018-05-23T00:00:00", - "2018-05-24T00:00:00", - "2018-05-25T00:00:00", - "2018-05-28T00:00:00", - "2018-05-29T00:00:00", - "2018-05-30T00:00:00", - "2018-05-31T00:00:00", - "2018-06-01T00:00:00", - "2018-06-04T00:00:00", - "2018-06-05T00:00:00", - "2018-06-06T00:00:00", - "2018-06-07T00:00:00", - "2018-06-08T00:00:00", - "2018-06-11T00:00:00", - "2018-06-12T00:00:00", - "2018-06-13T00:00:00", - "2018-06-14T00:00:00", - "2018-06-15T00:00:00", - "2018-06-18T00:00:00", - "2018-06-19T00:00:00", - "2018-06-20T00:00:00", - "2018-06-21T00:00:00", - "2018-06-22T00:00:00", - "2018-06-25T00:00:00", - "2018-06-26T00:00:00", - "2018-06-27T00:00:00", - "2018-06-28T00:00:00", - "2018-06-29T00:00:00", - "2018-07-02T00:00:00", - "2018-07-03T00:00:00", - "2018-07-05T00:00:00", - "2018-07-06T00:00:00", - "2018-07-09T00:00:00", - "2018-07-10T00:00:00", - "2018-07-11T00:00:00", - "2018-07-12T00:00:00", - "2018-07-13T00:00:00", - "2018-07-16T00:00:00", - "2018-07-17T00:00:00", - "2018-07-18T00:00:00", - "2018-07-19T00:00:00", - "2018-07-20T00:00:00", - "2018-07-23T00:00:00", - "2018-07-24T00:00:00", - "2018-07-25T00:00:00", - "2018-07-26T00:00:00", - "2018-07-27T00:00:00", - "2018-07-30T00:00:00", - "2018-07-31T00:00:00", - "2018-08-01T00:00:00", - "2018-08-02T00:00:00", - "2018-08-03T00:00:00", - "2018-08-06T00:00:00", - "2018-08-07T00:00:00", - "2018-08-08T00:00:00", - "2018-08-09T00:00:00", - "2018-08-10T00:00:00", - "2018-08-13T00:00:00", - "2018-08-14T00:00:00", - "2018-08-15T00:00:00", - "2018-08-16T00:00:00", - "2018-08-17T00:00:00", - "2018-08-20T00:00:00", - "2018-08-21T00:00:00", - "2018-08-22T00:00:00", - "2018-08-23T00:00:00", - "2018-08-24T00:00:00", - "2018-08-27T00:00:00", - "2018-08-28T00:00:00", - "2018-08-29T00:00:00", - "2018-08-30T00:00:00", - "2018-08-31T00:00:00", - "2018-09-03T00:00:00", - "2018-09-04T00:00:00", - "2018-09-05T00:00:00", - "2018-09-06T00:00:00", - "2018-09-07T00:00:00", - "2018-09-10T00:00:00", - "2018-09-11T00:00:00", - "2018-09-12T00:00:00", - "2018-09-13T00:00:00", - "2018-09-14T00:00:00", - "2018-09-17T00:00:00", - "2018-09-18T00:00:00", - "2018-09-19T00:00:00", - "2018-09-20T00:00:00", - "2018-09-21T00:00:00", - "2018-09-24T00:00:00", - "2018-09-25T00:00:00", - "2018-09-26T00:00:00", - "2018-09-27T00:00:00", - "2018-09-28T00:00:00", - "2018-10-01T00:00:00", - "2018-10-02T00:00:00", - "2018-10-03T00:00:00", - "2018-10-04T00:00:00", - "2018-10-05T00:00:00", - "2018-10-08T00:00:00", - "2018-10-09T00:00:00", - "2018-10-10T00:00:00", - "2018-10-11T00:00:00", - "2018-10-12T00:00:00", - "2018-10-15T00:00:00", - "2018-10-16T00:00:00", - "2018-10-17T00:00:00", - "2018-10-18T00:00:00", - "2018-10-19T00:00:00", - "2018-10-22T00:00:00", - "2018-10-23T00:00:00", - "2018-10-24T00:00:00", - "2018-10-25T00:00:00", - "2018-10-26T00:00:00", - "2018-10-29T00:00:00", - "2018-10-30T00:00:00", - "2018-10-31T00:00:00", - "2018-11-01T00:00:00", - "2018-11-02T00:00:00", - "2018-11-05T00:00:00", - "2018-11-06T00:00:00", - "2018-11-07T00:00:00", - "2018-11-08T00:00:00", - "2018-11-09T00:00:00", - "2018-11-12T00:00:00", - "2018-11-13T00:00:00", - "2018-11-14T00:00:00", - "2018-11-15T00:00:00", - "2018-11-16T00:00:00", - "2018-11-19T00:00:00", - "2018-11-20T00:00:00", - "2018-11-21T00:00:00", - "2018-11-23T00:00:00", - "2018-11-26T00:00:00", - "2018-11-27T00:00:00", - "2018-11-28T00:00:00", - "2018-11-29T00:00:00", - "2018-11-30T00:00:00", - "2018-12-03T00:00:00", - "2018-12-04T00:00:00", - "2018-12-06T00:00:00", - "2018-12-07T00:00:00", - "2018-12-10T00:00:00", - "2018-12-11T00:00:00", - "2018-12-12T00:00:00", - "2018-12-13T00:00:00", - "2018-12-14T00:00:00", - "2018-12-17T00:00:00", - "2018-12-18T00:00:00", - "2018-12-19T00:00:00", - "2018-12-20T00:00:00", - "2018-12-21T00:00:00", - "2018-12-24T00:00:00", - "2018-12-26T00:00:00", - "2018-12-27T00:00:00", - "2018-12-28T00:00:00", - "2018-12-31T00:00:00", - "2019-01-01T00:00:00", - "2019-01-02T00:00:00", - "2019-01-04T00:00:00", - "2019-01-08T00:00:00", - "2019-01-09T00:00:00", - "2019-01-10T00:00:00", - "2019-01-11T00:00:00", - "2019-01-16T00:00:00", - "2019-01-18T00:00:00", - "2019-01-22T00:00:00", - "2019-01-23T00:00:00", - "2019-01-24T00:00:00", - "2019-01-28T00:00:00", - "2019-01-29T00:00:00", - "2019-01-30T00:00:00", - "2019-01-31T00:00:00", - "2019-02-01T00:00:00", - "2019-02-04T00:00:00", - "2019-02-05T00:00:00", - "2019-02-06T00:00:00", - "2019-02-07T00:00:00", - "2019-02-08T00:00:00", - "2019-02-11T00:00:00", - "2019-02-12T00:00:00", - "2019-02-13T00:00:00", - "2019-02-14T00:00:00", - "2019-02-15T00:00:00", - "2019-02-18T00:00:00", - "2019-02-19T00:00:00", - "2019-02-20T00:00:00", - "2019-02-21T00:00:00", - "2019-02-22T00:00:00", - "2019-02-25T00:00:00", - "2019-02-26T00:00:00", - "2019-02-27T00:00:00", - "2019-02-28T00:00:00", - "2019-03-01T00:00:00", - "2019-03-04T00:00:00", - "2019-03-05T00:00:00", - "2019-03-06T00:00:00", - "2019-03-07T00:00:00", - "2019-03-08T00:00:00", - "2019-03-11T00:00:00", - "2019-03-12T00:00:00", - "2019-03-13T00:00:00", - "2019-03-14T00:00:00", - "2019-03-15T00:00:00", - "2019-03-18T00:00:00", - "2019-03-19T00:00:00", - "2019-03-20T00:00:00", - "2019-03-21T00:00:00", - "2019-03-22T00:00:00", - "2019-03-25T00:00:00", - "2019-03-26T00:00:00", - "2019-03-27T00:00:00", - "2019-03-28T00:00:00", - "2019-03-29T00:00:00", - "2019-04-01T00:00:00", - "2019-04-02T00:00:00", - "2019-04-03T00:00:00", - "2019-04-04T00:00:00", - "2019-04-05T00:00:00", - "2019-04-08T00:00:00", - "2019-04-09T00:00:00", - "2019-04-10T00:00:00", - "2019-04-11T00:00:00", - "2019-04-12T00:00:00", - "2019-04-15T00:00:00", - "2019-04-16T00:00:00", - "2019-04-17T00:00:00", - "2019-04-18T00:00:00", - "2019-04-19T00:00:00", - "2019-04-22T00:00:00", - "2019-04-23T00:00:00", - "2019-04-24T00:00:00", - "2019-04-25T00:00:00", - "2019-04-26T00:00:00", - "2019-04-29T00:00:00", - "2019-04-30T00:00:00", - "2019-05-01T00:00:00", - "2019-05-02T00:00:00", - "2019-05-03T00:00:00", - "2019-05-06T00:00:00", - "2019-05-07T00:00:00", - "2019-05-08T00:00:00", - "2019-05-09T00:00:00", - "2019-05-10T00:00:00", - "2019-05-13T00:00:00", - "2019-05-14T00:00:00", - "2019-05-15T00:00:00", - "2019-05-16T00:00:00", - "2019-05-17T00:00:00", - "2019-05-20T00:00:00", - "2019-05-21T00:00:00", - "2019-05-22T00:00:00", - "2019-05-23T00:00:00", - "2019-05-24T00:00:00", - "2019-05-28T00:00:00", - "2019-05-29T00:00:00", - "2019-05-30T00:00:00", - "2019-05-31T00:00:00", - "2019-06-03T00:00:00", - "2019-06-04T00:00:00", - "2019-06-05T00:00:00", - "2019-06-06T00:00:00", - "2019-06-07T00:00:00", - "2019-06-10T00:00:00", - "2019-06-11T00:00:00", - "2019-06-12T00:00:00", - "2019-06-13T00:00:00", - "2019-06-14T00:00:00", - "2019-06-17T00:00:00", - "2019-06-18T00:00:00", - "2019-06-19T00:00:00", - "2019-06-20T00:00:00", - "2019-06-21T00:00:00", - "2019-06-24T00:00:00", - "2019-06-25T00:00:00", - "2019-06-26T00:00:00", - "2019-06-27T00:00:00", - "2019-06-28T00:00:00", - "2019-07-01T00:00:00", - "2019-07-02T00:00:00", - "2019-07-03T00:00:00", - "2019-07-04T00:00:00", - "2019-07-05T00:00:00", - "2019-07-08T00:00:00", - "2019-07-09T00:00:00", - "2019-07-10T00:00:00", - "2019-07-11T00:00:00", - "2019-07-12T00:00:00", - "2019-07-15T00:00:00", - "2019-07-16T00:00:00", - "2019-07-17T00:00:00", - "2019-07-18T00:00:00", - "2019-07-19T00:00:00", - "2019-07-22T00:00:00", - "2019-07-23T00:00:00", - "2019-07-24T00:00:00", - "2019-07-25T00:00:00", - "2019-07-26T00:00:00", - "2019-07-29T00:00:00", - "2019-07-30T00:00:00", - "2019-07-31T00:00:00", - "2019-08-01T00:00:00", - "2019-08-02T00:00:00", - "2019-08-05T00:00:00", - "2019-08-06T00:00:00", - "2019-08-07T00:00:00", - "2019-08-08T00:00:00", - "2019-08-09T00:00:00", - "2019-08-12T00:00:00", - "2019-08-13T00:00:00", - "2019-08-14T00:00:00", - "2019-08-15T00:00:00", - "2019-08-16T00:00:00", - "2019-08-19T00:00:00", - "2019-08-20T00:00:00", - "2019-08-21T00:00:00", - "2019-08-22T00:00:00", - "2019-08-23T00:00:00", - "2019-08-26T00:00:00", - "2019-08-27T00:00:00", - "2019-08-28T00:00:00", - "2019-08-29T00:00:00", - "2019-08-30T00:00:00", - "2019-09-03T00:00:00", - "2019-09-04T00:00:00", - "2019-09-05T00:00:00", - "2019-09-06T00:00:00", - "2019-09-09T00:00:00", - "2019-09-10T00:00:00", - "2019-09-11T00:00:00", - "2019-09-12T00:00:00", - "2019-09-13T00:00:00", - "2019-09-16T00:00:00", - "2019-09-17T00:00:00", - "2019-09-18T00:00:00", - "2019-09-19T00:00:00", - "2019-09-20T00:00:00", - "2019-09-23T00:00:00", - "2019-09-24T00:00:00", - "2019-09-25T00:00:00", - "2019-09-26T00:00:00", - "2019-09-27T00:00:00", - "2019-09-30T00:00:00", - "2019-10-01T00:00:00", - "2019-10-02T00:00:00", - "2019-10-03T00:00:00", - "2019-10-04T00:00:00", - "2019-10-07T00:00:00", - "2019-10-08T00:00:00", - "2019-10-09T00:00:00", - "2019-10-10T00:00:00", - "2019-10-11T00:00:00", - "2019-10-14T00:00:00", - "2019-10-15T00:00:00", - "2019-10-16T00:00:00", - "2019-10-17T00:00:00", - "2019-10-18T00:00:00", - "2019-10-21T00:00:00", - "2019-10-22T00:00:00", - "2019-10-23T00:00:00", - "2019-10-24T00:00:00", - "2019-10-25T00:00:00", - "2019-10-28T00:00:00", - "2019-10-29T00:00:00", - "2019-10-30T00:00:00", - "2019-10-31T00:00:00", - "2019-11-01T00:00:00", - "2019-11-04T00:00:00", - "2019-11-05T00:00:00", - "2019-11-06T00:00:00", - "2019-11-07T00:00:00", - "2019-11-08T00:00:00", - "2019-11-11T00:00:00", - "2019-11-12T00:00:00", - "2019-11-13T00:00:00", - "2019-11-14T00:00:00", - "2019-11-15T00:00:00", - "2019-11-18T00:00:00", - "2019-11-19T00:00:00", - "2019-11-20T00:00:00", - "2019-11-21T00:00:00", - "2019-11-22T00:00:00", - "2019-11-25T00:00:00", - "2019-11-26T00:00:00", - "2019-11-27T00:00:00", - "2019-11-28T00:00:00", - "2019-11-29T00:00:00", - "2019-12-02T00:00:00", - "2019-12-03T00:00:00", - "2019-12-04T00:00:00", - "2019-12-05T00:00:00", - "2019-12-06T00:00:00", - "2019-12-09T00:00:00", - "2019-12-10T00:00:00", - "2019-12-11T00:00:00", - "2019-12-12T00:00:00", - "2019-12-13T00:00:00", - "2019-12-16T00:00:00", - "2019-12-17T00:00:00", - "2019-12-18T00:00:00", - "2019-12-19T00:00:00", - "2019-12-20T00:00:00", - "2019-12-23T00:00:00", - "2019-12-24T00:00:00", - "2019-12-26T00:00:00", - "2019-12-27T00:00:00", - "2019-12-30T00:00:00", - "2019-12-31T00:00:00", - "2020-01-01T00:00:00", - "2020-01-02T00:00:00", - "2020-01-06T00:00:00", - "2020-01-07T00:00:00", - "2020-01-08T00:00:00", - "2020-01-09T00:00:00", - "2020-01-10T00:00:00", - "2020-01-13T00:00:00", - "2020-01-14T00:00:00", - "2020-01-15T00:00:00", - "2020-01-16T00:00:00", - "2020-01-17T00:00:00", - "2020-01-21T00:00:00", - "2020-01-22T00:00:00", - "2020-01-23T00:00:00", - "2020-01-24T00:00:00", - "2020-01-27T00:00:00", - "2020-01-28T00:00:00", - "2020-01-29T00:00:00", - "2020-01-30T00:00:00", - "2020-01-31T00:00:00", - "2020-02-03T00:00:00", - "2020-02-04T00:00:00", - "2020-02-05T00:00:00", - "2020-02-06T00:00:00", - "2020-02-07T00:00:00", - "2020-02-10T00:00:00", - "2020-02-11T00:00:00", - "2020-02-12T00:00:00", - "2020-02-13T00:00:00", - "2020-02-14T00:00:00", - "2020-02-18T00:00:00", - "2020-02-19T00:00:00", - "2020-02-20T00:00:00", - "2020-02-21T00:00:00", - "2020-02-24T00:00:00", - "2020-02-25T00:00:00", - "2020-02-26T00:00:00", - "2020-02-27T00:00:00", - "2020-02-28T00:00:00", - "2020-03-02T00:00:00", - "2020-03-03T00:00:00", - "2020-03-04T00:00:00", - "2020-03-05T00:00:00", - "2020-03-06T00:00:00", - "2020-03-09T00:00:00", - "2020-03-10T00:00:00", - "2020-03-11T00:00:00", - "2020-03-12T00:00:00", - "2020-03-13T00:00:00", - "2020-03-16T00:00:00", - "2020-03-17T00:00:00", - "2020-03-18T00:00:00", - "2020-03-19T00:00:00", - "2020-03-20T00:00:00", - "2020-03-23T00:00:00", - "2020-03-24T00:00:00", - "2020-03-25T00:00:00", - "2020-03-26T00:00:00", - "2020-03-27T00:00:00", - "2020-03-30T00:00:00", - "2020-03-31T00:00:00", - "2020-04-01T00:00:00", - "2020-04-02T00:00:00", - "2020-04-03T00:00:00", - "2020-04-06T00:00:00", - "2020-04-07T00:00:00", - "2020-04-08T00:00:00", - "2020-04-09T00:00:00", - "2020-04-13T00:00:00", - "2020-04-14T00:00:00", - "2020-04-15T00:00:00", - "2020-04-16T00:00:00", - "2020-04-17T00:00:00", - "2020-04-20T00:00:00", - "2020-04-21T00:00:00", - "2020-04-22T00:00:00", - "2020-04-23T00:00:00", - "2020-04-24T00:00:00", - "2020-04-27T00:00:00", - "2020-04-28T00:00:00", - "2020-04-29T00:00:00", - "2020-04-30T00:00:00", - "2020-05-01T00:00:00", - "2020-05-04T00:00:00", - "2020-05-05T00:00:00", - "2020-05-06T00:00:00", - "2020-05-07T00:00:00", - "2020-05-08T00:00:00", - "2020-05-11T00:00:00", - "2020-05-12T00:00:00", - "2020-05-13T00:00:00", - "2020-05-14T00:00:00", - "2020-05-15T00:00:00", - "2020-05-18T00:00:00", - "2020-05-19T00:00:00", - "2020-05-20T00:00:00", - "2020-05-21T00:00:00", - "2020-05-22T00:00:00", - "2020-05-26T00:00:00", - "2020-05-27T00:00:00", - "2020-05-28T00:00:00", - "2020-05-29T00:00:00", - "2020-06-01T00:00:00", - "2020-06-02T00:00:00", - "2020-06-03T00:00:00", - "2020-06-04T00:00:00", - "2020-06-05T00:00:00", - "2020-06-08T00:00:00", - "2020-06-09T00:00:00", - "2020-06-10T00:00:00", - "2020-06-11T00:00:00", - "2020-06-12T00:00:00", - "2020-06-15T00:00:00", - "2020-06-16T00:00:00", - "2020-06-17T00:00:00", - "2020-06-18T00:00:00", - "2020-06-19T00:00:00", - "2020-06-22T00:00:00", - "2020-06-23T00:00:00", - "2020-06-24T00:00:00", - "2020-06-25T00:00:00", - "2020-06-26T00:00:00", - "2020-06-29T00:00:00", - "2020-06-30T00:00:00", - "2020-07-01T00:00:00", - "2020-07-02T00:00:00", - "2020-07-06T00:00:00", - "2020-07-07T00:00:00", - "2020-07-08T00:00:00", - "2020-07-09T00:00:00", - "2020-07-10T00:00:00", - "2020-07-13T00:00:00", - "2020-07-14T00:00:00", - "2020-07-15T00:00:00", - "2020-07-16T00:00:00", - "2020-07-17T00:00:00", - "2020-07-20T00:00:00", - "2020-07-21T00:00:00", - "2020-07-22T00:00:00", - "2020-07-23T00:00:00", - "2020-07-24T00:00:00", - "2020-07-27T00:00:00", - "2020-07-28T00:00:00", - "2020-07-29T00:00:00", - "2020-07-30T00:00:00", - "2020-07-31T00:00:00", - "2020-08-03T00:00:00", - "2020-08-04T00:00:00", - "2020-08-05T00:00:00", - "2020-08-06T00:00:00", - "2020-08-07T00:00:00", - "2020-08-10T00:00:00", - "2020-08-11T00:00:00", - "2020-08-12T00:00:00", - "2020-08-13T00:00:00", - "2020-08-14T00:00:00", - "2020-08-17T00:00:00", - "2020-08-18T00:00:00", - "2020-08-19T00:00:00", - "2020-08-20T00:00:00", - "2020-08-21T00:00:00", - "2020-08-24T00:00:00", - "2020-08-25T00:00:00", - "2020-08-26T00:00:00", - "2020-08-27T00:00:00", - "2020-08-28T00:00:00", - "2020-08-31T00:00:00", - "2020-09-01T00:00:00", - "2020-09-02T00:00:00", - "2020-09-03T00:00:00", - "2020-09-04T00:00:00", - "2020-09-08T00:00:00", - "2020-09-09T00:00:00", - "2020-09-10T00:00:00", - "2020-09-11T00:00:00", - "2020-09-14T00:00:00", - "2020-09-15T00:00:00", - "2020-09-16T00:00:00", - "2020-09-17T00:00:00", - "2020-09-18T00:00:00", - "2020-09-21T00:00:00", - "2020-09-22T00:00:00", - "2020-09-23T00:00:00", - "2020-09-24T00:00:00", - "2020-09-25T00:00:00", - "2020-09-28T00:00:00", - "2020-09-29T00:00:00", - "2020-09-30T00:00:00", - "2020-10-01T00:00:00", - "2020-10-02T00:00:00", - "2020-10-05T00:00:00", - "2020-10-06T00:00:00", - "2020-10-07T00:00:00", - "2020-10-08T00:00:00", - "2020-10-09T00:00:00", - "2020-10-12T00:00:00", - "2020-10-13T00:00:00", - "2020-10-14T00:00:00", - "2020-10-15T00:00:00", - "2020-10-16T00:00:00", - "2020-10-19T00:00:00", - "2020-10-20T00:00:00", - "2020-10-21T00:00:00", - "2020-10-22T00:00:00", - "2020-10-23T00:00:00", - "2020-10-26T00:00:00", - "2020-10-27T00:00:00", - "2020-10-28T00:00:00", - "2020-10-29T00:00:00", - "2020-10-30T00:00:00", - "2020-11-02T00:00:00", - "2020-11-03T00:00:00", - "2020-11-04T00:00:00", - "2020-11-05T00:00:00", - "2020-11-06T00:00:00", - "2020-11-09T00:00:00", - "2020-11-10T00:00:00", - "2020-11-11T00:00:00", - "2020-11-12T00:00:00", - "2020-11-13T00:00:00", - "2020-11-16T00:00:00", - "2020-11-17T00:00:00", - "2020-11-18T00:00:00", - "2020-11-19T00:00:00", - "2020-11-20T00:00:00", - "2020-11-23T00:00:00", - "2020-11-24T00:00:00", - "2020-11-25T00:00:00", - "2020-11-27T00:00:00", - "2020-11-30T00:00:00", - "2020-12-01T00:00:00", - "2020-12-02T00:00:00", - "2020-12-03T00:00:00", - "2020-12-04T00:00:00", - "2020-12-07T00:00:00", - "2020-12-08T00:00:00", - "2020-12-09T00:00:00", - "2020-12-10T00:00:00", - "2020-12-11T00:00:00", - "2020-12-14T00:00:00", - "2020-12-15T00:00:00", - "2020-12-16T00:00:00", - "2020-12-17T00:00:00", - "2020-12-18T00:00:00", - "2020-12-21T00:00:00", - "2020-12-22T00:00:00", - "2020-12-23T00:00:00", - "2020-12-24T00:00:00", - "2020-12-28T00:00:00", - "2020-12-29T00:00:00", - "2020-12-30T00:00:00", - "2020-12-31T00:00:00", - "2021-01-01T00:00:00", - "2021-01-04T00:00:00", - "2021-01-06T00:00:00", - "2021-01-07T00:00:00", - "2021-01-08T00:00:00", - "2021-01-11T00:00:00", - "2021-01-12T00:00:00", - "2021-01-13T00:00:00", - "2021-01-14T00:00:00", - "2021-01-15T00:00:00", - "2021-01-19T00:00:00", - "2021-01-20T00:00:00", - "2021-01-21T00:00:00", - "2021-01-22T00:00:00", - "2021-01-25T00:00:00", - "2021-01-26T00:00:00", - "2021-01-27T00:00:00", - "2021-01-28T00:00:00", - "2021-01-29T00:00:00", - "2021-02-01T00:00:00", - "2021-02-02T00:00:00", - "2021-02-03T00:00:00", - "2021-02-04T00:00:00", - "2021-02-05T00:00:00", - "2021-02-08T00:00:00", - "2021-02-09T00:00:00", - "2021-02-10T00:00:00", - "2021-02-11T00:00:00", - "2021-02-12T00:00:00", - "2021-02-16T00:00:00", - "2021-02-17T00:00:00", - "2021-02-18T00:00:00", - "2021-02-19T00:00:00", - "2021-02-22T00:00:00", - "2021-02-23T00:00:00", - "2021-02-24T00:00:00", - "2021-02-25T00:00:00", - "2021-02-26T00:00:00", - "2021-03-01T00:00:00", - "2021-03-02T00:00:00", - "2021-03-03T00:00:00", - "2021-03-04T00:00:00", - "2021-03-05T00:00:00", - "2021-03-08T00:00:00", - "2021-03-09T00:00:00", - "2021-03-10T00:00:00", - "2021-03-11T00:00:00", - "2021-03-12T00:00:00", - "2021-03-15T00:00:00", - "2021-03-16T00:00:00", - "2021-03-17T00:00:00", - "2021-03-18T00:00:00", - "2021-03-19T00:00:00", - "2021-03-22T00:00:00", - "2021-03-23T00:00:00", - "2021-03-24T00:00:00", - "2021-03-25T00:00:00", - "2021-03-26T00:00:00", - "2021-03-29T00:00:00", - "2021-03-30T00:00:00", - "2021-03-31T00:00:00", - "2021-04-01T00:00:00", - "2021-04-05T00:00:00", - "2021-04-06T00:00:00", - "2021-04-07T00:00:00", - "2021-04-08T00:00:00", - "2021-04-09T00:00:00", - "2021-04-12T00:00:00", - "2021-04-13T00:00:00", - "2021-04-14T00:00:00", - "2021-04-15T00:00:00", - "2021-04-16T00:00:00", - "2021-04-19T00:00:00", - "2021-04-20T00:00:00", - "2021-04-21T00:00:00", - "2021-04-22T00:00:00", - "2021-04-23T00:00:00", - "2021-04-26T00:00:00", - "2021-04-27T00:00:00", - "2021-04-28T00:00:00", - "2021-04-29T00:00:00", - "2021-04-30T00:00:00", - "2021-05-03T00:00:00", - "2021-05-04T00:00:00", - "2021-05-05T00:00:00", - "2021-05-06T00:00:00", - "2021-05-07T00:00:00", - "2021-05-10T00:00:00", - "2021-05-11T00:00:00", - "2021-05-12T00:00:00", - "2021-05-13T00:00:00", - "2021-05-14T00:00:00", - "2021-05-17T00:00:00", - "2021-05-18T00:00:00", - "2021-05-19T00:00:00", - "2021-05-20T00:00:00", - "2021-05-21T00:00:00", - "2021-05-24T00:00:00", - "2021-05-25T00:00:00", - "2021-05-26T00:00:00", - "2021-05-27T00:00:00", - "2021-05-28T00:00:00", - "2021-06-01T00:00:00", - "2021-06-02T00:00:00", - "2021-06-03T00:00:00", - "2021-06-04T00:00:00", - "2021-06-07T00:00:00", - "2021-06-08T00:00:00", - "2021-06-09T00:00:00", - "2021-06-10T00:00:00", - "2021-06-11T00:00:00", - "2021-06-14T00:00:00", - "2021-06-15T00:00:00", - "2021-06-16T00:00:00", - "2021-06-17T00:00:00", - "2021-06-18T00:00:00", - "2021-06-21T00:00:00", - "2021-06-22T00:00:00", - "2021-06-23T00:00:00", - "2021-06-24T00:00:00", - "2021-06-25T00:00:00", - "2021-06-28T00:00:00", - "2021-06-29T00:00:00", - "2021-06-30T00:00:00", - "2021-07-01T00:00:00", - "2021-07-02T00:00:00", - "2021-07-05T00:00:00", - "2021-07-06T00:00:00", - "2021-07-07T00:00:00", - "2021-07-08T00:00:00", - "2021-07-09T00:00:00", - "2021-07-12T00:00:00", - "2021-07-13T00:00:00", - "2021-07-14T00:00:00", - "2021-07-15T00:00:00", - "2021-07-16T00:00:00", - "2021-07-19T00:00:00", - "2021-07-20T00:00:00", - "2021-07-21T00:00:00", - "2021-07-22T00:00:00", - "2021-07-23T00:00:00", - "2021-07-26T00:00:00", - "2021-07-27T00:00:00", - "2021-07-28T00:00:00", - "2021-07-29T00:00:00", - "2021-07-30T00:00:00", - "2021-08-02T00:00:00", - "2021-08-03T00:00:00", - "2021-08-04T00:00:00", - "2021-08-05T00:00:00", - "2021-08-06T00:00:00", - "2021-08-09T00:00:00", - "2021-08-10T00:00:00", - "2021-08-11T00:00:00", - "2021-08-12T00:00:00", - "2021-08-13T00:00:00", - "2021-08-16T00:00:00", - "2021-08-17T00:00:00", - "2021-08-18T00:00:00", - "2021-08-19T00:00:00", - "2021-08-20T00:00:00", - "2021-08-23T00:00:00", - "2021-08-24T00:00:00", - "2021-08-25T00:00:00", - "2021-08-26T00:00:00", - "2021-08-27T00:00:00", - "2021-08-30T00:00:00", - "2021-08-31T00:00:00", - "2021-09-01T00:00:00", - "2021-09-02T00:00:00", - "2021-09-03T00:00:00", - "2021-09-07T00:00:00", - "2021-09-08T00:00:00", - "2021-09-09T00:00:00", - "2021-09-10T00:00:00", - "2021-09-13T00:00:00", - "2021-09-14T00:00:00", - "2021-09-15T00:00:00", - "2021-09-16T00:00:00", - "2021-09-17T00:00:00", - "2021-09-20T00:00:00", - "2021-09-21T00:00:00", - "2021-09-22T00:00:00", - "2021-09-23T00:00:00", - "2021-09-24T00:00:00", - "2021-09-27T00:00:00", - "2021-09-28T00:00:00", - "2021-09-29T00:00:00", - "2021-09-30T00:00:00", - "2021-10-01T00:00:00", - "2021-10-04T00:00:00", - "2021-10-05T00:00:00", - "2021-10-06T00:00:00", - "2021-10-07T00:00:00", - "2021-10-08T00:00:00", - "2021-10-11T00:00:00", - "2021-10-12T00:00:00", - "2021-10-13T00:00:00", - "2021-10-14T00:00:00", - "2021-10-15T00:00:00", - "2021-10-18T00:00:00", - "2021-10-19T00:00:00", - "2021-10-20T00:00:00", - "2021-10-21T00:00:00", - "2021-10-22T00:00:00", - "2021-10-25T00:00:00", - "2021-10-26T00:00:00", - "2021-10-27T00:00:00", - "2021-10-28T00:00:00", - "2021-10-29T00:00:00", - "2021-11-01T00:00:00", - "2021-11-02T00:00:00", - "2021-11-03T00:00:00", - "2021-11-04T00:00:00", - "2021-11-05T00:00:00", - "2021-11-08T00:00:00", - "2021-11-09T00:00:00", - "2021-11-10T00:00:00", - "2021-11-11T00:00:00", - "2021-11-12T00:00:00", - "2021-11-15T00:00:00", - "2021-11-16T00:00:00", - "2021-11-17T00:00:00", - "2021-11-18T00:00:00", - "2021-11-19T00:00:00", - "2021-11-22T00:00:00", - "2021-11-23T00:00:00", - "2021-11-24T00:00:00", - "2021-11-25T00:00:00", - "2021-11-26T00:00:00", - "2021-11-29T00:00:00", - "2021-11-30T00:00:00", - "2021-12-01T00:00:00", - "2021-12-02T00:00:00", - "2021-12-03T00:00:00", - "2021-12-06T00:00:00", - "2021-12-07T00:00:00", - "2021-12-08T00:00:00", - "2021-12-09T00:00:00", - "2021-12-10T00:00:00", - "2021-12-13T00:00:00", - "2021-12-14T00:00:00", - "2021-12-15T00:00:00", - "2021-12-16T00:00:00", - "2021-12-17T00:00:00", - "2021-12-20T00:00:00", - "2021-12-21T00:00:00", - "2021-12-22T00:00:00", - "2021-12-23T00:00:00", - "2021-12-27T00:00:00", - "2021-12-28T00:00:00", - "2021-12-29T00:00:00", - "2021-12-30T00:00:00", - "2021-12-31T00:00:00", - "2022-01-03T00:00:00", - "2022-01-05T00:00:00", - "2022-01-06T00:00:00", - "2022-01-07T00:00:00", - "2022-01-10T00:00:00", - "2022-01-11T00:00:00", - "2022-01-12T00:00:00", - "2022-01-13T00:00:00", - "2022-01-14T00:00:00", - "2022-01-18T00:00:00", - "2022-01-19T00:00:00", - "2022-01-20T00:00:00", - "2022-01-21T00:00:00", - "2022-01-24T00:00:00", - "2022-01-25T00:00:00", - "2022-01-26T00:00:00", - "2022-01-27T00:00:00", - "2022-01-28T00:00:00", - "2022-01-31T00:00:00", - "2022-02-01T00:00:00", - "2022-02-02T00:00:00", - "2022-02-03T00:00:00", - "2022-02-04T00:00:00", - "2022-02-07T00:00:00", - "2022-02-08T00:00:00", - "2022-02-09T00:00:00", - "2022-02-10T00:00:00", - "2022-02-11T00:00:00", - "2022-02-14T00:00:00", - "2022-02-15T00:00:00", - "2022-02-16T00:00:00", - "2022-02-17T00:00:00", - "2022-02-18T00:00:00", - "2022-02-22T00:00:00", - "2022-02-23T00:00:00", - "2022-02-24T00:00:00", - "2022-02-25T00:00:00", - "2022-02-28T00:00:00", - "2022-03-01T00:00:00", - "2022-03-02T00:00:00", - "2022-03-03T00:00:00", - "2022-03-04T00:00:00", - "2022-03-07T00:00:00", - "2022-03-08T00:00:00", - "2022-03-09T00:00:00", - "2022-03-10T00:00:00", - "2022-03-11T00:00:00", - "2022-03-14T00:00:00", - "2022-03-15T00:00:00", - "2022-03-16T00:00:00", - "2022-03-17T00:00:00", - "2022-03-18T00:00:00", - "2022-03-21T00:00:00", - "2022-03-22T00:00:00", - "2022-03-23T00:00:00", - "2022-03-24T00:00:00", - "2022-03-25T00:00:00", - "2022-03-28T00:00:00", - "2022-03-29T00:00:00", - "2022-03-30T00:00:00", - "2022-03-31T00:00:00", - "2022-04-01T00:00:00", - "2022-04-04T00:00:00", - "2022-04-05T00:00:00", - "2022-04-06T00:00:00", - "2022-04-07T00:00:00", - "2022-04-08T00:00:00", - "2022-04-11T00:00:00", - "2022-04-12T00:00:00", - "2022-04-13T00:00:00", - "2022-04-14T00:00:00", - "2022-04-18T00:00:00", - "2022-04-19T00:00:00", - "2022-04-20T00:00:00", - "2022-04-21T00:00:00", - "2022-04-22T00:00:00", - "2022-04-25T00:00:00", - "2022-04-26T00:00:00", - "2022-04-27T00:00:00", - "2022-04-28T00:00:00", - "2022-04-29T00:00:00", - "2022-05-03T00:00:00", - "2022-05-04T00:00:00", - "2022-05-05T00:00:00", - "2022-05-06T00:00:00", - "2022-05-09T00:00:00", - "2022-05-10T00:00:00", - "2022-08-01T00:00:00", - "2022-08-02T00:00:00", - "2022-08-03T00:00:00", - "2022-08-04T00:00:00", - "2022-08-05T00:00:00", - "2022-08-08T00:00:00", - "2022-08-09T00:00:00", - "2022-08-10T00:00:00", - "2022-08-11T00:00:00", - "2022-08-12T00:00:00", - "2022-08-15T00:00:00", - "2022-08-16T00:00:00", - "2022-08-17T00:00:00", - "2022-08-18T00:00:00", - "2022-08-19T00:00:00", - "2022-08-22T00:00:00", - "2022-08-23T00:00:00", - "2022-08-24T00:00:00", - "2022-08-25T00:00:00", - "2022-08-26T00:00:00", - "2022-08-29T00:00:00", - "2022-08-30T00:00:00", - "2022-08-31T00:00:00", - "2022-09-01T00:00:00", - "2022-09-02T00:00:00", - "2022-09-06T00:00:00", - "2022-09-07T00:00:00", - "2022-09-14T00:00:00", - "2022-09-15T00:00:00", - "2022-10-27T00:00:00", - "2022-10-28T00:00:00", - "2022-10-31T00:00:00", - "2022-11-01T00:00:00", - "2022-11-02T00:00:00", - "2022-11-03T00:00:00", - "2022-11-04T00:00:00", - "2022-11-14T00:00:00", - "2022-11-15T00:00:00", - "2022-11-16T00:00:00", - "2022-11-17T00:00:00", - "2022-11-18T00:00:00", - "2022-11-21T00:00:00", - "2022-11-22T00:00:00", - "2022-11-23T00:00:00", - "2022-11-25T00:00:00", - "2022-11-28T00:00:00", - "2022-11-29T00:00:00", - "2022-11-30T00:00:00", - "2022-12-01T00:00:00", - "2022-12-02T00:00:00", - "2022-12-05T00:00:00", - "2022-12-06T00:00:00", - "2022-12-07T00:00:00", - "2022-12-08T00:00:00", - "2022-12-09T00:00:00", - "2022-12-12T00:00:00", - "2022-12-13T00:00:00", - "2022-12-14T00:00:00", - "2022-12-15T00:00:00", - "2022-12-16T00:00:00", - "2022-12-19T00:00:00", - "2022-12-20T00:00:00", - "2022-12-21T00:00:00", - "2022-12-22T00:00:00", - "2022-12-23T00:00:00", - "2022-12-27T00:00:00", - "2022-12-28T00:00:00", - "2022-12-29T00:00:00", - "2022-12-30T00:00:00", - "2023-01-02T00:00:00", - "2023-01-03T00:00:00", - "2023-01-05T00:00:00", - "2023-01-06T00:00:00", - "2023-01-09T00:00:00", - "2023-01-10T00:00:00", - "2023-01-11T00:00:00", - "2023-01-12T00:00:00", - "2023-01-13T00:00:00", - "2023-01-17T00:00:00", - "2023-01-18T00:00:00", - "2023-01-19T00:00:00", - "2023-01-20T00:00:00", - "2023-01-23T00:00:00", - "2023-01-24T00:00:00", - "2023-01-25T00:00:00", - "2023-01-26T00:00:00", - "2023-01-27T00:00:00", - "2023-01-30T00:00:00", - "2023-01-31T00:00:00", - "2023-02-01T00:00:00", - "2023-02-02T00:00:00", - "2023-02-03T00:00:00", - "2023-02-06T00:00:00", - "2023-02-07T00:00:00", - "2023-02-08T00:00:00", - "2023-02-09T00:00:00", - "2023-02-10T00:00:00", - "2023-02-13T00:00:00", - "2023-02-14T00:00:00", - "2023-02-15T00:00:00", - "2023-02-16T00:00:00", - "2023-02-17T00:00:00", - "2023-02-21T00:00:00", - "2023-02-22T00:00:00", - "2023-02-23T00:00:00", - "2023-02-24T00:00:00", - "2023-02-27T00:00:00", - "2023-02-28T00:00:00", - "2023-03-01T00:00:00", - "2023-03-02T00:00:00", - "2023-03-03T00:00:00", - "2023-03-06T00:00:00", - "2023-03-07T00:00:00", - "2023-03-08T00:00:00", - "2023-03-09T00:00:00", - "2023-03-10T00:00:00", - "2023-03-13T00:00:00", - "2023-03-14T00:00:00", - "2023-03-15T00:00:00", - "2023-03-16T00:00:00", - "2023-03-17T00:00:00", - "2023-03-20T00:00:00", - "2023-03-21T00:00:00", - "2023-03-22T00:00:00", - "2023-03-23T00:00:00", - "2023-03-24T00:00:00", - "2023-03-27T00:00:00", - "2023-03-28T00:00:00", - "2023-03-29T00:00:00", - "2023-03-30T00:00:00", - "2023-03-31T00:00:00", - "2023-04-03T00:00:00", - "2023-04-04T00:00:00", - "2023-04-05T00:00:00", - "2023-04-06T00:00:00", - "2023-04-07T00:00:00", - "2023-04-10T00:00:00", - "2023-04-11T00:00:00", - "2023-04-12T00:00:00", - "2023-04-13T00:00:00", - "2023-04-14T00:00:00", - "2023-04-17T00:00:00", - "2023-04-18T00:00:00", - "2023-04-19T00:00:00", - "2023-04-20T00:00:00", - "2023-04-21T00:00:00", - "2023-04-24T00:00:00", - "2023-04-25T00:00:00", - "2023-04-26T00:00:00", - "2023-04-27T00:00:00", - "2023-04-28T00:00:00", - "2023-05-01T00:00:00", - "2023-05-02T00:00:00", - "2023-05-03T00:00:00", - "2023-05-04T00:00:00", - "2023-05-05T00:00:00", - "2023-05-08T00:00:00", - "2023-05-09T00:00:00", - "2023-05-10T00:00:00", - "2023-05-11T00:00:00", - "2023-05-12T00:00:00", - "2023-05-15T00:00:00", - "2023-05-16T00:00:00", - "2023-05-17T00:00:00", - "2023-05-18T00:00:00", - "2023-05-19T00:00:00", - "2023-05-22T00:00:00", - "2023-05-23T00:00:00", - "2023-05-24T00:00:00", - "2023-05-25T00:00:00", - "2023-05-26T00:00:00", - "2023-05-30T00:00:00", - "2023-05-31T00:00:00", - "2023-06-01T00:00:00", - "2023-06-02T00:00:00", - "2023-06-05T00:00:00", - "2023-06-06T00:00:00", - "2023-06-07T00:00:00", - "2023-06-08T00:00:00", - "2023-06-09T00:00:00", - "2023-06-12T00:00:00", - "2023-06-13T00:00:00", - "2023-06-14T00:00:00", - "2023-06-15T00:00:00", - "2023-06-16T00:00:00", - "2023-06-19T00:00:00", - "2023-06-20T00:00:00", - "2023-06-21T00:00:00", - "2023-06-22T00:00:00", - "2023-06-23T00:00:00", - "2023-06-26T00:00:00", - "2023-06-27T00:00:00", - "2023-06-28T00:00:00", - "2023-06-29T00:00:00", - "2023-06-30T00:00:00", - "2023-07-03T00:00:00", - "2023-07-05T00:00:00", - "2023-07-06T00:00:00", - "2023-07-07T00:00:00", - "2023-07-10T00:00:00", - "2023-07-11T00:00:00", - "2023-07-12T00:00:00", - "2023-07-13T00:00:00", - "2023-07-14T00:00:00", - "2023-07-17T00:00:00", - "2023-07-18T00:00:00", - "2023-07-19T00:00:00", - "2023-07-20T00:00:00", - "2023-07-21T00:00:00", - "2023-07-24T00:00:00", - "2023-07-25T00:00:00", - "2023-07-26T00:00:00", - "2023-07-27T00:00:00", - "2023-07-28T00:00:00", - "2023-07-31T00:00:00", - "2023-08-01T00:00:00", - "2023-08-02T00:00:00", - "2023-08-03T00:00:00", - "2023-08-04T00:00:00", - "2023-08-07T00:00:00", - "2023-08-08T00:00:00", - "2023-08-09T00:00:00", - "2023-08-10T00:00:00", - "2023-08-11T00:00:00", - "2023-08-14T00:00:00", - "2023-08-15T00:00:00", - "2023-08-16T00:00:00", - "2023-08-17T00:00:00", - "2023-08-18T00:00:00", - "2023-08-21T00:00:00", - "2023-08-22T00:00:00", - "2023-08-23T00:00:00", - "2023-08-24T00:00:00", - "2023-08-25T00:00:00", - "2023-08-28T00:00:00", - "2023-08-29T00:00:00", - "2023-08-30T00:00:00", - "2023-08-31T00:00:00", - "2023-09-01T00:00:00", - "2023-09-05T00:00:00", - "2023-09-06T00:00:00", - "2023-09-07T00:00:00", - "2023-09-08T00:00:00", - "2023-09-11T00:00:00", - "2023-09-12T00:00:00", - "2023-09-13T00:00:00", - "2023-09-14T00:00:00", - "2023-09-15T00:00:00", - "2023-09-18T00:00:00", - "2023-09-19T00:00:00", - "2023-09-20T00:00:00", - "2023-09-21T00:00:00", - "2023-09-22T00:00:00", - "2023-09-25T00:00:00", - "2023-09-26T00:00:00", - "2023-09-27T00:00:00", - "2023-09-28T00:00:00", - "2023-09-29T00:00:00", - "2023-10-02T00:00:00", - "2023-10-03T00:00:00", - "2023-10-04T00:00:00", - "2023-10-05T00:00:00", - "2023-10-06T00:00:00", - "2023-10-09T00:00:00", - "2023-10-10T00:00:00", - "2023-10-11T00:00:00", - "2023-10-12T00:00:00", - "2023-10-13T00:00:00", - "2023-10-16T00:00:00", - "2023-10-17T00:00:00", - "2023-10-18T00:00:00", - "2023-10-19T00:00:00", - "2023-10-20T00:00:00", - "2023-10-23T00:00:00", - "2023-10-24T00:00:00", - "2023-10-25T00:00:00", - "2023-10-26T00:00:00", - "2023-10-27T00:00:00", - "2023-10-30T00:00:00", - "2023-10-31T00:00:00", - "2023-11-01T00:00:00", - "2023-11-02T00:00:00", - "2023-11-03T00:00:00", - "2023-11-06T00:00:00", - "2023-11-07T00:00:00", - "2023-11-08T00:00:00", - "2023-11-09T00:00:00", - "2023-11-10T00:00:00", - "2023-11-13T00:00:00", - "2023-11-14T00:00:00", - "2023-11-15T00:00:00", - "2023-11-16T00:00:00", - "2023-11-17T00:00:00", - "2023-11-20T00:00:00", - "2023-11-21T00:00:00", - "2023-11-22T00:00:00", - "2023-11-23T00:00:00", - "2023-11-24T00:00:00", - "2023-11-27T00:00:00", - "2023-11-28T00:00:00", - "2023-11-29T00:00:00", - "2023-11-30T00:00:00", - "2023-12-01T00:00:00", - "2023-12-04T00:00:00", - "2023-12-05T00:00:00", - "2023-12-06T00:00:00", - "2023-12-07T00:00:00", - "2023-12-08T00:00:00", - "2023-12-11T00:00:00", - "2023-12-12T00:00:00", - "2023-12-13T00:00:00", - "2023-12-14T00:00:00", - "2023-12-15T00:00:00", - "2023-12-18T00:00:00", - "2023-12-19T00:00:00", - "2023-12-20T00:00:00", - "2023-12-21T00:00:00", - "2023-12-22T00:00:00", - "2023-12-25T00:00:00", - "2023-12-26T00:00:00", - "2023-12-27T00:00:00", - "2023-12-28T00:00:00", - "2023-12-29T00:00:00", - "2024-01-01T00:00:00", - "2024-01-02T00:00:00", - "2024-01-04T00:00:00", - "2024-01-05T00:00:00", - "2024-01-08T00:00:00", - "2024-01-09T00:00:00", - "2024-01-10T00:00:00", - "2024-01-11T00:00:00", - "2024-01-12T00:00:00", - "2024-01-15T00:00:00", - "2024-01-16T00:00:00", - "2024-01-17T00:00:00", - "2024-01-18T00:00:00", - "2024-01-19T00:00:00", - "2024-01-22T00:00:00", - "2024-01-23T00:00:00", - "2024-01-24T00:00:00", - "2024-01-25T00:00:00", - "2024-01-26T00:00:00", - "2024-01-29T00:00:00", - "2024-01-30T00:00:00", - "2024-01-31T00:00:00", - "2024-02-01T00:00:00", - "2024-02-02T00:00:00", - "2024-02-05T00:00:00", - "2024-02-06T00:00:00", - "2024-02-07T00:00:00", - "2024-02-08T00:00:00", - "2024-02-09T00:00:00", - "2024-02-12T00:00:00", - "2024-02-13T00:00:00", - "2024-02-14T00:00:00", - "2024-02-15T00:00:00", - "2024-02-16T00:00:00", - "2024-02-20T00:00:00", - "2024-02-21T00:00:00", - "2024-02-22T00:00:00", - "2024-02-23T00:00:00", - "2024-02-26T00:00:00", - "2024-02-27T00:00:00", - "2024-02-28T00:00:00", - "2024-02-29T00:00:00", - "2024-03-01T00:00:00", - "2024-03-04T00:00:00", - "2024-03-05T00:00:00", - "2024-03-06T00:00:00", - "2024-03-07T00:00:00", - "2024-03-08T00:00:00", - "2024-03-11T00:00:00", - "2024-03-12T00:00:00", - "2024-03-13T00:00:00", - "2024-03-14T00:00:00", - "2024-03-15T00:00:00", - "2024-03-18T00:00:00", - "2024-03-19T00:00:00", - "2024-03-20T00:00:00", - "2024-03-21T00:00:00", - "2024-03-22T00:00:00", - "2024-03-25T00:00:00", - "2024-03-26T00:00:00", - "2024-03-27T00:00:00", - "2024-03-28T00:00:00", - "2024-04-01T00:00:00", - "2024-04-02T00:00:00", - "2024-04-03T00:00:00", - "2024-04-04T00:00:00", - "2024-04-05T00:00:00", - "2024-04-08T00:00:00", - "2024-04-09T00:00:00", - "2024-04-10T00:00:00", - "2024-04-11T00:00:00", - "2024-04-12T00:00:00", - "2024-04-15T00:00:00", - "2024-04-16T00:00:00", - "2024-04-17T00:00:00", - "2024-04-18T00:00:00", - "2024-04-19T00:00:00", - "2024-04-22T00:00:00", - "2024-04-23T00:00:00", - "2024-04-24T00:00:00", - "2024-04-25T00:00:00", - "2024-04-26T00:00:00", - "2024-04-29T00:00:00", - "2024-04-30T00:00:00", - "2024-05-01T00:00:00", - "2024-05-02T00:00:00", - "2024-05-03T00:00:00", - "2024-05-06T00:00:00", - "2024-05-07T00:00:00", - "2024-05-08T00:00:00", - "2024-05-09T00:00:00", - "2024-05-10T00:00:00", - "2024-05-13T00:00:00", - "2024-05-14T00:00:00", - "2024-05-15T00:00:00", - "2024-05-16T00:00:00", - "2024-05-17T00:00:00", - "2024-05-20T00:00:00", - "2024-05-21T00:00:00", - "2024-05-22T00:00:00", - "2024-05-23T00:00:00", - "2024-05-24T00:00:00", - "2024-05-28T00:00:00", - "2024-05-29T00:00:00", - "2024-05-30T00:00:00", - "2024-05-31T00:00:00", - "2024-06-03T00:00:00", - "2024-06-04T00:00:00", - "2024-06-05T00:00:00", - "2024-06-06T00:00:00", - "2024-06-07T00:00:00", - "2024-06-10T00:00:00", - "2024-06-11T00:00:00", - "2024-06-12T00:00:00", - "2024-06-13T00:00:00", - "2024-06-14T00:00:00", - "2024-06-17T00:00:00", - "2024-06-18T00:00:00", - "2024-06-20T00:00:00", - "2024-06-21T00:00:00", - "2024-06-24T00:00:00", - "2024-06-25T00:00:00", - "2024-06-26T00:00:00", - "2024-06-27T00:00:00", - "2024-06-28T00:00:00", - "2024-07-01T00:00:00", - "2024-07-02T00:00:00", - "2024-07-03T00:00:00", - "2024-07-05T00:00:00", - "2024-07-08T00:00:00", - "2024-07-09T00:00:00", - "2024-07-10T00:00:00", - "2024-07-11T00:00:00", - "2024-07-12T00:00:00", - "2024-07-15T00:00:00", - "2024-07-16T00:00:00", - "2024-07-17T00:00:00", - "2024-07-18T00:00:00", - "2024-07-19T00:00:00", - "2024-07-22T00:00:00", - "2024-07-23T00:00:00", - "2024-07-24T00:00:00", - "2024-07-25T00:00:00", - "2024-07-26T00:00:00", - "2024-07-29T00:00:00", - "2024-07-30T00:00:00", - "2024-07-31T00:00:00", - "2024-08-01T00:00:00", - "2024-08-02T00:00:00", - "2024-08-05T00:00:00", - "2024-08-06T00:00:00", - "2024-08-07T00:00:00", - "2024-08-08T00:00:00", - "2024-08-09T00:00:00", - "2024-08-12T00:00:00", - "2024-08-13T00:00:00", - "2024-08-14T00:00:00", - "2024-08-15T00:00:00", - "2024-08-16T00:00:00", - "2024-08-19T00:00:00", - "2024-08-20T00:00:00", - "2024-08-21T00:00:00", - "2024-08-22T00:00:00", - "2024-08-23T00:00:00", - "2024-08-26T00:00:00", - "2024-08-27T00:00:00", - "2024-08-28T00:00:00", - "2024-08-29T00:00:00", - "2024-08-30T00:00:00", - "2024-09-03T00:00:00", - "2024-09-04T00:00:00", - "2024-09-05T00:00:00", - "2024-09-06T00:00:00", - "2024-09-09T00:00:00", - "2024-09-10T00:00:00", - "2024-09-11T00:00:00", - "2024-09-12T00:00:00", - "2024-09-13T00:00:00", - "2024-09-16T00:00:00", - "2024-09-17T00:00:00", - "2024-09-18T00:00:00", - "2024-09-19T00:00:00", - "2024-09-20T00:00:00", - "2024-09-23T00:00:00", - "2024-09-24T00:00:00", - "2024-09-25T00:00:00", - "2024-09-26T00:00:00", - "2024-09-27T00:00:00", - "2024-09-30T00:00:00", - "2024-10-01T00:00:00", - "2024-10-02T00:00:00", - "2024-10-03T00:00:00", - "2024-10-04T00:00:00", - "2024-10-07T00:00:00", - "2024-10-08T00:00:00", - "2024-10-09T00:00:00", - "2024-10-10T00:00:00", - "2024-10-11T00:00:00", - "2024-10-14T00:00:00", - "2024-10-15T00:00:00", - "2024-10-16T00:00:00", - "2024-10-17T00:00:00", - "2024-10-18T00:00:00", - "2024-10-21T00:00:00", - "2024-10-22T00:00:00", - "2024-10-23T00:00:00", - "2024-10-24T00:00:00", - "2024-10-25T00:00:00", - "2024-10-28T00:00:00", - "2024-10-29T00:00:00", - "2024-10-30T00:00:00", - "2024-10-31T00:00:00", - "2024-11-01T00:00:00", - "2024-11-04T00:00:00", - "2024-11-05T00:00:00", - "2024-11-06T00:00:00", - "2024-11-07T00:00:00", - "2024-11-08T00:00:00", - "2024-11-11T00:00:00", - "2024-11-12T00:00:00", - "2024-11-13T00:00:00", - "2024-11-14T00:00:00", - "2024-11-15T00:00:00", - "2024-11-18T00:00:00", - "2024-11-19T00:00:00", - "2024-11-20T00:00:00", - "2024-11-21T00:00:00", - "2024-11-22T00:00:00", - "2024-11-25T00:00:00", - "2024-11-26T00:00:00", - "2024-11-27T00:00:00", - "2024-11-28T00:00:00", - "2024-11-29T00:00:00", - "2024-12-02T00:00:00", - "2024-12-03T00:00:00", - "2024-12-04T00:00:00", - "2024-12-05T00:00:00", - "2024-12-06T00:00:00", - "2024-12-09T00:00:00", - "2024-12-10T00:00:00", - "2024-12-11T00:00:00", - "2024-12-12T00:00:00", - "2024-12-13T00:00:00", - "2024-12-16T00:00:00", - "2024-12-17T00:00:00", - "2024-12-18T00:00:00", - "2024-12-19T00:00:00", - "2024-12-20T00:00:00", - "2024-12-23T00:00:00", - "2024-12-24T00:00:00", - "2024-12-25T00:00:00", - "2024-12-26T00:00:00", - "2024-12-27T00:00:00", - "2024-12-30T00:00:00", - "2024-12-31T00:00:00", - "2025-01-01T00:00:00", - "2025-01-02T00:00:00", - "2025-01-06T00:00:00", - "2025-01-07T00:00:00", - "2025-01-08T00:00:00", - "2025-01-09T00:00:00", - "2025-01-10T00:00:00", - "2025-01-13T00:00:00", - "2025-01-14T00:00:00", - "2025-01-15T00:00:00", - "2025-01-16T00:00:00", - "2025-01-17T00:00:00", - "2025-01-21T00:00:00", - "2025-01-22T00:00:00", - "2025-01-23T00:00:00", - "2025-01-24T00:00:00", - "2025-01-27T00:00:00", - "2025-01-28T00:00:00", - "2025-01-29T00:00:00", - "2025-01-30T00:00:00", - "2025-01-31T00:00:00", - "2025-02-03T00:00:00", - "2025-02-04T00:00:00", - "2025-02-05T00:00:00", - "2025-02-06T00:00:00", - "2025-02-07T00:00:00", - "2025-02-10T00:00:00", - "2025-02-11T00:00:00", - "2025-02-12T00:00:00", - "2025-02-13T00:00:00", - "2025-02-14T00:00:00", - "2025-02-18T00:00:00", - "2025-02-19T00:00:00", - "2025-02-20T00:00:00", - "2025-02-21T00:00:00", - "2025-02-24T00:00:00", - "2025-02-25T00:00:00", - "2025-02-26T00:00:00", - "2025-02-27T00:00:00", - "2025-02-28T00:00:00", - "2025-03-03T00:00:00" - ], - "xaxis": "x", - "y": [ - 0, - -0.003178500959344799, - 0, - 0, - -0.01706173157036117, - -0.04229626863725455, - -0.031707658966048324, - -0.01604740213924094, - -0.07682166181787742, - -0.09463427621803766, - -0.0081654497639021, - -0.03196508178189372, - -0.03561322668971889, - 0, - 0, - 0, - -0.009916107463663892, - -0.02899956570511608, - -0.01612342338500694, - -0.00816236764945566, - -0.014623514333381382, - 0, - 0, - 0, - -0.006568583372833059, - -0.01633321164727619, - -0.02596713392743144, - -0.04096539929540011, - -0.010749915780367991, - -0.0258348131680618, - -0.028243293738100417, - 0, - -0.0032340527916556727, - -0.05214138103527499, - -0.06345753160203427, - -0.048224251992935674, - -0.06473620257708235, - -0.049394113827918695, - -0.08149281014709087, - -0.09835822685716411, - -0.0922649150135244, - -0.08987111393209479, - -0.11918429626560312, - -0.09285248436987537, - -0.11792702955038359, - -0.08511019290678223, - -0.07294533104751633, - -0.06541573855501936, - -0.06411002887423911, - -0.05283740196350628, - -0.023088983069737945, - -0.06484993102668102, - -0.059169674654633075, - -0.07080590716058566, - -0.058945710893501646, - -0.049501077535860305, - -0.015269722071414416, - -0.0051287102173570576, - -0.0009367733309841864, - 0, - 0, - -0.023303273472981556, - -0.05203914897354944, - -0.05521880808295765, - -0.05852650715650387, - -0.04021679228487551, - -0.061882767182062204, - -0.07208328432499778, - -0.08232648145597876, - -0.03539983459967211, - -0.05900186798897389, - -0.06299244687125227, - -0.048139811031329915, - -0.034439534868642596, - -0.02708006261146878, - 0, - -0.01248743269496111, - 0, - 0, - 0, - -0.013025134773743785, - 0, - -0.03173990678177152, - -0.016441606069562353, - -0.014525936333670941, - -0.009320540506918995, - 0, - 0, - 0, - 0, - 0, - -0.07859072763526143, - -0.03582478329803129, - -0.011487009578724061, - -0.008532208028032118, - -0.011643252300435059, - 0, - 0, - 0, - -0.000242639316334059, - 0, - 0, - 0, - -0.00112673653604356, - 0, - 0, - 0, - 0, - -0.09430334120636841, - -0.11055012723184121, - -0.08579950354773302, - -0.08229837130232676, - -0.09590894227535296, - -0.10349176310036867, - -0.08786700534569747, - -0.09392437588755542, - -0.06452613499369597, - -0.06615971537065679, - -0.06490084863212908, - -0.07885205413440377, - -0.13176888774335127, - -0.10314077708953251, - -0.14229356980506724, - -0.14022014223572699, - -0.18558946884728933, - -0.1941349524723558, - -0.21503214033192053, - -0.1972747142202138, - -0.16657317599705457, - -0.14554394973581952, - -0.1090812449092794, - -0.10728921108149236, - -0.10252032767200991, - -0.08667908554585857, - -0.03282920953070778, - -0.026564496231915702, - -0.02225472892707281, - -0.005148951480015818, - 0, - -0.04560915538484822, - -0.00830975287897584, - -0.04739041728839399, - -0.09070069561054028, - -0.09604935616464627, - -0.08857588525343008, - -0.0889696267932053, - -0.029987822052724655, - -0.05236591284065384, - 0, - 0, - -0.06671049232748771, - -0.10490080937150537, - -0.11631354403196681, - -0.032166438971029554, - -0.08565439093095473, - -0.09992043154126062, - -0.11982886503023982, - -0.1392533663074682, - -0.17299419551566375, - -0.13523404043764697, - -0.1263619498888784, - -0.13967008571203132, - -0.14502022516416735, - -0.11515085364997968, - -0.12430523798893667, - -0.08510672883710424, - -0.06210650621749347, - -0.06470092057493648, - -0.11125251083309706, - -0.11305381406572568, - -0.10090670780857591, - -0.11038371362203325, - -0.07516420265570944, - -0.031543090790930095, - -0.061318364375055, - -0.0818854833744731, - -0.02177026149876593, - -0.0035555907509152718, - -0.008494900735102728, - -0.019853865149814354, - -0.03564887483890966, - -0.10541576869968095, - -0.1103895164315668, - -0.0607587619682719, - -0.11564474031769945, - -0.10381528625267467, - -0.07135150038104454, - -0.07089445329216781, - -0.06342038913290204, - -0.0664449654563467, - -0.036804117486595955, - 0, - -0.04342497926892208, - -0.06358421622024801, - 0, - -0.035883605944259656, - -0.03581906708464844, - 0, - -0.02709651797696111, - -0.0039054536576290655, - 0, - -0.08444015124634907, - -0.08981546595524625, - -0.022686535753433823, - -0.11856714928190781, - -0.055813475238499, - -0.05206325567415182, - -0.012185920973260767, - -0.024499141876200503, - -0.0384999615830961, - -0.018698329862798624, - 0, - 0, - -0.015230598310371657, - -0.0022668100973002314, - -0.17693898678278297, - 0, - -0.017286326376695582, - -0.03834190726051079, - -0.06876215159689925, - -0.032078915779488515, - -0.045320669196505015, - -0.038772485452883254, - 0, - -0.012039351351960215, - -0.0370363789727467, - -0.008992192589098558, - -0.005860294067271843, - -0.07095138653989308, - -0.09137422290845243, - -0.08552721844375122, - -0.1157506345973387, - -0.13585194526213606, - -0.12138328859286551, - -0.09955526581527485, - -0.10250853894612111, - -0.08996903649942001, - -0.10459265704695642, - -0.1244915256019784, - -0.10761034218645704, - -0.10947077110624703, - -0.07000646805936361, - -0.10579009561103414, - -0.11504748812422716, - -0.11209421499337946, - -0.10614003529409055, - -0.10247226059933034, - -0.12143931380201933, - -0.13090645952388769, - -0.14417358439554628, - -0.14417358439554628, - -0.09026709311076964, - -0.09133828192058224, - -0.07508337134152498, - -0.04977810761954893, - -0.04239456041977563, - -0.028223612735468695, - -0.004228268547336933, - 0, - -0.000733793317321707, - -0.021536916932953787, - 0, - -0.1013484163277778, - -0.021363505617397527, - 0, - 0, - 0, - -0.006895434720490368, - 0, - 0, - -0.016111554861002686, - -0.013670410185092963, - -0.06649678097177503, - -0.05023875743021766, - -0.06639913518473872, - -0.07386903789302146, - -0.07797016094854947, - -0.11178627741809166, - -0.0865055741518932, - -0.07317692422142752, - -0.06580466730018042, - -0.028216898038396776, - -0.010445364797775025, - 0, - 0, - -0.00810257550677318, - -0.0012129604052055765, - 0, - 0, - 0, - -0.013265428030688864, - -0.05487497206939762, - -0.019468685742882186, - 0, - 0, - -0.01858545656379096, - -0.0450271051229435, - -0.02172029118678276, - -0.03490534628214148, - -0.023269911581421443, - -0.009985350517301539, - -0.033655623540185364, - -0.03612138628030781, - -0.06369884448547203, - -0.046888861724498354, - -0.020083754078622618, - -0.07362826707611514, - -0.1792131317693625, - -0.05145726278596685, - -0.05789490139785258, - -0.15948171613713846, - -0.04262961975545543, - -0.18537817606620532, - -0.153121182119473, - -0.14094530271422756, - -0.13313093234966733, - -0.18047147839543476, - -0.17406551199192888, - -0.1285422613797802, - -0.1181232138107553, - -0.0706009382216255, - -0.09000056697550529, - -0.10278261551152279, - -0.02650163968537711, - -0.04164685257640033, - -0.0572392080865437, - -0.0606466370245784, - -0.09399400823148218, - -0.15259754666740055, - -0.1168422590109528, - -0.10184436307706746, - -0.09206573053413736, - -0.09283808109342473, - -0.08211603803507472, - -0.0880035046521529, - -0.11735282590509555, - -0.0802933117429373, - -0.04939928937141902, - -0.04907416409426435, - -0.035807907428847874, - -0.023314001322719102, - -0.05728912895195837, - -0.04917144340744195, - -0.06748436762106891, - -0.06339545289542758, - -0.06343278726174628, - -0.07230519422552462, - -0.05908436994594857, - -0.06647478190874012, - -0.030368539115744664, - -0.024933953507056628, - -0.01684698882745339, - -0.01729513643681657, - -0.027244828935878984, - -0.019385026185478882, - -0.01093460241915123, - 0, - 0, - 0, - 0, - -0.016273281292857433, - -0.025390351474143258, - -0.021889649360256946, - -0.006385482665565156, - 0, - 0, - -0.013821647186826658, - -0.010262948889677381, - -0.006879739727528644, - 0, - -0.014826714715680867, - -0.032800776196649006, - -0.10462745290664377, - -0.07245833789960321, - -0.09120504003246843, - -0.07119771367808747, - -0.057330847241412686, - -0.07099438719074613, - -0.09555622686157128, - -0.06965243237429375, - -0.044521278538912634, - -0.017438190425055677, - -0.029922436747809922, - -0.024807891878558697, - -0.01492622459377324, - -0.03338826964436048, - -0.020253378562114288, - -0.057218133960757256, - -0.06970238028351139, - -0.08836775182143974, - -0.09833074970116207, - -0.0976801049416699, - -0.10677007446739639, - -0.08801523927503796, - -0.13690340613116592, - -0.1509817321146757, - -0.20838088869770288, - -0.21893759992046147, - -0.1966042185508965, - -0.17708487576613474, - -0.16854516329780156, - -0.1526642327902159, - -0.13120922184596495, - -0.14277172256153914, - -0.13729682489937012, - -0.15801986048919225, - -0.1526765968397079, - -0.15268472989920134, - -0.16555513630435303, - -0.19070246495481236, - -0.2043667858734305, - -0.19289059068051262, - -0.18730512106424224, - -0.1506250227478788, - -0.14494647934602067, - -0.13141637513394977, - -0.14625920870986175, - -0.10060646993301181, - -0.09464592538362426, - -0.08488625399124428, - -0.08179569138365661, - null, - -0.11192867680763174, - -0.1444609147822351, - -0.14254964580122886, - -0.13657184707339498, - -0.13705983064301352, - -0.11607653714939459, - -0.08086038954188524, - -0.09488991716843431, - -0.09366995824438695, - -0.158124454731569, - -0.12799146930759409, - -0.11953308743419666, - -0.11660518601648262, - -0.14486756775691867, - -0.09419860711147465, - -0.10302297666208604, - -0.09172275863265378, - -0.07232541174029694, - -0.0731712499276369, - -0.04137593208128276, - -0.021653262809177898, - -0.061619117160978454, - -0.07245385407637528, - -0.07129895962827715, - -0.16900140332550395, - -0.15794044241413974, - -0.26153122118476835, - -0.31419278140615814, - -0.20161530353000545, - -0.22250913336919498, - -0.21026425928391812, - -0.19499037355484183, - -0.21263911265606295, - -0.21052451718771392, - -0.2091418970737945, - -0.20628049765218914, - -0.21393370663571276, - -0.1878128471517163, - -0.22153867327565568, - -0.22116459188172977, - -0.23245582038870627, - -0.22379411202796817, - -0.2270066705279603, - -0.23945025155324595, - -0.23432642407224602, - -0.23196783681908728, - -0.22590870749631742, - -0.2239974385153095, - -0.22818596415453962, - -0.24817986689468097, - -0.2366309224136972, - -0.23158842552763337, - -0.2540798144246156, - -0.23842367489933736, - -0.24029427858287755, - -0.24227061203983435, - -0.24259593441958005, - -0.2626295590430233, - -0.24652610124559493, - -0.2421342491190236, - -0.2525701734627025, - -0.24557574229816304, - -0.24590106467790862, - -0.24183453493108298, - -0.2422411879057662, - -0.24638904824752783, - -0.24337981623487714, - -0.2429324979627262, - -0.24240384909563906, - -0.23955727827286133, - -0.23573474031084563, - -0.2435424774247501, - -0.25049624329182163, - -0.25374946708928214, - -0.25277349995004406, - -0.2594182095563563, - -0.26113428510951675, - -0.2598573947690136, - -0.2535217414234596, - -0.2613537290136071, - -0.26052415694525477, - -0.25969458487690233, - -0.25969458487690233, - -0.2631206196696628, - -0.2632686413524472, - -0.2641226125992806, - -0.26383795551700284, - -0.2624146701056139, - -0.263167791414726, - -0.2629237996299165, - -0.262679807845107, - -0.26170384070586883, - -0.26121585713624984, - -0.25096820217424987, - -0.26072787356663074, - -0.26097186535144035, - -0.25999589821220226, - -0.25365211180715463, - -0.2600912972544177, - -0.2537475108493701, - -0.24667174908989387, - -0.24349985588737022, - -0.24911166693798925, - -0.24569578195065578, - -0.24921571883200266, - -0.24360390778138363, - -0.24409189135100262, - -0.24539318086998674, - -0.24222128766746298, - -0.24235695246699085, - -0.24125898943534785, - -0.23918505926446698, - -0.24113699354294316, - -0.23942905104927648, - -0.23564717838472882, - -0.23576917427713373, - -0.2296693796568955, - -0.2294253878720861, - -0.2294253878720861, - -0.23061755020309616, - -0.2339521045954931, - -0.23688000601320724, - -0.23858794850687404, - -0.2412718581397787, - -0.2495675788233025, - -0.2550980592789851, - -0.2558300346334137, - -0.2554388335331962, - -0.25928577067369296, - -0.2546905920597802, - -0.2528118553167469, - -0.23935390693228686, - -0.24551063296898057, - -0.2629352332016217, - -0.2574893365646732, - -0.262499301212762, - -0.25742752531252155, - -0.25826523044036753, - -0.2549144099289835, - -0.25412224993430177, - -0.24647717401027003, - -0.25208898506088906, - -0.2515438234204962, - -0.2503238644964486, - -0.2548230219567983, - -0.2585642293238778, - -0.25759918494452416, - -0.26317033069767504, - -0.26146238820400847, - -0.2640243019445083, - -0.2582904950014845, - -0.2615030535014765, - -0.2568265442926274, - null, - -0.25683065454558607, - -0.24727791769985885, - -0.24678993413023986, - -0.24235741670620015, - -0.2462612852631525, - -0.24727791769985885, - -0.24996182733276373, - -0.24284540027581913, - -0.2466272729403668, - -0.2373555851176049, - -0.24272099822645243, - -0.2378248964112747, - -0.2546277973251573, - -0.26224847407070795, - -0.2604592009821046, - -0.2797345519820571, - -0.2828088484706571, - -0.27443216672279047, - -0.2677477345995457, - -0.26758507340967264, - -0.27539281052357745, - -0.271488941966625, - -0.26900835882106156, - -0.27319688446029167, - -0.2747421657640853, - -0.2524575827514821, - -0.28161460103622016, - -0.27730407950458535, - -0.2855184695931726, - -0.2851931472134267, - -0.28092329097925983, - -0.27904503252748714, - -0.27697110235660627, - -0.27013933238193955, - -0.2799396690717888, - -0.267943406318654, - -0.27299089072943405, - -0.26636244724210867, - -0.2903136488108399, - -0.2712653324070877, - -0.26211564047673064, - -0.2650086723222853, - -0.260332163113436, - -0.25882754710711076, - -0.26374804810076935, - -0.27179977699948354, - -0.26541532529696776, - -0.26472401524000755, - -0.26289407685393595, - -0.2630173330055746, - -0.25862601574937827, - -0.2582600280721641, - -0.25833228532840724, - -0.252232490708169, - -0.25459107796132796, - -0.2506058788094391, - -0.23917893022085956, - -0.23869094665124058, - -0.25305659022929405, - -0.24232095169767498, - -0.23565184291288144, - -0.24740411388120676, - -0.23731912010907974, - -0.2508876490372034, - -0.23096165327775886, - -0.24145017688111592, - -0.23678993379125424, - -0.23566919819302945, - -0.24490510055401882, - -0.267262881102065, - -0.23569034414771284, - -0.2844269714968254, - -0.2893868191200265, - -0.3694567898350182, - -0.3510354100818993, - -0.376573216891963, - -0.33643673563117416, - -0.33862173489937764, - -0.35962942757147753, - -0.3472915763196094, - -0.34559176688543625, - -0.35874292408666963, - -0.34774702765125365, - -0.3160850270424713, - -0.3362794137652062, - -0.334677201044957, - -0.33550997171193353, - -0.3415121696182477, - -0.3107448055537668, - -0.3498485555992398, - -0.3189103972853923, - -0.34019083569447484, - -0.3282751351630072, - -0.3357168845996976, - -0.3382381330427294, - -0.3174988313339199, - -0.3253878990427611, - -0.32031540302231687, - -0.31803814636409466, - -0.32214534140838835, - -0.3088884544337376, - -0.31856679523118203, - -0.3264232938989563, - -0.34077814390524985, - -0.33549165523437685, - -0.3355323205318451, - -0.3416825575674566, - -0.35949395785855165, - -0.3516455554471787, - -0.3530688408585676, - -0.3387546561497423, - -0.3507915842003454, - -0.34147923108011524, - -0.3545083923889438, - -0.35568768601552325, - -0.35312577227502306, - -0.3404607469095746, - -0.32805783118175713, - -0.32679720696024117, - -0.34879713289056646, - -0.3437139707070349, - -0.337004196624773, - -0.3289524677260587, - -0.32069741234000304, - -0.32236468953620145, - -0.312686348738757, - -0.3165902172957096, - -0.3046346198400428, - -0.31036842678306653, - -0.3083758272071221, - -0.30662721941598725, - -0.3041466362704236, - -0.3082538313147173, - -0.28596924830211423, - -0.2983721640299317, - -0.296826882726138, - -0.2893851332894476, - -0.30036476360587616, - -0.270882422941392, - -0.2590894866755985, - -0.2680765174160825, - -0.27141107180847934, - -0.2758630717951336, - -0.29107189304826053, - -0.2658187433204747, - -0.25821433269391114, - -0.3009535603330461, - -0.2836708089090383, - -0.25894630804833996, - -0.23511644373194307, - -0.2575636879344193, - -0.27111879278299533, - -0.27579530199184443, - -0.24684161019444772, - -0.23623946184957612, - -0.2534408826786477, - -0.2536135627294368, - -0.2800785383217764, - -0.3158233347963716, - -0.28194914200531607, - -0.2788179141002606, - -0.25087272168007646, - -0.2574442337509464, - -0.26746818640918835, - -0.2671835293269107, - -0.1851190337496177, - -0.2443927713393449, - -0.2622274369109331, - -0.22870296567810444, - -0.25886149142355563, - -0.2029711065831874, - -0.1966057491799157, - -0.17682614849135714, - -0.18425163180906012, - -0.1583277380783108, - -0.1573517709390726, - -0.18688904807546025, - -0.19371268499063354, - -0.18830420042735563, - -0.18830420042735563, - -0.14991046229881588, - -0.15515285721105454, - -0.16601049163507875, - -0.15926005225534834, - -0.1453055660849476, - -0.13986000333290483, - -0.0986497908785765, - -0.11777224146013254, - -0.13324945367654983, - -0.12217997944578562, - -0.10191965496117183, - -0.09136667121393816, - -0.1022243056379617, - -0.09539789541672083, - -0.10909452113717322, - -0.15156316408209458, - -0.0903618913923725, - -0.13997508030283834, - -0.10766856587350093, - -0.13961022705980897, - -0.13103798235350084, - -0.1002647676901155, - -0.09135097336255471, - -0.10865603415199687, - -0.08352488031661587, - -0.031504165860051114, - -0.011286036880705841, - -0.036866467484137244, - -0.007105351756306888, - 0, - 0, - 0, - 0, - -0.09350606910311698, - -0.16851783746212134, - -0.18198386358632812, - -0.16642952325034543, - -0.23874280364568612, - -0.13501119598835876, - -0.14695249414569733, - -0.23930638989059339, - -0.12213493227389138, - -0.14352215023586734, - -0.03858076055240789, - -0.20348511653398016, - -0.15102522331748436, - -0.15725416053536578, - -0.31837120251558404, - -0.03193586080474409, - -0.4138093182200906, - -0.2757612675501486, - -0.27834306918011054, - -0.2828409127827558, - -0.21752603583352503, - -0.27897372644765495, - -0.03348844491765157, - -0.13587335879919382, - 0, - -0.10739980133832161, - 0, - -0.05362009989328953, - -0.1374899125561322, - -0.06255563320455093, - -0.1224478564800322, - -0.04178655577837709, - -0.049473184433777795, - -0.039019645463460595, - 0, - -0.007675070625001834, - 0, - -0.07184675291527742, - 0, - -0.0013734650152378292, - -0.0032589324124000507, - -0.004600975747707348, - -0.07529103911435697, - -0.030851921079865563, - 0, - 0, - -0.109170302942453, - -0.08862019347434102, - -0.07363632432727707, - -0.14287698044213415, - -0.10978877408923726, - -0.1641580103564444, - -0.0858089609889624, - -0.06867767838108063, - -0.049617522130218084, - -0.02670065086295792, - -0.08967225853542382, - -0.1007239681515244, - -0.07685660435066521, - -0.021756447637258147, - 0, - -0.07591716207470478, - -0.013479925363509726, - -0.07910180074243733, - -0.08315071605308766, - -0.09085353054652112, - -0.17748550508965344, - -0.12914540644175976, - -0.12003534699279528, - -0.13450281267597552, - -0.05525270202238164, - -0.10616040550141848, - -0.17509071981445012, - -0.0888992221912891, - -0.09492321814128313, - -0.05798921018558745, - -0.02613339530797798, - -0.12956722028430723, - -0.1275008729812933, - -0.0026263995589057565, - 0, - 0, - -0.0027346496199132098, - 0, - -0.009419267151761113, - -0.05584078264644077, - -0.1259573004577469, - -0.02395043870214042, - -0.10597831676813962, - -0.08437736061831902, - -0.05534077252326319, - -0.06290152956436124, - 0, - 0, - -0.01798170657791054, - 0, - 0, - 0, - -0.08959945155670423, - -0.05746088192356236, - -0.06704048683765995, - -0.07293034264620846, - -0.08769499245786794, - 0, - -0.07048995894744814, - -0.0381806361520064, - -0.1036629507519683, - -0.06524035822159646, - -0.11957132239860713, - -0.047859359911539, - -0.032605958780775324, - -0.0014245813223996429, - 0, - 0, - 0, - -0.055629481049263574, - -0.048844408311742415, - -0.11338216840146886, - -0.06020108656111056, - -0.15530968592994787, - -0.040889344179297016, - -0.08501401763226057, - -0.06366056910223639, - 0, - 0, - 0, - -0.026708731277400588, - 0, - -0.021560447265153826, - -0.03330724823817144, - 0, - -0.04049302954421341, - -0.059775241523121414, - 0, - -0.10538994256379763, - 0, - -0.0023265221582597917, - -0.17521156730356124, - -0.1735896797918245, - -0.14464800442793602, - -0.1919511023520556, - -0.22708281693623966, - -0.20233398305728345, - -0.1809962924186429, - -0.23145923649408284, - -0.19830713037710668, - -0.3116722904566951, - -0.2553310671814569, - -0.22456267270849184, - -0.29041559972828856, - -0.24959164497062825, - -0.19142213800726282, - -0.1943381347756673, - -0.19638627536299968, - -0.16473845329321457, - -0.07192412758142785, - -0.16816359235451606, - -0.09333124671455373, - -0.11560906899657808, - -0.08542678738736631, - -0.0554853288840601, - -0.09576542710157976, - 0, - -0.029423771407085852, - -0.03938721190082384, - -0.060965806955293744, - -0.0731619048519645, - -0.09779526642292524, - -0.09403135016963371, - -0.13442087587829143, - -0.18307894253384327, - -0.15420795372759866, - -0.17989785108621958, - -0.12516312478622715, - -0.19825932357371678, - -0.162973733721819, - -0.24021568706740648, - -0.31395499459521026, - -0.24298794510154575, - -0.09245915716330444, - -0.07135370639635275, - -0.03601183469688363, - -0.10158933194278363, - -0.17081854239964311, - -0.19831277197146746, - -0.18835078098120117, - -0.20825375756784537, - -0.1802785273641817, - -0.20142959598094223, - -0.2423419406335977, - -0.3157367256219512, - -0.1846642738951415, - -0.23224569037781362, - -0.24452862886880145, - -0.13699586575961786, - -0.19760197408343572, - -0.14391387835185632, - -0.1709067243323703, - -0.15659107276789175, - -0.12095595810369808, - -0.13534078761296064, - -0.16970116888116882, - -0.1320678234881455, - -0.19549442300162567, - -0.15666673280516374, - -0.21481065338034822, - -0.12461465255129389, - -0.17323032095295543, - -0.16244852521983766, - -0.12394238939353042, - -0.2528881295616786, - -0.11341224263921257, - -0.1354668055695213, - -0.19483952320209186, - -0.17034397064691786, - -0.17080333403285475, - -0.16623702938469198, - -0.13264608178792647, - -0.06469475292295013, - -0.06469475292295013, - -0.1549483676452812, - -0.16414682977807804, - -0.12925818061603533, - -0.10562124540808415, - -0.13366044781260478, - -0.11893785129327294, - -0.11115164190161197, - -0.12373222964844077, - -0.12026403608460334, - -0.12297428006164057, - -0.11344447896744625, - -0.10309731869917593, - -0.0639300781961828, - -0.078767974925389, - -0.1588993239685308, - -0.12403364297578412, - -0.09293474174773886, - -0.12432074509199809, - -0.1150186365267366, - -0.08764057872479247, - -0.07175257729533069, - -0.12315534018187257, - -0.09767215634692294, - -0.09616865998474466, - -0.09768455915834473, - -0.11685149643663362, - -0.12040007859300983, - -0.10352490524716551, - -0.11106994886120958, - -0.12120809878887828, - -0.12467629235271149, - -0.13026519223271182, - -0.16189236135458973, - -0.18648608068257033, - -0.09488902152640188, - -0.22488885974704542, - -0.227461294708299, - -0.21551784667389517, - -0.24832787651456578, - -0.28456016358047675, - -0.2650716719320283, - -0.313936452111254, - -0.3575060457611825, - -0.31779090748740146, - -0.31587306535110715, - -0.30887925780019176, - -0.3031349356254234, - -0.31225664339100423, - -0.30996753586833736, - -0.32042568499927837, - -0.34046541271085295, - -0.3388806090293649, - -0.33111944941532767, - -0.35821965159877145, - -0.3765542529764869, - -0.37328128885167355, - -0.3950248060923719, - -0.4218842737733832, - -0.37497178798439734, - -0.35664268463391924, - -0.22311985060517292, - -0.3359624663610076, - -0.35046879994123115, - -0.3331204555682601, - -0.32205954663874015, - -0.3588368562307447, - -0.2906788138420955, - -0.22089503508210573, - -0.28947798860274854, - -0.2665850791982822, - -0.269264686289847, - -0.25794944342070736, - -0.19727516596655637, - -0.3495170418170277, - -0.28987467512739273, - -0.28202415486170085, - -0.23140211922261744, - -0.2865775280668338, - -0.25740578658455426, - -0.2747176193960337, - -0.2627810618124168, - -0.28373032902814954, - -0.3078498609961887, - -0.3451042315958146, - -0.32480716172230106, - -0.3022562541394983, - -0.3436389984613526, - -0.3464204437632106, - -0.3722114010667368, - -0.408138385334186, - -0.3709240056323482, - -0.35291496981238957, - -0.37209965757642915, - -0.35816946289783913, - -0.34002261928879396, - -0.31797087994680817, - -0.3127397572415187, - -0.30999256788495444, - -0.3053759658562708, - -0.3310658632148905, - -0.3021351571684735, - -0.3120252508677328, - -0.2988001887916467, - -0.29620906884602993, - -0.27335344357865154, - -0.27012182215857317, - -0.27938718165295595, - -0.2748348904983038, - -0.273255190035548, - -0.26244004944782906, - -0.2798889676627089, - -0.2603912887465424, - -0.26662240360991385, - -0.267116219249798, - -0.24548250058901633, - -0.24976173401564083, - -0.23519394225216428, - -0.23179465319621784, - -0.23866261453342952, - -0.22557075803417748, - -0.21000982333550477, - -0.21064144799117024, - -0.2159815473527077, - -0.2054502291320922, - -0.24892084795232194, - -0.24904424101154587, - -0.19633229247508377, - -0.23897670106399715, - -0.220935204081256, - -0.23809995598047662, - -0.22665927602281888, - -0.21798879211322675, - -0.21191371133418768, - -0.18963688393309264, - -0.25577307404835425, - -0.2611525722835042, - -0.34388194913589476, - -0.24999957882890134, - -0.2456815630010779, - -0.29049951733374746, - -0.23880965233099927, - -0.24445982197804494, - -0.2444482804788689, - -0.21313347845943043, - -0.2681085971709889, - -0.21864660057007868, - -0.14546082592233012, - -0.21536477225229278, - 0, - -0.22005227612432798, - -0.2825753725748473, - -0.16479040295656588, - -0.1819474066136625, - -0.23816184587180478, - -0.19958199838898438, - -0.26239851303806805, - -0.06959546186561827, - -0.22909441022125665, - -0.04826691575762487, - -0.2912899700780309, - -0.11698449965481073, - -0.15325177469129703, - -0.15510554082950911, - -0.16149608067641852, - -0.15309158266329692, - -0.1176413276941578, - -0.08688928083694591, - -0.1725387885083306, - -0.18957155323340602, - -0.1483480062974759, - -0.1146530000120134, - -0.02324855373818191, - -0.06364534028514512, - 0, - -0.18402762516238358, - -0.17082134163623774, - -0.17956458960590926, - -0.17578982941236088, - -0.25288742436263734, - -0.24955359057346382, - -0.21878553099015496, - -0.2018551040035702, - -0.19226226613278685, - -0.19216387910698074, - -0.1981970428351305, - -0.23026637302647146, - -0.2247279072154249, - -0.24173045954021033, - -0.2289758567209852, - -0.2739718585722831, - -0.25160290927718276, - -0.23261081098143888, - -0.21561901295919905, - -0.21279063138967436, - -0.23120199734794922, - -0.24864774792469713, - -0.2326883629468467, - -0.22397113324739315, - -0.16097242893455765, - -0.15809276262779326, - -0.15772711634123837, - -0.13626801408045475, - -0.08135663427395001, - -0.12827765628093235, - -0.08380861525437444, - -0.06366580658623844, - -0.04299254358816429, - -0.055037362439372295, - -0.10906293298861136, - 0, - 0, - 0, - -0.031460617771271626, - 0, - -0.0044663813883794035, - 0, - -0.08436676277787436, - -0.047755460784184134, - -0.02675511565357258, - -0.03493241523859136, - -0.02598968453703876, - -0.03182576385150093, - -0.02860126544736563, - -0.0661613974509343, - 0, - -0.015288169058213508, - 0, - -0.00041458656720649856, - -0.04938022989229984, - -0.03858654364499059, - -0.028972429803228783, - -0.06068530796794214, - -0.018118778632323362, - -0.0895782239632803, - -0.13395226742443989, - -0.11100065695438843, - -0.027803608673542257, - -0.10909034581696786, - -0.1422937806539285, - -0.1215462656459706, - -0.13771109576396456, - -0.03780096663510235, - -0.08620122639486183, - -0.15579480343703556, - -0.13082369596806276, - -0.09889352933554707, - -0.09436023855610287, - -0.10318633613128947, - -0.04873818550597486, - -0.06524757870336706, - -0.08406799829490463, - -0.08280016848172889, - -0.10963875499983944, - -0.04036506633745851, - -0.12232355592180999, - -0.027304851274863484, - -0.07055614364814444, - -0.044536210268366405, - -0.06091656522703648, - -0.05430065209321078, - -0.12463950747150843, - -0.08854918988427551, - -0.0798371431275191, - -0.10765744110907527, - -0.10646156920421468, - -0.08916939852261296, - -0.15068141714755579, - -0.19685757247225377, - -0.09268993376806556, - -0.13642747032806501, - -0.11667331121195801, - -0.13329560633891246, - -0.09636577982133354, - -0.11990970072210838, - -0.17393922920473703, - -0.12660977165205223, - -0.11418846604999, - -0.12340479972931429, - -0.07844823986750649, - -0.09075630079844543, - -0.2657289159571702, - -0.24340483154408465, - -0.06786180092515004, - -0.0444229849134814, - -0.17354933482443524, - -0.1801711756729828, - -0.15741917370984715, - -0.19108853957516514, - -0.3306526160364034, - -0.16400368196019333, - -0.149817694320873, - -0.15711628216429152, - -0.15948061343751163, - -0.14467784372691606, - -0.16420927598395163, - -0.16420927598395174, - -0.1570134851524122, - -0.15639670308113762, - -0.17058269072045795, - -0.17202184888676575, - -0.18065679788461309, - -0.16953432533235424, - -0.17076788947490396, - -0.16552524186906803, - -0.1857987822774213, - -0.2406923866208791, - -0.21831995927143089, - -0.17022946065578715, - -0.1386193795029541, - -0.05319353801184912, - 0, - -0.05609282043144359, - -0.19857169785738082, - -0.23406874540412204, - -0.40566955866122134, - -0.25726602802535936, - -0.31460977805588175, - -0.26765134435408766, - -0.20325966452788613, - -0.09637625935200744, - -0.39987059719837503, - -0.2587414884524474, - -0.2683959577899888, - -0.27997055705378293, - -0.27783829069171595, - -0.274725181803098, - -0.2730406913770651, - -0.2827069655517689, - -0.2832755699149868, - -0.2824724162519415, - -0.29197521667222026, - -0.2921955508629671, - -0.28345878418346515, - -0.285583942990992, - -0.28656478551754283, - -0.28640131176311767, - -0.28868994432506956, - -0.28950731309719524, - -0.29016120811489576, - -0.290897180057648, - -0.2925692857853853, - -0.2937633549481431, - -0.2919722512040067, - -0.2960908184554676, - -0.30028257537489644, - -0.306722019788339, - -0.30821460624178587, - -0.28850535750174644, - -0.3001117827001858, - -0.3057409658960425, - -0.2863018042285316, - -0.2813478387139958, - -0.2789965657443034, - -0.2806170881794744, - -0.28415665034050563, - -0.28877656079165104, - -0.29553584515940323, - -0.29555006026848385, - -0.2939224302787725, - -0.32734215172690295, - -0.311556273093067, - -0.31073179676640084, - -0.3158847738080628, - -0.3148912603861297, - -0.3170519569663576, - -0.31867247940152854, - -0.31642693606009964, - -0.3181203447376806, - -0.32215249008781144, - -0.3260345282449473, - -0.3187706075048392, - -0.32377284961970254, - -0.3251801454186666, - -0.3350312160114164, - -0.3364385118103804, - -0.3285716357034525, - -0.3327025187022592, - -0.3161561317326189, - -0.320577030656638, - -0.3214902370185744, - -0.3341843294274133, - -0.3300477326850034, - -0.33345935886431066, - -0.3343299035193136, - -0.32609935536173495, - -0.33381113782230154, - -0.332005818969085, - -0.32161457423127837, - -0.3277412862449509, - -0.3168240824711678, - -0.3219446670566407, - -0.32083588854836576, - -0.31994033667629773, - -0.31793600629595453, - -0.301176392690108, - -0.3240769334187077, - -0.3213902778025034, - -0.3172963263873345, - -0.3270618220234204, - -0.33378556861847186, - -0.3124626206956207, - -0.307643698717349, - -0.29898669728735694, - -0.31416843378527404, - -0.30691872815424615, - -0.3150639856573423, - -0.305383496373558, - -0.317409478655616, - -0.30436000851976563, - -0.30436000851976563, - -0.31088815521387037, - -0.31337826558952386, - -0.3096112616832053, - -0.3108867475228232, - -0.30726189470730925, - -0.30694916230753944, - -0.3119059981809954, - -0.3040876881867497, - -0.3071439366390458, - -0.312115010161652, - -0.31435308916357774, - -0.3199228915119907, - -0.356896390230233, - -0.10999441163922419, - -0.1950733148627889, - -0.22863040924466804, - -0.18304549305953788, - -0.22794285838005668, - -0.2420517802415607, - -0.15508980221218127, - -0.22859613126717193, - -0.16909483380298052, - -0.20351928949286557, - -0.1921258795648868, - -0.18115181535478286, - -0.23855953337616698, - -0.22994517727341546, - -0.1719972851069742, - -0.1669793516015774, - -0.1761849952964193, - -0.1639361275464265, - -0.19341115622473226, - -0.16712884104589387, - -0.1729826229652225, - -0.19639348610981, - -0.2904917297131896, - -0.20127770512430643, - -0.26365191291627177, - -0.2947119262570469, - -0.215938899287751, - -0.22263421566464114, - -0.17923548764203845, - -0.17539858980534184, - -0.11543215214947711, - -0.20632355960985405, - -0.22355937936989478, - -0.16721068697500385, - -0.20507263001077414, - -0.21668266833898175, - -0.12478909568843288, - -0.198703893077802, - -0.14389754001813948, - -0.06785703759569062, - -0.319525976027489, - -0.09468559570206214, - 0, - -0.44830118458575097, - -0.2969519498532056, - -0.24079563386486413, - -0.24286404233152836, - -0.15423460186638793, - -0.22435762666838788, - -0.2215792643760397, - -0.2242985662243776, - -0.20970503093597181, - -0.2097461442730516, - -0.24027701854155148, - -0.2525534597789041, - -0.1038219639414718, - -0.25512458665223336, - -0.29658107068737993, - -0.2509944319169851, - -0.3477783906790993, - -0.18735169776423455, - -0.27419105964831225, - -0.269937945720634, - -0.27287170637171765, - -0.29954566889770196, - -0.3055849555001422, - -0.05749549933638598, - -0.18295175596793734, - -0.08408318675410931, - -0.18040692977067962, - -0.38236362656209477, - -0.262316695058573, - -0.20922898074173002, - -0.19894486051033589, - -0.2142637633223543, - -0.2006813932703655, - -0.1379221389704285, - -0.2119048438401856, - -0.1399883207302458, - -0.14318922120660083, - -0.20663372179073847, - -0.0745964004656583, - -0.250507493155256, - -0.20432080607006653, - -0.18603868988271233, - -0.13421129787768726, - -0.003959829505112089, - 0, - 0, - -0.09095107777360256, - -0.02655058714191194, - -0.029772355681346285, - -0.037527294540043665, - -0.03149597110994995, - -0.036818232449082666, - -0.025033005784740547, - 0, - 0, - -0.20577815324791227, - -0.13860112336203334, - -0.11535166078927694, - -0.03524678786464985, - null, - -0.13721296056568955, - -0.22060387901573109, - -0.19089895925723466, - -0.1907066799331918, - -0.2611041103583107, - -0.1881765871999006, - -0.184566819448009, - -0.2163868117709744, - -0.1863867656081345, - -0.15699038709054347, - -0.16827164551514995, - -0.15320678405701849, - -0.16034542499012283, - -0.176174932132239, - -0.16257800892108631, - -0.14673705610924848, - -0.08167364947467737, - -0.12321778051427124, - -0.13881029221047447, - -0.15784872548287399, - -0.18778177189534395, - -0.1833058889799496, - -0.3373037410893672, - -0.17235938234608017, - -0.1877796487913339, - -0.2645179415319221, - -0.1693543292304398, - -0.17725119635274988, - 0, - -0.1303690812070175, - -0.1900430360139922, - -0.23164259775266005, - -0.14862947409034266, - -0.1581403592122197, - -0.19347799029475732, - -0.20524763819700698, - -0.19709520758711718, - -0.2680782070560832, - -0.21138499798649601, - -0.20929777406941963, - -0.24219610889568044, - -0.25786810921932113, - -0.26179567175882623, - -0.2237283934044786, - -0.23882567326819715, - -0.2569656572238972, - -0.2329777951798273, - -0.19650743421246897, - -0.22247422786391602, - -0.17745591142504213, - -0.18155507721987552, - -0.18559391200485642, - -0.19032472106638587, - -0.17471096480873616, - -0.2003081787704314, - -0.20204360405689958, - -0.2153797565399801, - -0.2021005874245616, - -0.23656852064628564, - -0.20874785133424645, - -0.1965418075942742, - -0.23205253638629098, - -0.12435709172920739, - -0.24326967280539014, - -0.2664624889989128, - -0.2935200635600207, - -0.29680193035857805, - -0.2684461434664639, - -0.3005177602814221, - -0.2763038764887292, - -0.28768437399760194, - -0.28115185053373304, - -0.2649531785203906, - -0.28988946259425397, - -0.280526946314822, - -0.26631887147071465, - -0.24195285765491026, - -0.24205978332829614, - -0.2296537972722349, - -0.21889555562070162, - -0.22334992269737952, - -0.2469891896599241, - -0.22589875257029468, - -0.2467462724950119, - -0.21851806808266305, - -0.28713827096411737, - -0.31721985580756173, - -0.2895317695829287, - -0.2817071353411119, - -0.33694462873838915, - -0.32271482103383675, - -0.3319331276273443, - -0.32312262600319885, - -0.326725806712194, - -0.3067446148196449, - -0.2931746167581828, - -0.2774750961398784, - -0.2780607797550354, - -0.2666539076781027, - -0.26255385395618036, - -0.2631264758613834, - -0.23129653174790676, - -0.22962310149368903, - -0.21621716496405086, - -0.20807362245295857, - -0.2127201007079026, - -0.20804183651201047, - -0.19011154234279182, - -0.20209323544751734, - -0.19654151294408362, - -0.19664637619147052, - -0.21417610142589527, - -0.24375649407355027, - -0.21372255025385567, - -0.2218739579663147, - -0.24412319117483772, - -0.2425992830004795, - -0.2687673856043292, - -0.2532741100044197, - -0.2642010924267352, - -0.23748264479798797, - -0.2189223427548882, - -0.22667330391899132, - -0.21150213389821682, - -0.1975496374929343, - -0.19038022891636397, - -0.2159217928990841, - -0.15869101827576393, - -0.15367917021168265, - -0.1769272344648376, - -0.1543594781354728, - -0.1613553395911944, - -0.16136678893096834, - -0.1511479979500281, - -0.17253622739987173, - -0.1834519086675953, - -0.1369261311596025, - -0.1369261311596025, - -0.2793527740959294, - -0.30555945480154767, - -0.29304219650001095, - -0.22111867472034785, - -0.2894293845219943, - -0.26365855860706644, - -0.3121606643683571, - -0.32366678087426504, - null, - -0.22129503102355408, - -0.21606707485146026, - -0.23665269850585513, - -0.14287739561463575, - -0.1862571006439211, - -0.06593693125216904, - -0.12034824339087136, - -0.11280872827525446, - -0.11212124496491094, - -0.11518123171547778, - -0.04497539933600325, - -0.13376070180394017, - -0.0758483834272129, - -0.022899329296413917, - 0, - -0.06946225200573442, - -0.02550986533304278, - -0.056064265954653525, - 0, - -0.08345191006041164, - -0.07252972864886542, - -0.0484541590626274, - -0.05070073960322152, - -0.06723378809420977, - -0.13747842920748177, - -0.09599373799757471, - -0.0617921851467107, - -0.020765731483893823, - -0.13063325239786583, - -0.04044155961199403, - -0.0457619813976613, - 0, - 0, - 0, - -0.006263153770335594, - -0.028502288032268175, - -0.12102041855918699, - -0.2789061564048183, - -0.007209858008891179, - -0.028650435883434744, - -0.008829216477252322, - -0.2670629823942887, - -0.019991310536526585, - -0.06301944443157825, - -0.01660179412756546, - -0.07384908310463034, - -0.04909453147300247, - -0.055800959091635516, - -0.04063411509257164, - -0.03326277670149269, - -0.0658625111827259, - -0.06605739882292516, - -0.05969489056934962, - -0.0636919978565792, - -0.03519254647209702, - -0.08775488943181586, - -0.0835934651146103, - -0.12077114847739578, - -0.04095128517368041, - -0.10349111104636377, - -0.049961972538205, - -0.10833273144112698, - -0.11841721148988749, - -0.09617327122318431, - -0.14834966022877827, - -0.1347763092878197, - -0.23051199654116716, - -0.19332284919954723, - -0.269474239275976, - -0.1942055755698635, - -0.1935406647974185, - -0.1690192140687724, - -0.15009218501174182, - -0.15001957981244973, - -0.21188303093385175, - -0.17361404037306238, - -0.14188578481333425, - -0.08725798586908406, - -0.09435036744183845, - -0.14312404052254202, - -0.0895719740567138, - -0.10320264489185149, - -0.1093600187917223, - -0.08872669776332076, - -0.0643073528728374, - -0.05712280091024591, - -0.04444027755130986, - -0.07582697021872065, - -0.06651103531107583, - -0.05128182726714958, - 0, - -0.005423380381481047, - 0, - -0.02219993412689647, - -0.03176170350739682, - -0.20432226263544184, - 0, - 0, - 0, - 0, - -0.06740899966501501, - -0.23887319047810962, - -0.08338205412378263, - 0, - 0, - 0, - -0.3997349863107237, - 0, - -0.4087019803662054, - -0.27727945866414916, - -0.2092862412118378, - -0.10418953869511782, - -0.09379747803532901, - -0.2186233961645787, - -0.09414529797587368, - -0.08855126797321311, - -0.1055647211127656, - -0.07467451384945456, - -0.0858512562314605, - -0.09705049365679352, - -0.029839503935037315, - -0.047328441008378186, - -0.14398314354570307, - -0.5313593925186126, - -0.15001235658156054, - -0.16703958133608343, - -0.2571480671837888, - -0.25656690503186186, - -0.304935242125312, - -0.23326170695661874, - -0.23264740377203486, - -0.2401970031010795, - -0.3241294877249248, - -0.3349006895452221, - -0.3219185106125402, - -0.3578989572108482, - -0.3179576449114626, - -0.3802834545769822, - -0.3290778357786396, - -0.40956506397143333, - -0.3891282190672437, - -0.42930244611759705, - 0, - -0.4394975611482256, - -0.0283463022034256, - -0.3675219016050252, - -0.3276456688088092, - -0.26775026518146716, - -0.29955256261145324, - -0.31208992147562153, - -0.27024380191451247, - -0.25574358229077676, - -0.26361207051389157, - -0.27612434451401036, - -0.24033266471914172, - -0.2440194129299923, - -0.6100511182952815, - -0.3213124600510068, - -0.44308021866575376, - -0.4238174797820643, - -0.4792251909231682, - -0.4047608670354562, - -0.4656324290492726, - -0.41888352390565653, - -0.3908398115822568, - -0.38149375087893433, - -0.3006168931412567, - -0.31618193022435803, - -0.200572818388294, - -0.48865671856137805, - -0.3433377919182762, - -0.31214919559387444, - -0.3383523523371308, - -0.3294964696427245, - -0.6032888517382604, - -0.285740477135935, - -0.3171269521068013, - -0.3015619150237001, - -0.30360791004789156, - -0.3358540818343938, - -0.309909098719072, - -0.2715800766122124, - -0.2608721661292682, - -0.06237259028019915, - -0.24052841605388076, - -0.21251004216294167, - -0.1074726874258265, - -0.18436879698443487, - -0.224432579030459, - -0.24731790936137032, - 0, - -0.3706095685992674, - -0.3128377433497397, - -0.2632847473676081, - -0.26892605676522197, - -0.3345267819833342, - -0.2906213243013529, - -0.28660783476672336, - -0.23412061042952825, - -0.2791695285132211, - -0.4523620872517431, - -0.1029059547199268, - -0.32905589535912994, - -0.3205513670953737, - -0.2834893970006339, - -0.04282951858376849, - -0.23409029643718238, - -0.23587674568477346, - -0.23518434087876716, - -0.22208902743666337, - -0.24504239067159372, - -0.21603231525626154, - -0.2753719968003512, - -0.5754286135085447, - -0.2189589028242136, - -0.20663190470362558, - -0.21205520251244714, - -0.25015324672916295, - -0.29009919869850176, - -0.31411145187430245, - -0.30505479368967336, - -0.30506019207187196, - -0.2905634595675882, - -0.26146368795572283, - -0.23245685156970908, - -0.17499439514618165, - -0.17246546071618774, - -0.1841681566985065, - -0.2174772545407616, - -0.3866974345013967, - -0.2155022771763857, - -0.25876499516858853, - -0.22069892598489615, - -0.26033758542907925, - -0.2682974584550061, - -0.4630635304480687, - -0.24343657959757425, - -0.24863372671828743, - -0.1889349281799354, - -0.20786829879314384, - -0.20789044114052158, - -0.16338908511584083, - -0.2542056114032837, - -0.22111145222457007, - -0.33444627351449696, - -0.33444627351449696, - -0.1991146733471807, - -0.21028405115654247, - -0.19629642761961164, - -0.1473697585556526, - -0.1477663903360199, - -0.190460118844483, - -0.186597368751248, - -0.19303694630473223, - -0.19903247262661083, - -0.20375174095006787, - -0.09189010937908493, - -0.1608013034825242, - -0.16019456052679026, - -0.14263279199597168, - -0.1438165905626384, - -0.08825311889253973, - -0.07611505960488862, - -0.0445110689277286, - -0.07526229992986122, - -0.07059884956853313, - -0.11174202088299212, - -0.06718003687361751, - -0.08900420995855807, - -0.1005758713846453, - -0.07535906220921684, - -0.12651413192384886, - -0.09730639266800967, - -0.10141206996018437, - -0.06494392190729914, - -0.05590744536688941, - -0.05835623458424133, - -0.0850815485490285, - -0.09600579781829843, - -0.14092282927227673, - -0.12633094386335986, - -0.1390261945682585, - -0.15870703502394568, - -0.13521784355717925, - -0.14239478506023084, - -0.18182129453312468 - ], - "yaxis": "y" - }, - { - "hovertemplate": "variable=ZSCORE_2NORM
datetime=%{x}
value=%{y}", - "legendgroup": "ZSCORE_2NORM", - "line": { - "color": "#00cc96", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "ZSCORE_2NORM", - "showlegend": true, - "type": "scattergl", - "x": [ - "2017-01-05T00:00:00", - "2017-01-06T00:00:00", - "2017-01-09T00:00:00", - "2017-01-10T00:00:00", - "2017-01-11T00:00:00", - "2017-01-12T00:00:00", - "2017-01-13T00:00:00", - "2017-01-17T00:00:00", - "2017-01-18T00:00:00", - "2017-01-19T00:00:00", - "2017-01-20T00:00:00", - "2017-01-23T00:00:00", - "2017-01-24T00:00:00", - "2017-01-25T00:00:00", - "2017-01-26T00:00:00", - "2017-01-27T00:00:00", - "2017-01-30T00:00:00", - "2017-01-31T00:00:00", - "2017-02-01T00:00:00", - "2017-02-02T00:00:00", - "2017-02-03T00:00:00", - "2017-02-06T00:00:00", - "2017-02-07T00:00:00", - "2017-02-08T00:00:00", - "2017-02-09T00:00:00", - "2017-02-10T00:00:00", - "2017-02-13T00:00:00", - "2017-02-14T00:00:00", - "2017-02-15T00:00:00", - "2017-02-16T00:00:00", - "2017-02-17T00:00:00", - "2017-02-21T00:00:00", - "2017-02-22T00:00:00", - "2017-02-23T00:00:00", - "2017-02-24T00:00:00", - "2017-02-27T00:00:00", - "2017-02-28T00:00:00", - "2017-03-01T00:00:00", - "2017-03-02T00:00:00", - "2017-03-03T00:00:00", - "2017-03-06T00:00:00", - "2017-03-07T00:00:00", - "2017-03-08T00:00:00", - "2017-03-09T00:00:00", - "2017-03-10T00:00:00", - "2017-03-13T00:00:00", - "2017-03-14T00:00:00", - "2017-03-15T00:00:00", - "2017-03-16T00:00:00", - "2017-03-17T00:00:00", - "2017-03-20T00:00:00", - "2017-03-21T00:00:00", - "2017-03-22T00:00:00", - "2017-03-23T00:00:00", - "2017-03-24T00:00:00", - "2017-03-27T00:00:00", - "2017-03-28T00:00:00", - "2017-03-29T00:00:00", - "2017-03-30T00:00:00", - "2017-03-31T00:00:00", - "2017-04-03T00:00:00", - "2017-04-04T00:00:00", - "2017-04-05T00:00:00", - "2017-04-06T00:00:00", - "2017-04-07T00:00:00", - "2017-04-10T00:00:00", - "2017-04-11T00:00:00", - "2017-04-12T00:00:00", - "2017-04-13T00:00:00", - "2017-04-17T00:00:00", - "2017-04-18T00:00:00", - "2017-04-19T00:00:00", - "2017-04-20T00:00:00", - "2017-04-21T00:00:00", - "2017-04-24T00:00:00", - "2017-04-25T00:00:00", - "2017-04-26T00:00:00", - "2017-04-27T00:00:00", - "2017-04-28T00:00:00", - "2017-05-01T00:00:00", - "2017-05-02T00:00:00", - "2017-05-03T00:00:00", - "2017-05-04T00:00:00", - "2017-05-05T00:00:00", - "2017-05-08T00:00:00", - "2017-05-09T00:00:00", - "2017-05-10T00:00:00", - "2017-05-11T00:00:00", - "2017-05-12T00:00:00", - "2017-05-15T00:00:00", - "2017-05-16T00:00:00", - "2017-05-17T00:00:00", - "2017-05-18T00:00:00", - "2017-05-19T00:00:00", - "2017-05-22T00:00:00", - "2017-05-23T00:00:00", - "2017-05-24T00:00:00", - "2017-05-25T00:00:00", - "2017-05-26T00:00:00", - "2017-05-29T00:00:00", - "2017-05-30T00:00:00", - "2017-05-31T00:00:00", - "2017-06-01T00:00:00", - "2017-06-02T00:00:00", - "2017-06-05T00:00:00", - "2017-06-06T00:00:00", - "2017-06-07T00:00:00", - "2017-06-08T00:00:00", - "2017-06-09T00:00:00", - "2017-06-12T00:00:00", - "2017-06-13T00:00:00", - "2017-06-14T00:00:00", - "2017-06-15T00:00:00", - "2017-06-16T00:00:00", - "2017-06-19T00:00:00", - "2017-06-20T00:00:00", - "2017-06-21T00:00:00", - "2017-06-22T00:00:00", - "2017-06-23T00:00:00", - "2017-06-26T00:00:00", - "2017-06-27T00:00:00", - "2017-06-28T00:00:00", - "2017-06-29T00:00:00", - "2017-06-30T00:00:00", - "2017-07-03T00:00:00", - "2017-07-05T00:00:00", - "2017-07-06T00:00:00", - "2017-07-07T00:00:00", - "2017-07-10T00:00:00", - "2017-07-11T00:00:00", - "2017-07-12T00:00:00", - "2017-07-13T00:00:00", - "2017-07-14T00:00:00", - "2017-07-17T00:00:00", - "2017-07-18T00:00:00", - "2017-07-19T00:00:00", - "2017-07-20T00:00:00", - "2017-07-21T00:00:00", - "2017-07-24T00:00:00", - "2017-07-25T00:00:00", - "2017-07-26T00:00:00", - "2017-07-27T00:00:00", - "2017-07-28T00:00:00", - "2017-07-31T00:00:00", - "2017-08-01T00:00:00", - "2017-08-02T00:00:00", - "2017-08-03T00:00:00", - "2017-08-04T00:00:00", - "2017-08-07T00:00:00", - "2017-08-08T00:00:00", - "2017-08-09T00:00:00", - "2017-08-10T00:00:00", - "2017-08-11T00:00:00", - "2017-08-14T00:00:00", - "2017-08-15T00:00:00", - "2017-08-16T00:00:00", - "2017-08-17T00:00:00", - "2017-08-18T00:00:00", - "2017-08-21T00:00:00", - "2017-08-22T00:00:00", - "2017-08-23T00:00:00", - "2017-08-24T00:00:00", - "2017-08-25T00:00:00", - "2017-08-28T00:00:00", - "2017-08-29T00:00:00", - "2017-08-30T00:00:00", - "2017-08-31T00:00:00", - "2017-09-01T00:00:00", - "2017-09-05T00:00:00", - "2017-09-06T00:00:00", - "2017-09-07T00:00:00", - "2017-09-08T00:00:00", - "2017-09-11T00:00:00", - "2017-09-12T00:00:00", - "2017-09-13T00:00:00", - "2017-09-14T00:00:00", - "2017-09-15T00:00:00", - "2017-09-18T00:00:00", - "2017-09-19T00:00:00", - "2017-09-20T00:00:00", - "2017-09-21T00:00:00", - "2017-09-22T00:00:00", - "2017-09-25T00:00:00", - "2017-09-26T00:00:00", - "2017-09-27T00:00:00", - "2017-09-28T00:00:00", - "2017-09-29T00:00:00", - "2017-10-02T00:00:00", - "2017-10-03T00:00:00", - "2017-10-04T00:00:00", - "2017-10-05T00:00:00", - "2017-10-06T00:00:00", - "2017-10-09T00:00:00", - "2017-10-10T00:00:00", - "2017-10-11T00:00:00", - "2017-10-12T00:00:00", - "2017-10-13T00:00:00", - "2017-10-16T00:00:00", - "2017-10-17T00:00:00", - "2017-10-18T00:00:00", - "2017-10-19T00:00:00", - "2017-10-20T00:00:00", - "2017-10-23T00:00:00", - "2017-10-24T00:00:00", - "2017-10-25T00:00:00", - "2017-10-26T00:00:00", - "2017-10-27T00:00:00", - "2017-10-30T00:00:00", - "2017-10-31T00:00:00", - "2017-11-01T00:00:00", - "2017-11-02T00:00:00", - "2017-11-03T00:00:00", - "2017-11-06T00:00:00", - "2017-11-07T00:00:00", - "2017-11-08T00:00:00", - "2017-11-09T00:00:00", - "2017-11-10T00:00:00", - "2017-11-13T00:00:00", - "2017-11-14T00:00:00", - "2017-11-15T00:00:00", - "2017-11-16T00:00:00", - "2017-11-17T00:00:00", - "2017-11-20T00:00:00", - "2017-11-21T00:00:00", - "2017-11-22T00:00:00", - "2017-11-24T00:00:00", - "2017-11-27T00:00:00", - "2017-11-28T00:00:00", - "2017-11-29T00:00:00", - "2017-11-30T00:00:00", - "2017-12-01T00:00:00", - "2017-12-04T00:00:00", - "2017-12-05T00:00:00", - "2017-12-06T00:00:00", - "2017-12-07T00:00:00", - "2017-12-08T00:00:00", - "2017-12-11T00:00:00", - "2017-12-12T00:00:00", - "2017-12-13T00:00:00", - "2017-12-14T00:00:00", - "2017-12-15T00:00:00", - "2017-12-18T00:00:00", - "2017-12-19T00:00:00", - "2017-12-20T00:00:00", - "2017-12-21T00:00:00", - "2017-12-22T00:00:00", - "2017-12-26T00:00:00", - "2017-12-27T00:00:00", - "2017-12-28T00:00:00", - "2017-12-29T00:00:00", - "2018-01-01T00:00:00", - "2018-01-02T00:00:00", - "2018-01-04T00:00:00", - "2018-01-05T00:00:00", - "2018-01-08T00:00:00", - "2018-01-09T00:00:00", - "2018-01-10T00:00:00", - "2018-01-11T00:00:00", - "2018-01-12T00:00:00", - "2018-01-15T00:00:00", - "2018-01-16T00:00:00", - "2018-01-17T00:00:00", - "2018-01-18T00:00:00", - "2018-01-19T00:00:00", - "2018-01-22T00:00:00", - "2018-01-23T00:00:00", - "2018-01-24T00:00:00", - "2018-01-25T00:00:00", - "2018-01-26T00:00:00", - "2018-01-29T00:00:00", - "2018-01-30T00:00:00", - "2018-01-31T00:00:00", - "2018-02-01T00:00:00", - "2018-02-02T00:00:00", - "2018-02-05T00:00:00", - "2018-02-06T00:00:00", - "2018-02-07T00:00:00", - "2018-02-08T00:00:00", - "2018-02-09T00:00:00", - "2018-02-12T00:00:00", - "2018-02-13T00:00:00", - "2018-02-14T00:00:00", - "2018-02-15T00:00:00", - "2018-02-16T00:00:00", - "2018-02-20T00:00:00", - "2018-02-21T00:00:00", - "2018-02-22T00:00:00", - "2018-02-23T00:00:00", - "2018-02-26T00:00:00", - "2018-02-27T00:00:00", - "2018-02-28T00:00:00", - "2018-03-01T00:00:00", - "2018-03-02T00:00:00", - "2018-03-05T00:00:00", - "2018-03-06T00:00:00", - "2018-03-07T00:00:00", - "2018-03-08T00:00:00", - "2018-03-09T00:00:00", - "2018-03-12T00:00:00", - "2018-03-13T00:00:00", - "2018-03-14T00:00:00", - "2018-03-15T00:00:00", - "2018-03-16T00:00:00", - "2018-03-19T00:00:00", - "2018-03-20T00:00:00", - "2018-03-21T00:00:00", - "2018-03-22T00:00:00", - "2018-03-23T00:00:00", - "2018-03-26T00:00:00", - "2018-03-27T00:00:00", - "2018-03-28T00:00:00", - "2018-03-29T00:00:00", - "2018-04-02T00:00:00", - "2018-04-03T00:00:00", - "2018-04-04T00:00:00", - "2018-04-05T00:00:00", - "2018-04-06T00:00:00", - "2018-04-09T00:00:00", - "2018-04-10T00:00:00", - "2018-04-11T00:00:00", - "2018-04-12T00:00:00", - "2018-04-13T00:00:00", - "2018-04-16T00:00:00", - "2018-04-17T00:00:00", - "2018-04-18T00:00:00", - "2018-04-19T00:00:00", - "2018-04-20T00:00:00", - "2018-04-23T00:00:00", - "2018-04-24T00:00:00", - "2018-04-25T00:00:00", - "2018-04-26T00:00:00", - "2018-04-27T00:00:00", - "2018-04-30T00:00:00", - "2018-05-01T00:00:00", - "2018-05-02T00:00:00", - "2018-05-03T00:00:00", - "2018-05-04T00:00:00", - "2018-05-07T00:00:00", - "2018-05-08T00:00:00", - "2018-05-09T00:00:00", - "2018-05-10T00:00:00", - "2018-05-11T00:00:00", - "2018-05-14T00:00:00", - "2018-05-15T00:00:00", - "2018-05-16T00:00:00", - "2018-05-17T00:00:00", - "2018-05-18T00:00:00", - "2018-05-21T00:00:00", - "2018-05-22T00:00:00", - "2018-05-23T00:00:00", - "2018-05-24T00:00:00", - "2018-05-25T00:00:00", - "2018-05-28T00:00:00", - "2018-05-29T00:00:00", - "2018-05-30T00:00:00", - "2018-05-31T00:00:00", - "2018-06-01T00:00:00", - "2018-06-04T00:00:00", - "2018-06-05T00:00:00", - "2018-06-06T00:00:00", - "2018-06-07T00:00:00", - "2018-06-08T00:00:00", - "2018-06-11T00:00:00", - "2018-06-12T00:00:00", - "2018-06-13T00:00:00", - "2018-06-14T00:00:00", - "2018-06-15T00:00:00", - "2018-06-18T00:00:00", - "2018-06-19T00:00:00", - "2018-06-20T00:00:00", - "2018-06-21T00:00:00", - "2018-06-22T00:00:00", - "2018-06-25T00:00:00", - "2018-06-26T00:00:00", - "2018-06-27T00:00:00", - "2018-06-28T00:00:00", - "2018-06-29T00:00:00", - "2018-07-02T00:00:00", - "2018-07-03T00:00:00", - "2018-07-05T00:00:00", - "2018-07-06T00:00:00", - "2018-07-09T00:00:00", - "2018-07-10T00:00:00", - "2018-07-11T00:00:00", - "2018-07-12T00:00:00", - "2018-07-13T00:00:00", - "2018-07-16T00:00:00", - "2018-07-17T00:00:00", - "2018-07-18T00:00:00", - "2018-07-19T00:00:00", - "2018-07-20T00:00:00", - "2018-07-23T00:00:00", - "2018-07-24T00:00:00", - "2018-07-25T00:00:00", - "2018-07-26T00:00:00", - "2018-07-27T00:00:00", - "2018-07-30T00:00:00", - "2018-07-31T00:00:00", - "2018-08-01T00:00:00", - "2018-08-02T00:00:00", - "2018-08-03T00:00:00", - "2018-08-06T00:00:00", - "2018-08-07T00:00:00", - "2018-08-08T00:00:00", - "2018-08-09T00:00:00", - "2018-08-10T00:00:00", - "2018-08-13T00:00:00", - "2018-08-14T00:00:00", - "2018-08-15T00:00:00", - "2018-08-16T00:00:00", - "2018-08-17T00:00:00", - "2018-08-20T00:00:00", - "2018-08-21T00:00:00", - "2018-08-22T00:00:00", - "2018-08-23T00:00:00", - "2018-08-24T00:00:00", - "2018-08-27T00:00:00", - "2018-08-28T00:00:00", - "2018-08-29T00:00:00", - "2018-08-30T00:00:00", - "2018-08-31T00:00:00", - "2018-09-03T00:00:00", - "2018-09-04T00:00:00", - "2018-09-05T00:00:00", - "2018-09-06T00:00:00", - "2018-09-07T00:00:00", - "2018-09-10T00:00:00", - "2018-09-11T00:00:00", - "2018-09-12T00:00:00", - "2018-09-13T00:00:00", - "2018-09-14T00:00:00", - "2018-09-17T00:00:00", - "2018-09-18T00:00:00", - "2018-09-19T00:00:00", - "2018-09-20T00:00:00", - "2018-09-21T00:00:00", - "2018-09-24T00:00:00", - "2018-09-25T00:00:00", - "2018-09-26T00:00:00", - "2018-09-27T00:00:00", - "2018-09-28T00:00:00", - "2018-10-01T00:00:00", - "2018-10-02T00:00:00", - "2018-10-03T00:00:00", - "2018-10-04T00:00:00", - "2018-10-05T00:00:00", - "2018-10-08T00:00:00", - "2018-10-09T00:00:00", - "2018-10-10T00:00:00", - "2018-10-11T00:00:00", - "2018-10-12T00:00:00", - "2018-10-15T00:00:00", - "2018-10-16T00:00:00", - "2018-10-17T00:00:00", - "2018-10-18T00:00:00", - "2018-10-19T00:00:00", - "2018-10-22T00:00:00", - "2018-10-23T00:00:00", - "2018-10-24T00:00:00", - "2018-10-25T00:00:00", - "2018-10-26T00:00:00", - "2018-10-29T00:00:00", - "2018-10-30T00:00:00", - "2018-10-31T00:00:00", - "2018-11-01T00:00:00", - "2018-11-02T00:00:00", - "2018-11-05T00:00:00", - "2018-11-06T00:00:00", - "2018-11-07T00:00:00", - "2018-11-08T00:00:00", - "2018-11-09T00:00:00", - "2018-11-12T00:00:00", - "2018-11-13T00:00:00", - "2018-11-14T00:00:00", - "2018-11-15T00:00:00", - "2018-11-16T00:00:00", - "2018-11-19T00:00:00", - "2018-11-20T00:00:00", - "2018-11-21T00:00:00", - "2018-11-23T00:00:00", - "2018-11-26T00:00:00", - "2018-11-27T00:00:00", - "2018-11-28T00:00:00", - "2018-11-29T00:00:00", - "2018-11-30T00:00:00", - "2018-12-03T00:00:00", - "2018-12-04T00:00:00", - "2018-12-06T00:00:00", - "2018-12-07T00:00:00", - "2018-12-10T00:00:00", - "2018-12-11T00:00:00", - "2018-12-12T00:00:00", - "2018-12-13T00:00:00", - "2018-12-14T00:00:00", - "2018-12-17T00:00:00", - "2018-12-18T00:00:00", - "2018-12-19T00:00:00", - "2018-12-20T00:00:00", - "2018-12-21T00:00:00", - "2018-12-24T00:00:00", - "2018-12-26T00:00:00", - "2018-12-27T00:00:00", - "2018-12-28T00:00:00", - "2018-12-31T00:00:00", - "2019-01-01T00:00:00", - "2019-01-02T00:00:00", - "2019-01-04T00:00:00", - "2019-01-08T00:00:00", - "2019-01-09T00:00:00", - "2019-01-10T00:00:00", - "2019-01-11T00:00:00", - "2019-01-16T00:00:00", - "2019-01-18T00:00:00", - "2019-01-22T00:00:00", - "2019-01-23T00:00:00", - "2019-01-24T00:00:00", - "2019-01-28T00:00:00", - "2019-01-29T00:00:00", - "2019-01-30T00:00:00", - "2019-01-31T00:00:00", - "2019-02-01T00:00:00", - "2019-02-04T00:00:00", - "2019-02-05T00:00:00", - "2019-02-06T00:00:00", - "2019-02-07T00:00:00", - "2019-02-08T00:00:00", - "2019-02-11T00:00:00", - "2019-02-12T00:00:00", - "2019-02-13T00:00:00", - "2019-02-14T00:00:00", - "2019-02-15T00:00:00", - "2019-02-18T00:00:00", - "2019-02-19T00:00:00", - "2019-02-20T00:00:00", - "2019-02-21T00:00:00", - "2019-02-22T00:00:00", - "2019-02-25T00:00:00", - "2019-02-26T00:00:00", - "2019-02-27T00:00:00", - "2019-02-28T00:00:00", - "2019-03-01T00:00:00", - "2019-03-04T00:00:00", - "2019-03-05T00:00:00", - "2019-03-06T00:00:00", - "2019-03-07T00:00:00", - "2019-03-08T00:00:00", - "2019-03-11T00:00:00", - "2019-03-12T00:00:00", - "2019-03-13T00:00:00", - "2019-03-14T00:00:00", - "2019-03-15T00:00:00", - "2019-03-18T00:00:00", - "2019-03-19T00:00:00", - "2019-03-20T00:00:00", - "2019-03-21T00:00:00", - "2019-03-22T00:00:00", - "2019-03-25T00:00:00", - "2019-03-26T00:00:00", - "2019-03-27T00:00:00", - "2019-03-28T00:00:00", - "2019-03-29T00:00:00", - "2019-04-01T00:00:00", - "2019-04-02T00:00:00", - "2019-04-03T00:00:00", - "2019-04-04T00:00:00", - "2019-04-05T00:00:00", - "2019-04-08T00:00:00", - "2019-04-09T00:00:00", - "2019-04-10T00:00:00", - "2019-04-11T00:00:00", - "2019-04-12T00:00:00", - "2019-04-15T00:00:00", - "2019-04-16T00:00:00", - "2019-04-17T00:00:00", - "2019-04-18T00:00:00", - "2019-04-19T00:00:00", - "2019-04-22T00:00:00", - "2019-04-23T00:00:00", - "2019-04-24T00:00:00", - "2019-04-25T00:00:00", - "2019-04-26T00:00:00", - "2019-04-29T00:00:00", - "2019-04-30T00:00:00", - "2019-05-01T00:00:00", - "2019-05-02T00:00:00", - "2019-05-03T00:00:00", - "2019-05-06T00:00:00", - "2019-05-07T00:00:00", - "2019-05-08T00:00:00", - "2019-05-09T00:00:00", - "2019-05-10T00:00:00", - "2019-05-13T00:00:00", - "2019-05-14T00:00:00", - "2019-05-15T00:00:00", - "2019-05-16T00:00:00", - "2019-05-17T00:00:00", - "2019-05-20T00:00:00", - "2019-05-21T00:00:00", - "2019-05-22T00:00:00", - "2019-05-23T00:00:00", - "2019-05-24T00:00:00", - "2019-05-28T00:00:00", - "2019-05-29T00:00:00", - "2019-05-30T00:00:00", - "2019-05-31T00:00:00", - "2019-06-03T00:00:00", - "2019-06-04T00:00:00", - "2019-06-05T00:00:00", - "2019-06-06T00:00:00", - "2019-06-07T00:00:00", - "2019-06-10T00:00:00", - "2019-06-11T00:00:00", - "2019-06-12T00:00:00", - "2019-06-13T00:00:00", - "2019-06-14T00:00:00", - "2019-06-17T00:00:00", - "2019-06-18T00:00:00", - "2019-06-19T00:00:00", - "2019-06-20T00:00:00", - "2019-06-21T00:00:00", - "2019-06-24T00:00:00", - "2019-06-25T00:00:00", - "2019-06-26T00:00:00", - "2019-06-27T00:00:00", - "2019-06-28T00:00:00", - "2019-07-01T00:00:00", - "2019-07-02T00:00:00", - "2019-07-03T00:00:00", - "2019-07-04T00:00:00", - "2019-07-05T00:00:00", - "2019-07-08T00:00:00", - "2019-07-09T00:00:00", - "2019-07-10T00:00:00", - "2019-07-11T00:00:00", - "2019-07-12T00:00:00", - "2019-07-15T00:00:00", - "2019-07-16T00:00:00", - "2019-07-17T00:00:00", - "2019-07-18T00:00:00", - "2019-07-19T00:00:00", - "2019-07-22T00:00:00", - "2019-07-23T00:00:00", - "2019-07-24T00:00:00", - "2019-07-25T00:00:00", - "2019-07-26T00:00:00", - "2019-07-29T00:00:00", - "2019-07-30T00:00:00", - "2019-07-31T00:00:00", - "2019-08-01T00:00:00", - "2019-08-02T00:00:00", - "2019-08-05T00:00:00", - "2019-08-06T00:00:00", - "2019-08-07T00:00:00", - "2019-08-08T00:00:00", - "2019-08-09T00:00:00", - "2019-08-12T00:00:00", - "2019-08-13T00:00:00", - "2019-08-14T00:00:00", - "2019-08-15T00:00:00", - "2019-08-16T00:00:00", - "2019-08-19T00:00:00", - "2019-08-20T00:00:00", - "2019-08-21T00:00:00", - "2019-08-22T00:00:00", - "2019-08-23T00:00:00", - "2019-08-26T00:00:00", - "2019-08-27T00:00:00", - "2019-08-28T00:00:00", - "2019-08-29T00:00:00", - "2019-08-30T00:00:00", - "2019-09-03T00:00:00", - "2019-09-04T00:00:00", - "2019-09-05T00:00:00", - "2019-09-06T00:00:00", - "2019-09-09T00:00:00", - "2019-09-10T00:00:00", - "2019-09-11T00:00:00", - "2019-09-12T00:00:00", - "2019-09-13T00:00:00", - "2019-09-16T00:00:00", - "2019-09-17T00:00:00", - "2019-09-18T00:00:00", - "2019-09-19T00:00:00", - "2019-09-20T00:00:00", - "2019-09-23T00:00:00", - "2019-09-24T00:00:00", - "2019-09-25T00:00:00", - "2019-09-26T00:00:00", - "2019-09-27T00:00:00", - "2019-09-30T00:00:00", - "2019-10-01T00:00:00", - "2019-10-02T00:00:00", - "2019-10-03T00:00:00", - "2019-10-04T00:00:00", - "2019-10-07T00:00:00", - "2019-10-08T00:00:00", - "2019-10-09T00:00:00", - "2019-10-10T00:00:00", - "2019-10-11T00:00:00", - "2019-10-14T00:00:00", - "2019-10-15T00:00:00", - "2019-10-16T00:00:00", - "2019-10-17T00:00:00", - "2019-10-18T00:00:00", - "2019-10-21T00:00:00", - "2019-10-22T00:00:00", - "2019-10-23T00:00:00", - "2019-10-24T00:00:00", - "2019-10-25T00:00:00", - "2019-10-28T00:00:00", - "2019-10-29T00:00:00", - "2019-10-30T00:00:00", - "2019-10-31T00:00:00", - "2019-11-01T00:00:00", - "2019-11-04T00:00:00", - "2019-11-05T00:00:00", - "2019-11-06T00:00:00", - "2019-11-07T00:00:00", - "2019-11-08T00:00:00", - "2019-11-11T00:00:00", - "2019-11-12T00:00:00", - "2019-11-13T00:00:00", - "2019-11-14T00:00:00", - "2019-11-15T00:00:00", - "2019-11-18T00:00:00", - "2019-11-19T00:00:00", - "2019-11-20T00:00:00", - "2019-11-21T00:00:00", - "2019-11-22T00:00:00", - "2019-11-25T00:00:00", - "2019-11-26T00:00:00", - "2019-11-27T00:00:00", - "2019-11-28T00:00:00", - "2019-11-29T00:00:00", - "2019-12-02T00:00:00", - "2019-12-03T00:00:00", - "2019-12-04T00:00:00", - "2019-12-05T00:00:00", - "2019-12-06T00:00:00", - "2019-12-09T00:00:00", - "2019-12-10T00:00:00", - "2019-12-11T00:00:00", - "2019-12-12T00:00:00", - "2019-12-13T00:00:00", - "2019-12-16T00:00:00", - "2019-12-17T00:00:00", - "2019-12-18T00:00:00", - "2019-12-19T00:00:00", - "2019-12-20T00:00:00", - "2019-12-23T00:00:00", - "2019-12-24T00:00:00", - "2019-12-26T00:00:00", - "2019-12-27T00:00:00", - "2019-12-30T00:00:00", - "2019-12-31T00:00:00", - "2020-01-01T00:00:00", - "2020-01-02T00:00:00", - "2020-01-06T00:00:00", - "2020-01-07T00:00:00", - "2020-01-08T00:00:00", - "2020-01-09T00:00:00", - "2020-01-10T00:00:00", - "2020-01-13T00:00:00", - "2020-01-14T00:00:00", - "2020-01-15T00:00:00", - "2020-01-16T00:00:00", - "2020-01-17T00:00:00", - "2020-01-21T00:00:00", - "2020-01-22T00:00:00", - "2020-01-23T00:00:00", - "2020-01-24T00:00:00", - "2020-01-27T00:00:00", - "2020-01-28T00:00:00", - "2020-01-29T00:00:00", - "2020-01-30T00:00:00", - "2020-01-31T00:00:00", - "2020-02-03T00:00:00", - "2020-02-04T00:00:00", - "2020-02-05T00:00:00", - "2020-02-06T00:00:00", - "2020-02-07T00:00:00", - "2020-02-10T00:00:00", - "2020-02-11T00:00:00", - "2020-02-12T00:00:00", - "2020-02-13T00:00:00", - "2020-02-14T00:00:00", - "2020-02-18T00:00:00", - "2020-02-19T00:00:00", - "2020-02-20T00:00:00", - "2020-02-21T00:00:00", - "2020-02-24T00:00:00", - "2020-02-25T00:00:00", - "2020-02-26T00:00:00", - "2020-02-27T00:00:00", - "2020-02-28T00:00:00", - "2020-03-02T00:00:00", - "2020-03-03T00:00:00", - "2020-03-04T00:00:00", - "2020-03-05T00:00:00", - "2020-03-06T00:00:00", - "2020-03-09T00:00:00", - "2020-03-10T00:00:00", - "2020-03-11T00:00:00", - "2020-03-12T00:00:00", - "2020-03-13T00:00:00", - "2020-03-16T00:00:00", - "2020-03-17T00:00:00", - "2020-03-18T00:00:00", - "2020-03-19T00:00:00", - "2020-03-20T00:00:00", - "2020-03-23T00:00:00", - "2020-03-24T00:00:00", - "2020-03-25T00:00:00", - "2020-03-26T00:00:00", - "2020-03-27T00:00:00", - "2020-03-30T00:00:00", - "2020-03-31T00:00:00", - "2020-04-01T00:00:00", - "2020-04-02T00:00:00", - "2020-04-03T00:00:00", - "2020-04-06T00:00:00", - "2020-04-07T00:00:00", - "2020-04-08T00:00:00", - "2020-04-09T00:00:00", - "2020-04-13T00:00:00", - "2020-04-14T00:00:00", - "2020-04-15T00:00:00", - "2020-04-16T00:00:00", - "2020-04-17T00:00:00", - "2020-04-20T00:00:00", - "2020-04-21T00:00:00", - "2020-04-22T00:00:00", - "2020-04-23T00:00:00", - "2020-04-24T00:00:00", - "2020-04-27T00:00:00", - "2020-04-28T00:00:00", - "2020-04-29T00:00:00", - "2020-04-30T00:00:00", - "2020-05-01T00:00:00", - "2020-05-04T00:00:00", - "2020-05-05T00:00:00", - "2020-05-06T00:00:00", - "2020-05-07T00:00:00", - "2020-05-08T00:00:00", - "2020-05-11T00:00:00", - "2020-05-12T00:00:00", - "2020-05-13T00:00:00", - "2020-05-14T00:00:00", - "2020-05-15T00:00:00", - "2020-05-18T00:00:00", - "2020-05-19T00:00:00", - "2020-05-20T00:00:00", - "2020-05-21T00:00:00", - "2020-05-22T00:00:00", - "2020-05-26T00:00:00", - "2020-05-27T00:00:00", - "2020-05-28T00:00:00", - "2020-05-29T00:00:00", - "2020-06-01T00:00:00", - "2020-06-02T00:00:00", - "2020-06-03T00:00:00", - "2020-06-04T00:00:00", - "2020-06-05T00:00:00", - "2020-06-08T00:00:00", - "2020-06-09T00:00:00", - "2020-06-10T00:00:00", - "2020-06-11T00:00:00", - "2020-06-12T00:00:00", - "2020-06-15T00:00:00", - "2020-06-16T00:00:00", - "2020-06-17T00:00:00", - "2020-06-18T00:00:00", - "2020-06-19T00:00:00", - "2020-06-22T00:00:00", - "2020-06-23T00:00:00", - "2020-06-24T00:00:00", - "2020-06-25T00:00:00", - "2020-06-26T00:00:00", - "2020-06-29T00:00:00", - "2020-06-30T00:00:00", - "2020-07-01T00:00:00", - "2020-07-02T00:00:00", - "2020-07-06T00:00:00", - "2020-07-07T00:00:00", - "2020-07-08T00:00:00", - "2020-07-09T00:00:00", - "2020-07-10T00:00:00", - "2020-07-13T00:00:00", - "2020-07-14T00:00:00", - "2020-07-15T00:00:00", - "2020-07-16T00:00:00", - "2020-07-17T00:00:00", - "2020-07-20T00:00:00", - "2020-07-21T00:00:00", - "2020-07-22T00:00:00", - "2020-07-23T00:00:00", - "2020-07-24T00:00:00", - "2020-07-27T00:00:00", - "2020-07-28T00:00:00", - "2020-07-29T00:00:00", - "2020-07-30T00:00:00", - "2020-07-31T00:00:00", - "2020-08-03T00:00:00", - "2020-08-04T00:00:00", - "2020-08-05T00:00:00", - "2020-08-06T00:00:00", - "2020-08-07T00:00:00", - "2020-08-10T00:00:00", - "2020-08-11T00:00:00", - "2020-08-12T00:00:00", - "2020-08-13T00:00:00", - "2020-08-14T00:00:00", - "2020-08-17T00:00:00", - "2020-08-18T00:00:00", - "2020-08-19T00:00:00", - "2020-08-20T00:00:00", - "2020-08-21T00:00:00", - "2020-08-24T00:00:00", - "2020-08-25T00:00:00", - "2020-08-26T00:00:00", - "2020-08-27T00:00:00", - "2020-08-28T00:00:00", - "2020-08-31T00:00:00", - "2020-09-01T00:00:00", - "2020-09-02T00:00:00", - "2020-09-03T00:00:00", - "2020-09-04T00:00:00", - "2020-09-08T00:00:00", - "2020-09-09T00:00:00", - "2020-09-10T00:00:00", - "2020-09-11T00:00:00", - "2020-09-14T00:00:00", - "2020-09-15T00:00:00", - "2020-09-16T00:00:00", - "2020-09-17T00:00:00", - "2020-09-18T00:00:00", - "2020-09-21T00:00:00", - "2020-09-22T00:00:00", - "2020-09-23T00:00:00", - "2020-09-24T00:00:00", - "2020-09-25T00:00:00", - "2020-09-28T00:00:00", - "2020-09-29T00:00:00", - "2020-09-30T00:00:00", - "2020-10-01T00:00:00", - "2020-10-02T00:00:00", - "2020-10-05T00:00:00", - "2020-10-06T00:00:00", - "2020-10-07T00:00:00", - "2020-10-08T00:00:00", - "2020-10-09T00:00:00", - "2020-10-12T00:00:00", - "2020-10-13T00:00:00", - "2020-10-14T00:00:00", - "2020-10-15T00:00:00", - "2020-10-16T00:00:00", - "2020-10-19T00:00:00", - "2020-10-20T00:00:00", - "2020-10-21T00:00:00", - "2020-10-22T00:00:00", - "2020-10-23T00:00:00", - "2020-10-26T00:00:00", - "2020-10-27T00:00:00", - "2020-10-28T00:00:00", - "2020-10-29T00:00:00", - "2020-10-30T00:00:00", - "2020-11-02T00:00:00", - "2020-11-03T00:00:00", - "2020-11-04T00:00:00", - "2020-11-05T00:00:00", - "2020-11-06T00:00:00", - "2020-11-09T00:00:00", - "2020-11-10T00:00:00", - "2020-11-11T00:00:00", - "2020-11-12T00:00:00", - "2020-11-13T00:00:00", - "2020-11-16T00:00:00", - "2020-11-17T00:00:00", - "2020-11-18T00:00:00", - "2020-11-19T00:00:00", - "2020-11-20T00:00:00", - "2020-11-23T00:00:00", - "2020-11-24T00:00:00", - "2020-11-25T00:00:00", - "2020-11-27T00:00:00", - "2020-11-30T00:00:00", - "2020-12-01T00:00:00", - "2020-12-02T00:00:00", - "2020-12-03T00:00:00", - "2020-12-04T00:00:00", - "2020-12-07T00:00:00", - "2020-12-08T00:00:00", - "2020-12-09T00:00:00", - "2020-12-10T00:00:00", - "2020-12-11T00:00:00", - "2020-12-14T00:00:00", - "2020-12-15T00:00:00", - "2020-12-16T00:00:00", - "2020-12-17T00:00:00", - "2020-12-18T00:00:00", - "2020-12-21T00:00:00", - "2020-12-22T00:00:00", - "2020-12-23T00:00:00", - "2020-12-24T00:00:00", - "2020-12-28T00:00:00", - "2020-12-29T00:00:00", - "2020-12-30T00:00:00", - "2020-12-31T00:00:00", - "2021-01-01T00:00:00", - "2021-01-04T00:00:00", - "2021-01-06T00:00:00", - "2021-01-07T00:00:00", - "2021-01-08T00:00:00", - "2021-01-11T00:00:00", - "2021-01-12T00:00:00", - "2021-01-13T00:00:00", - "2021-01-14T00:00:00", - "2021-01-15T00:00:00", - "2021-01-19T00:00:00", - "2021-01-20T00:00:00", - "2021-01-21T00:00:00", - "2021-01-22T00:00:00", - "2021-01-25T00:00:00", - "2021-01-26T00:00:00", - "2021-01-27T00:00:00", - "2021-01-28T00:00:00", - "2021-01-29T00:00:00", - "2021-02-01T00:00:00", - "2021-02-02T00:00:00", - "2021-02-03T00:00:00", - "2021-02-04T00:00:00", - "2021-02-05T00:00:00", - "2021-02-08T00:00:00", - "2021-02-09T00:00:00", - "2021-02-10T00:00:00", - "2021-02-11T00:00:00", - "2021-02-12T00:00:00", - "2021-02-16T00:00:00", - "2021-02-17T00:00:00", - "2021-02-18T00:00:00", - "2021-02-19T00:00:00", - "2021-02-22T00:00:00", - "2021-02-23T00:00:00", - "2021-02-24T00:00:00", - "2021-02-25T00:00:00", - "2021-02-26T00:00:00", - "2021-03-01T00:00:00", - "2021-03-02T00:00:00", - "2021-03-03T00:00:00", - "2021-03-04T00:00:00", - "2021-03-05T00:00:00", - "2021-03-08T00:00:00", - "2021-03-09T00:00:00", - "2021-03-10T00:00:00", - "2021-03-11T00:00:00", - "2021-03-12T00:00:00", - "2021-03-15T00:00:00", - "2021-03-16T00:00:00", - "2021-03-17T00:00:00", - "2021-03-18T00:00:00", - "2021-03-19T00:00:00", - "2021-03-22T00:00:00", - "2021-03-23T00:00:00", - "2021-03-24T00:00:00", - "2021-03-25T00:00:00", - "2021-03-26T00:00:00", - "2021-03-29T00:00:00", - "2021-03-30T00:00:00", - "2021-03-31T00:00:00", - "2021-04-01T00:00:00", - "2021-04-05T00:00:00", - "2021-04-06T00:00:00", - "2021-04-07T00:00:00", - "2021-04-08T00:00:00", - "2021-04-09T00:00:00", - "2021-04-12T00:00:00", - "2021-04-13T00:00:00", - "2021-04-14T00:00:00", - "2021-04-15T00:00:00", - "2021-04-16T00:00:00", - "2021-04-19T00:00:00", - "2021-04-20T00:00:00", - "2021-04-21T00:00:00", - "2021-04-22T00:00:00", - "2021-04-23T00:00:00", - "2021-04-26T00:00:00", - "2021-04-27T00:00:00", - "2021-04-28T00:00:00", - "2021-04-29T00:00:00", - "2021-04-30T00:00:00", - "2021-05-03T00:00:00", - "2021-05-04T00:00:00", - "2021-05-05T00:00:00", - "2021-05-06T00:00:00", - "2021-05-07T00:00:00", - "2021-05-10T00:00:00", - "2021-05-11T00:00:00", - "2021-05-12T00:00:00", - "2021-05-13T00:00:00", - "2021-05-14T00:00:00", - "2021-05-17T00:00:00", - "2021-05-18T00:00:00", - "2021-05-19T00:00:00", - "2021-05-20T00:00:00", - "2021-05-21T00:00:00", - "2021-05-24T00:00:00", - "2021-05-25T00:00:00", - "2021-05-26T00:00:00", - "2021-05-27T00:00:00", - "2021-05-28T00:00:00", - "2021-06-01T00:00:00", - "2021-06-02T00:00:00", - "2021-06-03T00:00:00", - "2021-06-04T00:00:00", - "2021-06-07T00:00:00", - "2021-06-08T00:00:00", - "2021-06-09T00:00:00", - "2021-06-10T00:00:00", - "2021-06-11T00:00:00", - "2021-06-14T00:00:00", - "2021-06-15T00:00:00", - "2021-06-16T00:00:00", - "2021-06-17T00:00:00", - "2021-06-18T00:00:00", - "2021-06-21T00:00:00", - "2021-06-22T00:00:00", - "2021-06-23T00:00:00", - "2021-06-24T00:00:00", - "2021-06-25T00:00:00", - "2021-06-28T00:00:00", - "2021-06-29T00:00:00", - "2021-06-30T00:00:00", - "2021-07-01T00:00:00", - "2021-07-02T00:00:00", - "2021-07-05T00:00:00", - "2021-07-06T00:00:00", - "2021-07-07T00:00:00", - "2021-07-08T00:00:00", - "2021-07-09T00:00:00", - "2021-07-12T00:00:00", - "2021-07-13T00:00:00", - "2021-07-14T00:00:00", - "2021-07-15T00:00:00", - "2021-07-16T00:00:00", - "2021-07-19T00:00:00", - "2021-07-20T00:00:00", - "2021-07-21T00:00:00", - "2021-07-22T00:00:00", - "2021-07-23T00:00:00", - "2021-07-26T00:00:00", - "2021-07-27T00:00:00", - "2021-07-28T00:00:00", - "2021-07-29T00:00:00", - "2021-07-30T00:00:00", - "2021-08-02T00:00:00", - "2021-08-03T00:00:00", - "2021-08-04T00:00:00", - "2021-08-05T00:00:00", - "2021-08-06T00:00:00", - "2021-08-09T00:00:00", - "2021-08-10T00:00:00", - "2021-08-11T00:00:00", - "2021-08-12T00:00:00", - "2021-08-13T00:00:00", - "2021-08-16T00:00:00", - "2021-08-17T00:00:00", - "2021-08-18T00:00:00", - "2021-08-19T00:00:00", - "2021-08-20T00:00:00", - "2021-08-23T00:00:00", - "2021-08-24T00:00:00", - "2021-08-25T00:00:00", - "2021-08-26T00:00:00", - "2021-08-27T00:00:00", - "2021-08-30T00:00:00", - "2021-08-31T00:00:00", - "2021-09-01T00:00:00", - "2021-09-02T00:00:00", - "2021-09-03T00:00:00", - "2021-09-07T00:00:00", - "2021-09-08T00:00:00", - "2021-09-09T00:00:00", - "2021-09-10T00:00:00", - "2021-09-13T00:00:00", - "2021-09-14T00:00:00", - "2021-09-15T00:00:00", - "2021-09-16T00:00:00", - "2021-09-17T00:00:00", - "2021-09-20T00:00:00", - "2021-09-21T00:00:00", - "2021-09-22T00:00:00", - "2021-09-23T00:00:00", - "2021-09-24T00:00:00", - "2021-09-27T00:00:00", - "2021-09-28T00:00:00", - "2021-09-29T00:00:00", - "2021-09-30T00:00:00", - "2021-10-01T00:00:00", - "2021-10-04T00:00:00", - "2021-10-05T00:00:00", - "2021-10-06T00:00:00", - "2021-10-07T00:00:00", - "2021-10-08T00:00:00", - "2021-10-11T00:00:00", - "2021-10-12T00:00:00", - "2021-10-13T00:00:00", - "2021-10-14T00:00:00", - "2021-10-15T00:00:00", - "2021-10-18T00:00:00", - "2021-10-19T00:00:00", - "2021-10-20T00:00:00", - "2021-10-21T00:00:00", - "2021-10-22T00:00:00", - "2021-10-25T00:00:00", - "2021-10-26T00:00:00", - "2021-10-27T00:00:00", - "2021-10-28T00:00:00", - "2021-10-29T00:00:00", - "2021-11-01T00:00:00", - "2021-11-02T00:00:00", - "2021-11-03T00:00:00", - "2021-11-04T00:00:00", - "2021-11-05T00:00:00", - "2021-11-08T00:00:00", - "2021-11-09T00:00:00", - "2021-11-10T00:00:00", - "2021-11-11T00:00:00", - "2021-11-12T00:00:00", - "2021-11-15T00:00:00", - "2021-11-16T00:00:00", - "2021-11-17T00:00:00", - "2021-11-18T00:00:00", - "2021-11-19T00:00:00", - "2021-11-22T00:00:00", - "2021-11-23T00:00:00", - "2021-11-24T00:00:00", - "2021-11-25T00:00:00", - "2021-11-26T00:00:00", - "2021-11-29T00:00:00", - "2021-11-30T00:00:00", - "2021-12-01T00:00:00", - "2021-12-02T00:00:00", - "2021-12-03T00:00:00", - "2021-12-06T00:00:00", - "2021-12-07T00:00:00", - "2021-12-08T00:00:00", - "2021-12-09T00:00:00", - "2021-12-10T00:00:00", - "2021-12-13T00:00:00", - "2021-12-14T00:00:00", - "2021-12-15T00:00:00", - "2021-12-16T00:00:00", - "2021-12-17T00:00:00", - "2021-12-20T00:00:00", - "2021-12-21T00:00:00", - "2021-12-22T00:00:00", - "2021-12-23T00:00:00", - "2021-12-27T00:00:00", - "2021-12-28T00:00:00", - "2021-12-29T00:00:00", - "2021-12-30T00:00:00", - "2021-12-31T00:00:00", - "2022-01-03T00:00:00", - "2022-01-05T00:00:00", - "2022-01-06T00:00:00", - "2022-01-07T00:00:00", - "2022-01-10T00:00:00", - "2022-01-11T00:00:00", - "2022-01-12T00:00:00", - "2022-01-13T00:00:00", - "2022-01-14T00:00:00", - "2022-01-18T00:00:00", - "2022-01-19T00:00:00", - "2022-01-20T00:00:00", - "2022-01-21T00:00:00", - "2022-01-24T00:00:00", - "2022-01-25T00:00:00", - "2022-01-26T00:00:00", - "2022-01-27T00:00:00", - "2022-01-28T00:00:00", - "2022-01-31T00:00:00", - "2022-02-01T00:00:00", - "2022-02-02T00:00:00", - "2022-02-03T00:00:00", - "2022-02-04T00:00:00", - "2022-02-07T00:00:00", - "2022-02-08T00:00:00", - "2022-02-09T00:00:00", - "2022-02-10T00:00:00", - "2022-02-11T00:00:00", - "2022-02-14T00:00:00", - "2022-02-15T00:00:00", - "2022-02-16T00:00:00", - "2022-02-17T00:00:00", - "2022-02-18T00:00:00", - "2022-02-22T00:00:00", - "2022-02-23T00:00:00", - "2022-02-24T00:00:00", - "2022-02-25T00:00:00", - "2022-02-28T00:00:00", - "2022-03-01T00:00:00", - "2022-03-02T00:00:00", - "2022-03-03T00:00:00", - "2022-03-04T00:00:00", - "2022-03-07T00:00:00", - "2022-03-08T00:00:00", - "2022-03-09T00:00:00", - "2022-03-10T00:00:00", - "2022-03-11T00:00:00", - "2022-03-14T00:00:00", - "2022-03-15T00:00:00", - "2022-03-16T00:00:00", - "2022-03-17T00:00:00", - "2022-03-18T00:00:00", - "2022-03-21T00:00:00", - "2022-03-22T00:00:00", - "2022-03-23T00:00:00", - "2022-03-24T00:00:00", - "2022-03-25T00:00:00", - "2022-03-28T00:00:00", - "2022-03-29T00:00:00", - "2022-03-30T00:00:00", - "2022-03-31T00:00:00", - "2022-04-01T00:00:00", - "2022-04-04T00:00:00", - "2022-04-05T00:00:00", - "2022-04-06T00:00:00", - "2022-04-07T00:00:00", - "2022-04-08T00:00:00", - "2022-04-11T00:00:00", - "2022-04-12T00:00:00", - "2022-04-13T00:00:00", - "2022-04-14T00:00:00", - "2022-04-18T00:00:00", - "2022-04-19T00:00:00", - "2022-04-20T00:00:00", - "2022-04-21T00:00:00", - "2022-04-22T00:00:00", - "2022-04-25T00:00:00", - "2022-04-26T00:00:00", - "2022-04-27T00:00:00", - "2022-04-28T00:00:00", - "2022-04-29T00:00:00", - "2022-05-03T00:00:00", - "2022-05-04T00:00:00", - "2022-05-05T00:00:00", - "2022-05-06T00:00:00", - "2022-05-09T00:00:00", - "2022-05-10T00:00:00", - "2022-08-01T00:00:00", - "2022-08-02T00:00:00", - "2022-08-03T00:00:00", - "2022-08-04T00:00:00", - "2022-08-05T00:00:00", - "2022-08-08T00:00:00", - "2022-08-09T00:00:00", - "2022-08-10T00:00:00", - "2022-08-11T00:00:00", - "2022-08-12T00:00:00", - "2022-08-15T00:00:00", - "2022-08-16T00:00:00", - "2022-08-17T00:00:00", - "2022-08-18T00:00:00", - "2022-08-19T00:00:00", - "2022-08-22T00:00:00", - "2022-08-23T00:00:00", - "2022-08-24T00:00:00", - "2022-08-25T00:00:00", - "2022-08-26T00:00:00", - "2022-08-29T00:00:00", - "2022-08-30T00:00:00", - "2022-08-31T00:00:00", - "2022-09-01T00:00:00", - "2022-09-02T00:00:00", - "2022-09-06T00:00:00", - "2022-09-07T00:00:00", - "2022-09-14T00:00:00", - "2022-09-15T00:00:00", - "2022-10-27T00:00:00", - "2022-10-28T00:00:00", - "2022-10-31T00:00:00", - "2022-11-01T00:00:00", - "2022-11-02T00:00:00", - "2022-11-03T00:00:00", - "2022-11-04T00:00:00", - "2022-11-14T00:00:00", - "2022-11-15T00:00:00", - "2022-11-16T00:00:00", - "2022-11-17T00:00:00", - "2022-11-18T00:00:00", - "2022-11-21T00:00:00", - "2022-11-22T00:00:00", - "2022-11-23T00:00:00", - "2022-11-25T00:00:00", - "2022-11-28T00:00:00", - "2022-11-29T00:00:00", - "2022-11-30T00:00:00", - "2022-12-01T00:00:00", - "2022-12-02T00:00:00", - "2022-12-05T00:00:00", - "2022-12-06T00:00:00", - "2022-12-07T00:00:00", - "2022-12-08T00:00:00", - "2022-12-09T00:00:00", - "2022-12-12T00:00:00", - "2022-12-13T00:00:00", - "2022-12-14T00:00:00", - "2022-12-15T00:00:00", - "2022-12-16T00:00:00", - "2022-12-19T00:00:00", - "2022-12-20T00:00:00", - "2022-12-21T00:00:00", - "2022-12-22T00:00:00", - "2022-12-23T00:00:00", - "2022-12-27T00:00:00", - "2022-12-28T00:00:00", - "2022-12-29T00:00:00", - "2022-12-30T00:00:00", - "2023-01-02T00:00:00", - "2023-01-03T00:00:00", - "2023-01-05T00:00:00", - "2023-01-06T00:00:00", - "2023-01-09T00:00:00", - "2023-01-10T00:00:00", - "2023-01-11T00:00:00", - "2023-01-12T00:00:00", - "2023-01-13T00:00:00", - "2023-01-17T00:00:00", - "2023-01-18T00:00:00", - "2023-01-19T00:00:00", - "2023-01-20T00:00:00", - "2023-01-23T00:00:00", - "2023-01-24T00:00:00", - "2023-01-25T00:00:00", - "2023-01-26T00:00:00", - "2023-01-27T00:00:00", - "2023-01-30T00:00:00", - "2023-01-31T00:00:00", - "2023-02-01T00:00:00", - "2023-02-02T00:00:00", - "2023-02-03T00:00:00", - "2023-02-06T00:00:00", - "2023-02-07T00:00:00", - "2023-02-08T00:00:00", - "2023-02-09T00:00:00", - "2023-02-10T00:00:00", - "2023-02-13T00:00:00", - "2023-02-14T00:00:00", - "2023-02-15T00:00:00", - "2023-02-16T00:00:00", - "2023-02-17T00:00:00", - "2023-02-21T00:00:00", - "2023-02-22T00:00:00", - "2023-02-23T00:00:00", - "2023-02-24T00:00:00", - "2023-02-27T00:00:00", - "2023-02-28T00:00:00", - "2023-03-01T00:00:00", - "2023-03-02T00:00:00", - "2023-03-03T00:00:00", - "2023-03-06T00:00:00", - "2023-03-07T00:00:00", - "2023-03-08T00:00:00", - "2023-03-09T00:00:00", - "2023-03-10T00:00:00", - "2023-03-13T00:00:00", - "2023-03-14T00:00:00", - "2023-03-15T00:00:00", - "2023-03-16T00:00:00", - "2023-03-17T00:00:00", - "2023-03-20T00:00:00", - "2023-03-21T00:00:00", - "2023-03-22T00:00:00", - "2023-03-23T00:00:00", - "2023-03-24T00:00:00", - "2023-03-27T00:00:00", - "2023-03-28T00:00:00", - "2023-03-29T00:00:00", - "2023-03-30T00:00:00", - "2023-03-31T00:00:00", - "2023-04-03T00:00:00", - "2023-04-04T00:00:00", - "2023-04-05T00:00:00", - "2023-04-06T00:00:00", - "2023-04-07T00:00:00", - "2023-04-10T00:00:00", - "2023-04-11T00:00:00", - "2023-04-12T00:00:00", - "2023-04-13T00:00:00", - "2023-04-14T00:00:00", - "2023-04-17T00:00:00", - "2023-04-18T00:00:00", - "2023-04-19T00:00:00", - "2023-04-20T00:00:00", - "2023-04-21T00:00:00", - "2023-04-24T00:00:00", - "2023-04-25T00:00:00", - "2023-04-26T00:00:00", - "2023-04-27T00:00:00", - "2023-04-28T00:00:00", - "2023-05-01T00:00:00", - "2023-05-02T00:00:00", - "2023-05-03T00:00:00", - "2023-05-04T00:00:00", - "2023-05-05T00:00:00", - "2023-05-08T00:00:00", - "2023-05-09T00:00:00", - "2023-05-10T00:00:00", - "2023-05-11T00:00:00", - "2023-05-12T00:00:00", - "2023-05-15T00:00:00", - "2023-05-16T00:00:00", - "2023-05-17T00:00:00", - "2023-05-18T00:00:00", - "2023-05-19T00:00:00", - "2023-05-22T00:00:00", - "2023-05-23T00:00:00", - "2023-05-24T00:00:00", - "2023-05-25T00:00:00", - "2023-05-26T00:00:00", - "2023-05-30T00:00:00", - "2023-05-31T00:00:00", - "2023-06-01T00:00:00", - "2023-06-02T00:00:00", - "2023-06-05T00:00:00", - "2023-06-06T00:00:00", - "2023-06-07T00:00:00", - "2023-06-08T00:00:00", - "2023-06-09T00:00:00", - "2023-06-12T00:00:00", - "2023-06-13T00:00:00", - "2023-06-14T00:00:00", - "2023-06-15T00:00:00", - "2023-06-16T00:00:00", - "2023-06-19T00:00:00", - "2023-06-20T00:00:00", - "2023-06-21T00:00:00", - "2023-06-22T00:00:00", - "2023-06-23T00:00:00", - "2023-06-26T00:00:00", - "2023-06-27T00:00:00", - "2023-06-28T00:00:00", - "2023-06-29T00:00:00", - "2023-06-30T00:00:00", - "2023-07-03T00:00:00", - "2023-07-05T00:00:00", - "2023-07-06T00:00:00", - "2023-07-07T00:00:00", - "2023-07-10T00:00:00", - "2023-07-11T00:00:00", - "2023-07-12T00:00:00", - "2023-07-13T00:00:00", - "2023-07-14T00:00:00", - "2023-07-17T00:00:00", - "2023-07-18T00:00:00", - "2023-07-19T00:00:00", - "2023-07-20T00:00:00", - "2023-07-21T00:00:00", - "2023-07-24T00:00:00", - "2023-07-25T00:00:00", - "2023-07-26T00:00:00", - "2023-07-27T00:00:00", - "2023-07-28T00:00:00", - "2023-07-31T00:00:00", - "2023-08-01T00:00:00", - "2023-08-02T00:00:00", - "2023-08-03T00:00:00", - "2023-08-04T00:00:00", - "2023-08-07T00:00:00", - "2023-08-08T00:00:00", - "2023-08-09T00:00:00", - "2023-08-10T00:00:00", - "2023-08-11T00:00:00", - "2023-08-14T00:00:00", - "2023-08-15T00:00:00", - "2023-08-16T00:00:00", - "2023-08-17T00:00:00", - "2023-08-18T00:00:00", - "2023-08-21T00:00:00", - "2023-08-22T00:00:00", - "2023-08-23T00:00:00", - "2023-08-24T00:00:00", - "2023-08-25T00:00:00", - "2023-08-28T00:00:00", - "2023-08-29T00:00:00", - "2023-08-30T00:00:00", - "2023-08-31T00:00:00", - "2023-09-01T00:00:00", - "2023-09-05T00:00:00", - "2023-09-06T00:00:00", - "2023-09-07T00:00:00", - "2023-09-08T00:00:00", - "2023-09-11T00:00:00", - "2023-09-12T00:00:00", - "2023-09-13T00:00:00", - "2023-09-14T00:00:00", - "2023-09-15T00:00:00", - "2023-09-18T00:00:00", - "2023-09-19T00:00:00", - "2023-09-20T00:00:00", - "2023-09-21T00:00:00", - "2023-09-22T00:00:00", - "2023-09-25T00:00:00", - "2023-09-26T00:00:00", - "2023-09-27T00:00:00", - "2023-09-28T00:00:00", - "2023-09-29T00:00:00", - "2023-10-02T00:00:00", - "2023-10-03T00:00:00", - "2023-10-04T00:00:00", - "2023-10-05T00:00:00", - "2023-10-06T00:00:00", - "2023-10-09T00:00:00", - "2023-10-10T00:00:00", - "2023-10-11T00:00:00", - "2023-10-12T00:00:00", - "2023-10-13T00:00:00", - "2023-10-16T00:00:00", - "2023-10-17T00:00:00", - "2023-10-18T00:00:00", - "2023-10-19T00:00:00", - "2023-10-20T00:00:00", - "2023-10-23T00:00:00", - "2023-10-24T00:00:00", - "2023-10-25T00:00:00", - "2023-10-26T00:00:00", - "2023-10-27T00:00:00", - "2023-10-30T00:00:00", - "2023-10-31T00:00:00", - "2023-11-01T00:00:00", - "2023-11-02T00:00:00", - "2023-11-03T00:00:00", - "2023-11-06T00:00:00", - "2023-11-07T00:00:00", - "2023-11-08T00:00:00", - "2023-11-09T00:00:00", - "2023-11-10T00:00:00", - "2023-11-13T00:00:00", - "2023-11-14T00:00:00", - "2023-11-15T00:00:00", - "2023-11-16T00:00:00", - "2023-11-17T00:00:00", - "2023-11-20T00:00:00", - "2023-11-21T00:00:00", - "2023-11-22T00:00:00", - "2023-11-23T00:00:00", - "2023-11-24T00:00:00", - "2023-11-27T00:00:00", - "2023-11-28T00:00:00", - "2023-11-29T00:00:00", - "2023-11-30T00:00:00", - "2023-12-01T00:00:00", - "2023-12-04T00:00:00", - "2023-12-05T00:00:00", - "2023-12-06T00:00:00", - "2023-12-07T00:00:00", - "2023-12-08T00:00:00", - "2023-12-11T00:00:00", - "2023-12-12T00:00:00", - "2023-12-13T00:00:00", - "2023-12-14T00:00:00", - "2023-12-15T00:00:00", - "2023-12-18T00:00:00", - "2023-12-19T00:00:00", - "2023-12-20T00:00:00", - "2023-12-21T00:00:00", - "2023-12-22T00:00:00", - "2023-12-25T00:00:00", - "2023-12-26T00:00:00", - "2023-12-27T00:00:00", - "2023-12-28T00:00:00", - "2023-12-29T00:00:00", - "2024-01-01T00:00:00", - "2024-01-02T00:00:00", - "2024-01-04T00:00:00", - "2024-01-05T00:00:00", - "2024-01-08T00:00:00", - "2024-01-09T00:00:00", - "2024-01-10T00:00:00", - "2024-01-11T00:00:00", - "2024-01-12T00:00:00", - "2024-01-15T00:00:00", - "2024-01-16T00:00:00", - "2024-01-17T00:00:00", - "2024-01-18T00:00:00", - "2024-01-19T00:00:00", - "2024-01-22T00:00:00", - "2024-01-23T00:00:00", - "2024-01-24T00:00:00", - "2024-01-25T00:00:00", - "2024-01-26T00:00:00", - "2024-01-29T00:00:00", - "2024-01-30T00:00:00", - "2024-01-31T00:00:00", - "2024-02-01T00:00:00", - "2024-02-02T00:00:00", - "2024-02-05T00:00:00", - "2024-02-06T00:00:00", - "2024-02-07T00:00:00", - "2024-02-08T00:00:00", - "2024-02-09T00:00:00", - "2024-02-12T00:00:00", - "2024-02-13T00:00:00", - "2024-02-14T00:00:00", - "2024-02-15T00:00:00", - "2024-02-16T00:00:00", - "2024-02-20T00:00:00", - "2024-02-21T00:00:00", - "2024-02-22T00:00:00", - "2024-02-23T00:00:00", - "2024-02-26T00:00:00", - "2024-02-27T00:00:00", - "2024-02-28T00:00:00", - "2024-02-29T00:00:00", - "2024-03-01T00:00:00", - "2024-03-04T00:00:00", - "2024-03-05T00:00:00", - "2024-03-06T00:00:00", - "2024-03-07T00:00:00", - "2024-03-08T00:00:00", - "2024-03-11T00:00:00", - "2024-03-12T00:00:00", - "2024-03-13T00:00:00", - "2024-03-14T00:00:00", - "2024-03-15T00:00:00", - "2024-03-18T00:00:00", - "2024-03-19T00:00:00", - "2024-03-20T00:00:00", - "2024-03-21T00:00:00", - "2024-03-22T00:00:00", - "2024-03-25T00:00:00", - "2024-03-26T00:00:00", - "2024-03-27T00:00:00", - "2024-03-28T00:00:00", - "2024-04-01T00:00:00", - "2024-04-02T00:00:00", - "2024-04-03T00:00:00", - "2024-04-04T00:00:00", - "2024-04-05T00:00:00", - "2024-04-08T00:00:00", - "2024-04-09T00:00:00", - "2024-04-10T00:00:00", - "2024-04-11T00:00:00", - "2024-04-12T00:00:00", - "2024-04-15T00:00:00", - "2024-04-16T00:00:00", - "2024-04-17T00:00:00", - "2024-04-18T00:00:00", - "2024-04-19T00:00:00", - "2024-04-22T00:00:00", - "2024-04-23T00:00:00", - "2024-04-24T00:00:00", - "2024-04-25T00:00:00", - "2024-04-26T00:00:00", - "2024-04-29T00:00:00", - "2024-04-30T00:00:00", - "2024-05-01T00:00:00", - "2024-05-02T00:00:00", - "2024-05-03T00:00:00", - "2024-05-06T00:00:00", - "2024-05-07T00:00:00", - "2024-05-08T00:00:00", - "2024-05-09T00:00:00", - "2024-05-10T00:00:00", - "2024-05-13T00:00:00", - "2024-05-14T00:00:00", - "2024-05-15T00:00:00", - "2024-05-16T00:00:00", - "2024-05-17T00:00:00", - "2024-05-20T00:00:00", - "2024-05-21T00:00:00", - "2024-05-22T00:00:00", - "2024-05-23T00:00:00", - "2024-05-24T00:00:00", - "2024-05-28T00:00:00", - "2024-05-29T00:00:00", - "2024-05-30T00:00:00", - "2024-05-31T00:00:00", - "2024-06-03T00:00:00", - "2024-06-04T00:00:00", - "2024-06-05T00:00:00", - "2024-06-06T00:00:00", - "2024-06-07T00:00:00", - "2024-06-10T00:00:00", - "2024-06-11T00:00:00", - "2024-06-12T00:00:00", - "2024-06-13T00:00:00", - "2024-06-14T00:00:00", - "2024-06-17T00:00:00", - "2024-06-18T00:00:00", - "2024-06-20T00:00:00", - "2024-06-21T00:00:00", - "2024-06-24T00:00:00", - "2024-06-25T00:00:00", - "2024-06-26T00:00:00", - "2024-06-27T00:00:00", - "2024-06-28T00:00:00", - "2024-07-01T00:00:00", - "2024-07-02T00:00:00", - "2024-07-03T00:00:00", - "2024-07-05T00:00:00", - "2024-07-08T00:00:00", - "2024-07-09T00:00:00", - "2024-07-10T00:00:00", - "2024-07-11T00:00:00", - "2024-07-12T00:00:00", - "2024-07-15T00:00:00", - "2024-07-16T00:00:00", - "2024-07-17T00:00:00", - "2024-07-18T00:00:00", - "2024-07-19T00:00:00", - "2024-07-22T00:00:00", - "2024-07-23T00:00:00", - "2024-07-24T00:00:00", - "2024-07-25T00:00:00", - "2024-07-26T00:00:00", - "2024-07-29T00:00:00", - "2024-07-30T00:00:00", - "2024-07-31T00:00:00", - "2024-08-01T00:00:00", - "2024-08-02T00:00:00", - "2024-08-05T00:00:00", - "2024-08-06T00:00:00", - "2024-08-07T00:00:00", - "2024-08-08T00:00:00", - "2024-08-09T00:00:00", - "2024-08-12T00:00:00", - "2024-08-13T00:00:00", - "2024-08-14T00:00:00", - "2024-08-15T00:00:00", - "2024-08-16T00:00:00", - "2024-08-19T00:00:00", - "2024-08-20T00:00:00", - "2024-08-21T00:00:00", - "2024-08-22T00:00:00", - "2024-08-23T00:00:00", - "2024-08-26T00:00:00", - "2024-08-27T00:00:00", - "2024-08-28T00:00:00", - "2024-08-29T00:00:00", - "2024-08-30T00:00:00", - "2024-09-03T00:00:00", - "2024-09-04T00:00:00", - "2024-09-05T00:00:00", - "2024-09-06T00:00:00", - "2024-09-09T00:00:00", - "2024-09-10T00:00:00", - "2024-09-11T00:00:00", - "2024-09-12T00:00:00", - "2024-09-13T00:00:00", - "2024-09-16T00:00:00", - "2024-09-17T00:00:00", - "2024-09-18T00:00:00", - "2024-09-19T00:00:00", - "2024-09-20T00:00:00", - "2024-09-23T00:00:00", - "2024-09-24T00:00:00", - "2024-09-25T00:00:00", - "2024-09-26T00:00:00", - "2024-09-27T00:00:00", - "2024-09-30T00:00:00", - "2024-10-01T00:00:00", - "2024-10-02T00:00:00", - "2024-10-03T00:00:00", - "2024-10-04T00:00:00", - "2024-10-07T00:00:00", - "2024-10-08T00:00:00", - "2024-10-09T00:00:00", - "2024-10-10T00:00:00", - "2024-10-11T00:00:00", - "2024-10-14T00:00:00", - "2024-10-15T00:00:00", - "2024-10-16T00:00:00", - "2024-10-17T00:00:00", - "2024-10-18T00:00:00", - "2024-10-21T00:00:00", - "2024-10-22T00:00:00", - "2024-10-23T00:00:00", - "2024-10-24T00:00:00", - "2024-10-25T00:00:00", - "2024-10-28T00:00:00", - "2024-10-29T00:00:00", - "2024-10-30T00:00:00", - "2024-10-31T00:00:00", - "2024-11-01T00:00:00", - "2024-11-04T00:00:00", - "2024-11-05T00:00:00", - "2024-11-06T00:00:00", - "2024-11-07T00:00:00", - "2024-11-08T00:00:00", - "2024-11-11T00:00:00", - "2024-11-12T00:00:00", - "2024-11-13T00:00:00", - "2024-11-14T00:00:00", - "2024-11-15T00:00:00", - "2024-11-18T00:00:00", - "2024-11-19T00:00:00", - "2024-11-20T00:00:00", - "2024-11-21T00:00:00", - "2024-11-22T00:00:00", - "2024-11-25T00:00:00", - "2024-11-26T00:00:00", - "2024-11-27T00:00:00", - "2024-11-28T00:00:00", - "2024-11-29T00:00:00", - "2024-12-02T00:00:00", - "2024-12-03T00:00:00", - "2024-12-04T00:00:00", - "2024-12-05T00:00:00", - "2024-12-06T00:00:00", - "2024-12-09T00:00:00", - "2024-12-10T00:00:00", - "2024-12-11T00:00:00", - "2024-12-12T00:00:00", - "2024-12-13T00:00:00", - "2024-12-16T00:00:00", - "2024-12-17T00:00:00", - "2024-12-18T00:00:00", - "2024-12-19T00:00:00", - "2024-12-20T00:00:00", - "2024-12-23T00:00:00", - "2024-12-24T00:00:00", - "2024-12-25T00:00:00", - "2024-12-26T00:00:00", - "2024-12-27T00:00:00", - "2024-12-30T00:00:00", - "2024-12-31T00:00:00", - "2025-01-01T00:00:00", - "2025-01-02T00:00:00", - "2025-01-06T00:00:00", - "2025-01-07T00:00:00", - "2025-01-08T00:00:00", - "2025-01-09T00:00:00", - "2025-01-10T00:00:00", - "2025-01-13T00:00:00", - "2025-01-14T00:00:00", - "2025-01-15T00:00:00", - "2025-01-16T00:00:00", - "2025-01-17T00:00:00", - "2025-01-21T00:00:00", - "2025-01-22T00:00:00", - "2025-01-23T00:00:00", - "2025-01-24T00:00:00", - "2025-01-27T00:00:00", - "2025-01-28T00:00:00", - "2025-01-29T00:00:00", - "2025-01-30T00:00:00", - "2025-01-31T00:00:00", - "2025-02-03T00:00:00", - "2025-02-04T00:00:00", - "2025-02-05T00:00:00", - "2025-02-06T00:00:00", - "2025-02-07T00:00:00", - "2025-02-10T00:00:00", - "2025-02-11T00:00:00", - "2025-02-12T00:00:00", - "2025-02-13T00:00:00", - "2025-02-14T00:00:00", - "2025-02-18T00:00:00", - "2025-02-19T00:00:00", - "2025-02-20T00:00:00", - "2025-02-21T00:00:00", - "2025-02-24T00:00:00", - "2025-02-25T00:00:00", - "2025-02-26T00:00:00", - "2025-02-27T00:00:00", - "2025-02-28T00:00:00", - "2025-03-03T00:00:00" - ], - "xaxis": "x", - "y": [ - 0, - -0.0026482495848623167, - 0, - 0, - -0.014360220875776486, - -0.04345527708495878, - -0.032516534922193085, - -0.014210375092725047, - -0.07921148365833053, - -0.097817335053902, - -0.009220854767699627, - -0.040738417802882565, - -0.05125259691366846, - 0, - 0, - 0, - -0.02187374161465694, - -0.037761845525504545, - -0.03161087958287656, - -0.00028861758720555297, - -0.0194678287367287, - 0, - 0, - 0, - 0, - -0.01150548096437165, - -0.00802217021369056, - -0.02121652911778671, - 0, - -0.018524997091443396, - -0.014359087938668358, - 0, - -0.004343489922770671, - -0.06340384538842836, - -0.0752221784341055, - -0.060474514975397575, - -0.07603026958252801, - -0.04613089709090068, - -0.08693950008622975, - -0.10269727748046575, - -0.11239437126153407, - -0.11047515478403092, - -0.14437457846034907, - -0.11275801227832394, - -0.14251596881897766, - -0.10833371324071173, - -0.09093955127092035, - -0.07700564085640249, - -0.07417732183692372, - -0.06555094882751511, - -0.034883889744886654, - -0.08864215339368431, - -0.07904607100616867, - -0.09650887808894393, - -0.07469041708153978, - -0.06759941725413332, - -0.018265452642948543, - 0, - 0, - 0, - 0, - -0.01903342021382981, - -0.053297457010592075, - -0.06080605397568073, - -0.06366296692791784, - -0.030330228979539076, - -0.06862604031496689, - -0.0827313374561035, - -0.09703065519065246, - -0.03478884882371425, - -0.0634650925301774, - -0.06462921609065675, - -0.041618373711857615, - -0.02061726687121135, - -0.006977619154266312, - 0, - -0.014560458394910714, - 0, - 0, - 0, - -0.014401320961246022, - -0.0009703017668922786, - -0.04637021075465331, - -0.022282894962496358, - -0.014516654409284069, - 0, - 0, - 0, - -0.00022954636461258726, - 0, - 0, - -0.11246386271941156, - -0.05253786287622142, - -0.022388293839298412, - -0.012835955134530619, - -0.016061331588540062, - 0, - 0, - 0, - -0.0003918244373284363, - -0.0003918244373288804, - 0, - 0, - -0.010159192507451675, - 0, - 0, - 0, - 0, - -0.13085876565584753, - -0.1432607223502237, - -0.09443802588722416, - -0.08678453722777413, - -0.11164544490280603, - -0.1283447707826424, - -0.10350666082212145, - -0.11178836802540393, - -0.06475668298772264, - -0.06332494211488615, - -0.06480679355814845, - -0.08987288066378618, - -0.17855589756889934, - -0.12718124791673502, - -0.19260087885145272, - -0.18872526738446038, - -0.2618045511852076, - -0.27922200507216277, - -0.3162568922964544, - -0.2922508989156116, - -0.2436119750048541, - -0.2104728183153839, - -0.15605338238793187, - -0.15184720406051921, - -0.14468872170383906, - -0.12777865049643056, - -0.057972048661539266, - -0.049571090863970046, - -0.039437506763509655, - -0.017109037810102312, - 0, - -0.06746351666906847, - 0, - -0.0413724594824858, - -0.12917399537711327, - -0.13343405729512636, - -0.11844085236289947, - -0.12457091548648114, - -0.029964345618923582, - -0.053491978852374666, - 0, - 0, - -0.09139304215718058, - -0.1756617056334101, - -0.1561194155085649, - -0.044328361764859436, - -0.1186666761857964, - -0.141263692923843, - -0.17344279998277856, - -0.2122985244927178, - -0.26433832966223947, - -0.20611941951943402, - -0.18905474153363488, - -0.20935325062461474, - -0.22111444559791749, - -0.18292538780812306, - -0.1827661838152529, - -0.11282587969736202, - -0.08452736996464294, - -0.0865870716224042, - -0.16058707755849166, - -0.1665671775406865, - -0.1469154346707432, - -0.15875623164048125, - -0.10039801800391446, - -0.03985074946537892, - -0.07407960793252144, - -0.10228856541925047, - -0.014079603119478645, - 0, - -0.01836397045239624, - -0.03359637602423704, - -0.06860641944144363, - -0.13240619917738994, - -0.16582932960254715, - -0.09765693802985709, - -0.16708927931166018, - -0.1582045257080209, - -0.11388851104113684, - -0.11098896631492072, - -0.10538579204669363, - -0.10364214690728146, - -0.046376138564528935, - 0, - -0.058054054652631915, - -0.08726214354139028, - 0, - -0.041355146472412674, - -0.04065830621507127, - 0, - -0.04291095735359385, - -0.01860354009826426, - -0.019085308728549633, - -0.11959976386545423, - -0.13043517833206386, - -0.04581032856495104, - -0.16838102753930329, - -0.08940600989099545, - -0.07702893580747083, - -0.01593191405758776, - -0.03034117581795459, - -0.05399163585016675, - -0.022445154398345935, - 0, - 0, - -0.02049332223438871, - 0, - -0.20766164911327545, - 0, - -0.025660818787294537, - -0.05513454922117511, - -0.10198917215013681, - -0.050338406716634365, - -0.06841617461836025, - -0.06273630334279279, - -0.002345900456575678, - -0.01443053986117493, - -0.044724123714633635, - -0.011356715576827825, - -0.00322376965459914, - -0.11332188536991727, - -0.14533716140449293, - -0.12107769871913854, - -0.1591352944560136, - -0.19096200420408582, - -0.1610373543894379, - -0.13126027819031483, - -0.13053880718108435, - -0.12338968536235229, - -0.14200035798680433, - -0.15601165292741637, - -0.1408688677301254, - -0.13598435055645708, - -0.08366950385309546, - -0.14648099155298444, - -0.1514001120704609, - -0.16605089267834416, - -0.14243911419445698, - -0.158524638286606, - -0.1777829951125256, - -0.18594053663734056, - -0.20336242180340236, - -0.20336242180340236, - -0.14658963495806465, - -0.14962301918864063, - -0.1255603213239853, - -0.08756011532647989, - -0.07680907843447082, - -0.048770091484855005, - -0.027781843943622486, - 0, - null, - -0.03172226289317437, - 0, - -0.15688631972560918, - -0.0386211786550974, - 0, - 0, - 0, - -0.012811440255209083, - 0, - 0, - -0.01585312712282383, - -0.013065764112217382, - -0.08871031652952299, - -0.07178081931554958, - -0.08969335973415649, - -0.10069348875815631, - -0.11036215420119733, - -0.16421743944833256, - -0.12432693143895934, - -0.1003108126422172, - -0.09097812399063254, - -0.03172550592096979, - -0.006807227221239609, - 0, - 0, - -0.01248212629320078, - 0, - 0, - 0, - 0, - -0.018910168539579053, - -0.09136941497189921, - -0.031933209137592455, - -0.00014866484700915006, - 0, - -0.034773526226877016, - -0.06726648405333102, - -0.025103666564972538, - -0.058516236405381616, - -0.03717009086930889, - -0.014369812609293597, - -0.055596297865259436, - -0.05754699001607544, - -0.10391215573790646, - -0.07809056506724366, - -0.032633864547079394, - -0.12243815776451572, - -0.30199658354408243, - -0.08346332859120686, - -0.0901547944414679, - -0.2644073375708138, - -0.06538100412610115, - -0.30804710768764676, - -0.2551833504005252, - -0.2327782576968639, - -0.21884474233389073, - -0.29801497662630594, - -0.2871747016739127, - -0.21059610123901074, - -0.19306773891239004, - -0.11392537165070027, - -0.1454708504324722, - -0.17464763160253893, - -0.03774041363644942, - -0.061784387634227556, - -0.08828593385460393, - -0.09837379897739618, - -0.15873378752979783, - -0.25952422932266905, - -0.20050185824511435, - -0.17315186328301901, - -0.15729098250579643, - -0.15774995869779052, - -0.13672884828081755, - -0.14759699026393702, - -0.20684229758730055, - -0.13468885887440496, - -0.07636316356499784, - -0.07680903605661316, - -0.054619017452000374, - -0.03346794113100615, - -0.09539417938501993, - -0.07953783890195576, - -0.10686186125288921, - -0.098223081727847, - -0.10009574321332626, - -0.11584061557348668, - -0.09034903185695753, - -0.10117393779367023, - -0.030369070800434383, - -0.015265140146971223, - -0.0025577741359393835, - -0.002675809181123978, - -0.017333867342972376, - -0.004737969454845503, - 0, - 0, - 0, - 0, - 0, - -0.02635206152871994, - -0.042329681007138964, - -0.0384245350405682, - -0.009919287425934509, - 0, - 0, - -0.026698740177182656, - -0.0170132782649679, - -0.00002781463236389836, - 0, - -0.02577633825259984, - -0.04323274540825561, - -0.1787514935548946, - -0.11607092249822049, - -0.14857823948972704, - -0.11242957334438652, - -0.09552488575749218, - -0.11229716064788253, - -0.1541837103083573, - -0.1113261342068601, - -0.06473893382052598, - -0.01982896092323072, - -0.04395014046954271, - -0.02853295978586179, - -0.016196510228325134, - -0.04859295811840969, - -0.023491104894490022, - -0.09870151650824055, - -0.12054961143124887, - -0.157625166452112, - -0.17558915561103028, - -0.1762291503107949, - -0.19873681602457527, - -0.1639387593835654, - -0.2183010248377436, - -0.24139864046679393, - -0.34183435068804746, - -0.36167860013730957, - -0.3249031805618535, - -0.2920206942635887, - -0.27785253573775914, - -0.2514630121644883, - -0.211425340351736, - -0.2320552384669159, - -0.22128821007857458, - -0.2605265058089875, - -0.24940737274747193, - -0.24958361032887755, - -0.27418755273128426, - -0.320649614822867, - -0.34664557844307387, - -0.3249154998036471, - -0.3164118641026623, - -0.24108684264465685, - -0.23362759407498335, - -0.20628772741879942, - -0.2424363935641386, - -0.15993990245542333, - -0.14140212494499094, - -0.1344945959440823, - -0.12379123631008271, - null, - -0.135664241429857, - -0.17610869967960852, - -0.19263821795974811, - -0.1874961915788762, - -0.1907844402087019, - -0.16004262583723672, - -0.13486214471889735, - -0.1387683192657413, - -0.16094744593000798, - -0.23681992102627314, - -0.2162738842855474, - -0.19656646128933675, - -0.18901893758866284, - -0.23152341316615088, - -0.1961692231998292, - -0.1667294670106435, - -0.16457784777649487, - -0.1348953349770552, - -0.1286895932676111, - -0.08456129474528029, - -0.014581184643397416, - -0.11620351545296381, - -0.07404758741294837, - -0.04960861739503053, - -0.2522706631495467, - -0.24048593316077438, - -0.36879824982880727, - -0.48095621752346995, - -0.3211538983168165, - -0.3580573168322273, - -0.3432195457359396, - -0.30847004041698045, - -0.342963547856031, - -0.33938840505044787, - -0.3388587542644387, - -0.3315253582969083, - -0.3419947888337487, - -0.291246174811824, - -0.3511550816727327, - -0.35500088286521003, - -0.38781744766208737, - -0.37514996636329245, - -0.37962992926164674, - -0.4031111141081931, - -0.3939967068322311, - -0.391458796815922, - -0.3821016329297042, - -0.38135129431618675, - -0.3860519450420462, - -0.41064524192872665, - -0.40210462300427796, - -0.40089083995299957, - -0.4175945228394574, - -0.4067366817262045, - -0.4085021843462461, - -0.41217442979593133, - -0.41288063084394744, - -0.4276726434805831, - -0.416020326188312, - -0.41284242147223815, - -0.42025753247641073, - -0.41531412514029586, - -0.4156672256643037, - -0.4125775960792316, - -0.4130189717342424, - -0.4161968764503161, - -0.4138134479132608, - -0.4135486225202545, - -0.4131955219962462, - -0.41098864372119503, - -0.4081638395291294, - -0.41398999817526483, - -0.41910995577338406, - -0.42131683404843556, - -0.4206989081314212, - -0.4256599704937363, - -0.42694878740636644, - -0.4260483810701454, - -0.4212462139436337, - -0.4269990943126465, - -0.4263635133694317, - -0.42572793242621687, - -0.42572793242621687, - -0.4275084423588854, - -0.42773795769949086, - -0.42906208466452167, - -0.4286207090095113, - -0.42641383073445993, - -0.42768322711826956, - -0.4272639202460098, - -0.42684461337375, - -0.42516738588471104, - -0.4243287721401915, - -0.4067178835052816, - -0.42349015839567195, - -0.4239094652679317, - -0.42223223777889274, - -0.4113302591001389, - -0.42310784912329413, - -0.4130003466235589, - -0.40176733620354743, - -0.39671358495368003, - -0.40569557953313906, - -0.40015631506275995, - -0.40603456416332706, - -0.3968318817563631, - -0.397570411596614, - -0.3996448771751623, - -0.39565042749731927, - -0.3957378483220927, - -0.39355303882979165, - -0.39015444628621276, - -0.3933102822195361, - -0.3905075468102208, - -0.3843724252055781, - -0.3846028836835991, - -0.3751133071008782, - -0.37469400022861865, - -0.37469400022861865, - -0.37655376804066876, - -0.3822033764248002, - -0.3871909213264163, - -0.39008193186673357, - -0.3946501698960898, - -0.40870798450816703, - -0.41808721717713526, - -0.419323069011164, - -0.4188615468479292, - -0.4253409414634801, - -0.4175506611525487, - -0.4143242051144237, - -0.38926322058960705, - -0.3997547199092012, - -0.42898767122542414, - -0.41972672723199866, - -0.4275567313518809, - -0.4191961936946762, - -0.42076837377782284, - -0.4155424860225013, - -0.41432693746860305, - -0.4016815249525587, - -0.4108180010112713, - -0.4096990391069869, - -0.40780112379044275, - -0.4157233227844891, - -0.4221894761303896, - -0.4205665454186477, - -0.4301267421061704, - -0.42694442363354623, - -0.4310492172251418, - -0.42158170942517137, - -0.42714304267830083, - -0.4192476457786064, - -0.4193065759521506, - -0.42011885614318767, - -0.40391595584776074, - -0.40341427182891265, - -0.3951384782974702, - -0.4025756580843932, - -0.4046103998539906, - -0.4088431923855391, - -0.3972085301194682, - -0.4030611713049044, - -0.38807832220185445, - -0.3966290510767543, - -0.3888961496009745, - -0.41626144021161116, - -0.42851844215124646, - -0.4252301935214199, - -0.45702248195180983, - -0.4616569263294177, - -0.44808931012309183, - -0.43663517401577334, - -0.4363001925214127, - -0.4497842187819766, - -0.44320772152232346, - -0.43916913427897963, - -0.4463194198901459, - -0.44894560503745706, - -0.4127748701093653, - -0.45981818947873787, - -0.4526237663020706, - -0.4657326232558755, - -0.46484987194585503, - -0.45670649111091555, - -0.4532166553827345, - -0.4499504755356585, - -0.4394190441117882, - -0.4546244354268921, - -0.43588803887170613, - -0.4409634728413869, - -0.4303704571211404, - -0.4627674301988943, - -0.4322174962699379, - -0.42143872648722536, - -0.42168043612409867, - -0.4141108436406723, - -0.41241029209547664, - -0.41947230257564083, - -0.43414804310473254, - -0.4224515882469604, - -0.4218557311126965, - -0.4184350697863667, - -0.41828058830711323, - -0.41026962016867663, - -0.4107772021719386, - -0.4111216090743912, - -0.40013135526463517, - -0.4021642067930282, - -0.3956980534471276, - -0.37493132887889435, - -0.3740265087861234, - -0.3944789793240284, - -0.38304734985926236, - -0.3691040747413793, - -0.38631772528678, - -0.36875097421737113, - -0.3909165765303879, - -0.3579899526666216, - -0.37876370791157377, - -0.3732376847108453, - -0.3671696522057645, - -0.37874252188013335, - -0.42003762816289436, - -0.36990618126682795, - -0.4170807650617835, - -0.4155081077573316, - -0.5036464123063327, - -0.4685482202199158, - -0.510478907445892, - -0.45553995418732574, - -0.4629093593752195, - -0.49668783825315543, - -0.47937708506365273, - -0.48079390091623553, - -0.4975308657542252, - -0.48004356230271816, - -0.42622662868731565, - -0.46073337739601883, - -0.45937835413513717, - -0.4581629550689841, - -0.46594440786681535, - -0.42212463283739543, - -0.4797153283031359, - -0.4276594835512244, - -0.4612566035253256, - -0.43972537184141824, - -0.4534217813781629, - -0.4550328025189504, - -0.4184554942581763, - -0.43388775019739967, - -0.4246963794194386, - -0.42169762394361154, - -0.43282029044987036, - -0.4147238885944492, - -0.4265042048266734, - -0.44272673525317274, - -0.45700523769275503, - -0.449552814724797, - -0.4501045342935598, - -0.45984542292719544, - -0.48684878550072386, - -0.47542598354905796, - -0.4763970099900806, - -0.45404133306381045, - -0.4745741285348881, - -0.45769150973074535, - -0.48051504485132635, - -0.48355612311434726, - -0.4795705009496043, - -0.4644084786688829, - -0.44437002393141656, - -0.4391838599850457, - -0.4792828382427289, - -0.47111738862503905, - -0.45805266923673504, - -0.4394928229435532, - -0.43296046324940096, - -0.44194245782886, - -0.4246626009352078, - -0.4336666642974175, - -0.4084641143963309, - -0.4258763839864862, - -0.4211315956951257, - -0.4186598920270681, - -0.41422406669421485, - -0.42733292364802, - -0.39354561725698367, - -0.40978731357329257, - -0.40614596441945783, - -0.39473640373744234, - -0.410493514621309, - -0.371475906718401, - -0.3529822667734708, - -0.36180977987367613, - -0.3688276527883393, - -0.37696576803591164, - -0.39570216459109764, - -0.35619904346767817, - -0.3493135832495179, - -0.4057213919598307, - -0.3829508219178509, - -0.35522801702665574, - -0.323793242876824, - -0.350041853080285, - -0.3708525006456195, - -0.3795696698320722, - -0.3376698789019472, - -0.3243535753902871, - -0.3451909200633223, - -0.34529650290962854, - -0.3843714896476881, - -0.4335407376158321, - -0.38743905045000937, - -0.3855632039162158, - -0.3498250171300339, - -0.35583213979472383, - -0.3747257746379614, - -0.37346785402118243, - -0.22944256403478058, - -0.3375884270253975, - -0.3748581873344645, - -0.31993781458153636, - -0.3926103161789777, - -0.27676244800843175, - -0.2711658047029015, - -0.24836109298477305, - -0.25639854366251, - -0.21907402060702919, - -0.20276519015439953, - -0.24955762305367657, - -0.2600579498863712, - -0.25994760597261857, - -0.25994760597261857, - -0.17509750592093265, - -0.18255913428334547, - -0.20045691709401248, - -0.18827494901572872, - -0.16618409748246488, - -0.16309757720219953, - -0.1045182002692362, - -0.13263567019394984, - -0.15161482335939158, - -0.13505525468108937, - -0.11631223205214314, - -0.09189343121101534, - -0.10939397593217237, - -0.10587768426531585, - -0.12225272106619645, - -0.1904512604337163, - -0.10568506588899362, - -0.16324927881543327, - -0.12281597569103087, - -0.1687267193157621, - -0.17505163245205868, - -0.12436998911455799, - -0.09857653290642199, - -0.12879906201399183, - -0.08324909441693173, - 0, - 0, - -0.05158061641313583, - 0, - 0, - -0.005163220430396853, - -0.00015571718993645511, - 0, - -0.13545251678430048, - -0.24521813977046636, - -0.2604909421900893, - -0.23262722055793672, - -0.3478019139244378, - -0.17909752833736858, - -0.20119259714616078, - -0.3521965535664058, - -0.17520935044394226, - -0.20469265089596345, - -0.08294560218947844, - -0.29500593863617675, - -0.21730098493451278, - -0.22830715497921206, - -0.45539300331604904, - -0.05504425872954355, - -0.6120748838083061, - -0.4093132018762601, - -0.40081689446731295, - -0.4157467028423312, - -0.2960652820939714, - -0.3805437641841538, - -0.039383517310412564, - -0.19932812489411944, - 0, - -0.17959040814988236, - 0, - -0.08174278349120812, - -0.2039122438017794, - -0.08272611851116951, - -0.1737345845612196, - -0.06476850930972466, - -0.07856718059902557, - -0.06327230603645195, - 0, - -0.028160580756236397, - 0, - -0.11407683922567013, - 0, - -0.014540409414209421, - 0, - -0.018100619800652362, - -0.0957587552104785, - -0.04611490462756496, - 0, - 0, - -0.1301470792845404, - -0.10697222700014364, - -0.06755732588968344, - -0.16429152976666705, - -0.12185053260166157, - -0.17981288077977464, - -0.08222128302066933, - -0.07316016494009314, - -0.04983400785296799, - -0.022668650536495694, - -0.0988758361768114, - -0.12435808670280024, - -0.07696185724847404, - -0.026842141345056802, - 0, - -0.0839431937457994, - -0.01956797145225453, - -0.08849278426430618, - -0.10326488028666048, - -0.11422482249679433, - -0.2050558850623998, - -0.15600689467732232, - -0.13941536160822665, - -0.15803210139006585, - -0.07133809210931119, - -0.12599701338850666, - -0.20816964721779274, - -0.11007166644764221, - -0.11144707421512101, - -0.0662968775016316, - -0.03008141628553973, - -0.1481533324431913, - -0.14289520945295997, - -0.00877670715029566, - -0.0025030880950341894, - 0, - -0.0013595592176384175, - 0, - 0, - -0.05443415424853093, - -0.11660829697090647, - -0.015966699039002052, - -0.11547636425947239, - -0.07820839258448042, - -0.03354456415015605, - -0.034895715323308374, - 0, - -0.00426274790612402, - -0.027429154298246217, - 0, - 0, - 0, - -0.10393355644695079, - -0.06024731619091317, - -0.08479014779542737, - -0.08673542509133114, - -0.11270814340671687, - -0.01276546479458851, - -0.08900474778171752, - -0.059745424190595586, - -0.13541559803906955, - -0.09362164566905984, - -0.1211349412069932, - -0.07593487064213067, - -0.06161181639501989, - -0.027851567600517657, - 0, - 0, - 0, - -0.044861752815020695, - -0.030825501704119573, - -0.09937845114953747, - -0.06310130574240558, - -0.15222266452704325, - -0.03962340370438577, - -0.06472961185149306, - -0.04955733322262312, - 0, - 0, - -0.015438619027273393, - -0.0353186464357621, - 0, - -0.010096504459771394, - -0.060535234751248, - 0, - -0.036943380761267464, - -0.005845210547409718, - 0, - -0.09022046793471417, - 0, - 0, - -0.2148877044450782, - -0.22094054955329523, - -0.18357488083421603, - -0.20462056770703985, - -0.2871806518347395, - -0.265773334990293, - -0.21460268543275618, - -0.30133204453553664, - -0.2798966402427948, - -0.38866528377672394, - -0.31759935834145103, - -0.2652724421623116, - -0.36846104596771145, - -0.3221120750346591, - -0.23668410103635118, - -0.23589765248400874, - -0.22958265785834742, - -0.1901291554824489, - -0.061984853864296974, - -0.21946649522969164, - -0.12173153763548428, - -0.1409620772368343, - -0.09296530933696667, - -0.07939907180904793, - -0.1050990870016989, - 0, - -0.03304590327835977, - -0.04547242836022258, - -0.07017194976030683, - -0.052274217828469416, - -0.14035785668094092, - -0.11498704219865175, - -0.17156006540924085, - -0.22826335544958798, - -0.19072324654447037, - -0.20421982058509092, - -0.1575052049553597, - -0.26485902983893894, - -0.20975616084994186, - -0.31854292086089564, - -0.3858071288854583, - -0.3016631311559068, - -0.07478855948905017, - -0.08441155629898245, - -0.05261249267690937, - -0.12668128160178793, - -0.20537826489260735, - -0.24900369570228842, - -0.2344696394103546, - -0.27487096618344475, - -0.24678450720957112, - -0.2588062746418195, - -0.33367248266030103, - -0.46449271685069327, - -0.2576038683012737, - -0.3240027323852803, - -0.33524289883896286, - -0.23555661616721824, - -0.2728520095278558, - -0.23606093489386815, - -0.22943448085155993, - -0.21297433643387775, - -0.19004272200912253, - -0.2112343437792097, - -0.2445454331038579, - -0.2319235077773545, - -0.33153576106369287, - -0.2698962886527553, - -0.3359415713416912, - -0.22957405245488027, - -0.2619314024902103, - -0.2510409409151153, - -0.203521462372935, - -0.3183702823545631, - -0.2169715125457784, - -0.2270046999492995, - -0.32145745629973754, - -0.27091299587503737, - -0.2843453669781283, - -0.2609019900078823, - -0.2073995420702368, - -0.11690131448040464, - -0.11690131448040464, - -0.2423837147988399, - -0.24754444509651696, - -0.21310747817178133, - -0.1881753374328381, - -0.21841585148454823, - -0.20236976949003427, - -0.19286494330424153, - -0.20817129580118654, - -0.2042214194273545, - -0.2092832162409326, - -0.19632166667969309, - -0.18175504368032025, - -0.12781061899884183, - -0.1497840278429663, - -0.23663013181270864, - -0.21830903268414603, - -0.16044264594950242, - -0.2101533986637404, - -0.19873178912574374, - -0.16156852354957796, - -0.1533458951595772, - -0.20044665889181934, - -0.17583553284050024, - -0.17677196525101135, - -0.17854452461312198, - -0.19660509008215787, - -0.2027043691470496, - -0.18406690771763867, - -0.19298553316950695, - -0.2073521035374618, - -0.2120742761163018, - -0.22011051061746534, - -0.25505458770091427, - -0.2776558826644856, - -0.1943130259379675, - -0.31701507479948676, - -0.3297858765028604, - -0.3004711874198095, - -0.3293438997590312, - -0.3782311800137058, - -0.37391376508447616, - -0.40492192295442453, - -0.4504639325840043, - -0.4159271057687398, - -0.41344273122972175, - -0.4036727189976308, - -0.40136754330954094, - -0.41892838439685576, - -0.4074118191812601, - -0.4203885280025972, - -0.4442273578489013, - -0.4334524300729379, - -0.4309795425350079, - -0.4573073993071072, - -0.48144412195865416, - -0.4854684365209201, - -0.4980710934442979, - -0.5244035878824669, - -0.4837742941572972, - -0.4629097758409073, - -0.3042029057107427, - -0.4453842348512468, - -0.4571733829446366, - -0.4430694035299515, - -0.4323735663292002, - -0.46354455773634995, - -0.39956028238970387, - -0.3178643705823072, - -0.38954369365842034, - -0.36771807560001646, - -0.3733264677276823, - -0.36490589065688217, - -0.3004138503339273, - -0.44937543833666715, - -0.39972221191047086, - -0.3917033580613126, - -0.30746373942424565, - -0.40450648601413075, - -0.3610122525115683, - -0.3837250235092209, - -0.37040710112084596, - -0.39548718775930336, - -0.418252494925221, - -0.45924932720578904, - -0.4451321247690947, - -0.41130089860274877, - -0.4647503093311356, - -0.47286500234790385, - -0.4938230743017733, - -0.5506608308819012, - -0.49494320184060747, - -0.4792022267983813, - -0.5057400797114253, - -0.48512535390171163, - -0.45759267414532023, - -0.43630893511704727, - -0.43337101537257583, - -0.4266700420644376, - -0.4206172868673177, - -0.45270014608279596, - -0.4240098073052422, - -0.43613764915601194, - -0.4227527323980462, - -0.41896475908406094, - -0.38833902740719717, - -0.3867823387915508, - -0.39948893755740256, - -0.3911211546999549, - -0.38986687122482533, - -0.3727786545922195, - -0.3932240335232431, - -0.36716508470686593, - -0.3775346002160056, - -0.37637615590848605, - -0.35394606877831425, - -0.35891947024312654, - -0.3388279179983378, - -0.3358038665931662, - -0.3372091051666033, - -0.3242661651524701, - -0.3073966106983912, - -0.31303995585911826, - -0.31431936222284507, - -0.30234743429333844, - -0.37355631936977385, - -0.37372618591048246, - -0.2804132643204519, - -0.3341157648895161, - -0.30456380408082706, - -0.3408849876503224, - -0.30991274815767433, - -0.3144488252654316, - -0.3155560933184014, - -0.2761425613058466, - -0.3606058982039284, - -0.385425724320385, - -0.5412834727882005, - -0.3631728328513172, - -0.3535982208638666, - -0.4405822294201145, - -0.34257542176284517, - -0.3525363679482729, - -0.3528100474754373, - -0.30093035204567553, - -0.4063822812147405, - -0.3020380546011243, - -0.21307883655718474, - -0.3517857173331198, - 0, - -0.3861321828638631, - -0.48690124832694814, - -0.27743142429996304, - -0.31591618199651006, - -0.4278250141886494, - -0.35482715812630805, - -0.4636059126990403, - -0.10337358935092078, - -0.40506688826794257, - -0.06692724259809057, - -0.5168623663400548, - -0.1920754584253419, - -0.27037433867639316, - -0.26308218638189695, - -0.2737155634952524, - -0.27000165337317106, - -0.21654377439383232, - -0.14961796347258227, - -0.3061939315947867, - -0.3418973431468114, - -0.28513157365033637, - -0.21384654534820824, - -0.04445080406508051, - -0.10971915673589494, - 0, - -0.325582509925303, - -0.3021179604763765, - -0.3174275425045703, - -0.31141401475635266, - -0.44161963264185244, - -0.4326697080425135, - -0.38161748195992473, - -0.35434287573413836, - -0.3404140088056302, - -0.337282971869462, - -0.35031038017916727, - -0.39808768697572483, - -0.40358772563728185, - -0.4194412257350493, - -0.4049304045083265, - -0.4774692961504845, - -0.4308787196875411, - -0.41488448554380064, - -0.3933004566281051, - -0.3899684829991118, - -0.4129842049500687, - -0.4356152615369948, - -0.4185550283044339, - -0.386513755155392, - -0.3297560947765821, - -0.3153949272733084, - -0.3158855946227831, - -0.29326172971637277, - -0.23050386946388057, - -0.2879575928268294, - -0.21830649809574154, - -0.18670980296326778, - -0.1565508193661337, - -0.17159414779383753, - -0.26245412340860574, - -0.07269137871628384, - -0.04585107321363102, - -0.0008942125843400817, - -0.06029919447659604, - 0, - -0.015349712618403344, - 0, - -0.14105900814105643, - -0.08431533173769934, - -0.054103703006399106, - -0.06291034809962215, - -0.059886034900242247, - -0.05990126535694573, - -0.05306190706959801, - -0.11962660019003912, - 0, - -0.011330236781938452, - 0, - -0.0007629342958233032, - -0.09996074981572267, - -0.11107373893083938, - -0.09656968125516763, - -0.10152890005029658, - -0.01771675845089138, - -0.18126681263313327, - -0.23414364306010804, - -0.18615766452227966, - -0.03424429398337592, - -0.17703754020148232, - -0.2310217950965292, - -0.20667764122710675, - -0.21311521792864252, - -0.09115069065007497, - -0.1649201052493784, - -0.30275413267235596, - -0.20127964597658876, - -0.1796449188380339, - -0.15564445020838458, - -0.15301024823289644, - -0.09451565776157556, - -0.11086525207068598, - -0.14466320173461245, - -0.15383439660126752, - -0.1910433211437954, - -0.10342149983116056, - -0.20292635828215133, - -0.0900443243958553, - -0.1574026699392037, - -0.10932065109966449, - -0.11802807620186329, - -0.10669310294492218, - -0.22575467287999929, - -0.1660612685427555, - -0.1517534519322037, - -0.2005096956855017, - -0.19867921980502345, - -0.16737566311772467, - -0.2723686416307408, - -0.3057946269446984, - -0.21333274763108157, - -0.24866133562550952, - -0.21469135885974566, - -0.24086453219509518, - -0.17462065837073626, - -0.19311828429803446, - -0.23377850257115584, - -0.1942714034650318, - -0.16819585791948044, - -0.2040500690350462, - -0.14608231156310014, - -0.17506350237560697, - -0.3828157950012321, - -0.34708791628857705, - -0.134024286893753, - -0.12038576322628236, - -0.2781184880694971, - -0.29377833018354527, - -0.24742240208555755, - -0.30285677267970834, - -0.4767842364067437, - -0.27263781313246105, - -0.24556504798095202, - -0.25964976694381026, - -0.26412247159155744, - -0.23593690612504392, - -0.2729496122545396, - -0.27289047793828347, - -0.2591981958014895, - -0.2581445298027415, - -0.2848033547404566, - -0.28763642607382545, - -0.3037478393301941, - -0.28187591960360414, - -0.2842197888661254, - -0.2742583445004094, - -0.31633864947588675, - -0.3557489833372277, - -0.33185468958100817, - -0.28856977725119115, - -0.24332664946820914, - -0.14875056431545675, - 0, - -0.06597414447412242, - -0.2286456531024238, - -0.2719419898193458, - -0.4988768610146518, - -0.30358349063983037, - -0.37702515109458223, - -0.31690962486102003, - -0.22758138675189166, - -0.09161516405902914, - -0.4961494886413884, - -0.31860540319486563, - -0.3253145101578072, - -0.34481458002192744, - -0.3414659118864871, - -0.3361375279980192, - -0.33210087353705875, - -0.3487459304534716, - -0.35403219273017295, - -0.350500997610411, - -0.3668161019013192, - -0.3669424667366188, - -0.35607672744028596, - -0.3603661115718457, - -0.3623458273248733, - -0.3620158746993688, - -0.3666352114564332, - -0.36828497458395615, - -0.3696047850859745, - -0.3704174436188732, - -0.3728122654700302, - -0.3743473642099665, - -0.37204471610006207, - -0.3774175616898391, - -0.3807669126449744, - -0.3878082420786153, - -0.3909252413493396, - -0.3684229403078344, - -0.3827325878607467, - -0.38913975302834636, - -0.3651491550377568, - -0.35862498539302756, - -0.35557818880858083, - -0.35788083691848516, - -0.36205555666245837, - -0.36776537514636787, - -0.37715615448076456, - -0.37674897890035464, - -0.3746499185806551, - -0.416153746707957, - -0.3973558074123654, - -0.39661165893782313, - -0.40329261458190546, - -0.4021964143005793, - -0.40526661178045187, - -0.4075692598903563, - -0.40390009422572715, - -0.4063450427989701, - -0.41158805932288056, - -0.4160180668461517, - -0.4088105910549874, - -0.41395878804867614, - -0.41550324714678266, - -0.4263144608335292, - -0.4278589199316357, - -0.41769601575619864, - -0.42346885178364957, - -0.406933779075738, - -0.41090257093996385, - -0.4129618497374392, - -0.4259891282210143, - -0.4224485727430821, - -0.42552813058112504, - -0.42700932217811105, - -0.4180046576182407, - -0.4260926537144397, - -0.42416207984180665, - -0.4124405713229943, - -0.4194070178912722, - -0.4084553988319707, - -0.4148317592542792, - -0.4139425252280966, - -0.41306967182871224, - -0.41130758440314497, - -0.39353694441674847, - -0.41700570243934143, - -0.4123770053241069, - -0.4112584425227507, - -0.42186475796914846, - -0.42781794576548704, - -0.40887127037856874, - -0.40407876699535294, - -0.39497113849560894, - -0.4110124523100346, - -0.40241496333057447, - -0.41188530570941906, - -0.4035031049678768, - -0.41407562952127963, - -0.4002082588919159, - -0.4002082588919159, - -0.40575923209767495, - -0.41028604444738004, - -0.4057720117197319, - -0.4074966577126178, - -0.4023227197339604, - -0.4016440937666105, - -0.40887263036365806, - -0.397827407722653, - -0.4023039990176198, - -0.40922130370550336, - -0.41267059569127484, - -0.41677871417517565, - -0.44633404509803465, - -0.23189993986318402, - -0.3052372725832252, - -0.3341490788818724, - -0.28531936584222595, - -0.33412644558383564, - -0.3468967358274989, - -0.26473151180822607, - -0.33845603284739223, - -0.2865551177020482, - -0.3227136695381103, - -0.3064982530617155, - -0.2981577059140321, - -0.3727349555825161, - -0.3413225295986605, - -0.28151452106925245, - -0.2749402735083126, - -0.2831268427640943, - -0.27879671484001123, - -0.3101071129198085, - -0.2903389724998603, - -0.29673630929138217, - -0.3205209794022237, - -0.4258184565678653, - -0.33090910489967107, - -0.39970243563821406, - -0.4298619776809671, - -0.34451703999122896, - -0.34757694107711357, - -0.30594394000706215, - -0.3037032138712944, - -0.24108616185496656, - -0.3363811602797796, - -0.3631082589814685, - -0.30263940916523424, - -0.3329192318104778, - -0.34634425256624846, - -0.23254569811030001, - -0.31898771564803974, - -0.26885831746676636, - -0.18922273024302905, - -0.4937970846582842, - -0.22603233874790296, - 0, - -0.5739334157352559, - -0.3819994058373596, - -0.30804923360912795, - -0.31034495107249427, - -0.19059270920834093, - -0.28736371651782144, - -0.2873351534922013, - -0.2884178499378055, - -0.26943809569459465, - -0.26951221943174875, - -0.31147472667260945, - -0.3277913631065583, - -0.1345828664770451, - -0.3336847278435292, - -0.3849467312539765, - -0.3277548203786561, - -0.45818664667943376, - -0.24001665631190328, - -0.35941585893505223, - -0.3554118870797318, - -0.3615583949012997, - -0.39987213492073437, - -0.41058890493854217, - -0.06448910655307316, - -0.235699504484725, - -0.09810228301893265, - -0.2299546601594279, - -0.5167258444278867, - -0.3467958352928332, - -0.26925618141137564, - -0.2523088063034514, - -0.2743249966744251, - -0.25443768407368994, - -0.1679342480566962, - -0.27316059428425066, - -0.16981320856442983, - -0.1706476103150666, - -0.257955048692594, - -0.07347493033495078, - -0.32007467201892137, - -0.254159684706039, - -0.2288103732063579, - -0.15744664248707052, - 0, - 0, - 0, - -0.11778339949784011, - 0, - -0.003547889677693594, - -0.018683742087335586, - -0.012811475819201501, - -0.02369631431192143, - -0.011634607210726289, - 0, - 0, - -0.3362262178058666, - -0.23271910975348076, - -0.20651109163179104, - -0.056607565579795405, - -0.056635649126524856, - -0.2342182473228236, - -0.3648382813663815, - -0.3066957674199471, - -0.3091593045754065, - -0.4086119140661033, - -0.30268215259483455, - -0.3011484284198138, - -0.3497661998505426, - -0.3130958243544031, - -0.26889116026048143, - -0.2865803189687831, - -0.2614917219915569, - -0.2709951469593155, - -0.2949530165934965, - -0.2729975831435899, - -0.25305180617950596, - -0.15264134914614758, - -0.21810128985256583, - -0.24646826052508042, - -0.2809333046950855, - -0.3169107592615832, - -0.28693179305454053, - -0.5335962249985446, - -0.27859034268605387, - -0.2987010460737557, - -0.4213976763410312, - -0.2668691560568315, - -0.2932730412450827, - 0, - -0.2104558933857914, - -0.2908339474959819, - -0.33922930637005233, - -0.23792398688497662, - -0.23936863694637012, - -0.3065119301610024, - -0.3202785924278564, - -0.30994063892213186, - -0.4171698099201765, - -0.3315341131046732, - -0.3390386948988817, - -0.36877264836011325, - -0.38704467359818495, - -0.3879985198249102, - -0.33979356965898944, - -0.36118715561218384, - -0.3964791740069362, - -0.34316608774046153, - -0.290332462401516, - -0.33238396759046185, - -0.28155475728836066, - -0.2710582584118696, - -0.2813529474537322, - -0.2862319170972647, - -0.26766402602038064, - -0.30595870664512803, - -0.30535210280805203, - -0.3280672983505374, - -0.3163209936889677, - -0.36736464474114605, - -0.32684522097610824, - -0.308183815563273, - -0.3562060471211055, - -0.2549097527581512, - -0.3713725723324265, - -0.40057653611133914, - -0.4320251182327095, - -0.4345761372157292, - -0.40499992009900965, - -0.43791651568315304, - -0.41161217232604796, - -0.42008796610328847, - -0.4110225155847571, - -0.3881100040596128, - -0.41839400208485, - -0.40658640882228503, - -0.387614490746934, - -0.35893623527110374, - -0.36202513772230993, - -0.3459618534987363, - -0.33122282080107224, - -0.33601098013764374, - -0.3650641943002847, - -0.34168651165490016, - -0.37240873519172735, - -0.35635761909861585, - -0.42160268396126455, - -0.4572028141871691, - -0.4222744061266718, - -0.4102819366049766, - -0.4968192726360481, - -0.4705295761026461, - -0.4771028823092074, - -0.4678291895473583, - -0.4714602743148151, - -0.4426168286156248, - -0.4245671437596136, - -0.4000664497417603, - -0.3986629132137737, - -0.3842165019297251, - -0.37825105021421057, - -0.37629510752209105, - -0.3379367526726177, - -0.33490273176981444, - -0.3170175559138604, - -0.31267817109793217, - -0.31261464333337075, - -0.31057533648797875, - -0.2850762753786623, - -0.3016104695750199, - -0.296921019091141, - -0.2969576953926416, - -0.3215181653860264, - -0.3672061087169076, - -0.3247411298715547, - -0.3283807528940158, - -0.3597220262549028, - -0.35800857321733626, - -0.38910963866948334, - -0.3685764360322601, - -0.3835826041665107, - -0.35595147755213197, - -0.33338243766536113, - -0.3454789788727367, - -0.3279616080296597, - -0.30940633575473653, - -0.30219969319420703, - -0.3304309745881281, - -0.2612540262361944, - -0.25955048797159486, - -0.28726903849121654, - -0.2614275347631432, - -0.26797691831613013, - -0.2679929235086096, - -0.25767141951258243, - -0.29070217981733026, - -0.30176165839226865, - -0.24119591569928245, - -0.24119591569928245, - -0.4019695085060938, - -0.43015351102540933, - -0.43283140106991924, - -0.3571726698897848, - -0.42379543752356685, - -0.396986116752312, - -0.44363174353317825, - -0.45357693682789846, - null, - -0.3179960763872608, - -0.33240839525146837, - -0.34509371903063346, - -0.23783502904943343, - -0.2867634518814838, - -0.1551516007962408, - -0.21930378438905296, - -0.21307437760005343, - -0.2130717293116754, - -0.21184139612057684, - -0.12864631080558597, - -0.24182607868053774, - -0.1674156696370781, - -0.10402036016788208, - -0.017601846959364176, - -0.10051751594523994, - -0.05182696723960778, - -0.08743114230547666, - 0, - -0.08708127387452702, - -0.08956384461975864, - -0.056193438169060084, - -0.053393220661113516, - -0.0789795218121444, - -0.15121658772962465, - -0.11697975470130917, - -0.06499364383151995, - -0.019792373702268606, - -0.141650578579828, - -0.04950000338239757, - -0.04475789834292976, - 0, - 0, - 0, - -0.004816046330821222, - -0.030060178400773463, - -0.1521920869019413, - -0.3713679069367688, - -0.0016199693897815948, - -0.034053409048194094, - 0, - -0.3721971739615585, - -0.01077536434498727, - -0.08304136213423963, - -0.029414960419248293, - -0.09100054478395048, - -0.05684638567631872, - -0.07044627905024914, - -0.052726976512570634, - -0.04925865937470442, - -0.08745084114285084, - -0.08625612901202728, - -0.0770761488137881, - -0.07875396288047909, - -0.04267052627949275, - -0.11999187801969602, - -0.11097884449475715, - -0.15468026648189703, - -0.03739083773628926, - -0.13129312438558782, - -0.05759034178922484, - -0.14796274971487522, - -0.1610889319033103, - -0.11401101344862408, - -0.19745409101549483, - -0.17586058224048629, - -0.3055272286614198, - -0.251282915571866, - -0.3664665207171002, - -0.2522213645591702, - -0.2591615464517111, - -0.22152884472247025, - -0.20057077672272006, - -0.19860477096123486, - -0.2866146747763094, - -0.23080732345796007, - -0.18326745789225618, - -0.10592689997835569, - -0.11552946394339225, - -0.17918152129743448, - -0.09629771508612583, - -0.13258670477861956, - -0.1391153631214661, - -0.10659436286861212, - -0.07819151665626434, - -0.0676836008819044, - -0.06813648546990492, - -0.0870273780241555, - -0.08168796430857772, - -0.047425289863299525, - 0, - -0.029811115474398853, - 0, - -0.038209493796632965, - -0.03529490256084189, - -0.3119429062200918, - 0, - 0, - 0, - 0, - -0.09941660190607993, - -0.33610182873426087, - -0.1190102945108441, - 0, - 0, - 0, - -0.5615248650802934, - 0, - -0.551141185207315, - -0.3756935643539243, - -0.27297277794676034, - -0.1325908581440396, - -0.11877538014245814, - -0.294952503562646, - -0.11520571630237764, - -0.10907480417434878, - -0.13600059514121354, - -0.09179458321698475, - -0.10266320629243675, - -0.11715185437317677, - -0.038296428705033136, - -0.07175737364438994, - -0.1737525206934012, - -0.5884905046869401, - -0.18130187426419941, - -0.2030961658648679, - -0.30059699031405307, - -0.2944532008238573, - -0.3385868039327432, - -0.26905677464463873, - -0.2683489561286557, - -0.25232501051531875, - -0.37014514793217956, - -0.38344359984273, - -0.36404053625425725, - -0.38325291674030904, - -0.35651243033103885, - -0.4399397088704923, - -0.37214941121123846, - -0.454294514622663, - -0.42561467249972473, - -0.46895324302758823, - 0, - -0.4775586361457125, - -0.03575596395328695, - -0.38183902927894875, - -0.34272777462510695, - -0.2736502081457278, - -0.329832822867308, - -0.33940292847436737, - -0.28672655465161345, - -0.27480824969209505, - -0.2847570916786545, - -0.32086437910498133, - -0.2372891833684888, - -0.24685482529885705, - -0.644016948613098, - -0.33621391059087014, - -0.4778553190283509, - -0.4596416331358625, - -0.4973016677368324, - -0.4330161163104016, - -0.494991605165924, - -0.4589852620420688, - -0.41130376616996667, - -0.3983762513134401, - -0.30979820871281394, - -0.3373364205594771, - -0.19458648981655147, - -0.5233740890481657, - -0.36160385050384447, - -0.3268751756699606, - -0.345908305495917, - -0.3388835844930005, - -0.6335252880301361, - -0.30682593034448113, - -0.31797234942527397, - -0.3164838289373082, - -0.32408202035678957, - -0.35819385106945345, - -0.30993906969917884, - -0.2551745163073701, - -0.24691690564193736, - -0.06583188988304756, - -0.2599334461835964, - -0.200648740777433, - -0.09612476217416777, - -0.16728932977892952, - -0.23419989932509155, - -0.22981243564717269, - 0, - -0.40440858302863036, - -0.31350734266582925, - -0.24746983493976238, - -0.2549520728123619, - -0.33228111209810585, - -0.29170368915398814, - -0.28711545765698143, - -0.22112654508198837, - -0.271945127190263, - -0.4500421096971021, - -0.08653216827916144, - -0.32661591769378884, - -0.3272278580311542, - -0.27980984192764347, - -0.029090944623045845, - -0.22780740645160047, - -0.23853987674704058, - -0.22826697504148052, - -0.2103601487116683, - -0.242130333047347, - -0.19207685564386068, - -0.28045280887832247, - -0.5647188733391815, - -0.20431486977122681, - -0.19176001525885888, - -0.18869568995571695, - -0.22627436746076268, - -0.2691385932908438, - -0.29529975040958334, - -0.2855373148171876, - -0.2855375601519309, - -0.2877318907115791, - -0.23318027627758042, - -0.18511284023669272, - -0.11107019194056944, - -0.1081091903081568, - -0.14407262160722345, - -0.1540275506135811, - -0.3924284735364064, - -0.15161426823150415, - -0.20696235247362416, - -0.12961076126340165, - -0.196908912131885, - -0.2011805674505367, - -0.4185756277028758, - -0.1695207604743656, - -0.1852698544723942, - -0.11774439152830629, - -0.16285299168908096, - null, - -0.08056583160107078, - -0.23573997972432081, - -0.1807562175759797, - -0.3084575485512563, - -0.3084575485512563, - -0.21375113990081152, - -0.22919209267038898, - -0.2223745232330595, - -0.1374251037423433, - -0.13816390881180496, - -0.2114579464466485, - -0.2071798746808643, - -0.2105730631978714, - -0.22099242974516875, - -0.2077476561908821, - -0.12935867645463017, - -0.189769243124432, - -0.18740920694477248, - -0.16386428957476518, - -0.16109488877422895, - -0.07884264170738142, - -0.05718042382511346, - 0, - -0.06017691796362623, - -0.04633281312209936, - -0.10711638836887283, - -0.046642314947353936, - -0.0657103960336447, - -0.07376413947981675, - -0.049593109400402735, - -0.12829033176061466, - -0.08140997120352589, - -0.08437403784992104, - -0.0245798143092415, - -0.0083954642125319, - -0.00974061721391839, - -0.06119926555909305, - -0.07621978098265836, - -0.14051965236004915, - -0.1220263090802568, - -0.13728351437122477, - -0.1628818707761822, - -0.12606402048601006, - -0.1467477304649839, - -0.21006949206311654 - ], - "yaxis": "y" - }, - { - "hovertemplate": "variable=DTE270_ROLL120
datetime=%{x}
value=%{y}", - "legendgroup": "DTE270_ROLL120", - "line": { - "color": "#ab63fa", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "DTE270_ROLL120", - "showlegend": true, - "type": "scattergl", - "x": [ - "2017-01-05T00:00:00", - "2017-01-06T00:00:00", - "2017-01-09T00:00:00", - "2017-01-10T00:00:00", - "2017-01-11T00:00:00", - "2017-01-12T00:00:00", - "2017-01-13T00:00:00", - "2017-01-17T00:00:00", - "2017-01-18T00:00:00", - "2017-01-19T00:00:00", - "2017-01-20T00:00:00", - "2017-01-23T00:00:00", - "2017-01-24T00:00:00", - "2017-01-25T00:00:00", - "2017-01-26T00:00:00", - "2017-01-27T00:00:00", - "2017-01-30T00:00:00", - "2017-01-31T00:00:00", - "2017-02-01T00:00:00", - "2017-02-02T00:00:00", - "2017-02-03T00:00:00", - "2017-02-06T00:00:00", - "2017-02-07T00:00:00", - "2017-02-08T00:00:00", - "2017-02-09T00:00:00", - "2017-02-10T00:00:00", - "2017-02-13T00:00:00", - "2017-02-14T00:00:00", - "2017-02-15T00:00:00", - "2017-02-16T00:00:00", - "2017-02-17T00:00:00", - "2017-02-21T00:00:00", - "2017-02-22T00:00:00", - "2017-02-23T00:00:00", - "2017-02-24T00:00:00", - "2017-02-27T00:00:00", - "2017-02-28T00:00:00", - "2017-03-01T00:00:00", - "2017-03-02T00:00:00", - "2017-03-03T00:00:00", - "2017-03-06T00:00:00", - "2017-03-07T00:00:00", - "2017-03-08T00:00:00", - "2017-03-09T00:00:00", - "2017-03-10T00:00:00", - "2017-03-13T00:00:00", - "2017-03-14T00:00:00", - "2017-03-15T00:00:00", - "2017-03-16T00:00:00", - "2017-03-17T00:00:00", - "2017-03-20T00:00:00", - "2017-03-21T00:00:00", - "2017-03-22T00:00:00", - "2017-03-23T00:00:00", - "2017-03-24T00:00:00", - "2017-03-27T00:00:00", - "2017-03-28T00:00:00", - "2017-03-29T00:00:00", - "2017-03-30T00:00:00", - "2017-03-31T00:00:00", - "2017-04-03T00:00:00", - "2017-04-04T00:00:00", - "2017-04-05T00:00:00", - "2017-04-06T00:00:00", - "2017-04-07T00:00:00", - "2017-04-10T00:00:00", - "2017-04-11T00:00:00", - "2017-04-12T00:00:00", - "2017-04-13T00:00:00", - "2017-04-17T00:00:00", - "2017-04-18T00:00:00", - "2017-04-19T00:00:00", - "2017-04-20T00:00:00", - "2017-04-21T00:00:00", - "2017-04-24T00:00:00", - "2017-04-25T00:00:00", - "2017-04-26T00:00:00", - "2017-04-27T00:00:00", - "2017-04-28T00:00:00", - "2017-05-01T00:00:00", - "2017-05-02T00:00:00", - "2017-05-03T00:00:00", - "2017-05-04T00:00:00", - "2017-05-05T00:00:00", - "2017-05-08T00:00:00", - "2017-05-09T00:00:00", - "2017-05-10T00:00:00", - "2017-05-11T00:00:00", - "2017-05-12T00:00:00", - "2017-05-15T00:00:00", - "2017-05-16T00:00:00", - "2017-05-17T00:00:00", - "2017-05-18T00:00:00", - "2017-05-19T00:00:00", - "2017-05-22T00:00:00", - "2017-05-23T00:00:00", - "2017-05-24T00:00:00", - "2017-05-25T00:00:00", - "2017-05-26T00:00:00", - "2017-05-29T00:00:00", - "2017-05-30T00:00:00", - "2017-05-31T00:00:00", - "2017-06-01T00:00:00", - "2017-06-02T00:00:00", - "2017-06-05T00:00:00", - "2017-06-06T00:00:00", - "2017-06-07T00:00:00", - "2017-06-08T00:00:00", - "2017-06-09T00:00:00", - "2017-06-12T00:00:00", - "2017-06-13T00:00:00", - "2017-06-14T00:00:00", - "2017-06-15T00:00:00", - "2017-06-16T00:00:00", - "2017-06-19T00:00:00", - "2017-06-20T00:00:00", - "2017-06-21T00:00:00", - "2017-06-22T00:00:00", - "2017-06-23T00:00:00", - "2017-06-26T00:00:00", - "2017-06-27T00:00:00", - "2017-06-28T00:00:00", - "2017-06-29T00:00:00", - "2017-06-30T00:00:00", - "2017-07-03T00:00:00", - "2017-07-05T00:00:00", - "2017-07-06T00:00:00", - "2017-07-07T00:00:00", - "2017-07-10T00:00:00", - "2017-07-11T00:00:00", - "2017-07-12T00:00:00", - "2017-07-13T00:00:00", - "2017-07-14T00:00:00", - "2017-07-17T00:00:00", - "2017-07-18T00:00:00", - "2017-07-19T00:00:00", - "2017-07-20T00:00:00", - "2017-07-21T00:00:00", - "2017-07-24T00:00:00", - "2017-07-25T00:00:00", - "2017-07-26T00:00:00", - "2017-07-27T00:00:00", - "2017-07-28T00:00:00", - "2017-07-31T00:00:00", - "2017-08-01T00:00:00", - "2017-08-02T00:00:00", - "2017-08-03T00:00:00", - "2017-08-04T00:00:00", - "2017-08-07T00:00:00", - "2017-08-08T00:00:00", - "2017-08-09T00:00:00", - "2017-08-10T00:00:00", - "2017-08-11T00:00:00", - "2017-08-14T00:00:00", - "2017-08-15T00:00:00", - "2017-08-16T00:00:00", - "2017-08-17T00:00:00", - "2017-08-18T00:00:00", - "2017-08-21T00:00:00", - "2017-08-22T00:00:00", - "2017-08-23T00:00:00", - "2017-08-24T00:00:00", - "2017-08-25T00:00:00", - "2017-08-28T00:00:00", - "2017-08-29T00:00:00", - "2017-08-30T00:00:00", - "2017-08-31T00:00:00", - "2017-09-01T00:00:00", - "2017-09-05T00:00:00", - "2017-09-06T00:00:00", - "2017-09-07T00:00:00", - "2017-09-08T00:00:00", - "2017-09-11T00:00:00", - "2017-09-12T00:00:00", - "2017-09-13T00:00:00", - "2017-09-14T00:00:00", - "2017-09-15T00:00:00", - "2017-09-18T00:00:00", - "2017-09-19T00:00:00", - "2017-09-20T00:00:00", - "2017-09-21T00:00:00", - "2017-09-22T00:00:00", - "2017-09-25T00:00:00", - "2017-09-26T00:00:00", - "2017-09-27T00:00:00", - "2017-09-28T00:00:00", - "2017-09-29T00:00:00", - "2017-10-02T00:00:00", - "2017-10-03T00:00:00", - "2017-10-04T00:00:00", - "2017-10-05T00:00:00", - "2017-10-06T00:00:00", - "2017-10-09T00:00:00", - "2017-10-10T00:00:00", - "2017-10-11T00:00:00", - "2017-10-12T00:00:00", - "2017-10-13T00:00:00", - "2017-10-16T00:00:00", - "2017-10-17T00:00:00", - "2017-10-18T00:00:00", - "2017-10-19T00:00:00", - "2017-10-20T00:00:00", - "2017-10-23T00:00:00", - "2017-10-24T00:00:00", - "2017-10-25T00:00:00", - "2017-10-26T00:00:00", - "2017-10-27T00:00:00", - "2017-10-30T00:00:00", - "2017-10-31T00:00:00", - "2017-11-01T00:00:00", - "2017-11-02T00:00:00", - "2017-11-03T00:00:00", - "2017-11-06T00:00:00", - "2017-11-07T00:00:00", - "2017-11-08T00:00:00", - "2017-11-09T00:00:00", - "2017-11-10T00:00:00", - "2017-11-13T00:00:00", - "2017-11-14T00:00:00", - "2017-11-15T00:00:00", - "2017-11-16T00:00:00", - "2017-11-17T00:00:00", - "2017-11-20T00:00:00", - "2017-11-21T00:00:00", - "2017-11-22T00:00:00", - "2017-11-24T00:00:00", - "2017-11-27T00:00:00", - "2017-11-28T00:00:00", - "2017-11-29T00:00:00", - "2017-11-30T00:00:00", - "2017-12-01T00:00:00", - "2017-12-04T00:00:00", - "2017-12-05T00:00:00", - "2017-12-06T00:00:00", - "2017-12-07T00:00:00", - "2017-12-08T00:00:00", - "2017-12-11T00:00:00", - "2017-12-12T00:00:00", - "2017-12-13T00:00:00", - "2017-12-14T00:00:00", - "2017-12-15T00:00:00", - "2017-12-18T00:00:00", - "2017-12-19T00:00:00", - "2017-12-20T00:00:00", - "2017-12-21T00:00:00", - "2017-12-22T00:00:00", - "2017-12-26T00:00:00", - "2017-12-27T00:00:00", - "2017-12-28T00:00:00", - "2017-12-29T00:00:00", - "2018-01-01T00:00:00", - "2018-01-02T00:00:00", - "2018-01-04T00:00:00", - "2018-01-05T00:00:00", - "2018-01-08T00:00:00", - "2018-01-09T00:00:00", - "2018-01-10T00:00:00", - "2018-01-11T00:00:00", - "2018-01-12T00:00:00", - "2018-01-15T00:00:00", - "2018-01-16T00:00:00", - "2018-01-17T00:00:00", - "2018-01-18T00:00:00", - "2018-01-19T00:00:00", - "2018-01-22T00:00:00", - "2018-01-23T00:00:00", - "2018-01-24T00:00:00", - "2018-01-25T00:00:00", - "2018-01-26T00:00:00", - "2018-01-29T00:00:00", - "2018-01-30T00:00:00", - "2018-01-31T00:00:00", - "2018-02-01T00:00:00", - "2018-02-02T00:00:00", - "2018-02-05T00:00:00", - "2018-02-06T00:00:00", - "2018-02-07T00:00:00", - "2018-02-08T00:00:00", - "2018-02-09T00:00:00", - "2018-02-12T00:00:00", - "2018-02-13T00:00:00", - "2018-02-14T00:00:00", - "2018-02-15T00:00:00", - "2018-02-16T00:00:00", - "2018-02-20T00:00:00", - "2018-02-21T00:00:00", - "2018-02-22T00:00:00", - "2018-02-23T00:00:00", - "2018-02-26T00:00:00", - "2018-02-27T00:00:00", - "2018-02-28T00:00:00", - "2018-03-01T00:00:00", - "2018-03-02T00:00:00", - "2018-03-05T00:00:00", - "2018-03-06T00:00:00", - "2018-03-07T00:00:00", - "2018-03-08T00:00:00", - "2018-03-09T00:00:00", - "2018-03-12T00:00:00", - "2018-03-13T00:00:00", - "2018-03-14T00:00:00", - "2018-03-15T00:00:00", - "2018-03-16T00:00:00", - "2018-03-19T00:00:00", - "2018-03-20T00:00:00", - "2018-03-21T00:00:00", - "2018-03-22T00:00:00", - "2018-03-23T00:00:00", - "2018-03-26T00:00:00", - "2018-03-27T00:00:00", - "2018-03-28T00:00:00", - "2018-03-29T00:00:00", - "2018-04-02T00:00:00", - "2018-04-03T00:00:00", - "2018-04-04T00:00:00", - "2018-04-05T00:00:00", - "2018-04-06T00:00:00", - "2018-04-09T00:00:00", - "2018-04-10T00:00:00", - "2018-04-11T00:00:00", - "2018-04-12T00:00:00", - "2018-04-13T00:00:00", - "2018-04-16T00:00:00", - "2018-04-17T00:00:00", - "2018-04-18T00:00:00", - "2018-04-19T00:00:00", - "2018-04-20T00:00:00", - "2018-04-23T00:00:00", - "2018-04-24T00:00:00", - "2018-04-25T00:00:00", - "2018-04-26T00:00:00", - "2018-04-27T00:00:00", - "2018-04-30T00:00:00", - "2018-05-01T00:00:00", - "2018-05-02T00:00:00", - "2018-05-03T00:00:00", - "2018-05-04T00:00:00", - "2018-05-07T00:00:00", - "2018-05-08T00:00:00", - "2018-05-09T00:00:00", - "2018-05-10T00:00:00", - "2018-05-11T00:00:00", - "2018-05-14T00:00:00", - "2018-05-15T00:00:00", - "2018-05-16T00:00:00", - "2018-05-17T00:00:00", - "2018-05-18T00:00:00", - "2018-05-21T00:00:00", - "2018-05-22T00:00:00", - "2018-05-23T00:00:00", - "2018-05-24T00:00:00", - "2018-05-25T00:00:00", - "2018-05-28T00:00:00", - "2018-05-29T00:00:00", - "2018-05-30T00:00:00", - "2018-05-31T00:00:00", - "2018-06-01T00:00:00", - "2018-06-04T00:00:00", - "2018-06-05T00:00:00", - "2018-06-06T00:00:00", - "2018-06-07T00:00:00", - "2018-06-08T00:00:00", - "2018-06-11T00:00:00", - "2018-06-12T00:00:00", - "2018-06-13T00:00:00", - "2018-06-14T00:00:00", - "2018-06-15T00:00:00", - "2018-06-18T00:00:00", - "2018-06-19T00:00:00", - "2018-06-20T00:00:00", - "2018-06-21T00:00:00", - "2018-06-22T00:00:00", - "2018-06-25T00:00:00", - "2018-06-26T00:00:00", - "2018-06-27T00:00:00", - "2018-06-28T00:00:00", - "2018-06-29T00:00:00", - "2018-07-02T00:00:00", - "2018-07-03T00:00:00", - "2018-07-05T00:00:00", - "2018-07-06T00:00:00", - "2018-07-09T00:00:00", - "2018-07-10T00:00:00", - "2018-07-11T00:00:00", - "2018-07-12T00:00:00", - "2018-07-13T00:00:00", - "2018-07-16T00:00:00", - "2018-07-17T00:00:00", - "2018-07-18T00:00:00", - "2018-07-19T00:00:00", - "2018-07-20T00:00:00", - "2018-07-23T00:00:00", - "2018-07-24T00:00:00", - "2018-07-25T00:00:00", - "2018-07-26T00:00:00", - "2018-07-27T00:00:00", - "2018-07-30T00:00:00", - "2018-07-31T00:00:00", - "2018-08-01T00:00:00", - "2018-08-02T00:00:00", - "2018-08-03T00:00:00", - "2018-08-06T00:00:00", - "2018-08-07T00:00:00", - "2018-08-08T00:00:00", - "2018-08-09T00:00:00", - "2018-08-10T00:00:00", - "2018-08-13T00:00:00", - "2018-08-14T00:00:00", - "2018-08-15T00:00:00", - "2018-08-16T00:00:00", - "2018-08-17T00:00:00", - "2018-08-20T00:00:00", - "2018-08-21T00:00:00", - "2018-08-22T00:00:00", - "2018-08-23T00:00:00", - "2018-08-24T00:00:00", - "2018-08-27T00:00:00", - "2018-08-28T00:00:00", - "2018-08-29T00:00:00", - "2018-08-30T00:00:00", - "2018-08-31T00:00:00", - "2018-09-03T00:00:00", - "2018-09-04T00:00:00", - "2018-09-05T00:00:00", - "2018-09-06T00:00:00", - "2018-09-07T00:00:00", - "2018-09-10T00:00:00", - "2018-09-11T00:00:00", - "2018-09-12T00:00:00", - "2018-09-13T00:00:00", - "2018-09-14T00:00:00", - "2018-09-17T00:00:00", - "2018-09-18T00:00:00", - "2018-09-19T00:00:00", - "2018-09-20T00:00:00", - "2018-09-21T00:00:00", - "2018-09-24T00:00:00", - "2018-09-25T00:00:00", - "2018-09-26T00:00:00", - "2018-09-27T00:00:00", - "2018-09-28T00:00:00", - "2018-10-01T00:00:00", - "2018-10-02T00:00:00", - "2018-10-03T00:00:00", - "2018-10-04T00:00:00", - "2018-10-05T00:00:00", - "2018-10-08T00:00:00", - "2018-10-09T00:00:00", - "2018-10-10T00:00:00", - "2018-10-11T00:00:00", - "2018-10-12T00:00:00", - "2018-10-15T00:00:00", - "2018-10-16T00:00:00", - "2018-10-17T00:00:00", - "2018-10-18T00:00:00", - "2018-10-19T00:00:00", - "2018-10-22T00:00:00", - "2018-10-23T00:00:00", - "2018-10-24T00:00:00", - "2018-10-25T00:00:00", - "2018-10-26T00:00:00", - "2018-10-29T00:00:00", - "2018-10-30T00:00:00", - "2018-10-31T00:00:00", - "2018-11-01T00:00:00", - "2018-11-02T00:00:00", - "2018-11-05T00:00:00", - "2018-11-06T00:00:00", - "2018-11-07T00:00:00", - "2018-11-08T00:00:00", - "2018-11-09T00:00:00", - "2018-11-12T00:00:00", - "2018-11-13T00:00:00", - "2018-11-14T00:00:00", - "2018-11-15T00:00:00", - "2018-11-16T00:00:00", - "2018-11-19T00:00:00", - "2018-11-20T00:00:00", - "2018-11-21T00:00:00", - "2018-11-23T00:00:00", - "2018-11-26T00:00:00", - "2018-11-27T00:00:00", - "2018-11-28T00:00:00", - "2018-11-29T00:00:00", - "2018-11-30T00:00:00", - "2018-12-03T00:00:00", - "2018-12-04T00:00:00", - "2018-12-06T00:00:00", - "2018-12-07T00:00:00", - "2018-12-10T00:00:00", - "2018-12-11T00:00:00", - "2018-12-12T00:00:00", - "2018-12-13T00:00:00", - "2018-12-14T00:00:00", - "2018-12-17T00:00:00", - "2018-12-18T00:00:00", - "2018-12-19T00:00:00", - "2018-12-20T00:00:00", - "2018-12-21T00:00:00", - "2018-12-24T00:00:00", - "2018-12-26T00:00:00", - "2018-12-27T00:00:00", - "2018-12-28T00:00:00", - "2018-12-31T00:00:00", - "2019-01-01T00:00:00", - "2019-01-02T00:00:00", - "2019-01-04T00:00:00", - "2019-01-08T00:00:00", - "2019-01-09T00:00:00", - "2019-01-10T00:00:00", - "2019-01-11T00:00:00", - "2019-01-16T00:00:00", - "2019-01-18T00:00:00", - "2019-01-22T00:00:00", - "2019-01-23T00:00:00", - "2019-01-24T00:00:00", - "2019-01-28T00:00:00", - "2019-01-29T00:00:00", - "2019-01-30T00:00:00", - "2019-01-31T00:00:00", - "2019-02-01T00:00:00", - "2019-02-04T00:00:00", - "2019-02-05T00:00:00", - "2019-02-06T00:00:00", - "2019-02-07T00:00:00", - "2019-02-08T00:00:00", - "2019-02-11T00:00:00", - "2019-02-12T00:00:00", - "2019-02-13T00:00:00", - "2019-02-14T00:00:00", - "2019-02-15T00:00:00", - "2019-02-18T00:00:00", - "2019-02-19T00:00:00", - "2019-02-20T00:00:00", - "2019-02-21T00:00:00", - "2019-02-22T00:00:00", - "2019-02-25T00:00:00", - "2019-02-26T00:00:00", - "2019-02-27T00:00:00", - "2019-02-28T00:00:00", - "2019-03-01T00:00:00", - "2019-03-04T00:00:00", - "2019-03-05T00:00:00", - "2019-03-06T00:00:00", - "2019-03-07T00:00:00", - "2019-03-08T00:00:00", - "2019-03-11T00:00:00", - "2019-03-12T00:00:00", - "2019-03-13T00:00:00", - "2019-03-14T00:00:00", - "2019-03-15T00:00:00", - "2019-03-18T00:00:00", - "2019-03-19T00:00:00", - "2019-03-20T00:00:00", - "2019-03-21T00:00:00", - "2019-03-22T00:00:00", - "2019-03-25T00:00:00", - "2019-03-26T00:00:00", - "2019-03-27T00:00:00", - "2019-03-28T00:00:00", - "2019-03-29T00:00:00", - "2019-04-01T00:00:00", - "2019-04-02T00:00:00", - "2019-04-03T00:00:00", - "2019-04-04T00:00:00", - "2019-04-05T00:00:00", - "2019-04-08T00:00:00", - "2019-04-09T00:00:00", - "2019-04-10T00:00:00", - "2019-04-11T00:00:00", - "2019-04-12T00:00:00", - "2019-04-15T00:00:00", - "2019-04-16T00:00:00", - "2019-04-17T00:00:00", - "2019-04-18T00:00:00", - "2019-04-19T00:00:00", - "2019-04-22T00:00:00", - "2019-04-23T00:00:00", - "2019-04-24T00:00:00", - "2019-04-25T00:00:00", - "2019-04-26T00:00:00", - "2019-04-29T00:00:00", - "2019-04-30T00:00:00", - "2019-05-01T00:00:00", - "2019-05-02T00:00:00", - "2019-05-03T00:00:00", - "2019-05-06T00:00:00", - "2019-05-07T00:00:00", - "2019-05-08T00:00:00", - "2019-05-09T00:00:00", - "2019-05-10T00:00:00", - "2019-05-13T00:00:00", - "2019-05-14T00:00:00", - "2019-05-15T00:00:00", - "2019-05-16T00:00:00", - "2019-05-17T00:00:00", - "2019-05-20T00:00:00", - "2019-05-21T00:00:00", - "2019-05-22T00:00:00", - "2019-05-23T00:00:00", - "2019-05-24T00:00:00", - "2019-05-28T00:00:00", - "2019-05-29T00:00:00", - "2019-05-30T00:00:00", - "2019-05-31T00:00:00", - "2019-06-03T00:00:00", - "2019-06-04T00:00:00", - "2019-06-05T00:00:00", - "2019-06-06T00:00:00", - "2019-06-07T00:00:00", - "2019-06-10T00:00:00", - "2019-06-11T00:00:00", - "2019-06-12T00:00:00", - "2019-06-13T00:00:00", - "2019-06-14T00:00:00", - "2019-06-17T00:00:00", - "2019-06-18T00:00:00", - "2019-06-19T00:00:00", - "2019-06-20T00:00:00", - "2019-06-21T00:00:00", - "2019-06-24T00:00:00", - "2019-06-25T00:00:00", - "2019-06-26T00:00:00", - "2019-06-27T00:00:00", - "2019-06-28T00:00:00", - "2019-07-01T00:00:00", - "2019-07-02T00:00:00", - "2019-07-03T00:00:00", - "2019-07-04T00:00:00", - "2019-07-05T00:00:00", - "2019-07-08T00:00:00", - "2019-07-09T00:00:00", - "2019-07-10T00:00:00", - "2019-07-11T00:00:00", - "2019-07-12T00:00:00", - "2019-07-15T00:00:00", - "2019-07-16T00:00:00", - "2019-07-17T00:00:00", - "2019-07-18T00:00:00", - "2019-07-19T00:00:00", - "2019-07-22T00:00:00", - "2019-07-23T00:00:00", - "2019-07-24T00:00:00", - "2019-07-25T00:00:00", - "2019-07-26T00:00:00", - "2019-07-29T00:00:00", - "2019-07-30T00:00:00", - "2019-07-31T00:00:00", - "2019-08-01T00:00:00", - "2019-08-02T00:00:00", - "2019-08-05T00:00:00", - "2019-08-06T00:00:00", - "2019-08-07T00:00:00", - "2019-08-08T00:00:00", - "2019-08-09T00:00:00", - "2019-08-12T00:00:00", - "2019-08-13T00:00:00", - "2019-08-14T00:00:00", - "2019-08-15T00:00:00", - "2019-08-16T00:00:00", - "2019-08-19T00:00:00", - "2019-08-20T00:00:00", - "2019-08-21T00:00:00", - "2019-08-22T00:00:00", - "2019-08-23T00:00:00", - "2019-08-26T00:00:00", - "2019-08-27T00:00:00", - "2019-08-28T00:00:00", - "2019-08-29T00:00:00", - "2019-08-30T00:00:00", - "2019-09-03T00:00:00", - "2019-09-04T00:00:00", - "2019-09-05T00:00:00", - "2019-09-06T00:00:00", - "2019-09-09T00:00:00", - "2019-09-10T00:00:00", - "2019-09-11T00:00:00", - "2019-09-12T00:00:00", - "2019-09-13T00:00:00", - "2019-09-16T00:00:00", - "2019-09-17T00:00:00", - "2019-09-18T00:00:00", - "2019-09-19T00:00:00", - "2019-09-20T00:00:00", - "2019-09-23T00:00:00", - "2019-09-24T00:00:00", - "2019-09-25T00:00:00", - "2019-09-26T00:00:00", - "2019-09-27T00:00:00", - "2019-09-30T00:00:00", - "2019-10-01T00:00:00", - "2019-10-02T00:00:00", - "2019-10-03T00:00:00", - "2019-10-04T00:00:00", - "2019-10-07T00:00:00", - "2019-10-08T00:00:00", - "2019-10-09T00:00:00", - "2019-10-10T00:00:00", - "2019-10-11T00:00:00", - "2019-10-14T00:00:00", - "2019-10-15T00:00:00", - "2019-10-16T00:00:00", - "2019-10-17T00:00:00", - "2019-10-18T00:00:00", - "2019-10-21T00:00:00", - "2019-10-22T00:00:00", - "2019-10-23T00:00:00", - "2019-10-24T00:00:00", - "2019-10-25T00:00:00", - "2019-10-28T00:00:00", - "2019-10-29T00:00:00", - "2019-10-30T00:00:00", - "2019-10-31T00:00:00", - "2019-11-01T00:00:00", - "2019-11-04T00:00:00", - "2019-11-05T00:00:00", - "2019-11-06T00:00:00", - "2019-11-07T00:00:00", - "2019-11-08T00:00:00", - "2019-11-11T00:00:00", - "2019-11-12T00:00:00", - "2019-11-13T00:00:00", - "2019-11-14T00:00:00", - "2019-11-15T00:00:00", - "2019-11-18T00:00:00", - "2019-11-19T00:00:00", - "2019-11-20T00:00:00", - "2019-11-21T00:00:00", - "2019-11-22T00:00:00", - "2019-11-25T00:00:00", - "2019-11-26T00:00:00", - "2019-11-27T00:00:00", - "2019-11-28T00:00:00", - "2019-11-29T00:00:00", - "2019-12-02T00:00:00", - "2019-12-03T00:00:00", - "2019-12-04T00:00:00", - "2019-12-05T00:00:00", - "2019-12-06T00:00:00", - "2019-12-09T00:00:00", - "2019-12-10T00:00:00", - "2019-12-11T00:00:00", - "2019-12-12T00:00:00", - "2019-12-13T00:00:00", - "2019-12-16T00:00:00", - "2019-12-17T00:00:00", - "2019-12-18T00:00:00", - "2019-12-19T00:00:00", - "2019-12-20T00:00:00", - "2019-12-23T00:00:00", - "2019-12-24T00:00:00", - "2019-12-26T00:00:00", - "2019-12-27T00:00:00", - "2019-12-30T00:00:00", - "2019-12-31T00:00:00", - "2020-01-01T00:00:00", - "2020-01-02T00:00:00", - "2020-01-06T00:00:00", - "2020-01-07T00:00:00", - "2020-01-08T00:00:00", - "2020-01-09T00:00:00", - "2020-01-10T00:00:00", - "2020-01-13T00:00:00", - "2020-01-14T00:00:00", - "2020-01-15T00:00:00", - "2020-01-16T00:00:00", - "2020-01-17T00:00:00", - "2020-01-21T00:00:00", - "2020-01-22T00:00:00", - "2020-01-23T00:00:00", - "2020-01-24T00:00:00", - "2020-01-27T00:00:00", - "2020-01-28T00:00:00", - "2020-01-29T00:00:00", - "2020-01-30T00:00:00", - "2020-01-31T00:00:00", - "2020-02-03T00:00:00", - "2020-02-04T00:00:00", - "2020-02-05T00:00:00", - "2020-02-06T00:00:00", - "2020-02-07T00:00:00", - "2020-02-10T00:00:00", - "2020-02-11T00:00:00", - "2020-02-12T00:00:00", - "2020-02-13T00:00:00", - "2020-02-14T00:00:00", - "2020-02-18T00:00:00", - "2020-02-19T00:00:00", - "2020-02-20T00:00:00", - "2020-02-21T00:00:00", - "2020-02-24T00:00:00", - "2020-02-25T00:00:00", - "2020-02-26T00:00:00", - "2020-02-27T00:00:00", - "2020-02-28T00:00:00", - "2020-03-02T00:00:00", - "2020-03-03T00:00:00", - "2020-03-04T00:00:00", - "2020-03-05T00:00:00", - "2020-03-06T00:00:00", - "2020-03-09T00:00:00", - "2020-03-10T00:00:00", - "2020-03-11T00:00:00", - "2020-03-12T00:00:00", - "2020-03-13T00:00:00", - "2020-03-16T00:00:00", - "2020-03-17T00:00:00", - "2020-03-18T00:00:00", - "2020-03-19T00:00:00", - "2020-03-20T00:00:00", - "2020-03-23T00:00:00", - "2020-03-24T00:00:00", - "2020-03-25T00:00:00", - "2020-03-26T00:00:00", - "2020-03-27T00:00:00", - "2020-03-30T00:00:00", - "2020-03-31T00:00:00", - "2020-04-01T00:00:00", - "2020-04-02T00:00:00", - "2020-04-03T00:00:00", - "2020-04-06T00:00:00", - "2020-04-07T00:00:00", - "2020-04-08T00:00:00", - "2020-04-09T00:00:00", - "2020-04-13T00:00:00", - "2020-04-14T00:00:00", - "2020-04-15T00:00:00", - "2020-04-16T00:00:00", - "2020-04-17T00:00:00", - "2020-04-20T00:00:00", - "2020-04-21T00:00:00", - "2020-04-22T00:00:00", - "2020-04-23T00:00:00", - "2020-04-24T00:00:00", - "2020-04-27T00:00:00", - "2020-04-28T00:00:00", - "2020-04-29T00:00:00", - "2020-04-30T00:00:00", - "2020-05-01T00:00:00", - "2020-05-04T00:00:00", - "2020-05-05T00:00:00", - "2020-05-06T00:00:00", - "2020-05-07T00:00:00", - "2020-05-08T00:00:00", - "2020-05-11T00:00:00", - "2020-05-12T00:00:00", - "2020-05-13T00:00:00", - "2020-05-14T00:00:00", - "2020-05-15T00:00:00", - "2020-05-18T00:00:00", - "2020-05-19T00:00:00", - "2020-05-20T00:00:00", - "2020-05-21T00:00:00", - "2020-05-22T00:00:00", - "2020-05-26T00:00:00", - "2020-05-27T00:00:00", - "2020-05-28T00:00:00", - "2020-05-29T00:00:00", - "2020-06-01T00:00:00", - "2020-06-02T00:00:00", - "2020-06-03T00:00:00", - "2020-06-04T00:00:00", - "2020-06-05T00:00:00", - "2020-06-08T00:00:00", - "2020-06-09T00:00:00", - "2020-06-10T00:00:00", - "2020-06-11T00:00:00", - "2020-06-12T00:00:00", - "2020-06-15T00:00:00", - "2020-06-16T00:00:00", - "2020-06-17T00:00:00", - "2020-06-18T00:00:00", - "2020-06-19T00:00:00", - "2020-06-22T00:00:00", - "2020-06-23T00:00:00", - "2020-06-24T00:00:00", - "2020-06-25T00:00:00", - "2020-06-26T00:00:00", - "2020-06-29T00:00:00", - "2020-06-30T00:00:00", - "2020-07-01T00:00:00", - "2020-07-02T00:00:00", - "2020-07-06T00:00:00", - "2020-07-07T00:00:00", - "2020-07-08T00:00:00", - "2020-07-09T00:00:00", - "2020-07-10T00:00:00", - "2020-07-13T00:00:00", - "2020-07-14T00:00:00", - "2020-07-15T00:00:00", - "2020-07-16T00:00:00", - "2020-07-17T00:00:00", - "2020-07-20T00:00:00", - "2020-07-21T00:00:00", - "2020-07-22T00:00:00", - "2020-07-23T00:00:00", - "2020-07-24T00:00:00", - "2020-07-27T00:00:00", - "2020-07-28T00:00:00", - "2020-07-29T00:00:00", - "2020-07-30T00:00:00", - "2020-07-31T00:00:00", - "2020-08-03T00:00:00", - "2020-08-04T00:00:00", - "2020-08-05T00:00:00", - "2020-08-06T00:00:00", - "2020-08-07T00:00:00", - "2020-08-10T00:00:00", - "2020-08-11T00:00:00", - "2020-08-12T00:00:00", - "2020-08-13T00:00:00", - "2020-08-14T00:00:00", - "2020-08-17T00:00:00", - "2020-08-18T00:00:00", - "2020-08-19T00:00:00", - "2020-08-20T00:00:00", - "2020-08-21T00:00:00", - "2020-08-24T00:00:00", - "2020-08-25T00:00:00", - "2020-08-26T00:00:00", - "2020-08-27T00:00:00", - "2020-08-28T00:00:00", - "2020-08-31T00:00:00", - "2020-09-01T00:00:00", - "2020-09-02T00:00:00", - "2020-09-03T00:00:00", - "2020-09-04T00:00:00", - "2020-09-08T00:00:00", - "2020-09-09T00:00:00", - "2020-09-10T00:00:00", - "2020-09-11T00:00:00", - "2020-09-14T00:00:00", - "2020-09-15T00:00:00", - "2020-09-16T00:00:00", - "2020-09-17T00:00:00", - "2020-09-18T00:00:00", - "2020-09-21T00:00:00", - "2020-09-22T00:00:00", - "2020-09-23T00:00:00", - "2020-09-24T00:00:00", - "2020-09-25T00:00:00", - "2020-09-28T00:00:00", - "2020-09-29T00:00:00", - "2020-09-30T00:00:00", - "2020-10-01T00:00:00", - "2020-10-02T00:00:00", - "2020-10-05T00:00:00", - "2020-10-06T00:00:00", - "2020-10-07T00:00:00", - "2020-10-08T00:00:00", - "2020-10-09T00:00:00", - "2020-10-12T00:00:00", - "2020-10-13T00:00:00", - "2020-10-14T00:00:00", - "2020-10-15T00:00:00", - "2020-10-16T00:00:00", - "2020-10-19T00:00:00", - "2020-10-20T00:00:00", - "2020-10-21T00:00:00", - "2020-10-22T00:00:00", - "2020-10-23T00:00:00", - "2020-10-26T00:00:00", - "2020-10-27T00:00:00", - "2020-10-28T00:00:00", - "2020-10-29T00:00:00", - "2020-10-30T00:00:00", - "2020-11-02T00:00:00", - "2020-11-03T00:00:00", - "2020-11-04T00:00:00", - "2020-11-05T00:00:00", - "2020-11-06T00:00:00", - "2020-11-09T00:00:00", - "2020-11-10T00:00:00", - "2020-11-11T00:00:00", - "2020-11-12T00:00:00", - "2020-11-13T00:00:00", - "2020-11-16T00:00:00", - "2020-11-17T00:00:00", - "2020-11-18T00:00:00", - "2020-11-19T00:00:00", - "2020-11-20T00:00:00", - "2020-11-23T00:00:00", - "2020-11-24T00:00:00", - "2020-11-25T00:00:00", - "2020-11-27T00:00:00", - "2020-11-30T00:00:00", - "2020-12-01T00:00:00", - "2020-12-02T00:00:00", - "2020-12-03T00:00:00", - "2020-12-04T00:00:00", - "2020-12-07T00:00:00", - "2020-12-08T00:00:00", - "2020-12-09T00:00:00", - "2020-12-10T00:00:00", - "2020-12-11T00:00:00", - "2020-12-14T00:00:00", - "2020-12-15T00:00:00", - "2020-12-16T00:00:00", - "2020-12-17T00:00:00", - "2020-12-18T00:00:00", - "2020-12-21T00:00:00", - "2020-12-22T00:00:00", - "2020-12-23T00:00:00", - "2020-12-24T00:00:00", - "2020-12-28T00:00:00", - "2020-12-29T00:00:00", - "2020-12-30T00:00:00", - "2020-12-31T00:00:00", - "2021-01-01T00:00:00", - "2021-01-04T00:00:00", - "2021-01-06T00:00:00", - "2021-01-07T00:00:00", - "2021-01-08T00:00:00", - "2021-01-11T00:00:00", - "2021-01-12T00:00:00", - "2021-01-13T00:00:00", - "2021-01-14T00:00:00", - "2021-01-15T00:00:00", - "2021-01-19T00:00:00", - "2021-01-20T00:00:00", - "2021-01-21T00:00:00", - "2021-01-22T00:00:00", - "2021-01-25T00:00:00", - "2021-01-26T00:00:00", - "2021-01-27T00:00:00", - "2021-01-28T00:00:00", - "2021-01-29T00:00:00", - "2021-02-01T00:00:00", - "2021-02-02T00:00:00", - "2021-02-03T00:00:00", - "2021-02-04T00:00:00", - "2021-02-05T00:00:00", - "2021-02-08T00:00:00", - "2021-02-09T00:00:00", - "2021-02-10T00:00:00", - "2021-02-11T00:00:00", - "2021-02-12T00:00:00", - "2021-02-16T00:00:00", - "2021-02-17T00:00:00", - "2021-02-18T00:00:00", - "2021-02-19T00:00:00", - "2021-02-22T00:00:00", - "2021-02-23T00:00:00", - "2021-02-24T00:00:00", - "2021-02-25T00:00:00", - "2021-02-26T00:00:00", - "2021-03-01T00:00:00", - "2021-03-02T00:00:00", - "2021-03-03T00:00:00", - "2021-03-04T00:00:00", - "2021-03-05T00:00:00", - "2021-03-08T00:00:00", - "2021-03-09T00:00:00", - "2021-03-10T00:00:00", - "2021-03-11T00:00:00", - "2021-03-12T00:00:00", - "2021-03-15T00:00:00", - "2021-03-16T00:00:00", - "2021-03-17T00:00:00", - "2021-03-18T00:00:00", - "2021-03-19T00:00:00", - "2021-03-22T00:00:00", - "2021-03-23T00:00:00", - "2021-03-24T00:00:00", - "2021-03-25T00:00:00", - "2021-03-26T00:00:00", - "2021-03-29T00:00:00", - "2021-03-30T00:00:00", - "2021-03-31T00:00:00", - "2021-04-01T00:00:00", - "2021-04-05T00:00:00", - "2021-04-06T00:00:00", - "2021-04-07T00:00:00", - "2021-04-08T00:00:00", - "2021-04-09T00:00:00", - "2021-04-12T00:00:00", - "2021-04-13T00:00:00", - "2021-04-14T00:00:00", - "2021-04-15T00:00:00", - "2021-04-16T00:00:00", - "2021-04-19T00:00:00", - "2021-04-20T00:00:00", - "2021-04-21T00:00:00", - "2021-04-22T00:00:00", - "2021-04-23T00:00:00", - "2021-04-26T00:00:00", - "2021-04-27T00:00:00", - "2021-04-28T00:00:00", - "2021-04-29T00:00:00", - "2021-04-30T00:00:00", - "2021-05-03T00:00:00", - "2021-05-04T00:00:00", - "2021-05-05T00:00:00", - "2021-05-06T00:00:00", - "2021-05-07T00:00:00", - "2021-05-10T00:00:00", - "2021-05-11T00:00:00", - "2021-05-12T00:00:00", - "2021-05-13T00:00:00", - "2021-05-14T00:00:00", - "2021-05-17T00:00:00", - "2021-05-18T00:00:00", - "2021-05-19T00:00:00", - "2021-05-20T00:00:00", - "2021-05-21T00:00:00", - "2021-05-24T00:00:00", - "2021-05-25T00:00:00", - "2021-05-26T00:00:00", - "2021-05-27T00:00:00", - "2021-05-28T00:00:00", - "2021-06-01T00:00:00", - "2021-06-02T00:00:00", - "2021-06-03T00:00:00", - "2021-06-04T00:00:00", - "2021-06-07T00:00:00", - "2021-06-08T00:00:00", - "2021-06-09T00:00:00", - "2021-06-10T00:00:00", - "2021-06-11T00:00:00", - "2021-06-14T00:00:00", - "2021-06-15T00:00:00", - "2021-06-16T00:00:00", - "2021-06-17T00:00:00", - "2021-06-18T00:00:00", - "2021-06-21T00:00:00", - "2021-06-22T00:00:00", - "2021-06-23T00:00:00", - "2021-06-24T00:00:00", - "2021-06-25T00:00:00", - "2021-06-28T00:00:00", - "2021-06-29T00:00:00", - "2021-06-30T00:00:00", - "2021-07-01T00:00:00", - "2021-07-02T00:00:00", - "2021-07-05T00:00:00", - "2021-07-06T00:00:00", - "2021-07-07T00:00:00", - "2021-07-08T00:00:00", - "2021-07-09T00:00:00", - "2021-07-12T00:00:00", - "2021-07-13T00:00:00", - "2021-07-14T00:00:00", - "2021-07-15T00:00:00", - "2021-07-16T00:00:00", - "2021-07-19T00:00:00", - "2021-07-20T00:00:00", - "2021-07-21T00:00:00", - "2021-07-22T00:00:00", - "2021-07-23T00:00:00", - "2021-07-26T00:00:00", - "2021-07-27T00:00:00", - "2021-07-28T00:00:00", - "2021-07-29T00:00:00", - "2021-07-30T00:00:00", - "2021-08-02T00:00:00", - "2021-08-03T00:00:00", - "2021-08-04T00:00:00", - "2021-08-05T00:00:00", - "2021-08-06T00:00:00", - "2021-08-09T00:00:00", - "2021-08-10T00:00:00", - "2021-08-11T00:00:00", - "2021-08-12T00:00:00", - "2021-08-13T00:00:00", - "2021-08-16T00:00:00", - "2021-08-17T00:00:00", - "2021-08-18T00:00:00", - "2021-08-19T00:00:00", - "2021-08-20T00:00:00", - "2021-08-23T00:00:00", - "2021-08-24T00:00:00", - "2021-08-25T00:00:00", - "2021-08-26T00:00:00", - "2021-08-27T00:00:00", - "2021-08-30T00:00:00", - "2021-08-31T00:00:00", - "2021-09-01T00:00:00", - "2021-09-02T00:00:00", - "2021-09-03T00:00:00", - "2021-09-07T00:00:00", - "2021-09-08T00:00:00", - "2021-09-09T00:00:00", - "2021-09-10T00:00:00", - "2021-09-13T00:00:00", - "2021-09-14T00:00:00", - "2021-09-15T00:00:00", - "2021-09-16T00:00:00", - "2021-09-17T00:00:00", - "2021-09-20T00:00:00", - "2021-09-21T00:00:00", - "2021-09-22T00:00:00", - "2021-09-23T00:00:00", - "2021-09-24T00:00:00", - "2021-09-27T00:00:00", - "2021-09-28T00:00:00", - "2021-09-29T00:00:00", - "2021-09-30T00:00:00", - "2021-10-01T00:00:00", - "2021-10-04T00:00:00", - "2021-10-05T00:00:00", - "2021-10-06T00:00:00", - "2021-10-07T00:00:00", - "2021-10-08T00:00:00", - "2021-10-11T00:00:00", - "2021-10-12T00:00:00", - "2021-10-13T00:00:00", - "2021-10-14T00:00:00", - "2021-10-15T00:00:00", - "2021-10-18T00:00:00", - "2021-10-19T00:00:00", - "2021-10-20T00:00:00", - "2021-10-21T00:00:00", - "2021-10-22T00:00:00", - "2021-10-25T00:00:00", - "2021-10-26T00:00:00", - "2021-10-27T00:00:00", - "2021-10-28T00:00:00", - "2021-10-29T00:00:00", - "2021-11-01T00:00:00", - "2021-11-02T00:00:00", - "2021-11-03T00:00:00", - "2021-11-04T00:00:00", - "2021-11-05T00:00:00", - "2021-11-08T00:00:00", - "2021-11-09T00:00:00", - "2021-11-10T00:00:00", - "2021-11-11T00:00:00", - "2021-11-12T00:00:00", - "2021-11-15T00:00:00", - "2021-11-16T00:00:00", - "2021-11-17T00:00:00", - "2021-11-18T00:00:00", - "2021-11-19T00:00:00", - "2021-11-22T00:00:00", - "2021-11-23T00:00:00", - "2021-11-24T00:00:00", - "2021-11-25T00:00:00", - "2021-11-26T00:00:00", - "2021-11-29T00:00:00", - "2021-11-30T00:00:00", - "2021-12-01T00:00:00", - "2021-12-02T00:00:00", - "2021-12-03T00:00:00", - "2021-12-06T00:00:00", - "2021-12-07T00:00:00", - "2021-12-08T00:00:00", - "2021-12-09T00:00:00", - "2021-12-10T00:00:00", - "2021-12-13T00:00:00", - "2021-12-14T00:00:00", - "2021-12-15T00:00:00", - "2021-12-16T00:00:00", - "2021-12-17T00:00:00", - "2021-12-20T00:00:00", - "2021-12-21T00:00:00", - "2021-12-22T00:00:00", - "2021-12-23T00:00:00", - "2021-12-27T00:00:00", - "2021-12-28T00:00:00", - "2021-12-29T00:00:00", - "2021-12-30T00:00:00", - "2021-12-31T00:00:00", - "2022-01-03T00:00:00", - "2022-01-05T00:00:00", - "2022-01-06T00:00:00", - "2022-01-07T00:00:00", - "2022-01-10T00:00:00", - "2022-01-11T00:00:00", - "2022-01-12T00:00:00", - "2022-01-13T00:00:00", - "2022-01-14T00:00:00", - "2022-01-18T00:00:00", - "2022-01-19T00:00:00", - "2022-01-20T00:00:00", - "2022-01-21T00:00:00", - "2022-01-24T00:00:00", - "2022-01-25T00:00:00", - "2022-01-26T00:00:00", - "2022-01-27T00:00:00", - "2022-01-28T00:00:00", - "2022-01-31T00:00:00", - "2022-02-01T00:00:00", - "2022-02-02T00:00:00", - "2022-02-03T00:00:00", - "2022-02-04T00:00:00", - "2022-02-07T00:00:00", - "2022-02-08T00:00:00", - "2022-02-09T00:00:00", - "2022-02-10T00:00:00", - "2022-02-11T00:00:00", - "2022-02-14T00:00:00", - "2022-02-15T00:00:00", - "2022-02-16T00:00:00", - "2022-02-17T00:00:00", - "2022-02-18T00:00:00", - "2022-02-22T00:00:00", - "2022-02-23T00:00:00", - "2022-02-24T00:00:00", - "2022-02-25T00:00:00", - "2022-02-28T00:00:00", - "2022-03-01T00:00:00", - "2022-03-02T00:00:00", - "2022-03-03T00:00:00", - "2022-03-04T00:00:00", - "2022-03-07T00:00:00", - "2022-03-08T00:00:00", - "2022-03-09T00:00:00", - "2022-03-10T00:00:00", - "2022-03-11T00:00:00", - "2022-03-14T00:00:00", - "2022-03-15T00:00:00", - "2022-03-16T00:00:00", - "2022-03-17T00:00:00", - "2022-03-18T00:00:00", - "2022-03-21T00:00:00", - "2022-03-22T00:00:00", - "2022-03-23T00:00:00", - "2022-03-24T00:00:00", - "2022-03-25T00:00:00", - "2022-03-28T00:00:00", - "2022-03-29T00:00:00", - "2022-03-30T00:00:00", - "2022-03-31T00:00:00", - "2022-04-01T00:00:00", - "2022-04-04T00:00:00", - "2022-04-05T00:00:00", - "2022-04-06T00:00:00", - "2022-04-07T00:00:00", - "2022-04-08T00:00:00", - "2022-04-11T00:00:00", - "2022-04-12T00:00:00", - "2022-04-13T00:00:00", - "2022-04-14T00:00:00", - "2022-04-18T00:00:00", - "2022-04-19T00:00:00", - "2022-04-20T00:00:00", - "2022-04-21T00:00:00", - "2022-04-22T00:00:00", - "2022-04-25T00:00:00", - "2022-04-26T00:00:00", - "2022-04-27T00:00:00", - "2022-04-28T00:00:00", - "2022-04-29T00:00:00", - "2022-05-03T00:00:00", - "2022-05-04T00:00:00", - "2022-05-05T00:00:00", - "2022-05-06T00:00:00", - "2022-05-09T00:00:00", - "2022-05-10T00:00:00", - "2022-08-01T00:00:00", - "2022-08-02T00:00:00", - "2022-08-03T00:00:00", - "2022-08-04T00:00:00", - "2022-08-05T00:00:00", - "2022-08-08T00:00:00", - "2022-08-09T00:00:00", - "2022-08-10T00:00:00", - "2022-08-11T00:00:00", - "2022-08-12T00:00:00", - "2022-08-15T00:00:00", - "2022-08-16T00:00:00", - "2022-08-17T00:00:00", - "2022-08-18T00:00:00", - "2022-08-19T00:00:00", - "2022-08-22T00:00:00", - "2022-08-23T00:00:00", - "2022-08-24T00:00:00", - "2022-08-25T00:00:00", - "2022-08-26T00:00:00", - "2022-08-29T00:00:00", - "2022-08-30T00:00:00", - "2022-08-31T00:00:00", - "2022-09-01T00:00:00", - "2022-09-02T00:00:00", - "2022-09-06T00:00:00", - "2022-09-07T00:00:00", - "2022-09-14T00:00:00", - "2022-09-15T00:00:00", - "2022-10-27T00:00:00", - "2022-10-28T00:00:00", - "2022-10-31T00:00:00", - "2022-11-01T00:00:00", - "2022-11-02T00:00:00", - "2022-11-03T00:00:00", - "2022-11-04T00:00:00", - "2022-11-14T00:00:00", - "2022-11-15T00:00:00", - "2022-11-16T00:00:00", - "2022-11-17T00:00:00", - "2022-11-18T00:00:00", - "2022-11-21T00:00:00", - "2022-11-22T00:00:00", - "2022-11-23T00:00:00", - "2022-11-25T00:00:00", - "2022-11-28T00:00:00", - "2022-11-29T00:00:00", - "2022-11-30T00:00:00", - "2022-12-01T00:00:00", - "2022-12-02T00:00:00", - "2022-12-05T00:00:00", - "2022-12-06T00:00:00", - "2022-12-07T00:00:00", - "2022-12-08T00:00:00", - "2022-12-09T00:00:00", - "2022-12-12T00:00:00", - "2022-12-13T00:00:00", - "2022-12-14T00:00:00", - "2022-12-15T00:00:00", - "2022-12-16T00:00:00", - "2022-12-19T00:00:00", - "2022-12-20T00:00:00", - "2022-12-21T00:00:00", - "2022-12-22T00:00:00", - "2022-12-23T00:00:00", - "2022-12-27T00:00:00", - "2022-12-28T00:00:00", - "2022-12-29T00:00:00", - "2022-12-30T00:00:00", - "2023-01-02T00:00:00", - "2023-01-03T00:00:00", - "2023-01-05T00:00:00", - "2023-01-06T00:00:00", - "2023-01-09T00:00:00", - "2023-01-10T00:00:00", - "2023-01-11T00:00:00", - "2023-01-12T00:00:00", - "2023-01-13T00:00:00", - "2023-01-17T00:00:00", - "2023-01-18T00:00:00", - "2023-01-19T00:00:00", - "2023-01-20T00:00:00", - "2023-01-23T00:00:00", - "2023-01-24T00:00:00", - "2023-01-25T00:00:00", - "2023-01-26T00:00:00", - "2023-01-27T00:00:00", - "2023-01-30T00:00:00", - "2023-01-31T00:00:00", - "2023-02-01T00:00:00", - "2023-02-02T00:00:00", - "2023-02-03T00:00:00", - "2023-02-06T00:00:00", - "2023-02-07T00:00:00", - "2023-02-08T00:00:00", - "2023-02-09T00:00:00", - "2023-02-10T00:00:00", - "2023-02-13T00:00:00", - "2023-02-14T00:00:00", - "2023-02-15T00:00:00", - "2023-02-16T00:00:00", - "2023-02-17T00:00:00", - "2023-02-21T00:00:00", - "2023-02-22T00:00:00", - "2023-02-23T00:00:00", - "2023-02-24T00:00:00", - "2023-02-27T00:00:00", - "2023-02-28T00:00:00", - "2023-03-01T00:00:00", - "2023-03-02T00:00:00", - "2023-03-03T00:00:00", - "2023-03-06T00:00:00", - "2023-03-07T00:00:00", - "2023-03-08T00:00:00", - "2023-03-09T00:00:00", - "2023-03-10T00:00:00", - "2023-03-13T00:00:00", - "2023-03-14T00:00:00", - "2023-03-15T00:00:00", - "2023-03-16T00:00:00", - "2023-03-17T00:00:00", - "2023-03-20T00:00:00", - "2023-03-21T00:00:00", - "2023-03-22T00:00:00", - "2023-03-23T00:00:00", - "2023-03-24T00:00:00", - "2023-03-27T00:00:00", - "2023-03-28T00:00:00", - "2023-03-29T00:00:00", - "2023-03-30T00:00:00", - "2023-03-31T00:00:00", - "2023-04-03T00:00:00", - "2023-04-04T00:00:00", - "2023-04-05T00:00:00", - "2023-04-06T00:00:00", - "2023-04-07T00:00:00", - "2023-04-10T00:00:00", - "2023-04-11T00:00:00", - "2023-04-12T00:00:00", - "2023-04-13T00:00:00", - "2023-04-14T00:00:00", - "2023-04-17T00:00:00", - "2023-04-18T00:00:00", - "2023-04-19T00:00:00", - "2023-04-20T00:00:00", - "2023-04-21T00:00:00", - "2023-04-24T00:00:00", - "2023-04-25T00:00:00", - "2023-04-26T00:00:00", - "2023-04-27T00:00:00", - "2023-04-28T00:00:00", - "2023-05-01T00:00:00", - "2023-05-02T00:00:00", - "2023-05-03T00:00:00", - "2023-05-04T00:00:00", - "2023-05-05T00:00:00", - "2023-05-08T00:00:00", - "2023-05-09T00:00:00", - "2023-05-10T00:00:00", - "2023-05-11T00:00:00", - "2023-05-12T00:00:00", - "2023-05-15T00:00:00", - "2023-05-16T00:00:00", - "2023-05-17T00:00:00", - "2023-05-18T00:00:00", - "2023-05-19T00:00:00", - "2023-05-22T00:00:00", - "2023-05-23T00:00:00", - "2023-05-24T00:00:00", - "2023-05-25T00:00:00", - "2023-05-26T00:00:00", - "2023-05-30T00:00:00", - "2023-05-31T00:00:00", - "2023-06-01T00:00:00", - "2023-06-02T00:00:00", - "2023-06-05T00:00:00", - "2023-06-06T00:00:00", - "2023-06-07T00:00:00", - "2023-06-08T00:00:00", - "2023-06-09T00:00:00", - "2023-06-12T00:00:00", - "2023-06-13T00:00:00", - "2023-06-14T00:00:00", - "2023-06-15T00:00:00", - "2023-06-16T00:00:00", - "2023-06-19T00:00:00", - "2023-06-20T00:00:00", - "2023-06-21T00:00:00", - "2023-06-22T00:00:00", - "2023-06-23T00:00:00", - "2023-06-26T00:00:00", - "2023-06-27T00:00:00", - "2023-06-28T00:00:00", - "2023-06-29T00:00:00", - "2023-06-30T00:00:00", - "2023-07-03T00:00:00", - "2023-07-05T00:00:00", - "2023-07-06T00:00:00", - "2023-07-07T00:00:00", - "2023-07-10T00:00:00", - "2023-07-11T00:00:00", - "2023-07-12T00:00:00", - "2023-07-13T00:00:00", - "2023-07-14T00:00:00", - "2023-07-17T00:00:00", - "2023-07-18T00:00:00", - "2023-07-19T00:00:00", - "2023-07-20T00:00:00", - "2023-07-21T00:00:00", - "2023-07-24T00:00:00", - "2023-07-25T00:00:00", - "2023-07-26T00:00:00", - "2023-07-27T00:00:00", - "2023-07-28T00:00:00", - "2023-07-31T00:00:00", - "2023-08-01T00:00:00", - "2023-08-02T00:00:00", - "2023-08-03T00:00:00", - "2023-08-04T00:00:00", - "2023-08-07T00:00:00", - "2023-08-08T00:00:00", - "2023-08-09T00:00:00", - "2023-08-10T00:00:00", - "2023-08-11T00:00:00", - "2023-08-14T00:00:00", - "2023-08-15T00:00:00", - "2023-08-16T00:00:00", - "2023-08-17T00:00:00", - "2023-08-18T00:00:00", - "2023-08-21T00:00:00", - "2023-08-22T00:00:00", - "2023-08-23T00:00:00", - "2023-08-24T00:00:00", - "2023-08-25T00:00:00", - "2023-08-28T00:00:00", - "2023-08-29T00:00:00", - "2023-08-30T00:00:00", - "2023-08-31T00:00:00", - "2023-09-01T00:00:00", - "2023-09-05T00:00:00", - "2023-09-06T00:00:00", - "2023-09-07T00:00:00", - "2023-09-08T00:00:00", - "2023-09-11T00:00:00", - "2023-09-12T00:00:00", - "2023-09-13T00:00:00", - "2023-09-14T00:00:00", - "2023-09-15T00:00:00", - "2023-09-18T00:00:00", - "2023-09-19T00:00:00", - "2023-09-20T00:00:00", - "2023-09-21T00:00:00", - "2023-09-22T00:00:00", - "2023-09-25T00:00:00", - "2023-09-26T00:00:00", - "2023-09-27T00:00:00", - "2023-09-28T00:00:00", - "2023-09-29T00:00:00", - "2023-10-02T00:00:00", - "2023-10-03T00:00:00", - "2023-10-04T00:00:00", - "2023-10-05T00:00:00", - "2023-10-06T00:00:00", - "2023-10-09T00:00:00", - "2023-10-10T00:00:00", - "2023-10-11T00:00:00", - "2023-10-12T00:00:00", - "2023-10-13T00:00:00", - "2023-10-16T00:00:00", - "2023-10-17T00:00:00", - "2023-10-18T00:00:00", - "2023-10-19T00:00:00", - "2023-10-20T00:00:00", - "2023-10-23T00:00:00", - "2023-10-24T00:00:00", - "2023-10-25T00:00:00", - "2023-10-26T00:00:00", - "2023-10-27T00:00:00", - "2023-10-30T00:00:00", - "2023-10-31T00:00:00", - "2023-11-01T00:00:00", - "2023-11-02T00:00:00", - "2023-11-03T00:00:00", - "2023-11-06T00:00:00", - "2023-11-07T00:00:00", - "2023-11-08T00:00:00", - "2023-11-09T00:00:00", - "2023-11-10T00:00:00", - "2023-11-13T00:00:00", - "2023-11-14T00:00:00", - "2023-11-15T00:00:00", - "2023-11-16T00:00:00", - "2023-11-17T00:00:00", - "2023-11-20T00:00:00", - "2023-11-21T00:00:00", - "2023-11-22T00:00:00", - "2023-11-23T00:00:00", - "2023-11-24T00:00:00", - "2023-11-27T00:00:00", - "2023-11-28T00:00:00", - "2023-11-29T00:00:00", - "2023-11-30T00:00:00", - "2023-12-01T00:00:00", - "2023-12-04T00:00:00", - "2023-12-05T00:00:00", - "2023-12-06T00:00:00", - "2023-12-07T00:00:00", - "2023-12-08T00:00:00", - "2023-12-11T00:00:00", - "2023-12-12T00:00:00", - "2023-12-13T00:00:00", - "2023-12-14T00:00:00", - "2023-12-15T00:00:00", - "2023-12-18T00:00:00", - "2023-12-19T00:00:00", - "2023-12-20T00:00:00", - "2023-12-21T00:00:00", - "2023-12-22T00:00:00", - "2023-12-25T00:00:00", - "2023-12-26T00:00:00", - "2023-12-27T00:00:00", - "2023-12-28T00:00:00", - "2023-12-29T00:00:00", - "2024-01-01T00:00:00", - "2024-01-02T00:00:00", - "2024-01-04T00:00:00", - "2024-01-05T00:00:00", - "2024-01-08T00:00:00", - "2024-01-09T00:00:00", - "2024-01-10T00:00:00", - "2024-01-11T00:00:00", - "2024-01-12T00:00:00", - "2024-01-15T00:00:00", - "2024-01-16T00:00:00", - "2024-01-17T00:00:00", - "2024-01-18T00:00:00", - "2024-01-19T00:00:00", - "2024-01-22T00:00:00", - "2024-01-23T00:00:00", - "2024-01-24T00:00:00", - "2024-01-25T00:00:00", - "2024-01-26T00:00:00", - "2024-01-29T00:00:00", - "2024-01-30T00:00:00", - "2024-01-31T00:00:00", - "2024-02-01T00:00:00", - "2024-02-02T00:00:00", - "2024-02-05T00:00:00", - "2024-02-06T00:00:00", - "2024-02-07T00:00:00", - "2024-02-08T00:00:00", - "2024-02-09T00:00:00", - "2024-02-12T00:00:00", - "2024-02-13T00:00:00", - "2024-02-14T00:00:00", - "2024-02-15T00:00:00", - "2024-02-16T00:00:00", - "2024-02-20T00:00:00", - "2024-02-21T00:00:00", - "2024-02-22T00:00:00", - "2024-02-23T00:00:00", - "2024-02-26T00:00:00", - "2024-02-27T00:00:00", - "2024-02-28T00:00:00", - "2024-02-29T00:00:00", - "2024-03-01T00:00:00", - "2024-03-04T00:00:00", - "2024-03-05T00:00:00", - "2024-03-06T00:00:00", - "2024-03-07T00:00:00", - "2024-03-08T00:00:00", - "2024-03-11T00:00:00", - "2024-03-12T00:00:00", - "2024-03-13T00:00:00", - "2024-03-14T00:00:00", - "2024-03-15T00:00:00", - "2024-03-18T00:00:00", - "2024-03-19T00:00:00", - "2024-03-20T00:00:00", - "2024-03-21T00:00:00", - "2024-03-22T00:00:00", - "2024-03-25T00:00:00", - "2024-03-26T00:00:00", - "2024-03-27T00:00:00", - "2024-03-28T00:00:00", - "2024-04-01T00:00:00", - "2024-04-02T00:00:00", - "2024-04-03T00:00:00", - "2024-04-04T00:00:00", - "2024-04-05T00:00:00", - "2024-04-08T00:00:00", - "2024-04-09T00:00:00", - "2024-04-10T00:00:00", - "2024-04-11T00:00:00", - "2024-04-12T00:00:00", - "2024-04-15T00:00:00", - "2024-04-16T00:00:00", - "2024-04-17T00:00:00", - "2024-04-18T00:00:00", - "2024-04-19T00:00:00", - "2024-04-22T00:00:00", - "2024-04-23T00:00:00", - "2024-04-24T00:00:00", - "2024-04-25T00:00:00", - "2024-04-26T00:00:00", - "2024-04-29T00:00:00", - "2024-04-30T00:00:00", - "2024-05-01T00:00:00", - "2024-05-02T00:00:00", - "2024-05-03T00:00:00", - "2024-05-06T00:00:00", - "2024-05-07T00:00:00", - "2024-05-08T00:00:00", - "2024-05-09T00:00:00", - "2024-05-10T00:00:00", - "2024-05-13T00:00:00", - "2024-05-14T00:00:00", - "2024-05-15T00:00:00", - "2024-05-16T00:00:00", - "2024-05-17T00:00:00", - "2024-05-20T00:00:00", - "2024-05-21T00:00:00", - "2024-05-22T00:00:00", - "2024-05-23T00:00:00", - "2024-05-24T00:00:00", - "2024-05-28T00:00:00", - "2024-05-29T00:00:00", - "2024-05-30T00:00:00", - "2024-05-31T00:00:00", - "2024-06-03T00:00:00", - "2024-06-04T00:00:00", - "2024-06-05T00:00:00", - "2024-06-06T00:00:00", - "2024-06-07T00:00:00", - "2024-06-10T00:00:00", - "2024-06-11T00:00:00", - "2024-06-12T00:00:00", - "2024-06-13T00:00:00", - "2024-06-14T00:00:00", - "2024-06-17T00:00:00", - "2024-06-18T00:00:00", - "2024-06-20T00:00:00", - "2024-06-21T00:00:00", - "2024-06-24T00:00:00", - "2024-06-25T00:00:00", - "2024-06-26T00:00:00", - "2024-06-27T00:00:00", - "2024-06-28T00:00:00", - "2024-07-01T00:00:00", - "2024-07-02T00:00:00", - "2024-07-03T00:00:00", - "2024-07-05T00:00:00", - "2024-07-08T00:00:00", - "2024-07-09T00:00:00", - "2024-07-10T00:00:00", - "2024-07-11T00:00:00", - "2024-07-12T00:00:00", - "2024-07-15T00:00:00", - "2024-07-16T00:00:00", - "2024-07-17T00:00:00", - "2024-07-18T00:00:00", - "2024-07-19T00:00:00", - "2024-07-22T00:00:00", - "2024-07-23T00:00:00", - "2024-07-24T00:00:00", - "2024-07-25T00:00:00", - "2024-07-26T00:00:00", - "2024-07-29T00:00:00", - "2024-07-30T00:00:00", - "2024-07-31T00:00:00", - "2024-08-01T00:00:00", - "2024-08-02T00:00:00", - "2024-08-05T00:00:00", - "2024-08-06T00:00:00", - "2024-08-07T00:00:00", - "2024-08-08T00:00:00", - "2024-08-09T00:00:00", - "2024-08-12T00:00:00", - "2024-08-13T00:00:00", - "2024-08-14T00:00:00", - "2024-08-15T00:00:00", - "2024-08-16T00:00:00", - "2024-08-19T00:00:00", - "2024-08-20T00:00:00", - "2024-08-21T00:00:00", - "2024-08-22T00:00:00", - "2024-08-23T00:00:00", - "2024-08-26T00:00:00", - "2024-08-27T00:00:00", - "2024-08-28T00:00:00", - "2024-08-29T00:00:00", - "2024-08-30T00:00:00", - "2024-09-03T00:00:00", - "2024-09-04T00:00:00", - "2024-09-05T00:00:00", - "2024-09-06T00:00:00", - "2024-09-09T00:00:00", - "2024-09-10T00:00:00", - "2024-09-11T00:00:00", - "2024-09-12T00:00:00", - "2024-09-13T00:00:00", - "2024-09-16T00:00:00", - "2024-09-17T00:00:00", - "2024-09-18T00:00:00", - "2024-09-19T00:00:00", - "2024-09-20T00:00:00", - "2024-09-23T00:00:00", - "2024-09-24T00:00:00", - "2024-09-25T00:00:00", - "2024-09-26T00:00:00", - "2024-09-27T00:00:00", - "2024-09-30T00:00:00", - "2024-10-01T00:00:00", - "2024-10-02T00:00:00", - "2024-10-03T00:00:00", - "2024-10-04T00:00:00", - "2024-10-07T00:00:00", - "2024-10-08T00:00:00", - "2024-10-09T00:00:00", - "2024-10-10T00:00:00", - "2024-10-11T00:00:00", - "2024-10-14T00:00:00", - "2024-10-15T00:00:00", - "2024-10-16T00:00:00", - "2024-10-17T00:00:00", - "2024-10-18T00:00:00", - "2024-10-21T00:00:00", - "2024-10-22T00:00:00", - "2024-10-23T00:00:00", - "2024-10-24T00:00:00", - "2024-10-25T00:00:00", - "2024-10-28T00:00:00", - "2024-10-29T00:00:00", - "2024-10-30T00:00:00", - "2024-10-31T00:00:00", - "2024-11-01T00:00:00", - "2024-11-04T00:00:00", - "2024-11-05T00:00:00", - "2024-11-06T00:00:00", - "2024-11-07T00:00:00", - "2024-11-08T00:00:00", - "2024-11-11T00:00:00", - "2024-11-12T00:00:00", - "2024-11-13T00:00:00", - "2024-11-14T00:00:00", - "2024-11-15T00:00:00", - "2024-11-18T00:00:00", - "2024-11-19T00:00:00", - "2024-11-20T00:00:00", - "2024-11-21T00:00:00", - "2024-11-22T00:00:00", - "2024-11-25T00:00:00", - "2024-11-26T00:00:00", - "2024-11-27T00:00:00", - "2024-11-28T00:00:00", - "2024-11-29T00:00:00", - "2024-12-02T00:00:00", - "2024-12-03T00:00:00", - "2024-12-04T00:00:00", - "2024-12-05T00:00:00", - "2024-12-06T00:00:00", - "2024-12-09T00:00:00", - "2024-12-10T00:00:00", - "2024-12-11T00:00:00", - "2024-12-12T00:00:00", - "2024-12-13T00:00:00", - "2024-12-16T00:00:00", - "2024-12-17T00:00:00", - "2024-12-18T00:00:00", - "2024-12-19T00:00:00", - "2024-12-20T00:00:00", - "2024-12-23T00:00:00", - "2024-12-24T00:00:00", - "2024-12-25T00:00:00", - "2024-12-26T00:00:00", - "2024-12-27T00:00:00", - "2024-12-30T00:00:00", - "2024-12-31T00:00:00", - "2025-01-01T00:00:00", - "2025-01-02T00:00:00", - "2025-01-06T00:00:00", - "2025-01-07T00:00:00", - "2025-01-08T00:00:00", - "2025-01-09T00:00:00", - "2025-01-10T00:00:00", - "2025-01-13T00:00:00", - "2025-01-14T00:00:00", - "2025-01-15T00:00:00", - "2025-01-16T00:00:00", - "2025-01-17T00:00:00", - "2025-01-21T00:00:00", - "2025-01-22T00:00:00", - "2025-01-23T00:00:00", - "2025-01-24T00:00:00", - "2025-01-27T00:00:00", - "2025-01-28T00:00:00", - "2025-01-29T00:00:00", - "2025-01-30T00:00:00", - "2025-01-31T00:00:00", - "2025-02-03T00:00:00", - "2025-02-04T00:00:00", - "2025-02-05T00:00:00", - "2025-02-06T00:00:00", - "2025-02-07T00:00:00", - "2025-02-10T00:00:00", - "2025-02-11T00:00:00", - "2025-02-12T00:00:00", - "2025-02-13T00:00:00", - "2025-02-14T00:00:00", - "2025-02-18T00:00:00", - "2025-02-19T00:00:00", - "2025-02-20T00:00:00", - "2025-02-21T00:00:00", - "2025-02-24T00:00:00", - "2025-02-25T00:00:00", - "2025-02-26T00:00:00", - "2025-02-27T00:00:00", - "2025-02-28T00:00:00", - "2025-03-03T00:00:00" - ], - "xaxis": "x", - "y": [ - 0, - 0, - 0, - -0.012243611771785123, - -0.01591401645922963, - -0.040848298969269226, - -0.019046095125848983, - -0.05052347320066708, - -0.03339065310005451, - 0, - -0.01963650487086388, - -0.04347321209780819, - 0, - 0, - 0, - 0, - -0.04384787426530512, - -0.06725716226749245, - -0.0011457141221827838, - 0, - -0.019463884347592386, - 0, - 0, - 0, - -0.001638470529296554, - -0.008423739775556216, - -0.029695217438977628, - -0.03593746510451268, - -0.031359816816453834, - -0.04800581059121445, - -0.06775391758285143, - -0.024474333768473744, - -0.0010431398548028659, - -0.07844701090743944, - -0.09363648022690851, - -0.09513044300466245, - -0.09773137953196875, - -0.0801490486073776, - -0.12049477601895375, - -0.14972930258587736, - -0.1344149883130974, - -0.15611720269694151, - -0.16503083190558798, - -0.1545230483352702, - -0.17048239486682193, - -0.12141832821571541, - -0.11827639689072889, - -0.10722761852273166, - -0.09257914400094247, - -0.08235365976543563, - -0.05962125067531021, - -0.12670256794427648, - -0.08943634938103107, - -0.10599477441639504, - -0.1044846314384541, - -0.08854609239912081, - -0.045890733351296786, - -0.026955915432506417, - -0.018112731239664726, - -0.020188829629928073, - 0, - -0.021704513102907663, - -0.04495958659834698, - -0.05346854777074661, - -0.06412540205462469, - -0.05499685633083795, - -0.05096955674681358, - -0.08411733024608725, - -0.08091555865510636, - -0.04307959538366246, - -0.0733566271281696, - -0.07517407514557539, - -0.0661802572652912, - -0.051064335222091306, - -0.023472169866933235, - 0, - -0.011903335388408931, - 0, - -0.0003741655617094386, - 0, - -0.014762219631492157, - -0.043956571995884985, - -0.05079670606116016, - -0.026608671658752026, - -0.03551556802119238, - 0, - 0, - 0, - 0, - 0, - 0, - -0.11815675194559061, - -0.04594377076048628, - -0.02844204819866747, - -0.005407654286777364, - -0.027512106439347317, - -0.013618863533089609, - 0, - 0, - null, - 0, - 0, - -0.043803334403278216, - 0, - 0, - 0, - 0, - 0, - -0.11622198846291187, - -0.12254412372774359, - -0.09049209079075893, - -0.078297538922242, - -0.09131159472211281, - -0.09886237136860054, - -0.07470704323410249, - -0.06968512069354815, - -0.05069485778484739, - -0.04708535573039485, - -0.07366218095689459, - -0.07625067784834472, - -0.14470377025797854, - -0.1110708513928731, - -0.16404719454521988, - -0.15179656639997197, - -0.22736329479006745, - -0.2397418251779232, - -0.25512966384138025, - -0.24847352897765163, - -0.18461996280285575, - -0.14409865432241797, - -0.09565678392528676, - -0.08853543533452346, - -0.07164459847603122, - -0.08383558383576206, - 0, - -0.004306077632947436, - 0, - 0, - 0, - 0, - 0, - -0.06243920266850855, - -0.08527282964141436, - -0.09672068653660859, - -0.069176970698546, - -0.0420926799992245, - -0.041985087359231565, - 0, - 0, - 0, - 0, - -0.13087722471412744, - -0.09668103254962301, - -0.038072609213995356, - -0.041114255706434455, - -0.062313753575727104, - -0.10298155042130663, - 0, - 0, - -0.003775222483537788, - -0.1970532966784595, - -0.19848125289806562, - -0.29814233498515275, - -0.2870341675475844, - -0.28224302213425956, - -0.24989642065684914, - -0.18708063543085673, - -0.2242037507514475, - -0.26061663435140303, - -0.2488989936081648, - -0.2314515676113824, - -0.26982708391627575, - -0.21338081452949298, - -0.19483707374233894, - -0.1985581596557826, - -0.19652327235806033, - -0.14179055043480404, - -0.10437321299253532, - -0.13160517807467054, - -0.1281528839202113, - -0.14616193177218473, - -0.2258073605644324, - -0.30539492045130257, - -0.2988777453270193, - -0.2795953407823588, - -0.28984302659364936, - -0.27216803868411665, - -0.26444027561330685, - -0.25423554237798585, - -0.2341601578788175, - -0.19736928586778935, - -0.1993702603672165, - -0.19050853206319074, - -0.15985991164366065, - -0.14532835717355086, - -0.14949760552822733, - -0.11413468973680552, - -0.07122963500401303, - -0.10627725608789096, - -0.11698692773493713, - -0.13311913763265737, - -0.13097720330324825, - -0.13318333842530916, - -0.14007112724929127, - -0.1919321875962644, - -0.14434764651350762, - -0.12147567257998504, - -0.08243342240074858, - -0.05022041003492872, - -0.047196502746350566, - -0.07713183011408953, - -0.035091119060392084, - -0.045946274896178196, - -0.01306747326764579, - -0.029561971221869432, - -0.05362723339346631, - -0.029141984098455365, - -0.033454923363182676, - -0.021122849803525745, - -0.0705973329416435, - -0.032210509861643755, - -0.061583606193342355, - -0.04921385487502816, - -0.019848355205951518, - -0.01943705700497611, - -0.010701324837974258, - -0.0271648200757858, - -0.07039031646728566, - -0.16133152879463564, - -0.04589847195410879, - -0.12986229766694812, - -0.19642185698552972, - -0.21548927238850546, - -0.19280996772417325, - -0.16038696179664624, - -0.16294888324946888, - -0.15669107511060687, - -0.1834022561597095, - -0.1818903025154206, - -0.17168461541647073, - -0.15354117168500525, - -0.10328643507725277, - -0.11811198053375138, - -0.1186159650818478, - -0.1373641902710292, - -0.1413235237190026, - -0.1482617109977945, - -0.15309156291705095, - -0.13097504099809243, - -0.18042340235168985, - -0.18042340235168985, - -0.10629292731723539, - -0.09583985734434941, - -0.05827620902624042, - -0.024001344014944692, - -0.018677240195920097, - 0, - 0, - 0, - null, - -0.0026499490403633086, - 0, - -0.023117295566109752, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - -0.013694603101187752, - -0.0053029629831427005, - -0.035327924215099116, - -0.044031835480419224, - -0.14261788040546342, - -0.08808480080776016, - -0.0721570401039433, - -0.1389236082636376, - -0.09785878343076893, - -0.08474291413082546, - -0.06822383845617197, - -0.03278142559778252, - 0, - -0.03987832058702789, - -0.01576067953989757, - -0.03386411307426529, - -0.08199601647517873, - 0, - 0, - -0.005329438022941169, - -0.020796521340071927, - -0.07367508827319191, - -0.027238699170001768, - 0, - 0, - -0.011635779099364085, - -0.04181319696062813, - 0, - -0.03912623759994627, - -0.04706580573620045, - -0.030536461065597598, - -0.03793703241457447, - -0.06674789693675753, - -0.10678016603270624, - -0.057790689829532615, - -0.06044273593617788, - -0.1450828398417131, - -0.19716321359101607, - -0.05964990588344521, - -0.20130818216636592, - -0.22858861691949672, - -0.1854273527135335, - -0.26373084843145556, - -0.25602628760780477, - -0.2283265570275358, - -0.22497219041043626, - -0.27700156136035636, - -0.28616317518331036, - -0.21118784009329195, - -0.1995785868794231, - -0.145332189243514, - -0.1637549996483667, - -0.12468186975699369, - -0.06498462636829838, - -0.04868448036479056, - -0.09054421694960568, - -0.1326896142431473, - -0.18510159263533177, - -0.22328371889403653, - -0.23748736503831858, - -0.18282342703371213, - -0.1763525840667467, - -0.20080164179862803, - -0.20517804199437584, - -0.20004166811194168, - -0.18361051288599162, - -0.12614379529177389, - -0.07331252107245323, - -0.06526728238925261, - -0.031120878466745494, - -0.010889854807364596, - -0.04975646511272058, - -0.05928093297166093, - -0.0700292065732353, - -0.08152839463248018, - -0.0913241933939789, - -0.09636672733920415, - -0.09192511028293171, - -0.09076680556046479, - -0.037422182087159306, - -0.03649910628365283, - -0.04537380528765367, - null, - -0.05024287808028849, - 0, - 0, - 0, - 0, - -0.013746594818154323, - -0.0009990796209969899, - -0.041996037957390375, - -0.06360278052318469, - -0.05115528784587464, - -0.04590179392099247, - 0, - 0, - -0.005586348447138567, - -0.004134273277919487, - 0, - 0, - -0.02106873084137606, - -0.08016686731784028, - -0.15648198402113267, - -0.12425791297344668, - -0.14631136050644367, - -0.11823420955016983, - -0.15162486185944513, - -0.12207525006637021, - -0.16644986528451022, - -0.12708012957731574, - -0.10361371457466118, - -0.02665095197844325, - -0.04842659057398291, - -0.031204858686153747, - -0.04394015759030323, - -0.14331941872610054, - -0.11125993050666061, - -0.1457424136643639, - -0.1923101938988513, - -0.22795787582413163, - -0.24309150109125333, - -0.25438408584217376, - -0.26180216505787623, - -0.2480831918619424, - -0.26125460012244883, - -0.2945517242156841, - -0.36636021835785804, - -0.36344132503238125, - -0.35416035975799964, - -0.325246583326271, - -0.32106826109826525, - -0.2948196295891604, - -0.2883497259123069, - -0.29066847856122036, - -0.30335702567636946, - -0.30215777837008995, - -0.3096657740376215, - -0.3050878197850838, - -0.3273405558544349, - -0.30857310096475987, - -0.3865371237019203, - -0.36147603409033147, - -0.35355597958935625, - -0.32960989931410734, - -0.3254655703426461, - -0.31262020187288175, - -0.3047174078716085, - -0.2906358197926119, - -0.27579528893548766, - -0.2635991486710758, - -0.2595089796799621, - null, - -0.28635536160345465, - -0.3154892747420338, - -0.3227214371854116, - -0.32664428108143506, - -0.31485715771613376, - -0.3084616207482106, - -0.2884383843689846, - -0.2786033871130792, - -0.2492657204404536, - -0.3223385844562112, - -0.29495304389298116, - -0.2930009177835853, - -0.30419310747745143, - -0.3084609246321982, - -0.26893501883625104, - -0.29135749185940996, - -0.2878978604202248, - -0.2739355108187401, - -0.23104089334157518, - -0.20412805529595446, - -0.23196193243705154, - -0.23277996623527353, - -0.29519817604094, - -0.3531967723349343, - -0.3585548937132932, - -0.34870130478015515, - -0.4476871127005583, - -0.4897935432963524, - -0.4015477754795258, - -0.38340601683621245, - -0.365334906566382, - -0.3903369941084275, - -0.41045318887381477, - -0.41420455265165057, - -0.4004095281452572, - -0.39135176696926555, - -0.4572637223124717, - -0.3923183048101456, - -0.46392461097395943, - -0.48310435355405423, - -0.49132779831321305, - -0.48952440562167643, - -0.48260830169124747, - -0.47684488174922335, - -0.4930940076502849, - -0.4951762755003065, - -0.49071427296454595, - -0.4917182235350921, - -0.4944697917654778, - -0.49930624839877535, - -0.5035154041241762, - -0.5042367612007908, - -0.4997409090326549, - -0.49871836678487635, - -0.5002354476470349, - -0.50368234460591, - -0.5069879448178194, - -0.5117835222496172, - -0.5053545202626756, - -0.5055999304021424, - -0.4956831297664144, - -0.5058476077325778, - -0.504609402028904, - -0.5025605991979009, - -0.5027390792993311, - -0.5019470738492336, - -0.5042078218006856, - -0.5022073573304864, - -0.5017611570769103, - -0.5009431232786874, - -0.49947438077733297, - -0.5030737294895131, - -0.5046503037188153, - -0.5093651530649356, - -0.5089412628240384, - -0.5167572039325123, - -0.5134627587269425, - -0.517805774528416, - -0.5111499540792399, - -0.5139891375070539, - -0.5139891375070539, - -0.5136767973295506, - -0.5136767973295506, - -0.5139516554123157, - -0.5150359880240301, - -0.5146776479633006, - -0.5151461582295555, - -0.5141310526526699, - -0.5147796426388633, - -0.5148869915771542, - -0.513827265974911, - -0.5122618818309457, - -0.5109232810702174, - -0.5154075936186568, - -0.5102539806898534, - -0.5102539806898534, - -0.5082460795487611, - -0.49887587422366375, - -0.5090539830899243, - -0.5073435487845495, - -0.4968394266246654, - -0.4953520924460786, - -0.49862422763896963, - -0.4960585761809073, - -0.4992563446648691, - -0.4946827920657145, - -0.49378645551967515, - -0.493117155139311, - -0.4880974022865803, - -0.48822297240449586, - -0.49145792424292223, - -0.4879998722777078, - -0.4903262810618798, - -0.4854924449814725, - -0.4848752266187387, - -0.4850425517138297, - -0.4810825244633421, - -0.47934833550654576, - -0.4770429675297361, - -0.4806125695583445, - -0.48254610399050746, - -0.4841821715869531, - -0.4883095239325317, - -0.4892019244396837, - -0.4975681791942349, - -0.5035026425667964, - -0.5067747777596876, - -0.5068779414001217, - -0.5112841689041853, - -0.5063685294439557, - -0.4944587010089213, - -0.5115875093265927, - -0.5068763783159188, - -0.5145009757679884, - -0.5157362068033049, - -0.5333573984841127, - -0.5144504064059165, - -0.5115411807526007, - -0.4939631217629715, - -0.49953690659722605, - -0.5025606569822931, - -0.5043082746421328, - -0.5001989771081755, - -0.49937350663905977, - -0.497703974023596, - -0.5066614441141355, - -0.5001050623091059, - -0.499934029047404, - -0.5028938240627918, - -0.5118103924634201, - -0.5077685618331101, - -0.5099275874575644, - -0.5035724568877475, - null, - -0.49579081505567435, - -0.48925286370498644, - -0.48782874122898967, - -0.479121457526515, - -0.4831642390193389, - -0.48321629571558944, - -0.4877266366121541, - -0.47080449199528207, - -0.47338897935214463, - -0.46274710330435576, - -0.47693052766210653, - -0.49481271523958903, - -0.490402769400079, - -0.49240178550298985, - -0.49298556416808526, - -0.5222674558090142, - -0.5263130047747706, - -0.509428043512363, - -0.5097375903113321, - -0.5078901425847537, - -0.5170632761311883, - -0.5091395032947669, - -0.5066221901975085, - -0.5137725492610647, - -0.5157135203641208, - -0.5192050373483534, - -0.5326840033417968, - -0.5447091001756718, - -0.5307616239159734, - -0.559061874999035, - -0.52342906641554, - -0.5180134983834093, - -0.515656073710349, - -0.5086730397418837, - -0.5069328587529371, - -0.5047018574850568, - -0.5067945366743285, - -0.5017004171126686, - -0.510921889019907, - -0.49521266542567255, - -0.4907506628899121, - -0.49354759481274457, - -0.4830247054992426, - -0.48187004254921084, - -0.49083562682569204, - -0.4940408319805467, - -0.4944126655251935, - -0.4941970020692984, - -0.48698714963859846, - -0.4886337015302932, - -0.48017448838958043, - -0.4776051185960716, - -0.4777004224284207, - -0.48000207206978374, - -0.46657825089647753, - -0.4803586535142882, - -0.47052365625838266, - -0.46684696616891586, - -0.4521255567318686, - -0.44537677789653063, - -0.4398301848073901, - -0.45942581261027193, - -0.45254689203430776, - -0.46944672663850107, - -0.45518691020129953, - -0.45313246680188035, - -0.4422705928371162, - -0.4665622220664175, - -0.4525668181472787, - -0.4489414410869732, - -0.43598440495246216, - -0.5043225517726204, - -0.4895079451901697, - -0.5236986750869776, - -0.5193928426399688, - -0.5305292573021378, - -0.5173737864925372, - -0.5083737078285262, - -0.517383234615316, - -0.5204806080422233, - -0.4959693407791115, - -0.5195770525287317, - -0.5077415908026266, - -0.5036700134887452, - -0.49478691010713505, - -0.5057559996742131, - -0.4950885829429048, - -0.5069560121108418, - -0.5610814467762447, - -0.5115904019837667, - -0.5286980670953926, - -0.49954631719509, - -0.4869697358378916, - -0.5029040024496264, - -0.5007101845362107, - -0.4940171807325697, - -0.48349429141906775, - -0.47555073976517737, - -0.49220888256535, - -0.5022855716252762, - -0.49667734914925954, - -0.5032216195350417, - -0.49181731959684605, - -0.532607459444591, - -0.5208575194337546, - -0.5175110175319342, - -0.5219730200676949, - -0.560497880852947, - -0.5405490111826508, - -0.5545606614053435, - -0.5444281973137206, - -0.5522492858295823, - -0.5474526331036393, - -0.5432695057263641, - -0.5650217680881969, - -0.565133318151591, - -0.5397606785393547, - -0.5528915639534095, - -0.5375348385595, - -0.5431495250836654, - -0.5446386463107772, - -0.5367185918098022, - -0.5345805489280836, - -0.5211549802106549, - -0.5009830104135704, - -0.5056972116094782, - -0.5088306671938021, - -0.5206363822363353, - -0.498169129416848, - -0.50069904560009, - -0.5025953966777882, - -0.5093999505448232, - -0.5005874955366959, - -0.47292307981498016, - -0.49128273291545654, - -0.4803508267028431, - -0.49050188247169857, - -0.48478531355629984, - -0.45674906428993745, - -0.4551129966934917, - -0.46209454332777855, - -0.45400716373171246, - -0.4611649594661619, - -0.4607098352075142, - -0.4571588248561381, - -0.4600591265043824, - -0.49138610264086835, - -0.4570286831155117, - -0.42995920106523067, - -0.43412373676527394, - -0.45738192498292607, - -0.4560626916321634, - -0.4356118466765938, - -0.4328602784462082, - -0.43340504239592126, - -0.44024677961742087, - null, - -0.4423848224991396, - -0.508633875909072, - -0.4878855641177853, - -0.44737429942852547, - -0.4454407649963624, - -0.4418585329713215, - -0.45652113639930836, - -0.4651290829578799, - -0.4501999661403142, - -0.4310672146198469, - -0.45096774592933886, - -0.43103003126538175, - -0.423102540093514, - -0.40485294972225316, - -0.4014099955203261, - -0.4170014876447181, - -0.42170518198449913, - -0.4021298006342673, - -0.3949162298681208, - -0.4124214429061146, - -0.401099111471622, - -0.4168702523810274, - -0.4168702523810274, - -0.38170104232947355, - -0.39397193591758983, - -0.39711764770530134, - -0.3959277803624316, - -0.36773907934276406, - -0.3730871455427198, - -0.3424302654467962, - -0.3713798413593228, - -0.36113954553975214, - -0.34657854393138643, - -0.32713210862882647, - -0.31577810733100997, - -0.33043950399642974, - -0.315728843092963, - -0.3527151257789718, - -0.39777539419714036, - -0.3288597650323173, - -0.4041446460643817, - -0.35814987983708135, - -0.39981117946107114, - -0.34122508616653446, - -0.2963276005306128, - -0.28790208520505745, - -0.2776523088715952, - -0.2938444733665416, - -0.21393744462196218, - -0.16656213269852382, - -0.17643059497344815, - -0.18015728010002874, - -0.026638602702061864, - -0.041640796689920934, - -0.07438431856675087, - 0, - -0.21232394624809425, - -0.2998053885452394, - -0.3799176684804083, - -0.30538366536470407, - -0.4058755594827498, - -0.2955934910656217, - -0.30582142016426206, - -0.42453391645004335, - -0.21485889100232558, - -0.3147836713652421, - -0.2984787286369339, - -0.41705325356916567, - -0.36051101724631984, - -0.32480274940139653, - -0.5148720851922729, - -0.2772227092460071, - -0.6351560457377259, - -0.4875545757783536, - -0.4840364806237245, - -0.5198106534036878, - -0.4240775204656565, - -0.44310404421307314, - -0.20848808877949143, - -0.15149660570711587, - -0.1441174939810146, - -0.22857101312942418, - -0.11377193339951053, - -0.27117087385832217, - -0.30979098893718604, - -0.19315127684413114, - -0.23485569480176938, - -0.17476153548626638, - -0.21062899315719297, - -0.08986029495222769, - -0.16987848822740947, - -0.15485494839853364, - -0.06506193716966169, - 0, - 0, - -0.2876007539796186, - -0.06688957384730998, - -0.211752637270598, - -0.1399516194985876, - -0.12337264526818381, - -0.0987856247304374, - -0.07522851553808052, - -0.07668475261163588, - -0.059029945953524954, - -0.14472421565893745, - -0.14031411701617702, - -0.1149200196026331, - -0.09442603179215459, - -0.07654063174095749, - -0.04447278501464058, - -0.0346985355716013, - 0, - -0.06629456637581777, - -0.14534883368686013, - -0.024267661066684765, - 0, - 0, - -0.05288109158282861, - 0, - 0, - -0.07737693495984732, - -0.1344616339503809, - -0.22701241201377387, - -0.22772761226196503, - -0.07326368838883124, - -0.08726745639223477, - -0.1900823245040112, - -0.1724922643457636, - -0.15827129643859983, - -0.1350601489242894, - -0.08358506079086958, - -0.04307959808580808, - 0, - -0.2534954875835701, - -0.2051394170051869, - -0.11865467457073464, - -0.08912847357535691, - -0.08386153800260954, - -0.05376891542306106, - -0.06601874783105333, - 0, - -0.07736243930959696, - -0.09643875288873516, - 0, - -0.1553155942939004, - -0.04527979330210541, - 0, - -0.012546555255411485, - 0, - -0.008174934584748828, - 0, - 0, - 0, - -0.06579233940687934, - -0.16119607358673793, - -0.04120923800586984, - -0.049267260934451884, - -0.15064966824082693, - -0.0696442719280792, - -0.0460285873274493, - -0.10274307231061941, - -0.11358933993374909, - -0.21325920311327184, - -0.18754352783832506, - -0.04873046007192816, - -0.045878893787857256, - -0.08045137183658169, - -0.0637030251603794, - -0.026993714495679777, - 0, - 0, - 0, - -0.01899041460607953, - 0, - -0.05071383849132449, - -0.24653929464017743, - -0.052873391971840045, - -0.05384739274506756, - 0, - 0, - -0.035888847450671446, - -0.004644798981045417, - -0.01960400887169067, - 0, - -0.039819179608844846, - -0.014464607554741882, - -0.07224978689144168, - 0, - 0, - 0, - -0.08227909764835517, - -0.03275935079560788, - -0.2520080410492065, - -0.06058561840724486, - -0.3054490088157813, - -0.11940973167431335, - -0.22362200955732736, - -0.26297754479669944, - -0.16915302436726942, - -0.1292157428339854, - -0.26018436567320047, - -0.12066088466258529, - -0.3610755714565298, - -0.2551313637286343, - -0.2074759823919049, - -0.297961438476839, - -0.22764982818687685, - -0.1687181317010692, - -0.13280127489761784, - -0.10488143735359734, - -0.04864729046352456, - -0.04254293894112671, - -0.050257054180918415, - 0, - -0.009416420182630447, - 0, - -0.03238355037226959, - -0.05165587779712566, - 0, - -0.03222319373139648, - -0.0760854998834235, - -0.09582766134091136, - -0.12774845120664124, - -0.19256253427882541, - -0.1702533763707299, - -0.20864492168022764, - -0.26166181758382134, - -0.2001031993927469, - -0.10254241620412063, - -0.24362412876064365, - -0.36007023548796635, - -0.28916683821166156, - -0.4139579170683796, - -0.39551059398115695, - -0.31152204398112193, - -0.18042378268070114, - -0.13360410417875068, - 0, - -0.26068692788924774, - -0.45362409665153147, - -0.2954685425605066, - -0.278269230275073, - -0.31004039158058416, - -0.29589899948486387, - -0.2892393903244883, - -0.30272628932302614, - -0.4787855763622879, - -0.3929784729633836, - -0.3786298803814233, - -0.40296552483567694, - -0.3585567030656208, - -0.3319627647354192, - -0.19409560890268762, - -0.29813217423855753, - -0.2759439635649823, - -0.28725902705984796, - -0.2637626589863564, - -0.2792791711442669, - -0.3239689121399325, - -0.4231939246076548, - -0.3938044206943001, - -0.38282709010446503, - -0.3314862869630405, - -0.33444230237649397, - -0.3397830123489134, - -0.3252858249761563, - -0.3195481862736157, - -0.4075758074405216, - -0.3514136381170825, - -0.4101899494734915, - -0.428714887696514, - -0.4544817266148662, - -0.4326776674836027, - -0.3912342745856011, - -0.449676897742429, - -0.449676897742429, - -0.4133932582164026, - -0.4138882724730747, - -0.38819428110537746, - -0.3796296173161451, - -0.40062837977459365, - -0.38788418702091976, - -0.3881167575842639, - -0.3926569394512821, - -0.4025630972145856, - -0.39502983331496644, - -0.3895357750794488, - -0.38017228196394837, - -0.36302782456647564, - -0.35334520947510906, - -0.309581496511948, - -0.3921169940466349, - -0.385631982976, - -0.40145352245913846, - -0.3904317001093588, - -0.3559977743829532, - -0.3896766884254602, - -0.3735070877221487, - -0.372147286806527, - -0.36822787339835283, - -0.373438802252408, - -0.37967314795770324, - -0.3842065886489736, - -0.381176430149753, - -0.3939585091880715, - -0.39849532046721625, - -0.4090081840479388, - -0.4208439943983372, - -0.4308074521555081, - -0.5259389622767434, - -0.4296446372887147, - -0.4930934824060592, - -0.5259634553586734, - -0.28916280423214047, - -0.49119921202056127, - -0.5355258131587727, - -0.5352595367166835, - -0.5797041084305035, - -0.591796416967712, - -0.5689438311782611, - -0.5809190106602544, - -0.5728700468158284, - -0.5640692237825122, - -0.5610443246949716, - -0.5617690010879997, - -0.5679100773719156, - -0.5897278926838796, - -0.5849989578958854, - -0.5760431710896907, - -0.5929095928139403, - -0.6171689375522023, - -0.6156723965359016, - -0.6277743698088014, - -0.6511725403352145, - -0.6172644263172384, - -0.6022304026205745, - -0.5662460064718751, - -0.5841370869099881, - -0.5955642188372932, - -0.590697973494399, - -0.5771978516832361, - -0.6086354658907203, - -0.555916100944879, - -0.5251603452405477, - -0.5564344366151848, - -0.5355386305350278, - -0.5432427482918609, - -0.5286513934866662, - -0.5559007598184373, - -0.5852110351894011, - -0.5581673625767467, - -0.563703216101908, - -0.5836873149271247, - -0.5711822865368652, - -0.5599144112722432, - -0.6080524731789957, - -0.5752148578699765, - -0.5800833349959769, - -0.6059665669194669, - -0.6040406130079488, - -0.60106332802747, - -0.5944343454104041, - -0.6272483666043009, - -0.6388371218345801, - -0.6555779146381471, - -0.6719604749016228, - -0.6377842590443508, - -0.643171806703032, - -0.6432181859921859, - -0.643831093691294, - -0.6336951966584614, - -0.6283788358156907, - -0.6117504653207433, - -0.6152655546924805, - -0.612614924387934, - -0.6197538295062315, - -0.6089841271294683, - -0.6157030569985968, - -0.6025611264700321, - -0.6035136707106943, - -0.5912507979055053, - -0.5899113262841591, - -0.5926806012818897, - -0.5931976494618455, - -0.5920666983322144, - -0.5882200907217803, - -0.5992272433770116, - -0.5903996737335644, - -0.5898216486326371, - -0.5958509562226326, - -0.5793701297512315, - -0.5803472592219029, - -0.5715140474970876, - -0.5684501831191212, - -0.5789974482359562, - -0.5729539841768876, - -0.5554943389867166, - -0.5513215511980232, - -0.5626096499898927, - -0.5560035407178261, - -0.5236513621884284, - -0.5237009517422266, - -0.5117016589088272, - -0.6529763529918152, - -0.5769795197017731, - -0.4968134576934684, - -0.6044647571964827, - -0.5881443707079099, - -0.588343217591657, - -0.6636904175274747, - -0.5845104777576631, - -0.6063030265557849, - -0.6657648951161033, - -0.6056706635183238, - -0.6208452220273024, - -0.5871532446697378, - -0.5987500893109158, - -0.6147250579541044, - -0.5835107177654684, - -0.6367956673566598, - -0.5979941338624113, - -0.6316122243962807, - -0.6003535589066432, - -0.5182210959323257, - -0.5909676745832908, - -0.6161740067688988, - -0.5576686906776045, - -0.5784874637435516, - -0.6310800945853101, - -0.610219952540335, - -0.600558414715947, - -0.5752203574278023, - -0.624056131024587, - -0.6451021185365294, - -0.619542702158159, - -0.5970359386846371, - -0.5672548439859919, - -0.5720365376591833, - -0.5445864700088455, - -0.5620340631577984, - -0.5396365067314105, - -0.5143233917935384, - -0.5475519704267406, - -0.5243215749246735, - -0.5621125396541516, - -0.5039429341151628, - -0.520808772312437, - -0.6256349529529235, - -0.5414076233184854, - -0.5009982165732365, - -0.582733229753033, - -0.5650780904661383, - -0.5317429763868357, - -0.5647410316786837, - -0.5920023464080464, - -0.6352571006021506, - -0.6064014978081254, - -0.5961818753724886, - -0.5609554157172131, - -0.5560669943435248, - -0.5865391310821848, - -0.6287564183285019, - -0.6032087104745604, - -0.6296334452934599, - -0.6281960165297804, - -0.6543935737259354, - -0.6418920632992282, - -0.6422270997339585, - -0.609429257361859, - -0.6238863828733804, - -0.6274511166095047, - -0.6466917804325879, - -0.632405206667519, - -0.6120226633916658, - -0.6038422466201322, - -0.55791326800636, - -0.5563502886970426, - -0.561720309298776, - -0.5370180600282315, - -0.5178980632510573, - -0.49327029900525654, - -0.4237739903044996, - -0.4362076354312794, - -0.4000492957033289, - -0.3895842802376255, - -0.37155500569665556, - -0.34774546311895527, - -0.31364301816825235, - -0.21655070325544068, - -0.5319503901123966, - -0.13711339961926705, - -0.08064257036905043, - -0.006034607765879163, - -0.1828219417860436, - -0.1859363649821274, - -0.17975470682020234, - -0.18246803005921575, - -0.012906534880696263, - -0.09525673783170951, - -0.22499607828130952, - -0.11575656956909364, - 0, - -0.32002896074450515, - null, - -0.14013868940413654, - 0, - 0, - -0.2596022783259856, - -0.10502338139776601, - -0.20385592729773339, - -0.24089895712898146, - -0.14104047207809078, - -0.2458966040785494, - -0.2959861284142692, - -0.2091849919477342, - -0.3255807821552157, - -0.38629082342823806, - -0.2640526126159819, - -0.3297048438537745, - -0.07156265007883755, - -0.3457909121250742, - -0.29591160130220007, - -0.3138479272496312, - -0.3005987944940376, - -0.2715241388929812, - -0.25095443143788465, - -0.2635122997986391, - -0.283516443385328, - -0.2782478488561597, - -0.3043221002160923, - -0.35692564527288606, - -0.34925190514629, - -0.388891934163359, - -0.3778771317735027, - -0.38381572328146274, - -0.35880084389386513, - -0.43293883436392644, - -0.39268199974619433, - -0.384746913090114, - -0.4251805404666452, - -0.4238605511112066, - -0.41967900663945823, - -0.4851728256913016, - -0.4572040926092139, - -0.44668205407432593, - -0.4661484494465614, - -0.40945973585982065, - -0.4634864874682154, - -0.39654200579619125, - -0.3986747449820174, - -0.45664958650429, - -0.4369709503602971, - -0.4139686681348198, - -0.4121733311061885, - -0.34934327708703605, - -0.4165696342478168, - -0.4512794834680173, - -0.43020510535134415, - -0.40091028046944044, - -0.4135363479482206, - -0.458732253210119, - -0.5116378810918034, - -0.49117331154392674, - -0.534645844763574, - -0.4790693311031776, - -0.4623044436287741, - -0.45767974634616115, - -0.4432545542078883, - -0.44990942163258185, - -0.44044223829278595, - -0.4587270262795293, - -0.45824410334461274, - -0.47952414981709757, - -0.4574790019104704, - -0.46022389799622754, - -0.47469795057262143, - -0.47509716686548575, - -0.4638962333748764, - -0.46715738354713654, - -0.46808914073921093, - -0.47482517778792577, - -0.4368163020868445, - -0.4558834321406846, - -0.4596663556120073, - -0.40482135985987167, - -0.37896177323933655, - -0.38357836697716463, - -0.39523024339475277, - -0.385700668634105, - -0.43180473625142557, - -0.40864877268437927, - -0.42283768590983606, - -0.4480045991729985, - -0.47984301132603024, - -0.4513581334276766, - -0.4863336207970598, - -0.4995524525057564, - -0.4975847782729004, - -0.4996427012112463, - -0.5007221760069424, - -0.5070778205935305, - -0.5005593078798722, - -0.49174549086378727, - -0.5072747773983592, - -0.505471865108004, - -0.5154977239999584, - -0.5178877190739377, - -0.520632993922781, - -0.5193272459309193, - -0.535708749409462, - -0.5396403102443122, - -0.529156148018045, - -0.5468481717748712, - -0.549469212331438, - -0.546848171774871, - -0.5469205671303311, - -0.549498338763398, - -0.553126889129281, - -0.5456463181766518, - -0.5511549319689475, - -0.5579966984490601, - -0.5558184319402716, - -0.5738483123699962, - -0.5546779762876961, - -0.5554875076664321, - -0.5444071723424717, - -0.5407434205199773, - -0.530007350174911, - -0.5280464388113753, - -0.5324235147446422, - -0.5366141495304594, - -0.5457249168061327, - -0.5541902717829056, - -0.5489860669783928, - -0.5421569685340432, - -0.5585172612797582, - -0.5657940576920071, - -0.5714925483240227, - -0.572737921351478, - -0.5711278906502155, - -0.5785535409553445, - -0.5744117666076483, - -0.5632841592213242, - -0.557083170017679, - -0.5630875051471002, - -0.5859984768371815, - -0.5791769536545561, - -0.5848243112699334, - -0.5829910979326814, - -0.5946380628336106, - -0.5934184456960174, - -0.5838665252916662, - -0.5719297325064621, - -0.5622409916633226, - -0.5694526408247437, - -0.574558367226842, - -0.5737811856942823, - -0.5739868256335094, - -0.5713160505465453, - -0.5738280066085897, - -0.5510822931257789, - -0.5648946668995001, - -0.5606146440253377, - -0.5497930782631906, - -0.5639323042713755, - -0.5411534922667613, - -0.5511357486315371, - -0.5669560203893075, - -0.561592735088587, - -0.5614166102534996, - -0.5621154281475554, - -0.5488151623753236, - -0.5537012061874207, - -0.5502845578332123, - -0.5672281955018726, - -0.5754511421034718, - -0.5844493515965232, - -0.5814400788765921, - -0.5708953145565312, - -0.5731963003052514, - -0.5804950475550696, - -0.5878116140913705, - -0.5855212337090642, - -0.5810109228784865, - -0.5857974524942997, - -0.5857974524942997, - -0.5713502215956545, - -0.572177552656912, - -0.5628580869207375, - -0.5702310891568834, - -0.5657647148443059, - -0.567409682927712, - -0.569139872705515, - -0.5658243184787026, - -0.5676321546891787, - -0.5740032261401684, - -0.5770189378325652, - -0.5777224735173705, - -0.48146930423448786, - -0.5250761022013843, - -0.4865766748645107, - -0.48208368392001155, - -0.4861975827999706, - -0.4852045184306051, - -0.5017721517116384, - -0.4709814398970603, - -0.407571954108626, - -0.4732720846186501, - -0.4730044191139149, - -0.4576758770150342, - -0.45967817191674565, - -0.46272532094529784, - -0.47131968228555543, - -0.4727722387211677, - -0.4601312930732495, - -0.4634727162117531, - -0.5482063987844601, - -0.5452743937341158, - -0.5873392685578124, - -0.4024301599752286, - -0.5006180511024676, - -0.6762330710756528, - -0.5176794343207554, - -0.5239696461678082, - -0.538121973206527, - -0.5183501613433269, - -0.5016666461752294, - -0.3223214910482105, - -0.5150175120684659, - -0.4779089562233034, - -0.5122998869249153, - -0.40582920462845706, - -0.5179578499067068, - -0.4769537157198842, - -0.3527021956734623, - -0.3519692891016478, - -0.6063274984870988, - -0.3889152144245701, - -0.23616877330742958, - -0.15727157295831917, - -0.3299136814678494, - -0.33559785699285516, - -0.3502991662797712, - -0.37052473632024996, - -0.28600072352800365, - -0.3085625042842205, - -0.3052710530650634, - -0.28541463332681827, - -0.17239205467125518, - -0.32543502697583804, - -0.3234851143671522, - -0.32354963656794744, - -0.348932823553335, - -0.32865422668078714, - -0.3584117485488033, - -0.3571016070336056, - -0.26698697152965845, - -0.35167346355614804, - -0.34662931027736765, - -0.2566767444480481, - -0.3187919254489101, - -0.36195424504703, - -0.37044112999547385, - -0.4104654380445403, - -0.31262260008883846, - -0.29279524446043603, - -0.28680308432004653, - -0.24366217686920344, - -0.2755445596508529, - -0.4655968921810696, - -0.33504861925738594, - -0.28251422494209055, - -0.2743489608967249, - -0.30077630755691964, - -0.2440769886037647, - -0.2482278532655302, - -0.2723415895989829, - -0.26880916663855225, - -0.21309720942061006, - -0.16722999092985225, - 0, - -0.045359891406665964, - -0.16899885015526483, - -0.2576284672789969, - -0.2535341388644754, - 0, - 0, - 0, - -0.09727769347432835, - 0, - -0.09701832284860545, - -0.05356339317328318, - -0.07747720769663546, - -0.18033702481998592, - -0.09309866010095635, - 0, - -0.11302163759277084, - -0.0600029903761744, - 0, - -0.12253126074859477, - -0.06504715143403617, - -0.06505568888059543, - 0, - -0.26027618176997214, - -0.24093642224963374, - -0.4181256624311126, - -0.27700609531161324, - -0.23521878564248866, - -0.18883806491566302, - -0.26766015531898435, - -0.23707593589831633, - -0.17794475206785798, - -0.20668328120614488, - -0.21138501267923726, - -0.3208133289085664, - -0.307728986217106, - -0.245555602007418, - -0.20999365761269406, - -0.1958175327757793, - -0.0670369314081154, - 0, - -0.24186129584122307, - -0.042112051432360964, - -0.3490828611188229, - -0.635087776236337, - -0.4016749683285743, - -0.3166156441163561, - -0.3090873339676612, - -0.35588258877822576, - -0.23507543232867412, - -0.25604860311030575, - -0.25649658517827945, - -0.7027947615792647, - -0.3566509537276329, - -0.33495112756781553, - -0.3093789149058741, - -0.3177429706778375, - -0.3685156069211002, - -0.41869121296970035, - -0.4846235879193673, - -0.7264728131656768, - -0.4412465123300262, - -0.4311042484336006, - -0.45263150451005807, - -0.46010060294222843, - -0.3643302744661395, - -0.3640166246998007, - -0.0031452464978516392, - -0.44691396103647485, - -0.34396515691348406, - -0.3490719694190568, - -0.22192563005723287, - -0.23545224853583635, - -0.23750637880359882, - -0.2607056908280253, - -0.26014394391081186, - -0.3215506601974738, - -0.3534925412274028, - -0.3885597241454588, - -0.3489650158982126, - -0.46988665615507286, - -0.395837103741293, - -0.39654815463253845, - -0.48374758961530806, - -0.4609753734777283, - -0.4796238855175985, - -0.5371608831514344, - -0.580474430472291, - -0.5847310736560328, - -0.5800863061397282, - -0.5694138699179454, - -0.5454990501672299, - -0.539277019017443, - -0.5414402553277379, - -0.48227966982705506, - -0.5287195467367685, - -0.4962440753706092, - -0.4579691474012646, - -0.42776313358065243, - -0.4611332200385799, - -0.4362519906842085, - -0.36817012133230287, - -0.37867225780199654, - -0.4582556553606366, - -0.4136011669869094, - -0.49554991802790715, - -0.5490354760380676, - -0.5784929272724639, - -0.6088545504198419, - -0.5784510720594128, - -0.5075229564264614, - -0.6168922028356689, - -0.676303121764766, - -0.6555509500860273, - -0.6581856824038628, - -0.6613251763540727, - -0.629457877270188, - -0.5952521611218127, - -0.5342408748684108, - -0.5228058542208209, - -0.5064353687691943, - -0.4789530793879051, - -0.4645502774996606, - -0.39483303225261435, - -0.37842954205811363, - -0.34741554336645875, - -0.3870070946888814, - -0.37057852423910265, - -0.4069205702265397, - -0.3709611923615046, - -0.3972593597322617, - -0.4564962685331019, - -0.45658574159214327, - -0.48891710862516, - -0.4696299644724028, - -0.48315136903970657, - -0.5132537435963759, - -0.5465658000409015, - -0.5524881910107634, - -0.5891371301330468, - -0.5777127762992973, - -0.6018396535720223, - -0.5639572450733906, - -0.5435309767082619, - -0.541957156832758, - -0.5295922251029099, - -0.49595872573158906, - -0.48493455854465106, - -0.4876820116488486, - -0.40262984201511354, - -0.41375812318745797, - -0.4626752798591226, - -0.41333761426972004, - -0.44671404286727956, - -0.4467209431452329, - -0.4340403189329828, - -0.4163702827817136, - -0.4163307674460446, - -0.42810378516726455, - -0.42810378516726455, - -0.5417462193363547, - -0.5539103421577365, - -0.545472996311891, - -0.5409910140152268, - -0.518283453202018, - -0.5263459670627291, - -0.5190897422964973, - -0.5191486173843456, - null, - -0.5189295299928431, - -0.48902701638994117, - -0.4397273274685565, - -0.3857612557974799, - -0.45686941339879694, - -0.3618092436443221, - -0.36670090908679065, - -0.3695375818820802, - -0.36196839036284034, - -0.3491289914020883, - -0.3788532956348437, - -0.3938525146250206, - -0.3495563386291385, - -0.2817002429418092, - -0.3001321403702589, - -0.28567261183386516, - -0.24345895589290267, - -0.2605505535603849, - -0.27998885391064154, - -0.23837519938770346, - -0.27911250861145365, - -0.23056525027428998, - -0.2301396225274297, - -0.23510453676831233, - -0.28040757893528556, - -0.3009322328279246, - -0.16947974017031298, - -0.1863674309642226, - -0.16967844073276472, - -0.1848251803369576, - -0.2023024732671138, - -0.10258914568582345, - -0.05567260026437393, - -0.09375339043316233, - -0.1269654238173752, - 0, - -0.13761654278068902, - -0.021422001700869275, - -0.14400401151043496, - -0.00837791860786119, - -0.028596747606640438, - -0.06591606494517976, - -0.1457097151914032, - -0.07656908582094413, - -0.13833867158795943, - -0.05721466492064631, - -0.09411333446794401, - -0.04700263085020795, - -0.09268128297644573, - -0.08819837937264519, - -0.14350663016606557, - -0.12704866977117057, - -0.12888195454047424, - -0.1829088474467302, - -0.15563607856405548, - -0.2123366273214533, - -0.07499281222958909, - -0.17511992955396416, - -0.22201707352384337, - -0.20298069638255611, - -0.13614617194979384, - -0.209262320992899, - -0.274756350038582, - -0.23925386135794935, - -0.3164398650987331, - -0.29167767015428925, - -0.4298452153164739, - -0.44518676469499996, - -0.3246790569852186, - -0.3523530779297549, - -0.3981186312653634, - -0.29388913480064704, - -0.32286686776377704, - -0.32136803454750285, - -0.408829755489704, - -0.3691017441834743, - -0.2826318531534615, - -0.24812209326016021, - -0.2672977653575863, - -0.2782112562303807, - -0.30194781016470573, - -0.26893958273767427, - -0.2925493127019263, - -0.2609990079778334, - -0.20090461737066245, - -0.23894308526711416, - -0.22787241198218122, - -0.22374359212353678, - -0.20107794275066426, - -0.21139255941213142, - -0.07023336715863826, - -0.1496611206470776, - 0, - -0.08202309895672577, - -0.09701660102912546, - -0.5418908793113812, - -0.07653135344797901, - 0, - 0, - -0.040147270554519165, - -0.02105628133398829, - 0, - -0.16994751059553104, - 0, - 0, - -0.5113115225563081, - -0.6863302025435545, - -0.4964022324900521, - -0.5128642389199745, - -0.4450654247768133, - -0.7198554839523124, - -0.6598673084444905, - -0.6808803881403369, - -0.7375366013250788, - -0.6906060739591655, - -0.6727332701174457, - -0.6839615500447278, - -0.6728122589722991, - -0.669328220509211, - -0.8344394076467834, - -0.6191786285687229, - -0.6246292694007691, - -0.6838816183843407, - -0.2989750377666469, - -0.6677961238336204, - -0.6702323914552544, - -0.7156269144128438, - -0.7389778515836543, - -0.7140475979405787, - -0.6559968781490177, - -0.6906857788074329, - -0.7827511412675936, - -0.734689489648778, - -0.7553439977291067, - -0.7492943274352234, - -0.78633987525802, - -0.7825027826607747, - -0.760914005838976, - -0.8015046872773057, - -0.7733862461445563, - -0.776664724012303, - -0.7864447375225806, - -0.7717730760209147, - -0.7846597407779682, - -0.7214069719246834, - -0.7256143112113674, - -0.7099364029618496, - -0.684636171973075, - -0.7036296936089433, - -0.6881730801649464, - -0.6813608966372517, - -0.6475460339346386, - -0.6980157873258435, - -0.7477224110053684, - -0.7167370241325314, - -0.766933798964162, - -0.8729625193155619, - -0.710295974289906, - -0.8794029525207201, - -0.7490672598560748, - -0.7236989150284783, - -0.7710847249648798, - -0.8149392765640864, - -0.7593020120406474, - -0.764603813707519, - -0.6511104251043696, - -0.7007428738584431, - -0.7085367333286031, - -0.7309765272218416, - -0.7141703854024086, - -0.8275025025995917, - -0.6968001240725162, - -0.7316171073371924, - -0.7342621865924264, - -0.7034076145233732, - -0.702625270922109, - -0.7759821220772134, - -0.699222058829517, - -0.7028332228996863, - -0.7327289012196944, - -0.7191997401605834, - -0.6969943806576089, - -0.6952643690570961, - -0.6648135660818139, - -0.6639235247900471, - -0.6596846028057832, - -0.7293008055598285, - -0.6652350032095562, - -0.6698490661041225, - -0.6680211716239808, - -0.5519215369666722, - -0.6668303036721597, - -0.6589062478402565, - -0.6344860470324701, - -0.6309848517983416, - -0.6339032853422446, - -0.6400451194852039, - -0.6163048073160132, - -0.639129661504191, - -0.611279376263762, - -0.6189396879125917, - -0.6773458220421738, - -0.6476675845079427, - -0.6662137504715138, - -0.6457621346510081, - -0.6085706073373576, - -0.5898932769999962, - -0.572072356231031, - -0.5934908382719595, - -0.5899913219094499, - -0.6177026268276434, - -0.5656641391688706, - -0.6337491819738226, - -0.7594511098099446, - -0.5940488308955597, - -0.4448368077825503, - -0.5817424447405625, - -0.616098433621799, - -0.5925304061586465, - -0.6012993121470522, - -0.6183872955577412, - -0.6183943159933296, - -0.581290087305894, - -0.5686601768400282, - -0.5898308417078444, - -0.5419213483225233, - -0.38917055929064703, - -0.529727545961894, - -0.4991400730008606, - -0.4758855802375549, - -0.5471151887940902, - -0.5581402287708784, - -0.4400900445444156, - -0.5733100606937147, - -0.5943616892713236, - -0.5351466842282557, - -0.5897774129355426, - -0.5642539613573826, - -0.6095209006641473, - -0.5450848831609979, - -0.5450946250496578, - -0.5488932715631707, - -0.5494437094265747, - -0.5649360358283145, - -0.5775402808575161, - -0.5775402808575161, - -0.46135857212962006, - -0.48846905692182174, - -0.4605262698258019, - -0.435166307978867, - null, - -0.45047796669390494, - -0.46675327372505104, - -0.47258698379790254, - -0.4743074026845785, - -0.5030604854270331, - -0.38881512360099757, - -0.45670874625494107, - -0.4603365764400954, - -0.43655596815006215, - -0.4010650823505286, - -0.4034289672701642, - -0.39377599394359974, - -0.36734746231537174, - -0.39447919820206423, - -0.3117773360741237, - -0.3563464037431906, - -0.35926183153189195, - -0.3532692344703008, - -0.311122104274672, - -0.349991752285844, - -0.3571824538531212, - -0.3594447827316297, - -0.31702505053996144, - -0.33476163630737266, - -0.330860848962677, - -0.351218772968516, - -0.3347661616784201, - -0.36467461320575434, - -0.3824168642621659, - -0.3967856724993847, - -0.39467592420106035, - -0.4177195914578795, - -0.4349451135650996, - -0.4542601947764654, - -0.4319233266136949 - ], - "yaxis": "y" - }, - { - "hovertemplate": "variable=BASE_ROLL120
datetime=%{x}
value=%{y}", - "legendgroup": "BASE_ROLL120", - "line": { - "color": "#FFA15A", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "BASE_ROLL120", - "showlegend": true, - "type": "scattergl", - "x": [ - "2017-01-05T00:00:00", - "2017-01-06T00:00:00", - "2017-01-09T00:00:00", - "2017-01-10T00:00:00", - "2017-01-11T00:00:00", - "2017-01-12T00:00:00", - "2017-01-13T00:00:00", - "2017-01-17T00:00:00", - "2017-01-18T00:00:00", - "2017-01-19T00:00:00", - "2017-01-20T00:00:00", - "2017-01-23T00:00:00", - "2017-01-24T00:00:00", - "2017-01-25T00:00:00", - "2017-01-26T00:00:00", - "2017-01-27T00:00:00", - "2017-01-30T00:00:00", - "2017-01-31T00:00:00", - "2017-02-01T00:00:00", - "2017-02-02T00:00:00", - "2017-02-03T00:00:00", - "2017-02-06T00:00:00", - "2017-02-07T00:00:00", - "2017-02-08T00:00:00", - "2017-02-09T00:00:00", - "2017-02-10T00:00:00", - "2017-02-13T00:00:00", - "2017-02-14T00:00:00", - "2017-02-15T00:00:00", - "2017-02-16T00:00:00", - "2017-02-17T00:00:00", - "2017-02-21T00:00:00", - "2017-02-22T00:00:00", - "2017-02-23T00:00:00", - "2017-02-24T00:00:00", - "2017-02-27T00:00:00", - "2017-02-28T00:00:00", - "2017-03-01T00:00:00", - "2017-03-02T00:00:00", - "2017-03-03T00:00:00", - "2017-03-06T00:00:00", - "2017-03-07T00:00:00", - "2017-03-08T00:00:00", - "2017-03-09T00:00:00", - "2017-03-10T00:00:00", - "2017-03-13T00:00:00", - "2017-03-14T00:00:00", - "2017-03-15T00:00:00", - "2017-03-16T00:00:00", - "2017-03-17T00:00:00", - "2017-03-20T00:00:00", - "2017-03-21T00:00:00", - "2017-03-22T00:00:00", - "2017-03-23T00:00:00", - "2017-03-24T00:00:00", - "2017-03-27T00:00:00", - "2017-03-28T00:00:00", - "2017-03-29T00:00:00", - "2017-03-30T00:00:00", - "2017-03-31T00:00:00", - "2017-04-03T00:00:00", - "2017-04-04T00:00:00", - "2017-04-05T00:00:00", - "2017-04-06T00:00:00", - "2017-04-07T00:00:00", - "2017-04-10T00:00:00", - "2017-04-11T00:00:00", - "2017-04-12T00:00:00", - "2017-04-13T00:00:00", - "2017-04-17T00:00:00", - "2017-04-18T00:00:00", - "2017-04-19T00:00:00", - "2017-04-20T00:00:00", - "2017-04-21T00:00:00", - "2017-04-24T00:00:00", - "2017-04-25T00:00:00", - "2017-04-26T00:00:00", - "2017-04-27T00:00:00", - "2017-04-28T00:00:00", - "2017-05-01T00:00:00", - "2017-05-02T00:00:00", - "2017-05-03T00:00:00", - "2017-05-04T00:00:00", - "2017-05-05T00:00:00", - "2017-05-08T00:00:00", - "2017-05-09T00:00:00", - "2017-05-10T00:00:00", - "2017-05-11T00:00:00", - "2017-05-12T00:00:00", - "2017-05-15T00:00:00", - "2017-05-16T00:00:00", - "2017-05-17T00:00:00", - "2017-05-18T00:00:00", - "2017-05-19T00:00:00", - "2017-05-22T00:00:00", - "2017-05-23T00:00:00", - "2017-05-24T00:00:00", - "2017-05-25T00:00:00", - "2017-05-26T00:00:00", - "2017-05-29T00:00:00", - "2017-05-30T00:00:00", - "2017-05-31T00:00:00", - "2017-06-01T00:00:00", - "2017-06-02T00:00:00", - "2017-06-05T00:00:00", - "2017-06-06T00:00:00", - "2017-06-07T00:00:00", - "2017-06-08T00:00:00", - "2017-06-09T00:00:00", - "2017-06-12T00:00:00", - "2017-06-13T00:00:00", - "2017-06-14T00:00:00", - "2017-06-15T00:00:00", - "2017-06-16T00:00:00", - "2017-06-19T00:00:00", - "2017-06-20T00:00:00", - "2017-06-21T00:00:00", - "2017-06-22T00:00:00", - "2017-06-23T00:00:00", - "2017-06-26T00:00:00", - "2017-06-27T00:00:00", - "2017-06-28T00:00:00", - "2017-06-29T00:00:00", - "2017-06-30T00:00:00", - "2017-07-03T00:00:00", - "2017-07-05T00:00:00", - "2017-07-06T00:00:00", - "2017-07-07T00:00:00", - "2017-07-10T00:00:00", - "2017-07-11T00:00:00", - "2017-07-12T00:00:00", - "2017-07-13T00:00:00", - "2017-07-14T00:00:00", - "2017-07-17T00:00:00", - "2017-07-18T00:00:00", - "2017-07-19T00:00:00", - "2017-07-20T00:00:00", - "2017-07-21T00:00:00", - "2017-07-24T00:00:00", - "2017-07-25T00:00:00", - "2017-07-26T00:00:00", - "2017-07-27T00:00:00", - "2017-07-28T00:00:00", - "2017-07-31T00:00:00", - "2017-08-01T00:00:00", - "2017-08-02T00:00:00", - "2017-08-03T00:00:00", - "2017-08-04T00:00:00", - "2017-08-07T00:00:00", - "2017-08-08T00:00:00", - "2017-08-09T00:00:00", - "2017-08-10T00:00:00", - "2017-08-11T00:00:00", - "2017-08-14T00:00:00", - "2017-08-15T00:00:00", - "2017-08-16T00:00:00", - "2017-08-17T00:00:00", - "2017-08-18T00:00:00", - "2017-08-21T00:00:00", - "2017-08-22T00:00:00", - "2017-08-23T00:00:00", - "2017-08-24T00:00:00", - "2017-08-25T00:00:00", - "2017-08-28T00:00:00", - "2017-08-29T00:00:00", - "2017-08-30T00:00:00", - "2017-08-31T00:00:00", - "2017-09-01T00:00:00", - "2017-09-05T00:00:00", - "2017-09-06T00:00:00", - "2017-09-07T00:00:00", - "2017-09-08T00:00:00", - "2017-09-11T00:00:00", - "2017-09-12T00:00:00", - "2017-09-13T00:00:00", - "2017-09-14T00:00:00", - "2017-09-15T00:00:00", - "2017-09-18T00:00:00", - "2017-09-19T00:00:00", - "2017-09-20T00:00:00", - "2017-09-21T00:00:00", - "2017-09-22T00:00:00", - "2017-09-25T00:00:00", - "2017-09-26T00:00:00", - "2017-09-27T00:00:00", - "2017-09-28T00:00:00", - "2017-09-29T00:00:00", - "2017-10-02T00:00:00", - "2017-10-03T00:00:00", - "2017-10-04T00:00:00", - "2017-10-05T00:00:00", - "2017-10-06T00:00:00", - "2017-10-09T00:00:00", - "2017-10-10T00:00:00", - "2017-10-11T00:00:00", - "2017-10-12T00:00:00", - "2017-10-13T00:00:00", - "2017-10-16T00:00:00", - "2017-10-17T00:00:00", - "2017-10-18T00:00:00", - "2017-10-19T00:00:00", - "2017-10-20T00:00:00", - "2017-10-23T00:00:00", - "2017-10-24T00:00:00", - "2017-10-25T00:00:00", - "2017-10-26T00:00:00", - "2017-10-27T00:00:00", - "2017-10-30T00:00:00", - "2017-10-31T00:00:00", - "2017-11-01T00:00:00", - "2017-11-02T00:00:00", - "2017-11-03T00:00:00", - "2017-11-06T00:00:00", - "2017-11-07T00:00:00", - "2017-11-08T00:00:00", - "2017-11-09T00:00:00", - "2017-11-10T00:00:00", - "2017-11-13T00:00:00", - "2017-11-14T00:00:00", - "2017-11-15T00:00:00", - "2017-11-16T00:00:00", - "2017-11-17T00:00:00", - "2017-11-20T00:00:00", - "2017-11-21T00:00:00", - "2017-11-22T00:00:00", - "2017-11-24T00:00:00", - "2017-11-27T00:00:00", - "2017-11-28T00:00:00", - "2017-11-29T00:00:00", - "2017-11-30T00:00:00", - "2017-12-01T00:00:00", - "2017-12-04T00:00:00", - "2017-12-05T00:00:00", - "2017-12-06T00:00:00", - "2017-12-07T00:00:00", - "2017-12-08T00:00:00", - "2017-12-11T00:00:00", - "2017-12-12T00:00:00", - "2017-12-13T00:00:00", - "2017-12-14T00:00:00", - "2017-12-15T00:00:00", - "2017-12-18T00:00:00", - "2017-12-19T00:00:00", - "2017-12-20T00:00:00", - "2017-12-21T00:00:00", - "2017-12-22T00:00:00", - "2017-12-26T00:00:00", - "2017-12-27T00:00:00", - "2017-12-28T00:00:00", - "2017-12-29T00:00:00", - "2018-01-01T00:00:00", - "2018-01-02T00:00:00", - "2018-01-04T00:00:00", - "2018-01-05T00:00:00", - "2018-01-08T00:00:00", - "2018-01-09T00:00:00", - "2018-01-10T00:00:00", - "2018-01-11T00:00:00", - "2018-01-12T00:00:00", - "2018-01-15T00:00:00", - "2018-01-16T00:00:00", - "2018-01-17T00:00:00", - "2018-01-18T00:00:00", - "2018-01-19T00:00:00", - "2018-01-22T00:00:00", - "2018-01-23T00:00:00", - "2018-01-24T00:00:00", - "2018-01-25T00:00:00", - "2018-01-26T00:00:00", - "2018-01-29T00:00:00", - "2018-01-30T00:00:00", - "2018-01-31T00:00:00", - "2018-02-01T00:00:00", - "2018-02-02T00:00:00", - "2018-02-05T00:00:00", - "2018-02-06T00:00:00", - "2018-02-07T00:00:00", - "2018-02-08T00:00:00", - "2018-02-09T00:00:00", - "2018-02-12T00:00:00", - "2018-02-13T00:00:00", - "2018-02-14T00:00:00", - "2018-02-15T00:00:00", - "2018-02-16T00:00:00", - "2018-02-20T00:00:00", - "2018-02-21T00:00:00", - "2018-02-22T00:00:00", - "2018-02-23T00:00:00", - "2018-02-26T00:00:00", - "2018-02-27T00:00:00", - "2018-02-28T00:00:00", - "2018-03-01T00:00:00", - "2018-03-02T00:00:00", - "2018-03-05T00:00:00", - "2018-03-06T00:00:00", - "2018-03-07T00:00:00", - "2018-03-08T00:00:00", - "2018-03-09T00:00:00", - "2018-03-12T00:00:00", - "2018-03-13T00:00:00", - "2018-03-14T00:00:00", - "2018-03-15T00:00:00", - "2018-03-16T00:00:00", - "2018-03-19T00:00:00", - "2018-03-20T00:00:00", - "2018-03-21T00:00:00", - "2018-03-22T00:00:00", - "2018-03-23T00:00:00", - "2018-03-26T00:00:00", - "2018-03-27T00:00:00", - "2018-03-28T00:00:00", - "2018-03-29T00:00:00", - "2018-04-02T00:00:00", - "2018-04-03T00:00:00", - "2018-04-04T00:00:00", - "2018-04-05T00:00:00", - "2018-04-06T00:00:00", - "2018-04-09T00:00:00", - "2018-04-10T00:00:00", - "2018-04-11T00:00:00", - "2018-04-12T00:00:00", - "2018-04-13T00:00:00", - "2018-04-16T00:00:00", - "2018-04-17T00:00:00", - "2018-04-18T00:00:00", - "2018-04-19T00:00:00", - "2018-04-20T00:00:00", - "2018-04-23T00:00:00", - "2018-04-24T00:00:00", - "2018-04-25T00:00:00", - "2018-04-26T00:00:00", - "2018-04-27T00:00:00", - "2018-04-30T00:00:00", - "2018-05-01T00:00:00", - "2018-05-02T00:00:00", - "2018-05-03T00:00:00", - "2018-05-04T00:00:00", - "2018-05-07T00:00:00", - "2018-05-08T00:00:00", - "2018-05-09T00:00:00", - "2018-05-10T00:00:00", - "2018-05-11T00:00:00", - "2018-05-14T00:00:00", - "2018-05-15T00:00:00", - "2018-05-16T00:00:00", - "2018-05-17T00:00:00", - "2018-05-18T00:00:00", - "2018-05-21T00:00:00", - "2018-05-22T00:00:00", - "2018-05-23T00:00:00", - "2018-05-24T00:00:00", - "2018-05-25T00:00:00", - "2018-05-28T00:00:00", - "2018-05-29T00:00:00", - "2018-05-30T00:00:00", - "2018-05-31T00:00:00", - "2018-06-01T00:00:00", - "2018-06-04T00:00:00", - "2018-06-05T00:00:00", - "2018-06-06T00:00:00", - "2018-06-07T00:00:00", - "2018-06-08T00:00:00", - "2018-06-11T00:00:00", - "2018-06-12T00:00:00", - "2018-06-13T00:00:00", - "2018-06-14T00:00:00", - "2018-06-15T00:00:00", - "2018-06-18T00:00:00", - "2018-06-19T00:00:00", - "2018-06-20T00:00:00", - "2018-06-21T00:00:00", - "2018-06-22T00:00:00", - "2018-06-25T00:00:00", - "2018-06-26T00:00:00", - "2018-06-27T00:00:00", - "2018-06-28T00:00:00", - "2018-06-29T00:00:00", - "2018-07-02T00:00:00", - "2018-07-03T00:00:00", - "2018-07-05T00:00:00", - "2018-07-06T00:00:00", - "2018-07-09T00:00:00", - "2018-07-10T00:00:00", - "2018-07-11T00:00:00", - "2018-07-12T00:00:00", - "2018-07-13T00:00:00", - "2018-07-16T00:00:00", - "2018-07-17T00:00:00", - "2018-07-18T00:00:00", - "2018-07-19T00:00:00", - "2018-07-20T00:00:00", - "2018-07-23T00:00:00", - "2018-07-24T00:00:00", - "2018-07-25T00:00:00", - "2018-07-26T00:00:00", - "2018-07-27T00:00:00", - "2018-07-30T00:00:00", - "2018-07-31T00:00:00", - "2018-08-01T00:00:00", - "2018-08-02T00:00:00", - "2018-08-03T00:00:00", - "2018-08-06T00:00:00", - "2018-08-07T00:00:00", - "2018-08-08T00:00:00", - "2018-08-09T00:00:00", - "2018-08-10T00:00:00", - "2018-08-13T00:00:00", - "2018-08-14T00:00:00", - "2018-08-15T00:00:00", - "2018-08-16T00:00:00", - "2018-08-17T00:00:00", - "2018-08-20T00:00:00", - "2018-08-21T00:00:00", - "2018-08-22T00:00:00", - "2018-08-23T00:00:00", - "2018-08-24T00:00:00", - "2018-08-27T00:00:00", - "2018-08-28T00:00:00", - "2018-08-29T00:00:00", - "2018-08-30T00:00:00", - "2018-08-31T00:00:00", - "2018-09-03T00:00:00", - "2018-09-04T00:00:00", - "2018-09-05T00:00:00", - "2018-09-06T00:00:00", - "2018-09-07T00:00:00", - "2018-09-10T00:00:00", - "2018-09-11T00:00:00", - "2018-09-12T00:00:00", - "2018-09-13T00:00:00", - "2018-09-14T00:00:00", - "2018-09-17T00:00:00", - "2018-09-18T00:00:00", - "2018-09-19T00:00:00", - "2018-09-20T00:00:00", - "2018-09-21T00:00:00", - "2018-09-24T00:00:00", - "2018-09-25T00:00:00", - "2018-09-26T00:00:00", - "2018-09-27T00:00:00", - "2018-09-28T00:00:00", - "2018-10-01T00:00:00", - "2018-10-02T00:00:00", - "2018-10-03T00:00:00", - "2018-10-04T00:00:00", - "2018-10-05T00:00:00", - "2018-10-08T00:00:00", - "2018-10-09T00:00:00", - "2018-10-10T00:00:00", - "2018-10-11T00:00:00", - "2018-10-12T00:00:00", - "2018-10-15T00:00:00", - "2018-10-16T00:00:00", - "2018-10-17T00:00:00", - "2018-10-18T00:00:00", - "2018-10-19T00:00:00", - "2018-10-22T00:00:00", - "2018-10-23T00:00:00", - "2018-10-24T00:00:00", - "2018-10-25T00:00:00", - "2018-10-26T00:00:00", - "2018-10-29T00:00:00", - "2018-10-30T00:00:00", - "2018-10-31T00:00:00", - "2018-11-01T00:00:00", - "2018-11-02T00:00:00", - "2018-11-05T00:00:00", - "2018-11-06T00:00:00", - "2018-11-07T00:00:00", - "2018-11-08T00:00:00", - "2018-11-09T00:00:00", - "2018-11-12T00:00:00", - "2018-11-13T00:00:00", - "2018-11-14T00:00:00", - "2018-11-15T00:00:00", - "2018-11-16T00:00:00", - "2018-11-19T00:00:00", - "2018-11-20T00:00:00", - "2018-11-21T00:00:00", - "2018-11-23T00:00:00", - "2018-11-26T00:00:00", - "2018-11-27T00:00:00", - "2018-11-28T00:00:00", - "2018-11-29T00:00:00", - "2018-11-30T00:00:00", - "2018-12-03T00:00:00", - "2018-12-04T00:00:00", - "2018-12-06T00:00:00", - "2018-12-07T00:00:00", - "2018-12-10T00:00:00", - "2018-12-11T00:00:00", - "2018-12-12T00:00:00", - "2018-12-13T00:00:00", - "2018-12-14T00:00:00", - "2018-12-17T00:00:00", - "2018-12-18T00:00:00", - "2018-12-19T00:00:00", - "2018-12-20T00:00:00", - "2018-12-21T00:00:00", - "2018-12-24T00:00:00", - "2018-12-26T00:00:00", - "2018-12-27T00:00:00", - "2018-12-28T00:00:00", - "2018-12-31T00:00:00", - "2019-01-01T00:00:00", - "2019-01-02T00:00:00", - "2019-01-04T00:00:00", - "2019-01-08T00:00:00", - "2019-01-09T00:00:00", - "2019-01-10T00:00:00", - "2019-01-11T00:00:00", - "2019-01-16T00:00:00", - "2019-01-18T00:00:00", - "2019-01-22T00:00:00", - "2019-01-23T00:00:00", - "2019-01-24T00:00:00", - "2019-01-28T00:00:00", - "2019-01-29T00:00:00", - "2019-01-30T00:00:00", - "2019-01-31T00:00:00", - "2019-02-01T00:00:00", - "2019-02-04T00:00:00", - "2019-02-05T00:00:00", - "2019-02-06T00:00:00", - "2019-02-07T00:00:00", - "2019-02-08T00:00:00", - "2019-02-11T00:00:00", - "2019-02-12T00:00:00", - "2019-02-13T00:00:00", - "2019-02-14T00:00:00", - "2019-02-15T00:00:00", - "2019-02-18T00:00:00", - "2019-02-19T00:00:00", - "2019-02-20T00:00:00", - "2019-02-21T00:00:00", - "2019-02-22T00:00:00", - "2019-02-25T00:00:00", - "2019-02-26T00:00:00", - "2019-02-27T00:00:00", - "2019-02-28T00:00:00", - "2019-03-01T00:00:00", - "2019-03-04T00:00:00", - "2019-03-05T00:00:00", - "2019-03-06T00:00:00", - "2019-03-07T00:00:00", - "2019-03-08T00:00:00", - "2019-03-11T00:00:00", - "2019-03-12T00:00:00", - "2019-03-13T00:00:00", - "2019-03-14T00:00:00", - "2019-03-15T00:00:00", - "2019-03-18T00:00:00", - "2019-03-19T00:00:00", - "2019-03-20T00:00:00", - "2019-03-21T00:00:00", - "2019-03-22T00:00:00", - "2019-03-25T00:00:00", - "2019-03-26T00:00:00", - "2019-03-27T00:00:00", - "2019-03-28T00:00:00", - "2019-03-29T00:00:00", - "2019-04-01T00:00:00", - "2019-04-02T00:00:00", - "2019-04-03T00:00:00", - "2019-04-04T00:00:00", - "2019-04-05T00:00:00", - "2019-04-08T00:00:00", - "2019-04-09T00:00:00", - "2019-04-10T00:00:00", - "2019-04-11T00:00:00", - "2019-04-12T00:00:00", - "2019-04-15T00:00:00", - "2019-04-16T00:00:00", - "2019-04-17T00:00:00", - "2019-04-18T00:00:00", - "2019-04-19T00:00:00", - "2019-04-22T00:00:00", - "2019-04-23T00:00:00", - "2019-04-24T00:00:00", - "2019-04-25T00:00:00", - "2019-04-26T00:00:00", - "2019-04-29T00:00:00", - "2019-04-30T00:00:00", - "2019-05-01T00:00:00", - "2019-05-02T00:00:00", - "2019-05-03T00:00:00", - "2019-05-06T00:00:00", - "2019-05-07T00:00:00", - "2019-05-08T00:00:00", - "2019-05-09T00:00:00", - "2019-05-10T00:00:00", - "2019-05-13T00:00:00", - "2019-05-14T00:00:00", - "2019-05-15T00:00:00", - "2019-05-16T00:00:00", - "2019-05-17T00:00:00", - "2019-05-20T00:00:00", - "2019-05-21T00:00:00", - "2019-05-22T00:00:00", - "2019-05-23T00:00:00", - "2019-05-24T00:00:00", - "2019-05-28T00:00:00", - "2019-05-29T00:00:00", - "2019-05-30T00:00:00", - "2019-05-31T00:00:00", - "2019-06-03T00:00:00", - "2019-06-04T00:00:00", - "2019-06-05T00:00:00", - "2019-06-06T00:00:00", - "2019-06-07T00:00:00", - "2019-06-10T00:00:00", - "2019-06-11T00:00:00", - "2019-06-12T00:00:00", - "2019-06-13T00:00:00", - "2019-06-14T00:00:00", - "2019-06-17T00:00:00", - "2019-06-18T00:00:00", - "2019-06-19T00:00:00", - "2019-06-20T00:00:00", - "2019-06-21T00:00:00", - "2019-06-24T00:00:00", - "2019-06-25T00:00:00", - "2019-06-26T00:00:00", - "2019-06-27T00:00:00", - "2019-06-28T00:00:00", - "2019-07-01T00:00:00", - "2019-07-02T00:00:00", - "2019-07-03T00:00:00", - "2019-07-04T00:00:00", - "2019-07-05T00:00:00", - "2019-07-08T00:00:00", - "2019-07-09T00:00:00", - "2019-07-10T00:00:00", - "2019-07-11T00:00:00", - "2019-07-12T00:00:00", - "2019-07-15T00:00:00", - "2019-07-16T00:00:00", - "2019-07-17T00:00:00", - "2019-07-18T00:00:00", - "2019-07-19T00:00:00", - "2019-07-22T00:00:00", - "2019-07-23T00:00:00", - "2019-07-24T00:00:00", - "2019-07-25T00:00:00", - "2019-07-26T00:00:00", - "2019-07-29T00:00:00", - "2019-07-30T00:00:00", - "2019-07-31T00:00:00", - "2019-08-01T00:00:00", - "2019-08-02T00:00:00", - "2019-08-05T00:00:00", - "2019-08-06T00:00:00", - "2019-08-07T00:00:00", - "2019-08-08T00:00:00", - "2019-08-09T00:00:00", - "2019-08-12T00:00:00", - "2019-08-13T00:00:00", - "2019-08-14T00:00:00", - "2019-08-15T00:00:00", - "2019-08-16T00:00:00", - "2019-08-19T00:00:00", - "2019-08-20T00:00:00", - "2019-08-21T00:00:00", - "2019-08-22T00:00:00", - "2019-08-23T00:00:00", - "2019-08-26T00:00:00", - "2019-08-27T00:00:00", - "2019-08-28T00:00:00", - "2019-08-29T00:00:00", - "2019-08-30T00:00:00", - "2019-09-03T00:00:00", - "2019-09-04T00:00:00", - "2019-09-05T00:00:00", - "2019-09-06T00:00:00", - "2019-09-09T00:00:00", - "2019-09-10T00:00:00", - "2019-09-11T00:00:00", - "2019-09-12T00:00:00", - "2019-09-13T00:00:00", - "2019-09-16T00:00:00", - "2019-09-17T00:00:00", - "2019-09-18T00:00:00", - "2019-09-19T00:00:00", - "2019-09-20T00:00:00", - "2019-09-23T00:00:00", - "2019-09-24T00:00:00", - "2019-09-25T00:00:00", - "2019-09-26T00:00:00", - "2019-09-27T00:00:00", - "2019-09-30T00:00:00", - "2019-10-01T00:00:00", - "2019-10-02T00:00:00", - "2019-10-03T00:00:00", - "2019-10-04T00:00:00", - "2019-10-07T00:00:00", - "2019-10-08T00:00:00", - "2019-10-09T00:00:00", - "2019-10-10T00:00:00", - "2019-10-11T00:00:00", - "2019-10-14T00:00:00", - "2019-10-15T00:00:00", - "2019-10-16T00:00:00", - "2019-10-17T00:00:00", - "2019-10-18T00:00:00", - "2019-10-21T00:00:00", - "2019-10-22T00:00:00", - "2019-10-23T00:00:00", - "2019-10-24T00:00:00", - "2019-10-25T00:00:00", - "2019-10-28T00:00:00", - "2019-10-29T00:00:00", - "2019-10-30T00:00:00", - "2019-10-31T00:00:00", - "2019-11-01T00:00:00", - "2019-11-04T00:00:00", - "2019-11-05T00:00:00", - "2019-11-06T00:00:00", - "2019-11-07T00:00:00", - "2019-11-08T00:00:00", - "2019-11-11T00:00:00", - "2019-11-12T00:00:00", - "2019-11-13T00:00:00", - "2019-11-14T00:00:00", - "2019-11-15T00:00:00", - "2019-11-18T00:00:00", - "2019-11-19T00:00:00", - "2019-11-20T00:00:00", - "2019-11-21T00:00:00", - "2019-11-22T00:00:00", - "2019-11-25T00:00:00", - "2019-11-26T00:00:00", - "2019-11-27T00:00:00", - "2019-11-28T00:00:00", - "2019-11-29T00:00:00", - "2019-12-02T00:00:00", - "2019-12-03T00:00:00", - "2019-12-04T00:00:00", - "2019-12-05T00:00:00", - "2019-12-06T00:00:00", - "2019-12-09T00:00:00", - "2019-12-10T00:00:00", - "2019-12-11T00:00:00", - "2019-12-12T00:00:00", - "2019-12-13T00:00:00", - "2019-12-16T00:00:00", - "2019-12-17T00:00:00", - "2019-12-18T00:00:00", - "2019-12-19T00:00:00", - "2019-12-20T00:00:00", - "2019-12-23T00:00:00", - "2019-12-24T00:00:00", - "2019-12-26T00:00:00", - "2019-12-27T00:00:00", - "2019-12-30T00:00:00", - "2019-12-31T00:00:00", - "2020-01-01T00:00:00", - "2020-01-02T00:00:00", - "2020-01-06T00:00:00", - "2020-01-07T00:00:00", - "2020-01-08T00:00:00", - "2020-01-09T00:00:00", - "2020-01-10T00:00:00", - "2020-01-13T00:00:00", - "2020-01-14T00:00:00", - "2020-01-15T00:00:00", - "2020-01-16T00:00:00", - "2020-01-17T00:00:00", - "2020-01-21T00:00:00", - "2020-01-22T00:00:00", - "2020-01-23T00:00:00", - "2020-01-24T00:00:00", - "2020-01-27T00:00:00", - "2020-01-28T00:00:00", - "2020-01-29T00:00:00", - "2020-01-30T00:00:00", - "2020-01-31T00:00:00", - "2020-02-03T00:00:00", - "2020-02-04T00:00:00", - "2020-02-05T00:00:00", - "2020-02-06T00:00:00", - "2020-02-07T00:00:00", - "2020-02-10T00:00:00", - "2020-02-11T00:00:00", - "2020-02-12T00:00:00", - "2020-02-13T00:00:00", - "2020-02-14T00:00:00", - "2020-02-18T00:00:00", - "2020-02-19T00:00:00", - "2020-02-20T00:00:00", - "2020-02-21T00:00:00", - "2020-02-24T00:00:00", - "2020-02-25T00:00:00", - "2020-02-26T00:00:00", - "2020-02-27T00:00:00", - "2020-02-28T00:00:00", - "2020-03-02T00:00:00", - "2020-03-03T00:00:00", - "2020-03-04T00:00:00", - "2020-03-05T00:00:00", - "2020-03-06T00:00:00", - "2020-03-09T00:00:00", - "2020-03-10T00:00:00", - "2020-03-11T00:00:00", - "2020-03-12T00:00:00", - "2020-03-13T00:00:00", - "2020-03-16T00:00:00", - "2020-03-17T00:00:00", - "2020-03-18T00:00:00", - "2020-03-19T00:00:00", - "2020-03-20T00:00:00", - "2020-03-23T00:00:00", - "2020-03-24T00:00:00", - "2020-03-25T00:00:00", - "2020-03-26T00:00:00", - "2020-03-27T00:00:00", - "2020-03-30T00:00:00", - "2020-03-31T00:00:00", - "2020-04-01T00:00:00", - "2020-04-02T00:00:00", - "2020-04-03T00:00:00", - "2020-04-06T00:00:00", - "2020-04-07T00:00:00", - "2020-04-08T00:00:00", - "2020-04-09T00:00:00", - "2020-04-13T00:00:00", - "2020-04-14T00:00:00", - "2020-04-15T00:00:00", - "2020-04-16T00:00:00", - "2020-04-17T00:00:00", - "2020-04-20T00:00:00", - "2020-04-21T00:00:00", - "2020-04-22T00:00:00", - "2020-04-23T00:00:00", - "2020-04-24T00:00:00", - "2020-04-27T00:00:00", - "2020-04-28T00:00:00", - "2020-04-29T00:00:00", - "2020-04-30T00:00:00", - "2020-05-01T00:00:00", - "2020-05-04T00:00:00", - "2020-05-05T00:00:00", - "2020-05-06T00:00:00", - "2020-05-07T00:00:00", - "2020-05-08T00:00:00", - "2020-05-11T00:00:00", - "2020-05-12T00:00:00", - "2020-05-13T00:00:00", - "2020-05-14T00:00:00", - "2020-05-15T00:00:00", - "2020-05-18T00:00:00", - "2020-05-19T00:00:00", - "2020-05-20T00:00:00", - "2020-05-21T00:00:00", - "2020-05-22T00:00:00", - "2020-05-26T00:00:00", - "2020-05-27T00:00:00", - "2020-05-28T00:00:00", - "2020-05-29T00:00:00", - "2020-06-01T00:00:00", - "2020-06-02T00:00:00", - "2020-06-03T00:00:00", - "2020-06-04T00:00:00", - "2020-06-05T00:00:00", - "2020-06-08T00:00:00", - "2020-06-09T00:00:00", - "2020-06-10T00:00:00", - "2020-06-11T00:00:00", - "2020-06-12T00:00:00", - "2020-06-15T00:00:00", - "2020-06-16T00:00:00", - "2020-06-17T00:00:00", - "2020-06-18T00:00:00", - "2020-06-19T00:00:00", - "2020-06-22T00:00:00", - "2020-06-23T00:00:00", - "2020-06-24T00:00:00", - "2020-06-25T00:00:00", - "2020-06-26T00:00:00", - "2020-06-29T00:00:00", - "2020-06-30T00:00:00", - "2020-07-01T00:00:00", - "2020-07-02T00:00:00", - "2020-07-06T00:00:00", - "2020-07-07T00:00:00", - "2020-07-08T00:00:00", - "2020-07-09T00:00:00", - "2020-07-10T00:00:00", - "2020-07-13T00:00:00", - "2020-07-14T00:00:00", - "2020-07-15T00:00:00", - "2020-07-16T00:00:00", - "2020-07-17T00:00:00", - "2020-07-20T00:00:00", - "2020-07-21T00:00:00", - "2020-07-22T00:00:00", - "2020-07-23T00:00:00", - "2020-07-24T00:00:00", - "2020-07-27T00:00:00", - "2020-07-28T00:00:00", - "2020-07-29T00:00:00", - "2020-07-30T00:00:00", - "2020-07-31T00:00:00", - "2020-08-03T00:00:00", - "2020-08-04T00:00:00", - "2020-08-05T00:00:00", - "2020-08-06T00:00:00", - "2020-08-07T00:00:00", - "2020-08-10T00:00:00", - "2020-08-11T00:00:00", - "2020-08-12T00:00:00", - "2020-08-13T00:00:00", - "2020-08-14T00:00:00", - "2020-08-17T00:00:00", - "2020-08-18T00:00:00", - "2020-08-19T00:00:00", - "2020-08-20T00:00:00", - "2020-08-21T00:00:00", - "2020-08-24T00:00:00", - "2020-08-25T00:00:00", - "2020-08-26T00:00:00", - "2020-08-27T00:00:00", - "2020-08-28T00:00:00", - "2020-08-31T00:00:00", - "2020-09-01T00:00:00", - "2020-09-02T00:00:00", - "2020-09-03T00:00:00", - "2020-09-04T00:00:00", - "2020-09-08T00:00:00", - "2020-09-09T00:00:00", - "2020-09-10T00:00:00", - "2020-09-11T00:00:00", - "2020-09-14T00:00:00", - "2020-09-15T00:00:00", - "2020-09-16T00:00:00", - "2020-09-17T00:00:00", - "2020-09-18T00:00:00", - "2020-09-21T00:00:00", - "2020-09-22T00:00:00", - "2020-09-23T00:00:00", - "2020-09-24T00:00:00", - "2020-09-25T00:00:00", - "2020-09-28T00:00:00", - "2020-09-29T00:00:00", - "2020-09-30T00:00:00", - "2020-10-01T00:00:00", - "2020-10-02T00:00:00", - "2020-10-05T00:00:00", - "2020-10-06T00:00:00", - "2020-10-07T00:00:00", - "2020-10-08T00:00:00", - "2020-10-09T00:00:00", - "2020-10-12T00:00:00", - "2020-10-13T00:00:00", - "2020-10-14T00:00:00", - "2020-10-15T00:00:00", - "2020-10-16T00:00:00", - "2020-10-19T00:00:00", - "2020-10-20T00:00:00", - "2020-10-21T00:00:00", - "2020-10-22T00:00:00", - "2020-10-23T00:00:00", - "2020-10-26T00:00:00", - "2020-10-27T00:00:00", - "2020-10-28T00:00:00", - "2020-10-29T00:00:00", - "2020-10-30T00:00:00", - "2020-11-02T00:00:00", - "2020-11-03T00:00:00", - "2020-11-04T00:00:00", - "2020-11-05T00:00:00", - "2020-11-06T00:00:00", - "2020-11-09T00:00:00", - "2020-11-10T00:00:00", - "2020-11-11T00:00:00", - "2020-11-12T00:00:00", - "2020-11-13T00:00:00", - "2020-11-16T00:00:00", - "2020-11-17T00:00:00", - "2020-11-18T00:00:00", - "2020-11-19T00:00:00", - "2020-11-20T00:00:00", - "2020-11-23T00:00:00", - "2020-11-24T00:00:00", - "2020-11-25T00:00:00", - "2020-11-27T00:00:00", - "2020-11-30T00:00:00", - "2020-12-01T00:00:00", - "2020-12-02T00:00:00", - "2020-12-03T00:00:00", - "2020-12-04T00:00:00", - "2020-12-07T00:00:00", - "2020-12-08T00:00:00", - "2020-12-09T00:00:00", - "2020-12-10T00:00:00", - "2020-12-11T00:00:00", - "2020-12-14T00:00:00", - "2020-12-15T00:00:00", - "2020-12-16T00:00:00", - "2020-12-17T00:00:00", - "2020-12-18T00:00:00", - "2020-12-21T00:00:00", - "2020-12-22T00:00:00", - "2020-12-23T00:00:00", - "2020-12-24T00:00:00", - "2020-12-28T00:00:00", - "2020-12-29T00:00:00", - "2020-12-30T00:00:00", - "2020-12-31T00:00:00", - "2021-01-01T00:00:00", - "2021-01-04T00:00:00", - "2021-01-06T00:00:00", - "2021-01-07T00:00:00", - "2021-01-08T00:00:00", - "2021-01-11T00:00:00", - "2021-01-12T00:00:00", - "2021-01-13T00:00:00", - "2021-01-14T00:00:00", - "2021-01-15T00:00:00", - "2021-01-19T00:00:00", - "2021-01-20T00:00:00", - "2021-01-21T00:00:00", - "2021-01-22T00:00:00", - "2021-01-25T00:00:00", - "2021-01-26T00:00:00", - "2021-01-27T00:00:00", - "2021-01-28T00:00:00", - "2021-01-29T00:00:00", - "2021-02-01T00:00:00", - "2021-02-02T00:00:00", - "2021-02-03T00:00:00", - "2021-02-04T00:00:00", - "2021-02-05T00:00:00", - "2021-02-08T00:00:00", - "2021-02-09T00:00:00", - "2021-02-10T00:00:00", - "2021-02-11T00:00:00", - "2021-02-12T00:00:00", - "2021-02-16T00:00:00", - "2021-02-17T00:00:00", - "2021-02-18T00:00:00", - "2021-02-19T00:00:00", - "2021-02-22T00:00:00", - "2021-02-23T00:00:00", - "2021-02-24T00:00:00", - "2021-02-25T00:00:00", - "2021-02-26T00:00:00", - "2021-03-01T00:00:00", - "2021-03-02T00:00:00", - "2021-03-03T00:00:00", - "2021-03-04T00:00:00", - "2021-03-05T00:00:00", - "2021-03-08T00:00:00", - "2021-03-09T00:00:00", - "2021-03-10T00:00:00", - "2021-03-11T00:00:00", - "2021-03-12T00:00:00", - "2021-03-15T00:00:00", - "2021-03-16T00:00:00", - "2021-03-17T00:00:00", - "2021-03-18T00:00:00", - "2021-03-19T00:00:00", - "2021-03-22T00:00:00", - "2021-03-23T00:00:00", - "2021-03-24T00:00:00", - "2021-03-25T00:00:00", - "2021-03-26T00:00:00", - "2021-03-29T00:00:00", - "2021-03-30T00:00:00", - "2021-03-31T00:00:00", - "2021-04-01T00:00:00", - "2021-04-05T00:00:00", - "2021-04-06T00:00:00", - "2021-04-07T00:00:00", - "2021-04-08T00:00:00", - "2021-04-09T00:00:00", - "2021-04-12T00:00:00", - "2021-04-13T00:00:00", - "2021-04-14T00:00:00", - "2021-04-15T00:00:00", - "2021-04-16T00:00:00", - "2021-04-19T00:00:00", - "2021-04-20T00:00:00", - "2021-04-21T00:00:00", - "2021-04-22T00:00:00", - "2021-04-23T00:00:00", - "2021-04-26T00:00:00", - "2021-04-27T00:00:00", - "2021-04-28T00:00:00", - "2021-04-29T00:00:00", - "2021-04-30T00:00:00", - "2021-05-03T00:00:00", - "2021-05-04T00:00:00", - "2021-05-05T00:00:00", - "2021-05-06T00:00:00", - "2021-05-07T00:00:00", - "2021-05-10T00:00:00", - "2021-05-11T00:00:00", - "2021-05-12T00:00:00", - "2021-05-13T00:00:00", - "2021-05-14T00:00:00", - "2021-05-17T00:00:00", - "2021-05-18T00:00:00", - "2021-05-19T00:00:00", - "2021-05-20T00:00:00", - "2021-05-21T00:00:00", - "2021-05-24T00:00:00", - "2021-05-25T00:00:00", - "2021-05-26T00:00:00", - "2021-05-27T00:00:00", - "2021-05-28T00:00:00", - "2021-06-01T00:00:00", - "2021-06-02T00:00:00", - "2021-06-03T00:00:00", - "2021-06-04T00:00:00", - "2021-06-07T00:00:00", - "2021-06-08T00:00:00", - "2021-06-09T00:00:00", - "2021-06-10T00:00:00", - "2021-06-11T00:00:00", - "2021-06-14T00:00:00", - "2021-06-15T00:00:00", - "2021-06-16T00:00:00", - "2021-06-17T00:00:00", - "2021-06-18T00:00:00", - "2021-06-21T00:00:00", - "2021-06-22T00:00:00", - "2021-06-23T00:00:00", - "2021-06-24T00:00:00", - "2021-06-25T00:00:00", - "2021-06-28T00:00:00", - "2021-06-29T00:00:00", - "2021-06-30T00:00:00", - "2021-07-01T00:00:00", - "2021-07-02T00:00:00", - "2021-07-05T00:00:00", - "2021-07-06T00:00:00", - "2021-07-07T00:00:00", - "2021-07-08T00:00:00", - "2021-07-09T00:00:00", - "2021-07-12T00:00:00", - "2021-07-13T00:00:00", - "2021-07-14T00:00:00", - "2021-07-15T00:00:00", - "2021-07-16T00:00:00", - "2021-07-19T00:00:00", - "2021-07-20T00:00:00", - "2021-07-21T00:00:00", - "2021-07-22T00:00:00", - "2021-07-23T00:00:00", - "2021-07-26T00:00:00", - "2021-07-27T00:00:00", - "2021-07-28T00:00:00", - "2021-07-29T00:00:00", - "2021-07-30T00:00:00", - "2021-08-02T00:00:00", - "2021-08-03T00:00:00", - "2021-08-04T00:00:00", - "2021-08-05T00:00:00", - "2021-08-06T00:00:00", - "2021-08-09T00:00:00", - "2021-08-10T00:00:00", - "2021-08-11T00:00:00", - "2021-08-12T00:00:00", - "2021-08-13T00:00:00", - "2021-08-16T00:00:00", - "2021-08-17T00:00:00", - "2021-08-18T00:00:00", - "2021-08-19T00:00:00", - "2021-08-20T00:00:00", - "2021-08-23T00:00:00", - "2021-08-24T00:00:00", - "2021-08-25T00:00:00", - "2021-08-26T00:00:00", - "2021-08-27T00:00:00", - "2021-08-30T00:00:00", - "2021-08-31T00:00:00", - "2021-09-01T00:00:00", - "2021-09-02T00:00:00", - "2021-09-03T00:00:00", - "2021-09-07T00:00:00", - "2021-09-08T00:00:00", - "2021-09-09T00:00:00", - "2021-09-10T00:00:00", - "2021-09-13T00:00:00", - "2021-09-14T00:00:00", - "2021-09-15T00:00:00", - "2021-09-16T00:00:00", - "2021-09-17T00:00:00", - "2021-09-20T00:00:00", - "2021-09-21T00:00:00", - "2021-09-22T00:00:00", - "2021-09-23T00:00:00", - "2021-09-24T00:00:00", - "2021-09-27T00:00:00", - "2021-09-28T00:00:00", - "2021-09-29T00:00:00", - "2021-09-30T00:00:00", - "2021-10-01T00:00:00", - "2021-10-04T00:00:00", - "2021-10-05T00:00:00", - "2021-10-06T00:00:00", - "2021-10-07T00:00:00", - "2021-10-08T00:00:00", - "2021-10-11T00:00:00", - "2021-10-12T00:00:00", - "2021-10-13T00:00:00", - "2021-10-14T00:00:00", - "2021-10-15T00:00:00", - "2021-10-18T00:00:00", - "2021-10-19T00:00:00", - "2021-10-20T00:00:00", - "2021-10-21T00:00:00", - "2021-10-22T00:00:00", - "2021-10-25T00:00:00", - "2021-10-26T00:00:00", - "2021-10-27T00:00:00", - "2021-10-28T00:00:00", - "2021-10-29T00:00:00", - "2021-11-01T00:00:00", - "2021-11-02T00:00:00", - "2021-11-03T00:00:00", - "2021-11-04T00:00:00", - "2021-11-05T00:00:00", - "2021-11-08T00:00:00", - "2021-11-09T00:00:00", - "2021-11-10T00:00:00", - "2021-11-11T00:00:00", - "2021-11-12T00:00:00", - "2021-11-15T00:00:00", - "2021-11-16T00:00:00", - "2021-11-17T00:00:00", - "2021-11-18T00:00:00", - "2021-11-19T00:00:00", - "2021-11-22T00:00:00", - "2021-11-23T00:00:00", - "2021-11-24T00:00:00", - "2021-11-25T00:00:00", - "2021-11-26T00:00:00", - "2021-11-29T00:00:00", - "2021-11-30T00:00:00", - "2021-12-01T00:00:00", - "2021-12-02T00:00:00", - "2021-12-03T00:00:00", - "2021-12-06T00:00:00", - "2021-12-07T00:00:00", - "2021-12-08T00:00:00", - "2021-12-09T00:00:00", - "2021-12-10T00:00:00", - "2021-12-13T00:00:00", - "2021-12-14T00:00:00", - "2021-12-15T00:00:00", - "2021-12-16T00:00:00", - "2021-12-17T00:00:00", - "2021-12-20T00:00:00", - "2021-12-21T00:00:00", - "2021-12-22T00:00:00", - "2021-12-23T00:00:00", - "2021-12-27T00:00:00", - "2021-12-28T00:00:00", - "2021-12-29T00:00:00", - "2021-12-30T00:00:00", - "2021-12-31T00:00:00", - "2022-01-03T00:00:00", - "2022-01-05T00:00:00", - "2022-01-06T00:00:00", - "2022-01-07T00:00:00", - "2022-01-10T00:00:00", - "2022-01-11T00:00:00", - "2022-01-12T00:00:00", - "2022-01-13T00:00:00", - "2022-01-14T00:00:00", - "2022-01-18T00:00:00", - "2022-01-19T00:00:00", - "2022-01-20T00:00:00", - "2022-01-21T00:00:00", - "2022-01-24T00:00:00", - "2022-01-25T00:00:00", - "2022-01-26T00:00:00", - "2022-01-27T00:00:00", - "2022-01-28T00:00:00", - "2022-01-31T00:00:00", - "2022-02-01T00:00:00", - "2022-02-02T00:00:00", - "2022-02-03T00:00:00", - "2022-02-04T00:00:00", - "2022-02-07T00:00:00", - "2022-02-08T00:00:00", - "2022-02-09T00:00:00", - "2022-02-10T00:00:00", - "2022-02-11T00:00:00", - "2022-02-14T00:00:00", - "2022-02-15T00:00:00", - "2022-02-16T00:00:00", - "2022-02-17T00:00:00", - "2022-02-18T00:00:00", - "2022-02-22T00:00:00", - "2022-02-23T00:00:00", - "2022-02-24T00:00:00", - "2022-02-25T00:00:00", - "2022-02-28T00:00:00", - "2022-03-01T00:00:00", - "2022-03-02T00:00:00", - "2022-03-03T00:00:00", - "2022-03-04T00:00:00", - "2022-03-07T00:00:00", - "2022-03-08T00:00:00", - "2022-03-09T00:00:00", - "2022-03-10T00:00:00", - "2022-03-11T00:00:00", - "2022-03-14T00:00:00", - "2022-03-15T00:00:00", - "2022-03-16T00:00:00", - "2022-03-17T00:00:00", - "2022-03-18T00:00:00", - "2022-03-21T00:00:00", - "2022-03-22T00:00:00", - "2022-03-23T00:00:00", - "2022-03-24T00:00:00", - "2022-03-25T00:00:00", - "2022-03-28T00:00:00", - "2022-03-29T00:00:00", - "2022-03-30T00:00:00", - "2022-03-31T00:00:00", - "2022-04-01T00:00:00", - "2022-04-04T00:00:00", - "2022-04-05T00:00:00", - "2022-04-06T00:00:00", - "2022-04-07T00:00:00", - "2022-04-08T00:00:00", - "2022-04-11T00:00:00", - "2022-04-12T00:00:00", - "2022-04-13T00:00:00", - "2022-04-14T00:00:00", - "2022-04-18T00:00:00", - "2022-04-19T00:00:00", - "2022-04-20T00:00:00", - "2022-04-21T00:00:00", - "2022-04-22T00:00:00", - "2022-04-25T00:00:00", - "2022-04-26T00:00:00", - "2022-04-27T00:00:00", - "2022-04-28T00:00:00", - "2022-04-29T00:00:00", - "2022-05-03T00:00:00", - "2022-05-04T00:00:00", - "2022-05-05T00:00:00", - "2022-05-06T00:00:00", - "2022-05-09T00:00:00", - "2022-05-10T00:00:00", - "2022-08-01T00:00:00", - "2022-08-02T00:00:00", - "2022-08-03T00:00:00", - "2022-08-04T00:00:00", - "2022-08-05T00:00:00", - "2022-08-08T00:00:00", - "2022-08-09T00:00:00", - "2022-08-10T00:00:00", - "2022-08-11T00:00:00", - "2022-08-12T00:00:00", - "2022-08-15T00:00:00", - "2022-08-16T00:00:00", - "2022-08-17T00:00:00", - "2022-08-18T00:00:00", - "2022-08-19T00:00:00", - "2022-08-22T00:00:00", - "2022-08-23T00:00:00", - "2022-08-24T00:00:00", - "2022-08-25T00:00:00", - "2022-08-26T00:00:00", - "2022-08-29T00:00:00", - "2022-08-30T00:00:00", - "2022-08-31T00:00:00", - "2022-09-01T00:00:00", - "2022-09-02T00:00:00", - "2022-09-06T00:00:00", - "2022-09-07T00:00:00", - "2022-09-14T00:00:00", - "2022-09-15T00:00:00", - "2022-10-27T00:00:00", - "2022-10-28T00:00:00", - "2022-10-31T00:00:00", - "2022-11-01T00:00:00", - "2022-11-02T00:00:00", - "2022-11-03T00:00:00", - "2022-11-04T00:00:00", - "2022-11-14T00:00:00", - "2022-11-15T00:00:00", - "2022-11-16T00:00:00", - "2022-11-17T00:00:00", - "2022-11-18T00:00:00", - "2022-11-21T00:00:00", - "2022-11-22T00:00:00", - "2022-11-23T00:00:00", - "2022-11-25T00:00:00", - "2022-11-28T00:00:00", - "2022-11-29T00:00:00", - "2022-11-30T00:00:00", - "2022-12-01T00:00:00", - "2022-12-02T00:00:00", - "2022-12-05T00:00:00", - "2022-12-06T00:00:00", - "2022-12-07T00:00:00", - "2022-12-08T00:00:00", - "2022-12-09T00:00:00", - "2022-12-12T00:00:00", - "2022-12-13T00:00:00", - "2022-12-14T00:00:00", - "2022-12-15T00:00:00", - "2022-12-16T00:00:00", - "2022-12-19T00:00:00", - "2022-12-20T00:00:00", - "2022-12-21T00:00:00", - "2022-12-22T00:00:00", - "2022-12-23T00:00:00", - "2022-12-27T00:00:00", - "2022-12-28T00:00:00", - "2022-12-29T00:00:00", - "2022-12-30T00:00:00", - "2023-01-02T00:00:00", - "2023-01-03T00:00:00", - "2023-01-05T00:00:00", - "2023-01-06T00:00:00", - "2023-01-09T00:00:00", - "2023-01-10T00:00:00", - "2023-01-11T00:00:00", - "2023-01-12T00:00:00", - "2023-01-13T00:00:00", - "2023-01-17T00:00:00", - "2023-01-18T00:00:00", - "2023-01-19T00:00:00", - "2023-01-20T00:00:00", - "2023-01-23T00:00:00", - "2023-01-24T00:00:00", - "2023-01-25T00:00:00", - "2023-01-26T00:00:00", - "2023-01-27T00:00:00", - "2023-01-30T00:00:00", - "2023-01-31T00:00:00", - "2023-02-01T00:00:00", - "2023-02-02T00:00:00", - "2023-02-03T00:00:00", - "2023-02-06T00:00:00", - "2023-02-07T00:00:00", - "2023-02-08T00:00:00", - "2023-02-09T00:00:00", - "2023-02-10T00:00:00", - "2023-02-13T00:00:00", - "2023-02-14T00:00:00", - "2023-02-15T00:00:00", - "2023-02-16T00:00:00", - "2023-02-17T00:00:00", - "2023-02-21T00:00:00", - "2023-02-22T00:00:00", - "2023-02-23T00:00:00", - "2023-02-24T00:00:00", - "2023-02-27T00:00:00", - "2023-02-28T00:00:00", - "2023-03-01T00:00:00", - "2023-03-02T00:00:00", - "2023-03-03T00:00:00", - "2023-03-06T00:00:00", - "2023-03-07T00:00:00", - "2023-03-08T00:00:00", - "2023-03-09T00:00:00", - "2023-03-10T00:00:00", - "2023-03-13T00:00:00", - "2023-03-14T00:00:00", - "2023-03-15T00:00:00", - "2023-03-16T00:00:00", - "2023-03-17T00:00:00", - "2023-03-20T00:00:00", - "2023-03-21T00:00:00", - "2023-03-22T00:00:00", - "2023-03-23T00:00:00", - "2023-03-24T00:00:00", - "2023-03-27T00:00:00", - "2023-03-28T00:00:00", - "2023-03-29T00:00:00", - "2023-03-30T00:00:00", - "2023-03-31T00:00:00", - "2023-04-03T00:00:00", - "2023-04-04T00:00:00", - "2023-04-05T00:00:00", - "2023-04-06T00:00:00", - "2023-04-07T00:00:00", - "2023-04-10T00:00:00", - "2023-04-11T00:00:00", - "2023-04-12T00:00:00", - "2023-04-13T00:00:00", - "2023-04-14T00:00:00", - "2023-04-17T00:00:00", - "2023-04-18T00:00:00", - "2023-04-19T00:00:00", - "2023-04-20T00:00:00", - "2023-04-21T00:00:00", - "2023-04-24T00:00:00", - "2023-04-25T00:00:00", - "2023-04-26T00:00:00", - "2023-04-27T00:00:00", - "2023-04-28T00:00:00", - "2023-05-01T00:00:00", - "2023-05-02T00:00:00", - "2023-05-03T00:00:00", - "2023-05-04T00:00:00", - "2023-05-05T00:00:00", - "2023-05-08T00:00:00", - "2023-05-09T00:00:00", - "2023-05-10T00:00:00", - "2023-05-11T00:00:00", - "2023-05-12T00:00:00", - "2023-05-15T00:00:00", - "2023-05-16T00:00:00", - "2023-05-17T00:00:00", - "2023-05-18T00:00:00", - "2023-05-19T00:00:00", - "2023-05-22T00:00:00", - "2023-05-23T00:00:00", - "2023-05-24T00:00:00", - "2023-05-25T00:00:00", - "2023-05-26T00:00:00", - "2023-05-30T00:00:00", - "2023-05-31T00:00:00", - "2023-06-01T00:00:00", - "2023-06-02T00:00:00", - "2023-06-05T00:00:00", - "2023-06-06T00:00:00", - "2023-06-07T00:00:00", - "2023-06-08T00:00:00", - "2023-06-09T00:00:00", - "2023-06-12T00:00:00", - "2023-06-13T00:00:00", - "2023-06-14T00:00:00", - "2023-06-15T00:00:00", - "2023-06-16T00:00:00", - "2023-06-19T00:00:00", - "2023-06-20T00:00:00", - "2023-06-21T00:00:00", - "2023-06-22T00:00:00", - "2023-06-23T00:00:00", - "2023-06-26T00:00:00", - "2023-06-27T00:00:00", - "2023-06-28T00:00:00", - "2023-06-29T00:00:00", - "2023-06-30T00:00:00", - "2023-07-03T00:00:00", - "2023-07-05T00:00:00", - "2023-07-06T00:00:00", - "2023-07-07T00:00:00", - "2023-07-10T00:00:00", - "2023-07-11T00:00:00", - "2023-07-12T00:00:00", - "2023-07-13T00:00:00", - "2023-07-14T00:00:00", - "2023-07-17T00:00:00", - "2023-07-18T00:00:00", - "2023-07-19T00:00:00", - "2023-07-20T00:00:00", - "2023-07-21T00:00:00", - "2023-07-24T00:00:00", - "2023-07-25T00:00:00", - "2023-07-26T00:00:00", - "2023-07-27T00:00:00", - "2023-07-28T00:00:00", - "2023-07-31T00:00:00", - "2023-08-01T00:00:00", - "2023-08-02T00:00:00", - "2023-08-03T00:00:00", - "2023-08-04T00:00:00", - "2023-08-07T00:00:00", - "2023-08-08T00:00:00", - "2023-08-09T00:00:00", - "2023-08-10T00:00:00", - "2023-08-11T00:00:00", - "2023-08-14T00:00:00", - "2023-08-15T00:00:00", - "2023-08-16T00:00:00", - "2023-08-17T00:00:00", - "2023-08-18T00:00:00", - "2023-08-21T00:00:00", - "2023-08-22T00:00:00", - "2023-08-23T00:00:00", - "2023-08-24T00:00:00", - "2023-08-25T00:00:00", - "2023-08-28T00:00:00", - "2023-08-29T00:00:00", - "2023-08-30T00:00:00", - "2023-08-31T00:00:00", - "2023-09-01T00:00:00", - "2023-09-05T00:00:00", - "2023-09-06T00:00:00", - "2023-09-07T00:00:00", - "2023-09-08T00:00:00", - "2023-09-11T00:00:00", - "2023-09-12T00:00:00", - "2023-09-13T00:00:00", - "2023-09-14T00:00:00", - "2023-09-15T00:00:00", - "2023-09-18T00:00:00", - "2023-09-19T00:00:00", - "2023-09-20T00:00:00", - "2023-09-21T00:00:00", - "2023-09-22T00:00:00", - "2023-09-25T00:00:00", - "2023-09-26T00:00:00", - "2023-09-27T00:00:00", - "2023-09-28T00:00:00", - "2023-09-29T00:00:00", - "2023-10-02T00:00:00", - "2023-10-03T00:00:00", - "2023-10-04T00:00:00", - "2023-10-05T00:00:00", - "2023-10-06T00:00:00", - "2023-10-09T00:00:00", - "2023-10-10T00:00:00", - "2023-10-11T00:00:00", - "2023-10-12T00:00:00", - "2023-10-13T00:00:00", - "2023-10-16T00:00:00", - "2023-10-17T00:00:00", - "2023-10-18T00:00:00", - "2023-10-19T00:00:00", - "2023-10-20T00:00:00", - "2023-10-23T00:00:00", - "2023-10-24T00:00:00", - "2023-10-25T00:00:00", - "2023-10-26T00:00:00", - "2023-10-27T00:00:00", - "2023-10-30T00:00:00", - "2023-10-31T00:00:00", - "2023-11-01T00:00:00", - "2023-11-02T00:00:00", - "2023-11-03T00:00:00", - "2023-11-06T00:00:00", - "2023-11-07T00:00:00", - "2023-11-08T00:00:00", - "2023-11-09T00:00:00", - "2023-11-10T00:00:00", - "2023-11-13T00:00:00", - "2023-11-14T00:00:00", - "2023-11-15T00:00:00", - "2023-11-16T00:00:00", - "2023-11-17T00:00:00", - "2023-11-20T00:00:00", - "2023-11-21T00:00:00", - "2023-11-22T00:00:00", - "2023-11-23T00:00:00", - "2023-11-24T00:00:00", - "2023-11-27T00:00:00", - "2023-11-28T00:00:00", - "2023-11-29T00:00:00", - "2023-11-30T00:00:00", - "2023-12-01T00:00:00", - "2023-12-04T00:00:00", - "2023-12-05T00:00:00", - "2023-12-06T00:00:00", - "2023-12-07T00:00:00", - "2023-12-08T00:00:00", - "2023-12-11T00:00:00", - "2023-12-12T00:00:00", - "2023-12-13T00:00:00", - "2023-12-14T00:00:00", - "2023-12-15T00:00:00", - "2023-12-18T00:00:00", - "2023-12-19T00:00:00", - "2023-12-20T00:00:00", - "2023-12-21T00:00:00", - "2023-12-22T00:00:00", - "2023-12-25T00:00:00", - "2023-12-26T00:00:00", - "2023-12-27T00:00:00", - "2023-12-28T00:00:00", - "2023-12-29T00:00:00", - "2024-01-01T00:00:00", - "2024-01-02T00:00:00", - "2024-01-04T00:00:00", - "2024-01-05T00:00:00", - "2024-01-08T00:00:00", - "2024-01-09T00:00:00", - "2024-01-10T00:00:00", - "2024-01-11T00:00:00", - "2024-01-12T00:00:00", - "2024-01-15T00:00:00", - "2024-01-16T00:00:00", - "2024-01-17T00:00:00", - "2024-01-18T00:00:00", - "2024-01-19T00:00:00", - "2024-01-22T00:00:00", - "2024-01-23T00:00:00", - "2024-01-24T00:00:00", - "2024-01-25T00:00:00", - "2024-01-26T00:00:00", - "2024-01-29T00:00:00", - "2024-01-30T00:00:00", - "2024-01-31T00:00:00", - "2024-02-01T00:00:00", - "2024-02-02T00:00:00", - "2024-02-05T00:00:00", - "2024-02-06T00:00:00", - "2024-02-07T00:00:00", - "2024-02-08T00:00:00", - "2024-02-09T00:00:00", - "2024-02-12T00:00:00", - "2024-02-13T00:00:00", - "2024-02-14T00:00:00", - "2024-02-15T00:00:00", - "2024-02-16T00:00:00", - "2024-02-20T00:00:00", - "2024-02-21T00:00:00", - "2024-02-22T00:00:00", - "2024-02-23T00:00:00", - "2024-02-26T00:00:00", - "2024-02-27T00:00:00", - "2024-02-28T00:00:00", - "2024-02-29T00:00:00", - "2024-03-01T00:00:00", - "2024-03-04T00:00:00", - "2024-03-05T00:00:00", - "2024-03-06T00:00:00", - "2024-03-07T00:00:00", - "2024-03-08T00:00:00", - "2024-03-11T00:00:00", - "2024-03-12T00:00:00", - "2024-03-13T00:00:00", - "2024-03-14T00:00:00", - "2024-03-15T00:00:00", - "2024-03-18T00:00:00", - "2024-03-19T00:00:00", - "2024-03-20T00:00:00", - "2024-03-21T00:00:00", - "2024-03-22T00:00:00", - "2024-03-25T00:00:00", - "2024-03-26T00:00:00", - "2024-03-27T00:00:00", - "2024-03-28T00:00:00", - "2024-04-01T00:00:00", - "2024-04-02T00:00:00", - "2024-04-03T00:00:00", - "2024-04-04T00:00:00", - "2024-04-05T00:00:00", - "2024-04-08T00:00:00", - "2024-04-09T00:00:00", - "2024-04-10T00:00:00", - "2024-04-11T00:00:00", - "2024-04-12T00:00:00", - "2024-04-15T00:00:00", - "2024-04-16T00:00:00", - "2024-04-17T00:00:00", - "2024-04-18T00:00:00", - "2024-04-19T00:00:00", - "2024-04-22T00:00:00", - "2024-04-23T00:00:00", - "2024-04-24T00:00:00", - "2024-04-25T00:00:00", - "2024-04-26T00:00:00", - "2024-04-29T00:00:00", - "2024-04-30T00:00:00", - "2024-05-01T00:00:00", - "2024-05-02T00:00:00", - "2024-05-03T00:00:00", - "2024-05-06T00:00:00", - "2024-05-07T00:00:00", - "2024-05-08T00:00:00", - "2024-05-09T00:00:00", - "2024-05-10T00:00:00", - "2024-05-13T00:00:00", - "2024-05-14T00:00:00", - "2024-05-15T00:00:00", - "2024-05-16T00:00:00", - "2024-05-17T00:00:00", - "2024-05-20T00:00:00", - "2024-05-21T00:00:00", - "2024-05-22T00:00:00", - "2024-05-23T00:00:00", - "2024-05-24T00:00:00", - "2024-05-28T00:00:00", - "2024-05-29T00:00:00", - "2024-05-30T00:00:00", - "2024-05-31T00:00:00", - "2024-06-03T00:00:00", - "2024-06-04T00:00:00", - "2024-06-05T00:00:00", - "2024-06-06T00:00:00", - "2024-06-07T00:00:00", - "2024-06-10T00:00:00", - "2024-06-11T00:00:00", - "2024-06-12T00:00:00", - "2024-06-13T00:00:00", - "2024-06-14T00:00:00", - "2024-06-17T00:00:00", - "2024-06-18T00:00:00", - "2024-06-20T00:00:00", - "2024-06-21T00:00:00", - "2024-06-24T00:00:00", - "2024-06-25T00:00:00", - "2024-06-26T00:00:00", - "2024-06-27T00:00:00", - "2024-06-28T00:00:00", - "2024-07-01T00:00:00", - "2024-07-02T00:00:00", - "2024-07-03T00:00:00", - "2024-07-05T00:00:00", - "2024-07-08T00:00:00", - "2024-07-09T00:00:00", - "2024-07-10T00:00:00", - "2024-07-11T00:00:00", - "2024-07-12T00:00:00", - "2024-07-15T00:00:00", - "2024-07-16T00:00:00", - "2024-07-17T00:00:00", - "2024-07-18T00:00:00", - "2024-07-19T00:00:00", - "2024-07-22T00:00:00", - "2024-07-23T00:00:00", - "2024-07-24T00:00:00", - "2024-07-25T00:00:00", - "2024-07-26T00:00:00", - "2024-07-29T00:00:00", - "2024-07-30T00:00:00", - "2024-07-31T00:00:00", - "2024-08-01T00:00:00", - "2024-08-02T00:00:00", - "2024-08-05T00:00:00", - "2024-08-06T00:00:00", - "2024-08-07T00:00:00", - "2024-08-08T00:00:00", - "2024-08-09T00:00:00", - "2024-08-12T00:00:00", - "2024-08-13T00:00:00", - "2024-08-14T00:00:00", - "2024-08-15T00:00:00", - "2024-08-16T00:00:00", - "2024-08-19T00:00:00", - "2024-08-20T00:00:00", - "2024-08-21T00:00:00", - "2024-08-22T00:00:00", - "2024-08-23T00:00:00", - "2024-08-26T00:00:00", - "2024-08-27T00:00:00", - "2024-08-28T00:00:00", - "2024-08-29T00:00:00", - "2024-08-30T00:00:00", - "2024-09-03T00:00:00", - "2024-09-04T00:00:00", - "2024-09-05T00:00:00", - "2024-09-06T00:00:00", - "2024-09-09T00:00:00", - "2024-09-10T00:00:00", - "2024-09-11T00:00:00", - "2024-09-12T00:00:00", - "2024-09-13T00:00:00", - "2024-09-16T00:00:00", - "2024-09-17T00:00:00", - "2024-09-18T00:00:00", - "2024-09-19T00:00:00", - "2024-09-20T00:00:00", - "2024-09-23T00:00:00", - "2024-09-24T00:00:00", - "2024-09-25T00:00:00", - "2024-09-26T00:00:00", - "2024-09-27T00:00:00", - "2024-09-30T00:00:00", - "2024-10-01T00:00:00", - "2024-10-02T00:00:00", - "2024-10-03T00:00:00", - "2024-10-04T00:00:00", - "2024-10-07T00:00:00", - "2024-10-08T00:00:00", - "2024-10-09T00:00:00", - "2024-10-10T00:00:00", - "2024-10-11T00:00:00", - "2024-10-14T00:00:00", - "2024-10-15T00:00:00", - "2024-10-16T00:00:00", - "2024-10-17T00:00:00", - "2024-10-18T00:00:00", - "2024-10-21T00:00:00", - "2024-10-22T00:00:00", - "2024-10-23T00:00:00", - "2024-10-24T00:00:00", - "2024-10-25T00:00:00", - "2024-10-28T00:00:00", - "2024-10-29T00:00:00", - "2024-10-30T00:00:00", - "2024-10-31T00:00:00", - "2024-11-01T00:00:00", - "2024-11-04T00:00:00", - "2024-11-05T00:00:00", - "2024-11-06T00:00:00", - "2024-11-07T00:00:00", - "2024-11-08T00:00:00", - "2024-11-11T00:00:00", - "2024-11-12T00:00:00", - "2024-11-13T00:00:00", - "2024-11-14T00:00:00", - "2024-11-15T00:00:00", - "2024-11-18T00:00:00", - "2024-11-19T00:00:00", - "2024-11-20T00:00:00", - "2024-11-21T00:00:00", - "2024-11-22T00:00:00", - "2024-11-25T00:00:00", - "2024-11-26T00:00:00", - "2024-11-27T00:00:00", - "2024-11-28T00:00:00", - "2024-11-29T00:00:00", - "2024-12-02T00:00:00", - "2024-12-03T00:00:00", - "2024-12-04T00:00:00", - "2024-12-05T00:00:00", - "2024-12-06T00:00:00", - "2024-12-09T00:00:00", - "2024-12-10T00:00:00", - "2024-12-11T00:00:00", - "2024-12-12T00:00:00", - "2024-12-13T00:00:00", - "2024-12-16T00:00:00", - "2024-12-17T00:00:00", - "2024-12-18T00:00:00", - "2024-12-19T00:00:00", - "2024-12-20T00:00:00", - "2024-12-23T00:00:00", - "2024-12-24T00:00:00", - "2024-12-25T00:00:00", - "2024-12-26T00:00:00", - "2024-12-27T00:00:00", - "2024-12-30T00:00:00", - "2024-12-31T00:00:00", - "2025-01-01T00:00:00", - "2025-01-02T00:00:00", - "2025-01-06T00:00:00", - "2025-01-07T00:00:00", - "2025-01-08T00:00:00", - "2025-01-09T00:00:00", - "2025-01-10T00:00:00", - "2025-01-13T00:00:00", - "2025-01-14T00:00:00", - "2025-01-15T00:00:00", - "2025-01-16T00:00:00", - "2025-01-17T00:00:00", - "2025-01-21T00:00:00", - "2025-01-22T00:00:00", - "2025-01-23T00:00:00", - "2025-01-24T00:00:00", - "2025-01-27T00:00:00", - "2025-01-28T00:00:00", - "2025-01-29T00:00:00", - "2025-01-30T00:00:00", - "2025-01-31T00:00:00", - "2025-02-03T00:00:00", - "2025-02-04T00:00:00", - "2025-02-05T00:00:00", - "2025-02-06T00:00:00", - "2025-02-07T00:00:00", - "2025-02-10T00:00:00", - "2025-02-11T00:00:00", - "2025-02-12T00:00:00", - "2025-02-13T00:00:00", - "2025-02-14T00:00:00", - "2025-02-18T00:00:00", - "2025-02-19T00:00:00", - "2025-02-20T00:00:00", - "2025-02-21T00:00:00", - "2025-02-24T00:00:00", - "2025-02-25T00:00:00", - "2025-02-26T00:00:00", - "2025-02-27T00:00:00", - "2025-02-28T00:00:00", - "2025-03-03T00:00:00" - ], - "xaxis": "x", - "y": [ - 0, - -0.002572562618816887, - 0, - 0, - -0.015582816091641472, - -0.044007255586854366, - -0.032672053390240374, - -0.014767866914107142, - -0.08195431156833788, - -0.10104387866633946, - -0.008422270997335612, - -0.03916808087704016, - -0.05013285162932046, - 0, - 0, - 0, - -0.01846889360513837, - -0.03619904068741164, - -0.01905738791382383, - 0, - -0.014497326237660868, - 0, - 0, - 0, - 0, - -0.011313526965736731, - -0.012989605034735119, - -0.026293474707407172, - 0, - -0.01687904681813468, - -0.014077372579949232, - 0, - -0.004759037703105151, - -0.055997486419283815, - -0.0695131402144964, - -0.054081087746828405, - -0.06921055095042461, - -0.042078380271975635, - -0.08101153224922941, - -0.09432545986839358, - -0.09876343574144841, - -0.09644358471689718, - -0.1303679162975504, - -0.10071416841850211, - -0.12956101159335864, - -0.0952700847018978, - -0.08024148458632596, - -0.0673310093192575, - -0.06854136637554487, - -0.05704439389241167, - -0.024062164108572315, - -0.07590579135289477, - -0.06773588122295271, - -0.08326879677864496, - -0.06541603019840148, - -0.05785129859660332, - -0.010143057961264024, - 0, - 0, - 0, - 0, - -0.02092225165223094, - -0.05397718840053256, - -0.06114912850829002, - -0.06379751858823868, - -0.039565004699272155, - -0.06991880317125732, - -0.0833273313054893, - -0.09616729771147448, - -0.037694455456542375, - -0.06616049947167446, - -0.06905596424269, - -0.047625347223185455, - -0.029611281164587, - -0.01655254072081247, - 0, - -0.016341261307270427, - 0, - 0, - 0, - -0.011932123275175455, - 0, - -0.038921112581401296, - -0.01672466936199901, - -0.009347278221878974, - 0, - 0, - 0, - 0, - 0, - 0, - -0.09706265071402287, - -0.04615800662481895, - -0.014392048209320163, - -0.008671741521471543, - -0.00725687843112599, - 0, - 0, - 0, - null, - 0, - -0.003525608679916803, - 0, - 0, - 0, - -0.00118691561356421, - 0, - 0, - -0.09839499998020329, - -0.09302214028098277, - -0.03642481165250033, - -0.05012825144954047, - -0.05212864790080185, - -0.06039951784351649, - -0.025879856005086355, - -0.038803830411696105, - -0.004066176652295916, - -0.008131084825691692, - -0.008413192017536542, - -0.0398947572937659, - -0.13192640666051014, - -0.07737713420111914, - -0.14620604084362532, - -0.17736606248827036, - -0.21417655002552316, - -0.23553975828065854, - -0.25173527570336895, - -0.22580706016202234, - -0.16818025470069076, - -0.13318613985779515, - -0.07181500257743634, - -0.09479391565859052, - -0.0645828000228773, - -0.048451397871040025, - 0, - 0, - 0, - 0, - 0, - -0.011436769013190684, - 0, - -0.05318866907936182, - -0.04242466560383307, - -0.06159472388614473, - -0.07556277709584447, - -0.030993569111476993, - -0.05689905327676292, - -0.006618863555957755, - 0, - 0, - -0.0014880486749664357, - -0.10370554611687888, - -0.09706655972087552, - -0.03534101789279176, - -0.03803864716304106, - -0.0323670002332308, - -0.10891792314712168, - -0.13650405627534234, - -0.1480993894118101, - -0.099260665092751, - -0.0805165800108193, - -0.09133046403313705, - -0.10856454547156769, - -0.10322876154572025, - -0.09204550342693563, - -0.05089812480346001, - -0.018830839849373504, - -0.021731141741761828, - -0.05784493843036598, - -0.06390015188465148, - -0.04502482676911801, - -0.08437053869076183, - -0.007117919403475614, - -0.0062893935515508925, - -0.008407001281310444, - 0, - 0, - 0, - -0.03558282239127919, - -0.04537809372370982, - -0.06559833240279889, - -0.17580029637080652, - -0.2616488529771813, - -0.2143217001618145, - -0.17979882518626678, - -0.18655556337067825, - -0.18972403379147473, - -0.19517120317511805, - -0.17993855673570436, - -0.15673975595757017, - -0.11204133412223405, - -0.09832384195504573, - -0.09861370202508724, - -0.06298090375966436, - -0.059699434152286845, - -0.0240366503623759, - -0.00019815839518455558, - 0, - -0.007767993051188582, - -0.01992586698578669, - -0.04834790537849931, - -0.048084648951226105, - -0.06749307757623324, - -0.02251788266770216, - -0.08897378111718113, - -0.05839027075807823, - -0.004246343114190476, - 0, - 0, - -0.006636141803889162, - -0.004193824121844436, - 0, - -0.0058128987244236985, - 0, - -0.02043365588870205, - -0.03818275160912299, - -0.019376571341313653, - -0.02259015833770217, - -0.010942157297349375, - -0.06555495245445309, - -0.019706630068529463, - -0.0549406914602093, - -0.02933605586852428, - -0.00753134084226903, - -0.008227213554754531, - 0, - -0.01506565242606317, - -0.04811348909294055, - -0.12819289030718695, - -0.0577118380878644, - -0.13256847979440878, - -0.14347688552203353, - -0.21544266870508455, - -0.21225486398884497, - -0.17151209960183889, - -0.1656014994144458, - -0.15966257555953378, - -0.18437897924982882, - -0.19948830023364916, - -0.17408144088534383, - -0.16713814020202777, - -0.10364405722377823, - -0.12147100626274299, - -0.13653665868880704, - -0.128606448600189, - -0.14614217406531027, - -0.15719905288930802, - -0.16851794305984613, - -0.1369979780710563, - -0.1624309503862743, - -0.1624309503862743, - -0.11253180538413321, - -0.11854605243276883, - -0.09518337403293131, - -0.055008300896761786, - -0.04248366860225028, - -0.010605621439854995, - 0, - 0, - -0.0006363584730095795, - -0.031180283901157013, - 0, - -0.15225772882820454, - -0.045024895434482626, - 0, - 0, - 0, - -0.019373792438588167, - 0, - 0, - -0.026612649167157, - -0.012294424249875702, - -0.07958085230268075, - -0.06248072549078931, - -0.0860873384874673, - -0.10118080431187182, - -0.1069555580077921, - -0.15725796393774893, - -0.1181342074386279, - -0.10175262874643487, - -0.08724982266079007, - -0.03573453700766516, - -0.0025428876252922006, - 0, - 0, - -0.01013805644463106, - 0, - 0, - 0, - -0.002405967926898289, - -0.01881886988508863, - -0.08299268769479662, - -0.03551475291152506, - -0.00545587499575706, - 0, - -0.03314858432988077, - -0.06736860322833527, - -0.02400741709594789, - -0.053716210606226555, - -0.036962106066973144, - -0.01461621905352628, - -0.05519944007845834, - -0.060749434470488306, - -0.1062712601308955, - -0.07481324631216424, - -0.036645905199057194, - -0.12320247554119834, - -0.3056696708470936, - -0.08369957428027697, - -0.09717359368605571, - -0.26616647105621905, - -0.06565437419762665, - -0.3054022602875779, - -0.2487448309058351, - -0.2279991299431121, - -0.2157416556976124, - -0.29204665880943004, - -0.2834100365202279, - -0.20330610676573713, - -0.19190932683771766, - -0.1113898894816836, - -0.14059413804723342, - -0.1719056037348915, - -0.03980551140236477, - -0.05793488269039526, - -0.09160963962010071, - -0.1048168455262688, - -0.1698734642820473, - -0.260563537442259, - -0.2066959448137301, - -0.18066257017382137, - -0.17055029197008864, - -0.17162976391191453, - -0.1514776452371096, - -0.16599508046722122, - -0.2192987699222294, - -0.15146431323302456, - -0.09249191292840298, - -0.09228415912763199, - -0.07200953936777854, - -0.05090768903230458, - -0.1142044327132955, - -0.0988784218739075, - -0.12440609240997913, - -0.11615529860792428, - -0.11823654301329001, - -0.13171253258680404, - -0.1085331442436187, - -0.11823821465107254, - -0.043927284126215715, - -0.029384611657120363, - -0.018051802519865157, - -0.01817105969050059, - -0.029656876961707934, - -0.017043253343458353, - -0.01481731976376588, - 0, - 0, - 0, - 0, - -0.025364290287203106, - -0.04029058907938421, - -0.03674786736885194, - -0.008323902799365124, - 0, - 0, - -0.023886062187684076, - -0.013505229620209391, - 0, - 0, - -0.023471837749236557, - -0.04340112667417029, - -0.1693218147734954, - -0.10995546011440882, - -0.14294764430106444, - -0.10691702110664647, - -0.1018449811881752, - -0.10667777394068023, - -0.14679952367311022, - -0.1061992796087492, - -0.06141221013998954, - -0.020429170610083536, - -0.042128888563163325, - -0.027329161465357132, - -0.018572715191016664, - -0.05014449986408587, - -0.0266303211626, - -0.09895473943399968, - -0.11957784514023384, - -0.1560391132333906, - -0.17264286655140293, - -0.17393480124761684, - -0.18827428442392413, - -0.15123882313244996, - -0.19359956200318063, - -0.2154863848098093, - -0.30936230826209543, - -0.31527171326144576, - -0.2956055962190739, - -0.2645752387933368, - -0.2678050755338721, - -0.22237189859170015, - -0.21674959019150875, - -0.21720415980684304, - -0.21006251444775126, - -0.20649773167486363, - -0.2177516539024339, - -0.22191455459023546, - -0.2829233815875667, - -0.29301749846878733, - -0.3321655203511199, - -0.307449130305407, - -0.28553408990295814, - -0.27693212230324193, - -0.26810390187911115, - -0.24999289141551584, - -0.24757649503926338, - -0.23139283073167483, - -0.1999079036906024, - -0.20689392093679781, - -0.1966780669500665, - null, - -0.21218128330463704, - -0.25749469653852175, - -0.25680087975722055, - -0.2678780235414271, - -0.24845115366502135, - -0.23485165641929784, - -0.21322371261600825, - -0.2257602641126054, - -0.20434764275868544, - -0.2783655057766603, - -0.23587520910117166, - -0.250262230396331, - -0.2544490558007292, - -0.29701112662600815, - -0.2375464488121276, - -0.25264294498455686, - -0.24951996048010094, - -0.2094838775647806, - -0.2101380849271991, - -0.15238279598361448, - -0.17479518651607473, - -0.17704396044420656, - -0.2024110951435617, - -0.2813383451628034, - -0.31025854258472463, - -0.29980344143202753, - -0.387946882317072, - -0.4522948000751782, - -0.3812938691153478, - -0.4360671152915109, - -0.37459016352499175, - -0.3732408095089458, - -0.3929547759845108, - -0.399629614071333, - -0.36969979360903793, - -0.4049743957590055, - -0.4152668088388459, - -0.3943069588581667, - -0.4382289309526137, - -0.440875822422222, - -0.46053972866305226, - -0.45120908919039404, - -0.45582655949353, - -0.4693918738037792, - -0.46338676993804284, - -0.46053972866305226, - -0.4565203762748302, - -0.45575478534374037, - -0.4593913422664174, - -0.47643377367659634, - -0.4694956058635943, - -0.4670792094873416, - -0.48136737866899626, - -0.47069695506693054, - -0.473304749175956, - -0.47588861856838416, - -0.47660636006628065, - -0.48782597908404324, - -0.47796899584626085, - -0.4759593196521499, - -0.48251469199960717, - -0.4777297486802954, - -0.4775383509475225, - -0.4754808253202184, - -0.47524157815425316, - -0.4772512543483639, - -0.47605501851853604, - -0.4755765241866048, - -0.4751458792878669, - -0.47385394459165264, - -0.47165287066476935, - -0.4759593196521499, - -0.48002652147356495, - -0.4825625414328004, - -0.48165340220213115, - -0.48530909889808516, - -0.4862278080153932, - -0.4853473784446398, - -0.48210318687414633, - -0.4877834843504546, - -0.48738154911163234, - -0.4869796138728102, - -0.4869796138728102, - -0.4882705501103316, - -0.48851936716293587, - -0.4899548501587294, - -0.48947635582679827, - -0.4870838841671423, - -0.48851936716293587, - -0.4880408728310046, - -0.48756237849907347, - -0.4856484011713488, - -0.4846914125074864, - -0.4645946505663764, - -0.483734423843624, - -0.4842129181755551, - -0.4822989408478304, - -0.46985808821761954, - -0.48320117054931044, - -0.4753538635056389, - -0.4668366643972638, - -0.46291301087542813, - -0.47009042585439587, - -0.46530548253508397, - -0.4702856211160181, - -0.4631082061370503, - -0.46308226986853007, - -0.46494839776306174, - -0.4649005483298686, - -0.46499039091203453, - -0.4602532970259158, - -0.45762157820029425, - -0.4597269532607915, - -0.457525879333908, - -0.4532672797797205, - -0.45321943034652734, - -0.44642481083310437, - -0.4459463165011732, - -0.4460369889429543, - -0.447185375339589, - -0.45118080301121455, - -0.4555351014317883, - -0.45749692819270626, - -0.4613727322813489, - -0.4713971885353072, - -0.47831143163171297, - -0.4790530978462063, - -0.47912492474686574, - -0.4825557291068123, - -0.47781863522069346, - -0.4748089058728464, - -0.45551063324469865, - -0.46330052096853847, - -0.4874145731425359, - -0.47934715870617584, - -0.4844000588513693, - -0.47849065385201905, - -0.4808257061918435, - -0.4776341489978624, - -0.4783404066317928, - -0.46310036215978445, - -0.47214390503328385, - -0.4721391582854585, - -0.47029695510752345, - -0.47709178013639486, - -0.48199634703868954, - -0.47997343924612146, - -0.4873968966036808, - -0.48627243492364236, - -0.4906745827774094, - -0.4812243197217684, - -0.4858896394580975, - -0.4786937660334628, - -0.4787285893192086, - -0.47808006107002154, - -0.46317496263036506, - -0.46219404924990615, - -0.4530398154782458, - -0.4594994889593168, - -0.46195894982544317, - -0.46708362412042614, - -0.4539776643688309, - -0.4603129293235998, - -0.44545559248694133, - -0.4531509722271524, - -0.4467343632359554, - -0.470127951124071, - -0.4820950943656701, - -0.4815687506005458, - -0.5117952375486391, - -0.51644620245501, - -0.5004885144551933, - -0.4918282027645696, - -0.4919478263475524, - -0.5056806136739777, - -0.4993644884924858, - -0.4957279315698089, - -0.5032163678645319, - -0.5051303451922567, - -0.47185106440644253, - -0.5136622084814545, - -0.5069154384012249, - -0.5183131733878257, - -0.518408872254212, - -0.5102314041215079, - -0.5067036535978817, - -0.5049571492863328, - -0.496152853578799, - -0.5115842957835799, - -0.4921335011905771, - -0.497334057821057, - -0.48934320247780605, - -0.5154053485547729, - -0.48887738203201403, - -0.48113745791581897, - -0.48307546001349655, - -0.47675933483200483, - -0.47606551805070474, - -0.48034804232148876, - -0.49719104280546667, - -0.4844152441429038, - -0.48455879244248323, - -0.480659063637244, - -0.47923710798919117, - -0.4722989401761889, - -0.47700443384891034, - -0.4770519428548953, - -0.46552022945535343, - -0.46384216865985084, - -0.4576456670613419, - -0.43496503572780343, - -0.4363048198572108, - -0.4608263858042143, - -0.453720744975036, - -0.43876353694546644, - -0.45531944083028564, - -0.4378783224313937, - -0.457472665323976, - -0.4270643505297489, - -0.44797455283514176, - -0.4441944476128855, - -0.42516664200931, - -0.44143544929497014, - -0.48923703305489585, - -0.42358761071393713, - -0.48179839785884004, - -0.4844994173801205, - -0.5426986829729108, - -0.532726861095465, - -0.5578956629550458, - -0.5160428347350218, - -0.5246607724493446, - -0.5365992060310276, - -0.5403553865366875, - -0.5146123914787896, - -0.5492075316774145, - -0.5289432967201286, - -0.48351025990326224, - -0.5179379270857114, - -0.5289432967201286, - -0.5099363440516711, - -0.5031656492548449, - -0.5066347331613459, - -0.5325452012354199, - -0.5113239776142716, - -0.5207227858906547, - -0.5097680050675242, - -0.5176153121111956, - -0.5304389602069515, - -0.5112513374965109, - -0.5104139724156314, - -0.5069688132257267, - -0.5065620930435852, - -0.5192661175563584, - -0.48347474152790526, - -0.5222088576977351, - -0.5148443899983284, - -0.5677658631099178, - -0.553745979184334, - -0.5367115809675838, - -0.5425970612503375, - -0.5661753717882207, - -0.5559595178014898, - -0.5565969931794528, - -0.5408210350556815, - -0.5874263829857792, - -0.5092021296016684, - -0.5760430028291363, - -0.5765406369343447, - -0.5701192429998281, - -0.5658251727164352, - -0.5515421169082892, - -0.5548959302951453, - -0.5329855777462698, - -0.5502496532423471, - -0.5493451014239441, - -0.5548238615245563, - -0.5480531667277299, - -0.5230757626009217, - -0.536258281445626, - -0.5278367812036371, - -0.5388421508380545, - -0.5306598977620312, - -0.525779255576333, - -0.5287698451509029, - -0.528434899118551, - -0.5258271050095261, - -0.5065198587161026, - -0.529535436081993, - -0.5158265734721643, - -0.5155735617125645, - -0.524861136695349, - -0.4951609935123801, - -0.4737601954367717, - -0.5013693183892012, - -0.48716282167416436, - -0.4797676297082135, - -0.5028071317907001, - -0.4925960627472885, - -0.47537505174108485, - -0.5211151124147264, - -0.5237324764103901, - -0.4810890615486826, - -0.47620363441966507, - -0.4775960529255848, - -0.49453634260537505, - -0.49559381507894285, - -0.47449221504077754, - -0.4490260903184743, - -0.4803196145638322, - null, - -0.49746406647692665, - -0.5313558200076127, - -0.5076033613705484, - -0.5156277113170344, - -0.4790898841307688, - -0.4850040740734385, - -0.49561041652790494, - -0.496299448365886, - -0.4171995503543412, - -0.4690930226629131, - -0.4872326527833244, - -0.46471949446596184, - -0.4878966676977735, - -0.4403056214438974, - -0.4318350979794938, - -0.40826446718856346, - -0.4237150491666214, - -0.39524942136003527, - -0.3968140978254501, - -0.42019836344117967, - -0.41882508470853697, - -0.42796466827655977, - -0.42796466827655977, - -0.38352613463010976, - -0.3897087787833099, - -0.40188645953095914, - -0.3947808187017807, - -0.37872801515926113, - -0.3755231932488894, - -0.3355258520427613, - -0.35402351643231234, - -0.36766538983567065, - -0.3550926025532032, - -0.34006256149371616, - -0.3279538561238229, - -0.34120814911831654, - -0.3355858407181256, - -0.3514240031050475, - -0.3990025712292238, - -0.336487286762414, - -0.3837003224940645, - -0.3493426750265809, - -0.3691342965903014, - -0.37584278712397623, - -0.3407379606769094, - -0.3155905278748985, - -0.34224086116519326, - -0.2922382034783845, - -0.2065159439129115, - -0.19754417518920198, - -0.3094738741774783, - -0.19470700866378265, - -0.095113803160363, - -0.13499630572682841, - -0.10726755919141528, - -0.01917675268288399, - -0.12803421319723018, - -0.27122081063912595, - -0.2643783416925095, - -0.22552460193969648, - -0.3920597692250274, - -0.21001181569848748, - -0.22551197633120668, - -0.3854487067792072, - -0.207235657433263, - -0.23833778900879043, - -0.11414458515605008, - -0.32546780809200193, - -0.24441086826285907, - -0.25900494538675944, - -0.4907780298875891, - -0.08380267210123005, - -0.6397891610886752, - -0.44825013122198876, - -0.4437946778020684, - -0.4575510266362288, - -0.3344050833049764, - -0.4286728358736618, - -0.10629443661750337, - -0.2606438520591631, - 0, - -0.18256228637666505, - 0, - -0.07783443794232614, - -0.2113946991585387, - -0.08372851540398674, - -0.17696210434298631, - -0.06357682763981243, - -0.07958169410685034, - -0.06483485207826833, - 0, - -0.03021733271285698, - 0, - -0.13488906483831187, - 0, - -0.0163250404404941, - 0, - -0.024818265970458442, - -0.09998405094523788, - -0.04821093887488159, - 0, - 0, - -0.13156445267755335, - -0.10833264888087502, - -0.06650794998468923, - -0.16601161003124976, - -0.12265923839141768, - -0.18015189798768783, - -0.08176604726574666, - -0.07399001698320673, - -0.05075821318652762, - -0.022850107210780846, - -0.10044470449479781, - -0.12893635722765695, - -0.07826233451156428, - -0.028966943295836156, - 0, - -0.08318436442335764, - -0.01863316945769844, - -0.08545389634697043, - -0.10174790609630602, - -0.11422876508817714, - -0.20471899818970163, - -0.1567181592427861, - -0.1429876121875444, - -0.15788312274376615, - -0.07022872024758164, - -0.1259519905604538, - -0.20810771465337907, - -0.10755589047753555, - -0.11128893302581144, - -0.0646339119932946, - -0.028522081106381547, - -0.14639174970557634, - -0.1415545768161528, - -0.00524244805769658, - -0.001156929388982153, - 0, - 0, - 0, - 0, - -0.058928515903003076, - -0.11122636476030212, - -0.02013253124232328, - -0.1248224593152234, - -0.07842073859164334, - -0.0293684884090617, - -0.02911272029367218, - 0, - -0.009770745106412848, - -0.04108689999842108, - 0, - 0, - 0, - -0.10982813205377806, - -0.058464868108331514, - -0.09567856122168772, - -0.09238603382307442, - -0.12823089809778432, - -0.021884912133542378, - -0.09739577573253944, - -0.06873189911135513, - -0.14202431597185594, - -0.10203863718525219, - -0.10090859286389253, - -0.07873699847741555, - -0.07377660306213285, - -0.033617776250977616, - -0.010081644025348835, - 0, - 0, - -0.020484107590559075, - -0.010533191576460044, - -0.07829559303341915, - -0.041887409194849456, - -0.13114218479529827, - -0.01919928640000057, - -0.0184338313219925, - -0.033556475875964664, - 0, - 0, - -0.02005104580575623, - -0.041413782169888336, - 0, - 0, - -0.049831631418946754, - 0, - -0.05485592297091069, - -0.06076637056205081, - -0.001694404574301367, - -0.10581233649744082, - 0, - 0, - -0.2506892732963091, - -0.24113858415484957, - -0.22282765774467883, - -0.2997698079276131, - -0.3173410454293337, - -0.2992694301366028, - -0.25968156983041346, - -0.33829889783542977, - -0.30101712647911805, - -0.41983872221402685, - -0.3554930390308799, - -0.294795037425683, - -0.3951606697095489, - -0.34842248328834047, - -0.283438637125355, - -0.2784131036591164, - -0.2660124366645059, - -0.2420740730684745, - -0.09002449126964718, - -0.23553290252511982, - -0.19359544215679547, - -0.17416773053190726, - -0.12814747746301824, - -0.11233844000790416, - -0.1392573147938635, - -0.00929687431993853, - -0.057180853364041107, - -0.0833527873895048, - -0.09088746166283923, - -0.06723192029651137, - -0.17520474537414854, - -0.14663244832223588, - -0.22011546508036062, - -0.2857012149629674, - -0.23286422097306525, - -0.2965789930284157, - -0.2185780724471107, - -0.25893462906992326, - -0.24878203620883665, - -0.35616020941889603, - -0.4284466705898172, - -0.31978636993844645, - -0.32273207223856903, - -0.1312947812499573, - -0.06462125356080606, - -0.2258183215274725, - -0.33950270527467197, - -0.28670922239703234, - -0.27663639990842703, - -0.29034240027089153, - -0.28106002965504306, - -0.3100984862525117, - -0.36521981363615674, - -0.4580870309069096, - -0.308070868421113, - -0.37568713687593736, - -0.3889525614523516, - -0.2948351583558281, - -0.3246228658102509, - -0.2812495387372903, - -0.27908062806311074, - -0.2677242277627816, - -0.2778985761799986, - -0.26793453147204815, - -0.30569492506323925, - -0.2854550060094626, - -0.2683188796303604, - -0.33148251093039416, - -0.39553812003179556, - -0.2582097978815381, - -0.32446271815215955, - -0.2916573309283824, - -0.272468930420932, - -0.35970810459059843, - -0.25333068696256134, - -0.27304847266919896, - -0.3637836454391188, - -0.314842346367056, - -0.31774163681409884, - -0.32073019444335293, - -0.24121363678492758, - -0.185067472260935, - -0.185067472260935, - -0.3560358332697685, - -0.3612375803085186, - -0.33207063138903026, - -0.31089522342162457, - -0.3364942611356432, - -0.32291879410996627, - -0.3149272531578834, - -0.3278065423873747, - -0.3244706904473035, - -0.328662260928522, - -0.3177989865671633, - -0.3056158751338601, - -0.26037882208568386, - -0.27889570109389483, - -0.3514577326424767, - -0.3530023771277686, - -0.2893238643326388, - -0.3314426210020529, - -0.3209201836867399, - -0.2879242568882149, - -0.28305101231489305, - -0.3146400798169584, - -0.29580702005964443, - -0.3030878795114499, - -0.3027470424654014, - -0.3134145168215823, - -0.3225445985445148, - -0.30672105738530864, - -0.3150026724191377, - -0.32816478387833214, - -0.33287848770668904, - -0.34021167729624247, - -0.37233012999748916, - -0.3879796267076461, - -0.3090069579524958, - -0.4209973090623047, - -0.4425063022237141, - -0.40418751602516445, - -0.4200400645925453, - -0.4762636734868223, - -0.49056432571686404, - -0.4957348962239737, - -0.5366326276545762, - -0.5187533342913058, - -0.5162804527444269, - -0.504728252438922, - -0.5041692472600274, - -0.5338570778200793, - -0.5201326177495087, - -0.531234813054404, - -0.5512281691386975, - -0.5424679318699905, - -0.5409016233603624, - -0.5633533572874474, - -0.5822909837343502, - -0.5864245393992199, - -0.5967309695920087, - -0.6185927430952638, - -0.5840884310716636, - -0.5662074518010456, - -0.4319031519529821, - -0.5516602366015209, - -0.5614399107114456, - -0.5502423741508302, - -0.5416199220709522, - -0.568728988188858, - -0.5167767201482794, - -0.4494997954736212, - -0.5121476993663665, - -0.49414800968868655, - -0.498430675102813, - -0.48918880404737997, - -0.43751324841567174, - -0.5555758897335112, - -0.509654261852416, - -0.5060587936091838, - -0.4457412749416849, - -0.5111770381032685, - -0.4847324344409596, - -0.500315941876555, - -0.4927000468603322, - -0.5071500872424731, - -0.5254378077261042, - -0.5600363938262722, - -0.5487684661208774, - -0.5214076532773233, - -0.564793057557736, - -0.5700535510301862, - -0.5854898432902607, - -0.6278747304151451, - -0.5873408890651874, - -0.5758041352864942, - -0.5940874736238894, - -0.5808818510524356, - -0.5605997678577186, - -0.5478104015935693, - -0.5456273426297362, - -0.5425410595497571, - -0.5386323112982393, - -0.5556886673048615, - -0.5389542935289766, - -0.5480597189549608, - -0.539831476652463, - -0.5374644721454216, - -0.518808357577974, - -0.5174290553192753, - -0.5250681562620372, - -0.5191346909199375, - -0.5196450797063334, - -0.5084773529881579, - -0.5199011676198645, - -0.5048216664803362, - -0.512228521209164, - -0.5099731952235944, - -0.49773642008516983, - -0.5013100683973113, - -0.488020311278229, - -0.4866497112419824, - -0.48649928377409646, - -0.4813287132669867, - -0.4681738536598381, - -0.47344595009555834, - -0.4744249501214489, - -0.46680643122773235, - -0.5131966925811695, - -0.513326000774909, - -0.4512936583936814, - -0.49070747425082084, - -0.4706125922379166, - -0.49355020025192453, - -0.4743639331513205, - -0.47424065166657914, - -0.4730005849671176, - -0.44671900293875066, - -0.5107499855808553, - -0.5287857018860234, - -0.6361324665747032, - -0.511600286965728, - -0.5003679319099386, - -0.5571837565532902, - -0.48995937818290436, - -0.495090208540815, - -0.4972657641539042, - -0.4935455640555213, - -0.5404868023339504, - -0.49659544251374843, - -0.4341778315002589, - -0.5196089433617819, - -0.22533603928324164, - -0.510681913496071, - -0.5928018860381585, - -0.44133072499921466, - -0.46558091823311976, - -0.5477134300142252, - -0.4939433371072738, - -0.5765129244760674, - -0.3078535618156354, - -0.5290765036381938, - -0.27715662558519394, - -0.6174062716203605, - -0.3775746961913441, - -0.43206358065819195, - -0.4320635806581917, - -0.4385916760831622, - -0.4448500243968163, - -0.40951722984405514, - -0.3541360914345214, - -0.4695776660165558, - -0.4968039371235239, - -0.46573775353325686, - -0.4065640684264735, - -0.2812278900149262, - -0.3236005186058296, - -0.15698494095270377, - -0.4315618148807395, - -0.40959595504057844, - -0.42308439984173374, - -0.4178848219264497, - -0.5060165798127086, - -0.5213034839206848, - -0.4723969937384309, - -0.4488357129050895, - -0.43768961631402714, - -0.4346075791954833, - -0.4469792387819195, - -0.48268735824476294, - -0.5001135587056105, - -0.5011795809560247, - -0.4973306044530955, - -0.5551786282051472, - -0.5118850715046647, - -0.508135863998107, - -0.4916345773258747, - -0.49081511804494415, - -0.5032375405956857, - -0.516435911315096, - -0.5059967483263944, - -0.4787116112021057, - -0.42823872097842774, - -0.40963991906031005, - -0.4113005931783015, - -0.40414301521123663, - -0.33243852370039007, - -0.38042402867310254, - -0.3413510498620137, - -0.29786681964067196, - -0.2681710182448547, - -0.2836682260620963, - -0.3633736233392755, - -0.16323701063912177, - -0.0945160758035768, - -0.06574188855687402, - -0.10981864527806784, - 0, - -0.015716974183327515, - 0, - -0.12437687684438692, - -0.07123294202259978, - -0.02881481823024512, - -0.05144488602186026, - -0.04926516729964592, - -0.04680281013053322, - -0.04357310495066635, - -0.11814628084292467, - 0, - -0.01619314476260203, - 0, - -0.003339346439643842, - -0.1367351455686442, - -0.1576266397674453, - -0.141962115249892, - -0.12165999951697803, - -0.003081449897915478, - -0.23358611029743825, - -0.30844794429086897, - -0.23237902018772216, - -0.006171376625775937, - -0.21593962909612607, - -0.30635374550368455, - -0.27608704020571784, - -0.27830227730316714, - -0.12213566572166601, - -0.21923613760803562, - -0.408534990994862, - -0.28378723417306384, - -0.24637152475367674, - -0.20675071662172528, - -0.19762129949980634, - -0.10549886523906649, - -0.1525257635297672, - -0.1879442111267392, - -0.20272090709713775, - -0.2441159325840252, - -0.12422379041831644, - -0.22886609798570012, - -0.11893559067384207, - -0.18183509233076034, - -0.1375055227422567, - -0.14588414896535196, - -0.13499045440604251, - -0.2485606418917422, - -0.19061470307951922, - -0.17591911418820383, - -0.2216270086053187, - -0.22116672593152376, - -0.19099590635120867, - -0.2931695353872854, - -0.32753950961049716, - -0.23824061554032883, - -0.2744374687259452, - -0.2412545349961922, - -0.26818887623202703, - -0.2065829804761934, - -0.2289634618792573, - -0.2660598121747557, - -0.22964780285901853, - -0.21003002810586424, - -0.2380423855440884, - -0.18534306091003538, - -0.2134010410802436, - -0.4020611762192938, - -0.3737750823891649, - -0.17391203195180294, - -0.1613455038864099, - -0.30831660037689745, - -0.3194536161734556, - -0.28111531372950094, - -0.3308018626313566, - -0.49382202239535455, - -0.3088614497533756, - -0.2870030919405593, - -0.2969387091282031, - -0.3009129560032605, - -0.2775642556122978, - -0.3098550114721399, - -0.3103517923315221, - -0.2989258325657318, - -0.2969387091282031, - -0.3222745329566946, - -0.32376487553484123, - -0.3401586438944534, - -0.32213081828173673, - -0.32411794171926556, - -0.3156726671097684, - -0.35249668676869306, - -0.38860454453786986, - -0.36674804806924854, - -0.32695713453922504, - -0.2865404631937749, - -0.20278104352420911, - 0, - -0.061620621624350114, - -0.21632730552233237, - -0.25710179178838566, - -0.4793325252123741, - -0.2901265540914155, - -0.36000629720652044, - -0.3074466326465424, - -0.22131829811644144, - -0.09054357416958392, - -0.48096428046321116, - -0.3069978818012159, - -0.3112596117130566, - -0.3306224611652131, - -0.32718076947569863, - -0.321932189649189, - -0.31850483834171417, - -0.3348528738669081, - -0.33800775791562965, - -0.33555555258685055, - -0.35160244008921193, - -0.35184622658388587, - -0.340671190554948, - -0.3445861148517708, - -0.34639300298876585, - -0.3460918549659334, - -0.3503079272855887, - -0.3518136673997513, - -0.35301825949108134, - -0.3541890758509306, - -0.35665173913341597, - -0.3578945722435184, - -0.35603032257836476, - -0.3602791239669667, - -0.36372504997070143, - -0.3707900781888992, - -0.3720042305349224, - -0.3506514016778929, - -0.3637692399209761, - -0.3713505218926011, - -0.3484393715205969, - -0.343319855132444, - -0.34052861752224606, - -0.3422207826029241, - -0.3465754786156292, - -0.35205828468211964, - -0.3592810571027536, - -0.359625226271705, - -0.3577609766065514, - -0.39726872912576994, - -0.37798569540979565, - -0.3767954437005052, - -0.38267022020941255, - -0.38218219660926356, - -0.3844384167168342, - -0.38613058179751214, - -0.38349622405398265, - -0.3870742240451156, - -0.3934129144918218, - -0.39722134318548774, - -0.3899268688546559, - -0.39513720766239313, - -0.3967003093047141, - -0.40764202080096246, - -0.40920512244328344, - -0.40087962442448244, - -0.4047775132466408, - -0.38708148180972024, - -0.391579581642822, - -0.39322872557738087, - -0.40704329360890434, - -0.40297062510964554, - -0.40642665718119986, - -0.40761217262995697, - -0.396139866998242, - -0.40527281870142906, - -0.4033703280175033, - -0.39076035207730986, - -0.40134833414991344, - -0.3906073880022203, - -0.39709593103308816, - -0.3960538632715407, - -0.3951073980569244, - -0.3931188650807603, - -0.3744333472831046, - -0.3994142927961639, - -0.3952125608585485, - -0.3928320574399674, - -0.4036523537016137, - -0.409436307790937, - -0.39065327539541195, - -0.3854955179884866, - -0.37589224214927175, - -0.3927804320646253, - -0.38408060029390834, - -0.39372689727924204, - -0.38420966373226517, - -0.39614086158924877, - -0.3815710334369705, - -0.3815710334369705, - -0.38792018978374965, - -0.3904540428837473, - -0.38569303604658545, - -0.3875094844382738, - -0.38206013926320903, - -0.38134790028857346, - -0.3889578630242778, - -0.37732303306278014, - -0.3820362386264764, - -0.38944311721314506, - -0.39266492304471845, - -0.39996725296211666, - -0.4295944822560209, - -0.21497154452336553, - -0.2892707939370833, - -0.3191715417156774, - -0.2707134186055974, - -0.3187198125498454, - -0.3316817592600636, - -0.24808211209628694, - -0.3227668217587518, - -0.26870976425482784, - -0.3069181186666219, - -0.2912603335302689, - -0.2822364091254568, - -0.3528226376009913, - -0.3273426467929512, - -0.2681981311341137, - -0.2606283214681214, - -0.269995459016416, - -0.26494855803617734, - -0.29580906018549, - -0.27470766602688834, - -0.2809132273481777, - -0.3032794432026751, - -0.40762388702499985, - -0.3127861604694898, - -0.38298700219969883, - -0.41279014017995463, - -0.3278224205695963, - -0.3312516839280095, - -0.28991887878788003, - -0.2863414840238174, - -0.2229302266954516, - -0.31799835538906585, - -0.33894296137069935, - -0.28213784003526254, - -0.3139849604689038, - -0.32630152603783924, - -0.21368172575316957, - -0.29815126046246654, - -0.24910237375953792, - -0.1691308432517914, - -0.4739452237591121, - -0.2078785555229078, - 0, - -0.568065107179941, - -0.37628605845593577, - -0.30530120519557147, - -0.3084366781310348, - -0.19556367745172076, - -0.28763549182747583, - -0.28642087367557245, - -0.28791817268968256, - -0.27009468587001484, - -0.27014555830404374, - -0.30902300770537405, - -0.32451924750194916, - -0.13328759841751137, - -0.33288319199475025, - -0.38436186824864416, - -0.3283328078447387, - -0.453208362010426, - -0.24326450024695478, - -0.36017908126510945, - -0.35744208306727276, - -0.36146337741947143, - -0.3982582931920351, - -0.40863280436098837, - -0.06441728500804611, - -0.23589827209721292, - -0.09875534307902867, - -0.22876678247361915, - -0.5170515826538755, - -0.34785035406361264, - -0.2748673531362368, - -0.2572403984784284, - -0.27700313546574784, - -0.2579528230093351, - -0.17266715416527512, - -0.27556968956788463, - -0.1730127570960054, - -0.1727163985374609, - -0.2583763921350495, - -0.07581460617898161, - -0.3207917271697105, - -0.2550200566402242, - -0.22792377448164136, - -0.15806994547655884, - 0, - 0, - 0, - -0.133425531296819, - 0, - -0.0047711362331051, - -0.024459311185905275, - -0.023685706173791843, - -0.03463619946650809, - -0.029858094246269284, - 0, - 0, - -0.4483245433808416, - -0.3206857770330632, - -0.29300122597178546, - -0.0580117356504779, - -0.058018065631759264, - -0.32407394121841016, - -0.5044588013952913, - -0.41489523236367176, - -0.4222351201365455, - -0.5477928130066061, - -0.4076988217150115, - -0.4122300201198382, - -0.4790154707629706, - -0.44260021729698606, - -0.38236491447957965, - -0.4075890752418887, - -0.36956845657840187, - -0.38036237013888863, - -0.4121365561054108, - -0.38314765533829576, - -0.3629585471591642, - -0.2295236516525213, - -0.3137933459469201, - -0.3572532894759817, - -0.41074957855793137, - -0.4618954221773248, - -0.3886338051765982, - -0.7368813676393917, - -0.37952105220320054, - -0.39252394569621973, - -0.5631196668538584, - -0.3527166690202256, - -0.41618599600802375, - 0, - -0.30154225953594305, - -0.39367531686018564, - -0.43818557555605797, - -0.31704676662025344, - -0.314331398291522, - -0.4077296221554043, - -0.41582198100659695, - -0.40783095441694117, - -0.5514363457402485, - -0.4376171051671355, - -0.44706056083882806, - -0.4686250296195478, - -0.4896612515629083, - -0.488555485480868, - -0.4302805463020213, - -0.4576657905938406, - -0.5289391106098473, - -0.42737650322289666, - -0.35449727406984777, - -0.40593306750219715, - -0.3722715560512132, - -0.35142128908884374, - -0.3587669891708155, - -0.36144459252409833, - -0.3534677880062346, - -0.39395034292740383, - -0.38491152892650904, - -0.4219845275522892, - -0.40827622810115527, - -0.4800656248802204, - -0.42685450634047506, - -0.40660689827813445, - -0.4609478415699081, - -0.3819443429221191, - -0.4738011491262417, - -0.502197293223366, - -0.5370982574075998, - -0.5392989329450968, - -0.5146323883838069, - -0.5504506761988006, - -0.5194483374452943, - -0.5155769870941311, - -0.5060268658839813, - -0.4722509618956062, - -0.5092745702951988, - -0.4974933615722513, - -0.47112030718792663, - -0.4440272604189909, - -0.4537950363148514, - -0.431370816282451, - -0.41552565054416213, - -0.41897519252096416, - -0.44905418850571, - -0.4283148523110648, - -0.47358192907467067, - -0.5014056347820591, - -0.5262462609305041, - -0.5636947537249676, - -0.519176385197321, - -0.5041785526724425, - -0.645112173122181, - -0.5639834312246084, - -0.5820131466838074, - -0.5744967817402999, - -0.5750707132397788, - -0.5301681960080993, - -0.5108541088703518, - -0.4711178779017141, - -0.464540382519648, - -0.4490347687454609, - -0.4400090864327383, - -0.4343936234945839, - -0.39136378411492934, - -0.3871152015572762, - -0.36350321188725077, - -0.3740992383200131, - -0.3663992115655702, - -0.37277142323792445, - -0.3348343702822474, - -0.3576078716957518, - -0.35225922384131014, - -0.35235321774883943, - -0.3906034798407295, - -0.4682215380808009, - -0.3954134863484584, - -0.3920926730534884, - -0.4403677180016782, - -0.44142015131448953, - -0.47835309400639014, - -0.453602600703659, - -0.4775883207755497, - -0.4468745156084124, - -0.4164498027123228, - -0.43416555772534904, - -0.41110243919529754, - -0.3838422680414326, - -0.375226093634597, - -0.3637652308804029, - -0.3169070598347621, - -0.3211945511728391, - -0.355441755131912, - -0.33373022115467965, - -0.33728812816321296, - -0.3373279282053451, - -0.3231058564106286, - -0.31551753054625764, - -0.3036449824428179, - -0.3169675081965173, - -0.3169675081965173, - -0.39921574684404826, - -0.4282414098887629, - -0.4200502076385958, - -0.35082071765986644, - -0.4138244957104593, - -0.38594745723384116, - -0.4363296574574972, - -0.44618587930304, - -0.4461908156638953, - -0.3406757257126729, - -0.33978573996358963, - -0.3551964543920978, - -0.2499660105393291, - -0.3001240398138063, - -0.16324868576926876, - -0.2313864429754211, - -0.22453571173511766, - -0.22352238911974276, - -0.22234195716078198, - -0.1524973625769317, - -0.24860199326150445, - -0.18413382261909605, - -0.11300840338000351, - -0.028310632565549776, - -0.1104982077082386, - -0.06225160690363929, - -0.09743345700581563, - -0.0051286555401607314, - -0.09296950422124839, - -0.09301595821630271, - -0.05924342109577907, - -0.058400763341941, - -0.08053030705452213, - -0.15611903297740082, - -0.12162339783931497, - -0.06923106310655613, - -0.0228297761173204, - -0.14710935049544216, - -0.048804612491395116, - -0.047947732665761134, - 0, - 0, - 0, - -0.005402915445765433, - -0.02356127365940064, - -0.14949523884501337, - -0.3668017943745926, - 0, - -0.03696248828064885, - 0, - -0.3848514176329383, - -0.010988237553825497, - -0.0824591729221551, - -0.031062525196779545, - -0.09487731943784894, - -0.06109715012268602, - -0.07064730780629125, - -0.05367959951935031, - -0.05059916707006973, - -0.09267934509075093, - -0.08667536163257683, - -0.07817434858156369, - -0.08092140797001823, - -0.050135059475589716, - -0.11804511298345044, - -0.11304124870774579, - -0.16082798912253338, - -0.03845719725672281, - -0.14013924917139498, - -0.06621050457032573, - -0.15449390096687743, - -0.16711468600974067, - -0.12845158186250827, - -0.20394914086745164, - -0.1807633713234783, - -0.3131268572693181, - -0.25929233732758283, - -0.37837875087160855, - -0.2606889089833687, - -0.26428508916792526, - -0.22673943844711852, - -0.20544278291448037, - -0.2015946119162989, - -0.2931548693989513, - -0.2363427853893867, - -0.19110750312927494, - -0.11699887619021487, - -0.13064429314061043, - -0.19573230051919155, - -0.10980702827347066, - -0.14675914421147596, - -0.15130707180104885, - -0.11986055709492449, - -0.09174446145043047, - -0.08487403487044598, - -0.0857495640423418, - -0.10299710959857578, - -0.09362893438581732, - -0.0754241505741543, - 0, - -0.033902612393828524, - 0, - -0.04164101461134784, - -0.037867302036397654, - -0.3284034175490266, - 0, - 0, - 0, - 0, - -0.09757063674085176, - -0.3434548418612319, - -0.11195154306141542, - -0.0011739980589831056, - 0, - 0, - -0.5905155789170432, - 0, - -0.5649085325536541, - -0.3702813831320766, - -0.2607352559424736, - -0.12097179312322492, - -0.11151282252048411, - -0.31033141550160237, - -0.10481005611409122, - -0.10338598028152901, - -0.1317442496424971, - -0.08660156359610083, - -0.09905982596777463, - -0.11965274888344601, - -0.034374304576369696, - -0.05124039984538853, - -0.1543963103899718, - -0.6127726609168038, - -0.1660758035999963, - -0.18656903159916893, - -0.2879820503001166, - -0.2891244180407069, - -0.34118373168812965, - -0.25251237600529663, - -0.24204982032491584, - -0.3045179871834651, - -0.3388869629356759, - -0.3379859113179834, - -0.3400066072826198, - -0.4315945390114937, - -0.36097906865734053, - -0.39503881980611655, - -0.35389493869755173, - -0.4582623319207405, - -0.3863436340815716, - -0.4601758583342219, - 0, - -0.4772580133169182, - -0.01717876955566755, - -0.4232365768565368, - -0.36561801104123504, - -0.3188386971952246, - -0.3133589491840969, - -0.3419090686649858, - -0.29010054201432167, - -0.28745811153232603, - -0.32864741464031266, - -0.2704535614862036, - -0.2770201496765614, - -0.30750855747327044, - -0.7055048225466322, - -0.32073807344010385, - -0.4682212400220995, - -0.4747376436160271, - -0.5726453784066702, - -0.4945759828720766, - -0.5497115577190648, - -0.4529132019511738, - -0.4327316865570534, - -0.40013491148137814, - -0.333165469400984, - -0.3637355489662919, - -0.2543565483441076, - -0.5423622676658444, - -0.38594672164660115, - -0.3506057081534042, - -0.3974262071801504, - -0.4195502701056878, - -0.6314345857839209, - -0.29943771438768674, - -0.2965797355730865, - -0.33741334051575267, - -0.3096969965836145, - -0.3551129375846015, - -0.37225450401583393, - -0.24215971483692655, - -0.17377199092133733, - -0.08049145577083727, - -0.20087622947250028, - -0.20284955578393615, - -0.060676454669919666, - -0.15762427625870745, - -0.23530443637239307, - -0.24485565802583464, - 0, - -0.38236539953850535, - -0.3530399971061132, - -0.30602112553333627, - -0.3128138194023342, - -0.374609852412752, - -0.33008551996915325, - -0.3029445735205706, - -0.27925893836298976, - -0.2865566446029649, - -0.49872011107248926, - -0.14883047547951556, - -0.3750538193322931, - -0.3961297614409405, - -0.27055233085177754, - -0.0623817918648889, - -0.2498683282892895, - -0.2650332670832177, - -0.27948022812444684, - -0.25670713034575565, - -0.2870262949536777, - -0.27857605059057, - -0.312291536663059, - -0.6449767604254555, - -0.2650067011575452, - -0.23485388312678668, - -0.2799692465320258, - -0.29280345980289246, - -0.3222273673955576, - -0.37937550600351555, - -0.357999192525867, - -0.35800910968355426, - -0.35950056105389205, - -0.30394710648007794, - -0.2406235497871112, - -0.20086145625391472, - -0.22942987524392322, - -0.2162684998528469, - -0.27100691403544475, - -0.452755501167749, - -0.2229596110092793, - -0.23303549122416167, - -0.29074175646762046, - -0.3105184016382938, - -0.30735624725385435, - -0.5051815245774336, - -0.3156631457978155, - -0.34996993741402593, - -0.2071783832179236, - -0.2095627463523405, - -0.2095700176849764, - -0.2593983674204817, - -0.2685737680719861, - -0.274072020891193, - -0.3945276605453334, - -0.3945276605453334, - -0.269748100834043, - -0.28272994128042206, - -0.2760131380067353, - -0.19591775975042058, - -0.19672453180566585, - -0.26194590834001363, - -0.2572094750068097, - -0.2603905203053991, - -0.2703410676293012, - -0.24658535164354822, - -0.1840173711517754, - -0.235369221119624, - -0.2306164880730145, - -0.20821152664324405, - -0.2053131396511787, - -0.13202266435415178, - -0.11683170029283474, - -0.06126641461869464, - -0.116630527776174, - -0.10258292068998054, - -0.15372669490228774, - -0.09929676678538779, - -0.11581814833460469, - -0.1246844905397454, - -0.10022440108177066, - -0.16897212361424796, - -0.12930409557212996, - -0.13388514048349331, - -0.0818806591439194, - -0.07000704136008618, - -0.06964826059323082, - -0.11439610263288602, - -0.13004441041046655, - -0.188028154978639, - -0.17206930586021774, - -0.18620646130511298, - -0.203852620220633, - -0.171284178180647, - -0.19256725860519286, - -0.2436783483635908 - ], - "yaxis": "y" - } - ], - "layout": { - "legend": { - "title": { - "text": "variable" - }, - "tracegroupgap": 0 - }, - "margin": { - "t": 60 - }, - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "heatmapgl": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmapgl" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "xaxis": { - "anchor": "y", - "domain": [ - 0, - 1 - ], - "title": { - "text": "datetime" - } - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0, - 1 - ], - "title": { - "text": "value" - } - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "drawdown_all = pd.DataFrame()\n", - "for agg in aggregators:\n", - " drawdown_all[agg.target] = agg.dd()\n", - "drawdown_all.plot()" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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IiJSRajploiIiIiIiIhUKmalpZww7ToRERERERERkSpCgR4RERERERERkSpCTbdEREREREREpFLRqFsnThk9IiIiIiIiIiJVhAI9IiIiIiIiIiJVhJpuiYiIiIiIiEiloqZbJ04ZPSIiIiIiIiIiVYQCPSIiIiIiIiIiVYSabomIiIiIiIhIpWI2qenWiVJGj4iIiIiIiIhIFaFAj4iIiIiIiIhIFaGmWyIiIiIiIiJSqZjVcuuEKaNHRERERERERKSKUKBHRERERERERKSKUNMtEREREREREalUNOrWiVNGj4iIiIiIiIhIFaFAj4iIiIiIiIhIFaGmWyIiIiIiIiJSqZgNNd06UcroERERERERERGpIpTRIyIiIiIiIiJyisyfP58vvviCrKws6taty6hRo2jUqFG55b/66iu+++470tPTiYiI4Oyzz2bYsGHYbLbjWp4CPSIiIiIiIiJSqVSVUbeWLFnC22+/zZgxY2jcuDFfffUV06dPZ9asWURGRpYq/+uvv/Lee+9x4403kpSUxP79+3nhhRcwDIMRI0Yc1zLVdEtERERERERE5Dg4nU4KCgoC/pxOZ7nlv/zyS3r16kWPHj2oVasWY8aMwWaz8dNPP5VZfvPmzTRp0oQuXbqQkJBA69at6dy5M9u2bTvudVRGj4iIiIiIiIjIcZg3bx4fffRRwLRLL72UIUOGlCrrcrnYsWMHF198sX+ayWSiVatWbNmypcz6mzRpwqJFi9i2bRuNGjXiwIEDrFy5kq5dux73OirQIyIiIiIiIiKVirmSttwadPEgBgwYEDDNarWWWTYnJwePx0NUVFTA9KioKFJSUsqcp0uXLuTk5DBlyhQA3G43559/Ppdccslxr6MCPSIiIiIiIiIix8FqtZYb2DkZ1q9fz7x58xg9ejSNGzcmNTWVN954g48++ohLL730uOpQoEdERERERERE5CSLiIjAZDKRlZUVMD0rK6tUls8RH3zwAd26daNXr14A1KlTh6KiIl555RUuueQSTKa/72pZnTGLiIiIiIiISKViNhmV8u+fsFgsNGjQgHXr1vmneTwe1q1bR1JSUpnzFBcXYxiByzme4E7Acv9RaREREREREREROS4DBgzg+eefp0GDBjRq1Iivv/6a4uJiunfvDsBzzz1HTEwMw4YNA6B9+/Z89dVX1K9f399064MPPqB9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IiIiIiIiIpWKRt06ccroERERERERERGpIhToERERERERERGpItR0S0REREREREQqFbNJTbdOlDJ6RERERERERESqCAV6RERERERERESqCDXdEhEREREREZFKRaNunThl9IiIiIiIiIiIVBEK9IiIiIiIiIiIVBFquiUiIiIiIiIilYpZaSknTLtORERERERERKSKUKBHRERERERERKSKUNMtEREREREREalUNOrWiVNGj4iIiIiIiIhIFaFAj4iIiIiIiIhIFaGmWyIiIiIiIiJSqZjVcuuEKaNHRERERERERKSKUKBHRERERERERKSKUNMtEREREREREalUTBp164Qpo0dEREREREREpIpQoEdEREREREREpIpQ0y0RERERERERqVQ06taJU0aPiIiIiIiIiEgVoUCPiIiIiIiIiEgVoaZbIiIiIiIiIlKpmNR064Qpo0dEREREREREpIpQoEdEREREREREpIpQ0y0RERERERERqVQ06taJU0aPiIiIiIiIiEgVoUCPiIiIiIiIiEgVYXi9Xm9Fr4SIiIiIiIiIyBGTFl9X0atQpsc7v1LRq/C31EfPv5R2eaeKXoXTSvz7S8ga3b2iV+O0E/XaQnb2aF3Rq3Faqf/Tag4O6VjRq3HaSZi7lG0dW1b0apxWGi1dp+vaCYh6bSF7zm9b0atxWqnz/Uq2dGhe0atx2kn6fYOOtX+ozvcrKX58UEWvxmknaNI8Mq7qUtGrcVqJfedXXK8Pq+jVOO1YRr1X0asglZyabomIiIiIiIiIVBHK6BERERERERGRSkWjbp04ZfSIiIiIiIiIiFQRCvSIiIiIiIiIiFQRarolIiIiIiIiIpWKSU23TpgyekREREREREREqggFekREREREREREqgg13RIRERERERGRSkWjbp04ZfSIiIiIiIiIiFQRCvSIiIiIiIiIiFQRarolIiIiIiIiIpWKyVDbrROljB4RERERERERkSpCgR4RERERERERkSpCTbdEREREREREpFLRqFsnThk9IiIiIiIiIiJVhAI9IiIiIiIiIiJVhJpuiYiIiIiIiEilYlLTrROmjB4RERERERERkSpCgR4RERERERERkSpCTbdEREREREREpFIxG2q7daKU0SMiIiIiIiIiUkUo0CMiIiIiIiIiUkWo6ZaIiIiIiIiIVCoadevEKaNHRERERERE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QcfaP1Tn+5UUP155+uU6XQRNmkfGVV0qejVOK7Hv/Irr9WF/X1ACWEa99/eFqoDX1v/LjshPkdEtKtdLiLJUqoweERERERERERGNunXiKlUfPSIiIiIiIiIicuIU6BERERERERERqSLUdEtEREREREREKhWzmm6dMGX0iIiIiIiIiIhUEQr0iIiIiIiIiIhUEWq6JSIiIiIiIiKVislQ260TpYweEREREREREZEqQoEeEREREREREZEqQk23RERERERERKRS0ahbJ04ZPSIiIiIiIiIiVYQCPSIiIiIiIiIiVYSabomIiIiIiIhIpaJRt06cMnpERERERERERKoIBXpERERERERERKoINd0SERERERERkUpFTbdOnDJ6RERERERERESqCAV6RERERERERESqCDXdEhEREREREZFKRU23TpwyekREREREREREqggFekREREREREREqgg13RIRERERERGRSsVkKC/lRGnPiYiIiIiIiIhUEQr0iIiIiIiIiIhUEWq6JSIiIiIiIiKVikbdOnEK9IiIiIiIiIiInCLz58/niy++ICsri7p16zJq1CgaNWpUbvn8/HzmzJnD8uXLycvLIz4+nhEjRtCuXbvjWp4CPSIiIiIiIiIip8CSJUt4++23GTNmDI0bN+arr75i+vTpzJo1i8jIyFLlXS4XDz30EBEREdx6663ExMSQnp5OSEjIcS9TgR4RERERERERqVQqa9Mtp9OJ0+kMmGa1WrFarWWW//LLL+nVqxc9evQAYMyYMaxYsYKffvqJiy++uFT5BQsWkJeXx7Rp07BYfCGbhISEf7SOCvSIiIiIiIiIiByHefPm8dFHHwVMu/TSSxkyZEipsi6Xix07dgQEdEwmE61atWLLli1l1v/nn3/SuHFjZs+ezR9//EFERASdO3fm4osvxmQ6vvG0FOgRERERERERETkOgwYNYsCAAQHTysvmycnJwePxEBUVFTA9KiqKlJSUMuc5cOAAaWlpdOnShbvvvpvU1FRee+013G43l1122XGtowI9IiIiIiIiIlKpVNamW8dqpnUyeL1eIiIiuP766zGZTDRo0IBDhw7x+eefK9AjIiIiIiIiIlJRIiIiMJlMZGVlBUzPysoqleVzRFRUFBaLJaCZVmJiIllZWbhcLn+/PcdyfA28RERERERERETkuFksFho0aMC6dev80zweD+vWrSMpKanMeZo0aUJqaioej8c/bf/+/URHRx9XkAcU6BERERERERGRSsZUSf/3Tw0YMIAff/yRhQsXkpyczGuvvUZxcTHdu3cH4LnnnuO9997zl+/duzd5eXm8+eabpKSksGLFCubNm0efPn2Oe5lquiUiIiIiIiIicgp06tSJnJwc5s6dS1ZWFvXq1eOee+7xN91KT0/HOKo/ori4OO69917eeust7rjjDmJiYujXr1+ZQ7GXR4EeEREREREREZFTpG/fvvTt27fM76ZOnVpqWlJSEtOnTz/h5SnQIyIiIiIiIiKVSmUddet0YHi9Xm9Fr4SIiIiIiIiIyBHzd0+q6FUoU9+6j1f0KvwtZfT8SwV39avoVTithDz6De4PRlT0apx2zEPfYlfucxW9GqeVeuE34/1zckWvxmnHaP8QjueGVPRqnFZsN8/Fu/uJil6N045R93Yo+qKiV+P0Yh+ofXYi7ANZXLdpRa/FaaXz7k1s69iyolfjtNNo6To8P4yr6NU4rZjOexbXW8MrejVOO5YR/6voVZBKToEeEREREREREalU1HTrxGl4dRERERERERGRKkKBHhERERERERGRKkJNt0RERERERESkUjEZyks5UdpzIiIiIiIiIiJVhAI9IiIiIiIiIiJVhJpuiYiIiIiIiEilolG3TpwyekREREREREREqggFekREREREREREqgg13RIRERERERGRSkVNt06cMnpERERERERERKoIBXpERERERERERKoINd0SERERERERkUpFTbdOnDJ6RERERERERESqCAV6RERERERERESqCDXdEhEREREREZFKxWQoL+VEac+JiIiIiIiIiFQRCvSIiIiIiIiIiFQRarolIiIiIiIiIpWKCY26daKU0SMiIiIiIiIiUkUo0CMiIiIiIiIiUkWo6ZaIiIiIiIiIVComQ023TpQyekREREREREREqggFekREREREREREqgg13RIRERERERGRSsVkKC/lRGnPiYiIiIiIiIhUEQr0iIiIiIiIiIhUEWq6JSIiIiIiIiKVikbdOnHK6BERERERERERqSIU6BERERERERERqSLUdEtEREREREREKhU13TpxyugREREREREREakiFOgREREREREREaki1HRLRERE5wFjcQABAABJREFURERERCoVk6G8lBOlPSciIiIiIiIi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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
JanuaryFebruaryMarchAprilMayJuneJulyAugustSeptemberOctoberNovemberDecember
Year
20170.080.030.070.060.26-0.050.070.150.000.150.02-0.06
20180.360.030.06-0.030.090.07-0.180.170.02-0.14-0.03-0.02
20190.010.03-0.030.01-0.050.03-0.02-0.06-0.030.100.020.14
20200.070.160.490.230.120.280.370.36-0.11-0.050.190.14
2021-0.05-0.10-0.170.22-0.040.12-0.030.46-0.080.180.34-0.06
20220.000.090.140.10-0.010.000.00-0.03-0.01-0.000.000.03
20230.160.010.700.110.290.170.33-0.17-0.10-0.050.120.14
20240.070.270.15-0.060.070.930.120.970.720.940.230.14
20250.37-0.07-0.050.000.000.000.000.000.000.000.000.00
\n", - "
" - ], - "text/plain": [ - " January February March April May June July August September \\\n", - "Year \n", - "2017 0.08 0.03 0.07 0.06 0.26 -0.05 0.07 0.15 0.00 \n", - "2018 0.36 0.03 0.06 -0.03 0.09 0.07 -0.18 0.17 0.02 \n", - "2019 0.01 0.03 -0.03 0.01 -0.05 0.03 -0.02 -0.06 -0.03 \n", - "2020 0.07 0.16 0.49 0.23 0.12 0.28 0.37 0.36 -0.11 \n", - "2021 -0.05 -0.10 -0.17 0.22 -0.04 0.12 -0.03 0.46 -0.08 \n", - "2022 0.00 0.09 0.14 0.10 -0.01 0.00 0.00 -0.03 -0.01 \n", - "2023 0.16 0.01 0.70 0.11 0.29 0.17 0.33 -0.17 -0.10 \n", - "2024 0.07 0.27 0.15 -0.06 0.07 0.93 0.12 0.97 0.72 \n", - "2025 0.37 -0.07 -0.05 0.00 0.00 0.00 0.00 0.00 0.00 \n", - "\n", - " October November December \n", - "Year \n", - "2017 0.15 0.02 -0.06 \n", - "2018 -0.14 -0.03 -0.02 \n", - "2019 0.10 0.02 0.14 \n", - "2020 -0.05 0.19 0.14 \n", - "2021 0.18 0.34 -0.06 \n", - "2022 -0.00 0.00 0.03 \n", - "2023 -0.05 0.12 0.14 \n", - "2024 0.94 0.23 0.14 \n", - "2025 0.00 0.00 0.00 " - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "option_aggregator_zscore1.yearly_performance(True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## TRADES COMP" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Structure Similarity Tests" - ] - }, - { - "cell_type": "code", - "execution_count": 426, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Return Correlation: 0.98\n", - "Returns Cross Correlation: 5.53\n", - "KS p-value: 0.9787\n" - ] - } - ], - "source": [ - "smooth_returns = option_aggregator_smooth._equity.Total.pct_change().dropna()\n", - "raw_returns = option_aggregator_zscore2_dte270_roll120._equity.Total.ewm(span=3).mean().pct_change().dropna()\n", - "raw_returns = aggregators[5]._equity.Total.ewm(span=3).mean().pct_change().dropna()\n", - "\n", - "## Clip returns to remove outliers\n", - "# raw_returns = option_aggregator_zscore2_dte270_roll120._equity.Total.pct_change().dropna()\n", - "# raw_returns = raw_returns.clip(lower=raw_returns.quantile(0.01), upper=raw_returns.quantile(0.99))\n", - "\n", - "smooth_returns = smooth_returns[smooth_returns.index.isin(raw_returns.index)]\n", - "raw_returns = raw_returns[raw_returns.index.isin(smooth_returns.index)]\n", - "\n", - "\n", - "## Correlation\n", - "correlation = raw_returns.corr(smooth_returns)\n", - "print(f\"Return Correlation: {correlation:.2f}\")\n", - "\n", - "# Cross-correlation\n", - "from scipy.signal import correlate\n", - "\n", - "lags = np.arange(-len(raw_returns) + 1, len(raw_returns))\n", - "correlation = correlate(raw_returns, smooth_returns, mode=\"full\")\n", - "print(f\"Returns Cross Correlation: {correlation[np.where(lags ==0)[0][0]]:.2f}\")\n", - "\n", - "\n", - "from scipy.stats import ks_2samp\n", - "ks_stat, ks_p = ks_2samp(raw_returns, smooth_returns)\n", - "print(f\"KS p-value: {ks_p:.4f}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 428, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 428, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "lags[2010]\n" - ] - }, - { - "cell_type": "code", - "execution_count": 408, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Cumulative Alignment Score: 40.75%\n" - ] - } - ], - "source": [ - "raw_cum = (1 + raw_returns).cumprod() - 1\n", - "smooth_cum = (1 + smooth_returns).cumprod() - 1\n", - "alignment_score = 1 - np.mean(np.abs(raw_cum - smooth_cum)) / np.mean(np.abs(raw_cum))\n", - "print(f\"Cumulative Alignment Score: {alignment_score:.2%}\")\n" - ] - }, - { - "cell_type": "code", - "execution_count": 413, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "% Days Same Direction: 95.47%\n" - ] - } - ], - "source": [ - "raw_sign = np.sign(raw_returns)\n", - "smooth_sign = np.sign(smooth_returns)\n", - "pct_same_direction = (raw_sign == smooth_sign).mean()\n", - "print(f\"% Days Same Direction: {pct_same_direction:.2%}\")\n" - ] - }, - { - "cell_type": "code", - "execution_count": 410, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " OLS Regression Results \n", - "==============================================================================\n", - "Dep. Variable: Total R-squared: 0.952\n", - "Model: OLS Adj. R-squared: 0.952\n", - "Method: Least Squares F-statistic: 4.021e+04\n", - "Date: Tue, 01 Jul 2025 Prob (F-statistic): 0.00\n", - "Time: 22:41:37 Log-Likelihood: 6118.1\n", - "No. Observations: 2011 AIC: -1.223e+04\n", - "Df Residuals: 2009 BIC: -1.222e+04\n", - "Df Model: 1 \n", - "Covariance Type: nonrobust \n", - "==============================================================================\n", - " coef std err t P>|t| [0.025 0.975]\n", - "------------------------------------------------------------------------------\n", - "const 0.0006 0.000 2.309 0.021 8.99e-05 0.001\n", - "Total 0.9777 0.005 200.515 0.000 0.968 0.987\n", - "==============================================================================\n", - "Omnibus: 1861.564 Durbin-Watson: 2.005\n", - "Prob(Omnibus): 0.000 Jarque-Bera (JB): 669867.070\n", - "Skew: 3.535 Prob(JB): 0.00\n", - "Kurtosis: 92.132 Cond. No. 18.9\n", - "==============================================================================\n", - "\n", - "Notes:\n", - "[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n" - ] - } - ], - "source": [ - "import statsmodels.api as sm\n", - "\n", - "X = sm.add_constant(smooth_returns)\n", - "y = raw_returns\n", - "model = sm.OLS(y, X).fit()\n", - "print(model.summary())\n" - ] - }, - { - "cell_type": "code", - "execution_count": 411, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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Jf4UiERERCTtKRCJiIhI2tNVZiIikpYiC2+Hupree0J3NtY5V7R790svvZQnn3wSaFikdMCAAcycOZPLLruMjIyMnqoybSkQiYhIeqqrwXLC6b32dNH/LurwY44++mjmz59PKBRi1apVXHrppRiGwbXXXtsDFaY3nTITERFJUA6Hg379+jFo0CBmzJjBkUceyRtvvAFAZWUlF154IQcddBD77bcf06dP5+mnn4499qWXXuI73/kOkUgEgNWrVzNo0CBuu+222D6XXXYZv/zlL3v1NSUqBSKRNBGtr413CSLSBV988QXvv/8+drsdgEAgwAEHHMA///lPXn31Vc466ywuueQSPvroIwAOPfRQamtrWb16NQDvvPMOBQUFLF++PHbMFStWcNhhh/X+i0lAOmUmkgZM06TswllEsvOw/Gg2RsnIeJckIu3w8ssvM3LkSCKRCIFAAIvFwty5cwEYMGAA559/fmzf8847j9dee42lS5cyceJEcnJyGDNmDCtWrGD8+PGsWLGC2bNn84c//IG6ujq8Xi+bNm1i8uTJ8Xp5CUWBSCQd+H3Yi/cjOmQ/zI1rFYhEksThhx/O7373O+rr6/nb3/6GzWbjhBNOACASiXDPPffw7LPPUlZWRjAYJBgM4nK5Yo+fPHkyy5cvZ86cObz77rtcffXVLF26lPfeew+Px0NRURHDhw+P18tLKDplJpIOqquwuLMhKxuzame8qxGRdsrMzGTYsGGMGTOG+fPn89FHH/HYY48BcN9993H//fdz4YUXsmjRIl588UWmTp3aZO2www8/nJUrV/LZZ59ht9sZMWIEhx12GCtWrGDFihXqHdqDApFIOvB6MNxZ4M6G6sp4VyMinWCxWPjlL3/J7bffjs/nY+XKlRx33HH88Ic/ZMyYMRQXF7Nhw4Ymj5k0aRK1tbX87W9/i4Wfww8/nOXLl2v80F4UiETSgOn1YMnKgkw3eKvjXY6IdNLMmTOxWCz885//ZNiwYbzxxhusXLmSr776iiuvvJKKioom++fl5fGd73yHJUuWxMLPoYceyurVq9mwYYN6iPagMUQiacCs2oklMxvDYsWMhONdjoh0ks1m46c//Sl//vOf+d///sfmzZs566yzcLlcnHXWWRx33HHU1DSdbHLy5Ml89tlnHH744QDk5+czcuRIKioqGDFiRDxeRkIyTK16127l5eVNzs1KxxiGwYABA9i2bZsWW+xl0X//k9yR++N1ZhF99nGsv50b75LSht738WUYBj6fr8WZnRN9pupUYLfbe+X3ptfrJScnp8XnLywsbNcx1EMkkg68VViyciEUAdPEjEYxLDpjLukt3cKJtE3fiCJpwPRWY3FnNdzIcEGdJmkUEdmTApFIOoiEMazWhn9nZoG3Kr71iIgkGAUikXSwx9gVI9OtS+9FRPaiQCSS4kzTbBKIcLkxPeohEhHZkwKRSKrz1WM4nLtvZ2WDZqsWEWlCgUgk1Xk9DRMyNnJnYVYrEImI7EmBSCTVNQtE2eDRGCIRkT0pEImkOm8VuDJjNw2HE/y+OBYkIpJ4FIhEUpzpqQRX1l4bNWOyiHS/QYMG8cILL3T7cU899VRuuOGGbj/unjRTtUiKM70ejD79412GSMK5/c0t1AQjvfZ82Q4rVxw5qEOP2blzJ3fccQevvPIKFRUV5ObmMnr0aH79619zyCGH9FCl+3bXXXfxwgsv8NJLL8Wthu6WUIFozZo1PPPMM2zcuJGqqiouu+wyJk2aFLv/9NNPb/FxZ599NieddFKL9y1atIjFixc32TZw4EDuvvvubqtbJKH56sC51zpOpolpmhiGEZ+aRBJATTDC6WP79NrzLVrd8YsZZs+eTTAY5O6776a4uJjy8nLeeustqqo0dUZ3S6hAFAgEKCkp4ZhjjuHOO+9sdv9f//rXJrc/+ugj/vKXv3DooYe2edwhQ4Zw/fXXx25btIaTpBO/DxyOptusNgiHwO5o+TEiEnfV1dW8++67LF68mMMOOwyAwYMHM3HixNg+gwYN4ve//z0vvfQSb7/9NoMHD+auu+6iT58+XH755Xz88ceMHj2ae+65h5KSktjj/vnPf7Jw4UK2bt3KkCFD+NWvfsWpp54au3/Lli1cd911vPXWW1gsFqZNm8bcuXMpLCzkiSeeYP78+bHnB5g/fz5nnHEGAJWVlfzsZz/jtddeY8CAAdxwww1897vfjR37iy++YO7cubz77rtkZmZy1FFHcfPNN1NQUABAfX09V111Fc8//zxZWVnMmTOnZxp4LwmVDCZOnMisWbOa9ArtKS8vr8l/K1euZMyYMfTv3/bpAIvF0uRxLa2IK5Ky/H6wO5tuc2Y09ByJSMJyu9243W5eeOEFAoFAq/vdfffdnHrqqbz44ouMGDGCiy++mCuvvJKLL76Y559/HtM0ue6662L7P//889x444384he/4JVXXuHss8/mN7/5DW+//TYA0WiUn/70p3g8Hv7973/z2GOPsXnzZi644AIATjrpJObMmcP+++/PRx99xEcffdTkLM38+fM58cQTefnllzn22GO5+OKLYz1a1dXVnH766YwZM4bnn3+eRx55hIqKiiah5//+7/945513eOCBB3j00UdZsWIFq1at6ta2bUlC9RB1hMfj4aOPPuKiiy7a575lZWXMmTMHu91OaWkpZ555Jn379m11/1AoRCgUit02DAOXyxX7t3ROY9upDXtZMIDhsANgGGCaBobDieHzYeQWxLm41Kf3fXwlc7vbbDb+8Ic/cMUVV/Dwww8zduxYJk+ezPe//31Gjx4d2++MM86IBZILL7yQk046iUsvvZRp06YB8POf/5zf/OY3sf3/8pe/cPrpp3PuuecCsN9++/Hhhx/yl7/8hSlTpvDWW2/xxRdfsGLFilgP0IIFCzj66KP5+OOPmTBhAm63G6vVSr9+/ZrVffrpp3PyyScDcM011/C3v/2Njz/+mKOPPpp//OMfjB07lquvvjq2/1133cUhhxzC+vXrKSoq4vHHH+eee+7hyCOPBBoC38EHH7zP9urqzzppA9Hrr79ORkZGq71JjUaOHMmFF17IwIEDqaqqYvHixdxwww3cddddsZCztyVLljQZdzRs2DDmzZtHYWFht76GdFVUVBTvEtLKDoednD4N4yRiXdJ5+bjdLpwDBsSztLSi9338bNiwAbvd3my7xTCwWXvv16DFMFqsoy0nn3wyM2bM4J133uGDDz7glVde4b777uMPf/gDs2bNAmDcuHGx4w7Y9ZkeO3ZsbFtRURF+vx+/3092djbr1q3jJz/5SZNaJk+ezF//+lfsdjsbNmxg0KBBTU6xjRkzhtzcXDZs2MAhhxyCxWLBaOX17FmP3W4nOzubqqoq7HY7X3zxBcuXL2fkyJHNHrdlyxbC4TDBYJBJkybFjtGvXz9GjBiB1Wpttf0cDkfstXdW0gaiZcuWceSRR+LYe2zEXvY811pcXBwLSCtWrOCYY45p8TGnnHIKM2fOjN1uTJ3l5eWEw+FuqD49GYZBUVERZWVlDetrSa8IBwJUVlZSUFBAZWUlpglmOILv22+wZKuHqKfpfR9fjd/fe/b6N4qaJuFI732nR02zxTr2xWq1MmXKFKZMmcIll1zCZZddxrx58/jhD38INLzGxuNGIruvmtt7WyAQICMjI7Ztz1oa9wmFQkQiEcxWam18XDQabXWfPeux2+2x26FQiNraWv7f//t/XHPNNc0e179/fzZu3AhAOBxucmzTNJvVvKdgMMi2bduabbfZbO3uzEjKQPT555+zdetWLr300g4/1u12M3DgQMrKylrdx263t5pC9YXWdeauK5yk9zQ2d8P/TbDbob5WP4depPe9dJeRI0d2aa6fESNG8P777ze5cnvlypWxXpuRI0eydetWtmzZEjtltnbtWqqrqyktLQUafk9Go9EOP/fYsWN57rnnGDJkCDZb8whSUlKC3W7nww8/jD23x+Nhw4YNTJ48uc1jd/XzlVCDqtvr1VdfZfjw4U2689rL7/dTVlZGXl5et9clkpBa+pJwODHrNKhaJJFVVlZy2mmn8e9//5s1a9awefNmli5dyn333cdxxx3X6eNecMEFLFq0iH/+859s2LCBhQsX8vzzz3P++ecDcOSRRzJq1Ch++ctfsmrVKj766CN+9atfcdhhhzF+/Hig4ertzZs3s3r1aiorK9sc9L2nc889F4/Hw4UXXsjHH3/Mpk2beO211/j1r39NJBLB7XYza9Ys5s6dGxvL9Otf/7pXrg5PqB6ixrDSaMeOHWzatImsrKzYIOj6+nreeecdfvzjH7d4jFtuuYVJkyYxY8YMAB566CEOPvhg+vbtS1VVFYsWLcJisXDEEUf0/AsSSQQtBSJdZSaS8NxuNwceeCB/+9vf+PrrrwmFQgwcOJAzzzyTX/7yl50+7owZM7j55ptZuHAhN954I0OGDGH+/PkcfvjhQMMpr3/84x9cd911/OAHP2hy2X2j448/nueee47TTz+d6urqJpfdt6WoqIinn36a2267jTPPPJNAIMDgwYOZNm1aLPRcf/311NXVce6558Yuu6+pqen0620vw0ygPtzPPvuMm2++udn2qVOnxq4me/nll3nwwQf561//SmZmZrN9L7roIqZOnRrrCrz77rv5/PPPqampIScnh1GjRjFr1qxODXAsLy/v1PlfaWAYBgMGDGDbtm06ddBLzGiU6PzrsZz4I/r0KWDnzkrAxNz2LXh2Yjn57HiXmPL0vo8vwzDw+XyxsTN7SoaZqpOd3W7vld+bXq+3xSl17HZ7u8cQJVQgSnQKRF2jXwy9z/TVE/3bHViO+2HTQFRZgblxLdYze2fCs3Sm9318tRWIpOclUyBKyjFEItJOfl/zSRlBp8xERPaiQCSSygItLNsB4HCCr7736xERSVAKRCKpzO/DsLUwhYTNBqFg79cjIpKgFIhEUpnf1+ICrkbDGh5xKEik9yXz8h3SexSIRFJZwN/6ivYKRJImDMPo1CSCkhy662erQCSSwky/r2FWapE01r9/f2pqahSKUlA0GqWmpqbFaXg6KqEmZhSRbuaraxhA3RL1EEmacLlcuN1uamtr411K2nE4HASDPTte0e12t7gMSEcpEImksvr61gORYWBGIhhWa+/WJBIHdru9xXlqpOck2xxcOmUmksJMfyuX3UNDUPL7ercgEZEEpUAkksr89S1PzAi75iLS5IwiIqBAJJLa/PVt9BBlaHJGEZFdFIhEUlnA3+oYIsPhUCASEdlFgUgklQX8rV92b1cgEhFppEAkkspME8No5WPudGL6dBmyiAgoEImktrYudXU4oU6DqkVEQIFIJH3pKjMRkRgFIpFUto8eIlPzEImIAApEIqmtzUDk0MSMIiK7KBCJpCgzGgWjjR3sTggoEImIgAKRSOoKBsDWyqSMoB4iEZE9KBCJpKpgG3MQAdjsDaFJREQUiERSViDQMPliKwyjrfNpIiLpRYFIJFUFAw29QG1pa9C1iEgaUSASSVXBAIbNFu8qRESSggKRSKoKBsC6j0CkHiIREUCBSCR1BdseQwQoEImI7KJAJJKqAv599xABpkKRiIgCkUiqMgN+sO8jENl16b2ICCgQiaSuQDuuMrM7NFu1iAgKRCKpy+/b9xgiu2arFhEBBSKR1LWvmaphVyDy9049IiIJTIFIJEWZgX2sZQYYdkfD4GsRkTSnQCSSqoKBdvQQ2XXKTEQEBSKR1BXw73sMkU2DqkVEQIFIJHUF/fu+ysxhx/QpEImIKBCJpKpgsB3zEDnBV9879YiIJLCEWvlxzZo1PPPMM2zcuJGqqiouu+wyJk2aFLv/T3/6E6+//nqTx4wfP55rr722zeO+8MILLF26FI/HQ3FxMeeddx4jRozokdcgkjDMKIaxj795HA6o9fZOPSIiCSyhAlEgEKCkpIRjjjmGO++8s8V9JkyYwIUXXhi7bdvHat7Lly/noYceYvbs2YwcOZL//ve/3Hrrrdx9993k5uZ2a/0iCaU9K3LYnZgaVC0ikliBaOLEiUycOLHNfWw2G3l5ee0+5rPPPsv06dM5+uijAZg9ezYffvghy5Yt4+STT+5CtSKJrh2JyKF5iEREIMECUXusWbOGn//857jdbsaOHcusWbPIzs5ucd9wOMyGDRuaBB+LxcK4ceNYu3Ztq88RCoUIhUKx24Zh4HK5Yv+WzmlsO7Vhb2psc2L/N8092t+RgeH36WfSg/S+jy+1f/wkW9snVSCaMGEChx56KP369aOsrIzHHnuM2267jVtvvRWLpflYCa/XSzQabdajlJeXx9atW1t9niVLlrB48eLY7WHDhjFv3jwKCwu77bWks6KioniXkBZ2OBzk9Closq2goOltM5xNLVEKBwzozdLSkt738aX2j59kafukCkRTpkyJ/Xvo0KEUFxfzy1/+ks8++4xx48Z12/OccsopzJw5M3a7Md2Wl5cTDoe77XnSjWEYFBUVUVZWhmm2Z4CLdEU4EGDnzkqgoWeooKCAyspK9mx60zQxa2vZtm1bnKpMfXrfx5faP34Soe1tNlu7OzOSKhDtrX///mRnZ1NWVtZiIMrJycFiseDxeJps93g8bY5Dstvt2FuZ4VcfqK4zTVPt2BtMk8ZxRI2nyRqafXfbN5xC08+jN6id40vtHz/J0vZJPQ/Rzp07qa2tJT8/v8X7bTYbw4cPZ/Xq1bFt0WiU1atXU1pa2ltlivQ6MxLZPXBo33v3aC0iIskgoXqI/H4/ZWVlsds7duxg06ZNZGVlkZWVxZNPPsmhhx5KXl4e27dv5+GHH6aoqIjx48fHHnPLLbcwadIkZsyYAcDMmTP505/+xPDhwxkxYgTPPfccgUCAadOm9fbLE+k9wcC+l+0QEZGYhApE69ev5+abb47dfuihhwCYOnUqs2fPZvPmzbz++uvU1dVRUFDAAQccwBlnnNHk9Nb27dvxendPNHf44Yfj9XpZtGgRHo+HkpISrrnmmg5dui+SdIKBfS/b0SgJurJFRHpaQgWiMWPGsGjRolbv39eM1NAwm/XeZsyYEesxEkkL7VnpvpECkYhIco8hEpFWBNqxsGsjw8CMRnq2HhGRBKdAJJKKggGMfSxrE2N3NPQoiYikMQUikVTUkTFEdi3fISKiQCSSigIBsLa3h8jecIpNRCSNKRCJpCCzoz1EAa14LyLpTYFIJBUFfO2+ysyw23XKTETSngKRSCoKdOCye5tDp8xEJO0pEImkooCv/afMbHadMhORtKdAJJKK9uohCkdha3205X0ddkyfApGIpLeEmqlaRLqHGfRj7LGW2eoagwe+rKfAauGk/lEOzN1jdmq7Uz1EIpL21EMkkor2mqn6ax+cMMjO8YUmi7ft9bF3OMCvQCQi6U2BSCQVBZpedr/ZZ9A/w8BlBavRcAotxu7AVCASkTSnQCSSioKBhvmFdqkIQr7DACDfbrI9uMe+dvUQiYgoEImkolAA7LuHCEYAw2gMRLDFb+zeVxMziogoEImkJNPEMBo+3jVhyNjjk97HDt/49ghEDq1lJiKiQCSSiva4iOxbn0Ef++4NfR1m00Bks0NQgUhE0psCkUhK2h2ANvuhYI85GrOsUBnafbvxVJqISDpTIBJJcV/XGxQ6d982DGg2RaNp7r1FRCStKBCJpKLo7sizLWA06SECcFqgNtzLNYmIJDAFIpEUFzYb5h7aU1+72fRKM/UQiUiaUyASSWH+SPMwBJDvgG/3HEetQCQiaU6BSCTFmJFIw0AhYIu/4TL7vfWxm2z2NU1KpkKRiKQxBSKRVBPavdL9Nz6DAkfzoNPHDlv3PGVmtUJYg4pEJH0pEImkmuDudcy2BgwKbM0Dkd0Cgb3WM9Ns1SKSzhSIRFLNHgu7ekKQZWt5NxOINGYluwMCmpxRRNKXApFIqgkG9whEBpnWlnfLtDYs6wHsWuBVgUhE0pcCkUiqCQYwbA3dQsEoOFr5lGdZoWrXjNWG3a5TZiKS1hSIRFJN0B/rIWo2I/UeMq0mntCugdU2u06ZiUhaUyASSTV7DKpu60J6955rmmlQtYikOQUikVQTDIDNRsSEtpZtzbKZVAZ37WG3Y/oViEQkfSkQiaQYM9BwyqwmDK5WBlRD0zFEDYOqFYhEJH0pEImkmoAf7HY8oYbTYq3JskFl4xgiBSIRSXMKRCKpZlcPUXXYwGVpfRSR09Kw1hkADgUiEUlvCkQiqSbQsHRHdQgyW5mUsVHsKjS7U2OIRCStKRCJpBgz6Aebg8qQgXsfn/BYIFIPkYikOQUikVSzq4fIEwJ3C+uY7clqQCiKLrsXkbS3jw713rVmzRqeeeYZNm7cSFVVFZdddhmTJk0CIBwO8/jjj/PRRx+xY8cOMjMzGTduHGeeeSYFBQWtHnPRokUsXry4ybaBAwdy99139+RLEYmfoB/sDjwhg1J324Eoy2riCUNfLd0hImkuoQJRIBCgpKSEY445hjvvvLPJfcFgkI0bN/LDH/6QkpISamtrefDBB7n99tv5/e9/3+ZxhwwZwvXXXx+7bbGoY0xSWOMYojCtrmPWyG1tWO+s0GHFjITb3llEJIUlVCCaOHEiEydObPG+zMzMJqEG4LzzzuOaa66hoqKCvn37tnpci8VCXl5ed5Yqkrj2mJjR2tbMjDTMUxSbi6jNaRxFRFJbQgWijqqvr8cwDDIzM9vcr6ysjDlz5mC32yktLeXMM89sM0CFQiFCodhvCQzDwOVyxf4tndPYdmrDHhaNYlhsu5btaGxzYv83zd3t77aye7ZqTP1seoDe9/Gl9o+fZGv7pA1EwWCQRx55hClTprQZiEaOHMmFF17IwIEDqaqqYvHixdxwww3cddddsZCztyVLljQZdzRs2DDmzZtHYWFht7+OdFRUVBTvElLaDoeDnD4F2Gx15OY6m9yXk5Pd5PYAa4SdAZM+fTLw2u30GzCgN0tNK3rfx5faP36Spe2TMhCFw2H+8Ic/APDzn/+8zX33PAVXXFwcC0grVqzgmGOOafExp5xyCjNnzozdbky35eXlhMMaZ9FZhmFQVFREWVkZptn2YF/pvHAgwNYdlZgRC9XVQaChZygnJxuvt4YmTR+CLTUGO3fWEw0G2bZtW3yKTmF638eX2j9+EqHtbTZbuzszki4QNYahiooKbrjhhn2eLtub2+1m4MCBlJWVtbqP3W7Hbre3eJ8+UF1nmqbasUeZVIdN3FaTxvXuG0+TNTT77rZ3W6EqZDRs08+lR+l9H19q//hJlrZPqsutGsNQWVkZ119/PdnZ2ft+0F78fj9lZWUaZC0prTps7PMKMwC7Zdc8RACGBVM9oCKSphKqh6gxrDTasWMHmzZtIisri7y8PObPn8/GjRu58soriUajeDweALKysrDZGl7KLbfcwqRJk5gxYwYADz30EAcffDB9+/alqqqKRYsWYbFYOOKII3r99Yn0CtNsWLajHYEI9pqtOuAHW1ZPVSYikrASKhCtX7+em2++OXb7oYceAmDq1KmcdtppvP/++wBcccUVTR534403MmbMGAC2b9+O1+uN3VdZWcmCBQuoqakhJyeHUaNGceutt5KTk9PTL0ckbqpC4Opo/69j12zVbgUiEUk/CRWIxowZw6JFi1q9v637Gv3pT39qcvvSSy/talkiScOMRsE08YQMsvaxbEcjuwG+CDjtu3qIRETSUFKNIRKRfQiFwGanKtQwYLo93FYTTwgMm10LvIpI2lIgEkklwcZlO4z2ByJbw/Id2LXivYikLwUikVQSDIDNTm0EMtr56c60gifMrhXvdcpMRNKTApFIKtnVQ2Sau5fr2BeXBTwhGh6nHiIRSVMKRCKpJOgHq42OTIGWaTWpDjeeMqvvsdJERBKZApFIKgn4MeyODgUitxW8IcDh1BgiEUlbCkQiqSQQIGptedmZ1mRa2d1D5FMgEpH0pEAkkkqCfuptznYPqIaGwdd1EcDhwAzolJmIpCcFIpEUYvp91NoycFnaf9LMMCBq0nDKTD1EIpKmFIhEUonfR601A6elnZeY7WLCrsvuFYhEJD0pEImkEr+fWksGGdaODKvexe4Av+YhEpH0pEAkkkLMgI9aiwNnBz/ZVgNCWMCM9kxhIiIJToFIJJUEfHhxdHil+0yrSU0YOnS9vohIClEgEkklfj812HB18JSZy2JQHQYlIhFJVwpEIqkk6KfGtOFq58KujVxWk5qwAaYCkYikJwUikVQSCFBjWjt8ysxlBW+4Z0oSEUkGXQpEt912G2+99RbBYLC76hGRroiEqYtayOhgD1GmBTxB9RCJSPqydeXB27dv549//CMZGRkccsghHHXUUYwbNw6jvctsi0j3MiEcBVsHP4KZVpPyoAEWK2Y4hGHr2PIfIiLJrkuBaMGCBaxbt44333yTFStW8Oabb5KXl8cRRxzBkUceSUlJSTeVKSLtY3ZqWHSmFTxhwOGAgB8UiEQkzXQpEAGMGDGCESNGcM455/Dpp5/y5ptv8vLLL/Pss88yePBgjjrqKI444gj69OnTHfWKyD50NhB5Q0ZDIPL7wJ3d7XWJiCSyLgeiRhaLhQkTJjBhwgTq6ur461//yjvvvMOjjz7KY489xpgxYzjhhBM48MADu+spRWRvZud6iBwWCEbZNVu1lu8QkfTTbYEI4IsvvuCNN97g3Xffpba2liFDhnDUUUdhs9lYtmwZ8+bN4wc/+AFnnHFGdz6tiOwSMo1OXylhAoZNgUhE0lOXA9G3337LG2+8wdtvv01FRQW5ublMnTqVo446qskYouOPP56FCxfyv//9T4FIpAeYpkmdxdHhOYgaRQEcdgUiEUlLXQpEl19+OZs3b8Zut3PwwQfz85//nPHjx2OxtPw36pgxY3j11Ve78pQi0ppwiFqbi4xOdhGZgGlzYigQiUga6lIgcrvdzJkzh8mTJ5OZmbnP/Q855BDuvfferjyliLQm4KfW4SbD0rm5hJwW8NkzyPTVoYkzRCTddCkQXXzxxeTk5OBwOFq8PxgM4vV66du3LwBOp5PCwsKuPKWItCbgb+gh6uQps0yLideSSaavvnvrEhFJAl2aqfqiiy7ivffea/X+999/n4suuqgrTyEi7RXwU2Nz4ezkpzrTCl5rBigQiUga6tarzPYWDodbHU8kIt0sEKDWmtHhdcwaZVihxszAVCASkTTU4UBUX19Pff3uL8yamhoqKiqa7VdXV8fy5cvJy8vrUoEi0k5BP15LBoXWzo0hyrBAddQBfgUiEUk/HQ5E//3vf1m8eHHs9oMPPsiDDz7Y6v66xF6klwT81BpOhnayh8htNfFENQ+RiKSnDgei8ePHk5GRgWmaPPLII0yZMoVhw4Y12ccwDJxOJ8OHD2e//fbrtmJFpHVmwE+Nxd7peYgyrbA5YFMgEpG01OFAVFpaSmlpKQCBQIBDDz2UoUOHdnthItJBfh/15HV6ULXbCt6IBaKR7q1LRCQJdGlQ9WmnndZddYhIV/l9RC0FWDo5iZDLCjUROrc6rIhIkutQIGocO/SDH/wAi8XSZCxRW0499dSOVyYiHRPwYxqdv6rTakA4CkpEIpKOOhSInnzySQBOPvlkLBZL7Pa+KBCJ9DzT7+tSIIJd65mZCkQikn46FIieeOKJNm+LSPyYAR9kdMOiGwpEIpKGenRixo5as2YNzzzzDBs3bqSqqorLLruMSZMmxe43TZNFixbxyiuvUFdXx6hRo/j5z3/OgAED2jzuCy+8wNKlS/F4PBQXF3PeeecxYsSInn45Ir0qEAhhd3c9EEUwsJgmhqEVzUQkfXT7NNKBQIBXX32VF198kfLy8g4/tqSkhJ/97Gct3v+f//yH559/ntmzZ3PbbbfhdDq59dZbCQaDrR5z+fLlPPTQQ5x66qnMmzeP4uJibr31VqqrqztUm0iiqw1GybB2LcS4rFDnyISAv5uqEhFJDl0KRPfddx+//e1vY7fD4TDXXnstCxcu5P777+eKK65g48aN7T7exIkTmTVrVpNeoUamafLcc8/xgx/8gEMOOYTi4mIuvvhiqqqqWLlyZavHfPbZZ5k+fTpHH300gwcPZvbs2TgcDpYtW9axFyuS4OpCUTJsXfsbJ9MCXke25iISkbTTpVNmn332GUceeWTs9ltvvcU333zDL3/5S0pKSrjrrrt48sknueKKK7pc6I4dO/B4PBxwwAGxbZmZmYwYMYK1a9cyZcqUZo8Jh8Ns2LCBk08+ObbNYrEwbtw41q5d2+pzhUIhQqFQ7LZhGLhcrti/pXMa205t2DNqse9a6b55+zY2uWGAabbe/i6rSY0jCyPg18+pm+h9H19q//hJtrbvUiDyeDwUFhbGbr/33nsMHz6cI444AoDp06fzzDPPdK3CPZ4LIDc3t8n23Nzc2H1783q9RKPRZuup5eXlsXXr1lafa8mSJU2mFBg2bBjz5s1r8lql84qKiuJdQkp6z5FJnttFbm7rH+ucnOw2j5EfDON359E3y41jH2PzpGP0vo8vtX/8JEvbdykQOZ3O2EKvkUiENWvWMGPGjNj9GRkZTRaCTRannHIKM2fOjN1uTLfl5eWEw+F4lZX0DMOgqKiIsrIyTF3J1O2qIhaiAR8tDY8zjIYw5PXWtHkRmRGEHWEL5d9+gyUrr8dqTSd638eX2j9+EqHtbTZbuzszuhSIhg8fziuvvMKYMWN4//338fl8HHzwwbH7t2/f3qxHp7Mae3mqq6vJz8+Pba+urqakpKTFx+Tk5GCxWJr1IHk8nma9Rnuy2+3Y7fYW79MHqutM01Q79oAaw7FrHbPmbdt4mqyh2Vtv+0wrVFtc4KvTz6ib6X0fX2r/+EmWtu/SCMxZs2ZRXV3NVVddxeLFizn00EObXM7+3nvvsf/++3e5SIB+/fqRl5fHqlWrYtvq6+tZt25dbG21vdlsNoYPH87q1atj26LRKKtXr271MSLJqtZw4LJ07UvHbQWvJQPTn3w9uyIiXdGlHqL99tuPu+++my+//BK3283o0aNj99XV1XHcccc12bYvfr+fsrKy2O0dO3awadMmsrKy6Nu3L8cffzxPPfUUAwYMoF+/fjz++OPk5+dzyCGHxB5zyy23MGnSpNipu5kzZ/KnP/2J4cOHM2LECJ577jkCgQDTpk3ryksXSSimaVJjcVLSyZXuG2VaodpwgG9n9xQmIpIkujwxY05OTpNA0sjtdnP88cd36Fjr16/n5ptvjt1+6KGHAJg6dSoXXXQR3//+9wkEAixcuJD6+npGjRrFNddcg8PhiD1m+/bteL3e2O3DDz8cr9fLokWL8Hg8lJSUcM0117R5ykwk6QSD1FozyOjizGJOC9QZdvCph0hE0ku3zFTt8/koLy+nrq7lcQft7SUaM2YMixYtavV+wzA444wzOOOMM1rd509/+lOzbTNmzGgy2Fsk5QTq8VmdOLsYiCwGRA0LpgKRiKSZLgWimpoa7r//ft59912i0Wir+2nNM5Ee5vcRtViwdMdSZoYFNIZIRNJMlwLRwoUL+eCDD/je977HqFGjyMrK6q66RKQjumGl+0amxQI+zVQtIumlS4Hok08+4YQTTuDss8/urnpEpDN8voYg0w2sFgshv58ujs8WEUkqXfoGdTqdmr1ZJAGYPh90Uw9Rpg1qIskx1b6ISHfp0jfokUceyXvvvdddtYhIJwV89XRxXdeYTKuB13Dse0cRkRTSpVNmkydPZs2aNdx6660ce+yx9OnTB0sL3fbDhw/vytOIyD7U1gfIsDi75Vguq0mNApGIpJkuBaIbbrgh9u9PP/201f10lZlIz6r1BXF1xyVmQIYFqi0Z3XIsEZFk0aVAdMEFF3RXHSLSBbW+EE579wSihtmqu6e3SUQkWXQpEGn5C5HEUBsM43R1VyAyKbdkYEajGN105ZqISKLrtm+7qqoqNm3ahN/v765Dikg71YZMMuzdc6G82wpeuxv8motIRNJHlwPRypUrufTSSzn//PO58sorWbduHQBer5crrrhCV6GJ9IKaMLhs3ROIMq3gtbo0W7WIpJUuBaL333+fO++8k+zsbE477bQm9+Xk5FBQUMBrr73WlacQkXaoiVrJcHRPh6/dAL/FoQVeRSStdOkb9N///jejR4/m//7v/zjuuOOa3V9aWsrGjRu78hQi0g61hqPbrjIzjMblO+q65XgiIsmgS4Fo8+bNHHbYYa3en5ubi9fr7cpTiEg71FocuLpxrQ2tZyYi6abLS3e0NYh6+/btWvBVpBfUG3ac3XhBmGlYiNarh0hE0keXvkLHjBnD66+/TiQSaXafx+PhlVdeYfz48V15ChFphygG3XTGDIAMi0ldncYQiUj66FIg+tGPfkRlZSVXX301L730EgAff/wxjz/+OL/97W8BOPXUU7tepYi0yezm47ltUF0X6Oajiogkri5NzDhw4EBuueUWHnzwwdjyHEuXLgVg9OjR/OxnP6Nfv35dr1JEWmWGw5h07+r0mTYDjy/MkG49qohI4upSIAIYMmQI119/PbW1tZSVlWGaJv379ycnJ6c76hORfQn4oJtnlHbZLFR7o916TBGRRNbpQBQKhXjzzTf55JNP2L59Oz6fD5fLRVFRERMmTOCII47AZuty3hKRfQjU1WPt3g4i3A4rVaHuPaaISCLrVGLZvHkzt99+O+Xl5QBkZmaSkZGB1+tl48aNrFixgqeeeoorrriCwYMHd2vBItJUXa0Pl6V7e3PcDhvlYa1jJiLpo8OByO/3M2/ePLxeLz/60Y846qijKCgoiN1fWVnJ66+/zlNPPcW8efO44447yMjI6NaiRWS3ujo/GUb3Dqt22w2+0or3IpJGOvwn4LJly6ioqOCqq67i5JNPbhKGAAoKCjjllFO48sor2bFjh5buEOlhtfUBMrq5M8dthWqL/pARkfTR4a/RDz/8kPHjxzNmzJg29xs7diwHHHAAH3zwQaeLE5F9q/EFcFq6t4fIboGQoVNmIpI+OvyNt3nzZkaPHt2ufceOHcvmzZs7XJSItF91fZAMWzePqoZuv5RfRCSRdTgQ1dbWkpeX1659c3Nzqa2t7ehTiEgHeP1hMu3duJDZLrroXkTSSYcDUTgcbvfl9FarlXA43OGiRKT9qoNRMh3dH4gMDMKBYLcfV0QkEXXqsvsdO3awYcOGdu0nIj2rJkyPBCK3EcZbXUNBvz7dfmwRkUTTqUD0xBNPxJbqEJH4qolYcDns3X7cTEuUam+9ApGIpIUOB6ILLrigJ+oQkU4KRsGe0f2ByGWYVNf5uv24IiKJqMOBaNq0aT1Qhoh0VsMF991/iXymFTw1WvFeRNKDJhoRSXLdOwPRbm4rVPk0qFpE0oMCkYi0yO0wqKrXVaIikh4UiESSWCAcxRrtmRmDshxWPAHNRiQi6UGBSCSJef1BMs1Qjxzb5bDhVQeRiKQJBSKRJFbjrcdl6ZleHKvTSSSiHiIRSQ+dmoconi666CLKy8ubbf/ud7/Lz3/+82bbX3vtNf785z832Wa323nkkUd6rEaR3lLjrSOjmxd2jXE4MSM1PXNsEZEEk3SB6He/+x3RPcZMbN68mblz53LYYYe1+hiXy8WCBQt6ozyRXlVTFyDD0kOLsNpsmKZ6iEQkPSRdIMrJyWly++mnn6Z///6MHj261ccYhtHuBWlFkom3PkCmtacuvDewmVEC4ShOm86ui0hqS7pAtKdwOMybb77JCSecgGG0/ley3+/nwgsvxDRNhg0bxo9+9COGDBnS6v6hUIhQaPdAVcMwcLlcsX9L5zS2ndqw+1T7gmRbDaDtNm1scsMA02x/+7ujQTyBCEX27l8rLV3ofR9fav/4Sba2T+pA9N5771FXV9fm7NkDBw7kggsuoLi4mPr6ep555hmuu+465s+fT58+La/RtGTJEhYvXhy7PWzYMObNm0dhYWF3v4S0VFRUFO8SUkYgaqU4J5Pc3Ox27Z+T0779YvsbYSyZeQwYkNuZ8mQPet/Hl9o/fpKl7ZM6EC1btowJEyZQUFDQ6j6lpaWUlpY2uf3rX/+al156iVmzZrX4mFNOOYWZM2fGbjem2/LycsJhXYfcWYZhUFRURFlZGabZU6d50kt5rY9RzhDV1W0PfjaMhjDk9dbQkabPCPv46ptt9LPUd7HS9KX3fXyp/eMnEdreZrO1uzMjaQNReXk5n376KZdddlmHHmez2Rg2bBhlZWWt7mO327HbW14sUx+orjNNU+3YTWpDkJFlY18LeDSeJmto9va3fZYRoaLah2nm7HtnaZPe9/Gl9o+fZGn7pB0puWzZMnJzcznwwAM79LhoNMrmzZvJz8/vocpEek80GsHidPTY8bMtJjtrtOK9iKS+pOwhikajvPbaa0ydOhWrtelgz3vvvZeCggLOPPNMABYvXszIkSMpKiqirq6OZ555hvLycqZPnx6P0kW6VyQCDlePHT7LZlJZpwVeRST1JWUgWrVqFRUVFRx99NHN7quoqGgyor22tpaFCxfi8Xhwu90MHz6cuXPnMnjw4N4sWaRHmJEo2Huuh8htt+D1a9yciKS+pAxE48ePZ9GiRS3ed9NNNzW5fe6553Luuef2fFEivSxqmpiYYPTcmW+L3U40Eumx44uIJIqkHUMkku7qg1EyzB7uvbE7iIYViEQk9SkQiSSpmmCEjGjPrHQf43BiRMJEool/hYiISFcoEIkkqZpABFdPByK7A3c0gEfjiEQkxSkQiSQpry9IhtnDp7McTtwRP5U+BSIRSW0KRCJJyuutI6OnL4twOHGH6qlSIBKRFKdAJJKkvDU+Mnt6zVW7jaxgPTvrFYhEJLUpEIkkKW9dgEx7T3+ELWRHAgpEIpLyFIhEkpTHF8JtM/a9YxdlRf3s9PXw4G0RkThTIBJJUp5ABLej5z/CWWYQj19zEYlIalMgEklSoXAEmzOjx5/HSpRwJNrjzyMiEk8KRCJJygxHwOHs+SeyOzG1fIeIpDgFIpEkZUYi0As9RDgbAlHU1GzVIpK6FIhEklAgHMUaCfZKD5Fhd5JphqkJqJdIRFKXApFIEvL4w2RFA2DphY+ww0kWIU3OKCIpTYFIJAl5/BEyo8HeeTKHg0wt3yEiKU6BSCQJefxhMnt6YddGjgyygj5NzigiKU2BSCQJVdaHeq+HyJlBTtDLjjpNzigiqUuBSCQJeWoCZFl6aZCzM4NcX7UCkYikNAUikSRUVesjqxeW7QDA4cDt9+LRGCIRSWEKRCJJqKo+SJa9lwKRYcESjRLVNEQiksIUiESSUCAYwWG39+IzmkQBU5MzikiKUiASSULRcBgcjl59TqfVoC6kNc1EJDUpEIkkITMS7p11zPaQ67BQoYHVIpKiFIhEkkw4amIJh3tnHbNGDidZlggVmotIRFKUApFIkqn2h3GHfZDh6r0ndTjJMYPsqFUPkYikJgUikSTj8UfIDNWBs/cCkeFwkhMNaC4iEUlZCkQiScbjC5MZCfbOwq6NHA7yInUKRCKSsmzxLkBEOqbKH+69ZTsaOTLI8NVSa++l2bFFRHqZeohEkkyVL4w7GujdJ81wYdTVaHJGEUlZCkQiSaayxt9765g1ynBh1noxTZOoJmcUkRSkQCSSZDy1frLs1t59UqcL6mpxO6xU+3XaTERSjwKRSJKp84fIcPby8D+rFSJhcpxWKuo1sFpEUo8CkUiSMcNhDEcvTsq4h2yHlYo6Tc4oIqlHgUgkyUR7e5bqRqZJttNKWW0vX+EmItILFIhEkkhdMIIzHOjdWaob2Wzk2iKai0hEUpLmIRJJIhX1YbLDdZDh7v0nz3CRG/ZRXqe/o0Qk9SRVIFq0aBGLFy9usm3gwIHcfffdrT5mxYoVPPHEE5SXl1NUVMRZZ53FgQce2MOVivSMiroQ2YFacPbp9ec2nC4cvloC4exef24RkZ6WVIEIYMiQIVx//fWx25Y2li/48ssvWbBgAWeeeSYHHnggb731FnfccQfz5s1j6NChvVGuSLfaURciO1wP1jh8dB1OqK8lamZjmiaGYfR+DSIiPSTp+r4tFgt5eXmx/3Jyclrd97nnnmPChAmcdNJJDB48mFmzZjF8+HBeeOGFXqxYpPvsqAuRG/XH58kzXFBTjctu4A1oLiIRSS1J10NUVlbGnDlzsNvtlJaWcuaZZ9K3b98W9127di0zZ85ssm38+PGsXLmyN0oV6XY76kKURnzxeXJXJmZlBfl9bZTVhsjNSLqvDxGRViXVN9rIkSO58MILGThwIFVVVSxevJgbbriBu+66C5er+VU3Ho+H3NzcJttyc3PxeDxtPk8oFCIU2n0ljWEYsePrNEHnNbad2rDzanwhMi0m0LE2bGxywwDT7GT7OzMx6mrIy7BRVhNkVGFm546TZvS+jy+1f/wkW9snVSCaOHFi7N/FxcWxgLRixQqOOeaYbnueJUuWNBm8PWzYMObNm0dhYWG3PUc6KyoqincJSctmbMSZV4Art3MDm3NyOj8g2sx24/s8wLCiPlTUBRkwYECnj5WO9L6PL7V//CRL2ydVINqb2+1m4MCBlJWVtXh/Xl4e1dXVTbZVV1eTl5fX5nFPOeWUJqfaGtNteXk54bBm6e0swzAoKiqirKwMUwuEdljUNAnU1xM0LASrazr0WMNoCENebw1daXozEMAarGPt1hq2bYvDXEhJSO/7+FL7x08itL3NZmt3Z0ZSByK/309ZWRlHHnlki/eXlpayatUqTjjhhNi2Tz/9lJEjR7Z5XLvdjt1ub/E+faC6zjRNtWMnVPvCZEYaJ2XsWPs1niZraPauJCITl92g2h/Wz7CD9L6PL7V//CRL2yfVVWYPPfQQa9asYceOHXz55ZfccccdWCwWjjjiCADuvfdeHn300dj+xx9/PJ988glLly5ly5YtLFq0iPXr1zNjxox4vQSRTiuvD5ETqoXMOEzK2MgATLMrkUpEJCElVQ9RZWUlCxYsoKamhpycHEaNGsWtt94au/S+oqKiyeCt/fffn0suuYTHH3+cxx57jAEDBnD55ZdrDiJJShX1YbL8NVDU+5MyxjhcUF+H1YBAOIrTllR/U4mItCqpAtGll17a5v033XRTs22HHXYYhx12WM8UJNKLtteGyPFVQ8bguNVguDKhppo8Vzbba0MMzXPGrRYRke6kP+9EksSO2iB54Xow4vix3TU5Y16GjW1a9V5EUogCkUiSKK8LkxOvSRkbudxQ7SHfZWWLV4FIRFKHApFIkgiEwjgscZ7gLNONWVNFvsvGthoFIhFJHQpEIkkiGgpBZpxnh850g7eaXKeV8jrNySUiqUOBSCQJhKMmRjiE4YzzZIg2OwQDWC0G4aguvheR1KFAJJIEdtSGyI34wZU464cZQCiiUCQiqUGBSCQJbPEGyQ/VxHdSxhgTMxqlIFPjiEQkdSgQiSSBr6sDFPgqITMr3qXEJmfs47LxTXUg3tWIiHQLBSKRJPBNdYC+teXgiv+Cqo2TM/Z129jkUSASkdSgQCSSBCrrw2RH/CTER3bX5IyFbjub1UMkIikiAb5dRWRfotFok3X64iqzYXLGDJuF+mA03tWIiHQLBSKRBFcbiOA0Q4kxfggaJmesrgTABCK6/F5EUoACkUiC21ITpE/Uj5EQV5jREMy8HgDyMqxsrw3Ftx4RkW6gQCSS4L6pDpAf9II7O96lNLDaINwQgvpk2vnGq3FEIpL8FIhEEtw31UH61JZDVoIEIgDTxDShb6aNTVUKRCKS/BSIRBLcFm+APtXbITOBApHTCb46+rltutJMRFKCApFIgvOHTeyRIFit8S4lxsjMAk8lmQ4rXn8k3uWIiHSZApFIAmu4gssEM8Eub98ViACipknU1JVmIpLcFIhEEtiOuhB5lijEe5X7vbmzoKoCgNwMGxV14TgXJCLSNQpEIglsizdIfqQeIysn3qU0lZWLWbUTgL5uGxs9/jgXJCLSNQpEIglsbYWP/r5KyM6NdylNOZ1QXwvAgCw7ayt8cS5IRKRrFIhEEtj6Sj/9Pd8kXiBi9zIi/bMcuvReRJKeApFIAvOFoziqd0JWgizb0YSBGY5gtxr4wwk26FtEpIMUiEQS1M76EFkOK5gmCflRzcqGXeOIXHYLHr8GVotI8krAb1kRAVi3009RBmCzxbuUFhlZObBzBwD9s+xsqNTAahFJXgpEIgnqiwofA8I1GNl58S6lZTl5UF4GQFGWg692KhCJSPJSIBJJUJuqAvSv3Q7ZCXbJfaOcPMydDYFoQLad9eohEpEkpkAkkoBM0yQQiWKtKGvoiUlENjsEgwA4bRbqQlrCQ0SSlwKRSALaURciL8MGnp2QaJMy7sWMNAQhh8VCXVChSESSkwKRSAJaW+GjKMsO4TAYCfwxzcqOrWnWP8vORs1HJCJJKoG/aUXS1xcVfgbYww0zQicwIysHKrYDDYHoS81YLSJJSoFIJAFt8vgprKtI3CvMGu1xpdngXAdflCsQiUhyUiASSTA1gQgOiwXLjq2Qmx/vctqWk49Z0RCIMnYNrDZNM85FiYh0nAKRSIL5tKyO4jwn5o5tkFsQ73LaZrNDYPfl9nkZNrbXhuJYkIhI5ygQiSSYD7bWMazACfU1kOGKdzn75sjArKsFYFCOgzXl9XEuSESk4xSIRBJMWW2QfIcFkuTMk5FXAGVbABiS62D1dgUiEUk+iblIUiuWLFnCe++9x5YtW3A4HJSWlnL22WczcODAVh/z2muv8ec//7nJNrvdziOPPNLT5Yp02PbaIDlOK1RVJO4M1XvL74u55WuM/fYnL8OqU2YikpSSKhCtWbOG4447jv32249IJMJjjz3G3LlzmT9/PhkZGa0+zuVysWDBgl6sVKRzPt5WR3FeBuzYnPhXmDXKK4B1nwNgGAYOq4XaYIQshzXOhYmItF9SnTK79tprmTZtGkOGDKGkpISLLrqIiooKNmzY0ObjDMMgLy+vyX8iieijbfUMy3dgln0LeX3iXU77WKwQDtF4cdnAHDtrNR+RiCSZpOoh2lt9fcNYhaysrDb38/v9XHjhhZimybBhw/jRj37EkCFDeqNEkXaLRE2q/WHcDivRnTtgv1HxLqn93FkNy4zk92FIrpNV2+s5cGDbn0sRkUSStIEoGo3y4IMPsv/++zN06NBW9xs4cCAXXHABxcXF1NfX88wzz3Ddddcxf/58+vRp+S/wUChEKLR7HIRhGLhcrti/pXMa205t2LLPdtQzNG/XzNSRCBjdd8qpsckNA0yz+9vfKCiEbzZi5PdlQJaD5Ztr9HPeRe/7+FL7x0+ytX3SBqL777+fb775hltuuaXN/UpLSyktLW1y+9e//jUvvfQSs2bNavExS5YsYfHixbHbw4YNY968eRQWFnZP8WmuqKgo3iUkpPs/+ZzDRg4gP1JHbV4+rtzsbn+OnJzuPyZA1FFK4JP3yD16BgBOZy05fQpxO5L2K6bb6X0fX2r/+EmWtk/Kb6v777+fDz/8kJtvvrnVXp7W2Gw2hg0bRllZWav7nHLKKcycOTN2uzHdlpeXEw6HO1e0YBgGRUVFlJWVaTbjvURNk7VlHib1t1P51RpwZRGsrum24xtGQxjyemvoqaY3Kyup2FmBgUGRC176eD2HDkmSK+V6kN738aX2j59EaHubzdbuzoykCkSmafLAAw/w3nvvcdNNN9GvX78OHyMajbJ582YmTpzY6j52ux273d5qDdI1pmmqHffyRXk9g3IcmJiY277ByM2nOyciajxN1tDsPdT2ObmY5duhsD/DC5ys3FLLpME90yOVjPS+jy+1f/wkS9snVSC6//77eeutt7jiiitwuVx4PB4AMjMzcTgcANx7770UFBRw5plnArB48WJGjhxJUVERdXV1PPPMM5SXlzN9+vR4vQyRZt7cVMP+fXdNHVG+DYYMi29BnWD0LYKNX0Fhf/q4bGzxBuNdkohIuyVVIHrxxRcBuOmmm5psv/DCC5k2bRoAFRUVTQZw1dbWsnDhQjweD263m+HDhzN37lwGDx7cW2WLtMk0TTZU+Zk8xN2wIRQCa1J9NBsUFmF+tAJj0hEYhkGO08r22iD9sxzxrkxEZJ+S6lt30aJF+9xn77B07rnncu655/ZMQSLdYF2ln6IsO4ZhYNZ4k2P9spbY7BAKYYZCGHY7JXkZfLi1ju+VKhCJSOJLqokZRVLRi+s8jO2f2XBj27cYib7CfRuMwv6wuWGi1OEFTj7aVhfnikRE2keBSCSOQhGTb6uD9M9qGMRvbt0MBX3jXFUXDBiK+dVnALjsDUt4hCKJP5hSRESBSCSOPthaw/AC5+4NFWWQxD1EZOVAVUXs0v7iPCeflNXGtyYRkXZQIBKJo1c3eGOny0wTCIfBkuQfy9x82LENgNH9XLyxqfvmUxIR6SlJ/s0rkrxqAhH84ejuVeE9O8Gd/PP2GP0Hw67TZnkZNirqQzptJiIJT4FIJE6WbaxmdGHm7g3bvsXIS+LTZY369sP8dlPs5rA8Jx9t02kzEUlsCkQicWCaJss317B/Ycbubd9uhD4dn3094RgWyMjArK4G4Dv9XLyxyRvnokRE2qZAJBIHa8p9DMi2Y7PssQp01U7ISv5TZgBG0RD4ajUAuRk2Kn1hgpFonKsSEWmdApFIHPz3yyomDnDHbpt+/67ZqY3WH5RM+g/E3Lg2dnNEQQbvfKPB1SKSuBSIRHqZxx+mNhgh37XHRPFbN2Mk8/xDe9sV7kyfD4ADijJ5eX11fGsSEWmDApFIL3vxKw/ji9xNtpmbN6TG+KE9GP0HwfovAHDaLGQ5rGys8se5KhGRlikQifSiUCTK+1trGdHH2fSOHVshFa4w29PAwZjr1sRuHjzIzX8+r4xjQSIirVMgEulFr2yoZmy/TCzG7rFCZjDU8A8jxT6Ojgzw+zDDYQAK3XYq6sPUBCJxLkxEpLkU+wYWSVyRqMmyDV7GFWU2veObDRh9U+t0WSOjXxFsWh+7PaHIzfNrq+JYkYhIyxSIRHrJ8s1eRhQ4m15qD5jrPoeiwXGqqocNGIq59tPYzZF9nXywtY7aoHqJRCSxKBCJ9IKoafLcWg8HDtprMLUJVJZDVm58Cutp7myo9mBGGgKQxTA4bEgWi1fvjHNhIiJNKRCJ9IJXN1QzvMCJw7rXR66yvGGF+BRmFPaHbzbFbg8vcPJVpZ9KXzh+RYmI7EWBSKSH+UJRXlzn4ZBBWc3vXP85Rv8BvV9UbxpYjPn5x7GbhmFwxNAsHvmkPH41iYjsRYFIpIctWl3B5MHZWC3NZ6E2138J/QbGoapelJUDnkrM6O6lOwbnOvH6I3xRXh/HwkREdlMgEulB22qCrNvpZ2TfjGb3mdu3QnYuWKxxqKx3GYX94et1TbYdOyKHf3xUTkhrnIlIAlAgEukhoYjJve9s4/+NaHnAtPnpSozi/Xq5qjgZMhxz1QdNNmXarUwc4OaJVRVxKkpEZDcFIpEe8q+PdzCuyN10zbJdzHAYKnZAborNTt0al7thkka/r8nm0YUZrKsMsLZCp85EJL4UiER6wPtbatleG2JMP1fLO3y4HGPI8N4tKs6MgUPhi1VNtxkGx5fm8fcPdmgGaxGJKwUikW62tqKef3+2k+NGtnKqzO/DXPcFDC3p3cLibVAx5uefNMy9tAeX3cL04XksWLGN6N53ioj0EgUikW70bXWA+z/YwSmjC7DvPefQLubbr2KMHEPaffysNow+/WD9F83uGphjZ3COg4c+0qX4IhIfafaNLNJzNlb5ueedbZz8nQJc9lbC0FefQ0019E/xS+1bM3x/zA+XN+slAjhokJvqQJj/fF7Z+3WJSNpTIBLpBh9vq+WvK7fzw9EFZDlbvozeLNuK+f5bGOMn9XJ1CcThbJhqYP3nLd599LAcPttRz6vrPb1bl4ikPQUikS4wTZNnv6zk6c+rOG1sAZmOVsLQl6sxX3sO45AjwJr68w61xRh1AOa7bzS74gx2D7J+d0stT63Remci0nsUiEQ6KRCO8ofl2/imOsgpo/NbHDNk7iwn+vTDmOu/xJg8DRzNJ2hMO1YbxnfGY770TIunzqwWgxNK8yirCXLfe2WauFFEeoUCkUgnbKzyc8Or37BffgZHFGdjMXYvy2FGo5gb1hJ96l+Yb/4Po3QsxtgD02JG6nbr2x8jOwfzlaUthiLDMDiyJIe+mTauf+UbzVMkIj2u+YxxItKqSNTkP59X8tG2Ok7+Tj5Ze5wiM+vr4eN3MTd9hVFY1BCCMjLjWG2CGz4KY93nmP9dBP/v+xhOZ7NdRhW6GJrrYPFnlTisVZwxri9DcpvvJyLSVQpEIu20xRvkL++VsV9BBqeNLcDY1Stk1tdhLn8FKiswSkZiHDEddb6204jvYJRvx1z8D5h8NMZ++zfbJdNh5cRR+VTUhfjXx+VETZPjRuRx4MCsFhfMFRHpDAUikX0IhKM8vqqCdTv9fHdkLnkZDR8bMxqFD5ZjrvscY9QBUDouzpUmqcL+GPnHYH7xKeaqlRjTjsfIa76kSV+3nRNH5VMXjPDB1joWf7aTiQPczCjNj/1MREQ6S98iIq0IRaK8tL6a1zdWM2lwNqeP6xO7zywvw3zlWYwBQzCmHIN6hLrIZscYexDUVGO+9B/M/L4Yh0/HyGx+ytHtsDKlOJvDhmaxoTLA/Le30jfTxmlj+zIg2xGH4kUkFSgQiexlR22IVzd4+HBbHeP6Z/KjA/rGTs2YwRDmildhxzaMiZMbFi2V7pOdi3HoNCgvw3z2ccysHIzScTBwcMN4LNMEfz14dmJU7mQ/bxX7mVAWLODvK3xkuDI4Y1xfhuZpnJGIdIwCkaQ10zSp9kfY5AnwSVkdX+3047JZGNPfxVnj+8auHjOjUfjsY8xP38PY7ztw6NQ4V57iCoswCoug1gvfrMdctRJCAcAAhwMjMxsys8DtBsOgqK6Sk8pWsdORzcO+yUQdTk4ozWf8AHeTKwBFRFqTlIHohRdeYOnSpXg8HoqLiznvvPMYMWJEq/uvWLGCJ554gvLycoqKijjrrLM48MADe7FiiYeoaeINRKisD+Pxh6n0hdlZ3/j/EMGISdRsWFy0b6aNobkOxhcVNBmoawYCsPpDzC8/xSgagnH4sWk/sWKvysqBrBz2GWkK+mEMGU7fmmpO+Ox56gbux/Kvx/PE6p0MyXVw8MAshuQ6KXTbYvNF+cNRqnxhKuvDbK8LUlYTotLX8F4JRRrmAnBYLfTLsjMox8HoQhdD85wKWCIpKukC0fLly3nooYeYPXs2I0eO5L///S+33nord999N7m5zVcX//LLL1mwYAFnnnkmBx54IG+99RZ33HEH8+bNY+jQoXF4BdKdoqbJjtoQGz0BNnsCfFsdwOOPAGACmXYLWQ4LbocVt91CttNKUZaLbKe79cVXTWDL15ifroSaaozBJQ1ByKJxQgkvOxdj8jSyNm/giHeegEnTqCwczmc76nnr6xq8gTDhXfMe2S0GWQ4LWQ4ruRlW8lxWhuQ5cNut2K0NoScYieLxR9hZF2bJ55WU14XIdlo5dHAWBw/MIkeDuUVSRtJ9mp999lmmT5/O0UcfDcDs2bP58MMPWbZsGSeffHKz/Z977jkmTJjASSedBMCsWbNYtWoVL7zwAr/4xS96s3TpItM02VEX4qudfr4o97G5OkAkCnkuK4WZdvq4bRxenI3bboldEt/+YwMVZZhrPoEtX0N+H4ySkQ09FJJkDBi6H8bAofDVGgpWvk7BoBKMoftBvz6QlY3Rzl4+h9VCP7eFfm473+nnAqAuGOGrCj9vbtpGKGqyf98MxvZ3M7Igo9V17EQk8SVVIAqHw2zYsKFJ8LFYLIwbN461a9e2+Ji1a9cyc+bMJtvGjx/PypUre7LUuDNNE3/YxOMPU+Vr+K+8LkxFfQiPP0xNIILJriBgAGZDj4phNNw0gAy7hbwMG/kZVvJcNvIybGQ5rLjsFpw2AwsGhgER0yQcMQlHIRw1iUR3/QluNPwV7rAauOwWMh1W+oYjmDXVmJs3YG74EnPTV9C4ppVpYhoGdRYnlXY3Fdn92eLqxxZLFmWmg0jUJCfioyhYzVBfBQdFahuu7TKjDYXvelrTMBr+6cpquHw7rwByciEzGxon/wsHobYGyndglm0GbzXk5Db8Eh127K4WkKRms8N3xmOYUagsh3VrMH214PNhmlEwdvX4xabKbvww7NIYqg0DbDawNHxduswoB5gmBxgQsTnYur0PK9cVsNSWTcCWgcXhxLBaGj9WGIDdUUYgEGhy2AxbQ9AamONgSK6DQTlO8jOsHQ7zItI9kioQeb1eotEoeXl5Tbbn5eWxdevWFh/j8XianUrLzc3F4/G0+jyhUIhQKBS7bRgGLpcLm637mytqwiaPn0iEXQHFJErDqaBo1CRsmoQjEIqaBCNRgmETfziKPxzBH/u3iS8cxdz1xd54HJvFgttuweWw4LJZcDvsjMxy4rZbcdqMNn/lm0A4YlIfjlIfiuIPRfimJkIgEiIUjhLy+Rp+kZhgEMVimljNCJZoBCMShkgYMxIhGokSMSGEhaBhI2T5kqhhAUsmRsbBMOZQwGDP1RucFpNMi4nbDJETCXAAAY4g1PCLwp4F9gKwjtz9m6XFF2BCONxwRVLABzvKILQZs3FdLKuBYXeC04XxnQPBmeJrjBkNp3+w2WjS2Omi32DoN7hzMdc0d4WmyK4NjX8ymNgiJkPDQYYGAxDYCX4/Zk09RCMN709HBobbjcOVT9BtAbsdrDYwLIRMg9qwD2+FySfb4PWwhfooGKaJYTZ8puxmw3GiFgshY9f8V43vexNMTIxd9Zm7/qoxDKPhs2IYYLFgGJZdJe/atuvzZhiNfxDtbpUmIc4AmwE2i4l1jz+UGr6fIGJCxDQaPt97vKfMvY7T+L206/IEnEaUTCOK2wyRGQngCgdwhX04wgHs0TB2olgtFiwOOxaHE4vTCQ4nhs2OYbOD1RJ7HRBtKCQahlAYQkEI+Bv+CwYww0GMaJRv7PaGU6UOBzhckJEBdseun0fjMa0Ns2cUFGIk4JqD5l43TBp+TzT+PxI1iZgNf5SGIyahqEkoEiUYNQlFGu6Pmg0/D8MwsFjAahjYrQZ2i4HdYsFhNbAYBlYLWIzd75GoCZEou34fmYSiUUK7nidsmkT3WG7QYgGbYWC3Nhwvt6qMoN+PzQI2i4HNYjS8nwwDC7ver7seV5KfgbWb/x7oyO/tpApEvWXJkiUsXrw4dnvKlCn86le/Ij8/v0eer3+/HjmsiIiItFNSjRLNycnBYrE0693xeDzNeo0a5eXlUV1d3WRbdXV1q/sDnHLKKTz44IOx/2bPnt2kx0g6x+fzceWVV+Lz+eJdStpR28eP2j6+1P7xk2xtn1SByGazMXz4cFavXh3bFo1GWb16NaWlpS0+prS0lFWrVjXZ9umnnzJy5MhWn8dut5OZmdnkP7vd3j0vIo2ZpsnGjRtjXejSe9T28aO2jy+1f/wkW9snVSACmDlzJq+88gqvvfYa3377LX//+98JBAJMmzYNgHvvvZdHH300tv/xxx/PJ598wtKlS9myZQuLFi1i/fr1zJgxI06vQERERBJN0o0hOvzww/F6vSxatAiPx0NJSQnXXHNN7BRYRUVFk6s09t9/fy655BIef/xxHnvsMQYMGMDll1+uOYhEREQkJukCEcCMGTNa7eG56aabmm077LDDOOyww3q4KtkXu93OqaeeqtOPcaC2jx+1fXyp/eMn2dreMJPl5J6IiIhID0m6MUQiIiIi3U2BSERERNKeApGIiIikPQUiERERSXtJeZWZJIfa2loeeOABPvjgAwzD4NBDD+WnP/0pGRktrxNUW1vLokWL+OSTT6ioqCAnJ4dDDjmEWbNmkZmZ2cvVJ58XXniBpUuX4vF4KC4u5rzzzmPEiBGt7r9ixQqeeOIJysvLKSoq4qyzzuLAAw/sxYpTR0fa/uWXX+aNN97gm2++AWD48OH86Ec/avNnJW3r6Hu/0dtvv82CBQs4+OCDueKKK3qh0tTT0bavq6vjscce47333qO2tpbCwkLOOeechPjuUQ+R9Jh77rmHb775huuuu46rrrqKzz//nIULF7a6f2VlJZWVlfz4xz/mrrvu4qKLLuKTTz7hvvvu68Wqk9Py5ct56KGHOPXUU5k3bx7FxcXceuutzZatafTll1+yYMECjjnmGObNm8chhxzCHXfcwebNm3u58uTX0bZfs2YNU6ZM4cYbb2Tu3Ln06dOHuXPnUllZ2cuVp4aOtn+jHTt28K9//YvvfOc7vVRp6ulo24fDYebOnUt5eTm/+c1vuPvuu5kzZw4FBQW9XHnLFIikR3z77bd8/PHHnH/++YwcOZJRo0Zx3nnnsXz58la/+IcOHcpll13GwQcfTFFREWPHjmXWrFl88MEHRCKRFh8jDZ599lmmT5/O0UcfzeDBg5k9ezYOh4Nly5a1uP9zzz3HhAkTOOmkkxg8eDCzZs1i+PDhvPDCC71cefLraNtfcsklHHfccZSUlDBo0CDOP/98TNNstsSQtE9H2x8alnz64x//yOmnn06/flpdu7M62vavvvoqtbW1XH755YwaNYp+/foxevRoSkpKerfwVigQSY9Yu3Ytbreb/fbbL7Zt3LhxGIbBunXr2n2c+vp6XC4XVqu1J8pMCeFwmA0bNjBu3LjYNovFwrhx41i7dm2Lj1m7dm2T/QHGjx/PV1991aO1pprOtP3eAoEA4XCYrKysniozZXW2/RcvXkxOTg7HHHNMb5SZkjrT9h988AEjR47k/vvvZ/bs2fz2t7/lqaeeIhqN9lbZbVIgkh7h8XjIyclpss1qtZKVlYXH42nXMbxeL//+97859thje6DC1OH1eolGo7Hlaxrl5eW12tYej4fc3Nwm23Jzc9v9s5EGnWn7vT3yyCMUFBQ0C6iyb51p/y+++IJXX32VOXPm9HyBKawzbb99+3beffddotEoV199NT/84Q959tln+fe//93zBbeDBlVLhzzyyCP85z//aXOfP/zhD11+nvr6en7/+98zePBgTjvttC4fTyQRPf3007z99tvcdNNNOByOeJeT8nw+H3/84x+ZM2dOsz/YpOeZpklOTg5z5szBYrEwfPhwKisreeaZZxLie16BSDrkxBNPZNq0aW3u079/f/Ly8vB6vU22RyIRamtrm/1FsTefz8dtt92Gy+Xisssuw2bT27QtOTk5WCyWZn+VeTyeVts6Ly+v2cDH6urqff5spKnOtH2jZ555hqeffprrr7+e4uLinisyhXW0/bdv3055eTnz5s2LbWtcvWrWrFncfffdFBUV9WTJKaOz3zs2mw2LZffJqUGDBuHxeAiHw3H/rtdvGumQnJycdv1lVVpaSl1dHRs2bGD48OEArF69GtM027wks76+nltvvRW73c4VV1yhv5rbwWazMXz4cFavXs2kSZOAhkGjq1evbnUR5NLSUlatWsUJJ5wQ2/bpp58ycuTIXqk5VXSm7QH+85//8NRTT3Httdc2GWcnHdPR9h84cCB33nlnk22PP/44fr+fc889l759+/ZK3amgM+/9/fffn7fffptoNBoLRdu2bSM/Pz/uYQg0hkh6yODBg5kwYQILFy5k3bp1fPHFFzzwwAMcfvjhsUssKysrufTSS2ODrBvDUCAQ4Pzzz8fn8+HxePB4PAkz6C5RzZw5k1deeYXXXnuNb7/9lr///e8EAoFYb969997Lo48+Gtv/+OOP55NPPmHp0qVs2bKFRYsWsX79+jZ/iUvLOtr2Tz/9NE888QQXXHAB/fr1i73H/X5/nF5BcutI+zscDoYOHdrkP7fbTUZGBkOHDk2IX8rJpKPv/e9+97vU1tby4IMPsnXrVj788EOWLFnCcccdF6dX0JR++tJjLrnkEu6//35uueWW2MSM5513Xuz+cDjM1q1bCQQCAGzcuDF2ldMll1zS5Fj33nuvLo9tw+GHH47X62XRokV4PB5KSkq45pprYl3XFRUVGIYR23///ffnkksu4fHHH+exxx5jwIABXH755QwdOjROryB5dbTtX3rpJcLhMPPnz29ynFNPPZXTTz+9N0tPCR1tf+k+HW37vn37cu211/LPf/6Tyy+/nIKCAr73ve9x8sknx+cF7MUwG0+gioiIiKQpnTITERGRtKdAJCIiImlPgUhERETSngKRiIiIpD0FIhEREUl7CkQiIiKS9hSIREREJO0pEImIdNFnn33G6aefzmeffRbvUkSkkzRTtYgkpfbO6nzjjTcyZsyYNvd56qmnGDx4cGxNJhFJPwpEIpKULr744ia333jjDT799NNm2wcNGrTPYy1ZsoTJkycrEImkMQUiEUlKRx11VJPbX331FZ9++mmz7SIi7aFAJCIpy+/3s2jRIlasWEF1dTWFhYVMnz6dE088MbboZOOpt9dff53XX38dgKlTp3LRRRdRXl7Of/7zH1atWkVFRQVOp5OxY8dy9tlna7FhkRSjQCQiKck0TW6//XY+++wzjj76aEpKSvjkk094+OGHqays5NxzzwUaTr0tXLiQESNGMH36dACKiooAWL9+PV9++SVTpkyhoKCA8vJyXnzxRW6++Wbmz5+P0+mM18sTkW6mQCQiKen9999n9erVzJo1ix/84AcAzJgxg/nz5/P8888zY8YMioqKOOqoo/jb3/5Gv379mp1uO/DAA5k8eXKTbQcddBDXXXcd7777rk7PiaQQXXYvIinpo48+wmKx8L3vfa/J9pkzZ2KaJh9//PE+j+FwOGL/DofD1NTUUFRUhNvtZsOGDd1dsojEkXqIRCQllZeXk5+fj8vlarJ98ODBsfv3JRgMsmTJEl577TUqKysxTTN2X319ffcWLCJxpUAkItKKBx54gGXLlnHCCSdQWlpKZmYmAAsWLGgSjkQk+SkQiUhKKiwsZNWqVfh8via9RFu2bInd36jxirO9vfPOO0ydOpWf/OQnsW3BYJC6uroeqlpE4kVjiEQkJU2cOJFoNMoLL7zQZPt///tfDMNgwoQJsW1Op7PFkGOxNP+KfOGFF4hGo91er4jEl3qIRCQlHXTQQYwZM4bHH3+c8vJyiouL+eSTT3j//fc5/vjjY5fWAwwfPpxVq1bx7LPPkp+fT79+/Rg5ciQHHnggb7zxBpmZmQwePJi1a9eyatUqsrOz4/jKRKQnKBCJSEqyWCxceeWVPPHEEyxfvpxly5bRr18/zj77bE488cQm+55zzjksXLiQxx9/nGAwyNSpUxk5ciQ//elPsVgsvPnmm4RCIfbff3+uv/56br311ji9KhHpKYapkYEiIiKS5jSGSERERNKeApGIiIikPQUiERERSXsKRCIiIpL2FIhEREQk7SkQiYiISNpTIBIREZG0p0AkIiIiaU+BSERERNKeApGIiIikPQUiERERSXsKRCIiIpL2FIhEREQk7f1/yTHBk+JzAhcAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import seaborn as sns\n", - "sns.kdeplot(option_aggregator_smooth._equity.Total.ewm(span=2).mean().pct_change().dropna(), label=\"Raw\", fill=True)\n", - "sns.kdeplot(smooth_returns, label=\"Smoothed\", fill=True)\n", - "plt.title(\"Return Distribution\")\n", - "plt.legend()\n", - "plt.show()\n" - ] - }, - { - "cell_type": "code", - "execution_count": 276, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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PXoUn332GXbt2oUdO3YYVclU6z2Ty/R7Ys+5f+TIkVi/fj327dunr8KolpSUFDRt2hRxcXFo2bIlgoKCULx4cf381NRUtGrVCg8ePECbNm3g5eWF9evXY8yYMUhKSjI6Vy5atAjvvvsuwsPD0aFDB+TLlw+PHj3Cf//9h6VLl2LIkCGqxU3cGCckB2ratCkHwBcvXmzXejdv3uQAOAA+duxYs/krVqzgAHi1atX4s2fP9NOfP3/Oa9SowQHw3377TT+9a9euHAA/ffq02bZiYmL0jzds2MAB8JEjR5otl5yczJ8+fSor/kGDBnEA/NNPP5W1vM6tW7e4j48Pz507N7948aLRvPfee48D4O+8847R9EaNGnEAvHLlykavRc781NRUXrJkSe7r68v37t1rNO/+/fu8YMGCPDw8nCclJemnT5w4kQPge/bsMVr+2rVrZvtOT0/nb775JgfAjx49ajSvf//+HAC/efOm5LHQxW3I3vedc67/HL311ls8LS1NP/38+fNco9Hw8uXLS+5fSrFixTgAXr9+faNjEhsby0uUKMEB8H379umnX758mXt7e/OSJUvye/fuGW1r586dXBAE3rlzZ5uvW2fXrl0cAP/oo4/007Zt28YB8BYtWnAARu9D586dOQB+584d/TTd+zds2DCj45GWlqb/3K5fv16V11C9enUeGxurn/78+XNesmRJLggCj4qKknyNpnTxTpw40Wh6Wloab9Wqlf61GEpKSuJ3794121Z8fDyvWLEiDw0N5YmJifrpahxXa6S+G8nJybxp06bcy8vL7Ljae/xu3rzJvb29eWhoqNH3KT09XX/uk3sZ8vz5c/3n/LXXXuNLlizh586dM/qsmDI8X0+bNs1o3pQpUzgAHhoayt99912enp6un7d8+XLJ8+3gwYM5AD548GAuiqJ++pUrV3hQUBD38fExep1KzwuNGjWy+XomTZpkNE/3uWjTpo3R9KVLl3IAvEuXLkafLc4zP8Nz5swx2oda7xnnmZ8Z0/Pyo0ePeEREBAfA165dq5+u5rnfNAYpuuOzdOlSo+m6z1qzZs348+fPzdbTzW/Tpo3RcX348CEPDg7mwcHBPCUlRT+9evXq3MfHhz98+NBsW1K/jyR7oqSL5Ejly5fnAPjWrVvtWk/3o1egQAGjk75O8+bNOQC+fft2s3k7d+7kAHiTJk30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Pn0stldaWmp3gUlERI7HoouIiDzOTz/9hMjISMyZM8eiJeezzz6zWK5NmzY4cuQIKisrLVq78vPzbXqd2pargoICxMbGKvPbtm0LWZZx4cIFi9at2mvAro01KSnJ4hqsqqoqlJaW1lu2d+/eCAsLw86dO9GlSxdUVlYq13zVFR4ejpEjR2LkyJG4dOkSnn76aWzYsMGi6KqurkZRURH69etn03slIiL18JouIiLyOLUtP3Vbik6cOIGsrCyL5RITE1FdXY3t27cr88xmM7Zt22bT63Ts2BFarRanTp2ymF9b3GzZssVi/rXTdWOt66uvvoLZbK43X6PRYMiQIdi9ezd27NiB2NhYxMXFWcRet0siALRs2RLh4eEwmUwW88+dOwej0YiuXbs28S6JiEhtbOkiIiK39N133+HgwYP15o8ZMwb9+vXDnj178Nprr6Fv374oKCjAv/71L8TExFjcDHjAgAHo3LkzVq9ejfz8fERHR2P//v0oKSmxKQZ/f3/06tULmZmZmDRpkjK/Q4cOGDJkCL7++muUlZWha9euyMzMtNq1sW/fvvj3v/+N4OBgxMTEICsrC5mZmUrXxWslJSVh69atOHr0KKZMmWLxXHl5OR5++GHcfPPNiIuLQ2BgIDIzM3Hq1CmLljQAOHz4MAICAtCrVy+b3isREamHRRcREbmlr7/+2ur8oUOHYujQoTAYDPjmm29w6NAhxMTE4LHHHsPu3btx7NgxZVlJkvDMM89g1apV+P777yGEwIABA3Dvvfdi3rx5FiMLNuT222/H66+/jqKiIrRp00aZ/8gjjyAsLAw//PAD9u7dix49euCZZ55RhquvlZqaCkmSlJsod+3aFfPmzcOiRYusvl7Hjh3Rvn17nDt3zmLUQgAICAjAyJEjcejQIezZswdmsxl6vR4zZszAiBEjLJb96aefMGDAAAQFBTX5HomISF1CvvYqXiIiIi9X20q2YMECdOvWrdFlzWYznnzySQwaNEgZVVBtc+fORWhoKF544YVmrZ+Tk4Onn34aixcvRocOHRwbHBER2Y3XdBERkVerqqqymDabzfjqq68QFBSEjh07Nrm+JEmYNGkStm3bZtF1US2nTp1CTk6O1QE0bPXFF19g4MCBLLiIiNwEW7qIiMirvfvuu6iqqkJCQgKMRiP27NmD48eP47777sOECRNcHZ7izJkzyM7OxubNm3HlyhX87W9/s6n7IxERuT9e00VERF6tR48e2LRpE/bv3w+j0Qi9Xo/p06dj1KhRrg7Nwk8//YTPP/8c0dHRSEtLY8FFRORF2NJFRERERESkIl7TRUREREREpCIWXURERERERCpi0UVERERERKQiFl1EREREREQqYtFFRERERESkIhZdREREREREKmLRRUREREREpCIWXURERERERCr6P8qssNZAu4uDAAAAAElFTkSuQmCC", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "from scipy.signal import correlate\n", - "\n", - "# Step 1: Trim both series to same length\n", - "min_len = min(len(raw_returns), len(smooth_returns))\n", - "raw = raw_returns[:min_len]\n", - "smooth = smooth_returns[:min_len]\n", - "\n", - "# Step 2: Compute cross-correlation\n", - "lag_corr = correlate(raw, smooth, mode='full')\n", - "lags = np.arange(-min_len + 1, min_len)\n", - "\n", - "# Step 3: Plot\n", - "plt.figure(figsize=(10, 5))\n", - "plt.plot(lags, lag_corr)\n", - "plt.axvline(0, color='gray', linestyle='--', label=\"Zero Lag\")\n", - "plt.title(\"Cross-Correlation between Raw and Smoothed Returns\")\n", - "plt.xlabel(\"Lag (days)\")\n", - "plt.ylabel(\"Correlation strength\")\n", - "plt.legend()\n", - "plt.grid(True)\n", - "plt.show()\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2017-01-06 11.32\n", - "2017-01-09 11.56\n", - "2017-01-10 11.49\n", - "2017-01-11 11.26\n", - "2017-01-12 11.54\n", - " ... \n", - "2025-02-26 19.10\n", - "2025-02-27 21.13\n", - "2025-02-28 19.63\n", - "2025-03-03 22.78\n", - "2025-03-04 23.51\n", - "Name: close, Length: 2050, dtype: float64" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "vix = Stock(\"^VIX\")\n", - "vix_spot = vix.spot(ts = True,\n", - " ts_start = smooth_returns.index.min(), \n", - " ts_end = smooth_returns.index.max()).close\n", - "vix_spot" - ] - }, - { - "cell_type": "code", - "execution_count": 269, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " OLS Regression Results \n", - "==============================================================================\n", - "Dep. Variable: Total R-squared: 0.000\n", - "Model: OLS Adj. R-squared: -0.000\n", - "Method: Least Squares F-statistic: 0.1431\n", - "Date: Tue, 01 Jul 2025 Prob (F-statistic): 0.705\n", - "Time: 21:18:13 Log-Likelihood: 1904.7\n", - "No. Observations: 1985 AIC: -3805.\n", - "Df Residuals: 1983 BIC: -3794.\n", - "Df Model: 1 \n", - "Covariance Type: nonrobust \n", - "==============================================================================\n", - " coef std err t P>|t| [0.025 0.975]\n", - "------------------------------------------------------------------------------\n", - "const 0.0049 0.005 0.904 0.366 -0.006 0.016\n", - "close 0.0001 0.000 0.378 0.705 -0.000 0.001\n", - "==============================================================================\n", - "Omnibus: 2104.906 Durbin-Watson: 2.784\n", - "Prob(Omnibus): 0.000 Jarque-Bera (JB): 198249.862\n", - "Skew: 5.092 Prob(JB): 0.00\n", - "Kurtosis: 50.888 Cond. No. 52.4\n", - "==============================================================================\n", - "\n", - "Notes:\n", - "[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n" - ] - } - ], - "source": [ - "import statsmodels.api as sm\n", - "\n", - "vix_spot = vix_spot[vix_spot.index.isin(raw_returns.index)]\n", - "raw_returns_use = raw_returns[raw_returns.index.isin(vix_spot.index)]\n", - "smooth_returns_use = smooth_returns[smooth_returns.index.isin(vix_spot.index)]\n", - "X = sm.add_constant(vix_spot[vix_spot.index.isin(raw_returns.index)])\n", - "y = raw_returns_use - smooth_returns_use\n", - "model = sm.OLS(y, X).fit()\n", - "print(model.summary())\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Trade Analysis Comparison" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Finding Notes\n", - "\n", - "- Index 31 `&L:TSLA20210716C1990&S:TSLA20210716C1995`: A lot of pretty erratic moves in underlying Midpoint. \n", - "- Index 25 `&L:TSLA20210319C1590&S:TSLA20210319C1600`: Similar issue to Index 31\n", - "- Index 25: `&L:TSLA20210319C945&S:TSLA20210319C950`: Sizing discrepancy significant driver of change\n", - "- Index 19: `&L:AAPL20201218C315&S:AAPL20201218C320`: Volatility Driving this" - ] - }, - { - "cell_type": "code", - "execution_count": 214, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(18.795239581397542, 1.796542199890148)" - ] - }, - "execution_count": 214, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "smooth_rm =option_aggregator_smooth.backtesters[7].portfolio.risk_manager\n", - "rm =option_aggregator_zscore2_dte270_roll120.backtesters[7].portfolio.risk_manager\n", - "pm =option_aggregator_smooth.backtesters[7].portfolio\n", - "trades_df = rm.unadjusted_signals\n", - "trades_df[trades_df.Ticker == 'NVDA']\n", - "rm.greek_limits['delta']['TSLA20200612LONG'], smooth_rm.greek_limits['delta']['TSLA20200612LONG']" - ] - }, - { - "cell_type": "code", - "execution_count": 224, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(1.689879706214999, 1.689879706214999)" - ] - }, - "execution_count": 224, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rm.sizer.signal_starting_cash['TSLA20200612LONG'], smooth_rm.sizer.signal_starting_cash['TSLA20200612LONG'] \n" - ] - }, - { - "cell_type": "code", - "execution_count": 235, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
EntryTimeExitTimeTradeIDPnLEntryPriceExitPriceEntryQuantitySignalIDTickerPnL_smoothEntryPrice_smoothExitPrice_smoothEntryQuantity_smooth
02020-01-062020-03-04&L:META20200918C270&S:META20200918C280-2,293.70119.9156.1034META20200106LONGMETA-1,751.58106.4555.9833
12020-01-062020-03-16&L:AAPL20200918C380&S:AAPL20200918C390-1,488.92100.5179.3359AAPL20200106LONGAAPL-1,009.0095.6780.1755
22020-01-062020-03-18&L:NVDA20210115C315&S:NVDA20210115C320-3,617.90105.1498.70281NVDA20200106LONGNVDA-434.2794.8197.35291
32020-01-062020-01-23&L:TSLA20200918C490&S:TSLA20200918C5002,188.93288.34538.359TSLA20200106LONGTSLA1,565.14323.38551.367
42020-01-062020-03-20&L:AMD20200717C60&S:AMD20200717C65-7,747.69105.7549.23130AMD20200106LONGAMD-5,876.93103.5459.29124
52020-01-102020-03-02&L:COST20200717C325&S:COST20200717C3301,636.41120.78171.0039COST20200110LONGCOST1,318.10122.65162.2437
62020-01-172020-01-31&L:SBUX20210115C97.5&S:SBUX20210115C100-3,138.87101.8654.8562SBUX20200117LONGSBUX-2,769.60100.9156.5558
72020-01-232020-02-05&L:TSLA20200918C755&S:TSLA20200918C7603,719.13102.46184.4348TSLA20200106LONGTSLA3,831.29109.72223.9537
82020-01-272020-03-17&L:NFLX20200918C430&S:NFLX20200918C435925.6399.37120.2854NFLX20200127LONGNFLX-283.00104.59105.3650
92020-02-042020-03-02&L:AMZN20200918C2065&S:AMZN20200918C2070641.94138.46168.5825AMZN20200204LONGAMZN381.66134.88160.6624
102020-02-052020-03-18&L:TSLA20200918C895&S:TSLA20200918C900-3,097.40111.2741.9443TSLA20200106LONGTSLA-6,570.46212.5252.1639
112020-03-042020-03-13&L:COST20201016C370&S:COST20201016C375153.65112.79129.5113COST20200304LONGCOST220.6788.81110.4412
122020-03-172020-03-18&L:AAPL20201016C335&S:AAPL20201016C340240.9096.30106.2033AAPL20200317LONGAAPL36.1596.0799.8331
132020-03-192020-03-20&L:NVDA20210115C240&S:NVDA20210115C24515,155.40148.84246.07175NVDA20200319LONGNVDA7,384.12147.95192.89179
142020-03-192020-03-25&L:COST20201016C390&S:COST20201016C395-3,117.4298.5015.8036COST20200319LONGCOST-988.1988.9260.6632
152020-03-202020-04-09&L:AMD20210115C42&S:AMD20210115C45652.23147.37169.0343AMD20200106LONGAMD1,023.11134.30160.3854
162020-03-232020-05-08&L:NVDA20201218C265&S:NVDA20201218C27066,496.10119.39301.69375NVDA20200323LONGNVDA39,155.81138.66298.63262
172020-03-252020-07-09&L:NFLX20201120C430&S:NFLX20201120C43511,732.75133.74293.3781NFLX20200325LONGNFLX10,362.02140.91297.7469
182020-04-092020-08-04&L:AMD20210115C50&S:AMD20210115C52.56,782.77104.30208.5070AMD20200106LONGAMD6,061.47110.24197.8979
192020-04-162020-04-23&L:AAPL20201218C315&S:AAPL20201218C3201,295.43117.14138.6975AAPL20200416LONGAAPL-222.54142.36141.7058
202020-04-172020-09-01&L:AMZN20210219C3000&S:AMZN20210219C302038,944.44109.24692.8170AMZN20200417LONGAMZN24,127.81262.08793.4348
212020-05-072020-08-27&L:META20210115C260&S:META20210115C2652,894.68107.62287.9618META20200507LONGMETA3,353.44104.12281.4621
222020-05-082020-08-13&L:NVDA20201218C395&S:NVDA20201218C400178,385.46117.76312.57964NVDA20200323LONGNVDA133,120.58106.64296.17736
232020-05-112020-08-21&L:AAPL20210115C410&S:AAPL20210115C42025,087.0986.95438.7576AAPL20200511LONGAAPL18,643.8589.14414.4560
242020-06-122020-07-02&L:TSLA20210319C945&S:TSLA20210319C9504,605.55152.00279.4038TSLA20200612LONGTSLA516.04195.66251.9910
252020-07-022020-08-26&L:TSLA20210319C1590&S:TSLA20210319C160032,332.28110.85474.2197TSLA20200612LONGTSLA4,150.39180.86497.9214
262020-07-092020-09-18&L:NFLX20210115C670&S:NFLX20210115C680-11,226.00142.1582.98179NFLX20200325LONGNFLX-9,901.47141.7481.77152
272020-07-162020-12-18&L:COST20210416C370&S:COST20210416C3752,980.00135.22235.3933COST20200716LONGCOST3,908.93119.30221.1240
282020-08-042020-11-20&L:AMD20210319C87.5&S:AMD20210319C90-2,576.33101.8589.85144AMD20200106LONGAMD-2,003.45100.8390.80156
292020-08-132020-09-03&L:NVDA20210319C490&S:NVDA20210319C495102,270.16169.92231.121777NVDA20200323LONGNVDA80,867.13172.74243.621264
302020-08-212020-12-18&L:AAPL20210416C560&S:AAPL20210416C565-821.68126.34128.70295AAPL20200511LONGAAPL1,698.34125.39138.06222
312020-08-262020-10-15&L:TSLA20210716C1990&S:TSLA20210716C199533,149.53116.65211.91396TSLA20200612LONGTSLA-295.97188.84185.8937
322020-08-272021-01-04&L:META20210618C370&S:META20210618C375-1,246.8981.1965.4560META20200507LONGMETA-2,603.8790.8553.9765
332020-08-312020-12-07&L:SBUX20210416C87.5&S:SBUX20210416C902,415.51100.93172.5642SBUX20200831LONGSBUX2,790.51103.77177.4440
342020-09-012020-09-21&L:AMZN20210115C4950&S:AMZN20210115C5000-29,167.59289.2146.05117AMZN20200417LONGAMZN-21,579.67294.4241.9782
352020-09-032021-01-04&L:NVDA20210618C660&S:NVDA20210618C680-41,961.88372.77341.231100NVDA20200323LONGNVDA-113,392.75465.85308.41660
362020-09-182021-01-04&L:NFLX20210618C610&S:NFLX20210618C6203,669.14172.78227.0886NFLX20200325LONGNFLX2,002.00192.00234.6964
372020-09-212021-01-04&L:AMZN20210618C3150&S:AMZN20210618C31602,318.50374.90419.3569AMZN20200417LONGAMZN220.47395.08409.0244
382020-10-152020-12-09&L:TSLA20210618C530&S:TSLA20210618C53536,390.63135.94205.74618TSLA20200612LONGTSLA4,711.01135.16236.1651
392020-11-202021-01-04&L:AMD20210618C100&S:AMD20210618C1054,384.88101.97143.56127AMD20200106LONGAMD2,693.55115.14147.86122
402020-11-252021-01-04&L:BA20210618C275&S:BA20210618C280-2,963.12109.2469.3768BA20201125LONGBA-2,275.06103.8473.3267
412020-12-072021-01-04&L:SBUX20210716C115&S:SBUX20210716C1201,719.43100.73130.7365SBUX20200831LONGSBUX1,173.40101.58125.7263
422020-12-182021-01-04&L:COST20210716C415&S:COST20210716C4202,983.39106.05165.8654COST20200716LONGCOST1,507.72111.13141.6665
\n", - "
" - ], - "text/plain": [ - " EntryTime ExitTime TradeID PnL \\\n", - "0 2020-01-06 2020-03-04 &L:META20200918C270&S:META20200918C280 -2,293.70 \n", - "1 2020-01-06 2020-03-16 &L:AAPL20200918C380&S:AAPL20200918C390 -1,488.92 \n", - "2 2020-01-06 2020-03-18 &L:NVDA20210115C315&S:NVDA20210115C320 -3,617.90 \n", - "3 2020-01-06 2020-01-23 &L:TSLA20200918C490&S:TSLA20200918C500 2,188.93 \n", - "4 2020-01-06 2020-03-20 &L:AMD20200717C60&S:AMD20200717C65 -7,747.69 \n", - "5 2020-01-10 2020-03-02 &L:COST20200717C325&S:COST20200717C330 1,636.41 \n", - "6 2020-01-17 2020-01-31 &L:SBUX20210115C97.5&S:SBUX20210115C100 -3,138.87 \n", - "7 2020-01-23 2020-02-05 &L:TSLA20200918C755&S:TSLA20200918C760 3,719.13 \n", - "8 2020-01-27 2020-03-17 &L:NFLX20200918C430&S:NFLX20200918C435 925.63 \n", - "9 2020-02-04 2020-03-02 &L:AMZN20200918C2065&S:AMZN20200918C2070 641.94 \n", - "10 2020-02-05 2020-03-18 &L:TSLA20200918C895&S:TSLA20200918C900 -3,097.40 \n", - "11 2020-03-04 2020-03-13 &L:COST20201016C370&S:COST20201016C375 153.65 \n", - "12 2020-03-17 2020-03-18 &L:AAPL20201016C335&S:AAPL20201016C340 240.90 \n", - "13 2020-03-19 2020-03-20 &L:NVDA20210115C240&S:NVDA20210115C245 15,155.40 \n", - "14 2020-03-19 2020-03-25 &L:COST20201016C390&S:COST20201016C395 -3,117.42 \n", - "15 2020-03-20 2020-04-09 &L:AMD20210115C42&S:AMD20210115C45 652.23 \n", - "16 2020-03-23 2020-05-08 &L:NVDA20201218C265&S:NVDA20201218C270 66,496.10 \n", - "17 2020-03-25 2020-07-09 &L:NFLX20201120C430&S:NFLX20201120C435 11,732.75 \n", - "18 2020-04-09 2020-08-04 &L:AMD20210115C50&S:AMD20210115C52.5 6,782.77 \n", - "19 2020-04-16 2020-04-23 &L:AAPL20201218C315&S:AAPL20201218C320 1,295.43 \n", - "20 2020-04-17 2020-09-01 &L:AMZN20210219C3000&S:AMZN20210219C3020 38,944.44 \n", - "21 2020-05-07 2020-08-27 &L:META20210115C260&S:META20210115C265 2,894.68 \n", - "22 2020-05-08 2020-08-13 &L:NVDA20201218C395&S:NVDA20201218C400 178,385.46 \n", - "23 2020-05-11 2020-08-21 &L:AAPL20210115C410&S:AAPL20210115C420 25,087.09 \n", - "24 2020-06-12 2020-07-02 &L:TSLA20210319C945&S:TSLA20210319C950 4,605.55 \n", - "25 2020-07-02 2020-08-26 &L:TSLA20210319C1590&S:TSLA20210319C1600 32,332.28 \n", - "26 2020-07-09 2020-09-18 &L:NFLX20210115C670&S:NFLX20210115C680 -11,226.00 \n", - "27 2020-07-16 2020-12-18 &L:COST20210416C370&S:COST20210416C375 2,980.00 \n", - "28 2020-08-04 2020-11-20 &L:AMD20210319C87.5&S:AMD20210319C90 -2,576.33 \n", - "29 2020-08-13 2020-09-03 &L:NVDA20210319C490&S:NVDA20210319C495 102,270.16 \n", - "30 2020-08-21 2020-12-18 &L:AAPL20210416C560&S:AAPL20210416C565 -821.68 \n", - "31 2020-08-26 2020-10-15 &L:TSLA20210716C1990&S:TSLA20210716C1995 33,149.53 \n", - "32 2020-08-27 2021-01-04 &L:META20210618C370&S:META20210618C375 -1,246.89 \n", - "33 2020-08-31 2020-12-07 &L:SBUX20210416C87.5&S:SBUX20210416C90 2,415.51 \n", - "34 2020-09-01 2020-09-21 &L:AMZN20210115C4950&S:AMZN20210115C5000 -29,167.59 \n", - "35 2020-09-03 2021-01-04 &L:NVDA20210618C660&S:NVDA20210618C680 -41,961.88 \n", - "36 2020-09-18 2021-01-04 &L:NFLX20210618C610&S:NFLX20210618C620 3,669.14 \n", - "37 2020-09-21 2021-01-04 &L:AMZN20210618C3150&S:AMZN20210618C3160 2,318.50 \n", - "38 2020-10-15 2020-12-09 &L:TSLA20210618C530&S:TSLA20210618C535 36,390.63 \n", - "39 2020-11-20 2021-01-04 &L:AMD20210618C100&S:AMD20210618C105 4,384.88 \n", - "40 2020-11-25 2021-01-04 &L:BA20210618C275&S:BA20210618C280 -2,963.12 \n", - "41 2020-12-07 2021-01-04 &L:SBUX20210716C115&S:SBUX20210716C120 1,719.43 \n", - "42 2020-12-18 2021-01-04 &L:COST20210716C415&S:COST20210716C420 2,983.39 \n", - "\n", - " EntryPrice ExitPrice EntryQuantity SignalID Ticker PnL_smooth \\\n", - "0 119.91 56.10 34 META20200106LONG META -1,751.58 \n", - "1 100.51 79.33 59 AAPL20200106LONG AAPL -1,009.00 \n", - "2 105.14 98.70 281 NVDA20200106LONG NVDA -434.27 \n", - "3 288.34 538.35 9 TSLA20200106LONG TSLA 1,565.14 \n", - "4 105.75 49.23 130 AMD20200106LONG AMD -5,876.93 \n", - "5 120.78 171.00 39 COST20200110LONG COST 1,318.10 \n", - "6 101.86 54.85 62 SBUX20200117LONG SBUX -2,769.60 \n", - "7 102.46 184.43 48 TSLA20200106LONG TSLA 3,831.29 \n", - "8 99.37 120.28 54 NFLX20200127LONG NFLX -283.00 \n", - "9 138.46 168.58 25 AMZN20200204LONG AMZN 381.66 \n", - "10 111.27 41.94 43 TSLA20200106LONG TSLA -6,570.46 \n", - "11 112.79 129.51 13 COST20200304LONG COST 220.67 \n", - "12 96.30 106.20 33 AAPL20200317LONG AAPL 36.15 \n", - "13 148.84 246.07 175 NVDA20200319LONG NVDA 7,384.12 \n", - "14 98.50 15.80 36 COST20200319LONG COST -988.19 \n", - "15 147.37 169.03 43 AMD20200106LONG AMD 1,023.11 \n", - "16 119.39 301.69 375 NVDA20200323LONG NVDA 39,155.81 \n", - "17 133.74 293.37 81 NFLX20200325LONG NFLX 10,362.02 \n", - "18 104.30 208.50 70 AMD20200106LONG AMD 6,061.47 \n", - "19 117.14 138.69 75 AAPL20200416LONG AAPL -222.54 \n", - "20 109.24 692.81 70 AMZN20200417LONG AMZN 24,127.81 \n", - "21 107.62 287.96 18 META20200507LONG META 3,353.44 \n", - "22 117.76 312.57 964 NVDA20200323LONG NVDA 133,120.58 \n", - "23 86.95 438.75 76 AAPL20200511LONG AAPL 18,643.85 \n", - "24 152.00 279.40 38 TSLA20200612LONG TSLA 516.04 \n", - "25 110.85 474.21 97 TSLA20200612LONG TSLA 4,150.39 \n", - "26 142.15 82.98 179 NFLX20200325LONG NFLX -9,901.47 \n", - "27 135.22 235.39 33 COST20200716LONG COST 3,908.93 \n", - "28 101.85 89.85 144 AMD20200106LONG AMD -2,003.45 \n", - "29 169.92 231.12 1777 NVDA20200323LONG NVDA 80,867.13 \n", - "30 126.34 128.70 295 AAPL20200511LONG AAPL 1,698.34 \n", - "31 116.65 211.91 396 TSLA20200612LONG TSLA -295.97 \n", - "32 81.19 65.45 60 META20200507LONG META -2,603.87 \n", - "33 100.93 172.56 42 SBUX20200831LONG SBUX 2,790.51 \n", - "34 289.21 46.05 117 AMZN20200417LONG AMZN -21,579.67 \n", - "35 372.77 341.23 1100 NVDA20200323LONG NVDA -113,392.75 \n", - "36 172.78 227.08 86 NFLX20200325LONG NFLX 2,002.00 \n", - "37 374.90 419.35 69 AMZN20200417LONG AMZN 220.47 \n", - "38 135.94 205.74 618 TSLA20200612LONG TSLA 4,711.01 \n", - "39 101.97 143.56 127 AMD20200106LONG AMD 2,693.55 \n", - "40 109.24 69.37 68 BA20201125LONG BA -2,275.06 \n", - "41 100.73 130.73 65 SBUX20200831LONG SBUX 1,173.40 \n", - "42 106.05 165.86 54 COST20200716LONG COST 1,507.72 \n", - "\n", - " EntryPrice_smooth ExitPrice_smooth EntryQuantity_smooth \n", - "0 106.45 55.98 33 \n", - "1 95.67 80.17 55 \n", - "2 94.81 97.35 291 \n", - "3 323.38 551.36 7 \n", - "4 103.54 59.29 124 \n", - "5 122.65 162.24 37 \n", - "6 100.91 56.55 58 \n", - "7 109.72 223.95 37 \n", - "8 104.59 105.36 50 \n", - "9 134.88 160.66 24 \n", - "10 212.52 52.16 39 \n", - "11 88.81 110.44 12 \n", - "12 96.07 99.83 31 \n", - "13 147.95 192.89 179 \n", - "14 88.92 60.66 32 \n", - "15 134.30 160.38 54 \n", - "16 138.66 298.63 262 \n", - "17 140.91 297.74 69 \n", - "18 110.24 197.89 79 \n", - "19 142.36 141.70 58 \n", - "20 262.08 793.43 48 \n", - "21 104.12 281.46 21 \n", - "22 106.64 296.17 736 \n", - "23 89.14 414.45 60 \n", - "24 195.66 251.99 10 \n", - "25 180.86 497.92 14 \n", - "26 141.74 81.77 152 \n", - "27 119.30 221.12 40 \n", - "28 100.83 90.80 156 \n", - "29 172.74 243.62 1264 \n", - "30 125.39 138.06 222 \n", - "31 188.84 185.89 37 \n", - "32 90.85 53.97 65 \n", - "33 103.77 177.44 40 \n", - "34 294.42 41.97 82 \n", - "35 465.85 308.41 660 \n", - "36 192.00 234.69 64 \n", - "37 395.08 409.02 44 \n", - "38 135.16 236.16 51 \n", - "39 115.14 147.86 122 \n", - "40 103.84 73.32 67 \n", - "41 101.58 125.72 63 \n", - "42 111.13 141.66 65 " - ] - }, - "execution_count": 235, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "smooth_pnl = option_aggregator_smooth.backtesters[7].portfolio.trades.copy()[['TradeID', 'PnL', 'EntryPrice', 'ExitPrice', 'EntryQuantity']]\n", - "pnl = option_aggregator_zscore2_dte270_roll120.backtesters[7].portfolio.trades.copy()[['EntryTime','ExitTime','TradeID', 'PnL', 'EntryPrice', 'ExitPrice', 'EntryQuantity', 'SignalID', 'Ticker']]\n", - "pnl = pnl.merge(smooth_pnl, on='TradeID', suffixes=('', '_smooth'))\n", - "pnl" - ] - }, - { - "cell_type": "code", - "execution_count": 244, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
TradeIDPnLPnL_smoothABS_Pct_DiffEntryPriceEntryPrice_smoothabs_entry_price_diffExitPriceExitPrice_smooth
20&L:AMZN20210219C3000&S:AMZN20210219C302038,944.4424,127.810.38109.24262.081.40692.81793.43
10&L:TSLA20200918C895&S:TSLA20200918C900-3,097.40-6,570.461.12111.27212.520.9141.9452.16
25&L:TSLA20210319C1590&S:TSLA20210319C160032,332.284,150.390.87110.85180.860.63474.21497.92
31&L:TSLA20210716C1990&S:TSLA20210716C199533,149.53-295.971.01116.65188.840.62211.91185.89
24&L:TSLA20210319C945&S:TSLA20210319C9504,605.55516.040.89152.00195.660.29279.40251.99
35&L:NVDA20210618C660&S:NVDA20210618C680-41,961.88-113,392.751.70372.77465.850.25341.23308.41
19&L:AAPL20201218C315&S:AAPL20201218C3201,295.43-222.541.17117.14142.360.22138.69141.70
11&L:COST20201016C370&S:COST20201016C375153.65220.670.44112.7988.810.21129.51110.44
16&L:NVDA20201218C265&S:NVDA20201218C27066,496.1039,155.810.41119.39138.660.16301.69298.63
39&L:AMD20210618C100&S:AMD20210618C1054,384.882,693.550.39101.97115.140.13143.56147.86
3&L:TSLA20200918C490&S:TSLA20200918C5002,188.931,565.140.28288.34323.380.12538.35551.36
32&L:META20210618C370&S:META20210618C375-1,246.89-2,603.871.0981.1990.850.1265.4553.97
27&L:COST20210416C370&S:COST20210416C3752,980.003,908.930.31135.22119.300.12235.39221.12
0&L:META20200918C270&S:META20200918C280-2,293.70-1,751.580.24119.91106.450.1156.1055.98
36&L:NFLX20210618C610&S:NFLX20210618C6203,669.142,002.000.45172.78192.000.11227.08234.69
2&L:NVDA20210115C315&S:NVDA20210115C320-3,617.90-434.270.88105.1494.810.1098.7097.35
14&L:COST20201016C390&S:COST20201016C395-3,117.42-988.190.6898.5088.920.1015.8060.66
22&L:NVDA20201218C395&S:NVDA20201218C400178,385.46133,120.580.25117.76106.640.09312.57296.17
15&L:AMD20210115C42&S:AMD20210115C45652.231,023.110.57147.37134.300.09169.03160.38
7&L:TSLA20200918C755&S:TSLA20200918C7603,719.133,831.290.03102.46109.720.07184.43223.95
18&L:AMD20210115C50&S:AMD20210115C52.56,782.776,061.470.11104.30110.240.06208.50197.89
37&L:AMZN20210618C3150&S:AMZN20210618C31602,318.50220.470.90374.90395.080.05419.35409.02
17&L:NFLX20201120C430&S:NFLX20201120C43511,732.7510,362.020.12133.74140.910.05293.37297.74
8&L:NFLX20200918C430&S:NFLX20200918C435925.63-283.001.3199.37104.590.05120.28105.36
40&L:BA20210618C275&S:BA20210618C280-2,963.12-2,275.060.23109.24103.840.0569.3773.32
1&L:AAPL20200918C380&S:AAPL20200918C390-1,488.92-1,009.000.32100.5195.670.0579.3380.17
42&L:COST20210716C415&S:COST20210716C4202,983.391,507.720.49106.05111.130.05165.86141.66
21&L:META20210115C260&S:META20210115C2652,894.683,353.440.16107.62104.120.03287.96281.46
33&L:SBUX20210416C87.5&S:SBUX20210416C902,415.512,790.510.16100.93103.770.03172.56177.44
9&L:AMZN20200918C2065&S:AMZN20200918C2070641.94381.660.41138.46134.880.03168.58160.66
23&L:AAPL20210115C410&S:AAPL20210115C42025,087.0918,643.850.2686.9589.140.03438.75414.45
4&L:AMD20200717C60&S:AMD20200717C65-7,747.69-5,876.930.24105.75103.540.0249.2359.29
34&L:AMZN20210115C4950&S:AMZN20210115C5000-29,167.59-21,579.670.26289.21294.420.0246.0541.97
29&L:NVDA20210319C490&S:NVDA20210319C495102,270.1680,867.130.21169.92172.740.02231.12243.62
5&L:COST20200717C325&S:COST20200717C3301,636.411,318.100.19120.78122.650.02171.00162.24
28&L:AMD20210319C87.5&S:AMD20210319C90-2,576.33-2,003.450.22101.85100.830.0189.8590.80
6&L:SBUX20210115C97.5&S:SBUX20210115C100-3,138.87-2,769.600.12101.86100.910.0154.8556.55
41&L:SBUX20210716C115&S:SBUX20210716C1201,719.431,173.400.32100.73101.580.01130.73125.72
30&L:AAPL20210416C560&S:AAPL20210416C565-821.681,698.343.07126.34125.390.01128.70138.06
13&L:NVDA20210115C240&S:NVDA20210115C24515,155.407,384.120.51148.84147.950.01246.07192.89
38&L:TSLA20210618C530&S:TSLA20210618C53536,390.634,711.010.87135.94135.160.01205.74236.16
26&L:NFLX20210115C670&S:NFLX20210115C680-11,226.00-9,901.470.12142.15141.740.0082.9881.77
12&L:AAPL20201016C335&S:AAPL20201016C340240.9036.150.8596.3096.070.00106.2099.83
\n", - "
" - ], - "text/plain": [ - " TradeID PnL PnL_smooth \\\n", - "20 &L:AMZN20210219C3000&S:AMZN20210219C3020 38,944.44 24,127.81 \n", - "10 &L:TSLA20200918C895&S:TSLA20200918C900 -3,097.40 -6,570.46 \n", - "25 &L:TSLA20210319C1590&S:TSLA20210319C1600 32,332.28 4,150.39 \n", - "31 &L:TSLA20210716C1990&S:TSLA20210716C1995 33,149.53 -295.97 \n", - "24 &L:TSLA20210319C945&S:TSLA20210319C950 4,605.55 516.04 \n", - "35 &L:NVDA20210618C660&S:NVDA20210618C680 -41,961.88 -113,392.75 \n", - "19 &L:AAPL20201218C315&S:AAPL20201218C320 1,295.43 -222.54 \n", - "11 &L:COST20201016C370&S:COST20201016C375 153.65 220.67 \n", - "16 &L:NVDA20201218C265&S:NVDA20201218C270 66,496.10 39,155.81 \n", - "39 &L:AMD20210618C100&S:AMD20210618C105 4,384.88 2,693.55 \n", - "3 &L:TSLA20200918C490&S:TSLA20200918C500 2,188.93 1,565.14 \n", - "32 &L:META20210618C370&S:META20210618C375 -1,246.89 -2,603.87 \n", - "27 &L:COST20210416C370&S:COST20210416C375 2,980.00 3,908.93 \n", - "0 &L:META20200918C270&S:META20200918C280 -2,293.70 -1,751.58 \n", - "36 &L:NFLX20210618C610&S:NFLX20210618C620 3,669.14 2,002.00 \n", - "2 &L:NVDA20210115C315&S:NVDA20210115C320 -3,617.90 -434.27 \n", - "14 &L:COST20201016C390&S:COST20201016C395 -3,117.42 -988.19 \n", - "22 &L:NVDA20201218C395&S:NVDA20201218C400 178,385.46 133,120.58 \n", - "15 &L:AMD20210115C42&S:AMD20210115C45 652.23 1,023.11 \n", - "7 &L:TSLA20200918C755&S:TSLA20200918C760 3,719.13 3,831.29 \n", - "18 &L:AMD20210115C50&S:AMD20210115C52.5 6,782.77 6,061.47 \n", - "37 &L:AMZN20210618C3150&S:AMZN20210618C3160 2,318.50 220.47 \n", - "17 &L:NFLX20201120C430&S:NFLX20201120C435 11,732.75 10,362.02 \n", - "8 &L:NFLX20200918C430&S:NFLX20200918C435 925.63 -283.00 \n", - "40 &L:BA20210618C275&S:BA20210618C280 -2,963.12 -2,275.06 \n", - "1 &L:AAPL20200918C380&S:AAPL20200918C390 -1,488.92 -1,009.00 \n", - "42 &L:COST20210716C415&S:COST20210716C420 2,983.39 1,507.72 \n", - "21 &L:META20210115C260&S:META20210115C265 2,894.68 3,353.44 \n", - "33 &L:SBUX20210416C87.5&S:SBUX20210416C90 2,415.51 2,790.51 \n", - "9 &L:AMZN20200918C2065&S:AMZN20200918C2070 641.94 381.66 \n", - "23 &L:AAPL20210115C410&S:AAPL20210115C420 25,087.09 18,643.85 \n", - "4 &L:AMD20200717C60&S:AMD20200717C65 -7,747.69 -5,876.93 \n", - "34 &L:AMZN20210115C4950&S:AMZN20210115C5000 -29,167.59 -21,579.67 \n", - "29 &L:NVDA20210319C490&S:NVDA20210319C495 102,270.16 80,867.13 \n", - "5 &L:COST20200717C325&S:COST20200717C330 1,636.41 1,318.10 \n", - "28 &L:AMD20210319C87.5&S:AMD20210319C90 -2,576.33 -2,003.45 \n", - "6 &L:SBUX20210115C97.5&S:SBUX20210115C100 -3,138.87 -2,769.60 \n", - "41 &L:SBUX20210716C115&S:SBUX20210716C120 1,719.43 1,173.40 \n", - "30 &L:AAPL20210416C560&S:AAPL20210416C565 -821.68 1,698.34 \n", - "13 &L:NVDA20210115C240&S:NVDA20210115C245 15,155.40 7,384.12 \n", - "38 &L:TSLA20210618C530&S:TSLA20210618C535 36,390.63 4,711.01 \n", - "26 &L:NFLX20210115C670&S:NFLX20210115C680 -11,226.00 -9,901.47 \n", - "12 &L:AAPL20201016C335&S:AAPL20201016C340 240.90 36.15 \n", - "\n", - " ABS_Pct_Diff EntryPrice EntryPrice_smooth abs_entry_price_diff \\\n", - "20 0.38 109.24 262.08 1.40 \n", - "10 1.12 111.27 212.52 0.91 \n", - "25 0.87 110.85 180.86 0.63 \n", - "31 1.01 116.65 188.84 0.62 \n", - "24 0.89 152.00 195.66 0.29 \n", - "35 1.70 372.77 465.85 0.25 \n", - "19 1.17 117.14 142.36 0.22 \n", - "11 0.44 112.79 88.81 0.21 \n", - "16 0.41 119.39 138.66 0.16 \n", - "39 0.39 101.97 115.14 0.13 \n", - "3 0.28 288.34 323.38 0.12 \n", - "32 1.09 81.19 90.85 0.12 \n", - "27 0.31 135.22 119.30 0.12 \n", - "0 0.24 119.91 106.45 0.11 \n", - "36 0.45 172.78 192.00 0.11 \n", - "2 0.88 105.14 94.81 0.10 \n", - "14 0.68 98.50 88.92 0.10 \n", - "22 0.25 117.76 106.64 0.09 \n", - "15 0.57 147.37 134.30 0.09 \n", - "7 0.03 102.46 109.72 0.07 \n", - "18 0.11 104.30 110.24 0.06 \n", - "37 0.90 374.90 395.08 0.05 \n", - "17 0.12 133.74 140.91 0.05 \n", - "8 1.31 99.37 104.59 0.05 \n", - "40 0.23 109.24 103.84 0.05 \n", - "1 0.32 100.51 95.67 0.05 \n", - "42 0.49 106.05 111.13 0.05 \n", - "21 0.16 107.62 104.12 0.03 \n", - "33 0.16 100.93 103.77 0.03 \n", - "9 0.41 138.46 134.88 0.03 \n", - "23 0.26 86.95 89.14 0.03 \n", - "4 0.24 105.75 103.54 0.02 \n", - "34 0.26 289.21 294.42 0.02 \n", - "29 0.21 169.92 172.74 0.02 \n", - "5 0.19 120.78 122.65 0.02 \n", - "28 0.22 101.85 100.83 0.01 \n", - "6 0.12 101.86 100.91 0.01 \n", - "41 0.32 100.73 101.58 0.01 \n", - "30 3.07 126.34 125.39 0.01 \n", - "13 0.51 148.84 147.95 0.01 \n", - "38 0.87 135.94 135.16 0.01 \n", - "26 0.12 142.15 141.74 0.00 \n", - "12 0.85 96.30 96.07 0.00 \n", - "\n", - " ExitPrice ExitPrice_smooth \n", - "20 692.81 793.43 \n", - "10 41.94 52.16 \n", - "25 474.21 497.92 \n", - "31 211.91 185.89 \n", - "24 279.40 251.99 \n", - "35 341.23 308.41 \n", - "19 138.69 141.70 \n", - "11 129.51 110.44 \n", - "16 301.69 298.63 \n", - "39 143.56 147.86 \n", - "3 538.35 551.36 \n", - "32 65.45 53.97 \n", - "27 235.39 221.12 \n", - "0 56.10 55.98 \n", - "36 227.08 234.69 \n", - "2 98.70 97.35 \n", - "14 15.80 60.66 \n", - "22 312.57 296.17 \n", - "15 169.03 160.38 \n", - "7 184.43 223.95 \n", - "18 208.50 197.89 \n", - "37 419.35 409.02 \n", - "17 293.37 297.74 \n", - "8 120.28 105.36 \n", - "40 69.37 73.32 \n", - "1 79.33 80.17 \n", - "42 165.86 141.66 \n", - "21 287.96 281.46 \n", - "33 172.56 177.44 \n", - "9 168.58 160.66 \n", - "23 438.75 414.45 \n", - "4 49.23 59.29 \n", - "34 46.05 41.97 \n", - "29 231.12 243.62 \n", - "5 171.00 162.24 \n", - "28 89.85 90.80 \n", - "6 54.85 56.55 \n", - "41 130.73 125.72 \n", - "30 128.70 138.06 \n", - "13 246.07 192.89 \n", - "38 205.74 236.16 \n", - "26 82.98 81.77 \n", - "12 106.20 99.83 " - ] - }, - "execution_count": 244, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "pnl['ABS_Pct_Diff'] = (pnl.PnL - pnl.PnL_smooth).abs() / pnl.PnL.abs()\n", - "pnl['abs_entry_price_diff'] = (pnl.EntryPrice - pnl.EntryPrice_smooth).abs() / pnl.EntryPrice.abs()\n", - "pnl['abs_exit_price_diff'] = (pnl.ExitPrice - pnl.ExitPrice_smooth).abs() / pnl.ExitPrice.abs()\n", - "pnl.sort_values(by=['abs_entry_price_diff', 'abs_entry_price_diff'], ascending=[False, True])[['TradeID', 'PnL', 'PnL_smooth','ABS_Pct_Diff','EntryPrice','EntryPrice_smooth','abs_entry_price_diff','ExitPrice','ExitPrice_smooth']]" - ] - }, - { - "cell_type": "code", - "execution_count": 251, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2020-04-17 00:00:00 2020-09-01 00:00:00\n", - "EntryTime 2020-04-17 00:00:00\n", - "ExitTime 2020-09-01 00:00:00\n", - "TradeID &L:AMZN20210219C3000&S:AMZN20210219C3020\n", - "PnL 38,944.44\n", - "EntryPrice 109.24\n", - "ExitPrice 692.81\n", - "EntryQuantity 70\n", - "SignalID AMZN20200417LONG\n", - "Ticker AMZN\n", - "PnL_smooth 24,127.81\n", - "EntryPrice_smooth 262.08\n", - "ExitPrice_smooth 793.43\n", - "EntryQuantity_smooth 48\n", - "ABS_Pct_Diff 0.38\n", - "abs_entry_price_diff 1.40\n", - "abs_exit_price_diff 0.15\n", - "Name: 20, dtype: object\n" - ] - }, - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "hovertemplate": "variable=Midpoint
Datetime=%{x}
value=%{y}", - "legendgroup": "Midpoint", - "line": { - "color": "#636efa", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "Midpoint", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": [ - "2020-04-17T00:00:00", - "2020-04-20T00:00:00", - "2020-04-21T00:00:00", - "2020-04-22T00:00:00", - "2020-04-23T00:00:00", - "2020-04-24T00:00:00", - "2020-04-27T00:00:00", - "2020-04-28T00:00:00", - "2020-04-29T00:00:00", - "2020-04-30T00:00:00", - "2020-05-01T00:00:00", - "2020-05-04T00:00:00", - "2020-05-05T00:00:00", - "2020-05-06T00:00:00", - "2020-05-07T00:00:00", - "2020-05-08T00:00:00", - "2020-05-11T00:00:00", - "2020-05-12T00:00:00", - "2020-05-13T00:00:00", - "2020-05-14T00:00:00", - "2020-05-15T00:00:00", - "2020-05-18T00:00:00", - "2020-05-19T00:00:00", - "2020-05-20T00:00:00", - "2020-05-21T00:00:00", - "2020-05-22T00:00:00", - "2020-05-25T00:00:00", - "2020-05-26T00:00:00", - "2020-05-27T00:00:00", - "2020-05-28T00:00:00", - "2020-05-29T00:00:00", - "2020-06-01T00:00:00", - "2020-06-02T00:00:00", - "2020-06-03T00:00:00", - "2020-06-04T00:00:00", - "2020-06-05T00:00:00", - "2020-06-08T00:00:00", - "2020-06-09T00:00:00", - "2020-06-10T00:00:00", - "2020-06-11T00:00:00", - "2020-06-12T00:00:00", - "2020-06-15T00:00:00", - "2020-06-16T00:00:00", - "2020-06-17T00:00:00", - "2020-06-18T00:00:00", - "2020-06-19T00:00:00", - "2020-06-22T00:00:00", - "2020-06-23T00:00:00", - "2020-06-24T00:00:00", - "2020-06-25T00:00:00", - "2020-06-26T00:00:00", - "2020-06-29T00:00:00", - "2020-06-30T00:00:00", - "2020-07-01T00:00:00", - "2020-07-02T00:00:00", - "2020-07-03T00:00:00", - "2020-07-06T00:00:00", - "2020-07-07T00:00:00", - "2020-07-08T00:00:00", - "2020-07-09T00:00:00", - "2020-07-10T00:00:00", - "2020-07-13T00:00:00", - "2020-07-14T00:00:00", - "2020-07-15T00:00:00", - "2020-07-16T00:00:00", - "2020-07-17T00:00:00", - "2020-07-20T00:00:00", - "2020-07-21T00:00:00", - "2020-07-22T00:00:00", - "2020-07-23T00:00:00", - "2020-07-24T00:00:00", - "2020-07-27T00:00:00", - "2020-07-28T00:00:00", - "2020-07-29T00:00:00", - "2020-07-30T00:00:00", - "2020-07-31T00:00:00", - "2020-08-03T00:00:00", - "2020-08-04T00:00:00", - "2020-08-05T00:00:00", - "2020-08-06T00:00:00", - "2020-08-07T00:00:00", - "2020-08-10T00:00:00", - "2020-08-11T00:00:00", - "2020-08-12T00:00:00", - "2020-08-13T00:00:00", - "2020-08-14T00:00:00", - "2020-08-17T00:00:00", - "2020-08-18T00:00:00", - "2020-08-19T00:00:00", - "2020-08-20T00:00:00", - "2020-08-21T00:00:00", - "2020-08-24T00:00:00", - "2020-08-25T00:00:00", - "2020-08-26T00:00:00", - "2020-08-27T00:00:00", - "2020-08-28T00:00:00", - "2020-08-31T00:00:00", - "2020-09-01T00:00:00" - ], - "xaxis": "x", - "y": [ - 1.0250000000000057, - 3.4250000000000114, - 0.42499999999999716, - 1.9749999999999943, - 2.8500000000000227, - 4.224999999999994, - 4.7749999999999915, - 3.325000000000003, - 4.049999999999997, - 4.5, - 3.1000000000000085, - 3.5250000000000057, - 3.1750000000000114, - 3.549999999999997, - 3.299999999999997, - 3.3500000000000227, - 3.75, - 3.249999999999986, - 0.5249999999999915, - 3.5249999999999915, - 3.5, - 3.5999999999999943, - 3.9750000000000227, - 4.150000000000006, - 4.875, - 3.875, - 3.875, - 3.8000000000000114, - 3.5999999999999943, - 3.450000000000017, - 3.799999999999997, - 3.9000000000000057, - 3.9000000000000057, - 4.025000000000006, - 3.8499999999999943, - 4.1000000000000085, - 4.450000000000003, - 5.674999999999983, - 5.625, - 5.225000000000023, - 3.25, - 4.75, - 6.625, - 6.099999999999994, - 6.125, - 6.275000000000006, - 6.674999999999983, - 7.175000000000011, - 7.150000000000006, - 7.400000000000034, - 7.224999999999994, - 7.400000000000006, - 8.5, - 8.849999999999966, - 11.025000000000006, - 11.025000000000006, - 9.600000000000023, - 9, - 10.099999999999966, - 12.174999999999955, - 10.924999999999955, - 9.300000000000011, - 9.574999999999989, - 9.699999999999989, - 8.5, - 7.900000000000034, - 10.25, - 10.25, - 10.599999999999966, - 5.975000000000023, - 9.175000000000011, - 9.299999999999955, - 8.274999999999977, - 7.75, - 9.375, - 10.375, - 9.774999999999977, - 10.100000000000023, - 10.575000000000045, - 10.949999999999989, - 10.5, - 10.25, - 9.675000000000011, - 10.875, - 10.625, - 10.725000000000023, - 11.324999999999989, - 12.074999999999932, - 11.725000000000023, - 11.950000000000045, - 11.274999999999977, - 12.150000000000091, - 12.074999999999932, - 12.875, - 12.25, - 12.549999999999955, - 13.200000000000045, - 13.074999999999932 - ], - "yaxis": "y" - }, - { - "hovertemplate": "variable=ewm_1
Datetime=%{x}
value=%{y}", - "legendgroup": "ewm_1", - "line": { - "color": "#EF553B", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "ewm_1", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": [ - "2020-04-17T00:00:00", - "2020-04-20T00:00:00", - "2020-04-21T00:00:00", - "2020-04-22T00:00:00", - "2020-04-23T00:00:00", - "2020-04-24T00:00:00", - "2020-04-27T00:00:00", - "2020-04-28T00:00:00", - "2020-04-29T00:00:00", - "2020-04-30T00:00:00", - "2020-05-01T00:00:00", - "2020-05-04T00:00:00", - "2020-05-05T00:00:00", - "2020-05-06T00:00:00", - "2020-05-07T00:00:00", - "2020-05-08T00:00:00", - "2020-05-11T00:00:00", - "2020-05-12T00:00:00", - "2020-05-13T00:00:00", - "2020-05-14T00:00:00", - "2020-05-15T00:00:00", - "2020-05-18T00:00:00", - "2020-05-19T00:00:00", - "2020-05-20T00:00:00", - "2020-05-21T00:00:00", - "2020-05-22T00:00:00", - "2020-05-25T00:00:00", - "2020-05-26T00:00:00", - "2020-05-27T00:00:00", - "2020-05-28T00:00:00", - "2020-05-29T00:00:00", - "2020-06-01T00:00:00", - "2020-06-02T00:00:00", - "2020-06-03T00:00:00", - "2020-06-04T00:00:00", - "2020-06-05T00:00:00", - "2020-06-08T00:00:00", - "2020-06-09T00:00:00", - "2020-06-10T00:00:00", - "2020-06-11T00:00:00", - "2020-06-12T00:00:00", - "2020-06-15T00:00:00", - "2020-06-16T00:00:00", - "2020-06-17T00:00:00", - "2020-06-18T00:00:00", - "2020-06-19T00:00:00", - "2020-06-22T00:00:00", - "2020-06-23T00:00:00", - "2020-06-24T00:00:00", - "2020-06-25T00:00:00", - "2020-06-26T00:00:00", - "2020-06-29T00:00:00", - "2020-06-30T00:00:00", - "2020-07-01T00:00:00", - "2020-07-02T00:00:00", - "2020-07-03T00:00:00", - "2020-07-06T00:00:00", - "2020-07-07T00:00:00", - "2020-07-08T00:00:00", - "2020-07-09T00:00:00", - "2020-07-10T00:00:00", - "2020-07-13T00:00:00", - "2020-07-14T00:00:00", - "2020-07-15T00:00:00", - "2020-07-16T00:00:00", - "2020-07-17T00:00:00", - "2020-07-20T00:00:00", - "2020-07-21T00:00:00", - "2020-07-22T00:00:00", - "2020-07-23T00:00:00", - "2020-07-24T00:00:00", - "2020-07-27T00:00:00", - "2020-07-28T00:00:00", - "2020-07-29T00:00:00", - "2020-07-30T00:00:00", - "2020-07-31T00:00:00", - "2020-08-03T00:00:00", - "2020-08-04T00:00:00", - "2020-08-05T00:00:00", - "2020-08-06T00:00:00", - "2020-08-07T00:00:00", - "2020-08-10T00:00:00", - "2020-08-11T00:00:00", - "2020-08-12T00:00:00", - "2020-08-13T00:00:00", - "2020-08-14T00:00:00", - "2020-08-17T00:00:00", - "2020-08-18T00:00:00", - "2020-08-19T00:00:00", - "2020-08-20T00:00:00", - "2020-08-21T00:00:00", - "2020-08-24T00:00:00", - "2020-08-25T00:00:00", - "2020-08-26T00:00:00", - "2020-08-27T00:00:00", - "2020-08-28T00:00:00", - "2020-08-31T00:00:00", - "2020-09-01T00:00:00" - ], - "xaxis": "x", - "y": [ - 1.0250000000000057, - 3.4250000000000114, - 0.42499999999999716, - 1.9749999999999943, - 2.8500000000000227, - 4.224999999999994, - 4.7749999999999915, - 3.325000000000003, - 4.049999999999997, - 4.5, - 3.1000000000000085, - 3.5250000000000057, - 3.1750000000000114, - 3.549999999999997, - 3.299999999999997, - 3.3500000000000227, - 3.75, - 3.249999999999986, - 0.5249999999999915, - 3.5249999999999915, - 3.5, - 3.5999999999999943, - 3.9750000000000227, - 4.150000000000006, - 4.875, - 3.875, - 3.875, - 3.8000000000000114, - 3.5999999999999943, - 3.450000000000017, - 3.799999999999997, - 3.9000000000000057, - 3.9000000000000057, - 4.025000000000006, - 3.8499999999999943, - 4.1000000000000085, - 4.450000000000003, - 5.674999999999983, - 5.625, - 5.225000000000023, - 3.25, - 4.75, - 6.625, - 6.099999999999994, - 6.125, - 6.275000000000006, - 6.674999999999983, - 7.175000000000011, - 7.150000000000006, - 7.400000000000034, - 7.224999999999994, - 7.400000000000006, - 8.5, - 8.849999999999966, - 11.025000000000006, - 11.025000000000006, - 9.600000000000023, - 9, - 10.099999999999966, - 12.174999999999955, - 10.924999999999955, - 9.300000000000011, - 9.574999999999989, - 9.699999999999989, - 8.5, - 7.900000000000034, - 10.25, - 10.25, - 10.599999999999966, - 5.975000000000023, - 9.175000000000011, - 9.299999999999955, - 8.274999999999977, - 7.75, - 9.375, - 10.375, - 9.774999999999977, - 10.100000000000023, - 10.575000000000045, - 10.949999999999989, - 10.5, - 10.25, - 9.675000000000011, - 10.875, - 10.625, - 10.725000000000023, - 11.324999999999989, - 12.074999999999932, - 11.725000000000023, - 11.950000000000045, - 11.274999999999977, - 12.150000000000091, - 12.074999999999932, - 12.875, - 12.25, - 12.549999999999955, - 13.200000000000045, - 13.074999999999932 - ], - "yaxis": "y" - }, - { - "hovertemplate": "variable=ewm_3
Datetime=%{x}
value=%{y}", - "legendgroup": "ewm_3", - "line": { - "color": "#00cc96", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "ewm_3", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": [ - "2020-04-17T00:00:00", - "2020-04-20T00:00:00", - "2020-04-21T00:00:00", - "2020-04-22T00:00:00", - "2020-04-23T00:00:00", - "2020-04-24T00:00:00", - "2020-04-27T00:00:00", - "2020-04-28T00:00:00", - "2020-04-29T00:00:00", - "2020-04-30T00:00:00", - "2020-05-01T00:00:00", - "2020-05-04T00:00:00", - "2020-05-05T00:00:00", - "2020-05-06T00:00:00", - "2020-05-07T00:00:00", - "2020-05-08T00:00:00", - "2020-05-11T00:00:00", - "2020-05-12T00:00:00", - "2020-05-13T00:00:00", - "2020-05-14T00:00:00", - "2020-05-15T00:00:00", - "2020-05-18T00:00:00", - "2020-05-19T00:00:00", - "2020-05-20T00:00:00", - "2020-05-21T00:00:00", - "2020-05-22T00:00:00", - "2020-05-25T00:00:00", - "2020-05-26T00:00:00", - "2020-05-27T00:00:00", - "2020-05-28T00:00:00", - "2020-05-29T00:00:00", - "2020-06-01T00:00:00", - "2020-06-02T00:00:00", - "2020-06-03T00:00:00", - "2020-06-04T00:00:00", - "2020-06-05T00:00:00", - "2020-06-08T00:00:00", - "2020-06-09T00:00:00", - "2020-06-10T00:00:00", - "2020-06-11T00:00:00", - "2020-06-12T00:00:00", - "2020-06-15T00:00:00", - "2020-06-16T00:00:00", - "2020-06-17T00:00:00", - "2020-06-18T00:00:00", - "2020-06-19T00:00:00", - "2020-06-22T00:00:00", - "2020-06-23T00:00:00", - "2020-06-24T00:00:00", - "2020-06-25T00:00:00", - "2020-06-26T00:00:00", - "2020-06-29T00:00:00", - "2020-06-30T00:00:00", - "2020-07-01T00:00:00", - "2020-07-02T00:00:00", - "2020-07-03T00:00:00", - "2020-07-06T00:00:00", - "2020-07-07T00:00:00", - "2020-07-08T00:00:00", - "2020-07-09T00:00:00", - "2020-07-10T00:00:00", - "2020-07-13T00:00:00", - "2020-07-14T00:00:00", - "2020-07-15T00:00:00", - "2020-07-16T00:00:00", - "2020-07-17T00:00:00", - "2020-07-20T00:00:00", - "2020-07-21T00:00:00", - "2020-07-22T00:00:00", - "2020-07-23T00:00:00", - "2020-07-24T00:00:00", - "2020-07-27T00:00:00", - "2020-07-28T00:00:00", - "2020-07-29T00:00:00", - "2020-07-30T00:00:00", - "2020-07-31T00:00:00", - "2020-08-03T00:00:00", - "2020-08-04T00:00:00", - "2020-08-05T00:00:00", - "2020-08-06T00:00:00", - "2020-08-07T00:00:00", - "2020-08-10T00:00:00", - "2020-08-11T00:00:00", - "2020-08-12T00:00:00", - "2020-08-13T00:00:00", - "2020-08-14T00:00:00", - "2020-08-17T00:00:00", - "2020-08-18T00:00:00", - "2020-08-19T00:00:00", - "2020-08-20T00:00:00", - "2020-08-21T00:00:00", - "2020-08-24T00:00:00", - "2020-08-25T00:00:00", - "2020-08-26T00:00:00", - "2020-08-27T00:00:00", - "2020-08-28T00:00:00", - "2020-08-31T00:00:00", - "2020-09-01T00:00:00" - ], - "xaxis": "x", - "y": [ - 2.5392857142857173, - 3.0116666666666743, - 1.6766129032258086, - 1.8281746031746013, - 2.343110236220483, - 3.287745098039218, - 4.032827788649704, - 3.6785679374389053, - 3.864374694675133, - 4.182264957264956, - 3.6410664143572253, - 3.5830296648965443, - 3.3790086062196805, - 3.46450560769055, - 3.3822521763013937, - 3.3661260266343294, - 3.5580633794086123, - 3.404031542808092, - 1.9645150849891049, - 2.744757728518891, - 3.122378909275398, - 3.361189468871915, - 3.6680947435824587, - 3.9090473753817063, - 4.392023691289308, - 4.133511844681622, - 4.004255922100053, - 3.902127960954918, - 3.7510639804071118, - 3.600531990168516, - 3.7002659950958674, - 3.8001329975537494, - 3.8500664987783306, - 3.937533249390441, - 3.893766624694899, - 3.996883312347829, - 4.223441656174328, - 4.949220828087816, - 5.2871104140440615, - 5.256055207022035, - 4.253027603510903, - 4.501513801755466, - 5.563256900877763, - 5.831628450438882, - 5.978314225219442, - 6.126657112609725, - 6.400828556304854, - 6.787914278152433, - 6.9689571390762195, - 7.184478569538127, - 7.204739284769061, - 7.302369642384533, - 7.901184821192267, - 8.375592410596116, - 9.700296205298061, - 10.362648102649032, - 9.981324051324528, - 9.490662025662264, - 9.795331012831115, - 10.985165506415534, - 10.955082753207744, - 10.127541376603878, - 9.851270688301934, - 9.775635344150961, - 9.137817672075482, - 8.518908836037758, - 9.38445441801888, - 9.81722720900944, - 10.208613604504702, - 8.091806802252362, - 8.633403401126188, - 8.966701700563071, - 8.620850850281524, - 8.185425425140762, - 8.780212712570382, - 9.577606356285191, - 9.676303178142584, - 9.888151589071303, - 10.231575794535674, - 10.59078789726783, - 10.545393948633915, - 10.397696974316958, - 10.036348487158484, - 10.455674243579242, - 10.540337121789621, - 10.632668560894821, - 10.978834280447405, - 11.526917140223668, - 11.625958570111845, - 11.787979285055945, - 11.531489642527962, - 11.840744821264026, - 11.957872410631978, - 12.41643620531599, - 12.333218102657995, - 12.441609051328975, - 12.82080452566451, - 12.947902262832221 - ], - "yaxis": "y" - }, - { - "hovertemplate": "variable=ewm_5
Datetime=%{x}
value=%{y}", - "legendgroup": "ewm_5", - "line": { - "color": "#ab63fa", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "ewm_5", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": [ - "2020-04-17T00:00:00", - "2020-04-20T00:00:00", - "2020-04-21T00:00:00", - "2020-04-22T00:00:00", - "2020-04-23T00:00:00", - "2020-04-24T00:00:00", - "2020-04-27T00:00:00", - "2020-04-28T00:00:00", - "2020-04-29T00:00:00", - "2020-04-30T00:00:00", - "2020-05-01T00:00:00", - "2020-05-04T00:00:00", - "2020-05-05T00:00:00", - "2020-05-06T00:00:00", - "2020-05-07T00:00:00", - "2020-05-08T00:00:00", - "2020-05-11T00:00:00", - "2020-05-12T00:00:00", - "2020-05-13T00:00:00", - "2020-05-14T00:00:00", - "2020-05-15T00:00:00", - "2020-05-18T00:00:00", - "2020-05-19T00:00:00", - "2020-05-20T00:00:00", - "2020-05-21T00:00:00", - "2020-05-22T00:00:00", - "2020-05-25T00:00:00", - "2020-05-26T00:00:00", - "2020-05-27T00:00:00", - "2020-05-28T00:00:00", - "2020-05-29T00:00:00", - "2020-06-01T00:00:00", - "2020-06-02T00:00:00", - "2020-06-03T00:00:00", - "2020-06-04T00:00:00", - "2020-06-05T00:00:00", - "2020-06-08T00:00:00", - "2020-06-09T00:00:00", - "2020-06-10T00:00:00", - "2020-06-11T00:00:00", - "2020-06-12T00:00:00", - "2020-06-15T00:00:00", - "2020-06-16T00:00:00", - "2020-06-17T00:00:00", - "2020-06-18T00:00:00", - "2020-06-19T00:00:00", - "2020-06-22T00:00:00", - "2020-06-23T00:00:00", - "2020-06-24T00:00:00", - "2020-06-25T00:00:00", - "2020-06-26T00:00:00", - "2020-06-29T00:00:00", - "2020-06-30T00:00:00", - "2020-07-01T00:00:00", - "2020-07-02T00:00:00", - "2020-07-03T00:00:00", - "2020-07-06T00:00:00", - "2020-07-07T00:00:00", - "2020-07-08T00:00:00", - "2020-07-09T00:00:00", - "2020-07-10T00:00:00", - "2020-07-13T00:00:00", - "2020-07-14T00:00:00", - "2020-07-15T00:00:00", - "2020-07-16T00:00:00", - "2020-07-17T00:00:00", - "2020-07-20T00:00:00", - "2020-07-21T00:00:00", - "2020-07-22T00:00:00", - "2020-07-23T00:00:00", - "2020-07-24T00:00:00", - "2020-07-27T00:00:00", - "2020-07-28T00:00:00", - "2020-07-29T00:00:00", - "2020-07-30T00:00:00", - "2020-07-31T00:00:00", - "2020-08-03T00:00:00", - "2020-08-04T00:00:00", - "2020-08-05T00:00:00", - "2020-08-06T00:00:00", - "2020-08-07T00:00:00", - "2020-08-10T00:00:00", - "2020-08-11T00:00:00", - "2020-08-12T00:00:00", - "2020-08-13T00:00:00", - "2020-08-14T00:00:00", - "2020-08-17T00:00:00", - "2020-08-18T00:00:00", - "2020-08-19T00:00:00", - "2020-08-20T00:00:00", - "2020-08-21T00:00:00", - "2020-08-24T00:00:00", - "2020-08-25T00:00:00", - "2020-08-26T00:00:00", - "2020-08-27T00:00:00", - "2020-08-28T00:00:00", - "2020-08-31T00:00:00", - "2020-09-01T00:00:00" - ], - "xaxis": "x", - "y": [ - 2.7855263157894754, - 3.051153846153852, - 2.0430094786729884, - 2.018157894736842, - 2.312676056338036, - 2.9759992069785914, - 3.591681445933962, - 3.5012188711762176, - 3.6862854727896783, - 3.95963041272791, - 3.671607011022421, - 3.622570031794255, - 3.4730385423751535, - 3.498731477505801, - 3.4324203485783826, - 3.404928296844547, - 3.5200041077879693, - 3.42997566439218, - 2.4614562685681727, - 2.816018235465503, - 3.044032474137422, - 3.229365992160846, - 3.4779205047282034, - 3.70195291792568, - 4.092975494317626, - 4.020316143629556, - 3.9718770501646556, - 3.914584401323165, - 3.8097225696391614, - 3.6898147685014115, - 3.726543235754258, - 3.784362216731281, - 3.8229081709593995, - 3.890272144814923, - 3.8768480924458926, - 3.9512320767666145, - 4.117488073731466, - 4.636658762773589, - 4.966105861712024, - 5.052403911276735, - 4.451602591418533, - 4.5510683960559035, - 5.242378938937095, - 5.528252628227802, - 5.727168419871418, - 5.909778947225332, - 6.164852632083608, - 6.501568421917157, - 6.717712281504096, - 6.9451415211612675, - 7.0384276808175255, - 7.158951787249023, - 7.605967858258338, - 8.020645238895977, - 9.022096826022578, - 9.689731217389243, - 9.659820811591617, - 9.439880541055096, - 9.659920360707376, - 10.498280240481703, - 10.640520160322266, - 10.193680106879114, - 9.987453404585334, - 9.891635603056658, - 9.4277570687037, - 8.918504712468605, - 9.362336474979383, - 9.658224316653062, - 9.972149544435462, - 8.639766362956703, - 8.818177575304498, - 8.978785050203, - 8.744190033468644, - 8.41279335564575, - 8.733528903763842, - 9.280685935842572, - 9.44545729056171, - 9.663638193707815, - 9.967425462471894, - 10.294950308314595, - 10.363300205543064, - 10.325533470362043, - 10.108688980241364, - 10.364125986827577, - 10.451083991218384, - 10.542389327478931, - 10.803259551652616, - 11.227173034435054, - 11.393115356290044, - 11.578743570860047, - 11.477495713906691, - 11.701663809271158, - 11.826109206180751, - 12.17573947078717, - 12.20049298052478, - 12.316995320349838, - 12.611330213566575, - 12.76588680904436 - ], - "yaxis": "y" - } - ], - "layout": { - "legend": { - "title": { - "text": "variable" - }, - "tracegroupgap": 0 - }, - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "heatmapgl": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmapgl" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "title": { - "text": "EWMA Smoothing of Midpoint Price" - }, - "xaxis": { - "anchor": "y", - "domain": [ - 0, - 1 - ], - "title": { - "text": "Datetime" - } - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0, - 1 - ], - "title": { - "text": "value" - } - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "pnl\n", - "index = 20\n", - "_id, _entry, _exit = pnl.iloc[index][['TradeID', 'EntryTime', 'ExitTime']]\n", - "tick = pnl.iloc[index]['Ticker']\n", - "data = rm.position_data[_id].copy()\n", - "data['ewm_1'] = data['Midpoint'].ewm(span=1).mean()\n", - "data['ewm_3'] = data['Midpoint'].ewm(span=3).mean()\n", - "data['ewm_5'] = data['Midpoint'].ewm(span=5).mean()\n", - "data['abs_pct_ewn_3'] = (data['Midpoint'] - data['ewm_3']).abs() / data['Midpoint'].abs()\n", - "data['abs_pct_ewn_5'] = (data['Midpoint'] - data['ewm_5']).abs() / data['Midpoint'].abs()\n", - "data['ewm_3_pct_skip'] = data['abs_pct_ewn_3'] > 0.75\n", - "data['ewm_5_pct_skip'] = data['abs_pct_ewn_5'] > 0.75\n", - "data[['ewm_3_pct_skip', 'ewm_5_pct_skip']].sum()\n", - "print(_entry, _exit)\n", - "print(pnl.loc[index])\n", - "# data[['ewm_3_pct_skip', 'ewm_5_pct_skip', 'Midpoint_skip_day']][_entry:_exit].plot()\n", - "data[['Midpoint', 'ewm_1', 'ewm_3', 'ewm_5']].loc[_entry:_exit].plot(title='EWMA Smoothing of Midpoint Price')" - ] - }, - { - "cell_type": "code", - "execution_count": 249, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "hovertemplate": "variable=rvol_30D
date=%{x}
value=%{y}", - "legendgroup": "rvol_30D", - "line": { - "color": "#636efa", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "rvol_30D", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": [ - "2020-10-15T00:00:00", - "2020-10-16T00:00:00", - "2020-10-19T00:00:00", - "2020-10-20T00:00:00", - "2020-10-21T00:00:00", - "2020-10-22T00:00:00", - "2020-10-23T00:00:00", - "2020-10-26T00:00:00", - "2020-10-27T00:00:00", - "2020-10-28T00:00:00", - "2020-10-29T00:00:00", - "2020-10-30T00:00:00", - "2020-11-02T00:00:00", - "2020-11-03T00:00:00", - "2020-11-04T00:00:00", - "2020-11-05T00:00:00", - "2020-11-06T00:00:00", - "2020-11-09T00:00:00", - "2020-11-10T00:00:00", - "2020-11-11T00:00:00", - "2020-11-12T00:00:00", - "2020-11-13T00:00:00", - "2020-11-16T00:00:00", - "2020-11-17T00:00:00", - "2020-11-18T00:00:00", - "2020-11-19T00:00:00", - "2020-11-20T00:00:00", - "2020-11-23T00:00:00", - "2020-11-24T00:00:00", - "2020-11-25T00:00:00", - "2020-11-27T00:00:00", - "2020-11-30T00:00:00", - "2020-12-01T00:00:00", - "2020-12-02T00:00:00", - "2020-12-03T00:00:00", - "2020-12-04T00:00:00", - "2020-12-07T00:00:00", - "2020-12-08T00:00:00", - "2020-12-09T00:00:00" - ], - "xaxis": "x", - "y": [ - 1.0263915328014324, - 0.9910842112837485, - 0.9910498537525463, - 0.7616406333980339, - 0.7003446424971698, - 0.699948344216443, - 0.701802762212028, - 0.6010500347792649, - 0.5631173254866616, - 0.5747568422607782, - 0.5637206789102032, - 0.5692094857905572, - 0.5758349441005334, - 0.5800970962178098, - 0.49013831952883335, - 0.499731543720976, - 0.4844900822958796, - 0.4790561293867196, - 0.4848989411120721, - 0.48224204535079823, - 0.46393863361171694, - 0.4122651059921758, - 0.4049888361508741, - 0.46333256267594825, - 0.5418423863961535, - 0.5450726344712963, - 0.548371696087287, - 0.5751978683814944, - 0.5993454202791957, - 0.5996108307281864, - 0.5913128930352084, - 0.5967042985242175, - 0.5930338456764042, - 0.5963954656745674, - 0.6030447325015795, - 0.6029366629310416, - 0.6219725040204577, - 0.6202326663705687, - 0.6676183757089144 - ], - "yaxis": "y" - } - ], - "layout": { - "legend": { - "title": { - "text": "variable" - }, - "tracegroupgap": 0 - }, - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "heatmapgl": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmapgl" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "title": { - "text": "NVDA Spot Price" - }, - "xaxis": { - "anchor": "y", - "domain": [ - 0, - 1 - ], - "title": { - "text": "date" - } - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0, - 1 - ], - "title": { - "text": "value" - } - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "pm.get_underlier_data(tick).rvol(\n", - " ts_start = rm.pm_start_date,\n", - " ts_end = rm.pm_end_date).rvol_30D[_entry:_exit].plot(title='NVDA Spot Price')" - ] - }, - { - "cell_type": "code", - "execution_count": 250, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "hovertemplate": "variable=ewm_3_pct_skip
Datetime=%{x}
value=%{y}", - "legendgroup": "ewm_3_pct_skip", - "line": { - "color": "#636efa", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "ewm_3_pct_skip", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": [ - "2020-10-15T00:00:00", - "2020-10-16T00:00:00", - "2020-10-19T00:00:00", - "2020-10-20T00:00:00", - "2020-10-21T00:00:00", - "2020-10-22T00:00:00", - "2020-10-23T00:00:00", - "2020-10-26T00:00:00", - "2020-10-27T00:00:00", - "2020-10-28T00:00:00", - "2020-10-29T00:00:00", - "2020-10-30T00:00:00", - "2020-11-02T00:00:00", - "2020-11-03T00:00:00", - "2020-11-04T00:00:00", - "2020-11-05T00:00:00", - "2020-11-06T00:00:00", - "2020-11-09T00:00:00", - "2020-11-10T00:00:00", - "2020-11-11T00:00:00", - "2020-11-12T00:00:00", - "2020-11-13T00:00:00", - "2020-11-16T00:00:00", - "2020-11-17T00:00:00", - "2020-11-18T00:00:00", - "2020-11-19T00:00:00", - "2020-11-20T00:00:00", - "2020-11-23T00:00:00", - "2020-11-24T00:00:00", - "2020-11-25T00:00:00", - "2020-11-26T00:00:00", - "2020-11-27T00:00:00", - "2020-11-30T00:00:00", - "2020-12-01T00:00:00", - "2020-12-02T00:00:00", - "2020-12-03T00:00:00", - "2020-12-04T00:00:00", - "2020-12-07T00:00:00", - "2020-12-08T00:00:00", - "2020-12-09T00:00:00" - ], - "xaxis": "x", - "y": [ - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - true, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false - ], - "yaxis": "y" - }, - { - "hovertemplate": "variable=ewm_5_pct_skip
Datetime=%{x}
value=%{y}", - "legendgroup": "ewm_5_pct_skip", - "line": { - "color": "#EF553B", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "ewm_5_pct_skip", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": [ - "2020-10-15T00:00:00", - "2020-10-16T00:00:00", - "2020-10-19T00:00:00", - "2020-10-20T00:00:00", - "2020-10-21T00:00:00", - "2020-10-22T00:00:00", - "2020-10-23T00:00:00", - "2020-10-26T00:00:00", - "2020-10-27T00:00:00", - "2020-10-28T00:00:00", - "2020-10-29T00:00:00", - "2020-10-30T00:00:00", - "2020-11-02T00:00:00", - "2020-11-03T00:00:00", - "2020-11-04T00:00:00", - "2020-11-05T00:00:00", - "2020-11-06T00:00:00", - "2020-11-09T00:00:00", - "2020-11-10T00:00:00", - "2020-11-11T00:00:00", - "2020-11-12T00:00:00", - "2020-11-13T00:00:00", - "2020-11-16T00:00:00", - "2020-11-17T00:00:00", - "2020-11-18T00:00:00", - "2020-11-19T00:00:00", - "2020-11-20T00:00:00", - "2020-11-23T00:00:00", - "2020-11-24T00:00:00", - "2020-11-25T00:00:00", - "2020-11-26T00:00:00", - "2020-11-27T00:00:00", - "2020-11-30T00:00:00", - "2020-12-01T00:00:00", - "2020-12-02T00:00:00", - "2020-12-03T00:00:00", - "2020-12-04T00:00:00", - "2020-12-07T00:00:00", - "2020-12-08T00:00:00", - "2020-12-09T00:00:00" - ], - "xaxis": "x", - "y": [ - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - true, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false - ], - "yaxis": "y" - }, - { - "hovertemplate": "variable=Midpoint_skip_day
Datetime=%{x}
value=%{y}", - "legendgroup": "Midpoint_skip_day", - "line": { - "color": "#00cc96", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "Midpoint_skip_day", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": [ - "2020-10-15T00:00:00", - "2020-10-16T00:00:00", - "2020-10-19T00:00:00", - "2020-10-20T00:00:00", - "2020-10-21T00:00:00", - "2020-10-22T00:00:00", - "2020-10-23T00:00:00", - "2020-10-26T00:00:00", - "2020-10-27T00:00:00", - "2020-10-28T00:00:00", - "2020-10-29T00:00:00", - "2020-10-30T00:00:00", - "2020-11-02T00:00:00", - "2020-11-03T00:00:00", - "2020-11-04T00:00:00", - "2020-11-05T00:00:00", - "2020-11-06T00:00:00", - "2020-11-09T00:00:00", - "2020-11-10T00:00:00", - "2020-11-11T00:00:00", - "2020-11-12T00:00:00", - "2020-11-13T00:00:00", - "2020-11-16T00:00:00", - "2020-11-17T00:00:00", - "2020-11-18T00:00:00", - "2020-11-19T00:00:00", - "2020-11-20T00:00:00", - "2020-11-23T00:00:00", - "2020-11-24T00:00:00", - "2020-11-25T00:00:00", - "2020-11-26T00:00:00", - "2020-11-27T00:00:00", - "2020-11-30T00:00:00", - "2020-12-01T00:00:00", - "2020-12-02T00:00:00", - "2020-12-03T00:00:00", - "2020-12-04T00:00:00", - "2020-12-07T00:00:00", - "2020-12-08T00:00:00", - "2020-12-09T00:00:00" - ], - "xaxis": "x", - "y": [ - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - true, - true, - true, - true, - true, - false, - false, - true, - false, - false, - false, - false, - false, - false, - true, - false - ], - "yaxis": "y" - } - ], - "layout": { - "legend": { - "title": { - "text": "variable" - }, - "tracegroupgap": 0 - }, - "margin": { - "t": 60 - }, - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "heatmapgl": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmapgl" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "xaxis": { - "anchor": "y", - "domain": [ - 0, - 1 - ], - "title": { - "text": "Datetime" - } - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0, - 1 - ], - "title": { - "text": "value" - } - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "data[['ewm_3_pct_skip', 'ewm_5_pct_skip', 'Midpoint_skip_day']][_entry:_exit].plot()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## MISC" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Ruin 71.00%\n", - "Median Drawdown -98.99%\n", - "Worst Drawdown -100.00%\n", - "Median Vol Annualized 196.60%\n", - "Median $ Profit 15551254.52\n", - "Median Return 79526.53%\n", - "Median CAGR 163.24%\n", - "Median Skew 2.52\n", - "Return/DD 1.65\n", - "Prob>0 88.50%\n", - "Median Var95 5464824686.79\n", - "Median Var05 -3045284334.50\n", - "Best Case Final Equity (95%) 375598598653.30\n", - "Worst Case Final Equity (05%) 1592.63\n", - "dtype: object" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from scipy.stats.mstats import winsorize\n", - "historical_eq = option_aggregator_zscore2._equity['Total']\n", - "smoothed_eq = option_aggregator_zscore2._equity['Total'].ewm(span =1).mean()\n", - "\n", - "# historical_returns = smoothed_eq.pct_change(periods = 1).dropna()\n", - "historical_returns = np.log(smoothed_eq/smoothed_eq.shift(1)).dropna()\n", - "monte_smooth = MonteCarloBacktest(returns = historical_returns, \n", - " initial_price = 20000, \n", - " size = 252*10, \n", - " num_simulations = 1000,\n", - " log = True)\n", - "summary_smooth = monte_smooth.summary(0.5)\n", - "summary_smooth\n", - "\n", - "## Add median CAGR\n", - "## Median Vol\n", - "## Median Sharpe\n", - "## Median Skew" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Ruin 30.80%\n", - "Median Drawdown -82.90%\n", - "Worst Drawdown -99.55%\n", - "Median Vol Annualized 91.73%\n", - "Median $ Profit 15165005.26\n", - "Median Return 75519.62%\n", - "Median CAGR 161.28%\n", - "Median Skew 0.45\n", - "Return/DD 1.95\n", - "Prob>0 99.16%\n", - "Median Var95 18844092.54\n", - "Median Var05 -13480742.47\n", - "Best Case Final Equity (95%) 2009810193.75\n", - "Worst Case Final Equity (05%) 136852.37\n", - "dtype: object" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "from EventDriven.riskmanager.utils import add_skip_columns\n", - "from scipy.stats.mstats import winsorize\n", - "\n", - "equity2 = option_aggregator_zscore2._equity.copy()\n", - "equity2 = add_skip_columns(\n", - " equity2, \n", - " 'IGNORE',\n", - " ['Total'],\n", - " 15,\n", - " 2.75\n", - "\n", - ")\n", - "\n", - "equity2['ffwd_total'] = equity2.Total\n", - "equity2.loc[equity2.Total_skip_day == True, 'ffwd_total'] = np.nan\n", - "equity2.ffwd_total.fillna(method = 'ffill', inplace = True)\n", - "\n", - "\n", - "log_returns = np.log(equity2.ffwd_total/ equity2.ffwd_total.shift(1)).dropna()\n", - "clipped_returns = winsorize(log_returns, limits=[0.01, 0.01])\n", - "\n", - "\n", - "monte_winsorize_skip = MonteCarloBacktest(returns = clipped_returns, \n", - " initial_price = 20000, \n", - " size = 252*10, \n", - " num_simulations = 2500,\n", - " log = True)\n", - "summary_winsorize_skip = monte_winsorize_skip.summary(cutoff = 0.5)\n", - "summary_winsorize_skip\n" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Ruin 36.64%\n", - "Median Drawdown -86.14%\n", - "Worst Drawdown -99.54%\n", - "Median Vol Annualized 104.44%\n", - "Median $ Profit 21060580.70\n", - "Median Return 104203.05%\n", - "Median CAGR 173.75%\n", - "Median Skew 1.48\n", - "Return/DD 2.02\n", - "Prob>0 98.76%\n", - "Median Var95 35449650.39\n", - "Median Var05 -24307298.61\n", - "Best Case Final Equity (95%) 3361513252.50\n", - "Worst Case Final Equity (05%) 94828.47\n", - "dtype: object" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "from EventDriven.riskmanager.utils import add_skip_columns\n", - "equity2 = option_aggregator_zscore2._equity.copy()\n", - "equity2 = add_skip_columns(\n", - " equity2, \n", - " 'IGNORE',\n", - " ['Total'],\n", - " 15,\n", - " 2.75\n", - "\n", - ")\n", - "\n", - "equity2['ffwd_total'] = equity2.Total\n", - "equity2.loc[equity2.Total_skip_day == True, 'ffwd_total'] = np.nan\n", - "equity2.ffwd_total.fillna(method = 'ffill', inplace = True)\n", - "# equity2.ffwd_total.plot()\n", - "\n", - "\n", - "from scipy.stats.mstats import winsorize\n", - "historical_eq = equity2.ffwd_total\n", - "\n", - "historical_returns = historical_eq.pct_change(periods = 1).dropna()\n", - "monte_ffwd = MonteCarloBacktest(returns = historical_returns, \n", - " initial_price = 20000, \n", - " size = 252*10, \n", - " num_simulations = 2500)\n", - "summary_ffwd = monte_ffwd.summary(0.5)\n", - "summary_ffwd" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Ruin 34.10%\n", - "Median Drawdown -82.25%\n", - "Worst Drawdown -99.66%\n", - "Median Vol Annualized 81.76%\n", - "Median $ Profit 2923398.18\n", - "Median Return 14438.86%\n", - "Median CAGR 105.75%\n", - "Median Skew -0.01\n", - "Return/DD 1.29\n", - "Prob>0 96.30%\n", - "Median Var95 4011063.62\n", - "Median Var05 -3306146.94\n", - "Best Case Final Equity (95%) 180332798.07\n", - "Worst Case Final Equity (05%) 35231.98\n", - "dtype: object" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from scipy.stats.mstats import winsorize\n", - "historical_eq = option_aggregator_zscore2._equity['Total']\n", - "historical_returns = historical_eq.pct_change(periods = 1).dropna()\n", - "\n", - "log_returns = np.log(option_aggregator_zscore2._equity['Total']/ option_aggregator_zscore2._equity['Total'].shift(1)).dropna()\n", - "clipped_returns = winsorize(log_returns, limits=[0.1, 0.1])\n", - "\n", - "\n", - "monte_winsorize = MonteCarloBacktest(returns = clipped_returns, \n", - " initial_price = 20000, \n", - " size = 252*10, \n", - " num_simulations = 1000)\n", - "summary_winsorize = monte_winsorize.summary(cutoff = 0.5)\n", - "summary_winsorize\n" - ] - }, - { - "cell_type": "code", - "execution_count": 174, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "hovertemplate": "variable=0
index=%{x}
value=%{y}", - "legendgroup": "0", - "line": { - "color": "#636efa", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "0", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": [ - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 15, - 16, - 17, - 18, - 19, - 20, - 21, - 22, - 23, - 24, - 25, - 26, - 27, - 28, - 29, - 30, - 31, - 32, - 33, - 34, - 35, - 36, - 37, - 38, - 39, - 40, - 41, - 42, - 43, - 44, - 45, - 46, - 47, - 48, - 49, - 50, - 51, - 52, - 53, - 54, - 55, - 56, - 57, - 58, - 59, - 60, - 61, - 62, - 63, - 64, - 65, - 66, - 67, - 68, - 69, - 70, - 71, - 72, - 73, - 74, - 75, - 76, - 77, - 78, - 79, - 80, - 81, - 82, - 83, - 84, - 85, - 86, - 87, - 88, - 89, - 90, - 91, - 92, - 93, - 94, - 95, - 96, - 97, - 98, - 99, - 100, - 101, - 102, - 103, - 104, - 105, - 106, - 107, - 108, - 109, - 110, - 111, - 112, - 113, - 114, - 115, - 116, - 117, - 118, - 119, - 120, - 121, - 122, - 123, - 124, - 125, - 126, - 127, - 128, - 129, - 130, - 131, - 132, - 133, - 134, - 135, - 136, - 137, - 138, - 139, - 140, - 141, - 142, - 143, - 144, - 145, - 146, - 147, - 148, - 149, - 150, - 151, - 152, - 153, - 154, - 155, - 156, - 157, - 158, - 159, - 160, - 161, - 162, - 163, - 164, - 165, - 166, - 167, - 168, - 169, - 170, - 171, - 172, - 173, - 174, - 175, - 176, - 177, - 178, - 179, - 180, - 181, - 182, - 183, - 184, - 185, - 186, - 187, - 188, - 189, - 190, - 191, - 192, - 193, - 194, - 195, - 196, - 197, - 198, - 199, - 200, - 201, - 202, - 203, - 204, - 205, - 206, - 207, - 208, - 209, - 210, - 211, - 212, - 213, - 214, - 215, - 216, - 217, - 218, - 219, - 220, - 221, - 222, - 223, - 224, - 225, - 226, - 227, - 228, - 229, - 230, - 231, - 232, - 233, - 234, - 235, - 236, - 237, - 238, - 239, - 240, - 241, - 242, - 243, - 244, - 245, - 246, - 247, - 248, - 249, - 250, - 251, - 252, - 253, - 254, - 255, - 256, - 257, - 258, - 259, - 260, - 261, - 262, - 263, - 264, - 265, - 266, - 267, - 268, - 269, - 270, - 271, - 272, - 273, - 274, - 275, - 276, - 277, - 278, - 279, - 280, - 281, - 282, - 283, - 284, - 285, - 286, - 287, - 288, - 289, - 290, - 291, - 292, - 293, - 294, - 295, - 296, - 297, - 298, - 299, - 300, - 301, - 302, - 303, - 304, - 305, - 306, - 307, - 308, - 309, - 310, - 311, - 312, - 313, - 314, - 315, - 316, - 317, - 318, - 319, - 320, - 321, - 322, - 323, - 324, - 325, - 326, - 327, - 328, - 329, - 330, - 331, - 332, - 333, - 334, - 335, - 336, - 337, - 338, - 339, - 340, - 341, - 342, - 343, - 344, - 345, - 346, - 347, - 348, - 349, - 350, - 351, - 352, - 353, - 354, - 355, - 356, - 357, - 358, - 359, - 360, - 361, - 362, - 363, - 364, - 365, - 366, - 367, - 368, - 369, - 370, - 371, - 372, - 373, - 374, - 375, - 376, - 377, - 378, - 379, - 380, - 381, - 382, - 383, - 384, - 385, - 386, - 387, - 388, - 389, - 390, - 391, - 392, - 393, - 394, - 395, - 396, - 397, - 398, - 399, - 400, - 401, - 402, - 403, - 404, - 405, - 406, - 407, - 408, - 409, - 410, - 411, - 412, - 413, - 414, - 415, - 416, - 417, - 418, - 419, - 420, - 421, - 422, - 423, - 424, - 425, - 426, - 427, - 428, - 429, - 430, - 431, - 432, - 433, - 434, - 435, - 436, - 437, - 438, - 439, - 440, - 441, - 442, - 443, - 444, - 445, - 446, - 447, - 448, - 449, - 450, - 451, - 452, - 453, - 454, - 455, - 456, - 457, - 458, - 459, - 460, - 461, - 462, - 463, - 464, - 465, - 466, - 467, - 468, - 469, - 470, - 471, - 472, - 473, - 474, - 475, - 476, - 477, - 478, - 479, - 480, - 481, - 482, - 483, - 484, - 485, - 486, - 487, - 488, - 489, - 490, - 491, - 492, - 493, - 494, - 495, - 496, - 497, - 498, - 499, - 500, - 501, - 502, - 503, - 504, - 505, - 506, - 507, - 508, - 509, - 510, - 511, - 512, - 513, - 514, - 515, - 516, - 517, - 518, - 519, - 520, - 521, - 522, - 523, - 524, - 525, - 526, - 527, - 528, - 529, - 530, - 531, - 532, - 533, - 534, - 535, - 536, - 537, - 538, - 539, - 540, - 541, - 542, - 543, - 544, - 545, - 546, - 547, - 548, - 549, - 550, - 551, - 552, - 553, - 554, - 555, - 556, - 557, - 558, - 559, - 560, - 561, - 562, - 563, - 564, - 565, - 566, - 567, - 568, - 569, - 570, - 571, - 572, - 573, - 574, - 575, - 576, - 577, - 578, - 579, - 580, - 581, - 582, - 583, - 584, - 585, - 586, - 587, - 588, - 589, - 590, - 591, - 592, - 593, - 594, - 595, - 596, - 597, - 598, - 599, - 600, - 601, - 602, - 603, - 604, - 605, - 606, - 607, - 608, - 609, - 610, - 611, - 612, - 613, - 614, - 615, - 616, - 617, - 618, - 619, - 620, - 621, - 622, - 623, - 624, - 625, - 626, - 627, - 628, - 629, - 630, - 631, - 632, - 633, - 634, - 635, - 636, - 637, - 638, - 639, - 640, - 641, - 642, - 643, - 644, - 645, - 646, - 647, - 648, - 649, - 650, - 651, - 652, - 653, - 654, - 655, - 656, - 657, - 658, - 659, - 660, - 661, - 662, - 663, - 664, - 665, - 666, - 667, - 668, - 669, - 670, - 671, - 672, - 673, - 674, - 675, - 676, - 677, - 678, - 679, - 680, - 681, - 682, - 683, - 684, - 685, - 686, - 687, - 688, - 689, - 690, - 691, - 692, - 693, - 694, - 695, - 696, - 697, - 698, - 699, - 700, - 701, - 702, - 703, - 704, - 705, - 706, - 707, - 708, - 709, - 710, - 711, - 712, - 713, - 714, - 715, - 716, - 717, - 718, - 719, - 720, - 721, - 722, - 723, - 724, - 725, - 726, - 727, - 728, - 729, - 730, - 731, - 732, - 733, - 734, - 735, - 736, - 737, - 738, - 739, - 740, - 741, - 742, - 743, - 744, - 745, - 746, - 747, - 748, - 749, - 750, - 751, - 752, - 753, - 754, - 755, - 756, - 757, - 758, - 759, - 760, - 761, - 762, - 763, - 764, - 765, - 766, - 767, - 768, - 769, - 770, - 771, - 772, - 773, - 774, - 775, - 776, - 777, - 778, - 779, - 780, - 781, - 782, - 783, - 784, - 785, - 786, - 787, - 788, - 789, - 790, - 791, - 792, - 793, - 794, - 795, - 796, - 797, - 798, - 799, - 800, - 801, - 802, - 803, - 804, - 805, - 806, - 807, - 808, - 809, - 810, - 811, - 812, - 813, - 814, - 815, - 816, - 817, - 818, - 819, - 820, - 821, - 822, - 823, - 824, - 825, - 826, - 827, - 828, - 829, - 830, - 831, - 832, - 833, - 834, - 835, - 836, - 837, - 838, - 839, - 840, - 841, - 842, - 843, - 844, - 845, - 846, - 847, - 848, - 849, - 850, - 851, - 852, - 853, - 854, - 855, - 856, - 857, - 858, - 859, - 860, - 861, - 862, - 863, - 864, - 865, - 866, - 867, - 868, - 869, - 870, - 871, - 872, - 873, - 874, - 875, - 876, - 877, - 878, - 879, - 880, - 881, - 882, - 883, - 884, - 885, - 886, - 887, - 888, - 889, - 890, - 891, - 892, - 893, - 894, - 895, - 896, - 897, - 898, - 899, - 900, - 901, - 902, - 903, - 904, - 905, - 906, - 907, - 908, - 909, - 910, - 911, - 912, - 913, - 914, - 915, - 916, - 917, - 918, - 919, - 920, - 921, - 922, - 923, - 924, - 925, - 926, - 927, - 928, - 929, - 930, - 931, - 932, - 933, - 934, - 935, - 936, - 937, - 938, - 939, - 940, - 941, - 942, - 943, - 944, - 945, - 946, - 947, - 948, - 949, - 950, - 951, - 952, - 953 - ], - "xaxis": "x", - "y": [ - 0.04378921929147703, - 0.07477183765134486, - 0.03771937826552772, - 0.05749222420980592, - 0.06865163220252665, - 0.05054398596870728, - 0.05534103635996282, - 0.04982243951802606, - 0.06486664915402349, - 0.08132120609826332, - 0.14083110952420602, - 0.11725247480815165, - 0.01179590804829904, - 0.015039701741417943, - 0.10161177292721485, - 0.044979437390446325, - 0.06009613361349407, - 0.06009613361349407, - 0.11432431835752652, - 0.0672150257464411, - 0.09496442269007258, - 0.08549040247838323, - 0.08595463815818319, - 0.06981264039801117, - 0.057234325872467365, - 0.08013614426697302, - 0.06839659622416092, - 0.050043769116721454, - 0.04328561130014017, - 0.03246960055382994, - 0.03246960055382994, - 0.03246960055382994, - 0.07488908680771666, - 0.07488908680771666, - 0.07488908680771666, - 0.07488908680771666, - 0.07488908680771666, - 0.07488908680771666, - -0.1701280693927979, - -0.17987278567030465, - -0.257738305732135, - -0.22131511118433925, - -0.2163885433814459, - -0.19403380295752645, - -0.20953918901559165, - -0.2639089459862469, - -0.22944680091680325, - -0.2545434931509844, - -0.2994446709261072, - -0.2720549195423073, - -0.2762696571497247, - -0.319633935922958, - -0.36494448691134784, - -0.3727671080030579, - -0.3727671080030579, - -0.3727671080030579, - -0.3732039468465301, - -0.3401279003037554, - -0.3401279003037554, - -0.3071224996669148, - -0.32534296293262194, - -0.30626013199430924, - -0.2892014172295069, - -0.33664677556324135, - -0.23752726441754823, - -0.23752726441754823, - -0.2179764892354421, - -0.19128506453138985, - -0.19882182952401536, - -0.1885082339893603, - -0.10700868365430702, - -0.31701004741931793, - -0.2328634964660317, - -0.22371269085965548, - -0.12098766751315998, - -0.23630979627725185, - -0.1939064395618363, - -0.22335936884227547, - -0.2046636902324702, - -0.2384511365493033, - -0.2384511365493033, - -0.2384511365493033, - -0.2384511365493033, - -0.2669549055606577, - -0.35727638861576827, - -0.35727638861576827, - -0.35727638861576827, - -0.35727638861576827, - -0.41543025138141954, - -0.38214081755924373, - -0.4226693315929199, - -0.3909621866707979, - -0.34875983458846854, - -0.31344922626734667, - -0.30768575599974, - -0.3001168182310406, - -0.2914267283111032, - -0.3374999921262607, - -0.2910383268405608, - -0.3101417095196692, - -0.2880773160171068, - -0.2846001398324781, - -0.24873705368753496, - -0.24731677530246515, - -0.261919713098763, - -0.2507695284200726, - -0.2508712606750911, - -0.22973142951782158, - -0.2512782932212791, - -0.2223873756615621, - -0.23536186393970937, - -0.231529301787802, - -0.20740765336989403, - -0.21424972612003512, - -0.21424972612003512, - -0.21424972612003512, - -0.1918848070840479, - -0.18313149192316105, - -0.15747652046085098, - -0.1641397264678473, - -0.1692836313710276, - -0.15608749712004935, - -0.1598513279726846, - -0.1608855891914895, - -0.1608855891914895, - -0.1608855891914895, - -0.1608855891914895, - -0.10943101559501651, - -0.10943101559501651, - -0.10943101559501651, - -0.0738604351447554, - -0.016601615387573064, - -0.13400896852544902, - -0.1748517258596471, - -0.1748517258596471, - -0.14521343000086986, - -0.12617319303446722, - -0.12617319303446722, - -0.11866934547131439, - -0.12732342331024224, - -0.13623983692274355, - -0.06710836804676903, - -0.2043868942868835, - -0.07900223950757948, - -0.07900223950757948, - -0.14036021849575714, - -0.14036021849575714, - -0.11218788065609366, - -0.2708196885673965, - -0.2708196885673965, - -0.0229774557204368, - -0.16534049708499887, - -0.06829320393340334, - -0.22029291183707372, - -0.22029291183707372, - -0.13442593728888827, - -0.13442593728888827, - -0.30452351851624704, - -0.04992114705630307, - -0.1304328783406452, - -0.12787991240900623, - -0.13902900330860257, - -0.14186915821270263, - -0.09462318398098138, - -0.017290280798451615, - -0.18516893676174756, - -0.2165550696722805, - -0.1898883157392628, - -0.10477100450480292, - -0.10477100450480292, - 0.006075498159836101, - 0.006075498159836101, - -0.14761256392246958, - -0.11449044672999747, - -0.13328282907566089, - -0.12600334824706275, - -0.2977240611042759, - -0.2963652141201334, - -0.21789944395293037, - -0.18039041003460837, - -0.15991032626284288, - -0.15623132188287442, - -0.1759663734486342, - -0.2380483922262725, - -0.26824747594085546, - -0.27030334767942854, - -0.2613763708258291, - -0.3647353625729265, - -0.28302585365339394, - -0.2772362796604931, - -0.249500375773359, - -0.24993238689721364, - -0.2705973889755976, - -0.2974215696870848, - -0.27664436803308307, - -0.27664436803308307, - -0.27664436803308307, - -0.27664436803308307, - -0.27664436803308307, - -0.27664436803308307, - -0.27664436803308307, - -0.27664436803308307, - -0.27664436803308307, - -0.0220419965731391, - 0.01006197592813448, - -0.007264570881714654, - -0.11242579661658775, - -0.11242579661658775, - -0.11242579661658775, - -0.11242579661658775, - -0.11242579661658775, - -0.11242579661658775, - -0.11242579661658775, - -0.11242579661658775, - 0.14217657484335622, - 0.1946109982683955, - 0.24225193066062847, - 0.21043969710018012, - 0.21170648855232083, - 0.21416321737689092, - 0.2037252256307867, - 0.1723314798456294, - 0.1723314798456294, - 0.1723314798456294, - 0.1723314798456294, - 0.1723314798456294, - 0.1723314798456294, - 0.1723314798456294, - 0.42178941412616694, - 0.4488955390220887, - 0.5705176148303712, - 0.3271725378281213, - 0.21838319183448557, - 0.3293079135087333, - 0.5839102849686773, - 0.3497325881579112, - 0.22125146018255085, - 0.2634564539627835, - 0.2589046894625081, - 0.44663153083279294, - 0.3343474074309256, - 0.08933025123041105, - 0.25002300045698905, - 0.2946770036082903, - 0.35949412391628494, - 0.37324919115033045, - 0.4846912302547262, - 0.41407612384626674, - 0.38358336485005023, - 0.3850168893638918, - 0.3148037571651817, - 0.4793276959138075, - 0.45647063834123236, - 0.45647063834123236, - 0.5374206017847074, - 0.5914848861162564, - 0.5803736555646628, - 0.5916993953315093, - 0.46271047967350254, - 0.530341915074645, - 0.5502715131025325, - 0.49584311991685975, - 0.48914248992317433, - 0.5331766715845887, - 0.39567829391765835, - 0.4252313999566473, - 0.5583295440845568, - 0.49100311255682616, - 0.5351113298065716, - 0.49606321387394614, - 0.5716517498190298, - 0.5521516442531588, - 0.4961206215856859, - 0.5453615571648153, - 0.5622511024046755, - 0.5442423473227265, - 0.6074574186601462, - 0.5750329563046799, - 0.5750329563046799, - 0.5750329563046799, - 0.6213285016273957, - 0.6449457165042172, - 0.44783475110903875, - 0.4386560677416796, - 0.47623890254010065, - 0.41397217110973855, - 0.41397217110973855, - 0.45826874303895415, - 0.48043179621263266, - 0.4731349905101592, - 0.46842375831539673, - 0.4929405309323468, - 0.4558250144195171, - 0.4542667993321929, - 0.4666650601546461, - 0.4708369290417304, - 0.4374174675129825, - 0.4374174675129825, - 0.41334102675637907, - 0.43916579751868695, - 0.4369015827017117, - 0.44648928877497185, - 0.44648928877497185, - 0.44648928877497185, - 0.44648928877497185, - 0.41108681084809373, - 0.465244397571329, - 0.465244397571329, - 0.465244397571329, - 0.465244397571329, - 0.465244397571329, - 0.5649187125221383, - 0.31990155632162376, - 0.5745039277815678, - 0.4731165743554653, - 0.5474722677271647, - 0.6517940270800401, - 0.8070799267584938, - 0.8070799267584938, - 0.5620627705579793, - 0.5537772062949329, - 0.5269228609418228, - 0.532127402404196, - 0.5393020518459274, - 0.5421796641387683, - 0.5198845632847273, - 0.5223113311922601, - 0.5223113311922601, - 0.49990963704116204, - 0.4991599707376472, - 0.5212716127795847, - 0.5168606178553989, - 0.5148181930564719, - 0.5151588870085588, - 0.5103785765941988, - 0.5086657697469311, - 0.507293408859356, - 0.506404799769476, - 0.5031909630975947, - 0.5001987692426755, - 0.5046837092497278, - 0.49418738716584404, - 0.49418738716584404, - 0.49418738716584404, - 0.49418738716584404, - 0.5078103941311422, - 0.5078103941311422, - 0.5078103941311422, - 0.5143939291101561, - 0.5268721096740283, - 0.531708978927572, - 0.5276803377021863, - 0.5209296578685091, - 0.5114014848099093, - 0.4946794125814715, - 0.49572192065153703, - 0.49936216388471877, - 0.49936216388471877, - 0.4592922175222348, - 0.46037225726750336, - 0.44824508619615405, - 0.4499949733186019, - 0.4441608311463227, - 0.43976277843211853, - 0.445617591530421, - 0.4425858992241397, - 0.4298558112315575, - 0.4274827522293122, - 0.43415375034533465, - 0.43526126955357913, - 0.43526126955357913, - 0.43526126955357913, - 0.43526126955357913, - 0.43526126955357913, - 0.43526126955357913, - 0.43526126955357913, - 0.43526126955357913, - 0.3668099872989199, - 0.34793104301138517, - 0.35408587160580557, - 0.34900417282264995, - 0.3431781148106354, - 0.3697913504739461, - 0.3540337487389339, - 0.3560326993748995, - 0.3755443824932594, - 0.34424806873725555, - 0.3543005064718844, - 0.3438167607423305, - 0.34543265315947996, - 0.346777238437681, - 0.34972897756880816, - 0.34972897756880816, - 0.34057712142350255, - 0.3451635190184812, - 0.3505324874952242, - 0.33542341312569324, - 0.33542341312569324, - 0.3577298544057604, - 0.3577298544057604, - 0.3577298544057604, - 0.35506822501291024, - 0.3661997724371008, - 0.35373474899228213, - 0.36777992633599704, - 0.3502593665535155, - 0.3698829216411639, - 0.3698829216411639, - 0.3604798513478399, - 0.3539574743177897, - 0.3616652889673996, - 0.35874862439835714, - 0.3674732207026237, - 0.3685913302848228, - 0.35642246015511314, - 0.37501264027419995, - 0.36753902647265624, - 0.3561739021768928, - 0.3509690328307617, - 0.3440409723871687, - 0.3440409723871687, - 0.3440409723871687, - 0.3440409723871687, - 0.3440409723871687, - 0.3440409723871687, - 0.3440409723871687, - 0.3440409723871687, - 0.3440409723871687, - 0.4667691453791818, - 0.5412526492806689, - 0.47412308030252714, - 0.49594646683962706, - 0.509797713209263, - 0.40608433983850034, - 0.4436137478333338, - 0.5293541654505185, - 0.5391571092020458, - 0.5265516198274088, - 0.5356035111829075, - 0.49194517051987763, - 0.5232682710675469, - 0.51409214798277, - 0.48136054806552525, - 0.48136054806552525, - 0.46822613526418666, - 0.46822613526418666, - 0.46822613526418666, - 0.44690357564553623, - 0.4409290299643695, - 0.5030992312212942, - 0.5078440243057668, - 0.5078440243057668, - 0.46197123656890315, - 0.4365025644267269, - 0.5159321306025091, - 0.46621328061066153, - 0.44816794029229434, - 0.44816794029229434, - 0.494342686101154, - 0.5643504472815136, - 0.5643504472815136, - 0.5643504472815136, - 0.621694271798273, - 0.621694271798273, - 0.621694271798273, - 0.5495952516097382, - 0.6590106420294596, - 0.652944860209537, - 0.652944860209537, - 0.6828163798604995, - 0.6844053917807023, - 0.6848366975040951, - 0.709679616449483, - 0.709572860084974, - 0.6534809264827873, - 0.6299705400227048, - 0.6299705400227048, - 0.6161076800661578, - 0.6161076800661578, - 0.6271758981482145, - 0.6271758981482145, - 0.7489083840873655, - 0.5739869205652037, - 0.5785798653976346, - 0.5735050419555596, - 0.5133842563653058, - 0.499582942888653, - 0.499582942888653, - 0.754185314348597, - 0.754185314348597, - 0.7630339962018705, - 0.7630339962018705, - 0.59396195320053, - 0.6997407700823725, - 0.7225939091185707, - 0.695077632051443, - 0.7201486790214837, - 0.8336091903630581, - 0.6979472530999611, - 0.8336781172464104, - 0.8325641424221419, - 0.7162456964113747, - 0.7162456964113747, - 0.6198461704054138, - 0.7172788147117821, - 0.7574588565049408, - 0.7574588565049408, - 0.7574588565049408, - 0.7574588565049408, - 0.7574588565049408, - 0.9931330805050149, - 0.9931330805050149, - 1.1711482672585913, - 1.1508384320216372, - 1.1497868936477018, - 1.1395747292669705, - 1.1423806010071473, - 1.1423806010071473, - 1.1423806010071473, - 1.198727325166692, - 1.198727325166692, - 1.198727325166692, - 1.198727325166692, - 1.198727325166692, - 1.0858098649971994, - 1.2630961552251918, - 1.2493134180284107, - 1.004296261827896, - 1.25889863328784, - 1.24899926465757, - 1.1222925916231654, - 1.1890721688311017, - 1.2969581787487372, - 1.253741646567147, - 1.3198091143085344, - 1.301860831802621, - 1.2482715984770367, - 1.2979467595583623, - 1.3296037275053358, - 1.3296037275053358, - 1.3296037275053358, - 1.3347038397971058, - 1.243835980334577, - 1.243835980334577, - 1.2878272677847689, - 1.2878272677847689, - 1.3043595678764193, - 1.27563952402736, - 1.27563952402736, - 1.347301342594182, - 1.2424926709770725, - 1.2424926709770725, - 1.2424926709770725, - 1.3427212368018933, - 1.2610140533183132, - 1.2610140533183132, - 1.2610140533183132, - 1.312889254400546, - 1.299950736351001, - 1.318353552918759, - 1.318353552918759, - 1.2630624536390636, - 1.2430351893424483, - 1.204100378212523, - 1.172161377518292, - 1.1749069116552409, - 1.2850508573459332, - 1.2321143592520158, - 1.2321143592520158, - 1.3000920330828092, - 1.3000920330828092, - 1.3223318723446835, - 1.383885843487058, - 1.383885843487058, - 1.4009803587372593, - 1.3890742438365555, - 1.4127282210223098, - 1.3455361184934436, - 1.3639226100987283, - 1.3028377612589679, - 1.3149183321901747, - 1.3149183321901747, - 1.3012592543174062, - 1.3329754689582576, - 1.2366885034682296, - 1.363616458255835, - 1.363616458255835, - 1.363616458255835, - 1.363616458255835, - 1.363616458255835, - 1.1185993020553204, - 1.0641660886642519, - 1.1198051186455082, - 1.1205511640873769, - 1.1450085297376995, - 1.2042131180735536, - 1.1373051952180726, - 1.1658699385254403, - 1.2093293968329817, - 1.2677849646748571, - 1.2497286379922505, - 1.2899974623922488, - 1.2899974623922488, - 1.2899974623922488, - 1.2546550525882536, - 1.3004617182043918, - 1.2173995566365008, - 1.200340407447726, - 1.1051002600727748, - 1.1051002600727748, - 1.1191289459491225, - 1.1576952879916869, - 1.1576952879916869, - 0.962701796486904, - 0.9655225900492033, - 0.987750384472505, - 0.9814099009710829, - 1.0795008700329087, - 1.1328031818469784, - 1.210587404562568, - 1.2189987391796369, - 1.2527061475938563, - 1.2703218952130597, - 1.2847756866170732, - 1.3594867381078606, - 1.3697782435703432, - 1.4008811684469438, - 1.399376102479122, - 1.4144254956357325, - 1.4123202876170848, - 1.4652350985620264, - 1.4325606089009606, - 1.4315629297167478, - 1.4313566256736818, - 1.3748803819829194, - 1.3748803819829194, - 1.360528133316246, - 1.3723136646579013, - 1.3723136646579013, - 1.3723136646579013, - 1.3723136646579013, - 1.2683334684740926, - 1.229469045301402, - 1.2769266031143922, - 1.3312230458219505, - 1.3032217293969188, - 1.334820671345506, - 1.3757454864165153, - 1.3966423488135824, - 1.3501714997666574, - 1.3501714997666574, - 1.3501714997666574, - 1.4107173932170938, - 1.458399426903346, - 1.4490477378767728, - 1.4489877420936568, - 1.4721246838765503, - 1.4258230013980129, - 1.4228326704370395, - 1.4228326704370395, - 1.4228326704370395, - 1.4228326704370395, - 1.4228326704370395, - 1.4228326704370395, - 1.4228326704370395, - 1.4228326704370395, - 1.310598268098472, - 1.226982063072485, - 1.2094389729344572, - 1.3816705349856635, - 1.383033755490975, - 1.3599311590991066, - 1.5084017392544178, - 1.4397755857576797, - 1.4397755857576797, - 1.531423389656099, - 1.5400403303552208, - 1.5414973599002475, - 1.5432125473561176, - 1.625094040130484, - 1.509456043251484, - 1.594176602931381, - 1.6801176972862844, - 1.6801176972862844, - 1.6822528305424933, - 1.7340365895566487, - 1.6966623346281544, - 1.7918416816708775, - 1.701406073832469, - 1.7016256443443651, - 1.7372266998406702, - 1.7380306015886966, - 1.7150720611208516, - 1.6309545629502606, - 1.6706417169776542, - 1.7270187453394925, - 1.7744108230975837, - 1.7744108230975837, - 1.7488482531153875, - 1.7492537488093247, - 1.7492537488093247, - 1.7492537488093247, - 1.7492537488093247, - 1.7492537488093247, - 1.8106265419224177, - 1.6775668770233876, - 1.6775668770233876, - 1.8480456590914645, - 1.813322369220712, - 1.8567488623373005, - 1.8567488623373005, - 1.84351054163169, - 1.769991080681903, - 1.8211099847546641, - 1.7596932434625978, - 1.7958616620096066, - 1.7846392416386752, - 1.8025413050144736, - 1.8049676123519616, - 1.7624017058602117, - 1.7688308967498534, - 1.7772079502584195, - 1.775582371558313, - 1.8072350284434413, - 1.734224227905152, - 1.7420459832223036, - 1.7420459832223036, - 1.8205061160331542, - 1.7140368284310703, - 1.7924972689616954, - 1.697164670473693, - 1.6826064600936612, - 1.7260586995538594, - 1.6401324310314749, - 1.6677803954254047, - 1.6677803954254047, - 1.6677803954254047, - 1.6677803954254047, - 1.5695616637806413, - 1.5644753040319062, - 1.6107860645233858, - 1.6369623145228458, - 1.64046154695435, - 1.527479866813327, - 1.6019520678312702, - 1.6579577178297003, - 1.6579577178297003, - 1.7272961650073708, - 1.6534333139555275, - 1.6534333139555275, - 1.709580970302838, - 1.7043027428655626, - 1.7384855036183118, - 1.7683919949408975, - 1.7753195990042063, - 1.774006763474263, - 1.7564270304189329, - 1.7653065951782487, - 1.787058823108079, - 1.787058823108079, - 1.787058823108079, - 1.787058823108079, - 1.787058823108079, - 1.787058823108079, - 1.6267081905245762, - 1.6267081905245762, - 1.6267081905245762, - 1.6267081905245762, - 1.6267081905245762, - 1.88131056198452, - 1.6362934057840055, - 1.8908957772439494, - 2.006193131373369, - 2.014756059790297, - 2.0262504125660583, - 2.0262504125660583, - 2.0998397372895687, - 2.0998397372895687, - 1.8548225810890542, - 2.009880905272683, - 2.178884532049579, - 2.189426099655425, - 1.9444089434549103, - 2.198066076836874, - 2.2004539192752186, - 2.168723737637915, - 2.2179448809826243, - 2.205330992210602, - 2.195651509508915, - 2.195651509508915, - 2.195651509508915, - 2.1608815715658984, - 2.1608815715658984, - 2.1461218970824096, - 2.1208079016592807, - 2.1208079016592807, - 2.1208079016592807, - 2.1208079016592807, - 2.0364157862928165, - 2.0409415453329163, - 2.0303865098285785, - 1.9005063257435029, - 1.8819535837584997, - 1.8984184570517313, - 1.8358565533035804, - 1.9039253639383786, - 1.8058991118535994, - 1.8933396614259652, - 1.7682118815939005, - 1.8697694706634755, - 1.7840173621251956, - 1.7840173621251956, - 1.8651764933527293, - 1.8651764933527293, - 1.9919171167135075, - 1.9919171167135075, - 1.9919171167135075, - 2.102571760809923, - 2.0848800964415415, - 2.1529946516490885, - 2.1680379787228325, - 2.1512717607931333, - 2.1333587973316894, - 2.1868424215531608, - 2.188051151166865, - 2.188051151166865, - 2.069142962164902, - 2.069142962164902, - 2.069142962164902, - 2.069142962164902, - 1.9131205889819534, - 1.8068070792448598, - 1.8964690406372977, - 1.9508359241209998, - 1.9672913517374389, - 2.096778320230545, - 2.0762873969310207, - 2.2467400108469757, - 2.001722854646461, - 2.256325226106405, - 2.3070352902558424, - 2.264363658271763, - 2.2772722385465705, - 2.2772722385465705, - 2.3437566514981576, - 2.291362917669883, - 2.3248311883882353, - 2.307340359106125, - 2.2925268344674667, - 2.3466873465896505, - 2.3466873465896505, - 2.3466873465896505, - 2.3466873465896505, - 2.3466873465896505, - 2.3466873465896505, - 2.3466873465896505, - 2.5616567537995794, - 2.4697987620851505, - 2.4738521148386594, - 2.4738521148386594, - 2.4727298041016827, - 2.561644114445455, - 2.561644114445455, - 2.561644114445455, - 2.5351228579404963, - 2.584925476156407, - 2.595166274658894, - 2.685243149132632, - 2.6559350254933793, - 2.6559350254933793, - 2.6559350254933793, - 2.49712888180886, - 2.535638552750905, - 2.6464280104746316, - 2.6464280104746316, - 2.6703333902232678, - 2.66537790038802, - 2.656237321035544, - 2.6878966447082786, - 2.6480459293723237, - 2.6812416149849025, - 2.6078225022966723, - 2.6078225022966723, - 2.6703248255976315, - 2.68836951815436, - 2.681489909332275, - 2.6350939475758284, - 2.6350939475758284, - 2.6350939475758284, - 2.6350939475758284, - 2.5530921243028506, - 2.5288993438036056, - 2.6323036287154546, - 2.675129555180036, - 2.761888798818063, - 2.7593434607793537, - 2.7302711817574115, - 2.7043487865520506, - 2.7043487865520506, - 2.7302559272181806, - 2.6743303683597093, - 2.7196513020829935, - 2.669973292501354, - 2.652195627147968, - 2.652195627147968, - 2.637642240573371, - 2.6413338387805747, - 2.770206099490997, - 2.726422718217439, - 2.7801280320006705, - 2.6425456110225114, - 2.685331432217875, - 2.5324207452035026, - 2.5324207452035026, - 2.6760209045272725, - 2.6552043808722043, - 2.665613083968369, - 2.665613083968369, - 2.7679709552979705, - 2.6844770367250006, - 2.690874561653692, - 2.684721893088144, - 2.6711539379329667, - 2.703188248357036, - 2.703188248357036, - 2.7176328549670448, - 2.7239593520020375, - 2.7530615601788426, - 2.7565448966175334, - 2.7565448966175334, - 2.7565448966175334, - 2.7565448966175334, - 2.861348042267967, - 2.8771216942941193, - 2.819512635788272, - 2.8804008827536345, - 2.863034105581437, - 2.8539645964273643, - 2.879574614404025, - 2.801225292215691, - 2.8469990738773467, - 2.842299657770298, - 2.900194671732673, - 2.900194671732673, - 2.900194671732673, - 2.8640949042164823, - 2.8466107877736877, - 2.8466107877736877, - 2.7967368243210715, - 2.7793633728142395, - 2.7583106089222125, - 2.7974492324442175, - 2.77134769096087, - 2.709886654189403 - ], - "yaxis": "y" - } - ], - "layout": { - "legend": { - "title": { - "text": "variable" - }, - "tracegroupgap": 0 - }, - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "heatmapgl": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmapgl" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "title": { - "text": "Cumulative Returns with Winsorized Skips" - }, - "xaxis": { - "anchor": "y", - "domain": [ - 0, - 1 - ], - "title": { - "text": "index" - } - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0, - 1 - ], - "title": { - "text": "value" - } - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "pd.Series(clipped_returns).cumsum().plot(title = 'Cumulative Returns with Winsorized Skips')" - ] - }, - { - "cell_type": "code", - "execution_count": 176, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "hovertemplate": "variable=Total
datetime=%{x}
value=%{y}", - "legendgroup": "Total", - "line": { - "color": "#636efa", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "Total", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": [ - "2021-01-06T00:00:00", - "2021-01-07T00:00:00", - "2021-01-08T00:00:00", - "2021-01-11T00:00:00", - "2021-01-12T00:00:00", - "2021-01-13T00:00:00", - "2021-01-14T00:00:00", - "2021-01-15T00:00:00", - "2021-01-19T00:00:00", - "2021-01-20T00:00:00", - "2021-01-21T00:00:00", - "2021-01-22T00:00:00", - "2021-01-25T00:00:00", - "2021-01-26T00:00:00", - "2021-01-27T00:00:00", - "2021-01-28T00:00:00", - "2021-01-29T00:00:00", - "2021-02-01T00:00:00", - "2021-02-02T00:00:00", - "2021-02-03T00:00:00", - "2021-02-04T00:00:00", - "2021-02-05T00:00:00", - "2021-02-08T00:00:00", - "2021-02-09T00:00:00", - "2021-02-10T00:00:00", - "2021-02-11T00:00:00", - "2021-02-12T00:00:00", - "2021-02-16T00:00:00", - "2021-02-17T00:00:00", - "2021-02-18T00:00:00", - "2021-02-19T00:00:00", - "2021-02-22T00:00:00", - "2021-02-23T00:00:00", - "2021-02-24T00:00:00", - "2021-02-25T00:00:00", - "2021-02-26T00:00:00", - "2021-03-01T00:00:00", - "2021-03-02T00:00:00", - "2021-03-03T00:00:00", - "2021-03-04T00:00:00", - "2021-03-05T00:00:00", - "2021-03-08T00:00:00", - "2021-03-09T00:00:00", - "2021-03-10T00:00:00", - "2021-03-11T00:00:00", - "2021-03-12T00:00:00", - "2021-03-15T00:00:00", - "2021-03-16T00:00:00", - "2021-03-17T00:00:00", - "2021-03-18T00:00:00", - "2021-03-19T00:00:00", - "2021-03-22T00:00:00", - "2021-03-23T00:00:00", - "2021-03-24T00:00:00", - "2021-03-25T00:00:00", - "2021-03-26T00:00:00", - "2021-03-29T00:00:00", - "2021-03-30T00:00:00", - "2021-03-31T00:00:00", - "2021-04-01T00:00:00", - "2021-04-05T00:00:00", - "2021-04-06T00:00:00", - "2021-04-07T00:00:00", - "2021-04-08T00:00:00", - "2021-04-09T00:00:00", - "2021-04-12T00:00:00", - "2021-04-13T00:00:00", - "2021-04-14T00:00:00", - "2021-04-15T00:00:00", - "2021-04-16T00:00:00", - "2021-04-19T00:00:00", - "2021-04-20T00:00:00", - "2021-04-21T00:00:00", - "2021-04-22T00:00:00", - "2021-04-23T00:00:00", - "2021-04-26T00:00:00", - "2021-04-27T00:00:00", - "2021-04-28T00:00:00", - "2021-04-29T00:00:00", - "2021-04-30T00:00:00", - "2021-05-03T00:00:00", - "2021-05-04T00:00:00", - "2021-05-05T00:00:00", - "2021-05-06T00:00:00", - "2021-05-07T00:00:00", - "2021-05-10T00:00:00", - "2021-05-11T00:00:00", - "2021-05-12T00:00:00", - "2021-05-13T00:00:00", - "2021-05-14T00:00:00", - "2021-05-17T00:00:00", - "2021-05-18T00:00:00", - "2021-05-19T00:00:00", - "2021-05-20T00:00:00", - "2021-05-21T00:00:00", - "2021-05-24T00:00:00", - "2021-05-25T00:00:00", - "2021-05-26T00:00:00", - "2021-05-27T00:00:00", - "2021-05-28T00:00:00", - "2021-06-01T00:00:00", - "2021-06-02T00:00:00", - "2021-06-03T00:00:00", - "2021-06-04T00:00:00", - "2021-06-07T00:00:00", - "2021-06-08T00:00:00", - "2021-06-09T00:00:00", - "2021-06-10T00:00:00", - "2021-06-11T00:00:00", - "2021-06-14T00:00:00", - "2021-06-15T00:00:00", - "2021-06-16T00:00:00", - "2021-06-17T00:00:00", - "2021-06-18T00:00:00", - "2021-06-21T00:00:00", - "2021-06-22T00:00:00", - "2021-06-23T00:00:00", - "2021-06-24T00:00:00", - "2021-06-25T00:00:00", - "2021-06-28T00:00:00", - "2021-06-29T00:00:00", - "2021-06-30T00:00:00", - "2021-07-01T00:00:00", - "2021-07-02T00:00:00", - "2021-07-05T00:00:00", - "2021-07-06T00:00:00", - "2021-07-07T00:00:00", - "2021-07-08T00:00:00", - "2021-07-09T00:00:00", - "2021-07-12T00:00:00", - "2021-07-13T00:00:00", - "2021-07-14T00:00:00", - "2021-07-15T00:00:00", - "2021-07-16T00:00:00", - "2021-07-19T00:00:00", - "2021-07-20T00:00:00", - "2021-07-21T00:00:00", - "2021-07-22T00:00:00", - "2021-07-23T00:00:00", - "2021-07-26T00:00:00", - "2021-07-27T00:00:00", - "2021-07-28T00:00:00", - "2021-07-29T00:00:00", - "2021-07-30T00:00:00", - "2021-08-02T00:00:00", - "2021-08-03T00:00:00", - "2021-08-04T00:00:00", - "2021-08-05T00:00:00", - "2021-08-06T00:00:00", - "2021-08-09T00:00:00", - "2021-08-10T00:00:00", - "2021-08-11T00:00:00", - "2021-08-12T00:00:00", - "2021-08-13T00:00:00", - "2021-08-16T00:00:00", - "2021-08-17T00:00:00", - "2021-08-18T00:00:00", - "2021-08-19T00:00:00", - "2021-08-20T00:00:00", - "2021-08-23T00:00:00", - "2021-08-24T00:00:00", - "2021-08-25T00:00:00", - "2021-08-26T00:00:00", - "2021-08-27T00:00:00", - "2021-08-30T00:00:00", - "2021-08-31T00:00:00", - "2021-09-01T00:00:00", - "2021-09-02T00:00:00", - "2021-09-03T00:00:00", - "2021-09-07T00:00:00", - "2021-09-08T00:00:00", - "2021-09-09T00:00:00", - "2021-09-10T00:00:00", - "2021-09-13T00:00:00", - "2021-09-14T00:00:00", - "2021-09-15T00:00:00", - "2021-09-16T00:00:00", - "2021-09-17T00:00:00", - "2021-09-20T00:00:00", - "2021-09-21T00:00:00", - "2021-09-22T00:00:00", - "2021-09-23T00:00:00", - "2021-09-24T00:00:00", - "2021-09-27T00:00:00", - "2021-09-28T00:00:00", - "2021-09-29T00:00:00", - "2021-09-30T00:00:00", - "2021-10-01T00:00:00", - "2021-10-04T00:00:00", - "2021-10-05T00:00:00", - "2021-10-06T00:00:00", - "2021-10-07T00:00:00", - "2021-10-08T00:00:00", - "2021-10-11T00:00:00", - "2021-10-12T00:00:00", - "2021-10-13T00:00:00", - "2021-10-14T00:00:00", - "2021-10-15T00:00:00", - "2021-10-18T00:00:00", - "2021-10-19T00:00:00", - "2021-10-20T00:00:00", - "2021-10-21T00:00:00", - "2021-10-22T00:00:00", - "2021-10-25T00:00:00", - "2021-10-26T00:00:00", - "2021-10-27T00:00:00", - "2021-10-28T00:00:00", - "2021-10-29T00:00:00", - "2021-11-01T00:00:00", - "2021-11-02T00:00:00", - "2021-11-03T00:00:00", - "2021-11-04T00:00:00", - "2021-11-05T00:00:00", - "2021-11-08T00:00:00", - "2021-11-09T00:00:00", - "2021-11-10T00:00:00", - "2021-11-11T00:00:00", - "2021-11-12T00:00:00", - "2021-11-15T00:00:00", - "2021-11-16T00:00:00", - "2021-11-17T00:00:00", - "2021-11-18T00:00:00", - "2021-11-19T00:00:00", - "2021-11-22T00:00:00", - "2021-11-23T00:00:00", - "2021-11-24T00:00:00", - "2021-11-25T00:00:00", - "2021-11-26T00:00:00", - "2021-11-29T00:00:00", - "2021-11-30T00:00:00", - "2021-12-01T00:00:00", - "2021-12-02T00:00:00", - "2021-12-03T00:00:00", - "2021-12-06T00:00:00", - "2021-12-07T00:00:00", - "2021-12-08T00:00:00", - "2021-12-09T00:00:00", - "2021-12-10T00:00:00", - "2021-12-13T00:00:00", - "2021-12-14T00:00:00", - "2021-12-15T00:00:00", - "2021-12-16T00:00:00", - "2021-12-17T00:00:00", - "2021-12-20T00:00:00", - "2021-12-21T00:00:00", - "2021-12-22T00:00:00", - "2021-12-23T00:00:00", - "2021-12-27T00:00:00", - "2021-12-28T00:00:00", - "2021-12-29T00:00:00", - "2021-12-30T00:00:00", - "2021-12-31T00:00:00", - "2022-01-03T00:00:00", - "2022-01-05T00:00:00", - "2022-01-06T00:00:00", - "2022-01-07T00:00:00", - "2022-01-10T00:00:00", - "2022-01-11T00:00:00", - "2022-01-12T00:00:00", - "2022-01-13T00:00:00", - "2022-01-14T00:00:00", - "2022-01-18T00:00:00", - "2022-01-19T00:00:00", - "2022-01-20T00:00:00", - "2022-01-21T00:00:00", - "2022-01-24T00:00:00", - "2022-01-25T00:00:00", - "2022-01-26T00:00:00", - "2022-01-27T00:00:00", - "2022-01-28T00:00:00", - "2022-01-31T00:00:00", - "2022-02-01T00:00:00", - "2022-02-02T00:00:00", - "2022-02-03T00:00:00", - "2022-02-04T00:00:00", - "2022-02-07T00:00:00", - "2022-02-08T00:00:00", - "2022-02-09T00:00:00", - "2022-02-10T00:00:00", - "2022-02-11T00:00:00", - "2022-02-14T00:00:00", - "2022-02-15T00:00:00", - "2022-02-16T00:00:00", - "2022-02-17T00:00:00", - "2022-02-18T00:00:00", - "2022-02-22T00:00:00", - "2022-02-23T00:00:00", - "2022-02-24T00:00:00", - "2022-02-25T00:00:00", - "2022-02-28T00:00:00", - "2022-03-01T00:00:00", - "2022-03-02T00:00:00", - "2022-03-03T00:00:00", - "2022-03-04T00:00:00", - "2022-03-07T00:00:00", - "2022-03-08T00:00:00", - "2022-03-09T00:00:00", - "2022-03-10T00:00:00", - "2022-03-11T00:00:00", - "2022-03-14T00:00:00", - "2022-03-15T00:00:00", - "2022-03-16T00:00:00", - "2022-03-17T00:00:00", - "2022-03-18T00:00:00", - "2022-03-21T00:00:00", - "2022-03-22T00:00:00", - "2022-03-23T00:00:00", - "2022-03-24T00:00:00", - "2022-03-25T00:00:00", - "2022-03-28T00:00:00", - "2022-03-29T00:00:00", - "2022-03-30T00:00:00", - "2022-03-31T00:00:00", - "2022-04-01T00:00:00", - "2022-04-04T00:00:00", - "2022-04-05T00:00:00", - "2022-04-06T00:00:00", - "2022-04-07T00:00:00", - "2022-04-08T00:00:00", - "2022-04-11T00:00:00", - "2022-04-12T00:00:00", - "2022-04-13T00:00:00", - "2022-04-14T00:00:00", - "2022-04-18T00:00:00", - "2022-04-19T00:00:00", - "2022-04-20T00:00:00", - "2022-04-21T00:00:00", - "2022-04-22T00:00:00", - "2022-04-25T00:00:00", - "2022-04-26T00:00:00", - "2022-04-27T00:00:00", - "2022-04-28T00:00:00", - "2022-04-29T00:00:00", - "2022-05-03T00:00:00", - "2022-05-04T00:00:00", - "2022-05-05T00:00:00", - "2022-05-06T00:00:00", - "2022-05-09T00:00:00", - "2022-05-10T00:00:00", - "2022-08-01T00:00:00", - "2022-08-02T00:00:00", - "2022-08-03T00:00:00", - "2022-08-04T00:00:00", - "2022-08-05T00:00:00", - "2022-08-08T00:00:00", - "2022-08-09T00:00:00", - "2022-08-10T00:00:00", - "2022-08-11T00:00:00", - "2022-08-12T00:00:00", - "2022-08-15T00:00:00", - "2022-08-16T00:00:00", - "2022-08-17T00:00:00", - "2022-08-18T00:00:00", - "2022-08-19T00:00:00", - "2022-08-22T00:00:00", - "2022-08-23T00:00:00", - "2022-08-24T00:00:00", - "2022-08-25T00:00:00", - "2022-08-26T00:00:00", - "2022-08-29T00:00:00", - "2022-08-30T00:00:00", - "2022-08-31T00:00:00", - "2022-09-01T00:00:00", - "2022-09-02T00:00:00", - "2022-09-06T00:00:00", - "2022-09-07T00:00:00", - "2022-09-14T00:00:00", - "2022-09-15T00:00:00", - "2022-10-27T00:00:00", - "2022-10-28T00:00:00", - "2022-10-31T00:00:00", - "2022-11-01T00:00:00", - "2022-11-02T00:00:00", - "2022-11-03T00:00:00", - "2022-11-04T00:00:00", - "2022-11-14T00:00:00", - "2022-11-15T00:00:00", - "2022-11-16T00:00:00", - "2022-11-17T00:00:00", - "2022-11-18T00:00:00", - "2022-11-21T00:00:00", - "2022-11-22T00:00:00", - "2022-11-23T00:00:00", - "2022-11-25T00:00:00", - "2022-11-28T00:00:00", - "2022-11-29T00:00:00", - "2022-11-30T00:00:00", - "2022-12-01T00:00:00", - "2022-12-02T00:00:00", - "2022-12-05T00:00:00", - "2022-12-06T00:00:00", - "2022-12-07T00:00:00", - "2022-12-08T00:00:00", - "2022-12-09T00:00:00", - "2022-12-12T00:00:00", - "2022-12-13T00:00:00", - "2022-12-14T00:00:00", - "2022-12-15T00:00:00", - "2022-12-16T00:00:00", - "2022-12-19T00:00:00", - "2022-12-20T00:00:00", - "2022-12-21T00:00:00", - "2022-12-22T00:00:00", - "2022-12-23T00:00:00", - "2022-12-27T00:00:00", - "2022-12-28T00:00:00", - "2022-12-29T00:00:00", - "2022-12-30T00:00:00", - "2023-01-02T00:00:00", - "2023-01-03T00:00:00", - "2023-01-05T00:00:00", - "2023-01-06T00:00:00", - "2023-01-09T00:00:00", - "2023-01-10T00:00:00", - "2023-01-11T00:00:00", - "2023-01-12T00:00:00", - "2023-01-13T00:00:00", - "2023-01-17T00:00:00", - "2023-01-18T00:00:00", - "2023-01-19T00:00:00", - "2023-01-20T00:00:00", - "2023-01-23T00:00:00", - "2023-01-24T00:00:00", - "2023-01-25T00:00:00", - "2023-01-26T00:00:00", - "2023-01-27T00:00:00", - "2023-01-30T00:00:00", - "2023-01-31T00:00:00", - "2023-02-01T00:00:00", - "2023-02-02T00:00:00", - "2023-02-03T00:00:00", - "2023-02-06T00:00:00", - "2023-02-07T00:00:00", - "2023-02-08T00:00:00", - "2023-02-09T00:00:00", - "2023-02-10T00:00:00", - "2023-02-13T00:00:00", - "2023-02-14T00:00:00", - "2023-02-15T00:00:00", - "2023-02-16T00:00:00", - "2023-02-17T00:00:00", - "2023-02-21T00:00:00", - "2023-02-22T00:00:00", - "2023-02-23T00:00:00", - "2023-02-24T00:00:00", - "2023-02-27T00:00:00", - "2023-02-28T00:00:00", - "2023-03-01T00:00:00", - "2023-03-02T00:00:00", - "2023-03-03T00:00:00", - "2023-03-06T00:00:00", - "2023-03-07T00:00:00", - "2023-03-08T00:00:00", - "2023-03-09T00:00:00", - "2023-03-10T00:00:00", - "2023-03-13T00:00:00", - "2023-03-14T00:00:00", - "2023-03-15T00:00:00", - "2023-03-16T00:00:00", - "2023-03-17T00:00:00", - "2023-03-20T00:00:00", - "2023-03-21T00:00:00", - "2023-03-22T00:00:00", - "2023-03-23T00:00:00", - "2023-03-24T00:00:00", - "2023-03-27T00:00:00", - "2023-03-28T00:00:00", - "2023-03-29T00:00:00", - "2023-03-30T00:00:00", - "2023-03-31T00:00:00", - "2023-04-03T00:00:00", - "2023-04-04T00:00:00", - "2023-04-05T00:00:00", - "2023-04-06T00:00:00", - "2023-04-07T00:00:00", - "2023-04-10T00:00:00", - "2023-04-11T00:00:00", - "2023-04-12T00:00:00", - "2023-04-13T00:00:00", - "2023-04-14T00:00:00", - "2023-04-17T00:00:00", - "2023-04-18T00:00:00", - "2023-04-19T00:00:00", - "2023-04-20T00:00:00", - "2023-04-21T00:00:00", - "2023-04-24T00:00:00", - "2023-04-25T00:00:00", - "2023-04-26T00:00:00", - "2023-04-27T00:00:00", - "2023-04-28T00:00:00", - "2023-05-01T00:00:00", - "2023-05-02T00:00:00", - "2023-05-03T00:00:00", - "2023-05-04T00:00:00", - "2023-05-05T00:00:00", - "2023-05-08T00:00:00", - "2023-05-09T00:00:00", - "2023-05-10T00:00:00", - "2023-05-11T00:00:00", - "2023-05-12T00:00:00", - "2023-05-15T00:00:00", - "2023-05-16T00:00:00", - "2023-05-17T00:00:00", - "2023-05-18T00:00:00", - "2023-05-19T00:00:00", - "2023-05-22T00:00:00", - "2023-05-23T00:00:00", - "2023-05-24T00:00:00", - "2023-05-25T00:00:00", - "2023-05-26T00:00:00", - "2023-05-30T00:00:00", - "2023-05-31T00:00:00", - "2023-06-01T00:00:00", - "2023-06-02T00:00:00", - "2023-06-05T00:00:00", - "2023-06-06T00:00:00", - "2023-06-07T00:00:00", - "2023-06-08T00:00:00", - "2023-06-09T00:00:00", - "2023-06-12T00:00:00", - "2023-06-13T00:00:00", - "2023-06-14T00:00:00", - "2023-06-15T00:00:00", - "2023-06-16T00:00:00", - "2023-06-20T00:00:00", - "2023-06-21T00:00:00", - "2023-06-22T00:00:00", - "2023-06-23T00:00:00", - "2023-06-26T00:00:00", - "2023-06-27T00:00:00", - "2023-06-28T00:00:00", - "2023-06-29T00:00:00", - "2023-06-30T00:00:00", - "2023-07-03T00:00:00", - "2023-07-05T00:00:00", - "2023-07-06T00:00:00", - "2023-07-07T00:00:00", - "2023-07-10T00:00:00", - "2023-07-11T00:00:00", - "2023-07-12T00:00:00", - "2023-07-13T00:00:00", - "2023-07-14T00:00:00", - "2023-07-17T00:00:00", - "2023-07-18T00:00:00", - "2023-07-19T00:00:00", - "2023-07-20T00:00:00", - "2023-07-21T00:00:00", - "2023-07-24T00:00:00", - "2023-07-25T00:00:00", - "2023-07-26T00:00:00", - "2023-07-27T00:00:00", - "2023-07-28T00:00:00", - "2023-07-31T00:00:00", - "2023-08-01T00:00:00", - "2023-08-02T00:00:00", - "2023-08-03T00:00:00", - "2023-08-04T00:00:00", - "2023-08-07T00:00:00", - "2023-08-08T00:00:00", - "2023-08-09T00:00:00", - "2023-08-10T00:00:00", - "2023-08-11T00:00:00", - "2023-08-14T00:00:00", - "2023-08-15T00:00:00", - "2023-08-16T00:00:00", - "2023-08-17T00:00:00", - "2023-08-18T00:00:00", - "2023-08-21T00:00:00", - "2023-08-22T00:00:00", - "2023-08-23T00:00:00", - "2023-08-24T00:00:00", - "2023-08-25T00:00:00", - "2023-08-28T00:00:00", - "2023-08-29T00:00:00", - "2023-08-30T00:00:00", - "2023-08-31T00:00:00", - "2023-09-01T00:00:00", - "2023-09-05T00:00:00", - "2023-09-06T00:00:00", - "2023-09-07T00:00:00", - "2023-09-08T00:00:00", - "2023-09-11T00:00:00", - "2023-09-12T00:00:00", - "2023-09-13T00:00:00", - "2023-09-14T00:00:00", - "2023-09-15T00:00:00", - "2023-09-18T00:00:00", - "2023-09-19T00:00:00", - "2023-09-20T00:00:00", - "2023-09-21T00:00:00", - "2023-09-22T00:00:00", - "2023-09-25T00:00:00", - "2023-09-26T00:00:00", - "2023-09-27T00:00:00", - "2023-09-28T00:00:00", - "2023-09-29T00:00:00", - "2023-10-02T00:00:00", - "2023-10-03T00:00:00", - "2023-10-04T00:00:00", - "2023-10-05T00:00:00", - "2023-10-06T00:00:00", - "2023-10-09T00:00:00", - "2023-10-10T00:00:00", - "2023-10-11T00:00:00", - "2023-10-12T00:00:00", - "2023-10-13T00:00:00", - "2023-10-16T00:00:00", - "2023-10-17T00:00:00", - "2023-10-18T00:00:00", - "2023-10-19T00:00:00", - "2023-10-20T00:00:00", - "2023-10-23T00:00:00", - "2023-10-24T00:00:00", - "2023-10-25T00:00:00", - "2023-10-26T00:00:00", - "2023-10-27T00:00:00", - "2023-10-30T00:00:00", - "2023-10-31T00:00:00", - "2023-11-01T00:00:00", - "2023-11-02T00:00:00", - "2023-11-03T00:00:00", - "2023-11-06T00:00:00", - "2023-11-07T00:00:00", - "2023-11-08T00:00:00", - "2023-11-09T00:00:00", - "2023-11-10T00:00:00", - "2023-11-13T00:00:00", - "2023-11-14T00:00:00", - "2023-11-15T00:00:00", - "2023-11-16T00:00:00", - "2023-11-17T00:00:00", - "2023-11-20T00:00:00", - "2023-11-21T00:00:00", - "2023-11-22T00:00:00", - "2023-11-23T00:00:00", - "2023-11-24T00:00:00", - "2023-11-27T00:00:00", - "2023-11-28T00:00:00", - "2023-11-29T00:00:00", - "2023-11-30T00:00:00", - "2023-12-01T00:00:00", - "2023-12-04T00:00:00", - "2023-12-05T00:00:00", - "2023-12-06T00:00:00", - "2023-12-07T00:00:00", - "2023-12-08T00:00:00", - "2023-12-11T00:00:00", - "2023-12-12T00:00:00", - "2023-12-13T00:00:00", - "2023-12-14T00:00:00", - "2023-12-15T00:00:00", - "2023-12-18T00:00:00", - "2023-12-19T00:00:00", - "2023-12-20T00:00:00", - "2023-12-21T00:00:00", - "2023-12-22T00:00:00", - "2023-12-25T00:00:00", - "2023-12-26T00:00:00", - "2023-12-27T00:00:00", - "2023-12-28T00:00:00", - "2023-12-29T00:00:00", - "2024-01-01T00:00:00", - "2024-01-02T00:00:00", - "2024-01-04T00:00:00", - "2024-01-05T00:00:00", - "2024-01-08T00:00:00", - "2024-01-09T00:00:00", - "2024-01-10T00:00:00", - "2024-01-11T00:00:00", - "2024-01-12T00:00:00", - "2024-01-16T00:00:00", - "2024-01-17T00:00:00", - "2024-01-18T00:00:00", - "2024-01-19T00:00:00", - "2024-01-22T00:00:00", - "2024-01-23T00:00:00", - "2024-01-24T00:00:00", - "2024-01-25T00:00:00", - "2024-01-26T00:00:00", - "2024-01-29T00:00:00", - "2024-01-30T00:00:00", - "2024-01-31T00:00:00", - "2024-02-01T00:00:00", - "2024-02-02T00:00:00", - "2024-02-05T00:00:00", - "2024-02-06T00:00:00", - "2024-02-07T00:00:00", - "2024-02-08T00:00:00", - "2024-02-09T00:00:00", - "2024-02-12T00:00:00", - "2024-02-13T00:00:00", - "2024-02-14T00:00:00", - "2024-02-15T00:00:00", - "2024-02-16T00:00:00", - "2024-02-20T00:00:00", - "2024-02-21T00:00:00", - "2024-02-22T00:00:00", - "2024-02-23T00:00:00", - "2024-02-26T00:00:00", - "2024-02-27T00:00:00", - "2024-02-28T00:00:00", - "2024-02-29T00:00:00", - "2024-03-01T00:00:00", - "2024-03-04T00:00:00", - "2024-03-05T00:00:00", - "2024-03-06T00:00:00", - "2024-03-07T00:00:00", - "2024-03-08T00:00:00", - "2024-03-11T00:00:00", - "2024-03-12T00:00:00", - "2024-03-13T00:00:00", - "2024-03-14T00:00:00", - "2024-03-15T00:00:00", - "2024-03-18T00:00:00", - "2024-03-19T00:00:00", - "2024-03-20T00:00:00", - "2024-03-21T00:00:00", - "2024-03-22T00:00:00", - "2024-03-25T00:00:00", - "2024-03-26T00:00:00", - "2024-03-27T00:00:00", - "2024-03-28T00:00:00", - "2024-04-01T00:00:00", - "2024-04-02T00:00:00", - "2024-04-03T00:00:00", - "2024-04-04T00:00:00", - "2024-04-05T00:00:00", - "2024-04-08T00:00:00", - "2024-04-09T00:00:00", - "2024-04-10T00:00:00", - "2024-04-11T00:00:00", - "2024-04-12T00:00:00", - "2024-04-15T00:00:00", - "2024-04-16T00:00:00", - "2024-04-17T00:00:00", - "2024-04-18T00:00:00", - "2024-04-19T00:00:00", - "2024-04-22T00:00:00", - "2024-04-23T00:00:00", - "2024-04-24T00:00:00", - "2024-04-25T00:00:00", - "2024-04-26T00:00:00", - "2024-04-29T00:00:00", - "2024-04-30T00:00:00", - "2024-05-01T00:00:00", - "2024-05-02T00:00:00", - "2024-05-03T00:00:00", - "2024-05-06T00:00:00", - "2024-05-07T00:00:00", - "2024-05-08T00:00:00", - "2024-05-09T00:00:00", - "2024-05-10T00:00:00", - "2024-05-13T00:00:00", - "2024-05-14T00:00:00", - "2024-05-15T00:00:00", - "2024-05-16T00:00:00", - "2024-05-17T00:00:00", - "2024-05-20T00:00:00", - "2024-05-21T00:00:00", - "2024-05-22T00:00:00", - "2024-05-23T00:00:00", - "2024-05-24T00:00:00", - "2024-05-28T00:00:00", - "2024-05-29T00:00:00", - "2024-05-30T00:00:00", - "2024-05-31T00:00:00", - "2024-06-03T00:00:00", - "2024-06-04T00:00:00", - "2024-06-05T00:00:00", - "2024-06-06T00:00:00", - "2024-06-07T00:00:00", - "2024-06-10T00:00:00", - "2024-06-11T00:00:00", - "2024-06-12T00:00:00", - "2024-06-13T00:00:00", - "2024-06-14T00:00:00", - "2024-06-17T00:00:00", - "2024-06-18T00:00:00", - "2024-06-20T00:00:00", - "2024-06-21T00:00:00", - "2024-06-24T00:00:00", - "2024-06-25T00:00:00", - "2024-06-26T00:00:00", - "2024-06-27T00:00:00", - "2024-06-28T00:00:00", - "2024-07-01T00:00:00", - "2024-07-02T00:00:00", - "2024-07-03T00:00:00", - "2024-07-05T00:00:00", - "2024-07-08T00:00:00", - "2024-07-09T00:00:00", - "2024-07-10T00:00:00", - "2024-07-11T00:00:00", - "2024-07-12T00:00:00", - "2024-07-15T00:00:00", - "2024-07-16T00:00:00", - "2024-07-17T00:00:00", - "2024-07-18T00:00:00", - "2024-07-19T00:00:00", - "2024-07-22T00:00:00", - "2024-07-23T00:00:00", - "2024-07-24T00:00:00", - "2024-07-25T00:00:00", - "2024-07-26T00:00:00", - "2024-07-29T00:00:00", - "2024-07-30T00:00:00", - "2024-07-31T00:00:00", - "2024-08-01T00:00:00", - "2024-08-02T00:00:00", - "2024-08-05T00:00:00", - "2024-08-06T00:00:00", - "2024-08-07T00:00:00", - "2024-08-08T00:00:00", - "2024-08-09T00:00:00", - "2024-08-12T00:00:00", - "2024-08-13T00:00:00", - "2024-08-14T00:00:00", - "2024-08-15T00:00:00", - "2024-08-16T00:00:00", - "2024-08-19T00:00:00", - "2024-08-20T00:00:00", - "2024-08-21T00:00:00", - "2024-08-22T00:00:00", - "2024-08-23T00:00:00", - "2024-08-26T00:00:00", - "2024-08-27T00:00:00", - "2024-08-28T00:00:00", - "2024-08-29T00:00:00", - "2024-08-30T00:00:00", - "2024-09-03T00:00:00", - "2024-09-04T00:00:00", - "2024-09-05T00:00:00", - "2024-09-06T00:00:00", - "2024-09-09T00:00:00", - "2024-09-10T00:00:00", - "2024-09-11T00:00:00", - "2024-09-12T00:00:00", - "2024-09-13T00:00:00", - "2024-09-16T00:00:00", - "2024-09-17T00:00:00", - "2024-09-18T00:00:00", - "2024-09-19T00:00:00", - "2024-09-20T00:00:00", - "2024-09-23T00:00:00", - "2024-09-24T00:00:00", - "2024-09-25T00:00:00", - "2024-09-26T00:00:00", - "2024-09-27T00:00:00", - "2024-09-30T00:00:00", - "2024-10-01T00:00:00", - "2024-10-02T00:00:00", - "2024-10-03T00:00:00", - "2024-10-04T00:00:00", - "2024-10-07T00:00:00", - "2024-10-08T00:00:00", - "2024-10-09T00:00:00", - "2024-10-10T00:00:00", - "2024-10-11T00:00:00", - "2024-10-14T00:00:00", - "2024-10-15T00:00:00", - "2024-10-16T00:00:00", - "2024-10-17T00:00:00", - "2024-10-18T00:00:00", - "2024-10-21T00:00:00", - "2024-10-22T00:00:00", - "2024-10-23T00:00:00", - "2024-10-24T00:00:00", - "2024-10-25T00:00:00", - "2024-10-28T00:00:00", - "2024-10-29T00:00:00", - "2024-10-30T00:00:00", - "2024-10-31T00:00:00", - "2024-11-01T00:00:00", - "2024-11-04T00:00:00", - "2024-11-05T00:00:00", - "2024-11-06T00:00:00", - "2024-11-07T00:00:00", - "2024-11-08T00:00:00", - "2024-11-11T00:00:00", - "2024-11-12T00:00:00", - "2024-11-13T00:00:00", - "2024-11-14T00:00:00", - "2024-11-15T00:00:00", - "2024-11-18T00:00:00", - "2024-11-19T00:00:00", - "2024-11-20T00:00:00", - "2024-11-21T00:00:00", - "2024-11-22T00:00:00", - "2024-11-25T00:00:00", - "2024-11-26T00:00:00", - "2024-11-27T00:00:00", - "2024-11-28T00:00:00", - "2024-11-29T00:00:00", - "2024-12-02T00:00:00", - "2024-12-03T00:00:00", - "2024-12-04T00:00:00", - "2024-12-05T00:00:00", - "2024-12-06T00:00:00", - "2024-12-09T00:00:00", - "2024-12-10T00:00:00", - "2024-12-11T00:00:00", - "2024-12-12T00:00:00", - "2024-12-13T00:00:00", - "2024-12-16T00:00:00", - "2024-12-17T00:00:00", - "2024-12-18T00:00:00", - "2024-12-19T00:00:00", - "2024-12-20T00:00:00", - "2024-12-23T00:00:00", - "2024-12-24T00:00:00", - "2024-12-26T00:00:00", - "2024-12-27T00:00:00", - "2024-12-30T00:00:00", - "2024-12-31T00:00:00", - "2025-01-01T00:00:00", - "2025-01-02T00:00:00", - "2025-01-06T00:00:00", - "2025-01-07T00:00:00", - "2025-01-08T00:00:00", - "2025-01-09T00:00:00", - "2025-01-10T00:00:00", - "2025-01-13T00:00:00", - "2025-01-14T00:00:00", - "2025-01-15T00:00:00", - "2025-01-16T00:00:00", - "2025-01-17T00:00:00", - "2025-01-21T00:00:00", - "2025-01-22T00:00:00", - "2025-01-23T00:00:00", - "2025-01-24T00:00:00", - "2025-01-27T00:00:00", - "2025-01-28T00:00:00", - "2025-01-29T00:00:00", - "2025-01-30T00:00:00", - "2025-01-31T00:00:00", - "2025-02-03T00:00:00", - "2025-02-04T00:00:00", - "2025-02-05T00:00:00", - "2025-02-06T00:00:00", - "2025-02-07T00:00:00", - "2025-02-10T00:00:00", - "2025-02-11T00:00:00", - "2025-02-12T00:00:00", - "2025-02-13T00:00:00", - "2025-02-14T00:00:00", - "2025-02-18T00:00:00", - "2025-02-19T00:00:00", - "2025-02-20T00:00:00", - "2025-02-21T00:00:00", - "2025-02-24T00:00:00", - "2025-02-25T00:00:00", - "2025-02-26T00:00:00", - "2025-02-27T00:00:00", - "2025-02-28T00:00:00", - "2025-03-03T00:00:00" - ], - "xaxis": "x", - "y": [ - 19771.18330179212, - 20302.183301792134, - 20777.76224916056, - 20675.33714794602, - 20777.391832597852, - 20923.115632619236, - 20878.174559684343, - 20884.421208215634, - 20849.089514300646, - 20932.907644747775, - 21106.000662256807, - 21662.013593157397, - 21852.582684062596, - 21234.86691238547, - 20845.950890902594, - 21193.090192888783, - 21022.147729559467, - 21013.35363653981, - 21330.973467703174, - 21609.327121320734, - 21454.781530618933, - 21550.12819811024, - 21545.346139899935, - 21545.491869187445, - 21430.584462811195, - 21265.646387872344, - 21317.35960271379, - 21268.50026242618, - 21107.59335016422, - 20953.65586457493, - 20776.997155611145, - 20345.89096460336, - 19900.153814399077, - 20369.663553350347, - 19592.66902871279, - 18868.00621411735, - 18758.231302661086, - 18526.714681419733, - 17820.703551927247, - 17208.36283932862, - 16748.469058580406, - 16046.624820715399, - 15759.786865873819, - 15593.561567362827, - 15597.744704708133, - 15520.495979964771, - 15197.950099004252, - 15153.00772065093, - 14998.60270532222, - 14680.666028301015, - 14598.708244033147, - 14523.832776702473, - 14270.582465083196, - 13898.502260820562, - 13616.282124702459, - 13312.331126414705, - 12923.60126633722, - 12964.448026323742, - 13137.92270725466, - 14660.239161242933, - 14419.283463855996, - 14174.764378312972, - 14099.641716260461, - 14129.55994155955, - 13930.338758424736, - 14267.524636336373, - 15171.481888278107, - 15193.286722904515, - 15345.213517507493, - 15407.33138057607, - 15502.415021521265, - 16009.970782151457, - 15273.39541516338, - 15186.178503838093, - 15174.033896287907, - 15712.270824587804, - 15461.546800764938, - 15510.397451549708, - 15391.964422790677, - 15408.342403617997, - 15248.261057502876, - 14941.040160092796, - 14451.226228486075, - 14193.516940748255, - 14298.544082256383, - 13950.89550992846, - 13651.12979504318, - 13280.952651786329, - 12647.044419711145, - 12600.269691147527, - 12710.202894049698, - 12612.305261561683, - 12680.373506569673, - 12909.906497055023, - 13223.095157378588, - 13458.571427075265, - 13650.832844080413, - 13819.840455417178, - 13720.012196308357, - 13867.793356902475, - 13876.980797298553, - 13986.43909089594, - 14075.904786898478, - 14309.048584233504, - 14471.477782456854, - 14508.263914605755, - 14587.288002705021, - 14639.470728104534, - 14779.259211704208, - 14765.45153410399, - 14900.246415703847, - 14924.926489807627, - 14960.546539210147, - 15106.626572145158, - 15169.013260768503, - 15330.624470592249, - 15454.198610474747, - 15516.027243354025, - 15603.079665273544, - 15797.781279886563, - 15891.749022961909, - 15926.89418501214, - 16021.157626378961, - 16063.701307970055, - 16086.499285137224, - 16910.03126991534, - 16976.31811708291, - 17260.509348527958, - 17168.303502824656, - 17330.166272355793, - 17431.40811870988, - 17487.236016279272, - 17870.154614658863, - 17437.286585487727, - 16927.64379044154, - 15409.215260410749, - 15735.114023426824, - 16057.379865437548, - 15585.823760111363, - 15999.786356560571, - 16227.428087526709, - 16329.826319871912, - 16792.591808102043, - 16343.518868823923, - 16731.890577746253, - 17640.30505036114, - 17249.081365437727, - 20319.265575488793, - 19191.888382189496, - 17612.136919989967, - 18252.10784281061, - 18340.58845802437, - 17580.5216666928, - 17619.39516066287, - 16813.477489976245, - 18953.69904285183, - 18157.346744768885, - 20160.61187938026, - 18098.28863578784, - 19132.19953838777, - 19274.824419793003, - 19386.57434072983, - 19388.60087851531, - 19371.618570372302, - 19672.147975734864, - 20415.83424597658, - 19783.291759471056, - 19170.86725643025, - 18924.250921069724, - 19305.673364162703, - 20764.95499289135, - 21316.976078710457, - 23374.453484142297, - 21991.938421096856, - 21286.09504573323, - 20692.19946215748, - 20343.769073106978, - 19078.148813739976, - 18241.901974161974, - 18135.23741444331, - 18292.46104129753, - 18525.61012586701, - 18704.376182246666, - 18699.386886499768, - 18321.062707617315, - 17894.679921695682, - 17598.75806441459, - 17452.310159560526, - 16793.011556324487, - 16792.64582083379, - 16824.901997173325, - 17004.739448066353, - 17122.13108199504, - 17082.058837947498, - 16905.344008582466, - 16903.367455672444, - 17280.496068494205, - 18247.748477042045, - 19077.22931149739, - 19613.549867800957, - 20102.763572003332, - 21148.072708138247, - 21223.27879889486, - 21847.582859399266, - 22598.785566402206, - 23361.68673291683, - 23727.787510593243, - 23157.984261376256, - 25165.615428564925, - 27542.933624736823, - 29362.062754857034, - 30113.982174937188, - 32303.595121657298, - 33530.00375280402, - 34715.10950690183, - 34196.013342967046, - 34444.94923367718, - 35179.23982748393, - 35286.266890021776, - 35372.61826504701, - 35459.330038330016, - 35393.80455385203, - 34986.84308500852, - 38518.86877244621, - 40696.134609864675, - 44087.15593614989, - 46300.80074039031, - 45453.230609883954, - 44795.683856213036, - 44482.162314338486, - 44674.81461975544, - 46745.7494900334, - 44462.47986634684, - 41569.466783889126, - 41040.052677407664, - 44551.276606420026, - 43302.92589242826, - 40830.69208310042, - 39698.20077127038, - 38886.53989671701, - 40910.432647014786, - 40668.02781387995, - 37499.75792512339, - 37198.41133261902, - 37554.57362800326, - 38646.18182492609, - 39562.41775210108, - 41799.908370217745, - 42239.90211562883, - 42101.564612569564, - 42029.339610530056, - 41034.52294250372, - 42698.80098332762, - 43461.61379303918, - 46494.322332846896, - 47256.3523121758, - 48667.66285836312, - 49418.885330864774, - 50113.03364586588, - 48498.29918919995, - 48477.642884756, - 48788.87201512669, - 48123.85810204049, - 47576.34882664969, - 47908.842643055825, - 46050.50518732658, - 45234.869061056765, - 46760.278310210204, - 46696.15053953652, - 47353.39869242072, - 47170.3092778145, - 48273.24966807702, - 48683.60559330383, - 48058.00954345504, - 48428.44551022251, - 48954.5694880675, - 49007.81880663083, - 50111.651685673045, - 50291.134353826834, - 46395.789465929345, - 44231.39287399769, - 47170.96181270992, - 49553.27701143994, - 47902.32047725996, - 46665.8494544733, - 46405.702105948876, - 45308.937206932584, - 40937.76060758839, - 42314.5750545687, - 43569.11801922223, - 44293.81332899126, - 44705.276868837274, - 45356.25256206796, - 45223.569690888406, - 45111.78111010204, - 45223.92205624446, - 45362.01602033941, - 44954.07866306938, - 44682.120424889355, - 44150.81493276934, - 44172.35648581731, - 44153.3841878493, - 44282.40265587062, - 43361.121024074026, - 41849.43326954296, - 41317.98303154909, - 41875.71643024588, - 43045.038696043724, - 45553.49443147547, - 52615.798255096626, - 56030.66747084405, - 54976.409721256896, - 53364.40455486547, - 47342.23444393786, - 47430.05379865156, - 45958.60003512737, - 46084.42300261933, - 47866.63831428065, - 51934.78185538819, - 46157.96490819849, - 46155.281814207934, - 46026.560302027065, - 45536.49826374981, - 45287.29023823163, - 45228.651554552845, - 45232.89243210032, - 44903.21968379864, - 44719.27118493086, - 44596.638852352335, - 44187.383963966655, - 43903.7140383762, - 44037.57109583614, - 44061.809134142764, - 44047.96782634718, - 44043.74028781679, - 43970.92192879653, - 43897.37635611636, - 43828.345974329575, - 43769.390273074765, - 43683.39862811789, - 43582.737531479965, - 43580.63013372135, - 43427.55853521561, - 43220.998451600426, - 42905.7917291903, - 42590.653914250215, - 42964.72870429016, - 42844.52345355934, - 42634.3866197388, - 43090.128730525095, - 43578.1234710493, - 43975.461444357825, - 44180.35342656352, - 44216.9480813673, - 44101.34451790316, - 43781.77547559373, - 43583.72944738744, - 43504.198761916596, - 42431.178304936024, - 42168.33133361564, - 42008.10001940205, - 41733.779143259664, - 41574.94270415133, - 41389.05174474578, - 41205.12443847542, - 41162.438193396585, - 41092.532549419266, - 40873.25295951803, - 40695.119848939525, - 40666.36444188718, - 40662.194170518946, - 40434.413989606786, - 40117.56053566535, - 39516.3248997044, - 38888.8389931044, - 38373.94337156058, - 38337.34629053137, - 38229.61490317857, - 38141.12731161003, - 37845.46891723101, - 37725.02998764499, - 37581.40403458765, - 37413.438004419535, - 37634.793984307464, - 37583.92878884472, - 37575.01865853622, - 37815.74523833055, - 37582.89629152677, - 37552.66366032425, - 37402.173408682014, - 37321.84657425386, - 37284.96201796842, - 37297.0389804448, - 37621.756955429046, - 37408.235605418544, - 37322.55470541154, - 37332.10077207354, - 37151.76481651487, - 36903.20751280909, - 37142.46931033855, - 37391.977175358195, - 37721.64908537129, - 37654.76369204669, - 37750.17342983029, - 37657.11325501936, - 37771.7398051454, - 37628.15750522943, - 37779.10263861878, - 37879.732727545015, - 37828.019453495835, - 37711.79282698461, - 37730.97507597713, - 37707.09657530547, - 37801.1775748577, - 37878.06490789252, - 37775.9897965824, - 37942.93972237565, - 37959.239672904485, - 37826.993766602216, - 37673.82982906737, - 37485.724005214404, - 36738.65345597909, - 40718.10642315555, - 41833.67231259201, - 41947.38290554966, - 43040.998452809, - 42772.66884508889, - 42332.666995853804, - 43763.49909636375, - 43160.7204967037, - 43840.298395920145, - 43315.14429700903, - 43275.87489773497, - 43450.52863155224, - 42128.631120763755, - 41750.699446904786, - 42722.078330998804, - 43516.330920394794, - 43857.49931332547, - 44219.944908612575, - 43821.57530547065, - 44012.328903376045, - 44004.331301979626, - 43526.83290104869, - 41058.333967094746, - 41377.66801112543, - 40160.08671991615, - 38725.03252577665, - 39526.66306301699, - 39979.41675451055, - 41155.41921550624, - 42008.39560394408, - 43894.54652956931, - 43181.14714665279, - 42355.54755804179, - 42926.8144989678, - 42595.15912625179, - 42124.09283379406, - 44067.54863882225, - 43754.40328192086, - 44588.139710653275, - 46847.297329808214, - 41831.73574257819, - 44216.36135109151, - 54217.77842343369, - 46400.38980499515, - 46126.297392702785, - 47700.23578450789, - 48647.02804571128, - 52090.72288651354, - 52084.85278038172, - 52108.542900514476, - 52131.836313936336, - 52584.86525621759, - 52884.981153843866, - 52112.55841892804, - 51205.9432623175, - 55504.03315791046, - 53240.25975497244, - 50425.13007156857, - 50035.04361596599, - 46654.865125212404, - 49646.91279804334, - 48665.77791326398, - 48083.3546567444, - 47615.90581906467, - 46396.33992727819, - 45382.462666087195, - 53392.3778252932, - 54259.82126476386, - 58319.842893643574, - 57710.69064623009, - 50068.08914795442, - 49280.35481577065, - 50529.43852083111, - 51770.76119014246, - 52107.47630301674, - 52778.61971159958, - 55393.54865065479, - 54573.22751885224, - 56591.34676431719, - 57914.25959462718, - 56579.53481483383, - 60278.88496163822, - 56504.526484701804, - 55658.28750007751, - 55831.62817699464, - 57713.85529493943, - 63805.3400402359, - 68076.32987043359, - 72596.15642389878, - 72100.2253308182, - 76554.60460209787, - 79357.52411628426, - 80656.74156091518, - 81493.71985733592, - 81770.0387216164, - 82031.35504263589, - 92703.8877689495, - 115988.0762531585, - 106438.44534020017, - 107084.52473156127, - 108992.74432580202, - 123590.4923385828, - 118380.65768043646, - 104924.93457500573, - 100998.61917138523, - 97956.07556897162, - 89051.93453927436, - 90838.34051947617, - 91719.2778396107, - 88598.23605303375, - 88413.37486198236, - 91633.46740128145, - 92397.48782560688, - 95045.16810849035, - 96215.33012224217, - 95281.2714647434, - 96244.39902641089, - 97938.98406752259, - 106437.04076159692, - 107330.9469037724, - 105502.71766522266, - 101335.053993333, - 95671.2782120732, - 96174.9276912333, - 77200.69401067334, - 84401.20489029998, - 88269.13096587203, - 81608.98168292, - 88785.11549428529, - 90148.37136852881, - 117332.60861802427, - 117733.76678435474, - 112711.20556190847, - 106677.83141361084, - 109828.91531474578, - 112270.47124883585, - 108063.17520489583, - 104831.31117560253, - 103285.73515607366, - 93789.18447638773, - 94127.81735659706, - 93726.9726100699, - 92276.90944571856, - 90373.70066948426, - 89184.2281519948, - 91760.413140335, - 91812.26979922847, - 87548.34090515775, - 91159.3883091103, - 97678.25324507871, - 98650.16320239117, - 101426.93650726597, - 105104.28537718258, - 106344.51795712691, - 106742.00634375641, - 107864.99860150955, - 106228.49344001176, - 105774.3233323465, - 103400.20992723627, - 102217.13432382957, - 97427.050588225, - 97783.49476448855, - 99079.12421533081, - 96831.87718255904, - 99499.21249404456, - 95936.78266933507, - 91861.66278619542, - 87266.58286410231, - 84219.69624937355, - 83497.3136179683, - 81566.72519703141, - 81761.6662497401, - 81912.06417020915, - 82690.82945052175, - 84922.83963739681, - 84482.51309531367, - 84996.46206725818, - 86612.76138188776, - 89493.12759164088, - 90845.20506480969, - 93027.92338025558, - 95575.06892388621, - 97032.83261963981, - 96025.67508347554, - 96823.07005936604, - 94739.83337662644, - 92840.34225480001, - 88877.68150691579, - 84080.57434165955, - 83419.05572683855, - 84054.03961778237, - 76614.1955450783, - 74478.79949660886, - 73121.30942307223, - 72743.81604071449, - 72340.48711914266, - 74529.10117142815, - 77428.17720628523, - 81604.9372349301, - 84642.73123147975, - 87704.59389584605, - 90301.66900542362, - 92496.48574514205, - 96464.93757601746, - 99470.57212993462, - 102585.11117684905, - 104606.92075790488, - 106503.95729983831, - 107691.32964297234, - 110476.56820712436, - 111089.89391655894, - 111461.4443895155, - 111701.42941691044, - 109808.08610184035, - 104016.09788347455, - 104180.93907123072, - 104703.8331964015, - 102313.762613182, - 100762.71555770219, - 97537.6841873825, - 96793.82994050263, - 95086.9392272655, - 95434.16904376872, - 97453.56923198445, - 97865.66935746158, - 99196.49915143805, - 101502.05234742239, - 103786.0088094495, - 103668.61548507243, - 108222.85326882103, - 110884.7138482188, - 110553.07301691553, - 112120.87897799067, - 112808.4767156419, - 113264.59176296451, - 114459.50179451297, - 113493.78257826479, - 112738.93309112043, - 116732.3667663576, - 119394.65588318238, - 111022.83735425335, - 104734.66009990528, - 101219.20859700657, - 102518.82269372743, - 99980.2320915413, - 99793.67169008391, - 97010.9316448996, - 94625.6895815449, - 98665.04327363445, - 101406.48390152612, - 102420.4059074412, - 108668.96984871964, - 110155.92557346396, - 118457.83809837587, - 120301.19136380307, - 121887.76446337276, - 123006.26328120507, - 123823.59582642658, - 127936.81752324087, - 125722.51534802826, - 127820.96180641606, - 133169.11413484334, - 141162.04902046133, - 142165.67227754008, - 145388.9211155925, - 145681.08700762762, - 150744.36204117988, - 149483.21206354816, - 148653.2026869741, - 149875.65643948226, - 150731.45894115441, - 150148.66060893572, - 145753.63764010495, - 144671.9556608845, - 146705.83434140414, - 150500.92012841723, - 146476.81065309292, - 149018.2376695431, - 150733.35568051002, - 155399.26768782118, - 160627.37569269515, - 164090.57089069596, - 166091.86768936322, - 165368.38233024665, - 158078.5587575021, - 141281.17637567245, - 150911.25478778614, - 155395.47372919522, - 160816.6196901345, - 143000.71699742755, - 151800.94853562283, - 153665.2695610863, - 157659.81691139526, - 157033.6818116013, - 158528.75841173858, - 158924.64281183016, - 160150.23241189122, - 161098.95881193192, - 159467.276411959, - 158715.32147864372, - 158654.8515231002, - 158528.7048860713, - 160141.27379471858, - 157382.15306715007, - 155940.23924877122, - 152367.29670318522, - 156761.1683394613, - 154117.08276364524, - 156403.52571310117, - 153048.65434607182, - 150107.07343471888, - 150281.01949381683, - 146262.81686654905, - 144875.68178170366, - 136573.25839180688, - 134090.1427985424, - 125794.06573636598, - 126798.68102824844, - 127250.5912228367, - 129576.69801922895, - 132314.10255015697, - 134300.03890410913, - 130699.99647341053, - 131482.78299572074, - 134559.33139580756, - 140738.02928540795, - 144097.1612118082, - 142757.1829342215, - 146674.69741583022, - 147172.207070236, - 147243.8801731733, - 149000.06224179815, - 151714.1836208812, - 153887.73120693667, - 155267.56293097377, - 155269.51741366507, - 155732.4537354594, - 157189.41128332214, - 163603.21631523062, - 165947.8196698363, - 177366.72190623987, - 182290.99006384262, - 185853.00216891107, - 169363.07690562346, - 181709.36006343146, - 190728.54883530375, - 202542.17468321836, - 216618.72524849485, - 218236.42562534576, - 199726.5592099131, - 205944.14826629133, - 218985.04097054343, - 228381.46944004486, - 235598.25508637913, - 192383.14551726868, - 217963.9058045284, - 185459.77932936818, - 180851.19501259472, - 187374.63880141266, - 204024.4346606244, - 215962.6319000988, - 206455.59672641518, - 218157.56221236513, - 226151.37253633197, - 228959.74608564275, - 234776.99511851682, - 237625.59912618835, - 238743.37618306605, - 247697.72755431788, - 251960.68494486753, - 245555.15653856753, - 201484.80426770067, - 210767.90275378933, - 215045.8017445152, - 208097.0795028681, - 204312.09800843682, - 197050.53525247428, - 199868.924153822, - 202058.57578864906, - 202795.84354520033, - 194994.0220495678, - 188693.6410524795, - 185467.83611137568, - 179698.48118522114, - 179800.5779011181, - 174266.0000293561, - 175547.11478151474, - 169418.36364836126, - 170932.3628671714, - 167176.4414380054, - 218533.32715189466, - 203409.9505651328, - 239446.03284062483, - 225151.17226400608, - 220217.31983941756, - 223506.4182230252, - 222191.2536815127, - 220031.0642566014, - 223659.2713066606, - 227244.74267336688, - 228335.890251171, - 227699.1553030405, - 231421.25296734154, - 233998.9508454892, - 194303.49689342416, - 200316.52759204755, - 190623.54805779635, - 186332.39503496222, - 177226.62635307285, - 178706.94723181333, - 173586.32781764024, - 175280.08154152488, - 179736.75069078128, - 183751.19679028555, - 195264.99418995506, - 201465.0257897348, - 218846.71352292123, - 197927.83867837884, - 199969.42211535064, - 204868.602128653, - 205145.55547085463, - 206221.0243656557, - 176886.79889493014, - 192156.6485811131, - 198547.38170523502, - 205205.37045464967, - 208381.06708603888, - 209445.69817363168, - 214080.45223202696, - 227949.45493762384, - 240326.87741819225, - 258555.19621363955, - 258167.40874393773, - 260353.1504308032, - 272793.14488871343, - 274166.97452732024, - 266981.6942863915, - 262533.50745910563, - 310428.78290758183, - 291403.3998732325, - 286572.64451699966, - 290571.30761284457, - 293134.58301007433, - 285310.9332748941, - 284685.16678477405, - 285240.4891246941, - 294607.704017974, - 297835.78061349416, - 272467.83167717396, - 301569.86571962736, - 287583.3217479296, - 281656.45910013106, - 288241.88400159875, - 323611.33393591054, - 318642.5338921183, - 314821.33386292355, - 311342.2005101273, - 312286.363631307, - 308824.5057120935, - 309913.2670992844, - 303274.9413574117, - 256289.39086282998, - 273760.3571997753, - 287281.33475773904, - 295576.98646304826, - 296389.9209332543, - 291375.21058005834, - 284085.8036779278, - 280909.0990765072, - 278790.4293422268, - 275190.48285270657, - 282522.1185263598, - 291744.44230879523, - 307263.8914970857, - 317323.52428927924, - 320806.94615074154, - 320333.3940583831, - 284796.0259968108, - 299120.2806224293, - 302727.28370617493, - 309921.95242867206, - 309479.23157700355, - 307371.5510092246, - 275287.2639640385, - 283116.9059339143, - 288705.00058049825, - 306179.43034488754, - 312957.88308265706, - 323481.8515745034, - 315736.1669949885, - 314947.37727531174, - 299610.23679741746, - 289385.47647882125, - 296412.21764463023, - 298964.7070103856, - 301726.8665875556, - 314720.3063056691, - 323269.0943501745, - 319880.1197131781, - 318290.6366218471, - 316586.70604278514, - 314043.91899007745, - 315701.2276216054, - 325535.1000426242, - 324909.18165663653, - 325176.6054112241, - 328560.95428061485, - 331207.2211080358, - 343113.7323263161, - 353326.54687340854, - 368094.0357700891, - 369956.1172360216, - 373177.85002674063, - 368241.8029267406, - 372450.6048600742, - 373070.6899829873, - 372357.5908808385, - 375089.60703980946, - 367351.6178124565, - 367686.6249942213, - 367334.29644873133, - 374383.5774184047, - 380694.26473152015, - 384978.2229402638, - 381554.86174609297, - 377107.7876166456, - 366046.0715303474, - 360797.3130383165, - 355287.0224884189, - 349222.8287884872, - 349665.0329885326, - 346949.33578856295, - 338352.86232272803 - ], - "yaxis": "y" - } - ], - "layout": { - "legend": { - "title": { - "text": "variable" - }, - "tracegroupgap": 0 - }, - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "heatmapgl": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmapgl" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "title": { - "text": "Equity on EWM Span 5" - }, - "xaxis": { - "anchor": "y", - "domain": [ - 0, - 1 - ], - "title": { - "text": "datetime" - } - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0, - 1 - ], - "title": { - "text": "value" - } - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "option_aggregator._equity['Total'].ewm(span = 5).mean().plot(title = 'Equity on EWM Span 5')" - ] - }, - { - "cell_type": "code", - "execution_count": 154, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "hovertemplate": "variable=0
index=%{x}
value=%{y}", - "legendgroup": "0", - "line": { - "color": "#636efa", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "0", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": [ - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 15, - 16, - 17, - 18, - 19, - 20, - 21, - 22, - 23, - 24, - 25, - 26, - 27, - 28, - 29, - 30, - 31, - 32, - 33, - 34, - 35, - 36, - 37, - 38, - 39, - 40, - 41, - 42, - 43, - 44, - 45, - 46, - 47, - 48, - 49, - 50, - 51, - 52, - 53, - 54, - 55, - 56, - 57, - 58, - 59, - 60, - 61, - 62, - 63, - 64, - 65, - 66, - 67, - 68, - 69, - 70, - 71, - 72, - 73, - 74, - 75, - 76, - 77, - 78, - 79, - 80, - 81, - 82, - 83, - 84, - 85, - 86, - 87, - 88, - 89, - 90, - 91, - 92, - 93, - 94, - 95, - 96, - 97, - 98, - 99, - 100, - 101, - 102, - 103, - 104, - 105, - 106, - 107, - 108, - 109, - 110, - 111, - 112, - 113, - 114, - 115, - 116, - 117, - 118, - 119, - 120, - 121, - 122, - 123, - 124, - 125, - 126, - 127, - 128, - 129, - 130, - 131, - 132, - 133, - 134, - 135, - 136, - 137, - 138, - 139, - 140, - 141, - 142, - 143, - 144, - 145, - 146, - 147, - 148, - 149, - 150, - 151, - 152, - 153, - 154, - 155, - 156, - 157, - 158, - 159, - 160, - 161, - 162, - 163, - 164, - 165, - 166, - 167, - 168, - 169, - 170, - 171, - 172, - 173, - 174, - 175, - 176, - 177, - 178, - 179, - 180, - 181, - 182, - 183, - 184, - 185, - 186, - 187, - 188, - 189, - 190, - 191, - 192, - 193, - 194, - 195, - 196, - 197, - 198, - 199, - 200, - 201, - 202, - 203, - 204, - 205, - 206, - 207, - 208, - 209, - 210, - 211, - 212, - 213, - 214, - 215, - 216, - 217, - 218, - 219, - 220, - 221, - 222, - 223, - 224, - 225, - 226, - 227, - 228, - 229, - 230, - 231, - 232, - 233, - 234, - 235, - 236, - 237, - 238, - 239, - 240, - 241, - 242, - 243, - 244, - 245, - 246, - 247, - 248, - 249, - 250, - 251, - 252, - 253, - 254, - 255, - 256, - 257, - 258, - 259, - 260, - 261, - 262, - 263, - 264, - 265, - 266, - 267, - 268, - 269, - 270, - 271, - 272, - 273, - 274, - 275, - 276, - 277, - 278, - 279, - 280, - 281, - 282, - 283, - 284, - 285, - 286, - 287, - 288, - 289, - 290, - 291, - 292, - 293, - 294, - 295, - 296, - 297, - 298, - 299, - 300, - 301, - 302, - 303, - 304, - 305, - 306, - 307, - 308, - 309, - 310, - 311, - 312, - 313, - 314, - 315, - 316, - 317, - 318, - 319, - 320, - 321, - 322, - 323, - 324, - 325, - 326, - 327, - 328, - 329, - 330, - 331, - 332, - 333, - 334, - 335, - 336, - 337, - 338, - 339, - 340, - 341, - 342, - 343, - 344, - 345, - 346, - 347, - 348, - 349, - 350, - 351, - 352, - 353, - 354, - 355, - 356, - 357, - 358, - 359, - 360, - 361, - 362, - 363, - 364, - 365, - 366, - 367, - 368, - 369, - 370, - 371, - 372, - 373, - 374, - 375, - 376, - 377, - 378, - 379, - 380, - 381, - 382, - 383, - 384, - 385, - 386, - 387, - 388, - 389, - 390, - 391, - 392, - 393, - 394, - 395, - 396, - 397, - 398, - 399, - 400, - 401, - 402, - 403, - 404, - 405, - 406, - 407, - 408, - 409, - 410, - 411, - 412, - 413, - 414, - 415, - 416, - 417, - 418, - 419, - 420, - 421, - 422, - 423, - 424, - 425, - 426, - 427, - 428, - 429, - 430, - 431, - 432, - 433, - 434, - 435, - 436, - 437, - 438, - 439, - 440, - 441, - 442, - 443, - 444, - 445, - 446, - 447, - 448, - 449, - 450, - 451, - 452, - 453, - 454, - 455, - 456, - 457, - 458, - 459, - 460, - 461, - 462, - 463, - 464, - 465, - 466, - 467, - 468, - 469, - 470, - 471, - 472, - 473, - 474, - 475, - 476, - 477, - 478, - 479, - 480, - 481, - 482, - 483, - 484, - 485, - 486, - 487, - 488, - 489, - 490, - 491, - 492, - 493, - 494, - 495, - 496, - 497, - 498, - 499, - 500, - 501, - 502, - 503, - 504, - 505, - 506, - 507, - 508, - 509, - 510, - 511, - 512, - 513, - 514, - 515, - 516, - 517, - 518, - 519, - 520, - 521, - 522, - 523, - 524, - 525, - 526, - 527, - 528, - 529, - 530, - 531, - 532, - 533, - 534, - 535, - 536, - 537, - 538, - 539, - 540, - 541, - 542, - 543, - 544, - 545, - 546, - 547, - 548, - 549, - 550, - 551, - 552, - 553, - 554, - 555, - 556, - 557, - 558, - 559, - 560, - 561, - 562, - 563, - 564, - 565, - 566, - 567, - 568, - 569, - 570, - 571, - 572, - 573, - 574, - 575, - 576, - 577, - 578, - 579, - 580, - 581, - 582, - 583, - 584, - 585, - 586, - 587, - 588, - 589, - 590, - 591, - 592, - 593, - 594, - 595, - 596, - 597, - 598, - 599, - 600, - 601, - 602, - 603, - 604, - 605, - 606, - 607, - 608, - 609, - 610, - 611, - 612, - 613, - 614, - 615, - 616, - 617, - 618, - 619, - 620, - 621, - 622, - 623, - 624, - 625, - 626, - 627, - 628, - 629, - 630, - 631, - 632, - 633, - 634, - 635, - 636, - 637, - 638, - 639, - 640, - 641, - 642, - 643, - 644, - 645, - 646, - 647, - 648, - 649, - 650, - 651, - 652, - 653, - 654, - 655, - 656, - 657, - 658, - 659, - 660, - 661, - 662, - 663, - 664, - 665, - 666, - 667, - 668, - 669, - 670, - 671, - 672, - 673, - 674, - 675, - 676, - 677, - 678, - 679, - 680, - 681, - 682, - 683, - 684, - 685, - 686, - 687, - 688, - 689, - 690, - 691, - 692, - 693, - 694, - 695, - 696, - 697, - 698, - 699, - 700, - 701, - 702, - 703, - 704, - 705, - 706, - 707, - 708, - 709, - 710, - 711, - 712, - 713, - 714, - 715, - 716, - 717, - 718, - 719, - 720, - 721, - 722, - 723, - 724, - 725, - 726, - 727, - 728, - 729, - 730, - 731, - 732, - 733, - 734, - 735, - 736, - 737, - 738, - 739, - 740, - 741, - 742, - 743, - 744, - 745, - 746, - 747, - 748, - 749, - 750, - 751, - 752, - 753, - 754, - 755, - 756, - 757, - 758, - 759, - 760, - 761, - 762, - 763, - 764, - 765, - 766, - 767, - 768, - 769, - 770, - 771, - 772, - 773, - 774, - 775, - 776, - 777, - 778, - 779, - 780, - 781, - 782, - 783, - 784, - 785, - 786, - 787, - 788, - 789, - 790, - 791, - 792, - 793, - 794, - 795, - 796, - 797, - 798, - 799, - 800, - 801, - 802, - 803, - 804, - 805, - 806, - 807, - 808, - 809, - 810, - 811, - 812, - 813, - 814, - 815, - 816, - 817, - 818, - 819, - 820, - 821, - 822, - 823, - 824, - 825, - 826, - 827, - 828, - 829, - 830, - 831, - 832, - 833, - 834, - 835, - 836, - 837, - 838, - 839, - 840, - 841, - 842, - 843, - 844, - 845, - 846, - 847, - 848, - 849, - 850, - 851, - 852, - 853, - 854, - 855, - 856, - 857, - 858, - 859, - 860, - 861, - 862, - 863, - 864, - 865, - 866, - 867, - 868, - 869, - 870, - 871, - 872, - 873, - 874, - 875, - 876, - 877, - 878, - 879, - 880, - 881, - 882, - 883, - 884, - 885, - 886, - 887, - 888, - 889, - 890, - 891, - 892, - 893, - 894, - 895, - 896, - 897, - 898, - 899, - 900, - 901, - 902, - 903, - 904, - 905, - 906, - 907, - 908, - 909, - 910, - 911, - 912, - 913, - 914, - 915, - 916, - 917, - 918, - 919, - 920, - 921, - 922, - 923, - 924, - 925, - 926, - 927, - 928, - 929, - 930, - 931, - 932, - 933, - 934, - 935, - 936, - 937, - 938, - 939, - 940, - 941, - 942, - 943, - 944, - 945, - 946, - 947, - 948, - 949, - 950, - 951, - 952, - 953 - ], - "xaxis": "x", - "y": [ - 1.0447621159791585, - 1.0776382463593313, - 1.0384397832137446, - 1.0591770346843117, - 1.0710630202832976, - 1.0518431286764263, - 1.0569009948887613, - 1.0510844487445783, - 1.0670167273134277, - 1.0847192590565997, - 1.1512301997487948, - 1.1244032773585724, - 1.0118657541341358, - 1.0151533671721558, - 1.1069536389260177, - 1.0460063510673911, - 1.0619386296362487, - 1.1109999318958896, - 1.1211156643205598, - 1.0695254289547438, - 1.0996197329181352, - 1.0892511071828515, - 1.0897568938040816, - 1.0723072553715314, - 1.058903909908846, - 1.0834345610386686, - 1.070789895507831, - 1.0513171105903407, - 1.0442360978930787, - 1.0330024899630683, - 0.9854585475671257, - 0.9614336830585395, - 1.0777646059422237, - 0.9123723807988942, - 0.8810136102824268, - 0.9376617118605675, - 0.9136368473519776, - 0.8299291615378492, - 0.8084332301354297, - 0.8005935375063115, - 0.7406201341671357, - 0.7680931761870208, - 0.7718865758462722, - 0.7893362142788238, - 0.7771916479538791, - 0.7360641050192431, - 0.7618726069397523, - 0.7429900604089278, - 0.7103668233393718, - 0.7300925015674743, - 0.7270218288297795, - 0.6961688449345402, - 0.6653290120196673, - 0.6601446991520256, - 0.6425730284344278, - 0.6143355893720502, - 0.6598563852830571, - 0.6820467881592579, - 0.8954887423197604, - 0.7049336327700684, - 0.6922057217483423, - 0.7055418069434845, - 0.7176806858530859, - 0.6844252155069889, - 0.7557411291009, - 0.85879515317721, - 0.7706618344272871, - 0.7915088777359446, - 0.7855658849364525, - 0.7937098181669858, - 0.8611058854463367, - 0.6979979129492287, - 0.7592739621116577, - 0.7662538174846781, - 0.8491522447048353, - 0.756661780165844, - 0.7894367532217703, - 0.7665245996631328, - 0.7809900970304093, - 0.755043243361135, - 0.7246201780939452, - 0.6813754219784877, - 0.6918199157069569, - 0.7338254946003934, - 0.6704504309598445, - 0.6601323838866833, - 0.6342866875416563, - 0.5755461259887938, - 0.6325731769876742, - 0.653985606348712, - 0.6280104638684012, - 0.6482419287177379, - 0.676184741902318, - 0.7004877890525837, - 0.7045366862390076, - 0.7098895126230761, - 0.7160853987331857, - 0.6838415016295554, - 0.716363581374864, - 0.7028084999258086, - 0.7184878851840446, - 0.7209905427163513, - 0.7473167363515506, - 0.7483788882561406, - 0.7375297652306839, - 0.7457993764878504, - 0.7457235084946654, - 0.7616557870635178, - 0.7454200365219252, - 0.7672700185592088, - 0.7573793844022412, - 0.7602876574743335, - 0.7788500264735999, - 0.7735392669506495, - 0.7917506327919598, - 0.7941531192428188, - 0.7910343185020676, - 0.7979888845440273, - 0.818726136014598, - 0.8132889298363389, - 0.8091161902111629, - 0.8198641559123735, - 0.8167841258994586, - 0.8159397944588026, - 0.9385930501079066, - 0.8653448582345223, - 0.9017614949633289, - 0.8590225254691053, - 0.8929102290917442, - 0.891898655849277, - 0.8901284026749606, - 0.9425835331630776, - 0.8381668549723766, - 0.804623474352554, - 0.6257773250844179, - 0.8288280625051728, - 0.8447603410740262, - 0.7406087600296408, - 0.8511231367691422, - 0.8437892307612574, - 0.8362990991572863, - 0.8961589457802605, - 0.7812063018437383, - 0.8855632831042483, - 0.98411580625158, - 0.8328603171717256, - 1.3382928877702813, - 0.8566575777007581, - 0.7309948916553161, - 0.9879049417685313, - 0.9365928890444011, - 0.8123129424718806, - 0.8950977732829426, - 0.7688787219541426, - 1.1751518254598858, - 0.8378174384282576, - 1.222341717220964, - 0.7067681248666792, - 1.0722687165449536, - 0.9893223831894022, - 0.9918513162955693, - 0.9808544920186182, - 0.9780726656018349, - 1.0253916762089998, - 1.1078348954700477, - 0.9366261241825353, - 0.9076855935437096, - 0.9322162446735318, - 1.0150388039005034, - 1.1978806674763836, - 1.1340251065456652, - 1.3903774941236966, - 0.9724712983295847, - 1.0052209820544487, - 0.9865068770688123, - 0.9937143364213887, - 0.8369204838390288, - 0.838058503736804, - 0.9064661442586239, - 0.9411125278131129, - 0.9605853127305993, - 0.9641258190792337, - 0.9452852674382888, - 0.8883845787955612, - 0.8619572278361156, - 0.860186974661798, - 0.8679002206356072, - 0.7826751749577765, - 0.8493125623052794, - 0.8542439818623052, - 0.8782688463708928, - 0.8778895064049678, - 0.8599340813511813, - 0.8371736833956772, - 0.8547497684835383, - 0.9121736933420175, - 1.0207913702518936, - 1.048808797323148, - 1.0462798642169815, - 1.0662584357557008, - 1.1753818992868106, - 1.0810526944267784, - 1.1681744399342346, - 1.2190059953681933, - 1.2587759005648493, - 1.2371535225071202, - 1.1136600893759594, - 1.475929756834394, - 1.6335678812988947, - 1.6691120865844293, - 1.599187086198911, - 1.8553680098536383, - 1.8199629463672968, - 1.875725921358279, - 1.6770782258688568, - 1.76736113775902, - 1.853597756679317, - 1.795558741892784, - 1.7978347816883344, - 1.8022570040947508, - 1.7835428991091156, - 1.7284205818993128, - 2.305523116726646, - 2.278602428445347, - 2.5728960079040584, - 2.5657589419179074, - 2.21322566691822, - 2.1991900881789914, - 2.2181332579428483, - 2.279080545801474, - 2.5738276993252462, - 2.017883300659978, - 1.8098785526777332, - 2.022196843464637, - 2.608529984129476, - 2.0639242397163926, - 1.8150772220695504, - 1.8933220928773258, - 1.8847237203163576, - 2.273926525355474, - 2.0324134137165144, - 1.5761938813639722, - 1.8509624633490256, - 1.9354885155155634, - 2.065096337206628, - 2.0936981350377186, - 2.3405220061996266, - 2.1809463272004797, - 2.115446959750754, - 2.118481679478155, - 1.9748382790478645, - 2.3280021414197978, - 2.2753943821048135, - 2.658401301033819, - 2.4672479904838065, - 2.6043096745792904, - 2.575532758894224, - 2.6048683829257624, - 2.2896368712420343, - 2.4498447835177206, - 2.4991589790879774, - 2.366769330980132, - 2.3509634990665877, - 2.4567993495596796, - 2.141188497910026, - 2.205411590340411, - 2.519378635471051, - 2.3553418269086634, - 2.4615570173676815, - 2.3672902999366543, - 2.553166883239936, - 2.5038621456344607, - 2.3674262045567467, - 2.486918293823141, - 2.5292779233514415, - 2.4841364674063593, - 2.646241079511668, - 2.561814278740884, - 1.952594293465231, - 2.0182201075702677, - 2.683203067836902, - 2.7473270860817136, - 2.2558289368981397, - 2.2352181320828772, - 2.320822517726635, - 2.1807196236449777, - 1.6284006332580854, - 2.279489460018519, - 2.3305739087630943, - 2.3136300569517743, - 2.302755644595256, - 2.3599095327946324, - 2.2739258071849515, - 2.270385300836317, - 2.2987093516253885, - 2.3083192974288234, - 2.232451304243811, - 2.232451304243811, - 2.179343709014302, - 2.236357779754407, - 2.231299913542073, - 2.2527958449444934, - 2.0999531048158078, - 1.9637700570487102, - 2.0360482193249654, - 2.174436530753452, - 2.295445979883545, - 2.5577834735746476, - 3.375640440109083, - 3.1793952310705142, - 2.6739873590312855, - 2.5360340580898724, - 1.785320265524174, - 2.407832236513827, - 2.1756761773676883, - 2.3436163749189043, - 2.6013146584373317, - 3.038314299183002, - 1.7502407663522306, - 2.334200989479654, - 2.314940718470636, - 2.2536017954553342, - 2.2653613343990116, - 2.281672952933789, - 2.2882481790098232, - 2.2377959635417897, - 2.243233169720049, - 2.243233169720049, - 2.1935396341838658, - 2.1918958276648572, - 2.2409020509531166, - 2.231039211839065, - 2.226487132247964, - 2.227245812179814, - 2.216624293133912, - 2.2128308934746617, - 2.209796173747261, - 2.2078334009785037, - 2.2007491748994137, - 2.1941739488233796, - 2.204036787937431, - 2.181023496671311, - 2.1651652119622895, - 2.1382320743816092, - 2.1222997958127565, - 2.210938901183913, - 2.1548590340688354, - 2.1351333558407326, - 2.2255427143862057, - 2.253487425209352, - 2.264413652313705, - 2.255309493131504, - 2.240135894494501, - 2.218892856402697, - 2.1820968797079665, - 2.1843729195035166, - 2.1923390587879434, - 2.0375683526905175, - 2.1062288865229535, - 2.108504926318504, - 2.083089148601525, - 2.0867375106574912, - 2.074598631747889, - 2.0654944725656876, - 2.0776230272224288, - 2.0713338517150115, - 2.0451327147450202, - 2.0402852480825477, - 2.0539414868558494, - 2.0562175266513996, - 2.0220769297181436, - 1.9970404919670894, - 1.9378634572827804, - 1.9034706524871028, - 1.8888172527887046, - 1.9353496219421802, - 1.922704956411344, - 1.920176023305177, - 1.8842651731976048, - 1.8958982654859728, - 1.8862883196825377, - 1.8753306455219831, - 1.9259093076453258, - 1.895799448408416, - 1.8995928480676658, - 1.937021058038939, - 1.8773382367333957, - 1.8963052350296488, - 1.8765287003350242, - 1.8795634200624252, - 1.8820923531685914, - 1.8876560060021594, - 1.9357057350193336, - 1.8704592608802235, - 1.879057633441191, - 1.8891733658658598, - 1.8608442572105754, - 1.841371472293088, - 1.9028194889067338, - 1.9164757276800364, - 1.9412592721204738, - 1.8977616226944003, - 1.919004660786204, - 1.8952326895882334, - 1.9220393805136045, - 1.8886574635121987, - 1.9260856734834721, - 1.9260856734834721, - 1.9080594383027123, - 1.8956548529174218, - 1.9103226649331915, - 1.9047590120996234, - 1.9214499706003263, - 1.9235995637405683, - 1.900333379163831, - 1.935991335960787, - 1.9215764172556344, - 1.8998610948386114, - 1.8899982557245598, - 1.876949487092395, - 1.782620282232362, - 2.4620181612041505, - 2.22873883767345, - 2.1331451662603356, - 2.287583340711226, - 2.1362408604962067, - 2.096620251031014, - 2.3582383808639995, - 2.122036028747992, - 2.2861279218556416, - 2.137698864759184, - 2.1848634671892024, - 2.2153371111185134, - 1.997090184056294, - 2.073463963862543, - 2.2590876538552065, - 2.281342265189474, - 2.2527653210897878, - 2.273249679249738, - 2.1761386479729246, - 2.24538083641978, - 2.224871188928763, - 2.153226514031051, - 1.8269688540044369, - 2.125130067221534, - 1.9080761915791882, - 1.8134940934085428, - 2.0802965361091696, - 2.0679047638889525, - 2.2005473053074125, - 2.2110132566955314, - 2.4109254187380387, - 2.111879078933781, - 2.058771483704275, - 2.2289686817493197, - 2.120856791460675, - 2.082928453004918, - 2.425472442235252, - 2.1813622336002902, - 2.3395469993910427, - 2.598003962841318, - 1.6084324383981399, - 2.4776267469877675, - 3.75397928567029, - 2.1297933983692867, - 3.1552098318466184, - 3.5200330962804136, - 3.4987459703196158, - 4.082843938756071, - 3.604835467994149, - 3.6105681479653344, - 3.612125742547835, - 3.7029854265268423, - 3.7025901303654427, - 3.5006220328349675, - 3.4192809824156702, - 4.437428641174682, - 3.372207012811309, - 3.100988797039941, - 3.409738656503831, - 2.7617542113789444, - 3.851135862377494, - 3.233116945255546, - 3.2480006268216313, - 3.2315593506730456, - 3.0430004118372307, - 3.0012914902392476, - 4.805159082835745, - 3.8763135134732374, - 4.599395854718091, - 3.9107659831896067, - 2.407894890357459, - 3.302438765692083, - 3.6709116320376904, - 3.755769426276608, - 3.653833514155409, - 3.746596924846352, - 4.196741759188043, - 3.664333690273106, - 4.197031037487151, - 4.192358253739664, - 3.7320025215793744, - 4.68507734000294, - 3.389035720310431, - 3.735860114013142, - 3.889023581292036, - 4.255923638502498, - 5.260399078148468, - 5.304011726458399, - 5.651355318355293, - 4.922577831305, - 5.916323174938236, - 5.881709961993839, - 5.763458302384247, - 5.757400990119006, - 5.698904660242996, - 5.714917510275177, - 7.895201407884725, - 11.253202261683985, - 6.384424117345511, - 7.922248458772866, - 8.246260646217996, - 11.16853294999018, - 7.891861477406351, - 5.702723297256852, - 6.808896884738706, - 6.715695409500692, - 5.207853735270391, - 6.901379364742445, - 6.833397112215881, - 6.020168553766484, - 6.435920232524307, - 7.169105171063415, - 6.865880654864261, - 7.334811998904943, - 7.204339105729074, - 6.828426488935723, - 7.176195915167008, - 7.40700662737412, - 9.022864360814456, - 7.9764935940984625, - 7.444879689260396, - 6.798205270957778, - 6.165458628086936, - 7.103942659336609, - 4.030371247919007, - 6.5395294835373985, - 6.354385310435468, - 4.519896684309063, - 6.826465157925333, - 6.147210007504024, - 9.974232797121363, - 6.88584175710932, - 5.963942654222256, - 5.4960222210933525, - 6.746133669998833, - 6.805531391026076, - 5.7886540251761405, - 5.714239863185075, - 5.820371536844473, - 4.344955382800521, - 5.507291813151338, - 5.398092951550376, - 5.19195817104662, - 5.028752403588436, - 5.042577985597717, - 5.629729540886357, - 5.339462027508527, - 4.59035365439703, - 5.715047323646931, - 6.431566824879491, - 5.843572954720544, - 6.214569087082731, - 6.532818881359166, - 6.321717347654579, - 6.246896550898517, - 6.396421963049221, - 5.9807540972201005, - 6.091736342718874, - 5.730760852779339, - 5.8004115789521125, - 5.103085238626527, - 5.721721942860665, - 5.906101763438061, - 5.363941440360243, - 6.089871631868027, - 5.15914506349949, - 4.86285354653191, - 4.535512560724177, - 4.538388049419378, - 4.766488388041503, - 4.5139681989898115, - 4.772239365431891, - 4.77580100126387, - 4.894044581851543, - 5.192543544686153, - 4.856488956771762, - 4.997213630794686, - 5.219178121792243, - 5.533361568418895, - 5.434346003146631, - 5.657646579800568, - 5.8479516498105335, - 5.8060682690177154, - 5.461183897635194, - 5.717160482189193, - 5.261468137350033, - 5.172473214500434, - 4.702577698227379, - 4.326963356748608, - 4.769013598183143, - 4.956529670856094, - 3.5861995582187522, - 4.078430941225276, - 4.089951594021153, - 4.18188009624666, - 4.155448836523056, - 4.583722380066538, - 4.834674120739032, - 5.225748019836358, - 5.26988891673365, - 5.450550933745525, - 5.547417143831493, - 5.62818061722431, - 6.0647740250067885, - 6.127511960174947, - 6.321090325773329, - 6.31158382359546, - 6.407287666096376, - 6.39381318099743, - 6.741251858060964, - 6.524544573667737, - 6.518038417428111, - 6.516693858448482, - 6.158855265267353, - 5.369444854423552, - 6.0710931413940425, - 6.143067494795244, - 5.665794462071851, - 5.6731719785221495, - 5.291341934207324, - 5.5363974707875965, - 5.325356139595146, - 5.584177475670074, - 5.895760837547725, - 5.732961704854523, - 5.917009777162833, - 6.1641856235890815, - 6.2943530712296045, - 6.0085415256696555, - 6.815856760853848, - 6.75062709394316, - 6.3835727829858655, - 6.695328012775848, - 6.633007243678881, - 6.632609303152378, - 6.787856647353121, - 6.480732513167197, - 6.461381924834528, - 7.245025207628918, - 7.245025207628918, - 5.476742922127162, - 5.353538704986069, - 5.47146278682985, - 6.1063791310724325, - 5.512982827607306, - 5.77540747772025, - 5.312128528747696, - 5.219750050318019, - 6.200817137381243, - 6.209275982778385, - 6.0674699369062175, - 7.038621096332192, - 6.571789241412817, - 7.8458239502685645, - 7.202541388654028, - 7.264873430750539, - 7.27546628115403, - 7.287955777506937, - 7.909816514520552, - 7.046045855977025, - 7.669007046905296, - 8.35724010841463, - 9.128829574961385, - 8.375102992733305, - 8.820222833683028, - 8.496657742121553, - 9.34510079100525, - 8.537059422312183, - 8.53893411462567, - 8.84840524585299, - 8.855521354240127, - 8.654527598979275, - 7.956308274648677, - 8.27842109919241, - 8.758540575270644, - 9.183619131375009, - 8.04141112189067, - 8.951837315337233, - 8.955467982881709, - 9.569341251297518, - 9.938362300515521, - 9.934491694308798, - 9.88090304135271, - 9.522306383686118, - 8.335949456861172, - 6.255576953890583, - 9.885373138131243, - 9.548011509900823, - 9.97178302568916, - 6.2371331627647955, - 9.840643313983598, - 9.143119465343602, - 9.622658034614732, - 9.049448242696771, - 9.382743523277387, - 9.27803507129542, - 9.445626685147298, - 9.468572504028229, - 9.07399155529725, - 9.132517916113807, - 9.2093428413544, - 9.19438449107128, - 9.490066055891374, - 8.821878001010543, - 8.891151137758706, - 8.436010654386273, - 9.616848966543628, - 8.645572785052005, - 9.351229328991554, - 8.500926990081062, - 8.378065200376824, - 8.750136010332177, - 8.029666342811304, - 8.254767730567247, - 6.969046694385816, - 7.500895921637404, - 6.343613380508446, - 7.482539266532653, - 7.4445770066878625, - 7.79744884666819, - 8.004251670000112, - 8.032309468783657, - 7.1741939333174924, - 7.72886956989232, - 8.174080738433368, - 8.89341745577686, - 8.760970703755275, - 8.137181432498714, - 8.975575181863393, - 8.60713503945247, - 8.561824308497735, - 8.859550665278881, - 9.128510516971804, - 9.19196877658076, - 9.179909151265132, - 9.019939034722553, - 9.100388818439546, - 9.300511213489681, - 10.248986802802142, - 9.91242101689747, - 11.630017218826465, - 11.161515878890537, - 11.210166823986176, - 7.922594457951484, - 11.990028403466225, - 12.127412863348312, - 13.138335934425292, - 14.218962013287726, - 12.865449152716259, - 9.45175030072136, - 12.685803722616823, - 14.236098764097529, - 14.358524873696435, - 14.524518993828744, - 8.240382355232502, - 13.370535876933989, - 7.585678256684654, - 10.808999612953475, - 12.621950593143795, - 14.945960095409378, - 15.104347302189334, - 11.804508865905554, - 15.212823129644443, - 15.24919235903432, - 14.77292864083401, - 15.518261679498474, - 15.323745434993956, - 15.17613505468784, - 16.727101629230134, - 16.40466995396, - 14.657529960284702, - 8.315845179268313, - 13.492979029769597, - 13.155704710858569, - 11.425826364413652, - 11.575415541183206, - 10.739085530369277, - 12.091024101128946, - 12.145869176943899, - 12.018343300582838, - 10.55451686281451, - 10.36050690788923, - 10.532503406100147, - 9.89375880410743, - 10.590664919676783, - 9.601762669853763, - 10.479146582764535, - 9.246632792343009, - 10.235039228363501, - 9.393941341502922, - 15.24225749702295, - 8.647586180702072, - 14.031249557799597, - 8.853424284910513, - 9.474463986464464, - 10.3633581581108, - 9.889355267133368, - 9.715934685580075, - 10.40079082340033, - 10.558436103398437, - 10.38288682374342, - 10.198554449917095, - 10.758860136709112, - 10.771872552227755, - 6.1113451364486195, - 9.916039800183134, - 7.996505815377657, - 8.300628551688217, - 7.42573573559942, - 8.483569176562952, - 7.627939412870008, - 8.34347425004753, - 8.809640118027582, - 8.955805824692012, - 10.19389473777204, - 9.987137975389704, - 11.843162260174836, - 7.289143182246886, - 9.528910819912186, - 10.024584096143151, - 9.605817011634148, - 9.730618242004963, - 5.520596923105695, - 8.957513867740117, - 8.500278983435644, - 8.789582867786637, - 8.637182464394503, - 8.510178360836875, - 8.983804115196685, - 10.284515183698614, - 10.662380528994126, - 11.866259221294397, - 10.353070186983077, - 10.648017357392382, - 11.973304675228809, - 11.138335654262525, - 10.160776119563293, - 10.202044911408144, - 16.339357826641994, - 10.190601469614911, - 11.138194873783526, - 12.009324366356571, - 11.996955795701293, - 10.846678724762473, - 11.400549352153956, - 11.517899937151386, - 12.60355876822786, - 12.239532627921543, - 8.918722243212766, - 14.471184781075719, - 10.442300876874524, - 10.852273743228002, - 12.123722583594327, - 15.8619470885467, - 12.417036700447177, - 12.35565641160192, - 12.243233143369617, - 12.637046666001911, - 12.1433536599351, - 12.55322596880357, - 11.664599473840179, - 6.617827394210248, - 10.737838948147708, - 10.933358692274792, - 10.85839960161587, - 10.366121861221218, - 9.786275902388596, - 9.374477441835063, - 9.550090416781545, - 9.549999978899542, - 9.321731286347712, - 10.337237393061976, - 10.789555503132267, - 11.767456842834305, - 11.737542774172265, - 11.401218204529028, - 11.109469075572308, - 7.43403876723102, - 11.401044285525177, - 10.780936077301511, - 11.280779294363592, - 10.734064905764207, - 10.544924510698333, - 7.343510447347536, - 10.392571463326568, - 10.431007563177213, - 11.865738471909369, - 11.357425353602796, - 11.984055524470808, - 10.443655230095906, - 10.90019261519956, - 9.35461470783188, - 9.35461470783188, - 10.799177053831395, - 10.57669936898287, - 10.687364031131981, - 11.851090869686537, - 11.839246453237973, - 10.890883517149671, - 10.96078156479658, - 10.89355054578524, - 10.746745514636313, - 11.096583590878577, - 12.007466981637442, - 11.258032602151616, - 11.329482286826384, - 11.664039808050203, - 11.704740428759665, - 12.763107134782441, - 13.00052122613729, - 13.831048388084533, - 12.998020416964115, - 13.204672210085569, - 12.46546055028345, - 13.248043891902892, - 13.019954388172803, - 12.90240366212654, - 13.237101973643666, - 12.239572135167213, - 12.812843955654362, - 12.752772331724923, - 13.512885338047052, - 13.68101283906789, - 13.689030505145329, - 13.033773266243772, - 12.807869872144275, - 11.962936567644974, - 12.184758315653974, - 11.974895308991103, - 11.725425889870078, - 12.193441929227777, - 11.8792920325753, - 11.171162512209508 - ], - "yaxis": "y" - } - ], - "layout": { - "legend": { - "title": { - "text": "variable" - }, - "tracegroupgap": 0 - }, - "margin": { - "t": 60 - }, - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "heatmapgl": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmapgl" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "xaxis": { - "anchor": "y", - "domain": [ - 0, - 1 - ], - "title": { - "text": "index" - } - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0, - 1 - ], - "title": { - "text": "value" - } - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import plotly.express as px\n", - "clipped_returns = winsorize(log_returns, limits=[0.01,0.01])\n", - "cum = np.exp(pd.Series(clipped_returns).cumsum())\n", - "px.line(cum)" - ] - }, - { - "cell_type": "code", - "execution_count": 165, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABWwAAAJOCAYAAAAjyk6bAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAACyPUlEQVR4nOzdd3gU9fr+8XvTKykkISHSQwcB6QEEEQURe0FFD4iAInJUVBRBKaIIHkVFRVBUQCyIjaMgCIIKoYOCXxQIvQRIQhJK2iaZ3x/8dk6WbCALIZnA+3VdXBc7Mzvz7LOzm9l7Zz9jMwzDEAAAAAAAAACg3HmUdwEAAAAAAAAAgNMIbAEAAAAAAADAIghsAQAAAAAAAMAiCGwBAAAAAAAAwCIIbAEAAAAAAADAIghsAQAAAAAAAMAiCGwBAAAAAAAAwCIIbAEAAAAAAADAIghsAQAAAAAAAMAiCGyBi8Bms6lLly7lXQZKyG63a/To0apbt658fX1ls9n03XfflXdZsLC+ffsqKipKp06duuB19evXTzabTXv27DGn7dmzRzabTf369XNa9uabb1adOnWUm5t7wdsFAAAVU3HHCagYunTpIpvNVt5lALA4AlugGDab7Zx/SGvWrFkkaLlQHICVvddff13jxo1T1apV9fTTT2v06NFq0KDBWe/jCNk++eSTsinyPI0ZM8bclx3//Pz8FBcXp0GDBpXKvrt8+XLZbDaNGTPmgtdVEaxbt06zZ8/Wc889p8DAwGKXGzhwoGw2mwICApSenl4q2x43bpx2796tt99+u1TWBwDA5ebM4yKbzSZfX1/VrFlTffv21d9//13eJZaZTz755IKPZ//55x8NHTpUTZo0UUhIiHx8fFS1alXdeOONmjFjhnJyckqvYAC4jHiVdwHApejvv/9WQEBAeZeBEvrhhx8UFBSkn3/+WT4+PuVdzkXRuXNn86zv1NRU/fLLL/rggw80b948rVmzRnXr1i3fAiuQkSNHqlKlSho8eHCxy5w4cUJffPGFbDabsrKy9Omnn+qxxx674G03b95cPXr00Msvv6xHH32U9xkAAM7T6NGjzf9nZGRo7dq1mjVrlr7++mutWLFCzZs3L7/iKohx48Zp7NixKigoUPv27dW3b18FBQXpyJEjWr58uQYMGKCpU6dq/fr15V2qpcyaNUuZmZnlXQYAiyOwBS6Cc52dCWs5dOiQKleufMmGtdLpn14VPgO2oKBAN910kxYsWKBXXnlFH3/8cfkVV4Fs375dS5Ys0YABA+Tv71/scp999plOnjypYcOG6Z133tEHH3xQKoGtdHo4hoULF+qzzz7TgAEDSmWdAABcblz9Mmjo0KF655139Oabb1r+V1Tl7ZVXXtHo0aNVrVo1ffXVV2rbtm2RZX744Qe9/vrr5VCdtVWvXr28SwBQATAkAnARuBrD9sSJE3rppZfUpEkTVapUScHBwapTp4569+6tDRs2SDp94FirVi1J0syZM51+qlX4oLGgoEDvv/++WrduraCgIAUGBqp169aaOnWqCgoKXNY0Z84cXXXVVfL391dUVJQeeOABHTp0yOUYSoV/4r527VrdeOONCg8Pdxr+YdmyZRo0aJAaNWqkSpUqyd/fX02aNNHYsWOVnZ1dZPuOn+YvX75cn3/+uVq2bKmAgABVrVpVw4YNM38u9csvv6hLly6qVKmSwsLC9MADDyg1NdWt/mdkZGjEiBGqX7++/Pz8FBYWpu7du2vJkiVOyzmGNdi9e7f27t1r9rpmzZpuba8kli5dqh49eig8PFy+vr6qV6+ennvuOWVkZLhcft26dbr++usVHBysSpUqqVu3blq1apVTHy+Eh4eHOezGunXriszPzMzUhAkT1Lx5cwUGBiooKEjt27fX559/7rRcv379dM0110iSxo4d67TPOmo8W83FDQHieG527dqlKVOm6Morr5S/v7/5uio87uu0adPUtGlT+fn5qUqVKho0aJDLvm7evFn33nuvatasKV9fX0VGRuqqq67SE088IbvdXqK+ffTRRzIMQ7179z7rch988IE8PDz0xBNP6KabbtLmzZu1Zs2aEm3jXG655Rb5+flpxowZpbI+AABw2vXXXy9JSk5OLjIvJydHr776qpo2baqAgABVqlRJnTp10ty5c52W++abb2Sz2dSuXbsixxd//fWXefx79OhRc3rNmjVVs2ZNZWRk6LHHHlNsbKz8/PzUqFEjvf322zIMo8SPISkpSUOGDFHNmjXl4+OjyMhI3X777ebnDYcuXbrowQcflCQ9+OCDTsdw5xoya8+ePRozZoy8vb21YMECl2GtJPXq1Us//fRTkelz587V1VdfrZCQEPn7+6tp06aaMGGCy+ETHL05efKknnzySVWrVk3+/v5q3ry5ec2JvLw8vfzyy6pbt678/PxUp04dvfPOO0XWVfgzzqpVq9StWzeFhIQoODhY3bt3d3km8KFDhzRu3Dh16NBB0dHR5pAP9913n7Zu3eqyN45j2+3bt6t3796KioqSh4eHeSzs6vOXYRiaOXOm4uPjFRkZKT8/P1WrVk3du3fXl19+WWQ7GzZs0B133KGoqCj5+vqqRo0aevTRR5WUlFRk2fM5bgZQ/jjDFigDhmGoR48eSkhIUPv27TVgwAB5eXnpwIEDWrZsmTp16qSWLVuqS5cuSk9P11tvvaVmzZrp1ltvNddR+GdZDzzwgD777DNVq1ZNAwYMkM1m07fffqtHH31UK1as0Jw5c5y2P2nSJD377LMKCwtT3759FRISop9//lkdOnRQSEhIsXWvWrVKEyZMUMeOHdW/f3+lpKSYZ6FOnDhR//zzj+Lj43XjjTcqOztbK1eu1JgxY7R8+XItWbJEnp6eRdY5ZcoULVy4ULfeequ6dOmixYsXa/LkyTp27JhuueUW3XPPPbrxxhs1aNAgJSQk6NNPP1VKSooWLlxYol6np6erQ4cO2rp1q1q3bq0nnnhCKSkpmjt3rq6//npNnTpVDz/8sCTp1ltvVc2aNfXmm29Kkp544glJUmhoaIm2VVLTpk3T4MGDFRgYqLvuuktRUVFavny5Jk6cqP/+979auXKl0zZ/++03XX/99crPz9ftt9+uOnXqaMuWLbrmmmvUtWvXUq1Nkry9vZ1up6enq2vXrtq0aZOuuuoq9e/fXwUFBVq0aJHuu+8+/d///Z/Gjx8vSeY+OnPmTKdhFySVSvD9+OOP6/fff9eNN96onj17Ftmnhg8frkWLFummm27S9ddfr2XLlumDDz5QYmKifvnlF3O5zZs3q23btrLZbLr55ptVq1YtHT9+XImJiXrvvfc0fvz4In1wxbFft2vXrthlNm3apA0bNui6665TtWrV1K9fP3399deaPn16sR9o3OHn56eWLVtq9erVysjIOOtrGAAAlJzjy/1WrVo5Tc/NzVX37t3166+/qkGDBhoyZIgyMzM1b9489e7dW3/88YdeeeUVSdLtt9+uIUOG6N1339XIkSM1adIkSae/DL/77ruVk5OjOXPmKCoqqsg2unXrpvT0dN1zzz3Kzc3V119/rccff1zbtm3Tu+++e876d+/erY4dO+rQoUPq2rWr7r33Xu3fv19fffWVfvzxR3399dfq1auXpNMhXmhoqL7//nvdcsstTp81znUs/PHHH8tut+uee+5RkyZNzrqsr6+v0+3nn39eEyZMUEREhO677z4FBQVp4cKFev7557Vo0SItXry4yK/e7Ha7rrvuOvPzQm5urj7//HPdcccdWrx4sd577z2tWbNGN9xwg3x9ffXVV19p6NChioyMdPkl+5o1azRhwgR169ZNQ4YMUWJior755hv99ttvWrx4sTp16mQu+9tvv+nVV1/VNddcozvuuENBQUHasWOH5s2bp/nz52vlypVq1qxZkW3s3LlTbdu2Vb169dSnTx9lZWWpUqVKxfZp5MiRmjBhgmrVqqW7775bISEhSkpK0rp16/TVV185PY4ffvhBd9xxhwzD0J133qkaNWpow4YNmjp1qr7//nutWLHCPAmosJIeNwOwCAOAS5IMScbo0aOL/RcSEmJIMnbv3l3kvp07dzZvb9682ZBk3HrrrUW2k5+fbxw7dsy8vXv3bkOS0bdvX5d1ffbZZ4Yko0WLFsaJEyfM6SdPnjRatmxpSDLmzJljTt+5c6fh5eVlREREGPv27TOnFxQUGPfcc4/5OAtbtmyZOf399993WcfOnTuNgoKCItNHjRplSDK++OILp+mjR482JBmVKlUytm7dak7Pzs42GjVqZHh4eBjh4eHG8uXLnXrTrVs3Q5KxadMml3WcadCgQYYkY9CgQU71bd++3ahUqZLh4+NT5PmqUaOGUaNGjRKt36Fv376GJOPjjz8+63J79uwxfHx8jODgYOPvv/92mjd48GBDkjFw4EBzWn5+vhEXF2dIMhYsWOC0/NSpU83nZdmyZSWq09H30aNHO03Py8szunfvbkgyHnvsMZePbeLEiU7Ts7KyjO7duxs2m83p+XDsL2du48waXNVc3P7uqKFq1arGrl27itzPMb9atWrG3r17zel2u93o1KmTIclYs2aNOX3YsGGGJOO7774rsq5jx44Z+fn5Lmsv7OTJk4anp6fRpEmTsy738MMPG5KMzz77zKwpOjraCAwMNDIyMop9LIX3y3O9DzzxxBOGJOPHH388Z90AAOB/XB3jP/nkk0bHjh0Nm81m9OrVyzh+/LjTfV555RVDknHDDTcYdrvdnH7kyBGjRo0ahiRj5cqV5vTs7GyjRYsWhs1mMxYu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T5qhfmmLiorS7bffrrlz56pr167auXOn/vrrL6faXPUwLy/PPIYvy887AC4OAlugDOzevVu7du0qMj0tLU05OTlOP2sOCwuTzWbTvn37XK6rf//+kqQRI0YoMzPTnJ6ZmannnntOkvTQQw+Z0++77z55eXlpypQpToGZYRgaMWLEef38pWbNmpKKHijs2rXLHO6hPPj4+KhPnz46ceKEXnjhBad5O3fu1Ntvvy1vb2898MADZVbT/fffL29vb02ZMsUMuh1eeOEFHT9+XPfff785xlWHDh1Up04dLVu2TAsXLnRafvr06dq+fXup1Va9enUNHDhQqampev311yWdPkDs06eP1q9fr5deesnl/rFz507t3r3bvO0Yt7i4fdYxDu3HH3/s9AFi//79GjduXKk9nrNJSEgwhxEozHGGRUBAwDnXYbPZdPXVVyslJaXIc5mVlaU5c+bI09NTc+bM0Ycffujy3x133KGTJ0/q888/v6DHs3r1akVERKhJkyYXtB4AAPA/3333nXbv3i1vb2+n8WT79+8vwzD0zDPPOB0bpaSk6KWXXjKXcVi9erVGjhypuLg4TZ06VU2bNtXkyZN18OBB9e3bV4ZhuNz+iBEjnALOY8eOafz48ZJOh6Rnc8UVV+i6667Tnj179OabbzrNW7NmjT777DOFhYXptttuM6ef6xiuODVr1tSYMWOUm5urG2+8sdgv4H/66SfdcMMN5m1Hj8aPH6/k5GRzen5+vp5++mkVFBQ4fY65WHbs2KH33nvPadr333+vX3/9VXFxcerUqZOk08fFAQEB2rBhg9OX7Xa7XY8//nipXUsgJydHK1euLDLdbrfr2LFjkv53rHrrrbcqPDxcn3/+uVavXu20/Jtvvqndu3erW7duql69eqnUBqD8MIYtUAb+/PNP3X777WrdurUaNmyoqlWrKjk5Wd9//73sdrtTyBkUFKS2bdvq999/V58+fVSvXj15enrq5ptv1pVXXqn77rtP33//vebOnavGjRvr1ltvNcdQ2r17t3r37q0+ffqY66tTp47GjRun559/Xs2aNVPv3r0VEhKin3/+WceOHVOzZs20efNmtx7PTTfdpLi4OL3xxhvasmWLWrRooX379umHH37QjTfe6PZBX2l69dVX9fvvv+udd97RunXrdM011yglJUVz587ViRMn9M4776hWrVqltr0PP/zQ5Tfc0umw/Prrr9ebb76pIUOG6KqrrtLdd9+tyMhI/frrr1q1apUaNGigiRMnmvfx8PDQhx9+qB49eujmm2/WHXfcoTp16mjz5s36+eefdcMNNziNOXuhnn/+ec2YMUOTJ0/W0KFDFRERoXfeeUc7duzQiy++qNmzZ6tjx46qUqWKDh06pL///lvr1q3T559/bvaxfv36io2N1RdffCFvb2/VqFFDNptNDzzwgGrUqKG2bdvq6quv1m+//aY2bdqoa9euOnLkiP773/+qe/fu53WWt7smTZqkX375RZ06dVKtWrUUFBSk//u//9PChQsVFhamQYMGlWg9d9xxh77++mstWrTIHEtMkr788kulp6frpptuMi+A4cqAAQP06aefavr06Ro4cOB5PZZt27Zp3759GjRoUKkOGQEAwOVkzJgx5v9PnTqlrVu3ml+Wv/LKK04/d3/66ae1cOFCff/992rWrJl69uypzMxMffXVVzp69KiGDx9uDhOQnp6ue++9Vx4eHvriiy8UHBwsSXrkkUe0dOlSzZs3T2+88Yaeeuopp3piYmKUk5OjJk2a6Oabb5bdbte8efOUlJSkRx991LyY1Nm8//776tChg5555hktXrxYrVq10v79+/XVV1/Jw8NDH3/8sVmPdHoIp4CAAL355ptKTU01x10dOnToOX9S//zzzysvL09jx45V69atFR8fr1atWikoKEhHjhzRb7/9ph07djiN2x8fH6/hw4dr0qRJatKkie68804FBgZq4cKF+uuvv9SxY0c988wz53ycF6pHjx566qmntHDhQjVr1kyJiYn65ptv5Ofnp48++sg8zvbw8NC///1vvfrqq2ratKluueUW5ebmatmyZTp27JiuueYat4YJK05WVpY6duyouLg4tWzZUjVq1FB2drZ+/vln/f3337r55pvNX+MFBQXpo48+0l133aXOnTvrrrvuUvXq1bVhwwYtXrxY0dHRmjZt2gXXBMACDAAuSTLO9RKpUaOGIcnYvXt3kft27tzZvL1//35jxIgRRnx8vFGlShXDx8fHiI2NNXr06GEsWLCgyHp37Nhh9OrVywgPDzdsNpshyfj444/N+fn5+ca7775rtGzZ0vD39zf8/f2Nq666ynjnnXeM/Px8l7XOmjXLaN68ueHr62tEREQYffr0MQ4ePGg0btzYCAkJ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vL299dlnn6l9+/aKjY1V165d9cUXX+jw4cOaOHGiJKlt27aaPHmy/v3vf6t+/foaPny4y6EIFi9erA4dOqh27dq68847NXfuXMXGxiojI0NS0SERXn/9dV133XWaN2+e2rZtqwYNGmjw4ME6efKkucyyZct06623qmHDhmrcuLH+9a9/ac+ePWXTIAAAAACWR2ALAAAuCWlpaVq+fLn69u0rf39/p3lRUVG6/fbb9d///leGYUiSpk2bpkaNGmnRokV64okniqxv3759GjRokHr06KHFixfrgQceMAPfs9m7d68WLVqkmTNnaubMmVq9erXeeecdc35mZqYGDRqkBQsW6Msvv5SHh4cGDBiggoKCC2sAAAAAgEsCY9gCAIBLwu7du2UYhurWretyflxcnNLT05WSkiJJ6tChgx555BFz/v79+52W//TTT1WnTh298MIL5v3/+ecfvf3222eto6CgQJMnT1ZQUJAk6Y477tCKFSvM+TfeeKPT8m+88YaaNm2q7du3q0GDBiV8tAAAAAAuVQS2AADgkuI4g/ZcrrzyyrPO37lzp5o1a+Y0rUWLFudcb7Vq1cywVjp9dm9qaqp5e9euXfrPf/6jTZs26dixY+aZtQcPHiSwBQAAAMCQCAAA4NJQs2ZN2Ww27dixw+X8xMREhYaGmhcJCwgIuCh1nHnRMpvN5jTcQb9+/ZSenq5Jkybphx9+0A8//CBJstvtF6UeAAAAABULgS0AALgkhIeH6+qrr9bMmTOVlZXlNO/o0aP65ptvdNNNN8lms5VofXXq1NHmzZudpv3xxx8XVOOxY8e0c+dOPf744+rUqZPq1q1rXsAMAAAAACQCWwAAcAkZP368cnNz1adPH61evVoHDx7UsmXLdO+99yo6OlrPPvtsidd1//33KzExUS+//LJ27typ+fPna+7cuZJU4tD3TKGhoQoLC9Onn36q3bt3a8WKFRo7dux5rQsAAADApYnAFgAAXDJq166thQsXqnr16nrkkUfUoUMHDR8+XPHx8Zo/f77CwsJKvK7q1atr+vTpWrBgga677jrNmjVL//73vyVJPj4+51Wfh4eH3nvvPW3ZskXXXnutxowZo1GjRp3XugAAAABcmmxGSa/MUcaSk5MZy62EbDabYmJilJSUVOILrVzu6Jn76Jn76Jl76Jf7LmbPjh8/rkqVKpXqOq3C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IsyLpgEAAACwPptReFA2C0lOTj7vD1OXG5vNppiYGCUlJcmiT6fl0DP3VZSe/bkuU81al/7YkOejovTMKuiX+y5mz44fP65KlSqV6jqtwtvbm2MMN3l7eys1NdXlPuHt7e0UjuPi4Ni45Ph74j565j565h765T565j565j565r5z9ay0jo0ZwxYAAAAAAAAALILAFgAAAAAAAAAsgsAWAAAAAAAAACyCwBYAAAAAAAAALILAFgAAAAAAAAAsgsAWAAAAAAAAACyCwBYAAAAAAAAALILAFgAAAAAAAAAswutC7vzdd9/ps88+U8+ePdWvXz9JUm5urmbNmqWEhATZ7XY1a9ZMAwYMUGhoaCmUCwAAAAAAAACXrvM+wzYxMVE///yzatSo4TR95syZ2rBhg4YNG6axY8cqLS1Nr7/++gUXCgAAUNoSEhIUGxurjIyM8i4FAAAAACSd5xm22dnZmjJlih5++GF988035vTMzEz98ssvevzxx9WkSRNJ0qOPPqonn3xS27dvV7169UqnagAAUC7+XJdZZttq1jqgxMvOmjVL48eP19atW+Xldfrw5tSpU2rUqJFat26tefPmmcuuXLlSt912m1auXKlWrVpp06ZNqlSpUqnXf6EWLFig2bNna/PmzUpPT9eiRYvM4yuH7OxsjRs3Tt9//71yc3PVpUsXvfLKK4qMjJQkpaWl6YknnlBCQoJq1aqlN954w2kdzz//vKpXr65HHnmkTB8bAAAAgOKd1xm2H374oVq0aKErr7zSafquXbuUn5+vpk2bmtNiY2MVERGh7du3X1ilAAAAxYiPj9epU6f0559/mtPWrFmjyMhIbdq0SdnZ2eb0FStWKDY2VjVr1pSPj4+ioqJks9nKo2xJkt1udzk9MzNTbdq00ciRI4u975gxY/Tzzz9r2rRp+vrrr3X48GENGDDAnP/222/r1KlT+umnn9S+fXs988wz5rwNGzZo06ZNGjhwYOk9GAAAAAAXzO0zbFeuXKndu3drwoQJRealp6fLy8tLgYGBTtNDQkKUnp7ucn12u93pg4rNZpO/v7/5f5ybo0/0q+TomfsqSs9sNuvUWFF6ZhX0y3307H/i4uJUpUoVrVq1Si1btpQkrVq1St27d9fKlSu1ceNGxcfHSzo9DELh/991113aunWrQkJC9OWXX2rMmDGaOnWqRo8erUOHDqlNmzZ64403VKVKFfM+L7/8srZt2yZvb2/Vq1dP7777rq644gpJp4eHmjZtmg4dOqRq1arp8ccf15133mnWGhsbq1deeUXLli3TihUrNHjwYD311FNFHpPjPvv373f5mI8fP64vvvhC77zzjjp27ChJmjx5sjp37qwNGzaoZcuWSkxM1M0336w6dero/vvv15w5cySdPv567rnn9J///Eeenp4l7jP7GgCgsF27dunUqVMlWjYpKUnJyclubyMwMFC1a9d2+34AUJG5FdimpKTok08+0ahRo+Tj41MqBXz77bdOP1OsVauWJk6caP6UDyUXHR1d3iVUOPTMfVbv2Y6AQ4qJiSnvMpxYvWdWQ7/cdzF6lpWVJW9v7yLTPTzOe/h7t7na/tl06NBBq1at0pNPPinpdGD72GOPyTAMrV69Wp07d1ZWVpY2btyoe++9V97e3ubwCd7e3ubtrKwsTZs2Te+99548PDz06KOPavz48Xr//feVl5enhx56SPfff7+mTZsmu92ujRs3mvf/8ccfNXr0aL300kvq3LmzFi9erGHDhqlatWpmqCpJb7zxhl544QW9/PLL8vLyOutjddR45nJbt26V3W5X165dzekNGzbUFVdcoT/++EPt2rVTkyZNtGrVKvXt21e///67GjVqJG9vbzPkbdWqVYn76+PjY7n3VwBA+dm1a5c6depU4uW9g8MV2a6Xklf/IPuJY25t6/fffye0BXBZcSuw3bVrlzIyMvTss8+a0woKCvT333/rp59+0siRI5WXl6dTp045nWWbkZGh0NBQl+u87bbb1KtXL/O248yN5ORk5eXluVPeZctmsyk6OlqHDx+WYRjlXU6FQM/cV1F6lpmZqaSkpPIuQ1LF6ZlV0C/3Xcye5ebmuvypfkFBQalu52yKGyqgOO3bt9fo0aOVlZWl7OxsbdmyRa1bt1Z2drZmz54tu92u1atXKycnR+3atZPdbjePNRy/+MnLy5PdbteECRNUs2ZNSVLfvn315ptvym63Ky0tTcePH1fXrl3NM2pr1aplruPdd9/V3XffrQceeECSNGDAAK1bt07vvPOO2rZta9Z66623Op11e7bH6qjRUZtDUlKSfHx8FBAQ4DQ9IiJChw8flt1u1+DBgzVixAi1bt1a1apV03/+8x9t27ZNX3zxhebPn69hw4bpt99+05VXXqnXXnut2LF8vb29lZub6/L91cvLiy/aAeAy5DizdsqUKapbt+45l8/yDdPL605q/OD7VLWEw9Tv2LFDQ4cOLfFZvABwqXArsG3atKn+85//OE2bOnWqqlatqltuuUURERHy9PTUli1b1K5dO0nSoUOHlJKSUuwFxxxnpLjCB3b3GIZBz9xEz9xn9Z4ZhvXeO6zeM6uhX+6jZ6e1b99emZmZ+uOPP5SRkaHatWurcuXKateunYYNG6bs7GytWrVKNWrUUGxsbLHr8ff3N8NaSapSpYpSUlIkSWFhYbr77rvVp08fderUSZ06ddJNN91kDpeQmJioPn36OK2vdevWmjFjhtO0Zs2aldKjPrtKlSrp3XffdZp211136YUXXtC3336rffv26bffftMzzzyjyZMna/To0WddH/sZAOBMdevWdbqOjSs2m00ZHkHSunWKq1tXdcL9yqg6AKiY3Ppdo7+/v6pXr+70z9fXV8HBwapevboCAgLUtWtXzZo1S3/99Zd27dql9957T/Xq1Ss2sAUAACgNtWrVUkxMjBISEpSQkGB+eRwdHa2YmBitX79eCQkJ5/z55plfJNtsNqegcvLkyZo/f75atWql+fPnq1OnTtqwYYNbtQYElPDUorOIjIxUbm6uMjIynKYnJycXe8brl19+qZCQEHXv3t0c49fb21u9evXSqlWrLrgmAAAAABeu1Aei69u3r6666iq9/vrrGj16tEJDQ/X000+X9mYAAACKiI+P16pVq7Rq1Sq1b9/enN6uXTstW7ZMf/zxhzp06HDB22nSpImGDh2q+fPnq379+vruu+8knb742fr1652WXbduXYl+KuquK6+8Ut7e3lqxYoU5LTExUQcPHjQvvFZYamqqJk+erJdeekmSlJ+f7zTcQn5+fqnXCAAAAMB9bg2J4MqYMWOcbvv4+GjAgAEaMGDAha4aAADALR06dNDzzz+vvLy8IoHtqFGjlJub63TxL3ft27dPc+bM0XXXXafo6Gjt3LlTu3fvNsejHTx4sB555BE1btxYnTp10s8//6yFCxfqiy++cHtbaWlpOnjwoI4cOSJJ2rlzpyQpKipKUVFRqlSpku655x6NHTtWoaGhCg4O1qhRo9SyZUuXge3o0aP18MMPmxcOa926tb7++mt17txZc+bMUevWrc+3LQAAAABK0QUHtgAAAFYRHx+v7Oxs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CNCSJUsUGxurVatWKSEhQZLUvn17xcfHy9PT87y2kZubq5kzZ2r37t2SpObNm+vYsWPKyMiQzWZT27Zt5enpqZSUFEVFRalVq1Zav369jh49qqioKHP+ueTn52vNmjVnvV/hZSpXrizDMLR69WoZhqHQ0FCFhYXpjz/+UEFBgbmeOnXq6P7779fq1as1bdo0ZWRkKDo6WjfccIOqVq0qwzCUmppqbjM/P18ff/yx1q5dq4CAADVu3FgRERFKTU1VWlqaPDw8zJ4WXtbf318RERHau3evMjMzFRkZqSuuuEIdO3ZU+/bt5enpafZy165dOnLkiFN9mzZtcvnYc3NzNWPGDP3444/atm2bDMOQr6+v6tata85H+crPz5ckjRgxQna7XX5+fqpfv748PT0VHBwsLy8v8zk9evSokpOTlZ6ebu63x44d0+HDhxUTE6OwsDBFRUUpMjJSNpvNfF21bdtWNptNS5cu1Q8//KCCggJzn9+0aZOOHDmiwMBAxcXFaeXKlTp06JAMw1BcXJyio6MVEhKiQ4cOyWazKTY2Vh07dlSbNm20fv16HTp0SBs3bpQkVa9eXQ0aNNDatWslyaz78OHD5jK1atVS37595ePj49SDwq/f4t4H8vPztXLlSn311Vc6cOCAqlatqkaNGun48eNKSkpSbGys4uPji7xnOV47e/fuVY0aNXTvvfdqzpw5Wrt2rQIDA9W5c2c999xzysrKMt8Lq1evXla7AFAmbIZhGOVdhCvJycmy2+3lXUaFYLPZFBMTo6SkJFn06bQceua+itKzP9dlqlnrgPIuQ1LF6ZlV0C/30TP30TP3natn3t7eioyMLIfKyt7WrVs1f/587d69W2lpaXr66afVpk0bc/78+fM1f/58SdItt9yim266yZy3Y8cOffjhh3rllVfOK0jj2LjkLtXXeY0aNZSXl1eiZStXrqxXX31VPXv2LNHyjp49+uijmj59uhlIlYQjlHGoVq2aXnzxxbNue8GCBRo3bpz2799f7P1cLVPagoODdfLkyRLtJ35+fsrJySnRspUrV1arVq20ZMmSEvXS8dg3btyo999//6zbsNlseuSRRzRq1Khzrvdi27Jli3r06KGffvpJTZs2PeuyNptNGR5BemDWOr1xQ03VCfcr9W2UhQULFmjIkCEXPTivXLmycnNzdeLEiVJbp4eHhwoK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N9980/x/4de3Y5iDgoICp33a8Xp2vH7P3KfPvNDZmdss/H4j/e81U3g9y5cvl5eXl+x2u9atW6ekpCSn9fj4+OiFF16QdHpM20vl/b8sXGp/M8vCuXrm5eVVKl+02wyLPiNcCbfkbDau6ucueua+itKzP9dlqlnrgHMvWAYqSs+sgn65j565j56571w9K60r4VY0d999t55++mmX49lKp8/ge/755zV27Fjt3r1bX3/9tSZMmCDp9IWGRo8e7dbFUTg2LrlL7XW+b98+tW/fXtLp0CgiIsL8SX3hq7SvWrVK1atXV0FBgR588EGtXLlSERERWrly5Tkvdme32xUXF6fQ0FD5+vqqYcOG+ueff5SSkqL4+Hht3rxZKSkpqly5svz9/VW/fn398ssv8vX11datW/Xwww9r27ZtWrFihWw2m/r372/eLrxtR90NGjTQRx995HTmXUFBgfr3769//vlHhmGoYcOG+uCDD9SpUyclJyerQ4cO2rZtm7KyspSamqrKlSubAVJsbKwaNGig5cuXm4GXh4eHCgoKtH37dvMn146Q9JprrtGyZcsknQ6X0tLS1KVLF23btk3JycnKz89XXl6eqlWrprp16+qXX35x6peHh4c8PT3l4eEhwzBkt9vNMw7PPLvQMR6nzWZT+/btzfWHhIQoIyNDiYmJKigoMC84deZ916xZY15IrjBPT08lJiZe0NmcF2rLli3q0aOHfvrpJ5dnfhZms9mU4RGkB2at0xs31FSd8LMH4eezjYspPz9f7du318GDB80xakNDQxUYGKiUlBQFBQWZz1HhMWxtNpsKCgrk4+OjvLw8+fj4KD8/X/n5+apatapSUlKUk5MjX19fRUZGql69elq+fLm8vb0VGBiojIwMXX311fr1119lGIZCQ0N17Ngxp9psNlux73U2m02+vr7mkAzS/4ZsSE5OVnBwsHx9fZWUlKSCggJ5eHjIy8tLNptNUVFR+v333zVw4ED9888/yszMVGpqqq699lp98sknMgzDfD1/+OGHGjBggLZt26Zff/1VHTt2NL8Uueaaa7R9+3azPwEBAUpPT5dhGIqNjVX9+vW1cuVKSafPJna8ZgoKChQXFyfDMNS5c2etW7fOPON6w4YN6t69u1JTUxUbG6v58+frqquuknT6IqDe3t6XxPt/WbjU/maWhbI6NmYMWwAAAKCU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KC0tTVarVXFxcbrzzjsVGRkpyT9H2JaUlGjAgAHq1auX3njjDSPhIJX+B//3v/+91qxZoyFDhujNN980lrvfd/LkSQUHB2vDhg3Gf/ydTqfGjRunPXv2aP369ZUmyqvbti9llGWxWNShQwd169bNKNflchnbee2113TXXXcZ5VoslhptxxclJSVKSEhQTk6OBg4c6BU/d2w3bNigiIgII35lY1JR3b///nu5XC5lZ2erdevWCgkJMepeWblVOX36tGJjYxUWFqagoCCde+65+v7775WTk6OEhARt375dOTk5ateunYKDg9WzZ0+lpKQoKChIu3fv1j333ONTPH053u59O/fcczVv3jxddtllys7O1oABA7Rnzx6dPHlSubm5ateunTGqLCoqSr169dLatWuNUW3u0YR79+7V0KFDZbfblZNT2k8bMmSI1qxZI0mKiIjQ0aNHNXjwYO3Zs0fZ2dkqKSlRcXGxOnfurB49eiglJcUrXlarVTabTVarVS6XS6dPn1bHjh116tQpYxtuERER+t///ieLxaL+/fsb5Z911lk6duyY9u/fL6fTaSTryr7366+/NhIwnmw2m/bv3+91LWxoZ9II25KSEvXv31+HDx9WQECAiouLFRYWptDQUOXk5KhVq1bGMXIvt1gsslgscjqdatGihYqLi42fxZeUlKhTp07KycmRw+FQUFCQ2rdvr7i4OK1du1aBgYEKDQ3VsWPH9Jvf/Eaff/6515QKniwWS6V9GovFoqCgIJ06dcpI2EZHR0uScf0ICgpSRkaGnE6nrFarAgICjOvounXrlJiYqO+//15FRUXKzc3VsGHD9NZbb1V6Xf388881cOBAHT58WFLp+bZ3714jPiEhIcYUEVFRUerZs6c2bNggSbLb7cY543Q6FRsbK5fLpUGDBmn79u3G9l977TXjS6+oqCitX79eiYmJ2rNnjw4cOKCsrKw67+dVd/268847lZycbNTfnVR2fw5kZWXp9OnTioqK0rnnnqs33nhDkozr5RdffGHsQ3WfRe66ZGdn+/zZUpnm0Df2PDbuzw33cZJqFuOqMMIWAAAA+FlhYaG2bdumK6+8slyCIiwsTAMHDtTGjRuNjvPSpUvVpUsXzZgxQzfccEO58rKysvT3v/9dffr00V//+lddfvnleu+996qtx08//aRNmzbp0Ucf1WOPPabdu3dryZIlxnK73a5rr71WL7zwgp588klZLBb97W9/8/lnqKdPn1ZRUZHxd/LkSWOZ+z//df23adMmpaWladKkSbLZbF7LbDabhgwZopKSEg0dOtRruft9U6ZMUVpamjZt2uT1vokTJ+rQoUNer5vdti9lVPS3bt06r3I9txMYGOhVbm2240ts09PTZbfbNXnyZK99tNlsmjRpkk6ePOkVv7IxqajuaWlpSk9Pl8Ph0KOPPupV98rKrepv/vz5Ki4u1ujRo3X48GENHTrUqPeDDz5onEMJCQlKT09X165d5XK5ZLfb9c033/gcT1+Ot3vfJk2apC1btigtLU12u13Dhg1Tenq6EhISJElxcXHGuXH48GF17drV6yfI7nNu+vTpSk9P16OPPmosy8zMNB6PGjVKJSUl6tatmxHTe+65R5KUlpZW4ahdp9Op06dPy+FwKDExUS6XS0eOHKnwWjNq1CgFBgZq06ZNOnz4sBITE43kQklJiebPn68FCxZUeD149NFHFRwc7FV3t5KSEj3//PPasWNHo/3t27dPUul1z5fzwbiWmbie2e12SdK+ffsadV/fffddIwHZvXt3SdKgQYN0+PBhORwOPfbYY8b+uROiLpfLaIfuhKndbtfp06fldDqNc8x9LqWlpRnt2G63a/To0SouLlbLli1VUlIip9OpG2+8sVxbOP/88ytsP+462O12r8+g9PR0r+vH4cOHjeVOp1OJiYlyOBxKS0vTli1bjPPSfe5169atyuvq/PnzjVhJpSOHDx8+LLvdLrvdrscff1xOp1Mul0vp6enGFyruY+0+Z+bPn2/s9x//+EeNGjVKktS1a1cFBQVpypQpRhnueh46dEjr1q1rlM9K95ew7vqX/RxwXyvc1zebzeZ1vfTch+qu2+66mPlsqe7crI+YNdSf57Fxf27UNsa1iVld4aZjAAAA8HvuUQzun4eWFRUVpRMnTqigoEBS6X9gf/vb3xrLs7KyvNZftWqVOnXqpNtuu01S6c8109LS9OGHH1ZZD5fLpQkTJhgjan/zm99o586dxvJLL73Ua/17771Xd911l9LT0xUTE1Ptfn700UdavHix8bxbt26aMWNGvY5idv+8d/DgwRX+3Ns9OjgyMlIdO3Ys976xY8dqypQpOnXqlNfywYMHG+t5vm5m276UURH36El3uWW3U7bcmm6nOp4/na5oH93b9dx22bpWVne3W2+9VY888ohX3SsqtyrZ2dmSZIxgdB9zd1k//vijpNIRn5L3T6hPnTqlK6+80mtblcXT1+Ptfrx06VLjubtO7joEBgZ6vbeykVIZGRmSfomTJOM64bnPnqPlJk+erDlz5kiSkUSqjOe6FY0AveCCC7yOq3t9936UHZHraezYsYqMjNStt96qKVOmlFv+6quv6tVXX62yfg2hsLDQp/Mm/6fS+Vgj2rdXx7Mrn3O8bNmSNHHixJpXsI7t3btXkrym2vBsX7UZ9ezZjt3tybMNVtTGfvWrX2nHjh012p5nvd0eeOABo017nt/uqR2sVmuF1yr3+Vu2TXueWxVt0/N6I/1yzniWM3jwYB06dEhSaYw6duzodV541jMjI6PcdbIuVHf9ch87d/3Lvs/zWuFZhuf1suy1tLq6VFYfs58BUvnj0JR4Hhv350ZtY+yL+o4ZCVsAAAA0OxX9vNjTkSNHyq0TGxtbbbnt27f3mncwLCxMx44dM55nZGTo/fff1/79+3X8+HFj1FJOTo5PCdvrr79e1157rfHcPVIjOztbxcXF1b6/JtzJhbVr1+riiy8ut9w9GjEzM9NIfnm+b+HChcZzz+Vbtmyp8HUz2/aljLIsFovxnzB3uWW3U7bcmmzHF56Jm4r20b1dz22XrWtldXdbtGhRubpXVG5V3F8IuJM+niNQ165da7zuTqB4jmRt0aKF1q5d67WtyuLp6/F2r+MZP3ed3HUoO0VIZTcocrcFd5yk0jlw3SMA3fvmOQLx5ZdfNh5XNMLWk+e6FSXNtm/f7nVc3eu798OduK3IwoULdeutt3rV3dPdd9+tkSNHVlm/+rRv3z5NnDhRrVq1qraNWSwWyVI6P3JOdrYynNXfiEqSkXD55z//qR49Gm96sW3bthkjnePi4rR3714dPXrUWO55jGpzQzLPduxuT55tsKI2tnv37hpvr6K29dJLLxmPPc9v95QGTqezwmuV+/wt26bL/sKk7DY9rzfSL+eMZzlr167V9u3bJZXGKCMjw6scz3p27NhRmZmZdf7z/uquX+5j565/2fd5Xis8y/C8Xpa9llZXl8rqY+YzwGKxKDIysl5i1lA8j01Fx6kmMa5KdTELCAioky/aSdgCAADA70VGRspisSg9PV19+/Ytt/zw4cMKDQ01bkbkeeOUulR2FJ/F4j13oHs07D333KPw8HC5XC499NBDPidbAwMDy40cdKuv/0j17dtXnTt31qxZsyqcl2/NmjWy2WxKSUnRbbfdZix3v+/FF19U586d1bdvX6OOTqdT//znPxUTE+P1utlt+1JGRS677DKvcj2389prr3mVW1JSUuPtVKdv376Kjo5WTk6OXn755XLzDM6aNUvBwcGKiIgwtl02JhXVvXPnzsYctjNmzPCqe2XlVuWOO+7QM888o//85z+KiopSSkqKUe9//OMfRqJk48aNio6OVmpqqiyW0rkxf/3rX+uee+7xKZ6+HG/3vs2aNUvz5s1T586dlZ2dreTkZEVHR2vjxo2SfhnlKJWOsE9NTfW6U717Dts//elPSk5O1owZM4z1IyMj9d1330mSFi9eLJvNpoMHDyo6OlrZ2dl65ZVXJJXeUbyiEbaec9jOmzfP+JLggw8+KLfu4sWL9fjjj6tv376KiorSvHnzZLPZjHkl77jjDjmdTj311FPl3jtjxgyNHDnSq+5uNptNjz/+eKPOYevWsmVL386bn38p7JLv1zN3srJHjx6NOoftr371K82aNUuHDx/WgQMHJEmff/65oqKilJOToxdeeMFYNz09XdIvP5c2M4etux0HBgbqP//5jwICAmS322Wz2eRyuZSUlFSubp6/8ijLfZ5WNoftjBkzFBUV5TWH7bx58xQUFKQOHTrokksuUWJiojp37mycewcPHlRJSUml19U77rhD8+bNM74U+eGHHxQVFWUkfJ9//nlj/mf39cZ9nO12u3HOuK9LLpdLM2fONK5DqampcjgcevHFF2WxWBQVFWXUMyYmRpdddlm9zGFb3fUrNTVV0i/nvHsOW/fngPtaERUVZZQhyYib5z5Ud9121yU7O9vnz5bquFyuJpuw9Tw27s+N2sbYF/UdM+awBQAAgN9r3bq1LrjgAn322WflRi/l5+dr/fr1SkhI8HnusE6dOhn/6Xbbv39/rep4/PhxHTlyRCNHjlTv3r0VHR2tEydO1KrMhmCz2fTkk09q9erVGjdunLZs2aLCwkJt2bJF48aNU3Jysu6++24lJyd7Lf/2228VHh6unJwctW3bVt9++63X+1avXq0///nPVd7Uo7pt+1JGZeX+5S9/Mcr99ttvNWXKFK1atUoXX3yxVq9erUceeUTffvttrbbjaz3sdrtWr16tkSNHat26dfriiy80cuRIrV69Wna7XU8++aSx7bIxqajuU6ZM0dixY+VwOJSTk6PAwEBt2LBB69atM8o9efKkV7lVadGihR588EHl5OTo+PHjWr16tVq3bi273a6UlBTl5OSoTZs2ys3NVV5enpKTk425Mfv27etzPH053k8++aRx7BITE3XrrbfK4XAoOTlZeXl5ys3NNerilpGRoeTkZK8vO9zJqRtuuEGFhYXGiNawsDCtXbvW+OInJydHYWFhSk5OltPplMPhML5gCQgI0Jo1axQWFmaU26pVK685bE+dOiWXy6Xc3NxyPwVv0aKFcnJyFB8frwceeEDHjh0z1s/Ly9Odd96p7du3a/z48RUel5ycHJ1zzjnlbjgmlY6u9Ydk7ZnCZrMZSXV3+8jPz1dubq4cDodxjKxWq4qLixUQEGB8gdK2bdsK57DNzc31msO2RYsWSk5O1nXXXSe73a7c3FydffbZSklJUbt27eR0OsvdcEyqOvkdFhZWbg7b/Px8nX/++cb1IzMz01geEBCgU6dOyeFw6LzzztPtt9+u1atXG/t61VVXKSUlxevatHr1al188cVatWqVHnnkEW3fvt2YPkEqnaLGvY92u115eXnGHLaBgYFKTk42ll111VXKycnRxRdfrKSkJN16663GF4e5ubmKj49XSkqKevTooZycHLlcLo0dO1aJiYnG9aOur+Nu1V2/UlJSvOq/cOFCZWZm6t133zXO/ZiYGI0dO9b4PBg5cqRWrVqlW265xdgHXz6L3HVxOBxGWV988UWNPwOaOs9j4/7cqG2M/YHF5acp9Pq8E25z4/5Gtynf1a+hETPzmkrMtm0u0oV9Qhptm+8uK+2ou46V/kTKarUqtzhV4dYY3XJL4/2MqyloKm3MnxAz84iZedXFrK7uhOuLjIwMTZ06VdHR0brpppvUoUMHpaena8GCBSouLtb06dPVqlUrTZgwQddcc41GjBhhvDcrK0v333+/XnzxRXXt2lVZWVmaPHmyRowYoaFDhyo1NVULFixQbm6u3nrrLYWEhGjt2rV666239NZbb0mSkpKStHnzZv31r381yl22bJmWL1+uOXPmGDdriY+P1+jRo5WTk6NFixbphx9+0MMPP6y+ffuWq4evGqJvvHz5ck2bNk1paWnGazExMfrzn/+sa665ptLlI0aM0Kefflrp++pi22Z4ttlly5aVK9dzFGZttmPG8uXL9dhjj5VLvEVEROj555+vcNsVxaRs3SMiImS32415Pn0ptyLumN1333169dVXK51eoCI1iacvx7uidepa69atVVhY6NPnQcuWLeVwOHxaNyIiwkiu+xJL975/8803+ve//13lNqxWq+655x5NnTq12nLr244dOzR8+HCtWLGi2tGvFotFx6ytdNvbmzXz6q46p23VU03UZBsNYfny5ZowYUKtpj3wRUREhBwOh44fP15nZbpHndeEzWbT3XffralTp/p0bXJ/NixYsKDc9akintesZ5991vR1yH0OjRgxot77edVdvyqqv81m0+WXX67du3dXek2ryWdRTT5bympOfePqPjfq6vO+ofrGJGybgeZ0gjUUYmZeU4lZQydsnQvm6D3blTrqLJ0EP9zqPT8hCVvfNZU25k+ImXnEzDx/SthKpX3EpKQkbd26VYWFhQoLC1OfPn00evRotW5dehMbXxK2UumcZm+//bZyc3MVFxen/v3767XXXtPChQuNec7MJGyl0rnr3nzzTWVlZalTp076/e9/r6eeeqpJJGyl0jn4vv76a2VlZalDhw7q16+f1yiUypZX97662LavyrbZsuVecskl2rJlS623Y1ZJSYk2btyoL7/8UpKUkJCg/v37V7ltX+ouSV9++aXxc+X+/fsrISHB1D55xszhcGj+/Pk6ePCgJCk+Pl55eXk6duyYLBaLEa+cnJxaxdOX4+25Trt27eRyufTVV1/J5XIpLCxM4eHh2rp1q5xOp1HOOeeco7Fjx+qrr77SK6+8omPHjikyMlJXX321OnXqZIyGdW+zpKREb775pjZt2qSQkBCdd955ioiIUG5uro4ePSqr1WrE1HNd98+Nf/zxRxUVFal9+/aKjo7WwIEDjeN66tQpzZ8/XwcOHNBPP/3kVb9vv/22wn0/deqUXn/9dS1btkx79uyRy+VSUFCQevTooc2bN+uTTz6pcP7MxnAmJmwlaevWrRoxYoQuuuginT59Wi1btlTPnj1ls9nUunVrBQQEGMc0KytL2dnZys/PN9ptXl6eMjMz1bFjR4WHh6tDhw5q3769LBaLcV7169dPFotFe/bs0aeffiqn02m0+W+//VY//fSTQkNDFRsbqw0bNujIkSNyuVyKjY1VZGSkzjrrLB05csT4Cf7AgQPVt29fbdmyRUeOHNE333wjqTSB1atXL23atEmSjHpnZmYa63Tr1k133HGH14huX6+rJSUl2rBhg/7zn/8oPT1dnTp10q9+9SsVFBQoIyNDUVFRSkhIKHfNcp87P/74o7p06aKbb75ZixYt0qZNmxQaGqrrr79egYGBXvGy2WwN1s+r7vpVtv7u+JW9ppU95jX5LCopKanVZ0Bz6xvXR4zLImFLwtZnze0EawjEzLymErPGSthK0lHnIRK2tdBU2pg/IWbmETPz/C1hW58+/PBDrVq1Sv/6178auyrl0Df2Hee5ecTMvIaOmT8mLs/UhG1D1Ynz0jxiZh4xM6+h+sbcdAwAAABnpJUrV+qcc85R69attWfPHn3yyScaPnx4Y1cLAAAAZzgStgAAADgjZWRk6MMPP1RhYaEiIiJ07bXX6vrrr2/sagEAAOAMR8IWAAAAZ6Q777xTd955Z2NXAwAAAPBibewKAAAAAAAAAABKkbAFgHrmvhHZts1FXv8CAAAAAACURcIWAAAAAAAAAPwECVsAAAAAAAAA8BMkbAEAAAAA8GOxsbFasWKFYmNjG7sqZzyOBYCGENDYFQAAAAAAAJULDg5W7969G7saEMcCQMNghC0AAAAAAAAA+AkStgAAAAAAAADgJ0jYAgAAAAAAAICfIGELAAAAAAAAAH6ChC0AAAAAAAAA+AkStgDQCLZtLmrsKgAAAAAAAD9EwhYAAAAAAAAA/AQJWwAAAAAAAADwEwGNXQEAAAAAANC0nDx5UpK0Y8cO39YPCpck7d+3T0Uhvm1j3759NaobADR1JGwBoJFt21ykC/uElHsMAAAA+Kv9+/dLkh555BGf1g9s3VbtL71W9zzzqU4fzzO1rdDQUNP1A4CmjIQtAAAAAAAwZfjw4ZKk2NhYBQcHV7t++/btlZ2dLekWU9sJDQ1V9+7da1JFAGiySNgCQCPYnVWkDV8XSJIGWNs0cm0AAAAAc9q2batbbvEt+WqxWNSxY0dlZGTI5XLVc80AoOkjYQsADcSdpA3P4dILAAAAAAAqZm3sCgAAAAAAAAAASpGwBYAa2ra5qLGrAAAAAAAAmhl+lwsADcR17KhcRw/JZY0pfX70UOmCnv0bsVYAAAAAAMCfMMIWAAAAAAAAAPwECVsAAAAAAAAA8BMkbAEAAAAAAADAT5CwBQAfVHaDsR22vsbj8J/npvWV2fUBAAAAAEDzR8IWAAAAAAAAAPxEQGNXAADOePt2yfn9ptLHtr7GY+ttExqxUgAAAAAAoDEwwhYAAAAAAAAA/AQJWwAAAAAAAADwE0yJAAAetm0u0oV9Qhpse+HWGO2StN7S65ebkNn6qnfJpgarAwAAAAAA8B+MsAUAAAAAAAAAP0HCFgAAAAAAAAD8BFMiAEANzP06U+E5AXIprLGrAgAAAAAAmhFG2AIAAAAAAACAnyBhCwAmbdtcVOP3GjcWq0e1qR8AAAAAAGhcJGwBAAAAAAAAwE+QsAUAP7NLYfqXpZfmfp3Z2FUBAAAAAAANjIQtAAAAAAAAAPgJErYAAAAAAAAA4CcCGrsCANAk7Nulbfuk3iWbJFtfuZwFctXhDcQquxnZts1FurBPSJ1tBwAAAAAA+DdG2AIAAAAAAACAn2CELQB42J1VpA1fFxjP7+sXaTzepTCtt/RSuMIkFZR/MwAAAAAAQC0xwhYAAAAAAAAA/AQjbAGgDNe+XcbjOT8/rmyOWQAAAAAAgLrECFsAZ7Rtm4u8/vVUVZK2IRK44TlVf6dWUZ0BAAAAAEDTRsIWAAAAAAAAAPwEUyIAgB/zvAma5w3QAAAAAABA88QIWwAAAAAAAADwEyRsATRbtZnjtbFvMhZujZHr2NHSv327FPbDcTkXzKlyzt2qMN8tAAAAAABNAwlbAAAAAAAAAPATJGwBAAAAAAAAwE9w0zEAZyzngjmSra+c328y/nXZrmzsavlkd1bpFAfckAwAAAAAgOaFEbYAAAAAAAAA4CcYYQug2Sl7gy338wv7hHg97/3z8h22vpWW1dg3HytXh327vEYChx2TjjoPaa6k8JwAHY0o1gBrG0ncaAwAAAAAgKaIhC2AM94uhUmS1lt6Kbxxq1Jjrn275LLGyHX0kHZZY7R+zyGFW2NkOeuXPbpQIY1YQwAAAAAA4AumRAAAAAAAAAAAP8EIWwDNyq59h72ee4409Rxhujur6OcRtWENXMOa+9fP9TUzEth17Kjx2LngfUmS9bYJ9VA7AAAAAABQF0jYAjgjuI4dNRKWsvWVqwklagEAAAAAwJmDhC2AZs3zhl3v2a7UUeehakfV+sONxipSVb38tc4AAAAAAMAc5rAFAAAAAAAAAD9BwhYAAAAAAAAA/ARTIgAA4Mfmfp1pPL6vX2Qj1gQAAAAA0BBI2KJJIGGBsmgTtUcMAQAAAADwPyRsATQJnsnFulKTG3X54829fK3Te7YrJUlHFyaXW+bc+4Gst02o03oBAAAAAADzSNgCaJJc+3YZj517P/hlwc9JSdQcI28BAAAAAGg8JGwB+JWKkoXOBXPksvSq9D3/8lgWXn9VAwAAAAAAqHckbAE0OneS1nPUrFRm5CzqnXPBHEnySo57HgPPxLilx3mMvgUAAAAAoB6QsAUAeCVjfXkdAAAAAADUj3pL2K5YsUJLly5Vfn6+unTponHjxik2Nra+NgfgZ/U1/+icrzIUEnJMRUVFVZZbl9tv6GShP95QrCK+1LOp7IsZzgVzyrUJS4/zJPnfXLvMAwwAAAAAqKl6Sdhu3LhRb7/9thITE9WjRw8tW7ZM06dP10svvaSzzjqrPjYJNHt1mQAimYSG4tnWJN/a25yvMip8vap5jKtq07R3AAAAAEBTUi8J208//VTDhg3TkCFDJEmJiYn65ptvtGbNGv3ud7+rj00CzZ7n/K5Vze3qTmq5Rx7WhntOU3e5joAAqVvPKtctO/+p9bYJta4Hmg7PNiPVrD2WncvY7LqN0e7qYr/LlmGIu6HG9QIAAAAAND11nrAtLi7WgQMHvBKzVqtVvXv31t69e+t6c/BTlSUe6iKJMmdhstfze13fmy675O3ZygsJUUlRkddPrN1lSb/8HL8xbq7kjp8v84p61tmTa9+uShO7nknVOWUSXhXFoGy5Vb3HF5Ult9B0lG0HvrQbyfvLhvpMqpb9ssHN1zrf6/q+TupXWZwqKrvSKUAq+bLGH74Mqc9rvZlt+kMsGgvxAAAAAJqfOk/YFhQUyOl0KiwszOv1sLAwHTlypNz6p0+f1unTp43nFotFwcHBCgho2PuhOZcl1boM64gba709M2W4WSwWSVJgYKBcLpepfanJ9nzhPLtTxdsLDKx4/Wrq3NHS9ZcnZ7f1Whbo6lRl2RVxRXaSLailWjjs6qRfyvtYCcZjYw8KMvTRqop/oi1Jo1ypXs8riqlzWZIWe+yD+z1l103akVP6IDLBuw5V8Kxz2fd4LvOsZyeLdwwrK6/s9m02m0pKSsq9x30MypYd6OokffaRJHntvyITfK6PWa0trapcHuxqW+06dclqtcjpdDXY9nzZv2BX3cXbrap2U9l6WvWt8XCUK1UWi3QsqKU6nV27L0g826NUefuqqs6VtV3PdluTNm1s8/tjurF3hHc9z67+uHjumzUwsNz1vz5VdJ22VXKtd8fOF2Y/hyr6fDFz/W/ImDWE2sbDF9XFrKH7bGcq4mweMTOPmJlHzMwhXuYRM/OImXnEzLzKYlZXsbS46vh/K3l5eRo/fryeffZZxcXFGa8vXLhQu3fv1nPPPee1flJSkhYvXmw8HzBggCZPnlyXVQIAAAAAAACAJsFa1wW2adNGVqtV+fn5Xq/n5+eXG3UrSddff73eeust4y8xMdFrxC2qd/LkST366KM6efJkY1elySBm5hEz84iZOcTLPGJmHjEzj5ihqaHNmkfMzCNm5hAv84iZecTMPGJmXkPFrM4TtgEBAerevbt27txpvOZ0OrVz506vEbdugYGBCgkJ8foLrOOf8jV3LpdLBw8ebBY/7WwoxMw8YmYeMTOHeJlHzMwjZuYRMzQ1tFnziJl5xMwc4mUeMTOPmJlHzMxrqJjVyyQV1157rebMmaPu3bsrNjZWy5cvl8Ph0ODBg+tjcwAAAAAAAADQLNRLwjYhIUEFBQVKSkpSfn6+unbtqieeeKLCKREAAAAAAAAAAKXq7TZww4cP1/Dhw+ureHgIDAzUqFGjmErCBGJmHjEzj5iZQ7zMI2bmETPziBmaGtqsecTMPGJmDvEyj5iZR8zMI2bmNVTMLC4mqgAAAAAAAAAAv1DnNx0DAAAAAAAAANQMCVsAAAAAAAAA8BMkbAEAAAAAAADAT9TbTcdQdwoLC/XGG2/of//7nywWi/r166ff//73atmyZYXrZ2Vl6f77769w2YMPPqj+/ftLkm688cZyyydPnqwBAwbUXeUbidmYSdJTTz2l3bt3e712+eWX6+677zae5+TkaN68edq1a5datmypQYMG6ZZbbpHNZqu3fWkoZmNWWFiopKQkbdu2TTk5OWrTpo369OmjMWPGKCQkxFivObWzFStWaOnSpcrPz1eXLl00btw4xcbGVrr+l19+qffff1/Z2dmKjIzUrbfeql//+tfGcpfLpaSkJCUnJ+vEiRPq1auX7rrrLnXs2LEhdqdBmInZ6tWr9cUXXygtLU2S1L17d918881e68+ZM0eff/651/suvPBC/elPf6q/nWhgZmK2du1azZ071+u1wMBALVq0yHhOO/NW0bVeki666CI9/vjjkpp3O9u9e7c++eQTHTx4UEePHtXDDz+svn37VvmeXbt26e2331ZaWpratWunG264QYMHD/Zax+z1EagN+sbm0Tc2j75x9egbm0ff2Dz6xubRN/adP/eNSdg2AbNmzdLRo0c1depUlZSUaO7cuXrllVc0efLkCtePiIjQq6++6vXa6tWr9cknn+iiiy7yev2+++5TfHy88dyzM9GUmY2Z27Bhw3TTTTcZz1u0aGE8djqdev755xUWFqZnn31WR48e1ezZs2Wz2XTLLbfU2740FLMxy8vLU15enm677TZFR0cbHfajR4/qoYce8lq3ObSzjRs36u2331ZiYqJ69OihZcuWafr06XrppZd01llnlVt/z549evnll3XLLbfo17/+tdavX6+//vWvmjFjhmJiYiRJH3/8sf773/9qwoQJ6tChg95//31Nnz5dM2fO9Gp7TZXZmO3evVsDBgxQz549FRgYqI8//ljPPvusZs6cqbZt2xrrxcfH67777jOeBwQ0n48yszGTpODgYL388suVlkk78/bwww+ruLjYeH78+HE98sgjRsLGrbm2M4fDoa5du2ro0KH629/+Vu36WVlZeuGFF3TFFVdo4sSJ2rlzp/79738rLCzMuK7XpN0CtUHf2Dz6xubRN64afWPz6BubR9/YPPrG5vhz35gpEfxcenq6tm7dqvHjx6tHjx7q1auXxo0bp40bNyovL6/C91itVoWFhXn9bdq0Sf379y/3jXBISIjXes3hAlWTmLkFBQV5xcOz87Rt2zalp6dr4sSJ6tq1qy666CLddNNNWrlypdcFrimqScxiYmL08MMP65JLLlFkZKTOP/98jRkzRv/73/9UUlLitW5zaGeffvqphg0bpiFDhig6OlqJiYlq0aKF1qxZU+H6y5cvV3x8vK677jpFR0drzJgx6t69u1asWCGp9Jvd5cuXa+TIkerTp4+6dOmi+++/X0ePHtXmzZsbctfqjdmYTZo0SVdddZW6du2qqKgojR8/Xi6XSzt27PBaLyAgwKs9tWrVqiF2p0GYjZkkWSyWctd8N9pZea1atfKK1fbt2xUUFKRLL73Ua73m2s4uuugijRkzptqRA26fffaZOnTooNtvv13R0dEaPny4Lr30Ui1btsxYpybtFqgp+sbm0Tc2j75x9egbm0ff2Dz6xubRNzbHn/vGJGz93N69exUaGqpzzjnHeK13796yWCzav3+/T2Uc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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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uecCAFavXq06x/O8rx4kmSQrio0bN2pub79u3bq4yfanP/0JPXv2xNtvv+1TIEVTb0ajEUBwKxXJBa2iokJ1bsuWLdGIHhMmkwnnn38+nnvuOXz22WcAgG+//VbXveeccw4qKyvR3Nysef7zzz/HK6+8gsLCQixYsMD3/QXj9NNPR3Z2Nnbs2KGpfNN6Z88991yIoqj5PaxduxaCILTrO54IQr1TkX5TsSC5IAYqcwBgzZo1qmNNTU3Yvn07MjMzMWzYMF15cByHd999F0888QSWL1+Oq6++GjabzXe+a9euOOuss7Bnzx40NDRE/AxdunTBZZddhpkzZ2Lq1Klwu91YsmSJ6rr9+/cDiM/ukgRBEKkMKZwIgiCIlObJJ58EANx33304deqU6rzNZsNPP/2kK62XX34Zx44d0zw3b9487N+/H/n5+Tj77LMBeOOojBs3Dl9//TX+85//aN63a9cuTZecSDCZTHj00UdRWVmJxx57TLVqD3gtEeQr7atWrdKc2EmyBG4nr8U999wDxhieeeYZxWS1rq4Or7zyiu+a9mLy5MkoKCjAZ599pqrTt956C0ePHsUvf/lLX6yZfv36YcKECTh8+LDPDUZi6dKlUcVvCka3bt3w3HPPwePx+OJ5RVNv+fn54DgO5eXlmvlccMEFMBgMmDt3Lux2u+94Q0MDnn322bg9Tyi2bt2q6eIkWanoebcAYMKECRBFET///LPq3M8//4zf/va3sFgs+Oabb3RZKFosFtx5551oaWnBH//4R8W5srIyzJo1C2azGb/5zW98x6X394UXXlCUp91ux/PPPw8A+N3vfqfreToqkiux1jsV6TcVivfeey9oW7t//35fjL1f/OIXqvMff/yxKlbW9OnT0dTUhNtvvx0ZGRlh85fz5ptv4oUXXsCqVatw5ZVXKpSaTz31FNxuN+655x5NxWRjY6MvthXgVTxqWRSGet9/+ukn9OjRw9dXEARBdFYohhNBEASR0lx++eV4/fXX8cILL2DIkCG46qqrMGDAALS2tuL48eNYs2YNLrnkEixdujRsWm+++SamT5+Oc889FxdccAF69uyJpqYmbNu2DRs3boTJZMJ7772nmPzMnTsXl112GX73u99h1qxZGDVqFPLy8nDixAns3LkTu3fvxsaNG2N2rfjjH/+IHTt24L333sPChQtx2WWXoXfv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xAn861//gsvlwoQJEwAAb7/9NubOnau674cffsCFF16oCgTudDrx8ccf4+DBg6ipqcGuXbvw17/+FUVFRRgxYkR7PFKHZM6cORg6dKjCPdBms6F///646aabFNdKSqZjx47hggsuQGlpKXJyctpb5LAsXrwYt99+O8466yz07t1bobiUcDqdmDp1Ks466ywMGTIE9913H2pra33nGxsbcffdd2PIkCH41a9+pUpj6tSpeO+99xL+LARBEARBEARBEATR0UhZlzoAGDNmDJqbm/Hll1/CarWipKQEU6dO9bnU1dXVqSLTnzp1Cvv378dLL72kSs9gMKC8vBxr1qyBzWZDQUEBhg8fjltvvbVTB9MeM2YMbDYbduzYgfPPPx8AsGnTJvTs2ROlpaVwOp2+nf4khVNJSQkAoLCwMFliA/DuIKhVd3a7HRdddBGuueYaPPPMM5r3Tp8+HStXrsT777+PnJwcvPjii7j33nsxf/58AMCsWbNgs9mwdOlSzJkzB8888wyWLFkCANi6dStKS0vxyiuvJO7hCIIgCIJIYcjNgyASCrlSEUTSSWmFEwBMnDgREydO1Dw3ffp01bHTTjsNX375peb1FosFL774YjzFCwtjDKLQrln6MBj1bRU5ePBg9OrVCxs3bvQpnDZu3Igrr7wS69evx7Zt2zBmzBjfcen3hg0bcPPNN2Pv3r3Izc3FF198genTp+Pdd9/FtGnTcOrUKVx00UWYOXMmevXq5btnxowZOHDgAMxmM4YOHYrZs2ejT58+AICPPvoI77//Pk6dOoW+ffvi8ccfV1hZ9e7dG6+99hpWrVqFdevW4cEHH8TTTz+teibpnoqKCs1nbm5uxueff463334bl1xyCQDgzTffxPjx47F161acf/75OHz4MK699loMGjQI//M//4NPP/0UgFfJ9fzzz+ONN96A0WgMXxEEQRAEQRAEQRAEkWakvMIp1REFYP0PrUnJe+xlXWHU+QaMGTMGGzZswCOPPALAqxh68MEHIQgCNmzYgDFjxsDhcKC0tDRkMHaHw4H33nsPs2bNgsFgwKOPPopXXnkFb7/9Nniex+9+9zvccccdmD17NjweD0pLS31KsSVLlmDatGmYPn06xo0bh++//x5PPfUUiouLFbsLzpw5E1OnTsXLL78Mkym6V3znzp3weDyKOF+DBw9G7969fQqn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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "------ Skewness ------\n", - "Original : -0.2256352997133147\n", - "Winsor 1% : -0.316203210233094\n", - "Winsor 10% : 0.019717220616182193\n", - "\n", - "------ Kurtosis ------\n", - "Original : 9.371563200617002\n", - "Winsor 1% : 4.948793292168652\n", - "Winsor 10% : -0.6408398695017969\n", - "\n", - "------ Clipped Values Count ------\n", - "Winsor 1% : 18 values changed\n", - "Winsor 10% : 190 values changed\n" - ] - } - ], - "source": [ - "import pandas as pd\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "from scipy.stats import skew, kurtosis\n", - "\n", - "# === Inputs ===\n", - "original = log_returns\n", - "clip_01 = pd.Series(winsorize(log_returns, limits=[0.01,0.01]), index=log_returns.index)\n", - "clip_001 = pd.Series(winsorize(log_returns, limits=[0.1,0.1]), index=log_returns.index)\n", - "\n", - "# === 1. Histogram Comparison ===\n", - "plt.figure(figsize=(14, 6))\n", - "\n", - "plt.subplot(1, 2, 1)\n", - "plt.hist(original, bins=100, alpha=0.6, label='Original', density=True)\n", - "plt.hist(clip_01, bins=100, alpha=0.6, label='Winsor 1%', density=True)\n", - "plt.hist(clip_001, bins=100, alpha=0.6, label='Winsor 10%', density=True)\n", - "plt.legend()\n", - "plt.title('Histogram of Log Returns (All)')\n", - "plt.xlabel('Log Return')\n", - "\n", - "plt.subplot(1, 2, 2)\n", - "plt.boxplot([original, clip_01, clip_001], vert=False, labels=['Original', '1%', '10%'])\n", - "plt.title('Boxplot Comparison')\n", - "\n", - "plt.tight_layout()\n", - "plt.show()\n", - "\n", - "# === 2. Time Series Comparison ===\n", - "plt.figure(figsize=(14, 5))\n", - "plt.plot(original.index, original, label='Original', alpha=0.4)\n", - "plt.plot(clip_01.index, clip_01, label='Winsor 1%', alpha=0.6)\n", - "plt.plot(clip_001.index, clip_001, label='Winsor 10%', alpha=0.8)\n", - "plt.legend()\n", - "plt.title('Time Series of Log Returns (Zoom into Spikes)')\n", - "plt.xlabel('Date')\n", - "plt.ylabel('Log Return')\n", - "plt.show()\n", - "\n", - "# === 3. Skewness and Kurtosis ===\n", - "print(\"------ Skewness ------\")\n", - "print(\"Original :\", skew(original))\n", - "print(\"Winsor 1% :\", skew(clip_01))\n", - "print(\"Winsor 10% :\", skew(clip_001))\n", - "\n", - "print(\"\\n------ Kurtosis ------\")\n", - "print(\"Original :\", kurtosis(original))\n", - "print(\"Winsor 1% :\", kurtosis(clip_01))\n", - "print(\"Winsor 10% :\", kurtosis(clip_001))\n", - "\n", - "# === 4. Count of Clipped Values ===\n", - "clipped_vals_01 = (original != clip_01).sum()\n", - "clipped_vals_001 = (original != clip_001).sum()\n", - "\n", - "print(\"\\n------ Clipped Values Count ------\")\n", - "print(f\"Winsor 1% : {clipped_vals_01} values changed\")\n", - "print(f\"Winsor 10% : {clipped_vals_001} values changed\")\n" - ] - }, - { - "cell_type": "code", - "execution_count": 166, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "-0.2256352997133147" - ] - }, - "execution_count": 166, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "skew(original)" - ] - }, - { - "cell_type": "code", - "execution_count": 169, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2.55775107915951" - ] - }, - "execution_count": 169, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "skew(equity2.Total.pct_change().dropna())" - ] - }, - { - "cell_type": "code", - "execution_count": 163, - "metadata": {}, - "outputs": [ - { - "ename": "TypeError", - "evalue": "Cannot compare dtypes datetime64[ns] and int64", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[163], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mlog_returns\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mreindex\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mrange\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mlen\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mlog_returns\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mffill\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/pandas/core/series.py:5153\u001b[0m, in \u001b[0;36mSeries.reindex\u001b[0;34m(self, index, axis, method, copy, level, fill_value, limit, tolerance)\u001b[0m\n\u001b[1;32m 5136\u001b[0m \u001b[38;5;129m@doc\u001b[39m(\n\u001b[1;32m 5137\u001b[0m NDFrame\u001b[38;5;241m.\u001b[39mreindex, \u001b[38;5;66;03m# type: ignore[has-type]\u001b[39;00m\n\u001b[1;32m 5138\u001b[0m klass\u001b[38;5;241m=\u001b[39m_shared_doc_kwargs[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mklass\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 5151\u001b[0m tolerance\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[1;32m 5152\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Series:\n\u001b[0;32m-> 5153\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mreindex\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 5154\u001b[0m \u001b[43m \u001b[49m\u001b[43mindex\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mindex\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 5155\u001b[0m \u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 5156\u001b[0m \u001b[43m \u001b[49m\u001b[43mcopy\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcopy\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 5157\u001b[0m \u001b[43m \u001b[49m\u001b[43mlevel\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlevel\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 5158\u001b[0m \u001b[43m \u001b[49m\u001b[43mfill_value\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfill_value\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 5159\u001b[0m \u001b[43m \u001b[49m\u001b[43mlimit\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlimit\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 5160\u001b[0m \u001b[43m \u001b[49m\u001b[43mtolerance\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtolerance\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 5161\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/pandas/core/generic.py:5610\u001b[0m, in \u001b[0;36mNDFrame.reindex\u001b[0;34m(self, labels, index, columns, axis, method, copy, level, fill_value, limit, tolerance)\u001b[0m\n\u001b[1;32m 5607\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_reindex_multi(axes, copy, fill_value)\n\u001b[1;32m 5609\u001b[0m \u001b[38;5;66;03m# perform the reindex on the axes\u001b[39;00m\n\u001b[0;32m-> 5610\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_reindex_axes\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 5611\u001b[0m \u001b[43m \u001b[49m\u001b[43maxes\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mlevel\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mlimit\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtolerance\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfill_value\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcopy\u001b[49m\n\u001b[1;32m 5612\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241m.\u001b[39m__finalize__(\u001b[38;5;28mself\u001b[39m, method\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mreindex\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", - "File \u001b[0;32m~/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/pandas/core/generic.py:5633\u001b[0m, in \u001b[0;36mNDFrame._reindex_axes\u001b[0;34m(self, axes, level, limit, tolerance, method, fill_value, copy)\u001b[0m\n\u001b[1;32m 5630\u001b[0m \u001b[38;5;28;01mcontinue\u001b[39;00m\n\u001b[1;32m 5632\u001b[0m ax \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_get_axis(a)\n\u001b[0;32m-> 5633\u001b[0m new_index, indexer \u001b[38;5;241m=\u001b[39m \u001b[43max\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mreindex\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 5634\u001b[0m \u001b[43m \u001b[49m\u001b[43mlabels\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mlevel\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlevel\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mlimit\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlimit\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtolerance\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtolerance\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmethod\u001b[49m\n\u001b[1;32m 5635\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 5637\u001b[0m axis \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_get_axis_number(a)\n\u001b[1;32m 5638\u001b[0m obj \u001b[38;5;241m=\u001b[39m obj\u001b[38;5;241m.\u001b[39m_reindex_with_indexers(\n\u001b[1;32m 5639\u001b[0m {axis: [new_index, indexer]},\n\u001b[1;32m 5640\u001b[0m fill_value\u001b[38;5;241m=\u001b[39mfill_value,\n\u001b[1;32m 5641\u001b[0m copy\u001b[38;5;241m=\u001b[39mcopy,\n\u001b[1;32m 5642\u001b[0m allow_dups\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m,\n\u001b[1;32m 5643\u001b[0m )\n", - "File \u001b[0;32m~/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/pandas/core/indexes/base.py:4422\u001b[0m, in \u001b[0;36mIndex.reindex\u001b[0;34m(self, target, method, level, limit, tolerance)\u001b[0m\n\u001b[1;32m 4420\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 4421\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_index_as_unique:\n\u001b[0;32m-> 4422\u001b[0m indexer \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_indexer\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 4423\u001b[0m \u001b[43m \u001b[49m\u001b[43mtarget\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mlimit\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlimit\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtolerance\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtolerance\u001b[49m\n\u001b[1;32m 4424\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 4425\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_is_multi:\n\u001b[1;32m 4426\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcannot handle a non-unique multi-index!\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", - "File \u001b[0;32m~/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/pandas/core/indexes/base.py:3893\u001b[0m, in \u001b[0;36mIndex.get_indexer\u001b[0;34m(self, target, method, limit, tolerance)\u001b[0m\n\u001b[1;32m 3888\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m np\u001b[38;5;241m.\u001b[39marray([], dtype\u001b[38;5;241m=\u001b[39mnp\u001b[38;5;241m.\u001b[39mintp)\n\u001b[1;32m 3890\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_should_compare(target) \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_should_partial_index(target):\n\u001b[1;32m 3891\u001b[0m \u001b[38;5;66;03m# IntervalIndex get special treatment bc numeric scalars can be\u001b[39;00m\n\u001b[1;32m 3892\u001b[0m \u001b[38;5;66;03m# matched to Interval scalars\u001b[39;00m\n\u001b[0;32m-> 3893\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_get_indexer_non_comparable\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtarget\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43munique\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[1;32m 3895\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdtype, CategoricalDtype):\n\u001b[1;32m 3896\u001b[0m \u001b[38;5;66;03m# _maybe_cast_listlike_indexer ensures target has our dtype\u001b[39;00m\n\u001b[1;32m 3897\u001b[0m \u001b[38;5;66;03m# (could improve perf by doing _should_compare check earlier?)\u001b[39;00m\n\u001b[1;32m 3898\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdtype \u001b[38;5;241m==\u001b[39m target\u001b[38;5;241m.\u001b[39mdtype\n", - "File \u001b[0;32m~/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/pandas/core/indexes/base.py:6301\u001b[0m, in \u001b[0;36mIndex._get_indexer_non_comparable\u001b[0;34m(self, target, method, unique)\u001b[0m\n\u001b[1;32m 6299\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m method \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 6300\u001b[0m other_dtype \u001b[38;5;241m=\u001b[39m _unpack_nested_dtype(target)\n\u001b[0;32m-> 6301\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mCannot compare dtypes \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdtype\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m and \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mother_dtype\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 6303\u001b[0m no_matches \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m \u001b[38;5;241m*\u001b[39m np\u001b[38;5;241m.\u001b[39mones(target\u001b[38;5;241m.\u001b[39mshape, dtype\u001b[38;5;241m=\u001b[39mnp\u001b[38;5;241m.\u001b[39mintp)\n\u001b[1;32m 6304\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m unique:\n\u001b[1;32m 6305\u001b[0m \u001b[38;5;66;03m# This is for get_indexer\u001b[39;00m\n", - "\u001b[0;31mTypeError\u001b[0m: Cannot compare dtypes datetime64[ns] and int64" - ] - } - ], - "source": [ - "log_returns.reindex(range(0, len(log_returns)), method='ffill')" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "openbb_new_use", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.13" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/EventDriven/demos/opt_wfa/helper.py b/EventDriven/demos/opt_wfa/helper.py deleted file mode 100644 index 5fb4e9e..0000000 --- a/EventDriven/demos/opt_wfa/helper.py +++ /dev/null @@ -1,61 +0,0 @@ -#Load Backtest class -from EventDriven.backtest import OptionSignalBacktest -from EventDriven.riskmanager.sizer import DefaultSizer, ZscoreRVolSizer, BaseSizer -import pandas as pd -pd.options.display.max_rows = 50 -pd.options.display.max_columns = 50 - -def create_backtest_object(cash, weights, trades_, max_cash): - evb_backtest = OptionSignalBacktest(trades_, initial_capital=cash, t_plus_n=1, symbol_list = list(weights.keys()) ) - evb_backtest.portfolio.initial_capital - w_map = {x: w * 0.95 for x, w in weights.items()} - evb_backtest.portfolio.weight_map = w_map - evb_backtest.portfolio.weight_map - evb_backtest.portfolio.risk_manager.OrderPicker.liquidity_threshold = 50 - evb_backtest.portfolio.risk_manager.OrderPicker.lookback = 10 - evb_backtest.portfolio.risk_manager.sizing_lev = 4.5 - evb_backtest.portfolio.max_contract_price_factor = 2 - evb_backtest.portfolio.min_moneyness_threshold = 3 - evb_backtest.portfolio.risk_manager.OrderPicker.data_availability_threshold = 0.5 - order_settings = { - 'type': 'spread', - 'specifics': [ - {'direction': 'long', 'rel_strike': 1.0, 'dte': 365, 'moneyness_width': 0.1}, - {'direction': 'short', 'rel_strike': 0.85, 'dte': 365, 'moneyness_width': 0.1} - ], - 'name': 'vertical_spread', - 'strategy': 'vertical', - 'target_dte': 360, - 'structure_direction': 'long', - 'spread_ticks': 1, - 'dte_tolerance': 60, - 'min_moneyness': 0.65, - 'max_moneyness': 1., - 'min_total_price': 0.95 - } - evb_backtest.portfolio.order_settings = order_settings - evb_backtest.portfolio.risk_manager.max_dte_tolerance = order_settings['target_dte'] - 240 - evb_backtest.portfolio.risk_manager.max_tries = 15 - evb_backtest.portfolio.max_contract_price = max_cash - evb_backtest.executor.commission_rate = 0.65/100 - evb_backtest.portfolio.min_moneyness_threshold = 5 - evb_backtest.executor.max_slippage_pct = 0.075 - evb_backtest.portfolio.roll_map = 180 - evb_backtest.portfolio.moneyness_width_factor = .025 - evb_backtest.portfolio.dte_reduction_factor = 30 - evb_backtest.portfolio.min_acceptable_dte_threshold = 95 - evb_backtest.portfolio.risk_manager.limits['dte'] = True - evb_backtest.portfolio.risk_manager.limits['delta'] = True - evb_backtest.portfolio.risk_manager.limits['moneyness'] = True - evb_backtest.portfolio.risk_manager.max_moneyness = 1.15 - evb_backtest.portfolio.risk_manager.max_slippage = 0.075 - evb_backtest.portfolio.risk_manager.otm_moneyness_width = 0.45 - evb_backtest.portfolio.risk_manager.itm_moneyness_width = 0.10 - evb_backtest.portfolio.risk_manager.re_update_on_roll = False - evb_backtest.portfolio.risk_manager.t_plus_n = 1 - for key in max_cash: - if max_cash[key]*100 > evb_backtest.portfolio.allocated_cash_map[key]: - # print(key, max_cash[key]*100, evb_backtest.portfolio.allocated_cash_map[key]) - pass - - return evb_backtest diff --git a/EventDriven/demos/opt_wfa/optionsWFA_Test.ipynb b/EventDriven/demos/opt_wfa/optionsWFA_Test.ipynb deleted file mode 100644 index 4e38611..0000000 --- a/EventDriven/demos/opt_wfa/optionsWFA_Test.ipynb +++ /dev/null @@ -1,971 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Console Logging & File Logging Can be configured using STREAM_LOG_LEVEL and FILE_LOG_LEVEL in environment variables.\n", - "Propagate to root logger can be set using PROPAGATE_TO_ROOT_LOGGER in environment variables.\n", - "Example:\n", - "STREAM_LOG_LEVEL = 'DEBUG'\n", - "FILE_LOG_LEVEL = 'INFO'\n", - "PROPAGATE_TO_ROOT_LOGGER = 'False'\n", - "\n", - "2025-07-02 21:55:38 trade.helpers.Logging INFO: Logging Root Directory: /Users/chiemelienwanisobi/cloned_repos/QuantTools/logs\n", - "Using Proxy URL: http://54.144.4.219:5500/thetadata\n", - "\n", - "\n", - "Scheduled Data Requests will be saved to: /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/scheduler/requests.jsonl\n" - ] - } - ], - "source": [ - "%load_ext autoreload\n", - "%autoreload 2\n", - "from EventDriven.backtest import OptionSignalBacktest\n", - "from EventDriven.riskmanager.sizer import DefaultSizer\n", - "import pandas as pd\n", - "import numpy as np\n", - "from IPython.display import clear_output\n", - "from dbase.DataAPI.ThetaData import refresh_proxy_url, get_proxy_url\n", - "from copy import deepcopy\n", - "from helper import create_backtest_object" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "os.environ['PROXY_URL'] = ''\n", - "from dbase.DataAPI.ThetaData import refresh_proxy_url, get_proxy_url\n", - "get_proxy_url()" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "create_backtest_object" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "from EventDriven.riskmanager.sizer import ZscoreRVolSizer" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "import json\n", - "keys = [4, 5, 6, 7, 8, 9, 10, 11, 12 ]\n", - "# keys = [12]\n", - "imports_trades = {key: {'trades': pd.read_csv(f'/Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/input/profitable_trades_{key}.csv').iloc[:, 1:]} for key in keys}\n", - "\n", - "for key in keys:\n", - " with open(f'/Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/input/profitable_weights_{key}.json', 'r') as f:\n", - " weights = json.load(f)\n", - " symbol_list = imports_trades[key]['trades'].Ticker.unique()\n", - " untraded_symbols = [s for s in weights.keys() if s not in imports_trades[key]['trades'].Ticker.unique()]\n", - " imports_trades[key]['weights'] = weights" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Starting backtest for key: 12, with initial capital: 20000\n", - "Previous Backtest Starting Capital: 20000, Ending capital from Previous Backtest: 20000, Return: 0.0% \n", - "\n", - "Current Capital Tracking: {}\n", - "{'NVDA': 0.3717903440438027, 'TSLA': 0.13285856444949615, 'META': 0.11763798538677593, 'NFLX': 0.08637009747959587, 'AMD': 0.0472536240089943, 'AAPL': 0.0676151517402857, 'COST': 0.0720078264760282, 'AMZN': 0.04879875274933317, 'BA': 0.02991981454758278, 'SBUX': 0.025747839118105225}\n", - "NVDA 0.3717903440438027 7435.806880876054\n", - "TSLA 0.13285856444949615 2657.171288989923\n", - "META 0.11763798538677593 2352.7597077355185\n", - "NFLX 0.08637009747959587 1727.4019495919174\n", - "AMD 0.0472536240089943 945.072480179886\n", - "AAPL 0.0676151517402857 1352.303034805714\n", - "COST 0.0720078264760282 1440.156529520564\n", - "AMZN 0.04879875274933317 975.9750549866635\n", - "BA 0.02991981454758278 598.3962909516556\n", - "SBUX 0.025747839118105225 514.9567823621045\n", - "{'NVDA': 4, 'TSLA': 4, 'META': 4, 'NFLX': 4, 'AMD': 4, 'AAPL': 4, 'COST': 4, 'AMZN': 4, 'BA': 4, 'SBUX': 4}\n", - "\n", - "Risk Manager Settings:\n", - "Start Date: 2025-01-03 00:00:00\n", - "End Date: 2025-03-03 00:00:00\n", - "Current Limits State (Position Adjusted when these thresholds are reached):\n", - " Delta: True\n", - " Gamma: False\n", - " Vega: False\n", - " Theta: False\n", - " Roll On DTE: True\n", - " Min DTE Threshold: 95\n", - " Roll On Moneyness: True\n", - " Max Moneyness: 1.15\n", - "Quanitity Sizing Type: delta\n", - " \n", - "No positions need to be adjusted on 2025-01-03 00:00:00\n", - "Risk Manager Actions: NO_POSITIONS_TO_ADJUST\n", - "Event queue is empty, processed 0 event(s)\n", - "Processing event: MARKET 2025-01-06 00:00:00\n", - "Processing event: SIGNAL 2025-01-06 00:00:00\n", - "\n", - "Order Received: {'result': 'SUCCESSFUL', 'data': {'trade_id': '&L:TSLA20251121C450&S:TSLA20251121C455', 'close': 1.2750000000000057, 'long': ['TSLA20251121C450'], 'short': ['TSLA20251121C455']}}\n", - "\n", - "===========================\n", - "Buy Details\n", - "Position: {'trade_id': '&L:TSLA20251121C450&S:TSLA20251121C455', 'close': 1.2750000000000057, 'long': ['TSLA20251121C450'], 'short': ['TSLA20251121C455'], 'quantity': 19, 'cash_equivalent_qty': 19.0}, Date: 2025-01-06, Signal: SignalEvent type:LONG, symbol=TSLA, date:2025-01-06 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:TSLA20250106LONG, parent_event:None\n", - "Max Contract Price: 4, Cash at Hand: 25.243127245404267\n", - "Cash at Hand 25.243127245404267 Close 1.2750000000000057\n", - "===========================\n", - "Processing event: SIGNAL 2025-01-06 00:00:00\n", - "\n", - "Order Received: {'result': 'SUCCESSFUL', 'data': {'trade_id': '&L:AAPL20250919C290&S:AAPL20250919C295', 'close': 0.9500000000000002, 'long': ['AAPL20250919C290'], 'short': ['AAPL20250919C295']}}\n", - "\n", - "===========================\n", - "Buy Details\n", - "Position: {'trade_id': '&L:AAPL20250919C290&S:AAPL20250919C295', 'close': 0.9500000000000002, 'long': ['AAPL20250919C290'], 'short': ['AAPL20250919C295'], 'quantity': 13, 'cash_equivalent_qty': 13.0}, Date: 2025-01-06, Signal: SignalEvent type:LONG, symbol=AAPL, date:2025-01-06 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:AAPL20250106LONG, parent_event:None\n", - "Max Contract Price: 4, Cash at Hand: 12.846878830654283\n", - "Cash at Hand 12.846878830654283 Close 0.9500000000000002\n", - "===========================\n", - "Processing event: SIGNAL 2025-01-06 00:00:00\n", - "\n", - "Order Received: {'result': 'SUCCESSFUL', 'data': {'trade_id': '&L:AMZN20250919C280&S:AMZN20250919C285', 'close': 0.9749999999999996, 'long': ['AMZN20250919C280'], 'short': ['AMZN20250919C285']}}\n", - "\n", - "===========================\n", - "Buy Details\n", - "Position: {'trade_id': '&L:AMZN20250919C280&S:AMZN20250919C285', 'close': 0.9749999999999996, 'long': ['AMZN20250919C280'], 'short': ['AMZN20250919C285'], 'quantity': 9, 'cash_equivalent_qty': 9.0}, Date: 2025-01-06, Signal: SignalEvent type:LONG, symbol=AMZN, date:2025-01-06 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:AMZN20250106LONG, parent_event:None\n", - "Max Contract Price: 4, Cash at Hand: 9.271763022373301\n", - "Cash at Hand 9.271763022373301 Close 0.9749999999999996\n", - "===========================\n", - "Processing event: SIGNAL 2025-01-06 00:00:00\n", - "\n", - "Order Received: {'result': 'SUCCESSFUL', 'data': {'trade_id': '&L:BA20250815C215&S:BA20250815C220', 'close': 0.9500000000000002, 'long': ['BA20250815C215'], 'short': ['BA20250815C220']}}\n", - "\n", - "===========================\n", - "Buy Details\n", - "Position: {'trade_id': '&L:BA20250815C215&S:BA20250815C220', 'close': 0.9500000000000002, 'long': ['BA20250815C215'], 'short': ['BA20250815C220'], 'quantity': 5, 'cash_equivalent_qty': 5.0}, Date: 2025-01-06, Signal: SignalEvent type:LONG, symbol=BA, date:2025-01-06 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:BA20250106LONG, parent_event:None\n", - "Max Contract Price: 4, Cash at Hand: 5.684764764040729\n", - "Cash at Hand 5.684764764040729 Close 0.9500000000000002\n", - "===========================\n", - "Processing event: SIGNAL 2025-01-06 00:00:00\n", - "\n", - "Order Received: {'result': 'SUCCESSFUL', 'data': {'trade_id': '&L:NFLX20250815C940&S:NFLX20250815C945', 'close': 0.9749999999999943, 'long': ['NFLX20250815C940'], 'short': ['NFLX20250815C945']}}\n", - "\n", - "===========================\n", - "Buy Details\n", - "Position: {'trade_id': '&L:NFLX20250815C940&S:NFLX20250815C945', 'close': 1.6339909593245343, 'long': ['NFLX20250815C940'], 'short': ['NFLX20250815C945'], 'quantity': 10, 'cash_equivalent_qty': 10.0}, Date: 2025-01-06, Signal: SignalEvent type:LONG, symbol=NFLX, date:2025-01-06 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:NFLX20250106LONG, parent_event:None\n", - "Max Contract Price: 4, Cash at Hand: 16.410318521123216\n", - "Cash at Hand 16.410318521123216 Close 1.6339909593245343\n", - "===========================\n", - "Processing event: ORDER 2025-01-06 00:00:00\n", - "Processing event: ORDER 2025-01-06 00:00:00\n", - "Processing event: ORDER 2025-01-06 00:00:00\n", - "Processing event: ORDER 2025-01-06 00:00:00\n", - "Processing event: ORDER 2025-01-06 00:00:00\n", - "Processing event: FILL 2025-01-06 00:00:00\n", - "Processing event: FILL 2025-01-06 00:00:00\n", - "Processing event: FILL 2025-01-06 00:00:00\n", - "Processing event: FILL 2025-01-06 00:00:00\n", - "Processing event: FILL 2025-01-06 00:00:00\n", - "Risk Manager Actions: {}\n", - "Event queue is empty, processed 16 event(s)\n", - "Processing event: MARKET 2025-01-07 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-01-08 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-01-09 00:00:00\n", - "Risk Manager Actions: IS_HOLIDAY\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-01-10 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-01-13 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': ADJUST(&L:BA20250815C215&S:BA20250815C220, Quantity Change: -1), Reason: greek_limit)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-01-14 00:00:00\n", - "Processing event: SIGNAL 2025-01-14 00:00:00\n", - "\n", - "Order Received: {'result': 'SUCCESSFUL', 'data': {'trade_id': '&L:COST20250815C1180&S:COST20250815C1200', 'close': 1.0749999999999993, 'long': ['COST20250815C1180'], 'short': ['COST20250815C1200']}}\n", - "\n", - "===========================\n", - "Buy Details\n", - "Position: {'trade_id': '&L:COST20250815C1180&S:COST20250815C1200', 'close': 1.0749999999999993, 'long': ['COST20250815C1180'], 'short': ['COST20250815C1200'], 'quantity': 6, 'cash_equivalent_qty': 12.0}, Date: 2025-01-14, Signal: SignalEvent type:LONG, symbol=COST, date:2025-01-14 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:COST20250114LONG, parent_event:None\n", - "Max Contract Price: 4, Cash at Hand: 13.681487030445357\n", - "Cash at Hand 13.681487030445357 Close 1.0749999999999993\n", - "===========================\n", - "Processing event: ORDER 2025-01-14 00:00:00\n", - "Processing event: ORDER 2025-01-14 00:00:00\n", - "Processing event: FILL 2025-01-14 00:00:00\n", - "Processing event: FILL 2025-01-14 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None)}\n", - "Event queue is empty, processed 6 event(s)\n", - "Processing event: MARKET 2025-01-15 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-01-16 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-01-17 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': ADJUST(&L:COST20250815C1180&S:COST20250815C1200, Quantity Change: -1), Reason: greek_limit), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-01-20 00:00:00\n", - "Processing event: ORDER 2025-01-20 00:00:00\n", - "Processing event: FILL 2025-01-20 00:00:00\n", - "Risk Manager Actions: IS_HOLIDAY\n", - "Event queue is empty, processed 3 event(s)\n", - "Processing event: MARKET 2025-01-21 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-01-22 00:00:00\n", - "Processing event: SIGNAL 2025-01-22 00:00:00\n", - "\n", - "Order Received: {'result': 'SUCCESSFUL', 'data': {'trade_id': '&L:META20250919C750&S:META20250919C755', 'close': 0.9749999999999943, 'long': ['META20250919C750'], 'short': ['META20250919C755']}}\n", - "\n", - "===========================\n", - "Buy Details\n", - "Position: {'trade_id': '&L:META20250919C750&S:META20250919C755', 'close': 0.9749999999999943, 'long': ['META20250919C750'], 'short': ['META20250919C755'], 'quantity': 22, 'cash_equivalent_qty': 22.0}, Date: 2025-01-22, Signal: SignalEvent type:LONG, symbol=META, date:2025-01-22 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:META20250122LONG, parent_event:None\n", - "Max Contract Price: 4, Cash at Hand: 22.351217223487428\n", - "Cash at Hand 22.351217223487428 Close 0.9749999999999943\n", - "===========================\n", - "Processing event: ORDER 2025-01-22 00:00:00\n", - "Processing event: FILL 2025-01-22 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None)}\n", - "Event queue is empty, processed 4 event(s)\n", - "Processing event: MARKET 2025-01-23 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20250919C750&S:META20250919C755': HOLD(&L:META20250919C750&S:META20250919C755) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-01-24 00:00:00\n", - "Processing event: SIGNAL 2025-01-24 00:00:00\n", - "\n", - "Order Received: {'result': 'SUCCESSFUL', 'data': {'trade_id': '&L:SBUX20250919C115&S:SBUX20250919C120', 'close': 1.1750000000000003, 'long': ['SBUX20250919C115'], 'short': ['SBUX20250919C120']}}\n", - "\n", - "===========================\n", - "Buy Details\n", - "Position: {'trade_id': '&L:SBUX20250919C115&S:SBUX20250919C120', 'close': 1.0404844705455856, 'long': ['SBUX20250919C115'], 'short': ['SBUX20250919C120'], 'quantity': 3, 'cash_equivalent_qty': 4.0}, Date: 2025-01-24, Signal: SignalEvent type:LONG, symbol=SBUX, date:2025-01-24 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:SBUX20250124LONG, parent_event:None\n", - "Max Contract Price: 4, Cash at Hand: 4.892089432439992\n", - "Cash at Hand 4.892089432439992 Close 1.0404844705455856\n", - "===========================\n", - "Processing event: ORDER 2025-01-24 00:00:00\n", - "Processing event: FILL 2025-01-24 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20250919C750&S:META20250919C755': HOLD(&L:META20250919C750&S:META20250919C755) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None)}\n", - "Event queue is empty, processed 4 event(s)\n", - "Processing event: MARKET 2025-01-27 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20250919C750&S:META20250919C755': HOLD(&L:META20250919C750&S:META20250919C755) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None), '&L:SBUX20250919C115&S:SBUX20250919C120': HOLD(&L:SBUX20250919C115&S:SBUX20250919C120) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-01-28 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20250919C750&S:META20250919C755': HOLD(&L:META20250919C750&S:META20250919C755) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': ADJUST(&L:COST20250815C1180&S:COST20250815C1200, Quantity Change: -1), Reason: greek_limit), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None), '&L:SBUX20250919C115&S:SBUX20250919C120': HOLD(&L:SBUX20250919C115&S:SBUX20250919C120) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-01-29 00:00:00\n", - "Processing event: ORDER 2025-01-29 00:00:00\n", - "Processing event: FILL 2025-01-29 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20250919C750&S:META20250919C755': HOLD(&L:META20250919C750&S:META20250919C755) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': ADJUST(&L:AMZN20250919C280&S:AMZN20250919C285, Quantity Change: -1), Reason: greek_limit), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None), '&L:SBUX20250919C115&S:SBUX20250919C120': HOLD(&L:SBUX20250919C115&S:SBUX20250919C120) Reason: None)}\n", - "Event queue is empty, processed 3 event(s)\n", - "Processing event: MARKET 2025-01-30 00:00:00\n", - "Processing event: ORDER 2025-01-30 00:00:00\n", - "Processing event: FILL 2025-01-30 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20250919C750&S:META20250919C755': HOLD(&L:META20250919C750&S:META20250919C755) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None), '&L:SBUX20250919C115&S:SBUX20250919C120': HOLD(&L:SBUX20250919C115&S:SBUX20250919C120) Reason: None)}\n", - "Event queue is empty, processed 3 event(s)\n", - "Processing event: MARKET 2025-01-31 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20250919C750&S:META20250919C755': HOLD(&L:META20250919C750&S:META20250919C755) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None), '&L:SBUX20250919C115&S:SBUX20250919C120': HOLD(&L:SBUX20250919C115&S:SBUX20250919C120) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-03 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20250919C750&S:META20250919C755': HOLD(&L:META20250919C750&S:META20250919C755) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None), '&L:SBUX20250919C115&S:SBUX20250919C120': HOLD(&L:SBUX20250919C115&S:SBUX20250919C120) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-04 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20250919C750&S:META20250919C755': HOLD(&L:META20250919C750&S:META20250919C755) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None), '&L:SBUX20250919C115&S:SBUX20250919C120': HOLD(&L:SBUX20250919C115&S:SBUX20250919C120) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-05 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20250919C750&S:META20250919C755': ADJUST(&L:META20250919C750&S:META20250919C755, Quantity Change: -2), Reason: greek_limit), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None), '&L:SBUX20250919C115&S:SBUX20250919C120': HOLD(&L:SBUX20250919C115&S:SBUX20250919C120) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-06 00:00:00\n", - "Processing event: ORDER 2025-02-06 00:00:00\n", - "Processing event: FILL 2025-02-06 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20250919C750&S:META20250919C755': ADJUST(&L:META20250919C750&S:META20250919C755, Quantity Change: -1), Reason: greek_limit), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None), '&L:SBUX20250919C115&S:SBUX20250919C120': HOLD(&L:SBUX20250919C115&S:SBUX20250919C120) Reason: None)}\n", - "Event queue is empty, processed 3 event(s)\n", - "Processing event: MARKET 2025-02-07 00:00:00\n", - "Processing event: ORDER 2025-02-07 00:00:00\n", - "Processing event: FILL 2025-02-07 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20250919C750&S:META20250919C755': ADJUST(&L:META20250919C750&S:META20250919C755, Quantity Change: -1), Reason: greek_limit), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None), '&L:SBUX20250919C115&S:SBUX20250919C120': HOLD(&L:SBUX20250919C115&S:SBUX20250919C120) Reason: None)}\n", - "Event queue is empty, processed 3 event(s)\n", - "Processing event: MARKET 2025-02-10 00:00:00\n", - "Processing event: ORDER 2025-02-10 00:00:00\n", - "Processing event: FILL 2025-02-10 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20250919C750&S:META20250919C755': HOLD(&L:META20250919C750&S:META20250919C755) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': ADJUST(&L:BA20250815C215&S:BA20250815C220, Quantity Change: -1), Reason: greek_limit), '&L:SBUX20250919C115&S:SBUX20250919C120': HOLD(&L:SBUX20250919C115&S:SBUX20250919C120) Reason: None)}\n", - "Event queue is empty, processed 3 event(s)\n", - "Processing event: MARKET 2025-02-11 00:00:00\n", - "Processing event: ORDER 2025-02-11 00:00:00\n", - "Processing event: FILL 2025-02-11 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20250919C750&S:META20250919C755': HOLD(&L:META20250919C750&S:META20250919C755) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None), '&L:SBUX20250919C115&S:SBUX20250919C120': HOLD(&L:SBUX20250919C115&S:SBUX20250919C120) Reason: None)}\n", - "Event queue is empty, processed 3 event(s)\n", - "Processing event: MARKET 2025-02-12 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20250919C750&S:META20250919C755': HOLD(&L:META20250919C750&S:META20250919C755) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': ADJUST(&L:COST20250815C1180&S:COST20250815C1200, Quantity Change: -2), Reason: greek_limit), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None), '&L:SBUX20250919C115&S:SBUX20250919C120': HOLD(&L:SBUX20250919C115&S:SBUX20250919C120) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-13 00:00:00\n", - "Processing event: ORDER 2025-02-13 00:00:00\n", - "Processing event: FILL 2025-02-13 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20250919C750&S:META20250919C755': HOLD(&L:META20250919C750&S:META20250919C755) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None), '&L:SBUX20250919C115&S:SBUX20250919C120': HOLD(&L:SBUX20250919C115&S:SBUX20250919C120) Reason: None)}\n", - "Event queue is empty, processed 3 event(s)\n", - "Processing event: MARKET 2025-02-14 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20250919C750&S:META20250919C755': HOLD(&L:META20250919C750&S:META20250919C755) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None), '&L:SBUX20250919C115&S:SBUX20250919C120': HOLD(&L:SBUX20250919C115&S:SBUX20250919C120) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-17 00:00:00\n", - "Risk Manager Actions: IS_HOLIDAY\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-18 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20250919C750&S:META20250919C755': HOLD(&L:META20250919C750&S:META20250919C755) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None), '&L:SBUX20250919C115&S:SBUX20250919C120': HOLD(&L:SBUX20250919C115&S:SBUX20250919C120) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-19 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20250919C750&S:META20250919C755': HOLD(&L:META20250919C750&S:META20250919C755) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None), '&L:SBUX20250919C115&S:SBUX20250919C120': HOLD(&L:SBUX20250919C115&S:SBUX20250919C120) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-20 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20250919C750&S:META20250919C755': HOLD(&L:META20250919C750&S:META20250919C755) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None), '&L:SBUX20250919C115&S:SBUX20250919C120': HOLD(&L:SBUX20250919C115&S:SBUX20250919C120) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-21 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20250919C750&S:META20250919C755': HOLD(&L:META20250919C750&S:META20250919C755) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None), '&L:SBUX20250919C115&S:SBUX20250919C120': HOLD(&L:SBUX20250919C115&S:SBUX20250919C120) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-24 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20250919C750&S:META20250919C755': HOLD(&L:META20250919C750&S:META20250919C755) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None), '&L:SBUX20250919C115&S:SBUX20250919C120': HOLD(&L:SBUX20250919C115&S:SBUX20250919C120) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-25 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20250919C750&S:META20250919C755': HOLD(&L:META20250919C750&S:META20250919C755) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None), '&L:SBUX20250919C115&S:SBUX20250919C120': HOLD(&L:SBUX20250919C115&S:SBUX20250919C120) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-26 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20250919C750&S:META20250919C755': HOLD(&L:META20250919C750&S:META20250919C755) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None), '&L:SBUX20250919C115&S:SBUX20250919C120': HOLD(&L:SBUX20250919C115&S:SBUX20250919C120) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-27 00:00:00\n", - "Risk Manager Actions: {'&L:META20250919C750&S:META20250919C755': HOLD(&L:META20250919C750&S:META20250919C755) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None), '&L:SBUX20250919C115&S:SBUX20250919C120': HOLD(&L:SBUX20250919C115&S:SBUX20250919C120) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-28 00:00:00\n", - "Processing event: SIGNAL 2025-02-28 00:00:00\n", - "Not generating order because: CLOSE price is negative SignalEvent type:CLOSE, symbol=TSLA, date:2025-02-28 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:TSLA20250106LONG, parent_event:None, moving event to 2025-03-03 00:00:00\n", - "Risk Manager Actions: {}\n", - "Event queue is empty, processed 2 event(s)\n", - "Processing event: MARKET 2025-03-03 00:00:00\n", - "Processing event: SIGNAL 2025-03-03 00:00:00\n", - "Processing event: SIGNAL 2025-03-03 00:00:00\n", - "Processing event: SIGNAL 2025-03-03 00:00:00\n", - "Processing event: SIGNAL 2025-03-03 00:00:00\n", - "Processing event: SIGNAL 2025-03-03 00:00:00\n", - "Processing event: SIGNAL 2025-03-03 00:00:00\n", - "Processing event: SIGNAL 2025-03-03 00:00:00\n", - "Processing event: SIGNAL 2025-03-03 00:00:00\n", - "Not generating order because: CLOSE price is negative SignalEvent type:CLOSE, symbol=TSLA, date:2025-03-03 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:TSLA20250106LONG, parent_event:None, moving event to 2025-03-04 00:00:00\n", - "Event date 20250304 not found in backtest range.\n", - "2025-07-02 22:14:34 OptionSignalEventScheduler ERROR: Event date 20250304 not found in backtest range\n", - "Processing event: ORDER 2025-03-03 00:00:00\n", - "Processing event: ORDER 2025-03-03 00:00:00\n", - "Processing event: ORDER 2025-03-03 00:00:00\n", - "Processing event: ORDER 2025-03-03 00:00:00\n", - "Processing event: ORDER 2025-03-03 00:00:00\n", - "Processing event: ORDER 2025-03-03 00:00:00\n", - "Processing event: ORDER 2025-03-03 00:00:00\n", - "Processing event: FILL 2025-03-03 00:00:00\n", - "Processing event: FILL 2025-03-03 00:00:00\n", - "Processing event: FILL 2025-03-03 00:00:00\n", - "Processing event: FILL 2025-03-03 00:00:00\n", - "Processing event: FILL 2025-03-03 00:00:00\n", - "Processing event: FILL 2025-03-03 00:00:00\n", - "Processing event: FILL 2025-03-03 00:00:00\n", - "Risk Manager Actions: {}\n", - "Event queue is empty, processed 23 event(s)\n", - "No more dates left.\n" - ] - } - ], - "source": [ - "#Backtest class \n", - "## Find a way to not always reinitialize the backtest class, when want to redo\n", - "filename = 'zscore2_dte180_roll120_smooth'\n", - "ending_capital = 20_000\n", - "initial_capital = ending_capital\n", - "capital_tracking = {}\n", - "objects = {}\n", - "for key in keys:\n", - " print(f\"Starting backtest for key: {key}, with initial capital: {ending_capital}\")\n", - " print(f\"Previous Backtest Starting Capital: {initial_capital}, Ending capital from Previous Backtest: {ending_capital}, Return: {((ending_capital - initial_capital) / initial_capital) * 100}% \\n\")\n", - " initial_capital = ending_capital\n", - " print(f\"Current Capital Tracking: {capital_tracking}\")\n", - "\n", - " ## Set the trades and weights\n", - " trades_ = imports_trades[key]['trades']\n", - " weights = imports_trades[key]['weights']\n", - " objects[key] = {}\n", - " print(weights)\n", - "\n", - " ## Produce max cash map\n", - " max_cash = {}\n", - " cash = initial_capital\n", - " for s, w in weights.items():\n", - " print(f'{s} {w} {w * cash}')\n", - " if w * cash > 500:\n", - " max_cash[s] = 4\n", - " elif w * cash > 300:\n", - " max_cash[s] = 3\n", - " elif w * cash > 200:\n", - " max_cash[s] = 2\n", - " elif w * cash > 100:\n", - " max_cash[s] = 1\n", - " else:\n", - " max_cash[s] = 0.5\n", - " print(max_cash)\n", - "\n", - " ## Create the backtest object\n", - " evb_backtest = create_backtest_object(cash, weights, trades_, max_cash)\n", - " evb_backtest.portfolio.roll_map = 120\n", - " evb_backtest.portfolio.order_settings['target_dte'] = 270\n", - " sizer = ZscoreRVolSizer(evb_backtest.portfolio, \n", - " evb_backtest.risk_manager, \n", - " evb_backtest.risk_manager.sizing_lev,\n", - " vol_type = 'weighted_mean')\n", - " sizer.norm_constant = 2\n", - " evb_backtest.portfolio.risk_manager.sizer = sizer\n", - " \n", - " # ## Structural Test\n", - " # evb_backtest.portfolio.risk_manager.option_price = 'Midpoint_ewm_smooth'\n", - " # evb_backtest.portfolio.risk_manager.submit_add_columns(('Midpoint', 'ewm_smooth'))\n", - "\n", - " evb_backtest.portfolio.risk_manager.print_settings()\n", - "\n", - " custom_attr = {\n", - " 'max_cash': max_cash,\n", - " 'w_map': evb_backtest.portfolio.weight_map,\n", - " 'initial_capital': initial_capital,\n", - " 'commission_rate': evb_backtest.executor.max_slippage_pct,\n", - " 'max_slippage_pct':evb_backtest.executor.commission_rate,\n", - " 'roll_map': evb_backtest.portfolio.roll_map,\n", - " 'order_settings': evb_backtest.portfolio.order_settings,\n", - " 'sizing_lev': evb_backtest.portfolio.risk_manager.sizing_lev,\n", - " 'limits': evb_backtest.portfolio.risk_manager.limits,\n", - " 't_plus_n': evb_backtest.portfolio.risk_manager.t_plus_n,\n", - " 'otm_moneyness_width': evb_backtest.portfolio.risk_manager.otm_moneyness_width,\n", - " 'itm_moneyness_width': evb_backtest.portfolio.risk_manager.itm_moneyness_width,\n", - " }\n", - " ## Run the backtest\n", - " evb_backtest.run()\n", - "\n", - " ## Get the ending capital\n", - " ending_capital = evb_backtest.portfolio._equity['Total'][-1]\n", - " # initial_capital = ending_capital\n", - " capital_tracking[key] = ending_capital\n", - " objects[key]['WEIGHTS'] = evb_backtest.portfolio.weight_map\n", - " objects[key]['END_CASH'] = ending_capital\n", - " objects[key]['TEST_RESULT'] = {}\n", - " objects[key]['TEST_RESULT']['BACKTESTER'] = evb_backtest\n", - " objects[key]['TEST_RESULT']['AGG'] = evb_backtest.portfolio.aggregate()\n", - " objects[key]['CUSTOM_ATTR'] = custom_attr\n", - " clear_output(wait=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [], - "source": [ - "# import dill\n", - "\n", - "# with open(f'/Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/demos/opt_wfa/{filename}.pkl', 'wb') as f:\n", - "# dill.dump(objects, f)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### RECREATE TEST:\n", - "\n", - "Can we recreate exact backtest with parameters saved to excel" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "NVDA 0.3717903440438027 7435.806880876054\n", - "TSLA 0.13285856444949615 2657.171288989923\n", - "META 0.11763798538677593 2352.7597077355185\n", - "NFLX 0.08637009747959587 1727.4019495919174\n", - "AMD 0.0472536240089943 945.072480179886\n", - "AAPL 0.0676151517402857 1352.303034805714\n", - "COST 0.0720078264760282 1440.156529520564\n", - "AMZN 0.04879875274933317 975.9750549866635\n", - "BA 0.02991981454758278 598.3962909516556\n", - "SBUX 0.025747839118105225 514.9567823621045\n", - "{'NVDA': 4, 'TSLA': 4, 'META': 4, 'NFLX': 4, 'AMD': 4, 'AAPL': 4, 'COST': 4, 'AMZN': 4, 'BA': 4, 'SBUX': 4}\n", - "\n", - "Risk Manager Settings:\n", - "Start Date: 2025-01-03 00:00:00\n", - "End Date: 2025-03-03 00:00:00\n", - "Current Limits State (Position Adjusted when these thresholds are reached):\n", - " Delta: True\n", - " Gamma: False\n", - " Vega: False\n", - " Theta: False\n", - " Roll On DTE: True\n", - " Min DTE Threshold: 95\n", - " Roll On Moneyness: True\n", - " Max Moneyness: 1.15\n", - "Quanitity Sizing Type: delta\n", - " \n", - "No positions need to be adjusted on 2025-01-03 00:00:00\n", - "Risk Manager Actions: NO_POSITIONS_TO_ADJUST\n", - "Event queue is empty, processed 0 event(s)\n", - "Processing event: MARKET 2025-01-06 00:00:00\n", - "Processing event: SIGNAL 2025-01-06 00:00:00\n", - "\n", - "Order Received: {'result': 'SUCCESSFUL', 'data': {'trade_id': '&L:TSLA20251121C450&S:TSLA20251121C455', 'close': 1.2750000000000057, 'long': ['TSLA20251121C450'], 'short': ['TSLA20251121C455']}}\n", - "\n", - "===========================\n", - "Buy Details\n", - "Position: {'trade_id': '&L:TSLA20251121C450&S:TSLA20251121C455', 'close': 1.2750000000000057, 'long': ['TSLA20251121C450'], 'short': ['TSLA20251121C455'], 'quantity': 19, 'cash_equivalent_qty': 19.0}, Date: 2025-01-06, Signal: SignalEvent type:LONG, symbol=TSLA, date:2025-01-06 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:TSLA20250106LONG, parent_event:None\n", - "Max Contract Price: 4, Cash at Hand: 25.243127245404267\n", - "Cash at Hand 25.243127245404267 Close 1.2750000000000057\n", - "===========================\n", - "Processing event: SIGNAL 2025-01-06 00:00:00\n", - "\n", - "Order Received: {'result': 'SUCCESSFUL', 'data': {'trade_id': '&L:AAPL20250919C290&S:AAPL20250919C295', 'close': 0.9500000000000002, 'long': ['AAPL20250919C290'], 'short': ['AAPL20250919C295']}}\n", - "\n", - "===========================\n", - "Buy Details\n", - "Position: {'trade_id': '&L:AAPL20250919C290&S:AAPL20250919C295', 'close': 0.9500000000000002, 'long': ['AAPL20250919C290'], 'short': ['AAPL20250919C295'], 'quantity': 13, 'cash_equivalent_qty': 13.0}, Date: 2025-01-06, Signal: SignalEvent type:LONG, symbol=AAPL, date:2025-01-06 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:AAPL20250106LONG, parent_event:None\n", - "Max Contract Price: 4, Cash at Hand: 12.846878830654283\n", - "Cash at Hand 12.846878830654283 Close 0.9500000000000002\n", - "===========================\n", - "Processing event: SIGNAL 2025-01-06 00:00:00\n", - "\n", - "Order Received: {'result': 'SUCCESSFUL', 'data': {'trade_id': '&L:AMZN20250919C280&S:AMZN20250919C285', 'close': 0.9749999999999996, 'long': ['AMZN20250919C280'], 'short': ['AMZN20250919C285']}}\n", - "\n", - "===========================\n", - "Buy Details\n", - "Position: {'trade_id': '&L:AMZN20250919C280&S:AMZN20250919C285', 'close': 0.9749999999999996, 'long': ['AMZN20250919C280'], 'short': ['AMZN20250919C285'], 'quantity': 9, 'cash_equivalent_qty': 9.0}, Date: 2025-01-06, Signal: SignalEvent type:LONG, symbol=AMZN, date:2025-01-06 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:AMZN20250106LONG, parent_event:None\n", - "Max Contract Price: 4, Cash at Hand: 9.271763022373301\n", - "Cash at Hand 9.271763022373301 Close 0.9749999999999996\n", - "===========================\n", - "Processing event: SIGNAL 2025-01-06 00:00:00\n", - "\n", - "Order Received: {'result': 'SUCCESSFUL', 'data': {'trade_id': '&L:BA20250815C215&S:BA20250815C220', 'close': 0.9500000000000002, 'long': ['BA20250815C215'], 'short': ['BA20250815C220']}}\n", - "\n", - "===========================\n", - "Buy Details\n", - "Position: {'trade_id': '&L:BA20250815C215&S:BA20250815C220', 'close': 0.9500000000000002, 'long': ['BA20250815C215'], 'short': ['BA20250815C220'], 'quantity': 5, 'cash_equivalent_qty': 5.0}, Date: 2025-01-06, Signal: SignalEvent type:LONG, symbol=BA, date:2025-01-06 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:BA20250106LONG, parent_event:None\n", - "Max Contract Price: 4, Cash at Hand: 5.684764764040729\n", - "Cash at Hand 5.684764764040729 Close 0.9500000000000002\n", - "===========================\n", - "Processing event: SIGNAL 2025-01-06 00:00:00\n", - "\n", - "Order Received: {'result': 'SUCCESSFUL', 'data': {'trade_id': '&L:NFLX20250815C940&S:NFLX20250815C945', 'close': 0.9749999999999943, 'long': ['NFLX20250815C940'], 'short': ['NFLX20250815C945']}}\n", - "\n", - "===========================\n", - "Buy Details\n", - "Position: {'trade_id': '&L:NFLX20250815C940&S:NFLX20250815C945', 'close': 1.6339909593245343, 'long': ['NFLX20250815C940'], 'short': ['NFLX20250815C945'], 'quantity': 10, 'cash_equivalent_qty': 10.0}, Date: 2025-01-06, Signal: SignalEvent type:LONG, symbol=NFLX, date:2025-01-06 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:NFLX20250106LONG, parent_event:None\n", - "Max Contract Price: 4, Cash at Hand: 16.410318521123216\n", - "Cash at Hand 16.410318521123216 Close 1.6339909593245343\n", - "===========================\n", - "Processing event: ORDER 2025-01-06 00:00:00\n", - "Processing event: ORDER 2025-01-06 00:00:00\n", - "Processing event: ORDER 2025-01-06 00:00:00\n", - "Processing event: ORDER 2025-01-06 00:00:00\n", - "Processing event: ORDER 2025-01-06 00:00:00\n", - "Processing event: FILL 2025-01-06 00:00:00\n", - "Processing event: FILL 2025-01-06 00:00:00\n", - "Processing event: FILL 2025-01-06 00:00:00\n", - "Processing event: FILL 2025-01-06 00:00:00\n", - "Processing event: FILL 2025-01-06 00:00:00\n", - "Risk Manager Actions: {}\n", - "Event queue is empty, processed 16 event(s)\n", - "Processing event: MARKET 2025-01-07 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-01-08 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-01-09 00:00:00\n", - "Risk Manager Actions: IS_HOLIDAY\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-01-10 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-01-13 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': ADJUST(&L:BA20250815C215&S:BA20250815C220, Quantity Change: -1), Reason: greek_limit)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-01-14 00:00:00\n", - "Processing event: SIGNAL 2025-01-14 00:00:00\n", - "\n", - "Order Received: {'result': 'SUCCESSFUL', 'data': {'trade_id': '&L:COST20250815C1180&S:COST20250815C1200', 'close': 1.0749999999999993, 'long': ['COST20250815C1180'], 'short': ['COST20250815C1200']}}\n", - "\n", - "===========================\n", - "Buy Details\n", - "Position: {'trade_id': '&L:COST20250815C1180&S:COST20250815C1200', 'close': 1.0749999999999993, 'long': ['COST20250815C1180'], 'short': ['COST20250815C1200'], 'quantity': 6, 'cash_equivalent_qty': 12.0}, Date: 2025-01-14, Signal: SignalEvent type:LONG, symbol=COST, date:2025-01-14 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:COST20250114LONG, parent_event:None\n", - "Max Contract Price: 4, Cash at Hand: 13.681487030445357\n", - "Cash at Hand 13.681487030445357 Close 1.0749999999999993\n", - "===========================\n", - "Processing event: ORDER 2025-01-14 00:00:00\n", - "Processing event: ORDER 2025-01-14 00:00:00\n", - "Processing event: FILL 2025-01-14 00:00:00\n", - "Processing event: FILL 2025-01-14 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None)}\n", - "Event queue is empty, processed 6 event(s)\n", - "Processing event: MARKET 2025-01-15 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-01-16 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-01-17 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': ADJUST(&L:COST20250815C1180&S:COST20250815C1200, Quantity Change: -1), Reason: greek_limit), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-01-20 00:00:00\n", - "Processing event: ORDER 2025-01-20 00:00:00\n", - "Processing event: FILL 2025-01-20 00:00:00\n", - "Risk Manager Actions: IS_HOLIDAY\n", - "Event queue is empty, processed 3 event(s)\n", - "Processing event: MARKET 2025-01-21 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-01-22 00:00:00\n", - "Processing event: SIGNAL 2025-01-22 00:00:00\n", - "\n", - "Order Received: {'result': 'SUCCESSFUL', 'data': {'trade_id': '&L:META20250919C750&S:META20250919C755', 'close': 0.9749999999999943, 'long': ['META20250919C750'], 'short': ['META20250919C755']}}\n", - "\n", - "===========================\n", - "Buy Details\n", - "Position: {'trade_id': '&L:META20250919C750&S:META20250919C755', 'close': 0.9749999999999943, 'long': ['META20250919C750'], 'short': ['META20250919C755'], 'quantity': 22, 'cash_equivalent_qty': 22.0}, Date: 2025-01-22, Signal: SignalEvent type:LONG, symbol=META, date:2025-01-22 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:META20250122LONG, parent_event:None\n", - "Max Contract Price: 4, Cash at Hand: 22.351217223487428\n", - "Cash at Hand 22.351217223487428 Close 0.9749999999999943\n", - "===========================\n", - "Processing event: ORDER 2025-01-22 00:00:00\n", - "Processing event: FILL 2025-01-22 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None)}\n", - "Event queue is empty, processed 4 event(s)\n", - "Processing event: MARKET 2025-01-23 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20250919C750&S:META20250919C755': HOLD(&L:META20250919C750&S:META20250919C755) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-01-24 00:00:00\n", - "Processing event: SIGNAL 2025-01-24 00:00:00\n", - "\n", - "Order Received: {'result': 'SUCCESSFUL', 'data': {'trade_id': '&L:SBUX20250919C115&S:SBUX20250919C120', 'close': 1.1750000000000003, 'long': ['SBUX20250919C115'], 'short': ['SBUX20250919C120']}}\n", - "\n", - "===========================\n", - "Buy Details\n", - "Position: {'trade_id': '&L:SBUX20250919C115&S:SBUX20250919C120', 'close': 1.0404844705455856, 'long': ['SBUX20250919C115'], 'short': ['SBUX20250919C120'], 'quantity': 3, 'cash_equivalent_qty': 4.0}, Date: 2025-01-24, Signal: SignalEvent type:LONG, symbol=SBUX, date:2025-01-24 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:SBUX20250124LONG, parent_event:None\n", - "Max Contract Price: 4, Cash at Hand: 4.892089432439992\n", - "Cash at Hand 4.892089432439992 Close 1.0404844705455856\n", - "===========================\n", - "Processing event: ORDER 2025-01-24 00:00:00\n", - "Processing event: FILL 2025-01-24 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20250919C750&S:META20250919C755': HOLD(&L:META20250919C750&S:META20250919C755) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None)}\n", - "Event queue is empty, processed 4 event(s)\n", - "Processing event: MARKET 2025-01-27 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20250919C750&S:META20250919C755': HOLD(&L:META20250919C750&S:META20250919C755) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None), '&L:SBUX20250919C115&S:SBUX20250919C120': HOLD(&L:SBUX20250919C115&S:SBUX20250919C120) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-01-28 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20250919C750&S:META20250919C755': HOLD(&L:META20250919C750&S:META20250919C755) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': ADJUST(&L:COST20250815C1180&S:COST20250815C1200, Quantity Change: -1), Reason: greek_limit), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None), '&L:SBUX20250919C115&S:SBUX20250919C120': HOLD(&L:SBUX20250919C115&S:SBUX20250919C120) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-01-29 00:00:00\n", - "Processing event: ORDER 2025-01-29 00:00:00\n", - "Processing event: FILL 2025-01-29 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20250919C750&S:META20250919C755': HOLD(&L:META20250919C750&S:META20250919C755) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None), '&L:SBUX20250919C115&S:SBUX20250919C120': HOLD(&L:SBUX20250919C115&S:SBUX20250919C120) Reason: None)}\n", - "Event queue is empty, processed 3 event(s)\n", - "Processing event: MARKET 2025-01-30 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20250919C750&S:META20250919C755': HOLD(&L:META20250919C750&S:META20250919C755) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None), '&L:SBUX20250919C115&S:SBUX20250919C120': HOLD(&L:SBUX20250919C115&S:SBUX20250919C120) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-01-31 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20250919C750&S:META20250919C755': HOLD(&L:META20250919C750&S:META20250919C755) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None), '&L:SBUX20250919C115&S:SBUX20250919C120': HOLD(&L:SBUX20250919C115&S:SBUX20250919C120) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-03 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20250919C750&S:META20250919C755': HOLD(&L:META20250919C750&S:META20250919C755) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None), '&L:SBUX20250919C115&S:SBUX20250919C120': HOLD(&L:SBUX20250919C115&S:SBUX20250919C120) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-04 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20250919C750&S:META20250919C755': HOLD(&L:META20250919C750&S:META20250919C755) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None), '&L:SBUX20250919C115&S:SBUX20250919C120': HOLD(&L:SBUX20250919C115&S:SBUX20250919C120) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-05 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20250919C750&S:META20250919C755': ADJUST(&L:META20250919C750&S:META20250919C755, Quantity Change: -2), Reason: greek_limit), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None), '&L:SBUX20250919C115&S:SBUX20250919C120': HOLD(&L:SBUX20250919C115&S:SBUX20250919C120) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-06 00:00:00\n", - "Processing event: ORDER 2025-02-06 00:00:00\n", - "Processing event: FILL 2025-02-06 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20250919C750&S:META20250919C755': ADJUST(&L:META20250919C750&S:META20250919C755, Quantity Change: -1), Reason: greek_limit), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None), '&L:SBUX20250919C115&S:SBUX20250919C120': HOLD(&L:SBUX20250919C115&S:SBUX20250919C120) Reason: None)}\n", - "Event queue is empty, processed 3 event(s)\n", - "Processing event: MARKET 2025-02-07 00:00:00\n", - "Processing event: ORDER 2025-02-07 00:00:00\n", - "Processing event: FILL 2025-02-07 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20250919C750&S:META20250919C755': ADJUST(&L:META20250919C750&S:META20250919C755, Quantity Change: -1), Reason: greek_limit), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None), '&L:SBUX20250919C115&S:SBUX20250919C120': HOLD(&L:SBUX20250919C115&S:SBUX20250919C120) Reason: None)}\n", - "Event queue is empty, processed 3 event(s)\n", - "Processing event: MARKET 2025-02-10 00:00:00\n", - "Processing event: ORDER 2025-02-10 00:00:00\n", - "Processing event: FILL 2025-02-10 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20250919C750&S:META20250919C755': HOLD(&L:META20250919C750&S:META20250919C755) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': ADJUST(&L:BA20250815C215&S:BA20250815C220, Quantity Change: -1), Reason: greek_limit), '&L:SBUX20250919C115&S:SBUX20250919C120': HOLD(&L:SBUX20250919C115&S:SBUX20250919C120) Reason: None)}\n", - "Event queue is empty, processed 3 event(s)\n", - "Processing event: MARKET 2025-02-11 00:00:00\n", - "Processing event: ORDER 2025-02-11 00:00:00\n", - "Processing event: FILL 2025-02-11 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20250919C750&S:META20250919C755': HOLD(&L:META20250919C750&S:META20250919C755) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None), '&L:SBUX20250919C115&S:SBUX20250919C120': HOLD(&L:SBUX20250919C115&S:SBUX20250919C120) Reason: None)}\n", - "Event queue is empty, processed 3 event(s)\n", - "Processing event: MARKET 2025-02-12 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20250919C750&S:META20250919C755': HOLD(&L:META20250919C750&S:META20250919C755) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': ADJUST(&L:COST20250815C1180&S:COST20250815C1200, Quantity Change: -2), Reason: greek_limit), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None), '&L:SBUX20250919C115&S:SBUX20250919C120': HOLD(&L:SBUX20250919C115&S:SBUX20250919C120) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-13 00:00:00\n", - "Processing event: ORDER 2025-02-13 00:00:00\n", - "Processing event: FILL 2025-02-13 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20250919C750&S:META20250919C755': HOLD(&L:META20250919C750&S:META20250919C755) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None), '&L:SBUX20250919C115&S:SBUX20250919C120': HOLD(&L:SBUX20250919C115&S:SBUX20250919C120) Reason: None)}\n", - "Event queue is empty, processed 3 event(s)\n", - "Processing event: MARKET 2025-02-14 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20250919C750&S:META20250919C755': HOLD(&L:META20250919C750&S:META20250919C755) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None), '&L:SBUX20250919C115&S:SBUX20250919C120': HOLD(&L:SBUX20250919C115&S:SBUX20250919C120) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-17 00:00:00\n", - "Risk Manager Actions: IS_HOLIDAY\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-18 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20250919C750&S:META20250919C755': HOLD(&L:META20250919C750&S:META20250919C755) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None), '&L:SBUX20250919C115&S:SBUX20250919C120': HOLD(&L:SBUX20250919C115&S:SBUX20250919C120) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-19 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20250919C750&S:META20250919C755': HOLD(&L:META20250919C750&S:META20250919C755) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None), '&L:SBUX20250919C115&S:SBUX20250919C120': HOLD(&L:SBUX20250919C115&S:SBUX20250919C120) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-20 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20250919C750&S:META20250919C755': HOLD(&L:META20250919C750&S:META20250919C755) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None), '&L:SBUX20250919C115&S:SBUX20250919C120': HOLD(&L:SBUX20250919C115&S:SBUX20250919C120) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-21 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20250919C750&S:META20250919C755': HOLD(&L:META20250919C750&S:META20250919C755) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None), '&L:SBUX20250919C115&S:SBUX20250919C120': HOLD(&L:SBUX20250919C115&S:SBUX20250919C120) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-24 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20250919C750&S:META20250919C755': HOLD(&L:META20250919C750&S:META20250919C755) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None), '&L:SBUX20250919C115&S:SBUX20250919C120': HOLD(&L:SBUX20250919C115&S:SBUX20250919C120) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-25 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20250919C750&S:META20250919C755': HOLD(&L:META20250919C750&S:META20250919C755) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None), '&L:SBUX20250919C115&S:SBUX20250919C120': HOLD(&L:SBUX20250919C115&S:SBUX20250919C120) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-26 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:META20250919C750&S:META20250919C755': HOLD(&L:META20250919C750&S:META20250919C755) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None), '&L:SBUX20250919C115&S:SBUX20250919C120': HOLD(&L:SBUX20250919C115&S:SBUX20250919C120) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-27 00:00:00\n", - "Risk Manager Actions: {'&L:META20250919C750&S:META20250919C755': HOLD(&L:META20250919C750&S:META20250919C755) Reason: None), '&L:NFLX20250815C940&S:NFLX20250815C945': HOLD(&L:NFLX20250815C940&S:NFLX20250815C945) Reason: None), '&L:AAPL20250919C290&S:AAPL20250919C295': HOLD(&L:AAPL20250919C290&S:AAPL20250919C295) Reason: None), '&L:COST20250815C1180&S:COST20250815C1200': HOLD(&L:COST20250815C1180&S:COST20250815C1200) Reason: None), '&L:AMZN20250919C280&S:AMZN20250919C285': HOLD(&L:AMZN20250919C280&S:AMZN20250919C285) Reason: None), '&L:BA20250815C215&S:BA20250815C220': HOLD(&L:BA20250815C215&S:BA20250815C220) Reason: None), '&L:SBUX20250919C115&S:SBUX20250919C120': HOLD(&L:SBUX20250919C115&S:SBUX20250919C120) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-28 00:00:00\n", - "Processing event: SIGNAL 2025-02-28 00:00:00\n", - "Not generating order because: CLOSE price is negative SignalEvent type:CLOSE, symbol=TSLA, date:2025-02-28 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:TSLA20250106LONG, parent_event:None, moving event to 2025-03-03 00:00:00\n", - "Risk Manager Actions: {}\n", - "Event queue is empty, processed 2 event(s)\n", - "Processing event: MARKET 2025-03-03 00:00:00\n", - "Processing event: SIGNAL 2025-03-03 00:00:00\n", - "Processing event: SIGNAL 2025-03-03 00:00:00\n", - "Processing event: SIGNAL 2025-03-03 00:00:00\n", - "Processing event: SIGNAL 2025-03-03 00:00:00\n", - "Processing event: SIGNAL 2025-03-03 00:00:00\n", - "Processing event: SIGNAL 2025-03-03 00:00:00\n", - "Processing event: SIGNAL 2025-03-03 00:00:00\n", - "Processing event: SIGNAL 2025-03-03 00:00:00\n", - "Not generating order because: CLOSE price is negative SignalEvent type:CLOSE, symbol=TSLA, date:2025-03-03 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:TSLA20250106LONG, parent_event:None, moving event to 2025-03-04 00:00:00\n", - "Event date 20250304 not found in backtest range.\n", - "2025-07-02 22:15:37 OptionSignalEventScheduler ERROR: Event date 20250304 not found in backtest range\n", - "Processing event: ORDER 2025-03-03 00:00:00\n", - "Processing event: ORDER 2025-03-03 00:00:00\n", - "Processing event: ORDER 2025-03-03 00:00:00\n", - "Processing event: ORDER 2025-03-03 00:00:00\n", - "Processing event: ORDER 2025-03-03 00:00:00\n", - "Processing event: ORDER 2025-03-03 00:00:00\n", - "Processing event: ORDER 2025-03-03 00:00:00\n", - "Processing event: FILL 2025-03-03 00:00:00\n", - "Processing event: FILL 2025-03-03 00:00:00\n", - "Processing event: FILL 2025-03-03 00:00:00\n", - "Processing event: FILL 2025-03-03 00:00:00\n", - "Processing event: FILL 2025-03-03 00:00:00\n", - "Processing event: FILL 2025-03-03 00:00:00\n", - "Processing event: FILL 2025-03-03 00:00:00\n", - "Risk Manager Actions: {}\n", - "Event queue is empty, processed 23 event(s)\n", - "No more dates left.\n" - ] - } - ], - "source": [ - "max_cash = {}\n", - "cash = 20_000\n", - "for s, w in weights.items():\n", - " print(f'{s} {w} {w * cash}')\n", - " if w * cash > 500:\n", - " max_cash[s] = 4\n", - " elif w * cash > 300:\n", - " max_cash[s] = 3\n", - " elif w * cash > 200:\n", - " max_cash[s] = 2\n", - " elif w * cash > 100:\n", - " max_cash[s] = 1\n", - " else:\n", - " max_cash[s] = 0.5\n", - "print(max_cash)\n", - "recreate_evb_backtest = OptionSignalBacktest(trades_, initial_capital=cash, t_plus_n=1, symbol_list = list(weights.keys()))\n", - "w_map = {x: w * 0.95 for x, w in weights.items()}\n", - "recreate_evb_backtest.portfolio.weight_map = w_map\n", - "recreate_evb_backtest.portfolio.order_settings = {\n", - " 'type': 'spread',\n", - " 'specifics': [\n", - " {'direction': 'long', 'rel_strike': 1.0, 'dte': 365, 'moneyness_width': 0.1},\n", - " {'direction': 'short', 'rel_strike': 0.85, 'dte': 365, 'moneyness_width': 0.1} \n", - " ],\n", - " 'name': 'vertical_spread',\n", - " 'strategy': 'vertical',\n", - " 'target_dte': 270, #270\n", - " 'structure_direction': 'long',\n", - " 'spread_ticks': 1,\n", - " 'dte_tolerance': 60,\n", - " 'min_moneyness': 0.65, #0.75\n", - " 'max_moneyness': 1., #1.25\n", - " 'min_total_price': 0.95 #0.5\n", - " }\n", - "recreate_evb_backtest.portfolio.max_contract_price = max_cash\n", - "recreate_evb_backtest.portfolio.roll_map = 120\n", - "recreate_evb_backtest.executor.commission_rate = 0.65/100\n", - "recreate_evb_backtest.portfolio.min_acceptable_dte_threshold = 95\n", - "recreate_evb_backtest.executor.max_slippage_pct = 0.075\n", - "recreate_evb_backtest.portfolio.risk_manager.sizing_lev = 4.5\n", - "recreate_evb_backtest.portfolio.risk_manager.max_slippage = 0.075\n", - "recreate_evb_backtest.portfolio.risk_manager.limits['delta'] = True\n", - "recreate_evb_backtest.portfolio.risk_manager.limits['dte'] = True\n", - "recreate_evb_backtest.portfolio.risk_manager.limits['moneyness'] = True\n", - "recreate_evb_backtest.portfolio.risk_manager.max_moneyness = 1.15\n", - "recreate_evb_backtest.portfolio.risk_manager.otm_moneyness_width = 0.45\n", - "recreate_evb_backtest.portfolio.risk_manager.itm_moneyness_width = 0.10\n", - "recreate_evb_backtest.portfolio.risk_manager.re_update_on_roll = False\n", - "recreate_evb_backtest.portfolio.risk_manager.max_tries = 15\n", - "sizer = ZscoreRVolSizer(recreate_evb_backtest.portfolio,\n", - " recreate_evb_backtest.risk_manager, \n", - " recreate_evb_backtest.risk_manager.sizing_lev,\n", - " vol_type = 'weighted_mean')\n", - "sizer.norm_constant = 2\n", - "sizer.rolling_window = 100\n", - "sizer.rvol_window = (5, 20, 63)\n", - "sizer.weights = (0.5, 0.3, 0.2)\n", - "sizer.set_cash_rule(1)\n", - "recreate_evb_backtest.portfolio.risk_manager.sizer = sizer\n", - "recreate_evb_backtest.portfolio.risk_manager.print_settings()\n", - "recreate_evb_backtest.run()" - ] - }, - { - "cell_type": "code", - "execution_count": 53, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "NVDA 0.000000\n", - "TSLA -0.524514\n", - "META 0.516175\n", - "NFLX 0.438471\n", - "AMD 0.000000\n", - "AAPL -0.397570\n", - "COST 1.130964\n", - "AMZN -0.606141\n", - "BA -0.147614\n", - "SBUX 0.728486\n", - "cash 0.000000\n", - "commission inf\n", - "Total 0.064813\n", - "dtype: float64" - ] - }, - "execution_count": 53, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "re_equity = recreate_evb_backtest.portfolio._equity\n", - "(re_equity.iloc[-1,:]/ re_equity.iloc[0,:] )-1" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'NVDA': 7064.0165368322505,\n", - " 'TSLA': 70.096556356988,\n", - " 'META': 3039.4589978751073,\n", - " 'NFLX': 2258.762330316351,\n", - " 'AMD': 897.8188561708916,\n", - " 'AAPL': 663.0426011988824,\n", - " 'COST': 2842.6582059200227,\n", - " 'AMZN': 314.43391488016704,\n", - " 'BA': 425.2707183363563,\n", - " 'SBUX': 842.6754165475909}" - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "recreate_evb_backtest.portfolio.risk_manager.sizer.cash_rule\n", - "recreate_evb_backtest.portfolio.allocated_cash_map" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.13" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/EventDriven/demos/optionsWFA_Test.ipynb b/EventDriven/demos/optionsWFA_Test.ipynb deleted file mode 100644 index ecd88ca..0000000 --- a/EventDriven/demos/optionsWFA_Test.ipynb +++ /dev/null @@ -1,2720 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The autoreload extension is already loaded. To reload it, use:\n", - " %reload_ext autoreload\n" - ] - } - ], - "source": [ - "%load_ext autoreload\n", - "%autoreload 2\n", - "from EventDriven.backtest import OptionSignalBacktest\n", - "from EventDriven.riskmanager.sizer import DefaultSizer\n", - "import pandas as pd\n", - "import numpy as np\n", - "from IPython.display import clear_output\n", - "from dbase.DataAPI.ThetaData import refresh_proxy_url\n", - "from copy import deepcopy" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "os.environ['PROXY_URL'] = ''" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "import json\n", - "keys = [4, 5, 6, 7, 8, 9, 10, 11, 12 ]\n", - "# keys = [4]\n", - "# keys = [9, 10, 11]\n", - "imports_trades = {key: {'trades': pd.read_csv(f'/Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/input/profitable_trades_{key}.csv').iloc[:, 1:]} for key in keys}\n", - "\n", - "for key in keys:\n", - " with open(f'/Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/input/profitable_weights_{key}.json', 'r') as f:\n", - " weights = json.load(f)\n", - " symbol_list = imports_trades[key]['trades'].Ticker.unique()\n", - " untraded_symbols = [s for s in weights.keys() if s not in imports_trades[key]['trades'].Ticker.unique()]\n", - " for s in untraded_symbols:\n", - " weights.pop(s)\n", - " imports_trades[key]['weights'] = weights" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Starting backtest for key: 12, with initial capital: 6109125.527610102\n", - "Previous Backtest Starting Capital: 1853607.4019067904, Ending capital from Previous Backtest: 6109125.527610102, Return: 229.58033731013893% \n", - "\n", - "Current Capital Tracking: {4: 50325.34816165171, 5: 54711.40277175242, 6: 64325.395840475096, 7: 352426.96207868354, 8: 856334.8675525348, 9: 746983.267922613, 10: 1853607.4019067904, 11: 6109125.527610102}\n", - "{'TSLA': 0.13285856444949615, 'META': 0.11763798538677593, 'NFLX': 0.08637009747959587, 'AAPL': 0.0676151517402857, 'COST': 0.0720078264760282, 'AMZN': 0.04879875274933317, 'BA': 0.02991981454758278, 'SBUX': 0.025747839118105225}\n", - "TSLA 0.13285856444949615 811649.6476400489\n", - "META 0.11763798538677593 718665.2195429769\n", - "NFLX 0.08637009747959587 527645.767334772\n", - "AAPL 0.0676151517402857 413069.44954981003\n", - "COST 0.0720078264760282 439904.8509124224\n", - "AMZN 0.04879875274933317 298117.7061364849\n", - "BA 0.02991981454758278 182783.90283399806\n", - "SBUX 0.025747839118105225 157296.7812372146\n", - "{'TSLA': 4, 'META': 4, 'NFLX': 4, 'AAPL': 4, 'COST': 4, 'AMZN': 4, 'BA': 4, 'SBUX': 4}\n", - "\n", - "Risk Manager Settings:\n", - "Start Date: 2025-01-06 00:00:00\n", - "End Date: 2025-03-03 00:00:00\n", - "Current Limits State (Position Adjusted when these thresholds are reached):\n", - " Delta: True\n", - " Gamma: False\n", - " Vega: False\n", - " Theta: False\n", - " Roll On DTE: True\n", - " Min DTE Threshold: 90\n", - " Roll On Moneyness: True\n", - " Max Moneyness: 1.15\n", - "Quanitity Sizing Type: delta\n", - " \n", - "Processing event: MARKET 2025-01-06 00:00:00\n", - "Processing event: SIGNAL 2025-01-06 00:00:00\n", - "\n", - "Order Received: {'result': 'SUCCESSFUL', 'data': {'trade_id': '&L:TSLA20251121C450&S:TSLA20251121C455', 'close': 1.2750000000000057, 'long': ['TSLA20251121C450'], 'short': ['TSLA20251121C455']}}\n", - "\n", - "2025-06-24 10:04:58 QuantTools.EventDriven.riskmanager.utils CRITICAL: Position Data for &L:TSLA20251121C450&S:TSLA20251121C455 not available, calculating greeks. Load time ~5 minutes\n", - "Calculating Greeks for TSLA20251121C450 on 2025-01-06 00:00:00 in L direction\n", - "Calculating Greeks for TSLA20251121C455 on 2025-01-06 00:00:00 in S direction\n", - "===========================\n", - "Buy Details\n", - "Position: {'trade_id': '&L:TSLA20251121C450&S:TSLA20251121C455', 'close': 1.2750000000000057, 'long': ['TSLA20251121C450'], 'short': ['TSLA20251121C455'], 'quantity': 6047, 'cash_equivalent_qty': 6047.0}, Date: 2025-01-06, Signal: SignalEvent type:LONG, symbol=TSLA, date:2025-01-06 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:TSLA20250106LONG, parent_event:None\n", - "Max Contract Price: 4, Cash at Hand: 7710.671652580463\n", - "Cash at Hand 7710.671652580463 Close 1.2750000000000057\n", - "===========================\n", - "Processing event: SIGNAL 2025-01-06 00:00:00\n", - "\n", - "Order Received: {'result': 'SUCCESSFUL', 'data': {'trade_id': '&L:AAPL20251219C320&S:AAPL20251219C330', 'close': 0.9599999999999995, 'long': ['AAPL20251219C320'], 'short': ['AAPL20251219C330']}}\n", - "\n", - "2025-06-24 10:04:59 QuantTools.EventDriven.riskmanager.utils CRITICAL: Position Data for &L:AAPL20251219C320&S:AAPL20251219C330 not available, calculating greeks. Load time ~5 minutes\n", - "Calculating Greeks for AAPL20251219C330 on 2025-01-06 00:00:00 in S directionCalculating Greeks for AAPL20251219C320 on 2025-01-06 00:00:00 in L direction\n", - "\n", - "===========================\n", - "Buy Details\n", - "Position: {'trade_id': '&L:AAPL20251219C320&S:AAPL20251219C330', 'close': 0.9599999999999995, 'long': ['AAPL20251219C320'], 'short': ['AAPL20251219C330'], 'quantity': 2211, 'cash_equivalent_qty': 4087.0}, Date: 2025-01-06, Signal: SignalEvent type:LONG, symbol=AAPL, date:2025-01-06 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:AAPL20250106LONG, parent_event:None\n", - "Max Contract Price: 4, Cash at Hand: 3924.1597707231954\n", - "Cash at Hand 3924.1597707231954 Close 0.9599999999999995\n", - "===========================\n", - "Processing event: SIGNAL 2025-01-06 00:00:00\n", - "\n", - "Order Received: {'result': 'SUCCESSFUL', 'data': {'trade_id': '&L:AMZN20251219C290&S:AMZN20251219C295', 'close': 1.0, 'long': ['AMZN20251219C290'], 'short': ['AMZN20251219C295']}}\n", - "\n", - "2025-06-24 10:04:59 QuantTools.EventDriven.riskmanager.utils CRITICAL: Position Data for &L:AMZN20251219C290&S:AMZN20251219C295 not available, calculating greeks. Load time ~5 minutes\n", - "Calculating Greeks for AMZN20251219C290 on 2025-01-06 00:00:00 in L direction\n", - "Calculating Greeks for AMZN20251219C295 on 2025-01-06 00:00:00 in S direction\n", - "===========================\n", - "Buy Details\n", - "Position: {'trade_id': '&L:AMZN20251219C290&S:AMZN20251219C295', 'close': 1.0, 'long': ['AMZN20251219C290'], 'short': ['AMZN20251219C295'], 'quantity': 2752, 'cash_equivalent_qty': 2832.0}, Date: 2025-01-06, Signal: SignalEvent type:LONG, symbol=AMZN, date:2025-01-06 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:AMZN20250106LONG, parent_event:None\n", - "Max Contract Price: 4, Cash at Hand: 2832.118208296607\n", - "Cash at Hand 2832.118208296607 Close 1.0\n", - "===========================\n", - "Processing event: SIGNAL 2025-01-06 00:00:00\n", - "\n", - "Order Received: {'result': 'SUCCESSFUL', 'data': {'trade_id': '&L:BA20251219C190&S:BA20251219C195', 'close': 1.1499999999999986, 'long': ['BA20251219C190'], 'short': ['BA20251219C195']}}\n", - "\n", - "2025-06-24 10:04:59 QuantTools.EventDriven.riskmanager.utils CRITICAL: Position Data for &L:BA20251219C190&S:BA20251219C195 not available, calculating greeks. Load time ~5 minutes\n", - "Calculating Greeks for BA20251219C190 on 2025-01-06 00:00:00 in L direction\n", - "Calculating Greeks for BA20251219C195 on 2025-01-06 00:00:00 in S direction\n", - "===========================\n", - "Buy Details\n", - "Position: {'trade_id': '&L:BA20251219C190&S:BA20251219C195', 'close': 1.1499999999999986, 'long': ['BA20251219C190'], 'short': ['BA20251219C195'], 'quantity': 1509, 'cash_equivalent_qty': 1509.0}, Date: 2025-01-06, Signal: SignalEvent type:LONG, symbol=BA, date:2025-01-06 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:BA20250106LONG, parent_event:None\n", - "Max Contract Price: 4, Cash at Hand: 1736.4470769229818\n", - "Cash at Hand 1736.4470769229818 Close 1.1499999999999986\n", - "===========================\n", - "Processing event: SIGNAL 2025-01-06 00:00:00\n", - "\n", - "Order Received: {'result': 'SUCCESSFUL', 'data': {'trade_id': '&L:NFLX20251219C1110&S:NFLX20251219C1120', 'close': 1.7250000000000014, 'long': ['NFLX20251219C1110'], 'short': ['NFLX20251219C1120']}}\n", - "\n", - "2025-06-24 10:05:00 QuantTools.EventDriven.riskmanager.utils CRITICAL: Position Data for &L:NFLX20251219C1110&S:NFLX20251219C1120 not available, calculating greeks. Load time ~5 minutes\n", - "Calculating Greeks for NFLX20251219C1110 on 2025-01-06 00:00:00 in L direction\n", - "Calculating Greeks for NFLX20251219C1120 on 2025-01-06 00:00:00 in S direction\n", - "===========================\n", - "Buy Details\n", - "Position: {'trade_id': '&L:NFLX20251219C1110&S:NFLX20251219C1120', 'close': 1.7250000000000014, 'long': ['NFLX20251219C1110'], 'short': ['NFLX20251219C1120'], 'quantity': 2905, 'cash_equivalent_qty': 2905.0}, Date: 2025-01-06, Signal: SignalEvent type:LONG, symbol=NFLX, date:2025-01-06 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:NFLX20250106LONG, parent_event:None\n", - "Max Contract Price: 4, Cash at Hand: 5012.6347896803345\n", - "Cash at Hand 5012.6347896803345 Close 1.7250000000000014\n", - "===========================\n", - "Processing event: ORDER 2025-01-06 00:00:00\n", - "Processing event: ORDER 2025-01-06 00:00:00\n", - "Processing event: ORDER 2025-01-06 00:00:00\n", - "Processing event: ORDER 2025-01-06 00:00:00\n", - "Processing event: ORDER 2025-01-06 00:00:00\n", - "Processing event: FILL 2025-01-06 00:00:00\n", - "Processing event: FILL 2025-01-06 00:00:00\n", - "Processing event: FILL 2025-01-06 00:00:00\n", - "Processing event: FILL 2025-01-06 00:00:00\n", - "Processing event: FILL 2025-01-06 00:00:00\n", - "Risk Manager Actions: {}\n", - "Event queue is empty, processed 16 event(s)\n", - "Processing event: MARKET 2025-01-07 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-01-08 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': ADJUST(&L:BA20251219C190&S:BA20251219C195, Quantity Change: -228), Reason: greek_limit), '&L:NFLX20251219C1110&S:NFLX20251219C1120': ADJUST(&L:NFLX20251219C1110&S:NFLX20251219C1120, Quantity Change: -251), Reason: greek_limit)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-01-09 00:00:00\n", - "Processing event: ORDER 2025-01-09 00:00:00\n", - "Processing event: ORDER 2025-01-09 00:00:00\n", - "Processing event: FILL 2025-01-09 00:00:00\n", - "Processing event: FILL 2025-01-09 00:00:00\n", - "Risk Manager Actions: IS_HOLIDAY\n", - "Event queue is empty, processed 5 event(s)\n", - "Processing event: MARKET 2025-01-10 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-01-13 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-01-14 00:00:00\n", - "Processing event: SIGNAL 2025-01-14 00:00:00\n", - "\n", - "Order Received: {'result': 'SUCCESSFUL', 'data': {'trade_id': '&L:COST20260116C1000&S:COST20260116C1005', 'close': 2.0249999999999773, 'long': ['COST20260116C1000'], 'short': ['COST20260116C1005']}}\n", - "\n", - "2025-06-24 10:05:04 QuantTools.EventDriven.riskmanager.utils CRITICAL: Position Data for &L:COST20260116C1000&S:COST20260116C1005 not available, calculating greeks. Load time ~5 minutes\n", - "Calculating Greeks for COST20260116C1000 on 2025-01-14 00:00:00 in L direction\n", - "Calculating Greeks for COST20260116C1005 on 2025-01-14 00:00:00 in S direction\n", - "===========================\n", - "Buy Details\n", - "Position: {'trade_id': '&L:COST20260116C1000&S:COST20260116C1005', 'close': 2.0249999999999773, 'long': ['COST20260116C1000'], 'short': ['COST20260116C1005'], 'quantity': 2063, 'cash_equivalent_qty': 2063.0}, Date: 2025-01-14, Signal: SignalEvent type:LONG, symbol=COST, date:2025-01-14 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:COST20250114LONG, parent_event:None\n", - "Max Contract Price: 4, Cash at Hand: 4179.096083668013\n", - "Cash at Hand 4179.096083668013 Close 2.0249999999999773\n", - "===========================\n", - "Processing event: ORDER 2025-01-14 00:00:00\n", - "Processing event: FILL 2025-01-14 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None)}\n", - "Event queue is empty, processed 4 event(s)\n", - "Processing event: MARKET 2025-01-15 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-01-16 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-01-17 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-01-20 00:00:00\n", - "Risk Manager Actions: IS_HOLIDAY\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-01-21 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': ADJUST(&L:NFLX20251219C1110&S:NFLX20251219C1120, Quantity Change: -129), Reason: greek_limit), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-01-22 00:00:00\n", - "Processing event: SIGNAL 2025-01-22 00:00:00\n", - "\n", - "Order Received: {'result': 'SUCCESSFUL', 'data': {'trade_id': '&L:META20251219C760&S:META20251219C765', 'close': 0.9750000000000014, 'long': ['META20251219C760'], 'short': ['META20251219C765']}}\n", - "\n", - "2025-06-24 10:05:06 QuantTools.EventDriven.riskmanager.utils CRITICAL: Position Data for &L:META20251219C760&S:META20251219C765 not available, calculating greeks. Load time ~5 minutes\n", - "Calculating Greeks for META20251219C760 on 2025-01-22 00:00:00 in L direction\n", - "Calculating Greeks for META20251219C765 on 2025-01-22 00:00:00 in S direction\n", - "===========================\n", - "Buy Details\n", - "Position: {'trade_id': '&L:META20251219C760&S:META20251219C765', 'close': 0.9750000000000014, 'long': ['META20251219C760'], 'short': ['META20251219C765'], 'quantity': 7002, 'cash_equivalent_qty': 7002.0}, Date: 2025-01-22, Signal: SignalEvent type:LONG, symbol=META, date:2025-01-22 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:META20250122LONG, parent_event:None\n", - "Max Contract Price: 4, Cash at Hand: 6827.319585658281\n", - "Cash at Hand 6827.319585658281 Close 0.9750000000000014\n", - "===========================\n", - "Processing event: ORDER 2025-01-22 00:00:00\n", - "Processing event: ORDER 2025-01-22 00:00:00\n", - "Processing event: FILL 2025-01-22 00:00:00\n", - "Processing event: FILL 2025-01-22 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': ADJUST(&L:AMZN20251219C290&S:AMZN20251219C295, Quantity Change: -142), Reason: greek_limit), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': ADJUST(&L:NFLX20251219C1110&S:NFLX20251219C1120, Quantity Change: -64), Reason: greek_limit), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None)}\n", - "Event queue is empty, processed 6 event(s)\n", - "Processing event: MARKET 2025-01-23 00:00:00\n", - "Processing event: ORDER 2025-01-23 00:00:00\n", - "Processing event: ORDER 2025-01-23 00:00:00\n", - "Processing event: FILL 2025-01-23 00:00:00\n", - "Processing event: FILL 2025-01-23 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': ADJUST(&L:AMZN20251219C290&S:AMZN20251219C295, Quantity Change: -1), Reason: greek_limit), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:META20251219C760&S:META20251219C765': HOLD(&L:META20251219C760&S:META20251219C765) Reason: None)}\n", - "Event queue is empty, processed 5 event(s)\n", - "Processing event: MARKET 2025-01-24 00:00:00\n", - "Processing event: SIGNAL 2025-01-24 00:00:00\n", - "\n", - "Order Received: {'result': 'SUCCESSFUL', 'data': {'trade_id': '&L:SBUX20260320C125&S:SBUX20260320C130', 'close': 1.0900000000000003, 'long': ['SBUX20260320C125'], 'short': ['SBUX20260320C130']}}\n", - "\n", - "2025-06-24 10:05:07 QuantTools.EventDriven.riskmanager.utils CRITICAL: Position Data for &L:SBUX20260320C125&S:SBUX20260320C130 not available, calculating greeks. Load time ~5 minutes\n", - "Calculating Greeks for SBUX20260320C125 on 2025-01-24 00:00:00 in L direction\n", - "Calculating Greeks for SBUX20260320C130 on 2025-01-24 00:00:00 in S direction\n", - "===========================\n", - "Buy Details\n", - "Position: {'trade_id': '&L:SBUX20260320C125&S:SBUX20260320C130', 'close': 1.0900000000000003, 'long': ['SBUX20260320C125'], 'short': ['SBUX20260320C130'], 'quantity': 1276, 'cash_equivalent_qty': 1370.0}, Date: 2025-01-24, Signal: SignalEvent type:LONG, symbol=SBUX, date:2025-01-24 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:SBUX20250124LONG, parent_event:None\n", - "Max Contract Price: 4, Cash at Hand: 1494.3194217535386\n", - "Cash at Hand 1494.3194217535386 Close 1.0900000000000003\n", - "===========================\n", - "Processing event: ORDER 2025-01-24 00:00:00\n", - "Processing event: ORDER 2025-01-24 00:00:00\n", - "Processing event: FILL 2025-01-24 00:00:00\n", - "Processing event: FILL 2025-01-24 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:META20251219C760&S:META20251219C765': HOLD(&L:META20251219C760&S:META20251219C765) Reason: None)}\n", - "Event queue is empty, processed 6 event(s)\n", - "Processing event: MARKET 2025-01-27 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': ADJUST(&L:NFLX20251219C1110&S:NFLX20251219C1120, Quantity Change: -134), Reason: greek_limit), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:META20251219C760&S:META20251219C765': HOLD(&L:META20251219C760&S:META20251219C765) Reason: None), '&L:SBUX20260320C125&S:SBUX20260320C130': HOLD(&L:SBUX20260320C125&S:SBUX20260320C130) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-01-28 00:00:00\n", - "Processing event: ORDER 2025-01-28 00:00:00\n", - "Processing event: FILL 2025-01-28 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': ADJUST(&L:AMZN20251219C290&S:AMZN20251219C295, Quantity Change: -3), Reason: greek_limit), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:META20251219C760&S:META20251219C765': ADJUST(&L:META20251219C760&S:META20251219C765, Quantity Change: -166), Reason: greek_limit), '&L:SBUX20260320C125&S:SBUX20260320C130': HOLD(&L:SBUX20260320C125&S:SBUX20260320C130) Reason: None)}\n", - "Event queue is empty, processed 3 event(s)\n", - "Processing event: MARKET 2025-01-29 00:00:00\n", - "Processing event: ORDER 2025-01-29 00:00:00\n", - "Processing event: ORDER 2025-01-29 00:00:00\n", - "Processing event: FILL 2025-01-29 00:00:00\n", - "Processing event: FILL 2025-01-29 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': ADJUST(&L:NFLX20251219C1110&S:NFLX20251219C1120, Quantity Change: -52), Reason: greek_limit), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:META20251219C760&S:META20251219C765': HOLD(&L:META20251219C760&S:META20251219C765) Reason: None), '&L:SBUX20260320C125&S:SBUX20260320C130': HOLD(&L:SBUX20260320C125&S:SBUX20260320C130) Reason: None)}\n", - "Event queue is empty, processed 5 event(s)\n", - "Processing event: MARKET 2025-01-30 00:00:00\n", - "Processing event: ORDER 2025-01-30 00:00:00\n", - "Processing event: FILL 2025-01-30 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': ADJUST(&L:AMZN20251219C290&S:AMZN20251219C295, Quantity Change: -6), Reason: greek_limit), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:META20251219C760&S:META20251219C765': ADJUST(&L:META20251219C760&S:META20251219C765, Quantity Change: -381), Reason: greek_limit), '&L:SBUX20260320C125&S:SBUX20260320C130': ADJUST(&L:SBUX20260320C125&S:SBUX20260320C130, Quantity Change: -11), Reason: greek_limit)}\n", - "Event queue is empty, processed 3 event(s)\n", - "Processing event: MARKET 2025-01-31 00:00:00\n", - "Processing event: ORDER 2025-01-31 00:00:00\n", - "Processing event: ORDER 2025-01-31 00:00:00\n", - "Processing event: ORDER 2025-01-31 00:00:00\n", - "Processing event: FILL 2025-01-31 00:00:00\n", - "Processing event: FILL 2025-01-31 00:00:00\n", - "Processing event: FILL 2025-01-31 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': ADJUST(&L:AMZN20251219C290&S:AMZN20251219C295, Quantity Change: -32), Reason: greek_limit), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': ADJUST(&L:NFLX20251219C1110&S:NFLX20251219C1120, Quantity Change: -125), Reason: greek_limit), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:META20251219C760&S:META20251219C765': ADJUST(&L:META20251219C760&S:META20251219C765, Quantity Change: -27), Reason: greek_limit), '&L:SBUX20260320C125&S:SBUX20260320C130': HOLD(&L:SBUX20260320C125&S:SBUX20260320C130) Reason: None)}\n", - "Event queue is empty, processed 7 event(s)\n", - "Processing event: MARKET 2025-02-03 00:00:00\n", - "Processing event: ORDER 2025-02-03 00:00:00\n", - "Processing event: ORDER 2025-02-03 00:00:00\n", - "Processing event: ORDER 2025-02-03 00:00:00\n", - "Processing event: FILL 2025-02-03 00:00:00\n", - "Processing event: FILL 2025-02-03 00:00:00\n", - "Processing event: FILL 2025-02-03 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:META20251219C760&S:META20251219C765': HOLD(&L:META20251219C760&S:META20251219C765) Reason: None), '&L:SBUX20260320C125&S:SBUX20260320C130': HOLD(&L:SBUX20260320C125&S:SBUX20260320C130) Reason: None)}\n", - "Event queue is empty, processed 7 event(s)\n", - "Processing event: MARKET 2025-02-04 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': ADJUST(&L:AMZN20251219C290&S:AMZN20251219C295, Quantity Change: -28), Reason: greek_limit), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:META20251219C760&S:META20251219C765': HOLD(&L:META20251219C760&S:META20251219C765) Reason: None), '&L:SBUX20260320C125&S:SBUX20260320C130': HOLD(&L:SBUX20260320C125&S:SBUX20260320C130) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-05 00:00:00\n", - "Processing event: ORDER 2025-02-05 00:00:00\n", - "Processing event: FILL 2025-02-05 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:META20251219C760&S:META20251219C765': HOLD(&L:META20251219C760&S:META20251219C765) Reason: None), '&L:SBUX20260320C125&S:SBUX20260320C130': ADJUST(&L:SBUX20260320C125&S:SBUX20260320C130, Quantity Change: -17), Reason: greek_limit)}\n", - "Event queue is empty, processed 3 event(s)\n", - "Processing event: MARKET 2025-02-06 00:00:00\n", - "Processing event: ORDER 2025-02-06 00:00:00\n", - "Processing event: FILL 2025-02-06 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:META20251219C760&S:META20251219C765': ADJUST(&L:META20251219C760&S:META20251219C765, Quantity Change: -96), Reason: greek_limit), '&L:SBUX20260320C125&S:SBUX20260320C130': ADJUST(&L:SBUX20260320C125&S:SBUX20260320C130, Quantity Change: -341), Reason: greek_limit)}\n", - "Event queue is empty, processed 3 event(s)\n", - "Processing event: MARKET 2025-02-07 00:00:00\n", - "Processing event: ORDER 2025-02-07 00:00:00\n", - "Processing event: ORDER 2025-02-07 00:00:00\n", - "Processing event: FILL 2025-02-07 00:00:00\n", - "Processing event: FILL 2025-02-07 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:META20251219C760&S:META20251219C765': HOLD(&L:META20251219C760&S:META20251219C765) Reason: None), '&L:SBUX20260320C125&S:SBUX20260320C130': HOLD(&L:SBUX20260320C125&S:SBUX20260320C130) Reason: None)}\n", - "Event queue is empty, processed 5 event(s)\n", - "Processing event: MARKET 2025-02-10 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:META20251219C760&S:META20251219C765': HOLD(&L:META20251219C760&S:META20251219C765) Reason: None), '&L:SBUX20260320C125&S:SBUX20260320C130': HOLD(&L:SBUX20260320C125&S:SBUX20260320C130) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-11 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:META20251219C760&S:META20251219C765': HOLD(&L:META20251219C760&S:META20251219C765) Reason: None), '&L:SBUX20260320C125&S:SBUX20260320C130': HOLD(&L:SBUX20260320C125&S:SBUX20260320C130) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-12 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:META20251219C760&S:META20251219C765': HOLD(&L:META20251219C760&S:META20251219C765) Reason: None), '&L:SBUX20260320C125&S:SBUX20260320C130': HOLD(&L:SBUX20260320C125&S:SBUX20260320C130) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-13 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:META20251219C760&S:META20251219C765': HOLD(&L:META20251219C760&S:META20251219C765) Reason: None), '&L:SBUX20260320C125&S:SBUX20260320C130': HOLD(&L:SBUX20260320C125&S:SBUX20260320C130) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-14 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:META20251219C760&S:META20251219C765': HOLD(&L:META20251219C760&S:META20251219C765) Reason: None), '&L:SBUX20260320C125&S:SBUX20260320C130': HOLD(&L:SBUX20260320C125&S:SBUX20260320C130) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-17 00:00:00\n", - "Risk Manager Actions: IS_HOLIDAY\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-18 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:META20251219C760&S:META20251219C765': HOLD(&L:META20251219C760&S:META20251219C765) Reason: None), '&L:SBUX20260320C125&S:SBUX20260320C130': HOLD(&L:SBUX20260320C125&S:SBUX20260320C130) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-19 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:META20251219C760&S:META20251219C765': HOLD(&L:META20251219C760&S:META20251219C765) Reason: None), '&L:SBUX20260320C125&S:SBUX20260320C130': HOLD(&L:SBUX20260320C125&S:SBUX20260320C130) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-20 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:META20251219C760&S:META20251219C765': HOLD(&L:META20251219C760&S:META20251219C765) Reason: None), '&L:SBUX20260320C125&S:SBUX20260320C130': HOLD(&L:SBUX20260320C125&S:SBUX20260320C130) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-21 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:META20251219C760&S:META20251219C765': ADJUST(&L:META20251219C760&S:META20251219C765, Quantity Change: -44), Reason: greek_limit), '&L:SBUX20260320C125&S:SBUX20260320C130': HOLD(&L:SBUX20260320C125&S:SBUX20260320C130) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-24 00:00:00\n", - "Processing event: ORDER 2025-02-24 00:00:00\n", - "Processing event: FILL 2025-02-24 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': ADJUST(&L:AAPL20251219C320&S:AAPL20251219C330, Quantity Change: -94), Reason: greek_limit), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:META20251219C760&S:META20251219C765': HOLD(&L:META20251219C760&S:META20251219C765) Reason: None), '&L:SBUX20260320C125&S:SBUX20260320C130': HOLD(&L:SBUX20260320C125&S:SBUX20260320C130) Reason: None)}\n", - "Event queue is empty, processed 3 event(s)\n", - "Processing event: MARKET 2025-02-25 00:00:00\n", - "Processing event: ORDER 2025-02-25 00:00:00\n", - "Processing event: FILL 2025-02-25 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:META20251219C760&S:META20251219C765': HOLD(&L:META20251219C760&S:META20251219C765) Reason: None), '&L:SBUX20260320C125&S:SBUX20260320C130': HOLD(&L:SBUX20260320C125&S:SBUX20260320C130) Reason: None)}\n", - "Event queue is empty, processed 3 event(s)\n", - "Processing event: MARKET 2025-02-26 00:00:00\n", - "Risk Manager Actions: {'&L:TSLA20251121C450&S:TSLA20251121C455': HOLD(&L:TSLA20251121C450&S:TSLA20251121C455) Reason: None), '&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:META20251219C760&S:META20251219C765': HOLD(&L:META20251219C760&S:META20251219C765) Reason: None), '&L:SBUX20260320C125&S:SBUX20260320C130': HOLD(&L:SBUX20260320C125&S:SBUX20260320C130) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-27 00:00:00\n", - "Risk Manager Actions: {'&L:AAPL20251219C320&S:AAPL20251219C330': HOLD(&L:AAPL20251219C320&S:AAPL20251219C330) Reason: None), '&L:AMZN20251219C290&S:AMZN20251219C295': HOLD(&L:AMZN20251219C290&S:AMZN20251219C295) Reason: None), '&L:BA20251219C190&S:BA20251219C195': HOLD(&L:BA20251219C190&S:BA20251219C195) Reason: None), '&L:NFLX20251219C1110&S:NFLX20251219C1120': HOLD(&L:NFLX20251219C1110&S:NFLX20251219C1120) Reason: None), '&L:COST20260116C1000&S:COST20260116C1005': HOLD(&L:COST20260116C1000&S:COST20260116C1005) Reason: None), '&L:META20251219C760&S:META20251219C765': HOLD(&L:META20251219C760&S:META20251219C765) Reason: None), '&L:SBUX20260320C125&S:SBUX20260320C130': HOLD(&L:SBUX20260320C125&S:SBUX20260320C130) Reason: None)}\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET 2025-02-28 00:00:00\n", - "Processing event: SIGNAL 2025-02-28 00:00:00\n", - "Not generating order because: CLOSE price is negative SignalEvent type:CLOSE, symbol=TSLA, date:2025-02-28 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:TSLA20250106LONG, parent_event:None, moving event to 2025-03-03 00:00:00\n", - "Risk Manager Actions: {}\n", - "Event queue is empty, processed 2 event(s)\n", - "Processing event: MARKET 2025-03-03 00:00:00\n", - "Processing event: SIGNAL 2025-03-03 00:00:00\n", - "Processing event: SIGNAL 2025-03-03 00:00:00\n", - "Processing event: SIGNAL 2025-03-03 00:00:00\n", - "Processing event: SIGNAL 2025-03-03 00:00:00\n", - "Processing event: SIGNAL 2025-03-03 00:00:00\n", - "Processing event: SIGNAL 2025-03-03 00:00:00\n", - "Processing event: SIGNAL 2025-03-03 00:00:00\n", - "Processing event: SIGNAL 2025-03-03 00:00:00\n", - "Not generating order because: CLOSE price is negative SignalEvent type:CLOSE, symbol=TSLA, date:2025-03-03 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:TSLA20250106LONG, parent_event:None, moving event to 2025-03-04 00:00:00\n", - "Event date 20250304 not found in backtest range.\n", - "2025-06-24 10:05:12 OptionSignalEventScheduler ERROR: Event date 20250304 not found in backtest range\n", - "Processing event: ORDER 2025-03-03 00:00:00\n", - "Processing event: ORDER 2025-03-03 00:00:00\n", - "Processing event: ORDER 2025-03-03 00:00:00\n", - "Processing event: ORDER 2025-03-03 00:00:00\n", - "Processing event: ORDER 2025-03-03 00:00:00\n", - "Processing event: ORDER 2025-03-03 00:00:00\n", - "Processing event: ORDER 2025-03-03 00:00:00\n", - "Processing event: FILL 2025-03-03 00:00:00\n", - "Processing event: FILL 2025-03-03 00:00:00\n", - "Processing event: FILL 2025-03-03 00:00:00\n", - "Processing event: FILL 2025-03-03 00:00:00\n", - "Processing event: FILL 2025-03-03 00:00:00\n", - "Processing event: FILL 2025-03-03 00:00:00\n", - "Processing event: FILL 2025-03-03 00:00:00\n", - "Risk Manager Actions: {}\n", - "Event queue is empty, processed 23 event(s)\n", - "No more dates left.\n" - ] - } - ], - "source": [ - "#Backtest class \n", - "## Find a way to not always reinitialize the backtest class, when want to redo\n", - "ending_capital = 20_000\n", - "initial_capital = ending_capital\n", - "capital_tracking = {}\n", - "objects = {}\n", - "for key in keys:\n", - " \n", - " # try:\n", - " # reasons = {\n", - " # x['reason']:0 for x in evb_backtest.portfolio.unprocessed_signals\n", - " # }\n", - "\n", - " # for v in (evb_backtest.portfolio.unprocessed_signals):\n", - " # reasons[v['reason']] += 1\n", - " # print(v) \n", - " # print(f\"Reasons for unprocessed signals: {key-1}\\n\")\n", - " # print(reasons)\n", - " # except:\n", - " # pass\n", - "\n", - " print(f\"Starting backtest for key: {key}, with initial capital: {ending_capital}\")\n", - " print(f\"Previous Backtest Starting Capital: {initial_capital}, Ending capital from Previous Backtest: {ending_capital}, Return: {((ending_capital - initial_capital) / initial_capital) * 100}% \\n\")\n", - " initial_capital = ending_capital\n", - " print(f\"Current Capital Tracking: {capital_tracking}\")\n", - "\n", - " ## Set the trades and weights\n", - " trades_ = imports_trades[key]['trades']\n", - " weights = imports_trades[key]['weights']\n", - " objects[key] = {}\n", - " print(weights)\n", - "\n", - " ## Produce max cash map\n", - " max_cash = {}\n", - " cash = initial_capital\n", - " for s, w in weights.items():\n", - " print(f'{s} {w} {w * cash}')\n", - " if w * cash > 500:\n", - " max_cash[s] = 4\n", - " elif w * cash > 300:\n", - " max_cash[s] = 3\n", - " elif w * cash > 200:\n", - " max_cash[s] = 2\n", - " elif w * cash > 100:\n", - " max_cash[s] = 1\n", - " else:\n", - " max_cash[s] = 0.5\n", - " print(max_cash)\n", - "\n", - " ## Initialize the backtest class\n", - " evb_backtest = OptionSignalBacktest(trades_, initial_capital=cash, t_plus_n=1)\n", - " evb_backtest.portfolio.initial_capital\n", - " w_map = {x: w * 0.95 for x, w in weights.items()} ## 75% of the weights for each stock\n", - " evb_backtest.portfolio.weight_map = w_map\n", - " # evb_backtest.portfolio.weight_map\n", - " # evb_backtest.portfolio.risk_manager.OrderPicker.liquidity_threshold = 50\n", - " # evb_backtest.portfolio.risk_manager.OrderPicker.lookback = 10\n", - " evb_backtest.portfolio.risk_manager.sizing_lev = 4.5\n", - " # evb_backtest.portfolio.max_contract_price_factor = 2\n", - " # evb_backtest.portfolio.min_moneyness_threshold = 3\n", - " # evb_backtest.portfolio.risk_manager.OrderPicker.data_availability_threshold = 0.5\n", - " order_settings = {\n", - " 'type': 'spread',\n", - " 'specifics': [\n", - " {'direction': 'long', 'rel_strike': 1.0, 'dte': 365, 'moneyness_width': 0.1},\n", - " {'direction': 'short', 'rel_strike': 0.85, 'dte': 365, 'moneyness_width': 0.1} \n", - " ],\n", - " 'name': 'vertical_spread',\n", - " 'strategy': 'vertical',\n", - " 'target_dte': 360, #270\n", - " 'structure_direction': 'long',\n", - " 'spread_ticks': 1,\n", - " 'dte_tolerance': 60,\n", - " 'min_moneyness': 0.65, #0.75\n", - " 'max_moneyness': 1., #1.25\n", - " 'min_total_price': 0.95 #0.5\n", - " }\n", - " evb_backtest.portfolio.order_settings = order_settings\n", - " evb_backtest.portfolio.risk_manager.max_dte_tolerance = order_settings['target_dte'] - 240\n", - " evb_backtest.portfolio.risk_manager.max_tries = 15\n", - " evb_backtest.portfolio.max_contract_price = max_cash\n", - " evb_backtest.executor.commission_rate = 0.65/100\n", - " # evb_backtest.portfolio.min_moneyness_threshold = 5\n", - " evb_backtest.executor.max_slippage_pct = 0.075\n", - " evb_backtest.portfolio.roll_map = 180\n", - " # evb_backtest.portfolio.moneyness_width_factor = .025\n", - " # evb_backtest.portfolio.dte_reduction_factor = 30\n", - " # evb_backtest.portfolio.min_acceptable_dte_threshold = 95\n", - " evb_backtest.portfolio.risk_manager.limits['dte'] = True\n", - " evb_backtest.portfolio.risk_manager.limits['delta'] = True\n", - " evb_backtest.portfolio.risk_manager.limits['moneyness'] = True\n", - " evb_backtest.portfolio.risk_manager.max_moneyness = 1.15 #1.05\n", - " evb_backtest.portfolio.risk_manager.max_slippage = 0.075\n", - " evb_backtest.portfolio.risk_manager.otm_moneyness_width = 0.45\n", - " evb_backtest.portfolio.risk_manager.itm_moneyness_width = 0.10\n", - " evb_backtest.portfolio.risk_manager.re_update_on_roll = False\n", - " evb_backtest.portfolio.risk_manager.t_plus_n = 1\n", - " pm, rm = evb_backtest.portfolio, evb_backtest.portfolio.risk_manager\n", - " evb_backtest.risk_manager.sizer = DefaultSizer(pm, rm, rm.sizing_lev)\n", - " for k in max_cash:\n", - " if max_cash[k]*100 > evb_backtest.portfolio.allocated_cash_map[k]:\n", - " print(k, max_cash[k]*100, evb_backtest.portfolio.allocated_cash_map[k])\n", - "\n", - " evb_backtest.portfolio.risk_manager.print_settings()\n", - "\n", - " custom_attr = {\n", - " 'max_cash': max_cash,\n", - " 'w_map': w_map,\n", - " 'initial_capital': initial_capital,\n", - " 'commission_rate': evb_backtest.executor.max_slippage_pct,\n", - " 'max_slippage_pct':evb_backtest.executor.commission_rate,\n", - " 'roll_map': evb_backtest.portfolio.roll_map,\n", - " 'order_settings': order_settings,\n", - " 'sizing_lev': evb_backtest.portfolio.risk_manager.sizing_lev,\n", - " 'limits': evb_backtest.portfolio.risk_manager.limits,\n", - " 't_plus_n': evb_backtest.portfolio.risk_manager.t_plus_n,\n", - " 'otm_moneyness_width': evb_backtest.portfolio.risk_manager.otm_moneyness_width,\n", - " 'itm_moneyness_width': evb_backtest.portfolio.risk_manager.itm_moneyness_width,\n", - " }\n", - " ## Run the backtest\n", - " evb_backtest.run()\n", - "\n", - " ## Get the ending capital\n", - " ending_capital = evb_backtest.portfolio._equity['Total'][-1]\n", - " # initial_capital = ending_capital\n", - " capital_tracking[key] = ending_capital\n", - " objects[key]['WEIGHTS'] = w_map\n", - " objects[key]['END_CASH'] = ending_capital\n", - " objects[key]['TEST_RESULT'] = {}\n", - " objects[key]['TEST_RESULT']['BACKTESTER'] = evb_backtest\n", - " objects[key]['TEST_RESULT']['AGG'] = evb_backtest.portfolio.aggregate()\n", - " objects[key]['CUSTOM_ATTR'] = custom_attr\n", - " clear_output(wait=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'NVDA': 4,\n", - " 'AMD': 4,\n", - " 'NFLX': 4,\n", - " 'META': 4,\n", - " 'AAPL': 4,\n", - " 'BA': 4,\n", - " 'COST': 4,\n", - " 'SBUX': 4,\n", - " 'TSLA': 1}" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "max_cash" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "import dill\n", - "\n", - "with open(f'/Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/demos/opt_wfa/test.pkl', 'wb') as f:\n", - " dill.dump(objects, f)" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "PosixPath('/Users/chiemelienwanisobi/cloned_repos/QuantTools/.cache/special_dividend')" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "objects[8]['TEST_RESULT']['BACKTESTER'].risk_manager.special_dividends.dir" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1853607.4019067904" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "capital_tracking[10]" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "6350777.853081709" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "capital_tracking[12]" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "name": "Equity Curve", - "showlegend": true, - "type": "scatter", - "x": [ - "2025-01-06T00:00:00", - "2025-01-07T00:00:00", - "2025-01-08T00:00:00", - "2025-01-09T00:00:00", - "2025-01-10T00:00:00", - "2025-01-13T00:00:00", - "2025-01-14T00:00:00", - "2025-01-15T00:00:00", - "2025-01-16T00:00:00", - "2025-01-17T00:00:00", - "2025-01-20T00:00:00", - "2025-01-21T00:00:00", - "2025-01-22T00:00:00", - "2025-01-23T00:00:00", - "2025-01-24T00:00:00", - "2025-01-27T00:00:00", - "2025-01-28T00:00:00", - "2025-01-29T00:00:00", - "2025-01-30T00:00:00", - "2025-01-31T00:00:00", - "2025-02-03T00:00:00", - "2025-02-04T00:00:00", - "2025-02-05T00:00:00", - "2025-02-06T00:00:00", - "2025-02-07T00:00:00", - "2025-02-10T00:00:00", - "2025-02-11T00:00:00", - "2025-02-12T00:00:00", - "2025-02-13T00:00:00", - "2025-02-14T00:00:00", - "2025-02-17T00:00:00", - "2025-02-18T00:00:00", - "2025-02-19T00:00:00", - "2025-02-20T00:00:00", - "2025-02-21T00:00:00", - "2025-02-24T00:00:00", - "2025-02-25T00:00:00", - "2025-02-26T00:00:00", - "2025-02-27T00:00:00", - "2025-02-28T00:00:00", - "2025-03-03T00:00:00" - ], - "xaxis": "x", - "y": [ - 0.9999999996649166, - 1.0099279626624158, - 1.1227541756793749, - 1.1214667407514982, - 1.0308153026414328, - 1.037437520351272, - 1.0321442515798986, - 1.0184921850484916, - 1.050990074831456, - 1.1396927501705374, - 1.1396927501705374, - 1.0671129580137804, - 1.0749141593215072, - 1.1068198040076678, - 1.111190145882126, - 1.211647972798473, - 1.2338147023544774, - 1.310906970918072, - 1.233640422175656, - 1.252933602693778, - 1.1823881043272377, - 1.256873750716902, - 1.2345911681080906, - 1.2224687909591185, - 1.2545957364304094, - 1.1600342577881038, - 1.214308194887884, - 1.2083653623642594, - 1.280147770855091, - 1.2960543234912785, - 1.2960543234912785, - 1.2967623143695444, - 1.2351778350949445, - 1.213680657518512, - 1.1335006905549174, - 1.1547955543743182, - 1.1347514386827386, - 1.110810262291687, - 1.155193781364785, - 1.1258336141857954, - 1.0579306738938246 - ], - "yaxis": "y" - }, - { - "name": "Benchmark", - "showlegend": true, - "type": "scatter", - "x": [ - "2025-01-06T00:00:00", - "2025-01-07T00:00:00", - "2025-01-08T00:00:00", - "2025-01-09T00:00:00", - "2025-01-10T00:00:00", - "2025-01-13T00:00:00", - "2025-01-14T00:00:00", - "2025-01-15T00:00:00", - "2025-01-16T00:00:00", - "2025-01-17T00:00:00", - "2025-01-20T00:00:00", - "2025-01-21T00:00:00", - "2025-01-22T00:00:00", - "2025-01-23T00:00:00", - "2025-01-24T00:00:00", - "2025-01-27T00:00:00", - "2025-01-28T00:00:00", - "2025-01-29T00:00:00", - "2025-01-30T00:00:00", - "2025-01-31T00:00:00", - "2025-02-03T00:00:00", - "2025-02-04T00:00:00", - "2025-02-05T00:00:00", - "2025-02-06T00:00:00", - "2025-02-07T00:00:00", - "2025-02-10T00:00:00", - "2025-02-11T00:00:00", - "2025-02-12T00:00:00", - "2025-02-13T00:00:00", - "2025-02-14T00:00:00", - "2025-02-17T00:00:00", - "2025-02-18T00:00:00", - "2025-02-19T00:00:00", - "2025-02-20T00:00:00", - "2025-02-21T00:00:00", - "2025-02-24T00:00:00", - "2025-02-25T00:00:00", - "2025-02-26T00:00:00", - "2025-02-27T00:00:00", - "2025-02-28T00:00:00", - "2025-03-03T00:00:00", - "2025-03-04T00:00:00" - ], - "xaxis": "x", - "y": [ - null, - 0.988695947604245, - 0.9901404272009963, - 0.9901404272009963, - 0.9750235227710059, - 0.9765352542212326, - 0.9778789585558401, - 0.9956665612097458, - 0.9937517287109437, - 1.00372888973546, - 1.00372888973546, - 1.0129165591081253, - 1.018610617714425, - 1.024170275131843, - 1.0211804381581273, - 1.0067354371544754, - 1.0153857068077532, - 1.0108338020117733, - 1.01625905824031, - 1.0108506149751422, - 1.0040480284852604, - 1.010783465639736, - 1.0148817279789648, - 1.0184090671901376, - 1.0090869966285907, - 1.0159399194905097, - 1.016712598178992, - 1.0134372483822136, - 1.0241366492051056, - 1.0240863128330684, - 1.0240863128330684, - 1.027092860252084, - 1.029511569061605, - 1.0252284666433884, - 1.007692853403877, - 1.0031074251992287, - 0.9981187934279359, - 0.998622669738655, - 0.9826827502481452, - 0.9980180181657922, - 0.9805328438163872, - 0.9689263631161313 - ], - "yaxis": "y" - }, - { - "customdata": [ - 102, - 126, - 68, - 131, - 90, - 314, - 59 - ], - "hovertemplate": "%{text}

Date: %{x}
Size: %{customdata}
PnL: %{y}
", - "marker": { - "color": [ - "red", - "red", - "green", - "green", - "green", - "green", - "green" - ] - }, - "mode": "markers", - "name": "Ticker", - "showlegend": false, - "text": [ - "AAPL", - "AMZN", - "BA", - "NFLX", - "COST", - "META", - "SBUX" - ], - "type": "scatter", - "x": [ - "2025-01-06T00:00:00", - "2025-01-06T00:00:00", - "2025-01-06T00:00:00", - "2025-01-06T00:00:00", - "2025-01-14T00:00:00", - "2025-01-22T00:00:00", - "2025-01-24T00:00:00" - ], - "xaxis": "x2", - "y": [ - -0.45290051623835637, - -0.5792176056692562, - 0.3501179289704681, - 0.6018248956356792, - 0.1806211123162921, - 0.4398063490427986, - 0.5257968127868164 - ], - "yaxis": "y2" - }, - { - "fill": "tozeroy", - "line": { - "color": "red" - }, - "name": "Drawdown", - "showlegend": false, - "type": "scatter", - "x": [ - "2025-01-06T00:00:00", - "2025-01-07T00:00:00", - "2025-01-08T00:00:00", - "2025-01-09T00:00:00", - "2025-01-10T00:00:00", - "2025-01-13T00:00:00", - "2025-01-14T00:00:00", - "2025-01-15T00:00:00", - "2025-01-16T00:00:00", - "2025-01-17T00:00:00", - "2025-01-20T00:00:00", - "2025-01-21T00:00:00", - "2025-01-22T00:00:00", - "2025-01-23T00:00:00", - "2025-01-24T00:00:00", - "2025-01-27T00:00:00", - "2025-01-28T00:00:00", - "2025-01-29T00:00:00", - "2025-01-30T00:00:00", - "2025-01-31T00:00:00", - "2025-02-03T00:00:00", - "2025-02-04T00:00:00", - "2025-02-05T00:00:00", - "2025-02-06T00:00:00", - "2025-02-07T00:00:00", - "2025-02-10T00:00:00", - "2025-02-11T00:00:00", - "2025-02-12T00:00:00", - "2025-02-13T00:00:00", - "2025-02-14T00:00:00", - "2025-02-17T00:00:00", - "2025-02-18T00:00:00", - "2025-02-19T00:00:00", - "2025-02-20T00:00:00", - "2025-02-21T00:00:00", - "2025-02-24T00:00:00", - "2025-02-25T00:00:00", - "2025-02-26T00:00:00", - "2025-02-27T00:00:00", - "2025-02-28T00:00:00", - "2025-03-03T00:00:00" - ], - "xaxis": "x3", - "y": [ - 0, - 0, - 0, - -0.0011466848515133687, - -0.08188692171427758, - -0.07598873148590013, - -0.08070325190633998, - -0.09286269590846896, - -0.06391792449314071, - 0, - 0, - -0.06368364906304202, - -0.056838619147766556, - -0.028843670388828846, - -0.025009001364155292, - 0, - 0, - 0, - -0.05894128535812393, - -0.04422387328761457, - -0.09803812074560969, - -0.04121818789688925, - -0.05821604317791518, - -0.0674633648321592, - -0.04295593866840974, - -0.11509033135963176, - -0.07368850951985895, - -0.07822188422076382, - -0.023464064051878952, - -0.011330058421928135, - -0.011330058421928135, - -0.010789981291494888, - -0.057768508652326966, - -0.07416721424910622, - -0.13533094927062506, - -0.11908658807984795, - -0.13437685242475228, - -0.15263991518643405, - -0.11878280719907308, - -0.14117964213838596, - -0.19297807561876668 - ], - "yaxis": "y3" - }, - { - "histnorm": "percent", - "marker": { - "color": "purple" - }, - "showlegend": false, - "type": "histogram", - "xaxis": "x4", - "y": [ - null, - 0.10562264915846797, - -0.025009001364155292, - 0.12756001680042073, - 0.0013266021024884722, - 0.0330453753638873, - -0.12542192862743673, - -0.006764082584923448, - -0.06031346719511188 - ], - "yaxis": "y4" - }, - { - "histnorm": "percent", - "marker": { - "color": "purple" - }, - "showlegend": false, - "type": "histogram", - "xaxis": "x5", - "y": [ - null, - -0.10144192362731774, - -0.06031346719511188 - ], - "yaxis": "y5" - } - ], - "layout": { - "annotations": [ - { - "font": { - "size": 16 - }, - "showarrow": false, - "text": "EQUITY CURVE", - "x": 0.5, - "xanchor": "center", - "xref": "paper", - "y": 0.9999999999999999, - "yanchor": "bottom", - "yref": "paper" - }, - { - "font": { - "size": 16 - }, - "showarrow": false, - "text": "TRADES", - "x": 0.5, - "xanchor": "center", - "xref": "paper", - "y": 0.5576923076923076, - "yanchor": "bottom", - "yref": "paper" - }, - { - "font": { - "size": 16 - }, - "showarrow": false, - "text": "PORTFOLIO DRAWDOWN", - "x": 0.5, - "xanchor": "center", - "xref": "paper", - "y": 0.3769230769230769, - "yanchor": "bottom", - "yref": "paper" - }, - { - "font": { - "size": 16 - }, - "showarrow": false, - "text": "WEEKLY PORTFOLIO RTRNS", - "x": 0.2375, - "xanchor": "center", - "xref": "paper", - "y": 0.13076923076923078, - "yanchor": "bottom", - "yref": "paper" - }, - { - "font": { - "size": 16 - }, - "showarrow": false, - "text": "MONTHLY PORTFOLIO RTRNS", - "x": 0.7625, - "xanchor": "center", - "xref": "paper", - "y": 0.13076923076923078, - "yanchor": "bottom", - "yref": "paper" - } - ], - "height": 1050, - "hovermode": "x unified", - "margin": { - "b": 20, - "l": 15, - "r": 15, - "t": 50 - }, - "paper_bgcolor": "WHITE", - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "heatmapgl": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmapgl" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "width": 1200, - "xaxis": { - "anchor": "y", - "domain": [ - 0, - 1 - ] - }, - "xaxis2": { - "anchor": "y2", - "domain": [ - 0, - 1 - ] - }, - "xaxis3": { - "anchor": "y3", - "domain": [ - 0, - 1 - ] - }, - "xaxis4": { - "anchor": "y4", - "domain": [ - 0, - 0.475 - ] - }, - "xaxis5": { - "anchor": "y5", - "domain": [ - 0.525, - 1 - ] - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0.6076923076923076, - 0.9999999999999999 - ] - }, - "yaxis2": { - "anchor": "x2", - "domain": [ - 0.42692307692307685, - 0.5576923076923076 - ] - }, - "yaxis3": { - "anchor": "x3", - "domain": [ - 0.1807692307692308, - 0.3769230769230769 - ] - }, - "yaxis4": { - "anchor": "x4", - "domain": [ - 0, - 0.13076923076923078 - ] - }, - "yaxis5": { - "anchor": "x5", - "domain": [ - 0, - 0.13076923076923078 - ] - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2025-06-23 15:26:01 trade.asset.Stock ERROR: Error getting previous close for SPY from yfinance: 'prev_close'\n" - ] - } - ], - "source": [ - "# objects[11]['TEST_RESULT']['BACKTESTER'].plot_portfolio()\n", - "key = 12\n", - "eq = objects[key]['TEST_RESULT']['BACKTESTER']._equity\n", - "trades = objects[key]['TEST_RESULT']['BACKTESTER'].trades\n", - "transactions = objects[key]['TEST_RESULT']['BACKTESTER'].transactions\n", - "ob = objects[key]['TEST_RESULT']['BACKTESTER']\n", - "ob.plot_portfolio()" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
SignalIDTickerReturnPctPositionsEntryTimeExitTimeEntryPriceExitPriceEntryMarketValueExitMarketValueDuration
1AAPL20240103LONGAAPL-0.301643&L:AAPL20250117C220&S:AAPL20241220C2252024-01-032024-02-16210.628784147.0940751255.972703890.36445044
10AAPL20240513LONGAAPL0.775969&L:AAPL20250620C205&S:AAPL20250620C2102024-05-132024-12-31205.726732365.3642511022.1336581833.321256232
\n", - "
" - ], - "text/plain": [ - " SignalID Ticker ReturnPct \\\n", - "1 AAPL20240103LONG AAPL -0.301643 \n", - "10 AAPL20240513LONG AAPL 0.775969 \n", - "\n", - " Positions EntryTime ExitTime EntryPrice \\\n", - "1 &L:AAPL20250117C220&S:AAPL20241220C225 2024-01-03 2024-02-16 210.628784 \n", - "10 &L:AAPL20250620C205&S:AAPL20250620C210 2024-05-13 2024-12-31 205.726732 \n", - "\n", - " ExitPrice EntryMarketValue ExitMarketValue Duration \n", - "1 147.094075 1255.972703 890.364450 44 \n", - "10 365.364251 1022.133658 1833.321256 232 " - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "trades[trades.Ticker == 'AAPL'][['SignalID', 'Ticker', 'ReturnPct', 'Positions', 'EntryTime', 'ExitTime', 'EntryPrice', 'ExitPrice', 'EntryMarketValue', 'ExitMarketValue', 'Duration']]" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAioAAAGkCAYAAAAfYg6GAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB81UlEQVR4nO3dd5hTVfrA8e9Nm5lM74029F4EFRQRRNcGKqiwlhVdUXfVXcuuZcW+oqKr7lrW3Z8Vu4CwqIhdVEDsgnQGGGBghpmB6ZmScn9/hGSSaSSZySST+36eh4dJcpOcNze5eXPOe85VVFVVEUIIIYQIQ7pQN0AIIYQQoi2SqAghhBAibEmiIoQQQoiwJYmKEEIIIcKWJCpCCCGECFuSqAghhBAibEmiIoQQQoiwJYmKEEIIIcKWJCpCCCGECFuGUDegs5SXl2Oz2ULdjKBLT0+ntLQ01M3oElqKFSTeSKalWEE78WolTpfOjtdgMJCcnHz07TrtGUPMZrNhtVpD3YygUhQFcMYa6Wc+0FKsIPFGMi3FCtqJVytxuoQyXhn6EUIIIUTYkkRFCCGEEGFLEhUhhBBChC1JVIQQQggRtiKmmFYIIUTks9lsWCyWUDcDgLq6OhobG0PdjC4TSLxmsxmDoWOphiQqQgghugWbzUZtbS3x8fHodKEfEDAajRE/29STv/E6HA6qq6uJjY3tULIS+j0thBBC+MBisYRNkiKOTqfTER8f3+EesC7rUfnf//7HG2+8wVlnncXll18OQGNjI6+88gpr167FarUyatQo5s6dS1JSUlc1SwghRDciSUr30hn7q0v2eH5+Pp988gm9e/f2un7hwoX8+OOP3Hzzzdx3332Ul5fz2GOPdUWThBBCCNENBD1Rqa+v56mnnuKaa64hNjbWfb3FYuHzzz9nzpw5DB8+nL59+3Lttdeybds2tm/fHuxmCSGEEKIbCPrQz/PPP8+YMWMYOXIkS5cudV+/a9cu7HY7I0aMcF+Xm5tLWloa27dvZ+DAga0+ntVq9SrmURSFmJgY99+RzBVfpMcJ2ooVJN5IpqVYQXvxdrYLLriAoUOHcv/997e5zfHHH8/cuXO56qqrOu15b7zxRqqqqnjxxRc77TE9deT9ENREZc2aNezevZuHHnqoxW0VFRUYDAavXhaAxMREKioq2nzMZcuWsWTJEvflvLw8FixYQHp6eqe1O9xlZWWFugldRkuxgsQbybo61rKaBv7+4VYuHJPLxH5pXfrcEJx46+rqMBqNnf64HeFLe/70pz/x9ttvc9lll/GPf/zD67bbbruNl156idmzZ/PUU0/x8ssvYzQa231cRVHQ6/Wd+lo89NBDqKp61Mf0vD0jI4OXX36Zs846q937mEwmsrOzA25b0BKVsrIyXn75Ze68805MJlOnPe6MGTOYNm2a+7IrSystLY34sycrikJWVhbFxcURfxIsLcUKEm8kC1Wsn+6sYO3uQ9gaG+hn7roptMGMt7GxMaymA/s6XdfhcJCTk8P//vc/7r77bvcoQH19PUuXLiU3NxeHw4HVaiUuLg6g3cdVVRW73d6pr4WrTe09Zmvx+tKOxsZGioqKWlxvMBh86mQIWqKya9cuKisrue2229zXORwOtmzZwocffsi8efPcc+I9e1UqKyvbnfXTXqYZ6Qc8F1VVJdYIJfFGrq6O1Wp3AGBzhOY11tK+9cWIESPYs2cPK1euZObMmQCsXLmSnJwcevXq5d6u+dBPWVkZf/nLX1i9ejXp6enceuutLR47NzeXBx98kE8++YRvvvmGjIwM5s2b5/WjfsuWLdx999389NNPREdHc/bZZ3PPPfe4v3+bD/1ccMEFDBkyhKioKN58802MRiNz5szhpptuApzDTwBXXnklAD169ODbb79tM/6OvBeClqiMGDGiRRfXs88+S05ODueeey5paWno9Xp+/fVXxo8fD8CBAwcoKytrsz5FCCGEb47kKdgjNFlQVRUaG0Lz5KaogGouZs+ezdtvv+1OVN566y1mz57NN9980+Z9brrpJoqLi1m0aBFGo5G77rqLsrKyFts9+uij3HHHHdx333288847XHvttQwaNIgBAwZgsVi45JJLGDt2LCtWrKCsrIxbbrmFefPm8c9//rPN5168eDFXX3017733Hj/++CM33XQTY8eOZdKkSXzwwQeMHDmSxx9/nClTpqDX6/1+PXwVtEQlJibGK0sEiIqKIj4+3n39KaecwiuvvEJcXBxms5kXX3yRgQMHSqIihBAd5DiSoDgiM0+BxgYc188KyVPrnl4EUdF+3+/888/n4YcfprCwEIAffviBZ599ts1EZefOnXz++eesWLGC0aNHA/DYY49x8sknt9h22rRpXHzxxQDceuutfPXVV7z44os89NBDLFu2jIaGBv71r39hNpsBeOCBB7j88suZN29em8MvQ4YM4eabbwagb9++LFy4kNWrVzNp0iRSU1MBZ11pRkaG36+FP0K6hP6cOXNQFIXHHnsMm83mXvBNCCFEx7gSFHvEZirdT2pqKlOnTmXRokWoqsopp5xCSkpKm9vn5+djMBgYOXKk+7r+/fuTmJjYYtuxY8e2uLxp0yYAduzYwZAhQ9xJCsCxxx6Lw+Fg586d7SYqnjIzM1vtzQm2Lk1U7r33Xq/LJpOJuXPnSnIihBCdzB7pPSqmKGfPRoieO1CzZ8/mzjvvBGD+/Pmd1aKgaO38PA6Ho8vbIWsRCyFEBHL3qERojYqiKChR0aH514E1QaZMmeJeD2zy5MntbtuvXz9sNhsbNmxwX5efn09lZWWLbX/66acWlwcMGADAgAED2LJli9c5d77//nt0Oh39+vULOBaj0Yjdbg/4/r6SREUIISKQwxHhPSrdlF6vZ9WqVaxateqoBaj9+/dnypQp3Hbbbfz0009s2LCBW265hejolvUx77//Pm+99RY7d+7kH//4B7/88gtXXHEFADNnziQqKoobbriBrVu3smbNGu666y7OP//8Dq1B1qNHD1avXk1JSUm76591lCQqQggRgVwJiiNCe1S6s/j4eOLj433a9vHHHyczM5MLLriAuXPncskll5CW1nIBv7/85S8sX76c0047jSVLlvDMM8+4J6bExMTw+uuvU1FRwdlnn83VV1/NxIkTOzz0dPfdd/PVV19x7LHHcvrpp3fosdqjqBEy0b20tDSsFgIKBkVRyM7OpqioKOLXJ9BSrCDxRrJQxfr6+lIWbTxE78QonpyW12XPG8x4q6qqSEhI6NTH7AhfF3wLttzcXF544QXOOOOMoD5PoPG2td+MRqNPPTrSoyKEEBEo0mtUhHZIoiKEEBGoaR0VSVRE9xbSdVSE6O72VjTw2vpSLhqZRl6y/wtACREsrvVT7JKnRLz9+/eHuglBJYmKEB3wZUEV3xbWkB1vkkRFhBV3Ma1M+xHdnAz9CNEBrhO/WeXLQIQZ15CP9KiI7k4SFSE6wC6/WkWYssv0ZBEhJFERogOa6gDky0CEF+lREZFCEhUhOqDpxG+hbYcQzbnek9KjIro7SVSE6AC7Kj0qIjy5e1QkiRbdnCQqQnSAe60K+TIQYUaW0O9ecnNz+fDDD0PdjLAkiYoQHeD6tSo9KiLc2GXBt7BSUlLCnXfeyYQJE8jLy2PcuHHMmTOHr7/+OtRNC3uyjooQHSBfBiJcNfWohLYdAvbt28d5551HQkICd955J4MHD8Zms7Fq1SrmzZvHV199FeomhjXpURGiA5p6VELbDiGac81Ic6hE/Ikfw90dd9wBwIoVKzj77LPp168fgwYN4pprruG9995r9T5btmzhwgsvpF+/fgwbNoxbb72V2tpa9+1r167l7LPPpn///gwZMoRzzz2XwsJC9+0fffQRp59+On379mXChAk8/vjj2Gy24AYaJNKjIkQHNBUsyheBCC+eb0mHCnoldG0JBlVVaQjRL4QovYKi+PaClpeX88UXX3DbbbdhNptb3J6YmNjiOovFwiWXXMLYsWNZsWIFZWVl3HLLLcybN49//vOf2Gw2rrzySi6++GKeeeYZrFYrP//8s7tN3377LTfccAP3338/xx9/PHv27OHWW28F4Oabb+5A5KEhiYoQHSBrVYhw5TkcaVdV9ERWptJgV5n99vaQPPfbswcSbfDt9SwoKEBVVfr37+/z4y9btoyGhgb+9a9/uZObBx54gMsvv5x58+ZhMBioqqri1FNPpU+fPgAMGDDAff/HH3+c6667jlmzZgHQu3dvbrnlFubPny+JihBa416rQnpURJixN+tREaERyLDbjh07GDJkiFcPzLHHHovD4WDnzp2MHz+eWbNmcckll3DSSSdx0kknMX36dDIzMwHYvHkzP/zwA08++aT7/g6Hg/r6eurq6oiJiel4YF1IEhUhOkCKaUW48upRicBMJUqv8PbsgSF7bl/l5eWhKAr5+fmd2oYnnniCK6+8ki+++IJ3332XRx55hDfffJOxY8disVj4y1/+wplnntniflFRUZ3ajq4giYoQHeD61SpDPyLcePbyRWCegqIoPg+/hFJycjKTJ0/m5Zdf5sorr2xRp1JZWdmiTmXAgAEsXrwYi8Xi3v77779Hp9PRr18/93bDhw9n+PDh/OlPf2L69On873//Y+zYsQwfPpydO3eSl5cX/AC7gMz6EaIDXF8GkfiLVXRvnm9JWecntObPn4/D4eDss89mxYoV7Nq1ix07dvDCCy9wzjnntNh+5syZREVFccMNN7B161bWrFnDXXfdxfnnn096ejp79+7loYce4ocffqCwsJAvv/yS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00/nd7/7HQ6Hg/fee89rm/T0dGbMmMHWrVt599133UM9mzZtIjs7m379+oWi6QHxJd7mRowYwYQJE3jmmWeYN28ejz76aIthlHDkb6xbtmxBURQGDRpEYWEh9913H7fffjsVFRVd1+gO8PUYpdfrUVUVo9HIMcccw+DBg3nyySe56667eOihh8JiKDOySrfDjF6vx2q1YrVaUVUVVVXR6XRMmDCBzZs3s23bNvbs2cPo0aO54oorePvtt/n+++/p3bs369ev58wzz+w2MyWOFmt+fj67d+8mLy/PnZSMGDGC9957j+Li4m43U+Jo8e7YsYM9e/bQo0cPJk2axPz58zn55JNxOBysW7eO0047jQEDBoQ6DJ/5s3/BOdNLURTeffddtm7dyrXXXguE/+yupKQkJk+e7D6wz549m+eff55Jkya5C4UVRWHMmDH8/ve/56233uKLL76gZ8+e/Pjjj5x//vnuxDuc43TxJd7mDh8+TE1NDWVlZYwYMYI777yTmJiYLmx1YHyN1bXv9u7dS1JSEm+//TYrVqzghBNO4LnnnusWsYL/x2RX74prRuaUKVO44447wiJe6VEJEtcwztSpU9mwYQN79+5Fp9O5u9kmTJhAWVkZ+/fvB5y1KrfeeivnnHMOWVlZ/P3vf+eiiy4Ku/nsrfE1Vtfwj6sOp66ujilTphAbG9utelR8jddVwzB37lymT5+Ow+HAarVy//33c+mll3aLfQv+71+AX3/9lYceeog9e/Zw++23M3z4cKB71DR4FolOmTKFPn36sGjRIne8LlOnTuWvf/0rv/nNb0hJSWH+/PnMnDkTRVG6RZwuvsYLzpqHf/3rX5SXl/OPf/yDP/zhD2HxReYrX2J17buffvqJ/Px88vPzefDBB/nzn//cbWL19zOr0+nYuXMnDz/8MFarlcceeyy89q0qAlZSUqKWlZWpqqqqdrvd6zabzaaqqqo2NDSo99xzj3r//ferqqqqDofDvc3111+vLl68uIta2zGdGavr/p63h5tg7NvmjxNOOjve6upqNT8/P9jN9psvcbq44tu8ebM6a9Ys9fvvv3ffr7Kysgta23GdHW9tba26e/fuILc6MJ0d69dff+2+Phzt2bNH3bx5c6u3BfKZraqqUrds2RLEFgeue/ykC0Pff/89119/PS+++CLgPaMFcBfHWiwWZs2axebN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66/MmjWLCy64wL1NUVFRi/s178FwycrKQlVVMjIywurLPzMzk/r6ekaOHBnqpgiheVKjIoTwycaNG3nnnXfIyMhg4sSJ7p4JVVW9tluxYkWL+0ZFRQEth4OOO+44dDodS5YsafE4qqpSXV3tvhwdHe3TcFJnmDBhAtu3b+eXX35pcVttbS12u71L2iGEkB4VIUQrfv75Z/bv34/D4aCiooJNmzaxYcMG0tLSuPXWWzGZTJhMJoYMGcK7776L3W4nJSWF9evXexWluvTt2xeAN998kxNPPBG9Xs/YsWPJysrit7/9LW+88QalpaUce+yxREdHU1JSwvfff+9et8T1GGvXrmXhwoX069eP6Ohoxo0bF5T4zznnHH744QcWLFjAySefTN++fWloaGDv3r2sW7eOZ555pkX9ixAiOCRREUK0sGjRIsBZzOo618+cOXNanOvnhhtu4MUXX+Sjjz5y13XccccdXHPNNV6P179/f2bPns0nn3zCL7/8gqqqPP3000RHR3PeeeeRnZ3NihUrWLx4MQBpaWmMHDnSKxH5zW9+Q0FBAatWrWLFihWkp6cHLVGJiorivvvuY+nSpaxbt46vvvqKmJgYcnJymDVrFmazOSjPK4RoSVGb97cKIYQQQoQJqVERQgghRNiSREUIIYQQYUsSFSGEEEKELUlUhBBCCBG2JFERQgghRNiSREUIIYQQYUsSFSGEEEKELUlUhBBCCBG2JFERQgghRNiSREUIIYQQYUsSFSGEEEKELUlUhBBCCBG2/h8F18Bo2jvzbAAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "opt_data = objects[11]['TEST_RESULT']['BACKTESTER'].options_data['AAPL20250620C205'] - objects[11]['TEST_RESULT']['BACKTESTER'].options_data['AAPL20250620C210']\n", - "opt_data[(opt_data.index >= '2024-05-13') & (opt_data.index <= '2024-12-31')].plot(y = ['Midpoint', 'Close'])" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "http://127.0.0.1:25510/v2/hist/option/quote?end_date=20241220&root=NVDA&use_csv=true&exp=20250117&ivl=1800000&right=C&start_date=20240112&strike=595000&start_time=34200000&rth=False&end_time=57600000\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Bid_sizeBid_exchangeBidBid_conditionAsk_sizeAsk_exchangeAskAsk_conditionDateMidpointWeighted_midpointtime
datetime
2024-01-12 09:30:00010.0050010.0050202401120.000NaN09:30:00
2024-01-12 10:00:00187381.905037582.35502024011282.12582.20272710:00:00
2024-01-12 10:30:00156981.9550286982.40502024011282.17582.24302310:30:00
2024-01-12 11:00:00196980.705053581.05502024011280.87580.95763911:00:00
2024-01-12 11:30:00236981.8550254682.15502024011282.00082.00625011:30:00
.......................................
2024-06-10 14:00:000690.00500690.0050202406100.000NaN14:00:00
2024-06-10 14:30:000690.00500690.0050202406100.000NaN14:30:00
2024-06-10 15:00:000690.00500690.0050202406100.000NaN15:00:00
2024-06-10 15:30:000690.00500690.0050202406100.000NaN15:30:00
2024-06-10 16:00:000690.00500690.0050202406100.000NaN16:00:00
\n", - "

1442 rows × 12 columns

\n", - "
" - ], - "text/plain": [ - " Bid_size Bid_exchange Bid Bid_condition Ask_size \\\n", - "datetime \n", - "2024-01-12 09:30:00 0 1 0.00 50 0 \n", - "2024-01-12 10:00:00 18 73 81.90 50 37 \n", - "2024-01-12 10:30:00 15 69 81.95 50 28 \n", - "2024-01-12 11:00:00 19 69 80.70 50 53 \n", - "2024-01-12 11:30:00 23 69 81.85 50 25 \n", - "... ... ... ... ... ... \n", - "2024-06-10 14:00:00 0 69 0.00 50 0 \n", - "2024-06-10 14:30:00 0 69 0.00 50 0 \n", - "2024-06-10 15:00:00 0 69 0.00 50 0 \n", - "2024-06-10 15:30:00 0 69 0.00 50 0 \n", - "2024-06-10 16:00:00 0 69 0.00 50 0 \n", - "\n", - " Ask_exchange Ask Ask_condition Date Midpoint \\\n", - "datetime \n", - "2024-01-12 09:30:00 1 0.00 50 20240112 0.000 \n", - "2024-01-12 10:00:00 5 82.35 50 20240112 82.125 \n", - "2024-01-12 10:30:00 69 82.40 50 20240112 82.175 \n", - "2024-01-12 11:00:00 5 81.05 50 20240112 80.875 \n", - "2024-01-12 11:30:00 46 82.15 50 20240112 82.000 \n", - "... ... ... ... ... ... \n", - "2024-06-10 14:00:00 69 0.00 50 20240610 0.000 \n", - "2024-06-10 14:30:00 69 0.00 50 20240610 0.000 \n", - "2024-06-10 15:00:00 69 0.00 50 20240610 0.000 \n", - "2024-06-10 15:30:00 69 0.00 50 20240610 0.000 \n", - "2024-06-10 16:00:00 69 0.00 50 20240610 0.000 \n", - "\n", - " Weighted_midpoint time \n", - "datetime \n", - "2024-01-12 09:30:00 NaN 09:30:00 \n", - "2024-01-12 10:00:00 82.202727 10:00:00 \n", - "2024-01-12 10:30:00 82.243023 10:30:00 \n", - "2024-01-12 11:00:00 80.957639 11:00:00 \n", - "2024-01-12 11:30:00 82.006250 11:30:00 \n", - "... ... ... \n", - "2024-06-10 14:00:00 NaN 14:00:00 \n", - "2024-06-10 14:30:00 NaN 14:30:00 \n", - "2024-06-10 15:00:00 NaN 15:00:00 \n", - "2024-06-10 15:30:00 NaN 15:30:00 \n", - "2024-06-10 16:00:00 NaN 16:00:00 \n", - "\n", - "[1442 rows x 12 columns]" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from dbase.DataAPI.ThetaData import retrieve_eod_ohlc,retrieve_quote\n", - "retrieve_quote('NVDA', \n", - " '2024-12-20',\n", - " '2025-01-17',\n", - " 'C',\n", - " '2024-01-12',\n", - " 595.0,\n", - " print_url=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[0;31mSignature:\u001b[0m\n", - "\u001b[0mretrieve_eod_ohlc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0msymbol\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mend_date\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mexp\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mright\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mstart_date\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mstrike\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mprint_url\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mrt\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mproxy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'http://18.232.166.224:5500/thetadata'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mDocstring:\u001b[0m Interval size in miliseconds. 1 minute is 6000\n", - "\u001b[0;31mFile:\u001b[0m ~/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py\n", - "\u001b[0;31mType:\u001b[0m function" - ] - } - ], - "source": [ - "retrieve_eod_ohlc?" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Start 2024-01-03 00:00:00\n", - "End 2024-12-31 00:00:00\n", - "Duration 363 days 00:00:00\n", - "Exposure Time [%] 100.0\n", - "Equity Final [$] 55008.92\n", - "Equity Peak [$] 92562.581779\n", - "Return [%] 160.789903\n", - "Buy & Hold Return [%] 54.89812\n", - "CAGR [%] 162.17084\n", - "Volatility Ann. [%] 169.099939\n", - "Sharpe Ratio 1.381638\n", - "Sortino Ratio 2.085216\n", - "Skew 1.047743\n", - "Calmar Ratio 3.468699\n", - "Max. Drawdown [%] -46.75264\n", - "Max. Drawdown Value [$] -37553.66\n", - "Avg. Drawdown [%] -12.113464\n", - "Max. Drawdown Duration 88 days 00:00:00\n", - "Avg Dradown Duration 22 days 04:53:32.307692307\n", - "# Trades 23\n", - "Win Rate [%] 59.09\n", - "Lose Rate [%] 40.91\n", - "Avg. Trade [%] 156.985539\n", - "Avg. Winning Trade [%] 295.711855\n", - "Avg. Losing Trade [%] -43.396918\n", - "Best Trade [%] 1726.931858\n", - "Worst Trade [%] -72.769773\n", - "Avg Trade Duration 102.913043\n", - "Avg Win Trade Duration 146.384615\n", - "Avg Lose Duration 41.0\n", - "Max Trade Duration 292\n", - "Max Win Trade Duration 292\n", - "Max Lose Duration 125\n", - "Profit Factor 3.973068\n", - "Expectancy [%] 156.982456\n", - "SQN 1.742793\n", - "2024 Return [%] 160.789903\n", - "Winning Streak 6\n", - "Losing Streak 3\n", - "_strategy None\n", - "equity_curve BA AAPL A...\n", - "_trades Ticker PnL ReturnPct EntryPric...\n", - "_tickers [BA, AAPL, AMD, META, COST, NFLX, NVDA, AMZN, ...\n", - "dtype: object" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "objects[11]['TEST_RESULT']['AGG']" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'WEIGHTS': {'NVDA': 0.193113327353184,\n", - " 'TSLA': 0.10597235406416428,\n", - " 'AMD': 0.06088781342963995,\n", - " 'AAPL': 0.09449359902353249,\n", - " 'NFLX': 0.05972035693343455,\n", - " 'COST': 0.06444958682546627,\n", - " 'AMZN': 0.043240968324206666,\n", - " 'BA': 0.0467708109001976,\n", - " 'SBUX': 0.04668659972930734},\n", - " 'END_CASH': 15014.71964973706,\n", - " 'TEST_RESULT': {'BACKTESTER': ,\n", - " 'AGG': Start 2022-01-04 00:00:00\n", - " End 2022-12-30 00:00:00\n", - " Duration 360 days 00:00:00\n", - " Exposure Time [%] 77.61\n", - " Equity Final [$] 15014.72\n", - " Equity Peak [$] 23475.760782\n", - " Return [%] -34.198667\n", - " Buy & Hold Return [%] -42.083108\n", - " CAGR [%] -34.580056\n", - " Volatility Ann. [%] 48.246667\n", - " Sharpe Ratio -0.640058\n", - " Sortino Ratio -0.679577\n", - " Skew 0.847415\n", - " Calmar Ratio 0.920117\n", - " Max. Drawdown [%] -37.582226\n", - " Max. Drawdown Value [$] -8822.71\n", - " Avg. Drawdown [%] -26.823239\n", - " Max. Drawdown Duration 359 days 00:00:00\n", - " Avg Dradown Duration 179 days 04:49:06.718146718\n", - " # Trades 21\n", - " Win Rate [%] 19.05\n", - " Lose Rate [%] 80.95\n", - " Avg. Trade [%] -29.656193\n", - " Avg. Winning Trade [%] 19.602294\n", - " Avg. Losing Trade [%] -41.246426\n", - " Best Trade [%] 41.005704\n", - " Worst Trade [%] -78.58723\n", - " Avg Trade Duration 32.333333\n", - " Avg Win Trade Duration 62.0\n", - " Avg Lose Duration 25.352941\n", - " Max Trade Duration 154\n", - " Max Win Trade Duration 154\n", - " Max Lose Duration 125\n", - " Profit Factor 0.124674\n", - " Expectancy [%] -29.654745\n", - " SQN -4.45193\n", - " 2022 Return [%] -34.198667\n", - " Winning Streak 2\n", - " Losing Streak 6\n", - " _strategy None\n", - " equity_curve NFLX TSLA ...\n", - " _trades Ticker PnL ReturnPct EntryPrice...\n", - " _tickers [NFLX, TSLA, AMD, AAPL, COST, NVDA, AMZN, SBUX...\n", - " dtype: object},\n", - " 'CUSTOM_ATTR': {'max_cash': {'NVDA': 2,\n", - " 'TSLA': 2,\n", - " 'AMD': 2,\n", - " 'AAPL': 2,\n", - " 'NFLX': 2,\n", - " 'COST': 2,\n", - " 'AMZN': 2,\n", - " 'BA': 2,\n", - " 'SBUX': 2},\n", - " 'w_map': {'NVDA': 0.193113327353184,\n", - " 'TSLA': 0.10597235406416428,\n", - " 'AMD': 0.06088781342963995,\n", - " 'AAPL': 0.09449359902353249,\n", - " 'NFLX': 0.05972035693343455,\n", - " 'COST': 0.06444958682546627,\n", - " 'AMZN': 0.043240968324206666,\n", - " 'BA': 0.0467708109001976,\n", - " 'SBUX': 0.04668659972930734},\n", - " 'initial_capital': 23303.27170628858,\n", - " 'commission_rate': 0.075,\n", - " 'max_slippage_pct': 0.006500000000000001,\n", - " 'roll_map': {'NFLX': 90,\n", - " 'TSLA': 90,\n", - " 'AMD': 90,\n", - " 'AAPL': 90,\n", - " 'COST': 90,\n", - " 'NVDA': 90,\n", - " 'AMZN': 90,\n", - " 'SBUX': 90,\n", - " 'BA': 90},\n", - " 'dte_reduction_factor': 30,\n", - " 'liquidity_threshold': 50,\n", - " 'lookback': 10,\n", - " 'data_availability_threshold': 0.5,\n", - " 'min_moneyness_threshold': 5}}" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "objects[9]" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(-12953.237079659477, (21,))" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "imports_trades[9]['trades'].PnL.sum(),imports_trades[9]['trades'].PnL.shape" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "5149.688729418241" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "imports_trades[9]['weights']['NVDA'] * 20000" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "openbb_new_use", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.13" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/EventDriven/demos/pnl_analysis/1_aapl_analysis_down_pnl.ipynb b/EventDriven/demos/pnl_analysis/1_aapl_analysis_down_pnl.ipynb deleted file mode 100644 index d68587f..0000000 --- a/EventDriven/demos/pnl_analysis/1_aapl_analysis_down_pnl.ipynb +++ /dev/null @@ -1,39131 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- This file analyzes the impact of dynamically reducing quantity with the goal of keeping delta within a specific limit. This specific run utilizes AAPL Trade from \n", - "`/Users/chiemelienwanisobi/Documents/GitHub/stop-loss-script/BACKTEST/private_backtest/TREND_SYSTEM/BBANDS/WFA/target_opt/results/Return [%]_5Y_reduced_sl.pkl`\n", - "Window 10, Index 7 of trades dataframe" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Console Logging & File Logging Can be configured using STREAM_LOG_LEVEL and FILE_LOG_LEVEL in environment variables.\n", - "Propagate to root logger can be set using PROPAGATE_TO_ROOT_LOGGER in environment variables.\n", - "Example:\n", - "STREAM_LOG_LEVEL = 'DEBUG'\n", - "FILE_LOG_LEVEL = 'INFO'\n", - "PROPAGATE_TO_ROOT_LOGGER = 'False'\n", - "\n", - "2025-03-22 16:17:31 trade.helpers.Logging INFO: Logging Root Directory: /Users/chiemelienwanisobi/cloned_repos/QuantTools/logs\n", - "Using Proxy URL: http://18.232.166.224:5500/thetadata\n" - ] - } - ], - "source": [ - "\n", - "from dotenv import load_dotenv\n", - "load_dotenv()\n", - "import os\n", - "import sys\n", - "sys.path.append(\n", - " os.environ.get('WORK_DIR')) #type: ignore\n", - "sys.path.append(\n", - " os.environ.get('DBASE_DIR')) #type: ignore\n", - "from dbase.DataAPI.ThetaData import * #type: ignore\n", - "from dbase.database.SQLHelpers import * #type: ignore\n", - "import pandas as pd\n", - "from EventDriven.data import HistoricTradeDataHandler\n", - "from EventDriven.event import *\n", - "from queue import Queue\n", - "from trade.backtester_.backtester_ import PTDataset, PTBacktester\n", - "import pandas_ta as ta\n", - "from trade.assets.Stock import Stock\n", - "from trade.assets.Calculate import Calculate\n", - "from trade.helpers.Context import Context\n", - "from trade.assets.helpers.loaders import create_object_from_id\n", - "from trade.backtester_.utils.WalkForwardUtils import prev_monday \n", - "from trade.backtester_.strats import BBandsTrend2\n", - "from trade.backtester_.strats import MAStrat\n", - "import yfinance as yf\n", - "import math\n", - "from datetime import datetime\n", - "from EventDriven.backtest import OptionSignalBacktest\n", - "from copy import deepcopy\n", - "from pandas.tseries.offsets import BDay\n", - "import matplotlib.pyplot as plt\n", - "pd.options.display.max_rows = 100\n", - "pd.options.display.max_columns = 50\n", - "%load_ext autoreload\n", - "%autoreload 2" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "thetadata_start = '2021-01-01'" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
SizeEntryBarExitBarEntryPriceExitPricePnLReturnPctEntryTimeExitTimeDurationTicker
666525540148.548104147.710007-55.314406-0.0056422023-02-032023-02-2724AAPL
763545708154.328258170.3699951010.6294220.1039462023-03-062023-10-26234AAPL
1361714752174.849846193.8999941162.0590510.1089512023-11-032023-12-2956AAPL
\n", - "
" - ], - "text/plain": [ - " Size EntryBar ExitBar EntryPrice ExitPrice PnL ReturnPct \\\n", - "6 66 525 540 148.548104 147.710007 -55.314406 -0.005642 \n", - "7 63 545 708 154.328258 170.369995 1010.629422 0.103946 \n", - "13 61 714 752 174.849846 193.899994 1162.059051 0.108951 \n", - "\n", - " EntryTime ExitTime Duration Ticker \n", - "6 2023-02-03 2023-02-27 24 AAPL \n", - "7 2023-03-06 2023-10-26 234 AAPL \n", - "13 2023-11-03 2023-12-29 56 AAPL " - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import json\n", - "pd.set_option('display.max_columns', 100)\n", - "pd.set_option('display.max_rows', 100)\n", - "_key = 10\n", - "with open(f'../../input/profitable_weights_{_key}.json', 'r') as f:\n", - " weights = json.load(f)\n", - "ttrades__ = pd.read_csv(f'../../input/profitable_trades_{_key}.csv').iloc[:, 1:]\n", - "ttrades__['Duration'] = ttrades__.Duration.apply(lambda x: int(x.split(' ')[0]))\n", - "# AMZN20220329LONG\n", - "ttrades__ = ttrades__[(ttrades__.Ticker == 'AAPL') ]\n", - "trades_ = ttrades__.copy()\n", - "trades_" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(AAPL 0.118067\n", - " dtype: float64,\n", - " {'AAPL': 2})" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "symbol_list = trades_.Ticker.unique()\n", - "untraded_symbols = [s for s in weights.keys() if s not in trades_.Ticker.unique()]\n", - "for s in untraded_symbols:\n", - " weights.pop(s)\n", - "\n", - "\n", - "max_cash = {}\n", - "cash = 20_000\n", - "for s, w in weights.items():\n", - " if w * cash > 200:\n", - " max_cash[s] = 2\n", - " elif w * cash > 100:\n", - " max_cash[s] = 1\n", - " else:\n", - " max_cash[s] = 0.5\n", - "max_cash\n", - "pd.Series(weights).sort_values(ascending=False), max_cash" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "# from EventDriven.riskmanager import RiskManager, close_cache, spot_cache, chain_cache, oi_cache, LOOKBACKS, order_cache\n", - "# from pandas.tseries.offsets import BDay\n", - "\n", - "# rm = RiskManager(None, None, 1000000)\n", - "# rm.OrderPicker.liquidity_threshold = 2\n", - "# rm.OrderPicker.lookback = 10\n", - "# rm.OrderPicker.data_availability_threshold = 0.15\n", - "# date, tick = '2023-07-05', 'AVGO'\n", - "# date, tick = '2024-08-13', 'TSM'\n", - "# start = (pd.to_datetime(date) - BDay(30)).strftime('%Y-%m-%d')\n", - "# right = 'C'\n", - "# order_settings = {'type': 'spread',\n", - "# 'specifics': [{'direction': 'long',\n", - "# 'rel_strike': .50,\n", - "# 'dte': 210,\n", - "# 'moneyness_width': 0.5},\n", - "# # {'direction': 'short',\n", - "# # 'rel_strike': .60,\n", - "# # 'dte': 270,\n", - "# # 'moneyness_width': 0.35}\n", - "# ],\n", - "# 'name': 'vertical_spread'}\n", - "\n", - "\n", - "\n", - "# order = rm.OrderPicker.get_order(tick, date, right, 2, order_settings)\n", - "# order" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "3.0" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#Backtest class \n", - "## Find a way to not always reinitialize the backtest class, when want to redo\n", - "\n", - "pd.options.display.max_rows = 15\n", - "pd.options.display.max_columns = 15\n", - "\n", - "evb_backtest = OptionSignalBacktest(trades_, initial_capital=cash)\n", - "evb_backtest.portfolio.initial_capital\n", - "w_map = {x: w * 0.85 for x, w in weights.items()} ## 75% of the weights for each stock\n", - "evb_backtest.portfolio.weight_map = w_map\n", - "evb_backtest.portfolio.weight_map\n", - "evb_backtest.portfolio.risk_manager.OrderPicker.liquidity_threshold = 50\n", - "evb_backtest.portfolio.risk_manager.OrderPicker.lookback = 10\n", - "evb_backtest.portfolio.risk_manager.OrderPicker.data_availability_threshold = 0.5\n", - "evb_backtest.portfolio.order_settings = {'type': 'naked',\n", - " 'specifics': [{'direction': 'long',\n", - " 'rel_strike': .70,\n", - " 'dte': 365,\n", - " 'moneyness_width': 0.10},\n", - " {'direction': 'short',\n", - " 'rel_strike': .65,\n", - " 'dte': 365,\n", - " 'moneyness_width': 0.10}\n", - "],\n", - " 'name': 'vertical_spread'}\n", - "\n", - "\n", - "evb_backtest.portfolio.max_contract_price = max_cash\n", - "evb_backtest.executor.commission_rate = 0.65/100\n", - "evb_backtest.portfolio.min_moneyness_threshold = 5\n", - "evb_backtest.executor.max_slippage_pct = 0.075\n", - "evb_backtest.portfolio.roll_map = 30\n", - "evb_backtest.portfolio.moneyness_width_factor = .025\n", - "evb_backtest.portfolio.dte_reduction_factor = 30\n", - "evb_backtest.portfolio.min_acceptable_dte_threshold = 180\n", - "for key in max_cash:\n", - " if max_cash[key]*100 > evb_backtest.portfolio.allocated_cash_map[key]:\n", - " print(key, max_cash[key]*100, evb_backtest.portfolio.allocated_cash_map[key])\n", - "\n", - "\n", - "\n", - "signals = evb_backtest.bars.signal_df\n", - "signals_df = deepcopy(signals).set_index('Date')\n", - "signals_df[signals_df!=-1].sum().sum()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Problems:\n", - "\n", - "- Current Problem: SELL Signal and Buy Signal are put right next to each other in the queue. Whereas, it is meant to be Sell Signal -> Order Event -> Fill Event -> Buy Signal -> Order Event -> Fill Event\n", - "\n", - "Solution:\n", - "- Use a tuple of action ```python['CLOSE', 'OPEN']```\n", - "- Put first action into queue and return ffunctionality to backtester. Backtester then handles all corresponding sequence.\n", - "- Do the same for action two." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Saving to cache from db\n", - "Buy Details\n", - "Position: {'long': ['AAPL20240119C210'], 'short': ['AAPL20240119C245'], 'trade_id': '&L:AAPL20240119C210&S:AAPL20240119C245', 'close': 1.8950000000000002}, Date: 2023-02-03, Signal: SignalEvent type:LONG, symbol=AAPL, date:2023-02-03 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:AAPL20230203LONG\n", - "Max Contract Price: 2, Cash at Hand: 18.064280162209553\n", - "Cash at Hand 18.064280162209553 Close 1.8950000000000002\n", - "Processing event: ORDER\n", - "Buy Order Position: {'long': ['AAPL20240119C210'], 'short': ['AAPL20240119C245'], 'trade_id': '&L:AAPL20240119C210&S:AAPL20240119C245', 'close': 1.8950000000000002} Price: 1.940974881610104 Quantity: 9 Datetime: 2023-02-03 00:00:00\n", - "Processing event: FILL\n", - "Using If statement for last event\n", - "Event queue is empty, processed 4 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Sell Order Position: {'long': ['AAPL20240119C210'], 'short': ['AAPL20240119C245'], 'trade_id': '&L:AAPL20240119C210&S:AAPL20240119C245', 'close': 1.255} Price: 1.2077199672530243 Quantity: 9 Datetime: 2023-02-27 00:00:00\n", - "Processing event: FILL\n", - "Using If statement for last event\n", - "Event queue is empty, processed 4 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Buy Details\n", - "Position: {'long': ['AAPL20240315C200'], 'short': ['AAPL20240315C210'], 'trade_id': '&L:AAPL20240315C200&S:AAPL20240315C210', 'close': 1.705}, Date: 2023-03-06, Signal: SignalEvent type:LONG, symbol=AAPL, date:2023-03-06 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:AAPL20230306LONG\n", - "Max Contract Price: 2, Cash at Hand: 11.914315355917203\n", - "Cash at Hand 11.914315355917203 Close 1.705\n", - "Processing event: ORDER\n", - "Buy Order Position: {'long': ['AAPL20240315C200'], 'short': ['AAPL20240315C210'], 'trade_id': '&L:AAPL20240315C200&S:AAPL20240315C210', 'close': 1.705} Price: 1.7955822761888092 Quantity: 6 Datetime: 2023-03-06 00:00:00\n", - "Processing event: FILL\n", - "Using If statement for last event\n", - "Event queue is empty, processed 4 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Sell Order Position: {'long': ['AAPL20240315C200'], 'short': ['AAPL20240315C210'], 'trade_id': '&L:AAPL20240315C200&S:AAPL20240315C210', 'close': 0.8699999999999999} Price: 0.8359924888489844 Quantity: 6 Datetime: 2023-10-26 00:00:00\n", - "Processing event: FILL\n", - "Using If statement for last event\n", - "Event queue is empty, processed 4 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Buy Details\n", - "Position: {'long': ['AAPL20240920C230'], 'short': ['AAPL20240920C265'], 'trade_id': '&L:AAPL20240920C230&S:AAPL20240920C265', 'close': 1.7950000000000004}, Date: 2023-11-03, Signal: SignalEvent type:LONG, symbol=AAPL, date:2023-11-03 00:00:00, Order Settings=None,Max Contract Price:None , signal_id:AAPL20231103LONG\n", - "Max Contract Price: 2, Cash at Hand: 6.592130504282149\n", - "Cash at Hand 6.592130504282149 Close 1.7950000000000004\n", - "Processing event: ORDER\n", - "Buy Order Position: {'long': ['AAPL20240920C230'], 'short': ['AAPL20240920C265'], 'trade_id': '&L:AAPL20240920C230&S:AAPL20240920C265', 'close': 1.7950000000000004} Price: 1.905058725750356 Quantity: 3 Datetime: 2023-11-03 00:00:00\n", - "Processing event: FILL\n", - "Using If statement for last event\n", - "Event queue is empty, processed 4 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Using If statement for last event\n", - "Event queue is empty, processed 1 event(s)\n", - "Processing event: MARKET\n", - "Processing event: SIGNAL\n", - "Processing event: ORDER\n", - "Sell Order Position: {'long': ['AAPL20240920C230'], 'short': ['AAPL20240920C265'], 'trade_id': '&L:AAPL20240920C230&S:AAPL20240920C265', 'close': 2.93} Price: 2.7289251395228487 Quantity: 3 Datetime: 2023-12-29 00:00:00\n", - "Processing event: FILL\n", - "Using If statement for last event\n", - "Event queue is empty, processed 4 event(s)\n", - "No more dates left.\n" - ] - } - ], - "source": [ - "import cProfile\n", - "import pstats\n", - "import io\n", - "\n", - "profiler = cProfile.Profile()\n", - "profiler.enable()\n", - "#run backtest\n", - "\n", - "evb_backtest.run()\n", - "profiler.disable()\n", - "stream = io.StringIO()\n", - "stats = pstats.Stats(profiler, stream=stream).sort_stats('cumulative')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## ***VISUALIZE TEST RESULTS***" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "10\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
signal_iddatetimesymboldirectioncash_beforecash_after
0AAPL20230203LONG2023-02-03AAPLBUY2007.142240248.564847
1AAPL20230203LONG2023-02-27AAPLSELL248.5648471323.812817
2AAPL20230306LONG2023-03-06AAPLBUY1323.812817238.663452
3AAPL20230306LONG2023-10-26AAPLSELL238.663452732.458945
4AAPL20231103LONG2023-11-03AAPLBUY732.458945157.041327
5AAPL20231103LONG2023-12-29AAPLSELL157.041327971.818869
\n", - "
" - ], - "text/plain": [ - " signal_id datetime symbol direction cash_before cash_after\n", - "0 AAPL20230203LONG 2023-02-03 AAPL BUY 2007.142240 248.564847\n", - "1 AAPL20230203LONG 2023-02-27 AAPL SELL 248.564847 1323.812817\n", - "2 AAPL20230306LONG 2023-03-06 AAPL BUY 1323.812817 238.663452\n", - "3 AAPL20230306LONG 2023-10-26 AAPL SELL 238.663452 732.458945\n", - "4 AAPL20231103LONG 2023-11-03 AAPL BUY 732.458945 157.041327\n", - "5 AAPL20231103LONG 2023-12-29 AAPL SELL 157.041327 971.818869" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "##Transaction details\n", - "\n", - "pd.set_option('display.max_rows', 100)\n", - "print(_key)\n", - "transactions=evb_backtest.portfolio.transactions\n", - "transactions[transactions.symbol=='AAPL']" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
PositionsEntryTimeExitTimeTickerPnLReturnPctEntryPriceExitPriceEntryMarketValueExitMarketValueEntryPriceExitPriceQuantitySignalIDDurationEntrySlippageExitSlippageQuantity
0&L:AAPL20240119C210&S:AAPL20240119C2452023-02-032023-02-27AAPL-683.329423-0.388569195.397488119.4719971746.8773931086.947971195.397488119.4719979AAPL20230203LONG2441.377393-42.5520299
1&L:AAPL20240315C200&S:AAPL20240315C2102023-03-062023-10-26AAPL-591.353872-0.544952180.85822882.2992491077.349366501.595493180.85822882.2992496AAPL20230306LONG23454.349366-20.4045076
2&L:AAPL20240920C230&S:AAPL20240920C2652023-11-032023-12-29AAPL239.3599240.415976191.805873271.592514571.517618818.677542191.805873271.5925143AAPL20231103LONG5633.017618-60.3224583
\n", - "
" - ], - "text/plain": [ - " Positions EntryTime ExitTime Ticker \\\n", - "0 &L:AAPL20240119C210&S:AAPL20240119C245 2023-02-03 2023-02-27 AAPL \n", - "1 &L:AAPL20240315C200&S:AAPL20240315C210 2023-03-06 2023-10-26 AAPL \n", - "2 &L:AAPL20240920C230&S:AAPL20240920C265 2023-11-03 2023-12-29 AAPL \n", - "\n", - " PnL ReturnPct EntryPrice ExitPrice EntryMarketValue \\\n", - "0 -683.329423 -0.388569 195.397488 119.471997 1746.877393 \n", - "1 -591.353872 -0.544952 180.858228 82.299249 1077.349366 \n", - "2 239.359924 0.415976 191.805873 271.592514 571.517618 \n", - "\n", - " ExitMarketValue EntryPrice ExitPrice Quantity SignalID \\\n", - "0 1086.947971 195.397488 119.471997 9 AAPL20230203LONG \n", - "1 501.595493 180.858228 82.299249 6 AAPL20230306LONG \n", - "2 818.677542 191.805873 271.592514 3 AAPL20231103LONG \n", - "\n", - " Duration EntrySlippage ExitSlippage Quantity \n", - "0 24 41.377393 -42.552029 9 \n", - "1 234 54.349366 -20.404507 6 \n", - "2 56 33.017618 -60.322458 3 " - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "##Trade details\n", - "pd.set_option('display.max_columns', 100)\n", - "trades = evb_backtest.portfolio._trades.copy()#\n", - "len(trades)\n", - "preferred_cols = ['Positions','EntryTime', 'ExitTime','Ticker','PnL', 'ReturnPct', 'EntryPrice', 'ExitPrice', 'EntryMarketValue', 'ExitMarketValue', 'EntryPrice', 'ExitPrice', 'Quantity', 'SignalID', 'Duration', 'EntrySlippage', 'ExitSlippage', 'Quantity']\n", - "trades[preferred_cols]" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
OpenHighLowCloseVolumeBid_sizeCloseBidAsk_sizeCloseAskMidpointWeighted_midpoint
Datetime
2023-03-061.001.701.001.14114-3211.81211.601.7051.836374
2023-03-071.601.551.291.33151391.42-3230.651.0350.765697
2023-03-081.331.461.261.2671-8481.62-9441.351.4851.472368
2023-03-094.554.554.254.256-1711.31-3071.301.3051.267042
2023-03-101.671.371.541.3622-5041.452771.561.5051.747993
....................................
2023-10-201.711.731.481.49204-1511.48-1191.481.4801.484234
2023-10-231.281.501.231.44-161-971.43-201.441.4351.441524
2023-10-241.411.451.251.42772191.40-491.421.4101.404500
2023-10-251.261.371.191.2685-1311.21-601.251.2301.264765
2023-10-261.191.220.840.93-412-1700.82-1740.920.8700.896275
\n", - "

164 rows × 11 columns

\n", - "
" - ], - "text/plain": [ - " Open High Low Close Volume Bid_size CloseBid Ask_size \\\n", - "Datetime \n", - "2023-03-06 1.00 1.70 1.00 1.14 114 -321 1.81 21 \n", - "2023-03-07 1.60 1.55 1.29 1.33 15 139 1.42 -323 \n", - "2023-03-08 1.33 1.46 1.26 1.26 71 -848 1.62 -944 \n", - "2023-03-09 4.55 4.55 4.25 4.25 6 -171 1.31 -307 \n", - "2023-03-10 1.67 1.37 1.54 1.36 22 -504 1.45 277 \n", - "... ... ... ... ... ... ... ... ... \n", - "2023-10-20 1.71 1.73 1.48 1.49 204 -151 1.48 -119 \n", - "2023-10-23 1.28 1.50 1.23 1.44 -161 -97 1.43 -20 \n", - "2023-10-24 1.41 1.45 1.25 1.42 772 19 1.40 -49 \n", - "2023-10-25 1.26 1.37 1.19 1.26 85 -131 1.21 -60 \n", - "2023-10-26 1.19 1.22 0.84 0.93 -412 -170 0.82 -174 \n", - "\n", - " CloseAsk Midpoint Weighted_midpoint \n", - "Datetime \n", - "2023-03-06 1.60 1.705 1.836374 \n", - "2023-03-07 0.65 1.035 0.765697 \n", - "2023-03-08 1.35 1.485 1.472368 \n", - "2023-03-09 1.30 1.305 1.267042 \n", - "2023-03-10 1.56 1.505 1.747993 \n", - "... ... ... ... \n", - "2023-10-20 1.48 1.480 1.484234 \n", - "2023-10-23 1.44 1.435 1.441524 \n", - "2023-10-24 1.42 1.410 1.404500 \n", - "2023-10-25 1.25 1.230 1.264765 \n", - "2023-10-26 0.92 0.870 0.896275 \n", - "\n", - "[164 rows x 11 columns]" - ] - }, - "execution_count": 43, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAigAAAGkCAYAAAAbl967AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAACNhklEQVR4nO2dd5wU9f3/X58t13vj7ui9IyiIICiILSoqChqNibEkJCY/W2xfW9TYMBpTNImxa6IRURIUC2rEgqIiTekdDu643uvufH5/fOYzO1tvd293Z+bu/Xw8eOzO7OzMi7nd2fe8K+OccxAEQRAEQZgIm9ECCIIgCIIgfCEDhSAIgiAI00EGCkEQBEEQpoMMFIIgCIIgTAcZKARBEARBmA4yUAiCIAiCMB1koBAEQRAEYTrIQCEIgiAIwnSQgUIQBEEQhOlwGC2gp9TV1cHlcsVkX4WFhaiqqorJvmKJWXUFwgparaARsIZOK2iUWEWrFXRaQaPEClqtoBGInU6Hw4Hc3Nzut+vxkQzG5XKhq6urx/thjGn7M1P3f7PqCoQVtFpBI2ANnVbQKLGKVivotIJGiRW0WkEjYIxOCvEQBEEQBGE6yEAhCIIgCMJ0kIFCEARBEITpIAOFIAiCIAjTYfkkWYIgCKL309LSApfLpSVrhktbWxs6OzvjpCo2WEEjEJnOtLQ0OBw9MzHIQCEIgiBMTUdHBxhjyM7Ojvi9TqczJpWe8cQKGoHwdSqKgqamJqSnp/fISKEQD0EQBGFqOjo6kJqaarQMIkxsNhsyMzPR2tras/3ESA9BEARBxI1IQzuEsdhsPTcvyEAhCIIgCMJ0kIFCEARBEITpIAOFIAiCIAxm4cKFuPvuu0NuM336dDz99NMxPe7111+PK6+8Mqb7jBVkoBAEYUo451BeegLKf18xWgpBRMX111+P/v3749Zbb/V77fbbb0f//v1x/fXXAwCefvpp3HLLLQlWCNx33314/PHHI3pP//798d5778VJkQcyUAiCMCd11eCfrQJ/Z6mph6gRRChKS0uxYsUKtLW1aeva29vxn//8B/3799fW5ebmIiMjI+H6srKyoirfTgRkoBAEYU7a1Qu6ogAul7FaCCJKJk6ciNLSUrz77rvaunfffRelpaWYMGGCts43xFNdXY3LL78cw4cPxwknnIA333zTb9/9+/fHiy++iMsuuwzDhw/HjBkz8Pbbb3tts23bNixatAjDhw/H+PHjccstt6ClpUV73TfEs3DhQtx11124//77MX78eEyePBmPPfaY9vr06dMBAFdddRX69++vLccDMlAIgjAnHe2e510dxukgTAXnHLyj3Zh/UXryLr74Yrz22mva8r///W9cfPHFId9zww034MiRI1i6dCn+8Y9/4MUXX0R1dbXfdr///e9x1llnYdWqVViwYAGuueYa7Nq1CwDQ2tqKH/3oR8jJycHKlSvx1FNP4bPPPsMdd9wR8tivv/460tLS8NZbb+GOO+7A448/jk8//RQA8M477wAA/vCHP2DDhg3acjygTrIEQZiTdo9LHJ2dQJpxUggT0dkB5dcXhb15LE1b2xNLgeSUiN934YUX4uGHH0ZZWRkAYN26dfjb3/6GL7/8MuD2e/bswf/+9z+sXLkSkydPBgA89thjOPnkk/22Peecc3DppZcCAG655RZ8+umneO655/DQQw9h+fLl6OjowJ/+9CekpYkv0P3334+f/vSnuOOOO1BYWBjw+GPHjsWNN94IABg2bBheeOEFfP7555g3bx7y8/MBANnZ2SgqKor4XEQCGSgEQZgTLw+K+eeUEEQw8vPzMW/ePCxdKvKpTjnlFOTl5QXdfvfu3XA4HJg0aZK2bsSIEQFzRY477ji/5S1btgAAdu3ahbFjx2rGCQBMmzYNiqJgz549IQ0UPUVFRQG9N/HGEANl6dKlWLZsmde60tJS/PGPfzRCDkEQJoTrDZROCvEQKknJwpMRJjGdc5OUHPVbL774Ytx5550AgAceeCA2euKE7/wcxhgURUm8joQfUWXgwIG46667tOVYtMUlCKIX0eET4iEIqC3vIwizMKcTzGaPo6LwmDt3rmYozZkzJ+S2w4cPh8vlwubNm7UQz+7du9HQ0OC37fr167Fo0SKvZZl8O3LkSLz++utobW3VvCjffPMNbDYbhg8fHvX/xel0wu12R/3+cDHMKrDZbMjJydH+ZWVlGSWFIAgz0qHzmlCSLGFx7HY7Vq9ejdWrV8NuD20wjRgxAnPnzsWtt96K9evXY/Pmzbj55puRkuJvmL399tv497//jT179uDRRx/Fxo0bccUVVwAALrjgAiQnJ+O6667D9u3bsWbNGtx111248MILg4Z3wmHAgAH4/PPPUVlZifr6+qj30x2GeVAq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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "tick, entry, exit = '&L:AAPL20240315C200&S:AAPL20240315C210\t2023-03-06\t2023-10-26'.split('\\t')\n", - "_, long, short = tick.split('&')\n", - "long, short = long[2:], short[2:] \n", - "price_data = evb_backtest.portfolio.options_data[long] - evb_backtest.portfolio.options_data[short]\n", - "price_data.plot(y = 'Midpoint')\n", - "price_data[(price_data.index >=entry) & (price_data.index <= exit)]\n", - "# price_data#[price_data.index.isin(['2022-01-04', '2022-01-21'])]" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "-591.6" - ] - }, - "execution_count": 49, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "((87 - 170.5 ) * 6) - 75 - (1.3 * 12)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{}" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "reasons = {\n", - " x['reason']:0 for x in evb_backtest.portfolio.unprocessed_signals\n", - "}\n", - "\n", - "for v in (evb_backtest.portfolio.unprocessed_signals):\n", - " reasons[v['reason']] += 1\n", - " print(v) \n", - "reasons" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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QbKzs/t9LJfLBRDU/0CD+TkL0Ucwv8+h4L777sPpdHL11VczYsQI6urqWLduHY2NjaE2rVf27dvHrbfeSmFhIddddx35+fmUl5fzj3/8gzVr1nDnnXeSmpoaajO9iIuL41//+hfz588PO9v6YtasWVx11VW4XC5qa2tZs2YNTzzxBJ9++im//OUviYmJCbWJg4IImCAxduxY9u3bx6effsrxxx8PGOo9NzeXvLw8e92aNWt44YUXKC8vx+FwUFpayg9+8AMKCgoAqKqq4pprruFnP/sZb7zxBlu3buVHP/oR8+bNG/T30NraysqVK7n77rupra3l3Xff5ZxzzgHcV0M33XQTzzzzDBUVFZSUlHDFFVcwevRoAN59912eeOIJrrnmGp5++mkqKir485//TH5+ftBsDNbnvHjxYoqLi/nhD39oP6e+vp4rrriCX//610yfPj1oNvvD1VdfzRlnnMGZZ55pb/vFL37BkUceyfnnnw8Y4ZcrrriC1atXs3btWrKzs7nkkks44ogjhtTWnvDnPQwlvX2fre/qE088Ya/3dbX9wgsv8Prrr9Pe3s6cOXNIS0tjzZo1/P73vx90+5uamvj666+57bbbmDJlCgB5eXlMmDDBa83f//53PvvsM5xOJ+PGjePSSy+lpKQEgOXLl/PZZ59xyimn8OKLL9LQ0MBhhx3GlVdeSXJy8qDZvnTpUmJjY7n11lvtC43c3FzGjh3Ltddey7Jly/jRj35ER0cHzz33HB999BF1dXXk5ORw9tlnM23aNBYvXgzAZZddBjDo3tXp06ezb98+Xn75ZS6++GKfaz755BOWL19OZWUlWVlZnHbaaXz7298G4JlnnmH9+vX87ne/83rOL37xC2bPns3ChQsHzfbY2FgyMzMByM7OZty4cZSWlrJkyRLeffddTj755D6/KwCff/45L7zwArt27SIxMZHJkyfzi1/8YtDsHijR61sKASeeeCLvvvuu/fidd97pJjxaW1tZsGABd999N7/97W9RSvGHP/zB9lZYPP3005xxxhncf//9zJw5cwish5UrVzJy5EiKioo4/vjjeeedd7q1y/773//OJZdcwl133UVaWhr33HMPTqfT3t/W1sa//vUvrrzySv74xz+SkZERdDuD8TmffPLJfPjhh16zNt5//32ys7OZNm1a0G0OFs8//zzHHHMMf/jDHzj00EP585//HPZX46HCn+9zb3zwwQe8+OKLfP/73+fuu+8mNzeXFStWDKLF3iQmJpKYmMiqVat6nAnzxz/+kbq6On79619z9913M3bsWG6//Xav70RlZSUff/wxv/rVr/j1r39NWVkZjz322KDZ3djYyNq1aznllFNs8WKRmZnJcccdx8qVK9Fa88ADD/DRRx9x2WWXcf/99/PjH/+YxMREcnNzueGGGwD4f//v//HXv/7VFjKDhcPh4MILL+T111/nwIED3fZv376d+++/nzlz5vCHP/yB8847j+eee84+Fx1//PFs3bqVyspK+znl5eXs3LmT4447blBt98W0adMYM2aMnXPW13dl9erV9nnlnnvu4Te/+Y2XWA5HRMAEkRNOOIFNmzaxf/9+9u/fz6ZNm2wvgcXRRx/N7NmzKSgooKSkhJ/85Cfs2rWr22yIM888k9mzZ5Ofn09WVtaQ2P/OO+/Y9s6aNYvm5mY2btzotea8885jxowZjB49mmuuuYa6ujqvpMzOzk5++MMfMmnSJIqKikhISAi6ncH4nI866igAPvvsM/s57733HvPmzUMpFXSbg8XcuXM57rjjKCgo4MILL6S1tZWtW7eG2qywxJ/vc2/897//5aSTTuLEE0+kqKiIhQsX2t7GoSAmJoarrrqK9957jx/84Af85je/4ZlnnmHnzp0AbNq0ia1bt3L99dczfvx4CgsLueSSS0hOTuaTTz6xj9PR0cE111xDSUkJU6ZM4fLLL+ejjz6itrZ2UOyuqKhAa83IkSN97h85ciRNTU1s27aNjz/+mJ/85CccddRRjBgxgunTpzNnzhwcDocdxsnIyCAzM3NQPUYWRx11FCUlJT5zXv7zn/8wffp0Fi5cSFFREfPmzeO0007jlVdeAWDUqFGMGTOGDz/80H7OBx98wMSJE23P71AzcuRIqqqq/PquvPjii8yZM4fzzz+f4uJiSkpKOPvss0Nit79ICCmIpKenc+ihh/Luu++iteawww4jPT3da01FRQXPPfccW7dupaGhwfYIVFdXe50cx40bN6S27927l61bt3LjjTcCxslzzpw5vP3220ydOtVeV1paat9PTU2lqKiIPXv22NtiY2MZM2bMoNoajM85Pj6eE044gXfeeYc5c+awfft2du3aFbbJqBaen21iYiJJSUnU1dWF0KLwxN/vc1/HOOWUU7y2TZgwgfXr1wfd3p44+uijOeyww9i0aRNbtmxhzZo1vPLKK1x55ZW0trbS2trK5Zdf7vWc9vZ2Ly9Abm6uV+5PaWkpWmv27t1rhx1CQVVVFQ6Hww6PhQvf//73WbJkiR0astizZ0+3cO2kSZN49dVXcblcOBwO29O3cOFCeyDhggULhtJ8L7TWKKUoKyvr87tSVlbGySefHAoz+40ImCBz0kknsXTpUgCv/AqLe+65h7y8PK644gqysrLQWnPDDTd4hWHA+HEaSt5++206Ozu54oor7G1aa+Li4ny+j56Ij48fEg9GMD7nk08+mV/84hccOHCAd999l2nTpnnl0QwlSqlu4Y3Ozs5u67om4/l6Xqjw9z0MBX19n8PJ1r6Ij49nxowZzJgxg4ULF/Lwww+zfPlyTjnlFLKysrjtttu6PWcovBU9UVBQgFKK3bt3255OT/bs2UNKSkq38FK4MGXKFGbOnMkzzzwTcO7hsccey9NPP8327dtpb2/nwIEDzJkzZ3AM9YM9e/aQn59Pa2trn9+VcP179IYImCAza9YsnE4nSilmzZrlta+hoYG9e/dyxRVXcMghhwCGGzjUdHZ28t5773HJJZcwY8YMr32///3v+fDDD2138JYtW+xqn8bGRioqKnp0FQ8mwficR48ezfjx43nrrbf48MMPu12dDCXp6eleLv3m5maqqqpCZk9/CJf34M/3OS8vz/ZgWBcLZWVlXmuLiorYtm0bc+fOtbdt27Zt0O3vi+LiYj777DPGjRtHbW0tDoej10T56upqrwqsLVu2oJSiqKhoUOxLS0tjxowZrFixggULFnj9MNbW1vLhhx9ywgknMHr0aLTWbNy4sdvfCbArL7vmBw4F3//+9/nFL37h9RmNHDmSzZs3e63bvHkzRUVFdqVlTk4OU6ZM4cMPP6S9vZ0ZM2YMSh6gP6xfv55du3Zx5plnkpOT0+d3ZcyYMaxbt44TTzxxiC3tPyJggozD4eD++++373uSkpJCWloab775JllZWVRXV/P000+HwkwvvvjiC5qamjjppJO6XbnNnj2bd955x87Kf+GFF0hLSyMjI4Nnn32WtLQ0n1dZg02wPueTTjqJxx9/nISEhJC8D4tp06bx7rvvcvjhh5OSksJzzz0Xcf0bwuU9+PN9vuWWW4iPj2fZsmWcfvrpbN261SsxHOC0007jkUceYdy4cUyaNImVK1eyc+dORowYMSTvo6GhgT/+8Y+ceOKJjBkzhqSkJLZt28a//vUvjjjiCKZPn05paSm///3vufjiiyksLKSmpobVq1dz1FFHMX78eMAoD37wwQf5n//5H1paWvjb3/7GMcccM6jho8svv5xbb72VO++8kwsuuID8/Hx2797N3//+d7Kzs7nwwgtJTU1l7ty5/OUvf+Gyyy6jpKSE/fv3U1dXx5w5c8jLy0MpxRdffMFhhx1GfHz8kHmmR48ezfHHH8/rr79ub1uwYAE333wzzz//PHPmzGHLli3897//ZdGiRV7PPe6441i+fDlOp5NLL710SOx1Op3U1tZ6lVG//PLLHHbYYcydOxelVJ/flYULF7JkyRIKCgqYM2cOLpeL1atXe/XFCTdEwAwCPblvHQ4H1113HX/729+44YYbKCoq4rLLLvPp1htK3n77baZPn+7T7qOPPppXXnnFThy86KKLeOKJJ+wy6l/96ldD1qOmK8H4nI877jiefPJJjj322CF3oWqt7ZDQd7/7Xaqqqrj77rtJTk7mggsuiAgPTDi+B3++zwcOHODaa6/lH//4B2+99RbTpk3jvPPO469//au99vjjj2ffvn38/e9/p6Ojg2OOOYZ58+YNWdJ0YmIiEydO5NVXX2Xfvn10dnaSk5PDySefzDnnnINSiptvvplly5bx0EMPUV9fT2ZmJocccojXVX9BQQGzZ8/mrrvuorGxkcMPP7zbj26wKSws5O6772b58uXcf//9NDY2kpmZyZFHHsl5551nJ+guWrSIZcuWsXTpUhoaGsjNzbUTR7OzsznvvPN45pln+Mtf/sIJJ5wwpE0qzz//fFauXGk/HjduHD//+c9Zvnw5L7zwAllZWZx//vndwkxHH300jz/+OA6HY8guitasWcOPf/xjYmJiSElJYcyYMVx22WXMnTvXvojo67sydepUrr/+el544QVefvllkpKSbA92uCLTqAW/GMqumENJVVUV1157LXfdddeQJ07feeedFBQUBJRjFG5Ew3sIhNtvv53MzEyuvfbaUJviF1YfmKHoWyMIQ01k+agFIUhYLtdnn32W0tLSIRUvjY2NfPHFF2zcuHHIG+YFi2h4D33R1tbGf/7zH8rLy9mzZw/Lly9n3bp1XjkxgiCEDgkhCcOSzZs3s3jxYgoLC+2GWUPFX/7yF7Zt28aCBQs48sgjh/S1g0U0vIe+UErx5Zdf8uKLL9LR0UFRURE33HCDz4RTQRCGHgkhCYIgCIIQcUgISRAEQRCEiEMEjCAIgiAIEYcIGEEQBEEQIg5J4g2Ql156iVWrVrFnzx7i4+MpLS3l4osv9urY2N7ezlNPPcXKlSvp6Ohg5syZLFq0yG4cVVZWxssvv8zmzZupr68nPz+fb33rW5xxxhn2MTZt2sTTTz/Nnj17aGtrIy8vj/nz54d0roYgCIIghAsiYAJk48aNnHrqqYwfP57Ozk6WLVvGHXfcwR//+Ee7S+STTz7J6tWruf7660lOTmbp0qXcd9993H777YAxlj0jI4Nrr72WnJwcNm/ezF//+lccDgennXYaAAkJCZx66qmMGTOGhIQENm3axKOPPkpiYiLz588P2fsXBEEQhHBAqpAGSH19PYsWLeK2225jypQpNDc388Mf/pDrrruOo48+GjAGav385z/njjvu8Jrm7Mljjz3Gnj17+N///d8eX+sPf/gDCQkJEdNESxAEQRAGC8mBGSDNzc0Admvs7du309nZ6dXca+TIkeTm5rJly5Zej2Mdwxc7duxg8+bNYTd6XhAEQRBCgYSQBoDL5eKJJ55g0qRJjB49GjCmrcbGxnZrt5+RkeE1qdeTzZs38/HHH3PTTTd123fllVdSX19PZ2cn5513HieffHLQ34cgCIIgRBoiYAbA0qVLKS8vZ8mSJf0+xq5du7j33ntZuHAhM2fO7LZ/yZIltLa2smXLFp555hkKCgo47rjjBmK2IAiCIEQ8ImD6ydKlS1m9ejWLFy8mJyfH3p6ZmYnT6aSpqcnLC1NXV9dtfP3u3bu5/fbbmT9/Pueee67P18nPzweM8e51dXX885//FAEjCIIgDHskByZAtNYsXbqUVatW8dvf/tYWGBbjxo0jJiaGdevW2dv27t1LdXW1VwJveXk5ixcvZu7cuVx44YV+v7bT6QzOGxEEQRCECEY8MAGydOlSPvzwQ375y1+SlJRk57UkJycTHx9PcnIyJ510Ek899RSpqakkJyfz+OOPU1paaguYXbt2sWTJEmbOnMmCBQvsYzgcDtLT0wH473//S25uLiNHjgTg66+/5t///jenn376kL9nQRAEQQg3pIw6QM4//3yf26+66irmzZsHuBvZffTRRzidzm6N7JYvX87zzz/f7Rh5eXk8+OCDALz++uu8+eabVFVV4XA4KCgo4OSTT2b+/Pk4HOI4EwRBEIY3ImAEQRAEQYg45FJeEARBEISIQwSMIAiCIAgRhwgYQRAEQRAiDhEwgiAIgiBEHCJgBEEQBEGIOETACIIgCIIQcYiAEQRBEAQh4hABIwjCgFi+fHmPDR5DRTjaJAhCcBEBIwhCSHjjjTd49913+/38trY2li9fzoYNG4JnlCAIEYMIGEEQQsKKFSsGLGCef/55nwLm3HPP5R//+McArBMEIdyRYY6CIEQdMTExxMTEhNoMQRAGEZmFJAiC32zatIknn3ySXbt2kZ2dzVlnnUVNTQ3PP/88y5cvB+Cdd97h/fffp7y8nObmZkaMGMHpp5/OKaecYh/n6quvZv/+/V7HnjJlCrfddhsATU1N/POf/+TTTz+lrq6OnJwcTj75ZM466ywcDgdVVVVcc8013exbuHAh559/vj0w1bIJjEGsp556KlOmTGH58uVUVVVRUlLCFVdcwejRo/m///s/XnnlFQ4ePMjEiRO56qqryM/P9zr+N998w/Lly9myZQudnZ2MHz+eCy+8kMmTJwfrIxYEwU/EAyMIgl/s2rWLO+64g/T0dM477zw6OztZvny5PWXdYsWKFYwaNYojjjiCmJgYvvjiCx577DFcLhennXYaAJdeeil/+9vfSExM5Oyzzwawj9PW1sZtt93GwYMHmT9/Prm5uWzevJlly5ZRW1vLD37wA9LT01m0aBGPPfYYRx11FEcddRQAY8aM6fU9bNq0ic8//5xTTz0VgJdffpm7776bs846ixUrVnDqqafS2NjIK6+8wl/+8hf+93//137u+vXr+d3vfse4ceM477zzUErx7rvvsmTJEpYsWcKECROC8TELguAnImAEQfCL5557Dq01S5YsITc3F4DZs2dz4403eq1bvHgx8fHx9uPTTjuNO++8k1dffdUWMEcddRTPPfccaWlpnHDCCV7P/89//kNlZSX33nsvhYWFAHzrW98iOzubV155hQULFpCbm8vRRx/NY489xujRo7sdoyf27t3L/fffb3tWUlNT+etf/8qLL77In/70J5KSkgBwuVy8/PLLVFVVkZ+fj9aaRx99lKlTp/LrX/8apZRt1/XXX8+zzz7LrbfeGuhHKgjCAJAkXkEQ+sTlcrF27VqOPPJIW7wAFBcXM3PmTK+1nuKlubmZ+vp6pkyZwr59+2hubu7ztT755BMOOeQQUlJSqK+vt/9Nnz4dl8vF119/3e/3MW3aNK+wkOU1mT17ti1eACZOnAhAVVUVAGVlZVRUVHDcccfR0NBg29Ta2sq0adP4+uuvcblc/bZLEITAEQ+MIAh9Ul9fT3t7u+0R8aSoqIgvv/zSfrxp0yb++c9/smXLFtra2rzWNjc3k5yc3OtrVVRUsHPnThYtWuRzf11dXT/egYGn+AJsW3Jycnxub2xstG0CePDBB3s8dnNzM6mpqf22TRCEwBABIwhC0KisrOT222+nqKiISy65hJycHGJjY/nyyy959dVX/fJSaK2ZMWMGZ511ls/9RUVF/bbP4fDtdO5pu6dNABdffDElJSU+1yQmJvbbLkEQAkcEjCAIfZKenk58fLztifBk79699v0vvviCjo4OfvWrX3l5OwJpNjdixAhaW1uZMWNGr+usPJShYMSIEYDhmenLLkEQhgbJgREEoU8cDgczZ87ks88+o7q62t6+e/du1q5d67UO3B4LMEIrvhrWJSYm0tTU1G37Mcccw5YtW1izZk23fU1NTXR2dgKQkJBgH3+wGTduHCNGjODf//43ra2t3fbX19cPug2CIHgjHhhBEPzi/PPPZ82aNfz2t7/llFNOweVy8frrrzNq1Ch27twJwMyZM4mNjeWee+5h/vz5tLa28tZbb5Genk5NTY3X8caOHcv//d//8cILL1BQUEBGRgbTpk3jrLPO4vPPP+eee+5h7ty5jBs3jra2Nnbt2sUnn3zCgw8+aHuEiouLWblyJYWFhaSmpjJq1ChGjx4d9PfucDi48sor+d3vfsf111/PvHnzyM7O5uDBg2zYsIGkpCRuuummoL+uIAg9IwJGEAS/GDNmDLfccgtPPfUUy5cvJycnh/PPP5+amhpbwBQVFXH99dfz3HPP8fe//53MzExOOeUU0tPT+ctf/uJ1vIULF1JdXc0rr7xCS0sLU6ZMYdq0aSQkJLB48WJefPFFPvnkE95//32SkpIoKiri/PPP90oCvvLKK3n88cd58skncTqdLFy4cFAEDMDUqVO58847ef7553njjTdobW0lMzOTCRMm8K1vfWtQXlMQhJ6RTryCIAiCIEQckgMjCIIgCELEIQJGEARBEISIQwSMIAiCIAgRhwgYQRAEQRAiDhEwgiAIgiBEHCJgBEEQBEGIOETACIIgCIIQcYiAEQRBEAQh4hABIwiCIAhCxCECRhAEQRCEiEMEjCAIgiAIEYcIGEEQBEEQIg4RMIIgCIIgRBz/P5ONgHHGCvlgAAAAAElFTkSuQmCC", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# evb_backtest.portfolio._equity.plot(y = 'COST'), evb_backtest.portfolio._equity.plot(y = 'AAPL'), evb_backtest.portfolio._equity.plot(y = 'NVDA')\n", - "# for col in evb_backtest.portfolio._equity.columns:\n", - "# if col not in ['cash', 'Total']:\n", - "# evb_backtest.portfolio._equity.plot(y = col)\n", - "# plt.show()\n", - "evb_backtest.portfolio._equity.plot(y = 'AAPL')" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "name": "Equity Curve", - "showlegend": true, - "type": "scatter", - "x": [ - "2023-02-03T00:00:00", - "2023-02-06T00:00:00", - "2023-02-07T00:00:00", - "2023-02-08T00:00:00", - "2023-02-09T00:00:00", - "2023-02-10T00:00:00", - "2023-02-13T00:00:00", - "2023-02-14T00:00:00", - "2023-02-15T00:00:00", - "2023-02-16T00:00:00", - "2023-02-17T00:00:00", - "2023-02-20T00:00:00", - "2023-02-21T00:00:00", - "2023-02-22T00:00:00", - "2023-02-23T00:00:00", - "2023-02-24T00:00:00", - "2023-02-27T00:00:00", - "2023-02-28T00:00:00", - "2023-03-01T00:00:00", - "2023-03-02T00:00:00", - "2023-03-03T00:00:00", - "2023-03-06T00:00:00", - "2023-03-07T00:00:00", - "2023-03-08T00:00:00", - "2023-03-09T00:00:00", - "2023-03-10T00:00:00", - "2023-03-13T00:00:00", - "2023-03-14T00:00:00", - "2023-03-15T00:00:00", - "2023-03-16T00:00:00", - "2023-03-17T00:00:00", - "2023-03-20T00:00:00", - "2023-03-21T00:00:00", - "2023-03-22T00:00:00", - "2023-03-23T00:00:00", - "2023-03-24T00:00:00", - "2023-03-27T00:00:00", - "2023-03-28T00:00:00", - "2023-03-29T00:00:00", - "2023-03-30T00:00:00", - "2023-03-31T00:00:00", - "2023-04-03T00:00:00", - "2023-04-04T00:00:00", - "2023-04-05T00:00:00", - "2023-04-06T00:00:00", - "2023-04-07T00:00:00", - "2023-04-10T00:00:00", - "2023-04-11T00:00:00", - "2023-04-12T00:00:00", - "2023-04-13T00:00:00", - "2023-04-14T00:00:00", - "2023-04-17T00:00:00", - "2023-04-18T00:00:00", - "2023-04-19T00:00:00", - "2023-04-20T00:00:00", - "2023-04-21T00:00:00", - "2023-04-24T00:00:00", - "2023-04-25T00:00:00", - "2023-04-26T00:00:00", - "2023-04-27T00:00:00", - "2023-04-28T00:00:00", - "2023-05-01T00:00:00", - "2023-05-02T00:00:00", - "2023-05-03T00:00:00", - "2023-05-04T00:00:00", - "2023-05-05T00:00:00", - "2023-05-08T00:00:00", - "2023-05-09T00:00:00", - "2023-05-10T00:00:00", - "2023-05-11T00:00:00", - "2023-05-12T00:00:00", - "2023-05-15T00:00:00", - "2023-05-16T00:00:00", - "2023-05-17T00:00:00", - "2023-05-18T00:00:00", - "2023-05-19T00:00:00", - "2023-05-22T00:00:00", - "2023-05-23T00:00:00", - "2023-05-24T00:00:00", - "2023-05-25T00:00:00", - "2023-05-26T00:00:00", - "2023-05-29T00:00:00", - "2023-05-30T00:00:00", - "2023-05-31T00:00:00", - "2023-06-01T00:00:00", - "2023-06-02T00:00:00", - "2023-06-05T00:00:00", - "2023-06-06T00:00:00", - "2023-06-07T00:00:00", - "2023-06-08T00:00:00", - "2023-06-09T00:00:00", - "2023-06-12T00:00:00", - "2023-06-13T00:00:00", - "2023-06-14T00:00:00", - "2023-06-15T00:00:00", - "2023-06-16T00:00:00", - "2023-06-19T00:00:00", - "2023-06-20T00:00:00", - "2023-06-21T00:00:00", - "2023-06-22T00:00:00", - "2023-06-23T00:00:00", - "2023-06-26T00:00:00", - "2023-06-27T00:00:00", - "2023-06-28T00:00:00", - "2023-06-29T00:00:00", - "2023-06-30T00:00:00", - "2023-07-03T00:00:00", - "2023-07-04T00:00:00", - "2023-07-05T00:00:00", - "2023-07-06T00:00:00", - "2023-07-07T00:00:00", - "2023-07-10T00:00:00", - "2023-07-11T00:00:00", - "2023-07-12T00:00:00", - "2023-07-13T00:00:00", - "2023-07-14T00:00:00", - "2023-07-17T00:00:00", - "2023-07-18T00:00:00", - "2023-07-19T00:00:00", - "2023-07-20T00:00:00", - "2023-07-21T00:00:00", - "2023-07-24T00:00:00", - "2023-07-25T00:00:00", - "2023-07-26T00:00:00", - "2023-07-27T00:00:00", - "2023-07-28T00:00:00", - "2023-07-31T00:00:00", - "2023-08-01T00:00:00", - "2023-08-02T00:00:00", - "2023-08-03T00:00:00", - "2023-08-04T00:00:00", - "2023-08-07T00:00:00", - "2023-08-08T00:00:00", - "2023-08-09T00:00:00", - "2023-08-10T00:00:00", - "2023-08-11T00:00:00", - "2023-08-14T00:00:00", - "2023-08-15T00:00:00", - "2023-08-16T00:00:00", - "2023-08-17T00:00:00", - "2023-08-18T00:00:00", - "2023-08-21T00:00:00", - "2023-08-22T00:00:00", - "2023-08-23T00:00:00", - "2023-08-24T00:00:00", - "2023-08-25T00:00:00", - "2023-08-28T00:00:00", - "2023-08-29T00:00:00", - "2023-08-30T00:00:00", - "2023-08-31T00:00:00", - "2023-09-01T00:00:00", - "2023-09-04T00:00:00", - "2023-09-05T00:00:00", - "2023-09-06T00:00:00", - "2023-09-07T00:00:00", - "2023-09-08T00:00:00", - "2023-09-11T00:00:00", - "2023-09-12T00:00:00", - "2023-09-13T00:00:00", - "2023-09-14T00:00:00", - "2023-09-15T00:00:00", - "2023-09-18T00:00:00", - "2023-09-19T00:00:00", - "2023-09-20T00:00:00", - "2023-09-21T00:00:00", - "2023-09-22T00:00:00", - "2023-09-25T00:00:00", - "2023-09-26T00:00:00", - "2023-09-27T00:00:00", - "2023-09-28T00:00:00", - "2023-09-29T00:00:00", - "2023-10-02T00:00:00", - "2023-10-03T00:00:00", - "2023-10-04T00:00:00", - "2023-10-05T00:00:00", - "2023-10-06T00:00:00", - "2023-10-09T00:00:00", - "2023-10-10T00:00:00", - "2023-10-11T00:00:00", - "2023-10-12T00:00:00", - "2023-10-13T00:00:00", - "2023-10-16T00:00:00", - "2023-10-17T00:00:00", - "2023-10-18T00:00:00", - "2023-10-19T00:00:00", - "2023-10-20T00:00:00", - "2023-10-23T00:00:00", - "2023-10-24T00:00:00", - "2023-10-25T00:00:00", - "2023-10-26T00:00:00", - "2023-10-27T00:00:00", - "2023-10-30T00:00:00", - "2023-10-31T00:00:00", - "2023-11-01T00:00:00", - "2023-11-02T00:00:00", - "2023-11-03T00:00:00", - "2023-11-06T00:00:00", - "2023-11-07T00:00:00", - "2023-11-08T00:00:00", - "2023-11-09T00:00:00", - "2023-11-10T00:00:00", - "2023-11-13T00:00:00", - "2023-11-14T00:00:00", - "2023-11-15T00:00:00", - "2023-11-16T00:00:00", - "2023-11-17T00:00:00", - "2023-11-20T00:00:00", - "2023-11-21T00:00:00", - "2023-11-22T00:00:00", - "2023-11-23T00:00:00", - "2023-11-24T00:00:00", - "2023-11-27T00:00:00", - "2023-11-28T00:00:00", - "2023-11-29T00:00:00", - "2023-11-30T00:00:00", - "2023-12-01T00:00:00", - "2023-12-04T00:00:00", - "2023-12-05T00:00:00", - "2023-12-06T00:00:00", - "2023-12-07T00:00:00", - "2023-12-08T00:00:00", - "2023-12-11T00:00:00", - "2023-12-12T00:00:00", - "2023-12-13T00:00:00", - "2023-12-14T00:00:00", - "2023-12-15T00:00:00", - "2023-12-18T00:00:00", - "2023-12-19T00:00:00", - "2023-12-20T00:00:00", - "2023-12-21T00:00:00", - "2023-12-22T00:00:00", - "2023-12-25T00:00:00", - "2023-12-26T00:00:00", - "2023-12-27T00:00:00", - "2023-12-28T00:00:00", - "2023-12-29T00:00:00" - ], - "xaxis": "x", - "y": [ - 0.9999998693256619, - 0.9882687364278409, - 1.0009022641639558, - 0.9979694809395006, - 0.9891711312661348, - 0.9916527170714431, - 1.0015790602926764, - 0.9952622964246188, - 1.0076702254511603, - 1.0002254680352354, - 0.992555111909737, - 0.9758608074012993, - 0.9758608074012993, - 0.9792447880449016, - 0.9722512280481237, - 0.9661600628896396, - 0.9684035167237315, - 0.9684035167237315, - 0.9684035167237315, - 0.9684035167237315, - 0.9684035167237315, - 0.965287747879289, - 0.9451342631573912, - 0.9586701857318002, - 0.9532558167020365, - 0.9592717822906628, - 0.9558126020772026, - 0.9612269711069663, - 0.9606253745481036, - 0.9628813616438384, - 0.9651373487395732, - 0.9651373487395732, - 0.9704013186296212, - 0.9666413401367299, - 0.9756652885196692, - 0.9741612971225125, - 0.9651373487395732, - 0.9673933358353081, - 0.9711533143281995, - 0.9764172842182474, - 0.972657305725356, - 0.9846892369026083, - 0.9801772627111387, - 0.9764172842182474, - 0.9801772627111387, - 0.9801772627111387, - 0.9741612971225125, - 0.9711533143281995, - 0.980929258409717, - 0.9876972196969215, - 0.9786732713139822, - 0.9771692799168257, - 0.9816812541082953, - 0.9846892369026083, - 0.9854412326011867, - 0.9876972196969215, - 0.9816812541082953, - 0.9756652885196692, - 0.9756652885196692, - 0.9937131852855476, - 0.9899532067926563, - 0.9907052024912346, - 0.9839372412040301, - 0.9839372412040301, - 1.0095050949556914, - 0.9974731637784391, - 0.9989771551755956, - 0.9937131852855476, - 0.9974731637784391, - 0.9989771551755956, - 0.9989771551755956, - 0.9922091938883911, - 0.9937131852855476, - 0.994465180984126, - 0.9982251594770173, - 1.0042411250656436, - 0.9982251594770173, - 0.9922091938883911, - 0.9907052024912346, - 0.9959691723812825, - 1.0019851379699087, - 1.0072491078599566, - 1.0072491078599566, - 1.0080011035585348, - 1.0162730562428959, - 1.0185290433386307, - 1.0132650734485829, - 1.0102570906542696, - 0.9869452239983432, - 1.0125130777500044, - 1.011009086352848, - 1.0222890218315221, - 1.0215370261329437, - 1.0230410175301003, - 1.0290569831187266, - 1.0252970046258352, - 1.0260490003244134, - 1.0260490003244134, - 1.0222890218315221, - 1.033568957310196, - 1.0313129702144612, - 1.0283049874201482, - 1.0403369185974005, - 1.0418409099945571, - 1.0478568755831834, - 1.0568808239661227, - 1.0508648583774964, - 1.0456008884874486, - 1.0456008884874486, - 1.052368849774653, - 1.0463528841860268, - 1.0373289358030875, - 1.0350729487073527, - 1.0418409099945571, - 1.0418409099945571, - 1.0433449013917138, - 1.058384815363279, - 1.055376832568966, - 1.0681607594447968, - 1.0516168540760746, - 1.047104879884605, - 1.0493608669803398, - 1.052368849774653, - 1.0568808239661227, - 1.052368849774653, - 1.0621447938561706, - 1.0628967895547488, - 1.0613927981575924, - 1.0501128626789182, - 1.0456008884874486, - 1.0087530992571132, - 0.9952171766827043, - 0.9989771551755956, - 0.9929611895869694, - 0.9914571981898128, - 0.9914571981898128, - 0.9952171766827043, - 0.9884492153954998, - 0.9869452239983432, - 0.9773196790565413, - 0.9782220738948353, - 0.9822828506671579, - 0.9869452239983432, - 1.0012331422713303, - 0.9846892369026083, - 0.989201211094078, - 0.9974731637784391, - 1.0102570906542696, - 1.024545008927257, - 1.0230410175301003, - 1.0283049874201482, - 1.0313129702144612, - 1.0313129702144612, - 1.0042411250656436, - 0.9854412326011867, - 0.9849900351820396, - 0.9876972196969215, - 0.9741612971225125, - 0.9646861513204263, - 0.9836364429245988, - 0.9740108979827969, - 0.9789740695934135, - 0.9840876403437457, - 0.9701005203501899, - 0.9667917392764455, - 0.9701005203501899, - 0.9738604988430812, - 0.9645357521807106, - 0.9549102072389087, - 0.9558126020772026, - 0.9564141986360654, - 0.9646861513204263, - 0.9619789668055445, - 0.9642349539012793, - 0.9684461298133177, - 0.9749132928210908, - 0.9818316532480109, - 0.9773196790565413, - 0.9804780609905701, - 0.9852908334614711, - 0.9798764644317074, - 0.9761164859388161, - 0.9701005203501899, - 0.9669421384161612, - 0.9672429366955925, - 0.9585197865920845, - 0.9571661943346436, - 0.9564141986360654, - 0.9509998296063018, - 0.9387573396334474, - 0.9387573396334474, - 0.9387573396334474, - 0.9387573396334474, - 0.9387573396334474, - 0.9387573396334474, - 0.9369064275540135, - 0.9409672043263362, - 0.9452535798082323, - 0.9468327707752467, - 0.9462311742163841, - 0.9545031269007451, - 0.9499911527092755, - 0.9536007320624512, - 0.9494647557202707, - 0.958939901522357, - 0.9590151010922148, - 0.9629254787248218, - 0.9596918972209352, - 0.9613462877578074, - 0.9613462877578074, - 0.9573607105553426, - 0.9566087148567642, - 0.9575863092649161, - 0.9551047234596077, - 0.9565335152869064, - 0.96021829420994, - 0.9557063200184703, - 0.9687158456038745, - 0.9644294701219783, - 0.9692422425928793, - 0.9727766223761971, - 0.9642038714124048, - 0.9671366546368602, - 0.9747318111925006, - 0.9752582081815054, - 0.9715734292584719, - 0.9669862554971445, - 0.9696934400120263, - 0.9651814658205566, - 0.9637526739932579, - 0.9595414980812196, - 0.9569847127060535, - 0.9569847127060535, - 0.9560823178677595, - 0.957135111845769, - 0.9507571856608938 - ], - "yaxis": "y" - }, - { - "name": "Benchmark", - "showlegend": true, - "type": "scatter", - "x": [ - "2023-02-03T00:00:00", - "2023-02-06T00:00:00", - "2023-02-07T00:00:00", - "2023-02-08T00:00:00", - "2023-02-09T00:00:00", - "2023-02-10T00:00:00", - "2023-02-13T00:00:00", - "2023-02-14T00:00:00", - "2023-02-15T00:00:00", - "2023-02-16T00:00:00", - "2023-02-17T00:00:00", - "2023-02-20T00:00:00", - "2023-02-21T00:00:00", - "2023-02-22T00:00:00", - "2023-02-23T00:00:00", - "2023-02-24T00:00:00", - "2023-02-27T00:00:00", - "2023-02-28T00:00:00", - "2023-03-01T00:00:00", - "2023-03-02T00:00:00", - "2023-03-03T00:00:00", - "2023-03-06T00:00:00", - "2023-03-07T00:00:00", - "2023-03-08T00:00:00", - "2023-03-09T00:00:00", - "2023-03-10T00:00:00", - "2023-03-13T00:00:00", - "2023-03-14T00:00:00", - "2023-03-15T00:00:00", - "2023-03-16T00:00:00", - "2023-03-17T00:00:00", - "2023-03-20T00:00:00", - "2023-03-21T00:00:00", - "2023-03-22T00:00:00", - "2023-03-23T00:00:00", - "2023-03-24T00:00:00", - "2023-03-27T00:00:00", - "2023-03-28T00:00:00", - "2023-03-29T00:00:00", - "2023-03-30T00:00:00", - "2023-03-31T00:00:00", - "2023-04-03T00:00:00", - "2023-04-04T00:00:00", - "2023-04-05T00:00:00", - "2023-04-06T00:00:00", - "2023-04-07T00:00:00", - "2023-04-10T00:00:00", - "2023-04-11T00:00:00", - "2023-04-12T00:00:00", - "2023-04-13T00:00:00", - "2023-04-14T00:00:00", - "2023-04-17T00:00:00", - "2023-04-18T00:00:00", - "2023-04-19T00:00:00", - "2023-04-20T00:00:00", - "2023-04-21T00:00:00", - "2023-04-24T00:00:00", - "2023-04-25T00:00:00", - "2023-04-26T00:00:00", - "2023-04-27T00:00:00", - "2023-04-28T00:00:00", - "2023-05-01T00:00:00", - "2023-05-02T00:00:00", - "2023-05-03T00:00:00", - "2023-05-04T00:00:00", - "2023-05-05T00:00:00", - "2023-05-08T00:00:00", - "2023-05-09T00:00:00", - "2023-05-10T00:00:00", - "2023-05-11T00:00:00", - "2023-05-12T00:00:00", - "2023-05-15T00:00:00", - "2023-05-16T00:00:00", - "2023-05-17T00:00:00", - "2023-05-18T00:00:00", - "2023-05-19T00:00:00", - "2023-05-22T00:00:00", - "2023-05-23T00:00:00", - "2023-05-24T00:00:00", - "2023-05-25T00:00:00", - "2023-05-26T00:00:00", - "2023-05-29T00:00:00", - "2023-05-30T00:00:00", - "2023-05-31T00:00:00", - "2023-06-01T00:00:00", - "2023-06-02T00:00:00", - "2023-06-05T00:00:00", - "2023-06-06T00:00:00", - "2023-06-07T00:00:00", - "2023-06-08T00:00:00", - "2023-06-09T00:00:00", - "2023-06-12T00:00:00", - "2023-06-13T00:00:00", - "2023-06-14T00:00:00", - "2023-06-15T00:00:00", - "2023-06-16T00:00:00", - "2023-06-19T00:00:00", - "2023-06-20T00:00:00", - "2023-06-21T00:00:00", - "2023-06-22T00:00:00", - "2023-06-23T00:00:00", - "2023-06-26T00:00:00", - "2023-06-27T00:00:00", - "2023-06-28T00:00:00", - "2023-06-29T00:00:00", - "2023-06-30T00:00:00", - "2023-07-03T00:00:00", - "2023-07-04T00:00:00", - "2023-07-05T00:00:00", - "2023-07-06T00:00:00", - "2023-07-07T00:00:00", - "2023-07-10T00:00:00", - "2023-07-11T00:00:00", - "2023-07-12T00:00:00", - "2023-07-13T00:00:00", - "2023-07-14T00:00:00", - "2023-07-17T00:00:00", - "2023-07-18T00:00:00", - "2023-07-19T00:00:00", - "2023-07-20T00:00:00", - "2023-07-21T00:00:00", - "2023-07-24T00:00:00", - "2023-07-25T00:00:00", - "2023-07-26T00:00:00", - "2023-07-27T00:00:00", - "2023-07-28T00:00:00", - "2023-07-31T00:00:00", - "2023-08-01T00:00:00", - "2023-08-02T00:00:00", - "2023-08-03T00:00:00", - "2023-08-04T00:00:00", - "2023-08-07T00:00:00", - "2023-08-08T00:00:00", - "2023-08-09T00:00:00", - "2023-08-10T00:00:00", - "2023-08-11T00:00:00", - "2023-08-14T00:00:00", - "2023-08-15T00:00:00", - "2023-08-16T00:00:00", - "2023-08-17T00:00:00", - "2023-08-18T00:00:00", - "2023-08-21T00:00:00", - "2023-08-22T00:00:00", - "2023-08-23T00:00:00", - "2023-08-24T00:00:00", - "2023-08-25T00:00:00", - "2023-08-28T00:00:00", - "2023-08-29T00:00:00", - "2023-08-30T00:00:00", - "2023-08-31T00:00:00", - "2023-09-01T00:00:00", - "2023-09-04T00:00:00", - "2023-09-05T00:00:00", - "2023-09-06T00:00:00", - "2023-09-07T00:00:00", - "2023-09-08T00:00:00", - "2023-09-11T00:00:00", - "2023-09-12T00:00:00", - "2023-09-13T00:00:00", - "2023-09-14T00:00:00", - "2023-09-15T00:00:00", - "2023-09-18T00:00:00", - "2023-09-19T00:00:00", - "2023-09-20T00:00:00", - "2023-09-21T00:00:00", - "2023-09-22T00:00:00", - "2023-09-25T00:00:00", - "2023-09-26T00:00:00", - "2023-09-27T00:00:00", - "2023-09-28T00:00:00", - "2023-09-29T00:00:00", - "2023-10-02T00:00:00", - "2023-10-03T00:00:00", - "2023-10-04T00:00:00", - "2023-10-05T00:00:00", - "2023-10-06T00:00:00", - "2023-10-09T00:00:00", - "2023-10-10T00:00:00", - "2023-10-11T00:00:00", - "2023-10-12T00:00:00", - "2023-10-13T00:00:00", - "2023-10-16T00:00:00", - "2023-10-17T00:00:00", - "2023-10-18T00:00:00", - "2023-10-19T00:00:00", - "2023-10-20T00:00:00", - "2023-10-23T00:00:00", - "2023-10-24T00:00:00", - "2023-10-25T00:00:00", - "2023-10-26T00:00:00", - "2023-10-27T00:00:00", - "2023-10-30T00:00:00", - "2023-10-31T00:00:00", - "2023-11-01T00:00:00", - "2023-11-02T00:00:00", - "2023-11-03T00:00:00", - "2023-11-06T00:00:00", - "2023-11-07T00:00:00", - "2023-11-08T00:00:00", - "2023-11-09T00:00:00", - "2023-11-10T00:00:00", - "2023-11-13T00:00:00", - "2023-11-14T00:00:00", - "2023-11-15T00:00:00", - "2023-11-16T00:00:00", - "2023-11-17T00:00:00", - "2023-11-20T00:00:00", - "2023-11-21T00:00:00", - "2023-11-22T00:00:00", - "2023-11-23T00:00:00", - "2023-11-24T00:00:00", - "2023-11-27T00:00:00", - "2023-11-28T00:00:00", - "2023-11-29T00:00:00", - "2023-11-30T00:00:00", - "2023-12-01T00:00:00", - "2023-12-04T00:00:00", - "2023-12-05T00:00:00", - "2023-12-06T00:00:00", - "2023-12-07T00:00:00", - "2023-12-08T00:00:00", - "2023-12-11T00:00:00", - "2023-12-12T00:00:00", - "2023-12-13T00:00:00", - "2023-12-14T00:00:00", - "2023-12-15T00:00:00", - "2023-12-18T00:00:00", - "2023-12-19T00:00:00", - "2023-12-20T00:00:00", - "2023-12-21T00:00:00", - "2023-12-22T00:00:00", - "2023-12-25T00:00:00", - "2023-12-26T00:00:00", - "2023-12-27T00:00:00", - "2023-12-28T00:00:00", - "2023-12-29T00:00:00" - ], - "xaxis": "x", - "y": [ - null, - 0.9938886395199485, - 1.0068873439938246, - 0.9958772591685023, - 0.9872438227530799, - 0.9895477203957848, - 1.001164012275119, - 1.000703306755497, - 1.0039529643717362, - 0.9901297265333443, - 0.987656126439797, - 0.987656126439797, - 0.9678428287392912, - 0.9665090400044107, - 0.9716502915766376, - 0.9612707627396174, - 0.964544695281228, - 0.9609797596708376, - 0.9572935234425097, - 0.9647386726574416, - 0.980210977224865, - 0.9808900090549909, - 0.9658542090907372, - 0.9674305990614924, - 0.9495816460841692, - 0.9358797088637147, - 0.9345458461199155, - 0.9499939497708865, - 0.9440523657505961, - 0.960615931825944, - 0.9457741832468227, - 0.9548683991907861, - 0.9674063241361214, - 0.9509154348190497, - 0.953486134614082, - 0.9597429226196047, - 0.9615374908830262, - 0.95937916878363, - 0.9733236332310407, - 0.9790226900243749, - 0.9928216529373957, - 0.996604840849371, - 0.9910755605157979, - 0.9884806598043132, - 0.9923365984834834, - 0.9923365984834834, - 0.9933551092242128, - 0.9936219113765402, - 0.9895719213122375, - 1.0027161273205036, - 1.0002667281434088, - 1.0038559386791706, - 1.0045106955839251, - 1.0043409931330827, - 0.9988601886413334, - 0.9996362461640255, - 1.0006790318301262, - 0.9847944235759855, - 0.9806232069026641, - 1.0001455015343903, - 1.0086819122572466, - 1.0076634015165171, - 0.9963380386970437, - 0.9894991705450427, - 0.9824905999421993, - 1.0006790318301262, - 1.0009457599735347, - 0.9965562909986285, - 1.001212562125862, - 0.9994664697042643, - 0.9981568818858364, - 1.001600590887208, - 0.994907224269597, - 1.0069843696863912, - 1.0166848666932853, - 1.015205502415096, - 1.0156178061018135, - 1.0042196925151452, - 0.9969443197599744, - 1.0055777561753967, - 1.0186006615657253, - 1.0186006615657253, - 1.0189886903270713, - 1.0133381833844797, - 1.0229659296241789, - 1.0377592023614766, - 1.0357705827129227, - 1.0380259305048851, - 1.0344367199691233, - 1.0406935819835648, - 1.0425609010141812, - 1.0520188707941194, - 1.0589547646386865, - 1.060215802606372, - 1.073360008614638, - 1.0657450829399449, - 1.0657450829399449, - 1.060215802606372, - 1.054783547965365, - 1.0585910108027117, - 1.0505880563666725, - 1.0462956130843326, - 1.0577664774381959, - 1.0583000077339317, - 1.0624711503983342, - 1.0750090753436692, - 1.0762459123949022, - 1.0762459123949022, - 1.0746453215076943, - 1.0662301373938567, - 1.0635382109898057, - 1.0662301373938567, - 1.073020455695115, - 1.0816538921105376, - 1.0902388526841365, - 1.0895598208540107, - 1.0933430087659861, - 1.101467189811044, - 1.1039165889881388, - 1.0965926663822256, - 1.0965926663822256, - 1.1014914647364151, - 1.1044985951256985, - 1.1046683715854597, - 1.0973444489795465, - 1.1080878056614603, - 1.1101976519190329, - 1.1070207450699885, - 1.09162119126976, - 1.0884927602625392, - 1.083569760991897, - 1.0930277307718352, - 1.0882745079609544, - 1.0809991352057835, - 1.0813871639671295, - 1.0807566079788273, - 1.08672239291557, - 1.074063315370135, - 1.0661816615520334, - 1.0580574805069758, - 1.0585667358773403, - 1.065454079871165, - 1.0625681760909003, - 1.0744027942807384, - 1.0595125698597934, - 1.0669819199911776, - 1.0737480373759838, - 1.0892688177852308, - 1.093755312452703, - 1.0921547215654954, - 1.0941918170558729, - 1.0941918170558729, - 1.0894627951614444, - 1.08213894656445, - 1.0788165381810157, - 1.080441329984676, - 1.0875470002890044, - 1.081581141343343, - 1.0828422533199473, - 1.092178922481948, - 1.0752273276452542, - 1.0758578836335564, - 1.0736267367580463, - 1.0637565373003097, - 1.0461743864753137, - 1.0438220129907851, - 1.0482114819656914, - 1.0328119281654629, - 1.0332241578432613, - 1.0392142177053751, - 1.0366921417700041, - 1.0362798380832867, - 1.0224081244030712, - 1.029853273618003, - 1.029465244856657, - 1.041687891807841, - 1.0483569835000808, - 1.0538135130664588, - 1.05813023127417, - 1.051679391883515, - 1.0464411146187218, - 1.057451199444044, - 1.0574026495933015, - 1.0433126836115012, - 1.034145716900343, - 1.0214380895041655, - 1.0196677221571966, - 1.0273553985990844, - 1.0126106017036105, - 1.0004849804449927, - 0.9959500099356966, - 1.0078573788927296, - 1.014186991674366, - 1.0250030251145559, - 1.0446465463553005, - 1.0541772669024336, - 1.0566023911541573, - 1.0596095215434407, - 1.0603855790661327, - 1.052115896486685, - 1.068533961027643, - 1.0675154502869135, - 1.0882260321191302, - 1.0905298557529162, - 1.0918637184967155, - 1.0932217821569672, - 1.1016369662708048, - 1.0992360429355337, - 1.1034800103760498, - 1.1034800103760498, - 1.1041590422061758, - 1.1021704965665406, - 1.1032617580744648, - 1.1024857005517728, - 1.1068266936848552, - 1.1133745587680763, - 1.1075300004403523, - 1.1073117481387675, - 1.1028495283966664, - 1.111264712510504, - 1.116042210246756, - 1.1203831293709194, - 1.125500180026694, - 1.141020960435941, - 1.1446829217388974, - 1.1381835324974998, - 1.144585896046331, - 1.1515459908073507, - 1.1355887057949339, - 1.1463562633933, - 1.1486600870270862, - 1.1486600870270862, - 1.1535103355305334, - 1.1555959808716534, - 1.1560324854748232, - 1.1526858021660176 - ], - "yaxis": "y" - }, - { - "customdata": [ - 9, - 6, - 3 - ], - "hovertemplate": "%{text}

Date: %{x}
Size: %{customdata}
PnL: %{y}
", - "marker": { - "color": [ - "red", - "red", - "green" - ] - }, - "mode": "markers", - "name": "Ticker", - "showlegend": false, - "text": [ - "AAPL", - "AAPL", - "AAPL" - ], - "type": "scatter", - "x": [ - "2023-02-03T00:00:00", - "2023-03-06T00:00:00", - "2023-11-03T00:00:00" - ], - "xaxis": "x2", - "y": [ - -0.3885694342864032, - -0.5449515901575345, - 0.4159760090037718 - ], - "yaxis": "y2" - }, - { - "fill": "tozeroy", - "line": { - "color": "red" - }, - "name": "Drawdown", - "showlegend": false, - "type": "scatter", - "x": [ - "2023-02-03T00:00:00", - "2023-02-06T00:00:00", - "2023-02-07T00:00:00", - "2023-02-08T00:00:00", - "2023-02-09T00:00:00", - "2023-02-10T00:00:00", - "2023-02-13T00:00:00", - "2023-02-14T00:00:00", - "2023-02-15T00:00:00", - "2023-02-16T00:00:00", - "2023-02-17T00:00:00", - "2023-02-20T00:00:00", - "2023-02-21T00:00:00", - "2023-02-22T00:00:00", - "2023-02-23T00:00:00", - "2023-02-24T00:00:00", - "2023-02-27T00:00:00", - "2023-02-28T00:00:00", - "2023-03-01T00:00:00", - "2023-03-02T00:00:00", - "2023-03-03T00:00:00", - "2023-03-06T00:00:00", - "2023-03-07T00:00:00", - "2023-03-08T00:00:00", - "2023-03-09T00:00:00", - "2023-03-10T00:00:00", - "2023-03-13T00:00:00", - "2023-03-14T00:00:00", - "2023-03-15T00:00:00", - "2023-03-16T00:00:00", - "2023-03-17T00:00:00", - "2023-03-20T00:00:00", - "2023-03-21T00:00:00", - "2023-03-22T00:00:00", - "2023-03-23T00:00:00", - "2023-03-24T00:00:00", - "2023-03-27T00:00:00", - "2023-03-28T00:00:00", - "2023-03-29T00:00:00", - "2023-03-30T00:00:00", - "2023-03-31T00:00:00", - "2023-04-03T00:00:00", - "2023-04-04T00:00:00", - "2023-04-05T00:00:00", - "2023-04-06T00:00:00", - "2023-04-07T00:00:00", - "2023-04-10T00:00:00", - "2023-04-11T00:00:00", - "2023-04-12T00:00:00", - "2023-04-13T00:00:00", - "2023-04-14T00:00:00", - "2023-04-17T00:00:00", - "2023-04-18T00:00:00", - "2023-04-19T00:00:00", - "2023-04-20T00:00:00", - "2023-04-21T00:00:00", - "2023-04-24T00:00:00", - "2023-04-25T00:00:00", - "2023-04-26T00:00:00", - "2023-04-27T00:00:00", - "2023-04-28T00:00:00", - "2023-05-01T00:00:00", - "2023-05-02T00:00:00", - "2023-05-03T00:00:00", - "2023-05-04T00:00:00", - "2023-05-05T00:00:00", - "2023-05-08T00:00:00", - "2023-05-09T00:00:00", - "2023-05-10T00:00:00", - "2023-05-11T00:00:00", - "2023-05-12T00:00:00", - "2023-05-15T00:00:00", - "2023-05-16T00:00:00", - "2023-05-17T00:00:00", - "2023-05-18T00:00:00", - "2023-05-19T00:00:00", - "2023-05-22T00:00:00", - "2023-05-23T00:00:00", - "2023-05-24T00:00:00", - "2023-05-25T00:00:00", - "2023-05-26T00:00:00", - "2023-05-29T00:00:00", - "2023-05-30T00:00:00", - "2023-05-31T00:00:00", - "2023-06-01T00:00:00", - "2023-06-02T00:00:00", - "2023-06-05T00:00:00", - "2023-06-06T00:00:00", - "2023-06-07T00:00:00", - "2023-06-08T00:00:00", - "2023-06-09T00:00:00", - "2023-06-12T00:00:00", - "2023-06-13T00:00:00", - "2023-06-14T00:00:00", - "2023-06-15T00:00:00", - "2023-06-16T00:00:00", - "2023-06-19T00:00:00", - "2023-06-20T00:00:00", - "2023-06-21T00:00:00", - "2023-06-22T00:00:00", - "2023-06-23T00:00:00", - "2023-06-26T00:00:00", - "2023-06-27T00:00:00", - "2023-06-28T00:00:00", - "2023-06-29T00:00:00", - "2023-06-30T00:00:00", - "2023-07-03T00:00:00", - "2023-07-04T00:00:00", - "2023-07-05T00:00:00", - "2023-07-06T00:00:00", - "2023-07-07T00:00:00", - "2023-07-10T00:00:00", - "2023-07-11T00:00:00", - "2023-07-12T00:00:00", - "2023-07-13T00:00:00", - "2023-07-14T00:00:00", - "2023-07-17T00:00:00", - "2023-07-18T00:00:00", - "2023-07-19T00:00:00", - "2023-07-20T00:00:00", - "2023-07-21T00:00:00", - "2023-07-24T00:00:00", - "2023-07-25T00:00:00", - "2023-07-26T00:00:00", - "2023-07-27T00:00:00", - "2023-07-28T00:00:00", - "2023-07-31T00:00:00", - "2023-08-01T00:00:00", - "2023-08-02T00:00:00", - "2023-08-03T00:00:00", - "2023-08-04T00:00:00", - "2023-08-07T00:00:00", - "2023-08-08T00:00:00", - "2023-08-09T00:00:00", - "2023-08-10T00:00:00", - "2023-08-11T00:00:00", - "2023-08-14T00:00:00", - "2023-08-15T00:00:00", - "2023-08-16T00:00:00", - "2023-08-17T00:00:00", - "2023-08-18T00:00:00", - "2023-08-21T00:00:00", - "2023-08-22T00:00:00", - "2023-08-23T00:00:00", - "2023-08-24T00:00:00", - "2023-08-25T00:00:00", - "2023-08-28T00:00:00", - "2023-08-29T00:00:00", - "2023-08-30T00:00:00", - "2023-08-31T00:00:00", - "2023-09-01T00:00:00", - "2023-09-04T00:00:00", - "2023-09-05T00:00:00", - "2023-09-06T00:00:00", - "2023-09-07T00:00:00", - "2023-09-08T00:00:00", - "2023-09-11T00:00:00", - "2023-09-12T00:00:00", - "2023-09-13T00:00:00", - "2023-09-14T00:00:00", - "2023-09-15T00:00:00", - "2023-09-18T00:00:00", - "2023-09-19T00:00:00", - "2023-09-20T00:00:00", - "2023-09-21T00:00:00", - "2023-09-22T00:00:00", - "2023-09-25T00:00:00", - "2023-09-26T00:00:00", - "2023-09-27T00:00:00", - "2023-09-28T00:00:00", - "2023-09-29T00:00:00", - "2023-10-02T00:00:00", - "2023-10-03T00:00:00", - "2023-10-04T00:00:00", - "2023-10-05T00:00:00", - "2023-10-06T00:00:00", - "2023-10-09T00:00:00", - "2023-10-10T00:00:00", - "2023-10-11T00:00:00", - "2023-10-12T00:00:00", - "2023-10-13T00:00:00", - "2023-10-16T00:00:00", - "2023-10-17T00:00:00", - "2023-10-18T00:00:00", - "2023-10-19T00:00:00", - "2023-10-20T00:00:00", - "2023-10-23T00:00:00", - "2023-10-24T00:00:00", - "2023-10-25T00:00:00", - "2023-10-26T00:00:00", - "2023-10-27T00:00:00", - "2023-10-30T00:00:00", - "2023-10-31T00:00:00", - "2023-11-01T00:00:00", - "2023-11-02T00:00:00", - "2023-11-03T00:00:00", - "2023-11-06T00:00:00", - "2023-11-07T00:00:00", - "2023-11-08T00:00:00", - "2023-11-09T00:00:00", - "2023-11-10T00:00:00", - "2023-11-13T00:00:00", - "2023-11-14T00:00:00", - "2023-11-15T00:00:00", - "2023-11-16T00:00:00", - "2023-11-17T00:00:00", - "2023-11-20T00:00:00", - "2023-11-21T00:00:00", - "2023-11-22T00:00:00", - "2023-11-23T00:00:00", - "2023-11-24T00:00:00", - "2023-11-27T00:00:00", - "2023-11-28T00:00:00", - "2023-11-29T00:00:00", - "2023-11-30T00:00:00", - "2023-12-01T00:00:00", - "2023-12-04T00:00:00", - "2023-12-05T00:00:00", - "2023-12-06T00:00:00", - "2023-12-07T00:00:00", - "2023-12-08T00:00:00", - "2023-12-11T00:00:00", - "2023-12-12T00:00:00", - "2023-12-13T00:00:00", - "2023-12-14T00:00:00", - "2023-12-15T00:00:00", - "2023-12-18T00:00:00", - "2023-12-19T00:00:00", - "2023-12-20T00:00:00", - "2023-12-21T00:00:00", - "2023-12-22T00:00:00", - "2023-12-25T00:00:00", - "2023-12-26T00:00:00", - "2023-12-27T00:00:00", - "2023-12-28T00:00:00", - "2023-12-29T00:00:00" - ], - "xaxis": "x3", - "y": [ - 0, - -0.011731132897821017, - 0, - -0.0029301390820720696, - -0.0117205563282885, - -0.009241207874227442, - 0, - -0.006306804219802897, - 0, - -0.007388088148737482, - -0.015000057756527685, - -0.03156728572642398, - -0.03156728572642398, - -0.028209063840634152, - -0.0351493890712663, - -0.04119418846568801, - -0.03896791270315647, - -0.03896791270315647, - -0.03896791270315647, - -0.03896791270315647, - -0.03896791270315647, - -0.042059932853175885, - -0.06206000986187965, - -0.04862712231872035, - -0.054000277335984004, - -0.048030105094579945, - -0.051462954133387306, - -0.04608979911612365, - -0.04668681634026406, - -0.04444800174973751, - -0.04220918715921096, - -0.04220918715921096, - -0.03698528644798249, - -0.04071664409886, - -0.03176138573675391, - -0.03325392879710487, - -0.04220918715921118, - -0.03997037256868463, - -0.03623901491780712, - -0.03101511420657843, - -0.03474647185745605, - -0.022806127374648044, - -0.027283756555701033, - -0.03101511420657843, - -0.02728375655570081, - -0.02728375655570081, - -0.03325392879710487, - -0.03623901491780712, - -0.02653748502552533, - -0.019821041253945793, - -0.02877629961605188, - -0.030268842676403063, - -0.025791213495349852, - -0.022806127374648044, - -0.022059855844472342, - -0.019821041253945793, - -0.025791213495349852, - -0.03176138573675391, - -0.03176138573675391, - -0.013850869012541955, - -0.017582226663419243, - -0.016835955133243763, - -0.023552398904823302, - -0.023552398904823302, - 0, - -0.011918642623559905, - -0.010428812295615097, - -0.015643218443422424, - -0.011918642623560016, - -0.010428812295614875, - -0.010428812295615097, - -0.017133048771367343, - -0.015643218443422535, - -0.014898303279449854, - -0.011173727459587557, - -0.005214406147807327, - -0.011173727459587557, - -0.017133048771367565, - -0.018622879099312373, - -0.013408472951505046, - -0.007449151639724816, - -0.002234745491917378, - -0.002234745491917378, - -0.0014898303279450298, - 0, - 0, - -0.005168207632970989, - -0.008121469137525983, - -0.031009245797827156, - -0.005906523009109765, - -0.007383153761387318, - 0, - -0.0007355998527287522, - 0, - 0, - -0.0036538095874948384, - -0.0029230476699959596, - -0.0029230476699959596, - -0.006576857257490687, - 0, - -0.0021827154803979454, - -0.00509300278759528, - 0, - 0, - 0, - 0, - -0.005692188850930813, - -0.010672854095495676, - -0.010672854095495676, - -0.004269141638198137, - -0.009961330489129283, - -0.01849961376552589, - -0.02063418458462507, - -0.01423047212732742, - -0.014230472127327642, - -0.012807424914594856, - 0, - -0.0028420500540574656, - 0, - -0.015488215871860445, - -0.01971227474600401, - -0.01760024530893234, - -0.014784206059503147, - -0.010560147185359359, - -0.014784206059503036, - -0.005632078498858162, - -0.004928068686501086, - -0.006336088311215682, - -0.01689623549657482, - -0.02112029437071883, - -0.05561677517622621, - -0.06828895179865746, - -0.06476890273687097, - -0.07040098123572913, - -0.07180900086044373, - -0.07180900086044373, - -0.06828895179865746, - -0.07462504010987303, - -0.07603305973458752, - -0.08504438533276082, - -0.08419957355793228, - -0.08039792057120287, - -0.07603305973458752, - -0.06265687329979897, - -0.07814508917165952, - -0.07392103029751562, - -0.06617692236158557, - -0.05420875555151139, - -0.04083256911672284, - -0.042240588741437546, - -0.03731252005493635, - -0.03449648080550716, - -0.03449648080550716, - -0.05984083405036977, - -0.07744107935930211, - -0.0778634852467166, - -0.07532904992223022, - -0.08800122654466169, - -0.09687175018036343, - -0.07913070290895963, - -0.08814202850713293, - -0.08349556374557499, - -0.07870829702154525, - -0.09180287953139088, - -0.09490052270576299, - -0.09180287953139088, - -0.08828283046960439, - -0.097012552142835, - -0.10602387774100819, - -0.10517906596617965, - -0.10461585811629381, - -0.09687175018036343, - -0.09940618550484981, - -0.09729415606777769, - -0.09335170111857694, - -0.08729721673230417, - -0.08082032645861714, - -0.08504438533276082, - -0.08208754412086017, - -0.07758188132177357, - -0.082650751970746, - -0.08617080103253272, - -0.09180287953139099, - -0.09475972074329153, - -0.09447811681834861, - -0.10264463064169338, - -0.1039118483039363, - -0.10461585811629381, - -0.10968472876526614, - -0.1211462200274036, - -0.1211462200274036, - -0.1211462200274036, - -0.1211462200274036, - -0.1211462200274036, - -0.1211462200274036, - -0.12287891103589232, - -0.11907725804916292, - -0.11506440211872626, - -0.11358598151277599, - -0.11414918936266183, - -0.10640508142673166, - -0.11062914030087534, - -0.10724989320156031, - -0.1111219471695255, - -0.10225142353382355, - -0.10218102255258787, - -0.09852017152832993, - -0.10154741372146625, - -0.0999985921342802, - -0.0999985921342802, - -0.10372984413977393, - -0.10443385395213123, - -0.10351864119606669, - -0.10584187357684582, - -0.1045042549333669, - -0.1010546068528162, - -0.10527866572695999, - -0.09309929597317879, - -0.09711215190361533, - -0.09260648910452862, - -0.08929764298644938, - -0.09732335484732257, - -0.09457771657912906, - -0.0874672174743204, - -0.08697441060567035, - -0.09042405868622105, - -0.09471851854160052, - -0.09218408321711424, - -0.09640814209125803, - -0.09774576073473695, - -0.10168821568393771, - -0.10408184904595252, - -0.10408184904595252, - -0.10492666082078128, - -0.10394104708348106, - -0.10991210434248044 - ], - "yaxis": "y3" - }, - { - "histnorm": "percent", - "marker": { - "color": "purple" - }, - "showlegend": false, - "type": "histogram", - "xaxis": "x4", - "y": [ - null, - -0.008347152254218781, - 0.0009099906689575832, - -0.02659302765998095, - 0.0023219256034430202, - -0.009429646014123438, - 0.006114602958056103, - 0.009349910483631652, - -0.0015438832438119388, - 0.007731352524673829, - -0.001534407459945375, - 0.009220592906212799, - 0.0022840875847718323, - 0.007596274725781393, - 0.001507801272458531, - 0.0052693593069379485, - -0.0022464594438523777, - 0.01651112749988437, - -0.007383153761387318, - 0.014132333336667857, - 0.005867534192679713, - 0.024791555022106726, - -0.009961330489129283, - -0.0028747305667077283, - 0.003603773085027795, - 0.014363330157477705, - -0.05026780892318894, - -0.017145820953394342, - -0.013349162735875164, - 0.01122356243089917, - 0.03953065714724113, - -0.04212266808964249, - -0.011146444258490651, - -0.0040147162592267804, - -0.014108147114903491, - 0.01934213548561936, - 0.005090884838679477, - -0.02179527449758123, - -0.020617906815379672, - -0.0019715350243389995, - 0.018781705076338362, - 0.004727039944327327, - -0.0017250933942045688, - 0.002984855927050223, - 0.0130786185189804, - -0.0012368648121934278, - -0.012383965412988918, - -0.00915482664496503 - ], - "yaxis": "y4" - }, - { - "histnorm": "percent", - "marker": { - "color": "purple" - }, - "showlegend": false, - "type": "histogram", - "xaxis": "x5", - "y": [ - null, - 0.004392611757193521, - 0.01778211080674974, - 0.018231059341875078, - 0.0484917301083827, - 0.005692188850931146, - -0.037497309371076204, - -0.0651262400991609, - -0.018461754165461586, - 0.01893598852650502, - -0.006038944840224936 - ], - "yaxis": "y5" - } - ], - "layout": { - "annotations": [ - { - "font": { - "size": 16 - }, - "showarrow": false, - "text": "EQUITY CURVE", - "x": 0.5, - "xanchor": "center", - "xref": "paper", - "y": 0.9999999999999999, - "yanchor": "bottom", - "yref": "paper" - }, - { - "font": { - "size": 16 - }, - "showarrow": false, - "text": "TRADES", - "x": 0.5, - "xanchor": "center", - "xref": "paper", - "y": 0.5576923076923076, - "yanchor": "bottom", - "yref": "paper" - }, - { - "font": { - "size": 16 - }, - "showarrow": false, - "text": "PORTFOLIO DRAWDOWN", - "x": 0.5, - "xanchor": "center", - "xref": "paper", - "y": 0.3769230769230769, - "yanchor": "bottom", - "yref": "paper" - }, - { - "font": { - "size": 16 - }, - "showarrow": false, - "text": "WEEKLY PORTFOLIO RTRNS", - "x": 0.2375, - "xanchor": "center", - "xref": "paper", - "y": 0.13076923076923078, - "yanchor": "bottom", - "yref": "paper" - }, - { - "font": { - "size": 16 - }, - "showarrow": false, - "text": "MONTHLY PORTFOLIO RTRNS", - "x": 0.7625, - "xanchor": "center", - "xref": "paper", - "y": 0.13076923076923078, - "yanchor": "bottom", - "yref": "paper" - } - ], - "height": 1050, - "hovermode": "x unified", - "margin": { - "b": 20, - "l": 15, - "r": 15, - "t": 50 - }, - "paper_bgcolor": "WHITE", - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "heatmapgl": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmapgl" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "width": 1200, - "xaxis": { - "anchor": "y", - "domain": [ - 0, - 1 - ] - }, - "xaxis2": { - "anchor": "y2", - "domain": [ - 0, - 1 - ] - }, - "xaxis3": { - "anchor": "y3", - "domain": [ - 0, - 1 - ] - }, - "xaxis4": { - "anchor": "y4", - "domain": [ - 0, - 0.475 - ] - }, - "xaxis5": { - "anchor": "y5", - "domain": [ - 0.525, - 1 - ] - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0.6076923076923076, - 0.9999999999999999 - ] - }, - "yaxis2": { - "anchor": "x2", - "domain": [ - 0.42692307692307685, - 0.5576923076923076 - ] - }, - "yaxis3": { - "anchor": "x3", - "domain": [ - 0.1807692307692308, - 0.3769230769230769 - ] - }, - "yaxis4": { - "anchor": "x4", - "domain": [ - 0, - 0.13076923076923078 - ] - }, - "yaxis5": { - "anchor": "x5", - "domain": [ - 0, - 0.13076923076923078 - ] - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "evb_backtest.portfolio.plot_portfolio()" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Start 2023-02-03 00:00:00\n", - "End 2023-12-29 00:00:00\n", - "Duration 329 days 00:00:00\n", - "Exposure Time [%] 96.19\n", - "Equity Final [$] 18964.68\n", - "Equity Peak [$] 21306.521211\n", - "Return [%] -4.924298\n", - "Buy & Hold Return [%] 24.614886\n", - "CAGR [%] -5.448189\n", - "Volatility Ann. [%] 12.443389\n", - "Sharpe Ratio -0.388091\n", - "Sortino Ratio -0.516461\n", - "Skew -0.3304\n", - "Calmar Ratio 0.443379\n", - "Max. Drawdown [%] -12.287891\n", - "Max. Drawdown Value [$] -2618.12\n", - "Avg. Drawdown [%] -5.116593\n", - "Max. Drawdown Duration 163 days 00:00:00\n", - "Avg Dradown Duration 51 days 20:20:20.338983051\n", - "# Trades 3\n", - "Win Rate [%] 33.33\n", - "Lose Rate [%] 66.67\n", - "Avg. Trade [%] -17.251501\n", - "Avg. Winning Trade [%] 41.597601\n", - "Avg. Losing Trade [%] -46.676051\n", - "Best Trade [%] 41.597601\n", - "Worst Trade [%] -54.495159\n", - "Avg Trade Duration 104.666667\n", - "Avg Win Trade Duration 56.0\n", - "Avg Lose Duration 129.0\n", - "Max Trade Duration 234\n", - "Max Win Trade Duration 56\n", - "Max Lose Duration 234\n", - "Profit Factor 0.18778\n", - "Expectancy [%] -17.254443\n", - "SQN -0.709759\n", - "2023 Return [%] -4.924298\n", - "Winning Streak 1\n", - "Losing Streak 2\n", - "_strategy None\n", - "equity_curve AAPL cash commissi...\n", - "_trades Ticker PnL ReturnPct EntryPrice E...\n", - "_tickers [AAPL]\n", - "dtype: object" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "evb_backtest.portfolio.aggregate()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## ***ANALYZE POSITIONS***" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[0;31mSignature:\u001b[0m\n", - "\u001b[0mCalculate\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mattribution\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0masset\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mts_start\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mts_end\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mts_timeframe\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'day'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mts_timewidth\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'1'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mmethod\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'GB'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mreplace\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'partial'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mreturn_both_data\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mDocstring:\u001b[0m\n", - "Calculate attribution of option asset \n", - "\n", - "Parameter:\n", - "____________\n", - "ts_start (str | Datetime): Start date if timeseries\n", - "ts_end (str | Datetime): End date if timeseries \n", - "ts_timewidth (int): Examples 1,2,3,4. The span over the timeframe\n", - "ts_timeframe (str): The timeframe for aggregation, eg: Minute, Hour, Day, Month, Week, Year\n", - "method (str): Available methods are 'GB' for Greek Based and 'RV' for Revaluation\n", - "replace (str): Available options are 'partial', 'close', 'default_fill'. Partial replaces only the missing data, Close uses close data to fill, default_fill uses the default fill for all data\n", - "return_both_data (bool): If True. Will return both the PnL Data and Full Data\n", - "return_all: specific to OptionStructure. If True, will return all the data for the long and short leg\n", - "\u001b[0;31mFile:\u001b[0m ~/cloned_repos/QuantTools/trade/assets/Calculate.py\n", - "\u001b[0;31mType:\u001b[0m function" - ] - } - ], - "source": [ - "create_object_from_id?\n", - "Calculate.attribution?" - ] - }, - { - "cell_type": "code", - "execution_count": 61, - "metadata": {}, - "outputs": [], - "source": [ - "trades['structure_object'] = trades.apply(lambda x: create_object_from_id(x['Positions'], date = x['ExitTime'].strftime('%Y-%m-%d')), axis=1)" - ] - }, - { - "cell_type": "code", - "execution_count": 62, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "('2023-03-06', '2023-10-26')" - ] - }, - "execution_count": 62, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "trades[preferred_cols+['structure_object']]\n", - "focus_index = 1\n", - "focus_object = trades.iloc[focus_index].structure_object\n", - "quantity = trades.iloc[focus_index].Quantity\n", - "ticker = trades.iloc[focus_index].Ticker\n", - "cash_for_tick = w_map[ticker] * 20_000\n", - "focus_start, focus_end = trades.iloc[focus_index].EntryTime.strftime('%Y-%m-%d'), trades.iloc[focus_index].ExitTime.strftime('%Y-%m-%d')\n", - "with Context(end_date = focus_start):\n", - " tick_on_start = Stock(ticker)\n", - " spot = list(tick_on_start.spot(spot_type = 'chain_price').values())[0]\n", - "\n", - "with Context(end_date = focus_end):\n", - " tick_on_start = Stock(ticker)\n", - " spot_end = list(tick_on_start.spot(spot_type = 'chain_price').values())[0]\n", - "focus_start, focus_end" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.585" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "size_leverage = 4.5\n", - "eq_equivalent_size = (math.floor(cash_for_tick/spot)/100) * size_leverage\n", - "eq_equivalent_size" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[0;31mSignature:\u001b[0m\n", - "\u001b[0mfocus_object\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgreeks\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mgreek_type\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'greek'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mts_start\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mts_end\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mts_timewidth\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mts_timeframe\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mreturn_all\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mDocstring:\u001b[0m\n", - "The greeks method returns a timeseries dataframe for greeks based. Only available for BSM model\n", - "\n", - "PARAMS\n", - "______\n", - "ts (Bool): True to return dataframe timeseries, false to return spot in a dict\n", - "ts_start (str|datetime): Start Date\n", - "ts_end (str|datetime): End Date\n", - "ts_timewidth (str|int): Steps in timeframe\n", - "ts_timeframe (str): Target timeframe for series \n", - "greek_type (str): Type of greek to return. Default is 'greek'.\n", - " 'greek' returns all greek, while passing 'delta', 'gamma', 'theta', 'vega' returns only the specific greek\n", - "return_all (bool): True to return all from each leg, False to return only the aggregate greeks\n", - "\n", - "\n", - "RETURNS\n", - "_________\n", - "pd.DataFrame or dict\n", - "\u001b[0;31mFile:\u001b[0m ~/cloned_repos/QuantTools/trade/assets/OptionStructure.py\n", - "\u001b[0;31mType:\u001b[0m method" - ] - } - ], - "source": [ - "focus_object.greeks?" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Using available dataing available data\r" - ] - } - ], - "source": [ - "long_leg = focus_object.Structure['long'][0]\n", - "short_leg = focus_object.Structure['short'][0]\n", - "\n", - "long_attribution = Calculate.attribution(\n", - " asset = long_leg,\n", - " ts_start = focus_start,\n", - " ts_end = focus_end,\n", - " method = 'GB',\n", - " replace = 'default_fill',\n", - " return_both_data = True\n", - ")\n", - "\n", - "short_attribution = Calculate.attribution(\n", - " asset = short_leg,\n", - " ts_start = focus_start,\n", - " ts_end = focus_end,\n", - " method = 'GB',\n", - " replace = 'default_fill',\n", - " return_both_data = True\n", - ")\n", - "\n", - "\n", - "attribution_gb = Calculate.attribution(\n", - " asset = focus_object,\n", - " ts_start = focus_start,\n", - " ts_end = focus_end,\n", - " method = 'GB',\n", - " replace = 'default_fill'\n", - ") \n", - "\n", - "\n", - "attribution = Calculate.attribution(\n", - " asset = focus_object,\n", - " ts_start = focus_start,\n", - " ts_end = focus_end,\n", - " method = 'RV',\n", - "replace = 'default_fill'\n", - ")\n", - "\n", - "vol_ts = focus_object.vol(\n", - " ts = True,\n", - " ts_start = focus_start,\n", - " ts_end = focus_end\n", - ")\n", - "\n", - "greeks = focus_object.greeks(\n", - " ts_start = pd.to_datetime(focus_start) - BDay(1),\n", - " ts_end = focus_end\n", - ")\n", - "\n", - "\n", - "ticker_ob = Stock(ticker)\n", - "spot_ts = ticker_ob.spot(ts = True,\n", - " ts_start= pd.to_datetime(focus_start) - BDay(1),\n", - " ts_end=focus_end)" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Using available dataing available data\r" - ] - } - ], - "source": [ - "long_greeks = long_leg.greeks(\n", - " ts_start = focus_start,\n", - " ts_end = focus_end,\n", - ")\n", - "\n", - "short_greeks = short_leg.greeks(\n", - " ts_start = focus_start,\n", - " ts_end = focus_end,\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 63, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Stock change & Querying Spot Change are the same on long\n", - "Stock change & Querying Spot Change are the same on short\n", - "PnL Attribution on Structure and Individual Legs match\n", - "Greeks on Structure and Individual Legs match\n", - "Structure Delta * Spot_TS diff == Structure Delta * Stock_Close_Change_Mark\n", - "Moneyness at Start: Long Leg Strike: 77% Short Leg Strike: 73%\n", - "Moneyness at End: Long Leg Strike: 83% Short Leg Strike: 79%\n" - ] - } - ], - "source": [ - "long_full_data = long_attribution[0].set_index('Datetime')\n", - "long_pnl = long_attribution[1]\n", - "\n", - "short_full_data = short_attribution[0].set_index('Datetime')\n", - "short_pnl = short_attribution[1]\n", - "\n", - "## Attribution Func Stock change & Querying Spot Change are the same\n", - "## Calculate.attribution calculation on option structure matches with individual option leg calc\n", - "if (long_full_data['Stock_Close_Change_Mark'] - spot_ts['close'].diff()).dropna().sum() == 0:\n", - " print('Stock change & Querying Spot Change are the same on long')\n", - "else:\n", - " print('Stock change & Querying Spot Change are not the same on long')\n", - "\n", - "\n", - "if (short_full_data['Stock_Close_Change_Mark'] - spot_ts['close'].diff()).dropna().sum() == 0:\n", - " print('Stock change & Querying Spot Change are the same on short')\n", - "else:\n", - " print('Stock change & Querying Spot Change are not the same on short')\n", - "\n", - "\n", - "if ((long_pnl - short_pnl) - attribution_gb)['Delta_PnL'].sum() == 0:\n", - " print('PnL Attribution on Structure and Individual Legs match')\n", - "else:\n", - " print('PnL Attribution on Structure and Individual Legs do not match')\n", - "\n", - "## Greeks on Structure and Individual Legs match\n", - "if ((long_greeks - short_greeks) - greeks)['Midpoint_delta'].sum() == 0:\n", - " print('Greeks on Structure and Individual Legs match')\n", - "else:\n", - " print('Greeks on Structure and Individual Legs do not match')\n", - "\n", - "\n", - "if (((greeks['Midpoint_delta'] * 100) * spot_ts['close'].diff()) - ((greeks['Midpoint_delta'] * 100) * short_full_data['Stock_Close_Change_Mark'])).sum() == 0:\n", - " print('Structure Delta * Spot_TS diff == Structure Delta * Stock_Close_Change_Mark')\n", - "else:\n", - " print('Structure Delta * Spot_TS diff != Structure Delta * Stock_Close_Change_Mark')\n", - "\n", - "long_leg_strike = spot/long_leg.K\n", - "short_leg_strike = spot/short_leg.K\n", - "long_leg_strike_end = spot_end/long_leg.K\n", - "short_leg_strike_end = spot_end/short_leg.K\n", - "print('Moneyness at Start: Long Leg Strike:', f\"{long_leg_strike:.0%}\", 'Short Leg Strike:', f\"{short_leg_strike:.0%}\")\n", - "print('Moneyness at End: Long Leg Strike:', f\"{long_leg_strike_end:.0%}\", 'Short Leg Strike:', f\"{short_leg_strike_end:.0%}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "self_calc_pnl = ((long_full_data['Delta'] - short_full_data['Delta'])*100) * spot_ts['close'].diff()\n", - "self_calc_pnl.cumsum().plot(label = 'Self Calc'), attribution_gb['Delta_PnL'].cumsum().plot(label = 'Attribution'), (((long_full_data['Delta'] - short_full_data['Delta'])*100) * spot_ts['close'].diff()).cumsum().plot(label = 'Structure')\n", - "plt.legend()" - ] - }, - { - "cell_type": "code", - "execution_count": 65, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjwAAAHcCAYAAADSo3CFAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOydd3wb5f3H36dlyVPeM7GdvQcJCSOQMMOGEErYG0qhFCiUwg9a9izQltIWCmG3rDAChRA2JIRmQ3acZceJ7XhvybKk5/fH6c6SLdvyTuTn/Xr5Zenmcyfp7nPfqQghBBKJRCKRSCRhjGGgByCRSCQSiUTS10jBI5FIJBKJJOyRgkcikUgkEknYIwWPRCKRSCSSsEcKHolEIpFIJGGPFDwSiUQikUjCHil4JBKJRCKRhD1S8EgkEolEIgl7pOCRSCQSiUQS9kjBI5FIJK2YM2cOiqIETPv2229RFIX77rtvYAblIycnh5ycnAEdQ3vce++9WK1WCgsL+33fQggmT57MMccc0+/7lhwaSMEjGXR4PB5eeOEFZs+eTUJCAmazmZSUFCZNmsQ111zDRx99FLD8K6+8gqIovPLKKwMz4E442MfXFR5++GEURUFRFLZv397ucp3d9BVFYc6cOb0/wH4gmNg6FCgsLORPf/oT1113HUOGDAmYp32m2p/RaCQhIYE5c+bwyiuvoHU48nq9DB06FEVR2LJlS4f7a2xsxG63Y7FYKC0tRVEUHnjgAZYvX86iRYv67Dglhy6mgR6ARNKfeDwezjjjDD777DPsdjunn346WVlZuFwuNm/ezH/+8x+2bdvGWWedNdBDHXQIIXjxxRdRFAUhBC+88AJPPvnkgIzltddeo7GxcUD23RlfffXVQA8hKA8++CBNTU3ccccd7S5z7733AtDc3MzOnTv54IMP+O6771izZg3PPvssBoOBq666ivvvv58XX3yRp59+ut1tvfvuu9TU1HDeeeeRkpICwNlnn83YsWO5++67mT9//iEpHCV9iJBIBhGvv/66AMTkyZNFdXV1m/kNDQ3i66+/Dpj28ssvC0C8/PLL/TTKrnGwjy9UPvvsMwGIK664QqSlpYmkpCTR1NQUdNns7GyRnZ3d7rYAMXv27F4d3zfffCMAce+99/bqdlsze/Zscahdmqurq0VkZKQ46aSTgs4Hgh7T8uXLhcFgEIqiiN27dwshhNi7d68wGo0dfv5CCDFr1iwBiM8//zxg+mOPPSYA8cUXX/TgiCThyKH1q5JIesivfvUrAYg///nPIS2v3XyC/e3Zs0cIIcS9994rAPHNN9+If//732LGjBkiKipKvyF3dqPs6Ob91ltvieOPP17Ex8eLiIgIkZ2dLS644AKxevXqkMd3+eWXB7z3p72xadttamoS999/vxg1apSwWCzi8ssv15cpLCwUN954o8jNzRUWi0UkJCSIM888U6xatSqkc9ua+fPnC0D88MMP4rbbbhOAeOutt4KON9jf5Zdfrou/YH/aMe7Zs0dffvv27eL8888XycnJQlEU8c033wQcf3vnasWKFeKEE04QsbGxIjo6Wpx88sn6Z+JPV869Nq5gf/7irb3vi9PpFI8++qiYMGGCsNlsIiYmRsyaNUu8/fbbbZb1Pwd79uwRCxYsEImJiSIiIkJMmzZNfPzxx+1/UEH45z//KQDx4osvBp3fnuARQohx48YJQLz77rv6tNNPPz3o56+xdetWAYhhw4YJr9cbMC8/P18A4oILLujSMUjCH+nSkgwqEhMTAcjLywtp+SuuuAK73c7ixYs5++yzmTJlij7PbrcHLPvUU0/xxRdfcOaZZ3LcccdRU1PT7XEKIbjyyit59dVXSUpK4txzzyU5OZl9+/bxzTffMHr0aKZPn96l8XWH+fPns3r1ak499VTOOecc3XWwbt06Tj75ZCorK5k7dy7nnnsu5eXlfPjhh8yaNYsPPviA0047LeT9HDhwgI8++ohRo0Zx1FFHERsby1NPPcW//vUvFixYoC+Xk5PDvffey1/+8hcAbrnlFn3elClT9Pn3338/2dnZXHHFFfr81jE9u3btYubMmYwaNYqLL74Yh8NBbGxsp2NduXIljz76KCeeeCI33ngjO3fu5P333+f777/n888/73bQrN1u59577+WVV16hoKBAd/9ox90RLpeLuXPn8t133zFmzBhuvPFGGhsbWbRoEQsWLOCnn37ikUceabNeQUEBM2bMYNiwYVx66aVUVlby9ttvc/bZZ/Pll19y3HHHhTT2L7/8EoBZs2aFfsCtMJvN+utrr72WTz75hBdffDHg89d48cUXAbj66qvbuK2ys7PJzMzkyy+/RAgh3VqSFgZacUkk/cm6deuE2WwWiqKISy65RLz33nsiPz+/w3U6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ufnmm3nwwQeZOnUq8+bNw+1288UXX5CRkUFGRkabda655hqWLVvG66+/zsiRIzn77LNJTk6mqKiIr7/+mquuukoPGO5sfGeffTYjR47kzTffZN++fcycOZO9e/fqtXveeeedLp1Ds9nM+++/z9y5czn99NM56qijmDJlCpGRkRQWFrJ69Wp2795NcXExkZGR7W7n22+/JS8vj4kTJ3YY8H311Vfz8MMP68GrJpOJE044gdWrV3PKKadw7LHHEhERweTJkznzzDMBOOGEE3jrrbc488wzOeywwzCbzRx77LEBQra7nHLKKdx2220sWbKEyZMn63V4rFYrL730UoCrpTvn/oQTTuDdd9/l3HPP5bTTTsNms5Gdnc2ll17a7phuv/12lixZwuLFi5k8eTKnnXYajY2NvPvuu5SWlnLHHXf0qEZOZ8yfP5+nnnqKpUuXcuKJJ3Zp3czMTK6//nr++te/8sQTT/Doo48GzL/22mt5/PHHdYui5uZqj2+//RaXy8X8+fO7dhCS8Kf/M+ElkoFj79694tlnnxXnnHOOGDVqlIiJiRFms1mkpaWJU089Vbz++usBdVQ0lixZIo444ggRFRXVYaXl9vB6veLRRx8Vw4YNE2azWQwZMkT87ne/Ew0NDR3WlHnjjTfEscceK2JjY0VERITIyckRF110kVi7dm3I49OO+/zzzxfx8fHCarWK6dOni/fee6/btWCEUGu8/P73vxfjx48XNptNREVFiREjRoj58+eL119/PaAeTDAuuugiAYi//vWvHS4nhBAnnXSSAMT7778vhBCivr5eXH/99SIzM1MYjUa9arD/2C688EKRkpIiDAZDu5WW2yPUSssxMTEiOjpanHTSSe1WmO7quXe73eKuu+4Subm5wmQyhVxp2eFwiIcffliMHz9eWK1WER0dLY4++mjxn//8p82ynZ2D7rS3mDJlikhPTxdut7vNPNqpw6NRUlIiIiMjRWRkpCgpKWkz/8QTTxSAyMrKCrp9fy688EJhsVjEgQMHujR+SfijCOEXrCCRSCQSSTd48803ueiii3j//feZN2/egIyhtLSUnJwcLrrooqB1hySDGyl4JBKJRNJjhBAceeSROBwOfvrppwFp6XDLLbewcOFC8vLy+q04p+TQQQYtSyQSiaTHKIrCv/71L+bNm0dRUVG/718IQXp6Oq+//roUO5KgSAuPRCKRSCSSsEdaeCQSiUQikYQ9UvBIJBKJRCIJe6TgkUgkEolEEvZIwSORSCQSiSTskYJHIpFIJBJJ2CNbS/hRVVXVbkfrcCM5OZmysrKBHka/MJiOtTPkuRi852CwHnd7DNbzEW7HbTKZ9Ca9nS7bx2M5pHC73TQ3Nw/0MPocrSCY2+0m3KsSDKZj7Qx5LgbvORisx90eg/V8DNbj1pAuLYlEIpFIJGGPFDwSiUQikUjCHil4JBKJRCKRhD1S8EgkEolEIgl7ZNByiLjdbhobGwd6GL2Gw+HA5XIN9DD6hVCONTIyEpNJ/hwkEokkXJFX+BBwu900NDQQExODwRAeRjGz2TwoMtKg82P1er3U1dURFRUlRY9EIpGEKeFx9+5jGhsbw0rsSAIxGAzExMSElQVPIpFIJIHIO3iISLET3sjPVyKRSMKbPrXff/DBB6xatYr9+/djsVgYNWoUl1xyCRkZGfoy9913H1u2bAlY78QTT+S6667T35eXl/PCCy+wefNmrFYrs2fP5qKLLsJoNOrLbN68mddee43CwkISExOZP38+c+bM6cvDk0gkEolEcojQp4Jny5YtzJ07l+HDh+PxeHjzzTd56KGHePrpp7FarfpyJ5xwAgsWLNDfWywW/bXX6+XRRx/Fbrfz0EMPUVVVxbPPPovRaOSiiy4CoLS0lMcee4yTTjqJm266iU2bNvHcc89ht9uZMmVKXx6iRCKRSCSSQ4A+tePffffdzJkzhyFDhpCTk8ONN95IeXk5u3fvDlguIiICu92u/0VGRurzfv75Z/bt28dNN91ETk4OU6dOZcGCBSxdulTve/X555+TkpLCZZddRlZWFqeccgpHHHEEn3zySV8eniQImZmZfPbZZwM9DIlEIpFIAujXlBQtKDQ6Ojpg+rJly1i2bBl2u51p06Yxf/58IiIiAMjLy2Po0KHY7XZ9+SlTpvDiiy9SWFhIbm4uO3bsYOLEiQHbnDx5Mq+88krQcTQ3Nwdk7SiKgs1mQ1EUvdfIoU5mZmaH82+//XZuvfXWoPMKCws54ogjWLp0KRMmTOiL4QGBY4yJiWH06NH87ne/Y9asWSGt3xfjDJfPPxjasYXzMXbGYD0Hg/W422Owno9wPO6uHEu/CR6v18srr7zC6NGjGTp0qD591qxZJCUlkZCQQEFBAf/+978pKiri9ttvB6C6ujpA7ADExcXp87T/2jT/ZbT6K/4uMlBjixYtWqS/z83N5fHHHycpKSno2B0OB2azuVvHPVBs3LhRf7148WIef/xxVqxYoU+Liopq95i01GyTydSt4zYajSGv98wzz3DcccdRWVnJo48+yhVXXMF3331HTk5Op+t2ZZyhjMdisZCenh7SuA9l0tLSBnoIA85gOAdur5cN+2uYnGnHaFBvCoPhuLvCYD0fg/W4+03wLFy4kMLCQh544IGA6SeeeKL+eujQocTHx/PAAw9QUlLSZx/KvHnzOOOMM/T3mkIsLy8PWq/F5XIdcjVrEhIS9NeRkZEoiqJP83q9/O1vf+O1116jsrKSESNG8H//938cd9xxAEyfPh1QY6sAjjzySBYtWsRPP/3EY489xqZNm3C73YwfP5777ruvjXXN4/GEfL6ioqJISEggISGBhx9+mGnTpvH1119z6aWXkpmZyZ/+9Ce++uorvv32W9LS0rj33ns5+eSTAXSXZmdd7kOtOeRyuSguLg5p3IciiqKQlpZGSUnJoOyUDIPrHDy1fD/f5ddy/oRELp2aOmiOOxQG0/fAn3A8brPZ3K6xojX9IngWLlzIunXruP/++0lMTOxw2REjRgDogsdut7Nz586AZWpqagB0y4/dbten+S9js9naWHdAPUHBnviFECF9CYQQ4GrqdLk+wRLRY3Pkiy++yD//+U8ef/xxxo8fz9tvv82VV17J119/zbBhw/jkk084/fTTeeuttxg9erR+rurr6/nFL37BQw89hBCC559/nksvvZTly5e3cVN2By2Q3V+cPP3009xzzz3cc889vPzyy/z6179m5cqVxMfH93h/wQiXi0BHhPo9D2fC/Rx8n1/Ld/m1AHy4tZLTRyeQRvgfd1cZrOcjnI67K8fRp4JHCMFLL73EqlWruO+++0hJSel0nfz8fAD9hjZq1Cjef/99ampqdLfVhg0bsNlsZGVlATBy5EjWr18fsJ0NGzYwatSoXjwaP1xNeH99ft9suxMMz74DEdbOF+yA559/nptuuomzzz4bUIPLV6xYwYsvvsgjjzyii9L4+PiAz6x1bM0TTzzB2LFj+fHHHznppJN6NCaHw8ETTzyB0WjkiCOO0Keff/75nHPOOQDceeedLFy4kJ9++km3RkkkkkDKG5t5bnUJABFGhSaPYNHmcv44bMgAj0wi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K6+wfPlyjj322O6dCEnY4PEKan1upe5aeABGJtgA2FnZseBZvb+eLWUOLEaFy6YkY+qo4WdttXoRMRjAHg+xdkBNTe9RI4kDRer/uHgUW6uWGEmp6j7KWgsedY8OKXgkg4A+FTwffPABq1atYv/+/VgsFkaNGsUll1xCRkaGvozL5eK1115jxYoVNDc3M3nyZK655hrsdru+THl5OS+88AKbN2/GarUye/ZsLrroIozGFt/85s2bee211ygsLCQxMZH58+czZ86cvjy8sGHcuHH669RU9cJYUVFBZmYmW7ZsYc2aNbpFB8Dr9eJ0OnE4HNhstqDbbGho4KmnnuKrr76itLQUt9uN0+nskoXntdde480336S5uRmj0ci1117LZZddps8fO3ZswPIpKSmUl5e33oxkEFLtdCMAg6LW2ekuwxKsGBSoaHS322TT4xW89pPqojprTELnTUe1lhL2RBSDESU2DgE9t/Ac2Ke+SM1oM09JTtX3LbweFIN6TrQYHqeM4ZEMAvpU8GzZsoW5c+cyfPhwPB4Pb775Jg899BBPP/00VqtqKn711VdZt24dv/3tb4mMjGThwoU89dRTPPjgg4B6c3300Uex2+089NBDVFVV8eyzz2I0GrnooosAKC0t5bHHHuOkk07ipptuYtOmTTz33HPY7XamTJnS68dlNKqWloHA2P1rd7uYgpiMvF71AtjY2Mhtt93Gqaee2maZiIj2a5M88MADLFu2jD/84Q/k5ORgtVq57rrrcLlcIY9r3rx5/OY3v8FqtZKamorBEOiBbT1uRVH0cUsGN1rAcpzVhLEja0sn2MwGsmIt7K1xsaPCoXdU9+ebPTUU1riIsRiYNy4h6HbElp8gwooyfAxoAcsJSep/n4WnxzE8evxOZtt58YlgMoHbDVWVkJgMyBgeyeCiTwXP3XffHfD+xhtv5JprrmH37t2MGzeOxsZGvv76a26++WYmTJgAwA033MCtt95KXl4eo0aN4ueff2bfvn384Q9/wG63k5OTw4IFC/j3v//N+eefj8lk4vPPPyclJUV/+s/KymLbtm188sknfSJ4FEXpdbfSwcqECRPYtWsXubm57S5jNpvxeAJ7Dq1Zs4Zf/OIXulBqaGhg3759Xdp3TExMh/uVSNqjJWC5508IIxJtPsHjbCN4hBC8vVEVML+YkES0pe3+RH0t3mce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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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W25h7ty5DB8+nOnTp1NbW8tnn31GZmYmmZmZDc659tpr+eabb3j11Vfp06cPF110EampqRw6dIgvv/ySq6++2p4w2Fz7LrroIvr06cPChQs5cOAAo0ePZt++ffbaKYsWLfLoMwwLC+O9995j6tSpnH/++YwbN45hw4YRHR3N/v37Wb16Nbt27SIvL4/o6OhGr7Ns2TJyc3MZPHhwkwnG11xzDfPmzePFF19kzpw5hIaGMmXKFFavXs0555zDhAkTiIiIYOjQoVxwwQUATJkyhTfffJMLLriAESNGEBYWxoQJE5wCz5Y655xzuP322/n4448ZOnSovQ5KZGQkL7zwglMCbUs++ylTpvD2229zySWXcN555xEVFUVWVha//OUvG23TH/7wBz7++GMWL17M0KFDOe+88ygvL+ftt9/m6NGj3HHHHS5rlHjLpZdeyvz58/n0008588wzG+z/y1/+gtaauXPnctpppzFy5EhGjRpFUlIShYWF7Nmzx15LpbGv0bJly+zf81pr8vLy+Pjjjzlw4AA9e/bk7rvvbnCOWeL+0ksv9dKdiqDgg6nNQjRr3759esGCBfriiy/WOTk5Oi4uToeFhen09HR97rnn6ldffdWpjoXp448/1mPGjNExMTFNVpJtjNVq1Q8++KDu2bOnDgsL0926ddN//OMfdVlZWZM1PV577TU9YcIEHR8fryMiInR2draeOXOm/vHHH91un3nfV1xxhe7UqZOOjIzUp5xyin733XdbXItDa6PGxp/+9Cc9cOBAHRUVpWNiYnTv3r31pZdeql999dUGFUFPNnPmTA3oJ598ssnjtNb6rLPO0oB+7733tNZal5aW6uuvv1536dJFh4SE2Kui1m/bz3/+c52WlqYtFkujlWQb424l2bi4OB0bG6vPOuusRivoevrZ19bW6rvuukv36NFDh4aGul1JtqKiQs+bN08PHDhQR0ZG6tjYWH3aaafpN954o8GxzX0G7nz9TzZs2DCdkZGha2trGz1m69at+tZbb9VDhw7VCQkJOjQ0VHfq1Emfcsop+tZbb23wfa214//Xyf+io6P1kCFD9N13361PnDjh8v3Gjh2rU1NTdVVVlUf3IoKb0rreIL4QQoigtnDhQmbOnMl7773H9OnTfd0c1q9fz9ChQ5k7d26DWi+iY5MARQghOhCtNWPHjqWiooK1a9f6POfj4osvZs2aNWzbtk2mGAsnkiQrhBAdiFKKZ599lunTp7usedKeysvLGT58OK+88ooEJ6IB6UERQgghhN+RHhQhhBBC+B0JUIQQQgjhdyRAEUIIIYTfkQBFCCGEEH5HAhQhhBBC+J2ALnV/4sSJRleeDSapqank5+f7uhntoiPdqzvk8+i4n0FHve/GdNTPI9juOzQ01L44Z7PHtnFb2lRtbS01NTW+bkabMoso1dbWEuwzwjvSvbpDPo+O+xl01PtuTEf9PDrqfZtkiEcIIYQQfkcCFCGEEEL4HQlQhBBCCOF3JEARQgghhN8J6CRZIYQQga22tpby8vJmj6uoqKC6urodWuRfAvG+o6OjCQ1tfXghAYoQQgifqK2tpaysjLi4OCyWpjv0w8LCgn7WpiuBdt9Wq5WSkhJiYmJaHaTIEI8QQgifKC8vdys4EYHDYrEQFxfnVq9Ys9fyQnuEEEKIFpHgJPh462sq3xlCCCGE8DsSoAghhBDC70iAIoQQQvjA/PnzOeuss3zdDL8lAYoQQgjhgVtvvZUuXbrQpUsXsrKyGDp0KD/72c948803sVqtrbru1Vdf7cWWwltvvWVva9euXRk5ciS///3vKSgocPsavgqkZJqxEEL4AX3iGFRVoNK7+ropwg1nnHEGjz32GHV1dRQUFLB06VL+8pe/8NFHH/Hiiy96pQ6It8TFxfH1119jtVrZvHkzt912G0eOHOGNN97wddOaJD0oQgjhY7qiHOu827DOuQV9NM/XzRFuCA8PJy0tjYyMDAYPHszvfvc7XnjhBb788ksWLVoEQFFREX/4wx8YPHgwffv25fLLL2fTpk0urzd//nzefvttPv30U3uPx8qVKwGYN28e48ePp1evXowdO5ZHHnnEo9ooSinS0tJIT09n8uTJXH311XzzzTdUVFTw1ltv0b9/f5YtW8bEiRPp06cPv/jFLzhy5EjrP6RW8p8QTwghOii95H0oOmE8X74ELp3t2wb5iNYaqqtc77PWoduyYFl4BEqpVl1i/PjxDBgwgI8//piZM2dy3XXXERkZyWuvvUZcXByvvfYaM2bM4JtvvqFTp05O515//fVs376d0tJSHnvsMQASExMBiImJ4fHHHyc9PZ0tW7Zwxx13EBsbyw033NCidkZGRmK1WqmrqwOMarX/+te/+Pvf/47FYuHmm29m7ty5LFiwoOUfhhdIgCKEED6ki06gl3zgeL38c/RFv/Bdg3ypugrrTVe43OU6bPEey4JFEBHZ6uv07t2bLVu2sGrVKtauXcu6deuIiIgA4C9/+QuffvopH330EVdeeaXTeTExMURGRlJdXU1aWprTvltvvdX+vFu3buzatYvFixe3KEDZtWsXr776KkOHDiU2NhaAmpoaHnroIbKzswGYPXs2TzzxhMfX9jYJUIQQwof0f980eg165MDxfCg6gV67Crp193XTRAtorVFKsXnzZsrKyhg0aJDT/srKSvbu3evRNRcvXswLL7zA3r17KSsro66uzh5cuKO4uJg+ffpgtVqpqqpi1KhR/O1vf7Pvj4qKsgcnAJ07d/YoibatSIAihBA+oo8cQn+zBADLpbPRm39C/+9t9NefwAWX+bh1PhAeYfRkuNDma9KER3jlMjt27KBbt26UlZWRlpbGO++80+CYhIQEt6+3evVqbr75Zm6//XYmTZpEXFwcixcv5tlnn3X7GrGxsXzyySdYLBbS0tKIiopy2h8WFub0WillDLf5mAQoQgjhI3rx61BXB4NPQfUdBEkp6I/fQW9eS23eASDE101sV0qpRodZVFgYyuLfn8fy5cvZsmULv/71r8nIyCA/P5/Q0FC6devm1vnh4eH2vBDT6tWr6dq1K7fccot928GDBz1ql8VioUePHh6d4w8kQBFCCB/QWqM3/ACAZdoMAFRqOgwYBpt+onTJYjj7Eh+2UDSlurqao0ePOk0zXrBgAWeeeSaXXXYZFouFkSNHcvXVV3PPPffQs2dPDh8+zBdffMG5557L0KFDG1yza9euLFu2jB07dpCUlERcXBw9e/bk4MGDLF68mKFDh/LFF1/w8ccft/v9VlZWsnHjRqdtsbGxTkND3iYBihBC+EJ5KVRWGM+7Zts3Wyacg3XTT5Qt+RA15SKQxfT80tKlSxk+fDihoaEkJCQwYMAA5s6dy+WXX25fLO/VV1/l4Ycf5rbbbuPYsWOkpqYyZswYUlJSXF7zF7/4Bd9++y3nnXceZWVlvP3225xzzjn8+te/5u6776a6upopU6Zw66232mf6tJddu3YxdepUp23jx4/nrbfearP3VLoVA00ffPABb7zxBueddx6zZ88GjKjylVdeYeXKldTU1DB06FCuvfZa+3QpgIKCAv7973+zadMmIiMjmThxIjNnziQkxLPuu/z8/LYdk/QDSikyMjLIy8vzizHBttSR7tUd8nkE92eg9+7E+sDvIaETIY++7NheW4v1lp9BdTUh856BtAwftrJtFRcXEx8f79axbZ6D4qcC9b4b+9qGhYWRmprq1jVaHJrv2LGDzz77jKysLKftL7/8Mj/++CO33XYbc+bM4cSJE8yfP9++32q18uCDD1JbW8sDDzzAjTfeyLJly9o0ChNCCL9zzFYIK9l5SqkKDYVOxg9wfeJYe7dKCL/RogClsrKSf/zjH1x33XXExMTYt5eXl/Pll18ya9YsBg0aRM+ePbnhhhvYtm0bubm5AKxbt44DBw5w8803k52dzfDhw5kxYwaffvoptbW13rkrIYTwc7rACFDUSQEKgOqUbDw54fupnsK/nXHGGfTp08flv/fee8/XzWuVFuWgPPfccwwfPpwhQ4Y4fQC7du2irq6OwYMH27d16dKFlJQUcnNzycnJITc3l+7duzsN+QwbNoznnnuO/fv3u8w0rqmpceriUkoRFRWFUqrVlf/8nXl/wX6f0LHu1R3yefjXZ6CrKtHrVqGGj0GFhbf+gsfyjceUzg3vL8mWo1B4zC/uXfivV199tdEhIHeHUtqKq+9dT76fPQ5QVqxYwe7du3nwwQcb7CssLCQ0NNSpVwWMOd+FhYX2Y+oHJ+Z+c58r77//vtNc8h49evDwww83mmgUjNLT033dhHbTke7VHfJ5+MdnUPjC3yl59xUSZt1I/BW/avX18kuLqAQSe/UhNsM5z6SwaxYlQHRVOZ0ygjcHpaKiokENjqZ4cmwwaeq+/XX6cHh4OBmt/N71KEApKCjgpZde4p577iE83At/Qbhp+vTpTJs2zf7ajMAKCgoCMnnIE0op0tPTOXz4cNAlCZ6sI92rO+Tz8K/PoHb1cgCK1/9I2enntP56B/cBUBQaSUme8wKB1nCjkFbZgf1U5gXv4oHV1dVu/wwP1GTR1grU+66uribPxfduWFiY250LHgUou3btoqioiD/96U/2bVarlS1btvDJJ59w9913U1tbS1lZmVMvSlFRkb3XJDExkR07djhdt6ioyL7PlbCwMJcRpNba5z+02ovca8cln4fvPwNdUQ779xjP8/a3ui1aayg4arxITm14vUQjB0WfKAj6r73VarVPyxXBwWq1Arj83vXk+9mjAGXw4ME8+uijTtuefvppMjMzueiii0hJSSEkJIQNGzYwZswYAA4dOkRBQQE5OTkA5OTk8N5771FUVGQf2lm/fj1RUVF07drVk+YIIUT72LUNtPFDl6N56NoaVGgrhhvKSqDKVgPFVZJsUsdIko2OjqakpIS4uDgJUoKE1WqlpKSkQapHS3gUoERFRdG9u/MCVhEREcTFxdm3T548mVdeeYXY2Fiio6N54YUXyMnJsQcoQ4cOpWvXrixYsIBf/OIXFBYW8uabbzJ16tQOO74ohPBvesdmxwurFY7kQZdWLOZ3zNZ7kpDkOuG2k60LvLiw9cGQHzNzFktLS5s9Njw8nOrq6nZolX8JxPuOiYkhNLT1dWC9Xkl21qxZKKWYP38+tbW19kJtJovFwp133slzzz3HPffcQ0REBBMnTmTGjBnebooQQniF3r7ZeUPePo8CFOu7L6N/XIHljgdRicmO4Z2Uhr0nAMTGQ1g41FRD4XFI6dzClvu/0NDQZou1BXPBvqZ01Ps2tTpAue+++5xeh4eHc+211zoFJSdLTU3lrrvuau1bCyFEm9O1tbDbqONEjxzYnYvOO4C7kyV1aTH6s8VQV4v+YQXqzAubrIECxi+m0JQ0Y8HAE8eCOkARojEy6CeEEE3ZvxuqqyAmDjV8rLEtb7/bp+vVy6HOKEKpt9kWW2ukimx9IbbeFR3keShCNEYCFCGEaII9/6R3f1SmMayjPQlQvv3S8SJ3I9pqRTc3xAOEJNt6TaTcveigJEARQoiT6GP5aHOqpC1AUb37Q2Y344DDB9HWuuavc/iAMTxksUB4hLGC8YHd9iRZldz40I3ZgxLsM3mEaIwEKEIIUY919XKsd16D9bH/Q5cUwfZ6AUpyqpG8WlsDtjySpuhvlxlPBo6AvsYSIHrrBscsHreGeKQHRXRMEqAIIfyKPrgXnbvRdw3Ys9143LYB65zfQUkRhIZBVh+UJQTSuxj7DzU9zKOtVvR3SwFQYyej+g4ytq9ZCVWVxkHJja+VEmImxkoPiuigJEARQvgV69/nYJ1/D9rsZWhvRceNR2WBohPG8+w+KFudJpVh5qEcaPo62zfB8XyIikENPRVl60Fh51bjMbGRGig2oTLEIzo4CVCEEH5D19bC8QKwWtHbN/mmDbagRM24FgYMM54PHuk4IMNW8TpvX9PXsSXHqlNOQ4VHQPeeEBXtOKCJ4R2AEHN/0QnjcxGig/F6oTYhhGix8hLH853bYOzk9m+DGaBkdkOdcS4c2gcZjqJsKrMbmqZ7UHRVFfqHlcbxtntQlhDoMxDWrzZeN5EgC2BJTIKQEKirg+ITkNT4cJAQwUh6UIQQ/qPUEaDonVt80wZziCehE8oSguraAxUS4tifYZvJ08Sigfqnb421dlLToXd/+3b7MA80OcUYQFks9kUDZaqx6IgkQBFC+I96AQoH9qIrK9r17XVNNZSXGS8SklwflJph9GxUVRrDUa6u860tOXbMGSjlqDmr+tULUJoZ4gGgU8dYNFAIVyRAEUL4j7J6AYq2os0ZNe3FTIoNDYNo16uxqtBQSMs0Xrgo2KZPHIMt64xjx57hvLNrNkTHGvvcKF+vbIsGylRj0RFJgCKE8Bu6tNh5w452HuYxA5SETk49Hw3Yhnn0wb0NdulVX4G2Qu8BqNR0p33KEoL6xfWoM86D+r0pjZEeFNGBSYAihPAfZg+KMn406V1b2/f96+WfNEX17AuA3rbBabvWGr3SNnvn5N4TG8uoCVhmXm8kzTbD7EGRHBTREUmAIoTwH2YOSi9bALBzW7suM6/r9aA0RQ0cZjzZtgFdU+PYsX+XMesnNAx1ymmtb5B9iEd6UETHIwGKEMJ/2HpQVL+hRkn5shJqXQyjtJlC2xTjxhJkTV2yIT7RWOW43mwje+/J8DEoW65Ja6hOMotHdFwSoAgh/IY2e1ASEiGrNwDVWzY0foK3uTvEoxRqwHAA9OafjMeaGvT3y4z9jQzveMwc4ik67tbihEIEEwlQhBD+o8yWJBsTj7IN81RtWd9ub+/uEA9grzKrNxszdvRP3xpDVJ1SYOBw7zQosRNERBnF2g41XblWiGAjAYoQwn/YelBUbByql1HgrGrjj+jcjca/4hNt+/6266vEZoZ4ANV/qPFk3050SRF6+WfG9tPOdCsB1h3KEuLIx8n1Tel/IXxFAhQhhP8wZ/HExNl/Mdce3EfdI3dh/dufsd73O3R1Vdu9vwc9KCoxyahrojX660+N2idKocaf6dUmqT4DjCfbN3v1ukL4OwlQhBB+QWvtCFBi41DxnVBnXUxo12xI7wrh4VBSBNvaJidFW+uguMh4Ee/GEA848lD++6axYcAwlDsVYj2g+gw03mP75nad0SSEr0mAIoTwD5UVRq4FQEw8ACEzriHjmXcIfeBp+6J7ev0PbfP+xUVGgTVlgfgEt06xTze2rTZsOX2q99vVIwdCQo0E3vzD3r++EH5KAhQhhH8wq8iGhaMiIhrsVoNPBUBv+KFtehLM4Z34BPdzSHoPMKZDA8QlwNBTvd4sFR4B2caMJi3DPKIDkQBFCOEf6uefuNJviBEMHDsKhxqugdNqbk4xrk+FR0COMQSjxk1GhYZ5v104hnnYLomyouOQAEUI4R9KHfknrqiICOhrrF+jNzqGefTmteh9u1r99o4pxs3P4KnPcsU1qHMvRZ0/o9VtaIyZKCs9KKIjkQBFCOEXdHM9KIAaPNI41paHotetxvr4X7A+/n/o2ppGz3NLkVlF1v0eFACV2R3LJbNQUdGte/+m9O4PSsHRQ45ASoggJwGKEMI/NNODAqAGn2I82bEZfTQP6yv/cJzb2t4FT4q0tTMVHQtdsowXMswjOggJUIQQ/sFWRVbZZvC4olLTIaMbWK1Y598DxYX2fXpD62b3aHsOimdDPO1FhnlERyMBihDCP7jRgwKOYR6O50NICOrcS4HWByiOIZ7E1l2nrfQZBICWHhTRQUiAIoTwD27koEC9YR5AnT8Ddc5lEBIChw+ij+a1/P1bmCTbXlRPo7IuB/ZKwTbRIUiAIoTwC9rNHhR6D4BBI2D4GNS5l6GiY4xttLwXRWvdomnG7SomxnjUVqip9m1bhGgHEqAIIfyDrQelqRwUABUaSsgt9xFyw59RoaHGNluvSourzJaX2qvB+m2AElaveF1brkckhJ+QAEUI4R/sQzyxHp+qhtiGfXI3oCsrPH/vQtvwTnQsyqwM62dUSIhR8h6gWnpQRPCTAEUI4R/K3BzicSW9K6R0NnpBtq7z/Pxi/51i7CTcFjzJEI/oACRAEUL4nK6thYpy40UzQzyuKKVaPMyjq6sc5yT6Z4Ksndm7I0M8ogMI9XUDhBCCclvviVKOZFAPqSGnoJd+hN681q3jtdWKXvI+eskHUFJkXCOze4veu92E2/JQJEARHYAEKEII3zNn8ETFuL+S8Ml65BiPx46iKytQkVFNHq6//gT97svGi+Q01FkXoyZMbdl7t5cwGeIRHYcEKEII33N3inETVEwcxCUYvSGHD0B2n0aP1Vqjv/zIOO/cy1AXzrTPCPJr0oMiOhDJQRFC+J6bRdqaldENAJ13oOnjtq6HvP0QEWUEKIEQnIAkyYoORQIUIYTP6VJjHR5iPU+QrU9ldDWe5O1v8jjrsv8Zx4+d1LarEHubrRaKlmnGogOQAEUI4Xv2Im1t34OijxfA2u+N95t0fuver73JEI/oQCRAEUL4nhdyUKBeD8rhxntQ9NefgNUKOYNQXfx81s5JlH2IRwIUEfwkQBFC+J63clDSbQHK0Tx0bU2D3bq2Bv3NEgAsZ5zXuvfyBXMWT5UEKCL4SYAihPA5txcKbE6nFIiIMnpI8g833L9pLRQXGisWDxvTuvfyBXOIR5JkRQcgAYoQwvfKbEmyLagiW59SCtK7GC9cJMrqPbnGcYOGB87MnfpkFo+drqzAuvh19E/f+bopoo0E4P9QIUTQsfWgqNb2oAAqoxt67w503gHUSfv0vl3Gk+69Wv0+PhEmSbIA+vBBrE8/CIf2oZNSCBkegL1holkSoAghfMr6/VdGYTWATsmtv2BTU4337QRAde/Z+vfxBfssno7Vg6IP7qV8+wasJwrRJYXo918Fc9XqsjLfNk60GQlQhBA+o9esRL/wOGiNmnAOykxybQWV0Q1Nw6nGuvgEFB431vvp2qPV7+MTHXCIR5eXYp13O8dO7jXq1gP274bqSrTWxvCeCCoSoAghfEJv+AHrs4+C1YoaOxn1i+u9c2EzyDl8AG21oiy2VDtzeKdzZrPr9Pgt2ywe3ZGGePbuhOoqo6Be915oQOUMQk25AOutM0Fro0cpIsLXLRVeJgGKEKLdaa2xvvY01NWiTj0dNftmRyDRWqnpEBJi5GmcKIDkNOM9bQGKCtT8E+iQhdq0bVgucuQ4ambfgtba2G61Og6qqpAAJQjJLB4hRPvL2w/H8yE0DDXrdy1fwdgFFRoKaZmO97Exf9ERqPkn1C/U1nGGeNhrfN3Ce/Vz2qwsFkfAVlXZ3q0S7UACFCFEu9ObfzKe5AxEtcVfvrZEWX24Xh5KMPSgdMBZPGbPV3jvfg13RkQajxKgBCUJUIQQ7U5vMgIUNXB4m1xfpRtr8mBLlNXlZY7CbQHcg9LRZvHoinI4chCAsF59Gx4gAUpQkwBFCNGudE015G4EQA0c0TZvYvagHNpnvN6/23hMSm39goS+1NGGeOxftxRCEjo13C8BSlCTAEUI0b62bzZ6ABKTILNtFutT2X2MJzu2oHM31cs/CeDhHXCsxdNBhni0vW5NI183M0CplgAlGEmAIoRoV/bhnQHD26x2hUrvgjr9bACsrz8Nu20l7gN5eAc63BCPvbBeVtMBiq6UACUYSYAihGhXetMa48mAYW36PurSWRCXYJRD/2G5sS3Qe1DsQzxV9um2wazZpQmkByWoSYAihGg3uvAYHNwLSqEGtE2CrEnFxKEuv9r2xrZf5oHeg2LO4rFaoa7Wt21pY7qqCg4Z08Qb60FRZoAiPShBSQIUIUS70ZvXGk+690LFtW7lYneoMZOg72DjRVyCkfcSyMLrTckO9mGeA7tBWyE+ERIa+bpJD0pQkwBFCNF+2nh68cmUUliuvAHSMlCnTw389VpCQ421hCDoZ/LUH95p9OsmPShBTUrdCyHajbZVBVV9B7Xbe6r0LoTMe6bd3q8tKaWMXpSqyuCfydPcDB6QHpQgJz0oQoh2obU2ytsDpGb4tjGBzD7VONh7UMwZPE3kDUkPSlCTHhQhRPsoKTSGJZSCTsm+bk3gqjeTJxhprdHLP4MDe4wNbvSgaOlBCUoSoAgh2scxW+9JQhIqNMy3bQlkQbyisS4pxvrKAlj7nbFh+Bj7atQuSSXZoCYBihCifRw7ajwmp/q2HYEuSId4tNZYn7wP9u6AkFDU9CtRZ13cZGKziohEgwQoQUoCFCFEu9C2HhTV1F/EonlmD0qwzeKprDCCE8By1yOorN7NnxMuPSjBTJJkhRDtQ3pQvMMWoOhgG+IpLjQeI6LcC06g3hBPkH0WApAARQjRTrQ5gydJelBaJVgXDCw6YTzGJ7h/jj1AqfB+e4TPeTTEs2TJEpYsWUJ+vvGDpmvXrlx22WUMH24UXaquruaVV15h5cqV1NTUMHToUK699loSExPt1ygoKODf//43mzZtIjIykokTJzJz5kxCQkK8d1dCiHany0th5zboPxQV6uJHi60HRYZ4WkeFhRt5F0GWg0JJofGY0Mn9c6QHJah5FKAkJSUxc+ZMMjIy0Frz1Vdf8cgjj/DII4/QrVs3Xn75ZdasWcNtt91GdHQ0zz//PPPnz2fu3LkAWK1WHnzwQRITE3nggQc4ceIECxYsICQkhJkzZ7bJDQoh2od+7xX0V5/A4FOwXPcnVESE8wHmLB4Z4mkdew5KcP1S1vYelET3T6rXg6K1DvxKwcKJR0M8p5xyCiNGjCAjI4PMzEx+/vOfExkZyfbt2ykvL+fLL79k1qxZDBo0iJ49e3LDDTewbds2cnONpc7XrVvHgQMHuPnmm8nOzmb48OHMmDGDTz/9lNra4F74Sohgpw/uNZ5s+AHrk/eiy8sc+8rLoML2WnpQWic8OGfxmDkoKr4FPShWK8jvkKDT4lk8VquVb7/9lqqqKnJycti1axd1dXUMHjzYfkyXLl1ISUkhNzeXnJwccnNz6d69u9OQz7Bhw3juuefYv38/PXr0cPleNTU11NTU2F8rpYiKikIpFfQRs3l/wX6f0LHu1R0B93kcLzAeLRbYvhnr/HsI+eNfUVHRjgqysfFYIqPcvmTAfQZe0uR915vFE1SfS0kRACohscF9Nfp51PteUtWVKDN4CxLB+P3vyb14HKDs27ePu+++m5qaGiIjI/nDH/5A165d2bNnD6GhocTExDgdn5CQQGFhIQCFhYVOwYm539zXmPfff5933nnH/rpHjx48/PDDpKSkeNr8gJWenu7rJrSbjnSv7giEz0PX1XGg6DgAKfc8yvEn52Ldt5O4TT8Qd8EMKvZtpwAIS+9CeobnZe4D4TNoC67uuygpmWIgJiyUTi34LP1VfmU5lUBCt2xiG7kvV5/H/rBwqKkmLSGB0LTg/D7pqN//HgcomZmZ/O1vf6O8vJzvvvuOp556ijlz5rRF2+ymT5/OtGnT7K/NCKygoMCpZyUYKaVIT0/n8OHDxlomQawj3as7Aunz0IXHoK4OlIUTXXrClAvgvVcoWr2S0lMmYN2xDYDa+ETy8vLcvm4gfQbe1NR9W6uMoZ2ywhNUevBZ+rva/CMAFGlFyUn31eT3QXgE1FRzdP9eVF1wfY8E4/d/WFiY250LHgcooaGh9miuZ8+e7Ny5k//973+MGzeO2tpaysrKnHpRioqK7L0miYmJ7Nixw+l6RUVF9n2NCQsLIyysYWlsrXXQfNGaI/facQXC52EWYSMxyRji6TPA2J67EavVii6w1UBJSmvRvQTCZ9AWXN23NqcZV1UF12diJsnGJTR6Xy6/DyIioawEXVkJwfR51BNM3/+e3Eer66BYrVZqamro2bMnISEhbNiwwb7v0KFDFBQUkJOTA0BOTg779u2zByUA69evJyoqiq5du7a2KUIIXzlhyz9Jsv1llNXHqNdRUgSHD6KPGX8dywweLzALtQXRLB6ttaNQmyfTjEFqoQQxjwKUN954g82bN3P06FH27dtnf3366acTHR3N5MmTeeWVV9i4cSO7du3in//8Jzk5OfYAZejQoXTt2pUFCxawZ88e1q5dy5tvvsnUqVNd9pAIIQKDtiXIqk5GgKLCwqBnX2Pf9o32KcZSA8UL7KsZB9EsnooyqLUN13syzRikFkoQ82iIp6ioiKeeeooTJ04QHR1NVlYWd999N0OGDAFg1qxZKKWYP38+tbW19kJtJovFwp133slzzz3HPffcQ0REBBMnTmTGjBnevSshRIvofbuwPv5/qIt+gWXSee6fePykHhRA5QxEb9sA2zZJmXtvCgvC1YzN3pOoaFR4RJOHNmALUHRVBcEz10WAhwHKb3/72yb3h4eHc+211zoFJSdLTU3lrrvu8uRthRDtRP+4EkpL0Es+QE881+0pgfqELQelU70Apc9ANKC3rLVPIZUaKK2nwiOCr5JsUaHxGJfo+bkRsmBgsJK1eIQQdjpvn/Ek/zAc2uf+iScN8QDQsx+EhDqCk4goiI71Uks7sCAc4tH2/JNEj89VEqAELQlQhBAOefvtT/Xa790/78Qx47H+EE9EBGTXW5U2OTWoCk75THgwDvG0oMy9SQKUoCUBihACAF1TA0cd9Sf0ulXunVdX55gi2sm5voHKGeh4IcM73hEWhKXu7WXuEz0/VwKUoCUBihDCcPSQsaaJ+Qtwd65RgK05hcdBW43hnJN+wag+gxzPJUHWO+xDPMHUg1JoPHqyDo/JDFCCqUdJABKgCCFM5vBOtx7QwygNoNetbv68E44ibcpy0o+U3v1B2bYlSQ+KVwThEE+LVjI2mZ9HpdRBCTYSoAghANCHjABFZXRDDRttbHNjmEe7mGJsUlHR9jwU1TnTSy3t4MxpxrW1aGudb9viLeYQj6dF2sCxYGAQBWzCIAGKEMJg9qBkdEMNNQIUtqxDn/SXqa6pRh/Nc5SsPmHO4HE9hGOZdTPq8qth2Kg2aXaHU3/F3mBZi8w+xJPo+blmZV3pQQk6Hq/FI4QITtoWoKjMbpDZDVLTIf8w+t2X0Z0zoLICnbsJdmyBmmrUlTegJp7jskhbfapLFqpLVnvdRvALqxegVFc5cjAClFOZ+5bkoEgPStCSAEUIYczEOXzQeJHRDaUUatho9GeL0cv+5/qcb5bAxHOaHOIR3qcsFggNM0rDB8NMnvJSqKs1nscneHy6Co80CtdJD0rQkQBFCGEUZqurNbrLk4yhGjX1EmN9k8py4xhLCGT3QXXvifVvf4a9O9AFR+oN8ST7qvUdT3i4EaAEw0wes/ckOgZVv3fIXZEyiydYSYAihHDOP7HNxFEJnVC/vMH18TkDYdsG9JpvHSsZN5KDItpAeASUlwXHL+XWzOABCJfVjIOVJMkKIdC2svYqo5tbx6uR44zzvv/K8RewDPG0nyAq1qZbkyALjh4UWc046EiAIoSo14PS1a3D1fAxoBTs22lsCAuH2Pg2apxoIJhqodjK3KuWJMiC9KAEMQlQhBDOM3jcoBKToVd/x4ZOybLOTnsyA5RgWDDQWz0otbXo2lpvtEj4CQlQhOjgtNUKhw8YLzK6u32eGjnW8aKTDO+0K9sQjw6CIZ5WByjh9aZZV8t6PMFEAhQhOrpjR41chtAwSOns9mlq+DjHc8k/aV9msbYgGOLRRYXGk5YGKKGhEBJiPJc8lKAiAYoQHd3BvcZjeheU+YPeDSo51b5mj8zgaWf2IZ4g+IXcmjL3YAwtSh5KUJIARYgOQmuN9etP0Af2OG23fvlfAFTPfh5f03LxldAjBzVmkhdaKNylgmgWj5kk2+IeFHBU05UelKAidVCE6Ci2bUC/+k90dCyW+/6B6pSM3rIOtqyDkFDUuZd6fEk1YBghA4Z5vamiGUEyi0drDSVFxou4xJZfKEJ6UIKR9KAI0UFoMxG2vBTri0+grXVY338VADVhKsqD/BPhY8Eyi6e8FOpsKzK3oMy9nfSgBCUJUIToKAqOOp5vWYd1wTzYnQvhEahpV/iuXcJzwTLEU2zrPYlqYZl7U4QtYJMelKAiAYoQHcUxW4DSvZfxuOEHANSZF7W8SJbwjSAZ4qGk0HiMa0XvCdh7ULT0oAQVCVCE6CC0LUCxnH8FDBttbIyORU292HeNEi1jTjMO9Fk8Zv5Ja4Z3QHJQgpQkyQrRUZg9KClpWGbdjI6NRw0bg4qO9W27hOeCZIhHm0M8rexBUeGRaJAclCAjAYoQHYCurnJU7EzujIqJRc262adtEq1gG+LRQTLEo1ozgwfqLRgoPSjBRIZ4hOgIjuUbj1HREB3j27aI1jN7UAJ9Fo+3hnjCZRZPMJIARYiO4NgR4zE5TRb1CwIqSKYZe2uIR3pQgpMEKEJ0ANqcYpyc5tuGCO8wA5RA7zEwhx1bO8QjPShBSQIUIToCW4KsFGMLEkE2xKNaU+Ye7D0oWnpQgooEKEJ0BOYMniRZ1C8oBM0040Lj0Vs5KIGeNCycSIAiRAeg7T0oMsQTFIKgUJuurYHyMuNFa6cZmzkoldKDEkwkQBGiIzB7UJJliCcoREYbjxXlaKvVt21pqZJi49FigdbW4pEelKAkAYoQQU5XV0GRbUl76UEJDgmdQFmMhfbMqbqBpl6Ze2Vp5a+iyCjjsaK8ddcRfkUCFCGC3XFbDZTIqNb/pSr8ggoJMYIUgOMFvm1MS3lrijE4avtIgBJUJEARItjVm2IsNVCCSFKK8Xgi37ftaCFd4sUAJcoWoFQG8JCXaEACFCGCnD4uNVCCUqdkAPSJYz5uSAt5q8w9OHpQtJZE2SAiAYoQwc7Wg6IkQAkqqpNtynjADvEUGo+trYECqLBwCLUtLSfDPEFDAhQhgl29VYxFELH1oHAiUAMUL63DYzKHeSpKvXM94XMSoAgRAPSxfPTRvBaea/agyBTjYKJsOSg6QAMUr+aggCNAKZcelGAR6usGCCGapivKsc67DWqqsTz4b1RsvGcXKJAelKDUyZYkG6hDPGaZe2/koEC9mTxl3rme8DnpQRHCz+kVnxs/zCsrYOt6z86tqYai48YLyUEJLmaAUnQcba3zbVvq0VvXY33jX+jmFu7zVpl7U5RRvE5LgBI0JEARwo/pujqsX/zX8XrzWs8ukH/YeIyIgpg47zVM+F5iJ6MKa12dI+HUD1gXv4Fe+j/Y+EOjx2itvVsHBRw9KOUSoAQLCVCE8GOVq5dDviP3RG9Z5/a5urIC60t/N150y5YaKEFGWUIgIcl44U/DPIXGtGdd3ESF28oKqK0xnntpiEdFSbG2YCMBihB+rGTxQgDUpPMgJBQKjqDNXpEm6NoarP96CHbnQkwclqtuauOWCp+wF2vzj1ooRs+IbVmFspLGDzSHdyKiUBER3nlz6UEJOhKgCOGn9P7dVK3/ASwW1DmXQq++xvZmhnm01uiX/wGbfoLwCCy/+wsqo1s7tFi0N5VoFmvzk2qyVRVQXW08L2tiuq+3pxiDPQdFkmSDhwQoQvgp6xf/AUCNGIdKTkX1HwqA3rK26RMP7kF/twxCQrD89k5Uz75t21DhO37Wg0JRoeN5Uz0oZs6Mt/JPAKJs60xJD0rQkABFCD+ktUavXg6AZco0AFT/YcbOrRuanLWhD+4znvToixo0si2bKXwtyc+mGpurZgO6vPEeFK/XQAGZxROEJEARwh8VnTC6yy0W6JFjbMvuY/wQLiuBfbsaP/fIQQBU58x2aKjwJdXJz4q1mbklAKXFzR6nvFDm3qRkReOgIwGKEP7IlggbkpqOCg0DQIWEQN/BQDOzeY4cMh7Tu7RpE4UfMGuh1AtQdNGJ5muQtBFdrwfFrRwUr/agSJJssJEARQg/pG1Ti0PTuzptd+ShNB6g6MNmD4oEKEHPDFAKjWJt+tA+rH/+NdZ/Peib9ribg9IWQzxSSTboSIAihD+y9aCEZp4coAwznuRuQu/Y3OA0rbX0oHQkCYkQEgJWKxQVor9ZYsyi2bwWXVXZ/u2pP8RTXmp8P7rQljko0oMSPCRAEcIf2RYGDM1wDlBI7wKDT4G6WqxPzEHv3Oq8v+i4kbuiLJCS3k6NFb7iVKwt/7AxewuMgGXvDreuoUuKvVYq32mIp67O+F50xTaLx5s5KPYelNoaY4kHEfAkQBHCD5nF2BoM8SiF5bo/Qb8hUFWB9Yl7nYMUs/ckJQ0VFtZezRW+1MlWC+WrT5wSU/Wubc2eqjevxXrblej/LvJOW+oHKOAyD0XX1YFthW1sdVy8IjLK8VyGeYKCBChC+KP8RnpQABURgeWme4yE2coKrE8/aPzQx5F/guSfdBgqKRUAvfobY0OsseaSWwHKmpXG44bG183xSP0hHoBSF3koB/ZAdZWR1OrFmWbKElJvmEdm8gQDCVCE8DO6vMz+gz20kTwSFRGJ5eb/g+hY469WszvfnGIs+Scdh60HBW0FQE2/yni9a1ujOSAmvTvXeJK3H221tqoZWmtHkqwZKLhIlNU7txhPevVFWbz8KyhKEmWDiQQoQvgbc62duEQs5ri6CyoiEvoOAhyzehw9KFIDpcMwZ/IA9MhBjZlkJM4WnWiygJuurjJ6MwCqKh3DLi1VXgp1tcZz29CkdjXV2DYkqXr1b937uSLl7oOKBChC+Btz9eK0jGYPtU873rbB2GDLQZEpxh2HSnIEKGrcZFR4BHTtATQzzLNvp5FMazq0v3UNMcvXR8c4Endd9aDsMHpQVK9+rXs/V2TBwKAiAYoQfkbbZvCotOZn4ah+RoDCji3oynIosPW+SIDScSSnGY+hoahTJwCgetqqDzcRoOhduc6vD+1tXTvMBNn4TqgY27o4JwUo+ngBHM83ZpmZFZK9yTbEo6WabFCQAEUIf2Mb4lGpzfegkN7F+Gu1phr93VfGX8ThEY68BBH8uvdCTfsZavYtjsDAtkCk3t1ED4qZfxJjJNVyaF+rmmGfYhyf6Ljmyevx7LLNOOuWjao/68ZLlPSgBBUJUITwM+YUY1Ld6EFRCtV/iHHeVx8bGztnopRqq+YJP6OUwnLRTCyjJzq2mStY792JrqlxeZ6ZIKvGTDJeH2xlD4q5vk5CJzADpZNm8Wh7/kkbDO+A5KAEGQlQhPA3+eYQjxs9KGDURAF7wqNKbzg1WXQwqRnGdOPaGjiwu8FuXXzCSIpVCjVusrEx70DrCraZM3jiEx1TnU8e4jFr9rRFgixAlC0wkh6UoCABihB+RNfUwIljxgs3elAAlBmgmGQGT4enlIIetmEeV3koZv5JelcjoTY83Ahmjh5u+ZvWG+JR5hBPvVk8urrKSMwFVO82ClCizR4UyUEJBhKgCOFPCo6A1kZVTDfXKVHJac7BjCTIChzDPHrjj+jaWqd9evd22zE5Ri2SjO7GjlYkymqzSFtCJ6M+Dzgnye7ZbpS/T0wCW3E5r7MnyUoPSjCQAEUIf2KbwUNqukd5JOZ0Y5ApxsJg/57YuAbrA793WlzSnjxr62VRmUaAoluTKGvrQVHxnVwmyTqGd/q1XY6UFGoLKhKgCOFHtFkDxZ0ZPPXVH+aRIR6BkYiqrv69kQ9ycC/Wh+/E+u/56Lz9Rm8GoMypvl1sPSgHWxGgmHVQEhIdAUpZib2arW7LAm02zc3i0YXHG/QmdVRaa/Se7X69sKIEKEL4E/sUY89WIlYDhhnJib36OX5Iiw7PMvYMLHOfRp1+NgB61VdY/3KjkaMRHgFdsgBQmcZjS3tQtLUOSoqMF/GJjlk8tbVGlVqAPcZyDPYZRm0hqvEcFL1tA9Y7rka/93LbvX8A0V99gnXe7d5bKLINhHpy8Pvvv8+qVas4ePAg4eHh5OTkcOWVV5KZ6fiLrbq6mldeeYWVK1dSU1PD0KFDufbaa0lMTLQfU1BQwL///W82bdpEZGQkEydOZObMmYSEhHjtxoQIFPrwAfS2jahOyej9u4yNbhRpq0/FxGGZ9y8IkRWMhTMVG4+66ib0pHOx/udNWPu9sSO7D8r8mWsb4uHIQXRtDSrUw++j0hKjBo9SEJtglNoPCTVK35eVGotZFh03jjV7a9pCEz0oeuWXoK3o7Zsb7OuI9NefGI+5G33cksZ5FKBs3ryZqVOn0qtXL+rq6li4cCEPPPAAjz32GJGRkQC8/PLLrFmzhttuu43o6Gief/555s+fz9y5cwGwWq08+OCDJCYm8sADD3DixAkWLFhASEgIM2fO9P4dCuHnrP96GA7upf6ybm4VaTuJioz2XqNE0FHdexFy493ovTvRq79BjZrg2JmUYiRmV1bAkTzPg4hi2wye2HhUqO3XSmyckZdSVmJUjwVISm3b71MzB6WyHG212hcj1FarY8XmE42vT9RR6EP7YL9t+vmhfWit/bJ2kkdDPHfffTeTJk2iW7duZGdnc+ONN1JQUMCuXcZffeXl5Xz55ZfMmjWLQYMG0bNnT2644Qa2bdtGbq4xrW3dunUcOHCAm2++mezsbIYPH86MGTP49NNPqZWxQdHB6LISMAtkde1hdFGnd4UefXzbMBG0VFYvLJfNRnXv6dimlL0XpUUl7838k/hEx7Z6M3l0nm3oKLOb59f2hNmDorURbJl25zqGoIoL0bWui9d1FPr7rxwvyksdU8T9TKtyUMrLjXG+2FjjG3HXrl3U1dUxePBg+zFdunQhJSXFHqDk5ubSvXt3pyGfYcOGUVFRwf79rVysSohAY5vuSVoGIfc+ieXJhVjuf0p6Q0S7U7Z8FFpQUVbXL9Jmqj+Tx7YQoTlbqK2osHAwe3Dq5aHo9T84DtIaCo+3aTv8mdbaOUCBVi9z0FY8GuKpz2q18tJLL9G3b1+6dze+6QoLCwkNDSUmxjlJLyEhgcLCQvsx9YMTc7+5z5Wamhpq6pVrVkoRFRVllPn2w24pbzLvL9jvEzrWvZp0vdkUJ38/d8TP42Qd9TPwxX2rrN7ob5ag16+Gi6/0bJp7cSEao8y9ve2xccawZVmp/Regysxq0T159HlExUJJIaqiDKWMhRT1htXO1ys85nEiuklv34z1iw+xzLweVT8gawNt8n2wY4tRRTgyCtWrP3rTGsjbjxo43Hvv0QRP7qXFAcrzzz/P/v37uf/++1t6Cbe9//77vPPOO/bXPXr04OGHHyYlJaWJs4JLenrL/jMFoo50r/l5+6gEEoaeQlyG67yTjvR5NKajfgbted/WaZdxaNHz6P27SS4qIKL/kOZPsimsq6EEiM3oSqLt+/hYShrlQJwFSg4fQAMpQ4YT0cj3uTvc+Tzy4uKpLSkkOTqKiIwMao8eJm//brBYCOvWg5q9O0mw1hLTwnYceeRO6nI3ETfsVOKmX9mia3jKm98Hx997mTIg+rQphKakUbxpDVGFBSS14uvSVloUoDz//POsWbOGOXPmkJzsWDU1MTGR2tpaysrKnHpRioqK7L0miYmJ7Nixw+l6RUVF9n2uTJ8+nWnTptlfmxFYQUGBU89KMFJKkZ6ezuHDh+31BIJVR7pXMLpa67ZuAKAkOZ3SvDyn/R3t83Clo34GPrvvU8bDyi/If/c1Qq75vdun1R06AEBZaBgVtu/jOmXMECremYu2Ld9wLDwKddL3uTs8+TxqwyMAKNi/D0tyOtal/zN29OpHbVIa7N1J4e6dFPf1vB268Bh1uZsAKNq/t8H/WW/z9veBrq2l7utPAagcMgpKiwEo27GVqja+F1NYWJjbnQseBShaa1544QVWrVrFfffdR1pamtP+nj17EhISwoYNGxgzZgwAhw4doqCggJwcoyBQTk4O7733HkVFRfahnfXr1xMVFUXXrq4XOQsLCyMsrOG0N611h/mhJfcafPSxfCO5MCQE3TXbGBt3dVwH+Tya0lE/g/a+bzXxHPTKL9Crv8E64xrHmjrN0HlGjonulOJor60Win1ab1IqRES16n7c+jxstVB0RSlaa6zrjeEdNfhUe2VbfTy/Re2w/vS940XRiXb72njr+0BvWmNMCU/oBP0GO3JPDu3DarW2y5CiJ/fhUZLs888/zzfffMMtt9xCVFQUhYWFFBYWUl1tVKKLjo5m8uTJvPLKK2zcuJFdu3bxz3/+k5ycHHuAMnToULp27cqCBQvYs2cPa9eu5c0332Tq1KkugxAhgtYe24JtXbJQtr/6hPCpHjnQrQfU1hh1Q9ygS4rBVr9H5Qxy7DCDmyMHjcc2TpC1q1cLRVdVwpZ1RtuGnGpMpwZ0C6ca63WOAEWbM5cCiN68FgA1fAzKEgKdu4LFYtSNKfK/xGGPelCWLFkCwH333ee0/YYbbmDSpEkAzJo1C6UU8+fPp7a21l6ozWSxWLjzzjt57rnnuOeee4iIiGDixInMmDGjdXciRICxL9iWnePjlghhUEqhJp6Lfu2f6K8+QZ95YfN/VW9bb/T+dclCJXRybD+p96WtZ/DY3ycqxkjOrShH/7jCWKU5OQ0yu6HyDxn7jnseoOiKcti63rHBT6fmNkVvN4ansAWSKiwM0jLg8EGjNyUxuYmz259HAcqiRc2XxA0PD+faa691CkpOlpqayl133eXJWwsRdMwZPFLzRPgTNXoC+u0XjZ6Preuh3kKUrtj/Kj/pOBUT61R8sN17UE4UoJcZ+SdqwlSUUuhOtlWUC495fFm9cY1Ruj8sHGqqHbVfAoQuL7MXZ1N9Bjh2ZHaHwwfRh/ahBrTPTB53yVo8QviAttY51ibpIT0own+oyGjUaKPKrP7p22aP1+YQyoBhzjt81INiz0FZ8YVR7ySlM+qsi4x9nWw9BC0p1mZbIkCNPM14XVpslPAPFDu3Gj1daRmoej0l9q/LIf+rQyYBihC+cPggVFVARCRkuE4OF8JnbEGzPtL0zA6dfxgKjhhr7/QZ6LzTXDDQ1F7f51HmQoVGAGK5/GqjgBtAXIJRyM3DYm26ttZeKl+dfhYoi3ENszptANDbjTV3nHpPADKM6r4tXSiyLUmAIoQPmPknZPUyktWE8CMqzVYT4+ihJo8zh3fo2RcVGeW8s34PSnJaw/1tJapeFeZ+Q2D4GPtLpRR0sk1x9SQPJXcjVJQZAU7v/hAXb2z342Gek2f+2GdT9RnkdJyjB2Wf382UkwBFiHaii05gXf4Z1q8/Ra8ySk1LgqzwS2m2FeqP5Tc5FKK3rAVcDO+AsfigbbG+dss/AZSZg6IsWGZc2zDJt5PnM3n0hh+NSw451fiDIt6WDFzsn4my+sghrLf+Ar3oBeN1dZV9WY0GPSiduxhfp4pyOOF5bk5banElWSE6Gl1eBlvXoQ/uM5Lu6s9YcIP1lQWw/qSS25IgK/xRQicIj4DqKig4CuldGhyirXVgKzSo+g9rsF8pZfSilBSh2nqRwPr6DYa+g1HDRqG6ZjdsV1KKkbzrSYBiTpXu2dd4tJW410WF+OMiDPrHFVBeiv58MXrMRKishLpaSEyCk0r8GzN5MuHwAWMmT5L/VGiXAEWIZuj8w1hf+jvs2AxWq7Exbz/qN3/07EK7bXVP+g+FiEgjUW3oaO82VggvUEoZ008P7IH8PJcBCvt2QVmJMaSS3UigbQtQ2rUHJTKakD/Ma/wAM1HWk96CY0eNa6cYxUlVQqIR5PjpEI/escX+3Pr2i6i+xgK+qs9A19PGM7vD4QNGYNMjB3Vy/pCPSIAiRDP08s+MMWgw/vrIP4z+6Vt0aTEqNt69a5QU2xPqLDfejYqIbKvmCuEdtgBFHzmEGtxwtzl7h76DUSGu86jUiLHob5e6HgLyFdtUY+1mDorW2h6gkGSrnu7HQzzaaoWdjgCFbRscCbAnJzLbqOw+6DUr0cs/Q3//FWrkaajLZ6PiPesl9jbJQRGiGdq2/Ly6/FeE/PVZ6N4TamvR3y1z/yJ5th8QyWkSnIiAoMw8lKOuZ/LoTT8ZxzVRJ8Uy/ZdYHn7eaVqrryl7D4qbQzxlJVBVaTxPttVRMVcx9scelLz9RmXYiEjU2Rcb22x/HKmcRgKUsy5E/ew30CULaqrR3y1FL/mgfdrbBAlQhGiOuVR8Vm/jcfzZgNGz4m7WuzZrDLRjV7cQrWKbyaPzGwYouqLcGPIE1KARTV6mPdZ38YiZY+FugHIs33hM6OSYrmzLP9N+WE3WPlunZ1/U+TMg1jabKjrWPqX4ZCo0DMuUaVju/TvqimuM6+za1h7NbZIEKEI0QVdVQv5h44UtuFCjJxjVJA/udeSVNMcMctozWVCIVrBPNT7iYqrxlrVQVweduzh6WgKFOc3Y3WJtx44Yj0mp9k3Kn3tQzMCxd39UdAzqol8YrweNRFma/pWvlHIEnHt3+rwQnQQoQjTFtkorcQmoOGP1bRUda68mqZd/5tZlzNVeyZAeFBEgUm0ByrGj6Npap132abeDR7Z3q1ovNh5CbQvTupEoq209KCqls2OjPQel0MuNaz0zQVb17m88TjwXyx0PoX5xnXsX6NzFSHyurnKsduwjEqAI0QR90PYftEuW03Z1+lnG/lVfoyvLm7+QLUBpt3LfQrRWYhKEhxsz144ftW/WWqM32gKUQYEXoBjF2jyYyWNPkHX0oNhzUMpKPC+Z34b08QKjvcpinxKtlEL1GYCKdm9mjrJY7LOy9G7fDvNIgCJEUw7ZEmRPClDoM9CoHVBVif5hRZOX0GUljpVPM1xM1xTCDymLxdGLUj9R9sAeo0x8eAQ0knTp92zBhjvF2rQZoCSnOTbGxBrl/QGK/afcvTZn73TrgYqMbvrgJtjXB9vl5hB2G5EARYgmmDN4Tk5uVUqhTrEtGtZcMpmZIJuU2qofGkK0O1uAUn9NHnNNGvoPdSSNBhiPZvKcVAMFbMFbXKLxwp+mGm935J+0hllA0r7iuo9IgCI6DF10Al1V5dlJh5oYmrEtfqZdJRHWf19zHFeGd0SAsSfK5tcPUAJ3eMfOk/V4Tq6BYjKHeYoKvdWqVtO2BFl6D2j6wOaYS3Ac2ufeEHYbkQBFBCxdVYU+dtQoTNTYMVqjt6yj7ol7sf5hFtanHnD/+uWljr+wXAQXqrNtddZmAhRH/onM4BEBprOtB8U2xKPLSmHXViBAE2RN5hBPwZEmD9MV5UZNEXDUQDGZU439pAdFV5TDAduQdGt7UBKTjOnYWsPend5oXotIJVkRkLS1Dut9NxlLvYdHQHpX1OgJWM6e7jimpgbrP+4Hs+IlwJZ16MMHUa5Kd5/M7PlISnEsQFaf7Yc3RcfRFeWoKNfDN9KDIgKVSs0wSrqbAcrmtUbSbEY3VHJaU6f6NZXZ3bgvcwi3MWbvSWxcg9WYVXyCf5W737MdtNUoBtnJC4XxeuTA8QL0rlx7qfz2Jj0oIjCVlRnBCRjT4fbtRL/9Irq02HHM1nVGcBIahjrjfHu3p171tVtvYZ/Bk5nlcr+KjjWWX4eml6U3h4kaKZIkhN8ya5wUHEZXVqA/fQ8ANfgUHzbKC8yk9+P5xiKgjWlseAf8bqqxPnzAeOJigcSWMBNl9R7fJcpKgCICkzkuGhaO5YF/2atemkWKAPT2TQCo0ROxzLwOdbqtAuzqr92rAGuWuG+q58PWE6MPH3S5W5eVQtFx44UEKCLQdEo2aobU1WF9+kHYuwNi4lCTp/m6Za2iYmIdeSiHGu9Fsc/gSXEVoCQaj/5STdY21Kw6e6dwnj/M5JEARQQmc22MyChU50xUP2M9EJ27yX6IveSzbYEsNXyMUQH28EHYv6vZt7APzXRpPEBRnW1DRUdcByj2NXiSUhodAhLCXxlTjdONF5vXgrJg+c0fUSfnYwQiWy+KPuAIULTW6Po9IuYMHlc9KP6Wg2LmwnkpQKF7L6OeSuExtCcrP3uRBCgiMFVWGI/muLCtHoMZoOiaamNMFlB9jKEdFRUNtq5pt4Z5zPL0J9dAqc/8YdBIoqx9DR7pPRGByuydBNRls/xrZeJWUOYfHvXyUPR3y7DefhXWzxcbr+01UBoGZPaVfv2lDortjyT7H02tpCKjHH+cubukh5dJgCICkxmgRBgBihmEsH+XMS1udy7U1kJCkuMvQMAyagIAevU3Tc/+KS40VgBVCtIbDy7MZNtGpxpLBVkR4MyufjVqAuqsi33bGG/qkg2APrjHvkl/v8x4/OQ9o0Ksvcx9E0M8zfSgWBc9T919Nzed69JKRlttwZQX10ZStmq09t7odiYBighMVc49KCop1aj0aLXCzm32/1CqzwDn1VQHjzTOOV4AO7c2fn3zr6rUdFREROPHmX+tHD7oMq9Fm+8hAYoIUOrs6Vj++CDqmt/738rErWDvGT241xjaqa2xFzqj6AR6zbdNJ8kmJBqPFeXoatf1lXR5GfrL/xo/T9pydeCCI8bPvvAIY4kCb+k3BAC9dV0zB7YNCVBEQNInD/EAqt4wj5kgSx/ngkUqPMLIRcHx15LL66/+xnjS1PAOQEq6MU5bVdEgWU4fOWT05FgsqCEBPutBdFgqLAyVMxBlCfF1U7wroxtYLEadkxPHjACiXqChl3xg9KKCc5l7U1QMhNoqdTQ2k8dc9Rmcc1u8zaz0m5bp1SBS2QIUDuzxSa6NBCgiMFUaSbIqItKxzZYMq7ett/eOqD4N1wpRY84wjvtmCXpLw78M9Oaf0N8sAcAy5cImm6HCwhwZ/icN89gDoAHDHOPVQgi/oMLCHD2gB/eit6w3nvcdbKyzs3eH8ToqGlzUQVJKOaYaNzKTR6//wfGipO1yVbQ9/8R7wzuAsYJ7tx7Ge5ifTzuSAEUEJnOacf0eFDMY2bnVyFGJinE9A6f/UNTYyWC1Yn3mEXT+YfsuXVGO9eUFxvXOOB/Vd1Dzbels5qEccFxHa/R3y4zrjJ7k/n0JIdqNOcyjD+6xD2Oo0RNRI8Y5DkpKbbxXwjaTh5LCBru01epYtwjatl6KfQaP9xcjVf2HGU+2rPX6tZsjAYoITFUNh3jonOlIXAPo3d9lt7RSCvXLG4wlxctKsD41z1inp7wU/fYLcDwfUjqjLrnKraYoVzN5dm2D/MMQEWkfUhJC+BkzQNm5zT5TRfUbgpp0nuOYlM6Nn59k1FJxWQdp7w7nXhMXQYy3aLNQZOeMpg9sAXPWlt6yzr36UV4kAYoITK5yUJRyGtJRJ+Wf1KfCwrH89i4joDm411in55aZjqGd2b9rUNq6US5m8pjDO2r4GOdhKCGE31BdbTlm61cZuSLJaajUdCN3zVaRVSU1XvNF9ewHuJ7lYh/eseWptG0Oilmkzfs9KPQeYNzD8YLm1x3zMglQRGCqdBRqc5LjXoACoJJSjCDlpKx3de6lHq09oerN5AHQtbX2JFsz30UI4YdsU42xlRxQ/Y2Cj0opLJdfDZndUaMnNnq6mZjPjs0NyhaYwztq6GhjQxvloOiqKseipl7OQQGMWYy9jMUHdTsP88higSIg6SrnOigm1XewsYBXeARk9Wn2Oqp3fywPvwDWOnMLKtTD/xbmD4WCw+jaWtj0E5SWGOPTZha8EML/JKdBRKSjMnW9/69qwDBC5ixo+vxuPY2fQeVlRsn8rraE0sLj9iRbddoU9I8r2i4HJd/WqxEdi4qNb5O3UP2HordtQG9eB2ec3ybv4Yr0oIjA5GKIB4ykNzX7Fiy/vdPI0neDslhQoWG2fy2I2ROTjYCorg799SdYX33KuO6pE1AhQTY1U4ggoiwWpxpFqr9nf1CokBDoZRvmqb/Mhpkcm93HUaqgpKhtcji8XeLeBXv14G0b0HV1TR7rTRKgiMBkC1Bc5YlYTpuCGjSy3ZqiLBZ79Ua98FljccD0rqipF7dbG4QQLaPM1X8zu7eoHIB9KLleHopev9rYN+RUiEs0NtbVQXlpK1rqmvbyIoEuZfUyplpXlNmXEGkPEqCIwFTVSA6Kj5gl7wHUlAuw/N/jqMRkH7ZICOEO84+ZpnJNmjzfLBC5fZNRXuDYUTADlOFjjJ7cKFsdlbZYt6c9elAsIagBwwGwvvyPtk34rUdyUERgamSIx1fUmReia6qxTD7f/h9ZCOH/1IixRh5aS0vE98gxZrkUnYD8PPTSj42k2/5DHb0z8YlG70NxIWR09VLLDWaRtraogVKfunSWsXRH3n6sj/8Fyx/moWLi2vQ9pQdFBCb7YoH+MYVX9epHyE33SHAiRABSSSnGUG1Lzg0Lh2xjQUW9dpWjVMHZFzsOikswHtuiFspRo8y98uIiga6olM5YbptrJP8f2IP18XvRZk92G5EARQQmP+tBEUJ0XGYeiv7wDaOIZJcsGDjCcYCtgKS3h0Z0Walj+nIbFGk7mUrvYgQpsfGwdwf6h+Vt+n4SoIiAo2tqoK7WeCEBihDCx+z1UGw9Curs6U7l8VW82YPi5RyUvH3GY0InVGS0d6/dCJXZHTVqgu39DzR9cCtJgCICj1kDBRrUQRFCiHbXq7+xqjlAYjJq1OnO+82ZPN7uQVm7CnC9KGqbSjN6a+wl9tuIBCgi8JjDO2HhUmdECOFzKioauvc0nk+Zhgo9qQaTrQdFe3EWj9YavWal8aL+4obtwJ7vYst/aSsyi0cEHsk/EUL4GctVN6I3rUWdeWGDfSo+0ahw7c0k2QN7jAVJw8JRg9uv7hPgyHc5moe2WlucYNwcCVBE4JEARQjhZ1T3XqjuvVzvbIMhHnvvycAR7i9s6i3JnSEkBGqqofC4fVVnb5MhHhF4zKltkn8ihAgEtlk83izUpn80AhQ1cqzXrukuFRJirGME0IZ5KBKgiMAjPShCiEBi1kGpqjBWH24lnbcf8vZDSKhRTt8XzOU9JEARwkHbAxT/KNImhBBNiooGM3HWgzwUXXicuqITDbfbek/oPxQVHeuFBnrOvvbPkbZLlJUARQQec6FAGeIRQgQApZR9Jo+7eSi6spy6+27myK1XoWtrnfetMYd32nf2jhP7VGMJUIRwqCw3HmWIRwgRKMxEWXeLtR3YA6XF1B3NQ+/YYt+sj+bB/t1gsaCGjfZ6M92l0syZPDLEI4SDn61kLIQQzfKw3L0+sNfxfMNqx3Nz9k7fwajYeG+1znNmLZT8w2irtU3eQgIUEXgkSVYIEWCUh0M8HKofoPzgeL7mW+N6I9p/9o6T5DTHVOMTx9rkLSRAEYHHvpKxBChCiADh4RCPPugIUDi0H11wBH08H3bnglKo4b4NUFRICKSkGy/aaJhHAhQRcHSV9KAIIQKMvRZKYbOHaq3hoLEQoCUxydi24Qd77wm9+6MSOrVBIz3UxomyUklW+JT1k3fR33wGmd2wZPWm6rQzIKlz0ydVSg6KECLAxJnr8RQ2f2zRcSgrAYuF2PMvp/j1Z9AbfoQKY4KAaue1dxqj0jKMEv4uelC01mC1tmq9NOlBET6jq6rQ/33L+OZe+z3Wxa9z9I5r0Tu3Nn2irQel3cs7CyFECymzB8WdIR5b7wlpmUSNO8N4vmUd7DRm8/g8/8TU2SzW5tyDoquqsD5xH9Y/zEIXN6zj4i4JUITvbFhtzMhJSkVdcQ30yAHA+tnips+z56BIoTYhRIDwIElWH9wDgOqSRVhWL2Otm9oa0Bp65KCSUtuunR6wr2p8xNGDomtrsT7zMGz+CUqL0ds2tvj6EqAIn7Gu/gYANXoClrMuIuSqmwBjGp0+XtD4iTKLRwgRaMwelLISdF1d08faelBU1yyUUqjBjnL2ftN7AvYcFHOqsbZa0S//HerNOuLQvhZfXgIU4RO6ohw2/AiAOuV047FbDyIGjwSrFf3Vx42fLAGKECLQxMSDUkYvSGlxk4faZ/BkZgGgBp9i3+cv+ScAJKVCSCjU1qD/9zbWx/4P/d0yY/rx0FHASbORPCQBivAJve57Y/585y7QrYd9e+wFM4z9X3+Krql2fbLM4hFCBBgVEgJmYbXj+Y0ep611kGf2oGQbjwOHwYDhqAlTHRVc/YAKCYFUY1KDXvw6bNsAyoKafQuWKRcYBx1seQ+KzOIRPqFXLwdAnXq6sU6FTdSYCUZUfjwfveob1GlTnM+rrQFzXQoJUIQQgSS7D2z4AZ27EWXLuWsg/whUV0N4uP2XvwoLJ+T3c9qxoe5TI05Df/ou9OiLGnIKavgYVHpXR3Jsfh66ugoVHuHxtaUHRbQ7XVYKm34CQJ063mmfCgnFcsb5xnFf/seYqlafObwDUqhNCBFQVP+hAOgt6xo/yBwSyeiOsrR8im57sUy/Ess/3yXkTw9hOfcyVHpXY0dcotFjpDXkHWjZtb3XTCHco3/6FupqoUsWKrN7g/3q9LMgLBz27YJ6i2QBjgAlLLxV8+uFEKK9qf5DjCfbNxu9wS6YORuufjb6K2VpGEoopaCLkUPT0jwUCVBEu9M/fQcYwzuuqNh41JhJxrFf/td5pywUKIQIVJlZRsG26irYtc31MeYv865Z7deuNmIPsg5JgCICha2oj+rVr9FD1GTbMM/JU45lBo8QIkApiwXVz+hF0VvXuzzG0YMS+AGKowelZYmyEqAIt+nqKqxL/4cuaXqKXJPX0BpO2AKOxORGj1Nde0DOoIZTjmWhQCFEIDMDlC0NAxS9b6ej6FmXwA9QVBfpQRHtRP/nTfQb/8L64hMtv0hFuWOYplPjAQqAZco0433rTzm296BIFVkhROAxE2XZvQ1dL+lfHy/A+o+5oK0w+BRUMz8fA4I5xHO8wKh95SEJUIRbdE0NevlnxosNPxiRfkucOGY8RseimitVP3S0MeW4tBi9yqg6KysZCyECmUpNh+Q0qKuD7ZsB0JUVWBfMhcLjkNENy7W3+7iV3qGiY6FTivGiBRVlJUARbtE/fetU/dD6v7dbdiFzeMeNvw5USAhq0nnG+5tTjm1/cSgZ4hFCBCj7dOOt69D5h7EueAD274a4BCy/+wsqOsbHLfSizG5Ay2bySIAi3KK//tR4MtJWZnnNt+i8/Z5fp9DWg2JG1c1wmnJ8cI8kyQohAp+Zh7L8c6x/ucGowBoWjuWme1ApnX3cOO9SZi6N9KCItqDzDthLGFuuuAaGjQGt0R+/4/nFbEM87o6vqth4x3/mDWskQBFCBDx7PZTyUqMy9oBhWO6ej+rZ17cNawuZLa+F4nGp+82bN/Phhx+ye/duTpw4wR/+8AdGjRpl36+1ZtGiRXzxxReUlZXRr18/rr32WjIyHOsHlJaW8sILL/Djjz+ilGL06NH86le/IlISH/2SvfdkyCmopFQs512Ode136O+/Ql/wc2NM1V1uzOA5mRo0Ar3hB/SmNY559TLEI4QIUCq+E2rKBei9O7Cce5mRFFtvyY9gorp0R4OjvosHPO5BqaqqIjs7m2uuucbl/sWLF/Pxxx/z61//mr/+9a9EREQwb948qqsdC7/9/e9/Z//+/dxzzz3ceeedbNmyhWeeecbjxou2p2uq0d9+CYBlwlQAVI8+MGCYMQV42f88u56ZJOtBhroaNMJ4smMzusi2voP0oAghApjlZ78m5E8Po4acGrTBCQAZ3YxVnEuK0MWFHp3qcYAyfPhwfvaznzn1mpi01vzvf//jkksu4dRTTyUrK4ubbrqJEydOsHr1agAOHDjA2rVruf766+nTpw/9+vXj6quvZuXKlRw/ftzT5og2pn9cAWUlxmwaM1AALKefbexf/4NnF7T1oCg3c1AAVFompGUYWe+2NXwkQBFCCP+nIiKN3x8A+Yc9OterqxkfPXqUwsJChgwZYt8WHR1N7969yc3N5bTTTiM3N5eYmBh69eplP2bw4MEopdixY4fLwKempoaaGse6BUopoqKiUEoFd+QJ9vvz1X2awzuW08/GElLv22XgcLBY4PABOHbU/cQuMwclKaXBPTV1r2rQSKPsvW2asbJ9/YOZr7/2/qCjfgYd9b4b01E/j6C5707JcOwoFB736F68GqAUFhYCkJCQ4LQ9ISHBvq+wsJD4+Hin/SEhIcTGxtqPOdn777/PO+84EjJ79OjBww8/TEqK+3+FB7r0dA/yPLykZu9ODm/fDJYQ0i+9kpDkVKf9R/oPoXrTWuL37yB28LBmr2etrORgeSkA6f0HYYmJdXmcq3utOP1MCuqty9MpPZPoenlNwcwXX3t/01E/g456343pqJ9HoN93QUZXKnZsId5aQ5wHv7e9GqC0lenTpzNt2jT7azMCKygocOpZCUqFx0iOCOd4dLxRB6Qd1b3zKgBq6CiOVtdCXp7TfmvOYNi0lsIVSykZflqz19NmCeeIKA4XFaOKS5z2K6VIT0/n8OHDDe5Vp3WB0FAj4x04UVFJ0UntCTZNfR4dRUf9DDrqfTemo34ewXLfdZHRABTt3U1VQYHbnQteDVASExONRhQV0alTJ/v2oqIisrOz7ccUFzuv5VJXV0dpaan9/JOFhYURFhbWYLvWOqC/aM3RdXVYH76TI/mHsVz9e9TYM9rvvauq0N8uBUBNmOr6cx40At5/Fb1lHdbqapSLr5HTNY/nG09sCbKNfe1cfl3DI6DPQNiyzngdERnUX/v6gv373B0d9TPoqPfdmI76eQT8fScmGY8njnl0H16tg5KWlkZiYiIbNmywbysvL2fHjh3k5OQAkJOTQ1lZGbt27bIfs3HjRrTW9O7d25vNCXxrv7MnFVlfehK9bpVXL6+LC6m7+3qs/34UbRt6se/7YTlUlEFKZ2PGjitde0B8orG2zo7Nzb9fC2bw1KcGjXS8kCRZIYQIDLayEvZCnW7yOECprKxkz5497NmzBzASY/fs2UNBQQFKKc477zzee+89fvjhB/bt28eCBQvo1KkTp556KgBdu3Zl2LBhPPPMM+zYsYOtW7fywgsvMG7cOJKSkjxtTlCzfvEfACP3w2rF+swj6NyN3nuDHZvh6CH0qq+xzv09eu8O+y5zBWE1YSrK4vrbRFksqIHGzB698UfHuY1FyOYMHg9qoDi9X71ZRBKgCCFEYLD/zPcwQPF4iGfnzp3MmTPH/vqVV14BYOLEidx4441cdNFFVFVV8cwzz1BeXk6/fv3485//THh4uP2c3/3udzz//PPcf//99kJtV199tadNCWp63y5jIamQENIefZHDT9yPXrcK61PzsDz4b2MRpta+R/056QVHsD50B2T1hqoqOLAbQkJQp01p+iKDR8K3X6I3/Ii+4GfoRS+gf1iO5fo7USf3vJzwrMx9AxndYPApxppAiRLMCiFEQOjUTgHKwIEDWbRoUaP7lVLMmDGDGTNmNHpMbGwst9xyi6dv3aFo24wVNWIcoWnpWK67g7p7bzKGfDavhVPGt/5NiouM9zhlPLqmGtatgp1b7bvVqAmo+E6NnW0cM2AYWlkgbz/We28GW56J/vrTBgGK9mChQJfvpRQhv/tLi84VQgjhI+YflNXVjuVK3BAQs3g6Gl1SjF71NQCWKRcAoMIjUENHoz9fjN68FuWNAKXECFBI74LlwpmwdT1UlENEpDGEktWr6fMBFRMHPXOMwOZ4PsTGQ2kxetMadG0NKrRe4myhUYjPkyJtQgghApsKC4fYOCgtgZJCoLtb58ligX5IL18CNdXQvRf06mffrgYON/ZvWuOVjG77EE9cglH0rv9Q1IixqIHDUb36OQcXTVDjpoBSqLFnYHngXxCXYETJ209KnG1lD4oQQogAZSbK2nru3SEBih/SK421b9Tkac5V9/oMhNAwOF4Ahw+2/o1KCo33iU9s1WUsE6Zi+cciYyp0TCxqyCkATrOOdG0NmAGRBChCCNGxmImyJRKgBCxdXmqUjwfUkFOd9qmICOgzwDhu80+Oc7asw/rxu/Z/escW997M/EaJS2x1u1VEhOP5EGO5Ar1+taOnxza8Q2ioMQwkhBCiw1DmH6Ye9KBIDoq/2bvTeEzpjIpr+ItcDRyO3rIOveknmHIB+sAerI/fC9pqP0ZHRGF54rXmh2jMHo34hCYP89iAYUYgkn8Y8vZDZnenGTwBv66EEEIIz9gSZXVpodunSA+Kn9F7jFokKst10To1wMhDYdsGdE0N1reeM4KTbj2MKcERkcaCeof2N/0+tTVQXma8iPNugKIio6CfsWCkXmesYt3aGTxCCCECWKLnPSgSoPgZvWe78aRHH9cHdMkyqrdWV6HffcmYeRMahuW3d2GZfQtkG+fp/btcn28qsS03EBICXqipcjJzeEqvNwIU+yrGiTKDRwghOhpziEeSZAPZ3mZ6UCwWey+KtlWaVWdfjEo1VrtU3XsaB+5rLkApNB5jExqtFNsa9vyZnVuNoCtvn/FaelCEEKLjkSTZwKZLiuDYUeNFIwEKAAOHOZ4nJKHOvczx2hag6OYClHpTjNuCSk6DrtmgrVjn3Y5e8YWxQ2qgCCFEx2MGKOUlTR9XjwQo/sSWf0J6F1RUdKOH1a/Qqi65ysj5MF93s/Wg7N+NtlppjL2brZVTjJuizr3MCEiiYyEiCpJS7bVchBBCdCCxcUaZDA/ILB4/ovca+SeNDe+YVHwn1BXXQEkRaswk553pXSEs3EiULTgMaZmuL2LrZlPensFTj2XUBBg1oc2uL4QQIjAopTxeQ00CFD9izuAxE12bYjnrIpfbVUiIkUi7Z7uRh9JYgNLGQzxCCCGEk8Rk0HVuHy5DPP7EnGKc3XQPSnOUO3koZpJsGw7xCCGEECbl4SQJCVD8hD5xDIqOg7JAt+YX6WtStx7GNZuYaqy9WEVWCCGEaJaHQzwSoPgLW/4Jmd2cysa3hD1RtqkeFNsQT1vmoAghhBB2idKDEpDsFWTdyD9pVtceRk9McSHaXAPnZOYsHslBEUII0R5kiCcw6d22HpRW5p+AbeG+zrbk2P27G76X1o5iOZKDIoQQoh0o6UEJPLq8DHI3AKD6DPTKNR2Jsjsb7iwvg7pa47n0oAghhGgPkoMSePTa76C2FjK6GSv/eoMZoLhKlDVn8ERFo8LCvfN+QgghRFOkByXw6FVfA6BGnW4Us/ECe6Ls3p3GkE59xTKDRwghRPtSYWEeLU4rAYqP6ZIi2LIOAHWqF6uuZvc2ygoXHIFd25z32WugyPCOEEKI9hNy2Wy3j5UAxcf0jyvBaoWs3qjOjVR9bQEVHYuylZnXSz9yfk+ZwSOEEMIXmlnKpT4JUHxMr3YM73ibmny+8R4/rEAXn3DssPWgKJnBI4QQwk9JgOJD+ngBbN8MgDplvNevr7J6Q8++UFeL/vpTxw6pIiuEEMLPSYDiQ/rHFaA19B6ASkptk/dQZ9h6Ub76BF1rTC3W5kKBkoMihBDCT0mA4kN67fdA2wzvmNQppxnF2AqPw9rvjI22HBQZ4hFCCOGvJEBpQw2m9568z1ajxFvF2VxRoWGoCVMBsC75AG2tqzfEIz0oQggh/JMEKG3EuuxjrL+9FL15resDjudDRTmEhEJ6lzZti5p4DkREwu5c9H/esi8UKDkoQggh/JUEKG1A19WhP1pkJKcu/8z1QeYaORldUaFhbdoelZiMuvK3Rts+egsqyowdkoMihBDCT0mA0hY2roHCYwDozWuNYZWT6AN7AFBde7RLkyxjzjCGesxhp5AQjyr6CSGEEO1JApQ2YF2+xPGirAT2NlwPRx+w9aB0zW6fRgFqxrVgBkRxCV4rqy+EEEJ4mwQoXqYLj8P61caLLlnGts0/NTzwwF4AVLfsdmoZqPAILNf/CdK7oE5tu5lDQgghRGtJgNICurwM6wevoY8dbbhvxedG6fre/VGTzjO2bVrjfExVFRw9ZLxoxx4UANU5k5C5T2O54pp2fV8hhBDCExKgtID+3yL0R4uwvvZP5+1WqxGgAOr0s1EDhxs7dm1DV5Q7Djy018gFiUtAxXdqr2YLIYQQAUMCFA9prdFrvjVebPoJfTzfsXPbBsg/DFHRqJGnoVLTIS0D6upg23rHNWwJsnRrnwRZIYQQItBIgOKpg3uNIARAa/S3S+27rEveB0CNmoCKiDSeDzB6UfSmtY5r2KYYq3Ye3hFCCCEChQQoHrL3nkRFG69XfG4M7eRuMqYXh4Sgzr7Yfrw5zFM/D0Uf3GM8aacpxkIIIUSgkQDFQ/onYz0bNf2XEBll9KZs34T1/VeN7aedhUrLdJzQd7BRcyT/MPponq3E/R7jWOlBEUIIIVySAMUDOv8wHNgNFgvqlNNRoyYAYH3tadixGULDUNNmOJ2joqKhVz/j/P++CceOGpVcQ0IgvWu734MQQggRCCRA8YDZe0Kfgai4eNRpZxqvDx8AQE0+H9UpucF5lnMvA2VBf7sU678fNTamd0WFtW2JeyGEECJQSYDiAf2TkX+iho81NvTIgYxuxvOIKNQ5l7k8Tw0aiZp9s/Fi1zZjmwzvCCGEEI2SAMVNuvgE7NwKgBo+2nhUCjV1uvH8gp+h4uIbPd8ybopRat4kU4yFEEKIRoX6ugGBQq9bbRRXy+6DSkq1b7ecdiZ6yKgmgxP7sWdeiNVqRX+3FDViXFs2VwghhAhoEqC4a+sGANSgEQ12uROcmCxnXwz1piELIYQQoiEZ4nGD1hqdawtQcgb5uDVCCCFE8JMAxR35eVB4HEJDoWc/X7dGCCGECHoSoLhBb9toPOmRg4qI8G1jhBBCiA5AAhR3bJPhHSGEEKI9SYDSDCP/ZBMAqu9gH7dGCCGE6BgkQDmJrqvD+vG76H07jQ35h+FEAYRI/okQQgjRXiRAOYn+YTn6vZexPv4XdOExtG14hx59JP9ECCGEaCdSB+VkO7cYj6UlWF98EhWXAIDKkeEdIYQQor1IgHISvSvX8WLzWrQyOplUX0mQFUIIIdqLDPHUo6ur4MBuANS5toX/tBVCQqCX5J8IIYQQ7UUClPr27YK6OohPRE3/JQwdZWzP7oOKiPRt24QQQogORIZ46tG7bcM7PXJQSmH51S3oj99BjRzv24YJIYQQHYwEKPXt2gaA6tnXeIyJQ132K1+2SAghhOiQAnuIp67Oq5cze1BUjxyvXlcIIYQQngnsAOXQPq9dShedgGNHQSno0cdr1xVCCCGE5wI6QNF7tnvvYruN4R0yu6Mio713XSGEEEJ4TAIU81on5Z8IIYQQwncCO0DZvxtdU+2da+1yzOARQgghhG8FdIBCXS3s3Nrqy2hrHezZAUgPihBCCOEPAjtAAfTW9a2/xnfLoKoCIqIgo2vrGyWEEEKIVgn4OihmgKKtVvSbz0JIKOqKa1BKNX9u0Qmsb/wL1nwLgBo+BmUJadP2CiGEEKJ5AR+gsGc7urIcvfJL9NL/AaAmTIWMbk2epotPYJ3zOygpgpAQ1DmXos6f0R4tFkIIIUQzAjtASUyCujr0d1+h33vFvllvWoNqLkBZ9bURnKSmY/ntXahuPdq6tUIIIYRwk08DlE8++YT//Oc/FBYWkpWVxdVXX03v3r3dPl9l58CP3xpDO3V1EBoGtTXoTT/BmRc1ea7+6TvjGpPPl+BECCGE8DM+S5JduXIlr7zyCpdddhkPP/wwWVlZzJs3j6KiIrevobJtFV9twYnl17cbr3M3Njn9WJcUwfYtxjWGjWnxPQghhBCibfgsQPnvf//LlClTOOOMM+jatSu//vWvCQ8PZ+nSpW5fQ/Vw9LaoC2fC8LGQmAzV1bB9U6Pn6XWrQFuhe09USudW3YcQQgghvM8nQzy1tbXs2rWLiy++2L7NYrEwePBgcnNzGxxfU1NDTU2N/bVSiqioKFRcImraDCguxDJ1OspiQQ8cjl7xOXrTT1gGjnDdANvwjmX4WLdm+/iS2T5/b6c3dKR7dYd8Hh33M+io992Yjvp5BON9e3IvPglQiouLsVqtJCYmOm1PTEzk0KFDDY5///33eeedd+yve/TowcMPP0xKSgr89o9Ox5aPn8yxFZ8Tsm09GRkZDa5lLS/j4JZ1AKSefQHhLo7xR+np6b5uQrvpSPfqDvk8Ou5n0FHvuzEd9fPoqPcdELN4pk+fzrRp0+yvzQisoKDAqWcFQGdkgbJQu3cXhzZtQCWlOO23/rAcaqohLYOC8GhUXl7b30ArKKVIT0/n8OHDaK193Zw21ZHu1R3yeXTcz6Cj3ndjOurnEYz3HRYWZnQuuMEnAUp8fDwWi4XCwkKn7YWFhQ16VcC4obCwsAbbtdYNv2gxcZDdG3bnYt20Bsv4s5zPWWObvTN8jP0agcDlvQapjnSv7pDPo+N+Bh31vhvTUT+PYLpvT+7DJ0myoaGh9OzZk40bN9q3Wa1WNm7cSE5O6xfrU2buyaafnLbr2hr0hh+MY2T2jhBCCOG3fDaLZ9q0aXzxxRcsW7aMAwcO8Nxzz1FVVcWkSZNafW01cDgAevNadG2tY8fWDVBRBgmdQBYFFEIIIfyWz3JQxo0bR3FxMYsWLaKwsJDs7Gz+/Oc/uxzi8ViPHIhLMCrF5m6AAbaAxSzONnQ0yhLw6yQKIYQQQcunSbLnnHMO55xzjtevq0JCUMPHoL/+FP3DCtSA4cZiguu+N/YPl+EdIYQQwp8FbTeCGnkaAPqnb9F1dbA7F4pOQFQM9Bvs49YJIYQQoikBMc24RfoOhth4KC2GbevRm9cCoAafggptOCNICCGEEP4jeHtQQkJQI8YCoH9Y4cg/GT7al80SQgghhBuCNkCBesM83y2Do3nGaseDRvq2UUIIIYRoVlAHKPZhHnNl4wHDUJFRvm2TEEIIIZoV1AGKOZvH/lpm7wghhBABIagDFAB1ymm2JxbU0FG+bYwQQggh3BK8s3hM/Yagzr4YktJQcQm+bo0QQggh3BD0AYqyhKAuv9rXzRBCCCGEB4J+iEcIIYQQgUcCFCGEEEL4HQlQhBBCCOF3JEARQgghhN+RAEUIIYQQfkcCFCGEEEL4HQlQhBBCCOF3JEARQgghhN+RAEUIIYQQfkcCFCGEEEL4HQlQhBBCCOF3JEARQgghhN+RAEUIIYQQfkcCFCGEEEL4nVBfN6A1QkMDuvkekXvtuOTz6LifQUe978Z01M8jmO7bk3tRWmvdhm1pEzU1NYSFhfm6GUIIIYRoAXd+jwfkEE9NTQ1PPvkkFRUVLTp//vz5LX7vlp7b0vMqKir405/+JPfahu/bmnPb8j2b+jx8ca+tOVe+Jzw7tyX3Haj36o6TP49gvtf6fPX939Y/15588klqamqavVZABigAK1asoKWdPwcOHGjx+7b03Jaep7Vm9+7dcq9t+L6tObct37Opz8MX99qac+V7wrNzW3LfgXqv7jj58wjme63PV9//bf1zbcWKFW5dK2ADlNaYOnVqu5/bmvdsDbnXtj3XF+8ZiOfK90Rwnhto7W3Nub5qb2sE/L3qAFRWVqYvv/xyXVZW5uumtDm5145LPo+O+xl01PtuTEf9PILxvj25p4DsQQkLC+Oyyy7rEImycq8dl3weHfcz6Kj33ZiO+nkE4317ck8BOYtHCCGEEMEtIHtQhBBCCBHcJEARQgghhN+RAEUIIYQQfkcCFCFEwLniiitYtWqVr5shhGhDwVPgP0Dl5ubyf//3fwwbNoy77rrL183xqqeeeoqvvvqKM888k9/85jdO+5577jmWLFnCxIkTufHGG33UQt966qmnKCsr44477vB1U3yuI30Wwfx/3lPFxcW89dZbrFmzhqKiImJiYsjOzubSSy+lX79+vm5emysoKGDRokWsW7eO4uJiOnXqxKmnnspll11GXFxcs+dv2rSJOXPm8OKLLxITE9MOLW5fEqD42Jdffsm5557Ll19+yfHjx0lKSmrxtaxWKwAWi/90jCUnJ7Ny5Upmz55NeHg4ANXV1axYsYKUlBQft06I9ufN//OBbv78+dTW1nLjjTfSuXNnioqK2LBhA6Wlpb5uWps7cuQI99xzDxkZGdxyyy2kpaWxf/9+XnvtNdauXcu8efOIjY31dTN9SgIUH6qsrGTlypU89NBDFBYWsmzZMi655BLAERnfeeedvPHGG+Tl5ZGdnc11111H9+7dAVi2bBkvvfQSN910E6+//jp5eXn8/e9/Jy0tzZe35aRHjx4cOXKE77//ntNPPx2AVatWkZKSQmpqqv24tWvX8u6777J//34sFgs5OTnMnj2b9PR0AObMmUPXrl255ppr7OcUFxdz3XXX8ec//5nBgwe374152Y033sh5553H+eefb9/2xz/+kVNPPZUrrrgCMIY1rrvuOtasWcO6detISkriqquu4pRTTvFVs9uEO59FoGrq/7z5//mll16yH79q1SoeffRRFi1aZN/27rvv8vHHH1NdXc24ceOIi4tj7dq1/O1vf2vv22mVsrIytmzZwn333ceAAQMASE1NpXfv3k7HvPrqq6xevZra2lp69uzJrFmzyM7OBmDRokWsXr2as88+m/fee4+SkhJGjBjB9ddfT3R0tC9uy23PP/88oaGh3HPPPfY/3lJSUujRowc333wzCxcu5Ne//jU1NTW89dZbrFixgqKiIpKTk5k+fTqDBg1izpw5APzqV78CCLoeaf/5U7sDWrlyJV26dCEzM5PTTz+dpUuXNlhz4dVXX+Wqq67iwQcfJC4ujocffpja2lr7/qqqKhYvXsz111/PY489RkJCQnvfRrPOOOMMli1bZn+9dOlSJk2a5HRMZWUl06ZN46GHHuIvf/kLSikeffRRe6/QlClT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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiMAAAHcCAYAAAAEBqrgAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAACLq0lEQVR4nO3deXhU1fkH8O+ZTPaV7AlLwhZF2RFQRAShipZad6217lStWvtra1VqK9bSSrV1qba1lbpVUbRacd8AEXAFURYB2QNkD5N9m5nz++Pce2cmmSQzk9nn+3kensncuXfm3klI3nnPe94jpJQSRERERCFiCvUJEBERUWxjMEJEREQhxWCEiIiIQorBCBEREYUUgxEiIiIKKQYjREREFFIMRoiIiCikGIwQERFRSDEYISIiopBiMEIUBZ588kkIIfDkk0+G+lSIiLzGYIQoQIQQLv8SExORl5eHyZMn49prr8Vbb70Fm80W0HMoLS1FaWlpQF8DAPbv39/jet39279/f8DPhYgijznUJ0AU7e666y4AgM1mg8ViwbZt2/DMM89g2bJlOOGEE/Dss8+irKwsxGfpH5mZmfjZz37W6+NZWVlBOxciihwMRogCbPHixT22VVVV4eabb8aLL76IefPm4YsvvkB+fn7wT87PsrKy3F4vEVFfOExDFAIFBQV4/vnnMXv2bJSXl+MPf/hDj33q6+txxx13YMyYMUhOTkZmZibmzp2Ld999t9/nX7NmDYQQOHDgAA4cOOAyVHLllVca+/3vf//DZZddhrKyMqSmpiI1NRVTpkzBww8/DLvd7s9LdvHpp58iISEBI0aMQENDg8tjFRUVKCgoQFpaGnbs2GFsnz17NoQQ6OjowJ133onhw4cjMTERI0eOxN13343Ozk63r/XBBx9g/vz5yM7ORmJiIsrKynD77bf3eF0A2Lt3L3784x9j1KhRSE5ORnZ2NsaNG4frr78edXV1xn6LFy+GEAJr1qzp8Rz6kJXz+wwAV155JYQQ2Lt3L/76179i/PjxSE5OxuzZs419BvI9J4pkzIwQhYjJZMKdd96JNWvWYPny5XjggQcghAAAHDhwALNnz8b+/ftxyimnYP78+WhpacHrr7+O+fPn47HHHsPChQt7fe7S0lLcddddePDBBwHAZehk4sSJxte33347TCYTpk+fjsGDB6OhoQGrVq3CLbfcgs8//xzPPPNMIC4d06dPxx/+8AfceuutWLhwIVasWAEAsNvt+OEPf4jq6mo8+eSTOPbYY3sce9FFF+Hzzz/HBRdcgPj4eLz66qtYvHgxvvjiC6xcudJ4DwHgscceww033IDU1FRceOGFyM/Px5o1a7B06VK89tprWL9+vTF0VFFRgalTp6KxsRFnnXUWzj//fLS3t2Pfvn145plncNNNNyEnJ2fA137LLbfgo48+wne/+12cddZZiIuLAzDw7zlRRJNEFBAAZH//xdrb26XZbJYA5N69e43tp556qhRCyOXLl7vsf/ToUTlhwgSZlJQkKysrje1PPPGEBCCfeOIJl/1LSkpkSUlJr6+/e/fuHttsNpu8/PLLJQD5ySef9Hn+un379kkAMjMzU951111u//397393OcZut8uzzjpLApD/+Mc/pJRSLl68WAKQl19+eY/XOPXUUyUAOXr0aFlfX29sb2trkyeeeKIEIJ9++mlj+/79+2VCQoJMT0+X33zzjctz3XDDDRKAXLhwobHt4YcflgDkgw8+2OO1m5ubZWtrq3H/rrvukgDk6tWre30vrrjiCpftV1xxhQQgi4uLXb7XztfnzfecKJowGCEKEE+CESmlLCgokADkp59+KqWUcvPmzRKAvOCCC9zu/7///U8CkI8++qixzddgpDcbN26UAOTdd9/t0f76H+C+/k2YMKHHcTU1NXLw4MEyKSlJPvLIIzIuLk4ec8wxsrm5uce+ejDiHHDoVq9eLQHI2bNnG9t+//vfSwDyjjvu6LF/fX29TE9Pl0lJSbK9vV1K6QhGHnvssX6vdyDBiLtgx5fvOVE04TANUYhJKQHAGF74+OOPAQANDQ1ui0FramoAAN98882AX7uurg733Xcf3nzzTezduxctLS0ujx8+fNir5yspKfFq+m5ubi6ee+45nHbaabjpppuQlJSEF154Aampqb0ec+qpp/bYNnPmTMTFxeHLL780tm3atAkAcNppp/XYf9CgQZg0aRLWrl2LHTt2YMKECTj77LOxaNEi3HjjjXjnnXdwxhln4OSTT8Zxxx3nMvQzUNOmTeuxLZjfc6JwxGCEKITa29tRX18PAMjLywMAo1Dyvffew3vvvdfrsc3NzQN6bYvFgqlTp2Lfvn2YNm0aLr/8cmRnZ8NsNsNiseChhx5CR0fHgF7DE9OmTcOwYcOwb98+zJkzBxMmTOhz/4KCgh7bzGYzcnNzUV1dbWzTC1SLiorcPo++3WKxAFCB1GeffYbFixfj7bffxssvvwwAGDp0KH75y1/ipz/9qdfX5k5hYWGPbcH6nhOFK86mIQqhdevWwWq1oqCgwGhOlpmZCQB46KGHINVQqtt/TzzxxIBe+/HHH8e+fftw11134dNPP8Xf/vY3/P73v8fixYtx8cUXD/TSPHbLLbdg3759yM3NxVtvvYVnn322z/2rqqp6bLNaraitrUVGRoaxTX8fKysr3T5PRUWFy34AMGbMGLzwwguoq6vDF198gXvvvRd2ux233HILli1bZuxnMpmM1+1OD2564y7LEqzvOVG4YjBCFCJ2ux1LliwBAFx66aXG9hNPPBEA8NFHHw34NeLi4nrt8rp7924AwPnnn9/jsQ8//HDAr+2JFStW4J///CdmzZqFTZs2IS8vD9dffz2+/fbbXo9xd27r1q2DzWbDpEmTjG361+6m31osFmzevBlJSUkYM2ZMj8fNZjOmTJmC2267DcuXLwegpkHrBg0aBAAoLy/vcewXX3zR67n3xp/fc6JIxGCEKASqq6txySWXYM2aNRg2bBgWLVpkPHbCCSfglFNOwcsvv4x///vfbo/fsmWLy5BEb3JyclBTU4O2trYej+mZmO5/rL/88kv88Y9/9PxifLR3714sXLgQOTk5eO655zB06FA89dRTaGlpwcUXX9zrENE999yDo0ePGvfb29txxx13AACuuuoqY/tll12G+Ph4/PWvfzUCL91vfvMbNDY24rLLLkNiYiIAYOPGjW57j+iZmJSUFGObXvfxxBNPuGRHysvL8bvf/c6r9wHw7/ecKBKxZoQowPSCRLvdbrSDX7duHTo7OzFt2jQ8++yzyM3NdTlGL+q85ppr8PDDD2P69OnIysrCoUOH8PXXX2Pr1q34+OOP++3aOnfuXHz++eeYP38+Zs2ahcTEREyYMAHf+973cPnll+O+++7Dz372M6xevRqjR4/Gt99+i9dffx3nnXceXnjhBa+v1WKx9NmB9corr0RpaSm6urpwySWXoLGxEStXrsTgwYMBAGeeeSZ+8Ytf4P7778cvf/lL/PWvf+3xHGPGjMHxxx/v0mdkz549+O53v4sf/ehHxn6lpaV48MEHceONN2Ly5Mm46KKLkJeXhw8//BAff/wx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rVuHhoYGfPe73/XpeCKKTAxGiGLURRddhPz8fNhsNlgsFmzfvh1PPfUU3njjDfzqV79CSUmJV8+3c+dOvPTSS5g9e/aAgpHy8vIewUheXh7+85//wGzmryyiaMT/2UQxatKkSRg5cqRx/9xzz8XWrVtx77334k9/+hMeeOABJCQkhPAMHYQQYXMuROR/DEaIyDB27Ficf/75WL58OdauXYt58+bhwIEDeP311/HNN9/g6NGjSElJwaRJk/CjH/0I6enpAFwXdLzpppuM53vkkUeQn58PAFi7di3eeOMNHDp0CAkJCZgwYQIuu+wy5ObmAgAWL16M7du3A3AsMqkvCFldXY2bbrrJZZHJRx99FJ988gkeeOABPP7449i2bRtSUlJw7rnnYv78+Th48CCeeOIJ7N69G+np6bj00ksxc+ZMl+ttaWnBiy++iE8//RQNDQ3IycnB3LlzcfbZZ3ORSaIgYjBCRC5mzZqF5cuX4+uvv8a8efPw9ddfo7q6GrNnz0ZWVhYOHTqE999/H4cOHcKSJUsghMD06dNRUVGB9evX44orrjCClIyMDADAyy+/jBdeeAEnnXQS5s6di8bGRrz11lu466678Kc//Qmpqak477zz0Nrairq6OlxxxRUAgKSkpD7P1W634w9/+APGjBmDyy67DOvWrcO///1vJCUlYfny5TjllFMwffp0vPfee3jkkUdQVlZmBEcdHR1YvHgx6uvrMW/ePOTm5mLnzp1Yvnw5LBYLrrzyysC9yUTkgsEIEbnIyclBSkoKqqqqAABnnHEGvve977nsM3r0aDz00EPYsWMHxowZg5KSEgwfPhzr16/H1KlTjT/4AFBTU4MVK1bg4osvxnnnnWdsnzZtGm677Ta88847OO+88zB+/HhkZ2ejpaUFs2bN8uhcu7q6cMopp+Dcc88FAMycORPXXXcd/v73v+OWW27BjBkzAADjx4/Hz372M6xZs8bIurz++uuorKzEn/70JxQVFQEAvvOd7yA7OxsrV67EggULjKwNEQUW85BE1ENSUhLa2toAwKVWo7OzE42NjRg9ejQAYN++ff0+16effgopJWbMmIHGxkbjX1ZWFgoLC7Ft27YBnevcuXONr1NTU1FcXIzExEScdNJJxvbi4mKkpqaiurra2PbJJ59gzJgxSE1NdTmvcePGwW6345tvvhnQeRGR55gZIaIe2tvbkZmZCQBobm7Giy++iA0bNqChocFlv9bW1n6fq7KyElJK/PSnP3X7+EBmyMTHxxtDQbqUlBTk5ORACNFje3Nzs3G/oqICBw4cwLXXXuv2ubtfKxEFDoMRInJRV1eH1tZWFBQUAAAeeOAB7Ny5E2effTZKS0uRlJRk1GrY7fZ+n89ut0MIgTvuuMNtUWh/dSF96a3I1JPiUyklxo8fj7PPPtvt48XFxT6fFxF5h8EIEblYu3YtAGDixIlobm7Gli1bcNFFF+GCCy4w9qmoqOhxXPdMhK6wsBBSSuTn54fVH/iCggK0t7dj/PjxoT4VopjHmhEiMmzduhX//e9/kZ+fj5kzZxoZBimly35vvPFGj2MTExMB9By6mTZtGkwmE1566aUezyOlRFNTk3E/KSnJo6EffzjppJOwa9cubN68ucdjLS0tsNlsQTkPImJmhChmffnllzh8+DDsdjssFgu2bduGr7/+Grm5ufjVr36FhIQEJCQkYMyYMVi5ciVsNhuys7Px1VdfuRSC6kaMGAEAWL58OU4++WTExcVhypQpKCwsxCWXXILnnnsONTU1mDp1KpKSklBdXY3PP//c6OuhP8eGDRvw1FNPYeTIkUhKSsIJJ5wQkOs/++yz8cUXX2Dp0qU49dRTMWLECHR0dODgwYP45JNP8Oijj/aoRyGiwGAwQhSjVqxYAUAVkOpr01xxxRU91qa55ZZb8O9//xvvvPOOUWexaNEiXHfddS7PN2rUKFx88cV47733sHnzZkgp8cgjjyApKQnnnHMOioqK8MYbb+DFF18EAOTm5mL8+PEuwcbpp5+O/fv3Y82aNXjjjTeQl5cXsGAkMTERd999N15++WV88sknWLt2LZKTk1FcXIyLLroIKSkpAXldIupJyO55UyIiIqIgYs0IERERhRSDESIiIgopBiNEREQUUgxGiIiIKKQYjBAREVFIMRghIiKikGIwQkRERCHFYISIiIhCisEIERERhRSDESIiIgopBiNEREQUUgxGiIiIKKQYjBAREVFI/T+cYXZ/ZEmu4QAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkAAAAHcCAYAAAA+1hWTAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAACqSUlEQVR4nOydd3wUdf7/X59JNr1sIIQkhCQECKAgRRHBQvMUkfNEURQ8C4Ll7HqWQ1FAOUXE9lPvi4IFTymiqChyNkAxqCjSpMQQEEISkhA2IT278/n98dmZnW3Z2WQ3m+y+n49HHsnOTvl8JrOzr3lXxjnnIAiCIAiCCCGkQA+AIAiCIAiivSEBRBAEQRBEyEECiCAIgiCIkIMEEEEQBEEQIQcJIIIgCIIgQg4SQARBEARBhBwkgAiCIAiCCDlIABEEQRAEEXKQACIIgiAIIuQgAUQQhE8YM2YMGGN2yzZt2gTGGObOneu34x4+fBiMMdx4441+O4a3ZGdnIzs726/HcDfvG2+8EYwxHD582OO6BBHKkAAiiE4GY8xJaBD6OPfcc8EYw/r16z2u269fPzDG8Ntvv7XDyFzDGMOYMWP8tn9XYokgQoXwQA+AIIjg5eyzz8a+ffuQnJwc6KEAAGbNmoW8vDwsXboUEydOdLve5s2bkZ+fj7POOgtDhw5txxHqp0ePHti3bx8SExN9ui5BhApkASIIwm/ExMSgf//+HUYATZ06FYmJifjss89w/Phxt+stXboUAHDLLbe019C8xmAwoH///khLS/PpugQRKpAAIoggQBvjcfDgQUyZMgVdu3ZFfHw8LrroIuzZswcAUF5ejltuuQVpaWmIiorC8OHDsXHjRqf9zZ07F4wxbNq0Ce+88w6GDh2K6OhopKSkYMaMGSgtLdU1rpZigCorK/Gvf/0LAwYMQHR0NBITEzF+/Hh8+eWXLvd16tQp3H///cjIyEBUVBT69++P559/HrIs6z5P0dHRuO6669Dc3Iy3337b5Tomkwlr1qxBXFwcrr32WnX56tWrccEFFyAxMRHR0dEYNGgQnn76aTQ2Nuo6dlVVFRYtWoRx48YhIyMDERER6NatGy677DJs3brVbt23335bdXNu3rxZdXtqz6U3cT2u1mWM4Z133gEA9OrVS92/Ers0cuRISJLk1j22ePFiMMbw3HPP6Zo/QXQ0yAVGEEHE4cOHMWLECAwYMAA33ngjDh8+jLVr12LMmDHYunUrJkyYgISEBEydOhWVlZVYuXIlLrnkEuTn5yMzM9Npfy+88AK+/PJLTJ06FRMmTMCWLVvw1ltvYdOmTfjpp5/QrVu3Vo3zzz//xJgxY3D48GGcf/75mDBhAmpra/HZZ59hwoQJWLJkCWbNmqWu39jYiPHjx2Pbtm0YPHgwpk+fDpPJhCeffBKbN2/26tizZs3Cq6++imXLluHhhx92ev+///0vGhoaMGvWLMTFxQEAZs+ejaeffhrJycmYNm0a4uLi8MUXX2D27Nn43//+hy+//BIREREtHnffvn149NFHccEFF+DSSy9FUlISjhw5gk8//RRffPEF1q1bhwkTJgAAhgwZgieeeALz5s1DVlaWnXDxVUzQE088gY8//hg7d+7EPffcA6PRCADq79tvvx0//vgj3njjDSxYsMBp+9dffx2RkZEUWE10XjhBEJ0KANzxo3vo0CF1+VNPPWX33vz58zkAnpSUxG+99VZusVjU95YvX84B8HvvvddumyeeeIID4AaDgW/fvt3uvXvvvZcD4DNmzLBbPnr0aKdxbdy4kQPgTzzxhNO6jDG+YsUKu+UnT57kgwcP5lFRUby0tFRdvmDBAg6AX3HFFXbjLyws5ElJSRwAv+GGG1ycLdecffbZHADfuHGj03uDBw/mAPi2bds455zn5eVxALxnz568pKREXa+5uZlPmjSJA+ALFiyw20dWVhbPysqyW2YymXh5ebnT8Y4ePcrT0tJ4//79nd4DwEePHu1yDsr/3HHeN9xwAwfADx061Kp1Ferr63nXrl15amoqb25utntP+b9OmzbN5dgIojNALjCCCCKys7PxyCOP2C274YYbAAgryqJFiyBJto/9tGnTEB4ejh07drjc39///nenIOC5c+ciMTER77//vm73j5adO3di8+bNuPLKK3HNNdfYvWc0GjFv3jw0NDTgww8/VJe/9dZbkCQJzz77rN34e/XqhbvvvtvrMSixPUqsj8K2bduwc+dODB06FGeddRYA4M033wQAPPbYY0hNTVXXDQ8Px+LFiyFJktN+XJGYmOgyFiojIwNTpkzB/v37ceTIEa/n4i+ioqJw0003obS0FJ988onde0uWLAEA3HrrrYEYGkH4BBJABBFEDBkyBGFhYXbL0tPTAQC5ubmIj4+3ey8sLAzdu3dHUVGRy/2NHj3aaVliYiKGDBmChoYG7Nu3z+sxKvEuVVVVmDt3rtOPEgOk7PvUqVMoKChAjx490Lt3b6f9tcYldM011yA+Ph4ffvghTp48qS5/4403AMDO/bZ9+3YAwLhx45z2k5ubi4yMDBw6dAhVVVUej/vDDz/g6quvRs+ePREZGanG3fy///f/AADHjh3zei7+5PbbbwdjTBU8AFBRUYG1a9diwIABuOCCCwI4OoJoGxQDRBBBhKs05/DwcLfvKe83Nze7fK979+4ulyuWED1f+o6cOHECAPDVV1/hq6++crteTU2N3TE8jcUbYmNjMW3aNCxZsgT//e9/cdddd6G2thYrV65EbGwspk+frq6rHN9dBlVaWhqOHDkCk8nUYpr52rVrMWXKFERFReEvf/kLevfujdjYWEiShE2bNmHz5s2tsqj5k5ycHFx88cX43//+h4MHD6J3795455130NjYSNYfotNDFiCCINziLlVcyQJrTV0ZZZuXXnoJnHO3P2+99Zbd+p7G4i2ObrCVK1fi1KlTmDp1KhISEpzG6+44JSUlduu5Y86cOYiIiMAvv/yCjz/+GIsXL8b8+fMxd+5c9OvXr1VzaA9uv/12cM5V69jrr7+OqKgoXH/99QEeGUG0DRJABEG4xVWGVVVVFXbs2IGoqCgMGDDA632ec845AIDvv/9e1/rx8fHo06cPjh07hoMHDzq9v2nTJq/HAADDhg3DmWeeiV27duHnn392W/tHiYFydZyCggIUFRWhV69eavaUOwoKCnDaaac5nTNZlrFlyxaX20iSBIvFonNG3qO4S1s6xqRJk5CZmYm33noLX375JfLz83H11VcjKSnJb+MiiPaABBBBEG559913nVpBzJ07F1VVVbj22msRGRnp9T7POussnH/++fjoo4/UAGNHdu/ejbKyMvX1TTfdBFmW8fDDD9vV/Tl06BBefvllr8egoMT6/POf/8SPP/6IM844AyNGjLBbZ8aMGQCAp556CuXl5epyi8WCf/7zn5BlGTfffLPHY2VnZ+OPP/5AcXGxuoxzjrlz52Lv3r0ut+natSuOHj3q9bz00rVrVwBoMfhakiTccsstKCsrU8/Fbbfd5rcxEUR7QTFABEG45ZJLLsG5556Lq6++GmlpadiyZQu2bNmC7OxsPPPMM63e7/vvv49x48bh5ptvxssvv4wRI0bAaDSiqKgIu3btwp49e7B161akpKQAAB544AF8/PHH+PDDDzFs2DBcfPHFMJlManHCTz/9tFXjmDZtGv75z3+q1iht8LPCqFGj8NBDD+HZZ5/FwIEDMWXKFMTGxuKLL77Anj17cN555+HBBx/0eKz77rsPt912G4YOHYorr7wSBoMBP/zwA/bu3Yu//vWvWLdundM248ePx8qVK/HXv/4Vw4YNg8FgwAUXXOCz4OPx48dj0aJFmDVrFq688krEx8fDaDTizjvvtFtv5syZmD9/Po4dO4ZBgwZh5MiRPjk+QQQSsgARBOGW++67D6+99hp27NiBF198Efv378eNN96IvLw8VZy0hoyMDPz6669YsGABwsLC8N577+Hll19GXl4eMjMzsWTJEgwaNEhdPzIyEl9//TXuu+8+lJeX46WXXsLmzZvx2GOP4YUXXmj1OOLj49VUfKVKtCsWLlyIFStWoG/fvli+fDlefvllyLKMp556Cl999ZXHIoiASBl/6623kJaWhnfeeQfvvfceevbsiZ9++gnDhg1zuc1LL72Ea6+9Fj///DOeeuopzJkzB99++22r5+vIxRdfjMWLF8NgMODFF1/EnDlzXFZ27t69u9o7jYKfiWCBcc55oAdBEETHYu7cuZg3bx42btzo127kROdAlmX06dMHx48fR0lJiV2QOEF0VsgCRBAEQbTImjVrcOjQIVx//fUkfoiggWKACIIgCJc888wzqKysxOuvv47Y2Fj861//CvSQCMJnkAAiCIIgXPKvf/0LBoMBp512GhYtWuSyYS5BdFYoBoggCIIgiJCDYoAIgiAIggg5SAARBEEQBBFykAAiCIIgCCLkIAFEEARBEETIQVlgHjh58iTMZnOgh+F3unXrZtfnKJgJpbnqgc5H6J6DUJ23O0L1fATbvMPDw3U16yUB5AGz2Yzm5uZAD8OvMMYAiLkGe1JgKM1VD3Q+QvcchOq83RGq5yNU5w2QC4wgCIIgiBCEBBBBEARBECEHCSCCIAiCIEIOEkAEQRAEQYQcFARNEARB+AWz2Yy6urpAD0M39fX1aGpqCvQw2p3OOO+YmBiEh7dNwpAAIgiCIHyO2WxGbW0t4uPjIUmdw9lgMBiCPuvXFZ1t3rIs49SpU4iNjW2TCOocVyVBEATRqairq+tU4ofoPEiShPj4+DZbF+nKJAiCIPwCiR/CX/ji2qKrkyAIgiCIkIMEEEEQBEEQIQcJIIIgCIJoBVOmTMHjjz/e4jojRozAG2+84dPj3nvvvZgxY4ZP9+nI4sWL8Ze//KXT7dsbSAARBEEQhJV7770XPXr0wMMPP+z03uzZs9GjRw/ce++9AIA33ngDDz30UDuPEJg/fz5eeOEFr7bp0aMHNmzY4KcRecdtt92GVatWBXoYJIAIQgvnHPzQH+CNDYEeCkEQASI9PR2ffvop6uvr1WUNDQ34+OOP0aNHD3VZUlIS4uLi2n18CQkJSExMbPfj+orY2Fh06dIl0MMgAUQQduzbCfnfD4Cv9K3JmiCIzsOgQYOQnp6OL774Ql32xRdfID09HQMHDlSXObrAKioqcMMNN6B3794455xz8NFHHzntu0ePHnjnnXdw3XXXoXfv3hg5ciQ+++wzu3X27duHq666Cr1798bpp5+Ohx56CLW1ter7ji6wKVOmYM6cOXjqqadw+umnY8iQIVi8eLH6/ogRIwAAN998M3r06KG+1sO7776Ls846C71798att96K6upq9b28vDxceuml6NOnDwYMGIC//e1vKCoq8rhPrQts8+bNyMnJQVVVld06jz/+OK666ird42wNJIAIQgOvLLf7TRCEb+Ccgzc2BOaHc6/HO3XqVDs3zcqVKzF16tQWt7nvvvtQXFyM1atX4/XXX8c777yDiooKp/UWLVqEiRMn4ssvv8TkyZPxj3/8A3/88QcAUT9p+vTpMBqN+Pzzz7FkyRJ8//33ePTRR1s89gcffICYmBisW7cOjz76KF544QV89913AID169cDAJ5//nn89ttv6mtPHD58GOvWrcPbb7+N9957D3v27MHs2bMBiEKXN998M8455xx8/fXX+PTTTzF9+nQwxnTtW+G8885DQkKC3ZgsFgs+/fRTXHHFFV7ty1uoEjRBaJFl+98EQfiGpkbId14dkENLr6wGIqO82ubKK6/EM888o1o0fvnlF/znP//B1q1bXa5/8OBBfPvtt/j8888xZMgQAMLSMXr0aKd1J02ahGnTpgEAHnroIXz33Xd488038fTTT2Pt2rVobGzESy+9hJiYGADAU089hRtvvBGPPvoounXr5vL4AwYMwP333w8AyMnJwdtvv40tW7bgggsuQNeuXQEAiYmJSElJ0X0OlHGkpaWp47j+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YJicnIxevXrhrrvuwooVKzBr1iw0Nzdj1apV+OGHH1BVVYWuXbti8uTJGDhwIObNmwcAuOmmmwAg6KzpHecxnvALeXl56NGjB9LT03H++edj48aNTj1f3n33XVx//fV4+umnER8fj4ULF8JsNqvvNzY24pNPPsFtt92G559/HomJie09DY+MHTsWmzZtUl9v3LgRY8aMsVunoaEBkyZNwjPPPIPHH38cjDE899xzqlVr/Pjx2LJli10Dve+++w5dunTBwIED22MaAWfNmjUYOXIknnvuOQwdOhQvv/xySDwtBwt6Pu8t8f333+Ojjz7C9OnT8cwzzyA5ORlffvmlH0fsP6KiohAVFYWff/7ZbVPM559/HlVVVZg9ezaeeeYZ9OrVC08++aTdNV9aWoqtW7fi4YcfxuzZs3H48GEsXbq0vabRKmpqarBz505cdNFFqvhRMBqNOO+885CXlwfOOV555RX88MMPuOmmm/DCCy/glltuQVRUFJKTk/HAAw8AAF588UW8/vrrqhAKFkgABTkbN25UrSJDhgxBXV0d9u7da7fOVVddhTPOOAOZmZm48847UVVVZRf8abFYcPPNN6Nfv35IT09HZGRku85BDxdccAH279+P8vJylJeXY//+/eq8Fc455xyMGDECqampyM7Oxu23344jR46ojfXOPvtsAMC2bdvUbTZv3owxY8aAMdZ+kwkgo0ePxnnnnYfU1FRce+21aGhoQEFBQaCHRehEz+e9JTZs2IBx48Zh7NixSE9Px5QpU1RrcGcjLCwM//jHP7B582bceOONmDNnDt5//338+eefAID9+/ejoKAA999/P3r37o20tDRcf/31iImJwY8//qjup7m5GXfeeSeys7Nx2mmnYcaMGfjhhx9gMpkCNDPPlJSUgHOOHj16uHy/R48eqK2txcGDB7F161bcfvvtOPvss9G9e3cMGjQIo0aNgiRJqossMTERRqOxw1u9vIVcYEFMcXExCgoK8M9//hOAuCGMGjUK3377LU4//XR1vdzcXPXvuLg4pKen49ixY+qy8PBwZGVltd/AW0FCQgKGDh2KTZs2gXOOYcOGISEhwW6dkpISrFq1CgUFBTh16pRq+amoqEBmZiYiIiJwwQUXYOPGjRg1ahQKCwtx5MiRoA+a1aL9P0dFRSE6OhpVVVUBHBGhF72fd0/7uOiii+yW9enTB3v27PH5eNuDc845B8OGDcP+/fuRn5+PHTt24NNPP8Vtt92GhoYGNDQ0YMaMGXbbNDU1obS0VH2dnJxsF0eVm5sLzjmKi4thNBrbayp+oaysDJIkqS7CUIMEUBDz7bffwmKx4NZbb1WXcc5hMBjs4lw8ERER0SksIOPGjcOyZcsAwOX8Fi5ciG7duuHWW29FUlISOOd44IEH7Nx948ePx4MPPogTJ05g06ZNGDhwoF0cUWeFMebkCrFYLE7rhYWFedwuGNB7PjoTnj7vwThnPUREROCMM87AGWecgSlTpuD//u//sHr1alx00UVISkrC3Llznbbp7JaO1NRUMMZQVFSkWra1HDt2DLGxsU7usVCDBFCQYrFYsHnzZlx//fU444wz7N5btGgRtmzZoppH8/Pz1WypmpoalJSUuDWddmSGDBkCs9kMxhiGDBli996pU6dQXFyMW2+9FQMGDAAgTOCOZGZmonfv3vjmm2+wZcsWp6fDzkpCQoKdyb6urg5lZWWBG1CACbbzoefz3q1bN9XqERUVBQA4fPiw3brp6ek4ePAgRo8erS47ePCg38ffnmRkZGDbtm3IycmByWSCJEktJnVUVFTYZdPl5+eDMYb09PT2GrLXxMfH44wzzsCXX36JSZMm2Qkdk8mELVu24IILLkBmZiY459i7d6/TdQMI6z9gy/4NNkgABSm//voramtrMW7cOKenmREjRmDjxo247rrrAIisj/j4eCQmJmLlypWIj493+dTQ0ZEkCS+88IL6t5bY2FjEx8fj66+/RlJSEioqKvDee++53M+4cePw5ptvIjIyslOeB1cMHDgQmzZtwplnnonY2FisWrWqQ5UyaG+C7Xzo+bw/+uijiIiIwIoVK3DJJZegoKDALnEAACZMmIAlS5YgJycH/fr1Q15eHv7880907969HWfjG06dOoXnn38eY8eORVZWFqKjo3Hw4EF88sknOOusszBo0CDk5uZi0aJFuO6665CWloaTJ09i+/btOPvss9G7d28AorP4q6++ir///e+or6/HW2+9hZEjR3Z499eMGTPw2GOPYcGCBZg6dSpSUlJQVFSEd999F126dMG1116LuLg4jB49Gv/5z39w0003ITs7G+Xl5aiqqsKoUaPQrVs3MMbw66+/YtiwYYiIiFDFczBAAihI+fbbbzFo0CCXptxzzjkHn376qRoMOG3aNLz99ttqGvzDDz+sKv/OhjvTtSRJuOeee/DWW2/hgQceQHp6Om666SaX5u/zzjsP77zzDs4999xObSLmnKsurcsvvxxlZWV45plnEBMTg6lTp3Zqi0drCObzoefzfuLECdx1113473//i2+++QYDBw7EVVddhddff11d9/zzz8fx48fx7rvvorm5GSNHjsSYMWM6ZSB8VFQU+vbti88//xzHjx+HxWJB165dMX78eFxxxRVgjOFf//oXVqxYgddeew3V1dUwGo0YMGCAXaZramoqRowYgaeffho1NTU488wzMXPmzADOTB9paWl45plnsHr1arzwwguoqamB0WjE8OHDcdVVV6kBzjNnzsSKFSuwbNkynDp1CsnJyZg8eTIAoEuXLrjqqqvw/vvv4z//+Q8uuOCCoEqDZzwYHfyELoK9ymdrKSsrw1133YWnn34aOTk5gR5Oq1mwYAFSU1O9ivcKZuh8tI4nn3wSRqMRd911V6CH0u4odYA6Ww0kQh+d1+ZLED7GbDbDZDJh5cqVyM3N7bTip6amBr/++iv27t3bqYs3+go6H/ppbGzEZ599hqNHj+LYsWNYvXo1du/ebRcTRBDBQuf0cxCEHzhw4ADmzZuHtLQ0tQBYZ+Q///kPDh48iEmTJmH48OGBHk7AofOhH8YYfvvtN3z00Udobm5Geno6HnjgAZcBsgTR2SEXGEEQBEEQIQe5wAiCIAiCCDlIABEEQRAEEXJQDFAQsHbtWvz88884duwYIiIikJubi+uuu86uUFdTUxOWL1+OvLw8NDc3Y/DgwZg5c6Zay+Lw4cP4+OOPceDAAVRXVyMlJQV/+ctfMHHiRHUf+/fvx3vvvYdjx46hsbER3bp1w4UXXohJkya195QJgiAIok2QAAoC9u7di4svvhi9e/eGxWLBihUr8NRTT+H5559Xi1a988472L59O+6//37ExMRg2bJlWLx4MZ588kkAQGFhIRITE3HXXXeha9euOHDgAF5//XVIkoQJEyYAACIjI3HxxRcjKysLkZGR2L9/P9544w1ERUXhwgsvDNj8CYIgCMJbKAg6CKmursbMmTMxd+5cnHbaaairq8PNN9+Me+65B+eccw4A0Qvmvvvuw1NPPWXXDFXL0qVLcezYMTzxxBNuj/Xcc88hMjIyJGuEEARBEJ0XigEKQurq6gBA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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "\n", - "\n", - "(attribution * quantity).cumsum().plot(y = ['Total_PnL', 'Delta_PnL', 'Theta_PnL', 'Vega_PnL'], title = 'Structure Attribution (RV)')\n", - "plt.show()\n", - "\n", - "(attribution_gb ).cumsum().plot(y = [ 'Delta_PnL'], title = 'Structure Attribution (GB)')\n", - "plt.show()\n", - "\n", - "\n", - "(greeks['Midpoint_delta'] * quantity).plot(y = ['Midpoint_delta'], title = 'Delta Exposure')\n", - "plt.show()\n", - "\n", - "vol_ts.plot(y = 'Midpoint_bs_iv', title = 'Implied Volatility')\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": 77, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Delta Equivalent Size: 0.585\n" - ] - }, - { - "data": { - "text/plain": [ - "819.0" - ] - }, - "execution_count": 77, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "delta = greeks['Midpoint_delta'].shift(1)\n", - "quantity_edit = pd.Series(index = delta.index)\n", - "booked_quantity = pd.Series(index = delta.index, data = [False]*len(delta)) ## Booked quantity is the quantity that has been booked for the day\n", - "q_change = pd.Series(index = delta.index, data = [0]*len(delta)) ## Quantity change for the day\n", - "## The plan is to simulate some sort of rebalance, where we want to keep delta within a certain range,\n", - "## We plan to achieve this by reducing quantity when delta is too high and increasing quantity when delta is too low\n", - "q = quantity\n", - "d_threshold = 0.2\n", - "d_threshold = eq_equivalent_size\n", - "print(f'Delta Equivalent Size: {d_threshold}')\n", - "## Start loop\n", - "for _delta, index in zip((delta), delta.index):\n", - " day_delta = _delta * q\n", - " if day_delta > d_threshold:\n", - " while day_delta >d_threshold:\n", - " q -= 1\n", - " q_change.loc[index] += 1\n", - " day_delta = _delta * q\n", - " quantity_edit.loc[index] = q\n", - " booked_quantity.loc[index] = True\n", - " else:\n", - " quantity_edit.loc[index] = q\n", - "\n", - " # print(q)\n", - "quantity_edit.sum()" - ] - }, - { - "cell_type": "code", - "execution_count": 78, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 78, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiwAAAHFCAYAAADR1KI+AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABHVklEQVR4nO3de3wU9b3/8fdssiEhBJIQwiZiQrgEbCGAGpGbF6BogaOFIij1KLW0KILao9aKYLE1Kl5QWtBjC4qKIDFya1FaFMEfAZXWqii3A1i5ZQnBJJDEYC7z+wN2yJqEZANJhtnX8/HgITs7M/l+vpvEN9/5zncM0zRNAQAA2JiruRsAAABQFwILAACwPQILAACwPQILAACwPQILAACwPQILAACwPQILAACwPQILAACwPQILAACwPQILAACwvdDmbsC5lJ+fr/Ly8uZuRpNq166djhw50tzNaBLBVGtd6Ivg7YNgrbsmwdoXTqo7NDRUMTEx9du3kdvSpMrLy1VWVtbczWgyhmFIOlm30x8JFUy11oW+CN4+CNa6axKsfRGsdUtcEgIAAOcBAgsAALA9AgsAALA9AgsAALA9AgsAALA9AgsAALA9AgsAALA9AgsAALA9AgsAALC9gFe6/eabb7Ro0SJ9+umnOnHihDwejyZPnqzOnTvXesyXX36pV199Vfv371fbtm3105/+VFdddZXfPmvWrNFf//pXFRQUKDk5Wbfddpu6dOkScEEAAMB5AgosRUVFmjFjhn74wx9q2rRpat26tXJychQZGVnrMbm5uXriiSf0ox/9SFOnTtUXX3yh//3f/1V0dLR69+4tSdq0aZNeffVV/fKXv1TXrl21evVqZWRk6LnnnlObNm3OqkAAAHD+CyiwrFy5Um3bttXkyZOtbfHx8Wc85h//+Ifi4+N1yy23SJI6dOigHTt2aPXq1VZg+dvf/qYhQ4bo6quvliT98pe/1CeffKL3339fP/nJTwJpIgAAcKCAAss///lP9erVS7Nnz9a2bdsUGxurYcOGaejQobUe83//93/q2bOn37ZevXpp4cKFkk4+wGnv3r1+wcTlcqlnz57atWtXIM2Tuf1zmcfyAzrmfGbKUElMjCrz8yU5+yFY9arVHSZ1T5PhDmvStgEAGl9AgSU3N1dr167ViBEjNGrUKO3Zs0cvv/yyQkNDq81J8SkoKKh2WadNmzb69ttv9d1336moqEiVlZWKjo722yc6OlqHDh2q8ZxlZWV+T2U2DEMRERGqzHpJlXt2BlLSee9oczegCdWnVmPYT+Qa+4tGb0tz8j2t1fffYBSsfRCsddckWPvCaXUHUkdAgaWyslKdO3fW+PHjJUkpKSnat2+f1q5dW2tgaQzLly9XVlaW9TolJUWzZs2Su1OqjBbhTdYO2EfFN3mq8B5U+LfFiktIaO7mNAmPx9PcTWh2wdoHwVp3TYK1L4Kx7oACS0xMjDp06OC3rUOHDvroo49qPSY6OlqFhYV+2woLCxUREaGwsDC1bt1aLpdLBQUFfvsUFBRUG3XxGTVqlEaOHGm99iU08+Y7VVll5MXpDMOQx+OR1+uVaTr7klBdtZob3pFee16lRUXKyclphhY2nWD63GsTrH0QrHXXJFj7wml1u91uxcXF1WvfgAJLt27dql2mOXTokNq1a1frMV27dtW///1vv22ff/65UlNTTzYgNFSdOnXSF198ocsuu0zSyZGcL774Qtdee22N53S73XK73dW2m6bpiA8wUMFUd221msbJJYXMyoqg74tgEqx9EKx11yRY+8IpdQdSQ0ALx40YMUL/93//p2XLlsnr9Wrjxo167733dM0111j7LF68WHPnzrVeDxs2TLm5uVq0aJEOHjyov//979q8ebNGjBhh7TNy5Ei99957Wr9+vQ4cOKD58+frxIkTTXqZCee5kJCT/60ob952AAAaRUAjLF26dNF9992nxYsX66233lJ8fLxuvfVWDRo0yNonPz9feXl51uv4+Hj99re/1SuvvKK3335bbdu21e23327d0ixJ/fv317Fjx5SZmamCggJ17NhR06ZNq/WSEFBNyKlv5YqK5m0HAKBRBLzS7SWXXKJLLrmk1vfvvPPOatt++MMf6sknnzzjea+99tpaLwEBdXL5RlgILADgRDxLCI5g+C4JVRJYAMCJCCxwhhBGWADAyQgscAYCCwA4GoEFzuDiLiEAcDICC5zBd5dQZWXztgMA0CgILHCGkFPfyoywAIAjEVjgDKzDAgCORmCBM/jmsHBJCAAcicACZ2BpfgBwNAILnIGF4wDA0QgscAbWYQEARyOwwBl4lhAAOBqBBc5AYAEARyOwwBlCmcMCAE5GYIEz+EZYTFMmoQUAHIfAAmfwLRwnSRWsxQIATkNggTP4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AAA4G4EFAADYHoEFgGOMHTtWH3/8cXM3A0AjcMbavg61a9cuzZgxQ71799aDDz7Y3M05p+bNm6cNGzZo6NCh+tWvfuX33vz58/WPf/xDV155pe68885mamHzmTdvnoqLi/Wb3/ymuZvS7IKlL5z8sx6oY8eOaenSpfrkk09UWFioyMhIdezYUT/96U/VvXv35m5eo8rLy1NmZqY+++wzHTt2TDExMUpPT9eYMWMUFRVV5/FffvmlHnnkEb388suKjIxsghY3LQKLja1bt04//vGPtW7dOn3zzTeKjY1t8LkqKyslSS6XfQbV2rZtq02bNmnChAkKCwuTJH333XfKzs5WXFxcM7cOaDrn8mf9fPfMM8+ovLxcd955p9q3b6/CwkJt3bpVRUVFzd20RnX48GFNnz5dCQkJuvvuuxUfH6/9+/dr0aJF+vTTT5WRkaFWrVo1dzObFYHFpkpLS7Vp0yY98cQTKigo0Pr16zV69GhJp1P0b3/7Wy1evFg5OTnq2LGjJk2apKSkJEnS+vXrtXDhQk2ZMkWvv/66cnJy9Mc//lHx8fHNWZaflJQUHT58WB999JEGDRokSfr4448VFxendu3aWft9+umneuutt7R//365XC6lpqZqwoQJ8ng8kqRHHnlEHTp00C9+8QvrmGPHjmnSpEmaNm2aevbs2bSFnUN33nmnhg8frhEjRljb7r//fqWnp2vs2LGSTl4GmTRpkj755BN99tlnio2N1S233KJLL720uZrdKOrTF+ejM/2s+36OFy5caO3/8ccf6+mnn1ZmZqa17a233tI777yj7777Tv3791dUVJQ+/fRTPfXUU01dzlkpLi7W9u3bNXPmTP3gBz+QJLVr105dunTx2+e1117Tli1bVF5erk6dOunWW29Vx44dJUmZmZnasmWLhg0bpmXLlun48eO6+OKLdfvtt6tly5bNUVa9LFiwQKGhoZo+fbr1D7i4uDilpKRo6tSpWrJkiX75y1+qrKxMS5cuVXZ2tgoLC9W2bVuNGjVKPXr00COPPCJJ+vnPfy5Jjhults8/t+Fn06ZNuuCCC5SYmKhBgwbp/fffr7YU82uvvaZbbrlFjz/+uKKiojRr1iyVl5db7584cUIrV67U7bffrtmzZ6tNmzZNXUadrr76aq1fv956/f777+uqq67y26e0tFQjR47UE088oYcffliG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59i3b5+efPJJjRkzRr169ar2/u9//3uVlpZq165dWrx4sTwejwYOHHg2zQYAoNERWGxiwYIF+uSTT/TII4+obdu21vbo6GiVl5eruLjYb5SlsLCw2qPSDxw4oD/84Q8aOnSofvrTn9b4deLj4yVJSUlJKiws1JtvvklgAQDYHnNYmplpmlqwYIE+/vhjPfzww1ag8OnUqZNCQkK0detWa9uhQ4eUl5fnN+F2//79euSRR3TllVfqpptuqvfXLi8vPzeFAADQiBhhaWYLFizQxo0b9Zvf/EYRERHWvJSWLVsqLCxMLVu21ODBg/Xqq6+qVatWatmypV566SWlpqZagWXfvn36/e9/r169emnkyJHWOVwul1q3bi1JWrNmjeLi4nTBBRdIkrZv366//vWv+vGPf9zkNQMAEChua25mY8eOrXH75MmTddVVV0k6vXBcdna2ysvLqy0cl5mZqaysrGrnaNeunebNmydJeuedd/Tuu+8qNzdXLpdLHo9HQ4YM0dChQ+VyMdAGALA3AgsAALA9/mkNAABsj8ACAABsj8ACAABsj8ACAABsj8ACAABsj8ACAABsj8ACAABsj8AC4LyXm5ursWPHav369c3dFACNhKX5AfhZv369nn/+eeu12+1Wq1atlJSUpD59+ujqq69WREREwOfduXOnPvvsM40YMcLvQZ6B2LhxowoLCzVixIgGHQ/g/EVgAVCjsWPHKj4+XhUVFSooKNC2bdv0yiuvaPXq1frNb36j5OTkgM63c+dOZWVl6aqrrjqrwLJ///5qgaVdu3ZatGiRQkP5lQY4FT/dAGrUp08fde7c2Xo9atQoffHFF3riiSf05JNP6tlnn1VYWFgztvA0wzBs0xYAjYPAAqDeevTooZ/+9KdasmSJPvjgAw0dOlRff/21/va3v2n79u3Kz89Xy5Yt1adPH/33f/+3oqKiJPk/oHPKlCnW+ebOnav4+HhJ0gcffKDVq1frwIEDCgsLU69evXTzzTcrLi5OkjRz5kxt27ZN0umHhvoe8Jmbm6spU6b4PTR03rx5+vDDD/Xss89q/vz5+vLLL9WyZUuNGjVK1157rfbt26eXX35Zu3fvVlRUlMaPH6+BAwf61VtcXKw333xTH330kQoLC9W2bVsNGTJE1113HQ8NBZoYgQVAQK644gotWbJEn3/+uYYOHarPP/9cubm5uuqqqxQdHa0DBw7o3Xff1YEDB5SRkSHDMNS3b1/l5OQoOztbt956qxVkWrduLUlatmyZli5dqn79+mnIkCE6duyY3nnnHf3ud7/Tk08+qcjISI0ePVolJSU6evSobr31VklSeHj4GdtaWVmpxx57TBdddJFuvvlmbdy4US+99JLCw8O1ZMkSDRo0SH379tXatWs1d+5cpaamWgHqxIkTmjlzpr755hsNHTpUcXFx2rlzp5YsWaKCggJNmDCh8ToZQDUEFgABadu2rVq2bKnDhw9Lkq655hr913/9l98+Xbt21Zw5c7Rjxw5ddNFFSk5OVkpKirKzs5Wenm6FAkk6cuSIMjMzNW7cOI0ePdraftlll+mBBx7Q3//+d40ePVppaWmKjY1VcXGxrrjiinq1taysTIMGDdKoUaMkSQMHDtSkSZP0wgsv6O6771b//v0lSWlpabrnnnu0fv16a/Tmb3/7m7xer5588kklJCRIkn70ox8pNjZWq1at0siRI63RHwCNjzFNAAELDw/Xt99+K0l+c0e+++47HTt2TF27dpUkffXVV3We66OPPpJpmurfv7+OHTtm/YmOjpbH49GXX355Vm0dMmSI9ffIyEglJiaqRYsW6tevn7U9MTFRkZGRys3NtbZ9+OGHuuiiixQZGenXrp49e6qyslLbt28/q3YBCAwjLAACVlpaqjZt2kiSioqK9Oabb2rTpk0qLCz026+kpKTOc3m9XpmmqbvuuqvG98/mzh+3221ddvJp2bKl2rZtK8Mwqm0vKiqyXufk5Ojrr7/WxIkTazz392sF0LgILAACcvToUZWUlKh9+/aSpGeffVY7d+7Uddddp44dOyo8PNyaO1JZWVnn+SorK2UYhh588MEaJ7LWNU/lTGqbGFufCbOmaSotLU3XXXddje8nJiY2uF0AAkdgARCQDz74QJLUu3dvFRUVaevWrRo7dqzGjBlj7ZOTk1PtuO+PaPh4PB6Zpqn4+HhbhYD27durtLRUaWlpzd0UAGIOC4AAfPHFF3rrrbcUHx+vgQMHWiMVpmn67bd69epqx7Zo0UJS9ctEl112mVwul7KysqqdxzRNHT9+3HodHh5er8tM50K/fv20a9cuffrpp9XeKy4uVkVFRZO0A8BJjLAAqNG///1vHTx4UJWVlSooKNCXX36pzz//XHFxcfrNb36jsLAwhYWF6aKLLtKqVatUUVGh2NhYffbZZ36TV306deokSVqyZIkGDBigkJAQXXLJJfJ4PLrxxhu1ePFiHTlyROnp6QoPD1dubq62bNlirXviO8emTZv0yiuvqHPnzgoPD9ell17aKPVfd911+uc//6lZs2bpyiuvVKdOnXTixAnt27dPH374oebNm1dtfgyAxkNgAVCjzMxMSScnvfqeJXTrrbdWe5bQ3XffrZdeekl///vfrXkf06ZN06RJk/zO16VLF40bN05r167Vp59+KtM0NXfuXIWHh+snP/mJEhIStHr1ar355puSpLi4OKWlpfkFkmHDhuk///mP1q9fr9WrV6tdu3aNFlhatGihRx55RMuWLdOHH36oDz74QBEREUpMTNTYsWPVsmXLRvm6AGpmmN8fgwUAALAZ5rAAAADbI7AAAADbI7AAAADbI7AAAADbI7AAAADbI7AAAADbI7AAAADbI7AAAADbI7AAAADbI7AAAADbI7AAAADbI7AAAADbI7AAAADb+//KuepRW0ZKiwAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "quantity_edit.plot()" - ] - }, - { - "cell_type": "code", - "execution_count": 79, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 79, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "(delta * quantity_edit).plot()" - ] - }, - { - "cell_type": "code", - "execution_count": 80, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 80, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiMAAAHFCAYAAAAg3/mzAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB/N0lEQVR4nO3deXxU1fk/8M+ZJJN9X0jCEhIWZV8UFEQWQUWl/sS619alWrTVr99uWq1tsZZWrXXpV7uidalSEbVVUesCqICIgiDIJjshCUmAyb7OPb8/zr13ZpJJMjOZfT7v14tXZrn3zr1DknnynOc8R0gpJYiIiIhCxBLqEyAiIqLYxmCEiIiIQorBCBEREYUUgxEiIiIKKQYjREREFFIMRoiIiCikGIwQERFRSDEYISIiopBiMEJEREQhxWCEiIiIQio+1CfgjZMnT6KzszPUpxE0+fn5qKmpCfVpBEUsXasnYv39iNXrj9XrdidW34tou+74+HhkZ2f3vV0QzsVvOjs70dHREerTCAohBAB1zdG+fFAsXasnYv39iNXrj9XrdidW34tYvW6AwzREREQUYgxGiIiIKKQYjBAREVFIMRghIiKikGIwQkRERCHFYISIiIhCisEIERERhRSDESIiIgopBiNEREQUUgxGiIiIKKQYjBAREVFIMRghIiKikGIwQkREEUcer4asLA/1aZCfRNSqvUREFNuklJAfvAH5yjOAxQLL75+FSEkN9WlRPzEYISKisCU72oHKcgASsNuhvfEvYNvnjg1OVAMppSE7P/IPBiNERBS2tMfvA3Zvc30wPgFISABamoE6GzCo/68j605CvvY8xKwLIEpH9P+A5BXWjBARUViSh/epQERYgKxc9W/EaFh+/gegdKTapt7mn9favB5y3fuQ77/ul+ORd5gZISKisKR9+A4AQJx+Fizf+6nLcyIjCxIA6k/658XaWgEAsq3FP8cjrzAzQkREYUdrboLc8CEAQMya332DjGz1tc5PwUhnp/ra3uaf45FXGIwQEVHYaf7wHaCtBSgcCIwc232DjCz11U/DNLDrwUhHu3+OR15hMEJERGFFSonGt18FAIizz4cQovtGmVlqW38FI2ZmhMFIKDAYISKi8HLwa3Ts2w3EJ0BMP8ftJsLfmZFOZkZCiQWsREQUNuThfdBeWgpAFa6KtAz3G/q7ZsTeob6yZiQkGIwQEVHIycpyaMufArZvUg/Ex8My7+KedzAyI00NkJ2dEPH9/DhjAWtIMRghIqKQ015+WgUiwgIx9WwUfOdWHE9MhZTS/Q5p6YDFAmga0FinepD0R6eeGeEwTUiwZoSIiEKv4jAAwHL7LxB3809gHTq8182FJQ5Iz1J36mz9f/0YqhnRPngT9p/fAllTFepTMTEYISKikJLtbcCJGnWnjyDERUam+uqHIlZpTO212yHt9n4fL5zJte8C1RWQO7eG+lRMDEaIiCi0aqoAKYGUVKCnglV3MlURq/RHF1YjMwIAHdFbNyI1O1B1VN3xV/GvHzAYISKi0DqmfzgOGOi+p0gPhDFM44/pvc7BSDT3GqmtdtTH1J0I7bk4YTBCREQhJfW/1MWAgd7tmOnH6b1258xIFAcjleXmTWljMEJERKQcq1BfBxR7t58/G58Z2QIgqqf3ysrDjjscpiEiIlKk0zCNV/RgxC8t4WNlmMYpM8JghIiIyKBnRoSXmRGzJbzfh2miOTNyxHGn/iSkpoXuZJwwGCEiopCRTQ1AY7264+0wjVEzwsyIR6SUQJVTZsRuB5oaQndCThiMEBFR6BjTTLPzIBKTvNvXCEaaGyE7Onrfti/ONSPRWsBadwJoaVada1NS1WNhUsTKYISIqB+0f/0d9t/+BLKhPtSnEpGkr8WrAJCSBsTpq5o02Pp3Ik6ZERmlmRFU6EM0+UVATr66HSbTexmMEBH5SDbUQ65aCRzYA/n6i6E+ncjkY70IANWTxKwbsfXvPGKgZkQaxatFgxwN48KkiJXBCBFRL2RLM+SRA5Cb10N+scFl4Tb51SZAqgJA+eE7kEcPheo0I5evM2kM/preGwM1I6hSmRFRNBgiK0c9FibDNFy1l4hinmxuBI4chKypBGqOAbVVahGxmipHcaVOfO9OiCkz1J0vP1df4xOAzg5oy5+C5X/v86qLaKwzpvWKwv4FI7L+JPr1rtujv8+IIzMyGDC+R8MkM8JghIhijmyog9z2OfDVFsiDe4Dqyt53SMsAEpOA49WQH74NTJkB2dkJuX0zAEBcdzvks38EdmwBtn0OjJ8S+IuIAlLTgOp+1IxATe+VQP8/VDtjoANrpZEZGQTZ0gQAkGFSM8JghIhihrQdh7b0EWDPdrUwm7PcAqBwIER+IZBXCJE/QBX65Q2ASE6BPFED7Wc3A7u3qfbldSeAliYgPRNi6tlA+UHI/74K7cW/QrQ0Q0w6E8KaGJoLjRS242pIJC4OyB3g2zH8ML1XanbAud9GFA7TyKYGx3tUOAjieI1/gjg/YTBCRDFDvr4M2L1N3RlSBjF+CsTw0UDJMIg+VosVOfnAuNOALz+D/PhdQP0qhxh7GoQlDrjoCshPP1TZk6V/gExOhZh+DsSFlzuac5ErYyZNfiFEXJxvx8jww8q9drvr/WgsYDWaneXkQyQlQ0ZDzcg777yDN954AzabDSUlJbjxxhsxfPhwt9suXrwYO3bs6Pb4pEmTcPfdd/vy8kREXpOtLZAbPwYAVdcxZpLXx7DMPB/al59Brv8ASE4BAIgJakhGJKfA8vM/QH70DuT6VSoo+eANyPUfQFxwOcS8b0AkWP13QVHAWCDP5+JVwD8FrM5DNEBUDtO4zKQBXBYZlFKGvM7J62Bk/fr1eO6553DzzTdjxIgRWLlyJZYsWYLHHnsMmZmZ3bb/yU9+gk6n/+iGhgb89Kc/xbRp0/p35kREXpCffQy0tagPvtETfTvI2NOA7DzgZK0qbI2LA0Y7ghqRlQNx8TWQC64Cdm6F9trzwKG9kK8+C7l5PSx3P6SyKKQc83G1Xici06gZsfl+Hl2DkSgcpnHUiwxW941gpLMDaG4CUtNCdGKK11N733zzTcydOxdz5szBoEGDcPPNN8NqtWL16tVut09LS0NWVpb578svv0RiYiLOPPPMfp88EUUHqWkBXyNDfvRfAIA4+zyf/woUcXEQM+Y5Hhg5FkLPkLhsZ7FAjJkEyz0PQ9z4Q5VFOfi1Y/YNAYCasQQABUW+H8TIjPSn6Zm9S/fWaMyMGENihSozIhKsqmkcEBZDNV4FI52dndi/fz/GjRvnOIDFgnHjxmHPnj0eHWPVqlWYPn06kpK8bPtLRFFL/v1haD/6dv/G/Xs7/pEDKhiIi4eYfk6/jiXOOhcQ6lenGH9679taLLBMmwMx6wIAgLbqzX69dtQ5Xg0AELkFvh/DCEZamiF9nZLbpZW8z8cJZ7XHAEAVZhuMupEwmFHj1TBNfX09NE1DVlaWy+NZWVmoqKjoc/+9e/fiyJEjuPXWW3vdrqOjAx1O3xxCCCQnJ0MIEfJxrWAxrjMWrjeWrtUTsfZ+yKqjkJ+vVXf27oQ4XfXw8Of1ax+/q4456QxY+llMKvIKIOdcCLntc1imzPToPC1zLoT9v68BO7cCFYchBpZ0P26s/b9L6QhG8gpcrtur9yI5VQWHUlOzmLxd3wYANNcCVtHRHpL/h0B9D0gpHcFIXqHjdTJzICsOA/UnA3a9nh43qLNpVq1ahSFDhvRY7Gp47bXXsGLFCvN+aWkpHnzwQeTl5QX6FMNOYWFhqE8haGLpWj0RK++H7d1XYawbmt7SiAz9uv11/VprKyo2fggAyLvkaiQV9WNIwPDjxd5tX1SE2umz0bJuFZI2rELObff0uGms/L9rDfU42toCACgcPR4WN9lyT9+Lo6lp0BrrkZ+aggQf/n/b25pwzOl+AiQG+OP7xEf+/h6w206gor0NEAJFY8aZhdTHi4rRvHML0rVOZITwegEvg5GMjAxYLBbYbDaXx202W7dsSVetra1Yt24drrzyyj5fZ+HChViwYIF534isamtrXTIm0UwIgcLCQlRVVbm0n45GsXStnoil90Nqdtjfe928X793N5qrqvx2/XL/Hthf/AvQ1AjkDcCJgsEQlX00OAsQeda5wLpVaPrgTbTOvxyiS8FgLP2/A4A8vF/dSM/CsZOuw3PevhdaUjLQWI+awwchErzPjMgu3xPtjY2oDMH3SaC+B+T+3epGVi6qao+bj9utyQCA+iOH0BSg601ISPAokeBVMBIfH4+ysjJs374dU6dOBQBomobt27dj/vz5ve67YcMGdHZ24uyzz+7zdRISEpCQkNDtcSllTPyQOoula46la/VELLwf8qsvgJOOX46yutK85v5cv+xoh1z2N70fCIDkFFiu+h4gRMjeUzl8NDCoFCg/AO3jd2E5f6H77WLg/x0A5HE9F5Gb3+P1evxe6EXEsrmxezM7T86ls3sBayj/D/z9PaAZhcJ5Ba7HNWbU2E4E7Ho9Pa7Xs2kWLFiADz74AGvWrEF5eTmWLl2KtrY2zJ49GwDwxBNP4MUXu69euWrVKkyZMgXp6eneviQRRSm57gN1o3Sk+lrdd+2ZR8d95VkzEBHT5sBy/5/NfiChIoSAOOciAIBc81ZMBBy9kbWqXgS5+f0/mD4rRDY3+bZ/t6m9UVbAahYKd+lym6kKWMOhJbzXNSPTp09HfX09li9fDpvNhqFDh+Kee+4xh2lqa2u7FaxUVFRg165duPfee/1y0kQUmbSP34V87z8Q086BOHM25JYNAADLwm9De+QX6i+0ttZejyHLD0B76lEgIxuW798Dkejacl3u+ALygzfUcW/9GcTk6YG5GB+IqbMgX1qqigkP7QWGjgj1KYXO8RoA/ZxJY0hOVV99DUaMqb1CqMxKtE3t1YtXkecajIjM7LBpCe9TAev8+fN7HJZZvHhxt8eKi4uxfPlyX16KiKKIfP91oPKIagL2xjL1F+mgUohRE4DUdKCpQS1aN7TU/f6b10N7+jGgrRXAQWhPPwLLorsgLCrJK5saoP3jcQCAmH1BWAUiACASEyHGnQ75+VrITeshYjgYkSf0zEhO/4MRkZKqPlRbmn07gJEZSUpR6w1FWTAiewhGkBU+XVi9HqYhIvKFbGsFjJbU2XnmL3xx1lz1mN74SjqtoCs3r4f2zz+pf3/7PbQ/P6ACkWGnAvHxwOZPIP/9vNq2qRHac0+oBk4DBkJcdmPwLs4beoAkN62L7aGaWse03n4zGs+1NPq2vxGMGMfpoQOrrDwC7eWnIfvTej4UzGm97odp0NYK6DObQoUL5RFRcBzZD0gNyMqBZclfVEfU2mMQM88HAIiCIsgDe8y6EdnaAu3vD3cbzxdzvwFx+Y2Qn30E+dSjkG+/AvtXW4DyA2rl1bg4WL77o27DN+FCjDsNMsEK1FQB5QeBwe6zQFHvhD9rRvo3TCPtXYIReyek3d5t8T75+jLVEyc7F2Le//P1bINKapo5JIYugZ9ITFLX3NKsGp+56SYcLAxGiCgo5MG96kbJcIgEK8Tcb7hu0CUzIvftUoFIeibE7AsBAKJ0BMQ41fVUnDkHWtVRyJXLgcP71DGKBkNcdAVEafgOf4ikZGDsZOCLDZCb1kHEYDAi21qBRr27jB+GafobjJgdWI3jAGrl3jjXD2d5SP8eNs49EthOAPZOtY5Sdm735zOzVTBSVW62ig8FBiNEFBz6L3IxtIemhwXF6qsRjOzZrrYfMxmWi692u4u4+BogJw/QJMS40/xTDBkEYvJ0yC82QG5aD1xyrctzsrUF2lsvQ0w8A8KYZRRt9NkdSE6FcA4AfJWsz6bxtWbEzIw4nUt7u6oh0cnmJpXNAvSapQhh1Ivk5LtdpFGMmghZdRTaq8/DMvY0iPjubTWCgTUjRBQURmZElLjPWggzM6IP0+z5Sj0xckyPxxQWCywz58My+4KICUQAQIyfompeqspVO24n2r//CfnWy9D+/jBklzblUcMIRvz0f2YuVtjSz6m9CQmA8WHctYj1yAHH7RDXV/RGnqiB9uJfIU/UqvtGMNLDey3+3zVAeqYqLP/va8E6zW4YjBBRwMnWZnO5eJQMc7/RAD0zcvI47A11wAHVNVKMHBuEMwwukZIKjJoIACo7ous4chBy9Up1p6YK2LIxBGcXePK4H+tFgP4P0+hTe0VcAmBVrdK7FrFKYygQCO9g5L3XIVevhHzlWfWAuf7PALfbi9R0iCu+q/ZdudylgDyYGIwQUeAd3q/6N+TkQfSwUJ1ITTebVzV/+F/112pmdv+Wlw9j4rSzAADyw3cgq9QsI9vSRwC7HbCq4lvtvX+H6vQCy589RoD+ByNGZiQ+HkjQC587ujQ+M9rXA332wgklWaMPc365EbKjvcceI87EGbOAUROAjnZoL/wlJLO8GIwQkQvZ2qJ+ifnzmE7Fq73SsyNN7/4HACBGjInaVWzFadNVwWDdCWgP3Q3t7RVo/Xw9EBcPyx2/AuLigb07HeuKRBN/Z0aMWo/+DtPEx/ecGTniCEbQ6mNtSjAY721rC/DVFz33GHEihIDlW7eqIaodX7gEXsHCYISIAOh9Ov71d2h3XA3tySX+PbhRvNpHMCLyVRakY5/+ARyFQzQGkZQMy52/A4YMAxrqoOlpdTF3AcTIsRBTZwJQjeKkpkH7+F3YH7gTcufWUJ62X8ie2pP7ysiMtLd1X2fGE0YBa1w8oK9o61wzItvbgMojju3DeJjGDEagDwEaPUb6yEKJAcVA2SlqP+drDRIGI0QxTkoJ7eN3od17i2qjrmnqLyqnBez6/RoHPQtGMMB1SEb0UrwaDUR6Jiw/WWIGXZbMbFgWXKWeO1f1sZCb1kF78C7I554A9u1yLP4XhmRbG7T/vgpZdbT3DY2+F/7KjDjNevGpC6vLMI2bzMjRQ+rnwhCmwYhsbnS5frn1U8dClL1kRgxGETlCUDfCYIQohsm6k9D++Gv1QddYDxQNdvT7+Gqzf16jucmxAF5fwYhzfUhqujqfKCeSU2C541ewXP095P/mSXOqqxhcqsbxNQ1wGqoJVYGhJ+SmtZArnoH89z973qajQzXYAvw3myYuDkhKVnd8qRtxDkb0ZnnSabE8aQxbOHcsDUfG4oNpGUBWjgpMpKYCLGOF3t4YP381DEaIKEjklg3QFt8GbN8ExCdAXHYDLL98XBWzAZDbN/nnhYxZCLkFEOkZvW4qjF4jUFkRY82ZaCesibDM/QasZa59RSz/71tq2uXk6aqOBACqK8O3jbye8ZD1vSy8dlLPilit6kPTX/pTN2IslBeX4DRM41TAqgcjZqYuTDMj5hBN3gDXdZly8z2qvRJulmQIltj4SSciF9rGj6D96Xeqk+TgUljufRSW8xdCxMdDjD1NbbRjK6S9/30uzK6VfWVFAJfMiBgR3UM0nhDDTkXcI88j7tafASP0+pmWJrWgYDgyMh69ZSeMv95zB/i3OLk/M2rczaZxGqYxp/Ua35PtbWHZA0Yed9SHiNOcghEPhmgAAPmF6iuDESIKNLntc8inHwWkhJhxLix3PwwxcIhjg6HD1RBJS5PZ66Nfr7djC4BeOq86EWkZZipcjJrQ79eOJiIxEcjS23kbnUDDjKyzqRu9ZCf83mPE0J/MiFH0Gh8PYXUtYJV2u6oZQZcaprYuU3/DgRHo5RUAw0cB+jT6nnqMdKMXkKOxXg2vBhGDEaIYIr/eAe0vDwB2O8TUmRDf/gFEgmv7Z2GJgxg9UW2/rX91I/LoIWDHFkAIs69GX+Ju/Rlyf/ZATK7Z0qcC9Zdr2NaNGMMzvRWRntB7jPhjTRpnembEpw9RMzPiNExj1IxUlavAJClZ1TAZi+eF4VCNI9AboH6Op+srYped6tH+IjlFDQsCQQ94GYwQxQip2aH99UGVfh53OsQN/9tzTcbYyWqffhaxSqNp16Rpjkr9Pojho5By9rx+vW60MqY+hyKN7pE6RzDS4zCG8YGZk+fXl+6tJbzUNGjvvAK5e5vbfaXz1N6umZFD+hDN4FL185KoF8qGYTDi6LaqAj1xybWw3PuoWQfmkRDVjTAYIYoV1ZXqw8KaCMuiuyDie14nU4xRwQgO7YWst/n0ctJ2AnLDhwAAy3mX+HQM6iKEsx36IqUEnL9XWtx/WBtrpvh9mKa3mpHd2yBfeRbaC39xv6/bDqx6zcjRgwAAMbhM3U8K/2DEWAlZxMVBlAzzqhDcMb23wt9n1ysGI0Sxovyg+jqwRNUf9EJkZgND1C9fueMLjw4vm5sgD36tpm4Cao0VeycwfBTEMM/SxNSHfP/+1aq9/DTsjy+GND6M+6Ol2XVxueZG99vpfS9Etr9rRtL013WTGTE6ANt66J3TWwdWI3jK1+suEpPU17bwCkZkc6Pj2vsT6IUo4O35TyMiiipSD0bEoKEebS/GTIY8vB9yxTOwf/CmqvsYfzrEuQvNYEZWV0B+9F/IXdv09Wc0IDMHYs6FkGveBgBYzlsYiMuJSaKgCBLwyzCNtNtVkzu7Xa1IW+p+NWWPdZ3O6264RErgpP7hnp3bv9frKqWXAlZjNkxLM2RHR7c6KUcH1gRzXSBjaq80Zghl6ucbrpkRo5FcWgaEcY6+8HPA6ykGI0QxQpqZkaEebS8mT4N8e4Ua2tFrAeSBPZAfvwtx0ZXA1zsgP/1QBSCGxCSg7oSj6VVBETBhiv8uItYZUy8b6iBbmyGcO49660SNCkQAyNoqiP4GI8ZMGoO74ZLGBkf2JNu/NSPQa0akm+JZlxV3G+q616vos2lEfDxk1w6sNhWMiCy94Zn+QS9bWxBWqybp03r720hOFBTrAW9wC1gZjBDFCmN6oqeZkaEjYPnFY2ZqW9adhHzzJeBEDeTzTzo2HHc6xBmzIEaOBdIzID9bC/nuv4HyAxAXXwNhifPvdcQwkZKqGoU11qsPC30ozSfGAmqAX2ZOmBkEg7tgxGh4lp7ZPTvRTyIlVX2IdhkeUh2Anf7KdxuMdB+mke1tKpNjXJcRjIRpAas0MiN5/ZylpM/YQt0JyLZWCGNYKsAYjBDFANnS7PjwGVTi8X5iSJn5gScAyDNmQb77GuQHbwLDR8Gy4Mpu682IaXMgz5wNtLY4ZjiQ/xQUqWCkprJfwYh0rglwDkx81WWYRrY0dc8cGPUXOX6uFwF6LmA9csD1foOt+74uC+U5FbC2NDkyJHo7dZGUrIKecGsJX2ssPtjPzEhqOpCSpoK6mirAwz9e+ovBCFEs0LMiyM5Tv2x8JKyJEAuuAvTF3HrcTggzbU7+JfILIffvhqyu6t8wQY0jAJH+6CnhwTCNNOtF/DxEAzgKWLvUjLgM0QCQ9XXd37cuTc8koIIQfYgGKakQRi1JmNaMSD8N0wBQAe/Br1VGKUjBCGfTEMUAs14kSL9YKID8NNvBJTPil2CkSwGru2EaPTMi/NxjBIAj+O1aM9IlGEFDXfd9O50zI059RoxgxFggDwjbYMTsMZLrYbfVXphr1ARxRg2DEaJYYPRK8GKIhsKUv5pSOWVGcKIW0sgO+MhcHM/44HY3q8XIjAQiGDFn07g2XDOblg0YqL72Fox06cAqjQAryykYCdOpvS6t4PurIPjN9RiMEMUAb2fSUPgyu7D296/WWqdsiNTMNu0+M4ZpCvUP/aAP06Q6busN12RbK1B1FAAg9K7CboMRu1MwYnWqGek6kwYIy8yIbGl2FO76o5lcCKb3MhghinJSSrPhmRjE9V4invFX64laSGP9FC/JpgZHsGAsolbTzyJWPTMiigap13CXGTGGaQIQjIiEBEfDMuODufyg2fsGA1VWUPaaGYl3DUa6zqQBXKb2hg2j82pqev+me+vMLqxBXJ+GwQhRtDterf6Ki48HBhSH+myov9IyHPURvs6CMT5kMrMdH9L9+OCRmh1oqFd3Cgerr10yI1LTzO6rARmmAZxW7lV1I/KQ3nl1SBmEvoIt3C1vYHcUsLoM0xgdWzOdGrQZU3vDaZjGXCDPT4sPmgFvjdlROdAYjBBFO2OIpmhwr+vRUGQQQjian/kYQEgjC5Jf6Fhevj9/BTfUqwyEsDj+qu46TNNQp4ZDhHAtCPWn5C5dWPXiVVEyzLEabV8FrM7t4M1hmmxzU7O7aWv4TO2V/qwXAdR7lZgMSOmfad8eYDBCFOW8bQNP4U/0d0xfrzcReYVmYCNr+xGMGMMZGZlAmj51vOswjdFjJDM7cEFxl14j8tB+AIAY4hqMSCnNXaRmBzS9i7DzQnn2TkfBbbjPpqkzgib/tNgXQjgCGyPrEmAMRoiiHaf1Rp9iNRQi9+7wbf9ap8xIP7MsABzFqxlZjiGkrpkRo/tqIIpXDXowIpubIDvagcrD6vEhw9S5AaoWxLlhmd0x88ZloTzAMazkroA1nIZpGvUhsvQM/x1Tb0wn+1vY7CEGI0RRTNrt5rg5MyPRQ0w8U93Ytgmy1dFXQ27dCPsjv+iz/sN8Pt+RGUHtMZeMgTcc03qzHdmJ1mZVJ2JsE+h6EQDCeZhm/x4VaKRlADl5qq25UZzqPFTjvGJxnNPUXkANUwCumRFjam84DdMY9Tpp/gtGhDEr5ziDESLqJ7niH+qvYGsiUNLPhdAofAwuVX0zOtoht34GAJCdndBe+Auwc6ta4LA3ejAi8gc4ih5bmoGmBt/OR+/HITKyHXUbUgJOgZJjJk0AWsEbkh3DNHLTOvV6405Xww6AY6jGuYjVJRiJg7BYVIbEkJbuuo6OU2bEOdgKqUYVXAnj+vwhR/++OMFhGiLqB+3jdyHffx0AYLnxfyFS00J8RuQvQgiI088CAMjPPlZfv9hg1jjIjR+5Xb0WgGpuZtRv5BepNufGMISvQzXGh3tmFkSC1ZFdcB6qCWTDM4NZM9IIufkTADDfJwDui1iNZm9GIAI4MihA92JbIxgBgPYwyY6YmRF/BiPq/4nDNETkM7l7O+QLfwYAtXLuaWf1sQdFGjHlbHXjq82qRuKD1x1PtrVCfvqh+x2P16iZL9ZERx1Fnl7E6mswYnQqzdBnnbhZtM74UAtIK3iDUTOybZMq6kxOBUZNdDyvByPSbTDilA1JcApGsroEIwlWQOgfneFSxNoYiGEao4CVwQgR+UhbvhSw2yGmnA2x4MpQnw4FQvEQoGgw0NkJ+e9/Avt2AXHxEOdfCgCQH73jvgbEqV7EGL4Q+f2b3utSMwJ0n2ILODIjfprx4ZZRPFtdAQAQE6a6DLGIDDfDNHanhmcGpyJW0SUYEUI4zagJfWZE2u2O4TV/FrAawcjJWvUaAcZghCgaGePzF17uGC+nqKKGamYAAOTqleqxKWdDzL9UfbAeOQAYTb+cmFN4jf4igNn+2+eeEvpsGtE1M6IHI1KzOxadywlCzYjOZYgGANKz1FcjkwC49hgxOBexuuuJEk4zapr0axHCMa3aHzKzgLg4Ne3ZmLodQAxGiKKRMZbtPL5NUUdMmeF6f943INIyICbr9SQf/bf7TmbxaqHjMT0z4vMwjZkZyVJfnabYAgBsJ9WHWlycY5sAEClOdVFJycDoia4bmAWsTsM0RmbEuUjVORjpOkwDOM2oCYNgpEHPiqSmQVji/HZYYYlzTMMOwlANgxGiKCM1u+oeCTh+aVJUEkWDzXbuGD4aomS4enzW+QD0QtYuM2RcpvUax8nzvdeIbGsz268bWQSR3KVmxKl5mD8/MLtJdqzLooZorK7PZxg1IzbHY+4yI87DNL1lRsJgmMaYSePPehGTPlQjg9D4jMEIUbRpc1o8jcFI1BMXXg5k5cKy8NuOB0eMAQoHAW2t0H75A2jrPoBsaYa2eiWw5yu1n0tmRL99stb7tUiMrIjV6viQ7lrAGoyZNM6vCzdDNABEmrvZNE4r9hp6K2AFnBbLcz9jKaiMa/HnTBqdWWwchBk1XKiCKNoY3SWFxTXdTFHJMnUmMHWmy2NCCFhu/CG0pX8Aqisgn3kc8rn/c7Q9T88Ehjr1ncnIUsWndSeB7ZuASWd6fgJOM2nM+qSuNSMBXK3XRVauCsCticDoSd2fz3ATjNjdzKax9jFME0Y1I2bDM38WrxqCOKOGmRGiaGMEI4mJLF6NYaJ0BCz3/R/EZTeoD09NAwYMhLj6e7D89q8uDbKEEBBnzgGg+tN4w+ysmulYTA7Jeu2GkRnR18Lx26qyPRApqbDc/XtYfvaQ6p/SlVMBq9mwrLP7bBqXfTOcrst4PpxqRvRiXBGIYRqzJXzgh2mYGSGKYLKtDaiugBhc6njQDEZYvBrrRHwCxPkLIWfMU0MlxSWOxl5dt51xLuR/XwW2b4Y8eRwi28MpuEf0xeiKhzge61LAKssPqceN+pYAEr29hpE9sNtV1iY13W0wYmYU0zPdL+oXTjUjRpbHn91XdSI3HxJgZoSIeialhPbkb6D9+g7IfbscTzhlRogAQKSmQwwq7TEQAQBROBAYOQaQGuT6Dzw+trH2EfTiWQAuwzRSSuDoQfUaIV4fScQnOM5Nn1Ej3TU9M4Zp3A3RAGE1TBOQRfIMZkv4Gp/XLfIUgxGiSLVzC7BzKwBAVpU7HjeDERavknfEWecCAOTa9zxad0VKCRzUF2Ic6ghGHLNpGlXxY0uz+rAvHOj/k/aWMVRjzKhxmxnRA3l3M2kAR9axj2EabcMaaP/6e0DXsJFm91X/Z0bMguO2Vt/XLfIQgxGiCCSlhPbvFxwPOP9S5DAN+UicdpaaHlt7DNi9re8dao+pgCM+Hih2Gh4xptg2NwHGEE3hQJWZCLWu69PY3cymSVY/Oz0OVSV5FozIl5ZCfvAGcHifr2fbN/06AlEzIqyJjvcrwEM1DEaIItG2z4EDexz3nX4pSiN1zGEa8pJITIQ4YxYAlR3pi9SzIhg41HVlW6P5WEsTZPkBdewQD9GY9OEMaTQ+c9NnRJw5B+KsuRBzv+H+GMbU3raea0ZkU4NjCMW546u/mbNpApAZARxFxwGe3stghChCGKleKSW0/7yoHjT+mnPJjOh9RpgZIR+IGfpQzeZPII0P6p4c6j5EA8CpZqRFtaUHgDAJRoQ5TGNkRlTNiHOhqsgbAMv1d/RcDOvJbJpjFeZN2dTo6+n2SkoZ2JoRwDGjJsCNzzibhigCaB+/q1bhTc9S47iH9wGJyRDT5kCueQtwbr6kZ0YEMyPki8GlgMWiVrNtrOt1YTu3xauAIxiRmllcLQYODcDJ+qBrrxF3Tc/6IJKS1SyTXoIRWe0IRtAcmGAELc2OYaZATO1F8GbUMDNCFAHk+g/UdETbcWD/bgBQKWRjsTNmRshPhCXOUeSpL4DnjtQ04JCqhRBdghGRYHV8uNv0PiRhkhkxhjNkbwWsffFkNs2xSsftQBV/Gq3gE5Pc91XxB6MlfICHaZgZIQpzsqMdOPg1AMByy88gW5qA1haIWRdAfqKmYEqXYIQ1I9RPmVlqpVaj1bs7NVWqV0d8AuDcY8SQkgrU29Tt1PSep8kGmxFoGedmd7M2TV88KWCtdg5Gmjw/tjeMepEAZUUAQOQYmREO0xDFtgNfq7/eMrOBydNgceqqKt1NMWRmhPorIwsAIOtOoqcevlIPkDG41H1jMOdgZNDQsOkGLNIz1Idro56t8CUz4sHUXpdhmoBlRgIfjCBX1YywgJUoxsmv9YXNho/u9gtdJOlTKFu614ywzwj5Shgt0I1gwp2eilcNRq8R9NEVNdi6Tu3t1zBNq9tmYFJKwCkYkQGqGZEB7L5qMmbTNNRBbt0YsJdhMEIU5uTenerGiNHdn3Qzdi3Z9Iz6KzNLfe0lGHEUr45wv4HTCrphUy8COGadNDVAanZVqAsAcV70QDF+7qQE2tu6P9/Y4FiXBwACNJvGXJcmUDNpADVNe/goAID2xG9gf3JJQGbWMBghCmNSswP7VDAi3AUjye6GaRiMUD/pwzTmirxdqOJVfU2akmFutxFGrxGEUY8RAEjVP7ilVEGC3YfMiDURMLKU7oZqnIdogMAN0wS6xwj0FaDvWAxx/kIgLg7Y8im0393p966yDEaIwln5ITUEk5Ts/q9Ld4V0ejAiGIyQr/RhGtlTZuRYhcrGWa1A0WD32xjDNEK4L3ANEREXpwpqATVUY2RGvAhGhBC99hqRRo+RlC6rF/ubMUwTyJoRqKnMlstugOUXj6sH6k74fboygxGiMCb37lA3hp2qplx25RSMmH+pMDNC/SQyjZqRHmbTVBir8A5VH+7uGMM0+YXhFxgbwxoN9W47sHqkt+m9RmakVB/CamoIyEJzMhgFrE7EwCGOVv+N/s32MBghCmdfq2BEjBjj/vnEFMftdj0IYTBC/WUUsPbQZ0RWHQWgr/TbkzQ9+xBOQzQGY1G5xjpIX4ZpgN5n1OjTekXpKep+ZwfQ3u7DifbBrBkJYAFrV0ZWyc9DTwxGiMKUlNLMjIjhbupFAJUmF/qPsfFLkcEI9ZdRM9LSpPrcdGUMQwzoORgRU2ZCnDUXlguv8P/59ZeeSZANdf3PjPQyTCNKylQ3WyAwXViDNEzjgsEIUXiQLc09j6X7U+0xwHZC/ZIsdT9jQQjRvYiVwQj1V0qqI1Pg5nvd6KEhBhT3eAiRk6fWd+mhwDWUhLthmgQvVxQ2FsvrEoy4TOstKA7YhzeAoBSwdqNfj+QwDVFoab/9CbR7b4F07u0RAHKP6i+CocN7b/Vs/IXWoteNGFMNGYyQj4QQTkM1bupGjqlhmt4yI2HNudeI2YHVy2DEqJ3oOm23oU79YSAEkF/oKGL18/Re2dHuqFcJ5NTeLkRaYIIrnzqwvvPOO3jjjTdgs9lQUlKCG2+8EcOH99D4BkBTUxOWLVuGjRs3orGxEfn5+bjuuuswefJkn0+cKBRkcxNQVa7uVB4Byk4J3GsZa9AMG9X7hubYdbNrzwN2YKX+yMxWXTe7ZEZkY72jeLGgKPjn5Q/Gh3djvTmbxm0X2V6IgiLVydUIzAxGViQnX63Rk2rMqPHzMI2RFYmLc2kwF3BGpsfPmRGvg5H169fjueeew80334wRI0Zg5cqVWLJkCR577DFkZnZPFXV2duI3v/kNMjIy8KMf/Qg5OTmora1FSkqKm6MThTmnlsiypgoikMHIEdXHAX2luZ2r+o0hGiFUPQmRr4yW8PVdWsIb9SLZeeE3S8ZTacZieXW+dWAFzCnNsuKwy8PSWCDPCNSMYY2mhh5b6/uk0VEvEtRW+2ZmpN6vh/U6GHnzzTcxd+5czJkzBwBw8803Y/PmzVi9ejUuueSSbtuvWrUKjY2NuP/++xGv/2cXFBT076yJQsV5Ge3aYwF7GWm3A0fV9EkxuKz3jfV0sWxtgTCCEWtS2KwFQpFJZGSpv/y7zKgxe2j0Ui8S7kR6prq2hjpH8zIvC1hF0WB1jMpy1yeMeho9GBEpqWo7f2dGgjyt12Q0jQtlZqSzsxP79+93CTosFgvGjRuHPXv2uN1n06ZNGDFiBJ566il8/vnnyMjIwFlnnYVLLrkEFov7kpWOjg50dHSY94UQSE5OhhAiZn7BGtcZC9cbSdcqT7oGI4E4ZyEEOqvKVZbDaoUoLO71dURSMiQA0doCYdaLJEbE++lOJH0/+FPYXbdTrxGXczKLVwcG7FwD/l5kGFN7681gXiQkePd6xXqzN9txoKUZwuir0vX9MQtYG/s8vjfXLZ2m9Qbze0akp5vBlSev6+m5eRWM1NfXQ9M0ZGVluTyelZWFiooKt/scO3YMNTU1mDFjBu6++25UVVVh6dKlsNvtuPzyy93u89prr2HFihXm/dLSUjz44IPIy8vz5nSjQmFhYahPIWgi4Vptrc0w/h6w1p1AQVFgxsybP35PvcbQERgwcFCv2x7PzkUzgPSEeCSmpaIaQHxqGooCdG7BEgnfD4EQLtfdMLgENgBJ7a3Ic/peqq07gRYAmSNORXqAv8cC9V50JlhQCQCN9YhLSoYdQO6AQiR6eT0VufmwH69BbkcrEotU3WTV8Wp0AMg5dQySi4pQV1iEegAp0JDj4fE9ue56zY46AMkFhcgN4s96y6AS1AKIb2tBoR9f16cCVm9IKZGRkYFFixbBYrGgrKwMJ06cwOuvv95jMLJw4UIsWLDAvG9EVrW1tS4Zk2gmhEBhYSGqqqoC0rkvnETStdqPHDRvtx09jMrKSr+/hhACSftVprGjcFCfr2HX37L6mmqICpUy7oxPCMi5BUMkfT/4U7hdt6ZPtmw5VuXyvdR5aB8AoD45DY0B+h4L9Hshjc8Rux32k8cBAMdtNggvr0crKAaO16B22xewZOZCtjbDflC9PyfTc2CrrITRGLm5phptfRzfm+u27/8aANCSlhnUn3XZrt67DtsJj143ISHBo0SCV8FIRkYGLBYLbDaby+M2m61btsSQlZWF+Ph4lyGZgQMHwmazobOz06wj6XryCW7mfEspw+KHNJhi6Zoj4VpdVqs8WQutox0i3sspgR7o0IMRDCrt+z1xXiOj1agZSQz797IvkfD9EAhhc91G47P6k+b5SE1zFLAWFAf8PAP2XsTHq8Lv1hZzBpqMi1eL53mjaDCwcytkxWF1rvv3AFIDcguArBz1mD61V3rREt6T65Y1VepG3oCgfr9Ip9k0nryup+fmVZ+R+Ph4lJWVYfv27eZjmqZh+/btGDlypNt9TjnlFFRVVUFzWuGvsrIS2dnZbgMRorDmHIxI6VrQ6kcdB1QwIgaX9r2x0e+gpRnSbHjGab3UT0afEeepvbYT6sPbYgHyBoTktPyma6MwbzuwAkCRGkKVlUfU1736CtvDTjU3EamB6TNiFNCLYP8/GMFIe5v77rw+8rrp2YIFC/DBBx9gzZo1KC8vx9KlS9HW1obZs2cDAJ544gm8+OKL5vbnnXceGhsb8cwzz6CiogKbN2/Ga6+9hvPPP99vF0EUDLKzw9EAyvhFZvx14s/XaaiD/XiNqvIfVNL3Ds6dII0mSIm9NEkj8oSRGWlrdXQZNXpq5BV63Zcj7HSdheLD9YgifTViIxjZp4IROAUjjpV7/ReMSE1zzOYLdjCSnOJoce/Hxmdev/vTp09HfX09li9fDpvNhqFDh+Kee+4xh2lqa2tdqmfz8vLw85//HM8++yx++tOfIicnBxdccIHbacBEYe3kcZUNSbACpSOBLz+DrK3qd+8AefI4tH/9DZbZF0KMmgB55IB6Ir8QIsmDfjzOC3a1qZSzYGaE+kkkJashwLZWtXpvUnJUTOs1dc2M+DLcasyoOV6tAjajUeFwp0aFgWgHX3dSNWuzWICcfP8d1wPmDKGGOjW9NyvXL8f1KbSdP38+5s+f7/a5xYsXd3ts5MiRWLJkiS8vRRQ+jIZnOfkQ+YVqeltN/3uNyHdfAzZ/Au3g17As+SugNzvrs7+Izpjaq5qe6X/BJkVoMyoKLxlZKvtXb1PrrBxzTFuNdCI9Ay7VDL5kRtIzVROwxgbILzYALc0qgBs41LGR2YG1CVKzQ1ji+nPaipEVycmHiPPD8bxlBCN+DLC4Ng2Rh8zi1dx8teYEAFnbv2EaqWmQm9arOydqIdd9AHlYZUY8qhcBXGpGjMwIrAxGyA+MXiN64zNprkkTBZmRtK6ZER+HnYxOrGvfVfdLR7oGCMYwDaB+Rv3ALF7ND9E08DT/t4RnMELkKb1YVeTkQ+TpvwT6WzNyYA9wsta8K996GfKQmrIHT4MR56XMzZoRBiPkB04t4QE4ZUaiIBjpVsDq26w4oQcj0Be2dBmigb7mjTFs6q9MQqiKVw1mi3v/tYRnMEIRR279DLI6BD00jGGa3HwgX/8lUHusX9Pq5Odr1Y3J04HMHPUaVeqvT0+HaVyDEa7YS/4jnFbulZ2dwHF9eCAKhmm6FbD6OtxhBCM655k0JnNGTZNvr9FVrWNabyg4Vu71X1EugxGKKLL8ALQn7of29KPBf21jmCYnH8jVfwm0NPv8147zEI1l2myIC75pPmfJyASyPSwMM/7qamtxzHpgMEL+kJmlvtbbgH27ALsdsCYCWTmhPCu/EOlOwUhcHEQPy5P0eRznYEQI9yt5G0M1fsqMyFDNpDEEYOXeCJ+bRTFH75YYiCm1fTqhhlNEbgFEYqLKZNSdUEWsvixWZQzRJCUDYyZDSAn59itA3QkklI6EXQjPsi5GZsRud6ykyWCE/MEYpjm0D3LLpwAAMWGqzx/cYcV5mMaXHiMG52CkeAiEc42IIdXR+Mwvq8johfMiVDUjqf5fuTcKvqMophgLwTXWB7froJQus2kAmEM1vhaxGkM0YsJUiAQrhDUR4pJvAQCSp8zw/EDOM2f0PigRu7Q7hRVzmObwPjV7YlApxHd+ENqT8hfnPyD60zMlO9f8g8DtEA3gMqOmv2RHu/ojCAhdZkQfppEsYKVYZXYY1TSgxU/jr55osAEd7SoNqw+f9KeI1XmIRpx+lvm4Zca5iHv0n0i75BqPjyUscY5MiLHcO6f2kj8Ys2kAICsXlv/5pWe9byKBnzIjQghg0FB1Z/ho99v4s9fI8WrV7ygx2beMrB+IVP11Q9n0jCikjMwIoJb/dpcSDYTj+oyXzBzHWjRORayekCePQ3vwLvVXjQRg7zSHaJz5tCR4UrJqTmXMpuHUXvKH/ELVDCw+XgUintYxRYLEJNXAsKPdt4ZnTixXfw/yqy8gps50v0GKdy3hpZTQPngDYnApxMixrk+a9SIF3v+e8JcAFLAyGKHI0uYUjDTUq0ZMwXDCqceIIc/oNeJhMLJprevaNgDEWfMgEqz9P7/EZAAnHfeZGSE/EGkZsPz8D0ByKkRucDt9BpoQAkjPULVg/WxtL4YMgxgyrOcNUr1sCX9kP+S//g6ZX4i43/7N5SlpNFoMVb0I4LieRv/VjDAYocjSNTMSJNKpx4jB0YXVs2EauWub2u+iKyBmng9Y4lzT4P2R3CV1zswI+YkwhiCiUVqmHoz4f+VtF04FrJ6QxhpYtccgOztcVwbXa9RC1mMEAIxhmuZGSCn9kqFhzQhFFqNmBIAMYjDSrXgVcAzTnKiB7OjodXep2R1NkSacoRqnZeX4L81qzKgx7zMYIeqTMb23P7NpPGDWjHiaGTG2cy6c1zmm9YYwM2IM09jtfusqy2CEIku7IxgJbmbEGKYpcDyYmaP6LWgasH1T7wc4vF8V3CanAEM8bGbmja7BCDMjRH0SRhFroFcg9rJmxKU5Wtdh4JrQZ0ZEglX1mwH8VsTKYIQiS3uXmpFg0f86cR43F0KYBWvahjW97i53qyEajBgTkIWtuq3Sa/yiIKKepQUpGEn1MhhxyqDIWkedmZTSEZzkh3CYBvD7+jQMRiiytAW/ZkSeqAGOHlZ3CopcnhNnzFY3vvwMspcUrFkvcur4QJyia2YkMSk6mlIRBVqQhmng5TCNy+8S58xIc6NjWCQ3xMFIih+nK4PBCEUY6ZQZCVbNiHz7FTUN95RxEIWDXJ8cXAoUDwE6Oxyr73bdv7MT+HoHAECcMi4wJ5nsFIwwK0LkGb3DbMB/Zoxhmo52l99hPWruYZjGuJ2ZrbpAh5LR+IzBCMWktuDWjMgTtebS4JZvXNXteSEExBmz1Laffuj+IIf2qv4fqemO5kj+5pwZ6Vo/QkRuiUlnQkydCcu8iwP7QknJgJGt9GSoxmWYxhGMyOrQLpDnTPSyPo1salRF+15gMEKRxWVqr/+6//VEvrMC6OwERo7pMathBCPYs10N6XQ9xq4v1Y1TxgZu+CSJmREib4nUdFhu/gnE6ImBfR0hgJRUdceTztE9ZUbKD6rjFQ/x38n5Ks39+jTywNfQ7roR8u9/8OpwDEYosvixz0hfa9vIk8chPzayIlf3uJ3ILQBGjgGkhNz4Uffj6MWrARuiARwr9wLMjBCFI6ONvgdTYaVz9qShDlKvlZNH9qvHBpf6++y8Z/QacfqjUEoJ7V9/A9paIffv9upwDEYosjgHI00NkHbvUoEG7f3/QPv+NyH13h/uyHdeUVmREaOBPgIJc6imy6wa2dEB7N2ptglU8SoA4dz0jJkRovCT7Hkw0q3Q9bieHTlyAAAgwiIY6T5DSG78CDCCEC9rSRiMUGRxrhkBfKrklm2tkG+8BHR2Qn7WPZMBqKJTuWE1AMBy0ZV9NicTp80A4uKAo4cgqyscT+zdoda+yMhyXWrc31xm0zAzQhR2ktUwjfQoGNGHaYwFMGuPQTbUA7bj6n44dMU1C1hVhlq2tUG++qzj+bZWtcKwhxiMUGRp61KJ7sNQjfxklfmXR4+pxL071C+EtAxgVN8ZDZGaZq7YKb/8zPFaWz5Vz487LbCLWjkFI4LdV4nCj5kZ6b1mRNrtjm30oEPWHgPKVVYEBUVhsXKy6DJMI9/7t2qtn5PvKNb1oq6PwQhFDCmlY5jG+PD1MhiRmgb5wRuOB8oPQnbNtgCQWzcCAMT4KRAWz5qUiQlT9X0/M89Xbtmgnps0zavz9JpLASuDEaJwYw6ltvaeGdGchmiE0a35eLWjXmRQGAzRAI4C1ppK2B9fDPnmSwAA8c3rHH1Vmjz//cxghCJHZwcgNXXbaMvubWbkqy+AqqPqr5TMbNXK/eDXLpuoIELPaOgBhifEhCnqxtdfQTY3AYf3qb8UrInAqAnenae3XApYGYwQhR0PC1ilkU1ITAIGDFSP1R4Lr3oRQGWNAZVB3r5Z9WKaMBViytmO57zIjHDVXooczsWrOfmqPqOxHt4Mfmjvvw4AEDPOBU7UQm5aB7l/t+tMl4ojajpdfALgxZQ/UVAMFA4Cqsohv9oMHD2knhg7GSLQRaUuBawMRojCjocFrJrxAZ6cCpE3QK0MXnvMLNYXgwOwtpUvCoog5lwEebIW4pSxEKeMBwaWqOFosweJ538sMhihyGEMp8THQ2RkqR9SL9ankUcPAzu+AIQF4pwFkJs/ATatg9y3y3W7rSorglETILycJismTIGsKge2boQ0/pKZdKZXx/BJEjMjRGHN42BE/52WmuZoblZd6fhjLEwyI0IIiGsWuX9Sz4xI1oxQVDJ+GK2JXqcBZVsrtOefUHcmnQmRNwBi2Knq/v7dLj1HzHoRL4ZoDGK8XjfyxSdAxWEgLg5i3BSvj+P168YnOBb7SmQwQhR29GBE9lUzYswQTEl1DEe3tqgh5bR0IDs3kGfpFyLN+3VrGIxQ5DBm0liTAGPpbw/SgLKzA9pfHgD27QJSUmG55FvqiSFlaoGshjqzy6GsOwkc2ANAFa96bdipKkXZrk9pGzlWzbQJBiM7wmEaovCTbHRg9XCYJiVNZWaNP7wAYHBZYGfl+YsPwzQMRihyuMmM9LVYntTskE8/pgqsrFZYbv8lhN7vQyRYVUACmEM18svPACmBkuEQPvwFIuLiIMad5rgfjCEag14gx6m9ROHHnI7b3PvUXmOYRhjt453WoQmb4tW+pHtfwMpghCKHUTOSmAhh/LXQUNfrLvKjdyE/+xiIi4fl1nsgho9yeV6UnaJu7N+tGp2te1897sMQjWm8Y18x4Qzfj+MtI1vk/JcUEYUHc2pvS6+baUZHU32lX+G8KF64TOvtS6r3K/qygJUiR7sejFgTHXPc+8qMbN8EABALroQYO7n7BsNOBT54Q2VGnn9SDeVYEx2L3/lAjD8dcuQYiKLBEDl5Ph/HW5arbob8+iugS8BFRGHAw6ZnZgFrBGdGRFq6mmDA2TQUjaQxTJOY5FEaUGqaY12YMW4CEajMiASAw/sgD+8DhAWWRXdCFBT5fJ4iMQlxP/2dz/v7/LplpzgyPUQUXjxtemYGI3qtmRGMxMer1gGRwJxgwJoRikbOBazGN3tbi7n+gTxRC9nZ6di+qlxVc1sTe54Ol5MPZOaYd8W1t/hWuEpE1BsjGGlvd/091YVs7DJMM7BE3R86AiI+QvIHRqt4zqahqKRnRoQ1UVWmx+lt2hsbILdvhvaz70K+9Hdzc/n1DnWj7JQef4iFEBBjJqnbF10By8z5gTt/IopdzuvJ9JId6VbAOuxUWG67F5abfhzIs/MvYxi9uUlNSfYAgxGKHM4FrEK4pAK1NW8BUkKuX+VYa2avCkaEvoBdT8Q1i2D5xaMQ/+9bgTpzIopxIi7O0QOol+m9zlN7Af0PpglTIYyeI5EgJQ0wpiB7skoxGIxQJHGe2gs4pvdWlQN6oSra28xVc43MiBjRe0GnSEyCGDIsMubvE1HkSuq7iNWlA2uEEnFxjr4qfUxlNjAYocjhXMAKOIKRNW8B+roNACA3fgx5ohY4Xg0IC8CiTiIKB+aMGvfTe6WUjg6sxod5pDKGavqYPWRgMEKRo1tmRP9m3/MVAECcNU/d3/455LbP1e3BpY5mQ0REodTX9N62VscfVhGcGQHg+GORwQhFHaeaEQCOxmeAWvzukmuB4iFAZyfkG8vUwyN6rxchIgqavtanadZn0sTFO/7oilSpTkWsHmAwQhHDLEztUjMCABg9ASIrB2LK2ep+3UkA6NZxlYgoZJL6WLnX+OBOSY34GjbBYRqKWu1OfUYAl2BEnDlbfTWCEQODESIKEyK5r2DEtcdIRDOGaZgZoajj3GcEcKzFkpgEMWmaem5AMVAyXD2eXwiRFf7LbRNRjOhj5V5prEsT6fUigGOYhlN7Keq0uc6mEaeOBwqKIC64DCLRsVKtmH6O+tpDC3giopBITlZfexq60LMIItJn0gCOzLWHwzQR0luWCI6F8owC1sxsxC35a7fNxJyLIAoHckovEYUXMzPSw8q9zdGTGRFpGZAApHFNfWAwQpGj69TeHgghgNGTgnBCREReSFKZkZ6mu5of3CnRkBkxZtNwmIaiTVuXAlYioghirjfT49ReYzZN5GdGHDUjLGClaONhZoSIKCz1ObVXZUZENAQjZs0IMyMUxuS+XZCfr/V8+85OwK4vu53IzAgRRaC+pvY2ReEwjfRs1V7WjFBIaH/7PXCiBpbBZarYtC9G8SrAzAgRRaa+pvZGUwFrfAKQmOzx9syMUNBJKYG6E+r24f2e7WQM0VgsQDxjaCKKQMbU3tZm9Xuwq2iqGQEc2REPMBih4OtodywGVXHIs33aHPUikd4mmYhilJEZ0TTHH1jOzJqRKBimAVyX7OgDgxEKPqdKcllx2LN92l0bnhERRRxrosruAu5nmURTO3jAMaPGAwxGKPic550f9TAY6bpIHhFRhBFCOM2ocW18Jjs6gPZ2dSdKghHBYRoKa85z7KsrITva+96H03qJKBqYM2q6ZEZa9KyIEI5tIh2HaSisOVeSSw2oOtr3PmYreA7TEFEEMwIN5+FqKSHffhUAEJeTB2GJko9mDtNQWGvtkp482ncRq2xjZoSIooCbXiPynVch3/8PACDzhv8JxVkFBodpKJzJLnPsPSpiZQErEUUDvWZE6tN4tbXvQb76LADAcsV3kTrngpCdmt9xmIaCTR49BO2lpyB7WnPBWdeGPx5kRowCVsHMCBFFMGFM721tgWyog3zhz+rxC74Jy3mXhO7EAkBk5wEDBnm0LbtHkV9oK54Btm8CsnMgzlvY+8ZGwJJfCNRUmZkR2dkB+yO/AKyJsPzPr1z7ibCAlYiigdH4rKUJcscWoLMTGFgCsfA7IT2tQBAjRiNu9ASPtmUwQv0mpQQO7FF3yg/2vYOeGRHDRkHWVAE1VdBaWyA3rQP2fKW2OVkL5OQ79mHNCBFFA7MlfAuwYwsAQIydHPPNHDlMQ/1XUwU0NQAApCd9Q5wzI+mZAIDOIwegffCmY5vKctd9WDNCRNEgyTkz8gUAQIyeGLrzCRM+ZUbeeecdvPHGG7DZbCgpKcGNN96I4cOHu912zZo1+NOf/uTyWEJCAl544QVfXprCkDSyIgBQeQRSs0NY4nrewWj2k5wCFA8Bdm9D47uvA/t3O45ZeQRizCTHPu1sekZEUUBv9S737wZsJ4AEKzB8dIhPKvS8DkbWr1+P5557DjfffDNGjBiBlStXYsmSJXjssceQmZnpdp/k5GQ8/vjj/T5ZClMHv3bc7mgHao4BA4p73FwazX6SkiEGlkDu3oamt19Rj8XFqXVrqnrKjDAYIaIIZkztrTyivo4Yw8J8+DBM8+abb2Lu3LmYM2cOBg0ahJtvvhlWqxWrV6/ucR8hBLKyslz+UfRwyYwAfc+O0YdphJEZAQB9BUsxZ4G622WYRrIdPBFFAZHk2l2VQzSKV8FIZ2cn9u/fj3HjxjkOYLFg3Lhx2LNnT4/7tba24vvf/z5uvfVWPPTQQzhy5IjvZ0xhRXZ2Aof3qztlp6jH+lqJ1xymSYUYOMTx+PBREGfOUrd7yoxYWTNCRBEs2XVFXjFmYmjOI8x4NUxTX18PTdO6ZTaysrJQUVHhdp/i4mLceuutKCkpQXNzM15//XXce++9eOSRR5Cbm+t2n46ODnR0dJj3hRBITk6GECJmKo6N6wz76608rIZmklNhmTQN2v7dwNHDvZ+3c2akyDEHPW7e/wMK9fv1NqC5CSJVXzBKD0ZEUlL4vyf9FDH/9wESq9cfq9ftTlS/FylOmZGMLIhBpd2uN5qu29NrCfjU3pEjR2LkyJEu93/4wx/ivffew1VXXeV2n9deew0rVqww75eWluLBBx9EXl5eoE837BQWFob6FHrVuGU9TgJIPGUM0sdPRu0rzyCuugJFRUU97nO0vRUagPwhJUgYUoaTC78F7eRx5FxwCUR8PCryB8Becwy57c1IHD4CAFCl2dEBIKewCMm9HDuahPv/faDF6vXH6nW7E43vRSfsqNRvp5w+HbnF3evrovG6++JVMJKRkQGLxQKbzebyuM1m87gOJD4+HqWlpaiqqupxm4ULF2LBggXmfSOyqq2tdcmYRDMhBAoLC1FVVaX6eIQp+5bPAQDtxSU4mazWIeg8eggVhw9DJCR0215KCa1JrU5Z09AEUVkJseBql2vV8ouAmmOo/WorLNkF6pj6PiebmmGrrOx23GgSKf/3gRKr1x+r1+1ONL8XsqHRvN1aegoqnX6fReN1JyQkeJRI8CoYiY+PR1lZGbZv346pU6cCADRNw/bt2zF//nyPjqFpGg4fPoxJkyb1uE1CQgISevggi5b/IE+F+zUbxauidARkVo4aD21pgqwqBwYN7b59e5uaLQNAJiWbhauA07UWDQZ2bIGsOOK4dr3pmUywuuwTzcL9/z7QYvX6Y/W63YnG90ImpQBWq+q8Omqi2+uLpuv29Dq8HqZZsGABnnzySZSVlWH48OF466230NbWhtmzZwMAnnjiCeTk5OCaa64BAKxYsQIjRoxAYWEhmpqa8Prrr6OmpgZz58719qUpzMjWFqBCL0YeOlJlsAYOAfbuhDx6CMJNMGI2PBOi5wZmhQPV8Z2LWNn0jIiigIiPh+UHPwc0DSIzO9SnEza8DkamT5+O+vp6LF++HDabDUOHDsU999xjDtPU1ta6FKw0Njbir3/9K2w2G1JTU1FWVobf/OY3GDTIs8VzKLBkcyO0pY9ATDwDlpnne7fz4X2A1IDsPIisHACAKC6B3LsT6GklXmMmTVIyhMX9ZC5RNBgScMzDB8yF8ji1l4ginRjd88hArPKpgHX+/Pk9DsssXrzY5f7111+P66+/3peXoSCQn34EbPsc8thRwMtgRB7Qm50Ndeq+q0/VlT31GjEyI13m2rswZtTUVkN2tKtGaJ16rRCn9hIRRR2uTRPj5DZVgIoTtV6NUcrOTsi17wIAxPBR5uNiYIm60VNmpNnRfbVHGVmqZbLUgGMVjiEagJkRIqIoxGAkhsn2NmD3l+pOZwfQUOf5vmvfBaqOAmkZEDPOczxhdFStqXJ0TXXW6rQuTQ+EEGZ2RFaWdwlGrB6fIxERRQYGI7Fs93agvd1x/2StR7vJ1mbI15cBAMQ3roJIcXQUFOmZKrMBOIpbnfdt0YdpeglGAEAYzdCqys2ZNLAmRlUzICIiUhiMxDC57TPXB054GIy886rKohQUQ8x0UztUNFhtV+mm7b/RfbW3mhHnYxzYA/mOvogeZ9IQEUWlgHdgpfAkpYT8Uq8XMXqDnKhFX3kHWV0B+d6/AQCWb14HEd/9W0jkFUDuhvtMi6eZkcJBakbNts9hVLKIKWf3cXZERBSJGIzEqqpy4Hg1EB8PcfpZkB+/C5yo6XFzuetLaKvfArZsADQNGD4KmHSm+41z8tVXd8dr8WA2DeCoPdFvW668iatbEhFFKQYjMcqcRTNynGMqbQ81I9qnH0Iu/YPjgZFjYLnu9p7rN/RgRLoLRoypvcm9zKYBIPILIa79vgqWzpwDERfX6/ZERBS5GIzEKGOIRow/HSIrBxI9BA8AsEufcTN6IiyX3+i+s6oTkZOnhlbc1aAYTc+6LKPtjmWWZ0sMEBFRZGMwEoNkSzOwdwcAQIw7DWhsUE/0kBmRRw4AACwz5/cZiABwDNMcr4GU0iWDIs2mZ71nRoiIKHZwNk0sKj+oFqvLyYcoKAZy9BUVT56A1BexM0i7HTC6qQ4e6tnxs/VgpK0FaGlyfc6YTdNHASsREcUOBiOxqMGmvmbnqq8ZWarlutSAuhOu21YdVQ3REpOBvEKPDi8SE4G0dHWn61BNs4cFrEREFDMYjMQg2VCvbqRnAgCEJQ7I0gOTLsGDPLJf3Rg8tMeF7dzqaUZNq2dTe4mIKHYwGIlFemZE6MEIAHOoRnatGylX9SJiUKl3r5GtH4/BCBER9YHBSCyq19egSc8yHxLZ7jMZRvEqBnsXjAgzM+IIbqSUjtk0HKYhIiIdg5FYZCyIl57heMwoYu0aPOjBiBhc5t1r5LoJbjo7AHunus3MCBER6RiMxCBpBiNuhmmca0bqTqrARViAgU4dUT3hbpjGeWYN15khIiIdg5FYpAcjwlhdF4DINqb3OgUjxhBN4UAIa6JXL+FumMYxRJPsXTEsERFFNX4ixCK3mZHuwyrGTBrhZb2Iy/FsxyE1vXeJWbzad/dVIiKKHQxGYozU7ECj69ReAI6akYY6yI52ddvIjHg7kwYAsrIBi0U1V6uzqcda2H2ViIi6YzASa5oaASnV7TSnAtbUdMBqVbf1oRppTOv1ITPi2rtEz7ZwWi8REbnBYCTWGNN609JdVsIVQjjauJ+ohWxrBY5VqPtDfMiMAE6r9+rBDbuvEhGRGwxGYo3RCj4ts/tzOU4zYMoPqgxKRhZERrZPLyXMNW+6ZkY4TENERA4MRiKA3LsT2ivPQnZ09P9YRvFqRvdgxAwevt4B7cW/qNtDvOwv4qzrjJoWY5E8FrASEZFDfKhPgPqmvfos8PUOIDcfYvaF/TuYu5k0Bn2YRq59T91Py4Dl4m/5/lrGMM1xIzPC7qtERNQdMyORQP8wl9s39/9YRo8Rp1bwJiMzAgBlp8Dyi0chSkf4/FKOYRo9M8JhGiIicoOZkTAnNU11QgWAXV9CdnRAJCR03+7QXshd28z7omQYxKnjux+w3k0reGOfsadBlgyHOHUcxCXXQsR3fx2vdO1dwgJWIiJyg8FIuGtqcKzn0tYK7N0BjJrgsons7IT26K/UtsZjcfGwPPS0S5dVAJBGAaubzIjIzkXcvY/479yNYKShDrK9DZJTe4mIyA0O04S7k8dd7rodqjmwRwUiSckQ0+YAGVkqgPl6R/dtG1TDM+GmgNXvUlIda9CcqDGHaQSDESIicsJgJMxJ2wnX+191D0bkji0A1DCL5cYfQpw2XT2+Z3v3A/ZWwOpnQggzO6L9+n+B/XvUExymISIiJwxGwp1Nz4wMO1Wtnnv0kOtKuADkzi3qxuiJ6uuIserxPV91P545TBOEzAgAMfcbqrtrRzvQqU9Nzs4NymsTEVFkYM1IuNMzI6J4CCQA7NsF+dUXEGefBwCQzU1qmAaA0IMRMXKM2vboQcimRojUNLVtZwfQ3KSOG6RgxDJrPuTM84FjRyH37gQSkyAGlgTltYmIKDIwMxLmpJEZycqBGDNZPbZ9k2OD3dsATQMKiiFyCwAAIjMbKByoOqjudaobMRbIs1iAlLRgnL46HyEgCgfBMuNcWKacHbTXJSKiyMBgJNwZNSNZuRBjT1O3d26F7FQzbMx6EWOIRidGjFHPO9eN1DvqRYSF//VERBQe+IkU5ozMiMjKAUqGqZV2W5ohN6xWz/cQjGCkm7oRo3g1rXuPESIiolBhMBLunDMjFgvEvIsBAPLFv0Ju+RSorlDDLqeMc9lNjFSZERzeZ/b3cKxLkxWMMyciIvIIg5EwJjs7HdmMrBwAgLjgMmDc6UBHO7S/PKCeKx0JkeK6+JzIyQfyBqh6kr071YNmK/jgFK8SERF5gsFIAMiTx9XMlX6yn6xVRahx8ebQirBYYPnuD1WgYberx0ZNdLu/6DpUE+RpvURERJ5gMOJn8ughaHfdCLnU+7bqsqMdct8uSCkBAPbj+gJzmdkuBaciNR2WW38GJFjV/bGT3R9wZJci1vrgNTwjIiLyFPuM+Jk8tA+QEnL7ZkjNDmGJ83zfN5ZBvv0KxPV3ADPmwX68Wj2hD9E4E0OGwfLj30BWV0IMO9Xt8cTIsarfyMGvIasrIY2pvQxGiIgojDAz4m/1+gq7bS1AxWGvdpU7v1Q3tn0OALAbnVaz3HcsFcNOhWXanB6PJ/ILgTGTALsd2qvPAvU29Xgw1qUhIiLyEIMRf6s7ad6U+3Z7vJu024Gjh9Tt/Wo/+wk1TCPcZEY8Zbn8RtVGftN6oPygetDNir1EREShwmDE35yCEezb5fl+1RVq/RYAOFkLeaKm12EaT4mBJWbrePP46ewzQkRE4YPBiJ9J58zIfi8yI0cOuN7ftwv2470P03hK/L+rgaRkxwPMjBARURhhMOJvzpmRY0cdRaN9KXcTjPhhmAYAREY2xIWXqzvxCa6BCRERUYgxGPE3o4DVqqbdGivq9sXMjAwfpe7v3+00TNO/zAgAiHkXQ5wxC2LBlRBC9Pt4RERE/sJgxI9kWxvQolqvw1hh19O6kSMHAQBi1gXq/qG9kE2N6nY/MyMAIBKssNz0Y1guuqLfxyIiIvInBiP+ZGZFEiFGTwLgWd2IrLcBdScAISAmnqH6gOjdVZGYxGEVIiKKagxG/KlOX9QuM9vRiOzAHkjN3vt+Rr1IfiFEUjLg3MQsK5fDKkREFNUYjPiTUbyamQ0UD1FZjdYWoOJIr7tJfYgGg0oBAKLMEYz0t3iViIgo3DEY8SNzWm9GNkRcHDB0hHp8fx91I3pmRAzWgxGXzAiDESIiim4MRvxJD0ZEZrb6agQVfXRiNWbSGMEIhg4H4vQ1bfwwk4aIiCicMRjxJ+dhGqjF7ABAVvY8TCM7OoCqcnXHGKaxJgJGloSZESIiinIMRvxIdglGkDdAfa091vNOlYfVzJmUVCAnz3zYcu4lSBgxGmLC1ACdLRERUXhgMOJP+mwakalnM4xgpKEOsq3V7S5m8ergMpdZM5YzZqHwsecgCooCdbZERERhgcGIP9Xb1NfMLACASE0DklPVY0Y31a70PiRi0NCAnhoREVG4YjDiJ1KzA/V16k6mU51HboH66maoRmoa5NZPAQBC79hKREQUaxiM+EtDPSA1QFiA9AzH4/pQjXSXGdm/SxW9JqcCo8YH6USJiIjCC4MRfzG6r2ZkQljizIdFXi+ZkU2fqG0mTIGITwj4KRIREYUjBiM+kp2dsP/pt9Be+6d6oOtMGoORGekSjEgpIb/Qg5HJ0wN6rkREROGMwYivDuwBvtgA+fbLkPUnXbqvOhNmzUiXYZpDe1VRa2ISMGZSEE6YiIgoPMWH+gQilTx2VL8hIbdsBBpU8aroITPSdZhGbl6vth97mmpyRkREFKN8CkbeeecdvPHGG7DZbCgpKcGNN96I4cOH97nfunXr8Pjjj+P000/HnXfe6ctLh4+qo+ZN+cUnEPl6P5BuwYieGWluhGxugkhJVUM0er0ITuMQDRERxTavh2nWr1+P5557DpdddhkefPBBlJSUYMmSJairq+t1v+rqajz//PMYNWqUzycbTszMCADs/NJxv0swIpJSgLR0dceYUXP0EFBdAcQnQIw7LQhnS0REFL68DkbefPNNzJ07F3PmzMGgQYNw8803w2q1YvXq1T3uo2ka/u///g9XXHEFCgoK+nXCYeNYhfpqsQD2TmDnVgBuhmkAIFcfqjmuhmrklg3q/phJKlghIiKKYV4N03R2dmL//v245JJLzMcsFgvGjRuHPXv29LjfihUrkJGRgXPOOQc7d+7s83U6OjrQ0dFh3hdCIDk5GUIIl5bpoSLtdqC6EgAgpsyE/HQNIKW6n5nT7RxF3gDIQ3uB2moIISC3fwEAsEyY2uP1GI+Hw/UGWixdqydi/f2I1euP1et2J1bfi2i8bk+vxatgpL6+HpqmISsry+XxrKwsVFRUuN1n165dWLVqFR566CGPX+e1117DihUrzPulpaV48MEHkZeX18tewdNRcQRV9k4IayLyr7ge1Z+uMZ8rGHEK4otc15OxDS1Dw6Z1SGlpRGZaKo4eUC3gB5wzH/H5hb2+VmFh789Hk1i6Vk/E+vsRq9cfq9ftTqy+F7F43QGdTdPS0oL/+7//w6JFi5CRkdH3DrqFCxdiwYIF5n0jsqqtrTUzJrK5EfKDNyDOmB30xeS0bSqzIfOLcDwjB8jOA07WAgCq2zogKitdt09S69M0HT6A5jXvApoGFA9GTacEumxrEEKgsLAQVVVVkHrWJVrF0rV6Itbfj1i9/li9bndi9b2IxutOSEjwKJHgVTCSkZEBi8UCm83m8rjNZuuWLQGAY8eOoaamBg8++KD5mPEGX3XVVXjsscfcRoAJCQlISOjekVRKae6vrX0f8j8vQpyoheU7t3lzGf0mjZk0hcUAADHpTMhVbwLJKYA1sfs3kV4zImuqgO2b1D6jJ3v0zeZ8zdEulq7VE7H+fsTq9cfqdbsTq+9FNF23p9fhVTASHx+PsrIybN++HVOnTgWgilO3b9+O+fPnd9u+uLgYDz/8sMtj//rXv9Da2orrr7++f8Muet8O2dzo+zF8pQcjYsAg9XXKDBWMFA5yv73Za6QasrlJ7TOWC+MREREBPgzTLFiwAE8++STKysowfPhwvPXWW2hra8Ps2bMBAE888QRycnJwzTXXwGq1YsiQIS77p6aqIYuuj3tL2o6rG+3t/TqOT69tTOMtHAgAEMNHw/Kj+x0r9HaVm6++trWofwlWYMToIJwpERFR+PM6GJk+fTrq6+uxfPly2Gw2DB06FPfcc485TFNbWxucSuCTejDSEfxgBMeMzEix+ZAYNaHHzYU1UfUfMVrGnzKWXVeJiIh0PhWwzp8/3+2wDAAsXry4131/8IMf+PKS3dn0VXKDHIzI1mbHa+uZEY/kFpjBiOBaNERERKaIXChPanagLjTBiNnsLD0TIiXN492EUTcCQIxh11UiIiJDRAYjqK9T02OBoNeMmDNpBniRFQEcRaw5+d5lVIiIiKJcZAYjRvEqEILMiF4v4mVAIU4dr75OnxtV3fWIiIj6K6BNzwImlMFIletMGk+JURNgeeR5IDU9ACdFREQUuSIyGJEnTzjuBLuA1ZxJ4/1Qi0jP9PfpEBERRbyIDEZcMiNBqBmRh/dDfr0DsHc4MiM+BCNERETUXWQGIyedghF7J6Rmh7DEBeSl5LbPoT3xG0fBLADEJwD5A3reiYiIiDwWkcGIdM6MAEBHB5Do/2BEHvwa2l8eVIHIsFMh8ouA+HiIcadBxHdfO4eIiIi8F5HBiNl0zNDeDiQm+fUlZE0VtD/+GmhvA0ZPhOX2XzAAISIiCoDIn9oLAB1tfj281OzQnlwCNNQBg0thueVnDESIiIgCJOKCEdnaArQ0qztx+tBMR4d/X2TrZ8DRQ0BKGiz/80uI5BT/Hp+IiIhMEReMmFmRpGTAaMfu58yI9t6/AQBi1nyIrFy/HpuIiIhcRV7NiDGTJivX0WPEj9N75YGvga93AHHxEOdc5LfjEhERkXsRlxmRRvFqdi6QYFW3+9H4THv3Ndgf/jnk0UPq+O//BwAgppzNrAgREVEQRFwwYgzTiKwcwNr/YES++29g9zZov/sptNVvQX6+Vh3/3Iv7e6ZERETkgcgLRpyHaYzMiI/DNLK1Gag7qe60tUK++BfVU+SUcRBDhvnhZImIiKgvEReMmA3PnIZppK+ZkepK9TUtA2LuN8yHLfOYFSEiIgqWyCtg1WtGRFYuZD9rRuSxCnVjQDEsV90MOWoCZL0NmDDVDydKREREnoi8YMTdMI0HwYjU7ECdDSLbqShVD0aMFXjFhKkQfj1ZIiIi6ktkDdNIDajXazyycyCsnteMyH8thXbnDZC7tzserNYzIwVFfj5RIiIi8lRkBSNNDarA1GIBMrKcMiN9Nz2T+3err19tcjxmZkaK/X6qRERE5JnICkbq69TXjGwIS5xTMOJoBy8b6tQU3eYm131P1KjnD+51PGZkRvRhGiIiIgq+iKoZkQ16MGLUfbiZ2iv/+xrkf18FmhshLrpCPdbepha9A4BD+yClBJobgcYG9RiHaYiIiEImooIRMzOSlaO+Wt0M0xh9Q6rKHY+ddFrlt7kRqD3mCE6yciASkwJzvkRERNSniApGxMgxsNz6MyA1Qz2QkKi+Og/TtLWorzVVjh31IRpzm4N7Abu+TwHrRYiIiEIpooIRZGZDTJ7uuJ+QoL46T+1tVcEIaqvNh+SJWtfjHPraHOJh8SoREVFoRVYBa1f6MI1sdxqmMYKRuhOOx0/qmRGryqTIg3vNHiNgMEJERBRSkR2MmMM0TpmRtlbH7eN6EGJkRsaepr4e3gd57CgAQHCYhoiIKKQiOhgRvQ3TAKpQFYDUgxIxdrIanmlpBo4cUNswM0JERBRSER2MmJmRdvfBiNSDEZxUmRGRNwAYUqY/KQEhgPzCYJwpERER9SCygxGr69o0UkqgzTUzIqV0zKbJyYcoGe54PicfwuhVQkRERCER2cFI14XyOjsBu918WtYeA5qbHHUk2bmAczDCIRoiIqKQi65gxLleBABqqxxZkfRMCGsixFBHMMLiVSIiotCL7GCk66q9rc2uz9cecxmiAQAUDgSMjqsD2AaeiIgo1CI7GOmaGTGGY4xgo7kJsvygup2dBwBqgb1Tx6vbZacG6USJiIioJ5HVgbUrp2BESukYpsnIUrcb6iC//goAIHLzzd0sN9wB1B5zLWYlIiKikIiOYAQAOjscwUhiMpCWoRbD27tLPZaTZ24qUtOB1PQgnigRERH1JLKHaaxOwUh7u2OYJilZ9RQBHFN9s/NBRERE4Seyg5G4eNW4DFBDNUZmJCkJMIIRnXDKjBAREVH4iOhgRAjhWsSqByMiMblbMIJcZkaIiIjCUUQHIwBcp/caQzLOwzQAEBenilqJiIgo7ER+MGKu3NvmKGBN6pIZycpVU3qJiIgo7ERBMGKs3NtlNk1OPiD0y2O9CBERUdiKgmDEqBlpc51NEx+v1qIBIHJYL0JERBSuIj8YserDNO3Os2mS1VdjqIbBCBERUdiK/GBEH6aRTrNpjHbwouwU9XUoO60SERGFq8juwAq4Tu3VZ9MIPTMiLrkW4qy5wICBoTo7IiIi6kMUBCOOYRp0GaYRcXFA4aAQnRgRERF5IuKHaYS1e9Mzc9VeIiIiCnsRH4w4pvY6Nz1LCd35EBERkVeiIBgxmp61A62Oqb1EREQUGSI/GDGGaVqagc4OdZvBCBERUcSI/GAkXg9GGuodj7FmhIiIKGJEfjCiZ0ZkY526H5+guq8SERFRRIj8YMToM9KgByMcoiEiIoookR+MWLsEIxyiISIiiiiRH4wkdKkZYWaEiIgookRPMGLvVF8ZjBAREUWUiA9GzA6shkQGI0RERJEk4oMRc2qvgZkRIiKiiOLTHNh33nkHb7zxBmw2G0pKSnDjjTdi+PDhbrf99NNP8dprr6Gqqgp2ux2FhYX4xje+gZkzZ/brxE1dMiOCwQgREVFE8ToYWb9+PZ577jncfPPNGDFiBFauXIklS5bgscceQ2ZmZrft09LScOmll6K4uBjx8fHYvHkz/vSnPyEjIwMTJ07s/xUY7eANDEaIiIgiitfDNG+++Sbmzp2LOXPmYNCgQbj55pthtVqxevVqt9uPGTMGU6dOxaBBg1BYWIgLL7wQJSUl2LVrV79PHoBjoTwDp/YSERFFFK+Ckc7OTuzfvx/jxo1zHMBiwbhx47Bnz54+95dSYtu2baioqMDo0aO9P1t3uhawMjNCREQUUbwapqmvr4emacjKynJ5PCsrCxUVFT3u19zcjEWLFqGzsxMWiwXf/e53MX78+B637+joQEdHh3lfCIHk5GQIISCEcN3Y6poJEckp3beJQMY1RMO19CWWrtUTsf5+xOr1x+p1uxOr70U0Xren1xKURVySkpLw+9//Hq2trdi2bRuee+45DBgwAGPGjHG7/WuvvYYVK1aY90tLS/Hggw8iLy+v27b2tBQ4h0FZBYVILSry9yWETGFhYahPIWhi6Vo9EevvR6xef6xetzux+l7E4nV7FYxkZGTAYrHAZrO5PG6z2bplS5xZLBbzzR06dCiOHj2Kf//73z0GIwsXLsSCBQvM+0ZkVVtb65IxAQDZ1up6Lm1tqK+s9PSSwpYQAoWFhaiqqoKUMtSnE1CxdK2eiPX3I1avP1av251YfS+i8boTEhLcJhK68ioYiY+PR1lZGbZv346pU6cCADRNw/bt2zF//nyPj6NpWregwllCQgISuhamQtWcdP0PkvFdC1iTo+Y/EXB/zdEqlq7VE7H+fsTq9cfqdbsTq+9FNF23p9fh9TDNggUL8OSTT6KsrAzDhw/HW2+9hba2NsyePRsA8MQTTyAnJwfXXHMNADXkMmzYMAwYMAAdHR344osv8PHHH+Omm27y9qXdEhYLEJ8AdOrBDQtYiYiIIorXwcj06dNRX1+P5cuXw2azYejQobjnnnvMYZra2lqXgpW2tjYsXboUx48fh9VqxcCBA3H77bdj+vTpfrsIJFgdwQin9hIREUUUnwpY58+f3+OwzOLFi13uX3XVVbjqqqt8eRnPWa1AS5O6zcwIERFRRIn8tWkAx8q9AIMRIiKiCBN9wQhX7SUiIooo0RWMxMVDuJmFQ0REROErOoIRoyU8h2iIiIgiTnQEI0ZmhDNpiIiIIk50BSPMjBAREUWcqAhGBIMRIiKiiBUVwQhrRoiIiCJXdAQjrBkhIiKKWFEVjAhmRoiIiCJOdAQjRqOz5NTQngcRERF5zae1acKNmDYbOHYUYsa5oT4VIiIi8lJ0BCOFgyBuuSvUp0FEREQ+iI5hGiIiIopYDEaIiIgopBiMEBERUUgxGCEiIqKQYjBCREREIcVghIiIiEKKwQgRERGFFIMRIiIiCikGI0RERBRSDEaIiIgopBiMEBERUUgxGCEiIqKQYjBCREREIcVghIiIiEIqPtQn4I34+Ig6Xb+IpWuOpWv1RKy/H7F6/bF63e7E6nsRTdft6bUIKaUM8Ln0W0dHBxISEkJ9GkREROSDvj7HI2KYpqOjA48//jhaWloAAH/4wx98Oo6v+4Vi35aWFtx1113mNQfjNfu7r6/7hepaw/X7oaf3I1zP19/7xer3g7fXHerzDeS+Xd+LcD9ff+0Xjd/7LS0tePzxx9HR0dHrdhERjADAunXrYCRxysvLfTqGr/uFYl8pJQ4cOABfE1ehuFZf9wvVtYbr90NP70e4nq+/94vV7wdvrzvU5xvIfbu+F+F+vv7aLxq/96WUWLduXZ/HiZhgxNn5558f1P1CuW8oXjMU729/xMr3Qyydb3/w/Y2+fWPpfPsj0t5fFzICNDU1ycsvv1w2NTWF+lSCJpauOZau1ROx/n7E6vXH6nW7E6vvRTRet6fXFBGZkYSEBFx22WUxVcQaS9ccS9fqiVh/P2L1+mP1ut2J1fciGq/b02uKiNk0REREFL0iIjNCRERE0YvBCBEREYUUgxEiighXXHEFNm7cGOrTIKIAiJ6esxFmz549+MUvfoGJEyfi7rvvDvXp+NWTTz6JDz/8EPPmzcP3vvc9l+eWLl2Kd999F7NmzcIPfvCDEJ1h6Dz55JNoamrCnXfeGepTCblYeS+i+WfdW/X19XjppZewefNm1NXVITU1FUOHDsU3v/lNnHrqqaE+vYCrra3F8uXLsXXrVtTX1yM7OxtTpkzBZZddhvT09D73/+qrr3DffffhH//4B1JTU4NwxsHDYCREVq1ahQsuuACrVq3CiRMnkJOT4/OxNE0DAFgs4ZPoys3Nxfr163H99dfDarUCANrb27Fu3Trk5eWF+OyIgsefP+uR7g9/+AM6Ozvxgx/8AAMGDEBdXR22bduGxsbGUJ9awB07dgz33nsvioqKcMcdd6CgoABHjhzBP//5T2zZsgVLlixBWlpaqE8zZBiMhEBrayvWr1+PBx54ADabDWvWrMGll14KwBH5/uxnP8OLL76IyspKDB06FIsWLcKQIUMAAGvWrMEzzzyD2267DS+88AIqKyvxxz/+EQUFBaG8LBelpaU4duwYPv30U5x99tkAgI0bNyIvLw/5+fnmdlu2bMErr7yCI0eOwGKxYOTIkbj++utRWFgIALjvvvswaNAgfPe73zX3qa+vx6JFi3DPPfdg3Lhxwb0wP/rBD36ACy+8EBdddJH52E9/+lNMmTIFV1xxBQA1NLFo0SJs3rwZW7duRU5ODr7zne/g9NNPD9VpB4Qn70Uk6u1n3fg5fuaZZ8ztN27ciIcffhjLly83H3vllVfw9ttvo729HdOnT0d6ejq2bNmC3//+98G+nH5pamrCzp07sXjxYowePRoAkJ+fj+HDh7ts8/zzz+Ozzz5DZ2cnysrKcN1112Ho0KEAgOXLl+Ozzz7Deeedh1dffRUNDQ2YPHkybrnlFqSkpITisjz21FNPIT4+Hvfee6/5B1peXh5KS0tx++23Y9myZbj55pvR0dGBl156CevWrUNdXR1yc3OxcOFCjB07Fvfddx8A4IYbbgCAqMowh8+f0jFk/fr1GDhwIIqLi3H22Wdj9erV3dr/Pv/88/jOd76D3/3ud0hPT8eDDz6Izs5O8/m2tjb85z//wS233IJHHnkEmZmZwb6MPs2ZMwdr1qwx769evRqzZ8922aa1tRULFizAAw88gF/+8pcQQuDhhx82sz1z587F2rVrXdY1+Oijj5CTk4OxY8cG4zJCbsWKFZg2bRoefvhhTJo0CX/84x9j4i/JaODJz3pvPv74Y7z66qv41re+hQceeAB5eXl49913A3jGgZOUlISkpCRs3Lixx3VKHnnkEdTV1eGee+7BAw88gNLSUtx///0u3+9VVVX45JNPcNddd+Gee+7BwYMHsXTp0mBdhk8aGxuxdetWnHfeeWYgYsjKysKMGTOwfv16SCnxxBNPYN26dbjhhhvw6KOP4nvf+x6SkpKQl5eHH//4xwCAxx57DH/729/MoCQaMBgJgdWrV5vZgokTJ6K5uRk7duxw2ebyyy/H+PHjMWTIENx2222oq6tzKd6z2+347ne/i1NOOQXFxcVITEwM6jV4YubMmdi1axdqampQU1ODXbt2mddtOPPMM3HGGWegsLAQQ4cOxa233orDhw+b6x1MnToVAPDZZ5+Z+3z44YeYPXs2hBDBu5gQmjVrFmbMmIHCwkJcffXVaG1txd69e0N9WuQBT37We/POO+/gnHPOwZw5c1BcXIzLLrvMzJBGmri4OHz/+9/Hhx9+iOuvvx6/+MUv8OKLL+LQoUMAgF27dmHv3r340Y9+hGHDhqGoqAjf+c53kJKSgg0bNpjH6ejowG233YahQ4di9OjRuPHGG7Fu3TrYbLYQXVnfKisrIaXEwIED3T4/cOBANDU1Yd++ffjkk09w6623YurUqRgwYADGjRuH6dOnw2KxmMM4mZmZyMrKCvtskDc4TBNkFRUV2Lt3L37yk58AUD+g06dPx6pVqzBmzBhzu5EjR5q309LSUFxcjKNHj5qPxcfHo6SkJHgn7oOMjAxMmjQJa9asgZQSkydPRkZGhss2lZWVeOmll7B37140NDSYGZHa2loMGTIEVqsVM2fOxOrVqzF9+nTs378fhw8fjvqiR2fO/89JSUlITk5GXV1dCM+IPOHpz3pfxzjvvPNcHhs+fDi2b9/u9/MNhjPPPBOTJ0/Grl27sGfPHmzZsgWvv/46brnlFrS2tqK1tRU33nijyz7t7e2oqqoy7+fl5bnU3YwcORJSSlRUVCArKytYlxIQ1dXVsFgs5jBWLGEwEmSrVq2C3W7HokWLzMeklEhISHCpi+iL1WqNiMzAOeecg6eeegoA3F7fgw8+iPz8fCxatAjZ2dmQUuLHP/6xy5DU3Llz8dOf/hTHjx/HmjVrMHbsWJe6k0glhOiWsrfb7d22i4uL63O/SOfpexFJ+vpZj8Zr9oTVasX48eMxfvx4XHbZZfjLX/6C5cuX47zzzkN2djYWL17cbZ9IzwAUFhZCCIHy8nIz2+vs6NGjSE1N7TaEE0sYjASR3W7Hhx9+iO985zsYP368y3O///3vsXbtWjONt2fPHnPWSWNjIyorK3tM8YWziRMnorOzE0IITJw40eW5hoYGVFRUYNGiRRg1ahQAlartasiQIRg2bBg++OADrF27tttfTpEqIyPDJbXc3NyM6urq0J1QCEXbe+HJz3p+fr6ZDUhKSgIAHDx40GXb4uJi7Nu3D7NmzTIf27dvX8DPP5gGDRqEzz77DGVlZbDZbLBYLL0W49fW1rrMStqzZw+EECguLg7WKXstPT0d48ePx7vvvosFCxa4BB02mw1r167FzJkzMWTIEEgpsWPHjm7fN4DKiAOOGZTRhMFIEG3atAlNTU0455xzukX6Z5xxBlavXo1rr70WgKqgT09PR2ZmJv71r38hPT3dbUQd7iwWCx599FHztrPU1FSkp6fj/fffR3Z2Nmpra/HCCy+4Pc4555yDp59+GomJiRH5PrgzduxYrFmzBqeddhpSU1Px0ksvhdX07GCKtvfCk5/1n//857BarVi2bBkuuOAC7N2716XgGwDmz5+Pv/71rygrK8Mpp5yC9evX49ChQxgwYEAQr8Y/Ghoa8Mgjj2DOnDkoKSlBcnIy9u3bh//85z84/fTTMW7cOIwcORK///3vce2116KoqAgnT57E5s2bMXXqVAwbNgyAWnjtySefxLe//W20tLTgH//4B6ZNmxb2QzQ33ngj7r33XixZsgRXXnklCgoKUF5ejueffx45OTm4+uqrkZaWhlmzZuHPf/4zbrjhBgwdOhQ1NTWoq6vD9OnTkZ+fDyEENm3ahMmTJ8NqtZqBbKRjMBJEq1atwrhx49ymHM8880y8/vrrZjHXNddcg2eeecac2nvXXXeZUXGk6SnFarFYcMcdd+Af//gHfvzjH6O4uBg33HCD2zTtjBkz8Oyzz+Kss86K6FSmlNIcdrnkkktQXV2NBx54ACkpKbjyyisjOhvgrWh+Lzz5WT9+/Dhuv/12/POf/8QHH3yAsWPH4vLLL8ff/vY3c9uzzz4bx44dw/PPP4+Ojg5MmzYNs2fPjsgC5qSkJIwYMQIrV67EsWPHYLfbkZubi7lz5+LSSy+FEAJ33303li1bhj/96U+or69HVlYWRo0a5TJbsLCwEGeccQZ+97vfobGxEaeddhpuuummEF6ZZ4qKivDAAw9g+fLlePTRR9HY2IisrCxMmTIFl19+uVmcetNNN2HZsmV46qmn0NDQgLy8PCxcuBAAkJOTg8svvxwvvvgi/vznP2PmzJlRM7WXq/aGmWjusNcf1dXVuP322/G73/0OZWVloT4dny1ZsgSFhYVe1QdFK74Xvrn//vuRlZWF22+/PdSnEnRGn5FI67FCfYvcPCjFhM7OTthsNvzrX//CyJEjIzYQaWxsxKZNm7Bjx46IbtTmD3wvPNfW1oY333wTR44cwdGjR7F8+XJs27bNpYaEKBpEZt6fYsbu3btx3333oaioyGz4E4n+/Oc/Y9++fViwYAGmTJkS6tMJKb4XnhNC4IsvvsCrr76Kjo4OFBcX48c//rHb4kaiSMZhGiIiIgopDtMQERFRSDEYISIiopBiMEJEREQhxQLWAHrttdewceNGHD16FFarFSNHjsS1117r0imwvb0dzz33HNavX4+Ojg5MmDABN910k9nA5+DBg/j3v/+N3bt3o76+HgUFBTj33HNx4YUXmsfYtWsXXnjhBRw9ehRtbW3Iz8/HvHnzsGDBgmBfMhERkdcYjATQjh07cP7552PYsGGw2+1YtmwZfvOb3+CRRx4xu+Y9++yz2Lx5M370ox8hJSUFTz31FP7whz/g/vvvBwDs378fmZmZuP3225Gbm4vdu3fjb3/7GywWC+bPnw8ASExMxPnnn4+SkhIkJiZi165d+Pvf/46kpCTMmzcvZNdPRETkCc6mCaL6+nrcdNNNWLx4MUaPHo3m5mZ897vfxR133IEzzzwTgFow6Yc//CF+85vfuKzc62zp0qU4evQofvWrX/X4Wg8//DASExNjsjESERFFFtaMBFFzczMAmG1/9+/fD7vd7tL4aeDAgcjLy8OePXt6PY5xDHcOHDiA3bt3x+Qy1EREFHk4TBMkmqbhmWeewSmnnIIhQ4YAUKs1xsfHd2v7npmZ6bKCqbPdu3fjk08+wc9+9rNuz91yyy2or6+H3W7H5Zdfjrlz5/r9OoiIiPyNwUiQPPXUUzhy5Ah+/etf+3yMw4cP46GHHsJll12GCRMmdHv+17/+NVpbW7Fnzx68+OKLKCwsxIwZM/pz2kRERAHHYCQInnrqKWzevBn33XcfcnNzzcezsrLQ2dmJpqYml+xIXV1dt+Wwy8vLcf/992PevHn45je/6fZ1CgoKAABDhgxBXV0dXn75ZQYjREQU9lgzEkBSSjz11FPYuHEjfvnLX5rBgqGsrAxxcXHYtm2b+VhFRQVqa2tdilePHDmC++67D7NmzcLVV1/t8Wt3dnb650KIiIgCiJmRAHrqqaewdu1a3HnnnUhOTjbrQFJSUmC1WpGSkoJzzjkHzz33HNLS0pCSkoKnn34aI0eONIORw4cP49e//jUmTJiABQsWmMewWCzIyMgAALzzzjvIy8vDwIEDAQA7d+7EG2+8gQsuuCDo10xEROQtTu0NoCuuuMLt49///vcxe/ZsAI6mZ+vWrUNnZ2e3pmfLly/HihUruh0jPz8fTz75JADg7bffxvvvv4/q6mpYLBYUFhZi7ty5mDdvHiwWJr+IiCi8MRghIiKikOKfzURERBRSDEaIiIgopBiMEBERUUgxGCEiIqKQYjBCREREIcVghIiIiEKKwQgRERGFFIMRIgp71dXVuOKKK7BmzZpQnwoRBQDbwRPFmDVr1uBPf/qTeT8hIQFpaWkYMmQIJk2ahDlz5iA5Odnr4+7evRtbt27FRRdd5LLwozfWrl2Luro6XHTRRT7tT0SRicEIUYy64oorUFBQALvdDpvNhh07duDZZ5/FypUrceedd6KkpMSr4+3evRsrVqzA7Nmz+xWMHDlypFswkp+fj3/+85+Ij+evLKJoxJ9sohg1adIkDBs2zLy/cOFCbN++HQ888AAeeughPProo7BarSE8QwchRNicCxH5H4MRIjKNHTsW3/zmN7Fs2TJ89NFHmDdvHg4dOoQ333wTO3fuxMmTJ5GSkoJJkybh29/+NtLT0wG4Luh42223mcd74oknUFBQAAD46KOPsHLlSpSXl8NqtWLChAm49tprkZeXBwBYvHgxduzYAcCxyKSxIGR1dTVuu+02l0Umn3zySWzYsAGPPvooli5diq+++gopKSlYuHAh5s+fj8OHD+Mf//gH9u7di/T0dFxzzTWYMWOGy/U2NTXh5Zdfxqeffoq6ujrk5uZi7ty5uPjii7nIJFEQMRghIhczZ87EsmXL8OWXX2LevHn48ssvUV1djdmzZyMrKwvl5eV4//33UV5ejiVLlkAIgTPOOAOVlZVYt24drrvuOjNIycjIAAC8+uqreOmllzBt2jTMnTsX9fX1ePvtt/GrX/0KDz30EFJTU3HppZeiubkZx48fx3XXXQcASEpK6vVcNU3Db3/7W4waNQrXXnst1q5di6effhpJSUlYtmwZzj77bJxxxhl477338MQTT2DkyJFmcNTW1obFixfjxIkTmDdvHvLy8rB7924sW7YMNpsN119/feDeZCJywWCEiFzk5uYiJSUFx44dAwCcf/75+MY3vuGyzYgRI/D4449j165dGDVqFEpKSlBaWop169ZhypQp5gc+ANTU1GD58uW48sorcemll5qPT506FXfddRf++9//4tJLL8X48eORk5ODpqYmzJw506Nz7ejowNlnn42FCxcCAGbMmIFFixbhz3/+M+644w5Mnz4dADB+/Hj87//+L9asWWNmXd58801UVVXhoYceQlFREQDg3HPPRU5ODl5//XUsWLDAzNoQUWAxD0lE3SQlJaGlpQUAXGo12tvbUV9fjxEjRgAADhw40OexPv30U0gpMX36dNTX15v/srKyUFhYiK+++qpf5zp37lzzdmpqKoqLi5GYmIhp06aZjxcXFyM1NRXV1dXmYxs2bMCoUaOQmprqcl7jxo2DpmnYuXNnv86LiDzHzAgRddPa2orMzEwAQGNjI15++WWsX78edXV1Lts1Nzf3eayqqipIKfE///M/bp/vzwyZhIQEcyjIkJKSgtzcXAghuj3e2Nho3q+srMShQ4dw0003uT1212slosBhMEJELo4fP47m5mYMGDAAAPDoo49i9+7duPjiizF06FAkJSWZtRqapvV5PE3TIITA3Xff7bYotK+6kN70VGTqSfGplBLjx4/HxRdf7Pb54uJin8+LiLzDYISIXHz00UcAgIkTJ6KxsRHbtm3DFVdcgcsuu8zcprKystt+XTMRhsLCQkgpUVBQEFYf8AMGDEBrayvGjx8f6lMhinmsGSEi0/bt2/HKK6+goKAAM2bMMDMMUkqX7VauXNlt38TERADdh26mTp0Ki8WCFStWdDuOlBINDQ3m/aSkJI+Gfvxh2rRp2LNnD7Zs2dLtuaamJtjt9qCcBxExM0IUs7744gscPXoUmqbBZrPhq6++wpdffom8vDzceeedsFqtsFqtGDVqFF5//XXY7Xbk5ORg69atLoWghrKyMgDAsmXLcNZZZyEuLg6nnXYaCgsLcdVVV+HFF19ETU0NpkyZgqSkJFRXV+Ozzz4z+3oYx1i/fj2effZZDBs2DElJSTj99NMDcv0XX3wxPv/8czz44IOYNWsWysrK0NbWhsOHD2PDhg148sknu9WjEFFgMBghilHLly8HoApIjbVprrvuum5r09xxxx14+umn8d///tess7jnnnuwaNEil+MNHz4cV155Jd577z1s2bIFUko88cQTSEpKwiWXXIKioiKsXLkSL7/8MgAgLy8P48ePdwk2zjvvPBw8eBBr1qzBypUrkZ+fH7BgJDExEffddx9effVVbNiwAR999BGSk5NRXFyMK664AikpKQF5XSLqTsiueVMiIiKiIGLNCBEREYUUgxEiIiIKKQYjREREFFIMRoiIiCikGIwQERFRSDEYISIiopBiMEJEREQhxWCEiIiIQorBCBEREYUUgxEiIiIKKQYjREREFFIMRoiIiCikGIwQERFRSP1/ZWgjQ/p5jYsAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "(delta * quantity).plot()" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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zfTt25fKyko2b95MTU1NoJvmd4cPH+auu+6iX79+3HbbbeTk5FBUVMQ///lPNmzYwP33309ycnKgmxkwEsCEkIaGBlavXs2DDz5IRUUFy5cv5+KLLwZcUfbtt9/OK6+8QklJCUOGDOGGG25g0KBBACxfvpwXXniBW265hX/961+UlJTw2GOPkZOTE8huWYYOHcrhw4f5+uuvOf300wFYs2YNWVlZZGdnW8dt2LCBf//73xQVFWGz2cjPz+cnP/kJubm5ACxcuJABAwZw3XXXWedUVVVxww03cOeddzJhwoTe7ZgP3XzzzXznO9/hggsusJ77zW9+w9SpU7n88ssBY9rkhhtuYN26dWzcuJGMjAyuuuoqTjnllEA12y88+SxCUWc/5+bP8AsvvGAdv2bNGv7yl7+wdOlS67l///vfvP/++zQ1NTFz5kxSUlLYsGEDf/7zn3u7Oz1SW1vL9u3bueeeexg7diwA2dnZjBgxwu2Yl19+mW+++YaWlhaGDRvG1VdfzZAhQwBYunQp33zzDeeccw5vvPEG1dXVnHTSSdx4440kJiYGolseW7x4MdHR0dx1113WH3VZWVkMHTqUW2+9lSVLlvDTn/6U5uZmXnvtNVatWkVlZSWZmZlcdNFFjB8/noULFwJwzTXXAITVSHZw/OktPLJ69Wr69+9PXl4ep59+Op999lmb8tEvv/wyV111FQ888AApKSk89NBDtLS0WK83Njby1ltvceONN/LXv/6VtLS03u5Gp84880yWL19uPf7ss8+YM2eO2zENDQ3Mnz+fBx98kLvvvhulFH/5y1+sEaW5c+eycuVKt300Pv/8czIyMhg/fnxvdCPgli1bxqmnnspf/vIXpkyZwmOPPRYRf7GGA09+zjvzxRdf8MYbb/CjH/2IBx98kKysLD766CM/tth/4uPjiY+PZ82aNR3ui/PXv/6VyspK7rzzTh588EGGDh3Kvffe6/b9Xlpaypdffsnvfvc77rzzTgoLC3n22Wd7qxvdUlNTw8aNGznnnHOs4MWUnp7OrFmzWL16NVprHn/8cVatWsU111zDo48+ys9+9jPi4+PJysriV7/6FQD/+7//y9NPP20FMuFAApgQ8tlnn1kjE5MnT6auro5t27a5HXPZZZcxceJEBg0axC233EJlZaVbEqPdbue6665j1KhR5OXlERcX16t96MoZ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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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upkhowAmgpSVlbFo0SLuv/9+CgoKmD9/Pueccw5QE2XfcsstvPDCC+zatYv+/ftzzTXX0LdvXwDmz5/P3//+d2644Qb++c9/smvXLh599FEyMzND+ViuAQMGsGfPHj7//HOmTZsGwOLFi8nIyKB79+7ucUuXLuVf//oX27Ztw+PxkJOTw2WXXUZWVhYAd911F7179+bKK690zykqKuKaa67htttuY9SoUe37YEF0/fXXc+aZZ3LWWWe5237xi18wYcIELrjgAsDpNrnmmmtYsmQJy5Yto2vXrlxyySUcc8wxoWp2mwjks4hETf2c+3+G//73v7vHL168mD/84Q/MnTvX3favf/2Lt99+m4qKCqZMmUJaWhpLly7l97//fXs/TquUlJTwzTffcOeddzJixAgAunfvzuDBg+sc849//IMvvviCqqoqBg4cyKWXXkr//v0BmDt3Ll988QWnnnoqr7zyCgcPHmT8+PFce+21pKSkhOKxAjZ79mzi4+O544473P/UZWRkMGDAAG688UbmzJnD1VdfTWVlJS+99BILFy6ksLCQbt26MWvWLEaOHMldd90FwOWXXw4QVZns8PivtwRk0aJF9OrVi+zsbKZNm8aHH35Yb/rof/zjH1xyySXcd999pKWl8cADD1BVVeXuLy8v57XXXuPaa6/l4YcfpnPnzu39GE064YQTmD9/vvv+ww8/ZMaMGXWOKSsrY+bMmdx///38+te/xhjDH/7wBzejdNJJJ7FgwYI662h8/PHHdO3alZEjR7bHY4TcvHnzOPbYY/nDH/7AuHHjePTRR2Pif6zRIJCf86Z88sknvPLKK3z/+9/n/vvvJyMjg3fffbcNW9x2kpOTSU5OZvHixY2ui/Pwww9TWFjIbbfdxv3338+AAQP47W9/W+f7fffu3Xz66afcfPPN3HbbbWzevJmnnnqqvR6jRYqLi1m2bBmnnnqqG7z4paenM3XqVBYtWoS1lscee4yFCxdy+eWX88gjj/DDH/6Q5ORkMjIy+NnPfgbAH//4R/72t7+5gUw0UAATQT788EM3MzF27FhKS0tZvXp1nWPOP/98Ro8eTd++fbnhhhsoLCysU8RYXV3NlVdeydChQ8nOziYpKaldn+FIjj/+eNasWcPevXvZu3cva9ascZ/Zb/LkyUyaNImsrCz69+/P//3f/7F161Z3fY2JEycC8MUXX7jnfPTRR8yYMQNjTPs9TAhNnz6dqVOnkpWVxXe/+13KyspYv359qJslAQjk57wp//3vfznxxBM54YQTyM7O5rzzznOzsJEmLi6O6667jo8++ojLLruMX/3qV7zwwgts2bIFgDVr1rB+/Xp++tOfMmjQIHr27Mkll1xCSkoKn332mXudyspKbrjhBvr378+IESO44oorWLhwIQUFBSF6siPbtWsX1lp69erV4P5evXpRUlLChg0b+PTTT/m///s/Jk6cSI8ePRg1ahRTpkzB4/G4XUydO3cmPT097LNOzaEupAixc+dO1q9fz89//nPA+cGeMmUKH3zwAUcddZR7XE5Ojvu6Y8eOZGdns2PHDndbfHw8/fr1a7+GN1OnTp0YN24c8+fPx1rL+PHj6dSpU51jdu3axUsvvcT69es5ePCgm3nJz8+nb9++JCYmcvzxx/Phhx8yZcoUNm7cyNatW6O+8LO22n/HycnJdOjQgcLCwhC2SAIR6M/5ka5x6qmn1tk2ePBgVq5cGfT2tofJkyczfvx41qxZQ25uLkuXLuX111/n2muvpaysjLKyMq644oo651RUVLB79273fUZGRp06opycHKy17Ny5k/T09PZ6lDaRl5eHx+Nxu9hiiQKYCPHBBx9QXV3NNddc426z1pKQkFCn1uNIEhMTwz4LceKJJzJ79myABp/tgQceoHv37lxzzTV06dIFay0/+9nP6nSVnXTSSfziF79g3759zJ8/n5EjR9apo4lUxph63QnV1dX1jouLizvieZEu0M8ikhzp5zwanzkQiYmJjB49mtGjR3Peeefx17/+lblz53LqqafSpUsX7rzzznrnRHqmISsrC2MM27dvd7PKte3YsYPU1NR63UuxRAFMBKiuruajjz7ikksuYfTo0XX2/f73v2fBggVumjE3N9cdsVNcXMyuXbsaTUGGq7Fjx1JVVYUxhrFjx9bZd/DgQXbu3Mk111zD8OHDASeNfLi+ffsyaNAg3n//fRYsWFDvf2iRqlOnTnXS3qWlpeTl5YWuQSEUbZ9FID/n3bt3d7MOycnJAGzevLnOsdnZ2WzYsIHp06e72zZs2NDm7W9PvXv35osvvmDgwIEUFBTg8XiaHIyQn59fZzRXbm4uxhiys7Pbq8nNlpaWxujRo3n33XeZOXNmnUCloKCABQsWcPzxx9O3b1+s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znSzQyLStpTvFJGgSE5O5tChQwB1ak8qKiooKipiyJAhAGzatOmI1/r888+x1jJlyhSKiorcP+np6WRlZbFq1apWtfWkk05yX6emppKdnU1SUhLHHnusuz07O5vU1FTy8vLcbZ999hnDhw8nNTW1TrtGjRqF1+vlm2++aVW7RCRwysCISFCUlZXRuXNnAIqLi3n55ZdZtGgRhYWFdY4rLS094rV2796NtZYf/ehHDe5vzciihIQEt5vKLyUlhW7dumGMqbe9uLjYfb9r1y62bNnCVVdd1eC1D39WEWk7CmBEpNX27dtHaWkpPXr0AOCRRx5h7dq1fPvb36Z///4kJye7tSder/eI1/N6vRhjuPXWWxssjD1SnUtTGiu0DaQA11rL6NGj+fa3v93g/uzs7Ba3S0SaRwGMiLTaxx9/DMDYsWMpLi5mxYoVXHDBBZx33nnuMbt27ap33uEZD7+srCystWRmZoZVUNCjRw/KysoYPXp0qJsiEvNUAyMirbJy5Ur+9a9/kZmZydSpU91MhrW2znFvvvlmvXOTkpKA+t1KEydOxOPxMG/evHrXsdZy8OBB931ycnJA3VLBcOyxx5Kbm8vSpUvr7SspKaG6urpd2iEiysCISDN8/fXX7NixA6/XS0FBAatWrWL58uVkZGTwy1/+ksTERBITExk+fDivv/461dXVdO3alWXLltUphvUbOHAgAHPmzOG4444jLi6Oo48+mqysLC666CJeeOEF9u7dy4QJE0hOTiYvL48vvvjCnXfFf41Fixbx7LPPMmjQIJKTkznmmGPa5Pm//e1v8+WXX/LAAw8wffp0Bg4cSHl5OVu3buWzzz7j8ccfr1dfIyJtQwGMiARs7ty5gFNE618L6dJLL623FtJNN93E008/zTvvvOPWjdx2221cc801da43ePBgLrzwQv73v/+xdOlSrLU89thjJCcnc/bZZ9OzZ0/efPNNXn75ZQAyMjIYPXp0nQDl1FNPZfPmzcyfP58333yT7t27t1kAk5SUxF133cUrr7zCZ599xscff0yHDh3Izs7mggsuICUlpU3uKyL1GXt4flZEREQkzKkGRkRERCKOAhgRERGJOApgREREJOIogBEREZGIowBGREREIo4CGBEREYk4CmBEREQk4iiAERERkYijAEZEREQijgIYERERiTgKYERERCTiKIARERGRiKMARkRERCLO/weAiHHWPLNE3AAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "delta = greeks['Midpoint_delta'].shift(1)\n", - "quantity_ts = pd.Series([quantity]*len(delta), index = delta.index)\n", - "quantity_ts\n", - "delta_frame = delta.to_frame()\n", - "delta_frame['spot_close'] = spot_ts['close']\n", - "delta_frame['unedited_quantity'] = quantity\n", - "delta_frame['edited_quantity'] = quantity_edit\n", - "delta_frame['close_change'] = delta_frame['spot_close'] - delta_frame['spot_close'].shift(1)\n", - "delta_frame['edited_delta'] = (delta_frame['edited_quantity'] * delta_frame['Midpoint_delta']) * 100\n", - "delta_frame['unedited_delta'] = (delta_frame['unedited_quantity'] * delta_frame['Midpoint_delta']) * 100\n", - "delta_frame['pnl'] = delta_frame['unedited_delta'] * delta_frame['close_change']\n", - "delta_frame['pnl_edited'] = delta_frame['edited_delta'] * delta_frame['close_change']\n", - "# delta_frame['pnl'].cumsum().plot(y = 'undedited_quantity')\n", - "# delta_frame['pnl_edited'].cumsum().plot(y = 'edited_quantity')\n", - "# plt.legend()\n", - "# plt.show()\n", - "# delta_frame.plot(y = ['unedited_delta', 'edited_delta'])\n", - "delta_frame.cumsum().plot(y = ['pnl'])\n", - "plt.show()\n", - "delta_frame.cumsum().plot(y = ['pnl_edited'])\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": 86, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Q Change 1 PnL 133.9030224079591 on 2023-05-05 00:00:00\n", - "Q Change 1 PnL 278.86588966446476 on 2023-07-13 00:00:00\n" - ] - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjMAAAHcCAYAAAAjqCsIAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAACccElEQVR4nOzdd3hb1fnA8e+R955xHCdxnJ2QyUogg0wIlFAadimFsmlYLe2vDZSyV5hllFEIq6WBlD3KTgINCSQkZO/h7MSx471tnd8fV/dKsmVbtiXbkt7P8+SxdHXv1bk3Hq/e855zlNZaI4QQQggRoGyd3QAhhBBCiPaQYEYIIYQQAU2CGSGEEEIENAlmhBBCCBHQJJgRQgghRECTYEYIIYQQAU2CGSGEEEIENAlmhBBCCBHQJJgRQgghRECTYEaIIKKUYvLkya065je/+Q1KKXJzc/3SpmC0ePFilFLcddddfnuP3NxclFL85je/8dt7+MJdd92FUorFixd3dlNECJNgRgQtpZTbv7CwMNLT05k6dSr//ve/231+Mwh49dVX23T8O++8g1KKCy+80OPrDz74IEopoqOjqaqqavT6rl27UErRr1+/Zt8nUP/Y5OTkkJOT0+rjzOt1/RcdHc2AAQO45pprJGgTIgiFd3YDhPC3O++8E4Da2lo2b97MBx98wKJFi/jxxx95/PHHO61dU6ZMwWazsXjxYrTWKKXcXv/6669RSlFdXc13333HtGnTGr0OMH36dGvbpk2biI2N9X/jA8CkSZOsLFVBQQELFy7kxRdf5O233+aHH35g4MCBndvAIHHDDTdw0UUXkZ2d3dlNESFMghkR9Bp2BXz99deceuqp/O1vf+Omm25q06d/X0hNTWXUqFH89NNPrF+/nhEjRlivVVdXs3TpUmbNmsX777/PwoULGwUzCxcuBHDbPmTIkI5pfACYPHmy2/+93W7nrLPO4r///S8PPPAAr7zySuc1Loikp6eTnp7e2c0QIU66mUTImTZtGkOGDEFrzYoVKwD3rpi3336bMWPGEBsbS2pqKhdddBH79+/3W1vAGZiYli1bRmVlJeeccw6jR49u9DrAokWLUEoxdepUa1vDmpmcnBzuvvtuwMgEuXa9ePLCCy8wYsQIoqOj6d69O9dccw3FxcUe9125ciXnnnsuGRkZREVF0adPH2bPns3Bgwcb7Tt58uQm3/PVV191664z61F2797N7t273drcnvoRm81mHW/+v7uqqKjgwQcfZPTo0cTFxREfH8/JJ5/M/Pnzmz3vsmXLmD59OklJSSQkJDBjxgx+/PHHRvsdOHCAe+65h/Hjx5OZmUlkZCRZWVlcfPHFbNy40evr2Lp1K3PmzOGEE06gW7du1r2/5ppr2LdvX6P9Xet7Vq9ezZlnnklycjKxsbFMmjSJpUuXenyf+vp6nn/+ecaPH09SUhIxMTEMGDCAq666im3btln7NdWNaX4v5ufnc80119CjRw+ioqIYNmxYk4FkdXU1d911F/369SMqKoq+ffty++23U11d3aZ6MBE6JDMjQpLWGqDRH9hnn32WDz/8kJ///OdMmjSJH374gbfeeos1a9awevVqoqKifNqOqVOn8uijj/L1119z8803W9vNLqSpU6fy008/8eSTT1JaWkpCQgIAGzZs4NChQ4wcOZJu3bo1ef7f/e53vP/++3zzzTdcdtllzWah/vSnP/H5559z1llncdppp7Fo0SJefPFFtm/f3iiY+vjjjzn33HPRWnPeeefRp08fVq5cyXPPPccHH3zAkiVL6Nu3b5vuSU5ODnfeeSd/+9vfrGswjR49uk3nbCgiIsLteVFRkXWvjzvuOK644grsdjuff/45F198MRs2bOC+++5rdJ4ffviBBx98kOnTp3P99dezfft23n33Xb799lu++OILJk6caO377bff8tBDDzFlyhTOPfdc4uPj2bZtG2+//TYffvgh3333HaNGjWqx7e+++y7PP/88U6ZMYdy4cURGRrJhwwZeeuklPvroI3788Ud69uzZ6Lgff/yRhx9+mJNPPpmrrrqKPXv28M477zBt2jRWr17N4MGDrX1ramqYOXMmX375Jb179+biiy8mMTGR3Nxc3nvvPSZMmOBVN11RURHjx48nMjKS8847j+rqav7zn/9wxRVXYLPZuOyyy6x9tdace+65fPLJJwwcOJAbbriB2tpaXn31VTZs2NDie4kQp4UIUoD29C3+5ZdfaqWUVkrp3NxcrbXWd955pwZ0QkKCXrt2rdv+v/zlLzWg33rrLbftl112mQb0K6+80uY2lpWV6YiICJ2UlKTr6uqs7ePGjdODBw/WWmv98ccfa0B/9NFH1utPPfWUBvTvf//7Rtc8adIkt23mtS1atMhjG8zr6N27t969e7e1vba2Vk+cOFED+ocffrC2l5aW6tTUVG2z2fS3337rdq6HHnpIA/rUU0912z5p0iSP/xdaa/3KK694vI99+vTRffr08XhMc8zrvfPOO92219XV6RkzZmhA33DDDW6vmfdg7ty5btsrKyv1jBkztFJK//TTT9b2RYsWWd9fTz/9tNsx77//vgb0gAEDdH19vbX98OHDuqSkpFF7V69erePi4vTpp5/utn3Xrl0a0Jdddpnb9n379umqqqpG5/n888+1zWbT1113ndt217Y2vMfPP/+8BvRvf/tbt+233nqrBvRZZ53V6L2qqqp0Xl6e9byp7y/zPa+88kq37+0NGzbosLAwPXToULf9X3/9dQ3oiRMn6urqamt7YWGhHjx4sMfvbSFM0s0kgt5dd93FXXfdxV/+8hfOO+88Tj/9dLTW/O53v6NPnz5u+950001utSsAV199NQDLly/3edvi4uIYO3YsxcXFrFy5EoCysjJWrFhhdR9NnDiRsLAwt+yIp3qZ9rrjjjvcijjDw8O5/PLLAfdr/+CDDzh69CgXXnihW+YB4A9/+AM5OTl8+eWX7Nmzx2dta4vFixdb//c33XQTw4cP5/PPP+eYY47hr3/9q7VfQUEB//rXvzjhhBP405/+5HaO6Oho5s6di9ba4wi4AQMGMHv2bLdtZ599NpMmTWL79u3873//s7ZnZGRYmTVXo0aNYurUqSxatIja2toWr6tnz54eM4SnnXYaw4YN4/PPP/d43Pjx4xt1011xxRWEh4e7/f/W19fz7LPPEhMTw/PPP9/ovaKioprNBrqKjY3l8ccfJywszNp2zDHHMH78eDZt2kRZWZm1/bXXXgPgvvvuIzIy0tqenJzs9v8lhCfSzSSCnlkzopQiOTmZiRMncuWVV3LJJZc02veEE05otK13794AFBYW+qV9U6dOZcmSJSxcuJAxY8bwv//9j9raWqZMmQJAYmIixx9/vBXA2O12vvnmG8LDwznllFN81g5vr33VqlVWuxsy25Sbm8tPP/3UqSNcvvnmG7755hu3baNHj2bx4sUkJSVZ21asWEF9fX2T88aYAcamTZsavTZx4kRstsafCSdPnsw333zDTz/9xKRJk6ztn3zyCc8//zw//vgj+fn51NXVuR2Xn59Pjx49mr0urTVvvPEGr776KmvWrKGwsJD6+nrrdddAwJWn/9+IiAi6d+/u9v+7efNmiouLGTt2LFlZWc22pSUDBw4kMTGx0XbX76v4+HgAfvrpJ2w2G+PGjWu0/4QJE9rVDhH8JJgRQU876mO8kZyc3GhbeLjxY+L6B8OXpk2bxj333MPXX3/NnDlzrCHZZjADxh/HRx55hPz8fHJzcyksLGT8+PEeP+m3lbfXbhYEN/VH19xeVFTks7a1xZ133sldd92F3W5n//79PProozz11FNccMEFfPrpp1YQUlBQABhBjafCYJNrFsHUvXt3j/tmZmYCuBVPP/nkk/zud78jJSWFU089lezsbGJjY1FK8f7777NmzRqqq6tbvK5bbrmFv/3tb/To0YMZM2bQs2dPYmJiAKOYevfu3R6P8/T/C8b/sev/r/n/5qnuprWae09o/H2VmppqveaqqfsshEmCGSE62UknnURsbCzfffcdNTU1LFy4kOHDh7sNd50yZQoPP/wwixYtYteuXYBvu5haw8xqHDp0yOPr5mgm1+yHGTjU1dU1+mPl76DHZrPRu3dvnnzySQ4cOMDbb7/NM888w0033eTWzt///vetnnfo8OHDHreb98Y8d11dHXfddReZmZmsWrWqUSC4bNkyr94vLy+Pp556iuHDh7N06dJGwWxLI6+8YQYg/hrB15TExESOHj3q8XukqfsshElqZoToZJGRkUyYMIHKyko+/vhj1qxZ06gLZ8KECYSHh7Nw4cJW18uY9Qq+yiwde+yxAB5nFK6rq7PqRI477jhre0pKCgB79+5tdIynYcxgtNvX2bDHHnuMqKgo7rnnHkpKSgAYM2YMNpvNrb7FW0uWLMFutzfabt4b817l5+dTVFTEuHHjGgUyZWVlVtddS3bu3Indbue0005rFMjs27ePnTt3tvoaGhoyZAjJycmsXbuWAwcOtPt83jr22GOx2+0eh4ovWbKkw9ohApMEM0J0AWbwYnaLuHYxAcTHx3PiiSfyxRdfsGTJEmJjYznppJO8OndaWhqAzwpyf/GLX5Camsr8+fP5/vvv3V7729/+xq5du5g+fbpbvcyYMWMAePHFF932//rrr5vMJqSlpXHkyBEqKyt90m6A7Oxsrr76agoKCnjssccAozD3V7/6FT/++CP33nuvxwBqx44dVkbM1bZt23j22Wfdtn3wwQd88803DBgwwCqQzsjIIDY2lpUrV7p1V9XW1nLzzTeTn5/vVfvNofVLlixxa2dZWRlXX311oxqctggLC2P27NlUVlZy3XXXNer6qqmp4ciRI+1+n4YuvfRSAG6//XZqamqs7cXFxdx7770+fz8RXKSbSYh2eumll5pc9+jiiy/mtNNOa/EcZpZl3bp12Gw2t6JR05QpU3jggQcAmDFjRpOFnp6Os9ls3Hrrraxfv97Kktx+++1eHd9QfHw8L7/8Mueffz6TJk3i/PPPJzs7m5UrV/LFF1+QmZnJCy+84HbM5ZdfziOPPMKDDz7ImjVrOOaYY9i6dSuffvops2bN4p133mn0PtOmTWPFihWcfvrpnHLKKURFRTFq1CjOOuusNrXbdNtttzFv3jyeeOIJbrzxRtLT03nmmWfYtm0bd9xxB//85z+ZMGEC3bt358CBA2zatIkVK1Ywf/78RnPnnH766fzhD3/g008/ZdSoUdY8M9HR0bz88stW95rNZuOmm27ioYceYsSIEZx99tnU1NSwaNEijh49ypQpU1i0aFGLbc/MzOSiiy7izTffZPTo0Zx22mkUFxfz5ZdfEh0dzejRo1m9enW77g8Y9UY//PADH330EYMGDWLmzJkkJCSwd+9evvjiCx555BGfL4B56aWX8uabb/LZZ58xfPhwfv7zn1NbW8s777zDiSeeyJYtWzwWWwsByDwzInjRxDwznjQ3F0tT832Yc5M09++JJ57w6v3r6+t1SkqKBvTxxx/vcZ8vv/zSOu/DDz/scR+amIvjn//8px41apSOjo5udF/M69i1a1ej48w5ShrO2aK11suXL9e/+MUvdHp6uo6IiNC9e/fW1113nd6/f7/Htq1fv16fccYZOj4+XsfFxelJkybpxYsXNznPTFlZmb7uuut0z549dVhYmMf/A0+ammfG1S233KIBfcstt1jbqqur9dNPP61PPvlknZiYqCMjI3Xv3r311KlT9RNPPKHz8/M93pelS5fqadOm6YSEBB0fH69PPfVUvXz58kbvWVtbqx977DE9dOhQHR0drbt3764vueQSnZub6/H/oKnvu/Lycn3bbbfp/v3766ioKN2rVy89e/ZsnZ+f73E+n+b+D7Vuej6f2tpa/fTTT+sTTzxRx8XF6djYWD1gwAB99dVX623btjW6357mmWlqXpimvucqKyv1X//6V52Tk6MjIyN1nz599G233ab37dun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4mLGjRtHt27dUEqxcuVKjjvuOCIjI61AOBhIMBMAFi5cyIgRIzymS0866SQ+/PBDqxDu4osv5tVXX7WGZv/5z3+2IvJA01R62GazcfPNN/PKK6/whz/8gaysLC6//HKPKeYJEybw2muvMX78+IBOw2qtrW6jX/ziF+Tl5fHQQw8RGxvLhRdeGNCZiLYI5vvhzc97QUEBN954I//617/4+uuvGT58OOeffz7/+Mc/rH0nTpzI4cOH+ec//0ltbS0nn3wykydPDsgi8OjoaAYOHMgnn3zC4cOHqa+vJy0tjWnTpnHOOeeglOLWW29l/vz5PPvss5SUlJCcnMzQoUPdRmxmZmYyduxYHnzwQcrKyjj++OO56qqrOvHKvNOjRw8eeughFixYwBNPPEFZWRnJycmceOKJnH/++VZx71VXXcX8+fOZN28epaWlpKenM2vWLABSU1M5//zz+fe//81zzz3HKaecElRDs5UOxk70EBTsszu2VV5eHjfeeCMPPvgg/fr16+zmtNn9999PZmZmq+qjgpncj7a59957SU5O5sYbb+zspnQ4c56ZQJtjR3gncHOxQjSjrq6OoqIi3nzzTQYNGhSwgUxZWRkrV65k48aNAT3Rn6/I/fBedXU1H3/8MXv37mX//v0sWLCAdevWudXQCBEsArP/QYgWbNmyhbvvvpsePXpYk0UFoueee44dO3Ywc+ZMTjzxxM5uTqeT++E9pRQ//fQT7777LrW1tWRlZfGHP/zBY3GoEIFOupmEEEIIEdCkm0kIIYQQAU2CGSGEEEIENKmZ6WLee+89li9fzv79+4mMjGTQoEFccsklbpM61dTU8Prrr7N06VJqa2sZNWoUV111lTVXQm5uLu+//z5btmyhpKSEjIwMTj31VH72s59Z59i8eTNvvPEG+/fvp7q6mm7dujF9+nRmzpzZ0ZcshBBCtIsEM13Mxo0bmTFjBv3796e+vp758+dz33338fjjj1sTHL322musWrWKW265hdjYWObNm8djjz3GvffeC8DOnTtJSkrixhtvJC0tjS1btvCPf/wDm83G6aefDkBUVBQzZsygT58+REVFsXnzZl588UWio6OZPn16p12/EEII0VpSANzFlZSUcNVVV3HXXXdxzDHHUFFRwZVXXsnNN9/MSSedBBhrc/z+97/nvvvuc1to0tVLL73E/v37ufPO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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjAAAAHcCAYAAADIn5ALAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAACVw0lEQVR4nOzdd3hUVfrA8e+Z9B7SCAkkoYUiVem9qbi2xd7W7uracHfdXde2WFixl591FXuDde2uleZSBBVpUgMECCFAQgrpZc7vjzv3JpM6SSZlJu/neXgyc9ucewnhzXvec47SWmuEEEIIITyIraMbIIQQQgjRXBLACCGEEMLjSAAjhBBCCI8jAYwQQgghPI4EMEIIIYTwOBLACCGEEMLjSAAjhBBCCI8jAYwQQgghPI4EMEIIIYTwOBLACNHFKaWYNm1as8658sorUUqRnp7eJm1yt/T0dJRSXHnllW36OS15lu3t9ddfRynF66+/3tFNEaJVJIARogallNMfHx8fYmJimDFjBu+++26rr2/+x9/S/zz+85//oJTiwgsvrHf/Qw89hFKKwMBASktL6+zfu3cvSin69OnT6OfMmzcPpRTLly9vUTubw/wPteafgIAAkpOTufTSS9m4cWObt0EI4Xl8O7oBQnRG//jHPwCoqKhg+/btfPLJJyxbtoyffvqJJ554osPaNX36dGw2G8uXL0drjVLKaf+SJUtQSlFWVsaqVauYOXNmnf0As2bNsrZt27aN4ODgtm98E4YPH85vf/tbAAoKCli1ahXvvvsu//nPf1iyZAkTJ07s2AZ6iTlz5jBu3Dh69OjR0U0RolUkgBGiHvPmzXN6v2TJEk4++WSeeuopbr31VlJSUjqkXVFRUQwfPpxffvmFLVu2MHToUGtfWVkZq1evZs6cOXz88ccsXbq0TgCzdOlSAKftAwcObJ/GN2HEiBF1nvsNN9zASy+9xN13382yZcs6pmFeJiIigoiIiI5uhhCtJl1IQrhg5syZDBw4EK01P/74I+DczfLBBx8wZswYgoODiYqK4qKLLuLgwYNt1haoDkZMa9asoaSkhHPOOYcRI0bU2Q+wbNkylFLMmDHD2la7biMlJYX77rsPMDI+Nbt26vPSSy8xdOhQAgMD6d69O7///e/Jz89v7W0CcM011wBYz7ymyspKnn/+ecaNG0d4eDjBwcGMHDmSZ599Frvd3uA1t2/fzm9/+1uioqIICQlh0qRJfPPNN3WOy8/P59FHH2XGjBn07NkTf39/YmNjOeuss1izZo3L95CZmcn999/PxIkTiY+Px9/fn4SEBC655BK2bt1a5/ia9Trp6elcdNFFxMTEEBgYyKhRo/j8888b/KxFixYxc+ZMoqKiCAwMJCUlhYsvvpiffvrJOqahGpiUlBRSUlIoKiriL3/5C0lJSQQEBNCvXz8efvhhtNZ1Pk9rzdNPP83gwYMJDAwkMTGRm2++mfz8fOt6QrQVycAI4SLzB3jt/8iff/55Pv30U8466yymTp3K2rVrWbRoERs3bmTDhg0EBAS4tR0zZszgscceY8mSJcydO9fabnYPzZgxg19++YWnn36a48ePExYWBsCvv/5KVlYWw4YNIzY2tsHr33bbbXz88cesWLGCK664otH/hP7617/y9ddfc+aZZ3LKKaewbNkyXn75ZdLS0uoNoFrKz8/P6X1FRQVnnnkmX3/9NQMGDOCSSy4hMDCQZcuWccstt7B27VreeuutOtfZu3cv48ePZ+jQoVx//fUcOnSIRYsWcdppp/Huu+861RZt27aNu+66iylTpnD66afTrVs39u/fz6effsqXX37JZ599xuzZs5ts+/fff8+CBQuYPn065557LqGhoezatYsPPviATz/9lFWrVjF8+PA65+3bt48xY8bQp08ffve733Hs2DEWLVrE2WefzXfffcf06dOtY7XWXHXVVbzxxhvExMRwzjnnEBsbS0ZGBsuWLWPAgAGMGjWqybZWVFRw6qmnkpmZyWmnnYavry8ff/wxd9xxB6WlpVbXqummm27ihRdeICEhgd///vf4+/vz6aefsm7dOioqKur8vQnhVloIYQF0ff8svv32W62U0kopnZ6errXW+h//+IcGdFhYmN60aZPT8RdffLEG9KJFi5y2X3HFFRrQr732WovbWFhYqP38/HRERISurKy0tk+YMEEPGDBAa631559/rgH92WefWfufeeYZDeg//vGPde556tSpTtvMe1u2bFm9bTDvo1evXnrfvn3W9oqKCj158mQN6LVr17p0P6+99poG9BVXXFFn37XXXqsBfcYZZ9TbvptvvtnpGVRWVuqrr75aA/rjjz+2tu/du9f6u7399tudrvXjjz9qX19fHRkZqfPz863teXl5+ujRo3XadODAAd2jRw89cODAOvvqe5aHDx/WBQUFdY7dsGGDDgkJ0bNnz3baXrOt8+bNc9r31VdfaUCfdtppTttfeuklDejRo0frvLw8p32VlZU6MzPTem8+79rfg8nJyda1i4uLndofERGhIyIidHl5ubX9+++/14BOTU3Vubm51vaysjLreyA5ObnOfQvhLtKFJEQ95s2bx7x587jrrrs477zzmD17NlprbrvtNpKTk52OvfXWW51qUQCuu+46ANatW+f2toWEhDB27Fjy8/P5+eefASgsLOTHH3+0uoYmT56Mj4+PUxakvvqX1rr33ntJSkqy3vv6+nLVVVcBzb/3DRs2WM/9T3/6E6NHj+aVV14hISGBxx9/3DrObrfzf//3f8THx/Pkk0/i4+Nj7fPx8eHxxx9HKcU777xT5zMiIiK49957nbaNGjWKSy+9lLy8PD766COnY2NiYupco2fPnpx33nls376d/fv3N3lfcXFxVhaspuHDhzNjxgyWLVtGRUVFnf3JycncfffdTttOPfVUkpKS6jzb//u//wOM7rza9S0+Pj7NKth95plnCAoKcmr/2WefTX5+Pjt27LC2v/HGGwDcddddREZGWtv9/f156KGHXP48IVpKupCEqIdZA6KUIjIyksmTJ3PNNddw2WWX1Tm2vtR8r169AMjNzW2T9s2YMYOVK1eydOlSxowZw//+9z8qKiqsboXw8HBOOukkK2ix2+2sWLECX19fpkyZ4rZ2uPPeN27cWGfIdFJSEv/73/+cgqSdO3dy7Ngx+vfvz4MPPljvtYKCgti2bVud7SeeeGK9wcS0adN44403+OWXX7jiiius7atWreLpp59mzZo1HDlyhPLycqfzDh486NS2hnzxxRe8+OKL/PTTT2RnZ1NZWem0Pzs7u06QMWLECKfgzNSrVy+nGpyioiK2bNlC9+7dGTlyZJNtaUxERAT9+vWr9zPB+e/0l19+AWDSpEl1jh83bhy+vvLfi2hb8h0mRD10PQWLDan526fJ/OFdVVXlriY5mTlzJvfffz9LlizhjjvusIZP16yLmDZtGo8++ijZ2dmkp6eTm5vLxIkT6/0PvKXcee9XXHEFr7/+Olprjhw5wsKFC7n77rs588wzWbNmjTXUOycnB4Bdu3ZZgWZ9CgsL62zr3r17vcfGx8cDOBUff/TRR5x33nkEBgZy8skn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R/xn2pSXX36Zv/71r9b7sWPH8vLLL3dgizzfqFGj+OWXXwgPD+/opgghRJuTcZAe4pdffrFef/rppzz22GN8//331raIiIiOaFaLubLSqLuVl5fj7+/f7p/bXvz9/YmLi+voZnRpuug4ZB9BJfft6KYI4fUkA+Mh4uLirD9hYWEopaz3MTExvPjii5x00kn07t2bk08+mWXLllnnjhs3DoBTTz2VxMREzjvvPAA2bNjARRddxJAhQxg4cCDnnnsumzdvblH7rrvuOu666y7r/b333ktiYiJpaWmAETz069fPCrpqdiGdd955ZGRkMG/ePCujVNPy5cuZOnUq/fv359JLL+Xw4cMutcnsCnr66ac58cQTmTJlCgAHDx7k+uuvZ9CgQZxwwglcddVVHDhwoM75TzzxBEOHDmXAgAH87W9/c5osbtmyZfz2t7+1rnH55ZeTnp7eYFuqqqr485//zLhx4+jbty+TJ0/mlVdeqbe9L774IiNHjuSEE07gzjvvdJrjpaysjPnz5zNq1Ch69+7NxIkTeeedd4C6XUhmF1xjz6+yspJ77rnHuo/58+czd+7cVnehdVX2fz2K/cE/og/s7eimCOH1JIABtNbostKO+eOG5c9feeUVXnjhBe69916+/fZbpk2bxlVXXcWePXsA+OKLLwB4//33+eWXX6yumsLCQs4//3w+/vhjPvvsM3r37s3vfvc7CgsLm92G8ePHs2bNGuv9Dz/8QFRUFKtXrwZg48aNVFZWMnr06Drnvvzyy/To0YPbb7+dX375xSnbVFJSwosvvsgzzzzDhx9+yMGDB/nHP/7hcrtWrlzJ7t27ee+993jjjTeoqKjg0ksvJTQ0lA8//JCPP/6YkJAQLr30UqcAZeXKlezatYsPPviA5557ji+//JInnnjC2l9cXMzvf/97/vvf/7Jo0SJsNhvXXnstdru93nbY7XZ69OjBSy+9xLJly/jjH//IggUL+PTTT52OW716Nenp6fz73//mqaeeYvHixSxevNjaP3fuXD7++GMeeOABli9fzoIFCwgJCWnw/ut7fg888IC1/7nnnuPDDz/kiSee4JNPPuH48eN8/fXXLj9fUUu6EbDrg/s6uCFCeD/pQgIoL8N+8wUd8tG2ZxdDQGCrrvHSSy9xyy23cPbZZwNw1113sXr1al555RX++c9/Eh0dDRjdNjW7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uuR5dN1n0FXvuyFd9Xl40327ei9Ka63buC0doqKiAj8/v45uhhBCCCFaoKn/x722C6miooKnn36akpKSFp3/+OOPt+t5rTm3pKSEv/3tb3Kvbfi5HXGvrpzb2PPoiDbL90T7nduS+/bUe3VF7efhzfdaU2u+/zvrvZaUlPD0009TUVHR6HFeG8AArFq1ipYmmDIyMtr1vNacq7Vm7969cq9t+Lkdca+unNvY8+iINsv3RPud25L79tR7dUXt5+HN91pTa77/O+u9aq1ZtWpVk9fx6gCmNU499dR2Pa+157aG3GvbndfVzpXvCe8819Pa25pzPa29reHx96q9VFFRkT7//PN1UVFRRzelzcm9dl3yPLruM+iq992Qrvo8vPG+Xb0nr83A+Pn5cd5553WJQl65165LnkfXfQZd9b4b0lWfhzfet6v35LWjkIQQQgjhvbw2AyOEEEII7yUBjBBCCCE8jgQwQgghhPA4EsAIIbzSBRdcwLp16zq6GUKINuI9iyd4sZ07d3LPPfcwYsQI/v73v3d0c9zqueeeY8WKFcyaNYvf//73TvteeeUVvvnmG6ZOncpNN93UQS3sOM899xxFRUX89a9/7eimdApd5Xl487/3ligoKGDRokWsX7+e/Px8QkJCSElJ4dxzz2XgwIEd3bw2lZ2dzeLFi9m4cSMFBQV069aN0aNHc9555xEWFtbk+b/++iv33Xcfr732GiEhIe3Q4vYlAYwHWLp0KaeddhpLly7l2LFjREVFtfhadrsdAJut8yTfoqOjWb16NVdeeSX+/v4AlJeXs2rVKmJiYjq4dUK0L3f+e/cGjz/+OJWVldx00010796d/Px8Nm/eTGFhYUc3rU0dPnyYu+++mx49ejB37lzi4uI4cOAAb7/9Nhs2bGD+/PmEhoZ2dDM7lAQwnVxpaSmrV69mwYIF5OXlsXz5cs455xygOrq+4447ePfddzl06BApKSlcf/31JCUlAbB8+XJef/11br75Zt555x0OHTrEM888Q1xcXEfelpPevXtz+PBh1q5dy+TJkwFYt24dMTExxMbGWsdt2LCB//znPxw4cACbzUZqaipXXnkl8fHxANx333307NmTa665xjqnoKCA66+/njvvvJOhQ4e274250U033cRvfvMbTj/9dGvbX/7yF0aPHs0FF1wAGF0m119/PevXr2fjxo1ERUVx+eWXM2rUqI5qdptx5Xl4osb+vZv/ll9//XXr+HXr1vHYY4+xePFia9t//vMfvvzyS8rLy5kwYQJhYWFs2LCBRx99tL1vp9WKiorYtm0b8+bNY/DgwQDExsbSr18/p2PeeustfvzxRyorK+nTpw9XXHEFKSkpACxevJgff/yRU045hQ8//JDjx49z4okncsMNNxAcHNwRt+WShQsX4uvry9133239YhcTE0Pv3r255ZZbeO+997juuuuoqKhg0aJFrFq1ivz8fKKjo5kzZw5DhgzhvvvuA+Cqq64C8Lpsduf5NVzUa/Xq1SQmJpKQkMDkyZNZtmxZnTUv3nrrLS6//HIeeughwsLCePjhh6msrLT2l5WV8cknn3DDDTfwxBNPEBER0d630aTp06ezfPly6/2yZcuYNm2a0zGlpaWcccYZLFiwgHvvvRelFI899piVVZo5cyYrV650WgDs+++/JyoqiiFDhrTHbXS4Dz74gPHjx/PYY48xcuRInnnmGa//TdWbuPLvvTH/+9//+PDDD7n00ktZsGABMTExfPPNN23Y4rYVGBhIYGAg69ata3BhvyeeeIL8/HzuvPNOFixYQO/evXnggQecvu+zsrJYs2YNf/vb37jzzjtJT0/nlVdeaa/baLbCwkI2btzIKaecYgUvpsjISCZNmsTq1avRWvPss8+yatUqrrrqKp588kl+//vfExgYSExMDH/+858BeOqpp/jXv/5lBTLeQgKYTm7ZsmVWVmLEiBEUFxezdetWp2POP/98hg0bRlJSEjfffDP5+flOxYtVVVVcc801DBgwgISEBAICAtr1HlwxZcoUtm/fztGjRzl69Cjbt2+37ts0btw4xo4dS3x8PCkpKfzhD39g//791sJgY8aMAeDHH3+0zlmxYgXTpk1DKdV+N9OBpk6dyqRJk4iPj+fiiy+mtLSUtLS0jm6WcJEr/94b89VXXzFjxgymT59OQkIC5513npWN9UQ+Pj7ceOONrFixgiuvvJJ77rmHd999l3379gGwfft20tLS+NOf/kTfvn3p0aMHl19+OcHBwfzwww/WdSoqKrj55ptJSUlh8ODBXH311axatYq8vLwOurPGHTp0CK01iYmJ9e5PTEykqKiI3bt3s2bNGv7whz8wZswYunfvztChQ5kwYQI2m83qYoqIiCAyMrJTZ5xaQrqQOrHMzEzS0tK4/fbbAeMf84QJE1i6dCknnHCCdVxqaqr1OjQ0lISEBA4ePGht8/X1JTk5uf0a3gLh4eGMHDmS5cuXo7XmxBNPJDw83OmYQ4cOsWjRItLS0jh+/LiVecnOziYpKQl/f3+mTJnCsmXLmDBhAnv27GH//v1eX/RZU82/58DAQIKCgsjPz+/AFglXufrvvalrnHLKKU7b+vXrx5YtW9ze3vYybtw4TjzxRLZv387OnTvZsGEDn376KTfccAOlpaWUlpZy9dVXO51TXl5OVlaW9T4mJsaplig1NRWtNZmZmURGRrbXrbjdkSNHsNlsVvdaVyMBTCe2dOlSqqqquP76661tWmv8/Pyc6jya4u/v7xEZiBkzZrBw4UKAeu/v4YcfJjY2luuvv55u3bqhtebPf/6zU3fZzJkz+ctf/kJOTg7Lly9nyJAhTnU0nkopVacroaqqqs5xPj4+TZ7nDVx9Hp6kqX/v3njPrvL392fYsGEMGzaM8847jxdffJHFixdzyimn0K1bN+bNm1fnHE/ONsTHx6OUIiMjw8os13Tw4EFCQkLqdC91NRLAdFJVVVWsWLGCyy+/nGHDhjnte/TRR1m5cqWVXty5c6c1WqewsJBDhw41mHrszEaMGEFlZSVKKUaMGOG07/jx42RmZnL99dczaNAgwEgf15aUlETfvn1ZsmQJK1eurPObmacKDw93SncXFxdz5MiRjmtQB/O25+HKv/fY2Fgr4xAYGAhAenq607EJCQns3r2bqVOnWtt2797d5u1vbz179uTHH3+kT58+5OXlYbPZGh2YkJ2d7TSia+fOnSilSEhIaK8mN0tYWBjDhg3jm2++4YwzznAKVPLy8li5ciVTpkwhKSkJrTVbt26t830DRvYdqkefehsJYDqpn3/+maKiImbMmFHnN4mxY8eybNkyLrvsMsAYdRAWFkZERATvv/8+YWFh9UbtnZ3NZuPJJ5+0XtcUEhJCWFgY3333Hd26dSM7O5t33nmn3uvMmDGDV199lYCAAI98DvUZMmQIy5cv56STTiIkJIRFixZ1qqHw7c3bnocr/97vuusu/P39ee+99zjttNNIS0tzKnwHmD17Ni+99BJ9+vRhwIABrF69mn379tG9e/d2vBv3OX78OE888QTTp08nOTmZoKAgdu/ezSeffMKoUaMYOnQoqampPProo1x22WX06NGD3Nxc1q9fz5gxY+jbty9grG783HPP8bvf/Y6SkhJee+01xo8f36m7j66++mruvvtu5s+fz4UXXkhcXBwZGRm89dZbREVFcfHFFxMaGsrUqVN54YUXuOqqq0hJSeHo0aPk5+czYcIEYmNjUUrx888/c+KJJ+Lv728Fv95AAphOaunSpQwdOrTeNOi4ceP49NNPrUK2Sy65hNdff90aRv23v/3Nirw9TUNpX5vNxty5c3nttdf485//TEJCAldddVW9qeNJkybxxhtvMHHiRI9OsWqtrS6h3/72txw5coQFCxYQHBzMhRde6NEZh5bw5ufhyr/3nJwcbrnlFt5++22WLFnCkCFDOP/88/nXv/5lHTt58mQOHz7MW2+9RUVFBePHj2fatGkeW8gdGBhI//79+eKLLzh8+DBVVVVER0czc+ZMzjnnHJRS/P3vf+e9997j+eefp6CggMjISAYNGuQ02jI+Pp6xY8fy0EMPUVhYyEknncS1117bgXfWtB49erBgwQIWL17Mk08+SWFhIZGRkYwePZrzzz/fKtC99tpree+991i4cCHHjx8nJiaGOXPmABAVFcX555/Pu+++ywsvvMCUKVO8ahi10t7YQd5FePssiy115MgRbrnlFh566CH69OnT0c1psfnz5xMfH9+seidvJs+jZR544AEiIyO55ZZbOropHcKcB8YT58ERjfPcnKsQtVRWVpKXl8f7779PamqqxwYvhYWF/Pzzz2zdutWjJ99zF3kerisrK+Pzzz/nwIEDHDx4kMWLF7N582anmhghvIVn9jMIUY8dO3Zw33330aNHD2sCJ0/0wgsvsHv3bs444wxGjx7d0c3pcPI8XKeU4pdffuHDDz+koqKChIQE/vznP9db4CmEp5MuJCGEEEJ4HOlCEkIIIYTHkQBGCCGEEB5HamA6gY8++oh169Zx8OBB/P39SU1N5bLLLnOaZKm8vJw333yT1atXU1FRwfDhw7n22muteQzS09P5+OOP2bFjBwUFBcTFxXHyySfzm9/8xrrG9u3beeeddzh48CBlZWXExsYya9YszjjjjPa+ZSGEEKJVJIDpBLZu3cqpp55K3759qaqq4r333uPBBx/kiSeesCYdeuONN1i/fj1/+tOfCA4OZuHChTz++OM88MADAOzZs4eIiAhuueUWoqOj2bFjB//617+w2WzMnj0b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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "attribution_gb['booked_pnl'] = 0\n", - "attribution_gb['booked_delta'] = 0\n", - "for date in booked_quantity[booked_quantity == True].index:\n", - " profit = (attribution_gb.loc[:date, 'Total_PnL'].sum() * q_change.loc[date]) - (q_change.loc[date] * 1.3)\n", - " delta_pnl = (attribution_gb.loc[date, 'Delta_PnL'] * q_change.loc[date])\n", - " attribution_gb.loc[date, 'booked_pnl'] = profit\n", - " attribution_gb.loc[date, 'booked_delta'] = delta_pnl\n", - " print(f\"Q Change {q_change.loc[date]} PnL {profit} on {date}\")\n", - "attribution_gb['q2'] = quantity_edit\n", - "attribution_gb['Total_with_rebalancing'] = attribution_gb['Total_PnL'] * attribution_gb['q2'] + attribution_gb['booked_pnl']\n", - "attribution_gb['Delta_PnL With Rebalancing'] = attribution_gb['Delta_PnL'] * attribution_gb['q2'] + attribution_gb['booked_delta']\n", - "attribution_gb['Full_PnL_No_Rebalancing'] = attribution_gb['Total_PnL'] * quantity\n", - "(attribution_gb * quantity).cumsum().plot(y = 'Total_PnL', title = 'PnL Without Rebalancing')\n", - "plt.show()\n", - "(attribution_gb).cumsum().plot(y = 'Total_with_rebalancing', title = 'PnL With Rebalancing')\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "DatetimeIndex(['2023-05-05', '2023-07-13'], dtype='datetime64[ns]', name='Datetime', freq=None)" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "attribution_gb.loc[:date, 'Total_PnL'].sum()\n", - "booked_quantity[booked_quantity == True].index" - ] - }, - { - "cell_type": "code", - "execution_count": 88, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Delta_PnLGamma_PnLTheta_PnLVega_PnLVolga_PnLVanna_PnLRho_PnLTotal_PnLUnexplained_PnLActual_PnLPricebooked_pnlq2Total_2Total_with_rebalancingbooked_deltaDelta_PnL With RebalancingFull_PnL_No_Rebalancing
Datetime
2023-03-07-14.7531140.297119-0.439498-54.914301-2.6490642.6596051.019267-68.7799861.779986-67.0103.50.0000006.0-412.679918-412.6799180.000000-88.518685-412.679918
2023-03-08-8.9048250.391327-0.692666-16.490061-3.8223513.6816451.251030-24.5859022.585902-22.0252.00.00000012.0-147.515413-147.5154130.000000-53.428952-147.515413
2023-03-09-22.5495000.703345-1.079000-20.829510-4.0817083.9718520.976674-42.8878452.887845-40.0382.50.00000018.0-257.327073-257.3270730.000000-135.296998-257.327073
2023-03-10-33.9526570.964822-1.43323712.323753-3.1566372.6078750.659397-21.9866831.986683-20.0533.00.00000024.0-131.920098-131.9200980.000000-203.715940-131.920098
2023-03-13-22.0394551.197276-2.741113-8.359476-2.7894131.817216-0.443360-33.3583241.858324-31.5672.00.00000030.0-200.149942-200.1499420.000000-132.236731-200.149942
.........................................................
2023-10-20103.07560437.068684-136.617316-38.650988-8.9232721.6874116.309953-36.04992413.549924-22.546074.0412.768912791.0666.216021666.21602185.002548894.111410-216.299545
2023-10-23104.19299537.071110-139.687353-41.108390-8.9448561.6832456.268585-40.52466513.524665-27.046217.5412.768912795.0648.317056648.31705685.002548898.580974-243.147992
2023-10-24108.29799137.105410-140.730646-46.724939-8.9750421.6380876.355945-43.03319313.533193-29.546358.5412.768912799.0638.282944638.28294485.002548915.000960-258.199161
2023-10-2586.18597938.129024-141.782852-42.588697-9.0579671.4976016.397187-61.21972613.719726-47.546481.5412.768912803.0565.536813565.53681385.002548826.552909-367.318357
2023-10-2650.21836841.364673-142.791638-46.096071-9.6244792.2854556.318750-98.32494114.824941-83.546568.5412.768912807.0417.115953417.11595385.002548682.682467-589.949647
\n", - "

168 rows × 18 columns

\n", - "
" - ], - "text/plain": [ - " Delta_PnL Gamma_PnL Theta_PnL Vega_PnL Volga_PnL \\\n", - "Datetime \n", - "2023-03-07 -14.753114 0.297119 -0.439498 -54.914301 -2.649064 \n", - "2023-03-08 -8.904825 0.391327 -0.692666 -16.490061 -3.822351 \n", - "2023-03-09 -22.549500 0.703345 -1.079000 -20.829510 -4.081708 \n", - "2023-03-10 -33.952657 0.964822 -1.433237 12.323753 -3.156637 \n", - "2023-03-13 -22.039455 1.197276 -2.741113 -8.359476 -2.789413 \n", - "... ... ... ... ... ... \n", - "2023-10-20 103.075604 37.068684 -136.617316 -38.650988 -8.923272 \n", - "2023-10-23 104.192995 37.071110 -139.687353 -41.108390 -8.944856 \n", - "2023-10-24 108.297991 37.105410 -140.730646 -46.724939 -8.975042 \n", - "2023-10-25 86.185979 38.129024 -141.782852 -42.588697 -9.057967 \n", - "2023-10-26 50.218368 41.364673 -142.791638 -46.096071 -9.624479 \n", - "\n", - " Vanna_PnL Rho_PnL Total_PnL Unexplained_PnL Actual_PnL \\\n", - "Datetime \n", - "2023-03-07 2.659605 1.019267 -68.779986 1.779986 -67.0 \n", - "2023-03-08 3.681645 1.251030 -24.585902 2.585902 -22.0 \n", - "2023-03-09 3.971852 0.976674 -42.887845 2.887845 -40.0 \n", - "2023-03-10 2.607875 0.659397 -21.986683 1.986683 -20.0 \n", - "2023-03-13 1.817216 -0.443360 -33.358324 1.858324 -31.5 \n", - "... ... ... ... ... ... \n", - "2023-10-20 1.687411 6.309953 -36.049924 13.549924 -22.5 \n", - "2023-10-23 1.683245 6.268585 -40.524665 13.524665 -27.0 \n", - "2023-10-24 1.638087 6.355945 -43.033193 13.533193 -29.5 \n", - "2023-10-25 1.497601 6.397187 -61.219726 13.719726 -47.5 \n", - "2023-10-26 2.285455 6.318750 -98.324941 14.824941 -83.5 \n", - "\n", - " Price booked_pnl q2 Total_2 Total_with_rebalancing \\\n", - "Datetime \n", - "2023-03-07 103.5 0.000000 6.0 -412.679918 -412.679918 \n", - "2023-03-08 252.0 0.000000 12.0 -147.515413 -147.515413 \n", - "2023-03-09 382.5 0.000000 18.0 -257.327073 -257.327073 \n", - "2023-03-10 533.0 0.000000 24.0 -131.920098 -131.920098 \n", - "2023-03-13 672.0 0.000000 30.0 -200.149942 -200.149942 \n", - "... ... ... ... ... ... \n", - "2023-10-20 46074.0 412.768912 791.0 666.216021 666.216021 \n", - "2023-10-23 46217.5 412.768912 795.0 648.317056 648.317056 \n", - "2023-10-24 46358.5 412.768912 799.0 638.282944 638.282944 \n", - "2023-10-25 46481.5 412.768912 803.0 565.536813 565.536813 \n", - "2023-10-26 46568.5 412.768912 807.0 417.115953 417.115953 \n", - "\n", - " booked_delta Delta_PnL With Rebalancing Full_PnL_No_Rebalancing \n", - "Datetime \n", - "2023-03-07 0.000000 -88.518685 -412.679918 \n", - "2023-03-08 0.000000 -53.428952 -147.515413 \n", - "2023-03-09 0.000000 -135.296998 -257.327073 \n", - "2023-03-10 0.000000 -203.715940 -131.920098 \n", - "2023-03-13 0.000000 -132.236731 -200.149942 \n", - "... ... ... ... \n", - "2023-10-20 85.002548 894.111410 -216.299545 \n", - "2023-10-23 85.002548 898.580974 -243.147992 \n", - "2023-10-24 85.002548 915.000960 -258.199161 \n", - "2023-10-25 85.002548 826.552909 -367.318357 \n", - "2023-10-26 85.002548 682.682467 -589.949647 \n", - "\n", - "[168 rows x 18 columns]" - ] - }, - "execution_count": 88, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "attribution_gb.iloc[1:].cumsum()" - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(0.29248067766744823, -0.3235194964137267)" - ] - }, - "execution_count": 58, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "attribution_gb.cumsum().Total_2[-1]/cash_for_tick, ((attribution_gb.iloc[1:].cumsum().Total_PnL[-1] * 6) - (75 - 15.6))/cash_for_tick " - ] - }, - { - "cell_type": "code", - "execution_count": 89, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.3401266005524835" - ] - }, - "execution_count": 89, - "metadata": {}, - "output_type": "execute_result" - }, - { - "ename": "", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[1;31mThe Kernel crashed while executing code in the current cell or a previous cell. \n", - "\u001b[1;31mPlease review the code in the cell(s) to identify a possible cause of the failure. \n", - "\u001b[1;31mClick here for more info. \n", - "\u001b[1;31mView Jupyter log for further details." - ] - } - ], - "source": [ - "682.682467/cash_for_tick" - ] - }, - { - "cell_type": "code", - "execution_count": 54, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "-420.0152772541693" - ] - }, - "execution_count": 54, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "(attribution_gb.cumsum().Total_PnL[-1] * 6)" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
signal_iddatetimesymboldirectioncash_beforecash_after
0AAPL20230203LONG2023-02-03AAPLBUY2007.142240248.564847
1AAPL20230203LONG2023-02-27AAPLSELL248.5648471323.812817
2AAPL20230306LONG2023-03-06AAPLBUY1323.812817238.663452
3AAPL20230306LONG2023-10-26AAPLSELL238.663452732.458945
4AAPL20231103LONG2023-11-03AAPLBUY732.458945157.041327
5AAPL20231103LONG2023-12-29AAPLSELL157.041327971.818869
\n", - "
" - ], - "text/plain": [ - " signal_id datetime symbol direction cash_before cash_after\n", - "0 AAPL20230203LONG 2023-02-03 AAPL BUY 2007.142240 248.564847\n", - "1 AAPL20230203LONG 2023-02-27 AAPL SELL 248.564847 1323.812817\n", - "2 AAPL20230306LONG 2023-03-06 AAPL BUY 1323.812817 238.663452\n", - "3 AAPL20230306LONG 2023-10-26 AAPL SELL 238.663452 732.458945\n", - "4 AAPL20231103LONG 2023-11-03 AAPL BUY 732.458945 157.041327\n", - "5 AAPL20231103LONG 2023-12-29 AAPL SELL 157.041327 971.818869" - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "transactions" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "pnl_calc_delta = attribution_gb['Delta_PnL']\n", - "\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "('META20220916C380', 'META20220916C385')" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "long, short " - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "http://127.0.0.1:25510/v2/hist/option/eod?end_date=20240115&root=COST&use_csv=true&exp=20240621&right=C&start_date=20230703&strike=560000\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
OpenHighLowCloseVolumeBid_sizeCloseBidAsk_sizeCloseAskMidpointWeighted_midpoint
Datetime
2023-07-0343.2343.2343.2343.2314842.101045.1543.62542.625862
2023-07-0343.2343.2343.2343.2314842.101045.1543.62542.625862
2023-07-0543.2543.3243.2543.3221643.551044.9544.25044.088462
2023-07-0543.2543.3243.2543.3221643.551044.9544.25044.088462
2023-07-0642.0043.9042.0043.9041542.301544.4043.35043.350000
....................................
2024-01-080.000.000.000.00016118.257120.70119.475118.995652
2024-01-090.000.000.000.00021121.7531124.90123.325123.627885
2024-01-100.000.000.000.0006125.207132.05128.625128.888462
2024-01-110.000.000.000.0006125.606132.35128.975128.975000
2024-01-120.000.000.000.0006134.9017141.35138.125139.667391
\n", - "

257 rows × 11 columns

\n", - "
" - ], - "text/plain": [ - " Open High Low Close Volume Bid_size CloseBid Ask_size \\\n", - "Datetime \n", - "2023-07-03 43.23 43.23 43.23 43.23 1 48 42.10 10 \n", - "2023-07-03 43.23 43.23 43.23 43.23 1 48 42.10 10 \n", - "2023-07-05 43.25 43.32 43.25 43.32 2 16 43.55 10 \n", - "2023-07-05 43.25 43.32 43.25 43.32 2 16 43.55 10 \n", - "2023-07-06 42.00 43.90 42.00 43.90 4 15 42.30 15 \n", - "... ... ... ... ... ... ... ... ... \n", - "2024-01-08 0.00 0.00 0.00 0.00 0 16 118.25 7 \n", - "2024-01-09 0.00 0.00 0.00 0.00 0 21 121.75 31 \n", - "2024-01-10 0.00 0.00 0.00 0.00 0 6 125.20 7 \n", - "2024-01-11 0.00 0.00 0.00 0.00 0 6 125.60 6 \n", - "2024-01-12 0.00 0.00 0.00 0.00 0 6 134.90 17 \n", - "\n", - " CloseAsk Midpoint Weighted_midpoint \n", - "Datetime \n", - "2023-07-03 45.15 43.625 42.625862 \n", - "2023-07-03 45.15 43.625 42.625862 \n", - "2023-07-05 44.95 44.250 44.088462 \n", - "2023-07-05 44.95 44.250 44.088462 \n", - "2023-07-06 44.40 43.350 43.350000 \n", - "... ... ... ... \n", - "2024-01-08 120.70 119.475 118.995652 \n", - "2024-01-09 124.90 123.325 123.627885 \n", - "2024-01-10 132.05 128.625 128.888462 \n", - "2024-01-11 132.35 128.975 128.975000 \n", - "2024-01-12 141.35 138.125 139.667391 \n", - "\n", - "[257 rows x 11 columns]" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# COST20240621C550\n", - "retrieve_eod_ohlc('COST',\n", - " '2024-01-15',\n", - " '2024-06-21',\n", - " 'C',\n", - " '2023-07-03',\n", - " 560.0,\n", - " print_url=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "-0.3666666666666666" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "(1.235/1.950)-1" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
longshorttrade_idclosequantitymarket_value
datetimesymbol
2021-01-05AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.82581460.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.27561365.0
AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.82581460.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.27561365.0
2021-01-06AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.62581300.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.35061410.0
AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.62581300.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.35061410.0
2021-01-07AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.87581500.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.62561575.0
AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.87581500.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.62561575.0
2021-01-08AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.95081560.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9303.07561845.0
AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.95081560.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9303.07561845.0
2021-01-11AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.80081440.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.65061590.0
AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.80081440.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.65061590.0
2021-01-12AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.75081400.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.85061710.0
AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.75081400.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.85061710.0
2021-01-13AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.85081480.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.92561755.0
AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.85081480.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.92561755.0
2021-01-14AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1752.30081840.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.82561695.0
AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1752.30081840.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.82561695.0
2021-01-15AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.57581260.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.87561725.0
AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.57581260.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.87561725.0
2021-01-18AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.60081280.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.97561785.0
AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.60081280.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.97561785.0
2021-01-19AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.60081280.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.97561785.0
AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.60081280.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.97561785.0
2021-01-20AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.92581540.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9303.00061800.0
AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.92581540.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9303.00061800.0
2021-01-21AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1752.22581780.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9303.25061950.0
AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1752.22581780.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9303.25061950.0
2021-01-22AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.87581500.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9303.00061800.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6603.1503945.0
AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.87581500.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9303.00061800.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6603.1503945.0
2021-01-25AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1752.70082160.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9303.10061860.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.8253847.5
AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1752.70082160.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9303.10061860.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.8253847.5
2021-01-26AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1752.67582140.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.82561695.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.9003870.0
AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1752.67582140.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.82561695.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.9003870.0
2021-01-27AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1753.05082440.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.97561785.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.3003690.0
AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1753.05082440.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.97561785.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.3003690.0
2021-01-28AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1752.02581620.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.80061680.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.6253787.5
AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1752.02581620.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.80061680.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.6253787.5
2021-01-29AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1752.12581700.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.60061560.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.5253757.5
AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1752.12581700.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.60061560.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.5253757.5
2021-02-01AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1752.05081640.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.77561665.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.6503795.0
AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1752.05081640.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.77561665.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.6503795.0
2021-02-02AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1752.27581820.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9303.10061860.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.8753862.5
AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1752.27581820.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9303.10061860.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.8753862.5
2021-02-03AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.97581580.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9303.00061800.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.5503765.0
AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.97581580.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9303.00061800.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.5503765.0
2021-02-04AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1752.20081760.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9303.05061830.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.5753772.5
AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1752.20081760.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9303.05061830.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.5753772.5
2021-02-05AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1752.15081720.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9303.10061860.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.7003810.0
AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1752.15081720.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9303.10061860.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.7003810.0
2021-02-08AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1752.17581740.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.97561785.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6604.17531252.5
AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1752.17581740.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.97561785.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6604.17531252.5
2021-02-09AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1752.07581660.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9303.15061890.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.9253877.5
AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1752.07581660.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9303.15061890.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.9253877.5
2021-02-10AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1752.02581620.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.97561785.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.9003870.0
AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1752.02581620.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.97561785.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.9003870.0
2021-02-11AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.92581540.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.95061770.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.8253847.5
AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.92581540.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.95061770.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.8253847.5
2021-02-12AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.97581580.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.95061770.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.9253877.5
AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.97581580.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.95061770.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.9253877.5
2021-02-15AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.87581500.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.70061620.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.8753862.5
AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.87581500.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.70061620.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.8753862.5
2021-02-16AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.87581500.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.70061620.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.8753862.5
AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.87581500.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.70061620.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.8753862.5
2021-02-17AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.70081360.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.92561755.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.7753832.5
AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.70081360.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.92561755.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.7753832.5
2021-02-18AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.55081240.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.85061710.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.7753832.5
NVDA[NVDA20220121C740][NVDA20220121C760]&L:NVDA20220121C740&S:NVDA20220121C7604.42583540.0
AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.55081240.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.85061710.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.7753832.5
NVDA[NVDA20220121C740][NVDA20220121C760]&L:NVDA20220121C740&S:NVDA20220121C7604.42583540.0
2021-02-19AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.60081280.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.80061680.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.3753712.5
NVDA[NVDA20220121C740][NVDA20220121C760]&L:NVDA20220121C740&S:NVDA20220121C7604.62583700.0
AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.60081280.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.80061680.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.3753712.5
NVDA[NVDA20220121C740][NVDA20220121C760]&L:NVDA20220121C740&S:NVDA20220121C7604.62583700.0
2021-02-22AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.60081280.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.55061530.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.8003840.0
NVDA[NVDA20220121C740][NVDA20220121C760]&L:NVDA20220121C740&S:NVDA20220121C7604.10083280.0
AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.60081280.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.55061530.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.8003840.0
NVDA[NVDA20220121C740][NVDA20220121C760]&L:NVDA20220121C740&S:NVDA20220121C7604.10083280.0
2021-02-23AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.37581100.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.12561275.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.8003840.0
NVDA[NVDA20220121C740][NVDA20220121C760]&L:NVDA20220121C740&S:NVDA20220121C7604.00083200.0
AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.37581100.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.12561275.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.8003840.0
NVDA[NVDA20220121C740][NVDA20220121C760]&L:NVDA20220121C740&S:NVDA20220121C7604.00083200.0
2021-02-24AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.42581140.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.60061560.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.5003750.0
NVDA[NVDA20220121C740][NVDA20220121C760]&L:NVDA20220121C740&S:NVDA20220121C7605.00084000.0
AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.42581140.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.60061560.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.5003750.0
NVDA[NVDA20220121C740][NVDA20220121C760]&L:NVDA20220121C740&S:NVDA20220121C7605.00084000.0
2021-02-25AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.1508920.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.02561215.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.7003810.0
NVDA[NVDA20220121C740][NVDA20220121C760]&L:NVDA20220121C740&S:NVDA20220121C7603.27582620.0
AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.1508920.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.02561215.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.7003810.0
NVDA[NVDA20220121C740][NVDA20220121C760]&L:NVDA20220121C740&S:NVDA20220121C7603.27582620.0
2021-02-26AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1750.9008720.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.62561575.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.5003750.0
NVDA[NVDA20220121C740][NVDA20220121C760]&L:NVDA20220121C740&S:NVDA20220121C7604.45083560.0
AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1750.9008720.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.62561575.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.5003750.0
NVDA[NVDA20220121C740][NVDA20220121C760]&L:NVDA20220121C740&S:NVDA20220121C7604.45083560.0
2021-03-01AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.42581140.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.35061410.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6603.2753982.5
NVDA[NVDA20220121C740][NVDA20220121C760]&L:NVDA20220121C740&S:NVDA20220121C7603.62582900.0
AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.42581140.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.35061410.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6603.2753982.5
NVDA[NVDA20220121C740][NVDA20220121C760]&L:NVDA20220121C740&S:NVDA20220121C7603.62582900.0
2021-03-02AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.27581020.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.27561365.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.8253847.5
NVDA[NVDA20220121C740][NVDA20220121C760]&L:NVDA20220121C740&S:NVDA20220121C7603.02582420.0
AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.27581020.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.27561365.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.8253847.5
NVDA[NVDA20220121C740][NVDA20220121C760]&L:NVDA20220121C740&S:NVDA20220121C7603.02582420.0
2021-03-03AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.0758860.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9301.95061170.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.4753742.5
NVDA[NVDA20220121C740][NVDA20220121C760]&L:NVDA20220121C740&S:NVDA20220121C7602.35081880.0
AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1751.0758860.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9301.95061170.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.4753742.5
NVDA[NVDA20220121C740][NVDA20220121C760]&L:NVDA20220121C740&S:NVDA20220121C7602.35081880.0
2021-03-04AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1750.9508760.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9301.72561035.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6601.9003570.0
NVDA[NVDA20220121C740][NVDA20220121C760]&L:NVDA20220121C740&S:NVDA20220121C7602.37581900.0
AAPL[AAPL20220121C165][AAPL20220121C175]&L:AAPL20220121C165&S:AAPL20220121C1750.9508760.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9301.72561035.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6601.9003570.0
NVDA[NVDA20220121C740][NVDA20220121C760]&L:NVDA20220121C740&S:NVDA20220121C7602.37581900.0
2021-03-05TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9301.5006900.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.3503705.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9301.5006900.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.3503705.0
2021-03-08TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9301.2256735.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.3753712.5
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9301.2256735.0
NFLX[NFLX20220121C650][NFLX20220121C660]&L:NFLX20220121C650&S:NFLX20220121C6602.3753712.5
2021-03-09TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.05061230.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.05061230.0
2021-03-10TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.05061230.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.05061230.0
2021-03-11TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.25061350.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3351.9755987.5
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.25061350.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3351.9755987.5
2021-03-12TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.20061320.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7003.47551737.5
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3352.52551262.5
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.20061320.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7003.47551737.5
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3352.52551262.5
2021-03-15TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.30061380.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7003.42551712.5
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3352.30051150.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.30061380.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7003.42551712.5
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3352.30051150.0
2021-03-16AAPL[AAPL20220121C160][AAPL20220121C175]&L:AAPL20220121C160&S:AAPL20220121C1752.0004800.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.12561275.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7004.22552112.5
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3352.07551037.5
AAPL[AAPL20220121C160][AAPL20220121C175]&L:AAPL20220121C160&S:AAPL20220121C1752.0004800.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.12561275.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7004.22552112.5
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3352.07551037.5
2021-03-17AAPL[AAPL20220121C160][AAPL20220121C175]&L:AAPL20220121C160&S:AAPL20220121C1751.9504780.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.30061380.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7003.45051725.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3352.30051150.0
AAPL[AAPL20220121C160][AAPL20220121C175]&L:AAPL20220121C160&S:AAPL20220121C1751.9504780.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.30061380.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7003.45051725.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3352.30051150.0
2021-03-18AAPL[AAPL20220121C160][AAPL20220121C175]&L:AAPL20220121C160&S:AAPL20220121C1751.6504660.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.00061200.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7003.07551537.5
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3352.10051050.0
AAPL[AAPL20220121C160][AAPL20220121C175]&L:AAPL20220121C160&S:AAPL20220121C1751.6504660.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.00061200.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7003.07551537.5
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3352.10051050.0
2021-03-19TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.00061200.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7004.20052100.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3352.02551012.5
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.00061200.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7004.20052100.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3352.02551012.5
2021-03-22TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.07561245.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7003.57551787.5
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3351.7755887.5
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.07561245.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7003.57551787.5
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3351.7755887.5
2021-03-23AAPL[AAPL20220121C145][AAPL20220121C155]&L:AAPL20220121C145&S:AAPL20220121C1551.9003570.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.05061230.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7003.35051675.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3351.5755787.5
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.9752395.0
AAPL[AAPL20220121C145][AAPL20220121C155]&L:AAPL20220121C145&S:AAPL20220121C1551.9003570.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.05061230.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7003.35051675.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3351.5755787.5
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.9752395.0
2021-03-24AAPL[AAPL20220121C145][AAPL20220121C155]&L:AAPL20220121C145&S:AAPL20220121C1551.6753502.5
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9301.77561065.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7002.95051475.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3351.4505725.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.3502270.0
AAPL[AAPL20220121C145][AAPL20220121C155]&L:AAPL20220121C145&S:AAPL20220121C1551.6753502.5
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9301.77561065.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7002.95051475.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3351.4505725.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.3502270.0
2021-03-25TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9301.80061080.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3351.6505825.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.3002260.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9301.80061080.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3351.6505825.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.3002260.0
2021-03-26TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9301.6256975.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3351.6505825.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.3752275.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9301.6256975.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3351.6505825.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.3752275.0
2021-03-29TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9301.5756945.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3351.8005900.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.5752315.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9301.5756945.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3351.8005900.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.5752315.0
2021-03-30TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9301.70061020.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7003.42541370.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3351.9505975.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.5002300.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9301.70061020.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7003.42541370.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3351.9505975.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.5002300.0
2021-03-31TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.05061230.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7003.55041420.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3351.6755837.5
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.0002200.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.05061230.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7003.55041420.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3351.6755837.5
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.0002200.0
2021-04-01TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.00061200.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7004.12541650.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3351.5005750.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.8252365.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.00061200.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7004.12541650.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3351.5005750.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.8252365.0
2021-04-02TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.00061200.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7004.12541650.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3351.5005750.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.8252365.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.00061200.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7004.12541650.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3351.5005750.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.8252365.0
2021-04-05TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.10061260.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7004.22541690.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3352.80051400.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.9252385.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.10061260.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7004.22541690.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3352.80051400.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.9252385.0
2021-04-06AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1801.9253577.5
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.20061320.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7004.17541670.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3351.8005900.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.8502370.0
AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1801.9253577.5
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.20061320.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7004.17541670.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3351.8005900.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.8502370.0
2021-04-07AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1802.0753622.5
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.12561275.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7004.00041600.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3351.3755687.5
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.9252385.0
AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1802.0753622.5
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.12561275.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7004.00041600.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3351.3755687.5
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.9252385.0
2021-04-08AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1802.3503705.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.15061290.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7004.70041880.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3351.5255762.5
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.0002400.0
AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1802.3503705.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.15061290.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7004.70041880.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3351.5255762.5
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.0002400.0
2021-04-09AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1802.5753772.5
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9301.97561185.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7004.90041960.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3351.7505875.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.9502390.0
AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1802.5753772.5
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9301.97561185.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7004.90041960.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3351.7505875.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.9502390.0
2021-04-12AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1802.5003750.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.22561335.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7006.07542430.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3351.5505775.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.3752275.0
AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1802.5003750.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.22561335.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7006.07542430.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3351.5505775.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.3752275.0
2021-04-13AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1802.7753832.5
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.70061620.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7007.45042980.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3351.0255512.5
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.8752375.0
AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1802.7753832.5
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.70061620.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7007.45042980.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3351.0255512.5
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.8752375.0
2021-04-14AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1802.6253787.5
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.70061620.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7005.00042000.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3352.12551062.5
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.1252425.0
AMZN[AMZN20220121C4350][AMZN20220121C4400]&L:AMZN20220121C4350&S:AMZN20220121C44005.62521125.0
AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1802.6253787.5
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.70061620.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7005.00042000.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3352.12551062.5
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.1252425.0
AMZN[AMZN20220121C4350][AMZN20220121C4400]&L:AMZN20220121C4350&S:AMZN20220121C44005.62521125.0
2021-04-15AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1802.8253847.5
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.52561515.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7007.32542930.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3351.3755687.5
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.4002280.0
AMZN[AMZN20220121C4350][AMZN20220121C4400]&L:AMZN20220121C4350&S:AMZN20220121C44006.52521305.0
AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1802.8253847.5
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.52561515.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7007.32542930.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3351.3755687.5
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.4002280.0
AMZN[AMZN20220121C4350][AMZN20220121C4400]&L:AMZN20220121C4350&S:AMZN20220121C44006.52521305.0
2021-04-16AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1802.7753832.5
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.57561545.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7006.65042660.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3351.5755787.5
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.7252345.0
AMZN[AMZN20220121C4350][AMZN20220121C4400]&L:AMZN20220121C4350&S:AMZN20220121C44006.70021340.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.4504580.0
AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1802.7753832.5
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.57561545.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7006.65042660.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3351.5755787.5
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.7252345.0
AMZN[AMZN20220121C4350][AMZN20220121C4400]&L:AMZN20220121C4350&S:AMZN20220121C44006.70021340.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.4504580.0
2021-04-19AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1802.7753832.5
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.32561395.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7006.22542490.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3352.45051225.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.6252325.0
AMZN[AMZN20220121C4350][AMZN20220121C4400]&L:AMZN20220121C4350&S:AMZN20220121C44006.47521295.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.7004680.0
AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1802.7753832.5
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.32561395.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7006.22542490.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3352.45051225.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.6252325.0
AMZN[AMZN20220121C4350][AMZN20220121C4400]&L:AMZN20220121C4350&S:AMZN20220121C44006.47521295.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.7004680.0
2021-04-20AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1802.6003780.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.27561365.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7006.02542410.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3350.8005400.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.7002340.0
AMZN[AMZN20220121C4350][AMZN20220121C4400]&L:AMZN20220121C4350&S:AMZN20220121C44005.37521075.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.5504620.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.6354654.0
AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1802.6003780.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.27561365.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7006.02542410.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3350.8005400.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.7002340.0
AMZN[AMZN20220121C4350][AMZN20220121C4400]&L:AMZN20220121C4350&S:AMZN20220121C44005.37521075.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.5504620.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.6354654.0
2021-04-21AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1802.5753772.5
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.42561455.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7006.25042500.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3350.8255412.5
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.7502350.0
AMZN[AMZN20220121C4350][AMZN20220121C4400]&L:AMZN20220121C4350&S:AMZN20220121C44005.95021190.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.9254770.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.7404696.0
AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1802.5753772.5
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.42561455.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7006.25042500.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3350.8255412.5
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.7502350.0
AMZN[AMZN20220121C4350][AMZN20220121C4400]&L:AMZN20220121C4350&S:AMZN20220121C44005.95021190.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.9254770.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.7404696.0
2021-04-22AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1802.4503735.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.45061470.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7005.60042240.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3351.1755587.5
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.6252325.0
AMZN[AMZN20220121C4350][AMZN20220121C4400]&L:AMZN20220121C4350&S:AMZN20220121C44005.32521065.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.5754630.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.8554742.0
AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1802.4503735.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.45061470.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7005.60042240.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3351.1755587.5
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.6252325.0
AMZN[AMZN20220121C4350][AMZN20220121C4400]&L:AMZN20220121C4350&S:AMZN20220121C44005.32521065.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.5754630.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.8554742.0
2021-04-23AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1802.5753772.5
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.87561725.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7006.20042480.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3351.3755687.5
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.7002340.0
AMZN[AMZN20220121C4350][AMZN20220121C4400]&L:AMZN20220121C4350&S:AMZN20220121C44005.65021130.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.4754590.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1602.0504820.0
AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1802.5753772.5
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.87561725.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7006.20042480.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3351.3755687.5
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.7002340.0
AMZN[AMZN20220121C4350][AMZN20220121C4400]&L:AMZN20220121C4350&S:AMZN20220121C44005.65021130.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.4754590.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1602.0504820.0
2021-04-26AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1802.5753772.5
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.57561545.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7006.70042680.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3350.8755437.5
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.8252365.0
AMZN[AMZN20220121C4350][AMZN20220121C4400]&L:AMZN20220121C4350&S:AMZN20220121C44006.80021360.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4402.1004840.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.8404736.0
AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1802.5753772.5
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.57561545.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7006.70042680.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3350.8755437.5
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.8252365.0
AMZN[AMZN20220121C4350][AMZN20220121C4400]&L:AMZN20220121C4350&S:AMZN20220121C44006.80021360.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4402.1004840.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.8404736.0
2021-04-27AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1802.5753772.5
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.30061380.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7006.15042460.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3350.7255362.5
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.7752355.0
AMZN[AMZN20220121C4350][AMZN20220121C4400]&L:AMZN20220121C4350&S:AMZN20220121C44007.00021400.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.2504500.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.8054722.0
AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1802.5753772.5
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.30061380.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7006.15042460.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3350.7255362.5
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.7752355.0
AMZN[AMZN20220121C4350][AMZN20220121C4400]&L:AMZN20220121C4350&S:AMZN20220121C44007.00021400.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.2504500.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.8054722.0
2021-04-28AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1800.7753232.5
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.20061320.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7006.12542450.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3351.5755787.5
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.0752415.0
AMZN[AMZN20220121C4350][AMZN20220121C4400]&L:AMZN20220121C4350&S:AMZN20220121C44007.15021430.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4402.0754830.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.2704508.0
AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1800.7753232.5
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.20061320.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7006.12542450.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3351.5755787.5
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.0752415.0
AMZN[AMZN20220121C4350][AMZN20220121C4400]&L:AMZN20220121C4350&S:AMZN20220121C44007.15021430.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4402.0754830.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.2704508.0
2021-04-29AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1802.3753712.5
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.27561365.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7006.30042520.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3351.1755587.5
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.8502570.0
AMZN[AMZN20220121C4350][AMZN20220121C4400]&L:AMZN20220121C4350&S:AMZN20220121C44008.00021600.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.8504740.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.4154566.0
AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1802.3753712.5
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.27561365.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7006.30042520.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3351.1755587.5
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.8502570.0
AMZN[AMZN20220121C4350][AMZN20220121C4400]&L:AMZN20220121C4350&S:AMZN20220121C44008.00021600.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.8504740.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.4154566.0
2021-04-30AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1802.2753682.5
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.27561365.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7008.12543250.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3350.6755337.5
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.3252465.0
AMZN[AMZN20220121C4350][AMZN20220121C4400]&L:AMZN20220121C4350&S:AMZN20220121C44007.20021440.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.6254650.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.6554662.0
AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1802.2753682.5
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.27561365.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7008.12543250.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3350.6755337.5
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.3252465.0
AMZN[AMZN20220121C4350][AMZN20220121C4400]&L:AMZN20220121C4350&S:AMZN20220121C44007.20021440.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.6254650.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.6554662.0
2021-05-03AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1802.2753682.5
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9301.97561185.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7005.30042120.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3350.3505175.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.1002420.0
AMZN[AMZN20220121C4350][AMZN20220121C4400]&L:AMZN20220121C4350&S:AMZN20220121C44005.80021160.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.4504580.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.5904636.0
AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1802.2753682.5
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9301.97561185.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7005.30042120.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3350.3505175.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.1002420.0
AMZN[AMZN20220121C4350][AMZN20220121C4400]&L:AMZN20220121C4350&S:AMZN20220121C44005.80021160.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.4504580.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.5904636.0
2021-05-04AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1801.8753562.5
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.02561215.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7004.80041920.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3350.8755437.5
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.6502330.0
AMZN[AMZN20220121C4350][AMZN20220121C4400]&L:AMZN20220121C4350&S:AMZN20220121C44005.20021040.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.7004680.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.3004520.0
AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1801.8753562.5
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9302.02561215.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7004.80041920.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3350.8755437.5
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.6502330.0
AMZN[AMZN20220121C4350][AMZN20220121C4400]&L:AMZN20220121C4350&S:AMZN20220121C44005.20021040.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.7004680.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.3004520.0
2021-05-05AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1801.8503555.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9301.92561155.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7005.10042040.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3350.7255362.5
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.9752395.0
AMZN[AMZN20220121C4350][AMZN20220121C4400]&L:AMZN20220121C4350&S:AMZN20220121C44004.6002920.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.3254530.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.3004520.0
AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1801.8503555.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9301.92561155.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7005.10042040.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3350.7255362.5
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.9752395.0
AMZN[AMZN20220121C4350][AMZN20220121C4400]&L:AMZN20220121C4350&S:AMZN20220121C44004.6002920.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.3254530.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.3004520.0
2021-05-06AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1801.9253577.5
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9301.87561125.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7005.05042020.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3350.8255412.5
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.3002260.0
AMZN[AMZN20220121C4350][AMZN20220121C4400]&L:AMZN20220121C4350&S:AMZN20220121C44004.5752915.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.3004520.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.2804512.0
AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1801.9253577.5
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9301.87561125.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7005.05042020.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3350.8255412.5
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.3002260.0
AMZN[AMZN20220121C4350][AMZN20220121C4400]&L:AMZN20220121C4350&S:AMZN20220121C44004.5752915.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.3004520.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.2804512.0
2021-05-07AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1802.0003600.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9301.87561125.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7005.27542110.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3350.9755487.5
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.6252325.0
AMZN[AMZN20220121C4350][AMZN20220121C4400]&L:AMZN20220121C4350&S:AMZN20220121C44004.2002840.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4402.0254810.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.4104564.0
AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1802.0003600.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9301.87561125.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7005.27542110.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3350.9755487.5
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.6252325.0
AMZN[AMZN20220121C4350][AMZN20220121C4400]&L:AMZN20220121C4350&S:AMZN20220121C44004.2002840.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4402.0254810.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.4104564.0
2021-05-10AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1801.7253517.5
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9301.5756945.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7004.65041860.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3350.4255212.5
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.8252365.0
AMZN[AMZN20220121C4350][AMZN20220121C4400]&L:AMZN20220121C4350&S:AMZN20220121C44002.4502490.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.9254770.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.3254530.0
AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1801.7253517.5
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9301.5756945.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7004.65041860.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3350.4255212.5
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.8252365.0
AMZN[AMZN20220121C4350][AMZN20220121C4400]&L:AMZN20220121C4350&S:AMZN20220121C44002.4502490.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.9254770.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.3254530.0
2021-05-11AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1801.6203486.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9301.4256855.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7004.70041880.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3350.5755287.5
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.5752315.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.4254570.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.2704508.0
AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1801.6203486.0
TSLA[TSLA20220121C920][TSLA20220121C930]&L:TSLA20220121C920&S:TSLA20220121C9301.4256855.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7004.70041880.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3350.5755287.5
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.5752315.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.4254570.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.2704508.0
2021-05-12AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1801.4953448.5
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7004.07541630.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3350.4005200.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.8252365.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.5754630.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.1104444.0
AAPL[AAPL20220617C165][AAPL20220617C180]&L:AAPL20220617C165&S:AAPL20220617C1801.4953448.5
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7004.07541630.0
BA[BA20220121C325][BA20220121C335]&L:BA20220121C325&S:BA20220121C3350.4005200.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.8252365.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.5754630.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.1104444.0
2021-05-13NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7004.10041640.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.8252365.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.5504620.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1600.9904396.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7004.10041640.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.8252365.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.5504620.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1600.9904396.0
2021-05-14NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7004.57541830.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.0752415.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.9504780.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.1854474.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7004.57541830.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.0752415.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.9504780.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.1854474.0
2021-05-17AAPL[AAPL20220617C150][AAPL20220617C160]&L:AAPL20220617C150&S:AAPL20220617C1601.9752395.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7004.52541810.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.0502410.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4402.3254930.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.1254450.0
AAPL[AAPL20220617C150][AAPL20220617C160]&L:AAPL20220617C150&S:AAPL20220617C1601.9752395.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7004.52541810.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.0502410.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4402.3254930.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.1254450.0
2021-05-18AAPL[AAPL20220617C150][AAPL20220617C160]&L:AAPL20220617C150&S:AAPL20220617C1601.9002380.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7004.22541690.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.8502370.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4402.0754830.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.0254410.0
AAPL[AAPL20220617C150][AAPL20220617C160]&L:AAPL20220617C150&S:AAPL20220617C1601.9002380.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7004.22541690.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.8502370.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4402.0754830.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.0254410.0
2021-05-19NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7004.40041760.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.0002400.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.9504780.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1600.9454378.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7004.40041760.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.0002400.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.9504780.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1600.9454378.0
2021-05-20NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7005.82542330.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.1252425.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4402.0254810.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.1504460.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7005.82542330.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.1252425.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4402.0254810.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.1504460.0
2021-05-21AAPL[AAPL20220617C150][AAPL20220617C160]&L:AAPL20220617C150&S:AAPL20220617C1601.9002380.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7005.85042340.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.4252285.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.6504660.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.1504460.0
AAPL[AAPL20220617C150][AAPL20220617C160]&L:AAPL20220617C150&S:AAPL20220617C1601.9002380.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7005.85042340.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.4252285.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.6504660.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.1504460.0
2021-05-24NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7006.57542630.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.2502450.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4400.6504260.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1600.6604264.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7006.57542630.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.2502450.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4400.6504260.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1600.6604264.0
2021-05-25NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7006.57542630.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.3002460.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4402.4254970.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.0404416.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7006.57542630.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.3002460.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4402.4254970.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.0404416.0
2021-05-26NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7006.82542730.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.3252465.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.4504580.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.0954438.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7006.82542730.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.3252465.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.4504580.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.0954438.0
2021-05-27NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7006.37542550.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.4252485.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.9754790.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.1754470.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7006.37542550.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.4252485.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.9754790.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.1754470.0
2021-05-28NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7007.55043020.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.5252305.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.9504780.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.1354454.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7007.55043020.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.5252305.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.9504780.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.1354454.0
2021-05-31NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7006.82542730.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.3502470.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.4254570.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.0104404.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7006.82542730.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.3502470.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.4254570.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.0104404.0
2021-06-01NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7006.82542730.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.3502470.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.4254570.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.0104404.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7006.82542730.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.3502470.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.4254570.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1601.0104404.0
2021-06-02NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7008.40043360.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.3252465.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.6004640.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1600.9354374.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7008.40043360.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.3252465.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.6004640.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1600.9354374.0
2021-06-03NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7008.67543470.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.3002460.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.7754710.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1600.7654306.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7008.67543470.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.3002460.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.7754710.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1600.7654306.0
2021-06-04NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7009.62543850.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.4002480.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.9754790.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1600.8254330.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7009.62543850.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.4002480.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.9754790.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1600.8254330.0
2021-06-07NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7009.37543750.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.1502430.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.5504620.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1600.7254290.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7009.37543750.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.1502430.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.5504620.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1600.7254290.0
2021-06-08NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7009.40043760.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.2752455.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.5504620.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1600.7654306.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7009.40043760.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.2752455.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.5504620.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1600.7654306.0
2021-06-09NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7009.30043720.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.4502490.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.6004640.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1600.7854314.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7009.30043720.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.4502490.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.6004640.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1600.7854314.0
2021-06-10NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7009.27543710.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.5502510.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.8004720.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1600.7904316.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7009.27543710.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.5502510.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.8004720.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1600.7904316.0
2021-06-11NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70010.02544010.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.4252485.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.7254690.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1600.7654306.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70010.02544010.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.4252485.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.7254690.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1600.7654306.0
2021-06-14NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7009.87543950.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.6002520.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.7004680.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1600.7354294.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7009.87543950.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.6002520.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.7004680.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1600.7354294.0
2021-06-15NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70010.27544110.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.5502510.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.7254690.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1600.6904276.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70010.27544110.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.5502510.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.7254690.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1600.6904276.0
2021-06-16NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7009.95043980.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.4752495.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.4254570.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1600.6654266.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C7009.95043980.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.4752495.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.4254570.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1600.6654266.0
2021-06-17NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.10044440.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.5502510.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.8254730.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1600.6804272.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.10044440.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.5502510.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.8254730.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1600.6804272.0
2021-06-18NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.17544470.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.2752455.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.6754670.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1600.6154246.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.17544470.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.2752455.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.6754670.0
SBUX[SBUX20220121C140][SBUX20220121C160]&L:SBUX20220121C140&S:SBUX20220121C1600.6154246.0
2021-06-21NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70010.97544390.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.4752495.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.8004720.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70010.97544390.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.4752495.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.8004720.0
2021-06-22NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.97544790.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.0752415.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4402.1504860.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.97544790.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.0752415.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4402.1504860.0
2021-06-23NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70012.17544870.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.7002540.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46003.8252765.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4402.0504820.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70012.17544870.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.7002540.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46003.8252765.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4402.0504820.0
2021-06-24NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70013.67545470.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.0002600.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46003.2252645.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4402.1504860.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70013.67545470.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.0002600.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46003.2252645.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4402.1504860.0
2021-06-25NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.97544790.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.7002540.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46002.7002540.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.9004760.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.97544790.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.7002540.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46002.7002540.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4401.9004760.0
2021-06-28NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70013.35045340.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.3252665.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46002.8502570.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4402.75041100.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70013.35045340.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.3252665.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46002.8502570.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4402.75041100.0
2021-06-29NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70013.17545270.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.0252605.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46002.9752595.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4402.4254970.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70013.17545270.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.0252605.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46002.9752595.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4402.4254970.0
2021-06-30NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70013.45045380.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.2752655.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46002.6002520.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4402.1504860.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70013.45045380.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.2752655.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46002.6002520.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4402.1504860.0
2021-07-01AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.0002400.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70013.27545310.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.0252605.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46002.5752515.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4402.50041000.0
AMD[AMD20220617C115][AMD20220617C125]&L:AMD20220617C115&S:AMD20220617C1252.000112200.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.0002400.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70013.27545310.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.0252605.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46002.5752515.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4402.50041000.0
AMD[AMD20220617C115][AMD20220617C125]&L:AMD20220617C115&S:AMD20220617C1252.000112200.0
2021-07-02AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.2502450.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70012.92545170.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.1252625.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46003.3502670.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4402.4254970.0
AMD[AMD20220617C115][AMD20220617C125]&L:AMD20220617C115&S:AMD20220617C1252.250112475.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.2502450.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70012.92545170.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.1252625.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46003.3502670.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4402.4254970.0
AMD[AMD20220617C115][AMD20220617C125]&L:AMD20220617C115&S:AMD20220617C1252.250112475.0
2021-07-05AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.4752495.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70013.87545550.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.2002640.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46005.55021110.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4402.4504980.0
AMD[AMD20220617C115][AMD20220617C125]&L:AMD20220617C115&S:AMD20220617C1252.500112750.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.4752495.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70013.87545550.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.2002640.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46005.55021110.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4402.4504980.0
AMD[AMD20220617C115][AMD20220617C125]&L:AMD20220617C115&S:AMD20220617C1252.500112750.0
2021-07-06AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.4752495.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70013.87545550.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.2002640.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46005.55021110.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4402.4504980.0
AMD[AMD20220617C115][AMD20220617C125]&L:AMD20220617C115&S:AMD20220617C1252.500112750.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.4752495.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70013.87545550.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.2002640.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46005.55021110.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4402.4504980.0
AMD[AMD20220617C115][AMD20220617C125]&L:AMD20220617C115&S:AMD20220617C1252.500112750.0
2021-07-07AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.7502550.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70013.42545370.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.0502610.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46006.02521205.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4402.82541130.0
AMD[AMD20220617C115][AMD20220617C125]&L:AMD20220617C115&S:AMD20220617C1251.825112007.5
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.7502550.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70013.42545370.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.0502610.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46006.02521205.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4402.82541130.0
AMD[AMD20220617C115][AMD20220617C125]&L:AMD20220617C115&S:AMD20220617C1251.825112007.5
2021-07-08AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.5752515.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70013.87545550.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.5252505.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46006.60021320.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4403.20041280.0
AMD[AMD20220617C115][AMD20220617C125]&L:AMD20220617C115&S:AMD20220617C1251.900112090.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.5752515.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70013.87545550.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.5252505.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46006.60021320.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4403.20041280.0
AMD[AMD20220617C115][AMD20220617C125]&L:AMD20220617C115&S:AMD20220617C1251.900112090.0
2021-07-09AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.7752555.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70012.85045140.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.9252585.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46006.20021240.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4403.32541330.0
AMD[AMD20220617C115][AMD20220617C125]&L:AMD20220617C115&S:AMD20220617C1251.850112035.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.7752555.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70012.85045140.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.9252585.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46006.20021240.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4403.32541330.0
AMD[AMD20220617C115][AMD20220617C125]&L:AMD20220617C115&S:AMD20220617C1251.850112035.0
2021-07-12AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.7002540.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70014.17545670.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.9752595.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46005.95021190.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4402.82541130.0
AMD[AMD20220617C115][AMD20220617C125]&L:AMD20220617C115&S:AMD20220617C1252.000112200.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.7002540.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70014.17545670.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.9752595.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46005.95021190.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4402.82541130.0
AMD[AMD20220617C115][AMD20220617C125]&L:AMD20220617C115&S:AMD20220617C1252.000112200.0
2021-07-13AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.8252565.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70013.07545230.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.0252605.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46005.42521085.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4402.2754910.0
AMD[AMD20220617C115][AMD20220617C125]&L:AMD20220617C115&S:AMD20220617C1251.825112007.5
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.8252565.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70013.07545230.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.0252605.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46005.42521085.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4402.2754910.0
AMD[AMD20220617C115][AMD20220617C125]&L:AMD20220617C115&S:AMD20220617C1251.825112007.5
2021-07-14AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.1752635.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70013.20045280.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.9002580.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46005.37521075.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4402.92541170.0
SBUX[SBUX20220121C130][SBUX20220121C140]&L:SBUX20220121C130&S:SBUX20220121C1401.9301193.0
AMD[AMD20220617C115][AMD20220617C125]&L:AMD20220617C115&S:AMD20220617C1251.550111705.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.1752635.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70013.20045280.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.9002580.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46005.37521075.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4402.92541170.0
SBUX[SBUX20220121C130][SBUX20220121C140]&L:SBUX20220121C130&S:SBUX20220121C1401.9301193.0
AMD[AMD20220617C115][AMD20220617C125]&L:AMD20220617C115&S:AMD20220617C1251.550111705.0
2021-07-15AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.0502610.0
NFLX[NFLX20220617C640][NFLX20220617C650]&L:NFLX20220617C640&S:NFLX20220617C6502.7253817.5
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70012.07544830.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.7252545.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46004.6502930.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4403.30041320.0
SBUX[SBUX20220121C130][SBUX20220121C140]&L:SBUX20220121C130&S:SBUX20220121C1401.7951179.5
AMD[AMD20220617C115][AMD20220617C125]&L:AMD20220617C115&S:AMD20220617C1251.350111485.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.0502610.0
NFLX[NFLX20220617C640][NFLX20220617C650]&L:NFLX20220617C640&S:NFLX20220617C6502.7253817.5
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70012.07544830.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.7252545.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46004.6502930.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4403.30041320.0
SBUX[SBUX20220121C130][SBUX20220121C140]&L:SBUX20220121C130&S:SBUX20220121C1401.7951179.5
AMD[AMD20220617C115][AMD20220617C125]&L:AMD20220617C115&S:AMD20220617C1251.350111485.0
2021-07-16AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.8752575.0
NFLX[NFLX20220617C640][NFLX20220617C650]&L:NFLX20220617C640&S:NFLX20220617C6502.2253667.5
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70010.95044380.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.8502370.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46004.0502810.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4402.90041160.0
SBUX[SBUX20220121C130][SBUX20220121C140]&L:SBUX20220121C130&S:SBUX20220121C1401.7801178.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.8752575.0
NFLX[NFLX20220617C640][NFLX20220617C650]&L:NFLX20220617C640&S:NFLX20220617C6502.2253667.5
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70010.95044380.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3351.8502370.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46004.0502810.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4402.90041160.0
SBUX[SBUX20220121C130][SBUX20220121C140]&L:SBUX20220121C130&S:SBUX20220121C1401.7801178.0
2021-07-19AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.5502510.0
NFLX[NFLX20220617C640][NFLX20220617C650]&L:NFLX20220617C640&S:NFLX20220617C6502.3003690.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.7002540.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46003.8002760.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4403.25041300.0
SBUX[SBUX20220121C130][SBUX20220121C140]&L:SBUX20220121C130&S:SBUX20220121C1401.4201142.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.5502510.0
NFLX[NFLX20220617C640][NFLX20220617C650]&L:NFLX20220617C640&S:NFLX20220617C6502.3003690.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.7002540.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46003.8002760.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4403.25041300.0
SBUX[SBUX20220121C130][SBUX20220121C140]&L:SBUX20220121C130&S:SBUX20220121C1401.4201142.0
2021-07-20AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.9002580.0
NFLX[NFLX20220617C640][NFLX20220617C650]&L:NFLX20220617C640&S:NFLX20220617C6502.4503735.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.7002540.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46003.6752735.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4403.67541470.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.9002580.0
NFLX[NFLX20220617C640][NFLX20220617C650]&L:NFLX20220617C640&S:NFLX20220617C6502.4503735.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.7002540.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46003.6752735.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4403.67541470.0
2021-07-21AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.8252565.0
NFLX[NFLX20220617C640][NFLX20220617C650]&L:NFLX20220617C640&S:NFLX20220617C6501.7503525.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.9002580.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46003.7002740.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4403.52541410.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.8252565.0
NFLX[NFLX20220617C640][NFLX20220617C650]&L:NFLX20220617C640&S:NFLX20220617C6501.7503525.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.9002580.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46003.7002740.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4403.52541410.0
2021-07-22AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.9502590.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.2002640.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46004.2752855.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4403.70041480.0
SBUX[SBUX20220617C140][SBUX20220617C150]&L:SBUX20220617C140&S:SBUX20220617C1501.8251182.5
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.9502590.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.2002640.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46004.2752855.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4403.70041480.0
SBUX[SBUX20220617C140][SBUX20220617C150]&L:SBUX20220617C140&S:SBUX20220617C1501.8251182.5
2021-07-23AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.1002620.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.2252645.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46004.4752895.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4403.90041560.0
SBUX[SBUX20220617C140][SBUX20220617C150]&L:SBUX20220617C140&S:SBUX20220617C1502.8751287.5
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.1002620.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.2252645.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46004.4752895.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4403.90041560.0
SBUX[SBUX20220617C140][SBUX20220617C150]&L:SBUX20220617C140&S:SBUX20220617C1502.8751287.5
2021-07-26AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.1002620.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.5752715.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46005.22521045.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4404.05041620.0
SBUX[SBUX20220617C140][SBUX20220617C150]&L:SBUX20220617C140&S:SBUX20220617C1502.4501245.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.1002620.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.5752715.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46005.22521045.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4404.05041620.0
SBUX[SBUX20220617C140][SBUX20220617C150]&L:SBUX20220617C140&S:SBUX20220617C1502.4501245.0
2021-07-27AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.9252585.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.2002640.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46004.2502850.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4404.32541730.0
SBUX[SBUX20220617C140][SBUX20220617C150]&L:SBUX20220617C140&S:SBUX20220617C1502.4001240.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.9252585.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.2002640.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46004.2502850.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4404.32541730.0
SBUX[SBUX20220617C140][SBUX20220617C150]&L:SBUX20220617C140&S:SBUX20220617C1502.4001240.0
2021-07-28AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.7002540.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.2502650.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46003.9752795.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4404.25041700.0
SBUX[SBUX20220617C140][SBUX20220617C150]&L:SBUX20220617C140&S:SBUX20220617C1501.8451184.5
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.7002540.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.2502650.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46003.9752795.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4404.25041700.0
SBUX[SBUX20220617C140][SBUX20220617C150]&L:SBUX20220617C140&S:SBUX20220617C1501.8451184.5
2021-07-29AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.7752555.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.3252665.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46003.5252705.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4404.00041600.0
SBUX[SBUX20220617C140][SBUX20220617C150]&L:SBUX20220617C140&S:SBUX20220617C1501.8301183.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.7752555.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.3252665.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46003.5252705.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4404.00041600.0
SBUX[SBUX20220617C140][SBUX20220617C150]&L:SBUX20220617C140&S:SBUX20220617C1501.8301183.0
2021-07-30AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.7752555.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.2252645.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46001.4252285.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4404.72541890.0
SBUX[SBUX20220617C140][SBUX20220617C150]&L:SBUX20220617C140&S:SBUX20220617C1501.7951179.5
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.92581540.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.7752555.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.2252645.0
AMZN[AMZN20220121C4550][AMZN20220121C4600]&L:AMZN20220121C4550&S:AMZN20220121C46001.4252285.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4404.72541890.0
SBUX[SBUX20220617C140][SBUX20220617C150]&L:SBUX20220617C140&S:SBUX20220617C1501.7951179.5
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.92581540.0
2021-08-02AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.7502550.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.2252645.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4404.37541750.0
SBUX[SBUX20220617C140][SBUX20220617C150]&L:SBUX20220617C140&S:SBUX20220617C1501.4451144.5
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.82581460.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.7502550.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.2252645.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4404.37541750.0
SBUX[SBUX20220617C140][SBUX20220617C150]&L:SBUX20220617C140&S:SBUX20220617C1501.4451144.5
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.82581460.0
2021-08-03AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.9502590.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.1502630.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4405.12542050.0
SBUX[SBUX20220617C140][SBUX20220617C150]&L:SBUX20220617C140&S:SBUX20220617C1501.4501145.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.2008960.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.9502590.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.1502630.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4405.12542050.0
SBUX[SBUX20220617C140][SBUX20220617C150]&L:SBUX20220617C140&S:SBUX20220617C1501.4501145.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.2008960.0
2021-08-04AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.9002580.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.2002640.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4405.10042040.0
SBUX[SBUX20220617C140][SBUX20220617C150]&L:SBUX20220617C140&S:SBUX20220617C1501.4951149.5
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.42581140.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.9002580.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.2002640.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4405.10042040.0
SBUX[SBUX20220617C140][SBUX20220617C150]&L:SBUX20220617C140&S:SBUX20220617C1501.4951149.5
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.42581140.0
2021-08-05AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.9002580.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.4252685.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4405.42542170.0
SBUX[SBUX20220617C140][SBUX20220617C150]&L:SBUX20220617C140&S:SBUX20220617C1500.875187.5
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1200.9508760.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.9002580.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.4252685.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4405.42542170.0
SBUX[SBUX20220617C140][SBUX20220617C150]&L:SBUX20220617C140&S:SBUX20220617C1500.875187.5
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1200.9508760.0
2021-08-06AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.7752555.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.4752695.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4405.30042120.0
SBUX[SBUX20220617C140][SBUX20220617C150]&L:SBUX20220617C140&S:SBUX20220617C1501.2751127.5
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.1758940.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.7752555.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.4752695.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4405.30042120.0
SBUX[SBUX20220617C140][SBUX20220617C150]&L:SBUX20220617C140&S:SBUX20220617C1501.2751127.5
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.1758940.0
2021-08-09AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.8002560.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.3502670.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4405.32542130.0
SBUX[SBUX20220617C140][SBUX20220617C150]&L:SBUX20220617C140&S:SBUX20220617C1501.5301153.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.52581220.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.8002560.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.3502670.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4405.32542130.0
SBUX[SBUX20220617C140][SBUX20220617C150]&L:SBUX20220617C140&S:SBUX20220617C1501.5301153.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.52581220.0
2021-08-10AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.7502550.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.3252665.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4405.87542350.0
SBUX[SBUX20220617C140][SBUX20220617C150]&L:SBUX20220617C140&S:SBUX20220617C1500.520152.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.92581540.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.7502550.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.3252665.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4405.87542350.0
SBUX[SBUX20220617C140][SBUX20220617C150]&L:SBUX20220617C140&S:SBUX20220617C1500.520152.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.92581540.0
2021-08-11AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.8002560.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.3502670.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4405.80042320.0
SBUX[SBUX20220617C140][SBUX20220617C150]&L:SBUX20220617C140&S:SBUX20220617C1501.0151101.5
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.62581300.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.8002560.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.3502670.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4405.80042320.0
SBUX[SBUX20220617C140][SBUX20220617C150]&L:SBUX20220617C140&S:SBUX20220617C1501.0151101.5
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.62581300.0
2021-08-12AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.1252625.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.4252685.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4405.92542370.0
SBUX[SBUX20220617C140][SBUX20220617C150]&L:SBUX20220617C140&S:SBUX20220617C1501.0901109.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1202.45081960.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.1252625.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.4252685.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4405.92542370.0
SBUX[SBUX20220617C140][SBUX20220617C150]&L:SBUX20220617C140&S:SBUX20220617C1501.0901109.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1202.45081960.0
2021-08-13AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.1002620.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.4002680.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4405.97542390.0
SBUX[SBUX20220617C140][SBUX20220617C150]&L:SBUX20220617C140&S:SBUX20220617C1501.0001100.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.80081440.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.1002620.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.4002680.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4405.97542390.0
SBUX[SBUX20220617C140][SBUX20220617C150]&L:SBUX20220617C140&S:SBUX20220617C1501.0001100.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.80081440.0
2021-08-16AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.3502670.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.5502710.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.37542550.0
SBUX[SBUX20220617C140][SBUX20220617C150]&L:SBUX20220617C140&S:SBUX20220617C1501.2351123.5
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.55081240.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.3502670.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.5502710.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.37542550.0
SBUX[SBUX20220617C140][SBUX20220617C150]&L:SBUX20220617C140&S:SBUX20220617C1501.2351123.5
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.55081240.0
2021-08-17AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.2502650.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.2752655.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.40042560.0
SBUX[SBUX20220617C140][SBUX20220617C150]&L:SBUX20220617C140&S:SBUX20220617C1501.2201122.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.60081280.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.2502650.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.2752655.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.40042560.0
SBUX[SBUX20220617C140][SBUX20220617C150]&L:SBUX20220617C140&S:SBUX20220617C1501.2201122.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.60081280.0
2021-08-18AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.9252585.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.2752655.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4405.92542370.0
SBUX[SBUX20220617C140][SBUX20220617C150]&L:SBUX20220617C140&S:SBUX20220617C1500.730173.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.42581140.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.9252585.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.2752655.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4405.92542370.0
SBUX[SBUX20220617C140][SBUX20220617C150]&L:SBUX20220617C140&S:SBUX20220617C1500.730173.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.42581140.0
2021-08-19AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.9002580.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.2752655.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.62542650.0
SBUX[SBUX20220617C140][SBUX20220617C150]&L:SBUX20220617C140&S:SBUX20220617C1500.655165.5
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.45081160.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.9002580.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.2752655.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.62542650.0
SBUX[SBUX20220617C140][SBUX20220617C150]&L:SBUX20220617C140&S:SBUX20220617C1500.655165.5
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.45081160.0
2021-08-20AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.0502610.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.4252685.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.85042740.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.57581260.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.0502610.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.4252685.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.85042740.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.57581260.0
2021-08-23AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.1752635.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.6002720.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.72542690.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.80081440.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.1752635.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.6002720.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.72542690.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.80081440.0
2021-08-24AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.1252625.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.5752715.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.35042540.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.67581340.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.1252625.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.5752715.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.35042540.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.67581340.0
2021-08-25AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.0002600.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.6752735.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.40042560.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.70081360.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.0002600.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.6752735.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.40042560.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.70081360.0
2021-08-26AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.9002580.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.6252725.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.15042460.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.62581300.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.9002580.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.6252725.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.15042460.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.62581300.0
2021-08-27AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.9502590.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7201.9752395.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.7752755.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.17542470.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.85081480.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.9502590.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7201.9752395.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.7752755.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.17542470.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.85081480.0
2021-08-30AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.4752695.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7202.6252525.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.9752795.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.65042660.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.82581460.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.4752695.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7202.6252525.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.9752795.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.65042660.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.82581460.0
2021-08-31AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.3502670.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7202.5002500.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.9502790.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.70042680.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.82581460.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.3502670.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7202.5002500.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.9502790.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.70042680.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.82581460.0
2021-09-01AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.3502670.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7202.9252585.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3354.0002800.0
AMZN[AMZN20220121C4650][AMZN20220121C4750]&L:AMZN20220121C4650&S:AMZN20220121C47501.9252385.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.75042700.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.80081440.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.3502670.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7202.9252585.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3354.0002800.0
AMZN[AMZN20220121C4650][AMZN20220121C4750]&L:AMZN20220121C4650&S:AMZN20220121C47501.9252385.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.75042700.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.80081440.0
2021-09-02AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.5252705.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7203.2752655.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.8502770.0
AMZN[AMZN20220121C4650][AMZN20220121C4750]&L:AMZN20220121C4650&S:AMZN20220121C47501.7752355.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4407.00042800.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.75081400.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.5252705.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7203.2752655.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.8502770.0
AMZN[AMZN20220121C4650][AMZN20220121C4750]&L:AMZN20220121C4650&S:AMZN20220121C47501.7752355.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4407.00042800.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.75081400.0
2021-09-03AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.6502730.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7204.1002820.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.9252785.0
AMZN[AMZN20220121C4650][AMZN20220121C4750]&L:AMZN20220121C4650&S:AMZN20220121C47501.8002360.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4407.20042880.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.80081440.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.6502730.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7204.1002820.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.9252785.0
AMZN[AMZN20220121C4650][AMZN20220121C4750]&L:AMZN20220121C4650&S:AMZN20220121C47501.8002360.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4407.20042880.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.80081440.0
2021-09-06AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.8502770.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7204.2502850.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3354.0252805.0
AMZN[AMZN20220121C4650][AMZN20220121C4750]&L:AMZN20220121C4650&S:AMZN20220121C47502.0252405.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4407.02542810.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.70081360.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.8502770.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7204.2502850.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3354.0252805.0
AMZN[AMZN20220121C4650][AMZN20220121C4750]&L:AMZN20220121C4650&S:AMZN20220121C47502.0252405.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4407.02542810.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.70081360.0
2021-09-07AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.8502770.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7204.2502850.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3354.0252805.0
AMZN[AMZN20220121C4650][AMZN20220121C4750]&L:AMZN20220121C4650&S:AMZN20220121C47502.0252405.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4407.02542810.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.70081360.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.8502770.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7204.2502850.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3354.0252805.0
AMZN[AMZN20220121C4650][AMZN20220121C4750]&L:AMZN20220121C4650&S:AMZN20220121C47502.0252405.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4407.02542810.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.70081360.0
2021-09-08AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.7002740.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7204.1752835.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.8502770.0
AMZN[AMZN20220121C4650][AMZN20220121C4750]&L:AMZN20220121C4650&S:AMZN20220121C47502.2252445.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4407.32542930.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.60081280.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.7002740.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7204.1752835.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.8502770.0
AMZN[AMZN20220121C4650][AMZN20220121C4750]&L:AMZN20220121C4650&S:AMZN20220121C47502.2252445.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4407.32542930.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.60081280.0
2021-09-09AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.5752715.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7204.0752815.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.9502790.0
AMZN[AMZN20220121C4650][AMZN20220121C4750]&L:AMZN20220121C4650&S:AMZN20220121C47501.8752375.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4407.30042920.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.60081280.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.5752715.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7204.0752815.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.9502790.0
AMZN[AMZN20220121C4650][AMZN20220121C4750]&L:AMZN20220121C4650&S:AMZN20220121C47501.8752375.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4407.30042920.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.60081280.0
2021-09-10AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.1502630.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7203.9752795.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.9752795.0
AMZN[AMZN20220121C4650][AMZN20220121C4750]&L:AMZN20220121C4650&S:AMZN20220121C47501.7002340.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.45042580.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.57581260.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.1502630.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7203.9752795.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.9752795.0
AMZN[AMZN20220121C4650][AMZN20220121C4750]&L:AMZN20220121C4650&S:AMZN20220121C47501.7002340.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.45042580.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.57581260.0
2021-09-13AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.1252625.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7203.6502730.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.9752795.0
AMZN[AMZN20220121C4650][AMZN20220121C4750]&L:AMZN20220121C4650&S:AMZN20220121C47501.4752295.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.95042780.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.50081200.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.1252625.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7203.6502730.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.9752795.0
AMZN[AMZN20220121C4650][AMZN20220121C4750]&L:AMZN20220121C4650&S:AMZN20220121C47501.4752295.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.95042780.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.50081200.0
2021-09-14AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.9502590.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7203.2752655.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.9002780.0
AMZN[AMZN20220121C4650][AMZN20220121C4750]&L:AMZN20220121C4650&S:AMZN20220121C47501.3002260.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.92542770.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.55081240.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.9502590.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7203.2752655.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.9002780.0
AMZN[AMZN20220121C4650][AMZN20220121C4750]&L:AMZN20220121C4650&S:AMZN20220121C47501.3002260.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.92542770.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.55081240.0
2021-09-15AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.0502610.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7203.1502630.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3354.0252805.0
AMZN[AMZN20220121C4650][AMZN20220121C4750]&L:AMZN20220121C4650&S:AMZN20220121C47501.4002280.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4407.50043000.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.57581260.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.0502610.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7203.1502630.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3354.0252805.0
AMZN[AMZN20220121C4650][AMZN20220121C4750]&L:AMZN20220121C4650&S:AMZN20220121C47501.4002280.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4407.50043000.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.57581260.0
2021-09-16AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.9752595.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7203.2252645.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.9002780.0
AMZN[AMZN20220121C4650][AMZN20220121C4750]&L:AMZN20220121C4650&S:AMZN20220121C47501.4252285.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4407.25042900.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.60081280.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.9752595.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7203.2252645.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.9002780.0
AMZN[AMZN20220121C4650][AMZN20220121C4750]&L:AMZN20220121C4650&S:AMZN20220121C47501.4252285.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4407.25042900.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.60081280.0
2021-09-17AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.7002540.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7203.6002720.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.6752735.0
AMZN[AMZN20220121C4650][AMZN20220121C4750]&L:AMZN20220121C4650&S:AMZN20220121C47501.2502250.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4407.02542810.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.50081200.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.7002540.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7203.6002720.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.6752735.0
AMZN[AMZN20220121C4650][AMZN20220121C4750]&L:AMZN20220121C4650&S:AMZN20220121C47501.2502250.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4407.02542810.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.50081200.0
2021-09-20AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.4502490.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7203.0252605.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.4502690.0
AMZN[AMZN20220121C4650][AMZN20220121C4750]&L:AMZN20220121C4650&S:AMZN20220121C47500.8502170.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.40042560.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.37581100.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.4502490.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7203.0252605.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.4502690.0
AMZN[AMZN20220121C4650][AMZN20220121C4750]&L:AMZN20220121C4650&S:AMZN20220121C47500.8502170.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.40042560.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.37581100.0
2021-09-21AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.4752495.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7202.8002560.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.5002700.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.40042560.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.45081160.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.4752495.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7202.8002560.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.5002700.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.40042560.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.45081160.0
2021-09-22AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.7002540.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7203.2752655.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.1752635.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.47542590.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.55081240.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.7002540.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7203.2752655.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.1752635.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.47542590.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.55081240.0
2021-09-23AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.8002560.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7203.7502750.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.1752635.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.35042540.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.62581300.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.8002560.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7203.7502750.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.1752635.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.35042540.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.62581300.0
2021-09-24AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.7752555.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7203.3752675.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.3002660.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4408.17543270.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.62581300.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.7752555.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7203.3752675.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.3002660.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4408.17543270.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.62581300.0
2021-09-27AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.6002520.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7203.3252665.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.4252685.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4407.35042940.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.75081400.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.6002520.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7203.3252665.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.4252685.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4407.35042940.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.75081400.0
2021-09-28AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.3002460.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7203.0752615.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.0252605.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.25042500.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.37581100.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.3002460.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7203.0752615.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.0252605.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.25042500.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.37581100.0
2021-09-29AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.4002480.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7203.8752775.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.0252605.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.52542610.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.35081080.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.4002480.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7203.8752775.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.0252605.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.52542610.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.35081080.0
2021-09-30AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.3752475.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7204.3252865.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.9252585.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.00042400.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.42581140.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.3752475.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7204.3252865.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.9252585.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.00042400.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.42581140.0
2021-10-01AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.2752455.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7204.6502930.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.0002600.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.42542570.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.40081120.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.2752455.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7204.6502930.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3353.0002600.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.42542570.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.40081120.0
2021-10-04AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.0252405.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7204.0752815.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.4252485.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4405.67542270.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.37581100.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.0252405.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7204.0752815.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.4252485.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4405.67542270.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.37581100.0
2021-10-05AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.2002440.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7205.75021150.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.6752535.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.25042500.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.37581100.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.2002440.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7205.75021150.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.6752535.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.25042500.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.37581100.0
2021-10-06AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.3002460.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7205.90021180.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.7502550.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.12542450.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.45081160.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.3002460.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7205.90021180.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.7502550.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.12542450.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.45081160.0
2021-10-07AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.4002480.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7205.62521125.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.5502510.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.70042680.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.60081280.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.4002480.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7205.62521125.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.5502510.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.70042680.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.60081280.0
2021-10-08AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.3252465.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7205.37521075.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.5502510.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.42542570.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.55081240.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.3252465.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7205.37521075.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.5502510.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.42542570.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.55081240.0
2021-10-11AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.2752455.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7205.25021050.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.3502470.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.32542530.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.52581220.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.2752455.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7205.25021050.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.3502470.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.32542530.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.52581220.0
2021-10-12AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.3002460.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7205.12521025.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.2752455.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.40042560.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.52581220.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.3002460.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7205.12521025.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.2752455.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.40042560.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.52581220.0
2021-10-13AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.0502410.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9100.7759697.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7205.37521075.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.3502470.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.12542450.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.77581420.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.0502410.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9100.7759697.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7205.37521075.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.3502470.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.12542450.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.77581420.0
2021-10-14AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.2502450.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9103.52593172.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7205.27521055.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.5002500.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.67542670.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.95081560.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.2502450.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9103.52593172.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7205.27521055.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.5002500.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4406.67542670.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.95081560.0
2021-10-15AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.3752475.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9101.37591237.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7204.9252985.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.2502450.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4407.02542810.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.95081560.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.3752475.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9101.37591237.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7204.9252985.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.2502450.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4407.02542810.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1201.95081560.0
2021-10-18AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.5252505.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.05094545.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7205.05021010.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.7002540.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4407.55043020.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1202.10081680.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.5252505.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.05094545.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7205.05021010.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.7002540.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4407.55043020.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1202.10081680.0
2021-10-19AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.9002580.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9107.35096615.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7205.65021130.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.9252585.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4407.70043080.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1202.15081720.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.9002580.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9107.35096615.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7205.65021130.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.9252585.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4407.70043080.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1202.15081720.0
2021-10-20AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.8752575.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9102.75092475.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7204.3252865.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.9502590.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4407.87543150.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1202.10081680.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.8752575.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9102.75092475.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7204.3252865.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.9502590.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4407.87543150.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1202.10081680.0
2021-10-21AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.9252585.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9101.25091125.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7206.10021220.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.9502590.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4408.42543370.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1202.32581860.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.9252585.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9101.25091125.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7206.10021220.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.9502590.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4408.42543370.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1202.32581860.0
2021-10-22AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.8252565.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9104.85094365.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7207.05021410.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.3752475.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4408.67543470.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1202.47581980.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.8252565.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9104.85094365.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7207.05021410.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220121C330][META20220121C335]&L:META20220121C330&S:META20220121C3352.3752475.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4408.67543470.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1202.47581980.0
2021-10-25AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.8002560.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.75095175.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7207.32521465.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4408.75043500.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1202.42581940.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.8002560.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.75095175.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7207.32521465.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4408.75043500.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1202.42581940.0
2021-10-26AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.8502570.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9104.87594387.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7207.12521425.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4408.92543570.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1202.07581660.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.8502570.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9104.87594387.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7207.12521425.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4408.92543570.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1202.07581660.0
2021-10-27AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.8252565.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.67595107.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7206.70021340.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4408.62543450.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1202.40081920.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.8252565.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.67595107.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7206.70021340.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4408.62543450.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1202.40081920.0
2021-10-28AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.1252625.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.95095355.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7207.05021410.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4408.85043540.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1202.55082040.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.1252625.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.95095355.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7207.05021410.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4408.85043540.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1202.55082040.0
2021-10-29AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.8252565.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9103.77593397.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7208.22521645.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4408.92543570.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1202.50082000.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.8252565.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9103.77593397.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7208.22521645.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4408.92543570.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1202.50082000.0
2021-11-01AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.7752555.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9106.35095715.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7207.67521535.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4408.50043400.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1202.35081880.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.7752555.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9106.35095715.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7207.67521535.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4408.50043400.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1202.35081880.0
2021-11-02AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.8502570.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.87595287.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7207.50021500.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4409.32543730.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.02582420.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.8502570.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.87595287.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7207.50021500.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4409.32543730.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.02582420.0
2021-11-03AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.0002600.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9106.20095580.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7208.32521665.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4409.30043720.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1202.82582260.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.0002600.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9106.20095580.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7208.32521665.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4409.30043720.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1202.82582260.0
2021-11-04AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.9502590.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9106.00095400.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7206.90021380.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4409.12543650.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1202.97582380.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.9502590.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9106.00095400.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7206.90021380.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4409.12543650.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1202.97582380.0
2021-11-05AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.9252585.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9106.17595557.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7205.60021120.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4409.40043760.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1202.92582340.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.9252585.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9106.17595557.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7205.60021120.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4409.40043760.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1202.92582340.0
2021-11-08AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.9252585.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.55094995.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7205.72521145.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4409.25043700.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1202.97582380.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.9252585.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.55094995.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7205.72521145.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4409.25043700.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1202.97582380.0
2021-11-09AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.9752595.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9104.77594297.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7206.25021250.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4409.40043760.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.02582420.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.9752595.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9104.77594297.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7206.25021250.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4409.40043760.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.02582420.0
2021-11-10AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.6502530.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.05094545.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7205.72521145.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4409.17543670.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.07582460.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.6502530.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.05094545.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7205.72521145.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4409.17543670.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.07582460.0
2021-11-11AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.6252525.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.22594702.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7206.40021280.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4409.37543750.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.45082760.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.6252525.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.22594702.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7206.40021280.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4409.37543750.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.45082760.0
2021-11-12AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.8752575.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9106.12595512.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7207.82521565.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4409.77543910.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.52582820.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.8752575.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9106.12595512.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7207.82521565.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4409.77543910.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.52582820.0
2021-11-15AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.8002560.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9104.92594432.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7207.57521515.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4409.40043760.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.40082720.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.8002560.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9104.92594432.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7207.57521515.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4409.40043760.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.40082720.0
2021-11-16AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.9752595.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.25094725.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7207.97521595.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220916C380][META20220916C385]&L:META20220916C380&S:META20220916C3851.5752315.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4409.75043900.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.60082880.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1702.9752595.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.25094725.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7207.97521595.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220916C380][META20220916C385]&L:META20220916C380&S:META20220916C3851.5752315.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4409.75043900.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.60082880.0
2021-11-17AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.2502650.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.57595017.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7208.27521655.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220916C380][META20220916C385]&L:META20220916C380&S:META20220916C3851.5502310.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4409.80043920.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.62582900.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.2502650.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.57595017.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7208.27521655.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220916C380][META20220916C385]&L:META20220916C380&S:META20220916C3851.5502310.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4409.80043920.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.62582900.0
2021-11-18AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.8252765.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.55094995.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7207.82521565.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220916C380][META20220916C385]&L:META20220916C380&S:META20220916C3851.5002300.0
AMZN[AMZN20220617C5200][AMZN20220617C5250]&L:AMZN20220617C5200&S:AMZN20220617C52502.1251212.5
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4409.75043900.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.87583100.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.8252765.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.55094995.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7207.82521565.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220916C380][META20220916C385]&L:META20220916C380&S:META20220916C3851.5002300.0
AMZN[AMZN20220617C5200][AMZN20220617C5250]&L:AMZN20220617C5200&S:AMZN20220617C52502.1251212.5
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4409.75043900.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.87583100.0
2021-11-19AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1704.2252845.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.72595152.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7207.72521545.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220916C380][META20220916C385]&L:META20220916C380&S:META20220916C3851.5502310.0
AMZN[AMZN20220617C5200][AMZN20220617C5250]&L:AMZN20220617C5200&S:AMZN20220617C52502.1001210.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4409.60043840.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.67582940.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1704.2252845.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.72595152.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7207.72521545.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220916C380][META20220916C385]&L:META20220916C380&S:META20220916C3851.5502310.0
AMZN[AMZN20220617C5200][AMZN20220617C5250]&L:AMZN20220617C5200&S:AMZN20220617C52502.1001210.0
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4409.60043840.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.67582940.0
2021-11-22AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1704.2252845.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.70095130.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7206.42521285.0
NVDA[NVDA20220121C680][NVDA20220121C700]&L:NVDA20220121C680&S:NVDA20220121C70011.65044660.0
META[META20220916C380][META20220916C385]&L:META20220916C380&S:META20220916C3851.6002320.0
AMZN[AMZN20220617C5200][AMZN20220617C5250]&L:AMZN20220617C5200&S:AMZN20220617C52501.6751167.5
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4409.75043900.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.45082760.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1704.2252845.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.70095130.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7206.42521285.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.51.975214147.5
META[META20220916C380][META20220916C385]&L:META20220916C380&S:META20220916C3851.6002320.0
AMZN[AMZN20220617C5200][AMZN20220617C5250]&L:AMZN20220617C5200&S:AMZN20220617C52501.6751167.5
COST[COST20220121C430][COST20220121C440]&L:COST20220121C430&S:COST20220121C4409.75043900.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.45082760.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1704.2252845.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.70095130.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7206.42521285.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.51.975214147.5
META[META20220916C380][META20220916C385]&L:META20220916C380&S:META20220916C3851.6002320.0
AMZN[AMZN20220617C5200][AMZN20220617C5250]&L:AMZN20220617C5200&S:AMZN20220617C52501.6751167.5
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C6009.82532947.5
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.45082760.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1704.2252845.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.70095130.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7206.42521285.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.51.975214147.5
META[META20220916C380][META20220916C385]&L:META20220916C380&S:META20220916C3851.6002320.0
AMZN[AMZN20220617C5200][AMZN20220617C5250]&L:AMZN20220617C5200&S:AMZN20220617C52501.6751167.5
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C6009.82532947.5
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.45082760.0
2021-11-23AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1704.3252865.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.62595062.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7205.97521195.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.52.800215880.0
META[META20220916C380][META20220916C385]&L:META20220916C380&S:META20220916C3851.4752295.0
AMZN[AMZN20220617C5200][AMZN20220617C5250]&L:AMZN20220617C5200&S:AMZN20220617C52501.8001180.0
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60011.30033390.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.45082760.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1704.3252865.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.62595062.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7205.97521195.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.52.800215880.0
META[META20220916C380][META20220916C385]&L:META20220916C380&S:META20220916C3851.4752295.0
AMZN[AMZN20220617C5200][AMZN20220617C5250]&L:AMZN20220617C5200&S:AMZN20220617C52501.8001180.0
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60011.30033390.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.45082760.0
2021-11-24AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1704.3752875.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.27594747.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7206.52521305.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.54.9502110395.0
META[META20220916C380][META20220916C385]&L:META20220916C380&S:META20220916C3851.5502310.0
AMZN[AMZN20220617C5200][AMZN20220617C5250]&L:AMZN20220617C5200&S:AMZN20220617C52501.8251182.5
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60011.52533457.5
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.77583020.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1704.3752875.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.27594747.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7206.52521305.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.54.9502110395.0
META[META20220916C380][META20220916C385]&L:META20220916C380&S:META20220916C3851.5502310.0
AMZN[AMZN20220617C5200][AMZN20220617C5250]&L:AMZN20220617C5200&S:AMZN20220617C52501.8251182.5
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60011.52533457.5
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.77583020.0
2021-11-25AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1704.3752875.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.27594747.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7206.52521305.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.52.900216090.0
META[META20220916C380][META20220916C385]&L:META20220916C380&S:META20220916C3853.1252625.0
AMZN[AMZN20220617C5200][AMZN20220617C5250]&L:AMZN20220617C5200&S:AMZN20220617C52501.8251182.5
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60012.12533637.5
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.77583020.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1704.3752875.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.27594747.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7206.52521305.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.52.900216090.0
META[META20220916C380][META20220916C385]&L:META20220916C380&S:META20220916C3853.1252625.0
AMZN[AMZN20220617C5200][AMZN20220617C5250]&L:AMZN20220617C5200&S:AMZN20220617C52501.8251182.5
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60012.12533637.5
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.77583020.0
2021-11-26AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.8002760.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.20094680.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7206.72521345.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.52.900216090.0
META[META20220916C380][META20220916C385]&L:META20220916C380&S:META20220916C3850.300260.0
AMZN[AMZN20220617C5200][AMZN20220617C5250]&L:AMZN20220617C5200&S:AMZN20220617C52501.6751167.5
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60010.75033225.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.57582860.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1703.8002760.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.20094680.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7206.72521345.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.52.900216090.0
META[META20220916C380][META20220916C385]&L:META20220916C380&S:META20220916C3850.300260.0
AMZN[AMZN20220617C5200][AMZN20220617C5250]&L:AMZN20220617C5200&S:AMZN20220617C52501.6751167.5
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60010.75033225.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.57582860.0
2021-11-29AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1704.2752855.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.52594972.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7206.47521295.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.54.625219712.5
AMZN[AMZN20220617C5200][AMZN20220617C5250]&L:AMZN20220617C5200&S:AMZN20220617C52501.6001160.0
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60011.85033555.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.32582660.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1704.2752855.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.52594972.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7206.47521295.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.54.625219712.5
AMZN[AMZN20220617C5200][AMZN20220617C5250]&L:AMZN20220617C5200&S:AMZN20220617C52501.6001160.0
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60011.85033555.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.32582660.0
2021-11-30AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1704.9002980.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.72595152.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7205.70021140.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.53.200216720.0
AMZN[AMZN20220617C5200][AMZN20220617C5250]&L:AMZN20220617C5200&S:AMZN20220617C52501.4751147.5
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60011.02533307.5
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.67582940.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1704.9002980.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.72595152.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7205.70021140.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.53.200216720.0
AMZN[AMZN20220617C5200][AMZN20220617C5250]&L:AMZN20220617C5200&S:AMZN20220617C52501.4751147.5
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60011.02533307.5
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.67582940.0
2021-12-01AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1704.6752935.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.32594792.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7204.2002840.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.52.675215617.5
AMZN[AMZN20220617C5200][AMZN20220617C5250]&L:AMZN20220617C5200&S:AMZN20220617C52501.2751127.5
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60010.02533007.5
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.67582940.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1704.6752935.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.32594792.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7204.2002840.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.52.675215617.5
AMZN[AMZN20220617C5200][AMZN20220617C5250]&L:AMZN20220617C5200&S:AMZN20220617C52501.2751127.5
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60010.02533007.5
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.67582940.0
2021-12-02AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1705.12521025.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.27594747.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7203.9502790.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.53.250216825.0
AMZN[AMZN20220617C5200][AMZN20220617C5250]&L:AMZN20220617C5200&S:AMZN20220617C52501.1501115.0
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60010.05033015.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.52582820.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1705.12521025.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.27594747.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7203.9502790.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.53.250216825.0
AMZN[AMZN20220617C5200][AMZN20220617C5250]&L:AMZN20220617C5200&S:AMZN20220617C52501.1501115.0
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60010.05033015.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.52582820.0
2021-12-03AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1704.6002920.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9107.22596502.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7203.4752695.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.53.800217980.0
AMZN[AMZN20220617C5200][AMZN20220617C5250]&L:AMZN20220617C5200&S:AMZN20220617C52500.02512.5
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60010.22533067.5
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.20082560.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1704.6002920.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9107.22596502.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7203.4752695.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.53.800217980.0
AMZN[AMZN20220617C5200][AMZN20220617C5250]&L:AMZN20220617C5200&S:AMZN20220617C52500.02512.5
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60010.22533067.5
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.20082560.0
2021-12-06AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1705.30021060.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9104.75094275.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7204.0002800.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.53.400217140.0
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60010.35033105.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.10082480.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1705.30021060.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9104.75094275.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7204.0002800.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.53.400217140.0
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60010.35033105.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.10082480.0
2021-12-07AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1705.57521115.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.05094545.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7204.4502890.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.53.700217770.0
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60010.05033015.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.02582420.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1705.57521115.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.05094545.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7204.4502890.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.53.700217770.0
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60010.05033015.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.02582420.0
2021-12-08AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1706.17521235.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.17594657.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7204.3502870.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.51.700213570.0
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C6009.95032985.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.30082640.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1706.17521235.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.17594657.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7204.3502870.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.51.700213570.0
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C6009.95032985.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.30082640.0
2021-12-09AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1705.97521195.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9104.42593982.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7203.4752695.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.53.325216982.5
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C6009.05032715.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.10082480.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1705.97521195.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9104.42593982.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7203.4752695.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.53.325216982.5
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C6009.05032715.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.10082480.0
2021-12-10AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1706.57521315.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.25094725.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7203.1752635.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.52.675215617.5
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60013.37534012.5
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1202.52582020.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1706.57521315.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.25094725.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7203.1752635.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.52.675215617.5
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60013.37534012.5
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1202.52582020.0
2021-12-13AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1705.30021060.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9102.97592677.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7202.9002580.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.52.425215092.5
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60012.85033855.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.00082400.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1705.30021060.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9102.97592677.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7202.9002580.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.52.425215092.5
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60012.85033855.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.00082400.0
2021-12-14AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1705.87521175.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9104.45094005.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7202.7752555.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.52.775215827.5
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60012.02533607.5
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.27582620.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1705.87521175.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9104.45094005.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7202.7752555.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.52.775215827.5
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60012.02533607.5
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.27582620.0
2021-12-15AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1706.55021310.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9104.77594297.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7202.7502550.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.53.000216300.0
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60012.95033885.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.60082880.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1706.55021310.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9104.77594297.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7202.7502550.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.53.000216300.0
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60012.95033885.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.60082880.0
2021-12-16AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1705.87521175.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9104.30093870.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7202.2002440.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.51.600213360.0
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60011.77533532.5
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.10082480.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1705.87521175.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9104.30093870.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7202.2002440.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.51.600213360.0
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60011.77533532.5
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.10082480.0
2021-12-17AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1705.25021050.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9104.27593847.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7202.0502410.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.52.500215250.0
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60011.47533442.5
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.02582420.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1705.25021050.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9104.27593847.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7202.0502410.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.52.500215250.0
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60011.47533442.5
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.02582420.0
2021-12-20AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1705.45021090.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9103.65093285.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7202.5252505.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.52.200214620.0
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60011.80033540.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.00082400.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1705.45021090.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9103.65093285.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7202.5252505.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.52.200214620.0
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60011.80033540.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.00082400.0
2021-12-21AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1705.90021180.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9103.50093150.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7202.7502550.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.52.525215302.5
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60012.85033855.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.47582780.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1705.90021180.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9103.50093150.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7202.7502550.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.52.525215302.5
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60012.85033855.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.47582780.0
2021-12-22AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1706.25021250.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9103.97593577.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7203.0752615.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.51.950214095.0
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60010.50033150.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.55082840.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1706.25021250.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9103.97593577.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7203.0752615.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.51.950214095.0
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60010.50033150.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.55082840.0
2021-12-23AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1706.32521265.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.22594702.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7203.0252605.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.52.900216090.0
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60010.42533127.5
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.67582940.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1706.32521265.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.22594702.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7203.0252605.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.52.900216090.0
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60010.42533127.5
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.67582940.0
2021-12-24AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1706.32521265.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.22594702.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7203.0252605.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.52.900216090.0
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60010.42533127.5
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.67582940.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1706.32521265.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.22594702.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7203.0252605.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.52.900216090.0
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60010.42533127.5
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.67582940.0
2021-12-27AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1706.72521345.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.17594657.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7202.8252565.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.53.425217192.5
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60010.60033180.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1204.07583260.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1706.72521345.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.17594657.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7202.8252565.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.53.425217192.5
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60010.60033180.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1204.07583260.0
2021-12-28AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1706.90021380.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9104.85094365.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7202.7252545.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.53.075216457.5
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60015.07534522.5
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.87583100.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1706.90021380.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9104.85094365.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7202.7252545.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.53.075216457.5
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60015.07534522.5
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.87583100.0
2021-12-29AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1706.60021320.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.32594792.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7202.6502530.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.53.050216405.0
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60013.37534012.5
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.62582900.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1706.60021320.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.32594792.5
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7202.6502530.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.53.050216405.0
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60013.37534012.5
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.62582900.0
2021-12-30AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1706.67521335.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.35094815.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7202.6502530.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.52.900216090.0
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60012.60033780.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.42582740.0
AAPL[AAPL20220617C160][AAPL20220617C170]&L:AAPL20220617C160&S:AAPL20220617C1706.67521335.0
TSLA[TSLA20220916C900][TSLA20220916C910]&L:TSLA20220916C900&S:TSLA20220916C9105.35094815.0
NFLX[NFLX20220318C700][NFLX20220318C720]&L:NFLX20220318C700&S:NFLX20220318C7202.6502530.0
NVDA[NVDA20230120C375][NVDA20230120C387.5]&L:NVDA20230120C375&S:NVDA20230120C387.52.900216090.0
COST[COST20230120C570][COST20230120C600]&L:COST20230120C570&S:COST20230120C60012.60033780.0
AMD[AMD20220617C115][AMD20220617C120]&L:AMD20220617C115&S:AMD20220617C1203.42582740.0
\n", - "
" - ], - "text/plain": [ - " long short \\\n", - "datetime symbol \n", - "2021-01-05 AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - "2021-01-06 AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - "2021-01-07 AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - "2021-01-08 AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - "2021-01-11 AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - "2021-01-12 AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - "2021-01-13 AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - "2021-01-14 AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - "2021-01-15 AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - "2021-01-18 AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - "2021-01-19 AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - "2021-01-20 AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - "2021-01-21 AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - "2021-01-22 AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - " AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - "2021-01-25 AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - " AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - "2021-01-26 AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - " AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - "2021-01-27 AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - " AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - "2021-01-28 AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - " AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - "2021-01-29 AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - " AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - "2021-02-01 AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - " AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - "2021-02-02 AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - " AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - "2021-02-03 AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - " AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - "2021-02-04 AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - " AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - "2021-02-05 AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - " AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - "2021-02-08 AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - " AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - "2021-02-09 AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - " AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - "2021-02-10 AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - " AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - "2021-02-11 AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - " AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - "2021-02-12 AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - " AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - "2021-02-15 AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - " AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - "2021-02-16 AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - " AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - "2021-02-17 AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - " AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - "2021-02-18 AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - " NVDA [NVDA20220121C740] [NVDA20220121C760] \n", - " AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - " NVDA [NVDA20220121C740] [NVDA20220121C760] \n", - "2021-02-19 AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - " NVDA [NVDA20220121C740] [NVDA20220121C760] \n", - " AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - " NVDA [NVDA20220121C740] [NVDA20220121C760] \n", - "2021-02-22 AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - " NVDA [NVDA20220121C740] [NVDA20220121C760] \n", - " AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - " NVDA [NVDA20220121C740] [NVDA20220121C760] \n", - "2021-02-23 AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - " NVDA [NVDA20220121C740] [NVDA20220121C760] \n", - " AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - " NVDA [NVDA20220121C740] [NVDA20220121C760] \n", - "2021-02-24 AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - " NVDA [NVDA20220121C740] [NVDA20220121C760] \n", - " AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - " NVDA [NVDA20220121C740] [NVDA20220121C760] \n", - "2021-02-25 AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - " NVDA [NVDA20220121C740] [NVDA20220121C760] \n", - " AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - " NVDA [NVDA20220121C740] [NVDA20220121C760] \n", - "2021-02-26 AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - " NVDA [NVDA20220121C740] [NVDA20220121C760] \n", - " AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - " NVDA [NVDA20220121C740] [NVDA20220121C760] \n", - "2021-03-01 AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - " NVDA [NVDA20220121C740] [NVDA20220121C760] \n", - " AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - " NVDA [NVDA20220121C740] [NVDA20220121C760] \n", - "2021-03-02 AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - " NVDA [NVDA20220121C740] [NVDA20220121C760] \n", - " AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - " NVDA [NVDA20220121C740] [NVDA20220121C760] \n", - "2021-03-03 AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - " NVDA [NVDA20220121C740] [NVDA20220121C760] \n", - " AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - " NVDA [NVDA20220121C740] [NVDA20220121C760] \n", - "2021-03-04 AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - " NVDA [NVDA20220121C740] [NVDA20220121C760] \n", - " AAPL [AAPL20220121C165] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - " NVDA [NVDA20220121C740] [NVDA20220121C760] \n", - "2021-03-05 TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - "2021-03-08 TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NFLX [NFLX20220121C650] [NFLX20220121C660] \n", - "2021-03-09 TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - "2021-03-10 TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - "2021-03-11 TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - "2021-03-12 TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - "2021-03-15 TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - "2021-03-16 AAPL [AAPL20220121C160] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " AAPL [AAPL20220121C160] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - "2021-03-17 AAPL [AAPL20220121C160] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " AAPL [AAPL20220121C160] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - "2021-03-18 AAPL [AAPL20220121C160] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " AAPL [AAPL20220121C160] [AAPL20220121C175] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - "2021-03-19 TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - "2021-03-22 TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - "2021-03-23 AAPL [AAPL20220121C145] [AAPL20220121C155] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " AAPL [AAPL20220121C145] [AAPL20220121C155] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - "2021-03-24 AAPL [AAPL20220121C145] [AAPL20220121C155] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " AAPL [AAPL20220121C145] [AAPL20220121C155] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - "2021-03-25 TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - "2021-03-26 TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - "2021-03-29 TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - "2021-03-30 TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - "2021-03-31 TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - "2021-04-01 TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - "2021-04-02 TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - "2021-04-05 TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - "2021-04-06 AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - "2021-04-07 AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - "2021-04-08 AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - "2021-04-09 AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - "2021-04-12 AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - "2021-04-13 AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - "2021-04-14 AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4350] [AMZN20220121C4400] \n", - " AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4350] [AMZN20220121C4400] \n", - "2021-04-15 AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4350] [AMZN20220121C4400] \n", - " AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4350] [AMZN20220121C4400] \n", - "2021-04-16 AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4350] [AMZN20220121C4400] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4350] [AMZN20220121C4400] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - "2021-04-19 AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4350] [AMZN20220121C4400] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4350] [AMZN20220121C4400] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - "2021-04-20 AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4350] [AMZN20220121C4400] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - " AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4350] [AMZN20220121C4400] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - "2021-04-21 AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4350] [AMZN20220121C4400] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - " AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4350] [AMZN20220121C4400] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - "2021-04-22 AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4350] [AMZN20220121C4400] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - " AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4350] [AMZN20220121C4400] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - "2021-04-23 AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4350] [AMZN20220121C4400] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - " AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4350] [AMZN20220121C4400] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - "2021-04-26 AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4350] [AMZN20220121C4400] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - " AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4350] [AMZN20220121C4400] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - "2021-04-27 AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4350] [AMZN20220121C4400] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - " AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4350] [AMZN20220121C4400] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - "2021-04-28 AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4350] [AMZN20220121C4400] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - " AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4350] [AMZN20220121C4400] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - "2021-04-29 AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4350] [AMZN20220121C4400] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - " AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4350] [AMZN20220121C4400] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - "2021-04-30 AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4350] [AMZN20220121C4400] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - " AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4350] [AMZN20220121C4400] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - "2021-05-03 AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4350] [AMZN20220121C4400] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - " AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4350] [AMZN20220121C4400] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - "2021-05-04 AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4350] [AMZN20220121C4400] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - " AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4350] [AMZN20220121C4400] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - "2021-05-05 AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4350] [AMZN20220121C4400] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - " AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4350] [AMZN20220121C4400] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - "2021-05-06 AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4350] [AMZN20220121C4400] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - " AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4350] [AMZN20220121C4400] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - "2021-05-07 AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4350] [AMZN20220121C4400] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - " AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4350] [AMZN20220121C4400] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - "2021-05-10 AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4350] [AMZN20220121C4400] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - " AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4350] [AMZN20220121C4400] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - "2021-05-11 AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - " AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " TSLA [TSLA20220121C920] [TSLA20220121C930] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - "2021-05-12 AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - " AAPL [AAPL20220617C165] [AAPL20220617C180] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " BA [BA20220121C325] [BA20220121C335] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - "2021-05-13 NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - "2021-05-14 NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - "2021-05-17 AAPL [AAPL20220617C150] [AAPL20220617C160] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - " AAPL [AAPL20220617C150] [AAPL20220617C160] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - "2021-05-18 AAPL [AAPL20220617C150] [AAPL20220617C160] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - " AAPL [AAPL20220617C150] [AAPL20220617C160] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - "2021-05-19 NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - "2021-05-20 NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - "2021-05-21 AAPL [AAPL20220617C150] [AAPL20220617C160] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - " AAPL [AAPL20220617C150] [AAPL20220617C160] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - "2021-05-24 NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - "2021-05-25 NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - "2021-05-26 NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - "2021-05-27 NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - "2021-05-28 NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - "2021-05-31 NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - "2021-06-01 NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - "2021-06-02 NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - "2021-06-03 NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - "2021-06-04 NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - "2021-06-07 NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - "2021-06-08 NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - "2021-06-09 NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - "2021-06-10 NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - "2021-06-11 NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - "2021-06-14 NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - "2021-06-15 NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - "2021-06-16 NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - "2021-06-17 NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - "2021-06-18 NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C140] [SBUX20220121C160] \n", - "2021-06-21 NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - "2021-06-22 NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - "2021-06-23 NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - "2021-06-24 NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - "2021-06-25 NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - "2021-06-28 NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - "2021-06-29 NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - "2021-06-30 NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - "2021-07-01 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C125] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C125] \n", - "2021-07-02 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C125] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C125] \n", - "2021-07-05 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C125] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C125] \n", - "2021-07-06 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C125] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C125] \n", - "2021-07-07 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C125] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C125] \n", - "2021-07-08 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C125] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C125] \n", - "2021-07-09 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C125] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C125] \n", - "2021-07-12 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C125] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C125] \n", - "2021-07-13 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C125] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C125] \n", - "2021-07-14 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C130] [SBUX20220121C140] \n", - " AMD [AMD20220617C115] [AMD20220617C125] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C130] [SBUX20220121C140] \n", - " AMD [AMD20220617C115] [AMD20220617C125] \n", - "2021-07-15 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220617C640] [NFLX20220617C650] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C130] [SBUX20220121C140] \n", - " AMD [AMD20220617C115] [AMD20220617C125] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220617C640] [NFLX20220617C650] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C130] [SBUX20220121C140] \n", - " AMD [AMD20220617C115] [AMD20220617C125] \n", - "2021-07-16 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220617C640] [NFLX20220617C650] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C130] [SBUX20220121C140] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220617C640] [NFLX20220617C650] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C130] [SBUX20220121C140] \n", - "2021-07-19 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220617C640] [NFLX20220617C650] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C130] [SBUX20220121C140] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220617C640] [NFLX20220617C650] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220121C130] [SBUX20220121C140] \n", - "2021-07-20 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220617C640] [NFLX20220617C650] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220617C640] [NFLX20220617C650] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - "2021-07-21 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220617C640] [NFLX20220617C650] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220617C640] [NFLX20220617C650] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - "2021-07-22 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220617C140] [SBUX20220617C150] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220617C140] [SBUX20220617C150] \n", - "2021-07-23 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220617C140] [SBUX20220617C150] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220617C140] [SBUX20220617C150] \n", - "2021-07-26 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220617C140] [SBUX20220617C150] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220617C140] [SBUX20220617C150] \n", - "2021-07-27 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220617C140] [SBUX20220617C150] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220617C140] [SBUX20220617C150] \n", - "2021-07-28 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220617C140] [SBUX20220617C150] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220617C140] [SBUX20220617C150] \n", - "2021-07-29 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220617C140] [SBUX20220617C150] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220617C140] [SBUX20220617C150] \n", - "2021-07-30 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220617C140] [SBUX20220617C150] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4550] [AMZN20220121C4600] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220617C140] [SBUX20220617C150] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-08-02 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220617C140] [SBUX20220617C150] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220617C140] [SBUX20220617C150] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-08-03 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220617C140] [SBUX20220617C150] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220617C140] [SBUX20220617C150] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-08-04 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220617C140] [SBUX20220617C150] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220617C140] [SBUX20220617C150] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-08-05 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220617C140] [SBUX20220617C150] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220617C140] [SBUX20220617C150] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-08-06 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220617C140] [SBUX20220617C150] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220617C140] [SBUX20220617C150] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-08-09 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220617C140] [SBUX20220617C150] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220617C140] [SBUX20220617C150] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-08-10 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220617C140] [SBUX20220617C150] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220617C140] [SBUX20220617C150] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-08-11 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220617C140] [SBUX20220617C150] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220617C140] [SBUX20220617C150] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-08-12 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220617C140] [SBUX20220617C150] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220617C140] [SBUX20220617C150] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-08-13 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220617C140] [SBUX20220617C150] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220617C140] [SBUX20220617C150] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-08-16 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220617C140] [SBUX20220617C150] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220617C140] [SBUX20220617C150] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-08-17 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220617C140] [SBUX20220617C150] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220617C140] [SBUX20220617C150] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-08-18 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220617C140] [SBUX20220617C150] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220617C140] [SBUX20220617C150] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-08-19 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220617C140] [SBUX20220617C150] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " SBUX [SBUX20220617C140] [SBUX20220617C150] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-08-20 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-08-23 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-08-24 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-08-25 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-08-26 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-08-27 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-08-30 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-08-31 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-09-01 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4650] [AMZN20220121C4750] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4650] [AMZN20220121C4750] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-09-02 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4650] [AMZN20220121C4750] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4650] [AMZN20220121C4750] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-09-03 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4650] [AMZN20220121C4750] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4650] [AMZN20220121C4750] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-09-06 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4650] [AMZN20220121C4750] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4650] [AMZN20220121C4750] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-09-07 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4650] [AMZN20220121C4750] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4650] [AMZN20220121C4750] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-09-08 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4650] [AMZN20220121C4750] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4650] [AMZN20220121C4750] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-09-09 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4650] [AMZN20220121C4750] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4650] [AMZN20220121C4750] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-09-10 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4650] [AMZN20220121C4750] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4650] [AMZN20220121C4750] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-09-13 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4650] [AMZN20220121C4750] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4650] [AMZN20220121C4750] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-09-14 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4650] [AMZN20220121C4750] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4650] [AMZN20220121C4750] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-09-15 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4650] [AMZN20220121C4750] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4650] [AMZN20220121C4750] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-09-16 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4650] [AMZN20220121C4750] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4650] [AMZN20220121C4750] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-09-17 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4650] [AMZN20220121C4750] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4650] [AMZN20220121C4750] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-09-20 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4650] [AMZN20220121C4750] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " AMZN [AMZN20220121C4650] [AMZN20220121C4750] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-09-21 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-09-22 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-09-23 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-09-24 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-09-27 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-09-28 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-09-29 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-09-30 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-10-01 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-10-04 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-10-05 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-10-06 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-10-07 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-10-08 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-10-11 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-10-12 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-10-13 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-10-14 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-10-15 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-10-18 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-10-19 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-10-20 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-10-21 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-10-22 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220121C330] [META20220121C335] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-10-25 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-10-26 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-10-27 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-10-28 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-10-29 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-11-01 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-11-02 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-11-03 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-11-04 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-11-05 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-11-08 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-11-09 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-11-10 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-11-11 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-11-12 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-11-15 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-11-16 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220916C380] [META20220916C385] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220916C380] [META20220916C385] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-11-17 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220916C380] [META20220916C385] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220916C380] [META20220916C385] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-11-18 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220916C380] [META20220916C385] \n", - " AMZN [AMZN20220617C5200] [AMZN20220617C5250] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220916C380] [META20220916C385] \n", - " AMZN [AMZN20220617C5200] [AMZN20220617C5250] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-11-19 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220916C380] [META20220916C385] \n", - " AMZN [AMZN20220617C5200] [AMZN20220617C5250] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220916C380] [META20220916C385] \n", - " AMZN [AMZN20220617C5200] [AMZN20220617C5250] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-11-22 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20220121C680] [NVDA20220121C700] \n", - " META [META20220916C380] [META20220916C385] \n", - " AMZN [AMZN20220617C5200] [AMZN20220617C5250] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " META [META20220916C380] [META20220916C385] \n", - " AMZN [AMZN20220617C5200] [AMZN20220617C5250] \n", - " COST [COST20220121C430] [COST20220121C440] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " META [META20220916C380] [META20220916C385] \n", - " AMZN [AMZN20220617C5200] [AMZN20220617C5250] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " META [META20220916C380] [META20220916C385] \n", - " AMZN [AMZN20220617C5200] [AMZN20220617C5250] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-11-23 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " META [META20220916C380] [META20220916C385] \n", - " AMZN [AMZN20220617C5200] [AMZN20220617C5250] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " META [META20220916C380] [META20220916C385] \n", - " AMZN [AMZN20220617C5200] [AMZN20220617C5250] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-11-24 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " META [META20220916C380] [META20220916C385] \n", - " AMZN [AMZN20220617C5200] [AMZN20220617C5250] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " META [META20220916C380] [META20220916C385] \n", - " AMZN [AMZN20220617C5200] [AMZN20220617C5250] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-11-25 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " META [META20220916C380] [META20220916C385] \n", - " AMZN [AMZN20220617C5200] [AMZN20220617C5250] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " META [META20220916C380] [META20220916C385] \n", - " AMZN [AMZN20220617C5200] [AMZN20220617C5250] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-11-26 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " META [META20220916C380] [META20220916C385] \n", - " AMZN [AMZN20220617C5200] [AMZN20220617C5250] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " META [META20220916C380] [META20220916C385] \n", - " AMZN [AMZN20220617C5200] [AMZN20220617C5250] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-11-29 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " AMZN [AMZN20220617C5200] [AMZN20220617C5250] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " AMZN [AMZN20220617C5200] [AMZN20220617C5250] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-11-30 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " AMZN [AMZN20220617C5200] [AMZN20220617C5250] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " AMZN [AMZN20220617C5200] [AMZN20220617C5250] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-12-01 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " AMZN [AMZN20220617C5200] [AMZN20220617C5250] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " AMZN [AMZN20220617C5200] [AMZN20220617C5250] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-12-02 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " AMZN [AMZN20220617C5200] [AMZN20220617C5250] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " AMZN [AMZN20220617C5200] [AMZN20220617C5250] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-12-03 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " AMZN [AMZN20220617C5200] [AMZN20220617C5250] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " AMZN [AMZN20220617C5200] [AMZN20220617C5250] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-12-06 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-12-07 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-12-08 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-12-09 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-12-10 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-12-13 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-12-14 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-12-15 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-12-16 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-12-17 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-12-20 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-12-21 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-12-22 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-12-23 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-12-24 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-12-27 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-12-28 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-12-29 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "2021-12-30 AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - " AAPL [AAPL20220617C160] [AAPL20220617C170] \n", - " TSLA [TSLA20220916C900] [TSLA20220916C910] \n", - " NFLX [NFLX20220318C700] [NFLX20220318C720] \n", - " NVDA [NVDA20230120C375] [NVDA20230120C387.5] \n", - " COST [COST20230120C570] [COST20230120C600] \n", - " AMD [AMD20220617C115] [AMD20220617C120] \n", - "\n", - " trade_id close quantity \\\n", - "datetime symbol \n", - "2021-01-05 AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.825 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.275 6 \n", - " AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.825 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.275 6 \n", - "2021-01-06 AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.625 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.350 6 \n", - " AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.625 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.350 6 \n", - "2021-01-07 AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.875 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.625 6 \n", - " AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.875 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.625 6 \n", - "2021-01-08 AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.950 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 3.075 6 \n", - " AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.950 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 3.075 6 \n", - "2021-01-11 AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.800 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.650 6 \n", - " AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.800 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.650 6 \n", - "2021-01-12 AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.750 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.850 6 \n", - " AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.750 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.850 6 \n", - "2021-01-13 AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.850 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.925 6 \n", - " AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.850 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.925 6 \n", - "2021-01-14 AAPL &L:AAPL20220121C165&S:AAPL20220121C175 2.300 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.825 6 \n", - " AAPL &L:AAPL20220121C165&S:AAPL20220121C175 2.300 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.825 6 \n", - "2021-01-15 AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.575 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.875 6 \n", - " AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.575 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.875 6 \n", - "2021-01-18 AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.600 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.975 6 \n", - " AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.600 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.975 6 \n", - "2021-01-19 AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.600 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.975 6 \n", - " AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.600 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.975 6 \n", - "2021-01-20 AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.925 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 3.000 6 \n", - " AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.925 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 3.000 6 \n", - "2021-01-21 AAPL &L:AAPL20220121C165&S:AAPL20220121C175 2.225 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 3.250 6 \n", - " AAPL &L:AAPL20220121C165&S:AAPL20220121C175 2.225 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 3.250 6 \n", - "2021-01-22 AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.875 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 3.000 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 3.150 3 \n", - " AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.875 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 3.000 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 3.150 3 \n", - "2021-01-25 AAPL &L:AAPL20220121C165&S:AAPL20220121C175 2.700 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 3.100 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.825 3 \n", - " AAPL &L:AAPL20220121C165&S:AAPL20220121C175 2.700 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 3.100 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.825 3 \n", - "2021-01-26 AAPL &L:AAPL20220121C165&S:AAPL20220121C175 2.675 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.825 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.900 3 \n", - " AAPL &L:AAPL20220121C165&S:AAPL20220121C175 2.675 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.825 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.900 3 \n", - "2021-01-27 AAPL &L:AAPL20220121C165&S:AAPL20220121C175 3.050 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.975 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.300 3 \n", - " AAPL &L:AAPL20220121C165&S:AAPL20220121C175 3.050 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.975 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.300 3 \n", - "2021-01-28 AAPL &L:AAPL20220121C165&S:AAPL20220121C175 2.025 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.800 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.625 3 \n", - " AAPL &L:AAPL20220121C165&S:AAPL20220121C175 2.025 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.800 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.625 3 \n", - "2021-01-29 AAPL &L:AAPL20220121C165&S:AAPL20220121C175 2.125 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.600 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.525 3 \n", - " AAPL &L:AAPL20220121C165&S:AAPL20220121C175 2.125 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.600 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.525 3 \n", - "2021-02-01 AAPL &L:AAPL20220121C165&S:AAPL20220121C175 2.050 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.775 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.650 3 \n", - " AAPL &L:AAPL20220121C165&S:AAPL20220121C175 2.050 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.775 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.650 3 \n", - "2021-02-02 AAPL &L:AAPL20220121C165&S:AAPL20220121C175 2.275 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 3.100 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.875 3 \n", - " AAPL &L:AAPL20220121C165&S:AAPL20220121C175 2.275 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 3.100 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.875 3 \n", - "2021-02-03 AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.975 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 3.000 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.550 3 \n", - " AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.975 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 3.000 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.550 3 \n", - "2021-02-04 AAPL &L:AAPL20220121C165&S:AAPL20220121C175 2.200 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 3.050 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.575 3 \n", - " AAPL &L:AAPL20220121C165&S:AAPL20220121C175 2.200 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 3.050 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.575 3 \n", - "2021-02-05 AAPL &L:AAPL20220121C165&S:AAPL20220121C175 2.150 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 3.100 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.700 3 \n", - " AAPL &L:AAPL20220121C165&S:AAPL20220121C175 2.150 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 3.100 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.700 3 \n", - "2021-02-08 AAPL &L:AAPL20220121C165&S:AAPL20220121C175 2.175 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.975 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 4.175 3 \n", - " AAPL &L:AAPL20220121C165&S:AAPL20220121C175 2.175 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.975 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 4.175 3 \n", - "2021-02-09 AAPL &L:AAPL20220121C165&S:AAPL20220121C175 2.075 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 3.150 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.925 3 \n", - " AAPL &L:AAPL20220121C165&S:AAPL20220121C175 2.075 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 3.150 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.925 3 \n", - "2021-02-10 AAPL &L:AAPL20220121C165&S:AAPL20220121C175 2.025 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.975 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.900 3 \n", - " AAPL &L:AAPL20220121C165&S:AAPL20220121C175 2.025 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.975 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.900 3 \n", - "2021-02-11 AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.925 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.950 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.825 3 \n", - " AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.925 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.950 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.825 3 \n", - "2021-02-12 AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.975 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.950 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.925 3 \n", - " AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.975 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.950 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.925 3 \n", - "2021-02-15 AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.875 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.700 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.875 3 \n", - " AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.875 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.700 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.875 3 \n", - "2021-02-16 AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.875 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.700 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.875 3 \n", - " AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.875 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.700 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.875 3 \n", - "2021-02-17 AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.700 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.925 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.775 3 \n", - " AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.700 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.925 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.775 3 \n", - "2021-02-18 AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.550 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.850 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.775 3 \n", - " NVDA &L:NVDA20220121C740&S:NVDA20220121C760 4.425 8 \n", - " AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.550 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.850 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.775 3 \n", - " NVDA &L:NVDA20220121C740&S:NVDA20220121C760 4.425 8 \n", - "2021-02-19 AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.600 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.800 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.375 3 \n", - " NVDA &L:NVDA20220121C740&S:NVDA20220121C760 4.625 8 \n", - " AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.600 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.800 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.375 3 \n", - " NVDA &L:NVDA20220121C740&S:NVDA20220121C760 4.625 8 \n", - "2021-02-22 AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.600 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.550 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.800 3 \n", - " NVDA &L:NVDA20220121C740&S:NVDA20220121C760 4.100 8 \n", - " AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.600 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.550 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.800 3 \n", - " NVDA &L:NVDA20220121C740&S:NVDA20220121C760 4.100 8 \n", - "2021-02-23 AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.375 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.125 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.800 3 \n", - " NVDA &L:NVDA20220121C740&S:NVDA20220121C760 4.000 8 \n", - " AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.375 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.125 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.800 3 \n", - " NVDA &L:NVDA20220121C740&S:NVDA20220121C760 4.000 8 \n", - "2021-02-24 AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.425 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.600 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.500 3 \n", - " NVDA &L:NVDA20220121C740&S:NVDA20220121C760 5.000 8 \n", - " AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.425 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.600 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.500 3 \n", - " NVDA &L:NVDA20220121C740&S:NVDA20220121C760 5.000 8 \n", - "2021-02-25 AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.150 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.025 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.700 3 \n", - " NVDA &L:NVDA20220121C740&S:NVDA20220121C760 3.275 8 \n", - " AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.150 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.025 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.700 3 \n", - " NVDA &L:NVDA20220121C740&S:NVDA20220121C760 3.275 8 \n", - "2021-02-26 AAPL &L:AAPL20220121C165&S:AAPL20220121C175 0.900 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.625 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.500 3 \n", - " NVDA &L:NVDA20220121C740&S:NVDA20220121C760 4.450 8 \n", - " AAPL &L:AAPL20220121C165&S:AAPL20220121C175 0.900 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.625 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.500 3 \n", - " NVDA &L:NVDA20220121C740&S:NVDA20220121C760 4.450 8 \n", - "2021-03-01 AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.425 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.350 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 3.275 3 \n", - " NVDA &L:NVDA20220121C740&S:NVDA20220121C760 3.625 8 \n", - " AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.425 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.350 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 3.275 3 \n", - " NVDA &L:NVDA20220121C740&S:NVDA20220121C760 3.625 8 \n", - "2021-03-02 AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.275 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.275 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.825 3 \n", - " NVDA &L:NVDA20220121C740&S:NVDA20220121C760 3.025 8 \n", - " AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.275 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.275 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.825 3 \n", - " NVDA &L:NVDA20220121C740&S:NVDA20220121C760 3.025 8 \n", - "2021-03-03 AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.075 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 1.950 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.475 3 \n", - " NVDA &L:NVDA20220121C740&S:NVDA20220121C760 2.350 8 \n", - " AAPL &L:AAPL20220121C165&S:AAPL20220121C175 1.075 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 1.950 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.475 3 \n", - " NVDA &L:NVDA20220121C740&S:NVDA20220121C760 2.350 8 \n", - "2021-03-04 AAPL &L:AAPL20220121C165&S:AAPL20220121C175 0.950 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 1.725 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 1.900 3 \n", - " NVDA &L:NVDA20220121C740&S:NVDA20220121C760 2.375 8 \n", - " AAPL &L:AAPL20220121C165&S:AAPL20220121C175 0.950 8 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 1.725 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 1.900 3 \n", - " NVDA &L:NVDA20220121C740&S:NVDA20220121C760 2.375 8 \n", - "2021-03-05 TSLA &L:TSLA20220121C920&S:TSLA20220121C930 1.500 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.350 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 1.500 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.350 3 \n", - "2021-03-08 TSLA &L:TSLA20220121C920&S:TSLA20220121C930 1.225 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.375 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 1.225 6 \n", - " NFLX &L:NFLX20220121C650&S:NFLX20220121C660 2.375 3 \n", - "2021-03-09 TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.050 6 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.050 6 \n", - "2021-03-10 TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.050 6 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.050 6 \n", - "2021-03-11 TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.250 6 \n", - " BA &L:BA20220121C325&S:BA20220121C335 1.975 5 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.250 6 \n", - " BA &L:BA20220121C325&S:BA20220121C335 1.975 5 \n", - "2021-03-12 TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.200 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 3.475 5 \n", - " BA &L:BA20220121C325&S:BA20220121C335 2.525 5 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.200 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 3.475 5 \n", - " BA &L:BA20220121C325&S:BA20220121C335 2.525 5 \n", - "2021-03-15 TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.300 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 3.425 5 \n", - " BA &L:BA20220121C325&S:BA20220121C335 2.300 5 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.300 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 3.425 5 \n", - " BA &L:BA20220121C325&S:BA20220121C335 2.300 5 \n", - "2021-03-16 AAPL &L:AAPL20220121C160&S:AAPL20220121C175 2.000 4 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.125 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 4.225 5 \n", - " BA &L:BA20220121C325&S:BA20220121C335 2.075 5 \n", - " AAPL &L:AAPL20220121C160&S:AAPL20220121C175 2.000 4 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.125 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 4.225 5 \n", - " BA &L:BA20220121C325&S:BA20220121C335 2.075 5 \n", - "2021-03-17 AAPL &L:AAPL20220121C160&S:AAPL20220121C175 1.950 4 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.300 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 3.450 5 \n", - " BA &L:BA20220121C325&S:BA20220121C335 2.300 5 \n", - " AAPL &L:AAPL20220121C160&S:AAPL20220121C175 1.950 4 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.300 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 3.450 5 \n", - " BA &L:BA20220121C325&S:BA20220121C335 2.300 5 \n", - "2021-03-18 AAPL &L:AAPL20220121C160&S:AAPL20220121C175 1.650 4 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.000 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 3.075 5 \n", - " BA &L:BA20220121C325&S:BA20220121C335 2.100 5 \n", - " AAPL &L:AAPL20220121C160&S:AAPL20220121C175 1.650 4 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.000 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 3.075 5 \n", - " BA &L:BA20220121C325&S:BA20220121C335 2.100 5 \n", - "2021-03-19 TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.000 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 4.200 5 \n", - " BA &L:BA20220121C325&S:BA20220121C335 2.025 5 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.000 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 4.200 5 \n", - " BA &L:BA20220121C325&S:BA20220121C335 2.025 5 \n", - "2021-03-22 TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.075 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 3.575 5 \n", - " BA &L:BA20220121C325&S:BA20220121C335 1.775 5 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.075 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 3.575 5 \n", - " BA &L:BA20220121C325&S:BA20220121C335 1.775 5 \n", - "2021-03-23 AAPL &L:AAPL20220121C145&S:AAPL20220121C155 1.900 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.050 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 3.350 5 \n", - " BA &L:BA20220121C325&S:BA20220121C335 1.575 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.975 2 \n", - " AAPL &L:AAPL20220121C145&S:AAPL20220121C155 1.900 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.050 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 3.350 5 \n", - " BA &L:BA20220121C325&S:BA20220121C335 1.575 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.975 2 \n", - "2021-03-24 AAPL &L:AAPL20220121C145&S:AAPL20220121C155 1.675 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 1.775 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 2.950 5 \n", - " BA &L:BA20220121C325&S:BA20220121C335 1.450 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.350 2 \n", - " AAPL &L:AAPL20220121C145&S:AAPL20220121C155 1.675 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 1.775 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 2.950 5 \n", - " BA &L:BA20220121C325&S:BA20220121C335 1.450 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.350 2 \n", - "2021-03-25 TSLA &L:TSLA20220121C920&S:TSLA20220121C930 1.800 6 \n", - " BA &L:BA20220121C325&S:BA20220121C335 1.650 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.300 2 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 1.800 6 \n", - " BA &L:BA20220121C325&S:BA20220121C335 1.650 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.300 2 \n", - "2021-03-26 TSLA &L:TSLA20220121C920&S:TSLA20220121C930 1.625 6 \n", - " BA &L:BA20220121C325&S:BA20220121C335 1.650 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.375 2 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 1.625 6 \n", - " BA &L:BA20220121C325&S:BA20220121C335 1.650 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.375 2 \n", - "2021-03-29 TSLA &L:TSLA20220121C920&S:TSLA20220121C930 1.575 6 \n", - " BA &L:BA20220121C325&S:BA20220121C335 1.800 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.575 2 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 1.575 6 \n", - " BA &L:BA20220121C325&S:BA20220121C335 1.800 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.575 2 \n", - "2021-03-30 TSLA &L:TSLA20220121C920&S:TSLA20220121C930 1.700 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 3.425 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 1.950 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.500 2 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 1.700 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 3.425 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 1.950 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.500 2 \n", - "2021-03-31 TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.050 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 3.550 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 1.675 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.000 2 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.050 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 3.550 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 1.675 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.000 2 \n", - "2021-04-01 TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.000 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 4.125 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 1.500 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.825 2 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.000 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 4.125 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 1.500 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.825 2 \n", - "2021-04-02 TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.000 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 4.125 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 1.500 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.825 2 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.000 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 4.125 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 1.500 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.825 2 \n", - "2021-04-05 TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.100 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 4.225 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 2.800 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.925 2 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.100 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 4.225 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 2.800 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.925 2 \n", - "2021-04-06 AAPL &L:AAPL20220617C165&S:AAPL20220617C180 1.925 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.200 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 4.175 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 1.800 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.850 2 \n", - " AAPL &L:AAPL20220617C165&S:AAPL20220617C180 1.925 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.200 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 4.175 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 1.800 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.850 2 \n", - "2021-04-07 AAPL &L:AAPL20220617C165&S:AAPL20220617C180 2.075 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.125 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 4.000 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 1.375 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.925 2 \n", - " AAPL &L:AAPL20220617C165&S:AAPL20220617C180 2.075 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.125 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 4.000 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 1.375 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.925 2 \n", - "2021-04-08 AAPL &L:AAPL20220617C165&S:AAPL20220617C180 2.350 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.150 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 4.700 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 1.525 5 \n", - " META &L:META20220121C330&S:META20220121C335 2.000 2 \n", - " AAPL &L:AAPL20220617C165&S:AAPL20220617C180 2.350 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.150 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 4.700 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 1.525 5 \n", - " META &L:META20220121C330&S:META20220121C335 2.000 2 \n", - "2021-04-09 AAPL &L:AAPL20220617C165&S:AAPL20220617C180 2.575 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 1.975 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 4.900 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 1.750 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.950 2 \n", - " AAPL &L:AAPL20220617C165&S:AAPL20220617C180 2.575 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 1.975 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 4.900 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 1.750 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.950 2 \n", - "2021-04-12 AAPL &L:AAPL20220617C165&S:AAPL20220617C180 2.500 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.225 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 6.075 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 1.550 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.375 2 \n", - " AAPL &L:AAPL20220617C165&S:AAPL20220617C180 2.500 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.225 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 6.075 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 1.550 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.375 2 \n", - "2021-04-13 AAPL &L:AAPL20220617C165&S:AAPL20220617C180 2.775 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.700 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 7.450 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 1.025 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.875 2 \n", - " AAPL &L:AAPL20220617C165&S:AAPL20220617C180 2.775 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.700 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 7.450 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 1.025 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.875 2 \n", - "2021-04-14 AAPL &L:AAPL20220617C165&S:AAPL20220617C180 2.625 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.700 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 5.000 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 2.125 5 \n", - " META &L:META20220121C330&S:META20220121C335 2.125 2 \n", - " AMZN &L:AMZN20220121C4350&S:AMZN20220121C4400 5.625 2 \n", - " AAPL &L:AAPL20220617C165&S:AAPL20220617C180 2.625 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.700 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 5.000 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 2.125 5 \n", - " META &L:META20220121C330&S:META20220121C335 2.125 2 \n", - " AMZN &L:AMZN20220121C4350&S:AMZN20220121C4400 5.625 2 \n", - "2021-04-15 AAPL &L:AAPL20220617C165&S:AAPL20220617C180 2.825 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.525 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 7.325 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 1.375 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.400 2 \n", - " AMZN &L:AMZN20220121C4350&S:AMZN20220121C4400 6.525 2 \n", - " AAPL &L:AAPL20220617C165&S:AAPL20220617C180 2.825 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.525 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 7.325 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 1.375 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.400 2 \n", - " AMZN &L:AMZN20220121C4350&S:AMZN20220121C4400 6.525 2 \n", - "2021-04-16 AAPL &L:AAPL20220617C165&S:AAPL20220617C180 2.775 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.575 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 6.650 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 1.575 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.725 2 \n", - " AMZN &L:AMZN20220121C4350&S:AMZN20220121C4400 6.700 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.450 4 \n", - " AAPL &L:AAPL20220617C165&S:AAPL20220617C180 2.775 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.575 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 6.650 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 1.575 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.725 2 \n", - " AMZN &L:AMZN20220121C4350&S:AMZN20220121C4400 6.700 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.450 4 \n", - "2021-04-19 AAPL &L:AAPL20220617C165&S:AAPL20220617C180 2.775 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.325 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 6.225 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 2.450 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.625 2 \n", - " AMZN &L:AMZN20220121C4350&S:AMZN20220121C4400 6.475 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.700 4 \n", - " AAPL &L:AAPL20220617C165&S:AAPL20220617C180 2.775 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.325 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 6.225 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 2.450 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.625 2 \n", - " AMZN &L:AMZN20220121C4350&S:AMZN20220121C4400 6.475 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.700 4 \n", - "2021-04-20 AAPL &L:AAPL20220617C165&S:AAPL20220617C180 2.600 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.275 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 6.025 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 0.800 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.700 2 \n", - " AMZN &L:AMZN20220121C4350&S:AMZN20220121C4400 5.375 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.550 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.635 4 \n", - " AAPL &L:AAPL20220617C165&S:AAPL20220617C180 2.600 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.275 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 6.025 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 0.800 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.700 2 \n", - " AMZN &L:AMZN20220121C4350&S:AMZN20220121C4400 5.375 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.550 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.635 4 \n", - "2021-04-21 AAPL &L:AAPL20220617C165&S:AAPL20220617C180 2.575 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.425 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 6.250 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 0.825 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.750 2 \n", - " AMZN &L:AMZN20220121C4350&S:AMZN20220121C4400 5.950 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.925 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.740 4 \n", - " AAPL &L:AAPL20220617C165&S:AAPL20220617C180 2.575 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.425 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 6.250 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 0.825 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.750 2 \n", - " AMZN &L:AMZN20220121C4350&S:AMZN20220121C4400 5.950 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.925 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.740 4 \n", - "2021-04-22 AAPL &L:AAPL20220617C165&S:AAPL20220617C180 2.450 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.450 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 5.600 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 1.175 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.625 2 \n", - " AMZN &L:AMZN20220121C4350&S:AMZN20220121C4400 5.325 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.575 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.855 4 \n", - " AAPL &L:AAPL20220617C165&S:AAPL20220617C180 2.450 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.450 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 5.600 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 1.175 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.625 2 \n", - " AMZN &L:AMZN20220121C4350&S:AMZN20220121C4400 5.325 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.575 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.855 4 \n", - "2021-04-23 AAPL &L:AAPL20220617C165&S:AAPL20220617C180 2.575 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.875 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 6.200 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 1.375 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.700 2 \n", - " AMZN &L:AMZN20220121C4350&S:AMZN20220121C4400 5.650 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.475 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 2.050 4 \n", - " AAPL &L:AAPL20220617C165&S:AAPL20220617C180 2.575 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.875 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 6.200 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 1.375 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.700 2 \n", - " AMZN &L:AMZN20220121C4350&S:AMZN20220121C4400 5.650 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.475 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 2.050 4 \n", - "2021-04-26 AAPL &L:AAPL20220617C165&S:AAPL20220617C180 2.575 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.575 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 6.700 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 0.875 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.825 2 \n", - " AMZN &L:AMZN20220121C4350&S:AMZN20220121C4400 6.800 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 2.100 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.840 4 \n", - " AAPL &L:AAPL20220617C165&S:AAPL20220617C180 2.575 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.575 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 6.700 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 0.875 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.825 2 \n", - " AMZN &L:AMZN20220121C4350&S:AMZN20220121C4400 6.800 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 2.100 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.840 4 \n", - "2021-04-27 AAPL &L:AAPL20220617C165&S:AAPL20220617C180 2.575 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.300 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 6.150 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 0.725 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.775 2 \n", - " AMZN &L:AMZN20220121C4350&S:AMZN20220121C4400 7.000 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.250 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.805 4 \n", - " AAPL &L:AAPL20220617C165&S:AAPL20220617C180 2.575 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.300 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 6.150 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 0.725 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.775 2 \n", - " AMZN &L:AMZN20220121C4350&S:AMZN20220121C4400 7.000 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.250 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.805 4 \n", - "2021-04-28 AAPL &L:AAPL20220617C165&S:AAPL20220617C180 0.775 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.200 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 6.125 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 1.575 5 \n", - " META &L:META20220121C330&S:META20220121C335 2.075 2 \n", - " AMZN &L:AMZN20220121C4350&S:AMZN20220121C4400 7.150 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 2.075 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.270 4 \n", - " AAPL &L:AAPL20220617C165&S:AAPL20220617C180 0.775 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.200 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 6.125 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 1.575 5 \n", - " META &L:META20220121C330&S:META20220121C335 2.075 2 \n", - " AMZN &L:AMZN20220121C4350&S:AMZN20220121C4400 7.150 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 2.075 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.270 4 \n", - "2021-04-29 AAPL &L:AAPL20220617C165&S:AAPL20220617C180 2.375 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.275 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 6.300 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 1.175 5 \n", - " META &L:META20220121C330&S:META20220121C335 2.850 2 \n", - " AMZN &L:AMZN20220121C4350&S:AMZN20220121C4400 8.000 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.850 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.415 4 \n", - " AAPL &L:AAPL20220617C165&S:AAPL20220617C180 2.375 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.275 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 6.300 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 1.175 5 \n", - " META &L:META20220121C330&S:META20220121C335 2.850 2 \n", - " AMZN &L:AMZN20220121C4350&S:AMZN20220121C4400 8.000 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.850 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.415 4 \n", - "2021-04-30 AAPL &L:AAPL20220617C165&S:AAPL20220617C180 2.275 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.275 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 8.125 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 0.675 5 \n", - " META &L:META20220121C330&S:META20220121C335 2.325 2 \n", - " AMZN &L:AMZN20220121C4350&S:AMZN20220121C4400 7.200 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.625 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.655 4 \n", - " AAPL &L:AAPL20220617C165&S:AAPL20220617C180 2.275 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.275 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 8.125 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 0.675 5 \n", - " META &L:META20220121C330&S:META20220121C335 2.325 2 \n", - " AMZN &L:AMZN20220121C4350&S:AMZN20220121C4400 7.200 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.625 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.655 4 \n", - "2021-05-03 AAPL &L:AAPL20220617C165&S:AAPL20220617C180 2.275 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 1.975 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 5.300 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 0.350 5 \n", - " META &L:META20220121C330&S:META20220121C335 2.100 2 \n", - " AMZN &L:AMZN20220121C4350&S:AMZN20220121C4400 5.800 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.450 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.590 4 \n", - " AAPL &L:AAPL20220617C165&S:AAPL20220617C180 2.275 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 1.975 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 5.300 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 0.350 5 \n", - " META &L:META20220121C330&S:META20220121C335 2.100 2 \n", - " AMZN &L:AMZN20220121C4350&S:AMZN20220121C4400 5.800 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.450 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.590 4 \n", - "2021-05-04 AAPL &L:AAPL20220617C165&S:AAPL20220617C180 1.875 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.025 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 4.800 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 0.875 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.650 2 \n", - " AMZN &L:AMZN20220121C4350&S:AMZN20220121C4400 5.200 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.700 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.300 4 \n", - " AAPL &L:AAPL20220617C165&S:AAPL20220617C180 1.875 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 2.025 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 4.800 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 0.875 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.650 2 \n", - " AMZN &L:AMZN20220121C4350&S:AMZN20220121C4400 5.200 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.700 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.300 4 \n", - "2021-05-05 AAPL &L:AAPL20220617C165&S:AAPL20220617C180 1.850 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 1.925 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 5.100 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 0.725 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.975 2 \n", - " AMZN &L:AMZN20220121C4350&S:AMZN20220121C4400 4.600 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.325 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.300 4 \n", - " AAPL &L:AAPL20220617C165&S:AAPL20220617C180 1.850 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 1.925 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 5.100 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 0.725 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.975 2 \n", - " AMZN &L:AMZN20220121C4350&S:AMZN20220121C4400 4.600 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.325 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.300 4 \n", - "2021-05-06 AAPL &L:AAPL20220617C165&S:AAPL20220617C180 1.925 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 1.875 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 5.050 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 0.825 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.300 2 \n", - " AMZN &L:AMZN20220121C4350&S:AMZN20220121C4400 4.575 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.300 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.280 4 \n", - " AAPL &L:AAPL20220617C165&S:AAPL20220617C180 1.925 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 1.875 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 5.050 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 0.825 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.300 2 \n", - " AMZN &L:AMZN20220121C4350&S:AMZN20220121C4400 4.575 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.300 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.280 4 \n", - "2021-05-07 AAPL &L:AAPL20220617C165&S:AAPL20220617C180 2.000 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 1.875 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 5.275 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 0.975 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.625 2 \n", - " AMZN &L:AMZN20220121C4350&S:AMZN20220121C4400 4.200 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 2.025 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.410 4 \n", - " AAPL &L:AAPL20220617C165&S:AAPL20220617C180 2.000 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 1.875 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 5.275 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 0.975 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.625 2 \n", - " AMZN &L:AMZN20220121C4350&S:AMZN20220121C4400 4.200 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 2.025 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.410 4 \n", - "2021-05-10 AAPL &L:AAPL20220617C165&S:AAPL20220617C180 1.725 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 1.575 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 4.650 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 0.425 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.825 2 \n", - " AMZN &L:AMZN20220121C4350&S:AMZN20220121C4400 2.450 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.925 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.325 4 \n", - " AAPL &L:AAPL20220617C165&S:AAPL20220617C180 1.725 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 1.575 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 4.650 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 0.425 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.825 2 \n", - " AMZN &L:AMZN20220121C4350&S:AMZN20220121C4400 2.450 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.925 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.325 4 \n", - "2021-05-11 AAPL &L:AAPL20220617C165&S:AAPL20220617C180 1.620 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 1.425 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 4.700 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 0.575 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.575 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.425 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.270 4 \n", - " AAPL &L:AAPL20220617C165&S:AAPL20220617C180 1.620 3 \n", - " TSLA &L:TSLA20220121C920&S:TSLA20220121C930 1.425 6 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 4.700 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 0.575 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.575 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.425 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.270 4 \n", - "2021-05-12 AAPL &L:AAPL20220617C165&S:AAPL20220617C180 1.495 3 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 4.075 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 0.400 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.825 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.575 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.110 4 \n", - " AAPL &L:AAPL20220617C165&S:AAPL20220617C180 1.495 3 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 4.075 4 \n", - " BA &L:BA20220121C325&S:BA20220121C335 0.400 5 \n", - " META &L:META20220121C330&S:META20220121C335 1.825 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.575 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.110 4 \n", - "2021-05-13 NVDA &L:NVDA20220121C680&S:NVDA20220121C700 4.100 4 \n", - " META &L:META20220121C330&S:META20220121C335 1.825 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.550 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 0.990 4 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 4.100 4 \n", - " META &L:META20220121C330&S:META20220121C335 1.825 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.550 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 0.990 4 \n", - "2021-05-14 NVDA &L:NVDA20220121C680&S:NVDA20220121C700 4.575 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.075 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.950 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.185 4 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 4.575 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.075 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.950 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.185 4 \n", - "2021-05-17 AAPL &L:AAPL20220617C150&S:AAPL20220617C160 1.975 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 4.525 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.050 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 2.325 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.125 4 \n", - " AAPL &L:AAPL20220617C150&S:AAPL20220617C160 1.975 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 4.525 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.050 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 2.325 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.125 4 \n", - "2021-05-18 AAPL &L:AAPL20220617C150&S:AAPL20220617C160 1.900 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 4.225 4 \n", - " META &L:META20220121C330&S:META20220121C335 1.850 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 2.075 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.025 4 \n", - " AAPL &L:AAPL20220617C150&S:AAPL20220617C160 1.900 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 4.225 4 \n", - " META &L:META20220121C330&S:META20220121C335 1.850 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 2.075 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.025 4 \n", - "2021-05-19 NVDA &L:NVDA20220121C680&S:NVDA20220121C700 4.400 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.000 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.950 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 0.945 4 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 4.400 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.000 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.950 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 0.945 4 \n", - "2021-05-20 NVDA &L:NVDA20220121C680&S:NVDA20220121C700 5.825 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.125 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 2.025 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.150 4 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 5.825 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.125 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 2.025 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.150 4 \n", - "2021-05-21 AAPL &L:AAPL20220617C150&S:AAPL20220617C160 1.900 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 5.850 4 \n", - " META &L:META20220121C330&S:META20220121C335 1.425 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.650 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.150 4 \n", - " AAPL &L:AAPL20220617C150&S:AAPL20220617C160 1.900 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 5.850 4 \n", - " META &L:META20220121C330&S:META20220121C335 1.425 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.650 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.150 4 \n", - "2021-05-24 NVDA &L:NVDA20220121C680&S:NVDA20220121C700 6.575 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.250 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 0.650 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 0.660 4 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 6.575 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.250 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 0.650 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 0.660 4 \n", - "2021-05-25 NVDA &L:NVDA20220121C680&S:NVDA20220121C700 6.575 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.300 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 2.425 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.040 4 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 6.575 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.300 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 2.425 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.040 4 \n", - "2021-05-26 NVDA &L:NVDA20220121C680&S:NVDA20220121C700 6.825 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.325 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.450 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.095 4 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 6.825 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.325 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.450 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.095 4 \n", - "2021-05-27 NVDA &L:NVDA20220121C680&S:NVDA20220121C700 6.375 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.425 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.975 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.175 4 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 6.375 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.425 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.975 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.175 4 \n", - "2021-05-28 NVDA &L:NVDA20220121C680&S:NVDA20220121C700 7.550 4 \n", - " META &L:META20220121C330&S:META20220121C335 1.525 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.950 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.135 4 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 7.550 4 \n", - " META &L:META20220121C330&S:META20220121C335 1.525 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.950 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.135 4 \n", - "2021-05-31 NVDA &L:NVDA20220121C680&S:NVDA20220121C700 6.825 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.350 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.425 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.010 4 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 6.825 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.350 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.425 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.010 4 \n", - "2021-06-01 NVDA &L:NVDA20220121C680&S:NVDA20220121C700 6.825 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.350 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.425 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.010 4 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 6.825 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.350 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.425 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 1.010 4 \n", - "2021-06-02 NVDA &L:NVDA20220121C680&S:NVDA20220121C700 8.400 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.325 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.600 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 0.935 4 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 8.400 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.325 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.600 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 0.935 4 \n", - "2021-06-03 NVDA &L:NVDA20220121C680&S:NVDA20220121C700 8.675 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.300 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.775 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 0.765 4 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 8.675 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.300 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.775 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 0.765 4 \n", - "2021-06-04 NVDA &L:NVDA20220121C680&S:NVDA20220121C700 9.625 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.400 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.975 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 0.825 4 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 9.625 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.400 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.975 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 0.825 4 \n", - "2021-06-07 NVDA &L:NVDA20220121C680&S:NVDA20220121C700 9.375 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.150 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.550 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 0.725 4 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 9.375 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.150 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.550 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 0.725 4 \n", - "2021-06-08 NVDA &L:NVDA20220121C680&S:NVDA20220121C700 9.400 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.275 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.550 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 0.765 4 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 9.400 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.275 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.550 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 0.765 4 \n", - "2021-06-09 NVDA &L:NVDA20220121C680&S:NVDA20220121C700 9.300 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.450 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.600 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 0.785 4 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 9.300 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.450 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.600 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 0.785 4 \n", - "2021-06-10 NVDA &L:NVDA20220121C680&S:NVDA20220121C700 9.275 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.550 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.800 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 0.790 4 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 9.275 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.550 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.800 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 0.790 4 \n", - "2021-06-11 NVDA &L:NVDA20220121C680&S:NVDA20220121C700 10.025 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.425 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.725 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 0.765 4 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 10.025 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.425 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.725 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 0.765 4 \n", - "2021-06-14 NVDA &L:NVDA20220121C680&S:NVDA20220121C700 9.875 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.600 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.700 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 0.735 4 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 9.875 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.600 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.700 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 0.735 4 \n", - "2021-06-15 NVDA &L:NVDA20220121C680&S:NVDA20220121C700 10.275 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.550 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.725 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 0.690 4 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 10.275 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.550 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.725 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 0.690 4 \n", - "2021-06-16 NVDA &L:NVDA20220121C680&S:NVDA20220121C700 9.950 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.475 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.425 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 0.665 4 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 9.950 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.475 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.425 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 0.665 4 \n", - "2021-06-17 NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.100 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.550 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.825 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 0.680 4 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.100 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.550 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.825 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 0.680 4 \n", - "2021-06-18 NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.175 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.275 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.675 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 0.615 4 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.175 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.275 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.675 4 \n", - " SBUX &L:SBUX20220121C140&S:SBUX20220121C160 0.615 4 \n", - "2021-06-21 NVDA &L:NVDA20220121C680&S:NVDA20220121C700 10.975 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.475 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.800 4 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 10.975 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.475 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.800 4 \n", - "2021-06-22 NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.975 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.075 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 2.150 4 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.975 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.075 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 2.150 4 \n", - "2021-06-23 NVDA &L:NVDA20220121C680&S:NVDA20220121C700 12.175 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.700 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 3.825 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 2.050 4 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 12.175 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.700 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 3.825 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 2.050 4 \n", - "2021-06-24 NVDA &L:NVDA20220121C680&S:NVDA20220121C700 13.675 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.000 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 3.225 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 2.150 4 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 13.675 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.000 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 3.225 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 2.150 4 \n", - "2021-06-25 NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.975 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.700 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 2.700 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.900 4 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.975 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.700 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 2.700 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 1.900 4 \n", - "2021-06-28 NVDA &L:NVDA20220121C680&S:NVDA20220121C700 13.350 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.325 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 2.850 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 2.750 4 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 13.350 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.325 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 2.850 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 2.750 4 \n", - "2021-06-29 NVDA &L:NVDA20220121C680&S:NVDA20220121C700 13.175 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.025 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 2.975 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 2.425 4 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 13.175 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.025 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 2.975 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 2.425 4 \n", - "2021-06-30 NVDA &L:NVDA20220121C680&S:NVDA20220121C700 13.450 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.275 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 2.600 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 2.150 4 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 13.450 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.275 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 2.600 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 2.150 4 \n", - "2021-07-01 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.000 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 13.275 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.025 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 2.575 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 2.500 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C125 2.000 11 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.000 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 13.275 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.025 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 2.575 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 2.500 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C125 2.000 11 \n", - "2021-07-02 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.250 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 12.925 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.125 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 3.350 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 2.425 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C125 2.250 11 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.250 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 12.925 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.125 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 3.350 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 2.425 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C125 2.250 11 \n", - "2021-07-05 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.475 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 13.875 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.200 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 5.550 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 2.450 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C125 2.500 11 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.475 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 13.875 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.200 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 5.550 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 2.450 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C125 2.500 11 \n", - "2021-07-06 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.475 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 13.875 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.200 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 5.550 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 2.450 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C125 2.500 11 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.475 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 13.875 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.200 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 5.550 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 2.450 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C125 2.500 11 \n", - "2021-07-07 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.750 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 13.425 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.050 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 6.025 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 2.825 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C125 1.825 11 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.750 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 13.425 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.050 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 6.025 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 2.825 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C125 1.825 11 \n", - "2021-07-08 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.575 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 13.875 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.525 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 6.600 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 3.200 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C125 1.900 11 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.575 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 13.875 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.525 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 6.600 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 3.200 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C125 1.900 11 \n", - "2021-07-09 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.775 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 12.850 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.925 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 6.200 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 3.325 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C125 1.850 11 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.775 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 12.850 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.925 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 6.200 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 3.325 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C125 1.850 11 \n", - "2021-07-12 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.700 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 14.175 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.975 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 5.950 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 2.825 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C125 2.000 11 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.700 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 14.175 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.975 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 5.950 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 2.825 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C125 2.000 11 \n", - "2021-07-13 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.825 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 13.075 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.025 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 5.425 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 2.275 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C125 1.825 11 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.825 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 13.075 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.025 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 5.425 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 2.275 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C125 1.825 11 \n", - "2021-07-14 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.175 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 13.200 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.900 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 5.375 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 2.925 4 \n", - " SBUX &L:SBUX20220121C130&S:SBUX20220121C140 1.930 1 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C125 1.550 11 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.175 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 13.200 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.900 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 5.375 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 2.925 4 \n", - " SBUX &L:SBUX20220121C130&S:SBUX20220121C140 1.930 1 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C125 1.550 11 \n", - "2021-07-15 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.050 2 \n", - " NFLX &L:NFLX20220617C640&S:NFLX20220617C650 2.725 3 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 12.075 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.725 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 4.650 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 3.300 4 \n", - " SBUX &L:SBUX20220121C130&S:SBUX20220121C140 1.795 1 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C125 1.350 11 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.050 2 \n", - " NFLX &L:NFLX20220617C640&S:NFLX20220617C650 2.725 3 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 12.075 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.725 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 4.650 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 3.300 4 \n", - " SBUX &L:SBUX20220121C130&S:SBUX20220121C140 1.795 1 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C125 1.350 11 \n", - "2021-07-16 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.875 2 \n", - " NFLX &L:NFLX20220617C640&S:NFLX20220617C650 2.225 3 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 10.950 4 \n", - " META &L:META20220121C330&S:META20220121C335 1.850 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 4.050 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 2.900 4 \n", - " SBUX &L:SBUX20220121C130&S:SBUX20220121C140 1.780 1 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.875 2 \n", - " NFLX &L:NFLX20220617C640&S:NFLX20220617C650 2.225 3 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 10.950 4 \n", - " META &L:META20220121C330&S:META20220121C335 1.850 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 4.050 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 2.900 4 \n", - " SBUX &L:SBUX20220121C130&S:SBUX20220121C140 1.780 1 \n", - "2021-07-19 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.550 2 \n", - " NFLX &L:NFLX20220617C640&S:NFLX20220617C650 2.300 3 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.700 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 3.800 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 3.250 4 \n", - " SBUX &L:SBUX20220121C130&S:SBUX20220121C140 1.420 1 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.550 2 \n", - " NFLX &L:NFLX20220617C640&S:NFLX20220617C650 2.300 3 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.700 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 3.800 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 3.250 4 \n", - " SBUX &L:SBUX20220121C130&S:SBUX20220121C140 1.420 1 \n", - "2021-07-20 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.900 2 \n", - " NFLX &L:NFLX20220617C640&S:NFLX20220617C650 2.450 3 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.700 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 3.675 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 3.675 4 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.900 2 \n", - " NFLX &L:NFLX20220617C640&S:NFLX20220617C650 2.450 3 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.700 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 3.675 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 3.675 4 \n", - "2021-07-21 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.825 2 \n", - " NFLX &L:NFLX20220617C640&S:NFLX20220617C650 1.750 3 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.900 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 3.700 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 3.525 4 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.825 2 \n", - " NFLX &L:NFLX20220617C640&S:NFLX20220617C650 1.750 3 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.900 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 3.700 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 3.525 4 \n", - "2021-07-22 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.950 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.200 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 4.275 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 3.700 4 \n", - " SBUX &L:SBUX20220617C140&S:SBUX20220617C150 1.825 1 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.950 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.200 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 4.275 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 3.700 4 \n", - " SBUX &L:SBUX20220617C140&S:SBUX20220617C150 1.825 1 \n", - "2021-07-23 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.100 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.225 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 4.475 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 3.900 4 \n", - " SBUX &L:SBUX20220617C140&S:SBUX20220617C150 2.875 1 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.100 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.225 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 4.475 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 3.900 4 \n", - " SBUX &L:SBUX20220617C140&S:SBUX20220617C150 2.875 1 \n", - "2021-07-26 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.100 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.575 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 5.225 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 4.050 4 \n", - " SBUX &L:SBUX20220617C140&S:SBUX20220617C150 2.450 1 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.100 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.575 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 5.225 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 4.050 4 \n", - " SBUX &L:SBUX20220617C140&S:SBUX20220617C150 2.450 1 \n", - "2021-07-27 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.925 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.200 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 4.250 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 4.325 4 \n", - " SBUX &L:SBUX20220617C140&S:SBUX20220617C150 2.400 1 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.925 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.200 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 4.250 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 4.325 4 \n", - " SBUX &L:SBUX20220617C140&S:SBUX20220617C150 2.400 1 \n", - "2021-07-28 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.700 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.250 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 3.975 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 4.250 4 \n", - " SBUX &L:SBUX20220617C140&S:SBUX20220617C150 1.845 1 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.700 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.250 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 3.975 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 4.250 4 \n", - " SBUX &L:SBUX20220617C140&S:SBUX20220617C150 1.845 1 \n", - "2021-07-29 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.775 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.325 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 3.525 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 4.000 4 \n", - " SBUX &L:SBUX20220617C140&S:SBUX20220617C150 1.830 1 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.775 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.325 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 3.525 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 4.000 4 \n", - " SBUX &L:SBUX20220617C140&S:SBUX20220617C150 1.830 1 \n", - "2021-07-30 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.775 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.225 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 1.425 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 4.725 4 \n", - " SBUX &L:SBUX20220617C140&S:SBUX20220617C150 1.795 1 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.925 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.775 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.225 2 \n", - " AMZN &L:AMZN20220121C4550&S:AMZN20220121C4600 1.425 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 4.725 4 \n", - " SBUX &L:SBUX20220617C140&S:SBUX20220617C150 1.795 1 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.925 8 \n", - "2021-08-02 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.750 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.225 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 4.375 4 \n", - " SBUX &L:SBUX20220617C140&S:SBUX20220617C150 1.445 1 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.825 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.750 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.225 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 4.375 4 \n", - " SBUX &L:SBUX20220617C140&S:SBUX20220617C150 1.445 1 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.825 8 \n", - "2021-08-03 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.950 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.150 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 5.125 4 \n", - " SBUX &L:SBUX20220617C140&S:SBUX20220617C150 1.450 1 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.200 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.950 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.150 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 5.125 4 \n", - " SBUX &L:SBUX20220617C140&S:SBUX20220617C150 1.450 1 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.200 8 \n", - "2021-08-04 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.900 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.200 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 5.100 4 \n", - " SBUX &L:SBUX20220617C140&S:SBUX20220617C150 1.495 1 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.425 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.900 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.200 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 5.100 4 \n", - " SBUX &L:SBUX20220617C140&S:SBUX20220617C150 1.495 1 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.425 8 \n", - "2021-08-05 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.900 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.425 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 5.425 4 \n", - " SBUX &L:SBUX20220617C140&S:SBUX20220617C150 0.875 1 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 0.950 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.900 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.425 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 5.425 4 \n", - " SBUX &L:SBUX20220617C140&S:SBUX20220617C150 0.875 1 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 0.950 8 \n", - "2021-08-06 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.775 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.475 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 5.300 4 \n", - " SBUX &L:SBUX20220617C140&S:SBUX20220617C150 1.275 1 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.175 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.775 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.475 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 5.300 4 \n", - " SBUX &L:SBUX20220617C140&S:SBUX20220617C150 1.275 1 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.175 8 \n", - "2021-08-09 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.800 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.350 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 5.325 4 \n", - " SBUX &L:SBUX20220617C140&S:SBUX20220617C150 1.530 1 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.525 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.800 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.350 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 5.325 4 \n", - " SBUX &L:SBUX20220617C140&S:SBUX20220617C150 1.530 1 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.525 8 \n", - "2021-08-10 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.750 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.325 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 5.875 4 \n", - " SBUX &L:SBUX20220617C140&S:SBUX20220617C150 0.520 1 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.925 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.750 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.325 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 5.875 4 \n", - " SBUX &L:SBUX20220617C140&S:SBUX20220617C150 0.520 1 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.925 8 \n", - "2021-08-11 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.800 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.350 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 5.800 4 \n", - " SBUX &L:SBUX20220617C140&S:SBUX20220617C150 1.015 1 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.625 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.800 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.350 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 5.800 4 \n", - " SBUX &L:SBUX20220617C140&S:SBUX20220617C150 1.015 1 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.625 8 \n", - "2021-08-12 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.125 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.425 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 5.925 4 \n", - " SBUX &L:SBUX20220617C140&S:SBUX20220617C150 1.090 1 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 2.450 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.125 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.425 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 5.925 4 \n", - " SBUX &L:SBUX20220617C140&S:SBUX20220617C150 1.090 1 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 2.450 8 \n", - "2021-08-13 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.100 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.400 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 5.975 4 \n", - " SBUX &L:SBUX20220617C140&S:SBUX20220617C150 1.000 1 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.800 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.100 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.400 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 5.975 4 \n", - " SBUX &L:SBUX20220617C140&S:SBUX20220617C150 1.000 1 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.800 8 \n", - "2021-08-16 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.350 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.550 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.375 4 \n", - " SBUX &L:SBUX20220617C140&S:SBUX20220617C150 1.235 1 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.550 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.350 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.550 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.375 4 \n", - " SBUX &L:SBUX20220617C140&S:SBUX20220617C150 1.235 1 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.550 8 \n", - "2021-08-17 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.250 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.275 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.400 4 \n", - " SBUX &L:SBUX20220617C140&S:SBUX20220617C150 1.220 1 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.600 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.250 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.275 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.400 4 \n", - " SBUX &L:SBUX20220617C140&S:SBUX20220617C150 1.220 1 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.600 8 \n", - "2021-08-18 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.925 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.275 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 5.925 4 \n", - " SBUX &L:SBUX20220617C140&S:SBUX20220617C150 0.730 1 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.425 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.925 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.275 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 5.925 4 \n", - " SBUX &L:SBUX20220617C140&S:SBUX20220617C150 0.730 1 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.425 8 \n", - "2021-08-19 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.900 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.275 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.625 4 \n", - " SBUX &L:SBUX20220617C140&S:SBUX20220617C150 0.655 1 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.450 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.900 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.275 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.625 4 \n", - " SBUX &L:SBUX20220617C140&S:SBUX20220617C150 0.655 1 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.450 8 \n", - "2021-08-20 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.050 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.425 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.850 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.575 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.050 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.425 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.850 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.575 8 \n", - "2021-08-23 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.175 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.600 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.725 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.800 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.175 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.600 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.725 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.800 8 \n", - "2021-08-24 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.125 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.575 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.350 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.675 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.125 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.575 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.350 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.675 8 \n", - "2021-08-25 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.000 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.675 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.400 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.700 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.000 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.675 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.400 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.700 8 \n", - "2021-08-26 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.900 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.625 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.150 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.625 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.900 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.625 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.150 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.625 8 \n", - "2021-08-27 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.950 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 1.975 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.775 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.175 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.850 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.950 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 1.975 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.775 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.175 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.850 8 \n", - "2021-08-30 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.475 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 2.625 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.975 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.650 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.825 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.475 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 2.625 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.975 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.650 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.825 8 \n", - "2021-08-31 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.350 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 2.500 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.950 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.700 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.825 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.350 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 2.500 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.950 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.700 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.825 8 \n", - "2021-09-01 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.350 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 2.925 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 4.000 2 \n", - " AMZN &L:AMZN20220121C4650&S:AMZN20220121C4750 1.925 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.750 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.800 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.350 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 2.925 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 4.000 2 \n", - " AMZN &L:AMZN20220121C4650&S:AMZN20220121C4750 1.925 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.750 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.800 8 \n", - "2021-09-02 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.525 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 3.275 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.850 2 \n", - " AMZN &L:AMZN20220121C4650&S:AMZN20220121C4750 1.775 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 7.000 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.750 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.525 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 3.275 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.850 2 \n", - " AMZN &L:AMZN20220121C4650&S:AMZN20220121C4750 1.775 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 7.000 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.750 8 \n", - "2021-09-03 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.650 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 4.100 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.925 2 \n", - " AMZN &L:AMZN20220121C4650&S:AMZN20220121C4750 1.800 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 7.200 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.800 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.650 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 4.100 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.925 2 \n", - " AMZN &L:AMZN20220121C4650&S:AMZN20220121C4750 1.800 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 7.200 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.800 8 \n", - "2021-09-06 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.850 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 4.250 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 4.025 2 \n", - " AMZN &L:AMZN20220121C4650&S:AMZN20220121C4750 2.025 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 7.025 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.700 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.850 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 4.250 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 4.025 2 \n", - " AMZN &L:AMZN20220121C4650&S:AMZN20220121C4750 2.025 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 7.025 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.700 8 \n", - "2021-09-07 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.850 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 4.250 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 4.025 2 \n", - " AMZN &L:AMZN20220121C4650&S:AMZN20220121C4750 2.025 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 7.025 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.700 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.850 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 4.250 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 4.025 2 \n", - " AMZN &L:AMZN20220121C4650&S:AMZN20220121C4750 2.025 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 7.025 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.700 8 \n", - "2021-09-08 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.700 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 4.175 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.850 2 \n", - " AMZN &L:AMZN20220121C4650&S:AMZN20220121C4750 2.225 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 7.325 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.600 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.700 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 4.175 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.850 2 \n", - " AMZN &L:AMZN20220121C4650&S:AMZN20220121C4750 2.225 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 7.325 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.600 8 \n", - "2021-09-09 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.575 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 4.075 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.950 2 \n", - " AMZN &L:AMZN20220121C4650&S:AMZN20220121C4750 1.875 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 7.300 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.600 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.575 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 4.075 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.950 2 \n", - " AMZN &L:AMZN20220121C4650&S:AMZN20220121C4750 1.875 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 7.300 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.600 8 \n", - "2021-09-10 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.150 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 3.975 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.975 2 \n", - " AMZN &L:AMZN20220121C4650&S:AMZN20220121C4750 1.700 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.450 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.575 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.150 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 3.975 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.975 2 \n", - " AMZN &L:AMZN20220121C4650&S:AMZN20220121C4750 1.700 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.450 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.575 8 \n", - "2021-09-13 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.125 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 3.650 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.975 2 \n", - " AMZN &L:AMZN20220121C4650&S:AMZN20220121C4750 1.475 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.950 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.500 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.125 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 3.650 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.975 2 \n", - " AMZN &L:AMZN20220121C4650&S:AMZN20220121C4750 1.475 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.950 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.500 8 \n", - "2021-09-14 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.950 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 3.275 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.900 2 \n", - " AMZN &L:AMZN20220121C4650&S:AMZN20220121C4750 1.300 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.925 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.550 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.950 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 3.275 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.900 2 \n", - " AMZN &L:AMZN20220121C4650&S:AMZN20220121C4750 1.300 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.925 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.550 8 \n", - "2021-09-15 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.050 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 3.150 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 4.025 2 \n", - " AMZN &L:AMZN20220121C4650&S:AMZN20220121C4750 1.400 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 7.500 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.575 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.050 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 3.150 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 4.025 2 \n", - " AMZN &L:AMZN20220121C4650&S:AMZN20220121C4750 1.400 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 7.500 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.575 8 \n", - "2021-09-16 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.975 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 3.225 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.900 2 \n", - " AMZN &L:AMZN20220121C4650&S:AMZN20220121C4750 1.425 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 7.250 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.600 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.975 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 3.225 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.900 2 \n", - " AMZN &L:AMZN20220121C4650&S:AMZN20220121C4750 1.425 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 7.250 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.600 8 \n", - "2021-09-17 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.700 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 3.600 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.675 2 \n", - " AMZN &L:AMZN20220121C4650&S:AMZN20220121C4750 1.250 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 7.025 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.500 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.700 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 3.600 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.675 2 \n", - " AMZN &L:AMZN20220121C4650&S:AMZN20220121C4750 1.250 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 7.025 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.500 8 \n", - "2021-09-20 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.450 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 3.025 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.450 2 \n", - " AMZN &L:AMZN20220121C4650&S:AMZN20220121C4750 0.850 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.400 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.375 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.450 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 3.025 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.450 2 \n", - " AMZN &L:AMZN20220121C4650&S:AMZN20220121C4750 0.850 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.400 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.375 8 \n", - "2021-09-21 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.475 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 2.800 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.500 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.400 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.450 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.475 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 2.800 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.500 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.400 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.450 8 \n", - "2021-09-22 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.700 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 3.275 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.175 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.475 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.550 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.700 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 3.275 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.175 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.475 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.550 8 \n", - "2021-09-23 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.800 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 3.750 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.175 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.350 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.625 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.800 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 3.750 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.175 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.350 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.625 8 \n", - "2021-09-24 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.775 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 3.375 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.300 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 8.175 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.625 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.775 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 3.375 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.300 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 8.175 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.625 8 \n", - "2021-09-27 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.600 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 3.325 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.425 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 7.350 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.750 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.600 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 3.325 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.425 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 7.350 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.750 8 \n", - "2021-09-28 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.300 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 3.075 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.025 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.250 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.375 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.300 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 3.075 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.025 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.250 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.375 8 \n", - "2021-09-29 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.400 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 3.875 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.025 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.525 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.350 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.400 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 3.875 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.025 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.525 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.350 8 \n", - "2021-09-30 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.375 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 4.325 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.925 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.000 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.425 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.375 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 4.325 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.925 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.000 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.425 8 \n", - "2021-10-01 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.275 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 4.650 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.000 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.425 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.400 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.275 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 4.650 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 3.000 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.425 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.400 8 \n", - "2021-10-04 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.025 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 4.075 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.425 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 5.675 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.375 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.025 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 4.075 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.425 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 5.675 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.375 8 \n", - "2021-10-05 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.200 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 5.750 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.675 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.250 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.375 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.200 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 5.750 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.675 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.250 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.375 8 \n", - "2021-10-06 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.300 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 5.900 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.750 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.125 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.450 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.300 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 5.900 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.750 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.125 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.450 8 \n", - "2021-10-07 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.400 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 5.625 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.550 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.700 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.600 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.400 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 5.625 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.550 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.700 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.600 8 \n", - "2021-10-08 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.325 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 5.375 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.550 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.425 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.550 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.325 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 5.375 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.550 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.425 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.550 8 \n", - "2021-10-11 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.275 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 5.250 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.350 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.325 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.525 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.275 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 5.250 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.350 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.325 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.525 8 \n", - "2021-10-12 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.300 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 5.125 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.275 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.400 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.525 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.300 2 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 5.125 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.275 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.400 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.525 8 \n", - "2021-10-13 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.050 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 0.775 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 5.375 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.350 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.125 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.775 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.050 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 0.775 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 5.375 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.350 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.125 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.775 8 \n", - "2021-10-14 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.250 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 3.525 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 5.275 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.500 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.675 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.950 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.250 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 3.525 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 5.275 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.500 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 6.675 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.950 8 \n", - "2021-10-15 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.375 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 1.375 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 4.925 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.250 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 7.025 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.950 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.375 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 1.375 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 4.925 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.250 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 7.025 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 1.950 8 \n", - "2021-10-18 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.525 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.050 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 5.050 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.700 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 7.550 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 2.100 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.525 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.050 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 5.050 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.700 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 7.550 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 2.100 8 \n", - "2021-10-19 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.900 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 7.350 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 5.650 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.925 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 7.700 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 2.150 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.900 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 7.350 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 5.650 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.925 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 7.700 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 2.150 8 \n", - "2021-10-20 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.875 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 2.750 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 4.325 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.950 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 7.875 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 2.100 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.875 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 2.750 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 4.325 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.950 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 7.875 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 2.100 8 \n", - "2021-10-21 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.925 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 1.250 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 6.100 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.950 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 8.425 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 2.325 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.925 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 1.250 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 6.100 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.950 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 8.425 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 2.325 8 \n", - "2021-10-22 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.825 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 4.850 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 7.050 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.375 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 8.675 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 2.475 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.825 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 4.850 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 7.050 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220121C330&S:META20220121C335 2.375 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 8.675 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 2.475 8 \n", - "2021-10-25 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.800 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.750 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 7.325 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " COST &L:COST20220121C430&S:COST20220121C440 8.750 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 2.425 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.800 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.750 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 7.325 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " COST &L:COST20220121C430&S:COST20220121C440 8.750 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 2.425 8 \n", - "2021-10-26 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.850 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 4.875 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 7.125 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " COST &L:COST20220121C430&S:COST20220121C440 8.925 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 2.075 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.850 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 4.875 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 7.125 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " COST &L:COST20220121C430&S:COST20220121C440 8.925 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 2.075 8 \n", - "2021-10-27 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.825 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.675 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 6.700 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " COST &L:COST20220121C430&S:COST20220121C440 8.625 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 2.400 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.825 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.675 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 6.700 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " COST &L:COST20220121C430&S:COST20220121C440 8.625 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 2.400 8 \n", - "2021-10-28 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.125 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.950 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 7.050 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " COST &L:COST20220121C430&S:COST20220121C440 8.850 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 2.550 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.125 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.950 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 7.050 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " COST &L:COST20220121C430&S:COST20220121C440 8.850 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 2.550 8 \n", - "2021-10-29 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.825 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 3.775 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 8.225 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " COST &L:COST20220121C430&S:COST20220121C440 8.925 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 2.500 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.825 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 3.775 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 8.225 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " COST &L:COST20220121C430&S:COST20220121C440 8.925 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 2.500 8 \n", - "2021-11-01 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.775 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 6.350 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 7.675 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " COST &L:COST20220121C430&S:COST20220121C440 8.500 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 2.350 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.775 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 6.350 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 7.675 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " COST &L:COST20220121C430&S:COST20220121C440 8.500 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 2.350 8 \n", - "2021-11-02 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.850 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.875 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 7.500 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " COST &L:COST20220121C430&S:COST20220121C440 9.325 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.025 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.850 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.875 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 7.500 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " COST &L:COST20220121C430&S:COST20220121C440 9.325 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.025 8 \n", - "2021-11-03 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.000 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 6.200 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 8.325 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " COST &L:COST20220121C430&S:COST20220121C440 9.300 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 2.825 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.000 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 6.200 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 8.325 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " COST &L:COST20220121C430&S:COST20220121C440 9.300 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 2.825 8 \n", - "2021-11-04 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.950 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 6.000 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 6.900 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " COST &L:COST20220121C430&S:COST20220121C440 9.125 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 2.975 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.950 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 6.000 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 6.900 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " COST &L:COST20220121C430&S:COST20220121C440 9.125 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 2.975 8 \n", - "2021-11-05 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.925 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 6.175 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 5.600 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " COST &L:COST20220121C430&S:COST20220121C440 9.400 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 2.925 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.925 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 6.175 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 5.600 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " COST &L:COST20220121C430&S:COST20220121C440 9.400 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 2.925 8 \n", - "2021-11-08 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.925 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.550 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 5.725 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " COST &L:COST20220121C430&S:COST20220121C440 9.250 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 2.975 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.925 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.550 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 5.725 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " COST &L:COST20220121C430&S:COST20220121C440 9.250 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 2.975 8 \n", - "2021-11-09 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.975 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 4.775 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 6.250 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " COST &L:COST20220121C430&S:COST20220121C440 9.400 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.025 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.975 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 4.775 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 6.250 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " COST &L:COST20220121C430&S:COST20220121C440 9.400 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.025 8 \n", - "2021-11-10 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.650 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.050 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 5.725 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " COST &L:COST20220121C430&S:COST20220121C440 9.175 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.075 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.650 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.050 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 5.725 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " COST &L:COST20220121C430&S:COST20220121C440 9.175 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.075 8 \n", - "2021-11-11 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.625 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.225 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 6.400 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " COST &L:COST20220121C430&S:COST20220121C440 9.375 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.450 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.625 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.225 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 6.400 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " COST &L:COST20220121C430&S:COST20220121C440 9.375 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.450 8 \n", - "2021-11-12 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.875 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 6.125 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 7.825 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " COST &L:COST20220121C430&S:COST20220121C440 9.775 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.525 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.875 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 6.125 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 7.825 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " COST &L:COST20220121C430&S:COST20220121C440 9.775 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.525 8 \n", - "2021-11-15 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.800 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 4.925 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 7.575 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " COST &L:COST20220121C430&S:COST20220121C440 9.400 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.400 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.800 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 4.925 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 7.575 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " COST &L:COST20220121C430&S:COST20220121C440 9.400 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.400 8 \n", - "2021-11-16 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.975 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.250 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 7.975 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220916C380&S:META20220916C385 1.575 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 9.750 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.600 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 2.975 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.250 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 7.975 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220916C380&S:META20220916C385 1.575 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 9.750 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.600 8 \n", - "2021-11-17 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.250 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.575 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 8.275 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220916C380&S:META20220916C385 1.550 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 9.800 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.625 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.250 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.575 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 8.275 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220916C380&S:META20220916C385 1.550 2 \n", - " COST &L:COST20220121C430&S:COST20220121C440 9.800 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.625 8 \n", - "2021-11-18 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.825 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.550 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 7.825 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220916C380&S:META20220916C385 1.500 2 \n", - " AMZN &L:AMZN20220617C5200&S:AMZN20220617C5250 2.125 1 \n", - " COST &L:COST20220121C430&S:COST20220121C440 9.750 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.875 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.825 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.550 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 7.825 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220916C380&S:META20220916C385 1.500 2 \n", - " AMZN &L:AMZN20220617C5200&S:AMZN20220617C5250 2.125 1 \n", - " COST &L:COST20220121C430&S:COST20220121C440 9.750 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.875 8 \n", - "2021-11-19 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 4.225 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.725 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 7.725 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220916C380&S:META20220916C385 1.550 2 \n", - " AMZN &L:AMZN20220617C5200&S:AMZN20220617C5250 2.100 1 \n", - " COST &L:COST20220121C430&S:COST20220121C440 9.600 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.675 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 4.225 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.725 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 7.725 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220916C380&S:META20220916C385 1.550 2 \n", - " AMZN &L:AMZN20220617C5200&S:AMZN20220617C5250 2.100 1 \n", - " COST &L:COST20220121C430&S:COST20220121C440 9.600 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.675 8 \n", - "2021-11-22 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 4.225 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.700 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 6.425 2 \n", - " NVDA &L:NVDA20220121C680&S:NVDA20220121C700 11.650 4 \n", - " META &L:META20220916C380&S:META20220916C385 1.600 2 \n", - " AMZN &L:AMZN20220617C5200&S:AMZN20220617C5250 1.675 1 \n", - " COST &L:COST20220121C430&S:COST20220121C440 9.750 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.450 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 4.225 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.700 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 6.425 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 1.975 21 \n", - " META &L:META20220916C380&S:META20220916C385 1.600 2 \n", - " AMZN &L:AMZN20220617C5200&S:AMZN20220617C5250 1.675 1 \n", - " COST &L:COST20220121C430&S:COST20220121C440 9.750 4 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.450 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 4.225 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.700 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 6.425 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 1.975 21 \n", - " META &L:META20220916C380&S:META20220916C385 1.600 2 \n", - " AMZN &L:AMZN20220617C5200&S:AMZN20220617C5250 1.675 1 \n", - " COST &L:COST20230120C570&S:COST20230120C600 9.825 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.450 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 4.225 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.700 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 6.425 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 1.975 21 \n", - " META &L:META20220916C380&S:META20220916C385 1.600 2 \n", - " AMZN &L:AMZN20220617C5200&S:AMZN20220617C5250 1.675 1 \n", - " COST &L:COST20230120C570&S:COST20230120C600 9.825 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.450 8 \n", - "2021-11-23 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 4.325 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.625 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 5.975 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 2.800 21 \n", - " META &L:META20220916C380&S:META20220916C385 1.475 2 \n", - " AMZN &L:AMZN20220617C5200&S:AMZN20220617C5250 1.800 1 \n", - " COST &L:COST20230120C570&S:COST20230120C600 11.300 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.450 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 4.325 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.625 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 5.975 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 2.800 21 \n", - " META &L:META20220916C380&S:META20220916C385 1.475 2 \n", - " AMZN &L:AMZN20220617C5200&S:AMZN20220617C5250 1.800 1 \n", - " COST &L:COST20230120C570&S:COST20230120C600 11.300 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.450 8 \n", - "2021-11-24 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 4.375 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.275 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 6.525 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 4.950 21 \n", - " META &L:META20220916C380&S:META20220916C385 1.550 2 \n", - " AMZN &L:AMZN20220617C5200&S:AMZN20220617C5250 1.825 1 \n", - " COST &L:COST20230120C570&S:COST20230120C600 11.525 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.775 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 4.375 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.275 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 6.525 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 4.950 21 \n", - " META &L:META20220916C380&S:META20220916C385 1.550 2 \n", - " AMZN &L:AMZN20220617C5200&S:AMZN20220617C5250 1.825 1 \n", - " COST &L:COST20230120C570&S:COST20230120C600 11.525 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.775 8 \n", - "2021-11-25 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 4.375 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.275 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 6.525 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 2.900 21 \n", - " META &L:META20220916C380&S:META20220916C385 3.125 2 \n", - " AMZN &L:AMZN20220617C5200&S:AMZN20220617C5250 1.825 1 \n", - " COST &L:COST20230120C570&S:COST20230120C600 12.125 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.775 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 4.375 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.275 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 6.525 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 2.900 21 \n", - " META &L:META20220916C380&S:META20220916C385 3.125 2 \n", - " AMZN &L:AMZN20220617C5200&S:AMZN20220617C5250 1.825 1 \n", - " COST &L:COST20230120C570&S:COST20230120C600 12.125 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.775 8 \n", - "2021-11-26 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.800 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.200 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 6.725 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 2.900 21 \n", - " META &L:META20220916C380&S:META20220916C385 0.300 2 \n", - " AMZN &L:AMZN20220617C5200&S:AMZN20220617C5250 1.675 1 \n", - " COST &L:COST20230120C570&S:COST20230120C600 10.750 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.575 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 3.800 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.200 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 6.725 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 2.900 21 \n", - " META &L:META20220916C380&S:META20220916C385 0.300 2 \n", - " AMZN &L:AMZN20220617C5200&S:AMZN20220617C5250 1.675 1 \n", - " COST &L:COST20230120C570&S:COST20230120C600 10.750 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.575 8 \n", - "2021-11-29 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 4.275 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.525 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 6.475 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 4.625 21 \n", - " AMZN &L:AMZN20220617C5200&S:AMZN20220617C5250 1.600 1 \n", - " COST &L:COST20230120C570&S:COST20230120C600 11.850 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.325 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 4.275 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.525 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 6.475 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 4.625 21 \n", - " AMZN &L:AMZN20220617C5200&S:AMZN20220617C5250 1.600 1 \n", - " COST &L:COST20230120C570&S:COST20230120C600 11.850 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.325 8 \n", - "2021-11-30 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 4.900 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.725 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 5.700 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 3.200 21 \n", - " AMZN &L:AMZN20220617C5200&S:AMZN20220617C5250 1.475 1 \n", - " COST &L:COST20230120C570&S:COST20230120C600 11.025 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.675 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 4.900 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.725 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 5.700 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 3.200 21 \n", - " AMZN &L:AMZN20220617C5200&S:AMZN20220617C5250 1.475 1 \n", - " COST &L:COST20230120C570&S:COST20230120C600 11.025 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.675 8 \n", - "2021-12-01 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 4.675 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.325 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 4.200 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 2.675 21 \n", - " AMZN &L:AMZN20220617C5200&S:AMZN20220617C5250 1.275 1 \n", - " COST &L:COST20230120C570&S:COST20230120C600 10.025 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.675 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 4.675 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.325 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 4.200 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 2.675 21 \n", - " AMZN &L:AMZN20220617C5200&S:AMZN20220617C5250 1.275 1 \n", - " COST &L:COST20230120C570&S:COST20230120C600 10.025 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.675 8 \n", - "2021-12-02 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 5.125 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.275 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 3.950 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 3.250 21 \n", - " AMZN &L:AMZN20220617C5200&S:AMZN20220617C5250 1.150 1 \n", - " COST &L:COST20230120C570&S:COST20230120C600 10.050 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.525 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 5.125 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.275 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 3.950 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 3.250 21 \n", - " AMZN &L:AMZN20220617C5200&S:AMZN20220617C5250 1.150 1 \n", - " COST &L:COST20230120C570&S:COST20230120C600 10.050 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.525 8 \n", - "2021-12-03 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 4.600 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 7.225 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 3.475 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 3.800 21 \n", - " AMZN &L:AMZN20220617C5200&S:AMZN20220617C5250 0.025 1 \n", - " COST &L:COST20230120C570&S:COST20230120C600 10.225 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.200 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 4.600 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 7.225 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 3.475 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 3.800 21 \n", - " AMZN &L:AMZN20220617C5200&S:AMZN20220617C5250 0.025 1 \n", - " COST &L:COST20230120C570&S:COST20230120C600 10.225 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.200 8 \n", - "2021-12-06 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 5.300 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 4.750 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 4.000 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 3.400 21 \n", - " COST &L:COST20230120C570&S:COST20230120C600 10.350 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.100 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 5.300 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 4.750 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 4.000 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 3.400 21 \n", - " COST &L:COST20230120C570&S:COST20230120C600 10.350 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.100 8 \n", - "2021-12-07 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 5.575 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.050 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 4.450 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 3.700 21 \n", - " COST &L:COST20230120C570&S:COST20230120C600 10.050 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.025 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 5.575 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.050 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 4.450 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 3.700 21 \n", - " COST &L:COST20230120C570&S:COST20230120C600 10.050 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.025 8 \n", - "2021-12-08 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 6.175 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.175 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 4.350 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 1.700 21 \n", - " COST &L:COST20230120C570&S:COST20230120C600 9.950 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.300 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 6.175 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.175 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 4.350 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 1.700 21 \n", - " COST &L:COST20230120C570&S:COST20230120C600 9.950 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.300 8 \n", - "2021-12-09 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 5.975 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 4.425 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 3.475 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 3.325 21 \n", - " COST &L:COST20230120C570&S:COST20230120C600 9.050 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.100 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 5.975 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 4.425 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 3.475 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 3.325 21 \n", - " COST &L:COST20230120C570&S:COST20230120C600 9.050 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.100 8 \n", - "2021-12-10 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 6.575 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.250 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 3.175 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 2.675 21 \n", - " COST &L:COST20230120C570&S:COST20230120C600 13.375 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 2.525 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 6.575 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.250 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 3.175 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 2.675 21 \n", - " COST &L:COST20230120C570&S:COST20230120C600 13.375 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 2.525 8 \n", - "2021-12-13 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 5.300 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 2.975 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 2.900 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 2.425 21 \n", - " COST &L:COST20230120C570&S:COST20230120C600 12.850 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.000 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 5.300 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 2.975 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 2.900 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 2.425 21 \n", - " COST &L:COST20230120C570&S:COST20230120C600 12.850 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.000 8 \n", - "2021-12-14 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 5.875 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 4.450 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 2.775 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 2.775 21 \n", - " COST &L:COST20230120C570&S:COST20230120C600 12.025 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.275 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 5.875 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 4.450 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 2.775 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 2.775 21 \n", - " COST &L:COST20230120C570&S:COST20230120C600 12.025 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.275 8 \n", - "2021-12-15 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 6.550 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 4.775 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 2.750 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 3.000 21 \n", - " COST &L:COST20230120C570&S:COST20230120C600 12.950 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.600 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 6.550 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 4.775 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 2.750 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 3.000 21 \n", - " COST &L:COST20230120C570&S:COST20230120C600 12.950 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.600 8 \n", - "2021-12-16 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 5.875 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 4.300 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 2.200 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 1.600 21 \n", - " COST &L:COST20230120C570&S:COST20230120C600 11.775 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.100 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 5.875 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 4.300 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 2.200 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 1.600 21 \n", - " COST &L:COST20230120C570&S:COST20230120C600 11.775 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.100 8 \n", - "2021-12-17 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 5.250 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 4.275 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 2.050 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 2.500 21 \n", - " COST &L:COST20230120C570&S:COST20230120C600 11.475 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.025 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 5.250 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 4.275 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 2.050 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 2.500 21 \n", - " COST &L:COST20230120C570&S:COST20230120C600 11.475 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.025 8 \n", - "2021-12-20 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 5.450 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 3.650 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 2.525 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 2.200 21 \n", - " COST &L:COST20230120C570&S:COST20230120C600 11.800 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.000 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 5.450 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 3.650 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 2.525 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 2.200 21 \n", - " COST &L:COST20230120C570&S:COST20230120C600 11.800 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.000 8 \n", - "2021-12-21 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 5.900 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 3.500 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 2.750 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 2.525 21 \n", - " COST &L:COST20230120C570&S:COST20230120C600 12.850 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.475 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 5.900 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 3.500 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 2.750 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 2.525 21 \n", - " COST &L:COST20230120C570&S:COST20230120C600 12.850 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.475 8 \n", - "2021-12-22 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 6.250 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 3.975 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 3.075 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 1.950 21 \n", - " COST &L:COST20230120C570&S:COST20230120C600 10.500 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.550 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 6.250 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 3.975 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 3.075 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 1.950 21 \n", - " COST &L:COST20230120C570&S:COST20230120C600 10.500 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.550 8 \n", - "2021-12-23 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 6.325 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.225 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 3.025 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 2.900 21 \n", - " COST &L:COST20230120C570&S:COST20230120C600 10.425 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.675 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 6.325 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.225 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 3.025 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 2.900 21 \n", - " COST &L:COST20230120C570&S:COST20230120C600 10.425 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.675 8 \n", - "2021-12-24 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 6.325 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.225 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 3.025 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 2.900 21 \n", - " COST &L:COST20230120C570&S:COST20230120C600 10.425 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.675 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 6.325 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.225 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 3.025 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 2.900 21 \n", - " COST &L:COST20230120C570&S:COST20230120C600 10.425 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.675 8 \n", - "2021-12-27 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 6.725 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.175 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 2.825 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 3.425 21 \n", - " COST &L:COST20230120C570&S:COST20230120C600 10.600 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 4.075 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 6.725 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.175 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 2.825 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 3.425 21 \n", - " COST &L:COST20230120C570&S:COST20230120C600 10.600 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 4.075 8 \n", - "2021-12-28 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 6.900 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 4.850 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 2.725 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 3.075 21 \n", - " COST &L:COST20230120C570&S:COST20230120C600 15.075 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.875 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 6.900 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 4.850 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 2.725 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 3.075 21 \n", - " COST &L:COST20230120C570&S:COST20230120C600 15.075 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.875 8 \n", - "2021-12-29 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 6.600 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.325 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 2.650 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 3.050 21 \n", - " COST &L:COST20230120C570&S:COST20230120C600 13.375 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.625 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 6.600 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.325 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 2.650 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 3.050 21 \n", - " COST &L:COST20230120C570&S:COST20230120C600 13.375 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.625 8 \n", - "2021-12-30 AAPL &L:AAPL20220617C160&S:AAPL20220617C170 6.675 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.350 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 2.650 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 2.900 21 \n", - " COST &L:COST20230120C570&S:COST20230120C600 12.600 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.425 8 \n", - " AAPL &L:AAPL20220617C160&S:AAPL20220617C170 6.675 2 \n", - " TSLA &L:TSLA20220916C900&S:TSLA20220916C910 5.350 9 \n", - " NFLX &L:NFLX20220318C700&S:NFLX20220318C720 2.650 2 \n", - " NVDA &L:NVDA20230120C375&S:NVDA20230120C387.5 2.900 21 \n", - " COST &L:COST20230120C570&S:COST20230120C600 12.600 3 \n", - " AMD &L:AMD20220617C115&S:AMD20220617C120 3.425 8 \n", - "\n", - " market_value \n", - "datetime symbol \n", - "2021-01-05 AAPL 1460.0 \n", - " TSLA 1365.0 \n", - " AAPL 1460.0 \n", - " TSLA 1365.0 \n", - "2021-01-06 AAPL 1300.0 \n", - " TSLA 1410.0 \n", - " AAPL 1300.0 \n", - " TSLA 1410.0 \n", - "2021-01-07 AAPL 1500.0 \n", - " TSLA 1575.0 \n", - " AAPL 1500.0 \n", - " TSLA 1575.0 \n", - "2021-01-08 AAPL 1560.0 \n", - " TSLA 1845.0 \n", - " AAPL 1560.0 \n", - " TSLA 1845.0 \n", - "2021-01-11 AAPL 1440.0 \n", - " TSLA 1590.0 \n", - " AAPL 1440.0 \n", - " TSLA 1590.0 \n", - "2021-01-12 AAPL 1400.0 \n", - " TSLA 1710.0 \n", - " AAPL 1400.0 \n", - " TSLA 1710.0 \n", - "2021-01-13 AAPL 1480.0 \n", - " TSLA 1755.0 \n", - " AAPL 1480.0 \n", - " TSLA 1755.0 \n", - "2021-01-14 AAPL 1840.0 \n", - " TSLA 1695.0 \n", - " AAPL 1840.0 \n", - " TSLA 1695.0 \n", - "2021-01-15 AAPL 1260.0 \n", - " TSLA 1725.0 \n", - " AAPL 1260.0 \n", - " TSLA 1725.0 \n", - "2021-01-18 AAPL 1280.0 \n", - " TSLA 1785.0 \n", - " AAPL 1280.0 \n", - " TSLA 1785.0 \n", - "2021-01-19 AAPL 1280.0 \n", - " TSLA 1785.0 \n", - " AAPL 1280.0 \n", - " TSLA 1785.0 \n", - "2021-01-20 AAPL 1540.0 \n", - " TSLA 1800.0 \n", - " AAPL 1540.0 \n", - " TSLA 1800.0 \n", - "2021-01-21 AAPL 1780.0 \n", - " TSLA 1950.0 \n", - " AAPL 1780.0 \n", - " TSLA 1950.0 \n", - "2021-01-22 AAPL 1500.0 \n", - " TSLA 1800.0 \n", - " NFLX 945.0 \n", - " AAPL 1500.0 \n", - " TSLA 1800.0 \n", - " NFLX 945.0 \n", - "2021-01-25 AAPL 2160.0 \n", - " TSLA 1860.0 \n", - " NFLX 847.5 \n", - " AAPL 2160.0 \n", - " TSLA 1860.0 \n", - " NFLX 847.5 \n", - "2021-01-26 AAPL 2140.0 \n", - " TSLA 1695.0 \n", - " NFLX 870.0 \n", - " AAPL 2140.0 \n", - " TSLA 1695.0 \n", - " NFLX 870.0 \n", - "2021-01-27 AAPL 2440.0 \n", - " TSLA 1785.0 \n", - " NFLX 690.0 \n", - " AAPL 2440.0 \n", - " TSLA 1785.0 \n", - " NFLX 690.0 \n", - "2021-01-28 AAPL 1620.0 \n", - " TSLA 1680.0 \n", - " NFLX 787.5 \n", - " AAPL 1620.0 \n", - " TSLA 1680.0 \n", - " NFLX 787.5 \n", - "2021-01-29 AAPL 1700.0 \n", - " TSLA 1560.0 \n", - " NFLX 757.5 \n", - " AAPL 1700.0 \n", - " TSLA 1560.0 \n", - " NFLX 757.5 \n", - "2021-02-01 AAPL 1640.0 \n", - " TSLA 1665.0 \n", - " NFLX 795.0 \n", - " AAPL 1640.0 \n", - " TSLA 1665.0 \n", - " NFLX 795.0 \n", - "2021-02-02 AAPL 1820.0 \n", - " TSLA 1860.0 \n", - " NFLX 862.5 \n", - " AAPL 1820.0 \n", - " TSLA 1860.0 \n", - " NFLX 862.5 \n", - "2021-02-03 AAPL 1580.0 \n", - " TSLA 1800.0 \n", - " NFLX 765.0 \n", - " AAPL 1580.0 \n", - " TSLA 1800.0 \n", - " NFLX 765.0 \n", - "2021-02-04 AAPL 1760.0 \n", - " TSLA 1830.0 \n", - " NFLX 772.5 \n", - " AAPL 1760.0 \n", - " TSLA 1830.0 \n", - " NFLX 772.5 \n", - "2021-02-05 AAPL 1720.0 \n", - " TSLA 1860.0 \n", - " NFLX 810.0 \n", - " AAPL 1720.0 \n", - " TSLA 1860.0 \n", - " NFLX 810.0 \n", - "2021-02-08 AAPL 1740.0 \n", - " TSLA 1785.0 \n", - " NFLX 1252.5 \n", - " AAPL 1740.0 \n", - " TSLA 1785.0 \n", - " NFLX 1252.5 \n", - "2021-02-09 AAPL 1660.0 \n", - " TSLA 1890.0 \n", - " NFLX 877.5 \n", - " AAPL 1660.0 \n", - " TSLA 1890.0 \n", - " NFLX 877.5 \n", - "2021-02-10 AAPL 1620.0 \n", - " TSLA 1785.0 \n", - " NFLX 870.0 \n", - " AAPL 1620.0 \n", - " TSLA 1785.0 \n", - " NFLX 870.0 \n", - "2021-02-11 AAPL 1540.0 \n", - " TSLA 1770.0 \n", - " NFLX 847.5 \n", - " AAPL 1540.0 \n", - " TSLA 1770.0 \n", - " NFLX 847.5 \n", - "2021-02-12 AAPL 1580.0 \n", - " TSLA 1770.0 \n", - " NFLX 877.5 \n", - " AAPL 1580.0 \n", - " TSLA 1770.0 \n", - " NFLX 877.5 \n", - "2021-02-15 AAPL 1500.0 \n", - " TSLA 1620.0 \n", - " NFLX 862.5 \n", - " AAPL 1500.0 \n", - " TSLA 1620.0 \n", - " NFLX 862.5 \n", - "2021-02-16 AAPL 1500.0 \n", - " TSLA 1620.0 \n", - " NFLX 862.5 \n", - " AAPL 1500.0 \n", - " TSLA 1620.0 \n", - " NFLX 862.5 \n", - "2021-02-17 AAPL 1360.0 \n", - " TSLA 1755.0 \n", - " NFLX 832.5 \n", - " AAPL 1360.0 \n", - " TSLA 1755.0 \n", - " NFLX 832.5 \n", - "2021-02-18 AAPL 1240.0 \n", - " TSLA 1710.0 \n", - " NFLX 832.5 \n", - " NVDA 3540.0 \n", - " AAPL 1240.0 \n", - " TSLA 1710.0 \n", - " NFLX 832.5 \n", - " NVDA 3540.0 \n", - "2021-02-19 AAPL 1280.0 \n", - " TSLA 1680.0 \n", - " NFLX 712.5 \n", - " NVDA 3700.0 \n", - " AAPL 1280.0 \n", - " TSLA 1680.0 \n", - " NFLX 712.5 \n", - " NVDA 3700.0 \n", - "2021-02-22 AAPL 1280.0 \n", - " TSLA 1530.0 \n", - " NFLX 840.0 \n", - " NVDA 3280.0 \n", - " AAPL 1280.0 \n", - " TSLA 1530.0 \n", - " NFLX 840.0 \n", - " NVDA 3280.0 \n", - "2021-02-23 AAPL 1100.0 \n", - " TSLA 1275.0 \n", - " NFLX 840.0 \n", - " NVDA 3200.0 \n", - " AAPL 1100.0 \n", - " TSLA 1275.0 \n", - " NFLX 840.0 \n", - " NVDA 3200.0 \n", - "2021-02-24 AAPL 1140.0 \n", - " TSLA 1560.0 \n", - " NFLX 750.0 \n", - " NVDA 4000.0 \n", - " AAPL 1140.0 \n", - " TSLA 1560.0 \n", - " NFLX 750.0 \n", - " NVDA 4000.0 \n", - "2021-02-25 AAPL 920.0 \n", - " TSLA 1215.0 \n", - " NFLX 810.0 \n", - " NVDA 2620.0 \n", - " AAPL 920.0 \n", - " TSLA 1215.0 \n", - " NFLX 810.0 \n", - " NVDA 2620.0 \n", - "2021-02-26 AAPL 720.0 \n", - " TSLA 1575.0 \n", - " NFLX 750.0 \n", - " NVDA 3560.0 \n", - " AAPL 720.0 \n", - " TSLA 1575.0 \n", - " NFLX 750.0 \n", - " NVDA 3560.0 \n", - "2021-03-01 AAPL 1140.0 \n", - " TSLA 1410.0 \n", - " NFLX 982.5 \n", - " NVDA 2900.0 \n", - " AAPL 1140.0 \n", - " TSLA 1410.0 \n", - " NFLX 982.5 \n", - " NVDA 2900.0 \n", - "2021-03-02 AAPL 1020.0 \n", - " TSLA 1365.0 \n", - " NFLX 847.5 \n", - " NVDA 2420.0 \n", - " AAPL 1020.0 \n", - " TSLA 1365.0 \n", - " NFLX 847.5 \n", - " NVDA 2420.0 \n", - "2021-03-03 AAPL 860.0 \n", - " TSLA 1170.0 \n", - " NFLX 742.5 \n", - " NVDA 1880.0 \n", - " AAPL 860.0 \n", - " TSLA 1170.0 \n", - " NFLX 742.5 \n", - " NVDA 1880.0 \n", - "2021-03-04 AAPL 760.0 \n", - " TSLA 1035.0 \n", - " NFLX 570.0 \n", - " NVDA 1900.0 \n", - " AAPL 760.0 \n", - " TSLA 1035.0 \n", - " NFLX 570.0 \n", - " NVDA 1900.0 \n", - "2021-03-05 TSLA 900.0 \n", - " NFLX 705.0 \n", - " TSLA 900.0 \n", - " NFLX 705.0 \n", - "2021-03-08 TSLA 735.0 \n", - " NFLX 712.5 \n", - " TSLA 735.0 \n", - " NFLX 712.5 \n", - "2021-03-09 TSLA 1230.0 \n", - " TSLA 1230.0 \n", - "2021-03-10 TSLA 1230.0 \n", - " TSLA 1230.0 \n", - "2021-03-11 TSLA 1350.0 \n", - " BA 987.5 \n", - " TSLA 1350.0 \n", - " BA 987.5 \n", - "2021-03-12 TSLA 1320.0 \n", - " NVDA 1737.5 \n", - " BA 1262.5 \n", - " TSLA 1320.0 \n", - " NVDA 1737.5 \n", - " BA 1262.5 \n", - "2021-03-15 TSLA 1380.0 \n", - " NVDA 1712.5 \n", - " BA 1150.0 \n", - " TSLA 1380.0 \n", - " NVDA 1712.5 \n", - " BA 1150.0 \n", - "2021-03-16 AAPL 800.0 \n", - " TSLA 1275.0 \n", - " NVDA 2112.5 \n", - " BA 1037.5 \n", - " AAPL 800.0 \n", - " TSLA 1275.0 \n", - " NVDA 2112.5 \n", - " BA 1037.5 \n", - "2021-03-17 AAPL 780.0 \n", - " TSLA 1380.0 \n", - " NVDA 1725.0 \n", - " BA 1150.0 \n", - " AAPL 780.0 \n", - " TSLA 1380.0 \n", - " NVDA 1725.0 \n", - " BA 1150.0 \n", - "2021-03-18 AAPL 660.0 \n", - " TSLA 1200.0 \n", - " NVDA 1537.5 \n", - " BA 1050.0 \n", - " AAPL 660.0 \n", - " TSLA 1200.0 \n", - " NVDA 1537.5 \n", - " BA 1050.0 \n", - "2021-03-19 TSLA 1200.0 \n", - " NVDA 2100.0 \n", - " BA 1012.5 \n", - " TSLA 1200.0 \n", - " NVDA 2100.0 \n", - " BA 1012.5 \n", - "2021-03-22 TSLA 1245.0 \n", - " NVDA 1787.5 \n", - " BA 887.5 \n", - " TSLA 1245.0 \n", - " NVDA 1787.5 \n", - " BA 887.5 \n", - "2021-03-23 AAPL 570.0 \n", - " TSLA 1230.0 \n", - " NVDA 1675.0 \n", - " BA 787.5 \n", - " META 395.0 \n", - " AAPL 570.0 \n", - " TSLA 1230.0 \n", - " NVDA 1675.0 \n", - " BA 787.5 \n", - " META 395.0 \n", - "2021-03-24 AAPL 502.5 \n", - " TSLA 1065.0 \n", - " NVDA 1475.0 \n", - " BA 725.0 \n", - " META 270.0 \n", - " AAPL 502.5 \n", - " TSLA 1065.0 \n", - " NVDA 1475.0 \n", - " BA 725.0 \n", - " META 270.0 \n", - "2021-03-25 TSLA 1080.0 \n", - " BA 825.0 \n", - " META 260.0 \n", - " TSLA 1080.0 \n", - " BA 825.0 \n", - " META 260.0 \n", - "2021-03-26 TSLA 975.0 \n", - " BA 825.0 \n", - " META 275.0 \n", - " TSLA 975.0 \n", - " BA 825.0 \n", - " META 275.0 \n", - "2021-03-29 TSLA 945.0 \n", - " BA 900.0 \n", - " META 315.0 \n", - " TSLA 945.0 \n", - " BA 900.0 \n", - " META 315.0 \n", - "2021-03-30 TSLA 1020.0 \n", - " NVDA 1370.0 \n", - " BA 975.0 \n", - " META 300.0 \n", - " TSLA 1020.0 \n", - " NVDA 1370.0 \n", - " BA 975.0 \n", - " META 300.0 \n", - "2021-03-31 TSLA 1230.0 \n", - " NVDA 1420.0 \n", - " BA 837.5 \n", - " META 200.0 \n", - " TSLA 1230.0 \n", - " NVDA 1420.0 \n", - " BA 837.5 \n", - " META 200.0 \n", - "2021-04-01 TSLA 1200.0 \n", - " NVDA 1650.0 \n", - " BA 750.0 \n", - " META 365.0 \n", - " TSLA 1200.0 \n", - " NVDA 1650.0 \n", - " BA 750.0 \n", - " META 365.0 \n", - "2021-04-02 TSLA 1200.0 \n", - " NVDA 1650.0 \n", - " BA 750.0 \n", - " META 365.0 \n", - " TSLA 1200.0 \n", - " NVDA 1650.0 \n", - " BA 750.0 \n", - " META 365.0 \n", - "2021-04-05 TSLA 1260.0 \n", - " NVDA 1690.0 \n", - " BA 1400.0 \n", - " META 385.0 \n", - " TSLA 1260.0 \n", - " NVDA 1690.0 \n", - " BA 1400.0 \n", - " META 385.0 \n", - "2021-04-06 AAPL 577.5 \n", - " TSLA 1320.0 \n", - " NVDA 1670.0 \n", - " BA 900.0 \n", - " META 370.0 \n", - " AAPL 577.5 \n", - " TSLA 1320.0 \n", - " NVDA 1670.0 \n", - " BA 900.0 \n", - " META 370.0 \n", - "2021-04-07 AAPL 622.5 \n", - " TSLA 1275.0 \n", - " NVDA 1600.0 \n", - " BA 687.5 \n", - " META 385.0 \n", - " AAPL 622.5 \n", - " TSLA 1275.0 \n", - " NVDA 1600.0 \n", - " BA 687.5 \n", - " META 385.0 \n", - "2021-04-08 AAPL 705.0 \n", - " TSLA 1290.0 \n", - " NVDA 1880.0 \n", - " BA 762.5 \n", - " META 400.0 \n", - " AAPL 705.0 \n", - " TSLA 1290.0 \n", - " NVDA 1880.0 \n", - " BA 762.5 \n", - " META 400.0 \n", - "2021-04-09 AAPL 772.5 \n", - " TSLA 1185.0 \n", - " NVDA 1960.0 \n", - " BA 875.0 \n", - " META 390.0 \n", - " AAPL 772.5 \n", - " TSLA 1185.0 \n", - " NVDA 1960.0 \n", - " BA 875.0 \n", - " META 390.0 \n", - "2021-04-12 AAPL 750.0 \n", - " TSLA 1335.0 \n", - " NVDA 2430.0 \n", - " BA 775.0 \n", - " META 275.0 \n", - " AAPL 750.0 \n", - " TSLA 1335.0 \n", - " NVDA 2430.0 \n", - " BA 775.0 \n", - " META 275.0 \n", - "2021-04-13 AAPL 832.5 \n", - " TSLA 1620.0 \n", - " NVDA 2980.0 \n", - " BA 512.5 \n", - " META 375.0 \n", - " AAPL 832.5 \n", - " TSLA 1620.0 \n", - " NVDA 2980.0 \n", - " BA 512.5 \n", - " META 375.0 \n", - "2021-04-14 AAPL 787.5 \n", - " TSLA 1620.0 \n", - " NVDA 2000.0 \n", - " BA 1062.5 \n", - " META 425.0 \n", - " AMZN 1125.0 \n", - " AAPL 787.5 \n", - " TSLA 1620.0 \n", - " NVDA 2000.0 \n", - " BA 1062.5 \n", - " META 425.0 \n", - " AMZN 1125.0 \n", - "2021-04-15 AAPL 847.5 \n", - " TSLA 1515.0 \n", - " NVDA 2930.0 \n", - " BA 687.5 \n", - " META 280.0 \n", - " AMZN 1305.0 \n", - " AAPL 847.5 \n", - " TSLA 1515.0 \n", - " NVDA 2930.0 \n", - " BA 687.5 \n", - " META 280.0 \n", - " AMZN 1305.0 \n", - "2021-04-16 AAPL 832.5 \n", - " TSLA 1545.0 \n", - " NVDA 2660.0 \n", - " BA 787.5 \n", - " META 345.0 \n", - " AMZN 1340.0 \n", - " COST 580.0 \n", - " AAPL 832.5 \n", - " TSLA 1545.0 \n", - " NVDA 2660.0 \n", - " BA 787.5 \n", - " META 345.0 \n", - " AMZN 1340.0 \n", - " COST 580.0 \n", - "2021-04-19 AAPL 832.5 \n", - " TSLA 1395.0 \n", - " NVDA 2490.0 \n", - " BA 1225.0 \n", - " META 325.0 \n", - " AMZN 1295.0 \n", - " COST 680.0 \n", - " AAPL 832.5 \n", - " TSLA 1395.0 \n", - " NVDA 2490.0 \n", - " BA 1225.0 \n", - " META 325.0 \n", - " AMZN 1295.0 \n", - " COST 680.0 \n", - "2021-04-20 AAPL 780.0 \n", - " TSLA 1365.0 \n", - " NVDA 2410.0 \n", - " BA 400.0 \n", - " META 340.0 \n", - " AMZN 1075.0 \n", - " COST 620.0 \n", - " SBUX 654.0 \n", - " AAPL 780.0 \n", - " TSLA 1365.0 \n", - " NVDA 2410.0 \n", - " BA 400.0 \n", - " META 340.0 \n", - " AMZN 1075.0 \n", - " COST 620.0 \n", - " SBUX 654.0 \n", - "2021-04-21 AAPL 772.5 \n", - " TSLA 1455.0 \n", - " NVDA 2500.0 \n", - " BA 412.5 \n", - " META 350.0 \n", - " AMZN 1190.0 \n", - " COST 770.0 \n", - " SBUX 696.0 \n", - " AAPL 772.5 \n", - " TSLA 1455.0 \n", - " NVDA 2500.0 \n", - " BA 412.5 \n", - " META 350.0 \n", - " AMZN 1190.0 \n", - " COST 770.0 \n", - " SBUX 696.0 \n", - "2021-04-22 AAPL 735.0 \n", - " TSLA 1470.0 \n", - " NVDA 2240.0 \n", - " BA 587.5 \n", - " META 325.0 \n", - " AMZN 1065.0 \n", - " COST 630.0 \n", - " SBUX 742.0 \n", - " AAPL 735.0 \n", - " TSLA 1470.0 \n", - " NVDA 2240.0 \n", - " BA 587.5 \n", - " META 325.0 \n", - " AMZN 1065.0 \n", - " COST 630.0 \n", - " SBUX 742.0 \n", - "2021-04-23 AAPL 772.5 \n", - " TSLA 1725.0 \n", - " NVDA 2480.0 \n", - " BA 687.5 \n", - " META 340.0 \n", - " AMZN 1130.0 \n", - " COST 590.0 \n", - " SBUX 820.0 \n", - " AAPL 772.5 \n", - " TSLA 1725.0 \n", - " NVDA 2480.0 \n", - " BA 687.5 \n", - " META 340.0 \n", - " AMZN 1130.0 \n", - " COST 590.0 \n", - " SBUX 820.0 \n", - "2021-04-26 AAPL 772.5 \n", - " TSLA 1545.0 \n", - " NVDA 2680.0 \n", - " BA 437.5 \n", - " META 365.0 \n", - " AMZN 1360.0 \n", - " COST 840.0 \n", - " SBUX 736.0 \n", - " AAPL 772.5 \n", - " TSLA 1545.0 \n", - " NVDA 2680.0 \n", - " BA 437.5 \n", - " META 365.0 \n", - " AMZN 1360.0 \n", - " COST 840.0 \n", - " SBUX 736.0 \n", - "2021-04-27 AAPL 772.5 \n", - " TSLA 1380.0 \n", - " NVDA 2460.0 \n", - " BA 362.5 \n", - " META 355.0 \n", - " AMZN 1400.0 \n", - " COST 500.0 \n", - " SBUX 722.0 \n", - " AAPL 772.5 \n", - " TSLA 1380.0 \n", - " NVDA 2460.0 \n", - " BA 362.5 \n", - " META 355.0 \n", - " AMZN 1400.0 \n", - " COST 500.0 \n", - " SBUX 722.0 \n", - "2021-04-28 AAPL 232.5 \n", - " TSLA 1320.0 \n", - " NVDA 2450.0 \n", - " BA 787.5 \n", - " META 415.0 \n", - " AMZN 1430.0 \n", - " COST 830.0 \n", - " SBUX 508.0 \n", - " AAPL 232.5 \n", - " TSLA 1320.0 \n", - " NVDA 2450.0 \n", - " BA 787.5 \n", - " META 415.0 \n", - " AMZN 1430.0 \n", - " COST 830.0 \n", - " SBUX 508.0 \n", - "2021-04-29 AAPL 712.5 \n", - " TSLA 1365.0 \n", - " NVDA 2520.0 \n", - " BA 587.5 \n", - " META 570.0 \n", - " AMZN 1600.0 \n", - " COST 740.0 \n", - " SBUX 566.0 \n", - " AAPL 712.5 \n", - " TSLA 1365.0 \n", - " NVDA 2520.0 \n", - " BA 587.5 \n", - " META 570.0 \n", - " AMZN 1600.0 \n", - " COST 740.0 \n", - " SBUX 566.0 \n", - "2021-04-30 AAPL 682.5 \n", - " TSLA 1365.0 \n", - " NVDA 3250.0 \n", - " BA 337.5 \n", - " META 465.0 \n", - " AMZN 1440.0 \n", - " COST 650.0 \n", - " SBUX 662.0 \n", - " AAPL 682.5 \n", - " TSLA 1365.0 \n", - " NVDA 3250.0 \n", - " BA 337.5 \n", - " META 465.0 \n", - " AMZN 1440.0 \n", - " COST 650.0 \n", - " SBUX 662.0 \n", - "2021-05-03 AAPL 682.5 \n", - " TSLA 1185.0 \n", - " NVDA 2120.0 \n", - " BA 175.0 \n", - " META 420.0 \n", - " AMZN 1160.0 \n", - " COST 580.0 \n", - " SBUX 636.0 \n", - " AAPL 682.5 \n", - " TSLA 1185.0 \n", - " NVDA 2120.0 \n", - " BA 175.0 \n", - " META 420.0 \n", - " AMZN 1160.0 \n", - " COST 580.0 \n", - " SBUX 636.0 \n", - "2021-05-04 AAPL 562.5 \n", - " TSLA 1215.0 \n", - " NVDA 1920.0 \n", - " BA 437.5 \n", - " META 330.0 \n", - " AMZN 1040.0 \n", - " COST 680.0 \n", - " SBUX 520.0 \n", - " AAPL 562.5 \n", - " TSLA 1215.0 \n", - " NVDA 1920.0 \n", - " BA 437.5 \n", - " META 330.0 \n", - " AMZN 1040.0 \n", - " COST 680.0 \n", - " SBUX 520.0 \n", - "2021-05-05 AAPL 555.0 \n", - " TSLA 1155.0 \n", - " NVDA 2040.0 \n", - " BA 362.5 \n", - " META 395.0 \n", - " AMZN 920.0 \n", - " COST 530.0 \n", - " SBUX 520.0 \n", - " AAPL 555.0 \n", - " TSLA 1155.0 \n", - " NVDA 2040.0 \n", - " BA 362.5 \n", - " META 395.0 \n", - " AMZN 920.0 \n", - " COST 530.0 \n", - " SBUX 520.0 \n", - "2021-05-06 AAPL 577.5 \n", - " TSLA 1125.0 \n", - " NVDA 2020.0 \n", - " BA 412.5 \n", - " META 260.0 \n", - " AMZN 915.0 \n", - " COST 520.0 \n", - " SBUX 512.0 \n", - " AAPL 577.5 \n", - " TSLA 1125.0 \n", - " NVDA 2020.0 \n", - " BA 412.5 \n", - " META 260.0 \n", - " AMZN 915.0 \n", - " COST 520.0 \n", - " SBUX 512.0 \n", - "2021-05-07 AAPL 600.0 \n", - " TSLA 1125.0 \n", - " NVDA 2110.0 \n", - " BA 487.5 \n", - " META 325.0 \n", - " AMZN 840.0 \n", - " COST 810.0 \n", - " SBUX 564.0 \n", - " AAPL 600.0 \n", - " TSLA 1125.0 \n", - " NVDA 2110.0 \n", - " BA 487.5 \n", - " META 325.0 \n", - " AMZN 840.0 \n", - " COST 810.0 \n", - " SBUX 564.0 \n", - "2021-05-10 AAPL 517.5 \n", - " TSLA 945.0 \n", - " NVDA 1860.0 \n", - " BA 212.5 \n", - " META 365.0 \n", - " AMZN 490.0 \n", - " COST 770.0 \n", - " SBUX 530.0 \n", - " AAPL 517.5 \n", - " TSLA 945.0 \n", - " NVDA 1860.0 \n", - " BA 212.5 \n", - " META 365.0 \n", - " AMZN 490.0 \n", - " COST 770.0 \n", - " SBUX 530.0 \n", - "2021-05-11 AAPL 486.0 \n", - " TSLA 855.0 \n", - " NVDA 1880.0 \n", - " BA 287.5 \n", - " META 315.0 \n", - " COST 570.0 \n", - " SBUX 508.0 \n", - " AAPL 486.0 \n", - " TSLA 855.0 \n", - " NVDA 1880.0 \n", - " BA 287.5 \n", - " META 315.0 \n", - " COST 570.0 \n", - " SBUX 508.0 \n", - "2021-05-12 AAPL 448.5 \n", - " NVDA 1630.0 \n", - " BA 200.0 \n", - " META 365.0 \n", - " COST 630.0 \n", - " SBUX 444.0 \n", - " AAPL 448.5 \n", - " NVDA 1630.0 \n", - " BA 200.0 \n", - " META 365.0 \n", - " COST 630.0 \n", - " SBUX 444.0 \n", - "2021-05-13 NVDA 1640.0 \n", - " META 365.0 \n", - " COST 620.0 \n", - " SBUX 396.0 \n", - " NVDA 1640.0 \n", - " META 365.0 \n", - " COST 620.0 \n", - " SBUX 396.0 \n", - "2021-05-14 NVDA 1830.0 \n", - " META 415.0 \n", - " COST 780.0 \n", - " SBUX 474.0 \n", - " NVDA 1830.0 \n", - " META 415.0 \n", - " COST 780.0 \n", - " SBUX 474.0 \n", - "2021-05-17 AAPL 395.0 \n", - " NVDA 1810.0 \n", - " META 410.0 \n", - " COST 930.0 \n", - " SBUX 450.0 \n", - " AAPL 395.0 \n", - " NVDA 1810.0 \n", - " META 410.0 \n", - " COST 930.0 \n", - " SBUX 450.0 \n", - "2021-05-18 AAPL 380.0 \n", - " NVDA 1690.0 \n", - " META 370.0 \n", - " COST 830.0 \n", - " SBUX 410.0 \n", - " AAPL 380.0 \n", - " NVDA 1690.0 \n", - " META 370.0 \n", - " COST 830.0 \n", - " SBUX 410.0 \n", - "2021-05-19 NVDA 1760.0 \n", - " META 400.0 \n", - " COST 780.0 \n", - " SBUX 378.0 \n", - " NVDA 1760.0 \n", - " META 400.0 \n", - " COST 780.0 \n", - " SBUX 378.0 \n", - "2021-05-20 NVDA 2330.0 \n", - " META 425.0 \n", - " COST 810.0 \n", - " SBUX 460.0 \n", - " NVDA 2330.0 \n", - " META 425.0 \n", - " COST 810.0 \n", - " SBUX 460.0 \n", - "2021-05-21 AAPL 380.0 \n", - " NVDA 2340.0 \n", - " META 285.0 \n", - " COST 660.0 \n", - " SBUX 460.0 \n", - " AAPL 380.0 \n", - " NVDA 2340.0 \n", - " META 285.0 \n", - " COST 660.0 \n", - " SBUX 460.0 \n", - "2021-05-24 NVDA 2630.0 \n", - " META 450.0 \n", - " COST 260.0 \n", - " SBUX 264.0 \n", - " NVDA 2630.0 \n", - " META 450.0 \n", - " COST 260.0 \n", - " SBUX 264.0 \n", - "2021-05-25 NVDA 2630.0 \n", - " META 460.0 \n", - " COST 970.0 \n", - " SBUX 416.0 \n", - " NVDA 2630.0 \n", - " META 460.0 \n", - " COST 970.0 \n", - " SBUX 416.0 \n", - "2021-05-26 NVDA 2730.0 \n", - " META 465.0 \n", - " COST 580.0 \n", - " SBUX 438.0 \n", - " NVDA 2730.0 \n", - " META 465.0 \n", - " COST 580.0 \n", - " SBUX 438.0 \n", - "2021-05-27 NVDA 2550.0 \n", - " META 485.0 \n", - " COST 790.0 \n", - " SBUX 470.0 \n", - " NVDA 2550.0 \n", - " META 485.0 \n", - " COST 790.0 \n", - " SBUX 470.0 \n", - "2021-05-28 NVDA 3020.0 \n", - " META 305.0 \n", - " COST 780.0 \n", - " SBUX 454.0 \n", - " NVDA 3020.0 \n", - " META 305.0 \n", - " COST 780.0 \n", - " SBUX 454.0 \n", - "2021-05-31 NVDA 2730.0 \n", - " META 470.0 \n", - " COST 570.0 \n", - " SBUX 404.0 \n", - " NVDA 2730.0 \n", - " META 470.0 \n", - " COST 570.0 \n", - " SBUX 404.0 \n", - "2021-06-01 NVDA 2730.0 \n", - " META 470.0 \n", - " COST 570.0 \n", - " SBUX 404.0 \n", - " NVDA 2730.0 \n", - " META 470.0 \n", - " COST 570.0 \n", - " SBUX 404.0 \n", - "2021-06-02 NVDA 3360.0 \n", - " META 465.0 \n", - " COST 640.0 \n", - " SBUX 374.0 \n", - " NVDA 3360.0 \n", - " META 465.0 \n", - " COST 640.0 \n", - " SBUX 374.0 \n", - "2021-06-03 NVDA 3470.0 \n", - " META 460.0 \n", - " COST 710.0 \n", - " SBUX 306.0 \n", - " NVDA 3470.0 \n", - " META 460.0 \n", - " COST 710.0 \n", - " SBUX 306.0 \n", - "2021-06-04 NVDA 3850.0 \n", - " META 480.0 \n", - " COST 790.0 \n", - " SBUX 330.0 \n", - " NVDA 3850.0 \n", - " META 480.0 \n", - " COST 790.0 \n", - " SBUX 330.0 \n", - "2021-06-07 NVDA 3750.0 \n", - " META 430.0 \n", - " COST 620.0 \n", - " SBUX 290.0 \n", - " NVDA 3750.0 \n", - " META 430.0 \n", - " COST 620.0 \n", - " SBUX 290.0 \n", - "2021-06-08 NVDA 3760.0 \n", - " META 455.0 \n", - " COST 620.0 \n", - " SBUX 306.0 \n", - " NVDA 3760.0 \n", - " META 455.0 \n", - " COST 620.0 \n", - " SBUX 306.0 \n", - "2021-06-09 NVDA 3720.0 \n", - " META 490.0 \n", - " COST 640.0 \n", - " SBUX 314.0 \n", - " NVDA 3720.0 \n", - " META 490.0 \n", - " COST 640.0 \n", - " SBUX 314.0 \n", - "2021-06-10 NVDA 3710.0 \n", - " META 510.0 \n", - " COST 720.0 \n", - " SBUX 316.0 \n", - " NVDA 3710.0 \n", - " META 510.0 \n", - " COST 720.0 \n", - " SBUX 316.0 \n", - "2021-06-11 NVDA 4010.0 \n", - " META 485.0 \n", - " COST 690.0 \n", - " SBUX 306.0 \n", - " NVDA 4010.0 \n", - " META 485.0 \n", - " COST 690.0 \n", - " SBUX 306.0 \n", - "2021-06-14 NVDA 3950.0 \n", - " META 520.0 \n", - " COST 680.0 \n", - " SBUX 294.0 \n", - " NVDA 3950.0 \n", - " META 520.0 \n", - " COST 680.0 \n", - " SBUX 294.0 \n", - "2021-06-15 NVDA 4110.0 \n", - " META 510.0 \n", - " COST 690.0 \n", - " SBUX 276.0 \n", - " NVDA 4110.0 \n", - " META 510.0 \n", - " COST 690.0 \n", - " SBUX 276.0 \n", - "2021-06-16 NVDA 3980.0 \n", - " META 495.0 \n", - " COST 570.0 \n", - " SBUX 266.0 \n", - " NVDA 3980.0 \n", - " META 495.0 \n", - " COST 570.0 \n", - " SBUX 266.0 \n", - "2021-06-17 NVDA 4440.0 \n", - " META 510.0 \n", - " COST 730.0 \n", - " SBUX 272.0 \n", - " NVDA 4440.0 \n", - " META 510.0 \n", - " COST 730.0 \n", - " SBUX 272.0 \n", - "2021-06-18 NVDA 4470.0 \n", - " META 455.0 \n", - " COST 670.0 \n", - " SBUX 246.0 \n", - " NVDA 4470.0 \n", - " META 455.0 \n", - " COST 670.0 \n", - " SBUX 246.0 \n", - "2021-06-21 NVDA 4390.0 \n", - " META 495.0 \n", - " COST 720.0 \n", - " NVDA 4390.0 \n", - " META 495.0 \n", - " COST 720.0 \n", - "2021-06-22 NVDA 4790.0 \n", - " META 415.0 \n", - " COST 860.0 \n", - " NVDA 4790.0 \n", - " META 415.0 \n", - " COST 860.0 \n", - "2021-06-23 NVDA 4870.0 \n", - " META 540.0 \n", - " AMZN 765.0 \n", - " COST 820.0 \n", - " NVDA 4870.0 \n", - " META 540.0 \n", - " AMZN 765.0 \n", - " COST 820.0 \n", - "2021-06-24 NVDA 5470.0 \n", - " META 600.0 \n", - " AMZN 645.0 \n", - " COST 860.0 \n", - " NVDA 5470.0 \n", - " META 600.0 \n", - " AMZN 645.0 \n", - " COST 860.0 \n", - "2021-06-25 NVDA 4790.0 \n", - " META 540.0 \n", - " AMZN 540.0 \n", - " COST 760.0 \n", - " NVDA 4790.0 \n", - " META 540.0 \n", - " AMZN 540.0 \n", - " COST 760.0 \n", - "2021-06-28 NVDA 5340.0 \n", - " META 665.0 \n", - " AMZN 570.0 \n", - " COST 1100.0 \n", - " NVDA 5340.0 \n", - " META 665.0 \n", - " AMZN 570.0 \n", - " COST 1100.0 \n", - "2021-06-29 NVDA 5270.0 \n", - " META 605.0 \n", - " AMZN 595.0 \n", - " COST 970.0 \n", - " NVDA 5270.0 \n", - " META 605.0 \n", - " AMZN 595.0 \n", - " COST 970.0 \n", - "2021-06-30 NVDA 5380.0 \n", - " META 655.0 \n", - " AMZN 520.0 \n", - " COST 860.0 \n", - " NVDA 5380.0 \n", - " META 655.0 \n", - " AMZN 520.0 \n", - " COST 860.0 \n", - "2021-07-01 AAPL 400.0 \n", - " NVDA 5310.0 \n", - " META 605.0 \n", - " AMZN 515.0 \n", - " COST 1000.0 \n", - " AMD 2200.0 \n", - " AAPL 400.0 \n", - " NVDA 5310.0 \n", - " META 605.0 \n", - " AMZN 515.0 \n", - " COST 1000.0 \n", - " AMD 2200.0 \n", - "2021-07-02 AAPL 450.0 \n", - " NVDA 5170.0 \n", - " META 625.0 \n", - " AMZN 670.0 \n", - " COST 970.0 \n", - " AMD 2475.0 \n", - " AAPL 450.0 \n", - " NVDA 5170.0 \n", - " META 625.0 \n", - " AMZN 670.0 \n", - " COST 970.0 \n", - " AMD 2475.0 \n", - "2021-07-05 AAPL 495.0 \n", - " NVDA 5550.0 \n", - " META 640.0 \n", - " AMZN 1110.0 \n", - " COST 980.0 \n", - " AMD 2750.0 \n", - " AAPL 495.0 \n", - " NVDA 5550.0 \n", - " META 640.0 \n", - " AMZN 1110.0 \n", - " COST 980.0 \n", - " AMD 2750.0 \n", - "2021-07-06 AAPL 495.0 \n", - " NVDA 5550.0 \n", - " META 640.0 \n", - " AMZN 1110.0 \n", - " COST 980.0 \n", - " AMD 2750.0 \n", - " AAPL 495.0 \n", - " NVDA 5550.0 \n", - " META 640.0 \n", - " AMZN 1110.0 \n", - " COST 980.0 \n", - " AMD 2750.0 \n", - "2021-07-07 AAPL 550.0 \n", - " NVDA 5370.0 \n", - " META 610.0 \n", - " AMZN 1205.0 \n", - " COST 1130.0 \n", - " AMD 2007.5 \n", - " AAPL 550.0 \n", - " NVDA 5370.0 \n", - " META 610.0 \n", - " AMZN 1205.0 \n", - " COST 1130.0 \n", - " AMD 2007.5 \n", - "2021-07-08 AAPL 515.0 \n", - " NVDA 5550.0 \n", - " META 505.0 \n", - " AMZN 1320.0 \n", - " COST 1280.0 \n", - " AMD 2090.0 \n", - " AAPL 515.0 \n", - " NVDA 5550.0 \n", - " META 505.0 \n", - " AMZN 1320.0 \n", - " COST 1280.0 \n", - " AMD 2090.0 \n", - "2021-07-09 AAPL 555.0 \n", - " NVDA 5140.0 \n", - " META 585.0 \n", - " AMZN 1240.0 \n", - " COST 1330.0 \n", - " AMD 2035.0 \n", - " AAPL 555.0 \n", - " NVDA 5140.0 \n", - " META 585.0 \n", - " AMZN 1240.0 \n", - " COST 1330.0 \n", - " AMD 2035.0 \n", - "2021-07-12 AAPL 540.0 \n", - " NVDA 5670.0 \n", - " META 595.0 \n", - " AMZN 1190.0 \n", - " COST 1130.0 \n", - " AMD 2200.0 \n", - " AAPL 540.0 \n", - " NVDA 5670.0 \n", - " META 595.0 \n", - " AMZN 1190.0 \n", - " COST 1130.0 \n", - " AMD 2200.0 \n", - "2021-07-13 AAPL 565.0 \n", - " NVDA 5230.0 \n", - " META 605.0 \n", - " AMZN 1085.0 \n", - " COST 910.0 \n", - " AMD 2007.5 \n", - " AAPL 565.0 \n", - " NVDA 5230.0 \n", - " META 605.0 \n", - " AMZN 1085.0 \n", - " COST 910.0 \n", - " AMD 2007.5 \n", - "2021-07-14 AAPL 635.0 \n", - " NVDA 5280.0 \n", - " META 580.0 \n", - " AMZN 1075.0 \n", - " COST 1170.0 \n", - " SBUX 193.0 \n", - " AMD 1705.0 \n", - " AAPL 635.0 \n", - " NVDA 5280.0 \n", - " META 580.0 \n", - " AMZN 1075.0 \n", - " COST 1170.0 \n", - " SBUX 193.0 \n", - " AMD 1705.0 \n", - "2021-07-15 AAPL 610.0 \n", - " NFLX 817.5 \n", - " NVDA 4830.0 \n", - " META 545.0 \n", - " AMZN 930.0 \n", - " COST 1320.0 \n", - " SBUX 179.5 \n", - " AMD 1485.0 \n", - " AAPL 610.0 \n", - " NFLX 817.5 \n", - " NVDA 4830.0 \n", - " META 545.0 \n", - " AMZN 930.0 \n", - " COST 1320.0 \n", - " SBUX 179.5 \n", - " AMD 1485.0 \n", - "2021-07-16 AAPL 575.0 \n", - " NFLX 667.5 \n", - " NVDA 4380.0 \n", - " META 370.0 \n", - " AMZN 810.0 \n", - " COST 1160.0 \n", - " SBUX 178.0 \n", - " AAPL 575.0 \n", - " NFLX 667.5 \n", - " NVDA 4380.0 \n", - " META 370.0 \n", - " AMZN 810.0 \n", - " COST 1160.0 \n", - " SBUX 178.0 \n", - "2021-07-19 AAPL 510.0 \n", - " NFLX 690.0 \n", - " NVDA 4660.0 \n", - " META 540.0 \n", - " AMZN 760.0 \n", - " COST 1300.0 \n", - " SBUX 142.0 \n", - " AAPL 510.0 \n", - " NFLX 690.0 \n", - " NVDA 4660.0 \n", - " META 540.0 \n", - " AMZN 760.0 \n", - " COST 1300.0 \n", - " SBUX 142.0 \n", - "2021-07-20 AAPL 580.0 \n", - " NFLX 735.0 \n", - " NVDA 4660.0 \n", - " META 540.0 \n", - " AMZN 735.0 \n", - " COST 1470.0 \n", - " AAPL 580.0 \n", - " NFLX 735.0 \n", - " NVDA 4660.0 \n", - " META 540.0 \n", - " AMZN 735.0 \n", - " COST 1470.0 \n", - "2021-07-21 AAPL 565.0 \n", - " NFLX 525.0 \n", - " NVDA 4660.0 \n", - " META 580.0 \n", - " AMZN 740.0 \n", - " COST 1410.0 \n", - " AAPL 565.0 \n", - " NFLX 525.0 \n", - " NVDA 4660.0 \n", - " META 580.0 \n", - " AMZN 740.0 \n", - " COST 1410.0 \n", - "2021-07-22 AAPL 590.0 \n", - " NVDA 4660.0 \n", - " META 640.0 \n", - " AMZN 855.0 \n", - " COST 1480.0 \n", - " SBUX 182.5 \n", - " AAPL 590.0 \n", - " NVDA 4660.0 \n", - " META 640.0 \n", - " AMZN 855.0 \n", - " COST 1480.0 \n", - " SBUX 182.5 \n", - "2021-07-23 AAPL 620.0 \n", - " NVDA 4660.0 \n", - " META 645.0 \n", - " AMZN 895.0 \n", - " COST 1560.0 \n", - " SBUX 287.5 \n", - " AAPL 620.0 \n", - " NVDA 4660.0 \n", - " META 645.0 \n", - " AMZN 895.0 \n", - " COST 1560.0 \n", - " SBUX 287.5 \n", - "2021-07-26 AAPL 620.0 \n", - " NVDA 4660.0 \n", - " META 715.0 \n", - " AMZN 1045.0 \n", - " COST 1620.0 \n", - " SBUX 245.0 \n", - " AAPL 620.0 \n", - " NVDA 4660.0 \n", - " META 715.0 \n", - " AMZN 1045.0 \n", - " COST 1620.0 \n", - " SBUX 245.0 \n", - "2021-07-27 AAPL 585.0 \n", - " NVDA 4660.0 \n", - " META 640.0 \n", - " AMZN 850.0 \n", - " COST 1730.0 \n", - " SBUX 240.0 \n", - " AAPL 585.0 \n", - " NVDA 4660.0 \n", - " META 640.0 \n", - " AMZN 850.0 \n", - " COST 1730.0 \n", - " SBUX 240.0 \n", - "2021-07-28 AAPL 540.0 \n", - " NVDA 4660.0 \n", - " META 650.0 \n", - " AMZN 795.0 \n", - " COST 1700.0 \n", - " SBUX 184.5 \n", - " AAPL 540.0 \n", - " NVDA 4660.0 \n", - " META 650.0 \n", - " AMZN 795.0 \n", - " COST 1700.0 \n", - " SBUX 184.5 \n", - "2021-07-29 AAPL 555.0 \n", - " NVDA 4660.0 \n", - " META 665.0 \n", - " AMZN 705.0 \n", - " COST 1600.0 \n", - " SBUX 183.0 \n", - " AAPL 555.0 \n", - " NVDA 4660.0 \n", - " META 665.0 \n", - " AMZN 705.0 \n", - " COST 1600.0 \n", - " SBUX 183.0 \n", - "2021-07-30 AAPL 555.0 \n", - " NVDA 4660.0 \n", - " META 645.0 \n", - " AMZN 285.0 \n", - " COST 1890.0 \n", - " SBUX 179.5 \n", - " AMD 1540.0 \n", - " AAPL 555.0 \n", - " NVDA 4660.0 \n", - " META 645.0 \n", - " AMZN 285.0 \n", - " COST 1890.0 \n", - " SBUX 179.5 \n", - " AMD 1540.0 \n", - "2021-08-02 AAPL 550.0 \n", - " NVDA 4660.0 \n", - " META 645.0 \n", - " COST 1750.0 \n", - " SBUX 144.5 \n", - " AMD 1460.0 \n", - " AAPL 550.0 \n", - " NVDA 4660.0 \n", - " META 645.0 \n", - " COST 1750.0 \n", - " SBUX 144.5 \n", - " AMD 1460.0 \n", - "2021-08-03 AAPL 590.0 \n", - " NVDA 4660.0 \n", - " META 630.0 \n", - " COST 2050.0 \n", - " SBUX 145.0 \n", - " AMD 960.0 \n", - " AAPL 590.0 \n", - " NVDA 4660.0 \n", - " META 630.0 \n", - " COST 2050.0 \n", - " SBUX 145.0 \n", - " AMD 960.0 \n", - "2021-08-04 AAPL 580.0 \n", - " NVDA 4660.0 \n", - " META 640.0 \n", - " COST 2040.0 \n", - " SBUX 149.5 \n", - " AMD 1140.0 \n", - " AAPL 580.0 \n", - " NVDA 4660.0 \n", - " META 640.0 \n", - " COST 2040.0 \n", - " SBUX 149.5 \n", - " AMD 1140.0 \n", - "2021-08-05 AAPL 580.0 \n", - " NVDA 4660.0 \n", - " META 685.0 \n", - " COST 2170.0 \n", - " SBUX 87.5 \n", - " AMD 760.0 \n", - " AAPL 580.0 \n", - " NVDA 4660.0 \n", - " META 685.0 \n", - " COST 2170.0 \n", - " SBUX 87.5 \n", - " AMD 760.0 \n", - "2021-08-06 AAPL 555.0 \n", - " NVDA 4660.0 \n", - " META 695.0 \n", - " COST 2120.0 \n", - " SBUX 127.5 \n", - " AMD 940.0 \n", - " AAPL 555.0 \n", - " NVDA 4660.0 \n", - " META 695.0 \n", - " COST 2120.0 \n", - " SBUX 127.5 \n", - " AMD 940.0 \n", - "2021-08-09 AAPL 560.0 \n", - " NVDA 4660.0 \n", - " META 670.0 \n", - " COST 2130.0 \n", - " SBUX 153.0 \n", - " AMD 1220.0 \n", - " AAPL 560.0 \n", - " NVDA 4660.0 \n", - " META 670.0 \n", - " COST 2130.0 \n", - " SBUX 153.0 \n", - " AMD 1220.0 \n", - "2021-08-10 AAPL 550.0 \n", - " NVDA 4660.0 \n", - " META 665.0 \n", - " COST 2350.0 \n", - " SBUX 52.0 \n", - " AMD 1540.0 \n", - " AAPL 550.0 \n", - " NVDA 4660.0 \n", - " META 665.0 \n", - " COST 2350.0 \n", - " SBUX 52.0 \n", - " AMD 1540.0 \n", - "2021-08-11 AAPL 560.0 \n", - " NVDA 4660.0 \n", - " META 670.0 \n", - " COST 2320.0 \n", - " SBUX 101.5 \n", - " AMD 1300.0 \n", - " AAPL 560.0 \n", - " NVDA 4660.0 \n", - " META 670.0 \n", - " COST 2320.0 \n", - " SBUX 101.5 \n", - " AMD 1300.0 \n", - "2021-08-12 AAPL 625.0 \n", - " NVDA 4660.0 \n", - " META 685.0 \n", - " COST 2370.0 \n", - " SBUX 109.0 \n", - " AMD 1960.0 \n", - " AAPL 625.0 \n", - " NVDA 4660.0 \n", - " META 685.0 \n", - " COST 2370.0 \n", - " SBUX 109.0 \n", - " AMD 1960.0 \n", - "2021-08-13 AAPL 620.0 \n", - " NVDA 4660.0 \n", - " META 680.0 \n", - " COST 2390.0 \n", - " SBUX 100.0 \n", - " AMD 1440.0 \n", - " AAPL 620.0 \n", - " NVDA 4660.0 \n", - " META 680.0 \n", - " COST 2390.0 \n", - " SBUX 100.0 \n", - " AMD 1440.0 \n", - "2021-08-16 AAPL 670.0 \n", - " NVDA 4660.0 \n", - " META 710.0 \n", - " COST 2550.0 \n", - " SBUX 123.5 \n", - " AMD 1240.0 \n", - " AAPL 670.0 \n", - " NVDA 4660.0 \n", - " META 710.0 \n", - " COST 2550.0 \n", - " SBUX 123.5 \n", - " AMD 1240.0 \n", - "2021-08-17 AAPL 650.0 \n", - " NVDA 4660.0 \n", - " META 655.0 \n", - " COST 2560.0 \n", - " SBUX 122.0 \n", - " AMD 1280.0 \n", - " AAPL 650.0 \n", - " NVDA 4660.0 \n", - " META 655.0 \n", - " COST 2560.0 \n", - " SBUX 122.0 \n", - " AMD 1280.0 \n", - "2021-08-18 AAPL 585.0 \n", - " NVDA 4660.0 \n", - " META 655.0 \n", - " COST 2370.0 \n", - " SBUX 73.0 \n", - " AMD 1140.0 \n", - " AAPL 585.0 \n", - " NVDA 4660.0 \n", - " META 655.0 \n", - " COST 2370.0 \n", - " SBUX 73.0 \n", - " AMD 1140.0 \n", - "2021-08-19 AAPL 580.0 \n", - " NVDA 4660.0 \n", - " META 655.0 \n", - " COST 2650.0 \n", - " SBUX 65.5 \n", - " AMD 1160.0 \n", - " AAPL 580.0 \n", - " NVDA 4660.0 \n", - " META 655.0 \n", - " COST 2650.0 \n", - " SBUX 65.5 \n", - " AMD 1160.0 \n", - "2021-08-20 AAPL 610.0 \n", - " NVDA 4660.0 \n", - " META 685.0 \n", - " COST 2740.0 \n", - " AMD 1260.0 \n", - " AAPL 610.0 \n", - " NVDA 4660.0 \n", - " META 685.0 \n", - " COST 2740.0 \n", - " AMD 1260.0 \n", - "2021-08-23 AAPL 635.0 \n", - " NVDA 4660.0 \n", - " META 720.0 \n", - " COST 2690.0 \n", - " AMD 1440.0 \n", - " AAPL 635.0 \n", - " NVDA 4660.0 \n", - " META 720.0 \n", - " COST 2690.0 \n", - " AMD 1440.0 \n", - "2021-08-24 AAPL 625.0 \n", - " NVDA 4660.0 \n", - " META 715.0 \n", - " COST 2540.0 \n", - " AMD 1340.0 \n", - " AAPL 625.0 \n", - " NVDA 4660.0 \n", - " META 715.0 \n", - " COST 2540.0 \n", - " AMD 1340.0 \n", - "2021-08-25 AAPL 600.0 \n", - " NVDA 4660.0 \n", - " META 735.0 \n", - " COST 2560.0 \n", - " AMD 1360.0 \n", - " AAPL 600.0 \n", - " NVDA 4660.0 \n", - " META 735.0 \n", - " COST 2560.0 \n", - " AMD 1360.0 \n", - "2021-08-26 AAPL 580.0 \n", - " NVDA 4660.0 \n", - " META 725.0 \n", - " COST 2460.0 \n", - " AMD 1300.0 \n", - " AAPL 580.0 \n", - " NVDA 4660.0 \n", - " META 725.0 \n", - " COST 2460.0 \n", - " AMD 1300.0 \n", - "2021-08-27 AAPL 590.0 \n", - " NFLX 395.0 \n", - " NVDA 4660.0 \n", - " META 755.0 \n", - " COST 2470.0 \n", - " AMD 1480.0 \n", - " AAPL 590.0 \n", - " NFLX 395.0 \n", - " NVDA 4660.0 \n", - " META 755.0 \n", - " COST 2470.0 \n", - " AMD 1480.0 \n", - "2021-08-30 AAPL 695.0 \n", - " NFLX 525.0 \n", - " NVDA 4660.0 \n", - " META 795.0 \n", - " COST 2660.0 \n", - " AMD 1460.0 \n", - " AAPL 695.0 \n", - " NFLX 525.0 \n", - " NVDA 4660.0 \n", - " META 795.0 \n", - " COST 2660.0 \n", - " AMD 1460.0 \n", - "2021-08-31 AAPL 670.0 \n", - " NFLX 500.0 \n", - " NVDA 4660.0 \n", - " META 790.0 \n", - " COST 2680.0 \n", - " AMD 1460.0 \n", - " AAPL 670.0 \n", - " NFLX 500.0 \n", - " NVDA 4660.0 \n", - " META 790.0 \n", - " COST 2680.0 \n", - " AMD 1460.0 \n", - "2021-09-01 AAPL 670.0 \n", - " NFLX 585.0 \n", - " NVDA 4660.0 \n", - " META 800.0 \n", - " AMZN 385.0 \n", - " COST 2700.0 \n", - " AMD 1440.0 \n", - " AAPL 670.0 \n", - " NFLX 585.0 \n", - " NVDA 4660.0 \n", - " META 800.0 \n", - " AMZN 385.0 \n", - " COST 2700.0 \n", - " AMD 1440.0 \n", - "2021-09-02 AAPL 705.0 \n", - " NFLX 655.0 \n", - " NVDA 4660.0 \n", - " META 770.0 \n", - " AMZN 355.0 \n", - " COST 2800.0 \n", - " AMD 1400.0 \n", - " AAPL 705.0 \n", - " NFLX 655.0 \n", - " NVDA 4660.0 \n", - " META 770.0 \n", - " AMZN 355.0 \n", - " COST 2800.0 \n", - " AMD 1400.0 \n", - "2021-09-03 AAPL 730.0 \n", - " NFLX 820.0 \n", - " NVDA 4660.0 \n", - " META 785.0 \n", - " AMZN 360.0 \n", - " COST 2880.0 \n", - " AMD 1440.0 \n", - " AAPL 730.0 \n", - " NFLX 820.0 \n", - " NVDA 4660.0 \n", - " META 785.0 \n", - " AMZN 360.0 \n", - " COST 2880.0 \n", - " AMD 1440.0 \n", - "2021-09-06 AAPL 770.0 \n", - " NFLX 850.0 \n", - " NVDA 4660.0 \n", - " META 805.0 \n", - " AMZN 405.0 \n", - " COST 2810.0 \n", - " AMD 1360.0 \n", - " AAPL 770.0 \n", - " NFLX 850.0 \n", - " NVDA 4660.0 \n", - " META 805.0 \n", - " AMZN 405.0 \n", - " COST 2810.0 \n", - " AMD 1360.0 \n", - "2021-09-07 AAPL 770.0 \n", - " NFLX 850.0 \n", - " NVDA 4660.0 \n", - " META 805.0 \n", - " AMZN 405.0 \n", - " COST 2810.0 \n", - " AMD 1360.0 \n", - " AAPL 770.0 \n", - " NFLX 850.0 \n", - " NVDA 4660.0 \n", - " META 805.0 \n", - " AMZN 405.0 \n", - " COST 2810.0 \n", - " AMD 1360.0 \n", - "2021-09-08 AAPL 740.0 \n", - " NFLX 835.0 \n", - " NVDA 4660.0 \n", - " META 770.0 \n", - " AMZN 445.0 \n", - " COST 2930.0 \n", - " AMD 1280.0 \n", - " AAPL 740.0 \n", - " NFLX 835.0 \n", - " NVDA 4660.0 \n", - " META 770.0 \n", - " AMZN 445.0 \n", - " COST 2930.0 \n", - " AMD 1280.0 \n", - "2021-09-09 AAPL 715.0 \n", - " NFLX 815.0 \n", - " NVDA 4660.0 \n", - " META 790.0 \n", - " AMZN 375.0 \n", - " COST 2920.0 \n", - " AMD 1280.0 \n", - " AAPL 715.0 \n", - " NFLX 815.0 \n", - " NVDA 4660.0 \n", - " META 790.0 \n", - " AMZN 375.0 \n", - " COST 2920.0 \n", - " AMD 1280.0 \n", - "2021-09-10 AAPL 630.0 \n", - " NFLX 795.0 \n", - " NVDA 4660.0 \n", - " META 795.0 \n", - " AMZN 340.0 \n", - " COST 2580.0 \n", - " AMD 1260.0 \n", - " AAPL 630.0 \n", - " NFLX 795.0 \n", - " NVDA 4660.0 \n", - " META 795.0 \n", - " AMZN 340.0 \n", - " COST 2580.0 \n", - " AMD 1260.0 \n", - "2021-09-13 AAPL 625.0 \n", - " NFLX 730.0 \n", - " NVDA 4660.0 \n", - " META 795.0 \n", - " AMZN 295.0 \n", - " COST 2780.0 \n", - " AMD 1200.0 \n", - " AAPL 625.0 \n", - " NFLX 730.0 \n", - " NVDA 4660.0 \n", - " META 795.0 \n", - " AMZN 295.0 \n", - " COST 2780.0 \n", - " AMD 1200.0 \n", - "2021-09-14 AAPL 590.0 \n", - " NFLX 655.0 \n", - " NVDA 4660.0 \n", - " META 780.0 \n", - " AMZN 260.0 \n", - " COST 2770.0 \n", - " AMD 1240.0 \n", - " AAPL 590.0 \n", - " NFLX 655.0 \n", - " NVDA 4660.0 \n", - " META 780.0 \n", - " AMZN 260.0 \n", - " COST 2770.0 \n", - " AMD 1240.0 \n", - "2021-09-15 AAPL 610.0 \n", - " NFLX 630.0 \n", - " NVDA 4660.0 \n", - " META 805.0 \n", - " AMZN 280.0 \n", - " COST 3000.0 \n", - " AMD 1260.0 \n", - " AAPL 610.0 \n", - " NFLX 630.0 \n", - " NVDA 4660.0 \n", - " META 805.0 \n", - " AMZN 280.0 \n", - " COST 3000.0 \n", - " AMD 1260.0 \n", - "2021-09-16 AAPL 595.0 \n", - " NFLX 645.0 \n", - " NVDA 4660.0 \n", - " META 780.0 \n", - " AMZN 285.0 \n", - " COST 2900.0 \n", - " AMD 1280.0 \n", - " AAPL 595.0 \n", - " NFLX 645.0 \n", - " NVDA 4660.0 \n", - " META 780.0 \n", - " AMZN 285.0 \n", - " COST 2900.0 \n", - " AMD 1280.0 \n", - "2021-09-17 AAPL 540.0 \n", - " NFLX 720.0 \n", - " NVDA 4660.0 \n", - " META 735.0 \n", - " AMZN 250.0 \n", - " COST 2810.0 \n", - " AMD 1200.0 \n", - " AAPL 540.0 \n", - " NFLX 720.0 \n", - " NVDA 4660.0 \n", - " META 735.0 \n", - " AMZN 250.0 \n", - " COST 2810.0 \n", - " AMD 1200.0 \n", - "2021-09-20 AAPL 490.0 \n", - " NFLX 605.0 \n", - " NVDA 4660.0 \n", - " META 690.0 \n", - " AMZN 170.0 \n", - " COST 2560.0 \n", - " AMD 1100.0 \n", - " AAPL 490.0 \n", - " NFLX 605.0 \n", - " NVDA 4660.0 \n", - " META 690.0 \n", - " AMZN 170.0 \n", - " COST 2560.0 \n", - " AMD 1100.0 \n", - "2021-09-21 AAPL 495.0 \n", - " NFLX 560.0 \n", - " NVDA 4660.0 \n", - " META 700.0 \n", - " COST 2560.0 \n", - " AMD 1160.0 \n", - " AAPL 495.0 \n", - " NFLX 560.0 \n", - " NVDA 4660.0 \n", - " META 700.0 \n", - " COST 2560.0 \n", - " AMD 1160.0 \n", - "2021-09-22 AAPL 540.0 \n", - " NFLX 655.0 \n", - " NVDA 4660.0 \n", - " META 635.0 \n", - " COST 2590.0 \n", - " AMD 1240.0 \n", - " AAPL 540.0 \n", - " NFLX 655.0 \n", - " NVDA 4660.0 \n", - " META 635.0 \n", - " COST 2590.0 \n", - " AMD 1240.0 \n", - "2021-09-23 AAPL 560.0 \n", - " NFLX 750.0 \n", - " NVDA 4660.0 \n", - " META 635.0 \n", - " COST 2540.0 \n", - " AMD 1300.0 \n", - " AAPL 560.0 \n", - " NFLX 750.0 \n", - " NVDA 4660.0 \n", - " META 635.0 \n", - " COST 2540.0 \n", - " AMD 1300.0 \n", - "2021-09-24 AAPL 555.0 \n", - " NFLX 675.0 \n", - " NVDA 4660.0 \n", - " META 660.0 \n", - " COST 3270.0 \n", - " AMD 1300.0 \n", - " AAPL 555.0 \n", - " NFLX 675.0 \n", - " NVDA 4660.0 \n", - " META 660.0 \n", - " COST 3270.0 \n", - " AMD 1300.0 \n", - "2021-09-27 AAPL 520.0 \n", - " NFLX 665.0 \n", - " NVDA 4660.0 \n", - " META 685.0 \n", - " COST 2940.0 \n", - " AMD 1400.0 \n", - " AAPL 520.0 \n", - " NFLX 665.0 \n", - " NVDA 4660.0 \n", - " META 685.0 \n", - " COST 2940.0 \n", - " AMD 1400.0 \n", - "2021-09-28 AAPL 460.0 \n", - " NFLX 615.0 \n", - " NVDA 4660.0 \n", - " META 605.0 \n", - " COST 2500.0 \n", - " AMD 1100.0 \n", - " AAPL 460.0 \n", - " NFLX 615.0 \n", - " NVDA 4660.0 \n", - " META 605.0 \n", - " COST 2500.0 \n", - " AMD 1100.0 \n", - "2021-09-29 AAPL 480.0 \n", - " NFLX 775.0 \n", - " NVDA 4660.0 \n", - " META 605.0 \n", - " COST 2610.0 \n", - " AMD 1080.0 \n", - " AAPL 480.0 \n", - " NFLX 775.0 \n", - " NVDA 4660.0 \n", - " META 605.0 \n", - " COST 2610.0 \n", - " AMD 1080.0 \n", - "2021-09-30 AAPL 475.0 \n", - " NFLX 865.0 \n", - " NVDA 4660.0 \n", - " META 585.0 \n", - " COST 2400.0 \n", - " AMD 1140.0 \n", - " AAPL 475.0 \n", - " NFLX 865.0 \n", - " NVDA 4660.0 \n", - " META 585.0 \n", - " COST 2400.0 \n", - " AMD 1140.0 \n", - "2021-10-01 AAPL 455.0 \n", - " NFLX 930.0 \n", - " NVDA 4660.0 \n", - " META 600.0 \n", - " COST 2570.0 \n", - " AMD 1120.0 \n", - " AAPL 455.0 \n", - " NFLX 930.0 \n", - " NVDA 4660.0 \n", - " META 600.0 \n", - " COST 2570.0 \n", - " AMD 1120.0 \n", - "2021-10-04 AAPL 405.0 \n", - " NFLX 815.0 \n", - " NVDA 4660.0 \n", - " META 485.0 \n", - " COST 2270.0 \n", - " AMD 1100.0 \n", - " AAPL 405.0 \n", - " NFLX 815.0 \n", - " NVDA 4660.0 \n", - " META 485.0 \n", - " COST 2270.0 \n", - " AMD 1100.0 \n", - "2021-10-05 AAPL 440.0 \n", - " NFLX 1150.0 \n", - " NVDA 4660.0 \n", - " META 535.0 \n", - " COST 2500.0 \n", - " AMD 1100.0 \n", - " AAPL 440.0 \n", - " NFLX 1150.0 \n", - " NVDA 4660.0 \n", - " META 535.0 \n", - " COST 2500.0 \n", - " AMD 1100.0 \n", - "2021-10-06 AAPL 460.0 \n", - " NFLX 1180.0 \n", - " NVDA 4660.0 \n", - " META 550.0 \n", - " COST 2450.0 \n", - " AMD 1160.0 \n", - " AAPL 460.0 \n", - " NFLX 1180.0 \n", - " NVDA 4660.0 \n", - " META 550.0 \n", - " COST 2450.0 \n", - " AMD 1160.0 \n", - "2021-10-07 AAPL 480.0 \n", - " NFLX 1125.0 \n", - " NVDA 4660.0 \n", - " META 510.0 \n", - " COST 2680.0 \n", - " AMD 1280.0 \n", - " AAPL 480.0 \n", - " NFLX 1125.0 \n", - " NVDA 4660.0 \n", - " META 510.0 \n", - " COST 2680.0 \n", - " AMD 1280.0 \n", - "2021-10-08 AAPL 465.0 \n", - " NFLX 1075.0 \n", - " NVDA 4660.0 \n", - " META 510.0 \n", - " COST 2570.0 \n", - " AMD 1240.0 \n", - " AAPL 465.0 \n", - " NFLX 1075.0 \n", - " NVDA 4660.0 \n", - " META 510.0 \n", - " COST 2570.0 \n", - " AMD 1240.0 \n", - "2021-10-11 AAPL 455.0 \n", - " NFLX 1050.0 \n", - " NVDA 4660.0 \n", - " META 470.0 \n", - " COST 2530.0 \n", - " AMD 1220.0 \n", - " AAPL 455.0 \n", - " NFLX 1050.0 \n", - " NVDA 4660.0 \n", - " META 470.0 \n", - " COST 2530.0 \n", - " AMD 1220.0 \n", - "2021-10-12 AAPL 460.0 \n", - " NFLX 1025.0 \n", - " NVDA 4660.0 \n", - " META 455.0 \n", - " COST 2560.0 \n", - " AMD 1220.0 \n", - " AAPL 460.0 \n", - " NFLX 1025.0 \n", - " NVDA 4660.0 \n", - " META 455.0 \n", - " COST 2560.0 \n", - " AMD 1220.0 \n", - "2021-10-13 AAPL 410.0 \n", - " TSLA 697.5 \n", - " NFLX 1075.0 \n", - " NVDA 4660.0 \n", - " META 470.0 \n", - " COST 2450.0 \n", - " AMD 1420.0 \n", - " AAPL 410.0 \n", - " TSLA 697.5 \n", - " NFLX 1075.0 \n", - " NVDA 4660.0 \n", - " META 470.0 \n", - " COST 2450.0 \n", - " AMD 1420.0 \n", - "2021-10-14 AAPL 450.0 \n", - " TSLA 3172.5 \n", - " NFLX 1055.0 \n", - " NVDA 4660.0 \n", - " META 500.0 \n", - " COST 2670.0 \n", - " AMD 1560.0 \n", - " AAPL 450.0 \n", - " TSLA 3172.5 \n", - " NFLX 1055.0 \n", - " NVDA 4660.0 \n", - " META 500.0 \n", - " COST 2670.0 \n", - " AMD 1560.0 \n", - "2021-10-15 AAPL 475.0 \n", - " TSLA 1237.5 \n", - " NFLX 985.0 \n", - " NVDA 4660.0 \n", - " META 450.0 \n", - " COST 2810.0 \n", - " AMD 1560.0 \n", - " AAPL 475.0 \n", - " TSLA 1237.5 \n", - " NFLX 985.0 \n", - " NVDA 4660.0 \n", - " META 450.0 \n", - " COST 2810.0 \n", - " AMD 1560.0 \n", - "2021-10-18 AAPL 505.0 \n", - " TSLA 4545.0 \n", - " NFLX 1010.0 \n", - " NVDA 4660.0 \n", - " META 540.0 \n", - " COST 3020.0 \n", - " AMD 1680.0 \n", - " AAPL 505.0 \n", - " TSLA 4545.0 \n", - " NFLX 1010.0 \n", - " NVDA 4660.0 \n", - " META 540.0 \n", - " COST 3020.0 \n", - " AMD 1680.0 \n", - "2021-10-19 AAPL 580.0 \n", - " TSLA 6615.0 \n", - " NFLX 1130.0 \n", - " NVDA 4660.0 \n", - " META 585.0 \n", - " COST 3080.0 \n", - " AMD 1720.0 \n", - " AAPL 580.0 \n", - " TSLA 6615.0 \n", - " NFLX 1130.0 \n", - " NVDA 4660.0 \n", - " META 585.0 \n", - " COST 3080.0 \n", - " AMD 1720.0 \n", - "2021-10-20 AAPL 575.0 \n", - " TSLA 2475.0 \n", - " NFLX 865.0 \n", - " NVDA 4660.0 \n", - " META 590.0 \n", - " COST 3150.0 \n", - " AMD 1680.0 \n", - " AAPL 575.0 \n", - " TSLA 2475.0 \n", - " NFLX 865.0 \n", - " NVDA 4660.0 \n", - " META 590.0 \n", - " COST 3150.0 \n", - " AMD 1680.0 \n", - "2021-10-21 AAPL 585.0 \n", - " TSLA 1125.0 \n", - " NFLX 1220.0 \n", - " NVDA 4660.0 \n", - " META 590.0 \n", - " COST 3370.0 \n", - " AMD 1860.0 \n", - " AAPL 585.0 \n", - " TSLA 1125.0 \n", - " NFLX 1220.0 \n", - " NVDA 4660.0 \n", - " META 590.0 \n", - " COST 3370.0 \n", - " AMD 1860.0 \n", - "2021-10-22 AAPL 565.0 \n", - " TSLA 4365.0 \n", - " NFLX 1410.0 \n", - " NVDA 4660.0 \n", - " META 475.0 \n", - " COST 3470.0 \n", - " AMD 1980.0 \n", - " AAPL 565.0 \n", - " TSLA 4365.0 \n", - " NFLX 1410.0 \n", - " NVDA 4660.0 \n", - " META 475.0 \n", - " COST 3470.0 \n", - " AMD 1980.0 \n", - "2021-10-25 AAPL 560.0 \n", - " TSLA 5175.0 \n", - " NFLX 1465.0 \n", - " NVDA 4660.0 \n", - " COST 3500.0 \n", - " AMD 1940.0 \n", - " AAPL 560.0 \n", - " TSLA 5175.0 \n", - " NFLX 1465.0 \n", - " NVDA 4660.0 \n", - " COST 3500.0 \n", - " AMD 1940.0 \n", - "2021-10-26 AAPL 570.0 \n", - " TSLA 4387.5 \n", - " NFLX 1425.0 \n", - " NVDA 4660.0 \n", - " COST 3570.0 \n", - " AMD 1660.0 \n", - " AAPL 570.0 \n", - " TSLA 4387.5 \n", - " NFLX 1425.0 \n", - " NVDA 4660.0 \n", - " COST 3570.0 \n", - " AMD 1660.0 \n", - "2021-10-27 AAPL 565.0 \n", - " TSLA 5107.5 \n", - " NFLX 1340.0 \n", - " NVDA 4660.0 \n", - " COST 3450.0 \n", - " AMD 1920.0 \n", - " AAPL 565.0 \n", - " TSLA 5107.5 \n", - " NFLX 1340.0 \n", - " NVDA 4660.0 \n", - " COST 3450.0 \n", - " AMD 1920.0 \n", - "2021-10-28 AAPL 625.0 \n", - " TSLA 5355.0 \n", - " NFLX 1410.0 \n", - " NVDA 4660.0 \n", - " COST 3540.0 \n", - " AMD 2040.0 \n", - " AAPL 625.0 \n", - " TSLA 5355.0 \n", - " NFLX 1410.0 \n", - " NVDA 4660.0 \n", - " COST 3540.0 \n", - " AMD 2040.0 \n", - "2021-10-29 AAPL 565.0 \n", - " TSLA 3397.5 \n", - " NFLX 1645.0 \n", - " NVDA 4660.0 \n", - " COST 3570.0 \n", - " AMD 2000.0 \n", - " AAPL 565.0 \n", - " TSLA 3397.5 \n", - " NFLX 1645.0 \n", - " NVDA 4660.0 \n", - " COST 3570.0 \n", - " AMD 2000.0 \n", - "2021-11-01 AAPL 555.0 \n", - " TSLA 5715.0 \n", - " NFLX 1535.0 \n", - " NVDA 4660.0 \n", - " COST 3400.0 \n", - " AMD 1880.0 \n", - " AAPL 555.0 \n", - " TSLA 5715.0 \n", - " NFLX 1535.0 \n", - " NVDA 4660.0 \n", - " COST 3400.0 \n", - " AMD 1880.0 \n", - "2021-11-02 AAPL 570.0 \n", - " TSLA 5287.5 \n", - " NFLX 1500.0 \n", - " NVDA 4660.0 \n", - " COST 3730.0 \n", - " AMD 2420.0 \n", - " AAPL 570.0 \n", - " TSLA 5287.5 \n", - " NFLX 1500.0 \n", - " NVDA 4660.0 \n", - " COST 3730.0 \n", - " AMD 2420.0 \n", - "2021-11-03 AAPL 600.0 \n", - " TSLA 5580.0 \n", - " NFLX 1665.0 \n", - " NVDA 4660.0 \n", - " COST 3720.0 \n", - " AMD 2260.0 \n", - " AAPL 600.0 \n", - " TSLA 5580.0 \n", - " NFLX 1665.0 \n", - " NVDA 4660.0 \n", - " COST 3720.0 \n", - " AMD 2260.0 \n", - "2021-11-04 AAPL 590.0 \n", - " TSLA 5400.0 \n", - " NFLX 1380.0 \n", - " NVDA 4660.0 \n", - " COST 3650.0 \n", - " AMD 2380.0 \n", - " AAPL 590.0 \n", - " TSLA 5400.0 \n", - " NFLX 1380.0 \n", - " NVDA 4660.0 \n", - " COST 3650.0 \n", - " AMD 2380.0 \n", - "2021-11-05 AAPL 585.0 \n", - " TSLA 5557.5 \n", - " NFLX 1120.0 \n", - " NVDA 4660.0 \n", - " COST 3760.0 \n", - " AMD 2340.0 \n", - " AAPL 585.0 \n", - " TSLA 5557.5 \n", - " NFLX 1120.0 \n", - " NVDA 4660.0 \n", - " COST 3760.0 \n", - " AMD 2340.0 \n", - "2021-11-08 AAPL 585.0 \n", - " TSLA 4995.0 \n", - " NFLX 1145.0 \n", - " NVDA 4660.0 \n", - " COST 3700.0 \n", - " AMD 2380.0 \n", - " AAPL 585.0 \n", - " TSLA 4995.0 \n", - " NFLX 1145.0 \n", - " NVDA 4660.0 \n", - " COST 3700.0 \n", - " AMD 2380.0 \n", - "2021-11-09 AAPL 595.0 \n", - " TSLA 4297.5 \n", - " NFLX 1250.0 \n", - " NVDA 4660.0 \n", - " COST 3760.0 \n", - " AMD 2420.0 \n", - " AAPL 595.0 \n", - " TSLA 4297.5 \n", - " NFLX 1250.0 \n", - " NVDA 4660.0 \n", - " COST 3760.0 \n", - " AMD 2420.0 \n", - "2021-11-10 AAPL 530.0 \n", - " TSLA 4545.0 \n", - " NFLX 1145.0 \n", - " NVDA 4660.0 \n", - " COST 3670.0 \n", - " AMD 2460.0 \n", - " AAPL 530.0 \n", - " TSLA 4545.0 \n", - " NFLX 1145.0 \n", - " NVDA 4660.0 \n", - " COST 3670.0 \n", - " AMD 2460.0 \n", - "2021-11-11 AAPL 525.0 \n", - " TSLA 4702.5 \n", - " NFLX 1280.0 \n", - " NVDA 4660.0 \n", - " COST 3750.0 \n", - " AMD 2760.0 \n", - " AAPL 525.0 \n", - " TSLA 4702.5 \n", - " NFLX 1280.0 \n", - " NVDA 4660.0 \n", - " COST 3750.0 \n", - " AMD 2760.0 \n", - "2021-11-12 AAPL 575.0 \n", - " TSLA 5512.5 \n", - " NFLX 1565.0 \n", - " NVDA 4660.0 \n", - " COST 3910.0 \n", - " AMD 2820.0 \n", - " AAPL 575.0 \n", - " TSLA 5512.5 \n", - " NFLX 1565.0 \n", - " NVDA 4660.0 \n", - " COST 3910.0 \n", - " AMD 2820.0 \n", - "2021-11-15 AAPL 560.0 \n", - " TSLA 4432.5 \n", - " NFLX 1515.0 \n", - " NVDA 4660.0 \n", - " COST 3760.0 \n", - " AMD 2720.0 \n", - " AAPL 560.0 \n", - " TSLA 4432.5 \n", - " NFLX 1515.0 \n", - " NVDA 4660.0 \n", - " COST 3760.0 \n", - " AMD 2720.0 \n", - "2021-11-16 AAPL 595.0 \n", - " TSLA 4725.0 \n", - " NFLX 1595.0 \n", - " NVDA 4660.0 \n", - " META 315.0 \n", - " COST 3900.0 \n", - " AMD 2880.0 \n", - " AAPL 595.0 \n", - " TSLA 4725.0 \n", - " NFLX 1595.0 \n", - " NVDA 4660.0 \n", - " META 315.0 \n", - " COST 3900.0 \n", - " AMD 2880.0 \n", - "2021-11-17 AAPL 650.0 \n", - " TSLA 5017.5 \n", - " NFLX 1655.0 \n", - " NVDA 4660.0 \n", - " META 310.0 \n", - " COST 3920.0 \n", - " AMD 2900.0 \n", - " AAPL 650.0 \n", - " TSLA 5017.5 \n", - " NFLX 1655.0 \n", - " NVDA 4660.0 \n", - " META 310.0 \n", - " COST 3920.0 \n", - " AMD 2900.0 \n", - "2021-11-18 AAPL 765.0 \n", - " TSLA 4995.0 \n", - " NFLX 1565.0 \n", - " NVDA 4660.0 \n", - " META 300.0 \n", - " AMZN 212.5 \n", - " COST 3900.0 \n", - " AMD 3100.0 \n", - " AAPL 765.0 \n", - " TSLA 4995.0 \n", - " NFLX 1565.0 \n", - " NVDA 4660.0 \n", - " META 300.0 \n", - " AMZN 212.5 \n", - " COST 3900.0 \n", - " AMD 3100.0 \n", - "2021-11-19 AAPL 845.0 \n", - " TSLA 5152.5 \n", - " NFLX 1545.0 \n", - " NVDA 4660.0 \n", - " META 310.0 \n", - " AMZN 210.0 \n", - " COST 3840.0 \n", - " AMD 2940.0 \n", - " AAPL 845.0 \n", - " TSLA 5152.5 \n", - " NFLX 1545.0 \n", - " NVDA 4660.0 \n", - " META 310.0 \n", - " AMZN 210.0 \n", - " COST 3840.0 \n", - " AMD 2940.0 \n", - "2021-11-22 AAPL 845.0 \n", - " TSLA 5130.0 \n", - " NFLX 1285.0 \n", - " NVDA 4660.0 \n", - " META 320.0 \n", - " AMZN 167.5 \n", - " COST 3900.0 \n", - " AMD 2760.0 \n", - " AAPL 845.0 \n", - " TSLA 5130.0 \n", - " NFLX 1285.0 \n", - " NVDA 4147.5 \n", - " META 320.0 \n", - " AMZN 167.5 \n", - " COST 3900.0 \n", - " AMD 2760.0 \n", - " AAPL 845.0 \n", - " TSLA 5130.0 \n", - " NFLX 1285.0 \n", - " NVDA 4147.5 \n", - " META 320.0 \n", - " AMZN 167.5 \n", - " COST 2947.5 \n", - " AMD 2760.0 \n", - " AAPL 845.0 \n", - " TSLA 5130.0 \n", - " NFLX 1285.0 \n", - " NVDA 4147.5 \n", - " META 320.0 \n", - " AMZN 167.5 \n", - " COST 2947.5 \n", - " AMD 2760.0 \n", - "2021-11-23 AAPL 865.0 \n", - " TSLA 5062.5 \n", - " NFLX 1195.0 \n", - " NVDA 5880.0 \n", - " META 295.0 \n", - " AMZN 180.0 \n", - " COST 3390.0 \n", - " AMD 2760.0 \n", - " AAPL 865.0 \n", - " TSLA 5062.5 \n", - " NFLX 1195.0 \n", - " NVDA 5880.0 \n", - " META 295.0 \n", - " AMZN 180.0 \n", - " COST 3390.0 \n", - " AMD 2760.0 \n", - "2021-11-24 AAPL 875.0 \n", - " TSLA 4747.5 \n", - " NFLX 1305.0 \n", - " NVDA 10395.0 \n", - " META 310.0 \n", - " AMZN 182.5 \n", - " COST 3457.5 \n", - " AMD 3020.0 \n", - " AAPL 875.0 \n", - " TSLA 4747.5 \n", - " NFLX 1305.0 \n", - " NVDA 10395.0 \n", - " META 310.0 \n", - " AMZN 182.5 \n", - " COST 3457.5 \n", - " AMD 3020.0 \n", - "2021-11-25 AAPL 875.0 \n", - " TSLA 4747.5 \n", - " NFLX 1305.0 \n", - " NVDA 6090.0 \n", - " META 625.0 \n", - " AMZN 182.5 \n", - " COST 3637.5 \n", - " AMD 3020.0 \n", - " AAPL 875.0 \n", - " TSLA 4747.5 \n", - " NFLX 1305.0 \n", - " NVDA 6090.0 \n", - " META 625.0 \n", - " AMZN 182.5 \n", - " COST 3637.5 \n", - " AMD 3020.0 \n", - "2021-11-26 AAPL 760.0 \n", - " TSLA 4680.0 \n", - " NFLX 1345.0 \n", - " NVDA 6090.0 \n", - " META 60.0 \n", - " AMZN 167.5 \n", - " COST 3225.0 \n", - " AMD 2860.0 \n", - " AAPL 760.0 \n", - " TSLA 4680.0 \n", - " NFLX 1345.0 \n", - " NVDA 6090.0 \n", - " META 60.0 \n", - " AMZN 167.5 \n", - " COST 3225.0 \n", - " AMD 2860.0 \n", - "2021-11-29 AAPL 855.0 \n", - " TSLA 4972.5 \n", - " NFLX 1295.0 \n", - " NVDA 9712.5 \n", - " AMZN 160.0 \n", - " COST 3555.0 \n", - " AMD 2660.0 \n", - " AAPL 855.0 \n", - " TSLA 4972.5 \n", - " NFLX 1295.0 \n", - " NVDA 9712.5 \n", - " AMZN 160.0 \n", - " COST 3555.0 \n", - " AMD 2660.0 \n", - "2021-11-30 AAPL 980.0 \n", - " TSLA 5152.5 \n", - " NFLX 1140.0 \n", - " NVDA 6720.0 \n", - " AMZN 147.5 \n", - " COST 3307.5 \n", - " AMD 2940.0 \n", - " AAPL 980.0 \n", - " TSLA 5152.5 \n", - " NFLX 1140.0 \n", - " NVDA 6720.0 \n", - " AMZN 147.5 \n", - " COST 3307.5 \n", - " AMD 2940.0 \n", - "2021-12-01 AAPL 935.0 \n", - " TSLA 4792.5 \n", - " NFLX 840.0 \n", - " NVDA 5617.5 \n", - " AMZN 127.5 \n", - " COST 3007.5 \n", - " AMD 2940.0 \n", - " AAPL 935.0 \n", - " TSLA 4792.5 \n", - " NFLX 840.0 \n", - " NVDA 5617.5 \n", - " AMZN 127.5 \n", - " COST 3007.5 \n", - " AMD 2940.0 \n", - "2021-12-02 AAPL 1025.0 \n", - " TSLA 4747.5 \n", - " NFLX 790.0 \n", - " NVDA 6825.0 \n", - " AMZN 115.0 \n", - " COST 3015.0 \n", - " AMD 2820.0 \n", - " AAPL 1025.0 \n", - " TSLA 4747.5 \n", - " NFLX 790.0 \n", - " NVDA 6825.0 \n", - " AMZN 115.0 \n", - " COST 3015.0 \n", - " AMD 2820.0 \n", - "2021-12-03 AAPL 920.0 \n", - " TSLA 6502.5 \n", - " NFLX 695.0 \n", - " NVDA 7980.0 \n", - " AMZN 2.5 \n", - " COST 3067.5 \n", - " AMD 2560.0 \n", - " AAPL 920.0 \n", - " TSLA 6502.5 \n", - " NFLX 695.0 \n", - " NVDA 7980.0 \n", - " AMZN 2.5 \n", - " COST 3067.5 \n", - " AMD 2560.0 \n", - "2021-12-06 AAPL 1060.0 \n", - " TSLA 4275.0 \n", - " NFLX 800.0 \n", - " NVDA 7140.0 \n", - " COST 3105.0 \n", - " AMD 2480.0 \n", - " AAPL 1060.0 \n", - " TSLA 4275.0 \n", - " NFLX 800.0 \n", - " NVDA 7140.0 \n", - " COST 3105.0 \n", - " AMD 2480.0 \n", - "2021-12-07 AAPL 1115.0 \n", - " TSLA 4545.0 \n", - " NFLX 890.0 \n", - " NVDA 7770.0 \n", - " COST 3015.0 \n", - " AMD 2420.0 \n", - " AAPL 1115.0 \n", - " TSLA 4545.0 \n", - " NFLX 890.0 \n", - " NVDA 7770.0 \n", - " COST 3015.0 \n", - " AMD 2420.0 \n", - "2021-12-08 AAPL 1235.0 \n", - " TSLA 4657.5 \n", - " NFLX 870.0 \n", - " NVDA 3570.0 \n", - " COST 2985.0 \n", - " AMD 2640.0 \n", - " AAPL 1235.0 \n", - " TSLA 4657.5 \n", - " NFLX 870.0 \n", - " NVDA 3570.0 \n", - " COST 2985.0 \n", - " AMD 2640.0 \n", - "2021-12-09 AAPL 1195.0 \n", - " TSLA 3982.5 \n", - " NFLX 695.0 \n", - " NVDA 6982.5 \n", - " COST 2715.0 \n", - " AMD 2480.0 \n", - " AAPL 1195.0 \n", - " TSLA 3982.5 \n", - " NFLX 695.0 \n", - " NVDA 6982.5 \n", - " COST 2715.0 \n", - " AMD 2480.0 \n", - "2021-12-10 AAPL 1315.0 \n", - " TSLA 4725.0 \n", - " NFLX 635.0 \n", - " NVDA 5617.5 \n", - " COST 4012.5 \n", - " AMD 2020.0 \n", - " AAPL 1315.0 \n", - " TSLA 4725.0 \n", - " NFLX 635.0 \n", - " NVDA 5617.5 \n", - " COST 4012.5 \n", - " AMD 2020.0 \n", - "2021-12-13 AAPL 1060.0 \n", - " TSLA 2677.5 \n", - " NFLX 580.0 \n", - " NVDA 5092.5 \n", - " COST 3855.0 \n", - " AMD 2400.0 \n", - " AAPL 1060.0 \n", - " TSLA 2677.5 \n", - " NFLX 580.0 \n", - " NVDA 5092.5 \n", - " COST 3855.0 \n", - " AMD 2400.0 \n", - "2021-12-14 AAPL 1175.0 \n", - " TSLA 4005.0 \n", - " NFLX 555.0 \n", - " NVDA 5827.5 \n", - " COST 3607.5 \n", - " AMD 2620.0 \n", - " AAPL 1175.0 \n", - " TSLA 4005.0 \n", - " NFLX 555.0 \n", - " NVDA 5827.5 \n", - " COST 3607.5 \n", - " AMD 2620.0 \n", - "2021-12-15 AAPL 1310.0 \n", - " TSLA 4297.5 \n", - " NFLX 550.0 \n", - " NVDA 6300.0 \n", - " COST 3885.0 \n", - " AMD 2880.0 \n", - " AAPL 1310.0 \n", - " TSLA 4297.5 \n", - " NFLX 550.0 \n", - " NVDA 6300.0 \n", - " COST 3885.0 \n", - " AMD 2880.0 \n", - "2021-12-16 AAPL 1175.0 \n", - " TSLA 3870.0 \n", - " NFLX 440.0 \n", - " NVDA 3360.0 \n", - " COST 3532.5 \n", - " AMD 2480.0 \n", - " AAPL 1175.0 \n", - " TSLA 3870.0 \n", - " NFLX 440.0 \n", - " NVDA 3360.0 \n", - " COST 3532.5 \n", - " AMD 2480.0 \n", - "2021-12-17 AAPL 1050.0 \n", - " TSLA 3847.5 \n", - " NFLX 410.0 \n", - " NVDA 5250.0 \n", - " COST 3442.5 \n", - " AMD 2420.0 \n", - " AAPL 1050.0 \n", - " TSLA 3847.5 \n", - " NFLX 410.0 \n", - " NVDA 5250.0 \n", - " COST 3442.5 \n", - " AMD 2420.0 \n", - "2021-12-20 AAPL 1090.0 \n", - " TSLA 3285.0 \n", - " NFLX 505.0 \n", - " NVDA 4620.0 \n", - " COST 3540.0 \n", - " AMD 2400.0 \n", - " AAPL 1090.0 \n", - " TSLA 3285.0 \n", - " NFLX 505.0 \n", - " NVDA 4620.0 \n", - " COST 3540.0 \n", - " AMD 2400.0 \n", - "2021-12-21 AAPL 1180.0 \n", - " TSLA 3150.0 \n", - " NFLX 550.0 \n", - " NVDA 5302.5 \n", - " COST 3855.0 \n", - " AMD 2780.0 \n", - " AAPL 1180.0 \n", - " TSLA 3150.0 \n", - " NFLX 550.0 \n", - " NVDA 5302.5 \n", - " COST 3855.0 \n", - " AMD 2780.0 \n", - "2021-12-22 AAPL 1250.0 \n", - " TSLA 3577.5 \n", - " NFLX 615.0 \n", - " NVDA 4095.0 \n", - " COST 3150.0 \n", - " AMD 2840.0 \n", - " AAPL 1250.0 \n", - " TSLA 3577.5 \n", - " NFLX 615.0 \n", - " NVDA 4095.0 \n", - " COST 3150.0 \n", - " AMD 2840.0 \n", - "2021-12-23 AAPL 1265.0 \n", - " TSLA 4702.5 \n", - " NFLX 605.0 \n", - " NVDA 6090.0 \n", - " COST 3127.5 \n", - " AMD 2940.0 \n", - " AAPL 1265.0 \n", - " TSLA 4702.5 \n", - " NFLX 605.0 \n", - " NVDA 6090.0 \n", - " COST 3127.5 \n", - " AMD 2940.0 \n", - "2021-12-24 AAPL 1265.0 \n", - " TSLA 4702.5 \n", - " NFLX 605.0 \n", - " NVDA 6090.0 \n", - " COST 3127.5 \n", - " AMD 2940.0 \n", - " AAPL 1265.0 \n", - " TSLA 4702.5 \n", - " NFLX 605.0 \n", - " NVDA 6090.0 \n", - " COST 3127.5 \n", - " AMD 2940.0 \n", - "2021-12-27 AAPL 1345.0 \n", - " TSLA 4657.5 \n", - " NFLX 565.0 \n", - " NVDA 7192.5 \n", - " COST 3180.0 \n", - " AMD 3260.0 \n", - " AAPL 1345.0 \n", - " TSLA 4657.5 \n", - " NFLX 565.0 \n", - " NVDA 7192.5 \n", - " COST 3180.0 \n", - " AMD 3260.0 \n", - "2021-12-28 AAPL 1380.0 \n", - " TSLA 4365.0 \n", - " NFLX 545.0 \n", - " NVDA 6457.5 \n", - " COST 4522.5 \n", - " AMD 3100.0 \n", - " AAPL 1380.0 \n", - " TSLA 4365.0 \n", - " NFLX 545.0 \n", - " NVDA 6457.5 \n", - " COST 4522.5 \n", - " AMD 3100.0 \n", - "2021-12-29 AAPL 1320.0 \n", - " TSLA 4792.5 \n", - " NFLX 530.0 \n", - " NVDA 6405.0 \n", - " COST 4012.5 \n", - " AMD 2900.0 \n", - " AAPL 1320.0 \n", - " TSLA 4792.5 \n", - " NFLX 530.0 \n", - " NVDA 6405.0 \n", - " COST 4012.5 \n", - " AMD 2900.0 \n", - "2021-12-30 AAPL 1335.0 \n", - " TSLA 4815.0 \n", - " NFLX 530.0 \n", - " NVDA 6090.0 \n", - " COST 3780.0 \n", - " AMD 2740.0 \n", - " AAPL 1335.0 \n", - " TSLA 4815.0 \n", - " NFLX 530.0 \n", - " NVDA 6090.0 \n", - " COST 3780.0 \n", - " AMD 2740.0 " - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "pd.set_option('display.max_rows', 10000)\n", - "evb_backtest.portfolio.get_all_positions()" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'\"\\nWhy do these two return weird stuff after run?\\n current_weighted_holdings\\n current_positions\\n\\nI can\\'t reconcile the cost with the data (NVM, haha)\\n\\n'" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "\n", - "\"\"\"\"\n", - "Why do these two return weird stuff after run?\n", - " current_weighted_holdings\n", - " current_positions\n", - "\n", - "I can't reconcile the cost with the data (NVM, haha)\n", - "\n", - "\"\"\"\n", - "# evb_backtest.portfolio.all_positions" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Extend for get_port_stats\n", - "- Buy & Hold\n", - "- Dates\n", - "- Trades\n", - "- _strategy in Aggregate\n", - "- The function" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "evb_backtest.portfolio.trades.to_csv(f'/Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/output/profitable_trades_options_{_key}.csv')" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": ".venv", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.10" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/EventDriven/demos/rough.ipynb b/EventDriven/demos/rough.ipynb deleted file mode 100644 index 48fbc1c..0000000 --- a/EventDriven/demos/rough.ipynb +++ /dev/null @@ -1,361 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "def stuff():\n", - " print(\"Hello, World!\")" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Hello, World!\n" - ] - } - ], - "source": [ - "import cProfile\n", - "import pstats\n", - "import io\n", - "\n", - "profiler = cProfile.Profile()\n", - "profiler.enable()\n", - "#run backtest\n", - "stuff()\n", - "profiler.disable()\n", - "stream = io.StringIO()\n", - "stats___ = pstats.Stats(profiler, stream=stream)\n", - "# stats.print_stats()" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[0;31mSignature:\u001b[0m \u001b[0mstats___\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msort_stats\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mfield\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mDocstring:\u001b[0m \n", - "\u001b[0;31mFile:\u001b[0m ~/miniconda3/envs/openbb/lib/python3.11/pstats.py\n", - "\u001b[0;31mType:\u001b[0m method" - ] - } - ], - "source": [ - "stats___.sort_stats?" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Function CumTime RatioToTop\n", - "---------------------------------------------------------------------------------------------------------\n", - "run_code 0.0026 1.00\n", - " 0.0025 0.99\n", - " 0.0025 0.98\n", - "stuff 0.0025 0.98\n", - " 0.0019 0.75\n", - "write 0.0019 0.74\n", - "_schedule_flush 0.0012 0.48\n", - "schedule 0.0008 0.30\n", - "__enter__ 0.0007 0.29\n", - "utcoffset 0.0006 0.22\n", - "is_alive 0.0004 0.17\n", - "send 0.0003 0.10\n", - "__call__ 0.0002 0.07\n", - " 0.0001 0.05\n", - "helper 0.0001 0.02\n", - " 0.0000 0.01\n", - "__exit__ 0.0000 0.01\n", - "extra_flags 0.0000 0.01\n", - "__get__ 0.0000 0.01\n", - "__init__ 0.0000 0.01\n", - "parent_header 0.0000 0.01\n", - "_wait_for_tstate_lock 0.0000 0.00\n", - "get 0.0000 0.00\n", - "_is_master_process 0.0000 0.00\n", - "compare 0.0000 0.00\n", - " 0.0000 0.00\n", - "user_global_ns 0.0000 0.00\n", - " 0.0000 0.00\n", - "_event_pipe 0.0000 0.00\n", - " 0.0000 0.00\n", - " 0.0000 0.00\n", - " 0.0000 0.00\n", - " 0.0000 0.00\n", - " 0.0000 0.00\n", - " 0.0000 0.00\n", - "cast 0.0000 0.00\n", - " 0.0000 0.00\n", - " 0.0000 0.00\n", - "is_set 0.0000 0.00\n", - " 0.0000 0.00\n", - " 0.0000 0.00\n" - ] - } - ], - "source": [ - "import pstats\n", - "from copy import deepcopy\n", - "\n", - "def print_top_cprofile_stats(_stats, top_n=20, sort_by='cumulative', full_name=False):\n", - " \"\"\"\n", - " Display the top n functions from a cProfile stats file,\n", - " showing cumulative time and ratio to the top function.\n", - "\n", - " :param stats: pstats.Stats object\n", - " :param top_n: Number of functions to display\n", - " :param sort_by: 'cumulative', 'time', etc.\n", - " :param full_name: If True, show full path:line:function_name\n", - " \"\"\"\n", - " _stats = deepcopy(_stats)\n", - " _stats.sort_stats(sort_by)\n", - " top_stats = _stats.stats.items()\n", - " top_list = sorted(top_stats, key=lambda x: x[1][3], reverse=True)[:top_n]\n", - "\n", - " top_cum_time = top_list[0][1][3]\n", - "\n", - " # Header\n", - " print(f\"{'Function':<80} {'CumTime':>10} {'RatioToTop':>12}\")\n", - " print('-' * 105)\n", - "\n", - " for func, stat in top_list:\n", - " filename, line, funcname = func\n", - " cum_time = stat[3]\n", - " ratio = cum_time / top_cum_time if top_cum_time else 0\n", - "\n", - " if full_name:\n", - " label = f\"{filename}:{line} {funcname}\"\n", - " else:\n", - " label = funcname\n", - "\n", - " print(f\"{label:<80} {cum_time:>10.4f} {ratio:>12.2f}\")\n", - "\n", - "\n", - "\n", - "print_top_cprofile_stats(stats___, top_n=100, sort_by='cumulative', full_name=False)" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Function SelfTime ShareOfTotal\n", - "-----------------------------------------------------------------------------------------------\n", - "__enter__ 0.0007 19.76%\n", - "stuff 0.0006 16.93%\n", - "utcoffset 0.0006 15.44%\n", - "_schedule_flush 0.0005 13.30%\n", - "is_alive 0.0004 11.93%\n", - "send 0.0003 7.36%\n", - " 0.0001 3.69%\n", - "write 0.0001 2.28%\n", - "schedule 0.0001 1.51%\n", - "__call__ 0.0000 1.16%\n", - "helper 0.0000 1.13%\n", - "extra_flags 0.0000 0.61%\n", - "run_code 0.0000 0.60%\n", - "__init__ 0.0000 0.53%\n", - "parent_header 0.0000 0.41%\n", - "__exit__ 0.0000 0.36%\n", - " 0.0000 0.35%\n", - "__get__ 0.0000 0.33%\n", - " 0.0000 0.30%\n", - "_wait_for_tstate_lock 0.0000 0.25%\n", - " 0.0000 0.24%\n", - "get 0.0000 0.23%\n", - "compare 0.0000 0.20%\n", - "_is_master_process 0.0000 0.20%\n", - " 0.0000 0.13%\n", - "user_global_ns 0.0000 0.10%\n", - " 0.0000 0.09%\n", - "_event_pipe 0.0000 0.07%\n", - " 0.0000 0.07%\n", - " 0.0000 0.05%\n", - " 0.0000 0.05%\n", - " 0.0000 0.05%\n", - " 0.0000 0.05%\n", - " 0.0000 0.04%\n", - " 0.0000 0.04%\n", - "cast 0.0000 0.03%\n", - " 0.0000 0.03%\n", - " 0.0000 0.02%\n", - "is_set 0.0000 0.02%\n", - " 0.0000 0.02%\n", - " 0.0000 0.02%\n" - ] - } - ], - "source": [ - "import pstats\n", - "\n", - "def print_cprofile_internal_time_share(_stats, top_n=20, sort_by='tottime', full_name=False):\n", - " \"\"\"\n", - " Print top n functions by internal (self) time, with their share of total self time.\n", - " \"\"\"\n", - " _stats = deepcopy(_stats)\n", - " _stats.sort_stats(sort_by)\n", - " \n", - " all_stats = _stats.stats.items()\n", - " total_self_time = sum(stat[2] for _, stat in all_stats) # stat[2] = tottime (internal time)\n", - "\n", - " top_list = sorted(all_stats, key=lambda x: x[1][2], reverse=True)[:top_n]\n", - "\n", - " print(f\"{'Function':<70} {'SelfTime':>10} {'ShareOfTotal':>12}\")\n", - " print('-' * 95)\n", - "\n", - " for func, stat in top_list:\n", - " filename, line, funcname = func\n", - " label = f\"{filename}:{line} {funcname}\" if full_name else funcname\n", - " self_time = stat[2]\n", - " ratio = self_time / total_self_time if total_self_time else 0\n", - " print(f\"{label:<70} {self_time:>10.4f} {ratio:>12.2%}\")\n", - "\n", - "print_cprofile_internal_time_share(stats___, top_n=100, sort_by='cumulative', full_name=False)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Console Logging & File Logging Can be configured using STREAM_LOG_LEVEL and FILE_LOG_LEVEL in environment variables.\n", - "Propagate to root logger can be set using PROPAGATE_TO_ROOT_LOGGER in environment variables.\n", - "Example:\n", - "STREAM_LOG_LEVEL = 'DEBUG'\n", - "FILE_LOG_LEVEL = 'INFO'\n", - "PROPAGATE_TO_ROOT_LOGGER = 'False'\n", - "\n", - "2025-06-06 01:13:41 trade.helpers.Logging INFO: Logging Root Directory: /Users/chiemelienwanisobi/cloned_repos/QuantTools/logs\n", - "Using Proxy URL: http://34.235.162.150:5500/thetadata\n", - "\n", - "\n", - "Scheduled Data Requests will be saved to: /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/scheduler/requests.jsonl\n" - ] - } - ], - "source": [ - "%load_ext autoreload\n", - "%autoreload 2\n", - "from EventDriven.riskmanager.base import OrderPicker\n", - "from EventDriven.riskmanager.picker import OrderSchema" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "picker = OrderPicker(\n", - " '',''\n", - ")\n", - "schema = OrderSchema({'strategy': 'vertical', 'option_type': 'C', 'tick': 'BA', 'target_dte': 270, 'dte_tolerance': 60, 'structure_direction': 'long', 'max_total_price': 4, 'spread_ticks': 1, 'min_moneyness': 0.75, 'max_moneyness': 1.25, 'increment': 0.5, 'min_total_price': 0.5, 'max_attempts': 3})" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(('dte_tolerance', 60),\n", - " ('increment', 0.5),\n", - " ('max_attempts', 3),\n", - " ('max_moneyness', 1.25),\n", - " ('max_total_price', 4),\n", - " ('min_moneyness', 0.75),\n", - " ('min_total_price', 0.5),\n", - " ('option_type', 'C'),\n", - " ('spread_ticks', 1),\n", - " ('strategy', 'vertical'),\n", - " ('structure_direction', 'long'),\n", - " ('target_dte', 270),\n", - " ('tick', 'BA'))" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "tuple(sorted(schema.data.items()))" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'result': 'NO_CONTRACTS_FOUND', 'data': None}" - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "picker.get_order_new(\n", - " schema, '2024-01-03', 100\n", - ")" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "openbb", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.13" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/EventDriven/demos/styff.ipynb b/EventDriven/demos/styff.ipynb deleted file mode 100644 index e680631..0000000 --- a/EventDriven/demos/styff.ipynb +++ /dev/null @@ -1,3142 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "id": "3792f542", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Console Logging & File Logging Can be configured using STREAM_LOG_LEVEL and FILE_LOG_LEVEL in environment variables.\n", - "Propagate to root logger can be set using PROPAGATE_TO_ROOT_LOGGER in environment variables.\n", - "Example:\n", - "STREAM_LOG_LEVEL = 'DEBUG'\n", - "FILE_LOG_LEVEL = 'INFO'\n", - "PROPAGATE_TO_ROOT_LOGGER = 'False'\n", - "\n", - "2025-10-27 22:09:23 trade.helpers.Logging INFO: Logging Root Directory: /Users/chiemelienwanisobi/cloned_repos/QuantTools/logs\n", - "Using Proxy URL: http://54.205.248.219:5500/thetadata\n", - "\n", - "\n", - "Scheduled Data Requests will be saved to: /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/scheduler/requests.jsonl\n", - "2025-10-27 22:09:46 DataManager.py CRITICAL: Using ProcessSaveManager for saving data.\n" - ] - } - ], - "source": [ - "%load_ext autoreload\n", - "%autoreload 2\n", - "from EventDriven.riskmanager.utils import populate_cache_with_chain, get_persistent_cache\n", - "from EventDriven.riskmanager.picker import OrderSchema, build_strategy, filter_contracts\n", - "from trade.helpers.helper import retrieve_timeseries\n", - "def get_spot(tick, date, spot_type='close'):\n", - " \"\"\"\n", - " Retrieves the spot price for a given ticker on a specific date.\n", - " \"\"\"\n", - " return retrieve_timeseries(tick, date, date, spot_type=spot_type)['close'][0]\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "dff44f45", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Console Logging & File Logging Can be configured using STREAM_LOG_LEVEL and FILE_LOG_LEVEL in environment variables.\n", - "Propagate to root logger can be set using PROPAGATE_TO_ROOT_LOGGER in environment variables.\n", - "Example:\n", - "STREAM_LOG_LEVEL = 'DEBUG'\n", - "FILE_LOG_LEVEL = 'INFO'\n", - "PROPAGATE_TO_ROOT_LOGGER = 'False'\n", - "\n", - "2025-10-27 23:01:31 trade.helpers.Logging INFO: Logging Root Directory: /Users/chiemelienwanisobi/cloned_repos/QuantTools/logs\n" - ] - } - ], - "source": [ - "from abc import ABC, abstractmethod\n", - "from trade.helpers.Logging import setup_logger\n", - "from pydantic.dataclasses import dataclass as pydantic_dataclass\n", - "import pandas as pd\n", - "from pandas.tseries.offsets import BDay\n", - "from typing import ClassVar\n", - "from weakref import WeakSet\n", - "\n", - "logger = setup_logger(__name__, stream_log_level=\"DEBUG\")\n", - "\n", - "CONFIG_DEFINITIONS = {\n", - " # 'Config class: { config_name}': 'Description of what this config class is for and how to use it.'\n", - " 'ChainConfigs': {\n", - " 'max_chain_size': 'Maximum number of option contracts to retrieve in a single chain.',\n", - " 'enable_caching': 'Flag to enable or disable caching of option chains to improve performance.',\n", - " },\n", - "}\n", - "\n", - "@pydantic_dataclass\n", - "class BaseConfigs(ABC):\n", - " \"\"\"Base configuration class for all modules.\"\"\"\n", - "\n", - "\n", - " _registry: ClassVar[WeakSet[type]] = WeakSet()\n", - "\n", - " def __init_subclass__(cls, **kwargs):\n", - " super().__init_subclass__(**kwargs)\n", - " BaseConfigs._registry.add(cls)\n", - "\n", - " def display_configs(self):\n", - " \"\"\"Display the current configuration settings.\"\"\"\n", - " msg = f\"\"\"\n", - " Current Configuration Settings for {self.__class__.__name__}:\n", - " {self.__dict__}\n", - " \"\"\"\n", - " return msg\n", - "\n", - " def describe_configs(self):\n", - " \"\"\"Describe the configuration settings with explanations.\"\"\"\n", - "\n", - " class_descriptions = CONFIG_DEFINITIONS.get(self.__class__.__name__)\n", - " if not class_descriptions:\n", - " logger.warning(f\"No configuration descriptions found for {self.__class__.__name__}.\")\n", - " return\n", - " header = f\"\"\"\n", - " Configuration Descriptions for {self.__class__.__name__}:\n", - " \"\"\"\n", - " \n", - " msg = ''\n", - " for key, value in self.__dict__.items():\n", - " desc = class_descriptions.get(key)\n", - " if desc:\n", - " msg += f\"{' ' * 8}{key}: {value} # {desc}\\n\"\n", - " else:\n", - " logger.warning(f\"No description found for config '{key}' in {self.__class__.__name__}.\")\n", - " return header + msg\n", - "\n", - " def display_and_describe_configs(self):\n", - " \"\"\"Display and describe the configuration settings.\"\"\"\n", - " msg1=self.display_configs()\n", - " msg2=self.describe_configs()\n", - " print(msg1)\n", - " print(msg2)\n", - "\n", - " def get_all_configs(cls):\n", - " \"\"\"Get all configuration classes and their instances.\"\"\"\n", - " configs = {}\n", - " for config_cls in cls._registry:\n", - " configs[config_cls.__name__] = config_cls()\n", - " return configs" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "ec9e651b", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Registered config subclass: ChainConfigs\n", - "2025-10-27 23:02:18 __main__ WARNING: No description found for config 'cache_expiry_minutes' in ChainConfigs.\n", - "\n", - " Current Configuration Settings for ChainConfigs:\n", - " {'max_chain_size': 1000, 'enable_caching': True, 'cache_expiry_minutes': 60}\n", - " \n", - "\n", - " Configuration Descriptions for ChainConfigs:\n", - " max_chain_size: 1000 # Maximum number of option contracts to retrieve in a single chain.\n", - " enable_caching: True # Flag to enable or disable caching of option chains to improve performance.\n", - "\n" - ] - } - ], - "source": [ - "@pydantic_dataclass\n", - "class ChainConfigs(BaseConfigs):\n", - " \"\"\"Configuration class for Chain module.\"\"\"\n", - "\n", - " # Example configuration parameters\n", - " max_chain_size: int = 1000\n", - " enable_caching: bool = True\n", - " cache_expiry_minutes: int = 60\n", - "\n", - "chain_conf = ChainConfigs()\n", - "chain_conf.display_and_describe_configs()" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "61ace474", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{, }" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ChainConfigs._registry" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "a7b40a2a", - "metadata": {}, - "outputs": [], - "source": [ - "schema = OrderSchema(dict(\n", - " target_dte= 270,\n", - " strategy= 'vertical',\n", - " structure_direction= 'long',\n", - " spread_ticks= 1,\n", - " dte_tolerance= 60,\n", - " min_moneyness= 0.65,\n", - " max_moneyness= 1,\n", - " min_total_price= 0.95,\n", - " option_type = 'c',\n", - " max_total_price= 4,\n", - " tick = 'AAPL',\n", - "))" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "04155004", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "http://127.0.0.1:25510/v2/bulk_at_time/option/quote?root=AAPL&exp=0&start_date=20251020&end_date=20251020&ivl=57600000&use_csv=true&right=C\n", - "http://127.0.0.1:25510/v2/bulk_at_time/option/quote?root=AAPL&exp=0&start_date=20251020&end_date=20251020&ivl=57600000&use_csv=true&right=C\n", - "2025-10-27 22:09:48 QuantTools.EventDriven.riskmanager ERROR: Retrieved chain for AAPL on 2025-10-20\n", - "http://127.0.0.1:25510/v2/bulk_hist/option/open_interest?root=AAPL&exp=0&start_date=20251017&end_date=20251017&use_csv=true\n", - "http://127.0.0.1:25510/v2/bulk_hist/option/open_interest?root=AAPL&exp=0&start_date=20251017&end_date=20251017&use_csv=true\n", - "http://54.205.248.219:5500/thetadata\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
datetimerootexpirationstrikerightbid_sizeclosebidask_sizecloseaskdatemidpointweighted_midpointopen_interestopttickchain_iddtepct_spread
02025-10-20AAPL2025-10-24215.0C13346.6513348.052025102047.35047.350000232.0AAPL20251121C325AAPL20251121C325_2025-10-2040.029567
12025-10-20AAPL2026-08-21210.0P496.75576.90202510206.8256.830660734.0AAPL20260618P250AAPL20260618P250_2025-10-203050.021978
22025-10-20AAPL2025-10-24215.0P260.01280.02202510200.0150.015185818.0AAPL20260220C165AAPL20260220C165_2025-10-2040.666667
32025-10-20AAPL2026-08-21210.0C965.002265.652025102065.32565.46129059.0AAPL20260918C130AAPL20260918C130_2025-10-203050.009950
42025-10-20AAPL2025-11-07215.0P1180.18870.20202510200.1900.188488575.0AAPL20251114P325AAPL20251114P325_2025-10-20180.105263
......................................................
22552025-10-20AAPL2028-01-21200.0P1113.451813.702025102013.57513.605172346.0AAPL20280121P200AAPL20280121P200_2025-10-208230.018416
22562025-10-20AAPL2026-05-15210.0P434.45674.55202510204.5004.5109091682.0AAPL20260515P210AAPL20260515P210_2025-10-202070.022222
22572025-10-20AAPL2026-05-15210.0C960.95861.602025102061.27561.2558821192.0AAPL20260515C210AAPL20260515C210_2025-10-202070.010608
22582025-10-20AAPL2026-06-18210.0C762.40762.952025102062.67562.6750005799.0AAPL20260618C210AAPL20260618C210_2025-10-202410.008775
22592025-10-20AAPL2026-06-18210.0P595.20815.35202510205.2755.2867867463.0AAPL20260618P210AAPL20260618P210_2025-10-202410.028436
\n", - "

2260 rows × 17 columns

\n", - "
" - ], - "text/plain": [ - " datetime root expiration strike right bid_size closebid ask_size \\\n", - "0 2025-10-20 AAPL 2025-10-24 215.0 C 133 46.65 133 \n", - "1 2025-10-20 AAPL 2026-08-21 210.0 P 49 6.75 57 \n", - "2 2025-10-20 AAPL 2025-10-24 215.0 P 26 0.01 28 \n", - "3 2025-10-20 AAPL 2026-08-21 210.0 C 9 65.00 22 \n", - "4 2025-10-20 AAPL 2025-11-07 215.0 P 118 0.18 87 \n", - "... ... ... ... ... ... ... ... ... \n", - "2255 2025-10-20 AAPL 2028-01-21 200.0 P 11 13.45 18 \n", - "2256 2025-10-20 AAPL 2026-05-15 210.0 P 43 4.45 67 \n", - "2257 2025-10-20 AAPL 2026-05-15 210.0 C 9 60.95 8 \n", - "2258 2025-10-20 AAPL 2026-06-18 210.0 C 7 62.40 7 \n", - "2259 2025-10-20 AAPL 2026-06-18 210.0 P 59 5.20 81 \n", - "\n", - " closeask date midpoint weighted_midpoint open_interest \\\n", - "0 48.05 20251020 47.350 47.350000 232.0 \n", - "1 6.90 20251020 6.825 6.830660 734.0 \n", - "2 0.02 20251020 0.015 0.015185 818.0 \n", - "3 65.65 20251020 65.325 65.461290 59.0 \n", - "4 0.20 20251020 0.190 0.188488 575.0 \n", - "... ... ... ... ... ... \n", - "2255 13.70 20251020 13.575 13.605172 346.0 \n", - "2256 4.55 20251020 4.500 4.510909 1682.0 \n", - "2257 61.60 20251020 61.275 61.255882 1192.0 \n", - "2258 62.95 20251020 62.675 62.675000 5799.0 \n", - "2259 5.35 20251020 5.275 5.286786 7463.0 \n", - "\n", - " opttick chain_id dte pct_spread \n", - "0 AAPL20251121C325 AAPL20251121C325_2025-10-20 4 0.029567 \n", - "1 AAPL20260618P250 AAPL20260618P250_2025-10-20 305 0.021978 \n", - "2 AAPL20260220C165 AAPL20260220C165_2025-10-20 4 0.666667 \n", - "3 AAPL20260918C130 AAPL20260918C130_2025-10-20 305 0.009950 \n", - "4 AAPL20251114P325 AAPL20251114P325_2025-10-20 18 0.105263 \n", - "... ... ... ... ... \n", - "2255 AAPL20280121P200 AAPL20280121P200_2025-10-20 823 0.018416 \n", - "2256 AAPL20260515P210 AAPL20260515P210_2025-10-20 207 0.022222 \n", - "2257 AAPL20260515C210 AAPL20260515C210_2025-10-20 207 0.010608 \n", - "2258 AAPL20260618C210 AAPL20260618C210_2025-10-20 241 0.008775 \n", - "2259 AAPL20260618P210 AAPL20260618P210_2025-10-20 241 0.028436 \n", - "\n", - "[2260 rows x 17 columns]" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "get_persistent_cache().clear()\n", - "chain = populate_cache_with_chain(\n", - " \"AAPL\", \"2025-10-20\"\n", - ")\n", - "chain" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "fcc9ee9e", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "http://127.0.0.1:25510/v2/bulk_at_time/option/quote?root=AAPL&exp=0&start_date=20250923&end_date=20250923&ivl=57600000&use_csv=true&right=C\n", - "http://127.0.0.1:25510/v2/bulk_at_time/option/quote?root=AAPL&exp=0&start_date=20250923&end_date=20250923&ivl=57600000&use_csv=true&right=C\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
RootExpirationStrikeRightBid_sizeCloseBidAsk_sizeCloseAskDateMidpointWeighted_midpoint
datetime
2025-09-23AAPL2025-10-03215.0P1230.041440.06202509230.0500.050787
2025-09-23AAPL2025-09-26215.0P00.00100.01202509230.0050.010000
2025-09-23AAPL2025-09-26215.0C21438.555239.902025092339.22538.813910
2025-09-23AAPL2025-10-03215.0C15738.806040.202025092339.50039.187097
2025-09-23AAPL2025-10-10215.0P630.15630.17202509230.1600.160000
....................................
2025-09-23AAPL2028-01-21200.0C882.154483.602025092382.87583.376923
2025-09-23AAPL2026-05-15210.0C5754.708255.552025092355.12555.201439
2025-09-23AAPL2026-05-15210.0P525.40215.55202509235.4755.443151
2025-09-23AAPL2026-06-18210.0P86.15546.35202509236.2506.324194
2025-09-23AAPL2026-06-18210.0C5256.10156.702025092356.40056.111321
\n", - "

2330 rows × 11 columns

\n", - "
" - ], - "text/plain": [ - " Root Expiration Strike Right Bid_size CloseBid Ask_size \\\n", - "datetime \n", - "2025-09-23 AAPL 2025-10-03 215.0 P 123 0.04 144 \n", - "2025-09-23 AAPL 2025-09-26 215.0 P 0 0.00 10 \n", - "2025-09-23 AAPL 2025-09-26 215.0 C 214 38.55 52 \n", - "2025-09-23 AAPL 2025-10-03 215.0 C 157 38.80 60 \n", - "2025-09-23 AAPL 2025-10-10 215.0 P 63 0.15 63 \n", - "... ... ... ... ... ... ... ... \n", - "2025-09-23 AAPL 2028-01-21 200.0 C 8 82.15 44 \n", - "2025-09-23 AAPL 2026-05-15 210.0 C 57 54.70 82 \n", - "2025-09-23 AAPL 2026-05-15 210.0 P 52 5.40 21 \n", - "2025-09-23 AAPL 2026-06-18 210.0 P 8 6.15 54 \n", - "2025-09-23 AAPL 2026-06-18 210.0 C 52 56.10 1 \n", - "\n", - " CloseAsk Date Midpoint Weighted_midpoint \n", - "datetime \n", - "2025-09-23 0.06 20250923 0.050 0.050787 \n", - "2025-09-23 0.01 20250923 0.005 0.010000 \n", - "2025-09-23 39.90 20250923 39.225 38.813910 \n", - "2025-09-23 40.20 20250923 39.500 39.187097 \n", - "2025-09-23 0.17 20250923 0.160 0.160000 \n", - "... ... ... ... ... \n", - "2025-09-23 83.60 20250923 82.875 83.376923 \n", - "2025-09-23 55.55 20250923 55.125 55.201439 \n", - "2025-09-23 5.55 20250923 5.475 5.443151 \n", - "2025-09-23 6.35 20250923 6.250 6.324194 \n", - "2025-09-23 56.70 20250923 56.400 56.111321 \n", - "\n", - "[2330 rows x 11 columns]" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from dbase.DataAPI.ThetaData import retrieve_chain_bulk, retrieve_bulk_open_interest\n", - "tick = schema['tick']\n", - "date = '2025-09-23'\n", - "print_url = True\n", - "chain = retrieve_chain_bulk(\n", - " tick,\n", - " '',\n", - " date,\n", - " date,\n", - " '16:00',\n", - " 'C',\n", - " print_url = print_url\n", - ")\n", - "\n", - "\n", - "\n", - " # ## Clip Chain\n", - " # chain_clipped = chain.reset_index()[['datetime', 'Root', 'Strike', 'Right', 'Expiration', 'Midpoint']]\n", - " # if PATCH_TICKERS:\n", - " # chain_clipped['Root'] = chain_clipped['Root'].apply(swap_ticker)\n", - "\n", - " # ## Create ID\n", - " # id_params = chain_clipped[['Root', 'Right', 'Expiration', 'Strike']].T.to_numpy()\n", - " # ids = runThreads(\n", - " # generate_option_tick_new, \n", - " # id_params)\n", - " # chain_clipped['opttick'] = ids\n", - " # filter_opt = get_avoid_opticks(tick)\n", - " # chain_clipped = chain_clipped[~chain_clipped['opttick'].isin(filter_opt)] ## Optticks to avoid\n", - " # chain_clipped['chain_id'] = chain_clipped['opttick'] + '_' + chain_clipped['datetime'].astype(str)\n", - " # chain_clipped['dte'] = (pd.to_datetime(chain_clipped['Expiration']) - pd.to_datetime(chain_clipped['datetime'])).dt.days\n", - "\n", - " # ## Save to cache\n", - " # def save_to_cache(id, date, spot):\n", - " # date = pd.to_datetime(date).strftime('%Y-%m-%d')\n", - " # save_id = f\"{id}_{date}\"\n", - " # if save_id not in get_cache('spot'):\n", - " # spot_cache[save_id] = spot\n", - " # save_params = chain_clipped[['opttick', 'datetime', 'Midpoint']].T.to_numpy()\n", - " # runThreads(\n", - " # save_to_cache, \n", - " # save_params)\n", - " \n", - " # if chain_spot:\n", - " # chain_clipped['spot']=chain_spot\n", - " # chain_clipped['moneyness']=0\n", - " # chain_clipped.loc[chain_clipped['Right'] == 'C', 'moneyness'] = chain_clipped.loc[chain_clipped['Right'] == 'C', 'Strike'] / chain_clipped.loc[chain_clipped['Right'] == 'C', 'spot']\n", - " # chain_clipped.loc[chain_clipped['Right'] == 'P', 'moneyness'] = chain_clipped.loc[chain_clipped['Right'] == 'P', 'spot'] / chain_clipped.loc[chain_clipped['Right'] == 'P', 'Strike']\n", - " # chain_clipped=chain_clipped[chain_clipped['moneyness'].between(0.01, 3)] ## Filter out extreme moneyness to reduce size\n", - " # chain_clipped.columns = chain_clipped.columns.str.lower()'\n", - "chain" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "92c878a1", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "http://127.0.0.1:25510/v2/bulk_hist/option/open_interest?root=AAPL&exp=0&start_date=20250922&end_date=20250922&use_csv=true\n", - "http://127.0.0.1:25510/v2/bulk_hist/option/open_interest?root=AAPL&exp=0&start_date=20250922&end_date=20250922&use_csv=true\n", - "http://54.205.248.219:5500/thetadata\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
RootExpirationStrikeRightOpen_interestDatetimeDatetime
0AAPL2025-10-03215.0P12462025092206:30:152025-09-22
1AAPL2025-10-03215.0C6312025092206:30:192025-09-22
2AAPL2026-08-21210.0C432025092206:30:152025-09-22
3AAPL2026-08-21210.0P5592025092206:30:192025-09-22
4AAPL2025-10-17215.0C136762025092206:30:042025-09-22
...........................
2235AAPL2026-01-16210.0P364002025092206:30:082025-09-22
2236AAPL2025-09-26212.5C562025092206:30:022025-09-22
2237AAPL2025-09-26212.5P4062025092206:30:072025-09-22
2238AAPL2027-12-17200.0C49112025092206:30:082025-09-22
2239AAPL2027-12-17200.0P57382025092206:30:152025-09-22
\n", - "

2240 rows × 8 columns

\n", - "
" - ], - "text/plain": [ - " Root Expiration Strike Right Open_interest Date time \\\n", - "0 AAPL 2025-10-03 215.0 P 1246 20250922 06:30:15 \n", - "1 AAPL 2025-10-03 215.0 C 631 20250922 06:30:19 \n", - "2 AAPL 2026-08-21 210.0 C 43 20250922 06:30:15 \n", - "3 AAPL 2026-08-21 210.0 P 559 20250922 06:30:19 \n", - "4 AAPL 2025-10-17 215.0 C 13676 20250922 06:30:04 \n", - "... ... ... ... ... ... ... ... \n", - "2235 AAPL 2026-01-16 210.0 P 36400 20250922 06:30:08 \n", - "2236 AAPL 2025-09-26 212.5 C 56 20250922 06:30:02 \n", - "2237 AAPL 2025-09-26 212.5 P 406 20250922 06:30:07 \n", - "2238 AAPL 2027-12-17 200.0 C 4911 20250922 06:30:08 \n", - "2239 AAPL 2027-12-17 200.0 P 5738 20250922 06:30:15 \n", - "\n", - " Datetime \n", - "0 2025-09-22 \n", - "1 2025-09-22 \n", - "2 2025-09-22 \n", - "3 2025-09-22 \n", - "4 2025-09-22 \n", - "... ... \n", - "2235 2025-09-22 \n", - "2236 2025-09-22 \n", - "2237 2025-09-22 \n", - "2238 2025-09-22 \n", - "2239 2025-09-22 \n", - "\n", - "[2240 rows x 8 columns]" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "## Get open interest\n", - "## Because open interest is only updated EOD, we retrieve previous day's open interest\n", - "prev = (pd.to_datetime(date) - BDay(1)).strftime('%Y-%m-%d')\n", - "oi = retrieve_bulk_open_interest(\n", - " symbol = tick,\n", - " exp = 0,\n", - " start_date = prev,\n", - " end_date = prev,\n", - " print_url = True\n", - ")\n", - "oi" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "f7700356", - "metadata": {}, - "outputs": [], - "source": [ - "chain =chain.merge(oi[['Root', 'Expiration', 'Strike', 'Right', 'Open_interest']], on=['Root', 'Expiration', 'Strike', 'Right'], how='left')\n" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "c7fe17b2", - "metadata": {}, - "outputs": [], - "source": [ - "oi_thresholds = [25, 50, 100, 200, 500, 1000]\n", - "spread_threshold = [0.05, 0.1, 0.15, 0.2, 0.25, 0.3]" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "f4305797", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2025-10-27 22:25:47 __main__ INFO: Processing ticker: AAPL\n", - "http://127.0.0.1:25510/v2/bulk_at_time/option/quote?root=AAPL&exp=0&start_date=20250820&end_date=20250820&ivl=57600000&use_csv=true&right=C\n", - "http://127.0.0.1:25510/v2/bulk_at_time/option/quote?root=AAPL&exp=0&start_date=20250820&end_date=20250820&ivl=57600000&use_csv=true&right=C\n", - "Max DTE: 849 days\n", - "Sizes after filtering for different pct_spread thresholds. Total original size: 2394\n", - "Threshold: 5.00%, Size: 1718\n", - " Sizes after applying Open Interest threshold of 25: 1118\n", - " Sizes after applying Open Interest threshold of 50: 1062\n", - " Sizes after applying Open Interest threshold of 100: 987\n", - " Sizes after applying Open Interest threshold of 200: 865\n", - " Sizes after applying Open Interest threshold of 500: 692\n", - " Sizes after applying Open Interest threshold of 1000: 564\n", - "Threshold: 10.00%, Size: 1890\n", - " Sizes after applying Open Interest threshold of 25: 1260\n", - " Sizes after applying Open Interest threshold of 50: 1198\n", - " Sizes after applying Open Interest threshold of 100: 1112\n", - " Sizes after applying Open Interest threshold of 200: 974\n", - " Sizes after applying Open Interest threshold of 500: 777\n", - " Sizes after applying Open Interest threshold of 1000: 624\n", - "Threshold: 15.00%, Size: 1964\n", - " Sizes after applying Open Interest threshold of 25: 1326\n", - " Sizes after applying Open Interest threshold of 50: 1259\n", - " Sizes after applying Open Interest threshold of 100: 1166\n", - " Sizes after applying Open Interest threshold of 200: 1021\n", - " Sizes after applying Open Interest threshold of 500: 813\n", - " Sizes after applying Open Interest threshold of 1000: 646\n", - "Threshold: 20.00%, Size: 2011\n", - " Sizes after applying Open Interest threshold of 25: 1365\n", - " Sizes after applying Open Interest threshold of 50: 1293\n", - " Sizes after applying Open Interest threshold of 100: 1197\n", - " Sizes after applying Open Interest threshold of 200: 1049\n", - " Sizes after applying Open Interest threshold of 500: 838\n", - " Sizes after applying Open Interest threshold of 1000: 663\n", - "Threshold: 25.00%, Size: 2036\n", - " Sizes after applying Open Interest threshold of 25: 1382\n", - " Sizes after applying Open Interest threshold of 50: 1310\n", - " Sizes after applying Open Interest threshold of 100: 1214\n", - " Sizes after applying Open Interest threshold of 200: 1063\n", - " Sizes after applying Open Interest threshold of 500: 850\n", - " Sizes after applying Open Interest threshold of 1000: 672\n", - "Threshold: 30.00%, Size: 2059\n", - " Sizes after applying Open Interest threshold of 25: 1400\n", - " Sizes after applying Open Interest threshold of 50: 1328\n", - " Sizes after applying Open Interest threshold of 100: 1230\n", - " Sizes after applying Open Interest threshold of 200: 1077\n", - " Sizes after applying Open Interest threshold of 500: 863\n", - " Sizes after applying Open Interest threshold of 1000: 680\n", - "2025-10-27 22:25:53 __main__ INFO: Processing ticker: MSFT\n", - "http://127.0.0.1:25510/v2/bulk_at_time/option/quote?root=MSFT&exp=0&start_date=20250820&end_date=20250820&ivl=57600000&use_csv=true&right=C\n", - "http://127.0.0.1:25510/v2/bulk_at_time/option/quote?root=MSFT&exp=0&start_date=20250820&end_date=20250820&ivl=57600000&use_csv=true&right=C\n", - "Max DTE: 849 days\n", - "Sizes after filtering for different pct_spread thresholds. Total original size: 3424\n", - "Threshold: 5.00%, Size: 2399\n", - " Sizes after applying Open Interest threshold of 25: 1472\n", - " Sizes after applying Open Interest threshold of 50: 1324\n", - " Sizes after applying Open Interest threshold of 100: 1159\n", - " Sizes after applying Open Interest threshold of 200: 939\n", - " Sizes after applying Open Interest threshold of 500: 621\n", - " Sizes after applying Open Interest threshold of 1000: 395\n", - "Threshold: 10.00%, Size: 2686\n", - " Sizes after applying Open Interest threshold of 25: 1695\n", - " Sizes after applying Open Interest threshold of 50: 1525\n", - " Sizes after applying Open Interest threshold of 100: 1324\n", - " Sizes after applying Open Interest threshold of 200: 1075\n", - " Sizes after applying Open Interest threshold of 500: 710\n", - " Sizes after applying Open Interest threshold of 1000: 452\n", - "Threshold: 15.00%, Size: 2787\n", - " Sizes after applying Open Interest threshold of 25: 1775\n", - " Sizes after applying Open Interest threshold of 50: 1594\n", - " Sizes after applying Open Interest threshold of 100: 1381\n", - " Sizes after applying Open Interest threshold of 200: 1122\n", - " Sizes after applying Open Interest threshold of 500: 738\n", - " Sizes after applying Open Interest threshold of 1000: 472\n", - "Threshold: 20.00%, Size: 2850\n", - " Sizes after applying Open Interest threshold of 25: 1823\n", - " Sizes after applying Open Interest threshold of 50: 1636\n", - " Sizes after applying Open Interest threshold of 100: 1416\n", - " Sizes after applying Open Interest threshold of 200: 1148\n", - " Sizes after applying Open Interest threshold of 500: 753\n", - " Sizes after applying Open Interest threshold of 1000: 482\n", - "Threshold: 25.00%, Size: 2885\n", - " Sizes after applying Open Interest threshold of 25: 1847\n", - " Sizes after applying Open Interest threshold of 50: 1658\n", - " Sizes after applying Open Interest threshold of 100: 1435\n", - " Sizes after applying Open Interest threshold of 200: 1163\n", - " Sizes after applying Open Interest threshold of 500: 764\n", - " Sizes after applying Open Interest threshold of 1000: 488\n", - "Threshold: 30.00%, Size: 2921\n", - " Sizes after applying Open Interest threshold of 25: 1877\n", - " Sizes after applying Open Interest threshold of 50: 1684\n", - " Sizes after applying Open Interest threshold of 100: 1454\n", - " Sizes after applying Open Interest threshold of 200: 1179\n", - " Sizes after applying Open Interest threshold of 500: 778\n", - " Sizes after applying Open Interest threshold of 1000: 498\n", - "2025-10-27 22:25:58 __main__ INFO: Processing ticker: GOOGL\n", - "http://127.0.0.1:25510/v2/bulk_at_time/option/quote?root=GOOGL&exp=0&start_date=20250820&end_date=20250820&ivl=57600000&use_csv=true&right=C\n", - "http://127.0.0.1:25510/v2/bulk_at_time/option/quote?root=GOOGL&exp=0&start_date=20250820&end_date=20250820&ivl=57600000&use_csv=true&right=C\n", - "Max DTE: 849 days\n", - "Sizes after filtering for different pct_spread thresholds. Total original size: 2122\n", - "Threshold: 5.00%, Size: 1459\n", - " Sizes after applying Open Interest threshold of 25: 924\n", - " Sizes after applying Open Interest threshold of 50: 852\n", - " Sizes after applying Open Interest threshold of 100: 778\n", - " Sizes after applying Open Interest threshold of 200: 664\n", - " Sizes after applying Open Interest threshold of 500: 483\n", - " Sizes after applying Open Interest threshold of 1000: 352\n", - "Threshold: 10.00%, Size: 1612\n", - " Sizes after applying Open Interest threshold of 25: 1039\n", - " Sizes after applying Open Interest threshold of 50: 953\n", - " Sizes after applying Open Interest threshold of 100: 867\n", - " Sizes after applying Open Interest threshold of 200: 738\n", - " Sizes after applying Open Interest threshold of 500: 542\n", - " Sizes after applying Open Interest threshold of 1000: 398\n", - "Threshold: 15.00%, Size: 1689\n", - " Sizes after applying Open Interest threshold of 25: 1108\n", - " Sizes after applying Open Interest threshold of 50: 1017\n", - " Sizes after applying Open Interest threshold of 100: 923\n", - " Sizes after applying Open Interest threshold of 200: 790\n", - " Sizes after applying Open Interest threshold of 500: 585\n", - " Sizes after applying Open Interest threshold of 1000: 434\n", - "Threshold: 20.00%, Size: 1741\n", - " Sizes after applying Open Interest threshold of 25: 1153\n", - " Sizes after applying Open Interest threshold of 50: 1059\n", - " Sizes after applying Open Interest threshold of 100: 959\n", - " Sizes after applying Open Interest threshold of 200: 822\n", - " Sizes after applying Open Interest threshold of 500: 611\n", - " Sizes after applying Open Interest threshold of 1000: 452\n", - "Threshold: 25.00%, Size: 1781\n", - " Sizes after applying Open Interest threshold of 25: 1188\n", - " Sizes after applying Open Interest threshold of 50: 1090\n", - " Sizes after applying Open Interest threshold of 100: 989\n", - " Sizes after applying Open Interest threshold of 200: 848\n", - " Sizes after applying Open Interest threshold of 500: 632\n", - " Sizes after applying Open Interest threshold of 1000: 470\n", - "Threshold: 30.00%, Size: 1809\n", - " Sizes after applying Open Interest threshold of 25: 1212\n", - " Sizes after applying Open Interest threshold of 50: 1111\n", - " Sizes after applying Open Interest threshold of 100: 1007\n", - " Sizes after applying Open Interest threshold of 200: 863\n", - " Sizes after applying Open Interest threshold of 500: 643\n", - " Sizes after applying Open Interest threshold of 1000: 478\n", - "2025-10-27 22:26:03 __main__ INFO: Processing ticker: AMZN\n", - "http://127.0.0.1:25510/v2/bulk_at_time/option/quote?root=AMZN&exp=0&start_date=20250820&end_date=20250820&ivl=57600000&use_csv=true&right=C\n", - "http://127.0.0.1:25510/v2/bulk_at_time/option/quote?root=AMZN&exp=0&start_date=20250820&end_date=20250820&ivl=57600000&use_csv=true&right=C\n", - "Max DTE: 849 days\n", - "Sizes after filtering for different pct_spread thresholds. Total original size: 2136\n", - "Threshold: 5.00%, Size: 1725\n", - " Sizes after applying Open Interest threshold of 25: 1222\n", - " Sizes after applying Open Interest threshold of 50: 1167\n", - " Sizes after applying Open Interest threshold of 100: 1079\n", - " Sizes after applying Open Interest threshold of 200: 962\n", - " Sizes after applying Open Interest threshold of 500: 755\n", - " Sizes after applying Open Interest threshold of 1000: 570\n", - "Threshold: 10.00%, Size: 1862\n", - " Sizes after applying Open Interest threshold of 25: 1339\n", - " Sizes after applying Open Interest threshold of 50: 1279\n", - " Sizes after applying Open Interest threshold of 100: 1184\n", - " Sizes after applying Open Interest threshold of 200: 1058\n", - " Sizes after applying Open Interest threshold of 500: 830\n", - " Sizes after applying Open Interest threshold of 1000: 627\n", - "Threshold: 15.00%, Size: 1904\n", - " Sizes after applying Open Interest threshold of 25: 1377\n", - " Sizes after applying Open Interest threshold of 50: 1317\n", - " Sizes after applying Open Interest threshold of 100: 1218\n", - " Sizes after applying Open Interest threshold of 200: 1088\n", - " Sizes after applying Open Interest threshold of 500: 856\n", - " Sizes after applying Open Interest threshold of 1000: 645\n", - "Threshold: 20.00%, Size: 1923\n", - " Sizes after applying Open Interest threshold of 25: 1396\n", - " Sizes after applying Open Interest threshold of 50: 1336\n", - " Sizes after applying Open Interest threshold of 100: 1236\n", - " Sizes after applying Open Interest threshold of 200: 1105\n", - " Sizes after applying Open Interest threshold of 500: 869\n", - " Sizes after applying Open Interest threshold of 1000: 656\n", - "Threshold: 25.00%, Size: 1942\n", - " Sizes after applying Open Interest threshold of 25: 1412\n", - " Sizes after applying Open Interest threshold of 50: 1350\n", - " Sizes after applying Open Interest threshold of 100: 1250\n", - " Sizes after applying Open Interest threshold of 200: 1119\n", - " Sizes after applying Open Interest threshold of 500: 879\n", - " Sizes after applying Open Interest threshold of 1000: 663\n", - "Threshold: 30.00%, Size: 1956\n", - " Sizes after applying Open Interest threshold of 25: 1425\n", - " Sizes after applying Open Interest threshold of 50: 1363\n", - " Sizes after applying Open Interest threshold of 100: 1263\n", - " Sizes after applying Open Interest threshold of 200: 1131\n", - " Sizes after applying Open Interest threshold of 500: 890\n", - " Sizes after applying Open Interest threshold of 1000: 671\n", - "2025-10-27 22:26:07 __main__ INFO: Processing ticker: TSLA\n", - "http://127.0.0.1:25510/v2/bulk_at_time/option/quote?root=TSLA&exp=0&start_date=20250820&end_date=20250820&ivl=57600000&use_csv=true&right=C\n", - "http://127.0.0.1:25510/v2/bulk_at_time/option/quote?root=TSLA&exp=0&start_date=20250820&end_date=20250820&ivl=57600000&use_csv=true&right=C\n", - "Max DTE: 849 days\n", - "Sizes after filtering for different pct_spread thresholds. Total original size: 4256\n", - "Threshold: 5.00%, Size: 3617\n", - " Sizes after applying Open Interest threshold of 25: 2658\n", - " Sizes after applying Open Interest threshold of 50: 2502\n", - " Sizes after applying Open Interest threshold of 100: 2289\n", - " Sizes after applying Open Interest threshold of 200: 2011\n", - " Sizes after applying Open Interest threshold of 500: 1510\n", - " Sizes after applying Open Interest threshold of 1000: 1081\n", - "Threshold: 10.00%, Size: 3784\n", - " Sizes after applying Open Interest threshold of 25: 2817\n", - " Sizes after applying Open Interest threshold of 50: 2657\n", - " Sizes after applying Open Interest threshold of 100: 2433\n", - " Sizes after applying Open Interest threshold of 200: 2139\n", - " Sizes after applying Open Interest threshold of 500: 1606\n", - " Sizes after applying Open Interest threshold of 1000: 1160\n", - "Threshold: 15.00%, Size: 3843\n", - " Sizes after applying Open Interest threshold of 25: 2872\n", - " Sizes after applying Open Interest threshold of 50: 2711\n", - " Sizes after applying Open Interest threshold of 100: 2484\n", - " Sizes after applying Open Interest threshold of 200: 2185\n", - " Sizes after applying Open Interest threshold of 500: 1641\n", - " Sizes after applying Open Interest threshold of 1000: 1187\n", - "Threshold: 20.00%, Size: 3886\n", - " Sizes after applying Open Interest threshold of 25: 2914\n", - " Sizes after applying Open Interest threshold of 50: 2751\n", - " Sizes after applying Open Interest threshold of 100: 2521\n", - " Sizes after applying Open Interest threshold of 200: 2218\n", - " Sizes after applying Open Interest threshold of 500: 1669\n", - " Sizes after applying Open Interest threshold of 1000: 1207\n", - "Threshold: 25.00%, Size: 3916\n", - " Sizes after applying Open Interest threshold of 25: 2937\n", - " Sizes after applying Open Interest threshold of 50: 2773\n", - " Sizes after applying Open Interest threshold of 100: 2542\n", - " Sizes after applying Open Interest threshold of 200: 2237\n", - " Sizes after applying Open Interest threshold of 500: 1679\n", - " Sizes after applying Open Interest threshold of 1000: 1213\n", - "Threshold: 30.00%, Size: 3949\n", - " Sizes after applying Open Interest threshold of 25: 2967\n", - " Sizes after applying Open Interest threshold of 50: 2799\n", - " Sizes after applying Open Interest threshold of 100: 2564\n", - " Sizes after applying Open Interest threshold of 200: 2257\n", - " Sizes after applying Open Interest threshold of 500: 1695\n", - " Sizes after applying Open Interest threshold of 1000: 1227\n", - "2025-10-27 22:26:13 __main__ INFO: Processing ticker: NVDA\n", - "http://127.0.0.1:25510/v2/bulk_at_time/option/quote?root=NVDA&exp=0&start_date=20250820&end_date=20250820&ivl=57600000&use_csv=true&right=C\n", - "http://127.0.0.1:25510/v2/bulk_at_time/option/quote?root=NVDA&exp=0&start_date=20250820&end_date=20250820&ivl=57600000&use_csv=true&right=C\n", - "Max DTE: 849 days\n", - "Sizes after filtering for different pct_spread thresholds. Total original size: 4016\n", - "Threshold: 5.00%, Size: 2592\n", - " Sizes after applying Open Interest threshold of 25: 2276\n", - " Sizes after applying Open Interest threshold of 50: 2217\n", - " Sizes after applying Open Interest threshold of 100: 2147\n", - " Sizes after applying Open Interest threshold of 200: 2045\n", - " Sizes after applying Open Interest threshold of 500: 1793\n", - " Sizes after applying Open Interest threshold of 1000: 1470\n", - "Threshold: 10.00%, Size: 3019\n", - " Sizes after applying Open Interest threshold of 25: 2562\n", - " Sizes after applying Open Interest threshold of 50: 2480\n", - " Sizes after applying Open Interest threshold of 100: 2381\n", - " Sizes after applying Open Interest threshold of 200: 2250\n", - " Sizes after applying Open Interest threshold of 500: 1963\n", - " Sizes after applying Open Interest threshold of 1000: 1603\n", - "Threshold: 15.00%, Size: 3123\n", - " Sizes after applying Open Interest threshold of 25: 2637\n", - " Sizes after applying Open Interest threshold of 50: 2553\n", - " Sizes after applying Open Interest threshold of 100: 2450\n", - " Sizes after applying Open Interest threshold of 200: 2314\n", - " Sizes after applying Open Interest threshold of 500: 2015\n", - " Sizes after applying Open Interest threshold of 1000: 1644\n", - "Threshold: 20.00%, Size: 3188\n", - " Sizes after applying Open Interest threshold of 25: 2700\n", - " Sizes after applying Open Interest threshold of 50: 2615\n", - " Sizes after applying Open Interest threshold of 100: 2512\n", - " Sizes after applying Open Interest threshold of 200: 2374\n", - " Sizes after applying Open Interest threshold of 500: 2065\n", - " Sizes after applying Open Interest threshold of 1000: 1689\n", - "Threshold: 25.00%, Size: 3233\n", - " Sizes after applying Open Interest threshold of 25: 2743\n", - " Sizes after applying Open Interest threshold of 50: 2658\n", - " Sizes after applying Open Interest threshold of 100: 2553\n", - " Sizes after applying Open Interest threshold of 200: 2413\n", - " Sizes after applying Open Interest threshold of 500: 2100\n", - " Sizes after applying Open Interest threshold of 1000: 1719\n", - "Threshold: 30.00%, Size: 3287\n", - " Sizes after applying Open Interest threshold of 25: 2797\n", - " Sizes after applying Open Interest threshold of 50: 2712\n", - " Sizes after applying Open Interest threshold of 100: 2606\n", - " Sizes after applying Open Interest threshold of 200: 2463\n", - " Sizes after applying Open Interest threshold of 500: 2145\n", - " Sizes after applying Open Interest threshold of 1000: 1755\n", - "2025-10-27 22:26:18 __main__ INFO: Processing ticker: JNJ\n", - "http://127.0.0.1:25510/v2/bulk_at_time/option/quote?root=JNJ&exp=0&start_date=20250820&end_date=20250820&ivl=57600000&use_csv=true&right=C\n", - "http://127.0.0.1:25510/v2/bulk_at_time/option/quote?root=JNJ&exp=0&start_date=20250820&end_date=20250820&ivl=57600000&use_csv=true&right=C\n", - "Max DTE: 513 days\n", - "Sizes after filtering for different pct_spread thresholds. Total original size: 1132\n", - "Threshold: 5.00%, Size: 474\n", - " Sizes after applying Open Interest threshold of 25: 137\n", - " Sizes after applying Open Interest threshold of 50: 120\n", - " Sizes after applying Open Interest threshold of 100: 102\n", - " Sizes after applying Open Interest threshold of 200: 86\n", - " Sizes after applying Open Interest threshold of 500: 54\n", - " Sizes after applying Open Interest threshold of 1000: 36\n", - "Threshold: 10.00%, Size: 621\n", - " Sizes after applying Open Interest threshold of 25: 208\n", - " Sizes after applying Open Interest threshold of 50: 186\n", - " Sizes after applying Open Interest threshold of 100: 158\n", - " Sizes after applying Open Interest threshold of 200: 134\n", - " Sizes after applying Open Interest threshold of 500: 85\n", - " Sizes after applying Open Interest threshold of 1000: 54\n", - "Threshold: 15.00%, Size: 670\n", - " Sizes after applying Open Interest threshold of 25: 234\n", - " Sizes after applying Open Interest threshold of 50: 208\n", - " Sizes after applying Open Interest threshold of 100: 176\n", - " Sizes after applying Open Interest threshold of 200: 149\n", - " Sizes after applying Open Interest threshold of 500: 93\n", - " Sizes after applying Open Interest threshold of 1000: 59\n", - "Threshold: 20.00%, Size: 696\n", - " Sizes after applying Open Interest threshold of 25: 250\n", - " Sizes after applying Open Interest threshold of 50: 223\n", - " Sizes after applying Open Interest threshold of 100: 188\n", - " Sizes after applying Open Interest threshold of 200: 158\n", - " Sizes after applying Open Interest threshold of 500: 98\n", - " Sizes after applying Open Interest threshold of 1000: 60\n", - "Threshold: 25.00%, Size: 713\n", - " Sizes after applying Open Interest threshold of 25: 264\n", - " Sizes after applying Open Interest threshold of 50: 236\n", - " Sizes after applying Open Interest threshold of 100: 198\n", - " Sizes after applying Open Interest threshold of 200: 166\n", - " Sizes after applying Open Interest threshold of 500: 106\n", - " Sizes after applying Open Interest threshold of 1000: 65\n", - "Threshold: 30.00%, Size: 727\n", - " Sizes after applying Open Interest threshold of 25: 277\n", - " Sizes after applying Open Interest threshold of 50: 249\n", - " Sizes after applying Open Interest threshold of 100: 211\n", - " Sizes after applying Open Interest threshold of 200: 177\n", - " Sizes after applying Open Interest threshold of 500: 112\n", - " Sizes after applying Open Interest threshold of 1000: 66\n", - "2025-10-27 22:26:21 __main__ INFO: Processing ticker: V\n", - "http://127.0.0.1:25510/v2/bulk_at_time/option/quote?root=V&exp=0&start_date=20250820&end_date=20250820&ivl=57600000&use_csv=true&right=C\n", - "http://127.0.0.1:25510/v2/bulk_at_time/option/quote?root=V&exp=0&start_date=20250820&end_date=20250820&ivl=57600000&use_csv=true&right=C\n", - "Max DTE: 849 days\n", - "Sizes after filtering for different pct_spread thresholds. Total original size: 2584\n", - "Threshold: 5.00%, Size: 1162\n", - " Sizes after applying Open Interest threshold of 25: 345\n", - " Sizes after applying Open Interest threshold of 50: 272\n", - " Sizes after applying Open Interest threshold of 100: 202\n", - " Sizes after applying Open Interest threshold of 200: 157\n", - " Sizes after applying Open Interest threshold of 500: 75\n", - " Sizes after applying Open Interest threshold of 1000: 27\n", - "Threshold: 10.00%, Size: 1617\n", - " Sizes after applying Open Interest threshold of 25: 559\n", - " Sizes after applying Open Interest threshold of 50: 451\n", - " Sizes after applying Open Interest threshold of 100: 337\n", - " Sizes after applying Open Interest threshold of 200: 254\n", - " Sizes after applying Open Interest threshold of 500: 127\n", - " Sizes after applying Open Interest threshold of 1000: 46\n", - "Threshold: 15.00%, Size: 1784\n", - " Sizes after applying Open Interest threshold of 25: 646\n", - " Sizes after applying Open Interest threshold of 50: 515\n", - " Sizes after applying Open Interest threshold of 100: 381\n", - " Sizes after applying Open Interest threshold of 200: 283\n", - " Sizes after applying Open Interest threshold of 500: 144\n", - " Sizes after applying Open Interest threshold of 1000: 54\n", - "Threshold: 20.00%, Size: 1870\n", - " Sizes after applying Open Interest threshold of 25: 692\n", - " Sizes after applying Open Interest threshold of 50: 544\n", - " Sizes after applying Open Interest threshold of 100: 399\n", - " Sizes after applying Open Interest threshold of 200: 295\n", - " Sizes after applying Open Interest threshold of 500: 148\n", - " Sizes after applying Open Interest threshold of 1000: 55\n", - "Threshold: 25.00%, Size: 1935\n", - " Sizes after applying Open Interest threshold of 25: 727\n", - " Sizes after applying Open Interest threshold of 50: 570\n", - " Sizes after applying Open Interest threshold of 100: 414\n", - " Sizes after applying Open Interest threshold of 200: 304\n", - " Sizes after applying Open Interest threshold of 500: 151\n", - " Sizes after applying Open Interest threshold of 1000: 55\n", - "Threshold: 30.00%, Size: 1984\n", - " Sizes after applying Open Interest threshold of 25: 753\n", - " Sizes after applying Open Interest threshold of 50: 593\n", - " Sizes after applying Open Interest threshold of 100: 426\n", - " Sizes after applying Open Interest threshold of 200: 309\n", - " Sizes after applying Open Interest threshold of 500: 151\n", - " Sizes after applying Open Interest threshold of 1000: 55\n", - "2025-10-27 22:26:23 __main__ INFO: Processing ticker: WMT\n", - "http://127.0.0.1:25510/v2/bulk_at_time/option/quote?root=WMT&exp=0&start_date=20250820&end_date=20250820&ivl=57600000&use_csv=true&right=C\n", - "http://127.0.0.1:25510/v2/bulk_at_time/option/quote?root=WMT&exp=0&start_date=20250820&end_date=20250820&ivl=57600000&use_csv=true&right=C\n", - "Max DTE: 666 days\n", - "Sizes after filtering for different pct_spread thresholds. Total original size: 1192\n", - "Threshold: 5.00%, Size: 210\n", - " Sizes after applying Open Interest threshold of 25: 174\n", - " Sizes after applying Open Interest threshold of 50: 165\n", - " Sizes after applying Open Interest threshold of 100: 149\n", - " Sizes after applying Open Interest threshold of 200: 133\n", - " Sizes after applying Open Interest threshold of 500: 90\n", - " Sizes after applying Open Interest threshold of 1000: 61\n", - "Threshold: 10.00%, Size: 529\n", - " Sizes after applying Open Interest threshold of 25: 368\n", - " Sizes after applying Open Interest threshold of 50: 342\n", - " Sizes after applying Open Interest threshold of 100: 305\n", - " Sizes after applying Open Interest threshold of 200: 266\n", - " Sizes after applying Open Interest threshold of 500: 194\n", - " Sizes after applying Open Interest threshold of 1000: 132\n", - "Threshold: 15.00%, Size: 693\n", - " Sizes after applying Open Interest threshold of 25: 449\n", - " Sizes after applying Open Interest threshold of 50: 415\n", - " Sizes after applying Open Interest threshold of 100: 370\n", - " Sizes after applying Open Interest threshold of 200: 315\n", - " Sizes after applying Open Interest threshold of 500: 223\n", - " Sizes after applying Open Interest threshold of 1000: 155\n", - "Threshold: 20.00%, Size: 777\n", - " Sizes after applying Open Interest threshold of 25: 499\n", - " Sizes after applying Open Interest threshold of 50: 459\n", - " Sizes after applying Open Interest threshold of 100: 409\n", - " Sizes after applying Open Interest threshold of 200: 341\n", - " Sizes after applying Open Interest threshold of 500: 239\n", - " Sizes after applying Open Interest threshold of 1000: 168\n", - "Threshold: 25.00%, Size: 834\n", - " Sizes after applying Open Interest threshold of 25: 543\n", - " Sizes after applying Open Interest threshold of 50: 499\n", - " Sizes after applying Open Interest threshold of 100: 443\n", - " Sizes after applying Open Interest threshold of 200: 368\n", - " Sizes after applying Open Interest threshold of 500: 257\n", - " Sizes after applying Open Interest threshold of 1000: 182\n", - "Threshold: 30.00%, Size: 870\n", - " Sizes after applying Open Interest threshold of 25: 566\n", - " Sizes after applying Open Interest threshold of 50: 519\n", - " Sizes after applying Open Interest threshold of 100: 457\n", - " Sizes after applying Open Interest threshold of 200: 378\n", - " Sizes after applying Open Interest threshold of 500: 264\n", - " Sizes after applying Open Interest threshold of 1000: 187\n", - "2025-10-27 22:26:25 __main__ INFO: Processing ticker: NFLX\n", - "http://127.0.0.1:25510/v2/bulk_at_time/option/quote?root=NFLX&exp=0&start_date=20250820&end_date=20250820&ivl=57600000&use_csv=true&right=C\n", - "http://127.0.0.1:25510/v2/bulk_at_time/option/quote?root=NFLX&exp=0&start_date=20250820&end_date=20250820&ivl=57600000&use_csv=true&right=C\n", - "Max DTE: 849 days\n", - "Sizes after filtering for different pct_spread thresholds. Total original size: 7142\n", - "Threshold: 5.00%, Size: 4142\n", - " Sizes after applying Open Interest threshold of 25: 1157\n", - " Sizes after applying Open Interest threshold of 50: 844\n", - " Sizes after applying Open Interest threshold of 100: 527\n", - " Sizes after applying Open Interest threshold of 200: 266\n", - " Sizes after applying Open Interest threshold of 500: 87\n", - " Sizes after applying Open Interest threshold of 1000: 29\n", - "Threshold: 10.00%, Size: 4919\n", - " Sizes after applying Open Interest threshold of 25: 1516\n", - " Sizes after applying Open Interest threshold of 50: 1113\n", - " Sizes after applying Open Interest threshold of 100: 705\n", - " Sizes after applying Open Interest threshold of 200: 369\n", - " Sizes after applying Open Interest threshold of 500: 124\n", - " Sizes after applying Open Interest threshold of 1000: 38\n", - "Threshold: 15.00%, Size: 5188\n", - " Sizes after applying Open Interest threshold of 25: 1629\n", - " Sizes after applying Open Interest threshold of 50: 1199\n", - " Sizes after applying Open Interest threshold of 100: 761\n", - " Sizes after applying Open Interest threshold of 200: 399\n", - " Sizes after applying Open Interest threshold of 500: 136\n", - " Sizes after applying Open Interest threshold of 1000: 39\n", - "Threshold: 20.00%, Size: 5337\n", - " Sizes after applying Open Interest threshold of 25: 1710\n", - " Sizes after applying Open Interest threshold of 50: 1255\n", - " Sizes after applying Open Interest threshold of 100: 794\n", - " Sizes after applying Open Interest threshold of 200: 420\n", - " Sizes after applying Open Interest threshold of 500: 145\n", - " Sizes after applying Open Interest threshold of 1000: 41\n", - "Threshold: 25.00%, Size: 5466\n", - " Sizes after applying Open Interest threshold of 25: 1769\n", - " Sizes after applying Open Interest threshold of 50: 1307\n", - " Sizes after applying Open Interest threshold of 100: 828\n", - " Sizes after applying Open Interest threshold of 200: 435\n", - " Sizes after applying Open Interest threshold of 500: 150\n", - " Sizes after applying Open Interest threshold of 1000: 41\n", - "Threshold: 30.00%, Size: 5556\n", - " Sizes after applying Open Interest threshold of 25: 1817\n", - " Sizes after applying Open Interest threshold of 50: 1345\n", - " Sizes after applying Open Interest threshold of 100: 851\n", - " Sizes after applying Open Interest threshold of 200: 450\n", - " Sizes after applying Open Interest threshold of 500: 156\n", - " Sizes after applying Open Interest threshold of 1000: 44\n", - "2025-10-27 22:26:34 __main__ INFO: Processing ticker: SBUX\n", - "http://127.0.0.1:25510/v2/bulk_at_time/option/quote?root=SBUX&exp=0&start_date=20250820&end_date=20250820&ivl=57600000&use_csv=true&right=C\n", - "http://127.0.0.1:25510/v2/bulk_at_time/option/quote?root=SBUX&exp=0&start_date=20250820&end_date=20250820&ivl=57600000&use_csv=true&right=C\n", - "Max DTE: 513 days\n", - "Sizes after filtering for different pct_spread thresholds. Total original size: 984\n", - "Threshold: 5.00%, Size: 546\n", - " Sizes after applying Open Interest threshold of 25: 250\n", - " Sizes after applying Open Interest threshold of 50: 212\n", - " Sizes after applying Open Interest threshold of 100: 174\n", - " Sizes after applying Open Interest threshold of 200: 140\n", - " Sizes after applying Open Interest threshold of 500: 101\n", - " Sizes after applying Open Interest threshold of 1000: 70\n", - "Threshold: 10.00%, Size: 665\n", - " Sizes after applying Open Interest threshold of 25: 315\n", - " Sizes after applying Open Interest threshold of 50: 268\n", - " Sizes after applying Open Interest threshold of 100: 220\n", - " Sizes after applying Open Interest threshold of 200: 180\n", - " Sizes after applying Open Interest threshold of 500: 132\n", - " Sizes after applying Open Interest threshold of 1000: 90\n", - "Threshold: 15.00%, Size: 711\n", - " Sizes after applying Open Interest threshold of 25: 340\n", - " Sizes after applying Open Interest threshold of 50: 285\n", - " Sizes after applying Open Interest threshold of 100: 233\n", - " Sizes after applying Open Interest threshold of 200: 192\n", - " Sizes after applying Open Interest threshold of 500: 139\n", - " Sizes after applying Open Interest threshold of 1000: 95\n", - "Threshold: 20.00%, Size: 736\n", - " Sizes after applying Open Interest threshold of 25: 353\n", - " Sizes after applying Open Interest threshold of 50: 297\n", - " Sizes after applying Open Interest threshold of 100: 244\n", - " Sizes after applying Open Interest threshold of 200: 201\n", - " Sizes after applying Open Interest threshold of 500: 145\n", - " Sizes after applying Open Interest threshold of 1000: 99\n", - "Threshold: 25.00%, Size: 746\n", - " Sizes after applying Open Interest threshold of 25: 360\n", - " Sizes after applying Open Interest threshold of 50: 304\n", - " Sizes after applying Open Interest threshold of 100: 250\n", - " Sizes after applying Open Interest threshold of 200: 206\n", - " Sizes after applying Open Interest threshold of 500: 149\n", - " Sizes after applying Open Interest threshold of 1000: 102\n", - "Threshold: 30.00%, Size: 759\n", - " Sizes after applying Open Interest threshold of 25: 368\n", - " Sizes after applying Open Interest threshold of 50: 312\n", - " Sizes after applying Open Interest threshold of 100: 258\n", - " Sizes after applying Open Interest threshold of 200: 214\n", - " Sizes after applying Open Interest threshold of 500: 156\n", - " Sizes after applying Open Interest threshold of 1000: 106\n", - "2025-10-27 22:26:36 __main__ INFO: Processing ticker: BA\n", - "http://127.0.0.1:25510/v2/bulk_at_time/option/quote?root=BA&exp=0&start_date=20250820&end_date=20250820&ivl=57600000&use_csv=true&right=C\n", - "http://127.0.0.1:25510/v2/bulk_at_time/option/quote?root=BA&exp=0&start_date=20250820&end_date=20250820&ivl=57600000&use_csv=true&right=C\n", - "Max DTE: 513 days\n", - "Sizes after filtering for different pct_spread thresholds. Total original size: 1780\n", - "Threshold: 5.00%, Size: 590\n", - " Sizes after applying Open Interest threshold of 25: 323\n", - " Sizes after applying Open Interest threshold of 50: 288\n", - " Sizes after applying Open Interest threshold of 100: 250\n", - " Sizes after applying Open Interest threshold of 200: 187\n", - " Sizes after applying Open Interest threshold of 500: 119\n", - " Sizes after applying Open Interest threshold of 1000: 63\n", - "Threshold: 10.00%, Size: 1028\n", - " Sizes after applying Open Interest threshold of 25: 584\n", - " Sizes after applying Open Interest threshold of 50: 518\n", - " Sizes after applying Open Interest threshold of 100: 449\n", - " Sizes after applying Open Interest threshold of 200: 336\n", - " Sizes after applying Open Interest threshold of 500: 211\n", - " Sizes after applying Open Interest threshold of 1000: 118\n", - "Threshold: 15.00%, Size: 1182\n", - " Sizes after applying Open Interest threshold of 25: 682\n", - " Sizes after applying Open Interest threshold of 50: 606\n", - " Sizes after applying Open Interest threshold of 100: 514\n", - " Sizes after applying Open Interest threshold of 200: 385\n", - " Sizes after applying Open Interest threshold of 500: 240\n", - " Sizes after applying Open Interest threshold of 1000: 135\n", - "Threshold: 20.00%, Size: 1257\n", - " Sizes after applying Open Interest threshold of 25: 734\n", - " Sizes after applying Open Interest threshold of 50: 651\n", - " Sizes after applying Open Interest threshold of 100: 551\n", - " Sizes after applying Open Interest threshold of 200: 413\n", - " Sizes after applying Open Interest threshold of 500: 260\n", - " Sizes after applying Open Interest threshold of 1000: 147\n", - "Threshold: 25.00%, Size: 1293\n", - " Sizes after applying Open Interest threshold of 25: 763\n", - " Sizes after applying Open Interest threshold of 50: 678\n", - " Sizes after applying Open Interest threshold of 100: 575\n", - " Sizes after applying Open Interest threshold of 200: 432\n", - " Sizes after applying Open Interest threshold of 500: 270\n", - " Sizes after applying Open Interest threshold of 1000: 153\n", - "Threshold: 30.00%, Size: 1333\n", - " Sizes after applying Open Interest threshold of 25: 792\n", - " Sizes after applying Open Interest threshold of 50: 703\n", - " Sizes after applying Open Interest threshold of 100: 595\n", - " Sizes after applying Open Interest threshold of 200: 451\n", - " Sizes after applying Open Interest threshold of 500: 285\n", - " Sizes after applying Open Interest threshold of 1000: 162\n", - "2025-10-27 22:26:39 __main__ INFO: Processing ticker: AMD\n", - "http://127.0.0.1:25510/v2/bulk_at_time/option/quote?root=AMD&exp=0&start_date=20250820&end_date=20250820&ivl=57600000&use_csv=true&right=C\n", - "http://127.0.0.1:25510/v2/bulk_at_time/option/quote?root=AMD&exp=0&start_date=20250820&end_date=20250820&ivl=57600000&use_csv=true&right=C\n", - "Max DTE: 849 days\n", - "Sizes after filtering for different pct_spread thresholds. Total original size: 2340\n", - "Threshold: 5.00%, Size: 1791\n", - " Sizes after applying Open Interest threshold of 25: 1271\n", - " Sizes after applying Open Interest threshold of 50: 1193\n", - " Sizes after applying Open Interest threshold of 100: 1089\n", - " Sizes after applying Open Interest threshold of 200: 936\n", - " Sizes after applying Open Interest threshold of 500: 721\n", - " Sizes after applying Open Interest threshold of 1000: 557\n", - "Threshold: 10.00%, Size: 1918\n", - " Sizes after applying Open Interest threshold of 25: 1385\n", - " Sizes after applying Open Interest threshold of 50: 1299\n", - " Sizes after applying Open Interest threshold of 100: 1177\n", - " Sizes after applying Open Interest threshold of 200: 1013\n", - " Sizes after applying Open Interest threshold of 500: 780\n", - " Sizes after applying Open Interest threshold of 1000: 608\n", - "Threshold: 15.00%, Size: 1977\n", - " Sizes after applying Open Interest threshold of 25: 1441\n", - " Sizes after applying Open Interest threshold of 50: 1353\n", - " Sizes after applying Open Interest threshold of 100: 1227\n", - " Sizes after applying Open Interest threshold of 200: 1056\n", - " Sizes after applying Open Interest threshold of 500: 816\n", - " Sizes after applying Open Interest threshold of 1000: 636\n", - "Threshold: 20.00%, Size: 2012\n", - " Sizes after applying Open Interest threshold of 25: 1474\n", - " Sizes after applying Open Interest threshold of 50: 1385\n", - " Sizes after applying Open Interest threshold of 100: 1257\n", - " Sizes after applying Open Interest threshold of 200: 1080\n", - " Sizes after applying Open Interest threshold of 500: 835\n", - " Sizes after applying Open Interest threshold of 1000: 647\n", - "Threshold: 25.00%, Size: 2042\n", - " Sizes after applying Open Interest threshold of 25: 1500\n", - " Sizes after applying Open Interest threshold of 50: 1410\n", - " Sizes after applying Open Interest threshold of 100: 1280\n", - " Sizes after applying Open Interest threshold of 200: 1098\n", - " Sizes after applying Open Interest threshold of 500: 850\n", - " Sizes after applying Open Interest threshold of 1000: 659\n", - "Threshold: 30.00%, Size: 2063\n", - " Sizes after applying Open Interest threshold of 25: 1520\n", - " Sizes after applying Open Interest threshold of 50: 1429\n", - " Sizes after applying Open Interest threshold of 100: 1299\n", - " Sizes after applying Open Interest threshold of 200: 1115\n", - " Sizes after applying Open Interest threshold of 500: 862\n", - " Sizes after applying Open Interest threshold of 1000: 666\n", - "2025-10-27 22:26:43 __main__ INFO: Processing ticker: COST\n", - "http://127.0.0.1:25510/v2/bulk_at_time/option/quote?root=COST&exp=0&start_date=20250820&end_date=20250820&ivl=57600000&use_csv=true&right=C\n", - "http://127.0.0.1:25510/v2/bulk_at_time/option/quote?root=COST&exp=0&start_date=20250820&end_date=20250820&ivl=57600000&use_csv=true&right=C\n", - "Max DTE: 513 days\n", - "Sizes after filtering for different pct_spread thresholds. Total original size: 3224\n", - "Threshold: 5.00%, Size: 1406\n", - " Sizes after applying Open Interest threshold of 25: 424\n", - " Sizes after applying Open Interest threshold of 50: 307\n", - " Sizes after applying Open Interest threshold of 100: 197\n", - " Sizes after applying Open Interest threshold of 200: 106\n", - " Sizes after applying Open Interest threshold of 500: 28\n", - " Sizes after applying Open Interest threshold of 1000: 8\n", - "Threshold: 10.00%, Size: 2001\n", - " Sizes after applying Open Interest threshold of 25: 668\n", - " Sizes after applying Open Interest threshold of 50: 496\n", - " Sizes after applying Open Interest threshold of 100: 324\n", - " Sizes after applying Open Interest threshold of 200: 187\n", - " Sizes after applying Open Interest threshold of 500: 59\n", - " Sizes after applying Open Interest threshold of 1000: 19\n", - "Threshold: 15.00%, Size: 2140\n", - " Sizes after applying Open Interest threshold of 25: 738\n", - " Sizes after applying Open Interest threshold of 50: 547\n", - " Sizes after applying Open Interest threshold of 100: 358\n", - " Sizes after applying Open Interest threshold of 200: 208\n", - " Sizes after applying Open Interest threshold of 500: 66\n", - " Sizes after applying Open Interest threshold of 1000: 20\n", - "Threshold: 20.00%, Size: 2227\n", - " Sizes after applying Open Interest threshold of 25: 777\n", - " Sizes after applying Open Interest threshold of 50: 576\n", - " Sizes after applying Open Interest threshold of 100: 381\n", - " Sizes after applying Open Interest threshold of 200: 222\n", - " Sizes after applying Open Interest threshold of 500: 73\n", - " Sizes after applying Open Interest threshold of 1000: 22\n", - "Threshold: 25.00%, Size: 2267\n", - " Sizes after applying Open Interest threshold of 25: 795\n", - " Sizes after applying Open Interest threshold of 50: 592\n", - " Sizes after applying Open Interest threshold of 100: 396\n", - " Sizes after applying Open Interest threshold of 200: 229\n", - " Sizes after applying Open Interest threshold of 500: 74\n", - " Sizes after applying Open Interest threshold of 1000: 22\n", - "Threshold: 30.00%, Size: 2293\n", - " Sizes after applying Open Interest threshold of 25: 809\n", - " Sizes after applying Open Interest threshold of 50: 603\n", - " Sizes after applying Open Interest threshold of 100: 404\n", - " Sizes after applying Open Interest threshold of 200: 236\n", - " Sizes after applying Open Interest threshold of 500: 78\n", - " Sizes after applying Open Interest threshold of 1000: 24\n" - ] - } - ], - "source": [ - "tickers = ['AAPL', 'MSFT', 'GOOGL', 'AMZN', 'TSLA', 'NVDA', 'JNJ', 'V', 'WMT', 'NFLX', 'SBUX', 'BA', 'AMD', 'COST']\n", - "main_chain = {}\n", - "documenting = {}\n", - "\n", - "for tick in tickers:\n", - " documenting[tick] = {}\n", - " logger.info(f\"Processing ticker: {tick}\")\n", - " date = '2025-08-20'\n", - " print_url = True\n", - "\n", - " chain = retrieve_chain_bulk(\n", - " tick,\n", - " '',\n", - " date,\n", - " date,\n", - " '16:00',\n", - " 'C',\n", - " print_url = print_url\n", - " )\n", - "\n", - " prev = (pd.to_datetime(date) - BDay(1)).strftime('%Y-%m-%d')\n", - " oi = retrieve_bulk_open_interest(\n", - " symbol = tick,\n", - " exp = 0,\n", - " start_date = prev,\n", - " end_date = prev,\n", - " print_url = False\n", - " )\n", - " oi\n", - "\n", - " chain =chain.merge(oi[['Root', 'Expiration', 'Strike', 'Right', 'Open_interest']], on=['Root', 'Expiration', 'Strike', 'Right'], how='left')\n", - " chain['spread'] = chain['CloseAsk'] - chain['CloseBid']\n", - " chain['pct_spread'] = chain['spread'] / ((chain['CloseAsk'] + chain['CloseBid']) / 2)\n", - " chain['DTE'] = (pd.to_datetime(chain['Expiration']) - pd.to_datetime(date)).dt.days\n", - " print(f\"Max DTE: {chain['DTE'].max()} days\")\n", - "\n", - " ## Sizes after filtering for different pct_spread thresholds\n", - " print(f\"Sizes after filtering for different pct_spread thresholds. Total original size: {len(chain)}\")\n", - " for threshold in spread_threshold:\n", - " main_chain[tick] = chain.copy() \n", - " documenting[tick]['chain_size'] = len(chain)\n", - " filtered_chain = chain[chain['pct_spread'] <= threshold]\n", - " print(f\"Threshold: {threshold:.2%}, Size: {len(filtered_chain)}\")\n", - " \n", - " # print(\"Size by Expiration Change:\")\n", - " original_sizes = chain.groupby('DTE').size()\n", - " filtered_sizes = filtered_chain.groupby('DTE').size()\n", - " size_comparison = pd.DataFrame({\n", - " 'Original Size': original_sizes,\n", - " 'Filtered Size': filtered_sizes,\n", - " 'Reduction': original_sizes - filtered_sizes,\n", - " 'pct Reduction': (original_sizes - filtered_sizes) / original_sizes * 100\n", - " }).fillna(0).astype(int)\n", - " documenting[tick][f'spread_{threshold}_oi_base'] = filtered_chain.shape[0]\n", - "\n", - " for oi_threshold in oi_thresholds:\n", - " print(f\" Sizes after applying Open Interest threshold of {oi_threshold}: {filtered_chain[filtered_chain['Open_interest'] > oi_threshold].shape[0]}\")\n", - " documenting[tick][f'spread_{threshold}_oi_{oi_threshold}'] = filtered_chain[filtered_chain['Open_interest'] > oi_threshold].shape[0]\n", - " # print(size_comparison)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "7460daf0", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "spread_0.05_oi_base 0.612684\n", - "spread_0.05_oi_25 0.341986\n", - "spread_0.05_oi_50 0.301065\n", - "spread_0.05_oi_100 0.257661\n", - "spread_0.05_oi_200 0.208259\n", - "spread_0.05_oi_500 0.142005\n", - "spread_0.05_oi_1000 0.093250\n", - "spread_0.1_oi_base 0.720243\n", - "spread_0.1_oi_25 0.408861\n", - "spread_0.1_oi_50 0.368198\n", - "spread_0.1_oi_100 0.321277\n", - "spread_0.1_oi_200 0.268557\n", - "spread_0.1_oi_500 0.185056\n", - "spread_0.1_oi_1000 0.121374\n", - "spread_0.15_oi_base 0.752023\n", - "spread_0.15_oi_25 0.450773\n", - "spread_0.15_oi_50 0.406846\n", - "spread_0.15_oi_100 0.356866\n", - "spread_0.15_oi_200 0.295974\n", - "spread_0.15_oi_500 0.201309\n", - "spread_0.15_oi_1000 0.133942\n", - "spread_0.2_oi_base 0.770896\n", - "spread_0.2_oi_25 0.475521\n", - "spread_0.2_oi_50 0.431435\n", - "spread_0.2_oi_100 0.378336\n", - "spread_0.2_oi_200 0.310677\n", - "spread_0.2_oi_500 0.210211\n", - "spread_0.2_oi_1000 0.140855\n", - "spread_0.25_oi_base 0.785181\n", - "spread_0.25_oi_25 0.497482\n", - "spread_0.25_oi_50 0.451427\n", - "spread_0.25_oi_100 0.395372\n", - "spread_0.25_oi_200 0.324193\n", - "spread_0.25_oi_500 0.219367\n", - "spread_0.25_oi_1000 0.147604\n", - "spread_0.3_oi_base 0.798205\n", - "spread_0.3_oi_25 0.511511\n", - "spread_0.3_oi_50 0.463613\n", - "spread_0.3_oi_100 0.404019\n", - "spread_0.3_oi_200 0.330724\n", - "spread_0.3_oi_500 0.224348\n", - "spread_0.3_oi_1000 0.151162\n", - "dtype: float64" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df = pd.DataFrame(documenting)\n", - "df_no_chain = df.drop(index=['chain_size'])\n", - "df_chain = df.loc['chain_size']\n", - "(df_no_chain/df_chain.T).median(axis=1)" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "id": "07e5c248", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2025-10-27 22:38:04 __main__ INFO: Building order for ticker: AAPL\n", - "Cahin size after filtering: 2394\n", - "2025-10-27 22:38:04 __main__ INFO: Building order for ticker: MSFT\n", - "Cahin size after filtering: 3424\n", - "2025-10-27 22:38:04 __main__ INFO: Building order for ticker: GOOGL\n", - "Cahin size after filtering: 2122\n", - "2025-10-27 22:38:04 __main__ INFO: Building order for ticker: AMZN\n", - "Cahin size after filtering: 2136\n", - "2025-10-27 22:38:04 __main__ INFO: Building order for ticker: TSLA\n", - "Cahin size after filtering: 4256\n", - "2025-10-27 22:38:04 __main__ INFO: Building order for ticker: NVDA\n", - "Cahin size after filtering: 4016\n", - "2025-10-27 22:38:04 __main__ INFO: Building order for ticker: JNJ\n", - "Cahin size after filtering: 1132\n", - "2025-10-27 22:38:04 __main__ INFO: Building order for ticker: V\n", - "Cahin size after filtering: 2584\n", - "2025-10-27 22:38:04 __main__ INFO: Building order for ticker: WMT\n", - "Cahin size after filtering: 1192\n", - "2025-10-27 22:38:05 __main__ INFO: Building order for ticker: NFLX\n", - "Cahin size after filtering: 7142\n", - "2025-10-27 22:38:05 __main__ INFO: Building order for ticker: SBUX\n", - "Cahin size after filtering: 984\n", - "2025-10-27 22:38:05 __main__ INFO: Building order for ticker: BA\n", - "Cahin size after filtering: 1780\n", - "2025-10-27 22:38:05 __main__ INFO: Building order for ticker: AMD\n", - "Cahin size after filtering: 2340\n", - "2025-10-27 22:38:05 __main__ INFO: Building order for ticker: COST\n", - "Cahin size after filtering: 3224\n", - "2025-10-27 22:38:05 QuantTools.EventDriven.riskmanager CRITICAL: No spreads found for c with DTE 270 ± 60 and ticks 1.\n", - "2025-10-27 22:38:05 __main__ WARNING: No order generated for ticker: COST\n" - ] - } - ], - "source": [ - "order_cache = {}\n", - "orders = {}\n", - "schema['max_total_price']=5\n", - "for chain in main_chain.values():\n", - " logger.info(f\"Building order for ticker: {chain['Root'].iloc[0]}\")\n", - " schema['tick']=chain['Root'].iloc[0]\n", - " copy_chain = chain.copy()\n", - " copy_chain.columns=copy_chain.columns.str.lower()\n", - " # copy_chain = copy_chain[copy_chain['pct_spread'] <= 0.10]\n", - " # copy_chain = copy_chain[copy_chain['open_interest'] > 25]\n", - " print(f\"Cahin size after filtering: {len(copy_chain)}\")\n", - " order = build_strategy(\n", - " copy_chain,\n", - " schema=schema,\n", - " spot = get_spot(schema['tick'], date, 'chain_close'),\n", - " cache=order_cache\n", - " )\n", - " if not order:\n", - " logger.warning(f\"No order generated for ticker: {schema['tick']}\")\n", - " continue\n", - " order[0].pop('legs')\n", - " order[0].pop('long')\n", - " order[0].pop('short')\n", - " orders[schema['tick']] = order[0]" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "id": "b7eadfda", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
long_bidlong_askshort_bidshort_asklong_min_short_bidlong_min_short_askspread_bidspread_askspread_midspread_pct_ratio
AAPL49.1549.3545.0545.24.14.153.954.34.1250.021212
MSFT74.575.0570.871.33.73.753.24.253.7250.07047
GOOGL47.047.2543.043.24.04.053.84.254.0250.02795
AMZN27.6527.8524.7524.92.92.952.753.12.9250.029915
TSLA77.7578.172.973.354.854.754.45.24.80.041667
NVDA26.7527.024.2524.32.52.72.452.752.60.028846
JNJ26.7527.1522.5522.954.24.23.84.64.20.047619
V50.952.347.1548.753.753.552.155.153.650.205479
WMT23.123.420.9521.252.152.151.852.452.150.069767
NFLX153.45155.3150.6152.52.852.80.954.72.8250.331858
SBUX18.218.3514.614.753.63.63.453.753.60.020833
BA63.2564.758.9559.554.35.153.75.754.7250.108466
AMD29.829.9527.1527.32.652.652.52.82.650.028302
\n", - "
" - ], - "text/plain": [ - " long_bid long_ask short_bid short_ask long_min_short_bid \\\n", - "AAPL 49.15 49.35 45.05 45.2 4.1 \n", - "MSFT 74.5 75.05 70.8 71.3 3.7 \n", - "GOOGL 47.0 47.25 43.0 43.2 4.0 \n", - "AMZN 27.65 27.85 24.75 24.9 2.9 \n", - "TSLA 77.75 78.1 72.9 73.35 4.85 \n", - "NVDA 26.75 27.0 24.25 24.3 2.5 \n", - "JNJ 26.75 27.15 22.55 22.95 4.2 \n", - "V 50.9 52.3 47.15 48.75 3.75 \n", - "WMT 23.1 23.4 20.95 21.25 2.15 \n", - "NFLX 153.45 155.3 150.6 152.5 2.85 \n", - "SBUX 18.2 18.35 14.6 14.75 3.6 \n", - "BA 63.25 64.7 58.95 59.55 4.3 \n", - "AMD 29.8 29.95 27.15 27.3 2.65 \n", - "\n", - " long_min_short_ask spread_bid spread_ask spread_mid spread_pct_ratio \n", - "AAPL 4.15 3.95 4.3 4.125 0.021212 \n", - "MSFT 3.75 3.2 4.25 3.725 0.07047 \n", - "GOOGL 4.05 3.8 4.25 4.025 0.02795 \n", - "AMZN 2.95 2.75 3.1 2.925 0.029915 \n", - "TSLA 4.75 4.4 5.2 4.8 0.041667 \n", - "NVDA 2.7 2.45 2.75 2.6 0.028846 \n", - "JNJ 4.2 3.8 4.6 4.2 0.047619 \n", - "V 3.55 2.15 5.15 3.65 0.205479 \n", - "WMT 2.15 1.85 2.45 2.15 0.069767 \n", - "NFLX 2.8 0.95 4.7 2.825 0.331858 \n", - "SBUX 3.6 3.45 3.75 3.6 0.020833 \n", - "BA 5.15 3.7 5.75 4.725 0.108466 \n", - "AMD 2.65 2.5 2.8 2.65 0.028302 " - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "stuff = pd.DataFrame(orders).T\n", - "stuff['long_min_short_bid'] = stuff['long_bid'] - stuff['short_bid']\n", - "stuff['long_min_short_ask'] = stuff['long_ask'] - stuff['short_ask']\n", - "stuff[['long_bid', 'long_ask', 'short_bid', 'short_ask', 'long_min_short_bid', 'long_min_short_ask', 'spread_bid', 'spread_ask', 'spread_mid', 'spread_pct_ratio']]" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "0d871f27", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
long_bidlong_askshort_bidshort_asklong_min_short_bidlong_min_short_askspread_bidspread_askspread_midspread_pct_ratio
AAPL34.634.831.431.653.23.152.953.43.1750.035433
MSFT80.5581.1577.1577.73.43.452.854.03.4250.083942
GOOGL59.8560.1556.1556.63.73.553.254.03.6250.051724
AMZN61.7562.1557.8558.13.94.053.654.33.9750.040881
TSLA94.9596.3590.6591.54.34.853.455.74.5750.122951
NVDA35.836.032.8533.052.952.952.753.152.950.033898
JNJ26.526.8522.6522.953.853.93.554.23.8750.041935
V42.342.939.039.553.33.352.753.93.3250.086466
WMT17.217.3513.614.13.63.253.13.753.4250.047445
SBUX23.323.5519.0519.74.253.853.64.54.050.055556
BA57.7558.4553.7554.84.03.652.954.73.8250.114379
AMD59.4559.7555.6555.93.83.853.554.13.8250.035948
\n", - "
" - ], - "text/plain": [ - " long_bid long_ask short_bid short_ask long_min_short_bid \\\n", - "AAPL 34.6 34.8 31.4 31.65 3.2 \n", - "MSFT 80.55 81.15 77.15 77.7 3.4 \n", - "GOOGL 59.85 60.15 56.15 56.6 3.7 \n", - "AMZN 61.75 62.15 57.85 58.1 3.9 \n", - "TSLA 94.95 96.35 90.65 91.5 4.3 \n", - "NVDA 35.8 36.0 32.85 33.05 2.95 \n", - "JNJ 26.5 26.85 22.65 22.95 3.85 \n", - "V 42.3 42.9 39.0 39.55 3.3 \n", - "WMT 17.2 17.35 13.6 14.1 3.6 \n", - "SBUX 23.3 23.55 19.05 19.7 4.25 \n", - "BA 57.75 58.45 53.75 54.8 4.0 \n", - "AMD 59.45 59.75 55.65 55.9 3.8 \n", - "\n", - " long_min_short_ask spread_bid spread_ask spread_mid spread_pct_ratio \n", - "AAPL 3.15 2.95 3.4 3.175 0.035433 \n", - "MSFT 3.45 2.85 4.0 3.425 0.083942 \n", - "GOOGL 3.55 3.25 4.0 3.625 0.051724 \n", - "AMZN 4.05 3.65 4.3 3.975 0.040881 \n", - "TSLA 4.85 3.45 5.7 4.575 0.122951 \n", - "NVDA 2.95 2.75 3.15 2.95 0.033898 \n", - "JNJ 3.9 3.55 4.2 3.875 0.041935 \n", - "V 3.35 2.75 3.9 3.325 0.086466 \n", - "WMT 3.25 3.1 3.75 3.425 0.047445 \n", - "SBUX 3.85 3.6 4.5 4.05 0.055556 \n", - "BA 3.65 2.95 4.7 3.825 0.114379 \n", - "AMD 3.85 3.55 4.1 3.825 0.035948 " - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "stuff = pd.DataFrame(orders).T\n", - "stuff['long_min_short_bid'] = stuff['long_bid'] - stuff['short_bid']\n", - "stuff['long_min_short_ask'] = stuff['long_ask'] - stuff['short_ask']\n", - "stuff[['long_bid', 'long_ask', 'short_bid', 'short_ask', 'long_min_short_bid', 'long_min_short_ask', 'spread_bid', 'spread_ask', 'spread_mid', 'spread_pct_ratio']]" - ] - }, - { - "cell_type": "code", - "execution_count": 135, - "id": "79a6e858", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
rootexpirationstrikerightbid_sizeclosebidask_sizecloseaskdatemidpointweighted_midpointopen_interestspreadpct_spreaddte
7NFLX2026-06-18740.0P311.35712.002025102311.67511.80500080.00.650.055675238
11NFLX2026-09-18740.0P818.301019.302025102318.80018.85555631.01.000.053191330
12NFLX2026-06-18750.0C3395.205401.0520251023398.125398.85625036.05.850.014694238
13NFLX2026-06-18750.0P612.201012.952025102312.57512.668750345.00.750.059642238
18NFLX2026-06-18760.0P613.101213.902025102313.50013.633333194.00.800.059259238
................................................
223NFLX2026-06-181100.0P798.957101.7520251023100.350100.350000606.02.800.027902238
226NFLX2026-09-181100.0P10117.155119.9520251023118.550118.083333188.02.800.023619330
228NFLX2026-06-181110.0P7103.607106.4520251023105.025105.025000106.02.850.027136238
229NFLX2026-06-181110.0C6136.8515140.8520251023138.850139.70714326.04.000.028808238
232NFLX2026-09-181110.0P8121.954124.9020251023123.425122.93333346.02.950.023901330
\n", - "

88 rows × 15 columns

\n", - "
" - ], - "text/plain": [ - " root expiration strike right bid_size closebid ask_size closeask \\\n", - "7 NFLX 2026-06-18 740.0 P 3 11.35 7 12.00 \n", - "11 NFLX 2026-09-18 740.0 P 8 18.30 10 19.30 \n", - "12 NFLX 2026-06-18 750.0 C 3 395.20 5 401.05 \n", - "13 NFLX 2026-06-18 750.0 P 6 12.20 10 12.95 \n", - "18 NFLX 2026-06-18 760.0 P 6 13.10 12 13.90 \n", - ".. ... ... ... ... ... ... ... ... \n", - "223 NFLX 2026-06-18 1100.0 P 7 98.95 7 101.75 \n", - "226 NFLX 2026-09-18 1100.0 P 10 117.15 5 119.95 \n", - "228 NFLX 2026-06-18 1110.0 P 7 103.60 7 106.45 \n", - "229 NFLX 2026-06-18 1110.0 C 6 136.85 15 140.85 \n", - "232 NFLX 2026-09-18 1110.0 P 8 121.95 4 124.90 \n", - "\n", - " date midpoint weighted_midpoint open_interest spread pct_spread \\\n", - "7 20251023 11.675 11.805000 80.0 0.65 0.055675 \n", - "11 20251023 18.800 18.855556 31.0 1.00 0.053191 \n", - "12 20251023 398.125 398.856250 36.0 5.85 0.014694 \n", - "13 20251023 12.575 12.668750 345.0 0.75 0.059642 \n", - "18 20251023 13.500 13.633333 194.0 0.80 0.059259 \n", - ".. ... ... ... ... ... ... \n", - "223 20251023 100.350 100.350000 606.0 2.80 0.027902 \n", - "226 20251023 118.550 118.083333 188.0 2.80 0.023619 \n", - "228 20251023 105.025 105.025000 106.0 2.85 0.027136 \n", - "229 20251023 138.850 139.707143 26.0 4.00 0.028808 \n", - "232 20251023 123.425 122.933333 46.0 2.95 0.023901 \n", - "\n", - " dte \n", - "7 238 \n", - "11 330 \n", - "12 238 \n", - "13 238 \n", - "18 238 \n", - ".. ... \n", - "223 238 \n", - "226 330 \n", - "228 238 \n", - "229 238 \n", - "232 330 \n", - "\n", - "[88 rows x 15 columns]" - ] - }, - "execution_count": 135, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "chain_lower_cols = main_chain['NFLX'].copy()\n", - "chain_lower_cols.columns=chain_lower_cols.columns.str.lower()\n", - "filtered = filter_contracts(\n", - " df=chain_lower_cols,\n", - " schema=schema,\n", - " spot=get_spot('NFLX', date, 'chain_close'),\n", - "\n", - ")\n", - "filtered[(filtered['pct_spread'] <= 0.075) & (filtered['open_interest'] > 25) ]" - ] - }, - { - "cell_type": "code", - "execution_count": 94, - "id": "4f968d67", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
rootexpirationstrikerightbid_sizeclosebidask_sizecloseaskdatemidpointweighted_midpointopen_interestspreadpct_spreaddte
0AAPL2026-08-21210.0P307.00247.15202510237.0757.066667734.00.150.02120120686
1AAPL2026-08-21210.0C562.55663.052025102362.80062.82272763.00.500.00796220685
2AAPL2025-10-24215.0C17343.9516045.202025102344.57544.550601250.01.250.02804320384
3AAPL2025-10-31215.0C16244.0512745.602025102344.82544.731142179.01.550.03457920391
4AAPL2025-10-24215.0P00.0060.01202510230.0050.0100001639.00.012.00000020384
................................................
2341AAPL2028-01-21200.0C786.80787.752025102387.27587.275000582.00.950.01088521203
2342AAPL2026-05-15210.0P324.65234.75202510234.7004.6918181849.00.100.02127720587
2343AAPL2026-05-15210.0C1558.35858.952025102358.65058.5586961197.00.600.01023020587
2344AAPL2026-06-18210.0C259.90460.302025102360.10060.1666675761.00.400.00665620621
2345AAPL2026-06-18210.0P275.40195.55202510235.4755.4619577510.00.150.02739720621
\n", - "

2346 rows × 15 columns

\n", - "
" - ], - "text/plain": [ - " root expiration strike right bid_size closebid ask_size closeask \\\n", - "0 AAPL 2026-08-21 210.0 P 30 7.00 24 7.15 \n", - "1 AAPL 2026-08-21 210.0 C 5 62.55 6 63.05 \n", - "2 AAPL 2025-10-24 215.0 C 173 43.95 160 45.20 \n", - "3 AAPL 2025-10-31 215.0 C 162 44.05 127 45.60 \n", - "4 AAPL 2025-10-24 215.0 P 0 0.00 6 0.01 \n", - "... ... ... ... ... ... ... ... ... \n", - "2341 AAPL 2028-01-21 200.0 C 7 86.80 7 87.75 \n", - "2342 AAPL 2026-05-15 210.0 P 32 4.65 23 4.75 \n", - "2343 AAPL 2026-05-15 210.0 C 15 58.35 8 58.95 \n", - "2344 AAPL 2026-06-18 210.0 C 2 59.90 4 60.30 \n", - "2345 AAPL 2026-06-18 210.0 P 27 5.40 19 5.55 \n", - "\n", - " date midpoint weighted_midpoint open_interest spread \\\n", - "0 20251023 7.075 7.066667 734.0 0.15 \n", - "1 20251023 62.800 62.822727 63.0 0.50 \n", - "2 20251023 44.575 44.550601 250.0 1.25 \n", - "3 20251023 44.825 44.731142 179.0 1.55 \n", - "4 20251023 0.005 0.010000 1639.0 0.01 \n", - "... ... ... ... ... ... \n", - "2341 20251023 87.275 87.275000 582.0 0.95 \n", - "2342 20251023 4.700 4.691818 1849.0 0.10 \n", - "2343 20251023 58.650 58.558696 1197.0 0.60 \n", - "2344 20251023 60.100 60.166667 5761.0 0.40 \n", - "2345 20251023 5.475 5.461957 7510.0 0.15 \n", - "\n", - " pct_spread dte \n", - "0 0.021201 20686 \n", - "1 0.007962 20685 \n", - "2 0.028043 20384 \n", - "3 0.034579 20391 \n", - "4 2.000000 20384 \n", - "... ... ... \n", - "2341 0.010885 21203 \n", - "2342 0.021277 20587 \n", - "2343 0.010230 20587 \n", - "2344 0.006656 20621 \n", - "2345 0.027397 20621 \n", - "\n", - "[2346 rows x 15 columns]" - ] - }, - "execution_count": 94, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "chain_lower_cols#.dte.min()" - ] - }, - { - "cell_type": "code", - "execution_count": 83, - "id": "b50d75fe", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'AAPL': [],\n", - " 'MSFT': [],\n", - " 'GOOGL': [],\n", - " 'AMZN': [],\n", - " 'TSLA': [],\n", - " 'NVDA': [],\n", - " 'JNJ': [],\n", - " 'V': [],\n", - " 'WMT': []}" - ] - }, - "execution_count": 83, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "orders" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "openbb_new_use", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.13" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/EventDriven/demos/test.ipynb b/EventDriven/demos/test.ipynb deleted file mode 100644 index e13d17c..0000000 --- a/EventDriven/demos/test.ipynb +++ /dev/null @@ -1,1367 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "from dotenv import load_dotenv\n", - "load_dotenv()\n", - "import os\n", - "import sys\n", - "sys.path.append(\n", - " os.environ.get('WORK_DIR'))\n", - "sys.path.append(\n", - " os.environ.get('DBASE_DIR'))\n", - "from dbase.DataAPI.ThetaData import *\n", - "from dbase.database.SQLHelpers import *\n", - "import pandas as pd\n", - "from data import HistoricTradeDataHandler\n", - "from event import *\n", - "# from strategy import OptionSignalStrategy\n", - "# from portfolio import OptionSignalPortfolio\n", - "from queue import Queue\n", - "from trade.backtester_.backtester_ import PTDataset, PTBacktester\n", - "import pandas_ta as ta\n", - "from trade.assets.Stock import Stock\n", - "from trade.backtester_.utils.WalkForwardUtils import prev_monday\n", - "from trade.backtester_.strats import BBandsTrend2\n", - "import yfinance as yf\n", - "\n", - "from datetime import datetime\n", - "from backtesting.backtesting import Strategy as BacktestingStrategy\n", - "%load_ext autoreload\n", - "%autoreload 2" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
rootexpirationstrikeright
0AAPL20240119260.0C
1AAPL20231117129.0P
2AAPL20241220145.0C
3AAPL20241220145.0P
4AAPL2024011980.0P
...............
1093AAPL20231124145.0P
1094AAPL20231215145.0P
1095AAPL20231215145.0C
1096AAPL20240216145.0P
1097AAPL20240216145.0C
\n", - "

1098 rows × 4 columns

\n", - "
" - ], - "text/plain": [ - " root expiration strike right\n", - "0 AAPL 20240119 260.0 C\n", - "1 AAPL 20231117 129.0 P\n", - "2 AAPL 20241220 145.0 C\n", - "3 AAPL 20241220 145.0 P\n", - "4 AAPL 20240119 80.0 P\n", - "... ... ... ... ...\n", - "1093 AAPL 20231124 145.0 P\n", - "1094 AAPL 20231215 145.0 P\n", - "1095 AAPL 20231215 145.0 C\n", - "1096 AAPL 20240216 145.0 P\n", - "1097 AAPL 20240216 145.0 C\n", - "\n", - "[1098 rows x 4 columns]" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "contracts = list_contracts('AAPL', '20231103')\n", - "contracts" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
ms_of_dayopenhighlowclosevolumecountdate
5522000007.807.807.807.801032023-10-02
11522000007.617.667.617.65552023-10-03
17522000007.908.357.908.25231162023-10-04
23522000009.159.208.989.051492023-10-05
295220000010.5710.8510.5010.85652023-10-06
355220000011.1011.4011.1011.203362023-10-09
415220000011.0411.0411.0411.04112023-10-10
475220000011.3011.3011.3011.30112023-10-11
535220000011.7312.2511.7312.21332023-10-12
595220000011.5011.8011.5011.801632023-10-13
65522000000.000.000.000.00002023-10-16
71522000009.509.509.509.50112023-10-17
77522000009.009.008.798.79222023-10-18
83522000008.458.508.348.34162102023-10-19
89522000006.807.006.606.6033112023-10-20
95522000006.406.556.266.262572023-10-23
101522000006.006.506.006.40126322023-10-24
107522000005.255.274.855.12135482023-10-25
113522000002.923.202.863.0023703182023-10-26
119522000002.863.102.752.9529443662023-10-27
125522000004.004.253.653.689912992023-10-30
131522000003.604.003.573.956532192023-10-31
137522000004.975.924.605.6718593782023-11-01
143522000008.108.458.008.15396852023-11-02
149522000005.786.435.705.93429972023-11-03
\n", - "
" - ], - "text/plain": [ - " ms_of_day open high low close volume count date\n", - "5 52200000 7.80 7.80 7.80 7.80 10 3 2023-10-02\n", - "11 52200000 7.61 7.66 7.61 7.65 5 5 2023-10-03\n", - "17 52200000 7.90 8.35 7.90 8.25 231 16 2023-10-04\n", - "23 52200000 9.15 9.20 8.98 9.05 14 9 2023-10-05\n", - "29 52200000 10.57 10.85 10.50 10.85 6 5 2023-10-06\n", - "35 52200000 11.10 11.40 11.10 11.20 33 6 2023-10-09\n", - "41 52200000 11.04 11.04 11.04 11.04 1 1 2023-10-10\n", - "47 52200000 11.30 11.30 11.30 11.30 1 1 2023-10-11\n", - "53 52200000 11.73 12.25 11.73 12.21 3 3 2023-10-12\n", - "59 52200000 11.50 11.80 11.50 11.80 16 3 2023-10-13\n", - "65 52200000 0.00 0.00 0.00 0.00 0 0 2023-10-16\n", - "71 52200000 9.50 9.50 9.50 9.50 1 1 2023-10-17\n", - "77 52200000 9.00 9.00 8.79 8.79 2 2 2023-10-18\n", - "83 52200000 8.45 8.50 8.34 8.34 162 10 2023-10-19\n", - "89 52200000 6.80 7.00 6.60 6.60 33 11 2023-10-20\n", - "95 52200000 6.40 6.55 6.26 6.26 25 7 2023-10-23\n", - "101 52200000 6.00 6.50 6.00 6.40 126 32 2023-10-24\n", - "107 52200000 5.25 5.27 4.85 5.12 135 48 2023-10-25\n", - "113 52200000 2.92 3.20 2.86 3.00 2370 318 2023-10-26\n", - "119 52200000 2.86 3.10 2.75 2.95 2944 366 2023-10-27\n", - "125 52200000 4.00 4.25 3.65 3.68 991 299 2023-10-30\n", - "131 52200000 3.60 4.00 3.57 3.95 653 219 2023-10-31\n", - "137 52200000 4.97 5.92 4.60 5.67 1859 378 2023-11-01\n", - "143 52200000 8.10 8.45 8.00 8.15 396 85 2023-11-02\n", - "149 52200000 5.78 6.43 5.70 5.93 429 97 2023-11-03" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "querystring = {\"root\":\"AAPL\",\"exp\":\"20231103\",\"strike\":\"170000\",\"right\":\"C\",\"start_date\":\"20231001\",\"end_date\":\"20231103\",\"ivl\":\"3600000\", \"use_csv\": \"true\"}\n", - "\n", - "option = retrieve_option_ohlc('AAPL', '20231103', 170.0, 'C', \"20231001\", \"20231103\")\n", - "option" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "date\n", - "-33 days 24\n", - "Name: date, dtype: int64\n" - ] - }, - { - "data": { - "text/plain": [ - "pandas.core.series.Series" - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "date = pd.to_datetime('2023-11-04')\n", - "closest_index = (option.index - date).to_series().abs().argsort()[:1]\n", - "print(closest_index)\n", - "closest = option.iloc[closest_index]\n", - "type(closest.iloc[0])" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "ms_of_day 52200000\n", - "open 7.8\n", - "high 7.8\n", - "low 7.8\n", - "close 7.8\n", - "volume 10\n", - "count 3\n", - "date 20231002\n", - "Name: 5, dtype: object" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "data = option.iloc[0]\n", - "data" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "780.0" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "data['close'] * 100" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n" - ] - } - ], - "source": [ - "import pandas as pd\n", - "\n", - "# Sample DataFrame with datetime\n", - "data = {'date': pd.to_datetime(['2023-10-01', '2023-10-10', '2023-10-20', '2023-10-30'])}\n", - "df = pd.DataFrame(data)\n", - "\n", - "# Target datetime\n", - "target = pd.to_datetime('2023-10-10')\n", - "\n", - "# Find the closest datetime\n", - "closest_row = df.iloc[(df['date'] - target).abs().argsort()[:1]].iloc[0]\n", - "\n", - "print(type(closest_row))" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "More rows with empty or 0.0 than valid data.\n", - "empty: 2\n", - "zero: 3\n", - "valid: 0\n" - ] - } - ], - "source": [ - "import pandas as pd\n", - "import numpy as np\n", - "\n", - "# Sample DataFrame\n", - "data = {\n", - " 'A': [1, 1.0, None, 3, 1.0],\n", - " 'B': [None, 1.0, 5, 0.0, 0.0],\n", - " 'C': [0.0, 7, 7, 7, 1]\n", - "}\n", - "df = pd.DataFrame(data)\n", - "\n", - "# Count rows with any empty (NaN) values\n", - "empty_rows = df.isnull().any(axis=1).sum()\n", - "\n", - "# Count rows where all values are 0.0\n", - "zero_rows = (df == 0.0).any(axis=1).sum()\n", - "\n", - "# Count valid rows (not empty and not all zeros)\n", - "valid_rows = len(df) - (empty_rows + zero_rows)\n", - "\n", - "# Compare counts\n", - "if (empty_rows + zero_rows) > valid_rows:\n", - " print(\"More rows with empty or 0.0 than valid data.\")\n", - "else:\n", - " print(\"More valid rows than empty or 0.0 rows.\")\n", - " \n", - "print('empty: ',empty_rows)\n", - "print('zero: ',zero_rows)\n", - "print('valid: ',valid_rows)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "lo = 0\n", - "lo += 1\n", - "lo" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n" - ] - } - ], - "source": [ - "import pandas as pd\n", - "\n", - "# Sample DataFrame with datetime as index\n", - "data = {'value': [1, 2, 3, 4]} # Sample data values for illustration\n", - "dates = pd.to_datetime(['2023-10-01', '2023-10-10', '2023-10-20', '2023-10-30'])\n", - "df = pd.DataFrame(data, index=dates)\n", - "\n", - "# Target datetime\n", - "target = pd.to_datetime('2023-10-15')\n", - "\n", - "# Find the closest datetime\n", - "closest_index = (df.index - target).to_series().abs().argsort()[:1]\n", - "closest_row = df.iloc[closest_index]\n", - "\n", - "print(type(closest_row.iloc[0]))" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [], - "source": [ - "import requests\n", - "from io import StringIO\n", - "def retrieve_option_ohlc_mod(symbol: str, exp:str, strike : float, right:str, start_date:str, end_date:str ): \n", - " \"\"\"\n", - " returns eod ohlc for all the days between start_date and end_date \n", - " Interval is default to 3600000\n", - " \"\"\"\n", - " strike = strike * 1000\n", - " strike = int(strike) if strike.is_integer() else strike\n", - " url = \"http://127.0.0.1:25510/v2/hist/option/ohlc\"\n", - " querystring = {\"end_date\": end_date, \"root\": symbol, \"use_csv\": \"true\", \"exp\": exp, \"ivl\": 3600000, \"right\": right, \"start_date\": start_date, \"strike\": strike}\n", - " headers = {\"Accept\": \"application/json\"}\n", - " response = requests.get(url, headers=headers, params=querystring)\n", - " if(__isSuccesful(response.status_code)): \n", - " data = pd.read_csv(StringIO(response.text))\n", - " if (len(data.columns)) > 1: \n", - " data['mean_volume'] = data.groupby('date')['volume'].transform('mean')\n", - " data = data.loc[data.groupby('date')['volume'].apply(lambda x: (x - x.mean()).abs().idxmin())]\n", - " data = data.drop_duplicates(subset='date', keep='last')\n", - " data = data.drop(columns=['mean_volume'])\n", - " data['date'] = pd.to_datetime(data['date'], format='%Y%m%d')\n", - " return data\n", - " else: \n", - " print('Error in retrieving data: ', data) \n", - " return f\"No data retrieved {response.status_code} {response.text}\"\n", - " else: \n", - " return f\"{response.status_code} {response.text}\"\n", - " \n", - "def __isSuccesful(status_code: int): \n", - " return status_code >= 200 and status_code < 300" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " ms_of_day open high low close volume count date\n", - "0 34200000 0.00 0.00 0.00 0.00 0 0 2024-02-07\n", - "6 34200000 0.00 0.00 0.00 0.00 0 0 2024-02-08\n", - "12 34200000 0.00 0.00 0.00 0.00 0 0 2024-02-09\n", - "18 34200000 9.12 9.12 9.12 9.12 2 1 2024-02-12\n", - "24 34200000 0.00 0.00 0.00 0.00 0 0 2024-02-13\n", - "30 34200000 0.00 0.00 0.00 0.00 0 0 2024-02-15\n", - "36 34200000 0.00 0.00 0.00 0.00 0 0 2024-02-16\n", - "43 37800000 0.00 0.00 0.00 0.00 0 0 2024-02-20\n", - "52 48600000 7.21 7.21 7.21 7.21 1 1 2024-02-21\n", - "56 41400000 8.87 8.87 8.87 8.87 1 1 2024-02-22\n", - "60 34200000 9.70 9.70 9.70 9.70 1 1 2024-02-23\n", - "67 37800000 9.65 9.65 9.47 9.47 2 2 2024-02-26\n", - "75 45000000 8.65 8.65 8.65 8.65 3 1 2024-02-27\n", - "79 37800000 0.00 0.00 0.00 0.00 0 0 2024-02-28\n", - "88 48600000 9.15 9.15 9.15 9.15 1 1 2024-02-29\n", - "95 52200000 10.45 10.45 10.45 10.45 1 1 2024-03-01\n", - "98 41400000 10.65 10.65 10.45 10.45 9 4 2024-03-04\n", - "103 37800000 9.05 9.05 9.05 9.05 1 1 2024-03-05\n", - "108 34200000 9.41 9.41 9.30 9.30 8 4 2024-03-06\n", - "114 34200000 8.90 9.30 8.90 9.30 7 6 2024-03-07\n", - "125 52200000 9.63 9.63 9.63 9.63 4 1 2024-03-08\n", - "126 34200000 0.00 0.00 0.00 0.00 0 0 2024-03-11\n", - "135 45000000 9.10 9.10 9.10 9.10 26 1 2024-03-12\n", - "139 37800000 0.00 0.00 0.00 0.00 0 0 2024-03-13\n", - "145 37800000 10.05 10.05 10.05 10.05 1 1 2024-03-14\n", - "150 34200000 9.50 9.50 9.50 9.50 3 1 2024-03-15\n", - "159 45000000 8.50 8.50 8.50 8.50 1 1 2024-03-18\n", - "163 37800000 8.62 8.62 8.60 8.60 6 2 2024-03-19\n", - "169 37800000 0.00 0.00 0.00 0.00 0 0 2024-03-20\n", - "176 41400000 10.00 10.00 10.00 10.00 1 1 2024-03-21\n", - "182 41400000 9.77 9.77 9.77 9.77 1 1 2024-03-22\n", - "188 41400000 10.25 10.25 10.25 10.25 1 1 2024-03-25\n", - "194 41400000 10.25 10.25 10.25 10.25 1 1 2024-03-26\n", - "199 37800000 9.45 9.45 9.43 9.45 3 3 2024-03-27\n", - "204 34200000 10.30 10.60 10.30 10.45 6 3 2024-03-28\n", - "211 37800000 10.00 10.00 10.00 10.00 2 1 2024-04-01\n", - "218 41400000 9.80 9.80 9.80 9.80 5 1 2024-04-02\n", - "225 45000000 10.95 10.95 10.95 10.95 2 1 2024-04-03\n", - "230 41400000 11.60 11.75 11.60 11.66 5 4 2024-04-04\n", - "238 48600000 12.47 12.47 12.47 12.47 10 1 2024-04-05\n", - "241 37800000 13.00 13.00 13.00 13.00 9 5 2024-04-08\n", - "249 45000000 12.10 12.10 12.10 12.10 10 6 2024-04-09\n", - "254 41400000 12.00 12.00 12.00 12.00 5 3 2024-04-10\n", - "260 41400000 13.00 13.32 13.00 13.32 9 4 2024-04-11\n", - "266 41400000 12.62 12.62 12.62 12.62 10 1 2024-04-12\n", - "273 45000000 12.65 12.65 12.65 12.65 15 1 2024-04-15\n", - "280 48600000 11.35 11.60 11.35 11.60 2 2 2024-04-16\n", - "282 34200000 11.60 11.60 11.40 11.40 2 2 2024-04-17\n", - "291 45000000 10.50 10.55 9.60 9.60 10 5 2024-04-18\n", - "299 52200000 7.70 7.80 7.70 7.80 11 4 2024-04-19\n", - "303 45000000 8.00 8.25 8.00 8.25 15 3 2024-04-22\n", - "308 41400000 8.85 8.85 8.65 8.65 6 2 2024-04-23\n", - "313 37800000 8.48 8.48 8.25 8.25 21 6 2024-04-24\n", - "321 45000000 6.75 6.80 6.75 6.80 7 2 2024-04-25\n", - "329 52200000 9.15 9.30 9.15 9.30 12 2 2024-04-26\n", - "330 34200000 10.50 10.55 9.52 10.00 14 8 2024-04-29\n", - "341 52200000 9.30 9.50 9.25 9.45 47 10 2024-04-30\n", - "343 37800000 8.37 8.37 8.00 8.00 37 12 2024-05-01\n", - "349 37800000 9.00 9.25 8.90 8.90 43 5 2024-05-02\n", - "354 34200000 11.05 11.05 10.55 10.65 35 20 2024-05-03\n", - "363 45000000 10.64 10.73 10.60 10.60 9 7 2024-05-06\n", - "370 48600000 11.45 11.45 11.20 11.20 3 3 2024-05-07\n", - "373 37800000 10.70 11.00 10.70 10.95 5 3 2024-05-08\n", - "379 37800000 11.50 11.95 11.50 11.95 49 6 2024-05-09\n", - "388 48600000 10.55 10.60 10.51 10.60 13 5 2024-05-10\n", - "393 45000000 9.47 9.73 9.47 9.73 14 4 2024-05-13\n", - "397 37800000 9.17 9.20 9.17 9.20 12 2 2024-05-14\n", - "407 52200000 8.60 8.75 8.60 8.75 11 2 2024-05-15\n", - "412 48600000 8.80 8.80 8.50 8.50 9 4 2024-05-16\n", - "415 37800000 8.70 8.75 8.70 8.75 30 9 2024-05-17\n", - "420 34200000 8.80 9.20 8.46 8.46 33 12 2024-05-20\n", - "427 37800000 7.00 7.10 6.85 6.86 22 6 2024-05-21\n", - "432 34200000 8.00 8.22 7.85 7.90 12 7 2024-05-22\n", - "440 41400000 7.70 7.70 7.60 7.60 10 2 2024-05-23\n", - "446 41400000 7.01 7.07 6.98 7.05 54 12 2024-05-24\n" - ] - } - ], - "source": [ - "option = retrieve_option_ohlc_mod('AMZN', '20241018', 200.0, 'C', \"20230304\", \"20240524\")\n", - "pd.set_option('display.max_rows', None) # Show all rows\n", - "pd.set_option('display.max_columns', None) # Show all columns\n", - "pd.set_option('display.expand_frame_repr', False) # Prevent line wrapping\n", - "print(option)" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " ms_of_day open high low close volume count date\n", - "0 34200000 0.00 0.00 0.00 0.00 0 0 2024-02-07\n", - "1 37800000 0.00 0.00 0.00 0.00 0 0 2024-02-07\n", - "2 41400000 0.00 0.00 0.00 0.00 0 0 2024-02-07\n", - "3 45000000 0.00 0.00 0.00 0.00 0 0 2024-02-07\n", - "4 48600000 7.52 7.52 7.52 7.52 10 1 2024-02-07\n", - "5 52200000 0.00 0.00 0.00 0.00 0 0 2024-02-07\n", - "6 34200000 0.00 0.00 0.00 0.00 0 0 2024-02-08\n", - "7 37800000 7.80 7.80 7.80 7.80 2 1 2024-02-08\n", - "8 41400000 0.00 0.00 0.00 0.00 0 0 2024-02-08\n", - "9 45000000 0.00 0.00 0.00 0.00 0 0 2024-02-08\n", - "10 48600000 0.00 0.00 0.00 0.00 0 0 2024-02-08\n", - "11 52200000 0.00 0.00 0.00 0.00 0 0 2024-02-08\n", - "12 34200000 0.00 0.00 0.00 0.00 0 0 2024-02-09\n", - "13 37800000 0.00 0.00 0.00 0.00 0 0 2024-02-09\n", - "14 41400000 0.00 0.00 0.00 0.00 0 0 2024-02-09\n", - "15 45000000 9.10 9.10 9.10 9.10 1 1 2024-02-09\n", - "16 48600000 0.00 0.00 0.00 0.00 0 0 2024-02-09\n", - "17 52200000 0.00 0.00 0.00 0.00 0 0 2024-02-09\n", - "18 34200000 9.12 9.12 9.12 9.12 2 1 2024-02-12\n", - "19 37800000 0.00 0.00 0.00 0.00 0 0 2024-02-12\n", - "20 41400000 0.00 0.00 0.00 0.00 0 0 2024-02-12\n", - "21 45000000 0.00 0.00 0.00 0.00 0 0 2024-02-12\n", - "22 48600000 8.50 8.50 8.50 8.50 3 1 2024-02-12\n", - "23 52200000 8.35 8.42 8.35 8.42 4 2 2024-02-12\n", - "24 34200000 0.00 0.00 0.00 0.00 0 0 2024-02-13\n", - "25 37800000 8.15 8.15 8.15 8.15 2 1 2024-02-13\n", - "26 41400000 0.00 0.00 0.00 0.00 0 0 2024-02-13\n", - "27 45000000 0.00 0.00 0.00 0.00 0 0 2024-02-13\n", - "28 48600000 0.00 0.00 0.00 0.00 0 0 2024-02-13\n", - "29 52200000 7.47 7.47 7.40 7.40 2 2 2024-02-13\n", - "30 34200000 0.00 0.00 0.00 0.00 0 0 2024-02-15\n", - "31 37800000 0.00 0.00 0.00 0.00 0 0 2024-02-15\n", - "32 41400000 0.00 0.00 0.00 0.00 0 0 2024-02-15\n", - "33 45000000 0.00 0.00 0.00 0.00 0 0 2024-02-15\n", - "34 48600000 0.00 0.00 0.00 0.00 0 0 2024-02-15\n", - "35 52200000 7.70 7.70 7.70 7.70 3 1 2024-02-15\n", - "36 34200000 0.00 0.00 0.00 0.00 0 0 2024-02-16\n", - "37 37800000 0.00 0.00 0.00 0.00 0 0 2024-02-16\n", - "38 41400000 0.00 0.00 0.00 0.00 0 0 2024-02-16\n", - "39 45000000 7.72 7.72 7.72 7.72 1 1 2024-02-16\n", - "40 48600000 0.00 0.00 0.00 0.00 0 0 2024-02-16\n", - "41 52200000 0.00 0.00 0.00 0.00 0 0 2024-02-16\n", - "42 34200000 6.80 6.80 6.80 6.80 1 1 2024-02-20\n", - "43 37800000 0.00 0.00 0.00 0.00 0 0 2024-02-20\n", - "44 41400000 0.00 0.00 0.00 0.00 0 0 2024-02-20\n", - "45 45000000 0.00 0.00 0.00 0.00 0 0 2024-02-20\n", - "46 48600000 0.00 0.00 0.00 0.00 0 0 2024-02-20\n", - "47 52200000 0.00 0.00 0.00 0.00 0 0 2024-02-20\n", - "48 34200000 7.50 7.64 7.10 7.10 7 5 2024-02-21\n", - "49 37800000 0.00 0.00 0.00 0.00 0 0 2024-02-21\n", - "50 41400000 0.00 0.00 0.00 0.00 0 0 2024-02-21\n", - "51 45000000 0.00 0.00 0.00 0.00 0 0 2024-02-21\n", - "52 48600000 7.21 7.21 7.21 7.21 1 1 2024-02-21\n", - "53 52200000 0.00 0.00 0.00 0.00 0 0 2024-02-21\n", - "54 34200000 8.50 8.50 8.45 8.45 6 3 2024-02-22\n", - "55 37800000 0.00 0.00 0.00 0.00 0 0 2024-02-22\n", - "56 41400000 8.87 8.87 8.87 8.87 1 1 2024-02-22\n", - "57 45000000 9.00 9.00 9.00 9.00 6 2 2024-02-22\n", - "58 48600000 0.00 0.00 0.00 0.00 0 0 2024-02-22\n", - "59 52200000 9.32 9.32 9.32 9.32 5 3 2024-02-22\n", - "60 34200000 9.70 9.70 9.70 9.70 1 1 2024-02-23\n", - "61 37800000 0.00 0.00 0.00 0.00 0 0 2024-02-23\n", - "62 41400000 9.45 9.45 9.35 9.35 4 2 2024-02-23\n", - "63 45000000 0.00 0.00 0.00 0.00 0 0 2024-02-23\n", - "64 48600000 0.00 0.00 0.00 0.00 0 0 2024-02-23\n", - "65 52200000 9.20 9.20 9.20 9.20 1 1 2024-02-23\n", - "66 34200000 9.55 9.70 9.45 9.69 9 5 2024-02-26\n", - "67 37800000 9.65 9.65 9.47 9.47 2 2 2024-02-26\n", - "68 41400000 9.55 9.55 9.55 9.55 1 1 2024-02-26\n", - "69 45000000 0.00 0.00 0.00 0.00 0 0 2024-02-26\n", - "70 48600000 0.00 0.00 0.00 0.00 0 0 2024-02-26\n", - "71 52200000 0.00 0.00 0.00 0.00 0 0 2024-02-26\n", - "72 34200000 9.11 9.15 8.90 8.90 4 4 2024-02-27\n", - "73 37800000 0.00 0.00 0.00 0.00 0 0 2024-02-27\n", - "74 41400000 8.98 8.98 8.98 8.98 6 1 2024-02-27\n", - "75 45000000 8.65 8.65 8.65 8.65 3 1 2024-02-27\n", - "76 48600000 0.00 0.00 0.00 0.00 0 0 2024-02-27\n", - "77 52200000 0.00 0.00 0.00 0.00 0 0 2024-02-27\n", - "78 34200000 8.60 8.60 8.60 8.60 1 1 2024-02-28\n", - "79 37800000 0.00 0.00 0.00 0.00 0 0 2024-02-28\n", - "80 41400000 0.00 0.00 0.00 0.00 0 0 2024-02-28\n", - "81 45000000 0.00 0.00 0.00 0.00 0 0 2024-02-28\n", - "82 48600000 0.00 0.00 0.00 0.00 0 0 2024-02-28\n", - "83 52200000 0.00 0.00 0.00 0.00 0 0 2024-02-28\n", - "84 34200000 8.51 9.20 8.51 9.10 10 4 2024-02-29\n", - "85 37800000 0.00 0.00 0.00 0.00 0 0 2024-02-29\n", - "86 41400000 0.00 0.00 0.00 0.00 0 0 2024-02-29\n", - "87 45000000 0.00 0.00 0.00 0.00 0 0 2024-02-29\n", - "88 48600000 9.15 9.15 9.15 9.15 1 1 2024-02-29\n", - "89 52200000 0.00 0.00 0.00 0.00 0 0 2024-02-29\n", - "90 34200000 9.75 9.91 9.75 9.91 8 4 2024-03-01\n", - "91 37800000 0.00 0.00 0.00 0.00 0 0 2024-03-01\n", - "92 41400000 0.00 0.00 0.00 0.00 0 0 2024-03-01\n", - "93 45000000 0.00 0.00 0.00 0.00 0 0 2024-03-01\n", - "94 48600000 10.50 10.55 10.50 10.55 6 2 2024-03-01\n", - "95 52200000 10.45 10.45 10.45 10.45 1 1 2024-03-01\n", - "96 34200000 10.72 10.94 10.72 10.94 16 5 2024-03-04\n", - "97 37800000 11.15 11.15 10.90 10.90 4 4 2024-03-04\n", - "98 41400000 10.65 10.65 10.45 10.45 9 4 2024-03-04\n", - "99 45000000 0.00 0.00 0.00 0.00 0 0 2024-03-04\n", - "100 48600000 0.00 0.00 0.00 0.00 0 0 2024-03-04\n", - "101 52200000 10.45 10.45 10.45 10.45 40 1 2024-03-04\n", - "102 34200000 9.36 9.58 9.36 9.58 10 3 2024-03-05\n", - "103 37800000 9.05 9.05 9.05 9.05 1 1 2024-03-05\n", - "104 41400000 0.00 0.00 0.00 0.00 0 0 2024-03-05\n", - "105 45000000 8.85 8.85 8.85 8.85 14 6 2024-03-05\n", - "106 48600000 0.00 0.00 0.00 0.00 0 0 2024-03-05\n", - "107 52200000 8.76 8.76 8.76 8.76 1 1 2024-03-05\n", - "108 34200000 9.41 9.41 9.30 9.30 8 4 2024-03-06\n", - "109 37800000 8.95 8.95 8.95 8.95 25 3 2024-03-06\n", - "110 41400000 0.00 0.00 0.00 0.00 0 0 2024-03-06\n", - "111 45000000 0.00 0.00 0.00 0.00 0 0 2024-03-06\n", - "112 48600000 0.00 0.00 0.00 0.00 0 0 2024-03-06\n", - "113 52200000 0.00 0.00 0.00 0.00 0 0 2024-03-06\n", - "114 34200000 8.90 9.30 8.90 9.30 7 6 2024-03-07\n", - "115 37800000 0.00 0.00 0.00 0.00 0 0 2024-03-07\n", - "116 41400000 0.00 0.00 0.00 0.00 0 0 2024-03-07\n", - "117 45000000 9.90 10.00 9.90 10.00 9 3 2024-03-07\n", - "118 48600000 10.45 10.45 10.45 10.45 20 1 2024-03-07\n", - "119 52200000 10.00 10.00 10.00 10.00 1 1 2024-03-07\n", - "120 34200000 9.99 9.99 9.99 9.99 2 1 2024-03-08\n", - "121 37800000 0.00 0.00 0.00 0.00 0 0 2024-03-08\n", - "122 41400000 10.00 10.00 10.00 10.00 40 9 2024-03-08\n", - "123 45000000 0.00 0.00 0.00 0.00 0 0 2024-03-08\n", - "124 48600000 0.00 0.00 0.00 0.00 0 0 2024-03-08\n", - "125 52200000 9.63 9.63 9.63 9.63 4 1 2024-03-08\n", - "126 34200000 0.00 0.00 0.00 0.00 0 0 2024-03-11\n", - "127 37800000 0.00 0.00 0.00 0.00 0 0 2024-03-11\n", - "128 41400000 8.26 8.26 8.26 8.26 1 1 2024-03-11\n", - "129 45000000 0.00 0.00 0.00 0.00 0 0 2024-03-11\n", - "130 48600000 0.00 0.00 0.00 0.00 0 0 2024-03-11\n", - "131 52200000 8.09 8.09 8.09 8.09 2 1 2024-03-11\n", - "132 34200000 8.05 8.81 8.05 8.81 208 50 2024-03-12\n", - "133 37800000 9.35 9.35 9.35 9.35 1 1 2024-03-12\n", - "134 41400000 9.35 9.35 9.28 9.28 20 12 2024-03-12\n", - "135 45000000 9.10 9.10 9.10 9.10 26 1 2024-03-12\n", - "136 48600000 0.00 0.00 0.00 0.00 0 0 2024-03-12\n", - "137 52200000 9.00 9.00 9.00 9.00 15 3 2024-03-12\n", - "138 34200000 9.08 9.08 9.08 9.08 5 1 2024-03-13\n", - "139 37800000 0.00 0.00 0.00 0.00 0 0 2024-03-13\n", - "140 41400000 0.00 0.00 0.00 0.00 0 0 2024-03-13\n", - "141 45000000 0.00 0.00 0.00 0.00 0 0 2024-03-13\n", - "142 48600000 9.80 9.80 9.80 9.80 5 2 2024-03-13\n", - "143 52200000 0.00 0.00 0.00 0.00 0 0 2024-03-13\n", - "144 34200000 9.51 9.98 9.50 9.98 32 9 2024-03-14\n", - "145 37800000 10.05 10.05 10.05 10.05 1 1 2024-03-14\n", - "146 41400000 9.77 9.77 9.77 9.77 20 1 2024-03-14\n", - "147 45000000 0.00 0.00 0.00 0.00 0 0 2024-03-14\n", - "148 48600000 0.00 0.00 0.00 0.00 0 0 2024-03-14\n", - "149 52200000 10.33 10.33 10.33 10.33 1 1 2024-03-14\n", - "150 34200000 9.50 9.50 9.50 9.50 3 1 2024-03-15\n", - "151 37800000 9.20 9.20 9.05 9.05 5 2 2024-03-15\n", - "152 41400000 0.00 0.00 0.00 0.00 0 0 2024-03-15\n", - "153 45000000 8.59 8.59 8.59 8.59 1 1 2024-03-15\n", - "154 48600000 0.00 0.00 0.00 0.00 0 0 2024-03-15\n", - "155 52200000 8.90 8.90 8.85 8.85 10 6 2024-03-15\n", - "156 34200000 0.00 0.00 0.00 0.00 0 0 2024-03-18\n", - "157 37800000 9.21 9.32 9.21 9.32 13 7 2024-03-18\n", - "158 41400000 8.60 8.60 8.60 8.60 9 5 2024-03-18\n", - "159 45000000 8.50 8.50 8.50 8.50 1 1 2024-03-18\n", - "160 48600000 0.00 0.00 0.00 0.00 0 0 2024-03-18\n", - "161 52200000 0.00 0.00 0.00 0.00 0 0 2024-03-18\n", - "162 34200000 0.00 0.00 0.00 0.00 0 0 2024-03-19\n", - "163 37800000 8.62 8.62 8.60 8.60 6 2 2024-03-19\n", - "164 41400000 0.00 0.00 0.00 0.00 0 0 2024-03-19\n", - "165 45000000 0.00 0.00 0.00 0.00 0 0 2024-03-19\n", - "166 48600000 0.00 0.00 0.00 0.00 0 0 2024-03-19\n", - "167 52200000 8.50 8.50 8.50 8.50 24 10 2024-03-19\n", - "168 34200000 8.79 8.79 8.48 8.48 20 6 2024-03-20\n", - "169 37800000 0.00 0.00 0.00 0.00 0 0 2024-03-20\n", - "170 41400000 0.00 0.00 0.00 0.00 0 0 2024-03-20\n", - "171 45000000 0.00 0.00 0.00 0.00 0 0 2024-03-20\n", - "172 48600000 0.00 0.00 0.00 0.00 0 0 2024-03-20\n", - "173 52200000 9.05 9.05 9.05 9.05 16 2 2024-03-20\n", - "174 34200000 10.21 10.35 10.21 10.35 45 9 2024-03-21\n", - "175 37800000 0.00 0.00 0.00 0.00 0 0 2024-03-21\n", - "176 41400000 10.00 10.00 10.00 10.00 1 1 2024-03-21\n", - "177 45000000 0.00 0.00 0.00 0.00 0 0 2024-03-21\n", - "178 48600000 0.00 0.00 0.00 0.00 0 0 2024-03-21\n", - "179 52200000 0.00 0.00 0.00 0.00 0 0 2024-03-21\n", - "180 34200000 0.00 0.00 0.00 0.00 0 0 2024-03-22\n", - "181 37800000 9.55 9.56 9.55 9.56 3 3 2024-03-22\n", - "182 41400000 9.77 9.77 9.77 9.77 1 1 2024-03-22\n", - "183 45000000 0.00 0.00 0.00 0.00 0 0 2024-03-22\n", - "184 48600000 0.00 0.00 0.00 0.00 0 0 2024-03-22\n", - "185 52200000 0.00 0.00 0.00 0.00 0 0 2024-03-22\n", - "186 34200000 9.40 10.70 9.40 10.70 6 3 2024-03-25\n", - "187 37800000 10.39 10.40 10.15 10.15 6 6 2024-03-25\n", - "188 41400000 10.25 10.25 10.25 10.25 1 1 2024-03-25\n", - "189 45000000 0.00 0.00 0.00 0.00 0 0 2024-03-25\n", - "190 48600000 0.00 0.00 0.00 0.00 0 0 2024-03-25\n", - "191 52200000 0.00 0.00 0.00 0.00 0 0 2024-03-25\n", - "192 34200000 10.30 10.30 9.90 10.07 15 6 2024-03-26\n", - "193 37800000 0.00 0.00 0.00 0.00 0 0 2024-03-26\n", - "194 41400000 10.25 10.25 10.25 10.25 1 1 2024-03-26\n", - "195 45000000 0.00 0.00 0.00 0.00 0 0 2024-03-26\n", - "196 48600000 10.10 10.10 10.10 10.10 1 1 2024-03-26\n", - "197 52200000 0.00 0.00 0.00 0.00 0 0 2024-03-26\n", - "198 34200000 10.10 10.10 10.10 10.10 2 1 2024-03-27\n", - "199 37800000 9.45 9.45 9.43 9.45 3 3 2024-03-27\n", - "200 41400000 0.00 0.00 0.00 0.00 0 0 2024-03-27\n", - "201 45000000 0.00 0.00 0.00 0.00 0 0 2024-03-27\n", - "202 48600000 0.00 0.00 0.00 0.00 0 0 2024-03-27\n", - "203 52200000 9.60 9.60 9.42 9.42 28 2 2024-03-27\n", - "204 34200000 10.30 10.60 10.30 10.45 6 3 2024-03-28\n", - "205 37800000 10.40 10.40 10.40 10.40 5 2 2024-03-28\n", - "206 41400000 10.52 10.52 10.15 10.15 10 3 2024-03-28\n", - "207 45000000 10.05 10.05 10.05 10.05 2 1 2024-03-28\n", - "208 48600000 10.20 10.20 10.10 10.10 8 3 2024-03-28\n", - "209 52200000 10.05 10.20 10.05 10.14 7 6 2024-03-28\n", - "210 34200000 10.88 10.88 10.15 10.15 7 4 2024-04-01\n", - "211 37800000 10.00 10.00 10.00 10.00 2 1 2024-04-01\n", - "212 41400000 10.18 10.18 10.18 10.18 3 3 2024-04-01\n", - "213 45000000 10.14 10.14 10.14 10.14 2 2 2024-04-01\n", - "214 48600000 10.02 10.02 10.02 10.02 1 1 2024-04-01\n", - "215 52200000 0.00 0.00 0.00 0.00 0 0 2024-04-01\n", - "216 34200000 9.70 9.80 9.60 9.63 11 5 2024-04-02\n", - "217 37800000 9.74 9.74 9.74 9.74 1 1 2024-04-02\n", - "218 41400000 9.80 9.80 9.80 9.80 5 1 2024-04-02\n", - "219 45000000 10.10 10.16 10.10 10.16 7 3 2024-04-02\n", - "220 48600000 0.00 0.00 0.00 0.00 0 0 2024-04-02\n", - "221 52200000 10.15 10.15 10.15 10.15 1 1 2024-04-02\n", - "222 34200000 10.65 10.65 10.60 10.60 3 3 2024-04-03\n", - "223 37800000 0.00 0.00 0.00 0.00 0 0 2024-04-03\n", - "224 41400000 10.93 10.93 10.80 10.80 3 3 2024-04-03\n", - "225 45000000 10.95 10.95 10.95 10.95 2 1 2024-04-03\n", - "226 48600000 0.00 0.00 0.00 0.00 0 0 2024-04-03\n", - "227 52200000 11.00 11.00 10.90 10.90 6 4 2024-04-03\n", - "228 34200000 11.45 11.45 11.35 11.40 51 7 2024-04-04\n", - "229 37800000 0.00 0.00 0.00 0.00 0 0 2024-04-04\n", - "230 41400000 11.60 11.75 11.60 11.66 5 4 2024-04-04\n", - "231 45000000 11.75 11.75 11.75 11.75 3 2 2024-04-04\n", - "232 48600000 0.00 0.00 0.00 0.00 0 0 2024-04-04\n", - "233 52200000 10.51 10.55 10.51 10.55 5 3 2024-04-04\n", - "234 34200000 11.45 12.20 11.45 12.20 38 9 2024-04-05\n", - "235 37800000 11.86 12.30 11.86 12.20 5 4 2024-04-05\n", - "236 41400000 12.33 12.50 12.33 12.50 52 3 2024-04-05\n", - "237 45000000 12.40 12.40 12.40 12.40 1 1 2024-04-05\n", - "238 48600000 12.47 12.47 12.47 12.47 10 1 2024-04-05\n", - "239 52200000 12.10 12.10 12.01 12.01 3 2 2024-04-05\n", - "240 34200000 13.05 13.20 12.60 12.60 27 8 2024-04-08\n", - "241 37800000 13.00 13.00 13.00 13.00 9 5 2024-04-08\n", - "242 41400000 12.24 12.24 12.24 12.24 9 1 2024-04-08\n", - "243 45000000 12.35 12.35 12.35 12.35 10 3 2024-04-08\n", - "244 48600000 0.00 0.00 0.00 0.00 0 0 2024-04-08\n", - "245 52200000 0.00 0.00 0.00 0.00 0 0 2024-04-08\n", - "246 34200000 12.56 12.56 12.30 12.49 11 3 2024-04-09\n", - "247 37800000 12.38 12.44 12.38 12.44 5 4 2024-04-09\n", - "248 41400000 0.00 0.00 0.00 0.00 0 0 2024-04-09\n", - "249 45000000 12.10 12.10 12.10 12.10 10 6 2024-04-09\n", - "250 48600000 0.00 0.00 0.00 0.00 0 0 2024-04-09\n", - "251 52200000 11.60 12.15 11.60 12.15 22 6 2024-04-09\n", - "252 34200000 11.50 12.00 11.50 12.00 18 11 2024-04-10\n", - "253 37800000 11.85 12.03 11.84 12.03 32 6 2024-04-10\n", - "254 41400000 12.00 12.00 12.00 12.00 5 3 2024-04-10\n", - "255 45000000 0.00 0.00 0.00 0.00 0 0 2024-04-10\n", - "256 48600000 12.10 12.10 12.10 12.10 2 2 2024-04-10\n", - "257 52200000 0.00 0.00 0.00 0.00 0 0 2024-04-10\n", - "258 34200000 12.50 12.50 12.50 12.50 5 3 2024-04-11\n", - "259 37800000 12.70 12.70 12.70 12.70 2 2 2024-04-11\n", - "260 41400000 13.00 13.32 13.00 13.32 9 4 2024-04-11\n", - "261 45000000 13.22 13.95 13.22 13.80 8 7 2024-04-11\n", - "262 48600000 13.73 13.73 13.65 13.65 77 5 2024-04-11\n", - "263 52200000 13.89 13.97 13.89 13.95 4 4 2024-04-11\n", - "264 34200000 0.00 0.00 0.00 0.00 0 0 2024-04-12\n", - "265 37800000 13.15 13.15 12.90 12.90 21 7 2024-04-12\n", - "266 41400000 12.62 12.62 12.62 12.62 10 1 2024-04-12\n", - "267 45000000 12.65 12.70 12.50 12.50 28 11 2024-04-12\n", - "268 48600000 12.45 12.45 12.45 12.45 5 3 2024-04-12\n", - "269 52200000 12.42 12.42 12.39 12.39 6 2 2024-04-12\n", - "270 34200000 13.17 13.17 13.11 13.11 50 6 2024-04-15\n", - "271 37800000 13.15 13.15 13.15 13.15 1 1 2024-04-15\n", - "272 41400000 0.00 0.00 0.00 0.00 0 0 2024-04-15\n", - "273 45000000 12.65 12.65 12.65 12.65 15 1 2024-04-15\n", - "274 48600000 11.70 11.70 11.54 11.54 9 3 2024-04-15\n", - "275 52200000 11.70 11.75 11.70 11.75 41 13 2024-04-15\n", - "276 34200000 11.15 11.15 11.15 11.15 4 1 2024-04-16\n", - "277 37800000 11.66 11.66 11.66 11.66 1 1 2024-04-16\n", - "278 41400000 0.00 0.00 0.00 0.00 0 0 2024-04-16\n", - "279 45000000 0.00 0.00 0.00 0.00 0 0 2024-04-16\n", - "280 48600000 11.35 11.60 11.35 11.60 2 2 2024-04-16\n", - "281 52200000 11.58 11.58 11.54 11.54 10 2 2024-04-16\n", - "282 34200000 11.60 11.60 11.40 11.40 2 2 2024-04-17\n", - "283 37800000 0.00 0.00 0.00 0.00 0 0 2024-04-17\n", - "284 41400000 0.00 0.00 0.00 0.00 0 0 2024-04-17\n", - "285 45000000 10.45 10.45 10.10 10.35 11 6 2024-04-17\n", - "286 48600000 10.65 10.65 10.60 10.60 2 2 2024-04-17\n", - "287 52200000 10.65 10.65 10.45 10.45 2 2 2024-04-17\n", - "288 34200000 10.00 10.25 10.00 10.25 3 2 2024-04-18\n", - "289 37800000 10.45 10.45 10.45 10.45 1 1 2024-04-18\n", - "290 41400000 10.50 10.50 10.50 10.50 2 2 2024-04-18\n", - "291 45000000 10.50 10.55 9.60 9.60 10 5 2024-04-18\n", - "292 48600000 9.65 9.65 9.65 9.65 5 4 2024-04-18\n", - "293 52200000 9.60 9.75 9.60 9.75 66 19 2024-04-18\n", - "294 34200000 8.85 8.90 8.85 8.90 14 5 2024-04-19\n", - "295 37800000 8.20 8.45 8.20 8.33 15 4 2024-04-19\n", - "296 41400000 8.40 8.40 7.77 7.77 14 5 2024-04-19\n", - "297 45000000 7.75 7.95 7.70 7.95 4 4 2024-04-19\n", - "298 48600000 7.90 7.90 7.90 7.90 1 1 2024-04-19\n", - "299 52200000 7.70 7.80 7.70 7.80 11 4 2024-04-19\n", - "300 34200000 8.59 9.11 8.35 8.35 95 24 2024-04-22\n", - "301 37800000 7.85 7.85 7.55 7.71 49 9 2024-04-22\n", - "302 41400000 0.00 0.00 0.00 0.00 0 0 2024-04-22\n", - "303 45000000 8.00 8.25 8.00 8.25 15 3 2024-04-22\n", - "304 48600000 8.32 8.57 8.32 8.57 5 2 2024-04-22\n", - "305 52200000 8.70 8.70 8.70 8.70 1 1 2024-04-22\n", - "306 34200000 8.42 8.45 8.19 8.19 46 4 2024-04-23\n", - "307 37800000 8.48 8.48 8.48 8.48 2 1 2024-04-23\n", - "308 41400000 8.85 8.85 8.65 8.65 6 2 2024-04-23\n", - "309 45000000 8.90 8.90 8.80 8.80 4 3 2024-04-23\n", - "310 48600000 9.05 9.05 8.98 8.98 25 3 2024-04-23\n", - "311 52200000 9.10 9.10 9.10 9.10 1 1 2024-04-23\n", - "312 34200000 0.00 0.00 0.00 0.00 0 0 2024-04-24\n", - "313 37800000 8.48 8.48 8.25 8.25 21 6 2024-04-24\n", - "314 41400000 8.00 8.10 8.00 8.10 124 29 2024-04-24\n", - "315 45000000 0.00 0.00 0.00 0.00 0 0 2024-04-24\n", - "316 48600000 8.30 8.30 8.30 8.30 10 3 2024-04-24\n", - "317 52200000 7.85 8.05 7.85 8.05 14 4 2024-04-24\n", - "318 34200000 5.60 6.52 5.60 6.51 15 10 2024-04-25\n", - "319 37800000 0.00 0.00 0.00 0.00 0 0 2024-04-25\n", - "320 41400000 6.30 6.70 6.30 6.70 15 7 2024-04-25\n", - "321 45000000 6.75 6.80 6.75 6.80 7 2 2024-04-25\n", - "322 48600000 6.95 6.95 6.95 6.95 2 2 2024-04-25\n", - "323 52200000 7.10 7.10 7.10 7.10 1 1 2024-04-25\n", - "324 34200000 8.55 8.55 8.15 8.41 22 7 2024-04-26\n", - "325 37800000 8.60 8.60 8.60 8.60 1 1 2024-04-26\n", - "326 41400000 9.20 9.24 9.20 9.24 11 2 2024-04-26\n", - "327 45000000 9.45 9.63 9.45 9.63 5 3 2024-04-26\n", - "328 48600000 9.40 9.50 9.12 9.12 34 7 2024-04-26\n", - "329 52200000 9.15 9.30 9.15 9.30 12 2 2024-04-26\n", - "330 34200000 10.50 10.55 9.52 10.00 14 8 2024-04-29\n", - "331 37800000 9.90 9.97 9.90 9.97 4 3 2024-04-29\n", - "332 41400000 9.61 9.61 9.55 9.55 13 2 2024-04-29\n", - "333 45000000 9.90 9.95 9.85 9.85 72 14 2024-04-29\n", - "334 48600000 10.00 10.00 9.90 9.90 7 4 2024-04-29\n", - "335 52200000 9.65 9.80 9.65 9.80 4 4 2024-04-29\n", - "336 34200000 10.10 10.60 10.02 10.09 132 50 2024-04-30\n", - "337 37800000 9.96 10.05 9.60 9.60 28 6 2024-04-30\n", - "338 41400000 9.30 9.30 9.20 9.20 4 2 2024-04-30\n", - "339 45000000 9.15 9.50 9.15 9.50 65 28 2024-04-30\n", - "340 48600000 9.51 9.61 9.51 9.61 8 3 2024-04-30\n", - "341 52200000 9.30 9.50 9.25 9.45 47 10 2024-04-30\n", - "342 34200000 7.75 8.70 7.75 8.35 33 11 2024-05-01\n", - "343 37800000 8.37 8.37 8.00 8.00 37 12 2024-05-01\n", - "344 41400000 7.88 7.88 7.30 7.40 53 7 2024-05-01\n", - "345 45000000 7.40 7.83 7.40 7.83 16 4 2024-05-01\n", - "346 48600000 7.76 8.30 7.76 8.30 42 5 2024-05-01\n", - "347 52200000 8.68 10.45 8.68 10.01 34 11 2024-05-01\n", - "348 34200000 8.39 9.23 8.39 9.00 130 15 2024-05-02\n", - "349 37800000 9.00 9.25 8.90 8.90 43 5 2024-05-02\n", - "350 41400000 9.10 9.10 9.00 9.00 23 2 2024-05-02\n", - "351 45000000 0.00 0.00 0.00 0.00 0 0 2024-05-02\n", - "352 48600000 9.90 9.90 9.90 9.90 1 1 2024-05-02\n", - "353 52200000 10.25 10.25 10.15 10.15 3 2 2024-05-02\n", - "354 34200000 11.05 11.05 10.55 10.65 35 20 2024-05-03\n", - "355 37800000 11.10 11.55 10.80 10.85 196 45 2024-05-03\n", - "356 41400000 11.00 11.00 11.00 11.00 9 2 2024-05-03\n", - "357 45000000 10.83 10.83 10.83 10.83 2 1 2024-05-03\n", - "358 48600000 10.82 10.82 10.82 10.82 3 1 2024-05-03\n", - "359 52200000 10.80 10.80 10.80 10.80 21 2 2024-05-03\n", - "360 34200000 10.65 10.65 10.15 10.25 29 9 2024-05-06\n", - "361 37800000 10.60 10.65 10.60 10.65 7 2 2024-05-06\n", - "362 41400000 10.90 10.90 10.90 10.90 1 1 2024-05-06\n", - "363 45000000 10.64 10.73 10.60 10.60 9 7 2024-05-06\n", - "364 48600000 10.75 10.75 10.75 10.75 2 1 2024-05-06\n", - "365 52200000 10.96 11.07 10.96 10.96 12 4 2024-05-06\n", - "366 34200000 11.50 11.55 11.48 11.48 19 5 2024-05-07\n", - "367 37800000 11.60 11.60 11.60 11.60 1 1 2024-05-07\n", - "368 41400000 11.65 11.65 11.65 11.65 1 1 2024-05-07\n", - "369 45000000 11.55 11.55 11.55 11.55 2 1 2024-05-07\n", - "370 48600000 11.45 11.45 11.20 11.20 3 3 2024-05-07\n", - "371 52200000 11.10 11.24 11.10 11.24 2 2 2024-05-07\n", - "372 34200000 10.55 10.75 10.55 10.75 11 2 2024-05-08\n", - "373 37800000 10.70 11.00 10.70 10.95 5 3 2024-05-08\n", - "374 41400000 0.00 0.00 0.00 0.00 0 0 2024-05-08\n", - "375 45000000 0.00 0.00 0.00 0.00 0 0 2024-05-08\n", - "376 48600000 0.00 0.00 0.00 0.00 0 0 2024-05-08\n", - "377 52200000 11.00 11.00 10.90 10.98 11 4 2024-05-08\n", - "378 34200000 10.73 11.15 10.73 11.15 3 3 2024-05-09\n", - "379 37800000 11.50 11.95 11.50 11.95 49 6 2024-05-09\n", - "380 41400000 12.20 12.40 11.95 12.20 139 16 2024-05-09\n", - "381 45000000 12.20 12.55 12.20 12.55 12 3 2024-05-09\n", - "382 48600000 12.20 12.20 11.90 11.90 3 3 2024-05-09\n", - "383 52200000 12.00 12.00 11.97 11.97 14 5 2024-05-09\n", - "384 34200000 11.11 11.11 10.90 10.90 12 3 2024-05-10\n", - "385 37800000 10.75 10.75 10.75 10.75 1 1 2024-05-10\n", - "386 41400000 10.25 10.40 10.25 10.40 4 2 2024-05-10\n", - "387 45000000 10.20 10.45 10.20 10.45 104 9 2024-05-10\n", - "388 48600000 10.55 10.60 10.51 10.60 13 5 2024-05-10\n", - "389 52200000 0.00 0.00 0.00 0.00 0 0 2024-05-10\n", - "390 34200000 10.20 10.20 10.00 10.00 148 16 2024-05-13\n", - "391 37800000 9.55 9.55 9.55 9.55 6 1 2024-05-13\n", - "392 41400000 9.58 9.73 9.58 9.72 5 3 2024-05-13\n", - "393 45000000 9.47 9.73 9.47 9.73 14 4 2024-05-13\n", - "394 48600000 0.00 0.00 0.00 0.00 0 0 2024-05-13\n", - "395 52200000 9.73 9.73 9.73 9.73 10 1 2024-05-13\n", - "396 34200000 9.25 9.25 8.80 9.15 44 21 2024-05-14\n", - "397 37800000 9.17 9.20 9.17 9.20 12 2 2024-05-14\n", - "398 41400000 9.40 9.40 9.10 9.10 3 2 2024-05-14\n", - "399 45000000 9.40 9.42 9.40 9.42 43 16 2024-05-14\n", - "400 48600000 9.68 9.85 9.65 9.85 7 3 2024-05-14\n", - "401 52200000 0.00 0.00 0.00 0.00 0 0 2024-05-14\n", - "402 34200000 9.50 9.50 8.17 8.35 38 23 2024-05-15\n", - "403 37800000 8.35 9.00 8.35 9.00 9 6 2024-05-15\n", - "404 41400000 9.30 9.30 9.00 9.00 6 2 2024-05-15\n", - "405 45000000 8.60 8.79 8.25 8.33 27 11 2024-05-15\n", - "406 48600000 8.96 8.96 8.90 8.90 3 3 2024-05-15\n", - "407 52200000 8.60 8.75 8.60 8.75 11 2 2024-05-15\n", - "408 34200000 9.25 9.70 9.25 9.45 40 15 2024-05-16\n", - "409 37800000 9.51 9.55 9.30 9.30 7 5 2024-05-16\n", - "410 41400000 9.10 9.10 9.07 9.07 6 2 2024-05-16\n", - "411 45000000 9.03 9.03 9.00 9.00 6 2 2024-05-16\n", - "412 48600000 8.80 8.80 8.50 8.50 9 4 2024-05-16\n", - "413 52200000 8.50 8.50 8.35 8.35 36 5 2024-05-16\n", - "414 34200000 8.15 8.65 8.15 8.60 87 14 2024-05-17\n", - "415 37800000 8.70 8.75 8.70 8.75 30 9 2024-05-17\n", - "416 41400000 8.55 8.55 8.45 8.45 2 2 2024-05-17\n", - "417 45000000 8.25 8.25 8.25 8.25 1 1 2024-05-17\n", - "418 48600000 8.45 8.45 8.45 8.45 1 1 2024-05-17\n", - "419 52200000 8.35 8.35 8.35 8.35 4 1 2024-05-17\n", - "420 34200000 8.80 9.20 8.46 8.46 33 12 2024-05-20\n", - "421 37800000 8.40 8.50 8.30 8.31 110 19 2024-05-20\n", - "422 41400000 8.27 8.27 8.10 8.10 15 4 2024-05-20\n", - "423 45000000 8.09 8.12 8.08 8.08 8 4 2024-05-20\n", - "424 48600000 7.90 7.90 7.90 7.90 4 2 2024-05-20\n", - "425 52200000 7.84 7.84 7.84 7.84 1 1 2024-05-20\n", - "426 34200000 7.13 7.20 6.80 6.80 89 17 2024-05-21\n", - "427 37800000 7.00 7.10 6.85 6.86 22 6 2024-05-21\n", - "428 41400000 7.05 7.23 7.05 7.23 12 10 2024-05-21\n", - "429 45000000 7.10 7.10 7.10 7.10 3 2 2024-05-21\n", - "430 48600000 7.30 7.30 7.10 7.10 78 22 2024-05-21\n", - "431 52200000 7.29 7.29 7.29 7.29 4 1 2024-05-21\n", - "432 34200000 8.00 8.22 7.85 7.90 12 7 2024-05-22\n", - "433 37800000 8.02 8.02 8.02 8.02 25 1 2024-05-22\n", - "434 41400000 7.79 7.79 7.79 7.79 1 1 2024-05-22\n", - "435 45000000 7.70 7.70 7.60 7.60 2 2 2024-05-22\n", - "436 48600000 7.40 7.40 7.25 7.25 35 4 2024-05-22\n", - "437 52200000 7.36 7.36 7.36 7.36 1 1 2024-05-22\n", - "438 34200000 7.80 7.80 7.29 7.32 8 8 2024-05-23\n", - "439 37800000 7.40 7.60 7.31 7.55 33 5 2024-05-23\n", - "440 41400000 7.70 7.70 7.60 7.60 10 2 2024-05-23\n", - "441 45000000 7.55 7.55 7.10 7.10 5 5 2024-05-23\n", - "442 48600000 6.83 6.83 6.58 6.58 3 3 2024-05-23\n", - "443 52200000 6.60 6.60 6.60 6.60 2 1 2024-05-23\n", - "444 34200000 6.90 7.10 6.80 6.90 82 18 2024-05-24\n", - "445 37800000 6.71 6.71 6.62 6.62 9 3 2024-05-24\n", - "446 41400000 7.01 7.07 6.98 7.05 54 12 2024-05-24\n", - "447 45000000 6.97 6.97 6.95 6.95 3 3 2024-05-24\n", - "448 48600000 6.80 6.80 6.80 6.80 65 1 2024-05-24\n", - "449 52200000 6.80 6.80 6.65 6.65 14 2 2024-05-24\n" - ] - } - ], - "source": [ - "from IPython.display import display\n", - "option = retrieve_option_ohlc_mod('AMZN', '20241018', 200.0, 'C', \"20230304\", \"20240524\")\n", - "pd.set_option('display.max_rows', None) # Show all rows\n", - "pd.set_option('display.max_columns', None) # Show all columns\n", - "pd.set_option('display.expand_frame_repr', False) # Prevent line wrapping\n", - "print(option)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": ".venv", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.11" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/EventDriven/event.py b/EventDriven/event.py index 6bc57e7..57d5049 100644 --- a/EventDriven/event.py +++ b/EventDriven/event.py @@ -3,7 +3,7 @@ from datetime import datetime from EventDriven.types import EventTypes, SignalTypes -from trade.helpers.helper import parse_option_tick +from trade.helpers.helper import parse_option_tick # noqa class Event(object): """ Event is base class providing an interface for all subsequent diff --git a/EventDriven/helpers.py b/EventDriven/helpers.py index 253c765..cb5e139 100644 --- a/EventDriven/helpers.py +++ b/EventDriven/helpers.py @@ -1,4 +1,6 @@ import pandas as pd +from typing import Tuple +from trade.helpers.helper import parse_option_tick def generate_signal_id(underlier, date, @@ -28,3 +30,13 @@ def parse_signal_id(id): else: raise ValueError(f'Invalid signal id `{id}`, neither LONG nor SHORT was found in the id') + +def parse_position_id(positionID: str) -> Tuple[dict, list]: + position_str = positionID + position_list = position_str.split("&") + position_list = [x.split(":") for x in position_list if x] + position_list_parsed = [(x[0], parse_option_tick(x[1])) for x in position_list] + position_dict = dict(L=[], S=[]) + for x in position_list_parsed: + position_dict[x[0]].append(x[1]) + return position_dict, position_list \ No newline at end of file diff --git a/EventDriven/new_portfolio.py b/EventDriven/new_portfolio.py index ee5625a..e55de06 100644 --- a/EventDriven/new_portfolio.py +++ b/EventDriven/new_portfolio.py @@ -3,7 +3,7 @@ # - Trade management: Selection handled by risk manager, Execution handled by broker class. # - Performance Monitoring: PnL, Reports, Sharpe Ratio # - Position Management: Rolling Options, Hedging, Position sizing -# - +# - from copy import deepcopy import logging @@ -16,34 +16,33 @@ from EventDriven.riskmanager.new_base import RiskManager, order_failed from EventDriven.riskmanager.utils import parse_position_id from trade.helpers.Logging import setup_logger -from trade.assets.Stock import Stock -from EventDriven.event import ( - ExerciseEvent, #noqa - FillEvent, - MarketEvent, # noqa - OrderEvent, - RollEvent, - SignalEvent, - get_event_ancestor, - Event +from trade.helpers.helper import to_datetime +from trade.assets import Stock +from EventDriven.event import ( + ExerciseEvent, # noqa + FillEvent, + MarketEvent, # noqa + OrderEvent, + RollEvent, + SignalEvent, + get_event_ancestor, + Event, ) from EventDriven.data import HistoricTradeDataHandler -from trade.helpers.helper import is_USholiday +from trade.helpers.helper import change_to_last_busday, is_USholiday from trade.backtester_.utils.aggregators import AggregatorParent from trade.backtester_.utils.utils import plot_portfolio from typing import Optional import plotly -from EventDriven.dataclasses.states import ( - PositionState, - PortfolioMetaInfo, - PortfolioState, - PositionAnalysisContext -) +from EventDriven.dataclasses.states import PositionState, PortfolioMetaInfo, PortfolioState, PositionAnalysisContext from EventDriven.dataclasses.states import StrategyChangeMeta from EventDriven.configs.core import PortfolioManagerConfig, CashAllocatorConfig from EventDriven.portfolio_utils import extract_events from EventDriven.exceptions import BacktestNotImplementedError -LOGGER = setup_logger("OptionSignalPortfolio") +from trade.backtester_._multi_asset_strategy import MultiAssetStrategy + +LOGGER = setup_logger("OptionSignalPortfolio", stream_log_level=logging.INFO) + class Portfolio(AggregatorParent): """ @@ -57,7 +56,7 @@ class Portfolio(AggregatorParent): @abstractmethod def analyze_signal(self, event): """ - Acts on a SignalEvent to generate new orders + Acts on a SignalEvent to generate new orders based on the portfolio logic. """ raise NotImplementedError("Should implement analyze_signal()") @@ -65,33 +64,35 @@ def analyze_signal(self, event): @abstractmethod def update_fill(self, event): """ - Updates the portfolio current positions and holdings + Updates the portfolio current positions and holdings from a FillEvent. """ raise NotImplementedError("Should implement update_fill()") - - - - -class OptionSignalPortfolio(Portfolio): + + +class OptionSignalPortfolio(Portfolio): """ - The OptionSignalPortfolio object is designed to handle the tracking of portfolio positions, create new orders and update holdings & positions based on FillEvents. - + The OptionSignalPortfolio object is designed to handle the tracking of portfolio positions, create new orders and update holdings & positions based on FillEvents. + bars: HistoricTradeDataHandler events: EventScheduler risk_manager: RiskManager weight_map: dict initial_capital: int """ - - def __init__(self, bars : HistoricTradeDataHandler, - eventScheduler: EventScheduler, - risk_manager : RiskManager, - weight_map = None, - initial_capital = 10000, - *, - cash_allocator_config: CashAllocatorConfig | None = None, - t_plus_n: int = 1): + + def __init__( + self, + bars: HistoricTradeDataHandler, + eventScheduler: EventScheduler, + risk_manager: RiskManager, + weight_map=None, + initial_capital=10000, + *, + eq_strategy: Optional[MultiAssetStrategy] = None, + cash_allocator_config: CashAllocatorConfig | None = None, + t_plus_n: int = 1, + ): """ Portfolio class for managing option trading strategies based on signals. Handles position tracking, order generation, portfolio valuation, and trade management. @@ -144,26 +145,28 @@ def __init__(self, bars : HistoricTradeDataHandler, self.cash_allocator_config = cash_allocator_config or CashAllocatorConfig() self.underlier_list_data = {} self.unprocessed_signals = [] - self.allow_multiple_trades = True # allow multiple trades for the same signal_id + self.allow_multiple_trades = True # allow multiple trades for the same signal_id self.__equity = None self.__transactions = [] # call internal functions to construct key portfolio data self.__construct_all_positions() self.__construct_current_positions() - self.__construct_weight_map(weight_map = weight_map) + self.__construct_weight_map(weight_map=weight_map) self.__construct_current_weighted_holdings() self.__construct_weighted_holdings() self.trades_df = None self.trades_map = {} self.current_cash = {} self.order_cache = { - 'CLOSE': {}, - 'OPEN': {}, + "CLOSE": {}, + "OPEN": {}, } self.position_cache = {} self.config = PortfolioManagerConfig() self._holiday_cache = {} - self.is_backtest = True ## Move to config? + self.is_backtest = True ## Move to config? + self.eq_strategy = eq_strategy + self.using_eq_strategy = eq_strategy is not None def _is_holiday(self, dt): """ @@ -176,29 +179,31 @@ def _is_holiday(self, dt): @property def logger(self): return LOGGER - + @property - def weight_map(self): + def weight_map(self): return self.__weight_map - + @weight_map.setter def weight_map(self, weight_map): self.__construct_weight_map(weight_map) self.__construct_current_weighted_holdings() self.__construct_weighted_holdings() - + @property def max_contract_price(self): return self.__max_contract_price - + @max_contract_price.setter def max_contract_price(self, max_contract_price): if isinstance(max_contract_price, int): max_contract_price = {s: max_contract_price for s in self.symbol_list} - + for s in max_contract_price.keys(): if max_contract_price[s] > self.allocated_cash_map[s]: - raise ValueError(f'max_contract_price for {s} cannot be greater than allocated cash of {self.allocated_cash_map[s]}') + raise ValueError( + f"max_contract_price for {s} cannot be greater than allocated cash of {self.allocated_cash_map[s]}" + ) self.__max_contract_price = deepcopy(max_contract_price) def __get_underlier_data(self, symbol: str): @@ -210,22 +215,23 @@ def __get_underlier_data(self, symbol: str): def get_underlier_data(self): return self.__get_underlier_data - - def __construct_weight_map(self, weight_map): + def __construct_weight_map(self, weight_map): unprocessed_symbols = [] if weight_map is not None: for s in weight_map.keys(): if s not in self.symbol_list: unprocessed_symbols.append(s) if len(unprocessed_symbols) > 0: - self.logger.critical(f"The following symbols: {unprocessed_symbols} are not being processed but present in weight_map") - weight_map = {x : weight_map[x] * (1 - self.config.weights_haircut) for x in self.symbol_list} + self.logger.critical( + f"The following symbols: {unprocessed_symbols} are not being processed but present in weight_map" + ) + weight_map = {x: weight_map[x] * (1 - self.config.weights_haircut) for x in self.symbol_list} weight_total = round(sum(weight_map.values()), 4) assert weight_total <= 1.0, f"Sum of weights must be less than or equal to 1.0, got {weight_total}" - - else: - weight_map = {x: 1/len(self.symbol_list) for x in self.symbol_list} #spread capital between all symbols - + + else: + weight_map = {x: 1 / len(self.symbol_list) for x in self.symbol_list} # spread capital between all symbols + self.__weight_map = weight_map self.allocated_cash_map = {s: self.__weight_map[s] * self.initial_capital for s in self.symbol_list} self.__max_contract_price = self.__construct_max_contract_price() @@ -246,39 +252,35 @@ def __construct_max_contract_price(self): for s in self.symbol_list } except Exception as exc: # pragma: no cover - defensive - self.logger.warning( - f"Falling back to default max_contract_price due to allocator error: {exc}" - ) + self.logger.warning(f"Falling back to default max_contract_price due to allocator error: {exc}") return { - s: self.__normalize_dollar_amount_to_decimal(self.allocated_cash_map[s] * 0.5) - for s in self.symbol_list + s: self.__normalize_dollar_amount_to_decimal(self.allocated_cash_map[s] * 0.5) for s in self.symbol_list } # default max contract price is 50% of allocated cash divided by 100 - + def __construct_current_positions(self): d = {s: {} for s in self.symbol_list} self.current_positions = d - - def __construct_all_positions(self): - d = {s: {} for s in self.symbol_list} #key is underlier, value is list of option contracts - d['datetime'] = self.bars.start_date + + def __construct_all_positions(self): + d = {s: {} for s in self.symbol_list} # key is underlier, value is list of option contracts + d["datetime"] = self.bars.start_date self.all_positions = [d] - - - def __construct_current_weighted_holdings(self): - self.current_weighted_holdings = {'commission': 0.0} - - def __construct_weighted_holdings(self): + + def __construct_current_weighted_holdings(self): + self.current_weighted_holdings = {"commission": 0.0} + + def __construct_weighted_holdings(self): """ improved version of current_holdings, this attributes each symbols holdings to the market value of the position + left over allocated cash for the symbol """ left_over_capital = (1.0 - sum(self.__weight_map.values())) * self.initial_capital d = {s: self.allocated_cash_map[s] for s in self.symbol_list} - d['datetime'] = self.bars.start_date - d['cash'] = left_over_capital - d['commission'] = 0.0 - d['total'] = self.initial_capital + d["datetime"] = self.bars.start_date + d["cash"] = left_over_capital + d["commission"] = 0.0 + d["total"] = self.initial_capital self.weighted_holdings = [d] - + @property def transactions(self): return pd.DataFrame(self.__transactions) @@ -286,15 +288,15 @@ def transactions(self): @property def _equity(self): holdings = self.weighted_holdings - equity_curve = pd.DataFrame(holdings).set_index('datetime') - equity_curve = equity_curve[~equity_curve.index.duplicated(keep='last')] - equity_curve.drop(columns=['total'], inplace = True) - equity_curve['commission'] = -equity_curve['commission'] - equity_curve['total'] = equity_curve.sum(axis = 1) ##NOTE: Temp fix till calcs work - equity_curve.rename(columns = {'total': 'Total'}, inplace=True) + equity_curve = pd.DataFrame(holdings).set_index("datetime") + equity_curve = equity_curve[~equity_curve.index.duplicated(keep="last")] + equity_curve.drop(columns=["total"], inplace=True) + equity_curve["commission"] = -equity_curve["commission"] + equity_curve["total"] = equity_curve.sum(axis=1) ##NOTE: Temp fix till calcs work + equity_curve.rename(columns={"total": "Total"}, inplace=True) self.__equity = equity_curve return self.__equity - + @property def trades(self): """ @@ -302,45 +304,47 @@ def trades(self): """ if self.trades_df is not None: return self.trades_df - + self.trades_df = self.aggregate_trades() return self.trades_df - - - def aggregate_trades(self): + + def aggregate_trades(self): trades_data = [self.trades_map[trade_id].stats for trade_id in self.trades_map.keys()] return pd.concat(trades_data, ignore_index=True) if trades_data else None - - + @property def _trades(self): ## AggregatorParent uses _trades in some methods. See Expectancy in aggregator return self.trades - + def get_port_stats(self): current_date = pd.to_datetime(self.eventScheduler.current_date) if pd.to_datetime(self.start_date) == pd.to_datetime(current_date): return False return True - + ##NOTE: Should move to performance.py? def dates_(self, start: bool = True): if start: return self._equity.index.min() else: return self._equity.index.max() - + def buyNhold(self): stock_ts = pd.DataFrame() for stock in self.symbol_list: - stock_ts[stock] = self.underlier_list_data.get(stock, self.__get_underlier_data(stock)).spot(ts = True, ts_start = self.dates_(), ts_end = self.dates_(start = False))['close'] * self.__weight_map[stock] - - stock_ts['Total'] = stock_ts.sum(axis = 1) + stock_ts[stock] = ( + self.underlier_list_data.get(stock, self.__get_underlier_data(stock)).spot( + ts=True, ts_start=self.dates_(), ts_end=self.dates_(start=False) + )["close"] + * self.__weight_map[stock] + ) + + stock_ts["Total"] = stock_ts.sum(axis=1) self.stock_equity = stock_ts - return self.__normalize_dollar_amount(((stock_ts['Total'].iloc[-1] / stock_ts['Total'].iloc[0]) -1)) - + return self.__normalize_dollar_amount(((stock_ts["Total"].iloc[-1] / stock_ts["Total"].iloc[0]) - 1)) - def generate_order(self, signal_event : SignalEvent): + def generate_order(self, signal_event: SignalEvent): """ Takes a signal event and creates an order event based on the signal parameters Interacts with RiskManager to get order based on settings and signal @@ -348,62 +352,82 @@ def generate_order(self, signal_event : SignalEvent): """ symbol = signal_event.symbol signal_type = signal_event.signal_type - order_type = 'MKT' - - if signal_type != 'CLOSE': #generate order for LONG or SHORT - order = self.create_order( signal_event, order_type) - self.order_cache['OPEN'].setdefault(signal_event.datetime, {})[signal_event.symbol] = order - return order - elif signal_type == 'CLOSE': + order_type = "MKT" - ## Check if we have signal_id in current positions. If not, log warning and skip. + if signal_type != "CLOSE": # generate order for LONG or SHORT + order = self.create_order(signal_event, order_type) + self.order_cache["OPEN"].setdefault(signal_event.datetime, {})[signal_event.symbol] = order + return order + elif signal_type == "CLOSE": + ## Check if we have signal_id in current positions. If not, log warning and skip. if signal_event.signal_id not in self.current_positions[symbol]: - self.logger.warning(f'No contracts held for {symbol} to sell at {signal_event.datetime}, Inputs {locals()}') + self.logger.warning( + f"No contracts held for {symbol} to sell at {signal_event.datetime}, Inputs {locals()}" + ) unprocess_dict = signal_event.__dict__ - unprocess_dict['reason'] = ('Signal not held in current positions at that time') + unprocess_dict["reason"] = "Signal not held in current positions at that time" self.unprocessed_signals.append(unprocess_dict) return None - + current_position = self.current_positions[symbol][signal_event.signal_id] ## Check if market is holiday if self._is_holiday(signal_event.datetime): - self.resolve_order_result({'result': ResultsEnum.IS_HOLIDAY.value}, signal_event) + self.resolve_order_result({"result": ResultsEnum.IS_HOLIDAY.value}, signal_event) return None - + ## Check if we have position to close - if 'position' not in current_position: - self.logger.warning(f'No contracts held for {symbol} to sell at {signal_event.datetime}, Inputs {locals()}') + if "position" not in current_position: + self.logger.warning( + f"No contracts held for {symbol} to sell at {signal_event.datetime}, Inputs {locals()}" + ) return None - + ## Prepare order details - position = current_position['position'] - self.logger.info(f'Selling contract for {symbol} at {signal_event.datetime} Position: {current_position}') - position['close'] = self.calculate_close_on_position(position) + position = current_position["position"] + self.logger.info(f"Selling contract for {symbol} at {signal_event.datetime} Position: {current_position}") + position["close"] = self.calculate_close_on_position(position) ## Access skip from risk_manager market data - skip = self.risk_manager.market_data.skip(position_id=position['trade_id'], - date=signal_event.datetime) - + skip = self.risk_manager.market_data.skip(position_id=position["trade_id"], date=signal_event.datetime) + ## If skip is true, either move to next trading day or skip if rolling if skip: - ## If rolling, do not move to next trading day. Let it fall through - if isinstance(signal_event.parent_event, RollEvent): - self.logger.warning(f'Not generating order because: CLOSE price is negative {signal_event}, skipping sell for roll event') + if isinstance(signal_event.parent_event, RollEvent): + self.logger.warning( + f"Not generating order because: CLOSE price is negative {signal_event}, skipping sell for roll event" + ) return None - # Move signal to next day + # Move signal to next day next_trading_day = signal_event.datetime + pd.offsets.BusinessDay(1) - new_signal = SignalEvent(signal_event.symbol, next_trading_day, SignalTypes.CLOSE.value, signal_id=signal_event.signal_id, parent_event=signal_event.parent_event) - self.logger.warning(f'Not generating order because: CLOSE price is negative {signal_event}, moving event to {next_trading_day}') + new_signal = SignalEvent( + signal_event.symbol, + next_trading_day, + SignalTypes.CLOSE.value, + signal_id=signal_event.signal_id, + parent_event=signal_event.parent_event, + ) + self.logger.warning( + f"Not generating order because: CLOSE price is negative {signal_event}, moving event to {next_trading_day}" + ) self.eventScheduler.schedule_event(next_trading_day, new_signal) return None - + ## Create sell order if not skipping and return. - order = OrderEvent(symbol, signal_event.datetime, order_type, quantity=current_position['quantity'],direction= 'SELL', position = position, signal_id=signal_event.signal_id, parent_event=signal_event) - self.order_cache['CLOSE'].setdefault(signal_event.datetime, {})[signal_event.symbol] = order + order = OrderEvent( + symbol, + signal_event.datetime, + order_type, + quantity=current_position["quantity"], + direction="SELL", + position=position, + signal_id=signal_event.signal_id, + parent_event=signal_event, + ) + self.order_cache["CLOSE"].setdefault(signal_event.datetime, {})[signal_event.symbol] = order return order - + return None def resolve_order_result(self, position_result, signal): @@ -411,31 +435,51 @@ def resolve_order_result(self, position_result, signal): Placeholder for legacy resolve_order_result logic. """ self.logger.warning(f"resolve_order_result not implemented for {position_result}, {signal}") - - def create_order(self, signal_event : SignalEvent, position_type: str, order_type: str = 'MKT'): + + def create_order(self, signal_event: SignalEvent, position_type: str, order_type: str = "MKT"): """ Takes a signal event and creates an order event based on the signal parameters position_type: C|P """ if self._is_holiday(signal_event.datetime): - self.logger.critical(f'Market is closed on {signal_event.datetime}, cannot create order for signal: {signal_event}') + self.logger.critical( + f"Market is closed on {signal_event.datetime}, cannot create order for signal: {signal_event}" + ) ## Using roll directly here to avoid the config check in process_failed_order self._roll_signal_to_next_day(signal_event) return None - date_str = signal_event.datetime.strftime('%Y-%m-%d') - position_type = 'c' if signal_event.signal_type == 'LONG' else 'p' + date_str = signal_event.datetime.strftime("%Y-%m-%d") + position_type = "c" if signal_event.signal_type == "LONG" else "p" cash_at_hand = self.__normalize_dollar_amount_to_decimal(self.allocated_cash_map[signal_event.symbol] * 1) - max_contract_price = self.__max_contract_price[signal_event.symbol] if signal_event.max_contract_price is None else signal_event.max_contract_price - max_contract_price = max_contract_price if max_contract_price <= cash_at_hand else cash_at_hand + max_contract_price = ( + self.__max_contract_price[signal_event.symbol] + if signal_event.max_contract_price is None + else signal_event.max_contract_price + ) + max_contract_price = max_contract_price if max_contract_price <= cash_at_hand else cash_at_hand if self.logger.isEnabledFor(logging.DEBUG): - print(f"Cash at Hand: {cash_at_hand}, Max Contract Price: {max_contract_price} for Signal: {signal_event.signal_id}") + self.logger.info( + f"Cash at Hand: {cash_at_hand}, Max Contract Price: {max_contract_price} for Signal: {signal_event.signal_id}" + ) cache_key = (signal_event.symbol, signal_event.signal_id, signal_event.datetime) position_state = self.position_cache.get(cache_key) if position_state is None: - position_state = self.risk_manager.get_order(OrderRequest(date=date_str, symbol=signal_event.symbol, option_type=position_type, max_close=max_contract_price, tick_cash=cash_at_hand, direction=signal_event.signal_type, signal_id=signal_event.signal_id)) + position_state = self.risk_manager.get_order( + OrderRequest( + date=date_str, + symbol=signal_event.symbol, + option_type=position_type, + max_close=max_contract_price, + tick_cash=cash_at_hand, + direction=signal_event.signal_type, + signal_id=signal_event.signal_id, + ) + ) self.position_cache[cache_key] = position_state - self.position_cache[signal_event.signal_id] = position_state # backward compatibility with previous cache usage + self.position_cache[signal_event.signal_id] = ( + position_state # backward compatibility with previous cache usage + ) position = position_state.order.data order = position_state.order.to_dict() if order_failed(order): @@ -445,84 +489,103 @@ def create_order(self, signal_event : SignalEvent, position_type: str, order_typ self._process_failed_order(signal_event) return None - # print("===========================") - # print("Buy Details") - # print(f"Position: {position}, Date: {date_str}, Signal: {signal_event}") - # print(f"Max Contract Price: {max_contract_price}, Cash at Hand: {cash_at_hand}") - # print("Cash at Hand", cash_at_hand, "Close", position['close']) - # print("===========================") - return OrderEvent(signal_event.symbol, signal_event.datetime, order_type, cash=cash_at_hand, direction= 'BUY', position = position, signal_id = signal_event.signal_id, quantity=position['quantity'], parent_event=signal_event) - + return OrderEvent( + signal_event.symbol, + signal_event.datetime, + order_type, + cash=cash_at_hand, + direction="BUY", + position=position, + signal_id=signal_event.signal_id, + quantity=position["quantity"], + parent_event=signal_event, + ) + def _process_failed_order(self, signal_event: SignalEvent): """ Process a failed order by either rolling it forward or logging it. """ if self.config.roll_failed_orders: next_trading_day = signal_event.datetime + pd.offsets.BusinessDay(1) - self.logger.critical(f'Rolling failed signal {signal_event} to next trading day {next_trading_day}') + self.logger.critical(f"Rolling failed signal {signal_event} to next trading day {next_trading_day}") self._roll_signal_to_next_day(signal_event) else: - self.logger.critical(f'Failed to process signal for {signal_event.signal_id} on {signal_event.datetime}, not rolling forward as per config.') + self.logger.critical( + f"Failed to process signal for {signal_event.signal_id} on {signal_event.datetime}, not rolling forward as per config." + ) unprocess_dict = signal_event.__dict__ - unprocess_dict['reason'] = 'Order failed and rolling is disabled' + unprocess_dict["reason"] = "Order failed and rolling is disabled" self.unprocessed_signals.append(unprocess_dict) - + def _roll_signal_to_next_day(self, signal_event: SignalEvent): """ Rolls a signal event to the next trading day. """ next_trading_day = signal_event.datetime + pd.offsets.BusinessDay(1) - new_signal = SignalEvent(signal_event.symbol, next_trading_day, signal_event.signal_type, signal_id=signal_event.signal_id, parent_event=signal_event.parent_event) - self.logger.info(f'Rolling signal {signal_event} to next trading day {next_trading_day}') + new_signal = SignalEvent( + signal_event.symbol, + next_trading_day, + signal_event.signal_type, + signal_id=signal_event.signal_id, + parent_event=signal_event.parent_event, + ) + self.logger.info(f"Rolling signal {signal_event} to next trading day {next_trading_day}") self.eventScheduler.schedule_event(next_trading_day, new_signal) - - def analyze_signal(self, event : SignalEvent): + + def analyze_signal(self, event: SignalEvent): """ - Acts on a SignalEvent to generate new orders + Acts on a SignalEvent to generate new orders based on the portfolio logic. throws: AssertionError if event type is not 'SIGNAL' """ - assert event.type == 'SIGNAL', f"Expected 'SIGNAL' event type, got {event.type}" - - + assert event.type == "SIGNAL", f"Expected 'SIGNAL' event type, got {event.type}" + if not self.allow_multiple_trades and event.signal_type != SignalTypes.CLOSE.value: positions_for_sym = self.current_positions[event.symbol] - has_open_position = any('exit_price' not in pos for pos in positions_for_sym.values()) + has_open_position = any("exit_price" not in pos for pos in positions_for_sym.values()) if has_open_position: - self.logger.warning(f'Pushing signal {event} to next trading day because a position already exists for {event.symbol}') + self.logger.warning( + f"Pushing signal {event} to next trading day because a position already exists for {event.symbol}" + ) next_trading_day = event.datetime + pd.offsets.BusinessDay(1) - new_signal = SignalEvent(event.symbol, next_trading_day, event.signal_type, signal_id=event.signal_id, parent_event=event.parent_event) + new_signal = SignalEvent( + event.symbol, + next_trading_day, + event.signal_type, + signal_id=event.signal_id, + parent_event=event.parent_event, + ) self.eventScheduler.schedule_event(next_trading_day, new_signal) return None - + order_event = self.generate_order(event) if order_event is not None: self.eventScheduler.put(order_event) - - def analyze_positions(self) -> StrategyChangeMeta : + + def analyze_positions(self) -> StrategyChangeMeta: """ Analyze the current positions and determine if any need to be rolled """ if not self.risk_manager.position_analyzer.config.enabled: - self.logger.info('Position analysis is disabled in RiskManager, skipping') + self.logger.info("Position analysis is disabled in RiskManager, skipping") return StrategyChangeMeta(date=pd.to_datetime(self.eventScheduler.current_date), actionables=[]) - - ## Check if current date is a holiday - ## If holiday, skip position analysis - ## Market is closed on holidays - ## Use pandas to_datetime for date conversion - ## Use is_USholiday function to check for holidays - ## Log a warning message if market is closed - ## Return None if market is closed - ## Else, proceed with position analysis - ## Create Context for current positions - ## Analyze positions using RiskManager - ## Extract events from meta changes and schedule them + + ## Check if current date is a holiday + ## If holiday, skip position analysis + ## Market is closed on holidays + ## Use pandas to_datetime for date conversion + ## Use is_USholiday function to check for holidays + ## Log a warning message if market is closed + ## Return None if market is closed + ## Else, proceed with position analysis + ## Create Context for current positions + ## Analyze positions using RiskManager + ## Extract events from meta changes and schedule them dt = pd.to_datetime(self.eventScheduler.current_date) if self._is_holiday(dt): self.logger.warning(f"Market is closed on {dt}, skipping") return - + ## Create Context for current positions ctx = self._create_ctx(dt) @@ -532,14 +595,63 @@ def analyze_positions(self) -> StrategyChangeMeta : ## Extract events from meta changes and schedule them events = self.extract_events(meta_changes) if not events: - self.logger.info(f'No events to schedule for position analysis on {dt}') + self.logger.info(f"No events to schedule for position analysis on {dt}") return meta_changes ## Loop through events and schedule them for event in events: self.eventScheduler.schedule_event(event.datetime, event) return meta_changes - + + def analyze_multiasset_strategy(self, dt: Optional[pd.Timestamp] = None): + """ + Analyze the multi-asset strategy and generate signals if necessary + """ + if self.eq_strategy is None: + return + dt = to_datetime(dt or self.eventScheduler.current_date) + self.logger.info(f"Analyzing multi-asset strategy for {dt}") + if self._is_holiday(dt): + self.logger.warning(f"Market is closed on {dt}, skipping multi-asset strategy analysis") + return + + signals = self.eq_strategy.generate_signals_on_date(dt, filter_actionable=True) + exec_date = change_to_last_busday( + dt + pd.tseries.offsets.BDay(self.t_plus_n), offset=-1, time_of_day_aware=False + ) + opens = signals.open_signals + closes = signals.close_signals + for ticker, signal in opens.items(): + if signal.signal_id is None: + raise ValueError( + f"Signal {signal} does not have signal_id, cannot process signal for multi-asset strategy" + ) + self.logger.info(f"Scheduling open signal for {ticker} on {exec_date} with signal_id {signal.signal_id}") + singal_type = SignalTypes.LONG.value if signal.side == 1 else SignalTypes.SHORT.value + signal_event = SignalEvent( + symbol=ticker, + datetime=exec_date, + signal_type=singal_type, + signal_id=signal.signal_id, + parent_event=None, + ) + self.eventScheduler.schedule_event(exec_date, signal_event) + for ticker, signal in closes.items(): + if signal.signal_id is None: + raise ValueError( + f"Signal {signal} does not have signal_id, cannot process signal for multi-asset strategy" + ) + self.logger.info(f"Scheduling close signal for {ticker} on {exec_date} with signal_id {signal.signal_id}") + singal_type = SignalTypes.CLOSE.value + signal_event = SignalEvent( + symbol=ticker, + datetime=exec_date, + signal_type=singal_type, + signal_id=signal.signal_id, + parent_event=None, + ) + self.eventScheduler.schedule_event(exec_date, signal_event) + @staticmethod def _construct_position( signal_id: str, @@ -557,9 +669,9 @@ def _construct_position( long = [] short = [] for leg, _id in parsed: - if leg == 'L': + if leg == "L": long.append(_id) - elif leg == 'S': + elif leg == "S": short.append(_id) _order_data = OrderData(trade_id=trade_id, long=long, short=short, close=close, quantity=quantity) position = { @@ -570,14 +682,14 @@ def _construct_position( "market_value": close * quantity * 100, } return position - + def _create_ctx(self, date: pd.Timestamp, positions: dict = None) -> PositionAnalysisContext: """ Create a Context object for the given date """ ## OPTIMIZATION: Convert date to string once to avoid repeated conversions - date_str = date.strftime('%Y-%m-%d') + date_str = date.strftime("%Y-%m-%d") ## Create PositionState objects for all current positions positions = positions if positions is not None else self.current_positions @@ -587,8 +699,12 @@ def _create_ctx(self, date: pd.Timestamp, positions: dict = None) -> PositionAna trade_id = position["position"]["trade_id"] qty = position["quantity"] entry_price = position["entry_price"] / qty - current_position_data = self.risk_manager.market_data.get_at_time_position_data(position_id=trade_id, date=date_str) - current_underlier_data = self.risk_manager.market_data.market_timeseries.get_at_index(sym=tick, index=date) + current_position_data = self.risk_manager.market_data.get_at_time_position_data( + position_id=trade_id, date=date_str + ) + current_underlier_data = self.risk_manager.market_data.market_timeseries.get_at_index( + sym=tick, index=date + ) current_price = position["market_value"] / qty pnl = (current_price - entry_price) * qty @@ -604,7 +720,7 @@ def _create_ctx(self, date: pd.Timestamp, positions: dict = None) -> PositionAna last_updated=date, ) positions_states.append(pos_state) - + ## Create Portfolio State cash = sum(self.allocated_cash_map.values()) positions = positions_states @@ -620,7 +736,7 @@ def _create_ctx(self, date: pd.Timestamp, positions: dict = None) -> PositionAna pnl=pnl, last_updated=last_updated, ) - + ## Create PortfolioMetaInfo meta = PortfolioMetaInfo( portfolio_name=self.config.run_name, @@ -637,93 +753,139 @@ def _create_ctx(self, date: pd.Timestamp, positions: dict = None) -> PositionAna portfolio=portfolio_state, portfolio_meta=meta, ) - + return ctx - + def extract_events(self, meta_changes: StrategyChangeMeta) -> list[Event]: """ Extract events from the strategy meta changes """ - events = extract_events(actionables=meta_changes.actionables, - current_positions=self.current_positions) + events = extract_events(actionables=meta_changes.actionables, current_positions=self.current_positions) return events - + def execute_roll(self, roll_event: RollEvent): """ Execute the roll event by closing the current position and opening a new one rollEvent: RollEvent """ - self.logger.info(f'Rolling contract for {roll_event}') - print(f'Rolling contract (sell side) for {roll_event.symbol} at {roll_event.datetime}') - sell_signal_event = SignalEvent( roll_event.symbol, roll_event.datetime, SignalTypes.CLOSE.value, signal_id=roll_event.signal_id, parent_event=roll_event) + self.logger.info(f"Rolling contract for {roll_event}") + self.logger.info(f"Rolling contract (sell side) for {roll_event.symbol} at {roll_event.datetime}") + sell_signal_event = SignalEvent( + roll_event.symbol, + roll_event.datetime, + SignalTypes.CLOSE.value, + signal_id=roll_event.signal_id, + parent_event=roll_event, + ) self.eventScheduler.put(sell_signal_event) - + def execute_roll_buy(self, roll_event: RollEvent): """ - Run after a successful fill on the sell side of the roll event + Run after a successful fill on the sell side of the roll event rollEvent: RollEvent """ - self.logger.info(f'Rolling contract for {roll_event}') - print(f'Rolling contract (buy side) for {roll_event.symbol} at {roll_event.datetime}') - buy_signal_event = SignalEvent( roll_event.symbol, roll_event.datetime, roll_event.signal_type , signal_id=roll_event.signal_id) - self.eventScheduler.put(buy_signal_event) - + self.logger.info(f"Rolling contract for {roll_event}") + self.logger.info(f"Rolling contract (buy side) for {roll_event.symbol} at {roll_event.datetime}") + buy_signal_event = SignalEvent( + roll_event.symbol, roll_event.datetime, roll_event.signal_type, signal_id=roll_event.signal_id + ) + self.eventScheduler.put(buy_signal_event) + def __normalize_dollar_amount_to_decimal(self, price: float) -> float: """ divide by 100 """ return price / 100 - + def __normalize_dollar_amount(self, price: float) -> float: """ multiply by 100 """ return price * 100 - + def update_positions_on_fill(self, fill_event: FillEvent): """ - Takes a FilltEvent object and updates the current positions in the portfolio - When a buy is filled, the options data related to the contract is stored in the options_data dictionary. - This is so it can be fetched easily when needed + Takes a FilltEvent object and updates the current positions in the portfolio + When a buy is filled, the options data related to the contract is stored in the options_data dictionary. + This is so it can be fetched easily when needed Parameters: fill - The FillEvent object to update the positions with. """ # Check whether the fill is a buy or sell new_position_data = {} - - if fill_event.position['trade_id'] not in self.trades_map: - self.trades_map[fill_event.position['trade_id']] = Trade(fill_event.position['trade_id'], fill_event.symbol, fill_event.signal_id) - self.trades_map[fill_event.position['trade_id']].update(fill_event) + + if fill_event.position["trade_id"] not in self.trades_map: + self.trades_map[fill_event.position["trade_id"]] = Trade( + fill_event.position["trade_id"], fill_event.symbol, fill_event.signal_id + ) + self.trades_map[fill_event.position["trade_id"]].update(fill_event) else: - self.trades_map[fill_event.position['trade_id']].update(fill_event) - - if fill_event.direction == 'BUY': - if fill_event.position is not None: - new_position_data['position'] = fill_event.position - if self.current_positions[fill_event.symbol] is not None and fill_event.signal_id in self.current_positions[fill_event.symbol]: - new_position_data['quantity'] = self.current_positions[fill_event.symbol][fill_event.signal_id]['quantity'] + fill_event.quantity + self.trades_map[fill_event.position["trade_id"]].update(fill_event) + + if fill_event.direction == "BUY": + if fill_event.position is not None: + new_position_data["position"] = fill_event.position + if ( + self.current_positions[fill_event.symbol] is not None + and fill_event.signal_id in self.current_positions[fill_event.symbol] + ): + new_position_data["quantity"] = ( + self.current_positions[fill_event.symbol][fill_event.signal_id]["quantity"] + + fill_event.quantity + ) else: - new_position_data['quantity'] = fill_event.quantity - new_position_data['entry_price'] = self.__normalize_dollar_amount(fill_event.fill_cost) - new_position_data['market_value'] = self.__normalize_dollar_amount(fill_event.market_value) - new_position_data['signal_id'] = fill_event.signal_id - - - if fill_event.direction == 'SELL': - if fill_event.position is not None: - new_position_data['position'] = fill_event.position - new_position_data['entry_price'] = self.current_positions[fill_event.symbol][fill_event.signal_id]['entry_price'] - if self.current_positions[fill_event.symbol] is not None and fill_event.signal_id in self.current_positions[fill_event.symbol]: - new_position_data['quantity'] = self.current_positions[fill_event.symbol][fill_event.signal_id]['quantity'] - fill_event.quantity + new_position_data["quantity"] = fill_event.quantity + new_position_data["entry_price"] = self.__normalize_dollar_amount(fill_event.fill_cost) + new_position_data["market_value"] = self.__normalize_dollar_amount(fill_event.market_value) + new_position_data["signal_id"] = fill_event.signal_id + + ## Update eq_strategy if using + if self.eq_strategy is not None: + entry_price = self.__normalize_dollar_amount(fill_event.fill_cost) + self.eq_strategy.set_position( + ticker=fill_event.symbol, + signal_id=fill_event.signal_id, + current_date=fill_event.datetime, + side=1 if fill_event.direction == "BUY" else -1, + entry_price=entry_price, + ) + # strategy_position = self.eq_strategy.get_strategy(ticker=fill_event.symbol) + self.eq_strategy.open_action( + ticker=fill_event.symbol, + current_date=fill_event.datetime, + signal_id=fill_event.signal_id, + side=1 if fill_event.direction == "BUY" else -1, + entry_price=entry_price, + ) + + if fill_event.direction == "SELL": + if fill_event.position is not None: + new_position_data["position"] = fill_event.position + new_position_data["entry_price"] = self.current_positions[fill_event.symbol][fill_event.signal_id][ + "entry_price" + ] + if ( + self.current_positions[fill_event.symbol] is not None + and fill_event.signal_id in self.current_positions[fill_event.symbol] + ): + new_position_data["quantity"] = ( + self.current_positions[fill_event.symbol][fill_event.signal_id]["quantity"] + - fill_event.quantity + ) else: - return ValueError(f'No position found for {fill_event.symbol} with signal_id {fill_event.signal_id}') - new_position_data['market_value'] = self.__normalize_dollar_amount(fill_event.market_value) - if (new_position_data['quantity']) == 0: - new_position_data['exit_price'] = self.__normalize_dollar_amount(fill_event.fill_cost) + return ValueError( + f"No position found for {fill_event.symbol} with signal_id {fill_event.signal_id}" + ) + new_position_data["market_value"] = self.__normalize_dollar_amount(fill_event.market_value) + if (new_position_data["quantity"]) == 0: + new_position_data["exit_price"] = self.__normalize_dollar_amount(fill_event.fill_cost) + if self.eq_strategy is not None: + self.eq_strategy.unset_position(ticker=fill_event.symbol) + # strategy_position = self.eq_strategy.get_strategy(ticker=fill_event.symbol) + self.eq_strategy.close_action(ticker=fill_event.symbol, current_date=fill_event.datetime) - if fill_event.direction == 'EXERCISE': - raise BacktestNotImplementedError('Exercise fill handling not implemented yet') - + if fill_event.direction == "EXERCISE": + raise BacktestNotImplementedError("Exercise fill handling not implemented yet") self.current_positions[fill_event.symbol][fill_event.signal_id] = new_position_data @@ -735,110 +897,117 @@ def update_holdings_on_fill(self, fill_event: FillEvent): Parameters: fill - The FillEvent object to update the holdings with. """ - + transaction = {} - transaction['signal_id'] = fill_event.signal_id - transaction['datetime'] = fill_event.datetime - transaction['symbol'] = fill_event.symbol - transaction['direction'] = fill_event.direction - if fill_event.direction == 'BUY': + transaction["signal_id"] = fill_event.signal_id + transaction["datetime"] = fill_event.datetime + transaction["symbol"] = fill_event.symbol + transaction["direction"] = fill_event.direction + if fill_event.direction == "BUY": # available cash for the symbol is the left over cash after buying the contract - transaction['cash_before'] = self.allocated_cash_map[fill_event.symbol] + transaction["cash_before"] = self.allocated_cash_map[fill_event.symbol] self.allocated_cash_map[fill_event.symbol] -= self.__normalize_dollar_amount(fill_event.fill_cost) - transaction['cash_after'] = self.allocated_cash_map[fill_event.symbol] - - elif fill_event.direction == 'SELL': - transaction['cash_before'] = self.allocated_cash_map[fill_event.symbol] + transaction["cash_after"] = self.allocated_cash_map[fill_event.symbol] + + elif fill_event.direction == "SELL": + transaction["cash_before"] = self.allocated_cash_map[fill_event.symbol] self.allocated_cash_map[fill_event.symbol] += self.__normalize_dollar_amount(fill_event.fill_cost) - transaction['cash_after'] = self.allocated_cash_map[fill_event.symbol] + transaction["cash_after"] = self.allocated_cash_map[fill_event.symbol] self.__transactions.append(transaction) - self.current_weighted_holdings['commission'] += fill_event.commission - - def update_timeindex(self): + self.current_weighted_holdings["commission"] += fill_event.commission + + def update_timeindex(self): """ Adds a new record to the holdings and positions matrix based on the current market data bar. Runs at the end of the trading day (i.e all events for the day have been processed) """ - + current_date = pd.to_datetime(self.eventScheduler.current_date) # Check if the current date is a weekend (Saturday or Sunday) if current_date.weekday() >= 5: return - - #new positions dictionary - new_positions_entry = {s: {} for s in self.symbol_list} - new_positions_entry['datetime'] = current_date - current_cash = {'datetime': current_date} - - #new weighted holdings dictionary + + # new positions dictionary + new_positions_entry = {s: {} for s in self.symbol_list} + new_positions_entry["datetime"] = current_date + current_cash = {"datetime": current_date} + + # new weighted holdings dictionary new_weighted_holdings_entry = {s: self.allocated_cash_map[s] for s in self.symbol_list} - new_weighted_holdings_entry['datetime'] = current_date - new_weighted_holdings_entry['cash'] = (1.0 - sum(self.__weight_map.values())) * self.initial_capital - new_weighted_holdings_entry['commission'] = self.current_weighted_holdings['commission'] - new_weighted_holdings_entry['total'] = new_weighted_holdings_entry['cash'] - + new_weighted_holdings_entry["datetime"] = current_date + new_weighted_holdings_entry["cash"] = (1.0 - sum(self.__weight_map.values())) * self.initial_capital + new_weighted_holdings_entry["commission"] = self.current_weighted_holdings["commission"] + new_weighted_holdings_entry["total"] = new_weighted_holdings_entry["cash"] + for sym in self.symbol_list: - new_weighted_holdings_entry[sym] = self.allocated_cash_map[sym] - current_cash[sym] = self.allocated_cash_map[sym] #update current cash for the symbol + new_weighted_holdings_entry[sym] = self.allocated_cash_map[sym] + current_cash[sym] = self.allocated_cash_map[sym] # update current cash for the symbol remove_signals = [] for signal_id in self.current_positions[sym]: - current_close = self.calculate_close_on_position(self.current_positions[sym][signal_id]['position']) - market_value = self.__normalize_dollar_amount(self.current_positions[sym][signal_id]['quantity'] * current_close) - - self.trades_map[self.current_positions[sym][signal_id]['position']['trade_id']].update_current_price(self.__normalize_dollar_amount(current_close)) #update current price on trade - - self.current_positions[sym][signal_id]['position']['close'] = current_close ##Update close price for every iteration - self.current_positions[sym][signal_id]['market_value'] = market_value - - #update holdings - if 'exit_price' not in self.current_positions[sym][signal_id]: - new_weighted_holdings_entry[sym] += market_value #update the holdings value to the market value of position + left over allocated cash - - - #update positions - if 'exit_price' in self.current_positions[sym][signal_id]: #if position is closed, remove the signal from current_positions - #remove signal + current_close = self.calculate_close_on_position(self.current_positions[sym][signal_id]["position"]) + market_value = self.__normalize_dollar_amount( + self.current_positions[sym][signal_id]["quantity"] * current_close + ) + + self.trades_map[self.current_positions[sym][signal_id]["position"]["trade_id"]].update_current_price( + self.__normalize_dollar_amount(current_close) + ) # update current price on trade + + self.current_positions[sym][signal_id]["position"]["close"] = ( + current_close ##Update close price for every iteration + ) + self.current_positions[sym][signal_id]["market_value"] = market_value + + # update holdings + if "exit_price" not in self.current_positions[sym][signal_id]: + new_weighted_holdings_entry[sym] += ( + market_value # update the holdings value to the market value of position + left over allocated cash + ) + + # update positions + if ( + "exit_price" in self.current_positions[sym][signal_id] + ): # if position is closed, remove the signal from current_positions + # remove signal remove_signals.append(signal_id) - else: + else: new_positions_entry[sym][signal_id] = deepcopy(self.current_positions[sym][signal_id]) - - - #cleanup current_positions + + # cleanup current_positions for signal_id in remove_signals: del self.current_positions[sym][signal_id] - #update total weighted holdings - new_weighted_holdings_entry['total'] += new_weighted_holdings_entry[sym] - - #append the new holdings and positions to the list of all holdings and positions + # update total weighted holdings + new_weighted_holdings_entry["total"] += new_weighted_holdings_entry[sym] + + # append the new holdings and positions to the list of all holdings and positions self.all_positions.append(new_positions_entry) self.weighted_holdings.append(new_weighted_holdings_entry) self.current_cash[current_date] = current_cash - + def update_fill(self, fill_event: FillEvent): """ - Updates the portfolio current positions and holdings + Updates the portfolio current positions and holdings from a FillEvent. """ - if fill_event.type == 'FILL': + if fill_event.type == "FILL": self.update_positions_on_fill(fill_event) self.update_holdings_on_fill(fill_event) # check if fill_event has roll event ancestor. if so execute roll buy side - if fill_event.direction == FillDirection.SELL.value and fill_event.position is not None: + if fill_event.direction == FillDirection.SELL.value and fill_event.position is not None: roll_event = get_event_ancestor(fill_event, EventTypes.ROLL.value) if roll_event is not None: self.execute_roll_buy(roll_event) - - def calculate_close_on_position(self, position) -> float: + + def calculate_close_on_position(self, position) -> float: """ Calculate the close price on a position - the close price is the difference between the long and short legs of the position + the close price is the difference between the long and short legs of the position """ - return self.risk_manager.market_data.get_at_time_position_data(position['trade_id'], self.eventScheduler.current_date).get_price() + return self.risk_manager.market_data.get_at_time_position_data( + position["trade_id"], self.eventScheduler.current_date + ).get_price() - - - - # Getters + # Getters def get_weighted_holdings(self) -> pd.DataFrame: """ Converts `weighted_holdings` from a list of dictionaries to a Pandas DataFrame with datetime index. @@ -846,11 +1015,10 @@ def get_weighted_holdings(self) -> pd.DataFrame: pd.DataFrame: A time-series DataFrame of weighted holdings. """ df = pd.DataFrame(self.weighted_holdings) - df['datetime'] = pd.to_datetime(df['datetime']) # Ensure datetime format - df.set_index('datetime', inplace=True) # Set datetime as index - return df - - + df["datetime"] = pd.to_datetime(df["datetime"]) # Ensure datetime format + df.set_index("datetime", inplace=True) # Set datetime as index + return df + def get_all_positions(self) -> pd.DataFrame: """ Converts `all_positions` from a list of dictionaries to a Pandas MultiIndex DataFrame. @@ -862,83 +1030,84 @@ def get_all_positions(self) -> pd.DataFrame: records = [] # Temporary storage for DataFrame conversion all_positions_copy = deepcopy(self.all_positions) # Avoid modifying original list for position_dict in all_positions_copy: - dt = position_dict.pop('datetime', pd.to_datetime(0)) # Extract timestamp - for symbol, positions in position_dict.items(): #TODO:all positions structure now by signal, get symbol from position + dt = position_dict.pop("datetime", pd.to_datetime(0)) # Extract timestamp + for ( + symbol, + positions, + ) in position_dict.items(): # TODO:all positions structure now by signal, get symbol from position for signal_id, position in positions.items(): - records.append([ - dt, symbol, - position.get('position', {}).get('long', []), - position.get('position', {}).get('short', []), - position.get('position', {}).get('trade_id', None), - position.get('position', {}).get('close', None), - position.get('quantity', 0), - position.get('market_value', 0.0), - signal_id - ]) + records.append( + [ + dt, + symbol, + position.get("position", {}).get("long", []), + position.get("position", {}).get("short", []), + position.get("position", {}).get("trade_id", None), + position.get("position", {}).get("close", None), + position.get("quantity", 0), + position.get("market_value", 0.0), + signal_id, + ] + ) df = pd.DataFrame( records, columns=[ - 'datetime', - 'symbol', - 'long', - 'short', - 'trade_id', - 'close', - 'quantity', - 'market_value', - 'signal_id', + "datetime", + "symbol", + "long", + "short", + "trade_id", + "close", + "quantity", + "market_value", + "signal_id", ], ) - df.set_index(['datetime', 'symbol'], inplace=True) + df.set_index(["datetime", "symbol"], inplace=True) df.index = df.index.set_levels(pd.to_datetime(df.index.levels[0]), level=0) # Ensure datetime index return df - - - - def get_equity_curve(self) : + + def get_equity_curve(self): """ - create equity curve + create equity curve """ curve = pd.DataFrame(self.weighted_holdings) - curve.set_index('datetime', inplace=True) - curve['returns'] = curve['total'].pct_change() - curve['equity_curve'] = (1.0 + curve['returns']).cumprod() + curve.set_index("datetime", inplace=True) + curve["returns"] = curve["total"].pct_change() + curve["equity_curve"] = (1.0 + curve["returns"]).cumprod() return curve - - - def plot_portfolio(self, - benchmark: Optional[str] = 'SPY', - plot_bnchmk: Optional[bool] = True, - return_plot: Optional[bool] = False, - start_plot: Optional[str] = None, - **kwargs) -> Optional[plotly.graph_objects.Figure]: + def plot_portfolio( + self, + benchmark: Optional[str] = "SPY", + plot_bnchmk: Optional[bool] = True, + return_plot: Optional[bool] = False, + start_plot: Optional[str] = None, + **kwargs, + ) -> Optional[plotly.graph_objects.Figure]: """ Plots a graph of current porfolio metrics. These graphs are Equity Curve, Portfolio Drawdown, Trades, Periodic returns Plotting function is plotly. Through **kwargs, you can edit the subplot - + Parameters: benchmark (Optional[str]): Benchmark you would like to compare portfolio equity. Defaults to SPY plot_bnchmk (Optional[bool]): Optionality to plot a benchmark or not - return_plot Optional[bool]: Returns the plot object. User may opt for this if they plan to make further editing beyond **kwargs functionality. + return_plot Optional[bool]: Returns the plot object. User may opt for this if they plan to make further editing beyond **kwargs functionality. Note, best to designate this to a variable to avoid being displayed twice - Returns: + Returns: Plot: For further editing by the user """ - - stock = Stock(benchmark, run_chain = False) - data = stock.spot(ts = True, ts_start = self._equity.index[0], ts_end = self._equity.index[-1]) - data.rename(columns = {x:x.capitalize() for x in data.columns}, inplace= True) - data = data.asfreq('B', method = 'ffill') + + stock = Stock(benchmark, run_chain=False) + data = stock.spot(ts=True, ts_start=self._equity.index[0], ts_end=self._equity.index[-1]) + data.rename(columns={x: x.capitalize() for x in data.columns}, inplace=True) + data = data.asfreq("B", method="ffill") _bnch = data.fillna(0) eq = self._equity dd = self.dd(True) tr = self.trades.copy() - tr['Size'] = tr['Quantity'] - - return plot_portfolio(tr, eq, dd, _bnch,plot_bnchmk=plot_bnchmk, return_plot=return_plot, **kwargs) + tr["Size"] = tr["Quantity"] - - + return plot_portfolio(tr, eq, dd, _bnch, plot_bnchmk=plot_bnchmk, return_plot=return_plot, **kwargs) diff --git a/EventDriven/portfolio.py b/EventDriven/portfolio.py new file mode 100644 index 0000000..e9e5df9 --- /dev/null +++ b/EventDriven/portfolio.py @@ -0,0 +1,6 @@ +"""Compatibility shim for legacy imports. + +Importing from EventDriven.portfolio forwards to new_portfolio. +""" + +from .new_portfolio import * # noqa: F403 diff --git a/EventDriven/riskmanager/.decomm/base.py b/EventDriven/riskmanager/.decomm/base.py deleted file mode 100644 index 84758c0..0000000 --- a/EventDriven/riskmanager/.decomm/base.py +++ /dev/null @@ -1,1601 +0,0 @@ -## NOTE: -## 1) If a split happens during a backtest window, the trade id won't be updated. The dataframe will simply be uploaded with a the split adjusted strike. -## 2) All Greeks & Midpoint with Zero values will be FFWD'ed -## 3) Do something about all these caches locations. I don't like it. It's confusing - -from pprint import pprint -from .utils import * -from .utils import (logger, - get_timeseries_start_end, - set_deleted_keys, - add_skip_columns, - _clean_data, - PERSISTENT_CACHE, - dynamic_memoize, - get_use_temp_cache, - get_persistent_cache, - load_position_data, - enrich_data, - generate_spot_greeks, - parse_position_id) -from .actions import * -from .picker import * -from .sizer import BaseSizer, DefaultSizer, ZscoreRVolSizer -from .config import ffwd_data -from trade.helpers.helper import printmd, CustomCache, date_inbetween, compare_dates -from EventDriven.event import ( - RollEvent, - ExerciseEvent, - OrderEvent -) -import numpy as np -import os -from cachetools import cached, LRUCache -from EventDriven.execution import ExecutionHandler -from cachetools.keys import hashkey -import time -from cachetools import cachedmethod -from functools import lru_cache -from trade.assets.helpers.utils import (swap_ticker) -from dateutil.relativedelta import relativedelta -import yaml -from ._orders import resolve_schema -from EventDriven.riskmanager.picker.order_picker import OrderPicker -from EventDriven.riskmanager.market_timeseries import BacktestTimeseries - -## IMPORT FROM _vars -BASE = Path(os.environ["WORK_DIR"])/ ".riskmanager_cache" ## Main Cache for RiskManager -HOME_BASE = Path(os.environ["WORK_DIR"])/".cache" -BASE.mkdir(exist_ok=True) - -with open(f'{os.environ["WORK_DIR"]}/EventDriven/riskmanager/config.yaml', 'r') as f: - CONFIG = yaml.safe_load(f) - -order_cache = CustomCache(BASE, fname = "order") - - -def load_riskmanager_cache(): - - """ Load the risk manager cache based on the USE_TEMP_CACHE setting.""" - if get_use_temp_cache(): - logger.info("Using Temporary Cache for RiskManager") - spot_timeseries = CustomCache(BASE/"temp", fname = "rm_spot_timeseries", expire_days=100) - chain_spot_timeseries = CustomCache(BASE/"temp", fname = "rm_chain_spot_timeseries", expire_days=100) ## This is used for pricing, to account option strikes for splits - processed_option_data = CustomCache(BASE/"temp", fname = "rm_processed_option_data", expire_days=100) - position_data = CustomCache(BASE/"temp", fname = "rm_position_data", clear_on_exit=True) - dividend_timeseries = CustomCache(BASE/"temp", fname = "rm_dividend_timeseries", expire_days=100) - else: - spot_timeseries = CustomCache(BASE, fname = "rm_spot_timeseries", expire_days=100) - chain_spot_timeseries = CustomCache(BASE, fname = "rm_chain_spot_timeseries", expire_days=100) ## This is used for pricing, to account option strikes for splits - processed_option_data = CustomCache(BASE, fname = "rm_processed_option_data", expire_days=100) - position_data = CustomCache(BASE, fname = "rm_position_data", clear_on_exit=True) - dividend_timeseries = CustomCache(BASE, fname = "rm_dividend_timeseries", expire_days=100) - - ## Not dependent on USE_TEMP_CACHE, so always use the persistent cache. - splits_raw =CustomCache(HOME_BASE, fname = "split_names_dates", expire_days = 1000) - special_dividend = CustomCache(HOME_BASE, fname = 'special_dividend', expire_days=1000) ## Special dividend cache for handling special dividends - special_dividend['COST'] = { - '2020-12-01': 10, - '2023-12-27': 15 - } - - return (spot_timeseries, - chain_spot_timeseries, - processed_option_data, - position_data, - dividend_timeseries, - splits_raw, - special_dividend) - - - - -def get_order_cache(): - """ - Returns the order cache - """ - global order_cache - return order_cache - - - - -class RiskManager: - """ - RiskManager class for managing portfolio risk and executing strategies. - - Attributes: - ---------- - Core Attributes: - ---------------- - bars : Bars - The Bars object containing historical price data for the symbols. - events : Events - The Events object used for event-driven backtesting. - initial_capital : float - The initial capital allocated for the portfolio. - start_date : str | datetime - The start date for the backtest, recommended to match the start date of the Bars object. - end_date : str | datetime - The end date for the backtest, recommended to match the end date of the Bars object. - pm_start_date : str | datetime - The start date for the portfolio manager. - pm_end_date : str | datetime - The end date for the portfolio manager. - symbol_list : list[str] - List of symbols available in the Bars object. - OrderPicker : OrderPicker - The OrderPicker object used for selecting orders based on criteria. - - Cache Attributes: - ----------------- - spot_timeseries : CustomCache - Cache for storing the spot price timeseries data. - chain_spot_timeseries : CustomCache - Cache for storing the chain spot price timeseries data, used for pricing and accounting for option strikes during splits. - processed_option_data : CustomCache - Cache for storing processed individual option data. - position_data : CustomCache - Cache for storing position data. - dividend_timeseries : CustomCache - Cache for storing dividend timeseries data. - splits_raw : CustomCache - Cache for storing raw split names and dates. - splits : dict - Processed split data derived from splits_raw. - schema_cache : dict - Cache for storing schema-related data. - _order_cache : dict - Cache for storing order-related data. - id_meta : dict - Metadata for tracking IDs. - _analyzed_date_list : list - List of dates that have been analyzed for actions. - To re-analyze a date, it must be removed from this list. - - Risk Management Attributes: - --------------------------- - sizing_type : str - Specifies the sizing type for calculating quantities (e.g., 'delta', 'vega', 'gamma', 'price'). - sizing_lev : float - Multiplier for equity equivalent size (leverage). Default is 5.0. - limits : dict[str, bool] - Specifies which risk limits are enabled. - greek_limits : dict[str, dict] - Specifies the limits for individual Greeks (e.g., delta, gamma, vega, theta). - max_moneyness : float - Maximum moneyness before rolling positions. Default is 1.2. - max_dte_tolerance : int - Maximum days-to-expiration tolerance for options. Default is 90 days. - moneyness_width : float - Width of moneyness for filtering options. Default is 0.45. - max_slippage : float - Maximum allowable slippage for trades. Default is 0.25. - re_update_on_roll : bool - If True, the limits will be re-evaluated on roll events. Default is False. - - Pricing and Data Attributes: - ---------------------------- - price_on : str - Specifies the price type used for calculations (e.g., 'mkt_close'). Default is 'mkt_close'. - option_price : str - Specifies the option price used for pricing. Default is 'Midpoint'. Available options include: - 'Midpoint', 'Bid', 'Ask', 'Close', 'Weighted Midpoint'. - rf_timeseries : pd.Series - Risk-free rate timeseries data, retrieved using get_risk_free_rate_helper(). - unadjusted_signals : pd.DataFrame - Unadjusted signals for the risk manager, used for analysis and actions. - - Miscellaneous Attributes: - ------------------------- - data_managers : dict - Dictionary for managing data-related objects. - _actions : dict - Internal dictionary for storing actions related to risk management. - executor : ExecutionHandler - The execution handler responsible for executing trades. - t_plus_n : int - Settlement delay for orders (T+N). Default is 0, meaning no settlement delay. - """ - - def __init__(self, - bars: DataHandler, - events: EventScheduler, - initial_capital: int|float, - start_date: str|datetime, - end_date: str|datetime, - executor: ExecutionHandler, - unadjusted_signals: pd.DataFrame, - portfolio_manager: 'Portfolio' = None, - price_on = 'close', - option_price = 'Midpoint', - sizing_type = 'delta', - leverage = 5.0, - max_moneyness = 1.2, - t_plus_n = 0, - **kwargs - ): - """ - Methods: - -------- - __init__(self, bars: Bars, events: Events, initial_capital: float, start_date: str | datetime, end_date: str | datetime, - executor: ExecutionHandler, unadjusted_signals: pd.DataFrame, portfolio_manager: PortfolioManager = None, - price_on: str = 'mkt_close', option_price: str = 'Midpoint', sizing_type: str = 'delta', leverage: float = 5.0, - max_moneyness: float = 1.2, t_plus_n: int = 0, **kwargs): - Initializes the RiskManager class and sets up attributes for managing portfolio risk. - - Parameters: - ---------- - bars : Bars - The Bars object containing historical price data for the symbols. - events : Events - The Events object used for event-driven backtesting. - initial_capital : float - The initial capital allocated for the portfolio. - start_date : str | datetime - The start date for the backtest, recommended to match the start date of the Bars object. - end_date : str | datetime - The end date for the backtest, recommended to match the end date of the Bars object. - executor : ExecutionHandler - The execution handler responsible for executing trades. - unadjusted_signals : pd.DataFrame - Unadjusted signals for the risk manager, used for analysis and actions. - portfolio_manager : PortfolioManager, optional - The PortfolioManager object for managing portfolio positions and orders. Default is None. - price_on : str, optional - Specifies the price type used for calculations (e.g., 'mkt_close'). Default is 'mkt_close'. - option_price : str, optional - Specifies the option price used for pricing. Default is 'Midpoint'. Available options include: - 'Midpoint', 'Bid', 'Ask', 'Close', 'Weighted Midpoint'. - sizing_type : str, optional - Specifies the sizing type for calculating quantities (e.g., 'delta', 'vega', 'gamma', 'price'). Default is 'delta'. - leverage : float, optional - Multiplier for equity equivalent size (leverage). Default is 5.0. - Example: (Cash Available / Spot Price) * Leverage = Equity Equivalent Size. - max_moneyness : float, optional - Maximum moneyness before rolling positions. Default is 1.2. - t_plus_n : int, optional - Settlement delay for orders (T+N). Default is 0, meaning no settlement delay. - **kwargs : dict, optional - Additional keyword arguments for customization. Expected keys include: - - `max_dte_tolerance` (int): Maximum days-to-expiration tolerance for options. Default is 90 days. - - `moneyness_width` (float): Width of moneyness for filtering options. Default is 0.45. - - `max_tries` (int): Maximum number of tries to resolve schema. Default is 20. - """ - - assert sizing_type in ['delta', 'vega', 'gamma', 'price'], f"Sizing Type {sizing_type} not recognized, expected 'delta', 'vega', 'gamma', or 'price'" - order_cache.clear() - global DELETED_KEYS - set_deleted_keys([]) ## Set the deletion keys for the cache - start, end = get_timeseries_start_end() - self.bars = bars - self.events = events - self.initial_capital = initial_capital - self.__pm = portfolio_manager - self.start_date = start - self.pm_start_date = start_date - self.pm_end_date = end_date - self.end_date = end - self.symbol_list = self.bars.symbol_list - self.order_picker = OrderPicker(start, end) - - ## Load data caches. USE_TEMP_CACHE == True means a reset every kernel refresh. Else persists over days. - ( - self.spot_timeseries, - self.chain_spot_timeseries, - self.processed_option_data, - self.position_data, - self.dividend_timeseries, - self.splits_raw, - self.special_dividends - ) = load_riskmanager_cache() - self.sizing_type = sizing_type - self.sizing_lev = leverage - self.limits = { - 'delta': True, - 'gamma': False, - 'vega': False, - 'theta': False, - 'dte': False, - 'moneyness': False - } - self.greek_limits = { - 'delta': {}, - 'gamma': {}, - 'vega': {}, - 'theta': {} - } - self.data_managers = {} - - ## Might want to make this changeable in future - self.rf_timeseries = get_risk_free_rate_helper()['annualized'] - self.price_on = price_on - self.max_moneyness = max_moneyness - self.option_price = option_price - self._actions = {} - self.splits = self.set_splits(self.splits_raw) - self.schema_cache = {} - self.max_dte_tolerance = kwargs.get('max_dte_tolerance', 90) ## Default is 90 days - self.otm_moneyness_width = kwargs.get('moneyness_width', 0.45) ## Default is 0.45 - self.itm_moneyness_width = kwargs.get('itm_moneyness_width', 0.45) ## Default is 0.45 - self.max_tries = kwargs.get('max_tries', 20) ## Default is 20 tries to resolve schema - self.__analyzed_date_list = [] ## List of dates that have been analyzed for actions - self._order_cache = {} - self.id_meta = {} - self.t_plus_n = t_plus_n ## T+N settlement for the orders, default is 0, meaning no settlement delay. Orders will be placed on the same day. - self.max_slippage = 0.25 - self.min_slippage = 0.16 - self.executor = executor - self.re_update_on_roll = False ## If True, the limits will be re-evaluated on roll events. Default is False - self.unadjusted_signals = unadjusted_signals ## Unadjusted signals for the risk manager, used for analysis and actions - self.__sizer = None - self.add_columns = [] - self.skip_adj_count = 0 ## Counter for skipped adjustments, used to skip adjustments for a certain number of times. - self.limits_meta = {} - self.market_data = BacktestTimeseries(_start=self.start_date, _end=self.end_date) - - @property - def option_data(self): - global close_cache - return close_cache - - - @property - def order_cache(self): - """ - Returns the order cache - """ - return self._order_cache - - @property - def sizer(self): - """ - Getter for the sizer - """ - if isinstance(self.__sizer, (BaseSizer, DefaultSizer, ZscoreRVolSizer)): - return self.__sizer - elif self.__sizer is None: - self.__sizer = DefaultSizer(pm=self.__pm, rm=self, sizing_lev=self.sizing_lev) - return self.__sizer - else: - raise TypeError("Sizer must be an instance of BaseSizer or its subclasses. Reset with None to use DefaultSizer.") - - @sizer.setter - def sizer(self, value): - """ - Setter for the sizer - """ - if isinstance(value, (BaseSizer, DefaultSizer, ZscoreRVolSizer)) or value is None: - self.__sizer = value - else: - raise TypeError("Sizer must be an instance of BaseSizer or its subclasses.") - - def clear_caches(self): - """ - Clears the spot, chain_spot, dividend caches - """ - self.spot_timeseries.clear() - self.chain_spot_timeseries.clear() - # self.position_data.clear() - self.dividend_timeseries.clear() - - def clear_core_data_caches(self): - """ - Clears the core data caches used by the RiskManager for a new run. - spot, chain_spot, processed_option_data, position_data - This only clears if USE_TEMP_CACHE is True else nothing happens - """ - if get_use_temp_cache(): - self.spot_timeseries.clear() - self.chain_spot_timeseries.clear() - self.processed_option_data.clear() - self.position_data.clear() - self.dividend_timeseries.clear() - get_persistent_cache().clear() ## Ensures any caching with `.memoize` is cleared as well. - else: - logger.critical("USE_TEMP_CACHE set to False. Cache will not be cleared") - - - @property - def pm(self): - return self.__pm - - @pm.setter - def pm(self, value): - self.__pm = value - - @property - def actions(self): - return pd.DataFrame(self._actions).T - - def submit_add_columns(self, columns: Tuple[str, str]): - """ - Submits additional columns to be added to the risk manager's data. - Args: - columns (Tuple[str, str]): A tuple containing the column names to be added. - Raises: - AssertionError: If the first column is not one of the recognized columns or if the second column is not in the ADD_COLUMNS_FACTORY. - """ - assert isinstance(columns, tuple) and len(columns) == 2, "columns must be a tuple of two strings" - assert columns[0] in ['Midpoint', 'Delta', 'Open', 'Close', 'Closeask', 'Closebid'], f"Column {columns[0]} not recognized, expected 'Midpoint', 'Delta', 'Open', 'Close', 'Closeask', or 'Closebid'" - assert columns[1] in ADD_COLUMNS_FACTORY.keys(), f"Column {columns[1]} not recognized, expected {ADD_COLUMNS_FACTORY.keys()}" - ## Check if the columns already exist in the add_columns list - if columns in self.add_columns: - logger.info(f"Column {columns} already exists in add_columns, skipping addition") - return - self.add_columns.append(columns) - - def set_splits(self, d): - """ - Setter for splits - """ - splits_dict = {} - for k, v in d.items(): - splits_dict[k] = [] - for d in v: - if date_inbetween(d[0], self.start_date, self.end_date): - splits_dict[k].append(d) - return splits_dict - - - def print_settings(self): - msg = f""" -Risk Manager Settings: -Start Date: {self.pm_start_date} -End Date: {self.pm_end_date} -Current Limits State (Position Adjusted when these thresholds are reached): - Delta: {self.limits['delta']} - Gamma: {self.limits['gamma']} - Vega: {self.limits['vega']} - Theta: {self.limits['theta']} - Roll On DTE: {self.limits['dte']} - Min DTE Threshold: {self.pm.min_acceptable_dte_threshold} - Roll On Moneyness: {self.limits['moneyness']} - Max Moneyness: {self.max_moneyness} -Quanitity Sizing Type: {self.sizing_type} - """ - print(msg) - - # @log_error_with_stack(logger) - # @log_time(time_logger) - def get_order(self, *args, **kwargs): - """ - Compulsory variables for OrderSchema: - signal_id: str: Unique identifier for the signal - date: str|datetime: Date for which the order is to be placed - tick: str: Ticker for the option contract - max_close: float: Maximum close price for the order - strategy: str: Strategy type - option_type: str: Option type - target_dte: int: Target days to expiration - structure_direction: str: Direction of the structure - - - Optional variables: - spread_ticks: int: Number of ticks for the spread, default is 1 - dte_tolerance: int: Tolerance for days to expiration, default is 60 - min_moneyness: float: Minimum moneyness for the order, default is 0.75 - max_moneyness: float: Maximum moneyness for the order, default is 1.25 - min_total_price: float: Minimum total price for the order, default is max_close/2 - - This function generates an order based on the provided parameters and returns it. - """ - ## Initialize the order cache if it doesn't exist - order_cache = self.order_cache - signalID = kwargs.pop('signal_id') - date = kwargs.get('date') - tick = kwargs.get('tick') - max_close = kwargs.get('max_close', 2.0) - option_strategy = kwargs.pop('strategy') - option_type = kwargs.pop('option_type') - structure_direction = kwargs.pop('structure_direction') - spread_ticks = kwargs.pop('spread_ticks', 1) - dte_tolerance = kwargs.pop('dte_tolerance', 60) - min_moneyness = kwargs.pop('min_moneyness', 0.75) - max_moneyness = kwargs.pop('max_moneyness', 1.25) - target_dte = kwargs.pop('target_dte') - min_total_price = kwargs.pop('min_total_price', max_close/2) - direction='LONG' if option_type == 'C' else 'SHORT' - - if is_USholiday(date): - logger.info(f"Date {date} is a US Holiday, skipping order generation") - return { - 'result': ResultsEnum.IS_HOLIDAY.value, - 'data': None - } - - - self.generate_data(tick) - spot = self.chain_spot_timeseries[tick][date] - - logger.info(f"## ***Signal ID: {signalID}***") - - ## I cannot calculate greeks here. I need option_data to be available first. - # order = self.OrderPicker.get_order(*args, **kwargs) - - ## Testing new order picker - schema = OrderSchema({ - "strategy": option_strategy, "option_type": option_type, "tick": tick, - "target_dte": target_dte, "dte_tolerance": dte_tolerance, - "structure_direction": structure_direction, "max_total_price": max_close, - "spread_ticks":spread_ticks, "min_moneyness": min_moneyness, "max_moneyness": max_moneyness, "increment": 0.5, - "min_total_price": min_total_price - }) - logger.info(f"Initial Schema on {date}: {schema}") - order = self.OrderPicker.get_order_new(schema, date, spot, print_url = False) - - ## Resolve the schema if the order is not successful - tries = 0 - while order['result'] != ResultsEnum.SUCCESSFUL.value: - logger.info(f"Failed to produce order with schema: {schema}, trying to resolve schema, on try {tries}") - pack = resolve_schema(schema, - tries = tries, - max_dte_tolerance = self.max_dte_tolerance, - max_close = self.pm.allocated_cash_map[tick]/100, - max_tries = self.max_tries, - otm_moneyness_width = self.otm_moneyness_width, - itm_moneyness_width = self.itm_moneyness_width) - schema, tries = pack - - if schema is False: - logger.info(f"Unable to resolve schema after {tries} tries, returning None") - self.schema_cache.setdefault(date, {}).update({signalID: schema}) - return { - 'result': ResultsEnum.NO_CONTRACTS_FOUND.value, - 'data': None - } - logger.info(f"Resolved Schema: {schema}, tries: {tries}") - order = self.OrderPicker.get_order_new(schema, date, spot, print_url = False) ## Get the order from the OrderPicker - - - self.schema_cache.setdefault(date, {}).update({signalID: schema}) ## Update the schema cache with the date and signalID - - - signal_meta = parse_signal_id(signalID) - logger.info(f"Order Produced: {order}") - - - if order['result'] == ResultsEnum.SUCCESSFUL.value: - print(f"\nOrder Received: {order}\n") - position_id = order['data']['trade_id'] - order['signal_id'] = signalID - order['direction'] = direction - - else: - print(f"\nOrder Failed: {order}\n") - logger.info(f"Signal ID: {signalID}, Unable to produce order, returning None") - return order - - logger.info(f"Position ID: {position_id}") - logger.info("Calculating Position Greeks") - self.calculate_position_greeks(position_id, kwargs['date']) - order = self.update_order_close(position_id, kwargs['date'], order) ## Update the order with the close price from the position data - logger.info('Updating Signal Limits') - self.sizer.update_delta_limit(signalID, position_id, date) - - ## Hack to get limit meta - self.store_limits_meta(signalID, position_id, date) - logger.info("Calculating Quantity") - quantity = self.sizer.calculate_position_size(signalID, position_id, order['data']['close'], kwargs['date']) - logger.info(f"Quantity for Position ({position_id}) Date {kwargs['date']}, Signal ID {signalID} is {quantity}") - order['data']['quantity'] = quantity - order['data']['cash_equivalent_qty'] = self.pm.allocated_cash_map[tick] // (order['data']['close'] * 100) - logger.info(order) - - ## save the order in the cache - if date not in order_cache: - cache_dict = {tick: order} - order_cache[date] = cache_dict - else: - cache_dict = order_cache[date] - cache_dict[tick] = order - order_cache[date] = cache_dict - - self.adjust_slippage(position_id, date) ## Adjust the slippage for the position based on the position data - - return order - - def store_limits_meta(self, signal_id, position_id, date): - """ - Stores the limits meta for the signal and position - """ - - delta = self.greek_limits['delta'].get(signal_id, None) - gamma = self.greek_limits['gamma'].get(signal_id, None) - vega = self.greek_limits['vega'].get(signal_id, None) - theta = self.greek_limits['theta'].get(signal_id, None) - - self.limits_meta[(signal_id, position_id, date)] = { - 'delta': delta, - 'gamma': gamma, - 'vega': vega, - 'theta': theta, - } - - def adjust_slippage(self, position_id, date): - position_data = self.position_data.get(position_id, None) - if position_data is None: - logger.error(f"Position Data for {position_id} not available, cannot adjust slippage") - return None - - if 'spread_ratio' in position_data: - spread_ratio = position_data['spread_ratio'][date] if position_data['spread_ratio'][date] else self.max_slippage - decided_slippage = min(spread_ratio, self.max_slippage) - logger.info(f"Position {position_id} on date {date} has spread ratio {spread_ratio}, adjusting slippage to {decided_slippage}") - self.executor.max_slippage_pct = decided_slippage - else: - logger.warning(f"Spread Ratio not available for position {position_id}, using default max slippage of {self.max_slippage}") - self.executor.max_slippage_pct = self.max_slippage - - ## Overriding to risk_manager set for now - self.executor.min_slippage_pct = self.min_slippage - self.executor.max_slippage_pct = self.max_slippage - - def update_order_close(self, position_id:str, date:str|datetime, order:dict)-> dict: - """ - Updates the close price of the order based on the position data. - Parameters: - position_id: str: ID of the position - date: str|datetime: Date for which the order is to be updated - order: dict: Order dictionary containing the order details - Returns: - dict: Updated order dictionary with the close price - """ - - skip = self.position_data[position_id]['Midpoint_skip_day'][date] - if skip: - self.skip_adj_count += 1 - - close = self.position_data[position_id]['Midpoint'].ewm(span = 3).mean()[date] if self.option_price == 'Midpoint' \ - else self.position_data[position_id][self.option_price.capitalize()][date] - logger.info(f"***TESTING WITH EWM PRICE*** Position ID: {position_id}, Date: {date} - Skipping Day, using EWM Price") - logger.info(f"OLD CLOSE: {order['data']['close']}, NEW CLOSE: {close}, PCT_CHANGE: {(close - order['data']['close'])/order['data']['close']*100:.2f}%") - else: - close = self.position_data[position_id][self.option_price.capitalize()][date] - order['data']['close'] = close - return order - - - def register_option_meta_frame( - self, - date: str|datetime, - trade_id:str, - ) -> None: - - ## Generate a DataFrame for each direction in the trade - trade_meta = self.parse_position_id(trade_id)[0] - direction_pair = self.id_meta.setdefault(trade_id, {'L': pd.DataFrame( - index = bus_range(self.pm_start_date, self.pm_end_date, freq='1d'), - ), 'S': pd.DataFrame( - index = bus_range(self.pm_start_date, self.pm_end_date, freq='1d'), - )}) - - ## Get split info - splits = self.splits - - ## Loop through each direction - for direction, details in trade_meta.items(): - direction_frame = direction_pair.get(direction, pd.DataFrame()) - - ## Loop through each option in the direction - for i, option in enumerate(details): - - ## First populate the Given Option Detail - direction_frame[i] = generate_option_tick_new(*option.values()) - tick = option['ticker'] - split_info = splits.get(tick, None) - if split_info is None: - continue - - ## If there is split info, we adjust - for split_meta in split_info: - if not compare_dates.is_after(split_meta[0], date): - continue - split_start, split_ratio = split_meta - new_details = deepcopy(option) - new_details['strike']/=split_meta[1] - direction_frame.loc[split_start:, i] = generate_option_tick_new(*new_details.values()) - - - # @log_time(time_logger) - # def calculate_position_greeks(self, positionID, date): - # """ - # Calculate the greeks of a position - - # date: Evaluation Date for the greeks (PS: This is not the pricing date) - # positionID: str: position string. (PS: This function assumes ticker for position is the same) - # """ - # logger.info(f"Calculate Greeks Dates Start: {self.start_date}, End: {self.end_date}, Position ID: {positionID}, Date: {date}") - # if positionID in self.position_data: - # ## If the position data is already available, then we can skip this step - # logger.info(f"Position Data for {positionID} already available, skipping calculation") - # return self.position_data[positionID] - # else: - # logger.critical(f"Position Data for {positionID} not available, calculating greeks. Load time ~2 minutes") - # ## Initialize the Long and Short Lists - # long = [] - # short = [] - # threads = [] - # thread_input_list = [ - # [], [], [], [], [], [] - # ] - - # date = pd.to_datetime(date) ## Ensure date is in datetime format - - # ## First get position info - # position_dict, positon_meta = self.parse_position_id(positionID) - - # ## Now ensure that the spot and dividend data is available - # for p in position_dict.values(): - # for s in p: - # self.generate_data(swap_ticker(s['ticker'])) - # ticker = swap_ticker(s['ticker']) - - # ## Get the spot, risk free rate, and dividend yield for the date - # s = self.chain_spot_timeseries[ticker] - # s0_close = self.spot_timeseries[ticker] - # r = self.rf_timeseries - # y = self.dividend_timeseries[ticker] - - - - # @log_time(time_logger) - # def get_timeseries(ids, s, r, y, s0_close, direction): - # logger.info("Calculate Greeks dates") - # logger.info(f"Start Date: {self.start_date}") - # logger.info(f"End Date: {self.end_date}") - # full_data = pd.DataFrame() - - # ##ids are a list of tuples, where each tuple is (option_id, shift) - # if ids[-1][0] in self.processed_option_data: - # ## Using -1 index because incases of split, the last id is the one that is subscribed to in the cache - # full_data = self.processed_option_data[ids[-1][0]] ## If the data is already available, then we can skip this step - # logger.info(f"Data for {ids[-1]} already available, skipping calculation") - - # else: - # logger.info(f"Data for {ids[-1]} not available, calculating greeks. Load time ~2 minutes") - # for id_set in ids: - # id, shift, start_date = id_set - # data_manager = OptionDataManager(opttick = id) - # self.data_managers[id] = data_manager ## Store the data manager for the option tick - # greeks = data_manager.get_timeseries(start = self.start_date, - # end = self.end_date, - # interval = '1d', - # type_ = 'greeks',).post_processed_data ## Multiply by the shift to account for splits - # greeks = greeks[greeks.index >= start_date] ## Filter the data to only include data after the start date - # greeks_cols = [x for x in greeks.columns if 'Midpoint' in x] - # greeks = greeks[greeks_cols] - # greeks[greeks_cols] = greeks[greeks_cols].replace(0, np.nan).fillna(method = 'ffill') ## FFill NaN values and 0 Values - # greeks.columns = [x.split('_')[1].capitalize() for x in greeks.columns] - - # spot = data_manager.get_timeseries(start = self.start_date, - # end = self.end_date, - # interval = '1d', - # type_ = 'spot', - # extra_cols=['bid', 'ask']).post_processed_data * shift ## Using chain spot data to account for splits - # spot = spot[spot.index >= start_date] ## Filter the data to only include data after the start date - # spot = spot[[self.option_price.capitalize()] + ['Closeask', 'Closebid']] - # data = greeks.join(spot) - # full_data = pd.concat([full_data, data], axis = 0) - # full_data = _clean_data(full_data) - # full_data = full_data[~full_data.index.duplicated(keep = 'last')] - # full_data['s'] = s - # full_data['r'] = r - # full_data['y'] = y - # full_data['s0_close'] = s0_close - # self.processed_option_data[ids[-1][0]] = full_data - # if direction == 'L': - # long.append(full_data) - # elif direction == 'S': - # short.append(full_data) - # else: - # raise ValueError(f"Position Type {_set[0]} not recognized") - - # return full_data - - - # ## Check for splits - # split = self.splits.get(ticker, []) - - # ## Calculating IVs & Greeks for the options - # for _set in positon_meta: - # # To-do: Thread thisto speed up the process - # ids = [(_set[1], 1, self.start_date)] - # if len(split) > 0: - # for i in split: - # split_date = i[0] - # if pd.to_datetime(split_date) < pd.to_datetime(date): ## Strike is already adjusted for the split - # continue - # shift = i[1] - # id = _set[1] - # meta = parse_option_tick(id) - # meta['strike'] = meta['strike'] / shift - # ids.append((generate_option_tick_new(*meta.values()), shift, split_date)) - # # data_manager = OptionDataManager(opttick = id) - - # for input, list_ in zip([ids, s, r, y, s0_close, _set[0]], thread_input_list): - # list_.append(input) - - - # runThreads(get_timeseries, thread_input_list) - # # return long - - # position_data = sum(long) - sum(short) - # position_data = position_data[~position_data.index.duplicated(keep = 'first')] - # position_data.columns = [x.capitalize() for x in position_data.columns] - # ## Retain the spot, risk free rate, and dividend yield for the position, after the greeks have been calculated & spread values subtracted - # position_data['s0_close'] = s0_close - # position_data['s'] = s - # position_data['r'] = r - # position_data['y'] = y - # position_data['spread'] = position_data['Closeask'] - position_data['Closebid'] ## Spread is the difference between the ask and bid prices - # position_data['spread_ratio'] = (position_data['spread'] / position_data['Midpoint'] ).abs().replace(np.inf, np.nan).fillna(0) ## Spread ratio is the spread divided by the midpoint price - # position_data = add_skip_columns(position_data, positionID, ['Delta', 'Gamma', 'Vega', 'Theta', 'Midpoint'], window = 20, skip_threshold=3) - # self.position_data[positionID] = position_data - - - def calculate_position_greeks(self, positionID, date): - """ - Calculate the greeks of a position - - date: Evaluation Date for the greeks (PS: This is not the pricing date) - positionID: str: position string. (PS: This function assumes ticker for position is the same) - """ - logger.info(f"Calculate Greeks Dates Start: {self.start_date}, End: {self.end_date}, Position ID: {positionID}, Date: {date}") - if positionID in self.position_data: - ## If the position data is already available, then we can skip this step - logger.info(f"Position Data for {positionID} already available, skipping calculation") - return self.position_data[positionID] - else: - logger.critical(f"Position Data for {positionID} not available, calculating greeks. Load time ~5 minutes") - ## Initialize the Long and Short Lists - long = [] - short = [] - threads = [] - thread_input_list = [ - [], [] - ] - - date = pd.to_datetime(date) ## Ensure date is in datetime format - - - ## First get position info - position_dict, positon_meta = self.parse_position_id(positionID) - - ## Now ensure that the spot and dividend data is available - for p in position_dict.values(): - for s in p: - self.generate_data(swap_ticker(s['ticker'])) - ticker = swap_ticker(s['ticker']) - if ticker not in self.spot_timeseries: - self.spot_timeseries[ticker] = self.pm.get_underlier_data(ticker).spot( - ts = True, - ts_start = self.start_date, - ts_end = self.end_date, - ) - - if ticker not in self.chain_spot_timeseries: - self.chain_spot_timeseries[ticker] = self.pm.get_underlier_data(ticker).spot( - ts = True, - ts_start = self.start_date, - ts_end = self.end_date, - spot_type = 'chain_price' - ) - - if ticker not in self.dividend_timeseries: - self.dividend_timeseries[ticker] = self.pm.get_underlier_data(ticker).div_yield_history(start = self.start_date) - - - @log_time(time_logger) - def get_timeseries(_id, direction): - logger.info("Calculate Greeks dates") - logger.info(f"Start Date: {self.start_date}") - logger.info(f"End Date: {self.end_date}") - - logger.info(f"Calculating Greeks for {_id} on {date} in {direction} direction") - data = self.generate_option_data_for_trade(_id, date) ## Generate the option data for the trade - - if direction == 'L': - long.append(data) - elif direction == 'S': - short.append(data) - else: - raise ValueError(f"Position Type {_set[0]} not recognized") - - return data - - ## Calculating IVs & Greeks for the options - for _set in positon_meta: - thread_input_list[0].append(_set[1]) ## Append the option id to the thread input list - thread_input_list[1].append(_set[0]) ## Append the direction to the thread input list - runThreads(get_timeseries, thread_input_list, block=True) ## Run the threads to get the timeseries data for the options - - position_data = sum(long) - sum(short) - position_data = position_data[~position_data.index.duplicated(keep = 'first')] - position_data.columns = [x.capitalize() for x in position_data.columns] - ## Retain the spot, risk free rate, and dividend yield for the position, after the greeks have been calculated & spread values subtracted - position_data['s0_close'] = self.spot_timeseries[ticker] ## Spot price at the time of the position - position_data['s'] = self.chain_spot_timeseries[ticker] ## Chain spot price at the time of the position - position_data['r'] = self.rf_timeseries ## Risk free rate at the time of the position - position_data['y'] = self.dividend_timeseries[ticker] ## Dividend yield at the time of the position - position_data['spread'] = position_data['Closeask'] - position_data['Closebid'] ## Spread is the difference between the ask and bid prices - - ## PRICE_ON_TO_DO: No need to change - ## Add the additional columns to the position data - position_data['spread_ratio'] = (position_data['spread'] / position_data['Midpoint'] ).abs().replace(np.inf, np.nan).fillna(0) ## Spread ratio is the spread divided by the midpoint price - position_data = add_skip_columns(position_data, positionID, ['Delta', 'Gamma', 'Vega', 'Theta', 'Midpoint'], window = 20, skip_threshold=3) - self.position_data[positionID] = position_data - - return position_data - - - def load_position_data(self, opttick) -> pd.DataFrame: - """ - Load position data for a given option tick. - - This function ONLY retrives the data for the option tick, it does not apply any splits or adjustments. - This function will NOT check for splits or special dividends. It will only retrieve the data for the given option tick. - """ - ## Get Meta - meta = parse_option_tick(opttick) - return load_position_data(opttick, - self.processed_option_data, - self.start_date, - self.end_date, - s=self.chain_spot_timeseries[meta['ticker']], - r=self.rf_timeseries, - y=self.dividend_timeseries[meta['ticker']], - s0_close=self.spot_timeseries[meta['ticker']],) - - - - def enrich_data(self, data, ticker) -> pd.DataFrame: - """ - Enrich the data with additional information. - """ - return enrich_data(data, ticker, self.spot_timeseries, self.chain_spot_timeseries, self.rf_timeseries, self.dividend_timeseries) - - def generate_spot_greeks(self, opttick) -> pd.DataFrame: - """ - Generate spot greeks for a given option tick. - """ - ## PRICE_ON_TO_DO: NO NEED TO CHANGE. This is necessary retrievals - return generate_spot_greeks(opttick, self.start_date, self.end_date) - - def append_option_data(self, - option_id: str=None, - position_data: pd.DataFrame=None, - data_pack: dict|CustomCache=None,): - """ - Append option data to the processed_position_data cache. - Parameters: - position_id: str: ID of the position - position_data: pd.DataFrame: DataFrame containing the position data - data_pack: dict|CustomCache: Data pack containing the position data - """ - if option_id: - assert position_data is not None, "position_data must be provided if option_id is given" - self.processed_option_data[option_id] = position_data - - elif data_pack: - # assert isinstance(data_pack, (dict, CustomCache)), "data_pack must be a dict or CustomCache" - for k, v in data_pack.items(): - self.processed_option_data[k] = v - - elif isinstance(data_pack, (CustomCache, dict)): - for k, v in data_pack.items(): - self.processed_option_data[k] = v - - else: - raise ValueError("Either option_id or data_pack must be provided to append_position_data") - - def append_position_data(self, - position_id: str=None, - position_data: pd.DataFrame=None, - data_pack: dict|CustomCache=None,): - """ - Append position data to the position_data cache. - Parameters: - position_id: str: ID of the position - position_data: pd.DataFrame: DataFrame containing the position data - data_pack: dict|CustomCache: Data pack containing the position data - """ - if position_id: - assert position_data is not None, "position_data must be provided if position_id is given" - self.position_data[position_id] = position_data - - elif data_pack: - assert isinstance(data_pack, (dict, CustomCache)), "data_pack must be a dict or CustomCache" - for k, v in data_pack.items(): - self.position_data[k] = v - - else: - raise ValueError("Either option_id or data_pack must be provided to append_position_data") - - - - def generate_option_data_for_trade(self, opttick, check_date) -> pd.DataFrame: - """ - Generate option data for a given trade. - This function retrieve the option data to backtest on. Data will not be saved, as it will be applying splits and adjustments. - This function is written with the assumption that there is no cummulative splits. Expectation is only one split per option tick. - Obviously, this might not be the case if the option was alive for ~5 years or more. But most options are not alive for that long. - """ - - meta = parse_option_tick(opttick) - - ## Check if there's any split/special dividend - splits = self.splits.get(meta['ticker'], []) - dividends = self.special_dividends.get(meta['ticker'], {}) - to_adjust_split = [] - - ## To avoid loading multiple data to account for splits everytime, we check if the PM_date range includes the split date - for pack in splits: - if compare_dates.inbetween( - pack[0], - self.pm_start_date, - self.pm_end_date, - ): - pack = list(pack) ## Convert to list to append later - pack.append('SPLIT') - to_adjust_split.append(pack) - - for pack in dividends.items(): - if compare_dates.inbetween( - pack[0], - self.pm_start_date, - self.pm_end_date, - ): - pack = list(pack) - pack.append('DIVIDEND') - to_adjust_split.append(pack) - - ## Sort the splits by date - to_adjust_split.sort(key=lambda x: x[0]) ## Sort by date - logger.info(f"Splits and Dividends to adjust for {opttick}: {to_adjust_split} range: {self.pm_start_date} to {self.pm_end_date}") - logger.info(f"Splits and Dividends to adjust for {opttick}: {to_adjust_split} range: {self.pm_start_date} to {self.pm_end_date}") - - ## If there are no splits, we can just load the data - if not to_adjust_split: - data = self.load_position_data(opttick).copy() ## Copy to avoid modifying the original data - return data[(data.index >= pd.to_datetime(self.pm_start_date) - relativedelta(months = 3))\ - & (data.index<= pd.to_datetime(self.pm_end_date) + relativedelta(months = 3))] - - # If there are splits, we need to load the data for each tick after adjusting strikes - else: - adj_meta = meta.copy() - adj_strike = meta['strike'] - logger.info(f"Generating data for {opttick} with splits: {to_adjust_split}") - ## Load the data for picked option first - first_set_data = self.load_position_data(opttick).copy() ## Copy to avoid modifying the original data - if compare_dates.is_before(check_date, to_adjust_split[0][0]): - first_set_data = first_set_data[first_set_data.index < to_adjust_split[0][0]] - else: - first_set_data = first_set_data[first_set_data.index >= to_adjust_split[0][0]] - - segments = [] - - for event_date, factor, event_type in to_adjust_split: - if compare_dates.is_before(check_date, event_date): - # You're in the PRE-event regime - if event_type == 'SPLIT': - adj_strike /= factor - elif event_type == 'DIVIDEND': - adj_strike -= factor - else: - # You're in the POST-event regime - if event_type == 'SPLIT': - adj_strike *= factor - elif event_type == 'DIVIDEND': - adj_strike += factor - - adj_opttick = generate_option_tick_new( - symbol=adj_meta['ticker'], - strike=adj_strike, - right=adj_meta['put_call'], - exp=adj_meta['exp_date'] - ) - logger.info(f"Adjusted option tick: {adj_opttick} for event {event_type} on {event_date} with factor {factor}") - - # Load adjusted data - if adj_opttick not in self.processed_option_data: - adj_data = self.load_position_data(adj_opttick).copy() - else: - adj_data = self.processed_option_data[adj_opttick] - - # Slice around the event - if compare_dates.is_before(check_date, event_date): - adj_data = adj_data[adj_data.index >= event_date] - else: - adj_data = adj_data[adj_data.index < event_date] - - # Apply price transformation if SPLIT - ## PRICE_ON_TO_DO: No need to change this. These are necessary columns - if event_type == 'SPLIT': - cols = ['Midpoint', 'Closeask', 'Closebid'] - if compare_dates.is_before(check_date, event_date): - adj_data[cols] *= factor - else: - adj_data[cols] /= factor - - segments.append(adj_data) - - - base_data = self.load_position_data(opttick).copy() - first_event_date = to_adjust_split[0][0] if to_adjust_split else self.pm_start_date - if compare_dates.is_before(check_date, first_event_date): - base_data = base_data[base_data.index < first_event_date] - - else: - base_data = base_data[base_data.index >= first_event_date] - - segments.insert(0, base_data) - final_data = pd.concat(segments).sort_index() - final_data = final_data[~final_data.index.duplicated(keep='last')] - - ## Leave residual data outside the PM date range - final_data = final_data[(final_data.index >= pd.to_datetime(self.pm_start_date) - relativedelta(months = 3)) & \ - (final_data.index <= pd.to_datetime(self.pm_end_date) + relativedelta(months = 3))] - return final_data - - @log_time(time_logger) - def update_greek_limits(self, signal_id, position_id) -> None: - """ - Updates the limits associated with a signal - ps: This should only be updated on first purchase of the signal - Limits are saved in absolute values to account for both long and short positions - - """ - - if signal_id in self.greek_limits['delta'] and not self.re_update_on_roll: ## May consider to maximize cash on roll - logger.info(f"Greek Limits for Signal ID: {signal_id} already updated, skipping") - return - logger.info(f"Updating Greek Limits for Signal ID: {signal_id} and Position ID: {position_id}") - id_details = parse_signal_id(signal_id) - cash_available = self.pm.allocated_cash_map[swap_ticker(id_details['ticker'])] - delta_at_purchase = self.position_data[position_id]['Delta'][id_details['date']] - s0_at_purchase = self.position_data[position_id]['s'][id_details['date']] ## As always, we use the chain spot data to account for splits - equivalent_delta_size = ((cash_available/s0_at_purchase)/100) * self.sizing_lev - self.greek_limits['delta'][signal_id] = abs(equivalent_delta_size) - logger.info(f"Spot Price at Purchase: {s0_at_purchase} at time {id_details['date']}") - logger.info(f"Delta at Purchase: {delta_at_purchase}") - logger.info(f"Equivalent Delta Size: {equivalent_delta_size}, with Cash Available: {cash_available}, and Leverage: {self.sizing_lev}") - logger.info(f"Equivalent Delta Size: {equivalent_delta_size}") - - def calculate_quantity(self, positionID, signalID, date, opt_price) -> int: - """ - Returns the quantity of the position that can be bought based on the sizing type - """ - logger.info(f"Calculating Quantity for Position ID: {positionID} and Signal ID: {signalID} on Date: {date}") - if positionID not in self.position_data: ## If the position data isn't available, calculate the greeks - self.calculate_position_greeks(positionID, date) - - ## First get position info and ticker - position_dict, _ = self.parse_position_id(positionID) - key = list(position_dict.keys())[0] - ticker = swap_ticker(position_dict[key][0]['ticker']) - - ## Now calculate the max size cash can buy - cash_available = self.pm.allocated_cash_map[ticker] - purchase_date = pd.to_datetime(date) - s0_at_purchase = self.position_data[positionID]['s'][purchase_date] ## s -> chain spot, s0_close -> adjusted close - logger.info(f"Spot Price at Purchase: {s0_at_purchase} at time {purchase_date}") - logger.info(f"Cash Available: {cash_available}, Option Price: {opt_price}, Cash_Available/OptPRice: {(cash_available/(opt_price*100))}") - max_size_cash_can_buy = abs(math.floor(cash_available/(opt_price*100))) ## Assuming Allocated Cash map is already in 100s - - if self.sizing_type == 'price': - return max_size_cash_can_buy - - elif self.sizing_type.capitalize() == 'Delta': - delta = self.position_data[positionID]['Delta'][purchase_date] - if signalID not in self.greek_limits['delta']: - self.update_greek_limits(signalID,positionID ) - target_delta = self.greek_limits['delta'][signalID] - logger.info(f"Target Delta: {target_delta}") - delta_size = (math.floor(target_delta/abs(delta))) - logger.info(f"Delta from Full Cash Spend: {max_size_cash_can_buy * delta}, Size: {max_size_cash_can_buy}") - logger.info(f"Delta with Size Limit: {delta_size * delta}, Size: {delta_size}") - return delta_size if abs(delta_size) <= abs(max_size_cash_can_buy) else max_size_cash_can_buy - - elif self.sizing_type.capitalize() in ['Gamma', 'Vega']: - raise NotImplementedError(f"Sizing Type {self.sizing_type} not yet implemented, please use 'delta' or 'price'") - - else: - raise ValueError(f"Sizing Type {self.sizing_type} not recognized") - - def analyze_position(self): - """ - Analyze the current positions and determine if any need to be rolled, closed, or adjusted - """ - position_action_dict = {} ## This will be used to store the actions for each position - date = pd.to_datetime(self.pm.eventScheduler.current_date) - if date in self.__analyzed_date_list: ## If the date has already been analyzed, return - logger.info(f"Positions already analyzed on {date}, skipping") - return "ALREADY_ANALYZED" - - self.__analyzed_date_list.append(date) ## Add the date to the analyzed list - event_date = pd.to_datetime(date) + BDay(self.t_plus_n) ## Order date is the next business day after the current date - logger.info(f"Analyzing Positions on {date}") - is_holiday = is_USholiday(date) - if is_holiday: - self.pm.logger.warning(f"Market is closed on {date}, skipping") - logger.info(f"Market is closed on {date}, skipping") - return "IS_HOLIDAY" - - ## First check if the position needs to be rolled - if self.limits['dte']: - roll_dict = self.dte_check() - else: - logger.info("Roll Check Not Enabled") - roll_dict = {} - for sym in self.pm.symbol_list: - current_position = self.pm.current_positions[sym] - if 'position' not in current_position: - continue - roll_dict[current_position['position']['trade_id']] = HOLD(current_position['position']['trade_id']) - - logger.info(f"Roll Dict {roll_dict}") - - ## Check if the position needs to be adjusted based on moneyness - if self.limits['moneyness']: - moneyness_dict = self.moneyness_check() - else: - logger.info("Moneyness Check Not Enabled") - moneyness_dict = {} - for sym in self.pm.symbol_list: - current_position = self.pm.current_positions[sym] - if 'position' not in current_position: - continue - moneyness_dict[current_position['position']['trade_id']] = HOLD(current_position['position']['trade_id']) - logger.info(f"Moneyness Dict: {moneyness_dict}") - - ## Check if the position needs to be adjusted based on greeks - greek_dict = self.limits_check() - logger.info(f"Greek Dict {greek_dict}") - - check_dicts = [roll_dict, moneyness_dict, greek_dict] - all_empty = all([len(x)==0 for x in check_dicts]) - - if all_empty: ## Return if all are empty - self.pm.logger.info(f"No positions need to be adjusted on {date}") - print(f"No positions need to be adjusted on {date}") - return "NO_POSITIONS_TO_ADJUST" - - actions_dicts = { - 'dte': roll_dict, - 'moneyness': moneyness_dict, - 'greeks': greek_dict - } - ## Aggregate the results - trades_df = self.unadjusted_signals - bars_trade = self.bars.trades_df - for sym in self.pm.symbol_list: - position = self.pm.current_positions[sym] - for signal_id, current_position in position.items(): - if 'position' not in current_position: - continue - k = current_position['position']['trade_id'] - exit_signal_date = trades_df[trades_df['signal_id'] == signal_id].ExitTime.values[0] ## This is not look ahead because Signal is gotten on bars_df - t_plus_n - entry_signal_date = trades_df[trades_df['signal_id'] == signal_id].EntryTime.values[0] ## This is not look ahead because Signal is gotten on bars_df - t_plus_n - exit_date, entry_date = bars_trade[bars_trade['signal_id'] == signal_id].ExitTime.values[0], bars_trade[bars_trade['signal_id'] == signal_id].EntryTime.values[0] - if compare_dates.is_on_or_after(date, exit_signal_date) or compare_dates.is_on_or_before(date, entry_date): - logger.info(f"Position has exited on {exit_signal_date} or not yet entered on {entry_date}, skipping") - continue - - - ## There are 4 possible actions: roll, Hold, Exercise, Adjust - ## Roll happens on DTE & Moneyness. Exercise happens on DTE. Adjust happens on Greeks - actions = [] - reasons = [] - for action in actions_dicts: - if k in actions_dicts[action]: - actions.append(actions_dicts[action][k]) - reasons.append(action) - else: - actions.append(EventTypes.HOLD.value) - reasons.append('hold') - - sub_action_dict = {'action': '', 'quantity_diff': 0} - - ## If the position needs to be rolled or exercised, do that first, no need to check other actions or adjust quantity - if EventTypes.ROLL.value in actions: - pos_action = ROLL(k, {}) - pos_action.reason = reasons[actions.index(EventTypes.ROLL.value)] - - event = RollEvent( - datetime = event_date, - symbol = sym, - signal_type = parse_signal_id(signal_id)['direction'], - position = current_position, - signal_id = signal_id - - ) - pos_action.event = event - position_action_dict[k] = pos_action - continue - - ## If exercise is needed, do that first, no need to check other actions or adjust quantity - elif EventTypes.EXERCISE.value in actions: - pos_action = EXERCISE(k, {}) - pos_action.reason = reasons[actions.index(EventTypes.EXERCISE.value)] - long_premiums, short_premiums = self.pm.get_premiums_on_position(current_position['position'], date) - - event = ExerciseEvent( - datetime = date, ## Exercise happens on the same day as the action. - symbol = sym, - quantity = current_position['quantity'], - entry_date = date, - spot = self.chain_spot_timeseries[sym][date], ## Using chain spot because strikes are unadjusted for splits - long_premiums = long_premiums, - short_premiums = short_premiums, - position = current_position, - signal_id = signal_id - - ) - pos_action.event = event - sub_action_dict[k] = pos_action - - continue - - - ## If the position is a hold, check if it needs to be adjusted based on greeks - elif EventTypes.HOLD.value in actions: - pos_action = HOLD(k) - pos_action.reason = None - position_action_dict[k] = pos_action - - quantity_change_list = [0] ## Initialize the quantity change list with 0 - value = greek_dict.get(k, {}) ## Get the greek dict for each position - for greek, res in value.items(): ## Looping through each greek adjustments - quantity_change_list.append(res['quantity_diff']) - sub_action_dict['quantity_diff'] = min(quantity_change_list) ## Ultimate adjustment would be the minimum reduction factor because they're all negative values - if sub_action_dict['quantity_diff'] < 0: ## If the quantity needs to be reduced, set the action to adjust - pos_action = ADJUST(k, sub_action_dict) - pos_action.reason = "greek_limit" - - event = OrderEvent( - symbol = sym, - datetime = event_date, - order_type = 'MKT', - quantity= abs(sub_action_dict['quantity_diff']), - direction = 'SELL' if sub_action_dict['quantity_diff'] < 0 else 'BUY', - position = current_position['position'], - signal_id = signal_id - ) - pos_action.event = event - position_action_dict[k] = pos_action ## If adjust position, override HOLD. - self._actions[date] = position_action_dict - logger.info(f"Position Action Dict: {position_action_dict}") - for id, action in position_action_dict.items(): - logger.info(f"Position ID: {id}, Action: {action}, Reason: {action.reason}") - if not isinstance(action, HOLD): - logger.info(f"Event: {action.event}") - logger.info((f"Risk Manager Scheduling Action: Position ID: {id}, Action: {action}, Reason: {action.reason}")) - self.pm.eventScheduler.schedule_event(event_date, action.event) - - return position_action_dict - - - - - - def limits_check(self): - limits = self.limits - delta_limit = limits['delta'] - position_limit = {} - - date = pd.to_datetime(self.pm.eventScheduler.current_date) - if is_USholiday(date): - self.pm.logger.warning(f"Market is closed on {date}, skipping") - return - - for symbol in self.pm.symbol_list: - position = self.pm.current_positions[symbol] - for signal_id, current_position in position.items(): - if 'position' not in current_position: - continue - logger.info(f"Checking Position {current_position['position']['trade_id']} for Greek Limits on {date}") - trade_id = current_position['position']['trade_id'] - quantity = current_position['quantity'] - signal_id = signal_id - max_delta = self.greek_limits['delta'][signal_id] - pos_data = self.position_data[trade_id] - - status = {'status': False, 'quantity_diff': 0} - greek_limit_bool = dict(delta=status, gamma=status, vega=status, theta=status) - - if delta_limit: - delta_val = abs(pos_data.at[date, 'Delta']) - skip = pos_data.at[date, 'Delta_skip_day'] if 'Delta_skip_day' in pos_data.columns else False - - if skip or delta_val == 0: - continue - - current_delta = delta_val * quantity - if current_delta > max_delta: - # Compute how many contracts to reduce - required_quantity = max(int(max_delta // delta_val), 1) ## Ensure at least 1 contract is required. If last contract exceeds delta limit, we will still hold it. - quantity_diff = required_quantity - quantity - logger.info(f"Position {trade_id} exceeds delta limit. Current Delta: {current_delta}, Max Delta: {max_delta}, Required Quantity: {required_quantity}, Current Quantity: {quantity}") - greek_limit_bool['delta'] = {'status': True, 'quantity_diff': quantity_diff} - - position_limit[trade_id] = greek_limit_bool - - return position_limit - - - - - def dte_check(self): - """ - Analyze the current positions and determine if any need to be rolled - """ - date = pd.to_datetime(self.pm.eventScheduler.current_date) - logger.info(f"Checking DTE on {date}") - if is_USholiday(date): - self.pm.logger.warning(f"Market is closed on {date}, skipping") - return - - roll_dict = {} - for symbol in self.pm.symbol_list: - position = self.pm.current_positions[symbol] - for signal_id, current_position in position.items(): - if 'position' not in current_position: - continue - - logger.info(f"Checking Position {current_position['position']['trade_id']} for DTE on {date}") - id = current_position['position']['trade_id'] - expiry_date = '' - - if 'long' in current_position['position']: - for option_id in current_position['position']['long']: - option_meta = parse_option_tick(option_id) - expiry_date = option_meta['exp_date'] - break - elif 'short' in current_position['position']: - for option_id in current_position['position']['short']: - option_meta = parse_option_tick(option_id) - expiry_date = option_meta['exp_date'] - break - - - dte = (pd.to_datetime(expiry_date) - pd.to_datetime(date)).days - logger.info(f"ID: {id}, DTE: {dte}, Expiry: {expiry_date}, Date: {date}") - - if symbol in self.pm.roll_map and dte <= self.pm.roll_map[symbol]: - logger.info(f"{id} rolling because {dte} <= {self.pm.roll_map[symbol]}") - roll_dict[id] = EventTypes.ROLL.value - elif symbol not in self.pm.roll_map and dte == 0: # exercise contract if symbol not in roll map - logger.info(f"{id} exercising because {dte} == 0") - roll_dict[id] = EventTypes.EXERCISE.value - else: - logger.info(f"{id} holding because {dte} > {self.pm.roll_map[symbol]}") - roll_dict[id] = EventTypes.HOLD.value - return roll_dict - - def moneyness_check(self): - """ - Analyze the current positions and determine if any need to be rolled based on moneyness - """ - date = pd.to_datetime(self.pm.eventScheduler.current_date) - logger.info(f"Checking Moneyness on {date}") - if is_USholiday(date): - self.pm.logger.warning(f"Market is closed on {date}, skipping") - return - - - roll_dict = {} - for symbol in self.pm.symbol_list: - strike_list = [] - position = self.pm.current_positions[symbol] - for signal_id, current_position in position.items(): - if 'position' not in current_position: - continue - - logger.info(f"Checking Position {current_position['position']['trade_id']} for Moneyness on {date}") - id = current_position['position']['trade_id'] - try: - entry_date = self.pm.trades_map[id].entry_date - except Exception as e: - logger.error(f"Error getting entry date for position {id}: {e}") - entry_date = date - spot = self.chain_spot_timeseries[symbol][date] ## Use the spot price on the date (from chain cause of splits) - - if 'long' in current_position['position']: - for option_id in current_position['position']['long']: - option_meta = self.adjust_for_events(entry_date, date, parse_option_tick(option_id)) - strike_list.append(option_meta['strike']/spot if option_meta['put_call'] == 'P' else spot/option_meta['strike']) - - if 'short' in current_position['position']: - for option_id in current_position['position']['short']: - option_meta = self.adjust_for_events(entry_date, date, parse_option_tick(option_id)) - strike_list.append(option_meta['strike']/spot if option_meta['put_call'] == 'P' else spot/option_meta['strike']) - - logger.info(f"{id} moneyness list {strike_list}, spot: {spot}, date: {date}, entry_date: {entry_date}") - logger.info(f"{id} moneyness bool list {[x > self.max_moneyness for x in strike_list]}") - - roll_dict[id] = EventTypes.ROLL.value if any([x > self.max_moneyness for x in strike_list]) else EventTypes.HOLD.value - return roll_dict - - def hedge_check(self, - hedge_func: callable, - hedge_args: list, - hedge_kwargs: dict, - ) -> dict: - """ - Responsible for checking if the hedge is needed and if so, queueing in analyze_position - Hedge function should allow 1st argument to be Risk Manager and 2nd argument to be Portfolio Manager - Expected return type is: List[HEDGE]. Where HEDGE is a subclass of RMAction - - params: - hedge_func: callable: function to be called for the hedge - hedge_args: list: arguments to be passed to the hedge function - hedge_kwargs: dict: keyword arguments to be passed to the hedge function - - returns: - dict: dictionary of the hedge actions - """ - pass - - ## Lazy Loading Spot Data - def generate_data(self, symbol): - stk = self.pm.get_underlier_data(symbol) ## Performance isn't affected because of singletons in stock class - if symbol not in self.spot_timeseries: - self.spot_timeseries[symbol] = stk.spot( - ts = True, - ts_start = pd.to_datetime(self.start_date) - BDay(30), - ts_end = pd.to_datetime(self.end_date), - )[self.price_on] - - if symbol not in self.chain_spot_timeseries: - self.chain_spot_timeseries[symbol] = stk.spot( - ts = True, - spot_type = OptionModelAttributes.spot_type.value, - ts_start = pd.to_datetime(self.start_date) - BDay(30), - ts_end = pd.to_datetime(self.end_date), - )[self.price_on] - - if symbol not in self.dividend_timeseries: - divs = stk.div_yield_history(start = pd.to_datetime(self.start_date) - BDay(30)) - if not isinstance(divs, (pd.DataFrame, pd.Series)): ## When a ticker has no dividends, it returns None/0 - divs = pd.Series(divs, index = self.spot_timeseries[symbol].index) - self.dividend_timeseries[symbol] = divs - - def parse_position_id(self, positionID): - return parse_position_id(positionID) - - def get_position_dict(self, positionID): - return self.parse_position_id(positionID)[0] - - def get_position_list(self, positionID): - return self.parse_position_id(positionID)[1] - - def get_option_price(self, optID, date): - portfolio = self.pm - return portfolio.options_data[optID][self.option_price][date] - - def adjust_for_events( - self, - start: str, - date: str, - option: str|dict, - ): - """ - Adjusts the option tick for events like splits or dividends. - """ - if isinstance(option, str): - meta = parse_option_tick(option) - elif isinstance(option, dict): - meta = option - else: - raise ValueError("Option must be a string or a dictionary.") - split = self.splits.get(swap_ticker(meta['ticker']), None) - if split is None: - return meta - for pack in split: - if compare_dates.is_before(start, pack[0]) and compare_dates.is_after(date, pack[0]): - meta['strike'] /= pack[1] - return meta - - - diff --git a/EventDriven/riskmanager/.decomm/old_picker.py b/EventDriven/riskmanager/.decomm/old_picker.py deleted file mode 100644 index fe5ad4b..0000000 --- a/EventDriven/riskmanager/.decomm/old_picker.py +++ /dev/null @@ -1,250 +0,0 @@ -# import pandas as pd -# import numpy as np -# from dataclasses import dataclass -# from typing import Any, Dict -# from EventDriven.types import ResultsEnum -# from .utils import (logger, -# get_cache, -# LOOKBACKS, -# precompute_lookbacks, -# populate_cache_with_chain, -# time_logger, -# produce_order_candidates, -# refresh_cache, -# populate_cache, -# logger) -# from .utils import * -# from datetime import datetime, timedelta -# from trade.helpers.helper import CustomCache -# order_cache = CustomCache(BASE, fname = "order") - - - - -# # --------- OrderSchema --------- -# @dataclass -# class OrderSchema: -# data: Dict[str, Any] - -# def __post_init__(self): -# required = ["strategy", -# "option_type", -# "target_dte", -# "dte_tolerance", -# "structure_direction", -# "max_total_price", -# "min_total_price", -# "tick"] -# for key in required: -# if key not in self.data: -# raise ValueError(f"Missing required field: {key}") - -# if self.data["strategy"] == "vertical" and not ("spread_pct" in self.data or "spread_ticks" in self.data): -# raise ValueError("Vertical strategies require either 'spread_pct' or 'spread_ticks'") - -# optional = {"min_moneyness": 0.9, "max_moneyness": 1.1, "max_attempts": 3, "increment": 0.25} -# for key, default in optional.items(): -# if key not in self.data: -# self.data[key] = default - -# def __getitem__(self, key): -# return self.data[key] - -# def __contains__(self, key): -# return key in self.data - -# def __setitem__(self, key, value): -# if key not in self.data: -# raise KeyError(f"Key '{key}' not found in OrderSchema.") -# self.data[key] = value - -# def __repr__(self): -# return repr(self.data) - -# def get(self, key, default=None): -# return self.data.get(key, default) - -# # --------- Utilities --------- -# def resolve_ordering(option_type, structure_direction): -# if structure_direction == "long": -# return (True, ("long", "short")) if option_type.lower() == "c" else (False, ("long", "short")) -# else: -# return (False, ("short", "long")) if option_type.lower() == "p" else (True, ("short", "long")) - -# def filter_contracts(df: pd.DataFrame, schema: OrderSchema, spot: float, min_moneyness: float = 0.5, max_moneyness: float = 1.5, increment =0.25) -> pd.DataFrame: -# target_dte = schema["target_dte"] -# dte_tol = schema["dte_tolerance"] -# filtered = pd.DataFrame() -# attempt = 0 -# factor = 1 -# max_attempts = schema.get("max_attempts", 3) -# min_moneyness = schema.get("min_moneyness", min_moneyness) -# max_moneyness = schema.get("max_moneyness", max_moneyness) -# increment = schema.get("increment", increment) -# while filtered.empty and attempt < max_attempts: -# lower_strike = spot * (min(min_moneyness, max_moneyness) * factor) -# upper_strike = spot * (max(min_moneyness, max_moneyness)* factor) -# filtered = df[ -# (df["dte"].between(target_dte - dte_tol, target_dte + dte_tol)) & -# (df["strike"].between(lower_strike, upper_strike)) -# ].copy() -# attempt += 1 -# factor *= (1 + increment) # Increase the range by a factor of (1 + increment) each attempt -# if filtered.empty: -# logger.critical(f"Warning: No contracts found for {schema['option_type']} with DTE {target_dte} ± {dte_tol} and strike range [{lower_strike:.2f}, {upper_strike:.2f}] after {attempt} attempts.") -# return filtered.reset_index(drop=True) - -# def build_spread_by_ticks(df, schema, cache): -# df = df[df["right"].str.lower() == schema["option_type"].lower()].copy() -# df["mid"] = df["chain_id"].map(cache) -# df = df.dropna(subset=["mid"]) -# ascending, _ = resolve_ordering(schema["option_type"], schema["structure_direction"]) - -# spreads = [] -# for exp, group in df.groupby("expiration"): -# group = group.sort_values("strike", ascending=ascending).reset_index(drop=True) -# for i in range(len(group) - schema["spread_ticks"]): -# leg1, leg2 = group.iloc[i], group.iloc[i + schema["spread_ticks"]] -# long, short = (leg1, leg2) -# spread_price = long["mid"] - short["mid"] -# if abs(spread_price) <= schema["max_total_price"] and abs(spread_price) >= schema["min_total_price"]: -# spreads.append({ -# "long": long, "short": short, -# "spread_price": spread_price, -# "width": abs(short["strike"] - long["strike"]), -# "dte": int(long["dte"]), -# "expiration": long["expiration"], -# "option_type": schema["option_type"], -# "type": "vertical", -# "legs": [long, short], -# }) -# if len(spreads) == 0: -# logger.critical(f"No spreads found for {schema['option_type']} with DTE {schema['target_dte']} ± {schema['dte_tolerance']} and ticks {schema['spread_ticks']}.") -# return [] -# if schema["structure_direction"] == "long": -# pick = min((s for s in spreads if s["spread_price"] > 0), key=lambda s: s["spread_price"], default=None) -# else: -# pick = min((s for s in spreads if s["spread_price"] < 0), key=lambda s: s["spread_price"], default=None) -# return [pick] if pick else [] - -# def build_spread_by_pct(df, schema, spot, cache): -# df = df[df["right"].str.lower() == schema["option_type"].lower()].copy() -# df["mid"] = df["chain_id"].map(cache) -# df = df.dropna(subset=["mid"]) -# ascending, _ = resolve_ordering(schema["option_type"], schema["structure_direction"]) -# spreads = [] -# for exp, group in df.groupby("expiration"): -# group = group.sort_values("strike", ascending=ascending).reset_index(drop=True) -# for i in range(len(group)): -# leg1 = group.iloc[i] -# target_strike = leg1["strike"] + (spot * schema["spread_pct"] if ascending else -spot * schema["spread_pct"]) -# group_slice = group.iloc[i+1:] # only look ahead to maintain spread structure -# if group_slice.empty: -# continue - -# leg2_idx = (group_slice["strike"] - target_strike).abs().idxmin() -# leg2 = group.loc[leg2_idx] -# error = (leg2["strike"] - target_strike) ** 2 - -# ## Controlling distance apart. Avoiding spreads that are too wide or too narrow. -# actual_width = abs(leg2["strike"] - leg1["strike"]) -# min_width = spot * schema["spread_pct"] * 0.10 -# max_error = (spot * schema["spread_pct"] * 1.5) ** 2 - -# if actual_width < min_width or error > max_error: -# logger.info(f"Skipping spread due to width or error: {actual_width:.2f} < {min_width:.2f} or error {error:.2f} > {max_error:.2f}") -# print(f"Skipping spread due to width or error: {actual_width:.2f} < {min_width:.2f} or error {error:.2f}") -# continue - -# long, short = (leg1, leg2) -# spread_price = long["mid"] - short["mid"] - -# if abs(spread_price) <= schema["max_total_price"]: -# spreads.append({ -# "long": long, "short": short, -# "spread_price": spread_price, -# "width": abs(short["strike"] - long["strike"]), -# "dte": int(long["dte"]), -# "expiration": long["expiration"], -# "option_type": schema["option_type"], -# "type": "vertical", -# "legs": [long, short], -# }) -# if schema["structure_direction"] == "long": -# pick = min((s for s in spreads if s["spread_price"] > 0), key=lambda s: s["spread_price"], default=None) -# else: -# pick = min((s for s in spreads if s["spread_price"] < 0), key=lambda s: s["spread_price"], default=None) -# return [pick] if pick else [] - -# def build_vertical_spread(df, schema, spot, cache): -# df = filter_contracts(df, schema, spot) -# return build_spread_by_ticks(df, schema, cache) if "spread_ticks" in schema else build_spread_by_pct(df, schema, spot, cache) - -# def build_naked_option(df, schema, spot, cache): -# df = filter_contracts(df, schema, spot) -# df = df[df["right"].str.lower() == schema["option_type"].lower()].copy() -# df["mid"] = df["chain_id"].map(cache) -# df = df.dropna(subset=["mid"]) -# df = df[df["mid"] <= schema["max_total_price"]] -# df = df.sort_values("mid", ascending=(schema["structure_direction"] == "long")) -# pick = df.iloc[0] if not df.empty else None -# return [{schema["structure_direction"]: pick}] if pick is not None else [] - -# STRATEGY_MAP = { -# "vertical": build_vertical_spread, -# "naked": build_naked_option, -# } - - -# def build_strategy(df, schema, spot, cache): - -# if schema["strategy"] not in STRATEGY_MAP: -# raise ValueError(f"Unsupported strategy: {schema['strategy']}") -# builder = STRATEGY_MAP.get(schema["strategy"]) -# return builder(df, schema, spot, cache) if builder else [] - - -# def create_trade_id(legs: Dict[str, Any]) -> str: -# def _iter_side(side): -# if side is None: -# return [] -# if isinstance(side, dict): -# return [side] -# if isinstance(side, (list, tuple)): -# return list(side) -# if isinstance(side, pd.Series): -# return [side.to_dict()] -# raise TypeError(f"legs['long'/'short'] must be dict or list[dict]. Recieved {type(side)}") - -# parts = [] -# for leg in _iter_side(legs.get("long")): -# parts.append(f"&L:{leg['opttick']}") -# for leg in _iter_side(legs.get("short")): -# parts.append(f"&S:{leg['opttick']}") -# return "".join(parts) - -# def extract_order(obj): -# order = {} - -# ## If no contracts found, return early -# if not obj: -# order['result'] = ResultsEnum.NO_CONTRACTS_FOUND.value -# order['data'] = None -# return order - -# pack=obj[0] ## This is because raw order is just a [1dict] -# ## If contracts found, build the order -# order['result'] = ResultsEnum.SUCCESSFUL.value -# order['data'] = {"trade_id": "", -# "close": 0, -# 'long': [], -# 'short': [],} -# for pack in obj: -# for direction, data in pack.items(): -# if direction not in ('long', 'short'): -# continue -# order['data'][direction].append(data["opttick"]) -# mid = data["mid"] -# order['data']['close'] += mid if direction == 'long' else -mid -# order['data']['trade_id'] = create_trade_id(pack) -# return order diff --git a/EventDriven/riskmanager/.decomm/old_utils.py b/EventDriven/riskmanager/.decomm/old_utils.py deleted file mode 100644 index ad1f75a..0000000 --- a/EventDriven/riskmanager/.decomm/old_utils.py +++ /dev/null @@ -1,1675 +0,0 @@ -# import os, sys -# from .config import get_avoid_opticks -# import functools -# from trade.assets.Stock import Stock -# from trade.assets.Option import Option -# from trade.assets.OptionStructure import OptionStructure -# from trade.assets.Calculate import Calculate -# # from trade.assets.helpers.DataManagers_new import OptionDataManager -# from trade.assets.helpers.utils import (swap_ticker) -# from module_test.raw_code.DataManagers.DataManagers import OptionDataManager, BulkOptionDataManager -# from module_test.raw_code.DataManagers import SaveManager - -# from trade.helpers.Context import Context, clear_context -# from trade.helpers.helper import (change_to_last_busday, -# is_USholiday, -# is_busday, -# setup_logger, -# generate_option_tick_new, -# get_option_specifics_from_key, -# parse_option_tick, -# binomial_implied_vol, -# CustomCache, -# check_missing_dates, -# check_all_days_available, -# printmd) -# from dbase.DataAPI.ThetaData import (list_contracts, -# retrieve_openInterest, -# retrieve_eod_ohlc, -# retrieve_bulk_eod, -# retrieve_bulk_open_interest, -# retrieve_chain_bulk -# ) -# from pandas.tseries.offsets import BDay -# from pandas.tseries.holiday import USFederalHolidayCalendar -# from trade.helpers.decorators import log_error_with_stack, log_time -# from itertools import product -# import pandas as pd -# from copy import deepcopy -# from trade.helpers.Logging import setup_logger -# from trade.helpers.decorators import log_error_with_stack, copy_doc -# from pathos.multiprocessing import ProcessingPool as Pool -# from trade.helpers.threads import runThreads -# from trade.helpers.helper_types import OptionModelAttributes -# import numpy as np -# import time -# from datetime import datetime -# import math -# from trade.assets.rates import get_risk_free_rate_helper -# from EventDriven.event import FillEvent -# from EventDriven.helpers import parse_signal_id -# from EventDriven.data import DataHandler -# from EventDriven.eventScheduler import EventScheduler -# from EventDriven.types import FillDirection, EventTypes, ResultsEnum, SignalTypes -# from threading import Thread, Lock -# from trade import POOL_ENABLED, register_signal -# import multiprocessing as mp -# from module_test.raw_code.DataManagers.DataManagers import ( -# BulkOptionQueryRequestParameter, -# BulkOptionDataManager, -# handle_extra_cols, -# build_name_format, -# extract_numeric_value, -# enforce_interval, -# enforce_inputs, -# determine_table_agg, -# determine_requested_columns, -# init_query, - -# ) -# from typing import List, Tuple -# from functools import partial -# from dbase.utils import default_timestamp, bus_range, add_eod_timestamp -# from dbase.DataAPI.ThetaExceptions import is_thetadata_exception -# from trade import HOLIDAY_SET -# import shelve -# from pathlib import Path -# import atexit -# from concurrent.futures import ThreadPoolExecutor -# import matplotlib.pyplot as plt -# import signal -# from .config import ffwd_data - - - -# logger = setup_logger('QuantTools.EventDriven.riskmanager') -# time_logger = setup_logger('QuantTools.EventDriven.riskmanager.time') -# logger.info("RISK MANAGER is Using New DataManager") - - -# ## There's no point loading only within strt, end. Load all to avoid -# TIMESERIES_START = pd.to_datetime('2017-01-01') -# TIMESERIES_END = datetime.today() - -# def set_timeseries_start(start: str|datetime) -> None: -# """ -# Sets the start date for the timeseries data. - -# Args: -# start (str|datetime): The start date for the timeseries data. -# """ -# global TIMESERIES_START -# TIMESERIES_START = pd.to_datetime(start) -# logger.info(f"Timeseries Start set to: {TIMESERIES_START}") - -# def set_timeseries_end(end: str|datetime) -> None: -# """ -# Sets the end date for the timeseries data. - -# Args: -# end (str|datetime): The end date for the timeseries data. -# """ -# global TIMESERIES_END -# TIMESERIES_END = pd.to_datetime(end) -# logger.info(f"Timeseries End set to: {TIMESERIES_END}") - -# ## Patch tickers to swap old tickers with new ones -# PATCH_TICKERS = True - -# def get_patch_tickers(): -# return PATCH_TICKERS - -# def set_patch_tickers(patch_tickers): -# global PATCH_TICKERS -# PATCH_TICKERS = patch_tickers - -# ## To-Do: -# ## 1. Filter out contracts that have already been queried. Saves time -# ## 2. Move cache to class attribute. - -# ##Test low memory cache -# # 1) pick a folder for your caches -# BASE = Path(os.environ["WORK_DIR"])/ ".riskmanager_cache" -# BASE.mkdir(exist_ok=True) -# location = Path(os.environ['GEN_CACHE_PATH']) ## Allows users to set a custom cache location - -# # 1a) Create USE_TEMP_CACHE -# USE_TEMP_CACHE = False -# def set_use_temp_cache(use_temp_cache: bool) -> None: -# """ -# Sets the USE_TEMP_CACHE variable to the given value. - -# Args: -# use_temp_cache (bool): The value to set USE_TEMP_CACHE to. -# """ -# global USE_TEMP_CACHE -# USE_TEMP_CACHE = use_temp_cache -# logger.critical(f"USE_TEMP_CACHE set to: {USE_TEMP_CACHE}. This will use a temporary cache that is cleared on exit. Utilize reset_persistent_cache() to reset the persistent cache.") - -# def get_use_temp_cache() -> bool: -# """ -# Returns the current value of USE_TEMP_CACHE. - -# Returns: -# bool: The current value of USE_TEMP_CACHE. -# """ -# global USE_TEMP_CACHE -# return USE_TEMP_CACHE - -# # 2) swap your dicts for Cache instances - -# chain_cache = CustomCache(BASE, fname="chain", expire_days=45) -# close_cache = CustomCache(BASE, fname="close", expire_days=45) -# oi_cache = CustomCache(BASE, fname="oi", expire_days=45) -# spot_cache = CustomCache(BASE, fname="spot", expire_days=45) -# formatted_flags = CustomCache(location = BASE, fname = 'formatted_flags', expire_days=45) - -# # 2a) Create persistent cache or temp -# def get_persistent_cache() -> CustomCache: -# """ -# Returns the persistent cache. - -# Returns: -# CustomCache: The persistent cache instance. -# """ -# if get_use_temp_cache(): -# logger.info("Using temporary cache. This cache will be cleared on exit.") -# return CustomCache(location/'temp', fname='temp_cache', clear_on_exit= True) -# else: -# logger.info("Using persistent cache. This cache will be saved to disk and can be reused.") -# return CustomCache(location, fname='persistent_cache', expire_days=30) - -# def dynamic_memoize(func): -# @functools.wraps(func) -# def wrapper(*args, **kwargs): -# cache = get_persistent_cache() # resolved on every call - -# # Attach storage for memoized wrappers to the cache instance -# if not hasattr(cache, "_memoized_wrappers"): -# cache._memoized_wrappers = {} - -# # Reuse the memoized version for this func+cache -# if func not in cache._memoized_wrappers: -# cache._memoized_wrappers[func] = cache.memoize()(func) - -# memoized_func = cache._memoized_wrappers[func] -# if get_use_temp_cache(): -# logger.info(f"Using temporary cache for function: {func.__name__}") - -# return memoized_func(*args, **kwargs) - -# return wrapper - -# def reset_persistent_cache() -> None: ## To reset cache Variable, just incase -# """ -# Resets the persistent cache by clearing it. -# """ -# global PERSISTENT_CACHE -# PERSISTENT_CACHE = get_persistent_cache() - -# PERSISTENT_CACHE = get_persistent_cache() - -# # 3) Create clear_cache function -# def clear_cache() -> None: -# """ -# clears the cache -# """ -# global chain_cache, close_cache, oi_cache, spot_cache -# chain_cache.clear() -# close_cache.clear() -# oi_cache.clear() -# spot_cache.clear() - -# ## Register info on `skips` from add_skip_columns -# IDS = [] -# ID_SAVE_FOLDER = Path(os.environ['WORK_DIR']) / '.cache' -# ID_SAVE_FILE = ID_SAVE_FOLDER / 'position_data.csv' - -# ## Function to register information about skips in the position data to a list -# def register_info_stack(id, data, data_col, update_kwargs = {}): -# """ -# Register the information stack for a given position ID. - -# Parameters: -# - id: The position ID. -# - data: The DataFrame containing position data. - -# Returns: -# - info: A dictionary containing the registered information. -# """ -# if not isinstance(data, pd.DataFrame): -# raise ValueError("Data must be a pandas DataFrame.") - - -# info = {} -# info['ID'] = id -# for k in data_col: -# info[f'{k.upper()}_SKIP'] = data[f"{k}_skip_day"].sum() -# copy_cat = data[f"{k}_skip_day"].copy().to_frame() -# copy_cat['streak_id'] = copy_cat[f"{k}_skip_day"].ne(copy_cat[f"{k}_skip_day"].shift()).cumsum() -# copy_cat['streak'] = copy_cat.groupby('streak_id').cumcount() + 1 -# info[f'{k.upper()}_MAX_STREAK'] = copy_cat[copy_cat[f"{k}_skip_day"] ==True].streak.max() if not copy_cat[copy_cat[f"{k}_skip_day"] ==True].streak.empty else 0 -# info['DATA_LEN'] = len(data) -# info['DATETIME'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S') -# info.update(update_kwargs) -# IDS.append(info) - -# ## Function to save the information stack to a CSV file -# def save_info_stack(): -# """ -# Save the information stack to a CSV file. - -# Parameters: -# - IDS: List of dictionaries containing position information. -# - id_save_file: Path to the CSV file where the information will be saved. -# """ -# global IDS, ID_SAVE_FILE, ID_SAVE_FOLDER -# if not IDS: -# logger.info("No data to save.") -# return -# full_data = pd.read_csv(ID_SAVE_FILE) if ID_SAVE_FILE.exists() else pd.DataFrame() -# df = pd.DataFrame(IDS) -# full_data = pd.concat([full_data, df], ignore_index=True) -# full_data.to_csv(ID_SAVE_FILE, index=False) -# with open(ID_SAVE_FOLDER/'ids.txt', 'a') as f: -# f.write(f"Total IDs saved: {len(IDS)} on {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n") -# IDS = [] # Clear the IDS list after saving -# return - -# ## Register the save_info_stack function to be called on exit -# register_signal(signal.SIGTERM, save_info_stack) - -# def get_current_saved_ids() -> pd.DataFrame: -# """ -# Returns the current saved IDs as a DataFrame. - -# Returns: -# pd.DataFrame: A DataFrame containing the saved IDs. -# """ -# return IDS - -# def clear_info_stack() -> None: -# """ -# Clears the information stack. -# """ -# global IDS -# IDS = [] -# logger.info("Cleared info stack.") - - - -# LOOKBACKS = {} - -# def _retrieve_openInterest(*args, **kwargs) -> pd.DataFrame|None: -# try: -# return retrieve_openInterest(*args, **kwargs) -# except Exception as e: -# if is_thetadata_exception(e): -# logger.error(f"Error retrieving open interest: {e}") -# return None -# else: -# raise e - - -# def _retrieve_eod_ohlc(*args, **kwargs) -> pd.DataFrame|None: -# try: -# return retrieve_eod_ohlc(*args, **kwargs) -# except Exception as e: -# if is_thetadata_exception(e): -# logger.error(f"Error retrieving EOD OHLC data: {e}") -# return None -# else: -# raise e - -# ## Keep track of deleted keys in the cache -# DELETED_KEYS = [] - -# def get_deleted_keys() -> List[str]: -# """ -# Returns the list of deleted keys from the cache. - -# Returns: -# List[str]: A list of deleted keys. -# """ -# global DELETED_KEYS -# return DELETED_KEYS - - -# def set_deleted_keys(keys: List[str]) -> None: -# """ -# Sets the deleted keys in the cache. - -# Args: -# keys (List[str]): A list of keys that were deleted from the cache. -# """ -# global DELETED_KEYS -# DELETED_KEYS = keys -# logger.info(f"Deleted Keys: {DELETED_KEYS}") - - - -# def set_timeseries_start_end(start: str|datetime, end: str|datetime) -> None: -# """ -# Sets the start and end dates for the timeseries data. - -# Args: -# start (str|datetime): The start date for the timeseries data. -# end (str|datetime): The end date for the timeseries data. -# """ -# global TIMESERIES_START, TIMESERIES_END -# TIMESERIES_START = pd.to_datetime(start) -# TIMESERIES_END = pd.to_datetime(end) -# logger.info(f"Timeseries Start: {TIMESERIES_START}, Timeseries End: {TIMESERIES_END}") - -# def get_timeseries_start_end() -> Tuple[str, str]: -# """ -# Returns the start and end dates for the timeseries data. - -# Returns: -# Tuple[str, str]: A tuple containing the start and end dates for the timeseries data. -# """ -# global TIMESERIES_START, TIMESERIES_END -# return TIMESERIES_START.strftime('%Y-%m-%d'), TIMESERIES_END.strftime('%Y-%m-%d') - -# # Precompute BDay lookbacks to eliminate redundant calculations -# def precompute_lookbacks(start_date, end_date, _range = [10, 20, 30]) -> None: - -# ## Extending to allow for multiple lookbacks -# global LOOKBACKS -# trading_days = pd.date_range(start=start_date, end=end_date, freq=BDay()) -# if len(LOOKBACKS) == 0: -# lookback_cache = {x.strftime('%Y-%m-%d'): {} for x in trading_days} -# else: -# lookback_cache = LOOKBACKS -# for date in trading_days: -# dates = {x: (date - BDay(x)).strftime('%Y-%m-%d') for x in _range} -# lookback_cache[date.strftime('%Y-%m-%d')].update(dates) -# LOOKBACKS = lookback_cache - -# precompute_lookbacks('2000-01-01', '2030-12-31') - -# # Function to check if a date is a holiday -# def is_holiday(date) -> bool: -# return date in HOLIDAY_SET - -# def get_cache(name: str) -> CustomCache: -# """ -# returns the cache for the given name -# """ -# global chain_cache, close_cache, oi_cache, spot_cache -# if name == 'chain': -# return chain_cache -# elif name == 'close': -# return close_cache -# elif name == 'oi': -# return oi_cache -# elif name == 'spot': -# return spot_cache - -# else: -# raise ValueError(f"Invalid cache name: {name}") - -# @dynamic_memoize -# def populate_cache_with_chain(tick, date, chain_spot=None, print_url = True): -# """ -# Populate the cache with chain data. -# """ -# chain = retrieve_chain_bulk( -# tick, -# '', -# date, -# date, -# '16:00', -# 'C', -# print_url = False -# ) -# logger.info(f"Retrieved chain for {tick} on {date}") -# logger.error(f"Retrieved chain for {tick} on {date}") - -# prev = (pd.to_datetime(date) - BDay(1)).strftime('%Y-%m-%d') -# oi = retrieve_bulk_open_interest( -# symbol = tick, -# exp = 0, -# start_date = prev, -# end_date = prev, -# print_url = False -# ) - - - -# ## Clip Chain -# chain_clipped = chain.reset_index()#[['datetime', 'Root', 'Strike', 'Right', 'Expiration', 'Midpoint']] -# chain_clipped = chain_clipped.merge(oi[['Root', 'Expiration', 'Strike', 'Right', 'Open_interest']], on=['Root', 'Expiration', 'Strike', 'Right'], how='left') -# if PATCH_TICKERS: -# chain_clipped['Root'] = chain_clipped['Root'].apply(swap_ticker) - -# ## Create ID -# id_params = chain_clipped[['Root', 'Right', 'Expiration', 'Strike']].T.to_numpy() -# ids = runThreads( -# generate_option_tick_new, -# id_params) -# chain_clipped['opttick'] = ids -# filter_opt = get_avoid_opticks(tick) -# chain_clipped = chain_clipped[~chain_clipped['opttick'].isin(filter_opt)] ## Optticks to avoid -# chain_clipped['chain_id'] = chain_clipped['opttick'] + '_' + chain_clipped['datetime'].astype(str) -# chain_clipped['dte'] = (pd.to_datetime(chain_clipped['Expiration']) - pd.to_datetime(chain_clipped['datetime'])).dt.days - -# ## Save to cache -# def save_to_cache(id, date, spot): -# date = pd.to_datetime(date).strftime('%Y-%m-%d') -# save_id = f"{id}_{date}" -# if save_id not in get_cache('spot'): -# spot_cache[save_id] = spot -# save_params = chain_clipped[['opttick', 'datetime', 'Midpoint']].T.to_numpy() -# runThreads( -# save_to_cache, -# save_params) - -# if chain_spot: -# chain_clipped['spot']=chain_spot -# chain_clipped['moneyness']=0 -# chain_clipped.loc[chain_clipped['Right'] == 'C', 'moneyness'] = chain_clipped.loc[chain_clipped['Right'] == 'C', 'Strike'] / chain_clipped.loc[chain_clipped['Right'] == 'C', 'spot'] -# chain_clipped.loc[chain_clipped['Right'] == 'P', 'moneyness'] = chain_clipped.loc[chain_clipped['Right'] == 'P', 'spot'] / chain_clipped.loc[chain_clipped['Right'] == 'P', 'Strike'] -# chain_clipped=chain_clipped[chain_clipped['moneyness'].between(0.01, 3)] ## Filter out extreme moneyness to reduce size -# chain_clipped.columns = chain_clipped.columns.str.lower() -# chain_clipped["pct_spread"] = (chain_clipped["closeask"] - chain_clipped["closebid"]) / chain_clipped["midpoint"] - -# return chain_clipped - - -# ##UTILS -# def load_position_data(opttick, -# processed_option_data, -# start, -# end, -# s, -# r, -# y, -# s0_close): -# """ -# Load position data for a given option tick. - -# args: -# opttick (str): The option tick to load data for. -# processed_option_data (dict): A dictionary to store processed option data. -# start (str|datetime): The start date for the data. -# end (str|datetime): The end date for the data. -# s (pd.Series): The spot price series. Must be split adjusted. -# r (pd.Series): The risk-free rate series. -# y (pd.Series): The dividend yield series. -# s0_close (pd.Series): The close price of the underlying asset series. - -# This function ONLY retrives the data for the option tick, it does not apply any splits or adjustments. -# This function will NOT check for splits or special dividends. It will only retrieve the data for the given option tick. -# """ -# ## Check if the option tick is already processed -# if opttick in processed_option_data: -# return processed_option_data[opttick] - -# ## Get Meta -# meta = parse_option_tick(opttick) - -# ## Generate data -# data = generate_spot_greeks( opttick, start_date=start, end_date=end) -# data = enrich_data(data, meta['ticker'], -# s[s.index.isin(data.index)], -# r[r.index.isin(data.index)], -# y[y.index.isin(data.index)], -# s0_close[s0_close.index.isin(data.index)]) -# processed_option_data[opttick] = data -# return data - -# def enrich_data(data, ticker, s, r, y, s0_close): -# """ -# Args: -# data (pd.DataFrame): The data to enrich. -# ticker (str): The ticker symbol for the option. -# s (pd.Series): The spot price. Adjusted for splits. -# r (pd.Series): The risk-free rate. -# y (pd.Series): The dividend yield. -# s0_close (pd.Series): The close price of the underlying asset. -# Enrich the data with additional information. -# """ -# data = _clean_data(data) -# data = data[~data.index.duplicated(keep = 'last')] -# data['s'] = s -# data['r'] = r -# data['y'] = y -# data['s0_close'] = s0_close -# data = ffwd_data(data, ticker) -# return data - -# def generate_spot_greeks(opttick, start_date: str|datetime, end_date: str|datetime) -> pd.DataFrame: -# """ -# Generate spot greeks for a given option tick. -# """ -# ## PRICE_ON_TO_DO: NO NEED TO CHANGE. This is necessary retrievals -# meta = parse_option_tick(opttick) -# data_manager = OptionDataManager(opttick=opttick) -# greeks = data_manager.get_timeseries(start = start_date, -# end = end_date, -# interval = '1d', -# type_ = 'greeks',).post_processed_data ## Multiply by the shift to account for splits -# greeks_cols = [x for x in greeks.columns if 'Midpoint' in x] -# greeks = greeks[greeks_cols] -# greeks[greeks_cols] = greeks[greeks_cols].replace(0, np.nan).fillna(method = 'ffill') -# greeks.columns = [x.split('_')[1].capitalize() for x in greeks.columns] - -# spot = data_manager.get_timeseries(start = start_date, -# end = end_date, -# interval = '1d', -# type_ = 'spot', -# extra_cols=['bid', 'ask']).post_processed_data ## Using chain spot data to account for splits -# spot = spot[['Midpoint', 'Closeask', 'Closebid']] ## This is raw calc place -# data = greeks.join(spot) -# return data - - -# def parse_position_id(positionID:str) -> Tuple[dict, list]: -# position_str = positionID -# position_list = position_str.split('&') -# position_list = [x.split(':') for x in position_list if x] -# position_list_parsed = [(x[0], parse_option_tick(x[1])) for x in position_list] -# position_dict = dict(L = [], S = []) -# for x in position_list_parsed: -# position_dict[x[0]].append(x[1]) -# return position_dict, position_list - -# def refresh_cache() -> None: -# """ -# Refreshes the cache for the order picker -# """ -# global order_cache, spot_cache, close_cache, oi_cache, chain_cache -# spot_cache = get_cache('spot') -# close_cache = get_cache('close') -# oi_cache = get_cache('oi') -# chain_cache = get_cache('chain') - -# def _clean_data(df): -# """ -# Cleans the data by removing rows with NaN values in specified columns. - -# :param data: DataFrame to clean -# :param columns: List of columns to check for NaN values -# :return: Cleaned DataFrame -# """ -# logger.info("Cleaning data...") -# def fill_values(df): -# """ -# Fills NaN values with the last valid observation. -# """ -# return df.replace(0, np.nan).ffill() -# df = df.copy() -# return fill_values(df) - - -# def mad_zscore_spike_flag(df, threshold=10, window=10, col ='Midpoint'): -# """ -# Add a flag to the DataFrame indicating if the change in 'Midpoint' exceeds the threshold. -# """ -# df = df.copy() -# median = df[col].rolling(window).median() -# mad = lambda x: np.median(np.abs(x - np.median(x))) ## lambda function that calculates median absolute deviation. x is a series, therefore x - median(x) -# rolling_mad = df[col].rolling(window).apply(mad) ## Apply function -# zscore_like = (df[col] - median) / rolling_mad ## Z-score like calculation -# return zscore_like.abs() > threshold - -# def mad_band_spike_flag(df, threshold=2, window=20, col='Midpoint'): -# """ -# Add a flag to the DataFrame indicating if the change in 'Midpoint' exceeds the threshold. -# """ -# df = df.copy() -# median = df[col].rolling(window).median() -# mad = df[col].rolling(window).apply(lambda x: np.median(np.abs(x - np.median(x)))) -# return (df[col] - median).abs() > threshold * mad - -# def quantile_band_spike_flag(df, window=20, upper_quantile=0.90, lower_quantile=0.10, col='Midpoint'): -# """ -# Add a flag to the DataFrame indicating if the change in 'Midpoint' exceeds the threshold. -# """ -# df = df.copy() -# quantile = df[col].rolling(window).quantile(upper_quantile) -# quantile_down = df[col].rolling(window).quantile(lower_quantile) -# return (df[col] > quantile) | (df[col] < quantile_down) - - -# def add_skip_columns(df, id, skip_columns, window=15, skip_threshold=2.75): -# """ -# Adds skip columns to the DataFrame. -# """ -# for col in skip_columns: -# ## EMA Smoothing + Zscore Fiter -# logger.info(f"Adding skip column for {col} with window {window} and threshold {skip_threshold}") -# if col not in df.columns: -# logger.info(f"Column {col} not found in DataFrame. Skipping...") -# continue - -# ##ABS Zscore -# df.loc[df[col] < 0 , col] = 0 ## NOTE: This is one time fix. Take it out -# smooth = df[col].ewm(span=3).mean() -# _zscore = (smooth - smooth.rolling(window).mean()) / smooth.rolling(window).std() -# _thresh = _zscore.abs() > skip_threshold - -# ## Percentage change -# smooth_pct = df[col].pct_change().fillna(0) -# _zscore_pct = (smooth_pct - smooth_pct.rolling(window).mean()) / smooth_pct.rolling(window).std() -# _zscore_pct = _zscore_pct.fillna(0) -# _zscore_pct.replace([np.inf, -np.inf], 0, inplace=True) ## Replace inf values with 0 -# _thresh_pct = _zscore_pct.abs() > skip_threshold - -# ## Spike Detection -# spike_flag = mad_band_spike_flag(df, threshold=skip_threshold, window = window, col=col) - -# ## Window -# shortened = df[col][:window] -# pct_change = shortened.pct_change() -# window_bool = pct_change.abs() > 0.5 - -# ## Zero Values -# zero_bool = df[col] == 0 - - -# ## Combine both boolean masks -# _combined = _thresh | spike_flag | window_bool| zero_bool# | _thresh_pct -# df[f'{col}_abs_zscore'] = _thresh -# df[f'{col}_pct_zscore'] = _thresh_pct -# df[f'{col}_spike_flag'] = spike_flag -# df[f'{col}_window'] = window_bool -# df[f'{col}_zero'] = zero_bool -# df[f'{col}_skip_day']= _combined -# df[f'{col}_skip_day_count'] = _combined.rolling(60).sum() -# register_info_stack(id, df, skip_columns, update_kwargs={'window': window, 'skip_threshold': skip_threshold, 'window_bool_threshold': 0.5}) -# return df - - - -# def date_in_cache_index(date, opttick) -> bool: -# """ -# Check if a date is in the index of a cache for an option tick. -# """ -# if opttick not in get_cache('close').keys(): -# return False - -# if get_cache('close')[opttick] is None or get_cache('oi')[opttick] is None: -# return False - -# return date in get_cache('close')[opttick].index and date in get_cache('oi')[opttick].index - -# def assemble_bulk_data_request(self, start: str | datetime, -# end: str | datetime, -# interval: str = '1d', -# type_: str = 'spot', -# strikes_right: List[Tuple] = [], -# model: str = 'bs', -# extra_cols: list = []) -> BulkOptionQueryRequestParameter: -# start = pd.to_datetime(start) -# end = pd.to_datetime(end) -# ivl_str, ivl_int = extract_numeric_value(interval) -# greek_names = self.greek_names -# _extra_cols = handle_extra_cols(extra_cols, type_, model) -# greek_cols = build_name_format('greek', model, extra_cols, self.default_fill) -# vol_cols = build_name_format('vol', model, extra_cols, self.default_fill) - - -# ## Enforce the interval -# enforce_interval(ivl_str) - -# ## Assert inputs -# enforce_inputs(type_, model) - -# ## Determine aggregation -# agg, database, table = determine_table_agg(ivl_str, type_, greek_names) -# input_params = getattr(self, agg) - -# ## Determine the requested columns -# requested_col = determine_requested_columns(self.default_fill, type_, model, greek_names) - -# data_request = BulkOptionQueryRequestParameter(table_name=table, -# db_name=database, -# start_date=start, -# end_date=end, -# ticker=self.symbol, -# exp=self.exp, -# strikes=strikes_right) - -# ## Set the parameters for the request to avoid having too many attributes -# data_request.symbol = self.symbol -# data_request.interval= interval -# data_request.type_ = type_ -# data_request.input_params = input_params -# data_request.model = model -# data_request.ivl_str = ivl_str -# data_request.ivl_int = ivl_int -# data_request.default_fill = self.default_fill -# data_request.agg = agg -# data_request.requested_col = requested_col + _extra_cols + ['optiontick'] -# data_request.iv_cols = vol_cols -# data_request.greek_cols = greek_cols -# data_request.col_kwargs = col_kwargs = {'underlier_price': 's0', -# 'expiration': 'exp_date', -# 'strike': 'k', -# 'right': 'right', -# 'rf_rate': 'r', -# 'dividend': 'y', -# 'put/call': 'right', -# 'datetime': 'datetime',} -# return data_request - - -# def update_caches(x) -> None: -# refresh_cache() -# global oi_cache, close_cache, oi_cache, spot_cache -# key = f"{x.Optiontick.unique()[0]}" - -# ## When updating cache, we either set the data if not in cache, or append the data if it is in cache -# if key in close_cache.keys(): ## Appending data -# data = close_cache[key] -# data.columns = data.columns.str.lower() ## This is to normalize for appending -# x.columns = x.columns.str.lower() -# x.set_index('datetime', inplace=True) -# x = pd.concat([data, x], axis=0) -# x.columns = x.columns.str.capitalize() ## Keeping the original format -# x = x[~x.index.duplicated(keep = 'first')] - -# else: ## Setting data -# x = x.set_index('Datetime') -# close_cache[key] = x -# oi_cache[key] = x['Openinterest'].to_frame(name = 'Open_interest') -# return - - - -# def update_cache_with_missing_ticks(parsed_opts: pd.DataFrame, date: str|datetime ) -> None: -# """ -# Updates the cache with missing ticks by retrieving EOD data and open interest data. - -# Args: -# parsed_opts (pd.DataFrame): DataFrame containing parsed option ticks with start and end dates and key meta data. - -# Returns: -# None -# """ -# global oi_cache, close_cache, oi_cache, spot_cache - -# tickOrderedList = parsed_opts[['ticker', 'put_call', 'exp_date', 'strike', ]].T.to_numpy() -# tick_results = (runThreads(generate_option_tick_new, tickOrderedList, 'map' , block=True)) -# tick_results = list(tick_results) -# parsed_opts['opttick'] = tick_results -# ## We get ticks first, then filter out the ones that are already in the cache -# missing_ticks = [x for x in tick_results if x not in close_cache.keys() and \ -# x not in oi_cache.keys() \ -# and f"{x}_{date}" not in spot_cache.keys()] - -# data_list = [] -# for tick in tick_results: -# data = close_cache.get(tick, None) -# if data is not None and date not in data.index: -# ## If the data is not None, but the date is not in the index, we add it to the list -# data_list.append(tick) - -# missing_ticks.extend(data_list) -# if len(missing_ticks) == 0: -# ## If there are no missing ticks, we check for each of their datetime completeness (SQL sometimes is incomplete) - - -# return -# else: -# ## We filter out the ones that are already in the cache to reduce the number of requests -# parsed_opts = parsed_opts[parsed_opts.opttick.isin(missing_ticks)] - -# OrderedList = parsed_opts[['ticker', 'end_date', 'exp_date', 'put_call', 'start_date', 'strike', ]].T.to_numpy() -# eod_results = (runThreads(_retrieve_eod_ohlc, OrderedList, 'map', block=True)) -# oi_results = (runThreads(_retrieve_openInterest, OrderedList, 'map' , block=True)) - - - -# eod_results = list(eod_results) -# oi_results = list(oi_results) - - -# for oi, eod, tick in zip(oi_results, eod_results, tick_results): -# ## We won't filter for `None` since we are skipping ticks with None in cache -# cache_key = f"{tick}" -# if oi is None or eod is None: -# ## If either of them is None, we skip the tick -# close_cache[cache_key] = None -# oi_cache[cache_key] = None -# continue -# eod.index = default_timestamp(eod.index) -# eod['Optiontick'] = tick -# close_cache[cache_key] = eod - -# ## OI Formatting for consistency -# oi.set_index('Datetime', inplace=True) -# oi.index = default_timestamp(oi.index) -# oi_cache[cache_key] = oi - -# return - - - -# def organize_data_for_query(missing_list: list, -# incomplete_dict: dict, -# data_request: 'DataManagers.Request') -> pd.DataFrame: -# """ -# Organizes the data for the query by parsing the option ticks and adding start and end dates. - -# Args: -# missing_list (list): List of missing option ticks. These are ticks that are not in the database at all. -# incomplete_dict (dict): Dictionary of incomplete option ticks. These are ticks that are in the database but not complete. -# data_request (BulkOptionQueryRequestParameter): The data request object containing start and end dates. - -# Returns: -# pd.DataFrame: A DataFrame containing the parsed option ticks with start and end dates. -# """ -# parsed_opts = pd.DataFrame() -# ## First populate with the ticks completely missing. -# parsed_opts = pd.DataFrame([parse_option_tick(x) for x in missing_list]) -# parsed_opts[['start_date', 'end_date']] = data_request.start_date, data_request.end_date - -# ## Next populate with the ticks that are incomplete -# for opt, _list in incomplete_dict.items(): -# if len(_list) == 0: -# continue -# opt_meta = parse_option_tick(opt) -# opt_meta['start_date'] = min(_list) -# opt_meta['end_date'] = data_request.end_date -# parsed_opts = pd.concat([parsed_opts, pd.DataFrame(opt_meta, index = [0])], axis=0) -# return parsed_opts - - -# def format_cache() -> None: -# """ -# Drops duplicates from the cache & capitalizes column names, -# but only for DataFrames we haven’t formatted yet. -# """ -# global close_cache, oi_cache, formatted_flags - -# def process_dataframe(df): -# # same as before… -# if df is None or df.empty: -# return df -# if not df.index.is_unique: -# df = df.loc[~df.index.duplicated(keep='first')] -# df.columns = [col.capitalize() for col in df.columns] -# return df - -# def process_cache(cache): -# # 1) only keys not yet in formatted_flags -# to_process = [k for k in cache if not formatted_flags.get(k, False)] - -# if not to_process: -# return - -# with ThreadPoolExecutor() as executor: -# dfs = [cache[k] for k in to_process] -# results = executor.map(process_dataframe, dfs) - -# # 2) write them back & 3) mark formatted -# for k, new_df in zip(to_process, results): -# cache[k] = new_df -# formatted_flags[k] = True - -# process_cache(get_cache('close')) -# process_cache(get_cache('oi')) - -# def merge_incomplete_data_in_cache( -# incomplete_dict: dict, -# pre_processed_data: pd.DataFrame, -# ) -> None: -# global close_cache, oi_cache, spot_cache -# ## Now we have updated cache, since incomplete date updates cache with the missing dates, we have to add the data we already have -# for tick, _list in incomplete_dict.items(): -# if len(_list) == 0: -# continue -# tick_data = pre_processed_data[pre_processed_data.Optiontick == tick] -# tick_data = tick_data.set_index('Datetime') -# close_cache[tick] = pd.concat([close_cache[tick], tick_data], axis=0).sort_index() -# oi_data = tick_data['Openinterest'].to_frame(name = 'Open_interest') -# oi_cache[tick] = pd.concat([oi_cache[tick], oi_data]).sort_index() - -# def update_spot_cache(opttick: list, target_date: str|datetime) -> None: -# """ -# Updates the spot cache with the close price for the given option tick and target date. -# Args: -# opttick (list): List of option ticks. -# target_date (str|datetime): Target date to get the close price for. -# Returns: -# None -# """ -# refresh_cache() -# global spot_cache, close_cache -# spot_results = runThreads(return_closePrice, [opttick, [target_date]*len(opttick)], 'map') -# for tick, spot in zip(opttick, spot_results): -# cache_key = f"{tick}_{target_date}" -# if spot is None: -# continue ## If spot is None, we don't update the cache -# spot_cache[cache_key] = spot - - -# def should_update_cache(key, start, end) -> bool: - -# """ -# Check if the cache should be updated based on the key and date range. - -# Args: -# key (str): The key to check in the cache. -# start (str): The start date for the date range. -# end (str): The end date for the date range. - -# Returns: -# bool: True if the cache should be updated, False otherwise. -# """ - -# ## Update cache if not in close or oi cache -# if key not in get_cache('close').keys() : -# return True - -# if key not in get_cache('oi').keys(): -# return True - -# ## Update cache if the date range is not in the cache -# close_df = get_cache('close')[key].copy() -# close_df['Datetime'] = close_df.index -# return not check_all_days_available(close_df, start, end) - - -# @log_error_with_stack(logger) -# def populate_cache_v1(start_date, -# end_date, -# order_candidates, -# target_date,) -> str|None: - -# """ -# populates the cache with the necessary data for the order candidates - -# params: -# order_candidates: dict: dictionary containing the order candidates -# example: {'type': 'naked', -# 'specifics': [{'direction': 'long', -# 'rel_strike': .900, -# 'dte': 365, -# 'moneyness_width': 0.15}, -# {'direction': 'short', -# 'rel_strike': .80, -# 'dte': 365, -# 'moneyness_width': 0.15}], - -# 'name': 'vertical_spread'} -# date: str: date to populate the cache for - -# returns: -# str|None: returns 'holiday' if the date is a holiday, 'theta_data_error' if there is an error in the theta data, None otherwise -# """ -# global close_cache, oi_cache, spot_cache - -# tempholder1 = {} -# tempholder2 = {} - -# if is_holiday(target_date): -# return 'holiday' - -# else: - -# ## Create necessary data structures -# ## Looping through the order candidates to get the necessary data, and organize into a list of lists that will be passed to runProcesses function -# for j, direction in enumerate(order_candidates): -# for i,data in enumerate(order_candidates[direction]): -# if isinstance(data, str) and data =='theta_data_error': -# return 'theta_data_error' - -# data[[ 'exp', 'strike', 'symbol', 'right']] = data[[ 'Expiration', 'Strike', 'ticker', 'Right']] -# if pd.to_datetime(target_date).weekday() >= 5: -# return 'weekend' -# data[['end_date', 'start_date']] = end_date, start_date -# data['exp'] = data['exp'].dt.strftime('%Y-%m-%d') -# tempholder1[i+j] = (data[['symbol', 'end_date', 'exp', 'right', 'start_date', 'strike']].T.values.tolist()) -# tempholder2[i+j] = data[['symbol', 'right', 'exp','strike']].T.values.tolist() -# symbol = data['symbol'].unique()[0] -# expiration = data['exp'].unique()[0] - -# ## Extending lists, to ensure only one runProcesses call is made, instead of run per side -# for i, data in tempholder1.items(): -# if i == 0: -# OrderedList = data -# tickOrderedList = tempholder2[i] -# else: -# for position, vars in enumerate(data): -# OrderedList[position].extend(vars) -# for position, vars in enumerate(tempholder2[i]): -# tickOrderedList[position].extend(vars) - - - -# ## TO-DO: -# ## 1. Create hacked function to catch errors from ThetaData -# ## 2. Add OptionDataManager.one_off_save in hacked function -# eod_results = (runThreads(retrieve_eod_ohlc, OrderedList, 'map')) -# oi_results = (runThreads(_retrieve_openInterest, OrderedList, 'map')) -# tick_results = (runThreads(generate_option_tick_new, tickOrderedList, 'map')) - -# ## Save to Dictionary Cache -# logger.info(f"Updating Cache for: {symbol}, {expiration}, {target_date}") -# for tick, eod, oi in zip(tick_results, eod_results, oi_results): -# cache_key = f"{tick}" -# close_cache[cache_key] = eod -# oi_cache[cache_key] = oi - -# spot_results = runThreads(return_closePrice, [tick_results, [target_date]*len(tick_results)], 'map') -# for tick, spot in zip(tick_results, spot_results): -# cache_key = f"{tick}_{target_date}" -# spot_cache[cache_key] = spot - - -# @log_error_with_stack(logger) -# @log_time(time_logger) -# def populate_cache_v2( -# start, -# end, -# candidates, -# target_date, -# ) -> str|None: -# """ -# populates the cache with the necessary data for the order candidates -# This version will improve on the previous one by using the new BulkOptionDataManager -# The goal is to make use of our database to speed up queries where possible - -# params: -# candidates: dict: dictionary containing the order candidates -# example: {'type': 'naked', -# 'specifics': [{'direction': 'long', -# 'rel_strike': .900, -# 'dte': 365, -# 'moneyness_width': 0.15}, -# {'direction': 'short', -# 'rel_strike': .80, -# 'dte': 365, -# 'moneyness_width': 0.15}], - -# 'name': 'vertical_spread'} -# start: str: date to populate the cache for -# end: str: date to populate the cache for -# target_date: str: date to populate the cache for - -# returns: -# str|None: returns 'holiday' if the date is a holiday, 'theta_data_error' if there is an error in the theta data, None otherwise -# """ - -# global oi_cache, close_cache, oi_cache, spot_cache -# start, end = pd.to_datetime(start), pd.to_datetime(end) -# full_data = pd.DataFrame() -# for direction in candidates: -# for data in candidates[direction]: -# if isinstance(data, str) and data =='theta_data_error': -# return 'theta_data_error' - -# elif pd.to_datetime(target_date).weekday() >= 5: -# return 'weekend' - -# elif isinstance(data, str) and data =='holiday': -# return 'holiday' - -# elif isinstance(data, str): -# logger.error(f"Data is a string: {data}, Error incoming...") - -# full_data = pd.concat([full_data, data], axis=0) - -# full_data.index.name = 'Date' -# full_data.columns.name = '' -# full_data['start_date'] = start -# full_data['end_date'] = end -# full_data.reset_index(inplace=True) -# tick = full_data.ticker.unique()[0] -# exp = full_data.Expiration.unique()[0] -# strikes_right = list(full_data[['Strike', 'Right']].itertuples(name=None, index=False)) -# opttick = [generate_option_tick_new(tick, x[1], exp, x[0]) for x in strikes_right] -# update_spot = [x for x in opttick if f"{x}_{target_date}" not in spot_cache.keys()] - -# ## 1) Goal: Ensuring we don't requery the database for data we already have. Saves time -# ## Filtering out the ones that are already in the cache -# strikes_right = [x for x in strikes_right if opttick[strikes_right.index(x)] not in close_cache.keys()] - -# ## 2) Goal: For all ticks in cache, we want to reupdate if start & end not in cache. -# ## Getting opttick already in cache - -# cached_opttick = [x for x in opttick if x in close_cache.keys()] -# non_cached_opttick = [x for x in opttick if x not in close_cache.keys()] - -# if len(strikes_right) != 0: -# logger.critical(f"Data needs to be queried for {len(strikes_right)} strikes_right. Load time ~1.5mins") - -# # ## Updating strikes_right list with this keys once we have checked that they should be updated -# # if len(cached_opttick) != 0: -# # update_list = [(parse_option_tick(key)["strike"], parse_option_tick(key)["put_call"]) \ -# # for key in cached_opttick if should_update_cache(key, start, end)] -# # strikes_right.extend(update_list) - -# strikes_right = list(set(strikes_right)) ## Removing duplicates -# logger.info(f"Number of strikes_right: {len(strikes_right)}") -# logger.info(f"Strike Rights: {strikes_right}") - -# logger.info(f"Info on {tick}, for date: {target_date}") - -# ## Let's start with getting the requested data from database - -# ## If everything is in the cache, we don't need to do anything. Go straight to updating spot -# if len(strikes_right) != 0: -# manager = BulkOptionDataManager(symbol=tick, exp=exp) -# logger.info(f"Generating Data for {manager.symbol} {manager.exp}") -# data_request = assemble_bulk_data_request( -# self = manager, -# start = start, -# end = end, -# type_ = 'spot', -# strikes_right = strikes_right, -# # strikes_right= [(225.0, 'C'), (280.0, 'P'), (250.0, 'C'), (290.0, 'P'), (270.0, 'C'), (270.0, 'P')], - -# ) -# # ## Second: we query our database to see what data we have -# query_time = time.time() -# init_query(data_request = data_request, query_category = 'bulk') -# logger.info(f"Time taken to query database: {time.time()-query_time}") -# num_optticks = len(data_request.opttick) -# size_database_data = len(data_request.database_data) -# expected_days = bus_range(data_request.start_date, data_request.end_date, freq = '1B') -# logger.info(f"Date Range: {data_request.start_date} to {data_request.end_date}") -# logger.info(f"Number of requested optticks: {num_optticks}") -# logger.info(f"Number of database data: {size_database_data}") -# logger.info(f"Number of expected days: {len(expected_days)}") -# logger.info(f"Expected Size of database data: {num_optticks * len(expected_days)}") -# logger.info(f"Amount discrepancy: {num_optticks * len(expected_days) - size_database_data}") -# logger.info(f"Time taken to query database: {time.time()-query_time}") - -# # ## Third: we pre_process the data request to see if it is complete -# BulkOptionDataManager.pre_process_data(data_request = data_request) - - -# is_complete = data_request.pre_process['is_complete'] -# pre_processed_data = data_request.pre_processed_data.reset_index() -# is_complete_series = pre_processed_data.groupby('Optiontick').apply(check_all_days_available, _start = data_request.start_date, _end = data_request.end_date) -# logger.info(f"Is complete series: {is_complete_series.to_string()}") -# opttick = data_request.opttick -# logger.info(f"Data Is_complete bool: {is_complete}") - -# ## If complete, Fantastic! We re done, now update cache and get out -# if is_complete: -# pre_processed_data.groupby('Optiontick').apply(update_caches) - -# ## If NOT complete, do not fret. We'll simply run our process for incomplete/missing ticks -# else: -# ## We first check for the requested ticks. Which one is not in database at all? -# missing_opttick = [x for x in data_request.opttick if x not in pre_processed_data.Optiontick.unique()] -# logger.info(f"In missing opttick but not in opttick: ") -# logger.info([x for x in opttick if x not in missing_opttick]) - -# ## Next we check to see if the requested opttick data is COMPELETE. -# ## If incomplete, we perform runthreads -# check_partial = partial(check_all_days_available, _start = data_request.start_date, _end = data_request.end_date) -# opttick_complete = pre_processed_data.groupby('Optiontick').apply(check_partial) -# incomplete_ticks = opttick_complete[opttick_complete==False].index.tolist() -# incomplete_dict = pre_processed_data.groupby('Optiontick').apply(check_missing_dates, _start = data_request.start_date, _end = data_request.end_date) -# if incomplete_dict.empty: -# incomplete_dict = {} -# else: -# incomplete_dict = incomplete_dict.to_dict() -# ## Before we perform run Threads, it is important we update cache with the Optticks that are COMPLETE -# available = opttick_complete[opttick_complete==True].index -# # pre_processed_data[pre_processed_data.Optiontick.isin(available)].groupby('Optiontick').apply(update_caches) - -# ## We want to update the cache with whatever we have. merge_incomplete_data_in_cache will take care of the rest -# pre_processed_data.groupby('Optiontick').apply(update_caches) -# ## Produce the dataframe that stores names to update the cache -# to_update_cache_data = organize_data_for_query( -# missing_list=missing_opttick, -# incomplete_dict=incomplete_dict, -# data_request=data_request -# ) - - - -# start_time = time.time() -# update_cache_with_missing_ticks(parsed_opts = to_update_cache_data, date = target_date) -# end_time = time.time() -# logger.info(f"Time taken to update cache: {end_time-start_time}") - -# ## Merge the data we have in cache with the data we just retrieved for the incomplete ticks -# merge_incomplete_data_in_cache(incomplete_dict = incomplete_dict, pre_processed_data = pre_processed_data) -# format_cache() -# refresh_cache() - - -# ## Now we update the spot cache -# update_spot_cache(opttick = update_spot, target_date = target_date) -# else: -# format_cache() -# update_spot_cache(opttick = update_spot, target_date = target_date) - -# BulkOptionDataManager.one_off_save( -# start=start, -# end=end, -# tick=tick, -# exp=exp -# ) ## We shouldn't keep going to thetadata, that takes time. Submit a process. Don't worry it runs on a new process. -# ## Wouldn't affect current procedures - - - - -# @copy_doc(populate_cache_v2) -# def populate_cache(start_date, end_date, order_candidates, target_date, version = 2) -> str|None: -# logger.error(f"Populate Cache Dates: Start: {start_date}, End: {end_date}, Target: {target_date}") -# if version == 1: -# logger.info("Using V1") -# return populate_cache_v1(start_date, end_date, order_candidates, target_date) -# elif version == 2: -# logger.info("Using V2") -# return populate_cache_v2(start_date, end_date, order_candidates, target_date) - - -# def return_closePrice(id: str, -# date: str) -> float: -# """ -# returns the close price of the option contract -# id: str: id of the option contract, corresponding to cache keys. -# ps: Use spot_cache.keys() to get the keys -# date: str: date to get the close price for - -# returns: -# float: close price of the option contract - -# """ -# refresh_cache() -# global close_cache, spot_cache, oi_cache -# cache_key = f"{id}" ## Close Uses only the id, not the date -# close_data = close_cache[cache_key] -# if close_data is None: -# return None -# close_data = close_data[~close_data.index.duplicated(keep = 'first')] -# if date not in close_data.index: -# ## If the date is not in the close data, we remove that key from the cache -# ## There's no way to resolve this, so we remove the key from the cache -# try: -# logger.info(f"Removing {cache_key} from cache, since date {date} not in close data") -# DELETED_KEYS.append(cache_key) -# except KeyError: -# pass -# return None -# close = close_data['Midpoint'][date] -# return close - - -# def load_chain(date: str, -# ticker: str, -# print_stderr: bool = False) -> None: -# """ -# loads the option chain for the given date and ticker - -# params: -# date: str: date to load the chain for -# ticker: str: ticker to load the chain for -# print_stderr: bool: whether to print to stderr or not - -# returns: -# None - -# """ -# logger.error(date, ticker) if print_stderr else None -# ## Get both calls and puts per moneyness. For 1 Moneyness, both will most be available. If not, if one is False, other True. -# ## We will need to get two rows. -# chain_key = f"{date}_{ticker}" -# with Context(end_date = date): -# if chain_key in chain_cache: -# Option_Chain = chain_cache[chain_key] -# else: -# start_time = time.time() -# Stock_obj = Stock(ticker, run_chain = False) -# end_time = time.time() -# logger.error(f"Time taken to get stock object: {end_time-start_time}") if print_stderr else None -# Option_Chain = Stock_obj.option_chain() -# Spot = Stock_obj.spot(ts = False, spot_type = OptionModelAttributes.spot_type.name) ## need to use chain price to get the spot price, due to splits -# Spot = list(Spot.values())[0] -# Option_Chain['Spot'] = Spot -# Option_Chain['q'] = Stock_obj.div_yield() -# Option_Chain['r'] = Stock_obj.rf_rate -# chain_cache[chain_key] = Option_Chain - - - - - -# def chain_details(date: str, -# ticker: str, -# tgt_dte: int, -# tgt_moneyness: float, -# right: str ='P', -# moneyness_width: float =0.15, -# print_stderr: bool = False) -> pd.DataFrame: - - -# """ -# Returns the option chain details for the given date, ticker, target days to expiration, target moneyness, right, and moneyness width - -# params: -# date: str: date to get the chain for -# ticker: str: ticker to get the chain for -# tgt_dte: int: target days to expiration -# tgt_moneyness: float: target moneyness -# right: str: right of the option contract. Default is 'P' -# moneyness_width: float: moneyness width. Default is 0.15. This is the width of the moneyness spread -# print_stderr: bool: whether to print to stderr or not - -# returns: -# pd.DataFrame: option chain details -# """ -# return_dataframe = pd.DataFrame() -# errors = {} -# if is_holiday(date): -# return 'holiday' -# try: -# logger.error(date, ticker) if print_stderr else None -# chain_key = f"{date}_{ticker}" -# with Context(end_date=date): -# if chain_key in chain_cache: -# Option_Chain = chain_cache[chain_key] -# else: -# start_time = time.time() -# Stock_obj = Stock(ticker, run_chain=False) -# end_time = time.time() -# logger.error(f"Time taken to get stock object: {end_time-start_time}") if print_stderr else None -# try: -# Option_Chain = Stock_obj.option_chain() -# except: -# return 'theta_data_error' -# Spot = Stock_obj.spot(ts=False, spot_type=OptionModelAttributes.spot_type.value) ## need to use chain price to get the spot price, due to splits -# Spot = list(Spot.values())[0] -# Option_Chain['Spot'] = Spot -# Option_Chain['q'] = Stock_obj.div_yield() -# Option_Chain['r'] = Stock_obj.rf_rate -# chain_cache[chain_key] = Option_Chain - -# Option_Chain_Filtered = Option_Chain[Option_Chain[right.upper()]==True] - -# if right == 'P': -# Option_Chain_Filtered['relative_moneyness'] = Option_Chain_Filtered.index.get_level_values('Strike') / Option_Chain_Filtered.Spot -# elif right == 'C': -# Option_Chain_Filtered['relative_moneyness'] = Option_Chain_Filtered.Spot / Option_Chain_Filtered.index.get_level_values('Strike') -# else: -# raise ValueError(f'Right dne. received {right}') - -# Option_Chain_Filtered['moneyness_spread'] = (tgt_moneyness - Option_Chain_Filtered['relative_moneyness'])**2 -# Option_Chain_Filtered['dte_spread'] = (Option_Chain_Filtered.index.get_level_values('DTE') - tgt_dte)**2 -# Option_Chain_Filtered.sort_values(by=['dte_spread', 'moneyness_spread'], inplace=True) -# Option_Chain_Filtered = Option_Chain_Filtered.loc[Option_Chain_Filtered['dte_spread'] == Option_Chain_Filtered['dte_spread'].min()] - -# ## Secondary fix for when dte_spread **2 leads to both lower bound and upper bound being the same. Which returns two Expirations -# if len(Option_Chain_Filtered.reset_index().DTE.unique()) > 1: -# Option_Chain_Filtered = Option_Chain_Filtered.loc[Option_Chain_Filtered.index.get_level_values('DTE') ==\ -# Option_Chain_Filtered.index.get_level_values('DTE').max()] - -# if float(moneyness_width) == 0.0: -# option_details = Option_Chain_Filtered.sort_values('moneyness_spread', ascending=True).head(1) -# else: -# option_details = Option_Chain_Filtered[(Option_Chain_Filtered['relative_moneyness'] >= tgt_moneyness - moneyness_width) & -# (Option_Chain_Filtered['relative_moneyness'] <= tgt_moneyness + moneyness_width)] - -# if option_details.empty: -# return None - -# option_details['build_date'] = date -# option_details['ticker'] = ticker -# option_details['moneyness'] = tgt_moneyness -# option_details['TGT_DTE'] = tgt_dte -# option_details.reset_index(inplace = True) -# option_details.set_index('build_date', inplace = True) -# option_details['Right'] = right -# option_details.drop(columns = ['C','P'], inplace = True) -# option_details['option_id'] = option_details.apply(lambda x: generate_option_tick_new(symbol = x['ticker'], -# exp = x['Expiration'].strftime('%Y-%m-%d'), strike = float(x['Strike']), right = x['Right']), axis = 1) -# return_dataframe = pd.concat([return_dataframe, option_details]) -# clear_context() -# return_dataframe.drop_duplicates(inplace = True) - -# except Exception as e: -# raise e -# return 'error' - - -# return return_dataframe.sort_values('relative_moneyness', ascending=False) - - - -# def available_close_check(id: str, -# date: str, -# threshold: float = 0.7, -# lookback: float = 30) -> bool: - -# """ -# checks if the close price is available for the given id and date - -# params: -# id: str: id of the option contract -# ps: Use spot_cache.keys() to get the available ids -# date: str: date to check the close price for -# threshold: float: threshold to check if the close price is available. Default is 0.7 - -# returns: -# bool: True if the close price is available, False otherwise -# """ -# cache_key = f"{id}" ## Close Uses only the id, not the date -# if cache_key in DELETED_KEYS: -# ## If the cache key is in the deleted keys, we return False -# logger.info(f"Close Check: {id} is in DELETED_KEYS, returning False") -# return False -# sample_id = deepcopy(get_option_specifics_from_key(id)) -# new_dict_keys = {'ticker': 'symbol', 'exp_date': 'exp', 'strike': 'strike', 'put_call': 'right'} -# transfer_dict = {} -# for k, v in sample_id.items(): -# if k in new_dict_keys: -# if k == 'strike': -# transfer_dict[new_dict_keys[k]] = float(sample_id[k]) -# else: -# transfer_dict[new_dict_keys[k]] = sample_id[k] - -# if cache_key in close_cache: -# close_data_sample = close_cache[cache_key] -# close_data_sample = close_data_sample[(~close_data_sample.index.duplicated(keep = 'first')) & (close_data_sample.index <= date)] ## Filter out duplicates, and only dates before the target date -# close_data_sample = close_data_sample.iloc[-lookback:] ## Get the last lookback days -# else: -# start = LOOKBACKS[date][lookback] # Used precomputed BDay(30) -# close_data_sample = retrieve_eod_ohlc(**transfer_dict, start_date=start, end_date=date) -# close_cache[cache_key] = close_data_sample -# close_mask_series = close_data_sample.Close != 0 -# return close_mask_series.sum()/len(close_mask_series) > threshold - -# @log_time(time_logger) -# def produce_order_candidates(settings: dict, -# tick: str, -# date: str, -# right: str = 'P', -# thread: bool = False) -> dict: -# """ -# returns the order candidates for the given settings, tick, date, and right - -# params: -# settings: dict: settings for the order candidates -# example: {'type': 'naked', -# 'specifics': [{'direction': 'long', -# 'rel_strike': .900, -# 'dte': 365, -# 'moneyness_width': 0.15}, -# {'direction': 'short', -# 'rel_strike': .80, -# 'dte': 365, -# 'moneyness_width': 0.15}], - -# 'name': 'vertical_spread'} - -# tick: str: ticker to get the order candidates for -# date: str: date to get the order candidates for -# right: str: right of the option contract. Default is 'P' - -# returns: -# dict: order_candidates -# """ - -# def hacked_chain_details(*args, **kwargs): -# direction = kwargs.pop('direction') -# chain = chain_details(*args, **kwargs) -# order_candidates[direction].append(chain) - -# thread_lock = Lock() -# order_candidates = {'long': [], 'short': []} -# thread_list = [] -# if thread: -# for spec in settings['specifics']: -# _thread = Thread(target=hacked_chain_details, args=(date, tick, spec['dte'], spec['rel_strike'], right, spec['moneyness_width']), kwargs={'direction': spec['direction']}) -# _thread.start() -# thread_list.append(_thread) -# for thread in thread_list: -# thread.join() -# else: -# for spec in settings['specifics']: -# direction = spec['direction'] -# chain = chain_details(date, tick, spec['dte'], spec['rel_strike'], right, moneyness_width = spec['moneyness_width']) -# order_candidates[spec['direction']].append(chain) -# return order_candidates - - -# def liquidity_check(id: str, -# date: str, -# pass_threshold: int|float = 250, -# lookback: int = 10) -> bool: - -# """ -# returns True if the liquidity is greater than the pass_threshold, False otherwise - -# params: -# id: str: id of the option contract -# ps: Use oi_cache.keys() to get the available ids -# date: str: date to check the liquidity for -# pass_threshold: int|float: threshold to check if the liquidity is greater than. Default is 250 -# lookback: int: lookback to check the liquidity for. Default is 10 - -# returns: -# bool: True if the liquidity is greater than the pass_threshold, False otherwise -# """ -# if id in DELETED_KEYS: -# ## If the cache key is in the deleted keys, we return False -# logger.info(f"Liquidity Check: {id} is in DELETED_KEYS, returning False") -# return False -# sample_id = deepcopy(get_option_specifics_from_key(id)) -# new_dict_keys = {'ticker': 'symbol', 'exp_date': 'exp', 'strike': 'strike', 'put_call': 'right'} -# transfer_dict = {} - -# for k, v in sample_id.items(): - -# if k in new_dict_keys: -# if k == 'strike': -# transfer_dict[new_dict_keys[k]] = float(sample_id[k]) -# else: -# transfer_dict[new_dict_keys[k]] = sample_id[k] - -# start = LOOKBACKS[date][lookback] # Used precomputed BDay(30) -# oi_data = oi_cache[f"{id}"] ## OI Uses only the id, not the date -# if oi_data is None: -# return False -# oi_data = oi_data[~oi_data.index.duplicated(keep = 'first')] -# oi_data = oi_data[oi_data.index <= date] -# oi_data = oi_data.iloc[-lookback:] ## Get the last lookback days - - -# if isinstance(oi_data, pd.DataFrame): -# if oi_data.empty: -# return False - -# elif oi_data is None: -# return False - -# oi_data = oi_data[~oi_data.index.duplicated(keep = 'first')] -# oi_data = oi_data.iloc[:lookback] -# return oi_data.Open_interest.sum()/lookback > pass_threshold if isinstance(oi_data, pd.DataFrame) else False - - - - - -# # import functools -# # import pandas as pd - -# # def make_cache_key(func, args, kwargs): -# # # naïve example: you can improve by normalizing mutable inputs if needed -# # return (func.__name__, args, tuple(sorted(kwargs.items()))) - -# # def populate_cache_with_chain(tick, date, chain_spot=None, print_url=True): -# # """ -# # Populate the cache with chain data. -# # """ -# # cache = get_persistent_cache() # resolved on every call -# # # build a key depending on the inputs that define uniqueness -# # key = make_cache_key(populate_cache_with_chain, (tick, date), {'chain_spot': chain_spot, 'print_url': print_url}) - -# # # Try fetch from cache manually -# # if key in cache: -# # logger.info(f"Cache hit for {tick} on {date}") -# # return cache[key] - -# # # Otherwise compute -# # chain = retrieve_chain_bulk( -# # tick, -# # '', -# # date, -# # date, -# # '16:00', -# # 'C', -# # print_url=print_url -# # ) -# # logger.info(f"Retrieved chain for {tick} on {date}") - -# # ## Clip Chain -# # chain_clipped = chain.reset_index()#[['datetime', 'Root', 'Strike', 'Right', 'Expiration', 'Midpoint']] -# # if PATCH_TICKERS: -# # chain_clipped['Root'] = chain_clipped['Root'].apply(swap_ticker) - -# # ## Create ID -# # id_params = chain_clipped[['Root', 'Right', 'Expiration', 'Strike']].T.to_numpy() -# # ids = runThreads( -# # generate_option_tick_new, -# # id_params -# # ) -# # chain_clipped['opttick'] = ids -# # filter_opt = get_avoid_opticks(tick) -# # chain_clipped = chain_clipped[~chain_clipped['opttick'].isin(filter_opt)] -# # chain_clipped['chain_id'] = chain_clipped['opttick'] + '_' + chain_clipped['datetime'].astype(str) -# # chain_clipped['dte'] = (pd.to_datetime(chain_clipped['Expiration']) - pd.to_datetime(chain_clipped['datetime'])).dt.days - -# # ## Save to cache (spot) -# # def save_to_cache(id_, date_, spot): -# # date_str = pd.to_datetime(date_).strftime('%Y-%m-%d') -# # save_id = f"{id_}_{date_str}" -# # if save_id not in get_cache('spot'): -# # spot_cache[save_id] = spot -# # save_params = chain_clipped[['opttick', 'datetime', 'Midpoint']].T.to_numpy() -# # runThreads( -# # save_to_cache, -# # save_params -# # ) - -# # if chain_spot: -# # chain_clipped['spot'] = chain_spot -# # chain_clipped['moneyness'] = 0 -# # chain_clipped.loc[chain_clipped['Right'] == 'C', 'moneyness'] = ( -# # chain_clipped.loc[chain_clipped['Right'] == 'C', 'Strike'] -# # / chain_clipped.loc[chain_clipped['Right'] == 'C', 'spot'] -# # ) -# # chain_clipped.loc[chain_clipped['Right'] == 'P', 'moneyness'] = ( -# # chain_clipped.loc[chain_clipped['Right'] == 'P', 'spot'] -# # / chain_clipped.loc[chain_clipped['Right'] == 'P', 'Strike'] -# # ) -# # chain_clipped = chain_clipped[chain_clipped['moneyness'].between(0.1, 2)] - -# # chain_clipped.columns = chain_clipped.columns.str.lower() - -# # # Store result in cache -# # cache[key] = chain_clipped - -# # return chain_clipped diff --git a/EventDriven/riskmanager/.decomm/picker.py b/EventDriven/riskmanager/.decomm/picker.py deleted file mode 100644 index 944ced6..0000000 --- a/EventDriven/riskmanager/.decomm/picker.py +++ /dev/null @@ -1,294 +0,0 @@ -# import pandas as pd -# import numpy as np -# from dataclasses import dataclass -# from typing import Any, Dict -# from EventDriven.types import ResultsEnum -# from .utils import (logger, -# get_cache, -# LOOKBACKS, -# precompute_lookbacks, -# populate_cache_with_chain, -# time_logger, -# produce_order_candidates, -# refresh_cache, -# populate_cache, -# logger) -# from .utils import * -# from datetime import datetime, timedelta -# from trade.helpers.helper import CustomCache -# order_cache = CustomCache(BASE, fname = "order") - - - - -# # --------- OrderSchema --------- -# @dataclass -# class OrderSchema: -# data: Dict[str, Any] - -# def __post_init__(self): -# required = ["strategy", -# "option_type", -# "target_dte", -# "dte_tolerance", -# "structure_direction", -# "max_total_price", -# "min_total_price", -# "tick"] -# for key in required: -# if key not in self.data: -# raise ValueError(f"Missing required field: {key}") - -# if self.data["strategy"] == "vertical" and not ("spread_pct" in self.data or "spread_ticks" in self.data): -# raise ValueError("Vertical strategies require either 'spread_pct' or 'spread_ticks'") - -# optional = {"min_moneyness": 0.9, "max_moneyness": 1.1, "max_attempts": 3, "increment": 0.25} -# for key, default in optional.items(): -# if key not in self.data: -# self.data[key] = default - -# def __getitem__(self, key): -# return self.data[key] - -# def __contains__(self, key): -# return key in self.data - -# def __setitem__(self, key, value): -# if key not in self.data: -# raise KeyError(f"Key '{key}' not found in OrderSchema.") -# self.data[key] = value - -# def __repr__(self): -# return repr(self.data) - -# def get(self, key, default=None): -# return self.data.get(key, default) - -# # --------- Utilities --------- -# def resolve_ordering(option_type, structure_direction): -# if structure_direction == "long": -# return (True, ("long", "short")) if option_type.lower() == "c" else (False, ("long", "short")) -# else: -# return (False, ("short", "long")) if option_type.lower() == "p" else (True, ("short", "long")) - -# def filter_contracts(df: pd.DataFrame, schema: OrderSchema, spot: float, min_moneyness: float = 0.5, max_moneyness: float = 1.5, increment =0.25) -> pd.DataFrame: -# target_dte = schema["target_dte"] -# dte_tol = schema["dte_tolerance"] -# filtered = pd.DataFrame() -# attempt = 0 -# factor = 1 -# max_attempts = schema.get("max_attempts", 3) -# min_moneyness = schema.get("min_moneyness", min_moneyness) -# max_moneyness = schema.get("max_moneyness", max_moneyness) -# max_pct_width = schema.get("max_pct_width", 0.10) ## NOTE: Add to schema -# min_oi = schema.get("min_open_interest", 25) ## NOTE: Add to schema -# increment = schema.get("increment", increment) -# while filtered.empty and attempt < max_attempts: -# lower_strike = spot * (min(min_moneyness, max_moneyness) * factor) -# upper_strike = spot * (max(min_moneyness, max_moneyness)* factor) -# filtered = df[ -# (df["dte"].between(target_dte - dte_tol, target_dte + dte_tol)) & -# (df["strike"].between(lower_strike, upper_strike)) -# # (df["open_interest"] >= min_oi) & -# # (df["pct_spread"] <= max_pct_width) -# ].copy() -# attempt += 1 -# factor *= (1 + increment) # Increase the range by a factor of (1 + increment) each attempt -# if filtered.empty: -# logger.critical(f"Warning: No contracts found for {schema['option_type']} with DTE {target_dte} ± {dte_tol} and strike range [{lower_strike:.2f}, {upper_strike:.2f}] after {attempt} attempts.") -# return filtered.reset_index(drop=True) - -# def build_spread_by_ticks(df, schema, cache): -# df = df[df["right"].str.lower() == schema["option_type"].lower()].copy() -# print(f"In `build_spread_by_ticks`: Rights filtered for: {schema['option_type'].lower()}. Found: {df['right'].unique()} types.") -# try: -# df["mid"] = df["chain_id"].map(cache) -# except: -# logger.error("Error mapping chain_id to mid prices in cache.") -# df["mid"] = df["midpoint"] -# df = df.dropna(subset=["mid"]) -# ascending, _ = resolve_ordering(schema["option_type"], schema["structure_direction"]) - -# spreads = [] -# for exp, group in df.groupby("expiration"): -# group = group.sort_values("strike", ascending=ascending).reset_index(drop=True) -# for i in range(len(group) - schema["spread_ticks"]): -# leg1, leg2 = group.iloc[i], group.iloc[i + schema["spread_ticks"]] -# long, short = (leg1, leg2) -# spread_price = long["mid"] - short["mid"] -# try: -# spread_bid = long["closebid"] - short["closeask"] -# spread_ask = long["closeask"] - short["closebid"] -# spread_pct_ratio = abs(spread_bid - spread_ask) / abs(spread_bid+spread_ask)/2 -# long_oi = long.get('open_interest', np.nan) -# short_oi = short.get('open_interest', np.nan) -# spread_oi = abs(long_oi) + abs(short_oi) -# except: ## Error handling for missing bid/ask data -# spread_bid = 0.0 -# spread_ask = 0.0 -# spread_pct_ratio = 0.0 -# long_oi = 0.0 -# short_oi = 0.0 -# spread_oi = 0.0 - -# if abs(spread_price) <= schema["max_total_price"] and abs(spread_price) >= schema["min_total_price"]: -# spreads.append({ -# "long": long, "short": short, -# "spread_price": spread_price, -# "width": abs(short["strike"] - long["strike"]), -# "dte": int(long["dte"]), -# "expiration": long["expiration"], -# "option_type": schema["option_type"], -# "type": "vertical", -# "legs": [long, short], -# "spread_pct_ratio": spread_pct_ratio, -# "spread_bid": spread_bid, -# "spread_ask": spread_ask, -# "long_bid": long.get("closebid", np.nan), -# "long_ask": long.get("closeask", np.nan), -# "short_bid": short.get("closebid", np.nan), -# "short_ask": short.get("closeask", np.nan), -# "long_pct_spread": long.get("pct_spread", np.nan), -# "short_pct_spread": short.get("pct_spread", np.nan), -# "spread_mid": (spread_bid + spread_ask) / 2 if (spread_bid + spread_ask) != 0 else np.nan, -# "long_oi": long_oi, -# "short_oi": short_oi, -# "spread_oi": spread_oi, -# }) -# if len(spreads) == 0: -# ## Priortize: -# ## 1. Structure Spread Ratio (Bid-Ask)/Mid -# ## 2. Largest Spread Open Interest (Bid + Ask) -# ## 3. Lowest Spread Price -# logger.critical(f"No spreads found for {schema['option_type']} with DTE {schema['target_dte']} ± {schema['dte_tolerance']} and ticks {schema['spread_ticks']}.") -# return [] -# if schema["structure_direction"] == "long": -# pick = min((s for s in spreads if s["spread_price"] > 0), key=lambda s: (s["spread_pct_ratio"], -s['spread_oi'], s["spread_price"]), default=None) -# else: -# pick = min((s for s in spreads if s["spread_price"] < 0), key=lambda s: (s["spread_pct_ratio"], -s['spread_oi'], s["spread_price"]), default=None) - -# return [pick] if pick else [] - - -# def build_spread_by_pct(df, schema, spot, cache): -# df = df[df["right"].str.lower() == schema["option_type"].lower()].copy() -# df["mid"] = df["chain_id"].map(cache) -# df = df.dropna(subset=["mid"]) -# ascending, _ = resolve_ordering(schema["option_type"], schema["structure_direction"]) -# spreads = [] -# for exp, group in df.groupby("expiration"): -# group = group.sort_values("strike", ascending=ascending).reset_index(drop=True) -# for i in range(len(group)): -# leg1 = group.iloc[i] -# target_strike = leg1["strike"] + (spot * schema["spread_pct"] if ascending else -spot * schema["spread_pct"]) -# group_slice = group.iloc[i+1:] # only look ahead to maintain spread structure -# if group_slice.empty: -# continue - -# leg2_idx = (group_slice["strike"] - target_strike).abs().idxmin() -# leg2 = group.loc[leg2_idx] -# error = (leg2["strike"] - target_strike) ** 2 - -# ## Controlling distance apart. Avoiding spreads that are too wide or too narrow. -# actual_width = abs(leg2["strike"] - leg1["strike"]) -# min_width = spot * schema["spread_pct"] * 0.10 -# max_error = (spot * schema["spread_pct"] * 1.5) ** 2 - -# if actual_width < min_width or error > max_error: -# logger.info(f"Skipping spread due to width or error: {actual_width:.2f} < {min_width:.2f} or error {error:.2f} > {max_error:.2f}") -# print(f"Skipping spread due to width or error: {actual_width:.2f} < {min_width:.2f} or error {error:.2f}") -# continue - -# long, short = (leg1, leg2) -# spread_price = long["mid"] - short["mid"] - -# if abs(spread_price) <= schema["max_total_price"]: -# spreads.append({ -# "long": long, "short": short, -# "spread_price": spread_price, -# "width": abs(short["strike"] - long["strike"]), -# "dte": int(long["dte"]), -# "expiration": long["expiration"], -# "option_type": schema["option_type"], -# "type": "vertical", -# "legs": [long, short], -# }) -# if schema["structure_direction"] == "long": -# pick = min((s for s in spreads if s["spread_price"] > 0), key=lambda s: s["spread_price"], default=None) -# else: -# pick = min((s for s in spreads if s["spread_price"] < 0), key=lambda s: s["spread_price"], default=None) -# return [pick] if pick else [] - -# def build_vertical_spread(df, schema, spot, cache): -# df = filter_contracts(df, schema, spot) -# return build_spread_by_ticks(df, schema, cache) if "spread_ticks" in schema else build_spread_by_pct(df, schema, spot, cache) - -# def build_naked_option(df, schema, spot, cache): -# df = filter_contracts(df, schema, spot) -# df = df[df["right"].str.lower() == schema["option_type"].lower()].copy() -# df["mid"] = df["chain_id"].map(cache) -# df = df.dropna(subset=["mid"]) -# df = df[df["mid"] <= schema["max_total_price"]] -# df = df.sort_values("mid", ascending=(schema["structure_direction"] == "long")) -# pick = df.iloc[0] if not df.empty else None -# return [{schema["structure_direction"]: pick}] if pick is not None else [] - -# STRATEGY_MAP = { -# "vertical": build_vertical_spread, -# "naked": build_naked_option, -# } - - -# def build_strategy(df, schema, spot, cache): - -# if schema["strategy"] not in STRATEGY_MAP: -# raise ValueError(f"Unsupported strategy: {schema['strategy']}") -# builder = STRATEGY_MAP.get(schema["strategy"]) -# return builder(df, schema, spot, cache) if builder else [] - - -# def create_trade_id(legs: Dict[str, Any]) -> str: -# def _iter_side(side): -# if side is None: -# return [] -# if isinstance(side, dict): -# return [side] -# if isinstance(side, (list, tuple)): -# return list(side) -# if isinstance(side, pd.Series): -# return [side.to_dict()] -# raise TypeError(f"legs['long'/'short'] must be dict or list[dict]. Recieved {type(side)}") - -# parts = [] -# for leg in _iter_side(legs.get("long")): -# parts.append(f"&L:{leg['opttick']}") -# for leg in _iter_side(legs.get("short")): -# parts.append(f"&S:{leg['opttick']}") -# return "".join(parts) - -# def extract_order(obj): -# order = {} - - -# ## If no contracts found, return early -# if not obj: -# order['result'] = ResultsEnum.NO_CONTRACTS_FOUND.value -# order['data'] = None -# return order - -# pack=obj[0] ## This is because raw order is just a [1dict] -# ## If contracts found, build the order -# order['result'] = ResultsEnum.SUCCESSFUL.value -# order['data'] = {"trade_id": "", -# "close": 0, -# 'long': [], -# 'short': [],} -# for pack in obj: -# for direction, data in pack.items(): -# if direction not in ('long', 'short'): -# continue -# order['data'][direction].append(data["opttick"]) -# mid = data["mid"] -# order['data']['close'] += mid if direction == 'long' else -mid -# order['data']['trade_id'] = create_trade_id(pack) -# return order diff --git a/EventDriven/riskmanager/.decomm/portfolio.py b/EventDriven/riskmanager/.decomm/portfolio.py deleted file mode 100644 index 1c0c116..0000000 --- a/EventDriven/riskmanager/.decomm/portfolio.py +++ /dev/null @@ -1,1154 +0,0 @@ -## Portfolio Expected Responsiblities: -# - Portfolio Construction -# - Trade management: Selection handled by risk manager, Execution handled by broker class. -# - Performance Monitoring: PnL, Reports, Sharpe Ratio -# - Position Management: Rolling Options, Hedging, Position sizing -# - - -from copy import deepcopy -from abc import ABCMeta, abstractmethod -import pandas as pd -from EventDriven.dataclasses.orders import OrderRequest -from EventDriven.eventScheduler import EventScheduler -from EventDriven.trade import Trade -from trade.helpers.helper import parse_option_tick # noqa -from EventDriven.types import EventTypes, FillDirection, ResultsEnum, SignalTypes -from EventDriven.riskmanager.new_base import RiskManager -from trade.helpers.Logging import setup_logger -from trade.assets.Stock import Stock -from dbase.DataAPI.ThetaData import is_theta_data_retrieval_successful, retrieve_eod_ohlc #type: ignore -from EventDriven.event import ( - ExerciseEvent, #noqa - FillEvent, - MarketEvent, # noqa - OrderEvent, - RollEvent, - SignalEvent, - get_event_ancestor, - Event -) -from EventDriven.data import HistoricTradeDataHandler -from trade.helpers.helper import is_USholiday -from trade.backtester_.utils.aggregators import AggregatorParent -from trade.backtester_.utils.utils import plot_portfolio -from typing import Optional -import plotly -from EventDriven.dataclasses.states import ( - PositionState, - PortfolioMetaInfo, - PortfolioState, - PositionAnalysisContext -) -from EventDriven.dataclasses.states import StrategyChangeMeta -from EventDriven.configs.core import PortfolioManagerConfig -from EventDriven.portfolio_utils import extract_events -from EventDriven.exceptions import BacktestNotImplementedError -LOGGER = setup_logger("OptionSignalPortfolio") - -class Portfolio(AggregatorParent): - """ - The Portfolio class handles the positions and market - value of all instruments at a resolution of a "bar", - i.e. secondly, minutely, 5-min, 30-min, 60 min or EOD. - """ - - __metaclass__ = ABCMeta - - @abstractmethod - def analyze_signal(self, event): - """ - Acts on a SignalEvent to generate new orders - based on the portfolio logic. - """ - raise NotImplementedError("Should implement analyze_signal()") - - @abstractmethod - def update_fill(self, event): - """ - Updates the portfolio current positions and holdings - from a FillEvent. - """ - raise NotImplementedError("Should implement update_fill()") - - - - -class OptionSignalPortfolio(Portfolio): - """ - The OptionSignalPortfolio object is designed to handle the tracking of portfolio positions, create new orders and update holdings & positions based on FillEvents. - - bars: HistoricTradeDataHandler - events: EventScheduler - risk_manager: RiskManager - weight_map: dict - initial_capital: int - """ - - def __init__(self, bars : HistoricTradeDataHandler, - eventScheduler: EventScheduler, - risk_manager : RiskManager, - weight_map = None, - initial_capital = 10000, - finalize_trades: bool = True): - """ - Portfolio class for managing option trading strategies based on signals. - Handles position tracking, order generation, portfolio valuation, and trade management. - - Attributes: - bars (HistoricTradeDataHandler): Data handler containing historical price data for all symbols. - events (EventScheduler): Event queue for processing market events, signals, orders, and fills. - symbol_list (list): List of symbols being tracked in the portfolio. - start_date (str): Start date of the backtest in YYYYMMDD format. - initial_capital (float): Initial capital for the portfolio, default 10000. - logger (Logger): Logger for portfolio activities. - risk_manager (RiskManager): Manages trade selection and risk constraints. - dte_reduction_factor (int): Days to reduce DTE by when a contract is illiquid (default: 60). - min_acceptable_dte_threshold (int): Minimum acceptable DTE for a contract (default: 90). - moneyness_width_factor (float): Factor to adjust moneyness width (default: 0.05). - min_moneyness_threshold (int): Minimum threshold for adjusting moneyness before moving to next trading day (default: 5). - max_contract_price_factor (float): Factor to increase max price (default: 1.2, 20% increase). - options_data (dict): Dictionary mapping option IDs to their historical data. - underlier_list_data (dict): Dictionary mapping symbols to their Stock objects. - moneyness_tracker (dict): Tracks moneyness adjustments for signals. - unprocessed_signals (list): List of signals that couldn't be processed. - resolve_orders (bool): Whether to resolve orders if they are not processed (default: True). - _order_settings (dict): Dictionary containing default order settings for trade strategy. - __trades (dict): Dictionary of all trades executed. - __equity (pd.DataFrame): DataFrame containing equity curve data. - __transactions (list): List of all transactions made. - __weight_map (dict): Dictionary mapping symbols to their portfolio weights. - allocated_cash_map (dict): Dictionary mapping symbols to allocated capital. - __max_contract_price (dict): Dictionary mapping symbols to maximum contract prices. - __roll_map (dict): Dictionary mapping symbols to days before expiration to roll. - all_positions (list): List of dictionaries containing position data snapshots. - current_positions (dict): Dictionary of current positions by symbol. - weighted_holdings (list): List of dictionaries containing portfolio valuation snapshots. - current_weighted_holdings (dict): Dictionary of current portfolio values. - trades_df (pd.DataFrame): DataFrame containing processed trade data. - new_trades (dict): Dictionary of Trade objects to track trade performance. - - Methods: - analyze_signal(event): Processes signal events and generates orders. - update_fill(event): Updates portfolio positions and holdings from fill events. - [Additional methods documented in their definitions] - """ - self.bars = bars - self.eventScheduler = eventScheduler - self.final_date = pd.to_datetime(list(self.eventScheduler.events_map)[-1]) - self.symbol_list = self.bars.symbol_list - self.start_date = bars.start_date.strftime("%Y%m%d") - self.initial_capital = initial_capital - self.risk_manager = risk_manager - self.dte_reduction_factor = 60 ## CUTTING - self.min_acceptable_dte_threshold = 90 #CUTTING - self.moneyness_width_factor = 0.05 #CUTTING - self.min_moneyness_threshold = 5 #CUTTING - self.max_contract_price_factor = 1.2 #CUTTING - self.options_data = {} #CUTTING - self.underlier_list_data = {} #CUTTING - self.moneyness_tracker = {} #CUTTING - self.unprocessed_signals = [] - self.resolve_orders = True #CUTTING - self.allow_multiple_trades = True # allow multiple trades for the same signal_id - self.finalize_trades = finalize_trades # whether to finalize trades or not - self._order_settings = { #CUTTING - 'type': 'spread', - 'specifics': [ - {'direction': 'long', 'rel_strike': 1.0, 'dte': 365, 'moneyness_width': 0.1}, - {'direction': 'short', 'rel_strike': 0.85, 'dte': 365, 'moneyness_width': 0.1} - ], - 'name': 'vertical_spread', - 'strategy': 'vertical', - 'target_dte': 365, - 'structure_direction': 'long', - 'spread_ticks': 1, - 'dte_tolerance': 60, - 'min_moneyness': 0.75, - 'max_moneyness': 1.25, - 'min_total_price': 0.5 - } - self.__equity = None - self.__transactions = [] - # call internal functions to construct key portfolio data - self.__construct_all_positions() - self.__construct_current_positions() - self.__construct_weight_map(weight_map = weight_map) - self.__construct_current_weighted_holdings() - self.__construct_weighted_holdings() - self.__construct_roll_map() - self.trades_df = None - self.trades_map = {} - self.current_cash = {} - self.order_cache = { - 'CLOSE': {}, - 'OPEN': {} - } - self.position_cache = {} - self.config = PortfolioManagerConfig() - - @property - def logger(self): - return LOGGER - - @property - def order_settings(self): - return self._order_settings - - @property - def option_price(self): - """ - Getter for Option Price. Option price is the price trades will be executed at. - """ - return self.risk_manager.option_price - - @order_settings.setter - def order_settings(self, settings, *args, **kwargs): - - if isinstance(settings, dict): - _setting = settings - self.__enfore_order_settings(_setting) - - elif isinstance(settings, callable): - _settings = settings(*args, **kwargs) - self.__enfore_order_settings(_settings) - - else: - raise ValueError('Order Settings can either be a callable or a dicitonary') - self._order_settings = _setting - - def __enfore_order_settings(self, settings): - self.logger.warning('Each index in specifics list should have: `direction`: str, `rel_strike`: float, `dte`: int, `moneyness_width`: float') - available_types = ['spread', 'naked', 'stock'] - assert 'type' in settings.keys() and 'specifics' in settings.keys() and 'name' in settings.keys(), f'Expected both of `type`, `name` and `specifics` in settings keys' - assert settings['type'] in available_types, f'`type` must be one of {available_types}' - assert isinstance(settings['specifics'], list), f'Order Specifics should be a list' - - necessary_keys = { - 'strategy': str, - 'target_dte': int, - 'structure_direction': str, - } - - optional_keys = { - 'spread_ticks': int, - 'dte_tolerance': int, - 'min_moneyness': (float, int), # can be float or int for moneyness - 'max_moneyness': (float, int), - 'min_total_price': (float, int), - } - if settings['type'] == 'spread' and len(settings['specifics']) < 2: - raise ValueError(f'Expected 2 legs for spreads') - - for key, value_type in necessary_keys.items(): - assert key in settings.keys(), f'Expected `{key}` in order settings' - assert isinstance(settings[key], value_type), f'Expected `{key}` to be of type {value_type}, got {type(settings[key])}' - - for key, value_type in optional_keys.items(): - if key in settings.keys(): - assert isinstance(settings[key], value_type), f'Expected `{key}` to be of type {value_type}, got {type(settings[key])}' - - - @property - def weight_map(self): - return self.__weight_map - - @weight_map.setter - def weight_map(self, weight_map): - self.__construct_weight_map(weight_map) - self.__construct_current_weighted_holdings() - self.__construct_weighted_holdings() - - @property - def max_contract_price(self): - return self.__max_contract_price - - @max_contract_price.setter - def max_contract_price(self, max_contract_price): - if isinstance(max_contract_price, int): - max_contract_price = {s: max_contract_price for s in self.symbol_list} - - for s in max_contract_price.keys(): - if max_contract_price[s] > self.allocated_cash_map[s]: - raise ValueError(f'max_contract_price for {s} cannot be greater than allocated cash of {self.allocated_cash_map[s]}') - # assert all(x <= self.__normalize_dollar_amount_to_decimal(self.allocated_cash_map[s]) for s, x in max_contract_price.items()), f'max_contract_price must be less than or equal to allocated cash' - self.__max_contract_price = deepcopy(max_contract_price) - - - - @property - def roll_map(self): - return self.__roll_map - - @roll_map.setter - def roll_map(self, roll_map: int | dict): - self.__construct_roll_map(roll_map) - - # internal functions to construct key portfolio data - def __construct_roll_map(self, roll: int | dict = 30): - if isinstance(roll, int): - roll_map = {s: roll for s in self.symbol_list} - else: - assert isinstance(roll, dict), f'Roll must be an integer or a dictionary' - roll_map = deepcopy(roll) - - self.__roll_map = roll_map - - def __construct_weight_map(self, weight_map): - unprocessed_symbols = [] - if weight_map is not None: - for s in weight_map.keys(): - if s not in self.symbol_list: - unprocessed_symbols.append(s) - if len(unprocessed_symbols) > 0: - print(f"The following symbols: {unprocessed_symbols} are not being processed but present in weight_map" ) - self.logger.warning(f"The following symbols: {unprocessed_symbols} are not being processed but present in weight_map") - weight_map = {x : weight_map[x] for x in self.symbol_list} - weight_total = round(sum(weight_map.values()), 4) - assert weight_total <= 1.0, f"Sum of weights must be less than or equal to 1.0, got {weight_total}" - - else: - weight_map = {x: 1/len(self.symbol_list) for x in self.symbol_list} #spread capital between all symbols - - self.__weight_map = weight_map - self.allocated_cash_map = {s: self.__weight_map[s] * self.initial_capital for s in self.symbol_list} - self.__max_contract_price = {s: self.__normalize_dollar_amount_to_decimal(self.allocated_cash_map[s] * .5) for s in self.symbol_list} # default max contract price is 50% of allocated cash divided by 100 - - def __construct_current_positions(self): - d = {s: {} for s in self.symbol_list} - self.current_positions = d - - def __construct_all_positions(self): - d = {s: {} for s in self.symbol_list} #key is underlier, value is list of option contracts - d['datetime'] = self.bars.start_date - self.all_positions = [d] - - - def __construct_current_weighted_holdings(self): - self.current_weighted_holdings = {'commission': 0.0} - - def __construct_weighted_holdings(self): - """ - improved version of current_holdings, this attributes each symbols holdings to the market value of the position + left over allocated cash for the symbol - """ - left_over_capital = (1.0 - sum(self.__weight_map.values())) * self.initial_capital - d = {s: self.allocated_cash_map[s] for s in self.symbol_list} - d['datetime'] = self.bars.start_date - d['cash'] = left_over_capital - d['commission'] = 0.0 - d['total'] = self.initial_capital - self.weighted_holdings = [d] - - #lazy intialize Stock objects - def __get_underlier_data(self, symbol: str): - if symbol not in self.underlier_list_data: - self.underlier_list_data[symbol] = Stock(symbol, run_chain = False) - - return self.underlier_list_data[symbol] - - @property - def get_underlier_data(self): - return self.__get_underlier_data - - @property - def transactions(self): - return pd.DataFrame(self.__transactions) - - @property - def _equity(self): - holdings = self.weighted_holdings - equity_curve = pd.DataFrame(holdings).set_index('datetime') - equity_curve = equity_curve[~equity_curve.index.duplicated(keep='last')] - equity_curve['total'] = equity_curve.iloc[:, :len(self.symbol_list)+1].sum(axis = 1) ##NOTE: Temp fix till calcs work - equity_curve.rename(columns = {'total': 'Total'}, inplace=True) - self.__equity = equity_curve - return self.__equity - - @property - def trades(self): - """ - Returns a DataFrame of trades executed in the portfolio. - """ - if self.trades_df is not None: - return self.trades_df - - self.trades_df = self.aggregate_trades() - return self.trades_df - - - def aggregate_trades(self): - trades_data = [self.trades_map[trade_id].stats for trade_id in self.trades_map.keys()] - return pd.concat(trades_data, ignore_index=True) if trades_data else None - - - @property - def _trades(self): - ## AggregatorParent uses _trades in some methods. See Expectancy in aggregator - return self.trades - - def get_port_stats(self): - current_date = pd.to_datetime(self.eventScheduler.current_date) - if pd.to_datetime(self.start_date) == pd.to_datetime(current_date): - return False - return True - - ##NOTE: Should move to performance.py? - def dates_(self, start: bool = True): - if start: - return self._equity.index.min() - else: - return self._equity.index.max() - - def buyNhold(self): - stock_ts = pd.DataFrame() - for stock in self.symbol_list: - stock_ts[stock] = self.underlier_list_data.get(stock, self.__get_underlier_data(stock)).spot(ts = True, ts_start = self.dates_(), ts_end = self.dates_(start = False))['close'] * self.__weight_map[stock] - - stock_ts['Total'] = stock_ts.sum(axis = 1) - self.stock_equity = stock_ts - return self.__normalize_dollar_amount(((stock_ts['Total'].iloc[-1] / stock_ts['Total'].iloc[0]) -1)) - - - def generate_order(self, signal_event : SignalEvent): - """ - Takes a signal event and creates an order event based on the signal parameters - Interacts with RiskManager to get order based on settings and signal - returns: OrderEvent - """ - symbol = signal_event.symbol - signal_type = signal_event.signal_type - order_type = 'MKT' - - if signal_type != 'CLOSE': #generate order for LONG or SHORT - order = self.create_order( signal_event, order_type) - self.order_cache['OPEN'].setdefault(signal_event.datetime, {})[signal_event.symbol] = order - return order - elif signal_type == 'CLOSE': - if signal_event.signal_id not in self.current_positions[symbol]: - self.logger.warning(f'No contracts held for {symbol} to sell at {signal_event.datetime}, Inputs {locals()}') - unprocess_dict = signal_event.__dict__ - unprocess_dict['reason'] = (f'Signal not held in current positions at that time') - self.unprocessed_signals.append(unprocess_dict) - return None - - current_position = self.current_positions[symbol][signal_event.signal_id] - if is_USholiday(signal_event.datetime): # check if trading day is holdiay before selling - self.resolve_order_result({'result': ResultsEnum.IS_HOLIDAY.value}, signal_event) - return None - - if 'position' not in current_position: - self.logger.warning(f'No contracts held for {symbol} to sell at {signal_event.datetime}, Inputs {locals()}') - return None - - - position = deepcopy(current_position['position']) - self.logger.info(f'Selling contract for {symbol} at {signal_event.datetime} Position: {current_position}') - position['close'] = self.calculate_close_on_position(position) - - ## Access skip from risk_manager market data - skip = self.risk_manager.market_data.skip(position_id=position['trade_id'], - date=signal_event.datetime) - ## on the off case where close price is negative, move sell to next trading day - if position['close'] < 0 or skip == True: - if isinstance(signal_event.parent_event, RollEvent): ## If rolling, do not move to next trading day - self.logger.warning(f'Not generating order because: CLOSE price is negative {signal_event}, skipping sell for roll event') - print(f'Not generating ROLL order because: CLOSE price is negative {signal_event}, skipping sell for roll event') - return None - # move signal to next day - new_signal = deepcopy(signal_event) - next_trading_day = new_signal.datetime + pd.offsets.BusinessDay(1) - new_signal.datetime = next_trading_day - self.logger.warning(f'Not generating order because: CLOSE price is negative {signal_event}, moving event to {next_trading_day}') - print(f'Not generating order because: CLOSE price is negative {signal_event}, moving event to {next_trading_day}') - self.eventScheduler.schedule_event(next_trading_day, new_signal) - return None - order = OrderEvent(symbol, signal_event.datetime, order_type, quantity=current_position['quantity'],direction= 'SELL', position = position, signal_id=signal_event.signal_id, parent_event=signal_event) - self.order_cache['CLOSE'].setdefault(signal_event.datetime, {})[signal_event.symbol] = order - return order - return None - - def create_order(self, signal_event : SignalEvent, position_type: str, order_type: str = 'MKT'): - """ - Takes a signal event and creates an order event based on the signal parameters - position_type: C|P - """ - date_str = signal_event.datetime.strftime('%Y-%m-%d') - position_type = 'c' if signal_event.signal_type == 'LONG' else 'p' - # position_type = 'P' - cash_at_hand = self.__normalize_dollar_amount_to_decimal(self.allocated_cash_map[signal_event.symbol] * 1) - max_contract_price = self.__max_contract_price[signal_event.symbol] if signal_event.max_contract_price is None else signal_event.max_contract_price - max_contract_price = max_contract_price if max_contract_price <= cash_at_hand else cash_at_hand - # position_result = self.risk_manager.get_order(tick = signal_event.symbol, ## changes to order request. new_state.order - # date = date_str, - # right = position_type, - # option_type = position_type, - # max_close = max_contract_price, - # order_settings= signal_event.order_settings if signal_event.order_settings is not None else self._order_settings, - # signal_id = signal_event.signal_id, - # **self.order_settings) - print(f"Cash at Hand: {cash_at_hand}, Max Contract Price: {max_contract_price} for Signal: {signal_event.signal_id}") - position_state = self.risk_manager.get_order(OrderRequest(date=date_str, symbol=signal_event.symbol, option_type=position_type, max_close=max_contract_price, tick_cash=cash_at_hand, direction=signal_event.signal_type, signal_id=signal_event.signal_id)) - self.position_cache[signal_event.signal_id] = position_state - position = position_state.order.data - # if position is None : - # if self.resolve_orders == True : - # self.resolve_order_result(position_result['result'], signal_event) - # else: - # self.logger.warning(f'resolve_orders is {self.resolve_orders} hence not generating order because:{position_result["result"]} {signal_event}') - # return None - - # self.moneyness_tracker[signal_event.signal_id] = 0 #reset moneyness tracker for signal after successful order generation - # self.logger.info(f'Buying LONG contract for {signal_event.symbol} at {signal_event.datetime} Position: {position}') - # print("===========================") - # print("Buy Details") - # print(f"Position: {position}, Date: {date_str}, Signal: {signal_event}") - # print(f"Max Contract Price: {max_contract_price}, Cash at Hand: {cash_at_hand}") - # print("Cash at Hand", cash_at_hand, "Close", position['close']) - # print("===========================") - return OrderEvent(signal_event.symbol, signal_event.datetime, order_type, cash=cash_at_hand, direction= 'BUY', position = position, signal_id = signal_event.signal_id, quantity=position['quantity'], parent_event=signal_event) - - def __reduce_order_settings_dte_by_factor(self, order_settings): - raise DeprecationWarning('This method is deprecated') - new_order_settings = deepcopy(order_settings) - initial_dte = new_order_settings['specifics'][0]['dte'] - initial_dte = initial_dte - self.dte_reduction_factor - new_order_settings['specifics'] = [{**x, 'dte': initial_dte} for x in new_order_settings['specifics']] #reduce dte by 1 day - return new_order_settings - - def resolve_order_result(self, position_result: ResultsEnum, signal: SignalEvent): - """ - Analyze the results of the order and update the portfolio or event scheduler accordingly - - MONEYNESS_TOO_TIGHT: adjust moneyness width by adding moneyness_width factor (default at 0.5) and add to queue - MAX_PRICE_TOO_LOW: adjust max_price by multiplying max_contract_price factor (default at 20%) on max_price dict and add to queue - IS_HOLIDAY: move signal to next trading day - NO_TRADED_CLOSE: move signal to next trading day - NO_ORDERS: log warning - UNSUCCESSFUL: log warning - UNAVAILABLE_CONTRACT: log warning - """ - raise DeprecationWarning('This method is deprecated') - if position_result == ResultsEnum.MONEYNESS_TOO_TIGHT.value: - order_settings = deepcopy(signal.order_settings if signal.order_settings is not None else self.order_settings) - order_settings['specifics'] = [{**x, 'moneyness_width': x['moneyness_width'] + self.moneyness_width_factor} for x in order_settings['specifics']] - new_signal = deepcopy(signal) - new_signal.order_settings = order_settings - - moneyness_tracker_index = self.moneyness_tracker.get(signal.signal_id, 0) - - if moneyness_tracker_index == 0: - self.moneyness_tracker[signal.signal_id] = moneyness_tracker_index + 1 - else: - self.moneyness_tracker[signal.signal_id] += 1 - - - if moneyness_tracker_index > self.min_moneyness_threshold: - new_max_price = self.__max_contract_price[signal.symbol] - new_signal_on_dte = deepcopy(signal) - new_signal_on_dte.order_settings = deepcopy(self.order_settings) if moneyness_tracker_index == self.min_moneyness_threshold + 1 else signal.order_settings - self.logger.warning(f'Not generating order because:{position_result} {signal}, performing resolve on reduced dte with intial moneyness width {self.__max_contract_price[signal.symbol]}') - print(f'Not generating order because:{position_result} {signal}, performing resolve on reduced dte with intial moneyness width cash {self.__max_contract_price[signal.symbol]}') - self.resolve_order_result(ResultsEnum.TOO_ILLIQUID.value, new_signal_on_dte) - return None - - - - - - self.logger.warning(f'Not generating order because:{position_result} {signal}, adding new signal with adjusted moneyness. specifics: {order_settings["specifics"]}') - print(f'Not generating order because:{position_result} {signal}, adding new signal with adjusted moneyness. specifics: {order_settings["specifics"]}') - self.eventScheduler.put(new_signal) - - - - elif position_result == ResultsEnum.IS_HOLIDAY.value or position_result == ResultsEnum.NO_TRADED_CLOSE.value: - next_trading_day = signal.datetime + pd.offsets.BusinessDay(1) - new_signal = deepcopy(signal) - new_signal.datetime = next_trading_day - self.logger.warning(f'Not generating order because:{position_result} {signal}, moving event to {next_trading_day}') - print(f'Not generating order because:{position_result} {signal}, moving event to {next_trading_day}') - self.eventScheduler.schedule_event(next_trading_day, new_signal) - - - elif position_result == ResultsEnum.MAX_PRICE_TOO_LOW.value: - initial_contract_max_price = self.__max_contract_price[signal.symbol] if signal.max_contract_price is None else signal.max_contract_price - new_max_price = initial_contract_max_price * self.max_contract_price_factor - allocated_cash = self.__normalize_dollar_amount_to_decimal(self.allocated_cash_map[signal.symbol]) - - if new_max_price > allocated_cash: - new_max_price = self.__max_contract_price[signal.symbol] - new_signal_on_dte = deepcopy(signal) - new_signal_on_dte.max_contract_price = None - self.logger.warning(f'Not generating order because:{position_result} {signal}, performing resolve on reduced dte with intial max cash {self.__max_contract_price[signal.symbol]}') - print(f'Not generating order because:{position_result} {signal}, performing resolve on reduced dte with intial max cash {self.__max_contract_price[signal.symbol]}') - self.resolve_order_result(ResultsEnum.TOO_ILLIQUID.value, new_signal_on_dte) - return None - - new_max_price = min(new_max_price, self.__normalize_dollar_amount_to_decimal(self.allocated_cash_map[signal.symbol])) - new_signal = deepcopy(signal) - new_signal.max_contract_price = new_max_price - self.logger.warning(f'Not generating order because:{position_result} at {initial_contract_max_price}, adjusted to {new_max_price} {signal} ') - print(f'Not generating order because:{position_result} at {initial_contract_max_price}, adjusted to {new_max_price} {signal} ') - self.eventScheduler.put(new_signal) - - - elif position_result == ResultsEnum.TOO_ILLIQUID.value or position_result == ResultsEnum.NO_ORDERS.value: - order_settings = deepcopy(signal.order_settings if signal.order_settings is not None else self.order_settings) - order_settings = self.__reduce_order_settings_dte_by_factor(order_settings) - dte = order_settings['specifics'][0]['dte'] - - if dte < self.min_acceptable_dte_threshold or dte <= 0: - self.logger.warning(f'Not generating order because:{position_result} {signal}') - print(f'Not generating order because:{position_result} {signal}') - unprocess_dict = signal.__dict__ - unprocess_dict['reason'] = position_result - self.unprocessed_signals.append(unprocess_dict) - return None - - new_signal = deepcopy(signal) - new_signal.order_settings = order_settings - self.logger.warning(f'Not generating order because:{position_result} {signal}, adding new signal with adjusted dte. specifics: {order_settings["specifics"]}') - print(f'Not generating order because:{position_result} {signal}, adding new signal with adjusted dte. specifics: {order_settings["specifics"]}') - self.eventScheduler.put(new_signal) - else: - self.logger.warning(f'Not generating order because:{position_result} {signal}') - print(f'Not generating order because:{position_result} {signal}') - unprocess_dict = signal.__dict__ - unprocess_dict['reason'] = position_result - self.unprocessed_signals.append(unprocess_dict) - - - def analyze_signal(self, event : SignalEvent): - """ - Acts on a SignalEvent to generate new orders - based on the portfolio logic. - throws: AssertionError if event type is not 'SIGNAL' - """ - assert event.type == 'SIGNAL', f"Expected 'SIGNAL' event type, got {event.type}" - - - if not self.allow_multiple_trades and event.signal_type != SignalTypes.CLOSE.value: - if len(self.current_positions[event.symbol].keys()) > 0: - for signal_id in self.current_positions[event.symbol]: - if 'exit_price' not in self.current_positions[event.symbol][signal_id]: - self.logger.warning(f'Pushing signal {event} to next trading day because a position already exists for {event.symbol} with signal_id {signal_id}') - print(f'Pushing signal {event.signal_id} to next trading day because a position already exists for {event.symbol} with signal_id {signal_id}') - next_trading_day = event.datetime + pd.offsets.BusinessDay(1) - new_signal = deepcopy(event) - new_signal.datetime = next_trading_day - self.eventScheduler.schedule_event(next_trading_day, new_signal) - return None - - order_event = self.generate_order(event) - if order_event is not None: - self.eventScheduler.put(order_event) - - def analyze_positions(self) -> StrategyChangeMeta : - """ - Analyze the current positions and determine if any need to be rolled - """ - if not self.risk_manager.position_analyzer.config.enabled: - self.logger.info('Position analysis is disabled in RiskManager, skipping') - return StrategyChangeMeta(date=pd.to_datetime(self.eventScheduler.current_date), actionables=[]) - - ## Check if current date is a holiday - ## If holiday, skip position analysis - ## Market is closed on holidays - ## Use pandas to_datetime for date conversion - ## Use is_USholiday function to check for holidays - ## Log a warning message if market is closed - ## Return None if market is closed - ## Else, proceed with position analysis - ## Create Context for current positions - ## Analyze positions using RiskManager - ## Extract events from meta changes and schedule them - dt = pd.to_datetime(self.eventScheduler.current_date) - if is_USholiday(dt): - self.logger.warning(f"Market is closed on {dt}, skipping") - return - - ## Create Context for current positions - ctx = self._create_ctx(dt) - - ## Analyze positions using RiskManager - meta_changes = self.risk_manager.analyze_position(ctx) - - ## Extract events from meta changes and schedule them - events = self.extract_events(meta_changes) - if not events: - self.logger.info(f'No events to schedule for position analysis on {dt}') - return meta_changes - - ## Loop through events and schedule them - for event in events: - self.eventScheduler.schedule_event(event.datetime, event) - return meta_changes - - def _create_ctx(self, date: pd.Timestamp) -> PositionAnalysisContext: - """ - Create a Context object for the given date - """ - - ## Create PositionState objects for all current positions - positions = self.current_positions - positions_states = [] - for tick, pos_pack in positions.items(): - for signal_id, position in pos_pack.items(): - trade_id = position["position"]["trade_id"] - qty = position["position"]["quantity"] - entry_price = position["entry_price"] / qty - current_position_data = self.risk_manager.market_data.get_at_time_position_data(position_id=trade_id, date=date) - current_underlier_data = self.risk_manager.market_data.market_timeseries.get_at_index(sym=tick, index=date) - current_price = position["market_value"] / qty - pnl = (current_price - entry_price) * qty - - pos_state = PositionState( - trade_id=trade_id, - underlier_tick=tick, - signal_id=signal_id, - quantity=qty, - entry_price=entry_price, - current_position_data=current_position_data, - current_underlier_data=current_underlier_data, - pnl=pnl, - last_updated=date, - ) - positions_states.append(pos_state) - - ## Create Portfolio State - cash = sum(self.allocated_cash_map.values()) - positions = positions_states - pnl = sum([x.pnl for x in positions_states]) - total_value = cash + pnl - last_updated = date - - portfolio_state = PortfolioState( - total_value=total_value, - cash=cash, - positions=positions, - pnl=pnl, - last_updated=last_updated, - ) - - ## Create PortfolioMetaInfo - meta = PortfolioMetaInfo( - portfolio_name="bkt_test_11", - initial_cash=self.initial_capital, - start_date=self.risk_manager.start_date, - end_date=self.risk_manager.end_date, - t_plus_n=self.config.t_plus_n, - is_backtest=True, - ) - - ## Create AnalysisContext - ctx = PositionAnalysisContext( - date=date, - portfolio=portfolio_state, - portfolio_meta=meta, - ) - - return ctx - - def extract_events(self, meta_changes: StrategyChangeMeta) -> list[Event]: - """ - Extract events from the strategy meta changes - """ - events = extract_events(actionables=meta_changes.actionables, - current_positions=self.current_positions) - return events - - def execute_roll(self, roll_event: RollEvent): - """ - Execute the roll event by closing the current position and opening a new one - rollEvent: RollEvent - """ - self.logger.info(f'Rolling contract for {roll_event}') - print(f'Rolling contract (sell side) for {roll_event.symbol} at {roll_event.datetime}') - sell_signal_event = SignalEvent( roll_event.symbol, roll_event.datetime, SignalTypes.CLOSE.value, signal_id=roll_event.signal_id, parent_event=roll_event) - self.eventScheduler.put(sell_signal_event) - - def execute_roll_buy(self, roll_event: RollEvent): - """ - Run after a successful fill on the sell side of the roll event - rollEvent: RollEvent - """ - self.logger.info(f'Rolling contract for {roll_event}') - print(f'Rolling contract (buy side) for {roll_event.symbol} at {roll_event.datetime}') - buy_signal_event = SignalEvent( roll_event.symbol, roll_event.datetime, roll_event.signal_type , signal_id=roll_event.signal_id) - self.eventScheduler.put(buy_signal_event) - - ## FIXME: Make this better. It is for premiums when expiring - ## PRICE_ON_TO_DO: Adjust this to use `option_price` from RiskManager - def get_premiums_on_position(self, position: dict, entry_date: str) -> tuple[dict, dict] | tuple[None, None]: - """ - get the premium of each contract in a position - return [long_premiums | None, short_premiums | None] - """ - raise DeprecationWarning('This method is deprecated') - long_premiums = {} - short_premiums = {} - if 'long' in position: - for option_id in position['long']: - option_data = self.get_option_data(option_id) - if option_data is not None: - option_data_series = option_data.loc[pd.to_datetime(entry_date)] - if isinstance(option_data_series, pd.Series): - premium = option_data_series['Midpoint'] - elif isinstance(option_data_series, pd.DataFrame): - premium = option_data_series.iloc[0]['Midpoint'] - - long_premiums[option_id] = premium - - if 'short' in position: - for option_id in position['short']: - option_data = self.get_option_data(option_id) - if option_data is not None: - option_data_series = option_data.loc[pd.to_datetime(entry_date)] - if isinstance(option_data_series, pd.Series): - premium = option_data_series['Midpoint'] - elif isinstance(option_data_series, pd.DataFrame): - premium = option_data_series.iloc[0]['Midpoint'] - - short_premiums[option_id] = premium - - if len(long_premiums) == 0: - long_premiums = None - if len(short_premiums) == 0: - short_premiums = None - return (long_premiums, short_premiums) - - - def __normalize_dollar_amount_to_decimal(self, price: float) -> float: - """ - divide by 100 - """ - return price / 100 - - def __normalize_dollar_amount(self, price: float) -> float: - """ - multiply by 100 - """ - return price * 100 - - def update_positions_on_fill(self, fill_event: FillEvent): - """ - Takes a FilltEvent object and updates the current positions in the portfolio - When a buy is filled, the options data related to the contract is stored in the options_data dictionary. - This is so it can be fetched easily when needed - Parameters: - fill - The FillEvent object to update the positions with. - """ - # Check whether the fill is a buy or sell - ##TODO (CLEAN UP): Stop using self.get_options_data_on_contract - new_position_data = {} - - if fill_event.position['trade_id'] not in self.trades_map: - self.trades_map[fill_event.position['trade_id']] = Trade(fill_event.position['trade_id'], fill_event.symbol, fill_event.signal_id) - self.trades_map[fill_event.position['trade_id']].update(fill_event) - else: - self.trades_map[fill_event.position['trade_id']].update(fill_event) - - if fill_event.direction == 'BUY': - if fill_event.position is not None: - new_position_data['position'] = fill_event.position - if self.current_positions[fill_event.symbol] is not None and fill_event.signal_id in self.current_positions[fill_event.symbol]: - new_position_data['quantity'] = self.current_positions[fill_event.symbol][fill_event.signal_id]['quantity'] + fill_event.quantity - else: - new_position_data['quantity'] = fill_event.quantity - new_position_data['entry_price'] = self.__normalize_dollar_amount(fill_event.fill_cost) - new_position_data['market_value'] = self.__normalize_dollar_amount(fill_event.market_value) - new_position_data['signal_id'] = fill_event.signal_id - - ## Clean up: Remove commented code - # #retain long legs options_data dictionary for future use - # # if 'long' in fill_event.position: - # for option_id in fill_event.position['long']: - # option_meta = parse_option_tick(option_id) - # option_data = self.get_options_data_on_contract(symbol = option_meta['ticker'], right=option_meta['put_call'], exp=option_meta['exp_date'], strike=option_meta['strike']) - # if option_data is not None: - # self.options_data[option_id] = option_data[~option_data.index.duplicated(keep='last')] - # else: - # self.logger.warning(f'No data found for {option_id}') - - # #retain short legs options_data dictionary for future use - # # if 'short' in fill_event.position: - # for option_id in fill_event.position['short']: - # option_meta = parse_option_tick(option_id) - # option_data = self.get_options_data_on_contract(symbol = option_meta['ticker'], right=option_meta['put_call'], exp=option_meta['exp_date'], strike=option_meta['strike']) - # if option_data is not None: - # self.options_data[option_id] = option_data[~option_data.index.duplicated(keep='last')] - # else: - # self.logger.warning(f'No data found for {option_id}') - - - if fill_event.direction == 'SELL': - if fill_event.position is not None: - new_position_data['position'] = fill_event.position - if self.current_positions[fill_event.symbol] is not None and fill_event.signal_id in self.current_positions[fill_event.symbol]: - new_position_data['quantity'] = self.current_positions[fill_event.symbol][fill_event.signal_id]['quantity'] - fill_event.quantity - else: - return ValueError(f'No position found for {fill_event.symbol} with signal_id {fill_event.signal_id}') - new_position_data['market_value'] = self.__normalize_dollar_amount(fill_event.market_value) - if (new_position_data['quantity']) == 0: - new_position_data['exit_price'] = self.__normalize_dollar_amount(fill_event.fill_cost) - - if fill_event.direction == 'EXERCISE': - raise BacktestNotImplementedError('Exercise fill handling not implemented yet') - if fill_event.position is not None: - new_position_data['position'] = fill_event.position - new_position_data['quantity'] = self.current_positions[fill_event.symbol][fill_event.signal_id]['quantity'] - fill_event.quantity - new_position_data['market_value'] = self.__normalize_dollar_amount(fill_event.market_value) - if (new_position_data['quantity']) == 0: - new_position_data['exit_price'] = self.__normalize_dollar_amount(fill_event.fill_cost) - - # open a new position after exercise - new_signal = SignalEvent(fill_event.symbol, fill_event.datetime, SignalTypes.LONG.value, signal_id=fill_event.signal_id) - self.eventScheduler.put(new_signal) - - - - self.current_positions[fill_event.symbol][fill_event.signal_id] = new_position_data - - def update_holdings_on_fill(self, fill_event: FillEvent): - """ - Takes a FillEvent object and updates the holdings matrix - to reflect the holdings value. - - Parameters: - fill - The FillEvent object to update the holdings with. - """ - - transaction = {} - transaction['signal_id'] = fill_event.signal_id - transaction['datetime'] = fill_event.datetime - transaction['symbol'] = fill_event.symbol - transaction['direction'] = fill_event.direction - if fill_event.direction == 'BUY': - # available cash for the symbol is the left over cash after buying the contract - transaction['cash_before'] = self.allocated_cash_map[fill_event.symbol] - self.allocated_cash_map[fill_event.symbol] -= self.__normalize_dollar_amount(fill_event.fill_cost) - transaction['cash_after'] = self.allocated_cash_map[fill_event.symbol] - - elif fill_event.direction == 'SELL': - transaction['cash_before'] = self.allocated_cash_map[fill_event.symbol] - self.allocated_cash_map[fill_event.symbol] += self.__normalize_dollar_amount(fill_event.fill_cost) - transaction['cash_after'] = self.allocated_cash_map[fill_event.symbol] - - self.__transactions.append(transaction) - self.current_weighted_holdings['commission'] += fill_event.commission - - def update_timeindex(self): - """ - Adds a new record to the holdings and positions matrix based on the current market data bar. Runs at the end of the trading day (i.e all events for the day have been processed) - """ - - current_date = pd.to_datetime(self.eventScheduler.current_date) - # Check if the current date is a weekend (Saturday or Sunday) - if current_date.weekday() >= 5: - return - - #new positions dictionary - new_positions_entry = {s: {} for s in self.symbol_list} - new_positions_entry['datetime'] = current_date - current_cash = {'datetime': current_date} - - #new weighted holdings dictionary - new_weighted_holdings_entry = {s: self.allocated_cash_map[s] for s in self.symbol_list} - new_weighted_holdings_entry['datetime'] = current_date - new_weighted_holdings_entry['cash'] = (1.0 - sum(self.__weight_map.values())) * self.initial_capital - new_weighted_holdings_entry['commission'] = self.current_weighted_holdings['commission'] - new_weighted_holdings_entry['total'] = new_weighted_holdings_entry['cash'] - - for sym in self.symbol_list: - new_weighted_holdings_entry[sym] = self.allocated_cash_map[sym] - current_cash[sym] = self.allocated_cash_map[sym] #update current cash for the symbol - remove_signals = [] - for signal_id in self.current_positions[sym]: - current_close = self.calculate_close_on_position(self.current_positions[sym][signal_id]['position']) - market_value = self.__normalize_dollar_amount(self.current_positions[sym][signal_id]['quantity'] * current_close) - - self.trades_map[self.current_positions[sym][signal_id]['position']['trade_id']].update_current_price(self.__normalize_dollar_amount(current_close)) #update current price on trade - - self.current_positions[sym][signal_id]['position']['close'] = current_close ##Update close price for every iteration - self.current_positions[sym][signal_id]['market_value'] = market_value - - #update holdings - if 'exit_price' not in self.current_positions[sym][signal_id]: - new_weighted_holdings_entry[sym] += market_value #update the holdings value to the market value of position + left over allocated cash - - - #update positions - if 'exit_price' in self.current_positions[sym][signal_id]: #if position is closed, remove the signal from current_positions - #remove signal - remove_signals.append(signal_id) - else: - new_positions_entry[sym][signal_id] = deepcopy(self.current_positions[sym][signal_id]) - - - #cleanup current_positions - for signal_id in remove_signals: - del self.current_positions[sym][signal_id] - #update total weighted holdings - new_weighted_holdings_entry['total'] += new_weighted_holdings_entry[sym] - - #append the new holdings and positions to the list of all holdings and positions - self.all_positions.append(new_positions_entry) - self.weighted_holdings.append(new_weighted_holdings_entry) - self.current_cash[current_date] = current_cash - - def update_fill(self, fill_event: FillEvent): - """ - Updates the portfolio current positions and holdings - from a FillEvent. - """ - if fill_event.type == 'FILL': - self.update_positions_on_fill(fill_event) - self.update_holdings_on_fill(fill_event) - # check if fill_event has roll event ancestor. if so execute roll buy side - if fill_event.direction == FillDirection.SELL.value and fill_event.position is not None: - roll_event = get_event_ancestor(fill_event, EventTypes.ROLL.value) - if roll_event is not None: - self.execute_roll_buy(roll_event) - - def calculate_close_on_position(self, position) -> float: - """ - Calculate the close price on a position - the close price is the difference between the long and short legs of the position - """ - return self.risk_manager.market_data.get_at_time_position_data(position['trade_id'], self.eventScheduler.current_date).get_price() - # return self.risk_manager.position_data[position['trade_id']][self.option_price.capitalize()][pd.to_datetime(self.eventScheduler.current_date)] - - - - - # Getters - def get_weighted_holdings(self) -> pd.DataFrame: - """ - Converts `weighted_holdings` from a list of dictionaries to a Pandas DataFrame with datetime index. - Returns: - pd.DataFrame: A time-series DataFrame of weighted holdings. - """ - df = pd.DataFrame(self.weighted_holdings) - df['datetime'] = pd.to_datetime(df['datetime']) # Ensure datetime format - df.set_index('datetime', inplace=True) # Set datetime as index - return df - - - def get_all_positions(self) -> pd.DataFrame: - """ - Converts `all_positions` from a list of dictionaries to a Pandas MultiIndex DataFrame. - - Index Level 1: datetime - - Index Level 2: symbol - Returns: - pd.DataFrame: A MultiIndex DataFrame of all positions. - """ - records = [] # Temporary storage for DataFrame conversion - all_positions_copy = deepcopy(self.all_positions) # Avoid modifying original list - for position_dict in all_positions_copy: - dt = position_dict.pop('datetime', pd.to_datetime(0)) # Extract timestamp - for symbol, positions in position_dict.items(): #TODO:all positions structure now by signal, get symbol from position - for signal_id, position in positions.items(): - records.append([ - dt, symbol, - position.get('position', {}).get('long', []), - position.get('position', {}).get('short', []), - position.get('position', {}).get('trade_id', None), - position.get('position', {}).get('close', None), - position.get('quantity', 0), - position.get('market_value', 0.0), - signal_id - ]) - - df = pd.DataFrame(records, columns=['datetime', 'symbol', 'long', 'short', 'trade_id', 'close', 'quantity', 'market_value', signal_id]) - df.set_index(['datetime', 'symbol'], inplace=True) - df.index = df.index.set_levels(pd.to_datetime(df.index.levels[0]), level=0) # Ensure datetime index - return df - - - - def get_equity_curve(self) : - """ - create equity curve - """ - curve = pd.DataFrame(self.weighted_holdings) - curve.set_index('datetime', inplace=True) - curve['returns'] = curve['total'].pct_change() - curve['equity_curve'] = (1.0 + curve['returns']).cumprod() - return curve - - def get_latest_option_data(self, option_id: str) -> pd.Series: - """ - Get the latest option data for a symbol - params: option_id: str The option_id the contract was saved with during the fill process - returns: a series with columns: ms_of_day,open,high,low,close,volume,count,date - """ - raise DeprecationWarning('This method is deprecated') - - current_date = pd.to_datetime(self.eventScheduler.current_date) - option_data_df = self.get_option_data(option_id) - if option_data_df is None: - return None - closest_date_index = (option_data_df.index - current_date).to_series().abs().argsort()[:1] #index of nearest date to the current date - option_data = option_data_df.iloc[closest_date_index] #get the nearest date to the current date - return option_data.iloc[0] - - - def get_options_data_on_contract(self, symbol: str, exp: str, strike: float, right: str) -> pd.DataFrame | None: - """ - Updates the option data based on the fill contract - """ - raise DeprecationWarning('This method is deprecated') - start_date = self.bars.start_date.strftime('%Y%m%d') - end_date = self.bars.end_date.strftime('%Y%m%d') - exp = pd.to_datetime(exp).strftime('%Y%m%d') - options = retrieve_eod_ohlc(symbol = symbol, exp = exp, strike= float(strike), right=right, start_date=start_date, end_date=end_date) - if isinstance(options, pd.DataFrame) and is_theta_data_retrieval_successful(options): - return options # a dataframe with columns: ms_of_day,open,high,low,close,volume,count,date - else: - return None - - def get_option_data(self, option_id: str) -> pd.DataFrame: - """ - returns a dataframe with columns: ms_of_day,open,high,low,close,volume,count,date - """ - raise DeprecationWarning('This method is deprecated') - if option_id in self.options_data: - return self.options_data[option_id] - else : - return None - - - - def plot_portfolio(self, - benchmark: Optional[str] = 'SPY', - plot_bnchmk: Optional[bool] = True, - return_plot: Optional[bool] = False, - start_plot: Optional[str] = None, - **kwargs) -> Optional[plotly.graph_objects.Figure]: - """ - Plots a graph of current porfolio metrics. These graphs are Equity Curve, Portfolio Drawdown, Trades, Periodic returns - Plotting function is plotly. Through **kwargs, you can edit the subplot - - Parameters: - benchmark (Optional[str]): Benchmark you would like to compare portfolio equity. Defaults to SPY - plot_bnchmk (Optional[bool]): Optionality to plot a benchmark or not - return_plot Optional[bool]: Returns the plot object. User may opt for this if they plan to make further editing beyond **kwargs functionality. - Note, best to designate this to a variable to avoid being displayed twice - - Returns: - Plot: For further editing by the user - """ - - stock = Stock(benchmark, run_chain = False) - data = stock.spot(ts = True, ts_start = self._equity.index[0], ts_end = self._equity.index[-1]) - data.rename(columns = {x:x.capitalize() for x in data.columns}, inplace= True) - data = data.asfreq('B', method = 'ffill') - _bnch = data.fillna(0) - eq = self._equity - dd = self.dd(True) - tr = self.trades.copy() - tr['Size'] = tr['Quantity'] - - return plot_portfolio(tr, eq, dd, _bnch,plot_bnchmk=plot_bnchmk, return_plot=return_plot, **kwargs) - - - \ No newline at end of file diff --git a/EventDriven/riskmanager/_order_validator.py b/EventDriven/riskmanager/_order_validator.py index b6dac66..c66e955 100644 --- a/EventDriven/riskmanager/_order_validator.py +++ b/EventDriven/riskmanager/_order_validator.py @@ -72,8 +72,8 @@ from dataclasses import dataclass, field from abc import ABC, abstractmethod from trade.helpers.Logging import setup_logger -from EventDriven.riskmanager.picker import STRATEGY_MAP -from EventDriven.riskmanager.market_data import get_timeseries_obj, OPTION_TIMESERIES_START_DATE +from EventDriven.riskmanager.picker.builder import BUILDER_FACTORY +from trade.datamanager.vars import get_times_series from EventDriven.riskmanager.picker import OrderSchema logger = setup_logger("EventDriven.riskmanager._order_validator", stream_log_level="WARNING") @@ -113,7 +113,7 @@ def load(self, source: Optional[str] = None) -> None: "max_close": (numbers.Number, "Max price for the order search engine."), "option_strategy": ( str, - f"This should be a string representing the option strategy. Available: {STRATEGY_MAP.keys()}", + f"This should be a string representing the option strategy. Available: {BUILDER_FACTORY.keys()}", ), "initial_cash": (numbers.Number, "This should be a float representing the initial cash for the strategy."), "option_type": (str, "This should be a string representing the option type, e.g., 'standard'.", ["C", "P"]), @@ -258,8 +258,8 @@ def build_inputs_with_config( else: raise ValueError("Invalid option type. Must be 'C' or 'P'.") - timeseries = get_timeseries_obj() - timeseries.load_timeseries(tick, OPTION_TIMESERIES_START_DATE, datetime.now()) + timeseries = get_times_series() + timeseries.load_timeseries(tick, end_date= datetime.now()) ## Get spot price for the tick at the date. chain_spot is used for option pricing spot = timeseries.get_at_index(tick, date).chain_spot.close diff --git a/EventDriven/riskmanager/_orders.py b/EventDriven/riskmanager/_orders.py index edf0829..7cbb8e5 100644 --- a/EventDriven/riskmanager/_orders.py +++ b/EventDriven/riskmanager/_orders.py @@ -104,6 +104,7 @@ def resolve_schema( itm_moneyness_width: float, max_close: float, max_tries: int = 6, + tick_cash: int = 10 ) -> Tuple[OrderSchema, int]: """ Resolving schema by order of importance @@ -126,7 +127,6 @@ def resolve_schema( tuple: A tuple containing the resolved schema or False if no schema was found, and the number of tries made. """ tick = schema["tick"] - ##0). Max schema tries if tries >= max_tries: return False, tries @@ -161,7 +161,8 @@ def resolve_schema( logger.info( f"Resolving Schema ({tick}): {schema['max_total_price']} <= {max_close}, increasing Max Close by 0.5 from {schema['max_total_price']} to {schema['max_total_price'] + 1}" ) - schema["max_total_price"] += 1 + new_max = schema["max_total_price"] + 1 + schema["max_total_price"] = min(new_max, tick_cash) return schema, tries return False, tries @@ -182,6 +183,7 @@ def order_resolve_loop( schema_cache: dict, picker: "OrderPicker", request: OrderRequest = None, + tick_cash: int = 10, ): """ Attempt to resolve an order schema until a successful order is produced or maximum tries are exceeded. @@ -231,6 +233,7 @@ def order_resolve_loop( max_tries=max_tries, otm_moneyness_width=otm_moneyness_width, itm_moneyness_width=itm_moneyness_width, + tick_cash=tick_cash ) schema, tries = pack diff --git a/EventDriven/riskmanager/base.py b/EventDriven/riskmanager/base.py new file mode 100644 index 0000000..452feda --- /dev/null +++ b/EventDriven/riskmanager/base.py @@ -0,0 +1,6 @@ +"""Compatibility shim for legacy imports. + +Importing from EventDriven.riskmanager.base forwards to new_base. +""" + +from .new_base import * # noqa: F403 diff --git a/EventDriven/riskmanager/market_data.py b/EventDriven/riskmanager/market_data.py index 44fcf83..b0eb2f4 100644 --- a/EventDriven/riskmanager/market_data.py +++ b/EventDriven/riskmanager/market_data.py @@ -205,10 +205,10 @@ from trade.assets.rates import get_risk_free_rate_helper from EventDriven._vars import OPTION_TIMESERIES_START_DATE, load_riskmanager_cache from EventDriven.exceptions import UnaccessiblePropertyError -from trade import register_signal - - -logger = setup_logger("EventDriven.riskmanager.market_data", stream_log_level="WARNING") +from trade import register_signal, SIGNALS_TO_RUN +raise DeprecationWarning("This module is deprecated. Refer to `trade.datamanager.market_data` instead.") +logger = setup_logger("EventDriven.riskmanager.market_data", stream_log_level="INFO") +logger.critical("Market data from EventDriven.riskmanager.market_data. This module is deprecated. Refer to `trade.datamanager.market_data` instead.") ## TODO: This var is from optionlib. Once ready, import from there. ## TODO: Implement interval handling to have multiple intervals @@ -217,6 +217,8 @@ DIVIDEND_CACHE: CustomCache = load_riskmanager_cache(target="dividend_timeseries") SPOT_CACHE: CustomCache = load_riskmanager_cache(target="spot_timeseries") CHAIN_SPOT_CACHE: CustomCache = load_riskmanager_cache(target="chain_spot_timeseries") +SPLIT_FACTOR_CACHE: CustomCache = load_riskmanager_cache(target="split_factor_timeseries", create_on_missing=True, clear_on_exit=False) +_SANITIZED_ON_EXIT: bool = False @dataclass @@ -228,8 +230,9 @@ class AtIndexResult: spot: pd.Series chain_spot: pd.Series rates: pd.Series - dividends: pd.Series - dividend_yield: pd.Series + dividends: int | float + dividend_yield: int | float + split_factor: float | int additional: Dict[str, Any] = field(default_factory=dict) def __repr__(self) -> str: @@ -244,6 +247,8 @@ class TimeseriesData: chain_spot: pd.DataFrame dividends: pd.Series dividend_yield: pd.Series + split_factor: pd.Series + rates: Optional[pd.Series] = None additional_data: Dict[str, pd.Series] = field(default_factory=dict) def __repr__(self) -> str: @@ -256,7 +261,7 @@ class MarketTimeseries: additional_data: Dict[str, Any] = field(default_factory=dict) rates: pd.DataFrame = field(default_factory=get_risk_free_rate_helper) - DEFAULT_NAMES: ClassVar[List[str]] = ["spot", "chain_spot", "dividends"] + DEFAULT_NAMES: ClassVar[List[str]] = ["spot", "chain_spot", "dividends", "split_factor", "dividend_yield"] _refresh_delta: Optional[timedelta] = timedelta(minutes=30) _last_refresh: Optional[datetime] = field(default_factory=ny_now) _start: str = OPTION_TIMESERIES_START_DATE @@ -274,6 +279,12 @@ def spot(self) -> dict: "The 'spot' property is not accessible directly. Use 'get_timeseries' method instead. Or access via 'get_at_index' method." ) + @property + def split_factor(self) -> dict: + raise UnaccessiblePropertyError( + "The 'split_factor' property is not accessible directly. Use 'get_timeseries' method instead. Or access via 'get_at_index' method." + ) + @property def chain_spot(self) -> dict: raise UnaccessiblePropertyError( @@ -297,17 +308,26 @@ def _chain_spot(self) -> CustomCache: @property def _dividends(self) -> CustomCache: return DIVIDEND_CACHE - + + @property + def _split_factor(self) -> CustomCache: + return SPLIT_FACTOR_CACHE + @classmethod def clear_caches(cls): """Clear all caches used by MarketTimeseries.""" SPOT_CACHE.clear() CHAIN_SPOT_CACHE.clear() DIVIDEND_CACHE.clear() + SPLIT_FACTOR_CACHE.clear() logger.info("All MarketTimeseries caches have been cleared.") + @timeit def _on_exit_sanitize(self): """Remove today's data from all stored timeseries data.""" + global _SANITIZED_ON_EXIT + if _SANITIZED_ON_EXIT: + return try: def _check_instance(d): @@ -352,11 +372,26 @@ def _check_instance(d): d = d[d.index < self._today] self._dividends[sym] = d - logger.info("Successfully sanitized timeseries data on exit.") + for sym in self._split_factor.keys(): + d = self._split_factor[sym] + if not _check_instance(d): + logger.critical( + "Data for symbol %s in split_factor cache is not a DataFrame or Series. Skipping sanitization. Data: %s", + sym, + d, + ) + del self._split_factor[sym] + continue + + d = d[d.index < self._today] + self._split_factor[sym] = d + + logger.info("Sanitization of today's data on exit completed successfully.") + _SANITIZED_ON_EXIT = True except Exception as e: logger.error("Error during sanitization: %s", e, exc_info=True) - @timeit + # @timeit def _already_loaded( self, sym: str, interval: str = "1d", start: str | datetime = None, end: str | datetime = None ) -> Tuple[bool, List[pd.Timestamp]]: @@ -369,18 +404,31 @@ def _already_loaded( sym_available = sym in self._spot all_dates_present = False - data_to_check = [self._spot.get(sym), self._chain_spot.get(sym), self._dividends.get(sym)] + data_to_check = [ + (self._spot.get(sym), "spot"), + (self._chain_spot.get(sym), "chain_spot"), + (self._dividends.get(sym), "dividends"), + (self._split_factor.get(sym), "split_factor"), + ] missing_dates_set = set() all_dates_present = False - for data in data_to_check: + for data, data_type in data_to_check: # noqa if data is not None: missing_dates = get_missing_dates(data, start, end) missing_dates_set.update(missing_dates) - if not missing_dates: - all_dates_present = True - else: - all_dates_present = False + + else: + missing_dates = pd.bdate_range(start=start, end=end).to_pydatetime().tolist() + missing_dates_set.update(missing_dates) + all_dates_present = False + + ## If no missing dates, all dates present + if not missing_dates_set: + all_dates_present = True + else: + all_dates_present = False + ## If all dates not present, return missing dates return_dates = list(missing_dates_set) if not all_dates_present: @@ -395,7 +443,7 @@ def _already_loaded( return_dates = [] return (sym_available and all_dates_present), return_dates - + def cache_it(self, timeseries: TimeseriesData, sym: str) -> None: """ Cache the provided timeseries data for the given symbol. @@ -404,10 +452,11 @@ def cache_it(self, timeseries: TimeseriesData, sym: str) -> None: spot = timeseries.spot.copy() chain_spot = timeseries.chain_spot.copy() dividends = timeseries.dividends.copy() - + split_factor = timeseries.split_factor.copy() self._spot[sym] = self._remove_today_data(spot) self._chain_spot[sym] = self._remove_today_data(chain_spot) self._dividends[sym] = self._remove_today_data(dividends) + self._split_factor[sym] = self._remove_today_data(split_factor) logger.info("Cached timeseries data for symbol %s", sym) def already_loaded( @@ -431,15 +480,26 @@ def _remove_today_data(self, data: pd.DataFrame | pd.Series) -> pd.DataFrame | p raise ValueError("Data must be a pandas DataFrame or Series. Got type: {}".format(type(data))) @timeit - def _sanitize_today_data(self) -> None: + def _sanitize_today_data(self, force_after_eod: bool = False) -> None: """Remove today's data from all stored timeseries data.""" - + current_time = ny_now() + if not force_after_eod and current_time.hour > 18: + logger.info("Current time is after 6 PM NY time. Skipping sanitization of today's data.") + return + + logger.info("Sanitizing today's data from all stored timeseries data...") for sym in self._spot.keys(): self._spot[sym] = self._remove_today_data(self._spot[sym]) for sym in self._chain_spot.keys(): self._chain_spot[sym] = self._remove_today_data(self._chain_spot[sym]) - for sym in self._dividends.keys(): - self._dividends[sym] = self._remove_today_data(self._dividends[sym]) + + ## No need to sanitize dividends often. + # for sym in self._dividends.keys(): + # self._dividends[sym] = self._remove_today_data(self._dividends[sym]) + + ## No need to sanitize split factor often. + # for sym in self._split_factor.keys(): + # self._split_factor[sym] = self._remove_today_data(self._split_factor[sym]) @timeit def _sanitize_data(self) -> None: @@ -476,6 +536,39 @@ def _sanitize_data(self) -> None: data.dropna(how="all", inplace=True) self._dividends[sym] = data + for sym in self._split_factor.keys(): + sym = sym.upper() + data = self._split_factor[sym] + data.index = pd.to_datetime(data.index) + data = data[~data.index.duplicated(keep="last")] + data = data.sort_index() + data.dropna(how="all", inplace=True) + self._split_factor[sym] = data + + def get_split_factor_at_index(self, sym: str, index: pd.Timestamp) -> float | int: + """ + Retrieve the split factor for a given symbol at a specific index (date). + Args: + sym (str): The stock symbol. + index (pd.Timestamp or str): The date for which to retrieve the split factor. + Returns: + float | int: The split factor at the specified date. + """ + split_factor_series = self._split_factor.get(sym) + if split_factor_series is None: + return 1.0 + + index = pd.to_datetime(index) + if index in split_factor_series.index: + return split_factor_series.loc[index] + else: + prior_dates = split_factor_series.index[split_factor_series.index <= index] + if not prior_dates.empty: + nearest_date = prior_dates.max() + return split_factor_series.loc[nearest_date] + else: + return 1.0 + def _pre_sanitize_load_timeseries( self, sym: str, @@ -518,15 +611,24 @@ def _pre_sanitize_load_timeseries( logger.error("Failed to retrieve dividends for symbol %s", sym) divs = pd.DataFrame({"amount": [0]}, index=pd.bdate_range(start=self._start, end=self._end, freq=interval)) + try: + split_factor = chain_spot["split_factor"] + except Exception: + logger.error("Failed to retrieve split factor for symbol %s", sym) + split_factor = pd.Series(1, index=pd.bdate_range(start=self._start, end=self._end, freq=interval)) + ## Ensure datetime index divs.index = pd.to_datetime(divs.index) - divs = divs.reindex(pd.bdate_range(start=self._start, end=self._end, freq=interval), method="ffill") + use_start = min(spot.index.min(), chain_spot.index.min(), divs.index.min()) + use_end = max(spot.index.max(), chain_spot.index.max(), divs.index.max()) + divs = divs.reindex(pd.bdate_range(start=use_start, end=use_end, freq=interval), method="ffill") divs = resample(divs["amount"], method="ffill", interval=interval) ## Current Data current_spot = self._spot.get(sym) current_chain_spot = self._chain_spot.get(sym) current_divs = self._dividends.get(sym) + current_split_factor = self._split_factor.get(sym) ## We are moving from overwritting prev data to merging new data if current_spot is not None: @@ -540,6 +642,9 @@ def _pre_sanitize_load_timeseries( if current_divs is not None: divs = pd.concat([current_divs, divs]).sort_index() divs = divs[~divs.index.duplicated(keep="last")] + if current_split_factor is not None: + split_factor = pd.concat([current_split_factor, split_factor]).sort_index() + split_factor = split_factor[~split_factor.index.duplicated(keep="last")] ## Assign data directly to cache ## We remove today's data to avoid situations where it was loaded intraday and remains in database @@ -547,6 +652,7 @@ def _pre_sanitize_load_timeseries( self._spot[sym] = spot self._chain_spot[sym] = chain_spot self._dividends[sym] = divs + self._split_factor[sym] = split_factor def load_timeseries( self, @@ -571,7 +677,12 @@ def _is_date_in_index(self, sym: str, date: pd.Timestamp, interval: str = "1d") Returns: bool: True if the date is present, False otherwise. """ - all_data = [self._spot.get(sym), self._chain_spot.get(sym), self._dividends.get(sym)] + all_data = [ + self._spot.get(sym), + self._chain_spot.get(sym), + self._dividends.get(sym), + self._split_factor.get(sym), + ] for data in all_data: date = pd.to_datetime(date).date() @@ -611,15 +722,25 @@ def get_at_index(self, sym: str, index: pd.Timestamp, interval: str = "1d") -> A spot = self._spot[sym].loc[index_str] if sym in self._spot else None chain_spot = self._chain_spot[sym].loc[index_str] if sym in self._chain_spot else None dividends = self._dividends[sym].loc[index_str] if sym in self._dividends else None - rates = self.rates.loc[index_str] if self.rates is not None else None + rates = None dividend_yield = dividends / spot["close"] if spot is not None and dividends is not None else None + split_factor = self._split_factor[sym].loc[index_str] if sym in self._split_factor else None + self._sanitize_today_data() + return AtIndexResult( - spot=spot, chain_spot=chain_spot, dividends=dividends, sym=sym, date=index_str, rates=rates, dividend_yield=dividend_yield + spot=spot, + chain_spot=chain_spot, + dividends=dividends, + sym=sym, + date=index_str, + rates=rates, + dividend_yield=dividend_yield, + split_factor=split_factor, ) def calculate_additional_data( self, - factor: Literal["spot", "chain_spot", "dividends"], + factor: Literal["spot", "chain_spot", "dividends", "split_factor"], sym: str, additional_data_name: str, _callable: Any, @@ -627,7 +748,7 @@ def calculate_additional_data( force_add: bool = False, ) -> None: """ - Load additional data for a given factor (spot, chain_spot, dividends) using a callable function. + Load additional data for a given factor (spot, chain_spot, dividends, split_factor) using a callable function. Process: Callable passed should only take in a pd.Series and return a pd.Series. @@ -635,7 +756,7 @@ def calculate_additional_data( The schema of additional_data: {additional_data_name: {sym: pd.Series}} Args: - factor (Literal['spot', 'chain_spot', 'dividends']): The factor to process. + factor (Literal['spot', 'chain_spot', 'dividends', 'split_factor']): The factor to process. sym (str): The stock symbol. additional_data_name (str): The name under which to store the additional data. _callable (Any): A callable function that processes the pd.Series. @@ -683,25 +804,56 @@ def calculate_additional_data( def get_timeseries( self, sym: str, - factor: Literal["spot", "chain_spot", "dividends", "additional"] = None, + factor: Literal["spot", "chain_spot", "dividends", "split_factor", "additional"] = None, interval: str = "1d", additional_data_name: Optional[str] = None, start_date: str | datetime = None, end_date: str | datetime = None, + skip_preload_check: bool = False, ) -> TimeseriesData: """ Retrieve the timeseries data for a given symbol and factor. Args: sym (str): The stock symbol. - factor (Literal['spot', 'chain_spot', 'dividends', 'additional']): The factor to retrieve. + factor (Literal['spot', 'chain_spot', 'dividends', 'split_factor', 'additional']): The factor to retrieve. additional_data_name (Optional[str]): The name of the additional data if factor is 'additional'. Returns: TimeseriesData: A dataclass containing the requested timeseries data. """ sym = sym.upper() - if not self.already_loaded(sym, interval): + must_preload = False + end_date = end_date or self._end + + ## Adding `must_preload`. This will be determined based on if + ## 1. Today's date is in end_date + ## 2. Current time is before market close + if pd.to_datetime(end_date).date() >= ny_now().date(): + current_time = ny_now() + if current_time.hour < 20: + must_preload = True + + if must_preload: + logger.warning( + "End date %s is today or in the future and current time is before market close. Forcing preload check.", + end_date, + ) + else: + logger.warning( + "End date %s is in the past or current time is after market close. Preload check will be skipped if specified.", + end_date, + ) + + + ## Check if data is already loaded + if skip_preload_check and not must_preload: + already_loaded = True + else: + already_loaded, _ = self._already_loaded(sym, interval, start_date, end_date) + + if not already_loaded: logger.critical("Timeseries for symbol %s not loaded. Loading now.", sym) self._pre_sanitize_load_timeseries(sym, interval=interval, force=True) + if factor not in self.DEFAULT_NAMES + ["additional", None]: raise ValueError(f"Factor {factor} not recognized. Must be one of {self.DEFAULT_NAMES + ['additional']}.") if factor == "additional": @@ -711,12 +863,17 @@ def get_timeseries( if data is None: raise ValueError(f"No additional data found for name {additional_data_name} and symbol {sym}.") return TimeseriesData( - spot=None, chain_spot=None, dividends=None, additional_data={additional_data_name: data} + spot=None, + chain_spot=None, + dividends=None, + additional_data={additional_data_name: data}, + split_factor=None, + dividend_yield=None, ) elif factor in self.DEFAULT_NAMES: factor = "_" + factor - if factor in ["_spot", "_chain_spot", "_dividends"]: + if factor in ["_spot", "_chain_spot", "_dividends", "_split_factor"]: data = getattr(self, factor).get(sym) elif factor == "_dividend_yield": divs = self._dividends.get(sym) @@ -737,13 +894,15 @@ def get_timeseries( if data is None: raise ValueError(f"No data found for factor {factor} and symbol {sym}.") if factor == "_spot": - ts = TimeseriesData(spot=data, chain_spot=None, dividends=None) + ts = TimeseriesData(spot=data, chain_spot=None, dividends=None, dividend_yield=None, split_factor=None) elif factor == "_chain_spot": - ts = TimeseriesData(spot=None, chain_spot=data, dividends=None) + ts = TimeseriesData(spot=None, chain_spot=data, dividends=None, dividend_yield=None, split_factor=None) elif factor == "_dividends": - ts = TimeseriesData(spot=None, chain_spot=None, dividends=data) + ts = TimeseriesData(spot=None, chain_spot=None, dividends=data, dividend_yield=None, split_factor=None) elif factor == "_dividend_yield": - ts = TimeseriesData(spot=None, chain_spot=None, dividends=None, dividend_yield=data) + ts = TimeseriesData(spot=None, chain_spot=None, dividends=None, dividend_yield=data, split_factor=None) + elif factor == "_split_factor": + ts = TimeseriesData(spot=None, chain_spot=None, dividends=None, split_factor=data, dividend_yield=None) else: raise ValueError(f"Unhandled factor {factor}.") @@ -752,6 +911,7 @@ def get_timeseries( chain_spot = self._chain_spot.get(sym) dividends = self._dividends.get(sym) dividend_yield = dividends / spot["close"] if spot is not None and dividends is not None else None + split_factor = self._split_factor.get(sym) if start_date is not None or end_date is not None: start_date = pd.to_datetime(start_date).strftime("%Y-%m-%d") if start_date is not None else None end_date = pd.to_datetime(end_date).strftime("%Y-%m-%d") if end_date is not None else None @@ -759,12 +919,23 @@ def get_timeseries( spot = spot[spot.index >= start_date] chain_spot = chain_spot[chain_spot.index >= start_date] dividends = dividends[dividends.index >= start_date] + dividend_yield = dividend_yield[dividend_yield.index >= start_date] + split_factor = split_factor[split_factor.index >= start_date] if end_date is not None: spot = spot[spot.index <= end_date] chain_spot = chain_spot[chain_spot.index <= end_date] dividends = dividends[dividends.index <= end_date] dividend_yield = dividend_yield[dividend_yield.index <= end_date] - ts = TimeseriesData(spot=spot, chain_spot=chain_spot, dividends=dividends, dividend_yield=dividend_yield) + split_factor = split_factor[split_factor.index <= end_date] + ts = TimeseriesData( + spot=spot, + chain_spot=chain_spot, + dividends=dividends, + dividend_yield=dividend_yield, + split_factor=split_factor, + rates=self.rates["annualized"], + ) + self._sanitize_today_data() return ts @@ -772,10 +943,10 @@ def __repr__(self) -> str: return f"MarketTimeseries(symbols: {list(self._spot.keys())}, intervals: {list(self._spot.keys())})" -def get_timeseries_obj() -> MarketTimeseries: +def get_timeseries_obj(live: bool = False) -> MarketTimeseries: global OPTIMESERIES if OPTIMESERIES is None: - OPTIMESERIES = MarketTimeseries() + OPTIMESERIES = MarketTimeseries(_end = (datetime.now() - BDay(1)).strftime("%Y-%m-%d") if not live else datetime.now().strftime("%Y-%m-%d")) return OPTIMESERIES @@ -783,3 +954,11 @@ def get_timeseries_obj() -> MarketTimeseries: def reset_timeseries_obj() -> None: global OPTIMESERIES OPTIMESERIES = None + + +if __name__ == "__main__": + mts = get_timeseries_obj() + mts.load_timeseries("BA", force=True) + ts = mts.get_timeseries("BA") + print(ts) + print(SIGNALS_TO_RUN) diff --git a/EventDriven/riskmanager/market_timeseries.py b/EventDriven/riskmanager/market_timeseries.py index 43e0976..a559a54 100644 --- a/EventDriven/riskmanager/market_timeseries.py +++ b/EventDriven/riskmanager/market_timeseries.py @@ -146,16 +146,17 @@ ## Options Timeseries class for handling data retrieval from datetime import datetime from dateutil.relativedelta import relativedelta -from EventDriven.riskmanager.market_data import MarketTimeseries +from trade.datamanager.market_data import MarketTimeseries from EventDriven._vars import load_riskmanager_cache, ADD_COLUMNS_FACTORY from EventDriven.riskmanager.utils import ( parse_position_id, swap_ticker, - load_position_data, add_skip_columns, + load_position_data_new ) from trade.helpers.decorators import timeit -from trade.helpers.threads import runThreads +from trade.helpers.threads import runThreads # noqa +from trade.helpers.pools import runProcesses # noqa from trade.helpers.helper import compare_dates, parse_option_tick, generate_option_tick_new from EventDriven.configs.core import SkipCalcConfig, UndlTimeseriesConfig, OptionPriceConfig from trade.assets.rates import get_risk_free_rate_helper @@ -166,7 +167,6 @@ from trade.helpers.Logging import setup_logger from trade.helpers.pools import _change_global_stream_level from EventDriven.dataclasses.timeseries import AtTimeOptionData, AtTimePositionData -from module_test.raw_code.DataManagers.DataManagers import set_skip_mysql_query logger = setup_logger("EventDriven.riskmanager.market_timeseries", stream_log_level="WARNING") logger.info("Changing pools log level to WARNING for market_timeseries module") @@ -298,7 +298,7 @@ def calculate_option_data(self, position_id: str, date: Union[datetime, str]) -> """ Calculate Greeks for a given position at a specific date. """ - set_skip_mysql_query(True) + import time logger.info( f"Calculate Greeks Dates Start: {self.start_date}, End: {self.end_date}, Position ID: {position_id}, Date: {date}" @@ -323,8 +323,10 @@ def calculate_option_data(self, position_id: str, date: Union[datetime, str]) -> for p in position_dict.values(): for s in p: ticker = swap_ticker(s["ticker"]) - self.market_timeseries.load_timeseries(sym=ticker, interval=self.undl_timeseries_config.interval) + start_time = time.time() + # self.market_timeseries.load_timeseries(sym=ticker) timeseries_data = self.market_timeseries.get_timeseries(sym=ticker) + logger.info(f"Timeseries loading for {ticker} took {time.time() - start_time:.2f} seconds") @timeit def get_timeseries(_id, direction): @@ -349,10 +351,12 @@ def get_timeseries(_id, direction): for _set in positon_meta: thread_input_list[0].append(_set[1]) ## Append the option id to the thread input list thread_input_list[1].append(_set[0]) ## Append the direction to the thread input list - + + start_time = time.time() runThreads( get_timeseries, thread_input_list, block=True ) ## Run the threads to get the timeseries data for the options + print(f"Threads execution took {time.time() - start_time:.2f} seconds") position_data = sum(long) - sum(short) position_data = position_data[~position_data.index.duplicated(keep="first")] position_data.columns = [x.capitalize() for x in position_data.columns] @@ -444,7 +448,7 @@ def _skip_columns_adjustment( return position_data # self.position_data[position_id] = position_data - def load_position_data(self, opttick) -> pd.DataFrame: + def load_position_data(self, opttick) -> pd.DataFrame: # noqa """ Load position data for a given option tick. @@ -453,18 +457,13 @@ def load_position_data(self, opttick) -> pd.DataFrame: """ ## Get Meta meta = parse_option_tick(opttick) - self.market_timeseries.load_timeseries(sym=meta["ticker"], interval=self.undl_timeseries_config.interval) - timeseries_data = self.market_timeseries.get_timeseries(sym=meta["ticker"]) - return load_position_data( - opttick, - self.options_cache, - self.start_date, - self.end_date, - s=timeseries_data.chain_spot["close"], - r=self.rf_timeseries, - y=timeseries_data.dividends, - s0_close=timeseries_data.spot["close"], - ) + self.market_timeseries.load_timeseries(sym=meta["ticker"]) + + return load_position_data_new( + opttick=opttick, + processed_option_data=self.options_cache, + start=self.start_date, + end=self.end_date) def generate_option_data_for_trade(self, opttick, check_date) -> pd.DataFrame: """ diff --git a/EventDriven/riskmanager/notebooks/rm_breakdown.ipynb b/EventDriven/riskmanager/notebooks/rm_breakdown.ipynb deleted file mode 100644 index c1a943c..0000000 --- a/EventDriven/riskmanager/notebooks/rm_breakdown.ipynb +++ /dev/null @@ -1,1440 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Break into functions:\n", - "\n", - "- Loading price + adding skip logic\n", - " - Add columns\n", - " - Get price\n", - " - Generate prices\n", - "- Analyze position\n", - " - Roll\n", - " - Reduce size\n", - "- Generate orders\n", - "- Generate option data" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The autoreload extension is already loaded. To reload it, use:\n", - " %reload_ext autoreload\n" - ] - } - ], - "source": [ - "%load_ext autoreload\n", - "%autoreload 2\n", - "from algo.positions.dataclasses import EODPositionData, PortfolioPositions, ActivePosition\n", - "from algo.positions.loaders.option_data import load_positions_data, get_orders_table\n", - "from algo.positions.loaders.snapshot_utils import build_snapshot_table\n", - "from algo.strategies.init_config import load_config\n", - "from EventDriven.riskmanager.actions import ROLL, EXERCISE, ADJUST, HOLD, RMAction\n", - "from dataclasses import dataclass, field\n", - "from algo.strategies.init_run import init_produce_orders, produce_orders, produce_signals\n", - "from datetime import datetime\n", - "from trade.helpers.helper import ny_now\n", - "from EventDriven.backtest import OptionSignalBacktest\n", - "import pandas as pd\n", - "from dbase.database.SQLHelpers import DatabaseAdapter, dynamic_batch_update, get_engine\n", - "import numpy as np\n", - "db = DatabaseAdapter()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Saving limits after backtest" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "def create_limits_table(bkt: OptionSignalBacktest, date: datetime = None):\n", - " data = []\n", - " for info, limits in bkt.risk_manager.limits_meta.items():\n", - " for l in limits:\n", - " if date is not None:\n", - " if pd.to_datetime(info[2]).date() != date.date():\n", - " continue\n", - " \n", - " log = dict(\n", - " signal_id=info[0],\n", - " trade_id=info[1],\n", - " date=info[2],\n", - " strategy_name='long_bbands',\n", - " risk_measure=l,\n", - " value = limits[l],\n", - " )\n", - " data.append(log)\n", - "\n", - "\n", - " df = pd.DataFrame(data)\n", - " return df\n" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "from sqlalchemy import text\n", - "\n", - "MEASURES = ('delta','gamma','vega','theta')\n", - "from sqlalchemy import text\n", - "\n", - "MEASURES = ('delta','gamma','vega','theta')\n", - "\n", - "def update_greeks_case(trade_id: str,\n", - " strategy_name: str,\n", - " signal_id: str,\n", - " greeks: dict,\n", - " date_):\n", - " # validate inputs\n", - " missing = [k for k in MEASURES if k not in greeks]\n", - " if missing:\n", - " raise ValueError(f\"Missing greek(s): {missing}\")\n", - "\n", - " # Support either greeks[\"new_date\"] or greeks[\"date\"] as the target date\n", - " new_date = greeks.pop(\"new_date\", greeks.pop(\"date\", None))\n", - "\n", - " params = {\n", - " \"old_date\": date_, # date you are updating FROM\n", - " \"signal_id\": signal_id,\n", - " \"strategy_name\": strategy_name,\n", - " \"trade_id\": trade_id,\n", - " **greeks\n", - " }\n", - " set_date_sql = \", `date` = :new_date\" if new_date is not None else \"\"\n", - " if new_date is not None:\n", - " params[\"new_date\"] = new_date\n", - "\n", - " # Update values (+ optionally move to new date)\n", - " q = text(f\"\"\"\n", - " UPDATE `limits`\n", - " SET `value` = CASE `risk_measure`\n", - " WHEN 'delta' THEN :delta\n", - " WHEN 'gamma' THEN :gamma\n", - " WHEN 'vega' THEN :vega\n", - " WHEN 'theta' THEN :theta\n", - " ELSE `value`\n", - " END\n", - " {set_date_sql}\n", - " WHERE `date`=:old_date\n", - " AND `signal_id`=:signal_id\n", - " AND `strategy_name`=:strategy_name\n", - " AND `trade_id`=:trade_id\n", - " AND `risk_measure` IN ('delta','gamma','vega','theta')\n", - " \"\"\")\n", - "\n", - " engine = get_engine(\"portfolio_data\")\n", - " with engine.begin() as conn:\n", - " res = conn.execute(q, params)\n", - "\n", - " # Verify at the final date (new_date if provided, else old_date)\n", - " verify_date = new_date or date_\n", - " rows = conn.execute(text(\"\"\"\n", - " SELECT `risk_measure`, `value`\n", - " FROM `limits`\n", - " WHERE `date`=:date AND `signal_id`=:signal_id\n", - " AND `strategy_name`=:strategy_name AND `trade_id`=:trade_id\n", - " AND `risk_measure` IN ('delta','gamma','vega','theta')\n", - " \"\"\"), {\n", - " \"date\": verify_date,\n", - " \"signal_id\": signal_id,\n", - " \"strategy_name\": strategy_name,\n", - " \"trade_id\": trade_id\n", - " }).all()\n", - "\n", - " after = {rm: v for rm, v in rows}\n", - " return {\n", - " \"matched\": len(after) == 4, # how many of the 4 measures now exist at the target date\n", - " \"rowcount\": res.rowcount, # may be 0 if values were identical\n", - " \"date\": verify_date,\n", - " \"after\": after\n", - " }\n" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "def save_limits_by_meta(trade_id: str,\n", - " strategy_name: str,\n", - " signal_id: str,\n", - " greeks: dict,\n", - " date_):\n", - " # validate inputs\n", - " missing = [k for k in MEASURES if k not in greeks]\n", - " if missing:\n", - " raise ValueError(f\"Missing greek(s): {missing}\")\n", - " params = {\n", - " \"date\": date_,\n", - " \"signal_id\": signal_id,\n", - " \"strategy_name\": strategy_name,\n", - " \"trade_id\": trade_id,\n", - " **greeks\n", - " }\n", - " insert_rows = []\n", - " for measure in MEASURES:\n", - " insert_rows.append({\n", - " \"date\": params[\"date\"],\n", - " \"signal_id\": params[\"signal_id\"],\n", - " \"strategy_name\": params[\"strategy_name\"],\n", - " \"trade_id\": params[\"trade_id\"],\n", - " \"risk_measure\": measure,\n", - " \"value\": params[measure]\n", - " })\n", - " db = DatabaseAdapter()\n", - " db.save_to_database(\n", - " db='portfolio_data',\n", - " table_name='limits',\n", - " data=pd.DataFrame(insert_rows),\n", - " filter_data=False\n", - " )" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "def store_position_limits(delta_limit:str,\n", - " gamma_limit:str,\n", - " vega_limit:str,\n", - " theta_limit:str,\n", - " trade_id:str,\n", - " strategy_name:str,\n", - " date:str|datetime,\n", - " signal_id:str):\n", - " \"\"\"\"\"\"\n", - "\n", - " ## First check if the limits exist\n", - " if isinstance(date, str):\n", - " date = pd.to_datetime(date)\n", - "\n", - " exists, old_date = check_limits_exist(trade_id, strategy_name, signal_id=signal_id)\n", - "\n", - " ## Convert to float or None\n", - " delta_limit = float(delta_limit) if not pd.isna(delta_limit) else None\n", - " gamma_limit = float(gamma_limit) if not pd.isna(gamma_limit) else None\n", - " vega_limit = float(vega_limit) if not pd.isna(vega_limit) else None\n", - " theta_limit = float(theta_limit) if not pd.isna(theta_limit) else None\n", - " \n", - " ## If exists, we update\n", - " if exists:\n", - " print(f\"Updating existing limits for trade_id={trade_id}, strategy_name={strategy_name}, signal_id={signal_id}, date={old_date} to new date={date} with values: delta={delta_limit}, gamma={gamma_limit}, vega={vega_limit}, theta={theta_limit}\")\n", - " ## Delta row\n", - " update_greeks_case(\n", - " trade_id=trade_id,\n", - " strategy_name=strategy_name,\n", - " signal_id=signal_id,\n", - " greeks={\n", - " \"delta\": delta_limit,\n", - " \"gamma\": gamma_limit,\n", - " \"vega\": vega_limit,\n", - " \"theta\": theta_limit,\n", - " \"date\": date\n", - " },\n", - " date_=old_date\n", - " )\n", - " \n", - " ## If not exists, we create new rows\n", - " else:\n", - " print(f\"Creating new limits for trade_id={trade_id}, strategy_name={strategy_name}, signal_id={signal_id}, date={date} with values: delta={delta_limit}, gamma={gamma_limit}, vega={vega_limit}, theta={theta_limit}\")\n", - " save_limits_by_meta(\n", - " trade_id=trade_id,\n", - " strategy_name=strategy_name,\n", - " signal_id=signal_id,\n", - " greeks={\n", - " \"delta\": delta_limit,\n", - " \"gamma\": gamma_limit,\n", - " \"vega\": vega_limit,\n", - " \"theta\": theta_limit\n", - " },\n", - " date_=date\n", - " )\n", - " \n", - "\n", - "def check_limits_exist(trade_id, strategy_name, signal_id):\n", - " \"\"\"\n", - " Check if the limits exist for the given trade_id and strategy_name\n", - " \n", - " Args:\n", - " trade_id (str): The trade ID to check.\n", - " strategy_name (str): The strategy name to check.\n", - " signal_id (str): The signal ID to check.\n", - " Returns:\n", - " bool: True if limits exist, False otherwise.\n", - " \"\"\"\n", - "\n", - " limits_data = db.query_database(\n", - " db='portfolio_data',\n", - " table_name='limits',\n", - " query=f\"\"\"\n", - " SELECT * FROM limits\n", - " WHERE trade_id = '{trade_id}'\n", - " AND strategy_name = '{strategy_name}'\n", - " AND signal_id = '{signal_id}'\n", - " \"\"\"\n", - " )\n", - " if len(limits_data) > 0:\n", - " return True, limits_data[\"date\"].values[0]\n", - " return False, None\n", - "\n", - "def update_limits(trade_id:str, \n", - " strategy_name:str, \n", - " signal_id:str, \n", - " greek_name:str, \n", - " update_value:float):\n", - " \"\"\"\n", - " Update the limits for the given trade_id, strategy_name, signal_id, and greek_name.\n", - " Args:\n", - " trade_id (str): The trade ID to update.\n", - " strategy_name (str): The strategy name to update.\n", - " signal_id (str): The signal ID to update.\n", - " greek_name (str): The greek name to update (e.g., 'delta_limit').\n", - " update_value (float): The new value for the limit.\n", - " \"\"\"\n", - "\n", - " dynamic_batch_update(\n", - " db='portfolio_data',\n", - " table_name='limits',\n", - " update_values={\"value\": update_value},\n", - " condition={\n", - " \"trade_id\": trade_id,\n", - " \"strategy_name\": strategy_name,\n", - " \"signal_id\": signal_id,\n", - " \"risk_measure\": greek_name\n", - " }\n", - " )\n", - "\n", - "# check_limits_exist(signal_id='AAPL20250821LONG', strategy_name='long_bbands', trade_id='&L:AAPL20260417C265&S:AAPL20260417C270')" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "## Test limit save\n", - "def save_limits_from_backtester(bkt: OptionSignalBacktest, date: datetime = None):\n", - " \"\"\"\n", - " Save limits from backtester to database.\n", - " If date is provided, only save limits for that date.\n", - " \"\"\"\n", - " unadjusted_trades = bkt.unadjusted_trades\n", - " for info, greek_meta in bkt.risk_manager.limits_meta.items():\n", - " old_signal_id, trade_id, date_ = info\n", - " signal_id = unadjusted_trades[unadjusted_trades[\"signal_id\"] == old_signal_id][\"PT_BKTEST_SIG_ID\"].values[0]\n", - " if date is not None:\n", - " if pd.to_datetime(date_).date() != date.date():\n", - " print(f\"Skipping {info} as date does not match {date.date()}\")\n", - " continue\n", - " store_position_limits(\n", - " delta_limit=greek_meta.get('delta', None),\n", - " gamma_limit=greek_meta.get('gamma', None),\n", - " vega_limit=greek_meta.get('vega', None),\n", - " theta_limit=greek_meta.get('theta', None),\n", - " trade_id=trade_id,\n", - " strategy_name='long_bbands',\n", - " date=date_,\n", - " signal_id=signal_id\n", - " )\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Loading saved limits" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "_LIMITS = None\n" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "\n", - "@dataclass\n", - "class LIMITS:\n", - " refresh_date: datetime = field(default_factory=ny_now)\n", - " __data: pd.DataFrame = None\n", - "\n", - " @property\n", - " def data(self):\n", - " if self.__data is None or (pd.Timestamp.now() - self.refresh_date).seconds > 3600:\n", - " db = DatabaseAdapter()\n", - " self.__data = db.query_database(\n", - " db='portfolio_data',\n", - " table_name='limits',\n", - " query=\"\"\"\n", - " SELECT * FROM limits\n", - " \"\"\"\n", - " )\n", - " self.refresh_date = pd.Timestamp.now()\n", - " self.__data['value'] = self.__data['value'].astype(float)\n", - " return self.__data\n", - "\n", - "def get_limits_data():\n", - " global _LIMITS\n", - " if _LIMITS is None:\n", - " _LIMITS = LIMITS()\n", - " return _LIMITS.data\n", - "_ = get_limits_data()" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
datesignal_idstrategy_nametrade_idrisk_measurevalue
02025-08-21AAPL20250808LONGlong_bbands&L:AAPL20260417C265&S:AAPL20260417C270delta0.103044
12025-08-21AAPL20250808LONGlong_bbands&L:AAPL20260417C265&S:AAPL20260417C270gammaNaN
22025-08-21AAPL20250808LONGlong_bbands&L:AAPL20260417C265&S:AAPL20260417C270thetaNaN
32025-08-21AAPL20250808LONGlong_bbands&L:AAPL20260417C265&S:AAPL20260417C270vegaNaN
42025-08-29AMD20250701LONGlong_bbands&L:AMD20260417C195&S:AMD20260417C200delta0.165999
52025-08-29AMD20250701LONGlong_bbands&L:AMD20260417C195&S:AMD20260417C200gammaNaN
62025-08-29AMD20250701LONGlong_bbands&L:AMD20260417C195&S:AMD20260417C200thetaNaN
72025-08-29AMD20250701LONGlong_bbands&L:AMD20260417C195&S:AMD20260417C200vegaNaN
82025-08-25AMZN20250701LONGlong_bbands&L:AMZN20260515C280&S:AMZN20260515C285delta0.146286
92025-08-25AMZN20250701LONGlong_bbands&L:AMZN20260515C280&S:AMZN20260515C285gammaNaN
102025-08-25AMZN20250701LONGlong_bbands&L:AMZN20260515C280&S:AMZN20260515C285thetaNaN
112025-08-25AMZN20250701LONGlong_bbands&L:AMZN20260515C280&S:AMZN20260515C285vegaNaN
122025-09-08BA20250701LONGlong_bbands&L:BA20260515C285&S:BA20260515C290delta0.099152
132025-09-08BA20250701LONGlong_bbands&L:BA20260515C285&S:BA20260515C290gammaNaN
142025-09-08BA20250701LONGlong_bbands&L:BA20260515C285&S:BA20260515C290thetaNaN
152025-09-08BA20250701LONGlong_bbands&L:BA20260515C285&S:BA20260515C290vegaNaN
162025-09-08META20250701LONGlong_bbands&L:META20260417C990&S:META20260417C1000delta0.023785
172025-09-08META20250701LONGlong_bbands&L:META20260417C990&S:META20260417C1000gammaNaN
182025-09-08META20250701LONGlong_bbands&L:META20260417C990&S:META20260417C1000thetaNaN
192025-09-08META20250701LONGlong_bbands&L:META20260417C990&S:META20260417C1000vegaNaN
202025-09-09NFLX20250701LONGlong_bbands&L:NFLX20260618C1650&S:NFLX20260618C1660delta0.018219
212025-09-09NFLX20250701LONGlong_bbands&L:NFLX20260618C1650&S:NFLX20260618C1660gammaNaN
222025-09-09NFLX20250701LONGlong_bbands&L:NFLX20260618C1650&S:NFLX20260618C1660thetaNaN
232025-09-09NFLX20250701LONGlong_bbands&L:NFLX20260618C1650&S:NFLX20260618C1660vegaNaN
242025-08-25NVDA20250701LONGlong_bbands&L:NVDA20260618C235&S:NVDA20260618C240delta0.135107
252025-08-25NVDA20250701LONGlong_bbands&L:NVDA20260618C235&S:NVDA20260618C240gammaNaN
262025-08-25NVDA20250701LONGlong_bbands&L:NVDA20260618C235&S:NVDA20260618C240thetaNaN
272025-08-25NVDA20250701LONGlong_bbands&L:NVDA20260618C235&S:NVDA20260618C240vegaNaN
282025-09-08TSLA20250915LONGlong_bbands&L:TSLA20260417C445&S:TSLA20260417C450delta0.052480
292025-09-08TSLA20250915LONGlong_bbands&L:TSLA20260417C445&S:TSLA20260417C450gammaNaN
302025-09-08TSLA20250915LONGlong_bbands&L:TSLA20260417C445&S:TSLA20260417C450thetaNaN
312025-09-08TSLA20250915LONGlong_bbands&L:TSLA20260417C445&S:TSLA20260417C450vegaNaN
\n", - "
" - ], - "text/plain": [ - " date signal_id strategy_name \\\n", - "0 2025-08-21 AAPL20250808LONG long_bbands \n", - "1 2025-08-21 AAPL20250808LONG long_bbands \n", - "2 2025-08-21 AAPL20250808LONG long_bbands \n", - "3 2025-08-21 AAPL20250808LONG long_bbands \n", - "4 2025-08-29 AMD20250701LONG long_bbands \n", - "5 2025-08-29 AMD20250701LONG long_bbands \n", - "6 2025-08-29 AMD20250701LONG long_bbands \n", - "7 2025-08-29 AMD20250701LONG long_bbands \n", - "8 2025-08-25 AMZN20250701LONG long_bbands \n", - "9 2025-08-25 AMZN20250701LONG long_bbands \n", - "10 2025-08-25 AMZN20250701LONG long_bbands \n", - "11 2025-08-25 AMZN20250701LONG long_bbands \n", - "12 2025-09-08 BA20250701LONG long_bbands \n", - "13 2025-09-08 BA20250701LONG long_bbands \n", - "14 2025-09-08 BA20250701LONG long_bbands \n", - "15 2025-09-08 BA20250701LONG long_bbands \n", - "16 2025-09-08 META20250701LONG long_bbands \n", - "17 2025-09-08 META20250701LONG long_bbands \n", - "18 2025-09-08 META20250701LONG long_bbands \n", - "19 2025-09-08 META20250701LONG long_bbands \n", - "20 2025-09-09 NFLX20250701LONG long_bbands \n", - "21 2025-09-09 NFLX20250701LONG long_bbands \n", - "22 2025-09-09 NFLX20250701LONG long_bbands \n", - "23 2025-09-09 NFLX20250701LONG long_bbands \n", - "24 2025-08-25 NVDA20250701LONG long_bbands \n", - "25 2025-08-25 NVDA20250701LONG long_bbands \n", - "26 2025-08-25 NVDA20250701LONG long_bbands \n", - "27 2025-08-25 NVDA20250701LONG long_bbands \n", - "28 2025-09-08 TSLA20250915LONG long_bbands \n", - "29 2025-09-08 TSLA20250915LONG long_bbands \n", - "30 2025-09-08 TSLA20250915LONG long_bbands \n", - "31 2025-09-08 TSLA20250915LONG long_bbands \n", - "\n", - " trade_id risk_measure value \n", - "0 &L:AAPL20260417C265&S:AAPL20260417C270 delta 0.103044 \n", - "1 &L:AAPL20260417C265&S:AAPL20260417C270 gamma NaN \n", - "2 &L:AAPL20260417C265&S:AAPL20260417C270 theta NaN \n", - "3 &L:AAPL20260417C265&S:AAPL20260417C270 vega NaN \n", - "4 &L:AMD20260417C195&S:AMD20260417C200 delta 0.165999 \n", - "5 &L:AMD20260417C195&S:AMD20260417C200 gamma NaN \n", - "6 &L:AMD20260417C195&S:AMD20260417C200 theta NaN \n", - "7 &L:AMD20260417C195&S:AMD20260417C200 vega NaN \n", - "8 &L:AMZN20260515C280&S:AMZN20260515C285 delta 0.146286 \n", - "9 &L:AMZN20260515C280&S:AMZN20260515C285 gamma NaN \n", - "10 &L:AMZN20260515C280&S:AMZN20260515C285 theta NaN \n", - "11 &L:AMZN20260515C280&S:AMZN20260515C285 vega NaN \n", - "12 &L:BA20260515C285&S:BA20260515C290 delta 0.099152 \n", - "13 &L:BA20260515C285&S:BA20260515C290 gamma NaN \n", - "14 &L:BA20260515C285&S:BA20260515C290 theta NaN \n", - "15 &L:BA20260515C285&S:BA20260515C290 vega NaN \n", - "16 &L:META20260417C990&S:META20260417C1000 delta 0.023785 \n", - "17 &L:META20260417C990&S:META20260417C1000 gamma NaN \n", - "18 &L:META20260417C990&S:META20260417C1000 theta NaN \n", - "19 &L:META20260417C990&S:META20260417C1000 vega NaN \n", - "20 &L:NFLX20260618C1650&S:NFLX20260618C1660 delta 0.018219 \n", - "21 &L:NFLX20260618C1650&S:NFLX20260618C1660 gamma NaN \n", - "22 &L:NFLX20260618C1650&S:NFLX20260618C1660 theta NaN \n", - "23 &L:NFLX20260618C1650&S:NFLX20260618C1660 vega NaN \n", - "24 &L:NVDA20260618C235&S:NVDA20260618C240 delta 0.135107 \n", - "25 &L:NVDA20260618C235&S:NVDA20260618C240 gamma NaN \n", - "26 &L:NVDA20260618C235&S:NVDA20260618C240 theta NaN \n", - "27 &L:NVDA20260618C235&S:NVDA20260618C240 vega NaN \n", - "28 &L:TSLA20260417C445&S:TSLA20260417C450 delta 0.052480 \n", - "29 &L:TSLA20260417C445&S:TSLA20260417C450 gamma NaN \n", - "30 &L:TSLA20260417C445&S:TSLA20260417C450 theta NaN \n", - "31 &L:TSLA20260417C445&S:TSLA20260417C450 vega NaN " - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "_LIMITS.data" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.103044" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "def get_position_limit(trade_id:str,\n", - " strategy_name:str,\n", - " signal_id:str,\n", - " risk_measure:str):\n", - " df = get_limits_data()\n", - " assert risk_measure in MEASURES, f\"risk_measure must be one of {MEASURES}\"\n", - " row = df[\n", - " (df['trade_id'] == trade_id) &\n", - " (df['strategy_name'] == strategy_name) &\n", - " (df['signal_id'] == signal_id) &\n", - " (df['risk_measure'] == risk_measure)\n", - " ]\n", - " if len(row) == 0:\n", - " print(f\"No limit found for trade_id={trade_id}, strategy_name={strategy_name}, signal_id={signal_id}, risk_measure={risk_measure}\")\n", - " return None\n", - " return float(row['value'].values[0])\n", - "\n", - "get_position_limit(\n", - " trade_id='&L:AAPL20260417C265&S:AAPL20260417C270',\n", - " strategy_name='long_bbands',\n", - " signal_id='AAPL20250808LONG',\n", - " risk_measure='delta'\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2025-09-17 20:38:56 trade.asset.Stock ERROR: Error getting dividends history for NFLX from yfinance\n", - "2025-09-17 20:38:57 trade.asset.Stock ERROR: Probably due to no dividends history\n" - ] - } - ], - "source": [ - "portfolio = load_positions_data()[0]" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "StrategyLimitsEnabled(delta=True, gamma=False, vega=False, theta=False, dte=True, moneyness=True, exercise=False)" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "@dataclass\n", - "class StrategyLimitsEnabled:\n", - " delta: bool\n", - " gamma: bool\n", - " vega: bool\n", - " theta: bool\n", - " dte: bool\n", - " moneyness: bool\n", - " exercise: bool\n", - "\n", - "def load_config_strategy_limits(strategy_slug: str) -> StrategyLimitsEnabled:\n", - " active_limits = load_config(strategy_slug)['option_settings']['rm_settings']['limits_enabled']\n", - " limits = StrategyLimitsEnabled(\n", - " delta='delta' in active_limits,\n", - " gamma='gamma' in active_limits,\n", - " vega='vega' in active_limits,\n", - " theta='theta' in active_limits,\n", - " dte='dte' in active_limits,\n", - " moneyness='moneyness' in active_limits,\n", - " exercise='exercise' in active_limits,\n", - " )\n", - " return limits\n", - "\n", - "load_config('long_bbands')['option_settings']['rm_settings']\n", - "load_config_strategy_limits('long_bbands')" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'C'" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "sample_position=portfolio.strategies['long_bbands'].positions[0].position_data\n", - "sample_active=portfolio.strategies['long_bbands'].positions[0]\n", - "sample_option=sample_position.option_data['L'][0]\n", - "sample_option.option_type" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "from dataclasses import dataclass, field\n", - "from datetime import datetime\n", - "@dataclass(frozen=True)\n", - "class RiskAction:\n", - " date: str|datetime\n", - " action: RMAction\n", - " trade_id: str\n", - " strategy_slug: str\n", - "\n", - " def __repr__(self):\n", - " return f\"RiskAction(date={self.date}, action={self.action}, trade_id={self.trade_id}, strategy_slug={self.strategy_slug})\"\n", - "\n", - "@dataclass\n", - "class StrategyActions:\n", - " date: str|datetime\n", - " strategy_slug: str\n", - " actions: list[RiskAction] = field(default_factory=list)\n", - "\n", - " def add_action(self, action: RiskAction):\n", - " self.actions.append(action)\n", - "\n", - " def __repr__(self):\n", - " actionable = len([a for a in self.actions if type(a.action) != HOLD])\n", - " return f\"StrategyActions(date={self.date}, strategy_slug={self.strategy_slug}, new_actions={actionable})\"\n", - "\n", - "@dataclass\n", - "class PortfolioActions:\n", - " date: str|datetime\n", - " strategy_actions: dict[str, StrategyActions] = field(default_factory=dict)\n", - "\n", - " def add_strategy_action(self, strategy_action: StrategyActions):\n", - " self.strategy_actions[strategy_action.strategy_slug] = strategy_action\n", - "\n", - " def __repr__(self):\n", - " return f\"PortfolioActions(date={self.date}, strategies={list(self.strategy_actions.keys())})\"\n", - " \n", - "@dataclass\n", - "class PositionLimits:\n", - " \"\"\"\n", - " Dataclass to hold position limits information.\n", - " \"\"\"\n", - " delta: float = None\n", - " gamma: float = None\n", - " vega: float = None \n", - " theta: float = None\n", - " dte: int = None\n", - " moneyness: float = None\n", - " exercise: bool = False\n", - " \n" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "PositionLimits(delta=0.103044, gamma=nan, vega=nan, theta=nan, dte=120, moneyness=1.15, exercise=False)" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "def add_position_limits(position: ActivePosition) -> ActivePosition:\n", - "\n", - " for measure in MEASURES:\n", - " limit = get_position_limit(\n", - " trade_id=position.trade_id,\n", - " strategy_name=position.strategy_name,\n", - " signal_id=position.signal_id,\n", - " risk_measure=measure\n", - " )\n", - " setattr(position.limits, measure, limit)\n", - "\n", - " config = load_config(position.strategy_name)\n", - " max_moneyness = config['option_settings']['rm_settings']['max_moneyness']\n", - " dte_limit = config['option_settings']['portfolio_settings']['roll_map']\n", - " t_plus_n = config['option_settings']['portfolio_settings']['t_plus_n']\n", - " active_limits = config['option_settings']['rm_settings']['limits_enabled']\n", - "\n", - " ## DTE limit\n", - " position.limits.dte = dte_limit\n", - "\n", - " ## Moneyness limit\n", - " moneyness_limit = load_config(position.strategy_name)['option_settings']['rm_settings']['max_moneyness']\n", - " position.limits.moneyness = moneyness_limit\n", - "\n", - " ## Exercise limit\n", - " position.limits.exercise = 'exercise' in active_limits\n", - "\n", - " return position\n", - " \n", - "add_position_limits(sample_active).limits" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Analyzing position" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def dte_check(dte: int,\n", - " dte_threshold: int) -> bool:\n", - " \"\"\"Check if the position's days to expiration (DTE) is below a specified threshold.\n", - " Args:\n", - " dte (int): The days to expiration of the position.\n", - " dte_threshold (int): The threshold value for DTE.\n", - " Returns:\n", - " bool: True if the position's DTE is below the threshold, False otherwise.\n", - " \"\"\"\n", - " return dte < dte_threshold\n", - "\n", - "def exercise_check(dte: int,\n", - " t_plus_n: int) -> bool:\n", - " \"\"\"Check if the position is within a specified number of days to expiration (DTE).\n", - " Args:\n", - " position (EODPositionData): The position data containing DTE information.\n", - " t_plus_n (int): The number of days to expiration threshold.\n", - " Returns:\n", - " bool: True if the position's DTE is less than or equal to t_plus_n, False otherwise.\n", - " \"\"\" \n", - " dte = dte - t_plus_n\n", - " return dte <= 0\n", - "\n", - "def limits_check(position: EODPositionData,\n", - " limit_lib: dict) -> bool:\n", - " \"\"\"\n", - " Check if the position's price is within specified limits.\n", - " Args:\n", - " position (EODPositionData): The position data containing price information.\n", - " limit_lib (dict): A dictionary containing 'min_price' and 'max_price' keys.\n", - " Returns:\n", - " bool: True if the position's price is within the limits, False otherwise.\n", - " \"\"\"\n", - " pass\n", - "\n", - "def moneyness_check(\n", - " moneyness: list,\n", - " moneyness_threshold: float) -> bool:\n", - " \"\"\"Check if the position's moneyness is below a specified threshold.\n", - " Args:\n", - " moneyness (list): A list of moneyness values for the options in the position.\n", - " moneyness_threshold (float): The threshold value for moneyness.\n", - " Returns:\n", - " bool: True if the position's moneyness is below the threshold, False otherwise.\n", - " \"\"\"\n", - "\n", - "\n", - " return any(abs(m) > abs(moneyness_threshold) for m in moneyness)\n", - "\n", - "def greek_check(\n", - " greek_value: float,\n", - " greek_threshold: float,\n", - " qty: int = 1,\n", - " greater_than: bool = True) -> bool:\n", - " \"\"\"Check if the position's Greek value is above or below a specified threshold.\n", - " Args:\n", - " greek_value (float): The Greek value of the position (e.g., delta, gamma, vega, theta).\n", - " greek_threshold (float): The threshold value for the Greek.\n", - " greater_than (bool): If True, check if the absolute Greek value is greater than the threshold.\n", - " else, check if it is less than the threshold.\n", - " True is for upper limits, False is for lower limits.\n", - " Returns:\n", - " bool: True if the condition is met, False otherwise.\n", - " \"\"\"\n", - " if greater_than:\n", - " per_greek = greek_value / qty\n", - " _bool = abs(greek_value) > abs(greek_threshold)\n", - " required_qty = max(int(abs(greek_threshold) // abs(per_greek)), 1)\n", - " quantity_diff = abs(qty) - abs(required_qty)\n", - " return _bool, quantity_diff\n", - " else:\n", - " return abs(greek_value) < abs(greek_threshold)\n", - "\n", - "# moneyness_check(sample_position, 0.1)\n", - "# dte_check(sample_position, 10)" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "## Analyze Position\n", - "def analyze_position(\n", - " dte: int,\n", - " trade_id: str,\n", - " position_greek_limit: dict,\n", - " dte_limit: int, \n", - " moneyness_limit: float,\n", - " greeks: dict,\n", - " qty: int,\n", - " moneyness_list: list,\n", - " strategy_enabled_actions: StrategyLimitsEnabled,\n", - " t_plus_n: int,\n", - ") -> None:\n", - " \"\"\"\n", - " Analyzing position data for a given date.\n", - " \"\"\"\n", - " position_actions = []\n", - " ## DTE Check\n", - " if strategy_enabled_actions.dte:\n", - " if dte_check(dte, dte_limit):\n", - " action = ROLL(trade_id=trade_id)\n", - " action.reason = \"not enough DTE\"\n", - " position_actions.append(action)\n", - "\n", - " ## Exercise Check\n", - " if strategy_enabled_actions.exercise:\n", - " if exercise_check(dte, t_plus_n):\n", - " action = EXERCISE(trade_id=trade_id, action=dict())\n", - " action.reason = \"position is expiring\"\n", - " position_actions.append(action)\n", - " \n", - " ## Moneyness Check\n", - " if strategy_enabled_actions.moneyness:\n", - " if moneyness_check(moneyness_list, moneyness_limit):\n", - " action = ROLL(trade_id=trade_id, action=dict())\n", - " action.reason = \"position is too ITM\"\n", - " position_actions.append(action)\n", - "\n", - " ## Greek Checks\n", - " ## Loop through all greek measures\n", - " for greek in MEASURES:\n", - "\n", - " ## Skip if not enabled\n", - " if strategy_enabled_actions.__dict__[greek]:\n", - "\n", - " ## Skip if no limit set\n", - " if greek not in position_greek_limit:\n", - " continue\n", - " \n", - " ## Run greek check if limit is set\n", - " _greek_bool, q_diff = greek_check(greek_threshold=position_greek_limit[greek], \n", - " greek_value=greeks[greek], \n", - " greater_than=True,\n", - " qty=qty)\n", - " \n", - " ## Positive q_diff if qty is negative (short position is reduced by buying)\n", - " ## Negative q_diff if qty is positive (long position is reduced by selling)\n", - " q_diff = abs(q_diff) if qty < 0 else -abs(q_diff)\n", - " if _greek_bool: ## Only upper limits for now\n", - " action = ADJUST(trade_id=trade_id, action=dict(quantity_diff=q_diff))\n", - " action.reason = f\"position {greek} exceeds limit\"\n", - " position_actions.append(action)\n", - "\n", - " ## Finalize action\n", - " ## If no actions, HOLD\n", - " if not position_actions:\n", - " action = HOLD(trade_id=trade_id)\n", - " action.reason = \"position within limits\"\n", - " return action\n", - " \n", - " ## Else prioritize actions\n", - " ## Prioritize actions:\n", - " ## P1. EXERCISE\n", - " ## P2. ROLL\n", - " ## P3. ADJUST\n", - " else:\n", - " action_priority = {EXERCISE: 1, ROLL: 2, ADJUST: 3, HOLD: 4}\n", - " position_actions = sorted(position_actions, key=lambda x: action_priority[type(x)])\n", - " \n", - " ## If multiple adjust actions, keep only one with max abs quantity diff\n", - " if type(position_actions[0]) in [EXERCISE, ROLL]:\n", - " return position_actions[0]\n", - " elif type(position_actions[0]) == ADJUST:\n", - " adjust_actions = [act for act in position_actions if type(act) == ADJUST]\n", - " if len(adjust_actions) > 1:\n", - " adjust_actions = sorted(adjust_actions, key=lambda x: abs(x.action['quantity_diff']), reverse=True)\n", - " return adjust_actions[0]\n", - " \n" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Limit is NaN for trade_id=&L:AAPL20260417C265&S:AAPL20260417C270, strategy_name=long_bbands, signal_id=AAPL20250808LONG, risk_measure=gamma. Using infinity as limit.\n", - "Limit is NaN for trade_id=&L:AAPL20260417C265&S:AAPL20260417C270, strategy_name=long_bbands, signal_id=AAPL20250808LONG, risk_measure=vega. Using infinity as limit.\n", - "Limit is NaN for trade_id=&L:AAPL20260417C265&S:AAPL20260417C270, strategy_name=long_bbands, signal_id=AAPL20250808LONG, risk_measure=theta. Using infinity as limit.\n", - "Trade ID: &L:AAPL20260417C265&S:AAPL20260417C270, Action: ADJUST, Reason: position delta exceeds limit, Details: {'quantity_diff': -1}\n", - "Limit is NaN for trade_id=&L:AMD20260417C195&S:AMD20260417C200, strategy_name=long_bbands, signal_id=AMD20250701LONG, risk_measure=gamma. Using infinity as limit.\n", - "Limit is NaN for trade_id=&L:AMD20260417C195&S:AMD20260417C200, strategy_name=long_bbands, signal_id=AMD20250701LONG, risk_measure=vega. Using infinity as limit.\n", - "Limit is NaN for trade_id=&L:AMD20260417C195&S:AMD20260417C200, strategy_name=long_bbands, signal_id=AMD20250701LONG, risk_measure=theta. Using infinity as limit.\n", - "Trade ID: &L:AMD20260417C195&S:AMD20260417C200, Action: HOLD, Reason: position within limits, Details: hold\n", - "Limit is NaN for trade_id=&L:AMZN20260515C280&S:AMZN20260515C285, strategy_name=long_bbands, signal_id=AMZN20250701LONG, risk_measure=gamma. Using infinity as limit.\n", - "Limit is NaN for trade_id=&L:AMZN20260515C280&S:AMZN20260515C285, strategy_name=long_bbands, signal_id=AMZN20250701LONG, risk_measure=vega. Using infinity as limit.\n", - "Limit is NaN for trade_id=&L:AMZN20260515C280&S:AMZN20260515C285, strategy_name=long_bbands, signal_id=AMZN20250701LONG, risk_measure=theta. Using infinity as limit.\n", - "Trade ID: &L:AMZN20260515C280&S:AMZN20260515C285, Action: HOLD, Reason: position within limits, Details: hold\n", - "Limit is NaN for trade_id=&L:BA20260515C285&S:BA20260515C290, strategy_name=long_bbands, signal_id=BA20250701LONG, risk_measure=gamma. Using infinity as limit.\n", - "Limit is NaN for trade_id=&L:BA20260515C285&S:BA20260515C290, strategy_name=long_bbands, signal_id=BA20250701LONG, risk_measure=vega. Using infinity as limit.\n", - "Limit is NaN for trade_id=&L:BA20260515C285&S:BA20260515C290, strategy_name=long_bbands, signal_id=BA20250701LONG, risk_measure=theta. Using infinity as limit.\n", - "Trade ID: &L:BA20260515C285&S:BA20260515C290, Action: HOLD, Reason: position within limits, Details: hold\n", - "Limit is NaN for trade_id=&L:META20260417C990&S:META20260417C1000, strategy_name=long_bbands, signal_id=META20250701LONG, risk_measure=gamma. Using infinity as limit.\n", - "Limit is NaN for trade_id=&L:META20260417C990&S:META20260417C1000, strategy_name=long_bbands, signal_id=META20250701LONG, risk_measure=vega. Using infinity as limit.\n", - "Limit is NaN for trade_id=&L:META20260417C990&S:META20260417C1000, strategy_name=long_bbands, signal_id=META20250701LONG, risk_measure=theta. Using infinity as limit.\n", - "Trade ID: &L:META20260417C990&S:META20260417C1000, Action: HOLD, Reason: position within limits, Details: hold\n", - "Limit is NaN for trade_id=&L:NFLX20260618C1650&S:NFLX20260618C1660, strategy_name=long_bbands, signal_id=NFLX20250701LONG, risk_measure=gamma. Using infinity as limit.\n", - "Limit is NaN for trade_id=&L:NFLX20260618C1650&S:NFLX20260618C1660, strategy_name=long_bbands, signal_id=NFLX20250701LONG, risk_measure=vega. Using infinity as limit.\n", - "Limit is NaN for trade_id=&L:NFLX20260618C1650&S:NFLX20260618C1660, strategy_name=long_bbands, signal_id=NFLX20250701LONG, risk_measure=theta. Using infinity as limit.\n", - "Trade ID: &L:NFLX20260618C1650&S:NFLX20260618C1660, Action: HOLD, Reason: position within limits, Details: hold\n", - "Limit is NaN for trade_id=&L:NVDA20260618C235&S:NVDA20260618C240, strategy_name=long_bbands, signal_id=NVDA20250701LONG, risk_measure=gamma. Using infinity as limit.\n", - "Limit is NaN for trade_id=&L:NVDA20260618C235&S:NVDA20260618C240, strategy_name=long_bbands, signal_id=NVDA20250701LONG, risk_measure=vega. Using infinity as limit.\n", - "Limit is NaN for trade_id=&L:NVDA20260618C235&S:NVDA20260618C240, strategy_name=long_bbands, signal_id=NVDA20250701LONG, risk_measure=theta. Using infinity as limit.\n", - "Trade ID: &L:NVDA20260618C235&S:NVDA20260618C240, Action: HOLD, Reason: position within limits, Details: hold\n", - "No limit found for trade_id=&L:SBUX20260417C100&S:SBUX20260417C105, strategy_name=long_bbands, signal_id=SBUX20250701LONG, risk_measure=delta\n", - "No limit found for trade_id=&L:SBUX20260417C100&S:SBUX20260417C105, strategy_name=long_bbands, signal_id=SBUX20250701LONG, risk_measure=delta. Using infinity as limit.\n", - "No limit found for trade_id=&L:SBUX20260417C100&S:SBUX20260417C105, strategy_name=long_bbands, signal_id=SBUX20250701LONG, risk_measure=gamma\n", - "No limit found for trade_id=&L:SBUX20260417C100&S:SBUX20260417C105, strategy_name=long_bbands, signal_id=SBUX20250701LONG, risk_measure=gamma. Using infinity as limit.\n", - "No limit found for trade_id=&L:SBUX20260417C100&S:SBUX20260417C105, strategy_name=long_bbands, signal_id=SBUX20250701LONG, risk_measure=vega\n", - "No limit found for trade_id=&L:SBUX20260417C100&S:SBUX20260417C105, strategy_name=long_bbands, signal_id=SBUX20250701LONG, risk_measure=vega. Using infinity as limit.\n", - "No limit found for trade_id=&L:SBUX20260417C100&S:SBUX20260417C105, strategy_name=long_bbands, signal_id=SBUX20250701LONG, risk_measure=theta\n", - "No limit found for trade_id=&L:SBUX20260417C100&S:SBUX20260417C105, strategy_name=long_bbands, signal_id=SBUX20250701LONG, risk_measure=theta. Using infinity as limit.\n", - "Trade ID: &L:SBUX20260417C100&S:SBUX20260417C105, Action: HOLD, Reason: position within limits, Details: hold\n", - "Limit is NaN for trade_id=&L:TSLA20260417C445&S:TSLA20260417C450, strategy_name=long_bbands, signal_id=TSLA20250915LONG, risk_measure=gamma. Using infinity as limit.\n", - "Limit is NaN for trade_id=&L:TSLA20260417C445&S:TSLA20260417C450, strategy_name=long_bbands, signal_id=TSLA20250915LONG, risk_measure=vega. Using infinity as limit.\n", - "Limit is NaN for trade_id=&L:TSLA20260417C445&S:TSLA20260417C450, strategy_name=long_bbands, signal_id=TSLA20250915LONG, risk_measure=theta. Using infinity as limit.\n", - "Trade ID: &L:TSLA20260417C445&S:TSLA20260417C450, Action: HOLD, Reason: position within limits, Details: hold\n" - ] - } - ], - "source": [ - "\n", - "def analyze_portfolio_positions(portfolio: PortfolioPositions) -> dict:\n", - " \"\"\"\n", - " Analyzing portfolio positions for a given date.\n", - " \"\"\"\n", - " portfolio_actions = PortfolioActions(date=portfolio.date)\n", - " for strategy_slug, strategy in portfolio.strategies.items():\n", - " strategy_limits = load_config_strategy_limits(strategy_slug)\n", - " strategy_action = StrategyActions(date=portfolio.date, strategy_slug=strategy_slug)\n", - " for position in strategy.positions:\n", - " ## Calculate moneyness for all options in the position\n", - " options = [\n", - " x for opt_list in position.position_data.option_data.values() for x in opt_list\n", - " ]\n", - " moneyness = []\n", - "\n", - " for opt in options:\n", - " spot = opt.stock_data.last_price\n", - " moneyness.append(float(opt.strike/spot if opt.option_type.upper() == 'P' else spot/opt.strike))\n", - " position_greek_limits = dict()\n", - " \n", - " ## Get position limits from database\n", - " for greek in MEASURES:\n", - " limit = get_position_limit(\n", - " trade_id=position.trade_id,\n", - " strategy_name=strategy_slug,\n", - " signal_id=position.signal_id,\n", - " risk_measure=greek\n", - " )\n", - "\n", - " ## If limit is None: Alert and continue\n", - " if limit is None:\n", - " print(f\"No limit found for trade_id={position.trade_id}, strategy_name={strategy_slug}, signal_id={position.signal_id}, risk_measure={greek}. Using infinity as limit.\")\n", - " continue\n", - " ## If limit is NaN: Alert and continue\n", - " elif pd.isna(limit) or limit is None or np.isinf(limit):\n", - " print(f\"Limit is NaN for trade_id={position.trade_id}, strategy_name={strategy_slug}, signal_id={position.signal_id}, risk_measure={greek}. Using infinity as limit.\")\n", - " continue\n", - " ## \n", - " position_greek_limits[greek] = limit\n", - " \n", - " ## Get greeks from position\n", - " greeks = dict(\n", - " delta=position.position_data.greeks.binomial_delta,\n", - " gamma=position.position_data.greeks.binomial_gamma,\n", - " vega=position.position_data.greeks.binomial_vega,\n", - " theta=position.position_data.greeks.binomial_theta\n", - " )\n", - " \n", - " ## Get other limits from config\n", - " max_moneyness = load_config(strategy_slug)['option_settings']['rm_settings']['max_moneyness']\n", - " dte_limit = load_config(strategy_slug)['option_settings']['portfolio_settings']['roll_map']\n", - " t_plus_n = load_config(strategy_slug)['option_settings']['portfolio_settings']['t_plus_n']\n", - "\n", - " ## Analyze position\n", - " action = analyze_position(\n", - " dte=position.position_data.dte,\n", - " trade_id=position.trade_id,\n", - " position_greek_limit=position_greek_limits,\n", - " dte_limit=dte_limit,\n", - " moneyness_limit=max_moneyness,\n", - " greeks=greeks,\n", - " qty=position.quantity,\n", - " strategy_enabled_actions=strategy_limits,\n", - " moneyness_list=moneyness,\n", - " t_plus_n=t_plus_n,\n", - " )\n", - " strategy_action.add_action(RiskAction(date=portfolio.date, \n", - " action=action, \n", - " trade_id=position.trade_id, \n", - " strategy_slug=strategy_slug))\n", - " \n", - " print(f\"Trade ID: {position.trade_id}, Action: {type(action).__name__}, Reason: {action.reason}, Details: {getattr(action, 'action', None)}\")\n", - " portfolio_actions.add_strategy_action(strategy_action)\n", - " # Store or process the action as needed\n", - " return portfolio_actions\n", - " \n", - "portfolio_actions = analyze_portfolio_positions(portfolio)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## To-Do:\n", - "\n", - "- Store limits\n", - "- Create return dataset for actions\n", - "- Create limits data class, add to load_positions_data\n", - "\n", - "\n", - "## Tomorrow:\n", - "- Move limits to py file\n", - "- Add limits dataclass to load_positions_data\n", - "- bool to load_scenarios data.\n", - "- gradually breakdown create order\n", - "- Add StrategyLimitsEnabled to Strategy class" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "120" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# StrategyLimitsEnabled()\n", - "strategy_slug = 'long_bbands'\n", - "load_config(strategy_slug)['option_settings']['portfolio_settings']['roll_map']" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "openbb_new_use", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.13" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} \ No newline at end of file diff --git a/EventDriven/riskmanager/picker/__init__.py b/EventDriven/riskmanager/picker/__init__.py index 8230f88..245761d 100644 --- a/EventDriven/riskmanager/picker/__init__.py +++ b/EventDriven/riskmanager/picker/__init__.py @@ -96,12 +96,10 @@ ## NOTE: Remember this was previously a file. TO switch btwn old_picker & new_picker. Copy and paste for now import pandas as pd -import numpy as np from dataclasses import dataclass -from typing import Any, Dict -from EventDriven.types import ResultsEnum +from typing import Any, Dict, List, Tuple +from EventDriven.types import ResultsEnum, TradeID from trade.helpers.Logging import setup_logger -from EventDriven.configs.core import ChainConfig logger = setup_logger("EventDriven.riskmanager.picker", stream_log_level="WARNING") # order_cache = CustomCache(BASE, fname="order") @@ -127,8 +125,8 @@ def __post_init__(self): if key not in self.data: raise ValueError(f"Missing required field: {key}") - if self.data["strategy"] == "vertical" and not ("spread_pct" in self.data or "spread_ticks" in self.data): - raise ValueError("Vertical strategies require either 'spread_pct' or 'spread_ticks'") + if self.data["strategy"] == "vertical" and "spread_ticks" not in self.data: + raise ValueError("Vertical strategies require 'spread_ticks'") optional = { "min_moneyness": 0.9, @@ -158,14 +156,6 @@ def get(self, key, default=None): return self.data.get(key, default) -# --------- Utilities --------- -def resolve_ordering(option_type, structure_direction): - if structure_direction == "long": - return (True, ("long", "short")) if option_type.lower() == "c" else (False, ("long", "short")) - else: - return (False, ("short", "long")) if option_type.lower() == "p" else (True, ("short", "long")) - - def filter_contracts( df: pd.DataFrame, schema: OrderSchema, @@ -174,11 +164,18 @@ def filter_contracts( max_moneyness: float = 1.5, increment=0.25, ) -> pd.DataFrame: + df = df.copy() + df = df[df["right"].str.lower() == schema["option_type"].lower()] + + ## Calculate Moneyness + if schema["option_type"].lower() == "c": + df["moneyness"] = spot / df["strike"] + else: + df["moneyness"] = df["strike"] / spot target_dte = schema["target_dte"] dte_tol = schema["dte_tolerance"] filtered = pd.DataFrame() attempt = 0 - factor = 1 max_attempts = schema.get("max_attempts", 3) min_moneyness = schema.get("min_moneyness", min_moneyness) max_moneyness = schema.get("max_moneyness", max_moneyness) @@ -192,13 +189,16 @@ def filter_contracts( ## Add DTE filter _filter &= df["dte"].between(target_dte - dte_tol, target_dte + dte_tol) - ## Add Moneyness filter - lower_strike = spot * (min(min_moneyness, max_moneyness) * factor) - upper_strike = spot * (max(min_moneyness, max_moneyness) * factor) + ## Add Moneyness filter. Convert to bounds based on increment + logger.info( - f"Filtering contracts with strike range [{lower_strike:.2f}, {upper_strike:.2f}] on attempt {attempt + 1}" + f"Filtering contracts with strike range [{min_moneyness:.2f}, {max_moneyness:.2f}] on attempt {attempt + 1}" ) - _filter &= df["strike"].between(lower_strike, upper_strike) + _filter &= df["moneyness"].between(min_moneyness, max_moneyness) + + ## Update moneyness bounds for next attempt + min_moneyness *= 1 - increment + max_moneyness *= 1 + increment ## Add Open Interest filter if specified if min_oi is not None: @@ -213,206 +213,24 @@ def filter_contracts( filtered = df[_filter].copy() logger.info(f"Number of contracts after filtering: {len(filtered)}") attempt += 1 - factor *= 1 + increment # Increase the range by a factor of (1 + increment) each attempt if filtered.empty: logger.critical( - f"Failed to filter contracts: No contracts found for {schema['option_type']} with DTE {target_dte} ± {dte_tol} and strike range [{lower_strike:.2f}, {upper_strike:.2f}] after {attempt} attempts." + f"Failed to filter contracts: No contracts found for {schema['option_type']} with DTE {target_dte} ± {dte_tol} and strike range [{min_moneyness:.2f}, {max_moneyness:.2f}] after {attempt} attempts." ) return filtered.reset_index(drop=True) -def build_spread_by_ticks(df, schema, cache): - df = df[df["right"].str.lower() == schema["option_type"].lower()].copy() - try: - df["mid"] = df["chain_id"].map(cache) - except Exception as e: - logger.error(f"Error mapping chain_id to mid prices in cache: {e}") - df["mid"] = df["midpoint"] - df = df.dropna(subset=["mid"]) - ascending, _ = resolve_ordering(schema["option_type"], schema["structure_direction"]) - - spreads = [] - for _, group in df.groupby("expiration"): - group = group.sort_values("strike", ascending=ascending).reset_index(drop=True) - for i in range(len(group) - schema["spread_ticks"]): - leg1, leg2 = group.iloc[i], group.iloc[i + schema["spread_ticks"]] - long, short = (leg1, leg2) - spread_price = long["mid"] - short["mid"] - try: - spread_bid = long["closebid"] - short["closeask"] - spread_ask = long["closeask"] - short["closebid"] - spread_pct_ratio = abs(spread_bid - spread_ask) / abs(spread_bid + spread_ask) / 2 - long_oi = long.get("open_interest", np.nan) - short_oi = short.get("open_interest", np.nan) - spread_oi = abs(long_oi) + abs(short_oi) - except Exception as e: ## Error handling for missing bid/ask data - logger.debug(f"Missing bid/ask or error computing spreads: {e}") - spread_bid = 0.0 - spread_ask = 0.0 - spread_pct_ratio = 0.0 - long_oi = 0.0 - short_oi = 0.0 - spread_oi = 0.0 - - if abs(spread_price) <= schema["max_total_price"] and abs(spread_price) >= schema["min_total_price"]: - spreads.append( - { - "long": long, - "short": short, - "spread_price": spread_price, - "width": abs(short["strike"] - long["strike"]), - "dte": int(long["dte"]), - "expiration": long["expiration"], - "option_type": schema["option_type"], - "type": "vertical", - "legs": [long, short], - "spread_pct_ratio": spread_pct_ratio, - "spread_bid": spread_bid, - "spread_ask": spread_ask, - "long_bid": long.get("closebid", np.nan), - "long_ask": long.get("closeask", np.nan), - "short_bid": short.get("closebid", np.nan), - "short_ask": short.get("closeask", np.nan), - "long_pct_spread": long.get("pct_spread", np.nan), - "short_pct_spread": short.get("pct_spread", np.nan), - "spread_mid": (spread_bid + spread_ask) / 2 if (spread_bid + spread_ask) != 0 else np.nan, - "long_oi": long_oi, - "short_oi": short_oi, - "spread_oi": spread_oi, - } - ) - if len(spreads) == 0: - ## Priortize: - ## 1. Structure Spread Ratio (Bid-Ask)/Mid - ## 2. Largest Spread Open Interest (Bid + Ask) - ## 3. Lowest Spread Price - logger.critical( - f"Failed to find spreads: for {schema['option_type']} with DTE {schema['target_dte']} ± {schema['dte_tolerance']} and ticks {schema['spread_ticks']}." - ) - return [] - if schema["structure_direction"] == "long": - pick = min( - (s for s in spreads if s["spread_price"] > 0), - key=lambda s: (s["spread_pct_ratio"], -s["spread_oi"], s["spread_price"]), - default=None, - ) - else: - pick = min( - (s for s in spreads if s["spread_price"] < 0), - key=lambda s: (s["spread_pct_ratio"], -s["spread_oi"], s["spread_price"]), - default=None, - ) - - return [pick] if pick else [] - - -def build_spread_by_pct(df, schema, spot, cache): - df = df[df["right"].str.lower() == schema["option_type"].lower()].copy() - df["mid"] = df["chain_id"].map(cache) - df = df.dropna(subset=["mid"]) - ascending, _ = resolve_ordering(schema["option_type"], schema["structure_direction"]) - spreads = [] - for _, group in df.groupby("expiration"): - group = group.sort_values("strike", ascending=ascending).reset_index(drop=True) - for i in range(len(group)): - leg1 = group.iloc[i] - target_strike = leg1["strike"] + ( - spot * schema["spread_pct"] if ascending else -spot * schema["spread_pct"] - ) - group_slice = group.iloc[i + 1 :] # only look ahead to maintain spread structure - if group_slice.empty: - continue - - leg2_idx = (group_slice["strike"] - target_strike).abs().idxmin() - leg2 = group.loc[leg2_idx] - error = (leg2["strike"] - target_strike) ** 2 - - ## Controlling distance apart. Avoiding spreads that are too wide or too narrow. - actual_width = abs(leg2["strike"] - leg1["strike"]) - min_width = spot * schema["spread_pct"] * 0.10 - max_error = (spot * schema["spread_pct"] * 1.5) ** 2 - - if actual_width < min_width or error > max_error: - logger.info( - f"Skipping spread due to width or error: {actual_width:.2f} < {min_width:.2f} or error {error:.2f} > {max_error:.2f}" - ) - print( - f"Skipping spread due to width or error: {actual_width:.2f} < {min_width:.2f} or error {error:.2f}" - ) - continue - - long, short = (leg1, leg2) - spread_price = long["mid"] - short["mid"] - - if abs(spread_price) <= schema["max_total_price"]: - spreads.append( - { - "long": long, - "short": short, - "spread_price": spread_price, - "width": abs(short["strike"] - long["strike"]), - "dte": int(long["dte"]), - "expiration": long["expiration"], - "option_type": schema["option_type"], - "type": "vertical", - "legs": [long, short], - } - ) - if schema["structure_direction"] == "long": - pick = min( - (s for s in spreads if s["spread_price"] > 0), - key=lambda s: s["spread_price"], - default=None, - ) - else: - pick = min( - (s for s in spreads if s["spread_price"] < 0), - key=lambda s: s["spread_price"], - default=None, - ) - return [pick] if pick else [] - - -def build_vertical_spread(df, schema, spot, cache): - df = filter_contracts(df, schema, spot) - return ( - build_spread_by_ticks(df, schema, cache) - if "spread_ticks" in schema - else build_spread_by_pct(df, schema, spot, cache) - ) - - -def build_naked_option(df, schema, spot, cache): - df = filter_contracts(df, schema, spot) - df = df[df["right"].str.lower() == schema["option_type"].lower()].copy() - df["mid"] = df["chain_id"].map(cache) - df = df.dropna(subset=["mid"]) - df = df[df["mid"] <= schema["max_total_price"]] - df = df.sort_values("mid", ascending=(schema["structure_direction"] == "long")) - pick = df.iloc[0] if not df.empty else None - return [{schema["structure_direction"]: pick}] if pick is not None else [] - - -STRATEGY_MAP = { - "vertical": build_vertical_spread, - "naked": build_naked_option, -} - - -def build_strategy( - df, - schema: OrderSchema, - spot: float, - cache: Dict[str, float], - chain_cfg: ChainConfig = None, -): - if schema["strategy"] not in STRATEGY_MAP: - raise ValueError(f"Unsupported strategy: {schema['strategy']}") - builder = STRATEGY_MAP.get(schema["strategy"]) - return builder(df, schema, spot, cache) if builder else [] +def create_trade_id(legs: Dict[str, Any]) -> str: + """ + Creates a unique trade identifier based on the legs of the option structure. + Expected input format for legs: + legs = { + "long": [ { "opttick": "AAPL230616C00150000", ... }, ... ], + "short": [ { "opttick": "AAPL230616P00150000", ... }, ... ] + } + """ -def create_trade_id(legs: Dict[str, Any]) -> str: def _iter_side(side): if side is None: return [] @@ -425,9 +243,13 @@ def _iter_side(side): raise TypeError(f"legs['long'/'short'] must be dict or list[dict]. Recieved {type(side)}") parts = [] - for leg in _iter_side(legs.get("long")): + long = legs.get("long") + short = legs.get("short") + long = sorted(_iter_side(long), key=lambda x: x["opttick"]) + short = sorted(_iter_side(short), key=lambda x: x["opttick"]) + for leg in long: parts.append(f"&L:{leg['opttick']}") - for leg in _iter_side(legs.get("short")): + for leg in short: parts.append(f"&S:{leg['opttick']}") return "".join(parts) @@ -459,3 +281,32 @@ def extract_order(obj): order["data"]["close"] += mid if direction == "long" else -mid order["data"]["trade_id"] = create_trade_id(pack) return order + + +def _order_formatting( + trade_id: str, + legs: List[Tuple[str, str]], + close: float, + dir: str, +) -> Dict[str, Any]: + """ + Formats the order details into a structured dictionary. + + Args: + trade_id (str): Unique identifier for the trade. + legs (List[Tuple[str, str]]): A list of tuples containing the long and short leg option ticks. Eg: [('L', "AAPL230616C00150000"), ('S', "AAPL230616P00150000")] + close (float): The closing price of the order. + """ + assert dir in ("long", "short"), "Direction must be 'long' or 'short'" + order = {} + order["trade_id"] = TradeID(trade_id) + order["close"] = close + for direction, opttick in legs: + if direction.upper() == "L": + order.setdefault("long", []).append(opttick) + elif direction.upper() == "S": + order.setdefault("short", []).append(opttick) + else: + raise ValueError(f"Invalid leg direction: {direction}. Must be 'L' or 'S'.") + order["quantity"] = 1 if dir[0].lower() == "l" else -1 + return order diff --git a/EventDriven/riskmanager/picker/builder.py b/EventDriven/riskmanager/picker/builder.py new file mode 100644 index 0000000..e4960ad --- /dev/null +++ b/EventDriven/riskmanager/picker/builder.py @@ -0,0 +1,80 @@ +from .vertical_spread import vertical_spread_order_builder +from .naked_option import naked_option_order_builder +from ...types import ResultsEnum, OrderData +from trade.helpers.helper import parse_option_tick +from EventDriven.riskmanager.picker import filter_contracts, OrderSchema +import pandas as pd + +BUILDER_FACTORY = { + "vertical": vertical_spread_order_builder, + "naked": naked_option_order_builder, +} + + +def validate_order(order: dict) -> bool: + """ + Validates the order dictionary structure and contents. + Raises ValueError if validation fails. + """ + assert "result" in order, "Order must have a 'result' key." + assert order["result"] in [e.value for e in ResultsEnum], f"Invalid result value: {order['result']}." + if order["result"] == ResultsEnum.SUCCESSFUL.value: + assert "data" in order, "Successful order must have 'data' key." + data = order["data"] + assert "trade_id" in data, "Order data must have 'trade_id'." + assert "close" in data, "Order data must have 'close' price." + assert "long" in data or "short" in data, "Order data must have at least 'long' or 'short' legs." + if "long" in data: + for leg in data["long"]: + assert isinstance(leg, str), "Each long leg must be a string." + try: + parse_option_tick(leg) + except Exception as e: + raise ValueError(f"Invalid long leg opttick: {leg}. Error: {e}") from e + if "short" in data: + for leg in data["short"]: + assert isinstance(leg, str), "Each short leg must be a string." + try: + parse_option_tick(leg) + except Exception as e: + raise ValueError(f"Invalid short leg opttick: {leg}. Error: {e}") from e + return True + +def order_builder( + unfiltered_chain: pd.DataFrame, + schema: OrderSchema, + spot: float, +) -> OrderData: + """ + Build an order based on the unfiltered option chain and the provided schema. + Args: + unfiltered_chain (pd.DataFrame): The unfiltered option chain DataFrame. + schema (OrderSchema): The order schema containing parameters for building the order. + Returns: + OrderData: Detailed trade execution data including positions and pricing. + """ + # Step 1: Filter contracts based on schema + filtered_chain = filter_contracts( + df=unfiltered_chain, + schema=schema, + spot=spot, + ) + + # Step 2: Build order using the appropriate builder function + structure_type = schema.get("strategy") + if structure_type not in BUILDER_FACTORY: + raise ValueError(f"Unsupported structure type: {structure_type}. Supported types are: {list(BUILDER_FACTORY.keys())}") + + builder_function = BUILDER_FACTORY[structure_type] + order = builder_function( + filtered_chain=filtered_chain, + schema=schema, + ) + + # Step 3: Validate the constructed order + try: + validate_order(order) + except AssertionError as e: + raise ValueError(f"Order validation failed: {e}") from e + + return order \ No newline at end of file diff --git a/EventDriven/riskmanager/picker/naked_option.py b/EventDriven/riskmanager/picker/naked_option.py new file mode 100644 index 0000000..e8b7829 --- /dev/null +++ b/EventDriven/riskmanager/picker/naked_option.py @@ -0,0 +1,171 @@ +import numpy as np +import pandas as pd +from EventDriven.riskmanager.picker import _order_formatting, create_trade_id +from EventDriven.types import ResultsEnum, OrderDict +from EventDriven.riskmanager.picker import OrderSchema + + + +def naked_option_by_exp( + row: pd.Series, + min_total_price: float = 0.5, + max_total_price: float = 1.0, +) -> pd.DataFrame: + """ + For a given row (option contract), find the corresponding leg of the naked option based on the spread_tick. + Calculate spread metrics such as spread mid, spread bid, spread ask, bid-ask spread, spread percentage ratio, and combined open interest. + Filter the resulting paired DataFrame based on the total spread mid price being within the specified min + and max total price range. + Args: + row (pd.Series): A row from the sorted_chain DataFrame representing an option contract. + spread_tick (int): The number of ticks between the legs of the spread. + min_total_price (float): Minimum total price of the spread to filter the results. + max_total_price (float): Maximum total price of the spread to filter the results. + Returns: + pd.DataFrame: A DataFrame containing the paired legs of the vertical spread and their calculated metrics, filtered by the total spread mid price. + """ + tgt_details = ["opttick", "midpoint", "closebid", "closeask", "open_interest"] + long_leg_details = row[tgt_details].reset_index(drop=True) + + ## Produce relevant spread information. + spread_bid = long_leg_details["closebid"] + spread_ask = long_leg_details["closeask"] + spread_mid = long_leg_details["midpoint"] + bid_ask_spread = spread_ask - spread_bid + spread_pct_ratio = abs(spread_bid - spread_ask) / spread_mid.replace(0, np.nan) # Avoid division by zero. + spread_oi = abs(long_leg_details["open_interest"]) + + ## Combine into a DataFrame for analysis. + paired_opttick = pd.concat( + (long_leg_details["opttick"], spread_mid, spread_bid, spread_ask, bid_ask_spread, spread_pct_ratio, spread_oi), + axis=1, + ) + paired_opttick.columns = [ + "long_leg_opttick", + "spread_mid", + "spread_bid", + "spread_ask", + "bid_ask_spread", + "spread_pct_ratio", + "spread_oi", + ] + return paired_opttick[paired_opttick["spread_mid"].between(min_total_price, max_total_price)].reset_index(drop=True) + + +def _naked_option_finder( + filtered_chain: pd.DataFrame, + schema: OrderSchema, +) -> pd.DataFrame: + """ + For a given filtered option chain, find the best option contract based on the spread_tick. + Args: + filtered_chain (pd.DataFrame): The filtered option chain DataFrame. + schema (OrderSchema): The order schema containing parameters for building the naked option. + Returns: + pd.DataFrame: A Series containing the picked naked option contract details. + """ + + # Start by ordering by strike, from ITM to OTM. + # For calls, ITM is lower strike, for puts, ITM is higher strike. + + is_call = schema["option_type"].lower() == "c" + sorted_chain = filtered_chain.sort_values( + by="strike", + ascending=is_call, # Calls: Ascending (lower strike = ITM). Puts: Descending (higher strike = ITM). + ).reset_index(drop=True) + + naked_option_chain = ( + sorted_chain.groupby("expiration") + .apply( + naked_option_by_exp, + min_total_price=schema["min_total_price"], + max_total_price=schema["max_total_price"], + ) + .reset_index(level=1, drop=True) + .sort_index() + ) + + ## Now we have our naked option chain with spread metrics for analysis. + ## We pick the option we want based on specific criteria. We sort based on (this is by priority): + ## 1. spread_pct_ratio (we want this to be low, meaning the spread is relatively tight compared to its midpoint) + ## 2. spread_oi (we want this to be high, meaning there's good liquidity in the spread) + ## Finally, pick the top row as our chosen spread. + naked_option_chain.sort_values(by=["spread_pct_ratio", "spread_oi"], ascending=[True, False], inplace=True) + picked_spread = naked_option_chain.iloc[0] if not naked_option_chain.empty else pd.Series() + + return picked_spread + + +def _extract_order_for_naked_option( + picked_spread: pd.Series, + schema: OrderSchema, +) -> OrderDict: + """ + Extract order details for a naked option based on the picked spread and the provided schema. + Args: + picked_spread (pd.Series): A Series containing the details of the picked naked option contract. + schema (OrderSchema): The order schema containing parameters for building the naked option. + Returns: + OrderDict: A dictionary containing the result status and order data. + """ + ## Extract order + is_long = schema["structure_direction"].upper() == "LONG" + if not picked_spread.empty: + ## Determine leg info for order formatting + long = [{"opttick": picked_spread["long_leg_opttick"]}] if is_long else [] + short = [{"opttick": picked_spread["short_leg_opttick"]}] if not is_long else [] + + ## Determine leg info for order formatting + leg_info = [] + if is_long: + leg_info.append(("L", picked_spread["long_leg_opttick"])) + else: + leg_info.append(("S", picked_spread["long_leg_opttick"])) + + ## Other details from spread + pct_ratio = picked_spread["spread_pct_ratio"] + spread_oi = picked_spread["spread_oi"] + + close_price = picked_spread["spread_mid"] + trade_id = create_trade_id( + legs={ + "long": long, + "short": short, + } + ) + data = _order_formatting(trade_id=trade_id, legs=leg_info, close=close_price, dir=schema["structure_direction"]) + order = { + "result": ResultsEnum.SUCCESSFUL.value, + "data": data, + "metrics": { + "spread_pct_ratio": pct_ratio, + "spread_oi": spread_oi, + }, + } + else: + order = { + "result": ResultsEnum.UNSUCCESSFUL.value, + "data": None, + } + + return order + + +def naked_option_order_builder( + filtered_chain: pd.DataFrame, + schema: OrderSchema, +) -> OrderDict: + """ + Build a vertical spread order based on the filtered option chain and the provided schema. + Args: + filtered_chain (pd.DataFrame): The filtered option chain DataFrame. + schema (OrderSchema): The order schema containing parameters for building the vertical spread. + Returns: + OrderDict: A dictionary containing the result status and order data. + """ + picked_spread = _naked_option_finder( + filtered_chain=filtered_chain, + schema=schema, + ) + order = _extract_order_for_naked_option(picked_spread, schema=schema) + return order \ No newline at end of file diff --git a/EventDriven/riskmanager/picker/order_picker.py b/EventDriven/riskmanager/picker/order_picker.py index 3dbe66f..2e41fc8 100644 --- a/EventDriven/riskmanager/picker/order_picker.py +++ b/EventDriven/riskmanager/picker/order_picker.py @@ -184,21 +184,24 @@ from EventDriven.riskmanager._order_validator import OrderInputs from ..utils import ( LOOKBACKS, - get_cache, populate_cache_with_chain, precompute_lookbacks, ) from EventDriven.configs.core import ChainConfig, OrderSchemaConfigs, OrderPickerConfig, OrderResolutionConfig +from EventDriven.types import ResultsEnum from ..utils import ( - dynamic_memoize, + dynamic_memoize, # noqa + parse_position_id ) +from .builder import order_builder from trade.helpers.Logging import setup_logger from trade.helpers.decorators import timeit -from EventDriven.riskmanager.picker import OrderSchema, build_strategy, extract_order +from EventDriven.riskmanager.picker import OrderSchema, _order_formatting from EventDriven.dataclasses.orders import OrderRequest from EventDriven.riskmanager._orders import order_resolve_loop, order_failed from EventDriven.types import Order +import numpy as np logger = setup_logger("EventDriven.riskmanager.picker.order_picker") @@ -224,12 +227,59 @@ def __init__(self, start_date: str | datetime, end_date: str | datetime): self._order_schema_config = OrderSchemaConfigs() self._order_resolution_config = OrderResolutionConfig() + ## Others + self.preset_orders = {} + def __repr__(self): return f"OrderPicker(start_date={self.start_date}, end_date={self.end_date})" @property def lookback(self): return self.__lookback + + def register_preset_order(self, + signal_id: str, + trade_id: str, + date: str | datetime, + close_price: float = np.nan): + + """ + Register a preset order to be used instead of generating a new one. + This is useful for backtesting scenarios where specific orders need to be enforced. + """ + self.preset_orders[signal_id] = { + "trade_id": trade_id, + "date": pd.to_datetime(date, format="%Y-%m-%d").date(), + "close_price": close_price + } + + def clear_preset_orders(self): + """ + Clear all registered preset orders. + """ + self.preset_orders = {} + + def get_preset_order(self, signal_id: str, date: str | datetime) -> dict: + """ + Check if a preset order exists for the given signal_id and date + If it exists, return the preset order details; otherwise, return an empty dictionary. + It we will format the order as expected by the rest of the system. + """ + preset_order = self.preset_orders.get(signal_id, None) + if preset_order and preset_order["date"] == pd.to_datetime(date, format="%Y-%m-%d").date(): + _, legs = parse_position_id(preset_order["trade_id"]) + data = _order_formatting( + trade_id=preset_order["trade_id"], + legs=legs, + close=preset_order["close_price"] + ) + return { + "result": ResultsEnum.SUCCESSFUL.value, + "data": data, + "map_signal_id": signal_id, + "signal_id": signal_id, + } + return {} def get_order_schema(self, ticker: str, option_type: str = "P", max_total_price: float = None) -> OrderSchema: """ @@ -273,7 +323,7 @@ def get_order_new( chain_spot = spot return self._get_order(schema, date, spot, chain_spot, print_url=print_url) - @dynamic_memoize + # @dynamic_memoize def _get_order( self, schema: tuple, @@ -285,34 +335,36 @@ def _get_order( """ Get the order for the given schema, date, and spot price. """ + assert isinstance(schema, tuple), "Schema must be a tuple of items." schema = OrderSchema(dict(schema)) - if schema["option_type"].lower() == "c": ## This ensures that both call and put OTM are < 1.0 and ITM are > 1.0 - logger.info( - f"Call Option Detected, Pre-Adjustment Moneyness: {schema['min_moneyness']} - {schema['max_moneyness']}" - ) - min_m, max_m = 2 - schema["min_moneyness"], 2 - schema["max_moneyness"] - schema["min_moneyness"] = min(min_m, max_m) ## For Calls, we want the min moneyness to be 2 - min_moneyness - schema["max_moneyness"] = max(min_m, max_m) - logger.info( - f"Call Option Detected, Adjusting Moneyness: {schema['min_moneyness']} - {schema['max_moneyness']}" - ) - elif ( - schema["option_type"].lower() == "p" - ): ## This ensures that both call and put OTM are < 1.0 and ITM are > 1.0 - logger.info( - f"Put Option Detected, Pre-Adjustment Moneyness: {schema['min_moneyness']} - {schema['max_moneyness']}" - ) - else: - raise ValueError(f"Invalid option type: {schema['option_type']}. Must be 'c' or 'p'.") + # if schema["option_type"].lower() == "c": ## This ensures that both call and put OTM are < 1.0 and ITM are > 1.0 + # logger.info( + # f"Call Option Detected, Pre-Adjustment Moneyness: {schema['min_moneyness']} - {schema['max_moneyness']}" + # ) + # min_m, max_m = 2 - schema["min_moneyness"], 2 - schema["max_moneyness"] + # schema["min_moneyness"] = min(min_m, max_m) ## For Calls, we want the min moneyness to be 2 - min_moneyness + # schema["max_moneyness"] = max(min_m, max_m) + # logger.info( + # f"Call Option Detected, Adjusting Moneyness: {schema['min_moneyness']} - {schema['max_moneyness']}" + # ) + # elif ( + # schema["option_type"].lower() == "p" + # ): ## This ensures that both call and put OTM are < 1.0 and ITM are > 1.0 + # logger.info( + # f"Put Option Detected, Pre-Adjustment Moneyness: {schema['min_moneyness']} - {schema['max_moneyness']}" + # ) + # else: + # raise ValueError(f"Invalid option type: {schema['option_type']}. Must be 'c' or 'p'.") chain = populate_cache_with_chain(schema["tick"], date, chain_spot, print_url=print_url) - cache = get_cache("spot") - cache = {k: v for k, v in cache.items()} + # cache = get_cache("spot") + # cache = {k: v for k, v in cache.items()} - raw_order = build_strategy(chain, schema, chain_spot, cache) - return extract_order(raw_order) + # raw_order = build_strategy(chain, schema, chain_spot, cache) + # return extract_order(raw_order) + return order_builder(unfiltered_chain=chain, schema=schema, spot=chain_spot) @timeit def get_order(self, request: OrderRequest) -> Order: @@ -342,6 +394,7 @@ def construct_inputs( order_resolution_config = self._order_resolution_config if request.max_close > request.tick_cash/100: ## Tick cash is scaled + logger.warning( f"Request max_close {request.max_close} is greater than tick_cash {request.tick_cash}. Adjusting max_close to tick_cash." ) @@ -385,32 +438,38 @@ def _get_open_order_backtest( returns: Order: The resolved order object. """ - schema = picker.get_order_schema( - ticker=request.symbol, option_type=request.option_type, max_total_price=request.max_close - ) - schema_as_tuple = tuple(schema.data.items()) - order = picker._get_order( - schema=schema_as_tuple, date=request.date, spot=request.spot, chain_spot=request.chain_spot, print_url=False - ) - - ## Resolve order if failed and resolution is enabled - if picker._order_resolution_config.resolve_enabled: - order = order_resolve_loop( - order=order, - schema=schema, - date=inputs.date, - spot=inputs.spot, - max_close=inputs.tick_cash / 100, ## Use tick cash to determine max close. Normalize to 100 contracts - max_dte_tolerance=inputs.max_dte_tolerance, - max_tries=inputs.max_tries, - otm_moneyness_width=inputs.otm_moneyness_width, - itm_moneyness_width=inputs.itm_moneyness_width, - logger=logger, - signalID=inputs.signal_id, - schema_cache={}, - picker=picker, + order = picker.get_preset_order(signal_id=inputs.signal_id, date=inputs.date) + if not order: + logger.info(f"No preset order found for signal_id {inputs.signal_id} on date {inputs.date}. Generating new order.") + schema = picker.get_order_schema( + ticker=request.symbol, option_type=request.option_type, max_total_price=request.max_close + ) + schema_as_tuple = tuple(schema.data.items()) + order = picker._get_order( + schema=schema_as_tuple, date=request.date, spot=request.spot, chain_spot=request.chain_spot, print_url=False ) + ## Resolve order if failed and resolution is enabled + if picker._order_resolution_config.resolve_enabled: + order = order_resolve_loop( + order=order, + schema=schema, + date=inputs.date, + spot=inputs.spot, + max_close=inputs.tick_cash / 100, ## Use tick cash to determine max close. Normalize to 100 contracts + max_dte_tolerance=inputs.max_dte_tolerance, + max_tries=inputs.max_tries, + otm_moneyness_width=inputs.otm_moneyness_width, + itm_moneyness_width=inputs.itm_moneyness_width, + logger=logger, + signalID=inputs.signal_id, + schema_cache={}, + picker=picker, + tick_cash=request.tick_cash if not request.is_tick_cash_scaled else request.tick_cash/100 + ) + else: + logger.info(f"Preset order found for signal_id {inputs.signal_id} on date {inputs.date}. Using preset order.") + ## Add necessary tags for identification order["signal_id"] = inputs.signal_id order["map_signal_id"] = inputs.signal_id diff --git a/EventDriven/riskmanager/picker/vertical_spread.py b/EventDriven/riskmanager/picker/vertical_spread.py new file mode 100644 index 0000000..f499ee7 --- /dev/null +++ b/EventDriven/riskmanager/picker/vertical_spread.py @@ -0,0 +1,200 @@ + +import numpy as np +import pandas as pd +from EventDriven.riskmanager.picker import _order_formatting, create_trade_id +from EventDriven.types import ResultsEnum, OrderDict +from EventDriven.riskmanager.picker import OrderSchema + + +def vertical_spread_pairer_by_exp( + row: pd.Series, + spread_tick: int = 1, + min_total_price: float = 0.5, + max_total_price: float = 1.0, + add_spread_filters: bool = True, +) -> pd.DataFrame: + """ + For a given row (option contract), find the corresponding leg of the vertical spread based on the spread_tick. + Calculate spread metrics such as spread mid, spread bid, spread ask, bid-ask spread, spread percentage ratio, and combined open interest. + Filter the resulting paired DataFrame based on the total spread mid price being within the specified min + and max total price range. + Args: + row (pd.Series): A row from the sorted_chain DataFrame representing an option contract. + spread_tick (int): The number of ticks between the legs of the spread. + min_total_price (float): Minimum total price of the spread to filter the results. + max_total_price (float): Maximum total price of the spread to filter the results. + Returns: + pd.DataFrame: A DataFrame containing the paired legs of the vertical spread and their calculated metrics, filtered by the total spread mid price. + """ + tgt_details = ["opttick", "midpoint", "closebid", "closeask", "open_interest"] + if "volume" in row.columns: + tgt_details.append("volume") + long_leg_details = row[tgt_details].reset_index(drop=True) + short_leg_details = row[tgt_details].shift(-spread_tick).reset_index(drop=True) + + ## Drop last spread_tick rows which will have NaNs in the short leg details after the shift. + valid_length = len(row) - spread_tick + long_leg_details = long_leg_details.iloc[:valid_length] + short_leg_details = short_leg_details.iloc[:valid_length] + + ## Produce relevant spread information. + spread_bid = long_leg_details["closebid"] - short_leg_details["closeask"] + spread_ask = long_leg_details["closeask"] - short_leg_details["closebid"] + spread_mid = long_leg_details["midpoint"] - short_leg_details["midpoint"] + bid_ask_spread = spread_ask - spread_bid + spread_pct_ratio = abs(spread_bid - spread_ask) / spread_mid.replace(0, np.nan) # Avoid division by zero. + spread_oi = abs(long_leg_details["open_interest"] + short_leg_details["open_interest"]) + + if "volume" in long_leg_details.columns and "volume" in short_leg_details.columns: + spread_volume = abs(long_leg_details["volume"] + short_leg_details["volume"]) + else: + spread_volume = pd.Series([np.nan] * len(spread_mid)) # If volume data is not available, fill with NaN. + + ## Combine into a DataFrame for analysis. + paired_opttick = pd.concat( + ( + long_leg_details["opttick"], + short_leg_details["opttick"], + spread_mid, + spread_bid, + spread_ask, + bid_ask_spread, + spread_pct_ratio, + spread_oi, + spread_volume, + ), + axis=1, + ) + paired_opttick.columns = [ + "long_leg_opttick", + "short_leg_opttick", + "spread_mid", + "spread_bid", + "spread_ask", + "bid_ask_spread", + "spread_pct_ratio", + "spread_oi", + "spread_volume", + ] + ## Ensure bid, ask > 0 + ## Ensure spread_pct <= 1.0 (we want tight spreads relative to the mid price) + if add_spread_filters: + paired_opttick = paired_opttick[ + (paired_opttick["spread_bid"] > 0) + & (paired_opttick["spread_ask"] > 0) + & (paired_opttick["spread_pct_ratio"] <= 1.25) + ].reset_index(drop=True) + return paired_opttick[paired_opttick["spread_mid"].between(min_total_price, max_total_price)].reset_index(drop=True) + + +def _vertical_spread_pairer( + filtered_chain: pd.DataFrame, + schema: OrderSchema, +) -> pd.DataFrame: + """ + For a given filtered option chain, find the best option contract based on the spread_tick. + Args: + filtered_chain (pd.DataFrame): The filtered option chain DataFrame. + schema (OrderSchema): The order schema containing parameters for building the vertical spread. + Returns: + pd.DataFrame: A Series containing the picked vertical spread contract details. + """ + # Start by ordering by strike, from ITM to OTM. + # For calls, ITM is lower strike, for puts, ITM is higher strike. + + spread_tick = schema["spread_ticks"] + is_call = schema["option_type"].lower() == "c" + sorted_chain = filtered_chain.sort_values( + by="strike", + ascending=is_call, # Calls: Ascending (lower strike = ITM). Puts: Descending (higher strike = ITM). + ).reset_index(drop=True) + + # spread_ticks is the number of ticks between the legs of the spread. + # For a call spread with spread_ticks=1, we buy the ITM call and sell the next lower strike call. + # For a put spread with spread_ticks=1, we buy the ITM put and sell the next higher strike put. + # For vertical spreads it is important that the legs are paired to expiration. + vertical_chain = ( + sorted_chain.groupby("expiration") + .apply( + vertical_spread_pairer_by_exp, + spread_tick=spread_tick, + min_total_price=schema["min_total_price"], + max_total_price=schema["max_total_price"], + ) + .reset_index(level=1, drop=True) + .sort_index() + ) + + ## Now we have our vertical spread chain with paired optticks and spread metrics for analysis. + ## We pick the spread we want based on specific criteria. We sort based on (this is by priority): + ## 1. spread_pct_ratio (we want this to be low, meaning the spread is relatively tight compared to its midpoint) + ## 2. spread_oi (we want this to be high, meaning there's good liquidity in the spread) + ## Finally, pick the top row as our chosen spread. + vertical_chain.sort_values(by=["spread_pct_ratio", "spread_oi"], ascending=[True, False], inplace=True) + picked_spread = vertical_chain.iloc[0] if not vertical_chain.empty else pd.Series() + return picked_spread + + +def _extract_order_for_vertical_spread(picked_spread: pd.Series, schema: OrderSchema) -> OrderDict: + """ + Extract order details for a vertical spread based on the picked spread and the provided schema. + Args: + picked_spread (pd.Series): A Series containing the details of the picked vertical spread contract. + schema (OrderSchema): The order schema containing parameters for building the vertical spread. + Returns: + "OrderResult": A dictionary containing the result status and order data. + """ + ## Extract order + if not picked_spread.empty: + long = [{"opttick": picked_spread["long_leg_opttick"]}] + short = [{"opttick": picked_spread["short_leg_opttick"]}] + leg_info = [("L", picked_spread["long_leg_opttick"]), ("S", picked_spread["short_leg_opttick"])] + close_price = picked_spread["spread_mid"] + + ## Other details from spread + pct_ratio = picked_spread["spread_pct_ratio"] + spread_oi = picked_spread["spread_oi"] + trade_id = create_trade_id( + legs={ + "long": long, + "short": short, + } + ) + data = _order_formatting( + trade_id=trade_id, legs=leg_info, close=close_price, dir=schema["structure_direction"] + ) + order = { + "result": ResultsEnum.SUCCESSFUL.value, + "data": data, + "metrics": { + "spread_pct_ratio": pct_ratio, + "spread_oi": spread_oi, + }, + } + else: + order = { + "result": ResultsEnum.UNSUCCESSFUL.value, + "data": None, + } + + return order + + +def vertical_spread_order_builder( + filtered_chain: pd.DataFrame, + schema: dict, +) -> OrderDict: + """ + Build a vertical spread order based on the filtered option chain and the provided schema. + Args: + filtered_chain (pd.DataFrame): The filtered option chain DataFrame. + schema (dict): The order schema containing parameters for building the vertical spread. + Returns: + dict: A dictionary containing the result status and order data. + """ + picked_spread = _vertical_spread_pairer( + filtered_chain=filtered_chain, + schema=schema, + ) + order = _extract_order_for_vertical_spread(picked_spread, schema=schema) + return order diff --git a/EventDriven/riskmanager/position/cogs/analyze_utils.py b/EventDriven/riskmanager/position/cogs/analyze_utils.py index c4085c8..1e9250f 100644 --- a/EventDriven/riskmanager/position/cogs/analyze_utils.py +++ b/EventDriven/riskmanager/position/cogs/analyze_utils.py @@ -221,7 +221,7 @@ def adjust_for_events( if is_backtest: raise ValueError(f"No adjusted strike data found for option: {meta}") else: - logger.warning(f"No adjusted strike data found for option: {meta}. Returning original meta.") + logger.info(f"No adjusted strike data found for option: {meta}. Returning original meta.") meta_dict = parse_option_tick(meta) return meta_dict @@ -297,8 +297,12 @@ def greek_check(greek_value: float, greek_threshold: float, qty: int = 1, greate per_greek = greek_value / qty _bool = abs(greek_value) > abs(greek_threshold) logger.info( - f"Greek Check: greek_value={greek_value}, greek_threshold={greek_threshold}, per_greek={per_greek}, _bool={_bool}" + (f"Greek Check: greek_value={greek_value}, greek_threshold={greek_threshold}, per_greek={per_greek}, _bool={_bool}" + f", qty={qty}") ) + if greek_value == 0: + logger.critical("Greek value is zero, cannot compute required quantity. Returning False and 0.") + return False, 0 required_qty = max(int(abs(greek_threshold) // abs(per_greek)), 1) quantity_diff = abs(qty) - abs(required_qty) return _bool, quantity_diff @@ -384,15 +388,44 @@ def analyze_position( if _greek_bool: abs_q_diff = abs(q_diff) + + ## Will use this later when adding short/long direction info to log + direction = "L" if qty > 0 else "S" # noqa + logger.info( + (f"Greek limit breach for {trade_id}: greek={greek}, greek_v={greek_v}, " + f"greek_limit_v={greek_limit_v}, qty={qty}, direction={direction}, " + f"abs_q_diff={abs_q_diff}, q_diff={q_diff}") + ) + # Keep track of the largest adjustment needed if abs_q_diff > max_qty_diff: max_qty_diff = abs_q_diff # Adjust sign based on position direction + # Eg: when LONG=qty>0 we set negative qty_diff to reduce position size + # TODO: q_diff sign logic needs review for situations where we want to increase position size q_diff = abs_q_diff if qty < 0 else -abs_q_diff - max_adjust_action = ADJUST( - trade_id=trade_id, action=Changes(quantity_diff=q_diff, new_quantity=qty + q_diff) - ) - max_adjust_action.reason = f"position {greek} exceeds limit ({greek_v} > {greek_limit_v})" + new_qty = qty + q_diff + + ## IF new quantity is positive, create ADJUST action + if new_qty > 0: + max_adjust_action = ADJUST( + trade_id=trade_id, action=Changes(quantity_diff=q_diff, new_quantity=qty + q_diff) + ) + max_adjust_action.reason = f"position {greek} exceeds limit ({greek_v} > {greek_limit_v})" + + ## IF new quantity is zero, create ROLL action instead. To avoid complete close. + elif new_qty == 0: + max_adjust_action = ROLL( + trade_id=trade_id, action=Changes(quantity_diff=q_diff, new_quantity=0) + ) + max_adjust_action.reason = f"position {greek} exceeds limit ({greek_v} > {greek_limit_v}), New qty=0, rolling instead of closing." + + else: + logger.warning( + (f"Calculated new quantity for {trade_id} is negative ({new_qty}). " + "Skipping ADJUST action creation.") + ) + logger.debug(f"ADJUST action candidate for {trade_id}: {greek} limit breach.") else: logger.debug(f"No {greek} limit breach for {trade_id}: {greek_v} within {greek_limit_v}.") diff --git a/EventDriven/riskmanager/position/cogs/benchmarks/README.md b/EventDriven/riskmanager/position/cogs/benchmarks/README.md deleted file mode 100644 index a86b68e..0000000 --- a/EventDriven/riskmanager/position/cogs/benchmarks/README.md +++ /dev/null @@ -1,94 +0,0 @@ -# LimitsAndSizingCog Performance Benchmarks - -## Overview - -This directory contains focused benchmarks for measuring `LimitsAndSizingCog._analyze_impl()` performance. - -## Files - -- **`simple_focused_benchmark.py`** - Main benchmark script -- **`simple_focused_baseline.json`** - Baseline performance results (200 iterations, 50 positions) -- **`task4_results.json`** - Results after conditional verbose_info optimization -- **`task5_results.json`** - Results after pre-compute values optimization -- **`task3_final.json`** - Results for dictionary filtering (inconclusive) - -## Usage - -```bash -# Run current performance test -conda run -n openbb_new_use python simple_focused_benchmark.py --iterations 200 --positions 50 - -# Create new baseline -python simple_focused_benchmark.py --baseline --iterations 200 --positions 50 - -# Custom output -python simple_focused_benchmark.py --output my_test.json --iterations 200 --positions 50 -``` - ---- - -## Optimization Results Summary - -### Performance Metrics - -| Metric | Baseline | After Task #4 | After Task #5 | Change | -|--------|----------|---------------|---------------|---------| -| **Time/iteration** | 0.160971s | 0.081332s | 0.094664s | **-41.19%** | -| **Time/position** | 3.219ms | 1.627ms | 1.893ms | **-41.19%** | -| **Variance (CV)** | 123.40% | 50.20% | 45.34% | **-63.23%** | - -🚀 **Overall Speedup: 41.19% faster** -✅ **Stability: 63% reduction in variance** -✅ **Per-position: 1.326ms faster (3.219ms → 1.893ms)** - ---- - -## Completed Optimizations - -### ✅ Task #1: Combined Redundant Parsing Functions -- Created `get_dte_and_moneyness_from_trade_id()` function -- Eliminates redundant `parse_position_id()` calls -- Status: Already implemented in codebase - -### ✅ Task #2: Early Returns in analyze_position() -- Implemented priority-ordered returns (EXERCISE → ROLL → ADJUST → HOLD) -- Eliminated list building and sorting overhead -- Status: Already implemented in codebase - -### ⚠️ Task #3: Dictionary Filtering Optimization -- Changed from O(n) to O(1) lookup using MEASURES_SET -- Result: Inconclusive (within statistical noise, CV >120%) -- Status: Implemented but minimal practical impact - -### ✅ Task #4: Conditional verbose_info Generation ⭐ **MAJOR WIN** -- Only generate verbose_info for non-HOLD actions -- Changed from multi-line to single-line f-string format -- Result: **49.47% speedup**, CV reduced to 50.20% -- Status: Implemented - -### ✅ Task #5: Pre-compute Commonly Used Values -- Pre-computed: strat_enabled_limits, bkt_start_date, t_plus_n, last_updated, t_plus_n_timedelta -- Result: **41.19% faster than baseline** (16% regression vs Task #4) -- Status: Implemented - -### ✅ Task #6: Cache Config Lookup Outside Loop -- Status: Completed as part of Task #5 - ---- - -## Key Insights - -1. **Task #4 was the game changer** - Skipping string formatting for HOLD actions provided biggest impact -2. **Variance reduction significant** - CV dropped from 123% to 45%, more consistent performance -3. **Pre-computation trade-offs** - Task #5 adds small overhead but improves code clarity -4. **Statistical challenges** - High baseline variance makes small optimizations (<10%) hard to measure -5. **Real bottleneck elsewhere** - Greeks calculation in market_timeseries.py (~5 min/position) remains main issue - ---- - -## Recommendations - -- ✅ Keep all current optimizations (improve both performance and code quality) -- ✅ Task #4 alone provides 49.47% speedup if cherry-picking needed -- 🔍 Focus future efforts on Greeks calculation bottleneck -- 📊 Target >10% improvements for measurable results diff --git a/EventDriven/riskmanager/position/cogs/benchmarks/simple_focused_baseline.json b/EventDriven/riskmanager/position/cogs/benchmarks/simple_focused_baseline.json deleted file mode 100644 index 1776938..0000000 --- a/EventDriven/riskmanager/position/cogs/benchmarks/simple_focused_baseline.json +++ /dev/null @@ -1,214 +0,0 @@ -{ - "timestamp": "2025-11-28T21:33:45.634871", - "iterations": 200, - "num_positions": 50, - "timings_seconds": [ - 0.1124361170004704, - 0.09299577799902181, - 0.11549446400022134, - 0.12602316199991037, - 0.11676277600054163, - 0.12863105799988261, - 0.09120676099701086, - 0.09050670400029048, - 0.08694563400058541, - 0.10048900400215643, - 0.11537297299946658, - 0.10663737800132367, - 0.08386945299935178, - 0.07379269000011845, - 0.06282298999940394, - 0.06990236999990884, - 0.09860984999977518, - 0.07444966700131772, - 0.06107574500128976, - 0.10163106899926788, - 0.10475266800131067, - 0.10018179300095653, - 0.1025254349988245, - 0.09240633500303375, - 0.07005534000199987, - 0.0876700320004602, - 0.08804916400185903, - 0.09102904199971817, - 0.2022440020009526, - 0.12140582199936034, - 0.08622879999893485, - 0.09916428799988353, - 0.11940119199789478, - 0.07631051499993191, - 0.06977537800048594, - 0.13554363200091757, - 0.10836319000009098, - 0.0904391999974905, - 0.11126822000005632, - 0.09532266099995468, - 0.0987091099996178, - 0.10418092000327306, - 0.10626124199916376, - 0.08507717400061665, - 0.06438516699927277, - 0.062934588000644, - 0.07466716899944004, - 0.09065367600123864, - 0.06420887000058428, - 0.06638465099968016, - 0.12703987799977767, - 0.12465908900048817, - 0.1227337609998358, - 0.21896897799888393, - 0.14963359200191917, - 0.1052738340003998, - 0.11840194700198481, - 0.097849508998479, - 0.1304657140026393, - 0.12750545800008695, - 0.09471298499920522, - 0.09001788100067643, - 0.09015447400088306, - 0.09733147299994016, - 0.12127994000184117, - 0.07530326000050991, - 0.07572819699998945, - 0.06424139499722514, - 0.09457172799739055, - 0.10890259699954186, - 0.0889476789998298, - 0.08417465800084756, - 0.08644267600175226, - 0.131837386998086, - 0.09230055299849482, - 0.09447187099794974, - 0.08371949999855133, - 0.09390294900003937, - 0.1242689339997014, - 0.09814644699872588, - 0.06983653899806086, - 0.07643277100214618, - 0.07760205199883785, - 0.07555404499726137, - 0.07501138400039054, - 0.0806162429980759, - 0.06475468299686327, - 0.060695856001984794, - 0.07742830399729428, - 0.06296733400085941, - 0.06614110300142784, - 0.07171886200012523, - 0.06688193900117767, - 0.07119920600234764, - 0.07123606700042728, - 0.08730313599880901, - 0.09560939299990423, - 0.06870151000111946, - 0.10333523400186095, - 0.10427913900275598, - 0.08983682500183932, - 0.08754351899915491, - 0.12119196500134422, - 1.286703485999169, - 0.18888503199923434, - 0.9170801389991539, - 0.9593940779996046, - 0.6825994479986548, - 0.6668549070018344, - 1.8159945869992953, - 0.8891261879980448, - 0.611302320001414, - 0.5783604610005568, - 0.5785957989974122, - 0.39401062999968417, - 0.4140847880007641, - 0.31359697000152664, - 0.17436419099976774, - 0.19653211499826284, - 0.24810775399964768, - 0.17058249399997294, - 0.15014555000016117, - 0.13030647200139356, - 0.24010779400123283, - 0.1366094080003677, - 0.1198702889996639, - 0.15558540799975162, - 0.16952530499838758, - 0.11712136599817313, - 0.10913464599798317, - 0.09775316500235931, - 0.09113733199774288, - 0.09767447500053095, - 0.18424123600198072, - 0.12506186199971125, - 0.1352459590016224, - 0.19999694500074838, - 0.2969247950022691, - 0.11984094699801062, - 0.11258214900226449, - 0.19739717400079826, - 0.2687673990003532, - 0.19013910799912992, - 0.3976287229997979, - 0.3565994119999232, - 0.2396827660013514, - 0.2728527949984709, - 0.17461650900077075, - 0.1295863660016039, - 0.17390844100009417, - 0.2040776760004519, - 0.21835745900170878, - 0.24066108300030464, - 0.16474368900162517, - 0.14774868599852198, - 0.16687833900141413, - 0.11534100099743227, - 0.1146964699983073, - 0.09377230300015071, - 0.10763487000076566, - 0.09638726200137171, - 0.10305503599738586, - 0.10307674199793837, - 0.11019019500236027, - 0.10518714799763984, - 0.10919626299801166, - 0.12154040599853033, - 0.11554302000149619, - 0.11421647800307255, - 0.10381807999874582, - 0.12099867000142694, - 0.2382874590002757, - 0.2028360780022922, - 0.28585212500183843, - 0.10810091399980593, - 0.1021537749984418, - 0.1141872840016731, - 0.11561524200078566, - 0.08132935100002214, - 0.10436057000333676, - 0.09592388899909565, - 0.10983376199874328, - 0.09385990600276273, - 0.09405442800198216, - 0.12945240099725197, - 0.15149066500089248, - 0.11215841999728582, - 0.10884799199993722, - 0.08932809500038275, - 0.07133894399885321, - 0.09206479400017997, - 0.08779134099677322, - 0.08392427599756047, - 0.09182500899987645, - 0.09363464000125532, - 0.10426684900085093, - 0.07835840500047198, - 0.08563552700070431, - 0.09745183000268298, - 0.09877254399907542 - ], - "avg_time_seconds": 0.16097098473006555, - "min_time_seconds": 0.060695856001984794, - "max_time_seconds": 1.8159945869992953, - "avg_time_per_position_ms": 3.219419694601311, - "total_time_seconds": 32.19419694601311, - "version": "baseline", - "description": "Baseline before Task #2 (early returns optimization)" -} \ No newline at end of file diff --git a/EventDriven/riskmanager/position/cogs/benchmarks/simple_focused_benchmark.py b/EventDriven/riskmanager/position/cogs/benchmarks/simple_focused_benchmark.py deleted file mode 100644 index 0d1c114..0000000 --- a/EventDriven/riskmanager/position/cogs/benchmarks/simple_focused_benchmark.py +++ /dev/null @@ -1,339 +0,0 @@ -""" -Simple focused benchmark for LimitsAndSizingCog._analyze_impl() - -Directly creates sample position contexts and benchmarks the analyze method. -Based on the notebook approach in positions_and_limits_focus.ipynb Cell 21. - -Usage: - cd /path/to/QuantTools - python EventDriven/riskmanager/position/cogs/benchmarks/simple_focused_benchmark.py --baseline --iterations 100 -""" - -from __future__ import annotations - -import time -import json -import argparse -from pathlib import Path -from datetime import datetime -from typing import Dict, Any -import pandas as pd -import sys - -# Ensure proper imports -sys.path.insert(0, '/Users/chiemelienwanisobi/cloned_repos/QuantTools') - -from EventDriven.riskmanager.position.cogs.limits import LimitsAndSizingCog -from EventDriven.configs.core import LimitsEnabledConfig -from EventDriven.dataclasses.limits import PositionLimits - - -def create_sample_positions_for_benchmark(num_positions: int = 10): - """ - Create sample position data for benchmarking. - Returns a list of mock position objects that _analyze_impl would process. - """ - from EventDriven.dataclasses.states import PositionState, PortfolioState, PortfolioMetaInfo, PositionAnalysisContext - from EventDriven.dataclasses.timeseries import AtTimePositionData - from EventDriven.riskmanager.market_data import AtIndexResult - import pandas as pd - from datetime import datetime, timedelta - - print(f"Creating {num_positions} sample positions...") - - positions = [] - base_date = datetime(2024, 6, 14) - - for i in range(num_positions): - # Create trade_id with proper format - # Format: &L:SYMBOL_YYYYMMDD_C/P_STRIKE&S:SYMBOL_YYYYMMDD_C/P_STRIKE - expiry = (base_date + timedelta(days=180+i)).strftime("%Y%m%d") - strike1 = int(150 + i * 5) - strike2 = int(strike1 + 10) - trade_id = f"&L:AAPL{expiry}C{strike1}&S:AAPL{expiry}C{strike2}" - - # Create mock position data (AtTimePositionData) - position_data = AtTimePositionData( - position_id=trade_id, - date=base_date + timedelta(days=i), - close=10.5 + i, - bid=10.0 + i, - ask=11.0 + i, - midpoint=10.5 + i, - delta=0.45 + (i * 0.05), # Vary delta - gamma=0.02, - theta=-0.15, - vega=0.25, - ) - - # Create mock underlier data - undl_price = 150.0 + i * 2 - underlier_data = AtIndexResult( - sym="AAPL", - date=pd.Timestamp(base_date + timedelta(days=i)), - spot=pd.Series([undl_price], index=[base_date + timedelta(days=i)]), - chain_spot=pd.Series({"close": undl_price, "open": undl_price-1, "high": undl_price+1, "low": undl_price-2}), - rates=pd.Series([0.05], index=[base_date + timedelta(days=i)]), - dividends=pd.Series([0.0], index=[base_date + timedelta(days=i)]) - ) - - # Create position - position = PositionState( - trade_id=trade_id, - signal_id=f"SIGNAL_{i}", - underlier_tick="AAPL", - quantity=10, - entry_price=10.0, - current_position_data=position_data, - current_underlier_data=underlier_data, - pnl=100.0 + i * 10, - last_updated=base_date + timedelta(days=i), - ) - - positions.append(position) - - # Create portfolio state - portfolio = PortfolioState( - cash=100000.0, - positions=positions, - pnl=sum([p.pnl for p in positions]), - total_value=100000.0 + sum([p.pnl for p in positions]), - last_updated=base_date, - ) - - # Create portfolio meta info - portfolio_meta = PortfolioMetaInfo( - start_date=base_date - timedelta(days=30), - t_plus_n=0, - ) - - # Create context - context = PositionAnalysisContext( - date=base_date, - portfolio=portfolio, - portfolio_meta=portfolio_meta, - ) - - return context - - -def setup_cog_with_limits(context): - """ - Create a LimitsAndSizingCog and initialize position_limits. - Similar to notebook Cell 21 approach. - - Also patches database lookup functions to avoid errors with mock data. - """ - print("Setting up LimitsAndSizingCog with position limits...") - - # Patch adjust_for_events to skip database lookups - from EventDriven.riskmanager.position.cogs import analyze_utils - original_adjust = analyze_utils.adjust_for_events - - def mock_adjust_for_events(start, date, option): - """Mock version that just returns the option unchanged""" - return option - - analyze_utils.adjust_for_events = mock_adjust_for_events - - # Create cog - config = LimitsEnabledConfig() - cog = LimitsAndSizingCog(config=config) - - # Initialize position limits for all positions - for position in context.portfolio.positions: - cog.position_limits[position.trade_id] = PositionLimits( - delta=500.0, # Sample delta limit - dte=120, - moneyness=1.15, - ) - - print(f"Cog initialized with {len(cog.position_limits)} position limits") - return cog - - -def benchmark_analyze_impl( - cog, # LimitsAndSizingCog - context, # PositionAnalysisContext - iterations: int = 100 -) -> Dict[str, Any]: - """ - Benchmark cog._analyze_impl() by calling it repeatedly. - - Args: - cog: Fully initialized LimitsAndSizingCog - context: PositionAnalysisContext with sample positions - iterations: Number of times to call _analyze_impl - - Returns: - Dictionary with timing results - """ - num_positions = len(context.portfolio.positions) - - print(f"\n{'='*70}") - print("FOCUSED BENCHMARK: LimitsAndSizingCog._analyze_impl()") - print(f"Positions: {num_positions}, Iterations: {iterations}") - print(f"{'='*70}\n") - - timings = [] - - print("Starting benchmark...") - - for i in range(iterations): - iteration_start = time.perf_counter() - - # Run _analyze_impl - _ = cog._analyze_impl(context) - - iteration_time = time.perf_counter() - iteration_start - timings.append(iteration_time) - - # Print progress every 20 iterations - if (i + 1) % 20 == 0: - avg_so_far = sum(timings) / len(timings) - print(f"Iteration {i+1}/{iterations}: {iteration_time:.6f}s " - f"(avg so far: {avg_so_far:.6f}s)") - - # Calculate statistics - avg_time = sum(timings) / len(timings) - min_time = min(timings) - max_time = max(timings) - - # Time per position - avg_time_per_position_ms = (avg_time / num_positions * 1000) if num_positions > 0 else 0 - - results = { - 'timestamp': datetime.now().isoformat(), - 'iterations': iterations, - 'num_positions': num_positions, - 'timings_seconds': timings, - 'avg_time_seconds': avg_time, - 'min_time_seconds': min_time, - 'max_time_seconds': max_time, - 'avg_time_per_position_ms': avg_time_per_position_ms, - 'total_time_seconds': sum(timings), - } - - print(f"\n{'='*70}") - print("RESULTS:") - print(f" Average time per iteration: {avg_time:.6f}s") - print(f" Min time: {min_time:.6f}s") - print(f" Max time: {max_time:.6f}s") - print(f" Avg time per position: {avg_time_per_position_ms:.3f}ms") - print(f" Total positions analyzed: {num_positions * iterations:,}") - print(f"{'='*70}\n") - - return results - - -def compare_with_baseline(current_results: Dict[str, Any], baseline_file: Path): - """Compare current results with baseline.""" - if not baseline_file.exists(): - print("No baseline file found for comparison") - return - - with open(baseline_file, 'r') as f: - baseline = json.load(f) - - baseline_avg = baseline['avg_time_seconds'] - current_avg = current_results['avg_time_seconds'] - - time_diff = current_avg - baseline_avg - pct_change = (time_diff / baseline_avg) * 100 - - baseline_per_pos = baseline.get('avg_time_per_position_ms', 0) - current_per_pos = current_results['avg_time_per_position_ms'] - - print(f"{'='*70}") - print("COMPARISON WITH BASELINE:") - print(f" Baseline avg time: {baseline_avg:.6f}s") - print(f" Current avg time: {current_avg:.6f}s") - print(f" Time difference: {time_diff:+.6f}s ({pct_change:+.2f}%)") - print("") - print(f" Baseline per position: {baseline_per_pos:.3f}ms") - print(f" Current per position: {current_per_pos:.3f}ms") - - if pct_change < 0: - speedup = -pct_change - print("") - print(f" 🚀 SPEEDUP: {speedup:.2f}% faster!") - elif pct_change > 0: - print("") - print(f" ⚠️ REGRESSION: {pct_change:.2f}% slower") - else: - print("") - print(" No change") - - print(f"{'='*70}\n") - - -def main(): - parser = argparse.ArgumentParser( - description='Simple focused benchmark for LimitsAndSizingCog._analyze_impl()' - ) - parser.add_argument( - '--baseline', - action='store_true', - help='Save results as baseline for future comparisons' - ) - parser.add_argument( - '--iterations', - type=int, - default=100, - help='Number of iterations (default: 100)' - ) - parser.add_argument( - '--positions', - type=int, - default=10, - help='Number of sample positions to create (default: 10)' - ) - parser.add_argument( - '--output', - type=str, - help='Custom output filename (default: auto-generated)' - ) - - args = parser.parse_args() - - # Create sample data - print("="*70) - print("SETUP PHASE") - print("="*70) - - context = create_sample_positions_for_benchmark(num_positions=args.positions) - cog = setup_cog_with_limits(context) - - # Run benchmark - results = benchmark_analyze_impl(cog, context, iterations=args.iterations) - - # Determine output file - benchmarks_dir = Path(__file__).resolve().parent - - if args.output: - output_file = benchmarks_dir / args.output - elif args.baseline: - output_file = benchmarks_dir / 'simple_focused_baseline.json' - results['version'] = 'baseline' - results['description'] = 'Baseline before Task #2 (early returns optimization)' - else: - # Auto-generate filename with timestamp - timestamp = datetime.now().strftime('%Y%m%d_%H%M%S') - output_file = benchmarks_dir / f'simple_focused_results_{timestamp}.json' - results['version'] = 'current' - results['description'] = 'Current performance measurement' - - # Save results - with open(output_file, 'w') as f: - json.dump(results, f, indent=2) - - print(f"Results saved to: {output_file}") - - # Compare with baseline if not creating baseline - if not args.baseline: - baseline_file = benchmarks_dir / 'simple_focused_baseline.json' - compare_with_baseline(results, baseline_file) - - -if __name__ == '__main__': - main() diff --git a/EventDriven/riskmanager/position/cogs/benchmarks/task3_final.json b/EventDriven/riskmanager/position/cogs/benchmarks/task3_final.json deleted file mode 100644 index f15a453..0000000 --- a/EventDriven/riskmanager/position/cogs/benchmarks/task3_final.json +++ /dev/null @@ -1,212 +0,0 @@ -{ - "timestamp": "2025-11-28T21:32:17.270703", - "iterations": 200, - "num_positions": 50, - "timings_seconds": [ - 0.10376109600110794, - 0.09935514500102727, - 0.09825622099742759, - 0.11950418599735713, - 0.24454587700165575, - 0.14475858399964636, - 0.1213206540014653, - 0.1495928990007087, - 0.23858742200172856, - 0.13508260600065114, - 0.1287371529979282, - 0.13199195000197506, - 0.1185176170001796, - 0.27653049700165866, - 0.1428144900019106, - 0.10033040300186258, - 0.12397298900032183, - 0.16280647899839096, - 0.12326351999945473, - 0.10962116299924674, - 0.09665007800140302, - 0.10309922799933702, - 0.09308468600283959, - 0.12122351099969819, - 0.12120716199933668, - 0.12005923000106122, - 0.1140902119987004, - 0.10927746599918464, - 0.09675935600171215, - 0.14102302799801691, - 0.09598366499994881, - 0.1026014019989816, - 1.4717046519981523, - 0.23798462500053574, - 0.3141331970000465, - 0.5197073290000844, - 0.26338066599782906, - 0.08705067299888469, - 0.09597225499965134, - 0.10384067899940419, - 0.1372531750021153, - 0.3232995779981138, - 0.24534615400261828, - 0.15478637700289255, - 0.11982172399802948, - 0.10955134599862504, - 0.20797378399947775, - 1.3797600260004401, - 1.4902170330024092, - 0.6410117090017593, - 0.26603874400097993, - 0.7129434809976374, - 1.3723017080010322, - 1.0471812249998038, - 0.27059267300137435, - 0.13780781599780312, - 0.6493040589994052, - 0.27505965499949525, - 0.23714444399956847, - 0.5072346180022578, - 0.3147437000006903, - 0.372903760002373, - 0.19658536099814228, - 0.13626854899848695, - 0.10973763799847802, - 0.2955967369998689, - 0.1897965429998294, - 0.12465695700302604, - 0.14000731499982066, - 0.09953991400107043, - 0.09272833700015326, - 0.12514273399938247, - 0.10770355500062578, - 0.1101387570015504, - 0.10079654500077595, - 0.08130877599978703, - 0.09514594299980672, - 0.10921632199824671, - 0.09533140500207082, - 0.08822215399777633, - 0.08312510500036296, - 0.10378292099994724, - 0.09116379200349911, - 0.08495508600026369, - 0.09924015199794667, - 0.0981659250028315, - 0.10462745300173992, - 0.1046998279998661, - 0.12148934700235259, - 0.11892350599737256, - 0.09046813899840345, - 0.07243784000093001, - 0.08513366800252697, - 0.09248968199972296, - 0.0912349419995735, - 0.09260913999969489, - 0.08783014400250977, - 0.10365281799749937, - 0.10020152499782853, - 0.09935832200062578, - 0.09856337000019266, - 0.1719422169990139, - 0.34931337099988014, - 0.11664032000044244, - 0.122843664001266, - 0.13118475399824092, - 0.12130267599786748, - 0.2489404630032368, - 0.12321556099777808, - 0.08098265300213825, - 0.1117831350020424, - 0.09261805899950559, - 0.10812797300241073, - 0.11664468800154282, - 0.11336259900053847, - 0.2437336970033357, - 0.1610078359990439, - 0.10581661899777828, - 0.11578824599928339, - 0.10640758400040795, - 0.13030005499967956, - 0.19003671099926578, - 0.11208337399875745, - 0.15721414899962838, - 0.10919898800057126, - 0.14454675099841552, - 0.11043093500120449, - 0.1327641659991059, - 0.1071581310025067, - 0.10791002800033311, - 0.09702216100049554, - 0.1031249250008841, - 0.10566747700067936, - 0.1407305409993569, - 0.10028188900105306, - 0.13989794300141511, - 0.15907919599703746, - 0.13067604699972435, - 0.1322535599974799, - 0.15618954000092344, - 0.13827253600175027, - 0.15345564899689634, - 0.10380831799920998, - 0.10692864899829146, - 0.14816435100146919, - 0.16982753299816977, - 0.14006941600018763, - 0.10380725199865992, - 0.10335612500057323, - 0.10608995000075083, - 0.10322661000100197, - 0.10016873499989742, - 0.11727481699927012, - 0.09293408499797806, - 0.08196283700090135, - 0.08167696300006355, - 0.07503288600128144, - 0.08688244800214306, - 0.07652016200154321, - 0.17649227900255937, - 0.09538924599837628, - 0.07221700300215161, - 0.08366980700157, - 0.07416483699853416, - 0.072810894002032, - 0.06579944300028728, - 0.07651960699877236, - 0.09162528500019107, - 0.09562968600221211, - 0.10555635700075072, - 0.06667220100280247, - 0.07085439199727261, - 0.08183557400116115, - 0.07097276299828081, - 0.07493035699735628, - 0.07534727000165731, - 0.07236304300022312, - 0.06745456399949035, - 0.07822888499867986, - 0.0798325969990401, - 0.09143882999705966, - 0.08929445800094982, - 0.07670267999856151, - 0.0800732310017338, - 0.07943687199804117, - 0.09144498199748341, - 0.07622820300093736, - 0.08617419200163567, - 0.08993705499960924, - 0.07522768700073357, - 0.08157150400074897, - 0.07382942100230139, - 0.08233769800062873, - 0.0663328080008796, - 0.08509177199812257, - 0.07105297799716936, - 0.0857515890020295, - 0.09671582699957071, - 0.08762320199821261, - 0.08726787700288696 - ], - "avg_time_seconds": 0.16688059023510504, - "min_time_seconds": 0.06579944300028728, - "max_time_seconds": 1.4902170330024092, - "avg_time_per_position_ms": 3.337611804702101, - "total_time_seconds": 33.37611804702101 -} \ No newline at end of file diff --git a/EventDriven/riskmanager/position/cogs/benchmarks/task3_results.json b/EventDriven/riskmanager/position/cogs/benchmarks/task3_results.json deleted file mode 100644 index 7546969..0000000 --- a/EventDriven/riskmanager/position/cogs/benchmarks/task3_results.json +++ /dev/null @@ -1,112 +0,0 @@ -{ - "timestamp": "2025-11-28T21:29:08.327421", - "iterations": 100, - "num_positions": 20, - "timings_seconds": [ - 0.025683709998702398, - 0.020152925000729738, - 0.02320113899986609, - 0.03706265399887343, - 0.06792625200250768, - 0.03622309099955601, - 0.04045523099921411, - 0.053271845001290785, - 0.03145509100068011, - 0.03947335499833571, - 0.02823916000124882, - 0.03880956600187346, - 0.033396122002159245, - 0.027862807000929024, - 0.02400205000230926, - 0.025664060998678906, - 0.034076838001055876, - 0.03719533600087743, - 0.0411442540025746, - 0.045254387998284074, - 0.0479930580004293, - 0.044116168002801714, - 0.0240333859983366, - 0.023890268999821274, - 0.03298669300056645, - 0.02315902400005143, - 0.12158002000069246, - 0.03565643399997498, - 0.046293268998852, - 0.03612355400036904, - 0.03792614299891284, - 0.023702451999270124, - 0.021638481000991305, - 0.023517360001278576, - 0.02035377399806748, - 0.02232984899819712, - 0.02174592400115216, - 0.022809539001173107, - 0.02045805500165443, - 0.01915215600092779, - 0.01916415700179641, - 0.01863724299983005, - 0.018414864996884717, - 0.020810232999792788, - 0.019779641002969583, - 0.019439333002083004, - 0.018076349999319063, - 0.01809049999792478, - 0.018625878998136614, - 0.02102698000089731, - 0.02019918800215237, - 0.018796274001942948, - 0.020732822998979827, - 0.018559821000962984, - 0.018934856001578737, - 0.020470247000048403, - 0.031346239000413334, - 0.02675720999832265, - 0.03630095100015751, - 0.02663210099854041, - 0.020028512997669168, - 0.022513693998917006, - 0.020755031000589952, - 0.018753364001895534, - 0.020271237000997644, - 0.017838200001278892, - 0.018975923001562478, - 0.018255287999636494, - 0.01925110900265281, - 0.020470078001380898, - 0.019190119000995765, - 0.01822485899901949, - 0.017907649002154358, - 0.01810339300209307, - 0.018424399000650737, - 0.019848415999149438, - 0.021933446998446016, - 0.01884492400131421, - 0.018331057999603217, - 0.02914421700188541, - 0.035858844999893336, - 0.024564138999267016, - 0.02347419099896797, - 0.02015025000218884, - 0.018801563001034083, - 0.0187240519990155, - 0.019705180002347333, - 0.019342243002029136, - 0.018497717999707675, - 0.01805099900229834, - 0.01796581599774072, - 0.019439892999798758, - 0.019454487999610137, - 0.018129798998415936, - 0.01904448700224748, - 0.019971674999396782, - 0.018313955999474274, - 0.017905429998791078, - 0.018326125002204208, - 0.01802268100072979 - ], - "avg_time_seconds": 0.026116188220330513, - "min_time_seconds": 0.017838200001278892, - "max_time_seconds": 0.12158002000069246, - "avg_time_per_position_ms": 1.3058094110165257, - "total_time_seconds": 2.6116188220330514 -} \ No newline at end of file diff --git a/EventDriven/riskmanager/position/cogs/benchmarks/task3_v2_results.json b/EventDriven/riskmanager/position/cogs/benchmarks/task3_v2_results.json deleted file mode 100644 index 2df506c..0000000 --- a/EventDriven/riskmanager/position/cogs/benchmarks/task3_v2_results.json +++ /dev/null @@ -1,112 +0,0 @@ -{ - "timestamp": "2025-11-28T21:29:52.080942", - "iterations": 100, - "num_positions": 20, - "timings_seconds": [ - 0.021662754003045848, - 0.01974582000184455, - 0.018991218999872217, - 0.0191501959998277, - 0.020475552999414504, - 0.022344189001159975, - 0.01878710399978445, - 0.018869308001740137, - 0.019057666999287903, - 0.019546380997780943, - 0.01892279100138694, - 0.01922853499854682, - 0.019272677000117255, - 0.019101048997981707, - 0.020392600003106054, - 0.01930121600162238, - 0.018602524000016274, - 0.018355485000938643, - 0.019618725000327686, - 0.01984880899908603, - 0.018753926000499632, - 0.018649798999831546, - 0.01881892399978824, - 0.01888102700104355, - 0.019449044000793947, - 0.0187890739980503, - 0.018382702000963036, - 0.018554239999502897, - 0.01882993199978955, - 0.019535004001227207, - 0.018878502000006847, - 0.019269989999884274, - 0.021125422998011345, - 0.018393431000731653, - 0.018821082001522882, - 0.018614052001794335, - 0.0201227760007896, - 0.018920673999673454, - 0.020331772000645287, - 0.0197912229996291, - 0.018913938001787756, - 0.0185234529999434, - 0.01934505899771466, - 0.019533278999006143, - 0.019296209000458475, - 0.018608148999192053, - 0.01916171799894073, - 0.018466994999471353, - 0.018763422001939034, - 0.01955843199903029, - 0.018397158000880154, - 0.018582854001579108, - 0.01955319799890276, - 0.019213436000427464, - 0.018664512997929705, - 0.01877710899861995, - 0.01915154599919333, - 0.01964285099893459, - 0.023026265000225976, - 0.021124869002960622, - 0.02166473900069832, - 0.021631260999129154, - 0.022367167999618687, - 0.024521833001927007, - 0.020646360000682762, - 0.021433338999486296, - 0.019395069997699466, - 0.01948952399834525, - 0.01891808200161904, - 0.019834593000268796, - 0.018905955999798607, - 0.018955781000840943, - 0.019910693998099305, - 0.02374935599800665, - 0.019017057999008102, - 0.01860948900139192, - 0.018810670997481793, - 0.018692132998694433, - 0.020318702998338267, - 0.021880585001781583, - 0.02253224099695217, - 0.022535203999723308, - 0.02210570800161804, - 0.020392521997564472, - 0.02002268500291393, - 0.021035374000348384, - 0.01847949000148219, - 0.01958673099943553, - 0.02216648000103305, - 0.02027605399780441, - 0.02031566600271617, - 0.018676078998396406, - 0.019389955999940867, - 0.01919294199979049, - 0.018959172997710994, - 0.019101800997304963, - 0.019802482001978206, - 0.018715131001954433, - 0.018600745999719948, - 0.019190229999367148 - ], - "avg_time_seconds": 0.019703207419988756, - "min_time_seconds": 0.018355485000938643, - "max_time_seconds": 0.024521833001927007, - "avg_time_per_position_ms": 0.9851603709994379, - "total_time_seconds": 1.9703207419988757 -} \ No newline at end of file diff --git a/EventDriven/riskmanager/position/cogs/benchmarks/task4_results.json b/EventDriven/riskmanager/position/cogs/benchmarks/task4_results.json deleted file mode 100644 index 5d71b1a..0000000 --- a/EventDriven/riskmanager/position/cogs/benchmarks/task4_results.json +++ /dev/null @@ -1,212 +0,0 @@ -{ - "timestamp": "2025-11-28T21:38:48.390324", - "iterations": 200, - "num_positions": 50, - "timings_seconds": [ - 0.07172146499942755, - 0.06590209700152627, - 0.06444520199875114, - 0.06064467599935597, - 0.061371885996777564, - 0.06423492099929717, - 0.049894014999154024, - 0.04722983099782141, - 0.04805940299775102, - 0.05374076100270031, - 0.06049712800086127, - 0.0488723630005552, - 0.049903275998076424, - 0.05098065800120821, - 0.05525366499932716, - 0.06269634099953691, - 0.055023683002218604, - 0.055815016999986256, - 0.046746367999730865, - 0.06034089300010237, - 0.06989659100145218, - 0.07448034000117332, - 0.05203320899818209, - 0.05111461900014547, - 0.049882082999829436, - 0.04921963499873527, - 0.050692734999756794, - 0.046587251003074925, - 0.060285505998763256, - 0.05677065700001549, - 0.05051560699939728, - 0.04778304600040428, - 0.0460383110003022, - 0.06136006599990651, - 0.06377546899966546, - 0.05713210999965668, - 0.05295515800025896, - 0.04730386599840131, - 0.057402937000006204, - 0.04887588599740411, - 0.052751592000277014, - 0.04575369300073362, - 0.04389704500135849, - 0.04645611399973859, - 0.04571736499929102, - 0.04809168499923544, - 0.04546138600198901, - 0.0451177299983101, - 0.048266565001540584, - 0.0453898730011133, - 0.04460144900076557, - 0.04498080899793422, - 0.045335399998293724, - 0.04506495199893834, - 0.045516886999394046, - 0.055838520001998404, - 0.07144794399937382, - 0.07067959499909193, - 0.050716533998638624, - 0.046691101997566875, - 0.1987632990021666, - 0.134352802997455, - 0.08342028800325352, - 0.06601306599986856, - 0.05955152200112934, - 0.09284645300067496, - 0.08605848099978175, - 0.11455002000002423, - 0.08041388399942662, - 0.0892367730011756, - 0.10368282700073905, - 0.07771267999851261, - 0.10162798600140377, - 0.14279172999886214, - 0.13522267199732596, - 0.05348434999905294, - 0.05108526699768845, - 0.053668939999624854, - 0.05768601599993417, - 0.06954417000088142, - 0.09756778800147003, - 0.058292868998250924, - 0.04582488199957879, - 0.046295031999761704, - 0.12167964500258677, - 0.1442477059972589, - 0.15423888800069108, - 0.33274306999737746, - 0.21234133200050564, - 0.18772949400226935, - 0.16548986799898557, - 0.18396841100184247, - 0.1882081930016284, - 0.13881661199775408, - 0.1254457770010049, - 0.15824151299966616, - 0.1691548819981108, - 0.17370104599831393, - 0.10382883299826062, - 0.1271276530023897, - 0.12175794199720258, - 0.10012779899989255, - 0.13450379999994766, - 0.11192291900078999, - 0.11984474100245279, - 0.11698989299839013, - 0.13776090999817825, - 0.128690778001328, - 0.11472958699960145, - 0.14307594199999585, - 0.09358520800014958, - 0.09910867600046913, - 0.09021141099947272, - 0.06593758599774446, - 0.0678532140009338, - 0.05467090700039989, - 0.07234033699933207, - 0.057982042999356054, - 0.059951077000732766, - 0.05560432800120907, - 0.06293091500265291, - 0.05611050899824477, - 0.05725599000288639, - 0.07053511499907472, - 0.060869134998938534, - 0.062050198001088575, - 0.06059276700034388, - 0.06081721100053983, - 0.05734942799972487, - 0.05945832900033565, - 0.06860756199967, - 0.07246851599848014, - 0.07689762800146127, - 0.06130992999896989, - 0.06991490099971998, - 0.057173518998752115, - 0.06522982000024058, - 0.05630133299928275, - 0.06872772499991697, - 0.06276476199855097, - 0.06393379700239166, - 0.08132730999932392, - 0.05510298499939381, - 0.05682307499955641, - 0.05910154500088538, - 0.10593643500033068, - 0.11815760099852923, - 0.09483234499930404, - 0.12846658600028604, - 0.09659131400258048, - 0.09501996000108193, - 0.0954250350005168, - 0.09966654399977415, - 0.09227550299692666, - 0.08630111800084705, - 0.0975027400018007, - 0.0669736309973814, - 0.25219274300252437, - 0.17760137900040718, - 0.09352386600221507, - 0.09120794000045862, - 0.06910034500106121, - 0.09869582499959506, - 0.09936388899950543, - 0.08486230000198702, - 0.0649020439996093, - 0.0838134590012487, - 0.06431156400140026, - 0.10876256499977899, - 0.07613403999857837, - 0.08114380899860407, - 0.07030104400109849, - 0.06638048700187937, - 0.06496776199855958, - 0.058256964999600314, - 0.07466861200009589, - 0.06877180200172006, - 0.09278434900261345, - 0.09456835400123964, - 0.07485860099768615, - 0.05071483899882878, - 0.046172893002221826, - 0.06137925000075484, - 0.05588075500054401, - 0.06728630299767246, - 0.058633177999581676, - 0.060626251997746294, - 0.0708806309994543, - 0.07586940200053505, - 0.06528588400033186, - 0.082324538998364, - 0.0747122409993608, - 0.08613871400302742, - 0.09409738199974527, - 0.07368804499856196, - 0.058481282998400275, - 0.06898171899956651, - 0.07905184799892595, - 0.11491965500317747, - 0.10068796399718849 - ], - "avg_time_seconds": 0.08133175063992894, - "min_time_seconds": 0.04389704500135849, - "max_time_seconds": 0.33274306999737746, - "avg_time_per_position_ms": 1.6266350127985787, - "total_time_seconds": 16.26635012798579 -} \ No newline at end of file diff --git a/EventDriven/riskmanager/position/cogs/benchmarks/task5_results.json b/EventDriven/riskmanager/position/cogs/benchmarks/task5_results.json deleted file mode 100644 index 8fa5911..0000000 --- a/EventDriven/riskmanager/position/cogs/benchmarks/task5_results.json +++ /dev/null @@ -1,212 +0,0 @@ -{ - "timestamp": "2025-11-28T21:46:57.959437", - "iterations": 200, - "num_positions": 50, - "timings_seconds": [ - 0.1089219339992269, - 0.09802097400097409, - 0.08703202399919974, - 0.11088276900045457, - 0.08726841799943941, - 0.0887409149981977, - 0.12584279300062917, - 0.1398369790003926, - 0.14138886100045056, - 0.1917432420013938, - 0.164501259001554, - 0.10886575600306969, - 0.16109909700026037, - 0.1790011160010181, - 0.27850061200297205, - 0.1507456559993443, - 0.21767190999889863, - 0.11462807700081612, - 0.13145842800076935, - 0.1914327439990302, - 0.12907303900283296, - 0.13861405300121987, - 0.14326140999764903, - 0.1269289440024295, - 0.14512716999888653, - 0.1671772770023381, - 0.12246256499929586, - 0.11078518000067561, - 0.10707120000006398, - 0.1137628640026378, - 0.10230016900095507, - 0.1825071429993841, - 0.15006474999972852, - 0.30487448799976846, - 0.10314669599756598, - 0.11122290400089696, - 0.09909520699875429, - 0.09748298100021202, - 0.17285977199935587, - 0.14450798800316988, - 0.15999174500029767, - 0.14564863700070418, - 0.1623018870013766, - 0.1505768019997049, - 0.10889471499831416, - 0.23049596000055317, - 0.11448908199963626, - 0.19225260299936053, - 0.16447250099736266, - 0.1651954509979987, - 0.19219014900227194, - 0.21509622699886677, - 0.09442325400232221, - 0.11811021199901006, - 0.10741977200086694, - 0.12378941700080759, - 0.15648619000057806, - 0.09273830199890654, - 0.06674855099845445, - 0.0757124850024411, - 0.0583316720003495, - 0.08974741400015773, - 0.08481783900060691, - 0.10336219999953755, - 0.0765874780008744, - 0.08255783100321423, - 0.08995549700193806, - 0.08111147100134986, - 0.07566160400165245, - 0.06949973799783038, - 0.08224309700017329, - 0.08162861399978283, - 0.06371668499923544, - 0.06468968599801883, - 0.09802857999966363, - 0.08314200599852484, - 0.06810568900255021, - 0.0748133710003458, - 0.07478377300139982, - 0.05910509299792466, - 0.061048618001223076, - 0.05885989599846653, - 0.07286871899850667, - 0.07594551399961347, - 0.07134067299921298, - 0.09402994600168313, - 0.08900329700190923, - 0.08878073199957726, - 0.07075972899838234, - 0.08073401000001468, - 0.07516645799842081, - 0.0707428979985707, - 0.07791603300211136, - 0.07881576799991308, - 0.07360145199709223, - 0.07437466699775541, - 0.07691888999761431, - 0.07676005300163524, - 0.08020747399859829, - 0.07258554600048228, - 0.08173184900078923, - 0.06993334100116044, - 0.07966748699982418, - 0.07864050699936342, - 0.07727664900085074, - 0.06874230100220302, - 0.1072475389992178, - 0.08666552499926183, - 0.08205463400008739, - 0.07733792900035041, - 0.0569605490018148, - 0.08128852699883282, - 0.09288220899907174, - 0.08599323100133915, - 0.11154435399657814, - 0.06861060400115093, - 0.06242495699916617, - 0.06451409000146668, - 0.07543261200044071, - 0.07094991800113348, - 0.07735480699921027, - 0.1502909289993113, - 0.08450783200169099, - 0.08682149599917466, - 0.13222767299885163, - 0.11421083200184512, - 0.058172469998680754, - 0.055735654997988604, - 0.05328968299727421, - 0.05519250400175224, - 0.05721537899808027, - 0.062530892999348, - 0.06718504600212327, - 0.06834791800065432, - 0.07306059599795844, - 0.07863593900037813, - 0.06710431299870834, - 0.06848555599935935, - 0.07531626700074412, - 0.06510260600043694, - 0.05529627900250489, - 0.059315392001735745, - 0.07427294700028142, - 0.07650540499889757, - 0.0625698400035617, - 0.0560887539977557, - 0.07187026300016441, - 0.19427029299913556, - 0.11880223299885984, - 0.10030705200188095, - 0.06772127800286398, - 0.07203302899870323, - 0.06908680900232866, - 0.06489372400028515, - 0.05595659900063765, - 0.06033889000173076, - 0.055176201996800955, - 0.060114544998214114, - 0.0531776540010469, - 0.055032790998666314, - 0.06155645700346213, - 0.053624201002094196, - 0.05433184200228425, - 0.054823727998154936, - 0.053664212002331624, - 0.05385077800019644, - 0.07174393300010706, - 0.10222304299895768, - 0.05976189200009685, - 0.05576328499955707, - 0.09459074200276518, - 0.10507479199804948, - 0.07043334799891454, - 0.08086410500254715, - 0.07043009200060624, - 0.09884305900050094, - 0.06069126900183619, - 0.060669990998576395, - 0.06453101100123604, - 0.09901672400155803, - 0.08923638200212736, - 0.07230939299915917, - 0.071288375002041, - 0.055112072001065826, - 0.05964980499993544, - 0.08920362199933152, - 0.06772691000151099, - 0.070233072998235, - 0.05972989499787218, - 0.05990275500153075, - 0.05614232500010985, - 0.05420120499911718, - 0.054162999000254786, - 0.07050136000179918, - 0.07551115000023856, - 0.06602066900086356, - 0.07187284599785926, - 0.07040314600089914, - 0.05422723800074891, - 0.056120690001989715 - ], - "avg_time_seconds": 0.09466427308017955, - "min_time_seconds": 0.0531776540010469, - "max_time_seconds": 0.30487448799976846, - "avg_time_per_position_ms": 1.893285461603591, - "total_time_seconds": 18.93285461603591 -} \ No newline at end of file diff --git a/EventDriven/riskmanager/position/cogs/limits.py b/EventDriven/riskmanager/position/cogs/limits.py index 185d0dd..bb3b66c 100644 --- a/EventDriven/riskmanager/position/cogs/limits.py +++ b/EventDriven/riskmanager/position/cogs/limits.py @@ -244,7 +244,7 @@ ) from .vars import MEASURES_SET -logger = setup_logger("EventDriven.riskmanager.position.cogs.limits", stream_log_level="WARNING") +logger = setup_logger("EventDriven.riskmanager.position.cogs.limits", stream_log_level="INFO") @dataclass @@ -255,9 +255,11 @@ class _LimitsMetaData: scalar: float sizing_lev: float delta_lmt: float - delta: Optional[float] = None + delta_per_contract: Optional[float] = None option_price: Optional[float] = None undl_price: Optional[float] = None + prev_quantity: Optional[int] = None + new_quantity: Optional[int] = None class LimitsAndSizingCog(BaseCog): @@ -369,10 +371,11 @@ def _create_position_metadata(self, new_pos_state: NewPositionState) -> None: signal_id=order["signal_id"], scalar=scalar, sizing_lev=self.sizer_configs.sizing_lev, - delta=delta, + delta_per_contract=delta, option_price=option_price, undl_price=undl_data.chain_spot["close"], delta_lmt=new_pos_state.limits.delta, + new_quantity=order["data"]["quantity"], ) logger.info(f"Storing position metadata: {metadata}") self.position_metadata[order["data"]["trade_id"]] = metadata @@ -433,6 +436,7 @@ def _update_position_quantity(self, new_position_state: NewPositionState) -> Non logger.warning( f"Calculated position size is 0 for order {order['data']['trade_id']}. Delta per contract ({delta}) exceeds limit {delta_lmt}." ) + logger.info(f"Updated position quantity to {q} for order {order['data']['trade_id']}.") new_position_state.order = Order.from_dict(order_dict) def _analyze_impl(self, portfolio_context: PositionAnalysisContext) -> CogActions: diff --git a/EventDriven/riskmanager/sizer/_utils.py b/EventDriven/riskmanager/sizer/_utils.py index 20a4244..0a2e620 100644 --- a/EventDriven/riskmanager/sizer/_utils.py +++ b/EventDriven/riskmanager/sizer/_utils.py @@ -169,7 +169,7 @@ import pandas as pd from EventDriven.riskmanager.utils import logger from ..._vars import Y2_LAGGED_START_DATE -from ..market_data import get_timeseries_obj +from trade.datamanager.market_data import get_timeseries_obj def default_delta_limit( @@ -238,9 +238,9 @@ def delta_position_sizing( int: The calculated position size.""" ## TODO: Add docstring ## TODO: Raise error if delta is 0 or cash_available is <= 0 - if delta == 0 or cash_available <= 0 or option_price_at_time <= 0: + if delta == 0 or math.isnan(delta) or cash_available <= 0 or option_price_at_time <= 0: logger.critical( - f"Delta is 0 or cash_available is <= 0 or option_price_at_time <= 0. delta: {delta}, cash_available: {cash_available}, option_price_at_time: {option_price_at_time}. This is intended to be long only sizing. Returning 0." + f"Delta is 0/NaN or cash_available is <= 0 or option_price_at_time <= 0. delta: {delta}, cash_available: {cash_available}, option_price_at_time: {option_price_at_time}. This is intended to be long only sizing. Returning 0." ) return 0 try: @@ -368,7 +368,7 @@ def load_scalers(self, syms: list = None, force=False) -> None: """ ## Get timeseries object - timeseries = get_timeseries_obj() + timeseries = get_timeseries_obj(live=True) ## If syms is None, use the existing syms ## This is to avoid reloading timeseries if already loaded @@ -398,9 +398,9 @@ def load_scalers(self, syms: list = None, force=False) -> None: ## Load timeseries for each symbol and calculate the z-score scaler for sym in syms: timeseries.load_timeseries( - sym=sym, start_date=Y2_LAGGED_START_DATE, end_date=datetime.now(), interval=self.interval + sym=sym, start_date=Y2_LAGGED_START_DATE, end_date=datetime.now() ) - ts = timeseries.get_timeseries(sym=sym, interval=self.interval).spot["close"] + ts = timeseries.get_timeseries(sym=sym).spot["close"] if self.vol_type == "window": func = lambda x: realized_vol(x, self.rvol_window) diff --git a/EventDriven/riskmanager/utils.py b/EventDriven/riskmanager/utils.py index 34d9a7e..96d3c40 100644 --- a/EventDriven/riskmanager/utils.py +++ b/EventDriven/riskmanager/utils.py @@ -115,11 +115,7 @@ - Type: C (call) or P (put) - Direction: long or short -Data Manager Integration: - - OptionDataManager: Main interface for option pricing - - CachedOptionDataManager: Cached version for performance - - Automatic switch between implementations - - MySQL query optimization flags + Signal Handling: - Registers cleanup on SIGTERM (15) @@ -186,8 +182,10 @@ from .config import get_avoid_opticks import functools from trade.assets.helpers.utils import swap_ticker -from module_test.raw_code.DataManagers.DataManagers import OptionDataManager # noqa -from module_test.raw_code.DataManagers.DataManagers_cached import CachedOptionDataManager # noqa +from trade.datamanager.loaders import load_full_option_data +# from trade.datamanager.vars import get_times_series +from trade.datamanager._enums import DivType +from trade.datamanager.utils.date import sync_date_index from trade.helpers.helper import generate_option_tick_new, parse_option_tick, CustomCache, change_to_last_busday from dbase.DataAPI.ThetaData import retrieve_bulk_open_interest, retrieve_chain_bulk from pandas.tseries.offsets import BDay @@ -502,43 +500,78 @@ def save_to_cache(id, date, spot): ##UTILS -def load_position_data(opttick, processed_option_data, start, end, s, r, y, s0_close): +def load_position_data_new(opttick, processed_option_data, start, end) -> pd.DataFrame: """ - Load position data for a given option tick. + Load position data for a given option tick using the new data loading method. args: opttick (str): The option tick to load data for. processed_option_data (dict): A dictionary to store processed option data. start (str|datetime): The start date for the data. end (str|datetime): The end date for the data. - s (pd.Series): The spot price series. Must be split adjusted. - r (pd.Series): The risk-free rate series. - y (pd.Series): The dividend yield series. - s0_close (pd.Series): The close price of the underlying asset series. - This function ONLY retrives the data for the option tick, it does not apply any splits or adjustments. - This function will NOT check for splits or special dividends. It will only retrieve the data for the given option tick. + This function retrieves the data for the given option tick using the new data loading method. + It does not apply any splits or adjustments. It will only retrieve the data for the given option tick. """ + import time ## Check if the option tick is already processed if opttick in processed_option_data: return processed_option_data[opttick] ## Get Meta - meta = parse_option_tick(opttick) + option_meta = parse_option_tick(opttick) + start_time = time.time() + new_data = load_full_option_data( + symbol=option_meta["ticker"], + expiration=option_meta["exp_date"], + strike=option_meta["strike"], + right=option_meta["put_call"], + start_date=start, + end_date=end, + dividend_type=DivType.CONTINUOUS + ) + logger.info(f"Data loading for {opttick} took {time.time() - start_time:.2f} seconds") + + ## Convert to DataFrame for easier comparison + greeks = new_data.greek.timeseries + option_spot = new_data.option_spot.timeseries + s = new_data.spot.timeseries + y = new_data.dividend.timeseries + r = new_data.rates.timeseries + greeks, option_spot, s, y, r = sync_date_index(greeks, option_spot, s, y, r) + + + ## set names properly + start_time = time.time() + s.name = "s" + y.name = "y" + r.name = "r" + data = greeks.join(option_spot[["midpoint", "closeask", "closebid"]]) + data.columns = data.columns.str.capitalize() + data = data.join(s).join(y).join(r) + logger.info(f"Data processing for {opttick} took {time.time() - start_time:.2f} seconds") + processed_option_data[opttick] = data + return data ## Generate data - data = generate_spot_greeks(opttick, start_date=start, end_date=end) - data = enrich_data( - data, - meta["ticker"], - s[s.index.isin(data.index)], - r[r.index.isin(data.index)], - y[y.index.isin(data.index)], - s0_close[s0_close.index.isin(data.index)], - ) + data = new_generate_spot_greeks(opttick, start_date=start, end_date=end) processed_option_data[opttick] = data return data +def load_position_data(opttick, processed_option_data, start, end, *args, **kwargs) -> pd.DataFrame: + """ + Load position data for a given position ID. + + args: + opttick (str): The option tick to load data for. + processed_option_data (dict): A dictionary to store processed option data. + start (str|datetime): The start date for the data. + end (str|datetime): The end date for the data. + + This function retrieves the data for the given position ID. It applies any necessary splits or adjustments. + It will retrieve the data for all option ticks in the position ID and concatenate them together. + """ + return load_position_data_new(opttick, processed_option_data, start, end) def enrich_data(data, ticker, s, r, y, s0_close): """ @@ -561,29 +594,25 @@ def enrich_data(data, ticker, s, r, y, s0_close): return data -def generate_spot_greeks(opttick, start_date: str | datetime, end_date: str | datetime) -> pd.DataFrame: - """ - Generate spot greeks for a given option tick. - """ - ## PRICE_ON_TO_DO: NO NEED TO CHANGE. This is necessary retrievals - # meta = parse_option_tick(opttick) - data_manager = OptionDataManager(opttick=opttick) - greeks = data_manager.get_timeseries( - start=start_date, - end=end_date, - interval="1d", - type_="greeks", - ).post_processed_data ## Multiply by the shift to account for splits - greeks_cols = [x for x in greeks.columns if "Midpoint" in x] - greeks = greeks[greeks_cols] - greeks[greeks_cols] = greeks[greeks_cols].replace(0, np.nan).fillna(method="ffill") - greeks.columns = [x.split("_")[1].capitalize() for x in greeks.columns] - - spot = data_manager.get_timeseries( - start=start_date, end=end_date, interval="1d", type_="spot", extra_cols=["bid", "ask"] - ).post_processed_data ## Using chain spot data to account for splits - spot = spot[["Midpoint", "Closeask", "Closebid"]] ## This is raw calc place - data = greeks.join(spot) + +def new_generate_spot_greeks(opttick, start_date: str | datetime, end_date: str | datetime) -> pd.DataFrame: + """ + Generate spot greeks for a given option tick using the load_full_data. + """ + option_meta = parse_option_tick(opttick) + new_data = load_full_option_data( + symbol=option_meta["ticker"], + expiration=option_meta["exp_date"], + strike=option_meta["strike"], + right=option_meta["put_call"], + start_date=start_date, + end_date=end_date, + ) + ## Convert to DataFrame for easier comparison + greeks = new_data.greek.timeseries + option_spot = new_data.option_spot.timeseries + data = greeks.join(option_spot[["midpoint", "closeask", "closebid"]]) + data.columns = data.columns.str.capitalize() return data diff --git a/EventDriven/riskmanager_decomm.py b/EventDriven/riskmanager_decomm.py deleted file mode 100644 index d76c596..0000000 --- a/EventDriven/riskmanager_decomm.py +++ /dev/null @@ -1,1507 +0,0 @@ -# import os, sys -# from trade.assets.Stock import Stock -# from trade.assets.Option import Option -# from trade.assets.OptionStructure import OptionStructure -# from trade.assets.Calculate import Calculate -# from trade.assets.rates import get_risk_free_rate_helper -# from trade.assets.helpers.DataManagers import OptionDataManager -# from trade.helpers.Context import Context, clear_context -# from trade.helpers.helper import (change_to_last_busday, -# is_USholiday, -# is_busday, -# setup_logger, -# generate_option_tick_new, -# get_option_specifics_from_key, -# parse_option_tick, -# binomial_implied_vol) -# from dbase.DataAPI.ThetaData import (list_contracts, -# retrieve_openInterest, -# retrieve_eod_ohlc, -# retrieve_bulk_eod, -# retrieve_bulk_open_interest -# ) -# from pandas.tseries.offsets import BDay -# from pandas.tseries.holiday import USFederalHolidayCalendar -# from trade.helpers.decorators import log_error_with_stack, log_time -# from itertools import product -# import pandas as pd -# from copy import deepcopy -# from trade.helpers.Logging import setup_logger -# from trade.helpers.decorators import log_error_with_stack -# from pathos.multiprocessing import ProcessingPool as Pool -# from trade.helpers.threads import runThreads -# from trade.helpers.types import OptionModelAttributes -# from EventDriven.types import ResultsEnum -# import numpy as np -# import time -# from datetime import datetime -# import math -# from EventDriven.event import FillEvent -# from EventDriven.helpers import parse_signal_id -# from EventDriven.data import DataHandler -# from EventDriven.eventScheduler import EventScheduler -# from EventDriven.types import EventTypes, ResultsEnum -# from threading import Thread, Lock -# from trade import POOL_ENABLED -# import multiprocessing as mp -# from module_test.raw_code.DataManagers.DataManagers import ( -# BulkOptionQueryRequestParameter, -# BulkOptionDataManager, -# handle_extra_cols, -# build_name_format, -# extract_numeric_value, -# enforce_interval, -# enforce_inputs, -# determine_table_agg, -# determine_requested_columns, -# init_query, - -# ) -# from typing import List, Tuple -# from functools import partial -# from dbase.utils import default_timestamp, bus_range, add_eod_timestamp -# from trade import HOLIDAY_SET - -# ## To-Do: -# ## 1. Filter out contracts that have already been queried. Saves time -# ## 2. Move cache to class attribute. - - -# logger = setup_logger('QuantTools.EventDriven.riskmanager') -# time_logger = setup_logger('QuantTools.EventDriven.riskmanager.time') -# LOOKBACKS = {} - -# def _retrieve_openInterest(*args, **kwargs): -# try: -# return retrieve_openInterest(*args, **kwargs) -# except Exception as e: -# return None - - - -# # Precompute BDay lookbacks to eliminate redundant calculations -# def precompute_lookbacks(start_date, end_date, _range = [10, 20, 30]): - -# ## Extending to allow for multiple lookbacks -# global LOOKBACKS -# trading_days = pd.date_range(start=start_date, end=end_date, freq=BDay()) -# if len(LOOKBACKS) == 0: -# lookback_cache = {x.strftime('%Y-%m-%d'): {} for x in trading_days} -# else: -# lookback_cache = LOOKBACKS -# for date in trading_days: -# dates = {x: (date - BDay(x)).strftime('%Y-%m-%d') for x in _range} -# lookback_cache[date.strftime('%Y-%m-%d')].update(dates) -# LOOKBACKS = lookback_cache - -# precompute_lookbacks('2000-01-01', '2030-12-31') - -# # Function to check if a date is a holiday -# def is_holiday(date): -# return date in HOLIDAY_SET - -# chain_cache = {} -# close_cache = {} -# oi_cache = {} -# spot_cache = {} -# order_cache = {} - - -# def clear_cache(): -# """ -# clears the cache -# """ -# global chain_cache, close_cache, oi_cache, spot_cache, order_cache -# chain_cache = {} -# close_cache = {} -# oi_cache = {} -# spot_cache = {} -# order_cache = {} - - - -# def check_all_days_available(x, _start, _end): -# # print(x) -# date_range = bus_range(_start, _start, freq = '1B') -# dates_available = x.Datetime -# missing_dates_second_check = [x for x in date_range if x not in pd.DatetimeIndex(dates_available)] -# return all(x in pd.DatetimeIndex(dates_available) for x in date_range) - -# def update_caches(x): -# global oi_cache, close_cache, oi_cache, spot_cache -# key = f"{x.Optiontick.unique()[0]}" -# x = x.set_index('Datetime') -# close_cache[key] = x -# oi_cache[key] = x['Openinterest'].to_frame(name = 'Open_interest') -# pass - - -# def update_cache_with_missing_ticks(query_ticks, data_request): -# global oi_cache, close_cache, oi_cache, spot_cache -# parsed_opts = pd.DataFrame([parse_option_tick(x) for x in query_ticks]) -# parsed_opts[['start_date', 'end_date']] = data_request.start_date, data_request.end_date -# OrderedList = parsed_opts[['ticker', 'end_date', 'exp_date', 'put_call', 'start_date', 'strike', ]].T.to_numpy() -# tickOrderedList = parsed_opts[['ticker', 'put_call', 'exp_date', 'strike', ]].T.to_numpy() -# eod_results = (runThreads(retrieve_eod_ohlc, OrderedList, 'map', block=False)) -# oi_results = (runThreads(_retrieve_openInterest, OrderedList, 'map' , block=False)) -# tick_results = (runThreads(generate_option_tick_new, tickOrderedList, 'map' , block=False)) - -# eod_results = list(eod_results) -# oi_results = list(oi_results) -# tick_results = list(tick_results) - -# for oi, eod, tick in zip(oi_results, eod_results, tick_results): -# cache_key = f"{tick}" -# eod.index = default_timestamp(eod.index) -# close_cache[cache_key] = eod -# oi_cache[cache_key] = oi - -# return - - - - - -# def assemble_bulk_data_request(self, start: str | datetime, -# end: str | datetime, -# interval: str = '1d', -# type_: str = 'spot', -# strikes_right: List[Tuple] = [], -# model: str = 'bs', -# extra_cols: list = []) : -# start = pd.to_datetime(start) -# end = pd.to_datetime(end) -# ivl_str, ivl_int = extract_numeric_value(interval) -# greek_names = self.greek_names -# _extra_cols = handle_extra_cols(extra_cols, type_, model) -# greek_cols = build_name_format('greek', model, extra_cols, self.default_fill) -# vol_cols = build_name_format('vol', model, extra_cols, self.default_fill) - - -# ## Enforce the interval -# enforce_interval(ivl_str) - -# ## Assert inputs -# enforce_inputs(type_, model) - -# ## Determine aggregation -# agg, database, table = determine_table_agg(ivl_str, type_, greek_names) -# input_params = getattr(self, agg) - -# ## Determine the requested columns -# requested_col = determine_requested_columns(self.default_fill, type_, model, greek_names) - -# data_request = BulkOptionQueryRequestParameter(table_name=table, -# db_name=database, -# start_date=start, -# end_date=end, -# ticker=self.symbol, -# exp=self.exp, -# strikes=strikes_right) - -# ## Set the parameters for the request to avoid having too many attributes -# data_request.symbol = self.symbol -# data_request.interval= interval -# data_request.type_ = type_ -# data_request.input_params = input_params -# data_request.model = model -# data_request.ivl_str = ivl_str -# data_request.ivl_int = ivl_int -# data_request.default_fill = self.default_fill -# data_request.agg = agg -# data_request.requested_col = requested_col + _extra_cols + ['optiontick'] -# data_request.iv_cols = vol_cols -# data_request.greek_cols = greek_cols -# data_request.col_kwargs = col_kwargs = {'underlier_price': 's0', -# 'expiration': 'exp_date', -# 'strike': 'k', -# 'right': 'right', -# 'rf_rate': 'r', -# 'dividend': 'y', -# 'put/call': 'right', -# 'datetime': 'datetime',} -# return data_request - - -# @log_error_with_stack(logger) -# def populate_cache_v1(start_date, -# end_date, -# order_candidates, -# target_date,) -> str|None: - -# """ -# populates the cache with the necessary data for the order candidates - -# params: -# order_candidates: dict: dictionary containing the order candidates -# example: {'type': 'naked', -# 'specifics': [{'direction': 'long', -# 'rel_strike': .900, -# 'dte': 365, -# 'moneyness_width': 0.15}, -# {'direction': 'short', -# 'rel_strike': .80, -# 'dte': 365, -# 'moneyness_width': 0.15}], - -# 'name': 'vertical_spread'} -# date: str: date to populate the cache for - -# returns: -# str|None: returns 'holiday' if the date is a holiday, 'theta_data_error' if there is an error in the theta data, None otherwise -# """ -# global close_cache, oi_cache, spot_cache - -# tempholder1 = {} -# tempholder2 = {} - -# if is_holiday(target_date): -# return 'holiday' - -# else: - -# ## Create necessary data structures -# ## Looping through the order candidates to get the necessary data, and organize into a list of lists that will be passed to runProcesses function -# for j, direction in enumerate(order_candidates): -# for i,data in enumerate(order_candidates[direction]): -# if isinstance(data, str) and data =='theta_data_error': -# return 'theta_data_error' - -# data[[ 'exp', 'strike', 'symbol', 'right']] = data[[ 'Expiration', 'Strike', 'ticker', 'Right']] -# if pd.to_datetime(target_date).weekday() >= 5: -# return 'weekend' -# data[['end_date', 'start_date']] = end_date, start_date -# data['exp'] = data['exp'].dt.strftime('%Y-%m-%d') -# tempholder1[i+j] = (data[['symbol', 'end_date', 'exp', 'right', 'start_date', 'strike']].T.values.tolist()) -# tempholder2[i+j] = data[['symbol', 'right', 'exp','strike']].T.values.tolist() -# symbol = data['symbol'].unique()[0] -# expiration = data['exp'].unique()[0] - -# ## Extending lists, to ensure only one runProcesses call is made, instead of run per side -# for i, data in tempholder1.items(): -# if i == 0: -# OrderedList = data -# tickOrderedList = tempholder2[i] -# else: -# for position, vars in enumerate(data): -# OrderedList[position].extend(vars) -# for position, vars in enumerate(tempholder2[i]): -# tickOrderedList[position].extend(vars) - - - - -# eod_results = (runThreads(retrieve_eod_ohlc, OrderedList, 'map')) -# oi_results = (runThreads(_retrieve_openInterest, OrderedList, 'map')) -# tick_results = (runThreads(generate_option_tick_new, tickOrderedList, 'map')) - -# ## Save to Dictionary Cache -# print("Updating Cache") -# for tick, eod, oi in zip(tick_results, eod_results, oi_results): -# cache_key = f"{tick}" -# close_cache[cache_key] = eod -# oi_cache[cache_key] = oi - -# spot_results = runThreads(return_closePrice, [tick_results, [target_date]*len(tick_results)], 'map') -# for tick, spot in zip(tick_results, spot_results): -# cache_key = f"{tick}_{target_date}" -# spot_cache[cache_key] = spot - - -# @log_error_with_stack(logger) -# def populate_cache_v2( -# start, -# end, -# candidates, -# target_date, -# ): -# """ -# populates the cache with the necessary data for the order candidates -# This version will improve on the previous one by using the new BulkOptionDataManager -# The goal is to make use of our database to speed up queries where possible - -# params: -# candidates: dict: dictionary containing the order candidates -# example: {'type': 'naked', -# 'specifics': [{'direction': 'long', -# 'rel_strike': .900, -# 'dte': 365, -# 'moneyness_width': 0.15}, -# {'direction': 'short', -# 'rel_strike': .80, -# 'dte': 365, -# 'moneyness_width': 0.15}], - -# 'name': 'vertical_spread'} -# start: str: date to populate the cache for -# end: str: date to populate the cache for -# target_date: str: date to populate the cache for - -# returns: -# str|None: returns 'holiday' if the date is a holiday, 'theta_data_error' if there is an error in the theta data, None otherwise -# """ - -# print(f"Looks like our young fellow is targetting: {target_date}") -# global oi_cache, close_cache, oi_cache, spot_cache -# start, end = pd.to_datetime(start), pd.to_datetime(end) -# full_data = pd.DataFrame() -# for direction in candidates: -# for data in candidates[direction]: -# if isinstance(data, str) and data =='theta_data_error': -# return 'theta_data_error' -# if pd.to_datetime(target_date).weekday() >= 5: -# return 'weekend' -# full_data = pd.concat([full_data, data], axis=0) - -# full_data.index.name = 'Date' -# full_data.columns.name = '' -# full_data['start_date'] = start -# full_data['end_date'] = end -# full_data.reset_index(inplace=True) -# tick = full_data.ticker.unique()[0] -# exp = full_data.Expiration.unique()[0] -# strikes_right = list(full_data[['Strike', 'Right']].itertuples(name=None, index=False)) - -# ## Let's start with getting the requested data from database -# manager = BulkOptionDataManager(symbol=tick, exp=exp) -# print(f"Generting Data for {manager.symbol} {manager.exp}") -# data_request = assemble_bulk_data_request( -# self = manager, -# start = start, -# end = end, -# type_ = 'spot', -# strikes_right= strikes_right - -# ) -# # ## Second: we query our database to see what data we have -# init_query(data_request = data_request, query_category = 'bulk') - -# # ## Third: we pre_process the data request to see if it is complete -# BulkOptionDataManager.pre_process_data(data_request = data_request) -# # BulkOptionDataManager.one_off_save( -# # start=start, -# # end=end, -# # tick=tick, -# # exp=exp -# # ) ## We shouldn't keep going to thetadata, that takes time. Submit a process. Don't worry it runs on a new process. -# ## Wouldn't affect current procedures - - -# is_complete = data_request.pre_process['is_complete'] -# pre_processed_data = data_request.pre_processed_data.reset_index() -# opttick = data_request.opttick -# print(f"Data Is_complete bool: {is_complete}") - -# ## If complete, Fantastic! We re done, now update cache and get out -# if is_complete: -# pre_processed_data.groupby('Optiontick').apply(update_caches) - -# ## If NOT complete, do not fret. We'll simply run our process for incomplete/missing ticks -# else: -# ## We first check for the requested ticks. Which one is not in database at all? -# missing_opttick = [x for x in data_request.opttick if x not in pre_processed_data.Optiontick.unique()] - -# ## Next we check to see if the requested opttick data is COMPELETE. -# ## If incomplete, we perform runthreads -# check_partial = partial(check_all_days_available, _start = data_request.start_date, _end = data_request.end_date) -# opttick_complete = pre_processed_data.groupby('Optiontick').apply(check_partial) -# query_ticks = opttick_complete[opttick_complete==False].index.tolist() + missing_opttick - -# ## Before we perform run Threads, it is important we update cache with the Optticks that are COMPLETE -# available = opttick_complete[opttick_complete==True].index -# pre_processed_data[pre_processed_data.Optiontick.isin(available)].groupby('Optiontick').apply(update_caches) - -# ## Now my dear friends, we update cache of unavailable ticks -# update_cache_with_missing_ticks(query_ticks=query_ticks, data_request=data_request) -# print("I'm proud of you, we are finally done") - -# print("Actually! We are not done yet. We need to get the spot prices for the requested date") - -# spot_results = runThreads(return_closePrice, [opttick, [target_date]*len(opttick)], 'map') -# for tick, spot in zip(opttick, spot_results): -# cache_key = f"{tick}_{target_date}" -# spot_cache[cache_key] = spot - -# print("Now, my dear friend, we are done") -# return - - -# def populate_cache(start_date, end_date, order_candidates, target_date, version = 2): - -# if version == 1: -# print("Using V1") -# return populate_cache_v1(start_date, end_date, order_candidates, target_date) -# elif version == 2: -# print("Using V2") -# return populate_cache_v2(start_date, end_date, order_candidates, target_date) - -# def return_closePrice(id: str, -# date: str) -> float: -# """ -# returns the close price of the option contract -# id: str: id of the option contract, corresponding to cache keys. -# ps: Use spot_cache.keys() to get the keys -# date: str: date to get the close price for - -# returns: -# float: close price of the option contract - -# """ -# global close_cache, spot_cache -# cache_key = f"{id}" ## Close Uses only the id, not the date -# close_data = close_cache[cache_key] -# if close_data is None: -# return None -# close_data = close_data[~close_data.index.duplicated(keep = 'first')] -# close = close_data['Midpoint'][date] -# return close - - -# def load_chain(date: str, -# ticker: str, -# print_stderr: bool = False) -> None: -# """ -# loads the option chain for the given date and ticker - -# params: -# date: str: date to load the chain for -# ticker: str: ticker to load the chain for -# print_stderr: bool: whether to print to stderr or not - -# returns: -# None - -# """ -# print(date, ticker) if print_stderr else None -# ## Get both calls and puts per moneyness. For 1 Moneyness, both will most be available. If not, if one is False, other True. -# ## We will need to get two rows. -# chain_key = f"{date}_{ticker}" -# with Context(end_date = date): -# if chain_key in chain_cache: -# Option_Chain = chain_cache[chain_key] -# else: -# start_time = time.time() -# Stock_obj = Stock(ticker, run_chain = False) -# end_time = time.time() -# print(f"Time taken to get stock object: {end_time-start_time}") if print_stderr else None -# Option_Chain = Stock_obj.option_chain() -# Spot = Stock_obj.spot(ts = False, spot_type = OptionModelAttributes.spot_type.name) ## need to use chain price to get the spot price, due to splits -# Spot = list(Spot.values())[0] -# Option_Chain['Spot'] = Spot -# Option_Chain['q'] = Stock_obj.div_yield() -# Option_Chain['r'] = Stock_obj.rf_rate -# chain_cache[chain_key] = Option_Chain - - - - - -# def chain_details(date: str, -# ticker: str, -# tgt_dte: int, -# tgt_moneyness: float, -# right: str ='P', -# moneyness_width: float =0.15, -# print_stderr: bool = False) -> pd.DataFrame: - - -# """ -# Returns the option chain details for the given date, ticker, target days to expiration, target moneyness, right, and moneyness width - -# params: -# date: str: date to get the chain for -# ticker: str: ticker to get the chain for -# tgt_dte: int: target days to expiration -# tgt_moneyness: float: target moneyness -# right: str: right of the option contract. Default is 'P' -# moneyness_width: float: moneyness width. Default is 0.15. This is the width of the moneyness spread -# print_stderr: bool: whether to print to stderr or not - -# returns: -# pd.DataFrame: option chain details -# """ -# return_dataframe = pd.DataFrame() -# errors = {} -# if is_holiday(date): # Replaced is_USholiday() with the optimized function -# return 'holiday' -# try: -# print(date, ticker) if print_stderr else None -# chain_key = f"{date}_{ticker}" -# with Context(end_date=date): -# if chain_key in chain_cache: -# Option_Chain = chain_cache[chain_key] -# else: -# start_time = time.time() -# Stock_obj = Stock(ticker, run_chain=False) -# end_time = time.time() -# print(f"Time taken to get stock object: {end_time-start_time}") if print_stderr else None -# try: -# Option_Chain = Stock_obj.option_chain() -# except: -# return 'theta_data_error' -# Spot = Stock_obj.spot(ts=False, spot_type=OptionModelAttributes.spot_type.value) ## need to use chain price to get the spot price, due to splits -# Spot = list(Spot.values())[0] -# Option_Chain['Spot'] = Spot -# Option_Chain['q'] = Stock_obj.div_yield() -# Option_Chain['r'] = Stock_obj.rf_rate -# chain_cache[chain_key] = Option_Chain - -# Option_Chain_Filtered = Option_Chain[Option_Chain[right.upper()]==True] - -# if right == 'P': -# Option_Chain_Filtered['relative_moneyness'] = Option_Chain_Filtered.index.get_level_values('Strike') / Option_Chain_Filtered.Spot -# elif right == 'C': -# Option_Chain_Filtered['relative_moneyness'] = Option_Chain_Filtered.Spot / Option_Chain_Filtered.index.get_level_values('Strike') -# else: -# raise ValueError(f'Right dne. received {right}') - -# Option_Chain_Filtered['moneyness_spread'] = (tgt_moneyness - Option_Chain_Filtered['relative_moneyness'])**2 -# Option_Chain_Filtered['dte_spread'] = (Option_Chain_Filtered.index.get_level_values('DTE') - tgt_dte)**2 -# Option_Chain_Filtered.sort_values(by=['dte_spread', 'moneyness_spread'], inplace=True) -# Option_Chain_Filtered = Option_Chain_Filtered.loc[Option_Chain_Filtered['dte_spread'] == Option_Chain_Filtered['dte_spread'].min()] - -# if float(moneyness_width) == 0.0: -# option_details = Option_Chain_Filtered.sort_values('moneyness_spread', ascending=False).head(1) -# else: -# option_details = Option_Chain_Filtered[(Option_Chain_Filtered['relative_moneyness'] >= tgt_moneyness - moneyness_width) & -# (Option_Chain_Filtered['relative_moneyness'] <= tgt_moneyness + moneyness_width)] - -# if option_details.empty: -# return None - -# option_details['build_date'] = date -# option_details['ticker'] = ticker -# option_details['moneyness'] = tgt_moneyness -# option_details['TGT_DTE'] = tgt_dte -# option_details.reset_index(inplace = True) -# option_details.set_index('build_date', inplace = True) -# option_details['Right'] = right -# option_details.drop(columns = ['C','P'], inplace = True) -# option_details['option_id'] = option_details.apply(lambda x: generate_option_tick_new(symbol = x['ticker'], -# exp = x['Expiration'].strftime('%Y-%m-%d'), strike = float(x['Strike']), right = x['Right']), axis = 1) -# return_dataframe = pd.concat([return_dataframe, option_details]) -# clear_context() -# return_dataframe.drop_duplicates(inplace = True) - -# except Exception as e: -# raise e -# return 'error' - - -# return return_dataframe.sort_values('relative_moneyness', ascending=False) - - - -# def available_close_check(id: str, -# date: str, -# threshold: float = 0.7, -# lookback: float = 30) -> bool: - -# """ -# checks if the close price is available for the given id and date - -# params: -# id: str: id of the option contract -# ps: Use spot_cache.keys() to get the available ids -# date: str: date to check the close price for -# threshold: float: threshold to check if the close price is available. Default is 0.7 - -# returns: -# bool: True if the close price is available, False otherwise -# """ -# cache_key = f"{id}" ## Close Uses only the id, not the date -# sample_id = deepcopy(get_option_specifics_from_key(id)) -# new_dict_keys = {'ticker': 'symbol', 'exp_date': 'exp', 'strike': 'strike', 'put_call': 'right'} -# transfer_dict = {} -# for k, v in sample_id.items(): -# if k in new_dict_keys: -# if k == 'strike': -# transfer_dict[new_dict_keys[k]] = float(sample_id[k]) -# else: -# transfer_dict[new_dict_keys[k]] = sample_id[k] - -# if cache_key in close_cache: -# close_data_sample = close_cache[cache_key] -# close_data_sample = close_data_sample[(~close_data_sample.index.duplicated(keep = 'first')) & (close_data_sample.index <= date)] ## Filter out duplicates, and only dates before the target date -# close_data_sample = close_data_sample.iloc[-lookback:] ## Get the last lookback days -# else: -# start = LOOKBACKS[date][lookback] # Used precomputed BDay(30) -# close_data_sample = retrieve_eod_ohlc(**transfer_dict, start_date=start, end_date=date) -# close_cache[cache_key] = close_data_sample -# close_mask_series = close_data_sample.Close != 0 -# return close_mask_series.sum()/len(close_mask_series) > threshold - - -# def produce_order_candidates(settings: dict, -# tick: str, -# date: str, -# right: str = 'P', -# thread: bool = False) -> dict: -# """ -# returns the order candidates for the given settings, tick, date, and right - -# params: -# settings: dict: settings for the order candidates -# example: {'type': 'naked', -# 'specifics': [{'direction': 'long', -# 'rel_strike': .900, -# 'dte': 365, -# 'moneyness_width': 0.15}, -# {'direction': 'short', -# 'rel_strike': .80, -# 'dte': 365, -# 'moneyness_width': 0.15}], - -# 'name': 'vertical_spread'} - -# tick: str: ticker to get the order candidates for -# date: str: date to get the order candidates for -# right: str: right of the option contract. Default is 'P' - -# returns: -# dict: order_candidates -# """ - -# def hacked_chain_details(*args, **kwargs): -# direction = kwargs.pop('direction') -# chain = chain_details(*args, **kwargs) -# order_candidates[direction].append(chain) - -# thread_lock = Lock() -# order_candidates = {'long': [], 'short': []} -# thread_list = [] -# if thread: -# for spec in settings['specifics']: -# _thread = Thread(target=hacked_chain_details, args=(date, tick, spec['dte'], spec['rel_strike'], right, spec['moneyness_width']), kwargs={'direction': spec['direction']}) -# _thread.start() -# thread_list.append(_thread) -# # chain = chain_details(date, tick, spec['dte'], spec['rel_strike'], right, moneyness_width = spec['moneyness_width'], direction = spec['direction']) -# # order_candidates[spec['direction']].append(chain) -# for thread in thread_list: -# thread.join() -# else: -# for spec in settings['specifics']: -# direction = spec['direction'] -# chain = chain_details(date, tick, spec['dte'], spec['rel_strike'], right, moneyness_width = spec['moneyness_width']) -# order_candidates[spec['direction']].append(chain) -# return order_candidates - - -# def liquidity_check(id: str, -# date: str, -# pass_threshold: int|float = 250, -# lookback: int = 10) -> bool: - -# """ -# returns True if the liquidity is greater than the pass_threshold, False otherwise - -# params: -# id: str: id of the option contract -# ps: Use oi_cache.keys() to get the available ids -# date: str: date to check the liquidity for -# pass_threshold: int|float: threshold to check if the liquidity is greater than. Default is 250 -# lookback: int: lookback to check the liquidity for. Default is 10 - -# returns: -# bool: True if the liquidity is greater than the pass_threshold, False otherwise -# """ -# sample_id = deepcopy(get_option_specifics_from_key(id)) -# new_dict_keys = {'ticker': 'symbol', 'exp_date': 'exp', 'strike': 'strike', 'put_call': 'right'} -# transfer_dict = {} - -# for k, v in sample_id.items(): - -# if k in new_dict_keys: -# if k == 'strike': -# transfer_dict[new_dict_keys[k]] = float(sample_id[k]) -# else: -# transfer_dict[new_dict_keys[k]] = sample_id[k] - -# start = LOOKBACKS[date][lookback] # Used precomputed BDay(30) -# oi_data = oi_cache[f"{id}"] ## OI Uses only the id, not the date -# if oi_data is None: -# return False -# oi_data = oi_data[~oi_data.index.duplicated(keep = 'first')] -# oi_data = oi_data[oi_data.Datetime <= date] -# oi_data = oi_data.iloc[-lookback:] ## Get the last lookback days - - -# if isinstance(oi_data, pd.DataFrame): -# if oi_data.empty: -# return False - -# elif oi_data is None: -# return False - -# oi_data = oi_data[~oi_data.index.duplicated(keep = 'first')] -# oi_data = oi_data.iloc[:lookback] -# # print(f'Open Interest > {pass_threshold} for {id}:', oi_data.Open_interest.mean() ) -# # return oi_data.Open_interest.mean() > pass_threshold if isinstance(oi_data, pd.DataFrame) else False -# return oi_data.Open_interest.sum()/lookback > pass_threshold if isinstance(oi_data, pd.DataFrame) else False - - - - -# class OrderPicker: -# def __init__(self, -# start_date: str|datetime, -# end_date: str|datetime, -# liquidity_threshold: int = 250, -# data_availability_threshold: float = 0.7, -# lookback: int = 30): -# """ -# initializes the OrderPicker class - -# params: -# liquidity_threshold: int: liquidity threshold. Default is 250 -# data_availability_threshold: float: data availability threshold. Default is 0.7 -# lookback: int: lookback. Default is 30 -# """ -# self.liquidity_threshold = liquidity_threshold -# self.data_availability_threshold = data_availability_threshold -# self.__lookback = lookback -# self.start_date = start_date -# self.end_date = end_date - -# @property -# def lookback(self): -# return self.__lookback - -# @lookback.setter -# def lookback(self, value): -# global LOOKBACKS -# initial_lookback_key = list(LOOKBACKS.keys())[0] -# if value not in LOOKBACKS[initial_lookback_key].keys(): -# precompute_lookbacks('2000-01-01', '2030-12-31', _range = [value]) -# self.__lookback = value - - -# @log_error_with_stack(logger) -# def get_order(self, -# tick: str, -# date: str, -# right: str, -# max_close: str, -# order_settings: dict) -> dict: - -# """ -# returns the order for the given tick, date, right, max_close, and order_settings - -# params: -# tick: str: ticker to get the order for -# date: str: date to get the order for -# right: str: right of the option contract (P or C) -# max_close: str: maximum close price -# order_settings: dict: settings for the order -# example: {'type': 'naked', -# 'specifics': [{'direction': 'long', -# 'rel_strike': .900, -# 'dte': 365, -# 'moneyness_width': 0.15}, -# {'direction': 'short', -# 'rel_strike': .80, -# 'dte': 365, -# 'moneyness_width': 0.15}], - -# 'name': 'vertical_spread'} - -# returns: -# dict: order -# """ -# global order_cache -# order_cache.setdefault(date, {}) -# order_cache[date].setdefault(tick, {}) - -# ## Create necessary data structures -# direction_index = {} -# str_direction_index = {} -# for indx, v in enumerate(order_settings['specifics']): -# if v['direction'] == 'long': -# str_direction_index[indx] = 'long' -# direction_index[indx] = 1 -# elif v['direction'] == 'short': -# str_direction_index[indx] = 'short' -# direction_index[indx] = -1 - - -# order_candidates = produce_order_candidates(order_settings, tick, date, right) -# if any([x2 is None for x in order_candidates.values() for x2 in x]): -# return_item = { -# 'result': "MONEYNESS_TOO_TIGHT", -# 'data': None -# } -# order_cache[date][tick] = return_item -# return return_item - - -# returned = populate_cache(order_candidates, target_date=date, start_date=self.start_date, end_date=self.end_date) - -# if returned == 'holiday': -# return_item = { -# 'result': "IS_HOLIDAY", -# 'data': None -# } -# order_cache[date][tick] = return_item -# return return_item - -# elif returned == 'theta_data_error': - -# return_item = { -# 'result': "UNAVAILABLE_CONTRACT", -# 'data': None -# } -# order_cache[date][tick] = return_item -# return return_item - -# elif returned == 'weekend': -# return_item = { -# 'result': "IS_WEEKEND", -# 'data': None -# } -# order_cache[date][tick] = return_item -# return return_item - - -# for direction in order_candidates: ## Fix this to use .items() -# for i,data in enumerate(order_candidates[direction]): -# data['liquidity_check'] = data.option_id.apply(lambda x: liquidity_check(x, date, pass_threshold=self.liquidity_threshold, lookback=self.lookback)) -# data = data[data.liquidity_check == True] -# if data.empty: -# return_item = { -# 'result': "TOO_ILLIQUID", -# 'data': None -# } -# order_cache[date][tick] = return_item -# return return_item - -# data['available_close_check'] = data.option_id.apply(lambda x: available_close_check(x, date, threshold=self.data_availability_threshold)) -# data = data[data.available_close_check == True] ## Filter out contracts that do not have close data. -# if data.empty: -# return_item = { -# 'result': "NO_TRADED_CLOSE", -# 'data': None -# } -# order_cache[date][tick] = return_item -# return return_item - -# # print("After Available Close Check") -# # print(data) -# order_candidates[direction][i] = data - - - -# ## Filter Unique Combinations per leg. -# unique_ids = {'long': [], 'short': []} -# for direction in order_candidates: -# for i,data in enumerate(order_candidates[direction]): -# unique_ids[direction].append(data[(data.liquidity_check == True) & (data.available_close_check == True)].option_id.unique().tolist()) - -# ## Produce Tradeable Combinations -# tradeable_ids = list(product(*unique_ids['long'], *unique_ids['short'])) -# tradeable_ids, unique_ids - -# ## Keep only unique combinations. Not repeating a contract. -# filtered = [t for t in tradeable_ids if len(set(t)) == len(t)] - - -# ## Get the price of the structure -# ## Using List Comprehension to sum the prices of the structure per index -# results = [ -# (*items, sum([direction_index[i] * spot_cache[f'{item}_{date}'] for i, item in enumerate(items)])) for items in filtered -# ] - -# ## Convert to DataFrame, and sort by the price of the structure. -# return_dataframe = pd.DataFrame(results) -# if return_dataframe.empty: -# return_item = { -# 'result': ResultsEnum.MONEYNESS_TOO_TIGHT.value, -# 'data': None -# } -# order_cache[date][tick] = return_item - -# return return_item -# cols = return_dataframe.columns.tolist() -# cols[-1] = 'close' -# return_dataframe.columns= cols -# # print(return_dataframe) -# return_dataframe = return_dataframe[(return_dataframe.close<= max_close) & (return_dataframe.close> 0)].sort_values('close', ascending = False).head(1) ## Implement for shorts. Filtering automatically removes shorts. - - -# if return_dataframe.empty: -# return_item = { -# 'result': ResultsEnum.MAX_PRICE_TOO_LOW.value, -# 'data': None -# } -# order_cache[date][tick] = return_item -# return return_item - -# ## Rename the columns to the direction names -# return_dataframe.columns = list(str_direction_index.values()) + ['close'] -# return_order = return_dataframe[list(str_direction_index.values())].to_dict(orient = 'list') -# return_order - -# ## Create the trade_id with the direction and the id of the contract. -# id = '' -# for k, v in return_order.items(): -# if len(v) > 0: -# id += f"&{k[0].upper()}:{v[0]}" -# return_order['trade_id'] = id -# return_order['close'] = return_dataframe.close.values[0] - -# return_dict = { -# 'result': ResultsEnum.SUCCESSFUL.value, -# 'data': return_order -# } -# order_cache[date][tick] = return_dict - -# return return_dict - -# class RiskManager: -# def __init__(self, -# bars: DataHandler, -# events: EventScheduler, -# initial_capital: int|float, -# start_date: str|datetime, -# end_date: str|datetime, -# portfolio_manager: 'Portfolio' = None, -# price_on = 'close', -# option_price = 'Midpoint', -# sizing_type = 'delta', -# leverage = 5.0, -# max_moneyness = 1.2, -# ): - -# """ -# initializes the RiskManager class - -# params: -# bars: Bars: bars -# events: Events: events -# initial_capital: float: initial capital -# start_date: str: start date, recommended to match with the start date of the bars -# end_date: str: end date, recommended to match with the end date of the bars -# portfolio_manager: PortfolioManager: portfolio manager. Default is None -# price_on: str: price on. Default is 'mkt_close' -# option_price: str: option price. The Option Price used for pricing. Default is 'Midpoint'. Available Options are 'Midpoint', 'Bid', 'Ask', 'Close', 'Weighted Midpoint' -# sizing_type: str: sizing type. This is what you want your quantity to be calculated on. Default is 'delta'. Available Options are 'delta', 'vega', 'gamma', 'price' -# leverage: float: Multiplier for Equity Equivalent Size. Default is 5.0. Eg (Cash Available/Spot Price) * Leverage = Equity Equivalent Size -# max_moneyness: float: Maximum Moneyness before rolling. Default is 1.2 - -# Other Attributes: - - -# """ - -# assert sizing_type in ['delta', 'vega', 'gamma', 'price'], f"Sizing Type {sizing_type} not recognized, expected 'delta', 'vega', 'gamma', or 'price'" -# self.bars = bars -# self.events = events -# self.initial_capital = initial_capital -# self.__pm = portfolio_manager -# self.start_date = start_date -# self.end_date = end_date -# self.symbol_list = self.bars.symbol_list -# self.OrderPicker = OrderPicker(start_date, end_date) -# self.spot_timeseries = {} -# self.chain_spot_timeseries = {} ## This is used for pricing, to account option strikes for splits -# self.processed_option_data = {} -# self.position_data = {} -# self.dividend_timeseries = {} -# self.sizing_type = sizing_type -# self.sizing_lev = leverage -# self.limits = { -# 'delta': True, -# 'gamma': False, -# 'vega': False, -# 'theta': False, -# 'dte': False, -# 'moneyness': False -# } -# self.greek_limits = { -# 'delta': {}, -# 'gamma': {}, -# 'vega': {}, -# 'theta': {} -# } -# self.data_managers = {} - -# ## Might want to make this changeable in future -# self.rf_timeseries = get_risk_free_rate_helper()['annualized'] -# self.price_on = price_on -# self.max_moneyness = max_moneyness -# self.option_price = option_price - - -# @property -# def option_data(self): -# global close_cache -# return close_cache - -# @property -# def pm(self): -# return self.__pm - -# @pm.setter -# def pm(self, value): -# self.__pm = value - - -# def print_settings(self): -# msg = f""" -# Risk Manager Settings: -# Start Date: {self.start_date} -# End Date: {self.end_date} -# Current Limits State (Position Adjusted when these thresholds are reached): -# Delta: {self.limits['delta']} -# Gamma: {self.limits['gamma']} -# Vega: {self.limits['vega']} -# Theta: {self.limits['theta']} -# Roll On DTE: {self.limits['dte']} -# Min DTE Threshold: {self.pm.min_acceptable_dte_threshold} -# Roll On Moneyness: {self.limits['moneyness']} -# Max Moneyness: {self.max_moneyness} -# Quanitity Sizing Type: {self.sizing_type} -# """ -# print(msg) - - -# def get_order(self, *args, **kwargs): -# signalID = kwargs.pop('signal_id') -# print(f"Signal ID: {signalID}") - -# ## I cannot calculate greeks here. I need option_data to be available first. -# order = self.OrderPicker.get_order(*args, **kwargs) -# print(f"Order Produced: {order}") - -# if order['result'] == ResultsEnum.SUCCESSFUL.value: -# position_id = order['data']['trade_id'] -# else: -# return order - -# print(f"Position ID: {position_id}") -# print("Calculating Position Greeks") -# self.calculate_position_greeks(position_id, kwargs['date']) -# print('Updating Signal Limits') -# self.update_greek_limits(signalID, position_id) -# print("Calculating Quantity") -# quantity = self.calculate_quantity(position_id, signalID, kwargs['date']) -# print(f"Quantity for Position ({position_id}): {quantity}") -# order['data']['quantity'] = quantity -# print(order) -# return order - - - - -# @log_time(time_logger) -# def calculate_position_greeks(self, positionID, date): -# """ -# Calculate the greeks of a position - -# date: Evaluation Date for the greeks (PS: This is not the pricing date) -# positionID: str: position string. (PS: This function assumes ticker for position is the same) -# """ - -# ## Initialize the Long and Short Lists -# long = [] -# short = [] -# threads = [] -# thread_input_list = [ -# [], [], [], [], [], [] -# ] - -# date = pd.to_datetime(date) ## Ensure date is in datetime format - -# ## First get position info -# position_dict, positon_meta = self.parse_position_id(positionID) - -# ## Now ensure that the spot and dividend data is available -# for p in position_dict.values(): -# for s in p: -# self.generate_data(s['ticker']) -# ticker = s['ticker'] - -# ## Get the spot, risk free rate, and dividend yield for the date -# s = self.chain_spot_timeseries[ticker] -# s0_close = self.spot_timeseries[ticker] -# r = self.rf_timeseries -# y = self.dividend_timeseries[ticker] - -# @log_time(time_logger) -# def get_timeseries(data_manager, s, r, y, s0_close, direction): -# greeks = data_manager.get_timeseries(start = self.start_date, -# end = self.end_date, -# interval = '1d', -# type_ = 'greeks',) -# greeks_cols = [x for x in greeks.columns if 'Midpoint' in x] -# greeks = greeks[greeks_cols] -# greeks.columns = [x.split('_')[1].capitalize() for x in greeks.columns] - -# spot = data_manager.get_timeseries(start = self.start_date, -# end = self.end_date, -# interval = '1d', -# type_ = 'spot',) -# spot = spot[[self.option_price.capitalize()]] -# # data[['symbol', 'put_call', 'exp_date', 'strike']] = data_manager.symbol, data_manager.put_call, data_manager.exp_date, data_manager.strike -# data = greeks.join(spot) -# data['s'] = s -# data['r'] = r -# data['y'] = y -# data['s0_close'] = s0_close -# self.processed_option_data[data_manager.opttick] = data -# if direction == 'L': -# long.append(data) -# elif direction == 'S': -# short.append(data) -# else: -# raise ValueError(f"Position Type {_set[0]} not recognized") - -# return data - -# ## Calculating IVs & Greeks for the options -# for _set in positon_meta: -# # To-do: Thread thisto speed up the process -# print(_set) -# id = _set[1] -# data_manager = OptionDataManager(opttick = id) -# for input, list_ in zip([data_manager, s, r, y, s0_close, _set[0]], thread_input_list): -# list_.append(input) - -# runThreads(get_timeseries, thread_input_list) - -# position_data = sum(long) - sum(short) -# position_data = position_data[~position_data.index.duplicated(keep = 'first')] -# self.position_data[positionID] = position_data -# self.position_data[positionID].columns = [x.capitalize() for x in self.position_data[positionID].columns] -# ## Retain the spot, risk free rate, and dividend yield for the position, after the greeks have been calculated & spread values subtracted -# self.position_data[positionID]['s0_close'] = s0_close -# self.position_data[positionID]['s'] = s -# self.position_data[positionID]['r'] = r -# self.position_data[positionID]['y'] = y - -# @log_time(time_logger) -# def update_greek_limits(self, signal_id, position_id): -# """ -# Updates the limits associated with a signal -# ps: This should only be updated on first purchase of the signal -# Limits are saved in absolute values to account for both long and short positions - -# """ - -# ## We want to update delta limits for now. -# ## This should be based on the SignalID. -# ## I will use The date from Signal ID To create the limit -# ## Goal is to enfore the limit on the signal, not the position - -# id_details = parse_signal_id(signal_id) -# cash_available = self.pm.allocated_cash_map[id_details['ticker']] -# delta_at_purchase = self.position_data[position_id]['Delta'][id_details['date']] -# s0_at_purchase = self.position_data[position_id]['s0_close'][id_details['date']] -# equivalent_delta_size = (math.floor(cash_available/s0_at_purchase)/100) * self.sizing_lev -# self.greek_limits['delta'][signal_id] = abs(equivalent_delta_size) -# print(f"Spot Price at Purchase: {s0_at_purchase} at time {id_details['date']}") -# print(f"Delta at Purchase: {delta_at_purchase}") -# print(f"Equivalent Delta Size: {equivalent_delta_size}, with Cash Available: {cash_available}, and Leverage: {self.sizing_lev}") -# print(f"Equivalent Delta Size: {equivalent_delta_size}") - -# def calculate_quantity(self, positionID, signalID, date) -> int: -# """ -# Returns the quantity of the position that can be bought based on the sizing type -# """ - -# if positionID not in self.position_data: ## If the position data isn't available, calculate the greeks -# self.calculate_position_greeks(positionID, date) - -# ## First get position info and ticker -# position_dict, _ = self.parse_position_id(positionID) -# key = list(position_dict.keys())[0] -# ticker = position_dict[key][0]['ticker'] - -# ## Now calculate the max size cash can buy -# cash_available = self.pm.allocated_cash_map[ticker] -# purchase_date = pd.to_datetime(date) -# s0_at_purchase = self.position_data[positionID]['s0_close'][purchase_date] -# print(f"Spot Price at Purchase: {s0_at_purchase} at time {purchase_date}") -# opt_price = self.position_data[positionID]['Midpoint'][purchase_date] -# max_size_cash_can_buy = abs(math.floor(cash_available/(opt_price*100))) ## Assuming Allocated Cash map is already in 100s - -# if self.sizing_type == 'price': -# return max_size_cash_can_buy - -# elif self.sizing_type.capitalize() == 'Delta': -# delta = self.position_data[positionID]['Delta'][purchase_date] -# if signalID not in self.greek_limits['delta']: -# self.update_greek_limits(signalID,positionID ) -# target_delta = self.greek_limits['delta'][signalID] -# print(f"Target Delta: {target_delta}") -# delta_size = (math.floor(target_delta/abs(delta))) -# print(f"Delta from Full Cash Spend: {max_size_cash_can_buy * delta}, Size: {max_size_cash_can_buy}") -# print(f"Delta with Size Limit: {delta_size * delta}, Size: {delta_size}") -# return delta_size if abs(delta_size) <= abs(max_size_cash_can_buy) else max_size_cash_can_buy - -# elif self.sizing_type.capitalize() in ['Gamma', 'Vega']: -# raise NotImplementedError(f"Sizing Type {self.sizing_type} not yet implemented, please use 'delta' or 'price'") - -# else: -# raise ValueError(f"Sizing Type {self.sizing_type} not recognized") - -# def analyze_position(self): -# """ -# Analyze the current positions and determine if any need to be rolled, closed, or adjusted -# """ - -# action_dict = {} -# date = pd.to_datetime(self.pm.events.current_date) -# print(f"Analyzing Positions on {date}") -# is_holiday = is_USholiday(date) -# if is_holiday: -# self.pm.logger.warning(f"Market is closed on {date}, skipping") -# print(f"Market is closed on {date}, skipping") -# return "IS_HOLIDAY" - -# ## First check if the position needs to be rolled -# if self.limits['dte']: -# roll_dict = self.dte_check() -# else: -# print("Roll Check Not Enabled") -# roll_dict = {} -# for sym in self.pm.symbol_list: -# current_position = self.pm.current_positions[sym] -# if 'position' not in current_position: -# continue -# roll_dict[current_position['position']['trade_id']] = EventTypes.HOLD.value - -# print("Roll Dict", roll_dict) - -# ## Check if the position needs to be adjusted based on moneyness -# if self.limits['moneyness']: -# moneyness_dict = self.moneyness_check() -# else: -# print("Moneyness Check Not Enabled") -# moneyness_dict = {} -# for sym in self.pm.symbol_list: -# current_position = self.pm.current_positions[sym] -# if 'position' not in current_position: -# continue -# moneyness_dict[current_position['position']['trade_id']] = EventTypes.HOLD.value -# print("Moneyness Dict", moneyness_dict) - -# ## Check if the position needs to be adjusted based on greeks -# greek_dict = self.limits_check() -# print("Greek Dict", greek_dict) - -# check_dicts = [roll_dict, moneyness_dict, greek_dict] -# all_empty = all([len(x)==0 for x in check_dicts]) - -# if all_empty: ## Return if all are empty -# self.pm.logger.info(f"No positions need to be adjusted on {date}") -# print(f"No positions need to be adjusted on {date}") -# return "NO_POSITIONS_TO_ADJUST" - -# ## Aggregate the results -# for sym in self.pm.symbol_list: -# current_position = self.pm.current_positions[sym] -# if 'position' not in current_position: -# continue -# k = current_position['position']['trade_id'] - -# actions = [roll_dict[k], moneyness_dict[k], greek_dict[k]] -# sub_action_dict = {'action': '', 'quantity_diff': 0} - -# ## If the position needs to be rolled or exercised, do that first, no need to check other actions or adjust quantity -# if EventTypes.ROLL.value in actions: -# sub_action_dict['action'] = EventTypes.ROLL.value -# continue -# elif EventTypes.EXERCISE.value in actions: -# sub_action_dict['action'] = EventTypes.EXERCISE.value -# continue - -# ## If the position is a hold, check if it needs to be adjusted based on greeks -# elif EventTypes.HOLD.value in actions: -# sub_action_dict['action'] = EventTypes.HOLD.value - -# quantity_change_list = [] -# for key, value in greek_dict.items(): -# for greek, res in value.items(): -# quantity_change_list.append(res['quantity_diff']) -# sub_action_dict['quantity_diff'] = min(quantity_change_list) -# if sub_action_dict['quantity_diff'] < 0: -# sub_action_dict['action'] = EventTypes.ADJUST.value -# action_dict[k] = sub_action_dict -# return action_dict - - - - -# def limits_check(self): -# """ -# Checks if the order is within the limits of the portfolio -# """ -# limits = self.limits -# delta_limit = limits['delta'] -# position_limit = {} - -# date = pd.to_datetime(self.pm.events.current_date) -# print(f"Checking Limits on {date}") -# if is_USholiday(date): -# self.pm.logger.warning(f"Market is closed on {date}, skipping") -# return - - -# current_positions = self.pm.current_positions -# for symbol, position in current_positions.items(): -# if 'position' not in position: -# continue - -# ## Initialize the greeks limits to False and other essentials variables -# status = {'status': False, 'quantity_diff': 0} ## Status is False by default -# greek_limit_bool = dict(vega = status, gamma = status, delta = status, theta = status) ## Initialize the greek limits to False -# max_delta = self.greek_limits['delta'][position['signal_id']] -# quantity, q = position['quantity'], position['quantity'] -# trade_id = position['position']['trade_id'] -# date = pd.to_datetime(self.pm.events.current_date) -# current_delta = abs(self.position_data[trade_id]['Delta'][date] * quantity) - -# if delta_limit: -# quantity_diff = 0 ## Quantity difference to be used in case of limit breach, I want to return negative values -# if current_delta < max_delta: -# print(f"Delta for Position {trade_id} is within limits") -# else: -# print(f"Delta for Position {trade_id} is above limits") -# while current_delta > max_delta: -# ## Reduce the quantity of the position until it is within limits -# quantity_diff -= 1 -# q = q -1 -# current_delta = abs(self.position_data[trade_id]['Delta'][date]) * q -# print(f"Current Delta: {current_delta}, Max Delta: {max_delta}, Quantity: {q}") -# greek_limit_bool['delta'] = {'status': True, 'quantity_diff': quantity_diff} -# position_limit[trade_id] = greek_limit_bool -# return position_limit - -# def dte_check(self): -# """ -# Analyze the current positions and determine if any need to be rolled -# """ -# date = pd.to_datetime(self.pm.events.current_date) -# print(f"Checking DTE on {date}") -# if is_USholiday(date): -# self.pm.logger.warning(f"Market is closed on {date}, skipping") -# return - -# roll_dict = {} -# for symbol in self.pm.symbol_list: -# current_position = self.pm.current_positions[symbol] - -# if 'position' not in current_position: -# continue - -# id = current_position['position']['trade_id'] -# expiry_date = '' - -# if 'long' in current_position['position']: -# for option_id in current_position['position']['long']: -# option_meta = parse_option_tick(option_id) -# expiry_date = option_meta['exp_date'] -# break -# elif 'short' in current_position['position']: -# for option_id in current_position['position']['short']: -# option_meta = parse_option_tick(option_id) -# expiry_date = option_meta['exp_date'] -# break - - -# dte = (pd.to_datetime(expiry_date) - pd.to_datetime(date)).days - - -# if symbol in self.pm.roll_map and dte <= self.pm.roll_map[symbol]: -# roll_dict[id] = EventTypes.ROLL.value -# elif symbol not in self.pm.roll_map and dte == 0: # exercise contract if symbol not in roll map -# roll_dict[id] = EventTypes.EXERCISE.value -# else: -# roll_dict[id] = EventTypes.HOLD.value -# return roll_dict - -# def moneyness_check(self): -# """ -# Analyze the current positions and determine if any need to be rolled based on moneyness -# """ -# date = pd.to_datetime(self.pm.events.current_date) -# print(f"Checking Moneyness on {date}") -# if is_USholiday(date): -# self.pm.logger.warning(f"Market is closed on {date}, skipping") -# return - -# strike_list = [] -# roll_dict = {} -# for symbol in self.pm.symbol_list: -# current_position = self.pm.current_positions[symbol] -# if 'position' not in current_position: -# continue - -# id = current_position['position']['trade_id'] -# spot = self.chain_spot_timeseries[symbol][date] ## Use the spot price on the date (from chain cause of splits) - -# if 'long' in current_position['position']: -# for option_id in current_position['position']['long']: -# option_meta = parse_option_tick(option_id) -# strike_list.append(option_meta['strike']/spot if option_meta['put_call'] == 'P' else spot/option_meta['strike']) - -# if 'short' in current_position['position']: -# for option_id in current_position['position']['short']: -# option_meta = parse_option_tick(option_id) -# strike_list.append(option_meta['strike']/spot if option_meta['put_call'] == 'P' else spot/option_meta['strike']) - -# roll_dict[id] = EventTypes.ROLL.value if any([x > self.max_moneyness for x in strike_list]) else EventTypes.HOLD.value -# return roll_dict - - - - - - - - -# ## Lazy Loading Spot Data -# def generate_data(self, symbol): -# stk = self.pm.get_underlier_data(symbol) ## Performance isn't affected because of singletons in stock class -# if symbol not in self.spot_timeseries: -# self.spot_timeseries[symbol] = stk.spot( -# ts = True, -# ts_start = pd.to_datetime(self.start_date) - BDay(30), -# ts_end = pd.to_datetime(self.end_date), -# )[self.price_on] - -# if symbol not in self.chain_spot_timeseries: -# self.chain_spot_timeseries[symbol] = stk.spot( -# ts = True, -# spot_type = OptionModelAttributes.spot_type.value, -# ts_start = pd.to_datetime(self.start_date) - BDay(30), -# ts_end = pd.to_datetime(self.end_date), -# )[self.price_on] - -# if symbol not in self.dividend_timeseries: -# divs = stk.div_yield_history(start = pd.to_datetime(self.start_date) - BDay(30)) -# if not isinstance(divs, (pd.DataFrame, pd.Series)): ## When a ticker has no dividends, it returns None/0 -# divs = pd.Series(divs, index = self.spot_timeseries[symbol].index) -# self.dividend_timeseries[symbol] = divs - -# def parse_position_id(self, positionID): -# position_str = positionID -# position_list = position_str.split('&') -# position_list = [x.split(':') for x in position_list if x] -# position_list_parsed = [(x[0], parse_option_tick(x[1])) for x in position_list] -# position_dict = dict(L = [], S = []) -# for x in position_list_parsed: -# position_dict[x[0]].append(x[1]) -# return position_dict, position_list - -# def get_position_dict(self, positionID): -# return self.parse_position_id(positionID)[0] - -# def get_position_list(self, positionID): -# return self.parse_position_id(positionID)[1] - -# def get_option_price(self, optID, date): -# portfolio = self.pm -# return portfolio.options_data[optID][self.option_price][date] - - \ No newline at end of file diff --git a/EventDriven/types.py b/EventDriven/types.py index b18d9c0..1986c5a 100644 --- a/EventDriven/types.py +++ b/EventDriven/types.py @@ -1,39 +1,72 @@ from datetime import date from enum import Enum import pandas as pd +import numpy as np from dataclasses import dataclass from typing import Any, Dict, List from typing_extensions import TypedDict -from EventDriven.helpers import parse_signal_id, generate_signal_id +from EventDriven.helpers import parse_signal_id, generate_signal_id, parse_position_id + + +class Metrics(TypedDict): + spread_pct_ratio: float + spread_oi: float class SignalID(str): - """ - Unique identifier for a trading signal. - + """Unique identifier for a trading signal. + Format: {TICKER}{YYYYMMDD}{SIGNAL_TYPE} """ - def __init__(self, signal_id: str): - self.signal_id = signal_id + + __slots__ = ("ticker", "date", "direction") + + def __new__(cls, signal_id: str) -> "SignalID": + return super().__new__(cls, signal_id) + + def __init__(self, signal_id: str) -> None: parsed = parse_signal_id(signal_id) - self.ticker = parsed['ticker'] - self.date = parsed['date'] - self.direction = parsed['direction'] + self.ticker = parsed["ticker"] + self.date = parsed["date"] + self.direction = parsed["direction"] def parse(self) -> Dict[str, Any]: - return parse_signal_id(self.signal_id) - + return parse_signal_id(self) + @staticmethod - def generate(underlier: str, date: pd.Timestamp, signal_type: str) -> 'SignalID': + def generate(underlier: str, date: pd.Timestamp, signal_type: str) -> "SignalID": signal_id = generate_signal_id(underlier, date, signal_type) return SignalID(signal_id) + + def __repr__(self) -> str: + return f"SignalID({str(self)})" + def __str__(self): + return super().__str__() + + +class TradeID(str): + """Unique identifier for a trade execution. + + Format: + &L:{LONG_LEG_1}&L:{LONG_LEG_2}...&S:{SHORT_LEG_1}&S:{SHORT_LEG_2}... + """ + + __slots__ = ("meta", "legs") + + def __new__(cls, trade_id: str) -> "TradeID": + return super().__new__(cls, trade_id) + + def __init__(self, trade_id: str) -> None: + self.meta, self.legs = parse_position_id(trade_id) + + def __repr__(self) -> str: + return f"TradeID({str(self)})" def __str__(self): - return self.signal_id - def __repr__(self): - return f"SignalID({self.signal_id})" + return super().__str__() + class OrderDataDict(TypedDict): trade_id: str @@ -42,12 +75,15 @@ class OrderDataDict(TypedDict): close: float quantity: int + class OrderDict(TypedDict): result: str signal_id: str map_signal_id: str date: date data: OrderDataDict + metrics: Metrics | None + class PositionsDict(TypedDict): position: OrderDataDict @@ -56,75 +92,83 @@ class PositionsDict(TypedDict): market_value: float signal_id: str + class ResultsEnum(Enum): - SUCCESSFUL = 'SUCCESSFUL' - MONEYNESS_TOO_TIGHT = 'MONEYNESS_TOO_TIGHT' - NO_ORDERS = 'NO_ORDERS' - UNSUCCESSFUL = 'UNSUCCESSFUL' - IS_HOLIDAY = 'IS_HOLIDAY' - UNAVAILABLE_CONTRACT = 'NO LISTED CONTRACTS' - MAX_PRICE_TOO_LOW = 'MAX_PRICE_TOO_LOW' - TOO_ILLIQUID = 'TOO_ILLIQUID' - NO_TRADED_CLOSE = 'NO_TRADED_CLOSE' - IS_WEEKEND = 'IS_WEEKEND' - NO_CONTRACTS_FOUND = 'NO_CONTRACTS_FOUND' - POSITION_SIZE_ZERO = 'POSITION_SIZE_ZERO' - -class EventTypes(Enum): - SIGNAL = 'SIGNAL' - ORDER = 'ORDER' - FILL = 'FILL' - MARKET = 'MARKET' - EXERCISE = 'EXERCISE' - ROLL = 'ROLL' - ADJUST = 'ADJUST' - CLOSE = 'CLOSE' - OPEN = 'OPEN' - HOLD = 'HOLD' + SUCCESSFUL = "SUCCESSFUL" + MONEYNESS_TOO_TIGHT = "MONEYNESS_TOO_TIGHT" + NO_ORDERS = "NO_ORDERS" + UNSUCCESSFUL = "UNSUCCESSFUL" + IS_HOLIDAY = "IS_HOLIDAY" + UNAVAILABLE_CONTRACT = "NO LISTED CONTRACTS" + MAX_PRICE_TOO_LOW = "MAX_PRICE_TOO_LOW" + TOO_ILLIQUID = "TOO_ILLIQUID" + NO_TRADED_CLOSE = "NO_TRADED_CLOSE" + IS_WEEKEND = "IS_WEEKEND" + NO_CONTRACTS_FOUND = "NO_CONTRACTS_FOUND" + POSITION_SIZE_ZERO = "POSITION_SIZE_ZERO" + + +class EventTypes(Enum): + SIGNAL = "SIGNAL" + ORDER = "ORDER" + FILL = "FILL" + MARKET = "MARKET" + EXERCISE = "EXERCISE" + ROLL = "ROLL" + ADJUST = "ADJUST" + CLOSE = "CLOSE" + OPEN = "OPEN" + HOLD = "HOLD" + class OrderStatus(Enum): - FILLED = 'FILLED' - CANCELLED = 'CANCELLED' - EXPIRED = 'EXPIRED' - FAILED = 'FAILED' - CONFIRMED = 'CONFIRMED' + FILLED = "FILLED" + CANCELLED = "CANCELLED" + EXPIRED = "EXPIRED" + FAILED = "FAILED" + CONFIRMED = "CONFIRMED" + + class PositionEffect(Enum): - OPEN = 'OPEN' - CLOSE = 'CLOSE' - + OPEN = "OPEN" + CLOSE = "CLOSE" + + class SignalTypes(Enum): - LONG = 'LONG' - SHORT = 'SHORT' - CLOSE = 'CLOSE' + LONG = "LONG" + SHORT = "SHORT" + CLOSE = "CLOSE" + class FillDirection(Enum): - BUY = 'BUY' - SELL = 'SELL' - EXERCISE = 'EXERCISE' + BUY = "BUY" + SELL = "SELL" + EXERCISE = "EXERCISE" + class PositionAdjustmentReason(Enum): - DTE_ROLL = 'DTE_ROLL' - MONEYNESS_ROLL = 'MONEYNESS_ROLL' - LIMIT_BREACH = 'LIMIT_BREACH' + DTE_ROLL = "DTE_ROLL" + MONEYNESS_ROLL = "MONEYNESS_ROLL" + LIMIT_BREACH = "LIMIT_BREACH" @dataclass class OrderData: """ Represents detailed execution data for a trading order. - + This class contains the specific trade execution details including position information, pricing, and quantities. It's used as a nested data structure within the Order class to organize trade-specific information. - + Attributes: trade_id (str): Unique identifier for the trade execution long (List[str]): List of symbols/positions for long positions short (List[str]): List of symbols/positions for short positions close (float): Closing price or execution price for the trade quantity (int): Number of shares/contracts in the trade - + Example: >>> order_data = OrderData( ... trade_id='&L:BA20260515C285&S:BA20260515C290', @@ -134,6 +178,7 @@ class OrderData: ... quantity=1 ... ) """ + trade_id: str long: List[str] short: List[str] @@ -143,21 +188,20 @@ class OrderData: def __getitem__(self, key): """Get item like a dict, dict[key]""" return getattr(self, key) - + def __setitem__(self, key, value): """Set item like a dict, dict[key] = value""" setattr(self, key, value) def __repr__(self): """String representation of OrderData""" - return (f"OrderData(trade_id={self.trade_id}, quantity={self.quantity})") - + return f"OrderData(trade_id={self.trade_id}, quantity={self.quantity})" def get(self, key: str, default: Any = None) -> Any: """Get item like a dict, dict.get()""" return getattr(self, key, default) - - def keys(self): + + def keys(self): """Return keys like a dict""" return self.__dict__.keys() @@ -165,42 +209,35 @@ def items(self): """Return items like a dict""" return [(key, getattr(self, key)) for key in self.keys()] - @staticmethod - def from_dict(d: Dict[str, Any]) -> 'OrderData': + @staticmethod + def from_dict(d: Dict[str, Any]) -> "OrderData": """Convert dictionary to OrderData dataclass""" return OrderData(**d) - def to_dict(self) -> OrderDataDict: + def to_dict(self) -> OrderDataDict: """Convert OrderData dataclass to dictionary""" return OrderDataDict( - trade_id=self.trade_id, - long=self.long, - short=self.short, - close=self.close, - quantity=self.quantity + trade_id=self.trade_id, long=self.long, short=self.short, close=self.close, quantity=self.quantity ) - - - @dataclass class Order: """ Represents a trading order with signal information and execution data. - + This class encapsulates all the information related to a trading order, including the signal that generated it, execution results, and detailed trade data. It provides dictionary-like access methods for compatibility with existing code that expects dictionary objects. - + Attributes: result (str): The execution result of the order (e.g., 'SUCCESSFUL', 'FAILED') signal_id (str): Unique identifier for the signal that generated this order map_signal_id (str): Mapped signal identifier for tracking purposes date (date): The date when the signal was generated data (OrderData): Detailed trade execution data including positions and pricing - + Methods: __getitem__(key): Get attribute value using dictionary-style access __setitem__(key, value): Set attribute value using dictionary-style access @@ -209,7 +246,7 @@ class Order: items(): Return list of (key, value) pairs (dict-like) to_dict(): Convert Order object to dictionary representation from_dict(d): Create Order object from dictionary (static method) - + Example: >>> order = Order( ... result='SUCCESSFUL', @@ -223,29 +260,31 @@ class Order: >>> order_dict = order.to_dict() # Convert to dict >>> restored_order = Order.from_dict(order_dict) # Convert back """ + result: str signal_id: str map_signal_id: str date: date data: OrderData + metrics: Metrics = None def __getitem__(self, key): """Get item like a dict, dict[key]""" return getattr(self, key) - + def __setitem__(self, key, value): """Set item like a dict, dict[key] = value""" setattr(self, key, value) def __repr__(self): """String representation of Order""" - return (f"Order(signal_id={self.signal_id}), data={self.data})") + return f"Order(signal_id={self.signal_id}), data={self.data}, result={self.result}, metrics={self.metrics})" def get(self, key: str, default: Any = None) -> Any: """Get item like a dict, dict.get()""" return getattr(self, key, default) - - def keys(self): + + def keys(self): """Return keys like a dict""" return self.__dict__.keys() @@ -257,11 +296,11 @@ def to_dict(self) -> OrderDict: """Convert Order dataclass to dictionary""" # Convert the nested OrderData object to dict data_dict = { - 'trade_id': self.data.trade_id, - 'long': self.data.long, - 'short': self.data.short, - 'close': self.data.close, - 'quantity': self.data.quantity + "trade_id": self.data.trade_id, + "long": self.data.long, + "short": self.data.short, + "close": self.data.close, + "quantity": self.data.quantity, } data_dict = OrderDataDict(**data_dict) order_dict = OrderDict( @@ -269,41 +308,45 @@ def to_dict(self) -> OrderDict: signal_id=self.signal_id, map_signal_id=self.map_signal_id, date=self.date, - data=data_dict + data=data_dict, + metrics=self.metrics, ) - + # Return the main dictionary return order_dict @staticmethod - def from_dict(d: Dict[str, Any]) -> 'Order': + def from_dict(d: Dict[str, Any]) -> "Order": """Convert dictionary to Order dataclass""" # Extract the nested data dict - data_dict = d['data'] - + data_dict = d["data"] + metrics = d.get("metrics", None) + # Convert nested data dict to OrderData object if data_dict is None: - data_dict = { - 'trade_id': None, - 'long': None, - 'short': None, - 'close': None, - 'quantity': None} + data_dict = {"trade_id": None, "long": None, "short": None, "close": None, "quantity": None} + + if metrics is not None: + d["metrics"] = Metrics(spread_pct_ratio=metrics["spread_pct_ratio"], spread_oi=metrics["spread_oi"]) + else: + d["metrics"] = None + order_data = OrderData( - trade_id=data_dict['trade_id'], - long=data_dict['long'], - short=data_dict['short'], - close=data_dict['close'], - quantity=data_dict['quantity'] + trade_id=data_dict["trade_id"], + long=data_dict.get("long", []), + short=data_dict.get("short", []), + close=data_dict.get("close", np.nan), + quantity=data_dict.get("quantity", 0), ) - + # Create and return Order object - raw_date = d.get('date') + raw_date = d.get("date") date = pd.to_datetime(raw_date).date() if raw_date is not None else None return Order( - result=d['result'], - signal_id=d['signal_id'], - map_signal_id=d['map_signal_id'], + result=d["result"], + signal_id=d["signal_id"], + map_signal_id=d["map_signal_id"], date=date, - data=order_data - ) \ No newline at end of file + data=order_data, + metrics=d["metrics"], + ) diff --git a/module_test/rates.ipynb b/module_test/rates.ipynb deleted file mode 100644 index 4e3bee1..0000000 --- a/module_test/rates.ipynb +++ /dev/null @@ -1,1204 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from dbase.database.SQLHelpers import store_SQL_data_Insert_Ignore, query_database\n", - "def save_previous_rates_date():\n", - " import yfinance as yf\n", - " print(\"Saving previous rates date\")\n", - " max_date = get_risk_free_rate_helper().index.max()\n", - " rtes = yf.download('^IRX', progress=False, multi_level_index=False,start = max_date, end = (datetime.datetime.today()+ BDay(1)).strftime('%Y-%m-%d'), interval = '1h')\n", - " print(\"DOWNLOAD COMPLETE\")\n", - " rtes.tz_convert('America/New_York')\n", - " rtes.index = rtes.index.tz_convert('America/New_York')\n", - " rtes.index = rtes.index.tz_localize(None)\n", - " rtes.index = [x.replace(minute = 30) for x in rtes.index]\n", - " rtes['annualized'] = rtes['Close']/100\n", - " rtes['daily'] = (1 + rtes['annualized']) ** (1/365) - 1\n", - " rtes['yf_tick'] = '^IRX'\n", - " rtes['description'] = '\t13 WEEK TREASURY BILL'\n", - " rtes = rtes[rtes.index> get_risk_free_rate_helper().index.min()][['yf_tick', 'description', 'annualized', 'daily']]\n", - " rtes.rename(columns = {'annualized': 'annualized_rate', 'daily': 'daily_rate', 'Date': 'datetime'}, inplace = True)\n", - " rtes.index.name = 'datetime'\n", - " rtes.reset_index(inplace = True)\n", - " if rtes.empty:\n", - " print(\"No new data to save\")\n", - " return\n", - " store_SQL_data_Insert_Ignore('securities_master', 'rates_timeseries', rtes)\n", - " return rtes\n", - "\n", - "save_previous_rates_date()" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Queue is empty\n" - ] - } - ], - "source": [ - "import multiprocessing as mp\n", - "import queue\n", - "\n", - "ctx = mp.get_context('fork')\n", - "manager = ctx.Manager()\n", - "_queue = manager.Queue()\n", - "queue.Empty\n", - "try:\n", - " _queue.get(timeout=1)\n", - "except queue.Empty as e:\n", - " print(e)\n", - " print(\"Queue is empty\")" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "_queue.qsize()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
closehighlowopenvolume
2025-05-01 08:30:004.1784.1784.1734.1750
2025-05-01 09:30:004.1784.1784.1704.1730
2025-05-01 10:30:004.1824.1824.1784.1780
2025-05-01 11:30:004.1824.1884.1784.1780
2025-05-01 12:30:004.1884.1884.1824.1880
2025-05-01 13:30:004.1854.1884.1854.1880
2025-05-01 14:30:004.1854.1904.1854.1850
2025-05-02 08:30:004.2004.2004.1754.1820
2025-05-02 09:30:004.2034.2034.1974.1970
2025-05-02 10:30:004.2054.2054.1974.1970
2025-05-02 11:30:004.2084.2084.2034.2030
2025-05-02 12:30:004.2084.2104.2054.2050
2025-05-02 13:30:004.2084.2104.2054.2080
2025-05-02 14:30:004.2084.2084.2084.2080
2025-05-05 08:30:004.2084.2084.2054.2050
2025-05-05 09:30:004.2134.2134.2084.2080
2025-05-05 10:30:004.2134.2134.2084.2080
2025-05-05 11:30:004.2104.2134.2084.2130
2025-05-05 12:30:004.2084.2134.2054.2130
2025-05-05 13:30:004.2084.2084.2054.2080
2025-05-05 14:30:004.2084.2084.2084.2080
2025-05-06 08:30:004.2134.2134.2104.2130
2025-05-06 09:30:004.2104.2134.2104.2130
2025-05-06 10:30:004.2104.2134.2104.2130
2025-05-06 11:30:004.2104.2104.2104.2100
2025-05-06 12:30:004.2104.2134.2104.2100
2025-05-06 13:30:004.2104.2134.2104.2100
2025-05-06 14:30:004.2104.2134.2104.2100
\n", - "
" - ], - "text/plain": [ - " close high low open volume\n", - "2025-05-01 08:30:00 4.178 4.178 4.173 4.175 0\n", - "2025-05-01 09:30:00 4.178 4.178 4.170 4.173 0\n", - "2025-05-01 10:30:00 4.182 4.182 4.178 4.178 0\n", - "2025-05-01 11:30:00 4.182 4.188 4.178 4.178 0\n", - "2025-05-01 12:30:00 4.188 4.188 4.182 4.188 0\n", - "2025-05-01 13:30:00 4.185 4.188 4.185 4.188 0\n", - "2025-05-01 14:30:00 4.185 4.190 4.185 4.185 0\n", - "2025-05-02 08:30:00 4.200 4.200 4.175 4.182 0\n", - "2025-05-02 09:30:00 4.203 4.203 4.197 4.197 0\n", - "2025-05-02 10:30:00 4.205 4.205 4.197 4.197 0\n", - "2025-05-02 11:30:00 4.208 4.208 4.203 4.203 0\n", - "2025-05-02 12:30:00 4.208 4.210 4.205 4.205 0\n", - "2025-05-02 13:30:00 4.208 4.210 4.205 4.208 0\n", - "2025-05-02 14:30:00 4.208 4.208 4.208 4.208 0\n", - "2025-05-05 08:30:00 4.208 4.208 4.205 4.205 0\n", - "2025-05-05 09:30:00 4.213 4.213 4.208 4.208 0\n", - "2025-05-05 10:30:00 4.213 4.213 4.208 4.208 0\n", - "2025-05-05 11:30:00 4.210 4.213 4.208 4.213 0\n", - "2025-05-05 12:30:00 4.208 4.213 4.205 4.213 0\n", - "2025-05-05 13:30:00 4.208 4.208 4.205 4.208 0\n", - "2025-05-05 14:30:00 4.208 4.208 4.208 4.208 0\n", - "2025-05-06 08:30:00 4.213 4.213 4.210 4.213 0\n", - "2025-05-06 09:30:00 4.210 4.213 4.210 4.213 0\n", - "2025-05-06 10:30:00 4.210 4.213 4.210 4.213 0\n", - "2025-05-06 11:30:00 4.210 4.210 4.210 4.210 0\n", - "2025-05-06 12:30:00 4.210 4.213 4.210 4.210 0\n", - "2025-05-06 13:30:00 4.210 4.213 4.210 4.210 0\n", - "2025-05-06 14:30:00 4.210 4.213 4.210 4.210 0" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "data_min = yf.download('^IRX', start='2025-05-01', end='2025-05-07', interval = '1h', progress=False, multi_level_index = False)\n", - "data_min.tz_convert('America/New_York')\n", - "data_min.index = data_min.index.tz_convert('America/New_York')\n", - "data_min.index = data_min.index.tz_localize(None)\n", - "data_min.index = [x.replace(minute = 30) for x in data_min.index]\n", - "data_min.columns = data_min.columns.str.lower()\n", - "data_min" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from dbase.DataAPI.ThetaData import resample\n", - "_rates_cache = None" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "\n", - "def deannualize(annual_rate, periods=365):\n", - " return (1 + annual_rate) ** (1/periods) - 1\n", - "\n", - "\n", - "def get_risk_free_rate_helper(interval = '1d', use = 'db'):\n", - " # download 3-month us treasury bills rates\n", - " \"\"\"\n", - " Return timeseries of 3-month US treasury bills rates\n", - "\n", - " Parameters\n", - " ----------\n", - " interval : str\n", - " Interval to resample the data to. Default is '1d'\n", - " \n", - " use: str\n", - " Source of the data. Default is 'yf', other option is 'db'\n", - " \n", - " \"\"\"\n", - "\n", - " data = _fetch_rates(interval = interval).copy()\n", - " return resample(data, interval, {'daily':'last', 'annualized': 'last', 'name': 'last', 'description': 'last'})\n", - "\n", - "\n", - "def _fetch_rates(interval):\n", - " \"\"\"\n", - " Handles _rates_cache logic picking\n", - " \"\"\"\n", - " global _rates_cache\n", - " ## First check data base.\n", - " if _rates_cache is None:\n", - " data = query_database('securities_master','rates_timeseries' ,\"SELECT * FROM rates_timeseries WHERE yf_tick = '^IRX' AND DATETIME >= '2010-01-01'\")\n", - " data['datetime'] = pd.to_datetime(data['datetime'])\n", - " data.set_index('datetime',inplace = True)\n", - " data.rename(columns = {'daily_rate':'daily', 'annualized_rate':'annualized', 'yf_tick': 'name'}, inplace = True)\n", - " data.index.name = 'Datetime'\n", - " else:\n", - " data = _rates_cache.copy()\n", - "\n", - " ## Now, if data is not up to date, update it\n", - " if data.index.max().date() < change_to_last_busday(datetime.datetime.now()).date():\n", - " # logger.info('Updating rates data')\n", - " ## Query from max to today from retrieve_timeseries\n", - " ## Prefer using yf because openbb timezone is UTC for IRX\n", - " ## For YF, we have to do end_date + 1 day to get the last day\n", - " data_min = yf.download('^IRX', data.index.max().date(), end = (datetime.datetime.today()+ BDay(1)).strftime('%Y-%m-%d') , interval = '1h', progress=False, multi_level_index = False)\n", - " data_min.tz_convert('America/New_York')\n", - " data_min.index = data_min.index.tz_convert('America/New_York')\n", - " data_min.index = data_min.index.tz_localize(None)\n", - " data_min.index = [x.replace(minute = 30) for x in data_min.index]\n", - " data_min.columns = data_min.columns.str.lower()\n", - " data_min['daily'] = data_min['close'].apply(deannualize)\n", - " data_min['annualized'] = data_min['close']/100\n", - " data_min['name'] = '^IRX'\n", - " data_min['description'] = '13 WEEK TREASURY BILL'\n", - " data_min.index.name = 'Datetime'\n", - " data_min = data_min[['name', 'description', 'daily', 'annualized']]\n", - " data = pd.concat([data, data_min])\n", - " \n", - " _rates_cache = resample(data, '30m', {'daily':'ffill', 'annualized': 'ffill', 'name': 'ffill', 'description': 'ffill'})\n", - " return data\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
datetimedaily_rateannualized_rateyf_tickdescription
02010-01-01 09:30:000.0001340.0005^IRX13 WEEK TREASURY BILL
12010-01-01 10:30:000.0001340.0005^IRX13 WEEK TREASURY BILL
22010-01-01 11:30:000.0001340.0005^IRX13 WEEK TREASURY BILL
32010-01-01 12:30:000.0001340.0005^IRX13 WEEK TREASURY BILL
42010-01-01 13:30:000.0001340.0005^IRX13 WEEK TREASURY BILL
..................
464132025-05-06 10:30:000.0001130.0421^IRX13 week treasury bill
464142025-05-06 11:30:000.0001130.0421^IRX13 week treasury bill
464152025-05-06 12:30:000.0001130.0421^IRX13 week treasury bill
464162025-05-06 13:30:000.0001130.0421^IRX13 week treasury bill
464172025-05-06 14:30:000.0001130.0421^IRX13 week treasury bill
\n", - "

46418 rows × 5 columns

\n", - "
" - ], - "text/plain": [ - " datetime daily_rate annualized_rate yf_tick \\\n", - "0 2010-01-01 09:30:00 0.000134 0.0005 ^IRX \n", - "1 2010-01-01 10:30:00 0.000134 0.0005 ^IRX \n", - "2 2010-01-01 11:30:00 0.000134 0.0005 ^IRX \n", - "3 2010-01-01 12:30:00 0.000134 0.0005 ^IRX \n", - "4 2010-01-01 13:30:00 0.000134 0.0005 ^IRX \n", - "... ... ... ... ... \n", - "46413 2025-05-06 10:30:00 0.000113 0.0421 ^IRX \n", - "46414 2025-05-06 11:30:00 0.000113 0.0421 ^IRX \n", - "46415 2025-05-06 12:30:00 0.000113 0.0421 ^IRX \n", - "46416 2025-05-06 13:30:00 0.000113 0.0421 ^IRX \n", - "46417 2025-05-06 14:30:00 0.000113 0.0421 ^IRX \n", - "\n", - " description \n", - "0 13 WEEK TREASURY BILL \n", - "1 13 WEEK TREASURY BILL \n", - "2 13 WEEK TREASURY BILL \n", - "3 13 WEEK TREASURY BILL \n", - "4 13 WEEK TREASURY BILL \n", - "... ... \n", - "46413 13 week treasury bill \n", - "46414 13 week treasury bill \n", - "46415 13 week treasury bill \n", - "46416 13 week treasury bill \n", - "46417 13 week treasury bill \n", - "\n", - "[46418 rows x 5 columns]" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "query_database('securities_master','rates_timeseries' ,\"SELECT * FROM rates_timeseries WHERE yf_tick = '^IRX' AND DATETIME >= '2010-01-01'\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
dailyannualizednamedescription
Datetime
2010-01-010.0001340.00050^IRX13 WEEK TREASURY BILL
2010-01-040.0001470.00055^IRX13 WEEK TREASURY BILL
2010-01-050.0001600.00060^IRX13 WEEK TREASURY BILL
2010-01-060.0001210.00045^IRX13 WEEK TREASURY BILL
2010-01-070.0001210.00045^IRX13 WEEK TREASURY BILL
...............
2025-04-300.0045220.04190^IRX13 WEEK TREASURY BILL
2025-05-010.0045190.04185^IRX13 WEEK TREASURY BILL
2025-05-020.0045310.04208^IRX13 WEEK TREASURY BILL
2025-05-050.0001130.04208^IRX13 week treasury bill
2025-05-060.0001130.04210^IRX13 week treasury bill
\n", - "

4003 rows × 4 columns

\n", - "
" - ], - "text/plain": [ - " daily annualized name description\n", - "Datetime \n", - "2010-01-01 0.000134 0.00050 ^IRX 13 WEEK TREASURY BILL\n", - "2010-01-04 0.000147 0.00055 ^IRX 13 WEEK TREASURY BILL\n", - "2010-01-05 0.000160 0.00060 ^IRX 13 WEEK TREASURY BILL\n", - "2010-01-06 0.000121 0.00045 ^IRX 13 WEEK TREASURY BILL\n", - "2010-01-07 0.000121 0.00045 ^IRX 13 WEEK TREASURY BILL\n", - "... ... ... ... ...\n", - "2025-04-30 0.004522 0.04190 ^IRX 13 WEEK TREASURY BILL\n", - "2025-05-01 0.004519 0.04185 ^IRX 13 WEEK TREASURY BILL\n", - "2025-05-02 0.004531 0.04208 ^IRX 13 WEEK TREASURY BILL\n", - "2025-05-05 0.000113 0.04208 ^IRX 13 week treasury bill\n", - "2025-05-06 0.000113 0.04210 ^IRX 13 week treasury bill\n", - "\n", - "[4003 rows x 4 columns]" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "get_risk_free_rate_helper(interval = '1d')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
dailyannualizednamedescription
Datetime
2010-01-010.0001340.00050^IRX13 WEEK TREASURY BILL
2010-01-040.0001470.00055^IRX13 WEEK TREASURY BILL
2010-01-050.0001600.00060^IRX13 WEEK TREASURY BILL
2010-01-060.0001210.00045^IRX13 WEEK TREASURY BILL
2010-01-070.0001210.00045^IRX13 WEEK TREASURY BILL
...............
2025-04-300.0045220.04190^IRX13 WEEK TREASURY BILL
2025-05-010.0045190.04185^IRX13 WEEK TREASURY BILL
2025-05-020.0045310.04208^IRX13 WEEK TREASURY BILL
2025-05-050.0001130.04208^IRX13 week treasury bill
2025-05-060.0001130.04210^IRX13 week treasury bill
\n", - "

4003 rows × 4 columns

\n", - "
" - ], - "text/plain": [ - " daily annualized name description\n", - "Datetime \n", - "2010-01-01 0.000134 0.00050 ^IRX 13 WEEK TREASURY BILL\n", - "2010-01-04 0.000147 0.00055 ^IRX 13 WEEK TREASURY BILL\n", - "2010-01-05 0.000160 0.00060 ^IRX 13 WEEK TREASURY BILL\n", - "2010-01-06 0.000121 0.00045 ^IRX 13 WEEK TREASURY BILL\n", - "2010-01-07 0.000121 0.00045 ^IRX 13 WEEK TREASURY BILL\n", - "... ... ... ... ...\n", - "2025-04-30 0.004522 0.04190 ^IRX 13 WEEK TREASURY BILL\n", - "2025-05-01 0.004519 0.04185 ^IRX 13 WEEK TREASURY BILL\n", - "2025-05-02 0.004531 0.04208 ^IRX 13 WEEK TREASURY BILL\n", - "2025-05-05 0.000113 0.04208 ^IRX 13 week treasury bill\n", - "2025-05-06 0.000113 0.04210 ^IRX 13 week treasury bill\n", - "\n", - "[4003 rows x 4 columns]" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "from trade.assets.rates import get_risk_free_rate_helper\n", - "get_risk_free_rate_helper()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[0;31mSignature:\u001b[0m\n", - "\u001b[0myf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdownload\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mtickers\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mstart\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mend\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mactions\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mthreads\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mignore_tz\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mgroup_by\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'column'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mauto_adjust\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mback_adjust\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mrepair\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mkeepna\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mprogress\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mperiod\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'max'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0minterval\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'1d'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mprepost\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mproxy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m<\u001b[0m\u001b[0mobject\u001b[0m \u001b[0mobject\u001b[0m \u001b[0mat\u001b[0m \u001b[0;36m0x12735b180\u001b[0m\u001b[0;34m>\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mrounding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0msession\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mmulti_level_index\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mOptional\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mpandas\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcore\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mframe\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDataFrame\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mDocstring:\u001b[0m\n", - "Download yahoo tickers\n", - ":Parameters:\n", - " tickers : str, list\n", - " List of tickers to download\n", - " period : str\n", - " Valid periods: 1d,5d,1mo,3mo,6mo,1y,2y,5y,10y,ytd,max\n", - " Either Use period parameter or use start and end\n", - " interval : str\n", - " Valid intervals: 1m,2m,5m,15m,30m,60m,90m,1h,1d,5d,1wk,1mo,3mo\n", - " Intraday data cannot extend last 60 days\n", - " start: str\n", - " Download start date string (YYYY-MM-DD) or _datetime, inclusive.\n", - " Default is 99 years ago\n", - " E.g. for start=\"2020-01-01\", the first data point will be on \"2020-01-01\"\n", - " end: str\n", - " Download end date string (YYYY-MM-DD) or _datetime, exclusive.\n", - " Default is now\n", - " E.g. for end=\"2023-01-01\", the last data point will be on \"2022-12-31\"\n", - " group_by : str\n", - " Group by 'ticker' or 'column' (default)\n", - " prepost : bool\n", - " Include Pre and Post market data in results?\n", - " Default is False\n", - " auto_adjust: bool\n", - " Adjust all OHLC automatically? Default is True\n", - " repair: bool\n", - " Detect currency unit 100x mixups and attempt repair\n", - " Default is False\n", - " keepna: bool\n", - " Keep NaN rows returned by Yahoo?\n", - " Default is False\n", - " actions: bool\n", - " Download dividend + stock splits data. Default is False\n", - " threads: bool / int\n", - " How many threads to use for mass downloading. Default is True\n", - " ignore_tz: bool\n", - " When combining from different timezones, ignore that part of datetime.\n", - " Default depends on interval. Intraday = False. Day+ = True.\n", - " rounding: bool\n", - " Optional. Round values to 2 decimal places?\n", - " timeout: None or float\n", - " If not None stops waiting for a response after given number of\n", - " seconds. (Can also be a fraction of a second e.g. 0.01)\n", - " session: None or Session\n", - " Optional. Pass your own session object to be used for all requests\n", - " multi_level_index: bool\n", - " Optional. Always return a MultiIndex DataFrame? Default is True\n", - "\u001b[0;31mFile:\u001b[0m ~/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/multi.py\n", - "\u001b[0;31mType:\u001b[0m function" - ] - } - ], - "source": [ - "yf.download?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving previous rates date\n", - "DOWNLOAD COMPLETE\n", - "Size to be inserted: 7\n", - "Rows inserted into rates_timeseries: 0\r" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
datetimeyf_tickdescriptionannualized_ratedaily_rate
02025-05-06 08:30:00^IRX\\t13 WEEK TREASURY BILL0.042130.000113
12025-05-06 09:30:00^IRX\\t13 WEEK TREASURY BILL0.042100.000113
22025-05-06 10:30:00^IRX\\t13 WEEK TREASURY BILL0.042100.000113
32025-05-06 11:30:00^IRX\\t13 WEEK TREASURY BILL0.042100.000113
42025-05-06 12:30:00^IRX\\t13 WEEK TREASURY BILL0.042100.000113
52025-05-06 13:30:00^IRX\\t13 WEEK TREASURY BILL0.042100.000113
62025-05-06 14:30:00^IRX\\t13 WEEK TREASURY BILL0.042100.000113
\n", - "
" - ], - "text/plain": [ - " datetime yf_tick description annualized_rate \\\n", - "0 2025-05-06 08:30:00 ^IRX \\t13 WEEK TREASURY BILL 0.04213 \n", - "1 2025-05-06 09:30:00 ^IRX \\t13 WEEK TREASURY BILL 0.04210 \n", - "2 2025-05-06 10:30:00 ^IRX \\t13 WEEK TREASURY BILL 0.04210 \n", - "3 2025-05-06 11:30:00 ^IRX \\t13 WEEK TREASURY BILL 0.04210 \n", - "4 2025-05-06 12:30:00 ^IRX \\t13 WEEK TREASURY BILL 0.04210 \n", - "5 2025-05-06 13:30:00 ^IRX \\t13 WEEK TREASURY BILL 0.04210 \n", - "6 2025-05-06 14:30:00 ^IRX \\t13 WEEK TREASURY BILL 0.04210 \n", - "\n", - " daily_rate \n", - "0 0.000113 \n", - "1 0.000113 \n", - "2 0.000113 \n", - "3 0.000113 \n", - "4 0.000113 \n", - "5 0.000113 \n", - "6 0.000113 " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "from dbase.database.SQLHelpers import store_SQL_data_Insert_Ignore, query_database\n", - "def save_previous_rates_date():\n", - " import yfinance as yf\n", - " print(\"Saving previous rates date\")\n", - " max_date = get_risk_free_rate_helper().index.max()\n", - " rtes = yf.download('^IRX', progress=False, multi_level_index=False,start = max_date, end = (datetime.datetime.today()+ BDay(1)).strftime('%Y-%m-%d'), interval = '1h')\n", - " print(\"DOWNLOAD COMPLETE\")\n", - " rtes.tz_convert('America/New_York')\n", - " rtes.index = rtes.index.tz_convert('America/New_York')\n", - " rtes.index = rtes.index.tz_localize(None)\n", - " rtes.index = [x.replace(minute = 30) for x in rtes.index]\n", - " rtes['annualized'] = rtes['Close']/100\n", - " rtes['daily'] = (1 + rtes['annualized']) ** (1/365) - 1\n", - " rtes['yf_tick'] = '^IRX'\n", - " rtes['description'] = '\t13 WEEK TREASURY BILL'\n", - " rtes = rtes[rtes.index> get_risk_free_rate_helper().index.min()][['yf_tick', 'description', 'annualized', 'daily']]\n", - " rtes.rename(columns = {'annualized': 'annualized_rate', 'daily': 'daily_rate', 'Date': 'datetime'}, inplace = True)\n", - " rtes.index.name = 'datetime'\n", - " rtes.reset_index(inplace = True)\n", - " if rtes.empty:\n", - " print(\"No new data to save\")\n", - " return\n", - " store_SQL_data_Insert_Ignore('securities_master', 'rates_timeseries', rtes)\n", - " return rtes\n", - "\n", - "save_previous_rates_date()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "openbb", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.10" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/module_test/raw_code/DataManagers/DataManagers.py b/module_test/raw_code/DataManagers/DataManagers.py index bdebfca..0a66f41 100644 --- a/module_test/raw_code/DataManagers/DataManagers.py +++ b/module_test/raw_code/DataManagers/DataManagers.py @@ -1860,7 +1860,7 @@ def calc_vol_for_data( lambda x:IV_handler(S = x[col_kwargs['underlier_price']], K = x[col_kwargs['strike']], price = x[price_col], - t = time_distance_helper(x[col_kwargs['expiration']], x[col_kwargs['datetime']]), + t = time_distance_helper(end=x[col_kwargs['expiration']], start=x[col_kwargs['datetime']]), r = x[col_kwargs['rf_rate']], q = x[col_kwargs['dividend']], flag = x[col_kwargs['put/call']].lower()), axis = 1 @@ -1921,7 +1921,7 @@ def calc_vol_for_data_parallel( } temp_df = df.copy() temp_df.rename(columns=col_kwargs, inplace=True) - temp_df['t'] = temp_df.apply(lambda x: time_distance_helper(x[col_kwargs['expiration']], x[col_kwargs['datetime']]), axis=1) + temp_df['t'] = temp_df.apply(lambda x: time_distance_helper(end=x[col_kwargs['expiration']], start=x[col_kwargs['datetime']]), axis=1) binomial_column = [price_col, col_kwargs['underlier_price'], col_kwargs['strike'], col_kwargs['rf_rate'], col_kwargs['expiration'], col_kwargs['put/call'], col_kwargs['datetime'], col_kwargs['dividend'],] @@ -2049,7 +2049,7 @@ def calc_greeks_for_data_parallel( temp_df = df.copy() temp_df.rename(columns=col_kwargs, inplace=True) - temp_df['t'] = temp_df.apply(lambda x: time_distance_helper(x[col_kwargs['expiration']], x[col_kwargs['datetime']]), axis=1) + temp_df['t'] = temp_df.apply(lambda x: time_distance_helper(end=x[col_kwargs['expiration']], start=x[col_kwargs['datetime']]), axis=1) temp_df['asset'] = None temp_df['model'] = model greeks_colums_use = ['asset',col_kwargs['underlier_price'], col_kwargs['strike'], diff --git a/module_test/raw_code/DataManagers/DataManagers_cached.py b/module_test/raw_code/DataManagers/DataManagers_cached.py index 6ec5e53..18f9ed9 100644 --- a/module_test/raw_code/DataManagers/DataManagers_cached.py +++ b/module_test/raw_code/DataManagers/DataManagers_cached.py @@ -49,7 +49,7 @@ # Import MarketTimeseries for underlier data caching try: - from EventDriven.riskmanager.market_data import get_timeseries_obj + from trade.datamanager.market_data import get_timeseries_obj MARKET_TIMESERIES_AVAILABLE = True except ImportError: import traceback diff --git a/module_test/raw_code/DataManagers/SaveManager.py b/module_test/raw_code/DataManagers/SaveManager.py index ee0c5c4..85fc868 100644 --- a/module_test/raw_code/DataManagers/SaveManager.py +++ b/module_test/raw_code/DataManagers/SaveManager.py @@ -22,11 +22,10 @@ get_int_value, get_shared_lock, get_request_list) -from trade import is_allowed_user, USER -from trade.helpers.Logging import setup_logger +from trade import is_allowed_user from .vars import ALLOWED_SCHEDULE_USERS -logger = setup_logger('DataManager.py', stream_log_level = logging.CRITICAL) +logger = setup_logger("DataManager.py", stream_log_level=logging.CRITICAL) if is_allowed_user(ALLOWED_SCHEDULE_USERS): print('\n') print("Scheduled Data Requests will be saved to:", f"{os.environ['WORK_DIR']}/module_test/raw_code/DataManagers/scheduler/requests.jsonl") diff --git a/module_test/raw_code/DataManagers/ipynb_tests/OptionDatamanger.ipynb b/module_test/raw_code/DataManagers/ipynb_tests/OptionDatamanger.ipynb deleted file mode 100644 index a2f3e28..0000000 --- a/module_test/raw_code/DataManagers/ipynb_tests/OptionDatamanger.ipynb +++ /dev/null @@ -1,8508 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Console Logging & File Logging Can be configured using STREAM_LOG_LEVEL and FILE_LOG_LEVEL in environment variables.\n", - "Propagate to root logger can be set using PROPAGATE_TO_ROOT_LOGGER in environment variables.\n", - "Example:\n", - "STREAM_LOG_LEVEL = 'DEBUG'\n", - "FILE_LOG_LEVEL = 'INFO'\n", - "PROPAGATE_TO_ROOT_LOGGER = 'False'\n", - "\n", - "2025-05-19 02:34:33 trade.helpers.Logging INFO: Logging Root Directory: /Users/chiemelienwanisobi/cloned_repos/QuantTools/logs\n", - "Using Proxy URL: http://18.232.166.224:5500/thetadata\n" - ] - } - ], - "source": [ - "%load_ext autoreload\n", - "%autoreload 2\n", - "from dotenv import load_dotenv\n", - "import os\n", - "import sys\n", - "import logging\n", - "from openpyxl import load_workbook\n", - "from datetime import datetime, date\n", - "from datetime import time as dtTime\n", - "import pandas as pd\n", - "import threading\n", - "import numpy as np\n", - "from pathos.multiprocessing import ProcessingPool as Pool\n", - "from concurrent.futures import ProcessPoolExecutor, as_completed\n", - "import concurrent.futures\n", - "from trade.assets.Stock import Stock\n", - "from trade.helpers.helper import generate_option_tick_new\n", - "from trade.assets.rates import get_risk_free_rate_helper\n", - "from trade.helpers.helper import IV_handler, time_distance_helper, binomial_implied_vol, wait_for_response, HOLIDAY_SET,enforce_allowed_models,optionPV_helper\n", - "from trade.helpers.helper import extract_numeric_value, change_to_last_busday, parse_option_tick, CustomCache\n", - "from trade.helpers.helper import optionPV_helper\n", - "from trade.helpers.exception import IncorrectExecutionError\n", - "from trade.helpers.Logging import setup_logger\n", - "from trade.assets.Calculate import Calculate\n", - "from trade.helpers.Context import Context\n", - "from dbase.DataAPI.ThetaData import (retrieve_ohlc, \n", - " retrieve_quote_rt, \n", - " retrieve_eod_ohlc, \n", - " resample, \n", - " retrieve_quote, \n", - " enforce_bus_hours,\n", - " retrieve_bulk_eod,\n", - " retrieve_openInterest,\n", - " retrieve_chain_bulk,\n", - " list_contracts,\n", - " retrieve_bulk_open_interest\n", - " )\n", - "from trade.helpers.threads import runThreads\n", - "from trade.helpers.pools import runProcesses, parallel_apply\n", - "from dbase.DataAPI.Organizers import generate_optionData_to_save, Calc_Risks\n", - "from dbase.database.SQLHelpers import store_SQL_data_Insert_Ignore, query_database, dynamic_batch_update\n", - "from trade.helpers.decorators import log_error, log_error_with_stack, log_time\n", - "from trade.helpers.types import OptionModelAttributes\n", - "from dateutil.relativedelta import relativedelta\n", - "from pandas.tseries.offsets import BDay\n", - "from dbase.database.SQLHelpers import DatabaseAdapter\n", - "from trade.models.VolSurface import fit_svi_model\n", - "from trade.models.utils import resolve_missing_vol\n", - "from threading import Thread\n", - "from dbase.utils import add_eod_timestamp, bus_range, enforce_bus_hours, default_timestamp\n", - "from trade.helpers.pools import runProcesses\n", - "from pathos.multiprocessing import ProcessingPool as Pool\n", - "from copy import deepcopy\n", - "pd.options.display.max_columns = 100\n", - "from abc import ABC, abstractmethod\n", - "logger = setup_logger('test_datamanager')\n", - "time_logger = setup_logger('time_logger_test_dm')\n", - "POOL_ENABLED = bool(os.environ.get('POOL_ENABLED'))\n", - "CENTRAL_SAVE_THREAD = {}" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'INTRADAY_AGG': '5m',\n", - " 'MARKET_OPEN_TIME': '09:30',\n", - " 'MARKET_CLOSE_TIME': '16:00',\n", - " 'AVAILABLE_PRICING_MODELS': ['bs', 'binomial', 'mc'],\n", - " 'AVAILABLE_INTERVALS': ['h', 'd', 'w', 'q', 'y', 'M', 'm'],\n", - " 'AVAILABLE_GREEKS': ['vega',\n", - " 'vanna',\n", - " 'volga',\n", - " 'delta',\n", - " 'gamma',\n", - " 'theta',\n", - " 'rho'],\n", - " 'UPPER_BOUND_MONEYNESS': 1.2,\n", - " 'LOWER_BOUND_MONEYNESS': 0.8}" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "## Format of tables is: database_name.table_name\n", - "TABLES = {\n", - " 'eod':{\n", - " 'attribution': 'securities_master.attribution_eod',\n", - " 'spot': 'securities_master.temp_options_eod_new',\n", - " 'vol': 'securities_master.temp_options_eod_new',\n", - " 'greeks': 'securities_master.temp_options_eod_new',\n", - " 'chain': 'vol_surface.option_chain'\n", - " },\n", - " 'intra':{\n", - " 'attribution': 'securities_master.attribution_intra',\n", - " 'spot': 'securities_master.temp_options_intra_new',\n", - " 'vol': 'securities_master.temp_options_intra_new',\n", - " 'greeks': 'securities_master.temp_options_intra_new',\n", - " }\n", - "}\n", - "\n", - "import json\n", - "with open(f\"{os.environ['WORK_DIR']}/pricingConfig.json\") as f:\n", - " PRICING_CONFIG = json.load(f)\n", - "PRICING_CONFIG" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "metadata": {}, - "outputs": [], - "source": [ - "from pathlib import Path\n", - "DB_CACHE_LOCATION = Path(os.environ['WORK_DIR']) / '.cache' \n", - "DB_CACHE = CustomCache(DB_CACHE_LOCATION, fname = 'dm_cache', clear_on_exit=False, expire_days = 180)" - ] - }, - { - "cell_type": "code", - "execution_count": 57, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'/Users/chiemelienwanisobi/cloned_repos/QuantTools/.cache/dm_cache': '2025-11-15',\n", - " '/Users/chiemelienwanisobi/cloned_repos/QuantTools/.riskmanager_cache/chain/bBJszpyN': '2025-07-03',\n", - " '/Users/chiemelienwanisobi/cloned_repos/QuantTools/.riskmanager_cache/close/XzNozWyc': '2025-07-03',\n", - " '/Users/chiemelienwanisobi/cloned_repos/QuantTools/.riskmanager_cache/oi/MWdKMrH7': '2025-07-03',\n", - " '/Users/chiemelienwanisobi/cloned_repos/QuantTools/.riskmanager_cache/spot/SKb4khEe': '2025-07-03',\n", - " '/Users/chiemelienwanisobi/cloned_repos/QuantTools/.riskmanager_cache/order/DiWYKWsv': '2025-05-26',\n", - " '/Users/chiemelienwanisobi/cloned_repos/QuantTools/.riskmanager_cache/rm_spot_timeseries/cmeNf34E': '2025-05-26',\n", - " '/Users/chiemelienwanisobi/cloned_repos/QuantTools/.riskmanager_cache/rm_chain_spot_timeseries/VPQjaKG3': '2025-05-26',\n", - " '/Users/chiemelienwanisobi/cloned_repos/QuantTools/.riskmanager_cache/rm_processed_option_data/baAM7NUS': '2025-05-26',\n", - " '/Users/chiemelienwanisobi/cloned_repos/QuantTools/.riskmanager_cache/rm_position_data/NtGxp2pz': '2025-05-26',\n", - " '/Users/chiemelienwanisobi/cloned_repos/QuantTools/.riskmanager_cache/chain/3FanSWfE': '2025-07-03',\n", - " '/Users/chiemelienwanisobi/cloned_repos/QuantTools/.riskmanager_cache/close/3yEBYQJH': '2025-07-03',\n", - " '/Users/chiemelienwanisobi/cloned_repos/QuantTools/.riskmanager_cache/oi/xtXLVRRP': '2025-07-03',\n", - " '/Users/chiemelienwanisobi/cloned_repos/QuantTools/.riskmanager_cache/spot/8Q9myZZo': '2025-07-03',\n", - " '/Users/chiemelienwanisobi/cloned_repos/QuantTools/.riskmanager_cache/order/GAXYbVU5': '2025-05-26'}" - ] - }, - "execution_count": 57, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "with Path(DB_CACHE.register_location).open() as f:\n", - " register = json.load(f)\n", - "register\n" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from EventDriven.riskmanager.utils import assemble_bulk_data_request\n", - "from module_test.raw_code.DataManagers.DataManagers import BulkOptionDataManager, OptionDataManager\n", - "from module_test.raw_code.DataManagers.Requests import ChainDataRequest\n", - "from trade.helpers.helper import check_all_days_available, check_missing_dates\n", - "#SBUX20240621C110, SBUX20240621C155\n", - "manager = BulkOptionDataManager(symbol = 'SBUX', exp ='20240621' )\n", - "bulk_request = assemble_bulk_data_request(\n", - " self = manager,\n", - " start = '2023-03-07',\n", - " end = '2023-12-31',\n", - " type_ = 'spot',\n", - " strikes_right = [(110.0, 'C'), (115.0, 'C'), (130.0, 'C')]\n", - "\n", - ")\n", - "bulk_request" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Using Cache\n", - "Using Cache\n", - "2025-05-19 02:39:56 dbase.DataAPI.ThetaData CRITICAL: `datetime_col_name` not provided for multi index resample, setting to `Datetime`\n" - ] - } - ], - "source": [ - "single_manager = OptionDataManager('SBUX', exp = '20240621', strike = 110.0, right = 'C')\n", - "single_request = single_manager.get_timeseries(\n", - " start = '2023-03-07',\n", - " end = '2023-03-14',\n", - " type_ = 'spot',\n", - ")\n", - "\n", - "bulk_manager = BulkOptionDataManager('SBUX', exp = '20240621')\n", - "bulk_request = bulk_manager.get_timeseries(\n", - " start = '2023-03-07',\n", - " end = '2023-03-14',\n", - " type_ = 'spot',\n", - " strikes_right = [(110.0, 'C'), (115.0, 'C'), (130.0, 'C')]\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'eerrrrr': '2025-05-19'}\n" - ] - } - ], - "source": [ - "import json\n", - "registry = f'{os.environ[\"WORK_DIR\"]}/trade/helpers/clear_dirs.json'\n", - "with open(registry, 'r') as f:\n", - " json_file = json.load(f)\n", - "print(json_file)\n", - "with open(registry, 'w') as f:\n", - " loc = str(DB_CACHE.dir)\n", - " json_file.update({loc: datetime.now().strftime('%Y-%m-%d')})\n", - " json.dump(json_file, f, default=str)" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "PosixPath('/Users/chiemelienwanisobi/cloned_repos/QuantTools/.cache/dm_cache')" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "DB_CACHE.dir" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
OpenHighLowCloseMidpointVolumeOpeninterest
OptiontickDatetime
SBUX20240621C1102023-03-070.000.00.000.011.32500
2023-03-080.000.00.000.010.92500
2023-03-090.000.00.000.09.80000
2023-03-1010.1010.19.709.79.275260
2023-03-138.808.88.808.88.775319
...........................
SBUX20240621C1302023-03-080.000.00.000.04.47500
2023-03-094.074.14.074.13.95090
2023-03-100.000.00.000.03.67509
2023-03-130.000.00.000.03.42509
2023-03-140.000.00.000.03.40009
\n", - "

226 rows × 7 columns

\n", - "
" - ], - "text/plain": [ - " Open High Low Close Midpoint Volume \\\n", - "Optiontick Datetime \n", - "SBUX20240621C110 2023-03-07 0.00 0.0 0.00 0.0 11.325 0 \n", - " 2023-03-08 0.00 0.0 0.00 0.0 10.925 0 \n", - " 2023-03-09 0.00 0.0 0.00 0.0 9.800 0 \n", - " 2023-03-10 10.10 10.1 9.70 9.7 9.275 26 \n", - " 2023-03-13 8.80 8.8 8.80 8.8 8.775 3 \n", - "... ... ... ... ... ... ... \n", - "SBUX20240621C130 2023-03-08 0.00 0.0 0.00 0.0 4.475 0 \n", - " 2023-03-09 4.07 4.1 4.07 4.1 3.950 9 \n", - " 2023-03-10 0.00 0.0 0.00 0.0 3.675 0 \n", - " 2023-03-13 0.00 0.0 0.00 0.0 3.425 0 \n", - " 2023-03-14 0.00 0.0 0.00 0.0 3.400 0 \n", - "\n", - " Openinterest \n", - "Optiontick Datetime \n", - "SBUX20240621C110 2023-03-07 0 \n", - " 2023-03-08 0 \n", - " 2023-03-09 0 \n", - " 2023-03-10 0 \n", - " 2023-03-13 19 \n", - "... ... \n", - "SBUX20240621C130 2023-03-08 0 \n", - " 2023-03-09 0 \n", - " 2023-03-10 9 \n", - " 2023-03-13 9 \n", - " 2023-03-14 9 \n", - "\n", - "[226 rows x 7 columns]" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bulk_request.post_processed_data" - ] - }, - { - "cell_type": "code", - "execution_count": 247, - "metadata": {}, - "outputs": [], - "source": [ - "single_request.end_date ='2023-12-31'\n" - ] - }, - { - "cell_type": "code", - "execution_count": 165, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "('vol_surface', 'option_chain')" - ] - }, - "execution_count": 165, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "chain_request = ChainDataRequest(\n", - " 'JPM',\n", - " date = '2024-09-18',\n", - " table_name = 'option_chain',\n", - " db_name = 'vol_surface'\n", - ")\n", - "chain_request.db_name, chain_request.table_name" - ] - }, - { - "cell_type": "code", - "execution_count": 257, - "metadata": {}, - "outputs": [], - "source": [ - "DB_CACHE['securities_master.temp_options_eod_new'] = pd.DataFrame()\n", - "DB_CACHE['vol_surface.option_chain'] = pd.DataFrame()\n", - "# del DB_CACHE['securities_master.temp_options_eod_new']\n", - "# DB_CACHE" - ] - }, - { - "cell_type": "code", - "execution_count": 249, - "metadata": {}, - "outputs": [], - "source": [ - "def query_cache(data_request, query_category):\n", - " \"\"\"\n", - " Check if the data is available in the cache.\n", - "\n", - " Args:\n", - " data_request (object): The data request object containing the parameters.\n", - " query_category (str): The category of the query ('single', 'bulk', 'chain').\n", - " Returns:\n", - " bool: True if the data is available in the cache, False otherwise.\n", - "\n", - " Refer to:\n", - " data_request.cache_data: The data retrieved from the cache.\n", - " data_request.query_ticks: The ticks that are missing from the cache.\n", - " \"\"\"\n", - " # 1) Get data from cache.\n", - " cache_data = _check_cache(data_request, query_category)\n", - "\n", - " # 2) Check if it is complete or empty\n", - " if query_category in ['single', 'bulk']:\n", - " data_request.query_ticks, skip_db_query = timeseries_cache_validation(data_request, query_category)\n", - "\n", - " else:\n", - " skip_db_query = not cache_data.empty\n", - " \n", - " data_request.cache_data = cache_data\n", - " return skip_db_query\n", - "\n", - "def _check_cache(data_request, query_category):\n", - " \"\"\"\n", - " Check if the data is available in the cache.\n", - "\n", - " Args:\n", - " data_request (object): The data request object containing the parameters.\n", - " query_category (str): The category of the query ('single', 'bulk', 'chain').\n", - " Returns:\n", - " bool: True if the data is available in the cache, False otherwise.\n", - "\n", - " Refer to:\n", - " data_request.cache_data: The data retrieved from the cache.\n", - " data_request.query_ticks: The ticks that are missing from the cache.\n", - " \"\"\"\n", - " global DB_CACHE\n", - " tick = data_request.symbol\n", - "\n", - " if query_category in ['single', 'bulk']:\n", - " exp = data_request.exp\n", - " start, end = pd.to_datetime(data_request.start_date), pd.to_datetime(data_request.end_date)\n", - " else:\n", - " date = pd.to_datetime(data_request.date).date()\n", - "\n", - " # 1) What Table are we using?\n", - " key = f\"{data_request.db_name}.{data_request.table_name}\"\n", - " \n", - " # 2) Handle Filtering based on query_category\n", - " if query_category == 'single':\n", - " opttick = [data_request.opttick]\n", - " data_request.cache_opttick = opttick\n", - "\n", - " elif query_category == 'bulk':\n", - " strikes_right = data_request.strikes\n", - " opttick = [generate_option_tick_new(tick, x[1], exp, x[0]) for x in strikes_right]\n", - " data_request.cache_opttick = opttick\n", - "\n", - " elif query_category == 'chain':\n", - " pass\n", - " \n", - " else: raise ValueError(\"Unknown query_category. Recieved {query_category}\".format(query_category))\n", - "\n", - " # 3) Get Data from db cache\n", - " cache_data = DB_CACHE.get(key)\n", - " if cache_data is None or cache_data.empty:\n", - " return DB_CACHE.setdefault(key, pd.DataFrame())\n", - " # 3.1) Filter based on type\n", - " else:\n", - " if query_category in ['single', 'bulk']:\n", - " return cache_data[(cache_data.optiontick.isin(opttick)) & \\\n", - " (cache_data.datetime >= start ) & \\\n", - " (cache_data.datetime >= start )]\n", - " else:\n", - " return cache_data[(cache_data.ticker == tick) & \\\n", - " (pd.DatetimeIndex(cache_data.build_date).date == date)]\n", - "\n", - "\n", - "def timeseries_cache_validation(data_request, query_category):\n", - " \"\"\"\n", - " Validate the cache data for timeseries requests.\n", - " Args:\n", - " data_request (object): The data request object containing the parameters.\n", - " query_category (str): The category of the query ('single', 'bulk', 'chain').\n", - " Returns:\n", - " tuple: A tuple containing the missing option ticks and a boolean indicating whether to skip the database query.\n", - " \"\"\"\n", - " \n", - "\n", - " bulk_cache_data = _check_cache(data_request, query_category).copy()\n", - " if bulk_cache_data.empty:\n", - " return data_request.cache_opttick, False\n", - " bulk_cache_data['Datetime'] = bulk_cache_data.datetime\n", - " has_all_ticks = all(x in bulk_cache_data.optiontick.unique() for x in data_request.cache_opttick)\n", - " missing_opttick = [x for x in data_request.cache_opttick if x not in bulk_cache_data.optiontick.unique()]\n", - " bool_series = bulk_cache_data.groupby('optiontick').apply(check_all_days_available, _start = data_request.start_date, _end = data_request.end_date)\n", - " is_available_option_tick_complete = bool_series.all()\n", - " missing_opttick = missing_opttick + bool_series[bool_series==False].index.to_list()\n", - " is_empty = bulk_cache_data.empty\n", - " skip_db_query = has_all_ticks and is_available_option_tick_complete and not is_empty\n", - "\n", - " return missing_opttick, skip_db_query\n" - ] - }, - { - "cell_type": "code", - "execution_count": 250, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 250, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "query_cache(single_request, 'single')" - ] - }, - { - "cell_type": "code", - "execution_count": 252, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[]" - ] - }, - "execution_count": 252, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "single_request.query_ticks" - ] - }, - { - "cell_type": "code", - "execution_count": 262, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Using DB\n", - "[get_pymysql_connection] Creating connection for DB: vol_surface, PID: 13289\n" - ] - } - ], - "source": [ - "def init_query(**kwargs):\n", - "\n", - " \"\"\"\n", - " Initialize the query for the data request and save the data to the request\n", - " \"\"\"\n", - " global DB_CACHE\n", - " data_request = kwargs.get('data_request')\n", - " db = kwargs.get('db', DatabaseAdapter())\n", - " try:\n", - " query_category = kwargs['query_category']\n", - " except KeyError:\n", - " raise KeyError(\"Query category not specified, expected one of: ['single', 'bulk', 'chain']\")\n", - " \n", - " ## 1) Check if it already cached\n", - " skip_db_query = query_cache(data_request, query_category)\n", - " \n", - "\n", - " ## 2) If all available, skip, else query needed\n", - " if skip_db_query:\n", - " print(\"Using Cache\")\n", - " database_data = data_request.cache_data\n", - " database_data.columns = [x.lower() for x in database_data.columns]\n", - " data_request.database_data = database_data\n", - " return database_data\n", - " \n", - " ## 2.1) If not all available, query database for missing\n", - " else:\n", - " print(\"Using DB\")\n", - " if query_category == 'single':\n", - " opttick = data_request.query_ticks[0]\n", - " query = f\"\"\"SELECT *\n", - " FROM {data_request.db_name}.{data_request.table_name}\n", - " WHERE OPTIONTICK = '{opttick}' AND\n", - " DATETIME >= '{data_request.start_date} 00:00:00' AND \n", - " DATETIME <= '{data_request.end_date} 00:00:00'\n", - " \"\"\"\n", - " \n", - " ############# Bulk Query\n", - " elif query_category == 'bulk':\n", - " opttick = data_request.query_ticks\n", - " strikes = data_request.strikes\n", - " opttick_list = [f\"{generate_option_tick_new(data_request.symbol, right, data_request.exp, strike)}\" for strike, right in strikes]\n", - " data_request.opttick = opttick_list ## save the opttick list for future reference\n", - " str_list = [f\"'{x}'\" for x in opttick]\n", - " filter_str = f\"({', '.join(str_list)})\"\n", - " query = f\"\"\"SELECT *\n", - " FROM {data_request.db_name}.{data_request.table_name}\n", - " WHERE OPTIONTICK in {filter_str} AND\n", - " DATETIME >= '{data_request.start_date}' AND \n", - " DATETIME <= '{data_request.end_date}'\n", - " \"\"\"\n", - " \n", - " ############# Chain Query\n", - " elif query_category == 'chain':\n", - " query = f\"\"\"SELECT *\n", - " FROM {data_request.db_name}.{data_request.table_name}\n", - " WHERE TICKER = '{data_request.symbol}' AND\n", - " DATE(BUILD_DATE) = '{data_request.date}' \n", - " \"\"\" \n", - " \n", - " ## 2.2) Join Cache Data & Missing queried data\n", - " database_data = db.query_database(data_request.db_name, data_request.table_name, query)\n", - " database_data.columns = [x.lower() for x in database_data.columns]\n", - " data_request.query = query\n", - " database_data = pd.concat([database_data, data_request.cache_data])\n", - " data_request.database_data = database_data\n", - "\n", - " ## 2.3) Update Cache\n", - " \n", - " key = f\"{data_request.db_name}.{data_request.table_name}\"\n", - " DB_CACHE[key] = pd.concat([\n", - " DB_CACHE[key],\n", - " database_data\n", - " ])\n", - " DB_CACHE[key] = DB_CACHE[key].drop_duplicates(inplace = False)\n", - " return database_data\n", - "\n", - "data = init_query(data_request = chain_request, query_category = 'chain')" - ] - }, - { - "cell_type": "code", - "execution_count": 266, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array(['JPM20240920C100', 'JPM20240920C105', 'JPM20240920C110', ...,\n", - " 'JPM20270115P280', 'JPM20270115P290', 'JPM20270115P300'],\n", - " dtype=object)" - ] - }, - "execution_count": 266, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "data.option_tick.unique()" - ] - }, - { - "cell_type": "code", - "execution_count": 219, - "metadata": {}, - "outputs": [], - "source": [ - "from dbase.database.SQLHelpers import _dispose_all_engines\n", - "_dispose_all_engines()" - ] - }, - { - "cell_type": "code", - "execution_count": 208, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 208, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "DB_CACHE" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "\n", - "class AttributionDataManager:\n", - " pass\n", - "\n", - "\n", - "\n", - "class ScenarioDataManager:\n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": {}, - "outputs": [], - "source": [ - "def flatten_all_dfs(request):\n", - " \"\"\"\n", - " Flattens all dataframes in the request object.\n", - " \"\"\"\n", - " for key, value in request.__dict__.items():\n", - " if isinstance(value, pd.DataFrame):\n", - " request.__dict__[key] = value.to_dict(orient=\"records\")\n", - " elif isinstance(value, pd.Series):\n", - " request.__dict__[key] = value.to_dict()\n", - " return request" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": {}, - "outputs": [], - "source": [ - "import json \n", - "def save_failed_request(request):\n", - " \"\"\"\n", - " Saves the failed request to a JSON file.\n", - " \"\"\"\n", - " request = flatten_all_dfs(request)\n", - " with open(f'{os.environ[\"WORK_DIR\"]}/module_test/raw_code/DataManagers/failed_request.jsonl', 'a') as f:\n", - " json.dump(request.__dict__, f, default=str)\n", - " f.write('\\n')" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [], - "source": [ - "save_failed_request(request)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## CALCULATE FUNCTIONS" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "def calc_vol_for_data(\n", - " df,\n", - " price_col,\n", - " col_name,\n", - " model,\n", - " col_kwargs = None\n", - ") -> pd.DataFrame:\n", - " \"\"\"\n", - " Adds a vol column to passed dataframe.\n", - "\n", - " Parameters:\n", - " df: DataFrame containing following columns: `underlier_price`, `strike`, `expiration`, `datetime`, `rf_rate`, `dividend`, `put/call`\n", - " price_col: Column to back out Implied Vol from\n", - " model: bs or binomial\n", - " col_name: name of added column\n", - " col_kwargs: dictionary with keys as column names in df and values as the corresponding column names in the model\n", - " expected keys: `underlier_price`, `strike`, `expiration`, `datetime`, `rf_rate`, `dividend`, `put/call`\n", - "\n", - " returns pd.DataFrame\n", - " \"\"\"\n", - " enforce_allowed_models(model)\n", - " \n", - " if not col_kwargs:\n", - " col_kwargs = {\n", - " 'underlier_price': 'underlier_price',\n", - " 'strike': 'strike',\n", - " 'expiration': 'expiration',\n", - " 'datetime': 'datetime',\n", - " 'rf_rate': 'rf_rate',\n", - " 'dividend': 'dividend',\n", - " 'put/call': 'put/call',\n", - " }\n", - "\n", - " if model == 'bs':\n", - " df[col_name] = df.apply(\n", - " lambda x:IV_handler(S = x[col_kwargs['underlier_price']], \n", - " K = x[col_kwargs['strike']], \n", - " price = x[price_col], \n", - " t = time_distance_helper(x[col_kwargs['expiration']], x[col_kwargs['datetime']]), \n", - " r = x[col_kwargs['rf_rate']], \n", - " q = x[col_kwargs['dividend']], \n", - " flag = x[col_kwargs['put/call']].lower()), axis = 1\n", - " )\n", - " \n", - " elif model == 'binomial':\n", - " df[col_name] = df.apply(\n", - " lambda x: binomial_implied_vol(price = x[price_col], \n", - " S = x[col_kwargs['underlier_price']], \n", - " K = x[col_kwargs['strike']], \n", - " r = x[col_kwargs['rf_rate']], \n", - " exp_date=x[col_kwargs['expiration']], \n", - " option_type=x[col_kwargs['put/call']].lower(), \n", - " pricing_date=x[col_kwargs['datetime']], \n", - " dividend_yield=x[col_kwargs['dividend']]), axis=1\n", - " )\n", - " return df" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def calc_vol_for_data_parallel(\n", - " df,\n", - " price_col,\n", - " col_name,\n", - " model,\n", - " col_kwargs = None,\n", - " pool = POOL_ENABLED\n", - ") -> pd.DataFrame:\n", - " \"\"\"\n", - " Adds a vol column to passed dataframe.\n", - "\n", - " Parameters:\n", - " df: DataFrame containing following columns: `underlier_price`, `strike`, `expiration`, `datetime`, `rf_rate`, `dividend`, `put/call`\n", - " price_col: Column to back out Implied Vol from\n", - " model: bs or binomial\n", - " col_name: name of added column\n", - " col_kwargs: dictionary with keys as column names in df and values as the corresponding column names in the model\n", - " expected keys: `underlier_price`, `strike`, `expiration`, `datetime`, `rf_rate`, `dividend`, `put/call`\n", - "\n", - " returns pd.DataFrame\n", - " \"\"\"\n", - " enforce_allowed_models(model)\n", - " \n", - " if not col_kwargs:\n", - " col_kwargs = {\n", - " 'underlier_price': 'underlier_price',\n", - " 'strike': 'strike',\n", - " 'expiration': 'expiration',\n", - " 'datetime': 'datetime',\n", - " 'rf_rate': 'rf_rate',\n", - " 'dividend': 'dividend',\n", - " 'put/call': 'put/call',\n", - " }\n", - " temp_df = df.copy()\n", - " temp_df.rename(columns=col_kwargs, inplace=True)\n", - " temp_df['t'] = temp_df.apply(lambda x: time_distance_helper(x[col_kwargs['expiration']], x[col_kwargs['datetime']]), axis=1)\n", - " binomial_column = [price_col, col_kwargs['underlier_price'], \n", - " col_kwargs['strike'], col_kwargs['rf_rate'], col_kwargs['expiration'],\n", - " col_kwargs['put/call'], col_kwargs['datetime'], col_kwargs['dividend'],]\n", - " \n", - " bs_column = [price_col, col_kwargs['underlier_price'], col_kwargs['strike'], 't', col_kwargs['rf_rate'], col_kwargs['dividend'], col_kwargs['put/call']]\n", - " if model == 'bs':\n", - " df[col_name] = parallel_apply(temp_df[bs_column], IV_handler, pool = pool)\n", - " \n", - " elif model == 'binomial':\n", - " df[col_name] = parallel_apply(temp_df[binomial_column], binomial_implied_vol, pool = pool)\n", - " return df" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "def calc_greeks_for_data(\n", - " df,\n", - " model,\n", - " vol_col,\n", - " greek_name_format,\n", - " col_kwargs = None,\n", - " greek_name = None\n", - ") -> pd.DataFrame:\n", - " \"\"\"\n", - " Adds a greek column to passed dataframe.\n", - "\n", - " Parameters:\n", - " df: DataFrame containing following columns: `underlier_price`, `strike`, `expiration`, `datetime`, `rf_rate`, `dividend`, `put/call`\n", - " model: bs or binomial\n", - " greek_name: Format of greek name. Eg \"Midpoint_BS_{x}\" or \"Midpoint_binomial_{x}\"\n", - "\n", - " returns pd.DataFrame\n", - " \"\"\"\n", - " enforce_allowed_models(model) \n", - " if not col_kwargs:\n", - " col_kwargs = {\n", - " 'underlier_price': 'underlier_price',\n", - " 'strike': 'strike',\n", - " 'expiration': 'expiration',\n", - " 'datetime': 'datetime',\n", - " 'rf_rate': 'rf_rate',\n", - " 'dividend': 'dividend',\n", - " 'put/call': 'put/call',\n", - " } \n", - " \n", - " if not greek_name:\n", - " if model == 'bs':\n", - " greek = df.apply(\n", - " lambda x:Calculate.greeks(S = x[col_kwargs['underlier_price']], \n", - " K = x[col_kwargs['strike']], \n", - " r = x[col_kwargs['rf_rate']], \n", - " sigma = x[vol_col], \n", - " start = x[col_kwargs['datetime']].strftime('%Y-%m-%d'), \n", - " flag =x[col_kwargs['put/call']].lower(),\n", - " exp = x[col_kwargs['expiration']], \n", - " y = x[col_kwargs['dividend']]), axis = 1, result_type = 'expand'\n", - " )\n", - " elif model == 'binomial':\n", - " greek = df.apply(\n", - " lambda x:Calculate.greeks(S = x[col_kwargs['underlier_price']], \n", - " K = x[col_kwargs['strike']], \n", - " r = x[col_kwargs['rf_rate']], \n", - " sigma = x[vol_col], \n", - " start = x[col_kwargs['datetime']].strftime('%Y-%m-%d'), \n", - " flag =x[col_kwargs['put/call']].lower(), \n", - " exp = x[col_kwargs['expiration']], \n", - " y = x[col_kwargs['dividend']],\n", - " model = model), axis = 1, result_type = 'expand'\n", - " )\n", - " greek.columns = [greek_name_format.format(x=x) for x in greek.columns]\n", - " df[greek.columns] = greek\n", - " return df\n", - " else:\n", - " calc_func = getattr(Calculate, greek_name.lower())\n", - " greek = df.apply(\n", - " lambda x:calc_func(S = x[col_kwargs['underlier_price']], \n", - " K = x[col_kwargs['strike']], \n", - " r = x[col_kwargs['rf_rate']], \n", - " sigma = x[vol_col], \n", - " start = x[col_kwargs['datetime']].strftime('%Y-%m-%d'), \n", - " flag =x[col_kwargs['put/call']].lower(), \n", - " exp = x[col_kwargs['expiration']], \n", - " y = x[col_kwargs['dividend']]), axis = 1)\n", - " \n", - " df[greek_name_format.format(x=greek_name)] = greek\n", - " return df\n", - "\n", - "\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "def calc_greeks_for_data_parallel(\n", - " df,\n", - " model,\n", - " vol_col,\n", - " greek_name_format,\n", - " col_kwargs = None,\n", - " greek_name = None,\n", - " pool = POOL_ENABLED\n", - ") -> pd.DataFrame:\n", - " \"\"\"\n", - " Adds a greek column to passed dataframe.\n", - "\n", - " Parameters:\n", - " df: DataFrame containing following columns: `underlier_price`, `strike`, `expiration`, `datetime`, `rf_rate`, `dividend`, `put/call`\n", - " model: bs or binomial\n", - " greek_name: Format of greek name. Eg \"Midpoint_BS_{x}\" or \"Midpoint_binomial_{x}\"\n", - "\n", - " returns pd.DataFrame\n", - " \"\"\"\n", - " enforce_allowed_models(model) \n", - " if not col_kwargs:\n", - " col_kwargs = {\n", - " 'underlier_price': 'underlier_price',\n", - " 'strike': 'strike',\n", - " 'expiration': 'expiration',\n", - " 'datetime': 'datetime',\n", - " 'rf_rate': 'rf_rate',\n", - " 'dividend': 'dividend',\n", - " 'put/call': 'put/call',\n", - " } \n", - "\n", - " temp_df = df.copy()\n", - " temp_df.rename(columns=col_kwargs, inplace=True)\n", - " temp_df['t'] = temp_df.apply(lambda x: time_distance_helper(x[col_kwargs['expiration']], x[col_kwargs['datetime']]), axis=1)\n", - " temp_df['asset'] = None\n", - " temp_df['model'] = model\n", - " greeks_colums_use = ['asset',col_kwargs['underlier_price'], col_kwargs['strike'], \n", - " col_kwargs['rf_rate'], 'midpoint_binomial_iv',\n", - " col_kwargs[ 'datetime'], col_kwargs['put/call'], col_kwargs['expiration'], col_kwargs['dividend'], 'model']\n", - " \n", - " if not greek_name:\n", - " greek = parallel_apply(temp_df[greeks_colums_use], Calculate.greeks, pool = pool)\n", - " greek = pd.DataFrame(greek)\n", - " greek.columns = [greek_name_format.format(x=x) for x in greek.columns]\n", - " greek.index = temp_df.index\n", - " df[greek.columns] = greek\n", - " return df\n", - " else:\n", - " calc_func = getattr(Calculate, greek_name.lower())\n", - " greek = parallel_apply(temp_df[greeks_colums_use], calc_func, pool = pool)\n", - " df[greek_name_format.format(x=greek_name)] = greek\n", - " return df\n" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "def calc_dollar_delta_from_data(\n", - " df,\n", - " delta_col,\n", - " col_name \n", - ") -> pd.DataFrame:\n", - " \"\"\"\n", - " Adds a Dollar Delta Column to passed dataframe\n", - "\n", - " parameters:\n", - " df: DataFrame containing following columns: `underlier_price`, `strike`, `expiration`, `datetime`, `rf_rate`, `dividend`, `put/call`\n", - " delta_col: Delta Column to use in multiplication\n", - " col_name: Format for added columns. Eg \"midpoint_dollar_delta\"\n", - " \"\"\"\n", - "\n", - " df[col_name] = df['underlier_price'] * df[delta_col]\n", - " return df" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "def resolve_missing_vols_in_data(\n", - " df,\n", - " vol_resolve_list,\n", - " model_map_list,\n", - " price_map_list,\n", - " agg,\n", - "):\n", - " \"\"\"\n", - " Resolves missing vols in passed dataframe\n", - "\n", - " parameters:\n", - " df: DataFrame containing following columns: `underlier_price`, `strike`, `expiration`, `datetime`, `rf_rate`, `dividend`, `put/call`\n", - " vol_resolve_list: List of columns to resolve missing vols in\n", - " model_map_list: List of models to use for resolving missing vols. Maps according to vol_resolve_list index\n", - " price_map_list: List of columns to use for pricing. Maps according to vol_resolve_list index\n", - " \"\"\"\n", - " for col, model, price_col in zip(vol_resolve_list, model_map_list, price_map_list):\n", - " zero_vol = df[col] == 0\n", - " resolved_vols = df[zero_vol].apply(\n", - " lambda x:resolve_missing_vol(\n", - " underlier = x['underlier'],\n", - " expiration = x['expiration'],\n", - " strike = x['strike'],\n", - " put_call = x['put/call'],\n", - " datetime = x['datetime'],\n", - " S = x['underlier_price'],\n", - " r = x['rf_rate'],\n", - " q = x['dividend'],\n", - " pricing_model = model,\n", - " agg = agg,\n", - " ), axis = 1)\n", - " df.loc[zero_vol, col] = resolved_vols\n", - " new_pv = df[zero_vol].apply(\n", - " lambda x: optionPV_helper(\n", - " spot_price = x['underlier_price'],\n", - " strike_price = x['strike'],\n", - " exp_date = x['expiration'],\n", - " risk_free_rate = x['rf_rate'],\n", - " dividend_yield = x['dividend'],\n", - " volatility = x[col],\n", - " putcall = x['put/call'],\n", - " settlement_date_str= x['datetime'],\n", - " model = model,\n", - " ), axis = 1\n", - " )\n", - " df.loc[zero_vol, price_col] = new_pv\n", - "\n", - " ## After resolving Vols, we will have to recalculate the specific price\n", - " \n", - " return df" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "__all__ = [\n", - " 'DataManagerBase',\n", - " 'OptionDataManager',\n", - " 'SpotDataManager',\n", - " 'VolDataManager',\n", - " 'GreeksDataManager',\n", - " 'AttributionDataManager',\n", - "]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## MANAGERLAZYLOADER" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "class _ManagerLazyLoader:\n", - " def __init__(self, symbol):\n", - " self.symbol = symbol\n", - " self.Stock = Stock(self.symbol, run_chain = False)\n", - " self._eod = {}\n", - " self._intra = {}\n", - "\n", - "\n", - " @property\n", - " def eod(self):\n", - " \"\"\"\n", - " Returns the end of day data\n", - " \"\"\"\n", - " class EODData(dict):\n", - " def __init__(inner, parent): ## inner is the instance of the class, parent is the instance of the parent class\n", - " inner.parent = parent\n", - " super().__init__()\n", - "\n", - " def __getitem__(inner, key): ## Custom getter for EOD Dict. To initialize the data, if not already done\n", - " if key not in inner.parent._eod:\n", - " if key not in ['s0_close', 's0_chain', 'r', 'y', 'r_name']:\n", - " raise KeyError(f\"{key} not in eod data, expected one of: ['s0_close', 's0_chain', 'r', 'y', 'r_name]\")\n", - " inner.parent._eod[key] = inner.parent._lazy_load(key, intra_flag = False)\n", - " return inner.parent._eod[key]\n", - " \n", - " def __contains__(innner, key):\n", - " return key in inner.parent._eod\n", - " \n", - " def __repr__(inner):\n", - " return inner.parent._eod.__repr__()\n", - " \n", - " def __len__(inner):\n", - " return len(inner.parent._eod)\n", - " \n", - " def keys(inner):\n", - " return inner.parent._eod.keys()\n", - " return EODData(self)\n", - " \n", - " @property\n", - " def intra(self):\n", - " \"\"\"\n", - " Returns the end of day data\n", - " \"\"\"\n", - " class IntraData(dict):\n", - " def __init__(inner, parent):\n", - " inner.parent = parent\n", - " super().__init__()\n", - "\n", - " def __getitem__(inner, key): ## Custom getter for EOD Dict. To initialize the data, if not already done\n", - " if key not in inner.parent._intra:\n", - " if key not in ['s0_close', 's0_chain', 'r', 'y', 'r_name']:\n", - " raise KeyError(f\"{key} not in intra data, expected one of: ['s0_close', 's0_chain', 'r', 'y', 'r_name']\")\n", - " inner.parent._intra[key] = inner.parent._lazy_load(key, ts_timewidth = '5', ts_timeframe = 'minute', intra_flag = True)\n", - " return inner.parent._intra[key]\n", - " \n", - " def __contains__(innner, key):\n", - " return key in inner.parent._intra\n", - " \n", - " def __repr__(inner):\n", - " return inner.parent._intra.__repr__()\n", - " \n", - " def __len__(inner):\n", - " return len(inner.parent._intra)\n", - " \n", - " def keys(inner):\n", - " return inner.parent._intra.keys()\n", - " return IntraData(self)\n", - "\n", - "\n", - " def _lazy_load(self, load_name, **kwargs):\n", - " ## Utilizing the lazy load function to load data on demand, and speed up initialization\n", - " if load_name == 's0_close':\n", - "\n", - " ## Will use Kwargs to move between intra and EOD.\n", - " kwargs.pop('intra_flag')\n", - " return_item = (self.Stock.spot(ts = True,\n", - " ts_start = pd.to_datetime(self.exp) - relativedelta(years=5),\n", - " ts_end =pd.to_datetime(self.exp) + relativedelta(years=5),\n", - " **kwargs))\n", - " return return_item\n", - " \n", - " elif load_name == 's0_chain':\n", - " kwargs.pop('intra_flag')\n", - " return_item = (self.Stock.spot(ts = True,\n", - " ts_start = pd.to_datetime(self.exp) - relativedelta(years=5),\n", - " ts_end =pd.to_datetime(self.exp) + relativedelta(years=5),\n", - " spot_type='chain_price',\n", - " **kwargs))\n", - " return return_item\n", - " \n", - " elif load_name == 'r':\n", - " intra_flag = kwargs.get('intra_flag', False)\n", - " r = (get_risk_free_rate_helper()['annualized'])\n", - " if intra_flag:\n", - " return resample(r, PRICING_CONFIG['INTRADAY_AGG'], {'risk_free_rate':'ffill'})\n", - " else:\n", - " return r\n", - " \n", - " elif load_name == 'r_name':\n", - " intra_flag = kwargs.get('intra_flag', False)\n", - " r = (get_risk_free_rate_helper()['name'])\n", - "\n", - " if intra_flag:\n", - " return resample(r, PRICING_CONFIG['INTRADAY_AGG'], {'risk_free_rate':'ffill'})\n", - " else:\n", - " return r\n", - "\n", - " elif load_name == 'y':\n", - " ## Get the dividend yield\n", - " intra_flag = kwargs.get('intra_flag', False)\n", - " y = (self.Stock.div_yield_history(start = pd.to_datetime(self.exp) - relativedelta(years=2)))\n", - "\n", - " if intra_flag:\n", - " return resample(y, PRICING_CONFIG['INTRADAY_AGG'], {'dividend_yield':'ffill'})\n", - " else:\n", - " return y\n", - " \n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## VOL SPOT GREEK MANAGER" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "class SpotDataManager:\n", - " def __init__(self, symbol:str):\n", - " self.symbol = symbol\n", - "\n", - " def query_thetadata(self,\n", - " start: str | datetime,\n", - " end: str | datetime,\n", - " strike: float = None,\n", - " exp: str | datetime = None,\n", - " right: str = None,\n", - " bulk: bool = False,\n", - " **kwargs) -> pd.DataFrame:\n", - " \"\"\"\n", - " Query the spot data & Open Interest from ThetaData API.\n", - " \"\"\"\n", - " data_request = kwargs.get('data_request')\n", - " print_url = kwargs.get('print_url', False)\n", - " agg = data_request.agg\n", - " if agg == 'eod':\n", - " if not bulk:\n", - " data = retrieve_eod_ohlc(symbol=self.symbol, end_date=end, exp=exp, right=right, start_date=start, strike=strike, print_url=print_url)\n", - " data = data[~data.index.duplicated(keep='first')]\n", - " open_interest = retrieve_openInterest(symbol=self.symbol, end_date=end, exp=exp, right=right, start_date=start, strike=strike, print_url=print_url).set_index('Datetime')\n", - " data['Open_interest'] = open_interest['Open_interest']\n", - " data.index = default_timestamp(data.index)\n", - " return data\n", - "\n", - " else:\n", - " bulk = retrieve_bulk_eod(\n", - " symbol = self.symbol,\n", - " exp = exp,\n", - " start_date = start,\n", - " end_date = end,\n", - " )\n", - "\n", - " ## Add Option Tick\n", - " bulk_eod = bulk.reset_index()\n", - " tick_col = ['Root', 'Right', 'Expiration', 'Strike']\n", - " bulk_eod['OptionTick'] = parallel_apply(bulk_eod[tick_col], generate_option_tick_new, pool = POOL_ENABLED)\n", - " if data_request.opttick is not None:\n", - " bulk_eod = bulk_eod[bulk_eod['OptionTick'].isin(data_request.opttick)]\n", - "\n", - "\n", - " ## Query Bulk Open Interest\n", - " bulk_oi = retrieve_bulk_open_interest(\n", - " symbol = self.symbol,\n", - " exp = exp,\n", - " start_date = start,\n", - " end_date = end,\n", - " )\n", - " ## Add Option Tick\n", - " bulk_oi['OptionTick'] = parallel_apply(bulk_oi[tick_col], generate_option_tick_new, pool = POOL_ENABLED)\n", - " if data_request.opttick is not None:\n", - " bulk_oi = bulk_oi[bulk_oi['OptionTick'].isin(data_request.opttick)]\n", - " ## Add EOD Timestamp\n", - " bulk_oi['Datetime'] = add_eod_timestamp(pd.DatetimeIndex(bulk_oi['Datetime']))\n", - " data = bulk_eod.merge(bulk_oi[['Datetime','OptionTick', 'Open_interest']], on = ['Datetime', 'OptionTick'], how = 'left')\n", - " data = data.rename(columns = {'Root': 'ticker', 'Strike':'k', 'Expiration': 'exp_date'})\n", - " data.set_index('Datetime', inplace = True)\n", - " data.index = default_timestamp(pd.DatetimeIndex(data.index))\n", - " return data\n", - " \n", - " elif agg == 'intra':\n", - " if not bulk:\n", - " data = retrieve_ohlc(symbol=self.symbol, end_date=end, exp=exp, right=right, start_date=pd.to_datetime(start) - BDay(1), strike=strike, print_url=print_url)\n", - " ## For open Interest we will query from Start - 1BDay to End\n", - " open_interest = retrieve_openInterest(symbol=self.symbol, end_date=end, exp=exp, right=right, \n", - " start_date=pd.to_datetime(start) - BDay(1), strike=strike, \n", - " print_url=print_url).set_index('Datetime')['Open_interest']\n", - " \n", - " ## PS: Quering for Open Interest uses Start - 1BDAY to END\n", - " ## This is because open interest returns EOD. Resampling to intraday moves previous day data to current day\n", - " ## Therefore, first date will be NaN because it will be the previous day data, which is not included in the query results\n", - " open_interest = resample(open_interest, PRICING_CONFIG['INTRADAY_AGG'] )\n", - " data['Open_interest']=open_interest\n", - " \n", - " return data#.dropna()\n", - " # return open_interest\n", - " else:\n", - " raise NotImplementedError(\"Bulk data not implemented for intra data\")\n", - " \n", - "\n", - "class VolDataManager:\n", - " def __init__(self, symbol:str):\n", - " self.symbol = symbol\n", - "\n", - " def calculate_iv(self, **kwargs):\n", - " \"\"\"\n", - " Calculate the implied volatility using the model.\n", - " \"\"\"\n", - " data_request = kwargs['data_request']\n", - " model = data_request.model\n", - " raw_data = data_request.raw_spot_data\n", - " raw_data.columns = [x.lower() for x in raw_data.columns]\n", - " raw_data['datetime'] = raw_data.index\n", - " return_cols = []\n", - " for col, name in data_request.iv_cols.items():\n", - " calc_vol_for_data_parallel(raw_data, col, name, model, col_kwargs = data_request.col_kwargs, pool = False)\n", - "\n", - " raw_data.drop(columns=['datetime'], inplace=True)\n", - "\n", - "\n", - "class GreeksDataManager:\n", - " def __init__(self, symbol:str):\n", - " self.symbol = symbol\n", - "\n", - " def calculate_greeks(self, type_, **kwargs):\n", - " \n", - " data_request = kwargs['data_request']\n", - " model = data_request.model\n", - " raw_data = data_request.raw_spot_data\n", - " raw_data.columns = [x.lower() for x in raw_data.columns]\n", - " raw_data['datetime'] = raw_data.index\n", - " if type_ in ['greek', 'greeks']:\n", - " ## Greeks\n", - " for col, format_name in data_request.greek_cols.items():\n", - " calc_greeks_for_data_parallel(raw_data, model, col, format_name, col_kwargs = data_request.col_kwargs, pool = False)\n", - " else:\n", - " ## Individual Greeks\n", - " for col, format_name in data_request.greek_cols.items():\n", - " calc_greeks_for_data_parallel(raw_data, model, col, format_name, col_kwargs = data_request.col_kwargs, greek_name=type_, pool = False)\n", - " \n", - " raw_data.drop(columns=['datetime'], inplace=True)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## CHAIN MANAGER" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Using Function to query the database\n" - ] - } - ], - "source": [ - "class ChainDataRequest:\n", - " def __init__(self, symbol, date, table_name, db_name):\n", - " self.symbol = symbol\n", - " self.date = date\n", - " self.table_name = table_name\n", - " self.db_name = db_name\n", - " \n", - "\n", - "\n", - "## Writing this as a separate class to handle the chain data\n", - "## I don't want it to depend on OptionDataManager\n", - "## Because it isn't tethered to a specific option.\n", - "class ChainDataManager(_ManagerLazyLoader):\n", - " \"\"\"\n", - " Class to manage the chain data for a given symbol.\n", - " It inherits from the _ManagerLazyLoader class to load data on demand.\n", - " It uses the ChainDataRequest class to handle the data requests.\n", - " It uses the DatabaseAdapter class to handle the database operations.\n", - " \"\"\"\n", - " def __init__(self, symbol):\n", - " \"\"\"\n", - " Initialize the ChainDataManager with the symbol.\n", - " \"\"\"\n", - " super().__init__(symbol)\n", - " self.symbol = symbol\n", - " self.requests = {}\n", - " self.current_request = ''\n", - " self.db = DatabaseAdapter()\n", - "\n", - "\n", - " def get_at_time(self, date:str, organize:bool = False) -> pd.DataFrame:\n", - " database, table = TABLES['eod']['chain'].split('.')\n", - " self.current_request = datetime.now().strftime(\"%Y%m%d %H:%M:%S\")\n", - " data_request = ChainDataRequest(\n", - " symbol=self.symbol,\n", - " date = date,\n", - " table_name = table,\n", - " db_name = database )\n", - " self.requests[self.current_request] = data_request\n", - " init_query(data_request=data_request, db=self.db, query_category='chain')\n", - " self.__pre_process(data_request=data_request)\n", - " is_empty = data_request.is_empty\n", - " if is_empty:\n", - " print(f\"Data for {self.symbol} on {date} is empty\")\n", - " self.__post_process(data_request=data_request)\n", - " save_thread = Thread(target=self.save_chain_data, args=(data_request,), daemon=True, name = \"save_chain_data\")\n", - " save_thread.start()\n", - " data_request.save_thread = save_thread\n", - " CENTRAL_SAVE_THREAD[self.current_request] = save_thread\n", - "\n", - " else:\n", - " data_request.post_processed_data = data_request.database_data\n", - "\n", - " if organize:\n", - " data = data_request.post_processed_data.copy()\n", - " data.columns = data.columns.str.capitalize() \n", - " data.rename(columns = {'Dte': 'DTE', 'Price': 'Midpoint'}, inplace=True)\n", - " chain = data.pivot_table(\n", - " index = ['Expiration', 'DTE', 'Strike'],\n", - " columns = ['Right'],\n", - " values = ['Midpoint']\n", - " )\n", - " data_request.organized_data = chain\n", - " else:\n", - " data_request.organized_data = data_request.post_processed_data\n", - " \n", - " return data_request\n", - " \n", - " \n", - "\n", - " def __pre_process(self, **kwargs):\n", - " \"\"\"\n", - " Preprocess the data for the request\n", - " \"\"\"\n", - " data_request = kwargs.get('data_request')\n", - " database_data = data_request.database_data\n", - " database_data.columns = [x.lower() for x in database_data.columns]\n", - " if database_data.empty:\n", - " data_request.is_empty = True\n", - " else:\n", - " data_request.is_empty = False\n", - " \n", - " return database_data\n", - "\n", - " def __post_process(self, **kwargs):\n", - " \"\"\"\n", - " Postprocess the data for the request\n", - " \"\"\"\n", - " logger.warning(f\"ChainDataManger will not be returning Volatility data due to performance.\")\n", - " data_request = kwargs.get('data_request')\n", - " date = data_request.date\n", - " chain = retrieve_chain_bulk(self.symbol, 0, date, date, PRICING_CONFIG['MARKET_CLOSE_TIME'])\n", - " chain.index.name = 'build_date'\n", - " self.exp = chain['Expiration'].unique()[0] ## Setting Expiration Date as an instance variable so LazyLoaderManager can use it\n", - " chain_v2 = chain.rename(columns = {'Root':'ticker', 'Midpoint': 'price'}).drop(columns = ['Date']).reset_index()\n", - " chain_v2.columns = [x.lower() for x in chain_v2.columns]\n", - " chain_v2['dte'] = (chain_v2['expiration'] - chain_v2['build_date']).dt.days\n", - " chain_v2['spot'] = self.eod['s0_chain']['close'][date]\n", - " chain_v2['r'] = self.eod['r'][date]\n", - " chain_v2['q'] = self.eod['y'][date]\n", - " chain_v2['option_tick'] = chain_v2.apply(lambda x: generate_option_tick_new(x['ticker'], x['right'], x['expiration'].strftime('%Y-%m-%d'), x['strike']), axis=1)\n", - " chain_v2['moneyness'] = chain_v2.apply(lambda x: x['spot'] / x['strike'], axis=1)\n", - " data_request.post_processed_data = chain_v2\n", - "\n", - " def save_chain_data(self, data_request, **kwargs):\n", - " \"\"\"\n", - " Save the chain data to the database\n", - " \"\"\"\n", - " col_kwargs = {\n", - " 'underlier_price': 'spot',\n", - " 'strike': 'strike',\n", - " 'expiration': 'expiration',\n", - " 'datetime': 'build_date',\n", - " 'rf_rate': 'r',\n", - " 'dividend': 'q',\n", - " 'put/call': 'right'\n", - " }\n", - " chain_data = data_request.post_processed_data\n", - " calc_vol_for_data(chain_data, 'price', 'bs_vol', 'bs', col_kwargs=col_kwargs)\n", - " binomial_col = ['price', 'spot', 'strike', 'r', 'expiration', 'right', 'build_date', 'q']\n", - " chain_data['binomial_vol'] = parallel_apply(chain_data[binomial_col], binomial_implied_vol, timeout=10, pool=POOL_ENABLED)\n", - "\n", - " self.db.save_to_database(chain_data, data_request.db_name, data_request.table_name,)\n", - "\n", - "\n", - "chain_manager_ = ChainDataManager('AAPL')\n", - "request = chain_manager_.get_at_time('2022-01-21', organize=False)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 94, - "metadata": {}, - "outputs": [], - "source": [ - "del chain_manager" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## MISC FUNC" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "def handle_extra_cols(extra_cols, type_, model):\n", - " return_cols = []\n", - " if extra_cols:\n", - " assert all([x in ['ask', 'bid', 'open'] for x in extra_cols]), f\"Expected extra_cols to be one of: ['ask', 'bid', 'open'] received {extra_cols}\"\n", - " \n", - " if type_ == 'spot':\n", - " for col in extra_cols:\n", - " if col == 'ask':\n", - " return_cols.append('closeask')\n", - " elif col == 'bid':\n", - " return_cols.append('closebid')\n", - " elif col == 'open':\n", - " return_cols.append('open')\n", - "\n", - " elif type_ == 'vol':\n", - " for col in extra_cols:\n", - " if col == 'ask':\n", - " return_cols.append(f'ask_{model}_iv')\n", - " elif col == 'bid':\n", - " return_cols.append(f'bid_{model}_iv')\n", - " elif col == 'open':\n", - " raise ValueError(\"Open not implemented for vol data\")\n", - " \n", - " elif type_ in ['greeks', 'greek']:\n", - " if model == 'bs':\n", - " raise ValueError(\"Extra Cols not implemented for BS Greeks\")\n", - " elif model == 'binomial':\n", - " for col in extra_cols:\n", - " if col == 'ask':\n", - " return_cols.extend([f'ask_{model}_{x}' for x in PRICING_CONFIG['AVAILABLE_GREEKS']])\n", - " elif col == 'bid':\n", - " return_cols.extend([f'bid_{model}_{x}' for x in PRICING_CONFIG['AVAILABLE_GREEKS']])\n", - " elif col == 'open':\n", - " raise ValueError(\"Open not implemented for greek data\")\n", - " \n", - " elif type_ in PRICING_CONFIG['AVAILABLE_GREEKS']:\n", - " if model == 'bs':\n", - " raise ValueError(\"Extra Cols not implemented for BS Greeks\")\n", - " for col in extra_cols:\n", - " if col == 'ask':\n", - " return_cols.append(f'ask_{model}_{type_}')\n", - " elif col == 'bid':\n", - " return_cols.append(f'bid_{model}_{type_}')\n", - " elif col == 'open':\n", - " raise ValueError(\"Open not implemented for vol data\")\n", - " \n", - " return return_cols" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "def build_name_format(type_, model, extra_cols, default_fill):\n", - " \"\"\"\n", - " Build the name format for the columns\n", - " \"\"\"\n", - " name_format = {}\n", - "\n", - " if type_ == 'vol':\n", - " if model == 'bs':\n", - " name_format['close'] = 'bs_iv'\n", - " name_format[f\"{default_fill}\"] = f\"{default_fill}_bs_iv\"\n", - "\n", - " ## Handle extra columns\n", - " for col in extra_cols:\n", - " if col.lower() in ['open']:\n", - " continue\n", - " name_format[f\"close{col}\"] = handle_extra_cols([col], type_, model)[0]\n", - "\n", - "\n", - " elif model == 'binomial':\n", - " name_format['close'] = 'binomial_iv'\n", - " name_format[f\"{default_fill}\"] = f\"{default_fill}_binomial_iv\"\n", - " for col in extra_cols:\n", - " if col.lower() in ['open']:\n", - " continue\n", - " name_format[f\"close{col}\"] = handle_extra_cols([col], type_, model)[0]\n", - " \n", - " elif type_ in ['greek', 'greeks']:\n", - " if model == 'bs':\n", - " name_format['bs_iv'] = '{x}'\n", - " name_format[f\"{default_fill}_bs_iv\"] = f'{default_fill}_'+'{x}'\n", - " if extra_cols:\n", - " pass ## Figure out how to handle extra cols\n", - " \n", - " elif model == 'binomial':\n", - " name_format['binomial_iv'] = 'binomial_{x}'\n", - " name_format[f\"{default_fill}_binomial_iv\"] = f'{default_fill}_binomial_'+'{x}'\n", - " for col in extra_cols:\n", - " name_format[f\"{col}_binomial_iv\"] = f\"{col}_{model}_\" +\"{x}\"\n", - " \n", - " elif type_ in PRICING_CONFIG['AVAILABLE_GREEKS']:\n", - " if model == 'bs':\n", - " name_format['bs_iv'] = '{x}'\n", - " name_format[f\"{default_fill}_bs_iv\"] = f'{default_fill}_'+'{x}'\n", - " elif model == 'binomial':\n", - " name_format['binomial_iv'] = 'binomial_{x}'\n", - " name_format[f\"{default_fill}_binomial_iv\"] = f'{default_fill}_binomial_'+'{x}'\n", - " for col in extra_cols:\n", - " name_format[f\"{col}_binomial_iv\"] = f\"{col}_{model}_\" +\"{x}\"\n", - "\n", - "\n", - " return name_format" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'binomial_iv': 'binomial_{x}',\n", - " 'midpoint_binomial_iv': 'midpoint_binomial_{x}',\n", - " 'ask_binomial_iv': 'ask_binomial_{x}',\n", - " 'bid_binomial_iv': 'bid_binomial_{x}'}" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "build_name_format('delta', 'binomial', ['ask', 'bid'], 'midpoint')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## OPTION DATA MANAGER" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "class OptionQueryRequestParameter:\n", - " def __init__(self, table_name, db_name, start_date=None, end_date=None, ticker=None, exp=None, strike=None, right = None):\n", - " self.db_name = db_name\n", - " self.table_name = table_name\n", - " self.start_date = start_date\n", - " self.end_date = end_date\n", - " self.exp = exp\n", - " self.strike = strike\n", - " self.right = right\n", - " self.symbol = ticker\n", - " self.opttick= None\n", - " self.query = None\n", - " self.y = None\n", - " self.vol = None\n", - " self.spot = None\n", - " self.interval = None\n", - " self.type_ = None" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "def enforce_interval(ivl_str: str):\n", - " ## Enforce the interval\n", - " try:\n", - " ## We want to throw an error if the interval is not in the available intervals + if we get query for minute data 'm'\n", - " PRICING_CONFIG['AVAILABLE_INTERVALS'].remove('m') ## Remove minute data from available intervals \n", - " except:\n", - " pass\n", - " \n", - "\n", - " if ivl_str.lower() not in PRICING_CONFIG[\"AVAILABLE_INTERVALS\"] and ivl_str != 'M': ## Want to avoid minute data\n", - " raise ValueError(f\"Expected interval to be one of: {PRICING_CONFIG['AVAILABLE_INTERVALS']}\")\n", - " \n", - " if ivl_str == 'm': ## Minute data not available\n", - " raise AttributeError(\"Minute data currently unavailable, please go higher\")\n", - " \n", - " return\n", - "\n", - "def enforce_inputs(type_:str, model:str) -> None:\n", - " ## Assert inputs\n", - " if type_ not in ['spot', 'vol', 'vega', 'vanna', 'volga', 'delta', 'gamma', 'theta', 'rho', 'greeks', 'greek', 'attribution', 'scenario']:\n", - " raise ValueError(\"Expected type_ to be one of: ['spot', 'vol', 'vega', 'vanna', 'volga', 'delta', 'gamma', 'theta', 'rho', 'greeks', 'greek', 'attribution', 'scenario']\")\n", - " if model not in ['bs', 'binomial', 'mc']: ## Only Black Scholes, binomial tree, monte carlo\n", - " raise ValueError(f\"Expected model to be one of: {PRICING_CONFIG['AVAILABLE_PRICING_MODELS']}\")\n", - " return\n", - "\n", - "def determine_table_agg(ivl_str: str, type_: str, greek_names: list) -> tuple:\n", - " ## Determine aggregation\n", - " if ivl_str in ['h', 'm']:\n", - " agg = 'intra'\n", - " else:\n", - " agg = 'eod'\n", - " \n", - " ## Table to query, picking based on interval & type\n", - " if type_ in greek_names:\n", - " database, table = TABLES[agg]['greeks'].split('.')\n", - " else:\n", - " database, table = TABLES[agg][type_].split('.')\n", - " \n", - " return agg, database, table\n", - "\n", - "\n", - "def determine_requested_columns(default_fill:str, type_:str, model:str, greek_names:list) -> list:\n", - " if type_ == 'spot':\n", - " requested_col = ['datetime', 'open', 'high', 'low', 'close', default_fill.lower(),'volume', 'openinterest']\n", - "\n", - " elif type_ == 'vol':\n", - " requested_col = ['datetime', f\"{model}_iv\".lower(), f\"{default_fill.lower()}_{model}_iv\".lower()]\n", - "\n", - " elif type_ in greek_names:\n", - " ## If Statement logic to format a the list of greek names to be used\n", - " if type_ not in ['greek', 'greeks']:\n", - " if model == 'bs':\n", - " requested_col = ['datetime'] + [f\"{default_fill}_{type_}\".lower()] + [f\"{type_}\".lower()]\n", - " else:\n", - " requested_col = ['datetime'] + [f\"{model}_{type_}\".lower()] + [f\"{default_fill.lower()}_{model}_{type_}\".lower()]\n", - " else:\n", - " if model == 'bs':\n", - " requested_col = ['datetime'] + [f\"{x}\".lower() for x in greek_names if x not in ['greek', 'greeks']] + [f\"{default_fill.lower()}_{x}\".lower() for x in greek_names if x not in ['greek', 'greeks']]\n", - " else:\n", - " requested_col = ['datetime'] + [f\"{model}_{x}\".lower() for x in greek_names if x not in ['greek', 'greeks']] + [f\"{default_fill.lower()}_{model}_{x}\".lower() for x in greek_names if x not in ['greek', 'greeks']]\n", - "\n", - " elif type_ == 'attribution':\n", - " raise NotImplementedError(\"Attribution data not implemented yet\")\n", - " \n", - " elif type_ == 'scenario':\n", - " raise NotImplementedError(\"Scenario data not implemented yet\")\n", - " \n", - " elif type_ == 'chain':\n", - " raise IncorrectExecutionError(\"Chain Data does not return a timeseries, returns at_time\")\n", - " else:\n", - " raise KeyError(f\"Type {type_} not in requested columns\")\n", - " return requested_col\n", - "\n", - " \n", - "def format_raw_spot_data( **kwargs):\n", - " \"\"\"\n", - " Adds necessary formatting. To avoid overpopulating the __handle_incomplete_data method\n", - " \"\"\"\n", - " data_request = kwargs.get('data_request')\n", - " raw_spot_data = data_request.raw_spot_data\n", - " if raw_spot_data.empty:\n", - " print(\"Format raw found this empty\")\n", - " data_request.raw_spot_data = pd.DataFrame()\n", - "\n", - " else:\n", - " raw_spot_data.reset_index(inplace = True)\n", - " raw_spot_data.columns = [x.lower() for x in raw_spot_data.columns]\n", - " raw_spot_data = raw_spot_data[raw_spot_data.datetime.isin(data_request.missing_dates)]\n", - " if 'index' in raw_spot_data.columns:\n", - " raw_spot_data.drop(columns=['index'], inplace=True)\n", - " data_request.raw_spot_data = raw_spot_data\n", - "\n", - "\n", - "def post_process( **kwargs):\n", - " \"\"\"\n", - " Post process the data after all the calculations\n", - " \"\"\"\n", - "\n", - " data_request = kwargs.get('data_request')\n", - " bulk = kwargs.get('bulk', False)\n", - " is_complete = data_request.pre_process['is_complete']\n", - " is_empty = data_request.pre_process['is_empty']\n", - " raw_spot_data = data_request.raw_spot_data.copy()\n", - "\n", - " if not is_empty and is_complete:\n", - " ## If not empty and data complete, no need formatting. Just return from db\n", - " final_data = data_request.pre_processed_data.copy()\n", - " data_request.post_processed_data = final_data\n", - " return\n", - " \n", - " ## Start by renaming the columns to match the database.\n", - " rename_columns = {'open_interest': 'openinterest'}\n", - " try:\n", - " raw_spot_data.rename(columns=rename_columns, inplace=True)\n", - " except KeyError as e:\n", - " pass\n", - " \n", - " ## Filter the columns to only the requested columns\n", - " raw_spot_data = raw_spot_data[data_request.requested_col]\n", - "\n", - " ## Capitalize the columns & set the index to datetime\n", - " raw_spot_data.columns = [x.capitalize() for x in raw_spot_data.columns]\n", - " if bulk:\n", - " raw_spot_data.set_index(['Optiontick','Datetime'], inplace=True)\n", - " else:\n", - " raw_spot_data.set_index('Datetime', inplace=True)\n", - " raw_spot_data = raw_spot_data[~raw_spot_data.index.duplicated(keep='first')]\n", - " \n", - " if is_empty:\n", - " ## If the data is empty, the final data is the raw data\n", - " final_data = raw_spot_data\n", - " elif not is_complete:\n", - " ## Else we will have to merge the data\n", - " final_data = pd.concat([data_request.pre_processed_data, raw_spot_data], axis=0)\n", - " \n", - " \n", - " final_data = final_data[~final_data.index.duplicated(keep='first')]\n", - " final_data.columns = [x.capitalize() for x in final_data.columns]\n", - " final_data.sort_index(inplace=True)\n", - "\n", - " if bulk:\n", - " ## For final data, we will filter for the Option Tick we need\n", - " final_data = final_data[final_data.index.get_level_values('Optiontick').isin(data_request.opttick)]\n", - "\n", - " data_request.post_processed_data = final_data\n", - " return data_request.post_processed_data\n", - "\n", - "\n", - "def format_final_data(**kwargs):\n", - " \"\"\"\n", - " Format the final data to match the database\n", - " \"\"\"\n", - " data_request = kwargs.get('data_request')\n", - " bulk = kwargs.get('bulk', False)\n", - " print(\"Resampling intra data\")\n", - " ## Resample the data to the requested interval\n", - " resampled = resample( data_request.post_processed_data, \n", - " data_request.interval, \n", - " {col: 'ffill' for col in data_request.post_processed_data.columns})\n", - " if bulk:\n", - " resampled.index = resampled.index.swaplevel()\n", - " data_request.post_processed_data = resampled\n", - "\n", - "def init_query(**kwargs):\n", - "\n", - " \"\"\"\n", - " Initialize the query for the data request and save the data to the request\n", - " \"\"\"\n", - " print(\"Using Function to query the database\")\n", - " data_request = kwargs.get('data_request')\n", - " db = kwargs.get('db', DatabaseAdapter())\n", - " try:\n", - " query_category = kwargs['query_category']\n", - " except KeyError:\n", - " raise KeyError(\"Query category not specified, expected one of: ['single', 'bulk', 'chain']\")\n", - " \n", - " if query_category == 'single':\n", - " query = f\"\"\"SELECT *\n", - " FROM {data_request.db_name}.{data_request.table_name}\n", - " WHERE OPTIONTICK = '{data_request.opttick}' AND\n", - " DATETIME >= '{data_request.start_date}' AND \n", - " DATETIME <= '{data_request.end_date}'\n", - " \"\"\"\n", - " database_data = db.query_database(data_request.db_name, data_request.table_name, query)\n", - " database_data.columns = [x.lower() for x in database_data.columns]\n", - " data_request.query = query\n", - " data_request.database_data = database_data\n", - " return database_data\n", - " \n", - " ############# Bulk Query\n", - " elif query_category == 'bulk':\n", - " strikes = data_request.strikes\n", - " opttick_list = [f\"{generate_option_tick_new(data_request.symbol, right, data_request.exp, strike)}\" for strike, right in strikes]\n", - " data_request.opttick = opttick_list ## save the opttick list for future reference\n", - " str_list = [f\"'{x}'\" for x in opttick_list]\n", - " filter_str = f\"({', '.join(str_list)})\"\n", - " query = f\"\"\"SELECT *\n", - " FROM {data_request.db_name}.{data_request.table_name}\n", - " WHERE OPTIONTICK in {filter_str} AND\n", - " DATETIME >= '{data_request.start_date}' AND \n", - " DATETIME <= '{data_request.end_date}'\n", - " \"\"\"\n", - " database_data = db.query_database(data_request.db_name, data_request.table_name, query)\n", - " database_data.columns = [x.lower() for x in database_data.columns]\n", - " data_request.query = query\n", - " data_request.database_data = database_data\n", - " return database_data\n", - " \n", - " ############# Chain Query\n", - " elif query_category == 'chain':\n", - " query = f\"\"\"SELECT *\n", - " FROM {data_request.db_name}.{data_request.table_name}\n", - " WHERE TICKER = '{data_request.symbol}' AND\n", - " BUILD_DATE = '{data_request.date} 16:00:00'\n", - " \"\"\"\n", - " \n", - " database_data = db.query_database(data_request.db_name, data_request.table_name, query)\n", - " database_data.columns = [x.lower() for x in database_data.columns]\n", - " data_request.query = query\n", - " data_request.database_data = database_data\n", - " return database_data\n", - " \n", - "\n", - "def add_inputs_to_raw(self, **kwargs):\n", - " \"\"\"\n", - " Adds Inputs to raw_spot_data for Vol & other necessary uses\n", - " \"\"\"\n", - " data_request = kwargs.get('data_request')\n", - " bulk = kwargs.get('bulk', False)\n", - " if not bulk:\n", - " if not data_request.raw_spot_data.empty:\n", - " data_request.raw_spot_data['s0'] = data_request.input_params['s0_chain']['close']\n", - " data_request.raw_spot_data['y'] = data_request.input_params['y']\n", - " data_request.raw_spot_data['r'] = data_request.input_params['r']\n", - " data_request.raw_spot_data['K'] = self.strike\n", - " data_request.raw_spot_data['exp_date'] = self.exp\n", - " data_request.raw_spot_data['right'] = self.right\n", - " else:\n", - " if not data_request.raw_spot_data.empty:\n", - " data_request.raw_spot_data['s0'] = data_request.input_params['s0_chain']['close']\n", - " data_request.raw_spot_data['y'] = data_request.input_params['y']\n", - " data_request.raw_spot_data['r'] = data_request.input_params['r']\n" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "class OptionDataManager(_ManagerLazyLoader):\n", - " @log_time(time_logger)\n", - " def __init__(self,\n", - " symbol: str = None,\n", - " exp: str | datetime = None,\n", - " right: str = None,\n", - " strike: float = None,\n", - " default_fill: str = 'midpoint',\n", - " opttick: str = None,\n", - " **kwargs) -> None:\n", - " \"\"\"\n", - " Returns an object for querying data\n", - "\n", - " Params:\n", - " symbol: Underlier symbol\n", - " exp: expiration\n", - " right: Put(P) or Call (C)\n", - " strike: Option Strike\n", - " default_fill: How to fill zero values for close. 'midpoint' or 'weighted_midpoint'\n", - " opttick: Option ticker, if provided, will ignore symbol, exp, right, strike and be initialized with the string\n", - " \"\"\"\n", - "\n", - " super().__init__(symbol)\n", - " if opttick is not None:\n", - " assert isinstance(opttick, str), f\"opttick has to be type str, recieved {type(opttick)}\"\n", - " option_meta = parse_option_tick(opttick)\n", - " self.symbol = option_meta['ticker']\n", - " self.exp = option_meta['exp_date']\n", - " self.right = option_meta['put_call']\n", - " self.strike = option_meta['strike']\n", - " self.opttick = opttick\n", - "\n", - " else:\n", - " assert isinstance(strike, float), f\"Strike has to be type float, recieved {type(strike)}\"\n", - " if default_fill not in ['midpoint', 'weighted_midpoint', None]:\n", - " raise ValueError(\"Expected default_fill to be one of: 'midpoint', 'weighted_midpoint', None \")\n", - " \n", - " assert all([symbol, exp, right, strike]), \"symbol, exp, right, strike are required\"\n", - " self.exp = exp\n", - " self.symbol = symbol\n", - " self.right = right.upper()\n", - " self.strike = strike\n", - " self.opttick = generate_option_tick_new(symbol, right, exp, strike)\n", - "\n", - " self.default_fill = default_fill\n", - " self.db = DatabaseAdapter()\n", - " self.data_request = {}\n", - " self.save_thread = {}\n", - " self.current_request =None\n", - " self.spot_manager = SpotDataManager(self.symbol)\n", - " self.vol_manager = VolDataManager(self.symbol)\n", - " self.greek_manager = GreeksDataManager(self.symbol)\n", - " self.chain_manager = ChainDataManager(self.symbol)\n", - " self.greek_names = PRICING_CONFIG[\"AVAILABLE_GREEKS\"] + ['greek', 'greeks']\n", - " self.print_info = kwargs.get('print_info', False)\n", - "\n", - " ## Prefer to use dicts to avoid having too many attributes\n", - "\n", - " def get_timeseries(self, \n", - " start: str | datetime, \n", - " end: str | datetime,\n", - " interval: str = '1d',\n", - " type_: str = 'spot',\n", - " model: str = 'bs',\n", - " extra_cols: list = []) -> pd.DataFrame:\n", - " \"\"\"\n", - " Query the timeseries data from ThetaData API or SQL Database.\n", - "\n", - " Params:\n", - " start: Start date for the query\n", - " end: End date for the query\n", - " interval: Interval for the query. Options are: h, d, w, M, q, y\n", - " type_: Type of data to query. Options are: spot, vol, greeks, greek, attribution, scenario\n", - " model: Model to use for the query. Options are: bs, binomial\n", - " extra_cols: Extra columns to include in the query. Options are: ask, bid, open\n", - " \"\"\"\n", - " \n", - " \n", - " ## Organize inputs\n", - " start = pd.to_datetime(start)\n", - " end = pd.to_datetime(end)\n", - " ivl_str, ivl_int = extract_numeric_value(interval)\n", - " greek_names = self.greek_names\n", - " self.current_request = datetime.now().strftime(\"%Y%m%d %H:%M:%S\")\n", - " _extra_cols = handle_extra_cols(extra_cols, type_, model)\n", - " greek_cols = build_name_format('greek', model, extra_cols, self.default_fill) \n", - " vol_cols = build_name_format('vol', model, extra_cols, self.default_fill)\n", - "\n", - " ## Enforce the interval\n", - " enforce_interval(ivl_str)\n", - "\n", - " ## Assert inputs\n", - " enforce_inputs(type_, model)\n", - "\n", - " ## Determine aggregation\n", - " agg, database, table = determine_table_agg(ivl_str, type_, greek_names)\n", - " input_params = getattr(self, agg)\n", - "\n", - " ## Determine the requested columns\n", - " requested_col = determine_requested_columns(self.default_fill, type_, model, greek_names)\n", - " \n", - " data_request = OptionQueryRequestParameter(table_name=table, \n", - " db_name=database, \n", - " start_date=start, \n", - " end_date=end, \n", - " ticker=self.symbol, \n", - " exp=self.exp, \n", - " strike=self.strike,\n", - " right=self.right)\n", - " \n", - " ## Set the parameters for the request to avoid having too many attributes\n", - " data_request.opttick = self.opttick\n", - " data_request.symbol = self.symbol\n", - " data_request.interval= interval\n", - " data_request.type_ = type_\n", - " data_request.input_params = input_params\n", - " data_request.model = model\n", - " data_request.ivl_str = ivl_str\n", - " data_request.ivl_int = ivl_int\n", - " data_request.default_fill = self.default_fill\n", - " data_request.agg = agg\n", - " data_request.requested_col = requested_col + _extra_cols\n", - " data_request.iv_cols = vol_cols\n", - " data_request.greek_cols = greek_cols\n", - " data_request.col_kwargs = col_kwargs = {'underlier_price': 's0', \n", - " 'expiration': 'exp_date', \n", - " 'strike': 'k', \n", - " 'right': 'right', \n", - " 'rf_rate': 'r', \n", - " 'dividend': 'y',\n", - " 'put/call': 'right',\n", - " 'datetime': 'datetime',}\n", - " self.data_request[self.current_request] = data_request ## save the request for future reference\n", - " \n", - " ## Start by getting query\n", - " init_query(data_request=data_request, db=self.db, query_category='single')\n", - "\n", - " ## Next, pre process data available in database\n", - " self.__pre_process_data(data_request=data_request)\n", - "\n", - " ## Before handling missing/incomplete data, we begin save to database\n", - " is_complete = data_request.pre_process['is_complete']\n", - " is_empty = data_request.pre_process['is_empty']\n", - " if is_empty or not is_complete:\n", - " save_thread = Thread(target=save_to_database, args=(data_request, self.print_info), name = \"save_to_database\", daemon=True)\n", - " save_thread.start()\n", - " self.save_thread[self.current_request] = save_thread\n", - " CENTRAL_SAVE_THREAD[self.current_request] = save_thread\n", - "\n", - " \n", - " ## Handle missing or incomplete data if any\n", - " self.__handle_incomplete_data(data_request=data_request)\n", - " ## Post process the data\n", - " post_process(data_request=data_request)\n", - " format_final_data(data_request=data_request)\n", - " \n", - "\n", - " \n", - " return data_request\n", - " \n", - " def get_at_time(self, \n", - " date: str | datetime, \n", - " type_: str = 'spot',\n", - " model: str = 'bs',\n", - " **kwargs) -> pd.DataFrame:\n", - " \"\"\"\n", - " Get data at a specific time\n", - " params:\n", - "\n", - " \"\"\"\n", - " \n", - " if type_ == 'chain':\n", - " return_price = kwargs.get('return_price', False)\n", - " if return_price:\n", - " self.current_request = datetime.now().strftime(\"%Y%m%d %H:%M:%S\")\n", - " request = self.chain_manager.get_at_time(date)\n", - " data = request.post_processed_data.copy()\n", - " self.data_request[self.current_request] = request\n", - " data.columns = data.columns.str.capitalize() \n", - " data.rename(columns = {'Dte': 'DTE', 'Price': 'Midpoint'}, inplace=True)\n", - " chain = data.pivot_table(\n", - " index = ['Expiration', 'DTE', 'Strike'],\n", - " columns = ['Right'],\n", - " values = ['Midpoint']\n", - " )\n", - " else: \n", - " chain = self.Stock.option_chain(date = date)\n", - " return chain\n", - " \n", - " elif type_ in ['spot', 'vol'] + self.greek_names:\n", - " extra_cols = kwargs.get('extra_cols', [])\n", - " return self.get_timeseries(date, date, \n", - " interval = '1d',\n", - " type_ = type_,\n", - " model = model,\n", - " extra_cols=extra_cols).post_processed_data\n", - "\n", - "\n", - " def __pre_process_data(self, **kwargs):\n", - " \n", - " data_request = kwargs.get('data_request')\n", - " data = data_request.database_data\n", - " data_request.pre_process = {}\n", - "\n", - " ## Check if data is empty\n", - " if data.empty:\n", - " ## If data is empty, we will not be able to process it\n", - " data_request.pre_process['is_empty'] = True\n", - " else:\n", - " data_request.pre_process['is_empty'] = False\n", - "\n", - " ## Check timeseries is complete\n", - " ## Considering we're taking a resample approach, where base intraday data is 5 minutes, and EOD is 1 day\n", - " ## We will only check 5 minutes and 1 day is complete\n", - "\n", - " start, end = data_request.start_date, data_request.end_date\n", - " date_range = bus_range(start, end, '5Min') if data_request.agg == 'intra' else bus_range(start, end, '1B')\n", - "\n", - " ## Now we will check if the data is complete\n", - " is_complete = all([(x in pd.DatetimeIndex(data.datetime)) for x in date_range])\n", - " missing_dates = [x for x in date_range if x not in pd.DatetimeIndex(data.datetime)]\n", - " data_request.pre_process['is_complete'] = is_complete\n", - " data_request.missing_dates = missing_dates\n", - "\n", - " ## Save preprocessed data\n", - " data = data[data_request.requested_col] ## Select only the requested columns\n", - " data.columns = [x.capitalize() for x in data.columns] ## Capitalize the columns\n", - " data.set_index('Datetime', inplace = True) ## Set the index to datetime\n", - " data = data[~data.index.duplicated(keep='first')] ## Remove duplicates\n", - " data_request.pre_processed_data = data\n", - "\n", - " def __handle_incomplete_data(self, **kwargs):\n", - " data_request = kwargs['data_request']\n", - " is_complete = data_request.pre_process['is_complete']\n", - " is_empty = data_request.pre_process['is_empty']\n", - " start, end, type_ = data_request.start_date, data_request.end_date, data_request.type_\n", - " print(f\"Is complete: {is_complete}, Is empty: {is_empty}\")\n", - "\n", - " if is_empty:\n", - " print(\"Data is empty, Querying all spot data\")\n", - " raw_spot_data = self.spot_manager.query_thetadata(start=start, end=end, \n", - " strike=self.strike, exp=self.exp, \n", - " right=self.right, bulk=False, \n", - " data_request=data_request)\n", - " data_request.raw_spot_data = raw_spot_data\n", - " if type_ != 'spot':\n", - " ## Add inputs to raw data, this is necessary for vol calculation\n", - " add_inputs_to_raw(self, data_request=data_request) ## Not formatting yet, this is to utilize joins on datetime\n", - " vol_data = self.vol_manager.calculate_iv(data_request=data_request)\n", - " # data_request.raw_spot_data = pd.concat([data_request.raw_spot_data, vol_data], axis=1)\n", - " if type_ in self.greek_names:\n", - " greek_data = self.greek_manager.calculate_greeks(type_, data_request = data_request)\n", - " format_raw_spot_data(data_request=data_request)\n", - " \n", - "\n", - "\n", - " elif not is_complete:\n", - " print(\"Data is not complete, Querying missing data\")\n", - " start_missing, end_missing = min(data_request.missing_dates), max(data_request.missing_dates)\n", - " raw_spot_data = self.spot_manager.query_thetadata(start=start_missing, end=end_missing, \n", - " strike=self.strike, exp=self.exp, \n", - " right=self.right, bulk=False, \n", - " data_request=data_request)\n", - "\n", - " data_request.raw_spot_data = raw_spot_data\n", - " if type_ != 'spot':\n", - " add_inputs_to_raw(self, data_request=data_request)\n", - " vol_data = self.vol_manager.calculate_iv(data_request=data_request)\n", - " data_request.raw_spot_data = pd.concat([data_request.raw_spot_data, vol_data], axis=1)\n", - " if type_ in self.greek_names:\n", - " print(f\"Processing Greeks {type_}\")\n", - " greek_data = self.greek_manager.calculate_greeks(type_, data_request = data_request)\n", - " data_request.raw_spot_data = pd.concat([data_request.raw_spot_data, greek_data], axis=1)\n", - " format_raw_spot_data(data_request=data_request)\n", - " \n", - " else:\n", - " data_request.raw_spot_data = pd.DataFrame()\n", - " \n" - ] - }, - { - "cell_type": "code", - "execution_count": 81, - "metadata": {}, - "outputs": [], - "source": [ - "def save_to_database(data_request: OptionQueryRequestParameter, print_info: bool = False):\n", - " \"\"\"\n", - " Saves the data to the database\n", - " \"\"\"\n", - "\n", - " ## This function is using parallel apply to reduce overhead on the current process.\n", - " print(f\"Saving data to {data_request.db_name}.{data_request.table_name}\") if print_info else None\n", - " \n", - " ## Determine if the data is bulk or not\n", - " if isinstance(data_request, OptionQueryRequestParameter):\n", - " bulk = False\n", - " elif isinstance(data_request, BulkOptionQueryRequestParameter):\n", - " data_request.strike = None\n", - " data_request.right = None\n", - " bulk = True\n", - " else:\n", - " raise ValueError(\"Expected data_request to be of type OptionQueryRequestParameter or BulkOptionQueryRequestParameter\")\n", - " \n", - " db = DatabaseAdapter()\n", - " if len(data_request.missing_dates) == 0:\n", - " print(\"No missing data, skipping save to database\") if print_info else None\n", - " logger.warning(\"No missing data, skipping save to database\")\n", - " return\n", - " start, end = pd.to_datetime(min(data_request.missing_dates)) - relativedelta(months=3), pd.to_datetime(max(data_request.missing_dates)) + relativedelta(months=3)\n", - " print(f\"Querying data from {start} to {end}\") if print_info else None\n", - " \n", - " ## Start by populating initial data from spot_manager\n", - " spot_manager = SpotDataManager(data_request.symbol)\n", - " spot_sm = spot_manager.query_thetadata(start, end, \n", - " strike=data_request.strike, exp=data_request.exp, \n", - " right=data_request.right, bulk=bulk, \n", - " data_request=data_request)\n", - " \n", - " print(\"Starting to save data to database\") if print_info else None\n", - " if not bulk:\n", - " spot_sm['Strike'] = data_request.strike\n", - " spot_sm['Expiration'] = data_request.exp\n", - " spot_sm['Put/Call'] = data_request.right\n", - " spot_sm['OptionTick'] = data_request.opttick\n", - " spot_sm['Underlier'] = data_request.symbol\n", - " \n", - " else:\n", - " spot_sm.rename(columns = {'k':'strike','exp_date':'expiration', 'Right':'put/call', 'ticker':'Underlier'}, inplace = True)\n", - "\n", - " spot_sm['Underlier_price'] = data_request.input_params['s0_close']['close']\n", - " spot_sm['RF_rate'] = data_request.input_params['r']\n", - " spot_sm['dividend'] = data_request.input_params['y']\n", - " spot_sm['RF_rate_name'] = data_request.input_params['r_name']\n", - " spot_sm['Datetime'] = spot_sm.index\n", - " spot_sm.columns = [x.lower() for x in spot_sm.columns]\n", - " spot_sm.rename(columns = {'open_interest':'openinterest'}, inplace = True)\n", - "\n", - " ## Fix for missing data on intraday spot. \n", - " if data_request.agg == 'intra':\n", - " spot_sm = spot_sm[~spot_sm.underlier_price.isna()]\n", - " if spot_sm.empty:\n", - " logger.warning(\"Spot data is empty, skipping save to database\")\n", - " print(\"Spot data is empty, skipping save to database\")\n", - " return\n", - "\n", - " ## Add the vol columns\n", - " print(\"Calculating Vols\") if print_info else None\n", - " calc_vol_for_data_parallel(spot_sm, 'close', 'BS_IV', 'bs')\n", - " calc_vol_for_data_parallel(spot_sm, 'midpoint', 'Midpoint_BS_IV', 'bs')\n", - " calc_vol_for_data_parallel(spot_sm, 'weighted_midpoint', 'Weighted_Midpoint_BS_IV', 'bs')\n", - " calc_vol_for_data_parallel(spot_sm, 'closebid', 'bid_bs_iv', 'bs')\n", - " calc_vol_for_data_parallel(spot_sm, 'closeask', 'ask_bs_iv', 'bs')\n", - " \n", - "\n", - " calc_vol_for_data_parallel(spot_sm, 'close', 'Binomial_IV','binomial')\n", - " calc_vol_for_data_parallel(spot_sm, 'midpoint', 'Midpoint_binomial_IV', 'binomial')\n", - " calc_vol_for_data_parallel(spot_sm, 'weighted_midpoint', 'Weighted_Midpoint_binomial_IV', 'binomial')\n", - " calc_vol_for_data_parallel(spot_sm, 'closebid', 'bid_binomial_iv', 'binomial')\n", - " calc_vol_for_data_parallel(spot_sm, 'closeask', 'ask_binomial_iv', 'binomial')\n", - " spot_sm.columns = spot_sm.columns.str.lower()\n", - " \n", - " \n", - "\n", - " ## Vol Resolve before Calculating Greeks, this vol is necessary for Greeks\n", - " \n", - " if data_request.agg != 'intra':\n", - " ## Will not be resolving vols for intra data\n", - " print(\"Resolving Vols\") if print_info else None\n", - " resolve_missing_vols_in_data(spot_sm, \n", - " [ 'midpoint_bs_iv', 'midpoint_binomial_iv'], \n", - " ['bs', 'binomial'],\n", - " ['midpoint', 'midpoint'],\n", - " agg = data_request.agg,)\n", - " \n", - "\n", - " ## Add the greek columns\n", - " print(\"Calculating Greeks\") if print_info else None\n", - " calc_greeks_for_data_parallel(spot_sm, 'bs', 'bs_iv', '{x}')\n", - " calc_greeks_for_data_parallel(spot_sm, 'bs', 'midpoint_bs_iv', 'midpoint_{x}')\n", - " calc_greeks_for_data_parallel(spot_sm, 'bs', 'weighted_midpoint_bs_iv', 'weighted_midpoint_{x}')\n", - "\n", - " calc_greeks_for_data_parallel(spot_sm, 'binomial', 'bid_binomial_iv', 'bid_binomial_{x}')\n", - " calc_greeks_for_data_parallel(spot_sm, 'binomial', 'ask_binomial_iv', 'ask_binomial_{x}')\n", - " calc_greeks_for_data_parallel(spot_sm, 'binomial', 'binomial_iv', 'binomial_{x}')\n", - " calc_greeks_for_data_parallel(spot_sm, 'binomial', 'midpoint_binomial_iv', 'midpoint_binomial_{x}')\n", - " spot_sm.columns = spot_sm.columns.str.lower()\n", - " \n", - " ## Add the dollar delta columns\n", - " calc_dollar_delta_from_data(spot_sm, 'delta', 'dollar_delta')\n", - " calc_dollar_delta_from_data(spot_sm, 'midpoint_delta', 'midpoint_dollar_delta')\n", - " calc_dollar_delta_from_data(spot_sm, 'weighted_midpoint_delta', 'weighted_midpoint_dollar_delta')\n", - "\n", - " ## Add the last updated column\n", - " spot_sm['last_updated'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')\n", - "\n", - " ## Add the vol resolve columns\n", - " spot_sm['midpoint_bs_vol_resolve'] = 0\n", - " spot_sm['midpoint_binomial_vol_resolve'] = 0\n", - "\n", - " ## Finally, save the data to the database\n", - " print(\"Saving data to database\") if print_info else None\n", - " data_request.pre_save_to_db_data = spot_sm.copy()\n", - " db.save_to_database(spot_sm, data_request.db_name, data_request.table_name)\n", - " data_request.saved_to_db_data = spot_sm\n", - " \n", - " return spot_sm" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def bulk_one_off_save(\n", - " start: str | datetime,\n", - " end: str | datetime,\n", - " tick: str,\n", - " exp: str,\n", - " print_info: bool = False,\n", - "):\n", - " \"\"\"\n", - " This function is used to save the data to the database without initializing the data manager\n", - " \"\"\"\n", - " global CENTRAL_SAVE_THREAD\n", - " current_request = datetime.now().strftime(\"%Y%m%d %H:%M:%S\")\n", - " missing_dates = [start, end]\n", - " dummy_request = BulkOptionQueryRequestParameter(\n", - " table_name='temp_options_eod_new',\n", - " db_name='securities_master',\n", - " start_date=start,\n", - " end_date=end,\n", - " ticker=tick,\n", - " exp=exp,\n", - " )\n", - " dummy_request.agg = 'eod'\n", - " dummy_request.start_date = start\n", - " dummy_request.end_date = end\n", - " dummy_request.missing_dates = missing_dates\n", - " lazy_loader = _ManagerLazyLoader(tick)\n", - " lazy_loader.exp = dummy_request.exp\n", - " dummy_request.input_params = lazy_loader.eod\n", - " \n", - " save_thread = Thread(target=save_to_database, args=(dummy_request,print_info), name = \"save_to_database_one_off\", daemon=True)\n", - " save_thread.start()\n", - " CENTRAL_SAVE_THREAD[current_request] = save_thread\n" - ] - }, - { - "cell_type": "code", - "execution_count": 56, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
rootexpirationstrikeright
1018AAPL20250425235.0P
1019AAPL20250425235.0C
1020AAPL20250425128.0C
1021AAPL20250425160.0C
1022AAPL20250425160.0P
...............
266AAPL20271217430.0P
267AAPL20271217270.0C
252AAPL20271217120.0C
253AAPL20271217120.0P
336AAPL20271217275.0P
\n", - "

2276 rows × 4 columns

\n", - "
" - ], - "text/plain": [ - " root expiration strike right\n", - "1018 AAPL 20250425 235.0 P\n", - "1019 AAPL 20250425 235.0 C\n", - "1020 AAPL 20250425 128.0 C\n", - "1021 AAPL 20250425 160.0 C\n", - "1022 AAPL 20250425 160.0 P\n", - "... ... ... ... ...\n", - "266 AAPL 20271217 430.0 P\n", - "267 AAPL 20271217 270.0 C\n", - "252 AAPL 20271217 120.0 C\n", - "253 AAPL 20271217 120.0 P\n", - "336 AAPL 20271217 275.0 P\n", - "\n", - "[2276 rows x 4 columns]" - ] - }, - "execution_count": 56, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "list_contracts('AAPL', '2025-04-21').sort_values('expiration')" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "# manager = OptionDataManager('AAPL', '2025-09-19', 'C', 225.0) ## EOD\n", - "manager = OptionDataManager('AAPL', '2025-09-19', 'P', 270.0) ## Intra\n", - "spot_manager = manager.spot_manager" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Using Function to query the database\n", - "Is complete: True, Is empty: False\n", - "Resampling intra data\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
OpenHighLowCloseMidpointVolumeOpeninterestCloseask
Datetime
2024-09-180.00.00.00.00.00.00.00.0
\n", - "
" - ], - "text/plain": [ - " Open High Low Close Midpoint Volume Openinterest Closeask\n", - "Datetime \n", - "2024-09-18 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "request_ = manager.get_at_time('2024-09-18', 'spot', return_price=False, model = 'binomial', extra_cols = ['ask'])\n", - "request_" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Using Function to query the database\n", - "Is complete: False, Is empty: True\n", - "Data is empty, Querying all spot data\n", - "Resampling intra data\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Binomial_ivMidpoint_binomial_ivAsk_binomial_iv
Datetime
2025-03-180.00.00.0
\n", - "
" - ], - "text/plain": [ - " Binomial_iv Midpoint_binomial_iv Ask_binomial_iv\n", - "Datetime \n", - "2025-03-18 0.0 0.0 0.0" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "vol = manager.get_at_time('2025-03-18', 'vol', return_price=False, model = 'binomial', extra_cols = ['ask'])\n", - "vol" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Midpoint
RightCP
ExpirationDTEStrike
2025-04-172100.0102.2250.005
110.092.2250.005
115.087.2000.005
116.086.2250.005
117.085.2250.005
...............
2027-12-17976420.02.770218.000
425.02.580223.000
430.02.595228.000
435.01.500233.000
440.02.335238.000
\n", - "

1213 rows × 2 columns

\n", - "
" - ], - "text/plain": [ - " Midpoint \n", - "Right C P\n", - "Expiration DTE Strike \n", - "2025-04-17 2 100.0 102.225 0.005\n", - " 110.0 92.225 0.005\n", - " 115.0 87.200 0.005\n", - " 116.0 86.225 0.005\n", - " 117.0 85.225 0.005\n", - "... ... ...\n", - "2027-12-17 976 420.0 2.770 218.000\n", - " 425.0 2.580 223.000\n", - " 430.0 2.595 228.000\n", - " 435.0 1.500 233.000\n", - " 440.0 2.335 238.000\n", - "\n", - "[1213 rows x 2 columns]" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "chain = manager.get_at_time('2025-04-15', 'chain', return_price=True)\n", - "chain" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Sequence for Intra Day:\n", - "\n", - "1. Ensure I can get get vol & greeks (Done)\n", - "2. Ensure the save data works as expected (Done)\n", - "3. Verify it works for both intraday & EOD (Done)\n", - "4. Replace vol & greeks with calc vols (Done)\n", - "5. Extend to allow new cols (Done)\n", - "6. Add chain (Done)\n", - "7. Fix Vol Resolve for intra\n", - " - Figure out how exactly to handle this. Because we can't have the thread doing this. It's too much data." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Using Function to query the database\n", - "Is complete: False, Is empty: True\n", - "Data is empty, Querying all spot data\n", - "Resampling intra data\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Binomial_ivMidpoint_binomial_ivAsk_binomial_iv
Datetime
2025-03-200.00.0001000.271663
2025-03-210.00.2305430.269276
2025-03-240.00.2380670.260780
2025-03-250.00.2124440.236063
2025-03-260.00.2187780.242697
2025-03-270.00.0001000.238599
2025-03-280.00.0001000.269985
\n", - "
" - ], - "text/plain": [ - " Binomial_iv Midpoint_binomial_iv Ask_binomial_iv\n", - "Datetime \n", - "2025-03-20 0.0 0.000100 0.271663\n", - "2025-03-21 0.0 0.230543 0.269276\n", - "2025-03-24 0.0 0.238067 0.260780\n", - "2025-03-25 0.0 0.212444 0.236063\n", - "2025-03-26 0.0 0.218778 0.242697\n", - "2025-03-27 0.0 0.000100 0.238599\n", - "2025-03-28 0.0 0.000100 0.269985" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# request = manager.get_timeseries(\n", - "# start='2024-12-17',\n", - "# end='2024-12-18',\n", - "# interval='1h',\n", - "# type_='vol',\n", - "# model='bs',\n", - "# extra_cols=['ask']\n", - "# )\n", - "# request.post_processed_data\n", - "\n", - "\n", - "request = manager.get_timeseries(\n", - " start='2025-03-20',\n", - " end='2025-03-30',\n", - " interval='1d',\n", - " type_='vol',\n", - " model='binomial',\n", - " extra_cols=['ask']\n", - ")\n", - "request.post_processed_data" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "# request.raw_spot_data.set_index('datetime', inplace = True)\n", - "# manager.add_inputs_to_raw(data_request=request)\n", - "# request.col_kwargs\n", - "# request.raw_spot_data\n" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "False\n" - ] - } - ], - "source": [ - "request_current = manager.data_request[manager.current_request]\n", - "save_thread = manager.save_thread.get(manager.current_request)\n", - "request_current\n", - "try:\n", - " print(save_thread.is_alive())\n", - "except AttributeError:\n", - " print(\"No save thread found\")" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "class BulkOptionQueryRequestParameter:\n", - " def __init__(self, table_name, db_name, start_date=None, end_date=None, ticker=None, exp=None, strikes=None):\n", - " self.db_name = db_name\n", - " self.table_name = table_name\n", - " self.start_date = start_date\n", - " self.end_date = end_date\n", - " self.ticker = ticker\n", - " self.exp = exp\n", - " self.strikes = strikes\n", - " self.opttick = None\n", - " self.symbol = ticker\n", - " self.query = None\n", - " self.y = None\n", - " self.vol = None\n", - " self.spot = None\n", - " self.interval = None\n", - " self.type_ = None" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## BULK DATA MANAGER" - ] - }, - { - "cell_type": "code", - "execution_count": 83, - "metadata": {}, - "outputs": [], - "source": [ - "from typing import TYPE_CHECKING, List, Tuple\n", - "class BulkOptionDataManager(_ManagerLazyLoader):\n", - " @log_time(time_logger)\n", - " def __init__(self,\n", - " symbol: str = None,\n", - " exp: str | datetime = None,\n", - " default_fill: str = 'midpoint',\n", - " **kwargs) -> None:\n", - " \"\"\"\n", - " Returns an object for querying data\n", - "\n", - " Params:\n", - " symbol: Underlier symbol\n", - " exp: expiration\n", - " right: Put(P) or Call (C)\n", - " strike: Option Strike\n", - " default_fill: How to fill zero values for close. 'midpoint' or 'weighted_midpoint'\n", - " opttick: Option ticker, if provided, will ignore symbol, exp, right, strike and be initialized with the string\n", - " \"\"\"\n", - "\n", - " super().__init__(symbol)\n", - " if default_fill not in ['midpoint', 'weighted_midpoint', None]:\n", - " raise ValueError(\"Expected default_fill to be one of: 'midpoint', 'weighted_midpoint', None \")\n", - " \n", - " assert all([symbol, exp,]), \"symbol, exp, are required\"\n", - " self.exp = exp\n", - " self.symbol = symbol\n", - "\n", - " self.default_fill = default_fill\n", - " self.db = DatabaseAdapter()\n", - " self.data_request = {}\n", - " self.save_thread = {}\n", - " self.current_request =None\n", - " self.spot_manager = SpotDataManager(self.symbol)\n", - " self.vol_manager = VolDataManager(self.symbol)\n", - " self.greek_manager = GreeksDataManager(self.symbol)\n", - " self.chain_manager = ChainDataManager(self.symbol)\n", - " self.greek_names = PRICING_CONFIG[\"AVAILABLE_GREEKS\"] + ['greek', 'greeks']\n", - " self.print_info = kwargs.get('print_info', False)\n", - "\n", - " ## Prefer to use dicts to avoid having too many attributes\n", - " self._eod = {}\n", - "\n", - " def get_timeseries(self, \n", - " start: str | datetime, \n", - " end: str | datetime,\n", - " interval: str = '1d',\n", - " type_: str = 'spot',\n", - " strikes_right: List[Tuple] = [],\n", - " model: str = 'bs',\n", - " extra_cols: list = []) -> pd.DataFrame:\n", - " \"\"\"\n", - " Query the timeseries data from ThetaData API or SQL Database.\n", - " Params:\n", - " start: Start date for the query\n", - " end: End date for the query\n", - " interval: Interval for the query. Options are: h, d, w, M, q, y\n", - " type_: Type of data to query. Options are: spot, vol, greeks, greek, attribution, scenario\n", - " model: Model to use for the query. Options are: bs, binomial\n", - " extra_cols: Extra columns to include in the query. Options are: ask, bid, open\n", - " strikes_right: List of tuples containing the strike and right for the options. Eg: [(250, 'C'), (225, 'P')]\n", - " \"\"\"\n", - " \n", - " if not strikes_right:\n", - " raise ValueError(\"Strikes cannot be empty\")\n", - " \n", - " assert isinstance(strikes_right, list), f\"Strikes has to be type list, recieved {type(strikes_right)}\"\n", - " assert all([isinstance(x, tuple) for x in strikes_right]), f\"Strikes has to be type list of tuples, recieved {type(strikes_right)}\"\n", - " \n", - " ## Organize inputs\n", - " start = pd.to_datetime(start)\n", - " end = pd.to_datetime(end)\n", - " ivl_str, ivl_int = extract_numeric_value(interval)\n", - " greek_names = self.greek_names\n", - " self.current_request = datetime.now().strftime(\"%Y%m%d %H:%M:%S\")\n", - " _extra_cols = handle_extra_cols(extra_cols, type_, model)\n", - " greek_cols = build_name_format('greek', model, extra_cols, self.default_fill)\n", - " vol_cols = build_name_format('vol', model, extra_cols, self.default_fill)\n", - "\n", - "\n", - " ## Enforce the interval\n", - " enforce_interval(ivl_str)\n", - "\n", - " ## Assert inputs\n", - " enforce_inputs(type_, model)\n", - "\n", - " ## Determine aggregation\n", - " agg, database, table = determine_table_agg(ivl_str, type_, greek_names)\n", - " input_params = getattr(self, agg)\n", - "\n", - " ## Determine the requested columns\n", - " requested_col = determine_requested_columns(self.default_fill, type_, model, greek_names)\n", - "\n", - " data_request = BulkOptionQueryRequestParameter(table_name=table,\n", - " db_name=database, \n", - " start_date=start, \n", - " end_date=end, \n", - " ticker=self.symbol, \n", - " exp=self.exp, \n", - " strikes=strikes_right)\n", - " \n", - " ## Set the parameters for the request to avoid having too many attributes\n", - " data_request.symbol = self.symbol\n", - " data_request.interval= interval\n", - " data_request.type_ = type_\n", - " data_request.input_params = input_params\n", - " data_request.model = model\n", - " data_request.ivl_str = ivl_str\n", - " data_request.ivl_int = ivl_int\n", - " data_request.default_fill = self.default_fill\n", - " data_request.agg = agg\n", - " data_request.requested_col = requested_col + _extra_cols + ['optiontick']\n", - " data_request.iv_cols = vol_cols\n", - " data_request.greek_cols = greek_cols\n", - " data_request.col_kwargs = col_kwargs = {'underlier_price': 's0', \n", - " 'expiration': 'exp_date', \n", - " 'strike': 'k', \n", - " 'right': 'right', \n", - " 'rf_rate': 'r', \n", - " 'dividend': 'y',\n", - " 'put/call': 'right',\n", - " 'datetime': 'datetime',}\n", - " self.data_request[self.current_request] = data_request ## save the request for future reference\n", - "\n", - " ## Start by getting query\n", - " init_query(data_request=data_request, db=self.db, query_category='bulk')\n", - " ## Next, pre process data available in database\n", - " self.__pre_process_data(data_request=data_request)\n", - "\n", - " # ## Before handling missing/incomplete data, we begin save to database\n", - " # is_complete = data_request.pre_process['is_complete']\n", - " # is_empty = data_request.pre_process['is_empty']\n", - " # if is_empty or not is_complete:\n", - " # save_thread = Thread(target=save_to_database, args=(data_request, self.print_info), name = \"save_to_database\", daemon=True)\n", - " # save_thread.start()\n", - " # self.save_thread[self.current_request] = save_thread\n", - "\n", - " ## Handle missing or incomplete data if any\n", - " self.__handle_incomplete_data(data_request=data_request)\n", - "\n", - " ## Post process the data\n", - " post_process(data_request=data_request, bulk = True)\n", - " \n", - " ## Format the data\n", - " format_final_data(data_request=data_request, bulk = True)\n", - " return data_request \n", - " \n", - " ## Make a function\n", - " def __handle_incomplete_data(self, **kwargs):\n", - " data_request = kwargs['data_request']\n", - " is_complete = data_request.pre_process['is_complete']\n", - " is_empty = data_request.pre_process['is_empty']\n", - " start, end, type_ = data_request.start_date, data_request.end_date, data_request.type_\n", - " print(f\"Is complete: {is_complete}, Is empty: {is_empty}\")\n", - "\n", - " if is_empty:\n", - " print(\"Data is empty, Querying all spot data\")\n", - " raw_spot_data = self.spot_manager.query_thetadata(start=start, end=end, \n", - " strike=None, exp=self.exp, \n", - " right=None, bulk=True, \n", - " data_request=data_request)\n", - " data_request.raw_spot_data = raw_spot_data\n", - " if type_ != 'spot':\n", - " ## Add inputs to raw data, this is necessary for vol calculation\n", - " add_inputs_to_raw(self, data_request=data_request, bulk = True) ## Not formatting yet, this is to utilize joins on datetime\n", - " vol_data = self.vol_manager.calculate_iv(data_request=data_request)\n", - " # data_request.raw_spot_data = pd.concat([data_request.raw_spot_data, vol_data], axis=1)\n", - " if type_ in self.greek_names:\n", - " greek_data = self.greek_manager.calculate_greeks(type_, data_request = data_request)\n", - " format_raw_spot_data(data_request=data_request)\n", - " \n", - "\n", - "\n", - " elif not is_complete:\n", - " print(\"Data is not complete, Querying missing data\")\n", - " start_missing, end_missing = min(data_request.missing_dates), max(data_request.missing_dates)\n", - " raw_spot_data = self.spot_manager.query_thetadata(start=start_missing, end=end_missing, \n", - " strike=None, exp=self.exp, \n", - " right=None, bulk=True, \n", - " data_request=data_request)\n", - "\n", - " # raw_spot_data['Datetime'] = pd.to_datetime(raw_spot_data['Datetime'])\n", - " data_request.raw_spot_data = raw_spot_data\n", - " if type_ != 'spot':\n", - " add_inputs_to_raw(self, data_request=data_request, bulk = True)\n", - " vol_data = self.vol_manager.calculate_iv(data_request=data_request)\n", - " data_request.raw_spot_data = pd.concat([data_request.raw_spot_data, vol_data], axis=1)\n", - " if type_ in self.greek_names:\n", - " print(f\"Processing Greeks {type_}\")\n", - " greek_data = self.greek_manager.calculate_greeks(type_, data_request = data_request)\n", - " data_request.raw_spot_data = pd.concat([data_request.raw_spot_data, greek_data], axis=1)\n", - " format_raw_spot_data(data_request=data_request)\n", - " \n", - " else:\n", - " data_request.raw_spot_data = pd.DataFrame()\n", - "\n", - " def __pre_process_data(self, **kwargs):\n", - " data_request = kwargs.get('data_request')\n", - " data = data_request.database_data\n", - " data_request.pre_process = {}\n", - "\n", - " ## Check timeseries is complete\n", - " ## Considering we're taking a resample approach, where base intraday data is 5 minutes, and EOD is 1 day\n", - " ## We will only check 5 minutes and 1 day is complete\n", - "\n", - " start, end = data_request.start_date, data_request.end_date\n", - " date_range = bus_range(start, end, '5Min') if data_request.agg == 'intra' else bus_range(start, end, '1B')\n", - "\n", - " ## Transform the data to Opttick as columns, close as values, datetime as index\n", - " transformed = data_request.database_data.pivot_table(\n", - " index = ['datetime'],\n", - " columns = ['optiontick'],\n", - " values = ['close']\n", - " )\n", - " transformed.columns = transformed.columns.droplevel(0)\n", - "\n", - "\n", - " ## First Completeness check: Do we have all OptTicks?\n", - " first_check = all(x in transformed.columns for x in data_request.opttick)\n", - " ## This will fill missing option ticks with NaN\n", - " transformed[[x for x in data_request.opttick if x not in transformed.columns.get_level_values(0)]] = np.nan\n", - "\n", - "\n", - " ## Second Completeness check: Do we have all dates?\n", - " missing_dates_second_check = [x for x in date_range if x not in (transformed.index)]\n", - " second_check = all(x in pd.DatetimeIndex(transformed.index) for x in date_range)\n", - " transformed = transformed.reindex(date_range, fill_value=np.nan) ## This will fill the missing dates with NaN\n", - "\n", - " ## Third Completeness check: If we have all Ticks, do all ticks have all dates? \n", - " ## This will exclude dates from second check\n", - " if not first_check:\n", - " third_check = False\n", - " else:\n", - " ## Check if all dates are present for all ticks\n", - " third_check = not transformed.isna().any().any()\n", - "\n", - " complete_check = first_check and second_check and third_check\n", - "\n", - " ## Is empty Check\n", - " is_empty = data_request.database_data.empty\n", - "\n", - " # Missing Dates: This will be tiered\n", - " if not first_check: ## This means all dates are missing for one name, we have to query all dates\n", - " missing_dates = date_range\n", - " else: ## This means some dates are missing for some names.\n", - " missing_dates = transformed[transformed.isna().any(axis = 1)].index.to_list()\n", - "\n", - " ## Save preprocessed data\n", - " data_request.pre_process['is_complete'] = complete_check\n", - " data_request.pre_process['is_empty'] = is_empty\n", - " data_request.missing_dates = missing_dates\n", - "\n", - " data = data[data_request.requested_col] ## Select only the requested columns\n", - " data.columns = [x.capitalize() for x in data.columns] ## Capitalize the columns\n", - " data.set_index([ 'Optiontick', 'Datetime',], inplace = True) ## Set the index to datetime\n", - " data = data[~data.index.duplicated(keep='first')] ## Remove duplicates\n", - " data.sort_index(inplace = True)\n", - " data_request.pre_processed_data = data\n", - "\n", - " @staticmethod\n", - " def one_off_save(start:str, \n", - " end:str, \n", - " tick:str, \n", - " exp:str, \n", - " print_info:bool = False):\n", - " \"\"\"\n", - " This function is used to save the data to the database without initializing the data manager\n", - " \"\"\"\n", - " bulk_one_off_save(start, end, tick, exp, print_info)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 90, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving data to securities_master.temp_options_eod_new\n", - "Querying data from 2024-12-27 00:00:00 to 2025-07-05 00:00:00\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Starting to save data to database\n", - "Calculating Vols\n", - "Resolving Vols\n", - "2025-04-21 18:06:34 trade.models.utils ERROR: AAPL20250502C110, 2025-03-24 could not fit SVI model. Returning zero\n", - "2025-04-21 18:08:01 trade.models.utils ERROR: AAPL20250502C140, 2025-04-21 could not fit SVI model. Returning zero\n", - "2025-04-21 18:08:12 trade.models.utils ERROR: AAPL20250502C145, 2025-03-24 could not fit SVI model. Returning zero\n", - "2025-04-21 18:08:24 trade.models.utils ERROR: AAPL20250502C145, 2025-04-21 could not fit SVI model. Returning zero\n", - "2025-04-21 18:08:34 trade.models.utils ERROR: AAPL20250502C150, 2025-03-24 could not fit SVI model. Returning zero\n", - "2025-04-21 18:08:45 trade.models.utils ERROR: AAPL20250502C160, 2025-03-24 could not fit SVI model. Returning zero\n", - "2025-04-21 18:09:56 trade.models.utils ERROR: AAPL20250502P280, 2025-04-14 could not fit SVI model. Returning zero\n", - "2025-04-21 18:10:09 trade.models.utils ERROR: AAPL20250502P285, 2025-04-14 could not fit SVI model. Returning zero\n", - "2025-04-21 18:10:20 trade.models.utils ERROR: AAPL20250502P290, 2025-04-14 could not fit SVI model. Returning zero\n", - "2025-04-21 18:10:32 trade.models.utils ERROR: AAPL20250502P295, 2025-04-14 could not fit SVI model. Returning zero\n", - "2025-04-21 18:10:44 trade.models.utils ERROR: AAPL20250502P300, 2025-04-14 could not fit SVI model. Returning zero\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Exception in thread save_to_database_one_off:\n", - "Traceback (most recent call last):\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py\", line 1714, in _get_list_axis\n", - " return self.obj._take_with_is_copy(key, axis=axis)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py\", line 4153, in _take_with_is_copy\n", - " result = self.take(indices=indices, axis=axis)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py\", line 4133, in take\n", - " new_data = self._mgr.take(\n", - " ^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py\", line 891, in take\n", - " indexer = maybe_convert_indices(indexer, n, verify=verify)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py\", line 282, in maybe_convert_indices\n", - " raise IndexError(\"indices are out-of-bounds\")\n", - "IndexError: indices are out-of-bounds\n", - "\n", - "The above exception was the direct cause of the following exception:\n", - "\n", - "Traceback (most recent call last):\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py\", line 1045, in _bootstrap_inner\n", - " self.run()\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/ipkernel.py\", line 766, in run_closure\n", - " _threading_Thread_run(self)\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py\", line 982, in run\n", - " self._target(*self._args, **self._kwargs)\n", - " File \"/var/folders/j0/80hkbygd4lb27h9mw76gqzpw0000gn/T/ipykernel_33832/2569485703.py\", line 84, in save_to_database\n", - " File \"/var/folders/j0/80hkbygd4lb27h9mw76gqzpw0000gn/T/ipykernel_33832/4131920194.py\", line 19, in resolve_missing_vols_in_data\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py\", line 10374, in apply\n", - " return op.apply().__finalize__(self, method=\"apply\")\n", - " ^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py\", line 916, in apply\n", - " return self.apply_standard()\n", - " ^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py\", line 1063, in apply_standard\n", - " results, res_index = self.apply_series_generator()\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py\", line 1081, in apply_series_generator\n", - " results[i] = self.func(v, *self.args, **self.kwargs)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/var/folders/j0/80hkbygd4lb27h9mw76gqzpw0000gn/T/ipykernel_33832/4131920194.py\", line 20, in \n", - " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/models/utils.py\", line 214, in resolve_missing_vol\n", - " return resolve_missing_vol(\n", - " ^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/models/utils.py\", line 85, in resolve_missing_vol\n", - " contracts_filtered = contracts_filtered.iloc[interpolate_idx]\n", - " ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py\", line 1191, in __getitem__\n", - " return self._getitem_axis(maybe_callable, axis=axis)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py\", line 1743, in _getitem_axis\n", - " return self._get_list_axis(key, axis=axis)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py\", line 1717, in _get_list_axis\n", - " raise IndexError(\"positional indexers are out-of-bounds\") from err\n", - "IndexError: positional indexers are out-of-bounds\n" - ] - } - ], - "source": [ - "BulkOptionDataManager.one_off_save( start='2025-03-27',\n", - " end='2025-04-05',\n", - " tick='AAPL',\n", - " exp='2025-05-02',\n", - " print_info=True\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "metadata": {}, - "outputs": [], - "source": [ - "# bulk_manager = BulkOptionDataManager('AAPL', '2025-09-19', default_fill = 'midpoint')\n", - "bulk_manager = BulkOptionDataManager('AAPL', '2025-04-25', default_fill = 'midpoint')\n", - "bulk_manager.print_info = True" - ] - }, - { - "cell_type": "code", - "execution_count": 64, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Using Function to query the database\n", - "Is complete: False, Is empty: True\n", - "Data is empty, Querying all spot data\n", - "Resampling intra data\n", - "2025-04-21 16:39:50 dbase.DataAPI.ThetaData CRITICAL: `datetime_col_name` not provided for multi index resample, setting to `Datetime`\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
OpenHighLowCloseMidpointVolumeOpeninterestCloseask
OptiontickDatetime
AAPL20250425C2252025-03-274.906.564.566.056.150674108206.30
2025-03-285.005.943.483.483.500520109623.55
2025-03-313.486.153.205.305.2251130110115.35
2025-04-014.455.753.915.435.425737112805.50
2025-04-024.706.104.605.715.650629113405.80
2025-04-031.061.200.771.111.1103084113521.15
2025-04-040.601.080.440.500.5402547118640.64
AAPL20250425C2702025-03-270.060.060.060.060.04061600.07
2025-03-280.060.060.030.040.050261660.06
2025-03-310.020.020.020.020.04011560.06
2025-04-010.030.030.030.030.03521570.04
2025-04-020.000.000.000.000.02501590.03
2025-04-030.060.060.010.010.01051590.02
2025-04-040.000.000.000.000.30001640.60
AAPL20250425C2802025-03-270.000.000.000.000.1300900.25
2025-03-280.000.000.000.000.0350900.05
2025-03-310.020.020.020.020.0101900.02
2025-04-010.000.000.000.000.0100910.02
2025-04-020.020.030.020.030.0255910.03
2025-04-030.020.030.020.030.01510860.03
2025-04-040.000.000.000.000.0150960.03
AAPL20250425P2502025-03-2725.6026.3025.4526.3026.1751455526.80
2025-03-2828.3032.4528.3032.4032.1751125732.75
2025-03-310.000.000.000.0028.6000229.70
2025-04-010.000.000.000.0026.8750227.50
2025-04-0225.7525.7525.7525.7526.6501227.60
2025-04-0347.1547.1546.9546.9547.0754348.95
2025-04-0458.8258.8258.8258.8261.50010263.55
AAPL20250425P2702025-03-2746.2146.2146.1046.1045.6502046.75
2025-03-280.000.000.000.0051.5750052.90
2025-03-310.000.000.000.0048.6250049.75
2025-04-010.000.000.000.0046.9250047.40
2025-04-020.000.000.000.0046.1000046.55
2025-04-030.000.000.000.0067.0500068.95
2025-04-040.000.000.000.0081.5000083.55
\n", - "
" - ], - "text/plain": [ - " Open High Low Close Midpoint Volume \\\n", - "Optiontick Datetime \n", - "AAPL20250425C225 2025-03-27 4.90 6.56 4.56 6.05 6.150 674 \n", - " 2025-03-28 5.00 5.94 3.48 3.48 3.500 520 \n", - " 2025-03-31 3.48 6.15 3.20 5.30 5.225 1130 \n", - " 2025-04-01 4.45 5.75 3.91 5.43 5.425 737 \n", - " 2025-04-02 4.70 6.10 4.60 5.71 5.650 629 \n", - " 2025-04-03 1.06 1.20 0.77 1.11 1.110 3084 \n", - " 2025-04-04 0.60 1.08 0.44 0.50 0.540 2547 \n", - "AAPL20250425C270 2025-03-27 0.06 0.06 0.06 0.06 0.040 6 \n", - " 2025-03-28 0.06 0.06 0.03 0.04 0.050 26 \n", - " 2025-03-31 0.02 0.02 0.02 0.02 0.040 1 \n", - " 2025-04-01 0.03 0.03 0.03 0.03 0.035 2 \n", - " 2025-04-02 0.00 0.00 0.00 0.00 0.025 0 \n", - " 2025-04-03 0.06 0.06 0.01 0.01 0.010 5 \n", - " 2025-04-04 0.00 0.00 0.00 0.00 0.300 0 \n", - "AAPL20250425C280 2025-03-27 0.00 0.00 0.00 0.00 0.130 0 \n", - " 2025-03-28 0.00 0.00 0.00 0.00 0.035 0 \n", - " 2025-03-31 0.02 0.02 0.02 0.02 0.010 1 \n", - " 2025-04-01 0.00 0.00 0.00 0.00 0.010 0 \n", - " 2025-04-02 0.02 0.03 0.02 0.03 0.025 5 \n", - " 2025-04-03 0.02 0.03 0.02 0.03 0.015 10 \n", - " 2025-04-04 0.00 0.00 0.00 0.00 0.015 0 \n", - "AAPL20250425P250 2025-03-27 25.60 26.30 25.45 26.30 26.175 145 \n", - " 2025-03-28 28.30 32.45 28.30 32.40 32.175 112 \n", - " 2025-03-31 0.00 0.00 0.00 0.00 28.600 0 \n", - " 2025-04-01 0.00 0.00 0.00 0.00 26.875 0 \n", - " 2025-04-02 25.75 25.75 25.75 25.75 26.650 1 \n", - " 2025-04-03 47.15 47.15 46.95 46.95 47.075 4 \n", - " 2025-04-04 58.82 58.82 58.82 58.82 61.500 10 \n", - "AAPL20250425P270 2025-03-27 46.21 46.21 46.10 46.10 45.650 2 \n", - " 2025-03-28 0.00 0.00 0.00 0.00 51.575 0 \n", - " 2025-03-31 0.00 0.00 0.00 0.00 48.625 0 \n", - " 2025-04-01 0.00 0.00 0.00 0.00 46.925 0 \n", - " 2025-04-02 0.00 0.00 0.00 0.00 46.100 0 \n", - " 2025-04-03 0.00 0.00 0.00 0.00 67.050 0 \n", - " 2025-04-04 0.00 0.00 0.00 0.00 81.500 0 \n", - "\n", - " Openinterest Closeask \n", - "Optiontick Datetime \n", - "AAPL20250425C225 2025-03-27 10820 6.30 \n", - " 2025-03-28 10962 3.55 \n", - " 2025-03-31 11011 5.35 \n", - " 2025-04-01 11280 5.50 \n", - " 2025-04-02 11340 5.80 \n", - " 2025-04-03 11352 1.15 \n", - " 2025-04-04 11864 0.64 \n", - "AAPL20250425C270 2025-03-27 160 0.07 \n", - " 2025-03-28 166 0.06 \n", - " 2025-03-31 156 0.06 \n", - " 2025-04-01 157 0.04 \n", - " 2025-04-02 159 0.03 \n", - " 2025-04-03 159 0.02 \n", - " 2025-04-04 164 0.60 \n", - "AAPL20250425C280 2025-03-27 90 0.25 \n", - " 2025-03-28 90 0.05 \n", - " 2025-03-31 90 0.02 \n", - " 2025-04-01 91 0.02 \n", - " 2025-04-02 91 0.03 \n", - " 2025-04-03 86 0.03 \n", - " 2025-04-04 96 0.03 \n", - "AAPL20250425P250 2025-03-27 55 26.80 \n", - " 2025-03-28 57 32.75 \n", - " 2025-03-31 2 29.70 \n", - " 2025-04-01 2 27.50 \n", - " 2025-04-02 2 27.60 \n", - " 2025-04-03 3 48.95 \n", - " 2025-04-04 2 63.55 \n", - "AAPL20250425P270 2025-03-27 0 46.75 \n", - " 2025-03-28 0 52.90 \n", - " 2025-03-31 0 49.75 \n", - " 2025-04-01 0 47.40 \n", - " 2025-04-02 0 46.55 \n", - " 2025-04-03 0 68.95 \n", - " 2025-04-04 0 83.55 " - ] - }, - "execution_count": 64, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# request = manager.get_timeseries(\n", - "# start='2024-12-17',\n", - "# end='2024-12-18',\n", - "# interval='1h',\n", - "# type_='vol',\n", - "# model='bs',\n", - "# extra_cols=['ask']\n", - "# )\n", - "# request.post_processed_data\n", - "\n", - "\n", - "request = bulk_manager.get_timeseries(\n", - " start='2025-03-27',\n", - " end='2025-04-05',\n", - " interval='1d',\n", - " type_='spot',\n", - " model='binomial',\n", - " extra_cols=['ask'],\n", - " strikes_right = [(280.0, 'C'), (270.0, 'P'), (225.0, 'C'), (270.0, 'C'), (250.0, 'P') ]\n", - ")\n", - "request.post_processed_data" - ] - }, - { - "cell_type": "code", - "execution_count": 63, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
OpenHighLowCloseMidpointVolumeOpeninterestCloseask
OptiontickDatetime
AAPL20250425C2252025-03-274.906.564.566.056.150674108206.30
2025-03-285.005.943.483.483.500520109623.55
2025-03-313.486.153.205.305.2251130110115.35
2025-04-014.455.753.915.435.425737112805.50
2025-04-024.706.104.605.715.650629113405.80
2025-04-031.061.200.771.111.1103084113521.15
2025-04-040.601.080.440.500.5402547118640.64
AAPL20250425C2702025-03-270.060.060.060.060.04061600.07
2025-03-280.060.060.030.040.050261660.06
2025-03-310.020.020.020.020.04011560.06
2025-04-010.030.030.030.030.03521570.04
2025-04-020.000.000.000.000.02501590.03
2025-04-030.060.060.010.010.01051590.02
2025-04-040.000.000.000.000.30001640.60
AAPL20250425C2802025-03-270.000.000.000.000.1300900.25
2025-03-280.000.000.000.000.0350900.05
2025-03-310.020.020.020.020.0101900.02
2025-04-010.000.000.000.000.0100910.02
2025-04-020.020.030.020.030.0255910.03
2025-04-030.020.030.020.030.01510860.03
2025-04-040.000.000.000.000.0150960.03
AAPL20250425P2502025-03-2725.6026.3025.4526.3026.1751455526.80
2025-03-2828.3032.4528.3032.4032.1751125732.75
2025-03-310.000.000.000.0028.6000229.70
2025-04-010.000.000.000.0026.8750227.50
2025-04-0225.7525.7525.7525.7526.6501227.60
2025-04-0347.1547.1546.9546.9547.0754348.95
2025-04-0458.8258.8258.8258.8261.50010263.55
AAPL20250425P2702025-03-2746.2146.2146.1046.1045.6502046.75
2025-03-280.000.000.000.0051.5750052.90
2025-03-310.000.000.000.0048.6250049.75
2025-04-010.000.000.000.0046.9250047.40
2025-04-020.000.000.000.0046.1000046.55
2025-04-030.000.000.000.0067.0500068.95
2025-04-040.000.000.000.0081.5000083.55
\n", - "
" - ], - "text/plain": [ - " Open High Low Close Midpoint Volume \\\n", - "Optiontick Datetime \n", - "AAPL20250425C225 2025-03-27 4.90 6.56 4.56 6.05 6.150 674 \n", - " 2025-03-28 5.00 5.94 3.48 3.48 3.500 520 \n", - " 2025-03-31 3.48 6.15 3.20 5.30 5.225 1130 \n", - " 2025-04-01 4.45 5.75 3.91 5.43 5.425 737 \n", - " 2025-04-02 4.70 6.10 4.60 5.71 5.650 629 \n", - " 2025-04-03 1.06 1.20 0.77 1.11 1.110 3084 \n", - " 2025-04-04 0.60 1.08 0.44 0.50 0.540 2547 \n", - "AAPL20250425C270 2025-03-27 0.06 0.06 0.06 0.06 0.040 6 \n", - " 2025-03-28 0.06 0.06 0.03 0.04 0.050 26 \n", - " 2025-03-31 0.02 0.02 0.02 0.02 0.040 1 \n", - " 2025-04-01 0.03 0.03 0.03 0.03 0.035 2 \n", - " 2025-04-02 0.00 0.00 0.00 0.00 0.025 0 \n", - " 2025-04-03 0.06 0.06 0.01 0.01 0.010 5 \n", - " 2025-04-04 0.00 0.00 0.00 0.00 0.300 0 \n", - "AAPL20250425C280 2025-03-27 0.00 0.00 0.00 0.00 0.130 0 \n", - " 2025-03-28 0.00 0.00 0.00 0.00 0.035 0 \n", - " 2025-03-31 0.02 0.02 0.02 0.02 0.010 1 \n", - " 2025-04-01 0.00 0.00 0.00 0.00 0.010 0 \n", - " 2025-04-02 0.02 0.03 0.02 0.03 0.025 5 \n", - " 2025-04-03 0.02 0.03 0.02 0.03 0.015 10 \n", - " 2025-04-04 0.00 0.00 0.00 0.00 0.015 0 \n", - "AAPL20250425P250 2025-03-27 25.60 26.30 25.45 26.30 26.175 145 \n", - " 2025-03-28 28.30 32.45 28.30 32.40 32.175 112 \n", - " 2025-03-31 0.00 0.00 0.00 0.00 28.600 0 \n", - " 2025-04-01 0.00 0.00 0.00 0.00 26.875 0 \n", - " 2025-04-02 25.75 25.75 25.75 25.75 26.650 1 \n", - " 2025-04-03 47.15 47.15 46.95 46.95 47.075 4 \n", - " 2025-04-04 58.82 58.82 58.82 58.82 61.500 10 \n", - "AAPL20250425P270 2025-03-27 46.21 46.21 46.10 46.10 45.650 2 \n", - " 2025-03-28 0.00 0.00 0.00 0.00 51.575 0 \n", - " 2025-03-31 0.00 0.00 0.00 0.00 48.625 0 \n", - " 2025-04-01 0.00 0.00 0.00 0.00 46.925 0 \n", - " 2025-04-02 0.00 0.00 0.00 0.00 46.100 0 \n", - " 2025-04-03 0.00 0.00 0.00 0.00 67.050 0 \n", - " 2025-04-04 0.00 0.00 0.00 0.00 81.500 0 \n", - "\n", - " Openinterest Closeask \n", - "Optiontick Datetime \n", - "AAPL20250425C225 2025-03-27 10820 6.30 \n", - " 2025-03-28 10962 3.55 \n", - " 2025-03-31 11011 5.35 \n", - " 2025-04-01 11280 5.50 \n", - " 2025-04-02 11340 5.80 \n", - " 2025-04-03 11352 1.15 \n", - " 2025-04-04 11864 0.64 \n", - "AAPL20250425C270 2025-03-27 160 0.07 \n", - " 2025-03-28 166 0.06 \n", - " 2025-03-31 156 0.06 \n", - " 2025-04-01 157 0.04 \n", - " 2025-04-02 159 0.03 \n", - " 2025-04-03 159 0.02 \n", - " 2025-04-04 164 0.60 \n", - "AAPL20250425C280 2025-03-27 90 0.25 \n", - " 2025-03-28 90 0.05 \n", - " 2025-03-31 90 0.02 \n", - " 2025-04-01 91 0.02 \n", - " 2025-04-02 91 0.03 \n", - " 2025-04-03 86 0.03 \n", - " 2025-04-04 96 0.03 \n", - "AAPL20250425P250 2025-03-27 55 26.80 \n", - " 2025-03-28 57 32.75 \n", - " 2025-03-31 2 29.70 \n", - " 2025-04-01 2 27.50 \n", - " 2025-04-02 2 27.60 \n", - " 2025-04-03 3 48.95 \n", - " 2025-04-04 2 63.55 \n", - "AAPL20250425P270 2025-03-27 0 46.75 \n", - " 2025-03-28 0 52.90 \n", - " 2025-03-31 0 49.75 \n", - " 2025-04-01 0 47.40 \n", - " 2025-04-02 0 46.55 \n", - " 2025-04-03 0 68.95 \n", - " 2025-04-04 0 83.55 " - ] - }, - "execution_count": 63, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "current_request = bulk_manager.data_request[bulk_manager.current_request] \n", - "# add_inputs_to_raw(bulk_manager, data_request=current_request) \n", - "current_request.post_processed_data" - ] - }, - { - "cell_type": "code", - "execution_count": 73, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Rows inserted into temp_options_eod_new: 5\r" - ] - } - ], - "source": [ - "def bulk_one_off_save(\n", - " start: str | datetime,\n", - " end: str | datetime,\n", - " tick: str,\n", - " exp: str,\n", - " print_info: bool = False,\n", - "):\n", - " \"\"\"\n", - " This function is used to save the data to the database without initializing the data manager\n", - " \"\"\"\n", - " global CENTRAL_SAVE_THREAD\n", - " current_request = datetime.now().strftime(\"%Y%m%d %H:%M:%S\")\n", - " missing_dates = [start, end]\n", - " dummy_request = BulkOptionQueryRequestParameter(\n", - " table_name='temp_options_eod_new',\n", - " db_name='securities_master',\n", - " start_date=start,\n", - " end_date=end,\n", - " ticker=tick,\n", - " exp=exp,\n", - " )\n", - " dummy_request.agg = 'eod'\n", - " dummy_request.start_date = start\n", - " dummy_request.end_date = end\n", - " dummy_request.missing_dates = missing_dates\n", - " lazy_loader = _ManagerLazyLoader(tick)\n", - " lazy_loader.exp = dummy_request.exp\n", - " dummy_request.input_params = lazy_loader.eod\n", - " \n", - " save_thread = Thread(target=save_to_database, args=(dummy_request,print_info), name = \"save_to_database_one_off\", daemon=True)\n", - " save_thread.start()\n", - " CENTRAL_SAVE_THREAD[current_request] = save_thread\n", - "\n", - "\n", - "bulk_one_off_save(\n", - " start='2025-03-27',\n", - " end='2025-04-05',\n", - " tick='AAPL',\n", - " exp='2025-04-25',\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 101, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'20250421 16:29:53': ,\n", - " '20250421 16:30:00': ,\n", - " '20250421 16:55:48': ,\n", - " '20250421 16:59:43': ,\n", - " '20250421 17:00:27': ,\n", - " '20250421 17:22:50': ,\n", - " '20250421 17:38:53': }" - ] - }, - "execution_count": 101, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "CENTRAL_SAVE_THREAD" - ] - }, - { - "cell_type": "code", - "execution_count": 833, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "First Check: True, Second Check: True, Third Check: True, Complete Check: True, Is Empty: False\n" - ] - } - ], - "source": [ - "\n", - "start, end = current_request.start_date, current_request.end_date\n", - "date_range = bus_range(start, end, '5Min') if current_request.agg == 'intra' else bus_range(start, end, '1B')\n", - "\n", - "## Transform the data to Opttick as columns, close as values, datetime as index\n", - "transformed = current_request.database_data.pivot_table(\n", - " index = ['datetime'],\n", - " columns = ['optiontick'],\n", - " values = ['close']\n", - ")\n", - "transformed.columns = transformed.columns.droplevel(0)\n", - "\n", - "\n", - "## First Completeness check: Do we have all OptTicks?\n", - "first_check = all(x in transformed.columns for x in current_request.opttick)\n", - "## This will fill missing option ticks with NaN\n", - "transformed[[x for x in current_request.opttick if x not in transformed.columns.get_level_values(0)]] = np.nan\n", - "\n", - "\n", - "## Second Completeness check: Do we have all dates?\n", - "missing_dates_second_check = [x for x in date_range if x not in (transformed.index)]\n", - "second_check = all(x in pd.DatetimeIndex(transformed.index) for x in date_range)\n", - "transformed = transformed.reindex(date_range, fill_value=np.nan) ## This will fill the missing dates with NaN\n", - "\n", - "## Third Completeness check: If we have all Ticks, do all ticks have all dates? \n", - "## This will exclude dates from second check\n", - "if not first_check:\n", - " third_check = False\n", - "else:\n", - " ## Check if all dates are present for all ticks\n", - " third_check = not transformed.isna().any().any()\n", - "\n", - "complete_check = first_check and second_check and third_check\n", - "\n", - "## Is empty Check\n", - "is_empty = current_request.database_data.empty\n", - "\n", - "# Missing Dates: This will be tiered\n", - "if not first_check: ## This means all dates are missing for one name, we have to query all dates\n", - " missing_dates = date_range\n", - "else: ## This means some dates are missing for some names.\n", - " missing_dates = transformed[transformed.isna().any(axis = 1)].index.to_list()\n", - "\n", - "print(f\"First Check: {first_check}, Second Check: {second_check}, Third Check: {third_check}, Complete Check: {complete_check}, Is Empty: {is_empty}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 367, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
DatetimeRootStrikeExpirationRightOpenHighLowCloseVolumeBid_sizeCloseBidAsk_sizeCloseAskMidpointWeighted_midpointOptionTickOpen_interest
604802024-07-10 16:00:00META705.02025-09-19C0.000.000.000.0002141.251043.3042.27541.911290META20250919C705NaN
606022024-07-10 16:00:00META705.02025-09-19P0.000.000.000.00049182.2011186.15184.175182.924167META20250919P705NaN
612282024-07-10 16:00:00META715.02025-09-19C0.000.000.000.0002139.10841.0040.05039.624138META20250919C715NaN
613502024-07-10 16:00:00META715.02025-09-19P0.000.000.000.00034190.5511194.30192.425191.466667META20250919P715NaN
619762024-07-10 16:00:00META725.02025-09-19C39.0039.0038.9539.0061437.451638.7038.07538.116667META20250919C725NaN
.........................................................
808682024-12-09 16:00:00META1230.02025-09-19P0.000.000.000.00056613.1050620.35616.725616.519811META20250919P1230NaN
808842024-12-09 16:00:00META1240.02025-09-19C0.000.000.000.00052.2252.372.2952.295000META20250919C1240NaN
809002024-12-09 16:00:00META1240.02025-09-19P0.000.000.000.00056623.1050630.40626.750626.543396META20250919P1240NaN
809162024-12-09 16:00:00META1250.02025-09-19C2.362.362.362.36192.1212.572.3452.165000META20250919C1250NaN
809322024-12-09 16:00:00META1250.02025-09-19P0.000.000.000.00056633.1055640.75636.925636.890541META20250919P1250NaN
\n", - "

136 rows × 18 columns

\n", - "
" - ], - "text/plain": [ - " Datetime Root Strike Expiration Right Open High Low \\\n", - "60480 2024-07-10 16:00:00 META 705.0 2025-09-19 C 0.00 0.00 0.00 \n", - "60602 2024-07-10 16:00:00 META 705.0 2025-09-19 P 0.00 0.00 0.00 \n", - "61228 2024-07-10 16:00:00 META 715.0 2025-09-19 C 0.00 0.00 0.00 \n", - "61350 2024-07-10 16:00:00 META 715.0 2025-09-19 P 0.00 0.00 0.00 \n", - "61976 2024-07-10 16:00:00 META 725.0 2025-09-19 C 39.00 39.00 38.95 \n", - "... ... ... ... ... ... ... ... ... \n", - "80868 2024-12-09 16:00:00 META 1230.0 2025-09-19 P 0.00 0.00 0.00 \n", - "80884 2024-12-09 16:00:00 META 1240.0 2025-09-19 C 0.00 0.00 0.00 \n", - "80900 2024-12-09 16:00:00 META 1240.0 2025-09-19 P 0.00 0.00 0.00 \n", - "80916 2024-12-09 16:00:00 META 1250.0 2025-09-19 C 2.36 2.36 2.36 \n", - "80932 2024-12-09 16:00:00 META 1250.0 2025-09-19 P 0.00 0.00 0.00 \n", - "\n", - " Close Volume Bid_size CloseBid Ask_size CloseAsk Midpoint \\\n", - "60480 0.00 0 21 41.25 10 43.30 42.275 \n", - "60602 0.00 0 49 182.20 11 186.15 184.175 \n", - "61228 0.00 0 21 39.10 8 41.00 40.050 \n", - "61350 0.00 0 34 190.55 11 194.30 192.425 \n", - "61976 39.00 6 14 37.45 16 38.70 38.075 \n", - "... ... ... ... ... ... ... ... \n", - "80868 0.00 0 56 613.10 50 620.35 616.725 \n", - "80884 0.00 0 5 2.22 5 2.37 2.295 \n", - "80900 0.00 0 56 623.10 50 630.40 626.750 \n", - "80916 2.36 1 9 2.12 1 2.57 2.345 \n", - "80932 0.00 0 56 633.10 55 640.75 636.925 \n", - "\n", - " Weighted_midpoint OptionTick Open_interest \n", - "60480 41.911290 META20250919C705 NaN \n", - "60602 182.924167 META20250919P705 NaN \n", - "61228 39.624138 META20250919C715 NaN \n", - "61350 191.466667 META20250919P715 NaN \n", - "61976 38.116667 META20250919C725 NaN \n", - "... ... ... ... \n", - "80868 616.519811 META20250919P1230 NaN \n", - "80884 2.295000 META20250919C1240 NaN \n", - "80900 626.543396 META20250919P1240 NaN \n", - "80916 2.165000 META20250919C1250 NaN \n", - "80932 636.890541 META20250919P1250 NaN \n", - "\n", - "[136 rows x 18 columns]" - ] - }, - "execution_count": 367, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "## Query Bulk EOD\n", - "start = '2024-01-01'\n", - "end = '2024-12-31'\n", - "bulk = retrieve_bulk_eod(\n", - " symbol = 'META',\n", - " exp = '2025-09-19',\n", - " start_date = start,\n", - " end_date = end,\n", - ")\n", - "\n", - "## Add Option Tick\n", - "bulk_eod = bulk.reset_index()\n", - "tick_col = ['Root', 'Right', 'Expiration', 'Strike']\n", - "bulk_eod['OptionTick'] = parallel_apply(bulk_eod[tick_col], generate_option_tick_new, pool = POOL_ENABLED)\n", - "\n", - "\n", - "## Query Bulk Open Interest\n", - "bulk_oi = retrieve_bulk_open_interest(\n", - " symbol = 'META',\n", - " exp = '2025-09-19',\n", - " start_date = start,\n", - " end_date = end,\n", - ")\n", - "## Add Option Tick\n", - "bulk_oi['OptionTick'] = parallel_apply(bulk_oi[tick_col], generate_option_tick_new, pool = POOL_ENABLED)\n", - "## Add EOD Timestamp\n", - "bulk_oi['Datetime'] = add_eod_timestamp(pd.DatetimeIndex(bulk_oi['Datetime']))\n", - "\n", - "\n", - "bulk_merged = bulk_eod.merge(bulk_oi[['Datetime','OptionTick', 'Open_interest']], on = ['Datetime', 'OptionTick'], how = 'left')\n", - "bulk_merged[bulk_merged.Open_interest.isna()]" - ] - }, - { - "cell_type": "code", - "execution_count": 280, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
DatetimeRootStrikeExpirationRightOpenHighLowCloseVolumeBid_sizeCloseBidAsk_sizeCloseAskMidpointWeighted_midpointOptionTickOpen_interest
02024-01-02 16:00:00META5.02025-09-19C0.00.00.00.0018339.9028343.65341.775342.182609META20250919C50.0
12024-01-03 16:00:00META5.02025-09-19C0.00.00.00.0010337.5010342.50340.000340.000000META20250919C50.0
22024-01-04 16:00:00META5.02025-09-19C0.00.00.00.0014340.7014344.65342.675342.675000META20250919C50.0
32024-01-05 16:00:00META5.02025-09-19C0.00.00.00.0028345.4528349.40347.425347.425000META20250919C50.0
42024-01-08 16:00:00META5.02025-09-19C0.00.00.00.0014352.1514356.05354.100354.100000META20250919C50.0
.........................................................
809432024-12-24 16:00:00META1250.02025-09-19P0.00.00.00.001640.501646.50643.500643.500000META20250919P12500.0
809442024-12-26 16:00:00META1250.02025-09-19P0.00.00.00.0011644.9512648.90646.925647.010870META20250919P12500.0
809452024-12-27 16:00:00META1250.02025-09-19P0.00.00.00.0012648.3511652.30650.325650.239130META20250919P12500.0
809462024-12-30 16:00:00META1250.02025-09-19P0.00.00.00.0016656.9017660.95658.925658.986364META20250919P12500.0
809472024-12-31 16:00:00META1250.02025-09-19P0.00.00.00.007662.3016666.10664.200664.943478META20250919P12500.0
\n", - "

80948 rows × 18 columns

\n", - "
" - ], - "text/plain": [ - " Datetime Root Strike Expiration Right Open High Low \\\n", - "0 2024-01-02 16:00:00 META 5.0 2025-09-19 C 0.0 0.0 0.0 \n", - "1 2024-01-03 16:00:00 META 5.0 2025-09-19 C 0.0 0.0 0.0 \n", - "2 2024-01-04 16:00:00 META 5.0 2025-09-19 C 0.0 0.0 0.0 \n", - "3 2024-01-05 16:00:00 META 5.0 2025-09-19 C 0.0 0.0 0.0 \n", - "4 2024-01-08 16:00:00 META 5.0 2025-09-19 C 0.0 0.0 0.0 \n", - "... ... ... ... ... ... ... ... ... \n", - "80943 2024-12-24 16:00:00 META 1250.0 2025-09-19 P 0.0 0.0 0.0 \n", - "80944 2024-12-26 16:00:00 META 1250.0 2025-09-19 P 0.0 0.0 0.0 \n", - "80945 2024-12-27 16:00:00 META 1250.0 2025-09-19 P 0.0 0.0 0.0 \n", - "80946 2024-12-30 16:00:00 META 1250.0 2025-09-19 P 0.0 0.0 0.0 \n", - "80947 2024-12-31 16:00:00 META 1250.0 2025-09-19 P 0.0 0.0 0.0 \n", - "\n", - " Close Volume Bid_size CloseBid Ask_size CloseAsk Midpoint \\\n", - "0 0.0 0 18 339.90 28 343.65 341.775 \n", - "1 0.0 0 10 337.50 10 342.50 340.000 \n", - "2 0.0 0 14 340.70 14 344.65 342.675 \n", - "3 0.0 0 28 345.45 28 349.40 347.425 \n", - "4 0.0 0 14 352.15 14 356.05 354.100 \n", - "... ... ... ... ... ... ... ... \n", - "80943 0.0 0 1 640.50 1 646.50 643.500 \n", - "80944 0.0 0 11 644.95 12 648.90 646.925 \n", - "80945 0.0 0 12 648.35 11 652.30 650.325 \n", - "80946 0.0 0 16 656.90 17 660.95 658.925 \n", - "80947 0.0 0 7 662.30 16 666.10 664.200 \n", - "\n", - " Weighted_midpoint OptionTick Open_interest \n", - "0 342.182609 META20250919C5 0.0 \n", - "1 340.000000 META20250919C5 0.0 \n", - "2 342.675000 META20250919C5 0.0 \n", - "3 347.425000 META20250919C5 0.0 \n", - "4 354.100000 META20250919C5 0.0 \n", - "... ... ... ... \n", - "80943 643.500000 META20250919P1250 0.0 \n", - "80944 647.010870 META20250919P1250 0.0 \n", - "80945 650.239130 META20250919P1250 0.0 \n", - "80946 658.986364 META20250919P1250 0.0 \n", - "80947 664.943478 META20250919P1250 0.0 \n", - "\n", - "[80948 rows x 18 columns]" - ] - }, - "execution_count": 280, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "request.agg = 'eod'\n", - "spot_manager = SpotDataManager('META')\n", - "bulk_eod_from_manager = spot_manager.query_thetadata(\n", - " data_request = request,\n", - " start = '2024-01-01',\n", - " end = '2024-12-31',\n", - " exp = '2025-09-19',\n", - " right = 'C',\n", - " bulk = True\n", - ")\n", - "bulk_eod_from_manager" - ] - }, - { - "cell_type": "code", - "execution_count": 273, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'eod'" - ] - }, - "execution_count": 273, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 488, - "metadata": {}, - "outputs": [], - "source": [ - "db = DatabaseAdapter()\n", - "columns = db.query_database('securities_master', 'temp_options_eod_new', \"SELECT * FROM securities_master.temp_options_eod_new WHERE 1=0\").columns\n", - "columns = [x.lower() for x in columns]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Database Save" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### References" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "spot_sm = spot_manager.query_thetadata('2023-02-03', '2023-02-10', strike=220.0, exp='2024-09-20', right='C', bulk=False, data_request=request)\n", - "spot_sm['Strike'] = manager.strike\n", - "spot_sm['Expiration'] = manager.exp\n", - "spot_sm['Put/Call'] = manager.right\n", - "spot_sm['Underlier_price'] = request.input_params['s0_close']['close']\n", - "spot_sm['RF_rate'] = request.input_params['r']\n", - "spot_sm['dividend'] = request.input_params['y']\n", - "spot_sm['OptionTick'] = manager.opttick\n", - "spot_sm['Underlier'] = manager.symbol\n", - "spot_sm['RF_rate_name'] = request.input_params['r_name']\n", - "spot_sm['Datetime'] = spot_sm.index\n", - "spot_sm.columns = [x.lower() for x in spot_sm.columns]\n", - "spot_sm.rename(columns = {'open_interest':'openinterest'}, inplace = True)\n", - "[x for x in columns if x not in spot_sm.columns]\n", - "# spot_sm" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Vol Calcs" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "calc_vol_for_data(spot_sm, 'close', 'BS_IV', 'bs')\n", - "calc_vol_for_data(spot_sm, 'midpoint', 'Midpoint_BS_IV', 'bs')\n", - "calc_vol_for_data(spot_sm, 'weighted_midpoint', 'Weighted_Midpoint_BS_IV', 'bs')\n", - "calc_vol_for_data(spot_sm, 'closebid', 'bid_bs_iv', 'bs')\n", - "calc_vol_for_data(spot_sm, 'closeask', 'ask_bs_iv', 'bs')\n", - "\n", - "calc_vol_for_data(spot_sm, 'close', 'Binomial_IV','binomial')\n", - "calc_vol_for_data(spot_sm, 'midpoint', 'Midpoint_binomial_IV', 'binomial')\n", - "calc_vol_for_data(spot_sm, 'weighted_midpoint', 'Weighted_Midpoint_binomial_IV', 'binomial')\n", - "calc_vol_for_data(spot_sm, 'closebid', 'bid_binomial_iv', 'binomial')\n", - "calc_vol_for_data(spot_sm, 'closeask', 'ask_binomial_iv', 'binomial')\n" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['delta',\n", - " 'gamma',\n", - " 'vega',\n", - " 'theta',\n", - " 'rho',\n", - " 'vanna',\n", - " 'volga',\n", - " 'dollar_delta',\n", - " 'midpoint_delta',\n", - " 'midpoint_gamma',\n", - " 'midpoint_vega',\n", - " 'midpoint_theta',\n", - " 'midpoint_rho',\n", - " 'midpoint_vanna',\n", - " 'midpoint_volga',\n", - " 'midpoint_dollar_delta',\n", - " 'weighted_midpoint_delta',\n", - " 'weighted_midpoint_gamma',\n", - " 'weighted_midpoint_vega',\n", - " 'weighted_midpoint_theta',\n", - " 'weighted_midpoint_rho',\n", - " 'weighted_midpoint_vanna',\n", - " 'weighted_midpoint_volga',\n", - " 'weighted_midpoint_dollar_delta',\n", - " 'midpoint_binomial_gamma',\n", - " 'midpoint_binomial_vega',\n", - " 'midpoint_binomial_delta',\n", - " 'midpoint_binomial_rho',\n", - " 'midpoint_binomial_vanna',\n", - " 'midpoint_binomial_volga',\n", - " 'midpoint_binomial_theta',\n", - " 'last_updated',\n", - " 'binomial_delta',\n", - " 'binomial_gamma',\n", - " 'binomial_vega',\n", - " 'binomial_volga',\n", - " 'binomial_vanna',\n", - " 'binomial_rho',\n", - " 'binomial_theta',\n", - " 'midpoint_bs_vol_resolve',\n", - " 'midpoint_binomial_vol_resolve',\n", - " 'ask_binomial_delta',\n", - " 'ask_binomial_gamma',\n", - " 'ask_binomial_vega',\n", - " 'ask_binomial_rho',\n", - " 'ask_binomial_theta',\n", - " 'ask_binomial_vanna',\n", - " 'ask_binomial_volga',\n", - " 'bid_binomial_delta',\n", - " 'bid_binomial_gamma',\n", - " 'bid_binomial_vega',\n", - " 'bid_binomial_rho',\n", - " 'bid_binomial_theta',\n", - " 'bid_binomial_vanna',\n", - " 'bid_binomial_volga']" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "spot_sm.columns = spot_sm.columns.str.lower()\n", - "[x for x in columns if x not in spot_sm.columns]\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Greeks" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Index(['open', 'high', 'low', 'close', 'volume', 'bid_size', 'closebid',\n", - " 'ask_size', 'closeask', 'midpoint', 'weighted_midpoint', 'openinterest',\n", - " 'strike', 'expiration', 'put/call', 'underlier_price', 'rf_rate',\n", - " 'dividend', 'optiontick', 'underlier', 'rf_rate_name', 'datetime',\n", - " 'bs_iv', 'midpoint_bs_iv', 'weighted_midpoint_bs_iv', 'bid_bs_iv',\n", - " 'ask_bs_iv', 'binomial_iv', 'midpoint_binomial_iv',\n", - " 'weighted_midpoint_binomial_iv', 'bid_binomial_iv', 'ask_binomial_iv',\n", - " 'Delta', 'Gamma', 'Vega', 'Theta', 'Rho', 'Vanna', 'Volga',\n", - " 'midpoint_Delta', 'midpoint_Gamma', 'midpoint_Vega', 'midpoint_Theta',\n", - " 'midpoint_Rho', 'midpoint_Vanna', 'midpoint_Volga',\n", - " 'weighted_midpoint_Delta', 'weighted_midpoint_Gamma',\n", - " 'weighted_midpoint_Vega', 'weighted_midpoint_Theta',\n", - " 'weighted_midpoint_Rho', 'weighted_midpoint_Vanna',\n", - " 'weighted_midpoint_Volga', 'bid_binomial_Delta', 'bid_binomial_Gamma',\n", - " 'bid_binomial_Vega', 'bid_binomial_Theta', 'bid_binomial_Rho',\n", - " 'bid_binomial_Vanna', 'bid_binomial_Volga', 'ask_binomial_Delta',\n", - " 'ask_binomial_Gamma', 'ask_binomial_Vega', 'ask_binomial_Theta',\n", - " 'ask_binomial_Rho', 'ask_binomial_Vanna', 'ask_binomial_Volga',\n", - " 'binomial_Delta', 'binomial_Gamma', 'binomial_Vega', 'binomial_Theta',\n", - " 'binomial_Rho', 'binomial_Vanna', 'binomial_Volga',\n", - " 'midpoint_binomial_Delta', 'midpoint_binomial_Gamma',\n", - " 'midpoint_binomial_Vega', 'midpoint_binomial_Theta',\n", - " 'midpoint_binomial_Rho', 'midpoint_binomial_Vanna',\n", - " 'midpoint_binomial_Volga'],\n", - " dtype='object')" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "calc_greeks_for_data(spot_sm, 'bs', 'bs_iv', '{x}')\n", - "calc_greeks_for_data(spot_sm, 'bs', 'midpoint_bs_iv', 'midpoint_{x}')\n", - "calc_greeks_for_data(spot_sm, 'bs', 'weighted_midpoint_bs_iv', 'weighted_midpoint_{x}')\n", - "\n", - "calc_greeks_for_data(spot_sm, 'binomial', 'bid_binomial_iv', 'bid_binomial_{x}')\n", - "calc_greeks_for_data(spot_sm, 'binomial', 'ask_binomial_iv', 'ask_binomial_{x}')\n", - "calc_greeks_for_data(spot_sm, 'binomial', 'binomial_iv', 'binomial_{x}')\n", - "calc_greeks_for_data(spot_sm, 'binomial', 'midpoint_binomial_iv', 'midpoint_binomial_{x}')\n", - "spot_sm.columns\n" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['dollar_delta',\n", - " 'midpoint_dollar_delta',\n", - " 'weighted_midpoint_dollar_delta',\n", - " 'last_updated',\n", - " 'midpoint_bs_vol_resolve',\n", - " 'midpoint_binomial_vol_resolve']" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "spot_sm\n", - "spot_sm.columns = spot_sm.columns.str.lower()\n", - "[x for x in columns if x not in spot_sm.columns]" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
openhighlowclosevolumebid_sizeclosebidask_sizecloseaskmidpointweighted_midpointopenintereststrikeexpirationput/callunderlier_pricerf_ratedividendoptiontickunderlierrf_rate_namedatetimebs_ivmidpoint_bs_ivweighted_midpoint_bs_ivbid_bs_ivask_bs_ivbinomial_ivmidpoint_binomial_ivweighted_midpoint_binomial_ivbid_binomial_ivask_binomial_ivdeltagammavegathetarhovannavolgamidpoint_deltamidpoint_gammamidpoint_vegamidpoint_thetamidpoint_rhomidpoint_vannamidpoint_volgaweighted_midpoint_deltaweighted_midpoint_gammaweighted_midpoint_vegaweighted_midpoint_thetaweighted_midpoint_rhoweighted_midpoint_vannaweighted_midpoint_volgabid_binomial_deltabid_binomial_gammabid_binomial_vegabid_binomial_thetabid_binomial_rhobid_binomial_vannabid_binomial_volgaask_binomial_deltaask_binomial_gammaask_binomial_vegaask_binomial_thetaask_binomial_rhoask_binomial_vannaask_binomial_volgabinomial_deltabinomial_gammabinomial_vegabinomial_thetabinomial_rhobinomial_vannabinomial_volgamidpoint_binomial_deltamidpoint_binomial_gammamidpoint_binomial_vegamidpoint_binomial_thetamidpoint_binomial_rhomidpoint_binomial_vannamidpoint_binomial_volgadollar_deltamidpoint_dollar_deltaweighted_midpoint_dollar_delta
Datetime
2023-02-035.355.355.355.3513564.601435.505.0504.857916126225.02024-09-20C154.5000000.045230.005890AAPL20240920C225AAPL^IRX2023-02-030.2575260.2522410.2488030.2441160.2601330.2563540.2510830.2476900.2431120.2589770.2143540.0057210.572577-0.0153090.4524980.926439143.2888410.2076620.0057330.562061-0.0147570.4405540.929907148.0884870.2032480.0057390.554956-0.0143960.4325830.931856151.2607670.1958350.0057440.542715-0.0137960.4190310.934479156.5917310.2161720.0057160.575381-0.0154600.4557130.925396141.9884260.2128800.0057240.570287-0.0151870.4498820.927254144.3445260.2061800.0057360.559691-0.0146360.4378870.930592149.15277233.11771332.08374731.401856
2023-02-064.954.954.854.8561264.651595.004.8254.845263126225.02024-09-20C151.7299960.045330.004548AAPL20240920C225AAPL^IRX2023-02-060.2583610.2578980.2582730.2546380.2611190.2576150.2571700.2575310.2540490.2602800.2010970.0056110.540696-0.0146160.4160970.903942145.3526540.2005140.0056120.539757-0.0145680.4150700.904100145.7418150.2009860.0056120.540518-0.0146070.4159030.903972145.4263000.1956350.0056130.531800-0.0141640.4064230.905231148.9986850.2035060.0056100.544554-0.0148170.4203290.903234143.7432260.2001570.0056120.539180-0.0145380.4144400.904195145.9804080.1995950.0056120.538271-0.0144910.4134480.904340146.35553130.51240630.42400130.495677
2023-02-075.055.055.055.0511355.201405.805.5005.505455127225.02024-09-20C154.6499940.045700.004462AAPL20240920C225AAPL^IRX2023-02-070.2510480.2589270.2590220.2536990.2640680.2501100.2579930.2580890.2527460.2632100.2087620.0057980.563006-0.0149840.4408500.935349148.2077530.2187420.0057760.578500-0.0158180.4585260.929665141.0194700.2188600.0057760.578679-0.0158280.4587320.929590140.9349290.2109340.0057940.566435-0.0151640.4447290.934224146.6397970.2240600.0057600.586482-0.0162670.4677840.926128137.2128170.2075560.0058000.561088-0.0148840.4386890.935946149.0787860.2175730.0057790.576719-0.0157190.4564740.930397141.85932432.28505333.82850833.846727
2023-02-080.000.000.000.0004324.504785.555.0255.051538126225.02024-09-20C151.9199980.045850.004542AAPL20240920C225AAPL^IRX2023-02-080.0000000.2610040.2614880.2512430.2704340.0000000.2601360.2606070.2507630.2694090.0000000.0000000.0000000.0000000.0000000.0000000.0000000.2054690.0056290.547433-0.0150210.4232040.904255142.6351350.2060730.0056280.548385-0.0150720.4242570.904043142.2302710.1924910.0056330.526359-0.0139430.4002670.907552151.3286390.2158300.0056120.563432-0.0158960.4410690.899940135.6990050.0000000.0000000.0000000.0000000.0000000.0000000.0000000.2043830.0056300.545714-0.0149300.4213090.904625143.3630720.00000031.21480531.306554
2023-02-095.505.505.505.5011294.203905.805.0005.402312126225.02024-09-20C150.8699950.046130.004573AAPL20240920C225AAPL^IRX2023-02-090.2736780.2645830.2719220.2493650.2790070.2726610.2637890.2709350.2494030.2779440.2150900.0055570.557953-0.0159740.4347350.888870133.4175050.2039930.0055720.540869-0.0150310.4158160.892904140.6394490.2129720.0055610.554754-0.0157920.4311590.889761134.7943840.1848210.0055670.509370-0.0134370.3820730.895742153.0826310.2201950.0055460.565537-0.0164120.4432800.886503130.1068190.2138650.0055590.556107-0.0158690.4326690.889392134.2135710.2030100.0055730.539316-0.0149480.4141180.893182141.27977732.45068230.77645532.131044
2023-02-100.000.000.000.0001044.801045.405.1005.100000127225.02024-09-20C151.0099950.046350.006092AAPL20240920C225AAPL^IRX2023-02-100.0000000.2674030.2674030.2618240.2728740.0000000.2662750.2662750.2608900.2716250.0000000.0000000.0000000.0000000.0000000.0000000.0000000.2056150.0055330.542922-0.0151330.4178960.887282138.4914270.2056150.0055330.542922-0.0151330.4178960.887282138.4914270.1975730.0055380.530137-0.0144590.4039880.889342143.7038550.2107490.0055270.550855-0.0155680.4266510.885507135.1641380.0000000.0000000.0000000.0000000.0000000.0000000.0000000.2042320.0055350.540755-0.0150170.4155220.887700139.3877800.00000031.04986331.049863
\n", - "
" - ], - "text/plain": [ - " open high low close volume bid_size closebid ask_size \\\n", - "Datetime \n", - "2023-02-03 5.35 5.35 5.35 5.35 1 356 4.60 143 \n", - "2023-02-06 4.95 4.95 4.85 4.85 6 126 4.65 159 \n", - "2023-02-07 5.05 5.05 5.05 5.05 1 135 5.20 140 \n", - "2023-02-08 0.00 0.00 0.00 0.00 0 432 4.50 478 \n", - "2023-02-09 5.50 5.50 5.50 5.50 1 129 4.20 390 \n", - "2023-02-10 0.00 0.00 0.00 0.00 0 104 4.80 104 \n", - "\n", - " closeask midpoint weighted_midpoint openinterest strike \\\n", - "Datetime \n", - "2023-02-03 5.50 5.050 4.857916 126 225.0 \n", - "2023-02-06 5.00 4.825 4.845263 126 225.0 \n", - "2023-02-07 5.80 5.500 5.505455 127 225.0 \n", - "2023-02-08 5.55 5.025 5.051538 126 225.0 \n", - "2023-02-09 5.80 5.000 5.402312 126 225.0 \n", - "2023-02-10 5.40 5.100 5.100000 127 225.0 \n", - "\n", - " expiration put/call underlier_price rf_rate dividend \\\n", - "Datetime \n", - "2023-02-03 2024-09-20 C 154.500000 0.04523 0.005890 \n", - "2023-02-06 2024-09-20 C 151.729996 0.04533 0.004548 \n", - "2023-02-07 2024-09-20 C 154.649994 0.04570 0.004462 \n", - "2023-02-08 2024-09-20 C 151.919998 0.04585 0.004542 \n", - "2023-02-09 2024-09-20 C 150.869995 0.04613 0.004573 \n", - "2023-02-10 2024-09-20 C 151.009995 0.04635 0.006092 \n", - "\n", - " optiontick underlier rf_rate_name datetime bs_iv \\\n", - "Datetime \n", - "2023-02-03 AAPL20240920C225 AAPL ^IRX 2023-02-03 0.257526 \n", - "2023-02-06 AAPL20240920C225 AAPL ^IRX 2023-02-06 0.258361 \n", - "2023-02-07 AAPL20240920C225 AAPL ^IRX 2023-02-07 0.251048 \n", - "2023-02-08 AAPL20240920C225 AAPL ^IRX 2023-02-08 0.000000 \n", - "2023-02-09 AAPL20240920C225 AAPL ^IRX 2023-02-09 0.273678 \n", - "2023-02-10 AAPL20240920C225 AAPL ^IRX 2023-02-10 0.000000 \n", - "\n", - " midpoint_bs_iv weighted_midpoint_bs_iv bid_bs_iv ask_bs_iv \\\n", - "Datetime \n", - "2023-02-03 0.252241 0.248803 0.244116 0.260133 \n", - "2023-02-06 0.257898 0.258273 0.254638 0.261119 \n", - "2023-02-07 0.258927 0.259022 0.253699 0.264068 \n", - "2023-02-08 0.261004 0.261488 0.251243 0.270434 \n", - "2023-02-09 0.264583 0.271922 0.249365 0.279007 \n", - "2023-02-10 0.267403 0.267403 0.261824 0.272874 \n", - "\n", - " binomial_iv midpoint_binomial_iv weighted_midpoint_binomial_iv \\\n", - "Datetime \n", - "2023-02-03 0.256354 0.251083 0.247690 \n", - "2023-02-06 0.257615 0.257170 0.257531 \n", - "2023-02-07 0.250110 0.257993 0.258089 \n", - "2023-02-08 0.000000 0.260136 0.260607 \n", - "2023-02-09 0.272661 0.263789 0.270935 \n", - "2023-02-10 0.000000 0.266275 0.266275 \n", - "\n", - " bid_binomial_iv ask_binomial_iv delta gamma vega \\\n", - "Datetime \n", - "2023-02-03 0.243112 0.258977 0.214354 0.005721 0.572577 \n", - "2023-02-06 0.254049 0.260280 0.201097 0.005611 0.540696 \n", - "2023-02-07 0.252746 0.263210 0.208762 0.005798 0.563006 \n", - "2023-02-08 0.250763 0.269409 0.000000 0.000000 0.000000 \n", - "2023-02-09 0.249403 0.277944 0.215090 0.005557 0.557953 \n", - "2023-02-10 0.260890 0.271625 0.000000 0.000000 0.000000 \n", - "\n", - " theta rho vanna volga midpoint_delta \\\n", - "Datetime \n", - "2023-02-03 -0.015309 0.452498 0.926439 143.288841 0.207662 \n", - "2023-02-06 -0.014616 0.416097 0.903942 145.352654 0.200514 \n", - "2023-02-07 -0.014984 0.440850 0.935349 148.207753 0.218742 \n", - "2023-02-08 0.000000 0.000000 0.000000 0.000000 0.205469 \n", - "2023-02-09 -0.015974 0.434735 0.888870 133.417505 0.203993 \n", - "2023-02-10 0.000000 0.000000 0.000000 0.000000 0.205615 \n", - "\n", - " midpoint_gamma midpoint_vega midpoint_theta midpoint_rho \\\n", - "Datetime \n", - "2023-02-03 0.005733 0.562061 -0.014757 0.440554 \n", - "2023-02-06 0.005612 0.539757 -0.014568 0.415070 \n", - "2023-02-07 0.005776 0.578500 -0.015818 0.458526 \n", - "2023-02-08 0.005629 0.547433 -0.015021 0.423204 \n", - "2023-02-09 0.005572 0.540869 -0.015031 0.415816 \n", - "2023-02-10 0.005533 0.542922 -0.015133 0.417896 \n", - "\n", - " midpoint_vanna midpoint_volga weighted_midpoint_delta \\\n", - "Datetime \n", - "2023-02-03 0.929907 148.088487 0.203248 \n", - "2023-02-06 0.904100 145.741815 0.200986 \n", - "2023-02-07 0.929665 141.019470 0.218860 \n", - "2023-02-08 0.904255 142.635135 0.206073 \n", - "2023-02-09 0.892904 140.639449 0.212972 \n", - "2023-02-10 0.887282 138.491427 0.205615 \n", - "\n", - " weighted_midpoint_gamma weighted_midpoint_vega \\\n", - "Datetime \n", - "2023-02-03 0.005739 0.554956 \n", - "2023-02-06 0.005612 0.540518 \n", - "2023-02-07 0.005776 0.578679 \n", - "2023-02-08 0.005628 0.548385 \n", - "2023-02-09 0.005561 0.554754 \n", - "2023-02-10 0.005533 0.542922 \n", - "\n", - " weighted_midpoint_theta weighted_midpoint_rho \\\n", - "Datetime \n", - "2023-02-03 -0.014396 0.432583 \n", - "2023-02-06 -0.014607 0.415903 \n", - "2023-02-07 -0.015828 0.458732 \n", - "2023-02-08 -0.015072 0.424257 \n", - "2023-02-09 -0.015792 0.431159 \n", - "2023-02-10 -0.015133 0.417896 \n", - "\n", - " weighted_midpoint_vanna weighted_midpoint_volga \\\n", - "Datetime \n", - "2023-02-03 0.931856 151.260767 \n", - "2023-02-06 0.903972 145.426300 \n", - "2023-02-07 0.929590 140.934929 \n", - "2023-02-08 0.904043 142.230271 \n", - "2023-02-09 0.889761 134.794384 \n", - "2023-02-10 0.887282 138.491427 \n", - "\n", - " bid_binomial_delta bid_binomial_gamma bid_binomial_vega \\\n", - "Datetime \n", - "2023-02-03 0.195835 0.005744 0.542715 \n", - "2023-02-06 0.195635 0.005613 0.531800 \n", - "2023-02-07 0.210934 0.005794 0.566435 \n", - "2023-02-08 0.192491 0.005633 0.526359 \n", - "2023-02-09 0.184821 0.005567 0.509370 \n", - "2023-02-10 0.197573 0.005538 0.530137 \n", - "\n", - " bid_binomial_theta bid_binomial_rho bid_binomial_vanna \\\n", - "Datetime \n", - "2023-02-03 -0.013796 0.419031 0.934479 \n", - "2023-02-06 -0.014164 0.406423 0.905231 \n", - "2023-02-07 -0.015164 0.444729 0.934224 \n", - "2023-02-08 -0.013943 0.400267 0.907552 \n", - "2023-02-09 -0.013437 0.382073 0.895742 \n", - "2023-02-10 -0.014459 0.403988 0.889342 \n", - "\n", - " bid_binomial_volga ask_binomial_delta ask_binomial_gamma \\\n", - "Datetime \n", - "2023-02-03 156.591731 0.216172 0.005716 \n", - "2023-02-06 148.998685 0.203506 0.005610 \n", - "2023-02-07 146.639797 0.224060 0.005760 \n", - "2023-02-08 151.328639 0.215830 0.005612 \n", - "2023-02-09 153.082631 0.220195 0.005546 \n", - "2023-02-10 143.703855 0.210749 0.005527 \n", - "\n", - " ask_binomial_vega ask_binomial_theta ask_binomial_rho \\\n", - "Datetime \n", - "2023-02-03 0.575381 -0.015460 0.455713 \n", - "2023-02-06 0.544554 -0.014817 0.420329 \n", - "2023-02-07 0.586482 -0.016267 0.467784 \n", - "2023-02-08 0.563432 -0.015896 0.441069 \n", - "2023-02-09 0.565537 -0.016412 0.443280 \n", - "2023-02-10 0.550855 -0.015568 0.426651 \n", - "\n", - " ask_binomial_vanna ask_binomial_volga binomial_delta \\\n", - "Datetime \n", - "2023-02-03 0.925396 141.988426 0.212880 \n", - "2023-02-06 0.903234 143.743226 0.200157 \n", - "2023-02-07 0.926128 137.212817 0.207556 \n", - "2023-02-08 0.899940 135.699005 0.000000 \n", - "2023-02-09 0.886503 130.106819 0.213865 \n", - "2023-02-10 0.885507 135.164138 0.000000 \n", - "\n", - " binomial_gamma binomial_vega binomial_theta binomial_rho \\\n", - "Datetime \n", - "2023-02-03 0.005724 0.570287 -0.015187 0.449882 \n", - "2023-02-06 0.005612 0.539180 -0.014538 0.414440 \n", - "2023-02-07 0.005800 0.561088 -0.014884 0.438689 \n", - "2023-02-08 0.000000 0.000000 0.000000 0.000000 \n", - "2023-02-09 0.005559 0.556107 -0.015869 0.432669 \n", - "2023-02-10 0.000000 0.000000 0.000000 0.000000 \n", - "\n", - " binomial_vanna binomial_volga midpoint_binomial_delta \\\n", - "Datetime \n", - "2023-02-03 0.927254 144.344526 0.206180 \n", - "2023-02-06 0.904195 145.980408 0.199595 \n", - "2023-02-07 0.935946 149.078786 0.217573 \n", - "2023-02-08 0.000000 0.000000 0.204383 \n", - "2023-02-09 0.889392 134.213571 0.203010 \n", - "2023-02-10 0.000000 0.000000 0.204232 \n", - "\n", - " midpoint_binomial_gamma midpoint_binomial_vega \\\n", - "Datetime \n", - "2023-02-03 0.005736 0.559691 \n", - "2023-02-06 0.005612 0.538271 \n", - "2023-02-07 0.005779 0.576719 \n", - "2023-02-08 0.005630 0.545714 \n", - "2023-02-09 0.005573 0.539316 \n", - "2023-02-10 0.005535 0.540755 \n", - "\n", - " midpoint_binomial_theta midpoint_binomial_rho \\\n", - "Datetime \n", - "2023-02-03 -0.014636 0.437887 \n", - "2023-02-06 -0.014491 0.413448 \n", - "2023-02-07 -0.015719 0.456474 \n", - "2023-02-08 -0.014930 0.421309 \n", - "2023-02-09 -0.014948 0.414118 \n", - "2023-02-10 -0.015017 0.415522 \n", - "\n", - " midpoint_binomial_vanna midpoint_binomial_volga dollar_delta \\\n", - "Datetime \n", - "2023-02-03 0.930592 149.152772 33.117713 \n", - "2023-02-06 0.904340 146.355531 30.512406 \n", - "2023-02-07 0.930397 141.859324 32.285053 \n", - "2023-02-08 0.904625 143.363072 0.000000 \n", - "2023-02-09 0.893182 141.279777 32.450682 \n", - "2023-02-10 0.887700 139.387780 0.000000 \n", - "\n", - " midpoint_dollar_delta weighted_midpoint_dollar_delta \n", - "Datetime \n", - "2023-02-03 32.083747 31.401856 \n", - "2023-02-06 30.424001 30.495677 \n", - "2023-02-07 33.828508 33.846727 \n", - "2023-02-08 31.214805 31.306554 \n", - "2023-02-09 30.776455 32.131044 \n", - "2023-02-10 31.049863 31.049863 " - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "calc_dollar_delta_from_data(spot_sm, 'delta', 'dollar_delta')\n", - "calc_dollar_delta_from_data(spot_sm, 'midpoint_delta', 'midpoint_dollar_delta')\n", - "calc_dollar_delta_from_data(spot_sm, 'weighted_midpoint_delta', 'weighted_midpoint_dollar_delta')" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['last_updated', 'midpoint_bs_vol_resolve', 'midpoint_binomial_vol_resolve']" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "spot_sm\n", - "spot_sm.columns = spot_sm.columns.str.lower()\n", - "[x for x in columns if x not in spot_sm.columns]" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "spot_sm['last_updated'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Vol Resolve & Last Updated" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['midpoint_bs_vol_resolve', 'midpoint_binomial_vol_resolve']" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "[x for x in columns if x not in spot_sm.columns]" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
openhighlowclosevolumebid_sizeclosebidask_sizecloseaskmidpointweighted_midpointopenintereststrikeexpirationput/callunderlier_pricerf_ratedividendoptiontickunderlierrf_rate_namedatetimebs_ivmidpoint_bs_ivweighted_midpoint_bs_ivbid_bs_ivask_bs_ivbinomial_ivmidpoint_binomial_ivweighted_midpoint_binomial_ivbid_binomial_ivask_binomial_ivdeltagammavegathetarhovannavolgamidpoint_deltamidpoint_gammamidpoint_vegamidpoint_thetamidpoint_rhomidpoint_vannamidpoint_volgaweighted_midpoint_deltaweighted_midpoint_gammaweighted_midpoint_vegaweighted_midpoint_thetaweighted_midpoint_rhoweighted_midpoint_vannaweighted_midpoint_volgabid_binomial_deltabid_binomial_gammabid_binomial_vegabid_binomial_thetabid_binomial_rhobid_binomial_vannabid_binomial_volgaask_binomial_deltaask_binomial_gammaask_binomial_vegaask_binomial_thetaask_binomial_rhoask_binomial_vannaask_binomial_volgabinomial_deltabinomial_gammabinomial_vegabinomial_thetabinomial_rhobinomial_vannabinomial_volgamidpoint_binomial_deltamidpoint_binomial_gammamidpoint_binomial_vegamidpoint_binomial_thetamidpoint_binomial_rhomidpoint_binomial_vannamidpoint_binomial_volgadollar_deltamidpoint_dollar_deltaweighted_midpoint_dollar_deltalast_updated
Datetime
2023-02-035.355.355.355.3513564.601435.505.0504.857916126225.02024-09-20C154.5000000.045230.005890AAPL20240920C225AAPL^IRX2023-02-030.2575260.2522410.2488030.2441160.2601330.2563540.2510830.2476900.2431120.2589770.2143540.0057210.572577-0.0153090.4524980.926439143.2888410.2076620.0057330.562061-0.0147570.4405540.929907148.0884870.2032480.0057390.554956-0.0143960.4325830.931856151.2607670.1958350.0057440.542715-0.0137960.4190310.934479156.5917310.2161720.0057160.575381-0.0154600.4557130.925396141.9884260.2128800.0057240.570287-0.0151870.4498820.927254144.3445260.2061800.0057360.559691-0.0146360.4378870.930592149.15277233.11771332.08374731.4018562025-04-11 20:10:06
2023-02-064.954.954.854.8561264.651595.004.8254.845263126225.02024-09-20C151.7299960.045330.004548AAPL20240920C225AAPL^IRX2023-02-060.2583610.2578980.2582730.2546380.2611190.2576150.2571700.2575310.2540490.2602800.2010970.0056110.540696-0.0146160.4160970.903942145.3526540.2005140.0056120.539757-0.0145680.4150700.904100145.7418150.2009860.0056120.540518-0.0146070.4159030.903972145.4263000.1956350.0056130.531800-0.0141640.4064230.905231148.9986850.2035060.0056100.544554-0.0148170.4203290.903234143.7432260.2001570.0056120.539180-0.0145380.4144400.904195145.9804080.1995950.0056120.538271-0.0144910.4134480.904340146.35553130.51240630.42400130.4956772025-04-11 20:10:06
2023-02-075.055.055.055.0511355.201405.805.5005.505455127225.02024-09-20C154.6499940.045700.004462AAPL20240920C225AAPL^IRX2023-02-070.2510480.2589270.2590220.2536990.2640680.2501100.2579930.2580890.2527460.2632100.2087620.0057980.563006-0.0149840.4408500.935349148.2077530.2187420.0057760.578500-0.0158180.4585260.929665141.0194700.2188600.0057760.578679-0.0158280.4587320.929590140.9349290.2109340.0057940.566435-0.0151640.4447290.934224146.6397970.2240600.0057600.586482-0.0162670.4677840.926128137.2128170.2075560.0058000.561088-0.0148840.4386890.935946149.0787860.2175730.0057790.576719-0.0157190.4564740.930397141.85932432.28505333.82850833.8467272025-04-11 20:10:06
2023-02-080.000.000.000.0004324.504785.555.0255.051538126225.02024-09-20C151.9199980.045850.004542AAPL20240920C225AAPL^IRX2023-02-080.0000000.2610040.2614880.2512430.2704340.0000000.2601360.2606070.2507630.2694090.0000000.0000000.0000000.0000000.0000000.0000000.0000000.2054690.0056290.547433-0.0150210.4232040.904255142.6351350.2060730.0056280.548385-0.0150720.4242570.904043142.2302710.1924910.0056330.526359-0.0139430.4002670.907552151.3286390.2158300.0056120.563432-0.0158960.4410690.899940135.6990050.0000000.0000000.0000000.0000000.0000000.0000000.0000000.2043830.0056300.545714-0.0149300.4213090.904625143.3630720.00000031.21480531.3065542025-04-11 20:10:06
2023-02-095.505.505.505.5011294.203905.805.0005.402312126225.02024-09-20C150.8699950.046130.004573AAPL20240920C225AAPL^IRX2023-02-090.2736780.2645830.2719220.2493650.2790070.2726610.2637890.2709350.2494030.2779440.2150900.0055570.557953-0.0159740.4347350.888870133.4175050.2039930.0055720.540869-0.0150310.4158160.892904140.6394490.2129720.0055610.554754-0.0157920.4311590.889761134.7943840.1848210.0055670.509370-0.0134370.3820730.895742153.0826310.2201950.0055460.565537-0.0164120.4432800.886503130.1068190.2138650.0055590.556107-0.0158690.4326690.889392134.2135710.2030100.0055730.539316-0.0149480.4141180.893182141.27977732.45068230.77645532.1310442025-04-11 20:10:06
2023-02-100.000.000.000.0001044.801045.405.1005.100000127225.02024-09-20C151.0099950.046350.006092AAPL20240920C225AAPL^IRX2023-02-100.0000000.2674030.2674030.2618240.2728740.0000000.2662750.2662750.2608900.2716250.0000000.0000000.0000000.0000000.0000000.0000000.0000000.2056150.0055330.542922-0.0151330.4178960.887282138.4914270.2056150.0055330.542922-0.0151330.4178960.887282138.4914270.1975730.0055380.530137-0.0144590.4039880.889342143.7038550.2107490.0055270.550855-0.0155680.4266510.885507135.1641380.0000000.0000000.0000000.0000000.0000000.0000000.0000000.2042320.0055350.540755-0.0150170.4155220.887700139.3877800.00000031.04986331.0498632025-04-11 20:10:06
\n", - "
" - ], - "text/plain": [ - " open high low close volume bid_size closebid ask_size \\\n", - "Datetime \n", - "2023-02-03 5.35 5.35 5.35 5.35 1 356 4.60 143 \n", - "2023-02-06 4.95 4.95 4.85 4.85 6 126 4.65 159 \n", - "2023-02-07 5.05 5.05 5.05 5.05 1 135 5.20 140 \n", - "2023-02-08 0.00 0.00 0.00 0.00 0 432 4.50 478 \n", - "2023-02-09 5.50 5.50 5.50 5.50 1 129 4.20 390 \n", - "2023-02-10 0.00 0.00 0.00 0.00 0 104 4.80 104 \n", - "\n", - " closeask midpoint weighted_midpoint openinterest strike \\\n", - "Datetime \n", - "2023-02-03 5.50 5.050 4.857916 126 225.0 \n", - "2023-02-06 5.00 4.825 4.845263 126 225.0 \n", - "2023-02-07 5.80 5.500 5.505455 127 225.0 \n", - "2023-02-08 5.55 5.025 5.051538 126 225.0 \n", - "2023-02-09 5.80 5.000 5.402312 126 225.0 \n", - "2023-02-10 5.40 5.100 5.100000 127 225.0 \n", - "\n", - " expiration put/call underlier_price rf_rate dividend \\\n", - "Datetime \n", - "2023-02-03 2024-09-20 C 154.500000 0.04523 0.005890 \n", - "2023-02-06 2024-09-20 C 151.729996 0.04533 0.004548 \n", - "2023-02-07 2024-09-20 C 154.649994 0.04570 0.004462 \n", - "2023-02-08 2024-09-20 C 151.919998 0.04585 0.004542 \n", - "2023-02-09 2024-09-20 C 150.869995 0.04613 0.004573 \n", - "2023-02-10 2024-09-20 C 151.009995 0.04635 0.006092 \n", - "\n", - " optiontick underlier rf_rate_name datetime bs_iv \\\n", - "Datetime \n", - "2023-02-03 AAPL20240920C225 AAPL ^IRX 2023-02-03 0.257526 \n", - "2023-02-06 AAPL20240920C225 AAPL ^IRX 2023-02-06 0.258361 \n", - "2023-02-07 AAPL20240920C225 AAPL ^IRX 2023-02-07 0.251048 \n", - "2023-02-08 AAPL20240920C225 AAPL ^IRX 2023-02-08 0.000000 \n", - "2023-02-09 AAPL20240920C225 AAPL ^IRX 2023-02-09 0.273678 \n", - "2023-02-10 AAPL20240920C225 AAPL ^IRX 2023-02-10 0.000000 \n", - "\n", - " midpoint_bs_iv weighted_midpoint_bs_iv bid_bs_iv ask_bs_iv \\\n", - "Datetime \n", - "2023-02-03 0.252241 0.248803 0.244116 0.260133 \n", - "2023-02-06 0.257898 0.258273 0.254638 0.261119 \n", - "2023-02-07 0.258927 0.259022 0.253699 0.264068 \n", - "2023-02-08 0.261004 0.261488 0.251243 0.270434 \n", - "2023-02-09 0.264583 0.271922 0.249365 0.279007 \n", - "2023-02-10 0.267403 0.267403 0.261824 0.272874 \n", - "\n", - " binomial_iv midpoint_binomial_iv weighted_midpoint_binomial_iv \\\n", - "Datetime \n", - "2023-02-03 0.256354 0.251083 0.247690 \n", - "2023-02-06 0.257615 0.257170 0.257531 \n", - "2023-02-07 0.250110 0.257993 0.258089 \n", - "2023-02-08 0.000000 0.260136 0.260607 \n", - "2023-02-09 0.272661 0.263789 0.270935 \n", - "2023-02-10 0.000000 0.266275 0.266275 \n", - "\n", - " bid_binomial_iv ask_binomial_iv delta gamma vega \\\n", - "Datetime \n", - "2023-02-03 0.243112 0.258977 0.214354 0.005721 0.572577 \n", - "2023-02-06 0.254049 0.260280 0.201097 0.005611 0.540696 \n", - "2023-02-07 0.252746 0.263210 0.208762 0.005798 0.563006 \n", - "2023-02-08 0.250763 0.269409 0.000000 0.000000 0.000000 \n", - "2023-02-09 0.249403 0.277944 0.215090 0.005557 0.557953 \n", - "2023-02-10 0.260890 0.271625 0.000000 0.000000 0.000000 \n", - "\n", - " theta rho vanna volga midpoint_delta \\\n", - "Datetime \n", - "2023-02-03 -0.015309 0.452498 0.926439 143.288841 0.207662 \n", - "2023-02-06 -0.014616 0.416097 0.903942 145.352654 0.200514 \n", - "2023-02-07 -0.014984 0.440850 0.935349 148.207753 0.218742 \n", - "2023-02-08 0.000000 0.000000 0.000000 0.000000 0.205469 \n", - "2023-02-09 -0.015974 0.434735 0.888870 133.417505 0.203993 \n", - "2023-02-10 0.000000 0.000000 0.000000 0.000000 0.205615 \n", - "\n", - " midpoint_gamma midpoint_vega midpoint_theta midpoint_rho \\\n", - "Datetime \n", - "2023-02-03 0.005733 0.562061 -0.014757 0.440554 \n", - "2023-02-06 0.005612 0.539757 -0.014568 0.415070 \n", - "2023-02-07 0.005776 0.578500 -0.015818 0.458526 \n", - "2023-02-08 0.005629 0.547433 -0.015021 0.423204 \n", - "2023-02-09 0.005572 0.540869 -0.015031 0.415816 \n", - "2023-02-10 0.005533 0.542922 -0.015133 0.417896 \n", - "\n", - " midpoint_vanna midpoint_volga weighted_midpoint_delta \\\n", - "Datetime \n", - "2023-02-03 0.929907 148.088487 0.203248 \n", - "2023-02-06 0.904100 145.741815 0.200986 \n", - "2023-02-07 0.929665 141.019470 0.218860 \n", - "2023-02-08 0.904255 142.635135 0.206073 \n", - "2023-02-09 0.892904 140.639449 0.212972 \n", - "2023-02-10 0.887282 138.491427 0.205615 \n", - "\n", - " weighted_midpoint_gamma weighted_midpoint_vega \\\n", - "Datetime \n", - "2023-02-03 0.005739 0.554956 \n", - "2023-02-06 0.005612 0.540518 \n", - "2023-02-07 0.005776 0.578679 \n", - "2023-02-08 0.005628 0.548385 \n", - "2023-02-09 0.005561 0.554754 \n", - "2023-02-10 0.005533 0.542922 \n", - "\n", - " weighted_midpoint_theta weighted_midpoint_rho \\\n", - "Datetime \n", - "2023-02-03 -0.014396 0.432583 \n", - "2023-02-06 -0.014607 0.415903 \n", - "2023-02-07 -0.015828 0.458732 \n", - "2023-02-08 -0.015072 0.424257 \n", - "2023-02-09 -0.015792 0.431159 \n", - "2023-02-10 -0.015133 0.417896 \n", - "\n", - " weighted_midpoint_vanna weighted_midpoint_volga \\\n", - "Datetime \n", - "2023-02-03 0.931856 151.260767 \n", - "2023-02-06 0.903972 145.426300 \n", - "2023-02-07 0.929590 140.934929 \n", - "2023-02-08 0.904043 142.230271 \n", - "2023-02-09 0.889761 134.794384 \n", - "2023-02-10 0.887282 138.491427 \n", - "\n", - " bid_binomial_delta bid_binomial_gamma bid_binomial_vega \\\n", - "Datetime \n", - "2023-02-03 0.195835 0.005744 0.542715 \n", - "2023-02-06 0.195635 0.005613 0.531800 \n", - "2023-02-07 0.210934 0.005794 0.566435 \n", - "2023-02-08 0.192491 0.005633 0.526359 \n", - "2023-02-09 0.184821 0.005567 0.509370 \n", - "2023-02-10 0.197573 0.005538 0.530137 \n", - "\n", - " bid_binomial_theta bid_binomial_rho bid_binomial_vanna \\\n", - "Datetime \n", - "2023-02-03 -0.013796 0.419031 0.934479 \n", - "2023-02-06 -0.014164 0.406423 0.905231 \n", - "2023-02-07 -0.015164 0.444729 0.934224 \n", - "2023-02-08 -0.013943 0.400267 0.907552 \n", - "2023-02-09 -0.013437 0.382073 0.895742 \n", - "2023-02-10 -0.014459 0.403988 0.889342 \n", - "\n", - " bid_binomial_volga ask_binomial_delta ask_binomial_gamma \\\n", - "Datetime \n", - "2023-02-03 156.591731 0.216172 0.005716 \n", - "2023-02-06 148.998685 0.203506 0.005610 \n", - "2023-02-07 146.639797 0.224060 0.005760 \n", - "2023-02-08 151.328639 0.215830 0.005612 \n", - "2023-02-09 153.082631 0.220195 0.005546 \n", - "2023-02-10 143.703855 0.210749 0.005527 \n", - "\n", - " ask_binomial_vega ask_binomial_theta ask_binomial_rho \\\n", - "Datetime \n", - "2023-02-03 0.575381 -0.015460 0.455713 \n", - "2023-02-06 0.544554 -0.014817 0.420329 \n", - "2023-02-07 0.586482 -0.016267 0.467784 \n", - "2023-02-08 0.563432 -0.015896 0.441069 \n", - "2023-02-09 0.565537 -0.016412 0.443280 \n", - "2023-02-10 0.550855 -0.015568 0.426651 \n", - "\n", - " ask_binomial_vanna ask_binomial_volga binomial_delta \\\n", - "Datetime \n", - "2023-02-03 0.925396 141.988426 0.212880 \n", - "2023-02-06 0.903234 143.743226 0.200157 \n", - "2023-02-07 0.926128 137.212817 0.207556 \n", - "2023-02-08 0.899940 135.699005 0.000000 \n", - "2023-02-09 0.886503 130.106819 0.213865 \n", - "2023-02-10 0.885507 135.164138 0.000000 \n", - "\n", - " binomial_gamma binomial_vega binomial_theta binomial_rho \\\n", - "Datetime \n", - "2023-02-03 0.005724 0.570287 -0.015187 0.449882 \n", - "2023-02-06 0.005612 0.539180 -0.014538 0.414440 \n", - "2023-02-07 0.005800 0.561088 -0.014884 0.438689 \n", - "2023-02-08 0.000000 0.000000 0.000000 0.000000 \n", - "2023-02-09 0.005559 0.556107 -0.015869 0.432669 \n", - "2023-02-10 0.000000 0.000000 0.000000 0.000000 \n", - "\n", - " binomial_vanna binomial_volga midpoint_binomial_delta \\\n", - "Datetime \n", - "2023-02-03 0.927254 144.344526 0.206180 \n", - "2023-02-06 0.904195 145.980408 0.199595 \n", - "2023-02-07 0.935946 149.078786 0.217573 \n", - "2023-02-08 0.000000 0.000000 0.204383 \n", - "2023-02-09 0.889392 134.213571 0.203010 \n", - "2023-02-10 0.000000 0.000000 0.204232 \n", - "\n", - " midpoint_binomial_gamma midpoint_binomial_vega \\\n", - "Datetime \n", - "2023-02-03 0.005736 0.559691 \n", - "2023-02-06 0.005612 0.538271 \n", - "2023-02-07 0.005779 0.576719 \n", - "2023-02-08 0.005630 0.545714 \n", - "2023-02-09 0.005573 0.539316 \n", - "2023-02-10 0.005535 0.540755 \n", - "\n", - " midpoint_binomial_theta midpoint_binomial_rho \\\n", - "Datetime \n", - "2023-02-03 -0.014636 0.437887 \n", - "2023-02-06 -0.014491 0.413448 \n", - "2023-02-07 -0.015719 0.456474 \n", - "2023-02-08 -0.014930 0.421309 \n", - "2023-02-09 -0.014948 0.414118 \n", - "2023-02-10 -0.015017 0.415522 \n", - "\n", - " midpoint_binomial_vanna midpoint_binomial_volga dollar_delta \\\n", - "Datetime \n", - "2023-02-03 0.930592 149.152772 33.117713 \n", - "2023-02-06 0.904340 146.355531 30.512406 \n", - "2023-02-07 0.930397 141.859324 32.285053 \n", - "2023-02-08 0.904625 143.363072 0.000000 \n", - "2023-02-09 0.893182 141.279777 32.450682 \n", - "2023-02-10 0.887700 139.387780 0.000000 \n", - "\n", - " midpoint_dollar_delta weighted_midpoint_dollar_delta \\\n", - "Datetime \n", - "2023-02-03 32.083747 31.401856 \n", - "2023-02-06 30.424001 30.495677 \n", - "2023-02-07 33.828508 33.846727 \n", - "2023-02-08 31.214805 31.306554 \n", - "2023-02-09 30.776455 32.131044 \n", - "2023-02-10 31.049863 31.049863 \n", - "\n", - " last_updated \n", - "Datetime \n", - "2023-02-03 2025-04-11 20:10:06 \n", - "2023-02-06 2025-04-11 20:10:06 \n", - "2023-02-07 2025-04-11 20:10:06 \n", - "2023-02-08 2025-04-11 20:10:06 \n", - "2023-02-09 2025-04-11 20:10:06 \n", - "2023-02-10 2025-04-11 20:10:06 " - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "resolve_missing_vols_in_data(spot_sm, \n", - " [ 'midpoint_bs_iv', 'midpoint_binomial_iv'], \n", - " ['bs', 'binomial'],\n", - " ['midpoint', 'midpoint'])" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[]" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "spot_sm['midpoint_bs_vol_resolve'] = 0\n", - "spot_sm['midpoint_binomial_vol_resolve'] = 0\n", - "[x for x in columns if x not in spot_sm.columns]" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Rows inserted into temp_options_eod_new: 6\r" - ] - } - ], - "source": [ - "db.save_to_database(spot_sm, 'securities_master', 'temp_options_eod_new')\n" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Columns in Save Data not in Database\n", - "[]\n", - "Columns in Database not in Save Data\n", - "[]\n" - ] - } - ], - "source": [ - "columns\n", - "print(\"Columns in Save Data not in Database\")\n", - "print([x for x in spot_sm.columns if x not in columns])\n", - "\n", - "print(\"Columns in Database not in Save Data\")\n", - "print([x for x in columns if x not in spot_sm.columns])" - ] - }, - { - "cell_type": "code", - "execution_count": 53, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Running in non-blocking mode with 1 threads\n", - "Saving data to securities_master.temp_options_eod_new\n", - "Inputs: data_request: <__main__.OptionQueryRequestParameter object at 0x14144a250>, db: , manager: <__main__.OptionDataManager object at 0x14027fb50>\n" - ] - }, - { - "data": { - "text/plain": [ - ".result_iterator at 0x140fe3140>" - ] - }, - "execution_count": 53, - "metadata": {}, - "output_type": "execute_result" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2025-04-11 20:21:43 trade.models.VolSurface ERROR: Expiration date is the same as the datetime. Returning 0\n", - "2025-04-11 20:22:47 trade.models.VolSurface ERROR: Expiration date is the same as the datetime. Returning 0\n", - "Rows inserted into temp_options_eod_new: 3\r" - ] - } - ], - "source": [ - "runThreads(save_to_database, [[request_v2], [db],[manager]], block=False, thread_name_prefix='save_to_database')" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[0;31mSignature:\u001b[0m\n", - "\u001b[0mrunThreads\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mOrderedInputs\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mlist\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mrun_type\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'map'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mblock\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mthread_name_prefix\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m''\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mDocstring:\u001b[0m\n", - "Run multithreading on a given function.\n", - "\n", - "params:\n", - "--------\n", - "func: Function to run in multiple threads.\n", - "OrderedInputs: List of inputs to pass to the function. Example:\n", - " [[input1, input1, input1], [input2, input2, input2], [input3, input3, input3]]\n", - "\n", - "run_type: Type of multithreading execution. Default is 'map'.\n", - "block: Boolean flag to indicate if results should be returned. Default is True.\n", - " If False, the function will return a list of futures. \n", - " Note: Returning a list of futures is non blocking.\n", - "thread_name_prefix: Prefix for the thread names. Default is empty string.\n", - "\n", - "returns:\n", - "--------\n", - "List of results from the threading function.\n", - "\u001b[0;31mFile:\u001b[0m ~/cloned_repos/QuantTools/trade/helpers/threads.py\n", - "\u001b[0;31mType:\u001b[0m function" - ] - } - ], - "source": [ - "runThreads?" - ] - }, - { - "cell_type": "code", - "execution_count": 767, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[0;31mSignature:\u001b[0m\n", - "\u001b[0msave_to_database\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mdata_request\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0m__main__\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mOptionQueryRequestParameter\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mdb\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mdbase\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdatabase\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mSQLHelpers\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDatabaseAdapter\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mmanager\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0m__main__\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mOptionDataManager\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mDocstring:\u001b[0m Saves the data to the database\n", - "\u001b[0;31mFile:\u001b[0m /var/folders/j0/80hkbygd4lb27h9mw76gqzpw0000gn/T/ipykernel_53121/576773820.py\n", - "\u001b[0;31mType:\u001b[0m function" - ] - } - ], - "source": [ - "save_to_database?" - ] - }, - { - "cell_type": "code", - "execution_count": 755, - "metadata": {}, - "outputs": [], - "source": [ - "save_data = save_to_database(request_v2, db, manager)" - ] - }, - { - "cell_type": "code", - "execution_count": 762, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(253, 87)\n", - "(253, 87)\n", - "Rows inserted into temp_options_eod_new: 253\r" - ] - } - ], - "source": [ - "db.save_to_database(save_data, 'securities_master', 'temp_options_eod_new')\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## TO-DO\n", - "\n", - "- Implement IntraDay\n", - "- Implement Chain in timeseries.\n", - " - This will query database and get necessary data\n", - "- Implement OHLC Bulk\n", - " - With gendata & save data\n", - "- Implement Scenario & Attribution Database\n", - "- Binomial Model: Greeks & Vol queries\n", - "- Extra Columns input\n", - " - Use calc_vol_for_data to calculate extra columns\n", - "- Add vol resolve to vol manager\n", - "- Revisist SVI \n", - " - Using Binomial Vols\n", - " - Is it using Forward?d" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "from queue import Queue, Full" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(1, 2)" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "class SaveManager:\n", - "\n", - " ## Setting initial variables\n", - " MAX_QUEUE_SIZE = 100\n", - " WORKER_COUNT = 4\n", - " _queue = Queue(maxsize=MAX_QUEUE_SIZE)\n", - " _threads = []\n", - " _started = False\n", - "\n", - " @classmethod\n", - " def _worker(cls):\n", - " while True: ## Starts the forever loop\n", - " pack = cls._queue.get() ## Once the queue is empty, it will block until a new item is added\n", - " request, save_func = pack\n", - " if request is None:\n", - " break\n", - " try:\n", - " save_func(request) ## This is the task being being handled in the worker thread\n", - " except Exception as e:\n", - " logger.error(f\"[SaveWorker] Error processing save: {e}\")\n", - " finally:\n", - " cls._queue.task_done() ## Good practice to mark the task as done\n", - "\n", - " \n", - " @classmethod\n", - " def start_workers(cls):\n", - " \"\"\"\n", - " This class starts the worker threads for saving data to the database.\n", - " It is more or less a list of threads in a forever loop.\n", - " \"\"\"\n", - " if cls._started:\n", - " return\n", - " for _ in range(cls.WORKER_COUNT):\n", - " t = Thread(target=cls._worker, daemon=True) ## The _worker function will run in a separate thread. Looping forever\n", - " t.start()\n", - " cls._threads.append(t)\n", - " cls._started = True\n", - " logger.info(f\"[SaveManager] Started {cls.WORKER_COUNT} save workers.\")\n", - "\n", - " @classmethod\n", - " def enqueue(cls, data_request, save_func):\n", - " \"\"\"\n", - " Enqueue a save request to the queue.\n", - " \"\"\"\n", - " try:\n", - " print(f\"[SaveManager] Enqueueing save request for {data_request.symbol} on {data_request}\")\n", - " cls._queue.put((data_request, save_func), block=False) # Will raise Full if over limit\n", - " except Full:\n", - " logger.warning(f\"[SaveManager] Save queue full (max {cls.MAX_QUEUE_SIZE}). Task ignored.\")\n", - " \n", - " @classmethod\n", - " def status(cls):\n", - " return {\n", - " \"pending_tasks\": cls._queue.qsize(),\n", - " \"max_queue_size\": cls._queue.maxsize,\n", - " \"active_threads\": sum(t.is_alive() for t in cls._threads),\n", - " \"total_threads\": len(cls._threads),\n", - " }\n" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "from queue import Queue\n", - "\n", - "q = Queue()\n", - "\n", - "q.put(\"task\")\n", - "q.get()\n", - "q.task_done() #❌ missing\n", - "\n", - "q.join() # 🧨 will block forever!\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "openbb", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.10" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/module_test/raw_code/DataManagers/ipynb_tests/data_request_errors.ipynb b/module_test/raw_code/DataManagers/ipynb_tests/data_request_errors.ipynb deleted file mode 100644 index 871e235..0000000 --- a/module_test/raw_code/DataManagers/ipynb_tests/data_request_errors.ipynb +++ /dev/null @@ -1,2720 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Console Logging & File Logging Can be configured using STREAM_LOG_LEVEL and FILE_LOG_LEVEL in environment variables.\n", - "Propagate to root logger can be set using PROPAGATE_TO_ROOT_LOGGER in environment variables.\n", - "Example:\n", - "STREAM_LOG_LEVEL = 'DEBUG'\n", - "FILE_LOG_LEVEL = 'INFO'\n", - "PROPAGATE_TO_ROOT_LOGGER = 'False'\n", - "\n", - "2025-04-29 22:25:47 trade.helpers.Logging INFO: Logging Root Directory: /Users/chiemelienwanisobi/cloned_repos/QuantTools/logs\n", - "Using Proxy URL: http://18.232.166.224:5500/thetadata\n" - ] - } - ], - "source": [ - "\n", - "%load_ext autoreload\n", - "%autoreload 2\n", - "\n", - "from module_test.raw_code.DataManagers.DataManagers import (\n", - " BulkOptionQueryRequestParameter,\n", - " OptionQueryRequestParameter,\n", - " ChainDataRequest,\n", - " save_to_database,\n", - " save_chain_data,\n", - " _ManagerLazyLoader,\n", - " _SaveManager\n", - ")\n", - "import pandas as pd\n", - "from datetime import datetime\n", - "import os, json, sys\n", - "import numpy as np\n", - "from trade.helpers.Logging import setup_logger" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[ProcessSaveManager] Auto-setup completed.\n", - "[SaveManager] Enqueueing save request for AAPL on {'exp': '2025-09-19', 'right': 'C', 'strike': 13.0, 'start': '2024-10-23', 'end': '2025-04-27', 'tick': 'AAPL', 'type_': 'bulk', 'save_func': functools.partial(, pool=False), '_requests': }\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving to cache from db\n", - "Updating db rates data\n", - "Saving to cache from dbs_timeseries: 7\n", - "[ProcessSaveManager] Current requests: {'SaveWorker-0': }, inside lock\n", - "[ProcessSaveManager] Processing save request for AAPL on , thread SaveWorker-0\n", - "\n", - "Worker SaveWorker-0 got a request\n", - "Worker SaveWorker-0 got a request: \n", - "2025-04-29 21:27:54 trade.helpers.helper ERROR: Binomial Implied vol took too long to calculate for 228.02000427246094, 300.0, 0.04402999877929688, 71.975, 2025-09-19 00:00:00, p\n", - "2025-04-29 21:29:24 trade.helpers.helper ERROR: Binomial Implied vol took too long to calculate for 236.8699951171875, 300.0, 0.04228000164031982, 63.125, 2025-09-19 00:00:00, p\n", - "2025-04-29 21:48:12 trade.helpers.helper ERROR: Binomial Implied vol took too long to calculate for 222.63999938964844, 320.0, 0.04197000026702881, 97.375, 2025-09-19 00:00:00, p\n", - "2025-04-29 21:48:32 trade.helpers.helper ERROR: Binomial Implied vol took too long to calculate for 227.64999389648438, 320.0, 0.04228000164031982, 92.35, 2025-09-19 00:00:00, p\n" - ] - } - ], - "source": [ - "import json\n", - "with open('requests.jsonl', 'r') as f:\n", - " items = [json.loads(x) for x in f.readlines()]\n", - "\n", - "for item in items:\n", - " item['save_func'] = eval(item['save_func'])\n", - "\n", - "_SaveManager.enqueue(item)" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(3, [])" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# items = [1,2,3]\n", - "items.pop(0), items" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'exp': '2024-09-17',\n", - " 'start': '2024-09-17',\n", - " 'end': '2024-09-17',\n", - " 'tick': 'JPM',\n", - " 'save_func': ,\n", - " 'set_attributes': {'post_processed_data': build_date ticker expiration strike right bid_size \\\n", - " 0 2024-09-17 00:00:00 JPM 2024-10-18 00:00:00 220.0 P 42 \n", - " 1 2024-09-17 00:00:00 JPM 2024-10-18 00:00:00 220.0 C 10 \n", - " 2 2024-09-17 00:00:00 JPM 2024-10-25 00:00:00 220.0 P 22 \n", - " 3 2024-09-17 00:00:00 JPM 2024-10-25 00:00:00 220.0 C 7 \n", - " 4 2024-09-17 00:00:00 JPM 2024-11-01 00:00:00 220.0 C 40 \n", - " ... ... ... ... ... ... ... \n", - " 1721 2024-09-17 00:00:00 JPM 2025-03-21 00:00:00 215.0 P 10 \n", - " 1722 2024-09-17 00:00:00 JPM 2024-09-20 00:00:00 220.0 P 46 \n", - " 1723 2024-09-17 00:00:00 JPM 2024-09-20 00:00:00 220.0 C 96 \n", - " 1724 2024-09-17 00:00:00 JPM 2024-10-04 00:00:00 220.0 C 3 \n", - " 1725 2024-09-17 00:00:00 JPM 2024-10-04 00:00:00 220.0 P 46 \n", - " \n", - " closebid ask_size closeask price weighted_midpoint dte spot \\\n", - " 0 12.30 20 13.35 12.825 12.638710 31 209.25 \n", - " 1 2.12 1 2.15 2.135 2.122727 31 209.25 \n", - " 2 12.50 17 14.05 13.275 13.175641 38 209.25 \n", - " 3 2.39 1 2.64 2.515 2.421250 38 209.25 \n", - " 4 2.49 19 3.35 2.920 2.766949 45 209.25 \n", - " ... ... ... ... ... ... ... ... \n", - " 1721 15.35 14 15.65 15.500 15.525000 185 209.25 \n", - " 1722 9.30 41 11.50 10.400 10.336782 3 209.25 \n", - " 1723 0.09 1 0.10 0.095 0.090103 3 209.25 \n", - " 1724 0.71 5 0.75 0.730 0.735000 17 209.25 \n", - " 1725 10.85 62 13.15 12.000 12.170370 17 209.25 \n", - " \n", - " r q option_tick moneyness \n", - " 0 0.04745 0.021168 JPM20241018P220 0.951136 \n", - " 1 0.04745 0.021168 JPM20241018C220 0.951136 \n", - " 2 0.04745 0.021168 JPM20241025P220 0.951136 \n", - " 3 0.04745 0.021168 JPM20241025C220 0.951136 \n", - " 4 0.04745 0.021168 JPM20241101C220 0.951136 \n", - " ... ... ... ... ... \n", - " 1721 0.04745 0.021168 JPM20250321P215 0.973256 \n", - " 1722 0.04745 0.021168 JPM20240920P220 0.951136 \n", - " 1723 0.04745 0.021168 JPM20240920C220 0.951136 \n", - " 1724 0.04745 0.021168 JPM20241004C220 0.951136 \n", - " 1725 0.04745 0.021168 JPM20241004P220 0.951136 \n", - " \n", - " [1726 rows x 17 columns]},\n", - " 'type_': 'chain'}" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "item" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2025-04-29 20:01:19 INFO: Backing off send_request(...) for 0.8s (requests.exceptions.ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response')))\n", - "Saving to cache from db\n" - ] - }, - { - "data": { - "text/plain": [ - "{'pending_tasks': 0,\n", - " 'max_queue_size': 100,\n", - " 'active_processes': 4,\n", - " 'total_processes': 4,\n", - " 'current_requests': {'SaveWorker-0': },\n", - " 'num_finished_requests': 0,\n", - " 'num_failed_requests': 0,\n", - " 'failed_initialization': 0}" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "_SaveManager.status()" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - " None>" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "eval('save_to_database')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## SAVE OBJECTS AS DICT" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "objs = {\n", - " 'BulkOptionQueryRequestParameter': BulkOptionQueryRequestParameter,\n", - " 'OptionQueryRequestParameter': OptionQueryRequestParameter,\n", - " 'ChainDataRequest': ChainDataRequest,\n", - "}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## LOAD ERRORS" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "from queue import Queue\n", - "error_queue = Queue()" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "with open(f\"{os.environ['WORK_DIR']}/module_test/raw_code/DataManagers/failed_request.jsonl\", \"r\") as f:\n", - " for line in f:\n", - " error_queue.put(json.loads(line))" - ] - }, - { - "cell_type": "code", - "execution_count": 118, - "metadata": {}, - "outputs": [], - "source": [ - "request_info = error_queue.get(block=False)" - ] - }, - { - "cell_type": "code", - "execution_count": 119, - "metadata": {}, - "outputs": [ - { - "ename": "TypeError", - "evalue": "string indices must be integers, not 'str'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[119], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m error_queue\u001b[38;5;241m.\u001b[39mput(\u001b[43mrequest_info\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mclass_name\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m)\n", - "\u001b[0;31mTypeError\u001b[0m: string indices must be integers, not 'str'" - ] - } - ], - "source": [ - "request_info[\"class_name\"]" - ] - }, - { - "cell_type": "code", - "execution_count": 110, - "metadata": {}, - "outputs": [], - "source": [ - "request = objs[request_info['class_name']](**request_info)\n", - "\n", - "for key, value in request_info.items():\n", - " if key not in ['class_name', 'request_id']:\n", - " setattr(request, key, value)\n", - "\n", - "lazy_loader = _ManagerLazyLoader(request.symbol)\n", - "request.input_params = getattr(lazy_loader, request.agg)\n", - "lazy_loader.exp = request.exp" - ] - }, - { - "cell_type": "code", - "execution_count": 111, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "('cannot reshape array of size 0 into shape (0,newaxis)',\n", - " 'SBUX',\n", - " 'eod',\n", - " '2024-03-22 00:00:00')" - ] - }, - "execution_count": 111, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "request.error, request.symbol, request.agg, request.exp" - ] - }, - { - "cell_type": "code", - "execution_count": 71, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2025-04-24 00:06:22 trade.models.VolSurface ERROR: Expiration date is the same as the datetime. Returning 0\n", - "2025-04-24 00:06:30 trade.models.VolSurface ERROR: Expiration date is the same as the datetime. Returning 0\n", - "2025-04-24 00:06:52 trade.models.utils ERROR: AAPL20250321C40, 2024-09-25 could not fit SVI model. Returning zero\n", - "2025-04-24 00:09:29 trade.models.utils ERROR: AAPL20250321C40, 2025-01-30 could not fit SVI model. Returning zero\n", - "2025-04-24 00:10:50 trade.models.utils ERROR: AAPL20250321C40, 2025-03-17 has a poorly fitted model. Returning zero\n", - "2025-04-24 00:11:09 trade.models.VolSurface ERROR: Expiration date is the same as the datetime. Returning 0\n", - "2025-04-24 00:11:18 trade.models.VolSurface ERROR: Expiration date is the same as the datetime. Returning 0\n", - "2025-04-24 00:11:23 DataManager.py ERROR: \n", - "2025-04-24 00:11:23 DataManager.py ERROR: resolve_missing_vols_in_data raise an error: positional indexers are out-of-bounds\n", - "Traceback (most recent call last):\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py\", line 1714, in _get_list_axis\n", - " return self.obj._take_with_is_copy(key, axis=axis)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py\", line 4153, in _take_with_is_copy\n", - " result = self.take(indices=indices, axis=axis)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py\", line 4133, in take\n", - " new_data = self._mgr.take(\n", - " ^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py\", line 891, in take\n", - " indexer = maybe_convert_indices(indexer, n, verify=verify)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py\", line 282, in maybe_convert_indices\n", - " raise IndexError(\"indices are out-of-bounds\")\n", - "IndexError: indices are out-of-bounds\n", - "\n", - "The above exception was the direct cause of the following exception:\n", - "\n", - "Traceback (most recent call last):\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/decorators.py\", line 24, in wrapper\n", - " return func(*args, **kwargs)\n", - " ^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py\", line 1875, in resolve_missing_vols_in_data\n", - " resolved_vols = df[zero_vol].apply(\n", - " ^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py\", line 10374, in apply\n", - " return op.apply().__finalize__(self, method=\"apply\")\n", - " ^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py\", line 916, in apply\n", - " return self.apply_standard()\n", - " ^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py\", line 1063, in apply_standard\n", - " results, res_index = self.apply_series_generator()\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py\", line 1081, in apply_series_generator\n", - " results[i] = self.func(v, *self.args, **self.kwargs)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py\", line 1876, in \n", - " lambda x:resolve_missing_vol(\n", - " ^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/models/utils.py\", line 214, in resolve_missing_vol\n", - " return resolve_missing_vol(\n", - " ^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/models/utils.py\", line 85, in resolve_missing_vol\n", - " contracts_filtered = contracts_filtered.iloc[interpolate_idx]\n", - " ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py\", line 1191, in __getitem__\n", - " return self._getitem_axis(maybe_callable, axis=axis)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py\", line 1743, in _getitem_axis\n", - " return self._get_list_axis(key, axis=axis)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py\", line 1717, in _get_list_axis\n", - " raise IndexError(\"positional indexers are out-of-bounds\") from err\n", - "IndexError: positional indexers are out-of-bounds\n", - "2025-04-24 00:11:23 DataManager.py ERROR: args ( underlier strike expiration put/call open high low close \\\n", - "Datetime \n", - "2024-09-18 AAPL 20.0 2025-03-21 C 0.00 0.00 0.00 0.00 \n", - "2024-09-19 AAPL 20.0 2025-03-21 C 0.00 0.00 0.00 0.00 \n", - "2024-09-20 AAPL 20.0 2025-03-21 C 0.00 0.00 0.00 0.00 \n", - "2024-09-23 AAPL 20.0 2025-03-21 C 0.00 0.00 0.00 0.00 \n", - "2024-09-24 AAPL 20.0 2025-03-21 C 0.00 0.00 0.00 0.00 \n", - "... ... ... ... ... ... ... ... ... \n", - "2025-03-17 AAPL 350.0 2025-03-21 C 0.00 0.00 0.00 0.00 \n", - "2025-03-18 AAPL 350.0 2025-03-21 C 0.00 0.00 0.00 0.00 \n", - "2025-03-19 AAPL 350.0 2025-03-21 C 0.01 0.01 0.01 0.01 \n", - "2025-03-20 AAPL 350.0 2025-03-21 C 0.00 0.00 0.00 0.00 \n", - "2025-03-21 AAPL 350.0 2025-03-21 C 0.01 0.01 0.01 0.01 \n", - "\n", - " volume bid_size closebid ask_size closeask midpoint \\\n", - "Datetime \n", - "2024-09-18 0 55 199.20 53 202.75 200.975 \n", - "2024-09-19 0 50 207.45 50 210.65 209.050 \n", - "2024-09-20 0 60 206.40 30 210.60 208.500 \n", - "2024-09-23 0 50 205.45 30 208.10 206.775 \n", - "2024-09-24 0 56 206.00 56 209.00 207.500 \n", - "... ... ... ... ... ... ... \n", - "2025-03-17 0 0 0.00 4510 0.01 0.005 \n", - "2025-03-18 0 0 0.00 4500 0.01 0.005 \n", - "2025-03-19 1 0 0.00 4510 0.01 0.005 \n", - "2025-03-20 0 0 0.00 4510 0.01 0.005 \n", - "2025-03-21 70 0 0.00 4500 0.01 0.005 \n", - "\n", - " weighted_midpoint optiontick openinterest \\\n", - "Datetime \n", - "2024-09-18 200.94213 AAPL20250321C20 0 \n", - "2024-09-19 209.05000 AAPL20250321C20 0 \n", - "2024-09-20 207.80000 AAPL20250321C20 0 \n", - "2024-09-23 206.44375 AAPL20250321C20 0 \n", - "2024-09-24 207.50000 AAPL20250321C20 0 \n", - "... ... ... ... \n", - "2025-03-17 0.01000 AAPL20250321C350 4634 \n", - "2025-03-18 0.01000 AAPL20250321C350 4634 \n", - "2025-03-19 0.01000 AAPL20250321C350 4634 \n", - "2025-03-20 0.01000 AAPL20250321C350 4635 \n", - "2025-03-21 0.01000 AAPL20250321C350 4635 \n", - "\n", - " underlier_price rf_rate dividend rf_rate_name datetime \\\n", - "Datetime \n", - "2024-09-18 220.690002 0.04735 0.004521 ^IRX 2024-09-18 \n", - "2024-09-19 228.869995 0.04615 0.004441 ^IRX 2024-09-19 \n", - "2024-09-20 228.199997 0.04545 0.004282 ^IRX 2024-09-20 \n", - "2024-09-23 226.470001 0.04545 0.004294 ^IRX 2024-09-23 \n", - "2024-09-24 227.369995 0.04503 0.004327 ^IRX 2024-09-24 \n", - "... ... ... ... ... ... \n", - "2025-03-17 214.000000 0.04188 0.004684 ^IRX 2025-03-17 \n", - "2025-03-18 212.690002 0.04188 0.004673 ^IRX 2025-03-18 \n", - "2025-03-19 215.240005 0.04195 0.004702 ^IRX 2025-03-19 \n", - "2025-03-20 214.100006 0.04190 0.004646 ^IRX 2025-03-20 \n", - "2025-03-21 218.270004 0.04185 0.004671 ^IRX 2025-03-21 \n", - "\n", - " bs_iv midpoint_bs_iv weighted_midpoint_bs_iv bid_bs_iv \\\n", - "Datetime \n", - "2024-09-18 0.000000 1.553734 1.529898 0.0 \n", - "2024-09-19 0.000000 1.508929 1.508929 0.0 \n", - "2024-09-20 0.000000 1.592857 0.000000 0.0 \n", - "2024-09-23 0.000000 1.603729 1.097023 0.0 \n", - "2024-09-24 0.000000 1.471971 1.471971 0.0 \n", - "... ... ... ... ... \n", - "2025-03-17 0.000000 1.419782 1.497472 0.0 \n", - "2025-03-18 0.000000 1.659075 1.749749 0.0 \n", - "2025-03-19 2.095131 1.986323 2.095131 0.0 \n", - "2025-03-20 0.000000 2.838608 2.993935 0.0 \n", - "2025-03-21 0.000000 0.000000 0.000000 0.0 \n", - "\n", - " ask_bs_iv binomial_iv midpoint_binomial_iv \\\n", - "Datetime \n", - "2024-09-18 2.188638 0.00000 5.000000 \n", - "2024-09-19 2.147256 0.00000 5.000000 \n", - "2024-09-20 2.300400 0.00000 0.000100 \n", - "2024-09-23 2.119952 0.00000 0.000100 \n", - "2024-09-24 2.130228 0.00000 5.000000 \n", - "... ... ... ... \n", - "2025-03-17 1.497472 0.00000 1.432130 \n", - "2025-03-18 1.749749 0.00000 1.673798 \n", - "2025-03-19 2.095131 2.11571 2.003335 \n", - "2025-03-20 2.993935 0.00000 2.863343 \n", - "2025-03-21 0.000000 0.00000 0.000000 \n", - "\n", - " weighted_midpoint_binomial_iv bid_binomial_iv ask_binomial_iv \n", - "Datetime \n", - "2024-09-18 5.000000 0.0001 0.568237 \n", - "2024-09-19 5.000000 0.0001 0.582920 \n", - "2024-09-20 0.000100 0.0001 0.812651 \n", - "2024-09-23 0.000100 0.0001 0.655600 \n", - "2024-09-24 5.000000 0.0001 0.699055 \n", - "... ... ... ... \n", - "2025-03-17 1.512518 0.0000 1.512518 \n", - "2025-03-18 1.767836 0.0000 1.767836 \n", - "2025-03-19 2.115710 0.0000 2.115710 \n", - "2025-03-20 3.024085 0.0000 3.024085 \n", - "2025-03-21 0.000000 0.0000 0.000000 \n", - "\n", - "[635 rows x 32 columns], ['midpoint_bs_iv', 'midpoint_binomial_iv'], ['bs', 'binomial'], ['midpoint', 'midpoint']), kwargs: {'agg': 'eod'}\n", - "2025-04-24 00:11:23 DataManagers.Vol_Resolve ERROR: Error resolving vols: positional indexers are out-of-bounds\n", - "Rows inserted into temp_options_eod_new: 635\r" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
underlierstrikeexpirationput/callopenhighlowclosevolumebid_sizeclosebidask_sizecloseaskmidpointweighted_midpointoptiontickopeninterestunderlier_pricerf_ratedividendrf_rate_namedatetimebs_ivmidpoint_bs_ivweighted_midpoint_bs_ivbid_bs_ivask_bs_ivbinomial_ivmidpoint_binomial_ivweighted_midpoint_binomial_ivbid_binomial_ivask_binomial_ivdeltagammavegathetarhovannavolgamidpoint_deltamidpoint_gammamidpoint_vegamidpoint_thetamidpoint_rhomidpoint_vannamidpoint_volgaweighted_midpoint_deltaweighted_midpoint_gammaweighted_midpoint_vegaweighted_midpoint_thetaweighted_midpoint_rhoweighted_midpoint_vannaweighted_midpoint_volgabid_binomial_deltabid_binomial_gammabid_binomial_vegabid_binomial_thetabid_binomial_rhobid_binomial_vannabid_binomial_volgaask_binomial_deltaask_binomial_gammaask_binomial_vegaask_binomial_thetaask_binomial_rhoask_binomial_vannaask_binomial_volgabinomial_deltabinomial_gammabinomial_vegabinomial_thetabinomial_rhobinomial_vannabinomial_volgamidpoint_binomial_deltamidpoint_binomial_gammamidpoint_binomial_vegamidpoint_binomial_thetamidpoint_binomial_rhomidpoint_binomial_vannamidpoint_binomial_volgadollar_deltamidpoint_dollar_deltaweighted_midpoint_dollar_deltalast_updatedmidpoint_bs_vol_resolvemidpoint_binomial_vol_resolve
Datetime
2024-09-18AAPL20.02025-03-21C0.000.000.000.00055199.2053202.75200.975200.94213AAPL20250321C200220.6900020.047350.004521^IRX2024-09-180.0000001.5537341.5298980.02.1886380.000005.0000005.0000000.00010.5682370.0000000.0000000.0000000.0000000.0000000.0000000.0000000.9947360.0000370.014283-0.0056950.093465-1.053431453.4720930.9949630.0000350.013302-0.0052060.093883-1.097849477.0237050.9977252.842171e-100.00.0001940.098378-3.405488e+081.820725e+150.9977255.684342e-102.826610e-090.0001940.098378-10.1927119912.0979660.000000.0000000.0000000.0000000.0000000.0000000.0000000.9907372.483773e-050.030470-0.0392800.0135242.163292e-01-8.325827e+010.000000219.528278219.5783302025-04-24 00:11:3600
2024-09-19AAPL20.02025-03-21C0.000.000.000.00050207.4550210.65209.050209.05000AAPL20250321C200228.8699950.046150.004441^IRX2024-09-190.0000001.5089291.5089290.02.1472560.000005.0000005.0000000.00010.5829200.0000000.0000000.0000000.0000000.0000000.0000000.0000000.9954960.0000290.011571-0.0043530.094139-1.166161535.7171340.9954960.0000290.011571-0.0043530.094139-1.166161535.7171340.9977780.000000e+000.00.0003070.097915-3.465306e+081.949704e+150.997778-5.684342e-103.822137e-090.0003070.097915-9.8450929831.5499920.000000.0000000.0000000.0000000.0000000.0000000.0000000.9909272.359883e-050.030967-0.0401390.0138252.130445e-01-8.504779e+010.000000227.839233227.8392332025-04-24 00:11:3600
2024-09-20AAPL20.02025-03-21C0.000.000.000.00060206.4030210.60208.500207.80000AAPL20250321C200228.1999970.045450.004282^IRX2024-09-200.0000001.5928570.0000000.02.3004000.000000.0001000.0001000.00010.8126510.0000000.0000000.0000000.0000000.0000000.0000000.0000000.9948550.0000360.014795-0.0060930.092313-1.012564447.8333340.0000000.0000000.0000000.0000000.0000000.0000000.0000000.997869-2.842171e-100.00.0002370.097427-3.470443e+081.944253e+150.9978669.038104e-081.914199e-050.0002330.097423-4.9028383606.4829960.000000.0000000.0000000.0000000.0000000.0000000.0000000.997869-2.842171e-100.0000000.0002370.097427-3.470443e+081.944253e+150.000000227.0259290.0000002025-04-24 00:11:3600
2024-09-23AAPL20.02025-03-21C0.000.000.000.00050205.4530208.10206.775206.44375AAPL20250321C200226.4700010.045450.004294^IRX2024-09-230.0000001.6037291.0970230.02.1199520.000000.0001000.0001000.00010.6556000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.9948410.0000370.014748-0.0062380.090795-1.003862436.2341290.9977200.0000040.001078-0.0000970.095613-2.5487041442.6884980.9978980.000000e+000.00.0002230.095856-3.488167e+081.933084e+150.9978985.684342e-101.248268e-070.0002230.095856-7.7662836847.4421050.000000.0000000.0000000.0000000.0000000.0000000.0000000.9978980.000000e+000.0000000.0002230.095856-3.488167e+081.933084e+150.000000225.301664225.9535862025-04-24 00:11:3600
2024-09-24AAPL20.02025-03-21C0.000.000.000.00056206.0056209.00207.500207.50000AAPL20250321C200227.3699950.045030.004327^IRX2024-09-240.0000001.4719711.4719710.02.1302280.000005.0000005.0000000.00010.6990550.0000000.0000000.0000000.0000000.0000000.0000000.0000000.9960240.0000260.009465-0.0035480.092428-1.266115582.5390070.9960240.0000260.009465-0.0035480.092428-1.266115582.5390070.997893-5.684342e-100.00.0002760.095352-3.503130e+081.951985e+150.9978932.557954e-096.131956e-070.0002760.095352-6.8202735700.5370460.000000.0000000.0000000.0000000.0000000.0000000.0000000.9907132.510603e-050.031626-0.0423630.0141542.066892e-01-8.028990e+010.000000226.465920226.4659202025-04-24 00:11:3600
........................................................................................................................................................................................................................................................................
2025-03-17AAPL350.02025-03-21C0.000.000.000.00000.0045100.010.0050.01000AAPL20250321C3504634214.0000000.041880.004684^IRX2025-03-170.0000001.4197821.4974720.01.4974720.000001.4321301.5125180.00001.5125180.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0006100.0000670.000479-0.0044540.0000140.0014540.1052920.0011130.0001110.000832-0.0086810.0000250.0023890.1636280.0000000.000000e+000.00.0000000.0000000.000000e+000.000000e+000.0012381.208413e-049.170974e-04-0.0097720.0000280.0026060.1765960.000000.0000000.0000000.0000000.0000000.0000000.0000000.0006767.317660e-050.000526-0.0049860.0000151.582457e-031.135777e-010.0000000.1305810.2381252025-04-24 00:11:3600
2025-03-18AAPL350.02025-03-21C0.000.000.000.00000.0045000.010.0050.01000AAPL20250321C3504634212.6900020.041880.004673^IRX2025-03-180.0000001.6590751.7497490.01.7497490.000001.6737981.7678360.00001.7678360.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0006070.0000670.000410-0.0048140.0000100.0012390.0772760.0011070.0001100.000713-0.0095070.0000190.0020370.1201270.0000000.000000e+000.00.0000000.0000000.000000e+000.000000e+000.0012351.199304e-047.880339e-04-0.0107670.0000210.0022270.1299470.000000.0000000.0000000.0000000.0000000.0000000.0000000.0006747.255321e-050.000451-0.0054140.0000111.351221e-038.349533e-020.0000000.1291330.2355132025-04-24 00:11:3600
2025-03-19AAPL350.02025-03-21C0.010.010.010.01100.0045100.010.0050.01000AAPL20250321C3504634215.2400050.041950.004702^IRX2025-03-192.0951311.9863232.0951310.02.0951312.115712.0033352.1157100.00002.1157100.0011170.0001120.000594-0.0099710.0000130.0017130.0834190.0006130.0000680.000342-0.0049920.0000070.0010430.0536930.0011170.0001120.000594-0.0099710.0000130.0017130.0834190.0000000.000000e+000.00.0000000.0000000.000000e+000.000000e+000.0012401.216644e-046.531434e-04-0.0112470.0000140.0018650.0898670.001240.0001220.000653-0.0112470.0000140.0018650.0898670.0006777.373691e-050.000375-0.0055990.0000081.133491e-035.784555e-020.2405210.1319090.2405212025-04-24 00:11:3600
2025-03-20AAPL350.02025-03-21C0.000.000.000.00000.0045100.010.0050.01000AAPL20250321C3504635214.1000060.041900.004646^IRX2025-03-200.0000002.8386082.9939350.02.9939350.000002.8633433.0240850.00003.0240850.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0006100.0000670.000239-0.0050000.0000030.0007270.0263410.0011130.0001110.000416-0.0100000.0000060.0011950.0409350.0000000.000000e+000.00.0000000.0000000.000000e+000.000000e+000.0012381.208355e-044.586511e-04-0.0113180.0000070.0013030.0441870.000000.0000000.0000000.0000000.0000000.0000000.0000000.0006767.317018e-050.000263-0.0056210.0000047.915171e-042.841801e-020.0000000.1306250.2382052025-04-24 00:11:3600
2025-03-21AAPL350.02025-03-21C0.010.010.010.017000.0045000.010.0050.01000AAPL20250321C3504635218.2700040.041850.004671^IRX2025-03-210.0000000.0000000.0000000.00.0000000.000000.0000000.0000000.00000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.000000e+000.00.0000000.0000000.000000e+000.000000e+000.0000000.000000e+000.000000e+000.0000000.0000000.0000000.0000000.000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.000000e+000.0000000.0000000.0000000.000000e+000.000000e+000.0000000.0000000.0000002025-04-24 00:11:3600
\n", - "

635 rows × 87 columns

\n", - "
" - ], - "text/plain": [ - " underlier strike expiration put/call open high low close \\\n", - "Datetime \n", - "2024-09-18 AAPL 20.0 2025-03-21 C 0.00 0.00 0.00 0.00 \n", - "2024-09-19 AAPL 20.0 2025-03-21 C 0.00 0.00 0.00 0.00 \n", - "2024-09-20 AAPL 20.0 2025-03-21 C 0.00 0.00 0.00 0.00 \n", - "2024-09-23 AAPL 20.0 2025-03-21 C 0.00 0.00 0.00 0.00 \n", - "2024-09-24 AAPL 20.0 2025-03-21 C 0.00 0.00 0.00 0.00 \n", - "... ... ... ... ... ... ... ... ... \n", - "2025-03-17 AAPL 350.0 2025-03-21 C 0.00 0.00 0.00 0.00 \n", - "2025-03-18 AAPL 350.0 2025-03-21 C 0.00 0.00 0.00 0.00 \n", - "2025-03-19 AAPL 350.0 2025-03-21 C 0.01 0.01 0.01 0.01 \n", - "2025-03-20 AAPL 350.0 2025-03-21 C 0.00 0.00 0.00 0.00 \n", - "2025-03-21 AAPL 350.0 2025-03-21 C 0.01 0.01 0.01 0.01 \n", - "\n", - " volume bid_size closebid ask_size closeask midpoint \\\n", - "Datetime \n", - "2024-09-18 0 55 199.20 53 202.75 200.975 \n", - "2024-09-19 0 50 207.45 50 210.65 209.050 \n", - "2024-09-20 0 60 206.40 30 210.60 208.500 \n", - "2024-09-23 0 50 205.45 30 208.10 206.775 \n", - "2024-09-24 0 56 206.00 56 209.00 207.500 \n", - "... ... ... ... ... ... ... \n", - "2025-03-17 0 0 0.00 4510 0.01 0.005 \n", - "2025-03-18 0 0 0.00 4500 0.01 0.005 \n", - "2025-03-19 1 0 0.00 4510 0.01 0.005 \n", - "2025-03-20 0 0 0.00 4510 0.01 0.005 \n", - "2025-03-21 70 0 0.00 4500 0.01 0.005 \n", - "\n", - " weighted_midpoint optiontick openinterest \\\n", - "Datetime \n", - "2024-09-18 200.94213 AAPL20250321C20 0 \n", - "2024-09-19 209.05000 AAPL20250321C20 0 \n", - "2024-09-20 207.80000 AAPL20250321C20 0 \n", - "2024-09-23 206.44375 AAPL20250321C20 0 \n", - "2024-09-24 207.50000 AAPL20250321C20 0 \n", - "... ... ... ... \n", - "2025-03-17 0.01000 AAPL20250321C350 4634 \n", - "2025-03-18 0.01000 AAPL20250321C350 4634 \n", - "2025-03-19 0.01000 AAPL20250321C350 4634 \n", - "2025-03-20 0.01000 AAPL20250321C350 4635 \n", - "2025-03-21 0.01000 AAPL20250321C350 4635 \n", - "\n", - " underlier_price rf_rate dividend rf_rate_name datetime \\\n", - "Datetime \n", - "2024-09-18 220.690002 0.04735 0.004521 ^IRX 2024-09-18 \n", - "2024-09-19 228.869995 0.04615 0.004441 ^IRX 2024-09-19 \n", - "2024-09-20 228.199997 0.04545 0.004282 ^IRX 2024-09-20 \n", - "2024-09-23 226.470001 0.04545 0.004294 ^IRX 2024-09-23 \n", - "2024-09-24 227.369995 0.04503 0.004327 ^IRX 2024-09-24 \n", - "... ... ... ... ... ... \n", - "2025-03-17 214.000000 0.04188 0.004684 ^IRX 2025-03-17 \n", - "2025-03-18 212.690002 0.04188 0.004673 ^IRX 2025-03-18 \n", - "2025-03-19 215.240005 0.04195 0.004702 ^IRX 2025-03-19 \n", - "2025-03-20 214.100006 0.04190 0.004646 ^IRX 2025-03-20 \n", - "2025-03-21 218.270004 0.04185 0.004671 ^IRX 2025-03-21 \n", - "\n", - " bs_iv midpoint_bs_iv weighted_midpoint_bs_iv bid_bs_iv \\\n", - "Datetime \n", - "2024-09-18 0.000000 1.553734 1.529898 0.0 \n", - "2024-09-19 0.000000 1.508929 1.508929 0.0 \n", - "2024-09-20 0.000000 1.592857 0.000000 0.0 \n", - "2024-09-23 0.000000 1.603729 1.097023 0.0 \n", - "2024-09-24 0.000000 1.471971 1.471971 0.0 \n", - "... ... ... ... ... \n", - "2025-03-17 0.000000 1.419782 1.497472 0.0 \n", - "2025-03-18 0.000000 1.659075 1.749749 0.0 \n", - "2025-03-19 2.095131 1.986323 2.095131 0.0 \n", - "2025-03-20 0.000000 2.838608 2.993935 0.0 \n", - "2025-03-21 0.000000 0.000000 0.000000 0.0 \n", - "\n", - " ask_bs_iv binomial_iv midpoint_binomial_iv \\\n", - "Datetime \n", - "2024-09-18 2.188638 0.00000 5.000000 \n", - "2024-09-19 2.147256 0.00000 5.000000 \n", - "2024-09-20 2.300400 0.00000 0.000100 \n", - "2024-09-23 2.119952 0.00000 0.000100 \n", - "2024-09-24 2.130228 0.00000 5.000000 \n", - "... ... ... ... \n", - "2025-03-17 1.497472 0.00000 1.432130 \n", - "2025-03-18 1.749749 0.00000 1.673798 \n", - "2025-03-19 2.095131 2.11571 2.003335 \n", - "2025-03-20 2.993935 0.00000 2.863343 \n", - "2025-03-21 0.000000 0.00000 0.000000 \n", - "\n", - " weighted_midpoint_binomial_iv bid_binomial_iv ask_binomial_iv \\\n", - "Datetime \n", - "2024-09-18 5.000000 0.0001 0.568237 \n", - "2024-09-19 5.000000 0.0001 0.582920 \n", - "2024-09-20 0.000100 0.0001 0.812651 \n", - "2024-09-23 0.000100 0.0001 0.655600 \n", - "2024-09-24 5.000000 0.0001 0.699055 \n", - "... ... ... ... \n", - "2025-03-17 1.512518 0.0000 1.512518 \n", - "2025-03-18 1.767836 0.0000 1.767836 \n", - "2025-03-19 2.115710 0.0000 2.115710 \n", - "2025-03-20 3.024085 0.0000 3.024085 \n", - "2025-03-21 0.000000 0.0000 0.000000 \n", - "\n", - " delta gamma vega theta rho vanna \\\n", - "Datetime \n", - "2024-09-18 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "2024-09-19 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "2024-09-20 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "2024-09-23 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "2024-09-24 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "... ... ... ... ... ... ... \n", - "2025-03-17 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "2025-03-18 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "2025-03-19 0.001117 0.000112 0.000594 -0.009971 0.000013 0.001713 \n", - "2025-03-20 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "2025-03-21 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", - "\n", - " volga midpoint_delta midpoint_gamma midpoint_vega \\\n", - "Datetime \n", - "2024-09-18 0.000000 0.994736 0.000037 0.014283 \n", - "2024-09-19 0.000000 0.995496 0.000029 0.011571 \n", - "2024-09-20 0.000000 0.994855 0.000036 0.014795 \n", - "2024-09-23 0.000000 0.994841 0.000037 0.014748 \n", - "2024-09-24 0.000000 0.996024 0.000026 0.009465 \n", - "... ... ... ... ... \n", - "2025-03-17 0.000000 0.000610 0.000067 0.000479 \n", - "2025-03-18 0.000000 0.000607 0.000067 0.000410 \n", - "2025-03-19 0.083419 0.000613 0.000068 0.000342 \n", - "2025-03-20 0.000000 0.000610 0.000067 0.000239 \n", - "2025-03-21 0.000000 0.000000 0.000000 0.000000 \n", - "\n", - " midpoint_theta midpoint_rho midpoint_vanna midpoint_volga \\\n", - "Datetime \n", - "2024-09-18 -0.005695 0.093465 -1.053431 453.472093 \n", - "2024-09-19 -0.004353 0.094139 -1.166161 535.717134 \n", - "2024-09-20 -0.006093 0.092313 -1.012564 447.833334 \n", - "2024-09-23 -0.006238 0.090795 -1.003862 436.234129 \n", - "2024-09-24 -0.003548 0.092428 -1.266115 582.539007 \n", - "... ... ... ... ... \n", - "2025-03-17 -0.004454 0.000014 0.001454 0.105292 \n", - "2025-03-18 -0.004814 0.000010 0.001239 0.077276 \n", - "2025-03-19 -0.004992 0.000007 0.001043 0.053693 \n", - "2025-03-20 -0.005000 0.000003 0.000727 0.026341 \n", - "2025-03-21 0.000000 0.000000 0.000000 0.000000 \n", - "\n", - " weighted_midpoint_delta weighted_midpoint_gamma \\\n", - "Datetime \n", - "2024-09-18 0.994963 0.000035 \n", - "2024-09-19 0.995496 0.000029 \n", - "2024-09-20 0.000000 0.000000 \n", - "2024-09-23 0.997720 0.000004 \n", - "2024-09-24 0.996024 0.000026 \n", - "... ... ... \n", - "2025-03-17 0.001113 0.000111 \n", - "2025-03-18 0.001107 0.000110 \n", - "2025-03-19 0.001117 0.000112 \n", - "2025-03-20 0.001113 0.000111 \n", - "2025-03-21 0.000000 0.000000 \n", - "\n", - " weighted_midpoint_vega weighted_midpoint_theta \\\n", - "Datetime \n", - "2024-09-18 0.013302 -0.005206 \n", - "2024-09-19 0.011571 -0.004353 \n", - "2024-09-20 0.000000 0.000000 \n", - "2024-09-23 0.001078 -0.000097 \n", - "2024-09-24 0.009465 -0.003548 \n", - "... ... ... \n", - "2025-03-17 0.000832 -0.008681 \n", - "2025-03-18 0.000713 -0.009507 \n", - "2025-03-19 0.000594 -0.009971 \n", - "2025-03-20 0.000416 -0.010000 \n", - "2025-03-21 0.000000 0.000000 \n", - "\n", - " weighted_midpoint_rho weighted_midpoint_vanna \\\n", - "Datetime \n", - "2024-09-18 0.093883 -1.097849 \n", - "2024-09-19 0.094139 -1.166161 \n", - "2024-09-20 0.000000 0.000000 \n", - "2024-09-23 0.095613 -2.548704 \n", - "2024-09-24 0.092428 -1.266115 \n", - "... ... ... \n", - "2025-03-17 0.000025 0.002389 \n", - "2025-03-18 0.000019 0.002037 \n", - "2025-03-19 0.000013 0.001713 \n", - "2025-03-20 0.000006 0.001195 \n", - "2025-03-21 0.000000 0.000000 \n", - "\n", - " weighted_midpoint_volga bid_binomial_delta bid_binomial_gamma \\\n", - "Datetime \n", - "2024-09-18 477.023705 0.997725 2.842171e-10 \n", - "2024-09-19 535.717134 0.997778 0.000000e+00 \n", - "2024-09-20 0.000000 0.997869 -2.842171e-10 \n", - "2024-09-23 1442.688498 0.997898 0.000000e+00 \n", - "2024-09-24 582.539007 0.997893 -5.684342e-10 \n", - "... ... ... ... \n", - "2025-03-17 0.163628 0.000000 0.000000e+00 \n", - "2025-03-18 0.120127 0.000000 0.000000e+00 \n", - "2025-03-19 0.083419 0.000000 0.000000e+00 \n", - "2025-03-20 0.040935 0.000000 0.000000e+00 \n", - "2025-03-21 0.000000 0.000000 0.000000e+00 \n", - "\n", - " bid_binomial_vega bid_binomial_theta bid_binomial_rho \\\n", - "Datetime \n", - "2024-09-18 0.0 0.000194 0.098378 \n", - "2024-09-19 0.0 0.000307 0.097915 \n", - "2024-09-20 0.0 0.000237 0.097427 \n", - "2024-09-23 0.0 0.000223 0.095856 \n", - "2024-09-24 0.0 0.000276 0.095352 \n", - "... ... ... ... \n", - "2025-03-17 0.0 0.000000 0.000000 \n", - "2025-03-18 0.0 0.000000 0.000000 \n", - "2025-03-19 0.0 0.000000 0.000000 \n", - "2025-03-20 0.0 0.000000 0.000000 \n", - "2025-03-21 0.0 0.000000 0.000000 \n", - "\n", - " bid_binomial_vanna bid_binomial_volga ask_binomial_delta \\\n", - "Datetime \n", - "2024-09-18 -3.405488e+08 1.820725e+15 0.997725 \n", - "2024-09-19 -3.465306e+08 1.949704e+15 0.997778 \n", - "2024-09-20 -3.470443e+08 1.944253e+15 0.997866 \n", - "2024-09-23 -3.488167e+08 1.933084e+15 0.997898 \n", - "2024-09-24 -3.503130e+08 1.951985e+15 0.997893 \n", - "... ... ... ... \n", - "2025-03-17 0.000000e+00 0.000000e+00 0.001238 \n", - "2025-03-18 0.000000e+00 0.000000e+00 0.001235 \n", - "2025-03-19 0.000000e+00 0.000000e+00 0.001240 \n", - "2025-03-20 0.000000e+00 0.000000e+00 0.001238 \n", - "2025-03-21 0.000000e+00 0.000000e+00 0.000000 \n", - "\n", - " ask_binomial_gamma ask_binomial_vega ask_binomial_theta \\\n", - "Datetime \n", - "2024-09-18 5.684342e-10 2.826610e-09 0.000194 \n", - "2024-09-19 -5.684342e-10 3.822137e-09 0.000307 \n", - "2024-09-20 9.038104e-08 1.914199e-05 0.000233 \n", - "2024-09-23 5.684342e-10 1.248268e-07 0.000223 \n", - "2024-09-24 2.557954e-09 6.131956e-07 0.000276 \n", - "... ... ... ... \n", - "2025-03-17 1.208413e-04 9.170974e-04 -0.009772 \n", - "2025-03-18 1.199304e-04 7.880339e-04 -0.010767 \n", - "2025-03-19 1.216644e-04 6.531434e-04 -0.011247 \n", - "2025-03-20 1.208355e-04 4.586511e-04 -0.011318 \n", - "2025-03-21 0.000000e+00 0.000000e+00 0.000000 \n", - "\n", - " ask_binomial_rho ask_binomial_vanna ask_binomial_volga \\\n", - "Datetime \n", - "2024-09-18 0.098378 -10.192711 9912.097966 \n", - "2024-09-19 0.097915 -9.845092 9831.549992 \n", - "2024-09-20 0.097423 -4.902838 3606.482996 \n", - "2024-09-23 0.095856 -7.766283 6847.442105 \n", - "2024-09-24 0.095352 -6.820273 5700.537046 \n", - "... ... ... ... \n", - "2025-03-17 0.000028 0.002606 0.176596 \n", - "2025-03-18 0.000021 0.002227 0.129947 \n", - "2025-03-19 0.000014 0.001865 0.089867 \n", - "2025-03-20 0.000007 0.001303 0.044187 \n", - "2025-03-21 0.000000 0.000000 0.000000 \n", - "\n", - " binomial_delta binomial_gamma binomial_vega binomial_theta \\\n", - "Datetime \n", - "2024-09-18 0.00000 0.000000 0.000000 0.000000 \n", - "2024-09-19 0.00000 0.000000 0.000000 0.000000 \n", - "2024-09-20 0.00000 0.000000 0.000000 0.000000 \n", - "2024-09-23 0.00000 0.000000 0.000000 0.000000 \n", - "2024-09-24 0.00000 0.000000 0.000000 0.000000 \n", - "... ... ... ... ... \n", - "2025-03-17 0.00000 0.000000 0.000000 0.000000 \n", - "2025-03-18 0.00000 0.000000 0.000000 0.000000 \n", - "2025-03-19 0.00124 0.000122 0.000653 -0.011247 \n", - "2025-03-20 0.00000 0.000000 0.000000 0.000000 \n", - "2025-03-21 0.00000 0.000000 0.000000 0.000000 \n", - "\n", - " binomial_rho binomial_vanna binomial_volga \\\n", - "Datetime \n", - "2024-09-18 0.000000 0.000000 0.000000 \n", - "2024-09-19 0.000000 0.000000 0.000000 \n", - "2024-09-20 0.000000 0.000000 0.000000 \n", - "2024-09-23 0.000000 0.000000 0.000000 \n", - "2024-09-24 0.000000 0.000000 0.000000 \n", - "... ... ... ... \n", - "2025-03-17 0.000000 0.000000 0.000000 \n", - "2025-03-18 0.000000 0.000000 0.000000 \n", - "2025-03-19 0.000014 0.001865 0.089867 \n", - "2025-03-20 0.000000 0.000000 0.000000 \n", - "2025-03-21 0.000000 0.000000 0.000000 \n", - "\n", - " midpoint_binomial_delta midpoint_binomial_gamma \\\n", - "Datetime \n", - "2024-09-18 0.990737 2.483773e-05 \n", - "2024-09-19 0.990927 2.359883e-05 \n", - "2024-09-20 0.997869 -2.842171e-10 \n", - "2024-09-23 0.997898 0.000000e+00 \n", - "2024-09-24 0.990713 2.510603e-05 \n", - "... ... ... \n", - "2025-03-17 0.000676 7.317660e-05 \n", - "2025-03-18 0.000674 7.255321e-05 \n", - "2025-03-19 0.000677 7.373691e-05 \n", - "2025-03-20 0.000676 7.317018e-05 \n", - "2025-03-21 0.000000 0.000000e+00 \n", - "\n", - " midpoint_binomial_vega midpoint_binomial_theta \\\n", - "Datetime \n", - "2024-09-18 0.030470 -0.039280 \n", - "2024-09-19 0.030967 -0.040139 \n", - "2024-09-20 0.000000 0.000237 \n", - "2024-09-23 0.000000 0.000223 \n", - "2024-09-24 0.031626 -0.042363 \n", - "... ... ... \n", - "2025-03-17 0.000526 -0.004986 \n", - "2025-03-18 0.000451 -0.005414 \n", - "2025-03-19 0.000375 -0.005599 \n", - "2025-03-20 0.000263 -0.005621 \n", - "2025-03-21 0.000000 0.000000 \n", - "\n", - " midpoint_binomial_rho midpoint_binomial_vanna \\\n", - "Datetime \n", - "2024-09-18 0.013524 2.163292e-01 \n", - "2024-09-19 0.013825 2.130445e-01 \n", - "2024-09-20 0.097427 -3.470443e+08 \n", - "2024-09-23 0.095856 -3.488167e+08 \n", - "2024-09-24 0.014154 2.066892e-01 \n", - "... ... ... \n", - "2025-03-17 0.000015 1.582457e-03 \n", - "2025-03-18 0.000011 1.351221e-03 \n", - "2025-03-19 0.000008 1.133491e-03 \n", - "2025-03-20 0.000004 7.915171e-04 \n", - "2025-03-21 0.000000 0.000000e+00 \n", - "\n", - " midpoint_binomial_volga dollar_delta midpoint_dollar_delta \\\n", - "Datetime \n", - "2024-09-18 -8.325827e+01 0.000000 219.528278 \n", - "2024-09-19 -8.504779e+01 0.000000 227.839233 \n", - "2024-09-20 1.944253e+15 0.000000 227.025929 \n", - "2024-09-23 1.933084e+15 0.000000 225.301664 \n", - "2024-09-24 -8.028990e+01 0.000000 226.465920 \n", - "... ... ... ... \n", - "2025-03-17 1.135777e-01 0.000000 0.130581 \n", - "2025-03-18 8.349533e-02 0.000000 0.129133 \n", - "2025-03-19 5.784555e-02 0.240521 0.131909 \n", - "2025-03-20 2.841801e-02 0.000000 0.130625 \n", - "2025-03-21 0.000000e+00 0.000000 0.000000 \n", - "\n", - " weighted_midpoint_dollar_delta last_updated \\\n", - "Datetime \n", - "2024-09-18 219.578330 2025-04-24 00:11:36 \n", - "2024-09-19 227.839233 2025-04-24 00:11:36 \n", - "2024-09-20 0.000000 2025-04-24 00:11:36 \n", - "2024-09-23 225.953586 2025-04-24 00:11:36 \n", - "2024-09-24 226.465920 2025-04-24 00:11:36 \n", - "... ... ... \n", - "2025-03-17 0.238125 2025-04-24 00:11:36 \n", - "2025-03-18 0.235513 2025-04-24 00:11:36 \n", - "2025-03-19 0.240521 2025-04-24 00:11:36 \n", - "2025-03-20 0.238205 2025-04-24 00:11:36 \n", - "2025-03-21 0.000000 2025-04-24 00:11:36 \n", - "\n", - " midpoint_bs_vol_resolve midpoint_binomial_vol_resolve \n", - "Datetime \n", - "2024-09-18 0 0 \n", - "2024-09-19 0 0 \n", - "2024-09-20 0 0 \n", - "2024-09-23 0 0 \n", - "2024-09-24 0 0 \n", - "... ... ... \n", - "2025-03-17 0 0 \n", - "2025-03-18 0 0 \n", - "2025-03-19 0 0 \n", - "2025-03-20 0 0 \n", - "2025-03-21 0 0 \n", - "\n", - "[635 rows x 87 columns]" - ] - }, - "execution_count": 71, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "save_to_database(request)" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
openhighlowclosevolumebid_sizeclosebidask_sizecloseaskmidpointweighted_midpointopenintereststrikeexpirationput/calloptiontickunderlierunderlier_pricerf_ratedividendrf_rate_namedatetimebs_ivmidpoint_bs_ivweighted_midpoint_bs_ivbid_bs_ivask_bs_ivbinomial_ivmidpoint_binomial_ivweighted_midpoint_binomial_ivbid_binomial_ivask_binomial_iv
Datetime
2023-12-040.00.000.00.0088159.0534160.70159.875159.5098363570.02026-01-16 00:00:00PNVDA20260116P570NVDA45.5099980.052150.000257^IRX2023-12-040.00.00.00.00.00.00000.00010.00010.00010.0001
2023-12-050.00.000.00.0055154.4537156.30155.375155.1940223570.02026-01-16 00:00:00PNVDA20260116P570NVDA46.5660020.052230.000264^IRX2023-12-050.00.00.00.00.00.00000.00010.00010.00010.0001
2023-12-060.00.000.00.0047159.5037161.15160.325160.2267863570.02026-01-16 00:00:00PNVDA20260116P570NVDA45.5029980.052430.000344^IRX2023-12-060.00.00.00.00.00.00000.00010.00010.00010.0001
2023-12-070.00.000.00.0022154.1551155.90155.025155.3726033570.02026-01-16 00:00:00PNVDA20260116P570NVDA46.5960010.052430.000352^IRX2023-12-070.00.00.00.00.00.00000.00010.00010.00010.0001
2023-12-080.00.000.00.0051148.7542150.40149.575149.4951613570.02026-01-16 00:00:00PNVDA20260116P570NVDA47.5060010.052330.000343^IRX2023-12-080.00.00.00.00.00.00000.00010.00010.00010.0001
...................................................................................................
2024-06-0426.526.6526.026.088524.959925.9025.42525.461141103570.02026-01-16 00:00:00PNVDA20260116P570NVDA116.4369960.052430.000139^IRX2024-06-040.00.00.00.00.00.00010.00010.00010.00010.0001
2024-06-050.00.000.00.009122.8510023.8023.32523.347382109570.02026-01-16 00:00:00PNVDA20260116P570NVDA122.4400020.052400.000137^IRX2024-06-050.00.00.00.00.00.00000.00010.00010.00010.0001
2024-06-060.00.000.00.007723.508024.6024.05024.060510109570.02026-01-16 00:00:00PNVDA20260116P570NVDA120.9980010.052400.000131^IRX2024-06-060.00.00.00.00.00.00000.00010.00010.00010.0001
2024-06-070.00.000.00.002123.005124.1023.55023.779167109570.02026-01-16 00:00:00PNVDA20260116P570NVDA120.8880000.052380.000099^IRX2024-06-070.00.00.00.00.00.00000.00010.00010.00010.0001
2024-06-100.00.000.00.0000.0000.000.0000.000000109570.02026-01-16 00:00:00PNVDA20260116P570NVDA121.7900010.052380.000099^IRX2024-06-100.00.00.00.00.00.00000.00000.00000.00000.0000
\n", - "

130 rows × 32 columns

\n", - "
" - ], - "text/plain": [ - " open high low close volume bid_size closebid ask_size \\\n", - "Datetime \n", - "2023-12-04 0.0 0.00 0.0 0.0 0 88 159.05 34 \n", - "2023-12-05 0.0 0.00 0.0 0.0 0 55 154.45 37 \n", - "2023-12-06 0.0 0.00 0.0 0.0 0 47 159.50 37 \n", - "2023-12-07 0.0 0.00 0.0 0.0 0 22 154.15 51 \n", - "2023-12-08 0.0 0.00 0.0 0.0 0 51 148.75 42 \n", - "... ... ... ... ... ... ... ... ... \n", - "2024-06-04 26.5 26.65 26.0 26.0 8 85 24.95 99 \n", - "2024-06-05 0.0 0.00 0.0 0.0 0 91 22.85 100 \n", - "2024-06-06 0.0 0.00 0.0 0.0 0 77 23.50 80 \n", - "2024-06-07 0.0 0.00 0.0 0.0 0 21 23.00 51 \n", - "2024-06-10 0.0 0.00 0.0 0.0 0 0 0.00 0 \n", - "\n", - " closeask midpoint weighted_midpoint openinterest strike \\\n", - "Datetime \n", - "2023-12-04 160.70 159.875 159.509836 3 570.0 \n", - "2023-12-05 156.30 155.375 155.194022 3 570.0 \n", - "2023-12-06 161.15 160.325 160.226786 3 570.0 \n", - "2023-12-07 155.90 155.025 155.372603 3 570.0 \n", - "2023-12-08 150.40 149.575 149.495161 3 570.0 \n", - "... ... ... ... ... ... \n", - "2024-06-04 25.90 25.425 25.461141 103 570.0 \n", - "2024-06-05 23.80 23.325 23.347382 109 570.0 \n", - "2024-06-06 24.60 24.050 24.060510 109 570.0 \n", - "2024-06-07 24.10 23.550 23.779167 109 570.0 \n", - "2024-06-10 0.00 0.000 0.000000 109 570.0 \n", - "\n", - " expiration put/call optiontick underlier \\\n", - "Datetime \n", - "2023-12-04 2026-01-16 00:00:00 P NVDA20260116P570 NVDA \n", - "2023-12-05 2026-01-16 00:00:00 P NVDA20260116P570 NVDA \n", - "2023-12-06 2026-01-16 00:00:00 P NVDA20260116P570 NVDA \n", - "2023-12-07 2026-01-16 00:00:00 P NVDA20260116P570 NVDA \n", - "2023-12-08 2026-01-16 00:00:00 P NVDA20260116P570 NVDA \n", - "... ... ... ... ... \n", - "2024-06-04 2026-01-16 00:00:00 P NVDA20260116P570 NVDA \n", - "2024-06-05 2026-01-16 00:00:00 P NVDA20260116P570 NVDA \n", - "2024-06-06 2026-01-16 00:00:00 P NVDA20260116P570 NVDA \n", - "2024-06-07 2026-01-16 00:00:00 P NVDA20260116P570 NVDA \n", - "2024-06-10 2026-01-16 00:00:00 P NVDA20260116P570 NVDA \n", - "\n", - " underlier_price rf_rate dividend rf_rate_name datetime bs_iv \\\n", - "Datetime \n", - "2023-12-04 45.509998 0.05215 0.000257 ^IRX 2023-12-04 0.0 \n", - "2023-12-05 46.566002 0.05223 0.000264 ^IRX 2023-12-05 0.0 \n", - "2023-12-06 45.502998 0.05243 0.000344 ^IRX 2023-12-06 0.0 \n", - "2023-12-07 46.596001 0.05243 0.000352 ^IRX 2023-12-07 0.0 \n", - "2023-12-08 47.506001 0.05233 0.000343 ^IRX 2023-12-08 0.0 \n", - "... ... ... ... ... ... ... \n", - "2024-06-04 116.436996 0.05243 0.000139 ^IRX 2024-06-04 0.0 \n", - "2024-06-05 122.440002 0.05240 0.000137 ^IRX 2024-06-05 0.0 \n", - "2024-06-06 120.998001 0.05240 0.000131 ^IRX 2024-06-06 0.0 \n", - "2024-06-07 120.888000 0.05238 0.000099 ^IRX 2024-06-07 0.0 \n", - "2024-06-10 121.790001 0.05238 0.000099 ^IRX 2024-06-10 0.0 \n", - "\n", - " midpoint_bs_iv weighted_midpoint_bs_iv bid_bs_iv ask_bs_iv \\\n", - "Datetime \n", - "2023-12-04 0.0 0.0 0.0 0.0 \n", - "2023-12-05 0.0 0.0 0.0 0.0 \n", - "2023-12-06 0.0 0.0 0.0 0.0 \n", - "2023-12-07 0.0 0.0 0.0 0.0 \n", - "2023-12-08 0.0 0.0 0.0 0.0 \n", - "... ... ... ... ... \n", - "2024-06-04 0.0 0.0 0.0 0.0 \n", - "2024-06-05 0.0 0.0 0.0 0.0 \n", - "2024-06-06 0.0 0.0 0.0 0.0 \n", - "2024-06-07 0.0 0.0 0.0 0.0 \n", - "2024-06-10 0.0 0.0 0.0 0.0 \n", - "\n", - " binomial_iv midpoint_binomial_iv weighted_midpoint_binomial_iv \\\n", - "Datetime \n", - "2023-12-04 0.0000 0.0001 0.0001 \n", - "2023-12-05 0.0000 0.0001 0.0001 \n", - "2023-12-06 0.0000 0.0001 0.0001 \n", - "2023-12-07 0.0000 0.0001 0.0001 \n", - "2023-12-08 0.0000 0.0001 0.0001 \n", - "... ... ... ... \n", - "2024-06-04 0.0001 0.0001 0.0001 \n", - "2024-06-05 0.0000 0.0001 0.0001 \n", - "2024-06-06 0.0000 0.0001 0.0001 \n", - "2024-06-07 0.0000 0.0001 0.0001 \n", - "2024-06-10 0.0000 0.0000 0.0000 \n", - "\n", - " bid_binomial_iv ask_binomial_iv \n", - "Datetime \n", - "2023-12-04 0.0001 0.0001 \n", - "2023-12-05 0.0001 0.0001 \n", - "2023-12-06 0.0001 0.0001 \n", - "2023-12-07 0.0001 0.0001 \n", - "2023-12-08 0.0001 0.0001 \n", - "... ... ... \n", - "2024-06-04 0.0001 0.0001 \n", - "2024-06-05 0.0001 0.0001 \n", - "2024-06-06 0.0001 0.0001 \n", - "2024-06-07 0.0001 0.0001 \n", - "2024-06-10 0.0000 0.0000 \n", - "\n", - "[130 rows x 32 columns]" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pd.options.display.max_columns = None\n", - "# request[request.weighted_midpoint.isna()]\n", - "data = request.spot_data.copy()\n", - "data" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "openbb", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.10" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/module_test/raw_code/DataManagers/ipynb_tests/test_import.ipynb b/module_test/raw_code/DataManagers/ipynb_tests/test_import.ipynb deleted file mode 100644 index 2063091..0000000 --- a/module_test/raw_code/DataManagers/ipynb_tests/test_import.ipynb +++ /dev/null @@ -1,5457 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "\n", - "Scheduled Data Requests will be saved to: /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/scheduler/requests.jsonl\n", - "[SaveManager] Auto setup complete. Workers started.\n" - ] - }, - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "%load_ext autoreload\n", - "%autoreload 2\n", - "import os, sys\n", - "os.environ['STREAM_LOG_LEVEL'] = 'CRITICAL'\n", - "os.environ['PROXY_URL'] = ''\n", - "from module_test.raw_code.DataManagers.DataManagers import (OptionDataManager, \n", - " ChainDataManager, \n", - " BulkOptionDataManager, \n", - " SaveManager,\n", - " set_schedule_bool,\n", - " get_schedule_bool,\n", - " _SaveManager)\n", - "from module_test.raw_code.DataManagers.SaveManager import SaveManager, construct_current_scheduled_names, _SCHEDULED_NAMES\n", - "import pandas as pd\n", - "SaveManager.auto_setup()\n", - "from dbase.DataAPI.ThetaData import list_contracts\n", - "\n", - "set_schedule_bool(True)\n", - "get_schedule_bool()" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['SINGLE_AAPL_2024-09-13_2024-08-12_2024-08-22_220.0_EOD',\n", - " 'SINGLE_AMD_2026-06-18_2024-09-17_2024-09-27_300.0_EOD',\n", - " 'SINGLE_AMZN_2024-12-27_2024-11-29_2024-12-09_255.0_EOD',\n", - " 'SINGLE_BA_2026-06-18_2024-12-27_2025-01-06_115.0_EOD',\n", - " 'SINGLE_NVDA_2024-09-20_2024-07-24_2024-08-03_76.0_EOD',\n", - " 'SINGLE_COST_2024-12-06_2024-10-24_2024-11-03_890.0_EOD',\n", - " 'SINGLE_TSLA_2025-01-17_2024-02-15_2024-02-25_135.0_EOD',\n", - " 'SINGLE_META_2024-05-31_2024-05-07_2024-05-17_590.0_EOD',\n", - " 'SINGLE_NFLX_2024-09-20_2024-05-15_2024-05-25_25.0_EOD',\n", - " 'SINGLE_SBUX_2024-11-29_2024-10-18_2024-10-28_94.0_EOD',\n", - " 'SINGLE_AAPL_2025-06-20_2024-08-12_2024-08-22_310.0_EOD',\n", - " 'SINGLE_AMD_2025-10-17_2024-09-17_2024-09-27_150.0_EOD',\n", - " 'SINGLE_AMZN_2026-12-18_2024-11-29_2024-12-09_265.0_EOD',\n", - " 'SINGLE_BA_2025-12-19_2024-12-27_2025-01-06_135.0_EOD',\n", - " 'SINGLE_NVDA_2024-08-09_2024-07-24_2024-08-03_139.0_EOD',\n", - " 'SINGLE_COST_2024-11-08_2024-10-24_2024-11-03_970.0_EOD',\n", - " 'SINGLE_TSLA_2024-08-16_2024-02-15_2024-02-25_445.0_EOD',\n", - " 'SINGLE_META_2026-12-18_2024-05-07_2024-05-17_330.0_EOD',\n", - " 'SINGLE_NFLX_2025-03-21_2024-05-15_2024-05-25_410.0_EOD',\n", - " 'SINGLE_SBUX_2024-12-20_2024-10-18_2024-10-28_75.0_EOD',\n", - " 'SINGLE_AAPL_2024-08-23_2024-08-12_2024-08-22_275.0_EOD',\n", - " 'SINGLE_AMD_2025-03-21_2024-09-17_2024-09-27_140.0_EOD',\n", - " 'SINGLE_AMZN_2024-12-06_2024-11-29_2024-12-09_212.5_EOD',\n", - " 'SINGLE_BA_2025-12-19_2024-12-27_2025-01-06_290.0_EOD',\n", - " 'SINGLE_NVDA_2024-09-20_2024-07-24_2024-08-03_19.0_EOD',\n", - " 'SINGLE_COST_2024-11-08_2024-10-24_2024-11-03_490.0_EOD',\n", - " 'SINGLE_TSLA_2024-03-22_2024-02-15_2024-02-25_245.0_EOD',\n", - " 'SINGLE_META_2024-05-31_2024-05-07_2024-05-17_800.0_EOD',\n", - " 'SINGLE_NFLX_2025-12-19_2024-05-15_2024-05-25_835.0_EOD',\n", - " 'SINGLE_SBUX_2027-01-15_2024-10-18_2024-10-28_65.0_EOD',\n", - " 'BULK_AAPL_2025-03-21_2024-08-12_2024-08-22_EOD',\n", - " 'BULK_AMD_2026-06-18_2024-09-17_2024-09-27_EOD',\n", - " 'BULK_AMZN_2026-12-18_2024-11-29_2024-12-09_EOD',\n", - " 'BULK_BA_2025-12-19_2024-12-27_2025-01-06_EOD',\n", - " 'BULK_NVDA_2024-08-16_2024-07-24_2024-08-03_EOD',\n", - " 'BULK_COST_2024-10-25_2024-10-24_2024-11-03_EOD',\n", - " 'BULK_TSLA_2026-01-16_2024-02-15_2024-02-25_EOD',\n", - " 'BULK_META_2025-03-21_2024-05-07_2024-05-17_EOD',\n", - " 'BULK_NFLX_2024-10-18_2024-05-15_2024-05-25_EOD',\n", - " 'BULK_SBUX_2024-11-08_2024-10-18_2024-10-28_EOD',\n", - " 'BULK_AAPL_2025-12-19_2024-08-12_2024-08-22_EOD',\n", - " 'BULK_AMD_2026-12-18_2024-09-17_2024-09-27_EOD',\n", - " 'BULK_AMZN_2027-01-15_2024-11-29_2024-12-09_EOD',\n", - " 'BULK_BA_2025-01-31_2024-12-27_2025-01-06_EOD',\n", - " 'BULK_NVDA_2025-06-20_2024-07-24_2024-08-03_EOD',\n", - " 'BULK_COST_2025-08-15_2024-10-24_2024-11-03_EOD',\n", - " 'BULK_TSLA_2024-08-16_2024-02-15_2024-02-25_EOD',\n", - " 'BULK_META_2024-06-21_2024-05-07_2024-05-17_EOD',\n", - " 'BULK_NFLX_2025-12-19_2024-05-15_2024-05-25_EOD',\n", - " 'BULK_SBUX_2025-09-19_2024-10-18_2024-10-28_EOD',\n", - " 'BULK_AMD_2025-04-17_2024-09-17_2024-09-27_EOD',\n", - " 'BULK_AMZN_2025-04-17_2024-11-29_2024-12-09_EOD',\n", - " 'BULK_BA_2025-08-15_2024-12-27_2025-01-06_EOD',\n", - " 'BULK_NVDA_2025-12-19_2024-07-24_2024-08-03_EOD',\n", - " 'BULK_COST_2025-01-17_2024-10-24_2024-11-03_EOD',\n", - " 'BULK_TSLA_2024-03-01_2024-02-15_2024-02-25_EOD',\n", - " 'BULK_META_2026-06-18_2024-05-07_2024-05-17_EOD',\n", - " 'BULK_NFLX_2026-12-18_2024-05-15_2024-05-25_EOD',\n", - " 'BULK_SBUX_2026-06-18_2024-10-18_2024-10-28_EOD',\n", - " 'CHAIN_JPM_2024-09-18_EOD',\n", - " 'SINGLE_SBUX_2024-09-20_2024-01-17_2024-01-27_85.0_EOD',\n", - " 'SINGLE_AAPL_2026-06-18_2024-11-15_2024-11-25_110.0_EOD',\n", - " 'SINGLE_AMD_2025-05-16_2024-10-23_2024-11-02_240.0_EOD',\n", - " 'SINGLE_AMZN_2026-06-18_2024-03-06_2024-03-16_245.0_EOD',\n", - " 'SINGLE_BA_2024-11-15_2024-06-11_2024-06-21_210.0_EOD',\n", - " 'SINGLE_NVDA_2024-04-05_2024-03-01_2024-03-11_500.0_EOD',\n", - " 'SINGLE_COST_2024-11-01_2024-10-04_2024-10-14_870.0_EOD',\n", - " 'SINGLE_TSLA_2025-02-21_2024-10-23_2024-11-02_240.0_EOD',\n", - " 'SINGLE_META_2024-04-05_2024-04-01_2024-04-11_200.0_EOD',\n", - " 'SINGLE_NFLX_2024-04-19_2024-01-29_2024-02-08_635.0_EOD',\n", - " 'CHAIN_AAPL_2024-10-25_EOD',\n", - " 'CHAIN_AMD_2024-11-05_EOD',\n", - " 'CHAIN_AMZN_2024-10-10_EOD',\n", - " 'CHAIN_AAPL_2024-12-06_EOD',\n", - " 'CHAIN_AMD_2024-12-09_EOD',\n", - " 'CHAIN_AMZN_2024-09-12_EOD',\n", - " 'CHAIN_BA_2024-04-17_EOD',\n", - " 'CHAIN_NVDA_2024-07-12_EOD',\n", - " 'CHAIN_COST_2024-03-01_EOD',\n", - " 'CHAIN_TSLA_2024-09-10_EOD',\n", - " 'CHAIN_META_2024-09-13_EOD',\n", - " 'CHAIN_NFLX_2024-11-14_EOD',\n", - " 'CHAIN_SBUX_2024-04-25_EOD',\n", - " 'SINGLE_AAPL_2026-06-18_2024-12-06_2024-12-16_15.0_EOD',\n", - " 'SINGLE_AMD_2025-06-20_2024-12-09_2024-12-19_200.0_EOD',\n", - " 'SINGLE_AMZN_2025-06-20_2024-09-12_2024-09-22_100.0_EOD',\n", - " 'SINGLE_BA_2024-06-21_2024-04-17_2024-04-27_200.0_EOD',\n", - " 'SINGLE_NVDA_2024-09-20_2024-07-12_2024-07-22_165.0_EOD',\n", - " 'SINGLE_COST_2024-07-19_2024-03-01_2024-03-11_305.0_EOD',\n", - " 'SINGLE_TSLA_2024-10-25_2024-09-10_2024-09-20_225.0_EOD',\n", - " 'SINGLE_META_2024-09-20_2024-09-13_2024-09-23_215.0_EOD',\n", - " 'SINGLE_NFLX_2024-11-22_2024-11-14_2024-11-24_895.0_EOD',\n", - " 'SINGLE_SBUX_2024-10-18_2024-04-25_2024-05-05_70.0_EOD',\n", - " 'SINGLE_AAPL_2025-01-24_2024-12-06_2024-12-16_230.0_EOD',\n", - " 'SINGLE_AMD_2025-01-10_2024-12-09_2024-12-19_240.0_EOD',\n", - " 'SINGLE_AMZN_2024-10-04_2024-09-12_2024-09-22_150.0_EOD',\n", - " 'SINGLE_BA_2024-05-31_2024-04-17_2024-04-27_185.0_EOD',\n", - " 'SINGLE_NVDA_2024-12-20_2024-07-12_2024-07-22_84.0_EOD',\n", - " 'SINGLE_COST_2024-12-20_2024-03-01_2024-03-11_725.0_EOD',\n", - " 'SINGLE_TSLA_2025-09-19_2024-09-10_2024-09-20_395.0_EOD',\n", - " 'SINGLE_META_2026-06-18_2024-09-13_2024-09-23_590.0_EOD',\n", - " 'SINGLE_NFLX_2025-03-21_2024-11-14_2024-11-24_730.0_EOD',\n", - " 'SINGLE_SBUX_2024-05-31_2024-04-25_2024-05-05_85.0_EOD',\n", - " 'SINGLE_AAPL_2025-09-19_2024-12-06_2024-12-16_225.0_EOD',\n", - " 'SINGLE_AMD_2024-12-20_2024-12-09_2024-12-19_150.0_EOD',\n", - " 'SINGLE_AMZN_2024-09-20_2024-09-12_2024-09-22_235.0_EOD',\n", - " 'SINGLE_BA_2025-12-19_2024-04-17_2024-04-27_240.0_EOD',\n", - " 'SINGLE_NVDA_2025-09-19_2024-07-12_2024-07-22_168.0_EOD',\n", - " 'SINGLE_COST_2024-05-17_2024-03-01_2024-03-11_695.0_EOD',\n", - " 'SINGLE_TSLA_2024-10-25_2024-09-10_2024-09-20_200.0_EOD',\n", - " 'SINGLE_META_2026-06-18_2024-09-13_2024-09-23_880.0_EOD',\n", - " 'SINGLE_NFLX_2024-12-06_2024-11-14_2024-11-24_695.0_EOD',\n", - " 'SINGLE_SBUX_2024-05-24_2024-04-25_2024-05-05_101.0_EOD',\n", - " 'BULK_AAPL_2025-09-19_2024-12-06_2024-12-16_EOD',\n", - " 'BULK_AMD_2025-06-20_2024-12-09_2024-12-19_EOD',\n", - " 'BULK_AMZN_2024-09-20_2024-09-12_2024-09-22_EOD',\n", - " 'BULK_BA_2025-12-19_2024-04-17_2024-04-27_EOD',\n", - " 'BULK_NVDA_2026-01-16_2024-07-12_2024-07-22_EOD',\n", - " 'BULK_COST_2024-03-15_2024-03-01_2024-03-11_EOD',\n", - " 'BULK_TSLA_2024-10-11_2024-09-10_2024-09-20_EOD',\n", - " 'BULK_META_2024-09-27_2024-09-13_2024-09-23_EOD',\n", - " 'BULK_NFLX_2024-11-29_2024-11-14_2024-11-24_EOD',\n", - " 'BULK_SBUX_2025-03-21_2024-04-25_2024-05-05_EOD',\n", - " 'BULK_AAPL_2024-12-06_2024-12-06_2024-12-16_EOD',\n", - " 'BULK_AMD_2025-01-24_2024-12-09_2024-12-19_EOD',\n", - " 'BULK_AMZN_2025-02-21_2024-09-12_2024-09-22_EOD',\n", - " 'BULK_BA_2024-05-24_2024-04-17_2024-04-27_EOD',\n", - " 'BULK_NVDA_2024-11-15_2024-07-12_2024-07-22_EOD',\n", - " 'BULK_COST_2024-03-15_2024-03-01_2024-03-11_EOD',\n", - " 'BULK_TSLA_2024-09-27_2024-09-10_2024-09-20_EOD',\n", - " 'BULK_META_2024-11-15_2024-09-13_2024-09-23_EOD',\n", - " 'BULK_NFLX_2025-08-15_2024-11-14_2024-11-24_EOD',\n", - " 'BULK_SBUX_2024-04-26_2024-04-25_2024-05-05_EOD',\n", - " 'BULK_AAPL_2025-02-21_2024-12-06_2024-12-16_EOD',\n", - " 'BULK_AMD_2025-01-17_2024-12-09_2024-12-19_EOD',\n", - " 'BULK_AMZN_2024-10-11_2024-09-12_2024-09-22_EOD',\n", - " 'BULK_BA_2026-06-18_2024-04-17_2024-04-27_EOD',\n", - " 'BULK_NVDA_2024-07-26_2024-07-12_2024-07-22_EOD',\n", - " 'BULK_COST_2024-07-19_2024-03-01_2024-03-11_EOD',\n", - " 'BULK_TSLA_2025-09-19_2024-09-10_2024-09-20_EOD',\n", - " 'BULK_META_2025-06-20_2024-09-13_2024-09-23_EOD',\n", - " 'BULK_NFLX_2025-12-19_2024-11-14_2024-11-24_EOD',\n", - " 'BULK_SBUX_2024-05-31_2024-04-25_2024-05-05_EOD',\n", - " 'BULK_AAPL_2024-01-19_2023-02-03_2023-12-29_EOD',\n", - " 'SINGLE_AAPL_2024-01-19_2023-02-03_2023-02-03_170.0_EOD',\n", - " 'SINGLE_AAPL_2024-01-19_2023-02-03_2023-02-03_175.0_EOD',\n", - " 'SINGLE_AAPL_2024-01-19_2023-02-04_2023-02-04_170.0_EOD',\n", - " 'SINGLE_AAPL_2024-01-19_2023-02-05_2023-02-05_170.0_EOD',\n", - " 'SINGLE_AAPL_2024-01-19_2023-02-02_2023-02-02_170.0_EOD',\n", - " 'SINGLE_AAPL_2024-01-19_2023-02-02_2023-02-02_175.0_EOD',\n", - " 'SINGLE_AAPL_2024-01-19_2023-02-03_2023-12-29_170.0_EOD',\n", - " 'SINGLE_AAPL_2024-01-19_2023-02-03_2023-12-29_175.0_EOD',\n", - " 'SINGLE_AAPL_2024-01-19_2023-02-02_2023-02-03_170.0_EOD',\n", - " 'SINGLE_SBUX_2025-01-17_2024-01-17_2024-01-27_105.0_EOD',\n", - " 'BULK_AAPL_2025-03-21_2024-11-15_2024-11-25_EOD',\n", - " 'BULK_SBUX_2024-02-09_2024-01-17_2024-01-27_EOD',\n", - " 'BULK_AAPL_2025-08-15_2024-11-15_2024-11-25_EOD',\n", - " 'BULK_AMD_2025-03-21_2024-10-23_2024-11-02_EOD',\n", - " 'BULK_AMZN_2024-04-05_2024-03-06_2024-03-16_EOD',\n", - " 'BULK_BA_2024-06-21_2024-06-11_2024-06-21_EOD',\n", - " 'BULK_NVDA_2025-12-19_2024-03-01_2024-03-11_EOD',\n", - " 'BULK_COST_2025-06-20_2024-10-04_2024-10-14_EOD',\n", - " 'BULK_TSLA_2026-12-18_2024-10-23_2024-11-02_EOD',\n", - " 'BULK_META_2024-11-15_2024-04-01_2024-04-11_EOD',\n", - " 'BULK_NFLX_2024-02-23_2024-01-29_2024-02-08_EOD']" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# construct_current_scheduled_names()\n", - "_SCHEDULED_NAMES" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "from module_test.raw_code.DataManagers.DataManagers import save_to_database\n", - "from module_test.raw_code.DataManagers.Requests import create_request_bulk\n", - "kwargs = {\"exp\": \"2024-05-31 00:00:00\", \"start\": \"2024-04-25 00:00:00\", \"type_\": \"bulk\", \"end\": \"2024-05-05 00:00:00\", \"tick\": \"SBUX\", \"save_func\": \"save_to_database\"}\n", - "kwargs['_requests'] = []\n", - "\n", - "data_req = create_request_bulk(**kwargs)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "data_req" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "save_to_database(data_req, print_info=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'pending_tasks': 0,\n", - " 'max_queue_size': 100,\n", - " 'active_workers': 4,\n", - " 'total_workers': 4,\n", - " 'current_requests': {},\n", - " 'num_finished_requests': 0,\n", - " 'num_failed_requests': 0,\n", - " 'num_failed_initialization': 0}" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "SaveManager.status()" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Name\n" - ] - }, - { - "data": { - "text/plain": [ - "{}" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# BulkOptionDataManager.one_off_save(\n", - "# '2023-10-01', '2023-10-31', 'AAPL', '2024-02-16', False\n", - "# )\n", - "\n", - "class Name:\n", - " def __init__(self):\n", - " print(self.__class__.__name__)\n", - "\n", - " @classmethod\n", - " def class_name(cls):\n", - " print(cls.__class__.__name__)\n", - "\n", - "dude = Name()\n", - "dude.__dict__" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
rootexpirationstrikeright
0AAPL20240419145.0C
1AAPL20240419145.0P
2AAPL20260116210.0P
3AAPL20260116210.0C
4AAPL20240621145.0C
...............
1899AAPL20231103145.0P
1900AAPL20231215145.0P
1901AAPL20231215145.0C
1902AAPL20240216145.0P
1903AAPL20240216145.0C
\n", - "

1904 rows × 4 columns

\n", - "
" - ], - "text/plain": [ - " root expiration strike right\n", - "0 AAPL 20240419 145.0 C\n", - "1 AAPL 20240419 145.0 P\n", - "2 AAPL 20260116 210.0 P\n", - "3 AAPL 20260116 210.0 C\n", - "4 AAPL 20240621 145.0 C\n", - "... ... ... ... ...\n", - "1899 AAPL 20231103 145.0 P\n", - "1900 AAPL 20231215 145.0 P\n", - "1901 AAPL 20231215 145.0 C\n", - "1902 AAPL 20240216 145.0 P\n", - "1903 AAPL 20240216 145.0 C\n", - "\n", - "[1904 rows x 4 columns]" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from dbase.DataAPI.ThetaData import list_contracts\n", - "list_contracts('AAPL', '2023-10-02')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## TEST CHAIN MANAGER" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[get_engine] Creating engine for DB: vol_surface, PID: 2888\n", - "[ProcessSaveManager] is scheduling a request for JPM on {'exp': '2024-09-18', 'start': '2024-09-18', 'end': '2024-09-18', 'tick': 'JPM', 'save_func': functools.partial(), 'type_': 'chain'}\n", - "[ProcessSaveManager] Request JPM on {'exp': '2024-09-18', 'start': '2024-09-18', 'end': '2024-09-18', 'tick': 'JPM', 'save_func': functools.partial(), 'type_': 'chain'} is already scheduled. Ignoring.\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Midpoint
RightCP
ExpirationDTEStrike
2024-09-20265.0142.1750.005
70.0138.4250.005
75.0132.0250.005
80.0127.7250.005
85.0123.1750.005
...............
2027-01-15849260.012.82557.750
270.010.92565.750
280.08.50074.250
290.07.07583.450
300.05.42593.000
\n", - "

863 rows × 2 columns

\n", - "
" - ], - "text/plain": [ - " Midpoint \n", - "Right C P\n", - "Expiration DTE Strike \n", - "2024-09-20 2 65.0 142.175 0.005\n", - " 70.0 138.425 0.005\n", - " 75.0 132.025 0.005\n", - " 80.0 127.725 0.005\n", - " 85.0 123.175 0.005\n", - "... ... ...\n", - "2027-01-15 849 260.0 12.825 57.750\n", - " 270.0 10.925 65.750\n", - " 280.0 8.500 74.250\n", - " 290.0 7.075 83.450\n", - " 300.0 5.425 93.000\n", - "\n", - "[863 rows x 2 columns]" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "chain_manager = ChainDataManager('JPM')\n", - "data = chain_manager.get_at_time('2024-09-18', organize=True).organized_data\n", - "data" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'pending_tasks': 0,\n", - " 'max_queue_size': 100,\n", - " 'active_workers': 4,\n", - " 'total_workers': 4,\n", - " 'current_requests': {},\n", - " 'num_finished_requests': 0,\n", - " 'num_failed_requests': 0,\n", - " 'num_failed_initialization': 0}" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "SaveManager.status()\n", - "# SaveManager._failed_initialization\n", - "\n", - "# req = SaveManager._failed_requests[0]\n", - "# req = SaveManager._finished_requests[0]\n", - "# SaveManager._failed_initialization\n", - "# req" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[]" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "SaveManager._failed_initialization" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "# c = list_contracts('BAC', '2025-04-25')\n", - "# c[c.expiration == 20250919]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## TEST OPTION DATA MANAGER" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "manager = OptionDataManager('BAC', '2025-09-19', 'P', 55.0)\n", - "spot_manager = manager.spot_manager" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[ProcessSaveManager] is scheduling a request for BAC on {'exp': '2025-09-19', 'right': 'P', 'strike': 55.0, 'start': Timestamp('2024-09-25 00:00:00'), 'end': Timestamp('2024-09-25 00:00:00'), 'tick': 'BAC', 'type_': 'single', 'save_func': functools.partial(, print_info=False)}\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
OpenHighLowCloseMidpointVolumeOpeninterestCloseask
Datetime
2024-09-250.00.00.00.016.175051916.75
\n", - "
" - ], - "text/plain": [ - " Open High Low Close Midpoint Volume Openinterest Closeask\n", - "Datetime \n", - "2024-09-25 0.0 0.0 0.0 0.0 16.175 0 519 16.75" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "request_ = manager.get_at_time('2024-09-25', 'spot', return_price=False, model = 'binomial', extra_cols = ['ask'])\n", - "request_" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[ProcessSaveManager] is scheduling a request for BAC on {'exp': '2025-09-19', 'right': 'P', 'strike': 55.0, 'start': Timestamp('2025-03-18 00:00:00'), 'end': Timestamp('2025-03-18 00:00:00'), 'tick': 'BAC', 'type_': 'single', 'save_func': functools.partial(, print_info=False)}\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Binomial_ivMidpoint_binomial_ivAsk_binomial_iv
Datetime
2025-03-180.00.3325260.40674
\n", - "
" - ], - "text/plain": [ - " Binomial_iv Midpoint_binomial_iv Ask_binomial_iv\n", - "Datetime \n", - "2025-03-18 0.0 0.332526 0.40674" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "vol = manager.get_at_time('2025-03-18', 'vol', return_price=False, model = 'binomial', extra_cols = ['ask'])\n", - "vol" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Midpoint
RightCP
ExpirationDTEStrike
2025-04-17222.515.4000.005
23.014.9000.005
23.514.4250.005
24.014.0000.005
25.012.9500.005
...............
2027-06-1779352.52.13015.150
55.01.74017.975
60.01.10521.825
65.00.70527.000
70.00.51532.000
\n", - "

569 rows × 2 columns

\n", - "
" - ], - "text/plain": [ - " Midpoint \n", - "Right C P\n", - "Expiration DTE Strike \n", - "2025-04-17 2 22.5 15.400 0.005\n", - " 23.0 14.900 0.005\n", - " 23.5 14.425 0.005\n", - " 24.0 14.000 0.005\n", - " 25.0 12.950 0.005\n", - "... ... ...\n", - "2027-06-17 793 52.5 2.130 15.150\n", - " 55.0 1.740 17.975\n", - " 60.0 1.105 21.825\n", - " 65.0 0.705 27.000\n", - " 70.0 0.515 32.000\n", - "\n", - "[569 rows x 2 columns]" - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "chain = manager.get_at_time('2025-04-15', 'chain', return_price=True)\n", - "chain" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[ProcessSaveManager] is scheduling a request for BAC on {'exp': '2025-09-19', 'right': 'P', 'strike': 55.0, 'start': Timestamp('2025-03-20 00:00:00'), 'end': Timestamp('2025-03-30 00:00:00'), 'tick': 'BAC', 'type_': 'single', 'save_func': functools.partial(, print_info=False)}\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Binomial_ivMidpoint_binomial_ivAsk_binomial_iv
Datetime
2025-03-200.0000000.0001000.253490
2025-03-210.0000000.2585820.341309
2025-03-240.0000000.2229250.242522
2025-03-250.0000000.3000350.377828
2025-03-260.0000000.0001000.291972
2025-03-270.0000000.0001000.285748
2025-03-280.3196380.2570360.319638
\n", - "
" - ], - "text/plain": [ - " Binomial_iv Midpoint_binomial_iv Ask_binomial_iv\n", - "Datetime \n", - "2025-03-20 0.000000 0.000100 0.253490\n", - "2025-03-21 0.000000 0.258582 0.341309\n", - "2025-03-24 0.000000 0.222925 0.242522\n", - "2025-03-25 0.000000 0.300035 0.377828\n", - "2025-03-26 0.000000 0.000100 0.291972\n", - "2025-03-27 0.000000 0.000100 0.285748\n", - "2025-03-28 0.319638 0.257036 0.319638" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "request = manager.get_timeseries(\n", - " start='2025-03-20',\n", - " end='2025-03-30',\n", - " interval='1d',\n", - " type_='vol',\n", - " model='binomial',\n", - " extra_cols=['ask']\n", - ")\n", - "request.post_processed_data" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## TEST BULK DATAMANAGERS" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [], - "source": [ - "bulk_manager = BulkOptionDataManager('AAPL', '2025-04-25', default_fill = 'midpoint')\n", - "bulk_manager.print_info = True" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[ProcessSaveManager] is scheduling a request for AAPL on {'exp': '2025-04-25', 'start': Timestamp('2025-03-27 00:00:00'), 'type_': 'bulk', 'end': Timestamp('2025-04-05 00:00:00'), 'tick': 'AAPL', 'save_func': functools.partial(, print_info=True)}\n", - "2025-04-30 17:44:29 dbase.DataAPI.ThetaData CRITICAL: `datetime_col_name` not provided for multi index resample, setting to `Datetime`\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
OpenHighLowCloseMidpointVolumeOpeninterestCloseask
OptiontickDatetime
AAPL20250425C2252025-03-274.906.564.566.056.150674108206.30
2025-03-285.005.943.483.483.500520109623.55
2025-03-313.486.153.205.305.2251130110115.35
2025-04-014.455.753.915.435.425737112805.50
2025-04-024.706.104.605.715.650629113405.80
2025-04-031.061.200.771.111.1103084113521.15
2025-04-040.601.080.440.500.5402547118640.64
AAPL20250425C2702025-03-270.060.060.060.060.04061600.07
2025-03-280.060.060.030.040.050261660.06
2025-03-310.020.020.020.020.04011560.06
2025-04-010.030.030.030.030.03521570.04
2025-04-020.000.000.000.000.02501590.03
2025-04-030.060.060.010.010.01051590.02
2025-04-040.000.000.000.000.30001640.60
AAPL20250425C2802025-03-270.000.000.000.000.1300900.25
2025-03-280.000.000.000.000.0350900.05
2025-03-310.020.020.020.020.0101900.02
2025-04-010.000.000.000.000.0100910.02
2025-04-020.020.030.020.030.0255910.03
2025-04-030.020.030.020.030.01510860.03
2025-04-040.000.000.000.000.0150960.03
AAPL20250425P2502025-03-2725.6026.3025.4526.3026.1751455526.80
2025-03-2828.3032.4528.3032.4032.1751125732.75
2025-03-310.000.000.000.0028.6000229.70
2025-04-010.000.000.000.0026.8750227.50
2025-04-0225.7525.7525.7525.7526.6501227.60
2025-04-0347.1547.1546.9546.9547.0754348.95
2025-04-0458.8258.8258.8258.8261.50010263.55
AAPL20250425P2702025-03-2746.2146.2146.1046.1045.6502046.75
2025-03-280.000.000.000.0051.5750052.90
2025-03-310.000.000.000.0048.6250049.75
2025-04-010.000.000.000.0046.9250047.40
2025-04-020.000.000.000.0046.1000046.55
2025-04-030.000.000.000.0067.0500068.95
2025-04-040.000.000.000.0081.5000083.55
\n", - "
" - ], - "text/plain": [ - " Open High ... Openinterest Closeask\n", - "Optiontick Datetime ... \n", - "AAPL20250425C225 2025-03-27 4.90 6.56 ... 10820 6.30\n", - " 2025-03-28 5.00 5.94 ... 10962 3.55\n", - " 2025-03-31 3.48 6.15 ... 11011 5.35\n", - " 2025-04-01 4.45 5.75 ... 11280 5.50\n", - " 2025-04-02 4.70 6.10 ... 11340 5.80\n", - " 2025-04-03 1.06 1.20 ... 11352 1.15\n", - " 2025-04-04 0.60 1.08 ... 11864 0.64\n", - "AAPL20250425C270 2025-03-27 0.06 0.06 ... 160 0.07\n", - " 2025-03-28 0.06 0.06 ... 166 0.06\n", - " 2025-03-31 0.02 0.02 ... 156 0.06\n", - " 2025-04-01 0.03 0.03 ... 157 0.04\n", - " 2025-04-02 0.00 0.00 ... 159 0.03\n", - " 2025-04-03 0.06 0.06 ... 159 0.02\n", - " 2025-04-04 0.00 0.00 ... 164 0.60\n", - "AAPL20250425C280 2025-03-27 0.00 0.00 ... 90 0.25\n", - " 2025-03-28 0.00 0.00 ... 90 0.05\n", - " 2025-03-31 0.02 0.02 ... 90 0.02\n", - " 2025-04-01 0.00 0.00 ... 91 0.02\n", - " 2025-04-02 0.02 0.03 ... 91 0.03\n", - " 2025-04-03 0.02 0.03 ... 86 0.03\n", - " 2025-04-04 0.00 0.00 ... 96 0.03\n", - "AAPL20250425P250 2025-03-27 25.60 26.30 ... 55 26.80\n", - " 2025-03-28 28.30 32.45 ... 57 32.75\n", - " 2025-03-31 0.00 0.00 ... 2 29.70\n", - " 2025-04-01 0.00 0.00 ... 2 27.50\n", - " 2025-04-02 25.75 25.75 ... 2 27.60\n", - " 2025-04-03 47.15 47.15 ... 3 48.95\n", - " 2025-04-04 58.82 58.82 ... 2 63.55\n", - "AAPL20250425P270 2025-03-27 46.21 46.21 ... 0 46.75\n", - " 2025-03-28 0.00 0.00 ... 0 52.90\n", - " 2025-03-31 0.00 0.00 ... 0 49.75\n", - " 2025-04-01 0.00 0.00 ... 0 47.40\n", - " 2025-04-02 0.00 0.00 ... 0 46.55\n", - " 2025-04-03 0.00 0.00 ... 0 68.95\n", - " 2025-04-04 0.00 0.00 ... 0 83.55\n", - "\n", - "[35 rows x 8 columns]" - ] - }, - "execution_count": 36, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "request = bulk_manager.get_timeseries(\n", - " start='2025-03-27',\n", - " end='2025-04-05',\n", - " interval='1d',\n", - " type_='spot',\n", - " model='binomial',\n", - " extra_cols=['ask'],\n", - " strikes_right = [(280.0, 'C'), (270.0, 'P'), (225.0, 'C'), (270.0, 'C'), (250.0, 'P') ]\n", - ")\n", - "request.post_processed_data" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# RANDOM TESTS" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [], - "source": [ - "import json\n", - "with open('/Users/chiemelienwanisobi/Documents/GitHub/stop-loss-script/Randoms/trading_universe.json', 'r') as f:\n", - " trading_universe = json.load(f)\n", - "ticks = trading_universe['REDUCED5']" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([Timestamp('2024-08-22 00:00:00'), Timestamp('2024-09-25 00:00:00'),\n", - " Timestamp('2024-09-24 00:00:00'), Timestamp('2024-04-23 00:00:00'),\n", - " Timestamp('2024-08-16 00:00:00'), Timestamp('2024-03-20 00:00:00'),\n", - " Timestamp('2024-05-08 00:00:00'), Timestamp('2024-06-06 00:00:00'),\n", - " Timestamp('2024-06-07 00:00:00'), Timestamp('2024-11-18 00:00:00')],\n", - " dtype=object)" - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import numpy as np\n", - "from dbase.utils import bus_range\n", - "import time\n", - "import pandas as pd\n", - "from trade.assets.Stock import Stock\n", - "from IPython.display import clear_output\n", - "date_range = np.array(bus_range('2024-01-01', '2024-12-31', freq='1b'))\n", - "dates = date_range[np.random.randint(0, len(date_range), len(ticks))]\n", - "dates" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [], - "source": [ - "chain_managers = {}\n", - "chains = {}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## LET'S TEST RANDOM CHAIN QUERIES" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Testing Chain Request for AAPL on 2024-08-22\n", - "[ProcessSaveManager] is scheduling a request for AAPL on {'exp': Timestamp('2024-08-22 00:00:00'), 'start': Timestamp('2024-08-22 00:00:00'), 'end': Timestamp('2024-08-22 00:00:00'), 'tick': 'AAPL', 'save_func': functools.partial(), 'type_': 'chain'}\n", - "Data Retrieved Successfully\n", - "Testing Chain Request for AMD on 2024-09-25\n", - "2025-04-30 17:44:49 trade.asset.Stock ERROR: Error getting dividends history for AMD from yfinance\n", - "2025-04-30 17:44:49 trade.asset.Stock ERROR: Probably due to no dividends history\n", - "2025-04-30 17:45:11 trade.asset.Stock ERROR: Error getting dividends history for AMD from yfinance\n", - "2025-04-30 17:45:11 trade.asset.Stock ERROR: Probably due to no dividends history\n", - "[ProcessSaveManager] is scheduling a request for AMD on {'exp': Timestamp('2024-09-25 00:00:00'), 'start': Timestamp('2024-09-25 00:00:00'), 'end': Timestamp('2024-09-25 00:00:00'), 'tick': 'AMD', 'save_func': functools.partial(), 'type_': 'chain'}\n", - "Data Retrieved Successfully\n", - "Testing Chain Request for AMZN on 2024-09-24\n", - "2025-04-30 17:45:13 trade.asset.Stock ERROR: Error getting dividends history for AMZN from yfinance\n", - "2025-04-30 17:45:13 trade.asset.Stock ERROR: Probably due to no dividends history\n", - "2025-04-30 17:45:32 trade.asset.Stock ERROR: Error getting dividends history for AMZN from yfinance\n", - "2025-04-30 17:45:32 trade.asset.Stock ERROR: Probably due to no dividends history\n", - "[ProcessSaveManager] is scheduling a request for AMZN on {'exp': Timestamp('2024-09-24 00:00:00'), 'start': Timestamp('2024-09-24 00:00:00'), 'end': Timestamp('2024-09-24 00:00:00'), 'tick': 'AMZN', 'save_func': functools.partial(), 'type_': 'chain'}\n", - "Data Retrieved Successfully\n", - "Testing Chain Request for BA on 2024-04-23\n", - "[ProcessSaveManager] is scheduling a request for BA on {'exp': Timestamp('2024-04-23 00:00:00'), 'start': Timestamp('2024-04-23 00:00:00'), 'end': Timestamp('2024-04-23 00:00:00'), 'tick': 'BA', 'save_func': functools.partial(), 'type_': 'chain'}\n", - "Data Retrieved Successfully\n", - "Testing Chain Request for NVDA on 2024-08-16\n", - "[ProcessSaveManager] is scheduling a request for NVDA on {'exp': Timestamp('2024-08-16 00:00:00'), 'start': Timestamp('2024-08-16 00:00:00'), 'end': Timestamp('2024-08-16 00:00:00'), 'tick': 'NVDA', 'save_func': functools.partial(), 'type_': 'chain'}\n", - "Data Retrieved Successfully\n", - "Testing Chain Request for COST on 2024-03-20\n", - "[ProcessSaveManager] is scheduling a request for COST on {'exp': Timestamp('2024-03-20 00:00:00'), 'start': Timestamp('2024-03-20 00:00:00'), 'end': Timestamp('2024-03-20 00:00:00'), 'tick': 'COST', 'save_func': functools.partial(), 'type_': 'chain'}\n", - "Data Retrieved Successfully\n", - "Testing Chain Request for TSLA on 2024-05-08\n", - "2025-04-30 17:47:29 trade.asset.Stock ERROR: Error getting dividends history for TSLA from yfinance\n", - "2025-04-30 17:47:29 trade.asset.Stock ERROR: Probably due to no dividends history\n", - "2025-04-30 17:47:47 trade.asset.Stock ERROR: Error getting dividends history for TSLA from yfinance\n", - "2025-04-30 17:47:47 trade.asset.Stock ERROR: Probably due to no dividends history\n", - "[ProcessSaveManager] is scheduling a request for TSLA on {'exp': Timestamp('2024-05-08 00:00:00'), 'start': Timestamp('2024-05-08 00:00:00'), 'end': Timestamp('2024-05-08 00:00:00'), 'tick': 'TSLA', 'save_func': functools.partial(), 'type_': 'chain'}\n", - "Data Retrieved Successfully\n", - "Testing Chain Request for META on 2024-06-06\n", - "[ProcessSaveManager] is scheduling a request for META on {'exp': Timestamp('2024-06-06 00:00:00'), 'start': Timestamp('2024-06-06 00:00:00'), 'end': Timestamp('2024-06-06 00:00:00'), 'tick': 'META', 'save_func': functools.partial(), 'type_': 'chain'}\n", - "Data Retrieved Successfully\n", - "Testing Chain Request for NFLX on 2024-06-07\n", - "2025-04-30 17:48:29 trade.asset.Stock ERROR: Error getting dividends history for NFLX from yfinance\n", - "2025-04-30 17:48:29 trade.asset.Stock ERROR: Probably due to no dividends history\n", - "2025-04-30 17:48:46 trade.asset.Stock ERROR: Error getting dividends history for NFLX from yfinance\n", - "2025-04-30 17:48:46 trade.asset.Stock ERROR: Probably due to no dividends history\n", - "[ProcessSaveManager] is scheduling a request for NFLX on {'exp': Timestamp('2024-06-07 00:00:00'), 'start': Timestamp('2024-06-07 00:00:00'), 'end': Timestamp('2024-06-07 00:00:00'), 'tick': 'NFLX', 'save_func': functools.partial(), 'type_': 'chain'}\n", - "Data Retrieved Successfully\n", - "Testing Chain Request for SBUX on 2024-11-18\n", - "[ProcessSaveManager] is scheduling a request for SBUX on {'exp': Timestamp('2024-11-18 00:00:00'), 'start': Timestamp('2024-11-18 00:00:00'), 'end': Timestamp('2024-11-18 00:00:00'), 'tick': 'SBUX', 'save_func': functools.partial(), 'type_': 'chain'}\n", - "Data Retrieved Successfully\n" - ] - } - ], - "source": [ - "\n", - "for tick, date in zip(ticks, dates):\n", - " if tick in chain_managers:\n", - " continue\n", - " print(f\"Testing Chain Request for {tick} on {date.strftime('%Y-%m-%d')}\")\n", - " chain_managers[tick] = ChainDataManager(tick)\n", - " data = chain_managers[tick].get_at_time(date, organize=True).organized_data\n", - " chains[tick] = data\n", - " print(\"Data Retrieved Successfully\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## CHAIN QUERY IS DONE! LET'S TEST SPOT FOR OPTIONDATAMANAGER" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### EOD SPOT" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [], - "source": [ - "data_managers = {}\n", - "eod_data = {\n", - " 'spot': {},\n", - " 'vol': {},\n", - " 'delta': {},\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Testing Option Request for AAPL on 2024-08-22\n", - "Option Info for AAPL on 2024-08-22: Strike 207.5, Expiration 2024-09-20 00:00:00, Right P\n", - "Start Date: 2024-08-22, End Date: 2024-10-21\n", - "[ProcessSaveManager] is scheduling a request for AAPL on {'exp': Timestamp('2024-09-20 00:00:00'), 'right': 'P', 'strike': 207.5, 'start': Timestamp('2024-08-22 00:00:00'), 'end': Timestamp('2024-10-21 00:00:00'), 'tick': 'AAPL', 'type_': 'single', 'save_func': functools.partial(, print_info=False)}\n", - "Spot Data Retrieved Successfully\n", - "Testing Option Request for AMD on 2024-09-25\n", - "Option Info for AMD on 2024-09-25: Strike 280.0, Expiration 2025-12-19 00:00:00, Right P\n", - "Start Date: 2024-09-25, End Date: 2024-11-24\n", - "[ProcessSaveManager] is scheduling a request for AMD on {'exp': Timestamp('2025-12-19 00:00:00'), 'right': 'P', 'strike': 280.0, 'start': Timestamp('2024-09-25 00:00:00'), 'end': Timestamp('2024-11-24 00:00:00'), 'tick': 'AMD', 'type_': 'single', 'save_func': functools.partial(, print_info=False)}\n", - "Spot Data Retrieved Successfully\n", - "Testing Option Request for AMZN on 2024-09-24\n", - "Option Info for AMZN on 2024-09-24: Strike 100.0, Expiration 2025-08-15 00:00:00, Right C\n", - "Start Date: 2024-09-24, End Date: 2024-11-23\n", - "[ProcessSaveManager] is scheduling a request for AMZN on {'exp': Timestamp('2025-08-15 00:00:00'), 'right': 'C', 'strike': 100.0, 'start': Timestamp('2024-09-24 00:00:00'), 'end': Timestamp('2024-11-23 00:00:00'), 'tick': 'AMZN', 'type_': 'single', 'save_func': functools.partial(, print_info=False)}\n", - "Spot Data Retrieved Successfully\n", - "Testing Option Request for BA on 2024-04-23\n", - "Option Info for BA on 2024-04-23: Strike 200.0, Expiration 2024-05-24 00:00:00, Right C\n", - "Start Date: 2024-04-23, End Date: 2024-06-22\n", - "[ProcessSaveManager] is scheduling a request for BA on {'exp': Timestamp('2024-05-24 00:00:00'), 'right': 'C', 'strike': 200.0, 'start': Timestamp('2024-04-23 00:00:00'), 'end': Timestamp('2024-06-22 00:00:00'), 'tick': 'BA', 'type_': 'single', 'save_func': functools.partial(, print_info=False)}\n", - "Spot Data Retrieved Successfully\n", - "Testing Option Request for NVDA on 2024-08-16\n", - "Option Info for NVDA on 2024-08-16: Strike 94.0, Expiration 2025-09-19 00:00:00, Right P\n", - "Start Date: 2024-08-16, End Date: 2024-10-15\n", - "[ProcessSaveManager] is scheduling a request for NVDA on {'exp': Timestamp('2025-09-19 00:00:00'), 'right': 'P', 'strike': 94.0, 'start': Timestamp('2024-08-16 00:00:00'), 'end': Timestamp('2024-10-15 00:00:00'), 'tick': 'NVDA', 'type_': 'single', 'save_func': functools.partial(, print_info=False)}\n", - "Spot Data Retrieved Successfully\n", - "Testing Option Request for COST on 2024-03-20\n", - "Option Info for COST on 2024-03-20: Strike 825.0, Expiration 2024-06-21 00:00:00, Right P\n", - "Start Date: 2024-03-20, End Date: 2024-05-19\n", - "[ProcessSaveManager] is scheduling a request for COST on {'exp': Timestamp('2024-06-21 00:00:00'), 'right': 'P', 'strike': 825.0, 'start': Timestamp('2024-03-20 00:00:00'), 'end': Timestamp('2024-05-19 00:00:00'), 'tick': 'COST', 'type_': 'single', 'save_func': functools.partial(, print_info=False)}\n", - "Spot Data Retrieved Successfully\n", - "Testing Option Request for TSLA on 2024-05-08\n", - "Option Info for TSLA on 2024-05-08: Strike 60.0, Expiration 2024-09-20 00:00:00, Right P\n", - "Start Date: 2024-05-08, End Date: 2024-07-07\n", - "[ProcessSaveManager] is scheduling a request for TSLA on {'exp': Timestamp('2024-09-20 00:00:00'), 'right': 'P', 'strike': 60.0, 'start': Timestamp('2024-05-08 00:00:00'), 'end': Timestamp('2024-07-07 00:00:00'), 'tick': 'TSLA', 'type_': 'single', 'save_func': functools.partial(, print_info=False)}\n", - "Spot Data Retrieved Successfully\n", - "Testing Option Request for META on 2024-06-06\n", - "Option Info for META on 2024-06-06: Strike 630.0, Expiration 2026-01-16 00:00:00, Right P\n", - "Start Date: 2024-06-06, End Date: 2024-08-05\n", - "[ProcessSaveManager] is scheduling a request for META on {'exp': Timestamp('2026-01-16 00:00:00'), 'right': 'P', 'strike': 630.0, 'start': Timestamp('2024-06-06 00:00:00'), 'end': Timestamp('2024-08-05 00:00:00'), 'tick': 'META', 'type_': 'single', 'save_func': functools.partial(, print_info=False)}\n", - "Spot Data Retrieved Successfully\n", - "Testing Option Request for NFLX on 2024-06-07\n", - "Option Info for NFLX on 2024-06-07: Strike 500.0, Expiration 2026-12-18 00:00:00, Right C\n", - "Start Date: 2024-06-07, End Date: 2024-08-06\n", - "[ProcessSaveManager] is scheduling a request for NFLX on {'exp': Timestamp('2026-12-18 00:00:00'), 'right': 'C', 'strike': 500.0, 'start': Timestamp('2024-06-07 00:00:00'), 'end': Timestamp('2024-08-06 00:00:00'), 'tick': 'NFLX', 'type_': 'single', 'save_func': functools.partial(, print_info=False)}\n", - "Spot Data Retrieved Successfully\n", - "Testing Option Request for SBUX on 2024-11-18\n", - "Option Info for SBUX on 2024-11-18: Strike 85.0, Expiration 2024-12-06 00:00:00, Right P\n", - "Start Date: 2024-11-18, End Date: 2025-01-17\n", - "[ProcessSaveManager] is scheduling a request for SBUX on {'exp': Timestamp('2024-12-06 00:00:00'), 'right': 'P', 'strike': 85.0, 'start': Timestamp('2024-11-18 00:00:00'), 'end': Timestamp('2025-01-17 00:00:00'), 'tick': 'SBUX', 'type_': 'single', 'save_func': functools.partial(, print_info=False)}\n", - "Spot Data Retrieved Successfully\n" - ] - } - ], - "source": [ - "\n", - "for tick in ticks:\n", - " if tick in data_managers:\n", - " continue\n", - " print(f\"Testing Option Request for {tick} on {dates[ticks.index(tick)].strftime('%Y-%m-%d')}\")\n", - " tick_chain = chains[tick].reset_index() ## Using saved chain data\n", - " expirations = tick_chain['Expiration'].unique()\n", - " random_exp = expirations[np.random.randint(0, len(expirations), 1)[0]] ## Random expiration date from the chain\n", - " exp_filtered_chain = tick_chain[tick_chain['Expiration'] == random_exp].dropna()\n", - " strikes = exp_filtered_chain['Strike'].unique()\n", - " random_strike = strikes[np.random.randint(0, len(strikes), 1)[0]] ## Random strike price from the chain\n", - " rights = ['P', 'C']\n", - " random_right = rights[np.random.randint(0, len(rights), 1)[0]] ## Random right from the chain\n", - " manager = OptionDataManager(tick, random_exp, random_right, random_strike)\n", - " data_managers[tick] = manager\n", - " start = dates[ticks.index(tick)] ## Start date will be the same as the date of the chain\n", - " end = pd.Timestamp(start) + pd.DateOffset(days=60) ## End date will be the 30 days after the expiration date\n", - " start, end\n", - " \n", - " print(f\"Option Info for {tick} on {dates[ticks.index(tick)].strftime('%Y-%m-%d')}: Strike {random_strike}, Expiration {random_exp}, Right {random_right}\")\n", - " print(f\"Start Date: {start.strftime('%Y-%m-%d')}, End Date: {end.strftime('%Y-%m-%d')}\")\n", - " request = manager.get_timeseries(\n", - " start=start,\n", - " end=end,\n", - " interval='1d',\n", - " type_='spot',\n", - " model='binomial',\n", - " extra_cols=['ask']\n", - " )\n", - " eod_data['spot'][tick] = request.post_processed_data\n", - " print(\"Spot Data Retrieved Successfully\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### EOD VOL" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Testing Option Request for AAPL on 2024-08-22\n", - "Option Info for AAPL on 2024-08-22: Strike 85.0, Expiration 2025-06-20 00:00:00, Right P\n", - "Start Date: 2024-08-22, End Date: 2024-10-21\n", - "[ProcessSaveManager] is scheduling a request for AAPL on {'exp': Timestamp('2025-06-20 00:00:00'), 'right': 'P', 'strike': 85.0, 'start': Timestamp('2024-08-22 00:00:00'), 'end': Timestamp('2024-10-21 00:00:00'), 'tick': 'AAPL', 'type_': 'single', 'save_func': functools.partial(, print_info=False)}\n", - "Spot Data Retrieved Successfully\n", - "\n", - "\n", - "Testing Option Request for AMD on 2024-09-25\n", - "Option Info for AMD on 2024-09-25: Strike 215.0, Expiration 2024-10-11 00:00:00, Right C\n", - "Start Date: 2024-09-25, End Date: 2024-11-24\n", - "[ProcessSaveManager] is scheduling a request for AMD on {'exp': Timestamp('2024-10-11 00:00:00'), 'right': 'C', 'strike': 215.0, 'start': Timestamp('2024-09-25 00:00:00'), 'end': Timestamp('2024-11-24 00:00:00'), 'tick': 'AMD', 'type_': 'single', 'save_func': functools.partial(, print_info=False)}\n", - "2025-04-30 17:49:48 trade.asset.Stock ERROR: Error getting dividends history for AMD from yfinance\n", - "2025-04-30 17:49:48 trade.asset.Stock ERROR: Probably due to no dividends history\n", - "Spot Data Retrieved Successfully\n", - "\n", - "\n", - "Testing Option Request for AMZN on 2024-09-24\n", - "Option Info for AMZN on 2024-09-24: Strike 245.0, Expiration 2025-09-19 00:00:00, Right P\n", - "Start Date: 2024-09-24, End Date: 2024-11-23\n", - "[ProcessSaveManager] is scheduling a request for AMZN on {'exp': Timestamp('2025-09-19 00:00:00'), 'right': 'P', 'strike': 245.0, 'start': Timestamp('2024-09-24 00:00:00'), 'end': Timestamp('2024-11-23 00:00:00'), 'tick': 'AMZN', 'type_': 'single', 'save_func': functools.partial(, print_info=False)}\n", - "2025-04-30 17:49:56 trade.asset.Stock ERROR: Error getting dividends history for AMZN from yfinance\n", - "2025-04-30 17:49:56 trade.asset.Stock ERROR: Probably due to no dividends history\n", - "Spot Data Retrieved Successfully\n", - "\n", - "\n", - "Testing Option Request for BA on 2024-04-23\n", - "Option Info for BA on 2024-04-23: Strike 275.0, Expiration 2025-03-21 00:00:00, Right P\n", - "Start Date: 2024-04-23, End Date: 2024-06-22\n", - "[ProcessSaveManager] is scheduling a request for BA on {'exp': Timestamp('2025-03-21 00:00:00'), 'right': 'P', 'strike': 275.0, 'start': Timestamp('2024-04-23 00:00:00'), 'end': Timestamp('2024-06-22 00:00:00'), 'tick': 'BA', 'type_': 'single', 'save_func': functools.partial(, print_info=False)}\n", - "Spot Data Retrieved Successfully\n", - "\n", - "\n", - "Testing Option Request for NVDA on 2024-08-16\n", - "Option Info for NVDA on 2024-08-16: Strike 85.0, Expiration 2025-08-15 00:00:00, Right P\n", - "Start Date: 2024-08-16, End Date: 2024-10-15\n", - "[ProcessSaveManager] is scheduling a request for NVDA on {'exp': Timestamp('2025-08-15 00:00:00'), 'right': 'P', 'strike': 85.0, 'start': Timestamp('2024-08-16 00:00:00'), 'end': Timestamp('2024-10-15 00:00:00'), 'tick': 'NVDA', 'type_': 'single', 'save_func': functools.partial(, print_info=False)}\n", - "Spot Data Retrieved Successfully\n", - "\n", - "\n", - "Testing Option Request for COST on 2024-03-20\n", - "Option Info for COST on 2024-03-20: Strike 690.0, Expiration 2024-06-21 00:00:00, Right C\n", - "Start Date: 2024-03-20, End Date: 2024-05-19\n", - "[ProcessSaveManager] is scheduling a request for COST on {'exp': Timestamp('2024-06-21 00:00:00'), 'right': 'C', 'strike': 690.0, 'start': Timestamp('2024-03-20 00:00:00'), 'end': Timestamp('2024-05-19 00:00:00'), 'tick': 'COST', 'type_': 'single', 'save_func': functools.partial(, print_info=False)}\n", - "Spot Data Retrieved Successfully\n", - "\n", - "\n", - "Testing Option Request for TSLA on 2024-05-08\n", - "Option Info for TSLA on 2024-05-08: Strike 485.0, Expiration 2024-07-19 00:00:00, Right P\n", - "Start Date: 2024-05-08, End Date: 2024-07-07\n", - "[ProcessSaveManager] is scheduling a request for TSLA on {'exp': Timestamp('2024-07-19 00:00:00'), 'right': 'P', 'strike': 485.0, 'start': Timestamp('2024-05-08 00:00:00'), 'end': Timestamp('2024-07-07 00:00:00'), 'tick': 'TSLA', 'type_': 'single', 'save_func': functools.partial(, print_info=False)}\n", - "2025-04-30 17:50:20 trade.asset.Stock ERROR: Error getting dividends history for TSLA from yfinance\n", - "2025-04-30 17:50:20 trade.asset.Stock ERROR: Probably due to no dividends history\n", - "Spot Data Retrieved Successfully\n", - "\n", - "\n", - "Testing Option Request for META on 2024-06-06\n", - "Option Info for META on 2024-06-06: Strike 415.0, Expiration 2024-07-26 00:00:00, Right P\n", - "Start Date: 2024-06-06, End Date: 2024-08-05\n", - "[ProcessSaveManager] is scheduling a request for META on {'exp': Timestamp('2024-07-26 00:00:00'), 'right': 'P', 'strike': 415.0, 'start': Timestamp('2024-06-06 00:00:00'), 'end': Timestamp('2024-08-05 00:00:00'), 'tick': 'META', 'type_': 'single', 'save_func': functools.partial(, print_info=False)}\n", - "Spot Data Retrieved Successfully\n", - "\n", - "\n", - "Testing Option Request for NFLX on 2024-06-07\n", - "Option Info for NFLX on 2024-06-07: Strike 655.0, Expiration 2024-07-05 00:00:00, Right P\n", - "Start Date: 2024-06-07, End Date: 2024-08-06\n", - "[ProcessSaveManager] is scheduling a request for NFLX on {'exp': Timestamp('2024-07-05 00:00:00'), 'right': 'P', 'strike': 655.0, 'start': Timestamp('2024-06-07 00:00:00'), 'end': Timestamp('2024-08-06 00:00:00'), 'tick': 'NFLX', 'type_': 'single', 'save_func': functools.partial(, print_info=False)}\n", - "2025-04-30 17:50:28 trade.asset.Stock ERROR: Error getting dividends history for NFLX from yfinance\n", - "2025-04-30 17:50:28 trade.asset.Stock ERROR: Probably due to no dividends history\n", - "Spot Data Retrieved Successfully\n", - "\n", - "\n", - "Testing Option Request for SBUX on 2024-11-18\n", - "Option Info for SBUX on 2024-11-18: Strike 100.0, Expiration 2025-03-21 00:00:00, Right P\n", - "Start Date: 2024-11-18, End Date: 2025-01-17\n", - "[ProcessSaveManager] is scheduling a request for SBUX on {'exp': Timestamp('2025-03-21 00:00:00'), 'right': 'P', 'strike': 100.0, 'start': Timestamp('2024-11-18 00:00:00'), 'end': Timestamp('2025-01-17 00:00:00'), 'tick': 'SBUX', 'type_': 'single', 'save_func': functools.partial(, print_info=False)}\n", - "Spot Data Retrieved Successfully\n", - "\n", - "\n" - ] - } - ], - "source": [ - "vol_dms = {}\n", - "for tick in ticks:\n", - " if tick in vol_dms:\n", - " continue\n", - " print(f\"Testing Option Request for {tick} on {dates[ticks.index(tick)].strftime('%Y-%m-%d')}\")\n", - " tick_chain = chains[tick].reset_index() ## Using saved chain data\n", - " expirations = tick_chain['Expiration'].unique()\n", - " random_exp = expirations[np.random.randint(0, len(expirations), 1)[0]] ## Random expiration date from the chain\n", - " exp_filtered_chain = tick_chain[tick_chain['Expiration'] == random_exp].dropna()\n", - " strikes = exp_filtered_chain['Strike'].unique()\n", - " random_strike = strikes[np.random.randint(0, len(strikes), 1)[0]] ## Random strike price from the chain\n", - " rights = ['P', 'C']\n", - " random_right = rights[np.random.randint(0, len(rights), 1)[0]] ## Random right from the chain\n", - " manager = OptionDataManager(tick, random_exp, random_right, random_strike)\n", - " data_managers[tick] = manager\n", - " start = dates[ticks.index(tick)] ## Start date will be the same as the date of the chain\n", - " end = pd.Timestamp(start) + pd.DateOffset(days=60) ## End date will be the 30 days after the expiration date\n", - " start, end\n", - " \n", - " print(f\"Option Info for {tick} on {dates[ticks.index(tick)].strftime('%Y-%m-%d')}: Strike {random_strike}, Expiration {random_exp}, Right {random_right}\")\n", - " print(f\"Start Date: {start.strftime('%Y-%m-%d')}, End Date: {end.strftime('%Y-%m-%d')}\")\n", - " request = manager.get_timeseries(\n", - " start=start,\n", - " end=end,\n", - " interval='1d',\n", - " type_='vol',\n", - " model='bs',\n", - " extra_cols=['ask']\n", - " )\n", - " eod_data['vol'][tick] = request.post_processed_data\n", - " print(\"Spot Data Retrieved Successfully\")\n", - " print(\"\\n\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### EOD DELTA" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Testing Option Request for AAPL on 2024-08-22\n", - "Option Info for AAPL on 2024-08-22: Strike 320.0, Expiration 2026-01-16 00:00:00, Right P\n", - "Start Date: 2024-08-22, End Date: 2024-10-21\n", - "2025-04-30 17:50:35 DataManager.py CRITICAL: Extra Cols not implemented for BS Greeks\n", - "[ProcessSaveManager] is scheduling a request for AAPL on {'exp': Timestamp('2026-01-16 00:00:00'), 'right': 'P', 'strike': 320.0, 'start': Timestamp('2024-08-22 00:00:00'), 'end': Timestamp('2024-10-21 00:00:00'), 'tick': 'AAPL', 'type_': 'single', 'save_func': functools.partial(, print_info=False)}\n", - "Spot Data Retrieved Successfully\n", - "\n", - "\n", - "Testing Option Request for AMD on 2024-09-25\n", - "Option Info for AMD on 2024-09-25: Strike 250.0, Expiration 2024-12-20 00:00:00, Right P\n", - "Start Date: 2024-09-25, End Date: 2024-11-24\n", - "2025-04-30 17:50:40 DataManager.py CRITICAL: Extra Cols not implemented for BS Greeks\n", - "[ProcessSaveManager] is scheduling a request for AMD on {'exp': Timestamp('2024-12-20 00:00:00'), 'right': 'P', 'strike': 250.0, 'start': Timestamp('2024-09-25 00:00:00'), 'end': Timestamp('2024-11-24 00:00:00'), 'tick': 'AMD', 'type_': 'single', 'save_func': functools.partial(, print_info=False)}\n", - "2025-04-30 17:50:44 trade.asset.Stock ERROR: Error getting dividends history for AMD from yfinance\n", - "2025-04-30 17:50:44 trade.asset.Stock ERROR: Probably due to no dividends history\n", - "Spot Data Retrieved Successfully\n", - "\n", - "\n", - "Testing Option Request for AMZN on 2024-09-24\n", - "Option Info for AMZN on 2024-09-24: Strike 205.0, Expiration 2024-10-04 00:00:00, Right P\n", - "Start Date: 2024-09-24, End Date: 2024-11-23\n", - "2025-04-30 17:50:45 DataManager.py CRITICAL: Extra Cols not implemented for BS Greeks\n", - "[ProcessSaveManager] is scheduling a request for AMZN on {'exp': Timestamp('2024-10-04 00:00:00'), 'right': 'P', 'strike': 205.0, 'start': Timestamp('2024-09-24 00:00:00'), 'end': Timestamp('2024-11-23 00:00:00'), 'tick': 'AMZN', 'type_': 'single', 'save_func': functools.partial(, print_info=False)}\n", - "2025-04-30 17:50:49 trade.asset.Stock ERROR: Error getting dividends history for AMZN from yfinance\n", - "2025-04-30 17:50:49 trade.asset.Stock ERROR: Probably due to no dividends history\n", - "Spot Data Retrieved Successfully\n", - "\n", - "\n", - "Testing Option Request for BA on 2024-04-23\n", - "Option Info for BA on 2024-04-23: Strike 110.0, Expiration 2026-06-18 00:00:00, Right C\n", - "Start Date: 2024-04-23, End Date: 2024-06-22\n", - "2025-04-30 17:50:50 DataManager.py CRITICAL: Extra Cols not implemented for BS Greeks\n", - "[ProcessSaveManager] is scheduling a request for BA on {'exp': Timestamp('2026-06-18 00:00:00'), 'right': 'C', 'strike': 110.0, 'start': Timestamp('2024-04-23 00:00:00'), 'end': Timestamp('2024-06-22 00:00:00'), 'tick': 'BA', 'type_': 'single', 'save_func': functools.partial(, print_info=False)}\n", - "Spot Data Retrieved Successfully\n", - "\n", - "\n", - "Testing Option Request for NVDA on 2024-08-16\n", - "Option Info for NVDA on 2024-08-16: Strike 177.0, Expiration 2026-12-18 00:00:00, Right C\n", - "Start Date: 2024-08-16, End Date: 2024-10-15\n", - "2025-04-30 17:50:57 DataManager.py CRITICAL: Extra Cols not implemented for BS Greeks\n", - "[ProcessSaveManager] is scheduling a request for NVDA on {'exp': Timestamp('2026-12-18 00:00:00'), 'right': 'C', 'strike': 177.0, 'start': Timestamp('2024-08-16 00:00:00'), 'end': Timestamp('2024-10-15 00:00:00'), 'tick': 'NVDA', 'type_': 'single', 'save_func': functools.partial(, print_info=False)}\n", - "Spot Data Retrieved Successfully\n", - "\n", - "\n", - "Testing Option Request for COST on 2024-03-20\n", - "Option Info for COST on 2024-03-20: Strike 640.0, Expiration 2026-01-16 00:00:00, Right P\n", - "Start Date: 2024-03-20, End Date: 2024-05-19\n", - "2025-04-30 17:51:02 DataManager.py CRITICAL: Extra Cols not implemented for BS Greeks\n", - "[ProcessSaveManager] is scheduling a request for COST on {'exp': Timestamp('2026-01-16 00:00:00'), 'right': 'P', 'strike': 640.0, 'start': Timestamp('2024-03-20 00:00:00'), 'end': Timestamp('2024-05-19 00:00:00'), 'tick': 'COST', 'type_': 'single', 'save_func': functools.partial(, print_info=False)}\n", - "Spot Data Retrieved Successfully\n", - "\n", - "\n", - "Testing Option Request for TSLA on 2024-05-08\n", - "Option Info for TSLA on 2024-05-08: Strike 55.0, Expiration 2025-12-19 00:00:00, Right C\n", - "Start Date: 2024-05-08, End Date: 2024-07-07\n", - "2025-04-30 17:51:07 DataManager.py CRITICAL: Extra Cols not implemented for BS Greeks\n", - "[ProcessSaveManager] is scheduling a request for TSLA on {'exp': Timestamp('2025-12-19 00:00:00'), 'right': 'C', 'strike': 55.0, 'start': Timestamp('2024-05-08 00:00:00'), 'end': Timestamp('2024-07-07 00:00:00'), 'tick': 'TSLA', 'type_': 'single', 'save_func': functools.partial(, print_info=False)}\n", - "2025-04-30 17:51:10 trade.asset.Stock ERROR: Error getting dividends history for TSLA from yfinance\n", - "2025-04-30 17:51:10 trade.asset.Stock ERROR: Probably due to no dividends history\n", - "Spot Data Retrieved Successfully\n", - "\n", - "\n", - "Testing Option Request for META on 2024-06-06\n", - "Option Info for META on 2024-06-06: Strike 800.0, Expiration 2024-10-18 00:00:00, Right P\n", - "Start Date: 2024-06-06, End Date: 2024-08-05\n", - "2025-04-30 17:51:12 DataManager.py CRITICAL: Extra Cols not implemented for BS Greeks\n", - "[ProcessSaveManager] is scheduling a request for META on {'exp': Timestamp('2024-10-18 00:00:00'), 'right': 'P', 'strike': 800.0, 'start': Timestamp('2024-06-06 00:00:00'), 'end': Timestamp('2024-08-05 00:00:00'), 'tick': 'META', 'type_': 'single', 'save_func': functools.partial(, print_info=False)}\n", - "Spot Data Retrieved Successfully\n", - "\n", - "\n", - "Testing Option Request for NFLX on 2024-06-07\n", - "Option Info for NFLX on 2024-06-07: Strike 310.0, Expiration 2024-12-20 00:00:00, Right P\n", - "Start Date: 2024-06-07, End Date: 2024-08-06\n", - "2025-04-30 17:51:16 DataManager.py CRITICAL: Extra Cols not implemented for BS Greeks\n", - "[ProcessSaveManager] is scheduling a request for NFLX on {'exp': Timestamp('2024-12-20 00:00:00'), 'right': 'P', 'strike': 310.0, 'start': Timestamp('2024-06-07 00:00:00'), 'end': Timestamp('2024-08-06 00:00:00'), 'tick': 'NFLX', 'type_': 'single', 'save_func': functools.partial(, print_info=False)}\n", - "2025-04-30 17:51:20 trade.asset.Stock ERROR: Error getting dividends history for NFLX from yfinance\n", - "2025-04-30 17:51:20 trade.asset.Stock ERROR: Probably due to no dividends history\n", - "Spot Data Retrieved Successfully\n", - "\n", - "\n", - "Testing Option Request for SBUX on 2024-11-18\n", - "Option Info for SBUX on 2024-11-18: Strike 114.0, Expiration 2024-11-22 00:00:00, Right P\n", - "Start Date: 2024-11-18, End Date: 2025-01-17\n", - "2025-04-30 17:51:21 DataManager.py CRITICAL: Extra Cols not implemented for BS Greeks\n", - "[ProcessSaveManager] is scheduling a request for SBUX on {'exp': Timestamp('2024-11-22 00:00:00'), 'right': 'P', 'strike': 114.0, 'start': Timestamp('2024-11-18 00:00:00'), 'end': Timestamp('2025-01-17 00:00:00'), 'tick': 'SBUX', 'type_': 'single', 'save_func': functools.partial(, print_info=False)}\n", - "Spot Data Retrieved Successfully\n", - "\n", - "\n" - ] - } - ], - "source": [ - "delta_dms = {}\n", - "for tick in ticks:\n", - " if tick in delta_dms:\n", - " continue\n", - " print(f\"Testing Option Request for {tick} on {dates[ticks.index(tick)].strftime('%Y-%m-%d')}\")\n", - " tick_chain = chains[tick].reset_index() ## Using saved chain data\n", - " expirations = tick_chain['Expiration'].unique()\n", - " random_exp = expirations[np.random.randint(0, len(expirations), 1)[0]] ## Random expiration date from the chain\n", - " exp_filtered_chain = tick_chain[tick_chain['Expiration'] == random_exp].dropna()\n", - " strikes = exp_filtered_chain['Strike'].unique()\n", - " random_strike = strikes[np.random.randint(0, len(strikes), 1)[0]] ## Random strike price from the chain\n", - " rights = ['P', 'C']\n", - " random_right = rights[np.random.randint(0, len(rights), 1)[0]] ## Random right from the chain\n", - " manager = OptionDataManager(tick, random_exp, random_right, random_strike)\n", - " data_managers[tick] = manager\n", - " start = dates[ticks.index(tick)] ## Start date will be the same as the date of the chain\n", - " end = pd.Timestamp(start) + pd.DateOffset(days=60) ## End date will be the 30 days after the expiration date\n", - " start, end\n", - " \n", - " print(f\"Option Info for {tick} on {dates[ticks.index(tick)].strftime('%Y-%m-%d')}: Strike {random_strike}, Expiration {random_exp}, Right {random_right}\")\n", - " print(f\"Start Date: {start.strftime('%Y-%m-%d')}, End Date: {end.strftime('%Y-%m-%d')}\")\n", - " request = manager.get_timeseries(\n", - " start=start,\n", - " end=end,\n", - " interval='1d',\n", - " type_='delta',\n", - " model='bs',\n", - " extra_cols=[]\n", - " )\n", - " eod_data['delta'][tick] = request.post_processed_data\n", - " print(\"Spot Data Retrieved Successfully\")\n", - " print(\"\\n\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## BULK RANDOM TESTS" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### OKAY THAT WAS COOL, WE HAVE SUCCEEDED WITH THE EOD DATA FOR A SINGLE DATAMANGER. LET'S BULK IT UP" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### EOD SPOT" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [], - "source": [ - "bulk_data_managers = {}\n", - "bulk_eod_data = {\n", - " 'spot': {},\n", - " 'vol': {},\n", - " 'delta': {},\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Testing Option Request for COST on 2024-03-20\n", - "Option Info for COST on 2024-03-20: Strike [950. 757.5 775. 710. 420. ], Expiration 2024-03-28 00:00:00, Right ['P', 'P', 'C', 'P', 'P']\n", - "Start Date: 2024-03-20, End Date: 2024-04-19\n", - "[ProcessSaveManager] is scheduling a request for COST on {'exp': Timestamp('2024-03-28 00:00:00'), 'start': Timestamp('2024-03-20 00:00:00'), 'type_': 'bulk', 'end': Timestamp('2024-04-19 00:00:00'), 'tick': 'COST', 'save_func': functools.partial(, print_info=True)}\n", - "2025-04-30 21:29:42 dbase.DataAPI.ThetaData CRITICAL: `datetime_col_name` not provided for multi index resample, setting to `Datetime`\n", - "Spot Data Retrieved Successfully\n", - "Testing Option Request for TSLA on 2024-05-08\n", - "Option Info for TSLA on 2024-05-08: Strike [150. 220. 40. 5. 420.], Expiration 2025-01-17 00:00:00, Right ['C', 'C', 'C', 'P', 'C']\n", - "Start Date: 2024-05-08, End Date: 2024-06-07\n", - "[ProcessSaveManager] is scheduling a request for TSLA on {'exp': Timestamp('2025-01-17 00:00:00'), 'start': Timestamp('2024-05-08 00:00:00'), 'type_': 'bulk', 'end': Timestamp('2024-06-07 00:00:00'), 'tick': 'TSLA', 'save_func': functools.partial(, print_info=True)}\n", - "2025-04-30 21:29:52 dbase.DataAPI.ThetaData CRITICAL: `datetime_col_name` not provided for multi index resample, setting to `Datetime`\n", - "Spot Data Retrieved Successfully\n", - "Testing Option Request for META on 2024-06-06\n", - "Option Info for META on 2024-06-06: Strike [660. 350. 555. 535. 515.], Expiration 2024-07-12 00:00:00, Right ['P', 'P', 'P', 'C', 'C']\n", - "Start Date: 2024-06-06, End Date: 2024-07-06\n", - "[ProcessSaveManager] is scheduling a request for META on {'exp': Timestamp('2024-07-12 00:00:00'), 'start': Timestamp('2024-06-06 00:00:00'), 'type_': 'bulk', 'end': Timestamp('2024-07-06 00:00:00'), 'tick': 'META', 'save_func': functools.partial(, print_info=True)}\n", - "2025-04-30 21:30:00 dbase.DataAPI.ThetaData CRITICAL: `datetime_col_name` not provided for multi index resample, setting to `Datetime`\n", - "Spot Data Retrieved Successfully\n", - "Testing Option Request for NFLX on 2024-06-07\n", - "Option Info for NFLX on 2024-06-07: Strike [650. 885. 445. 290. 560.], Expiration 2024-07-19 00:00:00, Right ['C', 'P', 'C', 'P', 'C']\n", - "Start Date: 2024-06-07, End Date: 2024-07-07\n", - "[ProcessSaveManager] is scheduling a request for NFLX on {'exp': Timestamp('2024-07-19 00:00:00'), 'start': Timestamp('2024-06-07 00:00:00'), 'type_': 'bulk', 'end': Timestamp('2024-07-07 00:00:00'), 'tick': 'NFLX', 'save_func': functools.partial(, print_info=True)}\n", - "2025-04-30 21:30:13 dbase.DataAPI.ThetaData CRITICAL: `datetime_col_name` not provided for multi index resample, setting to `Datetime`\n", - "Spot Data Retrieved Successfully\n", - "Testing Option Request for SBUX on 2024-11-18\n", - "Option Info for SBUX on 2024-11-18: Strike [120. 120. 110. 60. 70.], Expiration 2025-07-18 00:00:00, Right ['C', 'C', 'C', 'P', 'C']\n", - "Start Date: 2024-11-18, End Date: 2024-12-18\n", - "[ProcessSaveManager] is scheduling a request for SBUX on {'exp': Timestamp('2025-07-18 00:00:00'), 'start': Timestamp('2024-11-18 00:00:00'), 'type_': 'bulk', 'end': Timestamp('2024-12-18 00:00:00'), 'tick': 'SBUX', 'save_func': functools.partial(, print_info=True)}\n", - "2025-04-30 21:30:17 dbase.DataAPI.ThetaData CRITICAL: `datetime_col_name` not provided for multi index resample, setting to `Datetime`\n", - "Spot Data Retrieved Successfully\n" - ] - }, - { - "data": { - "text/plain": [ - "[(120.0, 'C'), (120.0, 'C'), (110.0, 'C'), (60.0, 'P'), (70.0, 'C')]" - ] - }, - "execution_count": 47, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "for tick in ticks:\n", - " if tick in bulk_data_managers:\n", - " continue\n", - "\n", - " print(f\"Testing Option Request for {tick} on {dates[ticks.index(tick)].strftime('%Y-%m-%d')}\")\n", - " tick_chain = chains[tick].reset_index() ## Using saved chain data\n", - " expirations = tick_chain['Expiration'].unique()\n", - " random_exp = expirations[np.random.randint(0, len(expirations), 1)[0]] ## Random expiration date from the chain\n", - " exp_filtered_chain = tick_chain[tick_chain['Expiration'] == random_exp].dropna()\n", - " strikes = exp_filtered_chain['Strike'].unique()\n", - " random_strike = strikes[np.random.randint(0, len(strikes), 5)] ## Random strike price from the chain\n", - " rights = ['P', 'C']\n", - " random_right = [rights[np.random.randint(0, len(rights), 1)[0]] for _ in range(5)] ## Random right from the chain\n", - " strikes_right = list(zip(random_strike, random_right))\n", - " manager = BulkOptionDataManager(tick, random_exp, default_fill = 'midpoint')\n", - " bulk_data_managers[tick] = manager\n", - " start = dates[ticks.index(tick)] ## Start date will be the same as the date of the chain\n", - " end = pd.Timestamp(start) + pd.DateOffset(days=30) ## End date will be the 30 days after the expiration date\n", - " \n", - " print(f\"Option Info for {tick} on {dates[ticks.index(tick)].strftime('%Y-%m-%d')}: Strike {random_strike}, Expiration {random_exp}, Right {random_right}\")\n", - " print(f\"Start Date: {start.strftime('%Y-%m-%d')}, End Date: {end.strftime('%Y-%m-%d')}\")\n", - " request = manager.get_timeseries(\n", - " start=start,\n", - " end=end,\n", - " interval='1d',\n", - " type_='spot',\n", - " model='binomial',\n", - " strikes_right=strikes_right,\n", - " extra_cols=['ask']\n", - " )\n", - " bulk_eod_data['spot'][tick] = request.post_processed_data\n", - " print(\"Spot Data Retrieved Successfully\")\n", - "strikes_right" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### EOD VOL" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Testing Option Request for AAPL on 2024-08-22\n", - "Option Info for AAPL on 2024-08-22: Strike [280. 105. 135. 55. 55.], Expiration 2025-12-19 00:00:00, Right ['P', 'P', 'P', 'C', 'P']\n", - "Start Date: 2024-08-22, End Date: 2024-09-21\n", - "[ProcessSaveManager] is scheduling a request for AAPL on {'exp': Timestamp('2025-12-19 00:00:00'), 'start': Timestamp('2024-08-22 00:00:00'), 'type_': 'bulk', 'end': Timestamp('2024-09-21 00:00:00'), 'tick': 'AAPL', 'save_func': functools.partial(, print_info=True)}\n", - "2025-04-30 21:37:43 dbase.DataAPI.ThetaData CRITICAL: `datetime_col_name` not provided for multi index resample, setting to `Datetime`\n", - "Spot Data Retrieved Successfully\n", - "Testing Option Request for AMD on 2024-09-25\n", - "Option Info for AMD on 2024-09-25: Strike [125. 80. 260. 380. 200.], Expiration 2025-01-17 00:00:00, Right ['C', 'P', 'C', 'C', 'P']\n", - "Start Date: 2024-09-25, End Date: 2024-10-25\n", - "[ProcessSaveManager] is scheduling a request for AMD on {'exp': Timestamp('2025-01-17 00:00:00'), 'start': Timestamp('2024-09-25 00:00:00'), 'type_': 'bulk', 'end': Timestamp('2024-10-25 00:00:00'), 'tick': 'AMD', 'save_func': functools.partial(, print_info=True)}\n", - "2025-04-30 21:37:54 INFO: Backing off send_request(...) for 0.4s (requests.exceptions.ReadTimeout: HTTPSConnectionPool(host='us.i.posthog.com', port=443): Read timed out. (read timeout=15))\n", - "2025-04-30 21:37:55 trade.asset.Stock ERROR: Error getting dividends history for AMD from yfinance\n", - "2025-04-30 21:37:55 trade.asset.Stock ERROR: Probably due to no dividends history\n", - "2025-04-30 21:37:59 dbase.DataAPI.ThetaData CRITICAL: `datetime_col_name` not provided for multi index resample, setting to `Datetime`\n", - "Spot Data Retrieved Successfully\n", - "Testing Option Request for AMZN on 2024-09-24\n", - "Option Info for AMZN on 2024-09-24: Strike [192.5 260. 110. 245. 140. ], Expiration 2024-10-18 00:00:00, Right ['C', 'C', 'P', 'P', 'C']\n", - "Start Date: 2024-09-24, End Date: 2024-10-24\n", - "[ProcessSaveManager] is scheduling a request for AMZN on {'exp': Timestamp('2024-10-18 00:00:00'), 'start': Timestamp('2024-09-24 00:00:00'), 'type_': 'bulk', 'end': Timestamp('2024-10-24 00:00:00'), 'tick': 'AMZN', 'save_func': functools.partial(, print_info=True)}\n", - "2025-04-30 21:38:08 trade.asset.Stock ERROR: Error getting dividends history for AMZN from yfinance\n", - "2025-04-30 21:38:08 trade.asset.Stock ERROR: Probably due to no dividends history\n", - "2025-04-30 21:38:11 dbase.DataAPI.ThetaData CRITICAL: `datetime_col_name` not provided for multi index resample, setting to `Datetime`\n", - "Spot Data Retrieved Successfully\n", - "Testing Option Request for BA on 2024-04-23\n", - "Option Info for BA on 2024-04-23: Strike [280. 195. 160. 160. 320.], Expiration 2025-12-19 00:00:00, Right ['C', 'P', 'C', 'P', 'C']\n", - "Start Date: 2024-04-23, End Date: 2024-05-23\n", - "[ProcessSaveManager] is scheduling a request for BA on {'exp': Timestamp('2025-12-19 00:00:00'), 'start': Timestamp('2024-04-23 00:00:00'), 'type_': 'bulk', 'end': Timestamp('2024-05-23 00:00:00'), 'tick': 'BA', 'save_func': functools.partial(, print_info=True)}\n", - "2025-04-30 21:38:23 dbase.DataAPI.ThetaData CRITICAL: `datetime_col_name` not provided for multi index resample, setting to `Datetime`\n", - "Spot Data Retrieved Successfully\n", - "Testing Option Request for NVDA on 2024-08-16\n", - "Option Info for NVDA on 2024-08-16: Strike [ 51. 132. 111. 106. 191.], Expiration 2026-12-18 00:00:00, Right ['C', 'P', 'P', 'P', 'C']\n", - "Start Date: 2024-08-16, End Date: 2024-09-15\n", - "[ProcessSaveManager] is scheduling a request for NVDA on {'exp': Timestamp('2026-12-18 00:00:00'), 'start': Timestamp('2024-08-16 00:00:00'), 'type_': 'bulk', 'end': Timestamp('2024-09-15 00:00:00'), 'tick': 'NVDA', 'save_func': functools.partial(, print_info=True)}\n", - "2025-04-30 21:38:41 dbase.DataAPI.ThetaData CRITICAL: `datetime_col_name` not provided for multi index resample, setting to `Datetime`\n", - "Spot Data Retrieved Successfully\n", - "Testing Option Request for COST on 2024-03-20\n", - "Option Info for COST on 2024-03-20: Strike [520. 755. 835. 510. 780.], Expiration 2024-04-26 00:00:00, Right ['C', 'C', 'C', 'C', 'P']\n", - "Start Date: 2024-03-20, End Date: 2024-04-19\n", - "[ProcessSaveManager] is scheduling a request for COST on {'exp': Timestamp('2024-04-26 00:00:00'), 'start': Timestamp('2024-03-20 00:00:00'), 'type_': 'bulk', 'end': Timestamp('2024-04-19 00:00:00'), 'tick': 'COST', 'save_func': functools.partial(, print_info=True)}\n", - "2025-04-30 21:38:53 dbase.DataAPI.ThetaData CRITICAL: `datetime_col_name` not provided for multi index resample, setting to `Datetime`\n", - "Spot Data Retrieved Successfully\n", - "Testing Option Request for TSLA on 2024-05-08\n", - "Option Info for TSLA on 2024-05-08: Strike [130. 95. 275. 385. 250.], Expiration 2024-07-19 00:00:00, Right ['C', 'P', 'C', 'C', 'P']\n", - "Start Date: 2024-05-08, End Date: 2024-06-07\n", - "[ProcessSaveManager] is scheduling a request for TSLA on {'exp': Timestamp('2024-07-19 00:00:00'), 'start': Timestamp('2024-05-08 00:00:00'), 'type_': 'bulk', 'end': Timestamp('2024-06-07 00:00:00'), 'tick': 'TSLA', 'save_func': functools.partial(, print_info=True)}\n", - "2025-04-30 21:39:03 trade.asset.Stock ERROR: Error getting dividends history for TSLA from yfinance\n", - "2025-04-30 21:39:03 trade.asset.Stock ERROR: Probably due to no dividends history\n", - "2025-04-30 21:39:04 dbase.DataAPI.ThetaData CRITICAL: `datetime_col_name` not provided for multi index resample, setting to `Datetime`\n", - "Spot Data Retrieved Successfully\n", - "Testing Option Request for META on 2024-06-06\n", - "Option Info for META on 2024-06-06: Strike [500. 10. 550. 280. 40.], Expiration 2025-09-19 00:00:00, Right ['C', 'C', 'C', 'C', 'C']\n", - "Start Date: 2024-06-06, End Date: 2024-07-06\n", - "[ProcessSaveManager] is scheduling a request for META on {'exp': Timestamp('2025-09-19 00:00:00'), 'start': Timestamp('2024-06-06 00:00:00'), 'type_': 'bulk', 'end': Timestamp('2024-07-06 00:00:00'), 'tick': 'META', 'save_func': functools.partial(, print_info=True)}\n", - "2025-04-30 21:39:14 dbase.DataAPI.ThetaData CRITICAL: `datetime_col_name` not provided for multi index resample, setting to `Datetime`\n", - "Spot Data Retrieved Successfully\n", - "Testing Option Request for NFLX on 2024-06-07\n", - "Option Info for NFLX on 2024-06-07: Strike [ 200. 145. 455. 1080. 950.], Expiration 2024-09-20 00:00:00, Right ['C', 'P', 'C', 'C', 'C']\n", - "Start Date: 2024-06-07, End Date: 2024-07-07\n", - "[ProcessSaveManager] is scheduling a request for NFLX on {'exp': Timestamp('2024-09-20 00:00:00'), 'start': Timestamp('2024-06-07 00:00:00'), 'type_': 'bulk', 'end': Timestamp('2024-07-07 00:00:00'), 'tick': 'NFLX', 'save_func': functools.partial(, print_info=True)}\n", - "2025-04-30 21:39:24 trade.asset.Stock ERROR: Error getting dividends history for NFLX from yfinance\n", - "2025-04-30 21:39:24 trade.asset.Stock ERROR: Probably due to no dividends history\n", - "2025-04-30 21:39:25 dbase.DataAPI.ThetaData CRITICAL: `datetime_col_name` not provided for multi index resample, setting to `Datetime`\n", - "Spot Data Retrieved Successfully\n", - "Testing Option Request for SBUX on 2024-11-18\n", - "Option Info for SBUX on 2024-11-18: Strike [145. 135. 55. 60. 110.], Expiration 2025-07-18 00:00:00, Right ['P', 'P', 'P', 'C', 'P']\n", - "Start Date: 2024-11-18, End Date: 2024-12-18\n", - "[ProcessSaveManager] is scheduling a request for SBUX on {'exp': Timestamp('2025-07-18 00:00:00'), 'start': Timestamp('2024-11-18 00:00:00'), 'type_': 'bulk', 'end': Timestamp('2024-12-18 00:00:00'), 'tick': 'SBUX', 'save_func': functools.partial(, print_info=True)}\n", - "[ProcessSaveManager] Request SBUX on {'exp': Timestamp('2025-07-18 00:00:00'), 'start': Timestamp('2024-11-18 00:00:00'), 'type_': 'bulk', 'end': Timestamp('2024-12-18 00:00:00'), 'tick': 'SBUX', 'save_func': functools.partial(, print_info=True)} is already scheduled. Ignoring.\n", - "2025-04-30 21:39:32 dbase.DataAPI.ThetaData CRITICAL: `datetime_col_name` not provided for multi index resample, setting to `Datetime`\n", - "Spot Data Retrieved Successfully\n" - ] - }, - { - "data": { - "text/plain": [ - "[(145.0, 'P'), (135.0, 'P'), (55.0, 'P'), (60.0, 'C'), (110.0, 'P')]" - ] - }, - "execution_count": 48, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bulk_data_managers = {}\n", - "for tick in ticks:\n", - " if tick in bulk_data_managers:\n", - " continue\n", - "\n", - " print(f\"Testing Option Request for {tick} on {dates[ticks.index(tick)].strftime('%Y-%m-%d')}\")\n", - " tick_chain = chains[tick].reset_index() ## Using saved chain data\n", - " expirations = tick_chain['Expiration'].unique()\n", - " random_exp = expirations[np.random.randint(0, len(expirations), 1)[0]] ## Random expiration date from the chain\n", - " exp_filtered_chain = tick_chain[tick_chain['Expiration'] == random_exp].dropna()\n", - " strikes = exp_filtered_chain['Strike'].unique()\n", - " random_strike = strikes[np.random.randint(0, len(strikes), 5)] ## Random strike price from the chain\n", - " rights = ['P', 'C']\n", - " random_right = [rights[np.random.randint(0, len(rights), 1)[0]] for _ in range(5)] ## Random right from the chain\n", - " strikes_right = list(zip(random_strike, random_right))\n", - " manager = BulkOptionDataManager(tick, random_exp, default_fill = 'midpoint')\n", - " bulk_data_managers[tick] = manager\n", - " start = dates[ticks.index(tick)] ## Start date will be the same as the date of the chain\n", - " end = pd.Timestamp(start) + pd.DateOffset(days=30) ## End date will be the 30 days after the expiration date\n", - " \n", - " print(f\"Option Info for {tick} on {dates[ticks.index(tick)].strftime('%Y-%m-%d')}: Strike {random_strike}, Expiration {random_exp}, Right {random_right}\")\n", - " print(f\"Start Date: {start.strftime('%Y-%m-%d')}, End Date: {end.strftime('%Y-%m-%d')}\")\n", - " request = manager.get_timeseries(\n", - " start=start,\n", - " end=end,\n", - " interval='1d',\n", - " type_='vol',\n", - " model='bs',\n", - " strikes_right=strikes_right,\n", - " extra_cols=['ask']\n", - " )\n", - " bulk_eod_data['vol'][tick] = request.post_processed_data\n", - " print(\"Spot Data Retrieved Successfully\")\n", - "strikes_right" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### EOD DELTA" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Testing Option Request for AAPL on 2024-08-22\n", - "Option Info for AAPL on 2024-08-22: Strike [340. 320. 60. 285. 170.], Expiration 2024-10-18 00:00:00, Right ['P', 'P', 'C', 'C', 'C']\n", - "Start Date: 2024-08-22, End Date: 2024-09-21\n", - "2025-04-30 21:39:33 DataManager.py CRITICAL: Extra Cols not implemented for BS Greeks\n", - "[ProcessSaveManager] is scheduling a request for AAPL on {'exp': Timestamp('2024-10-18 00:00:00'), 'start': Timestamp('2024-08-22 00:00:00'), 'type_': 'bulk', 'end': Timestamp('2024-09-21 00:00:00'), 'tick': 'AAPL', 'save_func': functools.partial(, print_info=True)}\n", - "2025-04-30 21:39:42 dbase.DataAPI.ThetaData CRITICAL: `datetime_col_name` not provided for multi index resample, setting to `Datetime`\n", - "Spot Data Retrieved Successfully\n", - "Testing Option Request for AMD on 2024-09-25\n", - "Option Info for AMD on 2024-09-25: Strike [200. 200. 130. 320. 260.], Expiration 2024-10-18 00:00:00, Right ['P', 'C', 'P', 'P', 'P']\n", - "Start Date: 2024-09-25, End Date: 2024-10-25\n", - "2025-04-30 21:39:42 DataManager.py CRITICAL: Extra Cols not implemented for BS Greeks\n", - "[ProcessSaveManager] is scheduling a request for AMD on {'exp': Timestamp('2024-10-18 00:00:00'), 'start': Timestamp('2024-09-25 00:00:00'), 'type_': 'bulk', 'end': Timestamp('2024-10-25 00:00:00'), 'tick': 'AMD', 'save_func': functools.partial(, print_info=True)}\n", - "2025-04-30 21:39:49 trade.asset.Stock ERROR: Error getting dividends history for AMD from yfinance\n", - "2025-04-30 21:39:49 trade.asset.Stock ERROR: Probably due to no dividends history\n", - "2025-04-30 21:39:50 dbase.DataAPI.ThetaData CRITICAL: `datetime_col_name` not provided for multi index resample, setting to `Datetime`\n", - "Spot Data Retrieved Successfully\n", - "Testing Option Request for AMZN on 2024-09-24\n", - "Option Info for AMZN on 2024-09-24: Strike [ 95. 205. 155. 197.5 210. ], Expiration 2024-10-04 00:00:00, Right ['P', 'C', 'P', 'C', 'P']\n", - "Start Date: 2024-09-24, End Date: 2024-10-24\n", - "2025-04-30 21:39:50 DataManager.py CRITICAL: Extra Cols not implemented for BS Greeks\n", - "[ProcessSaveManager] is scheduling a request for AMZN on {'exp': Timestamp('2024-10-04 00:00:00'), 'start': Timestamp('2024-09-24 00:00:00'), 'type_': 'bulk', 'end': Timestamp('2024-10-24 00:00:00'), 'tick': 'AMZN', 'save_func': functools.partial(, print_info=True)}\n", - "2025-04-30 21:39:54 trade.asset.Stock ERROR: Error getting dividends history for AMZN from yfinance\n", - "2025-04-30 21:39:54 trade.asset.Stock ERROR: Probably due to no dividends history\n", - "2025-04-30 21:39:55 dbase.DataAPI.ThetaData CRITICAL: `datetime_col_name` not provided for multi index resample, setting to `Datetime`\n", - "Spot Data Retrieved Successfully\n", - "Testing Option Request for BA on 2024-04-23\n", - "Option Info for BA on 2024-04-23: Strike [195. 390. 110. 380. 390.], Expiration 2026-01-16 00:00:00, Right ['P', 'C', 'C', 'C', 'P']\n", - "Start Date: 2024-04-23, End Date: 2024-05-23\n", - "2025-04-30 21:39:55 DataManager.py CRITICAL: Extra Cols not implemented for BS Greeks\n", - "[ProcessSaveManager] is scheduling a request for BA on {'exp': Timestamp('2026-01-16 00:00:00'), 'start': Timestamp('2024-04-23 00:00:00'), 'type_': 'bulk', 'end': Timestamp('2024-05-23 00:00:00'), 'tick': 'BA', 'save_func': functools.partial(, print_info=True)}\n", - "2025-04-30 21:40:03 dbase.DataAPI.ThetaData CRITICAL: `datetime_col_name` not provided for multi index resample, setting to `Datetime`\n", - "Spot Data Retrieved Successfully\n", - "Testing Option Request for NVDA on 2024-08-16\n", - "Option Info for NVDA on 2024-08-16: Strike [ 18. 57. 6. 250. 132.], Expiration 2025-12-19 00:00:00, Right ['P', 'P', 'P', 'C', 'P']\n", - "Start Date: 2024-08-16, End Date: 2024-09-15\n", - "2025-04-30 21:40:03 DataManager.py CRITICAL: Extra Cols not implemented for BS Greeks\n", - "[ProcessSaveManager] is scheduling a request for NVDA on {'exp': Timestamp('2025-12-19 00:00:00'), 'start': Timestamp('2024-08-16 00:00:00'), 'type_': 'bulk', 'end': Timestamp('2024-09-15 00:00:00'), 'tick': 'NVDA', 'save_func': functools.partial(, print_info=True)}\n", - "2025-04-30 21:40:20 dbase.DataAPI.ThetaData CRITICAL: `datetime_col_name` not provided for multi index resample, setting to `Datetime`\n", - "Spot Data Retrieved Successfully\n", - "Testing Option Request for COST on 2024-03-20\n", - "Option Info for COST on 2024-03-20: Strike [875. 945. 525. 885. 740.], Expiration 2025-06-20 00:00:00, Right ['P', 'P', 'P', 'P', 'C']\n", - "Start Date: 2024-03-20, End Date: 2024-04-19\n", - "2025-04-30 21:40:20 DataManager.py CRITICAL: Extra Cols not implemented for BS Greeks\n", - "[ProcessSaveManager] is scheduling a request for COST on {'exp': Timestamp('2025-06-20 00:00:00'), 'start': Timestamp('2024-03-20 00:00:00'), 'type_': 'bulk', 'end': Timestamp('2024-04-19 00:00:00'), 'tick': 'COST', 'save_func': functools.partial(, print_info=True)}\n", - "2025-04-30 21:40:31 dbase.DataAPI.ThetaData CRITICAL: `datetime_col_name` not provided for multi index resample, setting to `Datetime`\n", - "Spot Data Retrieved Successfully\n", - "Testing Option Request for TSLA on 2024-05-08\n", - "Option Info for TSLA on 2024-05-08: Strike [115. 310. 155. 80. 110.], Expiration 2024-06-07 00:00:00, Right ['C', 'C', 'C', 'P', 'P']\n", - "Start Date: 2024-05-08, End Date: 2024-06-07\n", - "2025-04-30 21:40:31 DataManager.py CRITICAL: Extra Cols not implemented for BS Greeks\n", - "[ProcessSaveManager] is scheduling a request for TSLA on {'exp': Timestamp('2024-06-07 00:00:00'), 'start': Timestamp('2024-05-08 00:00:00'), 'type_': 'bulk', 'end': Timestamp('2024-06-07 00:00:00'), 'tick': 'TSLA', 'save_func': functools.partial(, print_info=True)}\n", - "2025-04-30 21:40:36 trade.asset.Stock ERROR: Error getting dividends history for TSLA from yfinance\n", - "2025-04-30 21:40:36 trade.asset.Stock ERROR: Probably due to no dividends history\n", - "2025-04-30 21:40:37 dbase.DataAPI.ThetaData CRITICAL: `datetime_col_name` not provided for multi index resample, setting to `Datetime`\n", - "Spot Data Retrieved Successfully\n", - "Testing Option Request for META on 2024-06-06\n", - "Option Info for META on 2024-06-06: Strike [555. 270. 465. 950. 90.], Expiration 2025-03-21 00:00:00, Right ['P', 'C', 'P', 'C', 'P']\n", - "Start Date: 2024-06-06, End Date: 2024-07-06\n", - "2025-04-30 21:40:38 DataManager.py CRITICAL: Extra Cols not implemented for BS Greeks\n", - "[ProcessSaveManager] is scheduling a request for META on {'exp': Timestamp('2025-03-21 00:00:00'), 'start': Timestamp('2024-06-06 00:00:00'), 'type_': 'bulk', 'end': Timestamp('2024-07-06 00:00:00'), 'tick': 'META', 'save_func': functools.partial(, print_info=True)}\n", - "2025-04-30 21:40:45 dbase.DataAPI.ThetaData CRITICAL: `datetime_col_name` not provided for multi index resample, setting to `Datetime`\n", - "Spot Data Retrieved Successfully\n", - "Testing Option Request for NFLX on 2024-06-07\n", - "Option Info for NFLX on 2024-06-07: Strike [ 755. 505. 315. 810. 1020.], Expiration 2024-07-19 00:00:00, Right ['C', 'C', 'C', 'C', 'C']\n", - "Start Date: 2024-06-07, End Date: 2024-07-07\n", - "2025-04-30 21:40:45 DataManager.py CRITICAL: Extra Cols not implemented for BS Greeks\n", - "[ProcessSaveManager] is scheduling a request for NFLX on {'exp': Timestamp('2024-07-19 00:00:00'), 'start': Timestamp('2024-06-07 00:00:00'), 'type_': 'bulk', 'end': Timestamp('2024-07-07 00:00:00'), 'tick': 'NFLX', 'save_func': functools.partial(, print_info=True)}\n", - "[ProcessSaveManager] Request NFLX on {'exp': Timestamp('2024-07-19 00:00:00'), 'start': Timestamp('2024-06-07 00:00:00'), 'type_': 'bulk', 'end': Timestamp('2024-07-07 00:00:00'), 'tick': 'NFLX', 'save_func': functools.partial(, print_info=True)} is already scheduled. Ignoring.\n", - "2025-04-30 21:40:51 trade.asset.Stock ERROR: Error getting dividends history for NFLX from yfinance\n", - "2025-04-30 21:40:51 trade.asset.Stock ERROR: Probably due to no dividends history\n", - "2025-04-30 21:40:52 dbase.DataAPI.ThetaData CRITICAL: `datetime_col_name` not provided for multi index resample, setting to `Datetime`\n", - "Spot Data Retrieved Successfully\n", - "Testing Option Request for SBUX on 2024-11-18\n", - "Option Info for SBUX on 2024-11-18: Strike [130. 50. 135. 85. 55.], Expiration 2025-07-18 00:00:00, Right ['P', 'P', 'C', 'P', 'C']\n", - "Start Date: 2024-11-18, End Date: 2024-12-18\n", - "2025-04-30 21:40:52 DataManager.py CRITICAL: Extra Cols not implemented for BS Greeks\n", - "[ProcessSaveManager] is scheduling a request for SBUX on {'exp': Timestamp('2025-07-18 00:00:00'), 'start': Timestamp('2024-11-18 00:00:00'), 'type_': 'bulk', 'end': Timestamp('2024-12-18 00:00:00'), 'tick': 'SBUX', 'save_func': functools.partial(, print_info=True)}\n", - "[ProcessSaveManager] Request SBUX on {'exp': Timestamp('2025-07-18 00:00:00'), 'start': Timestamp('2024-11-18 00:00:00'), 'type_': 'bulk', 'end': Timestamp('2024-12-18 00:00:00'), 'tick': 'SBUX', 'save_func': functools.partial(, print_info=True)} is already scheduled. Ignoring.\n", - "2025-04-30 21:41:00 dbase.DataAPI.ThetaData CRITICAL: `datetime_col_name` not provided for multi index resample, setting to `Datetime`\n", - "Spot Data Retrieved Successfully\n" - ] - }, - { - "data": { - "text/plain": [ - "[(130.0, 'P'), (50.0, 'P'), (135.0, 'C'), (85.0, 'P'), (55.0, 'C')]" - ] - }, - "execution_count": 49, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bulk_data_managers = {}\n", - "for tick in ticks:\n", - " if tick in bulk_data_managers:\n", - " continue\n", - "\n", - " print(f\"Testing Option Request for {tick} on {dates[ticks.index(tick)].strftime('%Y-%m-%d')}\")\n", - " tick_chain = chains[tick].reset_index() ## Using saved chain data\n", - " expirations = tick_chain['Expiration'].unique()\n", - " random_exp = expirations[np.random.randint(0, len(expirations), 1)[0]] ## Random expiration date from the chain\n", - " exp_filtered_chain = tick_chain[tick_chain['Expiration'] == random_exp].dropna()\n", - " strikes = exp_filtered_chain['Strike'].unique()\n", - " random_strike = strikes[np.random.randint(0, len(strikes), 5)] ## Random strike price from the chain\n", - " rights = ['P', 'C']\n", - " random_right = [rights[np.random.randint(0, len(rights), 1)[0]] for _ in range(5)] ## Random right from the chain\n", - " strikes_right = list(zip(random_strike, random_right))\n", - " manager = BulkOptionDataManager(tick, random_exp, default_fill = 'midpoint')\n", - " bulk_data_managers[tick] = manager\n", - " start = dates[ticks.index(tick)] ## Start date will be the same as the date of the chain\n", - " end = pd.Timestamp(start) + pd.DateOffset(days=30) ## End date will be the 30 days after the expiration date\n", - " \n", - " print(f\"Option Info for {tick} on {dates[ticks.index(tick)].strftime('%Y-%m-%d')}: Strike {random_strike}, Expiration {random_exp}, Right {random_right}\")\n", - " print(f\"Start Date: {start.strftime('%Y-%m-%d')}, End Date: {end.strftime('%Y-%m-%d')}\")\n", - " request = manager.get_timeseries(\n", - " start=start,\n", - " end=end,\n", - " interval='1d',\n", - " type_='delta',\n", - " model='bs',\n", - " strikes_right=strikes_right,\n", - " extra_cols=[]\n", - " )\n", - " bulk_eod_data['delta'][tick] = request.post_processed_data\n", - " print(\"Spot Data Retrieved Successfully\")\n", - "strikes_right" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "8" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import os\n", - "from pathos.multiprocessing import cpu_count\n", - "# int(os.environ.get('NUM_WORKERS'), cpu_count())\n", - "int(os.environ.get('NUM_WORKERS', str(cpu_count())).strip())" - ] - }, - { - "cell_type": "code", - "execution_count": 147, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - ", **kwargs) -> None>" - ] - }, - "execution_count": 147, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "save_to_database" - ] - }, - { - "cell_type": "code", - "execution_count": 159, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Index(['Bs_iv'], dtype='object')" - ] - }, - "execution_count": 159, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "eod_data['vol']['COST']['Bs_iv'] = np.nan\n", - "nas = eod_data['vol']['COST'].isna().any(axis = 0)\n", - "nas[nas==True].index" - ] - }, - { - "cell_type": "code", - "execution_count": 164, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Hi\n" - ] - } - ], - "source": [ - "if 1:\n", - " print(\"Hi\")" - ] - }, - { - "cell_type": "code", - "execution_count": 137, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'pending_tasks': 0,\n", - " 'max_queue_size': 100,\n", - " 'active_threads': 4,\n", - " 'total_threads': 4,\n", - " 'current_requests': {},\n", - " 'num_finished_requests': 0,\n", - " 'num_failed_requests': 0,\n", - " 'num_failed_initialization': 0}" - ] - }, - "execution_count": 137, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "status = SaveManager.status()\n", - "# pending = status['current_requests']['Thread-8 (_worker)']\n", - "# pending = SaveManager._finished_requests[0]\n", - "# pending in SaveManager._finished_requests or pending in SaveManager._failed_requests, pending\n", - "status" - ] - }, - { - "cell_type": "code", - "execution_count": 138, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[]" - ] - }, - "execution_count": 138, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "([x.symbol for x in SaveManager._finished_requests[:9]])" - ] - }, - { - "cell_type": "code", - "execution_count": 139, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[]" - ] - }, - "execution_count": 139, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "[x.symbol for x in SaveManager._current_requests.values()]" - ] - }, - { - "cell_type": "code", - "execution_count": 140, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{}" - ] - }, - "execution_count": 140, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "p = {1:'2'}\n", - "del p[1]\n", - "p" - ] - }, - { - "cell_type": "code", - "execution_count": 141, - "metadata": {}, - "outputs": [ - { - "ename": "IndexError", - "evalue": "list index out of range", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[141], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mSaveManager\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_finished_requests\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m\u001b[38;5;241m.\u001b[39msymbol\n", - "\u001b[0;31mIndexError\u001b[0m: list index out of range" - ] - } - ], - "source": [ - "SaveManager._finished_requests[0].symbol" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## TEST ATTRIBUTION MANAGER" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "ename": "NotImplementedError", - "evalue": "AttributionDataManager is not implemented yet.", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNotImplementedError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[31], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m att_manager \u001b[38;5;241m=\u001b[39m \u001b[43mAttributionDataManager\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/cloned_repos/QuantTools/module_test/raw_code/DataManagers/DataManagers.py:190\u001b[0m, in \u001b[0;36mAttributionDataManager.__init__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 189\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__init__\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[0;32m--> 190\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mNotImplementedError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mAttributionDataManager is not implemented yet.\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", - "\u001b[0;31mNotImplementedError\u001b[0m: AttributionDataManager is not implemented yet." - ] - } - ], - "source": [ - "att_manager = AttributionDataManager()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Bs_ivMidpoint_bs_ivAsk_bs_iv
Datetime
2024-10-310.0000000.5619030.574684
2024-11-010.5523520.5570410.560641
2024-11-040.5563420.5636810.574100
2024-11-050.5547000.5521150.561829
2024-11-060.5689220.5665680.577579
2024-11-070.5580750.5590310.566310
2024-11-080.5710350.5728660.579892
\n", - "
" - ], - "text/plain": [ - " Bs_iv Midpoint_bs_iv Ask_bs_iv\n", - "Datetime \n", - "2024-10-31 0.000000 0.561903 0.574684\n", - "2024-11-01 0.552352 0.557041 0.560641\n", - "2024-11-04 0.556342 0.563681 0.574100\n", - "2024-11-05 0.554700 0.552115 0.561829\n", - "2024-11-06 0.568922 0.566568 0.577579\n", - "2024-11-07 0.558075 0.559031 0.566310\n", - "2024-11-08 0.571035 0.572866 0.579892" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "eod_data['vol']['TSLA']" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## SAVEMANAGER" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Console Logging & File Logging Can be configured using STREAM_LOG_LEVEL and FILE_LOG_LEVEL in environment variables.\n", - "Propagate to root logger can be set using PROPAGATE_TO_ROOT_LOGGER in environment variables.\n", - "Example:\n", - "STREAM_LOG_LEVEL = 'DEBUG'\n", - "FILE_LOG_LEVEL = 'INFO'\n", - "PROPAGATE_TO_ROOT_LOGGER = 'False'\n", - "\n", - "2025-04-27 23:19:19 trade.helpers.Logging INFO: Logging Root Directory: /Users/chiemelienwanisobi/cloned_repos/QuantTools/logs\n", - "No Proxy URL found. ThetaData API will default to direct access\n", - "[SaveManager] Auto setup complete. Workers started.\n" - ] - } - ], - "source": [ - "%load_ext autoreload\n", - "%autoreload 2\n", - "import os, sys\n", - "os.environ['STREAM_LOG_LEVEL'] = 'CRITICAL'\n", - "os.environ['PROXY_URL'] = ''\n", - "from module_test.raw_code.DataManagers.DataManagers import OptionDataManager, ChainDataManager, BulkOptionDataManager, AttributionDataManager, save_chain_data\n", - "from module_test.raw_code.DataManagers.SaveManager import SaveManager\n", - "import pandas as pd\n", - "SaveManager.auto_setup()\n", - "from dbase.DataAPI.ThetaData import list_contracts" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# from dbase.DataAPI.ThetaData import list_contracts\n", - "# list_contracts('AAPL', '2025-04-25')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## TEST CHAIN MANAGER" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving to cache from db\n", - "[SaveManager] Enqueueing save request for MS on {'exp': '2024-09-17', 'start': '2024-09-17', 'end': '2024-09-17', 'tick': 'MS', 'save_func': functools.partial(), 'type_': 'chain', '_requests': }\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Given _requests: []\n", - "Req: \n", - "Rows inserted into option_chain: 1262\r" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Midpoint
RightCP
ExpirationDTEStrike
2024-09-20340.059.8750.005
45.054.8750.635
50.049.8750.030
55.044.8500.635
60.039.9000.635
...............
2027-01-15850120.06.62525.825
125.06.35029.150
130.04.72532.625
135.04.37536.950
140.03.20541.250
\n", - "

631 rows × 2 columns

\n", - "
" - ], - "text/plain": [ - " Midpoint \n", - "Right C P\n", - "Expiration DTE Strike \n", - "2024-09-20 3 40.0 59.875 0.005\n", - " 45.0 54.875 0.635\n", - " 50.0 49.875 0.030\n", - " 55.0 44.850 0.635\n", - " 60.0 39.900 0.635\n", - "... ... ...\n", - "2027-01-15 850 120.0 6.625 25.825\n", - " 125.0 6.350 29.150\n", - " 130.0 4.725 32.625\n", - " 135.0 4.375 36.950\n", - " 140.0 3.205 41.250\n", - "\n", - "[631 rows x 2 columns]" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "chain_manager = ChainDataManager('MS')\n", - "data = chain_manager.get_at_time('2024-09-17', organize=True).organized_data\n", - "data" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'pending_tasks': 0,\n", - " 'max_queue_size': 100,\n", - " 'active_threads': 4,\n", - " 'total_threads': 4,\n", - " 'current_requests': {},\n", - " 'num_finished_requests': 1,\n", - " 'num_failed_requests': 0,\n", - " 'num_failed_initialization': 0}" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "SaveManager.status()\n", - "# SaveManager._failed_initialization\n", - "\n", - "# req = SaveManager._failed_requests[0]\n", - "# req = SaveManager._finished_requests[0]\n", - "# SaveManager._failed_initialization\n", - "# req" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Console Logging & File Logging Can be configured using STREAM_LOG_LEVEL and FILE_LOG_LEVEL in environment variables.\n", - "Propagate to root logger can be set using PROPAGATE_TO_ROOT_LOGGER in environment variables.\n", - "Example:\n", - "STREAM_LOG_LEVEL = 'DEBUG'\n", - "FILE_LOG_LEVEL = 'INFO'\n", - "PROPAGATE_TO_ROOT_LOGGER = 'False'\n", - "\n", - "2025-04-28 22:25:12 trade.helpers.Logging INFO: Logging Root Directory: /Users/chiemelienwanisobi/cloned_repos/QuantTools/logs\n", - "Using Proxy URL: http://18.232.166.224:5500/thetadata\n", - "[ProcessSaveManager] Auto-setup completed.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving to cache from db\n", - "Saving to cache from db\n", - "[ProcessSaveManager] Current requests: {'SaveWorker-0': }, inside lock\n", - "[ProcessSaveManager] Processing save request for AAPL on , thread SaveWorker-0\n", - "\n", - "Worker SaveWorker-0 got a request\n", - "Worker SaveWorker-0 got a request: \n", - "Saving data to securities_master.temp_options_eod_new\n", - "Querying data from 2024-07-23 00:00:00 to 2025-07-27 00:00:00\n", - "Starting to save data to database\n", - "Size of spot data: (26044, 22)\n", - "Size of spot data after filtering: (14560, 23)\n", - "Calculating Vols\n" - ] - } - ], - "source": [ - "%load_ext autoreload\n", - "%autoreload 2\n", - "from module_test.raw_code.DataManagers.SaveManager_processes import ProcessSaveManager, is_pickleable, safe_prepare_request\n", - "import pandas as pd, numpy as np\n", - "import os, sys\n", - "os.environ['STREAM_LOG_LEVEL'] = 'CRITICAL'\n", - "from datetime import datetime\n", - "from dateutil.relativedelta import relativedelta\n", - "from pandas.tseries.offsets import MonthEnd, MonthBegin, BDay\n", - "from trade.assets.Stock import Stock\n", - "# from trade.assets.helpers.DataManagers_new import (OptionDataManager, \n", - "# BulkOptionDataManager, \n", - "# SaveManager)\n", - "\n", - "from module_test.raw_code.DataManagers import *\n", - "from module_test.raw_code.DataManagers.DataManagers import save_to_database\n", - "from module_test.raw_code.DataManagers.SaveManager import SaveManager\n", - "from module_test.raw_code.DataManagers.Requests import get_bulk_requests, get_chain_requests\n", - "from module_test.raw_code.DataManagers.DataManagers import save_chain_data\n", - "from module_test.raw_code.DataManagers.shared_obj import reset_request_list, get_request_list\n", - "from pprint import pprint\n", - "from module_test.raw_code.DataManagers.SaveManager_processes import ProcessSaveManager\n", - "ProcessSaveManager.auto_setup()\n", - "from functools import partial\n", - "from copy import deepcopy" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['BULK_AAPL_2025-09-19_2024-10-23_2025-04-27_EOD']" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "list(get_request_list())" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "if __name__ == '__main__':\n", - " ProcessSaveManager.initialize()\n", - " # ProcessSaveManager.restart_workers()\n", - " ProcessSaveManager.start_workers()\n", - " ProcessSaveManager._queue" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "# print(ProcessSaveManager._failed_requests[0].error)\n", - "# ProcessSaveManager.status()" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[SaveManager] Enqueueing save request for AAPL on {'exp': '2025-09-19', 'right': 'C', 'strike': 13.0, 'start': '2024-10-23', 'end': '2025-04-27', 'tick': 'AAPL', 'type_': 'bulk', 'save_func': functools.partial(, print_info=True, pool=False), '_requests': }\n" - ] - } - ], - "source": [ - "kwargs = dict(\n", - " exp='2025-09-19',\n", - " right='C',\n", - " strike=13.0,\n", - " start='2024-10-23',\n", - " end='2025-04-27',\n", - " tick='AAPL',\n", - " type_ = 'bulk',\n", - " save_func = partial(save_to_database, print_info=True)) \n", - "ProcessSaveManager.enqueue(kwargs)" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
rootexpirationstrikeright
0MS2025091940.0C
1MS2025091940.0P
2MS2025091945.0C
3MS2025091945.0P
4MS2025091950.0P
...............
1683MS20270115195.0P
1684MS20261218200.0C
1685MS20261218200.0P
1686MS20270115200.0C
1687MS20270115200.0P
\n", - "

1688 rows × 4 columns

\n", - "
" - ], - "text/plain": [ - " root expiration strike right\n", - "0 MS 20250919 40.0 C\n", - "1 MS 20250919 40.0 P\n", - "2 MS 20250919 45.0 C\n", - "3 MS 20250919 45.0 P\n", - "4 MS 20250919 50.0 P\n", - "... ... ... ... ...\n", - "1683 MS 20270115 195.0 P\n", - "1684 MS 20261218 200.0 C\n", - "1685 MS 20261218 200.0 P\n", - "1686 MS 20270115 200.0 C\n", - "1687 MS 20270115 200.0 P\n", - "\n", - "[1688 rows x 4 columns]" - ] - }, - "execution_count": 39, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from dbase.DataAPI.ThetaData import list_contracts\n", - "list_contracts('MS', '2025-04-25')" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'pending_tasks': 0,\n", - " 'max_queue_size': 100,\n", - " 'active_processes': 4,\n", - " 'total_processes': 4,\n", - " 'current_requests': {'SaveWorker-0': },\n", - " 'num_finished_requests': 0,\n", - " 'num_failed_requests': 0,\n", - " 'failed_initialization': 0}" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# SaveManager._failed_requests[0].error\n", - "ProcessSaveManager.status()\n", - "# SaveManager._queue.get_nowait()\n", - "# ProcessSaveManager.start_workers()\n", - "# ProcessSaveManager._started\n", - "# print(ProcessSaveManager._failed_initialization[-1])" - ] - }, - { - "cell_type": "code", - "execution_count": 53, - "metadata": {}, - "outputs": [], - "source": [ - "from dbase.database.SQLHelpers import DatabaseAdapter\n", - "db = DatabaseAdapter()" - ] - }, - { - "cell_type": "code", - "execution_count": 72, - "metadata": {}, - "outputs": [], - "source": [ - "req = ProcessSaveManager._finished_requests[-4]\n", - "# db.save_to_database(\n", - "# req.saved_to_db_data,\n", - "# req.db_name,\n", - "# req.table_name,\n", - "# )" - ] - }, - { - "cell_type": "code", - "execution_count": 73, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
underlierstrikeexpirationput/callopenhighlowclosevolumebid_size...midpoint_binomial_thetamidpoint_binomial_rhomidpoint_binomial_vannamidpoint_binomial_volgadollar_deltamidpoint_dollar_deltaweighted_midpoint_dollar_deltalast_updatedmidpoint_bs_vol_resolvemidpoint_binomial_vol_resolve
Datetime
2025-04-04BAC23.02025-06-20C11.7611.7611.7611.761695...-0.0000280.048065-8.775414e+071.223001e+1331.80084430.32057529.9405232025-04-28 13:16:5100
2025-04-04BAC23.02025-06-20P0.320.480.320.4721254...0.0000000.000000-0.000000e+000.000000e+00-2.753477-4.434131-3.0498212025-04-28 13:16:5100
2024-08-05BAC25.02025-06-20C12.0212.7012.0012.453526...-0.0059560.154215-1.085008e+004.097584e+0132.83761630.62031029.7176992025-04-28 13:16:5100
2024-08-06BAC25.02025-06-20C12.9413.0012.9413.0015692...-0.0011950.202261-8.292627e+006.015641e+0232.31261333.81782934.3089722025-04-28 13:16:5100
2024-08-07BAC25.02025-06-20C13.5013.5012.9012.904650...-0.0048010.164402-1.593724e+006.792117e+0134.13808431.91574833.1698512025-04-28 13:16:5100
..................................................................
2025-04-21BAC65.02025-06-20P0.000.000.000.000191...0.004700-0.1060402.724787e+012.486498e+030.000000-34.127742-34.2894422025-04-28 13:16:5100
2025-04-22BAC65.02025-06-20P0.000.000.000.000163...0.004564-0.1042857.021628e+011.034611e+040.000000-35.746263-35.8582912025-04-28 13:16:5100
2025-04-23BAC65.02025-06-20P0.000.000.000.000156...0.004630-0.1025302.249114e+011.851098e+030.000000-33.932552-33.7883742025-04-28 13:16:5100
2025-04-24BAC65.02025-06-20P0.000.000.000.000160...0.004583-0.1007759.593434e+011.640620e+040.000000-37.044687-37.1892342025-04-28 13:16:5100
2025-04-25BAC65.02025-06-20P0.000.000.000.000164...0.004628-0.0990191.248530e+082.432170e+130.000000-37.426439-37.4524582025-04-28 13:16:5100
\n", - "

7586 rows × 87 columns

\n", - "
" - ], - "text/plain": [ - " underlier strike expiration put/call open high low close \\\n", - "Datetime \n", - "2025-04-04 BAC 23.0 2025-06-20 C 11.76 11.76 11.76 11.76 \n", - "2025-04-04 BAC 23.0 2025-06-20 P 0.32 0.48 0.32 0.47 \n", - "2024-08-05 BAC 25.0 2025-06-20 C 12.02 12.70 12.00 12.45 \n", - "2024-08-06 BAC 25.0 2025-06-20 C 12.94 13.00 12.94 13.00 \n", - "2024-08-07 BAC 25.0 2025-06-20 C 13.50 13.50 12.90 12.90 \n", - "... ... ... ... ... ... ... ... ... \n", - "2025-04-21 BAC 65.0 2025-06-20 P 0.00 0.00 0.00 0.00 \n", - "2025-04-22 BAC 65.0 2025-06-20 P 0.00 0.00 0.00 0.00 \n", - "2025-04-23 BAC 65.0 2025-06-20 P 0.00 0.00 0.00 0.00 \n", - "2025-04-24 BAC 65.0 2025-06-20 P 0.00 0.00 0.00 0.00 \n", - "2025-04-25 BAC 65.0 2025-06-20 P 0.00 0.00 0.00 0.00 \n", - "\n", - " volume bid_size ... midpoint_binomial_theta \\\n", - "Datetime ... \n", - "2025-04-04 1 695 ... -0.000028 \n", - "2025-04-04 212 54 ... 0.000000 \n", - "2024-08-05 35 26 ... -0.005956 \n", - "2024-08-06 15 692 ... -0.001195 \n", - "2024-08-07 4 650 ... -0.004801 \n", - "... ... ... ... ... \n", - "2025-04-21 0 191 ... 0.004700 \n", - "2025-04-22 0 163 ... 0.004564 \n", - "2025-04-23 0 156 ... 0.004630 \n", - "2025-04-24 0 160 ... 0.004583 \n", - "2025-04-25 0 164 ... 0.004628 \n", - "\n", - " midpoint_binomial_rho midpoint_binomial_vanna \\\n", - "Datetime \n", - "2025-04-04 0.048065 -8.775414e+07 \n", - "2025-04-04 0.000000 -0.000000e+00 \n", - "2024-08-05 0.154215 -1.085008e+00 \n", - "2024-08-06 0.202261 -8.292627e+00 \n", - "2024-08-07 0.164402 -1.593724e+00 \n", - "... ... ... \n", - "2025-04-21 -0.106040 2.724787e+01 \n", - "2025-04-22 -0.104285 7.021628e+01 \n", - "2025-04-23 -0.102530 2.249114e+01 \n", - "2025-04-24 -0.100775 9.593434e+01 \n", - "2025-04-25 -0.099019 1.248530e+08 \n", - "\n", - " midpoint_binomial_volga dollar_delta midpoint_dollar_delta \\\n", - "Datetime \n", - "2025-04-04 1.223001e+13 31.800844 30.320575 \n", - "2025-04-04 0.000000e+00 -2.753477 -4.434131 \n", - "2024-08-05 4.097584e+01 32.837616 30.620310 \n", - "2024-08-06 6.015641e+02 32.312613 33.817829 \n", - "2024-08-07 6.792117e+01 34.138084 31.915748 \n", - "... ... ... ... \n", - "2025-04-21 2.486498e+03 0.000000 -34.127742 \n", - "2025-04-22 1.034611e+04 0.000000 -35.746263 \n", - "2025-04-23 1.851098e+03 0.000000 -33.932552 \n", - "2025-04-24 1.640620e+04 0.000000 -37.044687 \n", - "2025-04-25 2.432170e+13 0.000000 -37.426439 \n", - "\n", - " weighted_midpoint_dollar_delta last_updated \\\n", - "Datetime \n", - "2025-04-04 29.940523 2025-04-28 13:16:51 \n", - "2025-04-04 -3.049821 2025-04-28 13:16:51 \n", - "2024-08-05 29.717699 2025-04-28 13:16:51 \n", - "2024-08-06 34.308972 2025-04-28 13:16:51 \n", - "2024-08-07 33.169851 2025-04-28 13:16:51 \n", - "... ... ... \n", - "2025-04-21 -34.289442 2025-04-28 13:16:51 \n", - "2025-04-22 -35.858291 2025-04-28 13:16:51 \n", - "2025-04-23 -33.788374 2025-04-28 13:16:51 \n", - "2025-04-24 -37.189234 2025-04-28 13:16:51 \n", - "2025-04-25 -37.452458 2025-04-28 13:16:51 \n", - "\n", - " midpoint_bs_vol_resolve midpoint_binomial_vol_resolve \n", - "Datetime \n", - "2025-04-04 0 0 \n", - "2025-04-04 0 0 \n", - "2024-08-05 0 0 \n", - "2024-08-06 0 0 \n", - "2024-08-07 0 0 \n", - "... ... ... \n", - "2025-04-21 0 0 \n", - "2025-04-22 0 0 \n", - "2025-04-23 0 0 \n", - "2025-04-24 0 0 \n", - "2025-04-25 0 0 \n", - "\n", - "[7586 rows x 87 columns]" - ] - }, - "execution_count": 73, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "req.saved_to_db_data" - ] - }, - { - "cell_type": "code", - "execution_count": 56, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[,\n", - " ,\n", - " ,\n", - " ]" - ] - }, - "execution_count": 56, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ProcessSaveManager._threads" - ] - }, - { - "cell_type": "code", - "execution_count": 73, - "metadata": {}, - "outputs": [ - { - "ename": "Empty", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mEmpty\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[73], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mProcessSaveManager\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_queue\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_nowait\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m:2\u001b[0m, in \u001b[0;36mget_nowait\u001b[0;34m(self, *args, **kwds)\u001b[0m\n", - "File \u001b[0;32m~/miniconda3/envs/openbb/lib/python3.11/multiprocessing/managers.py:837\u001b[0m, in \u001b[0;36mBaseProxy._callmethod\u001b[0;34m(self, methodname, args, kwds)\u001b[0m\n\u001b[1;32m 835\u001b[0m dispatch(conn, \u001b[38;5;28;01mNone\u001b[39;00m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mdecref\u001b[39m\u001b[38;5;124m'\u001b[39m, (token\u001b[38;5;241m.\u001b[39mid,))\n\u001b[1;32m 836\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m proxy\n\u001b[0;32m--> 837\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m convert_to_error(kind, result)\n", - "\u001b[0;31mEmpty\u001b[0m: " - ] - } - ], - "source": [ - "ProcessSaveManager._queue.get_nowait()" - ] - }, - { - "cell_type": "code", - "execution_count": 65, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "AssertionError('can only join a child process')" - ] - }, - "execution_count": 65, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "list(ProcessSaveManager._failed_requests)[0].error" - ] - }, - { - "cell_type": "code", - "execution_count": 87, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['SINGLE_SPY_2024-03-15_2023-06-02_2024-06-02_EOD']" - ] - }, - "execution_count": 87, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# get_chain_requests()\n", - "from module_test.raw_code.DataManagers.shared_obj import get_shared_queue, get_request_list\n", - "from module_test.raw_code.DataManagers.Requests import get_chain_requests, get_bulk_requests, get_single_requests\n", - "(get_single_requests())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[SaveManager] Enqueueing save request for SBUX on {'exp': '2024-03-15', 'start': '2023-06-02', 'end': '2024-06-02', 'tick': 'SBUX', 'save_func': functools.partial(, print_info=True)}\n", - "\n", - "Console Logging & File Logging Can be configured using STREAM_LOG_LEVEL and FILE_LOG_LEVEL in environment variables.\n", - "Propagate to root logger can be set using PROPAGATE_TO_ROOT_LOGGER in environment variables.\n", - "Example:\n", - "STREAM_LOG_LEVEL = 'DEBUG'\n", - "FILE_LOG_LEVEL = 'INFO'\n", - "PROPAGATE_TO_ROOT_LOGGER = 'False'\n", - "\n", - "2025-04-27 18:18:27 trade.helpers.Logging INFO: Logging Root Directory: /Users/chiemelienwanisobi/cloned_repos/QuantTools/logs\n", - "Using Proxy URL: http://18.232.166.224:5500/thetadata\n", - "FAGGGGG\n", - "FAGGGGG\n", - "FAGGGGGFAGGGGG\n", - "\n" - ] - } - ], - "source": [ - "kwargs = dict(exp = '2024-03-15',\n", - "start = '2023-06-02',\n", - "end = '2024-06-02',\n", - "tick = 'SBUX',\n", - "save_func = partial(save_to_database, print_info=True),)\n", - "ProcessSaveManager.enqueue(kwargs)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[<_MainThread(MainThread, started 140704295074560)>,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ]" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import threading\n", - "threading.enumerate()" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "ename": "AttributeError", - "evalue": "'ValueProxy' object has no attribute 'get_lock'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[26], line 2\u001b[0m\n\u001b[1;32m 1\u001b[0m v \u001b[38;5;241m=\u001b[39m manager\u001b[38;5;241m.\u001b[39mValue(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mi\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;241m0\u001b[39m)\n\u001b[0;32m----> 2\u001b[0m \u001b[43mv\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_lock\u001b[49m\n", - "\u001b[0;31mAttributeError\u001b[0m: 'ValueProxy' object has no attribute 'get_lock'" - ] - } - ], - "source": [ - "import pickle\n", - "from copy import deepcopy\n", - "\n", - "def is_pickleable(obj) -> bool:\n", - " try:\n", - " pickle.dumps(obj)\n", - " except Exception:\n", - " return False\n", - " return True\n", - "\n", - "def safe_prepare_request(request):\n", - " if is_pickleable(request):\n", - " return request\n", - "\n", - " safe_request = deepcopy(request)\n", - "\n", - " # Dangerous fields\n", - " dangerous_attrs = ['eod', 'intra', 'Stock', 'spot_manager', 'vol_manager', 'chain_manager']\n", - "\n", - " if hasattr(request, \"_non_pickle_fields\"):\n", - " dangerous_attrs.extend(request._non_pickle_fields)\n", - "\n", - " for attr in dangerous_attrs:\n", - " if hasattr(safe_request, attr):\n", - " setattr(safe_request, attr, None)\n", - "\n", - " if not is_pickleable(safe_request):\n", - " raise ValueError(f\"Request {type(request)} still not pickleable after cleaning.\")\n", - "\n", - " return safe_request\n" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "kwargs = {\"exp\": \"2025-09-19\", \"right\": \"P\", \"strike\": 55.0, \"start\": \"2024-09-25 00:00:00\", \"end\": \"2024-09-25 00:00:00\", \"tick\": \"BAC\", \"type_\": \"single\", \"save_func\": \"save_to_database\"}\n", - "kwargs['_requests'] = []" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The autoreload extension is already loaded. To reload it, use:\n", - " %reload_ext autoreload\n" - ] - } - ], - "source": [ - "%load_ext autoreload\n", - "%autoreload 2\n", - "from module_test.raw_code.DataManagers.Requests import create_request_bulk\n", - "from module_test.raw_code.DataManagers.DataManagers import save_to_database, save_chain_data, init_query\n", - "from trade.helpers.helper import optionPV_helper\n" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving to cache from db\n", - "[get_engine] Creating engine for DB: securities_master, PID: 41299\n" - ] - } - ], - "source": [ - "import json\n", - "import pandas as pd\n", - "items = []\n", - "with open('/Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/scheduler/requests.jsonl', 'r') as f:\n", - " for line in f:\n", - " line = line.strip()\n", - " if not line:\n", - " continue\n", - " items.append(json.loads(line))\n", - " for item in items:\n", - " ## Ensure save_func is a callable\n", - " item['save_func'] = eval(item['save_func'])\n", - "\n", - " ## Transform set_attributes to a DataFrame\n", - " if item['type_'] == 'chain':\n", - " item['set_attributes']['post_processed_data'] = pd.DataFrame(item['set_attributes']['post_processed_data'])\n", - " break\n", - "item['_requests'] = []\n", - "req = create_request_bulk(**item)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'2024-09-17'" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# req.start_date\n", - "# save_chain_data(req,pool = False)" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[0;31mSignature:\u001b[0m\n", - "\u001b[0moptionPV_helper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mspot_price\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mstrike_price\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m \u001b[0;34m|\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mexp_date\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m \u001b[0;34m|\u001b[0m \u001b[0mdatetime\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdatetime\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mrisk_free_rate\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mdividend_yield\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mvolatility\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mputcall\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0msettlement_date_str\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'bs'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mDocstring:\u001b[0m\n", - "Price an American option using QuantLib Engine\n", - "\n", - "params:\n", - "_________\n", - "\n", - "spot_price: Underlying Spot\n", - "strike_price: Options Strike price\n", - "exp_date: Options expiration date\n", - "risk_free_rate: Prevailing discount rate, annualized and expressed as 0.01 for 1%\n", - "volatility: Underlying Volatility\n", - "settlement_date_str: pricing date\n", - "model: Preferred pricing method. \n", - " Available options:\n", - " 'bsm': Black Scholes Model\n", - " 'bt': Binomial Tree Model\n", - " 'mcs': Monte Carlo Simulation\n", - "\n", - "Returns: \n", - "____________\n", - "\n", - "PV (float): Option present value\n", - "\u001b[0;31mFile:\u001b[0m ~/cloned_repos/QuantTools/trade/helpers/helper.py\n", - "\u001b[0;31mType:\u001b[0m function" - ] - } - ], - "source": [ - "optionPV_helper?" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "# dataaaa = init_query(data_request = req, query_category = 'chain', )\n", - "def brute_force_iv_backout(S, K, exp, r, q, flag, price, buildate):\n", - " samples = np.arange(0.01, 5.0, 0.001)\n", - " sample_dis = [abs(optionPV_helper(spot_price = S, strike_price = K, exp_date = exp, risk_free_rate=r, \\\n", - " dividend_yield = q, volatility = x, putcall = flag, settlement_date_str=buildate) - price )for x in samples]\n", - " vol_idx = np.argmin(sample_dis)\n", - " return samples[vol_idx], sample_dis, vol_idx" - ] - }, - { - "cell_type": "code", - "execution_count": 60, - "metadata": {}, - "outputs": [], - "source": [ - "pack = brute_force_iv_backout(\n", - " S = 209.25,\n", - " K = 195,\n", - " exp = '2024-09-20',\n", - " r = 0.04745,\n", - " q = 0.021168,\n", - " flag = 'C',\n", - " price = 14.675,\n", - " buildate = '2024-09-17'\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 61, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(14.673686923687264, 0.5609999999999995)" - ] - }, - "execution_count": 61, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pack[1][pack[2]]\n", - "optionPV_helper(\n", - " spot_price = 209.25, \n", - " strike_price = 195, \n", - " exp_date = '2024-09-20', \n", - " risk_free_rate=0.04745, \n", - " dividend_yield = 0.021168, \n", - " volatility = pack[0], \n", - " putcall = 'C', \n", - " settlement_date_str='2024-09-17'\n", - "), pack[0]" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
2122
expiration2024-09-20 00:00:002024-09-20 00:00:00
dte33
strike192.5195.0
rightCC
spot209.25209.25
r0.047450.04745
q0.0211680.021168
build_date2024-09-17 00:00:002024-09-17 00:00:00
tickerJPMJPM
price16.77514.675
bs_vol0.00.561674
binomial_vol0.60445907838750790.5614201303825566
moneyness1.0870131.073077
option_tickJPM20240920C192.5JPM20240920C195
bid_size41.042.0
closebid15.112.65
ask_size48.041.0
closeask18.4516.7
weighted_midpoint16.90674214.650602
\n", - "
" - ], - "text/plain": [ - " 21 22\n", - "expiration 2024-09-20 00:00:00 2024-09-20 00:00:00\n", - "dte 3 3\n", - "strike 192.5 195.0\n", - "right C C\n", - "spot 209.25 209.25\n", - "r 0.04745 0.04745\n", - "q 0.021168 0.021168\n", - "build_date 2024-09-17 00:00:00 2024-09-17 00:00:00\n", - "ticker JPM JPM\n", - "price 16.775 14.675\n", - "bs_vol 0.0 0.561674\n", - "binomial_vol 0.6044590783875079 0.5614201303825566\n", - "moneyness 1.087013 1.073077\n", - "option_tick JPM20240920C192.5 JPM20240920C195\n", - "bid_size 41.0 42.0\n", - "closebid 15.1 12.65\n", - "ask_size 48.0 41.0\n", - "closeask 18.45 16.7\n", - "weighted_midpoint 16.906742 14.650602" - ] - }, - "execution_count": 51, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "dataaaa.iloc[21:23].T#[dataaaa.bs_vol==0].loc[21]" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Size to be inserted: 1726\n", - "Error during INSERT IGNORE: (mysql.connector.errors.IntegrityError) 1062 (23000): Duplicate entry '2024-09-17 00:00:00-JPM20240920C100' for key 'option_chain.PRIMARY'\n", - "[SQL: \n", - " INSERT INTO option_chain\n", - " SELECT * FROM temp;\n", - " ]\n", - "(Background on this error at: https://sqlalche.me/e/20/gkpj)\n" - ] - } - ], - "source": [ - "from dbase.database.SQLHelpers import DatabaseAdapter, get_engine\n", - "db = DatabaseAdapter()\n", - "db.save_to_database(\n", - " req.post_processed_data,\n", - " req.db_name,\n", - " req.table_name,\n", - ")\n", - "# req.post_processed_data" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
build_datetickerexpirationstrikerightbid_sizeclosebidask_sizecloseaskpriceweighted_midpointdtespotrqoption_tickmoneynessbs_volbinomial_vol
02024-09-17 00:00:00JPM2024-10-18 00:00:00220.0P4212.302013.3512.82512.63871031209.250.047450.021168JPM20241018P2200.9511360.2595370.253885
12024-09-17 00:00:00JPM2024-10-18 00:00:00220.0C102.1212.152.1352.12272731209.250.047450.021168JPM20241018C2200.9511360.2370550.236367
22024-09-17 00:00:00JPM2024-10-25 00:00:00220.0P2212.501714.0513.27513.17564138209.250.047450.021168JPM20241025P2200.9511360.2577950.252829
32024-09-17 00:00:00JPM2024-10-25 00:00:00220.0C72.3912.642.5152.42125038209.250.047450.021168JPM20241025C2200.9511360.2301800.229789
42024-09-17 00:00:00JPM2024-11-01 00:00:00220.0C402.49193.352.9202.76694945209.250.047450.021168JPM20241101C2200.9511360.2267610.226986
............................................................
17212024-09-17 00:00:00JPM2025-03-21 00:00:00215.0P1015.351415.6515.50015.525000185209.250.047450.021168JPM20250321P2150.9732560.2370840.228504
17222024-09-17 00:00:00JPM2024-09-20 00:00:00220.0P469.304111.5010.40010.3367823209.250.047450.021168JPM20240920P2200.9511360.0000000.000100
17232024-09-17 00:00:00JPM2024-09-20 00:00:00220.0C960.0910.100.0950.0901033209.250.047450.021168JPM20240920C2200.9511360.3121740.312850
17242024-09-17 00:00:00JPM2024-10-04 00:00:00220.0C30.7150.750.7300.73500017209.250.047450.021168JPM20241004C2200.9511360.2134380.213198
17252024-09-17 00:00:00JPM2024-10-04 00:00:00220.0P4610.856213.1512.00012.17037017209.250.047450.021168JPM20241004P2200.9511360.2799210.275056
\n", - "

1726 rows × 19 columns

\n", - "
" - ], - "text/plain": [ - " build_date ticker expiration strike right bid_size \\\n", - "0 2024-09-17 00:00:00 JPM 2024-10-18 00:00:00 220.0 P 42 \n", - "1 2024-09-17 00:00:00 JPM 2024-10-18 00:00:00 220.0 C 10 \n", - "2 2024-09-17 00:00:00 JPM 2024-10-25 00:00:00 220.0 P 22 \n", - "3 2024-09-17 00:00:00 JPM 2024-10-25 00:00:00 220.0 C 7 \n", - "4 2024-09-17 00:00:00 JPM 2024-11-01 00:00:00 220.0 C 40 \n", - "... ... ... ... ... ... ... \n", - "1721 2024-09-17 00:00:00 JPM 2025-03-21 00:00:00 215.0 P 10 \n", - "1722 2024-09-17 00:00:00 JPM 2024-09-20 00:00:00 220.0 P 46 \n", - "1723 2024-09-17 00:00:00 JPM 2024-09-20 00:00:00 220.0 C 96 \n", - "1724 2024-09-17 00:00:00 JPM 2024-10-04 00:00:00 220.0 C 3 \n", - "1725 2024-09-17 00:00:00 JPM 2024-10-04 00:00:00 220.0 P 46 \n", - "\n", - " closebid ask_size closeask price weighted_midpoint dte spot \\\n", - "0 12.30 20 13.35 12.825 12.638710 31 209.25 \n", - "1 2.12 1 2.15 2.135 2.122727 31 209.25 \n", - "2 12.50 17 14.05 13.275 13.175641 38 209.25 \n", - "3 2.39 1 2.64 2.515 2.421250 38 209.25 \n", - "4 2.49 19 3.35 2.920 2.766949 45 209.25 \n", - "... ... ... ... ... ... ... ... \n", - "1721 15.35 14 15.65 15.500 15.525000 185 209.25 \n", - "1722 9.30 41 11.50 10.400 10.336782 3 209.25 \n", - "1723 0.09 1 0.10 0.095 0.090103 3 209.25 \n", - "1724 0.71 5 0.75 0.730 0.735000 17 209.25 \n", - "1725 10.85 62 13.15 12.000 12.170370 17 209.25 \n", - "\n", - " r q option_tick moneyness bs_vol binomial_vol \n", - "0 0.04745 0.021168 JPM20241018P220 0.951136 0.259537 0.253885 \n", - "1 0.04745 0.021168 JPM20241018C220 0.951136 0.237055 0.236367 \n", - "2 0.04745 0.021168 JPM20241025P220 0.951136 0.257795 0.252829 \n", - "3 0.04745 0.021168 JPM20241025C220 0.951136 0.230180 0.229789 \n", - "4 0.04745 0.021168 JPM20241101C220 0.951136 0.226761 0.226986 \n", - "... ... ... ... ... ... ... \n", - "1721 0.04745 0.021168 JPM20250321P215 0.973256 0.237084 0.228504 \n", - "1722 0.04745 0.021168 JPM20240920P220 0.951136 0.000000 0.000100 \n", - "1723 0.04745 0.021168 JPM20240920C220 0.951136 0.312174 0.312850 \n", - "1724 0.04745 0.021168 JPM20241004C220 0.951136 0.213438 0.213198 \n", - "1725 0.04745 0.021168 JPM20241004P220 0.951136 0.279921 0.275056 \n", - "\n", - "[1726 rows x 19 columns]" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "req.post_processed_data#[req.post_processed_data.option_tick == 'JPM20240920C100']" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[get_engine] Creating engine for DB: vol_surface, PID: 35477\n" - ] - }, - { - "data": { - "text/plain": [ - "Engine(mysql+mysqlconnector://chidi:***@23.84.202.121/vol_surface)" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving data to securities_master.temp_options_eod_new\n", - "Querying data from 2024-06-25 00:00:00 to 2024-12-25 00:00:00\n", - "Starting to save data to database\n", - "Size of spot data: (101, 22)\n", - "Size of spot data after filtering: (101, 23)\n", - "Calculating Vols\n", - "Resolving Vols\n", - "Calculating Greeks\n", - "Saving data to database\n", - "Size to be inserted: 101\n", - "Rows inserted into temp_options_eod_new: 101\r" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
openhighlowclosevolumebid_sizeclosebidask_sizecloseaskmidpoint...midpoint_binomial_thetamidpoint_binomial_rhomidpoint_binomial_vannamidpoint_binomial_volgadollar_deltamidpoint_dollar_deltaweighted_midpoint_dollar_deltalast_updatedmidpoint_bs_vol_resolvemidpoint_binomial_vol_resolve
Datetime
2024-08-020.00.00.00.0012615.4512618.9517.200...0.004726-0.5875313.215652e+074.247268e+120.0-27.459378-27.4593782025-04-30 02:14:0400
2024-08-050.00.00.00.0012616.6013621.0018.800...-0.000216-0.5165922.649427e+008.538295e+010.0-25.348382-25.1676962025-04-30 02:14:0400
2024-08-060.00.00.00.0013715.5013420.5018.000...0.004632-0.5819663.406918e+074.669711e+120.0-26.799036-26.8706682025-04-30 02:14:0400
2024-08-070.00.00.00.0014515.9012618.5017.200...0.004652-0.5804933.314547e+074.458681e+120.0-28.207151-28.4889512025-04-30 02:14:0400
2024-08-080.00.00.00.0012615.9513519.0017.475...-0.000948-0.4997812.320108e+006.771934e+010.0-25.826037-25.7150632025-04-30 02:14:0400
..................................................................
2024-12-180.00.00.00.00260411.10214912.2511.675...-0.000350-0.3559464.447449e+001.706316e+020.0-33.364151-33.5961022025-04-30 02:14:0400
2024-12-190.00.00.00.0032511.45110612.2011.825...-0.000534-0.3544604.325830e+001.640021e+020.0-33.298784-32.4986502025-04-30 02:14:0400
2024-12-200.00.00.00.00208.70713.4011.050...-0.000632-0.3501164.356841e+001.628900e+020.0-33.715035-42.3437472025-04-30 02:14:0400
2024-12-230.00.00.00.0014911.003211.3511.175...0.000357-0.3566375.602736e+002.405899e+020.0-34.255577-34.7977162025-04-30 02:14:0400
2024-12-240.00.00.00.004610.6512010.9010.775...-0.000286-0.3479024.803617e+001.877114e+020.0-34.146187-33.9008422025-04-30 02:14:0400
\n", - "

101 rows × 87 columns

\n", - "
" - ], - "text/plain": [ - " open high low close volume bid_size closebid ask_size \\\n", - "Datetime \n", - "2024-08-02 0.0 0.0 0.0 0.0 0 126 15.45 126 \n", - "2024-08-05 0.0 0.0 0.0 0.0 0 126 16.60 136 \n", - "2024-08-06 0.0 0.0 0.0 0.0 0 137 15.50 134 \n", - "2024-08-07 0.0 0.0 0.0 0.0 0 145 15.90 126 \n", - "2024-08-08 0.0 0.0 0.0 0.0 0 126 15.95 135 \n", - "... ... ... ... ... ... ... ... ... \n", - "2024-12-18 0.0 0.0 0.0 0.0 0 2604 11.10 2149 \n", - "2024-12-19 0.0 0.0 0.0 0.0 0 325 11.45 1106 \n", - "2024-12-20 0.0 0.0 0.0 0.0 0 20 8.70 7 \n", - "2024-12-23 0.0 0.0 0.0 0.0 0 149 11.00 32 \n", - "2024-12-24 0.0 0.0 0.0 0.0 0 46 10.65 120 \n", - "\n", - " closeask midpoint ... midpoint_binomial_theta \\\n", - "Datetime ... \n", - "2024-08-02 18.95 17.200 ... 0.004726 \n", - "2024-08-05 21.00 18.800 ... -0.000216 \n", - "2024-08-06 20.50 18.000 ... 0.004632 \n", - "2024-08-07 18.50 17.200 ... 0.004652 \n", - "2024-08-08 19.00 17.475 ... -0.000948 \n", - "... ... ... ... ... \n", - "2024-12-18 12.25 11.675 ... -0.000350 \n", - "2024-12-19 12.20 11.825 ... -0.000534 \n", - "2024-12-20 13.40 11.050 ... -0.000632 \n", - "2024-12-23 11.35 11.175 ... 0.000357 \n", - "2024-12-24 10.90 10.775 ... -0.000286 \n", - "\n", - " midpoint_binomial_rho midpoint_binomial_vanna \\\n", - "Datetime \n", - "2024-08-02 -0.587531 3.215652e+07 \n", - "2024-08-05 -0.516592 2.649427e+00 \n", - "2024-08-06 -0.581966 3.406918e+07 \n", - "2024-08-07 -0.580493 3.314547e+07 \n", - "2024-08-08 -0.499781 2.320108e+00 \n", - "... ... ... \n", - "2024-12-18 -0.355946 4.447449e+00 \n", - "2024-12-19 -0.354460 4.325830e+00 \n", - "2024-12-20 -0.350116 4.356841e+00 \n", - "2024-12-23 -0.356637 5.602736e+00 \n", - "2024-12-24 -0.347902 4.803617e+00 \n", - "\n", - " midpoint_binomial_volga dollar_delta midpoint_dollar_delta \\\n", - "Datetime \n", - "2024-08-02 4.247268e+12 0.0 -27.459378 \n", - "2024-08-05 8.538295e+01 0.0 -25.348382 \n", - "2024-08-06 4.669711e+12 0.0 -26.799036 \n", - "2024-08-07 4.458681e+12 0.0 -28.207151 \n", - "2024-08-08 6.771934e+01 0.0 -25.826037 \n", - "... ... ... ... \n", - "2024-12-18 1.706316e+02 0.0 -33.364151 \n", - "2024-12-19 1.640021e+02 0.0 -33.298784 \n", - "2024-12-20 1.628900e+02 0.0 -33.715035 \n", - "2024-12-23 2.405899e+02 0.0 -34.255577 \n", - "2024-12-24 1.877114e+02 0.0 -34.146187 \n", - "\n", - " weighted_midpoint_dollar_delta last_updated \\\n", - "Datetime \n", - "2024-08-02 -27.459378 2025-04-30 02:14:04 \n", - "2024-08-05 -25.167696 2025-04-30 02:14:04 \n", - "2024-08-06 -26.870668 2025-04-30 02:14:04 \n", - "2024-08-07 -28.488951 2025-04-30 02:14:04 \n", - "2024-08-08 -25.715063 2025-04-30 02:14:04 \n", - "... ... ... \n", - "2024-12-18 -33.596102 2025-04-30 02:14:04 \n", - "2024-12-19 -32.498650 2025-04-30 02:14:04 \n", - "2024-12-20 -42.343747 2025-04-30 02:14:04 \n", - "2024-12-23 -34.797716 2025-04-30 02:14:04 \n", - "2024-12-24 -33.900842 2025-04-30 02:14:04 \n", - "\n", - " midpoint_bs_vol_resolve midpoint_binomial_vol_resolve \n", - "Datetime \n", - "2024-08-02 0 0 \n", - "2024-08-05 0 0 \n", - "2024-08-06 0 0 \n", - "2024-08-07 0 0 \n", - "2024-08-08 0 0 \n", - "... ... ... \n", - "2024-12-18 0 0 \n", - "2024-12-19 0 0 \n", - "2024-12-20 0 0 \n", - "2024-12-23 0 0 \n", - "2024-12-24 0 0 \n", - "\n", - "[101 rows x 87 columns]" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "save_to_database(item, print_info=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'BAC20250919P55'" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "item.opttick" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "openbb", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.10" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/module_test/raw_code/DataManagers/ipynb_tests/test_rm_dm_use.ipynb b/module_test/raw_code/DataManagers/ipynb_tests/test_rm_dm_use.ipynb deleted file mode 100644 index 5724e40..0000000 --- a/module_test/raw_code/DataManagers/ipynb_tests/test_rm_dm_use.ipynb +++ /dev/null @@ -1,6489 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "from functools import wraps\n", - "import cProfile\n", - "import pstats\n", - "import io\n", - "\n", - "\n", - "\n", - "def cProfiler(func):\n", - " \"\"\"Decorator to profile a function to measure its execution time.\"\"\"\n", - " @wraps(func)\n", - " def wrapper(*args, **kwargs):\n", - " profiler = cProfile.Profile()\n", - " profiler.enable()\n", - " results = func(*args, **kwargs)\n", - " profiler.disable()\n", - " stream = io.StringIO()\n", - " stats = pstats.Stats(profiler, stream=stream).sort_stats('cumulative')\n", - " stats.print_stats()\n", - " return results, stream.getvalue()\n", - " return wrapper\n", - "\n", - "def cprofiler_func(func, *args, **kwargs):\n", - " \"\"\"Function to profile a function to measure its execution time.\"\"\"\n", - " profiler = cProfile.Profile()\n", - " profiler.enable()\n", - " results = func(*args, **kwargs)\n", - " profiler.disable()\n", - " stream = io.StringIO()\n", - " stats = pstats.Stats(profiler, stream=stream).sort_stats('cumulative')\n", - " stats.print_stats()\n", - " return results, stream.getvalue()\n", - "\n", - "\n", - "profiler = cProfile.Profile()\n", - "profiler.enable()\n", - "\n", - "\n", - "profiler.disable()\n", - "stream = io.StringIO()\n", - "stats = pstats.Stats(profiler, stream=stream).sort_stats('calls')" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Hi I am a child process with pid 18133 0\n", - "Child process started with PID 18133\n", - "Parent process with PID 16447, child PID: 18133\n", - "Parent process running...\n" - ] - }, - { - "ename": "KeyboardInterrupt", - "evalue": "Simulated exception in child process", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[15], line 51\u001b[0m\n\u001b[1;32m 49\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mHi I am a child process with pid\u001b[39m\u001b[38;5;124m\"\u001b[39m, os\u001b[38;5;241m.\u001b[39mgetpid(), pid)\n\u001b[1;32m 50\u001b[0m \u001b[38;5;66;03m# This is the child process\u001b[39;00m\n\u001b[0;32m---> 51\u001b[0m \u001b[43mchild_process2\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 52\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 53\u001b[0m \u001b[38;5;66;03m# This is the parent process\u001b[39;00m\n\u001b[1;32m 54\u001b[0m parent_process(pid)\n", - "Cell \u001b[0;32mIn[15], line 29\u001b[0m, in \u001b[0;36mchild_process2\u001b[0;34m()\u001b[0m\n\u001b[1;32m 27\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mChild process started with PID \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mos\u001b[38;5;241m.\u001b[39mgetpid()\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 28\u001b[0m time\u001b[38;5;241m.\u001b[39msleep(\u001b[38;5;241m2\u001b[39m) \u001b[38;5;66;03m# Simulate some work\u001b[39;00m\n\u001b[0;32m---> 29\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mKeyboardInterrupt\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mSimulated exception in child process\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", - "\u001b[0;31mKeyboardInterrupt\u001b[0m: Simulated exception in child process" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Signal 30 received by process 18133\n", - "Parent process sending SIGUSR1 to child...\n", - "Parent process waiting for child to exit...\n", - "Signal 2 received by process 16447\n" - ] - } - ], - "source": [ - "import os\n", - "import signal\n", - "import time\n", - "\n", - "def signal_handler(signum, frame):\n", - " print(f\"Signal {signum} received by process {os.getpid()}\")\n", - " \n", - "\n", - "# Register a signal handler for SIGUSR1\n", - "signal.signal(signal.SIGUSR1, signal_handler)\n", - "signal.signal(signal.SIGINT, signal_handler)\n", - "signal.signal(signal.SIGTERM, signal_handler)\n", - "\n", - "def child_process():\n", - " print(f\"Child process started with PID {os.getpid()}\")\n", - "\n", - " try:\n", - " print(\"Child process running...\")\n", - " time.sleep(2) # Simulate work\n", - " raise ValueError(\"Simulated exception in child process\")\n", - " except ValueError as e:\n", - " print(f\"Child process caught exception: {e}\")\n", - " finally:\n", - " print(\"Child process exiting...\")\n", - " os._exit(0) # Ensure the child process exits cleanly\n", - "\n", - "def child_process2():\n", - " print(f\"Child process started with PID {os.getpid()}\")\n", - " time.sleep(2) # Simulate some work\n", - " raise KeyboardInterrupt(\"Simulated exception in child process\") # Simulate an exception\n", - "\n", - "def parent_process(child_pid):\n", - " print(f\"Parent process with PID {os.getpid()}, child PID: {child_pid}\")\n", - " try:\n", - " print(\"Parent process running...\")\n", - " time.sleep(5) # Simulate work\n", - " print(\"Parent process sending SIGUSR1 to child...\")\n", - " os.kill(child_pid, signal.SIGUSR1) # Send a signal to the child process\n", - " except Exception as e:\n", - " print(f\"Parent process caught exception: {e}\")\n", - " finally:\n", - " print(\"Parent process waiting for child to exit...\")\n", - " os.wait() # Wait for the child process to exit\n", - " print(\"Parent process exiting...\")\n", - "\n", - "if __name__ == \"__main__\":\n", - " pid = os.fork() # Fork the process\n", - "\n", - " if pid == 0:\n", - " print(\"Hi I am a child process with pid\", os.getpid(), pid)\n", - " # This is the child process\n", - " child_process2()\n", - " else:\n", - " # This is the parent process\n", - " parent_process(pid)" - ] - }, - { - "cell_type": "code", - "execution_count": 176, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The autoreload extension is already loaded. To reload it, use:\n", - " %reload_ext autoreload\n" - ] - } - ], - "source": [ - "%load_ext autoreload\n", - "%autoreload 2\n", - "import pandas as pd, numpy as np\n", - "import os, sys\n", - "os.environ['STREAM_LOG_LEVEL'] = 'CRITICAL'\n", - "os.environ['PROXY_URL'] = ''\n", - "from datetime import datetime\n", - "from dateutil.relativedelta import relativedelta\n", - "from pandas.tseries.offsets import MonthEnd, MonthBegin, BDay\n", - "from trade.assets.Stock import Stock\n", - "from module_test.raw_code.DataManagers.DataManagers import set_save_bool, get_save_bool, save_to_database, init_query\n", - "from module_test.raw_code.DataManagers.DataManagers import *\n", - "from trade.helpers.helper import generate_option_tick_new, parse_option_tick, check_all_days_available, check_missing_dates\n", - "from module_test.raw_code.DataManagers.Requests import OptionQueryRequestParameter, BulkOptionQueryRequestParameter, create_request_bulk\n", - "# from module_test.raw_code.DataManagers.SaveManager import SaveManager\n", - "from dbase.database.SQLHelpers import DatabaseAdapter\n", - "from pprint import pprint" - ] - }, - { - "cell_type": "code", - "execution_count": 179, - "metadata": {}, - "outputs": [], - "source": [ - "kwargs = {\"start\": \"2023-01-04 00:00:00\", \"end\": \"2023-12-29 00:00:00\", \"tick\": \"AMZN\", \"exp\": \"2024-09-20 00:00:00\", \"print_info\": False, \"save_func\": \"save_to_database\", \"type_\": \"bulk\", '_requests': []}\n", - "# kwargs = {\"exp\": \"2024-01-19\", \"right\": \"C\", \"strike\": 480.0, \"start\": \"2023-01-04 00:00:00\", \"end\": \"2023-12-29 00:00:00\", \"tick\": \"NFLX\", \"type_\": \"single\", \"save_func\": \"save_to_database\", '_requests': []}\n", - "# kwargs = {\"exp\": \"2024-01-19\", \"right\": \"C\", \"strike\": 130.0, \"start\": \"2023-10-20\", \"end\": \"2023-10-25\", \"tick\": \"SBUX\", \"type_\": \"single\", \"save_func\": \"save_to_database\"}\n", - "kwargs[\"_requests\"] = []\n", - "test_bulk = create_request_bulk(**kwargs)" - ] - }, - { - "cell_type": "code", - "execution_count": 172, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "\n", - "Scheduled Data Requests will be saved to: /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/scheduler/requests.jsonl\n" - ] - } - ], - "source": [ - "SaveManager.schedule(kwargs)" - ] - }, - { - "cell_type": "code", - "execution_count": 149, - "metadata": {}, - "outputs": [], - "source": [ - "def check_if_already_saved(request, spot_sm):\n", - " \"\"\"\n", - " Check if the data has already been saved to the database.\n", - " \"\"\"\n", - " # Check if the data has already been saved\n", - " db = DatabaseAdapter()\n", - " if isinstance(request,OptionQueryRequestParameter):\n", - " filter_data = init_query(data_request=request, db=db, query_category='single')\n", - " filter_data['Datetime'] = pd.to_datetime(filter_data['datetime'])\n", - " missing_dates = check_missing_dates(filter_data, request.start_date, request.end_date)\n", - " return spot_sm[spot_sm.index.isin(missing_dates)]\n", - " elif isinstance(request,BulkOptionQueryRequestParameter):\n", - " ## Get all strikes to query\n", - " strikes = list(set(spot_sm[['k', 'Right']].itertuples(name = None, index = False)))\n", - " request.strikes = strikes\n", - " filter_data = init_query(data_request=request, db=db, query_category='bulk')\n", - " available = filter_data.set_index(['optiontick', 'datetime']).index\n", - " unavailable = spot_sm.reset_index().set_index(['OptionTick', 'Datetime']).index\n", - " mask = ~unavailable.isin(available)\n", - "\n", - " ## Filter the data to get the missing data\n", - " missing_data = spot_sm[mask]\n", - " return missing_data\n", - " else:\n", - " raise ValueError(\"Invalid request type. Must be OptionQueryRequestParameter or BulkOptionQueryRequestParameter.\")\n" - ] - }, - { - "cell_type": "code", - "execution_count": 161, - "metadata": {}, - "outputs": [], - "source": [ - "def save_to_database(data_request: 'RequestParameter', \n", - " print_info: bool = False, \n", - " pool: bool = None,\n", - " **kwargs) -> None:\n", - " \"\"\"\n", - " Saves the data to the database\n", - " \"\"\"\n", - " func_start = time.time()\n", - " req_class = data_request.__class__.__name__\n", - " ## This function is using parallel apply to reduce overhead on the current process.\n", - " if pool is None:\n", - " pool = get_pool_enabled()\n", - " print(f\"Pool: {pool}\", flush=True) if print_info else None\n", - " logger.info(f\"Saving data to {data_request.db_name}.{data_request.table_name}\")\n", - " print(f\"Saving data to {data_request.db_name}.{data_request.table_name}\", flush=True) if print_info else None\n", - " \n", - " ## Determine if the data is bulk or not\n", - " if isinstance(data_request, OptionQueryRequestParameter):\n", - " bulk = False\n", - " elif isinstance(data_request, BulkOptionQueryRequestParameter):\n", - " data_request.strike = None\n", - " data_request.right = None\n", - " bulk = True\n", - " else:\n", - " raise ValueError(f\"Expected data_request to be of type OptionQueryRequestParameter or BulkOptionQueryRequestParameter, recieved {type(data_request)}\")\n", - " \n", - " db = DatabaseAdapter()\n", - " if len(data_request.missing_dates) == 0:\n", - " print(\"No missing data, skipping save to database\", flush=True) if print_info else None\n", - " logger.warning(\"No missing data, skipping save to database\")\n", - " return\n", - " if bulk:\n", - " start_date, end_date = pd.to_datetime(min(data_request.missing_dates)) - relativedelta(months=1), pd.to_datetime(max(data_request.missing_dates)) + relativedelta(months=1)\n", - " else:\n", - " start_date, end_date = pd.to_datetime(min(data_request.missing_dates)) - relativedelta(months=3), pd.to_datetime(max(data_request.missing_dates)) + relativedelta(months=3)\n", - " logger.info(f\"Querying data from {start_date} to {end_date}\")\n", - " print(f\"Querying data from {start_date} to {end_date} for {req_class}\", flush=True) if print_info else None\n", - " \n", - " ## Start by populating initial data from spot_manager\n", - " spot_manager = SpotDataManager(data_request.symbol)\n", - " start = time.time()\n", - " print(\"Starting to query data\", flush=True) if print_info else None\n", - " spot_sm = spot_manager.query_thetadata(start_date, end_date,\n", - " strike=data_request.strike, exp=data_request.exp, \n", - " right=data_request.right, bulk=bulk, \n", - " data_request=data_request)\n", - " print(\"Time taken to query data: \", time.time() - start, flush=True) if print_info else None\n", - " spot_sm = spot_sm.fillna(0)\n", - " spot_sm.drop_duplicates(inplace=True)\n", - " spot_sm = check_if_already_saved(data_request, spot_sm)\n", - " if spot_sm.empty:\n", - " print(\"All data in Database, returning\") if print_info else None\n", - " return \n", - " return spot_sm" - ] - }, - { - "cell_type": "code", - "execution_count": 180, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "\n", - "Scheduled Data Requests will be saved to: /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/scheduler/requests.jsonl\n", - "Pool: False\n", - "Saving data to securities_master.temp_options_eod_new\n", - "Querying data from 2022-12-04 00:00:00 to 2024-01-29 00:00:00 for BulkOptionQueryRequestParameter\n", - "Starting to query data\n", - "Time taken to query data: 118.7481472492218\n" - ] - } - ], - "source": [ - "spot_sm = save_to_database(test_bulk, print_info=True, pool=False)" - ] - }, - { - "cell_type": "code", - "execution_count": 181, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
tickerkexp_dateRightOpenHighLowCloseVolumeBid_sizeCloseBidAsk_sizeCloseAskMidpointWeighted_midpointOptionTickOpen_interest
Datetime
2022-12-12AMZN45.02024-09-20C50.2050.6550.2050.6525150.706152.4051.55051.625893AMZN20240920C450.0
2022-12-13AMZN45.02024-09-20C0.000.000.000.0005052.555054.5553.55053.550000AMZN20240920C450.0
2022-12-14AMZN45.02024-09-20C0.000.000.000.0005051.555053.8052.67552.675000AMZN20240920C450.0
2022-12-15AMZN45.02024-09-20C49.9149.9149.9149.9111145.002854.5049.75051.820513AMZN20240920C450.0
2022-12-16AMZN45.02024-09-20C48.6148.7348.6148.7325048.105050.2549.17549.175000AMZN20240920C451.0
......................................................
2024-01-29AMZN230.02024-09-20P0.000.000.000.0006868.306769.1068.70068.697037AMZN20240920P2300.0
2024-01-26AMZN235.02024-09-20C1.101.121.091.12371171.091191.141.1151.115212AMZN20240920C2350.0
2024-01-29AMZN235.02024-09-20C1.151.281.121.28461201.271031.311.2901.288475AMZN20240920C23537.0
2024-01-26AMZN235.02024-09-20P0.000.000.000.0006075.457076.3075.87575.907692AMZN20240920P2350.0
2024-01-29AMZN235.02024-09-20P0.000.000.000.0006773.306874.1573.72573.728148AMZN20240920P2350.0
\n", - "

16524 rows × 17 columns

\n", - "
" - ], - "text/plain": [ - " ticker k exp_date Right Open High Low Close Volume \\\n", - "Datetime \n", - "2022-12-12 AMZN 45.0 2024-09-20 C 50.20 50.65 50.20 50.65 2 \n", - "2022-12-13 AMZN 45.0 2024-09-20 C 0.00 0.00 0.00 0.00 0 \n", - "2022-12-14 AMZN 45.0 2024-09-20 C 0.00 0.00 0.00 0.00 0 \n", - "2022-12-15 AMZN 45.0 2024-09-20 C 49.91 49.91 49.91 49.91 1 \n", - "2022-12-16 AMZN 45.0 2024-09-20 C 48.61 48.73 48.61 48.73 2 \n", - "... ... ... ... ... ... ... ... ... ... \n", - "2024-01-29 AMZN 230.0 2024-09-20 P 0.00 0.00 0.00 0.00 0 \n", - "2024-01-26 AMZN 235.0 2024-09-20 C 1.10 1.12 1.09 1.12 37 \n", - "2024-01-29 AMZN 235.0 2024-09-20 C 1.15 1.28 1.12 1.28 46 \n", - "2024-01-26 AMZN 235.0 2024-09-20 P 0.00 0.00 0.00 0.00 0 \n", - "2024-01-29 AMZN 235.0 2024-09-20 P 0.00 0.00 0.00 0.00 0 \n", - "\n", - " Bid_size CloseBid Ask_size CloseAsk Midpoint \\\n", - "Datetime \n", - "2022-12-12 51 50.70 61 52.40 51.550 \n", - "2022-12-13 50 52.55 50 54.55 53.550 \n", - "2022-12-14 50 51.55 50 53.80 52.675 \n", - "2022-12-15 11 45.00 28 54.50 49.750 \n", - "2022-12-16 50 48.10 50 50.25 49.175 \n", - "... ... ... ... ... ... \n", - "2024-01-29 68 68.30 67 69.10 68.700 \n", - "2024-01-26 117 1.09 119 1.14 1.115 \n", - "2024-01-29 120 1.27 103 1.31 1.290 \n", - "2024-01-26 60 75.45 70 76.30 75.875 \n", - "2024-01-29 67 73.30 68 74.15 73.725 \n", - "\n", - " Weighted_midpoint OptionTick Open_interest \n", - "Datetime \n", - "2022-12-12 51.625893 AMZN20240920C45 0.0 \n", - "2022-12-13 53.550000 AMZN20240920C45 0.0 \n", - "2022-12-14 52.675000 AMZN20240920C45 0.0 \n", - "2022-12-15 51.820513 AMZN20240920C45 0.0 \n", - "2022-12-16 49.175000 AMZN20240920C45 1.0 \n", - "... ... ... ... \n", - "2024-01-29 68.697037 AMZN20240920P230 0.0 \n", - "2024-01-26 1.115212 AMZN20240920C235 0.0 \n", - "2024-01-29 1.288475 AMZN20240920C235 37.0 \n", - "2024-01-26 75.907692 AMZN20240920P235 0.0 \n", - "2024-01-29 73.728148 AMZN20240920P235 0.0 \n", - "\n", - "[16524 rows x 17 columns]" - ] - }, - "execution_count": 181, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "spot_sm" - ] - }, - { - "cell_type": "code", - "execution_count": 117, - "metadata": {}, - "outputs": [], - "source": [ - "data = init_query(data_request = test_bulk, db = DatabaseAdapter(), query_category='single')\n", - "data.set_index('datetime', inplace=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 122, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 122, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "data['Datetime'] = data.index\n", - "check_all_days_available(data, test_bulk.start_date, test_bulk.end_date)" - ] - }, - { - "cell_type": "code", - "execution_count": 120, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
openhighlowclosevolumebid_sizeclosebidask_sizecloseaskstrike...ask_binomial_vannaask_binomial_volgabid_binomial_deltabid_binomial_gammabid_binomial_vegabid_binomial_rhobid_binomial_thetabid_binomial_vannabid_binomial_volgaDatetime
datetime
2023-10-200.080.080.070.071210.06220.07130.0...0.12664812.8025620.0138040.0026980.0166020.003089-0.0025970.11628612.0309322023-10-20
2023-10-230.060.060.060.06130.03110.10130.0...0.14843314.0000710.0080000.0018250.0101760.001743-0.0015290.0781088.6927892023-10-23
2023-10-240.060.060.050.053900.04990.06130.0...0.11566311.7403750.0104360.0022340.0128100.002252-0.0020150.09500910.1275142023-10-24
2023-10-250.050.050.050.0542890.032800.06130.0...0.11199311.2492150.0079700.0018110.0100040.001693-0.0015640.0765048.4039642023-10-25
\n", - "

4 rows × 87 columns

\n", - "
" - ], - "text/plain": [ - " open high low close volume bid_size closebid ask_size \\\n", - "datetime \n", - "2023-10-20 0.08 0.08 0.07 0.07 12 1 0.06 22 \n", - "2023-10-23 0.06 0.06 0.06 0.06 1 3 0.03 11 \n", - "2023-10-24 0.06 0.06 0.05 0.05 3 90 0.04 99 \n", - "2023-10-25 0.05 0.05 0.05 0.05 4 289 0.03 280 \n", - "\n", - " closeask strike ... ask_binomial_vanna ask_binomial_volga \\\n", - "datetime ... \n", - "2023-10-20 0.07 130.0 ... 0.126648 12.802562 \n", - "2023-10-23 0.10 130.0 ... 0.148433 14.000071 \n", - "2023-10-24 0.06 130.0 ... 0.115663 11.740375 \n", - "2023-10-25 0.06 130.0 ... 0.111993 11.249215 \n", - "\n", - " bid_binomial_delta bid_binomial_gamma bid_binomial_vega \\\n", - "datetime \n", - "2023-10-20 0.013804 0.002698 0.016602 \n", - "2023-10-23 0.008000 0.001825 0.010176 \n", - "2023-10-24 0.010436 0.002234 0.012810 \n", - "2023-10-25 0.007970 0.001811 0.010004 \n", - "\n", - " bid_binomial_rho bid_binomial_theta bid_binomial_vanna \\\n", - "datetime \n", - "2023-10-20 0.003089 -0.002597 0.116286 \n", - "2023-10-23 0.001743 -0.001529 0.078108 \n", - "2023-10-24 0.002252 -0.002015 0.095009 \n", - "2023-10-25 0.001693 -0.001564 0.076504 \n", - "\n", - " bid_binomial_volga Datetime \n", - "datetime \n", - "2023-10-20 12.030932 2023-10-20 \n", - "2023-10-23 8.692789 2023-10-23 \n", - "2023-10-24 10.127514 2023-10-24 \n", - "2023-10-25 8.403964 2023-10-25 \n", - "\n", - "[4 rows x 87 columns]" - ] - }, - "execution_count": 120, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "data\n", - "test_bulk.start_date, test_bulk.end_date" - ] - }, - { - "cell_type": "code", - "execution_count": 127, - "metadata": {}, - "outputs": [], - "source": [ - "def is_single_already_in_db(req):\n", - " \"\"\"\n", - " Check if the data has already been saved to the database.\n", - " \"\"\"\n", - " # Check if the data has already been saved\n", - " db = DatabaseAdapter()\n", - " if isinstance(req,OptionQueryRequestParameter):\n", - " pass\n", - " elif isinstance(req, dict):\n", - " req[\"_requests\"] = []\n", - " req = create_request_bulk(**req)\n", - " else:\n", - " raise ValueError(f\"Invalid request type. Must be OptionQueryRequestParameter or Dict. Received {type(req)}\")\n", - " \n", - " database_data = init_query(data_request=req, db=db, query_category='single')\n", - " database_data['Datetime'] = pd.to_datetime(database_data['datetime'])\n", - " bool_check = check_all_days_available(database_data, req.start_date, req.end_date)\n", - " return bool_check\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": 128, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 128, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "is_single_already_in_db(kwargs)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## TEST DATA MANAGER" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving to cache from db\n" - ] - } - ], - "source": [ - "# manager = OptionDataManager('AAPL', '2025-09-19', 'C', 225.0) ## EOD\n", - "manager = OptionDataManager('AAPL', '2025-09-19', 'P', 290.0) ## Intra\n", - "spot_manager = manager.spot_manager" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
OpenHighLowCloseMidpointVolumeOpeninterestCloseask
Datetime
2024-12-300.00.00.00.00.00.00.00.0
\n", - "
" - ], - "text/plain": [ - " Open High Low Close Midpoint Volume Openinterest Closeask\n", - "Datetime \n", - "2024-12-30 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "request_ = manager.get_at_time('2024-12-30', 'spot', return_price=False, model = 'binomial', extra_cols = ['ask'])\n", - "request_" - ] - }, - { - "cell_type": "code", - "execution_count": 85, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[]\n" - ] - } - ], - "source": [ - "pprint(BulkOptionDataManager._REQUESTS)" - ] - }, - { - "cell_type": "code", - "execution_count": 86, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Printing info\n", - "[SaveManager] Enqueueing save request for AAPL on \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving data to securities_master.temp_options_eod_new\n", - "Querying data from 2023-03-02 00:00:00 to 2024-09-02 00:00:00\n", - "Starting to save data to database\n", - "Size of spot data: (36596, 22)\n", - "Size of spot data after filtering: (25684, 23)\n", - "Calculating Vols\n" - ] - } - ], - "source": [ - "exp = '2024-03-15'\n", - "start = '2023-06-02'\n", - "end = '2024-06-02'\n", - "BulkOptionDataManager.one_off_save(\n", - " start = pd.to_datetime(start),\n", - " end = pd.to_datetime(end),\n", - " tick = 'AAPL',\n", - " exp = exp,\n", - " print_info = True\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "req = SaveManager.status()[ 'current_requests']['Thread-5 (_worker)']" - ] - }, - { - "cell_type": "code", - "execution_count": 91, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'active_threads': 4,\n", - " 'current_requests': {'SaveWorker-0': },\n", - " 'max_queue_size': 100,\n", - " 'num_failed_requests': 0,\n", - " 'num_finished_requests': 0,\n", - " 'pending_tasks': 0,\n", - " 'total_threads': 4}\n" - ] - } - ], - "source": [ - "pprint(SaveManager.status())" - ] - }, - { - "cell_type": "code", - "execution_count": 81, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[SaveManager] All save workers have been killed.\n", - "[SaveManager] Restarted all save workers.\n" - ] - } - ], - "source": [ - "SaveManager.restart_workers()" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "KeyError('UPPER_BOUND_MONEYNES')" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "req = SaveManager._failed_requests[0]\n", - "req.error\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
RootStrikeExpirationRightOpenHighLowCloseVolumeBid_sizeCloseBidAsk_sizeCloseAskMidpointWeighted_midpoint
Datetime
2023-06-02 16:00:00NFLX5.02024-03-15C0.000.000.000.00035392.2025400.15396.175395.512500
2023-06-05 16:00:00NFLX5.02024-03-15C0.000.000.000.00025394.3015403.25398.775397.656250
2023-06-06 16:00:00NFLX5.02024-03-15C396.74396.74395.22395.22225390.3015399.00394.650393.562500
2023-06-07 16:00:00NFLX5.02024-03-15C0.000.000.000.00025391.7515399.50395.625394.656250
2023-06-08 16:00:00NFLX5.02024-03-15C0.000.000.000.00015400.4510405.85403.150402.610000
................................................
2024-03-11 16:00:00NFLX960.02024-03-15P0.000.000.000.00025356.8525361.30359.075359.075000
2024-03-12 16:00:00NFLX960.02024-03-15P0.000.000.000.00013348.1025350.85349.475349.909211
2024-03-13 16:00:00NFLX960.02024-03-15P0.000.000.000.0006349.5025352.70351.100352.080645
2024-03-14 16:00:00NFLX960.02024-03-15P0.000.000.000.00025344.5525348.95346.750346.750000
2024-03-15 16:00:00NFLX960.02024-03-15P0.000.000.000.00022352.8525356.25354.550354.658511
\n", - "

100504 rows × 15 columns

\n", - "
" - ], - "text/plain": [ - " Root Strike Expiration Right Open High Low \\\n", - "Datetime \n", - "2023-06-02 16:00:00 NFLX 5.0 2024-03-15 C 0.00 0.00 0.00 \n", - "2023-06-05 16:00:00 NFLX 5.0 2024-03-15 C 0.00 0.00 0.00 \n", - "2023-06-06 16:00:00 NFLX 5.0 2024-03-15 C 396.74 396.74 395.22 \n", - "2023-06-07 16:00:00 NFLX 5.0 2024-03-15 C 0.00 0.00 0.00 \n", - "2023-06-08 16:00:00 NFLX 5.0 2024-03-15 C 0.00 0.00 0.00 \n", - "... ... ... ... ... ... ... ... \n", - "2024-03-11 16:00:00 NFLX 960.0 2024-03-15 P 0.00 0.00 0.00 \n", - "2024-03-12 16:00:00 NFLX 960.0 2024-03-15 P 0.00 0.00 0.00 \n", - "2024-03-13 16:00:00 NFLX 960.0 2024-03-15 P 0.00 0.00 0.00 \n", - "2024-03-14 16:00:00 NFLX 960.0 2024-03-15 P 0.00 0.00 0.00 \n", - "2024-03-15 16:00:00 NFLX 960.0 2024-03-15 P 0.00 0.00 0.00 \n", - "\n", - " Close Volume Bid_size CloseBid Ask_size CloseAsk \\\n", - "Datetime \n", - "2023-06-02 16:00:00 0.00 0 35 392.20 25 400.15 \n", - "2023-06-05 16:00:00 0.00 0 25 394.30 15 403.25 \n", - "2023-06-06 16:00:00 395.22 2 25 390.30 15 399.00 \n", - "2023-06-07 16:00:00 0.00 0 25 391.75 15 399.50 \n", - "2023-06-08 16:00:00 0.00 0 15 400.45 10 405.85 \n", - "... ... ... ... ... ... ... \n", - "2024-03-11 16:00:00 0.00 0 25 356.85 25 361.30 \n", - "2024-03-12 16:00:00 0.00 0 13 348.10 25 350.85 \n", - "2024-03-13 16:00:00 0.00 0 6 349.50 25 352.70 \n", - "2024-03-14 16:00:00 0.00 0 25 344.55 25 348.95 \n", - "2024-03-15 16:00:00 0.00 0 22 352.85 25 356.25 \n", - "\n", - " Midpoint Weighted_midpoint \n", - "Datetime \n", - "2023-06-02 16:00:00 396.175 395.512500 \n", - "2023-06-05 16:00:00 398.775 397.656250 \n", - "2023-06-06 16:00:00 394.650 393.562500 \n", - "2023-06-07 16:00:00 395.625 394.656250 \n", - "2023-06-08 16:00:00 403.150 402.610000 \n", - "... ... ... \n", - "2024-03-11 16:00:00 359.075 359.075000 \n", - "2024-03-12 16:00:00 349.475 349.909211 \n", - "2024-03-13 16:00:00 351.100 352.080645 \n", - "2024-03-14 16:00:00 346.750 346.750000 \n", - "2024-03-15 16:00:00 354.550 354.658511 \n", - "\n", - "[100504 rows x 15 columns]" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "data = retrieve_bulk_eod(\n", - " symbol = 'NFLX',\n", - " exp = req.exp,\n", - " start_date= req.start_date,\n", - " end_date = req.end_date,\n", - " end_time = '16:00',\n", - " right = None\n", - ")\n", - "data" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# BEGIN TESTS ON RISKMANAGER TIME PERFORMANCE" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "import warnings\n", - "warnings.filterwarnings(\"ignore\")" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Using Old DataManager\n" - ] - } - ], - "source": [ - "from EventDriven.riskmanager import (RiskManager, \n", - " OrderPicker)\n", - "from EventDriven.riskmanager.utils import (\n", - " produce_order_candidates, \n", - " populate_cache, \n", - " clear_cache, \n", - " return_closePrice,\n", - " get_cache,\n", - " close_cache,\n", - " oi_cache,\n", - " spot_cache,\n", - " \n", - ")\n", - "from trade.helpers.threads import runThreads\n", - "from trade.helpers.helper import generate_option_tick_new, parse_option_tick, check_all_days_available\n", - "from dbase.DataAPI.ThetaData import retrieve_eod_ohlc, retrieve_openInterest\n", - "from dbase.utils import default_timestamp, add_eod_timestamp\n", - "from functools import partial\n", - "def _retrieve_openInterest(*args, **kwargs):\n", - " try:\n", - " return retrieve_openInterest(*args, **kwargs)\n", - " except Exception as e:\n", - " return None\n", - "produce_order_candidates_cprofiler = cProfiler(produce_order_candidates)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## GET ORDER Improvements" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### PRODUCE_ORDER_CANDIDATES\n", - "\n", - "- Used HOLIDAY_SETS in is_USHoliday to optimize time" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "clear_cache()" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving to cache from db\n" - ] - } - ], - "source": [ - "order = {'type': 'naked', \n", - " 'specifics': [{'direction': 'long', 'rel_strike': 0.85, 'dte': 300, 'moneyness_width': 0.15}, \n", - " {'direction': 'short', 'rel_strike': 0.6, 'dte': 300, 'moneyness_width': 0.15}], \n", - " 'name': 'vertical_spread'}\n", - "candidates, stats = produce_order_candidates_cprofiler(order,\n", - " 'NVDA',\n", - " '2023-06-02',\n", - " 'C',\n", - " False)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " 4447279 function calls (4420341 primitive calls) in 22.537 seconds\n", - "\n", - " Ordered by: cumulative time\n", - "\n", - " ncalls tottime percall cumtime percall filename:lineno(function)\n", - " 1 0.000 0.000 22.537 22.537 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:655(produce_order_candidates)\n", - " 2 0.001 0.000 22.537 11.269 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:519(chain_details)\n", - " 1 0.000 0.000 18.774 18.774 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:85(__init__)\n", - " 1 0.000 0.000 16.689 16.689 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:216(init_rfrate_ts)\n", - " 1 0.000 0.000 16.689 16.689 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/rates.py:178(get_risk_free_rate_helper)\n", - " 1 0.002 0.002 16.427 16.427 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/rates.py:126(_fetch_rates)\n", - " 1 0.007 0.007 16.419 16.419 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/rates.py:31(fetch_rates_save_cache)\n", - " 1 0.000 0.000 10.622 10.622 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/database/SQLHelpers.py:87(query_database)\n", - " 1 0.004 0.004 10.622 10.622 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:570(read_sql)\n", - " 5 0.000 0.000 9.727 1.945 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1713(exec_driver_sql)\n", - " 5 0.000 0.000 9.727 1.945 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1791(_execute_context)\n", - " 7 0.000 0.000 9.500 1.357 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:311(execute)\n", - " 5 0.000 0.000 9.380 1.876 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1850(_exec_single_context)\n", - " 5 0.000 0.000 9.379 1.876 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:940(do_execute)\n", - " 1 0.000 0.000 9.270 9.270 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:1779(read_query)\n", - " 1 0.000 0.000 9.199 9.199 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:1655(execute)\n", - " 4 0.002 0.000 7.769 1.942 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:139(retrieve_timeseries)\n", - " 6 0.000 0.000 6.480 1.080 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:214(_handle_result)\n", - " 6 0.000 0.000 6.480 1.080 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:815(_handle_resultset)\n", - " 6 0.210 0.035 6.480 1.080 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:456(get_rows)\n", - " 45766 6.249 0.000 6.249 0.000 {method 'fetch_row' of '_mysql_connector.MySQL' objects}\n", - " 7 0.000 0.000 5.083 0.726 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/utils/decorators.py:47(wrapper)\n", - " 7 0.000 0.000 5.083 0.726 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/utils/decorators.py:35(wrapper)\n", - " 7 0.000 0.000 5.010 0.716 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/validate_call_decorator.py:58(wrapper_function)\n", - " 7 0.000 0.000 5.010 0.716 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_validate_call.py:95(__call__)\n", - " 7 0.000 0.000 5.009 0.716 {method 'validate_python' of 'pydantic_core._pydantic_core.SchemaValidator' objects}\n", - " 7 0.000 0.000 5.009 0.716 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/container.py:23(_run)\n", - " 7 0.000 0.000 5.009 0.716 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/command_runner.py:503(sync_run)\n", - " 7 0.000 0.000 5.009 0.716 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/provider/utils/helpers.py:581(run_async)\n", - " 122 5.003 0.041 5.003 0.041 {method 'acquire' of '_thread.lock' objects}\n", - " 32 0.000 0.000 4.999 0.156 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:295(wait)\n", - " 35 0.000 0.000 4.997 0.143 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:428(result)\n", - " 21 0.000 0.000 4.989 0.238 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/from_thread.py:275(call)\n", - " 7 0.000 0.000 4.395 0.628 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/obbject.py:125(to_dataframe)\n", - " 6 0.000 0.000 4.334 0.722 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/obbject.py:85(to_df)\n", - " 7 0.002 0.000 4.265 0.609 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/utils.py:20(basemodel_to_df)\n", - " 23600 0.196 0.000 3.546 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:673(to_datetime)\n", - " 8 0.000 0.000 3.413 0.427 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:4789(apply)\n", - " 8 0.001 0.000 3.413 0.427 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1409(apply)\n", - " 8 0.000 0.000 3.412 0.427 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1482(apply_standard)\n", - " 9 0.000 0.000 3.391 0.377 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:891(_map_values)\n", - " 9 0.034 0.004 3.390 0.377 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:1667(map_array)\n", - " 4 0.000 0.000 3.304 0.826 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/equity_price.py:28(historical)\n", - " 8 0.000 0.000 3.095 0.387 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/opentelemetry/context_propagation.py:93(wrapper)\n", - " 8 0.000 0.000 3.095 0.387 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:690(cmd_query)\n", - " 8 3.095 0.387 3.095 0.387 {method 'query' of '_mysql_connector.MySQL' objects}\n", - " 23590 0.165 0.000 2.636 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:314(_convert_listlike_datetimes)\n", - " 3 0.003 0.001 2.585 0.862 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:376(spot)\n", - " 2 0.000 0.000 1.967 0.984 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:311(div_yield)\n", - " 2 0.001 0.000 1.957 0.978 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:326(div_yield_history)\n", - " 23460 0.050 0.000 1.693 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:259(_box_as_indexlike)\n", - " 23470 0.093 0.000 1.656 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:320(__new__)\n", - " 23584 0.185 0.000 1.324 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:329(_from_sequence_not_strict)\n", - " 1 0.000 0.000 1.166 1.166 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:885(pandasSQL_builder)\n", - " 1 0.000 0.000 1.166 1.166 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:1620(__init__)\n", - " 1 0.000 0.000 1.166 1.166 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:3255(connect)\n", - " 2/1 0.000 0.000 1.166 1.166 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:132(__init__)\n", - " 1 0.000 0.000 1.166 1.166 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:3280(raw_connection)\n", - " 1 0.000 0.000 1.165 1.165 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:441(connect)\n", - " 1 0.000 0.000 1.165 1.165 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1255(_checkout)\n", - " 1 0.000 0.000 1.165 1.165 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:707(checkout)\n", - " 1 0.000 0.000 1.165 1.165 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/impl.py:153(_do_get)\n", - " 1 0.000 0.000 1.165 1.165 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:387(_create_connection)\n", - " 1 0.000 0.000 1.165 1.165 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:666(__init__)\n", - " 1 0.000 0.000 1.165 1.165 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:888(__connect)\n", - " 2 0.000 0.000 1.158 0.579 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/equity_fundamental.py:938(dividends)\n", - " 3 0.000 0.000 1.111 0.370 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:500(request)\n", - " 3 0.000 0.000 1.105 0.368 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:673(send)\n", - " 3 0.000 0.000 1.102 0.367 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:613(send)\n", - " 3 0.000 0.000 1.100 0.367 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:594(urlopen)\n", - " 3 0.000 0.000 1.098 0.366 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:379(_make_request)\n", - " 3 0.000 0.000 1.043 0.348 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:481(getresponse)\n", - " 3 0.000 0.000 1.041 0.347 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1351(getresponse)\n", - " 3 0.000 0.000 1.041 0.347 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:318(begin)\n", - " 23 0.000 0.000 1.041 0.045 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:704(readinto)\n", - " 53 0.000 0.000 1.039 0.020 {method 'readline' of '_io.BufferedReader' objects}\n", - " 3 0.000 0.000 1.039 0.346 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:285(_read_status)\n", - " 1 0.000 0.000 0.985 0.985 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:459(option_chain)\n", - " 1 0.000 0.000 0.956 0.956 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:134(list_contracts)\n", - " 1 0.000 0.000 0.939 0.939 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/api.py:62(get)\n", - " 1 0.000 0.000 0.939 0.939 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/api.py:14(request)\n", - " 16 0.931 0.058 0.931 0.058 {method 'recv_into' of '_socket.socket' objects}\n", - " 416/405 0.008 0.000 0.769 0.002 {built-in method builtins.all}\n", - " 45926 0.755 0.000 0.760 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:645(__iter__)\n", - " 12/4 0.001 0.000 0.752 0.188 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:848(resample)\n", - " 23584 0.183 0.000 0.718 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2184(_sequence_to_dt64)\n", - " 1 0.000 0.000 0.708 0.708 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/attr.py:468(_exec_w_sync_on_first_run)\n", - " 1 0.000 0.000 0.708 0.708 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/attr.py:491(__call__)\n", - " 1 0.000 0.000 0.708 0.708 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/langhelpers.py:1905(go)\n", - " 1 0.000 0.000 0.708 0.708 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/create.py:729(first_connect)\n", - " 47156 0.127 0.000 0.707 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2428(maybe_convert_dtype)\n", - " 23452 0.025 0.000 0.700 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/utils.py:48()\n", - "1122227/1121849 0.330 0.000 0.682 0.000 {built-in method builtins.isinstance}\n", - " 1 0.000 0.000 0.669 0.669 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:296(prev_close)\n", - " 1 0.000 0.000 0.649 0.649 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/base.py:2826(initialize)\n", - " 1 0.000 0.000 0.547 0.547 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/equity_price.py:361(quote)\n", - " 7 0.000 0.000 0.467 0.067 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:733(cursor)\n", - " 7 0.000 0.000 0.466 0.067 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:387(is_connected)\n", - " 7 0.466 0.067 0.466 0.067 {method 'ping' of '_mysql_connector.MySQL' objects}\n", - " 1 0.000 0.000 0.458 0.458 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/create.py:631(connect)\n", - " 1 0.000 0.000 0.458 0.458 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:619(connect)\n", - " 1 0.000 0.000 0.458 0.458 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/pooling.py:202(connect)\n", - " 1 0.000 0.000 0.458 0.458 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:123(__init__)\n", - " 1 0.000 0.000 0.457 0.457 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:1376(connect)\n", - " 23 0.000 0.000 0.440 0.019 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:821(date_range)\n", - " 23 0.002 0.000 0.440 0.019 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:397(_generate_range)\n", - " 10 0.000 0.000 0.439 0.044 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:9382(resample)\n", - " 10 0.000 0.000 0.439 0.044 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:2045(get_resampler)\n", - " 10 0.000 0.000 0.438 0.044 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:2210(_get_resampler)\n", - " 10 0.000 0.000 0.437 0.044 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:163(__init__)\n", - " 10 0.000 0.000 0.437 0.044 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:246(_get_binner)\n", - " 10 0.000 0.000 0.436 0.044 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:1737(_get_binner_for_time)\n", - " 10 0.001 0.000 0.436 0.044 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:2285(_get_time_bins)\n", - " 21 0.014 0.001 0.430 0.020 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:468()\n", - " 32544 0.416 0.000 0.416 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2712(_generate_range)\n", - " 23889 0.048 0.000 0.406 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5373(__getitem__)\n", - " 1 0.000 0.000 0.383 0.383 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:517(initialize)\n", - " 5 0.000 0.000 0.347 0.069 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1523(_init_statement)\n", - " 5 0.000 0.000 0.347 0.069 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1736(create_cursor)\n", - " 5 0.000 0.000 0.347 0.069 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1757(create_default_cursor)\n", - " 23630 0.049 0.000 0.346 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:373(__getitem__)\n", - " 47177 0.098 0.000 0.327 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1163(is_float_dtype)\n", - " 1 0.000 0.000 0.310 0.310 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:254(_open_connection)\n", - " 1 0.310 0.310 0.310 0.310 {method 'connect' of '_mysql_connector.MySQL' objects}\n", - " 23634 0.047 0.000 0.292 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:278(__getitem__)\n", - " 4 0.000 0.000 0.287 0.072 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1179(cursor)\n", - " 12 0.003 0.000 0.269 0.022 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/utils.py:10(add_eod_timestamp)\n", - " 2 0.000 0.000 0.266 0.133 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/base.py:3264(_fetch_setting)\n", - " 23585 0.075 0.000 0.253 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2425(ensure_arraylike_for_datetimelike)\n", - " 23599 0.130 0.000 0.244 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:545(_box_func)\n", - " 192292 0.106 0.000 0.233 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/generic.py:42(_instancecheck)\n", - " 47257 0.093 0.000 0.232 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1198(is_bool_dtype)\n", - " 23466 0.200 0.000 0.216 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2354(objects_to_datetime64)\n", - " 70785 0.074 0.000 0.209 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1375(_is_dtype)\n", - " 1 0.000 0.000 0.176 0.176 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/ticker.py:157(info)\n", - " 1 0.000 0.000 0.176 0.176 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/base.py:242(get_info)\n", - " 1 0.000 0.000 0.176 0.176 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/scrapers/quote.py:505(info)\n", - " 2 0.000 0.000 0.174 0.087 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/scrapers/quote.py:604(_fetch_info)\n", - " 2 0.000 0.000 0.173 0.086 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/data.py:428(get_raw_json)\n", - " 8/2 0.000 0.000 0.173 0.086 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/utils.py:98(wrapper)\n", - " 2 0.000 0.000 0.173 0.086 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/data.py:347(get)\n", - " 2 0.000 0.000 0.172 0.086 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/data.py:355(_make_request)\n", - " 2 0.000 0.000 0.172 0.086 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:593(get)\n", - "316710/316598 0.056 0.000 0.158 0.000 {built-in method builtins.getattr}\n", - " 1 0.000 0.000 0.149 0.149 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/base.py:3284(_detect_casing)\n", - " 1 0.000 0.000 0.147 0.147 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:1344(_post_connection)\n", - " 1 0.000 0.000 0.141 0.141 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/base.py:2729(_get_default_schema_name)\n", - " 20 0.001 0.000 0.137 0.007 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:694(__init__)\n", - " 23583 0.027 0.000 0.129 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:536(is_string_dtype)\n", - " 192292 0.097 0.000 0.126 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/generic.py:37(_check)\n", - " 23571 0.068 0.000 0.126 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:126(_guess_datetime_format_for_array)\n", - " 1 0.000 0.000 0.126 0.126 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/base.py:2574(_get_server_version_info)\n", - " 1 0.000 0.000 0.123 0.123 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:2037(has_table)\n", - " 1 0.000 0.000 0.123 0.123 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/scrapers/quote.py:593(_fetch_additional_info)\n", - " 1 0.000 0.000 0.123 0.123 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:400(has_table)\n", - " 1 0.000 0.000 0.123 0.123 :1(has_table)\n", - " 1 0.000 0.000 0.123 0.123 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:78(cache)\n", - " 1 0.000 0.000 0.123 0.123 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/base.py:2732(has_table)\n", - " 2 0.000 0.000 0.121 0.061 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1483(cursor)\n", - " 493 0.006 0.000 0.119 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:517(sanitize_array)\n", - " 2 0.000 0.000 0.118 0.059 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:698(do_rollback)\n", - " 2 0.000 0.000 0.118 0.059 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:578(rollback)\n", - " 2 0.118 0.059 0.118 0.059 {method 'rollback' of '_mysql_connector.MySQL' objects}\n", - " 1 0.000 0.000 0.117 0.117 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/base.py:3321(_detect_sql_mode)\n", - " 1 0.000 0.000 0.116 0.116 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:569(get_default_isolation_level)\n", - " 1 0.000 0.000 0.116 0.116 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/base.py:2537(get_isolation_level)\n", - " 23957 0.085 0.000 0.111 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:649(_simple_new)\n", - " 273 0.006 0.000 0.110 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:475(__new__)\n", - " 7 0.000 0.000 0.109 0.016 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ssl.py:1299(recv_into)\n", - " 7 0.000 0.000 0.109 0.016 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ssl.py:1157(read)\n", - " 7 0.109 0.016 0.109 0.016 {method 'read' of '_ssl._SSLSocket' objects}\n", - " 12 0.002 0.000 0.106 0.009 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/arraysetops.py:138(unique)\n", - " 12 0.006 0.000 0.104 0.009 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/arraysetops.py:323(_unique1d)\n", - " 429 0.000 0.000 0.102 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/extension.py:67(fget)\n", - " 12 0.100 0.008 0.100 0.008 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:1368(time)\n", - " 47439 0.052 0.000 0.100 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1434(_is_dtype_type)\n", - " 23837 0.098 0.000 0.098 0.000 {built-in method numpy.array}\n", - " 12 0.098 0.008 0.098 0.008 {method 'sort' of 'numpy.ndarray' objects}\n", - " 23848 0.030 0.000 0.097 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7688(maybe_extract_name)\n", - " 118666 0.047 0.000 0.095 0.000 :117(__instancecheck__)\n", - " 23611 0.083 0.000 0.092 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:304(_simple_new)\n", - " 7 0.017 0.002 0.091 0.013 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/utils.py:30()\n", - " 118042 0.058 0.000 0.083 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1399(_get_dtype)\n", - " 27 0.001 0.000 0.083 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:209(_maybe_cache)\n", - " 10 0.000 0.000 0.083 0.008 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:506(nested_data_to_arrays)\n", - " 10 0.000 0.000 0.082 0.008 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:793(to_arrays)\n", - " 27 0.005 0.000 0.076 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:149(should_cache)\n", - " 1 0.000 0.000 0.076 0.076 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:1264(set_charset_collation)\n", - " 23549 0.012 0.000 0.074 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/main.py:352(model_dump)\n", - " 7 0.000 0.000 0.073 0.010 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/validate_call_decorator.py:28(validate_call)\n", - " 7 0.000 0.000 0.073 0.010 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/validate_call_decorator.py:51(validate)\n", - " 7 0.000 0.000 0.073 0.010 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_validate_call.py:26(__init__)\n", - " 2 0.000 0.000 0.073 0.036 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:10170(apply)\n", - " 2 0.000 0.000 0.073 0.036 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:864(apply)\n", - " 2 0.000 0.000 0.073 0.036 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1061(apply_standard)\n", - " 2 0.000 0.000 0.072 0.036 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1070(apply_series_generator)\n", - " 1 0.000 0.000 0.071 0.071 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:223(autocommit)\n", - " 1 0.071 0.071 0.071 0.071 {method 'autocommit' of '_mysql_connector.MySQL' objects}\n", - " 391 0.001 0.000 0.070 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7593(ensure_index)\n", - " 98/45 0.001 0.000 0.069 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:620(generate_schema)\n", - " 71 0.001 0.000 0.068 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:600()\n", - " 97219 0.017 0.000 0.068 0.000 {built-in method builtins.issubclass}\n", - " 132/45 0.001 0.000 0.066 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:906(_generate_schema_inner)\n", - " 10 0.022 0.002 0.065 0.007 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:891(_list_of_dict_to_arrays)\n", - " 131/45 0.002 0.000 0.065 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:931(match_type)\n", - " 183 0.050 0.000 0.064 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1157(maybe_infer_to_datetimelike)\n", - " 71 0.002 0.000 0.064 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:790(generate_option_tick_new)\n", - " 7 0.001 0.000 0.064 0.009 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1871(_callable_schema)\n", - " 7 0.000 0.000 0.063 0.009 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/obbject.py:167(is_list_of_basemodel)\n", - " 23586 0.061 0.000 0.062 0.000 {method 'to_python' of 'pydantic_core._pydantic_core.SchemaSerializer' objects}\n", - " 33 0.001 0.000 0.060 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1574(_generate_parameter_schema)\n", - " 1 0.000 0.000 0.059 0.059 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:1643(__exit__)\n", - " 1 0.000 0.000 0.059 0.059 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:607(close)\n", - " 1 0.000 0.000 0.059 0.059 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:558(__exit__)\n", - " 1 0.000 0.000 0.059 0.059 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:234(__exit__)\n", - " 1 0.000 0.000 0.059 0.059 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1218(close)\n", - " 23556 0.009 0.000 0.059 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/obbject.py:168()\n", - " 1 0.000 0.000 0.059 0.059 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2576(close)\n", - " 1 0.000 0.000 0.059 0.059 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2725(_do_close)\n", - " 1 0.000 0.000 0.059 0.059 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2709(_close_impl)\n", - " 1 0.000 0.000 0.059 0.059 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2703(_connection_rollback_impl)\n", - " 1 0.000 0.000 0.059 0.059 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1113(_rollback_impl)\n", - " 23604 0.058 0.000 0.058 0.000 {method 'view' of 'numpy.generic' objects}\n", - " 11 0.001 0.000 0.057 0.005 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:833(change_to_last_busday)\n", - " 781/772 0.001 0.000 0.056 0.000 {built-in method builtins.next}\n", - " 23583 0.039 0.000 0.055 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:572(condition)\n", - " 34 0.001 0.000 0.055 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2066(_apply_annotations)\n", - " 9158/224 0.003 0.000 0.055 0.000 :121(__subclasscheck__)\n", - " 9158/224 0.051 0.000 0.055 0.000 {built-in method _abc._abc_subclasscheck}\n", - " 35/34 0.000 0.000 0.054 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_schema_generation_shared.py:82(__call__)\n", - " 1 0.000 0.000 0.053 0.053 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/main.py:456(model_json_schema)\n", - " 1 0.000 0.000 0.053 0.053 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2246(model_json_schema)\n", - " 2 0.000 0.000 0.053 0.027 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:1087(_validate_conn)\n", - " 1 0.000 0.000 0.053 0.053 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:658(connect)\n", - " 34 0.000 0.000 0.053 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2085(inner_handler)\n", - " 1 0.000 0.000 0.053 0.053 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:394(generate)\n", - " 45 0.001 0.000 0.052 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:124(maybe_convert_platform)\n", - " 13/9 0.000 0.000 0.052 0.006 :1165(_find_and_load)\n", - " 10/6 0.000 0.000 0.052 0.009 :1120(_find_and_load_unlocked)\n", - " 46 0.050 0.001 0.051 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1580(construct_1d_object_array_from_listlike)\n", - " 1 0.001 0.001 0.051 0.051 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:194(_wrap_result)\n", - " 1 0.000 0.000 0.050 0.050 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/scrapers/quote.py:578(_fetch)\n", - " 379 0.000 0.000 0.050 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:132(__enter__)\n", - " 175/1 0.001 0.000 0.049 0.049 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:443(generate_inner)\n", - " 215/1 0.000 0.000 0.049 0.049 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_schema_generation_shared.py:36(__call__)\n", - " 2/1 0.000 0.000 0.049 0.049 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:522(new_handler_func)\n", - " 1 0.000 0.000 0.049 0.049 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/main.py:673(__get_pydantic_json_schema__)\n", - " 1 0.000 0.000 0.049 0.049 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:248(modify_model_json_schema)\n", - " 1 0.014 0.014 0.049 0.049 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:160(_convert_arrays_to_dataframe)\n", - " 9/5 0.000 0.000 0.049 0.010 :666(_load_unlocked)\n", - " 11 0.000 0.000 0.048 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:1006(convert_object_array)\n", - " 9/5 0.000 0.000 0.048 0.010 :934(exec_module)\n", - " 11 0.000 0.000 0.048 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:1070()\n", - " 85 0.018 0.000 0.048 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:1028(convert)\n", - " 118666 0.043 0.000 0.047 0.000 {built-in method _abc._abc_instancecheck}\n", - " 22/8 0.000 0.000 0.047 0.006 :233(_call_with_frames_removed)\n", - " 1 0.031 0.031 0.046 0.046 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/rates.py:50()\n", - " 18 0.000 0.000 0.045 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:96(arrays_to_mgr)\n", - " 929 0.003 0.000 0.044 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6301(__setattr__)\n", - " 98/93 0.003 0.000 0.041 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:389(__init__)\n", - " 23737 0.027 0.000 0.040 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:576(tz)\n", - " 23556 0.021 0.000 0.040 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_model_construction.py:268(__instancecheck__)\n", - " 9/5 0.000 0.000 0.040 0.008 {built-in method builtins.exec}\n", - " 160 0.001 0.000 0.040 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:807(_set_axis)\n", - " 200 0.000 0.000 0.039 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_utils.py:76(lenient_issubclass)\n", - " 4 0.000 0.000 0.039 0.010 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:78(method)\n", - " 4 0.001 0.000 0.039 0.010 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:736(map)\n", - " 273/269 0.001 0.000 0.038 0.000 :1207(_handle_fromlist)\n", - " 175/1 0.001 0.000 0.038 0.038 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:479(handler_func)\n", - " 73/71 0.001 0.000 0.038 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4271(__setitem__)\n", - " 3 0.000 0.000 0.037 0.012 {built-in method builtins.__import__}\n", - " 1 0.000 0.000 0.036 0.036 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1399(model_schema)\n", - " 1 0.000 0.000 0.036 0.036 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:975(function_before_schema)\n", - " 1 0.000 0.000 0.036 0.036 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1494(model_fields_schema)\n", - " 1 0.001 0.001 0.036 0.036 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1309(_named_required_fields_schema)\n", - " 71 0.000 0.000 0.035 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4514(_set_item)\n", - " 40400 0.029 0.000 0.033 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:915()\n", - " 38 0.000 0.000 0.033 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:540(new_handler_func)\n", - " 38 0.000 0.000 0.033 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2466(json_schema_update_func)\n", - " 38 0.000 0.000 0.032 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1377(model_field_schema)\n", - " 47357 0.023 0.000 0.032 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:123()\n", - " 112 0.002 0.000 0.031 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:456(_array_strptime_with_fallback)\n", - " 1 0.000 0.000 0.031 0.031 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:835(_ssl_wrap_socket_and_match_hostname)\n", - " 37 0.000 0.000 0.031 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1033(default_schema)\n", - " 5 0.000 0.000 0.031 0.006 {built-in method builtins.__build_class__}\n", - " 1 0.000 0.000 0.031 0.031 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/ssl_.py:399(ssl_wrap_socket)\n", - " 1 0.000 0.000 0.031 0.031 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/ssl_.py:497(_ssl_wrap_socket_impl)\n", - " 1 0.000 0.000 0.031 0.031 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ssl.py:511(wrap_socket)\n", - " 1 0.000 0.000 0.031 0.031 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ssl.py:1018(_create)\n", - " 1 0.000 0.000 0.030 0.030 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ssl.py:1375(do_handshake)\n", - " 1 0.030 0.030 0.030 0.030 {method 'do_handshake' of '_ssl._SSLSocket' objects}\n", - " 4 0.000 0.000 0.030 0.008 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Context.py:16(Context)\n", - " 183 0.004 0.000 0.030 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:666(_parse)\n", - " 47160 0.022 0.000 0.029 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1194()\n", - " 23584 0.029 0.000 0.029 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2310(_construct_from_dt64_naive)\n", - " 71 0.001 0.000 0.028 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4481(_set_item_mgr)\n", - " 132 0.001 0.000 0.027 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4062(__getitem__)\n", - " 13562 0.011 0.000 0.027 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:272(_compile)\n", - " 12895 0.011 0.000 0.027 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:173(search)\n", - " 24235 0.022 0.000 0.027 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:416(extract_array)\n", - " 23607 0.026 0.000 0.026 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:103(tz_to_dtype)\n", - "120403/120398 0.023 0.000 0.026 0.000 {built-in method builtins.hasattr}\n", - " 37 0.001 0.000 0.025 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2064(encode_default)\n", - " 62 0.001 0.000 0.024 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1347(insert)\n", - " 2 0.000 0.000 0.023 0.011 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:193(_new_conn)\n", - " 2 0.000 0.000 0.023 0.011 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/connection.py:27(create_connection)\n", - " 1 0.000 0.000 0.021 0.021 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:1314(fetchall)\n", - " 8 0.000 0.000 0.021 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:1319(last)\n", - " 8 0.000 0.000 0.021 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:1743(_downsample)\n", - " 1 0.000 0.000 0.021 0.021 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:543(_allrows)\n", - " 24267 0.015 0.000 0.021 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:334(is_hashable)\n", - "24551/24540 0.016 0.000 0.020 0.000 {built-in method numpy.asarray}\n", - " 1 0.018 0.018 0.020 0.020 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:551()\n", - " 2 0.020 0.010 0.020 0.010 {method 'connect' of '_socket.socket' objects}\n", - " 155 0.000 0.000 0.019 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:769(_try_cast)\n", - " 14 0.000 0.000 0.019 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/from_thread.py:455(start_blocking_portal)\n", - " 47357 0.019 0.000 0.019 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:121(classes)\n", - " 99 0.001 0.000 0.019 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:317(apply)\n", - " 112 0.001 0.000 0.019 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1200(maybe_cast_to_datetime)\n", - " 29/24 0.000 0.000 0.018 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1040(_match_generic_type)\n", - " 2 0.000 0.000 0.018 0.009 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/equity.py:65(fundamental)\n", - " 11 0.000 0.000 0.017 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6538(dropna)\n", - " 7 0.000 0.000 0.017 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/__extensions__.py:93(equity)\n", - " 16 0.000 0.000 0.017 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:674(astype)\n", - " 313/294 0.003 0.000 0.017 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:373(inner)\n", - " 6 0.016 0.003 0.017 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:447(astype)\n", - " 24 0.000 0.000 0.017 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1369(_union_schema)\n", - " 23596 0.017 0.000 0.017 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2148(_creso)\n", - " 111/74 0.001 0.000 0.017 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/type_adapter.py:132(wrapped)\n", - " 10 0.000 0.000 0.017 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:928(_finalize_columns_and_data)\n", - " 37 0.000 0.000 0.016 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/type_adapter.py:189(__init__)\n", - " 24088 0.016 0.000 0.016 0.000 {built-in method numpy.datetime_data}\n", - " 23657 0.016 0.000 0.016 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:529(is_string_or_object_np_dtype)\n", - " 1 0.000 0.000 0.016 0.016 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/equity_fundamental.py:1()\n", - " 1 0.001 0.001 0.015 0.015 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/equity_fundamental.py:18(ROUTER_equity_fundamental)\n", - " 11 0.000 0.000 0.015 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:822(is_USholiday)\n", - " 61/51 0.000 0.000 0.015 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/common.py:62(new_method)\n", - " 183 0.001 0.000 0.015 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:199(split)\n", - " 62 0.001 0.000 0.015 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6956(insert)\n", - " 23585 0.014 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2063(_maybe_pin_freq)\n", - " 37 0.002 0.000 0.014 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/type_adapter.py:267(_init_core_attrs)\n", - " 1 0.000 0.000 0.014 0.014 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:9492(pivot_table)\n", - " 1 0.000 0.000 0.014 0.014 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/pivot.py:61(pivot_table)\n", - " 1 0.000 0.000 0.014 0.014 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/pivot.py:118(__internal_pivot_table)\n", - " 922 0.005 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/ipkernel.py:775(_clean_thread_parent_frames)\n", - " 24029 0.013 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:831(_reset_identity)\n", - " 6 0.000 0.000 0.013 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:423(dict_to_mgr)\n", - " 9 0.000 0.000 0.013 0.001 :1007(get_code)\n", - " 23864 0.013 0.000 0.013 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:152(cast_scalar_indexer)\n", - " 118 0.000 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:325(_from_sequence)\n", - " 1408 0.002 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:189(__next__)\n", - " 8 0.000 0.000 0.012 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/generic.py:232(aggregate)\n", - " 8 0.000 0.000 0.012 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:3417(last)\n", - " 1 0.000 0.000 0.012 0.012 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/equity.py:1()\n", - " 8 0.000 0.000 0.012 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1896(_agg_general)\n", - " 23448 0.012 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/utils.py:49()\n", - " 8 0.000 0.000 0.012 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1957(_cython_agg_general)\n", - " 18 0.000 0.000 0.012 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2121(create_block_manager_from_column_arrays)\n", - " 45 0.000 0.000 0.012 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:589(clean_schema)\n", - " 19 0.000 0.000 0.011 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_compiler.py:740(compile)\n", - " 19 0.000 0.000 0.011 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:7142(fillna)\n", - " 100 0.000 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:2236(__class_getitem__)\n", - " 152 0.001 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4626(_get_item_cache)\n", - " 138 0.001 0.000 0.011 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:3983(_ixs)\n", - " 1408 0.007 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:77(get_token)\n", - " 305 0.000 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:225(compile)\n", - " 47168 0.010 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2570(_validate_tz_from_dtype)\n", - " 24440 0.010 0.000 0.010 0.000 {built-in method __new__ of type object at 0x10f75b898}\n", - " 45760 0.010 0.000 0.010 0.000 {method 'raw' of '_mysql_connector.MySQL' objects}\n", - " 37 0.001 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/type_adapter.py:45(_get_schema)\n", - " 51273 0.010 0.000 0.010 0.000 {method 'append' of 'list' objects}\n", - " 72 0.001 0.000 0.010 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:674(_with_infer)\n", - " 48598 0.009 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:2287(cast)\n", - " 8 0.000 0.000 0.009 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:365(grouped_reduce)\n", - " 1 0.000 0.000 0.009 0.009 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/root_model.py:1()\n", - " 1 0.000 0.000 0.009 0.009 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:868(read_csv)\n", - " 183 0.001 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6284(__getattr__)\n", - " 1 0.000 0.000 0.009 0.009 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:583(_read)\n", - " 9 0.000 0.000 0.009 0.001 :1127(get_data)\n", - " 30 0.001 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:1371(_arith_method)\n", - " 8 0.000 0.000 0.009 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1971(array_func)\n", - " 1 0.000 0.000 0.009 0.009 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_model_construction.py:83(__new__)\n", - " 8 0.000 0.000 0.009 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:812(_cython_operation)\n", - " 9 0.000 0.000 0.009 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4130(_getitem_bool_array)\n", - " 98 0.001 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:2241(_class_getitem_inner)\n", - " 160 0.001 0.000 0.009 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:800(_generate_schema_from_property)\n", - " 8 0.000 0.000 0.008 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:523(cython_operation)\n", - " 17 0.000 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:869(take)\n", - " 11 0.000 0.000 0.008 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12169(_logical_func)\n", - " 8 0.000 0.000 0.008 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:310(_cython_op_ndim_compat)\n", - " 270 0.000 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:402(walk_core_schema)\n", - " 8 0.008 0.001 0.008 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:354(_call_cython_op)\n", - " 2 0.000 0.000 0.008 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6731(drop_duplicates)\n", - " 17 0.000 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:180(fillna)\n", - " 24806 0.008 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:551(dtype)\n", - " 9 0.000 0.000 0.008 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:11603(any)\n", - " 26 0.000 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:623(reindex_indexer)\n", - " 32 0.000 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:582(get_loc)\n", - " 26 0.006 0.000 0.008 0.000 {method 'read' of '_io.BufferedReader' objects}\n", - " 9 0.000 0.000 0.008 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:11435(_reduce)\n", - " 35 0.001 0.000 0.008 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1782(_consolidate_inplace)\n", - " 10 0.007 0.001 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:922()\n", - " 13 0.000 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4142(_take_with_is_copy)\n", - " 19 0.001 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1643(fillna)\n", - " 11 0.000 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5993(set_index)\n", - " 1021/271 0.001 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:196(walk)\n", - " 22 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6133(_arith_method)\n", - " 17 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5343(reindex)\n", - " 271/247 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:101(isna)\n", - " 32 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:558(_parse_with_reso)\n", - " 132 0.001 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1376(__init__)\n", - " 32 0.001 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:275(_parse_with_reso)\n", - " 13 0.000 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4027(take)\n", - " 19 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:979(parse)\n", - " 271/247 0.001 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:184(_isna)\n", - " 216 0.002 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:875(_parse_numeric_token)\n", - " 11 0.000 0.000 0.007 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:818(is_busday)\n", - " 170/165 0.001 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:59(take_nd)\n", - " 379 0.001 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:141(__exit__)\n", - "12604/10293 0.004 0.000 0.007 0.000 {built-in method builtins.len}\n", - " 11 0.000 0.000 0.007 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:1022(bdate_range)\n", - " 1 0.000 0.000 0.007 0.007 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_model_construction.py:275(_collect_bases_data)\n", - " 66/19 0.001 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:456(_parse_sub)\n", - " 18 0.001 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2190(_form_blocks)\n", - " 36 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6201(_construct_result)\n", - " 1021/271 0.003 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:199(_walk)\n", - " 74 0.000 0.000 0.007 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/type_adapter.py:115(_type_has_config)\n", - " 26 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6662(copy)\n", - " 79 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5242(_sanitize_column)\n", - " 119/24 0.002 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:516(_parse)\n", - " 15 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1176(__getitem__)\n", - " 23584 0.006 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2514(_validate_dt64_dtype)\n", - " 24 0.001 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:708(_slice_take_blocks_ax0)\n", - " 392 0.002 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:346(_name_get)\n", - " 15 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2259(_consolidate)\n", - " 4 0.000 0.000 0.006 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6997(sort_values)\n", - " 24 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3820(get_indexer)\n", - " 2 0.000 0.000 0.006 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6828(duplicated)\n", - " 16 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:1102(groupings)\n", - " 31 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:557(copy)\n", - " 98 0.000 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:2147(__init__)\n", - "24941/24899 0.006 0.000 0.006 0.000 {built-in method builtins.hash}\n", - " 45 0.001 0.000 0.006 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:419(simplify_schema_references)\n", - " 5 0.000 0.000 0.006 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_strptime.py:261(compile)\n", - " 112 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1240(_ensure_nanosecond_dtype)\n", - " 13 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:5136(reindex)\n", - " 65 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5437(_can_hold_identifiers_and_holds_name)\n", - " 36 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:610(factorize)\n", - " 1 0.000 0.000 0.005 0.005 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:224(init_risk_free_rate)\n", - " 34 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:2077(__contains__)\n", - " 4 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:909(text)\n", - " 6 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5614(_reindex_axes)\n", - " 24 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:206(__getattr__)\n", - " 1 0.000 0.000 0.005 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:789(apparent_encoding)\n", - " 126 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_strptime.py:564(_strptime_datetime)\n", - " 1 0.000 0.000 0.005 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/legacy.py:19(detect)\n", - " 163 0.003 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:120(_take_nd_ndarray)\n", - " 42542 0.005 0.000 0.005 0.000 {method 'keys' of 'dict' objects}\n", - " 109 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1287(take_nd)\n", - " 5 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:607(_init_dict)\n", - " 1 0.004 0.004 0.005 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/api.py:33(from_bytes)\n", - " 9 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1296(__init__)\n", - " 4 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6239(reset_index)\n", - " 1 0.000 0.000 0.005 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/generic.py:1420(aggregate)\n", - " 15 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2632(check_bool_indexer)\n", - " 322 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2520(get_schema_or_ref)\n", - " 126 0.001 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_strptime.py:309(_strptime)\n", - " 1 0.000 0.000 0.005 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:172(agg)\n", - " 1 0.000 0.000 0.005 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:558(apply_str)\n", - " 64 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:419(check_array_indexer)\n", - " 20 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:177(__contains__)\n", - " 4 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:157(concat)\n", - " 7 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1087(join)\n", - " 461 0.003 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/ipkernel.py:790()\n", - " 1 0.000 0.000 0.005 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:681(_apply_str)\n", - " 1 0.000 0.000 0.005 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:2264(count)\n", - " 8 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1125(_wait_for_tstate_lock)\n", - " 16 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:596(_homogenize)\n", - " 8 0.000 0.000 0.005 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:2142(groupby)\n", - " 1 0.000 0.000 0.005 0.005 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1575(__init__)\n", - " 42 0.000 0.000 0.005 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:392(handle_call_schema)\n", - " 4 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:622(get_result)\n", - " 54 0.003 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2246(_stack_arrays)\n", - " 10 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4323(reindex)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:9863(unstack)\n", - " 21 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/from_thread.py:308(start_task_soon)\n", - " 4 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1397(_getitem_axis)\n", - " 42 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:379(handle_arguments_schema)\n", - " 347 0.002 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5323(__contains__)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1848(_make_engine)\n", - " 127 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4608(_box_col_values)\n", - " 5 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/equity.py:307(price)\n", - " 19 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_compiler.py:573(_code)\n", - " 161 0.002 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:77(get_type_ref)\n", - " 1 0.000 0.000 0.004 0.004 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1907(read)\n", - " 12957 0.004 0.000 0.004 0.000 {method 'search' of 're.Pattern' objects}\n", - " 288 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1095(__getitem__)\n", - " 4 0.000 0.000 0.004 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1205(_getbool_axis)\n", - " 41 0.002 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2276(_merge_blocks)\n", - " 48/46 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:1131(take)\n", - " 105 0.002 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:198(__init__)\n", - " 2 0.000 0.000 0.004 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:10803(where)\n", - " 14 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/_backends/_asyncio.py:980(_spawn_task_from_thread)\n", - " 46/27 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:500(__getitem__)\n", - " 21 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:823(take)\n", - " 2 0.000 0.000 0.004 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:10615(_where)\n", - " 62 0.002 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5368(insert)\n", - " 74 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:261(_isna_array)\n", - " 97 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/field.py:18(__init__)\n", - " 132 0.002 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:842(_engine)\n", - " 14 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/_backends/_asyncio.py:2483(run_sync_from_thread)\n", - " 2 0.000 0.000 0.004 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:521(ffill)\n", - " 2 0.000 0.000 0.004 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:1801(_upsample)\n", - " 11 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4477(__delitem__)\n", - " 34 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1146(take)\n", - " 354 0.003 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6236(__finalize__)\n", - " 11 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:380(notna)\n", - " 47 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:12675(_reindex_for_setitem)\n", - " 37 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1095(nullable_schema)\n", - " 29 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:157(take)\n", - " 36 0.002 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:548(factorize_array)\n", - " 128 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:208(findall)\n", - " 11 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1434(idelete)\n", - " 15 0.000 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:687()\n", - " 404 0.001 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1596(pandas_dtype)\n", - " 394 0.002 0.000 0.004 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:274(full)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/equity.py:17(ROUTER_equity)\n", - " 8 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5095(insert)\n", - " 423 0.003 0.000 0.003 0.000 {method 'reduce' of 'numpy.ufunc' objects}\n", - " 12 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:890(content)\n", - " 12 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6110(_cmp_method)\n", - " 1129 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1320(__setattr__)\n", - " 12 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1322(__contains__)\n", - " 30 0.000 0.000 0.003 0.000 {method 'join' of 'bytes' objects}\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/utils/filters.py:1()\n", - " 10 0.000 0.000 0.003 0.000 :1054(_find_spec)\n", - " 806 0.003 0.000 0.003 0.000 {built-in method numpy.empty}\n", - " 17 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:816(generate)\n", - " 12 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2982(get_loc)\n", - " 17 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:1038(stream)\n", - " 12 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:3308(_get_level_indexer)\n", - " 207 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:145(_get_option)\n", - " 4 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:523(inferred_freq)\n", - " 156/19 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_compiler.py:37(_compile)\n", - " 461 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1501(enumerate)\n", - " 4 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:910(inferred_freq)\n", - " 2 0.000 0.000 0.003 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:9114(asfreq)\n", - " 4 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:89(infer_freq)\n", - " 9 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6463(astype)\n", - " 17 0.003 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:305(_isna_string_dtype)\n", - " 5 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/importlib/__init__.py:108(import_module)\n", - " 2 0.000 0.000 0.003 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:2794(asfreq)\n", - " 5 0.000 0.000 0.003 0.001 :1192(_gcd_import)\n", - " 74 0.003 0.000 0.003 0.000 {method 'take' of 'numpy.ndarray' objects}\n", - " 9 0.000 0.000 0.003 0.000 :727(_compile_bytecode)\n", - " 27 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:679(Union)\n", - " 12 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2957(_get_loc_single_level_index)\n", - " 349 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_strptime.py:26(_getlang)\n", - " 585 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:312(mode)\n", - " 9 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:208(__truediv__)\n", - " 9 0.003 0.000 0.003 0.000 {built-in method marshal.loads}\n", - " 7 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:945(start)\n", - " 10 0.000 0.000 0.003 0.000 :1499(find_spec)\n", - " 19 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:723(Optional)\n", - " 12/9 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:38(__eq__)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:743(group_info)\n", - " 10 0.000 0.000 0.003 0.000 :1467(_get_spec)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:758(_get_compressed_codes)\n", - " 100 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1863(from_array)\n", - " 3 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:750(merge_environment_settings)\n", - " 416 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:278(__init__)\n", - " 3 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4796(_drop_axis)\n", - " 28 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6925(f)\n", - " 181 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:168(_type_check)\n", - " 3 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:457(prepare_request)\n", - " 1488 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1266(_is_dunder)\n", - " 2 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:957(getaddrinfo)\n", - " 10 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6162(get_indexer_for)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:826(get_environ_proxies)\n", - " 73 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1247(series_generator)\n", - " 228 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:163(match)\n", - " 2 0.003 0.001 0.003 0.001 {built-in method _socket.getaddrinfo}\n", - " 13 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:910(read)\n", - " 93 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2313(is_unique)\n", - " 2 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:301(lexsort_indexer)\n", - " 9 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1578(_wrap_aggregated_output)\n", - " 127 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1012(iget)\n", - " 3 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1479(info)\n", - " 59 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:387(apply)\n", - " 805/499 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:206(_handle_other_schemas)\n", - " 392 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:330(_name_includes_bit_suffix)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/utils/decorators.py:1()\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:489(unstack)\n", - " 298 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:339(_from_mgr)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/equity_price.py:1()\n", - " 3 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1610(_log)\n", - " 1 0.000 0.000 0.003 0.003 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:525(_unstack_frame)\n", - " 45 0.000 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_discriminated_union.py:37(apply_discriminators)\n", - " 2 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5433(drop)\n", - " 493 0.002 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3777(get_loc)\n", - " 9 0.003 0.000 0.003 0.000 {built-in method io.open_code}\n", - " 349 0.001 0.000 0.003 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/locale.py:594(getlocale)\n", - " 2 0.000 0.000 0.003 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4757(drop)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb/package/equity_price.py:17(ROUTER_equity_price)\n", - " 133 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/typing_extensions.py:3029(_collect_parameters)\n", - " 7 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:611(wait)\n", - " 8 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:200(__mul__)\n", - " 4 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:213(get_freq)\n", - " 62 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1412(_insert_update_blklocs_and_blknos)\n", - " 91 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4402(_check_setitem_copy)\n", - " 4 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:371(__init__)\n", - " 4 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:7885(replace)\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1636(handle)\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1690(callHandlers)\n", - " 36 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1496(items)\n", - " 138 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:678(_constructor_sliced_from_mgr)\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:965(handle)\n", - " 337/325 0.001 0.000 0.002 0.000 {built-in method builtins.sorted}\n", - " 4 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6186(_get_indexer_strict)\n", - " 30 0.001 0.000 0.002 0.000 :1607(find_spec)\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/handlers.py:65(emit)\n", - " 1 0.002 0.002 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:60(__init__)\n", - " 12 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/utils.py:36(enforce_bus_hours)\n", - " 17 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4470(_iset_item_mgr)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4420(_set_item_frame_value)\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1216(emit)\n", - " 196 0.000 0.000 0.002 0.000 {method 'any' of 'numpy.ndarray' objects}\n", - " 3 0.002 0.001 0.002 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:155()\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1098(emit)\n", - " 39 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:262(_get_hashtable_algo)\n", - " 45 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/plugin/_schema_validator.py:21(create_schema_validator)\n", - " 215/45 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:447(count_refs)\n", - " 30 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6957()\n", - " 15 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:858(_raw_read)\n", - " 30 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:240(arithmetic_op)\n", - " 12 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:760(indexer_between_time)\n", - " 182 0.002 0.000 0.002 0.000 {method 'copy' of 'numpy.ndarray' objects}\n", - " 14 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/container.py:14(__init__)\n", - " 21 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1066(iset)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:664(get_handle)\n", - " 439 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2765(check_dict_or_set_indexers)\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:351(prepare)\n", - " 68 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:131(filterwarnings)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:110(__init__)\n", - " 3 0.002 0.001 0.002 0.001 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:154()\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:7061(_pad_or_backfill)\n", - " 8 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:1064(group_info)\n", - " 15 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:271(from_annotation)\n", - " 93 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:231(asarray_tuplesafe)\n", - " 132 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1279(__init__)\n", - " 9 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1483(reduce)\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5359(reindex)\n", - " 8 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7227(_arith_method)\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:5636(rename)\n", - " 951 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:2443(get_origin)\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1087(flush)\n", - " 325 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numerictypes.py:357(issubdtype)\n", - " 366 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1310(__getattr__)\n", - " 200 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:55(_any)\n", - " 10 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:5565(_reindex_output)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/_optional.py:85(import_optional_dependency)\n", - " 3688 0.002 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1168(ident)\n", - " 16 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:325(__new__)\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1070(_rename)\n", - " 211 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:127(_get_single_key)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:1165(_is_binary_mode)\n", - " 3 0.002 0.001 0.002 0.001 {method 'flush' of '_io.TextIOWrapper' objects}\n", - " 375 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:428(append)\n", - " 11 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:6488(isna)\n", - " 284 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2645(maybe_coerce_values)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:299(pad_or_backfill)\n", - " 62 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1393(moveaxis)\n", - " 168/132 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2432(_extract_get_pydantic_json_schema)\n", - " 20 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_exceptions.py:34(find_stack_level)\n", - " 124 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5562(append)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:2058(sum)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:212(putmask)\n", - " 38 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:66(copy)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:1539(sum)\n", - " 304 0.001 0.000 0.002 0.000 {built-in method builtins.any}\n", - " 26 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:418(merge_field_infos)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/ticker.py:34(__init__)\n", - " 45 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:567(validate_core_schema)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:765(should_bypass_proxies)\n", - " 56 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:71(_wrapreduction)\n", - " 59 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/base.py:549(find)\n", - " 45 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:301(maybe_iterable_to_list)\n", - " 183 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:221(__init__)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/base.py:49(__init__)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:1186(_get_binary_io_classes)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:562(_apply)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2499(getproxies_environment)\n", - " 15 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:801(_fp_read)\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:231(parse_headers)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2672(proxy_bypass)\n", - " 216/45 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:425(collect_refs)\n", - " 379 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:299(helper)\n", - " 284 0.001 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1220(_get_value)\n", - " 15 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:457(read)\n", - " 1 0.001 0.001 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:222(read)\n", - " 111 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:790(copy)\n", - " 26 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:533(_maybe_downcast)\n", - " 11 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1565(__invert__)\n", - " 386 0.000 0.000 0.002 0.000 :859(__iter__)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:460(_apply_columnwise)\n", - " 3 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:293(_infer_daily_rule)\n", - " 9 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:421(astype)\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:687(codes)\n", - " 6884 0.002 0.000 0.002 0.000 {method 'get' of 'dict' objects}\n", - " 2 0.000 0.000 0.002 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:690()\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:699(new_axes)\n", - " 8 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:689(codes)\n", - " 11 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1719(_getitem_axis)\n", - " 10 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:3261(signature)\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:702()\n", - " 10 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5663(_reindex_with_indexers)\n", - " 14/11 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2435(_signature_from_callable)\n", - " 4 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:777(_codes_and_uniques)\n", - " 102 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:294(handle_union_schema)\n", - " 93 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:273(__call__)\n", - " 349 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/locale.py:479(_parse_localename)\n", - " 20 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4883(_update_inplace)\n", - " 10 0.000 0.000 0.002 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:3007(from_callable)\n", - " 1 0.000 0.000 0.002 0.002 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/__init__.py:399(__getattr__)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:7282(sort_index)\n", - " 2529 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:208(isnum)\n", - " 11 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:723(astype)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5290(sort_index)\n", - " 163 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:564(_take_preprocess_indexer_and_fill_value)\n", - " 11 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:176(isna)\n", - " 74 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:511(_validate_dtype)\n", - " 276 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:464(populate_defs)\n", - " 421 0.001 0.000 0.001 0.000 :674(__getitem__)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/parser.py:59(parsestr)\n", - " 19 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:333(from_annotated_attribute)\n", - " 18 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6679(_maybe_cast_listlike_indexer)\n", - " 160 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:236(set_axis)\n", - " 58 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2229(is_monotonic_increasing)\n", - " 616 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:481(ensure_wrapped_if_datetimelike)\n", - " 62 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1402(_insert_update_mgr_locs)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:192(__sub__)\n", - " 89 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/functools.py:35(update_wrapper)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/parser.py:41(parse)\n", - " 162 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2264()\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:365(request)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1998(get_cache_defs_ref_schema)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:98(__add__)\n", - " 14 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:805(call_soon_threadsafe)\n", - " 272 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:609(_dtype_to_subclass)\n", - " 213 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2716(new_block)\n", - " 939 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:148(__getattr__)\n", - " 216 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1006(_find_hms_idx)\n", - " 1258 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1687(__eq__)\n", - " 3 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:242(__init__)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1950(get_defs_ref)\n", - " 48 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:141(equals)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:243(replace)\n", - " 121 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:82(shape)\n", - " 177 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:137(is_object_dtype)\n", - " 151 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:474(resolve_ymd)\n", - " 81 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:225(_consolidate_key)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:555()\n", - " 133 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5170(_get_engine_target)\n", - " 42 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2140(get_flattened_anyof)\n", - " 7 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1316(view)\n", - " 134 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:784(name)\n", - " 11 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7553(ensure_index_from_sequences)\n", - " 384/1 0.001 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2352(_sort_json_schema)\n", - " 7 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1248(copy)\n", - " 554 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:831(_values)\n", - " 106 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2703(new_block_2d)\n", - " 54 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6312(_index_as_unique)\n", - " 444 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:696(_sanitize_ndim)\n", - " 11 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/astype.py:191(astype_array_safe)\n", - " 45 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:122(collect_definitions)\n", - " 16/12 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:622(convert)\n", - " 46 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:157(core_config)\n", - " 25 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:219(vstack)\n", - " 20 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6418(_reduce)\n", - " 15 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:586()\n", - " 215 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_schema_generation_shared.py:31(__init__)\n", - " 215/45 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_discriminated_union.py:45(inner)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/scrapers/quote.py:658()\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:416(_maybe_cast_listlike_indexer)\n", - " 109 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:551(maybe_promote)\n", - " 128 0.001 0.000 0.001 0.000 {method 'findall' of 're.Pattern' objects}\n", - " 37 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:189(_na_arithmetic_op)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:828(replace)\n", - " 30 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:583(copy_func)\n", - " 6/2 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1438(putmask)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/utils.py:1()\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:4620(map)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7031(drop)\n", - " 15 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:227(_encode_invalid_chars)\n", - " 28 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:239(maybe_convert_indices)\n", - " 14 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:288(comparison_op)\n", - " 39 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:106(_ensure_data)\n", - " 1265 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:909(__len__)\n", - " 11 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2331(_signature_from_function)\n", - " 9 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1277(is_extension_array_dtype)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:171(feed)\n", - " 37 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/type_adapter.py:413(dump_python)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:59(get_indexer_indexer)\n", - " 1027 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:261(get)\n", - " 96 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:659(_constructor_from_mgr)\n", - " 160 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:86(_validate_set_axis)\n", - " 379 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:104(__init__)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:191(_make_selectors)\n", - " 62 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:664(_constructor_from_mgr)\n", - " 215/45 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:125(_record_valid_refs)\n", - " 480 0.001 0.000 0.001 0.000 {method 'match' of 're.Pattern' objects}\n", - " 45 0.001 0.000 0.001 0.000 {built-in method pydantic_core._pydantic_core.validate_core_schema}\n", - " 7 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:348(get_function_type_hints)\n", - " 24 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3955(_get_indexer)\n", - " 28 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2421(all)\n", - " 14 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/selector_events.py:128(_write_to_self)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:176(_call_parse)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_model_construction.py:530(complete_model_class)\n", - " 349 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/locale.py:396(normalize)\n", - " 34 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5598()\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2685(getproxies)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/scrapers/quote.py:660(_fetch_complementary)\n", - " 45 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:158(collect_invalid_schemas)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1114(union_schema)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:216(_parsegen)\n", - " 385/2 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:210(remap_json_schema)\n", - " 100 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_compiler.py:243(_optimize_charset)\n", - " 14 0.001 0.000 0.001 0.000 {method 'send' of '_socket.socket' objects}\n", - " 1447 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:203(isword)\n", - " 207 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:830(__len__)\n", - " 206 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:4035(_dict_not_none)\n", - " 16 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1706(pad_or_backfill)\n", - " 12 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:492(to_numpy)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:409(prepare_url)\n", - " 373 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2674(get_block_type)\n", - " 42 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2339(_deduplicate_schemas)\n", - " 102 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:274(make_block)\n", - " 100 0.000 0.000 0.001 0.000 {built-in method builtins.sum}\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:369(parse_url)\n", - " 34 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/utils/decorators.py:26(validate)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:5773(isna)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2235(take)\n", - " 650 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numerictypes.py:283(issubclass_)\n", - " 183 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:62(__init__)\n", - " 3430 0.001 0.000 0.001 0.000 {built-in method builtins.setattr}\n", - " 24 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6394(_should_compare)\n", - " 48 0.000 0.000 0.001 0.000 :140(_path_stat)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:8693(isna)\n", - " 12 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:226(isna)\n", - " 116 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:892(getfile)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:2134(_fetchall_impl)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/accessor.py:95(_getter)\n", - " 50 0.001 0.000 0.001 0.000 {built-in method posix.stat}\n", - " 34 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:263(eval_type_backport)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:1130(fetchall)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:122(get_group_index)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/accessors.py:88(_delegate_property_get)\n", - " 12 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:454(_get_time_micros)\n", - " 215/45 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:488(inline_refs)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1102(wrap_results)\n", - " 39 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:280(_check_object_for_strings)\n", - " 35 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1764(is_consolidated)\n", - " 108 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:273(is_dict_like)\n", - " 118 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:182(_add_filter)\n", - " 123 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:773(_view)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:707(_get_comb_axis)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:42(__ne__)\n", - " 145 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1571(validate_all_hashable)\n", - " 113 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1731(__hash__)\n", - " 114 0.000 0.000 0.001 0.000 {method 'max' of 'numpy.ndarray' objects}\n", - " 1 0.001 0.001 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:841(fetchall)\n", - " 17 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5651(identical)\n", - " 34 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:296(_eval_type_backport)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:687(compress_group_index)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:446(get_connection_with_tls_context)\n", - " 215/45 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:161(_is_schema_valid)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:72(get_objs_combined_axis)\n", - " 12 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7406(min)\n", - " 12 0.001 0.000 0.001 0.000 {method 'flatten' of 'numpy.ndarray' objects}\n", - " 284 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:111(is_annotated)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7164(_cmp_method)\n", - " 19 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_compiler.py:511(_compile_info)\n", - " 124 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1330(normalize_axis_tuple)\n", - " 17 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:214(_obj_with_exclusions)\n", - " 42 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2340()\n", - " 34 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:321(_eval_type)\n", - " 211 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:635(_get_root)\n", - " 83 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:715()\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:2249(isclose)\n", - " 16 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:903(_set_levels)\n", - " 37 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/computation/expressions.py:226(evaluate)\n", - " 76 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:33(seterr)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:120(_get_combined_index)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1823(_setup_result_proxy)\n", - " 35 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1772(_consolidate_check)\n", - " 46 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:53(_wrapfunc)\n", - " 856 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/__init__.py:34(using_copy_on_write)\n", - " 37 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/functools.py:981(__get__)\n", - " 292 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:734(name)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2658(proxy_bypass_macosx_sysconf)\n", - " 70/65 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_repr.py:86(display_as_type)\n", - " 98 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:942(_is_unpacked_typevartuple)\n", - " 10 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:2103(__init__)\n", - " 127 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1471(_set_as_cached)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/base.py:2588(_parse_server_version)\n", - " 254 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:180(blknos)\n", - " 271/181 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/scrapers/quote.py:645(_format)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12362(_stat_function)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1870(_get_label_or_level_values)\n", - " 11 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:958(fast_xs)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:178(sub)\n", - " 10 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:2557(_get_timestamp_range_edges)\n", - " 205 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:467(__enter__)\n", - " 35 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:259(_reconstruct)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1893(_setup_dml_or_text_result)\n", - " 352 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_metadata.py:57(metadata)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:359(build_response)\n", - " 37 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/computation/expressions.py:67(_evaluate_standard)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/generic.py:2002(_get_data_to_aggregate)\n", - " 1281 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:240(__next)\n", - " 1945 0.001 0.000 0.001 0.000 {method 'startswith' of 'str' objects}\n", - " 230/101 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2343(_make_json_hashable)\n", - " 34 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/utils/decorators.py:44(exception_handler)\n", - " 307 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1141(_to_decimal)\n", - " 47 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:97(is_bool_indexer)\n", - " 8 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:1452(safe_sort)\n", - " 359 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:84()\n", - " 34 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2036(_get_prepare_pydantic_annotations_for_known_type)\n", - " 16 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:220(__init__)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/utils.py:185(is_isin)\n", - " 155/34 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:387(_eval_type)\n", - " 8 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7218(_construct_result)\n", - " 226 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:178(_datetime_metadata_str)\n", - " 114 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:39(_amax)\n", - " 422 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1331(is_ea_or_datetimelike_dtype)\n", - " 554 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2004(internal_values)\n", - " 16 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:373(_finalize)\n", - " 24 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/times.py:25(to_time)\n", - " 49 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1519(construct_1d_arraylike_from_scalar)\n", - " 22 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2979(prod)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:1422(__init__)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:337(extend)\n", - " 54 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_asarray.py:27(require)\n", - " 925 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:168(__getitem__)\n", - " 91 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2811(ensure_block_shape)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2083(remove_unused_levels)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:478(coerce_to_target_dtype)\n", - " 59 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:414(_split_op_result)\n", - " 12 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:173(extract_numeric_value)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:240(__pow__)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/data.py:48(__call__)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6432(dtypes)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1524(where)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:173(_do_handshake)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:977(_cmp_method)\n", - " 189/54 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:178(getwidth)\n", - " 514 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1392()\n", - " 133 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/typing_extensions.py:2954(_has_generic_or_protocol_as_origin)\n", - " 8 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:550(validate_categories)\n", - " 14 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5425(_getitem_slice)\n", - " 8 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/index_tricks.py:326(__getitem__)\n", - " 140 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2152(unit)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:276(connection_from_host)\n", - " 295 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:193(__get__)\n", - " 20 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:2526(_set_grouper)\n", - " 26 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/putmask.py:101(validate_putmask)\n", - " 42 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1641(__getitem__)\n", - " 258 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2537(dtype_to_unit)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:860(values)\n", - " 4/3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:58(__ge__)\n", - " 38 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:430(__enter__)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:12590(values)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:652(_validate_listlike)\n", - " 9 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:846(get_grouper)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6509(max)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:393(_get_wom_rule)\n", - " 259 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2795(extend_blocks)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:305(connection_from_context)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1633(as_array)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2255(pad_or_backfill)\n", - " 314 0.001 0.000 0.001 0.000 {method 'view' of 'numpy.ndarray' objects}\n", - " 24 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2320(_preprocess_slice_or_indexer)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/data.py:67(__init__)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12397(max)\n", - " 6 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:111(f)\n", - " 281 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:336(hms)\n", - " 34 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/utils/decorators.py:32(decorated)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:717(_get_concat_axis)\n", - " 100/99 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1695(__hash__)\n", - " 262 0.000 0.000 0.001 0.000 :405(parent)\n", - " 9 0.000 0.000 0.001 0.000 :566(module_from_spec)\n", - " 622 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:308(_config)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:879(_check_server_version)\n", - " 188 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:319(asi8)\n", - " 50 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:166(simplefilter)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:9041(groupby)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1707(_interleave)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:1485(_init_metadata)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:595(homogeneous_func)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1495(_maybe_update_cacher)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2225(_garbage_collect_definitions)\n", - " 28 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1778()\n", - " 62 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2311(_fast_count_smallints)\n", - " 1602 0.001 0.000 0.001 0.000 {method 'copy' of 'dict' objects}\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:610(prepare_cookies)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6629(cumprod)\n", - " 183 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:395(__init__)\n", - " 66 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:119(is_namedtuple)\n", - " 16 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1085(_set_codes)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12291(cumprod)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:140(get_cookie_header)\n", - " 11 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:720(size)\n", - " 421 0.000 0.000 0.001 0.000 :756(encode)\n", - " 247 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/frozen.py:76(__getitem__)\n", - " 4 0.000 0.000 0.001 0.000 {built-in method _operator.add}\n", - " 416 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/flags.py:51(__init__)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/base.py:445(__get__)\n", - " 56 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/common.py:81(get_op_result_name)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:347(__init__)\n", - " 111 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:728(is_valid_na_for_dtype)\n", - " 272 0.001 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:591(_ensure_array)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12239(_accum_func)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/main.py:649(__get_pydantic_core_schema__)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2478(_get_all_json_refs)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:66(mask_missing)\n", - " 164 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:568(require_length_match)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:176(sorted_labels)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/base.py:183(_for_instance)\n", - " 45 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:369(__init__)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:202(union_indexes)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1287(endheaders)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/base.py:180(_for_class)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2152(get_json_ref_counts)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:231(get_result)\n", - " 54 0.000 0.000 0.001 0.000 :778(__contains__)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:307(unique)\n", - " 4 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1362(__add__)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/base.py:137(__init__)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1049(_send_output)\n", - " 150/38 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1904(field_title_should_be_set)\n", - " 182/52 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:409()\n", - " 51 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:386(default_index)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:7172()\n", - " 159 0.000 0.000 0.001 0.000 :126(_path_join)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:782(result_index)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:196(__rsub__)\n", - " 11 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6480(all)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1966()\n", - " 10 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:229(_convert_obj)\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:427(unique_with_mask)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_strptime.py:238(pattern)\n", - " 48 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:93(__init__)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/base.py:152()\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:351(_encode_target)\n", - " 566 0.001 0.000 0.001 0.000 {method 'format' of 'str' objects}\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:330(connection_from_pool_key)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:139(_parse_date_columns)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:214(get_compressed_ids)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:11620(all)\n", - " 65 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:924()\n", - " 3 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:988(send)\n", - " 9 0.000 0.000 0.001 0.000 :493(_init_module_attrs)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/cd.py:79(encoding_languages)\n", - " 2480 0.001 0.000 0.001 0.000 {method 'read' of '_io.StringIO' objects}\n", - " 46/44 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:390(_get_getitem_freq)\n", - " 124 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1768(ravel)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:390(__init__)\n", - " 5 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1216(_iset_split_block)\n", - " 206 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1253(iget)\n", - " 20 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:331(_set_grouper)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:7894(_cmp_method)\n", - " 10/7 0.000 0.000 0.001 0.000 {built-in method _operator.eq}\n", - " 386/1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2156(_add_json_refs)\n", - " 1 0.000 0.000 0.001 0.001 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/cd.py:25(encoding_unicode_range)\n", - " 2 0.000 0.000 0.001 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:1160(read_chunked)\n", - " 2312 0.001 0.000 0.001 0.000 {method 'lower' of 'str' objects}\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:398(reduce)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:793(_add_offset)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6380(_consolidate)\n", - " 47 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1081(is_numeric_dtype)\n", - " 45 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/plugin/_loader.py:21(get_plugins)\n", - " 206 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:4036()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:601(calc)\n", - " 87 0.000 0.000 0.000 0.000 :771(get)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:1525(__and__)\n", - " 44 0.000 0.000 0.000 0.000 {method 'argsort' of 'numpy.ndarray' objects}\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:844(levels)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:3951(T)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:718(_reorder_by_uniques)\n", - " 78 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:166(is_finalvar)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:389(new_func)\n", - " 93 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4623(_clear_item_cache)\n", - " 21 0.000 0.000 0.000 0.000 {cyfunction Timestamp.strftime at 0x118053510}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1356(add_cookie_header)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:469(_parse_headers)\n", - " 3035 0.000 0.000 0.000 0.000 {method 'isdigit' of 'str' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:496(_merge_cursor_description)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:336(_get_annual_rule)\n", - " 65 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1102()\n", - " 109 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:253(fill_value)\n", - " 47 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:61(_all)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1503()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:3767(transpose)\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:40(__init__)\n", - " 514 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:372(apply_if_callable)\n", - " 152 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:586(_get_axis)\n", - " 4/3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:50(__le__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4651(_maybe_cache_changed)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4159(xs)\n", - " 2332 0.000 0.000 0.000 0.000 {method 'pop' of 'dict' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1784(get_level_values)\n", - " 211 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:676(_translate_key)\n", - " 31 0.000 0.000 0.000 0.000 :1424(_path_importer_cache)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:218()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:667(_model_schema)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:289(ydiffs)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:98(closegroup)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:229(_new_pool)\n", - " 388 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:214(is_extension)\n", - " 29 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2744(inferred_type)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:1083(reduction)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:113(comp_method_OBJECT_ARRAY)\n", - " 39 0.000 0.000 0.000 0.000 {method 'all' of 'numpy.ndarray' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:2330(within_tol)\n", - " 456 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:999(__len__)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3238(union)\n", - " 55 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1327(__instancecheck__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:625()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6520(_transform_index)\n", - " 354 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/flags.py:87(allows_duplicate_labels)\n", - " 61 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:836(__iter__)\n", - " 184 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:159(_type_convert)\n", - " 36 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/attr.py:325(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:198(split)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2567(_proxy_bypass_macosx_sysconf)\n", - " 35 0.000 0.000 0.000 0.000 {method '__reduce_ex__' of 'object' objects}\n", - " 23 0.000 0.000 0.000 0.000 :941(update)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:245(_pad_or_backfill)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:11575(_reduce_axis1)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:596(shape)\n", - " 705 0.000 0.000 0.000 0.000 {method 'pop' of 'list' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1216(_get_rows_with_mask)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:735(has_dropped_na)\n", - " 146 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/dataclasses.py:1258(is_dataclass)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:527(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1689(_getitem_tuple)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:452(split_and_operate)\n", - " 9 0.000 0.000 0.000 0.000 {method '__exit__' of '_io._IOBase' objects}\n", - " 37 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:506(__getitem__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:164(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1758(_get_level_values)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:430(_list_schema)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:598()\n", - " 47 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:278(prepare_config)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:177(__init__)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:3995(_maybe_update_cacher)\n", - " 1157 0.000 0.000 0.000 0.000 {method 'endswith' of 'str' objects}\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:187(validate_indices)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:897()\n", - " 55 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2669(__init__)\n", - " 7 0.000 0.000 0.000 0.000 {built-in method _thread.start_new_thread}\n", - " 349 0.000 0.000 0.000 0.000 {built-in method _locale.setlocale}\n", - " 205 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:488(__exit__)\n", - " 151 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:380(validate)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:435(__exit__)\n", - " 177 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_metadata.py:48(__init__)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method posix.getcwd}\n", - " 37 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:675(empty)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:676(ngroups)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:124(extract_cookies_to_jar)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:195(deltas)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1450(grouped_reduce)\n", - " 131 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:707(dtype)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1586(__getitem__)\n", - " 550 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:213(isspace)\n", - " 120 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1643(__len__)\n", - " 635 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3809()\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:771(ngroups)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1334(_get_alias_name)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arraylike.py:68(__and__)\n", - " 53 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:782(_rename)\n", - " 45 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:598(collect_definitions)\n", - " 27 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2353(copy)\n", - " 18 0.000 0.000 0.000 0.000 :437(cache_from_source)\n", - " 35 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:328(__init__)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6324(_maybe_downcast_for_indexing)\n", - " 444 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:256(match)\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:61(merge_setting)\n", - " 71 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5552(equals)\n", - " 90/8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:99(all_literal_values)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:836(_isnan)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:858(pad_or_backfill_inplace)\n", - " 348 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:300()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:744(_group_index)\n", - " 27 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:334(_remove_dups_flatten)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6123(_logical_method)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:74(array)\n", - " 198 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/base.py:238(construct_from_string)\n", - " 39 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:2378(array_equal)\n", - " 304 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:735(_sanitize_str_dtypes)\n", - " 75 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:184(_reconstruct_data)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/ipkernel.py:768(init_closure)\n", - " 103 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/typing_extensions.py:2976(_is_unpacked_typevartuple)\n", - " 644 0.000 0.000 0.000 0.000 :760(decode)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:1087(result_index)\n", - " 1326 0.000 0.000 0.000 0.000 {method 'values' of 'dict' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:2706(_from_arrays)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1774(get_result_processor)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:1135(_splitport)\n", - " 305 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1590()\n", - " 141 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:673(na_value_for_dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:156(_indexer_and_to_sort)\n", - " 74 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:115(annotated_type)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:838(_cleanup)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method _scproxy._get_proxy_settings}\n", - " 45 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:448(size)\n", - " 36 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:374(urlparse)\n", - " 56 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:201(_simple_new)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:843(_hasna)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/utils.py:215(any_specified_encoding)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1418(_literal_schema)\n", - " 324 0.000 0.000 0.000 0.000 :697(__iter__)\n", - " 103 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:108(asi8)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:273(fields)\n", - " 444 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:758(_maybe_repeat)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:405(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/scrapers/quote.py:649()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:106(_encode_params)\n", - " 306 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:649(_get_deprecated_option)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1290(_cookies_for_request)\n", - " 48 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:243(__init__)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1935(delete)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:482(nanany)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/tools/times.py:67(_convert_listlike)\n", - " 45 0.000 0.000 0.000 0.000 :773(getenv)\n", - " 222 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:329(month)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:776(reconstructed_codes)\n", - " 141 0.000 0.000 0.000 0.000 {method 'clear' of 'dict' objects}\n", - " 81 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4585(_ensure_valid_index)\n", - " 134 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:87(is_literal_type)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/sql/type_api.py:908(_cached_result_processor)\n", - " 51 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1047(shape)\n", - " 36 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/attr.py:210(update_subclass)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:947(json)\n", - " 114 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:2473(get_args)\n", - " 163 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:325(_get_take_nd_function)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1025(argsort)\n", - " 35 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:165(maybe_lift)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1272(_cookies_for_domain)\n", - " 236 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:667(_info_axis)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7469(max)\n", - " 1413 0.000 0.000 0.000 0.000 {method 'items' of 'dict' objects}\n", - " 42 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:914(__len__)\n", - " 71 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2065(set_values)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:258(_get_conn)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1532(__neg__)\n", - " 18 0.000 0.000 0.000 0.000 :392(cached)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:272(__init__)\n", - " 205 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/warnings.py:441(__init__)\n", - " 242/218 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2345()\n", - " 56 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:350(getitem_block_columns)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:856(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_model_construction.py:500(set_model_fields)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1954(get_rows_with_mask)\n", - " 118 0.000 0.000 0.000 0.000 {method 'remove' of 'list' objects}\n", - " 43 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:302(add)\n", - " 92 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:948(from_blocks)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:1324(diff)\n", - " 115 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:456(_engine_type)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1433(find_common_type)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:278(connect)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:209(is_unique_asi8)\n", - " 105 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:514(_collect_metadata)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:521(cookiejar_from_dict)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/simplejson/__init__.py:459(loads)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:199(deltas_asi8)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1032(_getitem_lowerdim)\n", - " 79 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1763(np_can_hold_element)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:777(_concat_indexes)\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:351(putheader)\n", - " 9 0.000 0.000 0.000 0.000 :567(_get_cached)\n", - " 10 0.000 0.000 0.000 0.000 :169(__enter__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1655(__getitem_inner__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:108()\n", - " 55 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1602(__subclasscheck__)\n", - " 97 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2776(_is_multi)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:268(decons_obs_group_ids)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:331(putrequest)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/scrapers/quote.py:651()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/simplejson/decoder.py:379(decode)\n", - " 222 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:319(jump)\n", - " 358 0.000 0.000 0.000 0.000 {built-in method numpy.asanyarray}\n", - " 49 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:4120(_coerce_indexer_frozen)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5455(append)\n", - " 1449 0.000 0.000 0.000 0.000 {method 'isalpha' of 'str' objects}\n", - " 146 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1040(needs_i8_conversion)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:407(__rsub__)\n", - " 419 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1725(__eq__)\n", - " 804 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:211(tail)\n", - " 45 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:170(parent_frame_namespace)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/accessors.py:70(_get_values)\n", - " 29 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:883(_get_args_resolving_forward_refs)\n", - " 182 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:401(_config_wrapper)\n", - " 76 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:132(geterr)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:775(infer_dtype_from_scalar)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12260(block_accum_func)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:246(_decons_group_index)\n", - " 188 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:219(_can_consolidate)\n", - " 283 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1837(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6459(any)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:918(new_func)\n", - " 334 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:572(_get_axis_number)\n", - " 159 0.000 0.000 0.000 0.000 :128()\n", - " 3 0.000 0.000 0.000 0.000 {built-in method _operator.sub}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/weakref.py:585(__call__)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1010(view)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:11458(blk_func)\n", - " 131 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1993(dtype)\n", - " 31 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:789(values)\n", - " 39 0.000 0.000 0.000 0.000 {built-in method numpy.arange}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2016(_sort_levels_monotonic)\n", - " 115 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/typing_extensions.py:1132(is_typeddict)\n", - " 388 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:115(get_ref)\n", - " 103 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:688(__call__)\n", - " 119 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:292(make_block_same_class)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5491(_concat)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/simplejson/decoder.py:392(raw_decode)\n", - " 100 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_compiler.py:216(_compile_charset)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:319(build_schema_type_to_method)\n", - " 29 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:835(_local_timestamps)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:424(str_schema)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:1848(_wrap_result)\n", - " 4/1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_decorators.py:424(build)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:605(float_schema)\n", - " 677 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:53(is_core_schema)\n", - " 627/624 0.000 0.000 0.000 0.000 {method 'encode' of 'str' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:1174(_close_pool_connections)\n", - " 35 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:633(is_integer_dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1261(_common_field_schema)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:943(urlencode)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_fields.py:72(collect_model_fields)\n", - " 317 0.000 0.000 0.000 0.000 {method 'split' of 'str' objects}\n", - " 923 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5144(_values)\n", - " 251 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:470(__getattr__)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6415(_is_comparable_dtype)\n", - " 95 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:688(_warn_if_deprecated)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:374(_is_business_daily)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/timedeltas.py:149(__new__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1093(_getitem_nested_tuple)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:423(repeat)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:378(interleaved_dtype)\n", - " 211 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:617(_select_options)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:94(concatenate_managers)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:2082(empty)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1939(normalize_name)\n", - " 28/27 0.000 0.000 0.000 0.000 {built-in method _operator.le}\n", - " 51 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:74(__len__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:2329(hfunc)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1103(putrequest)\n", - " 552 0.000 0.000 0.000 0.000 {method '__exit__' of '_thread.RLock' objects}\n", - " 68 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:122(_reset_cache)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1595(copy_with)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1680(extract_cookies)\n", - " 9 0.000 0.000 0.000 0.000 {built-in method _operator.truediv}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:202(__init__)\n", - " 43 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1850(from_blocks)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:82(f)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:968(_pad_2d)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:1436(date)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1517(field_is_present)\n", - " 39 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:328(check_deprecated)\n", - " 31 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2000(external_values)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:1714(na_accum_func)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12530(rolling)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:2426(nullable_schema)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1574(_set_names)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:7918(_dispatch_frame_op)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1265(_iset_single)\n", - " 68 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2567(push)\n", - " 62 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5295(_validate_fill_value)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:808(__init__)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:490(get)\n", - " 363 0.000 0.000 0.000 0.000 {method 'rpartition' of 'str' objects}\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:122(put)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/sql/type_api.py:949(_dialect_info)\n", - " 46 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/dispatch.py:17(should_extension_dispatch)\n", - " 8 0.000 0.000 0.000 0.000 {built-in method _operator.mul}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:866(__init__)\n", - " 1408 0.000 0.000 0.000 0.000 {method 'decode' of 'bytes' objects}\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1697(_validate_names)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:543(nanall)\n", - " 392 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:24(_kind_name)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:982(__init__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:363(_can_hold_element)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2955(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:137(hasnans)\n", - " 37 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/type_adapter.py:100(_getattr_no_parents)\n", - " 236 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1270(is_1d_only_ea_dtype)\n", - " 160 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:566(is_self_type)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1422(__sub__)\n", - " 152 0.000 0.000 0.000 0.000 {method 'astype' of 'numpy.ndarray' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:573(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2244(get_values)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:355(_concatenate_chunks)\n", - " 1 0.000 0.000 0.000 0.000 :105(__new__)\n", - " 58 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:545(is_dataclass)\n", - " 295 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:1257(value)\n", - " 97 0.000 0.000 0.000 0.000 {method 'nonzero' of 'numpy.ndarray' objects}\n", - " 97 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1056(_could_be_tzname)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:306(is_named_tuple)\n", - " 329 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:176(append)\n", - " 37 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:499(none_schema)\n", - " 101 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/numpy/function.py:64(__call__)\n", - " 262 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/__init__.py:42(warn_copy_on_write)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:593(fetch_eof_columns)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:493(_wrap_result)\n", - " 82 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:195(is_array_like)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:10185(align)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/objects.py:96(get_window_bounds)\n", - " 39 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/algorithms.py:217(_ensure_arraylike)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:483(prepare_headers)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:369(nargsort)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1636(copy_with)\n", - " 221 0.000 0.000 0.000 0.000 {built-in method builtins.max}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2307(factorize)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method builtins.print}\n", - " 3 0.000 0.000 0.000 0.000 {built-in method builtins.compile}\n", - " 21 0.000 0.000 0.000 0.000 :150(dirname)\n", - " 23 0.000 0.000 0.000 0.000 {method 'sub' of 're.Pattern' objects}\n", - " 372 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1721()\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:901(quote_plus)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:592(get_content_type)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:8282(_construct_result)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1595(makeRecord)\n", - " 151 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:482()\n", - " 101 0.000 0.000 0.000 0.000 {method 'reshape' of 'numpy.ndarray' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/base.py:1428(factorize)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1126(_sub_datetimelike_scalar)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:837(list_schema)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1684(is_monotonic_increasing)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:813(str_schema)\n", - " 46 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:198()\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/generic.py:155(_wrap_agged_manager)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:154(get)\n", - " 9 0.000 0.000 0.000 0.000 {method 'repeat' of 'numpy.ndarray' objects}\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/common.py:103(_maybe_match_name)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:95(__init__)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:127(__init__)\n", - " 161 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:557(is_generic_alias)\n", - " 347 0.000 0.000 0.000 0.000 {method 'join' of 'str' objects}\n", - " 156 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:158(_check_finalvar)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2410(wrap_default)\n", - " 296 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/type_adapter.py:259(_with_frame_depth)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:35(__init__)\n", - " 124 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1380()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:404(__radd__)\n", - " 13 0.000 0.000 0.000 0.000 {method 'min' of 'numpy.ndarray' objects}\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1259(putheader)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:105(__init__)\n", - " 79 0.000 0.000 0.000 0.000 {built-in method fromkeys}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:180()\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1725(can_hold_element)\n", - " 27 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:847(quote)\n", - " 91 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1099(_parse_min_sec)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2252()\n", - " 369 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:718(dtype)\n", - " 732 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:405(flags)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:1499(_maybe_null_out)\n", - " 4/3 0.000 0.000 0.000 0.000 {built-in method _operator.ge}\n", - " 105 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:204()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:127(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6499(min)\n", - " 10 0.000 0.000 0.000 0.000 :179(_get_module_lock)\n", - " 9 0.000 0.000 0.000 0.000 :159(_path_isfile)\n", - " 809 0.000 0.000 0.000 0.000 {built-in method builtins.callable}\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:353(wrapper)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:652(str_schema)\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:465(_decode)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1756(_get_slice_axis)\n", - " 51 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2093(update_with_validations)\n", - " 99 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2177(_grouping_func)\n", - " 27 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:306(_deduplicate)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:833(isna)\n", - " 203 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/__init__.py:55(using_pyarrow_string_dtype)\n", - " 12 0.000 0.000 0.000 0.000 {method 'sum' of 'numpy.ndarray' objects}\n", - " 97 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:322(weekday)\n", - " 42 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:2140()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:655(write)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:251(handle_list_schema)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_compiler.py:386(_mk_bitmap)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:838(select_proxy)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12381(min)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1599(make_cookies)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:292(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:942(format)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1096(return_ok)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4060(_get_fill_indexer)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:182(close)\n", - " 53 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:973(coerce_indexer_dtype)\n", - " 146 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:791(is_)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/astype.py:157(astype_array)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1250(copy)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:507(maybe_prepare_scalar_for_op)\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:345(to_key_val_list)\n", - " 9 0.000 0.000 0.000 0.000 :1602(_get_spec)\n", - " 9 0.000 0.000 0.000 0.000 :150(_path_is_mode_type)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:1547(check_below_min_count)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:271(validate_fillna_kwargs)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:1789(_adjust_binner_for_upsample)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:541(config)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:317(__add__)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2692(max)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:241(_from_sequence_not_strict)\n", - " 114 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:1507(_get_value)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2666(_maybe_normalize_endpoints)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:237(ndarray_to_mgr)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:121(decompress)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:259(maybe_downcast_to_dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/request.py:2662(getproxies_macosx_sysconf)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:674(format)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:209(count_not_none)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:43(_amin)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1158(_sub_datetimelike)\n", - " 280 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:164(__len__)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:781(_call_soon)\n", - " 60 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/_policybase.py:319(header_fetch_parse)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:1084(_convert_grouper)\n", - " 54 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_asarray.py:108()\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5676()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6916(delete)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method _scproxy._get_proxies}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2225(_handle_dbapi_exception)\n", - " 1107 0.000 0.000 0.000 0.000 {built-in method builtins.ord}\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:47(_sum)\n", - " 46 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1734(isEnabledFor)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:546(request_url)\n", - " 131 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:226(validate_bool_kwarg)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:445(unit)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:658(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/sql/type_api.py:1002(adapt)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_signature.py:145(generate_pydantic_signature)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:213(_read_headers)\n", - " 43 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/_policybase.py:301(header_source_parse)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1535(field_is_required)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_model_construction.py:335(inspect_namespace)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ssl.py:1262(sendall)\n", - " 420 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:222()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4361(_slice)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:10479(_align_frame)\n", - " 33 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:3345(arguments_parameter)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:3108(cumprod)\n", - " 193 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:293(tell)\n", - " 21 0.000 0.000 0.000 0.000 :71(join)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:2208(__init__)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:560(_validate_scalar)\n", - " 28 0.000 0.000 0.000 0.000 {method 'fill' of 'numpy.ndarray' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1512(_close_special)\n", - " 56 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1262(_slice)\n", - " 31 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:249(external_values)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:446(_init_decoder)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:1138(_handle_chunk)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:303(_normalize_host)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/base.py:800(argsort)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:255(get)\n", - " 18 0.000 0.000 0.000 0.000 :132(_path_split)\n", - " 191 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/encodings/ascii.py:25(decode)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:990(sequence_to_td64ns)\n", - " 197 0.000 0.000 0.000 0.000 {method 'update' of 'dict' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:325(get_new_columns)\n", - " 81 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:271(__enter__)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1771(_is_label_reference)\n", - " 27 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:923(quote_from_bytes)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:86(opengroup)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:479(items)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:254(__new__)\n", - " 266 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1940(_block)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:137(__new__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:307(_pad_or_backfill)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_signature.py:71(_generate_signature_parameters)\n", - " 9 0.000 0.000 0.000 0.000 :1146(path_stats)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:631(_safe_read)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:350(_get_quarterly_rule)\n", - " 74 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/utils.py:51(unicode_range)\n", - " 36 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:1038(handle_unread_result)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1384(_checkin)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:81(atleast_2d)\n", - " 3 0.000 0.000 0.000 0.000 {method 'decompress' of 'zlib.Decompress' objects}\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:735(_error_catcher)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:525(_unbox_scalar)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_ranges.py:24(generate_regular_range)\n", - " 66 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:259(__getitem__)\n", - " 409 0.000 0.000 0.000 0.000 {built-in method builtins.min}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:487()\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:2364(with_default_schema)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/utils.py:74(is_punctuation)\n", - " 24 0.000 0.000 0.000 0.000 {built-in method _warnings.warn}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1284(find_result_type)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:525(get_all)\n", - " 400 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:1080(copyto)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:240(init_poolmanager)\n", - " 105 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:205()\n", - " 82 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:131()\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2285()\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1467(debug)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:616(get_content_maintype)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:542(merge_cookies)\n", - " 4 0.000 0.000 0.000 0.000 {method 'cumprod' of 'numpy.ndarray' objects}\n", - " 60 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/_policybase.py:289(_sanitize_header)\n", - " 55 0.000 0.000 0.000 0.000 {method 'setdefault' of 'dict' objects}\n", - " 161 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:246(items)\n", - " 296 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1381()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:125(f)\n", - " 81 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:274(__exit__)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/utils/filters.py:8(filter_inputs)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/extension.py:153(_isnan)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:287(get_dtypes)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:470(any_schema)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1893(get_title_from_name)\n", - " 52 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:127(__next__)\n", - " 97 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:342(ampm)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2037(_signature_bound_method)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2100(clip)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:409(iscoroutinefunction)\n", - " 378 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/flags.py:55(allows_duplicate_labels)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:164(hostname)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:378(new_index)\n", - " 354 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:363(attrs)\n", - " 37 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/type_adapter.py:323(_defer_build)\n", - " 279 0.000 0.000 0.000 0.000 {built-in method sys._getframe}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/typing_extensions.py:1616(__new__)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/concat.py:52(concat_compat)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/connection.py:15(is_connection_dropped)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:2074(getLogger)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/version/__init__.py:339(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:586(update_dtype)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:284(mdiffs)\n", - " 89 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/functools.py:65(wraps)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ssl.py:1235(send)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/generic.py:160(_get_data_to_aggregate)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:230(get_cls_type_hints_lenient)\n", - " 41 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:592(_get_block_manager_axis)\n", - " 9 0.000 0.000 0.000 0.000 :778(spec_from_file_location)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:831(construct_from_string)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:1868(_validate)\n", - " 31 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2827(external_values)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1830(__class_getitem__)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/putmask.py:115(extract_bool_array)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:299(is_connected)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6219(_raise_if_missing)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:1()\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1261(__init__)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:141(validate_kwargs)\n", - " 44 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:83(is_callable_type)\n", - " 94 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:46(__setitem__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:917(_finalize_fairy)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2214(_build_definitions_remapping)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:315(_subx)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/wait.py:113(wait_for_read)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_compiler.py:388()\n", - " 76 0.000 0.000 0.000 0.000 {built-in method numpy.seterrobj}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:741(_only_one_row)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:902(_fillna_prep)\n", - " 176 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:207(remap_json_ref)\n", - " 35 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:230(_can_hold_na)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2476(add_json_schema_extra)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:246(get_new_values)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1040(__init__)\n", - " 2 0.000 0.000 0.000 0.000 {method 'write' of '_ssl._SSLSocket' objects}\n", - " 528 0.000 0.000 0.000 0.000 {built-in method _warnings._filters_mutated}\n", - " 9 0.000 0.000 0.000 0.000 :642(_classify_pyc)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:204(get_netrc_auth)\n", - " 28/19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_compiler.py:436(_get_literal_prefix)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:255(__init__)\n", - " 582 0.000 0.000 0.000 0.000 {method 'isspace' of 'str' objects}\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3996(_check_indexing_method)\n", - " 27/24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1394(__hash__)\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:2472(union_schema)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:577(_schedule_flush)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:358(update)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:1332(getfullargspec)\n", - " 412 0.000 0.000 0.000 0.000 {method 'rstrip' of 'str' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:481()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/wait.py:57(poll_wait_for_socket)\n", - " 233 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:196(blklocs)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:606(_maybe_promote_cached)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:391(_has_code_flag)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2794(_na_value)\n", - " 24 0.000 0.000 0.000 0.000 {built-in method _operator.invert}\n", - " 46 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:453(_uniq)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:524(_validate_comparison_value)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:153(_set_option)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:2352(_adjust_bin_edges)\n", - " 45 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:3750(definitions_schema)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:140(_from_backing_data)\n", - " 64 0.000 0.000 0.000 0.000 {built-in method _thread.allocate_lock}\n", - " 39 0.000 0.000 0.000 0.000 {built-in method pydantic_core._pydantic_core.to_jsonable_python}\n", - " 8 0.000 0.000 0.000 0.000 {method 'all' of 'numpy.generic' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2107(droplevel)\n", - " 88 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:99(freq)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:664(maybe_fill)\n", - " 9 0.000 0.000 0.000 0.000 :675(_validate_timestamp_pyc)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:940(date_schema)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:259(schedule)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:332(array)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/utils.py:92(get_indented_logger)\n", - " 276 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1671(name)\n", - " 274 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/weakref.py:454(__contains__)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/utils.py:158(get_yf_logger)\n", - " 35 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_compiler.py:398(_simple)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1667(_validate_integer)\n", - " 493 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6672(_maybe_cast_indexer)\n", - " 56 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:72()\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:404(is_dataclass)\n", - " 156 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:292(isclass)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1123(return_ok_verifiability)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/response.py:40(assert_header_parsing)\n", - " 168 0.000 0.000 0.000 0.000 :244(_verbose_message)\n", - " 56 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:376(_escape)\n", - " 4 0.000 0.000 0.000 0.000 {method 'clip' of 'numpy.ndarray' objects}\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:532(treat_as_nested)\n", - " 170 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:113(__init__)\n", - " 113 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1720(_value_and_type_iter)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/events.py:35(__init__)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:635(release_conn)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6357(_protect_consolidate)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2817(hasnans)\n", - " 145 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:378(isfunction)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4027(_iter_column_arrays)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1877(__init_subclass__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/computation/expressions.py:246(where)\n", - " 130 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:300(ismethod)\n", - " 304 0.000 0.000 0.000 0.000 {method 'upper' of 'str' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:220(__init__)\n", - " 10 0.000 0.000 0.000 0.000 :173(__exit__)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1826(_check_label_or_level_ambiguity)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:620(request_host)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:762(infer_dtype_from)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:487()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/wait.py:74(do_poll)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:1305(construct_from_string)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1798()\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:591(int_schema)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:562(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:479(__enter__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:304(_get_filepath_or_buffer)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:398(validate_inclusive)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1327(getLogger)\n", - " 64 0.000 0.000 0.000 0.000 {method 'transpose' of 'numpy.ndarray' objects}\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py:187(identify_interval)\n", - " 50 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:90(RLock)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/astype.py:56(_astype_nansafe)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copyreg.py:113(_slotnames)\n", - " 37 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:366(notify)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/data.py:324(_get_cookie_and_crumb)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:316(close)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1605(maybe_cast_to_integer_array)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:231(__init__)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:3689(equals)\n", - " 245 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1081(codes)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:726(is_third_party)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:614(_maybe_promote)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:545(_get_sample_object)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/take.py:287(_get_take_nd_function_cached)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:95(_default_key_normalizer)\n", - " 44 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:119(_coerce_args)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1392(np_find_common_type)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:291(arrays)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:259(_standardize_fill_value)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:724()\n", - " 103 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/enum.py:1095(__new__)\n", - " 37 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/missing.py:131(dispatch_fill_zeros)\n", - " 1 0.000 0.000 0.000 0.000 {method 'poll' of 'select.poll' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:266(index_labels_to_array)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:315(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/computation/expressions.py:172(_where_standard)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:987(__init__)\n", - " 105 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:497(_extract_metadata)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:606(formatTime)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:115(__init__)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:2623(_infer_tz_from_endpoints)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5134(array)\n", - " 116 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:283(ismodule)\n", - " 234 0.000 0.000 0.000 0.000 {method 'find' of 'bytearray' objects}\n", - " 125 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:360(convertyear)\n", - " 2 0.000 0.000 0.000 0.000 {method 'put' of 'numpy.ndarray' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:303(makefile)\n", - " 197 0.000 0.000 0.000 0.000 {method '__exit__' of '_thread.lock' objects}\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7723(_unpack_nested_dtype)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5172(delete)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:6137(_align_for_op)\n", - " 27 0.000 0.000 0.000 0.000 :84(_unpack_uint32)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:396(build_connection_pool_key_attributes)\n", - " 66 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:51(__getitem__)\n", - " 126 0.000 0.000 0.000 0.000 {method 'ravel' of 'numpy.ndarray' objects}\n", - " 184 0.000 0.000 0.000 0.000 {method 'insert' of 'list' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:81(__init__)\n", - " 8 0.000 0.000 0.000 0.000 {built-in method today}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:296(_put_conn)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:358(_prep_values)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:718(_unbox)\n", - " 42 0.000 0.000 0.000 0.000 :1026(__enter__)\n", - " 1 0.000 0.000 0.000 0.000 {method 'searchsorted' of 'numpy.ndarray' objects}\n", - " 90 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:206(_should_unflatten_callable_args)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:100(push)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/accessor.py:220(__get__)\n", - " 197 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2043(freq)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:249(eval_type_lenient)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:636(eff_request_host)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1377(__init__)\n", - " 37/21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1227(deepvalues)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:1054(construct_from_string)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:950(_validate_or_indexify_columns)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:2228(construct_from_string)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:436(_split)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:157(clean_fill_method)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:183(_make_sorted_values)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:137(__init__)\n", - " 289 0.000 0.000 0.000 0.000 {built-in method builtins.id}\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:316(_class_escape)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:1530(scalar)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimelike.py:745(_get_engine_target)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:794(_set_axis_nocheck)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:1532(_soft_close)\n", - " 65 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:3002()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2159(_drop_level_numbers)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1692()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3766(_convert_can_do_setop)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:199(__init__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2582(array_values)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:230(_handle_eof)\n", - " 10 0.000 0.000 0.000 0.000 :125(release)\n", - " 307 0.000 0.000 0.000 0.000 {method 'is_finite' of 'decimal.Decimal' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:974(close)\n", - " 204 0.000 0.000 0.000 0.000 {method 'add' of 'set' objects}\n", - " 74 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1133(_parsems)\n", - " 3 0.000 0.000 0.000 0.000 {method 'cumsum' of 'numpy.ndarray' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/scrapers/fundamentals.py:13(__init__)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:215(_vhstack_dispatcher)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:660(requote_uri)\n", - " 52 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:77(readline)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:1034(check_header_validity)\n", - " 35 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copyreg.py:104(__newobj__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:4017(_get_column_array)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:978(__array__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:567()\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:167(get_annotations)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_known_annotated_metadata.py:121(expand_grouped_metadata)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:159(resolve_redirects)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_methods.py:90(_clip)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:822(reset)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:90(_urllib3_request_context)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4379(_set_is_copy)\n", - " 10 0.000 0.000 0.000 0.000 :71(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:1120(_update_chunk_length)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:588(prepare_auth)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/base.py:2716(_compat_first)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/putmask.py:29(putmask_inplace)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:134(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1188(domain_return_ok)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:900(default_headers)\n", - " 109 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:83(groups)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:480(_get_ndims)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:957(_validate_tuple_indexer)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:751(checkin)\n", - " 188 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:59(is_core_schema_field)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:59(__new__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:76(copy)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1534(blk_func)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:157(from_prioritized_choices)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/putmask.py:62(putmask_without_repeat)\n", - " 80 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1388(__eq__)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3200(_get_reconciled_name_object)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:452(urlsplit)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_dtype.py:34(__str__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:2609(overload)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:457(__neg__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:243(_from_values_or_dtype)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:485(__exit__)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:205(_hostinfo)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:240(_validate_numeric_only)\n", - " 145 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:974(dtype)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1561(findCaller)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:354(validate_ascending)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/accessors.py:611(__new__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:1046(_new_conn)\n", - " 42 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:845(unread_result)\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:400()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:348(_get_timeout)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:109(__init__)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:992(is_numeric_v_string_like)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6831(infer_objects)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_compiler.py:467(_get_charset_prefix)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/base.py:294(is_dtype)\n", - " 37 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/type_adapter.py:314(serializer)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:984()\n", - " 247 0.000 0.000 0.000 0.000 {function FrozenList.__getitem__ at 0x1275fccc0}\n", - " 51 0.000 0.000 0.000 0.000 {method 'rfind' of 'str' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:850(_maybe_mask_results)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:616()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:393(logical_op)\n", - " 10 0.000 0.000 0.000 0.000 :100(acquire)\n", - " 74 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:479(__repr__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:455(create_cookie)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:231(_fix)\n", - " 116 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:480(iscode)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/langhelpers.py:1138(__get__)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1839(debug)\n", - " 62 0.000 0.000 0.000 0.000 {built-in method _imp.acquire_lock}\n", - " 116 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:456(istraceback)\n", - " 29 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:886()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/validate_call_decorator.py:1()\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:3015(parameters)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:1018(get_auth_from_url)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Configuration.py:37(__setattr__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:416(_resolve_output)\n", - " 133 0.000 0.000 0.000 0.000 {built-in method numpy.core._multiarray_umath.normalize_axis_index}\n", - " 116 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:466(isframe)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:451(_return_conn)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:494(_clean_keys_and_objs)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1591()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1685(_clean_options)\n", - " 178 0.000 0.000 0.000 0.000 {built-in method unicodedata.name}\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1657(_get_level_number)\n", - " 99 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:51(origin_is_union)\n", - " 26 0.000 0.000 0.000 0.000 {built-in method numpy.zeros}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1026(iget_values)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:537(_check_compatible_with)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:34(__init__)\n", - " 36 0.000 0.000 0.000 0.000 :134()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:136(ones)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:795(_merge_cols_by_none)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1966(_is_lexsorted)\n", - " 43 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:286(_is_owned)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:169(_get_cython_function)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:253(_get_values)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:679(_init_length)\n", - " 174 0.000 0.000 0.000 0.000 {method 'discard' of 'set' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:424(close)\n", - " 152 0.000 0.000 0.000 0.000 {built-in method numpy.geterrobj}\n", - " 46 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/construction.py:688(_sanitize_non_ordered)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:499(close)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:539(get_encoding_from_headers)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:1745(currentframe)\n", - " 25 0.000 0.000 0.000 0.000 {method '_acquire_restore' of '_thread.RLock' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/exc.py:604(instance)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/zmq/sugar/socket.py:621(send)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:644(get_group_index_sorter)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:342(construct_from_string)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:263(_remove_path_dot_segments)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:865(_references)\n", - " 15 0.000 0.000 0.000 0.000 {method 'subn' of 're.Pattern' objects}\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:516(close)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1627(_get_options_with_defaults)\n", - " 125 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:402(has_year)\n", - " 203 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:153(concatenate)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2002(_lexsort_depth)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:1381(first)\n", - " 178 0.000 0.000 0.000 0.000 {method 'replace' of 'str' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:495(_real_close)\n", - " 4 0.000 0.000 0.000 0.000 {method 'any' of 'numpy.generic' objects}\n", - " 63 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/utils.py:52(_has_surrogates)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:1045(_validate_header_part)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1051(_stop)\n", - " 45 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2516(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:1149(_normalize_host)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:1835(construct_from_string)\n", - " 23 0.000 0.000 0.000 0.000 {method '_checkReadable' of '_io._IOBase' objects}\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:735(unwrap)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:261(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/langhelpers.py:1404(constructor_copy)\n", - " 4 0.000 0.000 0.000 0.000 {built-in method _operator.ne}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:305(_compile_repl)\n", - " 37 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:131(is_new_type)\n", - " 228 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:363(ndim)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:243(get_payload)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/impl.py:144(_do_return_conn)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:454(__exit__)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4518(_check_inplace_and_allows_duplicate_labels)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:191(_validate_parse_dates_presence)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:69(close)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:99(for_model)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:509(urlunparse)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/json/__init__.py:299(loads)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:916(__eq__)\n", - " 60 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1571(_get_names)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2209(_safe_close_cursor)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:769(_assert_tzawareness_compat)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1340()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:188(clone)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2804(_isnan)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/roperator.py:14(rsub)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:238(_new_conn)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:466(array_equivalent)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/retry.py:202(__init__)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2586(get_values)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1214(path_return_ok)\n", - " 144 0.000 0.000 0.000 0.000 :409(__subclasshook__)\n", - " 191 0.000 0.000 0.000 0.000 {built-in method _codecs.ascii_decode}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1237(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:4037(_lexsort_depth)\n", - " 2 0.000 0.000 0.000 0.000 :1311(__iter__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1730(_get_default_index_names)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:3386(arguments_schema)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:381()\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:567(free_result)\n", - " 82 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:126(_classes_and_not_datetimelike)\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:274(getuntil)\n", - " 62 0.000 0.000 0.000 0.000 {method 'item' of 'numpy.ndarray' objects}\n", - " 79 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:58()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:849(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:794(close)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:891(_get_first_arg_or_any)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:177(__init__)\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/anyio/from_thread.py:170(_check_running)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:99(_intenum_converter)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:85(path_url)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:1125(_time_to_micros)\n", - " 38 0.000 0.000 0.000 0.000 {method 'title' of 'str' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:209(_get_decoder)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:136(reset)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6390()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:556(__init__)\n", - " 14 0.000 0.000 0.000 0.000 {built-in method _operator.and_}\n", - " 48 0.000 0.000 0.000 0.000 :41(_get_sep)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:791(_autobegin)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:1206(literal_schema)\n", - " 85 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/weakref.py:414(__getitem__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:502(enter_context)\n", - " 90 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/frozendict/monkeypatch.py:145(frozendictMutableMappingSubclasshook)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:1204(is_potential_multi_index)\n", - " 148 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:266(mgr_locs)\n", - " 93 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:696(ndim)\n", - " 43 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:507(set_raw)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/utils.py:22(is_accentuated)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:84()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/queue.py:132(put)\n", - " 42 0.000 0.000 0.000 0.000 :1030(__exit__)\n", - " 1 0.000 0.000 0.000 0.000 {function socket.close at 0x11039a0c0}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:419(_close_conn)\n", - " 183 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:186(__iter__)\n", - " 133 0.000 0.000 0.000 0.000 {method 'extend' of 'list' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:326()\n", - " 121 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:213()\n", - " 37 0.000 0.000 0.000 0.000 {method 'acquire' of '_thread.RLock' objects}\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:228(_acquireLock)\n", - " 37 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/type_adapter.py:333(_is_defer_build_config)\n", - " 35 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_schema_generation_shared.py:72(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:390(_check_close)\n", - " 36 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/util.py:19(to_str)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:426(_get_window_indexer)\n", - " 10 0.000 0.000 0.000 0.000 :920(find_spec)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:207(_arrays_for_stack_dispatcher)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/utils.py:204(is_unprintable)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:170()\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_weakrefset.py:85(add)\n", - " 125 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:913(__init__)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:672(_is_view_after_cow_rules)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:121(__init__)\n", - " 30 0.000 0.000 0.000 0.000 :67(_relax_case)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:248(stringify_path)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:1248(python_charset)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/root_model.py:35(RootModel)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/string_.py:140(construct_from_string)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:546(ensure_key_mapped)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:3445(call_schema)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/json/decoder.py:332(decode)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:156(_add_default_conn_attrs)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/base.py:170(_event_descriptors)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:263(day_deltas)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:1454(__init__)\n", - " 2 0.000 0.000 0.000 0.000 :1297(_recalculate)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:452(_no_nep50_warning)\n", - " 132 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:290(_add_custom_serialization_from_json_encoders)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1734(clear_expired_cookies)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:410(_is_comparable_dtype)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:536(close)\n", - " 2 0.000 0.000 0.000 0.000 :229(expanduser)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:638(_extract_index)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1721()\n", - " 3 0.000 0.000 0.000 0.000 {method 'close' of '_io.BufferedReader' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/errors.py:222(get_mysql_exception)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/getlimits.py:685(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:636(unquote_unreserved)\n", - " 62 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1455()\n", - " 19 0.000 0.000 0.000 0.000 {built-in method _sre.compile}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:82(frame_apply)\n", - " 99 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:344()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ipaddress.py:1286(__init__)\n", - " 9 0.000 0.000 0.000 0.000 :78(_check_methods)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:57(__iter__)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:164(host)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/encodings/idna.py:145(encode)\n", - " 28 0.000 0.000 0.000 0.000 {built-in method from_bytes}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:647(request_path)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:941()\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/_distutils_hack/__init__.py:102(find_spec)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1671(is_all_strings)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:117(__init__)\n", - " 9 0.000 0.000 0.000 0.000 {method 'settimeout' of '_socket.socket' objects}\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/index_tricks.py:415()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:534(_scalar_from_string)\n", - " 10 0.000 0.000 0.000 0.000 :198(cb)\n", - " 41 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:1073(clean_reindex_fill_method)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/_ufunc_config.py:426(__init__)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:29(_splitparam)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2294()\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:206(get_module_ns_of)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:572(is_required)\n", - " 3 0.000 0.000 0.000 0.000 {built-in method time.strftime}\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:884(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1161(return_ok_domain)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:194(_is_internal_frame)\n", - " 3 0.000 0.000 0.000 0.000 {built-in method time.localtime}\n", - " 42 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:540()\n", - " 1 0.000 0.000 0.000 0.000 {method '_wrap_socket' of '_ssl._SSLContext' objects}\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_compiler.py:570(isstring)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:550(infer_compression)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:871(_do_date_conversions)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:534()\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:512(_validate_axis)\n", - " 124 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5558(_append_dispatcher)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1698()\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:743(readable)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:172(_validate)\n", - " 15 0.000 0.000 0.000 0.000 {method 'write' of '_io.BytesIO' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:349(set_cookie)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1574(_validate_key)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/arraysetops.py:125(_unpack_tuple)\n", - " 39 0.000 0.000 0.000 0.000 {built-in method builtins.abs}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generics.py:237(get_model_typevars_map)\n", - " 9 0.000 0.000 0.000 0.000 :48(_new_module)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/base.py:2411(_quote_free_identifiers)\n", - " 6 0.000 0.000 0.000 0.000 {method 'readlines' of '_io._IOBase' objects}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:100(__new__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:438(convert)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1880(log)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:249(_get_output_shape)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/utils.py:129(is_cjk)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:91(is_deprecated_instance)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:157(_int64_cut_off)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/cd.py:291(merge_coherence_ratios)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/utils.py:268(identify_sig_or_bom)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4436(_wrap_reindex_result)\n", - " 16 0.000 0.000 0.000 0.000 :790(items)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1285(__call__)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/_weakrefset.py:39(_remove)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/sql/schema.py:5357(__init__)\n", - " 2 0.000 0.000 0.000 0.000 :16(exists)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1432(_update_class_schema)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:2176(__hash__)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:638(_passed_categorical)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:3023(replace)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:331(maybe_downcast_numeric)\n", - " 124 0.000 0.000 0.000 0.000 {built-in method _operator.index}\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:49(get_full_url)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:107(get_redirect_target)\n", - " 37 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:248(_qsize)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:630(prepare_hooks)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/exc.py:692(__init__)\n", - " 133 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:1480(_clear_item_cache)\n", - " 77 0.000 0.000 0.000 0.000 {built-in method sys.getrefcount}\n", - " 124 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1764(_ravel_dispatcher)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:1465(list_schema)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:258(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:52(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:201(_set_noconvert_columns)\n", - " 46 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:208(__init__)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:251(put)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:303()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:974(_is_nested_tuple_indexer)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1544(log)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1111(_values)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:811(_newname)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/calendar.py:122(monthrange)\n", - " 89 0.000 0.000 0.000 0.000 {built-in method posix.fspath}\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:175()\n", - " 53 0.000 0.000 0.000 0.000 {built-in method builtins.iter}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:182(_make_key_to_index)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/inspection.py:113(inspect)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:95(literal_values)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1324(_make_invoke_excepthook)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/data.py:26(wrapped)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:628(fetch_eof_status)\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_model_construction.py:63(__setitem__)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:196(mgr_to_mgr)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:332(_idna_encode)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:241(is_single_block)\n", - " 12 0.000 0.000 0.000 0.000 {method 'fetch_fields' of '_mysql_connector.MySQL' objects}\n", - " 42 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:837(result_set_available)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:480()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:128(deepcopy)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:963(fix_flags)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:494(prepare_body)\n", - " 66 0.000 0.000 0.000 0.000 {method 'find' of 'str' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:102()\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/command_runner.py:470(user_settings)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2512(cumsum)\n", - " 10 0.000 0.000 0.000 0.000 :748(find_spec)\n", - " 19 0.000 0.000 0.000 0.000 {method 'free_result' of '_mysql_connector.MySQL' objects}\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/hooks.py:15(default_hooks)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1990(__exit__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:282(query_attrs)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/missing.py:564(_array_equivalent_object)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:267(clear)\n", - " 46 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2564(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:289()\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:268(_get_out_dtype)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:346(shape)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:799(mount)\n", - " 35 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/concurrent/futures/_base.py:398(__get_result)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:922(_maybe_infer_dtype_type)\n", - " 37 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:172(__setitem__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:2131(_fetchone_impl)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/utils.py:124(is_case_variable)\n", - " 4 0.000 0.000 0.000 0.000 {built-in method _operator.inv}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:382(_insert_on_column)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:607(consolidate)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:128(_check_for_invalid_keys)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/utils.py:179(is_arabic)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:648(_colnames_from_description)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:922(acquire)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1357(__getattr__)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:874(fetchone)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1689()\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/constants.py:993(get_info)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/accessors.py:59(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:106(_get_distinct_objs)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:862(codes)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/data.py:217(_get_cookie_and_crumb_basic)\n", - " 35 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1030(axes)\n", - " 5 0.000 0.000 0.000 0.000 {method 'astype' of 'numpy.generic' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/base.py:2414()\n", - " 64 0.000 0.000 0.000 0.000 {method 'append' of 'collections.deque' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/mysqlconnector.py:139(_detect_charset)\n", - " 51 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:660(_constructor)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:403()\n", - " 45 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:330(__init__)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:2738(_check_indexing_error)\n", - " 33 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:130(_validate_timeout)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:781(close)\n", - " 52 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_compiler.py:31(_combine_flags)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:514(_parse_content_type_header)\n", - " 1 0.000 0.000 0.000 0.000 :516(__subclasshook__)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:77(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:769(is_redirect)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:8084(_align_for_op)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1269(set_inplace)\n", - " 39 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/weakref.py:427(__setitem__)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1765(_get_names)\n", - " 29 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:574(is_zoneinfo_type)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:49(_check_for_default_values)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:161(iloc)\n", - " 4 0.000 0.000 0.000 0.000 {built-in method _operator.pow}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:756(_shallow_copy)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/request.py:189(body_to_chunks)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:362(_make_index)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1046(nlevels)\n", - " 3 0.000 0.000 0.000 0.000 :117(splitext)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1622(close)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method zlib.decompressobj}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/json/decoder.py:343(raw_decode)\n", - " 46 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:291(__iter__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:1066(get_fill_func)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/parser/_parser.py:1061()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:1123(_make_date_converter)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ipaddress.py:1187(_ip_int_from_string)\n", - " 32 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6055(_check_indexing_error)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:553(equals)\n", - " 70 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2734(kind)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:795(begin)\n", - " 24 0.000 0.000 0.000 0.000 {built-in method fromisoformat}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/scrapers/quote.py:488(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:658(formatMessage)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:191(_server_status)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_model_construction.py:257(__getattr__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1297(_cookie_attrs)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ssl.py:732(verify_mode)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:266()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:207(register_hook)\n", - " 131 0.000 0.000 0.000 0.000 {built-in method _sre.unicode_iscased}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1981(_caller)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:761(__init__)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:594(_bool_arith_check)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:602()\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/utils.py:89(is_symbol)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:558()\n", - " 6/1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/langhelpers.py:424(get_cls_kwargs)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:1006(parse_template)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/langhelpers.py:1299(__getattr__)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:283(_acquire_restore)\n", - " 25 0.000 0.000 0.000 0.000 {method '_release_save' of '_thread.RLock' objects}\n", - " 37 0.000 0.000 0.000 0.000 {method '__enter__' of '_thread.RLock' objects}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:209(_maybe_get_mask)\n", - " 18 0.000 0.000 0.000 0.000 {method 'fullmatch' of 're.Pattern' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:84(__init__)\n", - " 9 0.000 0.000 0.000 0.000 :599(_check_name_wrapper)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/queue.py:174(get)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generics.py:187(iter_contained_typevars)\n", - " 72 0.000 0.000 0.000 0.000 {method 'isidentifier' of 'str' objects}\n", - " 54 0.000 0.000 0.000 0.000 {built-in method _thread.get_ident}\n", - " 7 0.000 0.000 0.000 0.000 {function HTTPResponse.close at 0x1121f9120}\n", - " 43 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2730(annotation)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1453(current_thread)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ssl.py:566(set_alpn_protocols)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:7652(ensure_has_len)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:143(clear)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/utils.py:247(is_multi_byte_encoding)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/connection.py:93(_set_socket_options)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:353()\n", - " 62 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5364(_insert_dispatcher)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:405(_check_values_indices_shape_match)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/sql/type_api.py:966(_gen_dialect_impl)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1686(name)\n", - " 3 0.000 0.000 0.000 0.000 :140(basename)\n", - " 44 0.000 0.000 0.000 0.000 {method '__enter__' of '_thread.lock' objects}\n", - " 37 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:692(_constructor)\n", - " 66 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:892(bincount)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1889(isEnabledFor)\n", - " 47 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_compiler.py:428(_get_iscased)\n", - " 70 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2722(name)\n", - " 2 0.000 0.000 0.000 0.000 :1293(_get_parent_path)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:677(escape_path)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:237(_releaseLock)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/response.py:9(is_fp_closed)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:483(_view)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:890(_evaluate)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:5649(_needs_reindex_multi)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:5607()\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6277()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:211(_simple_new)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1028(_output)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/numpy/function.py:413(validate_func)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:520(urlunsplit)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/retry.py:387(is_retry)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:254(_get)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/errors.py:46(__init__)\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:304(checkgroupname)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:373(is_sequence)\n", - " 35 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:1249(shape)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/base.py:159(__getattr__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generics.py:337(has_instance_in_type)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1652(_is_scalar_access)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:65(is_function_with_inner_schema)\n", - " 62 0.000 0.000 0.000 0.000 {built-in method _imp.release_lock}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:1096(_can_fast_transpose)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1463()\n", - " 40 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1176(_maybe_disallow_fill)\n", - " 55 0.000 0.000 0.000 0.000 {method '__contains__' of 'frozenset' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:505(get_rename_function)\n", - " 87 0.000 0.000 0.000 0.000 {method 'partition' of 'str' objects}\n", - " 62 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:1389(_moveaxis_dispatcher)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:447(format)\n", - " 45 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2583(__init__)\n", - " 10 0.000 0.000 0.000 0.000 :357(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:596(_sign)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:405(_types_namespace)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/url.py:242()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ssl.py:503(_encode_hostname)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:350(_maybe_make_multi_index_columns)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:305(_connection_insp)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:251(_put)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1398(_reset)\n", - " 19 0.000 0.000 0.000 0.000 {built-in method gc.get_referents}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:2095(create_block_manager_from_blocks)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/getlimits.py:696(min)\n", - " 1 0.000 0.000 0.000 0.000 :397(abspath)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:692(__init__)\n", - " 49 0.000 0.000 0.000 0.000 {built-in method unicodedata.category}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2678(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/constants.py:983(set_mysql_version)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/numpy/function.py:223(validate_cum_func_with_skipna)\n", - " 27 0.000 0.000 0.000 0.000 {built-in method time.time}\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:916()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:550(domain_match)\n", - " 38 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2026(handle_ref_overrides)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/langhelpers.py:1224(_set_memoized_attribute)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:205(_effective_processors)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:128()\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:383(is_closed)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:2874(maybe_warn_args_and_kwargs)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:966(__init__)\n", - " 51 0.000 0.000 0.000 0.000 {method 'lstrip' of 'str' objects}\n", - " 1 0.000 0.000 0.000 0.000 {method 'sendall' of '_socket.socket' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1881(nonzero)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:781(get_adapter)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/generic.py:2015(_wrap_agged_manager)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_schema_generation_shared.py:39(resolve_ref_schema)\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:265(_engine_type)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:2133(_refine_defaults_read)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:314()\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4440(_maybe_preserve_names)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:652(usesTime)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4306(_validate_can_reindex)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:1079(closed)\n", - " 13 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1165(_check_deprecated_callable_usage)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/weakref.py:568(__init__)\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1122()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:352(na_logical_op)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:370()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:884(keys)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/exc.py:477(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:94(origin_req_host)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:172(from_float)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:315(__getattr__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:95(__getitem__)\n", - " 2 0.000 0.000 0.000 0.000 :262(__subclasshook__)\n", - " 36 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:520(can_consume_results)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:691(__del__)\n", - " 46 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:467()\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/utils.py:189(check_single_item)\n", - " 45 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:510()\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:2170(__eq__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:1098(fetchone)\n", - " 37 0.000 0.000 0.000 0.000 {method 'release' of '_thread.RLock' objects}\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Configuration.py:29(__getattr__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:691(reach)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1674(_check_file_or_buffer)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/log.py:104(_should_log_info)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:56(__init__)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/utils.py:65(is_latin)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6537()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3760(_assert_can_do_setop)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/util/numba_.py:18(maybe_use_numba)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method builtins.locals}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:1233(dedup_names)\n", - " 48 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:195()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:195(_new_message)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1667(set_cookie)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:176()\n", - " 27 0.000 0.000 0.000 0.000 {method 'rstrip' of 'bytes' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:464(get_array_op)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/numpy/function.py:369(validate_resampler_func)\n", - " 33 0.000 0.000 0.000 0.000 :315(__subclasshook__)\n", - " 35 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:447(isclosed)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Context.py:124(clear_context)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/calendar.py:115(weekday)\n", - " 11 0.000 0.000 0.000 0.000 :2(__hash__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:440(_format)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:284(_get_result_dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1924(_unsubstituted_typevar_schema)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:464()\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1753(__iter__)\n", - " 10 0.000 0.000 0.000 0.000 {built-in method _imp.is_builtin}\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/utils.py:62(is_list_like_indexer)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/shape_base.py:1185(tile)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/version/__init__.py:520(_cmpkey)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:228(_construct)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/utils.py:139(is_hiragana)\n", - " 9 0.000 0.000 0.000 0.000 :180(_path_isabs)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:46(get_origin_req_host)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:929(release)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1062(levshape)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1552(__mro_entries__)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/retry.py:242()\n", - " 100 0.000 0.000 0.000 0.000 {built-in method _sre.unicode_tolower}\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:209(is_object)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/scrapers/analysis.py:13(__init__)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method _abc._abc_init}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/ssl_.py:473(is_ipaddress)\n", - " 21 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:686()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:334(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_dataclasses.py:198(is_builtin_dataclass)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1182(__getattr__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/__init__.py:321(filter)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2700(_connection_begin_impl)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/utils.py:199(is_unicode_range_secondary)\n", - " 14 0.000 0.000 0.000 0.000 {built-in method _contextvars.copy_context}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:121(pushlines)\n", - " 45 0.000 0.000 0.000 0.000 {method 'strip' of 'str' objects}\n", - " 10 0.000 0.000 0.000 0.000 :165(__init__)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/constants.py:320(raise_warning_against_deprecated_cursor_class)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method math.copysign}\n", - " 1 0.000 0.000 0.000 0.000 {built-in method _socket.gethostname}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/typing_extensions.py:1474(_set_default)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/utils.py:159(is_hangul)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/utils.py:149(is_katakana)\n", - " 35 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2726(default)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:106(keys)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:475(any_extension_types)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:585(type_descriptor)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/data.py:82(_set_session)\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/utils.py:169(is_thai)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generics.py:206(get_args)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:105(is_file_like)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/getlimits.py:709(max)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/ops/array_ops.py:410(fill_bool)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:175(port)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:515(family)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1619(executemany)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1524(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/sql/compiler.py:7475(quote_identifier)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:774(get_proxy)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/typing_extensions.py:1479(_set_module)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:773(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/base.py:187(_join)\n", - " 2 0.000 0.000 0.000 0.000 {method 'setsockopt' of '_socket.socket' objects}\n", - " 39 0.000 0.000 0.000 0.000 {method 'group' of 're.Match' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:330(_sanitize_and_check)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:417(_is_multiple)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/utils.py:368(cut_sequence_chunks)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:194(_handle_warnings)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_collections.py:102(__setitem__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:413(_splitnetloc)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:150(__init__)\n", - " 1 0.000 0.000 0.000 0.000 :1035(_resolve_name)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1181()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:643(name)\n", - " 39 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:2374(_array_equal_dispatcher)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_decorators.py:303(mro)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:799(iter_content)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2155()\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/utils.py:88(__exit__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:276(append)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1658(no_parameters)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:43(get_host)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:505(detach)\n", - " 61 0.000 0.000 0.000 0.000 {method 'popleft' of 'collections.deque' objects}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:535(is_HDN)\n", - " 3 0.000 0.000 0.000 0.000 :815(__len__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:156(username)\n", - " 23 0.000 0.000 0.000 0.000 {method '_checkClosed' of '_io._IOBase' objects}\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/relativedelta.py:172()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/_request_methods.py:51(__init__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/utils.py:85(__enter__)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/pivot.py:173()\n", - " 19 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:7045(_deprecate_downcast)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:202(start_connect)\n", - " 93 0.000 0.000 0.000 0.000 {method '__getitem__' of 'dict' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/errors/__init__.py:535(_check_cacher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/base.py:3333(_detect_ansiquotes)\n", - " 13 0.000 0.000 0.000 0.000 {method 'getvalue' of '_io.BytesIO' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:1269(_process_date_conversion)\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/_internal_utils.py:25(to_native_string)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:1342(is_complex_dtype)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:212(_get_cython_vals)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1447(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:918(_wrap_ipv6)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:471(_type_memos)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:609(_add_js_function)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/Configuration.py:18(initialize_configuration)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:268(hour_deltas)\n", - " 10 0.000 0.000 0.000 0.000 {built-in method _imp.find_frozen}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:436(flush)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/replace.py:31(should_use_regex)\n", - " 9 0.000 0.000 0.000 0.000 :1097(__init__)\n", - " 4 0.000 0.000 0.000 0.000 {method 'reset' of '_contextvars.ContextVar' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:409(_current_generate_schema)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:580(_get_axis_name)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:338(astype)\n", - " 1 0.000 0.000 0.000 0.000 {method 'thread_id' of '_mysql_connector.MySQL' objects}\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:661(_ilevel)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_migration.py:262(wrapper)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:471(__init__)\n", - " 3 0.000 0.000 0.000 0.000 :121(_splitext)\n", - " 9 0.000 0.000 0.000 0.000 :52(normcase)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1959(maybe_mangle_lambdas)\n", - " 28 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2416(_all_dispatcher)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:626(get_cython_func)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:244(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:126(language)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ipaddress.py:1213(_parse_octet)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:126(resolve_default_timeout)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_metadata.py:70(build_metadata_dict)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:863(cleandoc)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:212()\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1472()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1720(getEffectiveLevel)\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1567(_maybe_transpose_result)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:805()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:829(warning_count)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:125(__init__)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:393(prepare_method)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:4191(_validate_positional_slice)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:732(__call__)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1331(dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/impl.py:185(_inc_overflow)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:3781(definition_reference_schema)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:764(categories)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:219(__init__)\n", - " 27 0.000 0.000 0.000 0.000 {method 'get' of 'mappingproxy' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:194(close)\n", - " 44 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:108(_noop)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:6270()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:677(_constructor_expanddim)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:495(_flush_decoder)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_config.py:215(push)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:1099(expand_template)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:982()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:304(cert_verify)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/platform.py:919(system)\n", - " 11 0.000 0.000 0.000 0.000 {method 'items' of 'mappingproxy' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:432(usesTime)\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1479()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:641(fill_missing_names)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:337(push)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/retry.py:379(_is_method_retryable)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1243(_validate_path)\n", - " 4 0.000 0.000 0.000 0.000 {method 'set' of '_contextvars.ContextVar' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1192(is_alive)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/constants.py:800(get_default)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:935(_expand_ellipsis)\n", - " 15 0.000 0.000 0.000 0.000 {method 'count' of 'bytes' objects}\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:518(_check_closed)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:915(__array__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:534(_push_cm_exit)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:280(_release_save)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/handlers.py:354(shouldRollover)\n", - " 16 0.000 0.000 0.000 0.000 :812(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:72(has_header)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/astype.py:249(astype_is_view)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/poolmanager.py:374(_merge_pool_kwargs)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/command_runner.py:465(system_settings)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:222(merge_cls_and_parent_ns)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:531(validate_ordered)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/collections/__init__.py:587(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:363(_repeater)\n", - " 30 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:248(__len__)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:850(more_results)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:659(unquote)\n", - " 5 0.000 0.000 0.000 0.000 :1101(_sanity_check)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:245(read_timeout)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:4585(_is_view)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:2179(__getattr__)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:152(end_date)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1206(daemon)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:788()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:369(should_store)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py:217(_scalar_type)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/sql/type_api.py:2296(adapt_type)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/hooks.py:16()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:208(_pop_message)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/base.py:115(__eq__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:139()\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/timedeltas.py:176(dtype)\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/shape_base.py:77(_atleast_2d_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/queue.py:228(_put)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1091(_begin_impl)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/pivot.py:493(_convert_by)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1076()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:230(_slice_axis_for_step)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:146(is_classvar)\n", - " 26 0.000 0.000 0.000 0.000 {method '_is_owned' of '_thread.RLock' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:196()\n", - " 21 0.000 0.000 0.000 0.000 {method 'values' of 'collections.OrderedDict' objects}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:815(filter)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/base.py:3432(__getitem__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:1426(_validate_parse_dates_arg)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:983(is_in_axis)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/typing_extensions.py:2916(_check_generic)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/hooks.py:22(dispatch_hook)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:194(_values_for_factorize)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:2738(replace)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:367()\n", - " 17 0.000 0.000 0.000 0.000 {method 'index' of 'str' objects}\n", - " 3 0.000 0.000 0.000 0.000 :2(__init__)\n", - " 1 0.000 0.000 0.000 0.000 {method 'getsockopt' of '_socket.socket' objects}\n", - " 15 0.000 0.000 0.000 0.000 {method 'decode' of 'bytearray' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexers/objects.py:72(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:1695()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:243(_keep_alive)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/data.py:157(_get_cookie_basic)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:64(_Unstacker)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:1221(_charset_id)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/structures.py:60(__len__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/base.py:2626(_set_mariadb)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:642()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:12(__init__)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method now}\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:518(__repr__)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:398()\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:168()\n", - " 25 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1021(_argsort_dispatcher)\n", - " 24 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/numpy/function.py:383(validate_minmax_axis)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:166(__setattr__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:706()\n", - " 13 0.000 0.000 0.000 0.000 {method 'groups' of 're.Match' objects}\n", - " 5 0.000 0.000 0.000 0.000 {method 'pop' of 'collections.OrderedDict' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ssl.py:740(verify_mode)\n", - " 34 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2070()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:505(parent_header)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/scrapers/holders.py:15(__init__)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:828(_fetch_row)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1128(value_getitem)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1234(_validate_method)\n", - " 2 0.000 0.000 0.000 0.000 {method 'split' of 're.Pattern' objects}\n", - " 26 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1828(ndim)\n", - " 26 0.000 0.000 0.000 0.000 {method 'end' of 're.Match' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:478()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:997(raise_for_status)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:470()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:601(_set_noconvert_dtype_columns)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:211(is_multipart)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/constants.py:1043(get_charset_info)\n", - " 23 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2474(validate_periods)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:1229()\n", - " 1 0.000 0.000 0.000 0.000 :389(normpath)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:123(getLevelName)\n", - " 22 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2974(_prod_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:271()\n", - " 15 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:575(is_set)\n", - " 3 0.000 0.000 0.000 0.000 {method 'sort' of 'list' objects}\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/arraysetops.py:133(_unique_dispatcher)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1230(_encode_request)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/concat.py:202(_maybe_reindex_columns_na_proxy)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:1251(_validate_host)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:320(__len__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:215(_check_window_bounds)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1664()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/log.py:101(_should_log_debug)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:948(set_client_flags)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:164()\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:333(tail)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:814(_get_refs_and_copy)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:2220(_can_hold_na)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:288()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/reshape.py:219(mask_all)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:403(retries)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:343()\n", - " 12 0.000 0.000 0.000 0.000 {method 'count' of 'str' objects}\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:3176(ndim)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/message.py:331(set_payload)\n", - " 17 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:44(_debug)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/functools.py:421(_unwrap_partial)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic_core/core_schema.py:3050(model_schema)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:947()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:819(get_connection)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:178()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:199(could_be_from_charset)\n", - " 9 0.000 0.000 0.000 0.000 {built-in method _imp._fix_co_filename}\n", - " 10 0.000 0.000 0.000 0.000 {method 'translate' of 'bytearray' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:769(_get_model_title_from_config)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:489(_decref_socketios)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:305(loc)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:187(_get_fill_value)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:1954(get_debug)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1903()\n", - " 14 0.000 0.000 0.000 0.000 {method 'release' of '_thread.lock' objects}\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:140(ticker)\n", - " 1 0.000 0.000 0.000 0.000 :1081(__subclasshook__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:1201(charset)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/utils.py:201()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_model_construction.py:615(set_deprecated_descriptors)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/weakref.py:367(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/_concurrency_py3k.py:61(is_exit_exception)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:188(all_none)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/base.py:3428(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/numpy/function.py:159(validate_argsort_with_ascending)\n", - " 1 0.000 0.000 0.000 0.000 {method 'getpeername' of '_socket.socket' objects}\n", - " 5 0.000 0.000 0.000 0.000 {method 'write' of '_io.StringIO' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1378(_fixupParents)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:193(_userinfo)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_fields.py:243(_is_finalvar_with_default_val)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/_internal_utils.py:38(unicode_is_ascii)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:288()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2721(is_nested_tuple)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:550(_is_master_process)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:520(convert_to_list_like)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1066(_get_arithmetic_result_freq)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/dataclasses.py:332(is_pydantic_dataclass)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:742(_get_axes)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:185()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:354(__array__)\n", - " 4 0.000 0.000 0.000 0.000 {method 'values' of 'mappingproxy' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/window/rolling.py:274(_create_data)\n", - " 3 0.000 0.000 0.000 0.000 :1()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/attr.py:425(_memoized_attr__exec_once_mutex)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:397(ensure_np_dtype)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1643(reconstruct_func)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:480(is_view)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/attr.py:389(__bool__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:2180(_ensure_matching_resos)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/array_algos/putmask.py:129(setitem_datetimelike_compat)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/data.py:186(_get_crumb_basic)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/version/__init__.py:348()\n", - " 2 0.000 0.000 0.000 0.000 :1283(_find_parent_path_names)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:665(_get_registered_option)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_utils.py:85(is_model_class)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:369()\n", - " 8 0.000 0.000 0.000 0.000 {method 'split' of 'bytes' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:207(validate_header_arg)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/sorting.py:238(is_int64_overflow_possible)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:140(__init__)\n", - " 10 0.000 0.000 0.000 0.000 {built-in method sys.getrecursionlimit}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/common.py:91(ensure_python_int)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/request.py:134(set_file_position)\n", - " 30 0.000 0.000 0.000 0.000 {method 'isprintable' of 'str' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:311(is_null_slice)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:91(merge_hooks)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2053(get_schema_from_definitions)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:142(flush)\n", - " 7 0.000 0.000 0.000 0.000 {built-in method _weakref.proxy}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:205(filter_field_decorator_info_by_field)\n", - " 1 0.000 0.000 0.000 0.000 :60(isabs)\n", - " 18 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ssl.py:1145(_checkClosed)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1319(disable)\n", - " 3 0.000 0.000 0.000 0.000 {method 'index' of 'tuple' objects}\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:1809(__init__)\n", - " 20 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:619(categories)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:279(_extract_multi_indexer_columns)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/concat.py:73()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:751()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2772()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/ssl_.py:184(resolve_cert_reqs)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:949()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:532(_still_open_and_dbapi_connection_is_valid)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:914()\n", - " 6 0.000 0.000 0.000 0.000 {method 'update' of 'collections.OrderedDict' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:1329(result_index)\n", - " 16 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:669(result_type)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1844()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:174(not_none)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:966(_selected_obj)\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:1131(putmask)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/api.py:351()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/exc.py:48(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/inference.py:141(is_re)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:693(_get_result_dim)\n", - " 1 0.000 0.000 0.000 0.000 {method '_set_alpn_protocols' of '_ssl._SSLContext' objects}\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/timeout.py:227(connect_timeout)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:515(get_compression_method)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1793()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/multi.py:4039()\n", - " 6 0.000 0.000 0.000 0.000 {method 'extend' of 'collections.deque' objects}\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:511(f)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:186(_from_factorized)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:999(is_in_obj)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:368(getMessage)\n", - " 4 0.000 0.000 0.000 0.000 {method 'issuperset' of 'frozenset' objects}\n", - " 7 0.000 0.000 0.000 0.000 {method 'index' of 'list' objects}\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:117(info)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method sys.exc_info}\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:948()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/threading.py:1152(name)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:535(temp_setattr)\n", - " 13 0.000 0.000 0.000 0.000 {method 'st_server_status' of '_mysql_connector.MySQL' objects}\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:1320(_diff_dispatcher)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/connection.py:103(allowed_gai_family)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:364(_get_monthly_rule)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:703(datetime_schema)\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:1474()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/data.py:28()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:223(__len__)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:110(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/model/obbject.py:208()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6685(_validate_indexer)\n", - " 25 0.000 0.000 0.000 0.000 {method 'isascii' of 'str' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:696(names)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:388()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5486()\n", - " 1 0.000 0.000 0.000 0.000 {built-in method builtins.round}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:657()\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/asyncio/base_events.py:687(is_closed)\n", - " 6 0.000 0.000 0.000 0.000 {method 'truncate' of '_io.StringIO' objects}\n", - " 11 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:592(groupings)\n", - " 2 0.000 0.000 0.000 0.000 :2(__eq__)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1180()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/scrapers/fundamentals.py:44(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/numpy_.py:146(dtype)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/mysqlconnector.py:53(_escape_identifier)\n", - " 14 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/datetimes.py:709(inferred_type)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:6061(_should_fallback_to_positional)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generics.py:213(get_origin)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1141(return_ok_expires)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/socket.py:521(type)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:250(__init__)\n", - " 11 0.000 0.000 0.000 0.000 {method 'startswith' of 'bytes' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:421(lexsort)\n", - " 19 0.000 0.000 0.000 0.000 {method 'islower' of 'str' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:227(_deepcopy_dict)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1851()\n", - " 7 0.000 0.000 0.000 0.000 {method 'count' of 'list' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/scrapers/quote.py:582()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:330()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/typing_extensions.py:530(_caller)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:899()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:1963()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1487(__getattr__)\n", - " 8 0.000 0.000 0.000 0.000 {built-in method builtins.vars}\n", - " 11 0.000 0.000 0.000 0.000 {method '__exit__' of 'memoryview' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/parser.py:17(__init__)\n", - " 1 0.000 0.000 0.000 0.000 {method 'throw' of 'generator' objects}\n", - " 12 0.000 0.000 0.000 0.000 {method 'seek' of '_io.StringIO' objects}\n", - " 12 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/dtypes.py:632(ordered)\n", - " 4 0.000 0.000 0.000 0.000 :381(__subclasshook__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/_config/config.py:886(inner)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:12199()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/scrapers/quote.py:620()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/_collections.py:147(__new__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/queue.py:225(_full)\n", - " 1 0.000 0.000 0.000 0.000 {method 'replace' of 'datetime.datetime' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_fields.py:332(is_valid_privateattr_name)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:1080(_is_label_like)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:539(_push_exit_callback)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_fields.py:64(_update_fields_from_docstrings)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/openbb_core/app/static/container.py:59(_get_provider)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/data.py:29()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/nanops.py:336(_na_ok_dtype)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/tseries/frequencies.py:205(is_unique)\n", - " 6 0.000 0.000 0.000 0.000 {method 'warning_count' of '_mysql_connector.MySQL' objects}\n", - " 13 0.000 0.000 0.000 0.000 {method 'st_warning_count' of '_mysql_connector.MySQL' objects}\n", - " 7 0.000 0.000 0.000 0.000 {method 'connected' of '_mysql_connector.MySQL' objects}\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/utils.py:82(__init__)\n", - " 19 0.000 0.000 0.000 0.000 {method 'isupper' of 'str' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/datetimelike.py:1047(_get_i8_values_and_mask)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method builtins.eval}\n", - " 5 0.000 0.000 0.000 0.000 :283(__subclasshook__)\n", - " 12 0.000 0.000 0.000 0.000 {method 'items' of 'collections.OrderedDict' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:383(__from_parent)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:578(__init__)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2781()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connectionpool.py:339(_validate_conn)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:168()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1239(_apply_field_title_generator_to_field_info)\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_validate_call.py:51()\n", - " 9 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:419(_repeat_dispatcher)\n", - " 4 0.000 0.000 0.000 0.000 {method 'capitalize' of 'str' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:893(_check_data_length)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/mysqlconnector.py:145(is_disconnect)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:346(where)\n", - " 1 0.000 0.000 0.000 0.000 {method 'register' of 'select.poll' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:90(unverifiable)\n", - " 5 0.000 0.000 0.000 0.000 {built-in method posix.getpid}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/numeric.py:2245(_isclose_dispatcher)\n", - " 5 0.000 0.000 0.000 0.000 {built-in method sys.audit}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:155(_check_executed)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:891(default_user_agent)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:252(_init_connection)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_signature.py:16(_field_name_for_signature)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:1665()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:567(connection)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:717(index)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:925(__hash__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:2139(_codes)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/base.py:346(__init__)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:805(_maybe_copy)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/resample.py:217(_from_selection)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/multiprocessing/process.py:189(name)\n", - " 9 0.000 0.000 0.000 0.000 :413(has_location)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/ipykernel/iostream.py:138(_event_pipe)\n", - " 6 0.000 0.000 0.000 0.000 {method 'more_results' of '_mysql_connector.MySQL' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/multiprocessing/process.py:37(current_process)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:764(__init__)\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/base.py:317(is_consolidated)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:295(is_closed)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2586(push)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:1110(get_warnings)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:3172(_ndim_dispatcher)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:5495()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:941()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/compat/_optional.py:74(get_version)\n", - " 9 0.000 0.000 0.000 0.000 :931(create_module)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/client.py:895(_get_hostport)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/EventDriven/riskmanager/utils.py:101(is_holiday)\n", - " 9 0.000 0.000 0.000 0.000 :1122(get_filename)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:1015(addgroup)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:148(start_date)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:572(prepare_content_length)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/_validators.py:450(check_dtype_backend)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:2056(_clean_na_values)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/email/feedparser.py:124(__iter__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:981()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:1117(_maybe_memory_map)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1307()\n", - " 6 0.000 0.000 0.000 0.000 {method 'pop' of 'set' objects}\n", - " 10 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/generic.py:1847()\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:3211(_validate_sort_keyword)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_typing_extra.py:142(_check_classvar)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:2240()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:212()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:93()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2363(apply_model_validators)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_metadata.py:84()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1114(return_ok_version)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/data.py:31()\n", - " 2 0.000 0.000 0.000 0.000 {method 'rsplit' of 'str' objects}\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2687(_max_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 :362(__subclasshook__)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method _codecs.lookup}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:392(ensure_dtype_objs)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:1065(set_login)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/categorical.py:494(dtype)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:801(addFilter)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:2688(_deactivate_from_connection)\n", - " 8 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/missing.py:886()\n", - " 3 0.000 0.000 0.000 0.000 {built-in method time.monotonic}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1225(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/pooling.py:308()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py:195(__set_y)\n", - " 6 0.000 0.000 0.000 0.000 {method 'isalnum' of 'str' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:553(nblocks)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:992(_validate_key_length)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:2365(_validate_skipfooter)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1143(__init__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/cd.py:56()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:178(check_decorator_fields_exist)\n", - " 3 0.000 0.000 0.000 0.000 {method 'write' of '_io.TextIOWrapper' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:722(_result_index)\n", - " 6 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/version/__init__.py:470(_parse_letter_version)\n", - " 1 0.000 0.000 0.000 0.000 {method 'flush' of 'zlib.Decompress' objects}\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:1070(hard_close)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:440(__init__)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method posix._path_normpath}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:309(proxy_is_forwarding)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/base.py:2902(_is_mysql)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:309(_operation_context)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:255(_has_complex_date_col)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/multiarray.py:85(empty_like)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:472(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/response.py:1111(supports_chunked_reads)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/version/__init__.py:149(__lt__)\n", - " 5 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1763(pre_exec)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/cursor_cext.py:504(description)\n", - " 7 0.000 0.000 0.000 0.000 {method 'locked' of '_thread.lock' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:202(_selected_obj)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:985(__repr__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/queue.py:222(_empty)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:229(__iter__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/dtypes/cast.py:525(ensure_dtype_can_hold_na)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:211()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2096(_clip_dispatcher)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:941(is_not_allowed)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:926(is_blocked)\n", - " 2 0.000 0.000 0.000 0.000 {method 'cast' of 'memoryview' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/reflection.py:92()\n", - " 7 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:2486(reset)\n", - " 6 0.000 0.000 0.000 0.000 {built-in method builtins.chr}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/construction.py:585(_ensure_2d)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/urllib/parse.py:421(_checknetloc)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:1447(is_index_col)\n", - " 1 0.000 0.000 0.000 0.000 {method 'swapaxes' of 'numpy.ndarray' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:131(close)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/groupby/ops.py:698()\n", - " 2 0.000 0.000 0.000 0.000 {method 'clear' of 'collections.OrderedDict' objects}\n", - " 3 0.000 0.000 0.000 0.000 {method 'date' of 'datetime.datetime' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/apply.py:856(columns)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method sys.getfilesystemencoding}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_decorators.py:449()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:100(checkgroup)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:2267(_extract_dialect)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/data.py:30()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:810(is_expired)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/response.py:91(is_response_to_head)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:326()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/queue.py:245(_init)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2256(_apply_model_serializers)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:947(_is_typevar_like)\n", - " 3 0.000 0.000 0.000 0.000 {method 'gettimeout' of '_socket.socket' objects}\n", - " 2 0.000 0.000 0.000 0.000 {built-in method _socket.getdefaulttimeout}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:546(invalidated)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:426(loaded_dbapi)\n", - " 2 0.000 0.000 0.000 0.000 {method 'consume_result' of '_mysql_connector.MySQL' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py:213()\n", - " 1 0.000 0.000 0.000 0.000 {built-in method select.poll}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/connection.py:183(host)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:84(add_unredirected_header)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/typing.py:1049()\n", - " 1 0.000 0.000 0.000 0.000 {method 'flush' of '_io.BufferedReader' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_decorators.py:444()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/response.py:79()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:3104(_cumprod_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/base.py:159(_freeze)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/managers.py:1989(index)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/constants.py:978(__init__)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:655(_constructor)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1147(return_ok_port)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_decorators.py:445()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/internals/blocks.py:2577(is_view)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2552(resolve_original_schema)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:462(_create_exit_wrapper)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:446(__exit__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_model_construction.py:264(__prepare__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:188(_expand_user)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/series.py:4948(_needs_reindex_multi)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/shape_base.py:1257()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_fields.py:328(is_valid_field_name)\n", - " 1 0.000 0.000 0.000 0.000 {method 'get_proto_info' of '_mysql_connector.MySQL' objects}\n", - " 3 0.000 0.000 0.000 0.000 {method 'weekday' of 'datetime.date' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/six.py:194(find_spec)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/common.py:292(is_fsspec_url)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_decorators.py:447()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:202(_checkLevel)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:105(_box_func)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/models.py:216()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/cd.py:305()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_core_utils.py:469(can_be_inlined)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_schema_generation_shared.py:103(resolve_ref_schema)\n", - " 1 0.000 0.000 0.000 0.000 {method 'insert_id' of '_mysql_connector.MySQL' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_decorators.py:446()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/result.py:221()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1038(in_transaction)\n", - " 1 0.000 0.000 0.000 0.000 {method 'get_ssl_cipher' of '_mysql_connector.MySQL' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1979(nlevels)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:1877(_nonzero_dispatcher)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:87(get_new_headers)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/urllib3/util/proxy.py:11(connection_requires_http_tunnel)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/cursor.py:1065(soft_close)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/pool/base.py:1445(is_valid)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:439(_ensure_has_table_connection)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:581(iter_slices)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexing.py:2752(need_slice)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/helpers/utils.py:10(verify_ticker)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/version/__init__.py:534()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_decorators.py:450()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/inspect.py:3019(return_annotation)\n", - " 1 0.000 0.000 0.000 0.000 {method '__init_subclass__' of 'object' objects}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/sql/type_api.py:433(result_processor)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:540(closed)\n", - " 1 0.000 0.000 0.000 0.000 {method 'difference' of 'set' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:94(_process_parse_dates_argument)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2494(_common_field)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/logging/__init__.py:795(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/http/cookiejar.py:1135(return_ok_secure)\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_decorators.py:448()\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/base.py:1986(_sort_levels_monotonic)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:999(isset_client_flag)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:208()\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/function_base.py:5168(_delete_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1343()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:296(best)\n", - " 3 0.000 0.000 0.000 0.000 {function HTTPResponse.flush at 0x1121f91c0}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:235()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_utils.py:290(__init__)\n", - " 1 0.000 0.000 0.000 0.000 :260(__init__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/utils.py:743(set_environ)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/reshape/concat.py:770(_maybe_check_integrity)\n", - " 1 0.000 0.000 0.000 0.000 {method 'append' of 'bytearray' objects}\n", - " 1 0.000 0.000 0.000 0.000 {method 'extend' of 'bytearray' objects}\n", - " 2 0.000 0.000 0.000 0.000 {method 'get' of '_contextvars.ContextVar' objects}\n", - " 1 0.000 0.000 0.000 0.000 {built-in method _codecs.lookup_error}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/common.py:192()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:986(_validate_usecols_arg)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:93(encoding)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:206()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:172(raw)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method builtins.divmod}\n", - " 4 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1771(post_exec)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/frame.py:11522()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_fields.py:155()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/platform.py:830(uname)\n", - " 3 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/adapters.py:578(add_headers)\n", - " 1 0.000 0.000 0.000 0.000 :1()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/indexes/range.py:216(_validate_dtype)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:527(validate_integer)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:559(_validate_names)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/connection_cext.py:359(close)\n", - " 1 0.000 0.000 0.000 0.000 {method 'get_server_info' of '_mysql_connector.MySQL' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2463(get_json_schema_update_func)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/json_schema.py:224()\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/yfinance/data.py:420(_get_proxy)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/util/langhelpers.py:1412()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/dateutil/tz/tz.py:74(utcoffset)\n", - " 1 0.000 0.000 0.000 0.000 {method 'affected_rows' of '_mysql_connector.MySQL' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/copy.py:107(_copy_immutable)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ipaddress.py:574(__int__)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/cookies.py:69(is_unverifiable)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/ssl.py:1149(_check_connected)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/fields.py:543(deprecation_message)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/sql/elements.py:5219(construct)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/abstracts.py:1243(_charset_id)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/collections/__init__.py:660(update)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method builtins.globals}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2200(_apply_field_serializers)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/optionfiles.py:49(read_option_files)\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/contextlib.py:443(__enter__)\n", - " 1 0.000 0.000 0.000 0.000 {method 'expandtabs' of 'str' objects}\n", - " 1 0.000 0.000 0.000 0.000 {method 'with_traceback' of 'BaseException' objects}\n", - " 1 0.000 0.000 0.000 0.000 {method 'pop' of 'collections.deque' objects}\n", - " 2 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/util/version/__init__.py:508(_parse_local_version)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/charset_normalizer/models.py:154(chaos)\n", - " 1 0.000 0.000 0.000 0.000 {method 'st_field_count' of '_mysql_connector.MySQL' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2347(_validators_require_validate_default)\n", - " 1 0.000 0.000 0.000 0.000 {method 'st_server_capabilities' of '_mysql_connector.MySQL' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:557(_check_max_identifier_length)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_model_construction.py:235()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/core/arrays/_mixins.py:191(_values_for_argsort)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/importlib_metadata/_compat.py:48(find_spec)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py:247()\n", - " 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/re/_parser.py:103(checklookbehindgroup)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/base.py:2873(_warn_for_known_db_issues)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2508(_cumsum_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/mysqlconnector.py:142(_extract_error_code)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/mysql/connector/errors.py:80(__str__)\n", - " 1 0.000 0.000 0.000 0.000 {method 'reverse' of 'list' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:211(apply_each_item_validators)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/_distutils_hack/__init__.py:109()\n", - " 1 0.000 0.000 0.000 0.000 {method 'update' of 'set' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_model_construction.py:704(build_lenient_weakvaluedict)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/numpy/lib/shape_base.py:1181(_tile_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 {function socket.detach at 0x11039a160}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/sql.py:1448(__enter__)\n", - " 1 0.000 0.000 0.000 0.000 {method 'fileno' of '_socket.socket' objects}\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/requests/sessions.py:451(__enter__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1987(__enter__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1320()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:2322(apply_validators)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/event/attr.py:549(for_modify)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py:1321()\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/collections/__init__.py:601(__missing__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/sql/visitors.py:147(__class_getitem__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:1803(handle_dbapi_exception)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/pydantic/main.py:699(__pydantic_init_subclass__)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/default.py:695(do_begin)\n", - " 1 0.000 0.000 0.000 0.000 /Users/chiemelienwanisobi/miniconda3/envs/openbb/lib/python3.11/site-packages/sqlalchemy/engine/base.py:231(__enter__)\n", - "\n", - "\n", - "\n" - ] - } - ], - "source": [ - "print(stats)" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "start = '2023-06-02'\n", - "end = pd.to_datetime(start) + relativedelta(years=+1)\n", - "# populate_cache(order_candidates=candidates,\n", - "# start_date=start,\n", - "# end_date=end,\n", - "# target_date='2024-03-13',)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Populate Cache Improvements" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Base Test" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [], - "source": [ - "candidates\n", - "\n", - "##Test 1: Using runThreads as before\n", - "\n", - "@cProfiler\n", - "def runThreads_method():\n", - " full_data = pd.DataFrame()\n", - " for direction in candidates:\n", - " for data in candidates[direction]:\n", - "\n", - "\n", - " full_data = pd.concat([full_data, data], axis=0)\n", - "\n", - " full_data.index.name = 'Date'\n", - " full_data.columns.name = ''\n", - " full_data['start_date'] = start\n", - " full_data['end_date'] = end\n", - " full_data.reset_index( inplace=True)\n", - " OrderedList = full_data[['ticker', 'end_date', 'Expiration', 'Right', 'start_date', 'Strike', ]].T.to_numpy()\n", - " tickOrderedList = full_data[['ticker', 'Right', 'Expiration', 'Strike', ]].T.to_numpy()\n", - " eod_results = (runThreads(retrieve_eod_ohlc, OrderedList, 'map', block=False))\n", - " oi_results = (runThreads(_retrieve_openInterest, OrderedList, 'map' , block=False))\n", - " tick_results = (runThreads(generate_option_tick_new, tickOrderedList, 'map' , block=False))\n", - "\n", - " eod_results = list(eod_results)\n", - " oi_results = list(oi_results)\n", - " tick_results = list(tick_results)\n", - "\n", - " return eod_results, oi_results, tick_results\n", - "\n", - "# pack, stats = runThreads_method()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Improvement. Hybrid of runThreads method & Querying database" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "def assemble_bulk_data_request(self, start: str | datetime, \n", - " end: str | datetime,\n", - " interval: str = '1d',\n", - " type_: str = 'spot',\n", - " strikes_right: List[Tuple] = [],\n", - " model: str = 'bs',\n", - " extra_cols: list = []) :\n", - " start = pd.to_datetime(start)\n", - " end = pd.to_datetime(end)\n", - " ivl_str, ivl_int = extract_numeric_value(interval)\n", - " greek_names = self.greek_names\n", - " _extra_cols = handle_extra_cols(extra_cols, type_, model)\n", - " greek_cols = build_name_format('greek', model, extra_cols, self.default_fill)\n", - " vol_cols = build_name_format('vol', model, extra_cols, self.default_fill)\n", - "\n", - "\n", - " ## Enforce the interval\n", - " enforce_interval(ivl_str)\n", - "\n", - " ## Assert inputs\n", - " enforce_inputs(type_, model)\n", - "\n", - " ## Determine aggregation\n", - " agg, database, table = determine_table_agg(ivl_str, type_, greek_names)\n", - " input_params = getattr(self, agg)\n", - "\n", - " ## Determine the requested columns\n", - " requested_col = determine_requested_columns(self.default_fill, type_, model, greek_names)\n", - "\n", - " data_request = BulkOptionQueryRequestParameter(table_name=table,\n", - " db_name=database, \n", - " start_date=start, \n", - " end_date=end, \n", - " ticker=self.symbol, \n", - " exp=self.exp, \n", - " strikes=strikes_right)\n", - "\n", - " ## Set the parameters for the request to avoid having too many attributes\n", - " data_request.symbol = self.symbol\n", - " data_request.interval= interval\n", - " data_request.type_ = type_\n", - " data_request.input_params = input_params\n", - " data_request.model = model\n", - " data_request.ivl_str = ivl_str\n", - " data_request.ivl_int = ivl_int\n", - " data_request.default_fill = self.default_fill\n", - " data_request.agg = agg\n", - " data_request.requested_col = requested_col + _extra_cols + ['optiontick']\n", - " data_request.iv_cols = vol_cols\n", - " data_request.greek_cols = greek_cols\n", - " data_request.col_kwargs = col_kwargs = {'underlier_price': 's0', \n", - " 'expiration': 'exp_date', \n", - " 'strike': 'k', \n", - " 'right': 'right', \n", - " 'rf_rate': 'r', \n", - " 'dividend': 'y',\n", - " 'put/call': 'right',\n", - " 'datetime': 'datetime',}\n", - " return data_request" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "def check_all_days_available(x, _start, _end):\n", - " # print(x)\n", - " date_range = bus_range(_start, _end, freq = '1B')\n", - " dates_available = x.Datetime\n", - " missing_dates_second_check = [x for x in date_range if x not in pd.DatetimeIndex(dates_available)]\n", - " return all(x in pd.DatetimeIndex(dates_available) for x in date_range)\n", - "\n", - "def check_missing_dates(x, _start, _end):\n", - " # print(x)\n", - " date_range = bus_range(_start, _end, freq = '1B')\n", - " dates_available = x.Datetime\n", - " missing_dates_second_check = [x for x in date_range if x not in pd.DatetimeIndex(dates_available)]\n", - " return missing_dates_second_check\n", - "\n", - "def update_caches(x):\n", - " global oi_cache, close_cache, oi_cache, spot_cache\n", - " key = f\"{x.Optiontick.unique()[0]}\"\n", - " x = x.set_index('Datetime')\n", - " close_cache[key] = x\n", - " oi_cache[key] = x['Openinterest'].to_frame(name = 'Open_interest')\n", - " pass\n", - "\n", - "\n", - "\n", - "\n", - "def update_cache_with_missing_ticks(parsed_opts: pd.DataFrame, ) -> None:\n", - " \"\"\"\n", - " Updates the cache with missing ticks by retrieving EOD data and open interest data.\n", - "\n", - " Args:\n", - " parsed_opts (pd.DataFrame): DataFrame containing parsed option ticks with start and end dates and key meta data.\n", - "\n", - " Returns:\n", - " None\n", - " \"\"\"\n", - " global oi_cache, close_cache, oi_cache, spot_cache\n", - " OrderedList = parsed_opts[['ticker', 'end_date', 'exp_date', 'put_call', 'start_date', 'strike', ]].T.to_numpy()\n", - " tickOrderedList = parsed_opts[['ticker', 'put_call', 'exp_date', 'strike', ]].T.to_numpy()\n", - " eod_results = (runThreads(retrieve_eod_ohlc, OrderedList, 'map', block=True))\n", - " oi_results = (runThreads(_retrieve_openInterest, OrderedList, 'map' , block=True))\n", - " tick_results = (runThreads(generate_option_tick_new, tickOrderedList, 'map' , block=True))\n", - "\n", - " eod_results = list(eod_results)\n", - " oi_results = list(oi_results)\n", - " tick_results = list(tick_results)\n", - "\n", - " for oi, eod, tick in zip(oi_results, eod_results, tick_results):\n", - " cache_key = f\"{tick}\"\n", - " eod.index = default_timestamp(eod.index)\n", - " eod['Optiontick'] = tick\n", - " close_cache[cache_key] = eod\n", - "\n", - " ## OI Formatting for consistency\n", - " oi.set_index('Datetime', inplace=True)\n", - " oi.index = default_timestamp(oi.index)\n", - " oi_cache[cache_key] = oi\n", - "\n", - " return\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "def return_closePrice(id: str, \n", - " date: str) -> float:\n", - " \"\"\"\n", - " returns the close price of the option contract\n", - " id: str: id of the option contract, corresponding to cache keys.\n", - " ps: Use spot_cache.keys() to get the keys\n", - " date: str: date to get the close price for\n", - "\n", - " returns:\n", - " float: close price of the option contract\n", - " \n", - " \"\"\"\n", - " global close_cache, spot_cache, oi_cache\n", - " cache_key = f\"{id}\" ## Close Uses only the id, not the date\n", - " close_data = close_cache[cache_key]\n", - " if close_data is None:\n", - " return None\n", - " close_data = close_data[~close_data.index.duplicated(keep = 'first')]\n", - " if date not in close_data.index:\n", - " ## If the date is not in the close data, we remove that key from the cache\n", - " ## There's no way to resolve this, so we remove the key from the cache\n", - " try:\n", - " close_cache.pop(cache_key)\n", - " oi_cache.pop(cache_key)\n", - " except KeyError:\n", - " pass\n", - " return None\n", - " close = close_data['Midpoint'][date]\n", - " return close\n" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "def organize_data_for_query(missing_list: list,\n", - " incomplete_dict: dict,\n", - " data_request: 'DataManagers.Request') -> pd.DataFrame:\n", - " \"\"\"\n", - " Organizes the data for the query by parsing the option ticks and adding start and end dates.\n", - " \n", - " Args:\n", - " missing_list (list): List of missing option ticks. These are ticks that are not in the database at all.\n", - " incomplete_dict (dict): Dictionary of incomplete option ticks. These are ticks that are in the database but not complete.\n", - " data_request (BulkOptionQueryRequestParameter): The data request object containing start and end dates.\n", - " \n", - " Returns:\n", - " pd.DataFrame: A DataFrame containing the parsed option ticks with start and end dates.\n", - " \"\"\"\n", - " parsed_opts = pd.DataFrame()\n", - " ## First populate with the ticks completely missing.\n", - " parsed_opts = pd.DataFrame([parse_option_tick(x) for x in missing_list])\n", - " parsed_opts[['start_date', 'end_date']] = data_request.start_date, data_request.end_date\n", - "\n", - " ## Next populate with the ticks that are incomplete\n", - " for opt, _list in incomplete_dict.items():\n", - " if len(_list) == 0:\n", - " continue\n", - " opt_meta = parse_option_tick(opt)\n", - " opt_meta['start_date'] = min(_list)\n", - " opt_meta['end_date'] = data_request.end_date\n", - " parsed_opts = pd.concat([parsed_opts, pd.DataFrame(opt_meta, index = [0])], axis=0)\n", - " return parsed_opts\n", - "\n", - "def drop_cache_duplicates():\n", - " \"\"\"\n", - " Drops duplicates from the cache.\n", - " \"\"\"\n", - " global close_cache, oi_cache\n", - " for key in close_cache.keys():\n", - " close_cache[key] = close_cache[key][~close_cache[key].index.duplicated(keep = 'first')]\n", - " for key in oi_cache.keys():\n", - " oi_cache[key] = oi_cache[key][~oi_cache[key].index.duplicated(keep = 'first')]\n", - "\n", - " return\n", - "\n", - "def merge_incomplete_data_in_cache(\n", - " incomplete_dict: dict,\n", - " pre_processed_data: pd.DataFrame,\n", - "):\n", - " global close_cache, oi_cache, spot_cache\n", - " ## Now we have updated cache, since incomplete date updates cache with the missing dates, we have to add the data we already have\n", - " for tick, _list in incomplete_dict.items():\n", - " if len(_list) == 0:\n", - " continue\n", - " tick_data = pre_processed_data[pre_processed_data.Optiontick == tick]\n", - " tick_data = tick_data.set_index('Datetime')\n", - " close_cache[tick] = pd.concat([close_cache[tick], tick_data], axis=0).sort_index()\n", - " oi_data = tick_data['Openinterest'].to_frame(name = 'Open_interest')\n", - " oi_cache[tick] = pd.concat([oi_cache[tick], oi_data]).sort_index()\n", - "\n", - "def update_spot_cache(opttick: list, target_date: str|datetime) -> None:\n", - " \"\"\"\n", - " Updates the spot cache with the close price for the given option tick and target date.\n", - " Args:\n", - " opttick (list): List of option ticks.\n", - " target_date (str|datetime): Target date to get the close price for.\n", - " Returns:\n", - " None\n", - " \"\"\"\n", - " global spot_cache\n", - " spot_results = runThreads(return_closePrice, [opttick, [target_date]*len(opttick)], 'map')\n", - " for tick, spot in zip(opttick, spot_results):\n", - " cache_key = f\"{tick}_{target_date}\"\n", - " if spot is None:\n", - " continue ## If spot is None, we don't update the cache\n", - " spot_cache[cache_key] = spot" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "def populate_cache_v2(\n", - " start,\n", - " end,\n", - " candidates,\n", - " target_date,\n", - "):\n", - " \"\"\"\n", - " populates the cache with the necessary data for the order candidates\n", - " This version will improve on the previous one by using the new BulkOptionDataManager\n", - " The goal is to make use of our database to speed up queries where possible\n", - "\n", - " params:\n", - " candidates: dict: dictionary containing the order candidates\n", - " example: {'type': 'naked',\n", - " 'specifics': [{'direction': 'long',\n", - " 'rel_strike': .900,\n", - " 'dte': 365,\n", - " 'moneyness_width': 0.15},\n", - " {'direction': 'short',\n", - " 'rel_strike': .80,\n", - " 'dte': 365,\n", - " 'moneyness_width': 0.15}],\n", - "\n", - " 'name': 'vertical_spread'}\n", - " start: str: date to populate the cache for\n", - " end: str: date to populate the cache for\n", - " target_date: str: date to populate the cache for\n", - "\n", - " returns:\n", - " str|None: returns 'holiday' if the date is a holiday, 'theta_data_error' if there is an error in the theta data, None otherwise\n", - " \"\"\"\n", - " \n", - " print(f\"Looks like our young fellow is targetting: {target_date}\")\n", - " global oi_cache, close_cache, oi_cache, spot_cache\n", - " start, end = pd.to_datetime(start), pd.to_datetime(end)\n", - " full_data = pd.DataFrame()\n", - " for direction in candidates:\n", - " for data in candidates[direction]:\n", - " if isinstance(data, str) and data =='theta_data_error':\n", - " return 'theta_data_error'\n", - " if pd.to_datetime(target_date).weekday() >= 5:\n", - " return 'weekend'\n", - " full_data = pd.concat([full_data, data], axis=0)\n", - "\n", - " full_data.index.name = 'Date'\n", - " full_data.columns.name = ''\n", - " full_data['start_date'] = start\n", - " full_data['end_date'] = end\n", - " full_data.reset_index(inplace=True)\n", - " tick = full_data.ticker.unique()[0]\n", - " print(tick)\n", - " exp = full_data.Expiration.unique()[0]\n", - " strikes_right = list(full_data[['Strike', 'Right']].itertuples(name=None, index=False))\n", - "\n", - " ## Let's start with getting the requested data from database\n", - " # manager = BulkOptionDataManager(symbol='AAPL', exp='2025-09-19')\n", - " manager = BulkOptionDataManager(symbol=tick, exp=exp)\n", - " print(f\"Generating Data for {manager.symbol} {manager.exp}\")\n", - " data_request = assemble_bulk_data_request(\n", - " self = manager,\n", - " start = start,\n", - " end = end,\n", - " type_ = 'spot',\n", - " strikes_right = strikes_right,\n", - " # strikes_right= [(225.0, 'C'), (280.0, 'P'), (250.0, 'C'), (290.0, 'P'), (270.0, 'C'), (270.0, 'P')],\n", - "\n", - " )\n", - " # ## Second: we query our database to see what data we have\n", - " init_query(data_request = data_request, query_category = 'bulk')\n", - "\n", - " # ## Third: we pre_process the data request to see if it is complete\n", - " BulkOptionDataManager.pre_process_data(data_request = data_request) \n", - " BulkOptionDataManager.one_off_save(\n", - " start=start,\n", - " end=end,\n", - " tick=tick,\n", - " exp=exp\n", - " ) ## We shouldn't keep going to thetadata, that takes time. Submit a process. Don't worry it runs on a new process.\n", - " ## Wouldn't affect current procedures\n", - "\n", - "\n", - " is_complete = data_request.pre_process['is_complete']\n", - " pre_processed_data = data_request.pre_processed_data.reset_index()\n", - " opttick = data_request.opttick\n", - " return data_request\n", - " print(f\"Data Is_complete bool: {is_complete}\")\n", - "\n", - " ## If complete, Fantastic! We re done, now update cache and get out\n", - " if is_complete:\n", - " pre_processed_data.groupby('Optiontick').apply(update_caches)\n", - "\n", - " ## If NOT complete, do not fret. We'll simply run our process for incomplete/missing ticks\n", - " else:\n", - " ## We first check for the requested ticks. Which one is not in database at all?\n", - " missing_opttick = [x for x in data_request.opttick if x not in pre_processed_data.Optiontick.unique()]\n", - " \n", - " ## Next we check to see if the requested opttick data is COMPELETE. \n", - " ## If incomplete, we perform runthreads\n", - " check_partial = partial(check_all_days_available, _start = data_request.start_date, _end = data_request.end_date)\n", - " opttick_complete = pre_processed_data.groupby('Optiontick').apply(check_partial)\n", - " incomplete_ticks = opttick_complete[opttick_complete==False].index.tolist()\n", - " incomplete_dict = pre_processed_data.groupby('Optiontick').apply(check_missing_dates, _start = data_request.start_date, _end = data_request.end_date)\n", - " if incomplete_dict.empty:\n", - " incomplete_dict = {}\n", - " else:\n", - " incomplete_dict = incomplete_dict.to_dict()\n", - " ## Before we perform run Threads, it is important we update cache with the Optticks that are COMPLETE\n", - " available = opttick_complete[opttick_complete==True].index\n", - " pre_processed_data[pre_processed_data.Optiontick.isin(available)].groupby('Optiontick').apply(update_caches)\n", - "\n", - " ## Produce the dataframe that stores names to update the cache\n", - " to_update_cache_data = organize_data_for_query(\n", - " missing_list=missing_opttick,\n", - " incomplete_dict=incomplete_dict,\n", - " data_request=data_request\n", - " )\n", - "\n", - "\n", - "\n", - " # Now my dear friends, we update cache of unavailable ticks\n", - " pack = update_cache_with_missing_ticks(parsed_opts = to_update_cache_data)\n", - "\n", - " ## Merge the data we have in cache with the data we just retrieved for the incomplete ticks\n", - " merge_incomplete_data_in_cache(incomplete_dict = incomplete_dict, pre_processed_data = pre_processed_data)\n", - " drop_cache_duplicates()\n", - " print(\"I'm proud of you, we are finally done\")\n", - "\n", - " print(\"Actually! We are not done yet. We need to get the spot prices for the requested date\")\n", - " \n", - " ## Now we update the spot cache\n", - " update_spot_cache(opttick = opttick, target_date = target_date)\n", - "\n", - " print(\"Now, my dear friend, we are done\")\n", - " return pack\n", - " \n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Looks like our young fellow is targetting: 2023-06-09 00:00:00\n", - "NVDA\n", - "Generating Data for NVDA 2024-03-15 00:00:00\n", - "[SaveManager] Enqueueing save request for NVDA on {'start': Timestamp('2023-06-02 00:00:00'), 'end': Timestamp('2024-06-02 00:00:00'), 'tick': 'NVDA', 'exp': Timestamp('2024-03-15 00:00:00'), 'print_info': False, 'save_func': functools.partial(, print_info=False, pool=False), '_requests': }\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 36, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# start = '2024-12-03'\n", - "# end = '2025-01-05'\n", - "start = '2023-06-02'\n", - "end = pd.to_datetime(start) + relativedelta(years=+1)\n", - "to_update_cache_data_return = populate_cache_v2(\n", - " start=start,\n", - " end=end,\n", - " candidates=candidates,\n", - " target_date=pd.to_datetime(start) + relativedelta(weeks=+1)\n", - ")\n", - "to_update_cache_data_return" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "SELECT *\n", - " FROM securities_master.temp_options_eod_new\n", - " WHERE OPTIONTICK in ('NVDA20240315C395', 'NVDA20240315C400', 'NVDA20240315C405', 'NVDA20240315C410', 'NVDA20240315C415', 'NVDA20240315C420', 'NVDA20240315C425', 'NVDA20240315C430', 'NVDA20240315C435', 'NVDA20240315C440', 'NVDA20240315C445', 'NVDA20240315C450', 'NVDA20240315C455', 'NVDA20240315C460', 'NVDA20240315C465', 'NVDA20240315C470', 'NVDA20240315C475', 'NVDA20240315C480', 'NVDA20240315C485', 'NVDA20240315C490', 'NVDA20240315C495', 'NVDA20240315C500', 'NVDA20240315C505', 'NVDA20240315C510', 'NVDA20240315C515', 'NVDA20240315C520', 'NVDA20240315C525', 'NVDA20240315C530', 'NVDA20240315C535', 'NVDA20240315C540', 'NVDA20240315C545', 'NVDA20240315C550', 'NVDA20240315C555', 'NVDA20240315C560', 'NVDA20240315C525', 'NVDA20240315C530', 'NVDA20240315C535', 'NVDA20240315C540', 'NVDA20240315C545', 'NVDA20240315C550', 'NVDA20240315C555', 'NVDA20240315C560', 'NVDA20240315C565', 'NVDA20240315C570', 'NVDA20240315C575', 'NVDA20240315C580', 'NVDA20240315C590', 'NVDA20240315C600', 'NVDA20240315C610', 'NVDA20240315C620', 'NVDA20240315C630', 'NVDA20240315C640', 'NVDA20240315C650', 'NVDA20240315C660', 'NVDA20240315C670', 'NVDA20240315C680', 'NVDA20240315C690', 'NVDA20240315C700', 'NVDA20240315C710', 'NVDA20240315C720', 'NVDA20240315C730', 'NVDA20240315C740', 'NVDA20240315C750', 'NVDA20240315C760', 'NVDA20240315C770', 'NVDA20240315C780', 'NVDA20240315C790', 'NVDA20240315C800', 'NVDA20240315C810', 'NVDA20240315C820', 'NVDA20240315C830') AND\n", - " DATETIME >= '2023-06-02 00:00:00' AND \n", - " DATETIME <= '2024-06-02 00:00:00'\n", - " \n" - ] - } - ], - "source": [ - "print(to_update_cache_data_return.query)" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Optiontick\n", - "AAPL20250919C225 True\n", - "AAPL20250919C250 False\n", - "AAPL20250919C270 True\n", - "AAPL20250919P270 True\n", - "AAPL20250919P290 True\n", - "dtype: bool" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "to_update_cache_data_return.groupby('Optiontick').apply(check_all_days_available, _start = start, _end = end)" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "dict_keys(['NVDA20240315C395', 'NVDA20240315C400', 'NVDA20240315C405', 'NVDA20240315C410', 'NVDA20240315C415', 'NVDA20240315C420', 'NVDA20240315C425', 'NVDA20240315C430', 'NVDA20240315C435', 'NVDA20240315C440', 'NVDA20240315C445', 'NVDA20240315C450', 'NVDA20240315C455', 'NVDA20240315C460', 'NVDA20240315C465', 'NVDA20240315C470', 'NVDA20240315C475', 'NVDA20240315C480', 'NVDA20240315C485', 'NVDA20240315C490', 'NVDA20240315C495', 'NVDA20240315C500', 'NVDA20240315C505', 'NVDA20240315C510', 'NVDA20240315C515', 'NVDA20240315C520', 'NVDA20240315C525', 'NVDA20240315C530', 'NVDA20240315C535', 'NVDA20240315C540', 'NVDA20240315C545', 'NVDA20240315C550', 'NVDA20240315C555', 'NVDA20240315C560', 'NVDA20240315C565', 'NVDA20240315C570', 'NVDA20240315C575', 'NVDA20240315C580', 'NVDA20240315C590', 'NVDA20240315C600', 'NVDA20240315C610', 'NVDA20240315C620', 'NVDA20240315C630', 'NVDA20240315C640', 'NVDA20240315C650', 'NVDA20240315C660', 'NVDA20240315C670', 'NVDA20240315C680', 'NVDA20240315C690', 'NVDA20240315C700', 'NVDA20240315C710', 'NVDA20240315C720', 'NVDA20240315C730', 'NVDA20240315C740', 'NVDA20240315C750', 'NVDA20240315C760', 'NVDA20240315C770', 'NVDA20240315C780', 'NVDA20240315C790', 'NVDA20240315C800', 'NVDA20240315C810', 'NVDA20240315C820', 'NVDA20240315C830'])" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "get_cache('close').keys()" - ] - }, - { - "cell_type": "code", - "execution_count": 56, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([26.88100052, 27.03700066, 27.57900047, 27.16900063, 26.49500084,\n", - " 26.46299934, 26.75799942, 27.00200081, 27.66699982, 27.93099976,\n", - " 27.10400009, 27.11899948, 27.04199982, 26.24099922, 26.95599937,\n", - " 27.22599983, 27.74900055, 28.90999985, 28.20999908, 27.80200005,\n", - " 27.56200027, 28.68000031, 29.15099907, 28.57099915, 28.88500023,\n", - " 28.57799911, 28.34000015, 28.95299911, 29.21299934, 30.1779995 ,\n", - " 31.6779995 , 31.26399994, 31.1760006 , 30.68799973, 30.53800011,\n", - " 37.47499847, 37.97999954, 38.94599915, 40.11100006, 37.83399963,\n", - " 39.77000046, 39.32699966, 39.17100143, 38.65399933, 38.50999832,\n", - " 38.77000046, 39.48199844, 41.02199936, 42.99700165, 42.65299988,\n", - " 42.69200134, 43.80799866, 43.04499817, 43.02500153, 42.20899963,\n", - " 40.63199997, 41.87599945, 41.11700058, 40.8219986 , 42.30199814,\n", - " 42.4129982 , 42.31700134, 42.10300064, 42.50299835, 42.18000031,\n", - " 42.40499878, 43.90200043, 44.30899811, 44.61199951, 44.26900101,\n", - " 44.51499939, 44.68000031, 44.66400146, 42.55400085, 42.38800049,\n", - " 40.85499954, 43.75299835, 43.93999863, 43.48600006, 43.34400177,\n", - " 43.29899979, 44.86999893, 43.90000153, 43.9659996 , 43.52000046,\n", - " 42.23899841, 41.01699829, 41.61000061, 42.22200012, 41.9109993 ,\n", - " 42.4679985 , 43.0890007 , 43.49900055, 44.7820015 , 43.51699829,\n", - " 44.04100037, 44.68799973, 43.93799973, 42.19599915, 42.10100174,\n", - " 41.38700104, 42.97499847, 43.6629982 , 41.77899933, 40.32600021,\n", - " 40.5 , 41.1609993 , 40.77999878, 42.32500076, 43.50600052,\n", - " 45.97700119, 45.46900177, 46.46099854, 47.49399948, 47.07699966,\n", - " 45.52000046, 45.67900085, 45.45199966, 45.90000153, 46.75 ,\n", - " 46.72900009, 46.50699997, 45.41699982, 46.96699905, 45.66799927,\n", - " 47.11600113, 47.1629982 , 46.01800156, 46.83499908, 48.7840004 ,\n", - " 49.26399994, 49.35499954, 48.50899887, 48.54800034, 47.06100082,\n", - " 46.24100113, 45.5719986 , 45.1780014 , 45.48500061, 45.58100128,\n", - " 45.76200104, 45.27299881, 45.79800034, 46.80599976, 46.94499969,\n", - " 45.46099854, 46.09500122, 45.00500107, 45.75099945, 45.95500183,\n", - " 46.57400131, 46.95000076, 48.33499908, 48.61999893, 49.65599823,\n", - " 48.88800049, 49.47999954, 49.29800034, 50.4090004 , 49.94400024,\n", - " 48.7159996 , 47.77600098, 48.24200058, 47.82099915, 48.13999939,\n", - " 46.77000046, 46.76499939, 45.50999832, 46.56600189, 45.50299835,\n", - " 46.59600067, 47.50600052, 46.6269989 , 47.6570015 , 48.08800125,\n", - " 48.34999847, 48.88999939, 50.07699966, 49.60400009, 48.11100006,\n", - " 48.99000168, 48.83000183, 49.27899933, 49.41699982, 49.52199936,\n", - " 48.16799927, 47.56900024, 47.9980011 , 49.09700012, 52.25299835,\n", - " 53.13999939, 54.34999847, 54.8219986 , 54.70999908, 56.38199997,\n", - " 56.0530014 , 57.10699844, 59.49100113, 59.65399933, 59.8730011 ,\n", - " 61.36199951, 61.61700058, 61.03099823, 62.46500015, 62.77399826,\n", - " 61.52700043, 63.02700043, 66.16000366, 67.47200012, 69.33200073,\n", - " 68.22299957, 70.09899902, 69.64099884, 72.13300323, 72.2480011 ,\n", - " 72.12799835, 73.90000153, 72.65799713, 72.61299896, 69.45200348,\n", - " 78.53800201, 78.81700134, 79.09200287, 78.7009964 , 77.66300201,\n", - " 79.11199951, 82.27899933, 85.23699951, 85.96399689, 88.69999695,\n", - " 87.52799988, 85.77400208, 87.94400024, 87.83699799, 92.66899872,\n", - " 91.91300201, 90.88800049])" - ] - }, - "execution_count": 56, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# db = DatabaseAdapter()\n", - "\n", - "# req = _SaveManager._finished_requests[0]\n", - "# db.save_to_database(\n", - "# req.saved_to_db_data,\n", - "# req.db_name,\n", - "# req.table_name,\n", - "# )\n", - "req.saved_to_db_data['moneyness'] = req.saved_to_db_data['underlier_price'] / req.saved_to_db_data['strike']\n", - "req.saved_to_db_data['underlier_price'].unique()" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "dict_keys(['NVDA20240315C395', 'NVDA20240315C400', 'NVDA20240315C405', 'NVDA20240315C410', 'NVDA20240315C415', 'NVDA20240315C420', 'NVDA20240315C425', 'NVDA20240315C430', 'NVDA20240315C435', 'NVDA20240315C440', 'NVDA20240315C445', 'NVDA20240315C450', 'NVDA20240315C455', 'NVDA20240315C460', 'NVDA20240315C465', 'NVDA20240315C470', 'NVDA20240315C475', 'NVDA20240315C480', 'NVDA20240315C485', 'NVDA20240315C490', 'NVDA20240315C495', 'NVDA20240315C500', 'NVDA20240315C505', 'NVDA20240315C510', 'NVDA20240315C515', 'NVDA20240315C520', 'NVDA20240315C525', 'NVDA20240315C530', 'NVDA20240315C535', 'NVDA20240315C540', 'NVDA20240315C545', 'NVDA20240315C550', 'NVDA20240315C555', 'NVDA20240315C560', 'NVDA20240315C565', 'NVDA20240315C570', 'NVDA20240315C575', 'NVDA20240315C580', 'NVDA20240315C590', 'NVDA20240315C600', 'NVDA20240315C610', 'NVDA20240315C620', 'NVDA20240315C630', 'NVDA20240315C640', 'NVDA20240315C650', 'NVDA20240315C660', 'NVDA20240315C670', 'NVDA20240315C680', 'NVDA20240315C690', 'NVDA20240315C700', 'NVDA20240315C710', 'NVDA20240315C720', 'NVDA20240315C730', 'NVDA20240315C740', 'NVDA20240315C750', 'NVDA20240315C760', 'NVDA20240315C770', 'NVDA20240315C780', 'NVDA20240315C790', 'NVDA20240315C800', 'NVDA20240315C810', 'NVDA20240315C820', 'NVDA20240315C830'])" - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "close_cache.keys()" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "http://127.0.0.1:25510/v2/hist/option/eod?end_date=20240315&root=NVDA&use_csv=true&exp=20240315&right=C&start_date=20230602&strike=395000\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
OpenHighLowCloseVolumeBid_sizeCloseBidAsk_sizeCloseAskMidpointWeighted_midpoint
Datetime
2023-06-02 16:00:0075.5575.5575.5575.5512372.854476.0074.42574.918657
2023-06-05 16:00:0071.3072.0271.3072.0228070.3511172.3071.32571.483246
2023-06-06 16:00:0069.0069.8965.6565.651412266.207568.3567.27567.862371
2023-06-07 16:00:0065.8065.8060.9460.9419958.703860.8559.77560.438298
2023-06-08 16:00:0062.9365.4562.9365.4515864.7514866.8065.77566.694872
....................................
2024-03-11 16:00:000.000.000.000.0001462.501464.50463.500463.500000
2024-03-12 16:00:00506.12506.19506.12506.1941522.351527.70525.025525.025000
2024-03-13 16:00:00496.67498.27496.67498.2725512.501517.50515.000513.333333
2024-03-14 16:00:00489.33489.33489.33489.3311481.205488.80485.000487.533333
2024-03-15 16:00:00495.98500.30495.98499.351801481.851485.05483.450483.450000
\n", - "

281 rows × 11 columns

\n", - "
" - ], - "text/plain": [ - " Open High Low Close Volume Bid_size \\\n", - "Datetime \n", - "2023-06-02 16:00:00 75.55 75.55 75.55 75.55 1 23 \n", - "2023-06-05 16:00:00 71.30 72.02 71.30 72.02 2 80 \n", - "2023-06-06 16:00:00 69.00 69.89 65.65 65.65 141 22 \n", - "2023-06-07 16:00:00 65.80 65.80 60.94 60.94 19 9 \n", - "2023-06-08 16:00:00 62.93 65.45 62.93 65.45 15 8 \n", - "... ... ... ... ... ... ... \n", - "2024-03-11 16:00:00 0.00 0.00 0.00 0.00 0 1 \n", - "2024-03-12 16:00:00 506.12 506.19 506.12 506.19 4 1 \n", - "2024-03-13 16:00:00 496.67 498.27 496.67 498.27 2 5 \n", - "2024-03-14 16:00:00 489.33 489.33 489.33 489.33 1 1 \n", - "2024-03-15 16:00:00 495.98 500.30 495.98 499.35 180 1 \n", - "\n", - " CloseBid Ask_size CloseAsk Midpoint Weighted_midpoint \n", - "Datetime \n", - "2023-06-02 16:00:00 72.85 44 76.00 74.425 74.918657 \n", - "2023-06-05 16:00:00 70.35 111 72.30 71.325 71.483246 \n", - "2023-06-06 16:00:00 66.20 75 68.35 67.275 67.862371 \n", - "2023-06-07 16:00:00 58.70 38 60.85 59.775 60.438298 \n", - "2023-06-08 16:00:00 64.75 148 66.80 65.775 66.694872 \n", - "... ... ... ... ... ... \n", - "2024-03-11 16:00:00 462.50 1 464.50 463.500 463.500000 \n", - "2024-03-12 16:00:00 522.35 1 527.70 525.025 525.025000 \n", - "2024-03-13 16:00:00 512.50 1 517.50 515.000 513.333333 \n", - "2024-03-14 16:00:00 481.20 5 488.80 485.000 487.533333 \n", - "2024-03-15 16:00:00 481.85 1 485.05 483.450 483.450000 \n", - "\n", - "[281 rows x 11 columns]" - ] - }, - "execution_count": 44, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "retrieve_eod_ohlc(\n", - " symbol = 'NVDA',\n", - " end_date='2024-03-15',\n", - " exp='2024-03-15',\n", - " right='C',\n", - " start_date='2023-06-02',\n", - " strike=395.0,\n", - " print_url=True\n", - " \n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 236, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'long': [Right Expiration DTE Strike Spot q r \\\n", - " build_date \n", - " 2023-06-02 2024-03-15 286 395.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 400.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 405.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 410.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 415.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 420.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 425.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 430.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 435.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 440.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 445.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 450.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 455.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 460.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 465.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 470.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 475.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 480.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 485.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 490.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 495.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 500.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 505.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 510.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 515.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 520.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 525.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 530.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 535.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 540.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 545.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 550.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 555.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 560.0 393.269997 0.000402 0.05215 \n", - " \n", - " Right relative_moneyness moneyness_spread dte_spread ticker \\\n", - " build_date \n", - " 2023-06-02 0.995620 0.021205 196 NVDA \n", - " 2023-06-02 0.983175 0.017736 196 NVDA \n", - " 2023-06-02 0.971037 0.014650 196 NVDA \n", - " 2023-06-02 0.959195 0.011924 196 NVDA \n", - " 2023-06-02 0.947639 0.009533 196 NVDA \n", - " 2023-06-02 0.936357 0.007458 196 NVDA \n", - " 2023-06-02 0.925341 0.005676 196 NVDA \n", - " 2023-06-02 0.914581 0.004171 196 NVDA \n", - " 2023-06-02 0.904069 0.002923 196 NVDA \n", - " 2023-06-02 0.893795 0.001918 196 NVDA \n", - " 2023-06-02 0.883753 0.001139 196 NVDA \n", - " 2023-06-02 0.873933 0.000573 196 NVDA \n", - " 2023-06-02 0.864330 0.000205 196 NVDA \n", - " 2023-06-02 0.854935 0.000024 196 NVDA \n", - " 2023-06-02 0.845742 0.000018 196 NVDA \n", - " 2023-06-02 0.836745 0.000176 196 NVDA \n", - " 2023-06-02 0.827937 0.000487 196 NVDA \n", - " 2023-06-02 0.819312 0.000942 196 NVDA \n", - " 2023-06-02 0.810866 0.001531 196 NVDA \n", - " 2023-06-02 0.802592 0.002248 196 NVDA \n", - " 2023-06-02 0.794485 0.003082 196 NVDA \n", - " 2023-06-02 0.786540 0.004027 196 NVDA \n", - " 2023-06-02 0.778752 0.005076 196 NVDA \n", - " 2023-06-02 0.771118 0.006222 196 NVDA \n", - " 2023-06-02 0.763631 0.007460 196 NVDA \n", - " 2023-06-02 0.756288 0.008782 196 NVDA \n", - " 2023-06-02 0.749086 0.010184 196 NVDA \n", - " 2023-06-02 0.742019 0.011660 196 NVDA \n", - " 2023-06-02 0.735084 0.013206 196 NVDA \n", - " 2023-06-02 0.728278 0.014816 196 NVDA \n", - " 2023-06-02 0.721596 0.016488 196 NVDA \n", - " 2023-06-02 0.715036 0.018215 196 NVDA \n", - " 2023-06-02 0.708595 0.019995 196 NVDA \n", - " 2023-06-02 0.702268 0.021825 196 NVDA \n", - " \n", - " Right moneyness TGT_DTE Right option_id \n", - " build_date \n", - " 2023-06-02 0.85 300 C NVDA20240315C395 \n", - " 2023-06-02 0.85 300 C NVDA20240315C400 \n", - " 2023-06-02 0.85 300 C NVDA20240315C405 \n", - " 2023-06-02 0.85 300 C NVDA20240315C410 \n", - " 2023-06-02 0.85 300 C NVDA20240315C415 \n", - " 2023-06-02 0.85 300 C NVDA20240315C420 \n", - " 2023-06-02 0.85 300 C NVDA20240315C425 \n", - " 2023-06-02 0.85 300 C NVDA20240315C430 \n", - " 2023-06-02 0.85 300 C NVDA20240315C435 \n", - " 2023-06-02 0.85 300 C NVDA20240315C440 \n", - " 2023-06-02 0.85 300 C NVDA20240315C445 \n", - " 2023-06-02 0.85 300 C NVDA20240315C450 \n", - " 2023-06-02 0.85 300 C NVDA20240315C455 \n", - " 2023-06-02 0.85 300 C NVDA20240315C460 \n", - " 2023-06-02 0.85 300 C NVDA20240315C465 \n", - " 2023-06-02 0.85 300 C NVDA20240315C470 \n", - " 2023-06-02 0.85 300 C NVDA20240315C475 \n", - " 2023-06-02 0.85 300 C NVDA20240315C480 \n", - " 2023-06-02 0.85 300 C NVDA20240315C485 \n", - " 2023-06-02 0.85 300 C NVDA20240315C490 \n", - " 2023-06-02 0.85 300 C NVDA20240315C495 \n", - " 2023-06-02 0.85 300 C NVDA20240315C500 \n", - " 2023-06-02 0.85 300 C NVDA20240315C505 \n", - " 2023-06-02 0.85 300 C NVDA20240315C510 \n", - " 2023-06-02 0.85 300 C NVDA20240315C515 \n", - " 2023-06-02 0.85 300 C NVDA20240315C520 \n", - " 2023-06-02 0.85 300 C NVDA20240315C525 \n", - " 2023-06-02 0.85 300 C NVDA20240315C530 \n", - " 2023-06-02 0.85 300 C NVDA20240315C535 \n", - " 2023-06-02 0.85 300 C NVDA20240315C540 \n", - " 2023-06-02 0.85 300 C NVDA20240315C545 \n", - " 2023-06-02 0.85 300 C NVDA20240315C550 \n", - " 2023-06-02 0.85 300 C NVDA20240315C555 \n", - " 2023-06-02 0.85 300 C NVDA20240315C560 ],\n", - " 'short': [Right Expiration DTE Strike Spot q r \\\n", - " build_date \n", - " 2023-06-02 2024-03-15 286 525.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 530.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 535.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 540.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 545.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 550.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 555.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 560.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 565.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 570.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 575.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 580.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 590.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 600.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 610.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 620.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 630.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 640.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 650.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 660.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 670.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 680.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 690.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 700.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 710.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 720.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 730.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 740.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 750.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 760.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 770.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 780.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 790.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 800.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 810.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 820.0 393.269997 0.000402 0.05215 \n", - " 2023-06-02 2024-03-15 286 830.0 393.269997 0.000402 0.05215 \n", - " \n", - " Right relative_moneyness moneyness_spread dte_spread ticker \\\n", - " build_date \n", - " 2023-06-02 0.749086 0.022227 196 NVDA \n", - " 2023-06-02 0.742019 0.020169 196 NVDA \n", - " 2023-06-02 0.735084 0.018248 196 NVDA \n", - " 2023-06-02 0.728278 0.016455 196 NVDA \n", - " 2023-06-02 0.721596 0.014786 196 NVDA \n", - " 2023-06-02 0.715036 0.013233 196 NVDA \n", - " 2023-06-02 0.708595 0.011793 196 NVDA \n", - " 2023-06-02 0.702268 0.010459 196 NVDA \n", - " 2023-06-02 0.696053 0.009226 196 NVDA \n", - " 2023-06-02 0.689947 0.008091 196 NVDA \n", - " 2023-06-02 0.683948 0.007047 196 NVDA \n", - " 2023-06-02 0.678052 0.006092 196 NVDA \n", - " 2023-06-02 0.666559 0.004430 196 NVDA \n", - " 2023-06-02 0.655450 0.003075 196 NVDA \n", - " 2023-06-02 0.644705 0.001999 196 NVDA \n", - " 2023-06-02 0.634306 0.001177 196 NVDA \n", - " 2023-06-02 0.624238 0.000587 196 NVDA \n", - " 2023-06-02 0.614484 0.000210 196 NVDA \n", - " 2023-06-02 0.605031 0.000025 196 NVDA \n", - " 2023-06-02 0.595864 0.000017 196 NVDA \n", - " 2023-06-02 0.586970 0.000170 196 NVDA \n", - " 2023-06-02 0.578338 0.000469 196 NVDA \n", - " 2023-06-02 0.569957 0.000903 196 NVDA \n", - " 2023-06-02 0.561814 0.001458 196 NVDA \n", - " 2023-06-02 0.553901 0.002125 196 NVDA \n", - " 2023-06-02 0.546208 0.002894 196 NVDA \n", - " 2023-06-02 0.538726 0.003755 196 NVDA \n", - " 2023-06-02 0.531446 0.004700 196 NVDA \n", - " 2023-06-02 0.524360 0.005721 196 NVDA \n", - " 2023-06-02 0.517461 0.006813 196 NVDA \n", - " 2023-06-02 0.510740 0.007967 196 NVDA \n", - " 2023-06-02 0.504192 0.009179 196 NVDA \n", - " 2023-06-02 0.497810 0.010443 196 NVDA \n", - " 2023-06-02 0.491587 0.011753 196 NVDA \n", - " 2023-06-02 0.485519 0.013106 196 NVDA \n", - " 2023-06-02 0.479598 0.014497 196 NVDA \n", - " 2023-06-02 0.473819 0.015922 196 NVDA \n", - " \n", - " Right moneyness TGT_DTE Right option_id \n", - " build_date \n", - " 2023-06-02 0.6 300 C NVDA20240315C525 \n", - " 2023-06-02 0.6 300 C NVDA20240315C530 \n", - " 2023-06-02 0.6 300 C NVDA20240315C535 \n", - " 2023-06-02 0.6 300 C NVDA20240315C540 \n", - " 2023-06-02 0.6 300 C NVDA20240315C545 \n", - " 2023-06-02 0.6 300 C NVDA20240315C550 \n", - " 2023-06-02 0.6 300 C NVDA20240315C555 \n", - " 2023-06-02 0.6 300 C NVDA20240315C560 \n", - " 2023-06-02 0.6 300 C NVDA20240315C565 \n", - " 2023-06-02 0.6 300 C NVDA20240315C570 \n", - " 2023-06-02 0.6 300 C NVDA20240315C575 \n", - " 2023-06-02 0.6 300 C NVDA20240315C580 \n", - " 2023-06-02 0.6 300 C NVDA20240315C590 \n", - " 2023-06-02 0.6 300 C NVDA20240315C600 \n", - " 2023-06-02 0.6 300 C NVDA20240315C610 \n", - " 2023-06-02 0.6 300 C NVDA20240315C620 \n", - " 2023-06-02 0.6 300 C NVDA20240315C630 \n", - " 2023-06-02 0.6 300 C NVDA20240315C640 \n", - " 2023-06-02 0.6 300 C NVDA20240315C650 \n", - " 2023-06-02 0.6 300 C NVDA20240315C660 \n", - " 2023-06-02 0.6 300 C NVDA20240315C670 \n", - " 2023-06-02 0.6 300 C NVDA20240315C680 \n", - " 2023-06-02 0.6 300 C NVDA20240315C690 \n", - " 2023-06-02 0.6 300 C NVDA20240315C700 \n", - " 2023-06-02 0.6 300 C NVDA20240315C710 \n", - " 2023-06-02 0.6 300 C NVDA20240315C720 \n", - " 2023-06-02 0.6 300 C NVDA20240315C730 \n", - " 2023-06-02 0.6 300 C NVDA20240315C740 \n", - " 2023-06-02 0.6 300 C NVDA20240315C750 \n", - " 2023-06-02 0.6 300 C NVDA20240315C760 \n", - " 2023-06-02 0.6 300 C NVDA20240315C770 \n", - " 2023-06-02 0.6 300 C NVDA20240315C780 \n", - " 2023-06-02 0.6 300 C NVDA20240315C790 \n", - " 2023-06-02 0.6 300 C NVDA20240315C800 \n", - " 2023-06-02 0.6 300 C NVDA20240315C810 \n", - " 2023-06-02 0.6 300 C NVDA20240315C820 \n", - " 2023-06-02 0.6 300 C NVDA20240315C830 ]}" - ] - }, - "execution_count": 236, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "candidates" - ] - }, - { - "cell_type": "code", - "execution_count": 233, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'AAPL20250919C225_2024-12-23': 45.775000000000006,\n", - " 'AAPL20250919P280_2024-12-23': 30.5,\n", - " 'AAPL20250919C250_2024-12-23': 28.475,\n", - " 'AAPL20250919P290_2024-12-23': 37.7,\n", - " 'AAPL20250919C270_2024-12-23': 17.0,\n", - " 'AAPL20250919P270_2024-12-23': 24.4}" - ] - }, - "execution_count": 233, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# pd.concat([oi_cache['AAPL20250919C250'], to_update_cache_data_return])\n", - "close_cache['AAPL20250919C250']\n", - "spot_cache" - ] - }, - { - "cell_type": "code", - "execution_count": 67, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
tickerput_callexp_datestrikestart_dateend_date
0AAPLP2025-09-19280.02024-12-032025-01-05
\n", - "
" - ], - "text/plain": [ - " ticker put_call exp_date strike start_date end_date\n", - "0 AAPL P 2025-09-19 280.0 2024-12-03 2025-01-05" - ] - }, - "execution_count": 67, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "full_data = organize_data_for_query(query_ticks=query_ticks, data_request=req)\n", - "full_data" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Other Tests with Data Managers" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "## Test 2, using a list of option data managers\n", - "def get_timeseries(opm, start, end):\n", - " return opm.get_timeseries(\n", - " start=start,\n", - " end=end,\n", - " interval='1d',\n", - " type_='spot',\n", - " model='bs',\n", - " )\n", - "\n", - "full_data = pd.DataFrame()\n", - "for direction in candidates:\n", - " for data in candidates[direction]:\n", - " full_data = pd.concat([full_data, data], axis=0)\n", - "\n", - "full_data.index.name = 'Date'\n", - "full_data.columns.name = ''\n", - "full_data['start_date'] = start\n", - "full_data['end_date'] = end\n", - "full_data['Strike'] = full_data.Strike.astype(float)\n", - "init_OrderedList = full_data[['ticker', 'Expiration', 'Right', 'Strike']].T.to_numpy()\n", - "\n", - "## Create data manager\n", - "opm_list = runThreads(OptionDataManager, init_OrderedList)\n", - "opttick = [x.opttick for x in opm_list]\n", - "\n", - "## Ordered list for runThreads\n", - "ts_OrderedList = list(full_data[['start_date', 'end_date']].T.to_numpy())\n", - "ts_OrderedList.insert(0, opm_list)\n", - "\n", - "## Get Data init\n", - "data = (runThreads(get_timeseries, ts_OrderedList, 'map' , block=True))\n", - "data" - ] - }, - { - "cell_type": "code", - "execution_count": 239, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[SaveManager] Enqueueing save request for NVDA on \n", - "2025-04-25 15:11:18 dbase.DataAPI.ThetaData CRITICAL: `datetime_col_name` not provided for multi index resample, setting to `Datetime`\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 239, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "## Test 3, Using BulkDataManager\n", - "\n", - "full_data = pd.DataFrame()\n", - "for direction in candidates:\n", - " for data in candidates[direction]:\n", - " full_data = pd.concat([full_data, data], axis=0)\n", - "\n", - "full_data.index.name = 'Date'\n", - "full_data.columns.name = ''\n", - "full_data['start_date'] = start\n", - "full_data['end_date'] = end\n", - "full_data['Strike'] = full_data.Strike.astype(float)\n", - "\n", - "\n", - "bulk_manager = BulkOptionDataManager(full_data.ticker.unique()[0],\n", - " full_data.Expiration.unique()[0],\n", - " )\n", - "\n", - "\n", - "timeseries = bulk_manager.get_timeseries(\n", - " start=start,\n", - " end=end,\n", - " interval='1d',\n", - " type_='spot',\n", - " model='bs',\n", - " strikes_right=list(full_data[['Strike', 'Right']].itertuples(name=None, index=False))\n", - " )\n", - "timeseries " - ] - }, - { - "cell_type": "code", - "execution_count": 240, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
OpenHighLowCloseMidpointVolumeOpeninterest
OptiontickDatetime
NVDA20240315C3952023-06-020.000.000.000.000.0000.00.0
2023-06-0575.5575.5575.5575.5574.4251.062.0
2023-06-0671.3072.0271.3072.0271.3252.062.0
2023-06-0769.0069.8965.6565.6567.275141.063.0
2023-06-0865.8065.8060.9460.9459.77519.0149.0
...........................
NVDA20240315C8302024-03-11123.43144.3054.0058.6759.075933.01982.0
2024-03-1249.2067.5537.0539.0040.0502069.01910.0
2024-03-1357.9590.5042.0690.5090.475688.02345.0
2024-03-1479.5785.8060.0080.1080.425217.02370.0
2024-03-1566.9776.0541.0050.1550.400704.02354.0
\n", - "

12978 rows × 7 columns

\n", - "
" - ], - "text/plain": [ - " Open High Low Close Midpoint Volume \\\n", - "Optiontick Datetime \n", - "NVDA20240315C395 2023-06-02 0.00 0.00 0.00 0.00 0.000 0.0 \n", - " 2023-06-05 75.55 75.55 75.55 75.55 74.425 1.0 \n", - " 2023-06-06 71.30 72.02 71.30 72.02 71.325 2.0 \n", - " 2023-06-07 69.00 69.89 65.65 65.65 67.275 141.0 \n", - " 2023-06-08 65.80 65.80 60.94 60.94 59.775 19.0 \n", - "... ... ... ... ... ... ... \n", - "NVDA20240315C830 2024-03-11 123.43 144.30 54.00 58.67 59.075 933.0 \n", - " 2024-03-12 49.20 67.55 37.05 39.00 40.050 2069.0 \n", - " 2024-03-13 57.95 90.50 42.06 90.50 90.475 688.0 \n", - " 2024-03-14 79.57 85.80 60.00 80.10 80.425 217.0 \n", - " 2024-03-15 66.97 76.05 41.00 50.15 50.400 704.0 \n", - "\n", - " Openinterest \n", - "Optiontick Datetime \n", - "NVDA20240315C395 2023-06-02 0.0 \n", - " 2023-06-05 62.0 \n", - " 2023-06-06 62.0 \n", - " 2023-06-07 63.0 \n", - " 2023-06-08 149.0 \n", - "... ... \n", - "NVDA20240315C830 2024-03-11 1982.0 \n", - " 2024-03-12 1910.0 \n", - " 2024-03-13 2345.0 \n", - " 2024-03-14 2370.0 \n", - " 2024-03-15 2354.0 \n", - "\n", - "[12978 rows x 7 columns]" - ] - }, - "execution_count": 240, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "timeseries.post_processed_data" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "openbb", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.10" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/module_test/raw_code/DataManagers/notebooks/test.ipynb b/module_test/raw_code/DataManagers/notebooks/test.ipynb deleted file mode 100644 index 396f3a6..0000000 --- a/module_test/raw_code/DataManagers/notebooks/test.ipynb +++ /dev/null @@ -1,973 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The autoreload extension is already loaded. To reload it, use:\n", - " %reload_ext autoreload\n" - ] - } - ], - "source": [ - "%load_ext autoreload\n", - "%autoreload 2\n", - "from module_test.raw_code.DataManagers.DataManagers import OptionDataManager, set_skip_mysql_query" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python311.zip',\n", - " '/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11',\n", - " '/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/lib-dynload',\n", - " '',\n", - " '/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages',\n", - " '/Users/chiemelienwanisobi/Documents/GitHub/stop-loss-script/BACKTEST/private_backtest',\n", - " '/Users/chiemelienwanisobi/cloned_repos/QuantTools',\n", - " '/Users/chiemelienwanisobi/cloned_repos/TFP-Algo',\n", - " '/Users/chiemelienwanisobi/cloned_repos/QuantTools/setup_process/src/financedatabase',\n", - " '/Users/chiemelienwanisobi/cloned_repos/FinanceDatabase',\n", - " '/Users/chiemelienwanisobi/cloned_repos/QuantTools',\n", - " '/Users/chiemelienwanisobi/cloned_repos/QuantTools',\n", - " '/Users/chiemelienwanisobi/cloned_repos/FinanceDatabase',\n", - " '/Users/chiemelienwanisobi/cloned_repos/FinanceDatabase']\n" - ] - } - ], - "source": [ - "from pathlib import Path\n", - "from pprint import pprint\n", - "path = Path(\"~/cloned_repos\")\n", - "path.expanduser()\n", - "\n", - "import sys\n", - "pprint(sys.path)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2025-09-14 01:04:44 DataManager.py CRITICAL: Skipping MySQL query. This is not optimized and may lead to performance issues.\n", - "YF.download() has changed argument auto_adjust default to True\n", - "2025-09-14 01:04:45 trade.asset.Stock ERROR: Error getting dividends history for TSLA from yfinance\n", - "2025-09-14 01:04:45 trade.asset.Stock ERROR: Probably due to no dividends history\n", - "2025-09-14 01:04:46 trade.helpers.pools INFO: `parrallel_apply` using multiprocessing with 2 workers\n", - "2025-09-14 01:04:46 trade.helpers.pools INFO: To change to threading, either set the environment POOL_ENABLED to False, or use `set_pool_enabled(False)` found in trade.__init__\n", - "2025-09-14 01:04:46 trade.helpers.pools INFO: Logger stream level is set to DEBUG. To change this behavior & reduce stream logs, use `change_logger_stream_level` found in trade.helpers.pools\n", - "2025-09-14 01:04:46 trade.helpers.pools INFO: Starting Function with multiprocessing\n", - "2025-09-14 01:04:47 trade.helpers.pools INFO: Function completed in 0.8910210132598877 seconds\n", - "2025-09-14 01:04:47 trade.helpers.pools INFO: `parrallel_apply` using multiprocessing with 2 workers\n", - "2025-09-14 01:04:47 trade.helpers.pools INFO: To change to threading, either set the environment POOL_ENABLED to False, or use `set_pool_enabled(False)` found in trade.__init__\n", - "2025-09-14 01:04:47 trade.helpers.pools INFO: Logger stream level is set to DEBUG. To change this behavior & reduce stream logs, use `change_logger_stream_level` found in trade.helpers.pools\n", - "2025-09-14 01:04:47 trade.helpers.pools INFO: Starting Function with multiprocessing\n", - "2025-09-14 01:04:47 trade.helpers.pools INFO: Function completed in 0.542205810546875 seconds\n", - "2025-09-14 01:04:47 trade.helpers.pools INFO: `parrallel_apply` using multiprocessing with 2 workers\n", - "2025-09-14 01:04:47 trade.helpers.pools INFO: To change to threading, either set the environment POOL_ENABLED to False, or use `set_pool_enabled(False)` found in trade.__init__\n", - "2025-09-14 01:04:47 trade.helpers.pools INFO: Logger stream level is set to DEBUG. To change this behavior & reduce stream logs, use `change_logger_stream_level` found in trade.helpers.pools\n", - "2025-09-14 01:04:47 trade.helpers.pools INFO: Starting Function with multiprocessing\n", - "2025-09-14 01:04:48 trade.helpers.pools INFO: Function completed in 0.5452742576599121 seconds\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Bs_ivMidpoint_bs_ivAsk_bs_iv
Datetime
2025-08-250.0000000.5546720.559155
2025-08-260.5458970.5549270.558853
2025-08-270.5519580.5516300.553738
2025-08-280.0000000.5451970.547834
2025-08-290.0000000.5398400.542674
2025-09-010.0000000.5398400.542674
2025-09-020.5543950.5402440.543193
2025-09-030.5454730.5420820.544431
2025-09-040.5251320.5420720.544113
2025-09-050.5521740.5516970.552652
2025-09-080.5495160.5502560.551488
2025-09-090.5423800.5443590.545348
2025-09-100.5489740.5472480.548481
2025-09-110.5505250.5559070.557251
2025-09-120.5706780.5712940.572732
\n", - "
" - ], - "text/plain": [ - " Bs_iv Midpoint_bs_iv Ask_bs_iv\n", - "Datetime \n", - "2025-08-25 0.000000 0.554672 0.559155\n", - "2025-08-26 0.545897 0.554927 0.558853\n", - "2025-08-27 0.551958 0.551630 0.553738\n", - "2025-08-28 0.000000 0.545197 0.547834\n", - "2025-08-29 0.000000 0.539840 0.542674\n", - "2025-09-01 0.000000 0.539840 0.542674\n", - "2025-09-02 0.554395 0.540244 0.543193\n", - "2025-09-03 0.545473 0.542082 0.544431\n", - "2025-09-04 0.525132 0.542072 0.544113\n", - "2025-09-05 0.552174 0.551697 0.552652\n", - "2025-09-08 0.549516 0.550256 0.551488\n", - "2025-09-09 0.542380 0.544359 0.545348\n", - "2025-09-10 0.548974 0.547248 0.548481\n", - "2025-09-11 0.550525 0.555907 0.557251\n", - "2025-09-12 0.570678 0.571294 0.572732" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "set_skip_mysql_query(True)\n", - "opt_dm = OptionDataManager(opttick=\"TSLA20260417C450\")\n", - "data = opt_dm.get_timeseries(\n", - " start=\"2023-01-01\",\n", - " end=\"2025-12-31\",\n", - " extra_cols=[\"ask\"],\n", - " type_ = 'vol'\n", - ")\n", - "data.post_processed_data" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2025-09-15\n" - ] - } - ], - "source": [ - "from trade.helpers.helper import ny_now\n", - "print(ny_now().date())\n" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The autoreload extension is already loaded. To reload it, use:\n", - " %reload_ext autoreload\n", - "Close Today List: []\n", - "Open Today List: []\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "6a243155d9c449a9958bff5acf78b32f", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Backtest.run: 0%| | 0/189 [00:00\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
TickerSizeSIGNAL_ORIGINAL_ENTRY_TIMESIGNAL_ORIGINAL_EXIT_TIMESIGNAL_IDOPEN_TODAYCLOSE_TODAYPOSITION_PREV_OPENEDPOSITION_ACTIVEPOSITION_CLOSEDSIGNAL_CLOSEDACTIONRATIONALENEW_ENTRY_TIMENEW_EXIT_TIME
0NVDA48.02025-07-012025-09-09NVDA20250701LONGFalseFalseTrueTrueFalseFalseHOLDHolding active position without close today2025-08-222025-09-11 16:00:00
1AMZN4.02025-07-012025-09-09AMZN20250701LONGFalseFalseTrueTrueFalseFalseHOLDHolding active position without close today2025-08-222025-09-11 16:00:00
2META3.02025-07-012025-09-09META20250701LONGFalseFalseTrueTrueFalseFalseHOLDHolding active position without close today2025-09-052025-09-11 16:00:00
3AMD6.02025-07-012025-09-09AMD20250701LONGFalseFalseTrueTrueFalseFalseHOLDHolding active position without close today2025-08-282025-09-11 16:00:00
4NFLX1.02025-07-012025-09-09NFLX20250701LONGFalseFalseTrueTrueFalseFalseHOLDHolding active position without close today2025-09-082025-09-11 16:00:00
5BA2.02025-07-012025-09-09BA20250701LONGFalseFalseTrueTrueFalseFalseHOLDHolding active position without close today2025-09-052025-09-11 16:00:00
6SBUX5.02025-07-222025-07-24SBUX20250722LONGFalseFalseFalseFalseFalseTrueDO_NOTHINGSignal closed before today; no action needed2025-07-21 00:00:002025-07-23 00:00:00
7AAPL5.02025-08-082025-09-09AAPL20250808LONGFalseFalseTrueTrueFalseFalseHOLDHolding active position without close today2025-08-202025-09-11 16:00:00
\n", - "" - ], - "text/plain": [ - " Ticker Size SIGNAL_ORIGINAL_ENTRY_TIME SIGNAL_ORIGINAL_EXIT_TIME \\\n", - "0 NVDA 48.0 2025-07-01 2025-09-09 \n", - "1 AMZN 4.0 2025-07-01 2025-09-09 \n", - "2 META 3.0 2025-07-01 2025-09-09 \n", - "3 AMD 6.0 2025-07-01 2025-09-09 \n", - "4 NFLX 1.0 2025-07-01 2025-09-09 \n", - "5 BA 2.0 2025-07-01 2025-09-09 \n", - "6 SBUX 5.0 2025-07-22 2025-07-24 \n", - "7 AAPL 5.0 2025-08-08 2025-09-09 \n", - "\n", - " SIGNAL_ID OPEN_TODAY CLOSE_TODAY POSITION_PREV_OPENED \\\n", - "0 NVDA20250701LONG False False True \n", - "1 AMZN20250701LONG False False True \n", - "2 META20250701LONG False False True \n", - "3 AMD20250701LONG False False True \n", - "4 NFLX20250701LONG False False True \n", - "5 BA20250701LONG False False True \n", - "6 SBUX20250722LONG False False False \n", - "7 AAPL20250808LONG False False True \n", - "\n", - " POSITION_ACTIVE POSITION_CLOSED SIGNAL_CLOSED ACTION \\\n", - "0 True False False HOLD \n", - "1 True False False HOLD \n", - "2 True False False HOLD \n", - "3 True False False HOLD \n", - "4 True False False HOLD \n", - "5 True False False HOLD \n", - "6 False False True DO_NOTHING \n", - "7 True False False HOLD \n", - "\n", - " RATIONALE NEW_ENTRY_TIME \\\n", - "0 Holding active position without close today 2025-08-22 \n", - "1 Holding active position without close today 2025-08-22 \n", - "2 Holding active position without close today 2025-09-05 \n", - "3 Holding active position without close today 2025-08-28 \n", - "4 Holding active position without close today 2025-09-08 \n", - "5 Holding active position without close today 2025-09-05 \n", - "6 Signal closed before today; no action needed 2025-07-21 00:00:00 \n", - "7 Holding active position without close today 2025-08-20 \n", - "\n", - " NEW_EXIT_TIME \n", - "0 2025-09-11 16:00:00 \n", - "1 2025-09-11 16:00:00 \n", - "2 2025-09-11 16:00:00 \n", - "3 2025-09-11 16:00:00 \n", - "4 2025-09-11 16:00:00 \n", - "5 2025-09-11 16:00:00 \n", - "6 2025-07-23 00:00:00 \n", - "7 2025-09-11 16:00:00 " - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "res['TRADES']" - ] - }, - { - "cell_type": "code", - "execution_count": 80, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
TickerSizeSIGNAL_ORIGINAL_ENTRY_TIMESIGNAL_ORIGINAL_EXIT_TIMESIGNAL_IDOPEN_TODAYCLOSE_TODAYPOSITION_PREV_OPENEDPOSITION_ACTIVEPOSITION_CLOSEDSIGNAL_CLOSEDACTIONRATIONALENEW_ENTRY_TIMENEW_EXIT_TIME
0NVDA48.02025-07-012025-09-09NVDA20250701LONGFalseFalseTrueTrueFalseFalseHOLDHolding active position without close today2025-08-222025-09-11 16:00:00
1AMZN4.02025-07-012025-09-09AMZN20250701LONGFalseFalseTrueTrueFalseFalseHOLDHolding active position without close today2025-08-222025-09-11 16:00:00
2META3.02025-07-012025-09-09META20250701LONGFalseFalseTrueTrueFalseFalseHOLDHolding active position without close today2025-09-052025-09-11 16:00:00
3AMD6.02025-07-012025-09-09AMD20250701LONGFalseFalseTrueTrueFalseFalseHOLDHolding active position without close today2025-08-282025-09-11 16:00:00
4NFLX1.02025-07-012025-09-09NFLX20250701LONGFalseFalseTrueTrueFalseFalseHOLDHolding active position without close today2025-09-082025-09-11 16:00:00
5BA2.02025-07-012025-09-09BA20250701LONGFalseFalseTrueTrueFalseFalseHOLDHolding active position without close today2025-09-052025-09-11 16:00:00
6SBUX5.02025-07-222025-07-24SBUX20250722LONGFalseFalseFalseFalseFalseTrueDO_NOTHINGSignal closed before today; no action needed2025-07-21 00:00:002025-07-23 00:00:00
7AAPL5.02025-08-082025-09-09AAPL20250808LONGFalseFalseTrueTrueFalseFalseHOLDHolding active position without close today2025-08-202025-09-11 16:00:00
\n", - "
" - ], - "text/plain": [ - " Ticker Size SIGNAL_ORIGINAL_ENTRY_TIME SIGNAL_ORIGINAL_EXIT_TIME \\\n", - "0 NVDA 48.0 2025-07-01 2025-09-09 \n", - "1 AMZN 4.0 2025-07-01 2025-09-09 \n", - "2 META 3.0 2025-07-01 2025-09-09 \n", - "3 AMD 6.0 2025-07-01 2025-09-09 \n", - "4 NFLX 1.0 2025-07-01 2025-09-09 \n", - "5 BA 2.0 2025-07-01 2025-09-09 \n", - "6 SBUX 5.0 2025-07-22 2025-07-24 \n", - "7 AAPL 5.0 2025-08-08 2025-09-09 \n", - "\n", - " SIGNAL_ID OPEN_TODAY CLOSE_TODAY POSITION_PREV_OPENED \\\n", - "0 NVDA20250701LONG False False True \n", - "1 AMZN20250701LONG False False True \n", - "2 META20250701LONG False False True \n", - "3 AMD20250701LONG False False True \n", - "4 NFLX20250701LONG False False True \n", - "5 BA20250701LONG False False True \n", - "6 SBUX20250722LONG False False False \n", - "7 AAPL20250808LONG False False True \n", - "\n", - " POSITION_ACTIVE POSITION_CLOSED SIGNAL_CLOSED ACTION \\\n", - "0 True False False HOLD \n", - "1 True False False HOLD \n", - "2 True False False HOLD \n", - "3 True False False HOLD \n", - "4 True False False HOLD \n", - "5 True False False HOLD \n", - "6 False False True DO_NOTHING \n", - "7 True False False HOLD \n", - "\n", - " RATIONALE NEW_ENTRY_TIME \\\n", - "0 Holding active position without close today 2025-08-22 \n", - "1 Holding active position without close today 2025-08-22 \n", - "2 Holding active position without close today 2025-09-05 \n", - "3 Holding active position without close today 2025-08-28 \n", - "4 Holding active position without close today 2025-09-08 \n", - "5 Holding active position without close today 2025-09-05 \n", - "6 Signal closed before today; no action needed 2025-07-21 00:00:00 \n", - "7 Holding active position without close today 2025-08-20 \n", - "\n", - " NEW_EXIT_TIME \n", - "0 2025-09-11 16:00:00 \n", - "1 2025-09-11 16:00:00 \n", - "2 2025-09-11 16:00:00 \n", - "3 2025-09-11 16:00:00 \n", - "4 2025-09-11 16:00:00 \n", - "5 2025-09-11 16:00:00 \n", - "6 2025-07-23 00:00:00 \n", - "7 2025-09-11 16:00:00 " - ] - }, - "execution_count": 80, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "test_tick = 'META'\n", - "res['TIMESERIES'][test_tick].data\n", - "res['BACKTESTER'].trades()#.T\n", - "res['TRADES']" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "openbb_new_use", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.13" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/module_test/raw_code/DataManagers/option_cache/helpers.py b/module_test/raw_code/DataManagers/option_cache/helpers.py index 9d4e652..070b365 100644 --- a/module_test/raw_code/DataManagers/option_cache/helpers.py +++ b/module_test/raw_code/DataManagers/option_cache/helpers.py @@ -2,7 +2,6 @@ Cache helpers for DataManagers with option data caching. This module provides cache instances for option spot, volatility, and greeks data. -Follows the pattern from EventDriven.riskmanager.market_data.py for consistency. """ from __future__ import annotations diff --git a/module_test/raw_code/DataManagers/option_cache/tests_archive/test_eoddata_cache.py b/module_test/raw_code/DataManagers/option_cache/tests_archive/test_eoddata_cache.py index 1a7d64b..d295f5a 100644 --- a/module_test/raw_code/DataManagers/option_cache/tests_archive/test_eoddata_cache.py +++ b/module_test/raw_code/DataManagers/option_cache/tests_archive/test_eoddata_cache.py @@ -43,7 +43,7 @@ # Try to import and create MarketTimeseries try: - from EventDriven.riskmanager.market_data import get_timeseries_obj + from trade.datamanager.market_data import get_timeseries_obj market_ts = get_timeseries_obj() set_global_market_timeseries(market_ts) print(f" ✓ Created and set MarketTimeseries: {market_ts}\n") diff --git a/module_test/raw_code/DataManagers/utils.py b/module_test/raw_code/DataManagers/utils.py index c710a76..83762ef 100644 --- a/module_test/raw_code/DataManagers/utils.py +++ b/module_test/raw_code/DataManagers/utils.py @@ -17,8 +17,6 @@ def set_global_market_timeseries(market_timeseries_instance): """ Set the global MarketTimeseries instance for caching underlier data. - Args: - market_timeseries_instance: MarketTimeseries instance from EventDriven.riskmanager.market_data """ global _GLOBAL_MARKET_TIMESERIES _GLOBAL_MARKET_TIMESERIES = market_timeseries_instance diff --git a/module_test/raw_code/OptionDatamanger.ipynb b/module_test/raw_code/OptionDatamanger.ipynb deleted file mode 100644 index 2cd1fd5..0000000 --- a/module_test/raw_code/OptionDatamanger.ipynb +++ /dev/null @@ -1,938 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Using Proxy URL: http://18.232.166.224:5500/thetadata\n" - ] - } - ], - "source": [ - "%load_ext autoreload\n", - "%autoreload 2\n", - "from dotenv import load_dotenv\n", - "import os\n", - "import sys\n", - "import logging\n", - "from openpyxl import load_workbook\n", - "from datetime import datetime, date\n", - "import pandas as pd\n", - "import threading\n", - "from pathos.multiprocessing import ProcessingPool as Pool\n", - "from concurrent.futures import ProcessPoolExecutor, as_completed\n", - "import concurrent.futures\n", - "from trade.assets.Stock import Stock\n", - "from trade.helpers.helper import generate_option_tick_new\n", - "from trade.assets.rates import get_risk_free_rate_helper\n", - "from trade.helpers.helper import IV_handler, time_distance_helper, binomial_implied_vol, wait_for_response\n", - "from trade.helpers.helper import extract_numeric_value, change_to_last_busday\n", - "from trade.helpers.Logging import setup_logger\n", - "from trade.assets.Calculate import Calculate\n", - "from trade.helpers.Context import Context\n", - "from dbase.DataAPI.ThetaData import retrieve_ohlc, retrieve_quote_rt, retrieve_eod_ohlc, resample, retrieve_quote\n", - "from dbase.DataAPI.Organizers import generate_optionData_to_save, Calc_Risks\n", - "from dbase.database.SQLHelpers import store_SQL_data_Insert_Ignore, query_database, dynamic_batch_update\n", - "from trade.helpers.decorators import log_error, log_error_with_stack, log_time\n", - "from trade.helpers.types import OptionModelAttributes\n", - "from dateutil.relativedelta import relativedelta\n", - "from pandas.tseries.offsets import BDay\n", - "from dbase.database.SQLHelpers import DatabaseAdapter\n", - "from abc import ABC, abstractmethod\n", - "logger = setup_logger('test_datamanager')" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "__all__ = [\n", - " 'DataManagerBase',\n", - " 'OptionDataManager',\n", - " 'SpotDataManager',\n", - " 'VolDataManager',\n", - " 'GreeksDataManager',\n", - " 'AttributionDataManager',\n", - "]" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "## Format of tables is: database_name.table_name\n", - "TABLES = {\n", - " 'eod':{\n", - " 'attribution': 'securities_master.attribution_eod',\n", - " 'spot': 'securities_master.temp_options_eod',\n", - " 'vol': 'securities_master.temp_options_eod',\n", - " 'greeks': 'securities_master.temp_options_eod',\n", - " 'chain': 'vol_surface.option_chain'\n", - " },\n", - " 'intra':{\n", - " 'attribution': 'securities_master.attribution_intra',\n", - " 'spot': 'securities_master.temp_options_intra',\n", - " 'vol': 'securities_master.temp_options_intra',\n", - " 'greeks': 'securities_master.temp_options_intra',\n", - " }\n", - "}\n" - ] - }, - { - "cell_type": "code", - "execution_count": 144, - "metadata": {}, - "outputs": [], - "source": [ - "class OptionQueryRequestParameter:\n", - " def __init__(self, table_name, db_name, start_date=None, end_date=None, ticker=None, exp=None, strike=None):\n", - " self.db_name = db_name\n", - " self.table_name = table_name\n", - " self.start_date = start_date\n", - " self.end_date = end_date\n", - " self.ticker = ticker\n", - " self.exp = exp\n", - " self.strike = strike\n", - " self.opttick= None\n", - " self.query = None\n", - " self.y = None\n", - " self.vol = None\n", - " self.spot = None\n", - " self.interval = None\n", - " self.type_ = None" - ] - }, - { - "cell_type": "code", - "execution_count": 153, - "metadata": {}, - "outputs": [], - "source": [ - "class OptionDataManager:\n", - " @log_time(logger)\n", - " def __init__(self,\n", - " symbol: str = None,\n", - " exp: str | datetime | date = None,\n", - " right: str = None,\n", - " strike: float = None,\n", - " default_fill: str = 'midpoint',\n", - " opttick: str = None,\n", - " **kwargs) -> None:\n", - " \"\"\"\n", - " Returns an object for querying data\n", - "\n", - " Params:\n", - " symbol: Underlier symbol\n", - " exp: expiration\n", - " right: Put(P) or Call (C)\n", - " strike: Option Strike\n", - " default_fill: How to fill zero values for close. 'midpoint' or 'weighted_midpoint'\n", - " opttick: Option ticker, if provided, will ignore symbol, exp, right, strike and be initialized with the string\n", - " \"\"\"\n", - "\n", - " if opttick is not None:\n", - " assert isinstance(opttick, str), f\"opttick has to be type str, recieved {type(opttick)}\"\n", - " option_meta = parse_option_tick(opttick)\n", - " self.symbol = option_meta['ticker']\n", - " self.exp = option_meta['exp_date']\n", - " self.right = option_meta['put_call']\n", - " self.strike = option_meta['strike']\n", - " self.opttick = opttick\n", - "\n", - " else:\n", - " assert isinstance(strike, float), f\"Strike has to be type float, recieved {type(strike)}\"\n", - " if default_fill not in ['midpoint', 'weighted_midpoint', None]:\n", - " raise ValueError(\"Expected default_fill to be one of: 'midpoint', 'weighted_midpoint', None \")\n", - " \n", - " assert all([symbol, exp, right, strike]), \"symbol, exp, right, strike are required\"\n", - " self.exp = exp\n", - " self.symbol = symbol\n", - " self.right = right.upper()\n", - " self.strike = strike\n", - " self.opttick = generate_option_tick_new(symbol, right, exp, strike)\n", - "\n", - " self.default_fill = default_fill\n", - " self.db = DatabaseAdapter()\n", - " self.Stock = Stock(self.symbol, run_chain = False)\n", - " ## Prefer to use dicts to avoid having too many attributes\n", - " self._intra = {}\n", - " self._eod = {}\n", - " \n", - " @property\n", - " def eod(self):\n", - " \"\"\"\n", - " Returns the end of day data\n", - " \"\"\"\n", - " class EODData(dict):\n", - " def __init__(inner, parent):\n", - " inner.parent = parent\n", - " super().__init__()\n", - "\n", - " def __getitem__(inner, key): ## Custom getter for EOD Dict. To initialize the data, if not already done\n", - " if key not in inner.parent._eod:\n", - " if key not in ['s0_close', 's0_chain', 'r', 'y']:\n", - " raise KeyError(f\"{key} not in eod data, expected one of: ['s0_close', 's0_chain', 'r', 'y']\")\n", - " inner.parent._eod[key] = inner.parent._lazy_load(key)\n", - " return inner.parent._eod[key]\n", - " \n", - " def __contains__(innner, key):\n", - " return key in inner.parent._eod\n", - " \n", - " def __repr__(inner):\n", - " return inner.parent._eod.__repr__()\n", - " \n", - " def __len__(inner):\n", - " return len(inner.parent._eod)\n", - " \n", - " def keys(inner):\n", - " return inner.parent._eod.keys()\n", - " return EODData(self)\n", - " \n", - " @property\n", - " def intra(self):\n", - " \"\"\"\n", - " Returns the end of day data\n", - " \"\"\"\n", - " class IntraData(dict):\n", - " def __init__(inner, parent):\n", - " inner.parent = parent\n", - " super().__init__()\n", - "\n", - " def __getitem__(inner, key): ## Custom getter for EOD Dict. To initialize the data, if not already done\n", - " if key not in inner.parent._intra:\n", - " if key not in ['s0_close', 's0_chain', 'r', 'y']:\n", - " raise KeyError(f\"{key} not in intra data, expected one of: ['s0_close', 's0_chain', 'r', 'y']\")\n", - " inner.parent._intra[key] = inner.parent._lazy_load(key, ts_timewidth = '5', ts_timeframe = 'minute')\n", - " return inner.parent._intra[key]\n", - " \n", - " def __contains__(innner, key):\n", - " return key in inner.parent._intra\n", - " \n", - " def __repr__(inner):\n", - " return inner.parent._intra.__repr__()\n", - " \n", - " def __len__(inner):\n", - " return len(inner.parent._intra)\n", - " \n", - " def keys(inner):\n", - " return inner.parent._intra.keys()\n", - " return IntraData(self)\n", - "\n", - " def _lazy_load(self, load_name, **kwargs):\n", - " ## Utilizing the lazy load function to load data on demand, and speed up initialization\n", - " if load_name == 's0_close':\n", - "\n", - " ## Will use Kwargs to move between intra and EOD.\n", - " return self.Stock.spot(ts = True,\n", - " ts_start = pd.to_datetime(self.exp) - relativedelta(years=2),\n", - " ts_end =pd.to_datetime(self.exp) + relativedelta(years=2),\n", - " **kwargs)\n", - " elif load_name == 's0_chain':\n", - " return self.Stock.spot(ts = True,\n", - " ts_start = pd.to_datetime(self.exp) - relativedelta(years=2),\n", - " ts_end =pd.to_datetime(self.exp) + relativedelta(years=2),\n", - " spot_type='chain_price',\n", - " **kwargs)\n", - " \n", - " elif load_name == 'r':\n", - " return get_risk_free_rate_helper()\n", - "\n", - " elif load_name == 'y':\n", - " return self.Stock.div_yield_history()\n", - "\n", - " def get_timeseries(self, \n", - " start: str | datetime, \n", - " end: str | datetime,\n", - " interval: str = '1d',\n", - " type_: str = 'spot',\n", - " model: str = 'bs') -> pd.DataFrame:\n", - " \n", - " \n", - " ## Organize inputs\n", - " start = pd.to_datetime(start)\n", - " end = pd.to_datetime(end)\n", - " ivl_str, ivl_int = extract_numeric_value(interval)\n", - " greek_names = ['vega', 'vanna', 'volga', 'delta', 'gamma', 'theta', 'rho', 'greek', 'greeks']\n", - "\n", - "\n", - " ## Assert inputs\n", - " if type_ not in ['spot', 'vol', 'vega', 'vanna', 'volga', 'delta', 'gamma', 'theta', 'rho', 'greeks', 'greek', 'attribution', 'scenario']:\n", - " raise ValueError(\"Expected type_ to be one of: ['spot', 'vol', 'vega', 'vanna', 'volga', 'delta', 'gamma', 'theta', 'rho', 'greeks', 'greek', 'attribution', 'scenario']\")\n", - " if model not in ['bs', 'bt', 'mc', 'bsm']: ## Only Black Scholes, binomial tree, monte carlo\n", - " raise ValueError(\"Expected model to be one of: ['bs', 'bt', 'mc', 'bsm']\")\n", - " \n", - " if ivl_str.lower() not in ['d', 'w','q','y', 'h'] and ivl_str != 'M': ## Want to avoid minute data\n", - " raise ValueError(\"Expected interval to be one of: ['d', 'w','q','y' 'M']\")\n", - " \n", - " if ivl_str == 'm': ## Minute data not available\n", - " raise AttributeError(\"Minute data currently unavailable, please go higher\")\n", - " \n", - "\n", - " ## Determine aggregation\n", - " if ivl_str == 'h':\n", - " agg = 'intra'\n", - " else:\n", - " agg = 'eod'\n", - " \n", - " ## Table to query, picking based on interval & type\n", - " if type_ in greek_names:\n", - " database, table = TABLES[agg]['greeks'].split('.')\n", - " else:\n", - " database, table = TABLES[agg][type_].split('.')\n", - " print(database, table)\n", - "\n", - " data_request = OptionQueryRequestParameter(table_name=table, \n", - " db_name=database, \n", - " start_date=start, \n", - " end_date=end, \n", - " ticker=self.symbol, \n", - " exp=self.exp, \n", - " strike=self.strike)\n", - " data_request.opttick = self.opttick\n", - " data_request.interval= interval\n", - " data_request.type_ = type_\n", - "\n", - " self.__init_query(data_request=data_request)\n", - " return data_request\n", - " \n", - " def get_at_time(self, \n", - " date: str | datetime, \n", - " end: str | datetime,\n", - " type_: str = 'spot',\n", - " model: str = 'bs') -> pd.DataFrame:\n", - " \"\"\"\n", - " Get data at a specific time\n", - " \"\"\"\n", - " pass\n", - "\n", - " def __init_query(self, **kwargs):\n", - " data_request = kwargs.get('data_request')\n", - " query = f\"\"\"SELECT *\n", - " FROM {data_request.db_name}.{data_request.table_name}\n", - " WHERE OPTIONTICK = '{data_request.opttick}'\n", - " \"\"\"\n", - " database_data = self.db.query_database(data_request.db_name, data_request.table_name, query)\n", - " data_request.query = query\n", - " data_request.database_data = database_data\n", - " return database_data\n", - "\n", - " def __verify_data_completeness(self, data: pd.DataFrame, interval_type: str) -> 'Something':\n", - " \"\"\"\n", - " Verify that the data is complete\n", - " \"\"\"\n", - " pass\n", - "\n", - "\n", - "\n", - "class SpotDataManager:\n", - " pass\n", - "\n", - "class VolDataManager:\n", - " pass\n", - "\n", - "class GreeksDataManager:\n", - " pass\n", - "\n", - "class AttributionDataManager:\n", - " pass\n", - "\n", - "class ChainDataManager:\n", - " pass\n", - "\n", - "class ScenarioDataManager:\n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": 147, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[0;31mInit signature:\u001b[0m\n", - "\u001b[0mOptionDataManager\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0msymbol\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mexp\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m \u001b[0;34m|\u001b[0m \u001b[0mdatetime\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdatetime\u001b[0m \u001b[0;34m|\u001b[0m \u001b[0mdatetime\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdate\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mright\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mstrike\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mdefault_fill\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'midpoint'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mopttick\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mDocstring:\u001b[0m \n", - "\u001b[0;31mInit docstring:\u001b[0m\n", - "Returns an object for querying data\n", - "\n", - "Params:\n", - "symbol: Underlier symbol\n", - "exp: expiration\n", - "right: Put(P) or Call (C)\n", - "strike: Option Strike\n", - "default_fill: How to fill zero values for close. 'midpoint' or 'weighted_midpoint'\n", - "opttick: Option ticker, if provided, will ignore symbol, exp, right, strike and be initialized with the string\n", - "\u001b[0;31mType:\u001b[0m type\n", - "\u001b[0;31mSubclasses:\u001b[0m " - ] - } - ], - "source": [ - "OptionDataManager?" - ] - }, - { - "cell_type": "code", - "execution_count": 154, - "metadata": {}, - "outputs": [], - "source": [ - "manager = OptionDataManager('AAPL', '2025-04-11', 'C', 145.0)" - ] - }, - { - "cell_type": "code", - "execution_count": 157, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "securities_master temp_options_eod\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
OpenHighLowCloseVolumeBid_sizeCloseBidAsk_sizeCloseAskStrike...weighted_midpoint_Vegaweighted_midpoint_Thetaweighted_midpoint_Rhoweighted_midpoint_Vannaweighted_midpoint_Volgaweighted_midpoint_Dollar_DeltaOpenInterestbid_IVask_IVlast_updated
\n", - "

0 rows × 55 columns

\n", - "
" - ], - "text/plain": [ - "Empty DataFrame\n", - "Columns: [Open, High, Low, Close, Volume, Bid_size, CloseBid, Ask_size, CloseAsk, Strike, Expiration, Put/Call, Underlier_price, RF_rate, RF_rate_name, dividend, OptionTick, Underlier, Datetime, BS_IV, Binomial_IV, Delta, Gamma, Vega, Theta, Rho, Vanna, Volga, Dollar_Delta, midpoint, midpoint_BS_IV, midpoint_Binomial_IV, midpoint_Delta, midpoint_Gamma, midpoint_Vega, midpoint_Theta, midpoint_Rho, midpoint_Vanna, midpoint_Volga, midpoint_Dollar_Delta, weighted_midpoint, weighted_midpoint_BS_IV, weighted_midpoint_Binomial_IV, weighted_midpoint_Delta, weighted_midpoint_Gamma, weighted_midpoint_Vega, weighted_midpoint_Theta, weighted_midpoint_Rho, weighted_midpoint_Vanna, weighted_midpoint_Volga, weighted_midpoint_Dollar_Delta, OpenInterest, bid_IV, ask_IV, last_updated]\n", - "Index: []\n", - "\n", - "[0 rows x 55 columns]" - ] - }, - "execution_count": 157, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "request = manager.get_timeseries(\n", - " start='2024-01-01',\n", - " end='2024-12-31',\n", - " interval='1d',\n", - " type_='spot',\n", - " model='bs'\n", - ")\n", - "request.database_data" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Console Logging & File Logging Can be configured using STREAM_LOG_LEVEL and FILE_LOG_LEVEL in environment variables.\n", - "Propagate to root logger can be set using PROPAGATE_TO_ROOT_LOGGER in environment variables.\n", - "Example:\n", - "STREAM_LOG_LEVEL = 'DEBUG'\n", - "FILE_LOG_LEVEL = 'INFO'\n", - "PROPAGATE_TO_ROOT_LOGGER = 'False'\n", - "\n", - "2025-04-04 17:04:21 trade.helpers.Logging INFO: Logging Root Directory: /Users/chiemelienwanisobi/cloned_repos/QuantTools/logs\n" - ] - } - ], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
OpenHighLowCloseVolumeBid_sizeCloseBidAsk_sizeCloseAskStrike...weighted_midpoint_Vegaweighted_midpoint_Thetaweighted_midpoint_Rhoweighted_midpoint_Vannaweighted_midpoint_Volgaweighted_midpoint_Dollar_DeltaOpenInterestbid_IVask_IVlast_updated
07.207.356.807.35423266.951287.50120.0...0.336261-0.0200560.2390030.66822124.87258731.92820044770.0000000.0000002025-02-27 06:10:14
15.655.655.155.49162505.351505.90130.0...0.308340-0.0187480.1983610.65737835.02102726.15777626850.0000000.0000002025-02-27 06:10:12
27.408.097.408.091024017.701638.15120.0...0.347200-0.0211410.2523680.65559021.76444134.11613744810.0000000.0000002025-02-27 06:10:14
35.556.105.556.104315.652256.20130.0...0.321696-0.0199930.2116120.65533032.20563528.23815926980.0000000.0000002025-02-27 06:10:12
42.783.072.783.05582123.05643.20195.0...0.338953-0.0140420.1895050.69966695.01055423.04643519900.2912440.2956322025-02-27 06:17:36
..................................................................
999549.4549.4549.4549.4514250.051051.95560.0...1.876698-0.1051852.246148-0.29327241.037687340.6798483200.2048400.2149102025-03-19 07:27:02
99964.955.054.774.89174224.80265.0540.0...0.131983-0.0099120.1246340.285984-1.32960921.040553136140.3733820.3922152025-02-24 00:34:39
99973.003.052.942.94266692.861133.1545.0...0.129642-0.0092450.0962850.6034004.78920415.481647110860.3542840.3765092025-02-24 00:34:39
99980.000.000.000.00018142.8518145.05165.0...0.086958-0.0415460.546255-2.9916231114.604880299.01753535830.0000000.6562742025-04-03 00:37:34
9999138.65140.65138.05140.6582137.952140.30170.0...0.095332-0.0434400.560809-2.9998741093.132226298.32395854420.0000000.6401222025-04-03 00:37:34
\n", - "

10000 rows × 55 columns

\n", - "
" - ], - "text/plain": [ - " Open High Low Close Volume Bid_size CloseBid Ask_size \\\n", - "0 7.20 7.35 6.80 7.35 42 326 6.95 128 \n", - "1 5.65 5.65 5.15 5.49 16 250 5.35 150 \n", - "2 7.40 8.09 7.40 8.09 102 401 7.70 163 \n", - "3 5.55 6.10 5.55 6.10 43 1 5.65 225 \n", - "4 2.78 3.07 2.78 3.05 58 212 3.05 64 \n", - "... ... ... ... ... ... ... ... ... \n", - "9995 49.45 49.45 49.45 49.45 1 42 50.05 10 \n", - "9996 4.95 5.05 4.77 4.89 174 22 4.80 26 \n", - "9997 3.00 3.05 2.94 2.94 266 69 2.86 113 \n", - "9998 0.00 0.00 0.00 0.00 0 18 142.85 18 \n", - "9999 138.65 140.65 138.05 140.65 8 2 137.95 2 \n", - "\n", - " CloseAsk Strike ... weighted_midpoint_Vega weighted_midpoint_Theta \\\n", - "0 7.50 120.0 ... 0.336261 -0.020056 \n", - "1 5.90 130.0 ... 0.308340 -0.018748 \n", - "2 8.15 120.0 ... 0.347200 -0.021141 \n", - "3 6.20 130.0 ... 0.321696 -0.019993 \n", - "4 3.20 195.0 ... 0.338953 -0.014042 \n", - "... ... ... ... ... ... \n", - "9995 51.95 560.0 ... 1.876698 -0.105185 \n", - "9996 5.05 40.0 ... 0.131983 -0.009912 \n", - "9997 3.15 45.0 ... 0.129642 -0.009245 \n", - "9998 145.05 165.0 ... 0.086958 -0.041546 \n", - "9999 140.30 170.0 ... 0.095332 -0.043440 \n", - "\n", - " weighted_midpoint_Rho weighted_midpoint_Vanna weighted_midpoint_Volga \\\n", - "0 0.239003 0.668221 24.872587 \n", - "1 0.198361 0.657378 35.021027 \n", - "2 0.252368 0.655590 21.764441 \n", - "3 0.211612 0.655330 32.205635 \n", - "4 0.189505 0.699666 95.010554 \n", - "... ... ... ... \n", - "9995 2.246148 -0.293272 41.037687 \n", - "9996 0.124634 0.285984 -1.329609 \n", - "9997 0.096285 0.603400 4.789204 \n", - "9998 0.546255 -2.991623 1114.604880 \n", - "9999 0.560809 -2.999874 1093.132226 \n", - "\n", - " weighted_midpoint_Dollar_Delta OpenInterest bid_IV ask_IV \\\n", - "0 31.928200 4477 0.000000 0.000000 \n", - "1 26.157776 2685 0.000000 0.000000 \n", - "2 34.116137 4481 0.000000 0.000000 \n", - "3 28.238159 2698 0.000000 0.000000 \n", - "4 23.046435 1990 0.291244 0.295632 \n", - "... ... ... ... ... \n", - "9995 340.679848 320 0.204840 0.214910 \n", - "9996 21.040553 13614 0.373382 0.392215 \n", - "9997 15.481647 11086 0.354284 0.376509 \n", - "9998 299.017535 3583 0.000000 0.656274 \n", - "9999 298.323958 5442 0.000000 0.640122 \n", - "\n", - " last_updated \n", - "0 2025-02-27 06:10:14 \n", - "1 2025-02-27 06:10:12 \n", - "2 2025-02-27 06:10:14 \n", - "3 2025-02-27 06:10:12 \n", - "4 2025-02-27 06:17:36 \n", - "... ... \n", - "9995 2025-03-19 07:27:02 \n", - "9996 2025-02-24 00:34:39 \n", - "9997 2025-02-24 00:34:39 \n", - "9998 2025-04-03 00:37:34 \n", - "9999 2025-04-03 00:37:34 \n", - "\n", - "[10000 rows x 55 columns]" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "db = DatabaseAdapter()\n", - "query = \"\"\"\n", - "SELECT * FROM SECURITIES_MASTER.TEMP_OPTIONS_EOD\n", - "LIMIT 10000\"\"\"\n", - "\n", - "data = db.query_database('securities_master', 'temp_options_eod', query)\n", - "data" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "openbb", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.10" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/module_test/raw_code/optionlib/core/time_utils.py b/module_test/raw_code/optionlib/core/time_utils.py index 112d4d9..ac0bafe 100644 --- a/module_test/raw_code/optionlib/core/time_utils.py +++ b/module_test/raw_code/optionlib/core/time_utils.py @@ -1,26 +1,27 @@ from datetime import datetime, timedelta import pandas as pd +from trade.helpers.helper import time_distance_helper # noqa # import numpy as np -def time_distance_helper(end: str, strt: str = None) -> float: - """ - Calculate the time distance between two dates in years. - Args: - end (str): Expiration date/End Date in 'YYYY-MM-DD' format. - strt (str, optional): Start date in 'YYYY-MM-DD' format. Defaults to today's date. - Returns: - float: Time distance in years. - """ - if strt is None: - strt = datetime.today() +# def time_distance_helper(end: str, strt: str = None) -> float: +# """ +# Calculate the time distance between two dates in years. +# Args: +# end (str): Expiration date/End Date in 'YYYY-MM-DD' format. +# strt (str, optional): Start date in 'YYYY-MM-DD' format. Defaults to today's date. +# Returns: +# float: Time distance in years. +# """ +# if strt is None: +# strt = datetime.today() - end = pd.to_datetime(end) - end = end.replace(hour = 16, minute = 0, second = 0, microsecond = 0,) - parsed_dte, start_date = pd.to_datetime(end), pd.to_datetime(strt) - if start_date.hour == 0 and start_date.minute == 0 and start_date.second == 0: - start_date = start_date.replace(hour=16, minute=0, second=0, microsecond=0) - days = (parsed_dte - start_date).total_seconds() +# end = pd.to_datetime(end) +# end = end.replace(hour = 16, minute = 0, second = 0, microsecond = 0,) +# parsed_dte, start_date = pd.to_datetime(end), pd.to_datetime(strt) +# if start_date.hour == 0 and start_date.minute == 0 and start_date.second == 0: +# start_date = start_date.replace(hour=16, minute=0, second=0, microsecond=0) +# days = (parsed_dte - start_date).total_seconds() - T = days/(365.25*24*3600) - return T \ No newline at end of file +# T = days/(365.25*24*3600) +# return T \ No newline at end of file diff --git a/module_test/raw_code/optionlib/testing.ipynb b/module_test/raw_code/optionlib/testing.ipynb deleted file mode 100644 index 3519d0b..0000000 --- a/module_test/raw_code/optionlib/testing.ipynb +++ /dev/null @@ -1,22511 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Model Notes\n", - "\n", - "- Forward price/dividend implementation lacks carry consideration\n", - "- Theta & Rho in Finite Difference is being overstated\n", - "- We will assume all Prices & dividends from yahoo finance are split adjusted" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## FYI\n", - "\n", - "- All black scholes models will be priced with forwards.\n", - "- Add to config:\n", - " - N_PRECISION\n", - " - DX_THRESH" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Break Down\n", - "\n", - "```python\n", - "\n", - "option_models/\n", - "├── black_scholes/\n", - "│ ├── base_model.py # BlackScholes\n", - "│ ├── market_model.py # MarketBlackScholes\n", - "│ ├── vectorized.py # black_scholes_price(), greeks()\n", - "│ └── __init__.py\n", - "├── binomial/\n", - "│ ├── base_model.py\n", - "│ ├── market_model.py\n", - "│ ├── vectorized.py\n", - "│ └── __init__.py\n", - "├── monte_carlo/\n", - "│ ├── base_model.py\n", - "│ ├── market_model.py\n", - "│ ├── vectorized.py\n", - "│ └── __init__.py\n", - "```\n", - "\n", - "## Market Model Flow:\n", - "\n", - "Dividends -> Forward -> BlackScholes\n", - "\n", - "- Information such as bumped spot, risk free rate, spot flows from dividends to BlackScholes\n", - "- Since `Stock` object implements singleton, all uncleared bumps will cause unintended effects\n", - " - `Stock` singleton is tracked by (ticker, end_date).\n", - "- " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## To-Do\n", - "- Add enum" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import enum\n", - "\n", - "class GreekCalcStye(enum.Enum):\n", - " \"\"\"\n", - " Enum to represent the style of Greek calculator.\n", - " \"\"\"\n", - " analytical = \"analytical\"\n", - " numerical = \"numerical\" " - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Console Logging & File Logging Can be configured using STREAM_LOG_LEVEL and FILE_LOG_LEVEL in environment variables.\n", - "Propagate to root logger can be set using PROPAGATE_TO_ROOT_LOGGER in environment variables.\n", - "Example:\n", - "STREAM_LOG_LEVEL = 'DEBUG'\n", - "FILE_LOG_LEVEL = 'INFO'\n", - "PROPAGATE_TO_ROOT_LOGGER = 'False'\n", - "\n", - "2025-07-23 00:08:32 trade.helpers.Logging INFO: Logging Root Directory: /Users/chiemelienwanisobi/cloned_repos/QuantTools/logs\n", - "Using Proxy URL: http://54.144.4.219:5500/thetadata\n" - ] - } - ], - "source": [ - "%load_ext autoreload\n", - "%autoreload 2\n", - "from module_test.raw_code.optionlib.core.helpers import *\n", - "from module_test.raw_code.optionlib.core.base_model import *\n", - "from module_test.raw_code.optionlib.core.time_utils import *\n", - "from module_test.raw_code.optionlib.core.vars import *\n", - "from module_test.raw_code.optionlib.core import config, load_config\n", - "from datetime import datetime\n", - "from trade.helpers.helper import compare_dates\n", - "import numpy as np\n", - "import math\n", - "from datetime import datetime, date\n", - "from dateutil.rrule import rrule, MONTHLY\n", - "from typing import List, Tuple, Union\n", - "from dateutil.relativedelta import relativedelta\n", - "from abc import ABC, abstractmethod\n", - "import math\n", - "from scipy.stats import norm\n", - "from copy import deepcopy\n", - "from datetime import datetime\n", - "from trade.helpers.Logging import setup_logger\n", - "from trade.assets.Stock import Stock\n", - "from trade.helpers.Context import Context\n", - "from trade.helpers.helper import (CustomCache,\n", - " retrieve_timeseries,\n", - " is_USholiday,\n", - " change_to_last_busday,\n", - " Scalar)\n", - "from pandas.tseries.offsets import BDay\n", - "from dbase.DataAPI.ThetaData import (\n", - " list_contracts,\n", - " retrieve_eod_ohlc,\n", - " retrieve_chain_bulk\n", - ")\n", - "from trade.assets.rates import get_risk_free_rate_helper\n", - "from scipy.optimize import minimize_scalar\n", - "import numpy as np\n", - "from math import erf, exp, log, sqrt\n", - "from typing import Literal, List, Tuple\n", - "from itertools import chain\n", - "logger = setup_logger('models.ipynb')" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "os.environ['PROXY_URL'] = ''" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.01" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "load_config()\n", - "config\n", - "DIVIDEND_FORECAST_METHOD = config['DIVIDEND_FORECAST_METHOD']\n", - "DIVIDEND_LOOKBACK_YEARS\n", - "config\n", - "VOL_EST_LOWER_BOUND" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "pd.options.plotting.backend = \"plotly\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Build Test Data from Current Market" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[0;31mSignature:\u001b[0m\n", - "\u001b[0mretrieve_eod_ohlc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0msymbol\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mend_date\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mexp\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mright\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mstart_date\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mstrike\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mprint_url\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mrt\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mproxy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mDocstring:\u001b[0m Interval size in miliseconds. 1 minute is 6000\n", - "\u001b[0;31mFile:\u001b[0m ~/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py\n", - "\u001b[0;31mType:\u001b[0m function" - ] - } - ], - "source": [ - "retrieve_eod_ohlc?" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "\n", - "Scheduled Data Requests will be saved to: /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/scheduler/requests.jsonl\n", - "[get_engine] Creating engine for DB: securities_master, PID: 4547\n" - ] - } - ], - "source": [ - "ticks = ['AAPL', 'MSFT', 'GOOGL', 'AMZN', 'TSLA']\n", - "test_start, test_valuation_date = '2025-07-16', '2025-07-16'\n", - "def pick_random_option(tick, date):\n", - " contracts = list_contracts(tick, date)\n", - " # Pick a random contract from the list\n", - " contract = np.random.choice(contracts.index)\n", - " return contracts.iloc[contract]\n", - "\n", - "def get_option_eod_price(date, contract_series):\n", - " \"\"\"\n", - " Retrieves the end-of-day price for a given option contract on a specific date.\n", - " \n", - " Args:\n", - " date (datetime): The date for which to retrieve the price.\n", - " contract_series (pd.Series): The series containing option contract details.\n", - " \n", - " Returns:\n", - " float: The end-of-day price of the option contract.\n", - " \"\"\"\n", - " eod_data = retrieve_eod_ohlc(symbol=contract_series['root'],\n", - " end_date=date,\n", - " start_date=date,\n", - " exp=str(contract_series['expiration']),\n", - " right=contract_series['right'],\n", - " strike=contract_series['strike'],\n", - " )\n", - " return eod_data.Midpoint[0]\n", - "\n", - "def get_spot(tick, date):\n", - " return retrieve_timeseries(tick, date, date)['close'][0]\n", - "\n", - "contract = pick_random_option(ticks[0], test_start)\n", - "eod = get_option_eod_price(test_start, contract)\n", - "spot = retrieve_timeseries(ticks[0], test_start, test_start)['close'][0]\n", - "rates = get_risk_free_rate_helper()['annualized'][test_start]\n" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "def format_dates(*args):\n", - " return [pd.to_datetime(arg) for arg in args]\n", - "\n", - "def subtract_dates(date1: datetime, date2: datetime) -> int:\n", - " \"\"\"\n", - " Subtracts two dates and returns the difference in days.\n", - " \"\"\"\n", - "\n", - " return (pd.to_datetime(date1) - pd.to_datetime(date2)).days\n", - "\n", - "def get_months_between(start_date: datetime, end_date: datetime) -> int:\n", - " \"\"\"\n", - " Returns the number of months between two dates.\n", - " \"\"\"\n", - " return (end_date.year - start_date.year) * 12 + end_date.month - start_date.month\n", - "\n", - "def validate_dates(*args):\n", - " \"\"\"\n", - " Validates if the input date is a valid datetime object.\n", - " \"\"\"\n", - " for dt in args:\n", - " if not isinstance(dt, (datetime, pd.Timestamp, date)):\n", - " raise ValueError(f\"Invalid date: {dt}. Expected a datetime object.\")\n", - " \n", - " if is_USholiday(dt):\n", - " raise ValueError(f\"Date {dt} is a US holiday. Please choose a different date.\")\n", - " \n", - " if dt.weekday() in [5, 6]:\n", - " raise ValueError(f\"Date {dt} falls on a weekend. Please choose a weekday.\")\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## NJIT Function" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "from numba import njit\n", - "import numpy as np\n", - "from math import exp, log, sqrt, erf\n", - "\n", - "@njit\n", - "def norm_cdf(x):\n", - " return 0.5 * (1.0 + erf(x / sqrt(2.0)))\n", - "\n", - "@njit\n", - "def black_scholes_numba(F, K, T, r, sigma, option_type_int):\n", - " n = len(F)\n", - " prices = np.empty(n)\n", - "\n", - " for i in range(n):\n", - " d1 = (log(F[i] / K[i]) + 0.5 * sigma[i] ** 2 * T[i]) / (sigma[i] * sqrt(T[i]))\n", - " d2 = d1 - sigma[i] * sqrt(T[i])\n", - " df = exp(-r[i] * T[i])\n", - "\n", - " if option_type_int[i] == 0: # call\n", - " prices[i] = df * (F[i] * norm_cdf(d1) - K[i] * norm_cdf(d2))\n", - " elif option_type_int[i] == 1: # put\n", - " prices[i] = df * (K[i] * norm_cdf(-d2) - F[i] * norm_cdf(-d1))\n", - " else:\n", - " prices[i] = np.nan # or raise error\n", - "\n", - " return prices\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Vectorized Functions" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "from scipy.stats import norm\n", - "\n", - "\n", - "# ----------------------\n", - "# Vectorized Black-Scholes Pricing\n", - "# ----------------------\n", - "def black_scholes_vectorized(F, K, T, r, sigma, option_type=\"c\"):\n", - " F = np.asarray(F)\n", - " K = np.asarray(K)\n", - " T = np.asarray(T)\n", - " r = np.asarray(r)\n", - " sigma = np.asarray(sigma)\n", - "\n", - " d1 = (np.log(F / K) + 0.5 * sigma**2 * T) / (sigma * np.sqrt(T))\n", - " d2 = d1 - sigma * np.sqrt(T)\n", - " df = np.exp(-r * T)\n", - " if option_type == \"c\":\n", - " price = df * (F * norm.cdf(d1) - K * norm.cdf(d2))\n", - " elif option_type == \"p\":\n", - " price = df * (K * norm.cdf(-d2) - F * norm.cdf(-d1))\n", - " else:\n", - " raise ValueError(\"option_type must be 'c' or 'p'\")\n", - "\n", - " return price\n", - "\n", - "# ----------------------\n", - "# Vectorized Finite Differences (First Order)\n", - "# ----------------------\n", - "def finite_diff_first_order_vec(x: str, price_func, params: dict, dx_thresh=0.001, method=\"forward\"):\n", - " if x == 'T':\n", - " dx = 1 / DAILY_BASIS\n", - " else:\n", - " dx = (params[x]) * dx_thresh # Ensure dx is float\n", - "\n", - " def to_float_copy(val):\n", - " if isinstance(val, (int, float, np.integer, np.floating)):\n", - " return float(val)\n", - " # elif isinstance(val, np.ndarray):\n", - " # try:\n", - " # return val.astype(np.float64)\n", - " # except ValueError:\n", - " # return val\n", - " return val\n", - "\n", - " # Convert all values to float-compatible copies\n", - " p0 = {k: to_float_copy(v) for k, v in params.items()}\n", - " p1 = {k: to_float_copy(v) for k, v in params.items()}\n", - " p2 = {k: to_float_copy(v) for k, v in params.items()}\n", - "\n", - " if method == \"forward\":\n", - " p1[x] = p1[x] + dx\n", - " return (price_func(**p1) - price_func(**p0)) / dx\n", - " elif method == \"backward\":\n", - " p1[x] = p1[x] - dx\n", - " return (price_func(**p0) - price_func(**p1)) / dx\n", - " elif method == \"central\":\n", - " p1[x] = p0[x] + dx\n", - " p2[x] = p0[x] - dx\n", - " return (price_func(**p1) - price_func(**p2)) / (2 * dx)\n", - "\n", - " else:\n", - " raise ValueError(\"Unknown method. Expected central, forward or backward\")\n", - "\n", - "\n", - "# ----------------------\n", - "# Vectorized Finite Differences (Second Order)\n", - "# ----------------------\n", - "def finite_diff_second_order_vec(x: str, price_func, params: dict, dx_thresh=0.001, method=\"central\"):\n", - " if x == 'T':\n", - " dx = 1 / DAILY_BASIS\n", - " else:\n", - " # dx = float(params[x]) * dx_thresh # Ensure dx is float\n", - " dx = (params[x]) * dx_thresh # Ensure dx is float\n", - "\n", - " def to_float_copy(val):\n", - " if isinstance(val, (int, float, np.integer, np.floating)):\n", - " return float(val)\n", - " # elif isinstance(val, np.ndarray):\n", - " # try:\n", - " # return val.astype(np.float64)\n", - " # except ValueError:\n", - " # return val\n", - " return val\n", - "\n", - " # Convert all values to float-compatible copies\n", - " p0 = {k: to_float_copy(v) for k, v in params.items()}\n", - " p1 = {k: to_float_copy(v) for k, v in params.items()}\n", - " p2 = {k: to_float_copy(v) for k, v in params.items()}\n", - "\n", - "\n", - " if method == \"central\":\n", - " p1[x] = p0[x] + dx\n", - " p2[x] = p0[x] - dx\n", - " return (price_func(**p1) - 2 * price_func(**p0) + price_func(**p2)) / dx**2\n", - "\n", - " elif method == \"forward\":\n", - " p1[x] = p1[x] + dx\n", - " p2[x] = p2[x] + 2 * dx\n", - " return (price_func(**p2) - 2 * price_func(**p1) + price_func(**p0)) / dx**2\n", - " elif method == \"backward\":\n", - " p1[x] = p1[x] - dx\n", - " p2[x] = p2[x] - 2 * dx\n", - " return (price_func(**p0) - 2 * price_func(**p1) + price_func(**p2)) / dx**2\n", - " else:\n", - " raise ValueError(\"Unknown method. Expected central, forward or backward\")\n", - "\n", - "\n", - "# ----------------------\n", - "# ForwardModel Wrappers\n", - "# ----------------------\n", - "class ForwardWrapper:\n", - " def __init__(self, models: list):\n", - " self.models = models\n", - "\n", - " def get_forward_array(self):\n", - " return np.array([model.get_forward_price() for model in self.models])\n", - "\n", - "\n", - "\n", - "# Example usage:\n", - "# F_cont = vectorized_forward_continuous(S, r, q, T)\n", - "# F_disc = vectorized_forward_discrete(S, r, T, div_times, div_amounts)\n", - "\n", - "\n", - "def black_scholes_analytic_greeks_vectorized(F, K, T, r, sigma, option_type=\"c\"):\n", - " F = np.asarray(F)\n", - " K = np.asarray(K)\n", - " T = np.asarray(T)\n", - " r = np.asarray(r)\n", - " sigma = np.asarray(sigma)\n", - "\n", - " d1 = (np.log(F / K) + 0.5 * sigma**2 * T) / (sigma * np.sqrt(T))\n", - " d2 = d1 - sigma * np.sqrt(T)\n", - " nd1 = norm.pdf(d1)\n", - " df = np.exp(-r * T)\n", - "\n", - " # Handle both scalar and vector string inputs for option_type\n", - " option_type = np.asarray(option_type)\n", - "\n", - " # Enfores option_type\n", - " if not np.all(np.isin(option_type, [\"c\", \"p\"])):\n", - " raise ValueError(\"option_type must be 'c' or 'p'\")\n", - "\n", - " is_call = option_type == \"c\"\n", - "\n", - " delta = np.where(is_call, norm.cdf(d1), -norm.cdf(-d1))\n", - " gamma = nd1 / (F * sigma * np.sqrt(T))\n", - " vega = F * nd1 * np.sqrt(T)\n", - " volga = vega * d1 * d2 / sigma\n", - " rho = np.where(\n", - " is_call,\n", - " T * K * df * norm.cdf(d2),\n", - " -T * K * df * norm.cdf(-d2)\n", - " )\n", - " theta = - (F * nd1 * sigma) / (2 * np.sqrt(T)) \\\n", - " - r * K * df * np.where(is_call, norm.cdf(d2), norm.cdf(-d2))\n", - "\n", - " return {\n", - " \"delta\": delta,\n", - " \"gamma\": gamma,\n", - " \"vega\": vega / 100,\n", - " \"volga\": volga / 100**2,\n", - " \"rho\": rho / 100,\n", - " \"theta\": theta/DAILY_BASIS\n", - " }\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## FiniteGreekEstimator" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "import math\n", - "from copy import deepcopy\n", - "from typing import Callable, Dict, Union\n", - "\n", - "class FiniteGreeksEstimator:\n", - " def __init__(self,\n", - " price_func: Callable,\n", - " base_params: Dict[str, Union[float, int]],\n", - " dx_thresh: float = 0.001,\n", - " method: str = 'central'):\n", - " \"\"\"\n", - " Estimate Greeks using finite difference methods.\n", - "\n", - " Parameters:\n", - " - price_func: Callable pricing function accepting kwargs.\n", - " - base_params: Dictionary with keys like 'S', 'K', 'T', 'r', 'sigma', 'q'.\n", - " - dx_thresh: Relative step size.\n", - " - method: 'forward', 'backward', or 'central'.\n", - " \"\"\"\n", - " self.price_func = price_func\n", - " self.params = base_params.copy()\n", - " self.dx_thresh = dx_thresh\n", - " self.method = method.lower()\n", - " self._validate_params()\n", - "\n", - " def _validate_params(self):\n", - " required = {'S', 'K', 'T', 'r', 'sigma', 'q'}\n", - " missing = required - set(self.params.keys())\n", - " if missing:\n", - " raise ValueError(f\"Missing required keys: {missing}\")\n", - " if self.method not in {'forward', 'backward', 'central'}:\n", - " raise ValueError(f\"Invalid method '{self.method}'. Must be 'forward', 'backward', or 'central'.\")\n", - "\n", - " def _step(self, x: str) -> float:\n", - " val = self.params[x]\n", - " return max(self.dx_thresh * abs(val), 1e-6)\n", - "\n", - " def first_order(self, x: str) -> float:\n", - " return finite_diff_first_order_vec(x, self.price_func, self.params, dx_thresh=self.dx_thresh, method=self.method)\n", - "\n", - " def second_order(self, x: str) -> float:\n", - " return finite_diff_second_order_vec(x, self.price_func, self.params, dx_thresh=self.dx_thresh, method=self.method)\n", - "\n", - " def all_first_order(self) -> Dict[str, float]:\n", - " \n", - " return {\n", - " 'delta': self.first_order('S'),\n", - " 'vega': self.first_order('sigma') * 0.01,\n", - " 'theta': -self.first_order('T')/DAILY_BASIS,\n", - " 'rho': self.first_order('r')*0.01\n", - " }\n", - "\n", - " def all_second_order(self) -> Dict[str, float]:\n", - " return {\n", - " 'gamma': self.second_order('S'),\n", - " 'volga': self.second_order('sigma') * 0.0001,\n", - " }\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## DIVIDENDS\n", - "\n", - "- Base Model:\n", - " - DividendSchedule, ContinousDividends\n", - "\n", - "- Market Model: \n", - " - MarketDividendSchedule, MarketContinuousDividends\n", - "\n", - "- Vectorized:\n", - " - Final Value: List[PvDivs], List[DiscountFactor]" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "class Dividend(ABC):\n", - " @abstractmethod\n", - " def get_present_value(self, *args, **kwargs) -> float:\n", - " \"\"\"\n", - " Calculate the present value of the dividend.\n", - " \"\"\"\n", - " pass\n", - " \n", - " @abstractmethod\n", - " def get_type(self) -> str:\n", - " \"\"\"\n", - " Get the type of the dividend.\n", - " \"\"\"\n", - " pass\n", - " \n", - " def __repr__(self):\n", - " return f\"<{self.__class__.__name__}: {self.get_type()}>\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Base Model" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "\n", - "FREQ_MAP = {\n", - " \"monthly\": 1,\n", - " \"quarterly\": 3,\n", - " \"semiannual\": 6,\n", - " \"annual\": 12,\n", - "}\n", - "\n", - "class DividendSchedule(Dividend):\n", - " def __init__(\n", - " self,\n", - " start_date: datetime,\n", - " end_date: datetime,\n", - " freq: str = \"quarterly\",\n", - " amount: Union[float, List[float]] = 1.0,\n", - " valuation_date: datetime = None,\n", - " basis: int = 365,\n", - " **kwargs: Union[str, int, float, datetime, None]\n", - " ):\n", - " \"\"\"\n", - " Initialize a DividendSchedule object.\n", - " start_date: datetime - The start date of the dividend schedule. Starts the schedule.\n", - " end_date: datetime - The end date of the dividend schedule.\n", - " freq: str - The frequency of dividends ('monthly', 'quarterly', 'semiannual', 'annual').\n", - " amount: float or list - The dividend amount (can be a scalar or a list).\n", - " valuation_date: datetime - The date for valuation purposes.\n", - " basis: int - The day count basis (default is 365).\n", - " \"\"\"\n", - " if freq not in FREQ_MAP:\n", - " raise ValueError(f\"Unsupported frequency '{freq}'. Use one of {list(FREQ_MAP.keys())}.\")\n", - " self.start_date = start_date\n", - " self.end_date = end_date\n", - " self.freq = freq\n", - " self.valuation_date = valuation_date or start_date\n", - " self.basis = basis\n", - " self.input_amount = amount\n", - " self._setup_schedule()\n", - "\n", - " def _setup_schedule(self):\n", - " \"\"\"\n", - " \"\"\"\n", - " # Generate dividend dates\n", - " months = FREQ_MAP[self.freq]\n", - "\n", - " \n", - " ## Generate dates using rrule\n", - " self.dates = list(rrule(freq=MONTHLY, interval=months, dtstart=self.start_date, until=self.end_date))\n", - " self.dates = [dt for dt in self.dates if compare_dates.is_after(dt, self.start_date)]\n", - " if not self.dates:\n", - " raise ValueError(\"No dividend dates generated. Check your start and end dates.\")\n", - "\n", - " # Handle amount (scalar or list)\n", - " if isinstance(self.input_amount, list):\n", - " if len(self.input_amount) < len(self.dates):\n", - " raise ValueError(\"Amount list must cover all dividend dates.\")\n", - " self.amounts = self.input_amount[:len(self.dates)]\n", - " else:\n", - " self.amounts = [self.input_amount] * len(self.dates)\n", - "\n", - " self.schedule = list(zip(self.dates, self.amounts))\n", - "\n", - " def get_schedule(self) -> List[Tuple[datetime, float]]:\n", - " return self.schedule\n", - " \n", - "\n", - " def get_year_fractions(self) -> List[Tuple[float, float]]:\n", - " return [\n", - " (time_distance_helper(dt, self.valuation_date), amt)\n", - " for dt, amt in self.schedule\n", - " if dt > self.valuation_date\n", - " ]\n", - " \n", - " def get_present_value(self, discount_rate: float, sum_up: bool=True, **kwargs) -> float:\n", - " \"\"\"\n", - " Calculate the present value of the dividend schedule using a discount rate.\n", - " discount_rate: float - The discount rate to apply.\n", - " \"\"\"\n", - " pv = []\n", - " for dt, amt in self.schedule:\n", - " if compare_dates.is_after(dt, self.valuation_date):\n", - " time_fraction = time_distance_helper(dt, self.valuation_date)\n", - " pv_amt = amt * math.exp(-discount_rate * time_fraction)\n", - " pv.append(pv_amt)\n", - " return sum(pv) if sum_up else pv\n", - " \n", - " def get_type(self) -> str:\n", - " \"\"\"\n", - " Get the type of the dividend schedule.\n", - " \"\"\"\n", - " return \"discrete\"\n", - " \n", - " def __repr__(self):\n", - " return f\"\"\n" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "class ContinuousDividendYield(Dividend):\n", - " def __init__(self, \n", - " yield_rate: float, \n", - " start_date: datetime, \n", - " end_date: datetime ,\n", - " valuation_date: datetime = None,\n", - " **kwargs):\n", - " \"\"\"\n", - " Initialize a ContinuousDividendYield object.\n", - " yield_rate: float - The continuous dividend yield (between 0 and 1).\n", - " start_date: datetime - The date when the yield starts.\n", - " valuation_date: datetime - The date for valuation purposes (default is start_date).\n", - " \"\"\"\n", - " super().__init__()\n", - " if not (0 <= yield_rate < 1):\n", - " raise ValueError(\"Dividend yield must be between 0 and 1.\")\n", - " self.yield_rate = yield_rate\n", - " self.start_date = start_date\n", - " self.valuation_date = valuation_date or start_date\n", - " self.end_date = end_date \n", - " self.T = time_distance_helper(self.end_date, self.valuation_date, )\n", - "\n", - " def get_yield(self) -> float:\n", - " return self.yield_rate\n", - "\n", - " def get_present_value(self, end_date: datetime = None, **kwargs) -> float:\n", - " \"\"\"\n", - " Return the exponential discount factor from q over T:\n", - " e^{-qT}\n", - " \"\"\"\n", - " T = self.T if end_date is None else time_distance_helper(end_date, self.valuation_date)\n", - " return math.exp(-self.yield_rate * T)\n", - " \n", - " def get_type(self) -> str:\n", - " \"\"\"\n", - " Get the type of the dividend yield.\n", - " \"\"\"\n", - " return \"continuous\"\n", - "\n", - " def __repr__(self):\n", - " return f\"\"\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Market Model" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2025-07-23 00:09:33 models.ipynb ERROR: Error fetching dividend schedule for TSLA: \n", - "[Error] -> Error getting data for TSLA: No dividend data found for TSLA\n" - ] - } - ], - "source": [ - "DIVIDEND_CACHE = CustomCache(\n", - " location = '/Users/chiemelienwanisobi/cloned_repos/QuantTools/.cache',\n", - " fname='dividend_cache',\n", - " clear_on_exit=True,)\n", - "\n", - "\n", - "from openbb import obb\n", - "def get_div_schedule(ticker, filter_specials=True):\n", - " if ticker not in DIVIDEND_CACHE:\n", - " try:\n", - " div_history = obb.equity.fundamental.dividends(symbol=ticker, provider='yfinance').to_df()\n", - " div_history.set_index('ex_dividend_date', inplace = True)\n", - " DIVIDEND_CACHE.set(ticker, div_history)\n", - "\n", - " div_history['amount'] = div_history['amount'].astype(float)\n", - " div_history.index = pd.to_datetime(div_history.index)\n", - " except Exception as e:\n", - " logger.error(f\"Error fetching dividend schedule for {ticker}: {e}\")\n", - " div_history = pd.DataFrame({'amount':[0]}, index = pd.bdate_range(start=OPTION_TIMESERIES_START_DATE, end=datetime.now(), freq='1Q'))\n", - " DIVIDEND_CACHE[ticker] = div_history\n", - " \n", - " else:\n", - " div_history = DIVIDEND_CACHE[ticker]\n", - " \n", - " # Filter out dividends >= 7.5\n", - " if filter_specials:\n", - " div_history = div_history[div_history['amount'] < 7.5]\n", - " \n", - " return div_history.sort_index()\n", - "aapl = get_div_schedule('TSLA')" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'quarterly'" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "valuation_date = '2025-01-05'\n", - "date_diffs = aapl.index.to_series().diff()\n", - "day_diffs = date_diffs.dt.days\n", - "most_common_day = day_diffs.mode()[0]\n", - "\n", - "def classify_frequency(days):\n", - " if 20 < days < 40:\n", - " return \"monthly\"\n", - " elif 50 < days < 80:\n", - " return \"bi-monthly\"\n", - " elif 80 < days < 110:\n", - " return \"quarterly\"\n", - " elif 170 < days < 200:\n", - " return \"semi-annual\"\n", - " elif 330 < days < 370:\n", - " return \"annual\"\n", - " else:\n", - " return \"irregular\"\n", - " \n", - "frequency_labels = day_diffs.apply(classify_frequency)\n", - "frequency_labels.mode()[0]\n" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.0" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import numpy as np\n", - "import pandas as pd\n", - "from datetime import datetime\n", - "from sklearn.linear_model import LinearRegression\n", - "\n", - "def infer_frequency(div_history: pd.DataFrame):\n", - " date_diffs = div_history.index.to_series().diff()\n", - " day_diffs = date_diffs.dt.days\n", - " most_common_day = day_diffs.mode()[0]\n", - " frequency_labels = day_diffs.apply(classify_frequency)\n", - " return frequency_labels.mode()[0]\n", - " \n", - "\n", - "def infer_dividend_growth_rate(div_df: pd.DataFrame, valuation_date: datetime, lookback_years: int = 5, method: str = 'cagr'):\n", - " # Ensure proper datetime format and sort\n", - " valuation_date = pd.to_datetime(valuation_date).date()\n", - " div_df = div_df.sort_index()\n", - " div_df = div_df.loc[div_df.index.date < valuation_date]\n", - "\n", - " if all(div_df.amount == 0.0):\n", - " return 0.0\n", - "\n", - " # Filter by lookback period\n", - " cutoff_date = valuation_date - pd.DateOffset(years=lookback_years)\n", - " df_filtered = div_df.loc[div_df.index.date >= cutoff_date.date()].copy()\n", - "\n", - " if len(df_filtered) < 2:\n", - " raise ValueError(\"Not enough data in the lookback window to estimate growth rate.\")\n", - " \n", - " if method == 'constant':\n", - " return 0.0 # No growth\n", - "\n", - " elif method == 'avg':\n", - " # Compute year-over-year changes\n", - " # Special cutoff to ensure we have enough data\n", - " # Avg needs at least 2 years of data to compare years\n", - " cutoff_date = valuation_date - pd.DateOffset(years=lookback_years+1)\n", - " df_filtered = div_df.loc[div_df.index.date >= cutoff_date.date()].copy()\n", - " df_filtered['year'] = df_filtered.index.year\n", - " yearly_avg = df_filtered.groupby('year')['amount'].mean()\n", - " diffs = yearly_avg.pct_change().dropna()\n", - " return diffs.mean()\n", - "\n", - " elif method == 'cagr':\n", - " first_date = df_filtered.index[0]\n", - " last_date = df_filtered.index[-1]\n", - " n_years = (last_date - first_date).days / DAILY_BASIS\n", - " start = df_filtered.iloc[0]['amount']\n", - " end = df_filtered.iloc[-1]['amount']\n", - " if start <= 0:\n", - " raise ValueError(\"Starting dividend must be positive for CAGR.\")\n", - " return (end / start) ** (1 / n_years) - 1\n", - "\n", - " elif method == 'regression':\n", - " df_filtered['ordinal_date'] = df_filtered.index.map(datetime.toordinal) ## Convert dates to ordinal (numbers) for regression\n", - " df_filtered['log_amount'] = np.log(df_filtered['amount']) ## Log-transform the amount for regression\n", - " X = df_filtered[['ordinal_date']]\n", - " y = df_filtered['log_amount']\n", - " model = LinearRegression().fit(X, y)\n", - " # Convert daily log return to annualized rate\n", - " annualized_growth = model.coef_[0] * DAILY_BASIS\n", - " return annualized_growth\n", - "\n", - " else:\n", - " raise ValueError(f\"Unknown method '{method}'. Choose from 'constant', 'avg', 'cagr', 'regression'.\")\n", - " \n", - "\n", - "def get_last_dividends(div_history: pd.DataFrame, valuation_date: datetime, size = 4) -> Tuple[datetime, float]:\n", - " \"\"\"\n", - " Get the nearest dividend date and amount after the valuation date.\n", - " \n", - " div_history: pd.DataFrame - Historical dividend data with 'amount' column.\n", - " valuation_date: datetime - The date for valuation purposes.\n", - " \n", - " Returns a tuple of (nearest_dividend_date, nearest_dividend_amount).\n", - " \"\"\"\n", - " valuation_date = format_dates(valuation_date)[0].date()\n", - " future_divs = div_history[div_history.index.date <= valuation_date]\n", - " \n", - " if future_divs.empty:\n", - " return 0.0\n", - " \n", - " # Get the last 'size' dividends before the valuation date\n", - " last_divs = sum(future_divs.tail(size)['amount'])\n", - " \n", - " return last_divs\n", - "\n", - "def project_dividends(\n", - " valuation_date: datetime,\n", - " end_date: datetime,\n", - " div_history: pd.DataFrame,\n", - " inferred_growth_rate: float,\n", - "):\n", - " \"\"\"\n", - " Project future dividends based on historical data and inferred growth rate.\n", - " \n", - " valuation_date: datetime - The date for valuation purposes.\n", - " expiration_date: datetime - The date when the option expires.\n", - " div_history: pd.DataFrame - Historical dividend data with 'amount' column.\n", - " inferred_growth_rate: float - Estimated annual growth rate of dividends.\n", - " \n", - " Returns a list of projected dividends with their payment dates.\n", - " \"\"\"\n", - " end_date, valuation_date = format_dates(end_date, valuation_date)\n", - " typical_spacing = div_history.index.to_series().diff().dt.days.mode()[0]\n", - " expected_dividend_size = int((subtract_dates(end_date, valuation_date) // typical_spacing) + 1)\n", - " period_inferred = classify_frequency(typical_spacing)\n", - " past_divs = div_history.loc[div_history.index.date < valuation_date.date()]\n", - " last_div = past_divs.iloc[-1]['amount'] if not past_divs.empty else 0.0\n", - " last_date = past_divs.index[-1].date() if not past_divs.empty else valuation_date\n", - " periodic_growth = inferred_growth_rate/ (12/FREQ_MAP[period_inferred])\n", - " dividend_list = [last_div * (1 + periodic_growth) ** i \n", - " for i in range(expected_dividend_size)]\n", - " \n", - " return dividend_list, [last_date + relativedelta(months=i * FREQ_MAP[period_inferred]) for i in range(expected_dividend_size)], last_date\n", - "\n", - "\n", - "infer_dividend_growth_rate(\n", - " aapl,\n", - " valuation_date=datetime(2025, 1, 5).date(),\n", - " lookback_years=5,\n", - " method='regression'\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(0, datetime.date(2024, 12, 31), 92.0, 'quarterly', 3, 238)" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "valuation_date=datetime(2025, 1, 5).date()\n", - "expiration_date = datetime(2025, 8, 31).date()\n", - "typical_spacing = aapl.index.to_series().diff().dt.days.mode()[0]\n", - "expected_dividend_size = int(((expiration_date - valuation_date).days // typical_spacing) + 1)\n", - "period_inferred = classify_frequency(typical_spacing)\n", - "past_divs = aapl.loc[aapl.index.date < valuation_date]\n", - "last_div = past_divs.iloc[-1]['amount']\n", - "last_date = past_divs.index[-1].date()\n", - "last_div, last_date, typical_spacing, period_inferred, expected_dividend_size, (expiration_date - valuation_date).days" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "([0.0, 0.0, 0.0], 0.0)" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "yearly_growth = infer_dividend_growth_rate(\n", - " aapl,\n", - " valuation_date=valuation_date,\n", - " lookback_years=2,\n", - " method='cagr'\n", - ")\n", - "periodic_growth = yearly_growth/ (12/FREQ_MAP[period_inferred])\n", - "dividend_list = [last_div * (1 + periodic_growth) ** i \n", - " for i in range(expected_dividend_size)]\n", - "dividend_list, yearly_growth" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "([0.0, 0.0, 0.0],\n", - " [datetime.date(2024, 12, 31),\n", - " datetime.date(2025, 3, 31),\n", - " datetime.date(2025, 6, 30)],\n", - " datetime.date(2024, 12, 31))" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "project_dividends(\n", - " valuation_date=datetime(2025, 1, 5).date(),\n", - " end_date = datetime(2025, 8, 31).date(),\n", - " div_history=aapl,\n", - " inferred_growth_rate=infer_dividend_growth_rate(\n", - " aapl,\n", - " valuation_date=datetime(2025, 1, 5).date(),\n", - " lookback_years=2,\n", - " method='cagr'\n", - " )\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "class MarketDividendSchedule(DividendSchedule):\n", - " \"\"\"\n", - " A dividend schedule that projects future dividends based on historical data and inferred growth rates.\n", - " This class extends the DividendSchedule class to include methods for inferring growth rates and projecting dividends.\n", - " \"\"\"\n", - " def __init__(self, ticker: str, \n", - " start_date: datetime, \n", - " end_date: datetime, \n", - " valuation_date: datetime = None, \n", - " lookback_years: int = DIVIDEND_LOOKBACK_YEARS, \n", - " **kwargs):\n", - " \"\"\"\n", - " Initialize a MarketDividendSchedule object.\n", - " ticker: str - The stock ticker symbol.\n", - " start_date: datetime - The start date for the dividend schedule.\n", - " end_date: datetime - The end date for the dividend schedule.\n", - " valuation_date: datetime - The date for valuation purposes (default is start_date).\n", - " lookback: int - Number of years to look back for historical dividends (default is 8).\n", - "\n", - " ps: user can set spot price at asset level by utilizing div_object.spot_price = xxx\n", - " \"\"\"\n", - " \n", - "\n", - " ## Validate Dates\n", - " validate_dates(valuation_date, start_date, end_date)\n", - "\n", - " ## Format Dates\n", - " valuation_date, start_date, end_date = format_dates(valuation_date, start_date, end_date)\n", - " \n", - " with Context(end_date=valuation_date.strftime(\"%Y-%m-%d\")): ## To ensure spot being accessed is for the specific valuation date\n", - " self.asset = Stock(ticker)\n", - " \n", - " div = get_div_schedule(ticker, filter_specials=True)\n", - " div = div[div.index.date <= valuation_date.date()] # Filter to include only dividends before the valuation date\n", - " self.ticker = ticker\n", - " self.lookback_years = lookback_years\n", - " self.div_history = div\n", - " self._projected_freq = self._infer_frequency(self.div_history)\n", - " self.growth_method = kwargs.get('growth_method', DIVIDEND_FORECAST_METHOD)\n", - " self.amount = 0.0\n", - " self.valuation_date = valuation_date or start_date\n", - " self.growth_rate = self._infer_growth_rate(self.div_history, lookback=self.lookback_years, method=self.growth_method)\n", - " self._projected_dividends, self.payment_dates = self._project_schedule(div_history=self.div_history, \n", - " start_date=start_date, end_date=end_date, \n", - " valuation_date=valuation_date, **kwargs)\n", - " self.model_start_date = start_date\n", - " \n", - " # # Create the schedule\n", - " super().__init__(\n", - " start_date=self.last_div_date or start_date,\n", - " end_date=end_date,\n", - " freq=self._projected_freq,\n", - " amount=self._projected_dividends,\n", - " valuation_date=valuation_date or start_date,\n", - " **kwargs\n", - " )\n", - " \n", - "\n", - " @property\n", - " def spot_price(self):\n", - " return self.asset.spot_price\n", - " \n", - "\n", - " @spot_price.setter\n", - " def spot_price(self, v):\n", - " self.asset.spot_price = v\n", - "\n", - " \n", - " def _infer_frequency(self, div_history):\n", - " \"\"\"\n", - " Infer the frequency of dividends based on the historical data.\n", - " \"\"\"\n", - " if div_history.empty:\n", - " return \"quarterly\"\n", - " return infer_frequency(div_history)\n", - " \n", - "\n", - " def _infer_growth_rate(self, div_history, lookback=8, method='cagr'):\n", - " \"\"\"\n", - " Infer the dividend growth rate based on historical data.\n", - " \"\"\"\n", - " if div_history.empty:\n", - " return 0.0\n", - " \n", - " return infer_dividend_growth_rate(\n", - " div_history,\n", - " valuation_date=self.valuation_date,\n", - " lookback_years=lookback,\n", - " method=method\n", - " )\n", - " \n", - " def _project_schedule(self, div_history, start_date, end_date, valuation_date=None, **kwargs):\n", - " \"\"\"\n", - " Project future dividends based on historical data and inferred growth rate.\n", - " \"\"\"\n", - " if div_history.empty:\n", - " return 0.0\n", - " dividend_list, payment_dates, last_date = project_dividends(\n", - " valuation_date=valuation_date or start_date,\n", - " end_date=end_date,\n", - " div_history=div_history,\n", - " inferred_growth_rate=self.growth_rate\n", - " )\n", - " self.last_div_date = last_date\n", - " return dividend_list, payment_dates" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "\n", - "\n", - "class MarketContinuousDividends(ContinuousDividendYield):\n", - " \"\"\"\n", - " A continuous dividend yield model that uses historical dividend data as forward dividend yield\n", - " \"\"\"\n", - " def __init__(self, ticker: str, \n", - " start_date: datetime, \n", - " end_date: datetime, \n", - " valuation_date: datetime = None, \n", - " spot_price: float = None,\n", - " **kwargs):\n", - " \"\"\"\n", - " Initialize a MarketContinuousDividends object.\n", - " ticker: str - The stock ticker symbol.\n", - " start_date: datetime - The start date for the dividend schedule.\n", - " end_date: datetime - The end date for the dividend schedule.\n", - " valuation_date: datetime - The date for valuation purposes (default is start_date).\n", - " lookback_years: int - Number of years to look back for historical dividends (default is 8).\n", - " \"\"\"\n", - " validate_dates(valuation_date, start_date, end_date)\n", - " valuation_date, start_date, end_date = format_dates(valuation_date, start_date, end_date)\n", - " div = get_div_schedule(ticker, filter_specials=True)\n", - " div = div[div.index.date <= valuation_date.date()] ## Filter to include only dividends before the valuation date\n", - " self.div = div\n", - " self._projected_freq = self._infer_frequency(div)\n", - " self.ticker = ticker\n", - " with Context(end_date=valuation_date.strftime(\"%Y-%m-%d\")): ## To ensure spot being accessed is for the specific valuation date\n", - " self.asset = Stock(ticker)\n", - " self.__set_yield_rate()\n", - " \n", - " # Initialize the ContinuousDividendYield with the inferred yield rate\n", - " super().__init__(\n", - " yield_rate=self.current_q,\n", - " start_date=start_date,\n", - " end_date=end_date,\n", - " valuation_date=valuation_date or start_date,\n", - " **kwargs\n", - " )\n", - "\n", - " @property\n", - " def spot_price(self):\n", - " return self.asset.spot_price\n", - " \n", - "\n", - " @spot_price.setter\n", - " def spot_price(self, v):\n", - " self.asset.spot_price = v\n", - " self.__set_yield_rate()\n", - "\n", - " def __set_yield_rate(self):\n", - " self.current_q = get_last_dividends(self.div, \n", - " valuation_date=valuation_date, \n", - " size=FREQ_MAP[self._projected_freq]) / self.spot_price \n", - " self.yield_rate = self.current_q\n", - " \n", - "\n", - "\n", - " def _infer_frequency(self, div_history):\n", - " \"\"\"\n", - " Infer the frequency of dividends based on the historical data.\n", - " \"\"\"\n", - " if div_history.empty:\n", - " return \"quarterly\"\n", - " return infer_frequency(div_history)" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{}" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "Stock.list_instances()" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Yield Rate before 10% bump: 0.003061224489795918\n", - "Yield Rate after 10% bump: 0.0027829313543599257\n" - ] - } - ], - "source": [ - "a=MarketContinuousDividends(\n", - " ticker='AAPL',\n", - " start_date=datetime(2024, 1, 2),\n", - " end_date=datetime(2025, 1, 2),\n", - " valuation_date=datetime(2025, 1, 6),\n", - ")\n", - "a.asset.clear_bump()\n", - "print(f\"Yield Rate before 10% bump: {a.yield_rate}\")\n", - "a.spot_price *= 1.10\n", - "print(f\"Yield Rate after 10% bump: {a.yield_rate}\")\n", - "a.asset.clear_bump()" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "916.5800170898438" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "aapl_div_schedule = MarketDividendSchedule(\n", - " ticker='COST',\n", - " start_date=datetime(2025, 1, 3),\n", - " end_date=datetime(2025, 8, 29),\n", - " valuation_date=datetime(2025, 1, 3),\n", - " lookback_years=1,\n", - " growth_method='cagr'\n", - ")\n", - "\n", - "aapl_div_schedule.spot_price\n" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[1.16, 1.214237436915176, 1.2710108217296003]" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "aapl_div_schedule.amounts" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Vectorized Dividends" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "from typing import List\n", - "\n", - "\n", - "## Seperate Market Query and Raw Calc Function\n", - "def get_div_histories(tickers:List):\n", - " assert_equal_length(tickers)\n", - " unique_ticks = set(tickers)\n", - " tick_history = {\n", - " t: get_div_schedule(t) for t in unique_ticks\n", - " }\n", - " return tick_history\n", - "def assert_equal_length(*args):\n", - " \"\"\"\n", - " Assert that all input lists have the same length.\n", - " \"\"\"\n", - " lengths = [len(arg) for arg in args]\n", - " if len(set(lengths)) != 1:\n", - " raise ValueError(\"All input lists must have the same length.\")\n", - " return True\n", - "\n", - "def convert_to_array(*args):\n", - " \"\"\"\n", - " Convert input lists to numpy arrays.\n", - " \"\"\"\n", - " return [np.asarray(arg) for arg in args]\n", - "\n", - "def get_vectorized_dividend_scehdule(\n", - " tickers:list|np.ndarray,\n", - " start_dates: List[datetime],\n", - " end_dates: List[datetime],\n", - " valuation_dates: List[datetime] = None,\n", - " **kwargs\n", - "):\n", - "\n", - " schedules = []\n", - " lookback_yrs = kwargs.get('lookback_yrs', DIVIDEND_LOOKBACK_YEARS)\n", - " method = kwargs.get('method', DIVIDEND_FORECAST_METHOD)\n", - " tick_history = get_div_histories(tickers) \n", - " for ticker, start_date, end_date, val_date in zip(\n", - " tickers,\n", - " start_dates,\n", - " end_dates,\n", - " valuation_dates\n", - " ):\n", - " gr = infer_dividend_growth_rate(tick_history[ticker], \n", - " val_date, \n", - " lookback_yrs, \n", - " method)\n", - " payments, dates, _ = project_dividends(valuation_date=val_date,\n", - " end_date=end_date,\n", - " div_history=tick_history[ticker],\n", - " inferred_growth_rate=gr)\n", - " schedules.append(list(zip(payments, dates)))\n", - " return schedules\n", - "\n", - "def vector_convert_to_time_frac(\n", - " schedules: List[list],\n", - " valuation_dates: List[datetime],\n", - " end_dates: List[datetime]\n", - "):\n", - " \"\"\"\n", - " Convert a list of schedules to a list of time fractions.\n", - " \n", - " schedules: List[list] - List of schedules where each schedule is a list of (amount, date) tuples.\n", - " valuation_dates: List[datetime] - List of valuation dates corresponding to each schedule.\n", - " end_dates: List[datetime] - List of end dates corresponding to each schedule.\n", - " \n", - " Returns a list of lists containing time fractions and amounts.\n", - " \"\"\"\n", - " assert_equal_length(schedules, valuation_dates, end_dates)\n", - " time_fractions = []\n", - " for i, sch in enumerate(schedules):\n", - " time_fractions.append([\n", - " (time_distance_helper(dt, valuation_dates[i]), amt) \n", - " for amt, dt in sch if compare_dates.is_after(dt, valuation_dates[i])\n", - " ])\n", - " return time_fractions\n", - "\n", - "def vectorized_discrete_pv(\n", - " schedules: List[list],\n", - " r: List[list],\n", - " _valuation_dates: List[datetime],\n", - " _end_dates: List[datetime]\n", - "):\n", - " assert_equal_length(schedules, r, _end_dates, _valuation_dates)\n", - " pv = []\n", - " for i,sch in enumerate(schedules):\n", - " pv.append(sum([ ## Calculating the sum\n", - " (x* math.exp(-r[i] * time_distance_helper(dt, _valuation_dates[i]))) ## Applying discount factor\n", - " for x, dt in sch if compare_dates.inbetween(dt, start=_valuation_dates[i],\n", - " end=_end_dates[i],\n", - " inclusive=False) ## Filtering for dt after Val\n", - " ]))\n", - " return pv\n", - "\n", - "\n", - "def get_vectorized_dividend_rate(\n", - " tickers:str|List[str],\n", - " spots: List[float],\n", - " valuation_dates: List[datetime]\n", - "):\n", - " \"\"\"\n", - " Get the vectorized dividend rate for a list of tickers based on their historical dividend data.\n", - " \n", - " tickers: str or List[str] - Ticker symbols of the stocks.\n", - " spots: List[float] - Current spot prices for each ticker.\n", - " valuation_dates: List[datetime] - Dates for which to calculate the dividend rates.\n", - " \n", - " Returns a numpy array of dividend rates.\n", - " \"\"\"\n", - " assert_equal_length(tickers, spots, valuation_dates)\n", - " tick_history = get_div_histories(tickers)\n", - " div_rates = [\n", - " get_last_dividends(tick_history[t], valuation_dates[i]) / spots[i]\n", - " for i, t in enumerate(tickers)\n", - " ] \n", - " return np.array(div_rates)\n", - "\n", - "\n", - "def get_vectorized_continuous_dividends(\n", - " div_rates: List[float],\n", - " _valuation_dates: List[datetime],\n", - " _end_dates: List[datetime]\n", - "):\n", - " assert_equal_length(div_rates, _valuation_dates, )\n", - " discounted = [\n", - " math.exp(-div_rate * time_distance_helper(_end_dates[i], _valuation_dates[i], ))\n", - " for i, div_rate in enumerate(div_rates)\n", - " ]\n", - " return np.array(discounted)\n", - " \n" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2025-07-23 00:09:44 trade.asset.Stock ERROR: Error getting previous close for COST from yfinance: 'prev_close'\n" - ] - }, - { - "data": { - "text/plain": [ - "[0.0, 3.313200930937935, 0.9885140505035921]" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "tickers = ['TSLA', 'CVX', 'KO']\n", - "r = [0.045, 0.055, 0.005]\n", - "spots=[100,200,300]\n", - "start_dates = [datetime(2025, 1, 5), datetime(2025, 1, 5), datetime(2025, 1, 5)]\n", - "end_dates = [datetime(2025, 8, 31), datetime(2025, 8, 31), datetime(2025, 8, 31)]\n", - "valuation_dates = [datetime(2025, 1, 5), datetime(2025, 1, 5), datetime(2025, 1, 5)]\n", - "schedules = get_vectorized_dividend_scehdule(\n", - " tickers=tickers,\n", - " start_dates=start_dates,\n", - " end_dates=end_dates,\n", - " valuation_dates=valuation_dates\n", - ")\n", - "discrete_pv = vectorized_discrete_pv(schedules, \n", - " r,\n", - " _valuation_dates=valuation_dates,\n", - " _end_dates=end_dates)\n", - "discrete_pv" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([1. , 0.97898159, 0.99579513])" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "div_rates = get_vectorized_dividend_rate(\n", - " tickers=tickers,\n", - " spots=spots,\n", - " valuation_dates=valuation_dates\n", - ")\n", - "cont_q = get_vectorized_continuous_dividends(\n", - " div_rates=div_rates,\n", - " _valuation_dates=valuation_dates,\n", - " _end_dates=end_dates\n", - "\n", - ")\n", - "cont_q" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### TESTS: MarketDividendSchedule MAE Test\n", - "\n", - "- Testing how MAE Changes for " - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "from random import randint, seed, random\n", - "from itertools import product\n", - "\n", - "## Get Tickers\n", - "tickers = [\n", - " 'AAPL',\n", - " 'BAC',\n", - " 'MA',\n", - " 'MSFT',\n", - " 'NEE',\n", - " 'O',\n", - " 'AVGO',\n", - " 'JNJ',\n", - " 'PG',\n", - " 'KO',\n", - " 'PEP',\n", - " 'XOM',\n", - " 'CVX',\n", - " 'VZ',\n", - " 'T',\n", - " 'WMT',\n", - " 'MCD',\n", - " 'HD',\n", - " 'PFE',\n", - " 'ABBV',\n", - " 'MMM',\n", - " 'JPM',\n", - " 'UNH',\n", - " 'TGT',\n", - "]\n", - "\n", - "tickers = set(tickers) # Ensure unique tickers\n", - "# Get Random Valuation Dates\n", - "valuation_dates = pd.bdate_range('2017-01-01', '2025-05-15')\n", - "_seed = np.random.seed(11)\n", - "randInts= np.random.random_integers(0, len(valuation_dates), 10)\n", - "valuation_dates = valuation_dates[randInts]\n", - "\n", - "## Start Date = Val_date - 1yr\n", - "start_dates = [ x - BDay(252) for x in valuation_dates]\n", - "\n", - "## End Date = Val Date + 1 Yr\n", - "end_dates = [ x + BDay(252) for x in valuation_dates]\n" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
amount
ex_dividend_date
1962-01-310.029762
1962-05-070.029762
1962-08-070.029762
1962-11-070.029762
1963-02-060.031250
......
2023-05-181.510000
2023-08-171.510000
2023-11-161.510000
2024-02-151.630000
2024-05-161.630000
\n", - "

220 rows × 1 columns

\n", - "
" - ], - "text/plain": [ - " amount\n", - "ex_dividend_date \n", - "1962-01-31 0.029762\n", - "1962-05-07 0.029762\n", - "1962-08-07 0.029762\n", - "1962-11-07 0.029762\n", - "1963-02-06 0.031250\n", - "... ...\n", - "2023-05-18 1.510000\n", - "2023-08-17 1.510000\n", - "2023-11-16 1.510000\n", - "2024-02-15 1.630000\n", - "2024-05-16 1.630000\n", - "\n", - "[220 rows x 1 columns]" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "aapl_div_schedule = MarketDividendSchedule(\n", - " ticker='CVX',\n", - " start_date=start_dates[0],\n", - " end_date=end_dates[0],\n", - " valuation_date=valuation_dates[0],\n", - " lookback_years=1,\n", - " growth_method='cagr'\n", - ")\n", - "aapl_div_schedule.div_history" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "def div_test(years=1, method='cagr'):\n", - " _product = list(product(tickers, list(zip(start_dates, end_dates, valuation_dates))))\n", - "\n", - " ## Seperate Tickers and Dates\n", - " tickers_list = [x[0] for x in _product]\n", - " start_dates_list =[x[1][0] for x in _product]\n", - " end_dates_list = [x[1][1] for x in _product]\n", - " val_dates_list = [x[1][2] for x in _product]\n", - "\n", - " ## Use Vectorized to get Dividend Schedules\n", - " schedules = get_vectorized_dividend_scehdule(\n", - " tickers=tickers_list,\n", - " start_dates=start_dates_list,\n", - " end_dates=end_dates_list,\n", - " valuation_dates=val_dates_list,\n", - " lookback_yrs=years,\n", - " method=method\n", - " )\n", - " forecasted_divs = np.asarray([sum([x[0] for x in inner_sch]) for inner_sch in schedules])\n", - "\n", - " ## Get actual Divs\n", - " actual_divs = []\n", - " for ticker, pack in _product:\n", - " start_date, end_date, val_date = pack\n", - " div_history = get_div_schedule(ticker, filter_specials=True)\n", - " actual_divs.append(div_history[(div_history.index.date >= val_date.date()) &\n", - " (div_history.index.date <= end_date.date())]['amount'].sum())\n", - " actual_divs = np.asarray(actual_divs)\n", - "\n", - " mae = np.mean(np.abs(forecasted_divs - actual_divs))\n", - " mse = np.mean((forecasted_divs - actual_divs) ** 2)\n", - " return mae, mse, forecasted_divs, actual_divs, _product" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [], - "source": [ - "res = div_test(1, method='avg')\n" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[]" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "tickers_list = [x[0] for x in res[-1]]\n", - "val_date = [x[1][2] for x in res[-1]]\n", - "start_dates_list = [x[1][0] for x in res[-1]]\n", - "end_dates_list = [x[1][1] for x in res[-1]]\n", - "data=pd.DataFrame({'tickers': tickers_list,\n", - " 'forecasted_divs': res[2],\n", - " 'actual_divs': res[3],\n", - " 'valuation_date': val_date,\n", - " 'start_date': start_dates_list,\n", - " 'end_date': end_dates_list})\n", - "parse = data[data.forecasted_divs.isna()][[\n", - " 'tickers', 'start_date', 'end_date', 'valuation_date',\n", - "]].T.values\n", - "\n", - "new_info = get_vectorized_dividend_scehdule(*parse, \n", - " lookback_yrs=1, \n", - " method='avg')\n", - "new_info" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### CAGR Test" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [], - "source": [ - "cagr_mae_mse = pd.DataFrame(index = range(1, 11))\n", - "for year in cagr_mae_mse.index:\n", - " mae, mse, forecast, actual, prod = div_test(year)\n", - " cagr_mae_mse.at[year, 'mae'] = mae\n", - " cagr_mae_mse.at[year, 'mse'] = mse" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
maemse
10.2400330.264383
20.2237100.199274
30.2193400.191144
40.2178380.189975
50.2191910.194396
60.2239300.203692
70.2275840.210536
80.2306340.217901
90.2384580.233203
100.2414520.248738
\n", - "
" - ], - "text/plain": [ - " mae mse\n", - "1 0.240033 0.264383\n", - "2 0.223710 0.199274\n", - "3 0.219340 0.191144\n", - "4 0.217838 0.189975\n", - "5 0.219191 0.194396\n", - "6 0.223930 0.203692\n", - "7 0.227584 0.210536\n", - "8 0.230634 0.217901\n", - "9 0.238458 0.233203\n", - "10 0.241452 0.248738" - ] - }, - "execution_count": 36, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "cagr_mae_mse" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Regression Test" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [], - "source": [ - "reg_mae_mse = pd.DataFrame(index = range(1, 11))\n", - "for year in reg_mae_mse.index:\n", - " mae, mse, forecast, actual, prod = div_test(year, method='regression')\n", - " reg_mae_mse.at[year, 'mae'] = mae\n", - " reg_mae_mse.at[year, 'mse'] = mse" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
maemse
10.2219250.190977
20.2127590.181556
30.2133860.183040
40.2138270.183573
50.2141810.186260
60.2161940.191255
70.2191350.197613
80.2224680.203856
90.2258270.210577
100.2281040.217710
\n", - "
" - ], - "text/plain": [ - " mae mse\n", - "1 0.221925 0.190977\n", - "2 0.212759 0.181556\n", - "3 0.213386 0.183040\n", - "4 0.213827 0.183573\n", - "5 0.214181 0.186260\n", - "6 0.216194 0.191255\n", - "7 0.219135 0.197613\n", - "8 0.222468 0.203856\n", - "9 0.225827 0.210577\n", - "10 0.228104 0.217710" - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "reg_mae_mse" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Avg Test" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [], - "source": [ - "avg_mae_mse = pd.DataFrame(index = range(1, 11))\n", - "for year in avg_mae_mse.index:\n", - " mae, mse, forecast, actual, prod = div_test(year, method='avg')\n", - " avg_mae_mse.at[year, 'mae'] = mae\n", - " avg_mae_mse.at[year, 'mse'] = mse" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
maemse
10.2084340.168747
20.2114270.175966
30.2130450.179357
40.2147780.185454
50.2204700.195815
60.2246870.203138
70.2292540.212254
80.2349930.220774
90.2427850.242282
100.2469440.257319
\n", - "
" - ], - "text/plain": [ - " mae mse\n", - "1 0.208434 0.168747\n", - "2 0.211427 0.175966\n", - "3 0.213045 0.179357\n", - "4 0.214778 0.185454\n", - "5 0.220470 0.195815\n", - "6 0.224687 0.203138\n", - "7 0.229254 0.212254\n", - "8 0.234993 0.220774\n", - "9 0.242785 0.242282\n", - "10 0.246944 0.257319" - ] - }, - "execution_count": 40, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "avg_mae_mse" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Combined Comparison" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "hovertemplate": "variable=CAGR
# Lookback Years=%{x}
value=%{y}", - "legendgroup": "CAGR", - "line": { - "color": "#636efa", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "CAGR", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "xaxis": "x", - "y": [ - 0.26438289193543657, - 0.19927411852439517, - 0.1911438884592191, - 0.18997455059102375, - 0.1943961633616723, - 0.2036924900722236, - 0.21053617238743452, - 0.21790068072930643, - 0.23320284779397918, - 0.24873817607088652 - ], - "yaxis": "y" - }, - { - "hovertemplate": "variable=Regression
# Lookback Years=%{x}
value=%{y}", - "legendgroup": "Regression", - "line": { - "color": "#EF553B", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "Regression", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "xaxis": "x", - "y": [ - 0.1909767947050421, - 0.181555726603503, - 0.18303960127166377, - 0.1835731947558392, - 0.18626001479675114, - 0.19125506088905958, - 0.19761284517415045, - 0.20385612164145486, - 0.21057712073178994, - 0.21771034830762345 - ], - "yaxis": "y" - }, - { - "hovertemplate": "variable=Average
# Lookback Years=%{x}
value=%{y}", - "legendgroup": "Average", - "line": { - "color": "#00cc96", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "Average", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "xaxis": "x", - "y": [ - 0.16874661213252326, - 0.17596566540226108, - 0.17935737212872202, - 0.18545362169387727, - 0.19581547757507767, - 0.20313778244348, - 0.2122541160315809, - 0.22077376745151975, - 0.2422819719448718, - 0.2573186592099577 - ], - "yaxis": "y" - } - ], - "layout": { - "legend": { - "title": { - "text": "variable" - }, - "tracegroupgap": 0 - }, - "margin": { - "t": 60 - }, - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "heatmapgl": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmapgl" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "xaxis": { - "anchor": "y", - "domain": [ - 0, - 1 - ], - "title": { - "text": "# Lookback Years" - } - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0, - 1 - ], - "title": { - "text": "value" - } - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "mse_combined = pd.concat([cagr_mae_mse['mse'], reg_mae_mse['mse'], avg_mae_mse['mse']], axis=1)\n", - "mse_combined.columns = ['CAGR', 'Regression', 'Average']\n", - "mse_combined.index.name = '# Lookback Years'\n", - "mse_combined.plot()" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "hovertemplate": "variable=CAGR
# Lookback Years=%{x}
value=%{y}", - "legendgroup": "CAGR", - "line": { - "color": "#636efa", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "CAGR", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "xaxis": "x", - "y": [ - 0.2400333840002957, - 0.22370953075384506, - 0.2193401070236921, - 0.2178376438713748, - 0.21919070722610368, - 0.22392972288148538, - 0.22758391618525184, - 0.23063410276283677, - 0.23845823905055594, - 0.2414519703788515 - ], - "yaxis": "y" - }, - { - "hovertemplate": "variable=Regression
# Lookback Years=%{x}
value=%{y}", - "legendgroup": "Regression", - "line": { - "color": "#EF553B", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "Regression", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "xaxis": "x", - "y": [ - 0.22192536300707572, - 0.21275903683469657, - 0.21338566727186936, - 0.21382743273798002, - 0.214180519980762, - 0.21619428682671435, - 0.21913470830019025, - 0.22246757289319305, - 0.22582734653646153, - 0.2281035465664246 - ], - "yaxis": "y" - }, - { - "hovertemplate": "variable=Average
# Lookback Years=%{x}
value=%{y}", - "legendgroup": "Average", - "line": { - "color": "#00cc96", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "Average", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10 - ], - "xaxis": "x", - "y": [ - 0.20843419270505947, - 0.21142715568683995, - 0.21304452963176257, - 0.21477756743541707, - 0.22047000576164563, - 0.22468700701207625, - 0.2292535466921936, - 0.2349932882310793, - 0.2427848254043026, - 0.2469437128532423 - ], - "yaxis": "y" - } - ], - "layout": { - "legend": { - "title": { - "text": "variable" - }, - "tracegroupgap": 0 - }, - "margin": { - "t": 60 - }, - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "heatmapgl": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmapgl" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "xaxis": { - "anchor": "y", - "domain": [ - 0, - 1 - ], - "title": { - "text": "# Lookback Years" - } - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0, - 1 - ], - "title": { - "text": "value" - } - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "mae_combined = pd.concat([cagr_mae_mse['mae'], reg_mae_mse['mae'], avg_mae_mse['mae']], axis=1)\n", - "mae_combined.columns = ['CAGR', 'Regression', 'Average']\n", - "mae_combined.index.name = '# Lookback Years'\n", - "mae_combined.plot()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## FORWARDS" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Base Model " - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [], - "source": [ - "dividend_factory = {\n", - " \"discrete\": DividendSchedule,\n", - " \"continuous\": ContinuousDividendYield\n", - "}\n", - "\n", - "class ForwardModel(ABC):\n", - " @abstractmethod\n", - " def get_forward_price(self) -> float:\n", - " \"\"\"\n", - " Calculate the forward price.\n", - " \"\"\"\n", - " pass\n", - "\n", - " @abstractmethod\n", - " def summary(self) -> dict:\n", - " \"\"\"\n", - " Return a summary of the forward model.\n", - " \"\"\"\n", - " pass\n", - "\n", - " @abstractmethod\n", - " def get_end_date(self) -> datetime:\n", - " \"\"\"\n", - " Get the end date of the forward contract.\n", - " \"\"\"\n", - " pass\n", - "\n", - " @abstractmethod\n", - " def get_start_date(self) -> datetime:\n", - " \"\"\"\n", - " Get the start date of the forward contract.\n", - " \"\"\"\n", - " pass\n", - "\n", - "\n", - "## Should regular Forward initialize a Market Dividend?: No, seperated to AssetMarketForward\n", - "## Technically, regular Forward is a Model. It differs from market forward because it is the actual Forward/Future Price: No reply needed\n", - "## Decided to separate the two classes to avoid confusion and maintain clarity in the API.\n", - "## Should Dividends see Stock & Stock see dividends?: Stock can't see dividends, but it can have a dividend schedule.\n", - " ## Dividends can see stock.\n", - "\n", - "class Forward(ForwardModel):\n", - " def __init__(self,\n", - " start_date: datetime|str,\n", - " end_date: datetime|str,\n", - " risk_free_rate: float,\n", - " dividend_type: str,\n", - " dividend: Union[Dividend, None] = None,\n", - " valuation_date: datetime = None,\n", - " spot_price: float=None,\n", - " freq: str = \"quarterly\",\n", - " div_amount: Union[float, List[float]] = 1.0,\n", - " **kwargs):\n", - " \"\"\"\n", - " Initialize a Forward object.\n", - " start_date: datetime or str - The start date of the forward contract.\n", - " end_date: datetime or str - The end date of the forward contract.\n", - " spot_price: float - The current spot price of the underlying asset.\n", - " risk_free_rate: float - The risk-free interest rate (annualized).\n", - " dividend_type: str - The type of dividend ('discrete' or 'continuous').\n", - " dividend: Dividend or None - An instance of a Dividend subclass or None.\n", - " valuation_date: datetime - The date for valuation purposes (default is start_date). \n", - " freq: str - The frequency of dividends ('monthly', 'quarterly', 'semiannual', 'annual').\n", - " div_amount: float or list - The dividend amount (can be a scalar or a list). For discrete dividends, this is the amount per period, while for continuous dividends, it is the yield rate.\n", - " \"\"\"\n", - "\n", - " \n", - " self.spot_price = spot_price\n", - " self.risk_free_rate = risk_free_rate\n", - " self.dividend_type = dividend_type\n", - " self.valuation_date = pd.to_datetime(valuation_date) if valuation_date else pd.to_datetime(start_date) \n", - " self.start_date = start_date if isinstance(start_date, datetime) else pd.to_datetime(start_date)\n", - " self.end_date = end_date if isinstance(end_date, datetime) else pd.to_datetime(end_date) \n", - " self._initalize_dividend(dividend_type=dividend_type, \n", - " dividend=dividend, \n", - " freq=freq, \n", - " div_amount=div_amount, **kwargs)\n", - " \n", - "\n", - "\n", - " def _initalize_dividend(self, \n", - " dividend_type: str, \n", - " dividend:Union[None, Dividend], \n", - " freq:str, \n", - " div_amount:float, \n", - " ticker = None,\n", - " **kwargs):\n", - " \"\"\"\n", - " Initialize the dividend based on the type.\n", - " \"\"\"\n", - " ## Ensure dividend is permitted\n", - " if dividend is None:\n", - " if dividend_type not in dividend_factory:\n", - " raise ValueError(f\"Unsupported dividend type '{dividend_type}'. Use one of {list(dividend_factory.keys())}.\")\n", - " \n", - " ## Create the dividend object based on the type\n", - " if isinstance(dividend, Dividend):\n", - " self.dividend = dividend\n", - "\n", - " elif dividend_type == 'continuous':\n", - "\n", - " logger.info(\"No ticker provided for a continuous dividend yield. Will construct ContinuousDividendYield instead.\")\n", - " self.dividend = ContinuousDividendYield(\n", - " yield_rate=div_amount,\n", - " start_date=self.start_date,\n", - " end_date=self.end_date,\n", - " valuation_date=self.valuation_date\n", - " )\n", - " elif dividend_type == 'discrete':\n", - " logger.info(\"No ticker provided for a discrete dividend schedule. Will construct DividendSchedule instead.\")\n", - " self.dividend = DividendSchedule(\n", - " start_date=self.start_date,\n", - " end_date=self.end_date,\n", - " freq=freq,\n", - " amount=div_amount,\n", - " valuation_date=self.valuation_date\n", - " )\n", - "\n", - " elif not isinstance(dividend, Dividend):\n", - " raise TypeError(\"Dividend must be an instance of Dividend or its subclasses.\")\n", - " \n", - " def summary(self) -> dict:\n", - " return {\n", - " \"spot\": self.spot_price,\n", - " \"forward\": self.get_forward_price(),\n", - " \"type\": self.dividend.get_type(),\n", - " \"valuation\": self.valuation_date.date(),\n", - " \"expiry\": self.end_date.date()\n", - " }\n", - "\n", - " def get_forward_price(self) -> float:\n", - " \"\"\"\n", - " Calculate the forward price using the formula:\n", - " F = S * e^{(r - q)T}\n", - " where:\n", - " S = spot price\n", - " r = risk-free rate\n", - " q = dividend yield\n", - " T = time to maturity in years\n", - " \"\"\"\n", - " T = time_distance_helper(self.end_date, self.valuation_date)\n", - " if T <= 0:\n", - " raise ValueError(\"End date must be after valuation date.\")\n", - " \n", - " # Get the present value of the dividend\n", - " if self.dividend.get_type() == \"discrete\":\n", - " dividend_pv = self.dividend.get_present_value(self.risk_free_rate, sum_up = True)\n", - " return (self.spot_price - dividend_pv) * math.exp(self.risk_free_rate * T)\n", - " elif self.dividend.get_type() == \"continuous\":\n", - " dividend_factor = self.dividend.get_present_value(self.end_date, **{})\n", - " return self.spot_price * (math.exp(self.risk_free_rate * T) * dividend_factor) ## Already discounted\n", - " else:\n", - " raise ValueError(f\"Unsupported dividend type '{self.dividend.get_type()}'. Use 'discrete' or 'continuous'.\")\n", - " \n", - " def get_end_date(self) -> datetime:\n", - " return self.end_date\n", - " def get_start_date(self) -> datetime:\n", - " return self.start_date\n", - "\n", - " def __repr__(self):\n", - " return f\"\"\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Market Model" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [], - "source": [ - "## Would it be better to have Forward access Stock? And enforce singleton?\n", - "## For spot bumps, we can have a setter, where additions are moved to bump var, and anytime spot is called, it returns the spot + bump.\n", - "## Probably would be a good idea to cache spot timeseries in Stock.\n", - "\n", - "\n", - "class MarketForward(ForwardModel):\n", - " def __init__(self, forward_price: float, start_date: datetime, end_date: datetime):\n", - " \"\"\"\n", - " Initialize a MarketForward object.\n", - " forward_price: float - The market forward price.\n", - " start_date: datetime - The start date of the forward contract.\n", - " end_date: datetime - The end date of the forward contract.\n", - " \"\"\"\n", - " self.forward_price = forward_price\n", - " self.start_date = start_date\n", - " self.end_date = end_date\n", - "\n", - " def get_forward_price(self) -> float:\n", - " return self.forward_price\n", - "\n", - " def summary(self) -> dict:\n", - " return {\n", - " \"forward\": self.forward_price,\n", - " \"start_date\": self.start_date.date(),\n", - " \"end_date\": self.end_date.date()\n", - " }\n", - " \n", - " def get_end_date(self) -> datetime:\n", - " return self.end_date\n", - " def get_start_date(self) -> datetime:\n", - " return self.start_date\n", - " def __repr__(self):\n", - " return f\"\"\n", - " \n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Asset Model" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "class EquityForward(Forward):\n", - " def __init__(self,\n", - " start_date: datetime|str,\n", - " end_date: datetime|str,\n", - " dividend_type: str,\n", - " dividend: Union[Dividend, None] = None,\n", - " valuation_date: datetime = None,\n", - " risk_free_rate: float = None,\n", - " spot_price: float=None,\n", - " ticker = None,\n", - " **kwargs):\n", - " \n", - " \n", - " self.dividend_type = dividend_type\n", - " self.valuation_date = pd.to_datetime(valuation_date) if valuation_date else pd.to_datetime(start_date) \n", - " self.start_date = start_date if isinstance(start_date, datetime) else pd.to_datetime(start_date)\n", - " self.end_date = end_date if isinstance(end_date, datetime) else pd.to_datetime(end_date) \n", - " self.ticker = ticker\n", - " self.forward_spot_price = spot_price\n", - " self._initalize_dividend(dividend_type=dividend_type,\n", - " dividend=dividend, \n", - " ticker=ticker, **kwargs)\n", - " self.risk_free_rate = risk_free_rate or self.dividend.asset.rf_rate\n", - "\n", - " @property\n", - " def spot_price(self):\n", - " logger.info(f\"Accessing spot_price of {self.ticker} from {self.dividend.__class__.__name__}\")\n", - " if isinstance(self.dividend, (MarketContinuousDividends,\n", - " MarketDividendSchedule)):\n", - " return self.dividend.spot_price\n", - " \n", - " @spot_price.setter\n", - " def spot_price(self, v):\n", - " logger.info(f\"Setting spot_price of {self.ticker} to {v} in {self.dividend.__class__.__name__}\")\n", - " if isinstance(self.dividend, (MarketContinuousDividends,\n", - " MarketDividendSchedule)):\n", - " self.dividend.spot_price = v\n", - " self.forward_spot_price = v\n", - " else:\n", - " raise TypeError(\"Spot price can only be set for MarketContinuousDividends or MarketDividendSchedule.\")\n", - " \n", - "\n", - "\n", - " def _initalize_dividend(self, \n", - " dividend_type: str, \n", - " dividend:Union[None, Dividend], \n", - " ticker = None,\n", - " **kwargs):\n", - " \"\"\"\n", - " Initialize the dividend based on the type.\n", - " \"\"\"\n", - " ## Ensure dividend is permitted\n", - " if dividend is None:\n", - " if dividend_type not in dividend_factory:\n", - " raise ValueError(f\"Unsupported dividend type '{dividend_type}'. Use one of {list(dividend_factory.keys())}.\")\n", - " \n", - " ## Create the dividend object based on the type\n", - " if isinstance(dividend, Dividend):\n", - " self.dividend = dividend\n", - "\n", - " elif dividend_type == 'continuous':\n", - " logger.info(\"Ticker provided for a continuous dividend yield. Will construct MarketContinuousDividends instead.\")\n", - " self.dividend = MarketContinuousDividends(\n", - " ticker=ticker,\n", - " start_date=self.start_date,\n", - " end_date=self.end_date,\n", - " valuation_date=self.valuation_date,\n", - " spot_price=self.forward_spot_price\n", - " )\n", - " elif dividend_type == 'discrete':\n", - " logger.info(\"Ticker provided for a discrete dividend schedule. Will construct MarketDividendSchedule instead.\")\n", - " self.dividend = MarketDividendSchedule(\n", - " ticker=ticker,\n", - " start_date=self.start_date,\n", - " end_date=self.end_date,\n", - " valuation_date=self.valuation_date,\n", - " lookback_years=kwargs.get('lookback_years', DIVIDEND_LOOKBACK_YEARS),\n", - " growth_method=kwargs.get('growth_method', DIVIDEND_FORECAST_METHOD),\n", - " spot_price=self.forward_spot_price\n", - " )\n", - "\n", - " elif not isinstance(dividend, Dividend):\n", - " raise TypeError(\"Dividend must be an instance of Dividend or its subclasses.\")\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Vectorized Forwards" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": {}, - "outputs": [], - "source": [ - "# ----------------------\n", - "# Vectorized Forward Models\n", - "# ----------------------\n", - "\n", - "def vectorized_forward_continuous(S, r, q_factor, T):\n", - " \"\"\"\n", - " S: spot prices (array)\n", - " r: risk-free rates (array)\n", - " q: Discounted Dividend Factor\n", - " T: time to maturity (array)\n", - " \"\"\"\n", - " assert_equal_length(S, r, q_factor, T)\n", - " S, r, T, q_factor = convert_to_array(S, r, T, q_factor)\n", - " return S * np.exp(r * T) * q_factor\n", - "\n", - "def vectorized_forward_discrete(S, r, T, pv_divs):\n", - " \"\"\"\n", - " S: spot prices (array)\n", - " r: risk-free rates (array)\n", - " T: time to maturity (array)\n", - " pv_divs: Summation of present value of all dividends till end date\n", - " \"\"\"\n", - " assert_equal_length(S, r, pv_divs, T)\n", - " S, r, T, pv_divs = convert_to_array(S, r, T, pv_divs)\n", - " forward = (S - pv_divs) * np.exp(r * T)\n", - " return forward" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(array([102.97565159, 202.94061447, 299.71342922]),\n", - " array([102.97565159, 203.86358679, 299.98726676]))" - ] - }, - "execution_count": 47, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "tickers = ['TSLA', 'CVX', 'KO']\n", - "r = [0.045, 0.055, 0.005]\n", - "spots=[100,200,300]\n", - "start_dates = [datetime(2025, 1, 5), datetime(2025, 1, 5), datetime(2025, 1, 5)]\n", - "end_dates = [datetime(2025, 8, 31), datetime(2025, 8, 31), datetime(2025, 8, 31)]\n", - "valuation_dates = [datetime(2025, 1, 5), datetime(2025, 1, 5), datetime(2025, 1, 5)]\n", - "vector_f_discrete = vectorized_forward_discrete(\n", - " S=spots,\n", - " r=r,\n", - " T=[time_distance_helper(end_dates[i], valuation_dates[i]) for i in range(len(end_dates))],\n", - " pv_divs=discrete_pv\n", - ")\n", - "\n", - "vector_f_continuous = vectorized_forward_continuous(\n", - " S=spots,\n", - " r=r,\n", - " q_factor=cont_q,\n", - " T=[time_distance_helper(end_dates[i], valuation_dates[i]) for i in range(len(end_dates))]\n", - ")\n", - "\n", - "vector_f_continuous, vector_f_discrete" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### TESTS" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Plain Model (No Tickers)" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "105.12351191991695\n", - "0.0\n", - "[0.0, 0.0, 0.0, 0.0]\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 48, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "forward = Forward(\n", - " start_date=\"2023-01-01\",\n", - " end_date=\"2024-01-01\",\n", - " spot_price=100,\n", - " risk_free_rate=0.05,\n", - " dividend_type=\"discrete\",\n", - " freq=\"quarterly\",\n", - " div_amount=[0, 0, 0, 0]\n", - ")\n", - "print(forward.get_forward_price()) # Example usage\n", - "print(forward.dividend.get_present_value(forward.risk_free_rate, sum_up=True))\n", - "print(forward.dividend.get_present_value(forward.risk_free_rate, sum_up=False))\n", - "forward" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "105.12351191991695\n" - ] - } - ], - "source": [ - "forward_continous = Forward(\n", - " start_date=\"2023-01-01\",\n", - " end_date=\"2024-01-01\",\n", - " spot_price=100,\n", - " risk_free_rate=0.05,\n", - " dividend_type=\"continuous\",\n", - " div_amount=0.0 # 2% continuous dividend yield\n", - ")\n", - "print(forward_continous.get_forward_price()) # Example usage" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Model (Tickers)\n", - "\n", - "- This section carries out market data injections. Instead of relying on user inputs for" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "129.54945167385944\n", - "0.9198354331887906\n", - "[0.22914318517856802, 0.22972632646061583, 0.23023038067973967, 0.23073554086986708]\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 50, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "forward = EquityForward(\n", - " start_date=\"2023-01-03\",\n", - " end_date=\"2024-01-03\",\n", - " risk_free_rate=None,\n", - " # risk_free_rate=0.05,\n", - " dividend_type=\"discrete\",\n", - " ticker = 'AAPL'\n", - ")\n", - "print(forward.get_forward_price()) # Example usage\n", - "print(forward.dividend.get_present_value(forward.risk_free_rate, sum_up=True))\n", - "print(forward.dividend.get_present_value(forward.risk_free_rate, sum_up=False))\n", - "forward" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[0.23, 0.2329913294797688, 0.23602156353369644, 0.23909120814612894]" - ] - }, - "execution_count": 51, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "forward.dividend.asset.rf_rate\n", - "forward.risk_free_rate\n", - "forward.dividend.amounts" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "125.06999969482422" - ] - }, - "execution_count": 52, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "forward.dividend.spot_price" - ] - }, - { - "cell_type": "code", - "execution_count": 53, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "130.75511472843496\n" - ] - } - ], - "source": [ - "forward_continous = EquityForward(\n", - " start_date=\"2023-01-03\",\n", - " end_date=\"2024-01-03\",\n", - " risk_free_rate=0.05,\n", - " dividend_type=\"continuous\",\n", - " div_amount=0.0, # 2% continuous dividend yield\n", - " ticker = 'AAPL'\n", - ")\n", - "print(forward_continous.get_forward_price()) # Example usage" - ] - }, - { - "cell_type": "code", - "execution_count": 54, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.005516910543564624" - ] - }, - "execution_count": 54, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "forward_continous.dividend.spot_price \n", - "forward_continous.dividend.yield_rate " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## BLACK SCHOLES MODEL" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### BASE" - ] - }, - { - "cell_type": "code", - "execution_count": 55, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "\n", - "class BlackScholes:\n", - " __GREEK_CALCULATION_STYLE = 'analytic' # Default to analytic Greeks, else numerical\n", - " def __init__(self,\n", - " strike_price: float,\n", - " expiration: datetime,\n", - " risk_free_rate: float,\n", - " volatility: float,\n", - " start_date: datetime,\n", - " spot_price: float,\n", - " dividend_type: str = 'discrete',\n", - " valuation_date: datetime = None,\n", - " freq: str = \"quarterly\",\n", - " div_amount: Union[float, List[float]] = 1.0,\n", - " option_type: str = \"c\"):\n", - " \"\"\"\n", - " Black-Scholes model using forward price directly.\n", - "\n", - " Parameters:\n", - " - forward: F (e.g., from a ForwardModel)\n", - " - strike_price: K\n", - " - expiration: T (datetime)\n", - " - risk_free_rate: r\n", - " - volatility: sigma (annualized)\n", - " - option_type: \"call\" or \"put\"\n", - " \"\"\" \n", - " self.T = time_distance_helper(expiration, valuation_date)\n", - " risk_free_rate = float(risk_free_rate) if risk_free_rate else 0 # Ensure risk-free rate is a float\n", - " option_inputs_assert(sigma=volatility,\n", - " K=strike_price,\n", - " S0=spot_price,\n", - " T=self.T,\n", - " r=risk_free_rate,\n", - " market_price=0.1,\n", - " q=0.0,\n", - " flag=option_type.lower(),)\n", - " self.forward= Forward(\n", - " start_date=start_date,\n", - " end_date=expiration,\n", - " spot_price=spot_price,\n", - " risk_free_rate=risk_free_rate,\n", - " dividend_type=dividend_type,\n", - " valuation_date=valuation_date,\n", - " freq=freq,\n", - " div_amount=div_amount\n", - " )\n", - " self.expiration = expiration\n", - " self.F = self.forward.get_forward_price()\n", - " self.K = strike_price\n", - " \n", - " self.r = risk_free_rate\n", - " self.sigma = volatility\n", - " self.option_type = option_type.lower()\n", - " self.finite_estimator = FiniteGreeksEstimator(\n", - " price_func=self.price,\n", - " base_params={\n", - " 'F': self.F,\n", - " 'K': self.K,\n", - " 'T': self.T,\n", - " 'r': self.r,\n", - " 'sigma': self.sigma,\n", - " 'q': 0.0, # Assuming no continuous dividend yield for simplicity\n", - " 'S': spot_price, # Including spot price for delta calculation\n", - " 'option_type': self.option_type\n", - " },\n", - " dx_thresh=0.00001,\n", - " method='central' # Use backward method for finite differences\n", - " )\n", - "\n", - " # Ensure option_type is either 'call' or 'put'\n", - " if self.option_type not in [\"c\", \"p\"]:\n", - " raise ValueError(\"option_type must be 'c' or 'p'\")\n", - " \n", - " @property\n", - " def valuation_date(self):\n", - " return self.forward.valuation_date\n", - "\n", - " @property\n", - " def spot_price(self):\n", - " return self.forward.spot_price\n", - "\n", - " \n", - " @classmethod\n", - " def set_greek_calculation_style(cls, style: str):\n", - " \"\"\"\n", - " Set the style for Greek calculations.\n", - " :param style: 'analytic' or 'numerical'\n", - " \"\"\"\n", - " if style not in ['analytic', 'numerical']:\n", - " raise ValueError(\"Style must be either 'analytic' or 'numerical'\")\n", - " cls.__GREEK_CALCULATION_STYLE = style\n", - "\n", - " @classmethod\n", - " def get_greek_calculation_style(cls) -> str:\n", - " \"\"\"\n", - " Get the current Greek calculation style.\n", - " :return: 'analytic' or 'numerical'\n", - " \"\"\"\n", - " return cls.__GREEK_CALCULATION_STYLE\n", - "\n", - "\n", - " def _d1(self):\n", - " # d1 = [ln(F/K) + 0.5*sigma^2*T] / (sigma * sqrt(T))\n", - " numerator = math.log(self.F / self.K) + 0.5 * self.sigma ** 2 * self.T\n", - " denominator = self.sigma * math.sqrt(self.T)\n", - " return numerator / denominator\n", - "\n", - " def _d2(self):\n", - " # d2 = d1 - sigma * sqrt(T)\n", - " return self._d1() - self.sigma * math.sqrt(self.T)\n", - "\n", - " def price(self, F=None, K=None, T=None, r=None, sigma=None, option_type=None, S=None,*args, **kwargs) -> float:\n", - " # Compute option price using forward-based Black-Scholes formula\n", - " # Call price: e^(-rT) * (F * N(d1) - K * N(d2))\n", - " # Put price: e^(-rT) * (K * N(-d2) - F * N(-d1))\n", - "\n", - " ## Handle Forward Price, it has to be repriced\n", - " temp_S = self.forward.spot_price \n", - " temp_rf = self.forward.risk_free_rate\n", - "\n", - "\n", - " ## New inputs into the forward model\n", - " self.forward.spot_price = S if S is not None else temp_S \n", - " self.forward.risk_free_rate = r if r is not None else temp_rf\n", - " if T is not None:\n", - " # Set valuation date back so that (end_date - valuation_date) = T\n", - " temp_val_date = self.forward.valuation_date\n", - " new_val_date = self.expiration - timedelta(days=T * DAILY_BASIS)\n", - " self.forward.valuation_date = new_val_date\n", - " self.forward.dividend.valuation_date = new_val_date\n", - "\n", - "\n", - " else:\n", - " temp_val_date = self.forward.valuation_date\n", - "\n", - "\n", - " ## Recalculate the forward price\n", - " F = self.forward.get_forward_price()\n", - "\n", - " ## Reset the forward inputs\n", - " self.forward.spot_price = temp_S # Reset to original spot price\n", - " self.forward.risk_free_rate = temp_rf\n", - " self.forward.valuation_date = temp_val_date\n", - " self.forward.dividend.valuation_date = temp_val_date\n", - "\n", - "\n", - " # Ensure all parameters are numpy arrays for vectorized operations\n", - " K = np.asarray(K) if K is not None else self.K\n", - " T = np.asarray(T) if T is not None else self.T\n", - " r = np.asarray(r) if r is not None else self.r\n", - " sigma = np.asarray(sigma) if sigma is not None else self.sigma\n", - " option_type = option_type if option_type is not None else self.option_type\n", - "\n", - " return black_scholes_vectorized(F, K, T, r, sigma, option_type=option_type)\n", - " def summary(self) -> dict:\n", - " # Return a dictionary summarizing the model inputs and price\n", - " return {\n", - " \"forward\": self.F,\n", - " \"strike\": self.K,\n", - " \"T\": self.T,\n", - " \"r\": self.r,\n", - " \"vol\": self.sigma,\n", - " \"type\": self.option_type,\n", - " \"price\": self.price()\n", - " }\n", - " \n", - " def greeks(self) -> dict:\n", - " \"\"\"\n", - " Calculate the Greeks using finite differences.\n", - " Returns a dictionary with keys 'delta', 'gamma', 'vega', 'theta', 'rho'.\n", - " \"\"\"\n", - " if self.__GREEK_CALCULATION_STYLE == 'analytic':\n", - " greek = black_scholes_analytic_greeks_vectorized(\n", - " F=self.F, \n", - " K=self.K, \n", - " T=self.T, \n", - " r=self.r, \n", - " sigma=self.sigma, \n", - " option_type=self.option_type\n", - " )\n", - " \n", - " elif self.__GREEK_CALCULATION_STYLE == 'numerical':\n", - " greek = self.finite_estimator.all_first_order()\n", - " greek.update(self.finite_estimator.all_second_order())\n", - " \n", - " else:\n", - " raise ValueError(f\"Unknown Greek calculation style '{self.GREEK_CALCULATION_STYLE}'. Use 'analytic' or 'numerical'.\")\n", - " greek = dict(sorted(greek.items(), key=lambda item: item[0]))\n", - " return greek\n", - " \n", - " def __repr__(self):\n", - " return f\"\"\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Market" - ] - }, - { - "cell_type": "code", - "execution_count": 56, - "metadata": {}, - "outputs": [], - "source": [ - "class MarketBlackScholes(BlackScholes):\n", - " def __init__(self,\n", - " ticker: str,\n", - " strike_price: float,\n", - " expiration: datetime,\n", - " risk_free_rate: float,\n", - " volatility: float,\n", - " start_date: datetime,\n", - " dividend_type: str = 'discrete',\n", - " valuation_date: datetime = None,\n", - " option_type: str = \"c\"):\n", - " \"\"\"\n", - " Market Black-Scholes model using forward price directly.\n", - " \"\"\"\n", - " super().__init__(strike_price=strike_price,\n", - " expiration=expiration,\n", - " risk_free_rate=risk_free_rate,\n", - " volatility=volatility,\n", - " start_date=start_date,\n", - " spot_price=1, ## Spot price will be set later from the forward\n", - " dividend_type=dividend_type,\n", - " valuation_date=valuation_date,\n", - " freq='quarterly', ## Default to allow initialization\n", - " div_amount=0,\n", - " option_type=option_type)\n", - " \n", - " ## Override super's initialization of forward with EquityForward\n", - " self.forward= EquityForward(\n", - " start_date=start_date,\n", - " end_date=expiration,\n", - " dividend_type=dividend_type,\n", - " dividend=None, # Market dividend will be set later\n", - " valuation_date=valuation_date,\n", - " risk_free_rate=risk_free_rate,\n", - " spot_price=None, \n", - " ticker=ticker\n", - " )\n", - "\n", - " self.expiration = expiration\n", - " self.F = self.forward.get_forward_price()\n", - " self.r = self.forward.risk_free_rate\n", - " self.finite_estimator = FiniteGreeksEstimator(\n", - " price_func=self.price,\n", - " base_params={\n", - " 'F': None,\n", - " 'K': self.K,\n", - " 'T': self.T,\n", - " 'r': self.r,\n", - " 'sigma': self.sigma,\n", - " 'q': 0.0, # Assuming no continuous dividend yield for simplicity\n", - " 'S': self.spot_price, # Including spot price for delta calculation\n", - " 'option_type': self.option_type\n", - " },\n", - " dx_thresh=0.00001,\n", - " method='central' # Use backward method for finite differences\n", - " )\n", - "\n", - "\n", - " @property\n", - " def spot_price(self):\n", - " \"\"\"\n", - " Override spot_price to use the forward's spot price.\n", - " \"\"\"\n", - " return self.forward.spot_price\n", - "\n", - " def price(self, F=None, K=None, T=None, r=None, sigma=None, option_type=None, S=None,*args, **kwargs) -> float:\n", - " \"\"\"\n", - " Override price method to use the forward price from the EquityForward.\n", - " \"\"\"\n", - " ## S, if user overrides Spot, need to update forward spot price\n", - " if S is not None:\n", - " self.forward.spot_price = S\n", - " else:\n", - " S = self.forward.spot_price\n", - "\n", - "\n", - " ## If K is not provided, use the BSM Model's strike price\n", - " if K is None:\n", - " K = self.K\n", - "\n", - " ## If T is not provided, use the BSM Model's T\n", - " if T is None:\n", - " T = self.T\n", - "\n", - " else:\n", - " # Set valuation date back so that (end_date - valuation_date) = T\n", - " temp_val_date = self.forward.valuation_date\n", - " new_val_date = self.expiration - timedelta(days=T * DAILY_BASIS)\n", - " self.forward.valuation_date = new_val_date\n", - " self.forward.dividend.valuation_date = new_val_date\n", - "\n", - " ## If r is not provided, use the BSM Model's risk-free rate\n", - " if r is None:\n", - " r = self.r\n", - " r_old = self.forward.risk_free_rate\n", - " else:\n", - " # Update the forward's risk-free rate if provided\n", - " r_old = self.forward.risk_free_rate\n", - " self.forward.risk_free_rate = r\n", - "\n", - " ## If sigma is not provided, use the BSM Model's volatility\n", - " if sigma is None:\n", - " sigma = self.sigma\n", - "\n", - " ## If option_type is not provided, use the BSM Model's option type\n", - " if option_type is None:\n", - " option_type = self.option_type\n", - "\n", - " ## If F is not provided, use the forward's price\n", - " if F is None:\n", - " F = self.forward.get_forward_price()\n", - "\n", - " ## Clear all bumps to forward to avoid unintended effects\n", - " self.forward.dividend.asset.clear_bump()\n", - " self.forward.risk_free_rate = r_old # Reset to original risk-free rate\n", - "\n", - " price = black_scholes_vectorized(F, K, T, r, sigma, option_type=option_type)\n", - "\n", - " return price\n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Vectorized" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### BSM" - ] - }, - { - "cell_type": "code", - "execution_count": 57, - "metadata": {}, - "outputs": [], - "source": [ - "def black_scholes_vectorized_base(F: np.ndarray|List[float], \n", - " K: np.ndarray|List[float],\n", - " T: np.ndarray|List[float], \n", - " r: np.ndarray|List[float], \n", - " sigma: np.ndarray|List[float], \n", - " option_type: str|List[str]=\"c\",\n", - " **kwargs) -> np.ndarray:\n", - " \"\"\"\n", - " Vectorized Black-Scholes formula for option pricing.\n", - " F: Forward prices (array)\n", - " K: Strike prices (array)\n", - " T: Time to maturity (array)\n", - " r: Risk-free rates (array)\n", - " sigma: Volatilities (array)\n", - " option_type: \"c\" for call, \"p\" for put (array or single string)\n", - "\n", - " Returns: Option prices (array)\n", - " \"\"\"\n", - " # Ensure all inputs are numpy arrays for vectorized operations\n", - " F = np.asarray(F)\n", - " K = np.asarray(K)\n", - " T = np.asarray(T)\n", - " r = np.asarray(r)\n", - " sigma = np.asarray(sigma)\n", - "\n", - " d1 = (np.log(F / K) + 0.5 * sigma**2 * T) / (sigma * np.sqrt(T))\n", - " d2 = d1 - sigma * np.sqrt(T)\n", - " df = np.exp(-r * T)\n", - " # Handle both scalar and vector string inputs for option_type\n", - " option_type = np.asarray(option_type)\n", - "\n", - " # Enfores option_type\n", - " if not np.all(np.isin(option_type, [\"c\", \"p\"])):\n", - " raise ValueError(\"option_type must be 'c' or 'p'\")\n", - " \n", - " call_mask = option_type == \"c\"\n", - " put_mask = option_type == \"p\"\n", - " price = np.zeros_like(F)\n", - " # Calculate call prices\n", - " price[call_mask] = df[call_mask] * (F[call_mask] * norm.cdf(d1[call_mask]) - K[call_mask] * norm.cdf(d2[call_mask]))\n", - " # Calculate put prices\n", - " price[put_mask] = df[put_mask] * (K[put_mask] * norm.cdf(-d2[put_mask]) - F[put_mask] * norm.cdf(-d1[put_mask]))\n", - " return price\n", - "\n", - "\n", - "def vectorized_market_forward_calc(ticks: List[str], \n", - " S: List[float], \n", - " valuation_dates: List[datetime], \n", - " end_dates: List[datetime], \n", - " r: List[float], \n", - " div_type='discrete',\n", - " return_div=False) -> np.ndarray:\n", - " \"\"\"\n", - " Vectorized calculation of forward prices for multiple tickers.\n", - " ticks: List of ticker symbols\n", - " S: List of spot prices (current prices of the underlying assets)\n", - " valuation_dates: List of valuation dates (dates for which the option is priced)\n", - " end_dates: List of end dates (expiration dates of the options)\n", - " r: List of risk-free rates (annualized)\n", - " div_type: Type of dividend ('discrete' or 'continuous')\n", - " Returns: Forward prices (array)\n", - " \"\"\"\n", - " \n", - " # Get Dividends & Calculate the forward price\n", - " if div_type == 'discrete':\n", - "\n", - " schedule = get_vectorized_dividend_scehdule(\n", - " tickers=ticks,\n", - " start_dates=valuation_dates,\n", - " end_dates=end_dates,\n", - " valuation_dates=valuation_dates,\n", - " )\n", - " div_amt=vectorized_discrete_pv(schedules=schedule,\n", - " r=r,\n", - " _valuation_dates=valuation_dates,\n", - " _end_dates=end_dates,)\n", - " F = vectorized_forward_discrete(\n", - " S=S,\n", - " r=r,\n", - " T=[time_distance_helper(end_dates[i], valuation_dates[i]) for i in range(len(end_dates))],\n", - " pv_divs=div_amt\n", - " )\n", - "\n", - " elif div_type == 'continuous':\n", - " div_rate = get_vectorized_dividend_rate(\n", - " tickers=ticks,\n", - " spots=S,\n", - " valuation_dates=valuation_dates,\n", - " )\n", - "\n", - " div_amt = get_vectorized_continuous_dividends(div_rates=div_rate,\n", - " _valuation_dates=valuation_dates,\n", - " _end_dates=end_dates,)\n", - " F = vectorized_forward_continuous(\n", - " S=S,\n", - " r=r,\n", - " q_factor=div_amt,\n", - " T=[time_distance_helper(end_dates[i], valuation_dates[i]) for i in range(len(end_dates))]\n", - " )\n", - " else:\n", - " raise ValueError(f\"Unsupported dividend type '{div_type}'. Use 'discrete' or 'continuous'.\")\n", - " \n", - " return (F, div_amt) if return_div else F\n", - " \n", - "\n", - "def black_scholes_vectorized_market(ticks: List[str],\n", - " S: List[float], \n", - " K: List[float], \n", - " valuation_dates: List[datetime],\n", - " end_dates: List[datetime],\n", - " r: List[float], \n", - " sigma: List[float], \n", - " option_type: str|List[str] = \"c\",\n", - " div_type='discrete'):\n", - " \"\"\"\n", - " Vectorized Black-Scholes model for market data.\n", - " ticks: List of ticker symbols\n", - " S: List of spot prices (current prices of the underlying assets)\n", - " K: List of strike prices\n", - " valuation_dates: List of valuation dates (dates for which the option is priced)\n", - " end_dates: List of end dates (expiration dates of the options)\n", - " r: List of risk-free rates (annualized)\n", - " sigma: List of volatilities (annualized)\n", - " option_type: \"c\" for call, \"p\" for put (single string or list of strings)\n", - " div_type: Type of dividend ('discrete' or 'continuous')\n", - " \n", - " Returns: Option prices (array)\n", - " \"\"\"\n", - " F = vectorized_market_forward_calc(\n", - " ticks=ticks,\n", - " S=S,\n", - " valuation_dates=valuation_dates,\n", - " end_dates=end_dates,\n", - " r=r,\n", - " div_type=div_type\n", - " )\n", - "\n", - " # Ensure option_type is a list\n", - " if isinstance(option_type, str):\n", - " option_type = [option_type] * len(ticks)\n", - " elif len(option_type) != len(ticks):\n", - " raise ValueError(\"option_type must be a single string or a list of strings with the same length as ticks.\")\n", - " \n", - " # Convert valuation_dates and end_dates to Timedelta\n", - " T = [time_distance_helper(end_dates[i], valuation_dates[i]) for i in range(len(end_dates))]\n", - "\n", - " return black_scholes_vectorized_base(\n", - " F=F, \n", - " K=K, \n", - " T=T, \n", - " r=r, \n", - " sigma=sigma, \n", - " option_type=option_type\n", - " )\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### TESTING" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Base Model" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### Discrete Dividends Pricing" - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'forward': 214.8645784470177, 'strike': 210, 'T': 0.4462696783025325, 'r': 0.045, 'vol': 0.2725, 'type': 'c', 'price': 17.60284866827155}\n", - "{'spot': 210.85, 'forward': 214.8645784470177, 'type': 'discrete', 'valuation': datetime.date(2025, 7, 9), 'expiry': datetime.date(2025, 12, 19)}\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 58, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bs_model = BlackScholes(\n", - " strike_price=210,\n", - " expiration=datetime(2025, 12, 19),\n", - " risk_free_rate=0.045,\n", - " volatility=0.2725,\n", - " start_date=datetime(2023, 1, 1),\n", - " spot_price=210.85,\n", - " dividend_type='discrete',\n", - " valuation_date=datetime(2025, 7, 9),\n", - " freq='quarterly',\n", - " div_amount=0.26,\n", - " option_type='c'\n", - ")\n", - "print(bs_model.summary())\n", - "print(bs_model.forward.summary())\n", - "bs_model.forward.dividend\n", - "bs_model" - ] - }, - { - "cell_type": "code", - "execution_count": 59, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'delta': array(0.58582531),\n", - " 'gamma': 0.009962580537501141,\n", - " 'rho': 0.47200904637776536,\n", - " 'theta': -0.05978444198260355,\n", - " 'vega': 0.5593264832634446,\n", - " 'volga': 0.00015478263709686236}" - ] - }, - "execution_count": 59, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bs_model.set_greek_calculation_style('analytic')\n", - "(bs_model.greeks())" - ] - }, - { - "cell_type": "code", - "execution_count": 60, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'delta': 0.5858253086494187,\n", - " 'gamma': 0.010164673913553489,\n", - " 'rho': 0.47235573244424556,\n", - " 'theta': -0.058873690712538014,\n", - " 'vega': 0.5482060477821096,\n", - " 'volga': 0.00015137831603029753}" - ] - }, - "execution_count": 60, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bs_model.finite_estimator.method='central'\n", - "bs_model.set_greek_calculation_style('numerical')\n", - "bs_model.greeks()" - ] - }, - { - "cell_type": "code", - "execution_count": 61, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'forward': 214.09936459333818, 'strike': 210, 'T': 0.4462696783025325, 'r': 0.045, 'vol': 0.2757, 'type': 'p', 'price': 13.323998912169074}\n", - "{'spot': 210.1, 'forward': 214.09936459333818, 'type': 'discrete', 'valuation': datetime.date(2025, 7, 9), 'expiry': datetime.date(2025, 12, 19)}\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 61, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bs_model_put = BlackScholes(\n", - " strike_price=210,\n", - " expiration=datetime(2025, 12, 19),\n", - " risk_free_rate=0.045,\n", - " volatility=0.2757,\n", - " start_date=datetime(2023, 1, 1),\n", - " spot_price=210.10,\n", - " dividend_type='discrete',\n", - " valuation_date=datetime(2025, 7, 9),\n", - " freq='quarterly',\n", - " div_amount=0.26,\n", - " option_type='p'\n", - ")\n", - "print(bs_model_put.summary())\n", - "print(bs_model_put.forward.summary())\n", - "bs_model_put.forward.dividend\n", - "bs_model_put" - ] - }, - { - "cell_type": "code", - "execution_count": 62, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'delta': array(-0.42189165),\n", - " 'gamma': 0.009922637529837549,\n", - " 'rho': -0.4545474105116634,\n", - " 'theta': -0.05987609679442674,\n", - " 'vega': 0.5596184570322142,\n", - " 'volga': 5.1516364463452093e-05}" - ] - }, - "execution_count": 62, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bs_model_put.set_greek_calculation_style('analytic')\n", - "(bs_model_put.greeks())\n" - ] - }, - { - "cell_type": "code", - "execution_count": 63, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'delta': -0.4218916505427727,\n", - " 'gamma': 0.01012392946402011,\n", - " 'rho': -0.45479708198965024,\n", - " 'theta': -0.03382428316210273,\n", - " 'vega': 0.5484922166138241,\n", - " 'volga': 5.094636161262145e-05}" - ] - }, - "execution_count": 63, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bs_model_put.finite_estimator.method='central'\n", - "bs_model_put.set_greek_calculation_style('numerical')\n", - "(bs_model_put.greeks())\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### Continuous Dividend Pricing" - ] - }, - { - "cell_type": "code", - "execution_count": 64, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2025-07-23 00:11:01 trade.asset.Stock ERROR: Error getting previous close for AAPL from yfinance: 'prev_close'\n", - "{'forward': 215.1223860977551, 'strike': 210, 'T': 0.4462696783025325, 'r': 0.045, 'vol': 0.2725, 'type': 'c', 'price': 17.75120036942414}\n", - "{'spot': 210.85, 'forward': 215.1223860977551, 'type': 'continuous', 'valuation': datetime.date(2025, 7, 9), 'expiry': datetime.date(2025, 12, 19)}\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 64, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bs_model = BlackScholes(\n", - " strike_price=210,\n", - " expiration=datetime(2025, 12, 19),\n", - " risk_free_rate=0.045,\n", - " volatility=0.2725,\n", - " start_date=datetime(2023, 1, 1),\n", - " spot_price=210.85,\n", - " dividend_type='continuous',\n", - " valuation_date=datetime(2025, 7, 9),\n", - " freq='quarterly',\n", - " div_amount=1.2331041024424947e-05 * 4,\n", - " option_type='c'\n", - ")\n", - "print(bs_model.summary())\n", - "print(bs_model.forward.summary())\n", - "bs_model.forward.dividend\n", - "bs_model" - ] - }, - { - "cell_type": "code", - "execution_count": 65, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'delta': array(0.58839035),\n", - " 'gamma': 0.0099362237603873,\n", - " 'rho': 0.4744211445871562,\n", - " 'theta': -0.059839309369576855,\n", - " 'vega': 0.5591862221356935,\n", - " 'volga': 0.00018964403099594948}" - ] - }, - "execution_count": 65, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bs_model.set_greek_calculation_style('analytic')\n", - "(bs_model.greeks())" - ] - }, - { - "cell_type": "code", - "execution_count": 66, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'delta': 0.5883773962922071,\n", - " 'gamma': 0.010137328763478634,\n", - " 'rho': 0.4744211442660647,\n", - " 'theta': -0.058893465673126144,\n", - " 'vega': 0.5480685753177087,\n", - " 'volga': 0.00018568244137597491}" - ] - }, - "execution_count": 66, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bs_model.finite_estimator.method='central'\n", - "bs_model.set_greek_calculation_style('numerical')\n", - "bs_model.greeks()" - ] - }, - { - "cell_type": "code", - "execution_count": 67, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'forward': 214.35718908768482, 'strike': 210, 'T': 0.4462696783025325, 'r': 0.045, 'vol': 0.2757, 'type': 'p', 'price': 13.217710506842806}\n", - "{'spot': 210.1, 'forward': 214.35718908768482, 'type': 'continuous', 'valuation': datetime.date(2025, 7, 9), 'expiry': datetime.date(2025, 12, 19)}\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 67, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bs_model_put = BlackScholes(\n", - " strike_price=210,\n", - " expiration=datetime(2025, 12, 19),\n", - " risk_free_rate=0.045,\n", - " volatility=0.2757,\n", - " start_date=datetime(2023, 1, 1),\n", - " spot_price=210.10,\n", - " dividend_type='continuous',\n", - " valuation_date=datetime(2025, 7, 9),\n", - " freq='quarterly',\n", - " div_amount=1.2331041024424947e-05 * 4,\n", - " option_type='p'\n", - ")\n", - "print(bs_model_put.summary())\n", - "print(bs_model_put.forward.summary())\n", - "bs_model_put.forward.dividend\n", - "bs_model_put" - ] - }, - { - "cell_type": "code", - "execution_count": 68, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'delta': array(-0.41933655),\n", - " 'gamma': 0.009897738015178278,\n", - " 'rho': -0.45215321413234394,\n", - " 'theta': -0.059805006074437554,\n", - " 'vega': 0.5595594143299075,\n", - " 'volga': 8.02200697622426e-05}" - ] - }, - "execution_count": 68, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bs_model_put.set_greek_calculation_style('analytic')\n", - "(bs_model_put.greeks())\n" - ] - }, - { - "cell_type": "code", - "execution_count": 69, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'delta': -0.41932732401218403,\n", - " 'gamma': 0.01009806883384709,\n", - " 'rho': -0.4521532142081557,\n", - " 'theta': -0.0339107594961634,\n", - " 'vega': 0.5484343477403055,\n", - " 'volga': 7.861631213984337e-05}" - ] - }, - "execution_count": 69, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bs_model_put.finite_estimator.method='central'\n", - "bs_model_put.set_greek_calculation_style('numerical')\n", - "(bs_model_put.greeks())\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Market Model" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### Continuous Dividends" - ] - }, - { - "cell_type": "code", - "execution_count": 70, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "208.6199951171875\n", - "Forward Price: 211.94729151184956\n", - "BSM Price: 15.512748505148558\n" - ] - } - ], - "source": [ - "mbs=MarketBlackScholes(\n", - " ticker='AAPL',\n", - " strike_price=210,\n", - " expiration=datetime(2025, 12, 19),\n", - " risk_free_rate=None, # Use 0 to let the model use the dividend's risk-free rate\n", - " volatility=0.2678,\n", - " start_date=datetime(2023, 1, 3),\n", - " dividend_type='discrete',\n", - " valuation_date=datetime(2025, 7, 14),\n", - " option_type='c'\n", - ")\n", - "print(mbs.spot_price)\n", - "print(f\"Forward Price: {mbs.forward.get_forward_price()}\")\n", - "print(f\"BSM Price: {mbs.price()}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 71, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "numerical\n" - ] - }, - { - "data": { - "text/plain": [ - "{'delta': 0.5558560087961321,\n", - " 'gamma': 0.010777150478159912,\n", - " 'rho': 0.43387253917622887,\n", - " 'theta': -0.057459418105310966,\n", - " 'vega': 0.5406747178126954,\n", - " 'volga': -0.00010137965565221817}" - ] - }, - "execution_count": 71, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "print(mbs.get_greek_calculation_style())\n", - "mbs.set_greek_calculation_style('numerical')\n", - "mbs.greeks()" - ] - }, - { - "cell_type": "code", - "execution_count": 72, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'delta': array(0.55585601),\n", - " 'gamma': 0.010581650875179385,\n", - " 'rho': 0.4332824356194001,\n", - " 'theta': -0.058272410282780074,\n", - " 'vega': 0.5506638993040862,\n", - " 'volga': -0.00010301154988852094}" - ] - }, - "execution_count": 72, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "mbs.set_greek_calculation_style('analytic')\n", - "mbs.greeks()" - ] - }, - { - "cell_type": "code", - "execution_count": 73, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "208.6199951171875\n", - "Forward Price: 211.94729151184956\n", - "BSM Price: 13.871105818430156\n", - "analytic\n", - "EquityForward\n", - "MarketDividendSchedule\n", - "Stock\n" - ] - } - ], - "source": [ - "mbs=MarketBlackScholes(\n", - " ticker='AAPL',\n", - " strike_price=210,\n", - " expiration=datetime(2025, 12, 19),\n", - " risk_free_rate=None, # Use 0 to let the model use the dividend's risk-free rate\n", - " volatility=0.2728,\n", - " start_date=datetime(2023, 1, 3),\n", - " dividend_type='discrete',\n", - " valuation_date=datetime(2025, 7, 14),\n", - " option_type='p'\n", - ")\n", - "print(mbs.spot_price)\n", - "print(f\"Forward Price: {mbs.forward.get_forward_price()}\")\n", - "print(f\"BSM Price: {mbs.price()}\")\n", - "print(mbs.get_greek_calculation_style())\n", - "print(mbs.forward.__class__.__name__)\n", - "print(mbs.forward.dividend.__class__.__name__)\n", - "print(mbs.forward.dividend.asset.__class__.__name__)" - ] - }, - { - "cell_type": "code", - "execution_count": 74, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "numerical\n" - ] - }, - { - "data": { - "text/plain": [ - "{'delta': -0.4438738884063381,\n", - " 'gamma': 0.010578602492142673,\n", - " 'rho': -0.46005495212701575,\n", - " 'theta': -0.034335234296367645,\n", - " 'vega': 0.5406226604282662,\n", - " 'volga': -0.00010707812300522983}" - ] - }, - "execution_count": 74, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "mbs.set_greek_calculation_style('numerical')\n", - "print(mbs.get_greek_calculation_style())\n", - "mbs.greeks()" - ] - }, - { - "cell_type": "code", - "execution_count": 75, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "analytic\n" - ] - }, - { - "data": { - "text/plain": [ - "{'delta': array(-0.44387389),\n", - " 'gamma': 0.010386705510666578,\n", - " 'rho': -0.45958372978984224,\n", - " 'theta': -0.05984361197862239,\n", - " 'vega': 0.5506108802057498,\n", - " 'volga': -0.00010902696444173094}" - ] - }, - "execution_count": 75, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "mbs.set_greek_calculation_style('analytic')\n", - "print(mbs.get_greek_calculation_style())\n", - "mbs.greeks()" - ] - }, - { - "cell_type": "code", - "execution_count": 76, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.0423199987411499" - ] - }, - "execution_count": 76, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "mbs.forward.risk_free_rate" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Vectorized Pricing" - ] - }, - { - "cell_type": "code", - "execution_count": 77, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Vectorized Black-Scholes Market Model Example (Discrete Dividend): [ 15.09713366 20.78417622 371.79467198]\n" - ] - } - ], - "source": [ - "print(\"Vectorized Black-Scholes Market Model Example (Discrete Dividend):\",\n", - " black_scholes_vectorized_market(\n", - " ticks=['AAPL', 'MSFT', 'GOOGL'],\n", - " S=[150, 250, 2800],\n", - " K=[150, 250, 2800],\n", - " valuation_dates=[datetime(2023, 1, 1), datetime(2023, 1, 1), datetime(2023, 1, 1)],\n", - " end_dates=[datetime(2024, 1, 1), datetime(2024, 1, 1), datetime(2024, 1, 1)],\n", - " r=[0.05, 0.04, 0.03],\n", - " sigma=[0.2, 0.25, 0.3],\n", - " option_type=['c', 'p', 'c'],\n", - " div_type='continuous'\n", - "))" - ] - }, - { - "cell_type": "code", - "execution_count": 78, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Vectorized Black-Scholes Market Model Example (Continuous Dividend): [ 15.08353295 20.91310523 371.79467198]\n" - ] - } - ], - "source": [ - "print(\"Vectorized Black-Scholes Market Model Example (Continuous Dividend):\",\n", - " black_scholes_vectorized_market(\n", - " ticks=['AAPL', 'MSFT', 'GOOGL'],\n", - " S=[150, 250, 2800],\n", - " K=[150, 250, 2800],\n", - " valuation_dates=[datetime(2023, 1, 1), datetime(2023, 1, 1), datetime(2023, 1, 1)],\n", - " end_dates=[datetime(2024, 1, 1), datetime(2024, 1, 1), datetime(2024, 1, 1)],\n", - " r=[0.05, 0.04, 0.03],\n", - " sigma=[0.2, 0.25, 0.3],\n", - " option_type=['c', 'p', 'c'], # Mixed option types\n", - " div_type='discrete'\n", - "))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## GREEKS" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### Numerical" - ] - }, - { - "cell_type": "code", - "execution_count": 79, - "metadata": {}, - "outputs": [], - "source": [ - "## For numerical Greeks, we can use the patched BSM model to calculate Greeks\n", - "## This is because scenario bumps are applied to T & S which also affect the forward price.\n", - "def _ptched_bsm_for_numerical(\n", - " K: float,\n", - " T: List[float],\n", - " r: float,\n", - " sigma: float,\n", - " S: float,\n", - " dividend_type: str = 'discrete',\n", - " div_amount: Union[float, List[float]] = 1.0,\n", - " option_type: str = \"c\",\n", - " **kwargs\n", - "):\n", - " \n", - " \"\"\"\n", - " Patched Black-Scholes model for numerical Greeks.\n", - " This model allows for scenario bumps on T & S which affect the forward price.\n", - " \"\"\"\n", - " if dividend_type == 'continuous' :\n", - " F = vectorized_forward_continuous(\n", - " S=S,\n", - " r=r,\n", - " q_factor=div_amount, # Assuming div_amount is the continuous yield rate\n", - " T=T\n", - " )\n", - " elif dividend_type == 'discrete':\n", - " F = vectorized_forward_discrete(\n", - " S=S,\n", - " r=r,\n", - " T=T,\n", - " pv_divs=div_amount # Assuming div_amount is the present value of discrete dividends\n", - " )\n", - " else:\n", - " raise ValueError(f\"Unsupported dividend type '{dividend_type}'. Use 'discrete' or 'continuous'.\")\n", - " return black_scholes_vectorized_base(\n", - " F=F, \n", - " K=K, \n", - " T=T,\n", - " r=r, \n", - " sigma=sigma, \n", - " option_type=option_type\n", - " )" - ] - }, - { - "cell_type": "code", - "execution_count": 80, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "def vectorized_market_greeks_numerical(\n", - " ticks: List[str],\n", - " S: List[float],\n", - " K: List[float],\n", - " valuation_dates: List[datetime],\n", - " end_dates: List[datetime],\n", - " r: List[float],\n", - " sigma: List[float],\n", - " option_type: str|List[str] = \"c\",\n", - " div_type='discrete',\n", - " div_amount=None\n", - ") -> List[dict]:\n", - " \"\"\"\n", - " Vectorized calculation of Greeks for market options using analytical method.\n", - " \"\"\"\n", - "\n", - " ## For analytical greeks, bumps are applied and recalculation is needed.\n", - " ## Therefore, we need to ensure that either div_amount or ticks are provided.\n", - " \n", - " if div_amount is None and ticks is None:\n", - " raise ValueError(\"div_amount must be provided if ticks are not provided.\")\n", - "\n", - " F, div_amount = vectorized_market_forward_calc(\n", - " ticks=ticks,\n", - " S=S,\n", - " valuation_dates=valuation_dates,\n", - " end_dates=end_dates,\n", - " r=r,\n", - " div_type=div_type,\n", - " return_div=True\n", - " )\n", - "\n", - " return vectorized_black_scholes_greeks(\n", - " F=F,\n", - " S=S,\n", - " K=K,\n", - " valuation_dates=valuation_dates,\n", - " end_dates=end_dates,\n", - " r=r,\n", - " sigma=sigma,\n", - " option_type=option_type,\n", - " div_type=div_type,\n", - " div_amount=div_amount\n", - " )\n", - " \n", - "def vectorized_black_scholes_greeks(\n", - " F: List[str],\n", - " S: List[float],\n", - " K: List[float],\n", - " valuation_dates: List[datetime],\n", - " end_dates: List[datetime],\n", - " r: List[float],\n", - " sigma: List[float],\n", - " option_type: str|List[str] = \"c\",\n", - " div_type='discrete',\n", - " div_amount=None) -> dict:\n", - " \"\"\"\n", - " Vectorized Black-Scholes Greeks calculation.\n", - " F: Forward prices (array)\n", - " S: Spot prices (array)\n", - " K: Strike prices (array)\n", - " valuation_dates: List of valuation dates (dates for which the option is priced)\n", - " end_dates: List of end dates (expiration dates of the options)\n", - " r: Risk-free rates (annualized, array)\n", - " sigma: Volatilities (annualized, array)\n", - " option_type: \"c\" for call, \"p\" for put (single string or list of strings)\n", - " div_type: Type of dividend ('discrete' or 'continuous')\n", - " div_amount: Dividend amount (single float or list of floats, ignored for continuous dividends)\n", - " Returns: Greeks (dictionary)\n", - " \"\"\"\n", - "\n", - " T = [time_distance_helper(end_dates[i], valuation_dates[i]) for i in range(len(end_dates))]\n", - " finite_estimator = FiniteGreeksEstimator(\n", - " price_func=_ptched_bsm_for_numerical,\n", - " base_params={\n", - " 'F': np.asarray(F),\n", - " 'K': np.asarray(K),\n", - " 'T': np.asarray(T),\n", - " 'r': np.asarray(r),\n", - " 'sigma': np.asarray(sigma),\n", - " 'q': 0.0, # Assuming no continuous dividend yield for simplicity\n", - " 'S': np.asarray(S), # Including spot price for delta calculation\n", - " 'option_type': option_type,\n", - " 'div_type': div_type,\n", - " 'div_amount': div_amount # Placeholder, will be ignored in the patched function\n", - " },\n", - " dx_thresh=0.00001,\n", - " method='central' # Use backward method for finite differences\n", - " )\n", - " greeks = finite_estimator.all_first_order()\n", - " greeks.update(finite_estimator.all_second_order())\n", - " greeks = dict(sorted(greeks.items(), key=lambda item: item[0]))\n", - " return greeks\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### Analytical" - ] - }, - { - "cell_type": "code", - "execution_count": 81, - "metadata": {}, - "outputs": [], - "source": [ - "## To seperate the F calculation from Market Greeks Funciton\n", - "def _ptched_bsm_for_analytical(\n", - " ticks: List[str],\n", - " S: List[float],\n", - " K: List[float],\n", - " valuation_dates: List[datetime],\n", - " end_dates: List[datetime],\n", - " r: List[float],\n", - " sigma: List[float],\n", - " option_type: str|List[str] = \"c\",\n", - " div_type='discrete',\n", - " **kwargs\n", - "):\n", - " \n", - " F = vectorized_market_forward_calc(\n", - " ticks=ticks,\n", - " S=S,\n", - " valuation_dates=valuation_dates,\n", - " end_dates=end_dates,\n", - " r=r,\n", - " div_type=div_type\n", - " )\n", - " T = [time_distance_helper(end_dates[i], valuation_dates[i]) for i in range(len(end_dates))]\n", - " greeks = black_scholes_analytic_greeks_vectorized(\n", - " F=F, \n", - " K=K, \n", - " T=T, \n", - " r=r, \n", - " sigma=sigma, \n", - " option_type=option_type\n", - " )\n", - " greeks = dict(sorted(greeks.items(), key=lambda item: item[0]))\n", - " return greeks" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### Combined" - ] - }, - { - "cell_type": "code", - "execution_count": 82, - "metadata": {}, - "outputs": [], - "source": [ - "def vectorized_market_greeks(\n", - " ticks: List[str],\n", - " S: List[float],\n", - " K: List[float],\n", - " valuation_dates: List[datetime],\n", - " end_dates: List[datetime],\n", - " r: List[float],\n", - " sigma: List[float],\n", - " option_type: str|List[str] = \"c\",\n", - " div_type='discrete',\n", - " greek_style: str = 'analytic'\n", - ") -> List[dict]:\n", - " \"\"\"\n", - " Vectorized calculation of Greeks for market options.\n", - " ticks: List of ticker symbols\n", - " S: List of spot prices (current prices of the underlying assets)\n", - " K: List of strike prices\n", - " valuation_dates: List of valuation dates (dates for which the option is priced)\n", - " end_dates: List of end dates (expiration dates of the options)\n", - " r: List of risk-free rates (annualized)\n", - " sigma: List of volatilities (annualized)\n", - " option_type: \"c\" for call, \"p\" for put (single string or list of strings)\n", - " div_type: Type of dividend ('discrete' or 'continuous')\n", - " greek_style: 'analytic' or 'numerical' for Greek calculation style\n", - " \n", - " Returns: Dictionary of Greeks for each option\n", - " \"\"\"\n", - " # Ensure option_type is a list\n", - " if isinstance(option_type, str):\n", - " option_type = [option_type] * len(ticks)\n", - " elif len(option_type) != len(ticks):\n", - " raise ValueError(\"option_type must be a single string or a list of strings with the same length as ticks.\")\n", - " \n", - " # Convert valuation_dates and end_dates to Timedelta\n", - " T = [time_distance_helper(end_dates[i], valuation_dates[i]) for i in range(len(end_dates))]\n", - "\n", - " # Calculate the Greeks using the specified style\n", - " if greek_style == 'analytic':\n", - " greeks = _ptched_bsm_for_analytical(\n", - " ticks=ticks,\n", - " S=S,\n", - " K=K,\n", - " valuation_dates=valuation_dates,\n", - " end_dates=end_dates,\n", - " r=r,\n", - " sigma=sigma,\n", - " option_type=option_type,\n", - " div_type=div_type\n", - " )\n", - " elif greek_style == 'numerical':\n", - " greeks=vectorized_market_greeks_numerical(\n", - " ticks=ticks,\n", - " S=S,\n", - " K=K,\n", - " valuation_dates=valuation_dates,\n", - " end_dates=end_dates,\n", - " r=r,\n", - " sigma=sigma,\n", - " option_type=option_type,\n", - " div_type=div_type\n", - " )\n", - " else:\n", - " raise ValueError(f\"Unknown Greek calculation style '{greek_style}'. Use 'analytic' or 'numerical'.\")\n", - " greeks = dict(sorted(greeks.items(), key=lambda item: item[0]))\n", - " return greeks\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### TESTS" - ] - }, - { - "cell_type": "code", - "execution_count": 83, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'delta': array([ 0.53760409, -0.40550645, 0.59867324]),\n", - " 'gamma': array([0.01110992, 0.00627671, 0.00046049]),\n", - " 'rho': array([ 0.41721394, -1.21053483, 13.03597517]),\n", - " 'theta': array([-0.05964481, -0.01953839, -0.55193583]),\n", - " 'vega': array([ 0.54379121, 0.95789124, 10.8232329 ]),\n", - " 'volga': array([-1.47766544e-04, -9.82822712e-05, -4.50641993e-03])}" - ] - }, - "execution_count": 83, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "vectorized_market_greeks(\n", - " ticks=['AAPL', 'MSFT', 'GOOGL'],\n", - " S=[211.12, 250, 2800],\n", - " K=[215, 250, 2800],\n", - " valuation_dates=[datetime(2025, 7, 18), datetime(2023, 1, 1), datetime(2023, 1, 1)],\n", - " end_dates=[datetime(2025, 12, 19), datetime(2024, 1, 1), datetime(2024, 1, 1)],\n", - " r=[0.05, 0.04, 0.03],\n", - " sigma=[0.2611, 0.25, 0.3],\n", - " option_type=['c', 'p', 'c'], \n", - " div_type='discrete',\n", - " greek_style='numerical'\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 84, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'delta': array([ 0.53088881, -0.40550645, 0.59867324]),\n", - " 'gamma': array([0.01422207, 0.00603076, 0.00044689]),\n", - " 'rho': array([ 0.42526334, -1.21053483, 13.03597517]),\n", - " 'theta': array([-0.04992309, -0.04740847, -0.56547187]),\n", - " 'vega': array([ 0.5561839 , 0.99695623, 11.1526204 ]),\n", - " 'volga': array([-0.00011286, -0.00010294, -0.00464374])}" - ] - }, - "execution_count": 84, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "vectorized_market_greeks(\n", - " ticks=['AAPL', 'MSFT', 'GOOGL'],\n", - " S=[211.12, 250, 2800],\n", - " K=[215, 250, 2800],\n", - " valuation_dates=[datetime(2025, 7, 18), datetime(2023, 1, 1), datetime(2023, 1, 1)],\n", - " end_dates=[datetime(2025, 12, 19), datetime(2024, 1, 1), datetime(2024, 1, 1)],\n", - " r=[0.05, 0.04, 0.03],\n", - " sigma=[0.2, 0.25, 0.3],\n", - " option_type=['c', 'p', 'c'], \n", - " div_type='discrete',\n", - " greek_style='analytic'\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## VOL ESTIMATION\n", - "\n", - "- Market Angle will be able to pass single, or vectorized.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Base" - ] - }, - { - "cell_type": "code", - "execution_count": 85, - "metadata": {}, - "outputs": [], - "source": [ - "np.set_printoptions(suppress=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 86, - "metadata": {}, - "outputs": [], - "source": [ - "from scipy.optimize import minimize\n", - "\n", - "def vol_est_minimization(\n", - " F: float,\n", - " K: float,\n", - " T: float,\n", - " r: float,\n", - " market_price: float,\n", - " option_type: str = 'c',\n", - "):\n", - " \"\"\"\n", - " Objective function for volatility estimation using minimization.\n", - " This function calculates the difference between the market price and the Black-Scholes price.\n", - " \n", - " Parameters:\n", - " - F: Forward price\n", - " - K: Strike price\n", - " - T: Time to maturity\n", - " - r: Risk-free rate\n", - " - market_price: Market price of the option\n", - " - option_type: 'c' for call, 'p' for put\n", - " \n", - " Returns:\n", - " - Difference between market price and Black-Scholes price\n", - " \"\"\"\n", - " \n", - " def objective_function(sigma):\n", - " bs_price = black_scholes_vectorized(\n", - " F=F, \n", - " K=K, \n", - " T=T, \n", - " r=r, \n", - " sigma=sigma, \n", - " option_type=option_type\n", - " )\n", - " return (bs_price - market_price) ** 2\n", - "\n", - " # Initial guess for volatility\n", - " initial_guess = 0.2\n", - "\n", - " # Minimize the objective function to find the implied volatility\n", - " result = minimize(objective_function, initial_guess, bounds=[(0.01, None)])\n", - " \n", - " if result.success:\n", - " return result.x[0] # Return the estimated volatility\n", - " else:\n", - " raise ValueError(\"Volatility estimation failed.\")\n", - " \n", - "def vol_est_brute_force(\n", - " F: float,\n", - " K: float,\n", - " T: float,\n", - " r: float,\n", - " market_price: float,\n", - " option_type: str = 'c',\n", - "):\n", - " \"\"\"\n", - "\n", - " Brute force method to estimate implied volatility by minimizing the difference\n", - " between the market price and the Black-Scholes price.\n", - " Parameters:\n", - " - F: Forward price\n", - " - K: Strike price\n", - " - T: Time to maturity\n", - " - r: Risk-free rate\n", - " - market_price: Market price of the option\n", - " - option_type: 'c' for call, 'p' for put\n", - " Returns:\n", - " - Estimated volatility\n", - " \"\"\"\n", - " \n", - " sigmas = np.linspace(0.001, 5, 40000) # Range of volatilities to test\n", - "\n", - " prices = black_scholes_vectorized(\n", - " F=F, \n", - " K=K, \n", - " T=T, \n", - " r=r, \n", - " sigma=sigmas, \n", - " option_type=option_type\n", - " )\n", - "\n", - " # Calculate the absolute differences between market price and calculated prices\n", - " differences = np.abs(prices - market_price)\n", - " # Find the index of the minimum difference\n", - " min_index = np.argmin(differences)\n", - "\n", - " # Return the corresponding volatility\n", - " return sigmas[min_index] # Return the estimated volatility and corresponding price" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### TESTS" - ] - }, - { - "cell_type": "code", - "execution_count": 87, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(213.46615757988374, 0.0423199987411499)" - ] - }, - "execution_count": 87, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "mkt_forward = EquityForward(\n", - " start_date=test_start,\n", - " end_date=datetime(2025, 12, 19),\n", - " ticker='AAPL',\n", - " valuation_date=test_valuation_date,\n", - " risk_free_rate=rates,\n", - " dividend_type='discrete',\n", - " dividend=None, # Market dividend will be set later\n", - "\n", - ")\n", - "mkt_forward.get_forward_price(), mkt_forward.risk_free_rate" - ] - }, - { - "cell_type": "code", - "execution_count": 88, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.2677398648854257" - ] - }, - "execution_count": 88, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "vol_est_minimization(\n", - " F=mkt_forward.get_forward_price(), # Forward price\n", - " K=220, # Strike price\n", - " T=time_distance_helper('2025-12-19', test_valuation_date), # Time to maturity in years\n", - " r=mkt_forward.risk_free_rate, # Risk-free rate\n", - " market_price=11.85, # Market price of the option\n", - " option_type='c' # Option type: 'c' for call\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 89, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.2677033175829395" - ] - }, - "execution_count": 89, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "vol_est_brute_force(\n", - " F=mkt_forward.get_forward_price(), # Forward price\n", - " K=220, # Strike price\n", - " T=time_distance_helper('2025-12-19', test_start), # Time to maturity in years\n", - " r=mkt_forward.risk_free_rate, # Risk-free rate\n", - " market_price=11.85, # Market price of the option\n", - " option_type='c' # Option type: 'c' for call\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Vectorized" - ] - }, - { - "cell_type": "code", - "execution_count": 90, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "from scipy.optimize import minimize\n", - "from typing import Callable, Optional\n", - "from functools import partial\n", - "\n", - "## Brute force is faster than minimization for volatility estimation\n", - "## Standardize this before using it in production\n", - "class ImpliedVolEstimator:\n", - " def __init__(self, \n", - " loss_func: Callable,\n", - " fallback_bounds: tuple = None,\n", - " method: str = \"L-BFGS-B\",\n", - " default_vol: float = 0.2,\n", - " dx: float = 1e-4,\n", - " fall_back_grid_search: Optional[Callable] = None):\n", - " \"\"\"\n", - " Wraps implied volatility estimation with robust handling.\n", - "\n", - " Parameters:\n", - " - loss_func: Callable taking (sigma, *args) and returning squared error.\n", - " - fallback_bounds: Tuple of lower and upper bounds for fallback grid search.\n", - " - method: Optimization method to use.\n", - " - default_vol: Default volatility returned if all else fails.\n", - " - dx: Finite grid step size for fallback.\n", - " \"\"\"\n", - " self.loss_func = loss_func\n", - " self.bounds = fallback_bounds if fallback_bounds is not None else (VOL_EST_LOWER_BOUND, VOL_EST_UPPER_BOUND)\n", - " self.method = method\n", - " self.default_vol = default_vol\n", - " self.dx = dx\n", - " self.fallback_grid_search = fall_back_grid_search\n", - "\n", - " def _fallback_grid_search(self, *args, **kwargs) -> float:\n", - " \"\"\"\n", - " Fallback grid search method to estimate implied volatility.\n", - " Uses a brute force method if no custom fallback is provided.\n", - " \"\"\"\n", - " if self.fallback_grid_search:\n", - " logger.info(\"Using custom fallback grid search function.\")\n", - " return self.fallback_grid_search(*args, **kwargs)\n", - " else:\n", - " logger.warning(\"No custom fallback grid search function provided. Using brute force method.\")\n", - " loss_func = partial(self.loss_func, *args, **kwargs)\n", - " grid = np.linspace(self.bounds[0], self.bounds[1], int((self.bounds[1] - self.bounds[0]) / self.dx))\n", - " losses = np.array([loss_func(sigma, *args, **kwargs) for sigma in grid])\n", - " if np.isfinite(losses).all():\n", - " return grid[np.argmin(losses)]\n", - " return self.default_vol\n", - "\n", - " def estimate_single(self, x0: float, *args, **kwargs) -> float:\n", - " \"\"\"\n", - " Estimate implied volatility for a single input using minimization.\n", - " x0: Initial guess for the volatility.\n", - " args: Additional positional arguments passed to loss_func.\n", - " kwargs: Additional keyword arguments passed to loss_func.\n", - " \"\"\"\n", - " try:\n", - " res = minimize(\n", - " lambda sigma: self.loss_func(sigma, *args, **kwargs),\n", - " x0=np.array([x0]),\n", - " bounds=[self.bounds],\n", - " method=self.method\n", - " )\n", - " minimized_value = self.loss_func(res.x[0], *args, **kwargs)\n", - " if res.success and np.isfinite(res.fun) and np.isfinite(res.x).all() and minimized_value < 1e-6:\n", - " return float(res.x[0])\n", - " if minimized_value >= 1e-6:\n", - " logger.warning(f\"Minimized value {minimized_value} is above threshold. Falling back to grid search.\")\n", - " return self._fallback_grid_search(*args, **kwargs)\n", - " except Exception as e:\n", - " return self._fallback_grid_search(*args, **kwargs)\n", - "\n", - " def estimate_batch(self, x0: float, param_list: list) -> np.ndarray:\n", - " \"\"\"\n", - " Estimate implied vol for a batch of inputs.\n", - " param_list: List of *args passed to loss_func (excluding sigma).\n", - " \"\"\"\n", - " return np.array([self.estimate_single(x0, *params) for params in param_list])\n" - ] - }, - { - "cell_type": "code", - "execution_count": 91, - "metadata": {}, - "outputs": [], - "source": [ - "def objective_function_bsm(sigma: float, F: float, K: float, T: float, r: float, market_price: float, option_type: str) -> float:\n", - " \"\"\"\n", - " Objective function for volatility estimation.\n", - " \"\"\"\n", - " intrinsic_value = max(F - K if option_type == 'c' else K - F, 0)\n", - "\n", - " ##TODO: Take this out of objective function to avoid repeated logging during minimization\n", - " if intrinsic_value < market_price:\n", - " logger.warning(\"Market price exceeds intrinsic value, returning NaN.\")\n", - " logger.info(f\"Intrinsic Value: {intrinsic_value}, Market Price: {market_price}. Option Details: F={F}, K={K}, T={T}, r={r}, sigma={sigma}, option_type={option_type}\")\n", - " bs_price = black_scholes_vectorized(F=F, K=K, T=T, r=r, sigma=sigma, option_type=option_type)\n", - " \n", - " return (bs_price - market_price) ** 2\n", - "\n", - "def objective_function_brute(sigma: float, F: float, K: float, T: float, r: float, market_price: float, option_type: str) -> float:\n", - " \"\"\"\n", - " Objective function for brute force volatility estimation.\n", - " \"\"\"\n", - " intrinsic_value = max(F - K if option_type == 'c' else K - F, 0)\n", - "\n", - " if intrinsic_value < market_price:\n", - " logger.warning(\"Market price exceeds intrinsic value, returning NaN.\")\n", - " logger.info(f\"Intrinsic Value: {intrinsic_value}, Market Price: {market_price}. Option Details: F={F}, K={K}, T={T}, r={r}, sigma={sigma}, option_type={option_type}\")\n", - " \n", - " bs_price = black_scholes_vectorized(F=F, K=K, T=T, r=r, sigma=sigma, option_type=option_type)\n", - " \n", - " return (bs_price - market_price) ** 2 " - ] - }, - { - "cell_type": "code", - "execution_count": 92, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.069488012200305" - ] - }, - "execution_count": 92, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# 2025-07-18\tAAPL\t2026-06-18\t5.0\tC\t70\t205.25\t44\t206.50\t20250718\t205.875\t205.732456\t1.000000\n", - "# 2025-07-18\tAAPL\t2026-06-18\t250.0\tC\t323\t9.15\t294\t9.30\t20250718\t9.225\t9.221475\t0.211616\n", - "# 2025-07-18\tAAPL\t2026-06-18\t255.0\tC\t6\t7.95\t386\t8.05\t20250718\t8.000\t8.048469\t0.211616\n", - "# end, K, mid = '2026-06-18', 255.0, 8\n", - "end, K, mid = '2026-06-18', 250.0, 0.1\n", - "mkt_forward = EquityForward(\n", - " start_date=test_start,\n", - " end_date=end,\n", - " ticker='AAPL',\n", - " valuation_date=test_valuation_date,\n", - " risk_free_rate=0.04235,\n", - " dividend_type='discrete',\n", - " dividend=None, # Market dividend will be set later\n", - "\n", - ")\n", - "mkt_forward.get_forward_price(), mkt_forward.risk_free_rate\n", - "iv_estimator = ImpliedVolEstimator(\n", - " loss_func=vol_est_brute_force,\n", - " method=\"L-BFGS-B\",\n", - " default_vol=0.2,\n", - " fallback_bounds = (0.01,1.0),\n", - " dx=0.0001,\n", - " fall_back_grid_search=vol_est_brute_force\n", - ")\n", - "iv_estimator.estimate_single(\n", - " x0=0.2,\n", - " F=mkt_forward.get_forward_price(), # Forward price\n", - " K=K, # Strike price\n", - " T=time_distance_helper(end, test_valuation_date), # Time to maturity in years\n", - " r=mkt_forward.risk_free_rate, # Risk-free rate\n", - " market_price=mid, # Market price of the option\n", - " option_type='c' # Option type: 'c' for call\n", - ")\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Test Vol Surface Fit" - ] - }, - { - "cell_type": "code", - "execution_count": 93, - "metadata": {}, - "outputs": [], - "source": [ - "aapl_chain=retrieve_chain_bulk(\n", - " 'AAPL',\n", - " 0,\n", - " change_to_last_busday(test_valuation_date),\n", - " change_to_last_busday(test_valuation_date),\n", - " '16:00'\n", - "\n", - ")\n", - "S = get_spot('AAPL', (test_valuation_date))" - ] - }, - { - "cell_type": "code", - "execution_count": 94, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([211.06290119, 211.23415549, 211.06290119, ..., 210.72080899,\n", - " 217.71608065, 217.71608065])" - ] - }, - "execution_count": 94, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "aapl_chain = aapl_chain[aapl_chain['Expiration'] >= test_valuation_date]\n", - "valuation_dates = [test_valuation_date] * len(aapl_chain)\n", - "end_dates = aapl_chain['Expiration'].tolist()\n", - "r = [rates] * len(aapl_chain)\n", - "s = [S] * len(aapl_chain)\n", - "tickers = ['AAPL'] * len(aapl_chain)\n", - "F = vectorized_market_forward_calc(\n", - " ticks=tickers,\n", - " S=s,\n", - " valuation_dates=valuation_dates,\n", - " end_dates=end_dates,\n", - " r=r,\n", - " div_type='discrete'\n", - ")\n", - "F" - ] - }, - { - "cell_type": "code", - "execution_count": 95, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([0.29094925, 0.27470209, 0.27845144, ..., 0.29832296, 0.28082602,\n", - " 0.27470209])" - ] - }, - "execution_count": 95, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "vol_batch = iv_estimator.estimate_batch(\n", - " x0=0.2,\n", - " param_list=[\n", - " (F[i], \n", - " aapl_chain['Strike'][i], \n", - " time_distance_helper(end_dates[i], valuation_dates[i]), \n", - " r[i],\n", - " aapl_chain['Midpoint'][i],\n", - " aapl_chain['Right'][i].lower())\n", - " for i in range(len(aapl_chain))\n", - " ]\n", - ")\n", - "vol_batch" - ] - }, - { - "cell_type": "code", - "execution_count": 96, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(2428, 2428)" - ] - }, - "execution_count": 96, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "len(vol_batch), len(aapl_chain)" - ] - }, - { - "cell_type": "code", - "execution_count": 97, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "hovertemplate": "Strike=%{x}
iv=%{y}", - "legendgroup": "", - "line": { - "color": "#636efa", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "", - "orientation": "v", - "showlegend": false, - "type": "scatter", - "x": [ - 15, - 20, - 25, - 30, - 35, - 40, - 45, - 50, - 60, - 70, - 80, - 85, - 90, - 95, - 100, - 105, - 110, - 115, - 120, - 125, - 130, - 135, - 140, - 145, - 150, - 155, - 160, - 165, - 170, - 175, - 180, - 185, - 190, - 195, - 200, - 210, - 220, - 230, - 240, - 250, - 260, - 270, - 280, - 290, - 300, - 310, - 320, - 330, - 340, - 350, - 360, - 370, - 380, - 390, - 400, - 410, - 420, - 430, - 440, - 450 - ], - "xaxis": "x", - "y": [ - 1.1760443261081526, - 0.9812034300857521, - 0.8798461711542788, - 0.7989853246331158, - 0.7381209780244505, - 0.6862550563764094, - 0.6411379534488362, - 0.6057691442286056, - 0.5405305632640816, - 0.4746670916772919, - 0.43729863246581163, - 0.42455086377159423, - 0.41117820445511133, - 0.41567741693542337, - 0.3920565514137853, - 0.3786838920973024, - 0.3730598764969124, - 0.36456136403410083, - 0.36281167029175726, - 0.35256346408660216, - 0.34643953598839966, - 0.3431901047526188, - 0.33506652666316655, - 0.32931753293832344, - 0.3245683642091052, - 0.3183194579864496, - 0.3133203330083252, - 0.3098209455236381, - 0.3049467986699667, - 0.3009474986874672, - 0.296323308082702, - 0.29207405185129626, - 0.2893245331133278, - 0.2860751018775469, - 0.28207580189504733, - 0.276076851921298, - 0.26932803320083, - 0.264828820720518, - 0.259204805120128, - 0.2542056801420035, - 0.25095624890622265, - 0.24820673016825417, - 0.24633205830145752, - 0.2452072551813795, - 0.2428326708167704, - 0.2438324958123953, - 0.24345756143903596, - 0.24320760519012974, - 0.2438324958123953, - 0.24495729893247328, - 0.24645703642591063, - 0.2483317082927073, - 0.25108122703067576, - 0.2533308332708318, - 0.25583039575989397, - 0.2583299582489562, - 0.2608295207380184, - 0.2639539738493462, - 0.26645353633840846, - 0.2692030550763769 - ], - "yaxis": "y" - } - ], - "layout": { - "legend": { - "tracegroupgap": 0 - }, - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "heatmapgl": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmapgl" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "title": { - "text": "AAPL Call IV on 2026-06-18" - }, - "xaxis": { - "anchor": "y", - "domain": [ - 0, - 1 - ], - "title": { - "text": "Strike" - } - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0, - 1 - ], - "title": { - "text": "iv" - } - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "aapl_chain['iv'] = vol_batch\n", - "aapl_chain[(aapl_chain['Expiration'] == '2026-12-18') & (aapl_chain['Right'] == 'C')].sort_values('Strike').tail(60).plot(x = 'Strike', y='iv', kind='line', title='AAPL Call IV on 2026-06-18')" - ] - }, - { - "cell_type": "code", - "execution_count": 98, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
RootExpirationStrikeRightBid_sizeCloseBidAsk_sizeCloseAskDateMidpointWeighted_midpointiv
datetime
2025-07-16AAPL2025-09-195.0C152204.75180205.7520250716205.250205.2921693.398780
2025-07-16AAPL2025-09-195.0P00.005000.01202507160.0050.0100002.734522
2025-07-16AAPL2025-12-195.0C1203.80100206.4020250716205.100206.3742572.409328
2025-07-16AAPL2025-12-195.0P00.0010.02202507160.0100.0200001.872672
2025-07-16AAPL2026-01-165.0C100203.35100206.4020250716204.875204.8750002.267853
.......................................
2025-07-16AAPL2026-12-18450.0C80.44180.48202507160.4600.4676920.269203
2025-07-16AAPL2027-06-17450.0C10.9011.04202507160.9700.9700000.253956
2025-07-16AAPL2027-06-17450.0P23237.9023241.8520250716239.875239.8750000.662884
2025-07-16AAPL2027-01-15450.0C200.5010.53202507160.5150.5014290.265829
2025-07-16AAPL2027-01-15450.0P24237.9015241.7020250716239.800239.3615380.681381
\n", - "

2428 rows × 12 columns

\n", - "
" - ], - "text/plain": [ - " Root Expiration Strike Right Bid_size CloseBid Ask_size \\\n", - "datetime \n", - "2025-07-16 AAPL 2025-09-19 5.0 C 152 204.75 180 \n", - "2025-07-16 AAPL 2025-09-19 5.0 P 0 0.00 500 \n", - "2025-07-16 AAPL 2025-12-19 5.0 C 1 203.80 100 \n", - "2025-07-16 AAPL 2025-12-19 5.0 P 0 0.00 1 \n", - "2025-07-16 AAPL 2026-01-16 5.0 C 100 203.35 100 \n", - "... ... ... ... ... ... ... ... \n", - "2025-07-16 AAPL 2026-12-18 450.0 C 8 0.44 18 \n", - "2025-07-16 AAPL 2027-06-17 450.0 C 1 0.90 1 \n", - "2025-07-16 AAPL 2027-06-17 450.0 P 23 237.90 23 \n", - "2025-07-16 AAPL 2027-01-15 450.0 C 20 0.50 1 \n", - "2025-07-16 AAPL 2027-01-15 450.0 P 24 237.90 15 \n", - "\n", - " CloseAsk Date Midpoint Weighted_midpoint iv \n", - "datetime \n", - "2025-07-16 205.75 20250716 205.250 205.292169 3.398780 \n", - "2025-07-16 0.01 20250716 0.005 0.010000 2.734522 \n", - "2025-07-16 206.40 20250716 205.100 206.374257 2.409328 \n", - "2025-07-16 0.02 20250716 0.010 0.020000 1.872672 \n", - "2025-07-16 206.40 20250716 204.875 204.875000 2.267853 \n", - "... ... ... ... ... ... \n", - "2025-07-16 0.48 20250716 0.460 0.467692 0.269203 \n", - "2025-07-16 1.04 20250716 0.970 0.970000 0.253956 \n", - "2025-07-16 241.85 20250716 239.875 239.875000 0.662884 \n", - "2025-07-16 0.53 20250716 0.515 0.501429 0.265829 \n", - "2025-07-16 241.70 20250716 239.800 239.361538 0.681381 \n", - "\n", - "[2428 rows x 12 columns]" - ] - }, - "execution_count": 98, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "aapl_chain.sort_values('Strike')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## BINOMIAL TREE" - ] - }, - { - "cell_type": "code", - "execution_count": 99, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "class BinomialBase(ABC):\n", - " def __init__(self, \n", - " K: float,\n", - " expiration: datetime|str,\n", - " sigma: float,\n", - " r: float,\n", - " N: int = 100,\n", - " spot_price: float = None,\n", - " dividend_type: str = 'discrete',\n", - " div_amount: float = 0.0,\n", - " option_type: str = 'c',\n", - " start_date: datetime|str = None,\n", - " valuation_date: datetime|str = None,\n", - " american: bool = False):\n", - " super().__init__()\n", - " \"\"\"\n", - " Base class for Binomial Tree models.\n", - " K: Strike price\n", - " expiration: Expiration date of the option\n", - " sigma: Volatility of the underlying asset\n", - " r: Risk-free interest rate\n", - " N: Number of time steps in the binomial tree\n", - " spot_price: Current price of the underlying asset (optional)\n", - " dividend_type: Type of dividend ('discrete' or 'continuous')\n", - " div_amount: Amount of dividend (if applicable)\n", - " option_type: 'c' for call, 'p' for put\n", - " start_date: Start date for the option pricing (optional)\n", - " valuation_date: Date for which the option is priced (optional)\n", - " \"\"\"\n", - " self._initialized = False\n", - " self.K = K\n", - " self.expiration = expiration\n", - " self.sigma = sigma\n", - " self.r = r\n", - " self.N = N\n", - " self.S0 = spot_price\n", - " self.dividend_type = dividend_type\n", - " self.div_yield = div_amount if dividend_type == 'continuous' else 0.0\n", - " self.discrete_dividends = div_amount if dividend_type == 'discrete' else []\n", - " self.option_type = option_type\n", - " self.start_date = start_date\n", - " self.valuation_date = valuation_date\n", - " self.T = time_distance_helper(self.expiration, self.valuation_date or datetime.now())\n", - " self.american = american\n", - " self.dt = self.T / self.N\n", - " self.priced = False\n", - " self.tree = []\n", - " self.option_values = []\n", - " self.stock_tree = []\n", - " self.init_parameters()\n", - " self.build_tree()\n", - " self._initialized = True\n", - "\n", - " @abstractmethod\n", - " def build_tree(self):\n", - " pass\n", - "\n", - " @abstractmethod\n", - " def init_parameters(self):\n", - " pass\n", - "\n", - " @abstractmethod\n", - " def _apply_discrete_dividends(self):\n", - " pass\n", - "\n", - " @abstractmethod\n", - " def delta(self):\n", - " pass\n", - "\n", - " @abstractmethod\n", - " def gamma(self):\n", - " pass\n", - "\n", - " def pricing_warning(self):\n", - " \"\"\"\n", - " Warning message for pricing issues.\n", - " This method can be overridden in subclasses to provide specific warnings.\n", - " \"\"\"\n", - " if not self.priced:\n", - " logger.warning(\"Option has not been priced yet. Please call the price() method first.\")\n", - " print(\"Option has not been priced yet. Please call the price() method first.\")\n", - "\n", - "\n", - " def reset_pricing_variables(self):\n", - " \"\"\"\n", - " Reset pricing variables for a new calculation.\n", - " \"\"\"\n", - " self.tree = []\n", - " self.option_values = []\n", - " self.stock_tree = []\n", - " self.init_parameters()\n", - " self.build_tree()\n", - "\n", - " \n", - " def _tree_numerical(self, attr, dx_thresh=0.01):\n", - " \"\"\"\n", - " Calculate the numerical value of a Greek (delta, gamma, etc.) using the binomial tree.\n", - " This method is used for numerical approximation of Greeks.\n", - " \"\"\"\n", - " self.pricing_warning()\n", - " actual_value = getattr(self, attr)\n", - " bump = actual_value * dx_thresh\n", - " up_bump = actual_value + bump\n", - " down_bump = actual_value - bump\n", - " \n", - " setattr(self, attr, up_bump)\n", - " price_up = self.price()\n", - "\n", - " setattr(self, attr, down_bump)\n", - " price_down = self.price()\n", - "\n", - " ## Reset\n", - " setattr(self, attr, actual_value)\n", - "\n", - " return (price_up - price_down) / (2 * bump)\n", - " \n", - " def _tree_numerical_second_order(self, attr, dx_thresh=0.01):\n", - " \"\"\"\n", - " Calculate the second-order numerical value of a Greek using the binomial tree.\n", - " This method is used for numerical approximation of second-order Greeks.\n", - " \"\"\"\n", - " self.pricing_warning()\n", - " actual_value = getattr(self, attr)\n", - " bump = actual_value * dx_thresh\n", - " up_bump = actual_value + bump\n", - " down_bump = actual_value - bump\n", - " \n", - " setattr(self, attr, up_bump)\n", - " price_up = self.price()\n", - "\n", - " setattr(self, attr, actual_value)\n", - " price_mid = self.price()\n", - "\n", - " setattr(self, attr, down_bump)\n", - " price_down = self.price()\n", - "\n", - " ## Reset\n", - " setattr(self, attr, actual_value)\n", - "\n", - " return (price_up - 2 * price_mid + price_down) / (bump ** 2)\n", - " \n", - " def theta(self, dx_thresh=0.0001):\n", - " \"\"\"\n", - " Calculate the theta of the option using the binomial tree.\n", - " Theta is the change in option price with respect to a change in time to expiration.\n", - " Returns:\n", - " Theta value as a float.\n", - " \"\"\"\n", - " return -self._tree_numerical('T', dx_thresh)/DAILY_BASIS\n", - " \n", - " def vega(self, dx_thresh=0.0001):\n", - " \"\"\"\n", - " Calculate the vega of the option using the binomial tree.\n", - " Vega is the change in option price with respect to a change in volatility.\n", - " Returns:\n", - " Vega value as a float.\n", - " \"\"\"\n", - " return self._tree_numerical('sigma', dx_thresh)/100\n", - " \n", - " def rho(self, dx_thresh=0.0001):\n", - " \"\"\"\n", - " Calculate the rho of the option using the binomial tree.\n", - " Rho is the change in option price with respect to a change in risk-free interest rate.\n", - " Returns:\n", - " Rho value as a float.\n", - " \"\"\"\n", - " return self._tree_numerical('r', dx_thresh)/100\n", - "\n", - "\n", - " def volga(self, dx_thresh=0.0001):\n", - " \"\"\"\n", - " Calculate the volga of the option using the binomial tree.\n", - " Volga is the change in vega with respect to a change in volatility.\n", - " Returns:\n", - " Volga value as a float.\n", - " \"\"\"\n", - " return self._tree_numerical_second_order('sigma', dx_thresh)/100**2\n", - "\n", - "\n", - "\n", - " def __setattr__(self, name, value):\n", - " protected = [\n", - " 'K', 'expiration', 'sigma', 'r', 'N', 'S0', 'dividend_type', \n", - " 'div_yield', 'discrete_dividends', 'option_type', \n", - " 'start_date', 'valuation_date', 'T', 'american'\n", - " ]\n", - " \n", - " if not hasattr(self, '_initialized') or not self._initialized:\n", - " # Allow setting attributes before initialization\n", - " super().__setattr__(name, value)\n", - " return\n", - " \n", - " if hasattr(self, '_initialized') and self._initialized:\n", - " if name in protected:\n", - " # raise AttributeError(f\"'{name}' is read-only after initialization.\")\n", - " logger.warning(f\"'{name}' is read-only after initialization. Resetting pricing variables.\")\n", - " super().__setattr__(name, value) ## Set\n", - " if name in protected:\n", - " # Reset pricing variables if a protected attribute is set\n", - " logger.info(f\"Resetting pricing variables due to change in '{name}'.\")\n", - " self.reset_pricing_variables()\n", - "\n", - " def __repr__(self):\n", - " return f\"{self.__class__.__name__}(K={self.K}, expiration={self.expiration}, dividend_type={self.dividend_type}\"\n", - "\n", - " \n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": 100, - "metadata": {}, - "outputs": [], - "source": [ - "def crr_init_parameters(\n", - " sigma: float,\n", - " r: float,\n", - " T: float,\n", - " N: int,\n", - " div_yield: float = 0.0,\n", - " dividend_type: str = 'discrete'\n", - "):\n", - " \"\"\"\n", - " params:\n", - " sigma: Volatility of the underlying asset\n", - " r: Risk-free interest rate\n", - " dt: Time step size\n", - " div_yield: Dividend yield (if applicable)\n", - " dividend_type: Type of dividend ('discrete' or 'continuous'\n", - " \"\"\"\n", - " if N <= 0:\n", - " raise ValueError(\"N must be a positive integer.\")\n", - " if T <= 0:\n", - " raise ValueError(\"T must be a positive number.\")\n", - " if sigma < 0:\n", - " raise ValueError(\"sigma must be a non-negative number.\")\n", - " dt = T / N\n", - " if dividend_type == 'continuous':\n", - " y = div_yield ## Continuous dividend yield adjustment\n", - " else:\n", - " y = 0.0\n", - " u = np.exp(sigma * np.sqrt(dt))\n", - " d = 1 / u\n", - " p = (np.exp((r - y) * dt) - d) / (u - d)\n", - " if p < 0 or p > 1:\n", - " raise ValueError(f\"Invalid probability p={p}. It must be between 0 and 1.\")\n", - " return u, d, p\n", - "\n", - "\n", - "def build_tree(\n", - " S0: float, \n", - " u: float, \n", - " d: float, \n", - " N: int\n", - "):\n", - " \"\"\"\n", - " params:\n", - " S0: Initial stock price\n", - " u: Up factor (multiplier for upward movement)\n", - " d: Down factor (multiplier for downward movement)\n", - " N: Number of time steps in the binomial tree\n", - " Returns:\n", - " A 2D list representing the binomial tree of stock prices.\n", - " \"\"\"\n", - " if N < 0:\n", - " raise ValueError(\"N must be a non-negative integer.\")\n", - "\n", - " stock_tree = [\n", - " [S0 * (u ** j) * (d ** (i - j)) for j in range(i + 1)]\n", - " for i in range(N + 1)\n", - " ]\n", - " if len(stock_tree) != N + 1:\n", - " raise ValueError(f\"Expected {N + 1} rows in the stock tree, got {len(stock_tree)}.\")\n", - " return stock_tree\n", - "\n", - "\n", - "def apply_discrete_dividends(\n", - " discrete_dividends: List[tuple],\n", - " stock_tree: List[List[float]],\n", - " N: int\n", - "\n", - ")-> List[List[float]]: \n", - " \"\"\"\n", - " Apply discrete dividends to the stock tree.\n", - " discrete_dividends: List of tuples (time_fraction, dividend_amount)\n", - " stock_tree: The binomial tree of stock prices\n", - " N: Number of time steps in the binomial tree\n", - " Returns:\n", - " A modified stock tree with dividends applied.\n", - " \"\"\"\n", - " if not list(discrete_dividends):\n", - " return stock_tree \n", - " \n", - " for t_frac, div in discrete_dividends:\n", - " div_step = min(int(round(t_frac * N)), N)\n", - " for i in range(div_step, N + 1):\n", - " stock_tree[i] = [max(s - div, 0) for s in stock_tree[i]]\n", - " return stock_tree\n", - "\n", - "\n", - "def create_option_tree(\n", - " stock_tree: List[List[float]],\n", - " K: float,\n", - " option_type: str,\n", - " N: int\n", - ")-> List[List[float]]:\n", - " \"\"\"\n", - " Create the option value tree based on the stock price tree.\n", - " stock_tree: The binomial tree of stock prices\n", - " K: Strike price of the option\n", - " option_type: 'c' for call, 'p' for put\n", - " N: Number of time steps in the binomial tree\n", - " Returns:\n", - " A 2D list representing the option value tree.\n", - " \"\"\"\n", - " tree = deepcopy(stock_tree)\n", - " terminal_prices = tree[-1] # Get the terminal prices from the last row of the stock tree\n", - " if option_type == 'c':\n", - " option_values = [max(0, price - K) for price in terminal_prices] # Call option payoff\n", - " elif option_type == 'p':\n", - " option_values = [max(0, K - price) for price in terminal_prices]\n", - " \n", - " tree[-1] = option_values # Set the terminal option values in the last row of the tree\n", - " return option_values\n", - "\n", - "def calculate_option_values(\n", - " stock_tree: List[List[float]],\n", - " option_values: List[float],\n", - " K: float,\n", - " r: float,\n", - " dt: float,\n", - " N: int,\n", - " p: float = 0.5, # Probability of upward movement\n", - " american: bool = False,\n", - " option_type: str = 'c'\n", - ") -> List[List[float]]:\n", - " \"\"\"\n", - " Calculate the option values at each node in the binomial tree.\n", - " stock_tree: The binomial tree of stock prices\n", - " option_values: The terminal option values\n", - " r: Risk-free interest rate\n", - " dt: Time step size\n", - " N: Number of time steps in the binomial tree\n", - " Returns:\n", - " A 2D list representing the option value tree.\n", - " \"\"\"\n", - " # Backward induction to calculate option values at each node\n", - " for i in range(N - 1, -1, -1):\n", - " option_values = [\n", - " np.exp(-r * dt) * (p * option_values[j+1] + (1 - p) * option_values[j]) ## Ordered from down to up.\n", - " ## Moves from all power in d, to all power in u by 1 step. Counting down on size i\n", - " for j in range(i + 1) ## At each node, there is Node+1 size\n", - " ]\n", - "\n", - " # If American option, check for early exercise\n", - " if american:\n", - " early_exercise = [\n", - " max(val, (p - K) if option_type == 'c' else (K - p))\n", - " for p, val in zip(stock_tree[i], option_values)\n", - " ]\n", - " option_values = early_exercise\n", - " if i==1:\n", - " V1 = option_values.copy()\n", - " elif i==2:\n", - " V2 = option_values.copy()\n", - " return option_values[0], V1, V2\n", - "\n", - "def crr_binomial_pricing(\n", - " K: float,\n", - " T: float,\n", - " sigma: float,\n", - " r: float,\n", - " N: int = 100,\n", - " spot_price: float = None,\n", - " dividend_type: str = 'discrete',\n", - " div_amount: float = 0.0,\n", - " option_type: str = 'c',\n", - " american: bool = False\n", - ") -> float:\n", - " \"\"\"\n", - " Calculate the price of an option using the Cox-Ross-Rubinstein binomial model.\n", - " \n", - " Parameters:\n", - " - K: Strike price\n", - " - expiration: Expiration date of the option\n", - " - sigma: Volatility of the underlying asset\n", - " - r: Risk-free interest rate\n", - " - N: Number of time steps in the binomial tree\n", - " - spot_price: Current price of the underlying asset (optional)\n", - " - dividend_type: Type of dividend ('discrete' or 'continuous')\n", - " - div_amount: Amount of dividend (if applicable)\n", - " - option_type: 'c' for call, 'p' for put\n", - " - start_date: Start date for the option pricing (optional)\n", - " - valuation_date: Date for which the option is priced (optional)\n", - " \n", - " Returns:\n", - " The calculated price of the option.\n", - " \"\"\"\n", - " if spot_price is None:\n", - " raise ValueError(\"spot_price must be provided.\")\n", - " u, d, p = crr_init_parameters(sigma, r, T, N, div_yield=div_amount if dividend_type == 'continuous' else 0.0, dividend_type=dividend_type)\n", - " stock_tree = build_tree(spot_price, u, d, N)\n", - " if dividend_type == 'discrete':\n", - " stock_tree = apply_discrete_dividends(div_amount, stock_tree, N)\n", - "\n", - " option_values = create_option_tree(stock_tree, K, option_type, N)\n", - " option_price, _, _ = calculate_option_values(stock_tree, option_values, K, r, T / N, N, p, american, option_type)\n", - " return option_price\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from module_test.raw_code.optionlib_2.greeks.numerical.binomial import binomial_tree_price_batch\n", - "import time\n", - "sample_size = 2000\n", - "N = 200\n", - "test_size=aapl_chain.iloc[:sample_size]\n", - "start = time.time()\n", - "binomial_tree_price_batch(\n", - " K=test_size['Strike'].tolist(),\n", - " sigma= test_size['bs_vol'].tolist(),\n", - " S=test_size['S'].tolist(),\n", - " start_date=[test_valuation_date] * len(test_size),\n", - " expiration=test_size['Expiration'].tolist(),\n", - " r=[rates] * len(test_size),\n", - " N=N,\n", - " dividend_type='discrete',\n", - " div_amount=discrete_q_convert[:sample_size],\n", - " option_type=test_size['Right'].str.lower().tolist(),\n", - " valuation_date=[test_valuation_date] * len(test_size),\n", - " american=True,\n", - "\n", - ")\n", - "print(f\"Finished in {(time.time() - start)/60} minutes\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "from typing import List, Tuple\n", - "from numba import njit\n", - "from numba.typed import List\n", - "\n", - "\n", - "\n", - "\n", - "@njit\n", - "def crr_init_parameters(\n", - " sigma: float,\n", - " r: float,\n", - " T: float,\n", - " N: int,\n", - " div_yield: float = 0.0,\n", - " is_continuous: bool = True\n", - ") -> Tuple[float, float, float, float]:\n", - " \"\"\"\n", - " params:\n", - " sigma: Volatility of the underlying asset\n", - " r: Risk-free interest rate\n", - " dt: Time step size\n", - " div_yield: Dividend yield (if applicable)\n", - " dividend_type: Type of dividend ('discrete' or 'continuous'\n", - " \"\"\"\n", - " dt = T / N\n", - " y = div_yield if is_continuous else 0.0\n", - " u = np.exp(sigma * np.sqrt(dt))\n", - " d = 1 / u\n", - " p = (np.exp((r - y) * dt) - d) / (u - d)\n", - " return u, d, p, dt\n", - "\n", - "@njit\n", - "def build_tree(S0: float, u: float, d: float, N: int) -> np.ndarray:\n", - " \"\"\"\n", - " params:\n", - " S0: Initial stock price\n", - " u: Up factor (multiplier for upward movement)\n", - " d: Down factor (multiplier for downward movement)\n", - " N: Number of time steps in the binomial tree\n", - " Returns:\n", - " A 2D list representing the binomial tree of stock prices.\n", - " \"\"\"\n", - " tree = np.zeros((N + 1, N + 1))\n", - " for i in range(N + 1):\n", - " for j in range(i + 1):\n", - " tree[i, j] = S0 * (u ** j) * (d ** (i - j))\n", - " return tree\n", - "\n", - "@njit\n", - "def apply_discrete_dividends(dividends: List[Tuple[float, float]], tree: np.ndarray, N: int):\n", - " \"\"\"\n", - " Apply discrete dividends to the stock tree.\n", - " discrete_dividends: List of tuples (time_fraction, dividend_amount)\n", - " stock_tree: The binomial tree of stock prices\n", - " N: Number of time steps in the binomial tree\n", - " Returns:\n", - " A modified stock tree with dividends applied.\n", - " \"\"\"\n", - " for t_frac, div in dividends:\n", - " div_step = min(int(round(t_frac * N)), N)\n", - " for i in range(div_step, N + 1):\n", - " for j in range(i + 1):\n", - " tree[i, j] = max(tree[i, j] - div, 0)\n", - "\n", - "@njit\n", - "def create_option_tree(tree: np.ndarray, K: float, option_type: int, N: int) -> np.ndarray:\n", - " \"\"\"\n", - " Create the option value tree based on the stock price tree.\n", - " stock_tree: The binomial tree of stock prices\n", - " K: Strike price of the option\n", - " option_type: 'c' for call, 'p' for put\n", - " N: Number of time steps in the binomial tree\n", - " Returns:\n", - " A 2D list representing the option value tree.\n", - " \"\"\"\n", - " option_tree = np.zeros_like(tree)\n", - " if option_type == 0:\n", - " for j in range(N + 1):\n", - " option_tree[N, j] = max(0.0, tree[N, j] - K)\n", - " else:\n", - " for j in range(N + 1):\n", - " option_tree[N, j] = max(0.0, K - tree[N, j])\n", - " return option_tree\n", - "\n", - "@njit\n", - "def calculate_option_values(\n", - " tree: np.ndarray,\n", - " option_tree: np.ndarray,\n", - " K: float,\n", - " r: float,\n", - " dt: float,\n", - " N: int,\n", - " p: float,\n", - " american: bool = False,\n", - " option_type: int = 0\n", - ") -> Tuple[float, np.ndarray, np.ndarray]:\n", - " \"\"\"\n", - " Calculate the option values at each node in the binomial tree.\n", - " stock_tree: The binomial tree of stock prices\n", - " option_values: The terminal option values\n", - " r: Risk-free interest rate\n", - " dt: Time step size\n", - " N: Number of time steps in the binomial tree\n", - " Returns:\n", - " A 2D list representing the option value tree.\n", - " \"\"\"\n", - " V1 = np.zeros(2)\n", - " V2 = np.zeros(3)\n", - " for i in range(N - 1, -1, -1):\n", - " for j in range(i + 1):\n", - " expected = np.exp(-r * dt) * (p * option_tree[i + 1, j + 1] + (1 - p) * option_tree[i + 1, j])\n", - " if american:\n", - " if option_type ==0:\n", - " intrinsic = max(tree[i, j] - K, 0)\n", - " else:\n", - " intrinsic = max(K - tree[i, j], 0)\n", - " option_tree[i, j] = max(expected, intrinsic)\n", - " else:\n", - " option_tree[i, j] = expected\n", - " if i == 2:\n", - " for j in range(3):\n", - " V2[j] = option_tree[i, j]\n", - " elif i == 1:\n", - " for j in range(2):\n", - " V1[j] = option_tree[i, j]\n", - " return option_tree[0, 0], V1, V2\n", - "\n", - "\n", - "def crr_binomial_pricing(\n", - " K: float,\n", - " T: float,\n", - " sigma: float,\n", - " r: float,\n", - " N: int,\n", - " S0: float,\n", - " option_type: str = 'c',\n", - " american: bool = False,\n", - " div_yield: float = 0.0,\n", - " dividends: List[Tuple[float, float]] = [],\n", - " dividend_type: str = 'discrete'\n", - ") -> float:\n", - " \"\"\"\n", - " Calculate the price of an option using the Cox-Ross-Rubinstein binomial model.\n", - " \n", - " Parameters:\n", - " - K: Strike price\n", - " - T: Time to expiration (in years)\n", - " - sigma: Volatility of the underlying asset\n", - " - r: Risk-free interest rate (annualized)\n", - " - N: Number of time steps in the binomial tree\n", - " - S0: Current price of the underlying asset\n", - " - option_type: 'c' for call, 'p' for put (default is 'c')\n", - " - american: True for American option, False for European option (default is False)\n", - " - div_yield: Dividend yield (annualized, default is 0.0)\n", - " - dividends: List of tuples (time fraction, amount) for discrete dividends (default is None)\n", - " - dividend_type: 'discrete' for discrete dividends, 'continuous' for continuous dividends (default is 'discrete')\n", - " \n", - " If 'discrete', dividends should be a list of tuples where each tuple contains the time fraction (as a float) and the amount (as a float).\n", - " If 'continuous', div_yield should be provided as a float representing the annualized dividend yield.\n", - " If no dividends are provided, the function assumes no dividends.\n", - " If 'dividend_type' is 'continuous', the function will treat the dividend yield as a continuous yield.\n", - " \n", - " Returns:\n", - " The calculated price of the option.\n", - " \"\"\"\n", - " is_continuous = (dividend_type == 'continuous')\n", - " option_type = 0 if option_type.lower() == 'c' else 1 # 0 for call, 1 for put\n", - " dividends = convert_schedule_to_numba(dividends) # Convert dividends to a Numba List\n", - "\n", - " return _crr_binomial_pricing_jit(\n", - " K, T, sigma, r, N, S0, option_type, american,\n", - " div_yield, dividends, is_continuous\n", - " )\n", - "\n", - "\n", - "\n", - "@njit\n", - "def _crr_binomial_pricing_jit(\n", - " K: float,\n", - " T: float,\n", - " sigma: float,\n", - " r: float,\n", - " N: int,\n", - " S0: float,\n", - " option_type: int = 0,\n", - " american: bool = False,\n", - " div_yield: float = 0.0,\n", - " dividends: List[Tuple[float, float]] = [],\n", - " is_continuous: bool = True\n", - ") -> float:\n", - " \"\"\"\n", - " Calculate the price of an option using the Cox-Ross-Rubinstein binomial model.\n", - " \n", - " Parameters:\n", - " - K: Strike price\n", - " - T: Time to expiration (in years)\n", - " - sigma: Volatility of the underlying asset\n", - " - r: Risk-free interest rate (annualized)\n", - " - N: Number of time steps in the binomial tree\n", - " - S0: Current price of the underlying asset\n", - " - option_type: 'c' for call, 'p' for put (default is 'c')\n", - " - american: True for American option, False for European option (default is False)\n", - " - div_yield: Dividend yield (annualized, default is 0.0)\n", - " - dividends: List of tuples (time fraction, amount) for discrete dividends (default is None)\n", - " - dividend_type: 'discrete' for discrete dividends, 'continuous' for continuous dividends (default is 'discrete')\n", - " \n", - " If 'discrete', dividends should be a list of tuples where each tuple contains the time fraction (as a float) and the amount (as a float).\n", - " If 'continuous', div_yield should be provided as a float representing the annualized dividend yield.\n", - " If no dividends are provided, the function assumes no dividends.\n", - " If 'dividend_type' is 'continuous', the function will treat the dividend yield as a continuous yield.\n", - " \n", - " Returns:\n", - " The calculated price of the option.\n", - " \"\"\"\n", - " u, d, p, dt = crr_init_parameters(sigma, r, T, N, div_yield, is_continuous)\n", - " tree = build_tree(S0, u, d, N)\n", - " apply_discrete_dividends(dividends, tree, N)\n", - " option_tree = create_option_tree(tree, K, option_type, N)\n", - " price, _, _ = calculate_option_values(tree, option_tree, K, r, dt, N, p, american, option_type)\n", - " return price\n", - "\n", - "crr_pricing_params = list(zip(\n", - " test_size['Strike'].tolist(),\n", - " T[:sample_size],\n", - " test_size['bs_vol'].tolist(),\n", - " r[:sample_size],\n", - " [N] * len(test_size),\n", - " test_size['S'].tolist(),\n", - " ['discrete'] * len(test_size),\n", - " discrete_q_convert[:sample_size],\n", - " test_size['Right'].str.lower().tolist(),\n", - " [True] * len(test_size),\n", - "))\n", - "\n", - "\n", - "from numba.typed import List\n", - "from numba import types\n", - "\n", - "def convert_schedule_to_numba(schedule: list[tuple[float, float]]) -> List:\n", - " lst = List.empty_list(types.UniTuple(types.float64, 2))\n", - " for t_frac, amount in schedule:\n", - " lst.append((float(t_frac), float(amount)))\n", - " return lst\n", - "\n", - "jit_divs = [\n", - " convert_schedule_to_numba(x.get_schedule()) if x.get_schedule()\n", - " else List.empty_list(types.UniTuple(types.float64, 2))\n", - " for x in discrete_q_convert[:sample_size]\n", - "]\n", - "\n", - "jit_divs = discrete_q_convert[:sample_size]\n", - "\n", - "\n", - "# Convert option type: 0 = call, 1 = put\n", - "option_type_encoded = (test_size['Right'].str.lower() )#.astype(np.int64).tolist()\n", - "\n", - "crr_pricing_params = list(zip(\n", - " test_size['Strike'].tolist(), # K\n", - " T[:sample_size], # T\n", - " test_size['bs_vol'].tolist(), # sigma\n", - " r[:sample_size], # r\n", - " [N] * sample_size, # N\n", - " test_size['S'].tolist(), # S0\n", - " option_type_encoded, # option_type (int)\n", - " [True] * sample_size, # american\n", - " [0.0] * sample_size, # div_yield\n", - " jit_divs, # dividends\n", - " [False] * sample_size # is_continuous\n", - "))\n", - "\n", - "\n", - "start = time.time()\n", - "fast_pricing = [crr_binomial_pricing(*params) for params in crr_pricing_params]\n", - "print(f\"Finished in {(time.time() - start)/60} minutes\")\n" - ] - }, - { - "cell_type": "code", - "execution_count": 101, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "class VectorBinomialBase(BinomialBase):\n", - "\n", - " @abstractmethod\n", - " def init_parameters(self):\n", - " \"\"\"\n", - " Initialize parameters for the binomial tree.\n", - " This method should be called before building the tree.\n", - " \"\"\"\n", - " pass\n", - "\n", - " def build_tree(self):\n", - " \"\"\"\n", - " Build the binomial tree structure.\n", - " This method should be implemented in subclasses.\n", - " \"\"\"\n", - " self.stock_tree = build_tree(\n", - " S0=self.S0,\n", - " u=self.u,\n", - " d=self.d,\n", - " N=self.N\n", - " )\n", - " if self.dividend_type == 'discrete':\n", - " self._apply_discrete_dividends() # Apply discrete dividends at time step 0\n", - "\n", - " def _apply_discrete_dividends(self) -> float:\n", - " \"\"\"\n", - " Apply discrete dividend adjustment to the stock price at a given time step.\n", - " \"\"\"\n", - " if not list(self.discrete_dividends):\n", - " return \n", - " self.stock_tree = apply_discrete_dividends(\n", - " discrete_dividends=self.discrete_dividends,\n", - " stock_tree=self.stock_tree,\n", - " N=self.N\n", - " )\n", - "\n", - " def __create_option_tree(self):\n", - " self.option_values = create_option_tree(\n", - " stock_tree=self.stock_tree,\n", - " K=self.K,\n", - " option_type=self.option_type,\n", - " N=self.N\n", - " )\n", - "\n", - " def price(self):\n", - " self.__create_option_tree() # Create the option tree based on terminal stock prices\n", - " option_values = self.option_values\n", - " price, self.V1, self.V2 = calculate_option_values(\n", - " stock_tree=self.stock_tree,\n", - " option_values=option_values,\n", - " K=self.K,\n", - " r=self.r,\n", - " dt=self.dt,\n", - " N=self.N,\n", - " p=self.p,\n", - " american=self.american,\n", - " option_type=self.option_type\n", - " )\n", - " self.priced = True\n", - " return price\n", - " \n", - " def delta(self):\n", - " \"\"\"\n", - " Calculate the delta of the option using the binomial tree.\n", - " Delta is the change in option price with respect to a change in the underlying asset price.\n", - " Returns:\n", - " Delta value as a float.\n", - " \"\"\"\n", - " self.pricing_warning()\n", - " if self.N < 1:\n", - " raise ValueError(\"N must be at least 1 to calculate delta.\")\n", - " \n", - " if not hasattr(self, 'V1'):\n", - " self.price()\n", - " \n", - " stock_tree = self.stock_tree\n", - " delta = (self.V1[1] - self.V1[0]) / (stock_tree[1][1] - stock_tree[1][0])\n", - " return delta\n", - " \n", - " def gamma(self):\n", - " \"\"\"\n", - " Calculate the gamma of the option using the binomial tree.\n", - " Gamma is the rate of change of delta with respect to a change in the underlying asset price.\n", - " Returns:\n", - " Gamma value as a float.\n", - " \"\"\"\n", - " self.pricing_warning()\n", - " if self.N < 2:\n", - " raise ValueError(\"N must be at least 2 to calculate gamma.\")\n", - " \n", - " if not hasattr(self, 'V2'):\n", - " self.price()\n", - " \n", - " V2, S2 = self.V2, self.stock_tree[2]\n", - " delta_up = (V2[2] - V2[1]) / (S2[2] - S2[1])\n", - " delta_down = (V2[1] - V2[0]) / (S2[1] - S2[0])\n", - " gamma = (delta_up - delta_down) / ((S2[2] - S2[0]) / 2) # Average change in delta over the interval\n", - " return gamma\n", - " \n", - "\n", - "\n", - "\n", - "class VectorBinomialCRR(VectorBinomialBase):\n", - "\n", - " def init_parameters(self):\n", - " \"\"\"\n", - " Initialize parameters for the binomial tree.\n", - " This method should be called before building the tree.\n", - " \"\"\"\n", - " q = self.div_yield if self.dividend_type == 'continuous' else 0.0\n", - " self.u, self.d, self.p = crr_init_parameters(\n", - " sigma=self.sigma,\n", - " r=self.r,\n", - " T=self.T,\n", - " N=self.N,\n", - " div_yield=q,\n", - " dividend_type=self.dividend_type\n", - " )\n", - "\n", - "class VectorBinomialLR(VectorBinomialBase): # or NodeBinomialBase\n", - " def init_parameters(self):\n", - " \"\"\"\n", - " Initialize Leisen-Reimer parameters: u, d, p.\n", - " \"\"\"\n", - " q = self.div_yield if self.dividend_type == 'continuous' else 0.0\n", - " self.dt = self.T / self.N\n", - " v = self.sigma * np.sqrt(self.dt)\n", - "\n", - " self.u = np.exp(v)\n", - " self.d = np.exp(-v)\n", - "\n", - " d1 = (\n", - " np.log(self.S0 / self.K) +\n", - " (self.r - q + 0.5 * self.sigma ** 2) * self.T\n", - " ) / (self.sigma * np.sqrt(self.T))\n", - "\n", - " x = d1 # Can also use d2 for puts, but d1 gives better results overall\n", - "\n", - " # Peizer-Pratt inversion of CDF (used by Leisen-Reimer)\n", - " w = np.sqrt(1 - np.exp(-2 * (x ** 2) / self.N))\n", - " self.p = 0.5 + np.sign(x) * w / 2" - ] - }, - { - "cell_type": "code", - "execution_count": 102, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "class Node(Scalar):\n", - " def __init__(self, stock_price, position,option_value=0.0):\n", - " super().__init__(value=option_value)\n", - " self.stock_price = stock_price\n", - " self.value = option_value\n", - " self.up = None\n", - " self.down = None\n", - " self.position = position # Position in the binomial tree (e.g., index or identifier)\n", - "\n", - " @property\n", - " def option_value(self):\n", - " return self.value\n", - " \n", - " @option_value.setter\n", - " def option_value(self, value):\n", - " self.value = value\n", - "\n", - " def __eq__(self, value):\n", - " if isinstance(value, Node):\n", - " return self.stock_price == value.stock_price and self.position == value.position\n", - " return False\n", - " \n", - " def __repr__(self):\n", - " return f\"Node(price={self.stock_price}, option_value={self.option_value}, pos={self.position})\"\n", - "\n", - "\n", - "\n", - "\n", - "class NodeBinomialBase(BinomialBase):\n", - "\n", - " @abstractmethod\n", - " def init_parameters(self):\n", - " \"\"\"\n", - " Initialize parameters for the binomial tree.\n", - " This method should be called before building the tree.\n", - " \"\"\"\n", - " pass\n", - "\n", - " def build_tree(self):\n", - " \"\"\"\n", - " Build the binomial tree structure.\n", - " This method should be implemented in subclasses.\n", - " \"\"\"\n", - " self.tree = []\n", - " for i in range(self.N + 1):\n", - " level = []\n", - " for j in range(i + 1):\n", - " S = self.S0 * (self.u ** j) * (self.d ** (i - j))\n", - " node = Node(stock_price=S, position=(i, j))\n", - " level.append(node)\n", - " self.tree.append(level)\n", - "\n", - " for i in range(self.N):\n", - " for j in range(i + 1):\n", - " current = self.tree[i][j]\n", - " current.down = self.tree[i+1][j] # one down move\n", - " current.up = self.tree[i+1][j+1] # one up move\n", - "\n", - "\n", - " if self.dividend_type == 'discrete':\n", - " self._apply_discrete_dividends() # Apply discrete dividends at time step 0\n", - "\n", - " def _apply_discrete_dividends(self) -> float:\n", - " \"\"\"\n", - " Apply discrete dividend adjustment to the stock price at a given time step.\n", - " \"\"\"\n", - " if not list(self.discrete_dividends):\n", - " return \n", - " \n", - " for t_frac, div in self.discrete_dividends:\n", - " div_step = min(int(round(t_frac * self.N)), self.N)\n", - " for i in range(div_step, self.N + 1):\n", - " for node in self.tree[i]:\n", - " node.stock_price = max(node.stock_price - div, 0)\n", - "\n", - "\n", - " def __create_option_tree(self):\n", - " terminal_nodes = self.tree[-1]\n", - " for node in terminal_nodes:\n", - " node.option_value = (\n", - " max(0, node.stock_price - self.K)\n", - " if self.option_type == 'c'\n", - " else max(0, self.K - node.stock_price)\n", - " )\n", - "\n", - " def price(self):\n", - " self.__create_option_tree()\n", - " tree = self.tree\n", - "\n", - " for i in range(self.N - 1, -1, -1):\n", - " for j, node in enumerate(tree[i]):\n", - " up_val = node.up.option_value\n", - " down_val = node.down.option_value\n", - " expected = np.exp(-self.r * self.dt) * (\n", - " self.p * up_val + (1 - self.p) * down_val\n", - " )\n", - "\n", - " if self.american:\n", - " intrinsic = (\n", - " max(node.stock_price - self.K, 0)\n", - " if self.option_type == 'c'\n", - " else max(self.K - node.stock_price, 0)\n", - " )\n", - " node.option_value = max(expected, intrinsic)\n", - " else:\n", - " node.option_value = expected\n", - "\n", - " self.priced = True\n", - " return tree[0][0].option_value\n", - " \n", - " \n", - " def delta(self):\n", - " \"\"\"\n", - " Calculate the delta of the option using the binomial tree.\n", - " Delta is the change in option price with respect to a change in the underlying asset price.\n", - " Returns:\n", - " Delta value as a float.\n", - " \"\"\"\n", - " self.pricing_warning()\n", - " if self.N < 1:\n", - " raise ValueError(\"N must be at least 1 to calculate delta.\")\n", - " \n", - " stock_tree = self.tree\n", - " V1 = self.tree[1]\n", - " delta = (V1[1] - V1[0]) / (stock_tree[1][1].stock_price - stock_tree[1][0].stock_price)\n", - " return delta\n", - " \n", - " def gamma(self):\n", - " \"\"\"\n", - " Calculate the gamma of the option using the binomial tree.\n", - " Gamma is the rate of change of delta with respect to a change in the underlying asset price.\n", - " Returns:\n", - " Gamma value as a float.\n", - " \"\"\"\n", - " self.pricing_warning()\n", - " if self.N < 2:\n", - " raise ValueError(\"N must be at least 2 to calculate gamma.\")\n", - " \n", - " if not hasattr(self, 'V2'):\n", - " self.price()\n", - " \n", - " V2, S2 = self.tree[2], self.tree[2]\n", - " delta_up = (V2[2] - V2[1]) / (S2[2].stock_price - S2[1].stock_price)\n", - " delta_down = (V2[1] - V2[0]) / (S2[1].stock_price - S2[0].stock_price)\n", - " gamma = (delta_up - delta_down) / ((S2[2].stock_price - S2[0].stock_price) / 2) # Average change in delta over the interval\n", - " return gamma\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "class NodeBinomialCRR(NodeBinomialBase):\n", - "\n", - " def init_parameters(self):\n", - " \"\"\"\n", - " Initialize parameters for the binomial tree.\n", - " This method should be called before building the tree.\n", - " \"\"\"\n", - " if self.dividend_type == 'continuous':\n", - " y = self.div_yield ## Continuous dividend yield adjustment\n", - " else:\n", - " y = 0.0\n", - " self.u = np.exp(self.sigma * np.sqrt(self.dt))\n", - " self.d = np.exp(-(self.sigma * np.sqrt(self.dt)))\n", - " self.p = (np.exp((self.r - y) * self.dt) - self.d) / (self.u - self.d)\n", - "\n", - " \n", - "\n", - "class NodeBinomialLR(NodeBinomialBase): # or NodeBinomialBase\n", - " def init_parameters(self):\n", - " \"\"\"\n", - " Initialize Leisen-Reimer parameters: u, d, p.\n", - " \"\"\"\n", - " q = self.div_yield if self.dividend_type == 'continuous' else 0.0\n", - " self.dt = self.T / self.N\n", - " v = self.sigma * np.sqrt(self.dt)\n", - "\n", - " self.u = np.exp(v)\n", - " self.d = np.exp(-v)\n", - "\n", - " d1 = (\n", - " np.log(self.S0 / self.K) +\n", - " (self.r - q + 0.5 * self.sigma ** 2) * self.T\n", - " ) / (self.sigma * np.sqrt(self.T))\n", - "\n", - " x = d1 # Can also use d2 for puts, but d1 gives better results overall\n", - "\n", - " # Peizer-Pratt inversion of CDF (used by Leisen-Reimer)\n", - " w = np.sqrt(1 - np.exp(-2 * (x ** 2) / self.N))\n", - " self.p = 0.5 + np.sign(x) * w / 2\n" - ] - }, - { - "cell_type": "code", - "execution_count": 103, - "metadata": {}, - "outputs": [], - "source": [ - "class MarketBinomial(VectorBinomialCRR):\n", - " def __init__(self, \n", - " tick: str,\n", - " K: float,\n", - " expiration: datetime|str,\n", - " sigma: float,\n", - " N: int = 100,\n", - " dividend_type: str = 'discrete',\n", - " option_type: str = 'c',\n", - " start_date: datetime|str = None,\n", - " valuation_date: datetime|str = None,\n", - " r: float = None,\n", - " american: bool = False):\n", - " # super().__init__()\n", - " \"\"\"\n", - " Base class for Binomial Tree models.\n", - " K: Strike price\n", - " expiration: Expiration date of the option\n", - " sigma: Volatility of the underlying asset\n", - " r: Risk-free interest rate\n", - " N: Number of time steps in the binomial tree\n", - " spot_price: Current price of the underlying asset (optional)\n", - " dividend_type: Type of dividend ('discrete' or 'continuous')\n", - " div_amount: Amount of dividend (if applicable)\n", - " option_type: 'c' for call, 'p' for put\n", - " start_date: Start date for the option pricing (optional)\n", - " valuation_date: Date for which the option is priced (optional)\n", - " \"\"\"\n", - " self._initialized = False\n", - " self.K = K\n", - " self.expiration = expiration\n", - " self.sigma = sigma\n", - " self.N = N\n", - " self.forward = EquityForward(\n", - " start_date=start_date or datetime.now(),\n", - " end_date=expiration,\n", - " ticker=tick,\n", - " valuation_date=valuation_date or datetime.now(),\n", - " risk_free_rate=r,\n", - " dividend_type=dividend_type,\n", - " dividend=None # Market dividend will be set later\n", - " )\n", - " self.r = r or self.forward.risk_free_rate\n", - " self.dividend_type = dividend_type\n", - " self.option_type = option_type\n", - " self.start_date = start_date\n", - " self.valuation_date = valuation_date\n", - " self.T = time_distance_helper(self.expiration, self.valuation_date or datetime.now())\n", - " self.american = american\n", - " self.dt = self.T / self.N\n", - " self.tree = []\n", - " self.option_values = []\n", - " self.stock_tree = []\n", - " self.init_parameters()\n", - " self.build_tree()\n", - " self._initialized = True\n", - "\n", - " @property\n", - " def asset(self):\n", - " \"\"\"\n", - " Property to access the underlying asset of the forward contract.\n", - " \"\"\"\n", - " return self.forward.dividend.asset\n", - "\n", - " @property\n", - " def S0(self):\n", - " \"\"\"\n", - " Property to access the current spot price of the underlying asset.\n", - " \"\"\"\n", - " return self.asset.spot_price\n", - "\n", - " @property\n", - " def discrete_dividends(self):\n", - " \"\"\"\n", - " Property to access the discrete dividends of the forward contract.\n", - " \"\"\"\n", - " if isinstance(self.forward.dividend, DividendSchedule):\n", - " return self.forward.dividend.get_year_fractions()\n", - " else:\n", - " return []\n", - " \n", - " @property\n", - " def div_yield(self):\n", - " \"\"\"\n", - " Property to access the continuous dividend yield of the forward contract.\n", - " \"\"\"\n", - " if isinstance(self.forward.dividend, ContinuousDividendYield):\n", - " return self.forward.dividend.yield_rate\n", - " else:\n", - " return 0.0\n", - "\n", - "\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": 104, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{('AAPL',\n", - " '2025-01-06 16:00:00'): Stock(Ticker: AAPL, Build Date: 2025-01-06 16:00:00),\n", - " ('COST',\n", - " '2025-01-03 16:00:00'): Stock(Ticker: COST, Build Date: 2025-01-03 16:00:00),\n", - " ('CVX',\n", - " '2024-06-17 16:00:00'): Stock(Ticker: CVX, Build Date: 2024-06-17 16:00:00),\n", - " ('AAPL',\n", - " '2023-01-03 16:00:00'): Stock(Ticker: AAPL, Build Date: 2023-01-03 16:00:00),\n", - " ('AAPL',\n", - " '2025-07-14 16:00:00'): Stock(Ticker: AAPL, Build Date: 2025-07-14 16:00:00),\n", - " ('AAPL',\n", - " '2025-07-16 16:00:00'): Stock(Ticker: AAPL, Build Date: 2025-07-16 16:00:00)}" - ] - }, - "execution_count": 104, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from trade.assets.rates import reset_rates_cache\n", - "Stock.list_instances()" - ] - }, - { - "cell_type": "code", - "execution_count": 105, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.0036162922856715937" - ] - }, - "execution_count": 105, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# 2025-07-16\tAAPL\t2026-12-18\t450.0\tC\t8\t0.44\t18\t0.48\t20250716\t0.460\t0.467692\t0.269251\n", - "start, valuation_date = test_start, test_valuation_date\n", - "strike = 450.0\n", - "opt_type = 'c'\n", - "mid = 0.460\n", - "vol = 0.269251\n", - "exp_date = '2026-12-18'\n", - "\n", - "mkt_forward = EquityForward(\n", - " start_date=start,\n", - " end_date=end,\n", - " ticker='AAPL',\n", - " valuation_date=valuation_date,\n", - " risk_free_rate=rates,\n", - " dividend_type='discrete',\n", - " dividend=None, # Market dividend will be set later\n", - ")\n", - "\n", - "mkt_forward_cont = EquityForward(\n", - " start_date=start,\n", - " end_date=end,\n", - " ticker='AAPL',\n", - " valuation_date=valuation_date,\n", - " risk_free_rate=rates,\n", - " dividend_type='continuous',\n", - " dividend=None, # Market dividend will be set later\n", - "\n", - ")\n", - "# get_spot('AAPL', start)\n", - "mkt_forward_cont.dividend.yield_rate" - ] - }, - { - "cell_type": "code", - "execution_count": 106, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.46254616656251185" - ] - }, - "execution_count": 106, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "mkt_bt = MarketBinomial(\n", - " tick='AAPL',\n", - " K=strike,\n", - " expiration=exp_date,\n", - " sigma=vol,\n", - " N=500,\n", - " dividend_type='continuous',\n", - " option_type=opt_type,\n", - " start_date=start,\n", - " valuation_date=valuation_date,\n", - " american=True\n", - ")\n", - "\n", - "mkt_bt.price()" - ] - }, - { - "cell_type": "code", - "execution_count": 107, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "210.16000366210938" - ] - }, - "execution_count": 107, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "mkt_bt.asset.spot_price" - ] - }, - { - "cell_type": "code", - "execution_count": 108, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.05664847099734474" - ] - }, - "execution_count": 108, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "crr_binomial_pricing(\n", - " K=strike,\n", - " sigma=vol,\n", - " r=mkt_forward.risk_free_rate,\n", - " N=500,\n", - " spot_price=mkt_bt.asset.spot_price,\n", - " dividend_type='continuous',\n", - " option_type=opt_type,\n", - " T= time_distance_helper(\n", - " mkt_forward.end_date, mkt_forward.valuation_date\n", - " ),\n", - " american=True,\n", - " div_amount=mkt_forward_cont.dividend.yield_rate\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 109, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "7.688747432059079e-06" - ] - }, - "execution_count": 109, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bt = NodeBinomialLR(\n", - " K=strike,\n", - " expiration=exp_date,\n", - " sigma=vol,\n", - " r=rates,\n", - " N=200,\n", - " spot_price=S,\n", - " dividend_type='discrete',\n", - " div_amount=mkt_forward.dividend.get_year_fractions(),\n", - " option_type=opt_type,\n", - " start_date=start,\n", - " valuation_date=valuation_date,\n", - " american=True\n", - ")\n", - "# bt.price()\n", - "bt.tree\n", - "bt.price()" - ] - }, - { - "cell_type": "code", - "execution_count": 110, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(2.0549032318330954e-06,\n", - " 0.9775391951331914,\n", - " 1.0229768841787958,\n", - " 0.3999360964036095)" - ] - }, - "execution_count": 110, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bt = VectorBinomialLR(\n", - " K=strike,\n", - " expiration=exp_date,\n", - " sigma=vol,\n", - " r=rates,\n", - " N=200,\n", - " spot_price=S,\n", - " dividend_type='discrete',\n", - " div_amount=mkt_forward.dividend.get_year_fractions(),\n", - " option_type='c',\n", - " start_date=start,\n", - " valuation_date=valuation_date,\n", - " american=False\n", - ")\n", - "# bt.price()\n", - "bt.price(),bt.d, bt.u, bt.p\n", - "\n", - "# bt.price()\n" - ] - }, - { - "cell_type": "code", - "execution_count": 111, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(0.47693312688475326,\n", - " 0.9898921290700986,\n", - " 1.0102110832413596,\n", - " 0.5004255089632036)" - ] - }, - "execution_count": 111, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bt = VectorBinomialCRR(\n", - " K=strike,\n", - " expiration=exp_date,\n", - " sigma=vol,\n", - " r=rates,\n", - " N=1000,\n", - " spot_price=S,\n", - " dividend_type='discrete',\n", - " div_amount=mkt_forward.dividend.get_year_fractions(),\n", - " option_type=opt_type,\n", - " start_date=start,\n", - " valuation_date=valuation_date,\n", - " american=True\n", - ")\n", - "# bt.price()\n", - "bt.tree\n", - "bt.price(),bt.d, bt.u, bt.p\n" - ] - }, - { - "cell_type": "code", - "execution_count": 112, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(0.4769331268847631,\n", - " 0.9898921290700985,\n", - " 0.5004255089632063,\n", - " 1.0102110832413596)" - ] - }, - "execution_count": 112, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bt = NodeBinomialCRR(\n", - " K=strike,\n", - " expiration=exp_date,\n", - " sigma=vol,\n", - " r=rates,\n", - " N=1000,\n", - " spot_price=S,\n", - " dividend_type='discrete',\n", - " div_amount=mkt_forward.dividend.get_year_fractions(),\n", - " option_type=opt_type,\n", - " start_date=start,\n", - " valuation_date=valuation_date,\n", - " american=True\n", - ")\n", - "# bt.price()\n", - "# bt.tree\n", - "# bt.price()\n", - "bt.price(),bt.d, bt.p, bt.u" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Vectorized\n", - "\n", - "Using: bjerksund_stensland" - ] - }, - { - "cell_type": "code", - "execution_count": 113, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.4645375373328875" - ] - }, - "execution_count": 113, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "def norm_cdf(x):\n", - " return 0.5 * (1 + erf(x / sqrt(2)))\n", - "\n", - "\n", - "def phi(s, t, gamma, H, I, r, b, sigma):\n", - " lamb = -r + gamma * b + 0.5 * gamma * (gamma - 1) * sigma ** 2\n", - " kappa = 2 * b / (sigma ** 2) + (2 * gamma - 1)\n", - " d = -(log(s / H) + (b + (gamma - 0.5) * sigma ** 2) * t) / (sigma * sqrt(t))\n", - " return (\n", - " exp(lamb * t)\n", - " * s ** gamma\n", - " * (norm_cdf(d) - (I / s) ** kappa * norm_cdf(d - 2 * log(I / s) / (sigma * sqrt(t))))\n", - " )\n", - "\n", - "\n", - "def bjerksund_stensland_2002(\n", - " S: float,\n", - " K: float,\n", - " T: float,\n", - " r: float,\n", - " sigma: float,\n", - " option_type: Literal[\"c\", \"p\"] = \"c\",\n", - " dividend_type: Literal[\"continuous\", \"discrete\"] = \"continuous\",\n", - " dividend: float | List[Tuple[float, float]] = 0.0,\n", - ") -> float:\n", - " \"\"\"\n", - " Vectorized Bjerksund-Stensland (2002) American option pricer.\n", - " \n", - " Parameters\n", - " ----------\n", - " S : float\n", - " Spot price\n", - " K : float\n", - " Strike price\n", - " T : float\n", - " Time to maturity (in years)\n", - " r : float\n", - " Risk-free interest rate\n", - " sigma : float\n", - " Volatility\n", - " option_type : 'c' or 'p'\n", - " Option type: call or put\n", - " dividend_type : 'continuous' or 'discrete'\n", - " How dividends are modeled\n", - " dividend : float or list of (t_frac, amount)\n", - " - If continuous, pass yield (float)\n", - " - If discrete, pass list of (time_frac, amount)\n", - " \n", - " Returns\n", - " -------\n", - " float\n", - " Option price\n", - " \"\"\"\n", - " if dividend_type == \"continuous\":\n", - " q = float(dividend)\n", - " pv_divs = 0.0\n", - " S_adj = S\n", - " else:\n", - " # Discrete dividend: subtract PV(divs) from spot\n", - " pv_divs = sum([amount * exp(-r * t_frac * T) for t_frac, amount in dividend])\n", - " S_adj = max(S - pv_divs, 1e-8) # avoid negative\n", - "\n", - " q = 0.0 # no continuous div\n", - " \n", - " b = r - q\n", - " sigma_sqrt_T = sigma * sqrt(T)\n", - " if S_adj <= 0 or T <= 0 or sigma <= 0:\n", - " return max(0.0, (S_adj - K) if option_type == \"c\" else (K - S_adj))\n", - " \n", - "\n", - "\n", - " beta = (0.5 - b / sigma ** 2) + sqrt(((b / sigma ** 2 - 0.5) ** 2) + 2 * r / sigma ** 2)\n", - " if abs(beta - 1) < 1e-6:\n", - " beta += 1e-4 # or skip BS pricing entirely here, fallback to European\n", - " B_inf = beta / (beta - 1) * K\n", - " B0 = max(K, r / (r - b) * K) if b != r else K * 1.5 # avoids division by zero\n", - " h = -(b * T + 2 * sigma_sqrt_T) * (B0 / (B_inf - B0))\n", - " I = B0 + (B_inf - B0) * (1 - exp(h))\n", - "\n", - " if S_adj >= I:\n", - " call_price = S_adj - K\n", - " else:\n", - " alpha = (I - K) * I ** (-beta)\n", - " phi_1 = phi(S_adj, T, beta, I, I, r, b, sigma)\n", - " phi_2 = phi(S_adj, T, 1, I, I, r, b, sigma)\n", - " phi_3 = phi(S_adj, T, 1, K, I, r, b, sigma)\n", - " phi_4 = phi(S_adj, T, 0, I, I, r, b, sigma)\n", - " phi_5 = phi(S_adj, T, 0, K, I, r, b, sigma)\n", - "\n", - " call_price = alpha * S_adj ** beta - alpha * phi_1 + phi_2 - phi_3 - K * phi_4 + K * phi_5\n", - "\n", - " if option_type == \"c\":\n", - " return call_price\n", - " else:\n", - " # American put via put-call parity (approximate, not exact)\n", - " european_put = K * exp(-r * T) - S_adj * exp(-q * T)\n", - " return call_price - (S_adj * exp(-q * T) - K * exp(-r * T)) + european_put\n", - " \n", - "\n", - "\n", - "\n", - "bjerksund_stensland_2002(\n", - " S=S, \n", - " K=strike, \n", - " T=time_distance_helper(exp_date, test_valuation_date), \n", - " r=rates, \n", - " sigma=vol, \n", - " option_type=opt_type, \n", - " dividend_type='continuous', \n", - " dividend=mkt_forward_cont.dividend.yield_rate\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### BJS Pricing" - ] - }, - { - "cell_type": "code", - "execution_count": 114, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array(0.46453754)" - ] - }, - "execution_count": 114, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import numpy as np\n", - "from numpy import exp, sqrt, log, maximum\n", - "from scipy.stats import norm\n", - "from typing import Literal\n", - "\n", - "\n", - "import numpy as np\n", - "from numpy import log, sqrt, exp\n", - "from scipy.special import erf\n", - "\n", - "def norm_cdf(x):\n", - " return 0.5 * (1 + erf(x / sqrt(2)))\n", - "\n", - "def phi_vectorized(s, t, gamma, H, I, r, b, sigma):\n", - " lamb = -r + gamma * b + 0.5 * gamma * (gamma - 1) * sigma ** 2\n", - " kappa = 2 * b / (sigma ** 2) + (2 * gamma - 1)\n", - " sigma_sqrt_t = sigma * np.sqrt(t)\n", - " log_s_H = np.log(s / H)\n", - " log_I_s = np.log(I / s)\n", - " d = -(log_s_H + (b + (gamma - 0.5) * sigma ** 2) * t) / sigma_sqrt_t\n", - "\n", - " return (\n", - " np.exp(lamb * t)\n", - " * s ** gamma\n", - " * (norm_cdf(d) - (I / s) ** kappa * norm_cdf(d - 2 * log_I_s / sigma_sqrt_t))\n", - " )\n", - "\n", - "\n", - "\n", - "def bjerksund_stensland_2002_vectorized(\n", - " S: np.ndarray,\n", - " K: np.ndarray,\n", - " T: np.ndarray,\n", - " r: np.ndarray,\n", - " sigma: np.ndarray,\n", - " option_type: Literal[\"c\", \"p\"] = \"c\",\n", - " dividend_type: str = \"continuous\",\n", - " dividend: float | np.ndarray = 0.0,\n", - " **kwargs\n", - ") -> np.ndarray:\n", - " \"\"\"\n", - " Vectorized Bjerksund-Stensland (2002) American option pricer.\n", - " Parameters\n", - " ----------\n", - " S : np.ndarray\n", - " Spot prices (array-like)\n", - " K : np.ndarray\n", - " Strike prices (array-like)\n", - " T : np.ndarray\n", - " Time to maturity (in years, array-like)\n", - " r : np.ndarray\n", - " Risk-free interest rates (array-like)\n", - " sigma : np.ndarray\n", - " Volatilities (array-like)\n", - " option_type : 'c' or 'p'\n", - " Option type: 'c' for call, 'p' for put\n", - " dividend_type : 'continuous' \n", - " How dividends are modeled\n", - " dividend : float or np.ndarray\n", - " - If continuous, pass yield (float or numpy array)\n", - "\n", - " Returns\n", - " -------\n", - " np.ndarray\n", - " Option prices (array-like)\n", - " Raises\n", - " -------\n", - " ValueError: If dividend is a list or if dividend_type is 'discrete'.\n", - " \"\"\"\n", - " S = np.asarray(S, dtype=float)\n", - " K = np.asarray(K, dtype=float)\n", - " T = np.asarray(T, dtype=float)\n", - " r = np.asarray(r, dtype=float)\n", - " sigma = np.asarray(sigma, dtype=float)\n", - " option_type = np.asarray(option_type, dtype=str)\n", - "\n", - "\n", - " if isinstance(dividend, (int, float)):\n", - " dividend = np.full_like(S, dividend, dtype=float)\n", - " \n", - " if dividend_type == 'discrete':\n", - " raise ValueError(\"Discrete dividends not supported in this vectorized implementation.\")\n", - " zero = np.zeros_like(S)\n", - "\n", - " # Adjust spot for dividends\n", - " if dividend_type == \"continuous\":\n", - " q = np.asarray(dividend, dtype=float)\n", - " S_adj = S.copy()\n", - " else:\n", - " raise ValueError(\"Only continuous dividend yield is supported in this vectorized implementation.\")\n", - " b = r - q\n", - " sigma_sqrt_T = sigma * np.sqrt(T)\n", - "\n", - " # Mask for invalid values\n", - " invalid = (S_adj <= 0) | (T <= 0) | (sigma <= 0)\n", - "\n", - " beta = (0.5 - b / sigma**2) + np.sqrt(((b / sigma**2 - 0.5)**2) + 2 * r / sigma**2)\n", - " beta = np.where(np.abs(beta - 1) < 1e-6, beta + 1e-4, beta)\n", - "\n", - " # Avoid div-by-zero or negatives in B0/B_inf\n", - " B_inf = beta / np.maximum(beta - 1, 1e-8) * K\n", - " B0 = np.where(np.abs(r - b) > 1e-8, r / (r - b) * K, 1.5 * K)\n", - "\n", - " h = -(b * T + 2 * sigma_sqrt_T) * (B0 / np.maximum(B_inf - B0, 1e-8))\n", - " I = B0 + (B_inf - B0) * (1 - np.exp(h))\n", - " I = np.clip(I, 1e-6, 1e6)\n", - "\n", - " # Call value if immediate exercise\n", - " early_ex = S_adj >= I\n", - " call_exercise = S_adj - K\n", - "\n", - " # BS-2002 logic\n", - " S_adj = np.clip(S_adj, 1e-6, 1e6)\n", - " alpha = np.where(I > 0, (I - K) * I**(-beta), 0.0)\n", - "\n", - " phi_1 = phi_vectorized(S_adj, T, beta, I, I, r, b, sigma)\n", - " phi_2 = phi_vectorized(S_adj, T, 1, I, I, r, b, sigma)\n", - " phi_3 = phi_vectorized(S_adj, T, 1, K, I, r, b, sigma)\n", - " phi_4 = phi_vectorized(S_adj, T, 0, I, I, r, b, sigma)\n", - " phi_5 = phi_vectorized(S_adj, T, 0, K, I, r, b, sigma)\n", - "\n", - " call_bs2002 = (\n", - " alpha * S_adj**beta\n", - " - alpha * phi_1\n", - " + phi_2\n", - " - phi_3\n", - " - K * phi_4\n", - " + K * phi_5\n", - " )\n", - "\n", - " call_price = np.where(early_ex, call_exercise, call_bs2002)\n", - " call_price = np.where(invalid, zero, call_price)\n", - "\n", - "\n", - " # if option_type == \"c\":\n", - " # return call_price\n", - " # else:\n", - " # # American put via parity approximation\n", - " # european_put = K * np.exp(-r * T) - S_adj * np.exp(-q * T)\n", - " # pc_parity = call_price - (S_adj * np.exp(-q * T) - K * np.exp(-r * T)) + european_put\n", - " # return np.where(invalid, zero, pc_parity)\n", - "\n", - " option_type = np.asarray(option_type)\n", - "\n", - " # Create masks for calls and puts\n", - " call_mask = option_type == \"c\"\n", - " put_mask = not call_mask # anything not \"c\" is treated as put\n", - "\n", - " # Initialize output array\n", - " final_price = np.empty_like(call_price)\n", - "\n", - " # Assign call prices where option is call\n", - " final_price[call_mask] = call_price[call_mask]\n", - "\n", - " # For puts: parity approximation\n", - " european_put = K * np.exp(-r * T) - S_adj * np.exp(-q * T)\n", - " pc_parity = (\n", - " call_price\n", - " - (S_adj * np.exp(-q * T) - K * np.exp(-r * T))\n", - " + european_put\n", - " )\n", - "\n", - " final_price[put_mask] = pc_parity[put_mask]\n", - "\n", - " # Set invalid entries to zero\n", - " final_price = np.where(invalid, zero, final_price)\n", - "\n", - " return final_price\n", - "\n", - "bjerksund_stensland_2002_vectorized(\n", - " S=S, \n", - " K=strike, \n", - " T=time_distance_helper(exp_date, test_valuation_date), \n", - " r=rates, \n", - " sigma=vol, \n", - " option_type=opt_type, \n", - " dividend_type='continuous', \n", - " dividend=mkt_forward_cont.dividend.yield_rate\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 181, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(array(8.87311182), 8.873111821124596)" - ] - }, - "execution_count": 181, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bjerksund_stensland_2002_vectorized(\n", - " S=213.77, \n", - " K=215, \n", - " T=time_distance_helper('2025-09-19', datetime.now()), \n", - " r=0.04230, \n", - " sigma=0.2655, \n", - " option_type='p', \n", - " dividend_type='continuous', \n", - " dividend=mkt_forward_cont.dividend.yield_rate\n", - "),\\\n", - "bjerksund_stensland_2002(\n", - " S=213.77, \n", - " K=215, \n", - " T=time_distance_helper('2025-09-19', datetime.now()), \n", - " r=0.04230, \n", - " sigma=0.2655, \n", - " option_type='p', \n", - " dividend_type='continuous', \n", - " dividend=mkt_forward_cont.dividend.yield_rate\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 178, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "YF.download() has changed argument auto_adjust default to True\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
dailyannualizednamedescription
Datetime
2010-01-010.0000000.0000000
2010-01-040.0001340.00050^IRX13 WEEK TREASURY BILL
2010-01-050.0001470.00055^IRX13 WEEK TREASURY BILL
2010-01-060.0001600.00060^IRX13 WEEK TREASURY BILL
2010-01-070.0001210.00045^IRX13 WEEK TREASURY BILL
...............
2025-07-170.0001140.04232^IRX13 WEEK TREASURY BILL
2025-07-180.0001140.04232^IRX13 WEEK TREASURY BILL
2025-07-210.0001140.04230^IRX13 WEEK TREASURY BILL
2025-07-220.0001130.04223^IRX13 WEEK TREASURY BILL
2025-07-230.0001140.04230^IRX13 WEEK TREASURY BILL
\n", - "

4059 rows × 4 columns

\n", - "
" - ], - "text/plain": [ - " daily annualized name description\n", - "Datetime \n", - "2010-01-01 0.000000 0.00000 0 0\n", - "2010-01-04 0.000134 0.00050 ^IRX 13 WEEK TREASURY BILL\n", - "2010-01-05 0.000147 0.00055 ^IRX 13 WEEK TREASURY BILL\n", - "2010-01-06 0.000160 0.00060 ^IRX 13 WEEK TREASURY BILL\n", - "2010-01-07 0.000121 0.00045 ^IRX 13 WEEK TREASURY BILL\n", - "... ... ... ... ...\n", - "2025-07-17 0.000114 0.04232 ^IRX 13 WEEK TREASURY BILL\n", - "2025-07-18 0.000114 0.04232 ^IRX 13 WEEK TREASURY BILL\n", - "2025-07-21 0.000114 0.04230 ^IRX 13 WEEK TREASURY BILL\n", - "2025-07-22 0.000113 0.04223 ^IRX 13 WEEK TREASURY BILL\n", - "2025-07-23 0.000114 0.04230 ^IRX 13 WEEK TREASURY BILL\n", - "\n", - "[4059 rows x 4 columns]" - ] - }, - "execution_count": 178, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "get_risk_free_rate_helper()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Vols\n", - "\n", - "- Brute Force BJS\n", - "- Scalar Minimize CRR Binomial" - ] - }, - { - "cell_type": "code", - "execution_count": 142, - "metadata": {}, - "outputs": [], - "source": [ - "def vol_est_brute_force_bjs_2002(\n", - " S: float,\n", - " K: float,\n", - " T: float,\n", - " r: float,\n", - " market_price: float,\n", - " q: float = 0.0,\n", - " option_type: str = 'c',\n", - "):\n", - " \"\"\"\n", - "\n", - " Brute force method to estimate implied volatility by minimizing the difference\n", - " between the market price and the Black-Scholes price.\n", - " Parameters:\n", - " - F: Forward price\n", - " - K: Strike price\n", - " - T: Time to maturity\n", - " - r: Risk-free rate\n", - " - q: Continuous dividend yield\n", - " - market_price: Market price of the option\n", - " - option_type: 'c' for call, 'p' for put\n", - " Returns:\n", - " - Estimated volatility\n", - " \"\"\"\n", - " # \n", - " \n", - " sigmas = np.linspace(0.001, 5, 40_000) # Range of volatilities to test\n", - " S, K, T, r, q, option_type = map(np.asarray, (S, K, T, r, q, option_type))\n", - " prices = bjerksund_stensland_2002_vectorized(\n", - " S=S,\n", - " K=K,\n", - " T=T,\n", - " r=r,\n", - " sigma=sigmas,\n", - " option_type=option_type,\n", - " dividend_type='continuous', # Assuming continuous dividends for this example\n", - " dividend=q # No discrete dividends in this case\n", - " )\n", - " non_na_mask = ~np.isnan(prices) & ~np.isinf(prices) # Filter out NaN/Inf prices\n", - " prices = prices[non_na_mask] # Filter prices\n", - " sigmas = sigmas[non_na_mask] # Filter corresponding sigmas\n", - "\n", - " # Calculate the absolute differences between market price and calculated prices\n", - " differences = np.abs(prices - market_price)\n", - " # Find the index of the minimum difference\n", - " min_index = np.argmin(differences)\n", - "\n", - " # Return the corresponding volatility\n", - " return sigmas[min_index] # Return the estimated volatility and corresponding price\n", - "\n", - "\n", - "def estimate_crr_implied_volatility(\n", - " S: float,\n", - " K: float,\n", - " T: float,\n", - " r: float,\n", - " market_price: float,\n", - " q: float = 0.0,\n", - " option_type: str = 'c',\n", - " N: int = 1000,\n", - " dividend_type: Literal['continuous', 'discrete'] = 'continuous',\n", - " american: bool = False\n", - ") -> float:\n", - " \"\"\"\n", - " Estimate implied volatility using optimization.\n", - " \n", - " Parameters:\n", - " - S: Spot price\n", - " - K: Strike price\n", - " - T: Time to maturity\n", - " - r: Risk-free interest rate\n", - " - market_price: Market price of the option\n", - " - q: Continuous dividend yield (default is 0.0)\n", - " - option_type: 'c' for call, 'p' for put\n", - " - N: Number of time steps in the binomial tree\n", - " \n", - " Returns:\n", - " - Estimated volatility\n", - " \"\"\"\n", - " def binomial_objective_function(sigma: float) -> float:\n", - " calculated_price = crr_binomial_pricing(\n", - " K=K,\n", - " T=T,\n", - " sigma=sigma, # Initial guess for sigma, will be optimized\n", - " r=r,\n", - " N=N,\n", - " spot_price=S,\n", - " dividend_type=dividend_type,\n", - " div_amount=q,\n", - " option_type=option_type,\n", - " american=american\n", - " )\n", - " \n", - " return (calculated_price - market_price) ** 2\n", - " result = minimize_scalar(\n", - " binomial_objective_function,\n", - " bounds=(0.001, 5.0), # Reasonable bounds for volatility\n", - " method='bounded'\n", - " )\n", - " \n", - " return result.x if result.success else None\n", - "\n", - "\n", - "def vector_brute_force(brute_callable, list_input):\n", - " \"\"\"\n", - " Vectorized brute force method to estimate implied volatility by minimizing the difference\n", - " between the market price and the Black-Scholes price.\n", - " \n", - " Parameters:\n", - " - brute_callable: Function to call for brute force estimation\n", - " - list_input: List of inputs for the brute force estimation\n", - " eg: [\n", - " (S1, K1, T1, r1, market_price1, q1, option_type1),\n", - " ]\n", - " \n", - " Returns:\n", - " - Estimated volatilities as a numpy array\n", - " \"\"\"\n", - " if len(list_input) == 0:\n", - " return []\n", - " estimated_vols = [brute_callable(*params) for params in list_input]\n", - "\n", - " \n", - " return estimated_vols" - ] - }, - { - "cell_type": "code", - "execution_count": 116, - "metadata": {}, - "outputs": [], - "source": [ - "aapl_chain\n", - "valuation_dates = [test_valuation_date] * len(aapl_chain)\n", - "end_dates = aapl_chain['Expiration'].tolist()\n", - "r = [rates] * len(aapl_chain)\n", - "s = [S] * len(aapl_chain)\n", - "tickers = ['AAPL'] * len(aapl_chain)\n", - "T = [time_distance_helper(end_dates[i], valuation_dates[i]) for i in range(len(aapl_chain))]\n", - "\n", - "\n", - "q = get_vectorized_dividend_rate(\n", - " tickers=tickers,\n", - " spots=s,\n", - " valuation_dates=valuation_dates,\n", - ")\n", - "\n", - "\n", - "discrete_q = get_vectorized_dividend_scehdule(\n", - " tickers=['AAPL'] * len(aapl_chain),\n", - " valuation_dates=[test_valuation_date] * len(aapl_chain),\n", - " end_dates=aapl_chain['Expiration'].tolist(),\n", - " start_dates=[test_valuation_date] * len(aapl_chain),\n", - ")\n", - "\n", - "discrete_q_convert = vector_convert_to_time_frac(\n", - " discrete_q, \n", - " valuation_dates=[test_valuation_date] * len(aapl_chain), \n", - " end_dates=aapl_chain['Expiration'].tolist(), \n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 117, - "metadata": {}, - "outputs": [], - "source": [ - "vols = aapl_chain['iv'].tolist()" - ] - }, - { - "cell_type": "code", - "execution_count": 118, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Estimated BJS-2002 Volatility: 0.2627\n", - "Estimated CRR Continuous Volatility: 0.2627\n", - "Estimated CRR Discrete Volatility: 0.2626\n" - ] - } - ], - "source": [ - "i = 8\n", - "bsj_est = vol_est_brute_force_bjs_2002(\n", - " S=s[i],\n", - " K=aapl_chain['Strike'][i],\n", - " T=T[i],\n", - " r=r[i],\n", - " market_price=aapl_chain['Midpoint'][i],\n", - " q=q[i],\n", - " option_type=aapl_chain['Right'][i].lower()\n", - " )\n", - "\n", - "\n", - "crr_continuous_est = estimate_crr_implied_volatility(\n", - " S=s[i],\n", - " K=aapl_chain['Strike'][i],\n", - " T=T[i],\n", - " r=r[i],\n", - " market_price=aapl_chain['Midpoint'][i],\n", - " q=q[i],\n", - " option_type=aapl_chain['Right'][i].lower(),\n", - " N=100,\n", - " dividend_type='continuous',\n", - " american=True\n", - " )\n", - "\n", - "crr_discrete_est = estimate_crr_implied_volatility(\n", - " S=s[i],\n", - " K=aapl_chain['Strike'][i],\n", - " T=T[i],\n", - " r=r[i],\n", - " market_price=aapl_chain['Midpoint'][i],\n", - " q=discrete_q_convert[i],\n", - " option_type=aapl_chain['Right'][i].lower(),\n", - " N=100,\n", - " dividend_type='discrete',\n", - " american=True\n", - " )\n", - "\n", - "print(f\"Estimated BJS-2002 Volatility: {bsj_est:.4f}\")\n", - "print(f\"Estimated CRR Continuous Volatility: {crr_continuous_est:.4f}\")\n", - "print(f\"Estimated CRR Discrete Volatility: {crr_discrete_est:.4f}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 119, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Mid Price: 9.8250\n", - "Estimated BJS-2002 Price: 9.8252\n", - "Estimated CRR Continuous Price: 9.8250\n", - "Estimated CRR Discrete Price: 9.8250\n" - ] - } - ], - "source": [ - "\n", - "bsj_price = bjerksund_stensland_2002_vectorized(\n", - " S=s[i],\n", - " K=aapl_chain['Strike'][i],\n", - " T=T[i],\n", - " r=r[i],\n", - " sigma=[bsj_est, crr_continuous_est, crr_discrete_est], # Use the estimated volatility\n", - " option_type=aapl_chain['Right'][i].lower(),\n", - " dividend_type='continuous',\n", - " dividend=q[i]\n", - " )\n", - "\n", - "crr_discrete_price = crr_binomial_pricing(\n", - " K=aapl_chain['Strike'][i],\n", - " T=T[i],\n", - " sigma=crr_discrete_est, # Use the estimated volatility\n", - " r=r[i],\n", - " N=100,\n", - " spot_price=s[i],\n", - " dividend_type='discrete',\n", - " div_amount=discrete_q_convert[i],\n", - " option_type=aapl_chain['Right'][i].lower(),\n", - " american=True\n", - " )\n", - "\n", - "crr_continuous_price = crr_binomial_pricing(\n", - " K=aapl_chain['Strike'][i],\n", - " T=T[i],\n", - " sigma=crr_continuous_est, # Use the estimated volatility\n", - " r=r[i],\n", - " N=100,\n", - " spot_price=s[i],\n", - " dividend_type='continuous',\n", - " div_amount=q[i],\n", - " option_type=aapl_chain['Right'][i].lower(),\n", - " american=True\n", - " )\n", - "\n", - "print(f\"Mid Price: {aapl_chain['Midpoint'][i]:.4f}\")\n", - "print(f\"Estimated BJS-2002 Price: {float(bsj_price[0]):.4f}\")\n", - "print(f\"Estimated CRR Continuous Price: {crr_continuous_price:.4f}\")\n", - "print(f\"Estimated CRR Discrete Price: {crr_discrete_price:.4f}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 141, - "metadata": {}, - "outputs": [], - "source": [ - "vol_batch_bjs = np.array([\n", - " vol_est_brute_force_bjs_2002(\n", - " S=s[i],\n", - " K=aapl_chain['Strike'][i],\n", - " T=T[i],\n", - " r=r[i],\n", - " market_price=aapl_chain['Midpoint'][i],\n", - " q=q[i],\n", - " option_type=aapl_chain['Right'][i].lower()\n", - " )\n", - " for i in range(len(aapl_chain))\n", - "])" - ] - }, - { - "cell_type": "code", - "execution_count": 121, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2428" - ] - }, - "execution_count": 121, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "zip_list = list(zip(\n", - " s, \n", - " aapl_chain['Strike'], \n", - " T, \n", - " r, \n", - " aapl_chain['Midpoint'], \n", - " q, \n", - " aapl_chain['Right'].str.lower()\n", - "))\n", - "\n", - "len(zip_list)" - ] - }, - { - "cell_type": "code", - "execution_count": 140, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n" - ] - } - ], - "source": [ - "crr_discrete_batch = np.array([\n", - " estimate_crr_implied_volatility(\n", - " S=s[i],\n", - " K=aapl_chain['Strike'][i],\n", - " T=T[i],\n", - " r=r[i],\n", - " market_price=aapl_chain['Midpoint'][i],\n", - " q=discrete_q_convert[i],\n", - " option_type=aapl_chain['Right'][i].lower(),\n", - " N=100,\n", - " dividend_type='discrete',\n", - " american=True\n", - " )\n", - " for i in range(len(aapl_chain))\n", - "])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "vol_batch_bjs\n", - "aapl_chain['iv_bjs'] = vol_batch_bjs\n", - "aapl_chain['iv_crr_discrete'] = crr_discrete_batch\n", - "aapl_chain[(aapl_chain['Expiration'] == '2025-07-25') & (aapl_chain['Right'] == 'C')].sort_values('Strike').tail(60).plot(x='Strike', y=['iv_bjs', 'iv', 'iv_crr_discrete'], kind='line', title='AAPL Call IV BJS on 2026-06-18')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### BJS 2002 Greeks" - ] - }, - { - "cell_type": "code", - "execution_count": 122, - "metadata": {}, - "outputs": [], - "source": [ - "np.set_printoptions(suppress=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 123, - "metadata": {}, - "outputs": [], - "source": [ - "## Numerical\n", - "def convert_to_array(value):\n", - " if isinstance(value, (list, np.ndarray)):\n", - " return np.array(value)\n", - " elif isinstance(value, (int, float, str, datetime, np.datetime64)):\n", - " return np.array([value])\n", - " else:\n", - " raise ValueError(f\"Unsupported type for value conversion : {type(value)}\")\n", - "\n", - "def to_1d_array(x):\n", - " x = np.atleast_1d(x)\n", - " if x.ndim > 1:\n", - " return x.flatten()\n", - " return x\n", - "\n", - "\n", - "def bjs2002_numerical_greeks(\n", - " K: float,\n", - " T: List[float],\n", - " r: float,\n", - " sigma: float,\n", - " S: float,\n", - " div_yield: Union[float, List[float]] = 1.0,\n", - " option_type: str = \"c\",\n", - " **kwargs\n", - "):\n", - " \n", - " option_type = list(map(lambda x: x.lower(), option_type)) \n", - " K, T, r, sigma, S, div_yield, option_type = map(\n", - " convert_to_array, (K, T, r, sigma, S, div_yield, option_type)\n", - " )\n", - " # Ensure option_type is lowercase\n", - " finite_estimator = FiniteGreeksEstimator(\n", - " price_func = bjerksund_stensland_2002_vectorized,\n", - " base_params = {\n", - " 'K': K,\n", - " 'T': T,\n", - " 'r': r,\n", - " 'sigma': sigma,\n", - " 'S': S,\n", - " 'div_amount': div_yield,\n", - " 'option_type': option_type,\n", - " 'q': None\n", - " },\n", - " dx_thresh = 0.00001,\n", - " method = 'backward',\n", - " )\n", - " greeks = finite_estimator.all_first_order()\n", - " greeks.update(finite_estimator.all_second_order())\n", - " greeks = dict(sorted(greeks.items(), key=lambda item: item[0]))\n", - " del finite_estimator\n", - " return greeks\n" - ] - }, - { - "cell_type": "code", - "execution_count": 124, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'delta': array([0.57064461]),\n", - " 'gamma': array([0.01108035]),\n", - " 'rho': array([0.43734512]),\n", - " 'theta': array([-0.0589119]),\n", - " 'vega': array([0.53955576]),\n", - " 'volga': array([0.00004508])}" - ] - }, - "execution_count": 124, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "g = bjs2002_numerical_greeks(\n", - " K=[215],\n", - " T= [time_distance_helper('2025-12-19', datetime.now())],\n", - " r=[0.04223],\n", - " sigma=[0.2579],\n", - " S=[214.67],\n", - " dividend_type=['continuous'],\n", - " div_amount=[0.004],\n", - " option_type=['C'],\n", - ")\n", - "g" - ] - }, - { - "cell_type": "code", - "execution_count": 125, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "15.531557497723618" - ] - }, - "execution_count": 125, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bt = VectorBinomialCRR(\n", - " K=215,\n", - " expiration='2025-12-19',\n", - " sigma=0.2579,\n", - " r=0.04223,\n", - " N=100,\n", - " spot_price=214.67,\n", - " dividend_type='continuous',\n", - " div_amount=0.004,\n", - " option_type='c',\n", - " start_date=datetime.now(),\n", - " valuation_date=datetime.now(),\n", - " american=True\n", - ")\n", - "bt.price()" - ] - }, - { - "cell_type": "code", - "execution_count": 126, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(0.5656691539926005,\n", - " 0.011156896155474558,\n", - " 0.5382936069069298,\n", - " -0.05909120866641884,\n", - " 0.4339077482804705,\n", - " 8.235950586277795e-06)" - ] - }, - "execution_count": 126, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bt.delta(), bt.gamma(), bt.vega(), bt.theta(), bt.rho(), bt.volga()" - ] - }, - { - "cell_type": "code", - "execution_count": 127, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "15.53155696080328" - ] - }, - "execution_count": 127, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bt = NodeBinomialCRR(\n", - " K=215,\n", - " expiration='2025-12-19',\n", - " sigma=0.2579,\n", - " r=0.04223,\n", - " N=100,\n", - " spot_price=214.67,\n", - " dividend_type='continuous',\n", - " div_amount=0.004,\n", - " option_type='c',\n", - " start_date=datetime.now(),\n", - " valuation_date=datetime.now(),\n", - " american=True\n", - ")\n", - "bt.price()" - ] - }, - { - "cell_type": "code", - "execution_count": 128, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(Scalar(0.5656691517597042),\n", - " Scalar(0.011156896516479834),\n", - " 0.5382935906428298,\n", - " -0.0,\n", - " 0.43390772069288736,\n", - " 8.261589449248244e-06)" - ] - }, - "execution_count": 128, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bt.delta(), bt.gamma(), bt.vega(), bt.theta(), bt.rho(), bt.volga()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Binomial Tree Greeks" - ] - }, - { - "cell_type": "code", - "execution_count": 145, - "metadata": {}, - "outputs": [], - "source": [ - "def binomial_tree_price_batch(\n", - " K: float|np.ndarray,\n", - " expiration: float|np.ndarray,\n", - " sigma: float|np.ndarray,\n", - " r: float|np.ndarray,\n", - " N: float|np.ndarray,\n", - " S: float|np.ndarray,\n", - " dividend_type: float|np.ndarray,\n", - " div_amount: float|np.ndarray,\n", - " option_type: float|np.ndarray,\n", - " start_date: float|np.ndarray,\n", - " valuation_date: float|np.ndarray,\n", - " american: float|np.ndarray,\n", - "):\n", - " \"\"\"\n", - " Batch pricing of options using a binomial tree model (CRR).\n", - " \n", - " Parameters:\n", - " - K: Strike price\n", - " - expiration: Expiration date of the option\n", - " - sigma: Volatility of the underlying asset\n", - " - r: Risk-free interest rate\n", - " - N: Number of time steps in the binomial tree\n", - " - spot_price: Current price of the underlying asset (optional)\n", - " - dividend_type: Type of dividend ('discrete' or 'continuous')\n", - " - div_amount: Amount of dividend (if applicable)\n", - " - option_type: 'c' for call, 'p' for put\n", - " - start_date: Start date for the option pricing (optional)\n", - " - valuation_date: Date for which the option is priced (optional)\n", - " \n", - " Returns:\n", - " - price: Calculated option prices\n", - " - models: List of binomial tree models used for pricing\n", - " \"\"\"\n", - "\n", - " K, expiration, sigma, r, N, S, dividend_type, option_type, start_date, valuation_date, american = map(\n", - " convert_to_array, \n", - " (K, expiration, sigma, r, N, S, dividend_type, option_type, start_date, valuation_date, american)\n", - " )\n", - " div_amount = convert_to_array(div_amount)\n", - " if not np.all(np.isin(dividend_type, ['discrete', 'continuous'])):\n", - " raise ValueError(\"dividend_type must be either 'discrete' or 'continuous'\")\n", - " \n", - " # cnt_mask = dividend_type == 'continuous'\n", - " # if dividend_type == 'discrete':\n", - " # div_amount = np.array([div_amount])\n", - " # else:\n", - " # div_amount = convert_to_array(div_amount)\n", - " # Ensure all inputs are numpy arrays\n", - " models = [\n", - " VectorBinomialCRR(\n", - " K=k,\n", - " expiration=exp,\n", - " sigma=s,\n", - " r=ri,\n", - " N=int(n),\n", - " spot_price=sp,\n", - " dividend_type=dt,\n", - " div_amount=da,\n", - " option_type=ot,\n", - " start_date=start_date,\n", - " valuation_date=valuation_date,\n", - " american=am\n", - " )\n", - " for k, exp, s, ri, n, sp, dt, da, ot, start_date, valuation_date, am in zip(\n", - " K, expiration, sigma, r, N, S, dividend_type, div_amount, option_type, start_date, valuation_date, american\n", - " )\n", - " ]\n", - " price = np.array([model.price() for model in models])\n", - " return price, models" - ] - }, - { - "cell_type": "code", - "execution_count": 139, - "metadata": {}, - "outputs": [], - "source": [ - "def binomial_tree_greeks(\n", - " K: float|np.ndarray,\n", - " expiration: float|np.ndarray,\n", - " sigma: float|np.ndarray,\n", - " r: float|np.ndarray,\n", - " N: float|np.ndarray,\n", - " S: float|np.ndarray,\n", - " dividend_type: float|np.ndarray,\n", - " div_amount: float|np.ndarray,\n", - " option_type: float|np.ndarray,\n", - " start_date: float|np.ndarray,\n", - " valuation_date: float|np.ndarray,\n", - " american: float|np.ndarray,\n", - "):\n", - " \"\"\"\n", - " Calculate Greeks using a binomial tree model.\n", - " \n", - " Parameters:\n", - " - K: Strike price\n", - " - expiration: Expiration date of the option\n", - " - sigma: Volatility of the underlying asset\n", - " - r: Risk-free interest rate\n", - " - N: Number of time steps in the binomial tree\n", - " - spot_price: Current price of the underlying asset (optional)\n", - " - dividend_type: Type of dividend ('discrete' or 'continuous')\n", - " - div_amount: Amount of dividend (if applicable)\n", - " - option_type: 'c' for call, 'p' for put\n", - " - start_date: Start date for the option pricing (optional)\n", - " - valuation_date: Date for which the option is priced (optional)\n", - " \n", - " Returns:\n", - " Dictionary with calculated Greeks.\n", - " \"\"\"\n", - " price, models = binomial_tree_price_batch(\n", - " K=K,\n", - " expiration=expiration,\n", - " sigma=sigma,\n", - " r=r,\n", - " N=N,\n", - " S=S,\n", - " dividend_type=dividend_type,\n", - " div_amount=div_amount,\n", - " option_type=option_type,\n", - " start_date=start_date,\n", - " valuation_date=valuation_date,\n", - " american=american\n", - " ) \n", - " \n", - "\n", - " return {\n", - " 'delta': np.array([model.delta() for model in models]),\n", - " 'gamma': np.array([model.gamma() for model in models]),\n", - " 'vega': np.array([model.vega() for model in models]),\n", - " 'theta': np.array([model.theta() for model in models]),\n", - " 'rho': np.array([model.rho() for model in models]),\n", - " 'volga': np.array([model.volga() for model in models]),\n", - " 'model': np.array([model for model in models]),\n", - " }" - ] - }, - { - "cell_type": "code", - "execution_count": 130, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'delta': array([0.55884106]),\n", - " 'gamma': array([0.0111844]),\n", - " 'vega': array([0.54124709]),\n", - " 'theta': array([-0.06050628]),\n", - " 'rho': array([0.42907842]),\n", - " 'volga': array([-0.00008596]),\n", - " 'model': array([VectorBinomialCRR(K=215, expiration=2025-12-19, dividend_type=discrete],\n", - " dtype=object)}" - ] - }, - "execution_count": 130, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "res = binomial_tree_greeks(\n", - " K=215,\n", - " expiration='2025-12-19',\n", - " sigma=0.2579,\n", - " r=0.04223,\n", - " N=100,\n", - " S=214.67,\n", - " dividend_type='discrete',\n", - " div_amount=mkt_forward.dividend.get_year_fractions(),\n", - " option_type='c',\n", - " start_date=datetime.now(),\n", - " valuation_date=datetime.now(),\n", - " american=True\n", - ")\n", - "res" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## BATCH Operations" - ] - }, - { - "cell_type": "code", - "execution_count": 131, - "metadata": {}, - "outputs": [], - "source": [ - "def _ptched_bjs2002(\n", - " S, K, T, r, sigma, option_type, dividend\n", - "):\n", - " return bjerksund_stensland_2002_vectorized(\n", - " K=K,\n", - " T=T,\n", - " r=r,\n", - " sigma=sigma,\n", - " S=S,\n", - " dividend=dividend,\n", - " option_type=option_type\n", - " )" - ] - }, - { - "cell_type": "code", - "execution_count": 132, - "metadata": {}, - "outputs": [], - "source": [ - "from trade.helpers.pools import runProcesses\n", - "from typing import List, Union\n", - "\n", - "def vector_batch_processor(callable, *args, **kwargs):\n", - " \"\"\"\n", - " Process a list of inputs in parallel using multiprocessing. This processor assumes the callable works with vectorization\n", - " Underlying ass\n", - " \n", - " Parameters:\n", - " - callable: Function to call with each set of inputs\n", - " - *args: ordered inputs to the callable, where each input is a list or array of values.\n", - " - Each input should be a list or numpy array that can be split into chunks for parallel processing.\n", - " - Anything else will be treated as a single input for each process.\n", - " - **kwargs: Additional keyword arguments (not used in this implementation).\n", - " - Will raise ValueError if kwargs are provided. Only allowed keyword is 'num_process' to specify the number of processes.\n", - "\n", - "\n", - " How this works:\n", - " - The function splits each input argument into chunks based on the number of processes specified. The underlying assumption is that the callable can handle vectorized inputs, meaning it can process arrays or lists of values at once.\n", - " - The function then runs the callable in parallel across the specified number of processes.\n", - " - If a single input is provided (not a list or array), it will be replicated across all processes.\n", - " - Why this function?:\n", - " - Vectorization is great to speed up work, but spreading this vectorization across multiple processes can further enhance performance, especially for computationally intensive tasks.\n", - "\n", - " - Ensure the callable returns only ONE result per call, as this function will flatten the results from all processes into a single list.\n", - "\n", - " \n", - " Returns:\n", - " List of results from the callable.\n", - " \"\"\"\n", - " num_process = kwargs.pop('num_process', None)\n", - " if num_process is None:\n", - " num_process = os.cpu_count() or 8\n", - "\n", - " if kwargs:\n", - " raise ValueError(\"kwargs are not supported in vector_batch_processor. Use only *args for inputs.\")\n", - "\n", - "\n", - " ordered_inputs = []\n", - " for arg in args:\n", - " if isinstance(arg, (list, np.ndarray)):\n", - " split_arg = np.array_split(np.asarray(arg, dtype=object), num_process, )\n", - " ordered_inputs.append(split_arg)\n", - " else:\n", - " split_arg = [arg] * num_process\n", - " ordered_inputs.append(split_arg)\n", - "\n", - "\n", - " results = runProcesses(\n", - " func=callable,\n", - " OrderedInputs=ordered_inputs,\n", - " run_type='map')\n", - " res = list(chain.from_iterable(results))\n", - " \n", - " return res\n", - " \n" - ] - }, - { - "cell_type": "code", - "execution_count": 133, - "metadata": {}, - "outputs": [], - "source": [ - "valuation_dates = [test_valuation_date] * len(aapl_chain)\n", - "end_dates = aapl_chain['Expiration'].tolist()\n", - "r = [rates] * len(aapl_chain)\n", - "s = [S] * len(aapl_chain)\n", - "tickers = ['AAPL'] * len(aapl_chain)\n", - "T = [time_distance_helper(end_dates[i], valuation_dates[i]) for i in range(len(aapl_chain))]\n", - "\n", - "zip_list = list(zip(\n", - " s, \n", - " aapl_chain['Strike'], \n", - " T, \n", - " r, \n", - " aapl_chain['Midpoint'], \n", - " q, \n", - " aapl_chain['Right'].str.lower()\n", - "))" - ] - }, - { - "cell_type": "code", - "execution_count": 134, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "params = zip_list\n", - "bjs_vols = vector_batch_processor(vector_brute_force, vol_est_brute_force_bjs_2002, params, num_process=8)" - ] - }, - { - "cell_type": "code", - "execution_count": 135, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
RootExpirationStrikeRightBid_sizeCloseBidAsk_sizeCloseAskDateMidpointWeighted_midpointiviv_bjsbjs_price
datetime
2025-07-16AAPL2025-12-195.0P00.0010.02202507160.0100.0200001.8726725.0-203.133971
2025-07-16AAPL2026-01-165.0P00.0050000.01202507160.0050.0100001.6309655.0-202.717450
2025-07-16AAPL2025-09-195.0P00.005000.01202507160.0050.0100002.7345225.0-204.749368
2025-07-16AAPL2026-05-155.0P00.0050000.01202507160.0050.0100001.2757775.0-201.398573
2025-07-16AAPL2025-12-1910.0P00.00860.01202507160.0050.0100001.4225015.0-194.453640
.............................................
2025-07-16AAPL2025-07-25160.0P850.01400.03202507160.0200.0164000.6468875.0-15.782798
2025-07-16AAPL2025-07-18185.0P2020.01400.03202507160.0200.0133060.6897545.0-7.113076
2025-07-16AAPL2025-07-25165.0P600.0220.03202507160.0250.0203230.5941465.0-8.164140
2025-07-16AAPL2025-07-18187.5P640.02400.03202507160.0250.0238460.6415135.0-3.505074
2025-07-16AAPL2025-07-25170.0P580.0320.04202507160.0350.0303330.5481545.0-0.468809
\n", - "

281 rows × 14 columns

\n", - "
" - ], - "text/plain": [ - " Root Expiration Strike Right Bid_size CloseBid Ask_size \\\n", - "datetime \n", - "2025-07-16 AAPL 2025-12-19 5.0 P 0 0.00 1 \n", - "2025-07-16 AAPL 2026-01-16 5.0 P 0 0.00 5000 \n", - "2025-07-16 AAPL 2025-09-19 5.0 P 0 0.00 500 \n", - "2025-07-16 AAPL 2026-05-15 5.0 P 0 0.00 5000 \n", - "2025-07-16 AAPL 2025-12-19 10.0 P 0 0.00 86 \n", - "... ... ... ... ... ... ... ... \n", - "2025-07-16 AAPL 2025-07-25 160.0 P 85 0.01 40 \n", - "2025-07-16 AAPL 2025-07-18 185.0 P 202 0.01 40 \n", - "2025-07-16 AAPL 2025-07-25 165.0 P 60 0.02 2 \n", - "2025-07-16 AAPL 2025-07-18 187.5 P 64 0.02 40 \n", - "2025-07-16 AAPL 2025-07-25 170.0 P 58 0.03 2 \n", - "\n", - " CloseAsk Date Midpoint Weighted_midpoint iv iv_bjs \\\n", - "datetime \n", - "2025-07-16 0.02 20250716 0.010 0.020000 1.872672 5.0 \n", - "2025-07-16 0.01 20250716 0.005 0.010000 1.630965 5.0 \n", - "2025-07-16 0.01 20250716 0.005 0.010000 2.734522 5.0 \n", - "2025-07-16 0.01 20250716 0.005 0.010000 1.275777 5.0 \n", - "2025-07-16 0.01 20250716 0.005 0.010000 1.422501 5.0 \n", - "... ... ... ... ... ... ... \n", - "2025-07-16 0.03 20250716 0.020 0.016400 0.646887 5.0 \n", - "2025-07-16 0.03 20250716 0.020 0.013306 0.689754 5.0 \n", - "2025-07-16 0.03 20250716 0.025 0.020323 0.594146 5.0 \n", - "2025-07-16 0.03 20250716 0.025 0.023846 0.641513 5.0 \n", - "2025-07-16 0.04 20250716 0.035 0.030333 0.548154 5.0 \n", - "\n", - " bjs_price \n", - "datetime \n", - "2025-07-16 -203.133971 \n", - "2025-07-16 -202.717450 \n", - "2025-07-16 -204.749368 \n", - "2025-07-16 -201.398573 \n", - "2025-07-16 -194.453640 \n", - "... ... \n", - "2025-07-16 -15.782798 \n", - "2025-07-16 -7.113076 \n", - "2025-07-16 -8.164140 \n", - "2025-07-16 -3.505074 \n", - "2025-07-16 -0.468809 \n", - "\n", - "[281 rows x 14 columns]" - ] - }, - "execution_count": 135, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "aapl_chain['iv_bjs'] = bjs_vols\n", - "values = vector_batch_processor(\n", - " _ptched_bjs2002, \n", - " s, \n", - " aapl_chain['Strike'].tolist(), \n", - " T, \n", - " r, \n", - " aapl_chain['iv_bjs'].tolist(), \n", - " aapl_chain['Right'].str.lower().tolist(), \n", - " q\n", - ")\n", - "aapl_chain['bjs_price'] = values\n", - "negative_idx = [values.index(x) for x in values if x < 0]\n", - "# if negative_idx:\n", - "# print(f\"Negative values found at indices: {negative_idx}\")\n", - "\n", - "aapl_chain.iloc[negative_idx]" - ] - }, - { - "cell_type": "code", - "execution_count": 137, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...Calculating implied volatility using brute force method...\n", - "\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...Calculating implied volatility using brute force method...\n", - "\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...Calculating implied volatility using brute force method...\n", - "\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...Calculating implied volatility using brute force method...\n", - "\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...Calculating implied volatility using brute force method...\n", - "\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...Calculating implied volatility using brute force method...\n", - "\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...Calculating implied volatility using brute force method...\n", - "\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n", - "Calculating implied volatility using brute force method...\n" - ] - } - ], - "source": [ - "params = list(zip(\n", - " s, aapl_chain['Strike'], T, r, aapl_chain['Midpoint'], q, aapl_chain['Right'].str.lower(), [200] * len(aapl_chain),\n", - "))\n", - "\n", - "binomial_vols = vector_batch_processor(vector_brute_force, estimate_crr_implied_volatility, params, num_process=8)" - ] - }, - { - "cell_type": "code", - "execution_count": 146, - "metadata": {}, - "outputs": [], - "source": [ - "aapl_chain['iv_crr'] = binomial_vols\n", - "values = vector_batch_processor(\n", - " binomial_tree_price_batch, \n", - " aapl_chain['Strike'].tolist(), \n", - " aapl_chain['Expiration'].tolist(), \n", - " aapl_chain['iv_crr'].tolist(), \n", - " r, \n", - " [200] * len(aapl_chain), \n", - " s, \n", - " ['continuous'] * len(aapl_chain), \n", - " q, \n", - " aapl_chain['Right'].str.lower().tolist(), \n", - " [test_valuation_date] * len(aapl_chain),\n", - " [test_valuation_date] * len(aapl_chain),\n", - " [True] * len(aapl_chain)\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 195, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "hovertemplate": "variable=iv
Strike=%{x}
value=%{y}", - "legendgroup": "iv", - "line": { - "color": "#636efa", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "iv", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": [ - 90, - 95, - 100, - 105, - 110, - 115, - 120, - 125, - 130, - 135, - 140, - 145, - 150, - 155, - 160, - 165, - 170, - 175, - 180, - 185, - 190, - 195, - 200, - 210, - 220, - 230, - 240, - 250, - 260, - 270, - 280, - 290, - 300, - 310, - 320, - 330, - 340, - 350, - 360, - 370 - ], - "xaxis": "x", - "y": [ - 0.4847903197579939, - 0.4694180104502612, - 0.4557953948848721, - 0.44217277931948296, - 0.4291750543763594, - 0.41705217630440755, - 0.40492929823245577, - 0.3941811795294882, - 0.38380799519987996, - 0.3741846796169904, - 0.3634365609140228, - 0.3543131578289457, - 0.34556468911722793, - 0.3373161329033226, - 0.3296924673116828, - 0.32256871421785543, - 0.3163198079951999, - 0.30944601115027875, - 0.3038219955498887, - 0.2980730018250456, - 0.2933238330958274, - 0.2880747518687967, - 0.28420043001075024, - 0.27657676441911044, - 0.27195257381434534, - 0.26932803320083, - 0.2743271581789545, - 0.28157588939723494, - 0.3011974549363734, - 0.3249432985824645, - 0.3596872171804295, - 0.3889320983024575, - 0.4234260606515163, - 0.4529208980224505, - 0.48066604165104126, - 0.5109107477686942, - 0.5381559788994724, - 0.5656511662791569, - 0.5968956973924348, - 0.6203915847896196 - ], - "yaxis": "y" - }, - { - "hovertemplate": "variable=iv_crr
Strike=%{x}
value=%{y}", - "legendgroup": "iv_crr", - "line": { - "color": "#EF553B", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "iv_crr", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": [ - 90, - 95, - 100, - 105, - 110, - 115, - 120, - 125, - 130, - 135, - 140, - 145, - 150, - 155, - 160, - 165, - 170, - 175, - 180, - 185, - 190, - 195, - 200, - 210, - 220, - 230, - 240, - 250, - 260, - 270, - 280, - 290, - 300, - 310, - 320, - 330, - 340, - 350, - 360, - 370 - ], - "xaxis": "x", - "y": [ - 0.4859063761972558, - 0.4693266481659902, - 0.45662282592242176, - 0.4418951323861257, - 0.42974482310559253, - 0.41672429239678227, - 0.4050608056130321, - 0.3937590000354015, - 0.38349608357087717, - 0.37393339407247467, - 0.3627972634545464, - 0.3545164698677712, - 0.34486691165962974, - 0.33677702532863624, - 0.3293766009766641, - 0.32172698853705706, - 0.3156696494183007, - 0.30895839189846735, - 0.3028296512151871, - 0.29711399301579916, - 0.2929048129760734, - 0.2871790713216437, - 0.2830509029014243, - 0.2758486988855733, - 0.270501874334833, - 0.26810643333215406, - 0.2727054013055153, - 0.2795027928701648, - 0.299335943787446, - 0.3224943732479572, - 0.35762043200595217, - 0.3866440250169959, - 0.4209457626557144, - 0.45008282147143924, - 0.47776973930700695, - 0.508053127511537, - 0.5355089368716683, - 0.563158621629141, - 0.5943967942300645, - 0.6181887781966 - ], - "yaxis": "y" - }, - { - "hovertemplate": "variable=iv_bjs
Strike=%{x}
value=%{y}", - "legendgroup": "iv_bjs", - "line": { - "color": "#00cc96", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "iv_bjs", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": [ - 90, - 95, - 100, - 105, - 110, - 115, - 120, - 125, - 130, - 135, - 140, - 145, - 150, - 155, - 160, - 165, - 170, - 175, - 180, - 185, - 190, - 195, - 200, - 210, - 220, - 230, - 240, - 250, - 260, - 270, - 280, - 290, - 300, - 310, - 320, - 330, - 340, - 350, - 360, - 370 - ], - "xaxis": "x", - "y": [ - 5, - 5, - 5, - 5, - 5, - 4.174894422360559, - 3.515134903372584, - 3.0700878021950544, - 2.725773069326733, - 2.4413228580714517, - 2.1963657341433533, - 1.9811534038350955, - 1.7881871796794917, - 1.6130928273206828, - 1.4529958498962472, - 1.3053966849171228, - 1.1690455511387783, - 1.0414428860721516, - 0.9232135803395084, - 0.8123579839495987, - 0.7092510312757818, - 0.6118930723268081, - 0.5216588664716617, - 0.3563128078201955, - 0.20796377409435235, - 0.015622440561014025, - 0.015747418685467137, - 0.01624733118327958, - 0.01624733118327958, - 0.01624733118327958, - 0.01624733118327958, - 0.016497287432185804, - 0.016497287432185804, - 0.01674724368109203, - 0.02299614990374759, - 0.030869771744293607, - 0.017747068676716916, - 0.021371434285857145, - 0.017747068676716916, - 0.020121653041326033 - ], - "yaxis": "y" - } - ], - "layout": { - "legend": { - "title": { - "text": "variable" - }, - "tracegroupgap": 0 - }, - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "heatmapgl": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmapgl" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "title": { - "text": "AAPL Call IV BJS on 2025-07-25" - }, - "xaxis": { - "anchor": "y", - "domain": [ - 0, - 1 - ], - "title": { - "text": "Strike" - } - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0, - 1 - ], - "title": { - "text": "value" - } - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "aapl_chain[(aapl_chain['Expiration'] == '2026-03-20') & \n", - " (aapl_chain['Right'] == 'P')].sort_values('Strike').tail(60).plot(\n", - " x='Strike', \n", - " y=[ 'iv', 'iv_crr', 'iv_bjs'], \n", - " kind='line', \n", - " title='AAPL Call IV BJS on 2025-07-25'\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Console Logging & File Logging Can be configured using STREAM_LOG_LEVEL and FILE_LOG_LEVEL in environment variables.\n", - "Propagate to root logger can be set using PROPAGATE_TO_ROOT_LOGGER in environment variables.\n", - "Example:\n", - "STREAM_LOG_LEVEL = 'DEBUG'\n", - "FILE_LOG_LEVEL = 'INFO'\n", - "PROPAGATE_TO_ROOT_LOGGER = 'False'\n", - "\n", - "2025-07-23 22:23:01 trade.helpers.Logging INFO: Logging Root Directory: /Users/chiemelienwanisobi/cloned_repos/QuantTools/logs\n" - ] - } - ], - "source": [ - "from module_test.raw_code.optionlib_2.utils.market_data import get_div_schedule" - ] - }, - { - "cell_type": "code", - "execution_count": 194, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "hovertemplate": "variable=iv
Strike=%{x}
value=%{y}", - "legendgroup": "iv", - "line": { - "color": "#636efa", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "iv", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": [ - 90, - 95, - 100, - 105, - 110, - 115, - 120, - 125, - 130, - 135, - 140, - 145, - 150, - 155, - 160, - 165, - 170, - 175, - 180, - 185, - 190, - 195, - 200, - 210, - 220, - 230, - 240, - 250, - 260, - 270, - 280, - 290, - 300, - 310, - 320, - 330, - 340, - 350, - 360, - 370 - ], - "xaxis": "x", - "y": [ - 0.5091610540263506, - 0.5590273256831421, - 0.4797911947798695, - 0.4634190604765119, - 0.4462970574264356, - 0.4336742668566714, - 0.4195517387934698, - 0.4064290357258931, - 0.398430435760894, - 0.3840579514487862, - 0.37255996399909996, - 0.3564377859446486, - 0.353563289082227, - 0.34493979849496237, - 0.3365662641566039, - 0.32756783919597987, - 0.3204440861021525, - 0.3133203330083252, - 0.30657151428785717, - 0.29982269556738916, - 0.2943236580914523, - 0.2886996424910623, - 0.2829506487662191, - 0.2737022675566889, - 0.2650787769694242, - 0.2570801770044251, - 0.25020638015950397, - 0.24570716767919196, - 0.24258271456786418, - 0.24095799894997372, - 0.24070804270106752, - 0.24195782394559862, - 0.24420743018575464, - 0.24683197079926997, - 0.2494565114127853, - 0.2538307457686442, - 0.2582049801245031, - 0.2619543238580964, - 0.2667034925873147, - 0.27095274881872045 - ], - "yaxis": "y" - }, - { - "hovertemplate": "variable=iv_crr
Strike=%{x}
value=%{y}", - "legendgroup": "iv_crr", - "line": { - "color": "#EF553B", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "iv_crr", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": [ - 90, - 95, - 100, - 105, - 110, - 115, - 120, - 125, - 130, - 135, - 140, - 145, - 150, - 155, - 160, - 165, - 170, - 175, - 180, - 185, - 190, - 195, - 200, - 210, - 220, - 230, - 240, - 250, - 260, - 270, - 280, - 290, - 300, - 310, - 320, - 330, - 340, - 350, - 360, - 370 - ], - "xaxis": "x", - "y": [ - 0.5378541222253704, - 0.5761152595388421, - 0.5012068358129301, - 0.48198135790430763, - 0.4637999212177224, - 0.44774947276429466, - 0.4325099211695447, - 0.4173250124967942, - 0.40823702654171395, - 0.3923198817302214, - 0.38006647367712193, - 0.3630348547595225, - 0.3595871180120136, - 0.349517602182224, - 0.34104942150097983, - 0.33128542602434136, - 0.323568288694212, - 0.3167036894272721, - 0.3089940246771251, - 0.30189717810467764, - 0.29658984631439034, - 0.2905096018705363, - 0.284318682209922, - 0.27542816193950664, - 0.2659889351949726, - 0.2584631791318102, - 0.25087931781739686, - 0.24676258958753575, - 0.2430343584118784, - 0.24186788334418505, - 0.24135450406886816, - 0.24250922954050783, - 0.2447354968143308, - 0.24734806781257707, - 0.2501313789570246, - 0.2547042305792635, - 0.2594269501892328, - 0.2627655197934932, - 0.26755881500271644, - 0.272072408026457 - ], - "yaxis": "y" - }, - { - "hovertemplate": "variable=iv_bjs
Strike=%{x}
value=%{y}", - "legendgroup": "iv_bjs", - "line": { - "color": "#00cc96", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "iv_bjs", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": [ - 90, - 95, - 100, - 105, - 110, - 115, - 120, - 125, - 130, - 135, - 140, - 145, - 150, - 155, - 160, - 165, - 170, - 175, - 180, - 185, - 190, - 195, - 200, - 210, - 220, - 230, - 240, - 250, - 260, - 270, - 280, - 290, - 300, - 310, - 320, - 330, - 340, - 350, - 360, - 370 - ], - "xaxis": "x", - "y": [ - 0.5377810445261131, - 0.5755244381109528, - 0.5009124978124453, - 0.48191582289557233, - 0.4626691917297932, - 0.44779679491987295, - 0.4320495512387809, - 0.4173021325533138, - 0.40780379509487735, - 0.39243148578714465, - 0.37993367334183353, - 0.3629366484162104, - 0.35918730468261706, - 0.3498139453486337, - 0.3409404985124628, - 0.33144216105402635, - 0.32381849546238656, - 0.3163198079951999, - 0.30919605490137253, - 0.3021972799319983, - 0.29644828620715513, - 0.2905743143578589, - 0.2847003425085627, - 0.2752020050501262, - 0.26632855821395535, - 0.25808000200005, - 0.25108122703067576, - 0.24645703642591063, - 0.24320760519012974, - 0.24158288957223928, - 0.24120795519887994, - 0.24245773644341106, - 0.24470734268356706, - 0.2472069051726293, - 0.24995642391059775, - 0.2542056801420035, - 0.25857991449786244, - 0.26232925823145575, - 0.267078426960674, - 0.27120270506762667 - ], - "yaxis": "y" - } - ], - "layout": { - "legend": { - "title": { - "text": "variable" - }, - "tracegroupgap": 0 - }, - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "heatmapgl": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmapgl" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "title": { - "text": "AAPL Call IV BJS on 2025-07-25" - }, - "xaxis": { - "anchor": "y", - "domain": [ - 0, - 1 - ], - "title": { - "text": "Strike" - } - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0, - 1 - ], - "title": { - "text": "value" - } - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "aapl_chain[(aapl_chain['Expiration'] == '2026-03-20') & \n", - " (aapl_chain['Right'] == 'C')].sort_values('Strike').tail(60).plot(\n", - " x='Strike', \n", - " y=[ 'iv', 'iv_crr', 'iv_bjs'], \n", - " kind='line', \n", - " title='AAPL Call IV BJS on 2025-07-25'\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 154, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\n", - "['2025-08-22 00:00:00', '2025-08-29 00:00:00', '2025-09-19 00:00:00',\n", - " '2025-11-21 00:00:00', '2025-10-17 00:00:00', '2025-12-19 00:00:00',\n", - " '2026-09-18 00:00:00', '2025-07-18 00:00:00', '2025-07-25 00:00:00',\n", - " '2025-08-01 00:00:00', '2026-01-16 00:00:00', '2026-02-20 00:00:00',\n", - " '2026-12-18 00:00:00', '2027-01-15 00:00:00', '2027-12-17 00:00:00',\n", - " '2025-08-08 00:00:00', '2026-06-18 00:00:00', '2025-08-15 00:00:00',\n", - " '2027-06-17 00:00:00', '2026-03-20 00:00:00', '2026-05-15 00:00:00']\n", - "Length: 21, dtype: datetime64[ns]" - ] - }, - "execution_count": 154, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "aapl_chain.Expiration.unique()" - ] - }, - { - "cell_type": "code", - "execution_count": 517, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[0;31mSignature:\u001b[0m\n", - "\u001b[0mestimate_crr_implied_volatility\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mS\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mK\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mT\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mmarket_price\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mq\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0.0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0moption_type\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'c'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mN\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mint\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m1000\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mdividend_type\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mLiteral\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'continuous'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'discrete'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'continuous'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mamerican\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mbool\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mDocstring:\u001b[0m\n", - "Estimate implied volatility using optimization.\n", - "\n", - "Parameters:\n", - "- S: Spot price\n", - "- K: Strike price\n", - "- T: Time to maturity\n", - "- r: Risk-free interest rate\n", - "- market_price: Market price of the option\n", - "- q: Continuous dividend yield (default is 0.0)\n", - "- option_type: 'c' for call, 'p' for put\n", - "- N: Number of time steps in the binomial tree\n", - "\n", - "Returns:\n", - "- Estimated volatility\n", - "\u001b[0;31mFile:\u001b[0m /var/folders/j0/80hkbygd4lb27h9mw76gqzpw0000gn/T/ipykernel_95947/685215053.py\n", - "\u001b[0;31mType:\u001b[0m function" - ] - } - ], - "source": [ - "estimate_crr_implied_volatility?" - ] - }, - { - "cell_type": "code", - "execution_count": 341, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "## Example 1: When the callable takes two args. One regular input, and an iterable input\n", - "\n", - "## Use cases:\n", - " ## Brute force estimation of implied volatility\n", - " ## Vol Estimation with Minimization\n", - "\n", - "params = np.array(zip_list, dtype=object)\n", - "params =np.array_split(params, 8, axis = 0)\n", - "func_repeat = [vol_est_brute_force_bjs_2002] * len(params)\n", - "sample = [func_repeat, params]\n", - "res = runProcesses(vector_brute_force, sample, run_type = 'map')\n", - "flat_list = list(chain.from_iterable(res))\n", - "len(flat_list)" - ] - }, - { - "cell_type": "code", - "execution_count": 422, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
RootExpirationStrikeRightBid_sizeCloseBidAsk_sizeCloseAskDateMidpointWeighted_midpointiv
datetime
2025-07-16AAPL2025-12-195.0P00.0010.02202507160.0100.0200001.872672
2025-07-16AAPL2026-01-165.0P00.0050000.01202507160.0050.0100001.630965
2025-07-16AAPL2025-09-195.0P00.005000.01202507160.0050.0100002.734522
2025-07-16AAPL2026-05-155.0P00.0050000.01202507160.0050.0100001.275777
2025-07-16AAPL2025-12-1910.0P00.00860.01202507160.0050.0100001.422501
.......................................
2025-07-16AAPL2025-08-22205.0P25.10645.40202507165.2505.3909090.300698
2025-07-16AAPL2027-06-17195.0P3318.15119.352025071618.75018.1852940.291074
2025-07-16AAPL2026-09-18200.0P2216.402016.752025071616.57516.5666670.289325
2025-07-16AAPL2025-07-25207.5P111.9612.01202507161.9851.9641670.246457
2025-07-16AAPL2027-06-17200.0P4320.702121.652025071621.17521.0117190.294699
\n", - "

611 rows × 12 columns

\n", - "
" - ], - "text/plain": [ - " Root Expiration Strike Right Bid_size CloseBid Ask_size \\\n", - "datetime \n", - "2025-07-16 AAPL 2025-12-19 5.0 P 0 0.00 1 \n", - "2025-07-16 AAPL 2026-01-16 5.0 P 0 0.00 5000 \n", - "2025-07-16 AAPL 2025-09-19 5.0 P 0 0.00 500 \n", - "2025-07-16 AAPL 2026-05-15 5.0 P 0 0.00 5000 \n", - "2025-07-16 AAPL 2025-12-19 10.0 P 0 0.00 86 \n", - "... ... ... ... ... ... ... ... \n", - "2025-07-16 AAPL 2025-08-22 205.0 P 2 5.10 64 \n", - "2025-07-16 AAPL 2027-06-17 195.0 P 33 18.15 1 \n", - "2025-07-16 AAPL 2026-09-18 200.0 P 22 16.40 20 \n", - "2025-07-16 AAPL 2025-07-25 207.5 P 11 1.96 1 \n", - "2025-07-16 AAPL 2027-06-17 200.0 P 43 20.70 21 \n", - "\n", - " CloseAsk Date Midpoint Weighted_midpoint iv \n", - "datetime \n", - "2025-07-16 0.02 20250716 0.010 0.020000 1.872672 \n", - "2025-07-16 0.01 20250716 0.005 0.010000 1.630965 \n", - "2025-07-16 0.01 20250716 0.005 0.010000 2.734522 \n", - "2025-07-16 0.01 20250716 0.005 0.010000 1.275777 \n", - "2025-07-16 0.01 20250716 0.005 0.010000 1.422501 \n", - "... ... ... ... ... ... \n", - "2025-07-16 5.40 20250716 5.250 5.390909 0.300698 \n", - "2025-07-16 19.35 20250716 18.750 18.185294 0.291074 \n", - "2025-07-16 16.75 20250716 16.575 16.566667 0.289325 \n", - "2025-07-16 2.01 20250716 1.985 1.964167 0.246457 \n", - "2025-07-16 21.65 20250716 21.175 21.011719 0.294699 \n", - "\n", - "[611 rows x 12 columns]" - ] - }, - "execution_count": 422, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "values = list(_ptched_bjs2002(\n", - " s, aapl_chain['Strike'].tolist(), T, r, aapl_chain['iv'].tolist(), aapl_chain['Right'].str.lower().tolist(), q\n", - "))\n", - "\n", - "negative_idx = [values.index(x) for x in values if x < 0]\n", - "# if negative_idx:\n", - "# print(f\"Negative values found at indices: {negative_idx}\")\n", - "\n", - "aapl_chain.iloc[negative_idx]\n" - ] - }, - { - "cell_type": "code", - "execution_count": 432, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array(-7.60256525)" - ] - }, - "execution_count": 432, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# 2025-08-22\t205.0\tP\t2\t5.10\t64\t5.40\t20250716\t5.250\t5.390909\t0.300698\n", - "\n", - "_ptched_bjs2002(\n", - " S=214.67,\n", - " K=205.0,\n", - " T=time_distance_helper('2025-08-22', test_valuation_date),\n", - " r=0.04223,\n", - " sigma=0.2579,\n", - " option_type='p',\n", - " dividend=0.004\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 419, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
RootExpirationStrikeRightBid_sizeCloseBidAsk_sizeCloseAskDateMidpointWeighted_midpointiv
datetime
2025-07-16AAPL2025-08-22215.0P19.753810.15202507169.95010.1397440.290949
2025-07-16AAPL2025-08-29215.0C26.2516.40202507166.3256.3000000.274702
2025-07-16AAPL2025-08-22215.0C25.6515.75202507165.7005.6833330.278451
2025-07-16AAPL2025-08-29215.0P249.902310.602025071610.25010.2425530.280826
2025-07-16AAPL2025-09-19215.0P811.25111.402025071611.32511.2666670.270203
.......................................
2025-07-16AAPL2025-07-25215.0P45.90306.10202507166.0006.0764710.238458
2025-07-16AAPL2025-08-08215.0C64.45124.55202507164.5004.5166670.301697
2025-07-16AAPL2025-08-08215.0P48.5568.85202507168.7008.7300000.298323
2025-07-16AAPL2026-06-18210.0P1318.402318.702025071618.55018.5916670.280826
2025-07-16AAPL2026-06-18210.0C125.40225.602025071625.50025.5333330.274702
\n", - "

2428 rows × 12 columns

\n", - "
" - ], - "text/plain": [ - " Root Expiration Strike Right Bid_size CloseBid Ask_size \\\n", - "datetime \n", - "2025-07-16 AAPL 2025-08-22 215.0 P 1 9.75 38 \n", - "2025-07-16 AAPL 2025-08-29 215.0 C 2 6.25 1 \n", - "2025-07-16 AAPL 2025-08-22 215.0 C 2 5.65 1 \n", - "2025-07-16 AAPL 2025-08-29 215.0 P 24 9.90 23 \n", - "2025-07-16 AAPL 2025-09-19 215.0 P 8 11.25 1 \n", - "... ... ... ... ... ... ... ... \n", - "2025-07-16 AAPL 2025-07-25 215.0 P 4 5.90 30 \n", - "2025-07-16 AAPL 2025-08-08 215.0 C 6 4.45 12 \n", - "2025-07-16 AAPL 2025-08-08 215.0 P 4 8.55 6 \n", - "2025-07-16 AAPL 2026-06-18 210.0 P 13 18.40 23 \n", - "2025-07-16 AAPL 2026-06-18 210.0 C 1 25.40 2 \n", - "\n", - " CloseAsk Date Midpoint Weighted_midpoint iv \n", - "datetime \n", - "2025-07-16 10.15 20250716 9.950 10.139744 0.290949 \n", - "2025-07-16 6.40 20250716 6.325 6.300000 0.274702 \n", - "2025-07-16 5.75 20250716 5.700 5.683333 0.278451 \n", - "2025-07-16 10.60 20250716 10.250 10.242553 0.280826 \n", - "2025-07-16 11.40 20250716 11.325 11.266667 0.270203 \n", - "... ... ... ... ... ... \n", - "2025-07-16 6.10 20250716 6.000 6.076471 0.238458 \n", - "2025-07-16 4.55 20250716 4.500 4.516667 0.301697 \n", - "2025-07-16 8.85 20250716 8.700 8.730000 0.298323 \n", - "2025-07-16 18.70 20250716 18.550 18.591667 0.280826 \n", - "2025-07-16 25.60 20250716 25.500 25.533333 0.274702 \n", - "\n", - "[2428 rows x 12 columns]" - ] - }, - "execution_count": 419, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "aapl_chain" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "## Example 2: When the callable takes all iterables.\n", - "s_split = np.array_split(s, 8)\n", - "k_split = np.array_split(aapl_chain['Strike'].tolist(), 8)\n", - "T_split = np.array_split(T, 8)\n", - "r_split = np.array_split(r, 8)\n", - "sigma_split = np.array_split(aapl_chain['iv'].tolist(), 8)\n", - "option_type_split = np.array_split(aapl_chain['Right'].str.lower().tolist(), 8)\n", - "# div_type_split = np.array_split(['continuous'] * len(aapl_chain), 8)\n", - "dividend_split = np.array_split(q, 8)\n", - "params = np.array([\n", - " s_split, \n", - " k_split, \n", - " T_split, \n", - " r_split, \n", - " sigma_split, \n", - " option_type_split,\n", - " dividend_split, \n", - "], dtype=object)\n", - "\n", - "# func_repeat = [bjs2002_numerical_greeks] * len(params)\n", - "res2 = runProcesses(_ptched_bjs2002, params, run_type = 'map')\n", - "# params[0]\n", - "res2" - ] - }, - { - "cell_type": "code", - "execution_count": 433, - "metadata": {}, - "outputs": [], - "source": [ - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 354, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[[0.13222703067576688,\n", - " 0.27657676441911044,\n", - " 0.2802011300282507,\n", - " 0.14197532438310956,\n", - " 0.17022038050951271,\n", - " 0.2707027925698142,\n", - " 0.2655786894672367,\n", - " 0.22921005525138127,\n", - " 0.2627041926048151,\n", - " 0.26782829570739264,\n", - " 0.19671574289357233,\n", - " 0.24333258331458285,\n", - " 0.2763268081702042,\n", - " 0.058489937248431205,\n", - " 0.39018187954698863,\n", - " 0.28182584564614116,\n", - " 0.026995449886247157,\n", - " 0.3173196329908248,\n", - " 0.24133293332333305,\n", - " 0.02062156553913848,\n", - " 0.268203230080752,\n", - " 0.2725774644366109,\n", - " 0.2550805270131753,\n", - " 0.271577639440986,\n", - " 0.2769516987924698,\n", - " 0.40392947323683087,\n", - " 0.40767881697042424,\n", - " 0.27570191754793866,\n", - " 0.2439574739368484,\n", - " 0.2752020050501262,\n", - " 0.4956634165854146,\n", - " 0.03661876546913673,\n", - " 0.3116956173904347,\n", - " 0.07848643716092901,\n", - " 0.2971981549538738,\n", - " 0.0153724843121078,\n", - " 0.0153724843121078,\n", - " 0.3145701142528563,\n", - " 0.27207755193879846,\n", - " 0.30757133928348207,\n", - " 0.28057606440161004,\n", - " 0.2747020925523138,\n", - " 0.018496937423435587,\n", - " 0.01637230930773269,\n", - " 0.015497462436560912,\n", - " 0.0153724843121078,\n", - " 0.271577639440986,\n", - " 0.2609544988624715,\n", - " 0.42667549188729714,\n", - " 0.2733273331833296,\n", - " 0.12272869321733043,\n", - " 0.0153724843121078,\n", - " 0.2645788644716118,\n", - " 0.25670524263106576,\n", - " 0.14809925248131203,\n", - " 0.27207755193879846,\n", - " 0.26332908322708065,\n", - " 0.33181709542738563,\n", - " 0.3450647766194155,\n", - " 0.09760809020225505,\n", - " 0.3124454861371534,\n", - " 0.0462420810520263,\n", - " 0.25083127078176953,\n", - " 0.034619115477886944,\n", - " 0.26320410510262754,\n", - " 0.16897059926498162,\n", - " 0.2650787769694242,\n", - " 0.19371626790669766,\n", - " 0.20796377409435235,\n", - " 0.267078426960674,\n", - " 0.26632855821395535,\n", - " 0.45067129178229454,\n", - " 0.37793402335058374,\n", - " 0.23345931148278706,\n", - " 0.11722965574139353,\n", - " 0.265953623840596,\n", - " 0.03936828420710518,\n", - " 0.054365659141478534,\n", - " 0.2618293457336433,\n", - " 0.3113206830170754,\n", - " 0.032494487362184056,\n", - " 0.2923240081002025,\n", - " 0.276076851921298,\n", - " 0.24570716767919196,\n", - " 0.26745336133403336,\n", - " 0.02824523113077827,\n", - " 0.025120778019450486,\n", - " 0.2668284707117678,\n", - " 0.27095274881872045,\n", - " 0.023371084277106928,\n", - " 0.25483057076426907,\n", - " 0.2609544988624715,\n", - " 0.019246806170154254,\n", - " 0.015497462436560912,\n", - " 0.015747418685467137,\n", - " 0.015497462436560912,\n", - " 0.2515811395284882,\n", - " 0.2583299582489562,\n", - " 0.27657676441911044,\n", - " 0.2697029675741893,\n", - " 0.43142466061651535,\n", - " 0.1347265931648291,\n", - " 0.27320235505887647,\n", - " 0.06298914972874321,\n", - " 0.3126954423860596,\n", - " 0.047991774794369856,\n", - " 0.26145441136028397,\n", - " 0.11273044326108152,\n", - " 0.25857991449786244,\n", - " 0.06348906222655566,\n", - " 0.27007790194754866,\n", - " 0.3009474986874672,\n", - " 0.071737618440461,\n", - " 0.3060716017900447,\n", - " 0.28532523313082825,\n", - " 0.2705778144453611,\n", - " 0.2639539738493462,\n", - " 0.4061790794769869,\n", - " 0.1844678866971674,\n", - " 0.25645528638215953,\n", - " 0.043367584189604735,\n", - " 0.1533483337083427,\n", - " 0.43142466061651535,\n", - " 0.2925739643491087,\n", - " 0.31419517987949697,\n", - " 0.05236600915022875,\n", - " 0.26745336133403336,\n", - " 0.034244181104527614,\n", - " 0.2750770269256731,\n", - " 0.025245756143903595,\n", - " 0.03949326233155829,\n", - " 0.25208105202630066,\n", - " 0.030744793619840494,\n", - " 0.2723275081877047,\n", - " 0.2627041926048151,\n", - " 0.33419167979199477,\n", - " 0.015622440561014025,\n", - " 0.2484566864171604,\n", - " 0.22233625840646015,\n", - " 0.25783004575114377,\n", - " 0.26632855821395535,\n", - " 0.015622440561014025,\n", - " 0.2550805270131753,\n", - " 0.015622440561014025,\n", - " 0.015622440561014025,\n", - " 0.3049467986699667,\n", - " 0.4777915447886197,\n", - " 0.17184509612740317,\n", - " 0.058989849746243654,\n", - " 0.31844443611090273,\n", - " 0.015622440561014025,\n", - " 0.2584549363734093,\n", - " 0.015622440561014025,\n", - " 0.2540807020175504,\n", - " 0.25808000200005,\n", - " 0.015622440561014025,\n", - " 0.25957973949348734,\n", - " 0.26732838320958024,\n", - " 0.3689355983899597,\n", - " 0.09498354958873971,\n", - " 0.19009190229755743,\n", - " 0.5232835820895522,\n", - " 0.3210689767244181,\n", - " 0.08735988399709992,\n", - " 0.3248183204580114,\n", - " 0.06511377784444611,\n", - " 0.05636530913272832,\n", - " 0.29744811120278003,\n", - " 0.2605795644891122,\n", - " 0.27782654566364157,\n", - " 0.1202291307282682,\n", - " 0.04899159978999475,\n", - " 0.27182759568989223,\n", - " 0.04449238730968274,\n", - " 0.2617043676091902,\n", - " 0.03824348108702717,\n", - " 0.2507062926573164,\n", - " 0.030994749868746715,\n", - " 0.01624733118327958,\n", - " 0.015622440561014025,\n", - " 0.25295589889747244,\n", - " 0.24570716767919196,\n", - " 0.015622440561014025,\n", - " 0.2627041926048151,\n", - " 0.1698454461361534,\n", - " 0.2505813145328633,\n", - " 0.204214430360759,\n", - " 0.568025750643766,\n", - " 0.2505813145328633,\n", - " 0.25470559263981596,\n", - " 0.016497287432185804,\n", - " 0.015622440561014025,\n", - " 0.20533923348083702,\n", - " 0.26545371134278356,\n", - " 0.2140877021925548,\n", - " 0.2645788644716118,\n", - " 0.2647038425960649,\n", - " 0.3518135953398835,\n", - " 0.32919255481387033,\n", - " 0.10398197454936373,\n", - " 0.6118930723268081,\n", - " 0.2218363459086477,\n", - " 0.3066964924123103,\n", - " 0.06448888722218055,\n", - " 0.33719115477886946,\n", - " 0.015622440561014025,\n", - " 0.07786154653866346,\n", - " 0.2573301332533313,\n", - " 0.283950473761844,\n", - " 0.056240331008275204,\n", - " 0.05036635915897897,\n", - " 0.27295239880997024,\n", - " 0.2647038425960649,\n", - " 0.04836670916772919,\n", - " 0.03711867796694917,\n", - " 0.2517061176529413,\n", - " 0.2640789519737993,\n", - " 0.25008140203505086,\n", - " 0.2542056801420035,\n", - " 0.015747418685467137,\n", - " 0.24408245206130152,\n", - " 0.022121303032575812,\n", - " 0.015747418685467137,\n", - " 0.24770681767044175,\n", - " 0.25982969574239356,\n", - " 0.23970821770544262,\n", - " 0.6550105252631315,\n", - " 0.11273044326108152,\n", - " 0.24770681767044175,\n", - " 0.015747418685467137,\n", - " 0.28857466436660917,\n", - " 0.2608295207380184,\n", - " 0.015747418685467137,\n", - " 0.6973781094527363,\n", - " 0.256955198879972,\n", - " 0.251331183279582,\n", - " 0.3516886172154304,\n", - " 0.015747418685467137,\n", - " 0.09235900897522438,\n", - " 0.25108122703067576,\n", - " 0.015747418685467137,\n", - " 0.2923240081002025,\n", - " 0.06511377784444611,\n", - " 0.25183109577739443,\n", - " 0.05474059351483787,\n", - " 0.26995292382309555,\n", - " 0.12060406510162754,\n", - " 0.3746845921148028,\n", - " 0.31706967674191855,\n", - " 0.015747418685467137,\n", - " 0.25008140203505086,\n", - " 0.25445563639090973,\n", - " 0.015747418685467137,\n", - " 0.015747418685467137,\n", - " 0.2452072551813795,\n", - " 0.05836495912397809,\n", - " 0.27957623940598514,\n", - " 0.016497287432185804,\n", - " 0.25308087702192555,\n", - " 0.016497287432185804,\n", - " 0.04324260606515162,\n", - " 0.24495729893247328,\n", - " 0.10535673391834795,\n", - " 0.2439574739368484,\n", - " 0.25982969574239356,\n", - " 0.01624733118327958,\n", - " 0.2572051551288782,\n", - " 0.11960424010600264,\n", - " 0.2599546738668467,\n", - " 0.015747418685467137,\n", - " 0.26107947698692463,\n", - " 0.2617043676091902,\n", - " 0.29094924873121825,\n", - " 0.780238605965149,\n", - " 0.2485816645416135,\n", - " 0.10198232455811394,\n", - " 0.3689355983899597,\n", - " 0.015747418685467137,\n", - " 0.07636180904522613,\n", - " 0.30282217055426386,\n", - " 0.13660126503162578,\n", - " 0.40592912322808067,\n", - " 0.27657676441911044,\n", - " 0.06048958723968099,\n", - " 0.01624733118327958,\n", - " 0.2517061176529413,\n", - " 0.33406670166754165,\n", - " 0.08473534338358459,\n", - " 0.24770681767044175,\n", - " 0.01624733118327958,\n", - " 0.28857466436660917,\n", - " 0.016497287432185804,\n", - " 0.0662385809645241,\n", - " 0.2439574739368484,\n", - " 0.2573301332533313,\n", - " 0.04911657791444786,\n", - " 0.2427076926923173,\n", - " 0.17621933048326208,\n", - " 0.01624733118327958,\n", - " 0.2589548488712218,\n", - " 0.24533223330583262,\n", - " 0.01624733118327958,\n", - " 0.25458061451536285,\n", - " 0.2583299582489562],\n", - " [0.22808525213130326,\n", - " 0.015747418685467137,\n", - " 0.3241934298357459,\n", - " 0.8605995399884997,\n", - " 0.11385524638115953,\n", - " 0.38155838895972394,\n", - " 0.3125704642616065,\n", - " 0.08248573714342858,\n", - " 0.01624733118327958,\n", - " 0.24795677391934798,\n", - " 0.282825670641766,\n", - " 0.06761334033350834,\n", - " 0.24645703642591063,\n", - " 0.01624733118327958,\n", - " 0.016497287432185804,\n", - " 0.01624733118327958,\n", - " 0.24770681767044175,\n", - " 0.2503313582839571,\n", - " 0.24345756143903596,\n", - " 0.017747068676716916,\n", - " 0.15222353058826468,\n", - " 0.4043044076101902,\n", - " 0.24158288957223928,\n", - " 0.01624733118327958,\n", - " 0.3469394484862121,\n", - " 0.09460861521538037,\n", - " 0.015872396809920246,\n", - " 0.2494565114127853,\n", - " 0.25483057076426907,\n", - " 0.01624733118327958,\n", - " 0.25558043951098774,\n", - " 0.07398722468061701,\n", - " 0.015872396809920246,\n", - " 0.29769806745168625,\n", - " 0.18834220855521386,\n", - " 0.25870489262231555,\n", - " 0.36468634215855394,\n", - " 0.9388358458961473,\n", - " 0.05499054976374409,\n", - " 0.12622808070201755,\n", - " 0.39805550138753465,\n", - " 0.26120445511137774,\n", - " 0.01624733118327958,\n", - " 0.24683197079926997,\n", - " 0.3289425985649641,\n", - " 0.09073429335733393,\n", - " 0.25283092077301933,\n", - " 0.01624733118327958,\n", - " 0.2925739643491087,\n", - " 0.0761118527963199,\n", - " 0.24483232080802017,\n", - " 0.01787204680117003,\n", - " 0.24820673016825417,\n", - " 0.01624733118327958,\n", - " 0.24308262706567663,\n", - " 0.016497287432185804,\n", - " 0.1677208180204505,\n", - " 0.44117295432385806,\n", - " 0.24158288957223928,\n", - " 0.10898109952748818,\n", - " 0.01624733118327958,\n", - " 0.35618782969574236,\n", - " 0.24733188329708242,\n", - " 0.01624733118327958,\n", - " 0.15634780869521736,\n", - " 0.08136093402335058,\n", - " 0.3079462736568414,\n", - " 0.25470559263981596,\n", - " 0.3964307857696442,\n", - " 1.0148225455636388,\n", - " 0.26745336133403336,\n", - " 0.061864346608665216,\n", - " 0.015997374934373358,\n", - " 0.414177679441986,\n", - " 0.08561019025475636,\n", - " 0.2559553738843471,\n", - " 0.05111622790569764,\n", - " 0.24983144578614463,\n", - " 0.09898284957123928,\n", - " 0.25020638015950397,\n", - " 0.3383159578989475,\n", - " 0.01624733118327958,\n", - " 0.29982269556738916,\n", - " 0.07961124028100702,\n", - " 0.01624733118327958,\n", - " 0.24970646766169152,\n", - " 0.24445738643466086,\n", - " 0.01624733118327958,\n", - " 0.01624733118327958,\n", - " 0.24358253956348908,\n", - " 0.01624733118327958,\n", - " 0.24133293332333305,\n", - " 0.01624733118327958,\n", - " 0.24320760519012974,\n", - " 0.2514561614040351,\n", - " 0.01624733118327958,\n", - " 0.24670699267481686,\n", - " 0.25183109577739443,\n", - " 0.01624733118327958,\n", - " 0.016497287432185804,\n", - " 0.125603190079752,\n", - " 0.18409295232380807,\n", - " 0.477041676041901,\n", - " 0.25220603015075377,\n", - " 0.41117820445511133,\n", - " 1.0889345733643339,\n", - " 0.37618432960824016,\n", - " 0.11335533388334708,\n", - " 0.15059881497037425,\n", - " 0.4339242231055776,\n", - " 0.01624733118327958,\n", - " 0.24545721143028573,\n", - " 0.37355978899472486,\n", - " 0.0871099277481937,\n", - " 0.1069814495362384,\n", - " 0.3180695017375434,\n", - " 0.08623508087702192,\n", - " 0.27320235505887647,\n", - " 0.3090710767769194,\n", - " 0.06773831845796144,\n", - " 0.25358078951973795,\n", - " 0.05361579039475987,\n", - " 0.2495814895372384,\n", - " 0.01624733118327958,\n", - " 0.2517061176529413,\n", - " 0.01624733118327958,\n", - " 0.01624733118327958,\n", - " 0.24445738643466086,\n", - " 0.24308262706567663,\n", - " 0.021121478036950924,\n", - " 0.020121653041326033,\n", - " 0.24145791144778617,\n", - " 0.1975905897647441,\n", - " 0.5120355508887722,\n", - " 0.25083127078176953,\n", - " 0.01624733118327958,\n", - " 0.08248573714342858,\n", - " 0.451171204280107,\n", - " 1.1611719292982323,\n", - " 0.24408245206130152,\n", - " 0.43329933248331204,\n", - " 0.15822248056201405,\n", - " 0.1202291307282682,\n", - " 0.4416728668216705,\n", - " 0.09835795894897371,\n", - " 0.3279427735693392,\n", - " 0.11523000575014375,\n", - " 0.355812895322383,\n", - " 0.2779515237880947,\n", - " 0.07036285907147678,\n", - " 0.3190693267331683,\n", - " 0.25245598639966,\n", - " 0.09260896522413059,\n", - " 0.015997374934373358,\n", - " 0.2573301332533313,\n", - " 0.01624733118327958,\n", - " 0.01787204680117003,\n", - " 0.01624733118327958,\n", - " 0.2538307457686442,\n", - " 0.2484566864171604,\n", - " 0.01624733118327958,\n", - " 0.2462070801770044,\n", - " 0.24145791144778617,\n", - " 0.017747068676716916,\n", - " 0.2485816645416135,\n", - " 0.01624733118327958,\n", - " 0.022621215530388258,\n", - " 0.01624733118327958,\n", - " 0.24095799894997372,\n", - " 0.2485816645416135,\n", - " 0.015997374934373358,\n", - " 0.24158288957223928,\n", - " 0.25208105202630066,\n", - " 0.01624733118327958,\n", - " 0.5019123228080702,\n", - " 1.2317845696142402,\n", - " 0.24420743018575464,\n", - " 0.01624733118327958,\n", - " 0.45941976049401234,\n", - " 0.16934553363834096,\n", - " 0.5460296007400185,\n", - " 0.21808700217505436,\n", - " 0.12310362759068975,\n", - " 0.13610135253381334,\n", - " 0.37693419835495884,\n", - " 0.4636690167254181,\n", - " 0.01624733118327958,\n", - " 0.09898284957123928,\n", - " 0.24308262706567663,\n", - " 0.3289425985649641,\n", - " 0.33956573914347854,\n", - " 0.10323210580264505,\n", - " 0.2868249706242656,\n", - " 0.0772366559163979,\n", - " 0.06586364659116478,\n", - " 0.26107947698692463,\n", - " 0.016497287432185804,\n", - " 0.01624733118327958,\n", - " 0.2549555488887222,\n", - " 0.24595712392809818,\n", - " 0.01624733118327958,\n", - " 0.24733188329708242,\n", - " 0.01624733118327958,\n", - " 0.23933328333208329,\n", - " 0.24258271456786418,\n", - " 0.01624733118327958,\n", - " 0.22646053651341283,\n", - " 0.5793987599689991,\n", - " 0.01612235305882647,\n", - " 0.2484566864171604,\n", - " 0.4902893572339308,\n", - " 0.14060056501412535,\n", - " 0.5112856821420535,\n", - " 1.3006475161879045,\n", - " 0.01624733118327958,\n", - " 0.24208280207005173,\n", - " 0.17609435235880896,\n", - " 0.48504027600690014,\n", - " 0.11060581514537862,\n", - " 0.347939273481837,\n", - " 0.08236075901897547,\n", - " 0.13085227130678265,\n", - " 0.2913241831045776,\n", - " 0.3975555888897222,\n", - " 0.24995642391059775,\n", - " 0.10523175579389484,\n", - " 0.01624733118327958,\n", - " 0.3358163954098852,\n", - " 0.068363209080227,\n", - " 0.26532873321833045,\n", - " 0.01624733118327958,\n", - " 0.24495729893247328,\n", - " 0.25857991449786244,\n", - " 0.016497287432185804,\n", - " 0.24895659891497285,\n", - " 0.021371434285857145,\n", - " 0.01624733118327958,\n", - " 0.24358253956348908,\n", - " 0.24670699267481686,\n", - " 0.01624733118327958,\n", - " 0.01624733118327958,\n", - " 0.01624733118327958,\n", - " 0.24295764894122351,\n", - " 0.01624733118327958,\n", - " 0.24658201455036374,\n", - " 0.24120795519887994,\n", - " 0.24758183954598864,\n", - " 0.01612235305882647,\n", - " 0.5536532663316582,\n", - " 1.3680107252681315,\n", - " 0.24308262706567663,\n", - " 0.01624733118327958,\n", - " 0.5100359008975224,\n", - " 0.18621758043951098,\n", - " 0.24633205830145752,\n", - " 0.6118930723268081,\n", - " 0.13535148378709466,\n", - " 0.14647453686342157,\n", - " 0.4185519137978449,\n", - " 0.39505602640066,\n", - " 0.01624733118327958,\n", - " 0.24195782394559862,\n", - " 0.11123070576764418,\n", - " 0.3568127203180079,\n", - " 0.11972921823045575,\n", - " 0.35718765469136726,\n", - " 0.09023438085952148,\n", - " 0.29757308932723314,\n", - " 0.01624733118327958,\n", - " 0.26932803320083,\n", - " 0.2439574739368484,\n", - " 0.26145441136028397,\n", - " 0.06348906222655566,\n", - " 0.01624733118327958,\n", - " 0.25108122703067576,\n", - " 0.016497287432185804,\n", - " 0.046117102927573185,\n", - " 0.24333258331458285,\n", - " 0.24495729893247328,\n", - " 0.016497287432185804,\n", - " 0.2542056801420035,\n", - " 0.6436375159378984,\n", - " 0.01624733118327958,\n", - " 0.24658201455036374,\n", - " 0.01624733118327958,\n", - " 0.24120795519887994,\n", - " 1.4339991749793743,\n", - " 0.5692755318882972,\n", - " 0.40092999824995623,\n", - " 0.01637230930773269,\n", - " 0.20158988974724368,\n", - " 0.505036775919398,\n", - " 0.12397847446186154,\n", - " 0.3753094827370684,\n", - " 0.09098424960624014,\n", - " 0.402929648241206,\n", - " 0.3056966674166854,\n", - " 0.14260021500537512,\n", - " 0.01624733118327958,\n", - " 0.3476893172329308,\n", - " 0.24770681767044175,\n", - " 0.11722965574139353,\n", - " 0.27420218005450137,\n", - " 0.01787204680117003],\n", - " [0.01624733118327958,\n", - " 0.24420743018575464,\n", - " 0.26420393009825244,\n", - " 0.017747068676716916,\n", - " 0.25358078951973795,\n", - " 0.016497287432185804,\n", - " 0.01787204680117003,\n", - " 0.24670699267481686,\n", - " 0.24570716767919196,\n", - " 0.01787204680117003,\n", - " 0.016497287432185804,\n", - " 0.24633205830145752,\n", - " 0.016497287432185804,\n", - " 0.2452072551813795,\n", - " 0.01624733118327958,\n", - " 0.2417078676966924,\n", - " 1.4984878871971796,\n", - " 0.6092685317132928,\n", - " 0.016497287432185804,\n", - " 0.24245773644341106,\n", - " 0.5277827945698642,\n", - " 0.21046333658341457,\n", - " 0.2460821020525513,\n", - " 0.42092649816245403,\n", - " 0.016497287432185804,\n", - " 0.14984894622365558,\n", - " 0.67463209080227,\n", - " 0.01637230930773269,\n", - " 0.1258531463286582,\n", - " 0.4461720793019825,\n", - " 0.4449222980574514,\n", - " 0.16647103677591937,\n", - " 0.016497287432185804,\n", - " 0.24133293332333305,\n", - " 0.13097724943123576,\n", - " 0.43654876371909296,\n", - " 0.31182059551488783,\n", - " 0.09798302457561438,\n", - " 0.01674724368109203,\n", - " 0.267078426960674,\n", - " 0.2780765019125478,\n", - " 0.01787204680117003,\n", - " 0.016497287432185804,\n", - " 0.016497287432185804,\n", - " 0.25558043951098774,\n", - " 0.2437075176879422,\n", - " 0.24820673016825417,\n", - " 0.016497287432185804,\n", - " 0.2452072551813795,\n", - " 0.01787204680117003,\n", - " 0.01787204680117003,\n", - " 0.24433240831020775,\n", - " 0.7051267531688291,\n", - " 0.2866999924998125,\n", - " 1.561601840046001,\n", - " 0.6253907097677441,\n", - " 0.17147016175404384,\n", - " 0.4647938198454961,\n", - " 0.2197117177929448,\n", - " 0.5501538788469711,\n", - " 0.45529548238705964,\n", - " 0.134601615040376,\n", - " 0.3154449611240281,\n", - " 0.4234260606515163,\n", - " 0.10273219330483262,\n", - " 0.1622217805445136,\n", - " 0.24595712392809818,\n", - " 0.016497287432185804,\n", - " 0.2849502987574689,\n", - " 0.4512961824045601,\n", - " 0.13397672441811045,\n", - " 0.08860966524163104,\n", - " 0.24333258331458285,\n", - " 0.016497287432185804,\n", - " 0.016497287432185804,\n", - " 0.26982794569864244,\n", - " 0.24908157703942596,\n", - " 0.016497287432185804,\n", - " 0.01787204680117003,\n", - " 0.24320760519012974,\n", - " 0.24445738643466086,\n", - " 0.016497287432185804,\n", - " 0.01787204680117003,\n", - " 0.24695694892372308,\n", - " 0.2438324958123953,\n", - " 0.016497287432185804,\n", - " 1.623466011650291,\n", - " 0.6655086877171928,\n", - " 0.016497287432185804,\n", - " 0.24470734268356706,\n", - " 0.2294600115002875,\n", - " 0.5720250506262656,\n", - " 0.24458236455911395,\n", - " 0.016497287432185804,\n", - " 0.16947051176279407,\n", - " 0.44017312932823316,\n", - " 0.7348715467886696,\n", - " 0.29007440186004646,\n", - " 0.37505952648816215,\n", - " 0.19021688042201054,\n", - " 0.13735113377834446,\n", - " 0.4844153853846346,\n", - " 0.016497287432185804,\n", - " 0.24195782394559862,\n", - " 0.3941811795294882,\n", - " 0.1509737493437336,\n", - " 0.11223053076326907,\n", - " 0.32856766419160477,\n", - " 0.016622265556638916,\n", - " 0.28857466436660917,\n", - " 0.27320235505887647,\n", - " 0.08748486212155303,\n", - " 0.01674724368109203,\n", - " 0.016497287432185804,\n", - " 0.260329608240206,\n", - " 0.24333258331458285,\n", - " 0.01674724368109203,\n", - " 0.2515811395284882,\n", - " 0.016497287432185804,\n", - " 0.24320760519012974,\n", - " 0.6908792469811744,\n", - " 1.6842053801345032,\n", - " 0.7639914497862446,\n", - " 0.30057256431410784,\n", - " 0.7208739968499212,\n", - " 0.24583214580364507,\n", - " 0.6168921973049326,\n", - " 0.19096674916872922,\n", - " 0.1500989024725618,\n", - " 0.40967846696167404,\n", - " 0.016622265556638916,\n", - " 0.45654526363159076,\n", - " 0.1102308807720193,\n", - " 0.3325669641741043,\n", - " 0.24495729893247328,\n", - " 0.14310012750318757,\n", - " 0.3890570764269106,\n", - " 0.016497287432185804,\n", - " 0.2923240081002025,\n", - " 0.09460861521538037,\n", - " 0.08361054026350659,\n", - " 0.2762018300457511,\n", - " 0.017747068676716916,\n", - " 0.2527059426485662,\n", - " 0.24408245206130152,\n", - " 0.01674724368109203,\n", - " 0.01674724368109203,\n", - " 0.2437075176879422,\n", - " 0.25008140203505086,\n", - " 0.01787204680117003,\n", - " 0.24245773644341106,\n", - " 0.01674724368109203,\n", - " 1.7436949673741842,\n", - " 0.7151250031250781,\n", - " 0.2472069051726293,\n", - " 0.01674724368109203,\n", - " 0.24358253956348908,\n", - " 0.7454946873671842,\n", - " 0.01674724368109203,\n", - " 0.24220778019450484,\n", - " 0.18409295232380807,\n", - " 0.47266744168604213,\n", - " 0.792611440286007,\n", - " 0.315319982999575,\n", - " 0.19509102727568187,\n", - " 0.6390133253331333,\n", - " 0.4026796919922998,\n", - " 0.14872414310357757,\n", - " 0.01674724368109203,\n", - " 0.24295764894122351,\n", - " 0.1533483337083427,\n", - " 0.42492579814495357,\n", - " 0.2971981549538738,\n", - " 0.01787204680117003,\n", - " 0.01674724368109203,\n", - " 0.24545721143028573,\n", - " 0.2792013050326258,\n", - " 0.08698494962374059,\n", - " 0.01674724368109203,\n", - " 0.2669534488362209,\n", - " 0.25345581139528484,\n", - " 0.01787204680117003,\n", - " 0.01674724368109203,\n", - " 0.24158288957223928,\n", - " 0.8207315182879571,\n", - " 0.341190454761369,\n", - " 0.7637414935373383,\n", - " 1.802059751493787,\n", - " 0.511785594639866,\n", - " 0.2107132928323208,\n", - " 0.6352639815995399,\n", - " 0.2638289957248931,\n", - " 0.4397981949548738,\n", - " 0.016622265556638916,\n", - " 0.4884146853671341,\n", - " 0.19096674916872922,\n", - " 0.35143866096652415,\n", - " 0.12172886822170553,\n", - " 0.24808175204380106,\n", - " 0.01674724368109203,\n", - " 0.4160523513087827,\n", - " 0.30744636115902896,\n", - " 0.15422318057951448,\n", - " 0.10298214955373884,\n", - " 0.28070104252606315,\n", - " 0.01674724368109203,\n", - " 0.2438324958123953,\n", - " 0.01787204680117003,\n", - " 0.24333258331458285,\n", - " 0.01674724368109203,\n", - " 0.24108297707442683,\n", - " 0.01674724368109203,\n", - " 1.859299732493312,\n", - " 0.7706152903822595,\n", - " 0.25358078951973795,\n", - " 0.01674724368109203,\n", - " 0.24995642391059775,\n", - " 0.02299614990374759,\n", - " 0.01674724368109203,\n", - " 0.194091202280057,\n", - " 0.24320760519012974,\n", - " 0.47729163229080723,\n", - " 0.8482267056676416,\n", - " 0.35043883597089925,\n", - " 0.5290325758143953,\n", - " 0.21446263656591413,\n", - " 0.24495729893247328,\n", - " 0.01674724368109203,\n", - " 0.16847068676716917,\n", - " 0.43917330433260826,\n", - " 0.3104458361459036,\n", - " 0.01787204680117003,\n", - " 0.01674724368109203,\n", - " 0.2849502987574689,\n", - " 0.01674724368109203,\n", - " 0.01674724368109203,\n", - " 0.24495729893247328,\n", - " 0.2694530113252831,\n", - " 0.01674724368109203,\n", - " 0.25570541763544086,\n", - " 0.24295764894122351,\n", - " 0.01787204680117003,\n", - " 0.3680607515187879,\n", - " 0.1348515712892822,\n", - " 0.01674724368109203,\n", - " 0.24220778019450484,\n", - " 0.31594487362184054,\n", - " 0.01787204680117003,\n", - " 0.28832470811770294,\n", - " 0.017747068676716916,\n", - " 0.01674724368109203,\n", - " 0.24345756143903596,\n", - " 0.2439574739368484,\n", - " 0.01674724368109203,\n", - " 0.01787204680117003,\n", - " 0.2427076926923173,\n", - " 0.020121653041326033,\n", - " 1.9707802195054873,\n", - " 0.8066089902247555,\n", - " 0.25745511137778443,\n", - " 0.030869771744293607,\n", - " 0.2542056801420035,\n", - " 0.01674724368109203,\n", - " 0.25120620515512887,\n", - " 0.20708892722318056,\n", - " 0.5061615790394759,\n", - " 0.01674724368109203,\n", - " 0.24795677391934798,\n", - " 0.01787204680117003,\n", - " 0.32069404235105875,\n", - " 0.2935737893447336,\n", - " 0.24658201455036374,\n", - " 0.017747068676716916,\n", - " 0.017747068676716916,\n", - " 0.022121303032575812,\n", - " 0.2762018300457511,\n", - " 0.02062156553913848,\n", - " 0.25970471761794045,\n", - " 0.01787204680117003,\n", - " 0.2418328458211455,\n", - " 0.3726849421235531,\n", - " 0.13960074001850045,\n", - " 0.2385834145853646,\n", - " 0.01674724368109203,\n", - " 0.12085402135053376,\n", - " 0.324318407960199,\n", - " 0.29494854871371784,\n", - " 0.017747068676716916,\n", - " 0.04686697167429185,\n", - " 0.24420743018575464,\n", - " 0.017497112427810695,\n", - " 0.24345756143903596,\n", - " 0.017747068676716916,\n", - " 0.2418328458211455,\n", - " 0.26145441136028397,\n", - " 0.017747068676716916,\n", - " 2.0785113627840692,\n", - " 0.855350458761469,\n", - " 0.017747068676716916,\n", - " 0.25857991449786244,\n", - " 0.017747068676716916,\n", - " 0.2542056801420035,\n", - " 0.5339067226680667,\n", - " 0.21708717717942946],\n", - " [0.2507062926573164,\n", - " 0.017747068676716916,\n", - " 0.33319185479636987,\n", - " 0.01787204680117003,\n", - " 0.2484566864171604,\n", - " 0.017747068676716916,\n", - " 0.30269719242981075,\n", - " 0.01787204680117003,\n", - " 0.28420043001075024,\n", - " 0.017747068676716916,\n", - " 0.017747068676716916,\n", - " 0.2684531863296582,\n", - " 0.017747068676716916,\n", - " 0.2437075176879422,\n", - " 0.15222353058826468,\n", - " 0.3604370859271481,\n", - " 0.2428326708167704,\n", - " 0.01787204680117003,\n", - " 0.33506652666316655,\n", - " 0.12347856196404909,\n", - " 0.01787204680117003,\n", - " 0.2452072551813795,\n", - " 0.01787204680117003,\n", - " 0.24445738643466086,\n", - " 0.01787204680117003,\n", - " 0.23770856771419283,\n", - " 0.017747068676716916,\n", - " 0.9118405710142753,\n", - " 2.1824931623290578,\n", - " 0.2650787769694242,\n", - " 0.26232925823145575,\n", - " 0.021371434285857145,\n", - " 0.017747068676716916,\n", - " 0.25745511137778443,\n", - " 0.23245948648716216,\n", - " 0.5607770194254856,\n", - " 0.017747068676716916,\n", - " 0.2539557238930973,\n", - " 0.10273219330483262,\n", - " 0.28645003625090626,\n", - " 0.33519150478761967,\n", - " 0.01787204680117003,\n", - " 0.017497112427810695,\n", - " 0.2503313582839571,\n", - " 0.017747068676716916,\n", - " 0.26245423635590887,\n", - " 0.23783354583864594,\n", - " 0.017747068676716916,\n", - " 0.15947226180654514,\n", - " 0.39918030450761266,\n", - " 0.017747068676716916,\n", - " 0.24308262706567663,\n", - " 0.3433150828770719,\n", - " 0.01787204680117003,\n", - " 0.24670699267481686,\n", - " 0.05099124978124453,\n", - " 0.048491687292182305,\n", - " 0.24658201455036374,\n", - " 0.23795852396309905,\n", - " 0.01787204680117003,\n", - " 2.2832255306382656,\n", - " 0.9839529488237205,\n", - " 0.26995292382309555,\n", - " 0.017747068676716916,\n", - " 0.267078426960674,\n", - " 0.017747068676716916,\n", - " 0.24445738643466086,\n", - " 0.5867724693117328,\n", - " 0.2705778144453611,\n", - " 0.017747068676716916,\n", - " 0.017497112427810695,\n", - " 0.25670524263106576,\n", - " 0.2958233955848896,\n", - " 0.01787204680117003,\n", - " 0.2533308332708318,\n", - " 0.017497112427810695,\n", - " 0.2745771144278607,\n", - " 0.09660826520663016,\n", - " 0.24095799894997372,\n", - " 0.017747068676716916,\n", - " 0.16272169304232606,\n", - " 0.4176770669266731,\n", - " 0.017747068676716916,\n", - " 0.2417078676966924,\n", - " 0.01787204680117003,\n", - " 0.24870664266606662,\n", - " 0.01787204680117003,\n", - " 0.34756433910847767,\n", - " 0.017497112427810695,\n", - " 0.24658201455036374,\n", - " 0.01787204680117003,\n", - " 0.2374586114652866,\n", - " 2.3807084677116923,\n", - " 1.0089485737143427,\n", - " 0.25245598639966,\n", - " 0.6120180504512612,\n", - " 0.2735772894322358,\n", - " 0.020121653041326033,\n", - " 0.020121653041326033,\n", - " 0.27120270506762667,\n", - " 0.2759518737968449,\n", - " 0.07361229030725767,\n", - " 0.017747068676716916,\n", - " 0.3040719517987949,\n", - " 0.27420218005450137,\n", - " 0.02062156553913848,\n", - " 0.2602046301157529,\n", - " 0.017497112427810695,\n", - " 0.01787204680117003,\n", - " 0.23895834895872395,\n", - " 0.017497112427810695,\n", - " 0.2562053301332533,\n", - " 0.251331183279582,\n", - " 0.017497112427810695,\n", - " 0.24883162079051974,\n", - " 0.01787204680117003,\n", - " 0.24033310832770818,\n", - " 0.017747068676716916,\n", - " 2.4753169079226978,\n", - " 1.0534407860196502,\n", - " 0.17047033675841894,\n", - " 0.43554893872346806,\n", - " 0.01787204680117003,\n", - " 0.24445738643466086,\n", - " 0.6363887847196179,\n", - " 0.2635790394759869,\n", - " 0.2779515237880947,\n", - " 0.01787204680117003,\n", - " 0.017747068676716916,\n", - " 0.31107072676816916,\n", - " 0.022121303032575812,\n", - " 0.2762018300457511,\n", - " 0.017497112427810695,\n", - " 0.28520025500637514,\n", - " 0.01787204680117003,\n", - " 0.24133293332333305,\n", - " 0.2638289957248931,\n", - " 0.07348731218280456,\n", - " 0.25358078951973795,\n", - " 0.017497112427810695,\n", - " 0.25358078951973795,\n", - " 0.01787204680117003,\n", - " 0.2514561614040351,\n", - " 0.017497112427810695,\n", - " 0.017747068676716916,\n", - " 0.24095799894997372,\n", - " 1.0896844421110525,\n", - " 2.5670508512712815,\n", - " 0.4529208980224505,\n", - " 0.17809400235005873,\n", - " 0.24583214580364507,\n", - " 0.01787204680117003,\n", - " 0.316444786119653,\n", - " 0.11972921823045575,\n", - " 0.022621215530388258,\n", - " 0.017747068676716916,\n", - " 0.2847003425085627,\n", - " 0.24070804270106752,\n", - " 0.017497112427810695,\n", - " 0.2866999924998125,\n", - " 0.268203230080752,\n", - " 0.01787204680117003,\n", - " 0.25645528638215953,\n", - " 0.017747068676716916,\n", - " 0.2560803520088002,\n", - " 0.01787204680117003,\n", - " 0.2538307457686442,\n", - " 0.01787204680117003,\n", - " 0.01787204680117003,\n", - " 0.2418328458211455,\n", - " 0.017747068676716916,\n", - " 0.24645703642591063,\n", - " 0.2437075176879422,\n", - " 0.017747068676716916,\n", - " 0.017747068676716916,\n", - " 0.28757483937098427,\n", - " 0.28082602065051626,\n", - " 0.017497112427810695,\n", - " 0.25857991449786244,\n", - " 0.01787204680117003,\n", - " 0.01787204680117003,\n", - " 0.25583039575989397,\n", - " 0.01787204680117003,\n", - " 0.24033310832770818,\n", - " 0.2589548488712218,\n", - " 0.06986294657366433,\n", - " 0.017747068676716916,\n", - " 0.2438324958123953,\n", - " 0.017747068676716916,\n", - " 0.24770681767044175,\n", - " 0.01787204680117003,\n", - " 0.26107947698692463,\n", - " 0.01787204680117003,\n", - " 0.2570801770044251,\n", - " 0.017747068676716916,\n", - " 0.2427076926923173,\n", - " 0.23820848021200527,\n", - " 0.01787204680117003,\n", - " 0.26420393009825244,\n", - " 0.01787204680117003,\n", - " 0.01787204680117003,\n", - " 0.25195607390184754,\n", - " 0.2605795644891122,\n", - " 0.01787204680117003,\n", - " 0.017747068676716916,\n", - " 0.24133293332333305,\n", - " 0.01787204680117003,\n", - " 0.24795677391934798,\n", - " 0.2667034925873147,\n", - " 0.017747068676716916,\n", - " 0.017747068676716916,\n", - " 0.2657036675916898,\n", - " 0.017747068676716916,\n", - " 0.24458236455911395,\n", - " 0.2507062926573164,\n", - " 0.01787204680117003,\n", - " 0.017747068676716916,\n", - " 0.24258271456786418,\n", - " 0.2694530113252831,\n", - " 0.01787204680117003,\n", - " 0.2658286457161429,\n", - " 0.017747068676716916,\n", - " 0.017747068676716916,\n", - " 0.25020638015950397,\n", - " 0.2507062926573164,\n", - " 0.017747068676716916,\n", - " 0.017747068676716916,\n", - " 0.2540807020175504,\n", - " 0.001,\n", - " 5.0,\n", - " 0.001,\n", - " 5.0,\n", - " 4.877021525538138,\n", - " 5.0,\n", - " 2.1662460061501534,\n", - " 5.0,\n", - " 1.4297499187479685,\n", - " 5.0,\n", - " 5.0,\n", - " 2.2703527838195954,\n", - " 1.3321420035500886,\n", - " 5.0,\n", - " 5.0,\n", - " 1.7638164454111351,\n", - " 2.974354558863971,\n", - " 5.0,\n", - " 5.0,\n", - " 1.722448686217155,\n", - " 0.9652062301557538,\n", - " 5.0,\n", - " 5.0,\n", - " 0.8972181304532613,\n", - " 1.1545480887022173,\n", - " 5.0,\n", - " 1.457245106127653,\n", - " 5.0,\n", - " 5.0,\n", - " 1.129427485687142,\n", - " 5.0,\n", - " 1.4883646591164776,\n", - " 2.5704252606315157,\n", - " 5.0,\n", - " 0.46891809795244876,\n", - " 5.0,\n", - " 0.6910042251056275,\n", - " 5.0,\n", - " 1.0391932798319956,\n", - " 5.0,\n", - " 0.9797036925923147,\n", - " 5.0,\n", - " 5.0,\n", - " 1.30127240681017,\n", - " 1.203539513487837,\n", - " 5.0,\n", - " 2.6321644541113525,\n", - " 5.0,\n", - " 0.012997899947498687,\n", - " 5.0,\n", - " 5.0,\n", - " 0.011623140578514463,\n", - " 5.0,\n", - " 0.9133403085077126,\n", - " 0.8898444211105276,\n", - " 5.0,\n", - " 5.0,\n", - " 1.1829181229530736,\n", - " 0.36156188904722614,\n", - " 5.0,\n", - " 5.0,\n", - " 2.0260205505137625,\n", - " 0.05036635915897897,\n", - " 5.0,\n", - " 0.8019847996199905,\n", - " 5.0,\n", - " 5.0,\n", - " 0.8574750868771719,\n", - " 5.0,\n", - " 0.8401031275781894,\n", - " 1.3435150128753217,\n", - " 5.0,\n", - " 5.0,\n", - " 0.9693305082627065,\n", - " 1.0988078451961296,\n", - " 5.0],\n", - " [5.0,\n", - " 0.7999851496287407,\n", - " 0.7869874246856171,\n", - " 5.0,\n", - " 5.0,\n", - " 0.7371211530288256,\n", - " 5.0,\n", - " 1.8418027950698765,\n", - " 5.0,\n", - " 1.2514061351533787,\n", - " 5.0,\n", - " 0.9722050051251281,\n", - " 0.7508687467186679,\n", - " 5.0,\n", - " 0.7558678716967924,\n", - " 5.0,\n", - " 1.0209464736618414,\n", - " 5.0,\n", - " 1.1780439760994024,\n", - " 5.0,\n", - " 5.0,\n", - " 5.0,\n", - " 0.036493787344683615,\n", - " 0.13210205255131377,\n", - " 0.7047518187954699,\n", - " 5.0,\n", - " 5.0,\n", - " 0.7105008125203129,\n", - " 5.0,\n", - " 1.9642813570339255,\n", - " 5.0,\n", - " 0.1687206430160754,\n", - " 0.8729723743093577,\n", - " 5.0,\n", - " 5.0,\n", - " 0.6618843221080527,\n", - " 0.6606345408635216,\n", - " 5.0,\n", - " 0.9582074551863796,\n", - " 5.0,\n", - " 5.0,\n", - " 0.05986469661741543,\n", - " 1.5391057776444408,\n", - " 5.0,\n", - " 1.037443586089652,\n", - " 5.0,\n", - " 0.7844878621965549,\n", - " 5.0,\n", - " 0.6265155128878221,\n", - " 5.0,\n", - " 0.626390534763369,\n", - " 5.0,\n", - " 5.0,\n", - " 0.893593764844121,\n", - " 5.0,\n", - " 0.5480292507312683,\n", - " 5.0,\n", - " 1.4536207405185126,\n", - " 0.8799711492787319,\n", - " 5.0,\n", - " 5.0,\n", - " 0.7618668216705416,\n", - " 5.0,\n", - " 0.06886312157803945,\n", - " 5.0,\n", - " 0.8417278431960799,\n", - " 0.5477792944823621,\n", - " 5.0,\n", - " 1.3385158878971972,\n", - " 5.0,\n", - " 0.8309797244931123,\n", - " 5.0,\n", - " 0.6677582939573489,\n", - " 5.0,\n", - " 0.5596522163054076,\n", - " 5.0,\n", - " 0.5645263631590789,\n", - " 5.0,\n", - " 5.0,\n", - " 0.4339242231055776,\n", - " 0.7886121403035076,\n", - " 5.0,\n", - " 5.0,\n", - " 0.7202491062276556,\n", - " 1.2704028100702516,\n", - " 5.0,\n", - " 0.6721325283132078,\n", - " 5.0,\n", - " 0.7766142403560088,\n", - " 5.0,\n", - " 0.011123228080702017,\n", - " 5.0,\n", - " 0.41142816070401755,\n", - " 5.0,\n", - " 5.0,\n", - " 0.6777565439135977,\n", - " 0.011873096827420684,\n", - " 5.0,\n", - " 5.0,\n", - " 1.2062890322258055,\n", - " 0.011873096827420684,\n", - " 5.0,\n", - " 5.0,\n", - " 0.561151953798845,\n", - " 0.49278891972299305,\n", - " 5.0,\n", - " 0.5227836695917397,\n", - " 5.0,\n", - " 0.6323894847371184,\n", - " 5.0,\n", - " 5.0,\n", - " 0.39018187954698863,\n", - " 5.0,\n", - " 0.011623140578514463,\n", - " 0.6085186629665741,\n", - " 5.0,\n", - " 5.0,\n", - " 0.6177670441761044,\n", - " 5.0,\n", - " 0.4015548888722218,\n", - " 0.731872071801795,\n", - " 5.0,\n", - " 5.0,\n", - " 1.1460495762394058,\n", - " 0.5292825320633016,\n", - " 5.0,\n", - " 0.6657586439660991,\n", - " 5.0,\n", - " 5.0,\n", - " 0.6000201505037626,\n", - " 0.013997724943123579,\n", - " 5.0,\n", - " 5.0,\n", - " 0.45192107302682566,\n", - " 0.47941626040651014,\n", - " 5.0,\n", - " 0.387182404560114,\n", - " 5.0,\n", - " 4.625565539138479,\n", - " 5.0,\n", - " 1.293273806845171,\n", - " 5.0,\n", - " 5.0,\n", - " 0.011873096827420684,\n", - " 5.0,\n", - " 0.47654176354408856,\n", - " 5.0,\n", - " 0.43729863246581163,\n", - " 0.6223912347808694,\n", - " 5.0,\n", - " 0.45829495737393433,\n", - " 5.0,\n", - " 5.0,\n", - " 0.36931053276331904,\n", - " 5.0,\n", - " 5.0,\n", - " 1.2457821195529886,\n", - " 5.0,\n", - " 5.0,\n", - " 0.5052867321683042,\n", - " 1.2015398634965873,\n", - " 5.0,\n", - " 5.0,\n", - " 0.5697754443861096,\n", - " 5.0,\n", - " 0.6135177879446986,\n", - " 5.0,\n", - " 0.6020198004950124,\n", - " 0.42230125753143827,\n", - " 5.0,\n", - " 0.44292264806620163,\n", - " 5.0,\n", - " 0.3743096577414435,\n", - " 5.0,\n", - " 3.4978879221980548,\n", - " 5.0,\n", - " 1.2645288382209554,\n", - " 5.0,\n", - " 0.64651201280032,\n", - " 5.0,\n", - " 5.0,\n", - " 0.5788988474711867,\n", - " 0.5910217255431386,\n", - " 5.0,\n", - " 0.4981629790744768,\n", - " 5.0,\n", - " 5.0,\n", - " 1.0720625265631638,\n", - " 5.0,\n", - " 0.4824157353933848,\n", - " 0.4944136353408835,\n", - " 5.0,\n", - " 0.4244258856471411,\n", - " 5.0,\n", - " 5.0,\n", - " 0.42755033875846893,\n", - " 5.0,\n", - " 0.5607770194254856,\n", - " 0.36718590464761613,\n", - " 5.0,\n", - " 4.428475036875922,\n", - " 5.0,\n", - " 0.8844703617590439,\n", - " 5.0,\n", - " 0.5885221630540763,\n", - " 5.0,\n", - " 5.0,\n", - " 0.5661510787769694,\n", - " 0.5515286382159553,\n", - " 5.0,\n", - " 0.5504038350958773,\n", - " 5.0,\n", - " 0.4004300857521438,\n", - " 5.0,\n", - " 5.0,\n", - " 0.40555418885472133,\n", - " 0.9642064051601289,\n", - " 5.0,\n", - " 0.46091949798744963,\n", - " 5.0,\n", - " 5.0,\n", - " 0.37056031400785017,\n", - " 5.0,\n", - " 3.9209388734718362,\n", - " 0.5356564164104102,\n", - " 5.0,\n", - " 1.193541263531588,\n", - " 5.0,\n", - " 0.9509587239680991,\n", - " 5.0,\n", - " 0.8303548338708467,\n", - " 5.0,\n", - " 5.0,\n", - " 0.5758993724843121,\n", - " 5.0,\n", - " 0.5591523038075952,\n", - " 0.5221587789694742,\n", - " 5.0,\n", - " 5.0,\n", - " 0.5970206755168879,\n", - " 5.0,\n", - " 0.5114106602665066,\n", - " 0.3861825795644891,\n", - " 5.0,\n", - " 0.40655401385034623,\n", - " 5.0,\n", - " 5.0,\n", - " 0.9344616115402884,\n", - " 0.4464220355508887,\n", - " 5.0,\n", - " 0.3470644266106652,\n", - " 5.0,\n", - " 5.0,\n", - " 0.5091610540263506,\n", - " 5.0,\n", - " 3.896068226705667,\n", - " 1.012822895572389,\n", - " 5.0,\n", - " 5.0,\n", - " 0.5230336258406459,\n", - " 0.5099109227730693,\n", - " 5.0,\n", - " 5.0,\n", - " 0.5139102227555689,\n", - " 0.5004125853146328,\n", - " 5.0,\n", - " 4.674931898297458,\n", - " 0.4951635040876021,\n", - " 5.0,\n", - " 0.3794337608440211,\n", - " 0.9802036050901272,\n", - " 5.0,\n", - " 5.0,\n", - " 0.4317995949898747,\n", - " 5.0,\n", - " 0.3741846796169904,\n", - " 0.7243733843346083,\n", - " 5.0,\n", - " 5.0,\n", - " 0.46104447611190275,\n", - " 5.0,\n", - " 0.353563289082227,\n", - " 3.646486912172804,\n", - " 5.0,\n", - " 1.4122529813245328,\n", - " 5.0,\n", - " 5.0,\n", - " 0.2395832395809895,\n", - " 0.5377810445261131,\n", - " 5.0,\n", - " 0.7654911872796819,\n", - " 5.0,\n", - " 5.0,\n", - " 0.5226586914672866,\n", - " 5.0,\n", - " 0.4704178354458861,\n", - " 0.5189093477336933,\n", - " 4.646061951548789,\n", - " 5.0,\n", - " 0.8422277556938923,\n", - " 0.42017662941573536,\n", - " 5.0,\n", - " 0.484915297882447],\n", - " [5.0,\n", - " 0.7451197529938248,\n", - " 4.256130203255081,\n", - " 5.0,\n", - " 0.46891809795244876,\n", - " 3.9634314357858944,\n", - " 0.4449222980574514,\n", - " 0.37018537963449083,\n", - " 3.5057615440386005,\n", - " 0.38105847646191154,\n", - " 3.5177594439860993,\n", - " 0.5755244381109528,\n", - " 5.0,\n", - " 0.3480642516062901,\n", - " 5.0,\n", - " 5.0,\n", - " 0.4731673541838546,\n", - " 5.0,\n", - " 0.4734173104327608,\n", - " 5.0,\n", - " 0.855350458761469,\n", - " 5.0,\n", - " 1.145174729368234,\n", - " 5.0,\n", - " 0.013997724943123579,\n", - " 5.0,\n", - " 0.4095534888372209,\n", - " 0.8144826120653016,\n", - " 5.0,\n", - " 5.0,\n", - " 0.8058591214780368,\n", - " 0.18396797419935498,\n", - " 0.41042833570839266,\n", - " 5.0,\n", - " 5.0,\n", - " 0.5147850696267406,\n", - " 5.0,\n", - " 0.4827906697667441,\n", - " 4.072287382184554,\n", - " 5.0,\n", - " 0.5009124978124453,\n", - " 3.727847671191779,\n", - " 0.46629355733893346,\n", - " 5.0,\n", - " 0.46766831670791764,\n", - " 5.0,\n", - " 0.4591698042451061,\n", - " 0.4801661291532288,\n", - " 3.4687680192004797,\n", - " 2.7706402160054,\n", - " 0.36756083902097547,\n", - " 5.0,\n", - " 0.7676158153953848,\n", - " 5.0,\n", - " 0.39343131078276955,\n", - " 0.3670609265231631,\n", - " 2.741395334883372,\n", - " 5.0,\n", - " 0.6576350658766469,\n", - " 5.0,\n", - " 0.4041794294857371,\n", - " 0.3088211205280132,\n", - " 5.0,\n", - " 3.1754443611090273,\n", - " 5.0,\n", - " 5.0,\n", - " 1.1124304607615187,\n", - " 0.5322820070501763,\n", - " 5.0,\n", - " 5.0,\n", - " 0.48191582289557233,\n", - " 0.7786138903472586,\n", - " 5.0,\n", - " 5.0,\n", - " 0.44979644491112275,\n", - " 0.1700954023850596,\n", - " 5.0,\n", - " 5.0,\n", - " 0.5034120603015075,\n", - " 0.3156949173729343,\n", - " 5.0,\n", - " 0.4445473636840921,\n", - " 5.0,\n", - " 0.2494565114127853,\n", - " 5.0,\n", - " 5.0,\n", - " 0.6811309532738318,\n", - " 5.0,\n", - " 0.39805550138753465,\n", - " 5.0,\n", - " 0.4654187104677617,\n", - " 0.6170171754293857,\n", - " 3.617117052926323,\n", - " 5.0,\n", - " 0.3919315732893322,\n", - " 3.310795669891747,\n", - " 0.4492965324133103,\n", - " 3.0808359208980223,\n", - " 0.44779679491987295,\n", - " 0.501662366559164,\n", - " 5.0,\n", - " 0.35693769844246104,\n", - " 2.37820890522263,\n", - " 0.4626691917297932,\n", - " 5.0,\n", - " 0.36268669216730415,\n", - " 2.3469643741093527,\n", - " 0.4504213355333883,\n", - " 5.0,\n", - " 2.7513935848396205,\n", - " 0.33606635165879145,\n", - " 0.46116945423635586,\n", - " 5.0,\n", - " 5.0,\n", - " 2.822381159528988,\n", - " 5.0,\n", - " 0.6668834470861771,\n", - " 5.0,\n", - " 1.0439424485612139,\n", - " 5.0,\n", - " 0.3746845921148028,\n", - " 0.5986453911347783,\n", - " 5.0,\n", - " 0.39155663891597287,\n", - " 5.0,\n", - " 5.0,\n", - " 0.6837554938873471,\n", - " 0.5636515162879071,\n", - " 5.0,\n", - " 4.365486062151554,\n", - " 0.4791663041576039,\n", - " 0.44779679491987295,\n", - " 4.174894422360559,\n", - " 0.4436725168129203,\n", - " 3.2353088827220677,\n", - " 3.8986927673191825,\n", - " 0.4415478886972174,\n", - " 0.4406730418260456,\n", - " 1.7799386234655863,\n", - " 5.0,\n", - " 2.9624816370409257,\n", - " 5.0,\n", - " 1.0444423610590263,\n", - " 3.777214030350758,\n", - " 0.41805200130003245,\n", - " 2.7575175129378233,\n", - " 0.4224262356558914,\n", - " 0.21596237405935148,\n", - " 5.0,\n", - " 2.1018822720568013,\n", - " 0.35031385784644614,\n", - " 0.35593787344683614,\n", - " 0.6625092127303182,\n", - " 2.0710126753168825,\n", - " 5.0,\n", - " 5.0,\n", - " 0.35993717342933573,\n", - " 5.0,\n", - " 0.5542781569539238,\n", - " 2.1653711592789815,\n", - " 0.3729348983724593,\n", - " 3.572124928123203,\n", - " 0.3190693267331683,\n", - " 0.6682582064551613,\n", - " 5.0,\n", - " 0.8819707992699817,\n", - " 5.0,\n", - " 0.6021447786194655,\n", - " 5.0,\n", - " 0.46304412610315254,\n", - " 0.14409995249881247,\n", - " 4.790286707167679,\n", - " 3.688229605740143,\n", - " 3.515134903372584,\n", - " 0.4320495512387809,\n", - " 3.255805295132378,\n", - " 0.42655051376284403,\n", - " 0.42892509812745316,\n", - " 2.904741743543588,\n", - " 5.0,\n", - " 1.6787063426585662,\n", - " 2.660784444611115,\n", - " 0.4215513887847196,\n", - " 5.0,\n", - " 0.8925939398484961,\n", - " 3.1384508362709065,\n", - " 0.40592912322808067,\n", - " 2.477691492287307,\n", - " 0.41017837945948643,\n", - " 5.0,\n", - " 0.3465645141128528,\n", - " 0.20034010850271255,\n", - " 1.8829205980149502,\n", - " 0.34743936098402456,\n", - " 0.6011449536238406,\n", - " 1.8543006075151875,\n", - " 5.0,\n", - " 0.35931228280707017,\n", - " 4.12352841321033,\n", - " 0.30257221430535763,\n", - " 1.8730473261831544,\n", - " 4.71517485437136,\n", - " 0.5400306507662691,\n", - " 2.5936711917797943,\n", - " 0.3744346358658966,\n", - " 5.0,\n", - " 2.9093659341483535,\n", - " 5.0,\n", - " 0.9532083302082551,\n", - " 5.0,\n", - " 0.1588473711842796,\n", - " 4.29262381559539,\n", - " 0.5049117977949449,\n", - " 3.226935348383709,\n", - " 0.44429740743518586,\n", - " 0.4033045826145653,\n", - " 2.6099183479586987,\n", - " 0.4173021325533138,\n", - " 2.3933312582814565,\n", - " 3.0700878021950544,\n", - " 0.39993017325433133,\n", - " 0.39055681392034797,\n", - " 2.230859696492412,\n", - " 1.699952623815595,\n", - " 0.33806600165004125,\n", - " 2.8373785344633613,\n", - " 0.4030546263656591,\n", - " 0.3410654766369159,\n", - " 1.6743321083027074,\n", - " 5.0,\n", - " 1.5462295307382683,\n", - " 0.3040719517987949,\n", - " 1.6649587489687239,\n", - " 0.9233385584639615,\n", - " 5.0,\n", - " 2.7298973474336856,\n", - " 0.3940562014050351,\n", - " 5.0,\n", - " 1.7654411610290255,\n", - " 5.0,\n", - " 5.0,\n", - " 0.7346215905397634,\n", - " 0.5112856821420535,\n", - " 0.5207840196004899,\n", - " 4.959757043926098,\n", - " 4.624190779769494,\n", - " 0.5720250506262656,\n", - " 2.661909247731193,\n", - " 0.34056556413910344,\n", - " 0.4541706792669816,\n", - " 3.8403279831995794,\n", - " 4.18776716917923,\n", - " 0.4990378259456486,\n", - " 2.5143100827520684,\n", - " 0.37505952648816215,\n", - " 0.39355628890722266,\n", - " 2.344214855371384,\n", - " 2.1524984124603113,\n", - " 0.38268319207980195,\n", - " 2.0080237005925143,\n", - " 0.380433585839646,\n", - " 0.33206705167629186,\n", - " 1.5427301432535812,\n", - " 1.5196091902297555,\n", - " 0.33194207355183875,\n", - " 0.3066964924123103,\n", - " 1.5071113777844445,\n", - " 0.4100534013350333,\n", - " 2.8654986124653115,\n", - " 5.0,\n", - " 2.237733493337333,\n", - " 0.7377460436510912,\n", - " 5.0,\n", - " 0.40780379509487735,\n", - " 2.725773069326733,\n", - " 4.1212788069701745,\n", - " 0.5454047101177529,\n", - " 3.424400785019625,\n", - " 2.5178094702367555,\n", - " 0.3890570764269106,\n", - " 0.46866814170354254,\n", - " 5.0,\n", - " 1.4519960249006223,\n", - " 5.0,\n", - " 0.8987178679466986,\n", - " 0.38768231705792644,\n", - " 2.1018822720568013,\n", - " 2.4213263581589537,\n", - " 0.38030860771519287,\n", - " 0.36943551088777216,\n", - " 1.9330368259206478,\n", - " 0.36693594839870997,\n", - " 0.17072029300732516,\n", - " 5.0,\n", - " 1.8058090952273804,\n", - " 0.3270679266981674,\n", - " 1.4021297532438308,\n", - " 4.432474336858421,\n", - " 0.5151600040001,\n", - " 0.32619307982699564,\n", - " 1.3841329033225829,\n", - " 2.230859696492412,\n", - " 0.34493979849496237],\n", - " [1.3707602440061,\n", - " 0.30294714867871697,\n", - " 0.4865400135003375,\n", - " 3.7438448711217776,\n", - " 1.542605165129128,\n", - " 5.0,\n", - " 2.2264854621365533,\n", - " 0.36818572964324103,\n", - " 4.96788062201555,\n", - " 0.5529033975849396,\n", - " 0.4734173104327608,\n", - " 3.654235555888897,\n", - " 0.36756083902097547,\n", - " 3.039343183579589,\n", - " 0.36593612340308507,\n", - " 0.3968057201430035,\n", - " 2.5638014200355004,\n", - " 1.8785463636590911,\n", - " 0.3610619765494137,\n", - " 1.731197154928873,\n", - " 2.4413228580714517,\n", - " 0.39243148578714465,\n", - " 1.6199666241656039,\n", - " 0.3556879171979299,\n", - " 1.2781514537863445,\n", - " 0.32056906422660564,\n", - " 2.251106152653816,\n", - " 1.2615293632340807,\n", - " 0.3755594389859746,\n", - " 0.32069404235105875,\n", - " 5.0,\n", - " 1.3445148378709466,\n", - " 1.2522809820245504,\n", - " 0.3059466236655916,\n", - " 5.0,\n", - " 0.7563677841946048,\n", - " 5.0,\n", - " 0.3765592639815995,\n", - " 0.4026796919922998,\n", - " 2.169370459261481,\n", - " 0.45329583239580984,\n", - " 4.368360559013976,\n", - " 0.45854491362284056,\n", - " 5.0,\n", - " 3.9718049701242526,\n", - " 3.217686967174179,\n", - " 0.517409610240256,\n", - " 1.9542831070776767,\n", - " 0.44579714492862316,\n", - " 0.3386908922723068,\n", - " 0.45954473861846545,\n", - " 3.357037575939398,\n", - " 2.680905922648066,\n", - " 0.40117995449886246,\n", - " 1.995275931898297,\n", - " 0.35818747968699216,\n", - " 1.6709576989424733,\n", - " 0.3528134203355084,\n", - " 1.544854771369284,\n", - " 0.34756433910847767,\n", - " 0.3850577764444111,\n", - " 2.307221330533263,\n", - " 0.3440649516237906,\n", - " 1.4487465936648414,\n", - " 0.315319982999575,\n", - " 1.1644213605340132,\n", - " 0.37993367334183353,\n", - " 2.1963657341433533,\n", - " 0.31519500487512186,\n", - " 1.1505487887197179,\n", - " 2.0322694567364183,\n", - " 0.36718590464761613,\n", - " 0.3099459236480912,\n", - " 1.1481742043551086,\n", - " 5.0,\n", - " 1.2404080602015048,\n", - " 0.35293839845996144,\n", - " 5.0,\n", - " 5.0,\n", - " 0.7177495437385935,\n", - " 0.36356153903847593,\n", - " 1.9554079101977546,\n", - " 0.5097859446486162,\n", - " 3.803834370859271,\n", - " 4.669057926448161,\n", - " 0.4656686667166679,\n", - " 3.561001875046876,\n", - " 0.39430615765394134,\n", - " 0.4606695417385434,\n", - " 0.33206705167629186,\n", - " 1.7453196829920745,\n", - " 2.8072588064701613,\n", - " 3.0129727993199826,\n", - " 0.44504727618190454,\n", - " 2.342965074126853,\n", - " 0.3601871296782419,\n", - " 0.3509387484687117,\n", - " 1.8014348608715216,\n", - " 0.3444398859971499,\n", - " 1.4788663216580413,\n", - " 0.33719115477886946,\n", - " 1.3703853096327405,\n", - " 0.38118345458636466,\n", - " 2.07813642841071,\n", - " 1.2890245506137652,\n", - " 0.3334418110452761,\n", - " 1.062189254731368,\n", - " 0.3116956173904347,\n", - " 0.3629366484162104,\n", - " 1.9811534038350955,\n", - " 0.3114456611415285,\n", - " 1.0495664641616038,\n", - " 1.8336792169804244,\n", - " 0.35906232655816395,\n", - " 1.1258031200780017,\n", - " 5.0,\n", - " 1.0546905672641813,\n", - " 0.29007440186004646,\n", - " 5.0,\n", - " 0.6765067626690666,\n", - " 1.2460320758018948,\n", - " 0.35618782969574236,\n", - " 5.0,\n", - " 1.768190679766994,\n", - " 0.10860616515412884,\n", - " 3.2699278231955797,\n", - " 4.175644291107278,\n", - " 0.2961983299582489,\n", - " 0.44204780119502984,\n", - " 3.188442086052151,\n", - " 2.4198266206655163,\n", - " 0.3255681892047301,\n", - " 0.388307207680192,\n", - " 1.581848296207405,\n", - " 2.701027400685017,\n", - " 0.35993717342933573,\n", - " 0.4274253606340158,\n", - " 2.0235209880247003,\n", - " 1.6310896772419308,\n", - " 0.3443149078726968,\n", - " 1.2993977349433734,\n", - " 0.32931753293832344,\n", - " 1.2086636165904145,\n", - " 0.32644303607590186,\n", - " 5.0,\n", - " 1.873797194929873,\n", - " 1.3081462036550913,\n", - " 0.36356153903847593,\n", - " 1.1403005825145627,\n", - " 0.32394347358683967,\n", - " 1.7881871796794917,\n", - " 0.30657151428785717,\n", - " 0.35918730468261706,\n", - " 0.9669559238980974,\n", - " 0.35293839845996144,\n", - " 1.6608344708617713,\n", - " 0.3056966674166854,\n", - " 5.0,\n", - " 1.0285701392534812,\n", - " 0.9565827395684892,\n", - " 0.6418878221955548,\n", - " 4.690679141978549,\n", - " 0.347939273481837,\n", - " 1.6012199054976373,\n", - " 0.28907457686442156,\n", - " 0.9707052676316907,\n", - " 0.25783004575114377,\n", - " 3.723223480587014,\n", - " 5.0,\n", - " 0.4304248356208905,\n", - " 0.4461720793019825,\n", - " 2.761891747293682,\n", - " 2.846876871921798,\n", - " 0.4239259731493287,\n", - " 1.438123453086327,\n", - " 0.322068801720043,\n", - " 2.4158273206830168,\n", - " 0.39343131078276955,\n", - " 1.4814908622715566,\n", - " 0.33806600165004125,\n", - " 2.0530158253956348,\n", - " 0.36743586089652236,\n", - " 0.34356503912597813,\n", - " 1.7248232705817643,\n", - " 0.3576875671891797,\n", - " 1.6882046801170028,\n", - " 0.3498139453486337,\n", - " 1.6130928273206828,\n", - " 0.3183194579864496,\n", - " 1.1310522013050324,\n", - " 0.337816045401135,\n", - " 0.31769456736418406,\n", - " 1.5019872746818668,\n", - " 1.0573151078776968,\n", - " 5.0,\n", - " 5.0,\n", - " 1.1090560514012848,\n", - " 0.7494939873496836,\n", - " 0.6101433785844645,\n", - " 1.0019497987449684,\n", - " 4.158022375559389,\n", - " 1.4506212655316382,\n", - " 0.3155699392484812,\n", - " 0.3401906297657441,\n", - " 0.3024472361809045,\n", - " 0.8799711492787319,\n", - " 0.3926814420360509,\n", - " 3.302922048051201,\n", - " 0.8702228555713892,\n", - " 0.30082252056301406,\n", - " 0.4054292107302682,\n", - " 2.5304322608065197,\n", - " 0.3134453111327783,\n", - " 1.3075213130328256,\n", - " 0.8944686117152928,\n", - " 0.28632505812645315,\n", - " 0.38355803895097373,\n", - " 2.1523734343358583,\n", - " 0.5662760569014225,\n", - " 1.3463895097377432,\n", - " 0.3309422485562139,\n", - " 5.0,\n", - " 2.279101252531313,\n", - " 0.4150525263131578,\n", - " 1.5181094527363181,\n", - " 0.3459396234905872,\n", - " 0.34581464536613415,\n", - " 1.7067014425360632,\n", - " 1.4529958498962472,\n", - " 0.33219202980074497,\n", - " 0.3409404985124628,\n", - " 1.443997424935623,\n", - " 1.3571376284407108,\n", - " 0.33956573914347854,\n", - " 0.8529758743968598,\n", - " 5.0,\n", - " 3.6584848121203026,\n", - " 0.542155278881972,\n", - " 1.31252043801095,\n", - " 0.33206705167629186,\n", - " 0.9737047426185654,\n", - " 0.31307037675941896,\n", - " 2.910240781019525,\n", - " 0.30944601115027875,\n", - " 0.4054292107302682,\n", - " 0.9157148928723218,\n", - " 5.0,\n", - " 0.1930913772844321,\n", - " 2.2356088652216304,\n", - " 0.39118170454261353,\n", - " 0.3844328858221455,\n", - " 0.30832120803020074,\n", - " 1.1956658916472909,\n", - " 2.047391809795245,\n", - " 1.9077912447811192,\n", - " 0.30657151428785717,\n", - " 0.3690605765144128,\n", - " 0.8719725493137328,\n", - " 1.2235360134003348,\n", - " 0.7979854996374909,\n", - " 0.3246933423335583,\n", - " 0.29769806745168625,\n", - " 0.7918615715392884,\n", - " 0.2971981549538738,\n", - " 0.2858251456286407,\n", - " 0.8243558838970974,\n", - " 1.360761994049851,\n", - " 0.334441636040901,\n", - " 0.7278727718192954,\n", - " 4.98150323758094,\n", - " 0.33144216105402635,\n", - " 1.3053966849171228,\n", - " 0.3754344608615215,\n", - " 1.2235360134003348,\n", - " 1.8229310982774567,\n", - " 0.3326919422985574,\n", - " 5.0,\n", - " 0.7618668216705416,\n", - " 3.188317107927698,\n", - " 1.382258231455786,\n", - " 0.48891459786494657,\n", - " 0.3256931673291832,\n", - " 1.1861675541888546,\n", - " 0.32944251106277656,\n", - " 0.4121780294507362,\n", - " 0.3166947423685592,\n", - " 2.5414303357583936,\n", - " 1.1806685167129176,\n", - " 0.3611869546738668,\n", - " 1.9601570789269729,\n", - " 1.0973081077026923,\n", - " 0.30419692992324804,\n", - " 0.35243848596214905,\n", - " 1.6793312332808317,\n", - " 0.3056966674166854,\n", - " 1.1106807670191752,\n", - " 0.31744461111527783,\n", - " 0.8277302932573314,\n", - " 0.7838629715742893,\n", - " 0.30057256431410784,\n", - " 4.33361664041601,\n", - " 0.5955209380234505,\n", - " 0.36368651716292905],\n", - " [1.2152874571864294,\n", - " 1.605594139853496,\n", - " 0.32544321108027696,\n", - " 0.7518685717142928,\n", - " 0.2994477611940298,\n", - " 0.2933238330958274,\n", - " 0.32381849546238656,\n", - " 0.7202491062276556,\n", - " 1.1690455511387783,\n", - " 0.2935737893447336,\n", - " 0.3193192829820745,\n", - " 1.100182604565114,\n", - " 0.717249631240781,\n", - " 0.6907542688567213,\n", - " 4.333116727918198,\n", - " 0.7623667341683541,\n", - " 0.45667024175604387,\n", - " 0.2857001675041876,\n", - " 2.744019875496887,\n", - " 1.0691880297007423,\n", - " 3.6966031400785018,\n", - " 0.3180695017375434,\n", - " 0.6051442536063402,\n", - " 0.3741846796169904,\n", - " 2.1933662591564786,\n", - " 1.3960058251456284,\n", - " 0.35906232655816395,\n", - " 1.7013273831845794,\n", - " 0.3453147328683217,\n", - " 0.30419692992324804,\n", - " 1.0040744268606714,\n", - " 1.4653686842171052,\n", - " 0.3190693267331683,\n", - " 0.337816045401135,\n", - " 1.0068239455986399,\n", - " 1.081060951523788,\n", - " 0.31107072676816916,\n", - " 0.936211305282632,\n", - " 0.31182059551488783,\n", - " 1.080061126528163,\n", - " 0.31482007050176253,\n", - " 0.6911292032300806,\n", - " 0.2960733518337958,\n", - " 0.3163198079951999,\n", - " 1.0414428860721516,\n", - " 0.29307387684692116,\n", - " 0.9853277081927048,\n", - " 0.6606345408635216,\n", - " 0.3143201580039501,\n", - " 0.5045368634215855,\n", - " 3.0713375834395857,\n", - " 3.651860971524288,\n", - " 0.5230336258406459,\n", - " 1.1962907822695565,\n", - " 2.322218705467636,\n", - " 0.3533133328333208,\n", - " 0.4183019575489387,\n", - " 0.31219552988824717,\n", - " 0.29219902997574937,\n", - " 0.9607070176754419,\n", - " 0.6380135003375084,\n", - " 0.2904493362334058,\n", - " 0.3440649516237906,\n", - " 0.6496364659116477,\n", - " 1.8651737043426082,\n", - " 0.2893245331133278,\n", - " 0.6475118377959449,\n", - " 1.4588698217455434,\n", - " 0.33044233605840145,\n", - " 0.9202141053526337,\n", - " 0.692628940723518,\n", - " 0.29682322058051447,\n", - " 0.28157588939723494,\n", - " 0.3269429485737143,\n", - " 0.42092649816245403,\n", - " 1.265278706967674,\n", - " 2.457445036125903,\n", - " 0.9113406585164628,\n", - " 0.30419692992324804,\n", - " 1.007073901847546,\n", - " 0.34756433910847767,\n", - " 0.3088211205280132,\n", - " 0.31519500487512186,\n", - " 0.9537082427060676,\n", - " 0.8038594714867872,\n", - " 0.2944486362159054,\n", - " 0.712750418760469,\n", - " 0.30919605490137253,\n", - " 0.9232135803395084,\n", - " 0.8794712367809194,\n", - " 0.30444688617215426,\n", - " 0.2893245331133278,\n", - " 0.10410695267381684,\n", - " 2.999725118127953,\n", - " 0.5620268006700168,\n", - " 0.5451547538688467,\n", - " 1.9230385759643989,\n", - " 0.36856066401660037,\n", - " 0.2860751018775469,\n", - " 0.8599746493662341,\n", - " 1.855675366884172,\n", - " 0.30619657991449784,\n", - " 0.35906232655816395,\n", - " 0.33494154853871344,\n", - " 0.8277302932573314,\n", - " 1.5557278681967046,\n", - " 0.3404405860146503,\n", - " 1.2311596789919745,\n", - " 0.28520025500637514,\n", - " 0.3200691517287932,\n", - " 0.5326569414235356,\n", - " 0.8428526463161579,\n", - " 0.2933238330958274,\n", - " 0.28719990499762493,\n", - " 1.0771866296657415,\n", - " 0.5826481912047801,\n", - " 0.31394522363059074,\n", - " 0.581523388084702,\n", - " 0.8208564964124102,\n", - " 0.2855751893797345,\n", - " 0.30282217055426386,\n", - " 0.27657676441911044,\n", - " 0.6335142878571964,\n", - " 2.683280507012675,\n", - " 0.31482007050176253,\n", - " 0.46866814170354254,\n", - " 1.2750270006750166,\n", - " 0.3393157828945723,\n", - " 0.8356039150978773,\n", - " 0.3039469736743418,\n", - " 0.6608844971124278,\n", - " 0.3021972799319983,\n", - " 0.8123579839495987,\n", - " 0.3013224330608265,\n", - " 0.3058216455411385,\n", - " 0.7829881247031175,\n", - " 0.5560278506962674,\n", - " 0.296323308082702,\n", - " 0.3968057201430035,\n", - " 2.373584714617865,\n", - " 0.5081612290307257,\n", - " 1.5477292682317056,\n", - " 0.35393822345558634,\n", - " 0.282825670641766,\n", - " 0.7648662966574163,\n", - " 0.44529723243081076,\n", - " 0.3004475861896547,\n", - " 0.2799511737793445,\n", - " 0.4380485012125303,\n", - " 1.2659035975899395,\n", - " 0.3234435610890272,\n", - " 0.2793262831570789,\n", - " 1.018321933048326,\n", - " 0.7402456061401534,\n", - " 0.30744636115902896,\n", - " 0.7697404435110877,\n", - " 0.29007440186004646,\n", - " 0.3375660891522288,\n", - " 0.30344706117652936,\n", - " 0.902467211680292,\n", - " 0.5036620165504138,\n", - " 0.29857291432285804,\n", - " 0.2792013050326258,\n", - " 0.7383709342733568,\n", - " 0.4340492012300307,\n", - " 0.2830756268906722,\n", - " 0.5202841071026775,\n", - " 2.07051276281907,\n", - " 0.28220078001950044,\n", - " 0.36156188904722614,\n", - " 0.5202841071026775,\n", - " 0.2827006925173129,\n", - " 0.5900219005475137,\n", - " 0.285075276881922,\n", - " 0.2993227830695767,\n", - " 0.7253732093302332,\n", - " 0.2647038425960649,\n", - " 0.29644828620715513,\n", - " 0.32931753293832344,\n", - " 0.7092510312757818,\n", - " 0.2943236580914523,\n", - " 0.3526884422110553,\n", - " 0.6900044001100027,\n", - " 0.2958233955848896,\n", - " 0.3306922923073077,\n", - " 1.7741896297407433,\n", - " 0.3308172704317608,\n", - " 1.1982904322608063,\n", - " 0.28232575814395355,\n", - " 0.33956573914347854,\n", - " 0.32069404235105875,\n", - " 0.29594837370934274,\n", - " 0.6767567189179728,\n", - " 0.30744636115902896,\n", - " 0.2762018300457511,\n", - " 0.9970756518912972,\n", - " 0.334441636040901,\n", - " 0.8201066276656915,\n", - " 0.337816045401135,\n", - " 0.29757308932723314,\n", - " 0.2735772894322358,\n", - " 0.7043768844221105,\n", - " 0.28757483937098427,\n", - " 0.7389958248956223,\n", - " 0.018996849921248032,\n", - " 0.2945736143403585,\n", - " 0.2924489862246556,\n", - " 0.6593847596189905,\n", - " 0.2608295207380184,\n", - " 0.30619657991449784,\n", - " 0.324318407960199,\n", - " 1.4862400310007748,\n", - " 0.20433940848521212,\n", - " 0.2734523113077827,\n", - " 0.3424402360059001,\n", - " 0.6228911472786819,\n", - " 0.29219902997574937,\n", - " 0.2733273331833296,\n", - " 0.5406555413885347,\n", - " 0.040118152953823843,\n", - " 0.2905743143578589,\n", - " 0.2639539738493462,\n", - " 0.6118930723268081,\n", - " 0.6023947348683717,\n", - " 0.0153724843121078,\n", - " 0.29094924873121825,\n", - " 0.3224437360934023,\n", - " 1.2084136603415083,\n", - " 0.2866999924998125,\n", - " 0.10435690892272306,\n", - " 0.8787213680342008,\n", - " 0.28832470811770294,\n", - " 0.327692817320433,\n", - " 0.5940212005300132,\n", - " 0.28982444561114024,\n", - " 0.7499938998474961,\n", - " 0.29857291432285804,\n", - " 0.6375135878396959,\n", - " 0.2880747518687967,\n", - " 0.639888172204305,\n", - " 0.28545021125528136,\n", - " 0.28545021125528136,\n", - " 0.588147228680717,\n", - " 0.585897622440561,\n", - " 0.28844968624215606,\n", - " 0.944084927123178,\n", - " 0.272702442561064,\n", - " 0.2876998174954374,\n", - " 0.5265330133253331,\n", - " 0.2847003425085627,\n", - " 0.5216588664716617,\n", - " 0.5180345008625216,\n", - " 0.28857466436660917,\n", - " 0.26432890822270555,\n", - " 0.6967532188304707,\n", - " 0.5925214630365758,\n", - " 0.3180695017375434,\n", - " 0.285075276881922,\n", - " 0.5160348508712718,\n", - " 0.2948235705892647,\n", - " 0.5312821820545514,\n", - " 0.27957623940598514,\n", - " 0.47066779169479234,\n", - " 0.5790238255956398,\n", - " 0.28082602065051626,\n", - " 0.277201655041376,\n", - " 0.4484216855421385,\n", - " 0.516284807120178,\n", - " 0.28532523313082825,\n", - " 0.2549555488887222,\n", - " 0.4711677041926048,\n", - " 0.2827006925173129,\n", - " 0.43567391684792117,\n", - " 0.2683282082052051,\n", - " 0.24870664266606662,\n", - " 0.3115706392659816,\n", - " 0.33594137353433834,\n", - " 0.2803261081527038,\n", - " 0.4427976699417485,\n", - " 0.324318407960199,\n", - " 0.2870749268731718,\n", - " 0.27282742068551713,\n", - " 0.3166947423685592,\n", - " 0.27870139253481335,\n", - " 0.5295324883122078,\n", - " 0.31856941423535584,\n", - " 0.26932803320083,\n", - " 0.451171204280107,\n", - " 0.2803261081527038,\n", - " 0.24495729893247328,\n", - " 0.04224278106952674,\n", - " 0.35143866096652415,\n", - " 0.2769516987924698,\n", - " 0.2752020050501262,\n", - " 0.3563128078201955,\n", - " 0.27657676441911044,\n", - " 0.37018537963449083,\n", - " 0.24133293332333305,\n", - " 0.017747068676716916,\n", - " 0.30294714867871697,\n", - " 0.04586714667866697,\n", - " 0.3741846796169904,\n", - " 0.27582689567239177]]" - ] - }, - "execution_count": 354, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "res" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "np.array_split(list(zip(\n", - " s, \n", - " aapl_chain['Strike'], \n", - " T, \n", - " r, \n", - " aapl_chain['Midpoint'], \n", - " q, \n", - " aapl_chain['Right'].str.lower()\n", - ")), 8)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "np.array_split(ordered_inputs, 8,axis=1)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "\n", - "a = np.array([7, 2, 5, 1, 8, 3])\n", - "k = 3\n", - "parted = np.partition(a, k)\n", - "\n", - "print(parted) # e.g., [2 1 3 5 8 7]\n", - "print(parted[k]) # 4th smallest element (index 3) = 5\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## MISC" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "black_scholes_vectorized_base(\n", - " F=[100, 105, 110],\n", - " K=[100, 100, 100],\n", - " T=[1.0, 1.0, 1.0],\n", - " r=[0.05, 0.05, 0.05],\n", - " sigma=[0.2, 0.2, 0.2],\n", - " option_type=[\"c\", \"p\", \"c\"]\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ds = DividendSchedule(\n", - " start_date=datetime(2025, 7, 4),\n", - " end_date=datetime(2026, 7, 4),\n", - " freq=\"quarterly\",\n", - " amount=1.5\n", - ")\n", - "\n", - "print(ds.get_schedule())\n", - "print(ds.get_year_fractions())\n", - "ds" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ds = DividendSchedule(\n", - " # last_dividend_date=datetime(2025, 6, 4),\n", - " start_date=datetime(2025, 1, 4),\n", - " end_date=datetime(2026, 7, 4),\n", - " valuation_date=datetime(2025, 6, 4),\n", - " freq=\"quarterly\",\n", - " amount=0.75\n", - ")\n", - "\n", - "print(ds.get_schedule())\n", - "print(ds.get_year_fractions())\n", - "print(ds.get_present_value(0.05, sum_up=True)) # Example discount rate of 5%\n", - "print(ds.get_present_value(0.05, sum_up=False)) # Example discount rate of 5%\n", - "ds" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "PRECISION = 5\n", - "american = True\n", - "u = 1.1\n", - "d = 1/u\n", - "s0 = [100]\n", - "k = K = 110\n", - "N = 5\n", - "tree = [s0]\n", - "T = 0.5\n", - "dt = T / N\n", - "opt_type = 'c'\n", - "r, y = 0.0045, 0\n", - "p = (np.exp((r - y) * dt) - d) / (u - d)\n", - "## Start level loop\n", - "for i in range(N):\n", - " level = []\n", - " for j in tree[i]:\n", - " level.append(round(j * u, PRECISION)) ## append up\n", - " level.append(round(j * d, PRECISION)) ## appemd down\n", - " level = list(set(level)) ## Unique set\n", - " tree.append(sorted(level))\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The stock price at node \\( (i, j) \\) in a recombining binomial tree is:\n", - "\n", - "\\[\n", - "S_{i,j} = S_0 \\cdot u^{2j - i}\n", - "\\]\n", - "\n", - "Where:\n", - "- \\( i \\): time step\n", - "- \\( j \\): number of up moves\n", - "- \\( u \\): up factor\n", - "- \\( d = 1/u \\): down factor\n", - "- \\( S_0 \\): initial stock price\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "\n", - "tree = []\n", - "for i in range(N + 1):\n", - " level = [s0[0] * (u ** (2 * j - i)) for j in range(i + 1)]\n", - " tree.append(level)\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "option_tree = deepcopy(tree)\n", - "\n", - "terminal_node =option_tree[-1]\n", - "for i in range(len(terminal_node)):\n", - " terminal_node[i] = max(0, terminal_node[i] - k if opt_type == 'c' else k - terminal_node[i])\n", - "\n", - "# Backward induction to calculate option values at each node\n", - "for i in range(N, -1, -1):\n", - " current_node = option_tree[i]\n", - " previous_node = option_tree[i-1]\n", - " intrinsic = [x - k if opt_type == 'c' else k - x for x in previous_node]\n", - " for j in range(1,len(option_tree[i])):\n", - " disc_value = ((current_node[j-1] * (1-p)) + (current_node[j] * p)) * np.exp(-r * dt)\n", - " if american:\n", - " disc_value = max(intrinsic[j-1], disc_value)\n", - " previous_node[j-1] = disc_value\n", - " \n", - "option_tree[0][0]\n", - "\n", - " \n", - "option_tree\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from copy import deepcopy\n", - "import numpy as np\n", - "\n", - "option_tree = deepcopy(tree)\n", - "\n", - "# Initialize terminal payoffs\n", - "terminal_node = option_tree[-1]\n", - "for i in range(len(terminal_node)):\n", - " terminal_node[i] = max(0, terminal_node[i] - k if opt_type == 'c' else k - terminal_node[i])\n", - "\n", - "# Backward induction\n", - "for i in range(N - 1, -1, -1): # Go from N-1 down to 0\n", - " current_node = option_tree[i + 1]\n", - " previous_node = option_tree[i]\n", - " intrinsic = [x - k if opt_type == 'c' else k - x for x in previous_node]\n", - "\n", - " for j in range(len(previous_node)):\n", - " disc_value = np.exp(-r * dt) * ((1 - p) * current_node[j] + p * current_node[j + 1])\n", - " if american:\n", - " disc_value = max(disc_value, intrinsic[j])\n", - " previous_node[j] = disc_value\n", - "option_tree[0][0]\n", - "\n", - " \n", - "option_tree" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "stock_tree = [\n", - " [s0[0] * (u ** j) * (d ** (i - j)) for j in range(i + 1)]\n", - " for i in range(N + 1)\n", - "]\n", - "# stock_tree" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "terminal_prices = stock_tree[-1] # Get the terminal prices from the last row of the stock tree\n", - "if opt_type == 'c':\n", - " option_values = [max(0, price - k) for price in terminal_prices] # Call option payoff\n", - "elif opt_type == 'p':\n", - " option_values = [max(0, k - price) for price in terminal_prices]\n", - "\n", - "option_values = option_values\n", - "\n", - "option_values = option_values\n", - "# Backward induction to calculate option values at each node\n", - "for i in range(N - 1, -1, -1):\n", - " option_values = [\n", - " np.exp(-r * dt) * (p * option_values[j+1] + (1 - p) * option_values[j]) ## Ordered from down to up.\n", - " ## Moves from all power in d, to all power in u by 1 step. Counting down on size i\n", - " for j in range(i + 1) ## At each node, there is Node+1 size\n", - " ]\n", - "\n", - " # If American option, check for early exercise\n", - " if american:\n", - " early_exercise = [\n", - " max(val, (p - K) if opt_type == 'c' else (K - p))\n", - " for p, val in zip(stock_tree[i], option_values)\n", - " ]\n", - " option_values = early_exercise\n", - "option_values[0]\n" - ] - }, - { - "cell_type": "raw", - "metadata": {}, - "source": [ - "\n", - "class VectorBinomialBase(BinomialBase):\n", - "\n", - " @abstractmethod\n", - " def init_parameters(self):\n", - " \"\"\"\n", - " Initialize parameters for the binomial tree.\n", - " This method should be called before building the tree.\n", - " \"\"\"\n", - " pass\n", - "\n", - " def build_tree(self):\n", - " \"\"\"\n", - " Build the binomial tree structure.\n", - " This method should be implemented in subclasses.\n", - " \"\"\"\n", - " self.stock_tree = [\n", - " [self.S0 * (self.u ** j) * (self.d ** (i - j)) for j in range(i + 1)]\n", - " for i in range(self.N + 1)\n", - " ]\n", - " if self.dividend_type == 'discrete':\n", - " self._apply_discrete_dividends() # Apply discrete dividends at time step 0\n", - "\n", - " def _apply_discrete_dividends(self) -> float:\n", - " \"\"\"\n", - " Apply discrete dividend adjustment to the stock price at a given time step.\n", - " \"\"\"\n", - " if not self.discrete_dividends:\n", - " return \n", - " \n", - " for t_frac, div in self.discrete_dividends:\n", - " div_step = min(int(round(t_frac * self.N)), self.N)\n", - " for i in range(div_step, self.N + 1):\n", - " self.stock_tree[i] = [max(s - div, 0) for s in self.stock_tree[i]]\n", - "\n", - " def __create_option_tree(self):\n", - " terminal_prices = self.stock_tree[-1] # Get the terminal prices from the last row of the stock tree\n", - " if self.option_type == 'c':\n", - " option_values = [max(0, price - self.K) for price in terminal_prices] # Call option payoff\n", - " elif self.option_type == 'p':\n", - " option_values = [max(0, self.K - price) for price in terminal_prices]\n", - " \n", - " self.option_values = option_values\n", - "\n", - " def price(self):\n", - " self.__create_option_tree() # Create the option tree based on terminal stock prices\n", - " option_values = self.option_values\n", - " # Backward induction to calculate option values at each node\n", - " for i in range(self.N - 1, -1, -1):\n", - " option_values = [\n", - " np.exp(-self.r * self.dt) * (self.p * option_values[j+1] + (1 - self.p) * option_values[j]) ## Ordered from down to up.\n", - " ## Moves from all power in d, to all power in u by 1 step. Counting down on size i\n", - " for j in range(i + 1) ## At each node, there is Node+1 size\n", - " ]\n", - "\n", - " # If American option, check for early exercise\n", - " if self.american:\n", - " early_exercise = [\n", - " max(val, (p - self.K) if self.option_type == 'c' else (self.K - p))\n", - " for p, val in zip(self.stock_tree[i], option_values)\n", - " ]\n", - " option_values = early_exercise\n", - " return option_values[0]\n", - "\n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - "class VectorBinomialCRR(VectorBinomialBase):\n", - "\n", - " def init_parameters(self):\n", - " \"\"\"\n", - " Initialize parameters for the binomial tree.\n", - " This method should be called before building the tree.\n", - " \"\"\"\n", - " if self.dividend_type == 'continuous':\n", - " y = self.div_yield ## Continuous dividend yield adjustment\n", - " else:\n", - " y = 0.0\n", - " self.u = np.exp(self.sigma * np.sqrt(self.dt))\n", - " self.d = 1 / self.u\n", - " self.p = (np.exp((self.r - y) * self.dt) - self.d) / (self.u - self.d)\n", - "\n", - "\n", - "class VectorBinomialLR(VectorBinomialBase): # or NodeBinomialBase\n", - " def init_parameters(self):\n", - " \"\"\"\n", - " Initialize Leisen-Reimer parameters: u, d, p.\n", - " \"\"\"\n", - " q = self.div_yield if self.dividend_type == 'continuous' else 0.0\n", - " self.dt = self.T / self.N\n", - " v = self.sigma * np.sqrt(self.dt)\n", - "\n", - " self.u = np.exp(v)\n", - " self.d = np.exp(-v)\n", - "\n", - " d1 = (\n", - " np.log(self.S0 / self.K) +\n", - " (self.r - q + 0.5 * self.sigma ** 2) * self.T\n", - " ) / (self.sigma * np.sqrt(self.T))\n", - "\n", - " x = d1 # Can also use d2 for puts, but d1 gives better results overall\n", - "\n", - " # Peizer-Pratt inversion of CDF (used by Leisen-Reimer)\n", - " w = np.sqrt(1 - np.exp(-2 * (x ** 2) / self.N))\n", - " self.p = 0.5 + np.sign(x) * w / 2\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "openbb_new_use", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.13" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/module_test/raw_code/optionlib/tests/timeseries_class.ipynb b/module_test/raw_code/optionlib/tests/timeseries_class.ipynb deleted file mode 100644 index 53bc873..0000000 --- a/module_test/raw_code/optionlib/tests/timeseries_class.ipynb +++ /dev/null @@ -1,66 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "from abc import ABC, abstractmethod\n", - "class TimeSeriesBase(ABC):\n", - " \"\"\"\n", - " Base class for time series data.\n", - " \"\"\"\n", - "\n", - " @abstractmethod\n", - " def get_data(self):\n", - " \"\"\"\n", - " Returns the time series data.\n", - " \"\"\"\n", - " pass\n", - "\n", - " @abstractmethod\n", - " def get_start_time(self):\n", - " \"\"\"\n", - " Returns the start time of the time series.\n", - " \"\"\"\n", - " pass\n", - "\n", - " @abstractmethod\n", - " def get_end_time(self):\n", - " \"\"\"\n", - " Returns the end time of the time series.\n", - " \"\"\"\n", - " pass\n", - "\n", - " @abstractmethod\n", - " def get_frequency(self):\n", - " \"\"\"\n", - " Returns the frequency of the time series.\n", - " \"\"\"\n", - " pass" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "openbb_new_use", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.13" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/ongoing_project.txt b/ongoing_project.txt deleted file mode 100644 index 366ad8a..0000000 --- a/ongoing_project.txt +++ /dev/null @@ -1,7 +0,0 @@ -- Streamling & Cleaning up the backtester: - - Focus on intense config usage, ensuring every variable is properly captured - - Focusing on modularization - -- Option Model remake: - - Improving option model and volatility Model - - Keeping it in one place for easy use & testing. \ No newline at end of file diff --git a/pricingConfig.json b/pricingConfig.json index 81d3633..677a076 100644 --- a/pricingConfig.json +++ b/pricingConfig.json @@ -1,6 +1,6 @@ { "INTRADAY_AGG": "30m", - "MARKET_OPEN_TIME": "09:30", + "MARKET_OPEN_TIME": "09:00", "MARKET_CLOSE_TIME": "16:00", "AVAILABLE_PRICING_MODELS": [ "bs", @@ -30,7 +30,7 @@ "DAYS_IN_MONTH": 30, "DAYS_IN_YEAR": 360, "MIN_BAR_TIME_INTERVAL": "5m", - "QUOTE_DATA_START_TIME": "9:45:00", + "QUOTE_DATA_START_TIME": "09:15:00", "VOL_SURFACE_MIN_MONEYNESS_THRESHOLD": 0.1, "VOL_SURFACE_MAX_MONEYNESS_THRESHOLD": 2.0, "VOL_SURFACE_MIN_DTE_THRESHOLD": 30, diff --git a/ruff.toml b/ruff.toml index 8bf45f8..307ac75 100644 --- a/ruff.toml +++ b/ruff.toml @@ -1,3 +1,5 @@ line-length = 120 + +[lint] extend-select = ["B", "I"] ignore = ["E501", "I001", "E731", "B009", "E722"] \ No newline at end of file diff --git a/running_todo.todo b/running_todo.todo new file mode 100644 index 0000000..8c74c02 --- /dev/null +++ b/running_todo.todo @@ -0,0 +1,75 @@ +Running Todo: + + ☐ Write steps to add new strategy to backtest framework + ☐ Write steps to add new strategy to live trading framework + ☐ Check if thetadata v3 is backward compatible with v2 + ☐ Write proper docstring for binomial model in optlib + ☐ Complelely decommission old method of getting rates. + ☐ How do we handle reverse splits? + ☐ Write a ChainDataManager + ☐ Add full dataframe tp Spot Result + - Include price property to pick from columns. Create enum for standard columns + ☐ Remove all import for riskmanager.market_data + ☐ Save scaling in position sizing info to database + ✔ Make order picker faster & more efficient @done(26-02-17 07:17) + ☐ Singleton Metaclass with attribute picking + ✔ Find a way to save historically closed in signals tabled. @done(26-02-17 07:17) + ☐ Add slippage pnl to live attribution + ☐ Aggregator should take trades & equity data only + ✔ EVB should use StrategyBase class (Optionally, dataframe, but probably should discourage it) @done(26-02-17 07:17) + ☐ Switch to TimeseriesDataManager for pnl attribution + ☐ Discontinue all use of module_test.raw_code.DataManagers + 1. Option.py + 2. xmultiply_attr.py + ✔ Add refresh information to MarketTimeseries to avoid constantly refreshing data when not needed. @done(26-02-17 07:19) + ☐ Move all vol and pricing logic to use the new OptLib + ☐ Eg FillOptimizer + ✔ Ensure MarketTimeseries is not cutting out dividends or split factors for real time @done(26-02-17 07:19) + ✔ Ensure make position id & signal id comes from one place (Signal id from strategy base, position id from create order) @done(26-02-17 07:20) + ☐ Update get_risk_free_rate_helper to use RatesDataManager + ☐ Look into alternatives for backfilling dividends with 0.0 in get_timeseries + ☐ Move strategy files to db. + ✔ Set evb default market_model = bsm, div = continuous for speed. Disable logging. @done(26-02-17 07:20) + ☐ Replace populate_chain_cache with ChainDataManager which caches none-today data and reloads today data on each call. + ☐ Remind zino about table diffing + ✔ Update info in config dictionary in order picker to reflect new changes (eg min_total_price) @done(26-02-17 07:21) + ☐ streamline all evb stream logging level as done in trade.datamanager + ☐ Normalize everywhere to use the following for position: + - fyi: This includes: events, signals, positions, etc. Anywhere we need to represent a position, we should use this format to avoid confusion and ensure consistency across the codebase. + - Side int: 1 for long, -1 for short + - Side str: "long" or "short" + - Position effect: "open" or "close" + - It should all come from eventdriven.types.position + ☐ Clean up old todos in the codebase and move any relevant ones to this todo list. + + +Todo before going back to backtesting: + ✔ For test order gen, it should use PREVIOU day's cash of order gen, not current cash. @done(26-02-13 14:52) + ✔ Allow preset orders in Evb order getter @done(26-02-09 21:14) + ✔ Clean up evb order getter + preset orders (speed up essentially) @done(26-02-11 21:44) + ✔ Push config change to db (changed min_total_price to 0.5 from 0.95) @done(26-02-13 09:42) + ☐ Move emefiele reports to the reports channel + ☐ Populate get_strategy_instance with has_position (Optional) + ✔ Cache checker should use date range info, with missing dates info saved @done(26-02-14 18:47) + ✔ All ts loaders should return the data @done(26-02-15 21:28) + ✔ Maybe cache timeseries object and use to return date range & at index to avoid doing multiple cache lookups @done(26-02-15 21:28) + ✔ Maybe during the first get_timeseries, cache the entire date range for syms with class range, find a way to drop today as usual. @done(26-02-15 21:28) + ✔ New methods in timeseries object: `covers_full_range(start, end)`, `get_at_index(date)`, `get_date_range(start, end)` @done(26-02-15 21:28) + ✔ Evb should use strategy base class and not have any direct dependency on dataframe (except for timeseries data retrieval) @done(26-02-15 19:45) + ✔ Update start date in Backtesting.py stats generated during PTBacktester. And general cleanup. @done(26-02-15 20:39) + ✔ Implement tplusn execution in StrategyBase @done(26-02-13 16:29) + ✔ Close signals added to signals table @done(26-02-09 16:34) + ✔ Ensure backtesting a live strategy works seamlessly @done(26-02-15 21:28) + ✔ Decipher the diff btwn backtest and live strategy performance @done(26-02-10 19:57) + ✔ I don't like how limit sizing is going. Look into it. @done(26-02-10 21:25) + +Future Todos: + ☐ In the new order gen system: + 1. Orders will be generated straight from StrategyBase instead of being generated with a table + 2. Signals table will be generated by using StrategyBase class to make the model aware of positions, and then create a snapshot + a. To achieve this, get_strategy_instance will need to be updated to store current positions information and pass it to the strategy instance. This will allow the strategy to make informed decisions about generating signals based on existing positions. + 3. This will allow us to have a more seamless integration between backtesting and live trading, as the same logic will be used for both. It will also allow us to have more complex strategies that can take into account existing positions when generating new signals. + 4. Signal table can actually show the decisions of inidividual tickers in the strategies. + + ☐ Backtesting.py doesn't have t-plus-n functionality. But we can effectively implement it with the wrapper around StrategyBase. + \ No newline at end of file diff --git a/todo.todo b/todo.todo index be67901..6799b48 100644 --- a/todo.todo +++ b/todo.todo @@ -1,3 +1,7 @@ +## This is repo specific todo. + + +## Reviewing todo. We will tag as either Ignore or Move. Todo Todo: ☐ Review this file and cut down useless tasks @@ -12,41 +16,31 @@ Long Term Design for Data: Each model of a factor will have it's own caching mechanism to avoid mixups. Setup File ToDo: - ☐ Add symbolic links creation for .vscode, .pylintrc, .gitignore, ruff.toml + ☐ Add symbolic links creation for .vscode, .pylintrc, .gitignore, ruff.toml #MOVE Whole Codebase Routine: - ☐ Add a Step by step guide to build env - ☐ Build file/setup_env.py to set up the environment - ☐ Constant readme for each folders - ☐ Decouple the riskmanager, portfolio manager, sizer - ☐ Create a schedule script to automatically run on cron and writeable from vscode: + ☐ Add a Step by step guide to build env #MOVE + ☐ Build file/setup_env.py to set up the environment #MOVE + ☐ Constant readme for each folders #MOVE + ☐ Decouple the riskmanager, portfolio manager, sizer #IGNORE + ☐ Create a schedule script to automatically run on cron and writeable from vscode: #MOVE - Suggestion: One script that registers a py file?: Issue is this script will be alive through out the day - Another suggestion: Create a bash script that runs every hour and checks a folder for new py files to run - Another Suggestion: Find a way to run a python script that directly appends to cron - ☐ Every model/algo with logic should have a model.md file explaining the logic + ☐ Every model/algo with logic should have a model.md file explaining the logic #IGNORE EventDriven: - ☐ There should be global configs to be used across all modules/clsses. This should print out the values set and the values that are defaulted. + ☐ There should be global configs to be used across all modules/clsses. This should print out the values set and the values that are defaulted. #DONE Portfolio File: Long Term: - ☐ Implement buy on Open, Bid, Ask. - ☐ Getting divYield to have a max retries to factor in sporadic errors + ☐ Implement buy on Open, Bid, Ask. #DONE + ☐ Getting divYield to have a max retries to factor in sporadic errors #IGNORE ☐ Add rebalancing - ☐ move __enforce_order_settings into types.py, and use in signal class @not-priority - ☐ For orders we can try randomizing price based on Bid/Ask Spread. Or we can buy on Ask and sell on Bid @not-priority - ☐ For slippage, we can try determining slippage based on bid/ask spread @not-priority - ☐ Stop Loss, Scaling in & Out, Trailing Stop - ☐ Rolling ((Consider) A monitor class to monitor delta, vega, slides, pnl level and roll) - ☐ Handle the Exercise Properly - ☐ Hedging + ☐ Handle the Exercise Properly #MOVE ☐ Retrieve option data from SQL if its faster and store data in sql as well if its not found in sql first @chidi - ☐ Seperate whole get_order process to allow easy injection into backtest - ☐ For missing value, use intrinsic value are price - ☐ add a setter for roll_map & min_acceptable_dte_threshold: - - min_acceptable_dte_threshold cannot be less than roll_map - - Error message `min_acceptable_dte_threshold cannot be less than roll_map, this avoids placing a roll the same day as opening a trade` - ☐ Make trades dataframe multiindex, use the trade_id as the first index and sell quantity as the second index + ☐ Seperate whole get_order process to allow easy injection into backtest #DONE + ☐ For missing value, use intrinsic value are price #IGNORE ☐ Perform Reduced sell. ☐ Allow multiple positions for a single ticker and factor in resizing. ☐ Execute order proxy: This produces the exact data of executing and ordeer and returns it. if less than 0, we reduce the quantity and try again. diff --git a/trade/.DS_Store b/trade/.DS_Store index c831bb3..51e64a7 100644 Binary files a/trade/.DS_Store and b/trade/.DS_Store differ diff --git a/trade/__init__.py b/trade/__init__.py index 0aa7537..12e2470 100644 --- a/trade/__init__.py +++ b/trade/__init__.py @@ -10,17 +10,23 @@ from dotenv import load_dotenv from trade.helpers.clear_cache import cleanup_expired_caches from .helpers.Logging import setup_logger +from pathlib import Path warnings.filterwarnings("ignore") +# Load .env file first before accessing any environment variables +load_dotenv() -USER = str(os.environ.get("USER", "unknown_user")).lower() ## Temporary fix to allow only chidi utilize some features +USER = str(os.environ.get("USER", "unknown_user")).lower() ## Temporary fix to allow only chidi utilize some features +GEN_CACHE_PATH = Path(os.environ.get("GEN_CACHE_PATH", Path(os.environ.get("WORK_DIR", ".")) / ".cache")) +TIMING_ANALYSIS_CACHE_PATH = GEN_CACHE_PATH / "timing_analysis" +TIMING_ANALYSIS_CACHE_PATH.mkdir(parents=True, exist_ok=True) POOL_ENABLED = None SIGNALS_TO_RUN = {} EXIT_HANDLERS = [] # Handlers for normal program exit _ATEXIT_REGISTERED = False OWNER_PID = os.getpid() -logger = setup_logger('trade.__init__') +logger = setup_logger("trade.__init__", stream_log_level="WARNING") cleanup_expired_caches() @@ -28,18 +34,36 @@ ## Get Business days FOR NYSE (Some days are still trading days) ##TODO: Make this more dynamic, so it can be used for other exchanges as well. And end date should be dynamic as well. NY = ZoneInfo("America/New_York") -nyse = mcal.get_calendar('NYSE') -schedule = nyse.schedule(start_date='2000-01-01', end_date='2040-01-01', tz=NY) +nyse = mcal.get_calendar("NYSE") +schedule = nyse.schedule(start_date="2000-01-01", end_date="2040-01-01", tz=NY) # pylint: disable=E1101 -all_trading_days = mcal.date_range(schedule, frequency='1D').date ## type: ignore -all_days = pd.date_range(start='2000-01-01', end='2040-01-01', freq='B') -holidays = set(all_days.difference(all_trading_days).strftime('%Y-%m-%d').to_list()) +all_trading_days = mcal.date_range(schedule, frequency="1D").date ## type: ignore +all_days = pd.date_range(start="2000-01-01", end="2040-01-01", freq="B") +holidays = set(all_days.difference(all_trading_days).strftime("%Y-%m-%d").to_list()) HOLIDAY_SET = set(holidays) +DATETIME_HOLIDAY_SET = set(pd.to_datetime(list(HOLIDAY_SET), format="%Y-%m-%d")) ## Additional holidays -HOLIDAY_SET.update({ - '2025-01-09', ## Jimmy Carter's Death -}) +HOLIDAY_SET.update( + { + "2025-01-09", ## Jimmy Carter's Death + } +) + + +def get_current_user() -> str: + """ + Get the current user's name from the USER environment variable. + + Returns: + ------- + str + The current user's name (lowercase). + """ + user = str(os.environ.get("QUANTTOOLS_USER", "unknown_user")).lower() + if user == "unknown_user": + logger.warning("USER environment variable is not set. Please set it for proper user identification.") + return user def is_allowed_user(allowed_users: list) -> bool: @@ -57,12 +81,10 @@ def is_allowed_user(allowed_users: list) -> bool: True if the current user is allowed, False otherwise. """ allowed_users = [user.lower() for user in allowed_users] - if USER.lower() in allowed_users: + if get_current_user() in allowed_users: return True else: - logger.warning("User %s is not allowed to perform this action.", USER) return False - def _run_exit_handlers(): @@ -86,7 +108,7 @@ def register_signal(signum, signal_func): The signal number (e.g., signal.SIGINT, signal.SIGTERM) or 'exit' for normal program exit. signal_func : callable The function to execute when the signal is received or program exits. - + Examples: -------- >>> register_signal(signal.SIGTERM, cleanup_function) @@ -94,12 +116,12 @@ def register_signal(signum, signal_func): >>> register_signal('exit', save_data_function) # For normal program exit """ global _ATEXIT_REGISTERED - + if not callable(signal_func): raise ValueError(f"Signal function {signal_func} is not callable.") - + # Handle normal program exit - if signum == 'exit' or signum == 0: + if signum == "exit" or signum == 0: EXIT_HANDLERS.append(signal_func) # Register atexit handler only once if not _ATEXIT_REGISTERED: @@ -108,13 +130,13 @@ def register_signal(signum, signal_func): logger.info("Registered atexit handler for normal program exit.") logger.info("Exit handler `%s` registered for normal program exit.", signal_func.__name__) return - + # Handle signal-based interrupts if signum not in SIGNALS_TO_RUN: SIGNALS_TO_RUN[signum] = [] signal.signal(signum, run_signals) logger.info("Registered signal number %d.", signum) - + SIGNALS_TO_RUN[signum].append(signal_func) logger.info("Signal function for `%s` added to signal number %d.", signal_func.__name__, signum) @@ -123,11 +145,20 @@ def run_signals(signum, frame): """ Run all registered signals. """ + ALREADY_RAN = [] if os.getpid() != OWNER_PID: logger.info("Signal received in child process (PID: %d). Ignoring signal %d.", os.getpid(), signum) return + + logger.info("Signal %d received - running ALL cleanup handlers", signum) + if signum in SIGNALS_TO_RUN: for signal_func in SIGNALS_TO_RUN[signum]: + if signal_func in ALREADY_RAN: + logger.info("Signal function %s for signal %d has already run. Skipping.", signal_func.__name__, signum) + continue + + ALREADY_RAN.append(signal_func) try: logger.info("Running signal function %s for signal %d.", signal_func.__name__, signum) signal_func() @@ -135,7 +166,10 @@ def run_signals(signum, frame): logger.info("Error running signal function %s: %s", signal_func.__name__, e) else: logger.info("No registered signals for signal number %d.", signum) - + + # Run exit handlers + _run_exit_handlers() + # Actually terminate the program after cleanup for interrupt/termination signals if signum in (signal.SIGINT, signal.SIGTERM): logger.info("Exiting after signal %d.", signum) @@ -152,13 +186,14 @@ def str_to_bool(value: str) -> bool: Returns: bool: True if the string is 'True', '1', or 'yes' (case-insensitive), False otherwise. """ - if value.lower() in ['true', '1', 'yes']: + if value.lower() in ["true", "1", "yes"]: return True - elif value.lower() in ['false', '0', 'no']: + elif value.lower() in ["false", "0", "no"]: return False else: raise ValueError("Invalid boolean string. Expected 'True', 'False', '1', '0', 'yes', or 'no'.") - + + def get_signals_to_run(): """ Get the registered signals to run. @@ -174,25 +209,28 @@ def set_pool_enabled(value: bool): global POOL_ENABLED POOL_ENABLED = value + def get_pool_enabled(): """ Get the pool enabled flag. """ return POOL_ENABLED + def reset_pool_enabled(): """ Reset the pool enabled flag to None. """ - load_dotenv(f"{os.environ['WORK_DIR']}/.env") - set_pool_enabled(str_to_bool(os.environ.get('POOL_ENABLED', 'False'))) + # .env already loaded at module import, just reload if needed + load_dotenv(override=False) + set_pool_enabled(str_to_bool(os.environ.get("POOL_ENABLED", "False"))) -reset_pool_enabled() +reset_pool_enabled() ## Import Pricing Config -with open(f"{os.environ['WORK_DIR']}/pricingConfig.json", encoding='utf-8') as f: +with open(f"{os.environ['WORK_DIR']}/pricingConfig.json", encoding="utf-8") as f: PRICING_CONFIG = json.load(f) @@ -201,12 +239,12 @@ def get_pricing_config() -> dict: Get the pricing configuration. """ MISSING_DEFAULTS = { - 'VOL_SURFACE_MAX_DTE_THRESHOLD': 365, - 'VOL_SURFACE_MIN_DTE_THRESHOLD': 0, - 'VOL_SURFACE_MAX_MONEYNESS_THRESHOLD': 1, - 'VOL_SURFACE_MIN_MONEYNESS_THRESHOLD': 0 + "VOL_SURFACE_MAX_DTE_THRESHOLD": 365, + "VOL_SURFACE_MIN_DTE_THRESHOLD": 0, + "VOL_SURFACE_MAX_MONEYNESS_THRESHOLD": 1, + "VOL_SURFACE_MIN_MONEYNESS_THRESHOLD": 0, } - with open(f"{os.environ['WORK_DIR']}/pricingConfig.json", encoding='utf-8') as f: + with open(f"{os.environ['WORK_DIR']}/pricingConfig.json", encoding="utf-8") as f: PRICING_CONFIG = json.load(f) for key, value in MISSING_DEFAULTS.items(): @@ -215,18 +253,14 @@ def get_pricing_config() -> dict: logger.warning(f"Missing key {key} in pricing config. Setting default value {value}.") return PRICING_CONFIG + def reload_pricing_config(): """ Reload the pricing configuration from the file. """ - - global PRICING_CONFIG - with open(f"{os.environ['WORK_DIR']}/pricingConfig.json", encoding='utf-8') as pricing_file: + with open(f"{os.environ['WORK_DIR']}/pricingConfig.json", encoding="utf-8") as pricing_file: PRICING_CONFIG = json.load(pricing_file) - logger.info("Pricing configuration reloaded.") - - diff --git a/trade/assets/Calculate.py b/trade/assets/Calculate.py index 5074e61..5fad186 100644 --- a/trade/assets/Calculate.py +++ b/trade/assets/Calculate.py @@ -608,7 +608,7 @@ def delta(asset = None, S = None, K = None, r = None, sigma = None, start = None if args[i] is None: args[i] = getattr(asset, args_str[i]) - t = time_distance_helper(asset.exp, asset.end_date) + t = time_distance_helper(end=asset.exp, start=asset.end_date) flag = getattr(asset, OptionModelAttributes.put_call.value) if model == 'bs': d = delta(flag = flag.lower(),S = args[0], K = args[1], t = t, r = args[2], sigma = args[3], q = args[4] ) @@ -625,7 +625,7 @@ def delta(asset = None, S = None, K = None, r = None, sigma = None, start = None if sigma == 0: raise ValueError("Sigma cannot be 0") - t = time_distance_helper(exp, start) + t = time_distance_helper(end=exp, start=start) if model == 'bs': d = delta(flag = flag.lower(), S = S, K = K, t = t, r = r, sigma = sigma, q = y ) elif model == 'binomial': @@ -660,7 +660,7 @@ def vega(asset = None, S = None, K = None, r = None, sigma = None, start = None, args[i] = getattr(asset, args_str[i]) - t = time_distance_helper(asset.exp, asset.end_date) + t = time_distance_helper(end=asset.exp, start=asset.end_date) flag = getattr(asset, OptionModelAttributes.put_call.value) if model == 'bs': d = vega(flag = flag.lower(),S = args[0], K = args[1], t = t, r = args[2], sigma = args[3], q = args[4] ) @@ -670,7 +670,7 @@ def vega(asset = None, S = None, K = None, r = None, sigma = None, start = None, elif asset == None: assert all(v is not None for v in [S, K, r, sigma, start, flag, exp, y]), f"None of y, S, K, r, sigma, start, flag, exp, can be None" - t = time_distance_helper(exp, start) + t = time_distance_helper(end=exp, start=start) if model == 'bs': d = vega(flag = flag.lower(), S = S, K = K, t = t, r = r, sigma = sigma, q = y ) elif model == 'binomial': @@ -706,7 +706,7 @@ def vanna(asset = None, S = None, K = None, r = None, sigma = None, start = None if args[i] is None: args[i] = getattr(asset, args_str[i]) - t = time_distance_helper(asset.exp, asset.end_date) + t = time_distance_helper(end=asset.exp, start=asset.end_date) flag = getattr(asset, OptionModelAttributes.put_call.value) if model == 'bs': # d = vanna(flag = flag.lower(),S = args[0], K = args[1], T = t, r = args[2], sigma = args[3], q = args[4] ) @@ -725,7 +725,7 @@ def vanna(asset = None, S = None, K = None, r = None, sigma = None, start = None elif asset == None: assert all(v is not None for v in [S, K, r, sigma, start, flag, exp, y]), f"None of y, S, K, r, sigma, start, flag, exp, can be None" - t = time_distance_helper(exp, start) + t = time_distance_helper(end=exp, start=start) if model == 'bs': # d = vanna(flag = flag.lower(), S = S, K = K, T = t, r = r, sigma = sigma, q = y ) @@ -762,7 +762,7 @@ def volga(asset = None, S = None, K = None, r = None, sigma = None, start = None args[i] = getattr(asset, args_str[i]) - t = time_distance_helper(asset.exp, asset.end_date) + t = time_distance_helper(end=asset.exp, start=asset.end_date) flag = getattr(asset, OptionModelAttributes.put_call.value) if model == 'bs': d = volga_from_vega(s= args[0], k = args[1], t = t, r = args[2], sigma = args[3], q = args[4], flag= flag.lower()) @@ -772,7 +772,7 @@ def volga(asset = None, S = None, K = None, r = None, sigma = None, start = None elif asset == None: assert all(v is not None for v in [S, K, r, sigma, start, flag, exp, y]), f"None of y, S, K, r, sigma, start, flag, exp, can be None" - t = time_distance_helper(exp, start) + t = time_distance_helper(end=exp, start=start) if model == 'bs': # d = volga(flag = flag.lower(), S = S, K = K, T = t, r = r, sigma = sigma, q = y ) d = volga_from_vega(s= S, k = K, t = t, r = r, sigma = sigma, q = y, flag= flag.lower()) @@ -807,7 +807,7 @@ def gamma(asset = None, S = None, K = None, r = None, sigma = None, start = None if args[i] is None: args[i] = getattr(asset, args_str[i]) - t = time_distance_helper(asset.exp, asset.end_date) + t = time_distance_helper(end=asset.exp, start=asset.end_date) if model == 'bs': d = gamma(flag = flag.lower(),S = args[0], K = args[1], t = t, r = args[2], sigma = args[3], q = args[4] ) elif model == 'binomial': @@ -821,7 +821,7 @@ def gamma(asset = None, S = None, K = None, r = None, sigma = None, start = None logger.error(f"Kwargs: {locals()}") return 0.0 - t = time_distance_helper(exp, start) + t = time_distance_helper(end=exp, start=start) if model == 'bs': d = gamma(flag = flag.lower(), S = S, K = K, t = t, r = r, sigma = sigma, q = y ) elif model == 'binomial': @@ -859,7 +859,7 @@ def theta(asset = None, S = None, K = None, r = None, sigma = None, start = None for i in range(len(args)): if args[i] is None: args[i] = getattr(asset, args_str[i]) - t = time_distance_helper(asset.exp, asset.end_date) + t = time_distance_helper(end=asset.exp, start=asset.end_date) if model == 'bs': d = theta(flag = flag.lower(),S = args[0], K = args[1], t = t, r = args[2], sigma = args[3], q = args[4] ) elif model == 'binomial': @@ -868,7 +868,7 @@ def theta(asset = None, S = None, K = None, r = None, sigma = None, start = None elif asset == None: assert all(v is not None for v in [S, K, r, sigma, start, flag, exp, y]), f"None of y, S, K, r, sigma, start, flag, exp, can be None" - t = time_distance_helper(exp, start) + t = time_distance_helper(end=exp, start=start) if model == 'bs': d = theta(flag = flag.lower(), S = S, K = K, t = t, r = r, sigma = sigma, q = y ) elif model == 'binomial': @@ -902,7 +902,7 @@ def rho(asset = None, S = None, K = None, r = None, sigma = None, start = None, for i in range(len(args)): if args[i] is None: args[i] = getattr(asset, args_str[i]) - t = time_distance_helper(asset.exp, asset.end_date) + t = time_distance_helper(end=asset.exp, start=asset.end_date) if model == 'bs': d = rho(flag = flag.lower(),S = args[0], K = args[1], t = t, r = args[2], sigma = args[3], q = args[4] ) elif model == 'binomial': @@ -911,7 +911,7 @@ def rho(asset = None, S = None, K = None, r = None, sigma = None, start = None, elif asset == None: assert all(v is not None for v in [S, K, r, sigma, start, flag, exp, y]), f"None of y, S, K, r, sigma, start, flag, exp, can be None" - t = time_distance_helper(exp, start) + t = time_distance_helper(end=exp, start=start) if model == 'bs': d = rho(flag = flag.lower(), S = S, K = K, t = t, r = r, sigma = sigma, q = y ) elif model == 'binomial': diff --git a/trade/assets/OptionChain.py b/trade/assets/OptionChain.py index 0fd4b20..5ba9773 100644 --- a/trade/assets/OptionChain.py +++ b/trade/assets/OptionChain.py @@ -59,7 +59,7 @@ def get_set( ) -> dict: try: price = retrieve_quote(ticker, date, exp, right, date, strike, start_time = '9:00')['Midpoint'][-1] #To-do: Handle None values - vol = IV_handler(S = spot, K = strike, t = time_distance_helper(exp = exp, strt = date), r = r, flag = right.lower(), price = price, q = q) + vol = IV_handler(S = spot, K = strike, t = time_distance_helper(end = exp, start = date), r = r, flag = right.lower(), price = price, q = q) except Exception as e: logger.error(f'Error in get_set: {e}', exc_info=True) raise e diff --git a/trade/assets/Stock.py b/trade/assets/Stock.py index ca24818..842fa67 100644 --- a/trade/assets/Stock.py +++ b/trade/assets/Stock.py @@ -364,9 +364,9 @@ def init_risk_free_rate(self): self.__rf_rate = ts.loc[last_available_date, "annualized"] else: - self.__rf_rate = ts[ts.index == pd.to_datetime(last_bus).strftime("%Y-%m-%d")]["annualized"].values[0] + self.__rf_rate = ts[ts.index.date == pd.to_datetime(last_bus).date()]["annualized"].values[0] else: - self.__rf_rate = ts[ts.index == pd.to_datetime(last_bus).strftime("%Y-%m-%d")]["annualized"].values[0] + self.__rf_rate = ts[ts.index.date == pd.to_datetime(last_bus).date()]["annualized"].values[0] def rebuild_chain(self): """ diff --git a/trade/assets/attribution.py b/trade/assets/attribution.py index ceb09bf..0ad7605 100644 --- a/trade/assets/attribution.py +++ b/trade/assets/attribution.py @@ -51,7 +51,7 @@ def pnl_data_organizer_helper(strike, exp, flag, op_ts = None, stock_ts = None, vol = implied_vol_bt(S0= S0, K = K,r=r, market_price=market_price,exp_date = exp,flag = flag,start=start) if math.isnan(vol): try: - vol = implied_volatility(price = market_price, S = S0, K = K, t = time_distance_helper(exp, start), r = r, q = 0, flag = flag) + vol = implied_volatility(price = market_price, S = S0, K = K, t = time_distance_helper(end=exp, start=start), r = r, q = 0, flag = flag) except: vol = np.nan merged.at[index, 'vol'] = vol diff --git a/trade/assets/calculate/xmultiply_attr.py b/trade/assets/calculate/xmultiply_attr.py index 7ed46fc..dbb84a5 100644 --- a/trade/assets/calculate/xmultiply_attr.py +++ b/trade/assets/calculate/xmultiply_attr.py @@ -19,6 +19,7 @@ from trade.helpers.Logging import setup_logger from trade.helpers.decorators import log_time from module_test.raw_code.DataManagers.DataManagers import OptionDataManager, set_skip_mysql_query +from trade.datamanager.timeseries import TimeseriesDataManager # noqa ##TODO: Take this out once DataManagers has been optimized set_skip_mysql_query(True) diff --git a/trade/assets/helpers/DataManagers.py b/trade/assets/helpers/DataManagers.py index fe46e14..fce262f 100644 --- a/trade/assets/helpers/DataManagers.py +++ b/trade/assets/helpers/DataManagers.py @@ -342,7 +342,7 @@ def get_vol(self, type_ = 'close', query_date = datetime.now()): price = x[p], S = s0, K = self.strike, - t = time_distance_helper(exp = self.exp, strt = query_date), + t = time_distance_helper(end = self.exp, start = query_date), r = r, q = y, flag = self.right.lower()), axis = 1) @@ -617,7 +617,7 @@ def __bs_vol(self, data, price) -> pd.Series: price = x[price], S = x['underlier_price'], K = x['strike'], - t = time_distance_helper(exp = x['expiration'], strt = x['datetime']), + t = time_distance_helper(end = x['expiration'], start = x['datetime']), r = x['rf_rate'], q = x['dividend'], flag = x['put/call'].lower()), axis = 1) diff --git a/trade/assets/helpers/DataManagers_new/DataManagers.py b/trade/assets/helpers/DataManagers_new/DataManagers.py deleted file mode 100644 index a332ba7..0000000 --- a/trade/assets/helpers/DataManagers_new/DataManagers.py +++ /dev/null @@ -1,1928 +0,0 @@ -from dotenv import load_dotenv -import os -import sys -import logging -from openpyxl import load_workbook -from datetime import datetime, date -from datetime import time as dtTime -import pandas as pd -import threading -import numpy as np -from pathos.multiprocessing import ProcessingPool as Pool -from concurrent.futures import ProcessPoolExecutor, as_completed -import concurrent.futures -from trade import POOL_ENABLED, PRICING_CONFIG -from trade.assets.Stock import Stock -from trade.helpers.helper import generate_option_tick_new -from trade.assets.rates import get_risk_free_rate_helper -from trade.helpers.helper import IV_handler, time_distance_helper, binomial_implied_vol, wait_for_response, HOLIDAY_SET,enforce_allowed_models,optionPV_helper -from trade.helpers.helper import extract_numeric_value, change_to_last_busday, parse_option_tick -from trade.helpers.helper import optionPV_helper -from trade.helpers.exception import IncorrectExecutionError -from trade.helpers.Logging import setup_logger -from trade.assets.Calculate import Calculate -from trade.helpers.Context import Context -from dbase.DataAPI.ThetaData import (retrieve_ohlc, - retrieve_quote_rt, - retrieve_eod_ohlc, - resample, - retrieve_quote, - enforce_bus_hours, - retrieve_bulk_eod, - retrieve_openInterest, - retrieve_chain_bulk, - list_contracts, - retrieve_bulk_open_interest - ) -from trade.helpers.pools import parallel_apply -from trade.helpers.decorators import log_error, log_error_with_stack, log_time -from trade.helpers.helper_types import OptionModelAttributes -from dateutil.relativedelta import relativedelta -from pandas.tseries.offsets import BDay -from dbase.database.SQLHelpers import DatabaseAdapter -from trade.models.VolSurface import fit_svi_model -from trade.models.utils import resolve_missing_vol -from threading import Thread, Lock -from dbase.utils import add_eod_timestamp, bus_range, enforce_bus_hours, default_timestamp -from trade.helpers.pools import runProcesses -from pathos.multiprocessing import ProcessingPool as Pool -from copy import deepcopy -import json -from queue import Queue, Full -from threading import Thread -from typing import TYPE_CHECKING, List, Tuple -from .SaveManager import SaveManager, save_failed_request, flatten_all_dfs - - -logger = setup_logger('DataManager.py') -time_logger = setup_logger('time_logger_test_dm') -vol_resolve_logger = setup_logger('DataManagers.Vol_Resolve') -CENTRAL_SAVE_THREAD = {} - - -# __all__ = [ -# 'OptionDataManager', -# 'SpotDataManager', -# 'VolDataManager', -# 'GreeksDataManager', -# 'AttributionDataManager', -# 'BulkDataManager', -# '_ManagerLazyLoader', -# '' -# ] - - -TABLES = { - 'eod':{ - 'attribution': 'securities_master.attribution_eod', - 'spot': 'securities_master.temp_options_eod_new', - 'vol': 'securities_master.temp_options_eod_new', - 'greeks': 'securities_master.temp_options_eod_new', - 'chain': 'vol_surface.option_chain' - }, - 'intra':{ - 'attribution': 'securities_master.attribution_intra', - 'spot': 'securities_master.temp_options_intra_new', - 'vol': 'securities_master.temp_options_intra_new', - 'greeks': 'securities_master.temp_options_intra_new', - } -} - - - - - - -#### Empty classes. Not yet implemented. - -class AttributionDataManager: - def __init__(self): - raise NotImplementedError("AttributionDataManager is not implemented yet.") - -class ScenarioDataManager: - def __init__(self): - raise NotImplementedError("ScenarioDataManager is not implemented yet.") - - - - -#### Request Class -class ChainDataRequest: - def __init__(self, symbol, date, table_name, db_name, **kwargs): - self.symbol = symbol - self.date = date - self.table_name = table_name - self.db_name = db_name - - -class OptionQueryRequestParameter: - def __init__(self, table_name, db_name, start_date=None, end_date=None, ticker=None, exp=None, strike=None, right = None, **kwargs): - self.db_name = db_name - self.table_name = table_name - self.start_date = start_date - self.end_date = end_date - self.exp = exp - self.strike = strike - self.right = right - self.symbol = ticker - self.opttick= None - self.query = None - self.y = None - self.vol = None - self.spot = None - self.interval = None - self.type_ = None - - -class BulkOptionQueryRequestParameter: - def __init__(self, table_name, db_name, start_date=None, end_date=None, ticker=None, exp=None, strikes=None, **kwargs): - self.db_name = db_name - self.table_name = table_name - self.start_date = start_date - self.end_date = end_date - self.ticker = ticker - self.exp = exp - self.strikes = strikes - self.opttick = None - self.symbol = ticker - self.query = None - self.y = None - self.vol = None - self.spot = None - self.interval = None - self.type_ = None - - -#### Managers Class -class _ManagerLazyLoader: - def __init__(self, symbol): - self.symbol = symbol - self.Stock = Stock(self.symbol, run_chain = False) - self._eod = {} - self._intra = {} - - - @property - def eod(self): - """ - Returns the end of day data - """ - class EODData(dict): - def __init__(inner, parent): ## inner is the instance of the class, parent is the instance of the parent class - inner.parent = parent - super().__init__() - - def __getitem__(inner, key): ## Custom getter for EOD Dict. To initialize the data, if not already done - if key not in inner.parent._eod: - if key not in ['s0_close', 's0_chain', 'r', 'y', 'r_name']: - raise KeyError(f"{key} not in eod data, expected one of: ['s0_close', 's0_chain', 'r', 'y', 'r_name]") - inner.parent._eod[key] = inner.parent._lazy_load(key, intra_flag = False) - return inner.parent._eod[key] - - def __contains__(innner, key): - return key in inner.parent._eod - - def __repr__(inner): - return inner.parent._eod.__repr__() - - def __len__(inner): - return len(inner.parent._eod) - - def keys(inner): - return inner.parent._eod.keys() - return EODData(self) - - @property - def intra(self): - """ - Returns the end of day data - """ - class IntraData(dict): - def __init__(inner, parent): - inner.parent = parent - super().__init__() - - def __getitem__(inner, key): ## Custom getter for EOD Dict. To initialize the data, if not already done - if key not in inner.parent._intra: - if key not in ['s0_close', 's0_chain', 'r', 'y', 'r_name']: - raise KeyError(f"{key} not in intra data, expected one of: ['s0_close', 's0_chain', 'r', 'y', 'r_name']") - inner.parent._intra[key] = inner.parent._lazy_load(key, ts_timewidth = '5', ts_timeframe = 'minute', intra_flag = True) - return inner.parent._intra[key] - - def __contains__(innner, key): - return key in inner.parent._intra - - def __repr__(inner): - return inner.parent._intra.__repr__() - - def __len__(inner): - return len(inner.parent._intra) - - def keys(inner): - return inner.parent._intra.keys() - return IntraData(self) - - - def _lazy_load(self, load_name, **kwargs): - ## Utilizing the lazy load function to load data on demand, and speed up initialization - if load_name == 's0_close': - - ## Will use Kwargs to move between intra and EOD. - kwargs.pop('intra_flag') - return_item = (self.Stock.spot(ts = True, - ts_start = pd.to_datetime(self.exp) - relativedelta(years=5), - ts_end =pd.to_datetime(self.exp) + relativedelta(years=5), - **kwargs)) - return return_item - - elif load_name == 's0_chain': - kwargs.pop('intra_flag') - return_item = (self.Stock.spot(ts = True, - ts_start = pd.to_datetime(self.exp) - relativedelta(years=5), - ts_end =pd.to_datetime(self.exp) + relativedelta(years=5), - spot_type='chain_price', - **kwargs)) - return return_item - - elif load_name == 'r': - intra_flag = kwargs.get('intra_flag', False) - r = (get_risk_free_rate_helper()['annualized']) - if intra_flag: - return resample(r, PRICING_CONFIG['INTRADAY_AGG'], {'risk_free_rate':'ffill'}) - else: - return r - - elif load_name == 'r_name': - intra_flag = kwargs.get('intra_flag', False) - r = (get_risk_free_rate_helper()['name']) - - if intra_flag: - return resample(r, PRICING_CONFIG['INTRADAY_AGG'], {'risk_free_rate':'ffill'}) - else: - return r - - elif load_name == 'y': - ## Get the dividend yield - intra_flag = kwargs.get('intra_flag', False) - y = (self.Stock.div_yield_history(start = pd.to_datetime(self.exp) - relativedelta(years=5))) - - if intra_flag: - return resample(y, PRICING_CONFIG['INTRADAY_AGG'], {'dividend_yield':'ffill'}) - else: - return y - - - -class SpotDataManager: - def __init__(self, symbol:str): - self.symbol = symbol - - def query_thetadata(self, - start: str | datetime, - end: str | datetime, - strike: float = None, - exp: str | datetime = None, - right: str = None, - bulk: bool = False, - **kwargs) -> pd.DataFrame: - """ - Query the spot data & Open Interest from ThetaData API. - """ - data_request = kwargs.get('data_request') - print_url = kwargs.get('print_url', False) - agg = data_request.agg - if agg == 'eod': - if not bulk: - data = retrieve_eod_ohlc(symbol=self.symbol, end_date=end, exp=exp, right=right, start_date=start, strike=strike, print_url=print_url) - data = data[~data.index.duplicated(keep='first')] - open_interest = retrieve_openInterest(symbol=self.symbol, end_date=end, exp=exp, right=right, start_date=start, strike=strike, print_url=print_url).set_index('Datetime') - data['Open_interest'] = open_interest['Open_interest'] - data.index = default_timestamp(data.index) - return data - - else: - bulk = retrieve_bulk_eod( - symbol = self.symbol, - exp = exp, - start_date = start, - end_date = end, - ) - - ## Add Option Tick - bulk_eod = bulk.reset_index() - tick_col = ['Root', 'Right', 'Expiration', 'Strike'] - bulk_eod['OptionTick'] = parallel_apply(bulk_eod[tick_col], generate_option_tick_new) - if data_request.opttick is not None: - bulk_eod = bulk_eod[bulk_eod['OptionTick'].isin(data_request.opttick)] - - - ## Query Bulk Open Interest - bulk_oi = retrieve_bulk_open_interest( - symbol = self.symbol, - exp = exp, - start_date = start, - end_date = end, - ) - ## Add Option Tick - bulk_oi['OptionTick'] = parallel_apply(bulk_oi[tick_col], generate_option_tick_new) - if data_request.opttick is not None: - bulk_oi = bulk_oi[bulk_oi['OptionTick'].isin(data_request.opttick)] - ## Add EOD Timestamp - bulk_oi['Datetime'] = add_eod_timestamp(pd.DatetimeIndex(bulk_oi['Datetime'])) - data = bulk_eod.merge(bulk_oi[['Datetime','OptionTick', 'Open_interest']], on = ['Datetime', 'OptionTick'], how = 'left') - data = data.rename(columns = {'Root': 'ticker', 'Strike':'k', 'Expiration': 'exp_date'}) - data.set_index('Datetime', inplace = True) - data.index = default_timestamp(pd.DatetimeIndex(data.index)) - return data - - elif agg == 'intra': - if not bulk: - data = retrieve_ohlc(symbol=self.symbol, end_date=end, exp=exp, right=right, start_date=pd.to_datetime(start) - BDay(1), strike=strike, print_url=print_url) - ## For open Interest we will query from Start - 1BDay to End - open_interest = retrieve_openInterest(symbol=self.symbol, end_date=end, exp=exp, right=right, - start_date=pd.to_datetime(start) - BDay(1), strike=strike, - print_url=print_url).set_index('Datetime')['Open_interest'] - - ## PS: Quering for Open Interest uses Start - 1BDAY to END - ## This is because open interest returns EOD. Resampling to intraday moves previous day data to current day - ## Therefore, first date will be NaN because it will be the previous day data, which is not included in the query results - open_interest = resample(open_interest, PRICING_CONFIG['INTRADAY_AGG'] ) - data['Open_interest']=open_interest - - return data#.dropna() - # return open_interest - else: - raise NotImplementedError("Bulk data not implemented for intra data") - - -class VolDataManager: - def __init__(self, symbol:str): - self.symbol = symbol - - def calculate_iv(self, **kwargs): - """ - Calculate the implied volatility using the model. - """ - data_request = kwargs['data_request'] - model = data_request.model - raw_data = data_request.raw_spot_data - raw_data.columns = [x.lower() for x in raw_data.columns] - raw_data['datetime'] = raw_data.index - return_cols = [] - for col, name in data_request.iv_cols.items(): - calc_vol_for_data_parallel(raw_data, col, name, model, col_kwargs = data_request.col_kwargs, pool = False) - - raw_data.drop(columns=['datetime'], inplace=True) - - -class GreeksDataManager: - def __init__(self, symbol:str): - self.symbol = symbol - - def calculate_greeks(self, type_, **kwargs): - - data_request = kwargs['data_request'] - model = data_request.model - raw_data = data_request.raw_spot_data - raw_data.columns = [x.lower() for x in raw_data.columns] - raw_data['datetime'] = raw_data.index - if type_ in ['greek', 'greeks']: - ## Greeks - for col, format_name in data_request.greek_cols.items(): - calc_greeks_for_data_parallel(raw_data, model, col, format_name, col_kwargs = data_request.col_kwargs, pool = False) - else: - ## Individual Greeks - for col, format_name in data_request.greek_cols.items(): - calc_greeks_for_data_parallel(raw_data, model, col, format_name, col_kwargs = data_request.col_kwargs, greek_name=type_, pool = False) - - raw_data.drop(columns=['datetime'], inplace=True) - -## Writing this as a separate class to handle the chain data -## I don't want it to depend on OptionDataManager -## Because it isn't tethered to a specific option. -class ChainDataManager(_ManagerLazyLoader): - """ - Class to manage the chain data for a given symbol. - It inherits from the _ManagerLazyLoader class to load data on demand. - It uses the ChainDataRequest class to handle the data requests. - It uses the DatabaseAdapter class to handle the database operations. - """ - - CLASS_THREADS = {} - def __init__(self, symbol): - """ - Initialize the ChainDataManager with the symbol. - """ - super().__init__(symbol) - self.symbol = symbol - self.requests = {} - self.current_request = '' - self.db = DatabaseAdapter() - - - def get_at_time(self, date:str, organize:bool = False) -> pd.DataFrame: - database, table = TABLES['eod']['chain'].split('.') - self.exp = date - self.current_request = datetime.now().strftime("%Y%m%d %H:%M:%S") - data_request = ChainDataRequest( - symbol=self.symbol, - date = date, - table_name = table, - db_name = database ) - self.requests[self.current_request] = data_request - init_query(data_request=data_request, db=self.db, query_category='chain') - self.__pre_process(data_request=data_request) - is_empty = data_request.is_empty - if is_empty: - self.__post_process(data_request=data_request) - SaveManager.enqueue(data_request, self.save_chain_data) - # save_thread = Thread(target=self.save_chain_data, args=(data_request,), daemon=True, name = "save_chain_data") - # save_thread.start() - # data_request.save_thread = save_thread - # CENTRAL_SAVE_THREAD[self.current_request] = save_thread - # self.CLASS_THREADS[self.current_request] = save_thread - - else: - data_request.post_processed_data = data_request.database_data - - if organize: - data = data_request.post_processed_data.copy() - data.columns = data.columns.str.capitalize() - data.rename(columns = {'Dte': 'DTE', 'Price': 'Midpoint'}, inplace=True) - chain = data.pivot_table( - index = ['Expiration', 'DTE', 'Strike'], - columns = ['Right'], - values = ['Midpoint'] - ) - data_request.organized_data = chain - else: - data_request.organized_data = data_request.post_processed_data - - return data_request - - - - def __pre_process(self, **kwargs): - """ - Preprocess the data for the request - """ - data_request = kwargs.get('data_request') - database_data = data_request.database_data - database_data.columns = [x.lower() for x in database_data.columns] - if database_data.empty: - data_request.is_empty = True - else: - data_request.is_empty = False - - return database_data - - def __post_process(self, **kwargs): - """ - Postprocess the data for the request - """ - logger.warning(f"ChainDataManger will not be returning Volatility data due to performance.") - data_request = kwargs.get('data_request') - date = data_request.date - chain = retrieve_chain_bulk(self.symbol, 0, date, date, PRICING_CONFIG['MARKET_CLOSE_TIME']) - chain.index.name = 'build_date' - # self.exp = min(chain['Expiration'].unique()) ## Setting Expiration Date as an instance variable so LazyLoaderManager can use it - chain_v2 = chain.rename(columns = {'Root':'ticker', 'Midpoint': 'price'}).drop(columns = ['Date']).reset_index() - chain_v2.columns = [x.lower() for x in chain_v2.columns] - chain_v2['dte'] = (chain_v2['expiration'] - chain_v2['build_date']).dt.days - chain_v2['spot'] = self.eod['s0_chain']['close'][date] - chain_v2['r'] = self.eod['r'][date] - chain_v2['q'] = self.eod['y'][date] - chain_v2['option_tick'] = chain_v2.apply(lambda x: generate_option_tick_new(x['ticker'], x['right'], x['expiration'].strftime('%Y-%m-%d'), x['strike']), axis=1) - chain_v2['moneyness'] = chain_v2.apply(lambda x: x['spot'] / x['strike'], axis=1) - data_request.post_processed_data = chain_v2 - - def save_chain_data(self, data_request, **kwargs): - """ - Save the chain data to the database - """ - col_kwargs = { - 'underlier_price': 'spot', - 'strike': 'strike', - 'expiration': 'expiration', - 'datetime': 'build_date', - 'rf_rate': 'r', - 'dividend': 'q', - 'put/call': 'right' - } - chain_data = data_request.post_processed_data - calc_vol_for_data(chain_data, 'price', 'bs_vol', 'bs', col_kwargs=col_kwargs) - binomial_col = ['price', 'spot', 'strike', 'r', 'expiration', 'right', 'build_date', 'q'] - chain_data['binomial_vol'] = parallel_apply(chain_data[binomial_col], binomial_implied_vol, timeout=10) - - self.db.save_to_database(chain_data, data_request.db_name, data_request.table_name,) - - -class BulkOptionDataManager(_ManagerLazyLoader): - """ - Class to manage the bulk option data for a given symbol. - It inherits from the _ManagerLazyLoader class to load data on demand. - It uses the BulkOptionQueryRequestParameter class to handle the data requests. - It uses the DatabaseAdapter class to handle the database operations. - """ - - CLASS_THREADS = {} - - @log_time(time_logger) - def __init__(self, - symbol: str = None, - exp: str | datetime = None, - default_fill: str = 'midpoint', - **kwargs) -> None: - """ - Returns an object for querying data - - Params: - symbol: Underlier symbol - exp: expiration - right: Put(P) or Call (C) - strike: Option Strike - default_fill: How to fill zero values for close. 'midpoint' or 'weighted_midpoint' - opttick: Option ticker, if provided, will ignore symbol, exp, right, strike and be initialized with the string - """ - - - super().__init__(symbol) - if default_fill not in ['midpoint', 'weighted_midpoint', None]: - raise ValueError("Expected default_fill to be one of: 'midpoint', 'weighted_midpoint', None ") - - assert all([symbol, exp,]), "symbol, exp, are required" - self.exp = exp - self.symbol = symbol - - self.default_fill = default_fill - self.db = DatabaseAdapter() - self.data_request = {} - self.save_thread = {} - self.current_request =None - self.spot_manager = SpotDataManager(self.symbol) - self.vol_manager = VolDataManager(self.symbol) - self.greek_manager = GreeksDataManager(self.symbol) - self.chain_manager = ChainDataManager(self.symbol) - self.greek_names = PRICING_CONFIG["AVAILABLE_GREEKS"] + ['greek', 'greeks'] - self.print_info = kwargs.get('print_info', False) - - ## Prefer to use dicts to avoid having too many attributes - self._eod = {} - - def get_timeseries(self, - start: str | datetime, - end: str | datetime, - interval: str = '1d', - type_: str = 'spot', - strikes_right: List[Tuple] = [], - model: str = 'bs', - extra_cols: list = []) -> pd.DataFrame: - """ - Query the timeseries data from ThetaData API or SQL Database. - Params: - start: Start date for the query - end: End date for the query - interval: Interval for the query. Options are: h, d, w, M, q, y - type_: Type of data to query. Options are: spot, vol, greeks, greek, attribution, scenario - model: Model to use for the query. Options are: bs, binomial - extra_cols: Extra columns to include in the query. Options are: ask, bid, open - strikes_right: List of tuples containing the strike and right for the options. Eg: [(250, 'C'), (225, 'P')] - """ - - if not strikes_right: - raise ValueError("Strikes cannot be empty") - - assert isinstance(strikes_right, list), f"Strikes has to be type list, recieved {type(strikes_right)}" - assert all([isinstance(x, tuple) for x in strikes_right]), f"Strikes has to be type list of tuples, recieved {type(strikes_right)}" - - ## Organize inputs - self.current_request = datetime.now().strftime("%Y%m%d %H:%M:%S") - start = pd.to_datetime(start) - end = pd.to_datetime(end) - ivl_str, ivl_int = extract_numeric_value(interval) - greek_names = self.greek_names - _extra_cols = handle_extra_cols(extra_cols, type_, model) - greek_cols = build_name_format('greek', model, extra_cols, self.default_fill) - vol_cols = build_name_format('vol', model, extra_cols, self.default_fill) - - - ## Enforce the interval - enforce_interval(ivl_str) - - ## Assert inputs - enforce_inputs(type_, model) - - ## Determine aggregation - agg, database, table = determine_table_agg(ivl_str, type_, greek_names) - input_params = getattr(self, agg) - - ## Determine the requested columns - requested_col = determine_requested_columns(self.default_fill, type_, model, greek_names) - - data_request = BulkOptionQueryRequestParameter(table_name=table, - db_name=database, - start_date=start, - end_date=end, - ticker=self.symbol, - exp=self.exp, - strikes=strikes_right) - - ## Set the parameters for the request to avoid having too many attributes - data_request.symbol = self.symbol - data_request.interval= interval - data_request.type_ = type_ - data_request.input_params = input_params - data_request.model = model - data_request.ivl_str = ivl_str - data_request.ivl_int = ivl_int - data_request.default_fill = self.default_fill - data_request.agg = agg - data_request.requested_col = requested_col + _extra_cols + ['optiontick'] - data_request.iv_cols = vol_cols - data_request.greek_cols = greek_cols - data_request.col_kwargs = col_kwargs = {'underlier_price': 's0', - 'expiration': 'exp_date', - 'strike': 'k', - 'right': 'right', - 'rf_rate': 'r', - 'dividend': 'y', - 'put/call': 'right', - 'datetime': 'datetime',} - self.data_request[self.current_request] = data_request ## save the request for future reference - - ## Start by getting query - init_query(data_request=data_request, db=self.db, query_category='bulk') - ## Next, pre process data available in database - self.pre_process_data(data_request=data_request) - - ## Before handling missing/incomplete data, we begin save to database - is_complete = data_request.pre_process['is_complete'] - is_empty = data_request.pre_process['is_empty'] - if is_empty or not is_complete: - SaveManager.enqueue(data_request, save_to_database) - # save_thread = Thread(target=save_to_database, args=(data_request, self.print_info), name = "save_to_database", daemon=True) - # save_thread.start() - # self.save_thread[self.current_request] = save_thread - # CENTRAL_SAVE_THREAD[self.current_request] = save_thread - # self.CLASS_THREADS[self.current_request] = save_thread - - ## Handle missing or incomplete data if any - self.__handle_incomplete_data(data_request=data_request) - - ## Post process the data - post_process(data_request=data_request, bulk = True) - - ## Format the data - format_final_data(data_request=data_request, bulk = True) - return data_request - - ## Make a function - def __handle_incomplete_data(self, **kwargs): - data_request = kwargs['data_request'] - is_complete = data_request.pre_process['is_complete'] - is_empty = data_request.pre_process['is_empty'] - start, end, type_ = data_request.start_date, data_request.end_date, data_request.type_ - - if is_empty: - raw_spot_data = self.spot_manager.query_thetadata(start=start, end=end, - strike=None, exp=self.exp, - right=None, bulk=True, - data_request=data_request) - data_request.raw_spot_data = raw_spot_data - if type_ != 'spot': - ## Add inputs to raw data, this is necessary for vol calculation - add_inputs_to_raw(self, data_request=data_request, bulk = True) ## Not formatting yet, this is to utilize joins on datetime - vol_data = self.vol_manager.calculate_iv(data_request=data_request) - # data_request.raw_spot_data = pd.concat([data_request.raw_spot_data, vol_data], axis=1) - if type_ in self.greek_names: - greek_data = self.greek_manager.calculate_greeks(type_, data_request = data_request) - format_raw_spot_data(data_request=data_request) - - - - elif not is_complete: - start_missing, end_missing = min(data_request.missing_dates), max(data_request.missing_dates) - raw_spot_data = self.spot_manager.query_thetadata(start=start_missing, end=end_missing, - strike=None, exp=self.exp, - right=None, bulk=True, - data_request=data_request) - - # raw_spot_data['Datetime'] = pd.to_datetime(raw_spot_data['Datetime']) - data_request.raw_spot_data = raw_spot_data - if type_ != 'spot': - add_inputs_to_raw(self, data_request=data_request, bulk = True) - vol_data = self.vol_manager.calculate_iv(data_request=data_request) - data_request.raw_spot_data = pd.concat([data_request.raw_spot_data, vol_data], axis=1) - if type_ in self.greek_names: - greek_data = self.greek_manager.calculate_greeks(type_, data_request = data_request) - data_request.raw_spot_data = pd.concat([data_request.raw_spot_data, greek_data], axis=1) - format_raw_spot_data(data_request=data_request) - - else: - data_request.raw_spot_data = pd.DataFrame() - - @classmethod - def pre_process_data(cls, **kwargs): - data_request = kwargs.get('data_request') - data = data_request.database_data - data_request.pre_process = {} - - ## Check timeseries is complete - ## Considering we're taking a resample approach, where base intraday data is 5 minutes, and EOD is 1 day - ## We will only check 5 minutes and 1 day is complete - - start, end = data_request.start_date, data_request.end_date - date_range = bus_range(start, end, '5Min') if data_request.agg == 'intra' else bus_range(start, end, '1B') - - ## Transform the data to Opttick as columns, close as values, datetime as index - transformed = data_request.database_data.pivot_table( - index = ['datetime'], - columns = ['optiontick'], - values = ['close'] - ) - transformed.columns = transformed.columns.droplevel(0) - - - ## First Completeness check: Do we have all OptTicks? - first_check = all(x in transformed.columns for x in data_request.opttick) - ## This will fill missing option ticks with NaN - transformed[[x for x in data_request.opttick if x not in transformed.columns.get_level_values(0)]] = np.nan - - - ## Second Completeness check: Do we have all dates? - missing_dates_second_check = [x for x in date_range if x not in (transformed.index)] - second_check = all(x in pd.DatetimeIndex(transformed.index) for x in date_range) - transformed = transformed.reindex(date_range, fill_value=np.nan) ## This will fill the missing dates with NaN - - ## Third Completeness check: If we have all Ticks, do all ticks have all dates? - ## This will exclude dates from second check - if not first_check: - third_check = False - else: - ## Check if all dates are present for all ticks - third_check = not transformed.isna().any().any() - - complete_check = first_check and second_check and third_check - - ## Is empty Check - is_empty = data_request.database_data.empty - - # Missing Dates: This will be tiered - if not first_check: ## This means all dates are missing for one name, we have to query all dates - missing_dates = date_range - else: ## This means some dates are missing for some names. - missing_dates = transformed[transformed.isna().any(axis = 1)].index.to_list() - - ## Save preprocessed data - data_request.pre_process['is_complete'] = complete_check - data_request.pre_process['is_empty'] = is_empty - data_request.missing_dates = missing_dates - - data = data[data_request.requested_col] ## Select only the requested columns - data.columns = [x.capitalize() for x in data.columns] ## Capitalize the columns - data.set_index([ 'Optiontick', 'Datetime',], inplace = True) ## Set the index to datetime - data = data[~data.index.duplicated(keep='first')] ## Remove duplicates - data.sort_index(inplace = True) - data_request.pre_processed_data = data - - @staticmethod - def one_off_save(start:str, - end:str, - tick:str, - exp:str, - print_info:bool = False): - """ - This function is used to save the data to the database without initializing the data manager - """ - bulk_one_off_save(start, end, tick, exp, print_info) - - -class OptionDataManager(_ManagerLazyLoader): - """ - Class to manage the option data for a given symbol. - It inherits from the _ManagerLazyLoader class to load data on demand. - It uses the OptionQueryRequestParameter class to handle the data requests. - It uses the DatabaseAdapter class to handle the database operations. - """ - - CLASS_THREADS = {} - - - @log_time(time_logger) - def __init__(self, - symbol: str = None, - exp: str | datetime = None, - right: str = None, - strike: float = None, - default_fill: str = 'midpoint', - opttick: str = None, - **kwargs) -> None: - """ - Returns an object for querying data - - Params: - symbol: Underlier symbol - exp: expiration - right: Put(P) or Call (C) - strike: Option Strike - default_fill: How to fill zero values for close. 'midpoint' or 'weighted_midpoint' - opttick: Option ticker, if provided, will ignore symbol, exp, right, strike and be initialized with the string - """ - - super().__init__(symbol) - if opttick is not None: - assert isinstance(opttick, str), f"opttick has to be type str, recieved {type(opttick)}" - option_meta = parse_option_tick(opttick) - self.symbol = option_meta['ticker'] - self.exp = option_meta['exp_date'] - self.right = option_meta['put_call'] - self.strike = option_meta['strike'] - self.opttick = opttick - - else: - assert isinstance(strike, float), f"Strike has to be type float, recieved {type(strike)}" - if default_fill not in ['midpoint', 'weighted_midpoint', None]: - raise ValueError("Expected default_fill to be one of: 'midpoint', 'weighted_midpoint', None ") - - assert all([symbol, exp, right, strike]), "symbol, exp, right, strike are required" - self.exp = exp - self.symbol = symbol - self.right = right.upper() - self.strike = strike - self.opttick = generate_option_tick_new(symbol, right, exp, strike) - - self.default_fill = default_fill - self.db = DatabaseAdapter() - self.data_request = {} - self.save_thread = {} - self.current_request =None - self.spot_manager = SpotDataManager(self.symbol) - self.vol_manager = VolDataManager(self.symbol) - self.greek_manager = GreeksDataManager(self.symbol) - self.chain_manager = ChainDataManager(self.symbol) - self.greek_names = PRICING_CONFIG["AVAILABLE_GREEKS"] + ['greek', 'greeks'] - self.print_info = kwargs.get('print_info', False) - - ## Prefer to use dicts to avoid having too many attributes - - def get_timeseries(self, - start: str | datetime, - end: str | datetime, - interval: str = '1d', - type_: str = 'spot', - model: str = 'bs', - extra_cols: list = []) -> pd.DataFrame: - """ - Query the timeseries data from ThetaData API or SQL Database. - - Params: - start: Start date for the query - end: End date for the query - interval: Interval for the query. Options are: h, d, w, M, q, y - type_: Type of data to query. Options are: spot, vol, greeks, greek, attribution, scenario - model: Model to use for the query. Options are: bs, binomial - extra_cols: Extra columns to include in the query. Options are: ask, bid, open - """ - - - ## Organize inputs - start = pd.to_datetime(start) - end = pd.to_datetime(end) - ivl_str, ivl_int = extract_numeric_value(interval) - greek_names = self.greek_names - self.current_request = datetime.now().strftime("%Y%m%d %H:%M:%S") - _extra_cols = handle_extra_cols(extra_cols, type_, model) - greek_cols = build_name_format('greek', model, extra_cols, self.default_fill) - vol_cols = build_name_format('vol', model, extra_cols, self.default_fill) - - ## Enforce the interval - enforce_interval(ivl_str) - - ## Assert inputs - enforce_inputs(type_, model) - - ## Determine aggregation - agg, database, table = determine_table_agg(ivl_str, type_, greek_names) - input_params = getattr(self, agg) - - ## Determine the requested columns - requested_col = determine_requested_columns(self.default_fill, type_, model, greek_names) - - data_request = OptionQueryRequestParameter(table_name=table, - db_name=database, - start_date=start, - end_date=end, - ticker=self.symbol, - exp=self.exp, - strike=self.strike, - right=self.right) - - ## Set the parameters for the request to avoid having too many attributes - data_request.opttick = self.opttick - data_request.symbol = self.symbol - data_request.interval= interval - data_request.type_ = type_ - data_request.input_params = input_params - data_request.model = model - data_request.ivl_str = ivl_str - data_request.ivl_int = ivl_int - data_request.default_fill = self.default_fill - data_request.agg = agg - data_request.requested_col = requested_col + _extra_cols - data_request.iv_cols = vol_cols - data_request.greek_cols = greek_cols - data_request.col_kwargs = col_kwargs = {'underlier_price': 's0', - 'expiration': 'exp_date', - 'strike': 'k', - 'right': 'right', - 'rf_rate': 'r', - 'dividend': 'y', - 'put/call': 'right', - 'datetime': 'datetime',} - self.data_request[self.current_request] = data_request ## save the request for future reference - - ## Start by getting query - init_query(data_request=data_request, db=self.db, query_category='single') - - ## Next, pre process data available in database - self.__pre_process_data(data_request=data_request) - - ## Before handling missing/incomplete data, we begin save to database - is_complete = data_request.pre_process['is_complete'] - is_empty = data_request.pre_process['is_empty'] - if is_empty or not is_complete: - SaveManager.enqueue(data_request, save_to_database) - BulkOptionDataManager.one_off_save(start, end, self.symbol, self.exp, print_info=self.print_info) - # save_thread = Thread(target=save_to_database, args=(data_request, self.print_info), name = "save_to_database", daemon=True) - # save_thread.start() - # self.save_thread[self.current_request] = save_thread - # CENTRAL_SAVE_THREAD[self.current_request] = save_thread - # self.CLASS_THREADS[self.current_request] = save_thread - - - ## Handle missing or incomplete data if any - self.__handle_incomplete_data(data_request=data_request) - ## Post process the data - post_process(data_request=data_request) - format_final_data(data_request=data_request) - - - - return data_request - - def get_at_time(self, - date: str | datetime, - type_: str = 'spot', - model: str = 'bs', - **kwargs) -> pd.DataFrame: - """ - Get data at a specific time - params: - - """ - - if type_ == 'chain': - return_price = kwargs.get('return_price', False) - if return_price: - self.current_request = datetime.now().strftime("%Y%m%d %H:%M:%S") - request = self.chain_manager.get_at_time(date) - data = request.post_processed_data.copy() - self.data_request[self.current_request] = request - data.columns = data.columns.str.capitalize() - data.rename(columns = {'Dte': 'DTE', 'Price': 'Midpoint'}, inplace=True) - chain = data.pivot_table( - index = ['Expiration', 'DTE', 'Strike'], - columns = ['Right'], - values = ['Midpoint'] - ) - else: - chain = self.Stock.option_chain(date = date) - return chain - - elif type_ in ['spot', 'vol'] + self.greek_names: - extra_cols = kwargs.get('extra_cols', []) - return self.get_timeseries(date, date, - interval = '1d', - type_ = type_, - model = model, - extra_cols=extra_cols).post_processed_data - - - def __pre_process_data(self, **kwargs): - - data_request = kwargs.get('data_request') - data = data_request.database_data - data_request.pre_process = {} - - ## Check if data is empty - if data.empty: - ## If data is empty, we will not be able to process it - data_request.pre_process['is_empty'] = True - else: - data_request.pre_process['is_empty'] = False - - ## Check timeseries is complete - ## Considering we're taking a resample approach, where base intraday data is 5 minutes, and EOD is 1 day - ## We will only check 5 minutes and 1 day is complete - - start, end = data_request.start_date, data_request.end_date - date_range = bus_range(start, end, '5Min') if data_request.agg == 'intra' else bus_range(start, end, '1B') - - ## Now we will check if the data is complete - is_complete = all([(x in pd.DatetimeIndex(data.datetime)) for x in date_range]) - missing_dates = [x for x in date_range if x not in pd.DatetimeIndex(data.datetime)] - data_request.pre_process['is_complete'] = is_complete - data_request.missing_dates = missing_dates - - ## Save preprocessed data - data = data[data_request.requested_col] ## Select only the requested columns - data.columns = [x.capitalize() for x in data.columns] ## Capitalize the columns - data.set_index('Datetime', inplace = True) ## Set the index to datetime - data = data[~data.index.duplicated(keep='first')] ## Remove duplicates - data_request.pre_processed_data = data - - def __handle_incomplete_data(self, **kwargs): - data_request = kwargs['data_request'] - is_complete = data_request.pre_process['is_complete'] - is_empty = data_request.pre_process['is_empty'] - start, end, type_ = data_request.start_date, data_request.end_date, data_request.type_ - - if is_empty: - raw_spot_data = self.spot_manager.query_thetadata(start=start, end=end, - strike=self.strike, exp=self.exp, - right=self.right, bulk=False, - data_request=data_request) - data_request.raw_spot_data = raw_spot_data - if type_ != 'spot': - ## Add inputs to raw data, this is necessary for vol calculation - add_inputs_to_raw(self, data_request=data_request) ## Not formatting yet, this is to utilize joins on datetime - vol_data = self.vol_manager.calculate_iv(data_request=data_request) - # data_request.raw_spot_data = pd.concat([data_request.raw_spot_data, vol_data], axis=1) - if type_ in self.greek_names: - greek_data = self.greek_manager.calculate_greeks(type_, data_request = data_request) - format_raw_spot_data(data_request=data_request) - - - - elif not is_complete: - start_missing, end_missing = min(data_request.missing_dates), max(data_request.missing_dates) - raw_spot_data = self.spot_manager.query_thetadata(start=start_missing, end=end_missing, - strike=self.strike, exp=self.exp, - right=self.right, bulk=False, - data_request=data_request) - - data_request.raw_spot_data = raw_spot_data - if type_ != 'spot': - add_inputs_to_raw(self, data_request=data_request) - vol_data = self.vol_manager.calculate_iv(data_request=data_request) - data_request.raw_spot_data = pd.concat([data_request.raw_spot_data, vol_data], axis=1) - if type_ in self.greek_names: - greek_data = self.greek_manager.calculate_greeks(type_, data_request = data_request) - data_request.raw_spot_data = pd.concat([data_request.raw_spot_data, greek_data], axis=1) - format_raw_spot_data(data_request=data_request) - - else: - data_request.raw_spot_data = pd.DataFrame() - - - - - - -#### Save to Database Functions -@log_error(logger) -def save_to_database(data_request: OptionQueryRequestParameter, print_info: bool = False): - """ - Saves the data to the database - """ - ## This function is using parallel apply to reduce overhead on the current process. - print(f"Saving data to {data_request.db_name}.{data_request.table_name}") if print_info else None - - ## Determine if the data is bulk or not - if isinstance(data_request, OptionQueryRequestParameter): - bulk = False - elif isinstance(data_request, BulkOptionQueryRequestParameter): - data_request.strike = None - data_request.right = None - bulk = True - else: - raise ValueError(f"Expected data_request to be of type OptionQueryRequestParameter or BulkOptionQueryRequestParameter, recieved {type(data_request)}") - - db = DatabaseAdapter() - if len(data_request.missing_dates) == 0: - print("No missing data, skipping save to database") if print_info else None - logger.warning("No missing data, skipping save to database") - return - start, end = pd.to_datetime(min(data_request.missing_dates)) - relativedelta(months=3), pd.to_datetime(max(data_request.missing_dates)) + relativedelta(months=3) - print(f"Querying data from {start} to {end}") if print_info else None - - ## Start by populating initial data from spot_manager - spot_manager = SpotDataManager(data_request.symbol) - spot_sm = spot_manager.query_thetadata(start, end, - strike=data_request.strike, exp=data_request.exp, - right=data_request.right, bulk=bulk, - data_request=data_request) - spot_sm = spot_sm.fillna(0) - print("Starting to save data to database") if print_info else None - if not bulk: - spot_sm['Strike'] = data_request.strike - spot_sm['Expiration'] = data_request.exp - spot_sm['Put/Call'] = data_request.right - spot_sm['OptionTick'] = data_request.opttick - spot_sm['Underlier'] = data_request.symbol - - else: - spot_sm.rename(columns = {'k':'strike','exp_date':'expiration', 'Right':'put/call', 'ticker':'Underlier'}, inplace = True) - - spot_sm['Underlier_price'] = data_request.input_params['s0_close']['close'] - spot_sm['RF_rate'] = data_request.input_params['r'] - spot_sm['dividend'] = data_request.input_params['y'] - spot_sm['RF_rate_name'] = data_request.input_params['r_name'] - spot_sm['Datetime'] = spot_sm.index - spot_sm.columns = [x.lower() for x in spot_sm.columns] - spot_sm.rename(columns = {'open_interest':'openinterest'}, inplace = True) - - ## Fix for missing data on intraday spot. - if data_request.agg == 'intra': - spot_sm = spot_sm[~spot_sm.underlier_price.isna()] - if spot_sm.empty: - logger.warning("Spot data is empty, skipping save to database") - print("Spot data is empty, skipping save to database") - return - - - ## Add the vol columns - print("Calculating Vols") if print_info else None - calc_vol_for_data_parallel(spot_sm, 'close', 'BS_IV', 'bs') - calc_vol_for_data_parallel(spot_sm, 'midpoint', 'Midpoint_BS_IV', 'bs') - calc_vol_for_data_parallel(spot_sm, 'weighted_midpoint', 'Weighted_Midpoint_BS_IV', 'bs') - calc_vol_for_data_parallel(spot_sm, 'closebid', 'bid_bs_iv', 'bs') - calc_vol_for_data_parallel(spot_sm, 'closeask', 'ask_bs_iv', 'bs') - - - calc_vol_for_data_parallel(spot_sm, 'close', 'Binomial_IV','binomial') - calc_vol_for_data_parallel(spot_sm, 'midpoint', 'Midpoint_binomial_IV', 'binomial') - calc_vol_for_data_parallel(spot_sm, 'weighted_midpoint', 'Weighted_Midpoint_binomial_IV', 'binomial') - calc_vol_for_data_parallel(spot_sm, 'closebid', 'bid_binomial_iv', 'binomial') - calc_vol_for_data_parallel(spot_sm, 'closeask', 'ask_binomial_iv', 'binomial') - spot_sm.columns = spot_sm.columns.str.lower() - data_request.spot_data = spot_sm.copy() - - - - ## Vol Resolve before Calculating Greeks, this vol is necessary for Greeks - - if data_request.agg != 'intra': - ## Will not be resolving vols for intra data - print("Resolving Vols") if print_info else None - try: - resolve_missing_vols_in_data(spot_sm, - [ 'midpoint_bs_iv', 'midpoint_binomial_iv'], - ['bs', 'binomial'], - ['midpoint', 'midpoint'], - agg = data_request.agg,) - except Exception as e: - vol_resolve_logger.error(f"Error resolving vols: {e}") - data_request.spot_data = spot_sm.copy() - data_request.error = e - save_failed_request(data_request, 'failed_vol_resolve.jsonl') - print(f"Error resolving vols: {e}") if print_info else None - - - - ## Add the greek columns - print("Calculating Greeks") if print_info else None - calc_greeks_for_data_parallel(spot_sm, 'bs', 'bs_iv', '{x}') - calc_greeks_for_data_parallel(spot_sm, 'bs', 'midpoint_bs_iv', 'midpoint_{x}') - calc_greeks_for_data_parallel(spot_sm, 'bs', 'weighted_midpoint_bs_iv', 'weighted_midpoint_{x}') - - calc_greeks_for_data_parallel(spot_sm, 'binomial', 'bid_binomial_iv', 'bid_binomial_{x}') - calc_greeks_for_data_parallel(spot_sm, 'binomial', 'ask_binomial_iv', 'ask_binomial_{x}') - calc_greeks_for_data_parallel(spot_sm, 'binomial', 'binomial_iv', 'binomial_{x}') - calc_greeks_for_data_parallel(spot_sm, 'binomial', 'midpoint_binomial_iv', 'midpoint_binomial_{x}') - spot_sm.columns = spot_sm.columns.str.lower() - - ## Add the dollar delta columns - calc_dollar_delta_from_data(spot_sm, 'delta', 'dollar_delta') - calc_dollar_delta_from_data(spot_sm, 'midpoint_delta', 'midpoint_dollar_delta') - calc_dollar_delta_from_data(spot_sm, 'weighted_midpoint_delta', 'weighted_midpoint_dollar_delta') - - ## Add the last updated column - spot_sm['last_updated'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S') - - ## Add the vol resolve columns - spot_sm['midpoint_bs_vol_resolve'] = 0 - spot_sm['midpoint_binomial_vol_resolve'] = 0 - - ## Finally, save the data to the database - print("Saving data to database") if print_info else None - data_request.pre_save_to_db_data = spot_sm.copy() - db.save_to_database(spot_sm, data_request.db_name, data_request.table_name) - data_request.saved_to_db_data = spot_sm - - return spot_sm - -@log_error(logger) -def bulk_one_off_save( - start: str | datetime, - end: str | datetime, - tick: str, - exp: str, - print_info: bool = False, -): - """ - This function is used to save the data to the database without initializing the data manager - """ - global CENTRAL_SAVE_THREAD - current_request = datetime.now().strftime("%Y%m%d %H:%M:%S") - missing_dates = [start, end] - dummy_request = BulkOptionQueryRequestParameter( - table_name='temp_options_eod_new', - db_name='securities_master', - start_date=start, - end_date=end, - ticker=tick, - exp=exp, - ) - dummy_request.agg = 'eod' - dummy_request.start_date = start - dummy_request.end_date = end - dummy_request.missing_dates = missing_dates - lazy_loader = _ManagerLazyLoader(tick) - lazy_loader.exp = dummy_request.exp - dummy_request.input_params = lazy_loader.eod - SaveManager.enqueue(dummy_request, save_to_database) - # save_thread = Thread(target=save_to_database, args=(dummy_request,print_info), name = "save_to_database_one_off", daemon=True) - # save_thread.start() - # CENTRAL_SAVE_THREAD[current_request] = save_thread - - - -## DataManager Procedure Functions - -def enforce_interval(ivl_str: str): - ## Enforce the interval - try: - ## We want to throw an error if the interval is not in the available intervals + if we get query for minute data 'm' - PRICING_CONFIG['AVAILABLE_INTERVALS'].remove('m') ## Remove minute data from available intervals - except: - pass - - - if ivl_str.lower() not in PRICING_CONFIG["AVAILABLE_INTERVALS"] and ivl_str != 'M': ## Want to avoid minute data - raise ValueError(f"Expected interval to be one of: {PRICING_CONFIG['AVAILABLE_INTERVALS']}") - - if ivl_str == 'm': ## Minute data not available - raise AttributeError("Minute data currently unavailable, please go higher") - - return - -def enforce_inputs(type_:str, model:str) -> None: - ## Assert inputs - if type_ not in ['spot', 'vol', 'vega', 'vanna', 'volga', 'delta', 'gamma', 'theta', 'rho', 'greeks', 'greek', 'attribution', 'scenario']: - raise ValueError("Expected type_ to be one of: ['spot', 'vol', 'vega', 'vanna', 'volga', 'delta', 'gamma', 'theta', 'rho', 'greeks', 'greek', 'attribution', 'scenario']") - if model not in ['bs', 'binomial', 'mc']: ## Only Black Scholes, binomial tree, monte carlo - raise ValueError(f"Expected model to be one of: {PRICING_CONFIG['AVAILABLE_PRICING_MODELS']}") - return - -def determine_table_agg(ivl_str: str, type_: str, greek_names: list) -> tuple: - ## Determine aggregation - if ivl_str in ['h', 'm']: - agg = 'intra' - else: - agg = 'eod' - - ## Table to query, picking based on interval & type - if type_ in greek_names: - database, table = TABLES[agg]['greeks'].split('.') - else: - database, table = TABLES[agg][type_].split('.') - - return agg, database, table - - -def determine_requested_columns(default_fill:str, type_:str, model:str, greek_names:list) -> list: - if type_ == 'spot': - requested_col = ['datetime', 'open', 'high', 'low', 'close', default_fill.lower(),'volume', 'openinterest'] - - elif type_ == 'vol': - requested_col = ['datetime', f"{model}_iv".lower(), f"{default_fill.lower()}_{model}_iv".lower()] - - elif type_ in greek_names: - ## If Statement logic to format a the list of greek names to be used - if type_ not in ['greek', 'greeks']: - if model == 'bs': - requested_col = ['datetime'] + [f"{default_fill}_{type_}".lower()] + [f"{type_}".lower()] - else: - requested_col = ['datetime'] + [f"{model}_{type_}".lower()] + [f"{default_fill.lower()}_{model}_{type_}".lower()] - else: - if model == 'bs': - requested_col = ['datetime'] + [f"{x}".lower() for x in greek_names if x not in ['greek', 'greeks']] + [f"{default_fill.lower()}_{x}".lower() for x in greek_names if x not in ['greek', 'greeks']] - else: - requested_col = ['datetime'] + [f"{model}_{x}".lower() for x in greek_names if x not in ['greek', 'greeks']] + [f"{default_fill.lower()}_{model}_{x}".lower() for x in greek_names if x not in ['greek', 'greeks']] - - elif type_ == 'attribution': - raise NotImplementedError("Attribution data not implemented yet") - - elif type_ == 'scenario': - raise NotImplementedError("Scenario data not implemented yet") - - elif type_ == 'chain': - raise IncorrectExecutionError("Chain Data does not return a timeseries, returns at_time") - else: - raise KeyError(f"Type {type_} not in requested columns") - return requested_col - - -def format_raw_spot_data( **kwargs): - """ - Adds necessary formatting. To avoid overpopulating the __handle_incomplete_data method - """ - data_request = kwargs.get('data_request') - raw_spot_data = data_request.raw_spot_data - if raw_spot_data.empty: - print("Format raw found this empty") - data_request.raw_spot_data = pd.DataFrame() - - else: - raw_spot_data.reset_index(inplace = True) - raw_spot_data.columns = [x.lower() for x in raw_spot_data.columns] - raw_spot_data = raw_spot_data[raw_spot_data.datetime.isin(data_request.missing_dates)] - if 'index' in raw_spot_data.columns: - raw_spot_data.drop(columns=['index'], inplace=True) - data_request.raw_spot_data = raw_spot_data - - -def post_process( **kwargs): - """ - Post process the data after all the calculations - """ - - data_request = kwargs.get('data_request') - bulk = kwargs.get('bulk', False) - is_complete = data_request.pre_process['is_complete'] - is_empty = data_request.pre_process['is_empty'] - raw_spot_data = data_request.raw_spot_data.copy() - - if not is_empty and is_complete: - ## If not empty and data complete, no need formatting. Just return from db - final_data = data_request.pre_processed_data.copy() - data_request.post_processed_data = final_data - return - - ## Start by renaming the columns to match the database. - rename_columns = {'open_interest': 'openinterest'} - try: - raw_spot_data.rename(columns=rename_columns, inplace=True) - except KeyError as e: - pass - - ## Filter the columns to only the requested columns - raw_spot_data = raw_spot_data[data_request.requested_col] - - ## Capitalize the columns & set the index to datetime - raw_spot_data.columns = [x.capitalize() for x in raw_spot_data.columns] - if bulk: - raw_spot_data.set_index(['Optiontick','Datetime'], inplace=True) - else: - raw_spot_data.set_index('Datetime', inplace=True) - raw_spot_data = raw_spot_data[~raw_spot_data.index.duplicated(keep='first')] - - if is_empty: - ## If the data is empty, the final data is the raw data - final_data = raw_spot_data - elif not is_complete: - ## Else we will have to merge the data - final_data = pd.concat([data_request.pre_processed_data, raw_spot_data], axis=0) - - - final_data = final_data[~final_data.index.duplicated(keep='first')] - final_data.columns = [x.capitalize() for x in final_data.columns] - final_data.sort_index(inplace=True) - - if bulk: - ## For final data, we will filter for the Option Tick we need - final_data = final_data[final_data.index.get_level_values('Optiontick').isin(data_request.opttick)] - - data_request.post_processed_data = final_data - return data_request.post_processed_data - - -def format_final_data(**kwargs): - """ - Format the final data to match the database - """ - data_request = kwargs.get('data_request') - bulk = kwargs.get('bulk', False) - ## Resample the data to the requested interval - resampled = resample( data_request.post_processed_data, - data_request.interval, - {col: 'ffill' for col in data_request.post_processed_data.columns}) - if bulk: - resampled.index = resampled.index.swaplevel() - data_request.post_processed_data = resampled - - -@log_error(logger) -def init_query(**kwargs): - - """ - Initialize the query for the data request and save the data to the request - """ - data_request = kwargs.get('data_request') - db = kwargs.get('db', DatabaseAdapter()) - try: - query_category = kwargs['query_category'] - except KeyError: - raise KeyError("Query category not specified, expected one of: ['single', 'bulk', 'chain']") - - if query_category == 'single': - query = f"""SELECT * - FROM {data_request.db_name}.{data_request.table_name} - WHERE OPTIONTICK = '{data_request.opttick}' AND - DATETIME >= '{data_request.start_date}' AND - DATETIME <= '{data_request.end_date}' - """ - database_data = db.query_database(data_request.db_name, data_request.table_name, query) - database_data.columns = [x.lower() for x in database_data.columns] - data_request.query = query - data_request.database_data = database_data - return database_data - - ############# Bulk Query - elif query_category == 'bulk': - strikes = data_request.strikes - opttick_list = [f"{generate_option_tick_new(data_request.symbol, right, data_request.exp, strike)}" for strike, right in strikes] - data_request.opttick = opttick_list ## save the opttick list for future reference - str_list = [f"'{x}'" for x in opttick_list] - filter_str = f"({', '.join(str_list)})" - query = f"""SELECT * - FROM {data_request.db_name}.{data_request.table_name} - WHERE OPTIONTICK in {filter_str} AND - DATETIME >= '{data_request.start_date}' AND - DATETIME <= '{data_request.end_date}' - """ - database_data = db.query_database(data_request.db_name, data_request.table_name, query) - database_data.columns = [x.lower() for x in database_data.columns] - data_request.query = query - data_request.database_data = database_data - return database_data - - ############# Chain Query - elif query_category == 'chain': - query = f"""SELECT * - FROM {data_request.db_name}.{data_request.table_name} - WHERE TICKER = '{data_request.symbol}' AND - BUILD_DATE = '{data_request.date} 16:00:00' - """ - - database_data = db.query_database(data_request.db_name, data_request.table_name, query) - database_data.columns = [x.lower() for x in database_data.columns] - data_request.query = query - data_request.database_data = database_data - return database_data - - -def add_inputs_to_raw(self, **kwargs): - """ - Adds Inputs to raw_spot_data for Vol & other necessary uses - """ - data_request = kwargs.get('data_request') - bulk = kwargs.get('bulk', False) - if not bulk: - if not data_request.raw_spot_data.empty: - data_request.raw_spot_data['s0'] = data_request.input_params['s0_chain']['close'] - data_request.raw_spot_data['y'] = data_request.input_params['y'] - data_request.raw_spot_data['r'] = data_request.input_params['r'] - data_request.raw_spot_data['K'] = self.strike - data_request.raw_spot_data['exp_date'] = self.exp - data_request.raw_spot_data['right'] = self.right - else: - if not data_request.raw_spot_data.empty: - data_request.raw_spot_data['s0'] = data_request.input_params['s0_chain']['close'] - data_request.raw_spot_data['y'] = data_request.input_params['y'] - data_request.raw_spot_data['r'] = data_request.input_params['r'] - - - - -##### Calculation Functions -@log_error(logger) -def calc_vol_for_data( - df, - price_col, - col_name, - model, - col_kwargs = None -) -> pd.DataFrame: - """ - Adds a vol column to passed dataframe. - - Parameters: - df: DataFrame containing following columns: `underlier_price`, `strike`, `expiration`, `datetime`, `rf_rate`, `dividend`, `put/call` - price_col: Column to back out Implied Vol from - model: bs or binomial - col_name: name of added column - col_kwargs: dictionary with keys as column names in df and values as the corresponding column names in the model - expected keys: `underlier_price`, `strike`, `expiration`, `datetime`, `rf_rate`, `dividend`, `put/call` - - ps: This function both returns a DataFrame and modifies the passed DataFrame in place. You can use the returned DataFrame or the modified one. - - returns pd.DataFrame - """ - enforce_allowed_models(model) - - if not col_kwargs: - col_kwargs = { - 'underlier_price': 'underlier_price', - 'strike': 'strike', - 'expiration': 'expiration', - 'datetime': 'datetime', - 'rf_rate': 'rf_rate', - 'dividend': 'dividend', - 'put/call': 'put/call', - } - - if model == 'bs': - df[col_name] = df.apply( - lambda x:IV_handler(S = x[col_kwargs['underlier_price']], - K = x[col_kwargs['strike']], - price = x[price_col], - t = time_distance_helper(x[col_kwargs['expiration']], x[col_kwargs['datetime']]), - r = x[col_kwargs['rf_rate']], - q = x[col_kwargs['dividend']], - flag = x[col_kwargs['put/call']].lower()), axis = 1 - ) - - elif model == 'binomial': - df[col_name] = df.apply( - lambda x: binomial_implied_vol(price = x[price_col], - S = x[col_kwargs['underlier_price']], - K = x[col_kwargs['strike']], - r = x[col_kwargs['rf_rate']], - exp_date=x[col_kwargs['expiration']], - option_type=x[col_kwargs['put/call']].lower(), - pricing_date=x[col_kwargs['datetime']], - dividend_yield=x[col_kwargs['dividend']]), axis=1 - ) - return df - -@log_error(logger) -def calc_vol_for_data_parallel( - df, - price_col, - col_name, - model, - col_kwargs = None, - pool = POOL_ENABLED -) -> pd.DataFrame: - """ - Adds a vol column to passed dataframe. But parallelizes the calculation using multiprocessing or threading. - - Parameters: - df: DataFrame containing following columns: `underlier_price`, `strike`, `expiration`, `datetime`, `rf_rate`, `dividend`, `put/call` - price_col: Column to back out Implied Vol from - model: bs or binomial - col_name: name of added column - col_kwargs: dictionary with keys as column names in df and values as the corresponding column names in the model - expected keys: `underlier_price`, `strike`, `expiration`, `datetime`, `rf_rate`, `dividend`, `put/call` - pool: bool, if True, use multiprocessing pool for parallel processing. Default is POOL_ENABLED. False will use single-threaded processing. - - ps: This function both returns a DataFrame and modifies the passed DataFrame in place. You can use the returned DataFrame or the modified one. - - returns pd.DataFrame - """ - enforce_allowed_models(model) - - if not col_kwargs: - col_kwargs = { - 'underlier_price': 'underlier_price', - 'strike': 'strike', - 'expiration': 'expiration', - 'datetime': 'datetime', - 'rf_rate': 'rf_rate', - 'dividend': 'dividend', - 'put/call': 'put/call', - } - temp_df = df.copy() - temp_df.rename(columns=col_kwargs, inplace=True) - temp_df['t'] = temp_df.apply(lambda x: time_distance_helper(x[col_kwargs['expiration']], x[col_kwargs['datetime']]), axis=1) - binomial_column = [price_col, col_kwargs['underlier_price'], - col_kwargs['strike'], col_kwargs['rf_rate'], col_kwargs['expiration'], - col_kwargs['put/call'], col_kwargs['datetime'], col_kwargs['dividend'],] - - bs_column = [price_col, col_kwargs['underlier_price'], col_kwargs['strike'], 't', col_kwargs['rf_rate'], col_kwargs['dividend'], col_kwargs['put/call']] - if model == 'bs': - df[col_name] = parallel_apply(temp_df[bs_column], IV_handler) - - elif model == 'binomial': - df[col_name] = parallel_apply(temp_df[binomial_column], binomial_implied_vol) - return df - -@log_error(logger) -def calc_greeks_for_data( - df, - model, - vol_col, - greek_name_format, - col_kwargs = None, - greek_name = None -) -> pd.DataFrame: - """ - Adds a greek column to passed dataframe. - - Parameters: - df: DataFrame containing following columns: `underlier_price`, `strike`, `expiration`, `datetime`, `rf_rate`, `dividend`, `put/call` - model: bs or binomial - greek_name: Format of greek name. Eg "Midpoint_BS_{x}" or "Midpoint_binomial_{x}" - - ps: This function both returns a DataFrame and modifies the passed DataFrame in place. You can use the returned DataFrame or the modified one. - returns pd.DataFrame - """ - enforce_allowed_models(model) - if not col_kwargs: - col_kwargs = { - 'underlier_price': 'underlier_price', - 'strike': 'strike', - 'expiration': 'expiration', - 'datetime': 'datetime', - 'rf_rate': 'rf_rate', - 'dividend': 'dividend', - 'put/call': 'put/call', - } - - if not greek_name: - if model == 'bs': - greek = df.apply( - lambda x:Calculate.greeks(S = x[col_kwargs['underlier_price']], - K = x[col_kwargs['strike']], - r = x[col_kwargs['rf_rate']], - sigma = x[vol_col], - start = x[col_kwargs['datetime']].strftime('%Y-%m-%d'), - flag =x[col_kwargs['put/call']].lower(), - exp = x[col_kwargs['expiration']], - y = x[col_kwargs['dividend']]), axis = 1, result_type = 'expand' - ) - elif model == 'binomial': - greek = df.apply( - lambda x:Calculate.greeks(S = x[col_kwargs['underlier_price']], - K = x[col_kwargs['strike']], - r = x[col_kwargs['rf_rate']], - sigma = x[vol_col], - start = x[col_kwargs['datetime']].strftime('%Y-%m-%d'), - flag =x[col_kwargs['put/call']].lower(), - exp = x[col_kwargs['expiration']], - y = x[col_kwargs['dividend']], - model = model), axis = 1, result_type = 'expand' - ) - greek.columns = [greek_name_format.format(x=x) for x in greek.columns] - df[greek.columns] = greek - return df - else: - calc_func = getattr(Calculate, greek_name.lower()) - greek = df.apply( - lambda x:calc_func(S = x[col_kwargs['underlier_price']], - K = x[col_kwargs['strike']], - r = x[col_kwargs['rf_rate']], - sigma = x[vol_col], - start = x[col_kwargs['datetime']].strftime('%Y-%m-%d'), - flag =x[col_kwargs['put/call']].lower(), - exp = x[col_kwargs['expiration']], - y = x[col_kwargs['dividend']]), axis = 1) - - df[greek_name_format.format(x=greek_name)] = greek - return df - -@log_error(logger) -def calc_greeks_for_data_parallel( - df, - model, - vol_col, - greek_name_format, - col_kwargs = None, - greek_name = None, - pool = POOL_ENABLED -) -> pd.DataFrame: - """ - Adds a greek column to passed dataframe. This function parallelizes the calculation using multiprocessing or threading. - - Parameters: - df: DataFrame containing following columns: `underlier_price`, `strike`, `expiration`, `datetime`, `rf_rate`, `dividend`, `put/call` - model: bs or binomial - greek_name: Format of greek name. Eg "Midpoint_BS_{x}" or "Midpoint_binomial_{x}" - pool: bool, if True, use multiprocessing pool for parallel processing. Default is POOL_ENABLED. False will use single-threaded processing. - ps: This function both returns a DataFrame and modifies the passed DataFrame in place. You can use the returned DataFrame or the modified one. - - returns pd.DataFrame - """ - enforce_allowed_models(model) - if not col_kwargs: - col_kwargs = { - 'underlier_price': 'underlier_price', - 'strike': 'strike', - 'expiration': 'expiration', - 'datetime': 'datetime', - 'rf_rate': 'rf_rate', - 'dividend': 'dividend', - 'put/call': 'put/call', - } - - temp_df = df.copy() - temp_df.rename(columns=col_kwargs, inplace=True) - temp_df['t'] = temp_df.apply(lambda x: time_distance_helper(x[col_kwargs['expiration']], x[col_kwargs['datetime']]), axis=1) - temp_df['asset'] = None - temp_df['model'] = model - greeks_colums_use = ['asset',col_kwargs['underlier_price'], col_kwargs['strike'], - col_kwargs['rf_rate'], vol_col, - col_kwargs[ 'datetime'], col_kwargs['put/call'], col_kwargs['expiration'], col_kwargs['dividend'], 'model'] - - if not greek_name: - greek = parallel_apply(temp_df[greeks_colums_use], Calculate.greeks) - greek = pd.DataFrame(greek) - greek.columns = [greek_name_format.format(x=x) for x in greek.columns] - greek.index = temp_df.index - df[greek.columns] = greek - return df - else: - calc_func = getattr(Calculate, greek_name.lower()) - greek = parallel_apply(temp_df[greeks_colums_use], calc_func) - df[greek_name_format.format(x=greek_name)] = greek - return df - -@log_error(logger) -def calc_dollar_delta_from_data( - df, - delta_col, - col_name -) -> pd.DataFrame: - """ - Adds a Dollar Delta Column to passed dataframe - - parameters: - df: DataFrame containing following columns: `underlier_price`, `strike`, `expiration`, `datetime`, `rf_rate`, `dividend`, `put/call` - delta_col: Delta Column to use in multiplication - col_name: Format for added columns. Eg "midpoint_dollar_delta" - """ - - df[col_name] = df['underlier_price'] * df[delta_col] - return df - -@log_error(logger) -def resolve_missing_vols_in_data( - df, - vol_resolve_list, - model_map_list, - price_map_list, - agg, -): - """ - Resolves missing vols in passed dataframe - - parameters: - df: DataFrame containing following columns: `underlier_price`, `strike`, `expiration`, `datetime`, `rf_rate`, `dividend`, `put/call` - vol_resolve_list: List of columns to resolve missing vols in - model_map_list: List of models to use for resolving missing vols. Maps according to vol_resolve_list index - price_map_list: List of columns to use for pricing. Maps according to vol_resolve_list index - """ - for col, model, price_col in zip(vol_resolve_list, model_map_list, price_map_list): - zero_vol = df[col] == 0 - resolved_vols = df[zero_vol].apply( - lambda x:resolve_missing_vol( - underlier = x['underlier'], - expiration = x['expiration'], - strike = x['strike'], - put_call = x['put/call'], - datetime = x['datetime'], - S = x['underlier_price'], - r = x['rf_rate'], - q = x['dividend'], - pricing_model = model, - agg = agg, - ), axis = 1) - df.loc[zero_vol, col] = resolved_vols - new_pv = df[zero_vol].apply( - lambda x: optionPV_helper( - spot_price = x['underlier_price'], - strike_price = x['strike'], - exp_date = x['expiration'], - risk_free_rate = x['rf_rate'], - dividend_yield = x['dividend'], - volatility = x[col], - putcall = x['put/call'], - settlement_date_str= x['datetime'], - model = model, - ), axis = 1 - ) - df.loc[zero_vol, price_col] = new_pv - - - return df - - -### DataManager Helper Functions - -def handle_extra_cols(extra_cols, type_, model): - return_cols = [] - if extra_cols: - assert all([x in ['ask', 'bid', 'open'] for x in extra_cols]), f"Expected extra_cols to be one of: ['ask', 'bid', 'open'] received {extra_cols}" - - if type_ == 'spot': - for col in extra_cols: - if col == 'ask': - return_cols.append('closeask') - elif col == 'bid': - return_cols.append('closebid') - elif col == 'open': - return_cols.append('open') - - elif type_ == 'vol': - for col in extra_cols: - if col == 'ask': - return_cols.append(f'ask_{model}_iv') - elif col == 'bid': - return_cols.append(f'bid_{model}_iv') - elif col == 'open': - logger.critical("Open not implemented for vol data") - return [] - - elif type_ in ['greeks', 'greek']: - if model == 'bs': - logger.critical("Extra Cols not implemented for BS Greeks") - return [] - - elif model == 'binomial': - for col in extra_cols: - if col == 'ask': - return_cols.extend([f'ask_{model}_{x}' for x in PRICING_CONFIG['AVAILABLE_GREEKS']]) - elif col == 'bid': - return_cols.extend([f'bid_{model}_{x}' for x in PRICING_CONFIG['AVAILABLE_GREEKS']]) - elif col == 'open': - logger.critical("Open not implemented for greek data") - return [] - - elif type_ in PRICING_CONFIG['AVAILABLE_GREEKS']: - if model == 'bs': - logger.critical("Extra Cols not implemented for BS Greeks") - return [] - for col in extra_cols: ## Only binomial will have extra cols - if col == 'ask': - return_cols.append(f'ask_{model}_{type_}') - elif col == 'bid': - return_cols.append(f'bid_{model}_{type_}') - elif col == 'open': - logger.critical("Open not implemented for greek data") - return [] - - return return_cols - -def build_name_format(type_, model, extra_cols, default_fill): - """ - Build the name format for the columns - """ - name_format = {} - - if type_ == 'vol': - if model == 'bs': - name_format['close'] = 'bs_iv' - name_format[f"{default_fill}"] = f"{default_fill}_bs_iv" - - ## Handle extra columns - for col in extra_cols: - if col.lower() in ['open']: - continue - name_format[f"close{col}"] = handle_extra_cols([col], type_, model)[0] - - - elif model == 'binomial': - name_format['close'] = 'binomial_iv' - name_format[f"{default_fill}"] = f"{default_fill}_binomial_iv" - for col in extra_cols: - if col.lower() in ['open']: - continue - name_format[f"close{col}"] = handle_extra_cols([col], type_, model)[0] - - elif type_ in ['greek', 'greeks']: - if model == 'bs': - name_format['bs_iv'] = '{x}' - name_format[f"{default_fill}_bs_iv"] = f'{default_fill}_'+'{x}' - if extra_cols: - pass ## Figure out how to handle extra cols - - elif model == 'binomial': - name_format['binomial_iv'] = 'binomial_{x}' - name_format[f"{default_fill}_binomial_iv"] = f'{default_fill}_binomial_'+'{x}' - for col in extra_cols: - name_format[f"{col}_binomial_iv"] = f"{col}_{model}_" +"{x}" - - elif type_ in PRICING_CONFIG['AVAILABLE_GREEKS']: - if model == 'bs': - name_format['bs_iv'] = '{x}' - name_format[f"{default_fill}_bs_iv"] = f'{default_fill}_'+'{x}' - elif model == 'binomial': - name_format['binomial_iv'] = 'binomial_{x}' - name_format[f"{default_fill}_binomial_iv"] = f'{default_fill}_binomial_'+'{x}' - for col in extra_cols: - name_format[f"{col}_binomial_iv"] = f"{col}_{model}_" +"{x}" - - - return name_format \ No newline at end of file diff --git a/trade/assets/helpers/DataManagers_new/SaveManager.py b/trade/assets/helpers/DataManagers_new/SaveManager.py deleted file mode 100644 index f28fd56..0000000 --- a/trade/assets/helpers/DataManagers_new/SaveManager.py +++ /dev/null @@ -1,111 +0,0 @@ -from queue import Queue, Full -import threading -from threading import Thread, Lock -from trade.helpers.helper import setup_logger -import os, sys -import json -import pandas as pd - - -logger = setup_logger("SaveManager.py") - - - -def flatten_all_dfs(request): - """ - Flattens all dataframes in the request object. - """ - for key, value in request.__dict__.items(): - if isinstance(value, pd.DataFrame): - request.__dict__[key] = value.to_dict(orient="records") - elif isinstance(value, pd.Series): - request.__dict__[key] = value.to_dict() - return request - - -def save_failed_request(request, filename='failed_request.jsonl'): - """ - Saves the failed request to a JSON file. - """ - request = flatten_all_dfs(request) - with open(f'{os.environ["WORK_DIR"]}/module_test/raw_code/DataManagers/{filename}', 'a') as f: - json.dump(request.__dict__, f, default=str) - f.write('\n') - - - - - -#### Save Manager (From ChatGPT) -class SaveManager: - MAX_QUEUE_SIZE = 100 - WORKER_COUNT = 4 - _queue = Queue(maxsize=MAX_QUEUE_SIZE) - _threads = [] - _started = False - _finished_requests = [] - _lock = Lock() - _current_requests = {} - _failed_requests = [] - - @classmethod - def _worker(cls): - while True: - thread_name = threading.current_thread().name ## Get the name of the current thread - pack = cls._queue.get() - request, save_func = pack - if request is None: - break - try: - with cls._lock: ## Ensures that only one thread can access this block at a time - cls._current_requests[thread_name] = request - save_func(request) - - with cls._lock: - cls._finished_requests.append(request) - del cls._current_requests[thread_name] - - except Exception as e: - logger.error(f"[SaveWorker] Error processing save: {e}") - - with cls._lock: - cls._failed_requests.append(request) - request.error = e - request.class_name = request.__class__.__name__ - save_failed_request(request) - del cls._current_requests[thread_name] - finally: - cls._queue.task_done() - - @classmethod - def start_workers(cls): - if cls._started: - return - for _ in range(cls.WORKER_COUNT): - t = Thread(target=cls._worker, daemon=True) - t.start() - cls._threads.append(t) - cls._started = True - logger.info(f"[SaveManager] Started {cls.WORKER_COUNT} save workers.") - - @classmethod - def enqueue(cls, data_request, save_func): - try: - print(f"[SaveManager] Enqueueing save request for {data_request.symbol} on {data_request}") - cls._queue.put((data_request, save_func), block=False) # Will raise Full if over limit - except Full: - logger.warning(f"[SaveManager] Save queue full (max {cls.MAX_QUEUE_SIZE}). Task ignored.") - - @classmethod - def status(cls): - return { - "pending_tasks": cls._queue.qsize(), - "max_queue_size": cls._queue.maxsize, - "active_threads": sum(t.is_alive() for t in cls._threads), - "total_threads": len(cls._threads), - "current_requests": cls._current_requests, - "num_finished_requests": len(cls._finished_requests), - "num_failed_requests": len(cls._failed_requests), - } - -SaveManager.start_workers() \ No newline at end of file diff --git a/trade/assets/helpers/DataManagers_new/__init__.py b/trade/assets/helpers/DataManagers_new/__init__.py deleted file mode 100644 index 9ba449e..0000000 --- a/trade/assets/helpers/DataManagers_new/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -from .DataManagers import * -from .SaveManager import * - -__all__ =[ - 'ChainDataRequest', - 'OptionQueryRequestParameter', - 'BulkOptionQueryRequestParameter', - '_ManagerLazyLoader', - 'ChainDataManager', - 'BulkOptionDataManager', - 'OptionDataManager', - 'SaveManager', -] \ No newline at end of file diff --git a/trade/assets/rates.py b/trade/assets/rates.py index 4eec786..7d75e17 100644 --- a/trade/assets/rates.py +++ b/trade/assets/rates.py @@ -10,10 +10,11 @@ import yfinance as yf import pandas as pd import warnings -from trade.helpers.helper import change_to_last_busday, setup_logger, retrieve_timeseries +from trade.helpers.helper import change_to_last_busday, setup_logger, ny_now from threading import Thread import logging from pandas.tseries.offsets import BDay +import time warnings.filterwarnings("ignore") logger = setup_logger("rates") @@ -25,6 +26,7 @@ ## Rates cache variable _rates_cache = None +DAILY_RATES_CACHE = None def reset_rates_cache(): @@ -32,7 +34,9 @@ def reset_rates_cache(): Reset the rates cache """ global _rates_cache + global DAILY_RATES_CACHE _rates_cache = None + DAILY_RATES_CACHE = None logger.info("Rates cache reset") @@ -40,7 +44,7 @@ def deannualize(annual_rate, periods=365): return (1 + annual_rate) ** (1 / periods) - 1 -def get_risk_free_rate_helper(interval="1d", use="db"): +def get_risk_free_rate_helper(interval="1d", use="db") -> pd.DataFrame: # download 3-month us treasury bills rates """ Return timeseries of 3-month US treasury bills rates @@ -54,9 +58,10 @@ def get_risk_free_rate_helper(interval="1d", use="db"): Source of the data. Default is 'yf', other option is 'db' """ - data = _fetch_rates(interval=interval).copy() - data = resample(data, interval) + + if interval != "1d": + data = resample(data, interval) data = data[~data.index.duplicated(keep="first")] return data ## Not adding the resample schema for now @@ -66,8 +71,29 @@ def _fetch_rates(interval): Handles _rates_cache logic picking """ global _rates_cache + global DAILY_RATES_CACHE + + choice_cache = _rates_cache if interval != "1d" else DAILY_RATES_CACHE + + if ny_now().hour < 25: + print("Fetching rates data from yfinance directly during market hours") + ## Just use yfinance directly during market hours to avoid stale data + data = yf.download( + "^IRX", + start="2010-01-01", + end=(datetime.datetime.today() + BDay(1)).strftime("%Y-%m-%d"), + interval="1d", + progress=False, + multi_level_index=False, + ) + + data["daily"] = data["Close"].apply(deannualize) + data["annualized"] = data["Close"] / 100 + return data[["daily", "annualized"]] + + resample_bool = interval != "1d" or DAILY_RATES_CACHE is None ## First check data base. - if _rates_cache is None: + if choice_cache is None: data = query_database( "securities_master", "rates_timeseries", @@ -78,10 +104,13 @@ def _fetch_rates(interval): data.rename(columns={"daily_rate": "daily", "annualized_rate": "annualized", "yf_tick": "name"}, inplace=True) data.index.name = "Datetime" else: - data = _rates_cache.copy() + data = choice_cache.copy() ## Drop today's date to ensure forced update - data = data[data.index.date < change_to_last_busday(datetime.datetime.now()).date()] + if ny_now().hour >= 16: + data = data[data.index.date <= change_to_last_busday(datetime.datetime.now()).date()] + else: + data = data[data.index.date < change_to_last_busday(datetime.datetime.now()).date()] ## Now, if data is not up to date, update it if data.index.max().date() < change_to_last_busday(datetime.datetime.now()).date(): @@ -110,9 +139,16 @@ def _fetch_rates(interval): data = pd.concat([data, data_min]) data = data[~data.index.duplicated(keep="first")] - _rates_cache = resample( - data, "30m", {"daily": "ffill", "annualized": "ffill", "name": "ffill", "description": "ffill"} - ) + ## Have to resample all intervals + resample_int = interval if interval == "1d" else "30m" + if resample_bool: + data = resample( + data, resample_int, {"daily": "ffill", "annualized": "ffill", "name": "ffill", "description": "ffill"} + ) + if interval != "1d": + _rates_cache = data.copy() + else: + DAILY_RATES_CACHE = data.copy() return data diff --git a/trade/backtester_/_helper.py b/trade/backtester_/_helper.py index 3256dad..b26933d 100644 --- a/trade/backtester_/_helper.py +++ b/trade/backtester_/_helper.py @@ -1,12 +1,15 @@ -from typing import Any, Callable, Dict, Optional +from typing import Any, Callable, Dict, Optional, TYPE_CHECKING import pandas as pd -from ._strategy import StrategyBase from .data import PTDataset +if TYPE_CHECKING: + from ._strategy import StrategyBase + REQUIRED = object() + def make_bt_wrapper( - brain_cls: type[StrategyBase], + brain_cls: type["StrategyBase"], *, name: Optional[str] = None, param_overrides: Optional[Dict[str, Any]] = None, @@ -57,9 +60,11 @@ def _init(self): ds = dataset_factory(self.data.df) # Pass start_date directly (Timestamp or None) + ticker_name = getattr(ds, "name", None) or getattr(ds, "ticker", None) or "NA" self.brain = brain_cls( data=ds, start_trading_date=self.start_date, + ticker=ticker_name, **brain_kwargs, ) @@ -76,15 +81,23 @@ def _init(self): def _next(self): date = self.data.index[-1] - - if self.brain.should_open(date=date): + open_decision = self.brain.should_open(date=date) + if open_decision.ok: if verbose: print(f"Opening position on {date} at price {self.data.Close[-1]}") print(f"Info: {self.brain.info_on_date(date=date)}") self.buy() - self.brain.open_action(date=date) - - elif self.brain.should_close(date=date): + self.brain.open_action( + date=date, + signal_id=open_decision.signal_id, + side=open_decision.side, + entry_price=self.data.Close[-1], + ) + + else: + close_decision = self.brain.should_close(date=date) + if not close_decision.ok: + return if verbose: print(f"Closing position on {date} at price {self.data.Close[-1]}") print(f"Info: {self.brain.info_on_date(date=date)}") diff --git a/trade/backtester_/_multi_asset_strategy.py b/trade/backtester_/_multi_asset_strategy.py index 8854843..05eecb1 100644 --- a/trade/backtester_/_multi_asset_strategy.py +++ b/trade/backtester_/_multi_asset_strategy.py @@ -1,6 +1,7 @@ from dataclasses import dataclass, field -from typing import Dict, Any, Type, List +from typing import Dict, Any, Optional, Type, List import pandas as pd +from trade.assets.Stock import DATE_HINT from trade.backtester_._strategy import StrategyBase, TradeDecision from trade.backtester_.backtester_ import PTDataset @@ -23,6 +24,29 @@ def __repr__(self) -> str: tickers = list(self.trades.keys()) total_trades = sum(len(t) for t in self.trades.values()) return f"SimulationResults(" f"tickers={tickers}, " f"total_trades={total_trades})" + +@dataclass +class MultiAssetSignals: + """ + Container for multi-asset strategy signals on a given date. + + Attributes: + date (str): Current date in 'YYYY-MM-DD' format + open_signals (Dict[str, TradeDecision]): Dictionary mapping tickers to their open trade decisions + close_signals (Dict[str, TradeDecision]): Dictionary mapping tickers to their close trade decisions + """ + + date: str + open_signals: Dict[str, TradeDecision] + close_signals: Dict[str, TradeDecision] + + def __repr__(self) -> str: + """String representation showing summary of signals.""" + return ( + f"MultiAssetSignals(date='{self.date}', " + f"open_signals={self.open_signals}, " + f"close_signals={self.close_signals})" + ) ## Consider making this a subclass of StrategyBase @@ -76,6 +100,9 @@ class MultiAssetStrategy: strategy_class: Type[StrategyBase] data: Dict[str, PTDataset] asset_strategies: Dict[str, StrategyBase] = field(default_factory=dict, init=False) + current_open_positions: Dict[str, bool] = field(default_factory=dict, init=False) + strategy_settings: Dict[str, Dict[str, Any]] = field(default_factory=dict, init=False) + tplusn: Optional[int] = 1 def __post_init__(self): """ @@ -95,6 +122,18 @@ def __post_init__(self): self.asset_strategies[ticker] = self.strategy_class( data=self.data[ticker], start_trading_date=self.start_date, ticker=ticker, **ticker_params ) + self.current_open_positions[ticker] = False + self.strategy_settings[ticker] = ticker_params + + def reset_strategies(self): + """ + Reset all strategy instances to their initial state. + + This can be useful if you want to re-run simulations without creating a new MultiAssetStrategy instance. + """ + for ticker, strategy in self.asset_strategies.items(): + strategy.reset() + self.current_open_positions[ticker] = False def simulate_all(self, finalize: bool = True) -> SimulationResults: """ @@ -212,17 +251,117 @@ def should_close(self, ticker: str, current_date: str) -> TradeDecision: """ strategy = self.get_strategy(ticker) return strategy.should_close(date=current_date) + + def should_close_all(self, current_date: str) -> Dict[str, TradeDecision]: + """ + Check if any of the strategies signal to close positions on the current date. + + Args: + current_date (str): Current date in 'YYYY-MM-DD' format + Returns: + Dict[str, TradeDecision]: Dictionary mapping tickers to their close decisions + """ + decisions = {} + for ticker, strategy in self.asset_strategies.items(): + decisions[ticker] = strategy.should_close(date=current_date) + return decisions + + def should_open_all(self, current_date: str) -> Dict[str, TradeDecision]: + """ + Check if any of the strategies signal to open positions on the current date. - def open_action(self, ticker: str, current_date: str): + Args: + current_date (str): Current date in 'YYYY-MM-DD' format + Returns: + Dict[str, TradeDecision]: Dictionary mapping tickers to their open decisions + """ + decisions = {} + for ticker, strategy in self.asset_strategies.items(): + decisions[ticker] = strategy.should_open(date=current_date) + return decisions + + def generate_signals_on_date(self, current_date: str, filter_actionable: bool = False) -> MultiAssetSignals: + """ + Generate a dictionary of signals for all tickers on the current date. + + Args: + current_date (str): Current date in 'YYYY-MM-DD' format + Returns: + MultiAssetSignals: Object containing open and close signals for all tickers + """ + opens = {} + closes = {} + for ticker, strategy in self.asset_strategies.items(): + opens[ticker] = strategy.should_open(date=current_date) + closes[ticker] = strategy.should_close(date=current_date) + if filter_actionable: + opens = {ticker: decision for ticker, decision in opens.items() if decision.ok} + closes = {ticker: decision for ticker, decision in closes.items() if decision.ok} + return MultiAssetSignals(date=current_date, open_signals=opens, close_signals=closes) + + + def set_position(self, + ticker: str, + signal_id: str, + current_date: DATE_HINT, + side: int, + entry_price: Optional[float] = 0.0): + """ + Set the position for a given ticker and signal ID. + + Args: + ticker (str): Ticker symbol + signal_id (str): Signal ID for the position + have_position (bool): Whether the position is open or not + """ + strategy = self.get_strategy(ticker) + strategy.set_position_info( + entry_date=current_date, + entry_price=entry_price, + side=side, + signal_id=signal_id + ) + self.current_open_positions[ticker] = True + + def open_action(self, + ticker: str, + signal_id: str, + current_date: DATE_HINT, + side: int, + entry_price: Optional[float] = 0.0): """ Get the open action for the strategy of a given ticker on the current date. Args: ticker (str): Ticker symbol - current_date (str): Current date in 'YYYY-MM-DD' format + signal_id (str): Signal ID for the position + current_date (DATE_HINT): Current date for the action + side (int): Trade side (1 for long, -1 for short) + entry_price (Optional[float]): Entry price for the position + """ + strategy = self.get_strategy(ticker) + strategy.open_action( + date=current_date, + signal_id=signal_id, + side=side, + entry_price=entry_price + ) + self.current_open_positions[ticker] = True + + + + def unset_position(self, ticker: str): + """ + Clear the position information for a given ticker. + + This is typically called when closing a position to reset the state. + + Args: + ticker (str): Ticker symbol """ strategy = self.get_strategy(ticker) - return strategy.open_action(current_date) + strategy.remove_position_info() + self.current_open_positions[ticker] = False def close_action(self, ticker: str, current_date: str): """ @@ -233,6 +372,7 @@ def close_action(self, ticker: str, current_date: str): current_date (str): Current date in 'YYYY-MM-DD' format """ strategy = self.get_strategy(ticker) + self.current_open_positions[ticker] = False return strategy.close_action(current_date) def info_on_date(self, ticker: str, current_date: str) -> Dict[str, Any]: diff --git a/trade/backtester_/_sample.py b/trade/backtester_/_sample.py index 3c76904..6cc88bc 100644 --- a/trade/backtester_/_sample.py +++ b/trade/backtester_/_sample.py @@ -1,3 +1,5 @@ +##TODO: DELETE FILE IF UNUSED## + """ Strategy Base Classes for Backtesting Framework diff --git a/trade/backtester_/_strategy.py b/trade/backtester_/_strategy.py index 51ac30e..8688367 100644 --- a/trade/backtester_/_strategy.py +++ b/trade/backtester_/_strategy.py @@ -2,12 +2,15 @@ from typing import Any, Optional, Dict, Tuple import inspect import pandas as pd -from trade.backtester_.backtester_ import PTDataset +from trade.backtester_.data import PTDataset from typing import List from dataclasses import dataclass import numpy as np from plotly.subplots import make_subplots +from EventDriven.types import PositionEffect, SignalID import plotly.graph_objects as go +from pandas.tseries.offsets import BDay # noqa +from trade.helpers.helper import change_to_last_busday # noqa from ._types import Side, SideInt # noqa @@ -23,20 +26,60 @@ class Indicator: class TradeDecision: ok: bool side: int + pos_effect: Optional[PositionEffect] = None + signal_id: Optional[SignalID] = None + sideint: Optional[int] = None + side_enum: Optional[Side] = None def __post_init__(self): if not isinstance(self.ok, (bool, np.bool_)): raise TypeError("TradeDecision.ok must be a boolean.") if not isinstance(self.side, int): raise TypeError("TradeDecision.side must be an integer.") + if self.side not in (1, -1, 0): + raise ValueError("TradeDecision.side must be 1 (long), -1 (short), or 0 (no position).") + if (self.signal_id is not None and not isinstance(self.signal_id, SignalID)) and self.signal_id != "N/A": + raise TypeError("TradeDecision.signal_id must be of type SignalID, 'N/A', or None.") + if self.pos_effect is not None and not isinstance(self.pos_effect, PositionEffect): + raise TypeError("TradeDecision.pos_effect must be of type PositionEffect or None.") + + ## Enforcing needed information: + if self.ok: + if self.side == 0: + raise ValueError("If ok is True, side cannot be 0 (no position).") + if self.pos_effect is None: + raise ValueError("If ok is True, pos_effect must be provided.") + if self.signal_id is None: + raise ValueError( + "If ok is True, signal_id must be provided. If this is a close with no prior signal, set signal_id to N/A" + ) + + ## If Open signal_id must be parseable, if Close signal_id must be parseable or N/A + if self.pos_effect == PositionEffect.OPEN: + if self.signal_id == "N/A": + raise ValueError("If pos_effect is OPEN, signal_id cannot be 'N/A'. It must be a valid SignalID.") + try: + SignalID.parse(self.signal_id) + except Exception as e: + raise ValueError(f"Invalid signal_id: {self.signal_id}") from e + elif self.pos_effect == PositionEffect.CLOSE: + if self.signal_id != "N/A": + try: + SignalID.parse(self.signal_id) + except Exception as e: + raise ValueError(f"Invalid signal_id: {self.signal_id}") from e self.ok = bool(self.ok) + self.sideint = int(self.side) + self.side_enum = Side.LONG if self.sideint == 1 else Side.SHORT if self.sideint == -1 else None def __bool__(self): return self.ok def __repr__(self): - return f"TradeDecision(ok={self.ok}, side={self.side})" + return ( + f"TradeDecision(ok={self.ok}, side={self.side}, signal_id={self.signal_id}, pos_effect={self.pos_effect})" + ) @dataclass @@ -44,9 +87,24 @@ class PositionInfo: entry_date: Optional[pd.Timestamp] = None entry_price: Optional[float] = None side: Optional[SideInt] = None + signal_id: Optional[SignalID] = None + + def __post_init__(self): + ## If any of the fields are set, they must all be set (for simplicity of logic elsewhere) + fields = [self.entry_date, self.entry_price, self.side, self.signal_id] + if any(f is not None for f in fields) and not all(f is not None for f in fields): + print( + f"PositionInfo initialization warning: some fields are set but not all. entry_date: {self.entry_date}, entry_price: {self.entry_price}, side: {self.side}, signal_id: {self.signal_id}" + ) + raise ValueError("If any of entry_date, entry_price, side, or signal_id is set, they must all be set.") def __bool__(self): - return self.entry_date is not None and self.entry_price is not None and self.side is not None + return ( + self.entry_date is not None + and self.entry_price is not None + and self.side is not None + and self.signal_id is not None + ) class StrategyBase(ABC): @@ -167,7 +225,12 @@ def __init_subclass__(cls, **kwargs): ) def __init__( - self, data: PTDataset, start_trading_date: Optional[str] = None, ticker: Optional[str] = None, **kwargs + self, + data: PTDataset, + start_trading_date: Optional[str] = None, + ticker: Optional[str] = None, + tplusn: Optional[int | float] = 1, + **kwargs, ): """ Initializes the strategy with data and parameters. @@ -175,6 +238,8 @@ def __init__( - data: PTDataset containing the market data. - start_trading_date: Optional start date for trading (YYYY-MM-DD). - kwargs: Additional parameters defined in bt_params. + - ticker: Optional ticker symbol for the strategy. + - tplusn: Optional time offset parameter. Please always call super().__init__() in subclass __init__. """ @@ -182,10 +247,9 @@ def __init__( self.data: PTDataset = data self.start_date = pd.Timestamp(start_trading_date) if start_trading_date else None self.ticker = ticker + self.tplusn = tplusn - self.position_open: bool = False - self.position_side: Optional[SideInt] = SideInt.BUY - self.position_info: PositionInfo = PositionInfo() + self.position_info: Optional[PositionInfo] = PositionInfo() self.stop: Optional[float] = None self.indicators: Dict[str, Any] = {} @@ -210,6 +274,28 @@ def __init__( # Let subclass set up indicators, etc. self.setup() + @property + def position_open(self) -> bool: + """Returns True if a position is currently open.""" + return self.position_info is not None and bool(self.position_info) + + @property + def position_side(self) -> Optional[SideInt]: + """Returns the side of the current position (BUY=1, SELL=-1) or None if no position.""" + return self.position_info.side if self.position_info and self.position_info.side is not None else None + + @position_side.setter + def position_side(self, value: SideInt): + raise AttributeError( + "position_side is a read-only property. To change position side, use open_action() and close_action() methods which handle state updates and validations." + ) + + @position_open.setter + def position_open(self, value: bool): + raise AttributeError( + "position_open is a read-only property. To change position status, use open_action() and close_action() methods which handle state updates and validations." + ) + def _resolve(self, *, date: pd.Timestamp = None, index: int = None) -> Tuple[int, pd.Timestamp]: """ Resolve date or index into a validated (index, timestamp) tuple. @@ -363,7 +449,15 @@ def is_close_signal(self, *, date=None, index=None): raise NotImplementedError("Subclasses must implement is_close_signal() method.") @abstractmethod - def open_action(self, *, date: pd.Timestamp = None, index: int = None) -> None: + def open_action( + self, + *, + signal_id: Optional[str] = None, + entry_price: Optional[float] = None, + side: Optional[int] = None, + date: pd.Timestamp = None, + index: int = None, + ) -> None: """ Execute actions when opening a new position. @@ -383,12 +477,22 @@ def open_action(self, *, date: pd.Timestamp = None, index: int = None) -> None: Provide exactly one of date or index. Example: - def open_action(self, *, date=None, index=None): + def open_action(self, *, date=None, index=None, signal_id=None, entry_price=None, side=None): idx, _ = self._resolve(date=date, index=index) - self.position_open = True + super().open_action( + date=date, + index=index, + signal_id=signal_id, + entry_price=entry_price, + side=side, + ) self.stop = self.close[idx] * 0.95 # 5% stop-loss """ - raise NotImplementedError("Subclasses must implement open_action() method.") + assert signal_id is not None, "signal_id must be provided for open_action" + assert side is not None, "side must be provided for open_action" + assert entry_price is not None, "entry_price must be provided for open_action" + _, date = self._resolve(date=date, index=index) + self.position_info = PositionInfo(entry_date=date, entry_price=entry_price, side=side, signal_id=signal_id) @abstractmethod def close_action(self, *, date: pd.Timestamp = None, index: int = None) -> None: @@ -415,7 +519,7 @@ def close_action(self, *, date=None, index=None): self.position_open = False self.stop = None """ - pass + self.remove_position_info() # --- NumPy-first data access --- @property @@ -478,6 +582,16 @@ def dates(self) -> np.ndarray: """ return self._dates + def reset(self): + """ + Reset the strategy to its initial state. + + This method can be called to clear any open positions and reset indicators + before running a new simulation. It sets position_info to a new instance and stop to None. + """ + self.stop = None + self.position_info = PositionInfo() + def reset_strategy_state(self): """ Reset the strategy's position and stop-loss state. @@ -486,11 +600,11 @@ def reset_strategy_state(self): Can also be called manually if needed to reset the strategy between simulations. Resets: - - position_open: Set to False + - position_info: Set to a new instance of PositionInfo - stop: Set to None """ - self.position_open = False self.stop = None + self.position_info = PositionInfo() def info_on_date(self, *, date: pd.Timestamp = None, index: int = None) -> Dict[str, Any]: """ @@ -531,6 +645,8 @@ def info_on_date(self, *, date: pd.Timestamp = None, index: int = None) -> Dict[ "is_open_signal": self.is_open_signal(date=ts), "is_close_signal": self.is_close_signal(date=ts), "position_open": self.position_open, + "position_side": self.position_side, + "position_info": self.position_info, "stop": self.stop, } info["indicators"] = ind_snapshot @@ -582,15 +698,7 @@ def should_open(self, *, date: pd.Timestamp = None, index: int = None) -> TradeD Note: Provide exactly one of date or index. """ - - return TradeDecision( - ok=( - self.should_trade(date=date, index=index) - and (not self.position_open) - and self.is_open_signal(date=date, index=index) - ), - side=1, - ) + raise NotImplementedError("Subclasses must implement should_open() method to return a TradeDecision object.") def should_close(self, *, date: pd.Timestamp = None, index: int = None) -> TradeDecision: """ @@ -613,7 +721,7 @@ def should_close(self, *, date: pd.Timestamp = None, index: int = None) -> Trade Note: Provide exactly one of date or index. """ - return TradeDecision(ok=(self.position_open and self.is_close_signal(date=date, index=index)), side=-1) + raise NotImplementedError("Subclasses must implement should_close() method to return a TradeDecision object.") def add_indicator(self, name: str, series: pd.Series, overlay: bool = False, color: Optional[str] = "red") -> None: """ @@ -664,9 +772,48 @@ def have_position(self) -> bool: Returns: bool: True if position is open, False otherwise """ - return self.position_open + return bool(self.position_info) + + def set_position_info( + self, + *, + entry_date: Optional[pd.Timestamp] = None, + entry_price: Optional[float] = None, + side: Optional[SideInt] = None, + signal_id: Optional[SignalID] = None, + ) -> None: + """ + Set the current position information. - def simulate(self, finalize: bool = True) -> Tuple[List[Dict[str, Any]], pd.Series]: + Args: + entry_date (pd.Timestamp, optional): Date when the position was opened + entry_price (float, optional): Price at which the position was opened + side (SideInt, optional): Position side (SideInt.BUY or SideInt.SELL) + signal_id (SignalID, optional): Identifier for the signal that triggered the position + + Note: + This method is a convenient way to update all position info attributes at once. + You can also set these attributes individually if needed. + """ + signal_id = SignalID(signal_id) if signal_id is not None else None + self.position_info = PositionInfo( + entry_date=entry_date, + entry_price=entry_price, + side=side, + signal_id=signal_id, + ) + + def remove_position_info(self) -> None: + """ + Clear the current position information. + + This is typically called when closing a position to reset the state. + """ + self.position_info = PositionInfo() + + def simulate( + self, finalize: bool = True, enforce_open_on_signal: bool = False, enforce_close_on_signal: bool = False + ) -> Tuple[List[Dict[str, Any]], pd.Series]: """ Run a backtest simulation of the strategy across all available data. @@ -678,6 +825,9 @@ def simulate(self, finalize: bool = True) -> Tuple[List[Dict[str, Any]], pd.Seri finalize (bool, optional): If True, close any open position at the end of the simulation. Defaults to True. + enforce_open_on_signal (bool, optional): If True, when executing a scheduled open trade (t+n), re-check that the open signal is still valid at execution time. Defaults to True. + enforce_close_on_signal (bool, optional): If True, when executing a scheduled close trade (t+n), re-check that the close signal is still valid at execution time. Defaults to False. + Returns: Tuple[List[Dict[str, Any]], pd.Series]: - trades: List of trade dictionaries with keys: @@ -698,14 +848,18 @@ def simulate(self, finalize: bool = True) -> Tuple[List[Dict[str, Any]], pd.Seri n = self._n close = self._close dates = self._index # pd.DatetimeIndex for consistent timestamps + tn_int = int(self.tplusn) if self.tplusn is not None else 0 - trades = [] + trades: List[Dict[str, Any]] = [] equity = np.empty(n, dtype=float) equity[0] = 1.0 entry_price: Optional[float] = None eq = 1.0 + # pending executions: map execution_index -> list of ops ("open"/"close") + pending: Dict[int, List[Dict[str, Any]]] = {} + # We start from i=0; interval returns apply from i-1 -> i if in position at i-1 for i in range(n): ts = dates[i] @@ -720,36 +874,99 @@ def simulate(self, finalize: bool = True) -> Tuple[List[Dict[str, Any]], pd.Seri ratio = current_price / prev_price eq *= ratio**position_side # adjust for short/long - # 2) Decide actions using today's bar - if self.should_open(index=i): - self.open_action(index=i) - entry_price = current_price - trades.append({"date": ts, "action": "open", "price": current_price, "equity": eq}) + # 2) First, process any scheduled executions for this index + for op in pending.pop(i, []): + if op.get("action") == "open": + ## Optionally enforce that the signal is still valid at execution time (e.g., if tplusn > 0, the market conditions may have changed) + enforce_open = self.should_open(index=i).ok if enforce_open_on_signal else True + + # only open if not already in a position + if not self.position_open and enforce_open: + self.open_action( + index=i, side=op.get("side"), signal_id=op.get("signal_id"), entry_price=current_price + ) + entry_price = current_price + trades.append({"date": ts, "action": "open", "price": current_price, "equity": eq}) + + elif op.get("action") == "close": + ## Optionally enforce that the close signal is still valid at execution time (e.g., if tplusn > 0, the market conditions may have changed) + enforce_close = self.should_close(index=i).ok if enforce_close_on_signal else True + if self.position_open and enforce_close: + position_info = self.position_info + return_pct = (current_price - entry_price) / entry_price if entry_price is not None else 0.0 + return_pct *= position_side + trades.append( + { + "date": ts, + "action": "close", + "price": current_price, + "equity": eq, + "return_pct": return_pct, + "entry_price": entry_price, + "side": position_side, + "position_info": position_info, + } + ) + self.close_action(index=i) + + # 3) Check for new signals at t and schedule (or execute immediately if tn==0) + open_decision = self.should_open(index=i) + if open_decision.ok: + exec_idx = i if tn_int == 0 else min(i + tn_int, n - 1) + if tn_int == 0: + # immediate execution + if not self.position_open: + self.open_action( + index=exec_idx, + side=open_decision.side, + signal_id=open_decision.signal_id, + entry_price=current_price, + ) + entry_price = current_price + trades.append({"date": ts, "action": "open", "price": current_price, "equity": eq}) + else: + pending.setdefault(exec_idx, []).append( + { + "action": "open", + "signal_index": i, + "side": open_decision.side, + "signal_id": open_decision.signal_id, + } + ) elif self.should_close(index=i): - self.close_action(index=i) - return_pct = (current_price - entry_price) / entry_price if entry_price is not None else 0.0 - return_pct *= position_side # adjust for short/long - trades.append( - { - "date": ts, - "action": "close", - "price": current_price, - "equity": eq, - "return_pct": return_pct, - "entry_price": entry_price, - } - ) + exec_idx = i if tn_int == 0 else min(i + tn_int, n - 1) + if tn_int == 0: + if self.position_open: + position_info = self.position_info + return_pct = (current_price - entry_price) / entry_price if entry_price is not None else 0.0 + return_pct *= position_side + trades.append( + { + "date": ts, + "action": "close", + "price": current_price, + "equity": eq, + "return_pct": return_pct, + "entry_price": entry_price, + "side": position_side, + "position_info": position_info, + } + ) + self.close_action(index=exec_idx) + else: + pending.setdefault(exec_idx, []).append({"action": "close", "signal_index": i}) equity[i] = eq + # After loop, optionally finalize: if position still open close at last bar if finalize: + # There may be pending executions scheduled for the last bar; they've already executed if self.position_open: - # Close any open position at the last price current_price = float(close[-1]) - self.close_action(index=n - 1) + position_info = self.position_info return_pct = (current_price - entry_price) / entry_price if entry_price is not None else 0.0 - return_pct *= self.position_side # adjust for short/long + return_pct *= self.position_side trades.append( { "date": dates[-1], @@ -758,8 +975,11 @@ def simulate(self, finalize: bool = True) -> Tuple[List[Dict[str, Any]], pd.Seri "equity": eq, "return_pct": return_pct, "entry_price": entry_price, + "side": self.position_side, + "position_info": position_info, } ) + self.close_action(index=n - 1) self.reset_strategy_state() equity_series = pd.Series(equity, index=dates, name="equity") @@ -834,7 +1054,7 @@ def plot_strategy_indicators(self, log_scale: bool = True, add_signal_marker: bo fig.add_trace( go.Scatter( x=[trade["date"]], - y=[trade["price"] * 1.2], + y=[trade["price"] * 1.05], mode="markers", marker=dict(symbol="triangle-down", color="black", size=10), name="Buy Signal", @@ -850,7 +1070,7 @@ def plot_strategy_indicators(self, log_scale: bool = True, add_signal_marker: bo fig.add_trace( go.Scatter( x=[trade["date"]], - y=[trade["price"] * 0.8], + y=[trade["price"] * 0.95], mode="markers", marker=dict(symbol="triangle-up", color="black", size=10), name="Sell Signal", @@ -893,6 +1113,7 @@ def plot_strategy_indicators(self, log_scale: bool = True, add_signal_marker: bo height=300 * (1 + num_non_overlay), title_text=f"Strategy Indicators for {self.__class__.__name__}", showlegend=True, + width=1000, ) fig.update_layout(xaxis=dict(rangeslider=dict(visible=False))) fig.update_xaxes(rangebreaks=[dict(bounds=["sat", "mon"])]) # hide weekends @@ -942,7 +1163,7 @@ def plot_signals(self, log_scale: bool = True) -> go.Figure: name = self.__class__.__name__ if self.ticker is None else f"{self.ticker} - {self.__class__.__name__}" fig.update_layout( height=550, - width=1500, + width=1000, title_text=f"Strategy Signals for {name}", showlegend=True, ) diff --git a/trade/backtester_/_strategy_patch.py b/trade/backtester_/_strategy_patch.py index 0ef5568..286da61 100644 --- a/trade/backtester_/_strategy_patch.py +++ b/trade/backtester_/_strategy_patch.py @@ -1,4 +1,4 @@ - +## TODO: DELETE FILE IF UNUSED## import pandas as pd from datetime import datetime, date diff --git a/trade/backtester_/backtester_.py b/trade/backtester_/backtester_.py index a312f4d..a0763ff 100644 --- a/trade/backtester_/backtester_.py +++ b/trade/backtester_/backtester_.py @@ -197,6 +197,10 @@ def run(self) -> pd.DataFrame: for setting, value in d.param_settings.items(): ## Set the settings for the strategy, per dataset setattr(self.strategy, setting, value) stats = d.backtest.run() + if self.start_overwrite: + stats["Start"] = pd.to_datetime(self.start_overwrite) + stats["End"] = pd.to_datetime(stats["End"]) + stats["Duration"] = stats["End"] - stats["Start"] ## Since the strategy is uninitialized, we reset the settings to default, to avoid any carry over in the next run self.reset_settings() if d.param_settings else None try: diff --git a/trade/datamanager/README.md b/trade/datamanager/README.md new file mode 100644 index 0000000..64e8943 --- /dev/null +++ b/trade/datamanager/README.md @@ -0,0 +1,845 @@ +# QuantTools DataManager Module + +Comprehensive data infrastructure for quantitative options trading and backtesting. + +## Table of Contents + +- [Overview](#overview) +- [Quick Start](#quick-start) +- [Architecture](#architecture) +- [Core Data Managers](#core-data-managers) +- [Derived Metrics Managers](#derived-metrics-managers) +- [Unified Timeseries Interface](#unified-timeseries-interface) +- [Convenience Loaders](#convenience-loaders) +- [Configuration](#configuration) +- [Caching System](#caching-system) +- [Best Practices](#best-practices) + +--- + +## Overview + +The DataManager module provides a complete data infrastructure for options trading with: + +- **Historical and real-time market data** from multiple sources (ThetaData, OpenBB, YFinance) +- **Intelligent multi-tier caching** (memory + disk with expiration) +- **Derived metrics calculation** (forwards, volatilities, greeks, theoretical prices) +- **Type-safe result containers** with full metadata +- **Singleton pattern** per symbol for efficient resource management +- **Consistent API** across all managers + +### Design Principles + +- Automatic data loading from multiple sources +- Split adjustment handling for accurate backtesting +- Dividend schedule construction (discrete/continuous) +- Forward price computation with carry models +- Implied volatility calculation (BSM, Binomial) +- Greek calculation with multiple pricing models +- Theoretical pricing and scenario analysis + +--- + +## Quick Start + +### Basic Usage + +```python +from trade.datamanager import SpotDataManager, VolDataManager, GreekDataManager +from trade.datamanager._enums import DivType, OptionPricingModel + +# Load spot prices +spot_mgr = SpotDataManager("AAPL") +spot_result = spot_mgr.get_spot_timeseries( + start_date="2025-01-01", + end_date="2025-01-31", + undo_adjust=True # Split-adjusted prices +) +prices = spot_result.daily_spot + +# Get implied volatilities +vol_mgr = VolDataManager("AAPL") +vol_result = vol_mgr.get_implied_volatility_timeseries( + start_date="2025-01-01", + end_date="2025-01-31", + strike=150.0, + expiration="2025-06-20", + right="call", + dividend_type=DivType.DISCRETE +) +ivs = vol_result.timeseries + +# Compute option greeks +greek_mgr = GreekDataManager("AAPL") +greek_result = greek_mgr.get_greeks_timeseries( + start_date="2025-01-01", + end_date="2025-01-31", + strike=150.0, + expiration="2025-06-20", + right="call" +) +greeks_df = greek_result.timeseries # DataFrame with delta, gamma, vega, etc. +``` + +### Using the Unified Interface + +```python +from trade.datamanager.timeseries import TimeseriesDataManager + +# Single entry point for all data types +ts = TimeseriesDataManager("AAPL") + +# Consistent interface across all managers +spot = ts.spot.get_timeseries(start_date="2025-01-01", end_date="2025-01-31") +vol = ts.vol.get_timeseries( + start_date="2025-01-01", + end_date="2025-01-31", + strike=150.0, + expiration="2025-06-20", + right="call" +) +greeks = ts.greeks.rt(strike=150.0, expiration="2025-06-20", right="call") +``` + +### One-Call Data Loading + +```python +from trade.datamanager.loaders import load_full_option_data +from trade.datamanager._enums import DivType + +# Load all option data (spot, forward, dividend, vol, greeks, rates) in one call +pack = load_full_option_data( + symbol="AAPL", + strike=150.0, + expiration="2025-06-20", + right="call", + start_date="2025-01-01", + end_date="2025-01-31", + dividend_type=DivType.DISCRETE +) + +# Access individual components +spot = pack.spot.timeseries +vol = pack.vol.timeseries +greeks = pack.greek.timeseries +``` + +--- + +## Architecture + +### Component Hierarchy + +``` +BaseDataManager (ABC) +│ +├── Market Data Layer +│ ├── SpotDataManager - Underlying equity prices +│ ├── RatesDataManager - Risk-free interest rates +│ ├── DividendDataManager - Dividend schedules +│ ├── OptionSpotDataManager - Option contract prices +│ └── MarketTimeseries - Central data repository +│ +└── Derived Metrics Layer + ├── ForwardDataManager - Forward price computation + ├── VolDataManager - Implied volatility calculation + ├── GreekDataManager - Option sensitivities + └── TheoDataFunctions - Theoretical pricing +``` + +### Key Features by Layer + +**BaseDataManager** provides: +- Cache management (CustomCache) +- Key construction (namespaced, artifact-based) +- Configuration (OptionDataConfig singleton) +- Logger setup + +**Market Data Layer** handles: +- Data retrieval from external sources +- Split adjustment handling +- Corporate action processing +- Historical and real-time access + +**Derived Metrics Layer** computes: +- Forward prices using cost-of-carry models +- Implied volatilities via model inversion +- Option greeks using analytical/numerical methods +- Theoretical prices and scenario analysis + +--- + +## Core Data Managers + +### SpotDataManager + +Manages underlying equity spot prices with split adjustment support. + +**Features:** +- Singleton pattern (per symbol) +- 45-day cache expiration +- Split-adjusted (chain_spot) and unadjusted (spot) prices +- Data source: MarketTimeseries (OpenBB/YFinance) + +**Key Methods:** + +```python +# Historical timeseries +result = spot_mgr.get_spot_timeseries( + start_date="2025-01-01", + end_date="2025-01-31", + undo_adjust=True # True for split-adjusted, False for raw +) +prices = result.daily_spot # pd.Series with DatetimeIndex + +# Single date +result = spot_mgr.get_at_time(date="2025-01-15") + +# Real-time +result = spot_mgr.rt() +``` + +### RatesDataManager + +Manages risk-free interest rates from US Treasury bills (^IRX). + +**Features:** +- Singleton pattern (global, no symbol) +- 30-day cache expiration +- Data source: YFinance (13-week T-Bill) +- Automatic forward fill for missing dates + +**Key Methods:** + +```python +# Historical rates +result = rates_mgr.get_risk_free_rate_timeseries( + start_date="2025-01-01", + end_date="2025-01-31" +) +rates = result.daily_risk_free_rates # pd.Series (annualized) + +# Real-time +rate = rates_mgr.rt() +``` + +### DividendDataManager + +Manages dividend data with schedule construction for option pricing. + +**Features:** +- Singleton pattern (per symbol) +- 60-day cache expiration + temp cache +- Supports discrete (schedule) and continuous (yield) models +- Handles split adjustments +- Smart partial caching with merging + +**Key Methods:** + +```python +# Get dividend schedules for option pricing +result = div_mgr.get_schedule_timeseries( + start_date="2025-01-01", + end_date="2025-01-31", + maturity_date="2025-06-20", + dividend_type=DivType.DISCRETE, + undo_adjust=True +) +schedules = result.daily_discrete_dividends # pd.Series of Schedule objects + +# Real-time dividend schedule +result = div_mgr.rt(maturity_date="2025-06-20") +``` + +### ForwardDataManager + +Computes forward prices using cost-of-carry models. + +**Features:** +- Singleton pattern (per symbol) +- 30-day cache expiration +- Dependencies: SpotDataManager, RatesDataManager, DividendDataManager +- Discrete model: F = S × exp(r×T) - PV(dividends) +- Continuous model: F = S × exp((r-q)×T) + +**Key Methods:** + +```python +# Compute forward prices +result = fwd_mgr.get_forward_timeseries( + start_date="2025-01-01", + end_date="2025-01-31", + maturity_date="2025-06-20", + dividend_type=DivType.DISCRETE, + use_chain_spot=True +) +forwards = result.daily_discrete_forward # pd.Series + +# Real-time forward +result = fwd_mgr.rt(maturity_date="2025-06-20") +``` + +### OptionSpotDataManager + +Retrieves option contract market prices from ThetaData API. + +**Features:** +- Not singleton (per symbol) +- 7-day cache expiration +- Data source: ThetaData (EOD or Quote endpoint) +- Returns OHLC data + +**Key Methods:** + +```python +# Historical option prices +result = opt_mgr.get_option_spot_timeseries( + start_date="2025-01-01", + end_date="2025-01-31", + strike=150.0, + expiration="2025-06-20", + right="call", + endpoint_source=OptionSpotEndpointSource.EOD +) +ohlc = result.daily_option_spot # pd.DataFrame [open, high, low, close] + +# Real-time option price +result = opt_mgr.rt(strike=150.0, expiration="2025-06-20", right="call") +``` + +### MarketTimeseries + +Central market data repository with lazy loading and caching. + +**Features:** +- Singleton pattern (global instance) +- Multi-tier caching (memory + disk) +- Data sources: OpenBB, ThetaData, YFinance +- Loads all data for a symbol on first request +- Thread-safe access +- Point-in-time snapshots + +**Usage:** + +```python +from trade.datamanager.vars import get_times_series + +ts = get_times_series() +ts.load("AAPL") # Lazy load on first access + +# Get point-in-time data +data = ts.get_at_index("AAPL", "2025-01-15") +spot = data.spot # pd.Series with OHLCV +``` + +--- + +## Derived Metrics Managers + +### VolDataManager + +Computes implied volatilities from option market prices. + +**Features:** +- Singleton pattern (per symbol) +- 7-day cache expiration +- Multiple models: BSM, CRR binomial, European equivalent +- Supports American and European exercise +- Automatic data loading + +**Key Methods:** + +```python +# Compute implied volatilities +result = vol_mgr.get_implied_volatility_timeseries( + start_date="2025-01-01", + end_date="2025-01-31", + strike=150.0, + expiration="2025-06-20", + right="call", + market_model=OptionPricingModel.BSM, + american=False, + dividend_type=DivType.DISCRETE +) +ivs = result.timeseries # pd.Series of implied vols + +# Real-time IV +iv = vol_mgr.rt(strike=150.0, expiration="2025-06-20", right="call") +``` + +**Pricing Models:** +- `BSM`: Black-Scholes-Merton (fast, European only) +- `BINOMIAL`: Cox-Ross-Rubinstein tree (supports American) +- `EURO_EQIV`: European equivalent IV + +### GreekDataManager + +Computes option sensitivities (delta, gamma, vega, theta, rho). + +**Features:** +- Singleton pattern (per symbol) +- 7-day cache expiration +- Models: BSM (analytical), Binomial (numerical) +- Selectable greeks to reduce computation +- Returns DataFrame with all greeks + +**Key Methods:** + +```python +# Compute option greeks +result = greek_mgr.get_greeks_timeseries( + start_date="2025-01-01", + end_date="2025-01-31", + strike=150.0, + expiration="2025-06-20", + right="call", + greeks_to_compute=[GreekType.DELTA, GreekType.GAMMA, GreekType.VEGA] +) +greeks = result.timeseries # pd.DataFrame with [delta, gamma, vega, ...] + +# Real-time greeks +result = greek_mgr.rt(strike=150.0, expiration="2025-06-20", right="call") +delta = result.timeseries["delta"].iloc[0] +``` + +**Available Greeks:** +- `DELTA`: Rate of change of option price with respect to spot +- `GAMMA`: Rate of change of delta with respect to spot +- `VEGA`: Sensitivity to volatility changes +- `THETA`: Time decay +- `RHO`: Sensitivity to interest rate changes +- `VOLGA`: Vomma (sensitivity of vega to volatility) +- `VANNA`: Sensitivity of delta to volatility + +### Theoretical Pricing Functions + +Module-level functions for option pricing and scenario analysis. + +```python +from trade.datamanager.theo import get_option_theoretical_price, calculate_scenarios + +# Theoretical pricing +theo_result = get_option_theoretical_price( + symbol="AAPL", + start_date="2025-01-01", + end_date="2025-01-31", + strike=150.0, + expiration="2025-06-20", + right="call", + market_model=OptionPricingModel.BSM, + dividend_type=DivType.DISCRETE +) +prices = theo_result.timeseries + +# Scenario analysis (stress testing) +scenarios = calculate_scenarios( + symbol="AAPL", + as_of="2025-01-15", + strike=150.0, + expiration="2025-06-20", + right="call", + spot_scenarios=[0.95, 1.0, 1.05], # -5%, 0%, +5% spot moves + vol_scenarios=[-0.05, 0.0, 0.05], # -5, 0, +5 vol points + return_pnl=True +) +grid = scenarios.grid # pd.DataFrame with spot × vol grid +``` + +--- + +## Unified Timeseries Interface + +The `TimeseriesDataManager` provides a consistent API across all data types. + +### Features + +- **Standardized methods**: `rt()`, `get_at_time()`, `get_timeseries()` +- **Preserves original signatures**: Full docstrings and type hints +- **Property-based access**: `ts.spot`, `ts.vol`, `ts.greeks`, etc. +- **Pass-through to underlying**: Access specialized methods when needed + +### Usage + +```python +from trade.datamanager.timeseries import TimeseriesDataManager + +ts = TimeseriesDataManager("AAPL") + +# Spot data - simple interface +spot_rt = ts.spot.rt() +spot_hist = ts.spot.get_timeseries(start_date="2025-01-01", end_date="2025-01-31") + +# Options data - pass parameters explicitly +vol = ts.vol.get_timeseries( + start_date="2025-01-01", + end_date="2025-01-31", + strike=150.0, + expiration="2025-06-20", + right="call" +) + +greeks = ts.greeks.rt(strike=150.0, expiration="2025-06-20", right="call") + +# Access underlying manager if needed +vol_mgr = ts.vol._manager +``` + +### Available Properties + +| Property | Manager | Methods Available | +|----------|---------|-------------------| +| `.spot` | SpotDataManager | rt, get_at_time, get_timeseries | +| `.vol` | VolDataManager | rt, get_at_time, get_timeseries | +| `.greeks` | GreekDataManager | rt, get_at_time, get_timeseries | +| `.forward` | ForwardDataManager | rt, get_timeseries | +| `.dividend` | DividendDataManager | rt, get_timeseries | +| `.rates` | RatesDataManager | rt, get_timeseries | +| `.option_spot` | OptionSpotDataManager | rt, get_at_time, get_timeseries | + +--- + +## Convenience Loaders + +### load_full_option_data() + +One-call function to load complete option data packages. + +```python +from trade.datamanager.loaders import load_full_option_data +from trade.datamanager._enums import DivType + +# Load all required data in one call +pack = load_full_option_data( + symbol="AAPL", + strike=150.0, + expiration="2025-06-20", + right="call", + start_date="2025-01-01", + end_date="2025-01-31", + dividend_type=DivType.DISCRETE +) + +# Access all components +spot = pack.spot.timeseries # Spot prices +forward = pack.forward.timeseries # Forward prices +dividend = pack.dividend.timeseries # Dividend schedules +rates = pack.rates.timeseries # Risk-free rates +option = pack.option_spot.timeseries # Market option prices +vol = pack.vol.timeseries # Implied volatilities +greeks = pack.greek.timeseries # Option greeks (DataFrame) +``` + +**Modes:** +- **Timeseries**: Provide `start_date` and `end_date` +- **Single date**: Provide `as_of` +- **Real-time**: Set `rt=True` + +--- + +## Configuration + +### OptionDataConfig (Singleton) + +Global configuration for all data managers. + +```python +from trade.datamanager.config import OptionDataConfig + +config = OptionDataConfig() + +# Modify settings +config.option_model = OptionPricingModel.BSM +config.dividend_type = DivType.DISCRETE +config.n_steps = 200 # Binomial tree steps +config.undo_adjust = True # Use split-adjusted prices +``` + +**Key Settings:** + +| Setting | Type | Default | Description | +|---------|------|---------|-------------| +| `option_spot_endpoint_source` | OptionSpotEndpointSource | EOD | Data source for option prices | +| `dividend_type` | DivType | DISCRETE | Dividend model (DISCRETE/CONTINUOUS) | +| `option_model` | OptionPricingModel | BSM | Pricing model | +| `volatility_model` | VolatilityModel | MARKET | Vol source (MARKET/MODEL_DYNAMIC) | +| `n_steps` | int | 100 | Binomial tree steps | +| `undo_adjust` | bool | True | Use split-adjusted prices | +| `model_price` | ModelPrice | MIDPOINT | Price type (MIDPOINT/BID/ASK/etc.) | +| `real_time_fallback_option` | RealTimeFallbackOption | USE_LAST_AVAILABLE | Fallback for missing RT data | + +### Key Enumerations + +**DivType** (from optionlib): +- `DISCRETE`: Schedule-based dividends +- `CONTINUOUS`: Yield-based dividends + +**OptionPricingModel**: +- `BSM`: Black-Scholes-Merton (fast, European) +- `BINOMIAL`: CRR tree (slower, American) +- `EURO_EQIV`: European equivalent + +**VolatilityModel**: +- `MARKET`: Implied from market prices +- `MODEL_DYNAMIC`: Computed from model + +**GreekType**: +- `DELTA`, `GAMMA`, `VEGA`, `THETA`, `RHO`, `VOLGA`, `VANNA` + +--- + +## Caching System + +### Three-Tier Architecture + +1. **Memory Cache**: Fastest access, per-manager instance, cleared on exit +2. **Disk Cache**: Persistent across sessions, configurable expiration +3. **Partial Merging**: Detects missing dates, fetches only gaps, merges with existing + +### Cache Configuration + +Each manager defines cache behavior via `CacheSpec`: + +```python +from trade.datamanager.base import CacheSpec + +CACHE_SPEC = CacheSpec( + base_dir=DM_GEN_PATH, # Cache directory + cache_fname="spot_data_manager", # Cache filename + default_expire_days=45, # Full cache expiration + clear_on_exit=False # Auto-clear on exit +) +``` + +### Cache Keys + +Constructed using `construct_cache_key()` utility: + +**Components:** +- Symbol (e.g., "AAPL") +- Artifact type (SPOT, IV, GREEKS, etc.) +- Series ID (HIST, AT_TIME, SNAPSHOT) +- Interval (EOD, INTRADAY, NA) +- Optional namespace +- Additional metadata (strike, expiration, model, etc.) + +**Example Keys:** +``` +AAPL__hist__eod__spot__undo_True +AAPL__hist__eod__iv__K150.0_exp20250620_rc_model_bsm +``` + +--- + +## Best Practices + +### ✅ DO + +- **Use singleton managers** - They cache internally, avoid duplicate instances +- **Use `to_datetime()`** for all date conversions (from `trade.helpers.helper`) +- **Provide `DividendsResult`** to `ForwardDataManager` to avoid re-fetching +- **Use `undo_adjust=True`** for backtesting (split-adjusted prices) +- **Specify `greeks_to_compute`** to reduce computation time +- **Use `model_price=MIDPOINT`** for fair value calculations +- **Check `result.is_empty()`** before using data +- **Use `rt()` methods** for real-time data +- **Let managers handle data loading** automatically + +### ❌ DON'T + +- **Don't create multiple instances** of same symbol manager +- **Don't use `datetime.strptime()`** or `pd.to_datetime()` directly +- **Don't mix `undo_adjust=True/False`** in same calculation +- **Don't ignore `dividend_type`** when comparing prices +- **Don't call `_private_methods()`** directly +- **Don't modify `OptionDataConfig`** after initialization +- **Don't assume cache is warm** - check for empty results +- **Don't use BSM model** for American options pricing + +### Common Issues + +| Issue | Solution | +|-------|----------| +| "Data not available" | Check date range with `is_available_on_date()` | +| "Cache miss" | Normal on first run, subsequent runs hit cache | +| "IV solver failed" | Option may be deep ITM/OTM or have bad data | +| "Mismatched undo_adjust" | Ensure consistent split adjustment across managers | + +### Date Handling (CRITICAL) + +**Always use** `to_datetime` from `trade.helpers.helper`: + +```python +from trade.helpers.helper import to_datetime + +# Handles strings, datetime objects, and iterables +date_obj = to_datetime("2025-01-15") +dates = to_datetime(["2025-01-15", "2025-01-16"]) +``` + +**Never use:** +- `datetime.strptime()` +- `pd.to_datetime()` directly + +--- + +## Complete Example: Option Backtesting Workflow + +```python +from trade.datamanager import ( + SpotDataManager, VolDataManager, GreekDataManager +) +from trade.datamanager.timeseries import TimeseriesDataManager +from trade.datamanager.loaders import load_full_option_data +from trade.datamanager._enums import DivType, OptionPricingModel, GreekType + +# Parameters +symbol = "AAPL" +start, end = "2025-01-01", "2025-01-31" +strike, expiration, right = 150.0, "2025-06-20", "call" + +# Method 1: Using individual managers (granular control) +spot_mgr = SpotDataManager(symbol) +vol_mgr = VolDataManager(symbol) +greek_mgr = GreekDataManager(symbol) + +spot_result = spot_mgr.get_spot_timeseries(start, end, undo_adjust=True) +vol_result = vol_mgr.get_implied_volatility_timeseries( + start, end, strike, expiration, right, + market_model=OptionPricingModel.BSM, + dividend_type=DivType.DISCRETE +) +greek_result = greek_mgr.get_greeks_timeseries( + start, end, strike, expiration, right, + greeks_to_compute=[GreekType.DELTA, GreekType.GAMMA, GreekType.VEGA] +) + +# Method 2: Using unified interface (simplified) +ts = TimeseriesDataManager(symbol) +spot_result = ts.spot.get_timeseries(start, end) +vol_result = ts.vol.get_timeseries(start, end, strike, expiration, right) +greek_result = ts.greeks.get_timeseries(start, end, strike, expiration, right) + +# Method 3: One-call loader (most convenient) +pack = load_full_option_data( + symbol=symbol, + strike=strike, + expiration=expiration, + right=right, + start_date=start, + end_date=end, + dividend_type=DivType.DISCRETE +) + +# Access results +spots = pack.spot.timeseries +vols = pack.vol.timeseries +greeks_df = pack.greek.timeseries # DataFrame with delta, gamma, vega, etc. + +# Run scenario analysis +from trade.datamanager.theo import calculate_scenarios + +scenarios = calculate_scenarios( + symbol=symbol, + as_of="2025-01-15", + strike=strike, + expiration=expiration, + right=right, + spot_scenarios=[0.95, 1.0, 1.05], # ±5% spot moves + vol_scenarios=[-0.05, 0.0, 0.05], # ±5 vol points + return_pnl=True +) + +print(scenarios.grid) +``` + +--- + +## Module Structure + +``` +trade/datamanager/ +├── __init__.py # Public API exports +├── base.py # BaseDataManager, CacheSpec +├── config.py # OptionDataConfig singleton +├── result.py # Result dataclasses +├── _enums.py # Enumerations +│ +├── spot.py # SpotDataManager +├── rates.py # RatesDataManager +├── dividend.py # DividendDataManager +├── forward.py # ForwardDataManager +├── option_spot.py # OptionSpotDataManager +├── market_data.py # MarketTimeseries +│ +├── vol.py # VolDataManager +├── greeks.py # GreekDataManager +├── theo.py # Theoretical pricing functions +│ +├── timeseries.py # TimeseriesDataManager, TimeseriesAdapter +├── loaders.py # load_full_option_data() +│ +├── utils/ +│ ├── model.py # Model data loading +│ ├── vol_helpers.py # Volatility calculation +│ ├── greeks_helpers.py # Greek calculation +│ ├── date.py # Date utilities +│ ├── cache.py # Cache utilities +│ ├── data_structure.py # Data validation +│ ├── logging.py # Logging configuration +│ └── enums_utils.py # Cache key construction +│ +└── market_data_helpers/ + └── spot.py # Spot price loading helpers +``` + +--- + +## Contributing + +To add a new manager: + +1. Inherit from `BaseDataManager` +2. Define `CACHE_NAME` (unique string) +3. Define `CACHE_SPEC` (CacheSpec instance) +4. Define `DEFAULT_SERIES_ID` (SeriesId enum) +5. Implement `__init__` with singleton pattern if needed +6. Add methods returning Result subclass +7. Use `self.cache.get()` / `self.cache.set()` for caching +8. Use `construct_cache_key()` for key generation + +**Example skeleton:** + +```python +from trade.datamanager.base import BaseDataManager, CacheSpec +from trade.datamanager._enums import SeriesId + +class MyDataManager(BaseDataManager): + CACHE_NAME: str = "my_data_manager" + CACHE_SPEC: CacheSpec = CacheSpec(cache_fname=CACHE_NAME) + DEFAULT_SERIES_ID: SeriesId = SeriesId.HIST + + def __init__(self, symbol: str): + super().__init__(symbol=symbol) + self.symbol = symbol + + def get_my_data(self, start, end) -> MyResult: + key = construct_cache_key(...) + cached = self.cache.get(key) + if cached: + return cached + + # Fetch data + result = MyResult(...) + self.cache.set(key, result) + return result +``` + +--- + +## License + +See main project LICENSE file. + +## Support + +For issues and questions, please refer to the main QuantTools repository. diff --git a/trade/datamanager/__init__.py b/trade/datamanager/__init__.py index e69de29..e36858b 100644 --- a/trade/datamanager/__init__.py +++ b/trade/datamanager/__init__.py @@ -0,0 +1,226 @@ +"""QuantTools DataManager - Comprehensive market data infrastructure for options trading. + +This module provides a complete suite of data managers for retrieving, caching, and +computing market data and derived metrics for quantitative options trading and backtesting. + +Key Components +-------------- + +**Market Data Managers:** + - SpotDataManager: Underlying equity spot prices with split adjustment + - RatesDataManager: Risk-free interest rates from Treasury bills + - DividendDataManager: Dividend schedules (discrete/continuous models) + - OptionSpotDataManager: Option contract market prices from ThetaData + - MarketTimeseries: Central data repository with lazy loading + +**Derived Metrics Managers:** + - ForwardDataManager: Forward price computation using cost-of-carry models + - VolDataManager: Implied volatility calculation (BSM, Binomial) + - GreekDataManager: Option sensitivities (delta, gamma, vega, theta, rho) + +**Unified Interfaces:** + - TimeseriesDataManager: Consistent API across all managers (rt, get_at_time, get_timeseries) + - loaders.load_full_option_data(): One-call comprehensive data loading + +**Utilities:** + - BaseDataManager: Abstract base with caching, configuration, logging + - Result classes: Type-safe containers (SpotResult, VolatilityResult, GreekResultSet, etc.) + - CacheSpec: Cache configuration with expiration control + - Theoretical pricing: get_option_theoretical_price(), calculate_scenarios() + +Design Features +--------------- + +- **Singleton pattern** per symbol for efficient resource management +- **Multi-tier caching** (memory + disk) with intelligent expiration +- **Automatic data loading** from multiple sources (ThetaData, OpenBB, YFinance) +- **Split adjustment handling** for accurate backtesting +- **Type-safe results** with full metadata preservation +- **Consistent API** across all managers via adapter pattern + +Quick Start Examples +-------------------- + +**Individual Manager Usage:** + >>> from trade.datamanager import SpotDataManager, VolDataManager, GreekDataManager + >>> + >>> # Load spot prices + >>> spot_mgr = SpotDataManager("AAPL") + >>> spot_result = spot_mgr.get_spot_timeseries( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... undo_adjust=True + ... ) + >>> prices = spot_result.daily_spot + >>> + >>> # Compute implied volatilities + >>> vol_mgr = VolDataManager("AAPL") + >>> vol_result = vol_mgr.get_implied_volatility_timeseries( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... strike=150.0, + ... expiration="2025-06-20", + ... right="call" + ... ) + >>> ivs = vol_result.timeseries + +**Unified Interface (Recommended):** + >>> from trade.datamanager import TimeseriesDataManager + >>> + >>> # Single entry point for all data types + >>> ts = TimeseriesDataManager("AAPL") + >>> + >>> # Consistent interface across managers + >>> spot = ts.spot.get_timeseries(start_date="2025-01-01", end_date="2025-01-31") + >>> vol = ts.vol.get_timeseries( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... strike=150.0, + ... expiration="2025-06-20", + ... right="call" + ... ) + >>> greeks = ts.greeks.rt(strike=150.0, expiration="2025-06-20", right="call") + +**One-Call Data Loading:** + >>> from trade.datamanager.loaders import load_full_option_data + >>> from trade.datamanager._enums import DivType + >>> + >>> # Load all option data (spot, forward, dividend, vol, greeks, rates) + >>> pack = load_full_option_data( + ... symbol="AAPL", + ... strike=150.0, + ... expiration="2025-06-20", + ... right="call", + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... dividend_type=DivType.DISCRETE + ... ) + >>> + >>> # Access all components + >>> spot = pack.spot.timeseries + >>> vol = pack.vol.timeseries + >>> greeks = pack.greek.timeseries + +**Scenario Analysis:** + >>> from trade.datamanager import calculate_scenarios + >>> + >>> # Run stress tests on option position + >>> scenarios = calculate_scenarios( + ... symbol="AAPL", + ... as_of="2025-01-15", + ... strike=150.0, + ... expiration="2025-06-20", + ... right="call", + ... spot_scenarios=[0.95, 1.0, 1.05], # ±5% spot moves + ... vol_scenarios=[-0.05, 0.0, 0.05], # ±5 vol points + ... return_pnl=True + ... ) + >>> print(scenarios.grid) # pd.DataFrame with spot × vol grid + +Configuration +------------- + +Global settings via OptionDataConfig singleton: + >>> from trade.datamanager.config import OptionDataConfig + >>> from trade.datamanager._enums import OptionPricingModel, DivType + >>> + >>> config = OptionDataConfig() + >>> config.option_model = OptionPricingModel.BSM + >>> config.dividend_type = DivType.DISCRETE + >>> config.n_steps = 200 # Binomial tree steps + +Important Notes +--------------- + +**Date Conversion:** + Always use `to_datetime()` from `trade.helpers.helper` for date conversions. + Never use `datetime.strptime()` or `pd.to_datetime()` directly. + +**Split Adjustment:** + Use `undo_adjust=True` for backtesting to get split-adjusted prices. + Ensure consistent `undo_adjust` across all managers in same calculation. + +**Caching:** + Managers use singleton pattern per symbol - avoid creating duplicate instances. + Cache is automatically managed with configurable expiration. + +**Real-time Data:** + Use `.rt()` methods for real-time/latest data. + Configure fallback behavior via `OptionDataConfig.real_time_fallback_option`. + +See Also +-------- + +For comprehensive documentation, see: + - trade/datamanager/README.md: Complete module guide + - Individual manager docstrings: Detailed API documentation + - trade/datamanager/loaders.py: Convenience loader functions + - trade/datamanager/timeseries.py: Unified interface documentation + +Module Structure +---------------- + + datamanager/ + ├── Market Data Layer + │ ├── spot.py - SpotDataManager + │ ├── rates.py - RatesDataManager + │ ├── dividend.py - DividendDataManager + │ ├── option_spot.py - OptionSpotDataManager + │ └── market_data.py - MarketTimeseries + │ + ├── Derived Metrics Layer + │ ├── forward.py - ForwardDataManager + │ ├── vol.py - VolDataManager + │ ├── greeks.py - GreekDataManager + │ └── theo.py - Theoretical pricing functions + │ + ├── Unified Interfaces + │ ├── timeseries.py - TimeseriesDataManager + │ └── loaders.py - load_full_option_data() + │ + ├── Core Infrastructure + │ ├── base.py - BaseDataManager, CacheSpec + │ ├── config.py - OptionDataConfig + │ ├── result.py - Result dataclasses + │ ├── _enums.py - Enumerations + │ └── vars.py - Global instances + │ + └── utils/ - Helper utilities +""" + +from .dividend import DividendDataManager +from .forward import ForwardDataManager +from .rates import RatesDataManager +from .option_spot import OptionSpotDataManager +from .spot import SpotDataManager +from .base import BaseDataManager, CacheSpec +from .vol import VolDataManager +from .greeks import GreekDataManager +from .result import Result, SpotResult, ForwardResult, DividendsResult, RatesResult, OptionSpotResult +from .timeseries import TimeseriesDataManager +from .market_data import MarketTimeseries +from .theo import get_option_theoretical_price, calculate_scenarios +from .utils.model import assert_synchronized_model + +__all__ = [ + "DividendDataManager", + "ForwardDataManager", + "RatesDataManager", + "OptionSpotDataManager", + "SpotDataManager", + "BaseDataManager", + "Result", + "SpotResult", + "ForwardResult", + "DividendsResult", + "RatesResult", + "OptionSpotResult", + "MarketTimeseries", + "TimeseriesDataManager", + "CacheSpec", + "VolDataManager", + "GreekDataManager", + "assert_synchronized_model", + "get_option_theoretical_price", + "calculate_scenarios", +] diff --git a/trade/datamanager/_enums.py b/trade/datamanager/_enums.py new file mode 100644 index 0000000..0966a36 --- /dev/null +++ b/trade/datamanager/_enums.py @@ -0,0 +1,98 @@ +from enum import Enum +from typing import Literal, get_args +from trade.optionlib.config.types import DivType # noqa + +class Interval(str, Enum): + INTRADAY = "intraday" # historical intraday timestamp + EOD = "eod" # end-of-day daily snapshot + NA = "na" # not applicable + +class RealTimeFallbackOption(str, Enum): + RAISE_ERROR = "raise_error" + USE_LAST_AVAILABLE = "use_last_available" + ZEROED = "zeroed" + NAN = "nan" +class SeriesId(str, Enum): + HIST = "hist" + AT_TIME = "at_time" + SNAPSHOT = "snapshot" + +class ArtifactType(str, Enum): + # Market / inputs + SPOT = "spot" + CHAIN = "chain" + RATES = "rates" + DIVS = "divs" + FWD = "forward" + OPTION_SPOT = "option_spot" + DATES = "dates" + + # Volatility + IV = "iv" + TVAR = "tvar" + + # Greeks + GREEKS = "greeks" + DELTA = "delta" + GAMMA = "gamma" + VEGA = "vega" + THETA = "theta" + VOLGA = "volga" + VANNA = "vanna" + RHO = "rho" + +class GreekType(str, Enum): + GREEKS = "greeks" + DELTA = "delta" + GAMMA = "gamma" + VEGA = "vega" + THETA = "theta" + VOLGA = "volga" + VANNA = "vanna" + RHO = "rho" + +class OptionSpotEndpointSource(Enum): + """ + Thetadata creates a native EOD report every day by 6pm ET. + This enum allows choosing between using that EOD report or the intraday quote end point. + This is essential because during market hours, the EOD report is not yet available. + """ + + EOD = "eod" + QUOTE = "quote" + +class ModelPrice(Enum): + """Enumeration of model price type.""" + + MIDPOINT = "midpoint" + BID = "bid" + ASK = "ask" + OPEN = "open" + CLOSE = "close" + + + +class OptionPricingModel(Enum): + """Enumeration of option pricing model.""" + + BSM = "Black-Scholes" + BINOMIAL = "Binomial" + EURO_EQIV = "European Equivalent" + + +class VolatilityModel(Enum): + """Enumeration of volatility model.""" + + MARKET = "market" + MODEL_DYNAMIC = "model_dynamic" + + +GREEKS = Literal[ + GreekType.DELTA.value, + GreekType.GAMMA.value, + GreekType.THETA.value, + GreekType.VEGA.value, + GreekType.RHO.value, + GreekType.VOLGA.value, +] +AVAILABLE_GREEKS = get_args(GREEKS) \ No newline at end of file diff --git a/trade/datamanager/base.py b/trade/datamanager/base.py new file mode 100644 index 0000000..f4712b5 --- /dev/null +++ b/trade/datamanager/base.py @@ -0,0 +1,231 @@ +from abc import ABC +from dataclasses import dataclass +from typing import Any, Callable, ClassVar, Dict, Optional, Type, TypeVar +from trade.datamanager.config import OptionDataConfig +from trade.datamanager.utils.logging import get_logging_level +from trade.helpers.helper import CustomCache +from trade.helpers.Logging import setup_logger +from pathlib import Path +from .vars import DM_GEN_PATH +from ._enums import Interval, ArtifactType, SeriesId +from .utils.enums_utils import construct_cache_key +logger = setup_logger("trade.datamanager.base", stream_log_level=get_logging_level()) + +# Assumes you already have these (from your cache_key module) +# from cache_key import construct_cache_key, Interval, ArtifactType, SeriesId + +T = TypeVar("T") + + +# REMEBER: Take out the commented out parts +@dataclass(frozen=True, slots=True) +class CacheSpec: + """ + Optional: a small config object you can pass around, so all managers + initialize their caches in a consistent way. + + If you already have a cache registry/factory, you may not need this. + + args: + base_dir (Optional[Path]): Directory for cache storage. + default_expire_days (Optional[int]): Default expiration time in days. This is how many days till the entire cache entry expires. + default_expire_seconds (Optional[int]): Default expiration time in seconds. This is how many seconds till a single cache entry expires. + cache_fname (Optional[str]): Foldername for the cache storage. + clear_on_exit (bool): If True, clears the cache on exit. + """ + + base_dir: Optional[Path] = DM_GEN_PATH.as_posix() + default_expire_days: Optional[int] = 500 + default_expire_seconds: Optional[int] = None + cache_fname: Optional[str] = None + clear_on_exit: bool = False + + +class BaseDataManager(ABC): + """ + Foundation class for all DataManagers. + + Goals: + - Every inheritor gets a cache. + - Every inheritor MUST define CACHE_NAME. + - Provide consistent key creation (namespaced). + - Provide thin get/set/get_or_compute wrappers. + - Keep business logic out of the base. + """ + + DEFAULT_INTERVAL: ClassVar[Optional["Interval"]] = None + DEFAULT_SERIES_ID: ClassVar["SeriesId"] # prefer explicit in subclasses + _CACHE_NAME_REGISTRY: ClassVar[Dict[str, Type["BaseDataManager"]]] = {} + CONFIG: OptionDataConfig = OptionDataConfig() + + def __init_subclass__(cls, **kwargs: Any) -> None: + """Enforces that all subclasses define CACHE_NAME and DEFAULT_SERIES_ID.""" + super().__init_subclass__(**kwargs) + + if cls is BaseDataManager: + return + + cache_name = getattr(cls, "CACHE_NAME", None) + cache_spec = getattr(cls, "CACHE_SPEC", None) + + if not isinstance(cache_name, str) or not cache_name.strip(): + raise TypeError(f"{cls.__name__} must define a non-empty class variable CACHE_NAME: str") + + if not isinstance(cache_spec, CacheSpec): + raise TypeError(f"{cls.__name__} must define a class variable CACHE_SPEC of type CacheSpec") + + cache_name = cache_name.strip() + + # Enforce uniqueness to avoid collisions + existing = cls._CACHE_NAME_REGISTRY.get(cache_name) # noqa + # if existing is not None and existing is not cls: + # raise TypeError( + # f"Duplicate CACHE_NAME='{cache_name}'. " + # f"Already used by {existing.__name__}. " + # f"Pick a unique CACHE_NAME for {cls.__name__}." + # ) + + cls._CACHE_NAME_REGISTRY[cache_name] = cls + + # Optional: enforce that DEFAULT_SERIES_ID exists (if you want) + if not hasattr(cls, "DEFAULT_SERIES_ID"): + raise TypeError(f"{cls.__name__} must define DEFAULT_SERIES_ID (e.g., SeriesId.HIST).") + + def __init__( + self, + *, + enable_namespacing: bool = False, + symbol: Optional[str] = None, + ) -> None: + """ + Parameters + ---------- + cache: + Your existing CustomCache instance (diskcache-backed). + enable_namespacing: + If True, keys are prefixed with CACHE_NAME to avoid collisions. + """ + self.cache_spec = self.CACHE_SPEC + self.symbol = symbol + self.cache = CustomCache( + location=self.cache_spec.base_dir, + fname=self.cache_spec.cache_fname, + expire_days=self.cache_spec.default_expire_days, + clear_on_exit=self.cache_spec.clear_on_exit, + ) + self.enable_namespacing = enable_namespacing + out = self.cache.expire() + if out > 0: + logger.info(f"{self.CACHE_NAME} has expired {out} entries") + + + def __repr__(self) -> str: + return f"<{self.__class__.__name__}(symbol={self.symbol}, cache='{self.CACHE_NAME}', all_entries={len(self.cache)})>" + + @classmethod + def get_cache(cls) -> CustomCache: + """Returns the cache instance.""" + + c = CustomCache( + location=cls.CACHE_SPEC.base_dir, + fname=cls.CACHE_SPEC.cache_fname, + expire_days=cls.CACHE_SPEC.default_expire_days, + clear_on_exit=cls.CACHE_SPEC.clear_on_exit, + ) + return c + + @classmethod + def clear_all_caches(cls) -> None: + """Clears caches for all registered DataManager subclasses.""" + for cache_name, manager_cls in cls._CACHE_NAME_REGISTRY.items(): + logger.info(f"Clearing cache for {manager_cls.__name__} (CACHE_NAME='{cache_name}')") + manager_cls.get_cache().clear() + + def clear_cache(self) -> None: + """Clears this DataManager's cache.""" + logger.info(f"Clearing cache for {self.__class__.__name__} (CACHE_NAME='{self.CACHE_NAME}')") + self.cache.clear() + + # Key construction + def make_key( + self, + *, + symbol: str, + interval: Optional[Interval] = None, + artifact_type: ArtifactType, + series_id: Optional[SeriesId] = None, + **extra_parts: Any, + ) -> str: + """ + Namespaced key builder that wraps your construct_cache_key. + + You decided: + - no caching SNAPSHOT series_id (but you might still request it) + - time is explicit if you do AT_TIME + """ + interval = interval if interval is not None else self.DEFAULT_INTERVAL + series_id = series_id if series_id is not None else self.DEFAULT_SERIES_ID + + raw = construct_cache_key( + symbol=symbol, + interval=interval, + artifact_type=artifact_type, + series_id=series_id, + **extra_parts, + ) + + if not self.enable_namespacing: + return raw + + return f"{self.CACHE_NAME}|{raw}" + + # Cache IO + def get(self, key: str, default: Any = None) -> Any: + return self.cache.get(key, default=default) + + def set(self, key: str, value: Any, *, expire: Optional[int] = None) -> None: + if expire is None: + expire = self.cache_spec.default_expire_seconds + self.cache.set(key, value, expire=expire) + + def delete(self, key: str) -> None: + self.cache.delete(key) + + def contains(self, key: str) -> bool: + return key in self.cache + + def cache_it(self, key: str, value: Any, *, expire: Optional[int] = None) -> None: + raise NotImplementedError(f"{self.__class__.__name__}.cache() not implemented.") + + def get_or_compute( + self, + key: str, + compute_fn: Callable[[], T], + *, + expire: Optional[int] = None, + force: bool = False, + ) -> T: + """ + Read-through caching helper. + + force=True bypasses cache read, recomputes and overwrites cache. + """ + if not force: + hit = self.cache.get(key, default=None) + if hit is not None: + return hit # type: ignore[return-value] + + value = compute_fn() + self.set(key, value, expire=expire) + return value + + # Offload hook (cron calls this) + def offload(self, *args: Any, **kwargs: Any) -> None: + """ + Optional standard hook. + + You can override in subclasses or implement a shared offloader that + knows how to iterate keys / export values. Keeping it as a stub here + avoids forcing a storage design too early. + """ + raise NotImplementedError(f"{self.__class__.__name__}.offload() not implemented.") diff --git a/trade/datamanager/config.py b/trade/datamanager/config.py new file mode 100644 index 0000000..3758ba5 --- /dev/null +++ b/trade/datamanager/config.py @@ -0,0 +1,70 @@ +from dataclasses import dataclass +from typing import List, Union +from trade.helpers.helper_types import SingletonMetaClass +from trade.optionlib.config.types import (DiscreteDivGrowthModel, DivType,) +from trade.optionlib.config.defaults import DIVIDEND_LOOKBACK_YEARS +from ._enums import ( + GreekType, + OptionSpotEndpointSource, + OptionPricingModel, + VolatilityModel, + RealTimeFallbackOption, + ModelPrice +) +from typeguard import check_type +from typing import get_type_hints + +@dataclass +class OptionDataConfig(metaclass=SingletonMetaClass): + """Configuration for DataManager.""" + + option_spot_endpoint_source: OptionSpotEndpointSource = OptionSpotEndpointSource.EOD + default_lookback_years: int = DIVIDEND_LOOKBACK_YEARS + default_forecast_method: DiscreteDivGrowthModel = DiscreteDivGrowthModel.CONSTANT + dividend_type: DivType = DivType.DISCRETE + include_special_dividends: bool = False + option_model: OptionPricingModel = OptionPricingModel.BINOMIAL + volatility_model: VolatilityModel = VolatilityModel.MARKET + n_steps: int = 100 + undo_adjust: bool = True + real_time_fallback_option: RealTimeFallbackOption = RealTimeFallbackOption.USE_LAST_AVAILABLE + model_price: ModelPrice = ModelPrice.MIDPOINT + filter_out_special_dividends: bool = True + greeks_to_compute: Union[List[GreekType], GreekType] = GreekType.GREEKS + + + def assert_valid(self) -> None: + """Validates all configuration values against business rules.""" + assert self.default_lookback_years > 0, "Lookback years must be positive." + assert self.default_lookback_years <= 5, "Lookback years seems too large. Max 5." + assert isinstance( + self.default_forecast_method, DiscreteDivGrowthModel + ), "Invalid forecast method. Expected DiscreteDivGrowthModel Enum." + assert isinstance(self.dividend_type, DivType), "Invalid dividend type. Expected DivType Enum." + assert isinstance(self.include_special_dividends, bool), "include_special_dividends must be a boolean." + assert isinstance( + self.option_spot_endpoint_source, OptionSpotEndpointSource + ), "Invalid option_spot_endpoint_source. Expected OptionSpotEndpointSource Enum." + assert isinstance( + self.option_model, OptionPricingModel + ), "Invalid option_model. Expected OptionPricingModel Enum." + assert isinstance( + self.volatility_model, VolatilityModel + ), "Invalid volatility_model. Expected VolatilityModel Enum." + assert isinstance( + self.real_time_fallback_option, RealTimeFallbackOption + ), "Invalid real_time_fallback_option. Expected RealTimeFallbackOption Enum." + assert isinstance(self.n_steps, int) and self.n_steps > 0, "n_steps must be a positive integer." + assert isinstance(self.undo_adjust, bool), "undo_adjust must be a boolean." + assert isinstance(self.model_price, ModelPrice), "Invalid model_price. Expected ModelPrice Enum." + def __post_init__(self) -> None: + """Validates configuration after initialization.""" + self.assert_valid() + + def __setattr__(self, name, value): + """Validates configuration after any attribute change.""" + all_hints = get_type_hints(self.__class__) + hint = all_hints.get(name) + if hint is not None: + check_type(value, hint) + super().__setattr__(name, value) diff --git a/trade/datamanager/demos/test_all.ipynb b/trade/datamanager/demos/test_all.ipynb new file mode 100644 index 0000000..874896d --- /dev/null +++ b/trade/datamanager/demos/test_all.ipynb @@ -0,0 +1,4598 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 18, + "id": "765af416", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The autoreload extension is already loaded. To reload it, use:\n", + " %reload_ext autoreload\n" + ] + }, + { + "data": { + "text/plain": [ + "{('SBUX', datetime.date(2026, 2, 14))}" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2\n", + "from trade.datamanager import (\n", + " DividendDataManager,\n", + " SpotDataManager,\n", + " OptionSpotDataManager,\n", + " VolDataManager,\n", + " RatesDataManager,\n", + " BaseDataManager,\n", + " ForwardDataManager,\n", + " GreekDataManager,\n", + " assert_synchronized_model,\n", + " get_option_theoretical_price,\n", + " calculate_scenarios\n", + ")\n", + "\n", + "from trade.datamanager._enums import OptionSpotEndpointSource, SeriesId, OptionPricingModel, VolatilityModel, RealTimeFallbackOption, GreekType, ModelPrice\n", + "from trade.optionlib.config.types import DivType\n", + "from trade.helpers.helper_types import SingletonMetaClass\n", + "from trade.datamanager.vars import get_loaded_names, get_times_series\n", + "get_loaded_names()" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "4a78e94a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2026-02-14 18:46:54 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: SPY.\n", + "2026-02-14 18:46:54 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: SPY\n", + "2026-02-14 18:46:54 [test] trade.datamanager.utils INFO: Sanitizing data from 2017-01-03 00:00:00 to 2026-02-13 17:55:04.744763...\n", + "2026-02-14 18:46:54 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: SPY.\n", + "2026-02-14 18:46:54 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: SPY\n", + "2026-02-14 18:46:54 [test] trade.datamanager.utils INFO: Sanitizing data from 2017-01-03 00:00:00 to 2026-02-13 17:55:04.744763...\n", + "2026-02-14 18:46:54 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: SPY.\n", + "2026-02-14 18:46:54 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: SPY\n", + "2026-02-14 18:46:54 [test] trade.datamanager.utils INFO: Sanitizing data from 2017-01-03 00:00:00 to 2026-02-13 17:55:04.744763...\n", + "2026-02-14 18:46:54 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: SPY.\n", + "2026-02-14 18:46:54 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: SPY\n", + "2026-02-14 18:46:54 [test] trade.datamanager.utils INFO: Sanitizing data from 2017-01-03 00:00:00 to 2026-02-13 17:55:04.744763...\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
openhighlowclosevolumechain_priceunadjusted_closesplit_ratiocum_splitsplit_factormax_cum_splitis_split_date
datetime
2017-01-03194.825819195.509760193.821573194.99897891366500194.998978194.9989781.01.01.01.0False
2017-01-04195.327912196.306201195.319260196.15902778744400196.159027196.1590271.01.01.01.0False
2017-01-05195.890713196.159090195.206772196.00325078379000196.003250196.0032501.01.01.01.0False
2017-01-06196.115743197.171945195.570324196.70445371559900196.704453196.7044531.01.01.01.0False
2017-01-09196.444740196.583262196.020524196.05516146939700196.055161196.0551611.01.01.01.0False
.......................................
2026-02-09689.419983695.869995688.340027693.95001273885200693.950012693.9500121.01.01.01.0False
2026-02-10694.950012696.539978691.659973692.11999565185700692.119995692.1199951.01.01.01.0False
2026-02-11696.390015697.140015689.179993691.96002276353900691.960022691.9600221.01.01.01.0False
2026-02-12694.239990695.349976680.369995681.270020118829000681.270020681.2700201.01.01.01.0False
2026-02-13681.690002686.280029677.520020681.75000096150400681.750000681.7500001.01.01.01.0False
\n", + "

2292 rows × 12 columns

\n", + "
" + ], + "text/plain": [ + " open high low close volume \\\n", + "datetime \n", + "2017-01-03 194.825819 195.509760 193.821573 194.998978 91366500 \n", + "2017-01-04 195.327912 196.306201 195.319260 196.159027 78744400 \n", + "2017-01-05 195.890713 196.159090 195.206772 196.003250 78379000 \n", + "2017-01-06 196.115743 197.171945 195.570324 196.704453 71559900 \n", + "2017-01-09 196.444740 196.583262 196.020524 196.055161 46939700 \n", + "... ... ... ... ... ... \n", + "2026-02-09 689.419983 695.869995 688.340027 693.950012 73885200 \n", + "2026-02-10 694.950012 696.539978 691.659973 692.119995 65185700 \n", + "2026-02-11 696.390015 697.140015 689.179993 691.960022 76353900 \n", + "2026-02-12 694.239990 695.349976 680.369995 681.270020 118829000 \n", + "2026-02-13 681.690002 686.280029 677.520020 681.750000 96150400 \n", + "\n", + " chain_price unadjusted_close split_ratio cum_split \\\n", + "datetime \n", + "2017-01-03 194.998978 194.998978 1.0 1.0 \n", + "2017-01-04 196.159027 196.159027 1.0 1.0 \n", + "2017-01-05 196.003250 196.003250 1.0 1.0 \n", + "2017-01-06 196.704453 196.704453 1.0 1.0 \n", + "2017-01-09 196.055161 196.055161 1.0 1.0 \n", + "... ... ... ... ... \n", + "2026-02-09 693.950012 693.950012 1.0 1.0 \n", + "2026-02-10 692.119995 692.119995 1.0 1.0 \n", + "2026-02-11 691.960022 691.960022 1.0 1.0 \n", + "2026-02-12 681.270020 681.270020 1.0 1.0 \n", + "2026-02-13 681.750000 681.750000 1.0 1.0 \n", + "\n", + " split_factor max_cum_split is_split_date \n", + "datetime \n", + "2017-01-03 1.0 1.0 False \n", + "2017-01-04 1.0 1.0 False \n", + "2017-01-05 1.0 1.0 False \n", + "2017-01-06 1.0 1.0 False \n", + "2017-01-09 1.0 1.0 False \n", + "... ... ... ... \n", + "2026-02-09 1.0 1.0 False \n", + "2026-02-10 1.0 1.0 False \n", + "2026-02-11 1.0 1.0 False \n", + "2026-02-12 1.0 1.0 False \n", + "2026-02-13 1.0 1.0 False \n", + "\n", + "[2292 rows x 12 columns]" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "get_times_series().get_timeseries(\"SPY\").spot" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "071f3d53", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2026-02-01 01:08:12 [test] trade.datamanager.base INFO: Clearing cache for DividendDataManager (CACHE_NAME='dividend_data_manager')\n", + "2026-02-01 01:08:12 [test] trade.datamanager.base INFO: Clearing cache for RatesDataManager (CACHE_NAME='rates_data_manager')\n", + "2026-02-01 01:08:12 [test] trade.datamanager.base INFO: Clearing cache for ForwardDataManager (CACHE_NAME='forward_data_manager')\n", + "2026-02-01 01:08:12 [test] trade.datamanager.base INFO: Clearing cache for OptionSpotDataManager (CACHE_NAME='option_spot_manager')\n", + "2026-02-01 01:08:12 [test] trade.datamanager.base INFO: Clearing cache for SpotDataManager (CACHE_NAME='spot_data_manager')\n", + "2026-02-01 01:08:12 [test] trade.datamanager.base INFO: Clearing cache for VolDataManager (CACHE_NAME='vol_data_manager_cache')\n", + "2026-02-01 01:08:12 [test] trade.datamanager.base INFO: Clearing cache for GreekDataManager (CACHE_NAME='greek_datamanager_cache')\n" + ] + } + ], + "source": [ + "BaseDataManager.clear_all_caches()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "41c213d5", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "dict_keys([])" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "SingletonMetaClass._instances.keys()" + ] + }, + { + "cell_type": "markdown", + "id": "dcd84d88", + "metadata": {}, + "source": [ + "## TEST 1:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "3bf4a022", + "metadata": {}, + "outputs": [], + "source": [ + "## Vars\n", + "div = DivType.DISCRETE\n", + "undo_adjust = True\n", + "endpoint_source = OptionSpotEndpointSource.EOD\n", + "series_id = SeriesId.HIST\n", + "market_model = OptionPricingModel.BSM\n", + "vol_model = VolatilityModel.MARKET\n", + "model_price = ModelPrice.ASK\n", + "\n", + "symbol = \"SBUX\"\n", + "expiration = \"2026-09-18\"\n", + "right = \"C\"\n", + "strike = 100.0\n", + "ts_start = \"2025-01-01\"\n", + "ts_end = \"2026-01-28\"" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "ef161d94", + "metadata": {}, + "outputs": [], + "source": [ + "BaseDataManager.CONFIG.dividend_type = div\n", + "BaseDataManager.CONFIG.undo_adjust = undo_adjust\n", + "BaseDataManager.CONFIG.option_spot_endpoint_source = endpoint_source\n", + "BaseDataManager.CONFIG.option_model = market_model\n", + "BaseDataManager.CONFIG.volatility_model = vol_model\n", + "BaseDataManager.CONFIG.model_price = model_price\n", + "BaseDataManager.CONFIG.assert_valid()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "3cd6c7d3", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "BaseDataManager.CONFIG.dividend_type\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f0326b78", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2026-02-14 17:55:06 [test] trade.datamanager.base INFO: dividend_data_manager has expired 5 entries\n", + "2026-02-14 17:55:07 [test] trade.datamanager.base INFO: forward_data_manager has expired 10 entries\n" + ] + } + ], + "source": [ + "div_dm = DividendDataManager(symbol=symbol) # Checked for cache consistency\n", + "spot_dm = SpotDataManager(symbol=symbol) \n", + "option_spot_dm = OptionSpotDataManager(symbol=symbol) # Checked for cache consistency\n", + "vol_dm = VolDataManager(symbol=symbol) # Checked for cache consistency\n", + "rates_dm = RatesDataManager() # Checked for cache consistency\n", + "fwd_dm = ForwardDataManager(symbol=symbol) # Checked for cache consistency\n", + "greek_dm = GreekDataManager(symbol=symbol) # Checked for cache consistency" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "e8ae6aba", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2026-02-14 18:05:10 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-14 18:05:10 [test] trade.datamanager.utils INFO: Converting old cache data structure to new for key: symbol:SBUX|interval:eod|artifact_type:forward|series_id:hist|dividend_type:CONTINUOUS|maturity:2026-09-18|use_chain_spot:1\n", + "2026-02-14 18:05:10 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: symbol:SBUX|interval:eod|artifact_type:forward|series_id:hist|dividend_type:CONTINUOUS|maturity:2026-09-18|use_chain_spot:1.\n", + "2026-02-14 18:05:10 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: symbol:SBUX|interval:eod|artifact_type:forward|series_id:hist|dividend_type:CONTINUOUS|maturity:2026-09-18|use_chain_spot:1\n", + "2026-02-14 18:05:10 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-02 00:00:00 to 2026-02-13 00:00:00...\n", + "2026-02-14 18:05:10 [test] trade.datamanager.forward INFO: Cache hit for forward timeseries key: symbol:SBUX|interval:eod|artifact_type:forward|series_id:hist|dividend_type:CONTINUOUS|maturity:2026-09-18|use_chain_spot:1\n", + "2026-02-14 18:05:10 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-01 to 2026-02-13...\n" + ] + }, + { + "data": { + "text/plain": [ + "datetime\n", + "2025-01-02 94.751092\n", + "2025-01-03 95.143947\n", + "2025-01-06 95.683210\n", + "2025-01-07 95.393685\n", + "2025-01-08 95.138279\n", + " ... \n", + "2026-02-09 100.125799\n", + "2026-02-10 98.643647\n", + "2026-02-11 100.255887\n", + "2026-02-12 97.850734\n", + "2026-02-13 95.439190\n", + "Name: forward, Length: 280, dtype: float64" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "div_data = fwd_dm.get_forward_timeseries(\n", + " start_date=ts_start,\n", + " end_date=\"2026-02-13\",\n", + " maturity_date=expiration,\n", + " dividend_type=DivType.CONTINUOUS,\n", + ")\n", + "div_data.timeseries" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "d8513cb3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2026-02-01 01:08:14 [test] trade.datamanager.vars INFO: Loading timeseries for SBUX...\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2026-02-01 01:08:14 [test] EventDriven.riskmanager.market_data INFO: Timeseries for SBUX already loaded. Use force=False to reload.\n", + "2026-02-01 01:08:14 [test] trade.datamanager.dividend INFO: Using config default dividend_type: DivType.CONTINUOUS\n", + "2026-02-01 01:08:14 [test] EventDriven.riskmanager.market_data WARNING: End date 2026-02-01 01:08:10.925009 is today or in the future and current time is before market close. Forcing preload check.\n", + "2026-02-01 01:08:15 [test] EventDriven.riskmanager.market_data INFO: Sanitizing today's data from all stored timeseries data...\n", + "2026-02-01 01:08:15 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-01 01:08:15 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-01 01:08:15 [test] trade.datamanager.dividend INFO: Using provided dividend_type: DivType.CONTINUOUS\n", + "2026-02-01 01:08:15 [test] EventDriven.riskmanager.market_data WARNING: End date 2026-02-01 01:08:10.925009 is today or in the future and current time is before market close. Forcing preload check.\n", + "2026-02-01 01:08:16 [test] EventDriven.riskmanager.market_data INFO: Sanitizing today's data from all stored timeseries data...\n", + "2026-02-01 01:08:16 [test] EventDriven.riskmanager.market_data WARNING: End date 2026-02-01 01:08:10.925009 is today or in the future and current time is before market close. Forcing preload check.\n", + "2026-02-01 01:08:16 [test] EventDriven.riskmanager.market_data INFO: Sanitizing today's data from all stored timeseries data...\n", + "2026-02-01 01:08:17 [test] trade.datamanager.rates INFO: No cache found for risk-free rate timeseries key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D. Fetching from source.\n", + "2026-02-01 01:08:20 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D to avoid saving partial day data.\n", + "2026-02-01 01:08:20 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-01 to 2026-01-28...\n", + "2026-02-01 01:08:20 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:SBUX|interval:eod|artifact_type:forward|series_id:hist|dividend_type:CONTINUOUS|maturity:2026-09-18|use_chain_spot:1 to avoid saving partial day data.\n", + "2026-02-01 01:08:20 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-01 to 2026-01-28...\n", + "2026-02-01 01:08:20 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-01 01:08:20 [test] EventDriven.riskmanager.market_data WARNING: End date 2026-01-28 is in the past or current time is after market close. Preload check will be skipped if specified.\n", + "2026-02-01 01:08:20 [test] EventDriven.riskmanager.market_data INFO: Sanitizing today's data from all stored timeseries data...\n", + "2026-02-01 01:08:20 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-01 to 2026-01-28...\n", + "2026-02-01 01:08:20 [test] trade.datamanager.utils INFO: Using cached date range for 2025-01-01 00:00:00 - 2026-01-28 00:00:00 and option tick SBUX20260918C100\n", + "2026-02-01 01:08:20 [test] trade.datamanager.option_spot INFO: No cache found for option spot timeseries key: symbol:SBUX|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:EOD|expiration:20260918T000000|right:C|strike:100. Fetching from source.\n", + "2026-02-01 01:08:22 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:SBUX|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:EOD|expiration:20260918T000000|right:C|strike:100 to avoid saving partial day data.\n", + "2026-02-01 01:08:22 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-05-23 to 2026-01-28...\n", + "2026-02-01 01:08:22 [test] trade.datamanager.vol INFO: VolDm Using default dividend type from config: DivType.CONTINUOUS\n", + "2026-02-01 01:08:22 [test] trade.datamanager.vol INFO: VolDm Using model price: ModelPrice.ASK\n", + "2026-02-01 01:08:22 [test] trade.datamanager.utils INFO: Using cached date range for 2025-01-01 00:00:00 - 2026-01-28 00:00:00 and option tick SBUX20260918C100\n", + "2026-02-01 01:08:22 [test] trade.datamanager.utils INFO: No cache found for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|dividend_type:continuous|endpoint_source:eod|expiration:2026-09-18|model_price:ask|option_pricing_model:Black-Scholes|right:C|strike:100|volatility_model:market. Fetching from source.\n", + "2026-02-01 01:08:22 [test] trade.datamanager.rates INFO: Cache hit for risk-free rate timeseries key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-01 01:08:22 [test] trade.datamanager.rates INFO: Cache fully covers requested date range for risk-free rate timeseries. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-01 01:08:22 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-05-23 to 2026-01-28...\n", + "2026-02-01 01:08:22 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-01 01:08:22 [test] trade.datamanager.forward INFO: Cache hit for forward timeseries key: symbol:SBUX|interval:eod|artifact_type:forward|series_id:hist|dividend_type:CONTINUOUS|maturity:2026-09-18|use_chain_spot:1\n", + "2026-02-01 01:08:22 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-05-23 to 2026-01-28...\n", + "2026-02-01 01:08:22 [test] trade.datamanager.utils INFO: Using cached date range for 2025-05-23 00:00:00 - 2026-01-28 00:00:00 and option tick SBUX20260918C100\n", + "2026-02-01 01:08:22 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: symbol:SBUX|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:EOD|expiration:20260918T000000|right:C|strike:100\n", + "2026-02-01 01:08:22 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-05-23 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-01 01:08:22 [test] trade.datamanager.option_spot INFO: Cache hit for option spot timeseries key: symbol:SBUX|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:EOD|expiration:20260918T000000|right:C|strike:100\n", + "2026-02-01 01:08:23 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|dividend_type:continuous|endpoint_source:eod|expiration:2026-09-18|model_price:ask|option_pricing_model:Black-Scholes|right:C|strike:100|volatility_model:market to avoid saving partial day data.\n", + "2026-02-01 01:08:23 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-05-23 to 2026-01-28...\n", + "2026-02-01 01:08:23 [test] trade.datamanager.utils INFO: Using cached date range for 2025-01-01 00:00:00 - 2026-01-28 00:00:00 and option tick SBUX20260918C100\n", + "2026-02-01 01:08:23 [test] trade.datamanager.utils INFO: No cache found for key: symbol:SBUX|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:continuous|endpoint_source:eod|expiration:2026-09-18|model_price:ask|option_pricing_model:Black-Scholes|right:C|strike:100|volatility_model:market. Fetching from source.\n", + "2026-02-01 01:08:23 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-01 01:08:23 [test] trade.datamanager.dividend INFO: Using provided dividend_type: DivType.CONTINUOUS\n", + "2026-02-01 01:08:23 [test] EventDriven.riskmanager.market_data WARNING: End date 2026-02-01 01:08:10.925009 is today or in the future and current time is before market close. Forcing preload check.\n", + "2026-02-01 01:08:23 [test] EventDriven.riskmanager.market_data INFO: Sanitizing today's data from all stored timeseries data...\n", + "2026-02-01 01:08:23 [test] trade.datamanager.rates INFO: Cache hit for risk-free rate timeseries key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-01 01:08:23 [test] trade.datamanager.rates INFO: Cache fully covers requested date range for risk-free rate timeseries. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-01 01:08:23 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-05-23 to 2026-01-28...\n", + "2026-02-01 01:08:23 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-01 01:08:23 [test] EventDriven.riskmanager.market_data WARNING: End date 2026-01-28 00:00:00 is in the past or current time is after market close. Preload check will be skipped if specified.\n", + "2026-02-01 01:08:24 [test] EventDriven.riskmanager.market_data INFO: Sanitizing today's data from all stored timeseries data...\n", + "2026-02-01 01:08:24 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-05-23 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-01 01:08:24 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-01 01:08:24 [test] trade.datamanager.forward INFO: Cache hit for forward timeseries key: symbol:SBUX|interval:eod|artifact_type:forward|series_id:hist|dividend_type:CONTINUOUS|maturity:2026-09-18|use_chain_spot:1\n", + "2026-02-01 01:08:24 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-05-23 to 2026-01-28...\n", + "2026-02-01 01:08:24 [test] trade.datamanager.vol INFO: VolDm Using specified dividend type: DivType.CONTINUOUS\n", + "2026-02-01 01:08:24 [test] trade.datamanager.vol INFO: VolDm Using model price: ModelPrice.ASK\n", + "2026-02-01 01:08:24 [test] trade.datamanager.utils INFO: Using cached date range for 2025-05-23 00:00:00 - 2026-01-28 00:00:00 and option tick SBUX20260918C100\n", + "2026-02-01 01:08:24 [test] trade.datamanager.utils INFO: No cache found for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|dividend_type:continuous|endpoint_source:eod|expiration:20260918T000000|model_price:ask|option_pricing_model:Black-Scholes|right:C|strike:100|volatility_model:market. Fetching from source.\n", + "2026-02-01 01:08:24 [test] trade.datamanager.utils INFO: Using cached date range for 2025-05-23 00:00:00 - 2026-01-28 00:00:00 and option tick SBUX20260918C100\n", + "2026-02-01 01:08:24 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: symbol:SBUX|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:EOD|expiration:20260918T000000|right:C|strike:100\n", + "2026-02-01 01:08:24 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-05-23 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-01 01:08:24 [test] trade.datamanager.option_spot INFO: Cache hit for option spot timeseries key: symbol:SBUX|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:EOD|expiration:20260918T000000|right:C|strike:100\n", + "2026-02-01 01:08:25 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|dividend_type:continuous|endpoint_source:eod|expiration:20260918T000000|model_price:ask|option_pricing_model:Black-Scholes|right:C|strike:100|volatility_model:market to avoid saving partial day data.\n", + "2026-02-01 01:08:25 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-05-23 to 2026-01-28...\n", + "2026-02-01 01:08:25 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:SBUX|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:continuous|endpoint_source:eod|expiration:2026-09-18|model_price:ask|option_pricing_model:Black-Scholes|right:C|strike:100|volatility_model:market to avoid saving partial day data.\n", + "2026-02-01 01:08:25 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-05-23 to 2026-01-28...\n" + ] + } + ], + "source": [ + "div_data = div_dm.get_schedule_timeseries(\n", + " start_date=ts_start,\n", + " end_date=ts_end,\n", + " maturity_date=expiration,\n", + ")\n", + "\n", + "fwd_data = fwd_dm.get_forward_timeseries(\n", + " start_date=ts_start,\n", + " end_date=ts_end,\n", + " maturity_date=expiration,\n", + ")\n", + "\n", + "spot_data = spot_dm.get_spot_timeseries(\n", + " start_date=ts_start,\n", + " end_date=ts_end,\n", + ")\n", + "\n", + "option_spot_data = option_spot_dm.get_option_spot_timeseries(\n", + " expiration=expiration,\n", + " right=right,\n", + " strike=strike,\n", + " start_date=ts_start,\n", + " end_date=ts_end,\n", + ")\n", + "\n", + "vol_data = vol_dm.get_implied_volatility_timeseries(\n", + " expiration=expiration,\n", + " right=right,\n", + " strike=strike,\n", + " start_date=ts_start,\n", + " end_date=ts_end,\n", + ")\n", + "\n", + "greek_data = greek_dm.get_greeks_timeseries(\n", + " expiration=expiration,\n", + " right=right,\n", + " strike=strike,\n", + " start_date=ts_start,\n", + " end_date=ts_end,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "a60de8d7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Dividend Type from Config: DivType.CONTINUOUS\n", + "Dividend Type from Dividend DataManager: DivType.CONTINUOUS\n", + "Dividend Type from Dividend Data: DivType.CONTINUOUS\n", + "\n", + "\n", + "Dividend Type from ForwardDataManager: DivType.CONTINUOUS\n", + "Dividend Type from Forward Data: DivType.CONTINUOUS\n", + "\n", + "\n", + "Dividend Type from SpotDataManager: DivType.CONTINUOUS\n", + "\n", + "\n", + "Dividend Type from OptionSpotDataManager: DivType.CONTINUOUS\n", + "\n", + "\n", + "Dividend Type from VolDataManager: DivType.CONTINUOUS\n", + "Dividend Type from Vol Data: DivType.CONTINUOUS\n", + "\n", + "\n", + "Dividend Type from GreekDataManager: DivType.CONTINUOUS\n", + "Dividend Type from Greek Data: DivType.CONTINUOUS\n" + ] + } + ], + "source": [ + "print(f\"Dividend Type from Config: {BaseDataManager.CONFIG.dividend_type}\")\n", + "print(f\"Dividend Type from Dividend DataManager: {div_dm.CONFIG.dividend_type}\")\n", + "print(f\"Dividend Type from Dividend Data: {div_data.dividend_type}\")\n", + "print(\"\\n\")\n", + "print(f\"Dividend Type from ForwardDataManager: {fwd_dm.CONFIG.dividend_type}\")\n", + "print(f\"Dividend Type from Forward Data: {fwd_data.dividend_type}\")\n", + "print(\"\\n\")\n", + "print(f\"Dividend Type from SpotDataManager: {spot_dm.CONFIG.dividend_type}\")\n", + "print(\"\\n\")\n", + "print(f\"Dividend Type from OptionSpotDataManager: {option_spot_dm.CONFIG.dividend_type}\")\n", + "print(\"\\n\")\n", + "print(f\"Dividend Type from VolDataManager: {vol_dm.CONFIG.dividend_type}\")\n", + "print(f\"Dividend Type from Vol Data: {vol_data.dividend_type}\")\n", + "print(\"\\n\")\n", + "print(f\"Dividend Type from GreekDataManager: {greek_dm.CONFIG.dividend_type}\")\n", + "print(f\"Dividend Type from Greek Data: {greek_data.dividend_type}\")\n", + "# div_data.dividend_type\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "063845bc", + "metadata": {}, + "outputs": [], + "source": [ + "assert_synchronized_model(\n", + " symbol=symbol,\n", + " undo_adjust=undo_adjust,\n", + " dividend_type=div,\n", + " spot = spot_data,\n", + " dividend = div_data,\n", + " forward = fwd_data,\n", + " option_spot = option_spot_data,\n", + " vol = vol_data,\n", + " greek=greek_data,\n", + " model_price=model_price)\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "e0c65095", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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v78fpaWl+NKXvoTzzz9fe51bb70Vra2tbq89a9Ys3H333QCAvr4+PPfcc/j444/R1dWFwsJCLFu2DBdffDEsFgtaWlpw2223jVrfFVdcgZUrV2LdunVuawKAlStX4oILLsCsWbOwbt06tLS0oLq6GjfffDMmTZqEt956Cy+//DI6OjowdepU3HLLLSgpKXF7/f3792PdunWoq6uDy+XClClTcM0112DGjBmR+ogJgggS8rAQBOGVY8eO4d5770Vubi6uvPJKuFwurFu3Dna73W2/jRs3YuLEiTjllFOQkpKCTz/9FI8++igURcHy5csBAF//+tfx2GOPIT09HZdddhkAaK8zNDSEu+++Gx0dHTj33HNRVFSEffv24W9/+xscDgduuOEG5Obm4qabbsKjjz6KU089FaeeeioAoKqqyq8Ne/fuxZYtW3DBBRcAAF588UX88pe/xMUXX4yNGzfiggsuQG9vL15++WX88Y9/xM9+9jPt2J07d+K+++5DTU0NrrzySjDG8N577+Gee+7BPffcg9ra2kh8zARBBAkJFoIgvPLss8+Cc4577rkHRUVFAIBFixbhBz/4gdt+P//5z5Gamqo9Xr58OVavXo3XXntNEyynnnoqnn32WeTk5GDx4sVux7/66qtoamrCr371K5SXlwMAzjvvPBQUFODll1/GihUrUFRUhNNOOw2PPvooJk2aNOo1fNHQ0IDf/va3muckOzsbf/7zn/H888/jd7/7HTIyMgAAiqLgxRdfREtLC0pKSsA5xyOPPILZs2fjjjvuAGNMW9ftt9+OZ555Bj/5yU9C/UgJghgDlHRLEMQoFEXBtm3bsHDhQk2sAEBlZSXmz5/vtq9RrPT396O7uxuzZs1Cc3Mz+vv7A77XRx99hJkzZyIrKwvd3d3av7lz50JRFOzZsydsO+bMmeMW5pFekUWLFmliBQCmTp0KAGhpaQEAHDlyBI2NjTjrrLPQ09OjrWlwcBBz5szBnj17oChK2OsiCCJ0yMNCEMQouru7MTw8rHk8jFRUVOCzzz7THu/duxfPPfcc6urqMDQ05LZvf38/MjMz/b5XY2Mjjh49iptuusnr811dXWFYIDCKLQDaWgoLC71u7+3t1dYEAGvXrvX52v39/cjOzg57bQRBhAYJFoIgwqapqQm/+MUvUFFRga997WsoLCyE1WrFZ599htdeey0oLwTnHPPmzcPFF1/s9fmKioqw12exeHci+9puXBMAXH/99aiurva6T3p6etjrIggidEiwEAQxitzcXKSmpmqeBiMNDQ3a/U8//RQjIyP40Y9+5ObNCKW5W2lpKQYHBzFv3jy/+8k8klhQWloKQHheAq2LIIjYQDksBEGMwmKxYP78+fjkk0/Q1tambT9x4gS2bdvmth+geyQAESrx1iAuPT0dfX19o7affvrpqKurw+effz7qub6+PrhcLgBAWlqa9vrRpqamBqWlpXjllVcwODg46vnu7u6or4EgCHfIw0IQhFdWrlyJzz//HD/96U9x/vnnQ1EUvP7665g4cSKOHj0KAJg/fz6sVivWrFmDc889F4ODg3jnnXeQm5uLzs5Ot9ebPHky3nrrLfz9739HWVkZ8vLyMGfOHFx88cXYsmUL1qxZg3POOQc1NTUYGhrCsWPH8NFHH2Ht2rWax6eyshKbN29GeXk5srOzMXHiREyaNCnitlssFnzrW9/Cfffdh9tvvx1LlixBQUEBOjo6sGvXLmRkZODHP/5xxN+XIAjfkGAhCMIrVVVVuPPOO/H4449j3bp1KCwsxMqVK9HZ2akJloqKCtx+++149tln8cQTT8But+P8889Hbm4u/vjHP7q93hVXXIG2tja8/PLLGBgYwKxZszBnzhykpaXh5z//OZ5//nl89NFH+Mc//oGMjAxUVFRg5cqVbkm73/rWt/CXv/wFf/3rX+F0OnHFFVdERbAAwOzZs7F69WqsX78eb775JgYHB2G321FbW4vzzjsvKu9JEIRvqNMtQRAEQRCmh3JYCIIgCIIwPSRYCIIgCIIwPSRYCIIgCIIwPSRYCIIgCIIwPSRYCIIgCIIwPSRYCIIgCIIwPSRYCIIgCIIwPSRYCIIgCIIwPSRYCIIgCIIwPSRYCIIgCIIwPSRYCIIgCIIwPSRYCIIgCIIwPf8/sdnv8kevJeAAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "greek_data.delta.plot()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "ae4c65c6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2026-02-01 01:08:26 [test] trade.datamanager.utils WARNING: Valuation date 2026-02-01 01:08:26.642208 is not a business day or holiday. Resolving using fallback options RealTimeFallbackOption.USE_LAST_AVAILABLE.\n", + "2026-02-01 01:08:26 [test] trade.datamanager.utils INFO: Using last available business day for valuation date.\n", + "2026-02-01 01:08:26 [test] trade.datamanager.utils INFO: New valuation date: 2026-01-30 01:08:26\n", + "2026-02-01 01:08:26 [test] trade.datamanager.utils INFO: Using cached date range for 2026-01-30 01:08:26 - 2026-01-30 01:08:26 and option tick SBUX20260918C100\n", + "2026-02-01 01:08:26 [test] trade.datamanager.utils INFO: No cache found for key: symbol:SBUX|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:continuous|endpoint_source:quote|expiration:2026-09-18|model_price:ask|option_pricing_model:Black-Scholes|right:C|strike:100|volatility_model:market. Fetching from source.\n", + "2026-02-01 01:08:26 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-01 01:08:26 [test] trade.datamanager.dividend INFO: Using provided dividend_type: DivType.CONTINUOUS\n", + "2026-02-01 01:08:26 [test] EventDriven.riskmanager.market_data WARNING: End date 2026-02-01 01:08:10.925009 is today or in the future and current time is before market close. Forcing preload check.\n", + "2026-02-01 01:08:27 [test] EventDriven.riskmanager.market_data INFO: Sanitizing today's data from all stored timeseries data...\n", + "2026-02-01 01:08:27 [test] trade.datamanager.rates INFO: Cache hit for risk-free rate timeseries key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-01 01:08:27 [test] trade.datamanager.rates INFO: Cache fully covers requested date range for risk-free rate timeseries. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-01 01:08:27 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-01-30 to 2026-01-30...\n", + "2026-02-01 01:08:27 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-01 01:08:27 [test] EventDriven.riskmanager.market_data WARNING: End date 2026-01-30 01:08:26 is in the past or current time is after market close. Preload check will be skipped if specified.\n", + "2026-02-01 01:08:27 [test] EventDriven.riskmanager.market_data INFO: Sanitizing today's data from all stored timeseries data...\n", + "2026-02-01 01:08:27 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-01-30 00:00:00 to 2026-01-30 01:08:26...\n", + "2026-02-01 01:08:27 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-01 01:08:27 [test] trade.datamanager.forward INFO: Cache partially covers requested date range for forward timeseries. Key: symbol:SBUX|interval:eod|artifact_type:forward|series_id:hist|dividend_type:CONTINUOUS|maturity:2026-09-18|use_chain_spot:1. Fetching missing dates: [Timestamp('2026-01-30 00:00:00')]\n", + "2026-02-01 01:08:27 [test] EventDriven.riskmanager.market_data WARNING: End date 2026-02-01 01:08:10.925009 is today or in the future and current time is before market close. Forcing preload check.\n", + "2026-02-01 01:08:27 [test] EventDriven.riskmanager.market_data INFO: Sanitizing today's data from all stored timeseries data...\n", + "2026-02-01 01:08:28 [test] trade.datamanager.rates INFO: Cache hit for risk-free rate timeseries key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-01 01:08:28 [test] trade.datamanager.rates INFO: Cache fully covers requested date range for risk-free rate timeseries. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-01 01:08:28 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-01-30 to 2026-01-30...\n", + "2026-02-01 01:08:28 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:SBUX|interval:eod|artifact_type:forward|series_id:hist|dividend_type:CONTINUOUS|maturity:2026-09-18|use_chain_spot:1 to avoid saving partial day data.\n", + "2026-02-01 01:08:28 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-01-30 00:00:00 to 2026-01-30 01:08:26...\n", + "2026-02-01 01:08:28 [test] trade.datamanager.vol INFO: VolDm Using specified dividend type: DivType.CONTINUOUS\n", + "2026-02-01 01:08:28 [test] trade.datamanager.vol INFO: VolDm Using model price: ModelPrice.ASK\n", + "2026-02-01 01:08:28 [test] trade.datamanager.utils INFO: Using cached date range for 2026-01-30 00:00:00 - 2026-01-30 01:08:26 and option tick SBUX20260918C100\n", + "2026-02-01 01:08:28 [test] trade.datamanager.utils INFO: No cache found for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|option_pricing_model:Black-Scholes|right:C|strike:100|volatility_model:market. Fetching from source.\n", + "2026-02-01 01:08:28 [test] trade.datamanager.utils INFO: Using cached date range for 2026-01-30 00:00:00 - 2026-01-30 00:00:00 and option tick SBUX20260918C100\n", + "2026-02-01 01:08:28 [test] trade.datamanager.option_spot INFO: No cache found for option spot timeseries key: symbol:SBUX|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:QUOTE|expiration:20260918T000000|right:C|strike:100. Fetching from source.\n", + "2026-02-01 01:08:28 [test] trade.datamanager.option_spot INFO: Fetching option spot data from Thetadata Quote endpoint for SBUX from 2026-01-30 00:00:00 to 2026-01-30 00:00:00.\n", + "2026-02-01 01:08:29 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:SBUX|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:QUOTE|expiration:20260918T000000|right:C|strike:100 to avoid saving partial day data.\n", + "2026-02-01 01:08:29 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-01-30 to 2026-01-30...\n", + "2026-02-01 01:08:29 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|option_pricing_model:Black-Scholes|right:C|strike:100|volatility_model:market to avoid saving partial day data.\n", + "2026-02-01 01:08:29 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-01-30 to 2026-01-30...\n", + "2026-02-01 01:08:30 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:SBUX|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:continuous|endpoint_source:quote|expiration:2026-09-18|model_price:ask|option_pricing_model:Black-Scholes|right:C|strike:100|volatility_model:market to avoid saving partial day data.\n", + "2026-02-01 01:08:30 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-01-30 to 2026-01-30...\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
gammavolgarhodeltathetavega
datetime
2026-01-300.0177350.0005660.2148520.437738-0.0221270.287246
\n", + "
" + ], + "text/plain": [ + " gamma volga rho delta theta vega\n", + "datetime \n", + "2026-01-30 0.017735 0.000566 0.214852 0.437738 -0.022127 0.287246" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "greek_dm.rt(\n", + " expiration=expiration,\n", + " right=right,\n", + " strike=strike,\n", + ").timeseries" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "9e1cd59b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2026-02-01 01:08:30 [test] trade.datamanager.vol WARNING: Valuation date 2026-02-01 00:00:00 is not a business day or holiday. Resolving using fallback options RealTimeFallbackOption.USE_LAST_AVAILABLE.\n", + "2026-02-01 01:08:30 [test] trade.datamanager.vol INFO: VolDm Using specified dividend type: DivType.DISCRETE\n", + "2026-02-01 01:08:30 [test] trade.datamanager.vol INFO: VolDm Using model price: ModelPrice.ASK\n", + "2026-02-01 01:08:30 [test] trade.datamanager.utils INFO: Using cached date range for 2026-01-30 00:00:00 - 2026-01-30 00:00:00 and option tick SBUX20260918C100\n", + "2026-02-01 01:08:30 [test] trade.datamanager.utils INFO: No cache found for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|dividend_type:discrete|endpoint_source:quote|expiration:2026-09-18|model_price:ask|option_pricing_model:Black-Scholes|right:C|strike:100|volatility_model:market. Fetching from source.\n", + "2026-02-01 01:08:30 [test] trade.datamanager.rates INFO: Cache hit for risk-free rate timeseries key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-01 01:08:30 [test] trade.datamanager.rates INFO: Cache fully covers requested date range for risk-free rate timeseries. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-01 01:08:30 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-01-30 to 2026-01-30...\n", + "2026-02-01 01:08:30 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-01 01:08:30 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-01 01:08:30 [test] trade.datamanager.dividend INFO: Using provided dividend_type: DivType.DISCRETE\n", + "2026-02-01 01:08:30 [test] trade.datamanager.dividend INFO: Fetching discrete dividend schedule timeseries for SBUX from 2026-01-30 to 2026-01-30 with maturity 2026-09-18\n", + "2026-02-01 01:08:30 [test] trade.datamanager.dividend INFO: No cache found for discrete schedule timeseries key: symbol:SBUX|interval:eod|artifact_type:divs|series_id:hist|current_state:SCHEDULE_TIMESERIES|lookback_years:1|maturity:2026-09-18|method:CONSTANT|undo_adjust:1. Building from scratch.\n", + "2026-02-01 01:08:30 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-01 01:08:32 [test] trade.optionlib.assets.dividend INFO: Using dual projection method for ticker SBUX\n", + "2026-02-01 01:08:32 [test] trade.optionlib.assets.dividend INFO: Expected Dividend Size before adjustment: 11, for original valuation: 3. Size from historical divs: 8\n", + "2026-02-01 01:08:32 [test] trade.optionlib.assets.dividend INFO: Expected Dividend Size to be projected: 3\n", + "2026-02-01 01:08:32 [test] trade.optionlib.assets.dividend INFO: Projected Dividend List: [0.62, 0.62, 0.62]\n", + "2026-02-01 01:08:32 [test] trade.optionlib.assets.dividend INFO: Combined Dividend List: [0.57, 0.57, 0.57, 0.61, 0.61, 0.61, 0.61, 0.62, 0.62, 0.62, 0.62]\n", + "2026-02-01 01:08:32 [test] trade.optionlib.assets.dividend INFO: Combined Date List: [datetime.date(2024, 2, 8), datetime.date(2024, 5, 16), datetime.date(2024, 8, 16), datetime.date(2024, 11, 15), datetime.date(2025, 2, 14), datetime.date(2025, 5, 16), datetime.date(2025, 8, 15), datetime.date(2025, 11, 14), datetime.date(2026, 2, 14), datetime.date(2026, 5, 14), datetime.date(2026, 8, 14)]\n", + "2026-02-01 01:08:32 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-01-30 to 2026-01-30...\n", + "2026-02-01 01:08:32 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:SBUX|interval:eod|artifact_type:divs|series_id:hist|current_state:SCHEDULE_TIMESERIES|lookback_years:1|maturity:2026-09-18|method:CONSTANT|undo_adjust:1 to avoid saving partial day data.\n", + "2026-02-01 01:08:32 [test] EventDriven.riskmanager.market_data WARNING: End date 2026-02-01 01:08:10.925009 is today or in the future and current time is before market close. Forcing preload check.\n", + "2026-02-01 01:08:32 [test] EventDriven.riskmanager.market_data INFO: Sanitizing today's data from all stored timeseries data...\n", + "2026-02-01 01:08:32 [test] trade.datamanager.rates INFO: Cache hit for risk-free rate timeseries key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-01 01:08:32 [test] trade.datamanager.rates INFO: Cache fully covers requested date range for risk-free rate timeseries. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-01 01:08:32 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-01-30 to 2026-01-30...\n", + "2026-02-01 01:08:32 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:SBUX|interval:eod|artifact_type:forward|series_id:hist|dividend_type:DISCRETE|maturity:2026-09-18|use_chain_spot:1 to avoid saving partial day data.\n", + "2026-02-01 01:08:32 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-01-30 00:00:00 to 2026-01-30 00:00:00...\n", + "2026-02-01 01:08:32 [test] trade.datamanager.utils INFO: Using cached date range for 2026-01-30 00:00:00 - 2026-01-30 00:00:00 and option tick SBUX20260918C100\n", + "2026-02-01 01:08:32 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: symbol:SBUX|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:QUOTE|expiration:20260918T000000|right:C|strike:100\n", + "2026-02-01 01:08:32 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-01-30 00:00:00 to 2026-01-30 00:00:00...\n", + "2026-02-01 01:08:32 [test] trade.datamanager.option_spot INFO: Cache hit for option spot timeseries key: symbol:SBUX|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:QUOTE|expiration:20260918T000000|right:C|strike:100\n", + "2026-02-01 01:08:32 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|dividend_type:discrete|endpoint_source:quote|expiration:2026-09-18|model_price:ask|option_pricing_model:Black-Scholes|right:C|strike:100|volatility_model:market to avoid saving partial day data.\n", + "2026-02-01 01:08:32 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-01-30 to 2026-01-30...\n" + ] + }, + { + "data": { + "text/plain": [ + "datetime\n", + "2026-01-30 0.324693\n", + "dtype: float64" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "vol_dm.rt(\n", + " expiration=expiration,\n", + " right=right,\n", + " strike=strike,\n", + ").timeseries" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "545ad9cd", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "vol_data.timeseries.plot()" + ] + }, + { + "cell_type": "markdown", + "id": "bed78e85", + "metadata": {}, + "source": [ + "## TEST 2:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "0cbc6e41", + "metadata": {}, + "outputs": [], + "source": [ + "## Vars\n", + "div = DivType.DISCRETE\n", + "undo_adjust = True\n", + "endpoint_source = OptionSpotEndpointSource.QUOTE\n", + "series_id = SeriesId.HIST\n", + "market_model = OptionPricingModel.BINOMIAL\n", + "vol_model = VolatilityModel.MARKET\n", + "\n", + "# symbol = \"AMD\"\n", + "# expiration = \"2027-12-17\"\n", + "# right = \"P\"\n", + "# strike = 210.0\n", + "# ts_start = \"2025-01-01\"\n", + "# ts_end = \"2026-01-23\"" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "ab697fe2", + "metadata": {}, + "outputs": [], + "source": [ + "BaseDataManager.CONFIG.dividend_type = div\n", + "BaseDataManager.CONFIG.undo_adjust = undo_adjust\n", + "BaseDataManager.CONFIG.option_spot_endpoint_source = endpoint_source\n", + "BaseDataManager.CONFIG.option_model = market_model\n", + "BaseDataManager.CONFIG.volatility_model = vol_model\n", + "BaseDataManager.CONFIG.assert_valid()" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "61aa0800", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "BaseDataManager.CONFIG.dividend_type\n" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "7a443073", + "metadata": {}, + "outputs": [], + "source": [ + "div_dm = DividendDataManager(symbol=symbol)\n", + "spot_dm = SpotDataManager(symbol=symbol)\n", + "option_spot_dm = OptionSpotDataManager(symbol=symbol)\n", + "vol_dm = VolDataManager(symbol=symbol)\n", + "rates_dm = RatesDataManager()\n", + "fwd_dm = ForwardDataManager(symbol=symbol)\n", + "greek_dm = GreekDataManager(symbol=symbol)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "8ae00d36", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2026-02-01 01:08:34 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-01 01:08:34 [test] trade.datamanager.dividend INFO: Using config default dividend_type: DivType.DISCRETE\n", + "2026-02-01 01:08:34 [test] trade.datamanager.dividend INFO: Fetching discrete dividend schedule timeseries for SBUX from 2025-01-01 to 2026-01-28 with maturity 2026-09-18\n", + "2026-02-01 01:08:34 [test] trade.datamanager.dividend INFO: Cache hit for discrete schedule timeseries key: symbol:SBUX|interval:eod|artifact_type:divs|series_id:hist|current_state:SCHEDULE_TIMESERIES|lookback_years:1|maturity:2026-09-18|method:CONSTANT|undo_adjust:1\n", + "2026-02-01 01:08:34 [test] trade.datamanager.dividend INFO: Cache partially covers requested date range for timeseries. Key: symbol:SBUX|interval:eod|artifact_type:divs|series_id:hist|current_state:SCHEDULE_TIMESERIES|lookback_years:1|maturity:2026-09-18|method:CONSTANT|undo_adjust:1. Fetching missing dates: [Timestamp('2025-01-02 00:00:00'), Timestamp('2025-01-03 00:00:00'), Timestamp('2025-01-06 00:00:00'), Timestamp('2025-01-07 00:00:00'), Timestamp('2025-01-08 00:00:00'), Timestamp('2025-01-10 00:00:00'), Timestamp('2025-01-13 00:00:00'), Timestamp('2025-01-14 00:00:00'), Timestamp('2025-01-15 00:00:00'), Timestamp('2025-01-16 00:00:00'), Timestamp('2025-01-17 00:00:00'), Timestamp('2025-01-21 00:00:00'), Timestamp('2025-01-22 00:00:00'), Timestamp('2025-01-23 00:00:00'), Timestamp('2025-01-24 00:00:00'), Timestamp('2025-01-27 00:00:00'), Timestamp('2025-01-28 00:00:00'), Timestamp('2025-01-29 00:00:00'), Timestamp('2025-01-30 00:00:00'), Timestamp('2025-01-31 00:00:00'), Timestamp('2025-02-03 00:00:00'), Timestamp('2025-02-04 00:00:00'), Timestamp('2025-02-05 00:00:00'), Timestamp('2025-02-06 00:00:00'), Timestamp('2025-02-07 00:00:00'), Timestamp('2025-02-10 00:00:00'), Timestamp('2025-02-11 00:00:00'), Timestamp('2025-02-12 00:00:00'), Timestamp('2025-02-13 00:00:00'), Timestamp('2025-02-14 00:00:00'), Timestamp('2025-02-18 00:00:00'), Timestamp('2025-02-19 00:00:00'), Timestamp('2025-02-20 00:00:00'), Timestamp('2025-02-21 00:00:00'), Timestamp('2025-02-24 00:00:00'), Timestamp('2025-02-25 00:00:00'), Timestamp('2025-02-26 00:00:00'), Timestamp('2025-02-27 00:00:00'), Timestamp('2025-02-28 00:00:00'), Timestamp('2025-03-03 00:00:00'), Timestamp('2025-03-04 00:00:00'), Timestamp('2025-03-05 00:00:00'), Timestamp('2025-03-06 00:00:00'), Timestamp('2025-03-07 00:00:00'), Timestamp('2025-03-10 00:00:00'), Timestamp('2025-03-11 00:00:00'), Timestamp('2025-03-12 00:00:00'), Timestamp('2025-03-13 00:00:00'), Timestamp('2025-03-14 00:00:00'), Timestamp('2025-03-17 00:00:00'), Timestamp('2025-03-18 00:00:00'), Timestamp('2025-03-19 00:00:00'), Timestamp('2025-03-20 00:00:00'), Timestamp('2025-03-21 00:00:00'), Timestamp('2025-03-24 00:00:00'), Timestamp('2025-03-25 00:00:00'), Timestamp('2025-03-26 00:00:00'), Timestamp('2025-03-27 00:00:00'), Timestamp('2025-03-28 00:00:00'), Timestamp('2025-03-31 00:00:00'), Timestamp('2025-04-01 00:00:00'), Timestamp('2025-04-02 00:00:00'), Timestamp('2025-04-03 00:00:00'), Timestamp('2025-04-04 00:00:00'), Timestamp('2025-04-07 00:00:00'), Timestamp('2025-04-08 00:00:00'), Timestamp('2025-04-09 00:00:00'), Timestamp('2025-04-10 00:00:00'), Timestamp('2025-04-11 00:00:00'), Timestamp('2025-04-14 00:00:00'), Timestamp('2025-04-15 00:00:00'), Timestamp('2025-04-16 00:00:00'), Timestamp('2025-04-17 00:00:00'), Timestamp('2025-04-21 00:00:00'), Timestamp('2025-04-22 00:00:00'), Timestamp('2025-04-23 00:00:00'), Timestamp('2025-04-24 00:00:00'), Timestamp('2025-04-25 00:00:00'), Timestamp('2025-04-28 00:00:00'), Timestamp('2025-04-29 00:00:00'), Timestamp('2025-04-30 00:00:00'), Timestamp('2025-05-01 00:00:00'), Timestamp('2025-05-02 00:00:00'), Timestamp('2025-05-05 00:00:00'), Timestamp('2025-05-06 00:00:00'), Timestamp('2025-05-07 00:00:00'), Timestamp('2025-05-08 00:00:00'), Timestamp('2025-05-09 00:00:00'), Timestamp('2025-05-12 00:00:00'), Timestamp('2025-05-13 00:00:00'), Timestamp('2025-05-14 00:00:00'), Timestamp('2025-05-15 00:00:00'), Timestamp('2025-05-16 00:00:00'), Timestamp('2025-05-19 00:00:00'), Timestamp('2025-05-20 00:00:00'), Timestamp('2025-05-21 00:00:00'), Timestamp('2025-05-22 00:00:00'), Timestamp('2025-05-23 00:00:00'), Timestamp('2025-05-27 00:00:00'), Timestamp('2025-05-28 00:00:00'), Timestamp('2025-05-29 00:00:00'), Timestamp('2025-05-30 00:00:00'), Timestamp('2025-06-02 00:00:00'), Timestamp('2025-06-03 00:00:00'), Timestamp('2025-06-04 00:00:00'), Timestamp('2025-06-05 00:00:00'), Timestamp('2025-06-06 00:00:00'), Timestamp('2025-06-09 00:00:00'), Timestamp('2025-06-10 00:00:00'), Timestamp('2025-06-11 00:00:00'), Timestamp('2025-06-12 00:00:00'), Timestamp('2025-06-13 00:00:00'), Timestamp('2025-06-16 00:00:00'), Timestamp('2025-06-17 00:00:00'), Timestamp('2025-06-18 00:00:00'), Timestamp('2025-06-20 00:00:00'), Timestamp('2025-06-23 00:00:00'), Timestamp('2025-06-24 00:00:00'), Timestamp('2025-06-25 00:00:00'), Timestamp('2025-06-26 00:00:00'), Timestamp('2025-06-27 00:00:00'), Timestamp('2025-06-30 00:00:00'), Timestamp('2025-07-01 00:00:00'), Timestamp('2025-07-02 00:00:00'), Timestamp('2025-07-03 00:00:00'), Timestamp('2025-07-07 00:00:00'), Timestamp('2025-07-08 00:00:00'), Timestamp('2025-07-09 00:00:00'), Timestamp('2025-07-10 00:00:00'), Timestamp('2025-07-11 00:00:00'), Timestamp('2025-07-14 00:00:00'), Timestamp('2025-07-15 00:00:00'), Timestamp('2025-07-16 00:00:00'), Timestamp('2025-07-17 00:00:00'), Timestamp('2025-07-18 00:00:00'), Timestamp('2025-07-21 00:00:00'), Timestamp('2025-07-22 00:00:00'), Timestamp('2025-07-23 00:00:00'), Timestamp('2025-07-24 00:00:00'), Timestamp('2025-07-25 00:00:00'), Timestamp('2025-07-28 00:00:00'), Timestamp('2025-07-29 00:00:00'), Timestamp('2025-07-30 00:00:00'), Timestamp('2025-07-31 00:00:00'), Timestamp('2025-08-01 00:00:00'), Timestamp('2025-08-04 00:00:00'), Timestamp('2025-08-05 00:00:00'), Timestamp('2025-08-06 00:00:00'), Timestamp('2025-08-07 00:00:00'), Timestamp('2025-08-08 00:00:00'), Timestamp('2025-08-11 00:00:00'), Timestamp('2025-08-12 00:00:00'), Timestamp('2025-08-13 00:00:00'), Timestamp('2025-08-14 00:00:00'), Timestamp('2025-08-15 00:00:00'), Timestamp('2025-08-18 00:00:00'), Timestamp('2025-08-19 00:00:00'), Timestamp('2025-08-20 00:00:00'), Timestamp('2025-08-21 00:00:00'), Timestamp('2025-08-22 00:00:00'), Timestamp('2025-08-25 00:00:00'), Timestamp('2025-08-26 00:00:00'), Timestamp('2025-08-27 00:00:00'), Timestamp('2025-08-28 00:00:00'), Timestamp('2025-08-29 00:00:00'), Timestamp('2025-09-02 00:00:00'), Timestamp('2025-09-03 00:00:00'), Timestamp('2025-09-04 00:00:00'), Timestamp('2025-09-05 00:00:00'), Timestamp('2025-09-08 00:00:00'), Timestamp('2025-09-09 00:00:00'), Timestamp('2025-09-10 00:00:00'), Timestamp('2025-09-11 00:00:00'), Timestamp('2025-09-12 00:00:00'), Timestamp('2025-09-15 00:00:00'), Timestamp('2025-09-16 00:00:00'), Timestamp('2025-09-17 00:00:00'), Timestamp('2025-09-18 00:00:00'), Timestamp('2025-09-19 00:00:00'), Timestamp('2025-09-22 00:00:00'), Timestamp('2025-09-23 00:00:00'), Timestamp('2025-09-24 00:00:00'), Timestamp('2025-09-25 00:00:00'), Timestamp('2025-09-26 00:00:00'), Timestamp('2025-09-29 00:00:00'), Timestamp('2025-09-30 00:00:00'), Timestamp('2025-10-01 00:00:00'), Timestamp('2025-10-02 00:00:00'), Timestamp('2025-10-03 00:00:00'), Timestamp('2025-10-06 00:00:00'), Timestamp('2025-10-07 00:00:00'), Timestamp('2025-10-08 00:00:00'), Timestamp('2025-10-09 00:00:00'), Timestamp('2025-10-10 00:00:00'), Timestamp('2025-10-13 00:00:00'), Timestamp('2025-10-14 00:00:00'), Timestamp('2025-10-15 00:00:00'), Timestamp('2025-10-16 00:00:00'), Timestamp('2025-10-17 00:00:00'), Timestamp('2025-10-20 00:00:00'), Timestamp('2025-10-21 00:00:00'), Timestamp('2025-10-22 00:00:00'), Timestamp('2025-10-23 00:00:00'), Timestamp('2025-10-24 00:00:00'), Timestamp('2025-10-27 00:00:00'), Timestamp('2025-10-28 00:00:00'), Timestamp('2025-10-29 00:00:00'), Timestamp('2025-10-30 00:00:00'), Timestamp('2025-10-31 00:00:00'), Timestamp('2025-11-03 00:00:00'), Timestamp('2025-11-04 00:00:00'), Timestamp('2025-11-05 00:00:00'), Timestamp('2025-11-06 00:00:00'), Timestamp('2025-11-07 00:00:00'), Timestamp('2025-11-10 00:00:00'), Timestamp('2025-11-11 00:00:00'), Timestamp('2025-11-12 00:00:00'), Timestamp('2025-11-13 00:00:00'), Timestamp('2025-11-14 00:00:00'), Timestamp('2025-11-17 00:00:00'), Timestamp('2025-11-18 00:00:00'), Timestamp('2025-11-19 00:00:00'), Timestamp('2025-11-20 00:00:00'), Timestamp('2025-11-21 00:00:00'), Timestamp('2025-11-24 00:00:00'), Timestamp('2025-11-25 00:00:00'), Timestamp('2025-11-26 00:00:00'), Timestamp('2025-11-28 00:00:00'), Timestamp('2025-12-01 00:00:00'), Timestamp('2025-12-02 00:00:00'), Timestamp('2025-12-03 00:00:00'), Timestamp('2025-12-04 00:00:00'), Timestamp('2025-12-05 00:00:00'), Timestamp('2025-12-08 00:00:00'), Timestamp('2025-12-09 00:00:00'), Timestamp('2025-12-10 00:00:00'), Timestamp('2025-12-11 00:00:00'), Timestamp('2025-12-12 00:00:00'), Timestamp('2025-12-15 00:00:00'), Timestamp('2025-12-16 00:00:00'), Timestamp('2025-12-17 00:00:00'), Timestamp('2025-12-18 00:00:00'), Timestamp('2025-12-19 00:00:00'), Timestamp('2025-12-22 00:00:00'), Timestamp('2025-12-23 00:00:00'), Timestamp('2025-12-24 00:00:00'), Timestamp('2025-12-26 00:00:00'), Timestamp('2025-12-29 00:00:00'), Timestamp('2025-12-30 00:00:00'), Timestamp('2025-12-31 00:00:00'), Timestamp('2026-01-02 00:00:00'), Timestamp('2026-01-05 00:00:00'), Timestamp('2026-01-06 00:00:00'), Timestamp('2026-01-07 00:00:00'), Timestamp('2026-01-08 00:00:00'), Timestamp('2026-01-09 00:00:00'), Timestamp('2026-01-12 00:00:00'), Timestamp('2026-01-13 00:00:00'), Timestamp('2026-01-14 00:00:00'), Timestamp('2026-01-15 00:00:00'), Timestamp('2026-01-16 00:00:00'), Timestamp('2026-01-20 00:00:00'), Timestamp('2026-01-21 00:00:00'), Timestamp('2026-01-22 00:00:00'), Timestamp('2026-01-23 00:00:00'), Timestamp('2026-01-26 00:00:00'), Timestamp('2026-01-27 00:00:00'), Timestamp('2026-01-28 00:00:00')]\n", + "2026-02-01 01:08:34 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-01 01:08:34 [test] trade.optionlib.assets.dividend INFO: Using dual projection method for ticker SBUX\n", + "2026-02-01 01:08:34 [test] trade.optionlib.assets.dividend INFO: Expected Dividend Size before adjustment: 15, for original valuation: 7. Size from historical divs: 12\n", + "2026-02-01 01:08:34 [test] trade.optionlib.assets.dividend INFO: Expected Dividend Size to be projected: 3\n", + "2026-02-01 01:08:34 [test] trade.optionlib.assets.dividend INFO: Projected Dividend List: [0.62, 0.62, 0.62]\n", + "2026-02-01 01:08:34 [test] trade.optionlib.assets.dividend INFO: Combined Dividend List: [0.53, 0.53, 0.53, 0.57, 0.57, 0.57, 0.57, 0.61, 0.61, 0.61, 0.61, 0.62, 0.62, 0.62, 0.62]\n", + "2026-02-01 01:08:34 [test] trade.optionlib.assets.dividend INFO: Combined Date List: [datetime.date(2023, 2, 9), datetime.date(2023, 5, 11), datetime.date(2023, 8, 10), datetime.date(2023, 11, 9), datetime.date(2024, 2, 8), datetime.date(2024, 5, 16), datetime.date(2024, 8, 16), datetime.date(2024, 11, 15), datetime.date(2025, 2, 14), datetime.date(2025, 5, 16), datetime.date(2025, 8, 15), datetime.date(2025, 11, 14), datetime.date(2026, 2, 14), datetime.date(2026, 5, 14), datetime.date(2026, 8, 14)]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2026-02-01 01:08:34 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-01 to 2026-01-28...\n", + "2026-02-01 01:08:34 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:SBUX|interval:eod|artifact_type:divs|series_id:hist|current_state:SCHEDULE_TIMESERIES|lookback_years:1|maturity:2026-09-18|method:CONSTANT|undo_adjust:1 to avoid saving partial day data.\n", + "2026-02-01 01:08:34 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-01 01:08:34 [test] trade.datamanager.forward INFO: Cache partially covers requested date range for forward timeseries. Key: symbol:SBUX|interval:eod|artifact_type:forward|series_id:hist|dividend_type:DISCRETE|maturity:2026-09-18|use_chain_spot:1. Fetching missing dates: [Timestamp('2025-01-02 00:00:00'), Timestamp('2025-01-03 00:00:00'), Timestamp('2025-01-06 00:00:00'), Timestamp('2025-01-07 00:00:00'), Timestamp('2025-01-08 00:00:00'), Timestamp('2025-01-10 00:00:00'), Timestamp('2025-01-13 00:00:00'), Timestamp('2025-01-14 00:00:00'), Timestamp('2025-01-15 00:00:00'), Timestamp('2025-01-16 00:00:00'), Timestamp('2025-01-17 00:00:00'), Timestamp('2025-01-21 00:00:00'), Timestamp('2025-01-22 00:00:00'), Timestamp('2025-01-23 00:00:00'), Timestamp('2025-01-24 00:00:00'), Timestamp('2025-01-27 00:00:00'), Timestamp('2025-01-28 00:00:00'), Timestamp('2025-01-29 00:00:00'), Timestamp('2025-01-30 00:00:00'), Timestamp('2025-01-31 00:00:00'), Timestamp('2025-02-03 00:00:00'), Timestamp('2025-02-04 00:00:00'), Timestamp('2025-02-05 00:00:00'), Timestamp('2025-02-06 00:00:00'), Timestamp('2025-02-07 00:00:00'), Timestamp('2025-02-10 00:00:00'), Timestamp('2025-02-11 00:00:00'), Timestamp('2025-02-12 00:00:00'), Timestamp('2025-02-13 00:00:00'), Timestamp('2025-02-14 00:00:00'), Timestamp('2025-02-18 00:00:00'), Timestamp('2025-02-19 00:00:00'), Timestamp('2025-02-20 00:00:00'), Timestamp('2025-02-21 00:00:00'), Timestamp('2025-02-24 00:00:00'), Timestamp('2025-02-25 00:00:00'), Timestamp('2025-02-26 00:00:00'), Timestamp('2025-02-27 00:00:00'), Timestamp('2025-02-28 00:00:00'), Timestamp('2025-03-03 00:00:00'), Timestamp('2025-03-04 00:00:00'), Timestamp('2025-03-05 00:00:00'), Timestamp('2025-03-06 00:00:00'), Timestamp('2025-03-07 00:00:00'), Timestamp('2025-03-10 00:00:00'), Timestamp('2025-03-11 00:00:00'), Timestamp('2025-03-12 00:00:00'), Timestamp('2025-03-13 00:00:00'), Timestamp('2025-03-14 00:00:00'), Timestamp('2025-03-17 00:00:00'), Timestamp('2025-03-18 00:00:00'), Timestamp('2025-03-19 00:00:00'), Timestamp('2025-03-20 00:00:00'), Timestamp('2025-03-21 00:00:00'), Timestamp('2025-03-24 00:00:00'), Timestamp('2025-03-25 00:00:00'), Timestamp('2025-03-26 00:00:00'), Timestamp('2025-03-27 00:00:00'), Timestamp('2025-03-28 00:00:00'), Timestamp('2025-03-31 00:00:00'), Timestamp('2025-04-01 00:00:00'), Timestamp('2025-04-02 00:00:00'), Timestamp('2025-04-03 00:00:00'), Timestamp('2025-04-04 00:00:00'), Timestamp('2025-04-07 00:00:00'), Timestamp('2025-04-08 00:00:00'), Timestamp('2025-04-09 00:00:00'), Timestamp('2025-04-10 00:00:00'), Timestamp('2025-04-11 00:00:00'), Timestamp('2025-04-14 00:00:00'), Timestamp('2025-04-15 00:00:00'), Timestamp('2025-04-16 00:00:00'), Timestamp('2025-04-17 00:00:00'), Timestamp('2025-04-21 00:00:00'), Timestamp('2025-04-22 00:00:00'), Timestamp('2025-04-23 00:00:00'), Timestamp('2025-04-24 00:00:00'), Timestamp('2025-04-25 00:00:00'), Timestamp('2025-04-28 00:00:00'), Timestamp('2025-04-29 00:00:00'), Timestamp('2025-04-30 00:00:00'), Timestamp('2025-05-01 00:00:00'), Timestamp('2025-05-02 00:00:00'), Timestamp('2025-05-05 00:00:00'), Timestamp('2025-05-06 00:00:00'), Timestamp('2025-05-07 00:00:00'), Timestamp('2025-05-08 00:00:00'), Timestamp('2025-05-09 00:00:00'), Timestamp('2025-05-12 00:00:00'), Timestamp('2025-05-13 00:00:00'), Timestamp('2025-05-14 00:00:00'), Timestamp('2025-05-15 00:00:00'), Timestamp('2025-05-16 00:00:00'), Timestamp('2025-05-19 00:00:00'), Timestamp('2025-05-20 00:00:00'), Timestamp('2025-05-21 00:00:00'), Timestamp('2025-05-22 00:00:00'), Timestamp('2025-05-23 00:00:00'), Timestamp('2025-05-27 00:00:00'), Timestamp('2025-05-28 00:00:00'), Timestamp('2025-05-29 00:00:00'), Timestamp('2025-05-30 00:00:00'), Timestamp('2025-06-02 00:00:00'), Timestamp('2025-06-03 00:00:00'), Timestamp('2025-06-04 00:00:00'), Timestamp('2025-06-05 00:00:00'), Timestamp('2025-06-06 00:00:00'), Timestamp('2025-06-09 00:00:00'), Timestamp('2025-06-10 00:00:00'), Timestamp('2025-06-11 00:00:00'), Timestamp('2025-06-12 00:00:00'), Timestamp('2025-06-13 00:00:00'), Timestamp('2025-06-16 00:00:00'), Timestamp('2025-06-17 00:00:00'), Timestamp('2025-06-18 00:00:00'), Timestamp('2025-06-20 00:00:00'), Timestamp('2025-06-23 00:00:00'), Timestamp('2025-06-24 00:00:00'), Timestamp('2025-06-25 00:00:00'), Timestamp('2025-06-26 00:00:00'), Timestamp('2025-06-27 00:00:00'), Timestamp('2025-06-30 00:00:00'), Timestamp('2025-07-01 00:00:00'), Timestamp('2025-07-02 00:00:00'), Timestamp('2025-07-03 00:00:00'), Timestamp('2025-07-07 00:00:00'), Timestamp('2025-07-08 00:00:00'), Timestamp('2025-07-09 00:00:00'), Timestamp('2025-07-10 00:00:00'), Timestamp('2025-07-11 00:00:00'), Timestamp('2025-07-14 00:00:00'), Timestamp('2025-07-15 00:00:00'), Timestamp('2025-07-16 00:00:00'), Timestamp('2025-07-17 00:00:00'), Timestamp('2025-07-18 00:00:00'), Timestamp('2025-07-21 00:00:00'), Timestamp('2025-07-22 00:00:00'), Timestamp('2025-07-23 00:00:00'), Timestamp('2025-07-24 00:00:00'), Timestamp('2025-07-25 00:00:00'), Timestamp('2025-07-28 00:00:00'), Timestamp('2025-07-29 00:00:00'), Timestamp('2025-07-30 00:00:00'), Timestamp('2025-07-31 00:00:00'), Timestamp('2025-08-01 00:00:00'), Timestamp('2025-08-04 00:00:00'), Timestamp('2025-08-05 00:00:00'), Timestamp('2025-08-06 00:00:00'), Timestamp('2025-08-07 00:00:00'), Timestamp('2025-08-08 00:00:00'), Timestamp('2025-08-11 00:00:00'), Timestamp('2025-08-12 00:00:00'), Timestamp('2025-08-13 00:00:00'), Timestamp('2025-08-14 00:00:00'), Timestamp('2025-08-15 00:00:00'), Timestamp('2025-08-18 00:00:00'), Timestamp('2025-08-19 00:00:00'), Timestamp('2025-08-20 00:00:00'), Timestamp('2025-08-21 00:00:00'), Timestamp('2025-08-22 00:00:00'), Timestamp('2025-08-25 00:00:00'), Timestamp('2025-08-26 00:00:00'), Timestamp('2025-08-27 00:00:00'), Timestamp('2025-08-28 00:00:00'), Timestamp('2025-08-29 00:00:00'), Timestamp('2025-09-02 00:00:00'), Timestamp('2025-09-03 00:00:00'), Timestamp('2025-09-04 00:00:00'), Timestamp('2025-09-05 00:00:00'), Timestamp('2025-09-08 00:00:00'), Timestamp('2025-09-09 00:00:00'), Timestamp('2025-09-10 00:00:00'), Timestamp('2025-09-11 00:00:00'), Timestamp('2025-09-12 00:00:00'), Timestamp('2025-09-15 00:00:00'), Timestamp('2025-09-16 00:00:00'), Timestamp('2025-09-17 00:00:00'), Timestamp('2025-09-18 00:00:00'), Timestamp('2025-09-19 00:00:00'), Timestamp('2025-09-22 00:00:00'), Timestamp('2025-09-23 00:00:00'), Timestamp('2025-09-24 00:00:00'), Timestamp('2025-09-25 00:00:00'), Timestamp('2025-09-26 00:00:00'), Timestamp('2025-09-29 00:00:00'), Timestamp('2025-09-30 00:00:00'), Timestamp('2025-10-01 00:00:00'), Timestamp('2025-10-02 00:00:00'), Timestamp('2025-10-03 00:00:00'), Timestamp('2025-10-06 00:00:00'), Timestamp('2025-10-07 00:00:00'), Timestamp('2025-10-08 00:00:00'), Timestamp('2025-10-09 00:00:00'), Timestamp('2025-10-10 00:00:00'), Timestamp('2025-10-13 00:00:00'), Timestamp('2025-10-14 00:00:00'), Timestamp('2025-10-15 00:00:00'), Timestamp('2025-10-16 00:00:00'), Timestamp('2025-10-17 00:00:00'), Timestamp('2025-10-20 00:00:00'), Timestamp('2025-10-21 00:00:00'), Timestamp('2025-10-22 00:00:00'), Timestamp('2025-10-23 00:00:00'), Timestamp('2025-10-24 00:00:00'), Timestamp('2025-10-27 00:00:00'), Timestamp('2025-10-28 00:00:00'), Timestamp('2025-10-29 00:00:00'), Timestamp('2025-10-30 00:00:00'), Timestamp('2025-10-31 00:00:00'), Timestamp('2025-11-03 00:00:00'), Timestamp('2025-11-04 00:00:00'), Timestamp('2025-11-05 00:00:00'), Timestamp('2025-11-06 00:00:00'), Timestamp('2025-11-07 00:00:00'), Timestamp('2025-11-10 00:00:00'), Timestamp('2025-11-11 00:00:00'), Timestamp('2025-11-12 00:00:00'), Timestamp('2025-11-13 00:00:00'), Timestamp('2025-11-14 00:00:00'), Timestamp('2025-11-17 00:00:00'), Timestamp('2025-11-18 00:00:00'), Timestamp('2025-11-19 00:00:00'), Timestamp('2025-11-20 00:00:00'), Timestamp('2025-11-21 00:00:00'), Timestamp('2025-11-24 00:00:00'), Timestamp('2025-11-25 00:00:00'), Timestamp('2025-11-26 00:00:00'), Timestamp('2025-11-28 00:00:00'), Timestamp('2025-12-01 00:00:00'), Timestamp('2025-12-02 00:00:00'), Timestamp('2025-12-03 00:00:00'), Timestamp('2025-12-04 00:00:00'), Timestamp('2025-12-05 00:00:00'), Timestamp('2025-12-08 00:00:00'), Timestamp('2025-12-09 00:00:00'), Timestamp('2025-12-10 00:00:00'), Timestamp('2025-12-11 00:00:00'), Timestamp('2025-12-12 00:00:00'), Timestamp('2025-12-15 00:00:00'), Timestamp('2025-12-16 00:00:00'), Timestamp('2025-12-17 00:00:00'), Timestamp('2025-12-18 00:00:00'), Timestamp('2025-12-19 00:00:00'), Timestamp('2025-12-22 00:00:00'), Timestamp('2025-12-23 00:00:00'), Timestamp('2025-12-24 00:00:00'), Timestamp('2025-12-26 00:00:00'), Timestamp('2025-12-29 00:00:00'), Timestamp('2025-12-30 00:00:00'), Timestamp('2025-12-31 00:00:00'), Timestamp('2026-01-02 00:00:00'), Timestamp('2026-01-05 00:00:00'), Timestamp('2026-01-06 00:00:00'), Timestamp('2026-01-07 00:00:00'), Timestamp('2026-01-08 00:00:00'), Timestamp('2026-01-09 00:00:00'), Timestamp('2026-01-12 00:00:00'), Timestamp('2026-01-13 00:00:00'), Timestamp('2026-01-14 00:00:00'), Timestamp('2026-01-15 00:00:00'), Timestamp('2026-01-16 00:00:00'), Timestamp('2026-01-20 00:00:00'), Timestamp('2026-01-21 00:00:00'), Timestamp('2026-01-22 00:00:00'), Timestamp('2026-01-23 00:00:00'), Timestamp('2026-01-26 00:00:00'), Timestamp('2026-01-27 00:00:00'), Timestamp('2026-01-28 00:00:00')]\n", + "2026-02-01 01:08:34 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-01 01:08:34 [test] trade.datamanager.dividend INFO: Using provided dividend_type: DivType.DISCRETE\n", + "2026-02-01 01:08:34 [test] trade.datamanager.dividend INFO: Fetching discrete dividend schedule timeseries for SBUX from 2025-01-02 00:00:00 to 2026-01-28 00:00:00 with maturity 2026-09-18\n", + "2026-02-01 01:08:34 [test] trade.datamanager.dividend INFO: Cache hit for discrete schedule timeseries key: symbol:SBUX|interval:eod|artifact_type:divs|series_id:hist|current_state:SCHEDULE_TIMESERIES|lookback_years:1|maturity:2026-09-18|method:CONSTANT|undo_adjust:1\n", + "2026-02-01 01:08:34 [test] trade.datamanager.dividend INFO: Cache fully covers requested date range for timeseries. Key: symbol:SBUX|interval:eod|artifact_type:divs|series_id:hist|current_state:SCHEDULE_TIMESERIES|lookback_years:1|maturity:2026-09-18|method:CONSTANT|undo_adjust:1\n", + "2026-02-01 01:08:34 [test] EventDriven.riskmanager.market_data WARNING: End date 2026-02-01 01:08:10.925009 is today or in the future and current time is before market close. Forcing preload check.\n", + "2026-02-01 01:08:34 [test] EventDriven.riskmanager.market_data INFO: Sanitizing today's data from all stored timeseries data...\n", + "2026-02-01 01:08:34 [test] trade.datamanager.rates INFO: Cache hit for risk-free rate timeseries key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-01 01:08:34 [test] trade.datamanager.rates INFO: Cache fully covers requested date range for risk-free rate timeseries. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-01 01:08:34 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-02 to 2026-01-28...\n", + "2026-02-01 01:08:35 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:SBUX|interval:eod|artifact_type:forward|series_id:hist|dividend_type:DISCRETE|maturity:2026-09-18|use_chain_spot:1 to avoid saving partial day data.\n", + "2026-02-01 01:08:35 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-01 to 2026-01-28...\n", + "2026-02-01 01:08:35 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-01 01:08:35 [test] EventDriven.riskmanager.market_data WARNING: End date 2026-01-28 is in the past or current time is after market close. Preload check will be skipped if specified.\n", + "2026-02-01 01:08:35 [test] EventDriven.riskmanager.market_data INFO: Sanitizing today's data from all stored timeseries data...\n", + "2026-02-01 01:08:35 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-01 to 2026-01-28...\n", + "2026-02-01 01:08:35 [test] trade.datamanager.utils INFO: Using cached date range for 2025-01-01 00:00:00 - 2026-01-28 00:00:00 and option tick SBUX20260918C100\n", + "2026-02-01 01:08:35 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: symbol:SBUX|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:QUOTE|expiration:20260918T000000|right:C|strike:100. Fetching missing dates: [Timestamp('2025-05-23 00:00:00'), Timestamp('2025-05-27 00:00:00'), Timestamp('2025-05-28 00:00:00'), Timestamp('2025-05-29 00:00:00'), Timestamp('2025-05-30 00:00:00'), Timestamp('2025-06-02 00:00:00'), Timestamp('2025-06-03 00:00:00'), Timestamp('2025-06-04 00:00:00'), Timestamp('2025-06-05 00:00:00'), Timestamp('2025-06-06 00:00:00'), Timestamp('2025-06-09 00:00:00'), Timestamp('2025-06-10 00:00:00'), Timestamp('2025-06-11 00:00:00'), Timestamp('2025-06-12 00:00:00'), Timestamp('2025-06-13 00:00:00'), Timestamp('2025-06-16 00:00:00'), Timestamp('2025-06-17 00:00:00'), Timestamp('2025-06-18 00:00:00'), Timestamp('2025-06-20 00:00:00'), Timestamp('2025-06-23 00:00:00'), Timestamp('2025-06-24 00:00:00'), Timestamp('2025-06-25 00:00:00'), Timestamp('2025-06-26 00:00:00'), Timestamp('2025-06-27 00:00:00'), Timestamp('2025-06-30 00:00:00'), Timestamp('2025-07-01 00:00:00'), Timestamp('2025-07-02 00:00:00'), Timestamp('2025-07-03 00:00:00'), Timestamp('2025-07-07 00:00:00'), Timestamp('2025-07-08 00:00:00'), Timestamp('2025-07-09 00:00:00'), Timestamp('2025-07-10 00:00:00'), Timestamp('2025-07-11 00:00:00'), Timestamp('2025-07-14 00:00:00'), Timestamp('2025-07-15 00:00:00'), Timestamp('2025-07-16 00:00:00'), Timestamp('2025-07-17 00:00:00'), Timestamp('2025-07-18 00:00:00'), Timestamp('2025-07-21 00:00:00'), Timestamp('2025-07-22 00:00:00'), Timestamp('2025-07-23 00:00:00'), Timestamp('2025-07-24 00:00:00'), Timestamp('2025-07-25 00:00:00'), Timestamp('2025-07-28 00:00:00'), Timestamp('2025-07-29 00:00:00'), Timestamp('2025-07-30 00:00:00'), Timestamp('2025-07-31 00:00:00'), Timestamp('2025-08-01 00:00:00'), Timestamp('2025-08-04 00:00:00'), Timestamp('2025-08-05 00:00:00'), Timestamp('2025-08-06 00:00:00'), Timestamp('2025-08-07 00:00:00'), Timestamp('2025-08-08 00:00:00'), Timestamp('2025-08-11 00:00:00'), Timestamp('2025-08-12 00:00:00'), Timestamp('2025-08-13 00:00:00'), Timestamp('2025-08-14 00:00:00'), Timestamp('2025-08-15 00:00:00'), Timestamp('2025-08-18 00:00:00'), Timestamp('2025-08-19 00:00:00'), Timestamp('2025-08-20 00:00:00'), Timestamp('2025-08-21 00:00:00'), Timestamp('2025-08-22 00:00:00'), Timestamp('2025-08-25 00:00:00'), Timestamp('2025-08-26 00:00:00'), Timestamp('2025-08-27 00:00:00'), Timestamp('2025-08-28 00:00:00'), Timestamp('2025-08-29 00:00:00'), Timestamp('2025-09-02 00:00:00'), Timestamp('2025-09-03 00:00:00'), Timestamp('2025-09-04 00:00:00'), Timestamp('2025-09-05 00:00:00'), Timestamp('2025-09-08 00:00:00'), Timestamp('2025-09-09 00:00:00'), Timestamp('2025-09-10 00:00:00'), Timestamp('2025-09-11 00:00:00'), Timestamp('2025-09-12 00:00:00'), Timestamp('2025-09-15 00:00:00'), Timestamp('2025-09-16 00:00:00'), Timestamp('2025-09-17 00:00:00'), Timestamp('2025-09-18 00:00:00'), Timestamp('2025-09-19 00:00:00'), Timestamp('2025-09-22 00:00:00'), Timestamp('2025-09-23 00:00:00'), Timestamp('2025-09-24 00:00:00'), Timestamp('2025-09-25 00:00:00'), Timestamp('2025-09-26 00:00:00'), Timestamp('2025-09-29 00:00:00'), Timestamp('2025-09-30 00:00:00'), Timestamp('2025-10-01 00:00:00'), Timestamp('2025-10-02 00:00:00'), Timestamp('2025-10-03 00:00:00'), Timestamp('2025-10-06 00:00:00'), Timestamp('2025-10-07 00:00:00'), Timestamp('2025-10-08 00:00:00'), Timestamp('2025-10-09 00:00:00'), Timestamp('2025-10-10 00:00:00'), Timestamp('2025-10-13 00:00:00'), Timestamp('2025-10-14 00:00:00'), Timestamp('2025-10-15 00:00:00'), Timestamp('2025-10-16 00:00:00'), Timestamp('2025-10-17 00:00:00'), Timestamp('2025-10-20 00:00:00'), Timestamp('2025-10-21 00:00:00'), Timestamp('2025-10-22 00:00:00'), Timestamp('2025-10-23 00:00:00'), Timestamp('2025-10-24 00:00:00'), Timestamp('2025-10-27 00:00:00'), Timestamp('2025-10-28 00:00:00'), Timestamp('2025-10-29 00:00:00'), Timestamp('2025-10-30 00:00:00'), Timestamp('2025-10-31 00:00:00'), Timestamp('2025-11-03 00:00:00'), Timestamp('2025-11-04 00:00:00'), Timestamp('2025-11-05 00:00:00'), Timestamp('2025-11-06 00:00:00'), Timestamp('2025-11-07 00:00:00'), Timestamp('2025-11-10 00:00:00'), Timestamp('2025-11-11 00:00:00'), Timestamp('2025-11-12 00:00:00'), Timestamp('2025-11-13 00:00:00'), Timestamp('2025-11-14 00:00:00'), Timestamp('2025-11-17 00:00:00'), Timestamp('2025-11-18 00:00:00'), Timestamp('2025-11-19 00:00:00'), Timestamp('2025-11-20 00:00:00'), Timestamp('2025-11-21 00:00:00'), Timestamp('2025-11-24 00:00:00'), Timestamp('2025-11-25 00:00:00'), Timestamp('2025-11-26 00:00:00'), Timestamp('2025-11-28 00:00:00'), Timestamp('2025-12-01 00:00:00'), Timestamp('2025-12-02 00:00:00'), Timestamp('2025-12-03 00:00:00'), Timestamp('2025-12-04 00:00:00'), Timestamp('2025-12-05 00:00:00'), Timestamp('2025-12-08 00:00:00'), Timestamp('2025-12-09 00:00:00'), Timestamp('2025-12-10 00:00:00'), Timestamp('2025-12-11 00:00:00'), Timestamp('2025-12-12 00:00:00'), Timestamp('2025-12-15 00:00:00'), Timestamp('2025-12-16 00:00:00'), Timestamp('2025-12-17 00:00:00'), Timestamp('2025-12-18 00:00:00'), Timestamp('2025-12-19 00:00:00'), Timestamp('2025-12-22 00:00:00'), Timestamp('2025-12-23 00:00:00'), Timestamp('2025-12-24 00:00:00'), Timestamp('2025-12-26 00:00:00'), Timestamp('2025-12-29 00:00:00'), Timestamp('2025-12-30 00:00:00'), Timestamp('2025-12-31 00:00:00'), Timestamp('2026-01-02 00:00:00'), Timestamp('2026-01-05 00:00:00'), Timestamp('2026-01-06 00:00:00'), Timestamp('2026-01-07 00:00:00'), Timestamp('2026-01-08 00:00:00'), Timestamp('2026-01-09 00:00:00'), Timestamp('2026-01-12 00:00:00'), Timestamp('2026-01-13 00:00:00'), Timestamp('2026-01-14 00:00:00'), Timestamp('2026-01-15 00:00:00'), Timestamp('2026-01-16 00:00:00'), Timestamp('2026-01-20 00:00:00'), Timestamp('2026-01-21 00:00:00'), Timestamp('2026-01-22 00:00:00'), Timestamp('2026-01-23 00:00:00'), Timestamp('2026-01-26 00:00:00'), Timestamp('2026-01-27 00:00:00'), Timestamp('2026-01-28 00:00:00')]\n", + "2026-02-01 01:08:35 [test] trade.datamanager.option_spot INFO: Cache partially covers requested date range for option spot timeseries. Key: symbol:SBUX|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:QUOTE|expiration:20260918T000000|right:C|strike:100. Fetching missing dates.\n", + "2026-02-01 01:08:35 [test] trade.datamanager.option_spot INFO: Fetching option spot data from Thetadata Quote endpoint for SBUX from 2025-05-23 00:00:00 to 2026-01-28 00:00:00.\n", + "2026-02-01 01:09:02 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:SBUX|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:QUOTE|expiration:20260918T000000|right:C|strike:100 to avoid saving partial day data.\n", + "2026-02-01 01:09:02 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-05-23 to 2026-01-28...\n", + "2026-02-01 01:09:02 [test] trade.datamanager.vol INFO: VolDm Using default dividend type from config: DivType.DISCRETE\n", + "2026-02-01 01:09:02 [test] trade.datamanager.vol INFO: VolDm Using model price: ModelPrice.ASK\n", + "2026-02-01 01:09:02 [test] trade.datamanager.utils INFO: Using cached date range for 2025-01-01 00:00:00 - 2026-01-28 00:00:00 and option tick SBUX20260918C100\n", + "2026-02-01 01:09:02 [test] trade.datamanager.utils INFO: No cache found for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:2026-09-18|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market. Fetching from source.\n", + "2026-02-01 01:09:02 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-01 01:09:02 [test] trade.datamanager.dividend INFO: Using provided dividend_type: DivType.DISCRETE\n", + "2026-02-01 01:09:02 [test] trade.datamanager.dividend INFO: Fetching discrete dividend schedule timeseries for SBUX from 2025-05-23 00:00:00 to 2026-01-28 00:00:00 with maturity 2026-09-18 00:00:00\n", + "2026-02-01 01:09:02 [test] trade.datamanager.dividend INFO: Cache hit for discrete schedule timeseries key: symbol:SBUX|interval:eod|artifact_type:divs|series_id:hist|current_state:SCHEDULE_TIMESERIES|lookback_years:1|maturity:2026-09-18|method:CONSTANT|undo_adjust:1\n", + "2026-02-01 01:09:02 [test] trade.datamanager.dividend INFO: Cache fully covers requested date range for timeseries. Key: symbol:SBUX|interval:eod|artifact_type:divs|series_id:hist|current_state:SCHEDULE_TIMESERIES|lookback_years:1|maturity:2026-09-18|method:CONSTANT|undo_adjust:1\n", + "2026-02-01 01:09:02 [test] trade.datamanager.rates INFO: Cache hit for risk-free rate timeseries key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-01 01:09:02 [test] trade.datamanager.rates INFO: Cache fully covers requested date range for risk-free rate timeseries. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-01 01:09:02 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-05-23 to 2026-01-28...\n", + "2026-02-01 01:09:02 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-01 01:09:02 [test] EventDriven.riskmanager.market_data WARNING: End date 2026-01-28 00:00:00 is in the past or current time is after market close. Preload check will be skipped if specified.\n", + "2026-02-01 01:09:02 [test] EventDriven.riskmanager.market_data INFO: Sanitizing today's data from all stored timeseries data...\n", + "2026-02-01 01:09:02 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-05-23 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-01 01:09:02 [test] trade.datamanager.utils INFO: Using cached date range for 2025-05-23 00:00:00 - 2026-01-28 00:00:00 and option tick SBUX20260918C100\n", + "2026-02-01 01:09:02 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: symbol:SBUX|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:QUOTE|expiration:20260918T000000|right:C|strike:100\n", + "2026-02-01 01:09:02 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-05-23 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-01 01:09:02 [test] trade.datamanager.option_spot INFO: Cache hit for option spot timeseries key: symbol:SBUX|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:QUOTE|expiration:20260918T000000|right:C|strike:100\n", + "2026-02-01 01:09:08 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:2026-09-18|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market to avoid saving partial day data.\n", + "2026-02-01 01:09:08 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-05-23 to 2026-01-28...\n", + "2026-02-01 01:09:08 [test] trade.datamanager.utils INFO: Using cached date range for 2025-01-01 00:00:00 - 2026-01-28 00:00:00 and option tick SBUX20260918C100\n", + "2026-02-01 01:09:08 [test] trade.datamanager.utils INFO: No cache found for key: symbol:SBUX|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:discrete|endpoint_source:quote|expiration:2026-09-18|model_price:ask|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market. Fetching from source.\n", + "2026-02-01 01:09:08 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-01 01:09:08 [test] trade.datamanager.dividend INFO: Using provided dividend_type: DivType.DISCRETE\n", + "2026-02-01 01:09:08 [test] trade.datamanager.dividend INFO: Fetching discrete dividend schedule timeseries for SBUX from 2025-05-23 00:00:00 to 2026-01-28 00:00:00 with maturity 2026-09-18 00:00:00\n", + "2026-02-01 01:09:08 [test] trade.datamanager.dividend INFO: Cache hit for discrete schedule timeseries key: symbol:SBUX|interval:eod|artifact_type:divs|series_id:hist|current_state:SCHEDULE_TIMESERIES|lookback_years:1|maturity:2026-09-18|method:CONSTANT|undo_adjust:1\n", + "2026-02-01 01:09:08 [test] trade.datamanager.dividend INFO: Cache fully covers requested date range for timeseries. Key: symbol:SBUX|interval:eod|artifact_type:divs|series_id:hist|current_state:SCHEDULE_TIMESERIES|lookback_years:1|maturity:2026-09-18|method:CONSTANT|undo_adjust:1\n", + "2026-02-01 01:09:08 [test] trade.datamanager.rates INFO: Cache hit for risk-free rate timeseries key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-01 01:09:08 [test] trade.datamanager.rates INFO: Cache fully covers requested date range for risk-free rate timeseries. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-01 01:09:08 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-05-23 to 2026-01-28...\n", + "2026-02-01 01:09:08 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-01 01:09:08 [test] EventDriven.riskmanager.market_data WARNING: End date 2026-01-28 00:00:00 is in the past or current time is after market close. Preload check will be skipped if specified.\n", + "2026-02-01 01:09:08 [test] EventDriven.riskmanager.market_data INFO: Sanitizing today's data from all stored timeseries data...\n", + "2026-02-01 01:09:08 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-05-23 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-01 01:09:08 [test] trade.datamanager.vol INFO: VolDm Using specified dividend type: DivType.DISCRETE\n", + "2026-02-01 01:09:08 [test] trade.datamanager.vol INFO: VolDm Using model price: ModelPrice.ASK\n", + "2026-02-01 01:09:08 [test] trade.datamanager.utils INFO: Using cached date range for 2025-05-23 00:00:00 - 2026-01-28 00:00:00 and option tick SBUX20260918C100\n", + "2026-02-01 01:09:08 [test] trade.datamanager.utils INFO: No cache found for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market. Fetching from source.\n", + "2026-02-01 01:09:08 [test] trade.datamanager.utils INFO: Using cached date range for 2025-05-23 00:00:00 - 2026-01-28 00:00:00 and option tick SBUX20260918C100\n", + "2026-02-01 01:09:08 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: symbol:SBUX|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:QUOTE|expiration:20260918T000000|right:C|strike:100\n", + "2026-02-01 01:09:08 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-05-23 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-01 01:09:08 [test] trade.datamanager.option_spot INFO: Cache hit for option spot timeseries key: symbol:SBUX|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:QUOTE|expiration:20260918T000000|right:C|strike:100\n", + "2026-02-01 01:09:09 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market to avoid saving partial day data.\n", + "2026-02-01 01:09:09 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-05-23 to 2026-01-28...\n", + "2026-02-01 01:09:10 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:SBUX|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:discrete|endpoint_source:quote|expiration:2026-09-18|model_price:ask|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market to avoid saving partial day data.\n", + "2026-02-01 01:09:11 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-05-23 to 2026-01-28...\n" + ] + } + ], + "source": [ + "div_data = div_dm.get_schedule_timeseries(\n", + " start_date=ts_start,\n", + " end_date=ts_end,\n", + " maturity_date=expiration,\n", + ")\n", + "\n", + "fwd_data = fwd_dm.get_forward_timeseries(\n", + " start_date=ts_start,\n", + " end_date=ts_end,\n", + " maturity_date=expiration,\n", + ")\n", + "\n", + "spot_data = spot_dm.get_spot_timeseries(\n", + " start_date=ts_start,\n", + " end_date=ts_end,\n", + ")\n", + "\n", + "option_spot_data = option_spot_dm.get_option_spot_timeseries(\n", + " expiration=expiration,\n", + " right=right,\n", + " strike=strike,\n", + " start_date=ts_start,\n", + " end_date=ts_end,\n", + ")\n", + "\n", + "vol_data = vol_dm.get_implied_volatility_timeseries(\n", + " expiration=expiration,\n", + " right=right,\n", + " strike=strike,\n", + " start_date=ts_start,\n", + " end_date=ts_end,\n", + ")\n", + "\n", + "greek_data = greek_dm.get_greeks_timeseries(\n", + " expiration=expiration,\n", + " right=right,\n", + " strike=strike,\n", + " start_date=ts_start,\n", + " end_date=ts_end,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "73fb62c9", + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'greek_data' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[1], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mgreek_data\u001b[49m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__dict__\u001b[39m\u001b[38;5;241m.\u001b[39mkeys()\n", + "\u001b[0;31mNameError\u001b[0m: name 'greek_data' is not defined" + ] + } + ], + "source": [ + "greek_data.__dict__.keys()" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "fc1b8bf9", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiwAAAGkCAYAAAASfH7BAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAApSFJREFUeJztvXmcFNW5//851cvsw8wwOyMMq+yiQVRUAmKUEDSuuEaNytVfzHbNYi65RmPEb9BETdRsmniD0SgS0eAWjcElEhcExVEQkU2YGWaGYfatu+v8/qg6tXV1T+9d3fO8X695TXd1ddV5uqurPvVsh3HOOQiCIAiCIByMlO4BEARBEARBDAcJFoIgCIIgHA8JFoIgCIIgHA8JFoIgCIIgHA8JFoIgCIIgHA8JFoIgCIIgHA8JFoIgCIIgHA8JFoIgCIIgHA8JFoIgCIIgHI873QNIJEeOHIHf70/3MIKoqKhAa2truoeRcLLVLgHZl5lkq12CbLUvW+0SkH32uN1ulJaWRrZu1Ft3MH6/Hz6fL93DMMEYA6CMLZtmQchWuwRkX2aSrXYJstW+bLVLQPYlBgoJEQRBEATheEiwEARBEATheEiwEARBEATheEiwEARBEATheEiwEARBEATheEiwEARBEATheEiwEARBEATheEiwEARBEATheEiwEARBEATheEiwEARBEATheEiwEARBEATheEiwEARBEFHB93yKwL23gB/Ym+6hECMIEiwEQRBEVPC3XwU+2gq++d/pHgoxgohptuYXX3wRGzZsQEdHB8aNG4err74akyZNGvZ9b775Jn71q19h7ty5+OEPfwhAmd3x8ccfx9atW9HS0oL8/HzMmjULl156KcrKymIZHkEQBJFMfEPK/0AgveMgRhRRe1g2bdqENWvW4IILLsDq1asxbtw4rFq1Cp2dnWHf19LSgkceeQTTpk0zLR8aGsKePXtw/vnnY/Xq1fje976HxsZG3HnnndEOjSAIgkgFAb/yXybBQqSOqAXLs88+i8WLF2PRokWoq6vDihUr4PV6sXHjxpDvkWUZ9913H5YvX47KykrTa/n5+bj55psxf/581NbWYsqUKbj66quxe/dutLW1RW8RQRAEkVyEZ4U8LEQKiSok5Pf7sXv3bpxzzjnaMkmSMGvWLOzcuTPk+9atW4fi4mKcdtpp2L59+7D76evrA2MM+fn5tq/7fD74fD7tOWMMeXl52mMnIcbjtHHFS7baJSD7MpNstUvgGPv8qoeF84SMxTF2JQmyLzFEJVi6urogyzJKSkpMy0tKStDY2Gj7nh07duBf//pXxCGeoaEhPProozj55JNDCpb169dj3bp12vPx48dj9erVqKioiMyQNFBdXZ3uISSFbLVLQPZlJtlqlyDd9rV5POgHkJ+bg7KamoRtN912JRuyLz5iSrqNlP7+ftx333247rrrUFxcPOz6fr8f99xzDwDg2muvDbneueeei2XLlmnPhaprbW2FXyh/h8AYQ3V1NZqbm8E5T/dwEka22iUg+zKTbLVL4BT7Ar09AIC+7m4MNjXFvT2n2JUsyL7QuN3uiJ0NUQmW4uJiSJKEjo4O0/KOjo4grwsAHDp0CK2trVi9erW2TBhz8cUX495779UUmRArbW1t+MlPfhLSuwIAHo8HHo/H9jWnHgycc8eOLR6y1S4B2ZeZZKtdgnTbxw1Jt4kcR7rtSjZkX3xEJVjcbjcmTJiAhoYGzJs3D4CSUNvQ0IAlS5YErV9bW4tf/OIXpmWPP/44BgYGcNVVV6G8vByALlaam5txyy23oKioKFZ7CIIgiGQjPNkBOb3jIEYUUYeEli1bhgceeAATJkzApEmT8Pzzz2NwcBALFy4EANx///0oKyvDpZdeCq/Xi7Fjx5reX1BQAADacr/fj7vvvht79uzBTTfdBFmWNQ9OYWEh3O6kRq0IgiCIaBHVQVTWTKSQqNXA/Pnz0dXVhbVr16KjowP19fVYuXKlFhJqa2uLKlO4vb0dmzdvBgCtmZzglltuwYwZM6IdIkEQBJFMtJAQeViI1BGT+2LJkiW2ISAAuPXWW8O+94YbbjA9r6ysxNq1a2MZBkEQBJEOVMHCycNCpBCaS4ggCIKIDmocR6QBEiwEQRBEdFBIiEgDJFgIgiCI6PDTXEJE6iHBQhAEQUSHViVEHhYidZBgIQiCIKKDQkJEGiDBQhAEQUQHJd0SaYAEC0EQBBEd2mzN5GEhUgcJFoIgCCI6REiIPCxECiHBQhAEQUQHteYn0gAJFoIgiAyEcw5543Pgu7andr9yQA8FUdItkUJIsBAEQWQin+8Gf+z3kB/9XWr3awwDUUiISCEkWAiCIDKR3h7l/0Bfavcr8lcA8rAQKYUEC0EQRCbiG1L+p1o0GL0qlMNCpBASLARBEJmIz6f8T7Vg8ZOHhUgPJFgIgiAyEO5XBQvnqd2xMSREOSxECiHBQhAEkYloIaEUiwajSKHGcUQKIcFCEASRiYiQUKpFg588LER6IMFCEASRiaQt6daYw0KChUgdJFgIgiAyEUdUCaUvJCS/sgHyW6+mbf9E6nGnewAEQRBEDIjQTMqrhHz64zR5WHhXB/jjDwLeHODEhWkZA5F6yMNCEASRiTjBwxJIk4elX22WNzQInuoqKSJtkGAhCILIRJxQ1pyukNDggP6YKpVGDCRYCIIgMhEneFi4DJ4O0TI0aBgPCZaRAgkWgiCITEQIFi6nNixi9LAA6fGyGAULddsdMZBgIQiCyER8huTXVIZFrIIlHSGZIUNIiEqrRwwkWAiCIDIQbqrWSZ1o4NZmcWloHscHycMyEiHBQhAEkYmIkBCQ2ou23xoSSoOHwxQSIg/LSIEEC0EQRCbiS4+HxRk5LAaxRtMDjBhIsBAEQWQiRg9LSpNuLQIhLR4WYw4LhYRGCiRYCIIgMpER7WGhkNBIhAQLQRBEJpKmpNugHJZ09EGhsuYRCQkWgiCITMQUEkqhl8ERISHysIxESLAQBEFkIunysDghJDRIOSwjERIsBEEQmUi6ypqDBEsa+rCQh2VEQoKFIAgiE3FK0m06yoqH0iTWiLRCgoUgCCLD4Jw7qKw5zSEhmvxwxECChSAIItNIZx4JJd0SaYIEC0EQRKZhDAcBKS5rtuw7LSEhKmseiZBgIQiCyDSM4SAgvR6WtMzWTB6WkYg7lje9+OKL2LBhAzo6OjBu3DhcffXVmDRp0rDve/PNN/GrX/0Kc+fOxQ9/+ENtOecca9euxSuvvILe3l5MnToV1157LWpqamIZHkEQRHZjFSwp7cPigMZxVNY8Ionaw7Jp0yasWbMGF1xwAVavXo1x48Zh1apV6OzsDPu+lpYWPPLII5g2bVrQa8888wxeeOEFrFixAnfccQdycnKwatUqDA0N2WyJIAhihJPWkFD6y5pp8sORSdSC5dlnn8XixYuxaNEi1NXVYcWKFfB6vdi4cWPI98iyjPvuuw/Lly9HZWWl6TXOOZ5//nmcd955OP744zFu3Dh885vfxJEjR/Duu+9GbxFBEES2Y80jSWGVEE9zlRDn3BwSSkdIikgLUYWE/H4/du/ejXPOOUdbJkkSZs2ahZ07d4Z837p161BcXIzTTjsN27dvN73W0tKCjo4OzJ49W1uWn5+PSZMmYefOnTj55JODtufz+eAz3GEwxpCXl6c9dhJiPE4bV7xkq10Csi8zyVa7BJpdFsHCZJ4ym5kcgEkeyXLc+47qe/P7zCIlAftPNiPluEy2fVEJlq6uLsiyjJKSEtPykpISNDY22r5nx44d+Ne//oU777zT9vWOjg4AwKhRo0zLR40apb1mZf369Vi3bp32fPz48Vi9ejUqKioiMyQNVFdXp3sISSFb7RKQfZlJttolGF1UhBbj87JS5KQo56/V5YIhgwRlo4qRl6B9R/K9Bbo7YbzalI4ahfwMyXfM9uMy2fbFlHQbKf39/bjvvvtw3XXXobi4OGHbPffcc7Fs2TLtuVB1ra2t8Fvjq2mGMYbq6mo0NzcrrswsIVvtEpB9mUm22iUQ9h0+1Gxafri1BaykKSVjCPT1mp63Hz4MqSm+fUfzvfH2NtPzI4fb0Bnn/pPNSDkuY7HP7XZH7GyISrAUFxdDkqQgz0dHR0eQ1wUADh06hNbWVqxevVpbJoy5+OKLce+992rv6+zsRGlpqbZeZ2cn6uvrbcfh8Xjg8XhsX3PqwcA5d+zY4iFb7RKQfZlJttol4JaCBB6QU5bHwoOqhPwJ+6wj+d64sUIISk5NpnzXWX9cJtm+qASL2+3GhAkT0NDQgHnz5gFQEmobGhqwZMmSoPVra2vxi1/8wrTs8ccfx8DAAK666iqUl5fD5XKhpKQEH374oSZQ+vr6sGvXLpxxxhkxmkUQBJHF+K19WFJZ1mzeFw8EkNLMjCGzYKE+LCOHqENCy5YtwwMPPIAJEyZg0qRJeP755zE4OIiFCxcCAO6//36UlZXh0ksvhdfrxdixY03vLygoAADT8qVLl+Kpp55CTU0NKisr8fjjj6O0tBTHH398HKYRBEFkKday5lRWyljD7qmu0jFWCAE0l9AIImrBMn/+fHR1dWHt2rXo6OhAfX09Vq5cqYV22traos4U/upXv4rBwUH8/ve/R19fH6ZOnYqVK1fC6/VGOzyCIIjsJ6jTbSonP1QFi8uleFtSLRisgoU8LCOGmJJulyxZYhsCAoBbb7017HtvuOGGoGWMMVx00UW46KKLYhkOQRDEyCKoD0saWvN7vECgP/WCIUiwkIdlpEBzCREEQWQa6ZxLSIgljzf1+wbAB0mwjFRIsBAEQTiEiCssImjNz7e9C77lPwkYlQXhYfHmqPtOt4eFQkIjBRIsBEEQDkB+4iHIP74OvK9n2HW5NSRkESxcDkD+/WrIf7gTvL8vkcM0h4Rs9p10KCQ0YiHBQhAE4QD45n8Drc3A53uGX9kSEuLWi3YgoEwQGAgAPV0JHCX0pFtRFJHqyQcHqax5pEKChSAIwgn0qp4V6wXZjqCQkOWibRQREXhsokIIFs3Dku6QEHlYRgokWAiCINIMHxrUvCZBSaV2WJNurbkvRhFhaaUfN5qHReSwpLsPC3lYRgokWAiCINJNT7f+2HpBtmO4KqGkelisOSzp9rCQYBkpkGAhCIJIN31GwRJDSMjah8UgWHhv4gQL51zbNhOCJdWN46isecRCgoUgCCLdGD0skeSwDFMlZPI69CcwJGSc+DBdfViEh8Wt9j0lD8uIgQQLQRBEujF6QWLJYQkXEkqgh8W0XW+aQ0K5+er+ycMyUiDBQhAEkWZ4b3Q5LHy4xnGBVHpY0iVY8tQxkWAZKZBgIQiCSDe90eawqB4Wb4iwjJwkD4txpuZQ+042ImQmPCypni2aSBskWAiCINJNb5Q5LMLD4s1V/lsv2gbBwhPqYVG3K0mAy21eliqEhyVPeFgoh2WkQIKFIAgi3Ri8IDySsma/6mHJUQVLynJYVA+L2w0w9fJBOSxEiiDBQhAEkWa4qUookqRb4WFRm7eFKWtOaA6LCAm53IDLpTxOU+M4JnJYqEpoxECChSAIIt3E2oclVLfZZOWwCCHkcgGSECzpCgmRh2WkQYKFIAgi3UTrYRk2JGR43t+rNHxLBAGDh0WSgveVZDjnNoJl5HpYePNB8O4ET27pYEiwEARBpBujFySa1vyhPCzG8mO/X5m5OREYBYtL5LCk0MPh9+nzJuWO7KRb3t0J+dZvQr73J+keSsogwUIQBJFGOOdRVQlxWdZzSXIiCAkBQH+CwkKaYElTSMj42Yz0pNsjhxWxdrg13SNJGSRYCIIg0snQoLnV/nA5LIZ1WaiyZmuYpjdBibdaDoseEuKpFCxaW36P1po/pft3EuK7GEH2k2AhCIJIJ0bvCjBsSIgbwzuhcliS7WFxuw0elhR6OMRn481Jz/6dhPguRlBIjAQLQRBEOhH5K6JMeGhICfuEQOvTwpjiaQDC57AAifOw2JU1p/KCOWgULGnIoXES5GEhCIIgUkqPWuVRMlpfFsbLwkXCrcejX7QtISFuERE8AR4W3nkEvL9PeeJy6Y3jUtka39bDMnIu2CY0D8vIEWzudA+AIAhiRNOniomSMuBwi/J4aFCvgrGghYTcXpOXgbc2g7/1KthpXwn2OsTpYeE9XZD/Z4VeneRyhfWwcDkAJgRFIhGCJYc8LNrnzmVwWQaTst//kP0WZgmcc/CB/nQPgyCIBKN1uS0s1icUDFMppIWEPBbB8tJ68L8/Bv7Wa4nPYWlv1cUKAHR3hcwh4Y37IX/7UsjPPh7fPu0weljS1WnXKRjDfiPkMyDBkiHwtX+E/N+XgTfuT/dQCIJIJGrSLSss0iczDBsSUquEjCEhWQb61HBNf2/ic1h8PvPz2rH6Hb1FHPGP3wcG+8E/aYhvnzZwIeS8OboHZwQlnZow2j1CwmIkWDIEvvdTwO8HP7A33UMhCCKRiKTbgiK96iech8VnKO015pEYq0aseQ19cXpYxLZLysAu/Dqkcy4P3Tiutdl+eSIYsku6HRkXayvc5GEZGZ8B5bBkCuLHb73TIQgis+lVk24LivTOteE8LEM2SbeyrPcjCfiDvR59cXpYRO+XwmJIZ5yrbLO1Sd2fZV+aYEnCRVRMfJiTS2XNxs99hCTekoclUxAHp58EC0FkE9zoYRGCJdx8QsYcFsaUx7KsnyMCfnODNyB+D4tP9F/x6MtCJb2GEDIJgTwsOiPQw0KCJVMQpYMkWAgiu1CTbllBoRYS4mG63eplzV6zl8EUElIvYEXFyv94PSwB9bzjNjjlbcqKuRwA2g7pY0o0xj4s6ZjLyEmYPCwkWAgnIZNgIYisRHS6NeawxNKHRZwjjCGhQiFY4vOwaIm+dh4W48XySLveXC6JISHk5Oj5OyPkYh0EeVgIxyJ+lJTDQhDZRZ8xJBRJWbN9HxbtAuY3hISKRin/++P1sBha8guEh8XYOE6Eg8SYEo1dWXMqG9c5CfKwEI6FU9ItQWQbnHMtJISCIn0ywzA5LMLDwqxlzYHgpFsmPCz9ffFNEui38bDYNI7TEm4tyxPGkF7WjBFf1kx9WAinQiEhgkg6XJbB9+8Oam2fNAYH9AtPoTEkFEHjOLcuWDg3CBajh0UIFgAQbfVjQQ3zMJfRw2KTQ5JkDwu3TbodGRfrIKgPC+FYqEqIIJIOf+MlyD/7Lvg//56aHYoKIbdbuQjnRFPWbK0SUkQFDwT0C5jXq4ug3jjyWPyGZnUCu7LiFoOHJZk5LN5c6nRr9LCMEC8TCZZMgaqECCL5HFYrXJo+T8rm5TdfgfzO6/oCrQdLMRhjhrLmSKqEwoSEjGXN+YXK43jyWIyzNAtcwWXFppBQUvuwGJJuR6xgGXk5LNQ4LlOgxnEEkXzUBlw83iRVG3hfL/if7wNcEvhx88HcbkOXW1VU5ESew6J4WIYRLJILyC8AjrQl3sPCzDkknHO9yy2QnGZmg3ZzCY2Mi3UQVCVEOBYKCRFE8hE3BvHke4Siv1fxlPr9Wo6KNvGhECxe0YclXOM4USXkMVfqaJ1uDSEhl6QIFrH/WAnrYVE/s95u8z6SGhLKsS+rHkkYBeEI+Qxi8rC8+OKL2LBhAzo6OjBu3DhcffXVmDRpku26b7/9NtavX4/m5mYEAgFUV1fjrLPOwoIFC7R1BgYG8Oijj+Ldd99Fd3c3Kisr8eUvfxlnnHFGbFZlI2pIiJOHhSCSh7jIxttozY4BQ5hncFAJ1Wg9WNTkWC2HJZLZmq0hIdE4zuphUcQQ7+0Bi3XsdlVC1sZxrYfM70lqWXOufVn1SGIEeliiFiybNm3CmjVrsGLFCkyePBnPPfccVq1ahXvvvRejRo0KWr+wsBDnnXceamtr4Xa7sWXLFvzmN79BcXEx5syZAwD485//jIaGBnzrW99CRUUFtm3bhoceeghlZWWYO3du3EZmBVQlRBDJR/OwJEGwDPYbHquCpNfQ5RYA8+aAG1+3wdzpVjSO4+YqIVnPYWH5Bco2E+Fh8di15ldDQqJCaFQp0HmEPCzJZgTmsEQdEnr22WexePFiLFq0CHV1dVixYgW8Xi82btxou/6MGTMwb9481NXVobq6GkuXLsW4ceOwY8cObZ2dO3fii1/8ImbMmIHKykqcfvrpGDduHHbt2hW7ZdlGgAQLQSQdcZFNRkjIKEKGzIIFhUXK/0hyWEJ6WAwhoYAxJKSGmxKRw+Kya82vnptE/krVGPPyRCI+Q6/XvkppJDEC+7BE5WHx+/3YvXs3zjnnHG2ZJEmYNWsWdu7cOez7OedoaGhAY2MjLrvsMm35lClT8N577+G0005DaWkpPvroIzQ1NeHKK6+03Y7P54PPEBphjCEvL0977CTEeOIeF9dzWJxgY8LscihkX2YSt13ixK+GhBL5+XCDYGFDg8q2VRHBCoqU54bW/Hb7ZoxpYWHmUbwMXIzbxsPCXG5wQ5VQOHu4LIPvbAAbOwFMvEegXhyZx6tvQ3S9DcjKMlWwsOox4DsbgEAg4s8vku+Nc26erVmEguTI95MukvJ7M3qwZDmtn0GqzidRCZauri7IsoySkhLT8pKSEjQ2NoZ8X19fH6677jr4/X5IkoRrrrkGs2fP1l6/+uqr8fvf/x7XX389XC4XGGO47rrrMH36dNvtrV+/HuvWrdOejx8/HqtXr0ZFRUU05qSU6urquN7/ucwBAB4A1TU1CRhRYojXLqdD9mUmsdp1OCcHfQAQ8KN6dBkkISASQO+OXLSrj0sLCpBXU4PWgA8DAEbV1qGwpgaD3e1oAeAK+FAT4nfeoibdllRUgHm8OAzA63bBJwfAAbgZ4PF40Q9gVGkpeEEBOgDkyQGMDnPu6H/7dbT94sco+NJZKPvuLabXDrvd6ANQXFaGInUbgfxcNAIAl1FdXY3WznYMAiieNBWdr/8DkOWQNoQi3PcmDw7goFhvXD34QL+yf1nZv9NFC5DY39thjwfCD1g2qhh5DrguJPt8kpKy5tzcXNx1110YGBjAhx9+iDVr1qCqqgozZswAALzwwgv49NNP8cMf/hAVFRXYvn07/vjHP6K0tNQkbATnnnsuli1bpj0XB2prayv8fn/Q+umEMYbq6mo0Nzcrdwixot49+fr70NTUNMzKySdhdjkUsi8zideugCFs0rz7M7CSsoSNTT6k/27bmxohNTXBf7gVANAZkNHd1ATerew/0Gf/O2eMgfkUL0NHTy8gKXkxQ4ODmhfEPziIgOoh6uzp1UIn/e1tYc8d8meKl7z30x0YtKwX6FZCV119/ehRX+OGz6rp4EEEDu4DAHTnqwnEcgCNjY0RCYlIvjfe3ak9bm5vNyVGNzUeBBMhIgeSjN+b8Vhtb2uDlMbrQjz2ud3uiJ0NUQmW4uJiSJKEjo4O0/KOjo4gr4sRSZI05VVfX4+DBw/i6aefxowZMzA0NIS//vWv+MEPfoDjjjsOADBu3Djs3bsXGzZssBUsHo8HHmPylwGnnnw55zGPjXNumkvISTbGY1cmQPZlJjHbZZwXp69XSSBN1JgG9KRbPjigjE9cdPILlTF79U63Icc/ZGgcp3peTXkrAR+46HorSWD5+crj3p6wn4nWQbejPWg9ruawcJdLe41LuhDhA33AkcPKk6pafbkc0HNNIiDc98YHDVMSMAncIIR4IKD3pHEwify9ccPNOQ8EHPE7Tvb5JKpv2O12Y8KECWhoaNCWybKMhoYGTJkyJeLtyLKs5aD4/X4EbGKdkiQ54gtwBMayPUq6JYjkYUxe7IsjSdUOU1mz+rhH7XQrkm7F5Ie+oZCTFXJf8FxCCASUSiHx2KasedgqIVF91HUkeN92Zc3MIESE9yg3Dygu0ZcnsnmcSDYWYTqjEEpGkzqnMwLnEoo6JLRs2TI88MADmDBhAiZNmoTnn38eg4ODWLhwIQDg/vvvR1lZGS699FIASr7JxIkTUVVVBZ/Ph61bt+KNN97AtddeCwDIz8/H9OnT8Ze//AVerxcVFRX4+OOP8dprr4VMuh1xBEiwEEQqMF2oE10pZKkS4pzroihfCBavYZ0hRQBYMc4lZNfuIODXl7vceuO44aqExDZkGejqAEpGm7cJKN15BS79fpcfOqA8qKg2VxLJASiZdwnAWNIM6GJN288IYwTOJRS1YJk/fz66urqwdu1adHR0oL6+HitXrtRCQm1tbSZvyeDgIB566CEcPnwYXq8XY8aMwbe+9S3Mnz9fW+e73/0uHnvsMfz6179GT08PKioqcMkll+BLX/pS/BZmA8a7PmocRxDJw/Bb4/29sTdas8PUh2VQeS4uNAWqYDF6MPw+AMGCRWse6fHqXhGjYDHM1syMZc19veCch84pEdsCgI52s2DxhWkcBwCH1KKLihqLkEig50MraRaCxbD/EVLWa4I8LJGxZMkSLFmyxPa1W2+91fT84osvxsUXXxx2eyUlJfjGN74Ry1BGBsaDkTwsBJE8jBe+RDePG7SEhERbfo9XmcwPAHO5lAu+LIf8rWt9WNwefbZm441MIKDffYu5hABl2dCQ3k3XinEbHYcBTDZsU92ewcPCjMKkWanfYRXVJs9LQi+kmodF9UKRh0V/PELsd36WEmE+ifqdlXRLEFmF8cSf4Pb8fMDSOM468aFAeDFCeFNtZ2s2ekf8xpCQC8jJ09cLl5dj2AY/0m55zcbDIrYPgKuCBZXV5uTXRIYqLDksTJJ0wTbSPSwjJIeHBEsmYPwxGltwEwSRWEwelkTnsFhCQr1qwq0IBwk8qgdhOA+LsTW/3yBYuME7o/a10rws4URYkIfFgI2HBYAelmlRQkKsokbZXxJmUuZDlpCQcf8j8ZxIHhbCkYTK2CcIIrGkMCSk9TGxCpYwHhZurADyeHRvhs/Sf0p4S8QFXctjiczDgg6Lh8WuSgjQBZMQURVq4zBmmDIgUViTbo37H4kTINJcQoQjsf7oKfGWIJJDIHkhIaNg4UODhpmarSEh1YthFBAC482KxzCfjvWCLS7u4vW84T0s3LBtbvWw+IfxsABKdVBZufo4CZ4P0ZafPCwKIzDplgRLJmAVLORhIYjkwI1VQgkOCQ1YZmtWk25ZYbF5PS0kZNO123izYuzDYkUIFiEcVFHEI/WwHLEKllA5LIb9j67Uu80mY2LCQUsfFsA8+eNIYwSWNZNgyQQoJEQQqSGZHhYhIgBFsBi63JoQosDudy5yVSRJqSgKVaIserWogoVF4GEx7a/TGhISHhaLYDEm2FZU6Y81IZGMKiGDh8WVhP1kChQSIhwJeVgIIjUkNYfF4GExhYSsSbcih8UmJGTswQKE9rCIc4Rk9rCEz2ExnFf6evVW+MbtWUNCLj0kxCoMk+8lw/NhLWsGkpMrkylQ0i3hSCiHhSBSg6nTbeIEC5cDutcDUJNuVcFSGEKw2N2YGEuagdCCReCKPIclSCCpeSxcDujnoFBJt4CecGvcbzLKmk0elsRXI2UMlMNCOBLrwWh350UQRPwkq6zZ6K0A1D4sag5LiD4sPKxgGcbDIojVwwLolULGXJowSbessjp4eVJCQsYcFiGMRriHZYTYT4IlEwgKCdkk4xEEET+WuYRCTUAYNcZwEKD2YREhoRBJt3aeVGsuSZQeFh6JhyVHmQ5AqxQyCRarh8VQJZTkkBC3tuY37WdkeBhMkIeFcCSUw0IQqcH6Wxvot18vWoxdbgFFHHSLxnEhypptfufcGhJiEQqWiDws6rZF8qwmWAzjcFk9LIb9l6fKw2JT1jzSc1go6ZZwDFQlRBCpwXriT1RYSHgHjAm2IZJumTtc0q26zC1CQq7gdYxIMVQJiVyUIxbB4nYHT5woBNGoMm0+JNPyRIYqRB8WKmtWpmcx2hyhMOT7PkPgnlvA9+9O0siSCwmWTIA8LASRGqwN2BJV2ixCQkXFwaXIVg9LuJCQtUooVFmzIAYPCxOCxZrD4vIEv0cIBmPCrXF5Ij0sg5R0qxGwpAVEKNj4f/4FfLwV/J3XkjCo5EOCJROwHIyckm4JIjlYPQKJqhQSHpacPPMF1+s1d24FDH1Y7BrHqaIi1ioh1R5+uBX8g3e1iVS5LOv7U8UHt4aEPJZwEKB7cEIKliS35h+pZc1WT2CkISHh1cvQPEgSLJlAUJUQeVgIIimI35q4KCbIw6LN1JyTa77gWhNuAcNcQnH0YRFYq4TURGL5/34F+f6fAXt2KssNXlutn0o0HpZKq2BJUQ4LeVgUIg0JiWaF1vdnCCRYMgGqEiKI1CB+a2pvlIS15xchoZxcc2t5azgICN+HxdoiP1LBIjwsgJKX09oMQPG0ADDfBGlJt+2KByZU0zhAFw+VteblyezDkmNXJUQelogQIcEMTdK1OQIJx0E5LASRGsRvraAIaG9LYA6L4mFhuXngJsFSFLxuuNb8MTaOY263IpTElAA9aoVSf495u0wCyiqUxwG/sl6otvwApK8sB68eA3bMCZYXkhESClPWnKEX4JixeEgiLr8Xx3OG3vSSYMkEqEqIIFKD+K0JIZGoHJaBUB4WG8GiteZPROM4w+t5BYpg6Tyi59SIC5hBCDG3BygaBXR3KpVCYTwsbNoxYNOOsdlvYkM1XJb1TsEUErLxsEQoDPvMISH5n88AzQfBLvv/givAHAiFhDKBoNb8lHRLEElB/a2xRAuWQUMOi0GwBHW5BcKGhLiWwxJBHxYmgRkFi5ixuaVRX6bdcVtyY0rKlP+d7frdvI2HJSSqkOCJ8nwYxZtN0i0fcSGh2HJYxISbXH0/3/A4+GsvAq1NiRxd0iDBkglYf/TkYSGI5CBO/GJ+n0T3YbFWCYUJCcXdmt9leU3ksRwyCBYhyKxCqGS0MoYjh/XX7HJYQpHo6p0hQ+M98rAEXxMisJ8PDerXDvF+4bXKkEIOEiyZgLU3hC8z448E4Xi0HBaleoeH61sSDSLpNjfX3PjMOvEhMExrfkvSbTgPi7UrrfDmtBjupoNCQsq+WakiWNBxWLsbj8XDkjjBMqiNz+Q1GrFJt5ZrQCSeLOOxLNbX/mfGNYUESwYQ5O4kDwtBJBwuy4DalyThHpYB+5AQ8m1CQmGTbpVlLBIPi6ULruh2awwJaVVQViFUIgRLe2welkQ3jrMraQYMkx+OdA9LBIKt1xDe9PuURF1xM5whnx8JlkyAQkIEkXyMJ/2CxAoWHiIkxAqD+7BE1JpfDd2waEJCmoelWV/WZ6kSsuSw8I74clgQCED+z0YEVt8E3nkk8vdbCSlYVButXuhsx1rlE4uHxbiNDKkaIsGSCVDSLUEkH4M3gAkPS4Jb87PcKPqw+Hzgvd2Q1/8FvPmAssyaHAuE9rJYQ0Iih8U4c3SffQ4LEx6WYaqEQsGY7mHh/34Z2LUdfPv7Eb8/CE3whfKwjDDBEkMOi9blFlBEqHEbFBIiEobl7sE2GY8giPiw9bAkoUoowqRb+H3gb78G/vxa8BefUpZZ+7AAoQWLdWLEgoLgdUSrfm1SRXW7pWqVUMdh7e6bxZrDIs5X1hmroyGEh4VRDov6PIKkW/KwECkhKCSUGQcXQWQUxrtUEapJlIdlwBASirRxnM8HdCsN3rRcE6uwAEIn3lqFTJ6NNyfIw6J6bkapHpaeLr2HTFQ5LIbqHXG+Gky8YEnKFACZQCydbo2Cxe83ix7KYSESRlBIiDwsBJFwjL8zERLy+xIz2ajYhtcbQeM4r7ZvTSwIL4W4+EcUErIk3dp5WIYGwf3+YM9NYZEuig4fUv5H42HROtDK+oVxoD/0+sPANcGSa37BNVI9LLGEhAziO2AVLJlxE0yCJROwJpRRSIggEo/xpJ9XAIjOn4kICxmrcISXICdXn3XZiJgV2e/T803U9/NoQkJBOSw2HhZASSz2i1mg1bJmxvTE29YYBIvLzsMSu2DB4DBJtyPOwxJD47gwISFOgoVIGEJNew13XgRBJBZxly6pHWJz85TnfQmoFNJmPHbrfVjsEm4Bc0jI6mGxVvMAkYeE7DwsgDKfkLVxHKB3u20TgiWWsmZjDkscgkX1sDAqawZg6CAczSSTJsFCHhYiWYgTqfixUpUQQSQeUWlineE4ER6WgEEQlJUrj8ur7dc1hIS4uMgLQaH1RAkREvIalltCQkEeFvF6X6+tEDJVCgGAK5qQkMHDEkhgDktQldBIDQlZQoMR2M97LYIlA5NuafLDTECEhLy5ALoz5uAiiIxCuNXFRTAvX/mfCMHiM3hYxk6E9N2fAjV19usaG8cNiGRbs4eFhQoJeXP0duvDVQmNrlS63vb12gshIVjE+ccTg4fFEHrg8XhYBm1magYo6dbjVTxXsfRhMZU1Z8bnRx6WTEAcTMKVTCEhgkg84i5VeB7yhYclvpCQqaOoGlZhM44FK6uwf4MQLJxrk9XpSbc2oRurYBFYPSw5efq6OXlAcanyuL/PvlxahIS07cVY1pxID0vIHJYR6mERn0dEOSzWpFuf+XkGQIIlEwgKCZFgIYiEI35nIidEtLKPt7TZOPdXJImrRtHQo5Q16zksNp4QFplgYYzpIqyoWHvM+3rsG9JZBUtUHhabpNsE5LAECZaRPvmhFhKiTreEUxAnUhG/JQ8LQSQe2ZzIyPITlMNivJONJHHVHU6wDFMlZLygW0NCgJ6XU1hsts8m6VabAFEQVQ6LMek2AVVCoQRLomeFzhQ0D4sqWCLp9Ntr7cNCISEiGYgTKXlYCCJ5GKqEAOg5LPF6WIw3GNZSYxuYJOnriTH5feCcBzd4M44XCB8SAvTJFguLzfbZVR+VWARLLI3j/D49HBZHp1suyppzrH1YEjwrdKYQpYeFDw2aj0Nr0m0gM64pJFgyAdmYdAvysBBEMtCSbkWVkHpxj3cCRHFhcLuVsEwkWENHPp9ykdISYCMICdl5WFSvCisq1u3r6wUPV9YcakzhEA3dhGcESI6HZcQm3VpyWIbzkBjDQQKf4bshDwuRMFTBwkRIKOAHH2l3FASRbKwelvxEeVhimO3Ymi/i92nN3ZRtGV43eVgMHggbDwszeliMScVi24bcGObN0T0y0Y5fFVHcKFgGBhQvUSyE7MNi6Kg7kog2h0V0uTUcN5rXCqCkWyKBWENCQMYcYASRMQSsZc1qUmqIHBbe0Q757deU1vbhiGG2Y1NSrRjbkEGwhMhhYcY+LHYelvIq5X9FjZ50GyKHBQBgyGNh0STdCrFkHDOXzc+jYdgqoczwECQM9fzPDH1YwopB4WEpLtGXDRlCdJR0SyQMLenWcPdEeSwEkVjk6BrH8af+DP7QL4EP3g6/Xa3LbTQeFpt1RWjK7QYzihFjmMlwQWd2HpavLId0w0qwU76kJ9329dj3dwGAUYawUCyN44weFiD2sJC4uAY1jktMDgvnXBGfTQfi2k7K0G5iDQI13GcgBEtRib7MWGaeISGhmBrHvfjii9iwYQM6Ojowbtw4XH311Zg0aZLtum+//TbWr1+P5uZmBAIBVFdX46yzzsKCBQtM6x04cACPPvooPv74Y8iyjLq6Onzve99DeXl5LEPMLsSBaLzr8g8BCNFqmyCI6LE0jmP5BeBAyNb8vKtD+X/kMMJmpsTkYbETLIpwYp4QXgbAfFNjJ1jy8oE5JwIAuDHpVmzD4tlhpWXQ7tujGb8rlGCJMfE2ZFlzgjws+3aBP/RL8LwCSP9zF1iopn5OQQsJGT4POWCfaA1Dl9uCIiVcx2V9fiYgYzwsUQuWTZs2Yc2aNVixYgUmT56M5557DqtWrcK9996LUaNGBa1fWFiI8847D7W1tXC73diyZQt+85vfoLi4GHPmzAEANDc34yc/+QlOO+00LF++HHl5eThw4AA8dncZIxFjuaXbo5wAfZlxgBFExhCqSihUWbM/woZoMeWwhPawmMI+gDn04xkmJGRESyru1XNfPJZtGyuFYpmt2SpYYu3FkuzGcR3q9AP9vZDv/xmklb8As5tJ2ylY55cTy0J9RaqHhRUUgrtcgF82h4QyJMUg6pDQs88+i8WLF2PRokWoq6vDihUr4PV6sXHjRtv1Z8yYgXnz5qGurg7V1dVYunQpxo0bhx07dmjrPP744zj22GNx+eWXY/z48aiursbcuXNtBdCIxHgiFScyqhQiiMRi6cMy7FxC4jdovSiHWi9hHharYImirNmIFhLqte/vApgrhaISLOq+rfOeRRgS4rs/MYdnQpU1J2jyQ24suW5pgvy71cPnJqUTa5UQEN7LJEJC+QV6yXy2h4T8fj92796Nc845R1smSRJmzZqFnTt3Dvt+zjkaGhrQ2NiIyy67DAAgyzK2bNmCs88+G6tWrcKePXtQWVmJc845B/PmzbPdjs/ng8+Qw8EYQ15envbYSYjxxDUuUSXkcoGrBxsL+NNqa0LscjBkX2YSj11a0qIkKe8Xsyn39wOcK/1RjPh0wRJuf9rMum5P7GXNYhxQPCym7RiTbnNy9RCOyxV+f8K+gX7Ns8K8Oab3sNJybXvME/n4mculvM8mJGS3DeP3xnu6Id/5I6CwGK67/k9ZQeTY5OSax+dyK/vhclzHMhsaULZTOxY43Ars2Ab++INgl/9/CfmNJPz3ph5TzJujfz9ymM/AGBKyS4iO83qSqvNJVIKlq6sLsiyjpKTEtLykpASNjY0h39fX14frrrsOfr8fkiThmmuuwezZs7VtDgwM4JlnnsFFF12Eyy67DO+//z5++ctf4pZbbsH06dODtrd+/XqsW7dOez5+/HisXr0aFRUh5uZwANXVIWZmjYDDuTnoA1BUUoKenFwEerpQXlICb01N4gYYI/HYlQmQfZlJLHb17y1GGwBvbh6qamogl5XiIABwGdWloyAZS3wBNDEOP4B8l4SyML/Fvr1FOAzAm5+Pqgh/s62FRbAGmoo9LnRA8bAY7TuUmwtx6RlVUYkj6uOComKUhtkfLy+H5sPo7gQAVNTWwmN4z1DP0TikPq6oMb8Wjt7SMrQDYD4fjLUrpXm5yA+zjerqaviG+tEcCACdR1DpZpBGqd8DgOqx4yDl5mnr95SW4giAHI8HFXGcD7u8XnQCyD96BvJPOR1tt38f/LUXUDRtJorOuijm7VpJ1O/tsNerXBNKS9EpSYAso6q8HK4y+5zPwzyAPgDF1TXo9uZA7utBrgQIf1eux43yBFxPkn0+Sclszbm5ubjrrrswMDCADz/8EGvWrEFVVRVmzJgBWfUezJ07F8uWLQMA1NfX45NPPsFLL71kK1jOPfdcbV1AV3Wtra3wO8yNxxhDdXU1mpubY+5BEOhRXMHdPb2Q1buptuYmsIL0hcwSYZeTIfsyk3jskg8reQxDfj+ampqU97vdgN+P5j27gyYr9KthhL4j7Rhsagq93ZYWAIBP5mgKs56RgE1ORtehZuWBN8dkn9+Qz9bZr8uc3oEBDAy3v7JyoL1Ne9ra0Qnm0t/D/fo4Wo8cAXNbckhCIHd3K++3hICONDWh02ZMxu9NPvi5tvzQ1nfBJhytPW8+3G7ydMndiudgsL8v4s/WdrytynfULwND46ZAOu9KyH/7P3T84ZfoyiuCNOPYmLcNJP73FuhRPt/u3j7FwybLONTUBDZonyoQONyqrO+XIavXy4GODu31gd7euD6/eOxzu90ROxuiEizFxcWQJAkdBkMBoKOjI8jrYkSSJE151dfX4+DBg3j66acxY8YMFBcXw+Vyoa7OnJU9ZswYfPLJJ7bb83g8IRNynXry5ZzHPjY1NskZ01zF3DekzOaaZuKyKwMg+zKTWOzSQjeSS39vXgHQ3alUWZRa7l7VkBAfDN8Qjas5LNzljnxMNi38xSSMzOuFbLTPVNZsbtk/3P7YhKng7f/W9+F2m84rvKhYyZPwDYHn5EV8zuFCVFhuIPlAf/jPinNTPgk/uF8J0wCKbYyZ3s9V23kgENdxzEUycE6usp0zzwVr3Af+n42Qf7cauP23YMYeJrHuJ1G/N/Vz5S6XmsfjV46zENvWqoTyC7WQEDck3XIx9UOcJPt8ElXSrdvtxoQJE9DQ0KAtk2UZDQ0NmDJlSsTbkWVZy0Fxu92YOHFiUEipqakpq0qaeU83uJjILNr3mqqE1BMZ9WEhiMRiKWsGYEi8tSltjjbpNpqqR2tiLRBD0m0E96MTjzY/t5Y1Sy5I//UDsCu/rbTzjxC7HjAAIku6NVavNO4LXSEEJG4uoUFdsACKx4B97ZtAzVFAfy/4h+/Ft/0Eo4lrlzuyz0B0azYl3Y6A1vzLli3DK6+8gldffRUHDhzAQw89hMHBQSxcuBAAcP/99+Oxxx7T1l+/fj22bduGQ4cO4cCBA9iwYQPeeOMNnHrqqdo6Z599NjZt2oR//vOfaG5uxosvvoj33nsPZ555ZvwWOgDu8yGw6nuQf3KDuVV1pBinvRfJeBlShkYQGYO1cRwQfgJEIUQiLWuOREAIbMQNF2XNkQqW4cqaoXhYzPsNFkrsmHmQTl487LbMbwpxaQlR1swP7kPX39YonuPBAdPysIIlUWXNYp+5ehUS83jA5qiFHzsbbN6URsT5X/OwILIqoYJC/aY3AzvdRp3DMn/+fHR1dWHt2rXo6OhAfX09Vq5cqYWE2traTJnCg4ODeOihh3D48GF4vV6MGTMG3/rWtzB//nxtnXnz5mHFihV4+umn8fDDD6O2thbf+973MHXqVOvuM5KB9zYBrWp8sOMwUFkb3QbEj9HoYaGyZoJILNY+LICpfX1Q/UPEgkVZj0VTFhyurDlcHxaThyWC+9GxEyz7TVBaY0gPi/1nJT/5MDob3oOUk2++qWs6oHu3bAQLk9RqpESVNefkmZazKTPBX/gbuOMEi8HDos2nFOYzsAkJIQPnEorp6FyyZAmWLFli+9qtt95qen7xxRfj4osvHnabp512Gk477bRYhuN4el99UX8Sy0RqxhOplsPiC99dkyCI6LD2YQHC92LxRds4Lj4Pi9Y4Llyn2yhDQsztUXJzjiiJtwkrSw3l3QnlYWlVE4q7Os15GH4f+MG9ymPjxI7aflTbeWJDQhqTpin7aDsEfrgVbLRDKlGNHhZXeA8LHxrUxXV+YUb3YaG5hJIM7+/DwNuv6wtiEizqwWQMCZGHhSASizH0qsKMzdUMcDmgXySHEywB0TguXg9LiE63LPaQEADgqPGRjytSrD1rVKxVQ4BaKKEKJgwOmEMVALDnU+W/XUhI8zjH6SFQv0OWaxYsLDcfGDtRGaeTvCyiD4vLbWieF0K0iXAQk4DcPPtpEzLEw0KCJcnwLf8xuzhDdc0Mh21IKDMOMILIGDQPizHpVrTntyTdGqfGGC4vzRenh0X0HQkZErKf/DCikBAAVj858nFFSgjBYuth6evRPkM+0BckAPketSmpnWARXpdY5ygSDNqHhACAHT1TeeAowRK5hwW9esItkyTdw2K86SXBQgAAf/tV8/M4Q0KMPCwEkRxER2kpgpCQ8fc3NBi+lFPzsMTYmr9Qrc4RosmSGMvi9LCwxcuAylqwU8+IfHzDYc1hcduEIQRH9D4wGOjXcyvEZyDCRXaCRczebPXKRIsQUrk2gmWKIlic6GGBycMSQrAY2/KL91jJkBtgEixJhHceAd++TXkyUU0gjiMkxCQKCYUj1rJxggCgn/Btkm6DPCzG3x/n5jbnVmKZ/NBOsIj29OGqhDxevS9LhFVJLL8Q0u2/hXTFNyMf33BYxZKYSHDATrAc1h8bQ0JTZ5vHmWMnWHJDbzcaNA+LTZ6MaFzX0hRblWcyMFUJDTNjtVYhVKS/J2h7lMMy4uHvvg5wGd6ps8DGTVIWxuVhcdHkhyGQX3oa8n9fDv7+W+keCpGpcJsqITUkxMVJX2D9/YW7wxfrRlXWbBAlheb+JyzUjMWAOUQQKixjQ8LngLHuW1ws7XJY2q0eFjWf5OiZYMv0tvi2YkGEhOL1sIQJCZmWOeW8a9uHJUTSrbFCSLwnaHvkYRnx8LdeAwDkL1xiuFPrCfOOEBirhMTB5suMAyxl7NsFAOAH9qV5IETGYuh0K2AhPSyW31+4HIpYGscZPCzWhm3BOSzqaZwxc47CcLM1JxPrvo0TLVqxhIS4YWZmdvalwMzjAMDUol9DJMn6/XoztSjhgYA+q3SujYfFaItTPBF2fViGSbpl6nfA7EKTGRISSslcQiMR3nxQuYhKEvJP/RK6nn5c6RcQb1mzOOkFHKL0HYLWWjtD7hQIB2LXhyXPvkoo6E47rGCJoXGc8aJSYBEsoUJC4sIq9hNplVAyCAoJqTbYdbo1hIT4QL/u6fIqMzNL3/oJsO8z+2omY6nz4IB+YxgNxjHZhISYJCkVNlx2zvklCg9LcA4LhYQIC/xtxbvCph8LV0mZoQGVTYvv4TDe+Wk5LA754TgFIVjocyFiJWwfljA5LEBkgiUKD4smSrw55vmBYCdYLELFKlzSgSUkJO7uMTSkTzWiwo0elkFDSEjNWWGSBDZ+sr1nwG1onBZrpZDIf3G5Qzf3cw2T2JpqAoZjdbjGcVpb/nAhocy4ASbBkgQ451p1EDtxobIwRD+HyDYY3DiO5hKyMKBeUEiwELFi04dFL2u2hHKtv78wF0seUw6L+jvPzQtK1g3uwyKSbM1ChUVY1pwUQiXdAsEJsqGqhOwSYC0wxvT1YhUs4RJuBeK7c4yHJZqyZkNbfvGeoO05RIgNAwmWZLBnp1KK580Bm3OCskyo23j6sEgSteYPBYWEiHix87DkGzwDxt9cUNJtmOqRQBxVQrl5QZ6ZkEm3QiS4HRASsoolY8My41xBnJurhAb69QRau862duTEmXgrQkJ2+SsCR3tY1NmXQ4xNSxgXx7Kdp4rzIM+XEyHBkgS0cNCcE8HUun4WKhYeCRQSGh4SLES82OawGCpEjGEhi2Dh4e7ufTH0YZlwNDB1NtiipcEeFmtISHiEtJCQ5X86sIolt8fgCTHkjPT1mj0jgwMGD4tNGbMdWvO4GEuOw1UICTTB4pDzS8CQF6VNfhgi6ba3G4BSvq69x44w1xTe3YnAD65C4H//v/A9h5IMJd0mGB4IgL/7BgCAnfhF/YUEh4Q4eVjMUA4LES8BQ/sAFSa5FO/AQL/iHS0apbwQTZWQenGxzcEIAcvJhet7twMA5FdfML8WysPisnhY0hoSsuzb7VY+x75ec6WQCAdJknLBHRzQP/8IQkLKeurnMUxIiAcCwPb3lbyg6jqw4hLlhYFoQkLp90LwQEAXzG5PBEm3eqdbAKGrx8LZNtAPdLQrlVuJLoGPAhIsiWb7B0B3p9I7Ydocfbk4WAb7wQMBsGhKDo19WCgkFAQPBHSXvFPugIjMw64PC6Ak3g70h/WwhA0J+QwXl1iwJutan1sECzv1TPAtb+oNz9JBkIfFrXswjMJChIMqa4Dmg8pjETaPNiQ0nGD598vgf/mN8sTlgnTj7WBTZujzG4UVLKo9TrghamlUrgneHGBUaQRJt9Yclug9LJpXzK7bcAqhkFCC4R9tBQCwY08031HlGcrtos1jMXbgpE63wRhdzE44oRCZiU0fFgB64q3BOxrk4YzAwxJVSMhIUEgovIdFWrwMrh/8P2XivnRhvSFzufW29wYPCz/SCgBglTXBQjHKkFDYsBwAfLZDfxwIgO9V5ygS77Npy6/hJA/L53uUB2PGqX13dA+LbbgmksZxQPibPRFuC/cZpQASLAmGf6K24re2lXa59DuMaMNCdlVCdGHWMZ4AycNCxIpdDgtgaPpo+N0GVQmF8bD44/OwsKCk21B9WBzkMLcLCakeDG4KCakeltIKsDyLwIo0JJQbWdItb9yvPBhVpvwX52H1hodF4mFxwvnlwF4AAFP70oi5r/h7myB/7wrwj7dqq/KhQf34yw9TJQSEF2PkYck+eG+3fjCpE2aZsDvxRYLhzo95KCQUxAB5WIgEIBs8mUZU76hp4tKgHBabhmjWdWMVFMOWNVtyWJyA1Uvlctsn3ao5LKysHJLRC82kiAUeiyDplssy0HxAeWKd1y3TcljUawzq1EZ64rPesQ3o7gT/+AN9ZREOYpLuHQnl6QvXi4U8LFnIzo+UidCq68BKyoJfjzXxVrbzsJBg0TDmFjjhDojITOTgpFvAUOFnOs6iyGGJoXGciSDBMkxZsxOwfoZuj1YxaezDos0jVFquvw4AOTmRJ3dqSbdhROORNiX043KDjZuoLBM3jlFVCaVfsEANCbG6euW5NbnaeG3o1RNumTU520oY2zh5WLIP/smHAJRJu2yJtbSZ280lRIJFw3iiIsFCxIrWh8UaEgrOYQmayyuSuYRcCRIsIcuaHSRYrJ/hcEm3paMh5RtCQpGGg4zrhgvLiXBQ9Rit0otbQkJh+7AIr0QKe5XY5aPwni6gQ/3MNMFi8Zj4DDOHW9vyA8HHYSRpBlqpOXlYsgYhWHD0bPsVRHt+68yvw2FMutXmEqILswaFhIhEECqHJc8mlCtEiCoWwiZ8xpt0a81hCTmXkINzWGySbpWmcSIkVKF7soDo7uQjaBzHGz9X9lNzlN6PJKqQUGpzWPhAP+SbvwH5z/eZXxDhoPIqPefH6lkbshMshfoyq7AVdodNuhV5PuRhyQp4T5eev3L0DNt1WKw5LKayZgoJWeEkWIhEELJKyMYzKn5/2hw5qStrDp106yAPCwuddKt5NPoNTeNKyswhoVgESzjR2KR6WGqOCsol5BGFhBQxGOuM0FGz7zPg0EHwLZtMi/kBtUKozjARpNWbZfCwcGtbfiBY2AoREjbpljws2UVLk/K/tBysuNR+nUSEhGguoWAGKCRExA8P1YfFbuJSa+VFiIsl5zzhZc0YbrZmB8AYM4/HbVPWLMJBBUVgObnmpNtoQkIRlDVrHpYxY3XBIi7mYjxO8rCIhnp9veDGm7DP9wIw5K8AQQLbVHKvelhYOA+LEIeR9GEJFzZLASRYEoUQEOEO+liTbgOG2DqVNQdDSbdEIhiuD4spJKQeZwXhBQsCASURH4jdw2J8n9sTnIxqbc3vFIxeFpdHu9hpwuKInnALACzmHJbwnW4554AqWFBzVHCIT4Q7ws4llOIqIeOEkD1d2kOulTTX669bBYjR22cTEjL1B3O5I5vYUXhYIm3mlyRIsCQK4YYLVwkQQ0iIG+eHYIZOtxkyHXhKoMZxRCIIkcNiG8rVQkLqLMShQkLGi0AiPCxW7wrgSA8LgGAPS44lh0WrEBoNAJCMje6iCAkxLZk3xHdwpE05R7hcSkddrev4gOK9iKhxXIr7sJgESycANRwlkoeNISGrwDZ638XNcYEx6dZwHLojFSzO8LA4TJJnMH5VsIS7i7Lr5zAcRsFiCgnRhVmDcliIRCAPk8Ni9OSpFwVWUAgOhPawGI/HROSw2G1D9fIwIZ6cgmQWLCw3z/xZqSEhJjwshsZxYZu4WREellBJt+IiX1kL5vaA5xkEaX9fRGXNzOVWxp4iDws3zmDdrXpYmg8qQjknDyiv0l8PEiyGpFtrl1vALCRdxpvgMJMfis8ozR4WEiwJggtVa3cHpMLy1ZNbVILF8ANxSQDUExaXo5+TKAyc87ROahUXlMNCJIKQVUI2Zc1WD0tIwSKqiVjwdiPFbTin2Hhw2dxTAL8fbNbc2LafLIzJoMbGcVoOi8XDkhdjSEhcRAdChIREOKj2KACGruOD/UB/jyNzWGAQLLy7EwzGhNtxek8VIHzSrTaPkEHMuqwhoQh6zGiijkJC2UGSQkIICgkZtp+gSiHe3gb5pmsgb3g8IdtLNbyfBAuRAMRvzXoTYPjdit4Y3KZKyHYeF0OX25hvCDyGC4zNDRHz5kBacCaYeuF3DMYcFmPSrRpe0BJLy0QOS5LKmptESfNYfVmBIZ8wkotxghrHcVm2P06stLfqj0UOi8hfMSbcAuE9LHZJt8bQpNujXVN42KRb5TOKyvOVBEiwJAr/8B6WoOz0SLCGhIzqOFGC5bMdwJE28C3/Scj2Ug7lsBCJQPVmMqsnRFxoZVm/GGhJt+qdK+fm/hcC7bwQYzgI6lwxYkxxbCflhMxhsQ8JSaZOt4lrHKfNIVRrECwizNfTrecfRTT5YeznF845Anf+CPJt3wkrDrjPB3R36gvUkJBtSTMQLLCNOSxaSKjAfn2XKzLvEXlYsgwR0w4nWIpKlP/dHYrS3vkRAqt/BL5/d+j3WENCLpfiXgYSd3EWdyaGbPSMwhQSckDrbCIzCdGa3xS3F8eatawZsL/Dj3ceIYHwrIY7vzgN4+fo8pg8LMamcSIklIzGcZxz3cOihoQA6KXqHYZckXD5GQnwsPD+PmDXdsVTImZctsM4JkBLutVKmo+yCJawHhaRdBuiD4sx6TYCDwsJlmzBF0HSbXGJIjYCAaC3G3zTP4FdH4Nv/nfo95hCQpLiVk5087hBXbBE5K50GpYcloy0gUg/oaqEJMngHVATb9XfHvN6dRFhl8cS50zNGuL98W4nlUiWkJDWUTWgeBDE7zZRZc2BgLkHCQB0tCuJtZIEVNbqy4XQFN6X3DzA2pDPSAI8LLLBa8L3fBJ6xSNmwcK7O8G7O4HOdmXBmLHm9cPksAzb6dZU1hxJ4zgSLNlBJEm3bjdQWKw86WjXM8HD5bQYTqJaDDzRzePEwej3hZ9AzKkYqzcAymMhYiNUHxYguOmZuBt1e/QL5oDNb0cTLHF6WNTzCsukkJBkuTAaL3ZN6szJ+YVaXoSprDmWpFsgWDQaK4QMn53w5mje7fLq8DlGCfCwyN0GD/bu0IKFG0uaASUkJFryV1SDGT8nwLasmXMOPjSoixeTYDEcQy63XriRAWXNJFgSRSRJtwAwSp3FubNdV9LhqobsprwXJ79EeViMrtTuDAwLWUUW5bEQsRCqSggIFizGdvvqnTt/85Xg9wUMwiYexG8+k0JCllwJ5nJpXgzerAoWQ6Kwsaw5qj4sxrCGRbBw0ZLfGA4C9JwOIVgqqhCWBDSOM3tYdoZeUQgWca3o6QIXISRrOAjQBYsQXFxWjjvhXWGSOT/Hmls0jPeIc06N47KOSOcLKVEOQt7Rrh2Y3OohMGJ3EhX7SJQnwfgj7+lOzDZTBOc8uJyR8liIWLC7ORAEeVh0z4l01iUAAL7xOfBDjeb3JczD4jH/zwTE5+g2VEiJ0JqaV4KyCn31WPuwAKETbw2THpqwVGyyiurw209AWbNszBFsaVLmnzO+/vo/ELj7ZvC9nyoLxk5Q/nd3AmrCLRtTH3psxioxnw/oVW+E8wssZdAh+rCEutHzDenTw5CHJUuIpEoIAFMFC5oP6Ce/cLM32yUCigMs0SEhIPMSb4cG9R+TgLoAE7EQKukW0ASLNtGmwXPCZh4HzPwCEPBDXvew+X0jOulWdOA1iCzxOaohIRbKwxKrYLEk3tpWCAF6lZCgPAUelq5O84I9n5qe8lc2ANs/AN5TJjxkR6mCpbdb87AEJdwCugAZXakv8w0Z8lcstpqSbj3DizHj9SGaZOgkQIIlUUQcElImRuR7d+nLog4JJTjp1vAjt6p+xyO8U4xFlu1OEKEQvzVrEiMQPiQEQFp+tfIbff9t8B3b9PcloKzZuJ/MEizqhdDoXRLCwi4klJunhzWivTBqeUSGc1moCiHAXDUDgJVH6GGJ49xiDAkBNom3XUfMYxqrihNZBg7uUx5be7AAYNPmAJOngy1cqh8fJsFithXWuYQ0j30IMSZC7l6vUmKfRkiwJIoIkm4BaCEh7DMIlqhDQonNYeHGkEqmCRZxAcnNo4khifgQvzUWfFpkufZVQuKYYzVHgX1xibKZJ/4IroofnigPiycDq4RcNoJFfI6iMZpaIQSoMzwLQROth8Vr42HpPKLcDDIJqBpjWp1ZPSwpyGEJiHOrSPg15LFwvz84HF9erXuCOFc+OxtPECsdDdcPfw5p3gL9OPENgYseLBZxZu50G0EfFoe05QdIsCQM7o/Mw8JEIpWxoiBslZBN5UKiL8xDGSxYhPrPyTPMiUE5LEQMaB6WSKqExA2KfvJnZ12qXGAO7NETcBPuYckgwaKFhGw8LCrMIFgAgC1cCkw7RplVORpEboUxH0+rEKoJ7o9lDJMwZg6n2JGIHBYREpp+jPJ/9069BYPotcIk5abX7VHESVGxvoG6+uG7JXtUT5PPZ9/lFrBJuh3Ge+SQHiwAzSWUOKL1sBhRZw1ldol5dh4WT4JDQoMZLFiMHhZxwaEcFiIWoqkSEr89Q34GKyoGW3YR+JN/An/6L+DHnzLCc1jsQkKWbrIWweK64KrY+iipd/98cBDiks5FYq+d+DEKlpLR4Rt+Atr3xxNQJcSOngX+wbuKoDjUCFSPAbo6lJWKSyB9+2ZgaAisoFBpg9HSpLzP2uHWDnFtGBoMHRIyHIvM5dGP4ZAhIecIFvKwJIpIGscBWg5LEAMhwkJhqoSCmiTFiiGpKuNyWMQFJC9/+Gx3gghHhH1YOOf6MeYxCxF22leAyhqgqwP8hb9pd+Qs3lCOeiGKezupRNy5Gy+Q1vb3iZr/SOSwGFscNIbIXwHMSbflw3hXgKg9LHxoEPJrL4K36z1VRJUQKy4Fxk1U1hNhoc4O5X/xKLCxE8EmTVOeF43SN3pU/fA7FsLL7zN0ubUm3UbZmj/TBcuLL76IG264AZdddhlWrlyJXbt2hVz37bffxo9+9CNcddVV+NrXvoYf/OAHeP3110Ou/4c//AHLly/Hc889F8vQ0ofofDmcy7Y4hGAJlXhrdxIVJ4BEVQllcEhIKwnPzaOkWyI+eIQeFuOJ3SIgmNsD6YKvK5t76WnlDhqIu6yZeWPM7UgnIhfILukWUMptw83fE82uxOdjvPkKVSEEmLwOwybcAlHnsPB3/w3+l9+A//0xbZnWOK6gEGz80cpjNfGWGzwsRlihHhKKzMNiSLrttfewMEkylZyHutHjsgw+0A8uBEuCvqt4iPpXtGnTJqxZswYrVqzA5MmT8dxzz2HVqlW49957MWrUqKD1CwsLcd5556G2thZutxtbtmzBb37zGxQXF2POnDmmdd955x18+umnKC0NcVF3MhGGhJjbrahmS8Z4yDwWu5OoEEUJ68NiKFvLtMZxA8YclmFcmwQRjkC4smal5JYP9IMZPZt2Ho85JwBHzwI++VApVQXiFyynfQUAB5t7SlzbSSla0m1wWTOAoHBQXOSak24551oOS1APFgDIM4xjuB4sQPQ5LOp8QJoQgaFKqLAImDBFeX236mFR12MWwaJ5WBgDxowbfr9aSGgIPFRICFAEmDwUtjU/X/tH8H89B7bgDGVBmkuagRg8LM8++ywWL16MRYsWoa6uDitWrIDX68XGjRtt158xYwbmzZuHuro6VFdXY+nSpRg3bhx27NhhWq+9vR1/+tOf8O1vfxvueJsspYNIQ0KA3sEQ0H8IoTwsNiEhlsSy5kzzsAgXMMvNM5xUKIeFiIEwOSymKiGf0cMSfK5ijEFa+GXzwjhDOWz8FEjX3GjqW+J4hku6TaQtXkvSbXeHksPBJCVHxAKTXHpYaLgKIQAs2iohcQM6qAsoTbDkF4GNVwQLDuxRWuiH8LBoSbcVNZE101NvmLmhrJlZq4QAcwWX+pgbzpu8twf8tRcBLoNv+Y+yHWv+URqIShn4/X7s3r0b55xzjrZMkiTMmjULO3eGaTWswjlHQ0MDGhsbcdlll2nLZVnGfffdh7PPPhtHHTV8drjP54PPEA5hjCFPVczDZlEnCzFbszfHNAbx2LSspEyfKrxqjHIn0N9nO3ZuaGZlnUuI+f1x26u0XTYIlt5ugHNzZ0Qb7OxKC1oOi7lKKN5xOca+JJGt9sVll5q0zYydWVW4aGo2MAAm7rIlCVKoZNqJ08zP3Z6EfNaZ9L0xlwsc5s+T5eVDpNSysooge2K1i+UXKNvt6QJjDFzNX0FFFaRQF/pRJUB/L6TqumH3y8W5RY7w3CJC1YMDyvoD/ZrYYYVFireiqATo7gD7fA94d4fyWnGp+Voxpl75DKfOimi/zOtV1vf7dQ9LQVHwe4U9bg+Y26O8x3De5O++rt8QC6GVmxtyDKk6LqMSLF1dXZBlGSUlJablJSUlaGxstH8TgL6+Plx33XXw+/2QJAnXXHMNZs+erb3+zDPPwOVy4ctf/nLIbRhZv3491q1bpz0fP348Vq9ejYqKijDvSi6NcgABAOU1tfDW1AS9Xl2tux3ba8agt+E9sNw85NTWYaBxP0bleFBo876B5n1oBeDJyUG1+np7cTF6ARTm5mKUzXuigQ8N4oBxRmhZRnVxESRjOV0YjHalgyMuCT0ACssrMdh8AEMASouLkR/n5yJIt33JJlvti8Wuz9Xwa2V1NdyWfheDR+rQAsDtH0JFaQmaADCPFzWhjrOaGjSWVyHQdggAUFhSgpIEHZNAZnxvbfkF6AeQU1CICtX2nqpqiPZoRUfVB52/YrWrb9pMHF4PuNsOobqmBt2bX0cHgNzxk7V9Wxn471vg++wTFJ60YNgLbf/BCrQB8DCmnYfD0QYZ/QDcAR9qamrgP9SoHDPeHNTWK7kordNmYeCdN1DU1oT+gX4MAigZNx4Fhu3z6qXwT5kKd00dWAQhmbaiYvQDKM7LRddAP2QAFWPrg65JBz1eyACKRo2Ca/RoHAGQ43Zrn1Xz26/B0j8cBWWjUTqM7ck+LlMSe8nNzcVdd92FgYEBfPjhh1izZg2qqqowY8YM7N69G88//zxWr14dsTo799xzsWzZMu25eF9rayv8aUq4DKihibbOTrCmJtPYqqur0dzcrJXrBVTXGi8pw6CkfAWdjQfRbXifQG5Tssx9gQCa1NcDQ4ry7e44gj6b90SDqSrI6wWGhtD82adgVbWh3xTCrnQQOKx8Pr3+ALisjONIaws64/xcnGJfsshW++KyS70DbmltA/OZT9e8R7lj9vf0oKVJuTnjLrf2m7RDrp8EqIKlZ2AQ/XEek0BmfW+BISVMPmg4d8kDer5cjydHO3/FaxfPKwIA+PbvRuPBg5B3NCj7LqsM/R2NrgFG16CnuXnY7cudynnSNzAQ9jsXBNqVHBZ/b4+yvjrJIs8v0D+L2nEA3kDnB5vBW5UxdMhAl3X73nzgcPuw+wSAgF85brsOt2lJvm19/aZrEgDI6jWzZ2AA6FY8MYO9vWhqagL/fA8Cu7YHbbvXH8BACNvj+f7cbnfEzoaoBEtxcTEkSUJHR4dpeUdHR5DXxYgkSZryqq+vx8GDB/H0009jxowZ2L59O7q6uvCNb3xDW1+WZaxZswbPP/88HnjggaDteTweeEJU46TtR6yGhLjbo3QltMA518cmSptLy7V+ALyv137sfr1KSHtdxMPVacTjQety63YrFUxth8C7O5XSzEjeb7QrHaiuV56TBy5isf74PxdB2u1LMtlqX7R2cVnWfrdckoJ+w1ybXK8PXEuw94Tfx4SpwOY3lcdud0I/54z43tTkZe4ynLuM4ZmS0UE2xGoXL69WcmUGB8APtxgqhI5KzOck6Um3kWxPq14cGFBsEl1sC4r0909QKoX47k/0sHzRqPjGK2bD7uvR8ip5fkHwNUn0lTEk3XLVNvnfLyvrzDkB+HCznrfjzR12bMk+LqMSLG63GxMmTEBDQwPmzZsHQBEXDQ0NWLJkScTbkWVZy0FZsGABZs2aZXp91apVWLBgARYtWhTN8NKLpVV3ONixJ4F/tBXSgiXgn36kLAxZJZTkuYREwq03V2lS1HYooxJvuei7QGXNRDwYw6K2Zc1qDsvQkH5xGea3ziYcreVrxN04LhNRP0dmnPzQmLhZlrgqIeZ2K8m1B/cBB/YCn+9VltuVNMdCtFVCWg6L2renVxcsGvWTleqfwy36MmvSbbSIY7JTDbwxST92jYjj0eXSco0Q8IP7fOBvvwoAkBYsgdx8UJ/3KWf4kFSyifpXtGzZMjzwwAOYMGECJk2ahOeffx6Dg4NYuHAhAOD+++9HWVkZLr30UgBKvsnEiRNRVVUFn8+HrVu34o033sC1114LACgqKkJRUZFpH263GyUlJaitDR+WcAo8ENBVaASts9moUrhu+LHy3gN7lYXDVgkZSi1Fs6pECBZjUyC15p/3dMH5KX0q6omB5eXpiXFU1kxEi3HG73CN4wD94jOcCBk7UX985HDsY8tUws0lBCS2SgiKOOEH90H+z0blBjC/wHaywJjQBEukVUKqYJFl5TyteliYQbCwvHyguk6boBFMUkqe40FUCXWoIaT8AvsCCq2pn8fch2XbO8pYS0YDM+YANXUGwZJhVUIAMH/+fHR1dWHt2rXo6OhAfX09Vq5cqYWE2traTLkog4ODeOihh3D48GF4vV6MGTMG3/rWtzB//vyEGZF2jMIh2tbZIiRk8bBwOQD+7r+BTvXAMx504o4lEZ4E0YMlJwessFjLtM8YDK35RbY7eViIqDFeiOzKmj3qid3v1/O+hps3zPj60GDoFbMVY3MywahS5cI8qhTM7s4/HkS/la1vKf+PnpW42YWjFiyG8/nAgMHDYmniNmGKPoVAUXH841VDQqIPjGkKAiMGD4uxD4v8738q45p/GpjkAqs5Clz9PFluBGXVSSYmP+WSJUtChoBuvfVW0/OLL74YF198cVTbt8tbcTSiBwsQfb8FcUBZZmzmz64F3/BXfYGpcVwCPSzWkBCQWc3jjI3jqA8LESvyMB4WQPEO9HTrgj6C37p0/U2Q/7EebOmFCRhkhiE+R2Nr/uISSN/7mX6uSSCsdqxyw6J6y9i0OYnbuHZRH/5miMsB8+S2g/2GmZMtHpTxRwNiosx4w0FAcEjIrmkcYChrNkx+2NGmhNQAsJMXK8tq6vT3OGC25hEYWI0OLsvD9iTRutyq8cBo0PoSiJp5QEkae/Fv5hVtZmtOyFxCWkgoR5mPBwgST45Gy2HJpxwWInbk8B4WAIoo7unWBX0EDS7ZF06G6wsnJ2CAGYidhwXK5H9JwTJnEJt2TOK2HY2HxShWAOUcq3pYmCXkw8ZP0fOcQk3bEg3Cwy96p9g1jQPM4Trx/YjE4CkzwCqVdAxWc5Q+PgdMC0GTHw4Df/AXkB9/EDzU5ISAocttDDOp5gV7WOS1fzJ7bQD7pNsEzCXEjTksXsM8FJlCv33jOIKIiuGSbgE9/0K49zNpIsJ0IFrvJzC5NiwVNfpNS1k5MExrhqiIwsMSdMM30G+fdAso7fbV/ipBbfljQZzD1UodFsLDwkor1P/lQblY7OTT9SfVBg+LAwQLeVjCwPftAt/8b+Xx1v9Auuz/A5t9fPCKfr3MMWpESEhNuuXbPwC2bFLivDzESdSdwJCQUbAYZ/rMALjPp59Acg1zCZGHhYgW4WFhUuh+UKpgiTSHZaTDFi8DGz9ZK99N+v4MlUJs2jGJ7boajYfFKliGBsFD5bC4XED9JGDnR4kJCVlzKEMJlsuuA1v4ZWDSNODzPfoLOXlgBo8gy8lVvr+D+wFLM8V0QB6WMLBxkyB951ZgdCXQ3gb5vp9B/v2d4CI+KPBFXtIchMHDwv0+yH/9g7LvRUvNU6AbQkLaXEKJmPxQTbpl3lztBMwzJUHQ6HqlHBYiHoSHxRXmlCg8LMLdPhJLlaOAuT1gU2bq56tU7FPNW2FzT03shg0elmH7jFgFy2C/PnNyQXDuDjv2JOX/xKnxjjL4GlRgn3TL8gvBJk9XRJ0xx2jeqUFzFknfvwPS6ofs5yRKMfSLGwY28zhIP70ffMNfwV9+Bnzzv8E/3gp2wdfBTj5dyW8RIZR4PCxcVvJWmj4HCovBzr4U/JMPgYNqtnmSQkJa0m1OLuDJSdx2U4EI03m9Si8BymEhYiVg0+/IAstV881EiSqFhBwHO+8KsNO+AhbJDMzRYMxNlGXzcyvWis+BAUNZc/BFXzr9bPD5i8FCVfREAfPmwCSnQiXdGjHYYgoHiWUej2O8ieRhiQCWkwvpgq9D+vEvgXGTgL5e8DX3Q/7lj8GbDxgESww5LB6v3mnw2bXK/s79mnJgG/oUsGQ1jjMk3WplmL4M8bAYE24BymEhYseu35EV4WGhkJBjYR5P4sUKYPamDePZ5nY5LH0hclhUEiFWAAQfk5EIlvJKJZdm5hdSFr6LFRIsUcDGToT0P3eBXXi1kii18yPIt38PXJ0vJBbBwhjTvSwBPzBuEtgpisplpYZkNVOVUAI9CaIPizcDPSz9hi63QHSJcQRhRBMsEYSEKOl25GH0qAx3Q2TtWt51RH9PssMqlmtQJGEc5vbAdet9kL79E8fPAk6CJUqYywXpjHMg/fR+JbdlsB/YqUy0FfMdlyFXRbrkv/TmQSbBkuTW/Dl6DkvGVAkNWARLIpORswTuG4L8p3sgv/tGuofibETSbSQeFkFeghufEc4lCg9LUA5LeysAJVxjzQ9JOBEm3drhdLECkGCJGVZepbV95qLtdiwhIUBT3eykRebEK2PralPjuMRVw3BjH5YMK2vmVsHiopBQELu2g/9nI/jTj6Z7JM4mGg+LCjvhi0kcEOEojMdFlB4WflgRLFJR4pvlBRGHYMkEKOk2DrRW9kfalAUxuoilJeeBb35TCTUZt19Wbpg8LbhxHLqOIPDTbysTsvmGlNyT/EJI/32bIqgMcDkA7PkUGD/Z3P550NDpVhzsmRISEkm3OWYPC09x0q289o/gzQchffPHiWsFnihExdfhFnA54LzxOYVoPSyTp4ONm5TcMRGOQaumCfgj8LD0izcp/VBUD4skrhfJJCiHJUG5MQ6BBEs8iPbSmoclNsHCjpsPdpzN3ErGkBAzKPxRpdq8JhCTJwp6usHffwvs9K+aFvOXngb/25/BTl4MdtV39BdUwcJyc/XGd5mSdKt6WJhwzacph4W/9qIiDFqalT4QTkKExwJ+4Eg7MLoiveNxKpF4WAyvSZbfFzECcLlUwRKhh6W4RGmR367c0ErFo5B036/Vw+KAUuREQoIlHoSLTw2hsFg63YbDGBIyiAhWWAzp5nuBlkYlUdbjBbxe8E3/At/4nDa1uoBzDv6mMqkVf/MV8FnHg31BFUjGpFtvpnlYQoSEUp3DIj4vv/NCadz4XbYdIsESCnERClOuysqr9DvkOfOSPiTCYbjcAAYjrxIqGa0IFvV8JBWmWLAwpldQZgkkWOLBOoFXgsscjbOZ8s4O82u1Y4HaseY3tLeBb3wO/MAe8/IDe4Hmg9pT+S8PQJo4FaykzD7pdmgInHPnJ2GFSrpNYQ4LDwT0jsQ+B1YnGcQbbzsEdvTMNA7GmfDDLfqs6CyMh2XaHLArvwU2aTqF1kYikXa7FR6WkjJgn7445TkseQXDz4OXYWSXNSmGBQmWBHtYjIgTajiOGq/8b9xvyuPgokJk9vHA2AlATzfkP/9a6dgoPCw5OXpZM5czI3HVOFMz1NbcQGobxxn35cRkZaO3qa05feNwKLyvB/JPvw35d6uVBeE8LIxBOuVLYE4L+xGpIdKQs+phYSVlpsVS0ahkjMqM8aY5y8JBAAmW+Eiyh8WEdToAO0ZXKt4Gvx84pHhUOOeaYGEnLoJ0zY1K0m7DFvBXX9A9LIbW/AAcGd4IQiTdpjOHxSgInPiZ+S0hIcJM0wFzGWqW3ZESCcTiYeE+nzLfnHHiTEA/noIESwo8LC637iXMsgohgARLfKTSwxJBBRKTJL3UWkxotXeXcqHy5oDNngtWOxbs/CuVddb9yeClyDXvY8iBF18LIcuaU5nDYtyXE3N/DGEq3koeFitcTYjUIMFChEITLMpvij/zF8i33wj+4C/MuWJaSGi06e2p8LAwxvQbzyyrEAJIsMRHCjws0vdXAXXjIV1/U0Trszo1LKTmsfB3X1eWHzNPa1rETlsGTDtGESViIq+cHEXwJHKeomTjgBwWx4eEjBNBtrWkbxxO5Uir+bko8ycIK5Y+T3z/buX/5n9D/vVPwfv7lDC7WtbMggRLCjwsgHbjzEJMA5DJkGCJh7x8S0O3xHtY2NGz4LrlV5HP5HlUPQCAf74XXJbBN7+pbOd4ffZSJkmQrvqOWYF71Q6MngwqbRZlzUGdbtMTEuJOFHnGRODO9syZiTtVWD0sLU3pGQfhfCweFu3YYQzYsQ3yL1YCrc16En5p6j0sAPRzOIWECCNMksyTWTlgbhGTh2X3DqWpXV4+MPM483pl5WCXf0N5UlCkJ6xmUmmzyGHJTWcOi8M9LNbw2GHyshgRXUgJYlgMHhZubAj3Xz8AikYB+3dDvvNHyjqSpCwzkDrBol6HCrIvJERlzfFSNAro7lQeO2H21jHjFMXf1QF53f8BANgxJ4DZeH+k408FlyRzaEsLCTnw4mslZGv+dCXdOlDkWcfU2gzUHJWesTgRMc/Ltd8Ddmyzb+BIEIDZw9LTpZ8jjzkB0lETIN97i57YnpsfNJWDVFQM+CwJusmAPCxESEwX+yQm3UYIy8nVT7qf7VCWzTs19PpfOBns6Fn6Aq+YsTkDBUuaQ0KO9EpZBAunSiEzQrDUjoV05bfAZn0hzQMiHIt2QyTr4aBRpWAeD1hVLaSbVgPCw11YpAgHQ18fCgnFD3lY4sUoWJJZJRQF7NrvAaMrwF96WmkPPe2YyN+cITM2czmgz5MTlHRLISENIaKYpMTWW0mwCPjQoHKnDABl1AGYGAbVw8IDfjBV6BqPG1ZSBukHd4Bv+CvY5BlKxU5OjnJj5fFCSvZMzYLCIm082QYJljhhhgmtmBNCQlAaqLELrwY//lQgvxAsmtwaIbqcXtY8YKjmCCprJg+LhhBvFVVASxN5WIyIu+ScvKwsASUSjDGHpVsVLMb53gCw/AKwi67VF+TkKYIlhU3cpAuvAZ/1ATDjuOFXzjBIsMSLAz0sAlY/Ofo3qTZw3xAc3ZhfJNy63HreTdpzWJwn8rgYX81RSgUMdbsF//Rj8Pfe1EOhZeXOn4aCSD/GHBZV7LLhPHPCq5LCEmM2ZizYmLHDr5iBkGCJlyLDgegQD0tcCNHlxARSI4b8Fe1iI0JCsgwuB1Iz30uGhIRY9RjwDwC0HcqMeaKSBJdlyH+6R/kcGrYoC2lCSCISjH1YtJBQeej1ASA39YIlm6Gk23ixq7DJZDImJGRJuAV0wQKkrHkcd3pISIyvSp3/ZqAf6OlO33hSROCRBxC45yfm7wcAtn+gV3Ko01ew0mEuOgQBgBk8LPxIdB6WbGzilg5IsMQJc3BIKBZYhiTd2goWl0GwpCqPxekeFvWCzfIL9LlNsjyPxd/aDP7ai8DH7wNqN1KB/Po/gt9ACbdEJBg9LIeDk25tUSdmzcaJCNMBCZZ4MQmWLPKwOPHia0RrGmcULIYQUKryWIydbp0YRhOCyu0ByqsAADzL81gGNm/SHvPmg/rjziPAB28rT4z5XSRYiEgQ55ehQaCzXXk8TEhITIcSNI0LERMkWOIlyzwsmSJYgiY+BJScFTFVQso8LBkSEnJ7wMqrlcdZ7mEZUKejAKCFfQCA//tl5e544lRI51yuLWeUw0JEggg5H25R5mBzu4O62QahejXZcLkuRERQ0m28ZGsOixMvvkbsQkKA4raVh1LoYXF6SEh4WNyahwVZPGsz9/kw8P47+vPmA8p/WQZ/4yUAADv1TGDabKC6Tpm6ojY7KyqIBCP6sIjfT2m5Mj1LGNjSC4Ex48BO+GKyRzciIMESLzm5YF84Gby/V2nSlul4M2TyQ+vEhwK3WxEO5GFRMHhYUCFCQtnrYeGffqR73wBAhIQ+fl+5M84rAJt7CpjkgvTDnwNDg2Cp6kBKZDYih0UIlghCiay4BOzUM0ZsVV6iIcESJ4wxsOtvSvcwEoc2l5ADL75GrBMfClLdi8UkWBzoYfEZQ0JVSpPDbBYs294FALCps8F3bFOa5ckByG8oybbspEVgOcr0E6yI8gqIKBA5LFoPFgrzpBrKYSHMZHJZM5D6+YSM+3Fk0q3BwyJyWNpbwVNU9p1q+MdbAQDsi0sUm/0+YPcnwPtKsi1bcGY6h0dkMkKwcHUCw1LKfUo1JFgIM2pIiDuwa6uJcDksAHlYBGJ8HreSAOh2K4mnah+JbIB/tgO8vw+8ox1o/BxgDGzaHKCqFgAg/20NIMvAxKlgY8ald7BE5uKyBCRGk4cl1ZBgIcxkSNKtXZUQgDQIFmPSrQM/M2OVkCQBo7Mrj4V/8A7kn/8Q8kO/VEJAADwTjgYrLNKb5e36GAB5V4g4cZk7Zw/bNI5IOJTDQpjRQkKZkXQbKiTEG7YA5dXJn7HUNJeQswQL59xcJQQA5ZVKqW+WVArxd99QHmx7F3xQmRAzd87x6Ic6HYFYMV9JtiWImLF6WCgklHLIw0KYYBk2lxCzJt2qU6vz59ZCvuWb4MkO0zg5JGT0MqnJ1KxCyWPJBg8LlwP6fEAA8MmHAICc2ccrz4WHBQA76TQwb04qh0dkGxYPy7DzCBEJhwQLYSbDPSzS124AO+Mc5eTS1wN0tCd3HE4OCRnFlKj+yqZeLLs/AXot8yK5XMiZeSwAgNXUaYvZqRQOIuLE6GHJKwDLyw+9LpEUSLAQZjIkhyWUYGHVdZAuvBooKlEW9PUkdRimdvwBP7jsoOobn42HpTyLPCxqCTO+MF/vODrhaEjimBg7ETj2RLDTzwYbQ83hiDgxeljIu5IWYsphefHFF7FhwwZ0dHRg3LhxuPrqqzFp0iTbdd9++22sX78ezc3NCAQCqK6uxllnnYUFCxYAAPx+Px5//HFs3boVLS0tyM/Px6xZs3DppZeirCzJ+QdEMJk8+aGRgkKg4zDQm1zBEhQ68/mBHJf9uqlGjM3l0jtyah4WZwoWPjgI7PsUvPkA2LjJYOMmhl5322YAADv2JKBuPPgzj0I6br72OnO54PrGyqSPmRghGD0slHCbFqIWLJs2bcKaNWuwYsUKTJ48Gc899xxWrVqFe++9F6NGBXeMLCwsxHnnnYfa2lq43W5s2bIFv/nNb1BcXIw5c+ZgaGgIe/bswfnnn4/6+nr09PTg//7v/3DnnXfi5z//eUKMJKLAG91cQvyzHZCbD0Kaf1oSB2XZJ+cGwRLCLavOjsp7e5DUHpPWfi/+ISDHIbkSxh4sArXbLbo7IBs7wjoA3rgf8r23aiXXPCcX0o/vNoV2tHXbDgEH9wGSBDbzOMVFP3su2FETUjxqYsRg8LBQ07j0ELVgefbZZ7F48WIsWrQIALBixQps2bIFGzduxDnnnBO0/owZM0zPly5ditdeew07duzAnDlzkJ+fj5tvvtm0ztVXX42VK1eira0N5eXBB4bP54PPELJgjCEvL0977CTEeJw2rpB41Iutzxd2zIwxcL8fgftvB7o7gapasEnTUjPGoUGteRPLy7cdJ8svBAfA+nti+uwj/t4sHhbmD/+5pRSRdOty6/YUFEHOLwD6euFvPgiW64xp7/nunZB/dauSk1JUAuR4gbYWyL/7OVw//qU+661Y/8P3lAeTpkES83mNm5R5v7coyVb7MsEu5nZrVWdsdGVUY80E++IhVfZFJVj8fj92795tEiaSJGHWrFnYuXPnsO/nnKOhoQGNjY247LLLQq7X19cHxhjy8+3vntevX49169Zpz8ePH4/Vq1ejosK5brrq6up0DyEi/G6GJgDwDaGmpibsugNb31bECoCCA7sx6tTUeFkC7W1oBADGUFM/3vZH0l5RiV4ARRJD8TB2hGO47+2QxGD0RVWWlsJdHfv+EslQfzcOAZByckzfZXPNUfB9tgOBQ42oPmFB+gaoMvD+O2i7+3+BgX54p8xA+U9/Bfj9aP72ZZAb9yPv5fUoXXGj6T2tO7dhAMCok0+z/X4z5fcWK9lqn5Pt6htdgcPq45IJk1EQw3nFyfYlgmTbF5Vg6erqgizLKCkpMS0vKSlBY2NjyPf19fXhuuuug9/vhyRJuOaaazB79mzbdYeGhvDoo4/i5JNPDilYzj33XCxbtkx7Li5Yra2t8KeqJXuEMMZQXV2N5uZmJZThcLgqQOD3ofHgwaDZSPknHyKw5gG4zvsacvd9qi3v3rwJfQu/kpoxHlKPtZxcNDfbV7sEoLhvu5qb0NvUFPU+Iv3e/H19puctBw+CcWfksnPVbllyocnwGQTU3jT+5oNpPy7lLf+B/Ic7Ab8fbNoxCNzwY7T0qqGqi/8L+O3/Q8+//4mBZZdo7+GDAwi8ryTc9oyfavp+M+33Fi3Zal8m2CV3d2mPOyU3uqI4r2SCffEQj31utztiZ0NKGsfl5ubirrvuwsDAAD788EOsWbMGVVVVQeEiv9+Pe+65BwBw7bXXhtyex+OBx+Oxfc2pBwPn3LFjM8Ld+iHBfUOAoXcF9w1B/r9fA63NCPz5PvQbciP47h2Qh4bAQnwvCR1jf6/yIDc/9Geq5rCgtzuuz33Y780SEuK+QcAh37PWg8btMdugJt76DzWm9biU3/wn+J/vV8J7x50Edu33AY9hrNOPASRJCQ21tYCNVk5q/OP3lc+9vAq8us72886U31usZKt9jrZL0nNYeGl5TL9zR9uXAJJtX1S3gsXFxZAkCR0dHablHR0dQV4X004kCdXV1aivr8dZZ52FE088EU8//bRpHSFW2tra8L//+78hvStEkvEYEkYtibf8xaf0/h19vZC7OoD8AqWkdGgI2PspQsEPt0B+8k+Q//lM/GMcrkIIAPLVpNsklzUHJd06qRxcS7q13JcIwdJ0IMUD0uGffAj+f78GuAx28mJI//XDILHLcvOBcUr1Id/ZoL9XzMg8+/iszQkgHIioEmIMKBmd3rGMUKISLG63GxMmTEBDg37ykGUZDQ0NmDJlSsTbkWXZlDQrxEpzczNuvvlmFBUVRTMsIoEwl0u5qwVMgoW3NoO/oOQNsTPOVX60ANgxJ4BNmamso3YaBQDe0wXe8B7kZx9H4Ne3Qf7xdeAvPQ3+xB/Bm+O8UEYiWDQPS6rLmh1UDm5XJQS9F0vgUOgwbrLhm/+tjGXuKWBXfls57mxgU1QvrCpYOOfgH6rlzKKjLUGkAiH8R5WCWW8CiJQQ9ae+bNkyPPDAA5gwYQImTZqE559/HoODg1i4cCEA4P7770dZWRkuvfRSAEqC7MSJE1FVVQWfz4etW7fijTfe0EI+fr8fd999N/bs2YObbroJsixrHpzCwkK46cBIPZ4cYLBf8ZqoyGv/qFyMj54FdsFVgNsN/tLTkBZ+GfK+z4D33gR/+1XIjfvB935q30k1Jw8Y7Ad/53Wwsy+NeXghJz40wAqKlIz+VAkWt0d5nEkeluaDkNLknuYfvw8AYCd8MXw12uSZ4P9YD77zI2XB57uV7sU5uYAqlAkiJYydqFSiHTMv3SMZsUStBubPn4+uri6sXbsWHR0dqK+vx8qVK7WQUFtbm+kENDg4iIceegiHDx+G1+vFmDFj8K1vfQvz5ysNntrb27F5s3LH9MMf/tC0r1tuuSUoz4VIAR6PIljUiy//8D3g/bcBlwvSJdeBMQbpvCtQff330dzSApabp4iD5oPgzQf17VSNAaufBNRPBpsyA7zxc/A/3g3+9uvgZ10Suzu/X010DdWDBdBCQujrDr2Oivzai2BVtWBT7RPBwyJCQnn5SsWUgzwsXJv40JJXNLoSYEyZLLC7U+8Sm6xxfPAOeMN7YMuvBfN4lB4qLU2KJ+/oWeHfPHma4s1raQTvaNe7206bk5J8KYIQsLx8uP737nQPY0QTk/tiyZIlWLJkie1rt956q+n5xRdfjIsvvjjktiorK7F27dpYhkEkC609/6CSaPvX3wMA2OKzTC3ONTd+zVFgXz4fvPkgWP1ksPrJQP0ksHxLj4/KWnCvV7n4PPMo5O0fQFp2EdisudGNb1BMfBh/SIgf3Af+l9+Aj66E6+cPRTcOQPdi5BUA3Z3gvqHkNqqLBjE2a26Ix6PE4I+0KZ6wJAsWed3DQPNBYMJUsJMWgW//QHlhwtHDzsfC8guBo8YD+3creS+iu+3sKI8ZgiAyHmfUXxLOwjCfEP/HeuWiNqoM7Cx74al4XK6E6xsrIS29EGz6nGCxAkVgsGNOAKDMpozdn0B+4o/RZ5VHk8MyOGCe78eK8Ah1HI56HJxzs4cFCE7CTRD8g3cQuOcW8COHh19ZECKHBYDW8TbZcwpxv18PD36qhnVUwcKmHRPRNsR6/O+PAXuUfk9Ri1yCIDIeEixEMOodOW8+AP7CkwAAduHXlaqNOGEnLlQfSEpuxaGDgMhPiJRIBEtevpYYHG4CRO2CHQjooaZICRjEiRAsSQoJyf96Dvh4qx4SiQR18kNmI1hYqmZtbjukfLYA+CcN4LKseVjY9DkRbYKdeb7iBWpR+16MmwRWQvOMEcRIgwQLEYzae4WvuV9JvJ0yE2xeYjqistnHQ7r+R5BW3gV2ktIZl7/xj+g2ouWwhEm6lVy6iOjtDb0to4ehd/h8FxNGz40Qc/4k5bB0dyj/+8LYYiWMh4VVpGjW5kOGnKaWRvD3NgE9XUoCdn1klYWsqBjSFd/Un1N1EEGMSEiwEMEYZyV1uSFdel1C+12wL8xXcl1OPRMAwN/bBN55JPINDDfxoaBALY8PI0RMF+yeaAWL7mFh6lxWSasSEl02+2MRLDapasLDkuyQkFGwAOCP/RYAwI4/JarSUDbnBKWcvmQ02EmLEjpGgiAyA6oZJoIxXOCl//oB2JhxydlP/SSgbjxwYA/kH12jVH58Yb5ycSoI3YuHD0YQEgIMlUJhEm9NgqUr9Hp2CEEgSUqZLZCUkBDnHOhRp0yIJmwVqkoIei8W3pbkkJDIEXK5lNCQKgrZl74a9aakC78OXPj1RI6OIIgMgjwsRBBs/mlAbh7Yiu+DHXdS8vbDGKQrbgCq65SL64ebwf/v15Bv/BoC9/wE8n82gvt84EOD4IZ5PISHJWyVEKAl3vIQlUKcc+Bwi/68N0rB4jN4MNxe87JEMtCvi4+YPCyhk25xuE0vf04CmodFTbYGAMz8AljtWPs3EARBhIA8LEQQ0pLzwb90Tsjuo4mEjZ8C189+A964H3zLJiXH4cBe4OP3wT9+H/zxB4HBASDgB1u4FOziFRHlsABKSSwHQntYOo+YPSLRhoQCBg+GKB2OwsPCD+wF//fLYKctA6sMM/OrmJASAI/KwyLKmm1+5sWlYN4c8KFBpby5IkmzrKrddKVTvwR5yybl8RnnJGdfBEFkNSRYCFtSIVZM+6sdq9x1L7sYvKUR/J03wF97EejQy3j5q8+DH27RQzcRelhC5rBY8zdiDQm5PaZScDv4kcPAQB9YzVEAAPmtjeCPPKAkNXd3ga34Xuj9GARLojwsTJLgqqyB/8BepVKoolrxOO3dBRSPAsoq4s5b4v19iigEgInTwC67XkkajqVBH0EQIx4SLITjYJW1YMsuAl9yPrB3p9LkbP9nkP94N6DOIwNg+KRbkcPS0Q75pfVgU2YqTe1Ugipkoq0S8gkPi1v3sITo+SLf8xOg7RCk238LtLeB//EefRwNm8H9/tBJqEYhFY2HxRcmJATAXT0G/gN7wdsOgQHgzz0B/sxjyov5BUBpOVA6GmxUGVA6WunFM/M4vSR6OET+yqhSsLx8sIVLIx87QRCEBRIshGNhbjcwabrypLwKUn4h5Htv1UMxw3pYlMRd/u+XAc7BXS6wc68A+9JXwSQp2MPSHaWHJWDnYQkOCfHuTqDpc+Xxjg/1Ut9j5gGf7VAEyWfbQ7ap5yYPSwwhoRBCyF1dqzxoawb/bAf4hseV5y6X4gnp6wUO7oOxnR735oBddj2k+YuH3b2Wv1JVG/mYCYIgQkCChcgY2NTZYFfcAP7wr5QFBcHddE3kFyj/RQfbQAB83cPgn3wI6erv6oKleowyD1LUHhajYFGb7dmFhBr3648/267NVs2OmQfkF4L/51/g778DFmpeHZOHJZqQUOgqIUDxsAAA/3wP+OY3AVkGm7cA7KrvKKKqox2847Ay2WBnO/ieT4F9u8Af/hXk7dvALrs+ZOIz51wRYQBY1ZjIx0wQBBECEixERiHNXwyeXwDw4auEtBmbAaBuPNjCLytJvB9uhnzbdzWvCBs3SZm0MeakW7cuCmwax3GDYOGfNADtrcp+J03XBcsHb4Mvv9o+b8To+envB+c8bH4Jb28FjhzWpyQIIVhcQkg0bFH+l1UoIsTjAerqgbp607xIXA6Av/A38GceA39rI/hn28GmzFA6zy5YouU98c4jkB95APjgHeWNk6aFHCtBEESkkGAhMg4258TIVjR4YKRly8G+cDL4xKMh/+5OcwfW+knA268lL+nW6GER+y0sUjw7pWWK4GltBpoPAGpSrgljSIjLyuSPYfJ35AdWAZ/v0ZvDDeNhAQB4cyB9Y6XtHFACJrnAvrIcfPIMyA/+AmhtBm9tBt58Rak0OvcK8HdeB//rH5R8IJcb7OxLwE6kRm8EQcQPCRYie6k5SplmoHYscKzST4bVjYf0v78E/8tvwd9+DWAMbPzRiicmypAQ9+khF+bxKNuwy2ExChbBpOmKlyQ3X6maadiihIVsBAu3Cqm+vpCChcsB4OA+JQwm5gnyhBAsNXWK0PL7lAaB4yaGMtUEmzID0q33gW/9D9C4H/zlZxTPy+6dwCcfKiuNnQDp698Fq6uPaJsEQRDDQYKFyFpYcQmk1X8EPDlKkq1YnpsPXHMj2HHzlbCJaGLmGwIfHATLyYlsBwFDUqvbPumWc657WOrqlR4zAJghTMJmzwNv2AK+7R3gy+cH78foYQHUPJZy+zF1HNEmG9S2H8LDIuXlw/Xft4EDYJOn228vBKygEOyULwEAZJ8P/NXnFbHicoF95SKwL18QVet9giCI4aAzCpHVsMJi++WMAcedpJTzcq7MnxTwqxPzVUS2cZ9NSMjaNba7Q8mNYQzslDPAH/+Dsv9JukBgxxwP/tjvgM92gHd3ghWNsmzDTrCEwNC5VyOMcGBTZuhJyTHCll8NfqQN6OuBdPF/gY2dENf2CIIg7CDBQox4GGNKTknnEaC3CxgdoWDx2/RhsYaEDqrelfIqsBnHKmGjnFxgrB5+YWUVwNgJwP7d4Ns2g51sKRkWIaG8fKWsOUxpMz9sM5lhCA9LomAeL1zf/N+k7oMgCILmEiIIABCemGgqhdSQEDN6WAb6wdsOgathGd6o9F9B7Viw6jFg//VDSDf8WKnEMcCOmaesv+0d03I+NKhMTQAAFUr7ft4XxsPSZudhSa5gIQiCSAXkYSEIQG8y19OFiBvSG5Ju4VXzXnq6IP/PCqX5WlmFFjYSk/1Jx59iuyl2zDylcdtHW8F9Q2BCAImSZpcbKCsH9n8WvnmcWjJtggQLQRBZAHlYCAJQQkLAsJVCvKtDbw5nTLqtrAFb+GWgaozyPBBQqnTUuZBY/aTw+x87ESgpU7wpOz7Ul/eo+StFxWB5amVQuJCQtXsvYD/5IUEQRIZBZzKCgJKcy4Gw7fn5h5sh33e7IgCmzNIFhNsDxhjYZf+fsp4sK91h25rBWw8BDMAwvWMYY4qX5bUXwbe9AzbrC8oLIuG2cBSQp3bujSTpljE9mZY8LARBZAHkYSEIQAsJhfKwcJ8P8l//oDRuGxoCGt4Df/cN5UWLIGCSBFZWDjZlJqSTF0Oav9hUVh0KLY/l/XeUyiUAXAioomIl6RYI6WHhsqyHhAxJvSRYCILIBkiwEASgh4RCJN3yjc8qIZ5RpWAXXWN+MVH9RqbOVnJhOg4rFUM7PwLf/G8AUEqdh/OwdB1RKpckCWzyjMSPjyAIIo3QmYwgAKCoBADAu44EvcS7O8GffQIAwM79GtjU2eBP/FFfIUEeDObxAjOOBba+BfkPdwItTfqL1XWah4WHymERFUKl5Urb/wSPjyAIIp2Qh4UgADAx745N0ip/+lElDDN2AthJpynVP6NK9RUSKAjYMScoD1qalGZzJ3wRbMX3wZZeOKyHhYv8ldGVYBXVSRkfQRBEuiAPC0EAQIUqWNpbwf1+rU8K/3wP+BsvAQCki1bouSjjpwDvv608TmDIhc0+HjwnD2CAdO33tLwWAEBevpIYHMrDogoWNroSqKzRl5NgIQgiCyDBQhAAUFyqNH/zDSkzD1fWgHMOee0fAS6DfeFkpY29CptwNLgmWBLoYSkqhvTT+wCPF6y4xPzicGXNBg8LRleCLVgC5OTQnD4EQWQFdCYjCCiVPSivApo+V5JrK2sw8Pbr4Ns/UMqWz7/SvP74KdBm4EmwIGCjK+1fyA8dEuKcg+/8SHlSPUYpk/7aNxI6LoIgiHRCOSwEIVDzWHhbM7jfh44/3gsAYF/6qjknBACMjeCGaTaXMDQPS79W9qzx+R6g+YAirmYfn5rxEARBpBASLAShoomS1kPg/3oO/sbPgeISsKUXBK+bm68/iaDHSkIQSbdcBgb7TS/xd15THhxzvN7QjiAIIougkBBBCETibWsz5K3/AQBI51xuFicGpO/cAr75TbBTz0zN+Lw5ijiSZaCvF1DHxWUZ/B2liZ00b0FqxkIQBJFiSLAQhAorrwYHwHd9DHQeASQX2PGnhl5/5hfAZn4hdeNjTMlj6emG/KNrgYJCpWV/Tq6SKJyXD8yam7LxEARBpBIKCRGEQISEOpXmcd5psxwXXtEEFOdKV97mA8C+Xcprc0/RZ3kmCILIMsjDQhAC0TxOJffYExF6XuT0IF16Pfjya5VE354uZXLEni7woSGwOSeke3gEQRBJgwQLQaiwnFyguATo6gDgTMECQOmrMqrU1G2XpXE8BEEQqYBCQgRhRISF8gvgnTwtvWMhCIIgNEiwEIQBMacQmzYHzOVK82gIgiAIAQkWgjDATlgIlFVAWnxWuodCEARBGIgph+XFF1/Ehg0b0NHRgXHjxuHqq6/GpEmTbNd9++23sX79ejQ3NyMQCKC6uhpnnXUWFizQ+0VwzrF27Vq88sor6O3txdSpU3HttdeipqbGdpsEkSzYrC/AtfqPSgkxQRAE4RiiFiybNm3CmjVrsGLFCkyePBnPPfccVq1ahXvvvRejRo0KWr+wsBDnnXceamtr4Xa7sWXLFvzmN79BcXEx5syZAwB45pln8MILL+CGG25AZWUlnnjiCaxatQp33303vF4q0yQIgiCIkU7UIaFnn30WixcvxqJFi1BXV4cVK1bA6/Vi48aNtuvPmDED8+bNQ11dHaqrq7F06VKMGzcOO3bsAKB4V55//nmcd955OP744zFu3Dh885vfxJEjR/Duu+/GZx1BEARBEFlBVB4Wv9+P3bt345xzztGWSZKEWbNmYefOncO+n3OOhoYGNDY24rLLLgMAtLS0oKOjA7Nnz9bWy8/Px6RJk7Bz506cfPLJQdvx+Xzw+Xzac8YY8vLytMdOQozHaeOKl2y1S0D2ZSbZapcgW+3LVrsEZF9iiEqwdHV1QZZllJSUmJaXlJSgsbEx5Pv6+vpw3XXXwe/3Q5IkXHPNNZpA6ejoAICgcNKoUaO016ysX78e69at056PHz8eq1evRkVFRTTmpJTq6urhV8pAstUuAdmXmWSrXYJstS9b7RKQffGRksZxubm5uOuuuzAwMIAPP/wQa9asQVVVFWbMmBHT9s4991wsW7ZMey5UXWtrK/x+f0LGnCgYY6iurkZzczM45+keTsLIVrsEZF9mkq12CbLVvmy1S0D2hcbtdkfsbIhKsBQXF0OSpCDPR0dHR5DXxYgkSZryqq+vx8GDB/H0009jxowZ2vs6OztRWqp37uzs7ER9fb3t9jweDzwej+1rTj0YOOeOHVs8ZKtdArIvM8lWuwTZal+22iUg++IjqqRbt9uNCRMmoKGhQVsmyzIaGhowZcqUiLcjy7KWg1JZWYmSkhJ8+OGH2ut9fX3YtWtXVNskCIIgCCJ7iToktGzZMjzwwAOYMGECJk2ahOeffx6Dg4NYuHAhAOD+++9HWVkZLr30UgBKvsnEiRNRVVUFn8+HrVu34o033sC1114LQHElLV26FE899RRqampQWVmJxx9/HKWlpTj++OMTZylBEARBEBlL1IJl/vz56Orqwtq1a9HR0YH6+nqsXLlSC+20tbWZMoUHBwfx0EMP4fDhw/B6vRgzZgy+9a1vYf78+do6X/3qVzE4OIjf//736Ovrw9SpU7Fy5UrqwUIQBEEQBACA8SwKqLW2tprKnZ0AYww1NTVoamrKqthlttolIPsyk2y1S5Ct9mWrXQKyLzQejyfipFuaS4ggCIIgCMdDgoUgCIIgCMeTkj4sqcLtdq45Th5bPGSrXQKyLzPJVrsE2WpfttolIPvie09W5bAQBEEQBJGdUEgoyfT39+Omm25Cf39/uoeSULLVLgHZl5lkq12CbLUvW+0SkH2JgQRLkuGcY8+ePVmXGZ6tdgnIvswkW+0SZKt92WqXgOxLDCRYCIIgCIJwPCRYCIIgCIJwPCRYkozH48EFF1wQcrLGTCVb7RKQfZlJttolyFb7stUuAdmXGKhKiCAIgiAIx0MeFoIgCIIgHA8JFoIgCIIgHA8JFoIgCIIgHA8JFoIgCIIgHA8JFiIkAwMD6R4CESPZmkufrXZlO/S9ZTZO+f5IsMRBS0sLHnzwQbz//vvpHkpCaW1txapVq/CXv/wFACDLcppHlFg6Ojrw2Wefob29Pd1DSQo9PT0msemUk028dHV1oaurSzses8UuQSAQAJB9v7e+vj4MDAxo3xd9b5mFk76/7J46Mok89thjeO655/CFL3wBQ0ND4JyDMZbuYcUF5xwPPvggNm7cCK/Xi/b2dsiyDEnKHl37pz/9CW+++SbKysrQ1taG//7v/8bs2bPTPayE8ac//Qlbt27F6NGjMXr0aFx++eUoLS1N97Di5qGHHsI777yDUaNGobi4GCtWrEB1dXW6h5UwHn74YTQ2NuLHP/5x1vzeOOf485//jI8++gi5ubmorKzEtddei7y8vKw4XwLZ+b0JnPj9UR+WGGhoaMATTzyB888/H3PmzEn3cBLCs88+iyeffBJjxozB9ddfj48//hj/+te/8D//8z9ZccEbGhrCb37zGxw+fBhXXnkl8vPz8dhjj6GtrQ0///nP0z28uBkYGMC9996L3t5eXHLJJWhubsbGjRsxNDSEG264AWPHjk33EGNmzZo1+Oijj3DllVeira0Nr7zyCnp7e3HNNddg2rRp6R5eXBw4cACPPPIIDhw4gLa2Nnzzm9/EqaeemvE3Cjt37sSDDz4Ir9eL888/H7t378abb76JcePG4bvf/W7G25et35vAqd8feVhi4NVXX0VVVRXmzJmDnTt3YsuWLaiqqsLUqVNRU1OT7uFFTVNTE9599118/etfx8KFCwEoYYV9+/aZ3O+ZfEfU3NyMvXv34oorrsCkSZMAACeffDJefvll+P1+uN2Z/VPYu3cvWlpa8O1vfxv19fWYPn065syZgxtuuAEvvPACLrzwQpSVlaV7mFHBOcfQ0BC2b9+OuXPnYvr06QCAE088ETfffDNefvlllJaWZrSn5eDBgygtLcVZZ52FzZs345FHHsFJJ52U0cejLMt45513UFdXh+uuuw65ubk47rjjUFtbi8ceewwdHR0oKSlJ9zDjIhu/N4GTv7/Ml4IpRJZlDA4O4siRI5g9ezaeffZZ3HXXXdi/fz+eeuop3HbbbXjrrbfSPcyoqaiowK233qqJFc45CgoKUFlZiY8++ggAMlqsAMp319TUpJ1QBgYGsGHDBowePRqvvvpqxicYd3V1obW1FfX19aZlhYWFaGho0L7HTIIxht7eXhw+fBjjx48HAPj9fni9XpxzzjnYv38/tmzZkuZRxoa4EZgxYwaWLVuGmTNnYunSpWCMYe3ataZ1Mg1JkjBz5kx86UtfQm5urrZ8aGgIXq8Xubm5GZfHYv0upk+fnlXfm3XMTv3+Ml8OJpH169ejs7MTY8aMwaJFi+B2u5GTkwMA2LhxI8rLy/Gd73wH06ZNg8vlwp133omNGzeiurradOFwGnZ2AdDcfIwxFBcXw+/3w+fzAcgsD4udffX19ZgzZw5+//vfo66uDtu2bcP06dNRUFCAJ554Alu2bMH555+PiRMnpnv4w2JnX1lZGcrKyvDEE0/goosuAgD885//xCmnnIJt27Zh69atOPXUUx39Pb799tuYNWsW8vPzASjHXFlZGSoqKrBp0ybMnTtXG/tJJ52EN954Ax999BFOOeUUFBcXp3PoEWG0T7jTCwsLUVhYCAAoLy/HueeeizVr1uCMM85AeXm5o78vgfV7A2AKlYvzSnd3NwoKCpCTk+N4m4ysW7cOLS0tqKysxJlnnomioiLtD8jc701gZ59Tvz/ysNjQ2NiIG2+8EW+++SY6Ojrw2GOPYdWqVdi5cycA4LTTTsOOHTvQ0NCA2tpauFwuAMAFF1yAvXv3oru7O53DD0kouz799FMA0E6isiyjtLQUFRUV2LFjRzqHHBWh7Pvkk08AAN/73vdw8803Y2hoCOeddx5uvvlmXHXVVbjtttvw+eef4/PPP0+zBeGxs+9nP/sZ9u7diwkTJuDMM8/EU089hZtvvhlXXnkltm3bhuXLl+OrX/0qtm7dCsCZnrKPPvoI3/3ud3H33Xdj06ZNQa8vXrwY//nPf9DU1ASXy4WhoSEAwJIlS/D+++/D7/eneshRMZx9AkmSMH/+fIwbNw4PP/wwAGd+X4JI7RJs374dU6dOBWMsIzwsbW1tuOmmm/DWW28hJycHL730Eu644w7Niy5syLTvTTCcfVavixO+PxIsNmzZsgX5+flYvXo1vvvd7+Kee+5BT08Pnn32WbS1tWHmzJmYMWMGXC6XKcdj/Pjx8Pl8aGtrS7MF9oSzq7m5GYCupv1+P2pqatDV1YWBgYGM+AGGsu/5559Hc3MzvF4vfD4f2tvbsWjRIgCKvTU1NRgaGkJLS0uaLQiPnX19fX146qmn0NbWhqVLl+KWW27BKaecgu985zv49a9/jby8PPT396OqqsqRQvrAgQN4+eWXMWvWLCxevBhPPfUUjhw5AkA/6c+cOROTJ0/GQw89BADwer0AlFCmx+NBY2NjegYfAeHss6O4uBgXXHABNm/ejI8//hgA8MEHHzjOxmjskiQJQ0ND2Lt3r1aRxxjDgQMHUjnkqGloaADnHLfddhuuueYa/PrXv0ZpaSmef/557N27F4wxraQ5U743I8PZJ0mSdj1wyvdHgsVCIBDA559/juLiYs3jUFJSgvPOOw+HDx/GP//5T4waNQrLli1DZ2cnXnjhBbS1tYExhq1bt6K6uhqzZs1KsxXBhLOrra0N//rXvwBAO0jdbjeKiorQ0dGRETHnSO3Ly8tDS0sLDh06BECx94MPPkBJSQmOOeaYtI1/OCI5LgEltn7mmWfiuOOOA6AIsk8++QRjx47VXNhOorCwELNnz8aZZ56Jr33ta5BlGRs2bDCtU1FRgXPPPRc7duzA3//+d3R1dQFQ7vBramocHcaLxD4rs2bNwkknnYQHHngAP/7xj3HXXXehr68vRSOOjGjt2r59OxhjOProo3HgwAH89Kc/xY9+9CN0dHSkbtBR0traCpfLpaUB5ObmYtmyZfB4PHjmmWcAAC6XSzs3ZsL3ZiQS+8S5xinfHwkWCy6XCz6fDz6fD5xzzYNy0kknYcKECfjkk0+wb98+zJkzB1//+tfx73//G7fddht++ctf4t5778WsWbMcWY0xnF27du3Cnj17AMD0A9y7dy+am5sd72EZzr5PP/0U+/btQ2lpKRYsWIBVq1bh97//PX7729/i7rvvxqxZszB58uQ0WxGaaL4/QKn8am5uxkMPPYQdO3ZgwYIFAJzXtKukpAQLFy5EXV0d8vLycNFFF+Ef//gH9u7dq63DGMOxxx6Lq6++Ghs2bMAtt9yCu+++Gw8//DCOP/54RwvqSOyz0t7ejp6eHrS1teGoo47Cgw8+qFW2OYVI7RLfy/79+1FSUoInnngC3//+91FaWooHH3zQ0dVCPp8PLpcLnZ2d2jJRfXfw4EFs27YNgG5jJnxvRiK1D3DO90eCxYC4CCxevBjbtm3D/v37IUmS5vY76aST0NbWhoMHDwJQcll++MMf4uyzz0Z1dTV+9rOf4ZJLLnFcHX6kdomwkMjJ6e/vx6JFi1BQUODYCwIQuX0iB+Laa6/FWWedBVmW4fP5cNttt+Hyyy933PcmiPb7A4APP/wQ/+///T/s27cPP/rRjzBz5kwAzoytS5KkHV+LFi1CfX091q5dq9knWLx4Mb7//e/jjDPOQFlZGVatWoXzzjsPjDFH2iWI1D5AyVP61a9+hSNHjuAXv/gFrr/+euTl5aV6yBERiV3ie9myZQt27dqFXbt24Y477sC3v/1tx9olfm9f/OIX8emnn2LXrl2m12fNmgWPx4Pdu3cDUD6HTPreorUPALZu3eqI72/EVQnt378fvb29tg2nxI9v8uTJmDZtGh555BHcfPPN2oVM9IEwxiUnTpzoCJd0vHZxzjUhJuKWJ5xwAk488cTUGRGGRHxvIubq8XhwySWXOKrJUyK/PwCYP3++I47NcHYFAgFNHItEPsYYLr/8ctx6663YunUr5s6dC1mW0dPTg+LiYhx99NE4+uijU21GSBJtX0lJCa677rq0Vxkm2q7FixfjK1/5CubOnZtqU2xpamrC9u3bMWfOnCCPuPi9jRkzBieccAL+9re/YerUqVolmvhujFN7lJaWOuJ7EyTSPlmWsXjxYixdujTt358zztYpwO/343e/+x1+8IMfoKGhwfSaUJwiibavrw/Lly/Hxx9/jJdeekn7gnt6epCbm6uVITqBZNglLoROuGtN5vfmBLGSLPsKCwvTKlYitSsQCGhxcHG8TZs2DSeffDLWrVuneYqef/55R1UDJcM+n8+H/Pz8tF70kmFXIBDAKaeckvaLHaCIrQcffBDf//73sWvXLlMOhtE+v9+P5uZmXHHFFTh48CCee+45LR8lEAjA7Xabfm95eXmOECvJsE+SJJx88smO+P7Sf8ZOAS+++CK+/vWv4+DBg1i9ejUuvPBC0+viwvX888/j8ssvx/vvv4/p06fjwgsvxJNPPok//OEP2L59O/72t7+hv7/fMUm12WqXgOzLTPuiseuKK67A+++/HxRyXLJkCfbs2YPbb78dALBs2TLHdBFNln0ejyc1BoQgWXYJb4wTeOKJJ7B//3789Kc/xX/9139hwoQJABSvg9G+r3/963j77bdRXl6Oq666Cv/5z39wzz33YPPmzfjLX/6C5uZmLbHdSWS7fVk/l1BjYyN+8IMfYO7cufjv//5vAEqb9vz8fOTn58PtdmNwcBC//e1vsX37dlx66aVYsGCBdtfwwgsv4K233kJvby8YY7juuusckUiVrXYJyL7MtC9auy677DKceuqpml2yLOONN97A7373O0yYMAHXXnut1uXWCWSrfdlql4Bzjq6uLtxxxx248MILMXfuXHz22Wc4dOgQjjrqKFRWViInJwe/+93v8N577+FrX/saTjnlFO0i/9577+Gll15Cb28vAoEArr76akcl6We7fYKsFyw+nw9PP/00/vnPf+InP/kJnnzySezduxecc1RXV+Oss87CzJkzsWvXLtTW1mrdGo35DbIso62tDZWVlek0xUS22iUg+zLTvljtEgwODuKVV16B1+vF6aefniYrQpOt9mWrXYDepXv37t244447cN999+HRRx/F5s2bMWrUKHR0dGD69On4zne+g8bGRpSUlNj+3gA4ch6kbLfPSNYJlrfeegv5+fk4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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "vol_data.timeseries.plot()" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "b89b0989", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Dividend Type from Config: DivType.DISCRETE\n", + "Dividend Type from Dividend DataManager: DivType.DISCRETE\n", + "Dividend Type from Dividend Data: DivType.DISCRETE\n", + "\n", + "\n", + "Dividend Type from ForwardDataManager: DivType.DISCRETE\n", + "Dividend Type from Forward Data: DivType.DISCRETE\n", + "\n", + "\n", + "Dividend Type from SpotDataManager: DivType.DISCRETE\n", + "\n", + "\n", + "Dividend Type from OptionSpotDataManager: DivType.DISCRETE\n", + "\n", + "\n", + "Dividend Type from VolDataManager: DivType.DISCRETE\n", + "Dividend Type from Vol Data: DivType.DISCRETE\n" + ] + } + ], + "source": [ + "print(f\"Dividend Type from Config: {BaseDataManager.CONFIG.dividend_type}\")\n", + "print(f\"Dividend Type from Dividend DataManager: {div_dm.CONFIG.dividend_type}\")\n", + "print(f\"Dividend Type from Dividend Data: {div_data.dividend_type}\")\n", + "print(\"\\n\")\n", + "print(f\"Dividend Type from ForwardDataManager: {fwd_dm.CONFIG.dividend_type}\")\n", + "print(f\"Dividend Type from Forward Data: {fwd_data.dividend_type}\")\n", + "print(\"\\n\")\n", + "print(f\"Dividend Type from SpotDataManager: {spot_dm.CONFIG.dividend_type}\")\n", + "print(\"\\n\")\n", + "print(f\"Dividend Type from OptionSpotDataManager: {option_spot_dm.CONFIG.dividend_type}\")\n", + "print(\"\\n\")\n", + "print(f\"Dividend Type from VolDataManager: {vol_dm.CONFIG.dividend_type}\")\n", + "print(f\"Dividend Type from Vol Data: {vol_data.dividend_type}\")\n", + "# div_data.dividend_type\n" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "501eeeff", + "metadata": {}, + "outputs": [], + "source": [ + "assert_synchronized_model(\n", + " symbol=symbol,\n", + " undo_adjust=undo_adjust,\n", + " dividend_type=div,\n", + " spot = spot_data,\n", + " dividend = div_data,\n", + " forward = fwd_data,\n", + " option_spot = option_spot_data,\n", + " vol = vol_data,\n", + " greek= greek_data,\n", + " market_model=market_model,\n", + " vol_model=vol_model,\n", + " require_anchor=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "a6d7a6c9", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "datetime\n", + "2025-05-23 0.336226\n", + "2025-05-27 0.334374\n", + "2025-05-28 0.325076\n", + "2025-05-29 0.348844\n", + "2025-05-30 0.351742\n", + " ... \n", + "2026-01-22 0.369853\n", + "2026-01-23 0.335153\n", + "2026-01-26 0.340872\n", + "2026-01-27 0.336315\n", + "2026-01-28 0.352491\n", + "Length: 171, dtype: float64" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "vol_data.timeseries#.plot()" + ] + }, + { + "cell_type": "markdown", + "id": "6ec3185f", + "metadata": { + "vscode": { + "languageId": "bat" + } + }, + "source": [ + "## TEST 3: Load all" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "69a7b749", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2026-02-01 01:09:12 [test] trade.datamanager.base INFO: Clearing cache for DividendDataManager (CACHE_NAME='dividend_data_manager')\n", + "2026-02-01 01:09:12 [test] trade.datamanager.base INFO: Clearing cache for RatesDataManager (CACHE_NAME='rates_data_manager')\n", + "2026-02-01 01:09:12 [test] trade.datamanager.base INFO: Clearing cache for ForwardDataManager (CACHE_NAME='forward_data_manager')\n", + "2026-02-01 01:09:12 [test] trade.datamanager.base INFO: Clearing cache for OptionSpotDataManager (CACHE_NAME='option_spot_manager')\n", + "2026-02-01 01:09:12 [test] trade.datamanager.base INFO: Clearing cache for SpotDataManager (CACHE_NAME='spot_data_manager')\n", + "2026-02-01 01:09:12 [test] trade.datamanager.base INFO: Clearing cache for VolDataManager (CACHE_NAME='vol_data_manager_cache')\n", + "2026-02-01 01:09:12 [test] trade.datamanager.base INFO: Clearing cache for GreekDataManager (CACHE_NAME='greek_datamanager_cache')\n", + "2026-02-01 01:09:12 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-01 01:09:12 [test] trade.datamanager.dividend INFO: Using provided dividend_type: DivType.CONTINUOUS\n", + "2026-02-01 01:09:12 [test] EventDriven.riskmanager.market_data WARNING: End date 2026-02-01 01:08:10.925009 is today or in the future and current time is before market close. Forcing preload check.\n", + "2026-02-01 01:09:12 [test] EventDriven.riskmanager.market_data INFO: Sanitizing today's data from all stored timeseries data...\n", + "2026-02-01 01:09:13 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-01 01:09:13 [test] EventDriven.riskmanager.market_data WARNING: End date 2026-01-28 00:00:00 is in the past or current time is after market close. Preload check will be skipped if specified.\n", + "2026-02-01 01:09:13 [test] EventDriven.riskmanager.market_data INFO: Sanitizing today's data from all stored timeseries data...\n", + "2026-02-01 01:09:13 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-01 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-01 01:09:13 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-01 01:09:13 [test] EventDriven.riskmanager.market_data WARNING: End date 2026-02-01 01:08:10.925009 is today or in the future and current time is before market close. Forcing preload check.\n", + "2026-02-01 01:09:13 [test] EventDriven.riskmanager.market_data INFO: Sanitizing today's data from all stored timeseries data...\n", + "2026-02-01 01:09:14 [test] trade.datamanager.rates INFO: No cache found for risk-free rate timeseries key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D. Fetching from source.\n", + "2026-02-01 01:09:17 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D to avoid saving partial day data.\n", + "2026-02-01 01:09:17 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-01 to 2026-01-28...\n", + "2026-02-01 01:09:17 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:SBUX|interval:eod|artifact_type:forward|series_id:hist|dividend_type:CONTINUOUS|maturity:2026-09-18|use_chain_spot:1 to avoid saving partial day data.\n", + "2026-02-01 01:09:17 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-01 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-01 01:09:17 [test] trade.datamanager.utils INFO: Using cached date range for 2025-01-01 00:00:00 - 2026-01-28 00:00:00 and option tick SBUX20260918C100\n", + "2026-02-01 01:09:17 [test] trade.datamanager.option_spot INFO: No cache found for option spot timeseries key: symbol:SBUX|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:EOD|expiration:20260918T000000|right:C|strike:100. Fetching from source.\n", + "2026-02-01 01:09:22 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:SBUX|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:EOD|expiration:20260918T000000|right:C|strike:100 to avoid saving partial day data.\n", + "2026-02-01 01:09:22 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-05-23 to 2026-01-28...\n", + "2026-02-01 01:09:22 [test] trade.datamanager.vol INFO: VolDm Using specified dividend type: DivType.CONTINUOUS\n", + "2026-02-01 01:09:22 [test] trade.datamanager.vol INFO: VolDm Using model price: ModelPrice.ASK\n", + "2026-02-01 01:09:22 [test] trade.datamanager.utils INFO: Using cached date range for 2025-01-01 00:00:00 - 2026-01-28 00:00:00 and option tick SBUX20260918C100\n", + "2026-02-01 01:09:22 [test] trade.datamanager.utils INFO: No cache found for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:continuous|endpoint_source:eod|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market. Fetching from source.\n", + "2026-02-01 01:09:22 [test] trade.datamanager.rates INFO: Cache hit for risk-free rate timeseries key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-01 01:09:22 [test] trade.datamanager.rates INFO: Cache fully covers requested date range for risk-free rate timeseries. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-01 01:09:22 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-05-23 to 2026-01-28...\n", + "2026-02-01 01:09:23 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:continuous|endpoint_source:eod|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market to avoid saving partial day data.\n", + "2026-02-01 01:09:23 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-05-23 to 2026-01-28...\n", + "2026-02-01 01:09:23 [test] trade.datamanager.utils INFO: Using cached date range for 2025-01-01 00:00:00 - 2026-01-28 00:00:00 and option tick SBUX20260918C100\n", + "2026-02-01 01:09:23 [test] trade.datamanager.utils INFO: No cache found for key: symbol:SBUX|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:continuous|endpoint_source:eod|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market. Fetching from source.\n", + "2026-02-01 01:09:23 [test] trade.datamanager.rates INFO: Cache hit for risk-free rate timeseries key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-01 01:09:23 [test] trade.datamanager.rates INFO: Cache fully covers requested date range for risk-free rate timeseries. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-01 01:09:23 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-05-23 to 2026-01-28...\n", + "2026-02-01 01:09:23 [test] trade.datamanager.vol INFO: VolDm Using specified dividend type: DivType.CONTINUOUS\n", + "2026-02-01 01:09:23 [test] trade.datamanager.vol INFO: VolDm Using model price: ModelPrice.ASK\n", + "2026-02-01 01:09:23 [test] trade.datamanager.utils INFO: Using cached date range for 2025-05-23 00:00:00 - 2026-01-28 00:00:00 and option tick SBUX20260918C100\n", + "2026-02-01 01:09:23 [test] trade.datamanager.utils INFO: No cache found for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market. Fetching from source.\n", + "2026-02-01 01:09:23 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-01 01:09:23 [test] trade.datamanager.dividend INFO: Using provided dividend_type: DivType.CONTINUOUS\n", + "2026-02-01 01:09:23 [test] EventDriven.riskmanager.market_data WARNING: End date 2026-02-01 01:08:10.925009 is today or in the future and current time is before market close. Forcing preload check.\n", + "2026-02-01 01:09:24 [test] EventDriven.riskmanager.market_data INFO: Sanitizing today's data from all stored timeseries data...\n", + "2026-02-01 01:09:24 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-01 01:09:24 [test] EventDriven.riskmanager.market_data WARNING: End date 2026-01-28 00:00:00 is in the past or current time is after market close. Preload check will be skipped if specified.\n", + "2026-02-01 01:09:24 [test] EventDriven.riskmanager.market_data INFO: Sanitizing today's data from all stored timeseries data...\n", + "2026-02-01 01:09:25 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-05-23 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-01 01:09:25 [test] trade.datamanager.utils INFO: Using cached date range for 2025-05-23 00:00:00 - 2026-01-28 00:00:00 and option tick SBUX20260918C100\n", + "2026-02-01 01:09:25 [test] trade.datamanager.option_spot INFO: No cache found for option spot timeseries key: symbol:SBUX|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:QUOTE|expiration:20260918T000000|right:C|strike:100. Fetching from source.\n", + "2026-02-01 01:09:25 [test] trade.datamanager.option_spot INFO: Fetching option spot data from Thetadata Quote endpoint for SBUX from 2025-05-23 00:00:00 to 2026-01-28 00:00:00.\n", + "2026-02-01 01:10:03 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:SBUX|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:QUOTE|expiration:20260918T000000|right:C|strike:100 to avoid saving partial day data.\n", + "2026-02-01 01:10:03 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-05-23 to 2026-01-28...\n", + "2026-02-01 01:10:04 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market to avoid saving partial day data.\n", + "2026-02-01 01:10:04 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-05-23 to 2026-01-28...\n", + "2026-02-01 01:10:05 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:SBUX|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:continuous|endpoint_source:eod|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market to avoid saving partial day data.\n", + "2026-02-01 01:10:05 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-05-23 to 2026-01-28...\n" + ] + } + ], + "source": [ + "from trade.datamanager.utils.model import LoadRequest, _load_model_data_timeseries\n", + "from trade.helpers.decorators import cProfiler\n", + "from trade.helpers.helper import print_top_cprofile_stats, print_cprofile_internal_time_share\n", + "\n", + "request = LoadRequest(\n", + " symbol=symbol,\n", + " start_date=ts_start,\n", + " end_date=ts_end,\n", + " expiration=expiration,\n", + " strike=strike,\n", + " right=right,\n", + " series_id=SeriesId.HIST,\n", + " dividend_type=DivType.CONTINUOUS,\n", + " endpoint_source=OptionSpotEndpointSource.EOD,\n", + " vol_model=VolatilityModel.MARKET,\n", + " market_model=OptionPricingModel.BINOMIAL,\n", + " model_price=ModelPrice.ASK,\n", + " load_spot=True,\n", + " load_dividend=True,\n", + " load_forward=True,\n", + " load_option_spot=True,\n", + " load_vol=True,\n", + " load_greek=True,\n", + " undo_adjust=True,\n", + ")\n", + "\n", + "f = cProfiler(_load_model_data_timeseries)\n", + "res, stats = f(request)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "b7e56aa1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Function CumTime RatioToTop\n", + "------------------------------------------------------------------------------------------------------------------------------------------------------\n", + "/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/datamanager/utils/model.py:315 _load_model_data_timeseries 53.0695 1.00\n", + "/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/datamanager/option_spot.py:213 get_option_spot_timeseries 43.3073 0.82\n", + "/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/datamanager/option_spot.py:378 _query_thetadata_api 43.1941 0.81\n", + "/Users/chiemelienwanisobi/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData/v2.py:414 request_from_proxy 42.6873 0.80\n", + "/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/requests/api.py:14 request 42.6871 0.80\n", + "/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/requests/sessions.py:500 request 42.6857 0.80\n", + "/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/requests/sessions.py:673 send 42.6663 0.80\n", + "/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/socket.py:704 readinto 42.5731 0.80\n", + "~:0 42.5697 0.80\n", + "/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/datamanager/greeks.py:158 get_greeks_timeseries 41.9619 0.79\n", + "/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/datamanager/greeks.py:314 _get_binomial_greeks 41.9428 0.79\n", + "/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/datamanager/vol.py:633 get_implied_volatility_timeseries 41.3872 0.78\n", + "/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/datamanager/vol.py:307 _get_crr_implied_volatility_timeseries 41.3167 0.78\n", + "/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/requests/adapters.py:613 send 40.3505 0.76\n", + "/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/urllib3/connectionpool.py:535 urlope... 40.3484 0.76\n", + "/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/urllib3/connectionpool.py:379 _make_... 40.3472 0.76\n", + "/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/http/client.py:1351 getresponse 40.2820 0.76\n", + "/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/http/client.py:318 begin 40.2818 0.76\n", + "/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/http/client.py:285 _read_status 40.2809 0.76\n", + "~:0 40.2809 0.76\n" + ] + } + ], + "source": [ + "print_top_cprofile_stats(stats, top_n=20, full_name=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "8ed3dcce", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'date_range_packet': 0.0004010200500488281,\n", + " 'dividend_load_time': 0.6139051914215088,\n", + " 'spot_load_time': 0.31241703033447266,\n", + " 'forward_load_time': 4.112335920333862,\n", + " 'option_spot_load_time': 5.0142059326171875,\n", + " 'vol_load_time': 0.9962790012359619,\n", + " 'greek_load_time': 41.98507881164551}" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "res.time_to_load" + ] + }, + { + "cell_type": "markdown", + "id": "cbbc8fa8", + "metadata": {}, + "source": [ + "## Scenarios Calc" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "46e91b06", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2026-02-01 01:16:29 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-01 01:16:29 [test] trade.datamanager.dividend INFO: Using provided dividend_type: DivType.DISCRETE\n", + "2026-02-01 01:16:29 [test] trade.datamanager.dividend INFO: Fetching discrete dividend schedule timeseries for SBUX from 2026-01-28 00:00:00 to 2026-01-28 00:00:00 with maturity 2026-09-18 00:00:00\n", + "2026-02-01 01:16:29 [test] trade.datamanager.dividend INFO: Cache hit for discrete schedule timeseries key: symbol:SBUX|interval:eod|artifact_type:divs|series_id:hist|current_state:SCHEDULE_TIMESERIES|lookback_years:1|maturity:2026-09-18|method:CONSTANT|undo_adjust:1\n", + "2026-02-01 01:16:29 [test] trade.datamanager.dividend INFO: Cache fully covers requested date range for timeseries. Key: symbol:SBUX|interval:eod|artifact_type:divs|series_id:hist|current_state:SCHEDULE_TIMESERIES|lookback_years:1|maturity:2026-09-18|method:CONSTANT|undo_adjust:1\n", + "2026-02-01 01:16:29 [test] trade.datamanager.rates INFO: Cache hit for risk-free rate timeseries key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-01 01:16:29 [test] trade.datamanager.rates INFO: Cache fully covers requested date range for risk-free rate timeseries. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-01 01:16:29 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-01-28 to 2026-01-28...\n", + "2026-02-01 01:16:29 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-01 01:16:29 [test] EventDriven.riskmanager.market_data WARNING: End date 2026-01-28 00:00:00 is in the past or current time is after market close. Preload check will be skipped if specified.\n", + "2026-02-01 01:16:29 [test] EventDriven.riskmanager.market_data INFO: Sanitizing today's data from all stored timeseries data...\n", + "2026-02-01 01:16:29 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-01-28 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-01 01:16:29 [test] trade.datamanager.utils INFO: Using cached date range for 2026-01-28 00:00:00 - 2026-01-28 00:00:00 and option tick SBUX20260918C100\n", + "2026-02-01 01:16:29 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: symbol:SBUX|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:QUOTE|expiration:20260918T000000|right:C|strike:100\n", + "2026-02-01 01:16:29 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-01-28 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-01 01:16:29 [test] trade.datamanager.option_spot INFO: Cache hit for option spot timeseries key: symbol:SBUX|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:QUOTE|expiration:20260918T000000|right:C|strike:100\n", + "2026-02-01 01:16:29 [test] trade.datamanager.vol INFO: VolDm Using specified dividend type: DivType.DISCRETE\n", + "2026-02-01 01:16:29 [test] trade.datamanager.vol INFO: VolDm Using model price: ModelPrice.ASK\n", + "2026-02-01 01:16:29 [test] trade.datamanager.utils INFO: Using cached date range for 2026-01-28 00:00:00 - 2026-01-28 00:00:00 and option tick SBUX20260918C100\n", + "2026-02-01 01:16:29 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market\n", + "2026-02-01 01:16:29 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-01-28 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-01 01:16:29 [test] trade.datamanager.utils INFO: Cache hit for vol timeseries key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market\n" + ] + } + ], + "source": [ + "bsm = calculate_scenarios(\n", + " symbol=symbol,\n", + " expiration=expiration,\n", + " right=right,\n", + " strike=strike,\n", + " as_of=ts_end,\n", + " return_pnl_in_pct=True,\n", + " return_pnl=True\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "33d3463f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
0.900.951.001.051.10
-0.02-0.508140-0.308790-0.0677240.2138100.532924
-0.01-0.480935-0.277803-0.0338340.2494030.568825
0.00-0.453823-0.2468920.0000040.2849720.604732
0.01-0.426531-0.2160530.0337900.3205160.640641
0.02-0.396147-0.1852820.0675290.3560350.676549
\n", + "
" + ], + "text/plain": [ + " 0.90 0.95 1.00 1.05 1.10\n", + "-0.02 -0.508140 -0.308790 -0.067724 0.213810 0.532924\n", + "-0.01 -0.480935 -0.277803 -0.033834 0.249403 0.568825\n", + " 0.00 -0.453823 -0.246892 0.000004 0.284972 0.604732\n", + " 0.01 -0.426531 -0.216053 0.033790 0.320516 0.640641\n", + " 0.02 -0.396147 -0.185282 0.067529 0.356035 0.676549" + ] + }, + "execution_count": 50, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bsm.grid" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "03a8cab7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2026-02-01 01:10:06 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-01 01:10:06 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-01 01:10:06 [test] trade.datamanager.dividend WARNING: Valuation date 2026-02-01 01:10:06.622074 is not a business day or holiday. No dividends available. Resolution: RealTimeFallbackOption.USE_LAST_AVAILABLE\n", + "2026-02-01 01:10:06 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-01 01:10:06 [test] trade.optionlib.assets.dividend INFO: Using dual projection method for ticker SBUX\n", + "2026-02-01 01:10:06 [test] trade.optionlib.assets.dividend INFO: Expected Dividend Size before adjustment: 11, for original valuation: 3. Size from historical divs: 8\n", + "2026-02-01 01:10:06 [test] trade.optionlib.assets.dividend INFO: Expected Dividend Size to be projected: 3\n", + "2026-02-01 01:10:06 [test] trade.optionlib.assets.dividend INFO: Projected Dividend List: [0.62, 0.62, 0.62]\n", + "2026-02-01 01:10:06 [test] trade.optionlib.assets.dividend INFO: Combined Dividend List: [0.57, 0.57, 0.57, 0.61, 0.61, 0.61, 0.61, 0.62, 0.62, 0.62, 0.62]\n", + "2026-02-01 01:10:06 [test] trade.optionlib.assets.dividend INFO: Combined Date List: [datetime.date(2024, 2, 8), datetime.date(2024, 5, 16), datetime.date(2024, 8, 16), datetime.date(2024, 11, 15), datetime.date(2025, 2, 14), datetime.date(2025, 5, 16), datetime.date(2025, 8, 15), datetime.date(2025, 11, 14), datetime.date(2026, 2, 14), datetime.date(2026, 5, 14), datetime.date(2026, 8, 14)]\n" + ] + }, + { + "data": { + "text/plain": [ + "2026-01-30 ((2026-02-14, 0.62), (2026-05-14, 0.62), (2026...\n", + "dtype: object" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "BaseDataManager.CONFIG.real_time_fallback_option = RealTimeFallbackOption.USE_LAST_AVAILABLE\n", + "div_dm.rt(\n", + " maturity_date=expiration,\n", + " undo_adjust=True,\n", + " fallback_option=None,\n", + " dividend_type=DivType.DISCRETE\n", + " ).daily_discrete_dividends" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "2b5aebd7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2026-02-01 01:10:06 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-01 01:10:06 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-01 01:10:06 [test] trade.datamanager.forward WARNING: Valuation date 2026-02-01 01:10:06.795244 is not a business day or holiday. No dividends available. Resolution: RealTimeFallbackOption.USE_LAST_AVAILABLE\n", + "2026-02-01 01:10:06 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-01 01:10:06 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-01 01:10:06 [test] trade.datamanager.dividend INFO: Using provided dividend_type: DivType.DISCRETE\n", + "2026-02-01 01:10:06 [test] trade.datamanager.dividend INFO: Fetching discrete dividend schedule timeseries for SBUX from 2026-01-30 to 2026-01-30 with maturity 2026-09-18\n", + "2026-02-01 01:10:06 [test] trade.datamanager.dividend INFO: No cache found for discrete schedule timeseries key: symbol:SBUX|interval:eod|artifact_type:divs|series_id:hist|current_state:SCHEDULE_TIMESERIES|lookback_years:1|maturity:2026-09-18|method:CONSTANT|undo_adjust:1. Building from scratch.\n", + "2026-02-01 01:10:06 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-01 01:10:06 [test] trade.optionlib.assets.dividend INFO: Using dual projection method for ticker SBUX\n", + "2026-02-01 01:10:06 [test] trade.optionlib.assets.dividend INFO: Expected Dividend Size before adjustment: 11, for original valuation: 3. Size from historical divs: 8\n", + "2026-02-01 01:10:06 [test] trade.optionlib.assets.dividend INFO: Expected Dividend Size to be projected: 3\n", + "2026-02-01 01:10:06 [test] trade.optionlib.assets.dividend INFO: Projected Dividend List: [0.62, 0.62, 0.62]\n", + "2026-02-01 01:10:06 [test] trade.optionlib.assets.dividend INFO: Combined Dividend List: [0.57, 0.57, 0.57, 0.61, 0.61, 0.61, 0.61, 0.62, 0.62, 0.62, 0.62]\n", + "2026-02-01 01:10:06 [test] trade.optionlib.assets.dividend INFO: Combined Date List: [datetime.date(2024, 2, 8), datetime.date(2024, 5, 16), datetime.date(2024, 8, 16), datetime.date(2024, 11, 15), datetime.date(2025, 2, 14), datetime.date(2025, 5, 16), datetime.date(2025, 8, 15), datetime.date(2025, 11, 14), datetime.date(2026, 2, 14), datetime.date(2026, 5, 14), datetime.date(2026, 8, 14)]\n", + "2026-02-01 01:10:06 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-01-30 to 2026-01-30...\n", + "2026-02-01 01:10:06 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:SBUX|interval:eod|artifact_type:divs|series_id:hist|current_state:SCHEDULE_TIMESERIES|lookback_years:1|maturity:2026-09-18|method:CONSTANT|undo_adjust:1 to avoid saving partial day data.\n", + "2026-02-01 01:10:06 [test] EventDriven.riskmanager.market_data WARNING: End date 2026-02-01 01:08:10.925009 is today or in the future and current time is before market close. Forcing preload check.\n", + "2026-02-01 01:10:07 [test] EventDriven.riskmanager.market_data INFO: Sanitizing today's data from all stored timeseries data...\n", + "2026-02-01 01:10:07 [test] trade.datamanager.rates INFO: Cache hit for risk-free rate timeseries key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-01 01:10:07 [test] trade.datamanager.rates INFO: Cache fully covers requested date range for risk-free rate timeseries. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-01 01:10:07 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-01-30 to 2026-01-30...\n", + "2026-02-01 01:10:07 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:SBUX|interval:eod|artifact_type:forward|series_id:hist|dividend_type:DISCRETE|maturity:2026-09-18|use_chain_spot:1 to avoid saving partial day data.\n", + "2026-02-01 01:10:08 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-01-30 to 2026-01-30...\n" + ] + }, + { + "data": { + "text/plain": [ + "datetime\n", + "2026-01-30 92.169198\n", + "dtype: float64" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fwd_dm.rt(\n", + " maturity_date=expiration,\n", + " dividend_type=DivType.DISCRETE,\n", + " dividend_result=None,\n", + " ).timeseries" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "9864175d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2026-02-01 01:10:08 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-01 01:10:08 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-01 01:10:08 [test] trade.datamanager.forward WARNING: Valuation date 2026-02-01 01:10:08.153362 is not a business day or holiday. No dividends available. Resolution: RealTimeFallbackOption.USE_LAST_AVAILABLE\n", + "2026-02-01 01:10:08 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-01 01:10:08 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-01 01:10:08 [test] trade.datamanager.dividend INFO: Using provided dividend_type: DivType.CONTINUOUS\n", + "2026-02-01 01:10:08 [test] EventDriven.riskmanager.market_data WARNING: End date 2026-02-01 01:08:10.925009 is today or in the future and current time is before market close. Forcing preload check.\n", + "2026-02-01 01:10:08 [test] EventDriven.riskmanager.market_data INFO: Sanitizing today's data from all stored timeseries data...\n", + "2026-02-01 01:10:08 [test] EventDriven.riskmanager.market_data WARNING: End date 2026-02-01 01:08:10.925009 is today or in the future and current time is before market close. Forcing preload check.\n", + "2026-02-01 01:10:09 [test] EventDriven.riskmanager.market_data INFO: Sanitizing today's data from all stored timeseries data...\n", + "2026-02-01 01:10:09 [test] trade.datamanager.rates INFO: Cache hit for risk-free rate timeseries key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-01 01:10:09 [test] trade.datamanager.rates INFO: Cache fully covers requested date range for risk-free rate timeseries. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-01 01:10:09 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-01-30 to 2026-01-30...\n", + "2026-02-01 01:10:09 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:SBUX|interval:eod|artifact_type:forward|series_id:hist|dividend_type:CONTINUOUS|maturity:2026-12-21|use_chain_spot:1 to avoid saving partial day data.\n", + "2026-02-01 01:10:09 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-01-30 to 2026-01-30...\n" + ] + }, + { + "data": { + "text/plain": [ + "datetime\n", + "2026-01-30 94.353327\n", + "dtype: float64" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fwd_dm.rt(\n", + " maturity_date=\"2026-12-21\",\n", + " dividend_type=DivType.CONTINUOUS,\n", + " dividend_result=None,\n", + " ).timeseries" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "7be51033", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
bid_sizebid_exchangebidbid_conditionask_sizeask_exchangeaskask_conditionmidpointweighted_midpoint
datetime
2026-01-3068495.55054046.3505.95.852941
\n", + "
" + ], + "text/plain": [ + " bid_size bid_exchange bid bid_condition ask_size \\\n", + "datetime \n", + "2026-01-30 684 9 5.5 50 540 \n", + "\n", + " ask_exchange ask ask_condition midpoint weighted_midpoint \n", + "datetime \n", + "2026-01-30 4 6.3 50 5.9 5.852941 " + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "option_spot_dm.rt(\n", + " expiration=expiration,\n", + " right=right,\n", + " strike=strike,\n", + ").timeseries" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "bda2c0fe", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2026-02-01 01:10:09 [test] trade.datamanager.vol WARNING: Valuation date 2026-02-01 00:00:00 is not a business day or holiday. Resolving using fallback options RealTimeFallbackOption.USE_LAST_AVAILABLE.\n", + "2026-02-01 01:10:09 [test] trade.datamanager.vol INFO: VolDm Using specified dividend type: DivType.DISCRETE\n", + "2026-02-01 01:10:09 [test] trade.datamanager.vol INFO: VolDm Using model price: ModelPrice.ASK\n", + "2026-02-01 01:10:09 [test] trade.datamanager.utils INFO: Using cached date range for 2026-01-30 00:00:00 - 2026-01-30 00:00:00 and option tick SBUX20260918C100\n", + "2026-02-01 01:10:09 [test] trade.datamanager.utils INFO: No cache found for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:2026-09-18|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market. Fetching from source.\n", + "2026-02-01 01:10:09 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-01 01:10:09 [test] trade.datamanager.dividend INFO: Using provided dividend_type: DivType.DISCRETE\n", + "2026-02-01 01:10:09 [test] trade.datamanager.dividend INFO: Fetching discrete dividend schedule timeseries for SBUX from 2026-01-30 00:00:00 to 2026-01-30 00:00:00 with maturity 2026-09-18 00:00:00\n", + "2026-02-01 01:10:09 [test] trade.datamanager.dividend INFO: Cache hit for discrete schedule timeseries key: symbol:SBUX|interval:eod|artifact_type:divs|series_id:hist|current_state:SCHEDULE_TIMESERIES|lookback_years:1|maturity:2026-09-18|method:CONSTANT|undo_adjust:1\n", + "2026-02-01 01:10:09 [test] trade.datamanager.dividend INFO: Cache fully covers requested date range for timeseries. Key: symbol:SBUX|interval:eod|artifact_type:divs|series_id:hist|current_state:SCHEDULE_TIMESERIES|lookback_years:1|maturity:2026-09-18|method:CONSTANT|undo_adjust:1\n", + "2026-02-01 01:10:09 [test] trade.datamanager.rates INFO: Cache hit for risk-free rate timeseries key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-01 01:10:09 [test] trade.datamanager.rates INFO: Cache fully covers requested date range for risk-free rate timeseries. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-01 01:10:09 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-01-30 to 2026-01-30...\n", + "2026-02-01 01:10:09 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-01 01:10:09 [test] EventDriven.riskmanager.market_data WARNING: End date 2026-01-30 00:00:00 is in the past or current time is after market close. Preload check will be skipped if specified.\n", + "2026-02-01 01:10:09 [test] EventDriven.riskmanager.market_data INFO: Sanitizing today's data from all stored timeseries data...\n", + "2026-02-01 01:10:10 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-01-30 00:00:00 to 2026-01-30 00:00:00...\n", + "2026-02-01 01:10:10 [test] trade.datamanager.utils INFO: Using cached date range for 2026-01-30 00:00:00 - 2026-01-30 00:00:00 and option tick SBUX20260918C100\n", + "2026-02-01 01:10:10 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: symbol:SBUX|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:QUOTE|expiration:20260918T000000|right:C|strike:100. Fetching missing dates: [Timestamp('2026-01-30 00:00:00')]\n", + "2026-02-01 01:10:10 [test] trade.datamanager.option_spot INFO: Cache partially covers requested date range for option spot timeseries. Key: symbol:SBUX|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:QUOTE|expiration:20260918T000000|right:C|strike:100. Fetching missing dates.\n", + "2026-02-01 01:10:10 [test] trade.datamanager.option_spot INFO: Fetching option spot data from Thetadata Quote endpoint for SBUX from 2026-01-30 00:00:00 to 2026-01-30 00:00:00.\n", + "2026-02-01 01:10:11 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:SBUX|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:QUOTE|expiration:20260918T000000|right:C|strike:100 to avoid saving partial day data.\n", + "2026-02-01 01:10:11 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-01-30 to 2026-01-30...\n", + "2026-02-01 01:10:11 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:2026-09-18|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market to avoid saving partial day data.\n", + "2026-02-01 01:10:11 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-01-30 to 2026-01-30...\n" + ] + }, + { + "data": { + "text/plain": [ + "datetime\n", + "2026-01-30 0.318936\n", + "dtype: float64" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "vol_dm.rt(\n", + " expiration=expiration,\n", + " right=right,\n", + " strike=strike,\n", + " market_model=OptionPricingModel.BINOMIAL,\n", + " dividend_type=DivType.DISCRETE,\n", + ").timeseries" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "999fffc3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2026-02-01 01:10:11 [test] trade.datamanager.vol WARNING: Valuation date 2026-02-01 00:00:00 is not a business day or holiday. Resolving using fallback options RealTimeFallbackOption.USE_LAST_AVAILABLE.\n", + "2026-02-01 01:10:11 [test] trade.datamanager.vol INFO: VolDm Using specified dividend type: DivType.DISCRETE\n", + "2026-02-01 01:10:11 [test] trade.datamanager.vol INFO: VolDm Using model price: ModelPrice.ASK\n", + "2026-02-01 01:10:11 [test] trade.datamanager.utils INFO: Using cached date range for 2026-01-30 00:00:00 - 2026-01-30 00:00:00 and option tick SBUX20260918C100\n", + "2026-02-01 01:10:11 [test] trade.datamanager.utils INFO: No cache found for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|dividend_type:discrete|endpoint_source:quote|expiration:2026-09-18|model_price:ask|option_pricing_model:Black-Scholes|right:C|strike:100|volatility_model:market. Fetching from source.\n", + "2026-02-01 01:10:11 [test] trade.datamanager.rates INFO: Cache hit for risk-free rate timeseries key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-01 01:10:11 [test] trade.datamanager.rates INFO: Cache fully covers requested date range for risk-free rate timeseries. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-01 01:10:11 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-01-30 to 2026-01-30...\n", + "2026-02-01 01:10:11 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-01 01:10:11 [test] trade.datamanager.forward INFO: Cache hit for forward timeseries key: symbol:SBUX|interval:eod|artifact_type:forward|series_id:hist|dividend_type:DISCRETE|maturity:2026-09-18|use_chain_spot:1\n", + "2026-02-01 01:10:11 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-01-30 to 2026-01-30...\n", + "2026-02-01 01:10:11 [test] trade.datamanager.utils INFO: Using cached date range for 2026-01-30 00:00:00 - 2026-01-30 00:00:00 and option tick SBUX20260918C100\n", + "2026-02-01 01:10:11 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: symbol:SBUX|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:QUOTE|expiration:20260918T000000|right:C|strike:100\n", + "2026-02-01 01:10:11 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-01-30 00:00:00 to 2026-01-30 00:00:00...\n", + "2026-02-01 01:10:11 [test] trade.datamanager.option_spot INFO: Cache hit for option spot timeseries key: symbol:SBUX|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:QUOTE|expiration:20260918T000000|right:C|strike:100\n", + "2026-02-01 01:10:11 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|dividend_type:discrete|endpoint_source:quote|expiration:2026-09-18|model_price:ask|option_pricing_model:Black-Scholes|right:C|strike:100|volatility_model:market to avoid saving partial day data.\n", + "2026-02-01 01:10:11 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-01-30 to 2026-01-30...\n" + ] + }, + { + "data": { + "text/plain": [ + "datetime\n", + "2026-01-30 0.324693\n", + "dtype: float64" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "vol_dm.rt(\n", + " expiration=expiration,\n", + " right=right,\n", + " strike=strike,\n", + " market_model=OptionPricingModel.BSM,\n", + " dividend_type=DivType.DISCRETE,\n", + ").timeseries" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "55c9bf74", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2026-02-01 01:10:12 [test] algo.__init__ CRITICAL: ALGO_DIR not on main branch; skipping runtime safeguards.\n" + ] + }, + { + "data": { + "text/html": [ + " \n", + "
\n", + " \n", + " Loading BokehJS ...\n", + "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": "'use strict';\n(function(root) {\n function now() {\n return new Date();\n }\n\n const force = true;\n\n if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n root._bokeh_onload_callbacks = [];\n root._bokeh_is_loading = undefined;\n }\n\nconst JS_MIME_TYPE = 'application/javascript';\n const HTML_MIME_TYPE = 'text/html';\n const EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n const CLASS_NAME = 'output_bokeh rendered_html';\n\n /**\n * Render data to the DOM node\n */\n function render(props, node) {\n const script = document.createElement(\"script\");\n node.appendChild(script);\n }\n\n /**\n * Handle when an output is cleared or removed\n */\n function handleClearOutput(event, handle) {\n function drop(id) {\n const view = Bokeh.index.get_by_id(id)\n if (view != null) {\n view.model.document.clear()\n Bokeh.index.delete(view)\n }\n }\n\n const cell = handle.cell;\n\n const id = cell.output_area._bokeh_element_id;\n const server_id = cell.output_area._bokeh_server_id;\n\n // Clean up Bokeh references\n if (id != null) {\n drop(id)\n }\n\n if (server_id !== undefined) {\n // Clean up Bokeh references\n const cmd_clean = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n cell.notebook.kernel.execute(cmd_clean, {\n iopub: {\n output: function(msg) {\n const id = msg.content.text.trim()\n drop(id)\n }\n }\n });\n // Destroy server and session\n const cmd_destroy = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n cell.notebook.kernel.execute(cmd_destroy);\n }\n }\n\n /**\n * Handle when a new output is added\n */\n function handleAddOutput(event, handle) {\n const output_area = handle.output_area;\n const output = handle.output;\n\n // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n if ((output.output_type != \"display_data\") || (!Object.prototype.hasOwnProperty.call(output.data, EXEC_MIME_TYPE))) {\n return\n }\n\n const toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n\n if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n // store reference to embed id on output_area\n output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n }\n if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n const bk_div = document.createElement(\"div\");\n bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n const script_attrs = bk_div.children[0].attributes;\n for (let i = 0; i < script_attrs.length; i++) {\n toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n toinsert[toinsert.length - 1].firstChild.textContent = bk_div.children[0].textContent\n }\n // store reference to server id on output_area\n output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n }\n }\n\n function register_renderer(events, OutputArea) {\n\n function append_mime(data, metadata, element) {\n // create a DOM node to render to\n const toinsert = this.create_output_subarea(\n metadata,\n CLASS_NAME,\n EXEC_MIME_TYPE\n );\n this.keyboard_manager.register_events(toinsert);\n // Render to node\n const props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n render(props, toinsert[toinsert.length - 1]);\n element.append(toinsert);\n return toinsert\n }\n\n /* Handle when an output is cleared or removed */\n events.on('clear_output.CodeCell', handleClearOutput);\n events.on('delete.Cell', handleClearOutput);\n\n /* Handle when a new output is added */\n events.on('output_added.OutputArea', handleAddOutput);\n\n /**\n * Register the mime type and append_mime function with output_area\n */\n OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n /* Is output safe? */\n safe: true,\n /* Index of renderer in `output_area.display_order` */\n index: 0\n });\n }\n\n // register the mime type if in Jupyter Notebook environment and previously unregistered\n if (root.Jupyter !== undefined) {\n const events = require('base/js/events');\n const OutputArea = require('notebook/js/outputarea').OutputArea;\n\n if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n register_renderer(events, OutputArea);\n }\n }\n if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n const NB_LOAD_WARNING = {'data': {'text/html':\n \"
\\n\"+\n \"

\\n\"+\n \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n \"

\\n\"+\n \"
    \\n\"+\n \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n \"
  • use INLINE resources instead, as so:
  • \\n\"+\n \"
\\n\"+\n \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"
\"}};\n\n function display_loaded(error = null) {\n const el = document.getElementById(\"c3162abc-872f-4139-9799-b08236b47f64\");\n if (el != null) {\n const html = (() => {\n if (typeof root.Bokeh === \"undefined\") {\n if (error == null) {\n return \"BokehJS is loading ...\";\n } else {\n return \"BokehJS failed to load.\";\n }\n } else {\n const prefix = `BokehJS ${root.Bokeh.version}`;\n if (error == null) {\n return `${prefix} successfully loaded.`;\n } else {\n return `${prefix} encountered errors while loading and may not function as expected.`;\n }\n }\n })();\n el.innerHTML = html;\n\n if (error != null) {\n const wrapper = document.createElement(\"div\");\n wrapper.style.overflow = \"auto\";\n wrapper.style.height = \"5em\";\n wrapper.style.resize = \"vertical\";\n const content = document.createElement(\"div\");\n content.style.fontFamily = \"monospace\";\n content.style.whiteSpace = \"pre-wrap\";\n content.style.backgroundColor = \"rgb(255, 221, 221)\";\n content.textContent = error.stack ?? error.toString();\n wrapper.append(content);\n el.append(wrapper);\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(() => display_loaded(error), 100);\n }\n }\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n\n root._bokeh_onload_callbacks.push(callback);\n if (root._bokeh_is_loading > 0) {\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls == null || js_urls.length === 0) {\n run_callbacks();\n return null;\n }\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = css_urls.length + js_urls.length;\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n\n function on_error(url) {\n console.error(\"failed to load \" + url);\n }\n\n for (let i = 0; i < css_urls.length; i++) {\n const url = css_urls[i];\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n }\n\n for (let i = 0; i < js_urls.length; i++) {\n const url = js_urls[i];\n const element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n };\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.7.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.7.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.7.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.7.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.7.3.min.js\"];\n const css_urls = [];\n\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {\n }\n ];\n\n function run_inline_js() {\n if (root.Bokeh !== undefined || force === true) {\n try {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\n\n } catch (error) {display_loaded(error);throw error;\n }if (force === true) {\n display_loaded();\n }} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n } else if (force !== true) {\n const cell = $(document.getElementById(\"c3162abc-872f-4139-9799-b08236b47f64\")).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\n }\n }\n\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(css_urls, js_urls, function() {\n console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n}(window));", + "application/vnd.bokehjs_load.v0+json": "" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[get_engine] Creating engine for DB: master_config (base: master_config), PID: 62000\n", + "[get_engine] Creating engine for DB: portfolio_data_test (base: portfolio_data), PID: 62000\n", + "Fetching rates data from yfinance directly during market hours\n", + "[get_engine] Creating engine for DB: portfolio_config_long_bbands (base: portfolio_config), PID: 62000\n", + "[get_engine] Creating engine for DB: portfolio_data_long_bbands (base: portfolio_data), PID: 62000\n", + "2026-02-01 01:10:29 [test] algo.strategies._config_utils INFO: No configuration differences found for slug 'long_bbands'.\n", + "2026-02-01 01:10:31 [test] algo.strategies._config_utils INFO: No configuration differences found for slug 'long_bbands'.\n", + "2026-02-01 01:10:31 [test] algo.strategies._config_utils INFO: No configuration differences found for slug 'long_bbands'.\n", + "2026-02-01 01:10:32 [test] algo.strategies.init_strategies INFO: Loading timeseries data from 2025-03-07 to 2026-02-01 for stocks: ['AAPL', 'NVDA', 'TSLA', 'COST', 'AMZN', 'META', 'AMD', 'SBUX', 'NFLX', 'BA']\n", + "2026-02-01 01:10:32 [test] EventDriven.riskmanager.market_data WARNING: End date 2026-02-01 01:10:32.634057 is today or in the future and current time is before market close. Forcing preload check.\n", + "2026-02-01 01:10:32 [test] EventDriven.riskmanager.market_data CRITICAL: Timeseries for symbol AAPL not loaded. Loading now.\n", + "2026-02-01 01:10:37 [test] EventDriven.riskmanager.market_data INFO: Sanitizing today's data from all stored timeseries data...\n", + "2026-02-01 01:10:37 [test] algo.strategies.init_strategies ERROR: Dataset for AAPL does not contain the current time 2026-02-01 01:10:32.634057\n", + "2026-02-01 01:10:37 [test] algo.strategies.init_strategies INFO: Formatted columns for AAPL: ['Open', 'High', 'Low', 'Close', 'Volume']\n", + "2026-02-01 01:10:37 [test] EventDriven.riskmanager.market_data WARNING: End date 2026-02-01 01:10:32.634057 is today or in the future and current time is before market close. Forcing preload check.\n", + "2026-02-01 01:10:37 [test] EventDriven.riskmanager.market_data CRITICAL: Timeseries for symbol NVDA not loaded. Loading now.\n", + "2026-02-01 01:10:40 [test] EventDriven.riskmanager.market_data INFO: Sanitizing today's data from all stored timeseries data...\n", + "2026-02-01 01:10:40 [test] algo.strategies.init_strategies ERROR: Dataset for NVDA does not contain the current time 2026-02-01 01:10:32.634057\n", + "2026-02-01 01:10:40 [test] algo.strategies.init_strategies INFO: Formatted columns for NVDA: ['Open', 'High', 'Low', 'Close', 'Volume']\n", + "2026-02-01 01:10:40 [test] EventDriven.riskmanager.market_data WARNING: End date 2026-02-01 01:10:32.634057 is today or in the future and current time is before market close. Forcing preload check.\n", + "2026-02-01 01:10:40 [test] EventDriven.riskmanager.market_data CRITICAL: Timeseries for symbol TSLA not loaded. Loading now.\n", + "2026-02-01 01:10:43 [test] EventDriven.riskmanager.market_data ERROR: Failed to retrieve dividends for symbol TSLA\n", + "2026-02-01 01:10:44 [test] EventDriven.riskmanager.market_data INFO: Sanitizing today's data from all stored timeseries data...\n", + "2026-02-01 01:10:44 [test] algo.strategies.init_strategies ERROR: Dataset for TSLA does not contain the current time 2026-02-01 01:10:32.634057\n", + "2026-02-01 01:10:44 [test] algo.strategies.init_strategies INFO: Formatted columns for TSLA: ['Open', 'High', 'Low', 'Close', 'Volume']\n", + "2026-02-01 01:10:44 [test] EventDriven.riskmanager.market_data WARNING: End date 2026-02-01 01:10:32.634057 is today or in the future and current time is before market close. Forcing preload check.\n", + "2026-02-01 01:10:44 [test] EventDriven.riskmanager.market_data CRITICAL: Timeseries for symbol COST not loaded. Loading now.\n", + "2026-02-01 01:10:48 [test] EventDriven.riskmanager.market_data INFO: Sanitizing today's data from all stored timeseries data...\n", + "2026-02-01 01:10:48 [test] algo.strategies.init_strategies ERROR: Dataset for COST does not contain the current time 2026-02-01 01:10:32.634057\n", + "2026-02-01 01:10:48 [test] algo.strategies.init_strategies INFO: Formatted columns for COST: ['Open', 'High', 'Low', 'Close', 'Volume']\n", + "2026-02-01 01:10:48 [test] EventDriven.riskmanager.market_data WARNING: End date 2026-02-01 01:10:32.634057 is today or in the future and current time is before market close. Forcing preload check.\n", + "2026-02-01 01:10:48 [test] EventDriven.riskmanager.market_data CRITICAL: Timeseries for symbol AMZN not loaded. Loading now.\n", + "2026-02-01 01:10:50 [test] EventDriven.riskmanager.market_data ERROR: Failed to retrieve dividends for symbol AMZN\n", + "2026-02-01 01:10:51 [test] EventDriven.riskmanager.market_data INFO: Sanitizing today's data from all stored timeseries data...\n", + "2026-02-01 01:10:51 [test] algo.strategies.init_strategies ERROR: Dataset for AMZN does not contain the current time 2026-02-01 01:10:32.634057\n", + "2026-02-01 01:10:51 [test] algo.strategies.init_strategies INFO: Formatted columns for AMZN: ['Open', 'High', 'Low', 'Close', 'Volume']\n", + "2026-02-01 01:10:51 [test] EventDriven.riskmanager.market_data WARNING: End date 2026-02-01 01:10:32.634057 is today or in the future and current time is before market close. Forcing preload check.\n", + "2026-02-01 01:10:51 [test] EventDriven.riskmanager.market_data CRITICAL: Timeseries for symbol META not loaded. Loading now.\n", + "2026-02-01 01:10:53 [test] EventDriven.riskmanager.market_data INFO: Sanitizing today's data from all stored timeseries data...\n", + "2026-02-01 01:10:54 [test] algo.strategies.init_strategies ERROR: Dataset for META does not contain the current time 2026-02-01 01:10:32.634057\n", + "2026-02-01 01:10:54 [test] algo.strategies.init_strategies INFO: Formatted columns for META: ['Open', 'High', 'Low', 'Close', 'Volume']\n", + "2026-02-01 01:10:54 [test] EventDriven.riskmanager.market_data WARNING: End date 2026-02-01 01:10:32.634057 is today or in the future and current time is before market close. Forcing preload check.\n", + "2026-02-01 01:10:54 [test] EventDriven.riskmanager.market_data CRITICAL: Timeseries for symbol AMD not loaded. Loading now.\n", + "2026-02-01 01:10:57 [test] EventDriven.riskmanager.market_data ERROR: Failed to retrieve dividends for symbol AMD\n", + "2026-02-01 01:10:57 [test] EventDriven.riskmanager.market_data INFO: Sanitizing today's data from all stored timeseries data...\n", + "2026-02-01 01:10:57 [test] algo.strategies.init_strategies ERROR: Dataset for AMD does not contain the current time 2026-02-01 01:10:32.634057\n", + "2026-02-01 01:10:57 [test] algo.strategies.init_strategies INFO: Formatted columns for AMD: ['Open', 'High', 'Low', 'Close', 'Volume']\n", + "2026-02-01 01:10:57 [test] EventDriven.riskmanager.market_data WARNING: End date 2026-02-01 01:10:32.634057 is today or in the future and current time is before market close. Forcing preload check.\n", + "2026-02-01 01:10:57 [test] EventDriven.riskmanager.market_data INFO: Sanitizing today's data from all stored timeseries data...\n", + "2026-02-01 01:10:57 [test] algo.strategies.init_strategies ERROR: Dataset for SBUX does not contain the current time 2026-02-01 01:10:32.634057\n", + "2026-02-01 01:10:57 [test] algo.strategies.init_strategies INFO: Formatted columns for SBUX: ['Open', 'High', 'Low', 'Close', 'Volume']\n", + "2026-02-01 01:10:57 [test] EventDriven.riskmanager.market_data WARNING: End date 2026-02-01 01:10:32.634057 is today or in the future and current time is before market close. Forcing preload check.\n", + "2026-02-01 01:10:57 [test] EventDriven.riskmanager.market_data CRITICAL: Timeseries for symbol NFLX not loaded. Loading now.\n", + "2026-02-01 01:11:00 [test] EventDriven.riskmanager.market_data ERROR: Failed to retrieve dividends for symbol NFLX\n", + "2026-02-01 01:11:00 [test] EventDriven.riskmanager.market_data INFO: Sanitizing today's data from all stored timeseries data...\n", + "2026-02-01 01:11:00 [test] algo.strategies.init_strategies ERROR: Dataset for NFLX does not contain the current time 2026-02-01 01:10:32.634057\n", + "2026-02-01 01:11:00 [test] algo.strategies.init_strategies INFO: Formatted columns for NFLX: ['Open', 'High', 'Low', 'Close', 'Volume']\n", + "2026-02-01 01:11:00 [test] EventDriven.riskmanager.market_data WARNING: End date 2026-02-01 01:10:32.634057 is today or in the future and current time is before market close. Forcing preload check.\n", + "2026-02-01 01:11:00 [test] EventDriven.riskmanager.market_data CRITICAL: Timeseries for symbol BA not loaded. Loading now.\n", + "2026-02-01 01:11:04 [test] EventDriven.riskmanager.market_data INFO: Sanitizing today's data from all stored timeseries data...\n", + "2026-02-01 01:11:05 [test] algo.strategies.init_strategies ERROR: Dataset for BA does not contain the current time 2026-02-01 01:10:32.634057\n", + "2026-02-01 01:11:05 [test] algo.strategies.init_strategies INFO: Formatted columns for BA: ['Open', 'High', 'Low', 'Close', 'Volume']\n", + "2026-02-01 01:11:05 [test] algo.strategies._config_utils INFO: No configuration differences found for slug 'long_bbands'.\n" + ] + } + ], + "source": [ + "from dbase.database.db_utils import set_environment_context\n", + "from algo.strategies.init_strategies.new_system import get_multi_asset_instance\n", + "from algo.positions.vars import alpaca_client\n", + "set_environment_context(\"long_bbands\")\n", + "instance = get_multi_asset_instance(\"long_bbands\")" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "de7277d7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'BA': ,\n", + " 'AMD': ,\n", + " 'AAPL': ,\n", + " 'AMZN': ,\n", + " 'COST': ,\n", + " 'META': ,\n", + " 'NFLX': ,\n", + " 'NVDA': ,\n", + " 'SBUX': ,\n", + " 'TSLA': }" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "instance.asset_strategies" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "71876fee", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "close": { + "bdata": "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", + "dtype": "f8" + }, + "high": { + "bdata": "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", + "dtype": "f8" + }, + "low": { + "bdata": "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", + "dtype": "f8" + }, + "name": "Price", + "open": { + "bdata": "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", + "dtype": "f8" + }, + "type": "candlestick", + "x": [ + "2025-03-07T00:00:00", + "2025-03-10T00:00:00", + "2025-03-11T00:00:00", + "2025-03-12T00:00:00", + "2025-03-13T00:00:00", + "2025-03-14T00:00:00", + "2025-03-17T00:00:00", + "2025-03-18T00:00:00", + "2025-03-19T00:00:00", + "2025-03-20T00:00:00", + "2025-03-21T00:00:00", + "2025-03-24T00:00:00", + "2025-03-25T00:00:00", + "2025-03-26T00:00:00", + "2025-03-27T00:00:00", + "2025-03-28T00:00:00", + "2025-03-31T00:00:00", + "2025-04-01T00:00:00", + "2025-04-02T00:00:00", + "2025-04-03T00:00:00", + "2025-04-04T00:00:00", + "2025-04-07T00:00:00", + "2025-04-08T00:00:00", + "2025-04-09T00:00:00", + "2025-04-10T00:00:00", + "2025-04-11T00:00:00", + "2025-04-14T00:00:00", + "2025-04-15T00:00:00", + "2025-04-16T00:00:00", + "2025-04-17T00:00:00", + "2025-04-21T00:00:00", + "2025-04-22T00:00:00", + "2025-04-23T00:00:00", + "2025-04-24T00:00:00", + "2025-04-25T00:00:00", + "2025-04-28T00:00:00", + "2025-04-29T00:00:00", + "2025-04-30T00:00:00", + "2025-05-01T00:00:00", + "2025-05-02T00:00:00", + "2025-05-05T00:00:00", + "2025-05-06T00:00:00", + "2025-05-07T00:00:00", + "2025-05-08T00:00:00", + "2025-05-09T00:00:00", + "2025-05-12T00:00:00", + "2025-05-13T00:00:00", + "2025-05-14T00:00:00", + "2025-05-15T00:00:00", + "2025-05-16T00:00:00", + "2025-05-19T00:00:00", + "2025-05-20T00:00:00", + "2025-05-21T00:00:00", + "2025-05-22T00:00:00", + "2025-05-23T00:00:00", + "2025-05-27T00:00:00", + "2025-05-28T00:00:00", + "2025-05-29T00:00:00", + "2025-05-30T00:00:00", + "2025-06-02T00:00:00", + "2025-06-03T00:00:00", + "2025-06-04T00:00:00", + "2025-06-05T00:00:00", + "2025-06-06T00:00:00", + "2025-06-09T00:00:00", + "2025-06-10T00:00:00", + "2025-06-11T00:00:00", + "2025-06-12T00:00:00", + "2025-06-13T00:00:00", + "2025-06-16T00:00:00", + "2025-06-17T00:00:00", + "2025-06-18T00:00:00", + "2025-06-20T00:00:00", + "2025-06-23T00:00:00", + "2025-06-24T00:00:00", + "2025-06-25T00:00:00", + "2025-06-26T00:00:00", + "2025-06-27T00:00:00", + "2025-06-30T00:00:00", + "2025-07-01T00:00:00", + "2025-07-02T00:00:00", + "2025-07-03T00:00:00", + "2025-07-07T00:00:00", + "2025-07-08T00:00:00", + "2025-07-09T00:00:00", + "2025-07-10T00:00:00", + "2025-07-11T00:00:00", + "2025-07-14T00:00:00", + "2025-07-15T00:00:00", + "2025-07-16T00:00:00", + "2025-07-17T00:00:00", + "2025-07-18T00:00:00", + "2025-07-21T00:00:00", + "2025-07-22T00:00:00", + "2025-07-23T00:00:00", + "2025-07-24T00:00:00", + "2025-07-25T00:00:00", + "2025-07-28T00:00:00", + "2025-07-29T00:00:00", + "2025-07-30T00:00:00", + "2025-07-31T00:00:00", + "2025-08-01T00:00:00", + "2025-08-04T00:00:00", + "2025-08-05T00:00:00", + "2025-08-06T00:00:00", + "2025-08-07T00:00:00", + "2025-08-08T00:00:00", + "2025-08-11T00:00:00", + "2025-08-12T00:00:00", + "2025-08-13T00:00:00", + "2025-08-14T00:00:00", + "2025-08-15T00:00:00", + "2025-08-18T00:00:00", + "2025-08-19T00:00:00", + "2025-08-20T00:00:00", + "2025-08-21T00:00:00", + "2025-08-22T00:00:00", + "2025-08-25T00:00:00", + "2025-08-26T00:00:00", + "2025-08-27T00:00:00", + "2025-08-28T00:00:00", + "2025-08-29T00:00:00", + "2025-09-02T00:00:00", + "2025-09-03T00:00:00", + "2025-09-04T00:00:00", + "2025-09-05T00:00:00", + "2025-09-08T00:00:00", + "2025-09-09T00:00:00", + "2025-09-10T00:00:00", + "2025-09-11T00:00:00", + "2025-09-12T00:00:00", + "2025-09-15T00:00:00", + "2025-09-16T00:00:00", + "2025-09-17T00:00:00", + "2025-09-18T00:00:00", + "2025-09-19T00:00:00", + "2025-09-22T00:00:00", + "2025-09-23T00:00:00", + "2025-09-24T00:00:00", + "2025-09-25T00:00:00", + "2025-09-26T00:00:00", + "2025-09-29T00:00:00", + "2025-09-30T00:00:00", + "2025-10-01T00:00:00", + "2025-10-02T00:00:00", + "2025-10-03T00:00:00", + "2025-10-06T00:00:00", + "2025-10-07T00:00:00", + "2025-10-08T00:00:00", + "2025-10-09T00:00:00", + "2025-10-10T00:00:00", + "2025-10-13T00:00:00", + "2025-10-14T00:00:00", + "2025-10-15T00:00:00", + "2025-10-16T00:00:00", + "2025-10-17T00:00:00", + "2025-10-20T00:00:00", + "2025-10-21T00:00:00", + "2025-10-22T00:00:00", + "2025-10-23T00:00:00", + "2025-10-24T00:00:00", + "2025-10-27T00:00:00", + "2025-10-28T00:00:00", + "2025-10-29T00:00:00", + "2025-10-30T00:00:00", + "2025-10-31T00:00:00", + "2025-11-03T00:00:00", + "2025-11-04T00:00:00", + "2025-11-05T00:00:00", + "2025-11-06T00:00:00", + "2025-11-07T00:00:00", + "2025-11-10T00:00:00", + "2025-11-11T00:00:00", + "2025-11-12T00:00:00", + "2025-11-13T00:00:00", + "2025-11-14T00:00:00", + "2025-11-17T00:00:00", + "2025-11-18T00:00:00", + "2025-11-19T00:00:00", + "2025-11-20T00:00:00", + "2025-11-21T00:00:00", + "2025-11-24T00:00:00", + "2025-11-25T00:00:00", + "2025-11-26T00:00:00", + "2025-11-28T00:00:00", + "2025-12-01T00:00:00", + "2025-12-02T00:00:00", + "2025-12-03T00:00:00", + "2025-12-04T00:00:00", + "2025-12-05T00:00:00", + "2025-12-08T00:00:00", + "2025-12-09T00:00:00", + "2025-12-10T00:00:00", + "2025-12-11T00:00:00", + "2025-12-12T00:00:00", + "2025-12-15T00:00:00", + "2025-12-16T00:00:00", + "2025-12-17T00:00:00", + "2025-12-18T00:00:00", + "2025-12-19T00:00:00", + "2025-12-22T00:00:00", + "2025-12-23T00:00:00", + "2025-12-24T00:00:00", + "2025-12-26T00:00:00", + "2025-12-29T00:00:00", + "2025-12-30T00:00:00", + "2025-12-31T00:00:00", + "2026-01-02T00:00:00", + "2026-01-05T00:00:00", + "2026-01-06T00:00:00", + "2026-01-07T00:00:00", + "2026-01-08T00:00:00", + "2026-01-09T00:00:00", + "2026-01-12T00:00:00", + "2026-01-13T00:00:00", + "2026-01-14T00:00:00", + "2026-01-15T00:00:00", + "2026-01-16T00:00:00", + "2026-01-20T00:00:00", + "2026-01-21T00:00:00", + "2026-01-22T00:00:00", + "2026-01-23T00:00:00", + "2026-01-26T00:00:00", + "2026-01-27T00:00:00", + "2026-01-28T00:00:00", + "2026-01-29T00:00:00", + "2026-01-30T00:00:00" + ], + "xaxis": "x", + "yaxis": "y" + }, + { + "line": { + "color": "blue" + }, + "mode": "lines", + "name": "middle_band", + "type": "scatter", + "x": [ + "2025-03-07T00:00:00", + "2025-03-10T00:00:00", + "2025-03-11T00:00:00", + "2025-03-12T00:00:00", + "2025-03-13T00:00:00", + "2025-03-14T00:00:00", + "2025-03-17T00:00:00", + "2025-03-18T00:00:00", + "2025-03-19T00:00:00", + "2025-03-20T00:00:00", + "2025-03-21T00:00:00", + "2025-03-24T00:00:00", + "2025-03-25T00:00:00", + "2025-03-26T00:00:00", + "2025-03-27T00:00:00", + "2025-03-28T00:00:00", + "2025-03-31T00:00:00", + "2025-04-01T00:00:00", + "2025-04-02T00:00:00", + "2025-04-03T00:00:00", + "2025-04-04T00:00:00", + "2025-04-07T00:00:00", + "2025-04-08T00:00:00", + "2025-04-09T00:00:00", + "2025-04-10T00:00:00", + "2025-04-11T00:00:00", + "2025-04-14T00:00:00", + "2025-04-15T00:00:00", + "2025-04-16T00:00:00", + "2025-04-17T00:00:00", + "2025-04-21T00:00:00", + "2025-04-22T00:00:00", + "2025-04-23T00:00:00", + "2025-04-24T00:00:00", + "2025-04-25T00:00:00", + "2025-04-28T00:00:00", + "2025-04-29T00:00:00", + "2025-04-30T00:00:00", + "2025-05-01T00:00:00", + "2025-05-02T00:00:00", + "2025-05-05T00:00:00", + "2025-05-06T00:00:00", + "2025-05-07T00:00:00", + "2025-05-08T00:00:00", + "2025-05-09T00:00:00", + "2025-05-12T00:00:00", + "2025-05-13T00:00:00", + "2025-05-14T00:00:00", + "2025-05-15T00:00:00", + "2025-05-16T00:00:00", + "2025-05-19T00:00:00", + "2025-05-20T00:00:00", + "2025-05-21T00:00:00", + "2025-05-22T00:00:00", + "2025-05-23T00:00:00", + "2025-05-27T00:00:00", + "2025-05-28T00:00:00", + "2025-05-29T00:00:00", + "2025-05-30T00:00:00", + "2025-06-02T00:00:00", + "2025-06-03T00:00:00", + "2025-06-04T00:00:00", + "2025-06-05T00:00:00", + "2025-06-06T00:00:00", + "2025-06-09T00:00:00", + "2025-06-10T00:00:00", + "2025-06-11T00:00:00", + "2025-06-12T00:00:00", + "2025-06-13T00:00:00", + "2025-06-16T00:00:00", + "2025-06-17T00:00:00", + "2025-06-18T00:00:00", + "2025-06-20T00:00:00", + "2025-06-23T00:00:00", + "2025-06-24T00:00:00", + "2025-06-25T00:00:00", + "2025-06-26T00:00:00", + "2025-06-27T00:00:00", + "2025-06-30T00:00:00", + "2025-07-01T00:00:00", + "2025-07-02T00:00:00", + "2025-07-03T00:00:00", + "2025-07-07T00:00:00", + "2025-07-08T00:00:00", + "2025-07-09T00:00:00", + "2025-07-10T00:00:00", + "2025-07-11T00:00:00", + "2025-07-14T00:00:00", + "2025-07-15T00:00:00", + "2025-07-16T00:00:00", + "2025-07-17T00:00:00", + "2025-07-18T00:00:00", + "2025-07-21T00:00:00", + "2025-07-22T00:00:00", + "2025-07-23T00:00:00", + "2025-07-24T00:00:00", + "2025-07-25T00:00:00", + "2025-07-28T00:00:00", + "2025-07-29T00:00:00", + "2025-07-30T00:00:00", + "2025-07-31T00:00:00", + "2025-08-01T00:00:00", + "2025-08-04T00:00:00", + "2025-08-05T00:00:00", + "2025-08-06T00:00:00", + "2025-08-07T00:00:00", + "2025-08-08T00:00:00", + "2025-08-11T00:00:00", + "2025-08-12T00:00:00", + "2025-08-13T00:00:00", + "2025-08-14T00:00:00", + "2025-08-15T00:00:00", + "2025-08-18T00:00:00", + "2025-08-19T00:00:00", + "2025-08-20T00:00:00", + "2025-08-21T00:00:00", + "2025-08-22T00:00:00", + "2025-08-25T00:00:00", + "2025-08-26T00:00:00", + "2025-08-27T00:00:00", + "2025-08-28T00:00:00", + "2025-08-29T00:00:00", + "2025-09-02T00:00:00", + "2025-09-03T00:00:00", + "2025-09-04T00:00:00", + "2025-09-05T00:00:00", + "2025-09-08T00:00:00", + "2025-09-09T00:00:00", + "2025-09-10T00:00:00", + "2025-09-11T00:00:00", + "2025-09-12T00:00:00", + "2025-09-15T00:00:00", + "2025-09-16T00:00:00", + "2025-09-17T00:00:00", + "2025-09-18T00:00:00", + "2025-09-19T00:00:00", + "2025-09-22T00:00:00", + "2025-09-23T00:00:00", + "2025-09-24T00:00:00", + "2025-09-25T00:00:00", + "2025-09-26T00:00:00", + "2025-09-29T00:00:00", + "2025-09-30T00:00:00", + "2025-10-01T00:00:00", + "2025-10-02T00:00:00", + "2025-10-03T00:00:00", + "2025-10-06T00:00:00", + "2025-10-07T00:00:00", + "2025-10-08T00:00:00", + "2025-10-09T00:00:00", + "2025-10-10T00:00:00", + "2025-10-13T00:00:00", + "2025-10-14T00:00:00", + "2025-10-15T00:00:00", + "2025-10-16T00:00:00", + "2025-10-17T00:00:00", + "2025-10-20T00:00:00", + "2025-10-21T00:00:00", + "2025-10-22T00:00:00", + "2025-10-23T00:00:00", + "2025-10-24T00:00:00", + "2025-10-27T00:00:00", + "2025-10-28T00:00:00", + "2025-10-29T00:00:00", + "2025-10-30T00:00:00", + "2025-10-31T00:00:00", + "2025-11-03T00:00:00", + "2025-11-04T00:00:00", + "2025-11-05T00:00:00", + "2025-11-06T00:00:00", + "2025-11-07T00:00:00", + "2025-11-10T00:00:00", + "2025-11-11T00:00:00", + "2025-11-12T00:00:00", + "2025-11-13T00:00:00", + "2025-11-14T00:00:00", + "2025-11-17T00:00:00", + "2025-11-18T00:00:00", + "2025-11-19T00:00:00", + "2025-11-20T00:00:00", + "2025-11-21T00:00:00", + "2025-11-24T00:00:00", + "2025-11-25T00:00:00", + "2025-11-26T00:00:00", + "2025-11-28T00:00:00", + "2025-12-01T00:00:00", + "2025-12-02T00:00:00", + "2025-12-03T00:00:00", + "2025-12-04T00:00:00", + "2025-12-05T00:00:00", + "2025-12-08T00:00:00", + "2025-12-09T00:00:00", + "2025-12-10T00:00:00", + "2025-12-11T00:00:00", + "2025-12-12T00:00:00", + "2025-12-15T00:00:00", + "2025-12-16T00:00:00", + "2025-12-17T00:00:00", + "2025-12-18T00:00:00", + "2025-12-19T00:00:00", + "2025-12-22T00:00:00", + "2025-12-23T00:00:00", + "2025-12-24T00:00:00", + "2025-12-26T00:00:00", + "2025-12-29T00:00:00", + "2025-12-30T00:00:00", + "2025-12-31T00:00:00", + "2026-01-02T00:00:00", + "2026-01-05T00:00:00", + "2026-01-06T00:00:00", + "2026-01-07T00:00:00", + "2026-01-08T00:00:00", + "2026-01-09T00:00:00", + "2026-01-12T00:00:00", + "2026-01-13T00:00:00", + "2026-01-14T00:00:00", + "2026-01-15T00:00:00", + "2026-01-16T00:00:00", + "2026-01-20T00:00:00", + "2026-01-21T00:00:00", + "2026-01-22T00:00:00", + "2026-01-23T00:00:00", + "2026-01-26T00:00:00", + "2026-01-27T00:00:00", + "2026-01-28T00:00:00", + "2026-01-29T00:00:00", + "2026-01-30T00:00:00" + ], + "xaxis": "x", + "y": { + "bdata": "AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/3RKn5j2NY0C6JU6lhJljQOLU74GopmNA8LklVkyzY0Cnfs/1R75jQBhpx6pLyGNAzy1xmn/RY0ArEEZyTdtjQHHq97Sn5GNAiVO/1zHuY0AbymvIt/hjQCsQRurVA2RAA2GkHUIPZEBpxwp8sxpkQLfEqV+iJ2RA2FBeG5I0ZEAN5TVksEFkQOLU73HZTmRAQ3kNhRtcZECPFQh7MmlkQPjcEheXd2RAhJF2NI+HZEDi1O9JSJZkQBvKa2AzpWRAjLRjrRixZEBLnPrlRr5kQEk7VihxymRA8xrKe03XZEB/zy05xuNkQHesQIAr8GRAS5z6dfT9ZEDFqd9jxAxlQMWp3/u4G2VAoryGKtUpZUBc4tRfqTdlQK+hvH45RWVAHisQllZTZUCMtGOtK2FlQA==", + "dtype": "f8" + }, + "yaxis": "y" + }, + { + "line": { + "color": "green" + }, + "mode": "lines", + "name": "upper_band", + "type": "scatter", + "x": [ + "2025-03-07T00:00:00", + "2025-03-10T00:00:00", + "2025-03-11T00:00:00", + "2025-03-12T00:00:00", + "2025-03-13T00:00:00", + "2025-03-14T00:00:00", + "2025-03-17T00:00:00", + "2025-03-18T00:00:00", + "2025-03-19T00:00:00", + "2025-03-20T00:00:00", + "2025-03-21T00:00:00", + "2025-03-24T00:00:00", + "2025-03-25T00:00:00", + "2025-03-26T00:00:00", + "2025-03-27T00:00:00", + "2025-03-28T00:00:00", + "2025-03-31T00:00:00", + "2025-04-01T00:00:00", + "2025-04-02T00:00:00", + "2025-04-03T00:00:00", + "2025-04-04T00:00:00", + "2025-04-07T00:00:00", + "2025-04-08T00:00:00", + "2025-04-09T00:00:00", + "2025-04-10T00:00:00", + "2025-04-11T00:00:00", + "2025-04-14T00:00:00", + "2025-04-15T00:00:00", + "2025-04-16T00:00:00", + "2025-04-17T00:00:00", + "2025-04-21T00:00:00", + "2025-04-22T00:00:00", + "2025-04-23T00:00:00", + "2025-04-24T00:00:00", + "2025-04-25T00:00:00", + "2025-04-28T00:00:00", + "2025-04-29T00:00:00", + "2025-04-30T00:00:00", + "2025-05-01T00:00:00", + "2025-05-02T00:00:00", + "2025-05-05T00:00:00", + "2025-05-06T00:00:00", + "2025-05-07T00:00:00", + "2025-05-08T00:00:00", + "2025-05-09T00:00:00", + "2025-05-12T00:00:00", + "2025-05-13T00:00:00", + "2025-05-14T00:00:00", + "2025-05-15T00:00:00", + "2025-05-16T00:00:00", + "2025-05-19T00:00:00", + "2025-05-20T00:00:00", + "2025-05-21T00:00:00", + "2025-05-22T00:00:00", + "2025-05-23T00:00:00", + "2025-05-27T00:00:00", + "2025-05-28T00:00:00", + "2025-05-29T00:00:00", + "2025-05-30T00:00:00", + "2025-06-02T00:00:00", + "2025-06-03T00:00:00", + "2025-06-04T00:00:00", + "2025-06-05T00:00:00", + "2025-06-06T00:00:00", + "2025-06-09T00:00:00", + "2025-06-10T00:00:00", + "2025-06-11T00:00:00", + "2025-06-12T00:00:00", + "2025-06-13T00:00:00", + "2025-06-16T00:00:00", + "2025-06-17T00:00:00", + "2025-06-18T00:00:00", + "2025-06-20T00:00:00", + "2025-06-23T00:00:00", + "2025-06-24T00:00:00", + "2025-06-25T00:00:00", + "2025-06-26T00:00:00", + "2025-06-27T00:00:00", + "2025-06-30T00:00:00", + "2025-07-01T00:00:00", + "2025-07-02T00:00:00", + "2025-07-03T00:00:00", + "2025-07-07T00:00:00", + "2025-07-08T00:00:00", + "2025-07-09T00:00:00", + "2025-07-10T00:00:00", + "2025-07-11T00:00:00", + "2025-07-14T00:00:00", + "2025-07-15T00:00:00", + "2025-07-16T00:00:00", + "2025-07-17T00:00:00", + "2025-07-18T00:00:00", + "2025-07-21T00:00:00", + "2025-07-22T00:00:00", + "2025-07-23T00:00:00", + "2025-07-24T00:00:00", + "2025-07-25T00:00:00", + "2025-07-28T00:00:00", + "2025-07-29T00:00:00", + "2025-07-30T00:00:00", + "2025-07-31T00:00:00", + "2025-08-01T00:00:00", + "2025-08-04T00:00:00", + "2025-08-05T00:00:00", + "2025-08-06T00:00:00", + "2025-08-07T00:00:00", + "2025-08-08T00:00:00", + "2025-08-11T00:00:00", + "2025-08-12T00:00:00", + "2025-08-13T00:00:00", + "2025-08-14T00:00:00", + "2025-08-15T00:00:00", + "2025-08-18T00:00:00", + "2025-08-19T00:00:00", + "2025-08-20T00:00:00", + "2025-08-21T00:00:00", + "2025-08-22T00:00:00", + "2025-08-25T00:00:00", + "2025-08-26T00:00:00", + "2025-08-27T00:00:00", + "2025-08-28T00:00:00", + "2025-08-29T00:00:00", + "2025-09-02T00:00:00", + "2025-09-03T00:00:00", + "2025-09-04T00:00:00", + "2025-09-05T00:00:00", + "2025-09-08T00:00:00", + "2025-09-09T00:00:00", + "2025-09-10T00:00:00", + "2025-09-11T00:00:00", + "2025-09-12T00:00:00", + "2025-09-15T00:00:00", + "2025-09-16T00:00:00", + "2025-09-17T00:00:00", + "2025-09-18T00:00:00", + "2025-09-19T00:00:00", + "2025-09-22T00:00:00", + "2025-09-23T00:00:00", + "2025-09-24T00:00:00", + "2025-09-25T00:00:00", + "2025-09-26T00:00:00", + "2025-09-29T00:00:00", + "2025-09-30T00:00:00", + "2025-10-01T00:00:00", + "2025-10-02T00:00:00", + "2025-10-03T00:00:00", + "2025-10-06T00:00:00", + "2025-10-07T00:00:00", + "2025-10-08T00:00:00", + "2025-10-09T00:00:00", + "2025-10-10T00:00:00", + "2025-10-13T00:00:00", + "2025-10-14T00:00:00", + "2025-10-15T00:00:00", + "2025-10-16T00:00:00", + "2025-10-17T00:00:00", + "2025-10-20T00:00:00", + "2025-10-21T00:00:00", + "2025-10-22T00:00:00", + "2025-10-23T00:00:00", + "2025-10-24T00:00:00", + "2025-10-27T00:00:00", + "2025-10-28T00:00:00", + "2025-10-29T00:00:00", + "2025-10-30T00:00:00", + "2025-10-31T00:00:00", + "2025-11-03T00:00:00", + "2025-11-04T00:00:00", + "2025-11-05T00:00:00", + "2025-11-06T00:00:00", + "2025-11-07T00:00:00", + "2025-11-10T00:00:00", + "2025-11-11T00:00:00", + "2025-11-12T00:00:00", + "2025-11-13T00:00:00", + "2025-11-14T00:00:00", + "2025-11-17T00:00:00", + "2025-11-18T00:00:00", + "2025-11-19T00:00:00", + "2025-11-20T00:00:00", + "2025-11-21T00:00:00", + "2025-11-24T00:00:00", + "2025-11-25T00:00:00", + "2025-11-26T00:00:00", + "2025-11-28T00:00:00", + "2025-12-01T00:00:00", + "2025-12-02T00:00:00", + "2025-12-03T00:00:00", + "2025-12-04T00:00:00", + "2025-12-05T00:00:00", + "2025-12-08T00:00:00", + "2025-12-09T00:00:00", + "2025-12-10T00:00:00", + "2025-12-11T00:00:00", + "2025-12-12T00:00:00", + "2025-12-15T00:00:00", + "2025-12-16T00:00:00", + "2025-12-17T00:00:00", + "2025-12-18T00:00:00", + "2025-12-19T00:00:00", + "2025-12-22T00:00:00", + "2025-12-23T00:00:00", + "2025-12-24T00:00:00", + "2025-12-26T00:00:00", + "2025-12-29T00:00:00", + "2025-12-30T00:00:00", + "2025-12-31T00:00:00", + "2026-01-02T00:00:00", + "2026-01-05T00:00:00", + "2026-01-06T00:00:00", + "2026-01-07T00:00:00", + "2026-01-08T00:00:00", + "2026-01-09T00:00:00", + "2026-01-12T00:00:00", + "2026-01-13T00:00:00", + "2026-01-14T00:00:00", + "2026-01-15T00:00:00", + "2026-01-16T00:00:00", + "2026-01-20T00:00:00", + "2026-01-21T00:00:00", + "2026-01-22T00:00:00", + "2026-01-23T00:00:00", + "2026-01-26T00:00:00", + "2026-01-27T00:00:00", + "2026-01-28T00:00:00", + "2026-01-29T00:00:00", + "2026-01-30T00:00:00" + ], + "xaxis": "x", + "y": { + "bdata": "AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/3xef9XjvY0A6HqrKcvtjQMxhXvscCGRAqv/WDUoUZECtyQ7c7R5kQBj9BZCEKGRAP0PDeG4xZEAH5QS75zpkQCrxFdfCQ2RAj4Zt/91MZED8Pvn/CVdkQEGdsIjOYWRAbNCI5ghtZEA1bDgNPnhkQI9s++bHhGRAySoc/zKRZECfOjUGt51kQBKtrrcxqmRA3y96ida2ZEDWCUmNScNkQAMAfB600GRAQVn9s2LfZEBe7S3M2+xkQHcfNVZs+mRADtDmF50FZUDpMYJt1hFlQFOxs4gbHWVAzq85nRUpZUBrzG3SrzRlQK3MPKrLP2VAHdiXPSpMZUDZUR4ETlllQMzbzVioZmVAxvnNtkZzZUCOcL2Kw39lQGHSW0UxjGVAxlGdTgmZZUD15cG0iaVlQA==", + "dtype": "f8" + }, + "yaxis": "y" + }, + { + "line": { + "color": "red" + }, + "mode": "lines", + "name": "lower_band", + "type": "scatter", + "x": [ + "2025-03-07T00:00:00", + "2025-03-10T00:00:00", + "2025-03-11T00:00:00", + "2025-03-12T00:00:00", + "2025-03-13T00:00:00", + "2025-03-14T00:00:00", + "2025-03-17T00:00:00", + "2025-03-18T00:00:00", + "2025-03-19T00:00:00", + "2025-03-20T00:00:00", + "2025-03-21T00:00:00", + "2025-03-24T00:00:00", + "2025-03-25T00:00:00", + "2025-03-26T00:00:00", + "2025-03-27T00:00:00", + "2025-03-28T00:00:00", + "2025-03-31T00:00:00", + "2025-04-01T00:00:00", + "2025-04-02T00:00:00", + "2025-04-03T00:00:00", + "2025-04-04T00:00:00", + "2025-04-07T00:00:00", + "2025-04-08T00:00:00", + "2025-04-09T00:00:00", + "2025-04-10T00:00:00", + "2025-04-11T00:00:00", + "2025-04-14T00:00:00", + "2025-04-15T00:00:00", + "2025-04-16T00:00:00", + "2025-04-17T00:00:00", + "2025-04-21T00:00:00", + "2025-04-22T00:00:00", + "2025-04-23T00:00:00", + "2025-04-24T00:00:00", + "2025-04-25T00:00:00", + "2025-04-28T00:00:00", + "2025-04-29T00:00:00", + "2025-04-30T00:00:00", + "2025-05-01T00:00:00", + "2025-05-02T00:00:00", + "2025-05-05T00:00:00", + "2025-05-06T00:00:00", + "2025-05-07T00:00:00", + "2025-05-08T00:00:00", + "2025-05-09T00:00:00", + "2025-05-12T00:00:00", + "2025-05-13T00:00:00", + "2025-05-14T00:00:00", + "2025-05-15T00:00:00", + "2025-05-16T00:00:00", + "2025-05-19T00:00:00", + "2025-05-20T00:00:00", + "2025-05-21T00:00:00", + "2025-05-22T00:00:00", + "2025-05-23T00:00:00", + "2025-05-27T00:00:00", + "2025-05-28T00:00:00", + "2025-05-29T00:00:00", + "2025-05-30T00:00:00", + "2025-06-02T00:00:00", + "2025-06-03T00:00:00", + "2025-06-04T00:00:00", + "2025-06-05T00:00:00", + "2025-06-06T00:00:00", + "2025-06-09T00:00:00", + "2025-06-10T00:00:00", + "2025-06-11T00:00:00", + "2025-06-12T00:00:00", + "2025-06-13T00:00:00", + "2025-06-16T00:00:00", + "2025-06-17T00:00:00", + "2025-06-18T00:00:00", + "2025-06-20T00:00:00", + "2025-06-23T00:00:00", + "2025-06-24T00:00:00", + "2025-06-25T00:00:00", + "2025-06-26T00:00:00", + "2025-06-27T00:00:00", + "2025-06-30T00:00:00", + "2025-07-01T00:00:00", + "2025-07-02T00:00:00", + "2025-07-03T00:00:00", + "2025-07-07T00:00:00", + "2025-07-08T00:00:00", + "2025-07-09T00:00:00", + "2025-07-10T00:00:00", + "2025-07-11T00:00:00", + "2025-07-14T00:00:00", + "2025-07-15T00:00:00", + "2025-07-16T00:00:00", + "2025-07-17T00:00:00", + "2025-07-18T00:00:00", + "2025-07-21T00:00:00", + "2025-07-22T00:00:00", + "2025-07-23T00:00:00", + "2025-07-24T00:00:00", + "2025-07-25T00:00:00", + "2025-07-28T00:00:00", + "2025-07-29T00:00:00", + "2025-07-30T00:00:00", + "2025-07-31T00:00:00", + "2025-08-01T00:00:00", + "2025-08-04T00:00:00", + "2025-08-05T00:00:00", + "2025-08-06T00:00:00", + "2025-08-07T00:00:00", + "2025-08-08T00:00:00", + "2025-08-11T00:00:00", + "2025-08-12T00:00:00", + "2025-08-13T00:00:00", + "2025-08-14T00:00:00", + "2025-08-15T00:00:00", + "2025-08-18T00:00:00", + "2025-08-19T00:00:00", + "2025-08-20T00:00:00", + "2025-08-21T00:00:00", + "2025-08-22T00:00:00", + "2025-08-25T00:00:00", + "2025-08-26T00:00:00", + "2025-08-27T00:00:00", + "2025-08-28T00:00:00", + "2025-08-29T00:00:00", + "2025-09-02T00:00:00", + "2025-09-03T00:00:00", + "2025-09-04T00:00:00", + "2025-09-05T00:00:00", + "2025-09-08T00:00:00", + "2025-09-09T00:00:00", + "2025-09-10T00:00:00", + "2025-09-11T00:00:00", + "2025-09-12T00:00:00", + "2025-09-15T00:00:00", + "2025-09-16T00:00:00", + "2025-09-17T00:00:00", + "2025-09-18T00:00:00", + "2025-09-19T00:00:00", + "2025-09-22T00:00:00", + "2025-09-23T00:00:00", + "2025-09-24T00:00:00", + "2025-09-25T00:00:00", + "2025-09-26T00:00:00", + "2025-09-29T00:00:00", + "2025-09-30T00:00:00", + "2025-10-01T00:00:00", + "2025-10-02T00:00:00", + "2025-10-03T00:00:00", + "2025-10-06T00:00:00", + "2025-10-07T00:00:00", + "2025-10-08T00:00:00", + "2025-10-09T00:00:00", + "2025-10-10T00:00:00", + "2025-10-13T00:00:00", + "2025-10-14T00:00:00", + "2025-10-15T00:00:00", + "2025-10-16T00:00:00", + "2025-10-17T00:00:00", + "2025-10-20T00:00:00", + "2025-10-21T00:00:00", + "2025-10-22T00:00:00", + "2025-10-23T00:00:00", + "2025-10-24T00:00:00", + "2025-10-27T00:00:00", + "2025-10-28T00:00:00", + "2025-10-29T00:00:00", + "2025-10-30T00:00:00", + "2025-10-31T00:00:00", + "2025-11-03T00:00:00", + "2025-11-04T00:00:00", + "2025-11-05T00:00:00", + "2025-11-06T00:00:00", + "2025-11-07T00:00:00", + "2025-11-10T00:00:00", + "2025-11-11T00:00:00", + "2025-11-12T00:00:00", + "2025-11-13T00:00:00", + "2025-11-14T00:00:00", + "2025-11-17T00:00:00", + "2025-11-18T00:00:00", + "2025-11-19T00:00:00", + "2025-11-20T00:00:00", + "2025-11-21T00:00:00", + "2025-11-24T00:00:00", + "2025-11-25T00:00:00", + "2025-11-26T00:00:00", + "2025-11-28T00:00:00", + "2025-12-01T00:00:00", + "2025-12-02T00:00:00", + "2025-12-03T00:00:00", + "2025-12-04T00:00:00", + "2025-12-05T00:00:00", + "2025-12-08T00:00:00", + "2025-12-09T00:00:00", + "2025-12-10T00:00:00", + "2025-12-11T00:00:00", + "2025-12-12T00:00:00", + "2025-12-15T00:00:00", + "2025-12-16T00:00:00", + "2025-12-17T00:00:00", + "2025-12-18T00:00:00", + "2025-12-19T00:00:00", + "2025-12-22T00:00:00", + "2025-12-23T00:00:00", + "2025-12-24T00:00:00", + "2025-12-26T00:00:00", + "2025-12-29T00:00:00", + "2025-12-30T00:00:00", + "2025-12-31T00:00:00", + "2026-01-02T00:00:00", + "2026-01-05T00:00:00", + "2026-01-06T00:00:00", + "2026-01-07T00:00:00", + "2026-01-08T00:00:00", + "2026-01-09T00:00:00", + "2026-01-12T00:00:00", + "2026-01-13T00:00:00", + "2026-01-14T00:00:00", + "2026-01-15T00:00:00", + "2026-01-16T00:00:00", + "2026-01-20T00:00:00", + "2026-01-21T00:00:00", + "2026-01-22T00:00:00", + "2026-01-23T00:00:00", + "2026-01-26T00:00:00", + "2026-01-27T00:00:00", + "2026-01-28T00:00:00", + "2026-01-29T00:00:00", + "2026-01-30T00:00:00" + ], + "xaxis": "x", + "y": { + "bdata": "AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/2w2v1wIrY0A6LfJ/ljdjQPhHgQg0RWNANnR0nk5SY0ChM5APol1jQBjViMUSaGNAXxgfvJBxY0BPO4cps3tjQLjj2ZKMhWNAgyARsIWPY0A6Vd6QZZpjQBWD20vdpWNAmvG/VHuxY0CdIt3qKL1jQN8cWNh8ymNA53agN/HXY0B7jzbCqeVjQLL8MCyB82NAp8KggGABZEBIIcdoGw9kQO25qQ96HmRAx8nvtLsvZEBmvLHHtD9kQL90omr6T2RACpngQpRcZECtBnNet2pkQD/F+MfGd2RAGIZaWoWFZECT0u2f3JJkQEGMRFaLoGRAeWBdrr6vZECxAaHDOsBkQL538Z7J0GRAfn8/nmPgZEAqVOw0j+9kQP1wHbhB/mRAdgSD3aMNZUAjgwWmzRxlQA==", + "dtype": "f8" + }, + "yaxis": "y" + }, + { + "line": { + "color": "purple" + }, + "mode": "lines", + "name": "adx", + "type": "scatter", + "x": [ + "2025-03-07T00:00:00", + "2025-03-10T00:00:00", + "2025-03-11T00:00:00", + "2025-03-12T00:00:00", + "2025-03-13T00:00:00", + "2025-03-14T00:00:00", + "2025-03-17T00:00:00", + "2025-03-18T00:00:00", + "2025-03-19T00:00:00", + "2025-03-20T00:00:00", + "2025-03-21T00:00:00", + "2025-03-24T00:00:00", + "2025-03-25T00:00:00", + "2025-03-26T00:00:00", + "2025-03-27T00:00:00", + "2025-03-28T00:00:00", + "2025-03-31T00:00:00", + "2025-04-01T00:00:00", + "2025-04-02T00:00:00", + "2025-04-03T00:00:00", + "2025-04-04T00:00:00", + "2025-04-07T00:00:00", + "2025-04-08T00:00:00", + "2025-04-09T00:00:00", + "2025-04-10T00:00:00", + "2025-04-11T00:00:00", + "2025-04-14T00:00:00", + "2025-04-15T00:00:00", + "2025-04-16T00:00:00", + "2025-04-17T00:00:00", + "2025-04-21T00:00:00", + "2025-04-22T00:00:00", + "2025-04-23T00:00:00", + "2025-04-24T00:00:00", + "2025-04-25T00:00:00", + "2025-04-28T00:00:00", + "2025-04-29T00:00:00", + "2025-04-30T00:00:00", + "2025-05-01T00:00:00", + "2025-05-02T00:00:00", + "2025-05-05T00:00:00", + "2025-05-06T00:00:00", + "2025-05-07T00:00:00", + "2025-05-08T00:00:00", + "2025-05-09T00:00:00", + "2025-05-12T00:00:00", + "2025-05-13T00:00:00", + "2025-05-14T00:00:00", + "2025-05-15T00:00:00", + "2025-05-16T00:00:00", + "2025-05-19T00:00:00", + "2025-05-20T00:00:00", + "2025-05-21T00:00:00", + "2025-05-22T00:00:00", + "2025-05-23T00:00:00", + "2025-05-27T00:00:00", + "2025-05-28T00:00:00", + "2025-05-29T00:00:00", + "2025-05-30T00:00:00", + "2025-06-02T00:00:00", + "2025-06-03T00:00:00", + "2025-06-04T00:00:00", + "2025-06-05T00:00:00", + "2025-06-06T00:00:00", + "2025-06-09T00:00:00", + "2025-06-10T00:00:00", + "2025-06-11T00:00:00", + "2025-06-12T00:00:00", + "2025-06-13T00:00:00", + "2025-06-16T00:00:00", + "2025-06-17T00:00:00", + "2025-06-18T00:00:00", + "2025-06-20T00:00:00", + "2025-06-23T00:00:00", + "2025-06-24T00:00:00", + "2025-06-25T00:00:00", + "2025-06-26T00:00:00", + "2025-06-27T00:00:00", + "2025-06-30T00:00:00", + "2025-07-01T00:00:00", + "2025-07-02T00:00:00", + "2025-07-03T00:00:00", + "2025-07-07T00:00:00", + "2025-07-08T00:00:00", + "2025-07-09T00:00:00", + "2025-07-10T00:00:00", + "2025-07-11T00:00:00", + "2025-07-14T00:00:00", + "2025-07-15T00:00:00", + "2025-07-16T00:00:00", + "2025-07-17T00:00:00", + "2025-07-18T00:00:00", + "2025-07-21T00:00:00", + "2025-07-22T00:00:00", + "2025-07-23T00:00:00", + "2025-07-24T00:00:00", + "2025-07-25T00:00:00", + "2025-07-28T00:00:00", + "2025-07-29T00:00:00", + "2025-07-30T00:00:00", + "2025-07-31T00:00:00", + "2025-08-01T00:00:00", + "2025-08-04T00:00:00", + "2025-08-05T00:00:00", + "2025-08-06T00:00:00", + "2025-08-07T00:00:00", + "2025-08-08T00:00:00", + "2025-08-11T00:00:00", + "2025-08-12T00:00:00", + "2025-08-13T00:00:00", + "2025-08-14T00:00:00", + "2025-08-15T00:00:00", + "2025-08-18T00:00:00", + "2025-08-19T00:00:00", + "2025-08-20T00:00:00", + "2025-08-21T00:00:00", + "2025-08-22T00:00:00", + "2025-08-25T00:00:00", + "2025-08-26T00:00:00", + "2025-08-27T00:00:00", + "2025-08-28T00:00:00", + "2025-08-29T00:00:00", + "2025-09-02T00:00:00", + "2025-09-03T00:00:00", + "2025-09-04T00:00:00", + "2025-09-05T00:00:00", + "2025-09-08T00:00:00", + "2025-09-09T00:00:00", + "2025-09-10T00:00:00", + "2025-09-11T00:00:00", + "2025-09-12T00:00:00", + "2025-09-15T00:00:00", + "2025-09-16T00:00:00", + "2025-09-17T00:00:00", + "2025-09-18T00:00:00", + "2025-09-19T00:00:00", + "2025-09-22T00:00:00", + "2025-09-23T00:00:00", + "2025-09-24T00:00:00", + "2025-09-25T00:00:00", + "2025-09-26T00:00:00", + "2025-09-29T00:00:00", + "2025-09-30T00:00:00", + "2025-10-01T00:00:00", + "2025-10-02T00:00:00", + "2025-10-03T00:00:00", + "2025-10-06T00:00:00", + "2025-10-07T00:00:00", + "2025-10-08T00:00:00", + "2025-10-09T00:00:00", + "2025-10-10T00:00:00", + "2025-10-13T00:00:00", + "2025-10-14T00:00:00", + "2025-10-15T00:00:00", + "2025-10-16T00:00:00", + "2025-10-17T00:00:00", + "2025-10-20T00:00:00", + "2025-10-21T00:00:00", + "2025-10-22T00:00:00", + "2025-10-23T00:00:00", + "2025-10-24T00:00:00", + "2025-10-27T00:00:00", + "2025-10-28T00:00:00", + "2025-10-29T00:00:00", + "2025-10-30T00:00:00", + "2025-10-31T00:00:00", + "2025-11-03T00:00:00", + "2025-11-04T00:00:00", + "2025-11-05T00:00:00", + "2025-11-06T00:00:00", + "2025-11-07T00:00:00", + "2025-11-10T00:00:00", + "2025-11-11T00:00:00", + "2025-11-12T00:00:00", + "2025-11-13T00:00:00", + "2025-11-14T00:00:00", + "2025-11-17T00:00:00", + "2025-11-18T00:00:00", + "2025-11-19T00:00:00", + "2025-11-20T00:00:00", + "2025-11-21T00:00:00", + "2025-11-24T00:00:00", + "2025-11-25T00:00:00", + "2025-11-26T00:00:00", + "2025-11-28T00:00:00", + "2025-12-01T00:00:00", + "2025-12-02T00:00:00", + "2025-12-03T00:00:00", + "2025-12-04T00:00:00", + "2025-12-05T00:00:00", + "2025-12-08T00:00:00", + "2025-12-09T00:00:00", + "2025-12-10T00:00:00", + "2025-12-11T00:00:00", + "2025-12-12T00:00:00", + "2025-12-15T00:00:00", + "2025-12-16T00:00:00", + "2025-12-17T00:00:00", + "2025-12-18T00:00:00", + "2025-12-19T00:00:00", + "2025-12-22T00:00:00", + "2025-12-23T00:00:00", + "2025-12-24T00:00:00", + "2025-12-26T00:00:00", + "2025-12-29T00:00:00", + "2025-12-30T00:00:00", + "2025-12-31T00:00:00", + "2026-01-02T00:00:00", + "2026-01-05T00:00:00", + "2026-01-06T00:00:00", + "2026-01-07T00:00:00", + "2026-01-08T00:00:00", + "2026-01-09T00:00:00", + "2026-01-12T00:00:00", + "2026-01-13T00:00:00", + "2026-01-14T00:00:00", + "2026-01-15T00:00:00", + "2026-01-16T00:00:00", + "2026-01-20T00:00:00", + "2026-01-21T00:00:00", + "2026-01-22T00:00:00", + "2026-01-23T00:00:00", + "2026-01-26T00:00:00", + "2026-01-27T00:00:00", + "2026-01-28T00:00:00", + "2026-01-29T00:00:00", + "2026-01-30T00:00:00" + ], + "xaxis": "x2", + "y": { + "bdata": "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", + "dtype": "f8" + }, + "yaxis": "y2" + }, + { + "line": { + "color": "orange" + }, + "mode": "lines", + "name": "atr", + "type": "scatter", + "x": [ + "2025-03-07T00:00:00", + "2025-03-10T00:00:00", + "2025-03-11T00:00:00", + "2025-03-12T00:00:00", + "2025-03-13T00:00:00", + "2025-03-14T00:00:00", + "2025-03-17T00:00:00", + "2025-03-18T00:00:00", + "2025-03-19T00:00:00", + "2025-03-20T00:00:00", + "2025-03-21T00:00:00", + "2025-03-24T00:00:00", + "2025-03-25T00:00:00", + "2025-03-26T00:00:00", + "2025-03-27T00:00:00", + "2025-03-28T00:00:00", + "2025-03-31T00:00:00", + "2025-04-01T00:00:00", + "2025-04-02T00:00:00", + "2025-04-03T00:00:00", + "2025-04-04T00:00:00", + "2025-04-07T00:00:00", + "2025-04-08T00:00:00", + "2025-04-09T00:00:00", + "2025-04-10T00:00:00", + "2025-04-11T00:00:00", + "2025-04-14T00:00:00", + "2025-04-15T00:00:00", + "2025-04-16T00:00:00", + "2025-04-17T00:00:00", + "2025-04-21T00:00:00", + "2025-04-22T00:00:00", + "2025-04-23T00:00:00", + "2025-04-24T00:00:00", + "2025-04-25T00:00:00", + "2025-04-28T00:00:00", + "2025-04-29T00:00:00", + "2025-04-30T00:00:00", + "2025-05-01T00:00:00", + "2025-05-02T00:00:00", + "2025-05-05T00:00:00", + "2025-05-06T00:00:00", + "2025-05-07T00:00:00", + "2025-05-08T00:00:00", + "2025-05-09T00:00:00", + "2025-05-12T00:00:00", + "2025-05-13T00:00:00", + "2025-05-14T00:00:00", + "2025-05-15T00:00:00", + "2025-05-16T00:00:00", + "2025-05-19T00:00:00", + "2025-05-20T00:00:00", + "2025-05-21T00:00:00", + "2025-05-22T00:00:00", + "2025-05-23T00:00:00", + "2025-05-27T00:00:00", + "2025-05-28T00:00:00", + "2025-05-29T00:00:00", + "2025-05-30T00:00:00", + "2025-06-02T00:00:00", + "2025-06-03T00:00:00", + "2025-06-04T00:00:00", + "2025-06-05T00:00:00", + "2025-06-06T00:00:00", + "2025-06-09T00:00:00", + "2025-06-10T00:00:00", + "2025-06-11T00:00:00", + "2025-06-12T00:00:00", + "2025-06-13T00:00:00", + "2025-06-16T00:00:00", + "2025-06-17T00:00:00", + "2025-06-18T00:00:00", + "2025-06-20T00:00:00", + "2025-06-23T00:00:00", + "2025-06-24T00:00:00", + "2025-06-25T00:00:00", + "2025-06-26T00:00:00", + "2025-06-27T00:00:00", + "2025-06-30T00:00:00", + "2025-07-01T00:00:00", + "2025-07-02T00:00:00", + "2025-07-03T00:00:00", + "2025-07-07T00:00:00", + "2025-07-08T00:00:00", + "2025-07-09T00:00:00", + "2025-07-10T00:00:00", + "2025-07-11T00:00:00", + "2025-07-14T00:00:00", + "2025-07-15T00:00:00", + "2025-07-16T00:00:00", + "2025-07-17T00:00:00", + "2025-07-18T00:00:00", + "2025-07-21T00:00:00", + "2025-07-22T00:00:00", + "2025-07-23T00:00:00", + "2025-07-24T00:00:00", + "2025-07-25T00:00:00", + "2025-07-28T00:00:00", + "2025-07-29T00:00:00", + "2025-07-30T00:00:00", + "2025-07-31T00:00:00", + "2025-08-01T00:00:00", + "2025-08-04T00:00:00", + "2025-08-05T00:00:00", + "2025-08-06T00:00:00", + "2025-08-07T00:00:00", + "2025-08-08T00:00:00", + "2025-08-11T00:00:00", + "2025-08-12T00:00:00", + "2025-08-13T00:00:00", + "2025-08-14T00:00:00", + "2025-08-15T00:00:00", + "2025-08-18T00:00:00", + "2025-08-19T00:00:00", + "2025-08-20T00:00:00", + "2025-08-21T00:00:00", + "2025-08-22T00:00:00", + "2025-08-25T00:00:00", + "2025-08-26T00:00:00", + "2025-08-27T00:00:00", + "2025-08-28T00:00:00", + "2025-08-29T00:00:00", + "2025-09-02T00:00:00", + "2025-09-03T00:00:00", + "2025-09-04T00:00:00", + "2025-09-05T00:00:00", + "2025-09-08T00:00:00", + "2025-09-09T00:00:00", + "2025-09-10T00:00:00", + "2025-09-11T00:00:00", + "2025-09-12T00:00:00", + "2025-09-15T00:00:00", + "2025-09-16T00:00:00", + "2025-09-17T00:00:00", + "2025-09-18T00:00:00", + "2025-09-19T00:00:00", + "2025-09-22T00:00:00", + "2025-09-23T00:00:00", + "2025-09-24T00:00:00", + "2025-09-25T00:00:00", + "2025-09-26T00:00:00", + "2025-09-29T00:00:00", + "2025-09-30T00:00:00", + "2025-10-01T00:00:00", + "2025-10-02T00:00:00", + "2025-10-03T00:00:00", + "2025-10-06T00:00:00", + "2025-10-07T00:00:00", + "2025-10-08T00:00:00", + "2025-10-09T00:00:00", + "2025-10-10T00:00:00", + "2025-10-13T00:00:00", + "2025-10-14T00:00:00", + "2025-10-15T00:00:00", + "2025-10-16T00:00:00", + "2025-10-17T00:00:00", + "2025-10-20T00:00:00", + "2025-10-21T00:00:00", + "2025-10-22T00:00:00", + "2025-10-23T00:00:00", + "2025-10-24T00:00:00", + "2025-10-27T00:00:00", + "2025-10-28T00:00:00", + "2025-10-29T00:00:00", + "2025-10-30T00:00:00", + "2025-10-31T00:00:00", + "2025-11-03T00:00:00", + "2025-11-04T00:00:00", + "2025-11-05T00:00:00", + "2025-11-06T00:00:00", + "2025-11-07T00:00:00", + "2025-11-10T00:00:00", + "2025-11-11T00:00:00", + "2025-11-12T00:00:00", + "2025-11-13T00:00:00", + "2025-11-14T00:00:00", + "2025-11-17T00:00:00", + "2025-11-18T00:00:00", + "2025-11-19T00:00:00", + "2025-11-20T00:00:00", + "2025-11-21T00:00:00", + "2025-11-24T00:00:00", + "2025-11-25T00:00:00", + "2025-11-26T00:00:00", + "2025-11-28T00:00:00", + "2025-12-01T00:00:00", + "2025-12-02T00:00:00", + "2025-12-03T00:00:00", + "2025-12-04T00:00:00", + "2025-12-05T00:00:00", + "2025-12-08T00:00:00", + "2025-12-09T00:00:00", + "2025-12-10T00:00:00", + "2025-12-11T00:00:00", + "2025-12-12T00:00:00", + "2025-12-15T00:00:00", + "2025-12-16T00:00:00", + "2025-12-17T00:00:00", + "2025-12-18T00:00:00", + "2025-12-19T00:00:00", + "2025-12-22T00:00:00", + "2025-12-23T00:00:00", + "2025-12-24T00:00:00", + "2025-12-26T00:00:00", + "2025-12-29T00:00:00", + "2025-12-30T00:00:00", + "2025-12-31T00:00:00", + "2026-01-02T00:00:00", + "2026-01-05T00:00:00", + "2026-01-06T00:00:00", + "2026-01-07T00:00:00", + "2026-01-08T00:00:00", + "2026-01-09T00:00:00", + "2026-01-12T00:00:00", + "2026-01-13T00:00:00", + "2026-01-14T00:00:00", + "2026-01-15T00:00:00", + "2026-01-16T00:00:00", + "2026-01-20T00:00:00", + "2026-01-21T00:00:00", + "2026-01-22T00:00:00", + "2026-01-23T00:00:00", + "2026-01-26T00:00:00", + "2026-01-27T00:00:00", + "2026-01-28T00:00:00", + "2026-01-29T00:00:00", + "2026-01-30T00:00:00" + ], + "xaxis": "x3", + "y": { + "bdata": "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", + "dtype": "f8" + }, + "yaxis": "y3" + } + ], + "layout": { + "height": 900, + "showlegend": true, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermap": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermap" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Strategy Indicators for LongBBandsTrend_SL" + }, + "width": 1000, + "xaxis": { + "anchor": "y", + "domain": [ + 0, + 1 + ], + "matches": "x3", + "rangebreaks": [ + { + "bounds": [ + "sat", + "mon" + ] + } + ], + "rangeslider": { + "visible": false + }, + "showticklabels": false + }, + "xaxis2": { + "anchor": "y2", + "domain": [ + 0, + 1 + ], + "matches": "x3", + "rangebreaks": [ + { + "bounds": [ + "sat", + "mon" + ] + } + ], + "showticklabels": false + }, + "xaxis3": { + "anchor": "y3", + "domain": [ + 0, + 1 + ], + "rangebreaks": [ + { + "bounds": [ + "sat", + "mon" + ] + } + ] + }, + "yaxis": { + "anchor": "x", + "domain": [ + 0.424, + 1 + ], + "title": { + "text": "Price" + }, + "type": "linear" + }, + "yaxis2": { + "anchor": "x2", + "domain": [ + 0.212, + 0.404 + ] + }, + "yaxis3": { + "anchor": "x3", + "domain": [ + 0, + 0.192 + ] + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "instance.get_strategy(\"NVDA\").plot_strategy_indicators(False)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "openbb_new_use", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/trade/datamanager/demos/test_load_data.ipynb b/trade/datamanager/demos/test_load_data.ipynb new file mode 100644 index 0000000..0b6afb2 --- /dev/null +++ b/trade/datamanager/demos/test_load_data.ipynb @@ -0,0 +1,2208 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "34fe7ce8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The autoreload extension is already loaded. To reload it, use:\n", + " %reload_ext autoreload\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/requests/__init__.py:86: RequestsDependencyWarning: Unable to find acceptable character detection dependency (chardet or charset_normalizer).\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2026-02-13 13:06:17 trade.helpers.Logging INFO: Logging Root Directory: /Users/chiemelienwanisobi/cloned_repos/QuantTools/logs\n", + "2026-02-13 13:06:17 [test] trade.helpers.clear_cache INFO: No expired caches to delete on 2026-02-13.\n", + "2026-02-13 13:06:20 [test] dbase.DataAPI.ThetaData.proxy INFO: Refreshed proxy URL: http://54.205.248.219:5500/thetadata\n", + "2026-02-13 13:06:20 [test] dbase.DataAPI.ThetaData.proxy INFO: Using Proxy URL: http://54.205.248.219:5500/thetadata\n", + "2026-02-13 13:06:20 [test] dbase.DataAPI.ThetaData INFO: Using V2 of the ThetaData API\n", + "Fetching rates data from yfinance directly during market hours\n", + "YF.download() has changed argument auto_adjust default to True\n" + ] + }, + { + "data": { + "text/plain": [ + "set()" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2\n", + "from trade.datamanager import (\n", + " DividendDataManager,\n", + " SpotDataManager,\n", + " OptionSpotDataManager,\n", + " VolDataManager,\n", + " RatesDataManager,\n", + " BaseDataManager,\n", + " ForwardDataManager,\n", + " GreekDataManager,\n", + " assert_synchronized_model,\n", + " get_option_theoretical_price,\n", + " calculate_scenarios,\n", + ")\n", + "\n", + "from trade.datamanager._enums import (\n", + " OptionSpotEndpointSource,\n", + " SeriesId,\n", + " OptionPricingModel,\n", + " VolatilityModel,\n", + " RealTimeFallbackOption,\n", + " GreekType,\n", + " ModelPrice,\n", + ")\n", + "from trade.optionlib.config.types import DivType\n", + "from trade.helpers.helper_types import SingletonMetaClass\n", + "from trade.datamanager.vars import get_loaded_names, TS\n", + "from trade.datamanager.utils.model import LoadRequest, _load_model_data_timeseries\n", + "from trade.datamanager.utils.logging import (\n", + " change_datamanager_factor_loggers_level,\n", + " change_datamanager_utils_logging_level,\n", + " change_logging_in_all_datamanager_loggers,\n", + " change_all_optionlib_loggers_level,\n", + ")\n", + "\n", + "# change_datamanager_factor_loggers_level(\"CRITICAL\")\n", + "# change_datamanager_utils_logging_level(\"CRITICAL\")\n", + "# change_logging_in_all_datamanager_loggers(\"CRITICAL\")\n", + "change_all_optionlib_loggers_level(\"CRITICAL\")\n", + "get_loaded_names()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "b8ff091c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2026-02-13 13:06:24 [test] trade.datamanager.base INFO: Clearing cache for DividendDataManager (CACHE_NAME='dividend_data_manager')\n", + "2026-02-13 13:06:24 [test] trade.datamanager.base INFO: Clearing cache for RatesDataManager (CACHE_NAME='rates_data_manager')\n", + "2026-02-13 13:06:24 [test] trade.datamanager.base INFO: Clearing cache for ForwardDataManager (CACHE_NAME='forward_data_manager')\n", + "2026-02-13 13:06:24 [test] trade.datamanager.base INFO: Clearing cache for OptionSpotDataManager (CACHE_NAME='option_spot_manager')\n", + "2026-02-13 13:06:24 [test] trade.datamanager.base INFO: Clearing cache for SpotDataManager (CACHE_NAME='spot_data_manager')\n", + "2026-02-13 13:06:24 [test] trade.datamanager.base INFO: Clearing cache for VolDataManager (CACHE_NAME='vol_data_manager_cache')\n", + "2026-02-13 13:06:24 [test] trade.datamanager.base INFO: Clearing cache for GreekDataManager (CACHE_NAME='greek_datamanager_cache')\n" + ] + } + ], + "source": [ + "BaseDataManager.clear_all_caches()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "c8cde08a", + "metadata": {}, + "outputs": [], + "source": [ + "## Vars\n", + "div = DivType.CONTINUOUS\n", + "undo_adjust = True\n", + "endpoint_source = OptionSpotEndpointSource.EOD\n", + "series_id = SeriesId.HIST\n", + "market_model = OptionPricingModel.BSM\n", + "vol_model = VolatilityModel.MARKET\n", + "model_price = ModelPrice.ASK\n", + "\n", + "symbol = \"SBUX\"\n", + "expiration = \"2026-09-18\"\n", + "right = \"C\"\n", + "strike = 100.0\n", + "ts_start = \"2025-01-01\"\n", + "ts_end = \"2026-01-28\"" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "9b108219", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2026-02-13 13:06:24 [test] trade.datamanager.vars INFO: Loading timeseries for SBUX...\n", + "2026-02-13 13:06:25 [test] trade.datamanager.utils INFO: Cutting off today's data for key: SBUX to avoid saving partial day data.\n", + "2026-02-13 13:06:25 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: SBUX with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:06:25 [test] trade.datamanager.market_data INFO: Loaded spot data for symbol SBUX into cache.\n", + "2026-02-13 13:06:25 [test] trade.datamanager.utils INFO: Cutting off today's data for key: SBUX to avoid saving partial day data.\n", + "2026-02-13 13:06:25 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: SBUX with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:06:25 [test] trade.datamanager.market_data INFO: Loaded chain spot data for symbol SBUX into cache.\n", + "2026-02-13 13:06:25 [test] trade.datamanager.market_data_helpers.dividends INFO: Ticker SBUX found in dividend cache.\n", + "2026-02-13 13:06:26 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: SBUX with date range 2017-01-02 to 2026-02-13, missing dates within range: []\n", + "2026-02-13 13:06:26 [test] trade.datamanager.market_data INFO: Loaded dividend data for symbol SBUX into cache.\n", + "2026-02-13 13:06:26 [test] trade.datamanager.utils INFO: Cutting off today's data for key: SBUX to avoid saving partial day data.\n", + "2026-02-13 13:06:26 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: SBUX with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:06:26 [test] trade.datamanager.market_data INFO: Loaded chain spot data for symbol SBUX into cache.\n", + "2026-02-13 13:06:26 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: SBUX with date range 2017-01-03 to 2026-02-13, missing dates within range: []\n", + "2026-02-13 13:06:26 [test] trade.datamanager.market_data INFO: Loaded split factor data for symbol SBUX into cache.\n", + "2026-02-13 13:06:26 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-13 13:06:27 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:06:27 [test] trade.datamanager.rates INFO: Cache partially covers requested date range for risk-free rate timeseries. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:06:30 [test] trade.datamanager.utils INFO: Max date 2026-01-28 for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D is not today. Skipping today's data check.\n", + "2026-02-13 13:06:30 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D with date range 2026-01-28 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:06:30 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-01-28 to 2026-01-28...\n", + "2026-02-13 13:06:30 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-13 13:06:30 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: SBUX.\n", + "2026-02-13 13:06:30 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: SBUX\n", + "2026-02-13 13:06:30 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-01-28 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-13 13:06:30 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: SBUX.\n", + "2026-02-13 13:06:30 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: SBUX\n", + "2026-02-13 13:06:30 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-01-28 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-13 13:06:30 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: SBUX.\n", + "2026-02-13 13:06:30 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: SBUX\n", + "2026-02-13 13:06:30 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-01-28 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-13 13:06:30 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: SBUX.\n", + "2026-02-13 13:06:30 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: SBUX\n", + "2026-02-13 13:06:30 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-01-28 00:00:00 to 2026-02-13 13:06:23.580580...\n", + "2026-02-13 13:06:30 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-13 13:06:30 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-13 13:06:30 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:SBUX|interval:eod|artifact_type:forward|series_id:hist|dividend_type:DISCRETE|maturity:2026-09-18|use_chain_spot:1\n", + "2026-02-13 13:06:30 [test] trade.datamanager.utils INFO: Max date 2026-01-28 for key: symbol:SBUX|interval:eod|artifact_type:forward|series_id:hist|dividend_type:DISCRETE|maturity:2026-09-18|use_chain_spot:1 is not today. Skipping today's data check.\n", + "2026-02-13 13:06:30 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:SBUX|interval:eod|artifact_type:forward|series_id:hist|dividend_type:DISCRETE|maturity:2026-09-18|use_chain_spot:1 with date range 2026-01-28 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:06:30 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-01-28 to 2026-01-28...\n", + "2026-02-13 13:06:30 [test] trade.datamanager.utils INFO: Using cached date range for 2026-01-28 00:00:00 - 2026-01-28 00:00:00 and option tick SBUX20260918C100\n", + "2026-02-13 13:06:30 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:SBUX|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:EOD|expiration:20260918T000000|right:C|strike:100\n", + "2026-02-13 13:06:30 [test] trade.datamanager.option_spot INFO: No cache found for option spot timeseries key: symbol:SBUX|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:EOD|expiration:20260918T000000|right:C|strike:100. Fetching from source.\n", + "\n", + "\n", + "Scheduled Data Requests will be saved to: /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/scheduler/requests.jsonl\n", + "2026-02-13 13:06:30 [test] DataManager.py CRITICAL: Using ProcessSaveManager for saving data.\n", + "2026-02-13 13:06:30 [test] trade.datamanager.utils INFO: Max date 2026-01-28 for key: symbol:SBUX|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:EOD|expiration:20260918T000000|right:C|strike:100 is not today. Skipping today's data check.\n", + "2026-02-13 13:06:30 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:SBUX|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:EOD|expiration:20260918T000000|right:C|strike:100 with date range 2026-01-28 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:06:30 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-01-28 to 2026-01-28...\n", + "2026-02-13 13:06:30 [test] trade.datamanager.vol INFO: VolDm Using specified dividend type: DivType.DISCRETE\n", + "2026-02-13 13:06:30 [test] trade.datamanager.vol INFO: VolDm Using model price: ModelPrice.ASK\n", + "2026-02-13 13:06:30 [test] trade.datamanager.utils INFO: Using cached date range for 2026-01-28 00:00:00 - 2026-01-28 00:00:00 and option tick SBUX20260918C100\n", + "2026-02-13 13:06:30 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market\n", + "2026-02-13 13:06:30 [test] trade.datamanager.utils INFO: No cache found for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market. Fetching from source.\n", + "2026-02-13 13:06:30 [test] trade.datamanager.utils INFO: No data requested to load in _load_model_data_timeseries(). Option: Symbol=SBUX, exp=2026-09-18 00:00:00, strike=100.0 right=C Load bools: d=False, r=False, s=False, f=False, opt_spot=False, vol=False, greek=False\n", + "2026-02-13 13:06:33 [test] trade.datamanager.utils INFO: Max date 2026-01-28 for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market is not today. Skipping today's data check.\n", + "2026-02-13 13:06:33 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market with date range 2026-01-28 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:06:33 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-01-28 to 2026-01-28...\n", + "2026-02-13 13:06:33 [test] trade.datamanager.utils INFO: Using cached date range for 2026-01-28 00:00:00 - 2026-01-28 00:00:00 and option tick SBUX20260918C100\n", + "2026-02-13 13:06:33 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:SBUX|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market\n", + "2026-02-13 13:06:33 [test] trade.datamanager.utils INFO: No cache found for key: symbol:SBUX|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market. Fetching from source.\n", + "2026-02-13 13:06:33 [test] trade.datamanager.utils INFO: No data requested to load in _load_model_data_timeseries(). Option: Symbol=SBUX, exp=2026-09-18 00:00:00, strike=100.0 right=C Load bools: d=False, r=False, s=False, f=False, opt_spot=False, vol=False, greek=False\n", + "2026-02-13 13:06:34 [test] trade.datamanager.utils INFO: Max date 2026-01-28 for key: symbol:SBUX|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market is not today. Skipping today's data check.\n", + "2026-02-13 13:06:34 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:SBUX|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market with date range 2026-01-28 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:06:34 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-01-28 to 2026-01-28...\n" + ] + } + ], + "source": [ + "request = LoadRequest(\n", + " symbol=symbol,\n", + " # start_date=ts_start,\n", + " # end_date=ts_end,\n", + " as_of=ts_end,\n", + " expiration=expiration,\n", + " strike=strike,\n", + " right=right,\n", + " series_id=SeriesId.HIST,\n", + " dividend_type=DivType.DISCRETE,\n", + " endpoint_source=OptionSpotEndpointSource.EOD,\n", + " vol_model=VolatilityModel.MARKET,\n", + " market_model=OptionPricingModel.BINOMIAL,\n", + " model_price=ModelPrice.ASK,\n", + " load_spot=True,\n", + " load_dividend=True,\n", + " load_forward=True,\n", + " load_option_spot=True,\n", + " load_vol=True,\n", + " load_greek=True,\n", + " load_rates=True,\n", + " undo_adjust=True,\n", + " # rt=True,\n", + ")\n", + "data_packet = _load_model_data_timeseries(request)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "a8aa6806", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data_packet.greek.fallback_option\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "ea740571", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Timestamp('2026-01-28 00:00:00')" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "request.end_date" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "03b201a3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2026-02-13 13:06:34 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-13 13:06:34 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-13 13:06:34 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-13 13:06:34 [test] trade.datamanager.utils INFO: Converting old cache data structure to new for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:06:34 [test] trade.datamanager.utils INFO: Cached data date range 2026-01-28 to 2026-01-28 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:06:34 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D. Fetching missing dates within range: []\n", + "2026-02-13 13:06:34 [test] trade.datamanager.rates INFO: Cache partially covers requested date range for risk-free rate timeseries. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:06:35 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D to avoid saving partial day data.\n", + "2026-02-13 13:06:35 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D with date range 2026-01-28 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:06:35 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 00:00:00 to 2026-02-13 00:00:00...\n", + "2026-02-13 13:06:35 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-13 13:06:35 [test] trade.datamanager.utils INFO: Cached data date range 2017-01-03 to 2026-02-12 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:06:35 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: SBUX. Fetching missing dates within range: []\n", + "2026-02-13 13:06:35 [test] trade.datamanager.utils INFO: Cutting off today's data for key: SBUX to avoid saving partial day data.\n", + "2026-02-13 13:06:35 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: SBUX with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:06:35 [test] trade.datamanager.market_data INFO: Loaded spot data for symbol SBUX into cache.\n", + "2026-02-13 13:06:35 [test] trade.datamanager.utils INFO: Cached data date range 2017-01-03 to 2026-02-12 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:06:35 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: SBUX. Fetching missing dates within range: []\n", + "2026-02-13 13:06:36 [test] trade.datamanager.utils INFO: Cutting off today's data for key: SBUX to avoid saving partial day data.\n", + "2026-02-13 13:06:36 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: SBUX with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:06:36 [test] trade.datamanager.market_data INFO: Loaded chain spot data for symbol SBUX into cache.\n", + "2026-02-13 13:06:36 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: SBUX.\n", + "2026-02-13 13:06:36 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: SBUX\n", + "2026-02-13 13:06:36 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 13:06:35.465650 to 2026-02-13 13:06:35.465650...\n", + "2026-02-13 13:06:36 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: SBUX.\n", + "2026-02-13 13:06:36 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: SBUX\n", + "2026-02-13 13:06:36 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 13:06:35.465650 to 2026-02-13 13:06:23.580580...\n", + "2026-02-13 13:06:36 [test] trade.datamanager.vol INFO: VolDm Using specified dividend type: DivType.DISCRETE\n", + "2026-02-13 13:06:36 [test] trade.datamanager.vol INFO: VolDm Using model price: ModelPrice.MIDPOINT\n", + "2026-02-13 13:06:36 [test] trade.datamanager.utils INFO: Using cached date range for 2026-02-13 00:00:00 - 2026-02-13 00:00:00 and option tick SBUX20260918C100\n", + "2026-02-13 13:06:36 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:20260918T000000|model_price:midpoint|n_steps:100|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market\n", + "2026-02-13 13:06:36 [test] trade.datamanager.utils INFO: No cache found for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:20260918T000000|model_price:midpoint|n_steps:100|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market. Fetching from source.\n", + "2026-02-13 13:06:36 [test] trade.datamanager.utils INFO: No data requested to load in _load_model_data_timeseries(). Option: Symbol=SBUX, exp=2026-09-18 00:00:00, strike=100.0 right=C Load bools: d=False, r=False, s=False, f=False, opt_spot=False, vol=False, greek=False\n", + "2026-02-13 13:06:36 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:20260918T000000|model_price:midpoint|n_steps:100|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market to avoid saving partial day data.\n", + "2026-02-13 13:06:36 [test] trade.datamanager.utils INFO: No data left to cache for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:20260918T000000|model_price:midpoint|n_steps:100|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market after removing today's data.\n", + "2026-02-13 13:06:36 [test] trade.datamanager.utils INFO: All data points are NaN for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:20260918T000000|model_price:midpoint|n_steps:100|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market. Not caching.\n", + "2026-02-13 13:06:36 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 to 2026-02-13...\n" + ] + } + ], + "source": [ + "bsm = calculate_scenarios(\n", + " symbol=symbol,\n", + " expiration=expiration,\n", + " right=right,\n", + " strike=strike,\n", + " return_pnl_in_pct=True,\n", + " return_pnl=True,\n", + " rt=True\n", + ")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "a648a8c7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2026-02-13 13:06:36 [test] trade.datamanager.utils INFO: Converting old cache data structure to new for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:06:36 [test] trade.datamanager.utils INFO: Cached data date range 2026-01-28 to 2026-01-28 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:06:36 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D. Fetching missing dates within range: []\n", + "2026-02-13 13:06:36 [test] trade.datamanager.rates INFO: Cache partially covers requested date range for risk-free rate timeseries. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:06:38 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D to avoid saving partial day data.\n", + "2026-02-13 13:06:38 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D with date range 2026-01-28 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:06:38 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 00:00:00 to 2026-02-13 00:00:00...\n" + ] + }, + { + "data": { + "text/plain": [ + "datetime\n", + "2026-02-13 0.03593\n", + "Name: annualized, dtype: float64" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "RatesDataManager().rt().timeseries" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "90745ffc", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2026-02-13 13:06:38 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-13 13:06:38 [test] trade.datamanager.utils INFO: Cached data date range 2017-01-03 to 2026-02-12 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:06:38 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: SBUX. Fetching missing dates within range: []\n", + "2026-02-13 13:06:38 [test] trade.datamanager.utils INFO: Cutting off today's data for key: SBUX to avoid saving partial day data.\n", + "2026-02-13 13:06:38 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: SBUX with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:06:38 [test] trade.datamanager.market_data INFO: Loaded spot data for symbol SBUX into cache.\n", + "2026-02-13 13:06:38 [test] trade.datamanager.utils INFO: Cached data date range 2017-01-03 to 2026-02-12 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:06:38 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: SBUX. Fetching missing dates within range: []\n", + "2026-02-13 13:06:38 [test] trade.datamanager.utils INFO: Cutting off today's data for key: SBUX to avoid saving partial day data.\n", + "2026-02-13 13:06:39 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: SBUX with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:06:39 [test] trade.datamanager.market_data INFO: Loaded chain spot data for symbol SBUX into cache.\n", + "2026-02-13 13:06:39 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: SBUX.\n", + "2026-02-13 13:06:39 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: SBUX\n", + "2026-02-13 13:06:39 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 13:06:38.310838 to 2026-02-13 13:06:38.310838...\n", + "2026-02-13 13:06:39 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: SBUX.\n", + "2026-02-13 13:06:39 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: SBUX\n", + "2026-02-13 13:06:39 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 13:06:38.310838 to 2026-02-13 13:06:23.580580...\n" + ] + }, + { + "data": { + "text/plain": [ + "datetime\n", + "2026-02-13 94.635002\n", + "Name: close, dtype: object" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "SpotDataManager(\"SBUX\").rt().timeseries" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "f15aff46", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
namedescriptiondailyannualized
Datetime
2026-02-02^IRX13 WEEK TREASURY BILL0.0000960.03578
\n", + "
" + ], + "text/plain": [ + " name description daily annualized\n", + "Datetime \n", + "2026-02-02 ^IRX 13 WEEK TREASURY BILL 0.000096 0.03578" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "RatesDataManager()._query_yfinance(\n", + " start_date=\"2026-02-02\",\n", + " end_date=\"2026-02-02\",\n", + " interval=\"1d\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "8a9eae24", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
0.900.951.001.051.10
-0.02-0.532749-0.326299-0.0726560.2276560.572091
-0.01-0.503521-0.293032-0.0362980.2658150.610556
0.00-0.474401-0.259855-0.0000030.3039450.649025
0.01-0.445382-0.2267600.0362330.3420450.687496
0.02-0.416455-0.1937440.0724140.3801160.725966
\n", + "
" + ], + "text/plain": [ + " 0.90 0.95 1.00 1.05 1.10\n", + "-0.02 -0.532749 -0.326299 -0.072656 0.227656 0.572091\n", + "-0.01 -0.503521 -0.293032 -0.036298 0.265815 0.610556\n", + " 0.00 -0.474401 -0.259855 -0.000003 0.303945 0.649025\n", + " 0.01 -0.445382 -0.226760 0.036233 0.342045 0.687496\n", + " 0.02 -0.416455 -0.193744 0.072414 0.380116 0.725966" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bsm.grid" + ] + }, + { + "cell_type": "markdown", + "id": "dc6c936a", + "metadata": {}, + "source": [ + "## Batch Load Real Time" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "ee6c306d", + "metadata": {}, + "outputs": [], + "source": [ + "option_metas = [\n", + " {\n", + " \"symbol\": \"SBUX\",\n", + " \"expiration\": \"2026-09-18\",\n", + " \"right\": \"C\",\n", + " \"strike\": 100.0,\n", + " },\n", + " {\n", + " \"symbol\": \"SBUX\",\n", + " \"expiration\": \"2026-09-18\",\n", + " \"right\": \"C\",\n", + " \"strike\": 105.0,\n", + " },\n", + " {\n", + " \"symbol\": \"AAPL\",\n", + " \"expiration\": \"2026-09-18\",\n", + " \"right\": \"C\",\n", + " \"strike\": 260.0,\n", + " },\n", + " {\n", + " \"symbol\": \"AAPL\",\n", + " \"expiration\": \"2026-09-18\",\n", + " \"right\": \"C\",\n", + " \"strike\": 265.0,\n", + " },\n", + " {\n", + " \"symbol\": \"AMD\",\n", + " \"expiration\": \"2026-09-18\",\n", + " \"right\": \"C\",\n", + " \"strike\": 280.0,\n", + " },\n", + " {\n", + " \"symbol\": \"AMD\",\n", + " \"expiration\": \"2026-09-18\",\n", + " \"right\": \"C\",\n", + " \"strike\": 290.0,\n", + " },\n", + " {\n", + " \"symbol\": \"META\",\n", + " \"expiration\": \"2026-09-18\",\n", + " \"right\": \"C\",\n", + " \"strike\": 890.0,\n", + " },\n", + " {\n", + " \"symbol\": \"META\",\n", + " \"expiration\": \"2026-09-18\",\n", + " \"right\": \"C\",\n", + " \"strike\": 900.0,\n", + " }\n", + "]" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "bc83fa2d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2026-02-13 13:06:41 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-13 13:06:41 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-13 13:06:41 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-13 13:06:41 [test] trade.datamanager.utils INFO: Converting old cache data structure to new for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:06:41 [test] trade.datamanager.utils INFO: Cached data date range 2026-01-28 to 2026-01-28 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:06:41 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D. Fetching missing dates within range: []\n", + "2026-02-13 13:06:41 [test] trade.datamanager.rates INFO: Cache partially covers requested date range for risk-free rate timeseries. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:06:41 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D to avoid saving partial day data.\n", + "2026-02-13 13:06:41 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D with date range 2026-01-28 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:06:41 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 00:00:00 to 2026-02-13 00:00:00...\n", + "2026-02-13 13:06:41 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-13 13:06:41 [test] trade.datamanager.utils INFO: Cached data date range 2017-01-03 to 2026-02-12 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:06:41 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: SBUX. Fetching missing dates within range: []\n", + "2026-02-13 13:06:41 [test] trade.datamanager.utils INFO: Cutting off today's data for key: SBUX to avoid saving partial day data.\n", + "2026-02-13 13:06:41 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: SBUX with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:06:41 [test] trade.datamanager.market_data INFO: Loaded spot data for symbol SBUX into cache.\n", + "2026-02-13 13:06:42 [test] trade.datamanager.utils INFO: Cached data date range 2017-01-03 to 2026-02-12 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:06:42 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: SBUX. Fetching missing dates within range: []\n", + "2026-02-13 13:06:42 [test] trade.datamanager.utils INFO: Cutting off today's data for key: SBUX to avoid saving partial day data.\n", + "2026-02-13 13:06:42 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: SBUX with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:06:42 [test] trade.datamanager.market_data INFO: Loaded chain spot data for symbol SBUX into cache.\n", + "2026-02-13 13:06:42 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: SBUX.\n", + "2026-02-13 13:06:42 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: SBUX\n", + "2026-02-13 13:06:42 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 13:06:41.614002 to 2026-02-13 13:06:41.614002...\n", + "2026-02-13 13:06:42 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: SBUX.\n", + "2026-02-13 13:06:42 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: SBUX\n", + "2026-02-13 13:06:42 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 13:06:41.614002 to 2026-02-13 13:06:23.580580...\n", + "2026-02-13 13:06:42 [test] trade.datamanager.vol INFO: VolDm Using specified dividend type: DivType.DISCRETE\n", + "2026-02-13 13:06:42 [test] trade.datamanager.vol INFO: VolDm Using model price: ModelPrice.MIDPOINT\n", + "2026-02-13 13:06:42 [test] trade.datamanager.utils INFO: Using cached date range for 2026-02-13 00:00:00 - 2026-02-13 00:00:00 and option tick SBUX20260918C100\n", + "2026-02-13 13:06:42 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:20260918T000000|model_price:midpoint|n_steps:100|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market\n", + "2026-02-13 13:06:42 [test] trade.datamanager.utils INFO: No cache found for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:20260918T000000|model_price:midpoint|n_steps:100|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market. Fetching from source.\n", + "2026-02-13 13:06:42 [test] trade.datamanager.utils INFO: No data requested to load in _load_model_data_timeseries(). Option: Symbol=SBUX, exp=2026-09-18 00:00:00, strike=100.0 right=C Load bools: d=False, r=False, s=False, f=False, opt_spot=False, vol=False, greek=False\n", + "2026-02-13 13:06:42 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:20260918T000000|model_price:midpoint|n_steps:100|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market to avoid saving partial day data.\n", + "2026-02-13 13:06:42 [test] trade.datamanager.utils INFO: No data left to cache for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:20260918T000000|model_price:midpoint|n_steps:100|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market after removing today's data.\n", + "2026-02-13 13:06:42 [test] trade.datamanager.utils INFO: All data points are NaN for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:20260918T000000|model_price:midpoint|n_steps:100|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market. Not caching.\n", + "2026-02-13 13:06:42 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 to 2026-02-13...\n", + "2026-02-13 13:06:42 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-13 13:06:42 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-13 13:06:42 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-13 13:06:42 [test] trade.datamanager.utils INFO: Converting old cache data structure to new for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:06:42 [test] trade.datamanager.utils INFO: Cached data date range 2026-01-28 to 2026-01-28 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:06:42 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D. Fetching missing dates within range: []\n", + "2026-02-13 13:06:42 [test] trade.datamanager.rates INFO: Cache partially covers requested date range for risk-free rate timeseries. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:06:44 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D to avoid saving partial day data.\n", + "2026-02-13 13:06:44 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D with date range 2026-01-28 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:06:44 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 00:00:00 to 2026-02-13 00:00:00...\n", + "2026-02-13 13:06:44 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-13 13:06:44 [test] trade.datamanager.utils INFO: Cached data date range 2017-01-03 to 2026-02-12 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:06:44 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: SBUX. Fetching missing dates within range: []\n", + "2026-02-13 13:06:44 [test] trade.datamanager.utils INFO: Cutting off today's data for key: SBUX to avoid saving partial day data.\n", + "2026-02-13 13:06:44 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: SBUX with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:06:44 [test] trade.datamanager.market_data INFO: Loaded spot data for symbol SBUX into cache.\n", + "2026-02-13 13:06:44 [test] trade.datamanager.utils INFO: Cached data date range 2017-01-03 to 2026-02-12 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:06:44 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: SBUX. Fetching missing dates within range: []\n", + "2026-02-13 13:06:45 [test] trade.datamanager.utils INFO: Cutting off today's data for key: SBUX to avoid saving partial day data.\n", + "2026-02-13 13:06:45 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: SBUX with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:06:45 [test] trade.datamanager.market_data INFO: Loaded chain spot data for symbol SBUX into cache.\n", + "2026-02-13 13:06:45 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: SBUX.\n", + "2026-02-13 13:06:45 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: SBUX\n", + "2026-02-13 13:06:45 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 13:06:44.306921 to 2026-02-13 13:06:44.306921...\n", + "2026-02-13 13:06:45 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: SBUX.\n", + "2026-02-13 13:06:45 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: SBUX\n", + "2026-02-13 13:06:45 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 13:06:44.306921 to 2026-02-13 13:06:23.580580...\n", + "2026-02-13 13:06:45 [test] trade.datamanager.vol INFO: VolDm Using specified dividend type: DivType.DISCRETE\n", + "2026-02-13 13:06:45 [test] trade.datamanager.vol INFO: VolDm Using model price: ModelPrice.MIDPOINT\n", + "2026-02-13 13:06:45 [test] trade.datamanager.utils INFO: Using cached date range for 2026-02-13 00:00:00 - 2026-02-13 00:00:00 and option tick SBUX20260918C105\n", + "2026-02-13 13:06:45 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:20260918T000000|model_price:midpoint|n_steps:100|option_pricing_model:Binomial|right:C|strike:105|volatility_model:market\n", + "2026-02-13 13:06:45 [test] trade.datamanager.utils INFO: No cache found for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:20260918T000000|model_price:midpoint|n_steps:100|option_pricing_model:Binomial|right:C|strike:105|volatility_model:market. Fetching from source.\n", + "2026-02-13 13:06:45 [test] trade.datamanager.utils INFO: No data requested to load in _load_model_data_timeseries(). Option: Symbol=SBUX, exp=2026-09-18 00:00:00, strike=105.0 right=C Load bools: d=False, r=False, s=False, f=False, opt_spot=False, vol=False, greek=False\n", + "2026-02-13 13:06:45 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:20260918T000000|model_price:midpoint|n_steps:100|option_pricing_model:Binomial|right:C|strike:105|volatility_model:market to avoid saving partial day data.\n", + "2026-02-13 13:06:45 [test] trade.datamanager.utils INFO: No data left to cache for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:20260918T000000|model_price:midpoint|n_steps:100|option_pricing_model:Binomial|right:C|strike:105|volatility_model:market after removing today's data.\n", + "2026-02-13 13:06:45 [test] trade.datamanager.utils INFO: All data points are NaN for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:20260918T000000|model_price:midpoint|n_steps:100|option_pricing_model:Binomial|right:C|strike:105|volatility_model:market. Not caching.\n", + "2026-02-13 13:06:45 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 to 2026-02-13...\n", + "2026-02-13 13:06:45 [test] trade.datamanager.vars INFO: Loading timeseries for AAPL...\n", + "2026-02-13 13:06:45 [test] trade.datamanager.utils INFO: Cutting off today's data for key: AAPL to avoid saving partial day data.\n", + "2026-02-13 13:06:45 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: AAPL with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:06:45 [test] trade.datamanager.market_data INFO: Loaded spot data for symbol AAPL into cache.\n", + "2026-02-13 13:06:46 [test] trade.datamanager.utils INFO: Cutting off today's data for key: AAPL to avoid saving partial day data.\n", + "2026-02-13 13:06:46 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: AAPL with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:06:46 [test] trade.datamanager.market_data INFO: Loaded chain spot data for symbol AAPL into cache.\n", + "2026-02-13 13:06:46 [test] trade.datamanager.market_data_helpers.dividends INFO: Ticker AAPL found in dividend cache.\n", + "2026-02-13 13:06:46 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: AAPL with date range 2017-01-02 to 2026-02-13, missing dates within range: []\n", + "2026-02-13 13:06:46 [test] trade.datamanager.market_data INFO: Loaded dividend data for symbol AAPL into cache.\n", + "2026-02-13 13:06:47 [test] trade.datamanager.utils INFO: Cutting off today's data for key: AAPL to avoid saving partial day data.\n", + "2026-02-13 13:06:47 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: AAPL with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:06:47 [test] trade.datamanager.market_data INFO: Loaded chain spot data for symbol AAPL into cache.\n", + "2026-02-13 13:06:47 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: AAPL with date range 2017-01-03 to 2026-02-13, missing dates within range: []\n", + "2026-02-13 13:06:47 [test] trade.datamanager.market_data INFO: Loaded split factor data for symbol AAPL into cache.\n", + "2026-02-13 13:06:47 [test] trade.datamanager.vars INFO: Timeseries for AAPL already loaded.\n", + "2026-02-13 13:06:47 [test] trade.datamanager.vars INFO: Timeseries for AAPL already loaded.\n", + "2026-02-13 13:06:47 [test] trade.datamanager.utils INFO: Converting old cache data structure to new for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:06:47 [test] trade.datamanager.utils INFO: Cached data date range 2026-01-28 to 2026-01-28 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:06:47 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D. Fetching missing dates within range: []\n", + "2026-02-13 13:06:47 [test] trade.datamanager.rates INFO: Cache partially covers requested date range for risk-free rate timeseries. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:06:50 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D to avoid saving partial day data.\n", + "2026-02-13 13:06:50 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D with date range 2026-01-28 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:06:50 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 00:00:00 to 2026-02-13 00:00:00...\n", + "2026-02-13 13:06:50 [test] trade.datamanager.vars INFO: Timeseries for AAPL already loaded.\n", + "2026-02-13 13:06:50 [test] trade.datamanager.utils INFO: Cached data date range 2017-01-03 to 2026-02-12 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:06:50 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: AAPL. Fetching missing dates within range: []\n", + "2026-02-13 13:06:50 [test] trade.datamanager.utils INFO: Cutting off today's data for key: AAPL to avoid saving partial day data.\n", + "2026-02-13 13:06:50 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: AAPL with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:06:50 [test] trade.datamanager.market_data INFO: Loaded spot data for symbol AAPL into cache.\n", + "2026-02-13 13:06:50 [test] trade.datamanager.utils INFO: Cached data date range 2017-01-03 to 2026-02-12 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:06:50 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: AAPL. Fetching missing dates within range: []\n", + "2026-02-13 13:06:51 [test] trade.datamanager.utils INFO: Cutting off today's data for key: AAPL to avoid saving partial day data.\n", + "2026-02-13 13:06:51 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: AAPL with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:06:51 [test] trade.datamanager.market_data INFO: Loaded chain spot data for symbol AAPL into cache.\n", + "2026-02-13 13:06:51 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: AAPL.\n", + "2026-02-13 13:06:51 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: AAPL\n", + "2026-02-13 13:06:51 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 13:06:50.458073 to 2026-02-13 13:06:50.458073...\n", + "2026-02-13 13:06:51 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: AAPL.\n", + "2026-02-13 13:06:51 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: AAPL\n", + "2026-02-13 13:06:51 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 13:06:50.458073 to 2026-02-13 13:06:23.580580...\n", + "2026-02-13 13:06:51 [test] trade.datamanager.vol INFO: VolDm Using specified dividend type: DivType.DISCRETE\n", + "2026-02-13 13:06:51 [test] trade.datamanager.vol INFO: VolDm Using model price: ModelPrice.MIDPOINT\n", + "2026-02-13 13:06:51 [test] trade.datamanager.utils INFO: Using cached date range for 2026-02-13 00:00:00 - 2026-02-13 00:00:00 and option tick AAPL20260918C260\n", + "2026-02-13 13:06:51 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:AAPL|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:20260918T000000|model_price:midpoint|n_steps:100|option_pricing_model:Binomial|right:C|strike:260|volatility_model:market\n", + "2026-02-13 13:06:51 [test] trade.datamanager.utils INFO: No cache found for key: symbol:AAPL|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:20260918T000000|model_price:midpoint|n_steps:100|option_pricing_model:Binomial|right:C|strike:260|volatility_model:market. Fetching from source.\n", + "2026-02-13 13:06:51 [test] trade.datamanager.utils INFO: No data requested to load in _load_model_data_timeseries(). Option: Symbol=AAPL, exp=2026-09-18 00:00:00, strike=260.0 right=C Load bools: d=False, r=False, s=False, f=False, opt_spot=False, vol=False, greek=False\n", + "2026-02-13 13:06:51 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:AAPL|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:20260918T000000|model_price:midpoint|n_steps:100|option_pricing_model:Binomial|right:C|strike:260|volatility_model:market to avoid saving partial day data.\n", + "2026-02-13 13:06:51 [test] trade.datamanager.utils INFO: No data left to cache for key: symbol:AAPL|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:20260918T000000|model_price:midpoint|n_steps:100|option_pricing_model:Binomial|right:C|strike:260|volatility_model:market after removing today's data.\n", + "2026-02-13 13:06:51 [test] trade.datamanager.utils INFO: All data points are NaN for key: symbol:AAPL|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:20260918T000000|model_price:midpoint|n_steps:100|option_pricing_model:Binomial|right:C|strike:260|volatility_model:market. Not caching.\n", + "2026-02-13 13:06:51 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 to 2026-02-13...\n", + "2026-02-13 13:06:51 [test] trade.datamanager.vars INFO: Timeseries for AAPL already loaded.\n", + "2026-02-13 13:06:51 [test] trade.datamanager.vars INFO: Timeseries for AAPL already loaded.\n", + "2026-02-13 13:06:51 [test] trade.datamanager.vars INFO: Timeseries for AAPL already loaded.\n", + "2026-02-13 13:06:51 [test] trade.datamanager.utils INFO: Converting old cache data structure to new for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:06:51 [test] trade.datamanager.utils INFO: Cached data date range 2026-01-28 to 2026-01-28 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:06:51 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D. Fetching missing dates within range: []\n", + "2026-02-13 13:06:51 [test] trade.datamanager.rates INFO: Cache partially covers requested date range for risk-free rate timeseries. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:06:53 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D to avoid saving partial day data.\n", + "2026-02-13 13:06:53 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D with date range 2026-01-28 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:06:53 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 00:00:00 to 2026-02-13 00:00:00...\n", + "2026-02-13 13:06:53 [test] trade.datamanager.vars INFO: Timeseries for AAPL already loaded.\n", + "2026-02-13 13:06:53 [test] trade.datamanager.utils INFO: Cached data date range 2017-01-03 to 2026-02-12 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:06:53 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: AAPL. Fetching missing dates within range: []\n", + "2026-02-13 13:06:53 [test] trade.datamanager.utils INFO: Cutting off today's data for key: AAPL to avoid saving partial day data.\n", + "2026-02-13 13:06:53 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: AAPL with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:06:53 [test] trade.datamanager.market_data INFO: Loaded spot data for symbol AAPL into cache.\n", + "2026-02-13 13:06:53 [test] trade.datamanager.utils INFO: Cached data date range 2017-01-03 to 2026-02-12 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:06:53 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: AAPL. Fetching missing dates within range: []\n", + "2026-02-13 13:06:54 [test] trade.datamanager.utils INFO: Cutting off today's data for key: AAPL to avoid saving partial day data.\n", + "2026-02-13 13:06:54 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: AAPL with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:06:54 [test] trade.datamanager.market_data INFO: Loaded chain spot data for symbol AAPL into cache.\n", + "2026-02-13 13:06:54 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: AAPL.\n", + "2026-02-13 13:06:54 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: AAPL\n", + "2026-02-13 13:06:54 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 13:06:53.379358 to 2026-02-13 13:06:53.379358...\n", + "2026-02-13 13:06:54 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: AAPL.\n", + "2026-02-13 13:06:54 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: AAPL\n", + "2026-02-13 13:06:54 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 13:06:53.379358 to 2026-02-13 13:06:23.580580...\n", + "2026-02-13 13:06:54 [test] trade.datamanager.vol INFO: VolDm Using specified dividend type: DivType.DISCRETE\n", + "2026-02-13 13:06:54 [test] trade.datamanager.vol INFO: VolDm Using model price: ModelPrice.MIDPOINT\n", + "2026-02-13 13:06:54 [test] trade.datamanager.utils INFO: Using cached date range for 2026-02-13 00:00:00 - 2026-02-13 00:00:00 and option tick AAPL20260918C265\n", + "2026-02-13 13:06:54 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:AAPL|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:20260918T000000|model_price:midpoint|n_steps:100|option_pricing_model:Binomial|right:C|strike:265|volatility_model:market\n", + "2026-02-13 13:06:54 [test] trade.datamanager.utils INFO: No cache found for key: symbol:AAPL|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:20260918T000000|model_price:midpoint|n_steps:100|option_pricing_model:Binomial|right:C|strike:265|volatility_model:market. Fetching from source.\n", + "2026-02-13 13:06:54 [test] trade.datamanager.utils INFO: No data requested to load in _load_model_data_timeseries(). Option: Symbol=AAPL, exp=2026-09-18 00:00:00, strike=265.0 right=C Load bools: d=False, r=False, s=False, f=False, opt_spot=False, vol=False, greek=False\n", + "2026-02-13 13:06:54 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:AAPL|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:20260918T000000|model_price:midpoint|n_steps:100|option_pricing_model:Binomial|right:C|strike:265|volatility_model:market to avoid saving partial day data.\n", + "2026-02-13 13:06:54 [test] trade.datamanager.utils INFO: No data left to cache for key: symbol:AAPL|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:20260918T000000|model_price:midpoint|n_steps:100|option_pricing_model:Binomial|right:C|strike:265|volatility_model:market after removing today's data.\n", + "2026-02-13 13:06:54 [test] trade.datamanager.utils INFO: All data points are NaN for key: symbol:AAPL|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:20260918T000000|model_price:midpoint|n_steps:100|option_pricing_model:Binomial|right:C|strike:265|volatility_model:market. Not caching.\n", + "2026-02-13 13:06:54 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 to 2026-02-13...\n", + "2026-02-13 13:06:54 [test] trade.datamanager.vars INFO: Loading timeseries for AMD...\n", + "2026-02-13 13:06:54 [test] trade.datamanager.utils INFO: Cutting off today's data for key: AMD to avoid saving partial day data.\n", + "2026-02-13 13:06:54 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: AMD with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:06:55 [test] trade.datamanager.market_data INFO: Loaded spot data for symbol AMD into cache.\n", + "2026-02-13 13:06:55 [test] trade.datamanager.utils INFO: Cutting off today's data for key: AMD to avoid saving partial day data.\n", + "2026-02-13 13:06:55 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: AMD with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:06:55 [test] trade.datamanager.market_data INFO: Loaded chain spot data for symbol AMD into cache.\n", + "2026-02-13 13:06:55 [test] trade.datamanager.market_data_helpers.dividends INFO: Ticker AMD found in dividend cache.\n", + "2026-02-13 13:06:55 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: AMD with date range 2017-01-02 to 2026-02-13, missing dates within range: []\n", + "2026-02-13 13:06:55 [test] trade.datamanager.market_data INFO: Loaded dividend data for symbol AMD into cache.\n", + "2026-02-13 13:06:56 [test] trade.datamanager.utils INFO: Cutting off today's data for key: AMD to avoid saving partial day data.\n", + "2026-02-13 13:06:56 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: AMD with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:06:56 [test] trade.datamanager.market_data INFO: Loaded chain spot data for symbol AMD into cache.\n", + "2026-02-13 13:06:56 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: AMD with date range 2017-01-03 to 2026-02-13, missing dates within range: []\n", + "2026-02-13 13:06:56 [test] trade.datamanager.market_data INFO: Loaded split factor data for symbol AMD into cache.\n", + "2026-02-13 13:06:56 [test] trade.datamanager.vars INFO: Timeseries for AMD already loaded.\n", + "2026-02-13 13:06:56 [test] trade.datamanager.vars INFO: Timeseries for AMD already loaded.\n", + "2026-02-13 13:06:56 [test] trade.datamanager.utils INFO: Converting old cache data structure to new for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:06:56 [test] trade.datamanager.utils INFO: Cached data date range 2026-01-28 to 2026-01-28 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:06:56 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D. Fetching missing dates within range: []\n", + "2026-02-13 13:06:56 [test] trade.datamanager.rates INFO: Cache partially covers requested date range for risk-free rate timeseries. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:06:59 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D to avoid saving partial day data.\n", + "2026-02-13 13:06:59 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D with date range 2026-01-28 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:06:59 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 00:00:00 to 2026-02-13 00:00:00...\n", + "2026-02-13 13:06:59 [test] trade.datamanager.vars INFO: Timeseries for AMD already loaded.\n", + "2026-02-13 13:06:59 [test] trade.datamanager.utils INFO: Cached data date range 2017-01-03 to 2026-02-12 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:06:59 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: AMD. Fetching missing dates within range: []\n", + "2026-02-13 13:06:59 [test] trade.datamanager.utils INFO: Cutting off today's data for key: AMD to avoid saving partial day data.\n", + "2026-02-13 13:06:59 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: AMD with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:06:59 [test] trade.datamanager.market_data INFO: Loaded spot data for symbol AMD into cache.\n", + "2026-02-13 13:06:59 [test] trade.datamanager.utils INFO: Cached data date range 2017-01-03 to 2026-02-12 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:06:59 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: AMD. Fetching missing dates within range: []\n", + "2026-02-13 13:06:59 [test] trade.datamanager.utils INFO: Cutting off today's data for key: AMD to avoid saving partial day data.\n", + "2026-02-13 13:06:59 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: AMD with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:06:59 [test] trade.datamanager.market_data INFO: Loaded chain spot data for symbol AMD into cache.\n", + "2026-02-13 13:06:59 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: AMD.\n", + "2026-02-13 13:06:59 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: AMD\n", + "2026-02-13 13:06:59 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 13:06:59.164806 to 2026-02-13 13:06:59.164806...\n", + "2026-02-13 13:06:59 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: AMD.\n", + "2026-02-13 13:06:59 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: AMD\n", + "2026-02-13 13:06:59 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 13:06:59.164806 to 2026-02-13 13:06:23.580580...\n", + "2026-02-13 13:07:00 [test] trade.datamanager.vol INFO: VolDm Using specified dividend type: DivType.DISCRETE\n", + "2026-02-13 13:07:00 [test] trade.datamanager.vol INFO: VolDm Using model price: ModelPrice.MIDPOINT\n", + "2026-02-13 13:07:00 [test] trade.datamanager.utils INFO: Using cached date range for 2026-02-13 00:00:00 - 2026-02-13 00:00:00 and option tick AMD20260918C280\n", + "2026-02-13 13:07:00 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:AMD|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:20260918T000000|model_price:midpoint|n_steps:100|option_pricing_model:Binomial|right:C|strike:280|volatility_model:market\n", + "2026-02-13 13:07:00 [test] trade.datamanager.utils INFO: No cache found for key: symbol:AMD|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:20260918T000000|model_price:midpoint|n_steps:100|option_pricing_model:Binomial|right:C|strike:280|volatility_model:market. Fetching from source.\n", + "2026-02-13 13:07:00 [test] trade.datamanager.utils INFO: No data requested to load in _load_model_data_timeseries(). Option: Symbol=AMD, exp=2026-09-18 00:00:00, strike=280.0 right=C Load bools: d=False, r=False, s=False, f=False, opt_spot=False, vol=False, greek=False\n", + "2026-02-13 13:07:00 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:AMD|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:20260918T000000|model_price:midpoint|n_steps:100|option_pricing_model:Binomial|right:C|strike:280|volatility_model:market to avoid saving partial day data.\n", + "2026-02-13 13:07:00 [test] trade.datamanager.utils INFO: No data left to cache for key: symbol:AMD|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:20260918T000000|model_price:midpoint|n_steps:100|option_pricing_model:Binomial|right:C|strike:280|volatility_model:market after removing today's data.\n", + "2026-02-13 13:07:00 [test] trade.datamanager.utils INFO: All data points are NaN for key: symbol:AMD|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:20260918T000000|model_price:midpoint|n_steps:100|option_pricing_model:Binomial|right:C|strike:280|volatility_model:market. Not caching.\n", + "2026-02-13 13:07:00 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 to 2026-02-13...\n", + "2026-02-13 13:07:00 [test] trade.datamanager.vars INFO: Timeseries for AMD already loaded.\n", + "2026-02-13 13:07:00 [test] trade.datamanager.vars INFO: Timeseries for AMD already loaded.\n", + "2026-02-13 13:07:00 [test] trade.datamanager.vars INFO: Timeseries for AMD already loaded.\n", + "2026-02-13 13:07:00 [test] trade.datamanager.utils INFO: Converting old cache data structure to new for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:07:00 [test] trade.datamanager.utils INFO: Cached data date range 2026-01-28 to 2026-01-28 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:07:00 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D. Fetching missing dates within range: []\n", + "2026-02-13 13:07:00 [test] trade.datamanager.rates INFO: Cache partially covers requested date range for risk-free rate timeseries. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:07:01 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D to avoid saving partial day data.\n", + "2026-02-13 13:07:01 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D with date range 2026-01-28 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:07:01 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 00:00:00 to 2026-02-13 00:00:00...\n", + "2026-02-13 13:07:01 [test] trade.datamanager.vars INFO: Timeseries for AMD already loaded.\n", + "2026-02-13 13:07:01 [test] trade.datamanager.utils INFO: Cached data date range 2017-01-03 to 2026-02-12 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:07:01 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: AMD. Fetching missing dates within range: []\n", + "2026-02-13 13:07:02 [test] trade.datamanager.utils INFO: Cutting off today's data for key: AMD to avoid saving partial day data.\n", + "2026-02-13 13:07:02 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: AMD with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:07:02 [test] trade.datamanager.market_data INFO: Loaded spot data for symbol AMD into cache.\n", + "2026-02-13 13:07:02 [test] trade.datamanager.utils INFO: Cached data date range 2017-01-03 to 2026-02-12 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:07:02 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: AMD. Fetching missing dates within range: []\n", + "2026-02-13 13:07:02 [test] trade.datamanager.utils INFO: Cutting off today's data for key: AMD to avoid saving partial day data.\n", + "2026-02-13 13:07:02 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: AMD with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:07:02 [test] trade.datamanager.market_data INFO: Loaded chain spot data for symbol AMD into cache.\n", + "2026-02-13 13:07:02 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: AMD.\n", + "2026-02-13 13:07:02 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: AMD\n", + "2026-02-13 13:07:02 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 13:07:01.944640 to 2026-02-13 13:07:01.944640...\n", + "2026-02-13 13:07:02 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: AMD.\n", + "2026-02-13 13:07:02 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: AMD\n", + "2026-02-13 13:07:02 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 13:07:01.944640 to 2026-02-13 13:06:23.580580...\n", + "2026-02-13 13:07:02 [test] trade.datamanager.vol INFO: VolDm Using specified dividend type: DivType.DISCRETE\n", + "2026-02-13 13:07:02 [test] trade.datamanager.vol INFO: VolDm Using model price: ModelPrice.MIDPOINT\n", + "2026-02-13 13:07:02 [test] trade.datamanager.utils INFO: Using cached date range for 2026-02-13 00:00:00 - 2026-02-13 00:00:00 and option tick AMD20260918C290\n", + "2026-02-13 13:07:03 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:AMD|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:20260918T000000|model_price:midpoint|n_steps:100|option_pricing_model:Binomial|right:C|strike:290|volatility_model:market\n", + "2026-02-13 13:07:03 [test] trade.datamanager.utils INFO: No cache found for key: symbol:AMD|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:20260918T000000|model_price:midpoint|n_steps:100|option_pricing_model:Binomial|right:C|strike:290|volatility_model:market. Fetching from source.\n", + "2026-02-13 13:07:03 [test] trade.datamanager.utils INFO: No data requested to load in _load_model_data_timeseries(). Option: Symbol=AMD, exp=2026-09-18 00:00:00, strike=290.0 right=C Load bools: d=False, r=False, s=False, f=False, opt_spot=False, vol=False, greek=False\n", + "2026-02-13 13:07:03 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:AMD|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:20260918T000000|model_price:midpoint|n_steps:100|option_pricing_model:Binomial|right:C|strike:290|volatility_model:market to avoid saving partial day data.\n", + "2026-02-13 13:07:03 [test] trade.datamanager.utils INFO: No data left to cache for key: symbol:AMD|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:20260918T000000|model_price:midpoint|n_steps:100|option_pricing_model:Binomial|right:C|strike:290|volatility_model:market after removing today's data.\n", + "2026-02-13 13:07:03 [test] trade.datamanager.utils INFO: All data points are NaN for key: symbol:AMD|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:20260918T000000|model_price:midpoint|n_steps:100|option_pricing_model:Binomial|right:C|strike:290|volatility_model:market. Not caching.\n", + "2026-02-13 13:07:03 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 to 2026-02-13...\n", + "2026-02-13 13:07:03 [test] trade.datamanager.vars INFO: Loading timeseries for META...\n", + "2026-02-13 13:07:03 [test] trade.datamanager.utils INFO: Cutting off today's data for key: META to avoid saving partial day data.\n", + "2026-02-13 13:07:03 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: META with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:07:03 [test] trade.datamanager.market_data INFO: Loaded spot data for symbol META into cache.\n", + "2026-02-13 13:07:03 [test] trade.datamanager.utils INFO: Cutting off today's data for key: META to avoid saving partial day data.\n", + "2026-02-13 13:07:03 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: META with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:07:03 [test] trade.datamanager.market_data INFO: Loaded chain spot data for symbol META into cache.\n", + "2026-02-13 13:07:03 [test] trade.datamanager.market_data_helpers.dividends INFO: Ticker META found in dividend cache.\n", + "2026-02-13 13:07:03 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: META with date range 2024-02-21 to 2026-02-13, missing dates within range: []\n", + "2026-02-13 13:07:03 [test] trade.datamanager.market_data INFO: Loaded dividend data for symbol META into cache.\n", + "2026-02-13 13:07:04 [test] trade.datamanager.utils INFO: Cutting off today's data for key: META to avoid saving partial day data.\n", + "2026-02-13 13:07:04 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: META with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:07:04 [test] trade.datamanager.market_data INFO: Loaded chain spot data for symbol META into cache.\n", + "2026-02-13 13:07:04 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: META with date range 2017-01-03 to 2026-02-13, missing dates within range: []\n", + "2026-02-13 13:07:04 [test] trade.datamanager.market_data INFO: Loaded split factor data for symbol META into cache.\n", + "2026-02-13 13:07:04 [test] trade.datamanager.vars INFO: Timeseries for META already loaded.\n", + "2026-02-13 13:07:04 [test] trade.datamanager.vars INFO: Timeseries for META already loaded.\n", + "2026-02-13 13:07:05 [test] trade.datamanager.utils INFO: Converting old cache data structure to new for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:07:05 [test] trade.datamanager.utils INFO: Cached data date range 2026-01-28 to 2026-01-28 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:07:05 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D. Fetching missing dates within range: []\n", + "2026-02-13 13:07:05 [test] trade.datamanager.rates INFO: Cache partially covers requested date range for risk-free rate timeseries. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:07:07 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D to avoid saving partial day data.\n", + "2026-02-13 13:07:07 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D with date range 2026-01-28 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:07:07 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 00:00:00 to 2026-02-13 00:00:00...\n", + "2026-02-13 13:07:07 [test] trade.datamanager.vars INFO: Timeseries for META already loaded.\n", + "2026-02-13 13:07:07 [test] trade.datamanager.utils INFO: Cached data date range 2017-01-03 to 2026-02-12 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:07:07 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: META. Fetching missing dates within range: []\n", + "2026-02-13 13:07:07 [test] trade.datamanager.utils INFO: Cutting off today's data for key: META to avoid saving partial day data.\n", + "2026-02-13 13:07:07 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: META with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:07:07 [test] trade.datamanager.market_data INFO: Loaded spot data for symbol META into cache.\n", + "2026-02-13 13:07:07 [test] trade.datamanager.utils INFO: Cached data date range 2017-01-03 to 2026-02-12 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:07:07 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: META. Fetching missing dates within range: []\n", + "2026-02-13 13:07:08 [test] trade.datamanager.utils INFO: Cutting off today's data for key: META to avoid saving partial day data.\n", + "2026-02-13 13:07:08 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: META with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:07:08 [test] trade.datamanager.market_data INFO: Loaded chain spot data for symbol META into cache.\n", + "2026-02-13 13:07:08 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: META.\n", + "2026-02-13 13:07:08 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: META\n", + "2026-02-13 13:07:08 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 13:07:07.578534 to 2026-02-13 13:07:07.578534...\n", + "2026-02-13 13:07:08 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: META.\n", + "2026-02-13 13:07:08 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: META\n", + "2026-02-13 13:07:08 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 13:07:07.578534 to 2026-02-13 13:06:23.580580...\n", + "2026-02-13 13:07:08 [test] trade.datamanager.vol INFO: VolDm Using specified dividend type: DivType.DISCRETE\n", + "2026-02-13 13:07:08 [test] trade.datamanager.vol INFO: VolDm Using model price: ModelPrice.MIDPOINT\n", + "2026-02-13 13:07:08 [test] trade.datamanager.utils INFO: Using cached date range for 2026-02-13 00:00:00 - 2026-02-13 00:00:00 and option tick META20260918C890\n", + "2026-02-13 13:07:08 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:META|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:20260918T000000|model_price:midpoint|n_steps:100|option_pricing_model:Binomial|right:C|strike:890|volatility_model:market\n", + "2026-02-13 13:07:08 [test] trade.datamanager.utils INFO: No cache found for key: symbol:META|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:20260918T000000|model_price:midpoint|n_steps:100|option_pricing_model:Binomial|right:C|strike:890|volatility_model:market. Fetching from source.\n", + "2026-02-13 13:07:08 [test] trade.datamanager.utils INFO: No data requested to load in _load_model_data_timeseries(). Option: Symbol=META, exp=2026-09-18 00:00:00, strike=890.0 right=C Load bools: d=False, r=False, s=False, f=False, opt_spot=False, vol=False, greek=False\n", + "2026-02-13 13:07:08 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:META|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:20260918T000000|model_price:midpoint|n_steps:100|option_pricing_model:Binomial|right:C|strike:890|volatility_model:market to avoid saving partial day data.\n", + "2026-02-13 13:07:08 [test] trade.datamanager.utils INFO: No data left to cache for key: symbol:META|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:20260918T000000|model_price:midpoint|n_steps:100|option_pricing_model:Binomial|right:C|strike:890|volatility_model:market after removing today's data.\n", + "2026-02-13 13:07:08 [test] trade.datamanager.utils INFO: All data points are NaN for key: symbol:META|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:20260918T000000|model_price:midpoint|n_steps:100|option_pricing_model:Binomial|right:C|strike:890|volatility_model:market. Not caching.\n", + "2026-02-13 13:07:08 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 to 2026-02-13...\n", + "2026-02-13 13:07:08 [test] trade.datamanager.vars INFO: Timeseries for META already loaded.\n", + "2026-02-13 13:07:08 [test] trade.datamanager.vars INFO: Timeseries for META already loaded.\n", + "2026-02-13 13:07:08 [test] trade.datamanager.vars INFO: Timeseries for META already loaded.\n", + "2026-02-13 13:07:08 [test] trade.datamanager.utils INFO: Converting old cache data structure to new for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:07:08 [test] trade.datamanager.utils INFO: Cached data date range 2026-01-28 to 2026-01-28 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:07:08 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D. Fetching missing dates within range: []\n", + "2026-02-13 13:07:08 [test] trade.datamanager.rates INFO: Cache partially covers requested date range for risk-free rate timeseries. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:07:10 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D to avoid saving partial day data.\n", + "2026-02-13 13:07:10 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D with date range 2026-01-28 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:07:10 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 00:00:00 to 2026-02-13 00:00:00...\n", + "2026-02-13 13:07:10 [test] trade.datamanager.vars INFO: Timeseries for META already loaded.\n", + "2026-02-13 13:07:10 [test] trade.datamanager.utils INFO: Cached data date range 2017-01-03 to 2026-02-12 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:07:10 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: META. Fetching missing dates within range: []\n", + "2026-02-13 13:07:10 [test] trade.datamanager.utils INFO: Cutting off today's data for key: META to avoid saving partial day data.\n", + "2026-02-13 13:07:10 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: META with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:07:10 [test] trade.datamanager.market_data INFO: Loaded spot data for symbol META into cache.\n", + "2026-02-13 13:07:11 [test] trade.datamanager.utils INFO: Cached data date range 2017-01-03 to 2026-02-12 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:07:11 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: META. Fetching missing dates within range: []\n", + "2026-02-13 13:07:11 [test] trade.datamanager.utils INFO: Cutting off today's data for key: META to avoid saving partial day data.\n", + "2026-02-13 13:07:11 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: META with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:07:11 [test] trade.datamanager.market_data INFO: Loaded chain spot data for symbol META into cache.\n", + "2026-02-13 13:07:11 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: META.\n", + "2026-02-13 13:07:11 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: META\n", + "2026-02-13 13:07:11 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 13:07:10.598489 to 2026-02-13 13:07:10.598489...\n", + "2026-02-13 13:07:11 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: META.\n", + "2026-02-13 13:07:11 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: META\n", + "2026-02-13 13:07:11 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 13:07:10.598489 to 2026-02-13 13:06:23.580580...\n", + "2026-02-13 13:07:11 [test] trade.datamanager.vol INFO: VolDm Using specified dividend type: DivType.DISCRETE\n", + "2026-02-13 13:07:11 [test] trade.datamanager.vol INFO: VolDm Using model price: ModelPrice.MIDPOINT\n", + "2026-02-13 13:07:11 [test] trade.datamanager.utils INFO: Using cached date range for 2026-02-13 00:00:00 - 2026-02-13 00:00:00 and option tick META20260918C900\n", + "2026-02-13 13:07:11 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:META|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:20260918T000000|model_price:midpoint|n_steps:100|option_pricing_model:Binomial|right:C|strike:900|volatility_model:market\n", + "2026-02-13 13:07:11 [test] trade.datamanager.utils INFO: No cache found for key: symbol:META|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:20260918T000000|model_price:midpoint|n_steps:100|option_pricing_model:Binomial|right:C|strike:900|volatility_model:market. Fetching from source.\n", + "2026-02-13 13:07:11 [test] trade.datamanager.utils INFO: No data requested to load in _load_model_data_timeseries(). Option: Symbol=META, exp=2026-09-18 00:00:00, strike=900.0 right=C Load bools: d=False, r=False, s=False, f=False, opt_spot=False, vol=False, greek=False\n", + "2026-02-13 13:07:11 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:META|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:20260918T000000|model_price:midpoint|n_steps:100|option_pricing_model:Binomial|right:C|strike:900|volatility_model:market to avoid saving partial day data.\n", + "2026-02-13 13:07:11 [test] trade.datamanager.utils INFO: No data left to cache for key: symbol:META|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:20260918T000000|model_price:midpoint|n_steps:100|option_pricing_model:Binomial|right:C|strike:900|volatility_model:market after removing today's data.\n", + "2026-02-13 13:07:11 [test] trade.datamanager.utils INFO: All data points are NaN for key: symbol:META|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:quote|expiration:20260918T000000|model_price:midpoint|n_steps:100|option_pricing_model:Binomial|right:C|strike:900|volatility_model:market. Not caching.\n", + "2026-02-13 13:07:11 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 to 2026-02-13...\n" + ] + } + ], + "source": [ + "full_data = []\n", + "for option_meta in option_metas:\n", + " option_scenarios = calculate_scenarios(\n", + " symbol=option_meta[\"symbol\"],\n", + " expiration=option_meta[\"expiration\"],\n", + " right=option_meta[\"right\"],\n", + " strike=option_meta[\"strike\"],\n", + " return_pnl_in_pct=True,\n", + " return_pnl=True,\n", + " rt=True\n", + " )\n", + " full_data.append(option_scenarios)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "f1250b16", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2026-02-13 13:07:11 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-13 13:07:11 [test] trade.datamanager.dividend INFO: Using provided dividend_type: DivType.DISCRETE\n", + "2026-02-13 13:07:11 [test] trade.datamanager.dividend INFO: Fetching discrete dividend schedule timeseries for SBUX from 2025-01-01 00:00:00 to 2026-01-28 00:00:00 with maturity 2026-09-18 00:00:00\n", + "2026-02-13 13:07:11 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:SBUX|interval:eod|artifact_type:divs|series_id:hist|current_state:SCHEDULE_TIMESERIES|lookback_years:1|maturity:2026-09-18|method:CONSTANT|undo_adjust:1\n", + "2026-02-13 13:07:11 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-13 13:07:11 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: SBUX.\n", + "2026-02-13 13:07:11 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: SBUX\n", + "2026-02-13 13:07:11 [test] trade.datamanager.utils INFO: Sanitizing data from 2017-01-03 00:00:00 to 2026-02-13 13:06:23.580580...\n", + "2026-02-13 13:07:11 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-01 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-13 13:07:11 [test] trade.datamanager.utils INFO: Max date 2026-01-28 for key: symbol:SBUX|interval:eod|artifact_type:divs|series_id:hist|current_state:SCHEDULE_TIMESERIES|lookback_years:1|maturity:2026-09-18|method:CONSTANT|undo_adjust:1 is not today. Skipping today's data check.\n", + "2026-02-13 13:07:11 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:SBUX|interval:eod|artifact_type:divs|series_id:hist|current_state:SCHEDULE_TIMESERIES|lookback_years:1|maturity:2026-09-18|method:CONSTANT|undo_adjust:1 with date range 2025-01-02 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:07:11 [test] trade.datamanager.utils INFO: Converting old cache data structure to new for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:07:11 [test] trade.datamanager.utils INFO: Cached data date range 2026-01-28 to 2026-01-28 does not cover requested range 2025-01-02 to 2026-01-28.\n", + "2026-02-13 13:07:11 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D. Fetching missing dates within range: []\n", + "2026-02-13 13:07:11 [test] trade.datamanager.rates INFO: Cache partially covers requested date range for risk-free rate timeseries. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:07:13 [test] trade.datamanager.utils INFO: Max date 2026-01-28 for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D is not today. Skipping today's data check.\n", + "2026-02-13 13:07:13 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D with date range 2025-01-02 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:07:13 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-02 00:00:00 to 2026-01-27 00:00:00...\n", + "2026-02-13 13:07:13 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-13 13:07:13 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: SBUX.\n", + "2026-02-13 13:07:13 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: SBUX\n", + "2026-02-13 13:07:13 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-02 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-13 13:07:13 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-01 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-13 13:07:13 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-13 13:07:13 [test] trade.datamanager.utils INFO: Converting old cache data structure to new for key: symbol:SBUX|interval:eod|artifact_type:forward|series_id:hist|dividend_type:DISCRETE|maturity:2026-09-18|use_chain_spot:1\n", + "2026-02-13 13:07:13 [test] trade.datamanager.utils INFO: Cached data date range 2026-01-28 to 2026-01-28 does not cover requested range 2025-01-02 to 2026-01-28.\n", + "2026-02-13 13:07:13 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: symbol:SBUX|interval:eod|artifact_type:forward|series_id:hist|dividend_type:DISCRETE|maturity:2026-09-18|use_chain_spot:1. Fetching missing dates within range: []\n", + "2026-02-13 13:07:13 [test] trade.datamanager.utils INFO: Max date 2026-01-28 for key: symbol:SBUX|interval:eod|artifact_type:forward|series_id:hist|dividend_type:DISCRETE|maturity:2026-09-18|use_chain_spot:1 is not today. Skipping today's data check.\n", + "2026-02-13 13:07:13 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:SBUX|interval:eod|artifact_type:forward|series_id:hist|dividend_type:DISCRETE|maturity:2026-09-18|use_chain_spot:1 with date range 2025-01-02 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:07:13 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-01 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-13 13:07:13 [test] trade.datamanager.utils INFO: Using cached date range for 2025-01-01 00:00:00 - 2026-01-28 00:00:00 and option tick SBUX20260918C100\n", + "2026-02-13 13:07:13 [test] trade.datamanager.utils INFO: Converting old cache data structure to new for key: symbol:SBUX|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:EOD|expiration:20260918T000000|right:C|strike:100\n", + "2026-02-13 13:07:13 [test] trade.datamanager.utils INFO: Cached data date range 2026-01-28 to 2026-01-28 does not cover requested range 2025-05-23 to 2026-01-28.\n", + "2026-02-13 13:07:13 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: symbol:SBUX|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:EOD|expiration:20260918T000000|right:C|strike:100. Fetching missing dates within range: []\n", + "2026-02-13 13:07:13 [test] trade.datamanager.option_spot INFO: Cache partially covers requested date range for option spot timeseries. Key: symbol:SBUX|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:EOD|expiration:20260918T000000|right:C|strike:100. Fetching missing dates.\n", + "2026-02-13 13:07:14 [test] trade.datamanager.utils INFO: Max date 2026-01-28 for key: symbol:SBUX|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:EOD|expiration:20260918T000000|right:C|strike:100 is not today. Skipping today's data check.\n", + "2026-02-13 13:07:14 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:SBUX|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:EOD|expiration:20260918T000000|right:C|strike:100 with date range 2025-05-23 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:07:14 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-05-23 to 2026-01-28...\n", + "2026-02-13 13:07:14 [test] trade.datamanager.vol INFO: VolDm Using specified dividend type: DivType.DISCRETE\n", + "2026-02-13 13:07:14 [test] trade.datamanager.vol INFO: VolDm Using model price: ModelPrice.ASK\n", + "2026-02-13 13:07:14 [test] trade.datamanager.utils INFO: Using cached date range for 2025-01-01 00:00:00 - 2026-01-28 00:00:00 and option tick SBUX20260918C100\n", + "2026-02-13 13:07:14 [test] trade.datamanager.utils INFO: Converting old cache data structure to new for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market\n", + "2026-02-13 13:07:14 [test] trade.datamanager.utils INFO: Cached data date range 2026-01-28 to 2026-01-28 does not cover requested range 2025-05-23 to 2026-01-28.\n", + "2026-02-13 13:07:14 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market. Fetching missing dates within range: []\n", + "2026-02-13 13:07:14 [test] trade.datamanager.utils INFO: Cache partially covers requested date range. Key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market. Fetching missing dates.\n", + "2026-02-13 13:07:14 [test] trade.datamanager.utils INFO: No data requested to load in _load_model_data_timeseries(). Option: Symbol=SBUX, exp=2026-09-18 00:00:00, strike=100.0 right=C Load bools: d=False, r=False, s=False, f=False, opt_spot=False, vol=False, greek=False\n", + "2026-02-13 13:07:14 [test] trade.datamanager.utils INFO: Max date 2026-01-28 for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market is not today. Skipping today's data check.\n", + "2026-02-13 13:07:14 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market with date range 2025-05-23 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:07:14 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-05-23 to 2026-01-28...\n", + "2026-02-13 13:07:14 [test] trade.datamanager.utils INFO: Using cached date range for 2025-01-01 00:00:00 - 2026-01-28 00:00:00 and option tick SBUX20260918C100\n", + "2026-02-13 13:07:14 [test] trade.datamanager.utils INFO: Converting old cache data structure to new for key: symbol:SBUX|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market\n", + "2026-02-13 13:07:15 [test] trade.datamanager.utils INFO: Cached data date range 2026-01-28 to 2026-01-28 does not cover requested range 2025-05-23 to 2026-01-28.\n", + "2026-02-13 13:07:15 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: symbol:SBUX|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market. Fetching missing dates within range: []\n", + "2026-02-13 13:07:15 [test] trade.datamanager.utils INFO: Cache partially covers requested date range. Key: symbol:SBUX|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market. Fetching missing dates.\n", + "2026-02-13 13:07:15 [test] trade.datamanager.utils INFO: No data requested to load in _load_model_data_timeseries(). Option: Symbol=SBUX, exp=2026-09-18 00:00:00, strike=100.0 right=C Load bools: d=False, r=False, s=False, f=False, opt_spot=False, vol=False, greek=False\n", + "2026-02-13 13:07:15 [test] trade.datamanager.utils INFO: Max date 2026-01-28 for key: symbol:SBUX|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market is not today. Skipping today's data check.\n", + "2026-02-13 13:07:15 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:SBUX|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market with date range 2025-05-23 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:07:15 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-05-23 to 2026-01-28...\n", + "2026-02-13 13:07:15 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-13 13:07:15 [test] trade.datamanager.dividend INFO: Using provided dividend_type: DivType.DISCRETE\n", + "2026-02-13 13:07:15 [test] trade.datamanager.dividend INFO: Fetching discrete dividend schedule timeseries for SBUX from 2025-01-01 00:00:00 to 2026-01-28 00:00:00 with maturity 2026-09-18 00:00:00\n", + "2026-02-13 13:07:15 [test] trade.datamanager.utils INFO: Converting old cache data structure to new for key: symbol:SBUX|interval:eod|artifact_type:divs|series_id:hist|current_state:SCHEDULE_TIMESERIES|lookback_years:1|maturity:2026-09-18|method:CONSTANT|undo_adjust:1\n", + "2026-02-13 13:07:15 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: symbol:SBUX|interval:eod|artifact_type:divs|series_id:hist|current_state:SCHEDULE_TIMESERIES|lookback_years:1|maturity:2026-09-18|method:CONSTANT|undo_adjust:1.\n", + "2026-02-13 13:07:15 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: symbol:SBUX|interval:eod|artifact_type:divs|series_id:hist|current_state:SCHEDULE_TIMESERIES|lookback_years:1|maturity:2026-09-18|method:CONSTANT|undo_adjust:1\n", + "2026-02-13 13:07:15 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-02 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-13 13:07:15 [test] trade.datamanager.dividend INFO: Cache hit for discrete schedule timeseries key: symbol:SBUX|interval:eod|artifact_type:divs|series_id:hist|current_state:SCHEDULE_TIMESERIES|lookback_years:1|maturity:2026-09-18|method:CONSTANT|undo_adjust:1\n", + "2026-02-13 13:07:15 [test] trade.datamanager.dividend INFO: Cache fully covers requested date range for timeseries. Key: symbol:SBUX|interval:eod|artifact_type:divs|series_id:hist|current_state:SCHEDULE_TIMESERIES|lookback_years:1|maturity:2026-09-18|method:CONSTANT|undo_adjust:1\n", + "2026-02-13 13:07:15 [test] trade.datamanager.utils INFO: Converting old cache data structure to new for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:07:15 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D.\n", + "2026-02-13 13:07:15 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:07:15 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-02 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-13 13:07:15 [test] trade.datamanager.rates INFO: Cache fully covers requested date range for risk-free rate timeseries. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:07:15 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-02 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-13 13:07:15 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-13 13:07:15 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: SBUX.\n", + "2026-02-13 13:07:15 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: SBUX\n", + "2026-02-13 13:07:15 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-02 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-13 13:07:15 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-01 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-13 13:07:15 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-13 13:07:15 [test] trade.datamanager.utils INFO: Converting old cache data structure to new for key: symbol:SBUX|interval:eod|artifact_type:forward|series_id:hist|dividend_type:DISCRETE|maturity:2026-09-18|use_chain_spot:1\n", + "2026-02-13 13:07:15 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: symbol:SBUX|interval:eod|artifact_type:forward|series_id:hist|dividend_type:DISCRETE|maturity:2026-09-18|use_chain_spot:1.\n", + "2026-02-13 13:07:15 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: symbol:SBUX|interval:eod|artifact_type:forward|series_id:hist|dividend_type:DISCRETE|maturity:2026-09-18|use_chain_spot:1\n", + "2026-02-13 13:07:15 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-02 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-13 13:07:15 [test] trade.datamanager.forward INFO: Cache hit for forward timeseries key: symbol:SBUX|interval:eod|artifact_type:forward|series_id:hist|dividend_type:DISCRETE|maturity:2026-09-18|use_chain_spot:1\n", + "2026-02-13 13:07:15 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-01 to 2026-01-28...\n", + "2026-02-13 13:07:15 [test] trade.datamanager.utils INFO: Using cached date range for 2025-01-01 00:00:00 - 2026-01-28 00:00:00 and option tick SBUX20260918C105\n", + "2026-02-13 13:07:15 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:SBUX|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:EOD|expiration:20260918T000000|right:C|strike:105\n", + "2026-02-13 13:07:15 [test] trade.datamanager.option_spot INFO: No cache found for option spot timeseries key: symbol:SBUX|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:EOD|expiration:20260918T000000|right:C|strike:105. Fetching from source.\n", + "2026-02-13 13:07:16 [test] trade.datamanager.utils INFO: Max date 2026-01-28 for key: symbol:SBUX|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:EOD|expiration:20260918T000000|right:C|strike:105 is not today. Skipping today's data check.\n", + "2026-02-13 13:07:16 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:SBUX|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:EOD|expiration:20260918T000000|right:C|strike:105 with date range 2025-05-23 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:07:16 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-05-23 to 2026-01-28...\n", + "2026-02-13 13:07:16 [test] trade.datamanager.vol INFO: VolDm Using specified dividend type: DivType.DISCRETE\n", + "2026-02-13 13:07:16 [test] trade.datamanager.vol INFO: VolDm Using model price: ModelPrice.ASK\n", + "2026-02-13 13:07:16 [test] trade.datamanager.utils INFO: Using cached date range for 2025-01-01 00:00:00 - 2026-01-28 00:00:00 and option tick SBUX20260918C105\n", + "2026-02-13 13:07:16 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:105|volatility_model:market\n", + "2026-02-13 13:07:16 [test] trade.datamanager.utils INFO: No cache found for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:105|volatility_model:market. Fetching from source.\n", + "2026-02-13 13:07:16 [test] trade.datamanager.utils INFO: No data requested to load in _load_model_data_timeseries(). Option: Symbol=SBUX, exp=2026-09-18 00:00:00, strike=105.0 right=C Load bools: d=False, r=False, s=False, f=False, opt_spot=False, vol=False, greek=False\n", + "2026-02-13 13:07:16 [test] trade.datamanager.utils INFO: Max date 2026-01-28 for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:105|volatility_model:market is not today. Skipping today's data check.\n", + "2026-02-13 13:07:16 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:105|volatility_model:market with date range 2025-05-23 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:07:16 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-05-23 to 2026-01-28...\n", + "2026-02-13 13:07:16 [test] trade.datamanager.utils INFO: Using cached date range for 2025-01-01 00:00:00 - 2026-01-28 00:00:00 and option tick SBUX20260918C105\n", + "2026-02-13 13:07:16 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:SBUX|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:105|volatility_model:market\n", + "2026-02-13 13:07:16 [test] trade.datamanager.utils INFO: No cache found for key: symbol:SBUX|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:105|volatility_model:market. Fetching from source.\n", + "2026-02-13 13:07:16 [test] trade.datamanager.utils INFO: No data requested to load in _load_model_data_timeseries(). Option: Symbol=SBUX, exp=2026-09-18 00:00:00, strike=105.0 right=C Load bools: d=False, r=False, s=False, f=False, opt_spot=False, vol=False, greek=False\n", + "2026-02-13 13:07:17 [test] trade.datamanager.utils INFO: Max date 2026-01-28 for key: symbol:SBUX|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:105|volatility_model:market is not today. Skipping today's data check.\n", + "2026-02-13 13:07:17 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:SBUX|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:105|volatility_model:market with date range 2025-05-23 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:07:17 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-05-23 to 2026-01-28...\n", + "2026-02-13 13:07:17 [test] trade.datamanager.vars INFO: Timeseries for AAPL already loaded.\n", + "2026-02-13 13:07:17 [test] trade.datamanager.dividend INFO: Using provided dividend_type: DivType.DISCRETE\n", + "2026-02-13 13:07:17 [test] trade.datamanager.dividend INFO: Fetching discrete dividend schedule timeseries for AAPL from 2025-01-01 00:00:00 to 2026-01-28 00:00:00 with maturity 2026-09-18 00:00:00\n", + "2026-02-13 13:07:17 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:AAPL|interval:eod|artifact_type:divs|series_id:hist|current_state:SCHEDULE_TIMESERIES|lookback_years:1|maturity:2026-09-18|method:CONSTANT|undo_adjust:1\n", + "2026-02-13 13:07:17 [test] trade.datamanager.vars INFO: Timeseries for AAPL already loaded.\n", + "2026-02-13 13:07:17 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: AAPL.\n", + "2026-02-13 13:07:17 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: AAPL\n", + "2026-02-13 13:07:17 [test] trade.datamanager.utils INFO: Sanitizing data from 2017-01-03 00:00:00 to 2026-02-13 13:06:23.580580...\n", + "2026-02-13 13:07:17 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-01 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-13 13:07:17 [test] trade.datamanager.utils INFO: Max date 2026-01-28 for key: symbol:AAPL|interval:eod|artifact_type:divs|series_id:hist|current_state:SCHEDULE_TIMESERIES|lookback_years:1|maturity:2026-09-18|method:CONSTANT|undo_adjust:1 is not today. Skipping today's data check.\n", + "2026-02-13 13:07:17 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:AAPL|interval:eod|artifact_type:divs|series_id:hist|current_state:SCHEDULE_TIMESERIES|lookback_years:1|maturity:2026-09-18|method:CONSTANT|undo_adjust:1 with date range 2025-01-02 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:07:17 [test] trade.datamanager.utils INFO: Converting old cache data structure to new for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:07:17 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D.\n", + "2026-02-13 13:07:17 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:07:17 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-02 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-13 13:07:17 [test] trade.datamanager.rates INFO: Cache fully covers requested date range for risk-free rate timeseries. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:07:17 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-02 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-13 13:07:17 [test] trade.datamanager.vars INFO: Timeseries for AAPL already loaded.\n", + "2026-02-13 13:07:17 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: AAPL.\n", + "2026-02-13 13:07:17 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: AAPL\n", + "2026-02-13 13:07:17 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-02 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-13 13:07:17 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-01 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-13 13:07:17 [test] trade.datamanager.vars INFO: Timeseries for AAPL already loaded.\n", + "2026-02-13 13:07:17 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:AAPL|interval:eod|artifact_type:forward|series_id:hist|dividend_type:DISCRETE|maturity:2026-09-18|use_chain_spot:1\n", + "2026-02-13 13:07:17 [test] trade.datamanager.utils INFO: Max date 2026-01-28 for key: symbol:AAPL|interval:eod|artifact_type:forward|series_id:hist|dividend_type:DISCRETE|maturity:2026-09-18|use_chain_spot:1 is not today. Skipping today's data check.\n", + "2026-02-13 13:07:17 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:AAPL|interval:eod|artifact_type:forward|series_id:hist|dividend_type:DISCRETE|maturity:2026-09-18|use_chain_spot:1 with date range 2025-01-02 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:07:17 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-01 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-13 13:07:17 [test] trade.datamanager.utils INFO: Using cached date range for 2025-01-01 00:00:00 - 2026-01-28 00:00:00 and option tick AAPL20260918C260\n", + "2026-02-13 13:07:17 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:AAPL|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:EOD|expiration:20260918T000000|right:C|strike:260\n", + "2026-02-13 13:07:17 [test] trade.datamanager.option_spot INFO: No cache found for option spot timeseries key: symbol:AAPL|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:EOD|expiration:20260918T000000|right:C|strike:260. Fetching from source.\n", + "2026-02-13 13:07:18 [test] trade.datamanager.utils INFO: Max date 2026-01-28 for key: symbol:AAPL|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:EOD|expiration:20260918T000000|right:C|strike:260 is not today. Skipping today's data check.\n", + "2026-02-13 13:07:18 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:AAPL|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:EOD|expiration:20260918T000000|right:C|strike:260 with date range 2025-05-06 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:07:18 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-05-06 to 2026-01-28...\n", + "2026-02-13 13:07:18 [test] trade.datamanager.vol INFO: VolDm Using specified dividend type: DivType.DISCRETE\n", + "2026-02-13 13:07:18 [test] trade.datamanager.vol INFO: VolDm Using model price: ModelPrice.ASK\n", + "2026-02-13 13:07:18 [test] trade.datamanager.utils INFO: Using cached date range for 2025-01-01 00:00:00 - 2026-01-28 00:00:00 and option tick AAPL20260918C260\n", + "2026-02-13 13:07:18 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:AAPL|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:260|volatility_model:market\n", + "2026-02-13 13:07:18 [test] trade.datamanager.utils INFO: No cache found for key: symbol:AAPL|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:260|volatility_model:market. Fetching from source.\n", + "2026-02-13 13:07:18 [test] trade.datamanager.utils INFO: No data requested to load in _load_model_data_timeseries(). Option: Symbol=AAPL, exp=2026-09-18 00:00:00, strike=260.0 right=C Load bools: d=False, r=False, s=False, f=False, opt_spot=False, vol=False, greek=False\n", + "2026-02-13 13:07:18 [test] trade.datamanager.utils INFO: Max date 2026-01-28 for key: symbol:AAPL|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:260|volatility_model:market is not today. Skipping today's data check.\n", + "2026-02-13 13:07:18 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:AAPL|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:260|volatility_model:market with date range 2025-05-06 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:07:18 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-05-06 to 2026-01-28...\n", + "2026-02-13 13:07:18 [test] trade.datamanager.utils INFO: Using cached date range for 2025-01-01 00:00:00 - 2026-01-28 00:00:00 and option tick AAPL20260918C260\n", + "2026-02-13 13:07:18 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:AAPL|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:260|volatility_model:market\n", + "2026-02-13 13:07:18 [test] trade.datamanager.utils INFO: No cache found for key: symbol:AAPL|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:260|volatility_model:market. Fetching from source.\n", + "2026-02-13 13:07:18 [test] trade.datamanager.utils INFO: No data requested to load in _load_model_data_timeseries(). Option: Symbol=AAPL, exp=2026-09-18 00:00:00, strike=260.0 right=C Load bools: d=False, r=False, s=False, f=False, opt_spot=False, vol=False, greek=False\n", + "2026-02-13 13:07:19 [test] trade.datamanager.utils INFO: Max date 2026-01-28 for key: symbol:AAPL|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:260|volatility_model:market is not today. Skipping today's data check.\n", + "2026-02-13 13:07:19 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:AAPL|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:260|volatility_model:market with date range 2025-05-06 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:07:19 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-05-06 to 2026-01-28...\n", + "2026-02-13 13:07:19 [test] trade.datamanager.vars INFO: Timeseries for AAPL already loaded.\n", + "2026-02-13 13:07:19 [test] trade.datamanager.dividend INFO: Using provided dividend_type: DivType.DISCRETE\n", + "2026-02-13 13:07:19 [test] trade.datamanager.dividend INFO: Fetching discrete dividend schedule timeseries for AAPL from 2025-01-01 00:00:00 to 2026-01-28 00:00:00 with maturity 2026-09-18 00:00:00\n", + "2026-02-13 13:07:19 [test] trade.datamanager.utils INFO: Converting old cache data structure to new for key: symbol:AAPL|interval:eod|artifact_type:divs|series_id:hist|current_state:SCHEDULE_TIMESERIES|lookback_years:1|maturity:2026-09-18|method:CONSTANT|undo_adjust:1\n", + "2026-02-13 13:07:19 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: symbol:AAPL|interval:eod|artifact_type:divs|series_id:hist|current_state:SCHEDULE_TIMESERIES|lookback_years:1|maturity:2026-09-18|method:CONSTANT|undo_adjust:1.\n", + "2026-02-13 13:07:19 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: symbol:AAPL|interval:eod|artifact_type:divs|series_id:hist|current_state:SCHEDULE_TIMESERIES|lookback_years:1|maturity:2026-09-18|method:CONSTANT|undo_adjust:1\n", + "2026-02-13 13:07:19 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-02 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-13 13:07:19 [test] trade.datamanager.dividend INFO: Cache hit for discrete schedule timeseries key: symbol:AAPL|interval:eod|artifact_type:divs|series_id:hist|current_state:SCHEDULE_TIMESERIES|lookback_years:1|maturity:2026-09-18|method:CONSTANT|undo_adjust:1\n", + "2026-02-13 13:07:19 [test] trade.datamanager.dividend INFO: Cache fully covers requested date range for timeseries. Key: symbol:AAPL|interval:eod|artifact_type:divs|series_id:hist|current_state:SCHEDULE_TIMESERIES|lookback_years:1|maturity:2026-09-18|method:CONSTANT|undo_adjust:1\n", + "2026-02-13 13:07:19 [test] trade.datamanager.utils INFO: Converting old cache data structure to new for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:07:19 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D.\n", + "2026-02-13 13:07:19 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:07:19 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-02 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-13 13:07:19 [test] trade.datamanager.rates INFO: Cache fully covers requested date range for risk-free rate timeseries. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:07:19 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-02 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-13 13:07:19 [test] trade.datamanager.vars INFO: Timeseries for AAPL already loaded.\n", + "2026-02-13 13:07:19 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: AAPL.\n", + "2026-02-13 13:07:19 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: AAPL\n", + "2026-02-13 13:07:19 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-02 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-13 13:07:19 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-01 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-13 13:07:19 [test] trade.datamanager.vars INFO: Timeseries for AAPL already loaded.\n", + "2026-02-13 13:07:19 [test] trade.datamanager.utils INFO: Converting old cache data structure to new for key: symbol:AAPL|interval:eod|artifact_type:forward|series_id:hist|dividend_type:DISCRETE|maturity:2026-09-18|use_chain_spot:1\n", + "2026-02-13 13:07:19 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: symbol:AAPL|interval:eod|artifact_type:forward|series_id:hist|dividend_type:DISCRETE|maturity:2026-09-18|use_chain_spot:1.\n", + "2026-02-13 13:07:19 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: symbol:AAPL|interval:eod|artifact_type:forward|series_id:hist|dividend_type:DISCRETE|maturity:2026-09-18|use_chain_spot:1\n", + "2026-02-13 13:07:19 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-02 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-13 13:07:19 [test] trade.datamanager.forward INFO: Cache hit for forward timeseries key: symbol:AAPL|interval:eod|artifact_type:forward|series_id:hist|dividend_type:DISCRETE|maturity:2026-09-18|use_chain_spot:1\n", + "2026-02-13 13:07:19 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-01 to 2026-01-28...\n", + "2026-02-13 13:07:19 [test] trade.datamanager.utils INFO: Using cached date range for 2025-01-01 00:00:00 - 2026-01-28 00:00:00 and option tick AAPL20260918C265\n", + "2026-02-13 13:07:19 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:AAPL|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:EOD|expiration:20260918T000000|right:C|strike:265\n", + "2026-02-13 13:07:19 [test] trade.datamanager.option_spot INFO: No cache found for option spot timeseries key: symbol:AAPL|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:EOD|expiration:20260918T000000|right:C|strike:265. Fetching from source.\n", + "2026-02-13 13:07:20 [test] trade.datamanager.utils INFO: Max date 2026-01-28 for key: symbol:AAPL|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:EOD|expiration:20260918T000000|right:C|strike:265 is not today. Skipping today's data check.\n", + "2026-02-13 13:07:20 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:AAPL|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:EOD|expiration:20260918T000000|right:C|strike:265 with date range 2025-05-06 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:07:20 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-05-06 to 2026-01-28...\n", + "2026-02-13 13:07:20 [test] trade.datamanager.vol INFO: VolDm Using specified dividend type: DivType.DISCRETE\n", + "2026-02-13 13:07:20 [test] trade.datamanager.vol INFO: VolDm Using model price: ModelPrice.ASK\n", + "2026-02-13 13:07:20 [test] trade.datamanager.utils INFO: Using cached date range for 2025-01-01 00:00:00 - 2026-01-28 00:00:00 and option tick AAPL20260918C265\n", + "2026-02-13 13:07:20 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:AAPL|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:265|volatility_model:market\n", + "2026-02-13 13:07:20 [test] trade.datamanager.utils INFO: No cache found for key: symbol:AAPL|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:265|volatility_model:market. Fetching from source.\n", + "2026-02-13 13:07:20 [test] trade.datamanager.utils INFO: No data requested to load in _load_model_data_timeseries(). Option: Symbol=AAPL, exp=2026-09-18 00:00:00, strike=265.0 right=C Load bools: d=False, r=False, s=False, f=False, opt_spot=False, vol=False, greek=False\n", + "2026-02-13 13:07:20 [test] trade.datamanager.utils INFO: Max date 2026-01-28 for key: symbol:AAPL|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:265|volatility_model:market is not today. Skipping today's data check.\n", + "2026-02-13 13:07:20 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:AAPL|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:265|volatility_model:market with date range 2025-05-06 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:07:20 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-05-06 to 2026-01-28...\n", + "2026-02-13 13:07:20 [test] trade.datamanager.utils INFO: Using cached date range for 2025-01-01 00:00:00 - 2026-01-28 00:00:00 and option tick AAPL20260918C265\n", + "2026-02-13 13:07:20 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:AAPL|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:265|volatility_model:market\n", + "2026-02-13 13:07:20 [test] trade.datamanager.utils INFO: No cache found for key: symbol:AAPL|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:265|volatility_model:market. Fetching from source.\n", + "2026-02-13 13:07:20 [test] trade.datamanager.utils INFO: No data requested to load in _load_model_data_timeseries(). Option: Symbol=AAPL, exp=2026-09-18 00:00:00, strike=265.0 right=C Load bools: d=False, r=False, s=False, f=False, opt_spot=False, vol=False, greek=False\n", + "2026-02-13 13:07:21 [test] trade.datamanager.utils INFO: Max date 2026-01-28 for key: symbol:AAPL|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:265|volatility_model:market is not today. Skipping today's data check.\n", + "2026-02-13 13:07:21 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:AAPL|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:265|volatility_model:market with date range 2025-05-06 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:07:21 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-05-06 to 2026-01-28...\n", + "2026-02-13 13:07:21 [test] trade.datamanager.vars INFO: Timeseries for AMD already loaded.\n", + "2026-02-13 13:07:21 [test] trade.datamanager.dividend INFO: Using provided dividend_type: DivType.DISCRETE\n", + "2026-02-13 13:07:21 [test] trade.datamanager.dividend INFO: Fetching discrete dividend schedule timeseries for AMD from 2025-01-01 00:00:00 to 2026-01-28 00:00:00 with maturity 2026-09-18 00:00:00\n", + "2026-02-13 13:07:21 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:AMD|interval:eod|artifact_type:divs|series_id:hist|current_state:SCHEDULE_TIMESERIES|lookback_years:1|maturity:2026-09-18|method:CONSTANT|undo_adjust:1\n", + "2026-02-13 13:07:21 [test] trade.datamanager.vars INFO: Timeseries for AMD already loaded.\n", + "2026-02-13 13:07:21 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: AMD.\n", + "2026-02-13 13:07:21 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: AMD\n", + "2026-02-13 13:07:21 [test] trade.datamanager.utils INFO: Sanitizing data from 2017-01-03 00:00:00 to 2026-02-13 13:06:23.580580...\n", + "2026-02-13 13:07:21 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-01 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-13 13:07:21 [test] trade.datamanager.utils INFO: Max date 2026-01-28 for key: symbol:AMD|interval:eod|artifact_type:divs|series_id:hist|current_state:SCHEDULE_TIMESERIES|lookback_years:1|maturity:2026-09-18|method:CONSTANT|undo_adjust:1 is not today. Skipping today's data check.\n", + "2026-02-13 13:07:21 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:AMD|interval:eod|artifact_type:divs|series_id:hist|current_state:SCHEDULE_TIMESERIES|lookback_years:1|maturity:2026-09-18|method:CONSTANT|undo_adjust:1 with date range 2025-01-02 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:07:21 [test] trade.datamanager.utils INFO: Converting old cache data structure to new for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:07:21 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D.\n", + "2026-02-13 13:07:21 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:07:21 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-02 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-13 13:07:21 [test] trade.datamanager.rates INFO: Cache fully covers requested date range for risk-free rate timeseries. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:07:21 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-02 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-13 13:07:21 [test] trade.datamanager.vars INFO: Timeseries for AMD already loaded.\n", + "2026-02-13 13:07:21 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: AMD.\n", + "2026-02-13 13:07:21 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: AMD\n", + "2026-02-13 13:07:21 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-02 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-13 13:07:21 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-01 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-13 13:07:21 [test] trade.datamanager.vars INFO: Timeseries for AMD already loaded.\n", + "2026-02-13 13:07:21 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:AMD|interval:eod|artifact_type:forward|series_id:hist|dividend_type:DISCRETE|maturity:2026-09-18|use_chain_spot:1\n", + "2026-02-13 13:07:21 [test] trade.datamanager.utils INFO: Max date 2026-01-28 for key: symbol:AMD|interval:eod|artifact_type:forward|series_id:hist|dividend_type:DISCRETE|maturity:2026-09-18|use_chain_spot:1 is not today. Skipping today's data check.\n", + "2026-02-13 13:07:21 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:AMD|interval:eod|artifact_type:forward|series_id:hist|dividend_type:DISCRETE|maturity:2026-09-18|use_chain_spot:1 with date range 2025-01-02 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:07:21 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-01 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-13 13:07:21 [test] trade.datamanager.utils INFO: Using cached date range for 2025-01-01 00:00:00 - 2026-01-28 00:00:00 and option tick AMD20260918C280\n", + "2026-02-13 13:07:21 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:AMD|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:EOD|expiration:20260918T000000|right:C|strike:280\n", + "2026-02-13 13:07:21 [test] trade.datamanager.option_spot INFO: No cache found for option spot timeseries key: symbol:AMD|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:EOD|expiration:20260918T000000|right:C|strike:280. Fetching from source.\n", + "2026-02-13 13:07:22 [test] trade.datamanager.utils INFO: Max date 2026-01-28 for key: symbol:AMD|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:EOD|expiration:20260918T000000|right:C|strike:280 is not today. Skipping today's data check.\n", + "2026-02-13 13:07:22 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:AMD|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:EOD|expiration:20260918T000000|right:C|strike:280 with date range 2025-07-14 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:07:22 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-07-14 to 2026-01-28...\n", + "2026-02-13 13:07:22 [test] trade.datamanager.vol INFO: VolDm Using specified dividend type: DivType.DISCRETE\n", + "2026-02-13 13:07:22 [test] trade.datamanager.vol INFO: VolDm Using model price: ModelPrice.ASK\n", + "2026-02-13 13:07:22 [test] trade.datamanager.utils INFO: Using cached date range for 2025-01-01 00:00:00 - 2026-01-28 00:00:00 and option tick AMD20260918C280\n", + "2026-02-13 13:07:22 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:AMD|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:280|volatility_model:market\n", + "2026-02-13 13:07:22 [test] trade.datamanager.utils INFO: No cache found for key: symbol:AMD|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:280|volatility_model:market. Fetching from source.\n", + "2026-02-13 13:07:22 [test] trade.datamanager.utils INFO: No data requested to load in _load_model_data_timeseries(). Option: Symbol=AMD, exp=2026-09-18 00:00:00, strike=280.0 right=C Load bools: d=False, r=False, s=False, f=False, opt_spot=False, vol=False, greek=False\n", + "2026-02-13 13:07:22 [test] trade.datamanager.utils INFO: Max date 2026-01-28 for key: symbol:AMD|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:280|volatility_model:market is not today. Skipping today's data check.\n", + "2026-02-13 13:07:22 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:AMD|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:280|volatility_model:market with date range 2025-07-14 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:07:22 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-07-14 to 2026-01-28...\n", + "2026-02-13 13:07:22 [test] trade.datamanager.utils INFO: Using cached date range for 2025-01-01 00:00:00 - 2026-01-28 00:00:00 and option tick AMD20260918C280\n", + "2026-02-13 13:07:22 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:AMD|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:280|volatility_model:market\n", + "2026-02-13 13:07:22 [test] trade.datamanager.utils INFO: No cache found for key: symbol:AMD|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:280|volatility_model:market. Fetching from source.\n", + "2026-02-13 13:07:22 [test] trade.datamanager.utils INFO: No data requested to load in _load_model_data_timeseries(). Option: Symbol=AMD, exp=2026-09-18 00:00:00, strike=280.0 right=C Load bools: d=False, r=False, s=False, f=False, opt_spot=False, vol=False, greek=False\n", + "2026-02-13 13:07:23 [test] trade.datamanager.utils INFO: Max date 2026-01-28 for key: symbol:AMD|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:280|volatility_model:market is not today. Skipping today's data check.\n", + "2026-02-13 13:07:23 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:AMD|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:280|volatility_model:market with date range 2025-07-14 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:07:23 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-07-14 to 2026-01-28...\n", + "2026-02-13 13:07:23 [test] trade.datamanager.vars INFO: Timeseries for AMD already loaded.\n", + "2026-02-13 13:07:23 [test] trade.datamanager.dividend INFO: Using provided dividend_type: DivType.DISCRETE\n", + "2026-02-13 13:07:23 [test] trade.datamanager.dividend INFO: Fetching discrete dividend schedule timeseries for AMD from 2025-01-01 00:00:00 to 2026-01-28 00:00:00 with maturity 2026-09-18 00:00:00\n", + "2026-02-13 13:07:23 [test] trade.datamanager.utils INFO: Converting old cache data structure to new for key: symbol:AMD|interval:eod|artifact_type:divs|series_id:hist|current_state:SCHEDULE_TIMESERIES|lookback_years:1|maturity:2026-09-18|method:CONSTANT|undo_adjust:1\n", + "2026-02-13 13:07:23 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: symbol:AMD|interval:eod|artifact_type:divs|series_id:hist|current_state:SCHEDULE_TIMESERIES|lookback_years:1|maturity:2026-09-18|method:CONSTANT|undo_adjust:1.\n", + "2026-02-13 13:07:23 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: symbol:AMD|interval:eod|artifact_type:divs|series_id:hist|current_state:SCHEDULE_TIMESERIES|lookback_years:1|maturity:2026-09-18|method:CONSTANT|undo_adjust:1\n", + "2026-02-13 13:07:23 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-02 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-13 13:07:23 [test] trade.datamanager.dividend INFO: Cache hit for discrete schedule timeseries key: symbol:AMD|interval:eod|artifact_type:divs|series_id:hist|current_state:SCHEDULE_TIMESERIES|lookback_years:1|maturity:2026-09-18|method:CONSTANT|undo_adjust:1\n", + "2026-02-13 13:07:23 [test] trade.datamanager.dividend INFO: Cache fully covers requested date range for timeseries. Key: symbol:AMD|interval:eod|artifact_type:divs|series_id:hist|current_state:SCHEDULE_TIMESERIES|lookback_years:1|maturity:2026-09-18|method:CONSTANT|undo_adjust:1\n", + "2026-02-13 13:07:23 [test] trade.datamanager.utils INFO: Converting old cache data structure to new for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:07:23 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D.\n", + "2026-02-13 13:07:23 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:07:23 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-02 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-13 13:07:23 [test] trade.datamanager.rates INFO: Cache fully covers requested date range for risk-free rate timeseries. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:07:23 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-02 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-13 13:07:23 [test] trade.datamanager.vars INFO: Timeseries for AMD already loaded.\n", + "2026-02-13 13:07:23 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: AMD.\n", + "2026-02-13 13:07:23 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: AMD\n", + "2026-02-13 13:07:23 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-02 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-13 13:07:23 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-01 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-13 13:07:23 [test] trade.datamanager.vars INFO: Timeseries for AMD already loaded.\n", + "2026-02-13 13:07:23 [test] trade.datamanager.utils INFO: Converting old cache data structure to new for key: symbol:AMD|interval:eod|artifact_type:forward|series_id:hist|dividend_type:DISCRETE|maturity:2026-09-18|use_chain_spot:1\n", + "2026-02-13 13:07:23 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: symbol:AMD|interval:eod|artifact_type:forward|series_id:hist|dividend_type:DISCRETE|maturity:2026-09-18|use_chain_spot:1.\n", + "2026-02-13 13:07:23 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: symbol:AMD|interval:eod|artifact_type:forward|series_id:hist|dividend_type:DISCRETE|maturity:2026-09-18|use_chain_spot:1\n", + "2026-02-13 13:07:23 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-02 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-13 13:07:23 [test] trade.datamanager.forward INFO: Cache hit for forward timeseries key: symbol:AMD|interval:eod|artifact_type:forward|series_id:hist|dividend_type:DISCRETE|maturity:2026-09-18|use_chain_spot:1\n", + "2026-02-13 13:07:23 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-01 to 2026-01-28...\n", + "2026-02-13 13:07:23 [test] trade.datamanager.utils INFO: Using cached date range for 2025-01-01 00:00:00 - 2026-01-28 00:00:00 and option tick AMD20260918C290\n", + "2026-02-13 13:07:23 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:AMD|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:EOD|expiration:20260918T000000|right:C|strike:290\n", + "2026-02-13 13:07:23 [test] trade.datamanager.option_spot INFO: No cache found for option spot timeseries key: symbol:AMD|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:EOD|expiration:20260918T000000|right:C|strike:290. Fetching from source.\n", + "2026-02-13 13:07:23 [test] trade.datamanager.utils INFO: Max date 2026-01-28 for key: symbol:AMD|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:EOD|expiration:20260918T000000|right:C|strike:290 is not today. Skipping today's data check.\n", + "2026-02-13 13:07:23 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:AMD|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:EOD|expiration:20260918T000000|right:C|strike:290 with date range 2025-07-14 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:07:23 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-07-14 to 2026-01-28...\n", + "2026-02-13 13:07:23 [test] trade.datamanager.vol INFO: VolDm Using specified dividend type: DivType.DISCRETE\n", + "2026-02-13 13:07:23 [test] trade.datamanager.vol INFO: VolDm Using model price: ModelPrice.ASK\n", + "2026-02-13 13:07:23 [test] trade.datamanager.utils INFO: Using cached date range for 2025-01-01 00:00:00 - 2026-01-28 00:00:00 and option tick AMD20260918C290\n", + "2026-02-13 13:07:23 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:AMD|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:290|volatility_model:market\n", + "2026-02-13 13:07:23 [test] trade.datamanager.utils INFO: No cache found for key: symbol:AMD|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:290|volatility_model:market. Fetching from source.\n", + "2026-02-13 13:07:23 [test] trade.datamanager.utils INFO: No data requested to load in _load_model_data_timeseries(). Option: Symbol=AMD, exp=2026-09-18 00:00:00, strike=290.0 right=C Load bools: d=False, r=False, s=False, f=False, opt_spot=False, vol=False, greek=False\n", + "2026-02-13 13:07:24 [test] trade.datamanager.utils INFO: Max date 2026-01-28 for key: symbol:AMD|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:290|volatility_model:market is not today. Skipping today's data check.\n", + "2026-02-13 13:07:24 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:AMD|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:290|volatility_model:market with date range 2025-07-14 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:07:24 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-07-14 to 2026-01-28...\n", + "2026-02-13 13:07:24 [test] trade.datamanager.utils INFO: Using cached date range for 2025-01-01 00:00:00 - 2026-01-28 00:00:00 and option tick AMD20260918C290\n", + "2026-02-13 13:07:24 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:AMD|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:290|volatility_model:market\n", + "2026-02-13 13:07:24 [test] trade.datamanager.utils INFO: No cache found for key: symbol:AMD|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:290|volatility_model:market. Fetching from source.\n", + "2026-02-13 13:07:24 [test] trade.datamanager.utils INFO: No data requested to load in _load_model_data_timeseries(). Option: Symbol=AMD, exp=2026-09-18 00:00:00, strike=290.0 right=C Load bools: d=False, r=False, s=False, f=False, opt_spot=False, vol=False, greek=False\n", + "2026-02-13 13:07:24 [test] trade.datamanager.utils INFO: Max date 2026-01-28 for key: symbol:AMD|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:290|volatility_model:market is not today. Skipping today's data check.\n", + "2026-02-13 13:07:24 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:AMD|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:290|volatility_model:market with date range 2025-07-14 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:07:24 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-07-14 to 2026-01-28...\n", + "2026-02-13 13:07:24 [test] trade.datamanager.vars INFO: Timeseries for META already loaded.\n", + "2026-02-13 13:07:24 [test] trade.datamanager.dividend INFO: Using provided dividend_type: DivType.DISCRETE\n", + "2026-02-13 13:07:24 [test] trade.datamanager.dividend INFO: Fetching discrete dividend schedule timeseries for META from 2025-01-01 00:00:00 to 2026-01-28 00:00:00 with maturity 2026-09-18 00:00:00\n", + "2026-02-13 13:07:24 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:META|interval:eod|artifact_type:divs|series_id:hist|current_state:SCHEDULE_TIMESERIES|lookback_years:1|maturity:2026-09-18|method:CONSTANT|undo_adjust:1\n", + "2026-02-13 13:07:24 [test] trade.datamanager.vars INFO: Timeseries for META already loaded.\n", + "2026-02-13 13:07:24 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: META.\n", + "2026-02-13 13:07:24 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: META\n", + "2026-02-13 13:07:24 [test] trade.datamanager.utils INFO: Sanitizing data from 2017-01-03 00:00:00 to 2026-02-13 13:06:23.580580...\n", + "2026-02-13 13:07:24 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-01 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-13 13:07:24 [test] trade.datamanager.utils INFO: Max date 2026-01-28 for key: symbol:META|interval:eod|artifact_type:divs|series_id:hist|current_state:SCHEDULE_TIMESERIES|lookback_years:1|maturity:2026-09-18|method:CONSTANT|undo_adjust:1 is not today. Skipping today's data check.\n", + "2026-02-13 13:07:24 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:META|interval:eod|artifact_type:divs|series_id:hist|current_state:SCHEDULE_TIMESERIES|lookback_years:1|maturity:2026-09-18|method:CONSTANT|undo_adjust:1 with date range 2025-01-02 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:07:24 [test] trade.datamanager.utils INFO: Converting old cache data structure to new for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:07:24 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D.\n", + "2026-02-13 13:07:24 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:07:24 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-02 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-13 13:07:24 [test] trade.datamanager.rates INFO: Cache fully covers requested date range for risk-free rate timeseries. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:07:24 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-02 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-13 13:07:24 [test] trade.datamanager.vars INFO: Timeseries for META already loaded.\n", + "2026-02-13 13:07:24 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: META.\n", + "2026-02-13 13:07:24 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: META\n", + "2026-02-13 13:07:24 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-02 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-13 13:07:24 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-01 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-13 13:07:24 [test] trade.datamanager.vars INFO: Timeseries for META already loaded.\n", + "2026-02-13 13:07:24 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:META|interval:eod|artifact_type:forward|series_id:hist|dividend_type:DISCRETE|maturity:2026-09-18|use_chain_spot:1\n", + "2026-02-13 13:07:24 [test] trade.datamanager.utils INFO: Max date 2026-01-28 for key: symbol:META|interval:eod|artifact_type:forward|series_id:hist|dividend_type:DISCRETE|maturity:2026-09-18|use_chain_spot:1 is not today. Skipping today's data check.\n", + "2026-02-13 13:07:24 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:META|interval:eod|artifact_type:forward|series_id:hist|dividend_type:DISCRETE|maturity:2026-09-18|use_chain_spot:1 with date range 2025-01-02 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:07:24 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-01 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-13 13:07:24 [test] trade.datamanager.utils INFO: Using cached date range for 2025-01-01 00:00:00 - 2026-01-28 00:00:00 and option tick META20260918C890\n", + "2026-02-13 13:07:24 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:META|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:EOD|expiration:20260918T000000|right:C|strike:890\n", + "2026-02-13 13:07:24 [test] trade.datamanager.option_spot INFO: No cache found for option spot timeseries key: symbol:META|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:EOD|expiration:20260918T000000|right:C|strike:890. Fetching from source.\n", + "2026-02-13 13:07:25 [test] trade.datamanager.utils INFO: Max date 2026-01-28 for key: symbol:META|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:EOD|expiration:20260918T000000|right:C|strike:890 is not today. Skipping today's data check.\n", + "2026-02-13 13:07:25 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:META|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:EOD|expiration:20260918T000000|right:C|strike:890 with date range 2025-05-23 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:07:25 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-05-23 to 2026-01-28...\n", + "2026-02-13 13:07:25 [test] trade.datamanager.vol INFO: VolDm Using specified dividend type: DivType.DISCRETE\n", + "2026-02-13 13:07:25 [test] trade.datamanager.vol INFO: VolDm Using model price: ModelPrice.ASK\n", + "2026-02-13 13:07:25 [test] trade.datamanager.utils INFO: Using cached date range for 2025-01-01 00:00:00 - 2026-01-28 00:00:00 and option tick META20260918C890\n", + "2026-02-13 13:07:25 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:META|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:890|volatility_model:market\n", + "2026-02-13 13:07:25 [test] trade.datamanager.utils INFO: No cache found for key: symbol:META|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:890|volatility_model:market. Fetching from source.\n", + "2026-02-13 13:07:25 [test] trade.datamanager.utils INFO: No data requested to load in _load_model_data_timeseries(). Option: Symbol=META, exp=2026-09-18 00:00:00, strike=890.0 right=C Load bools: d=False, r=False, s=False, f=False, opt_spot=False, vol=False, greek=False\n", + "2026-02-13 13:07:26 [test] trade.datamanager.utils INFO: Max date 2026-01-28 for key: symbol:META|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:890|volatility_model:market is not today. Skipping today's data check.\n", + "2026-02-13 13:07:26 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:META|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:890|volatility_model:market with date range 2025-05-23 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:07:26 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-05-23 to 2026-01-28...\n", + "2026-02-13 13:07:26 [test] trade.datamanager.utils INFO: Using cached date range for 2025-01-01 00:00:00 - 2026-01-28 00:00:00 and option tick META20260918C890\n", + "2026-02-13 13:07:26 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:META|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:890|volatility_model:market\n", + "2026-02-13 13:07:26 [test] trade.datamanager.utils INFO: No cache found for key: symbol:META|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:890|volatility_model:market. Fetching from source.\n", + "2026-02-13 13:07:26 [test] trade.datamanager.utils INFO: No data requested to load in _load_model_data_timeseries(). Option: Symbol=META, exp=2026-09-18 00:00:00, strike=890.0 right=C Load bools: d=False, r=False, s=False, f=False, opt_spot=False, vol=False, greek=False\n", + "2026-02-13 13:07:26 [test] trade.datamanager.utils INFO: Max date 2026-01-28 for key: symbol:META|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:890|volatility_model:market is not today. Skipping today's data check.\n", + "2026-02-13 13:07:26 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:META|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:890|volatility_model:market with date range 2025-05-23 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:07:27 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-05-23 to 2026-01-28...\n", + "2026-02-13 13:07:27 [test] trade.datamanager.vars INFO: Timeseries for META already loaded.\n", + "2026-02-13 13:07:27 [test] trade.datamanager.dividend INFO: Using provided dividend_type: DivType.DISCRETE\n", + "2026-02-13 13:07:27 [test] trade.datamanager.dividend INFO: Fetching discrete dividend schedule timeseries for META from 2025-01-01 00:00:00 to 2026-01-28 00:00:00 with maturity 2026-09-18 00:00:00\n", + "2026-02-13 13:07:27 [test] trade.datamanager.utils INFO: Converting old cache data structure to new for key: symbol:META|interval:eod|artifact_type:divs|series_id:hist|current_state:SCHEDULE_TIMESERIES|lookback_years:1|maturity:2026-09-18|method:CONSTANT|undo_adjust:1\n", + "2026-02-13 13:07:27 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: symbol:META|interval:eod|artifact_type:divs|series_id:hist|current_state:SCHEDULE_TIMESERIES|lookback_years:1|maturity:2026-09-18|method:CONSTANT|undo_adjust:1.\n", + "2026-02-13 13:07:27 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: symbol:META|interval:eod|artifact_type:divs|series_id:hist|current_state:SCHEDULE_TIMESERIES|lookback_years:1|maturity:2026-09-18|method:CONSTANT|undo_adjust:1\n", + "2026-02-13 13:07:27 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-02 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-13 13:07:27 [test] trade.datamanager.dividend INFO: Cache hit for discrete schedule timeseries key: symbol:META|interval:eod|artifact_type:divs|series_id:hist|current_state:SCHEDULE_TIMESERIES|lookback_years:1|maturity:2026-09-18|method:CONSTANT|undo_adjust:1\n", + "2026-02-13 13:07:27 [test] trade.datamanager.dividend INFO: Cache fully covers requested date range for timeseries. Key: symbol:META|interval:eod|artifact_type:divs|series_id:hist|current_state:SCHEDULE_TIMESERIES|lookback_years:1|maturity:2026-09-18|method:CONSTANT|undo_adjust:1\n", + "2026-02-13 13:07:27 [test] trade.datamanager.utils INFO: Converting old cache data structure to new for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:07:27 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D.\n", + "2026-02-13 13:07:27 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:07:27 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-02 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-13 13:07:27 [test] trade.datamanager.rates INFO: Cache fully covers requested date range for risk-free rate timeseries. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:07:27 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-02 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-13 13:07:27 [test] trade.datamanager.vars INFO: Timeseries for META already loaded.\n", + "2026-02-13 13:07:27 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: META.\n", + "2026-02-13 13:07:27 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: META\n", + "2026-02-13 13:07:27 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-02 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-13 13:07:27 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-01 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-13 13:07:27 [test] trade.datamanager.vars INFO: Timeseries for META already loaded.\n", + "2026-02-13 13:07:27 [test] trade.datamanager.utils INFO: Converting old cache data structure to new for key: symbol:META|interval:eod|artifact_type:forward|series_id:hist|dividend_type:DISCRETE|maturity:2026-09-18|use_chain_spot:1\n", + "2026-02-13 13:07:27 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: symbol:META|interval:eod|artifact_type:forward|series_id:hist|dividend_type:DISCRETE|maturity:2026-09-18|use_chain_spot:1.\n", + "2026-02-13 13:07:27 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: symbol:META|interval:eod|artifact_type:forward|series_id:hist|dividend_type:DISCRETE|maturity:2026-09-18|use_chain_spot:1\n", + "2026-02-13 13:07:27 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-02 00:00:00 to 2026-01-28 00:00:00...\n", + "2026-02-13 13:07:27 [test] trade.datamanager.forward INFO: Cache hit for forward timeseries key: symbol:META|interval:eod|artifact_type:forward|series_id:hist|dividend_type:DISCRETE|maturity:2026-09-18|use_chain_spot:1\n", + "2026-02-13 13:07:27 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-01-01 to 2026-01-28...\n", + "2026-02-13 13:07:27 [test] trade.datamanager.utils INFO: Using cached date range for 2025-01-01 00:00:00 - 2026-01-28 00:00:00 and option tick META20260918C900\n", + "2026-02-13 13:07:27 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:META|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:EOD|expiration:20260918T000000|right:C|strike:900\n", + "2026-02-13 13:07:27 [test] trade.datamanager.option_spot INFO: No cache found for option spot timeseries key: symbol:META|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:EOD|expiration:20260918T000000|right:C|strike:900. Fetching from source.\n", + "2026-02-13 13:07:27 [test] trade.datamanager.utils INFO: Max date 2026-01-28 for key: symbol:META|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:EOD|expiration:20260918T000000|right:C|strike:900 is not today. Skipping today's data check.\n", + "2026-02-13 13:07:27 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:META|interval:eod|artifact_type:option_spot|series_id:hist|endpoint_source:EOD|expiration:20260918T000000|right:C|strike:900 with date range 2025-05-23 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:07:27 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-05-23 to 2026-01-28...\n", + "2026-02-13 13:07:27 [test] trade.datamanager.vol INFO: VolDm Using specified dividend type: DivType.DISCRETE\n", + "2026-02-13 13:07:27 [test] trade.datamanager.vol INFO: VolDm Using model price: ModelPrice.ASK\n", + "2026-02-13 13:07:27 [test] trade.datamanager.utils INFO: Using cached date range for 2025-01-01 00:00:00 - 2026-01-28 00:00:00 and option tick META20260918C900\n", + "2026-02-13 13:07:27 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:META|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:900|volatility_model:market\n", + "2026-02-13 13:07:27 [test] trade.datamanager.utils INFO: No cache found for key: symbol:META|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:900|volatility_model:market. Fetching from source.\n", + "2026-02-13 13:07:27 [test] trade.datamanager.utils INFO: No data requested to load in _load_model_data_timeseries(). Option: Symbol=META, exp=2026-09-18 00:00:00, strike=900.0 right=C Load bools: d=False, r=False, s=False, f=False, opt_spot=False, vol=False, greek=False\n", + "2026-02-13 13:07:28 [test] trade.datamanager.utils INFO: Max date 2026-01-28 for key: symbol:META|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:900|volatility_model:market is not today. Skipping today's data check.\n", + "2026-02-13 13:07:28 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:META|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:900|volatility_model:market with date range 2025-05-23 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:07:28 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-05-23 to 2026-01-28...\n", + "2026-02-13 13:07:28 [test] trade.datamanager.utils INFO: Using cached date range for 2025-01-01 00:00:00 - 2026-01-28 00:00:00 and option tick META20260918C900\n", + "2026-02-13 13:07:28 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:META|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:900|volatility_model:market\n", + "2026-02-13 13:07:28 [test] trade.datamanager.utils INFO: No cache found for key: symbol:META|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:900|volatility_model:market. Fetching from source.\n", + "2026-02-13 13:07:28 [test] trade.datamanager.utils INFO: No data requested to load in _load_model_data_timeseries(). Option: Symbol=META, exp=2026-09-18 00:00:00, strike=900.0 right=C Load bools: d=False, r=False, s=False, f=False, opt_spot=False, vol=False, greek=False\n", + "2026-02-13 13:07:28 [test] trade.datamanager.utils INFO: Max date 2026-01-28 for key: symbol:META|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:900|volatility_model:market is not today. Skipping today's data check.\n", + "2026-02-13 13:07:28 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:META|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:discrete|endpoint_source:eod|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:900|volatility_model:market with date range 2025-05-23 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:07:29 [test] trade.datamanager.utils INFO: Sanitizing data from 2025-05-23 to 2026-01-28...\n" + ] + } + ], + "source": [ + "timeseries_full_data = []\n", + "for option_meta in option_metas:\n", + " request = LoadRequest(\n", + " symbol=option_meta[\"symbol\"],\n", + " start_date=ts_start,\n", + " end_date=ts_end,\n", + " expiration=option_meta[\"expiration\"],\n", + " strike=option_meta[\"strike\"],\n", + " right=option_meta[\"right\"],\n", + " series_id=SeriesId.HIST,\n", + " dividend_type=DivType.DISCRETE,\n", + " endpoint_source=OptionSpotEndpointSource.EOD,\n", + " vol_model=VolatilityModel.MARKET,\n", + " market_model=OptionPricingModel.BINOMIAL,\n", + " model_price=ModelPrice.ASK,\n", + " load_spot=True,\n", + " load_dividend=True,\n", + " load_forward=True,\n", + " load_option_spot=True,\n", + " load_vol=True,\n", + " load_greek=True,\n", + " load_rates=True,\n", + " undo_adjust=True,\n", + " # rt=True,\n", + " )\n", + " data_packet = _load_model_data_timeseries(request)\n", + " timeseries_full_data.append(data_packet)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "42dcd29d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[ModelResultPack(symbol='SBUX', strike=100.0, expiration=datetime.datetime(2026, 9, 18, 0, 0), right='C', series_id=, dividend_type=, undo_adjust=True, num_empty=0),\n", + " ModelResultPack(symbol='SBUX', strike=105.0, expiration=datetime.datetime(2026, 9, 18, 0, 0), right='C', series_id=, dividend_type=, undo_adjust=True, num_empty=0),\n", + " ModelResultPack(symbol='AAPL', strike=260.0, expiration=datetime.datetime(2026, 9, 18, 0, 0), right='C', series_id=, dividend_type=, undo_adjust=True, num_empty=0),\n", + " ModelResultPack(symbol='AAPL', strike=265.0, expiration=datetime.datetime(2026, 9, 18, 0, 0), right='C', series_id=, dividend_type=, undo_adjust=True, num_empty=0),\n", + " ModelResultPack(symbol='AMD', strike=280.0, expiration=datetime.datetime(2026, 9, 18, 0, 0), right='C', series_id=, dividend_type=, undo_adjust=True, num_empty=0),\n", + " ModelResultPack(symbol='AMD', strike=290.0, expiration=datetime.datetime(2026, 9, 18, 0, 0), right='C', series_id=, dividend_type=, undo_adjust=True, num_empty=0),\n", + " ModelResultPack(symbol='META', strike=890.0, expiration=datetime.datetime(2026, 9, 18, 0, 0), right='C', series_id=, dividend_type=, undo_adjust=True, num_empty=0),\n", + " ModelResultPack(symbol='META', strike=900.0, expiration=datetime.datetime(2026, 9, 18, 0, 0), right='C', series_id=, dividend_type=, undo_adjust=True, num_empty=0)]" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "timeseries_full_data\n" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "ccfa0daf", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2026-02-13 13:07:29 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-13 13:07:29 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-13 13:07:29 [test] trade.datamanager.utils INFO: Cached data date range 2017-01-03 to 2026-02-12 does not cover requested range 2017-01-03 to 2026-02-13.\n", + "2026-02-13 13:07:29 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: SBUX. Fetching missing dates within range: []\n", + "2026-02-13 13:07:29 [test] trade.datamanager.utils INFO: Cutting off today's data for key: SBUX to avoid saving partial day data.\n", + "2026-02-13 13:07:30 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: SBUX with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:07:30 [test] trade.datamanager.market_data INFO: Loaded spot data for symbol SBUX into cache.\n", + "2026-02-13 13:07:30 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: SBUX.\n", + "2026-02-13 13:07:30 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: SBUX\n", + "2026-02-13 13:07:30 [test] trade.datamanager.utils INFO: Sanitizing data from 2017-01-03 00:00:00 to 2026-02-13 13:06:23.580580...\n", + "2026-02-13 13:07:30 [test] trade.datamanager.utils INFO: Converting old cache data structure to new for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:07:30 [test] trade.datamanager.utils INFO: Cached data date range 2025-01-02 to 2026-01-28 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:07:30 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D. Fetching missing dates within range: []\n", + "2026-02-13 13:07:30 [test] trade.datamanager.rates INFO: Cache partially covers requested date range for risk-free rate timeseries. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:07:31 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D to avoid saving partial day data.\n", + "2026-02-13 13:07:31 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D with date range 2025-01-02 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:07:31 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 00:00:00 to 2026-02-13 00:00:00...\n", + "2026-02-13 13:07:31 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-13 13:07:31 [test] trade.datamanager.utils INFO: Cached data date range 2017-01-03 to 2026-02-12 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:07:31 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: SBUX. Fetching missing dates within range: []\n", + "2026-02-13 13:07:32 [test] trade.datamanager.utils INFO: Cutting off today's data for key: SBUX to avoid saving partial day data.\n", + "2026-02-13 13:07:32 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: SBUX with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:07:32 [test] trade.datamanager.market_data INFO: Loaded spot data for symbol SBUX into cache.\n", + "2026-02-13 13:07:32 [test] trade.datamanager.utils INFO: Cached data date range 2017-01-03 to 2026-02-12 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:07:32 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: SBUX. Fetching missing dates within range: []\n", + "2026-02-13 13:07:32 [test] trade.datamanager.utils INFO: Cutting off today's data for key: SBUX to avoid saving partial day data.\n", + "2026-02-13 13:07:32 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: SBUX with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:07:32 [test] trade.datamanager.market_data INFO: Loaded chain spot data for symbol SBUX into cache.\n", + "2026-02-13 13:07:32 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: SBUX.\n", + "2026-02-13 13:07:32 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: SBUX\n", + "2026-02-13 13:07:32 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 13:07:31.769970 to 2026-02-13 13:07:31.769970...\n", + "2026-02-13 13:07:32 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: SBUX.\n", + "2026-02-13 13:07:32 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: SBUX\n", + "2026-02-13 13:07:32 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 13:07:31.769970 to 2026-02-13 13:06:23.580580...\n", + "2026-02-13 13:07:32 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-13 13:07:32 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-13 13:07:32 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-13 13:07:32 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:SBUX|interval:eod|artifact_type:forward|series_id:hist|dividend_type:CONTINUOUS|maturity:2026-09-18|use_chain_spot:1\n", + "2026-02-13 13:07:32 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:SBUX|interval:eod|artifact_type:forward|series_id:hist|dividend_type:CONTINUOUS|maturity:2026-09-18|use_chain_spot:1 to avoid saving partial day data.\n", + "2026-02-13 13:07:32 [test] trade.datamanager.utils INFO: No data left to cache for key: symbol:SBUX|interval:eod|artifact_type:forward|series_id:hist|dividend_type:CONTINUOUS|maturity:2026-09-18|use_chain_spot:1 after removing today's data.\n", + "2026-02-13 13:07:32 [test] trade.datamanager.utils INFO: All data points are NaN for key: symbol:SBUX|interval:eod|artifact_type:forward|series_id:hist|dividend_type:CONTINUOUS|maturity:2026-09-18|use_chain_spot:1. Not caching.\n", + "2026-02-13 13:07:32 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 to 2026-02-13...\n", + "2026-02-13 13:07:32 [test] trade.datamanager.vol INFO: VolDm Using specified dividend type: DivType.CONTINUOUS\n", + "2026-02-13 13:07:32 [test] trade.datamanager.vol INFO: VolDm Using model price: ModelPrice.ASK\n", + "2026-02-13 13:07:32 [test] trade.datamanager.utils INFO: Using cached date range for 2026-02-13 00:00:00 - 2026-02-13 00:00:00 and option tick SBUX20260918C100\n", + "2026-02-13 13:07:32 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market\n", + "2026-02-13 13:07:32 [test] trade.datamanager.utils INFO: No cache found for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market. Fetching from source.\n", + "2026-02-13 13:07:32 [test] trade.datamanager.utils INFO: No data requested to load in _load_model_data_timeseries(). Option: Symbol=SBUX, exp=2026-09-18 00:00:00, strike=100.0 right=C Load bools: d=False, r=False, s=False, f=False, opt_spot=False, vol=False, greek=False\n", + "2026-02-13 13:07:32 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market to avoid saving partial day data.\n", + "2026-02-13 13:07:32 [test] trade.datamanager.utils INFO: No data left to cache for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market after removing today's data.\n", + "2026-02-13 13:07:32 [test] trade.datamanager.utils INFO: All data points are NaN for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market. Not caching.\n", + "2026-02-13 13:07:32 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 to 2026-02-13...\n", + "2026-02-13 13:07:32 [test] trade.datamanager.utils INFO: Using cached date range for 2026-02-13 13:07:32.953147 - 2026-02-13 13:07:32.953147 and option tick SBUX20260918C100\n", + "2026-02-13 13:07:32 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:SBUX|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market\n", + "2026-02-13 13:07:32 [test] trade.datamanager.utils INFO: No cache found for key: symbol:SBUX|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market. Fetching from source.\n", + "2026-02-13 13:07:32 [test] trade.datamanager.utils INFO: No data requested to load in _load_model_data_timeseries(). Option: Symbol=SBUX, exp=2026-09-18 00:00:00, strike=100.0 right=C Load bools: d=False, r=False, s=False, f=False, opt_spot=False, vol=False, greek=False\n", + "2026-02-13 13:07:32 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:SBUX|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market to avoid saving partial day data.\n", + "2026-02-13 13:07:32 [test] trade.datamanager.utils INFO: No data left to cache for key: symbol:SBUX|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market after removing today's data.\n", + "2026-02-13 13:07:32 [test] trade.datamanager.utils INFO: All data points are NaN for key: symbol:SBUX|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:100|volatility_model:market. Not caching.\n", + "2026-02-13 13:07:32 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 to 2026-02-13...\n", + "2026-02-13 13:07:32 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-13 13:07:32 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-13 13:07:32 [test] trade.datamanager.utils INFO: Cached data date range 2017-01-03 to 2026-02-12 does not cover requested range 2017-01-03 to 2026-02-13.\n", + "2026-02-13 13:07:32 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: SBUX. Fetching missing dates within range: []\n", + "2026-02-13 13:07:33 [test] trade.datamanager.utils INFO: Cutting off today's data for key: SBUX to avoid saving partial day data.\n", + "2026-02-13 13:07:33 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: SBUX with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:07:33 [test] trade.datamanager.market_data INFO: Loaded spot data for symbol SBUX into cache.\n", + "2026-02-13 13:07:33 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: SBUX.\n", + "2026-02-13 13:07:33 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: SBUX\n", + "2026-02-13 13:07:33 [test] trade.datamanager.utils INFO: Sanitizing data from 2017-01-03 00:00:00 to 2026-02-13 13:06:23.580580...\n", + "2026-02-13 13:07:33 [test] trade.datamanager.utils INFO: Converting old cache data structure to new for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:07:33 [test] trade.datamanager.utils INFO: Cached data date range 2025-01-02 to 2026-01-28 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:07:33 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D. Fetching missing dates within range: []\n", + "2026-02-13 13:07:33 [test] trade.datamanager.rates INFO: Cache partially covers requested date range for risk-free rate timeseries. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:07:35 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D to avoid saving partial day data.\n", + "2026-02-13 13:07:35 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D with date range 2025-01-02 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:07:35 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 00:00:00 to 2026-02-13 00:00:00...\n", + "2026-02-13 13:07:35 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-13 13:07:35 [test] trade.datamanager.utils INFO: Cached data date range 2017-01-03 to 2026-02-12 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:07:35 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: SBUX. Fetching missing dates within range: []\n", + "2026-02-13 13:07:35 [test] trade.datamanager.utils INFO: Cutting off today's data for key: SBUX to avoid saving partial day data.\n", + "2026-02-13 13:07:35 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: SBUX with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:07:35 [test] trade.datamanager.market_data INFO: Loaded spot data for symbol SBUX into cache.\n", + "2026-02-13 13:07:35 [test] trade.datamanager.utils INFO: Cached data date range 2017-01-03 to 2026-02-12 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:07:35 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: SBUX. Fetching missing dates within range: []\n", + "2026-02-13 13:07:35 [test] trade.datamanager.utils INFO: Cutting off today's data for key: SBUX to avoid saving partial day data.\n", + "2026-02-13 13:07:35 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: SBUX with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:07:35 [test] trade.datamanager.market_data INFO: Loaded chain spot data for symbol SBUX into cache.\n", + "2026-02-13 13:07:35 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: SBUX.\n", + "2026-02-13 13:07:35 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: SBUX\n", + "2026-02-13 13:07:35 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 13:07:35.193989 to 2026-02-13 13:07:35.193989...\n", + "2026-02-13 13:07:35 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: SBUX.\n", + "2026-02-13 13:07:35 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: SBUX\n", + "2026-02-13 13:07:35 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 13:07:35.193989 to 2026-02-13 13:06:23.580580...\n", + "2026-02-13 13:07:35 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-13 13:07:35 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-13 13:07:35 [test] trade.datamanager.vars INFO: Timeseries for SBUX already loaded.\n", + "2026-02-13 13:07:35 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:SBUX|interval:eod|artifact_type:forward|series_id:hist|dividend_type:CONTINUOUS|maturity:2026-09-18|use_chain_spot:1\n", + "2026-02-13 13:07:35 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:SBUX|interval:eod|artifact_type:forward|series_id:hist|dividend_type:CONTINUOUS|maturity:2026-09-18|use_chain_spot:1 to avoid saving partial day data.\n", + "2026-02-13 13:07:35 [test] trade.datamanager.utils INFO: No data left to cache for key: symbol:SBUX|interval:eod|artifact_type:forward|series_id:hist|dividend_type:CONTINUOUS|maturity:2026-09-18|use_chain_spot:1 after removing today's data.\n", + "2026-02-13 13:07:35 [test] trade.datamanager.utils INFO: All data points are NaN for key: symbol:SBUX|interval:eod|artifact_type:forward|series_id:hist|dividend_type:CONTINUOUS|maturity:2026-09-18|use_chain_spot:1. Not caching.\n", + "2026-02-13 13:07:35 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 to 2026-02-13...\n", + "2026-02-13 13:07:36 [test] trade.datamanager.vol INFO: VolDm Using specified dividend type: DivType.CONTINUOUS\n", + "2026-02-13 13:07:36 [test] trade.datamanager.vol INFO: VolDm Using model price: ModelPrice.ASK\n", + "2026-02-13 13:07:36 [test] trade.datamanager.utils INFO: Using cached date range for 2026-02-13 00:00:00 - 2026-02-13 00:00:00 and option tick SBUX20260918C105\n", + "2026-02-13 13:07:36 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:105|volatility_model:market\n", + "2026-02-13 13:07:36 [test] trade.datamanager.utils INFO: No cache found for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:105|volatility_model:market. Fetching from source.\n", + "2026-02-13 13:07:36 [test] trade.datamanager.utils INFO: No data requested to load in _load_model_data_timeseries(). Option: Symbol=SBUX, exp=2026-09-18 00:00:00, strike=105.0 right=C Load bools: d=False, r=False, s=False, f=False, opt_spot=False, vol=False, greek=False\n", + "2026-02-13 13:07:36 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:105|volatility_model:market to avoid saving partial day data.\n", + "2026-02-13 13:07:36 [test] trade.datamanager.utils INFO: No data left to cache for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:105|volatility_model:market after removing today's data.\n", + "2026-02-13 13:07:36 [test] trade.datamanager.utils INFO: All data points are NaN for key: symbol:SBUX|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:105|volatility_model:market. Not caching.\n", + "2026-02-13 13:07:36 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 to 2026-02-13...\n", + "2026-02-13 13:07:36 [test] trade.datamanager.utils INFO: Using cached date range for 2026-02-13 13:07:36.305157 - 2026-02-13 13:07:36.305157 and option tick SBUX20260918C105\n", + "2026-02-13 13:07:36 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:SBUX|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:105|volatility_model:market\n", + "2026-02-13 13:07:36 [test] trade.datamanager.utils INFO: No cache found for key: symbol:SBUX|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:105|volatility_model:market. Fetching from source.\n", + "2026-02-13 13:07:36 [test] trade.datamanager.utils INFO: No data requested to load in _load_model_data_timeseries(). Option: Symbol=SBUX, exp=2026-09-18 00:00:00, strike=105.0 right=C Load bools: d=False, r=False, s=False, f=False, opt_spot=False, vol=False, greek=False\n", + "2026-02-13 13:07:36 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:SBUX|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:105|volatility_model:market to avoid saving partial day data.\n", + "2026-02-13 13:07:36 [test] trade.datamanager.utils INFO: No data left to cache for key: symbol:SBUX|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:105|volatility_model:market after removing today's data.\n", + "2026-02-13 13:07:36 [test] trade.datamanager.utils INFO: All data points are NaN for key: symbol:SBUX|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:105|volatility_model:market. Not caching.\n", + "2026-02-13 13:07:36 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 to 2026-02-13...\n", + "2026-02-13 13:07:36 [test] trade.datamanager.vars INFO: Timeseries for AAPL already loaded.\n", + "2026-02-13 13:07:36 [test] trade.datamanager.vars INFO: Timeseries for AAPL already loaded.\n", + "2026-02-13 13:07:36 [test] trade.datamanager.utils INFO: Cached data date range 2017-01-03 to 2026-02-12 does not cover requested range 2017-01-03 to 2026-02-13.\n", + "2026-02-13 13:07:36 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: AAPL. Fetching missing dates within range: []\n", + "2026-02-13 13:07:36 [test] trade.datamanager.utils INFO: Cutting off today's data for key: AAPL to avoid saving partial day data.\n", + "2026-02-13 13:07:36 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: AAPL with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:07:36 [test] trade.datamanager.market_data INFO: Loaded spot data for symbol AAPL into cache.\n", + "2026-02-13 13:07:36 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: AAPL.\n", + "2026-02-13 13:07:36 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: AAPL\n", + "2026-02-13 13:07:36 [test] trade.datamanager.utils INFO: Sanitizing data from 2017-01-03 00:00:00 to 2026-02-13 13:06:23.580580...\n", + "2026-02-13 13:07:37 [test] trade.datamanager.utils INFO: Converting old cache data structure to new for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:07:37 [test] trade.datamanager.utils INFO: Cached data date range 2025-01-02 to 2026-01-28 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:07:37 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D. Fetching missing dates within range: []\n", + "2026-02-13 13:07:37 [test] trade.datamanager.rates INFO: Cache partially covers requested date range for risk-free rate timeseries. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:07:38 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D to avoid saving partial day data.\n", + "2026-02-13 13:07:38 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D with date range 2025-01-02 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:07:38 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 00:00:00 to 2026-02-13 00:00:00...\n", + "2026-02-13 13:07:38 [test] trade.datamanager.vars INFO: Timeseries for AAPL already loaded.\n", + "2026-02-13 13:07:38 [test] trade.datamanager.utils INFO: Cached data date range 2017-01-03 to 2026-02-12 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:07:38 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: AAPL. Fetching missing dates within range: []\n", + "2026-02-13 13:07:39 [test] trade.datamanager.utils INFO: Cutting off today's data for key: AAPL to avoid saving partial day data.\n", + "2026-02-13 13:07:39 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: AAPL with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:07:39 [test] trade.datamanager.market_data INFO: Loaded spot data for symbol AAPL into cache.\n", + "2026-02-13 13:07:39 [test] trade.datamanager.utils INFO: Cached data date range 2017-01-03 to 2026-02-12 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:07:39 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: AAPL. Fetching missing dates within range: []\n", + "2026-02-13 13:07:39 [test] trade.datamanager.utils INFO: Cutting off today's data for key: AAPL to avoid saving partial day data.\n", + "2026-02-13 13:07:39 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: AAPL with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:07:39 [test] trade.datamanager.market_data INFO: Loaded chain spot data for symbol AAPL into cache.\n", + "2026-02-13 13:07:39 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: AAPL.\n", + "2026-02-13 13:07:39 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: AAPL\n", + "2026-02-13 13:07:39 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 13:07:38.981507 to 2026-02-13 13:07:38.981507...\n", + "2026-02-13 13:07:39 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: AAPL.\n", + "2026-02-13 13:07:39 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: AAPL\n", + "2026-02-13 13:07:39 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 13:07:38.981507 to 2026-02-13 13:06:23.580580...\n", + "2026-02-13 13:07:39 [test] trade.datamanager.vars INFO: Timeseries for AAPL already loaded.\n", + "2026-02-13 13:07:39 [test] trade.datamanager.vars INFO: Timeseries for AAPL already loaded.\n", + "2026-02-13 13:07:39 [test] trade.datamanager.vars INFO: Timeseries for AAPL already loaded.\n", + "2026-02-13 13:07:39 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:AAPL|interval:eod|artifact_type:forward|series_id:hist|dividend_type:CONTINUOUS|maturity:2026-09-18|use_chain_spot:1\n", + "2026-02-13 13:07:39 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:AAPL|interval:eod|artifact_type:forward|series_id:hist|dividend_type:CONTINUOUS|maturity:2026-09-18|use_chain_spot:1 to avoid saving partial day data.\n", + "2026-02-13 13:07:39 [test] trade.datamanager.utils INFO: No data left to cache for key: symbol:AAPL|interval:eod|artifact_type:forward|series_id:hist|dividend_type:CONTINUOUS|maturity:2026-09-18|use_chain_spot:1 after removing today's data.\n", + "2026-02-13 13:07:39 [test] trade.datamanager.utils INFO: All data points are NaN for key: symbol:AAPL|interval:eod|artifact_type:forward|series_id:hist|dividend_type:CONTINUOUS|maturity:2026-09-18|use_chain_spot:1. Not caching.\n", + "2026-02-13 13:07:39 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 to 2026-02-13...\n", + "2026-02-13 13:07:40 [test] trade.datamanager.vol INFO: VolDm Using specified dividend type: DivType.CONTINUOUS\n", + "2026-02-13 13:07:40 [test] trade.datamanager.vol INFO: VolDm Using model price: ModelPrice.ASK\n", + "2026-02-13 13:07:40 [test] trade.datamanager.utils INFO: Using cached date range for 2026-02-13 00:00:00 - 2026-02-13 00:00:00 and option tick AAPL20260918C260\n", + "2026-02-13 13:07:40 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:AAPL|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:260|volatility_model:market\n", + "2026-02-13 13:07:40 [test] trade.datamanager.utils INFO: No cache found for key: symbol:AAPL|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:260|volatility_model:market. Fetching from source.\n", + "2026-02-13 13:07:40 [test] trade.datamanager.utils INFO: No data requested to load in _load_model_data_timeseries(). Option: Symbol=AAPL, exp=2026-09-18 00:00:00, strike=260.0 right=C Load bools: d=False, r=False, s=False, f=False, opt_spot=False, vol=False, greek=False\n", + "2026-02-13 13:07:40 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:AAPL|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:260|volatility_model:market to avoid saving partial day data.\n", + "2026-02-13 13:07:40 [test] trade.datamanager.utils INFO: No data left to cache for key: symbol:AAPL|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:260|volatility_model:market after removing today's data.\n", + "2026-02-13 13:07:40 [test] trade.datamanager.utils INFO: All data points are NaN for key: symbol:AAPL|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:260|volatility_model:market. Not caching.\n", + "2026-02-13 13:07:40 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 to 2026-02-13...\n", + "2026-02-13 13:07:40 [test] trade.datamanager.utils INFO: Using cached date range for 2026-02-13 13:07:40.238373 - 2026-02-13 13:07:40.238373 and option tick AAPL20260918C260\n", + "2026-02-13 13:07:40 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:AAPL|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:260|volatility_model:market\n", + "2026-02-13 13:07:40 [test] trade.datamanager.utils INFO: No cache found for key: symbol:AAPL|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:260|volatility_model:market. Fetching from source.\n", + "2026-02-13 13:07:40 [test] trade.datamanager.utils INFO: No data requested to load in _load_model_data_timeseries(). Option: Symbol=AAPL, exp=2026-09-18 00:00:00, strike=260.0 right=C Load bools: d=False, r=False, s=False, f=False, opt_spot=False, vol=False, greek=False\n", + "2026-02-13 13:07:40 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:AAPL|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:260|volatility_model:market to avoid saving partial day data.\n", + "2026-02-13 13:07:40 [test] trade.datamanager.utils INFO: No data left to cache for key: symbol:AAPL|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:260|volatility_model:market after removing today's data.\n", + "2026-02-13 13:07:40 [test] trade.datamanager.utils INFO: All data points are NaN for key: symbol:AAPL|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:260|volatility_model:market. Not caching.\n", + "2026-02-13 13:07:40 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 to 2026-02-13...\n", + "2026-02-13 13:07:40 [test] trade.datamanager.vars INFO: Timeseries for AAPL already loaded.\n", + "2026-02-13 13:07:40 [test] trade.datamanager.vars INFO: Timeseries for AAPL already loaded.\n", + "2026-02-13 13:07:40 [test] trade.datamanager.utils INFO: Cached data date range 2017-01-03 to 2026-02-12 does not cover requested range 2017-01-03 to 2026-02-13.\n", + "2026-02-13 13:07:40 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: AAPL. Fetching missing dates within range: []\n", + "2026-02-13 13:07:40 [test] trade.datamanager.utils INFO: Cutting off today's data for key: AAPL to avoid saving partial day data.\n", + "2026-02-13 13:07:40 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: AAPL with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:07:40 [test] trade.datamanager.market_data INFO: Loaded spot data for symbol AAPL into cache.\n", + "2026-02-13 13:07:40 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: AAPL.\n", + "2026-02-13 13:07:40 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: AAPL\n", + "2026-02-13 13:07:40 [test] trade.datamanager.utils INFO: Sanitizing data from 2017-01-03 00:00:00 to 2026-02-13 13:06:23.580580...\n", + "2026-02-13 13:07:40 [test] trade.datamanager.utils INFO: Converting old cache data structure to new for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:07:40 [test] trade.datamanager.utils INFO: Cached data date range 2025-01-02 to 2026-01-28 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:07:40 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D. Fetching missing dates within range: []\n", + "2026-02-13 13:07:40 [test] trade.datamanager.rates INFO: Cache partially covers requested date range for risk-free rate timeseries. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:07:42 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D to avoid saving partial day data.\n", + "2026-02-13 13:07:42 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D with date range 2025-01-02 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:07:42 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 00:00:00 to 2026-02-13 00:00:00...\n", + "2026-02-13 13:07:42 [test] trade.datamanager.vars INFO: Timeseries for AAPL already loaded.\n", + "2026-02-13 13:07:42 [test] trade.datamanager.utils INFO: Cached data date range 2017-01-03 to 2026-02-12 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:07:42 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: AAPL. Fetching missing dates within range: []\n", + "2026-02-13 13:07:42 [test] trade.datamanager.utils INFO: Cutting off today's data for key: AAPL to avoid saving partial day data.\n", + "2026-02-13 13:07:42 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: AAPL with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:07:42 [test] trade.datamanager.market_data INFO: Loaded spot data for symbol AAPL into cache.\n", + "2026-02-13 13:07:42 [test] trade.datamanager.utils INFO: Cached data date range 2017-01-03 to 2026-02-12 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:07:42 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: AAPL. Fetching missing dates within range: []\n", + "2026-02-13 13:07:43 [test] trade.datamanager.utils INFO: Cutting off today's data for key: AAPL to avoid saving partial day data.\n", + "2026-02-13 13:07:43 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: AAPL with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:07:43 [test] trade.datamanager.market_data INFO: Loaded chain spot data for symbol AAPL into cache.\n", + "2026-02-13 13:07:43 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: AAPL.\n", + "2026-02-13 13:07:43 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: AAPL\n", + "2026-02-13 13:07:43 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 13:07:42.535628 to 2026-02-13 13:07:42.535628...\n", + "2026-02-13 13:07:43 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: AAPL.\n", + "2026-02-13 13:07:43 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: AAPL\n", + "2026-02-13 13:07:43 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 13:07:42.535628 to 2026-02-13 13:06:23.580580...\n", + "2026-02-13 13:07:43 [test] trade.datamanager.vars INFO: Timeseries for AAPL already loaded.\n", + "2026-02-13 13:07:43 [test] trade.datamanager.vars INFO: Timeseries for AAPL already loaded.\n", + "2026-02-13 13:07:43 [test] trade.datamanager.vars INFO: Timeseries for AAPL already loaded.\n", + "2026-02-13 13:07:43 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:AAPL|interval:eod|artifact_type:forward|series_id:hist|dividend_type:CONTINUOUS|maturity:2026-09-18|use_chain_spot:1\n", + "2026-02-13 13:07:43 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:AAPL|interval:eod|artifact_type:forward|series_id:hist|dividend_type:CONTINUOUS|maturity:2026-09-18|use_chain_spot:1 to avoid saving partial day data.\n", + "2026-02-13 13:07:43 [test] trade.datamanager.utils INFO: No data left to cache for key: symbol:AAPL|interval:eod|artifact_type:forward|series_id:hist|dividend_type:CONTINUOUS|maturity:2026-09-18|use_chain_spot:1 after removing today's data.\n", + "2026-02-13 13:07:43 [test] trade.datamanager.utils INFO: All data points are NaN for key: symbol:AAPL|interval:eod|artifact_type:forward|series_id:hist|dividend_type:CONTINUOUS|maturity:2026-09-18|use_chain_spot:1. Not caching.\n", + "2026-02-13 13:07:43 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 to 2026-02-13...\n", + "2026-02-13 13:07:43 [test] trade.datamanager.vol INFO: VolDm Using specified dividend type: DivType.CONTINUOUS\n", + "2026-02-13 13:07:43 [test] trade.datamanager.vol INFO: VolDm Using model price: ModelPrice.ASK\n", + "2026-02-13 13:07:43 [test] trade.datamanager.utils INFO: Using cached date range for 2026-02-13 00:00:00 - 2026-02-13 00:00:00 and option tick AAPL20260918C265\n", + "2026-02-13 13:07:43 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:AAPL|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:265|volatility_model:market\n", + "2026-02-13 13:07:43 [test] trade.datamanager.utils INFO: No cache found for key: symbol:AAPL|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:265|volatility_model:market. Fetching from source.\n", + "2026-02-13 13:07:43 [test] trade.datamanager.utils INFO: No data requested to load in _load_model_data_timeseries(). Option: Symbol=AAPL, exp=2026-09-18 00:00:00, strike=265.0 right=C Load bools: d=False, r=False, s=False, f=False, opt_spot=False, vol=False, greek=False\n", + "2026-02-13 13:07:43 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:AAPL|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:265|volatility_model:market to avoid saving partial day data.\n", + "2026-02-13 13:07:43 [test] trade.datamanager.utils INFO: No data left to cache for key: symbol:AAPL|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:265|volatility_model:market after removing today's data.\n", + "2026-02-13 13:07:43 [test] trade.datamanager.utils INFO: All data points are NaN for key: symbol:AAPL|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:265|volatility_model:market. Not caching.\n", + "2026-02-13 13:07:43 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 to 2026-02-13...\n", + "2026-02-13 13:07:43 [test] trade.datamanager.utils INFO: Using cached date range for 2026-02-13 13:07:43.732184 - 2026-02-13 13:07:43.732184 and option tick AAPL20260918C265\n", + "2026-02-13 13:07:43 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:AAPL|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:265|volatility_model:market\n", + "2026-02-13 13:07:43 [test] trade.datamanager.utils INFO: No cache found for key: symbol:AAPL|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:265|volatility_model:market. Fetching from source.\n", + "2026-02-13 13:07:43 [test] trade.datamanager.utils INFO: No data requested to load in _load_model_data_timeseries(). Option: Symbol=AAPL, exp=2026-09-18 00:00:00, strike=265.0 right=C Load bools: d=False, r=False, s=False, f=False, opt_spot=False, vol=False, greek=False\n", + "2026-02-13 13:07:43 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:AAPL|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:265|volatility_model:market to avoid saving partial day data.\n", + "2026-02-13 13:07:43 [test] trade.datamanager.utils INFO: No data left to cache for key: symbol:AAPL|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:265|volatility_model:market after removing today's data.\n", + "2026-02-13 13:07:43 [test] trade.datamanager.utils INFO: All data points are NaN for key: symbol:AAPL|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:265|volatility_model:market. Not caching.\n", + "2026-02-13 13:07:43 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 to 2026-02-13...\n", + "2026-02-13 13:07:43 [test] trade.datamanager.vars INFO: Timeseries for AMD already loaded.\n", + "2026-02-13 13:07:43 [test] trade.datamanager.vars INFO: Timeseries for AMD already loaded.\n", + "2026-02-13 13:07:43 [test] trade.datamanager.utils INFO: Cached data date range 2017-01-03 to 2026-02-12 does not cover requested range 2017-01-03 to 2026-02-13.\n", + "2026-02-13 13:07:43 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: AMD. Fetching missing dates within range: []\n", + "2026-02-13 13:07:44 [test] trade.datamanager.utils INFO: Cutting off today's data for key: AMD to avoid saving partial day data.\n", + "2026-02-13 13:07:44 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: AMD with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:07:44 [test] trade.datamanager.market_data INFO: Loaded spot data for symbol AMD into cache.\n", + "2026-02-13 13:07:44 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: AMD.\n", + "2026-02-13 13:07:44 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: AMD\n", + "2026-02-13 13:07:44 [test] trade.datamanager.utils INFO: Sanitizing data from 2017-01-03 00:00:00 to 2026-02-13 13:06:23.580580...\n", + "2026-02-13 13:07:44 [test] trade.datamanager.utils INFO: Converting old cache data structure to new for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:07:44 [test] trade.datamanager.utils INFO: Cached data date range 2025-01-02 to 2026-01-28 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:07:44 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D. Fetching missing dates within range: []\n", + "2026-02-13 13:07:44 [test] trade.datamanager.rates INFO: Cache partially covers requested date range for risk-free rate timeseries. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:07:46 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D to avoid saving partial day data.\n", + "2026-02-13 13:07:46 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D with date range 2025-01-02 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:07:46 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 00:00:00 to 2026-02-13 00:00:00...\n", + "2026-02-13 13:07:46 [test] trade.datamanager.vars INFO: Timeseries for AMD already loaded.\n", + "2026-02-13 13:07:46 [test] trade.datamanager.utils INFO: Cached data date range 2017-01-03 to 2026-02-12 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:07:46 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: AMD. Fetching missing dates within range: []\n", + "2026-02-13 13:07:46 [test] trade.datamanager.utils INFO: Cutting off today's data for key: AMD to avoid saving partial day data.\n", + "2026-02-13 13:07:46 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: AMD with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:07:46 [test] trade.datamanager.market_data INFO: Loaded spot data for symbol AMD into cache.\n", + "2026-02-13 13:07:46 [test] trade.datamanager.utils INFO: Cached data date range 2017-01-03 to 2026-02-12 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:07:46 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: AMD. Fetching missing dates within range: []\n", + "2026-02-13 13:07:46 [test] trade.datamanager.utils INFO: Cutting off today's data for key: AMD to avoid saving partial day data.\n", + "2026-02-13 13:07:46 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: AMD with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:07:46 [test] trade.datamanager.market_data INFO: Loaded chain spot data for symbol AMD into cache.\n", + "2026-02-13 13:07:46 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: AMD.\n", + "2026-02-13 13:07:46 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: AMD\n", + "2026-02-13 13:07:46 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 13:07:46.144106 to 2026-02-13 13:07:46.144106...\n", + "2026-02-13 13:07:46 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: AMD.\n", + "2026-02-13 13:07:46 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: AMD\n", + "2026-02-13 13:07:46 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 13:07:46.144106 to 2026-02-13 13:06:23.580580...\n", + "2026-02-13 13:07:46 [test] trade.datamanager.vars INFO: Timeseries for AMD already loaded.\n", + "2026-02-13 13:07:46 [test] trade.datamanager.vars INFO: Timeseries for AMD already loaded.\n", + "2026-02-13 13:07:46 [test] trade.datamanager.vars INFO: Timeseries for AMD already loaded.\n", + "2026-02-13 13:07:46 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:AMD|interval:eod|artifact_type:forward|series_id:hist|dividend_type:CONTINUOUS|maturity:2026-09-18|use_chain_spot:1\n", + "2026-02-13 13:07:46 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:AMD|interval:eod|artifact_type:forward|series_id:hist|dividend_type:CONTINUOUS|maturity:2026-09-18|use_chain_spot:1 to avoid saving partial day data.\n", + "2026-02-13 13:07:46 [test] trade.datamanager.utils INFO: No data left to cache for key: symbol:AMD|interval:eod|artifact_type:forward|series_id:hist|dividend_type:CONTINUOUS|maturity:2026-09-18|use_chain_spot:1 after removing today's data.\n", + "2026-02-13 13:07:46 [test] trade.datamanager.utils INFO: All data points are NaN for key: symbol:AMD|interval:eod|artifact_type:forward|series_id:hist|dividend_type:CONTINUOUS|maturity:2026-09-18|use_chain_spot:1. Not caching.\n", + "2026-02-13 13:07:46 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 to 2026-02-13...\n", + "2026-02-13 13:07:46 [test] trade.datamanager.vol INFO: VolDm Using specified dividend type: DivType.CONTINUOUS\n", + "2026-02-13 13:07:46 [test] trade.datamanager.vol INFO: VolDm Using model price: ModelPrice.ASK\n", + "2026-02-13 13:07:46 [test] trade.datamanager.utils INFO: Using cached date range for 2026-02-13 00:00:00 - 2026-02-13 00:00:00 and option tick AMD20260918C280\n", + "2026-02-13 13:07:46 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:AMD|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:280|volatility_model:market\n", + "2026-02-13 13:07:46 [test] trade.datamanager.utils INFO: No cache found for key: symbol:AMD|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:280|volatility_model:market. Fetching from source.\n", + "2026-02-13 13:07:46 [test] trade.datamanager.utils INFO: No data requested to load in _load_model_data_timeseries(). Option: Symbol=AMD, exp=2026-09-18 00:00:00, strike=280.0 right=C Load bools: d=False, r=False, s=False, f=False, opt_spot=False, vol=False, greek=False\n", + "2026-02-13 13:07:47 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:AMD|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:280|volatility_model:market to avoid saving partial day data.\n", + "2026-02-13 13:07:47 [test] trade.datamanager.utils INFO: No data left to cache for key: symbol:AMD|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:280|volatility_model:market after removing today's data.\n", + "2026-02-13 13:07:47 [test] trade.datamanager.utils INFO: All data points are NaN for key: symbol:AMD|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:280|volatility_model:market. Not caching.\n", + "2026-02-13 13:07:47 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 to 2026-02-13...\n", + "2026-02-13 13:07:47 [test] trade.datamanager.utils INFO: Using cached date range for 2026-02-13 13:07:47.024454 - 2026-02-13 13:07:47.024454 and option tick AMD20260918C280\n", + "2026-02-13 13:07:47 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:AMD|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:280|volatility_model:market\n", + "2026-02-13 13:07:47 [test] trade.datamanager.utils INFO: No cache found for key: symbol:AMD|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:280|volatility_model:market. Fetching from source.\n", + "2026-02-13 13:07:47 [test] trade.datamanager.utils INFO: No data requested to load in _load_model_data_timeseries(). Option: Symbol=AMD, exp=2026-09-18 00:00:00, strike=280.0 right=C Load bools: d=False, r=False, s=False, f=False, opt_spot=False, vol=False, greek=False\n", + "2026-02-13 13:07:47 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:AMD|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:280|volatility_model:market to avoid saving partial day data.\n", + "2026-02-13 13:07:47 [test] trade.datamanager.utils INFO: No data left to cache for key: symbol:AMD|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:280|volatility_model:market after removing today's data.\n", + "2026-02-13 13:07:47 [test] trade.datamanager.utils INFO: All data points are NaN for key: symbol:AMD|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:280|volatility_model:market. Not caching.\n", + "2026-02-13 13:07:47 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 to 2026-02-13...\n", + "2026-02-13 13:07:47 [test] trade.datamanager.vars INFO: Timeseries for AMD already loaded.\n", + "2026-02-13 13:07:47 [test] trade.datamanager.vars INFO: Timeseries for AMD already loaded.\n", + "2026-02-13 13:07:47 [test] trade.datamanager.utils INFO: Cached data date range 2017-01-03 to 2026-02-12 does not cover requested range 2017-01-03 to 2026-02-13.\n", + "2026-02-13 13:07:47 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: AMD. Fetching missing dates within range: []\n", + "2026-02-13 13:07:47 [test] trade.datamanager.utils INFO: Cutting off today's data for key: AMD to avoid saving partial day data.\n", + "2026-02-13 13:07:47 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: AMD with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:07:47 [test] trade.datamanager.market_data INFO: Loaded spot data for symbol AMD into cache.\n", + "2026-02-13 13:07:47 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: AMD.\n", + "2026-02-13 13:07:47 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: AMD\n", + "2026-02-13 13:07:47 [test] trade.datamanager.utils INFO: Sanitizing data from 2017-01-03 00:00:00 to 2026-02-13 13:06:23.580580...\n", + "2026-02-13 13:07:47 [test] trade.datamanager.utils INFO: Converting old cache data structure to new for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:07:47 [test] trade.datamanager.utils INFO: Cached data date range 2025-01-02 to 2026-01-28 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:07:47 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D. Fetching missing dates within range: []\n", + "2026-02-13 13:07:47 [test] trade.datamanager.rates INFO: Cache partially covers requested date range for risk-free rate timeseries. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:07:49 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D to avoid saving partial day data.\n", + "2026-02-13 13:07:49 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D with date range 2025-01-02 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:07:49 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 00:00:00 to 2026-02-13 00:00:00...\n", + "2026-02-13 13:07:49 [test] trade.datamanager.vars INFO: Timeseries for AMD already loaded.\n", + "2026-02-13 13:07:49 [test] trade.datamanager.utils INFO: Cached data date range 2017-01-03 to 2026-02-12 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:07:49 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: AMD. Fetching missing dates within range: []\n", + "2026-02-13 13:07:49 [test] trade.datamanager.utils INFO: Cutting off today's data for key: AMD to avoid saving partial day data.\n", + "2026-02-13 13:07:49 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: AMD with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:07:49 [test] trade.datamanager.market_data INFO: Loaded spot data for symbol AMD into cache.\n", + "2026-02-13 13:07:49 [test] trade.datamanager.utils INFO: Cached data date range 2017-01-03 to 2026-02-12 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:07:49 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: AMD. Fetching missing dates within range: []\n", + "2026-02-13 13:07:49 [test] trade.datamanager.utils INFO: Cutting off today's data for key: AMD to avoid saving partial day data.\n", + "2026-02-13 13:07:49 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: AMD with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:07:49 [test] trade.datamanager.market_data INFO: Loaded chain spot data for symbol AMD into cache.\n", + "2026-02-13 13:07:50 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: AMD.\n", + "2026-02-13 13:07:50 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: AMD\n", + "2026-02-13 13:07:50 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 13:07:49.335853 to 2026-02-13 13:07:49.335853...\n", + "2026-02-13 13:07:50 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: AMD.\n", + "2026-02-13 13:07:50 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: AMD\n", + "2026-02-13 13:07:50 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 13:07:49.335853 to 2026-02-13 13:06:23.580580...\n", + "2026-02-13 13:07:50 [test] trade.datamanager.vars INFO: Timeseries for AMD already loaded.\n", + "2026-02-13 13:07:50 [test] trade.datamanager.vars INFO: Timeseries for AMD already loaded.\n", + "2026-02-13 13:07:50 [test] trade.datamanager.vars INFO: Timeseries for AMD already loaded.\n", + "2026-02-13 13:07:50 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:AMD|interval:eod|artifact_type:forward|series_id:hist|dividend_type:CONTINUOUS|maturity:2026-09-18|use_chain_spot:1\n", + "2026-02-13 13:07:50 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:AMD|interval:eod|artifact_type:forward|series_id:hist|dividend_type:CONTINUOUS|maturity:2026-09-18|use_chain_spot:1 to avoid saving partial day data.\n", + "2026-02-13 13:07:50 [test] trade.datamanager.utils INFO: No data left to cache for key: symbol:AMD|interval:eod|artifact_type:forward|series_id:hist|dividend_type:CONTINUOUS|maturity:2026-09-18|use_chain_spot:1 after removing today's data.\n", + "2026-02-13 13:07:50 [test] trade.datamanager.utils INFO: All data points are NaN for key: symbol:AMD|interval:eod|artifact_type:forward|series_id:hist|dividend_type:CONTINUOUS|maturity:2026-09-18|use_chain_spot:1. Not caching.\n", + "2026-02-13 13:07:50 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 to 2026-02-13...\n", + "2026-02-13 13:07:50 [test] trade.datamanager.vol INFO: VolDm Using specified dividend type: DivType.CONTINUOUS\n", + "2026-02-13 13:07:50 [test] trade.datamanager.vol INFO: VolDm Using model price: ModelPrice.ASK\n", + "2026-02-13 13:07:50 [test] trade.datamanager.utils INFO: Using cached date range for 2026-02-13 00:00:00 - 2026-02-13 00:00:00 and option tick AMD20260918C290\n", + "2026-02-13 13:07:50 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:AMD|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:290|volatility_model:market\n", + "2026-02-13 13:07:50 [test] trade.datamanager.utils INFO: No cache found for key: symbol:AMD|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:290|volatility_model:market. Fetching from source.\n", + "2026-02-13 13:07:50 [test] trade.datamanager.utils INFO: No data requested to load in _load_model_data_timeseries(). Option: Symbol=AMD, exp=2026-09-18 00:00:00, strike=290.0 right=C Load bools: d=False, r=False, s=False, f=False, opt_spot=False, vol=False, greek=False\n", + "2026-02-13 13:07:50 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:AMD|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:290|volatility_model:market to avoid saving partial day data.\n", + "2026-02-13 13:07:50 [test] trade.datamanager.utils INFO: No data left to cache for key: symbol:AMD|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:290|volatility_model:market after removing today's data.\n", + "2026-02-13 13:07:50 [test] trade.datamanager.utils INFO: All data points are NaN for key: symbol:AMD|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:290|volatility_model:market. Not caching.\n", + "2026-02-13 13:07:50 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 to 2026-02-13...\n", + "2026-02-13 13:07:50 [test] trade.datamanager.utils INFO: Using cached date range for 2026-02-13 13:07:50.269653 - 2026-02-13 13:07:50.269653 and option tick AMD20260918C290\n", + "2026-02-13 13:07:50 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:AMD|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:290|volatility_model:market\n", + "2026-02-13 13:07:50 [test] trade.datamanager.utils INFO: No cache found for key: symbol:AMD|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:290|volatility_model:market. Fetching from source.\n", + "2026-02-13 13:07:50 [test] trade.datamanager.utils INFO: No data requested to load in _load_model_data_timeseries(). Option: Symbol=AMD, exp=2026-09-18 00:00:00, strike=290.0 right=C Load bools: d=False, r=False, s=False, f=False, opt_spot=False, vol=False, greek=False\n", + "2026-02-13 13:07:50 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:AMD|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:290|volatility_model:market to avoid saving partial day data.\n", + "2026-02-13 13:07:50 [test] trade.datamanager.utils INFO: No data left to cache for key: symbol:AMD|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:290|volatility_model:market after removing today's data.\n", + "2026-02-13 13:07:50 [test] trade.datamanager.utils INFO: All data points are NaN for key: symbol:AMD|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:290|volatility_model:market. Not caching.\n", + "2026-02-13 13:07:50 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 to 2026-02-13...\n", + "2026-02-13 13:07:50 [test] trade.datamanager.vars INFO: Timeseries for META already loaded.\n", + "2026-02-13 13:07:50 [test] trade.datamanager.vars INFO: Timeseries for META already loaded.\n", + "2026-02-13 13:07:50 [test] trade.datamanager.utils INFO: Cached data date range 2017-01-03 to 2026-02-12 does not cover requested range 2017-01-03 to 2026-02-13.\n", + "2026-02-13 13:07:50 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: META. Fetching missing dates within range: []\n", + "2026-02-13 13:07:50 [test] trade.datamanager.utils INFO: Cutting off today's data for key: META to avoid saving partial day data.\n", + "2026-02-13 13:07:50 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: META with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:07:50 [test] trade.datamanager.market_data INFO: Loaded spot data for symbol META into cache.\n", + "2026-02-13 13:07:50 [test] trade.datamanager.utils INFO: Cached data date range 2024-02-21 to 2026-02-13 does not cover requested range 2017-01-03 to 2026-02-13.\n", + "2026-02-13 13:07:50 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: META. Fetching missing dates within range: []\n", + "2026-02-13 13:07:50 [test] trade.datamanager.market_data_helpers.dividends INFO: Ticker META found in dividend cache.\n", + "2026-02-13 13:07:50 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: META with date range 2024-02-21 to 2026-02-13, missing dates within range: []\n", + "2026-02-13 13:07:50 [test] trade.datamanager.market_data INFO: Loaded dividend data for symbol META into cache.\n", + "2026-02-13 13:07:50 [test] trade.datamanager.utils INFO: Converting old cache data structure to new for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:07:50 [test] trade.datamanager.utils INFO: Cached data date range 2025-01-02 to 2026-01-28 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:07:50 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D. Fetching missing dates within range: []\n", + "2026-02-13 13:07:50 [test] trade.datamanager.rates INFO: Cache partially covers requested date range for risk-free rate timeseries. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:07:52 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D to avoid saving partial day data.\n", + "2026-02-13 13:07:52 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D with date range 2025-01-02 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:07:52 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 00:00:00 to 2026-02-13 00:00:00...\n", + "2026-02-13 13:07:52 [test] trade.datamanager.vars INFO: Timeseries for META already loaded.\n", + "2026-02-13 13:07:52 [test] trade.datamanager.utils INFO: Cached data date range 2017-01-03 to 2026-02-12 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:07:52 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: META. Fetching missing dates within range: []\n", + "2026-02-13 13:07:52 [test] trade.datamanager.utils INFO: Cutting off today's data for key: META to avoid saving partial day data.\n", + "2026-02-13 13:07:52 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: META with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:07:52 [test] trade.datamanager.market_data INFO: Loaded spot data for symbol META into cache.\n", + "2026-02-13 13:07:52 [test] trade.datamanager.utils INFO: Cached data date range 2017-01-03 to 2026-02-12 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:07:52 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: META. Fetching missing dates within range: []\n", + "2026-02-13 13:07:53 [test] trade.datamanager.utils INFO: Cutting off today's data for key: META to avoid saving partial day data.\n", + "2026-02-13 13:07:53 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: META with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:07:53 [test] trade.datamanager.market_data INFO: Loaded chain spot data for symbol META into cache.\n", + "2026-02-13 13:07:53 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: META.\n", + "2026-02-13 13:07:53 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: META\n", + "2026-02-13 13:07:53 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 13:07:52.558231 to 2026-02-13 13:07:52.558231...\n", + "2026-02-13 13:07:53 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: META.\n", + "2026-02-13 13:07:53 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: META\n", + "2026-02-13 13:07:53 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 13:07:52.558231 to 2026-02-13 13:06:23.580580...\n", + "2026-02-13 13:07:53 [test] trade.datamanager.vars INFO: Timeseries for META already loaded.\n", + "2026-02-13 13:07:53 [test] trade.datamanager.vars INFO: Timeseries for META already loaded.\n", + "2026-02-13 13:07:53 [test] trade.datamanager.vars INFO: Timeseries for META already loaded.\n", + "2026-02-13 13:07:53 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:META|interval:eod|artifact_type:forward|series_id:hist|dividend_type:CONTINUOUS|maturity:2026-09-18|use_chain_spot:1\n", + "2026-02-13 13:07:53 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:META|interval:eod|artifact_type:forward|series_id:hist|dividend_type:CONTINUOUS|maturity:2026-09-18|use_chain_spot:1 to avoid saving partial day data.\n", + "2026-02-13 13:07:53 [test] trade.datamanager.utils INFO: No data left to cache for key: symbol:META|interval:eod|artifact_type:forward|series_id:hist|dividend_type:CONTINUOUS|maturity:2026-09-18|use_chain_spot:1 after removing today's data.\n", + "2026-02-13 13:07:53 [test] trade.datamanager.utils INFO: All data points are NaN for key: symbol:META|interval:eod|artifact_type:forward|series_id:hist|dividend_type:CONTINUOUS|maturity:2026-09-18|use_chain_spot:1. Not caching.\n", + "2026-02-13 13:07:53 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 to 2026-02-13...\n", + "2026-02-13 13:07:53 [test] trade.datamanager.vol INFO: VolDm Using specified dividend type: DivType.CONTINUOUS\n", + "2026-02-13 13:07:53 [test] trade.datamanager.vol INFO: VolDm Using model price: ModelPrice.ASK\n", + "2026-02-13 13:07:53 [test] trade.datamanager.utils INFO: Using cached date range for 2026-02-13 00:00:00 - 2026-02-13 00:00:00 and option tick META20260918C890\n", + "2026-02-13 13:07:53 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:META|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:890|volatility_model:market\n", + "2026-02-13 13:07:53 [test] trade.datamanager.utils INFO: No cache found for key: symbol:META|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:890|volatility_model:market. Fetching from source.\n", + "2026-02-13 13:07:53 [test] trade.datamanager.utils INFO: No data requested to load in _load_model_data_timeseries(). Option: Symbol=META, exp=2026-09-18 00:00:00, strike=890.0 right=C Load bools: d=False, r=False, s=False, f=False, opt_spot=False, vol=False, greek=False\n", + "2026-02-13 13:07:53 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:META|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:890|volatility_model:market to avoid saving partial day data.\n", + "2026-02-13 13:07:53 [test] trade.datamanager.utils INFO: No data left to cache for key: symbol:META|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:890|volatility_model:market after removing today's data.\n", + "2026-02-13 13:07:53 [test] trade.datamanager.utils INFO: All data points are NaN for key: symbol:META|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:890|volatility_model:market. Not caching.\n", + "2026-02-13 13:07:53 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 to 2026-02-13...\n", + "2026-02-13 13:07:53 [test] trade.datamanager.utils INFO: Using cached date range for 2026-02-13 13:07:53.487258 - 2026-02-13 13:07:53.487258 and option tick META20260918C890\n", + "2026-02-13 13:07:53 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:META|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:890|volatility_model:market\n", + "2026-02-13 13:07:53 [test] trade.datamanager.utils INFO: No cache found for key: symbol:META|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:890|volatility_model:market. Fetching from source.\n", + "2026-02-13 13:07:53 [test] trade.datamanager.utils INFO: No data requested to load in _load_model_data_timeseries(). Option: Symbol=META, exp=2026-09-18 00:00:00, strike=890.0 right=C Load bools: d=False, r=False, s=False, f=False, opt_spot=False, vol=False, greek=False\n", + "2026-02-13 13:07:53 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:META|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:890|volatility_model:market to avoid saving partial day data.\n", + "2026-02-13 13:07:53 [test] trade.datamanager.utils INFO: No data left to cache for key: symbol:META|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:890|volatility_model:market after removing today's data.\n", + "2026-02-13 13:07:53 [test] trade.datamanager.utils INFO: All data points are NaN for key: symbol:META|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:890|volatility_model:market. Not caching.\n", + "2026-02-13 13:07:53 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 to 2026-02-13...\n", + "2026-02-13 13:07:53 [test] trade.datamanager.vars INFO: Timeseries for META already loaded.\n", + "2026-02-13 13:07:53 [test] trade.datamanager.vars INFO: Timeseries for META already loaded.\n", + "2026-02-13 13:07:53 [test] trade.datamanager.utils INFO: Cached data date range 2017-01-03 to 2026-02-12 does not cover requested range 2017-01-03 to 2026-02-13.\n", + "2026-02-13 13:07:53 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: META. Fetching missing dates within range: []\n", + "2026-02-13 13:07:53 [test] trade.datamanager.utils INFO: Cutting off today's data for key: META to avoid saving partial day data.\n", + "2026-02-13 13:07:53 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: META with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:07:53 [test] trade.datamanager.market_data INFO: Loaded spot data for symbol META into cache.\n", + "2026-02-13 13:07:53 [test] trade.datamanager.utils INFO: Cached data date range 2024-02-21 to 2026-02-13 does not cover requested range 2017-01-03 to 2026-02-13.\n", + "2026-02-13 13:07:53 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: META. Fetching missing dates within range: []\n", + "2026-02-13 13:07:53 [test] trade.datamanager.market_data_helpers.dividends INFO: Ticker META found in dividend cache.\n", + "2026-02-13 13:07:54 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: META with date range 2024-02-21 to 2026-02-13, missing dates within range: []\n", + "2026-02-13 13:07:54 [test] trade.datamanager.market_data INFO: Loaded dividend data for symbol META into cache.\n", + "2026-02-13 13:07:54 [test] trade.datamanager.utils INFO: Converting old cache data structure to new for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:07:54 [test] trade.datamanager.utils INFO: Cached data date range 2025-01-02 to 2026-01-28 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:07:54 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D. Fetching missing dates within range: []\n", + "2026-02-13 13:07:54 [test] trade.datamanager.rates INFO: Cache partially covers requested date range for risk-free rate timeseries. Key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D\n", + "2026-02-13 13:07:55 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D to avoid saving partial day data.\n", + "2026-02-13 13:07:55 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: symbol:^IRX|interval:eod|artifact_type:rates|series_id:hist|fn_interval:1D with date range 2025-01-02 to 2026-01-28, missing dates within range: []\n", + "2026-02-13 13:07:55 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 00:00:00 to 2026-02-13 00:00:00...\n", + "2026-02-13 13:07:55 [test] trade.datamanager.vars INFO: Timeseries for META already loaded.\n", + "2026-02-13 13:07:55 [test] trade.datamanager.utils INFO: Cached data date range 2017-01-03 to 2026-02-12 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:07:55 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: META. Fetching missing dates within range: []\n", + "2026-02-13 13:07:56 [test] trade.datamanager.utils INFO: Cutting off today's data for key: META to avoid saving partial day data.\n", + "2026-02-13 13:07:56 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: META with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:07:56 [test] trade.datamanager.market_data INFO: Loaded spot data for symbol META into cache.\n", + "2026-02-13 13:07:56 [test] trade.datamanager.utils INFO: Cached data date range 2017-01-03 to 2026-02-12 does not cover requested range 2026-02-13 to 2026-02-13.\n", + "2026-02-13 13:07:56 [test] trade.datamanager.utils INFO: Cache partially covers requested date range for timeseries data structure. Key: META. Fetching missing dates within range: []\n", + "2026-02-13 13:07:56 [test] trade.datamanager.utils INFO: Cutting off today's data for key: META to avoid saving partial day data.\n", + "2026-02-13 13:07:56 [test] trade.datamanager.utils INFO: Caching timeseries data structure for key: META with date range 2017-01-03 to 2026-02-12, missing dates within range: []\n", + "2026-02-13 13:07:56 [test] trade.datamanager.market_data INFO: Loaded chain spot data for symbol META into cache.\n", + "2026-02-13 13:07:56 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: META.\n", + "2026-02-13 13:07:56 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: META\n", + "2026-02-13 13:07:56 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 13:07:55.668018 to 2026-02-13 13:07:55.668018...\n", + "2026-02-13 13:07:56 [test] trade.datamanager.utils INFO: No missing dates within cached data range for key: META.\n", + "2026-02-13 13:07:56 [test] trade.datamanager.utils INFO: Cache hit for timeseries data structure key: META\n", + "2026-02-13 13:07:56 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 13:07:55.668018 to 2026-02-13 13:06:23.580580...\n", + "2026-02-13 13:07:56 [test] trade.datamanager.vars INFO: Timeseries for META already loaded.\n", + "2026-02-13 13:07:56 [test] trade.datamanager.vars INFO: Timeseries for META already loaded.\n", + "2026-02-13 13:07:56 [test] trade.datamanager.vars INFO: Timeseries for META already loaded.\n", + "2026-02-13 13:07:56 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:META|interval:eod|artifact_type:forward|series_id:hist|dividend_type:CONTINUOUS|maturity:2026-09-18|use_chain_spot:1\n", + "2026-02-13 13:07:56 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:META|interval:eod|artifact_type:forward|series_id:hist|dividend_type:CONTINUOUS|maturity:2026-09-18|use_chain_spot:1 to avoid saving partial day data.\n", + "2026-02-13 13:07:56 [test] trade.datamanager.utils INFO: No data left to cache for key: symbol:META|interval:eod|artifact_type:forward|series_id:hist|dividend_type:CONTINUOUS|maturity:2026-09-18|use_chain_spot:1 after removing today's data.\n", + "2026-02-13 13:07:56 [test] trade.datamanager.utils INFO: All data points are NaN for key: symbol:META|interval:eod|artifact_type:forward|series_id:hist|dividend_type:CONTINUOUS|maturity:2026-09-18|use_chain_spot:1. Not caching.\n", + "2026-02-13 13:07:56 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 to 2026-02-13...\n", + "2026-02-13 13:07:56 [test] trade.datamanager.vol INFO: VolDm Using specified dividend type: DivType.CONTINUOUS\n", + "2026-02-13 13:07:56 [test] trade.datamanager.vol INFO: VolDm Using model price: ModelPrice.ASK\n", + "2026-02-13 13:07:56 [test] trade.datamanager.utils INFO: Using cached date range for 2026-02-13 00:00:00 - 2026-02-13 00:00:00 and option tick META20260918C900\n", + "2026-02-13 13:07:56 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:META|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:900|volatility_model:market\n", + "2026-02-13 13:07:56 [test] trade.datamanager.utils INFO: No cache found for key: symbol:META|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:900|volatility_model:market. Fetching from source.\n", + "2026-02-13 13:07:56 [test] trade.datamanager.utils INFO: No data requested to load in _load_model_data_timeseries(). Option: Symbol=META, exp=2026-09-18 00:00:00, strike=900.0 right=C Load bools: d=False, r=False, s=False, f=False, opt_spot=False, vol=False, greek=False\n", + "2026-02-13 13:07:56 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:META|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:900|volatility_model:market to avoid saving partial day data.\n", + "2026-02-13 13:07:56 [test] trade.datamanager.utils INFO: No data left to cache for key: symbol:META|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:900|volatility_model:market after removing today's data.\n", + "2026-02-13 13:07:56 [test] trade.datamanager.utils INFO: All data points are NaN for key: symbol:META|interval:eod|artifact_type:iv|series_id:hist|american:1|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|n_steps:100|option_pricing_model:Binomial|right:C|strike:900|volatility_model:market. Not caching.\n", + "2026-02-13 13:07:56 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 to 2026-02-13...\n", + "2026-02-13 13:07:56 [test] trade.datamanager.utils INFO: Using cached date range for 2026-02-13 13:07:56.627782 - 2026-02-13 13:07:56.627782 and option tick META20260918C900\n", + "2026-02-13 13:07:56 [test] trade.datamanager.utils INFO: No cache entry found for key: symbol:META|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:900|volatility_model:market\n", + "2026-02-13 13:07:56 [test] trade.datamanager.utils INFO: No cache found for key: symbol:META|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:900|volatility_model:market. Fetching from source.\n", + "2026-02-13 13:07:56 [test] trade.datamanager.utils INFO: No data requested to load in _load_model_data_timeseries(). Option: Symbol=META, exp=2026-09-18 00:00:00, strike=900.0 right=C Load bools: d=False, r=False, s=False, f=False, opt_spot=False, vol=False, greek=False\n", + "2026-02-13 13:07:56 [test] trade.datamanager.utils INFO: Cutting off today's data for key: symbol:META|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:900|volatility_model:market to avoid saving partial day data.\n", + "2026-02-13 13:07:56 [test] trade.datamanager.utils INFO: No data left to cache for key: symbol:META|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:900|volatility_model:market after removing today's data.\n", + "2026-02-13 13:07:56 [test] trade.datamanager.utils INFO: All data points are NaN for key: symbol:META|interval:eod|artifact_type:greeks|series_id:hist|dividend_type:continuous|endpoint_source:quote|expiration:20260918T000000|model_price:ask|option_pricing_model:Binomial|right:C|strike:900|volatility_model:market. Not caching.\n", + "2026-02-13 13:07:56 [test] trade.datamanager.utils INFO: Sanitizing data from 2026-02-13 to 2026-02-13...\n" + ] + } + ], + "source": [ + "rt_full_data = []\n", + "for option_meta in option_metas:\n", + " request = LoadRequest(\n", + " symbol=option_meta[\"symbol\"],\n", + "\n", + " expiration=option_meta[\"expiration\"],\n", + " strike=option_meta[\"strike\"],\n", + " right=option_meta[\"right\"],\n", + " series_id=SeriesId.HIST,\n", + " dividend_type=DivType.CONTINUOUS,\n", + " endpoint_source=OptionSpotEndpointSource.QUOTE,\n", + " vol_model=VolatilityModel.MARKET,\n", + " market_model=OptionPricingModel.BINOMIAL,\n", + " model_price=ModelPrice.ASK,\n", + " load_spot=True,\n", + " load_dividend=True,\n", + " load_forward=True,\n", + " load_option_spot=True,\n", + " load_vol=True,\n", + " load_greek=True,\n", + " load_rates=True,\n", + " undo_adjust=True,\n", + " rt=True,\n", + " )\n", + " data_packet = _load_model_data_timeseries(request)\n", + " rt_full_data.append(data_packet)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0b070efc", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "datetime\n", + "2026-02-02 5.625\n", + "Name: midpoint, dtype: float64" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "OptionSpotDataManager(\"SBUX\").rt(\n", + " strike=100.0,\n", + " right=\"C\",\n", + " expiration=\"2026-09-18\",\n", + ").price" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2d7dee52", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2026-02-02 11:46:10 [long_bbands] algo.__init__ CRITICAL: ALGO_DIR not on main branch; skipping runtime safeguards.\n", + "[get_engine] Creating engine for DB: master_config (base: master_config), PID: 8931\n", + "[get_engine] Creating engine for DB: portfolio_data_long_bbands (base: portfolio_data), PID: 8931\n" + ] + }, + { + "data": { + "text/html": [ + " \n", + "
\n", + " \n", + " Loading BokehJS ...\n", + "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": "'use strict';\n(function(root) {\n function now() {\n return new Date();\n }\n\n const force = true;\n\n if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n root._bokeh_onload_callbacks = [];\n root._bokeh_is_loading = undefined;\n }\n\nconst JS_MIME_TYPE = 'application/javascript';\n const HTML_MIME_TYPE = 'text/html';\n const EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n const CLASS_NAME = 'output_bokeh rendered_html';\n\n /**\n * Render data to the DOM node\n */\n function render(props, node) {\n const script = document.createElement(\"script\");\n node.appendChild(script);\n }\n\n /**\n * Handle when an output is cleared or removed\n */\n function handleClearOutput(event, handle) {\n function drop(id) {\n const view = Bokeh.index.get_by_id(id)\n if (view != null) {\n view.model.document.clear()\n Bokeh.index.delete(view)\n }\n }\n\n const cell = handle.cell;\n\n const id = cell.output_area._bokeh_element_id;\n const server_id = cell.output_area._bokeh_server_id;\n\n // Clean up Bokeh references\n if (id != null) {\n drop(id)\n }\n\n if (server_id !== undefined) {\n // Clean up Bokeh references\n const cmd_clean = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n cell.notebook.kernel.execute(cmd_clean, {\n iopub: {\n output: function(msg) {\n const id = msg.content.text.trim()\n drop(id)\n }\n }\n });\n // Destroy server and session\n const cmd_destroy = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n cell.notebook.kernel.execute(cmd_destroy);\n }\n }\n\n /**\n * Handle when a new output is added\n */\n function handleAddOutput(event, handle) {\n const output_area = handle.output_area;\n const output = handle.output;\n\n // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n if ((output.output_type != \"display_data\") || (!Object.prototype.hasOwnProperty.call(output.data, EXEC_MIME_TYPE))) {\n return\n }\n\n const toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n\n if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n // store reference to embed id on output_area\n output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n }\n if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n const bk_div = document.createElement(\"div\");\n bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n const script_attrs = bk_div.children[0].attributes;\n for (let i = 0; i < script_attrs.length; i++) {\n toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n toinsert[toinsert.length - 1].firstChild.textContent = bk_div.children[0].textContent\n }\n // store reference to server id on output_area\n output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n }\n }\n\n function register_renderer(events, OutputArea) {\n\n function append_mime(data, metadata, element) {\n // create a DOM node to render to\n const toinsert = this.create_output_subarea(\n metadata,\n CLASS_NAME,\n EXEC_MIME_TYPE\n );\n this.keyboard_manager.register_events(toinsert);\n // Render to node\n const props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n render(props, toinsert[toinsert.length - 1]);\n element.append(toinsert);\n return toinsert\n }\n\n /* Handle when an output is cleared or removed */\n events.on('clear_output.CodeCell', handleClearOutput);\n events.on('delete.Cell', handleClearOutput);\n\n /* Handle when a new output is added */\n events.on('output_added.OutputArea', handleAddOutput);\n\n /**\n * Register the mime type and append_mime function with output_area\n */\n OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n /* Is output safe? */\n safe: true,\n /* Index of renderer in `output_area.display_order` */\n index: 0\n });\n }\n\n // register the mime type if in Jupyter Notebook environment and previously unregistered\n if (root.Jupyter !== undefined) {\n const events = require('base/js/events');\n const OutputArea = require('notebook/js/outputarea').OutputArea;\n\n if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n register_renderer(events, OutputArea);\n }\n }\n if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n const NB_LOAD_WARNING = {'data': {'text/html':\n \"
\\n\"+\n \"

\\n\"+\n \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n \"

\\n\"+\n \"
    \\n\"+\n \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n \"
  • use INLINE resources instead, as so:
  • \\n\"+\n \"
\\n\"+\n \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"
\"}};\n\n function display_loaded(error = null) {\n const el = document.getElementById(\"dcea07c2-60f1-4255-aeb0-4b5123c89025\");\n if (el != null) {\n const html = (() => {\n if (typeof root.Bokeh === \"undefined\") {\n if (error == null) {\n return \"BokehJS is loading ...\";\n } else {\n return \"BokehJS failed to load.\";\n }\n } else {\n const prefix = `BokehJS ${root.Bokeh.version}`;\n if (error == null) {\n return `${prefix} successfully loaded.`;\n } else {\n return `${prefix} encountered errors while loading and may not function as expected.`;\n }\n }\n })();\n el.innerHTML = html;\n\n if (error != null) {\n const wrapper = document.createElement(\"div\");\n wrapper.style.overflow = \"auto\";\n wrapper.style.height = \"5em\";\n wrapper.style.resize = \"vertical\";\n const content = document.createElement(\"div\");\n content.style.fontFamily = \"monospace\";\n content.style.whiteSpace = \"pre-wrap\";\n content.style.backgroundColor = \"rgb(255, 221, 221)\";\n content.textContent = error.stack ?? error.toString();\n wrapper.append(content);\n el.append(wrapper);\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(() => display_loaded(error), 100);\n }\n }\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n\n root._bokeh_onload_callbacks.push(callback);\n if (root._bokeh_is_loading > 0) {\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls == null || js_urls.length === 0) {\n run_callbacks();\n return null;\n }\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = css_urls.length + js_urls.length;\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n\n function on_error(url) {\n console.error(\"failed to load \" + url);\n }\n\n for (let i = 0; i < css_urls.length; i++) {\n const url = css_urls[i];\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n }\n\n for (let i = 0; i < js_urls.length; i++) {\n const url = js_urls[i];\n const element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n };\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.7.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.7.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.7.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.7.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.7.3.min.js\"];\n const css_urls = [];\n\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {\n }\n ];\n\n function run_inline_js() {\n if (root.Bokeh !== undefined || force === true) {\n try {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\n\n } catch (error) {display_loaded(error);throw error;\n }if (force === true) {\n display_loaded();\n }} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n } else if (force !== true) {\n const cell = $(document.getElementById(\"dcea07c2-60f1-4255-aeb0-4b5123c89025\")).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\n }\n }\n\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(css_urls, js_urls, function() {\n console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n}(window));", + "application/vnd.bokehjs_load.v0+json": "" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from dbase.database.db_utils import set_environment_context\n", + "set_environment_context(\"long_bbands\")\n", + "from algo.positions.loaders.position_vars import get_position_data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d51d47ce", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2026-02-02 11:46:17 [long_bbands] algo.positions.loaders.position_vars INFO: Loading position data for today: 2026-02-02\n", + "2026-02-02 11:46:17 [test] DataManager.py CRITICAL: Skipping MySQL query. This is not optimized and may lead to performance issues.\n", + "2026-02-02 11:46:17 [long_bbands] algo.positions.loaders.position_vars INFO: Loading position data (force=True, refresh=True, eod_block=False, is_today=False, date=2026-02-02)\n", + "[get_engine] Creating engine for DB: portfolio_config_long_bbands (base: portfolio_config), PID: 8931\n", + "2026-02-02 11:46:21 [long_bbands] algo.strategies._config_utils INFO: No configuration differences found for slug 'long_bbands'.\n", + "2026-02-02 11:46:21 [long_bbands] algo.strategies._config_utils INFO: No configuration differences found for slug 'long_bbands'.\n", + "2026-02-02 11:46:22 [long_bbands] algo.strategies._config_utils INFO: No configuration differences found for slug 'long_bbands'.\n", + "Fetching rates data from yfinance directly during market hours\n", + "Fetching rates data from yfinance directly during market hours\n", + "2026-02-02 11:46:33 [test] trade.asset.Stock ERROR: Error getting dividends history for AMD from yfinance\n", + "2026-02-02 11:46:33 [test] trade.asset.Stock ERROR: Probably due to no dividends history\n", + "Fetching rates data from yfinance directly during market hours\n", + "Fetching rates data from yfinance directly during market hours\n", + "2026-02-02 11:46:37 [test] trade.asset.Stock ERROR: Error setting close for BA: \n", + "[Error] -> Unauthorized FMP request -> Legacy Endpoint : Due to Legacy endpoints being no longer supported - This endpoint is only available for legacy users who have valid subscriptions prior August 31, 2025. Please visit our documentation page https://site.financialmodelingprep.com/developer/docs for our current APIs. \n", + "2026-02-02 11:46:37 [test] trade.asset.Stock ERROR: \n", + "set_variables raised an error\n", + "Traceback (most recent call last):\n", + " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/decorators.py\", line 394, in wrapper\n", + " return func(*args, **kwargs)\n", + " ^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py\", line 134, in set_variables\n", + " raise e ## Raise error so that decorator can catch it\n", + " ^^^^^^^\n", + " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py\", line 130, in set_variables\n", + " self.prev_close()\n", + " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/assets/Stock.py\", line 440, in prev_close\n", + " obb.equity.price.quote(symbol=self.ticker, provider=\"fmp\").to_dataframe()[\"prev_close\"].values[0]\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/openbb_core/app/static/utils/decorators.py\", line 93, in wrapper\n", + " raise UnauthorizedError(f\"\\n[Error] -> {e}\").with_traceback(\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/openbb_fmp/utils/helpers.py\", line 24, in response_callback\n", + " raise UnauthorizedError(f\"Unauthorized FMP request -> {error_message}\")\n", + "openbb_core.provider.utils.errors.UnauthorizedError: \n", + "[Error] -> Unauthorized FMP request -> Legacy Endpoint : Due to Legacy endpoints being no longer supported - This endpoint is only available for legacy users who have valid subscriptions prior August 31, 2025. Please visit our documentation page https://site.financialmodelingprep.com/developer/docs for our current APIs. \n", + "Fetching rates data from yfinance directly during market hours\n", + "Fetching rates data from yfinance directly during market hours\n", + "2026-02-02 11:46:50 [long_bbands] algo.positions.loaders.position_vars INFO: Using cached position data (last loaded at 2026-02-02 11:46:50.737208-05:00)\n" + ] + } + ], + "source": [ + "pos = get_position_data(force=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a3d0f5b6", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "OptionGreeks(bs_delta=0.0, bs_gamma=0.0, bs_theta=0.01783721107952374, bs_vega=0.0, bs_rho=-0.01517916777565631, bs_volga=nan, binomial_delta=0.0, binomial_gamma=0.0, binomial_theta=0.01783721107952374, binomial_vega=0.0, binomial_rho=-0.01517916777565631, dollar_bs_delta=np.float64(0.0), dollar_binomial_delta=np.float64(0.0))" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pos.strategies[\"long_bbands\"].positions[2].position_data.greeks" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "openbb_new_use", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/trade/datamanager/dividend.py b/trade/datamanager/dividend.py new file mode 100644 index 0000000..b0a1c8b --- /dev/null +++ b/trade/datamanager/dividend.py @@ -0,0 +1,698 @@ +"""Dividend data management for options pricing with caching and schedule construction. + +This module provides the DividendDataManager class for retrieving, caching, and +constructing dividend schedules (discrete or continuous) for equity symbols. Supports +backtest-style time-series construction with split adjustments and partial caching. + +Typical usage: + >>> div_mgr = DividendDataManager("AAPL") + >>> result = div_mgr.get_schedule_timeseries( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... maturity_date="2025-06-20", + ... dividend_type=DivType.DISCRETE, + ... undo_adjust=True + ... ) + >>> schedules = result.daily_discrete_dividends +""" + +from datetime import datetime +from typing import Any, ClassVar, Optional, Tuple, Union, List +import pandas as pd +from trade.helpers.Logging import setup_logger +from trade.optionlib.assets.dividend import Schedule, ScheduleEntry +from trade.datamanager.vars import get_times_series, DM_GEN_PATH, load_name +from trade.datamanager.config import OptionDataConfig +from trade.datamanager.result import DividendsResult +from trade.datamanager.base import BaseDataManager, CacheSpec +from trade.datamanager._enums import ArtifactType, SeriesId, Interval, RealTimeFallbackOption +from trade.datamanager.utils import slice_schedule +from trade.datamanager.utils.date import DateRangePacket, is_available_on_date +from trade.datamanager.utils.cache import _data_structure_cache_it, _check_cache_for_timeseries_data_structure +from trade.datamanager.utils.logging import get_logging_level +from trade.helpers.helper import CustomCache, change_to_last_busday, to_datetime +from trade.optionlib.config.types import DivType +from trade.optionlib.assets.dividend import get_vectorized_dividend_scehdule + +from trade import HOLIDAY_SET +from .utils.data_structure import _data_structure_sanitize + +logger = setup_logger("trade.datamanager.dividend", stream_log_level=get_logging_level()) +TS = get_times_series() + +class DividendDataManager(BaseDataManager): + """Manages dividend data retrieval, caching, and schedule construction for a specific symbol. + + This manager handles both discrete and continuous dividends with intelligent caching, + partial cache merging, and split adjustment logic. Implements singleton pattern per symbol + to avoid redundant timeseries loading. + + Attributes: + CACHE_NAME: Class-level cache identifier for this manager type. + DEFAULT_SERIES_ID: Default historical series identifier. + CONFIG: Configuration object for dividend data settings. + INSTANCES: Class-level cache of manager instances per symbol. + symbol: The equity ticker symbol this manager handles. + temp_cache: Short-lived cache for temporary dividend data. + + Examples: + >>> # Singleton access - same instance returned for same symbol + >>> div_mgr1 = DividendDataManager("AAPL") + >>> div_mgr2 = DividendDataManager("AAPL") + >>> assert div_mgr1 is div_mgr2 + + >>> # Get discrete dividend schedule for a date range + >>> schedule, key = div_mgr1.get_discrete_dividend_schedule( + ... start_date="2025-01-01", + ... end_date="2025-06-20" + ... ) + + >>> # Get daily time-series of schedules + >>> result = div_mgr1.get_schedule_timeseries( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... maturity_date="2025-06-20" + ... ) + """ + + CACHE_NAME: ClassVar[str] = "dividend_data_manager" + DEFAULT_SERIES_ID: ClassVar["SeriesId"] = SeriesId.HIST + CONFIG = OptionDataConfig() + INSTANCES = {} + CACHE_SPEC: CacheSpec = CacheSpec(cache_fname=CACHE_NAME) + + def __new__(cls, symbol: str, *args: Any, **kwargs: Any) -> "DividendDataManager": + """Returns cached instance for symbol, creating new one if needed. + + Implements singleton pattern per symbol to ensure timeseries are loaded only once. + Automatically loads market timeseries data on first instantiation. + + Args: + symbol: Equity ticker symbol (e.g., "AAPL", "MSFT"). + *args: Additional positional arguments passed to __init__. + **kwargs: Additional keyword arguments passed to __init__. + + Returns: + Singleton DividendDataManager instance for the given symbol. + + Examples: + >>> mgr1 = DividendDataManager("AAPL") + >>> mgr2 = DividendDataManager("AAPL") + >>> assert mgr1 is mgr2 # Same instance + """ + if symbol not in cls.INSTANCES: + instance = object.__new__(cls) + cls.INSTANCES[symbol] = instance + return cls.INSTANCES[symbol] + + def __init__( + self, symbol: str, *, enable_namespacing: bool = False + ) -> None: + """Initializes manager for a symbol with cache and temp cache for short-lived data. + + Sets up persistent cache for dividend schedules and temporary cache for short-lived + data. Only executes once per symbol due to singleton pattern. + + Args: + symbol: Equity ticker symbol. + enable_namespacing: If True, enables namespace isolation in cache keys. + + Examples: + >>> mgr = DividendDataManager("AAPL") + >>> mgr = DividendDataManager("AAPL", enable_namespacing=True) + """ + + if getattr(self, "_initialized", False): + return + self._initialized = True + super().__init__(enable_namespacing=enable_namespacing, symbol=symbol) + self.symbol = symbol + self.temp_cache: CustomCache = CustomCache( + location=DM_GEN_PATH.as_posix(), fname="dividend_temp_cache", expire_days=1, clear_on_exit=True + ) + + ## General caching logic + def cache_it(self, key: str, value: Any, *, expire: Optional[int] = None, _type: str = "discrete") -> None: + """Caches dividend data with merge logic for discrete dividends (no future dates). + + For discrete dividends, implements smart merging: filters out future dates (> today) + and merges with existing cache by date, keeping unique entries. For other types, + performs direct cache storage. + + Args: + key: Cache key identifier. + value: Data to cache (typically List[ScheduleEntry] for discrete). + expire: Optional expiration time in seconds. Uses cache default if None. + _type: Type of dividend data ("discrete" or other). Affects merge logic. + + Examples: + >>> div_mgr = DividendDataManager("AAPL") + >>> schedule = [ScheduleEntry(date=date(2025, 3, 15), amount=0.25)] + >>> div_mgr.cache_it("my_key", schedule, expire=86400, _type="discrete") + + Notes: + - Discrete dividends are filtered to exclude future dates (> today) + - Existing cache entries are merged and deduplicated by date + - Non-discrete types bypass merge logic + """ + + ## If discrete dividends, we first check if key exists + ## If it does, we add to it. Only values <= today. + ## If it does not, we create new entry + if _type == "discrete": + existing = self.get(key, default=None) + today = datetime.today().date() + allowed = [e for e in value if e.date <= today] + + if existing is not None: + # Merge existing and new values. We're expecting lists of ScheduleEntry + merged = existing + allowed + + ## Unique by date + merged = {entry.date: entry for entry in merged} + uniques = sorted(merged.values(), key=lambda e: e.date) + self.set(key, uniques, expire=expire) + return + else: + self.set(key, allowed, expire=expire) + return + + # For other types or if no existing, just setattr + raise NotImplementedError( + "Currently only discrete dividend caching with merge logic is implemented in cache_it. Other types should go through _data_structure_cache_it." + ) + + ## Dividend yield history retrieval for continuous dividends. Already cached in MarketTimeseries. + def get_div_yield_history(self, symbol: str) -> pd.Series: + """Retrieves continuous dividend yield history from MarketTimeseries. + + Fetches annual dividend yield as a percentage time-series from the global + MarketTimeseries cache (TS). Used for continuous dividend modeling. + + Args: + symbol: Equity ticker symbol. + + + Returns: + Time-indexed Series of annualized dividend yields (e.g., 0.025 = 2.5%). + + Examples: + >>> div_mgr = DividendDataManager("AAPL") + >>> yields = div_mgr.get_div_yield_history("AAPL") + >>> logger.info(yields.head()) + datetime + 2020-01-02 0.0124 + 2020-01-03 0.0125 + ... + """ + div_history = TS._get_dividend_yield_timeseries(symbol) + return div_history + ## Discrete dividend schedule retrieval with caching. + def get_discrete_dividend_schedule( + self, + *, + end_date: Union[str, datetime, pd.Timestamp], + start_date: Union[str, datetime, pd.Timestamp], + valuation_date: Optional[Union[str, datetime, pd.Timestamp]] = None, + ) -> Tuple[List[ScheduleEntry], str]: + """Returns discrete dividend schedule between dates with partial cache support. + + Fetches individual dividend payment events (ex-dates and amounts) expected between + start_date and end_date. Intelligently uses cache if available and fetches missing + data only when needed. + + Args: + start_date: Start of date range for dividend events (YYYY-MM-DD string or datetime). + end_date: End of date range for dividend events (YYYY-MM-DD string or datetime). + valuation_date: Optional reference date for forecasting. Defaults to start_date. + + Returns: + Tuple containing: + - List[ScheduleEntry]: Dividend events with dates and amounts + - str: Cache key used for this data + + Examples: + >>> div_mgr = DividendDataManager("AAPL") + >>> schedule, key = div_mgr.get_discrete_dividend_schedule( + ... start_date="2025-01-01", + ... end_date="2025-06-20" + ... ) + >>> for entry in schedule: + ... logger.info(f"{entry.date}: ${entry.amount:.2f}") + 2025-02-14: $0.25 + 2025-05-16: $0.25 + + Notes: + - Uses vectorized dividend schedule fetching from optionlib + - Partial cache hits trigger fetches for missing date ranges only + - Cache stores raw ScheduleEntry lists without splits applied + """ + + ## Load first + load_name(self.symbol) + + ## Dates + packet = DateRangePacket(start_date, end_date) + start_date = packet.start_date + end_date = packet.end_date + start_str = packet.start_str + end_str = packet.end_str + + ticker = self.symbol + method = self.CONFIG.default_forecast_method.value + lookback_years = self.CONFIG.default_lookback_years + key = self.make_key( + symbol=ticker, + artifact_type=ArtifactType.DIVS, + series_id=SeriesId.HIST, + method=method, + lookback_years=lookback_years, + current_state="schedule", + interval=Interval.NA, + vendor="yfinance", + ) + + available_schedule = self.get(key, default=None) + if available_schedule: + logger.info(f"Cache hit for key: {key}") + ## If max date in available schedule >= end_date, we can use cache + max_cached_date = max(entry.date for entry in available_schedule) + min_cached_date = min(entry.date for entry in available_schedule) + fully_covered = (min_cached_date <= to_datetime(start_str).date()) and ( + max_cached_date >= to_datetime(end_str).date() + ) + if fully_covered: + logger.info(f"Cache fully covers requested date range. Key: {key}") + + ## Filter to requested date range + start_dt = to_datetime(start_str).date() + end_dt = to_datetime(end_str).date() + filtered_schedule = [e for e in available_schedule if start_dt <= e.date <= end_dt] + return filtered_schedule, key + else: + logger.info(f"Cache partially covers requested date range. Key: {key}. Fetching missing data.") + + schedule = get_vectorized_dividend_scehdule( + tickers=[ticker], + end_dates=[end_date], + start_dates=[start_date], + method=method, + lookback_years=lookback_years, + valuation_dates=[valuation_date] if valuation_date else None, + ) + + raw_schedule = schedule[0].schedule + self.cache_it(key, raw_schedule, _type="discrete") + + return raw_schedule, key + + ## Switcher to choose between constructing all the way or using cached pieces + def _get_discrete_schedule_timeseries( + self, + start_date: Union[datetime, str], + end_date: Union[datetime, str], + maturity_date: Union[datetime, str], + dividend_type: Optional[DivType] = None, + undo_adjust: bool = True, + ) -> Tuple[pd.Series, str]: + """Builds daily dividend schedule series with partial cache merging and split adjustment. + + Constructs a time-series where each business day gets its own Schedule object representing + dividends from that valuation date to maturity. Optimizes by fetching dividend events once + and slicing for each date. Optionally applies split adjustments. + + Args: + start_date: First valuation date (YYYY-MM-DD string or datetime). + end_date: Last valuation date (YYYY-MM-DD string or datetime). + maturity_date: Fixed horizon date for all schedules (e.g., option expiry). + dividend_type: DivType.DISCRETE or DivType.CONTINUOUS. Uses config default if None. + undo_adjust: If True, adjusts dividends for splits as of valuation date. + + Returns: + Tuple containing: + - pd.Series: DatetimeIndex with Schedule objects as values + - str: Cache key used + + Raises: + ValueError: If maturity_date < start_date. + + Examples: + >>> div_mgr = DividendDataManager("AAPL") + >>> series, key = div_mgr._get_discrete_schedule_timeseries( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... maturity_date="2025-06-20", + ... undo_adjust=True + ... ) + >>> logger.info(series.head()) + datetime + 2025-01-02 Schedule([ScheduleEntry(...), ...]) + 2025-01-03 Schedule([ScheduleEntry(...), ...]) + ... + + Notes: + - Fetches full schedule from start_date to maturity_date once + - Builds daily schedules by slicing based on valuation date + - Split adjustments multiply dividend amounts by cumulative split factor + - Partial cache hits merge with existing data + - Cache expires after 12 hours + """ + logger.info( + f"Fetching discrete dividend schedule timeseries for {self.symbol} from {start_date} to {end_date} with maturity {maturity_date}" + ) + packet = DateRangePacket(start_date, end_date, maturity_date=maturity_date) + dividend_type = DivType(dividend_type) if dividend_type is not None else self.CONFIG.dividend_type + is_partial = False + start_dt = packet.start_date.date() + end_dt = packet.end_date.date() + mat_dt = packet.maturity_date.date() + start_str = packet.start_str + end_str = packet.end_str + mat_str = packet.maturity_str + + if mat_dt < start_dt: + logger.info(f"Maturity date {mat_dt} is before start date {start_dt}") + raise ValueError("maturity_date must be >= start_date") + + key = self.make_key( + symbol=self.symbol, + artifact_type=ArtifactType.DIVS, + series_id=SeriesId.HIST, + method=self.CONFIG.default_forecast_method.value, + lookback_years=self.CONFIG.default_lookback_years, + current_state="schedule_timeseries", + interval=Interval.EOD, + undo_adjust=undo_adjust, + maturity=mat_str, + ) + cached_series, is_partial, missing_start_date, missing_end_date = _check_cache_for_timeseries_data_structure(self, key, start_str, end_str) + + # cached_series = self.get(key, default=None) + if cached_series is not None and not is_partial: + logger.info(f"Cache hit for discrete schedule timeseries key: {key}") + logger.info(f"Cache fully covers requested date range for timeseries. Key: {key}") + cached_series = cached_series[ + (cached_series.index >= pd.to_datetime(start_date)) + & (cached_series.index <= pd.to_datetime(end_date)) + ] + return cached_series, key + else: + start_str, end_str = to_datetime(missing_start_date).strftime("%Y-%m-%d"), to_datetime(missing_end_date).strftime("%Y-%m-%d") + + # Build from scratch for missing dates + # Fetch ONCE: all events from start_date to maturity_date + full_schedule, _ = self.get_discrete_dividend_schedule( + start_date=start_str, + end_date=mat_str, + valuation_date=start_str, + ) + + # Build daily schedules efficiently using a moving pointer + series = {} + date_range = pd.date_range(start=start_dt, end=end_dt, freq="B").strftime("%Y-%m-%d") + for d in date_range: + if d in HOLIDAY_SET: + # Skip holidays + continue + d_date = datetime.strptime(d, "%Y-%m-%d").date() + + ## Simple filter approach + sliced = slice_schedule(full_schedule, d_date, mat_dt) + series[d_date] = Schedule(sliced) + data = pd.Series(series, name="dividend_schedule") + + # Back-adjust to represent cashflows as of valuation date. Ie undoing splits + if undo_adjust: + data = data.to_frame() + # split_factors = TS._split_factor[self.symbol].copy() + split_factors = TS._get_split_factor_timeseries(sym=self.symbol) + data["split_factor"] = split_factors + data["dividend_schedule"] = data["dividend_schedule"] * data["split_factor"] + data = data["dividend_schedule"] + + # Cache the constructed timeseries + if is_partial: + # Merge with existing cached series + merged = pd.concat([cached_series, data]) + data = merged[~merged.index.duplicated(keep="last")] + + data = _data_structure_sanitize(data, start_date, end_date, source_name=f"discrete_schedule_timeseries for {self.symbol}") + + _data_structure_cache_it(self, key, data, expire=86400) + return data, key + + def get_schedule_timeseries( + self, + start_date: Union[datetime, str], + end_date: Union[datetime, str], + maturity_date: Union[datetime, str], + dividend_type: Optional[DivType] = None, + undo_adjust: bool = True, + ) -> DividendsResult: + """Returns daily dividend schedule time-series from valuation dates to maturity. + + Constructs a daily series where each business day has its own Schedule representing + dividends from that valuation date to the fixed maturity date. Supports both discrete + and continuous dividend models. + + Args: + start_date: First valuation date (YYYY-MM-DD string or datetime). + end_date: Last valuation date (YYYY-MM-DD string or datetime). + maturity_date: Fixed horizon date for all schedules (e.g., option expiry). + dividend_type: DivType.DISCRETE or DivType.CONTINUOUS. Uses config default if None. + undo_adjust: If True, adjusts dividends for splits as of valuation date. + + Returns: + DividendsResult containing daily_discrete_dividends or daily_continuous_dividends + Series, plus metadata (key, dividend_type, undo_adjust). + + Examples: + >>> div_mgr = DividendDataManager("AAPL") + >>> result = div_mgr.get_schedule_timeseries( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... maturity_date="2025-06-20", + ... dividend_type=DivType.DISCRETE, + ... undo_adjust=True + ... ) + >>> schedules = result.daily_discrete_dividends + >>> logger.info(schedules.iloc[0]) # First day's schedule + Schedule([ScheduleEntry(date=..., amount=...)]) + + Notes: + - For DISCRETE: Returns Series of Schedule objects (one per day) + - For CONTINUOUS: Returns Series of annual yield percentages + - start_date/end_date define valuation date range + - maturity_date is the fixed horizon (e.g., option expiry) + """ + load_name(self.symbol) + if dividend_type: + logger.info(f"Using provided dividend_type: {dividend_type}") + else: + logger.info(f"Using config default dividend_type: {self.CONFIG.dividend_type}") + + dividend_type = DivType(dividend_type) if dividend_type is not None else self.CONFIG.dividend_type + result = DividendsResult() + result.symbol = self.symbol + result.dividend_type = dividend_type + result.undo_adjust = undo_adjust + + if dividend_type == DivType.DISCRETE: + data, key = self._get_discrete_schedule_timeseries( + start_date=start_date, + end_date=end_date, + maturity_date=maturity_date, + dividend_type=dividend_type, + undo_adjust=undo_adjust, + ) + data.index = pd.to_datetime(data.index) + data.index.name = "datetime" + data = data[(data.index >= pd.to_datetime(start_date)) & (data.index <= pd.to_datetime(end_date))] + data = data.sort_index() + data = data.drop_duplicates() + result.daily_discrete_dividends = data + result.key = key + + elif dividend_type == DivType.CONTINUOUS: + start_str = ( + pd.to_datetime(start_date).strftime("%Y-%m-%d") if isinstance(start_date, datetime) else start_date + ) + end_str = pd.to_datetime(end_date).strftime("%Y-%m-%d") if isinstance(end_date, datetime) else end_date + yield_history = self.get_div_yield_history(self.symbol) + filtered = yield_history[(yield_history.index >= start_str) & (yield_history.index <= end_str)] + filtered.index.name = "datetime" + filtered.index = to_datetime(filtered.index) + filtered = filtered.sort_index() + result.daily_continuous_dividends = filtered + result.key = None + return result + + def get_schedule( + self, + valuation_date: Union[datetime, str], + maturity_date: Union[datetime, str], + dividend_type: Optional[DivType] = None, + undo_adjust: bool = True, + fallback_option: Optional[RealTimeFallbackOption] = None, + ) -> DividendsResult: + """Returns dividend schedule for a single valuation date to maturity. + + Fetches dividend data (discrete events or continuous yields) from a single + valuation date to maturity date. Suitable for real-time pricing scenarios. + + Args: + valuation_date: Reference date for valuation (YYYY-MM-DD string or datetime). + maturity_date: Horizon date for dividends (YYYY-MM-DD string or datetime). + dividend_type: DivType.DISCRETE or DivType.CONTINUOUS. Uses config default if None. + undo_adjust: If True, adjusts dividends for splits as of valuation date. + + Returns: + DividendsResult with daily_discrete_dividends or daily_continuous_dividends, + plus metadata. + + Examples: + >>> div_mgr = DividendDataManager("AAPL") + >>> result = div_mgr.get_schedule( + ... valuation_date="2025-01-15", + ... maturity_date="2025-06-20", + ... dividend_type=DivType.DISCRETE, + ... undo_adjust=True + ... ) + >>> schedule = result.daily_discrete_dividends.iloc[0] + >>> logger.info(schedule.schedule) # List of ScheduleEntry objects + + Notes: + - For DISCRETE: Returns Series with single entry containing Schedule object + - For CONTINUOUS: Returns filtered yield history between dates + - Split adjustments applied if undo_adjust=True + """ + load_name(self.symbol) + fallback_option = fallback_option or self.CONFIG.real_time_fallback_option + dividend_type = DivType(dividend_type) if dividend_type is not None else self.CONFIG.dividend_type + valuation_date = to_datetime(valuation_date) + + if not is_available_on_date(valuation_date): + logger.warning(f"Valuation date {valuation_date} is not a business day or holiday. No dividends available. Resolution: {fallback_option}") + if fallback_option == RealTimeFallbackOption.RAISE_ERROR: + raise ValueError(f"Valuation date {valuation_date} is not a business day or holiday.") + if fallback_option == RealTimeFallbackOption.USE_LAST_AVAILABLE: + ## Move date back to last business day + ## Using only change_to_last_busday assumes input date is not business day or is holiday + ## Which the function would roll back + ## But there's a possibility input date is today's date but before market open + ## In that case we need to move back one more business day + valuation_date = change_to_last_busday(valuation_date - pd.tseries.offsets.BDay(1), time_of_day_aware=False) + else: + result = DividendsResult() + dividend = pd.Series(dtype=float) + if dividend_type == DivType.DISCRETE: + result.daily_discrete_dividends = dividend + else: + result.daily_continuous_dividends = dividend + result.key = None + result.undo_adjust = undo_adjust + result.dividend_type = dividend_type + result.symbol = self.symbol + result.fallback_option = fallback_option + return result + + + + + val_str = valuation_date.strftime("%Y-%m-%d") if isinstance(valuation_date, datetime) else valuation_date + mat_str = maturity_date.strftime("%Y-%m-%d") if isinstance(maturity_date, datetime) else maturity_date + + if dividend_type == DivType.DISCRETE: + data, key = self.get_discrete_dividend_schedule( + start_date=val_str, + end_date=mat_str, + valuation_date=val_str, # optional, but consistent + ) + if undo_adjust: + split_factor = TS.get_split_factor_at_index(self.symbol, pd.to_datetime(valuation_date)) + else: + split_factor = 1.0 + data = Schedule(schedule=[entry * split_factor for entry in data]) + data = pd.Series({val_str: data}) + data.index = to_datetime(data.index) + data.index.name = "datetime" + elif dividend_type == DivType.CONTINUOUS: + data = self.get_div_yield_history(self.symbol) + data = data[ + (data.index.date >= pd.to_datetime(valuation_date).date()) + & (data.index.date <= pd.to_datetime(valuation_date).date()) + ] + data.index.name = "datetime" + data.index = to_datetime(data.index) + key = None + else: + raise ValueError(f"Unsupported dividend type: {dividend_type}") + + result = DividendsResult() + + if dividend_type == DivType.DISCRETE: + result.daily_discrete_dividends = data + else: + result.daily_continuous_dividends = data + result.key = key + result.undo_adjust = undo_adjust + result.dividend_type = dividend_type + result.symbol = self.symbol + result.fallback_option = fallback_option + + return result + + def rt( + self, + maturity_date: Union[datetime, str], + dividend_type: Optional[DivType] = None, + undo_adjust: bool = True, + fallback_option: Optional[RealTimeFallbackOption] = None, + ) -> DividendsResult: + """Real-time enabled method to get dividend schedule for a single valuation date. + + Wrapper around get_schedule with real-time fallback handling. If data is missing + for the valuation date, applies the specified fallback strategy. + + Args: + valuation_date: Reference date for valuation (YYYY-MM-DD string or datetime). + maturity_date: Horizon date for dividends (YYYY-MM-DD string or datetime). + dividend_type: DivType.DISCRETE or DivType.CONTINUOUS. Uses config default if None. + undo_adjust: If True, adjusts dividends for splits as of valuation date. + fallback_option: Strategy for handling missing data. Uses config default if None. + Returns: + DividendsResult with dividend schedule or fallback data. + """ + load_name(self.symbol) + + if fallback_option is None: + fallback_option = self.CONFIG.real_time_fallback_option + + result = self.get_schedule( + valuation_date=datetime.now(), + maturity_date=maturity_date, + dividend_type=dividend_type, + undo_adjust=undo_adjust, + fallback_option=fallback_option, + ) + result.rt = True + return result + + def offload(self, *args: Any, **kwargs: Any) -> None: + + """ + Placeholder for offload logic (not implemented). + + Reserved for future implementation of cache offloading or cleanup operations. + Currently performs no action. + + Args: + *args: Arbitrary positional arguments. + **kwargs: Arbitrary keyword arguments. + + Examples: + >>> div_mgr = DividendDataManager("AAPL") + >>> div_mgr.offload() # No-op + """ + logger.info(f"No offload logic implemented for {self.CACHE_NAME}") + diff --git a/trade/datamanager/exceptions.py b/trade/datamanager/exceptions.py new file mode 100644 index 0000000..f49a703 --- /dev/null +++ b/trade/datamanager/exceptions.py @@ -0,0 +1,7 @@ +class DataManagerException(Exception): + """Base exception for DataManager errors.""" + pass + +class EmptyDataException(DataManagerException): + """Exception raised when data is empty.""" + pass \ No newline at end of file diff --git a/trade/datamanager/forward.py b/trade/datamanager/forward.py new file mode 100644 index 0000000..7adaab6 --- /dev/null +++ b/trade/datamanager/forward.py @@ -0,0 +1,1053 @@ +"""Forward price computation and caching for options pricing models. + +This module provides the ForwardDataManager class for computing and caching forward +prices using spot prices, risk-free rates, and dividends. Supports both discrete +(schedule-based) and continuous (yield-based) dividend models with intelligent caching. + +Typical usage: + >>> fwd_mgr = ForwardDataManager("AAPL") + >>> result = fwd_mgr.get_forward_timeseries( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... maturity_date="2025-06-20", + ... dividend_type=DivType.DISCRETE, + ... use_chain_spot=True + ... ) + >>> forwards = result.daily_discrete_forward +""" + +from datetime import datetime, date +from typing import Any, ClassVar, Optional, Tuple, Union +import pandas as pd +import numpy as np +from trade.datamanager.market_data import TimeseriesData +from trade.datamanager.utils.date import is_available_on_date +from trade.helpers.Logging import setup_logger +from trade.helpers.helper import change_to_last_busday, to_datetime +from trade.datamanager.utils.data_structure import _data_structure_sanitize +from trade.datamanager.utils.cache import _check_cache_for_timeseries_data_structure, _data_structure_cache_it +from trade.datamanager.base import BaseDataManager, CacheSpec +from trade.datamanager.dividend import DividendDataManager +from trade.datamanager.result import ForwardResult, SpotResult +from trade.datamanager.rates import RatesDataManager +from trade.datamanager.config import OptionDataConfig +from trade.datamanager.result import DividendsResult, RatesResult +from trade.datamanager._enums import ArtifactType, Interval, RealTimeFallbackOption, SeriesId +from trade.datamanager.utils.logging import get_logging_level +from trade.datamanager.vars import get_times_series, load_name +from trade.optionlib.config.types import DivType +from trade.optionlib.assets.dividend import ( + vectorized_discrete_pv, + SECONDS_IN_DAY, + SECONDS_IN_YEAR, +) +from trade.optionlib.assets.forward import ( + vectorized_forward_discrete, + vectorized_forward_continuous, + get_vectorized_continuous_dividends, +) + +logger = setup_logger("trade.datamanager.forward", stream_log_level=get_logging_level()) +TS = get_times_series() # Load market timeseries data on module import to avoid circular imports + +class ForwardDataManager(BaseDataManager): + """Manages forward price computation and caching for a specific symbol using spot, rates, and dividends. + + Computes forward prices using cost-of-carry models with discrete or continuous dividends. + Implements singleton pattern per symbol to avoid redundant timeseries loading. Supports + both split-adjusted (chain_spot) and unadjusted (spot) price bases. + + Attributes: + CACHE_NAME: Class-level cache identifier for this manager type. + DEFAULT_SERIES_ID: Default historical series identifier. + INSTANCES: Class-level cache of manager instances per symbol. + CONFIG: Configuration object for forward computation settings. + symbol: The equity ticker symbol this manager handles. + + Examples: + >>> # Singleton access - same instance returned for same symbol + >>> fwd_mgr1 = ForwardDataManager("AAPL") + >>> fwd_mgr2 = ForwardDataManager("AAPL") + >>> assert fwd_mgr1 is fwd_mgr2 + + >>> # Get forward price time-series with discrete dividends + >>> result = fwd_mgr1.get_forward_timeseries( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... maturity_date="2025-06-20", + ... dividend_type=DivType.DISCRETE, + ... use_chain_spot=True + ... ) + >>> forwards = result.daily_discrete_forward + + >>> # Get single forward price for a date + >>> result = fwd_mgr1.get_forward( + ... date="2025-01-15", + ... maturity_date="2025-06-20", + ... dividend_type=DivType.DISCRETE + ... ) + """ + + CACHE_NAME: ClassVar[str] = "forward_data_manager" + DEFAULT_SERIES_ID: ClassVar["SeriesId"] = SeriesId.HIST + INSTANCES: ClassVar[dict[str, "ForwardDataManager"]] = {} + CONFIG: OptionDataConfig = OptionDataConfig() + CACHE_SPEC: CacheSpec = CacheSpec(cache_fname=CACHE_NAME) + + def __new__(cls, symbol: str, *args: Any, **kwargs: Any) -> "ForwardDataManager": + """Returns cached instance for symbol, creating new one if needed. + + Implements singleton pattern per symbol to ensure timeseries are loaded only once. + Automatically loads market timeseries data on first instantiation. + + Args: + symbol: Equity ticker symbol (e.g., "AAPL", "MSFT"). + *args: Additional positional arguments passed to __init__. + **kwargs: Additional keyword arguments passed to __init__. + + Returns: + Singleton ForwardDataManager instance for the given symbol. + + Examples: + >>> mgr1 = ForwardDataManager("AAPL") + >>> mgr2 = ForwardDataManager("AAPL") + >>> assert mgr1 is mgr2 # Same instance + """ + if symbol not in cls.INSTANCES: + instance = super(ForwardDataManager, cls).__new__(cls) + cls.INSTANCES[symbol] = instance + return cls.INSTANCES[symbol] + + def __init__( + self, + symbol: str, + *, + enable_namespacing: bool = False, + ) -> None: + """Initializes manager once per symbol instance. + + Sets up persistent cache for forward price data. Only executes once per + symbol due to singleton pattern. + + Args: + symbol: Equity ticker symbol. + enable_namespacing: If True, enables namespace isolation in cache keys. + + Examples: + >>> mgr = ForwardDataManager("AAPL") + >>> mgr = ForwardDataManager("AAPL", enable_namespacing=True) + """ + if getattr(self, "_initialized", False): + return + + self._initialized = True + super().__init__(enable_namespacing=enable_namespacing, symbol=symbol) + self.symbol = symbol + + def _normalize_inputs( + self, + start_date: Union[datetime, str], + end_date: Union[datetime, str], + maturity_date: Union[datetime, str], + dividend_type: Optional[DivType], + ) -> Tuple[DivType, date, date, date, str, str, str]: + """Converts date inputs to both date objects and strings. + + Normalizes various date input formats to consistent datetime objects and + YYYY-MM-DD strings. Sets default dividend type to DISCRETE if not specified. + + Args: + start_date: Start date (YYYY-MM-DD string or datetime). + end_date: End date (YYYY-MM-DD string or datetime). + maturity_date: Maturity date (YYYY-MM-DD string or datetime). + dividend_type: Optional DivType. Defaults to DISCRETE if None. + + Returns: + Tuple containing: + - DivType: Dividend type (DISCRETE or CONTINUOUS) + - date: Start date object + - date: End date object + - date: Maturity date object + - str: Start date string (YYYY-MM-DD) + - str: End date string (YYYY-MM-DD) + - str: Maturity date string (YYYY-MM-DD) + + Examples: + >>> fwd_mgr = ForwardDataManager("AAPL") + >>> dividend_type, start_dt, end_dt, mat_dt, start_str, end_str, mat_str = \ + ... fwd_mgr._normalize_inputs( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... maturity_date="2025-06-20", + ... dividend_type=None + ... ) + >>> logger.info(dividend_type) # DivType.DISCRETE + """ + dividend_type = DivType(dividend_type) if dividend_type is not None else self.CONFIG.dividend_type + + start_dt = datetime.strptime(start_date, "%Y-%m-%d") if isinstance(start_date, str) else start_date + end_dt = datetime.strptime(end_date, "%Y-%m-%d") if isinstance(end_date, str) else end_date + mat_dt = datetime.strptime(maturity_date, "%Y-%m-%d") if isinstance(maturity_date, str) else maturity_date + + start_str = datetime.strftime(start_dt, "%Y-%m-%d") + end_str = datetime.strftime(end_dt, "%Y-%m-%d") + mat_str = datetime.strftime(mat_dt, "%Y-%m-%d") + return dividend_type, start_dt, end_dt, mat_dt, start_str, end_str, mat_str + + def _build_key(self, *, mat_str: str, dividend_type: DivType, use_chain_spot: bool) -> str: + """Constructs cache key from maturity, dividend type, and spot type. + + Creates unique cache identifier incorporating symbol, maturity date, dividend type, + and whether split-adjusted prices are used. + + Args: + mat_str: Maturity date string (YYYY-MM-DD). + dividend_type: DivType.DISCRETE or DivType.CONTINUOUS. + use_chain_spot: If True, uses split-adjusted chain_spot prices. + + Returns: + Unique cache key string. + + Examples: + >>> fwd_mgr = ForwardDataManager("AAPL") + >>> key = fwd_mgr._build_key( + ... mat_str="2025-06-20", + ... dividend_type=DivType.DISCRETE, + ... use_chain_spot=True + ... ) + """ + return self.make_key( + symbol=self.symbol, + artifact_type=ArtifactType.FWD, + series_id=SeriesId.HIST, + maturity=mat_str, + dividend_type=dividend_type.value, + use_chain_spot=use_chain_spot, + interval=Interval.EOD, + ) + + def _try_get_cached( + self, + *, + key: str, + start_str: str, + end_str: str, + start_date: Union[datetime, str], + end_date: Union[datetime, str], + dividend_type: DivType, + use_chain_spot: bool, + ) -> Tuple[Optional[pd.Series], bool, str, str, Optional[ForwardResult]]: + """Checks cache for existing data and identifies missing dates. + + Attempts to retrieve forward prices from cache. If found, checks if the cached + data fully covers the requested date range. Returns cached result directly if + complete, or identifies missing dates that need computation. + + Args: + key: Cache key identifier. + start_str: Start date string (YYYY-MM-DD). + end_str: End date string (YYYY-MM-DD). + start_date: Start date (string or datetime). + end_date: End date (string or datetime). + dividend_type: DivType.DISCRETE or DivType.CONTINUOUS. + use_chain_spot: If True, uses split-adjusted chain_spot prices. + Returns: + Tuple containing: + - Optional[pd.Series]: Cached series if partial hit, None otherwise + - bool: True if partial cache hit (need to fetch missing dates) + - str: Start date for fetching (adjusted if partial hit) + - str: End date for fetching (adjusted if partial hit) + - Optional[ForwardResult]: Complete result if full cache hit, None otherwise + + Examples: + >>> fwd_mgr = ForwardDataManager("AAPL") + >>> cached, partial, start, end, result = fwd_mgr._try_get_cached( + ... key="my_key", + ... start_str="2025-01-01", + ... end_str="2025-01-31", + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... dividend_type=DivType.DISCRETE, + ... use_chain_spot=True + ... ) + """ + cached_series = self.get(key, default=None) + cached_series, is_partial, cached_start, cached_end = _check_cache_for_timeseries_data_structure( + self=self, + key=key, + start_dt=start_date, + end_dt=end_date, + ) + + # missing = get_missing_dates(cached_series, _start=start_str, _end=end_str) + if cached_series is not None and not is_partial: + logger.info(f"Cache hit for forward timeseries key: {key}") + cached_series = _data_structure_sanitize( + cached_series, + start=start_str, + end=end_str, + source_name=f"cached forward timeseries for {self.symbol}", + ) + + result = ForwardResult() + if dividend_type == DivType.DISCRETE: + result.daily_discrete_forward = cached_series + else: + result.daily_continuous_forward = cached_series + result.dividend_type = dividend_type + result.key = key + result.symbol = self.symbol + result.undo_adjust = use_chain_spot + return cached_series, False, start_str, end_str, result + return cached_series, True, cached_start, cached_end, None + + def _get_dividend_result( + self, + *, + start_str: str, + end_str: str, + mat_str: str, + dividend_type: DivType, + dividend_result: Optional[DividendsResult], + use_chain_spot: bool, + ) -> DividendsResult: + """Fetches or validates dividend data with adjustment consistency checks. + + Retrieves dividend data from DividendDataManager if not provided. Validates + that dividend adjustments match the spot price basis (undo_adjust must equal + use_chain_spot for consistency). + + Args: + start_str: Start date string (YYYY-MM-DD). + end_str: End date string (YYYY-MM-DD). + mat_str: Maturity date string (YYYY-MM-DD). + dividend_type: DivType.DISCRETE or DivType.CONTINUOUS. + dividend_result: Optional pre-computed dividend data. Fetched if None. + use_chain_spot: If True, uses split-adjusted chain_spot prices. + + Returns: + DividendsResult containing dividend schedules or yields. + + Raises: + ValueError: If dividend_result is empty. + ValueError: If dividend_result.undo_adjust != use_chain_spot. + + Examples: + >>> fwd_mgr = ForwardDataManager("AAPL") + >>> div_result = fwd_mgr._get_dividend_result( + ... start_str="2025-01-01", + ... end_str="2025-01-31", + ... mat_str="2025-06-20", + ... dividend_type=DivType.DISCRETE, + ... dividend_result=None, + ... use_chain_spot=True + ... ) + + Notes: + - If using chain_spot (split-adjusted), dividends must be back-adjusted + - Ensures consistency between spot and dividend adjustment methods + """ + if dividend_result is None: + dividend_result = DividendDataManager(symbol=self.symbol).get_schedule_timeseries( + start_date=start_str, + end_date=end_str, + maturity_date=mat_str, + dividend_type=dividend_type, + undo_adjust=use_chain_spot, # If using chain spot, back adjust dividends + ) + + if dividend_result.is_empty(): + raise ValueError("Dividend result is empty. Cannot compute forward prices without dividend information.") + + if dividend_result.undo_adjust != use_chain_spot: + raise ValueError("Mismatch between dividend_result.undo_adjust and use_chain_spot. They must be the same.") + + return dividend_result + + def _load_spot(self, *, use_chain_spot: bool, spot: Optional[SpotResult] = None) -> pd.Series: + """Loads spot or chain_spot price series. + + Retrieves either split-adjusted (chain_spot) or unadjusted (spot) closing prices + from timeseries data. + + Args: + use_chain_spot: If True, returns split-adjusted chain_spot prices. + spot: Optional pre-loaded TimeseriesData. Fetched from TS if None. + + Returns: + Series of closing prices indexed by datetime. + + Examples: + >>> fwd_mgr = ForwardDataManager("AAPL") + >>> spot_prices = fwd_mgr._load_spot(use_chain_spot=True) + >>> logger.info(spot_prices.head()) + datetime + 2025-01-02 155.32 + 2025-01-03 156.01 + ... + + Notes: + - chain_spot: Split-adjusted prices (use with undo_adjust=True dividends) + - spot: Unadjusted prices (use with undo_adjust=False dividends) + """ + if spot is None: + if use_chain_spot: + spot = TS._get_chain_spot_timeseries(sym=self.symbol)["close"] + else: + spot = TS._get_spot_timeseries(sym=self.symbol)["close"] + return spot + return spot.timeseries + + def _load_rates(self, *, start_str: str, end_str: str, rates: Optional[RatesResult] = None) -> pd.Series: + """Loads risk-free rates for date range. + + Retrieves risk-free interest rates from RatesDataManager if not provided. + Filters to exact date range requested. + + Args: + start_str: Start date string (YYYY-MM-DD). + end_str: End date string (YYYY-MM-DD). + rates: Optional pre-computed rates data. Fetched if None. + + Returns: + Series of annualized risk-free rates indexed by datetime. + + Examples: + >>> fwd_mgr = ForwardDataManager("AAPL") + >>> rates = fwd_mgr._load_rates( + ... start_str="2025-01-01", + ... end_str="2025-01-31" + ... ) + >>> logger.info(rates.head()) + Datetime + 2025-01-02 0.0485 + 2025-01-03 0.0487 + ... + """ + if rates is None: + rates_data = RatesDataManager().get_risk_free_rate_timeseries( + start_date=start_str, + end_date=end_str, + interval=Interval.EOD, + ) + rates = rates_data.daily_risk_free_rates + else: + rates = rates.daily_risk_free_rates + rates = rates[(rates.index >= pd.to_datetime(start_str)) & (rates.index <= pd.to_datetime(end_str))] + return rates + + def _align_3( + self, spot: pd.Series, rates: pd.Series, third: pd.Series, *, third_name: str + ) -> Tuple[pd.Series, pd.Series, pd.Series]: + """Aligns three series to common dates and validates no NaNs. + + Synchronizes spot prices, risk-free rates, and dividend data to a common + date index. Validates that rates and dividend data have no missing values. + + Args: + spot: Series of spot prices. + rates: Series of risk-free rates. + third: Series of dividend data (schedules or yields). + third_name: Descriptive name for third series (for error messages). + + Returns: + Tuple of three aligned Series with common index. + + Raises: + ValueError: If rates contain NaNs after alignment. + ValueError: If third series contains NaNs after alignment. + + Examples: + >>> fwd_mgr = ForwardDataManager("AAPL") + >>> spot_aligned, rates_aligned, divs_aligned = fwd_mgr._align_3( + ... spot=spot_series, + ... rates=rates_series, + ... third=dividend_series, + ... third_name="discrete dividend schedules" + ... ) + + Notes: + - Only dates present in all three series are retained + - Spot prices may have NaNs (will be handled by vectorized functions) + - Rates and dividend data must be complete (no NaNs allowed) + """ + idx = spot.index.intersection(rates.index).intersection(third.index) + + spot = spot.reindex(idx) + rates = rates.reindex(idx) + third = third.reindex(idx) + + + if rates.isna().any(): + raise ValueError("NaNs in rates after alignment.") + if third.isna().any(): + raise ValueError(f"NaNs in {third_name} after alignment.") + + return spot, rates, third + + def _compute_forward_discrete( + self, + *, + spot: pd.Series, + rates: pd.Series, + discrete_divs: pd.Series, # series of Schedule objects + mat_dt: date, + ) -> pd.Series: + """Computes forward prices using discrete dividend schedules. + + Calculates forward prices using the discrete dividend model: + F = S * exp(r*T) - PV(divs) + + Where PV(divs) is the present value of all dividends between valuation + date and maturity. + + Args: + spot: Series of spot prices. + rates: Series of annualized risk-free rates. + discrete_divs: Series of Schedule objects (dividend events). + mat_dt: Maturity date (e.g., option expiry). + + Returns: + Series of forward prices indexed by valuation dates. + + Examples: + >>> fwd_mgr = ForwardDataManager("AAPL") + >>> forwards = fwd_mgr._compute_forward_discrete( + ... spot=spot_prices, + ... rates=risk_free_rates, + ... discrete_divs=dividend_schedules, + ... mat_dt=date(2025, 6, 20) + ... ) + >>> logger.info(forwards.head()) + datetime + 2025-01-02 156.45 + 2025-01-03 157.12 + ... + + Notes: + - Uses vectorized computation for efficiency + - Discounts each dividend in schedule to valuation date + - Time to maturity calculated as (mat_dt - val_dt) in years + """ + pv_divs = vectorized_discrete_pv( + schedules=discrete_divs.to_list(), + r=rates.tolist(), + _valuation_dates=discrete_divs.index.tolist(), + _end_dates=[mat_dt] * len(discrete_divs), + ) + pv_divs = [pv_divs] if isinstance(pv_divs, (int, float)) else pv_divs + + second_vector = [(mat_dt - val).days * SECONDS_IN_DAY for val in discrete_divs.index] + t = [val / SECONDS_IN_YEAR for val in second_vector] + + forwards = vectorized_forward_discrete( + S=spot.tolist(), + r=rates.tolist(), + T=t, + pv_divs=pv_divs, + ) + return pd.Series(data=forwards, index=discrete_divs.index) + + def _compute_forward_continuous( + self, + *, + spot: pd.Series, + rates: pd.Series, + continuous_divs: pd.Series, # series of dividend yields + mat_dt: date, + ) -> pd.Series: + """Computes forward prices using continuous dividend yields. + + Calculates forward prices using the continuous dividend model: + F = S * exp((r - q) * T) + + Where q is the continuous dividend yield. + + Args: + spot: Series of spot prices. + rates: Series of annualized risk-free rates. + continuous_divs: Series of annualized dividend yields. + mat_dt: Maturity date (e.g., option expiry). + + Returns: + Series of forward prices indexed by valuation dates. + + Examples: + >>> fwd_mgr = ForwardDataManager("AAPL") + >>> forwards = fwd_mgr._compute_forward_continuous( + ... spot=spot_prices, + ... rates=risk_free_rates, + ... continuous_divs=dividend_yields, + ... mat_dt=date(2025, 6, 20) + ... ) + >>> logger.info(forwards.head()) + datetime + 2025-01-02 156.28 + 2025-01-03 156.95 + ... + + Notes: + - Uses vectorized computation for efficiency + - Assumes constant dividend yield between valuation and maturity + - Time to maturity calculated as (mat_dt - val_dt) in years + """ + q_factor = get_vectorized_continuous_dividends( + div_rates=continuous_divs.tolist(), + _valuation_dates=continuous_divs.index.tolist(), + _end_dates=[mat_dt] * len(continuous_divs), + ) + + second_vector = [(mat_dt - val).days * SECONDS_IN_DAY for val in continuous_divs.index] + t = [val / SECONDS_IN_YEAR for val in second_vector] + + forwards = vectorized_forward_continuous( + S=spot.tolist(), + r=rates.tolist(), + T=t, + q_factor=q_factor, + ) + return pd.Series(data=forwards, index=continuous_divs.index) + + def _merge_partial(self, cached_series: pd.Series, forward_series: pd.Series) -> pd.Series: + """Merges newly computed data with cached data, keeping latest values. + + Combines partial cache hits with newly computed forward prices, deduplicating + by index and keeping the most recent values. + + Args: + cached_series: Existing cached forward prices. + forward_series: Newly computed forward prices. + + Returns: + Merged Series with deduplicated index. + + Examples: + >>> fwd_mgr = ForwardDataManager("AAPL") + >>> merged = fwd_mgr._merge_partial( + ... cached_series=old_forwards, + ... forward_series=new_forwards + ... ) + + Notes: + - Duplicates are removed, keeping 'last' (newest) values + - Useful when cache partially covers requested date range + """ + merged = pd.concat([cached_series, forward_series]) + forward_series = merged[~merged.index.duplicated(keep="last")] + return forward_series + + def get_forward_timeseries( + self, + start_date: Union[datetime, str], + end_date: Union[datetime, str], + maturity_date: Union[datetime, str], + dividend_type: Optional[DivType] = None, + spot: Optional[TimeseriesData] = None, + rates: Optional[RatesResult] = None, + *, + dividend_result: Optional[DividendsResult] = None, + use_chain_spot: bool = True, + ) -> ForwardResult: + """Returns daily forward price time-series from valuation dates to maturity. + + Computes forward prices for each business day in [start_date, end_date], + where each forward is valued to the fixed maturity_date. Uses discrete + dividends (Schedule objects) or continuous yields depending on dividend_type. + + Args: + start_date: First valuation date (YYYY-MM-DD string or datetime). + end_date: Last valuation date (YYYY-MM-DD string or datetime). + maturity_date: Fixed horizon date for all forwards (e.g., option expiry). + dividend_type: DivType.DISCRETE or DivType.CONTINUOUS. Defaults to DISCRETE. + spot: Optional pre-loaded TimeseriesData. Fetched if None. + rates: Optional pre-computed rates data. Fetched if None. + dividend_result: Pre-computed dividend data. If None, fetches internally. + use_chain_spot: If True, uses split-adjusted chain_spot prices. + + Returns: + ForwardResult containing daily_discrete_forward or daily_continuous_forward + Series with DatetimeIndex, plus the dividend_result used and cache key. + + Raises: + ValueError: If maturity_date < start_date. + ValueError: If dividend_result.undo_adjust != use_chain_spot. + + Examples: + >>> # Basic usage with automatic data fetching + >>> fwd_mgr = ForwardDataManager("AAPL") + >>> result = fwd_mgr.get_forward_timeseries( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... maturity_date="2025-06-20", + ... dividend_type=DivType.DISCRETE, + ... use_chain_spot=True + ... ) + >>> logger.info(result.daily_discrete_forward.head()) + datetime + 2025-01-02 155.32 + 2025-01-03 156.01 + ... + + >>> # Provide pre-computed data for efficiency + >>> div_mgr = DividendDataManager("AAPL") + >>> div_result = div_mgr.get_schedule_timeseries( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... maturity_date="2025-06-20", + ... undo_adjust=True + ... ) + >>> fwd_result = fwd_mgr.get_forward_timeseries( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... maturity_date="2025-06-20", + ... dividend_result=div_result, + ... use_chain_spot=True + ... ) + + Notes: + - Partial cache hits only compute missing dates + - Cache expires after 12 hours + - Spot, rates, and dividends are aligned to common dates + - start_date/end_date define valuation date range + - maturity_date is the fixed horizon (e.g., option expiry) + """ + + ## Load first + load_name(self.symbol) + + ## Normalize inputs + result = ForwardResult() + og_start_date = start_date + og_end_date = end_date + dividend_type, start_dt, end_dt, mat_dt, start_str, end_str, mat_str = self._normalize_inputs( + start_date=start_date, + end_date=end_date, + maturity_date=maturity_date, + dividend_type=dividend_type, + ) + + if mat_dt < start_dt: + raise ValueError("maturity_date must be >= start_date") + + key = self._build_key(mat_str=mat_str, dividend_type=dividend_type, use_chain_spot=use_chain_spot) + + cached_series, partial_hit, start_str, end_str, cached_result = self._try_get_cached( + key=key, + start_str=start_str, + end_str=end_str, + start_date=start_date, + end_date=end_date, + dividend_type=dividend_type, + use_chain_spot=use_chain_spot, + ) + if cached_result is not None: + return cached_result + + dividend_result = self._get_dividend_result( + start_str=start_str, + end_str=end_str, + mat_str=mat_str, + dividend_type=dividend_type, + dividend_result=dividend_result, + use_chain_spot=use_chain_spot, + ) + spot = self._load_spot(use_chain_spot=use_chain_spot, spot=spot) + rates = self._load_rates(start_str=start_str, end_str=end_str, rates=rates) + + if dividend_type == DivType.DISCRETE: + discrete_divs = dividend_result.daily_discrete_dividends + + spot, rates, discrete_divs = self._align_3( + spot=spot, + rates=rates, + third=discrete_divs, + third_name="discrete dividend schedules", + ) + + forward_series = self._compute_forward_discrete( + spot=spot, + rates=rates, + discrete_divs=discrete_divs, + mat_dt=mat_dt, + ) + + result.daily_discrete_forward = forward_series + result.dividend_result = dividend_result + + elif dividend_type == DivType.CONTINUOUS: + continuous_divs = dividend_result.daily_continuous_dividends + + spot, rates, continuous_divs = self._align_3( + spot=spot, + rates=rates, + third=continuous_divs, + third_name="div yields", + ) + + forward_series = self._compute_forward_continuous( + spot=spot, + rates=rates, + continuous_divs=continuous_divs, + mat_dt=mat_dt, + ) + + result.daily_continuous_forward = forward_series + result.dividend_result = dividend_result + result.symbol = self.symbol + result.undo_adjust = use_chain_spot + + else: + raise ValueError(f"Unsupported dividend type: {dividend_type}") + + result.dividend_type = dividend_type + result.key = key + + if partial_hit: + forward_series = self._merge_partial(cached_series=cached_series, forward_series=forward_series) + + self.cache_it(key, forward_series, expire=86400) # 24 hours expiry + forward_series = _data_structure_sanitize( + forward_series, + start=og_start_date, + end=og_end_date, + source_name=f"forward timeseries for {self.symbol} with maturity {mat_str}", + ) + + if dividend_type == DivType.DISCRETE: + result.daily_discrete_forward = forward_series + else: + result.daily_continuous_forward = forward_series + + result.undo_adjust = use_chain_spot + result.symbol = self.symbol + result.undo_adjust = use_chain_spot + + return result + + def make_key(self, *, symbol: str, interval=None, artifact_type=None, series_id=None, **extra_parts) -> str: + """Delegates to BaseDataManager key construction. + + Constructs cache key by forwarding to parent class method. + + Args: + symbol: Ticker symbol. + interval: Time interval (e.g., Interval.EOD). + artifact_type: Type of artifact (e.g., ArtifactType.FWD). + series_id: Series identifier (e.g., SeriesId.HIST). + **extra_parts: Additional key components (maturity, dividend_type, etc.). + + Returns: + Unique cache key string. + + Examples: + >>> fwd_mgr = ForwardDataManager("AAPL") + >>> key = fwd_mgr.make_key( + ... symbol="AAPL", + ... artifact_type=ArtifactType.FWD, + ... maturity="2025-06-20" + ... ) + """ + return super().make_key( + symbol=symbol, interval=interval, artifact_type=artifact_type, series_id=series_id, **extra_parts + ) + + def cache_it(self, key: str, value: pd.Series, *, expire: Optional[int] = None) -> None: + """Merges and caches forward time-series, excluding today's partial data. + + Appends new forward price data to existing cached time-series if cache entry exists. + Filters out today's data to avoid caching incomplete/changing values. + + Args: + key: Cache key identifier. + value: Series of forward prices to cache (indexed by datetime). + expire: Optional expiration time in seconds. Uses cache default if None. + + Examples: + >>> fwd_mgr = ForwardDataManager("AAPL") + >>> forwards = pd.Series([156.45, 157.12], index=pd.date_range("2025-01-01", periods=2)) + >>> fwd_mgr.cache_it("my_key", forwards, expire=43200) # 12 hours + + Notes: + - Existing cache entries are merged with new data + - Duplicates are removed, keeping latest values + - Today's data excluded to avoid caching incomplete values + """ + ## Since it is a timeseries, we will append to existing if exists + _data_structure_cache_it(self, key, value, expire=expire) + return + + def get_forward( + self, + date: Union[datetime, str], + maturity_date: Union[datetime, str], + dividend_type: Optional[DivType] = None, + dividend_result: Optional[DividendsResult] = None, + spot: Optional[TimeseriesData] = None, + rates: Optional[RatesResult] = None, + *, + use_chain_spot: bool = True, + fallback_option: Optional[RealTimeFallbackOption] = None, + ) -> ForwardResult: + """Returns the forward price at a specific valuation date. + + Computes forward price for a single valuation date to maturity. Wrapper around + get_forward_timeseries with single-date range. + + Args: + date: Valuation date (YYYY-MM-DD string or datetime). + maturity_date: Horizon date (e.g., option expiry). + dividend_type: DivType.DISCRETE or DivType.CONTINUOUS. Defaults to DISCRETE. + dividend_result: Optional pre-computed dividend data. + spot: Optional pre-loaded TimeseriesData. + rates: Optional pre-computed rates data. + use_chain_spot: If True, uses split-adjusted chain_spot prices. + fallback_option: Optional fallback option for real-time data. + Returns: + ForwardResult containing single forward price in daily_discrete_forward + or daily_continuous_forward Series. + + Examples: + >>> fwd_mgr = ForwardDataManager("AAPL") + >>> result = fwd_mgr.get_forward( + ... date="2025-01-15", + ... maturity_date="2025-06-20", + ... dividend_type=DivType.DISCRETE, + ... use_chain_spot=True + ... ) + >>> forward_price = result.daily_discrete_forward.iloc[0] + >>> logger.info(f"Forward: ${forward_price:.2f}") + Forward: $156.45 + + Notes: + - Suitable for real-time pricing scenarios + - Internally calls get_forward_timeseries with date as both start and end + """ + load_name(self.symbol) + dividend_type = DivType(dividend_type) if dividend_type is not None else DivType.DISCRETE + fallback_option = fallback_option if fallback_option is not None else self.CONFIG.real_time_fallback_option + date = to_datetime(date) + + + if not is_available_on_date(date): + logger.warning( + f"Valuation date {date} is not a business day or holiday. No dividends available. Resolution: {fallback_option}" + ) + if fallback_option == RealTimeFallbackOption.RAISE_ERROR: + raise ValueError(f"Valuation date {date} is not a business day or holiday.") + if fallback_option == RealTimeFallbackOption.USE_LAST_AVAILABLE: + ## Move date back to last business day + ## Using only change_to_last_busday assumes input date is not business day or is holiday + ## Which the function would roll back + ## But there's a possibility input date is today's date but before market open + ## In that case we need to move back one more business day + date = change_to_last_busday(date - pd.tseries.offsets.BDay(1), time_of_day_aware=False) + else: + result = ForwardResult() + if dividend_type == DivType.DISCRETE: + result.daily_discrete_forward = pd.Series( + dtype=float, + index=[date], + data=[np.nan if fallback_option == RealTimeFallbackOption.NAN else 0.0], + ) + else: + result.daily_continuous_forward = pd.Series( + dtype=float, + index=[date], + data=[np.nan if fallback_option == RealTimeFallbackOption.NAN else 0.0], + ) + + result.key = None + result.undo_adjust = use_chain_spot + result.dividend_type = dividend_type + result.symbol = self.symbol + result.fallback_option = fallback_option + return result + + date_str = date.strftime("%Y-%m-%d") if isinstance(date, datetime) else date + mat_str = maturity_date.strftime("%Y-%m-%d") if isinstance(maturity_date, datetime) else maturity_date + start = date_str + end = date_str + + + result = self.get_forward_timeseries( + start_date=start, + end_date=end, + maturity_date=mat_str, + dividend_type=dividend_type, + use_chain_spot=use_chain_spot, + dividend_result=dividend_result, + spot=spot, + rates=rates, + ) + result.fallback_option = fallback_option + return result + + def rt( + self, + maturity_date: Union[datetime, str], + dividend_type: Optional[DivType] = None, + dividend_result: Optional[DividendsResult] = None, + spot: Optional[TimeseriesData] = None, + rates: Optional[RatesResult] = None, + *, + use_chain_spot: bool = True, + fallback_option: Optional[RealTimeFallbackOption] = None, + ) -> ForwardResult: + """Shortcut for get_forward method. + + Provides a concise alias for retrieving forward prices at the current date. + + Args: + maturity_date: Horizon date (e.g., option expiry). + dividend_type: DivType.DISCRETE or DivType.CONTINUOUS. Defaults to DISCRETE. + dividend_result: Optional pre-computed dividend data. + spot: Optional pre-loaded TimeseriesData. + rates: Optional pre-computed rates data. + use_chain_spot: If True, uses split-adjusted chain_spot prices. + fallback_option: Optional fallback option for real-time data. + + Returns: + ForwardResult containing single forward price in daily_discrete_forward + or daily_continuous_forward Series. + + Examples: + >>> fwd_mgr = ForwardDataManager("AAPL") + >>> result = fwd_mgr.rt( + ... date="2025-01-15", + ... maturity_date="2025-06-20", + ... dividend_type=DivType.DISCRETE, + ... use_chain_spot=True + ... ) + >>> forward_price = result.daily_discrete_forward.iloc[0] + >>> logger.info(f"Forward: ${forward_price:.2f}") + Forward: $156.45 + """ + load_name(self.symbol) + res = self.get_forward( + date=datetime.now(), + maturity_date=maturity_date, + dividend_type=dividend_type, + dividend_result=dividend_result, + spot=spot, + rates=rates, + use_chain_spot=use_chain_spot, + fallback_option=fallback_option, + ) + res.rt = True + return res + + def offload(self, *args: Any, **kwargs: Any) -> None: + """Placeholder for offload logic (not implemented). + + Reserved for future implementation of cache offloading or cleanup operations. + Currently performs no action. + + Args: + *args: Arbitrary positional arguments. + **kwargs: Arbitrary keyword arguments. + + Examples: + >>> fwd_mgr = ForwardDataManager("AAPL") + >>> fwd_mgr.offload() # No-op + """ + logger.info(f"No offload logic implemented for {self.CACHE_NAME}") diff --git a/trade/datamanager/greeks.py b/trade/datamanager/greeks.py new file mode 100644 index 0000000..f167328 --- /dev/null +++ b/trade/datamanager/greeks.py @@ -0,0 +1,954 @@ +"""Greek data manager for computing option sensitivities (delta, gamma, vega, theta, rho). + +This module provides the GreekDataManager class for calculating option greeks using +various pricing models (Black-Scholes-Merton, Cox-Ross-Rubinstein binomial). It handles +the complete workflow including data loading, caching, model selection, and result +formatting. + +Key Features: + - Multiple pricing models: BSM, CRR binomial + - Support for American and European exercise styles + - Discrete and continuous dividend treatments + - Automatic data loading and caching + - Real-time and historical greek calculation + - Configurable greek selection (compute only needed greeks) + +Typical Usage: + >>> from trade.datamanager.greeks import GreekDataManager + >>> from trade.datamanager._enums import GreekType + >>> from trade.optionlib.config.types import DivType + >>> + >>> # Initialize manager for AAPL + >>> greek_mgr = GreekDataManager("AAPL") + >>> + >>> # Get all greeks for an option + >>> result = greek_mgr.get_greeks_timeseries( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... expiration="2025-06-20", + ... strike=150.0, + ... right="c", + ... dividend_type=DivType.DISCRETE, + ... ) + >>> print(result.timeseries[["delta", "gamma", "vega"]].head()) + >>> + >>> # Get only specific greeks + >>> result = greek_mgr.get_greeks_timeseries( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... expiration="2025-06-20", + ... strike=150.0, + ... right="c", + ... greeks_to_compute=[GreekType.DELTA, GreekType.GAMMA] + ... ) +""" + +from datetime import datetime +from typing import Optional, Union, List +import pandas as pd +from trade.datamanager.result import ( + GreekResultSet, + SpotResult, + RatesResult, + DividendsResult, + VolatilityResult, + ForwardResult, +) +from trade.datamanager.utils.vol_helpers import ( + _handle_cache_for_vol, + _merge_and_cache_vol_result, + _prepare_vol_calculation_setup, +) +from trade.datamanager.utils.date import sync_date_index, is_available_on_date +from trade.datamanager.utils.model import _load_model_data_timeseries, LoadRequest +from trade.datamanager.utils.greeks_helpers import _prepare_greeks_to_compute, _get_prefilled_greek_result_set +from trade.datamanager._enums import ( + GreekType, + ModelPrice, + OptionPricingModel, + OptionSpotEndpointSource, + VolatilityModel, + RealTimeFallbackOption, + ArtifactType, + Interval, +) +from trade.optionlib.greeks.numerical.binomial import binomial_tree_greeks +from trade.optionlib.greeks.numerical.black_scholes import vectorized_black_scholes_greeks +from trade.optionlib.assets.dividend import ( + vectorized_discrete_pv, + get_vectorized_continuous_dividends, + vector_convert_to_time_frac, +) +from trade.helpers.helper import to_datetime, change_to_last_busday +from trade.datamanager._enums import SeriesId +from trade.datamanager.base import BaseDataManager, CacheSpec +from trade.datamanager.config import OptionDataConfig +from trade.helpers.helper_types import DATE_HINT +from trade.optionlib.config.types import DivType +from trade.helpers.Logging import setup_logger +from trade.datamanager.utils.logging import get_logging_level, UTILS_LOGGER_NAME + +logger = setup_logger(UTILS_LOGGER_NAME, stream_log_level=get_logging_level()) + + +class GreekDataManager(BaseDataManager): + """Manager for computing and caching option greeks (delta, gamma, vega, theta, rho). + + Class that orchestrates the computation of option sensitivities (greeks) using + various option pricing models. Automatically loads required market data (spot, + forward, rates, dividends, implied volatilities) and caches results for efficient reuse. + + Supports two pricing approaches: + 1. Black-Scholes-Merton (BSM) - Fast, European-style greeks + 2. Cox-Ross-Rubinstein (CRR) - Binomial tree, supports American exercise + + Attributes: + CONFIG: Configuration object with default settings for pricing models. + CACHE_NAME: Cache identifier for greek data. + CACHE_SPEC: Cache specification for data persistence. + DEFAULT_SERIES_ID: Default series identifier (historical data). + symbol: Ticker symbol for the underlying asset. + + Examples: + >>> # Basic usage with BSM model + >>> greek_mgr = GreekDataManager("AAPL") + >>> result = greek_mgr.get_greeks_timeseries( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... expiration="2025-06-20", + ... strike=150.0, + ... right="c" + ... ) + + >>> # Get only delta and gamma + >>> from trade.datamanager._enums import GreekType + >>> result = greek_mgr.get_greeks_timeseries( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... expiration="2025-06-20", + ... strike=150.0, + ... right="c", + ... greeks_to_compute=[GreekType.DELTA, GreekType.GAMMA] + ... ) + + >>> # Real-time greeks + >>> rt_greeks = greek_mgr.rt( + ... expiration="2025-06-20", + ... strike=150.0, + ... right="c" + ... ) + """ + + CONFIG: OptionDataConfig = OptionDataConfig() + CACHE_NAME: str = "greek_datamanager_cache" + CACHE_SPEC: CacheSpec = CacheSpec(cache_fname=CACHE_NAME) + DEFAULT_SERIES_ID: SeriesId = SeriesId.HIST + + def __init__(self, symbol: str): + """Initialize GreekDataManager with symbol-specific configuration. + + Args: + symbol: Ticker symbol for the underlying asset (e.g., "AAPL", "MSFT"). + + Examples: + >>> greek_mgr = GreekDataManager("AAPL") + """ + super().__init__(symbol=symbol) + + def get_greeks_timeseries( + self, + start_date: DATE_HINT, + end_date: DATE_HINT, + expiration: DATE_HINT, + strike: float, + right: str, + dividend_type: Optional[DivType] = None, + *, + greeks_to_compute: Optional[Union[List[GreekType], GreekType]] = GreekType.GREEKS, + f: Optional[ForwardResult] = None, + S: Optional[SpotResult] = None, + r: Optional[RatesResult] = None, + d: Optional[DividendsResult] = None, + vol: Optional[VolatilityResult] = None, + endpoint_source: Optional[OptionSpotEndpointSource] = None, + market_model: Optional[OptionPricingModel] = None, + model_price: Optional[ModelPrice] = None, + undo_adjust: bool = True, + ) -> GreekResultSet: + """Returns daily option greeks timeseries using specified pricing model. + + Computes option sensitivities (delta, gamma, vega, theta, rho) for each business day + in [start_date, end_date]. Automatically selects appropriate pricing model (BSM or + binomial) and loads required market data. Uses caching to avoid redundant computations. + + Args: + start_date: First valuation date (YYYY-MM-DD string or datetime). + end_date: Last valuation date (YYYY-MM-DD string or datetime). + expiration: Option expiration date (YYYY-MM-DD string or datetime). + strike: Strike price of the option. + right: Option type ('c' for call, 'p' for put). + dividend_type: DivType.DISCRETE or DivType.CONTINUOUS. Defaults to CONFIG setting. + greeks_to_compute: Which greeks to compute. Single GreekType or list of GreekTypes. + Defaults to GreekType.GREEKS (all standard greeks). Available: DELTA, GAMMA, + VEGA, THETA, RHO, CHARM, VANNA, SPEED, ZOMMA, COLOR, ULTIMA. + f: Optional pre-computed forward prices. If None, loads automatically. + S: Optional pre-computed spot prices. If None, loads automatically. + r: Optional pre-computed risk-free rates. If None, loads automatically. + d: Optional pre-computed dividend data. If None, loads automatically. + vol: Optional pre-computed implied volatilities. If None, loads automatically. + endpoint_source: Option data source (ORATS, HIST, QUOTE). Defaults to CONFIG setting. + market_model: OptionPricingModel.BSM or BINOMIAL. Defaults to CONFIG setting. + model_price: Which price to use (CLOSE, OPEN, MIDPOINT). Defaults to CONFIG setting. + undo_adjust: If True, uses split-adjusted prices. + + Returns: + GreekResultSet containing DataFrame with computed greeks as columns and + DatetimeIndex, plus model metadata and cache key. + + Raises: + ValueError: If unsupported market model is specified. + + Examples: + >>> # Basic usage - compute all greeks + >>> greek_mgr = GreekDataManager("AAPL") + >>> result = greek_mgr.get_greeks_timeseries( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... expiration="2025-06-20", + ... strike=150.0, + ... right="c", + ... dividend_type=DivType.DISCRETE + ... ) + >>> print(result.timeseries[["delta", "gamma", "vega"]].head()) + + >>> # Compute only delta and gamma with binomial model + >>> from trade.datamanager._enums import GreekType, OptionPricingModel + >>> result = greek_mgr.get_greeks_timeseries( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... expiration="2025-06-20", + ... strike=150.0, + ... right="p", + ... greeks_to_compute=[GreekType.DELTA, GreekType.GAMMA], + ... market_model=OptionPricingModel.BINOMIAL + ... ) + + >>> # Provide pre-computed volatility data + >>> vol_mgr = VolDataManager("AAPL") + >>> vol_result = vol_mgr.get_implied_volatility_timeseries( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... expiration="2025-06-20", + ... strike=150.0, + ... right="c" + ... ) + >>> greek_result = greek_mgr.get_greeks_timeseries( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... expiration="2025-06-20", + ... strike=150.0, + ... right="c", + ... vol=vol_result + ... ) + """ + dividend_type = dividend_type or self.CONFIG.dividend_type + endpoint_source = endpoint_source or self.CONFIG.option_spot_endpoint_source + market_model = market_model or self.CONFIG.option_model + vol_model = VolatilityModel.MARKET + + result = _get_prefilled_greek_result_set( + key=None, + symbol=self.symbol, + strike=strike, + expiration=expiration, + right=right, + endpoint_source=endpoint_source, + market_model=market_model, + vol_model=vol_model, + dividend_type=dividend_type, + model_price=model_price, + undo_adjust=undo_adjust, + ) + if market_model == OptionPricingModel.BINOMIAL: + return self._get_binomial_greeks( + start_date=start_date, + end_date=end_date, + expiration=expiration, + strike=strike, + right=right, + dividend_type=dividend_type, + result=result, + greeks_to_compute=greeks_to_compute, + S=S, + r=r, + d=d, + vol=vol, + endpoint_source=endpoint_source, + undo_adjust=undo_adjust, + model_price=model_price, + ) + elif market_model == OptionPricingModel.BSM or market_model == OptionPricingModel.EURO_EQIV: + return self._get_bsm_greeks( + start_date=start_date, + end_date=end_date, + expiration=expiration, + strike=strike, + right=right, + dividend_type=dividend_type, + result=result, + greeks_to_compute=greeks_to_compute, + f=f, + S=S, + r=r, + d=d, + vol=vol, + endpoint_source=endpoint_source, + undo_adjust=undo_adjust, + model_price=model_price, + ) + else: + raise ValueError(f"Unsupported market model: {market_model}") + + def _get_binomial_greeks( + self, + start_date: DATE_HINT, + end_date: DATE_HINT, + expiration: DATE_HINT, + strike: float, + right: str, + dividend_type: Optional[DivType] = None, + *, + result: Optional[GreekResultSet] = None, + greeks_to_compute: Optional[Union[List[GreekType], GreekType]] = None, + S: Optional[SpotResult] = None, + r: Optional[RatesResult] = None, + d: Optional[DividendsResult] = None, + vol: Optional[VolatilityResult] = None, + endpoint_source: Optional[OptionSpotEndpointSource] = None, + model_price: Optional[ModelPrice] = None, + undo_adjust: bool = True, + ) -> GreekResultSet: + """Compute option greeks using Cox-Ross-Rubinstein binomial tree model. + + Internal method that calculates daily option sensitivities using CRR binomial trees. + Supports American exercise. Automatically loads required data (spot, rates, dividends, + implied volatilities) if not provided. Uses caching for efficient reuse. + + Note: Binomial tree model computes all greeks simultaneously, so caching stores the + complete set even if only specific greeks are requested. + + Args: + start_date: First valuation date (YYYY-MM-DD string or datetime). + end_date: Last valuation date (YYYY-MM-DD string or datetime). + expiration: Option expiration date (YYYY-MM-DD string or datetime). + strike: Strike price of the option. + right: Option type ('c' for call, 'p' for put). + dividend_type: Dividend treatment type (DISCRETE or CONTINUOUS). + result: Optional pre-initialized GreekResultSet container. + greeks_to_compute: Which greeks to return (all are computed regardless). + S: Optional pre-computed spot prices. If None, loads automatically. + r: Optional pre-computed risk-free rates. If None, loads automatically. + d: Optional pre-computed dividend data. If None, loads automatically. + vol: Optional pre-computed implied volatilities. If None, loads automatically. + endpoint_source: Option data source for volatility calculation. + model_price: Which price to use (CLOSE, OPEN, MIDPOINT). + undo_adjust: If True, uses split-adjusted prices. + + Returns: + GreekResultSet containing DataFrame with computed greeks as columns and + DatetimeIndex, plus model metadata and cache key. + + Examples: + >>> # Internal usage - typically called via get_greeks_timeseries + >>> result = greek_mgr._get_binomial_greeks( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... expiration="2025-06-20", + ... strike=150.0, + ... right="c", + ... dividend_type=DivType.DISCRETE + ... ) + """ + + ## biomial tree greeks calculation function calculates all greeks at once. So I'll check cache + ## for a greek and if missing, compute all and store in cache. + ## endpoint_source & div_type will resolved at `get_timeseries` level; the frontend function. + + endpoint_source = endpoint_source or self.CONFIG.option_spot_endpoint_source + model_price = model_price or self.CONFIG.model_price + result = result or GreekResultSet() + result, dividend_type, endpoint_source, start_str, end_str, start_date, end_date = ( + _prepare_vol_calculation_setup( + self, start_date, end_date, expiration, strike, right, dividend_type, endpoint_source, result + ) + ) + ## Using self.CONFIG allows frontend to override default settings for greeks_to_compute. + ## Also allows user to specify greeks_to_compute at function call level which can get hidden as calls become nested. + greeks_to_compute = greeks_to_compute or self.CONFIG.greeks_to_compute + greeks_to_compute = _prepare_greeks_to_compute(greeks_to_compute) + key = self.make_key( + symbol=self.symbol, + interval=Interval.EOD, + artifact_type=ArtifactType.GREEKS, + series_id=SeriesId.HIST, + option_pricing_model=OptionPricingModel.BINOMIAL, + volatility_model=VolatilityModel.MARKET, + model_price=model_price, + dividend_type=dividend_type, + endpoint_source=endpoint_source, + expiration=expiration, + strike=strike, + right=right, + ) + result.key = key + result.model_price = model_price + + cached_data, is_partial, start_date, end_date, early_return = _handle_cache_for_vol( + self, key, start_date, end_date, result, optional_name="greeks" + ) + if early_return: + result.timeseries = cached_data[greeks_to_compute] + return result + + request = self._create_load_request( + start_date=start_date, + end_date=end_date, + expiration=expiration, + strike=strike, + right=right, + dividend_type=dividend_type, + market_model=OptionPricingModel.BINOMIAL, + model_price=model_price, + endpoint_source=endpoint_source, + s=S, + r=r, + d=d, + vol=vol, + undo_adjust=undo_adjust, + ) + model_data = _load_model_data_timeseries(request) + S = model_data.spot.timeseries if request.load_spot else S.timeseries + r = model_data.rates.timeseries if request.load_rates else r.timeseries + d = model_data.dividend.timeseries if request.load_dividend else d.timeseries + vol = model_data.vol.timeseries if request.load_vol else vol.timeseries + S, r, d, vol = sync_date_index(S, r, d, vol) + + if dividend_type == DivType.DISCRETE: + d = vector_convert_to_time_frac( + schedules=d, + valuation_dates=to_datetime(S.index.tolist(), format="%Y-%m-%d"), + end_dates=to_datetime([expiration] * len(S), format="%Y-%m-%d"), + ) + + ## Now compute greeks + greeks_res_dict = binomial_tree_greeks( + K=[strike] * len(S), + expiration=[expiration] * len(S), + sigma=vol, + S=S, + r=r, + N=[100] * len(S), + dividend_type=[dividend_type.value] * len(S), + div_amount=d, + option_type=[right] * len(S), + start_date=to_datetime(S.index.tolist(), format="%Y-%m-%d"), + valuation_date=to_datetime(S.index.tolist(), format="%Y-%m-%d"), + american=[True] * len(S), + ) + + ## Remove "models" key if exists + if "models" in greeks_res_dict: + del greeks_res_dict["models"] + + greeks_df = pd.DataFrame(greeks_res_dict, index=S.index) + + ## Use utility: Merge and cache + greeks_df = _merge_and_cache_vol_result(self, greeks_df, cached_data, is_partial, key, start_str, end_str) + result.timeseries = greeks_df[greeks_to_compute] + + return result + + def _get_bsm_greeks( + self, + start_date: DATE_HINT, + end_date: DATE_HINT, + expiration: DATE_HINT, + strike: float, + right: str, + dividend_type: Optional[DivType] = None, + *, + result: Optional[GreekResultSet] = None, + greeks_to_compute: Optional[Union[List[GreekType], GreekType]] = GreekType.GREEKS, + f: Optional[ForwardResult] = None, + S: Optional[SpotResult] = None, + r: Optional[RatesResult] = None, + d: Optional[DividendsResult] = None, + vol: Optional[VolatilityResult] = None, + endpoint_source: Optional[OptionSpotEndpointSource] = None, + model_price: Optional[ModelPrice] = None, + undo_adjust: bool = True, + ) -> GreekResultSet: + """Compute option greeks using Black-Scholes-Merton model. + + Internal method that calculates daily option sensitivities using closed-form BSM + formulas. Only supports European-style greeks. Automatically loads required data + (forward, spot, rates, dividends, implied volatilities) if not provided. Uses + caching for efficient reuse. + + Note: BSM model computes all greeks simultaneously, so caching stores the complete + set even if only specific greeks are requested. + + Args: + start_date: First valuation date (YYYY-MM-DD string or datetime). + end_date: Last valuation date (YYYY-MM-DD string or datetime). + expiration: Option expiration date (YYYY-MM-DD string or datetime). + strike: Strike price of the option. + right: Option type ('c' for call, 'p' for put). + dividend_type: Dividend treatment type (DISCRETE or CONTINUOUS). + result: Optional pre-initialized GreekResultSet container. + greeks_to_compute: Which greeks to return (all are computed regardless). + f: Optional pre-computed forward prices. If None, loads automatically. + S: Optional pre-computed spot prices. If None, loads automatically. + r: Optional pre-computed risk-free rates. If None, loads automatically. + d: Optional pre-computed dividend data. If None, loads automatically. + vol: Optional pre-computed implied volatilities. If None, loads automatically. + endpoint_source: Option data source for volatility calculation. + model_price: Which price to use (CLOSE, OPEN, MIDPOINT). + undo_adjust: If True, uses split-adjusted prices. + + Returns: + GreekResultSet containing DataFrame with computed greeks as columns and + DatetimeIndex, plus model metadata and cache key. + + Examples: + >>> # Internal usage - typically called via get_greeks_timeseries + >>> result = greek_mgr._get_bsm_greeks( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... expiration="2025-06-20", + ... strike=150.0, + ... right="c", + ... dividend_type=DivType.DISCRETE + ... ) + """ + + ## biomial tree greeks calculation function calculates all greeks at once. So I'll check cache + ## for a greek and if missing, compute all and store in cache. + ## endpoint_source & div_type will resolved at `get_timeseries` level; the frontend function. + endpoint_source = endpoint_source or self.CONFIG.option_spot_endpoint_source + model_price = model_price or self.CONFIG.model_price + result = result or GreekResultSet() + result, dividend_type, endpoint_source, start_str, end_str, start_date, end_date = ( + _prepare_vol_calculation_setup( + self, start_date, end_date, expiration, strike, right, dividend_type, endpoint_source, result + ) + ) + + greeks_to_compute = _prepare_greeks_to_compute(greeks_to_compute) + key = self.make_key( + symbol=self.symbol, + interval=Interval.EOD, + artifact_type=ArtifactType.GREEKS, + series_id=SeriesId.HIST, + option_pricing_model=OptionPricingModel.BSM, + volatility_model=VolatilityModel.MARKET, + model_price=model_price, + dividend_type=dividend_type, + endpoint_source=endpoint_source, + expiration=expiration, + strike=strike, + right=right, + ) + result.key = key + result.model_price = model_price + result.endpoint_source = endpoint_source + + cached_data, is_partial, start_date, end_date, early_return = _handle_cache_for_vol( + self, key, start_date, end_date, result, optional_name="greeks" + ) + if early_return: + result.timeseries = cached_data[greeks_to_compute] + return result + + request = self._create_load_request( + start_date=start_date, + end_date=end_date, + expiration=expiration, + strike=strike, + right=right, + dividend_type=dividend_type, + market_model=OptionPricingModel.BSM, + endpoint_source=endpoint_source, + s=S, + f=f, + r=r, + d=d, + vol=vol, + undo_adjust=undo_adjust, + model_price=model_price, + ) + model_data = _load_model_data_timeseries(request) + S = model_data.spot.timeseries if request.load_spot else S.timeseries + r = model_data.rates.timeseries if request.load_rates else r.timeseries + d = model_data.dividend.timeseries if request.load_dividend else d.timeseries + vol = model_data.vol.timeseries if request.load_vol else vol.timeseries + f = model_data.forward.timeseries if request.load_forward else f.timeseries + s, f, r, d, vol = sync_date_index(S, f, r, d, vol) + + ## Convert dividends to present value amounts + if dividend_type == DivType.DISCRETE: + pv_divs = vectorized_discrete_pv( + schedules=d, + _valuation_dates=f.index.tolist(), + _end_dates=[expiration] * len(f), + r=r, + ) + + ## Continuous dividends. Discount dividend rates to present value amounts + else: + pv_divs = get_vectorized_continuous_dividends( + div_rates=d.values, _valuation_dates=f.index.tolist(), _end_dates=[expiration] * len(f) + ) + + ## Now compute greeks + greeks_res_dict = vectorized_black_scholes_greeks( + S=s, + K=[strike] * len(s), + F=f, + r=r, + sigma=vol, + valuation_dates=s.index.tolist(), + end_dates=[expiration] * len(s), + option_type=[right.lower()] * len(s), + dividend_type=dividend_type.value, + div_amount=pv_divs, + ) + ## Remove "models" key if exists + if "models" in greeks_res_dict: + del greeks_res_dict["models"] + + greeks_df = pd.DataFrame(greeks_res_dict, index=s.index) + + ## Use utility: Merge and cache + greeks_df = _merge_and_cache_vol_result(self, greeks_df, cached_data, is_partial, key, start_str, end_str) + result.timeseries = greeks_df[greeks_to_compute] + + return result + + def get_at_time_greeks( + self, + as_of: DATE_HINT, + expiration: DATE_HINT, + strike: float, + right: str, + dividend_type: Optional[DivType] = None, + *, + greeks_to_compute: Optional[Union[List[GreekType], GreekType]] = GreekType.GREEKS, + S: Optional[SpotResult] = None, + f: Optional[ForwardResult] = None, + r: Optional[RatesResult] = None, + d: Optional[DividendsResult] = None, + vol: Optional[VolatilityResult] = None, + endpoint_source: Optional[OptionSpotEndpointSource] = None, + market_model: Optional[OptionPricingModel] = None, + undo_adjust: bool = True, + fallback_option: Optional[RealTimeFallbackOption] = None, + model_price: Optional[ModelPrice] = None, + ) -> GreekResultSet: + """Get option greeks at a specific point in time. + + Computes option sensitivities for a single valuation date. Handles non-business days + and holidays according to fallback_option setting. Useful for historical analysis on + specific dates or intraday calculations. + + Args: + as_of: Valuation date (YYYY-MM-DD string or datetime). + expiration: Option expiration date (YYYY-MM-DD string or datetime). + strike: Strike price of the option. + right: Option type ('c' for call, 'p' for put). + dividend_type: DivType.DISCRETE or DivType.CONTINUOUS. Defaults to CONFIG setting. + greeks_to_compute: Which greeks to compute. Single GreekType or list of GreekTypes. + S: Optional pre-computed spot prices. If None, loads automatically. + f: Optional pre-computed forward prices. If None, loads automatically. + r: Optional pre-computed risk-free rates. If None, loads automatically. + d: Optional pre-computed dividend data. If None, loads automatically. + vol: Optional pre-computed implied volatilities. If None, loads automatically. + endpoint_source: Option data source (ORATS, HIST, QUOTE). Defaults to CONFIG setting. + market_model: OptionPricingModel.BSM or BINOMIAL. Defaults to CONFIG setting. + undo_adjust: If True, uses split-adjusted prices. + fallback_option: How to handle non-business days (RAISE_ERROR, USE_LAST_AVAILABLE, + NAN, ZERO). Defaults to CONFIG setting. + model_price: Which price to use (CLOSE, OPEN, MIDPOINT). Defaults to CONFIG setting. + + Returns: + GreekResultSet containing single-row DataFrame with computed greeks as columns, + plus model metadata and cache key. + + Raises: + ValueError: If as_of is not a business day and fallback_option is RAISE_ERROR. + + Examples: + >>> # Get greeks for a specific date + >>> greek_mgr = GreekDataManager("AAPL") + >>> result = greek_mgr.get_at_time_greeks( + ... as_of="2025-01-15", + ... expiration="2025-06-20", + ... strike=150.0, + ... right="c" + ... ) + >>> print(result.timeseries[["delta", "gamma"]].iloc[0]) + + >>> # Handle non-business day with last available data + >>> from trade.datamanager._enums import RealTimeFallbackOption + >>> result = greek_mgr.get_at_time_greeks( + ... as_of="2025-01-18", # Saturday + ... expiration="2025-06-20", + ... strike=150.0, + ... right="c", + ... fallback_option=RealTimeFallbackOption.USE_LAST_AVAILABLE + ... ) + """ + + vol_model = VolatilityModel.MARKET + dividend_type = dividend_type or self.CONFIG.dividend_type + endpoint_source = endpoint_source or self.CONFIG.option_spot_endpoint_source + market_model = market_model or self.CONFIG.option_model + fallback_option = fallback_option or self.CONFIG.real_time_fallback_option + model_price = model_price or self.CONFIG.model_price + if not is_available_on_date(as_of): + logger.warning( + f"Valuation date {as_of} is not a business day or holiday. Resolving using fallback options {fallback_option}." + ) + if fallback_option == RealTimeFallbackOption.RAISE_ERROR: + raise ValueError(f"Valuation date {as_of} is not a business day or holiday.") + if fallback_option == RealTimeFallbackOption.USE_LAST_AVAILABLE: + ## Move date back to last business day + ## Using only change_to_last_busday assumes input date is not business day or is holiday + ## Which the function would roll back + ## But there's a possibility input date is today's date but before market open + ## In that case we need to move back one more business day + logger.info("Using last available business day for valuation date.") + as_of = change_to_last_busday((as_of - pd.tseries.offsets.BDay(1)), time_of_day_aware=False) + logger.info(f"New valuation date: {as_of}") + else: + result = GreekResultSet() + v = float("nan") if fallback_option == RealTimeFallbackOption.NAN else 0.0 + value_dict = {g: [v] for g in _prepare_greeks_to_compute(greeks_to_compute)} + result.timeseries = pd.DataFrame(data=value_dict, index=pd.DatetimeIndex([to_datetime(as_of)])) + result.key = None + result.vol_model = vol_model or self.CONFIG.volatility_model + result.market_model = market_model or self.CONFIG.option_model + result.expiration = to_datetime(expiration) + result.right = right + result.strike = strike + result.endpoint_source = endpoint_source or self.CONFIG.option_spot_endpoint_source + result.dividend_type = dividend_type or self.CONFIG.dividend_type + result.symbol = self.symbol + result.model_price = model_price + result.fallback_option = fallback_option + return result + + greeks_result_set = self.get_greeks_timeseries( + start_date=as_of, + end_date=as_of, + expiration=expiration, + strike=strike, + right=right, + dividend_type=dividend_type, + greeks_to_compute=greeks_to_compute, + S=S, + r=r, + d=d, + vol=vol, + f=f, + endpoint_source=endpoint_source, + market_model=market_model, + undo_adjust=undo_adjust, + model_price=model_price, + ) + greeks_result_set.fallback_option = fallback_option + return greeks_result_set + + def rt( + self, + expiration: DATE_HINT, + strike: float, + right: str, + dividend_type: Optional[DivType] = None, + *, + greeks_to_compute: Optional[Union[List[GreekType], GreekType]] = GreekType.GREEKS, + S: Optional[SpotResult] = None, + f: Optional[ForwardResult] = None, + r: Optional[RatesResult] = None, + d: Optional[DividendsResult] = None, + vol: Optional[VolatilityResult] = None, + market_model: Optional[OptionPricingModel] = None, + undo_adjust: bool = True, + fallback_option: Optional[RealTimeFallbackOption] = None, + model_price: Optional[ModelPrice] = None, + ) -> GreekResultSet: + """Get real-time option greeks using current market data. + + Convenience method that computes greeks as of current datetime using QUOTE endpoint + for live market prices. Ideal for real-time trading systems and live option monitoring. + + Args: + expiration: Option expiration date (YYYY-MM-DD string or datetime). + strike: Strike price of the option. + right: Option type ('c' for call, 'p' for put). + dividend_type: DivType.DISCRETE or DivType.CONTINUOUS. Defaults to CONFIG setting. + greeks_to_compute: Which greeks to compute. Single GreekType or list of GreekTypes. + S: Optional pre-computed spot prices. If None, loads real-time data. + f: Optional pre-computed forward prices. If None, loads real-time data. + r: Optional pre-computed risk-free rates. If None, loads real-time data. + d: Optional pre-computed dividend data. If None, loads real-time data. + vol: Optional pre-computed implied volatilities. If None, loads real-time data. + market_model: OptionPricingModel.BSM or BINOMIAL. Defaults to CONFIG setting. + undo_adjust: If True, uses split-adjusted prices. + fallback_option: How to handle market closed (USE_LAST_AVAILABLE, NAN, ZERO). + Defaults to CONFIG setting. + model_price: Which price to use (CLOSE, OPEN, MIDPOINT). Defaults to CONFIG setting. + + Returns: + GreekResultSet containing single-row DataFrame with computed greeks as columns, + plus model metadata and cache key. + + Examples: + >>> # Get real-time greeks during market hours + >>> greek_mgr = GreekDataManager("AAPL") + >>> result = greek_mgr.rt( + ... expiration="2025-06-20", + ... strike=150.0, + ... right="c" + ... ) + >>> print(f"Delta: {result.timeseries['delta'].iloc[0]:.4f}") + + >>> # Get only delta and vega in real-time + >>> from trade.datamanager._enums import GreekType + >>> result = greek_mgr.rt( + ... expiration="2025-06-20", + ... strike=150.0, + ... right="c", + ... greeks_to_compute=[GreekType.DELTA, GreekType.VEGA] + ... ) + + >>> # Use last available if market closed + >>> from trade.datamanager._enums import RealTimeFallbackOption + >>> result = greek_mgr.rt( + ... expiration="2025-06-20", + ... strike=150.0, + ... right="c", + ... fallback_option=RealTimeFallbackOption.USE_LAST_AVAILABLE + ... ) + """ + + res = self.get_at_time_greeks( + as_of=datetime.now(), + expiration=expiration, + strike=strike, + right=right, + dividend_type=dividend_type, + greeks_to_compute=greeks_to_compute, + S=S, + r=r, + d=d, + f=f, + vol=vol, + endpoint_source=OptionSpotEndpointSource.QUOTE, + market_model=market_model, + undo_adjust=undo_adjust, + fallback_option=fallback_option, + model_price=model_price, + ) + res.rt = True + return res + + def _create_load_request( + ## Requied parameters to ensure correct data is loaded + self, + start_date: DATE_HINT, + end_date: DATE_HINT, + expiration: DATE_HINT, + strike: float, + right: str, + dividend_type: DivType, + market_model: OptionPricingModel, + endpoint_source: OptionSpotEndpointSource, + model_price: ModelPrice, + *, + ## Optional pre-loaded data. If not provided, will be loaded. + s: Optional[SpotResult] = None, + r: Optional[RatesResult] = None, + f: Optional[ForwardResult] = None, + d: Optional[DividendsResult] = None, + vol: Optional[VolatilityResult] = None, + undo_adjust: bool = True, + ) -> LoadRequest: + """Create a LoadRequest specifying which market data to load for greek calculation. + + Internal utility that determines which data sources need to be loaded based on: + 1. Which data is already provided (pre-loaded) + 2. Which pricing model is being used (BSM needs forwards, binomial needs spot) + + Args: + start_date: First valuation date (YYYY-MM-DD string or datetime). + end_date: Last valuation date (YYYY-MM-DD string or datetime). + expiration: Option expiration date (YYYY-MM-DD string or datetime). + strike: Strike price of the option. + right: Option type ('c' for call, 'p' for put). + dividend_type: Dividend treatment type (DISCRETE or CONTINUOUS). + market_model: Pricing model (BSM or BINOMIAL). + endpoint_source: Option data source (ORATS, HIST, QUOTE). + model_price: Which price to use (CLOSE, OPEN, MIDPOINT). + s: Optional pre-loaded spot data. If None, will be loaded. + r: Optional pre-loaded rates data. If None, will be loaded. + f: Optional pre-loaded forward data. If None, will be loaded (BSM only). + d: Optional pre-loaded dividend data. If None, will be loaded. + vol: Optional pre-loaded volatility data. If None, will be loaded. + undo_adjust: If True, uses split-adjusted prices. + + Returns: + LoadRequest object with flags indicating which data sources to load. + + Examples: + >>> # Internal usage - creates request to load all data + >>> request = greek_mgr._create_load_request( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... expiration="2025-06-20", + ... strike=150.0, + ... right="c", + ... dividend_type=DivType.DISCRETE, + ... market_model=OptionPricingModel.BSM, + ... endpoint_source=OptionSpotEndpointSource.HIST, + ... model_price=ModelPrice.CLOSE + ... ) + >>> # request.load_forward = True (BSM needs forwards) + >>> # request.load_spot = True (no spot provided) + >>> # request.load_vol = True (no vol provided) + """ + + req = LoadRequest( + symbol=self.symbol, + start_date=start_date, + end_date=end_date, + expiration=expiration, + strike=strike, + right=right, + dividend_type=dividend_type, + endpoint_source=endpoint_source, + vol_model=VolatilityModel.MARKET, + model_price=model_price, + market_model=market_model, + ## Load spot only if missing. + load_spot=(s is None), + ## Load forward only if missing and using BSM model. Binomial uses spot price. + load_forward=(market_model == OptionPricingModel.BSM) and (f is None), + load_vol=(vol is None), + load_dividend=(d is None), + load_rates=(r is None), + ## Not needed for greek calculation + load_option_spot=False, + undo_adjust=undo_adjust, + ) + return req diff --git a/trade/datamanager/guide.txt b/trade/datamanager/guide.txt index 0aa8bab..ab2ff91 100644 --- a/trade/datamanager/guide.txt +++ b/trade/datamanager/guide.txt @@ -1,212 +1,720 @@ -======================================== -OPTION DATA MANAGER – TOP LEVEL DESIGN -======================================== - ----------------------------------------- -AS-OF POLICY (SIMPLIFIED) ----------------------------------------- - -As-of represents the assumed market state time for a calculation. - -We use ONLY three modes: - -1) intraday - - Historical intraday timestamp - - Used for backtests and intraday analytics - - Example: 2025-01-04 10:32:15 - -2) eod - - End-of-day snapshot - - Used for daily data, surfaces, storage - - Example: 2025-01-04 EOD - -3) snap - - Real-time / near-real-time snapshot - - Used for live trading - - Example: now() with short TTL - -As-of is NOT an interval or bar size. -As-of is part of every cache key. - ----------------------------------------- -CORE ARCHITECTURE OVERVIEW ----------------------------------------- - -DESIGN PHILOSOPHY: -Facade + domain managers + pluggable engines -Read-through caching + materialization - ----------------------------------------- -HEAD / ORCHESTRATION ----------------------------------------- - -DataManager -- Single entrypoint -- Coordinates all domain managers -- No heavy computation -- Enforces lifecycle + consistency - ----------------------------------------- -DOMAIN MANAGERS (CORE PRODUCTS) ----------------------------------------- - -MarketSnapshotManager -- Owns as-of normalization -- Produces snapshot identity (hash or id) - -SpotManager -- Spot prices -- Cached by (underlying, as_of) - -RatesManager -- Discount factors / rate curves - -DividendManager -- Dividend schedules / borrow - -ForwardManager -- Produces forward from spot + carry -- Cached by (underlying, expiry, as_of) - -ChainManager -- Option metadata + quotes -- Cached by (underlying, as_of) - -VolManager -- Entry point for volatility -- Routes to engines -- Owns vol caching + provenance - -GreeksManager -- Entry point for greeks -- Requests vols explicitly from VolManager - ----------------------------------------- -ENGINE LAYER (INTERNAL ONLY) ----------------------------------------- - -Volatility Engines: -- BSVolEngine -- CRRVolEngine -- SurfaceVolEngine -- FitEngine - -Greeks Engines: -- BSGreeksEngine -- NumericalGreeksEngine -- BinomialGreeksEngine - -Engines are NEVER called directly by strategies. - ----------------------------------------- -REQUEST / RESULT CONTRACTS ----------------------------------------- - -Requests: -- SpotRequest -- ChainRequest -- VolRequest -- GreeksRequest - -Results: -- SpotResult -- VolResult -- GreeksResult - -Each result contains: -- values (Series / DataFrame) -- provenance (engine, config hash, snapshot id, as_of) -- diagnostics (optional) - ----------------------------------------- -CACHING LAYER ----------------------------------------- - -CustomCache -- Disk-backed -- Used by all managers - -CacheKey -- Standardized key builder -- Includes: - - identity (option / underlying) - - artifact type - - as_of - - engine / version info - ----------------------------------------- -PERSISTENCE / OFFLOAD ----------------------------------------- - -offload() -- Base capability on managers -- Cron-driven - -Materializer (optional) -- Shared SQL writer -- Batching, retries, idempotency - ----------------------------------------- -POLICIES & DIAGNOSTICS ----------------------------------------- - -AsOfPolicy -- intraday / eod / snap - -PricePolicy -- mid / bid / ask - -CachePolicy -- TTL / refresh rules - -Metrics / Logging -- cache hit/miss -- compute time -- engine selection - ----------------------------------------- -BUILD ORDER (DO THIS IN ORDER) ----------------------------------------- - -PHASE 1 – FOUNDATION -- CustomCache -- CacheKey -- AsOfPolicy - -PHASE 2 – MARKET DATA -- ChainManager -- SpotManager - -PHASE 3 – CARRY -- RatesManager -- DividendManager -- ForwardManager - -PHASE 4 – VOLATILITY -- VolManager -- BSVolEngine -- VolRequest / VolResult - -PHASE 5 – GREEKS -- GreeksManager -- BSGreeksEngine -- GreeksRequest / GreeksResult - -PHASE 6 – PERSISTENCE -- offload() -- Materializer - -PHASE 7 – EXTENSIONS -- CRRVolEngine -- SurfaceVolEngine -- FitEngine -- Batch / chain analytics - ----------------------------------------- -GOLDEN RULES ----------------------------------------- - -1) Strategies never choose engines -2) Managers choose engines -3) Cache keys always include as_of -4) Provenance travels with data + ================================================================================ +QUANTTOOLS DATAMANAGER MODULE – COMPREHENSIVE GUIDE +================================================================================ + +================================================================================ +1. MODULE OVERVIEW +================================================================================ + +The datamanager module provides a complete data infrastructure for quantitative +options trading and backtesting. It handles market data retrieval, caching, +processing, and calculation of derived metrics (forwards, volatilities, greeks, +theoretical prices). + +DESIGN PRINCIPLES: +- Singleton pattern per symbol for efficient resource management +- Intelligent multi-tier caching (memory + disk with expiration) +- Automatic data loading from multiple sources (ThetaData, OpenBB, YFinance) +- Type-safe result containers with full metadata +- Consistent API across all managers + +KEY CAPABILITIES: +- Historical and real-time market data access +- Split adjustment handling for backtesting +- Dividend schedule construction (discrete/continuous) +- Forward price computation with carry models +- Implied volatility calculation (BSM, Binomial) +- Greek calculation with multiple models +- Theoretical pricing and scenario analysis + + +================================================================================ +2. ARCHITECTURE OVERVIEW +================================================================================ + +COMPONENT HIERARCHY: + +┌─────────────────────────────────────────────────────────────────────┐ +│ BaseDataManager (ABC) │ +│ - Cache management (CustomCache) │ +│ - Key construction (namespaced, artifact-based) │ +│ - Configuration (OptionDataConfig singleton) │ +│ - Logger setup │ +└─────────────────────────────────────────────────────────────────────┘ + │ + ┌───────────────────┴───────────────────┐ + │ │ + ┌───────────▼─────────────┐ ┌─────────────▼──────────────┐ + │ Market Data Layer │ │ Derived Metrics Layer │ + │ │ │ │ + │ - SpotDataManager │ │ - ForwardDataManager │ + │ - RatesDataManager │ │ - VolDataManager │ + │ - DividendDataManager │ │ - GreekDataManager │ + │ - OptionSpotDataManager │ │ - TheoDataFunctions │ + │ - MarketTimeseries │ │ (get_option_theo_price) │ + └─────────────────────────┘ └────────────────────────────┘ + + +================================================================================ +3. CORE DATA MANAGERS +================================================================================ + +-------------------------------------------------------------------------------- +3.1 SpotDataManager +-------------------------------------------------------------------------------- +Manages underlying equity spot prices with split adjustment support. + +SINGLETON: Yes (per symbol) +CACHE: 45-day expiration +DATA SOURCE: MarketTimeseries (OpenBB/YFinance) + +KEY METHODS: + get_spot_timeseries(start, end, undo_adjust=True) -> SpotResult + - Returns daily closing prices + - undo_adjust=True: split-adjusted chain_spot + - undo_adjust=False: unadjusted spot + + get_spot(date, undo_adjust=True) -> SpotResult + - Single date spot price + + rt(undo_adjust=True) -> float + - Real-time spot price + +TYPICAL USAGE: + spot_mgr = SpotDataManager("AAPL") + result = spot_mgr.get_spot_timeseries( + start_date="2025-01-01", + end_date="2025-01-31", + undo_adjust=True + ) + prices = result.daily_spot # pd.Series with DatetimeIndex + +-------------------------------------------------------------------------------- +3.2 RatesDataManager +-------------------------------------------------------------------------------- +Manages risk-free interest rates from US Treasury bills (^IRX). + +SINGLETON: Yes (global - no symbol) +CACHE: 30-day expiration +DATA SOURCE: YFinance (13-week T-Bill) + +KEY METHODS: + get_risk_free_rate_timeseries(start, end) -> RatesResult + - Returns daily risk-free rates (annualized) + - Automatically handles missing dates (forward fill) + + get_rate(date) -> RatesResult + - Single date rate + + rt() -> float + - Real-time rate + +TYPICAL USAGE: + rates_mgr = RatesDataManager() + result = rates_mgr.get_risk_free_rate_timeseries( + start_date="2025-01-01", + end_date="2025-01-31" + ) + rates = result.daily_risk_free_rates # pd.Series + +-------------------------------------------------------------------------------- +3.3 DividendDataManager +-------------------------------------------------------------------------------- +Manages dividend data with schedule construction for option pricing. + +SINGLETON: Yes (per symbol) +CACHE: 60-day expiration (+ temp cache for short-lived data) +DATA SOURCE: MarketTimeseries + forecasting + +KEY METHODS: + get_schedule_timeseries(start, end, maturity, div_type, undo_adjust) -> DividendsResult + - Returns daily Schedule objects (discrete) or yields (continuous) + - Builds forward-looking schedules for each valuation date + - Handles split adjustments + - Supports partial caching with smart merging + + get_discrete_dividend_schedule(start, end) -> Tuple[Schedule, str] + - Raw dividend schedule for date range + - Used internally by other managers + +TYPICAL USAGE: + div_mgr = DividendDataManager("AAPL") + result = div_mgr.get_schedule_timeseries( + start_date="2025-01-01", + end_date="2025-01-31", + maturity_date="2025-06-20", + dividend_type=DivType.DISCRETE, + undo_adjust=True + ) + schedules = result.daily_discrete_dividends # pd.Series of Schedule objects + +-------------------------------------------------------------------------------- +3.4 ForwardDataManager +-------------------------------------------------------------------------------- +Computes forward prices using cost-of-carry models. + +SINGLETON: Yes (per symbol) +CACHE: 30-day expiration +DEPENDENCIES: SpotDataManager, RatesDataManager, DividendDataManager + +KEY METHODS: + get_forward_timeseries(start, end, maturity, div_type, use_chain_spot) -> ForwardResult + - Computes daily forward prices to fixed maturity + - Discrete model: F = S * exp(r*T) - PV(dividends) + - Continuous model: F = S * exp((r-q)*T) + + get_forward(date, maturity, div_type, use_chain_spot) -> ForwardResult + - Single date forward + +TYPICAL USAGE: + fwd_mgr = ForwardDataManager("AAPL") + result = fwd_mgr.get_forward_timeseries( + start_date="2025-01-01", + end_date="2025-01-31", + maturity_date="2025-06-20", + dividend_type=DivType.DISCRETE, + use_chain_spot=True + ) + forwards = result.daily_discrete_forward # pd.Series + +-------------------------------------------------------------------------------- +3.5 OptionSpotDataManager +-------------------------------------------------------------------------------- +Retrieves option contract market prices from ThetaData API. + +SINGLETON: No (per symbol) +CACHE: 7-day expiration +DATA SOURCE: ThetaData (EOD or Quote endpoint) + +KEY METHODS: + get_option_spot_timeseries(start, end, strike, expiration, right, endpoint_source) -> OptionSpotResult + - Returns OHLC data for option contract + - endpoint_source=EOD: end-of-day report + - endpoint_source=QUOTE: intraday quotes + + get_option_spot(date, strike, expiration, right) -> OptionSpotResult + - Single date option price + +TYPICAL USAGE: + opt_mgr = OptionSpotDataManager("AAPL") + result = opt_mgr.get_option_spot_timeseries( + start_date="2025-01-01", + end_date="2025-01-31", + strike=150.0, + expiration="2025-06-20", + right="C", + endpoint_source=OptionSpotEndpointSource.EOD + ) + ohlc = result.daily_option_spot # pd.DataFrame with [open, high, low, close] + +-------------------------------------------------------------------------------- +3.6 MarketTimeseries +-------------------------------------------------------------------------------- +Central market data repository with lazy loading and caching. + +SINGLETON: Yes (global instance) +CACHE: Multi-tier (memory + disk) +DATA SOURCE: OpenBB, ThetaData, YFinance + +KEY FEATURES: +- Loads all market data for a symbol on first request +- Maintains timeseries for: spot, chain_spot, dividends, rates +- Provides point-in-time snapshots (AtIndexResult) +- Handles corporate actions (splits, dividends) +- Thread-safe access + +TYPICAL USAGE: + from trade.datamanager.vars import TS # Global instance + TS.load("AAPL") # Lazy load on first access + data = TS.at_index("AAPL", "2025-01-15") + spot = data.spot # pd.Series with OHLCV + + +================================================================================ +4. DERIVED METRICS MANAGERS +================================================================================ + +-------------------------------------------------------------------------------- +4.1 VolDataManager +-------------------------------------------------------------------------------- +Computes implied volatilities from option market prices. + +SINGLETON: Yes (per symbol) +CACHE: 7-day expiration +MODELS: Black-Scholes-Merton (BSM), Cox-Ross-Rubinstein (CRR) + +KEY METHODS: + get_implied_volatility_timeseries(start, end, strike, expiration, right, + model, american, dividend_type, n_steps, ...) -> VolatilityResult + - Computes IV for each date in range + - BSM: Fast, European-style only + - BINOMIAL: CRR tree, supports American exercise + - EURO_EQIV: Converts American IV to European equivalent + + rt(strike, expiration, right, ...) -> float + - Real-time implied volatility + +TYPICAL USAGE: + vol_mgr = VolDataManager("AAPL") + result = vol_mgr.get_implied_volatility_timeseries( + start_date="2025-01-01", + end_date="2025-01-31", + strike=150.0, + expiration="2025-06-20", + right="c", + model=OptionPricingModel.BSM, + dividend_type=DivType.DISCRETE + ) + ivs = result.timeseries # pd.Series of implied vols + +-------------------------------------------------------------------------------- +4.2 GreekDataManager +-------------------------------------------------------------------------------- +Computes option sensitivities (delta, gamma, vega, theta, rho). + +SINGLETON: Yes (per symbol) +CACHE: 7-day expiration +MODELS: Black-Scholes (analytical), Binomial (numerical) + +KEY METHODS: + get_greeks_timeseries(start, end, strike, expiration, right, + greeks_to_compute, model, american, ...) -> GreekResultSet + - Computes specified greeks for each date + - greeks_to_compute: list of GreekType (optional, defaults to all) + - Returns DataFrame with columns for each greek + + rt(strike, expiration, right, ...) -> GreekResultSet + - Real-time greeks + +TYPICAL USAGE: + greek_mgr = GreekDataManager("AAPL") + result = greek_mgr.get_greeks_timeseries( + start_date="2025-01-01", + end_date="2025-01-31", + strike=150.0, + expiration="2025-06-20", + right="c", + greeks_to_compute=[GreekType.DELTA, GreekType.GAMMA] + ) + greeks = result.timeseries # pd.DataFrame with [delta, gamma, ...] + +-------------------------------------------------------------------------------- +4.3 Theoretical Pricing Functions +-------------------------------------------------------------------------------- +Module-level functions for option theoretical pricing and scenario analysis. + +KEY FUNCTIONS: + get_option_theoretical_price(symbol, start, end, strike, expiration, right, + market_model, dividend_type, american, ...) -> TheoreticalPriceResult + - Computes theoretical option prices using specified model + - Loads all required market data automatically + - Returns timeseries of prices + + calculate_scenarios(symbol, as_of, strike, expiration, right, + spot_scenarios, vol_scenarios, return_pnl, ...) -> ScenariosResult + - Runs scenario analysis (stress testing) + - spot_scenarios: list of spot multipliers (e.g., [0.9, 1.0, 1.1]) + - vol_scenarios: list of vol adjustments (e.g., [-0.05, 0.0, 0.05]) + - Returns grid of prices/PnL across scenarios + +TYPICAL USAGE: + from trade.datamanager.theo import get_option_theoretical_price, calculate_scenarios + + # Theoretical pricing + theo_result = get_option_theoretical_price( + symbol="AAPL", + start_date="2025-01-01", + end_date="2025-01-31", + strike=150.0, + expiration="2025-06-20", + right="c", + market_model=OptionPricingModel.BSM, + dividend_type=DivType.DISCRETE + ) + prices = theo_result.timeseries + + # Scenario analysis + scenarios = calculate_scenarios( + symbol="AAPL", + as_of="2025-01-15", + strike=150.0, + expiration="2025-06-20", + right="c", + spot_scenarios=[0.95, 1.0, 1.05], + vol_scenarios=[-0.05, 0.0, 0.05], + return_pnl=True + ) + grid = scenarios.grid # pd.DataFrame with spot x vol grid + + +================================================================================ +5. RESULT CONTAINERS +================================================================================ + +All managers return strongly-typed Result objects (dataclasses): + +Result (Base) + - model_input_keys: Dict of inputs used + - rt: bool flag for real-time data + - fallback_option: How to handle missing real-time data + +SpotResult + - timeseries: pd.Series (renamed to daily_spot via property) + - symbol: str + - undo_adjust: bool + +RatesResult + - timeseries: pd.Series (renamed to daily_risk_free_rates) + - key: cache key + +DividendsResult + - timeseries: pd.Series of Schedule objects or yields + - dividend_type: DivType (DISCRETE or CONTINUOUS) + - undo_adjust: bool + - Properties: daily_discrete_dividends, daily_continuous_dividends + +ForwardResult + - timeseries: pd.Series (renamed based on div_type) + - dividend_type: DivType + - dividend_result: DividendsResult used + - Properties: daily_discrete_forward, daily_continuous_forward + +OptionSpotResult + - timeseries: pd.DataFrame (renamed to daily_option_spot) + - strike, expiration, right, symbol + - endpoint_source: OptionSpotEndpointSource + +VolatilityResult + - timeseries: pd.Series of implied vols + - model: OptionPricingModel + - volatility_model: VolatilityModel + - strike, expiration, right, symbol + +GreekResultSet + - timeseries: pd.DataFrame with columns for each greek + - greeks_computed: List[GreekType] + - strike, expiration, right, symbol + + +================================================================================ +6. CONFIGURATION & ENUMS +================================================================================ + +-------------------------------------------------------------------------------- +OptionDataConfig (Singleton) +-------------------------------------------------------------------------------- +Global configuration for all datamanagers. + +KEY SETTINGS: + - option_spot_endpoint_source: EOD or QUOTE + - dividend_type: DISCRETE or CONTINUOUS + - option_model: BSM, BINOMIAL, EURO_EQIV + - volatility_model: MARKET or MODEL_DYNAMIC + - n_steps: int (binomial tree steps) + - undo_adjust: bool (use split-adjusted prices) + - model_price: MIDPOINT, BID, ASK, OPEN, CLOSE + - real_time_fallback_option: USE_LAST_AVAILABLE, RAISE_ERROR, ZEROED, NAN + +ACCESS: + from trade.datamanager.config import OptionDataConfig + config = OptionDataConfig() + config.n_steps = 200 # Modify globally + +-------------------------------------------------------------------------------- +Key Enumerations +-------------------------------------------------------------------------------- + +Interval: + - INTRADAY: historical intraday timestamp + - EOD: end-of-day daily snapshot + - NA: not applicable + +SeriesId: + - HIST: historical timeseries + - AT_TIME: single point-in-time + - SNAPSHOT: real-time snapshot + +ArtifactType: + - SPOT, CHAIN, RATES, DIVS, FWD, OPTION_SPOT + - IV, TVAR + - GREEKS, DELTA, GAMMA, VEGA, THETA, RHO, VOLGA, VANNA + +GreekType: + - DELTA, GAMMA, VEGA, THETA, RHO, VOLGA, VANNA + +OptionPricingModel: + - BSM: Black-Scholes-Merton (fast, European) + - BINOMIAL: CRR tree (slower, American) + - EURO_EQIV: European equivalent + +VolatilityModel: + - MARKET: implied from market prices + - MODEL_DYNAMIC: computed from model + +DivType (from optionlib): + - DISCRETE: schedule-based dividends + - CONTINUOUS: yield-based dividends + +ModelPrice: + - MIDPOINT, BID, ASK, OPEN, CLOSE + +OptionSpotEndpointSource: + - EOD: end-of-day report (available after 6pm ET) + - QUOTE: intraday quote endpoint + + +================================================================================ +7. CACHING SYSTEM +================================================================================ + +-------------------------------------------------------------------------------- +Cache Architecture +-------------------------------------------------------------------------------- + +THREE-TIER CACHING: +1. Memory Cache (CustomCache in-memory dict) + - Fastest access + - Per-manager instance + - Cleared on process exit + +2. Disk Cache (CustomCache pickle files) + - Persistent across sessions + - Configurable expiration (7-60 days typical) + - Per-manager, per-symbol + +3. Partial Cache Merging + - Detects missing dates in cache + - Fetches only missing data + - Merges with existing cache + - Reduces API calls + +-------------------------------------------------------------------------------- +CacheSpec Configuration +-------------------------------------------------------------------------------- +Controls cache behavior per manager: + +@dataclass(frozen=True, slots=True) +class CacheSpec: + base_dir: Optional[Path] = DM_GEN_PATH # Cache directory + default_expire_days: Optional[int] = 500 # Full cache expiration + default_expire_seconds: Optional[int] = None # Entry expiration + cache_fname: Optional[str] = None # Cache filename + clear_on_exit: bool = False # Auto-clear on exit + +USAGE: + Each manager defines class-level CACHE_SPEC: + CACHE_SPEC: CacheSpec = CacheSpec( + cache_fname="spot_data_manager", + default_expire_days=45 + ) + +-------------------------------------------------------------------------------- +Cache Keys +-------------------------------------------------------------------------------- +Constructed using construct_cache_key() utility: + +KEY COMPONENTS: + - symbol: underlying ticker + - artifact_type: ArtifactType enum + - series_id: SeriesId enum + - interval: Interval enum + - namespace: optional isolation + - Additional metadata (strike, expiration, model, etc.) + +EXAMPLE KEY: + "AAPL__hist__eod__spot__undo_True" + "AAPL__hist__eod__iv__K150.0_exp20250620_rc_model_bsm" + + +================================================================================ +8. DATE HANDLING +================================================================================ + +-------------------------------------------------------------------------------- +Date Conversion (CRITICAL) +-------------------------------------------------------------------------------- +ALWAYS use to_datetime from trade.helpers.helper: + +from trade.helpers.helper import to_datetime + +# Handles strings, datetime objects, and iterables +date_obj = to_datetime("2025-01-15") +dates = to_datetime(["2025-01-15", "2025-01-16"]) + +NEVER use: + - datetime.strptime() + - pd.to_datetime() directly + +-------------------------------------------------------------------------------- +Date Synchronization +-------------------------------------------------------------------------------- +Managers automatically synchronize dates with available data: + +- is_available_on_date(): Checks if data exists for date +- _sync_date(): Adjusts requested range to available range +- change_to_last_busday(): Converts to last business day +- get_missing_dates(): Identifies gaps in cache + +================================================================================ +9. TYPICAL WORKFLOWS +================================================================================ + +-------------------------------------------------------------------------------- +9.1 Backtesting Options Strategy +-------------------------------------------------------------------------------- +from trade.datamanager import ( + SpotDataManager, DividendDataManager, ForwardDataManager, + VolDataManager, GreekDataManager +) +from trade.optionlib.config.types import DivType +from trade.datamanager._enums import OptionPricingModel, GreekType + +symbol = "AAPL" +start, end = "2025-01-01", "2025-01-31" +strike, expiration, right = 150.0, "2025-06-20", "c" + +# 1. Load spot prices +spot_mgr = SpotDataManager(symbol) +spot_result = spot_mgr.get_spot_timeseries(start, end, undo_adjust=True) +spots = spot_result.daily_spot + +# 2. Get implied volatilities +vol_mgr = VolDataManager(symbol) +vol_result = vol_mgr.get_implied_volatility_timeseries( + start, end, strike, expiration, right, + model=OptionPricingModel.BSM, + dividend_type=DivType.DISCRETE +) +ivs = vol_result.timeseries + +# 3. Compute greeks +greek_mgr = GreekDataManager(symbol) +greek_result = greek_mgr.get_greeks_timeseries( + start, end, strike, expiration, right, + greeks_to_compute=[GreekType.DELTA, GreekType.GAMMA, GreekType.VEGA] +) +greeks = greek_result.timeseries # DataFrame with delta, gamma, vega + +# 4. Run scenarios for risk management +from trade.datamanager.theo import calculate_scenarios +scenarios = calculate_scenarios( + symbol=symbol, + as_of="2025-01-15", + strike=strike, + expiration=expiration, + right=right, + spot_scenarios=[0.95, 1.0, 1.05], + vol_scenarios=[-0.05, 0.0, 0.05] +) +print(scenarios.grid) + +-------------------------------------------------------------------------------- +9.2 Real-Time Option Monitoring +-------------------------------------------------------------------------------- +from trade.datamanager import VolDataManager, GreekDataManager + +symbol = "AAPL" +strike, expiration, right = 150.0, "2025-06-20", "c" + +# Get real-time IV +vol_mgr = VolDataManager(symbol) +current_iv = vol_mgr.rt(strike, expiration, right) + +# Get real-time greeks +greek_mgr = GreekDataManager(symbol) +greek_result = greek_mgr.rt(strike, expiration, right) +delta = greek_result.timeseries["delta"].iloc[0] +gamma = greek_result.timeseries["gamma"].iloc[0] + +print(f"IV: {current_iv:.4f}, Delta: {delta:.4f}, Gamma: {gamma:.6f}") + + +================================================================================ +10. BEST PRACTICES & GOTCHAS +================================================================================ + +DO: +✓ Use singleton managers - they cache internally +✓ Use to_datetime() for all date conversions +✓ Provide DividendsResult to ForwardDataManager to avoid re-fetching +✓ Use undo_adjust=True for backtesting (split-adjusted prices) +✓ Specify greeks_to_compute to reduce computation time +✓ Use model_price=MIDPOINT for fair value calculations +✓ Check result.is_empty() before using data +✓ Use rt() methods for real-time data +✓ Let managers handle data loading automatically + +DON'T: +✗ Create multiple instances of same symbol manager +✗ Use datetime.strptime() or pd.to_datetime() directly +✗ Mix undo_adjust=True/False in same calculation +✗ Ignore dividend_type when comparing prices +✗ Call _private_methods() directly +✗ Modify OptionDataConfig after initialization +✗ Assume cache is always warm - check for empty results +✗ Use BSM model for American options pricing + +COMMON ISSUES: +- "Data not available": Check date range with is_available_on_date() +- "Cache miss": Normal on first run, subsequent runs will hit cache +- "IV solver failed": Option may be deep ITM/OTM or have bad data +- "Mismatched undo_adjust": Ensure consistent split adjustment across managers + + +================================================================================ +11. UTILITY MODULES +================================================================================ + +utils/ + - model.py: Model data loading (_load_model_data_timeseries, LoadRequest) + - vol_helpers.py: Volatility calculation helpers + - greeks_helpers.py: Greek calculation helpers + - date.py: Date utilities (sync_date_index, is_available_on_date) + - cache.py: Cache utilities (_data_structure_cache_it) + - data_structure.py: Data structure validation + - logging.py: Logging configuration + - enums_utils.py: Cache key construction (construct_cache_key) + +market_data_helpers/ + - spot.py: Spot price loading from OpenBB + - Additional helper functions for data retrieval + + +================================================================================ +12. EXTENSION POINTS +================================================================================ + +To add a new manager: +1. Inherit from BaseDataManager +2. Define CACHE_NAME (unique string) +3. Define CACHE_SPEC (CacheSpec instance) +4. Define DEFAULT_SERIES_ID (SeriesId enum) +5. Implement __init__ with singleton pattern if needed +6. Add methods returning Result subclass +7. Use self.cache.get() / self.cache.set() for caching +8. Use construct_cache_key() for key generation + +Example skeleton: + class MyDataManager(BaseDataManager): + CACHE_NAME: str = "my_data_manager" + CACHE_SPEC: CacheSpec = CacheSpec(cache_fname=CACHE_NAME) + DEFAULT_SERIES_ID: SeriesId = SeriesId.HIST + + def __init__(self, symbol: str): + super().__init__(symbol=symbol) + self.symbol = symbol + + def get_my_data(self, start, end) -> MyResult: + key = construct_cache_key(...) + cached = self.cache.get(key) + if cached: + return cached + # Fetch data + result = MyResult(...) + self.cache.set(key, result) + return result + + +================================================================================ +END OF GUIDE +================================================================================ diff --git a/trade/datamanager/loaders.py b/trade/datamanager/loaders.py new file mode 100644 index 0000000..11fbeba --- /dev/null +++ b/trade/datamanager/loaders.py @@ -0,0 +1,222 @@ +"""Convenient loader functions for comprehensive option data retrieval. + +This module provides high-level loader functions that simplify fetching complete +option data packages including spot, forward, dividend, vol, greeks, and rates. +Functions handle parameter validation, date conversion, and coordinate data loading +across multiple DataManagers. + +Key Features: + - One-call option data loading (all dependencies included) + - Automatic parameter validation and date conversion + - Support for timeseries, single-date, and real-time modes + - Configurable pricing models and dividend treatments + - Returns unified ModelResultPack with all data components + +Typical Usage: + >>> from trade.datamanager.loaders import load_full_option_data + >>> from trade.datamanager._enums import DivType + >>> + >>> # Load historical option data with all dependencies + >>> pack = load_full_option_data( + ... symbol="AAPL", + ... strike=150.0, + ... expiration="2025-06-20", + ... right="call", + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... dividend_type=DivType.DISCRETE + ... ) + >>> + >>> # Access individual components + >>> greeks = pack.greek.timeseries + >>> vol = pack.vol.timeseries + >>> spot = pack.spot.timeseries + >>> + >>> # Real-time mode + >>> rt_pack = load_full_option_data( + ... symbol="AAPL", + ... strike=150.0, + ... expiration="2025-06-20", + ... right="call", + ... rt=True + ... ) +""" + +from typing import Optional +from trade.datamanager.result import DividendsResult, SpotResult +from trade.datamanager.utils.model import LoadRequest, _load_model_data_timeseries, ModelResultPack +from trade.datamanager.utils.date import DATE_HINT +from trade.datamanager._enums import ( + SeriesId, + OptionSpotEndpointSource, + VolatilityModel, + OptionPricingModel, + ModelPrice, + DivType, +) +from trade.helpers.helper import to_datetime +from trade.helpers.Logging import setup_logger +from trade.datamanager.utils.logging import get_logging_level, register_to_factor_list + +logger = setup_logger("trade.datamanager.loaders", stream_log_level=get_logging_level()) +register_to_factor_list("trade.datamanager.loaders") + + +def load_full_option_data( + symbol: str, + *, + expiration: DATE_HINT, + strike: float, + right: str, + start_date: DATE_HINT = None, + end_date: DATE_HINT = None, + as_of: DATE_HINT = None, + rt: bool = False, + ## Optional parameters. If not passed will refer to global defaults found in OptionConfig + series_id: SeriesId = None, + dividend_type: DivType = None, + endpoint_source: OptionSpotEndpointSource = None, + vol_model: VolatilityModel = None, + market_model: OptionPricingModel = None, + model_price: ModelPrice = None, + + ## Optional data for modelling. + spot_timeseries: Optional[SpotResult] = None, + dividend_timeseries: Optional[DividendsResult] = None, + forward_timeseries: Optional[SpotResult] = None, + option_spot_timeseries: Optional[SpotResult] = None, + vol_timeseries: Optional[SpotResult] = None, + greek_timeseries: Optional[SpotResult] = None, + rates_timeseries: Optional[SpotResult] = None, +) -> ModelResultPack: + """Load comprehensive option data including spot, forward, vol, greeks, and rates. + + Convenience function that loads all required data for option analysis in a single + call. Automatically handles data dependencies, caching, and model selection. Supports + three modes: timeseries (start/end dates), single date (as_of), and real-time (rt). + + Args: + symbol: Equity symbol (e.g., "AAPL", "MSFT") + expiration: Option expiration date (YYYY-MM-DD string or datetime) + strike: Option strike price + right: Option type - "call"/"c" or "put"/"p" + start_date: Start of timeseries range (YYYY-MM-DD string or datetime) + end_date: End of timeseries range (YYYY-MM-DD string or datetime) + as_of: Single date for historical snapshot (YYYY-MM-DD string or datetime) + rt: If True, load real-time data + series_id: Option series identifier (default from OptionConfig) + dividend_type: DivType.DISCRETE or DivType.CONTINUOUS (default from OptionConfig) + endpoint_source: Data source for option prices (default from OptionConfig) + vol_model: Volatility calculation model (default from OptionConfig) + market_model: Option pricing model (BSM, CRR, etc., default from OptionConfig) + model_price: Model price type (default from OptionConfig) + + Returns: + ModelResultPack containing: + - spot: SpotResult with underlying prices + - forward: ForwardResult with forward prices + - dividend: DividendsResult with dividend schedules + - rates: RatesResult with risk-free rates + - option_spot: OptionSpotResult with market option prices + - vol: VolatilityResult with implied volatilities + - greek: GreekResultSet with option sensitivities + + Raises: + ValueError: If mode specification is ambiguous (e.g., both start_date and as_of provided) + + Examples: + >>> # Historical timeseries + >>> pack = load_full_option_data( + ... symbol="AAPL", + ... strike=150.0, + ... expiration="2025-06-20", + ... right="call", + ... start_date="2025-01-01", + ... end_date="2025-01-31" + ... ) + >>> print(pack.greek.timeseries.delta.head()) + datetime + 2025-01-02 0.5234 + 2025-01-03 0.5301 + ... + + >>> # Single date snapshot + >>> pack = load_full_option_data( + ... symbol="AAPL", + ... strike=150.0, + ... expiration="2025-06-20", + ... right="call", + ... as_of="2025-01-15" + ... ) + >>> print(f"Vol on 2025-01-15: {pack.vol.as_of_value:.4f}") + + >>> # Real-time + >>> pack = load_full_option_data( + ... symbol="AAPL", + ... strike=150.0, + ... expiration="2025-06-20", + ... right="call", + ... rt=True + ... ) + >>> print(f"Current delta: {pack.greek.rt_value.delta:.4f}") + + Notes: + - Only one mode should be specified: (start_date, end_date), as_of, or rt + - All optional parameters default to values in OptionConfig + - Data is automatically cached for efficient repeated access + - Uses split-adjusted prices (undo_adjust=True) by default + """ + if start_date and end_date: + ts_start = to_datetime(start_date) + ts_end = to_datetime(end_date) + as_of = None + rt = False + + elif as_of: + ts_start = None + ts_end = None + as_of = to_datetime(as_of) + rt = False + + elif rt: + ts_start = None + ts_end = None + as_of = None + rt = True + + request = LoadRequest( + symbol=symbol, + start_date=ts_start, + end_date=ts_end, + as_of=as_of, + expiration=expiration, + strike=strike, + right=right, + series_id=series_id, + dividend_type=dividend_type, + endpoint_source=endpoint_source, + vol_model=vol_model, + market_model=market_model, + model_price=model_price, + load_spot=True, + load_dividend=True, + load_forward=True, + load_option_spot=True, + load_vol=True, + load_greek=True, + load_rates=True, + undo_adjust=True, + rt=rt, + + ## Provided data (if any) + spot_timeseries=spot_timeseries, + dividend_timeseries=dividend_timeseries, + forward_timeseries=forward_timeseries, + option_spot_timeseries=option_spot_timeseries, + vol_timeseries=vol_timeseries, + greek_timeseries=greek_timeseries, + rates_timeseries=rates_timeseries, + ) + + data_packet = _load_model_data_timeseries(request) + return data_packet diff --git a/trade/datamanager/market_data.py b/trade/datamanager/market_data.py new file mode 100644 index 0000000..eeb18a7 --- /dev/null +++ b/trade/datamanager/market_data.py @@ -0,0 +1,1302 @@ +"""Market Data Management and Timeseries Infrastructure. + +This module provides comprehensive market data loading, caching, and retrieval +infrastructure for options backtesting and live trading. It manages spot prices, +chain data, dividends, risk-free rates, and custom market indicators with +intelligent caching strategies for performance optimization. + +Core Classes: + MarketTimeseries: Main container for all market data with lazy loading + TimeseriesData: Structured holder for symbol-specific timeseries + AtIndexResult: Point-in-time snapshot of market data for a symbol + +Key Features: + - Multi-source data retrieval (OpenBB, ThetaData, YFinance) + - Hierarchical caching system (memory, disk, persistent) + - Automatic data refresh with configurable intervals + - Corporate action awareness (splits, dividends) + - Custom data integration via user-defined callables + - Thread-safe access with proper locking + - Signal handlers for cleanup on exit + +Data Types Managed: + Spot Prices (Equity OHLCV): + - Open, high, low, close prices + - Volume and trading activity + - Adjusted for splits and dividends + - Sourced from OpenBB/YFinance + + Chain Spot Prices: + - Underlying prices from option chain data + - Used for option pricing consistency + - May differ from equity spot due to timing + - Sourced from ThetaData + + Dividends: + - Regular dividend timeseries + - Special dividends with ex-dates + - Used for American option pricing + - Affects early exercise decisions + + Risk-Free Rates: + - Treasury yield curve (multiple tenors) + - Interpolated rates for option pricing + - Daily updates from Fed data + - Annualized rate convention + + Additional Data (Custom): + - User-defined indicators + - Market regime indicators + - Volatility surfaces + - Sentiment data + +Caching Architecture: + Three-Tier System: + 1. Memory Cache (Fastest): + - In-memory dictionaries + - No expiration during session + - Cleared on exit + + 2. Disk Cache (Fast): + - CustomCache with pickle serialization + - 30-minute to 45-day expiration + - Per-symbol and per-data-type + + 3. Persistent Cache: + - Long-term storage for historical data + - Survives process restarts + - Used for backtesting data + + Cache Keys: + - Spot: SPOT_CACHE (45-day expiration) + - Chain Spot: CHAIN_SPOT_CACHE (30-day expiration) + - Dividends: DIVIDEND_CACHE (60-day expiration) + +Data Retrieval Flow: + 1. Check memory cache → return if hit + 2. Check disk cache → populate memory if hit + 3. Query data source (OpenBB/ThetaData) + 4. Process and validate data + 5. Store in all cache levels + 6. Return to caller + +AtIndexResult Structure: + Point-in-time market data snapshot: + - sym: Ticker symbol + - date: Query date (pd.Timestamp) + - spot: OHLCV data (pd.Series) + - chain_spot: Chain-derived spot (pd.Series) + - rates: Risk-free rates (pd.Series) + - dividends: Dividend timeseries (pd.Series) + - additional: Custom data dict + +TimeseriesData Structure: + Complete timeseries for a symbol: + - spot: Full OHLCV DataFrame + - chain_spot: Full chain spot DataFrame + - dividends: Full dividend Series + - additional_data: Dict of custom Series/DataFrames + +MarketTimeseries Features: + Lazy Loading: + - Data loaded on first access + - Avoids memory bloat for unused symbols + - Transparent to caller + + Auto-Refresh: + - Configurable refresh interval (default 30 min) + - Checks last refresh timestamp + - Updates stale data automatically + - Disabled for historical backtests + + Property Protection: + - Direct property access raises UnaccessiblePropertyError + - Forces use of get_timeseries() or get_at_index() + - Prevents inconsistent data states + - Clear error messages guide users + + Signal Handling: + - Registers SIGTERM and SIGINT handlers + - Flushes caches on exit + - Prevents data corruption + - Ensures cleanup in all exit scenarios + +Usage: + # Initialize market timeseries + market_data = MarketTimeseries( + start='2024-01-01', + end='2024-12-31' + ) + + # Get full timeseries for a symbol + ts_data = market_data.get_timeseries( + sym='AAPL', + data_type='spot' + ) + + # Get point-in-time snapshot + snapshot = market_data.get_at_index( + sym='AAPL', + date=pd.Timestamp('2024-06-15') + ) + + # Add custom data + market_data.add_additional_data( + sym='AAPL', + name='custom_indicator', + data=custom_series, + callable_func=lambda df: process(df) + ) + +Integration: + - BacktestTimeseries extends this for backtest-specific needs + - RiskManager uses for all market data access + - OrderPicker queries for chain data + - Position analysis uses for Greek calculations + +Performance Considerations: + - Caching dramatically reduces API calls + - Memory usage grows with symbol count + - Refresh interval trades freshness for performance + - Disk cache speeds up repeated backtests + +Data Sources: + OpenBB: + - Primary source for spot prices + - Dividend data + - Wide symbol coverage + - Free tier available + + ThetaData: + - Option chain data + - Chain-derived spot prices + - High-quality historical data + - Requires subscription + + YFinance (Fallback): + - Backup for spot prices + - Free but rate-limited + - Used when OpenBB fails + +Error Handling: + - YFinanceEmptyData: Raised when no data available + - UnaccessiblePropertyError: Raised on direct property access + - Automatic fallback to alternative sources + - Logging of all data retrieval failures + +Notes: + - All dates handled as pandas Timestamps + - Business day calendar used for date arithmetic + - Data resampled to daily frequency + - Missing data handled via forward-fill + - Thread-safe via proper locking mechanisms +""" + +import numpy as np +from datetime import datetime, timedelta +from dataclasses import dataclass, field +from typing import Any, ClassVar, Dict, List, Literal, Optional +import pandas as pd +from pandas.tseries.offsets import BDay +from dbase.DataAPI.ThetaData import resample # noqa +from trade.helpers.helper import retrieve_timeseries, ny_now, CustomCache, YFinanceEmptyData, to_datetime +from trade.helpers.Logging import setup_logger +from trade.assets.rates import get_risk_free_rate_helper +from EventDriven._vars import OPTION_TIMESERIES_START_DATE, load_riskmanager_cache +from EventDriven.exceptions import UnaccessiblePropertyError +from trade.datamanager.utils.cache import ( + _cache_it_timeseries_data_structure, + _data_structure_cache_check_missing, + _CachedData, # noqa + _extract_data, # noqa + _simple_extract_from_cache # noqa +) +from trade import SIGNALS_TO_RUN + + +logger = setup_logger("trade.datamanager.market_data", stream_log_level="INFO") + +## TODO: This var is from optionlib. Once ready, import from there. +## TODO: Implement interval handling to have multiple intervals + +OPTIMESERIES: Optional["MarketTimeseries"] = None +DIVIDEND_CACHE: CustomCache = load_riskmanager_cache(target="dividend_timeseries") +SPOT_CACHE: CustomCache = load_riskmanager_cache(target="spot_timeseries") +CHAIN_SPOT_CACHE: CustomCache = load_riskmanager_cache(target="chain_spot_timeseries") +SPLIT_FACTOR_CACHE: CustomCache = load_riskmanager_cache( + target="split_factor_timeseries", create_on_missing=True, clear_on_exit=False +) + + +@dataclass +class AtIndexResult: + """Point-in-time market data snapshot for a symbol at a specific date. + + Container for all market data retrieved at a single date/timestamp. Used for + accessing complete market state at a specific point in time for pricing, risk + analysis, or strategy decisions. + + Attributes: + sym: Equity ticker symbol (e.g., "AAPL", "MSFT"). + date: Query date as pd.Timestamp. + spot: OHLCV data series with keys ['open', 'high', 'low', 'close', 'volume']. + chain_spot: Chain-derived spot series (split-adjusted from ThetaData). + rates: Risk-free rate series (currently np.nan, reserved for future use). + dividends: Dividend amount paid on this date (0 if no dividend). + dividend_yield: Calculated yield (dividend / spot close price). + split_factor: Cumulative split adjustment factor (1.0 = no adjustment). + additional: Dictionary of custom/additional data computed for this date. + + Examples: + >>> mts = MarketTimeseries() + >>> result = mts.get_at_index("AAPL", "2025-06-15") + >>> print(f"Close: ${result.spot['close']:.2f}") + >>> print(f"Dividend: ${result.dividends:.2f}") + >>> print(f"Split Factor: {result.split_factor}") + >>> if result.dividends > 0: + ... print(f"Ex-dividend date with yield: {result.dividend_yield:.2%}") + """ + + sym: str + date: pd.Timestamp + spot: pd.Series + chain_spot: pd.Series + rates: pd.Series + dividends: int | float + dividend_yield: int | float + split_factor: float | int + additional: Dict[str, Any] = field(default_factory=dict) + + def __repr__(self) -> str: + return f"AtIndexResult(sym={self.sym}, date={self.date})" + + +@dataclass +class TimeseriesData: + """Complete timeseries data container for a specific symbol. + + Holds all market data types for a symbol as full timeseries (DataFrames or Series). + Returned by MarketTimeseries.get_timeseries() with requested factors populated and + non-requested factors set to None. Used for bulk analysis, backtesting, and + vectorized calculations. + + Attributes: + spot: OHLCV DataFrame with columns ['open', 'high', 'low', 'close', 'volume'] + and DatetimeIndex. None if not requested. + chain_spot: Chain-derived spot DataFrame (split-adjusted) with same structure + as spot plus 'split_factor' column. None if not requested. + dividends: Daily dividend amounts as Series with DatetimeIndex. Values are 0 + on non-dividend dates. None if not requested. + dividend_yield: Calculated yield series (dividends / spot close). None if not + requested or cannot be calculated. + split_factor: Cumulative split adjustment factors as Series with DatetimeIndex. + None if not requested. + rates: Risk-free rate series (annualized). None if not requested. + additional_data: Dictionary mapping custom data names to their Series/DataFrames. + Empty dict if no additional data. + + Examples: + >>> mts = MarketTimeseries() + >>> # Get all data + >>> ts_data = mts.get_timeseries("AAPL") + >>> print(ts_data.spot.head()) + >>> print(f"Total dividends: ${ts_data.dividends.sum():.2f}") + + >>> # Get specific factor only + >>> spot_only = mts.get_timeseries("AAPL", factor="spot") + >>> assert spot_only.dividends is None # Not requested + >>> print(spot_only.spot['close'].mean()) + + >>> # Work with additional custom data + >>> custom = mts.get_timeseries("AAPL", factor="additional", + ... additional_data_name="sma_20") + >>> print(custom.additional_data['sma_20'].tail()) + """ + + spot: pd.DataFrame + chain_spot: pd.DataFrame + dividends: pd.Series + dividend_yield: pd.Series + split_factor: pd.Series + rates: Optional[pd.Series] = None + additional_data: Dict[str, pd.Series] = field(default_factory=dict) + + def __repr__(self) -> str: + return f"TimeseriesData(spot={self.spot is not None}, chain_spot={self.chain_spot is not None}, dividends={self.dividends is not None}, additional_data_keys={list(self.additional_data.keys())})" + + +@dataclass +class MarketTimeseries: + """Comprehensive market data manager with multi-tier caching and lazy loading. + + Central hub for retrieving equity market data (spot prices, dividends, splits, rates) + with intelligent caching at memory and disk levels. Implements lazy loading to minimize + memory footprint and API calls. Prevents direct property access to ensure consistent + data retrieval patterns. + + Architecture: + - Three-tier caching: memory (instant), disk (fast), source (slow) + - Lazy loading: data loaded only when accessed + - Partial cache support: loads missing date ranges incrementally + - Property protection: forces use of get_timeseries() or get_at_index() + - Custom data support: user-defined transformations via callables + + Data Sources: + - Spot prices: OpenBB/YFinance (equity OHLCV) + - Chain spot: ThetaData (option chain underlying prices) + - Dividends: OpenBB (regular and special dividends) + - Rates: Federal Reserve (treasury yield curve) + + Attributes: + additional_data: Dict of custom computed data {name: {symbol: Series}}. + rates: DataFrame of risk-free rates with annualized yields. + DEFAULT_NAMES: Class constant listing standard data types. + _refresh_delta: Time interval for auto-refresh (None = disabled). + _last_refresh: Timestamp of last data refresh. + _start: Default start date for data retrieval (YYYY-MM-DD). + _end: Default end date for data retrieval (YYYY-MM-DD). + _today: Current date string (YYYY-MM-DD). + should_refresh: Enable/disable auto-refresh behavior. + + Protected Properties: + spot, chain_spot, dividends, split_factor: Direct access raises + UnaccessiblePropertyError. Use get_timeseries() or get_at_index() instead. + + Cache Management: + Uses module-level CustomCache instances: + - SPOT_CACHE: 45-day expiration + - CHAIN_SPOT_CACHE: 30-day expiration + - DIVIDEND_CACHE: 60-day expiration + - SPLIT_FACTOR_CACHE: Persistent (no expiration) + + Examples: + >>> # Initialize with custom date range + >>> mts = MarketTimeseries( + ... _start="2025-01-01", + ... _end="2025-12-31" + ... ) + + >>> # Get complete timeseries for a symbol + >>> ts_data = mts.get_timeseries("AAPL") + >>> print(ts_data.spot['close'].mean()) + + >>> # Get point-in-time snapshot + >>> snapshot = mts.get_at_index("AAPL", "2025-06-15") + >>> print(f"Close: ${snapshot.spot['close']:.2f}") + + >>> # Add custom indicator + >>> mts.calculate_additional_data( + ... factor="spot", + ... sym="AAPL", + ... additional_data_name="sma_50", + ... _callable=lambda s: s.rolling(50).mean(), + ... column="close" + ... ) + + >>> # Preload data for multiple symbols + >>> for sym in ["AAPL", "MSFT", "GOOGL"]: + ... mts.load_timeseries(sym) + + >>> # Clear all caches + >>> MarketTimeseries.clear_caches() + + Integration: + Used by: + - RiskManager for all market data access + - BacktestTimeseries for historical simulations + - OrderPicker for option chain data + - Position analysis for Greek calculations + + Thread Safety: + Cache operations are thread-safe via CustomCache locking mechanisms. + Multiple readers can access cached data concurrently. + """ + + additional_data: Dict[str, Any] = field(default_factory=dict) + rates: pd.DataFrame = field(default_factory=get_risk_free_rate_helper) + DEFAULT_NAMES: ClassVar[List[str]] = ["spot", "chain_spot", "dividends", "split_factor", "dividend_yield"] + _refresh_delta: Optional[timedelta] = timedelta(minutes=30) + _last_refresh: Optional[datetime] = field(default_factory=ny_now) + _start: str = OPTION_TIMESERIES_START_DATE + _end: str = (datetime.now() - BDay(1)).strftime("%Y-%m-%d") + _today: str = datetime.now().strftime("%Y-%m-%d") + should_refresh: bool = True + + @property + def spot(self) -> dict: + raise UnaccessiblePropertyError( + "The 'spot' property is not accessible directly. Use 'get_timeseries' method instead. Or access via 'get_at_index' method." + ) + + @property + def split_factor(self) -> dict: + raise UnaccessiblePropertyError( + "The 'split_factor' property is not accessible directly. Use 'get_timeseries' method instead. Or access via 'get_at_index' method." + ) + + @property + def chain_spot(self) -> dict: + raise UnaccessiblePropertyError( + "The 'chain_spot' property is not accessible directly. Use 'get_timeseries' method instead. Or access via 'get_at_index' method." + ) + + @property + def dividends(self) -> dict: + raise UnaccessiblePropertyError( + "The 'dividends' property is not accessible directly. Use 'get_timeseries' method instead. Or access via 'get_at_index' method." + ) + + @property + def _spot(self) -> CustomCache: + return SPOT_CACHE + + @property + def _chain_spot(self) -> CustomCache: + return CHAIN_SPOT_CACHE + + @property + def _dividends(self) -> CustomCache: + return DIVIDEND_CACHE + + @property + def _split_factor(self) -> CustomCache: + return SPLIT_FACTOR_CACHE + + @classmethod + def clear_caches(cls) -> None: + """Clear all caches used by MarketTimeseries. + + Removes all cached data from spot, chain_spot, dividend, and split_factor caches. + Useful for forcing fresh data retrieval or reducing memory usage. + + Examples: + >>> MarketTimeseries.clear_caches() + >>> # All caches cleared, next data access will reload from source + """ + SPOT_CACHE.clear() + CHAIN_SPOT_CACHE.clear() + DIVIDEND_CACHE.clear() + SPLIT_FACTOR_CACHE.clear() + logger.info("All MarketTimeseries caches have been cleared.") + + def _load_spot_into_cache(self, sym: str, start: str, end: str) -> pd.DataFrame | None: + """Load spot OHLCV data for a symbol into the cache. + + Retrieves equity spot prices from data source (OpenBB/YFinance) and stores in + the spot cache with intelligent merge logic for existing data. Handles missing + data gracefully with warning logging. + + Args: + sym: Stock ticker symbol (e.g., "AAPL", "MSFT"). + start: Start date string (YYYY-MM-DD format). + end: End date string (YYYY-MM-DD format). + + Examples: + >>> mts = MarketTimeseries() + >>> mts._load_spot_into_cache("AAPL", "2025-01-01", "2025-01-31") + >>> # Spot data now cached and available for retrieval + """ + + try: + spot_data = retrieve_timeseries( + tick=sym, + start=start, + end=end, + ) + _cache_it_timeseries_data_structure( + existing=self._spot.get(sym), + key=sym, + value=spot_data, + expire=None, + cache=self._spot, + ) + logger.info("Loaded spot data for symbol %s into cache.", sym) + return spot_data + except YFinanceEmptyData: + logger.warning("No spot data found for symbol %s from data source. Will skip caching.", sym) + return None + + def _load_chain_spot_into_cache(self, sym: str, start: str, end: str) -> pd.DataFrame | None: + """Load chain-derived spot data for a symbol into the cache. + + Retrieves underlying prices from option chain data (ThetaData) and stores in + the chain_spot cache. Chain spot is split-adjusted and may differ from equity + spot due to timing. Used for consistent option pricing. + + Args: + sym: Stock ticker symbol (e.g., "AAPL", "MSFT"). + start: Start date string (YYYY-MM-DD format). + end: End date string (YYYY-MM-DD format). + + Examples: + >>> mts = MarketTimeseries() + >>> mts._load_chain_spot_into_cache("AAPL", "2025-01-01", "2025-01-31") + >>> # Chain spot data now cached with split adjustments + """ + try: + chain_spot_data = retrieve_timeseries( + tick=sym, + start=start, + end=end, + spot_type="chain_spot", + ) + _cache_it_timeseries_data_structure( + existing=self._chain_spot.get(sym), + key=sym, + value=chain_spot_data, + expire=None, + cache=self._chain_spot, + ) + logger.info("Loaded chain spot data for symbol %s into cache.", sym) + return chain_spot_data + except YFinanceEmptyData: + logger.warning("No chain spot data found for symbol %s from data source. Will skip caching.", sym) + return None + + def _load_dividends_into_cache(self, sym: str, start: str = None, end: str = None) -> pd.DataFrame | None: + """Load daily dividend timeseries for a symbol into the cache. + + Retrieves regular and special dividends with ex-dates from data source and stores + in the dividends cache. Used for American option pricing and forward calculations. + Defaults to instance start/end dates if not provided. + + Args: + sym: Stock ticker symbol (e.g., "AAPL", "MSFT"). + start: Optional start date string (YYYY-MM-DD). Defaults to self._start. + end: Optional end date string (YYYY-MM-DD). Defaults to self._end. + + Examples: + >>> mts = MarketTimeseries() + >>> mts._load_dividends_into_cache("AAPL") + >>> # Loads dividends for instance's full date range + >>> mts._load_dividends_into_cache("MSFT", "2025-01-01", "2025-06-30") + >>> # Loads dividends for specific date range + """ + from trade.datamanager.market_data_helpers.dividends import get_daily_dividends_timeseries + + try: + divs = get_daily_dividends_timeseries(sym, start=start or self._start, end=end or self._end) + _cache_it_timeseries_data_structure( + existing=self._dividends.get(sym), + key=sym, + value=divs, + expire=None, + cache=self._dividends, + skip_today_check=True, # Dividends don't change intraday, so skip today check + ) + logger.info("Loaded dividend data for symbol %s into cache.", sym) + return divs + except YFinanceEmptyData: + logger.warning("No dividend data found for symbol %s from data source. Will skip caching.", sym) + return None + + def _load_split_factor_into_cache(self, sym: str, start: str, *args, **kwargs) -> pd.DataFrame | None: + """Load split factor timeseries for a symbol into the cache. + + Extracts split factors from chain spot data and stores in the split_factor cache. + Split factors are cumulative multipliers for historical price adjustment. Skips + today check since splits don't change intraday. + + Args: + sym: Stock ticker symbol (e.g., "AAPL", "MSFT"). + start: Start date string (YYYY-MM-DD format). End date uses instance _end. + + Examples: + >>> mts = MarketTimeseries() + >>> mts._load_split_factor_into_cache("AAPL", "2025-01-01") + >>> # Split factors loaded from chain spot data + """ + try: + chain_spot = self._load_chain_spot_into_cache(sym, start, self._end) + chain_spot = _extract_data(chain_spot) + # if isinstance(chain_spot, _CachedData) or chain_spot.__class__.__name__ == "_CachedData": + # chain_spot = chain_spot.data + + split_factor = chain_spot["split_factor"] + _cache_it_timeseries_data_structure( + existing=self._split_factor.get(sym), + key=sym, + value=split_factor, + expire=None, + cache=self._split_factor, + ## Cutting out today check as split factors don't change intraday + skip_today_check=True, + ) + logger.info("Loaded split factor data for symbol %s into cache.", sym) + return split_factor + except YFinanceEmptyData: + logger.warning("No split factor data found for symbol %s from data source. Will skip caching.", sym) + return None + + def _clip_to_date_range( + self, df: pd.DataFrame | pd.Series, start: str, end: str, *args, **kwargs + ) -> pd.DataFrame | pd.Series: + """Clip a DataFrame or Series to the specified date range. + + Filters timeseries data to only include dates within [start, end] inclusive. + Uses date objects for comparison to handle datetime vs date mismatches. + + Args: + df: DataFrame or Series with DatetimeIndex to filter. + start: Start date string (YYYY-MM-DD format). + end: End date string (YYYY-MM-DD format). + + Returns: + Filtered DataFrame or Series with only dates in range. + + Examples: + >>> mts = MarketTimeseries() + >>> spot_full = mts._get_spot_timeseries("AAPL") + >>> spot_q1 = mts._clip_to_date_range(spot_full, "2025-01-01", "2025-03-31") + >>> # Returns only Q1 2025 data + """ + df = _extract_data(df) # Unwrap from _CachedData if needed + # if isinstance(df, _CachedData) or df.__class__.__name__ == "_CachedData": + # df = df.data + clipped = df[(df.index.date >= to_datetime(start).date()) & (df.index.date <= to_datetime(end).date())] + return clipped + + def _get_spot_timeseries(self, sym: str, start: str = None, end: str = None, *args, **kwargs) -> pd.DataFrame: + """Retrieve spot OHLCV timeseries for a symbol with automatic cache management. + + Checks cache for existing data, loads from source if missing, and handles partial + cache hits by loading only missing dates. Automatically clips to requested range. + + Args: + sym: Stock ticker symbol (e.g., "AAPL", "MSFT"). + start: Optional start date string (YYYY-MM-DD). Defaults to self._start. + end: Optional end date string (YYYY-MM-DD). Defaults to self._end. + **kwargs: Additional arguments (currently unused, for extensibility). + + Returns: + DataFrame with OHLCV columns (open, high, low, close, volume) and DatetimeIndex. + + Examples: + >>> mts = MarketTimeseries() + >>> spot = mts._get_spot_timeseries("AAPL", "2025-01-01", "2025-01-31") + >>> print(spot.columns) # ['open', 'high', 'low', 'close', 'volume'] + """ + start = start or self._start + end = end or self._end + cached_data = self._spot.get(sym) + if cached_data is None: + cached_data = self._load_spot_into_cache(sym, start, end) + + cached_data, is_partial, missing_start_date, missing_end_date = _data_structure_cache_check_missing( + cached_data=cached_data, + key=sym, + start_dt=start, + end_dt=end, + ) + if is_partial: + data = self._load_spot_into_cache( + sym, missing_start_date.strftime("%Y-%m-%d"), missing_end_date.strftime("%Y-%m-%d") + ) + cached_data = pd.concat([cached_data, data]).sort_index() + + return self._clip_to_date_range(cached_data, start, end) + + def _get_chain_spot_timeseries(self, sym: str, start: str = None, end: str = None, *args, **kwargs) -> pd.DataFrame: + """Retrieve chain-derived spot timeseries for a symbol with automatic cache management. + + Checks cache for existing chain spot data, loads from ThetaData if missing, and + handles partial cache hits. Chain spot is split-adjusted and used for option pricing. + + Args: + sym: Stock ticker symbol (e.g., "AAPL", "MSFT"). + start: Optional start date string (YYYY-MM-DD). Defaults to self._start. + end: Optional end date string (YYYY-MM-DD). Defaults to self._end. + **kwargs: Additional arguments (currently unused, for extensibility). + + Returns: + DataFrame with chain spot columns including split_factor and DatetimeIndex. + + Examples: + >>> mts = MarketTimeseries() + >>> chain_spot = mts._get_chain_spot_timeseries("AAPL", "2025-01-01", "2025-01-31") + >>> print(chain_spot['split_factor']) # Cumulative split adjustments + """ + + start = start or self._start + end = end or self._end + cached_data = self._chain_spot.get(sym) + if cached_data is None: + cached_data = self._load_chain_spot_into_cache(sym, start, end) + cached_data, is_partial, missing_start_date, missing_end_date = _data_structure_cache_check_missing( + cached_data=cached_data, + key=sym, + start_dt=start, + end_dt=end, + ) + if is_partial: + data = self._load_chain_spot_into_cache( + sym, missing_start_date.strftime("%Y-%m-%d"), missing_end_date.strftime("%Y-%m-%d") + ) + cached_data = pd.concat([cached_data, data]).sort_index() + + return self._clip_to_date_range(cached_data, start, end) + + def _get_dividends_timeseries(self, sym: str, start: str = None, end: str = None, *args, **kwargs) -> pd.Series: + """Retrieve daily dividend timeseries for a symbol with automatic cache management. + + Checks cache for existing dividend data, loads from source if missing, and handles + partial cache hits. Returns daily dividend amounts with ex-dates as index. + + Args: + sym: Stock ticker symbol (e.g., "AAPL", "MSFT"). + start: Optional start date string (YYYY-MM-DD). Defaults to self._start. + end: Optional end date string (YYYY-MM-DD). Defaults to self._end. + **kwargs: Additional arguments (currently unused, for extensibility). + + Returns: + Series with dividend amounts and DatetimeIndex of ex-dates. + + Examples: + >>> mts = MarketTimeseries() + >>> divs = mts._get_dividends_timeseries("AAPL", "2025-01-01", "2025-12-31") + >>> print(divs[divs > 0]) # Show only dividend payment dates + """ + if start is None: + start = self._start + if end is None: + end = self._end + cached_data = self._dividends.get(sym) + if cached_data is None: + cached_data = self._load_dividends_into_cache(sym, start, end) + cached_data, is_partial, missing_start_date, missing_end_date = _data_structure_cache_check_missing( + cached_data=cached_data, + key=sym, + start_dt=start, + end_dt=end, + ) + if is_partial: + data = self._load_dividends_into_cache( + sym, missing_start_date.strftime("%Y-%m-%d"), missing_end_date.strftime("%Y-%m-%d") + ) + cached_data = pd.concat([cached_data, data]).sort_index() + + return self._clip_to_date_range(cached_data, start, end, *args, **kwargs) + + def _get_split_factor_timeseries(self, sym: str, start: str = None, end: str = None, *args, **kwargs) -> pd.Series: + """Retrieve split factor timeseries for a symbol with automatic cache management. + + Checks cache for existing split factor data, extracts from chain spot if missing, + and handles partial cache hits. Split factors are cumulative multipliers for + historical price adjustment. + + Args: + sym: Stock ticker symbol (e.g., "AAPL", "MSFT"). + start: Optional start date string (YYYY-MM-DD). Defaults to self._start. + end: Optional end date string (YYYY-MM-DD). Defaults to self._end. + **kwargs: Additional arguments (currently unused, for extensibility). + + Returns: + Series with cumulative split factors and DatetimeIndex. + + Examples: + >>> mts = MarketTimeseries() + >>> splits = mts._get_split_factor_timeseries("AAPL", "2025-01-01", "2025-12-31") + >>> print(splits[splits != 1.0]) # Show dates with splits + """ + + ## Decide dates + start = start or self._start + end = end or self._end + cached_data = self._split_factor.get(sym) + + ## If no data, load from chain spot and extract split factor + if cached_data is None: + cached_data = self._load_split_factor_into_cache(sym, start) + + ## No need to access data from _CachedData yet + ## Data structure checks this data + cached_data, is_partial, missing_start_date, missing_end_date = _data_structure_cache_check_missing( + cached_data=cached_data, + key=sym, + start_dt=start, + end_dt=self._end, + ) + if is_partial: + self._load_split_factor_into_cache( + sym, missing_start_date.strftime("%Y-%m-%d"), end=missing_end_date.strftime("%Y-%m-%d") + ) + cached_data = self._split_factor.get(sym) + + ## If it is _CachedData, get the data out of it for the next steps + cached_data = _extract_data(cached_data) + # if isinstance(cached_data, _CachedData): + # cached_data = cached_data.data + + return self._clip_to_date_range(cached_data, start, end, *args, **kwargs) + + def _get_dividend_yield_timeseries(self, sym: str, *args, **kwargs) -> pd.Series: + """Calculate and retrieve dividend yield timeseries for a symbol. + + Computes daily dividend yield by dividing dividend amounts by spot close prices. + Automatically retrieves spot and dividend data from cache or loads if needed. + + Args: + sym: Stock ticker symbol (e.g., "AAPL", "MSFT"). + **kwargs: Additional arguments (currently unused, for extensibility). + + Returns: + Series with dividend yields (as decimals, not percentages) and DatetimeIndex. + + Examples: + >>> mts = MarketTimeseries() + >>> yield_ts = mts._get_dividend_yield_timeseries("AAPL") + >>> print(yield_ts.mean() * 100) # Average yield as percentage + """ + spot = self._get_spot_timeseries(sym) + dividends = self._get_dividends_timeseries(sym) + + dividend_yield = dividends / spot["close"] + # Fill non-dividend dates with 0 yield. I believe it should be fine + # TODO: Pay close attention to this. Maybe find an alternative way to handle non-dividend dates if it causes issues. + dividend_yield.fillna(0.0, inplace=True) + + return self._clip_to_date_range(dividend_yield, self._start, self._end, *args, **kwargs) + + def get_split_factor_at_index(self, sym: str, index: pd.Timestamp, *args, **kwargs) -> float | int: + """Retrieve the split factor for a symbol at a specific date with forward-fill logic. + + Returns the cumulative split factor at the requested date. If the exact date is not + in the series, returns the most recent prior split factor (forward-fill). Returns + 1.0 if no data exists or the date precedes all split data. + + Args: + sym: Stock ticker symbol (e.g., "AAPL", "MSFT"). + index: Date for split factor lookup (pd.Timestamp or date string). + + Returns: + Cumulative split factor at the specified date (1.0 = no adjustment). + + Examples: + >>> mts = MarketTimeseries() + >>> factor = mts.get_split_factor_at_index("AAPL", "2025-06-15") + >>> print(f"Split factor: {factor}") + >>> # Returns 1.0 if no splits, or adjustment factor if splits occurred + """ + split_factor_series = self._split_factor.get(sym) + if split_factor_series is None: + return 1.0 + + split_factor_series = _extract_data(split_factor_series) + # if isinstance(split_factor_series, _CachedData) or split_factor_series.__class__.__name__ == "_CachedData": + # split_factor_series = split_factor_series.data + + index = pd.to_datetime(index) + if index in split_factor_series.index: + return split_factor_series.loc[index] + else: + prior_dates = split_factor_series.index[split_factor_series.index <= index] + if not prior_dates.empty: + nearest_date = prior_dates.max() + return split_factor_series.loc[nearest_date] + else: + return 1.0 + + def get_at_index(self, sym: str, index: pd.Timestamp, *args, **kwargs) -> AtIndexResult: + """Retrieve point-in-time market data snapshot for a symbol at a specific date. + + Returns a complete snapshot of market data (spot, chain_spot, dividends, rates, + split_factor, dividend_yield) for a single date. Ensures all necessary data is + loaded before retrieval. + + Args: + sym: Stock ticker symbol (e.g., "AAPL", "MSFT"). + index: Date for data snapshot (pd.Timestamp or date string YYYY-MM-DD). + interval: Time interval (currently only "1d" supported). + + Returns: + AtIndexResult containing spot (Series), chain_spot (Series), dividends (float), + rates (float), dividend_yield (float), split_factor (float), and metadata. + + Examples: + >>> mts = MarketTimeseries() + >>> snapshot = mts.get_at_index("AAPL", "2025-06-15") + >>> print(snapshot.spot['close']) # Closing price + >>> print(snapshot.dividends) # Dividend amount on this date + >>> print(snapshot.split_factor) # Cumulative split adjustment + """ + + ## Ensure data is loaded for the symbol + sym = sym.upper() + index = to_datetime(index, format="%Y-%m-%d") + spot = self._get_spot_timeseries(sym, start=index, end=index) + chain_spot = self._get_chain_spot_timeseries(sym, start=index, end=index) + dividends = self._get_dividends_timeseries(sym, start=index, end=index) + split_factor = self._get_split_factor_timeseries(sym, start=index) + + ## Retrieve data at index + index_str = index.strftime("%Y-%m-%d") + spot = spot.loc[index_str] if index_str in spot.index else None + chain_spot = chain_spot.loc[index_str] if index_str in chain_spot.index else None + dividends = dividends.loc[index_str] if index_str in dividends.index else 0.0 + rates = np.nan + dividend_yield = dividends / spot["close"] if spot is not None and dividends is not None else None + split_factor = split_factor.loc[index_str] if index_str in split_factor.index else 1.0 + + return AtIndexResult( + spot=spot, + chain_spot=chain_spot, + dividends=dividends, + sym=sym, + date=index_str, + rates=rates, + dividend_yield=dividend_yield, + split_factor=split_factor, + ) + + def calculate_additional_data( + self, + factor: Literal["spot", "chain_spot", "dividends", "split_factor"], + sym: str, + additional_data_name: str, + _callable: Any, + column: Optional[str] = "close", + force_add: bool = False, + *args, + **kwargs, + ) -> None: + """Load additional data for a factor using a custom transformation function. + + Applies a user-defined callable to existing market data to create custom indicators + or derived timeseries. The callable receives a pd.Series and must return a pd.Series. + Results are stored in the additional_data dictionary for later retrieval. + + Storage Schema: + additional_data = {additional_data_name: {sym: pd.Series}} + + Args: + factor: Base data type to transform ('spot', 'chain_spot', 'dividends', 'split_factor'). + sym: Stock ticker symbol (e.g., "AAPL", "MSFT"). + additional_data_name: Identifier for storing the computed data. + _callable: Function that takes pd.Series and returns pd.Series. + column: Column to extract from DataFrame factors (e.g., 'close', 'volume'). + force_add: If True, overwrites existing data for this name and symbol. + + Raises: + ValueError: If factor not recognized. + ValueError: If symbol data not found for the specified factor. + ValueError: If column not found in factor DataFrame. + + Examples: + >>> mts = MarketTimeseries() + >>> # Calculate 20-day moving average of close prices + >>> mts.calculate_additional_data( + ... factor="spot", + ... sym="AAPL", + ... additional_data_name="sma_20", + ... _callable=lambda s: s.rolling(20).mean(), + ... column="close" + ... ) + >>> # Calculate RSI from dividends + >>> mts.calculate_additional_data( + ... factor="dividends", + ... sym="MSFT", + ... additional_data_name="div_rsi", + ... _callable=lambda s: compute_rsi(s, period=14) + ... ) + """ + + ## Raise error if factor not recognized + if factor not in self.DEFAULT_NAMES: + raise ValueError(f"Factor {factor} not recognized. Must be one of ['spot', 'chain_spot', 'dividends'].") + + ## Get the data for the specified factor and symbol + factor_data = getattr(self, factor).get(sym) + + ## Raise error if symbol not found + if factor_data is None: + raise ValueError(f"No data found for factor {factor} and symbol {sym}.") + + ## If column specified, ensure it exists in the DataFrame + if column and isinstance(factor_data, (pd.DataFrame, pd.Series)): + if column not in factor_data.columns: + raise ValueError(f"Column {column} not found in data for factor {factor} and symbol {sym}.") + factor_data = factor_data[column] + + ## Process the data using the provided callable + processed_data = _callable(factor_data) + if additional_data_name not in self.additional_data: + self.additional_data[additional_data_name] = {} + + ## Check if data already exists and force_add is not set + exists = sym in self.additional_data.get(additional_data_name, {}) + if exists and not force_add: + logger.info( + "Additional data for %s and symbol %s already exists. Use force_add=True to overwrite.", + additional_data_name, + sym, + ) + return + + self.additional_data[additional_data_name][sym] = processed_data + + def get_timeseries( + self, + sym: str, + factor: Literal["spot", "chain_spot", "dividends", "split_factor", "additional"] = None, + additional_data_name: Optional[str] = None, + start_date: str | datetime = None, + end_date: str | datetime = None, + *args, + **kwargs, + ) -> TimeseriesData: + """Retrieve timeseries data for a symbol with optional factor and date filtering. + + Main method for accessing market data. Can return specific factors (spot, chain_spot, + dividends, split_factor), additional custom data, or all factors combined. Automatically + handles caching, data loading, and date range filtering. + + Args: + sym: Stock ticker symbol (e.g., "AAPL", "MSFT"). + factor: Data type to retrieve. If None, returns all factors. + additional_data_name: Required when factor='additional'. Identifies custom data. + start_date: Optional start date for filtering (YYYY-MM-DD string or datetime). + end_date: Optional end date for filtering (YYYY-MM-DD string or datetime). + + Returns: + TimeseriesData containing requested data. Non-requested fields are None. + + Raises: + ValueError: If factor not recognized. + ValueError: If factor='additional' but additional_data_name not provided. + ValueError: If additional_data_name not found in cached additional data. + ValueError: If no data found for requested factor and symbol. + + Examples: + >>> mts = MarketTimeseries() + >>> # Get all data for a symbol + >>> all_data = mts.get_timeseries("AAPL") + >>> print(all_data.spot.head()) + >>> print(all_data.dividends.sum()) + + >>> # Get specific factor with date range + >>> spot_q1 = mts.get_timeseries( + ... "AAPL", + ... factor="spot", + ... start_date="2025-01-01", + ... end_date="2025-03-31" + ... ) + + >>> # Get custom additional data + >>> sma_data = mts.get_timeseries( + ... "AAPL", + ... factor="additional", + ... additional_data_name="sma_20" + ... ) + + >>> # Calculate dividend yield on the fly + >>> yield_data = mts.get_timeseries("MSFT", factor="dividend_yield") + """ + + data_funcs = { + "spot": self._get_spot_timeseries, + "chain_spot": self._get_chain_spot_timeseries, + "dividends": self._get_dividends_timeseries, + "split_factor": self._get_split_factor_timeseries, + "dividend_yield": self._get_dividend_yield_timeseries, + } + sym = sym.upper() + end_date = end_date or self._end + + if factor not in self.DEFAULT_NAMES + ["additional", None]: + raise ValueError(f"Factor {factor} not recognized. Must be one of {self.DEFAULT_NAMES + ['additional']}.") + if factor == "additional": + if additional_data_name is None: + raise ValueError("additional_data_name must be provided when factor is 'additional'.") + data = self.additional_data.get(additional_data_name, {}).get(sym) + if data is None: + raise ValueError(f"No additional data found for name {additional_data_name} and symbol {sym}.") + return TimeseriesData( + spot=None, + chain_spot=None, + dividends=None, + additional_data={additional_data_name: data}, + split_factor=None, + dividend_yield=None, + ) + + elif factor in self.DEFAULT_NAMES: + ## Retrieve data for the specified factor + data = None + if factor in ["spot", "chain_spot", "dividends", "split_factor"]: + data = data_funcs[factor](sym, start=start_date, end=end_date) + + ## Special handling for dividend_yield + elif factor == "dividend_yield": + divs = self._get_dividends_timeseries(sym, start=start_date, end=end_date) + spot = self._get_spot_timeseries(sym, start=start_date, end=end_date) + + ## Ensure we have both dividends and spot data + if divs is None: + raise ValueError(f"No dividend data found for symbol {sym} to calculate dividend yield.") + if spot is None: + raise ValueError(f"No spot data found for symbol {sym} to calculate dividend yield.") + + ## Calculate dividend yield + dividend_yield = divs / spot["close"] + data = dividend_yield + + ## Filter data by start_date and end_date if provided + if start_date is not None or end_date is not None: + start_date = pd.to_datetime(start_date).strftime("%Y-%m-%d") if start_date is not None else None + end_date = pd.to_datetime(end_date).strftime("%Y-%m-%d") if end_date is not None else None + + if start_date is not None: + data = data[data.index >= start_date] + if end_date is not None: + data = data[data.index <= end_date] + + ## Construct TimeseriesData based on the factor + if data is None: + raise ValueError(f"No data found for factor {factor} and symbol {sym}.") + if factor == "spot": + ts = TimeseriesData(spot=data, chain_spot=None, dividends=None, dividend_yield=None, split_factor=None) + elif factor == "chain_spot": + ts = TimeseriesData(spot=None, chain_spot=data, dividends=None, dividend_yield=None, split_factor=None) + elif factor == "dividends": + ts = TimeseriesData(spot=None, chain_spot=None, dividends=data, dividend_yield=None, split_factor=None) + elif factor == "dividend_yield": + ts = TimeseriesData(spot=None, chain_spot=None, dividends=None, dividend_yield=data, split_factor=None) + elif factor == "split_factor": + ts = TimeseriesData(spot=None, chain_spot=None, dividends=None, split_factor=data, dividend_yield=None) + else: + raise ValueError(f"Unhandled factor {factor}.") + + ## If no factor specified, return all data + elif factor is None: + spot = self._get_spot_timeseries(sym, start=start_date, end=end_date) + chain_spot = self._get_chain_spot_timeseries(sym, start=start_date, end=end_date) + dividends = self._get_dividends_timeseries(sym, start=start_date, end=end_date) + dividend_yield = dividends / spot["close"] if spot is not None and dividends is not None else None + split_factor = self._get_split_factor_timeseries(sym, start=start_date, end=end_date) + + ## Filter data by start_date and end_date if provided + if start_date is not None or end_date is not None: + start_date = pd.to_datetime(start_date).strftime("%Y-%m-%d") if start_date is not None else None + end_date = pd.to_datetime(end_date).strftime("%Y-%m-%d") if end_date is not None else None + + ## Start date filter + if start_date is not None: + spot = spot[spot.index >= start_date] + chain_spot = chain_spot[chain_spot.index >= start_date] + dividends = dividends[dividends.index >= start_date] + dividend_yield = dividend_yield[dividend_yield.index >= start_date] + split_factor = split_factor[split_factor.index >= start_date] + + ## End date filter + if end_date is not None: + spot = spot[spot.index <= end_date] + chain_spot = chain_spot[chain_spot.index <= end_date] + dividends = dividends[dividends.index <= end_date] + dividend_yield = dividend_yield[dividend_yield.index <= end_date] + split_factor = split_factor[split_factor.index <= end_date] + + ## Construct TimeseriesData with all data + ts = TimeseriesData( + spot=spot, + chain_spot=chain_spot, + dividends=dividends, + dividend_yield=dividend_yield, + split_factor=split_factor, + rates=self.rates["annualized"], + ) + + return ts + + def load_timeseries(self, sym: str, start_date: str = None, end_date: str = None, *args, **kwargs) -> None: + """Preload all market data timeseries for a symbol into cache. + + Eagerly loads spot, chain_spot, dividends, and split_factor data into their + respective caches. Useful for warming cache before intensive operations or + reducing latency for first access. Uses instance date range if not specified. + + Args: + sym: Stock ticker symbol (e.g., "AAPL", "MSFT"). + start_date: Optional start date string (YYYY-MM-DD). Defaults to self._start. + end_date: Optional end date string (YYYY-MM-DD). Defaults to self._end. + + Examples: + >>> mts = MarketTimeseries() + >>> # Preload full date range for a symbol + >>> mts.load_timeseries("AAPL") + >>> # Now all subsequent access for AAPL will be instant + + >>> # Preload specific date range + >>> mts.load_timeseries("MSFT", "2025-01-01", "2025-12-31") + + >>> # Batch preload multiple symbols + >>> for sym in ["AAPL", "MSFT", "GOOGL"]: + ... mts.load_timeseries(sym) + """ + sym = sym.upper() + start_date = start_date or self._start + end_date = end_date or self._end + self._load_spot_into_cache(sym, start_date, end_date) + self._load_chain_spot_into_cache(sym, start_date, end_date) + self._load_dividends_into_cache(sym, start_date, end_date) + self._load_split_factor_into_cache(sym, start_date, end_date) + + def __repr__(self) -> str: + return f"MarketTimeseries(symbols: {list(self._spot.keys())}, intervals: {list(self._spot.keys())})" + + +def get_timeseries_obj(live: bool = False, *args, **kwargs) -> MarketTimeseries: + """Get or create the singleton MarketTimeseries instance. + + Returns the global OPTIMESERIES instance, creating it if necessary. Implements + singleton pattern to ensure only one MarketTimeseries exists per session, sharing + caches across all callers for optimal performance. + + Args: + live: If True, sets end date to today. If False, sets to last business day. + + Returns: + Global MarketTimeseries singleton instance. + + Examples: + >>> # Get singleton instance for backtesting (end = yesterday) + >>> mts = get_timeseries_obj(live=False) + >>> data = mts.get_timeseries("AAPL") + + >>> # Get singleton for live trading (end = today) + >>> mts_live = get_timeseries_obj(live=True) + >>> # Same instance if called again + >>> assert get_timeseries_obj() is mts_live + """ + global OPTIMESERIES + if OPTIMESERIES is None: + OPTIMESERIES = MarketTimeseries( + _end=(datetime.now() - BDay(1)).strftime("%Y-%m-%d") if not live else datetime.now().strftime("%Y-%m-%d") + ) + + return OPTIMESERIES + + +def reset_timeseries_obj(*args, **kwargs) -> None: + """Reset the singleton MarketTimeseries instance to None. + + Clears the global OPTIMESERIES variable, forcing the next call to + get_timeseries_obj() to create a fresh instance. Useful for testing or + when switching between live and backtest modes. Does not clear caches. + + Examples: + >>> mts = get_timeseries_obj(live=False) + >>> # ... use mts ... + >>> reset_timeseries_obj() # Clear singleton + >>> mts_live = get_timeseries_obj(live=True) # New instance + >>> assert mts is not mts_live + """ + global OPTIMESERIES + OPTIMESERIES = None + + +if __name__ == "__main__": + mts = get_timeseries_obj() + mts.load_timeseries("BA", force=True) + ts = mts.get_timeseries("BA") + print(ts) + print(SIGNALS_TO_RUN) diff --git a/trade/datamanager/market_data_helpers/dividends.py b/trade/datamanager/market_data_helpers/dividends.py new file mode 100644 index 0000000..a8d1584 --- /dev/null +++ b/trade/datamanager/market_data_helpers/dividends.py @@ -0,0 +1,131 @@ +from datetime import datetime, timedelta +from openbb import obb +import pandas as pd +from trade.optionlib.config.defaults import ( + OPTION_TIMESERIES_START_DATE, # noqa +) +from trade.helpers.Logging import setup_logger +from trade.helpers.helper import CustomCache +from dataclasses import dataclass +from trade.datamanager.vars import DM_GEN_PATH +from trade.optionlib.assets.dividend import infer_frequency, FREQ_MAP +from trade.datamanager.utils.logging import get_logging_level, register_to_factor_list +from trade.datamanager.config import OptionDataConfig +logger = setup_logger("trade.datamanager.market_data_helpers.dividends", stream_log_level=get_logging_level()) +register_to_factor_list("trade.datamanager.market_data_helpers.dividends") + + +@dataclass +class SavedDividendsResult: + symbol: str + historicals: pd.Series + resampled_timeseries: pd.Series + last_updated: datetime + + +## Cache has to be in memory. Incase dividends update on another date +DIVIDEND_CACHE = CustomCache( + location=DM_GEN_PATH, fname="discrete_dividends_timeseries", clear_on_exit=False, expire_days=365 +) +def resample_dividends_to_daily(div_series: pd.Series, buffer: int = 30) -> pd.Series: + """Resample dividend series to daily frequency with forward fill.""" + + freq = infer_frequency(div_series) + if freq is None: + raise ValueError("Could not infer frequency.") + freq_days = FREQ_MAP[freq] * 30 # Approximate to days + freq_days += buffer + + ## First, resample to 1b (daily business days) + resampled = div_series.resample("1b").ffill() + + ## Next, the resampled is clearly missing last dividends to today or end_date, + ## SO we will forward fill the last known dividend to today. But with some rules. + ## There are cases where dividends were discontinued, so we will only forward fill if the last known dividend date - today is less than freq_days + ## If not we fill with zeros + last_div_date = div_series.dropna().index[-1] + today = datetime.now() + days_since_last_div = (today - last_div_date).days + + ## Add additional days to ffill into + resampled = resampled.reindex(pd.date_range(start=resampled.index[0], end=today, freq="1b")) + if days_since_last_div <= freq_days: + resampled = resampled.ffill() + else: + logger.info("Filling with zeros as dividends seem to be discontinued.") + resampled.loc[last_div_date + timedelta(days=1) : today] = 0.0 + resampled.index = pd.to_datetime(resampled.index, format="%Y-%m-%d") + resampled.name = "dividend_amount" + resampled.index.name = "datetime" + resampled.sort_index(inplace=True) + return resampled + +def get_div_schedule(ticker: str): + """ + Fetch the dividend schedule for a given ticker. + If the ticker is not in the cache, it fetches the data from yfinance and caches it. + If the ticker is in the cache, it retrieves the data from the cache. + If filter_specials is True, it filters out dividends >= 7.5. + Returns a DataFrame with the dividend schedule. + """ + + ## We're going to use a multi-level dividend retrieval. CustomCache is on disk cache + ## 1. We first check if the symbol is in the on disk DIVIDEND_CACHE + ## 2. If not, we fetch from yfinance via openbb and store in DIVIDEND_CACHE and save with last_updated + ## 3. If in cache, we retrieve from cache, but still check last_updated. + ## We will use a weekly update policy to refresh dividends + ## 4. Return the dividend schedule DataFrame + + # Check if ticker is in cache + filter_specials = OptionDataConfig().filter_out_special_dividends + key = (ticker, filter_specials) + if key not in DIVIDEND_CACHE: + try: + div_history = obb.equity.fundamental.dividends(symbol=ticker, provider="yfinance").to_df() + div_history.set_index("ex_dividend_date", inplace=True) + div_history["amount"] = div_history["amount"].astype(float) + div_history.index = pd.to_datetime(div_history.index) + dividends_data = SavedDividendsResult( + symbol=ticker, + historicals=div_history["amount"], + resampled_timeseries=None, + last_updated=datetime.now(), + ) + except Exception as e: # noqa + div_history = pd.DataFrame( + {"amount": [0]}, index=pd.bdate_range(start="2001-01-01", end=datetime.now(), freq="1Q") + ) + dividends_data = SavedDividendsResult( + symbol=ticker, + historicals=div_history["amount"], + resampled_timeseries=None, + last_updated=datetime.now(), + ) + DIVIDEND_CACHE[key] = dividends_data + + else: + logger.info(f"Ticker {ticker} found in dividend cache.") + dividends_data: SavedDividendsResult = DIVIDEND_CACHE[key] + # Check if we need to refresh (if last_updated > 7 days) + if (datetime.now() - dividends_data.last_updated).days > 7: + del DIVIDEND_CACHE[key] + return get_div_schedule(ticker) + + # Filter out dividends >= 7.5 + if filter_specials: + dividends_data.historicals = dividends_data.historicals[dividends_data.historicals < 7.5] + + return dividends_data.historicals.sort_index() + +def get_daily_dividends_timeseries(ticker, start, end): + """ + Get daily resampled dividend timeseries for a given ticker between start and end dates. + This function retrieves the dividend schedule, resamples it to daily frequency, and filters it to the specified date range. + Returns a pd.Series with daily dividend amounts. + """ + + # Else we fallthrough to refetching the schedule + div_series = get_div_schedule(ticker) + daily_div_series = resample_dividends_to_daily(div_series) + daily_div_series = daily_div_series[start:end] + return daily_div_series diff --git a/trade/datamanager/notebooks/create.ipynb b/trade/datamanager/notebooks/create.ipynb deleted file mode 100644 index e1b5b7b..0000000 --- a/trade/datamanager/notebooks/create.ipynb +++ /dev/null @@ -1,1125 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 217, - "id": "79ddd501", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The autoreload extension is already loaded. To reload it, use:\n", - " %reload_ext autoreload\n" - ] - } - ], - "source": [ - "%load_ext autoreload\n", - "%autoreload 2\n", - "from pathlib import Path\n", - "from trade.helpers.helper import CustomCache\n", - "from trade.helpers.helper_types import SingletonMetaClass\n", - "from trade.optionlib.config.defaults import DIVIDEND_LOOKBACK_YEARS, DIVIDEND_FORECAST_METHOD\n", - "from trade.optionlib.config.types import DiscreteDivGrowthModel, DivType\n", - "from trade.optionlib.assets.dividend import (\n", - " get_vectorized_dividend_scehdule,\n", - " vector_convert_to_time_frac,\n", - " vectorized_discrete_pv,\n", - " get_vectorized_dividend_rate,\n", - " get_vectorized_continuous_dividends,\n", - " get_vectorized_dividend_rate,\n", - " get_div_histories,\n", - " _dual_project_dividends,\n", - " ScheduleEntry\n", - ")\n", - "import os\n", - "from EventDriven.riskmanager.market_data import MarketTimeseries\n", - "import pandas as pd\n", - "from typing import Optional, Dict, Union, List\n", - "from typing import overload, Literal\n", - "DM_GEN_PATH = Path(os.getenv(\"GEN_CACHE_PATH\")) / \"dm_gen_cache\"\n", - "TS = MarketTimeseries()" - ] - }, - { - "cell_type": "code", - "execution_count": 213, - "id": "ec207715", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2016-12-30 NaN\n", - "2017-01-02 NaN\n", - "2017-01-03 0.005323\n", - "2017-01-04 0.005329\n", - "2017-01-05 0.005302\n", - " ... \n", - "2025-12-31 0.000956\n", - "2026-01-01 NaN\n", - "2026-01-02 0.000959\n", - "2026-01-05 0.000973\n", - "2026-01-06 0.000991\n", - "Length: 2353, dtype: float64" - ] - }, - "execution_count": 213, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 215, - "id": "ff5684eb", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'sym': 'AAPL',\n", - " 'date': '2023-01-03',\n", - " 'spot': open 128.34378\n", - " high 128.954561\n", - " low 122.324586\n", - " close 123.211212\n", - " volume 112117500\n", - " chain_price 123.211212\n", - " unadjusted_close 492.844849\n", - " split_ratio 1.0\n", - " cum_split 4.0\n", - " split_factor 1.0\n", - " max_cum_split 4.0\n", - " is_split_date False\n", - " Name: 2023-01-03 00:00:00, dtype: object,\n", - " 'chain_spot': open 128.34378\n", - " high 128.954561\n", - " low 122.324586\n", - " close 123.211212\n", - " volume 112117500\n", - " chain_price 123.211212\n", - " unadjusted_close 27599.311523\n", - " split_ratio 1.0\n", - " cum_split 224.0\n", - " split_factor 1.0\n", - " max_cum_split 224.0\n", - " is_split_date False\n", - " cum_split_from_start 4.0\n", - " Name: 2023-01-03 00:00:00, dtype: object,\n", - " 'rates': daily 0.004559\n", - " annualized 0.0426\n", - " name ^IRX\n", - " description 13 WEEK TREASURY BILL\n", - " Name: 2023-01-03 00:00:00, dtype: object,\n", - " 'dividends': np.float64(0.23),\n", - " 'dividend_yield': np.float64(0.0018667132314604627),\n", - " 'additional': {}}" - ] - }, - "execution_count": 215, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "TS.get_at_index(\"AAPL\", \"2023-01-03\").__dict__" - ] - }, - { - "cell_type": "code", - "execution_count": 78, - "id": "2107f515", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'aapl': amount\n", - " ex_dividend_date \n", - " 1987-05-11 0.000536\n", - " 1987-08-10 0.000536\n", - " 1987-11-17 0.000714\n", - " 1988-02-12 0.000714\n", - " 1988-05-16 0.000714\n", - " ... ...\n", - " 2024-11-08 0.250000\n", - " 2025-02-10 0.250000\n", - " 2025-05-12 0.260000\n", - " 2025-08-11 0.260000\n", - " 2025-11-10 0.260000\n", - " \n", - " [89 rows x 1 columns]}" - ] - }, - "execution_count": 78, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "hist = get_div_histories([\"aapl\"])\n", - "hist" - ] - }, - { - "cell_type": "code", - "execution_count": 145, - "id": "627126c5", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[autoreload of trade.optionlib.assets.dividend failed: Traceback (most recent call last):\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/IPython/extensions/autoreload.py\", line 276, in check\n", - " superreload(m, reload, self.old_objects)\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/IPython/extensions/autoreload.py\", line 500, in superreload\n", - " update_generic(old_obj, new_obj)\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/IPython/extensions/autoreload.py\", line 397, in update_generic\n", - " update(a, b)\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/IPython/extensions/autoreload.py\", line 365, in update_class\n", - " update_instances(old, new)\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/IPython/extensions/autoreload.py\", line 323, in update_instances\n", - " object.__setattr__(ref, \"__class__\", new)\n", - "TypeError: __class__ assignment: 'ScheduleEntry' object layout differs from 'ScheduleEntry'\n", - "]\n" - ] - }, - { - "data": { - "text/plain": [ - "([], [], Timestamp('2026-11-11 00:00:00'))" - ] - }, - "execution_count": 145, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "_dual_project_dividends(\n", - " valuation_date=\"2026-11-11\",\n", - " end_date=\"2026-12-31\",\n", - " div_history=hist['aapl'],\n", - " inferred_growth_rate=0.10\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 57, - "id": "813023d4", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[(datetime.date(2024, 2, 9), 0.24), (datetime.date(2024, 5, 10), 0.25), (datetime.date(2024, 8, 12), 0.25), (datetime.date(2024, 11, 8), 0.25), (datetime.date(2025, 2, 10), 0.25), (datetime.date(2025, 5, 12), 0.26), (datetime.date(2025, 8, 11), 0.26), (datetime.date(2025, 11, 10), 0.26), (datetime.date(2026, 2, 10), np.float64(0.26)), (datetime.date(2026, 5, 10), np.float64(0.26285714285714284)), (datetime.date(2026, 8, 10), np.float64(0.26574568288854006)), (datetime.date(2026, 11, 10), np.float64(0.26866596511808444))]\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[autoreload of trade.optionlib.assets.dividend failed: Traceback (most recent call last):\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/IPython/extensions/autoreload.py\", line 276, in check\n", - " superreload(m, reload, self.old_objects)\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/IPython/extensions/autoreload.py\", line 500, in superreload\n", - " update_generic(old_obj, new_obj)\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/IPython/extensions/autoreload.py\", line 397, in update_generic\n", - " update(a, b)\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/IPython/extensions/autoreload.py\", line 365, in update_class\n", - " update_instances(old, new)\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/IPython/extensions/autoreload.py\", line 323, in update_instances\n", - " object.__setattr__(ref, \"__class__\", new)\n", - "TypeError: __class__ assignment: 'ScheduleEntry' object layout differs from 'ScheduleEntry'\n", - "]\n" - ] - }, - { - "data": { - "text/plain": [ - "[,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ]" - ] - }, - "execution_count": 57, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "div_schedule = get_vectorized_dividend_scehdule(\n", - " tickers = [\"AAPL\"],\n", - " end_dates = [\"2026-12-31\"],\n", - " start_dates=[\"2024-01-01\"],\n", - " method=DiscreteDivGrowthModel.CONSTANT_AVG.value,\n", - ")\n", - "\n", - "div_schedule[0].schedule" - ] - }, - { - "cell_type": "code", - "execution_count": 208, - "id": "0524b12c", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[0;31mSignature:\u001b[0m\n", - "\u001b[0mget_vectorized_dividend_rate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mtickers\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mUnion\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mspots\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mfloat\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mvaluation_dates\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mfloat\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mDocstring:\u001b[0m\n", - "Get the vectorized dividend rate for a list of tickers based on their historical dividend data.\n", - "\n", - "tickers: str or List[str] - Ticker symbols of the stocks.\n", - "spots: List[float] - Current spot prices for each ticker.\n", - "valuation_dates: List[datetime] - Dates for which to calculate the dividend rates.\n", - "\n", - "Returns a numpy array of dividend rates.\n", - "\u001b[0;31mFile:\u001b[0m ~/cloned_repos/QuantTools/trade/optionlib/assets/dividend.py\n", - "\u001b[0;31mType:\u001b[0m function" - ] - } - ], - "source": [ - "get_vectorized_dividend_rate(\n", - " t\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "cada1f96", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[]" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "frac = vector_convert_to_time_frac(schedules=div_schedule, valuation_dates=[\"2024-01-01\"], end_dates=[\"2026-12-31\"])\n", - "# pv = vectorized_discrete_pv(\n", - "# schedules=div_schedule,\n", - "# r = [0.05] * len(div_schedule),\n", - "# _valuation_dates=[\"2024-01-01\"],\n", - "# _end_dates=[\"2026-12-31\"]\n", - "# )\n", - "# pv\n", - "\n", - "frac" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "2fe3aca7", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[(0.10677618069815195, 0.24),\n", - " (0.35592060232717315, 0.25),\n", - " (0.6132785763175906, 0.25),\n", - " (0.8542094455852156, 0.25),\n", - " (1.111567419575633, 0.25),\n", - " (1.3607118412046544, 0.26),\n", - " (1.6098562628336757, 0.26),\n", - " (1.8590006844626967, 0.26),\n", - " (2.11088295687885, np.float64(0.26)),\n", - " (2.3545516769336072, np.float64(0.26285714285714284)),\n", - " (2.6064339493497606, np.float64(0.26574568288854006)),\n", - " (2.858316221765914, np.float64(0.26866596511808444))]" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "frac[0].schedule" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "87eb5648", - "metadata": {}, - "outputs": [], - "source": [ - "## Cache Key construction\n", - "from dataclasses import dataclass\n", - "from datetime import datetime, date, time, timezone\n", - "from enum import Enum\n", - "from hashlib import sha1\n", - "from typing import Any, Dict, Mapping, Optional, Tuple\n", - "\n", - "\n", - "class Interval(str, Enum):\n", - " INTRADAY = \"intraday\" # historical intraday timestamp\n", - " EOD = \"eod\" # end-of-day daily snapshot\n", - " NA = \"na\" # not applicable\n", - "\n", - "class SeriesId(str, Enum):\n", - " HIST = \"hist\"\n", - " AT_TIME = \"at_time\"\n", - " SNAPSHOT = \"snapshot\"" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "8f6e98be", - "metadata": {}, - "outputs": [], - "source": [ - "class ArtifactType(str, Enum):\n", - " # Market / inputs\n", - " SPOT = \"spot\"\n", - " CHAIN = \"chain\"\n", - " RATES = \"rates\"\n", - " DIVS = \"divs\"\n", - " FWD = \"forward\"\n", - "\n", - " # Volatility\n", - " IV = \"iv\"\n", - " TVAR = \"tvar\"\n", - "\n", - " # Greeks\n", - " GREEKS = \"greeks\"\n", - " DELTA = \"delta\"\n", - " GAMMA = \"gamma\"\n", - " VEGA = \"vega\"\n", - " THETA = \"theta\"\n", - " VOMMA = \"vomma\"\n", - " VANNA = \"vanna\"\n", - "\n", - "\n", - "def _norm_str(x: str) -> str:\n", - " return x.strip().upper()\n", - "\n", - "def _safe_part(x: Optional[str]) -> str:\n", - " return x if x not in (None, \"\", \"None\") else \"-\"" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "b3d6d001", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "symbol:AAPL|interval:eod|artifact_type:iv|series_id:hist|date:20240101|model:SABR\n" - ] - } - ], - "source": [ - "def _format_value(v: Any) -> str:\n", - " \"\"\"\n", - " Keep it simple + deterministic.\n", - " \"\"\"\n", - " if v is None:\n", - " return \"-\"\n", - " if isinstance(v, Enum):\n", - " return str(v.value)\n", - " if isinstance(v, str):\n", - " return _norm_str(v)\n", - " if isinstance(v, bool):\n", - " return \"1\" if v else \"0\"\n", - " if isinstance(v, (int,)):\n", - " return str(v)\n", - " if isinstance(v, float):\n", - " # avoid 0.30000000000004 style keys\n", - " return f\"{v:.12g}\"\n", - " if isinstance(v, datetime):\n", - " # stable, compact. (no tz handling by design here)\n", - " return v.strftime(\"%Y%m%dT%H%M%S\")\n", - " if isinstance(v, date):\n", - " return v.strftime(\"%Y%m%d\")\n", - " \n", - " if isinstance(v, time):\n", - " return v.strftime(\"%H%M%S\")\n", - " return str(v)\n", - "\n", - "\n", - "def construct_cache_key(\n", - " symbol: str,\n", - " interval: Optional[Interval],\n", - " artifact_type: ArtifactType,\n", - " series_id: SeriesId,\n", - " **extra_parts: Any,\n", - ") -> str:\n", - " \n", - " if series_id in (SeriesId.AT_TIME, SeriesId.SNAPSHOT):\n", - " assert 'time' in extra_parts, \"time must be provided for at_time or snapshot series_id\"\n", - " assert 'date' in extra_parts, \"date must be provided for at_time or snapshot series_id\"\n", - " assert isinstance(extra_parts['time'], time), \"time must be a time object\"\n", - " assert isinstance(extra_parts['date'], date), \"date must be a date object\"\n", - "\n", - "\n", - " parts = [\n", - " f\"symbol:{_norm_str(symbol)}\",\n", - " f\"interval:{_format_value(interval)}\",\n", - " f\"artifact_type:{artifact_type.value}\",\n", - " f\"series_id:{series_id.value}\"\n", - " ]\n", - "\n", - " for k in sorted(extra_parts.keys()):\n", - " parts.append(f\"{k}:{_format_value(extra_parts[k])}\")\n", - "\n", - " return \"|\".join(parts)\n", - "\n", - "\n", - "k = construct_cache_key(\n", - " \"AAPL\",\n", - " Interval.EOD,\n", - " ArtifactType.IV,\n", - " SeriesId.HIST,\n", - " date=date(2024, 1, 1),\n", - " model=\"SABR\",\n", - ")\n", - "print(k)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "9a81a0f1", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'symbol': 'AAPL', 'interval': 'eod', 'artifact_type': 'iv', 'series_id': 'hist', 'date': '20240101', 'model': 'SABR'}\n" - ] - } - ], - "source": [ - "def _parse_cache_key(key: str) -> Dict[str, str]:\n", - " parts = key.split(\"|\")\n", - " result = {}\n", - " for part in parts:\n", - " k, v = part.split(\":\", 1)\n", - " result[k] = v\n", - " return result\n", - "\n", - "print(_parse_cache_key(k))" - ] - }, - { - "cell_type": "markdown", - "id": "4b1d9ec5", - "metadata": {}, - "source": [ - "## Building DataManagers\n" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "38f19bc8", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "('/Users/chiemelienwanisobi/cloned_repos/QuantTools/.cache/dm_gen_cache',\n", - " PosixPath('/Users/chiemelienwanisobi/cloned_repos/QuantTools/.cache/dm_gen_cache'))" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "DM_GEN_PATH.as_posix(), DM_GEN_PATH" - ] - }, - { - "cell_type": "code", - "execution_count": 165, - "id": "608cffd6", - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "\n", - "from abc import ABC\n", - "from dataclasses import dataclass\n", - "from typing import Any, Callable, ClassVar, Dict, Optional, Type, TypeVar\n", - "\n", - "# Assumes you already have these (from your cache_key module)\n", - "# from cache_key import construct_cache_key, Interval, ArtifactType, SeriesId\n", - "\n", - "T = TypeVar(\"T\")\n", - "\n", - "\n", - "@dataclass(frozen=True, slots=True)\n", - "class CacheSpec:\n", - " \"\"\"\n", - " Optional: a small config object you can pass around, so all managers\n", - " initialize their caches in a consistent way.\n", - "\n", - " If you already have a cache registry/factory, you may not need this.\n", - "\n", - " args:\n", - " base_dir (Optional[Path]): Directory for cache storage.\n", - " default_expire_days (Optional[int]): Default expiration time in days. This is how many days till the entire cache entry expires.\n", - " default_expire_seconds (Optional[int]): Default expiration time in seconds. This is how many seconds till a single cache entry expires.\n", - " cache_fname (Optional[str]): Foldername for the cache storage.\n", - " clear_on_exit (bool): If True, clears the cache on exit.\n", - " \"\"\"\n", - "\n", - " base_dir: Optional[Path] = DM_GEN_PATH.as_posix()\n", - " default_expire_days: Optional[int] = 500\n", - " default_expire_seconds: Optional[int] = None\n", - " cache_fname: Optional[str] = None\n", - " clear_on_exit: bool = False\n", - "\n", - "\n", - "class BaseDataManager(ABC):\n", - " \"\"\"\n", - " Foundation class for all DataManagers.\n", - "\n", - " Goals:\n", - " - Every inheritor gets a cache.\n", - " - Every inheritor MUST define CACHE_NAME.\n", - " - Provide consistent key creation (namespaced).\n", - " - Provide thin get/set/get_or_compute wrappers.\n", - " - Keep business logic out of the base.\n", - " \"\"\"\n", - "\n", - " # --- REQUIRED by inheritors ---\n", - " CACHE_NAME: ClassVar[str] = \"\"\n", - "\n", - " # --- Optional defaults for common patterns ---\n", - " DEFAULT_INTERVAL: ClassVar[Optional[\"Interval\"]] = None\n", - " DEFAULT_SERIES_ID: ClassVar[\"SeriesId\"] # prefer explicit in subclasses\n", - "\n", - " # Internal registry to prevent accidental duplicate cache names\n", - " _CACHE_NAME_REGISTRY: ClassVar[Dict[str, Type[\"BaseDataManager\"]]] = {}\n", - "\n", - " def __init_subclass__(cls, **kwargs: Any) -> None:\n", - " super().__init_subclass__(**kwargs)\n", - "\n", - " # Skip enforcement for the abstract base itself\n", - " if cls is BaseDataManager:\n", - " return\n", - "\n", - " cache_name = getattr(cls, \"CACHE_NAME\", None)\n", - "\n", - " if not isinstance(cache_name, str) or not cache_name.strip():\n", - " raise TypeError(f\"{cls.__name__} must define a non-empty class variable CACHE_NAME: str\")\n", - "\n", - " cache_name = cache_name.strip()\n", - "\n", - " # Enforce uniqueness to avoid collisions\n", - " existing = cls._CACHE_NAME_REGISTRY.get(cache_name)\n", - " # if existing is not None and existing is not cls:\n", - " # raise TypeError(\n", - " # f\"Duplicate CACHE_NAME='{cache_name}'. \"\n", - " # f\"Already used by {existing.__name__}. \"\n", - " # f\"Pick a unique CACHE_NAME for {cls.__name__}.\"\n", - " # )\n", - "\n", - " cls._CACHE_NAME_REGISTRY[cache_name] = cls\n", - "\n", - " # Optional: enforce that DEFAULT_SERIES_ID exists (if you want)\n", - " if not hasattr(cls, \"DEFAULT_SERIES_ID\"):\n", - " raise TypeError(f\"{cls.__name__} must define DEFAULT_SERIES_ID (e.g., SeriesId.HIST).\")\n", - "\n", - " def __init__(\n", - " self,\n", - " *,\n", - " cache_spec: Optional[CacheSpec] = None,\n", - " enable_namespacing: bool = False,\n", - " ) -> None:\n", - " \"\"\"\n", - " Parameters\n", - " ----------\n", - " cache:\n", - " Your existing CustomCache instance (diskcache-backed).\n", - " cache_spec:\n", - " Optional shared configuration (base_dir, TTL defaults, etc.).\n", - " enable_namespacing:\n", - " If True, keys are prefixed with CACHE_NAME to avoid collisions.\n", - " \"\"\"\n", - " self.cache_spec = cache_spec or CacheSpec(cache_fname=self.CACHE_NAME)\n", - " self.cache = CustomCache(location=self.cache_spec.base_dir, \n", - " fname=self.cache_spec.cache_fname, \n", - " expire_days=self.cache_spec.default_expire_days,\n", - " clear_on_exit=self.cache_spec.clear_on_exit)\n", - " self.enable_namespacing = enable_namespacing\n", - "\n", - " # Key construction\n", - " def make_key(\n", - " self,\n", - " *,\n", - " symbol: str,\n", - " interval: Optional[Interval] = None,\n", - " artifact_type: ArtifactType,\n", - " series_id: Optional[SeriesId] = None,\n", - " **extra_parts: Any,\n", - " ) -> str:\n", - " \"\"\"\n", - " Namespaced key builder that wraps your construct_cache_key.\n", - "\n", - " You decided:\n", - " - no caching SNAPSHOT series_id (but you might still request it)\n", - " - time is explicit if you do AT_TIME\n", - " \"\"\"\n", - " interval = interval if interval is not None else self.DEFAULT_INTERVAL\n", - " series_id = series_id if series_id is not None else self.DEFAULT_SERIES_ID\n", - "\n", - " raw = construct_cache_key(\n", - " symbol=symbol,\n", - " interval=interval,\n", - " artifact_type=artifact_type,\n", - " series_id=series_id,\n", - " **extra_parts,\n", - " )\n", - "\n", - " if not self.enable_namespacing:\n", - " return raw\n", - "\n", - " return f\"{self.CACHE_NAME}|{raw}\"\n", - "\n", - " # Cache IO\n", - " def get(self, key: str, default: Any = None) -> Any:\n", - " return self.cache.get(key, default=default)\n", - "\n", - " def set(self, key: str, value: Any, *, expire: Optional[int] = None) -> None:\n", - " if expire is None:\n", - " expire = self.cache_spec.default_expire_seconds\n", - " self.cache.set(key, value, expire=expire)\n", - "\n", - " def delete(self, key: str) -> None:\n", - " self.cache.delete(key)\n", - "\n", - " def contains(self, key: str) -> bool:\n", - " return key in self.cache\n", - " \n", - " def cache_it(self, key: str, value: Any, *, expire: Optional[int] = None) -> None:\n", - " raise NotImplementedError(f\"{self.__class__.__name__}.cache() not implemented.\")\n", - "\n", - " def get_or_compute(\n", - " self,\n", - " key: str,\n", - " compute_fn: Callable[[], T],\n", - " *,\n", - " expire: Optional[int] = None,\n", - " force: bool = False,\n", - " ) -> T:\n", - " \"\"\"\n", - " Read-through caching helper.\n", - "\n", - " force=True bypasses cache read, recomputes and overwrites cache.\n", - " \"\"\"\n", - " if not force:\n", - " hit = self.cache.get(key, default=None)\n", - " if hit is not None:\n", - " return hit # type: ignore[return-value]\n", - "\n", - " value = compute_fn()\n", - " self.set(key, value, expire=expire)\n", - " return value\n", - "\n", - " # Offload hook (cron calls this)\n", - " def offload(self, *args: Any, **kwargs: Any) -> None:\n", - " \"\"\"\n", - " Optional standard hook.\n", - "\n", - " You can override in subclasses or implement a shared offloader that\n", - " knows how to iterate keys / export values. Keeping it as a stub here\n", - " avoids forcing a storage design too early.\n", - " \"\"\"\n", - " raise NotImplementedError(f\"{self.__class__.__name__}.offload() not implemented.\")\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "id": "7cd6e535", - "metadata": {}, - "source": [ - "### Dividends DataManager" - ] - }, - { - "cell_type": "code", - "execution_count": 166, - "id": "1b6bce12", - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "@dataclass\n", - "class DividendsConfig(metaclass=SingletonMetaClass):\n", - " default_lookback_years: int = DIVIDEND_LOOKBACK_YEARS\n", - " default_forecast_method: DiscreteDivGrowthModel = DiscreteDivGrowthModel.CONSTANT\n", - " dividend_type: DivType = DivType.DISCRETE\n", - " include_special_dividends: bool = False\n", - "\n", - " def assert_valid(self) -> None:\n", - " assert self.default_lookback_years > 0, \"Lookback years must be positive.\"\n", - " assert self.default_lookback_years <= 5, \"Lookback years seems too large. Max 5.\"\n", - " assert isinstance(self.default_forecast_method, DiscreteDivGrowthModel), \"Invalid forecast method. Expected DiscreteDivGrowthModel Enum.\"\n", - " assert isinstance(self.dividend_type, DivType), \"Invalid dividend type. Expected DivType Enum.\"\n", - " assert isinstance(self.include_special_dividends, bool), \"include_special_dividends must be a boolean.\"\n", - "\n", - "\n", - "\n", - "\n", - " def __post_init__(self) -> None:\n", - " self.assert_valid()\n", - "\n", - " def __setattr__(self, name, value):\n", - " super().__setattr__(name, value)\n", - " self.assert_valid()\n" - ] - }, - { - "cell_type": "code", - "execution_count": 168, - "id": "12698670", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{(1, 2), (2, 3)}" - ] - }, - "execution_count": 168, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "set([(1,2), (2,3), (1,2)])" - ] - }, - { - "cell_type": "code", - "execution_count": 169, - "id": "83047047", - "metadata": {}, - "outputs": [], - "source": [ - "## How dividends timeseries will work:\n", - "## If discrete:\n", - " ## All constant(+...) will cache up to < today\n", - " ## All None Constant will not cache\n", - "## If continuous:\n", - " ## Rely on MarktetTimeseries to provide continuous dividend yield history. It already caches.\n", - "\n", - "\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": 234, - "id": "4fee6e66", - "metadata": {}, - "outputs": [], - "source": [ - "class DividendDataManager(BaseDataManager):\n", - " CACHE_NAME: ClassVar[str] = \"dividend_data_manager\"\n", - " DEFAULT_SERIES_ID: ClassVar[\"SeriesId\"] = SeriesId.HIST\n", - " CONFIG = DividendsConfig()\n", - " \n", - " def __init__(self, symbol: str, *, cache_spec: Optional[CacheSpec] = None, enable_namespacing: bool = False) -> None:\n", - " super().__init__(cache_spec=cache_spec, enable_namespacing=enable_namespacing)\n", - " self.symbol = symbol\n", - "\n", - " def cache_it(self, key: str, value: Any, *, expire: Optional[int] = None, _type: str = \"discrete\") -> None:\n", - "\n", - " \n", - " ## If discrete dividends, we first check if key exists\n", - " ## If it does, we add to it. Only values <= today.\n", - " ## If it does not, we create new entry\n", - " if _type == \"discrete\":\n", - " existing = self.get(key, default=None)\n", - " allowed = [entry for entry in value if entry.date <= datetime.now().date()]\n", - " if existing is not None:\n", - " # Merge existing and new values. We're expecting lists of ScheduleEntry\n", - " merged = existing + allowed\n", - " \n", - " ## Unique by date\n", - " uniques = list({entry.date: entry for entry in merged}.values())\n", - " self.set(key, uniques, expire=expire)\n", - " return\n", - " else:\n", - " self.set(key, allowed, expire=expire)\n", - " return\n", - "\n", - " # For other types or if no existing, just setattr\n", - " self.set(key, value, expire=expire)\n", - "\n", - " @overload\n", - " def get_data(self, \n", - " start_date: Union[datetime, str],\n", - " end_date: Union[datetime, str],\n", - " div_type: Optional[DivType] = None,\n", - " return_key: Literal[True] = True\n", - " ) -> tuple[pd.Series | List[ScheduleEntry], str]: ...\n", - "\n", - " @overload\n", - " def get_data(self, \n", - " start_date: Union[datetime, str],\n", - " end_date: Union[datetime, str],\n", - " div_type: Optional[DivType] = None,\n", - " return_key: Literal[False] = False\n", - " ) -> pd.Series | List[ScheduleEntry]: ...\n", - "\n", - " def get_data(self, \n", - " start_date: Union[datetime, str],\n", - " end_date: Union[datetime, str],\n", - " div_type: Optional[DivType] = None,\n", - " return_key: bool = False\n", - " ) -> pd.Series | List[ScheduleEntry] | tuple[pd.Series | List[ScheduleEntry], str]:\n", - " \"\"\"\n", - " Get dividend data for the symbol. Ensures internal caching logic is respected.\n", - "\n", - " Parameters\n", - " ----------\n", - " start_date : Union[datetime, str]\n", - " Start date for dividend data retrieval.\n", - " end_date : Union[datetime, str]\n", - " End date for dividend data retrieval.\n", - " Returns\n", - " -------\n", - " pd.Series | List[ScheduleEntry]\n", - " Dividend data in the appropriate format.\n", - " \"\"\"\n", - " div_type = DivType(div_type) if div_type is not None else self.CONFIG.dividend_type\n", - " if div_type == DivType.DISCRETE:\n", - " data, key = self.get_discrete_dividend_schedule(\n", - " ticker=self.symbol,\n", - " start_date=start_date.strftime(\"%Y-%m-%d\") if isinstance(start_date, datetime) else start_date,\n", - " end_date=end_date.strftime(\"%Y-%m-%d\") if isinstance(end_date, datetime) else end_date,\n", - " )\n", - " elif div_type == DivType.CONTINUOUS:\n", - " data = self.get_div_yield_history(self.symbol)\n", - " key = None \n", - "\n", - " else:\n", - " raise ValueError(f\"Unsupported dividend type: {div_type}\")\n", - " \n", - " if return_key:\n", - " return data, key\n", - " return data \n", - "\n", - " \n", - "\n", - " def get_discrete_dividend_schedule(\n", - " self,\n", - " *,\n", - " ticker: str,\n", - " end_date: str,\n", - " start_date: str,\n", - " valuation_date: Optional[str] = None,\n", - " ):\n", - "\n", - "\n", - " method = self.CONFIG.default_forecast_method.value\n", - " lookback_years = self.CONFIG.default_lookback_years\n", - " key = self.make_key(\n", - " symbol=ticker,\n", - " artifact_type=ArtifactType.DIVS,\n", - " series_id=SeriesId.HIST,\n", - " method=method,\n", - " lookback_years=lookback_years,\n", - " current_state=\"schedule\",\n", - " interval=Interval.NA,\n", - " )\n", - "\n", - " available_schedule = self.get(key, default=None)\n", - " if available_schedule is not None:\n", - " \n", - " ## If max date in available schedule >= end_date, we can use cache\n", - " max_cached_date = max(entry.date for entry in available_schedule)\n", - " min_cached_date = min(entry.date for entry in available_schedule)\n", - " fully_covered = (min_cached_date <= datetime.strptime(start_date, \"%Y-%m-%d\").date()) and (max_cached_date >= datetime.strptime(end_date, \"%Y-%m-%d\").date())\n", - " if fully_covered:\n", - " print(\"Cache fully covers requested date range.\")\n", - " \n", - " ## Filter to requested date range\n", - " filtered_schedule = [entry for entry in available_schedule if start_date <= entry.date.strftime(\"%Y-%m-%d\") <= end_date]\n", - " return filtered_schedule, key\n", - " else:\n", - " print(\"Cache partially covers requested date range. Fetching missing data.\")\n", - " \n", - " schedule = get_vectorized_dividend_scehdule(\n", - " tickers=[ticker],\n", - " end_dates=[end_date],\n", - " start_dates=[start_date],\n", - " method=method,\n", - " lookback_years=lookback_years,\n", - " valuation_dates=[valuation_date] if valuation_date else None,\n", - " )\n", - " raw_schedule = schedule[0].schedule\n", - " self.cache_it(key, raw_schedule, _type=\"discrete\")\n", - " \n", - " return raw_schedule, key\n", - " \n", - " def get_div_yield_history(self, symbol: str) -> pd.Series:\n", - " div_history = TS.get_timeseries(symbol)\n", - " return div_history.dividend_yield\n", - "\n", - " def offload(self, *args: Any, **kwargs: Any) -> None:\n", - " \"\"\"\n", - " Example implementation of offload for DividendDataManager.\n", - " \"\"\"\n", - " print(f\"No offload logic implemented for {self.CACHE_NAME}\")\n", - "\n", - "test = DividendDataManager(symbol=\"AAPL\")\n" - ] - }, - { - "cell_type": "code", - "execution_count": 241, - "id": "1eef60d2", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Cache fully covers requested date range.\n" - ] - }, - { - "data": { - "text/plain": [ - "[,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ]" - ] - }, - "execution_count": 241, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "test.CONFIG.dividend_type = DivType.DISCRETE\n", - "test.get_data(\n", - " start_date=\"2012-10-08\",\n", - " end_date=\"2025-10-31\",\n", - ")" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "openbb_new_use", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.13" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/trade/datamanager/option_spot.py b/trade/datamanager/option_spot.py new file mode 100644 index 0000000..7185db1 --- /dev/null +++ b/trade/datamanager/option_spot.py @@ -0,0 +1,513 @@ +"""Option spot price data management with Thetadata API integration. + +This module provides the OptionSpotDataManager class for retrieving and caching +option contract spot prices from Thetadata API. Supports both EOD (end-of-day) +and Quote endpoints with intelligent partial caching. + +Typical usage: + >>> opt_spot_mgr = OptionSpotDataManager("AAPL") + >>> result = opt_spot_mgr.get_option_spot_timeseries( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... strike=150.0, + ... expiration="2025-06-20", + ... right="C" + ... ) + >>> prices = result.daily_option_spot +""" + +from datetime import datetime +from typing import Optional, Tuple, Union +import pandas as pd +from trade.helpers.Logging import setup_logger +from trade.helpers.helper import change_to_last_busday, to_datetime +from trade.datamanager.base import BaseDataManager, CacheSpec +from trade.datamanager.result import OptionSpotResult +from trade.datamanager._enums import ArtifactType, Interval, ModelPrice, SeriesId, OptionSpotEndpointSource +from trade.datamanager.utils.data_structure import _data_structure_sanitize +from trade.datamanager.utils.cache import _data_structure_cache_it, _check_cache_for_timeseries_data_structure +from trade.datamanager.config import OptionDataConfig +from trade.datamanager.utils.date import DateRangePacket, DATE_HINT, _sync_date, is_available_on_date +from trade.datamanager.utils.logging import get_logging_level +from dbase.DataAPI.ThetaData import retrieve_eod_ohlc, quote_to_eod_patch, retrieve_quote_rt +from dbase.utils import default_timestamp +from dbase.DataAPI.ThetaData.utils import _handle_opttick_param + +logger = setup_logger("trade.datamanager.option_spot", stream_log_level=get_logging_level()) + +class OptionSpotDataManager(BaseDataManager): + """Manages option spot price retrieval for a specific symbol from Thetadata API. + + Retrieves historical and real-time option contract prices (OHLC data) from + Thetadata's EOD or Quote endpoints. Implements intelligent caching with partial + cache support to minimize API calls. + + Attributes: + CACHE_NAME: Class-level cache identifier for this manager type. + DEFAULT_SERIES_ID: Default historical series identifier. + CONFIG: Configuration object for option data settings. + INSTANCES: Class-level cache of manager instances per symbol. + symbol: The underlying equity ticker symbol. + + Examples: + >>> # Get option spot price for single date + >>> opt_mgr = OptionSpotDataManager("AAPL") + >>> result = opt_mgr.get_option_spot( + ... date="2025-01-15", + ... strike=150.0, + ... expiration="2025-06-20", + ... right="C" + ... ) + >>> price = result.daily_option_spot["close"].iloc[0] + + >>> # Get time-series of option prices + >>> result = opt_mgr.get_option_spot_timeseries( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... strike=150.0, + ... expiration="2025-06-20", + ... right="C", + ... endpoint_source=OptionSpotEndpointSource.EOD + ... ) + >>> ohlc_data = result.daily_option_spot + """ + + CACHE_NAME: str = "option_spot_manager" + DEFAULT_SERIES_ID: SeriesId = SeriesId.HIST + CONFIG: OptionDataConfig = OptionDataConfig() + CACHE_SPEC: CacheSpec = CacheSpec(cache_fname=CACHE_NAME) + + def __init__( + self, + symbol: str, + *, + enable_namespacing: bool = False, + ) -> None: + """Initializes manager for a specific symbol. + + Sets up the option spot data manager with persistent cache for API responses. + + Args: + symbol: Underlying equity ticker symbol (e.g., "AAPL", "SPY"). + enable_namespacing: If True, enables namespace isolation in cache keys. + + Examples: + >>> opt_mgr = OptionSpotDataManager("AAPL") + >>> opt_mgr = OptionSpotDataManager("AAPL", cache_spec=CacheSpec(expire_days=7)) + """ + super().__init__(enable_namespacing=enable_namespacing, symbol=symbol) + self.symbol = symbol + + def _sync_date( + self, + start_date: DATE_HINT, + end_date: DATE_HINT, + strike: Optional[float] = None, + expiration: Optional[Union[datetime, str]] = None, + right: Optional[str] = None, + endpoint_source: Optional[OptionSpotEndpointSource] = OptionSpotEndpointSource.EOD + ) -> Tuple[DATE_HINT, DATE_HINT]: + """Synchronizes requested dates with available data range from Thetadata. + + Queries Thetadata for available dates for the specified option contract and + adjusts the requested date range to fit within available data bounds. + + Args: + start_date: Requested start date. + end_date: Requested end date. + strike: Option strike price. + expiration: Option expiration date. + right: Option type ("C" for call, "P" for put). + + Returns: + Tuple of (adjusted_start_date, adjusted_end_date) constrained to + available data range. + + Examples: + >>> opt_mgr = OptionSpotDataManager("AAPL") + >>> start, end = opt_mgr._sync_date( + ... start_date="2025-01-01", + ... end_date="2025-12-31", + ... strike=150.0, + ... expiration="2025-06-20", + ... right="C" + ... ) + + Notes: + - Constrains start_date to max(requested_start, min_available_date) + - Constrains end_date to min(requested_end, max_available_date) + - Prevents requesting dates outside available data range + """ + return _sync_date( + symbol=self.symbol, + start_date=start_date, + end_date=end_date, + strike=strike, + expiration=expiration, + right=right, + endpoint_source=endpoint_source + ) + + def get_option_spot( + self, + date: Union[datetime, str], + *, + strike: Optional[float] = None, + expiration: Optional[Union[datetime, str]] = None, + right: Optional[str] = None, + opttick: Optional[str] = None, + endpoint_source: Optional[OptionSpotEndpointSource] = None, + model_price: Optional[ModelPrice] = None, + ) -> OptionSpotResult: + """Fetches option spot price for a single date from Thetadata API. + + Retrieves OHLC data for a specific option contract on a single date. + Wrapper around get_option_spot_timeseries with single-date range. + + Args: + date: Target date (YYYY-MM-DD string or datetime). + strike: Option strike price. Required unless opttick provided. + expiration: Option expiration date. Required unless opttick provided. + right: Option type ("C" for call, "P" for put). Required unless opttick provided. + opttick: Optional ticker string (e.g., "AAPL250620C00150000"). If provided, + overrides strike, expiration, and right parameters. + endpoint_source: API endpoint to use (EOD or QUOTE). Uses config default if None. + + Returns: + OptionSpotResult containing daily_option_spot DataFrame with OHLC data, + plus metadata (key, endpoint_source). + + Examples: + >>> opt_mgr = OptionSpotDataManager("AAPL") + >>> # Using strike/expiration/right + >>> result = opt_mgr.get_option_spot( + ... date="2025-01-15", + ... strike=150.0, + ... expiration="2025-06-20", + ... right="C" + ... ) + >>> close_price = result.daily_option_spot["close"].iloc[0] + + >>> # Using opttick + >>> result = opt_mgr.get_option_spot( + ... date="2025-01-15", + ... opttick="AAPL250620C00150000" + ... ) + + Notes: + - Returns DataFrame with columns: open, high, low, close, volume + - Uses EOD endpoint by default for historical data + - Quote endpoint available for more recent data + """ + date_str = pd.to_datetime(date).strftime("%Y-%m-%d") if isinstance(date, datetime) else date + result = self.get_option_spot_timeseries( + start_date=date_str, + end_date=date_str, + strike=strike, + expiration=expiration, + right=right, + opttick=opttick, + endpoint_source=endpoint_source, + model_price=model_price, + ) + return result + + def get_option_spot_timeseries( + self, + start_date: Union[datetime, str], + end_date: Union[datetime, str], + *, + strike: Optional[float] = None, + expiration: Optional[Union[datetime, str]] = None, + right: Optional[str] = None, + opttick: Optional[str] = None, + endpoint_source: Optional[OptionSpotEndpointSource] = None, + model_price: Optional[ModelPrice] = None, + ) -> OptionSpotResult: + """Fetches option spot price time-series from Thetadata API. + + Retrieves daily OHLC data for a specific option contract over a date range. + Implements intelligent caching with partial cache support to minimize API calls. + + Args: + start_date: Start of date range (YYYY-MM-DD string or datetime). + end_date: End of date range (YYYY-MM-DD string or datetime). + strike: Option strike price. Required unless opttick provided. + expiration: Option expiration date. Required unless opttick provided. + right: Option type ("C" for call, "P" for put). Required unless opttick provided. + opttick: Optional ticker string (e.g., "AAPL250620C00150000"). If provided, + overrides strike, expiration, and right parameters. + endpoint_source: API endpoint to use (EOD or QUOTE). Uses config default if None. + model_price: Optional model price type to use. + + Returns: + OptionSpotResult containing daily_option_spot DataFrame indexed by datetime + with OHLC data, plus metadata (key, endpoint_source). + + Examples: + >>> opt_mgr = OptionSpotDataManager("AAPL") + >>> # Get historical option prices + >>> result = opt_mgr.get_option_spot_timeseries( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... strike=150.0, + ... expiration="2025-06-20", + ... right="C", + ... endpoint_source=OptionSpotEndpointSource.EOD + ... ) + >>> ohlc = result.daily_option_spot + >>> print(ohlc.head()) + datetime open high low close volume + 2025-01-02 5.25 5.50 5.20 5.45 12500 + 2025-01-03 5.50 5.75 5.45 5.70 15300 + ... + + >>> # Using opttick format + >>> result = opt_mgr.get_option_spot_timeseries( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... opttick="AAPL250620C00150000" + ... ) + + Notes: + - Partial cache hits only fetch missing dates from API + - Full cache hits return immediately without API calls + - Automatically adjusts date range to available data bounds + - EOD endpoint: Historical end-of-day data + - QUOTE endpoint: Constructed from quote data (fallback for recent dates) + """ + if endpoint_source is None: + endpoint_source = self.CONFIG.option_spot_endpoint_source + + result = OptionSpotResult() + result.symbol = self.symbol + result.endpoint_source = endpoint_source + result.strike = strike + result.right = right + result.expiration = to_datetime(expiration) if expiration is not None else None + result.rt = False + result.model_price = model_price or self.CONFIG.model_price + + + strike, right, symbol, expiration = _handle_opttick_param( + strike=strike, + right=right, + symbol=self.symbol, + exp=expiration, + opttick=opttick, + enforce_single_option=True, + ) + + ## Sync requested dates with available data range + start_date, end_date = self._sync_date( + start_date=start_date, + end_date=end_date, + strike=float(strike), + expiration=expiration, + right=right, + endpoint_source=endpoint_source, + ) + + date_packet = DateRangePacket(start_date=start_date, end_date=end_date, maturity_date=expiration) + start_date, end_date = date_packet.start_date, date_packet.end_date + start_str, end_str = date_packet.start_str, date_packet.end_str + expiration = date_packet.maturity_date + + # Construct cache key + key = self.make_key( + symbol=self.symbol, + artifact_type=ArtifactType.OPTION_SPOT, + series_id=SeriesId.HIST, + endpoint_source=endpoint_source.value, + interval=Interval.EOD, + strike=strike, + right=right, + expiration=expiration, + ) + + # Check cache + cached_data, is_partial, start_date, end_date = _check_cache_for_timeseries_data_structure( + key=key, + self=self, + start_dt=start_date, + end_dt=end_date, + ) + + if cached_data is not None and not is_partial: + logger.info(f"Cache hit for option spot timeseries key: {key}") + result.daily_option_spot = cached_data + result.key = key + result.endpoint_source = endpoint_source + return result + elif is_partial: + logger.info( + f"Cache partially covers requested date range for option spot timeseries. Key: {key}. Fetching missing dates." + ) + else: + logger.info(f"No cache found for option spot timeseries key: {key}. Fetching from source.") + + # Fetch data from Thetadata API (placeholder logic) + fetched_data = self._query_thetadata_api( + start_date=start_date, + end_date=end_date, + endpoint_source=endpoint_source, + strike=strike, + expiration=expiration, + right=right, + ) + + # Merge with cached data if partial + if cached_data is not None and is_partial: + merged = pd.concat([cached_data, fetched_data]) + fetched_data = merged[~merged.index.duplicated(keep="last")] + + fetched_data.index = default_timestamp(fetched_data.index) + + # Cache the fetched data + _data_structure_cache_it(self, key, fetched_data) + + # Sanitize before returning + fetched_data = _data_structure_sanitize( + fetched_data, + start=start_str, + end=end_str, + source_name=f"option spot timeseries for {self.symbol} with strike {strike}, right {right}, expiration {expiration} from {endpoint_source.value}", + ) + + result.daily_option_spot = fetched_data + result.key = key + result.endpoint_source = endpoint_source + return result + + def _query_thetadata_api( + self, + start_date: Union[datetime, str], + end_date: Union[datetime, str], + endpoint_source: OptionSpotEndpointSource, + strike: Optional[float] = None, + expiration: Optional[Union[datetime, str]] = None, + right: Optional[str] = None, + ) -> pd.DataFrame: + """Fetches option spot data from Thetadata API using specified endpoint. + + Makes HTTP requests to Thetadata's EOD or Quote endpoints to retrieve + option contract OHLC data. + + Args: + start_date: Start of date range (YYYY-MM-DD string or datetime). + end_date: End of date range (YYYY-MM-DD string or datetime). + endpoint_source: API endpoint (OptionSpotEndpointSource.EOD or QUOTE). + strike: Option strike price. + expiration: Option expiration date. + right: Option type ("C" for call, "P" for put). + + Returns: + DataFrame indexed by datetime with columns: + - open: Opening price + - high: Highest price + - low: Lowest price + - close: Closing price + - volume: Trading volume + + Examples: + >>> opt_mgr = OptionSpotDataManager("AAPL") + >>> df = opt_mgr._query_thetadata_api( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... endpoint_source=OptionSpotEndpointSource.EOD, + ... strike=150.0, + ... expiration="2025-06-20", + ... right="C" + ... ) + + Notes: + - EOD endpoint: Uses retrieve_eod_ohlc for historical data + - QUOTE endpoint: Uses quote_to_eod_patch (constructs OHLC from quotes) + - Quote endpoint useful when EOD data not yet available + """ + # In a real implementation, this method would make HTTP requests to Thetadata's API. + if endpoint_source == OptionSpotEndpointSource.EOD: + return retrieve_eod_ohlc( + symbol=self.symbol, + start_date=start_date, + end_date=end_date, + strike=float(strike), + exp=expiration, + right=right, + ) + + else: + logger.info( + f"Fetching option spot data from Thetadata Quote endpoint for {self.symbol} from {start_date} to {end_date}." + ) + return quote_to_eod_patch( + symbol=self.symbol, + start_date=start_date, + end_date=end_date, + strike=float(strike), + exp=expiration, + right=right, + ohlc_format=True, + ) + + def rt( + self, + strike: float, + right: str, + expiration: Union[datetime, str], + ) -> OptionSpotResult: + """ + Fetches real-time option spot price from Thetadata Quote endpoint. + + Retrieves the most recent OHLC data for a specific option contract using + Thetadata's Quote endpoint. + + Args: + strike: Option strike price. + right: Option type ("C" for call, "P" for put). + expiration: Option expiration date. + + Returns: + OptionSpotResult containing daily_option_spot DataFrame with OHLC data, + plus metadata (key, endpoint_source). + """ + as_of = datetime.now().date() + if not is_available_on_date(as_of): + as_of = change_to_last_busday(as_of - pd.tseries.offsets.BDay(1), time_of_day_aware=False) + logger.info( + f"Real-time data not available for {self.symbol} on {as_of}. Market may be closed." + ) + res = self.get_option_spot( + strike=strike, + right=right, + expiration=to_datetime(expiration) if expiration is not None else None, + date=as_of, + ) + res.rt = True + return res + rt = retrieve_quote_rt( + symbol=self.symbol, + exp=to_datetime(expiration) if expiration is not None else None, + strike=strike, + right=right, + ) + rt.index = default_timestamp(rt.index) + rt.columns = rt.columns.str.lower() + result = OptionSpotResult() + result.daily_option_spot = rt + result.key = self.make_key( + symbol=self.symbol, + time = datetime.now().time(), + date = datetime.now(), + artifact_type=ArtifactType.OPTION_SPOT, + series_id=SeriesId.AT_TIME, + endpoint_source=OptionSpotEndpointSource.QUOTE, + ) + result.symbol = self.symbol + result.strike = strike + result.right = right + result.expiration = to_datetime(expiration) if expiration is not None else None + result.endpoint_source = OptionSpotEndpointSource.QUOTE + result.rt = True + return result + \ No newline at end of file diff --git a/trade/datamanager/rates.py b/trade/datamanager/rates.py new file mode 100644 index 0000000..8f81c9d --- /dev/null +++ b/trade/datamanager/rates.py @@ -0,0 +1,559 @@ +"""Risk-free rate data management for options pricing with caching. + +This module provides the RatesDataManager class for retrieving and caching +risk-free interest rates from US Treasury bills (^IRX - 13 Week Treasury Bill). +Implements singleton pattern with intelligent partial caching. + +Typical usage: + >>> rates_mgr = RatesDataManager() + >>> result = rates_mgr.get_risk_free_rate_timeseries( + ... start_date="2025-01-01", + ... end_date="2025-01-31" + ... ) + >>> rates = result.daily_risk_free_rates +""" + +from datetime import datetime +from typing import ClassVar, Optional, Union +import pandas as pd +import yfinance as yf +import numpy as np +from trade.helpers.Logging import setup_logger +from trade.helpers.helper import change_to_last_busday +from curl_cffi.requests.exceptions import SSLError +import backoff +from .utils.cache import _data_structure_cache_it, _check_cache_for_timeseries_data_structure +from .utils.date import is_available_on_date, to_datetime +from .utils.data_structure import _data_structure_sanitize +from .config import OptionDataConfig +from ._enums import ArtifactType, Interval, SeriesId, RealTimeFallbackOption +from .result import RatesResult +from .base import BaseDataManager, CacheSpec +from .utils.logging import get_logging_level + +logger = setup_logger("trade.datamanager.rates", stream_log_level=get_logging_level()) + + +def deannualize(annual_rate: float, periods: int = 365) -> float: + """Converts annualized interest rate to per-period rate. + + Uses compound interest formula to convert annual rate to daily rate + or other period-based rate. + + Args: + annual_rate: Annualized interest rate (e.g., 0.05 for 5%). + periods: Number of periods per year. Defaults to 365 for daily rate. + + Returns: + Per-period interest rate (e.g., daily rate if periods=365). + + Examples: + >>> # Convert 5% annual to daily rate + >>> daily_rate = deannualize(0.05, periods=365) + >>> print(f"{daily_rate:.6f}") + 0.000134 + + >>> # Convert 5% annual to weekly rate + >>> weekly_rate = deannualize(0.05, periods=52) + >>> print(f"{weekly_rate:.6f}") + 0.000942 + """ + return (1 + annual_rate) ** (1 / periods) - 1 + + +class RatesDataManager(BaseDataManager): + """Singleton manager for risk-free rate data from treasury bills (^IRX). + + Manages retrieval and caching of US Treasury Bill rates (13-week T-Bill) used as + risk-free rates in options pricing. Implements singleton pattern to ensure single + instance across application. Supports partial caching with automatic cache merging. + + Attributes: + CACHE_NAME: Class-level cache identifier for this manager type. + DEFAULT_SERIES_ID: Default historical series identifier. + INSTANCE: Singleton instance reference. + DEFAULT_YFINANCE_TICKER: Yahoo Finance ticker for 13-week T-Bill (^IRX). + CONFIG: Configuration object for rates data settings. + + Examples: + >>> # Singleton access - same instance returned + >>> rates_mgr1 = RatesDataManager() + >>> rates_mgr2 = RatesDataManager() + >>> assert rates_mgr1 is rates_mgr2 + + >>> # Get rate for a single date + >>> result = rates_mgr1.get_rate(date="2025-01-15") + >>> rate = result.daily_risk_free_rates.iloc[0] + + >>> # Get time-series of rates + >>> result = rates_mgr1.get_risk_free_rate_timeseries( + ... start_date="2025-01-01", + ... end_date="2025-01-31" + ... ) + >>> rates = result.daily_risk_free_rates + """ + + CACHE_NAME: ClassVar[str] = "rates_data_manager" + DEFAULT_SERIES_ID: ClassVar["SeriesId"] = SeriesId.HIST + INSTANCE: ClassVar[Optional["RatesDataManager"]] = None + DEFAULT_YFINANCE_TICKER :str = "^IRX" # 13 WEEK TREASURY BILL + CONFIG: OptionDataConfig = OptionDataConfig() + CACHE_SPEC: CacheSpec = CacheSpec(cache_fname=CACHE_NAME) + + def __new__( + cls, + *, + cache_spec: Optional[CacheSpec] = None, + enable_namespacing: bool = False, + ) -> "RatesDataManager": + """Ensures only one instance exists (singleton pattern). + + Returns the existing singleton instance if available, otherwise creates + a new one. Ensures risk-free rate data is managed globally. + + Args: + cache_spec: Optional cache configuration. Uses default if None. + enable_namespacing: If True, enables namespace isolation in cache keys. + + Returns: + Singleton RatesDataManager instance. + + Examples: + >>> mgr1 = RatesDataManager() + >>> mgr2 = RatesDataManager() + >>> assert mgr1 is mgr2 # Same instance + """ + + if cls.INSTANCE is not None: + return cls.INSTANCE + instance = object.__new__(cls) + cls.INSTANCE = instance + return instance + + def __init__(self, *, enable_namespacing: bool = False) -> None: + """Initializes singleton instance once, skipping subsequent calls. + + Sets up persistent cache for rates data. Only executes initialization logic + on first instantiation due to singleton pattern. + + Args: + enable_namespacing: If True, enables namespace isolation in cache keys. + + Examples: + >>> mgr = RatesDataManager() + >>> mgr = RatesDataManager(cache_spec=CacheSpec(expire_days=30)) + """ + if getattr(self, "_init_called", False): + return + self._init_called = True + super().__init__(enable_namespacing=enable_namespacing) + + @property + def symbol(self) -> str: + """Returns the symbol associated with this RatesDataManager.""" + return self.DEFAULT_YFINANCE_TICKER + + @symbol.setter + def symbol(self, value: str) -> None: + """Sets the symbol associated with this RatesDataManager.""" + pass + + def get_rate( + self, + date: Union[datetime, str], + interval: Interval = Interval.EOD, + str_interval: Optional[str] = None, + fallback_option: Optional[RealTimeFallbackOption] = None, + *, + force_fail_n: int = 0, + ) -> RatesResult: + """Returns risk-free rate for a single date. + + Fetches the risk-free interest rate (from 13-week T-Bill) for a specific date. + Returns empty result if date is not a business day or is a US holiday. + + Args: + date: Target date for rate lookup (YYYY-MM-DD string or datetime). + interval: Time interval resolution. Defaults to Interval.EOD (end-of-day). + str_interval: Optional yfinance interval string (e.g., "1d", "30m"). + Overrides interval parameter if provided. + + Returns: + RatesResult containing daily_risk_free_rates Series with single value, + or empty Series if date is invalid. + + Examples: + >>> rates_mgr = RatesDataManager() + >>> result = rates_mgr.get_rate(date="2025-01-15") + >>> if not result.daily_risk_free_rates.empty: + ... rate = result.daily_risk_free_rates.iloc[0] + ... print(f"Rate: {rate:.4f}") + Rate: 0.0485 + + >>> # Weekend date returns empty result + >>> result = rates_mgr.get_rate(date="2025-01-18") # Saturday + >>> print(result.daily_risk_free_rates.empty) + True + + Notes: + - Validates date is a business day (not weekend or US holiday) + - Uses internal timeseries method with single-date range + - Returns annualized rate (e.g., 0.0485 = 4.85%) + """ + ## To avoid infinite recursion in fallback + if force_fail_n > 7: + raise ValueError("Exceeded maximum recursion attempts in get_rate fallback handling.") + force_fail_n += 1 + fallback_option = fallback_option or self.CONFIG.real_time_fallback_option + date = to_datetime(date) + + ## Resolving date availability + if not is_available_on_date(date.date()): + logger.warning( + f"Requested date {date} is not a business day or is a US holiday. Resorting to fallback option `{fallback_option}`." + ) + if fallback_option == RealTimeFallbackOption.RAISE_ERROR: + raise ValueError(f"Date {date} is not available for risk-free rate data.") + + if fallback_option == RealTimeFallbackOption.USE_LAST_AVAILABLE: + ## Move date back to last business day + ## Using only change_to_last_busday assumes input date is not business day or is holiday + ## Which the function would roll back + ## But there's a possibility input date is today's date but before market open + ## In that case we need to move back one more business day + date = change_to_last_busday(date - pd.tseries.offsets.BDay(1), time_of_day_aware=False) + return self.get_rate( + date=date, + interval=interval, + str_interval=str_interval, + fallback_option=RealTimeFallbackOption.USE_LAST_AVAILABLE, + force_fail_n=force_fail_n, + ) + else: + value = pd.Series(dtype=float, + index = [pd.to_datetime(date)], + data = [np.nan if fallback_option == RealTimeFallbackOption.NAN else 0.0]) + + res = RatesResult(timeseries=value, symbol=self.DEFAULT_YFINANCE_TICKER) + res.fallback_option = fallback_option + return res + date_str = pd.to_datetime(date).strftime("%Y-%m-%d") if isinstance(date, datetime) else date + + rates_data = self.get_risk_free_rate_timeseries( + start_date=date_str, + end_date=date_str, + interval=interval, + str_interval=str_interval, + ) + + ## Date is available, but resolving no data found + rate = rates_data.timeseries + if rate is not None and not rate.empty: + rate = rate.iloc[0:1] + else: + logger.warning( + f"No rate data found for date {date}. Resorting to fallback option `{fallback_option}`." + ) + if fallback_option == RealTimeFallbackOption.RAISE_ERROR: + raise ValueError(f"No rate data found for date {date}.") + elif fallback_option == RealTimeFallbackOption.USE_LAST_AVAILABLE: + ## Move date back to last business day + ## We are retaining the original date for logging and index purposes. + ## Because the returned rate should still be indexed by the requested date, which would be used in further calculations. + original_date = to_datetime(date).date() + date = change_to_last_busday(date - pd.tseries.offsets.BDay(1), time_of_day_aware=False) + res = self.get_rate( + date=date, + interval=interval, + str_interval=str_interval, + fallback_option=RealTimeFallbackOption.USE_LAST_AVAILABLE, + force_fail_n=force_fail_n, + ) + rate = res.timeseries + rate = rate.iloc[0:1] + logger.warning( + f"Using last available rate for date {date} for {original_date} as fallback." + ) + rate.index = [pd.to_datetime(original_date)] + else: + rate = pd.Series(dtype=float, + index = [to_datetime(date)], + data = [np.nan if fallback_option == RealTimeFallbackOption.NAN else 0.0]) + + res = RatesResult(timeseries=rate, symbol=self.DEFAULT_YFINANCE_TICKER) + res.fallback_option = fallback_option + return res + + def get_risk_free_rate_timeseries( + self, + start_date: Union[datetime, str], + end_date: Union[datetime, str], + interval: Interval = Interval.EOD, + str_interval: Optional[str] = None, + ) -> RatesResult: + """Returns risk-free rate time-series with partial cache support. + + Fetches daily risk-free interest rates from 13-week Treasury Bills for the + specified date range. Intelligently uses cache when available and only fetches + missing dates from yfinance. + + Args: + start_date: Start of date range (YYYY-MM-DD string or datetime). + end_date: End of date range (YYYY-MM-DD string or datetime). + interval: Time interval resolution. Defaults to Interval.EOD (end-of-day). + str_interval: Optional yfinance interval string (e.g., "1d", "30m"). + Overrides interval parameter if provided. + + Returns: + RatesResult containing daily_risk_free_rates Series indexed by datetime + with annualized rates. + + Examples: + >>> rates_mgr = RatesDataManager() + >>> result = rates_mgr.get_risk_free_rate_timeseries( + ... start_date="2025-01-01", + ... end_date="2025-01-31" + ... ) + >>> rates = result.daily_risk_free_rates + >>> print(rates.head()) + Datetime + 2025-01-02 0.0485 + 2025-01-03 0.0487 + 2025-01-06 0.0486 + ... + + >>> # High-frequency intraday rates + >>> result = rates_mgr.get_risk_free_rate_timeseries( + ... start_date="2025-01-15", + ... end_date="2025-01-15", + ... str_interval="30m" + ... ) + + Notes: + - Partial cache hits fetch only missing dates and merge with cache + - Full cache hits return immediately without external calls + - Automatically filters to business days (excludes weekends/holidays) + - Returns annualized rates (e.g., 0.0485 = 4.85%) + - Cache automatically merges and deduplicates by date + """ + + if str_interval is not None: + # normalize common yfinance strings + intraday_tokens = ["m", "h"] + if any(t in str_interval for t in intraday_tokens): + raise ValueError( + "RatesDataManager supports daily-or-higher intervals only. " f"Received str_interval={str_interval}." + ) + + if interval != Interval.EOD: + raise ValueError("RatesDataManager is EOD-only.") + + + start_str = pd.to_datetime(start_date).strftime("%Y-%m-%d") if isinstance(start_date, datetime) else start_date + end_str = pd.to_datetime(end_date).strftime("%Y-%m-%d") if isinstance(end_date, datetime) else end_date + + ## Determine yfinance interval + if not str_interval: + fn_interval = "1d" if interval == Interval.EOD else "30m" + else: + fn_interval = str_interval + + ## Make cache key + key = self.make_key( + symbol=self.DEFAULT_YFINANCE_TICKER, + artifact_type=ArtifactType.RATES, + series_id=SeriesId.HIST, + interval=interval, + fn_interval=fn_interval, + ) + + + + ## Check cache + series, is_partial, start_date, end_date = _check_cache_for_timeseries_data_structure( + self=self, key=key, start_dt=start_str, end_dt=end_str + ) + + ## If no missing dates, return cached series + if series is not None and not is_partial: + logger.info(f"Cache fully covers requested date range for risk-free rate timeseries. Key: {key}") + series = _data_structure_sanitize( + series, + start=start_str, + end=end_str, + source_name=f"cached risk-free rate timeseries for {self.DEFAULT_YFINANCE_TICKER}", + ) + return RatesResult(timeseries=series, symbol=self.DEFAULT_YFINANCE_TICKER) + else: + ## Fetch overriding date range for missing data + start_date = start_str + end_date = end_str + logger.info( + f"Cache partially covers requested date range for risk-free rate timeseries. Key: {key}" + ) + + # Fetch rates data + rates_data = self._query_yfinance( + start_date=start_date, + end_date=end_date, + interval=fn_interval, + )["annualized"] + rates_data = rates_data[(rates_data.index >= pd.to_datetime(start_str)) & (rates_data.index <= pd.to_datetime(end_str))] + + # Merge with existing cached series + if series is not None: + merged = pd.concat([series, rates_data]) + rates_data = merged[~merged.index.duplicated(keep="last")] + + # If data is empty, return empty result + if rates_data.empty: + logger.warning( + f"No risk-free rate data found for date range {start_date} to {end_date}." + ) + return RatesResult(symbol=self.DEFAULT_YFINANCE_TICKER, timeseries=pd.Series(dtype=float)) + + + ## Cache the updated series. This is allowed cause `cache_it` uses the utility function from + ## trade.datamanager.utils.cache which wraps into a _CacheData object. + self.cache_it(key, rates_data) + + ## Sanitize before returning + rates_data = _data_structure_sanitize( + rates_data, + start=start_str, # Ensure only requested range + end=end_str, + source_name=f"final risk-free rate timeseries for {self.DEFAULT_YFINANCE_TICKER} after merging cache and fetched data", + ) + + return RatesResult(symbol=self.DEFAULT_YFINANCE_TICKER, timeseries=rates_data) + + def cache_it(self, key: str, value: pd.Series, *, expire: Optional[int] = None) -> None: + """Merges and caches rate time-series, excluding today's partial data. + + Appends new rate data to existing cached time-series if cache entry exists. + Filters out today's data to avoid caching incomplete/changing values. + + Args: + key: Cache key identifier. + value: Series of rates to cache (indexed by datetime). + expire: Optional expiration time in seconds. Uses cache default if None. + + Examples: + >>> rates_mgr = RatesDataManager() + >>> rates = pd.Series([0.048, 0.049], index=pd.date_range("2025-01-01", periods=2)) + >>> rates_mgr.cache_it("my_key", rates, expire=86400) + + Notes: + - Existing cache entries are merged with new data + - Duplicates are removed, keeping latest values + - Today's data excluded to avoid caching incomplete values + """ + ## Since it is a timeseries, we will append to existing if exists + _data_structure_cache_it(self, key, value, expire=expire) + + @backoff.on_exception( + backoff.expo, + (SSLError, Exception), # Catching general Exception as yfinance can raise various exceptions + max_tries=5, + logger=logger, + ) + def _query_yfinance( + self, + start_date: Union[datetime, str], + end_date: Union[datetime, str], + interval: str, + ) -> pd.DataFrame: + """Fetches ^IRX treasury bill rates from yfinance and formats output. + + Downloads 13-week Treasury Bill data from Yahoo Finance, processes it, + and returns formatted DataFrame with annualized and daily rates. Adds + 5-day buffer to date range to ensure complete data retrieval. + + Args: + start_date: Start of date range (YYYY-MM-DD string or datetime). + end_date: End of date range (YYYY-MM-DD string or datetime). + interval: yfinance interval string (e.g., "1d" for daily, "30m" for 30-minute). + + Returns: + DataFrame indexed by Datetime with columns: + - name: Ticker symbol (^IRX) + - description: "13 WEEK TREASURY BILL" + - daily: Daily rate (deannualized from annual rate) + - annualized: Annualized rate (as decimal, e.g., 0.0485 = 4.85%) + + Examples: + >>> rates_mgr = RatesDataManager() + >>> df = rates_mgr._query_yfinance( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... interval="1d" + ... ) + >>> print(df.head()) + name description daily annualized + Datetime + 2025-01-02 ^IRX 13 WEEK TREASURY BILL 0.000129 0.0485 + 2025-01-03 ^IRX 13 WEEK TREASURY BILL 0.000130 0.0487 + ... + + Notes: + - Uses 5-day buffer before/after date range for data completeness + - Converts yfinance percentage (4.85) to decimal (0.0485) + - Calculates daily rate using compound interest formula + - Filters final output to exact date range requested + """ + + ## Date buffer to ensure we get all data + buffered_start = to_datetime(start_date) - pd.Timedelta(days=5) + buffered_end = to_datetime(end_date) + pd.Timedelta(days=1) + yf_ticker = yf.Ticker(self.DEFAULT_YFINANCE_TICKER) + + + try: + data_min = yf_ticker.history( + start=buffered_start, + end=buffered_end, + interval=interval, + ) + data_min.index = data_min.index.tz_localize(None) + + ## Fallback in case of yfinance issues + except Exception as e: # noqa + data_min = yf.download( + yf_ticker.ticker, + start=buffered_start, + end=buffered_end, + interval=interval, + progress=False, + multi_level_index=False, + ) + + data_min.columns = data_min.columns.str.lower() + data_min["annualized"] = data_min["close"] / 100 + data_min["daily"] = (data_min["annualized"]).apply(deannualize) + data_min["name"] = self.DEFAULT_YFINANCE_TICKER + data_min["description"] = yf_ticker.info.get("shortName", "UNKNOWN") + data_min.index.name = "Datetime" + data_min = data_min[["name", "description", "daily", "annualized"]] + data_min = data_min[ + (data_min.index >= pd.to_datetime(start_date)) & (data_min.index <= pd.to_datetime(end_date)) + ] + return data_min + + def rt(self, fallback_option: Optional[RealTimeFallbackOption] = None) -> RatesResult: + """Shortcut for get_rate method. + + Provides a concise alias for retrieving risk-free rate at the current date. + + Returns: + RatesResult containing daily_risk_free_rates Series with single value + for today's date. + Examples: + >>> rates_mgr = RatesDataManager() + >>> result = rates_mgr.rt() + >>> rate = result.daily_risk_free_rates.iloc[0] + >>> print(f"Today's Rate: {rate:.4f}") + Today's Rate: 0.0485 + """ + res = self.get_rate(date=datetime.now(), fallback_option=fallback_option) + res.rt = True + return res \ No newline at end of file diff --git a/trade/datamanager/requests.py b/trade/datamanager/requests.py new file mode 100644 index 0000000..0ac9c09 --- /dev/null +++ b/trade/datamanager/requests.py @@ -0,0 +1,137 @@ +from datetime import datetime +from dataclasses import dataclass +from typing import Optional, Union +import pandas as pd +from trade.datamanager.result import SpotResult, ForwardResult, DividendsResult, RatesResult, OptionSpotResult, VolatilityResult, GreekResultSet +from trade.datamanager._enums import ModelPrice, OptionSpotEndpointSource, SeriesId, VolatilityModel, OptionPricingModel, RealTimeFallbackOption +from trade.helpers.helper import get_missing_dates +from trade.optionlib.config.types import DivType +from trade.helpers.Logging import setup_logger +from trade.datamanager.utils.logging import get_logging_level, register_to_factor_list + +logger = setup_logger("trade.datamanager.requests", stream_log_level=get_logging_level()) +register_to_factor_list("trade.datamanager.requests") + + +@dataclass +class LoadRequest: + + ## Required parameters + symbol: str + + ## Timeseries parameters + start_date: Optional[Union[str, pd.Timestamp]] = None + end_date: Optional[Union[str, pd.Timestamp]] = None + as_of: Optional[Union[str, pd.Timestamp]] = None + rt: Optional[bool] = False + on_date: Optional[bool] = False + + ## Option specific parameters + expiration: Optional[Union[str, pd.Timestamp]] = None + strike: Optional[float] = None + right: Optional[str] = None + + ## Data type + series_id: Optional[SeriesId] = None + + ## Enum types + dividend_type: Optional[DivType] = None + endpoint_source: Optional[OptionSpotEndpointSource] = None + vol_model: Optional[VolatilityModel] = None + market_model: Optional[OptionPricingModel] = None + model_price: Optional[ModelPrice] = None + fall_back_option: Optional[RealTimeFallbackOption] = None + + ## What to load + load_spot: bool = False + load_forward: bool = False + load_dividend: bool = False + load_rates: bool = False + load_option_spot: bool = False + load_vol: bool = False + load_greek: bool = False + undo_adjust: bool = True + + ## Provided inputs + spot_timeseries: Optional[SpotResult] = None + forward_timeseries: Optional[ForwardResult] = None + dividend_timeseries: Optional[DividendsResult] = None + rates_timeseries: Optional[RatesResult] = None + option_spot_timeseries: Optional[OptionSpotResult] = None + vol_timeseries: Optional[VolatilityResult] = None + greek_timeseries: Optional[GreekResultSet] = None + + def __post_init__(self): + ## Validation + + ## Dates: + if self.rt: + self.on_date = True + self.as_of = datetime.now().date() + + if all(date is not None for date in [self.start_date, self.end_date, self.as_of]): + raise ValueError("Only pass start_date and end_date or as_of, not both.") + + if all(date is None for date in [self.start_date, self.end_date, self.as_of]): + raise ValueError("Either start_date and end_date or as_of must be provided.") + + if self.start_date is not None and self.end_date is not None: + if pd.to_datetime(self.start_date) > pd.to_datetime(self.end_date): + raise ValueError("start_date must be earlier than or equal to end_date.") + + if self.as_of is not None: + if self.start_date is not None or self.end_date is not None: + raise ValueError("If as_of is provided, start_date and end_date must be None.") + self.as_of = pd.to_datetime(self.as_of) + self.start_date = self.as_of + self.end_date = self.as_of + self.on_date = True + + ## Option parameters + option_params = [self.expiration, self.strike, self.right] + option_params_str = ["expiration", "strike", "right"] + if self.load_greek or self.load_vol or self.load_option_spot: + for i, param in enumerate(option_params): + if param is None: + raise ValueError(f"{option_params_str[i]} must be provided when loading option data.") + + + if self.load_option_spot: + if self.strike is None or self.right is None: + raise ValueError("Strike and right must be provided when loading option spot data.") + + if self.model_price is None: + self.model_price = ModelPrice.MIDPOINT + + self._validate_provided_inputs() + + def _validate_provided_inputs(self): + validatees = [ + (self.load_spot, self.spot_timeseries, "load_spot", "spot_timeseries"), + (self.load_forward, self.forward_timeseries, "load_forward", "forward_timeseries"), + (self.load_dividend, self.dividend_timeseries, "load_dividend", "dividend_timeseries"), + (self.load_rates, self.rates_timeseries, "load_rates", "rates_timeseries"), + (self.load_option_spot, self.option_spot_timeseries, "load_option_spot", "option_spot_timeseries"), + (self.load_vol, self.vol_timeseries, "load_volatility", "vol_timeseries"), + (self.load_greek, self.greek_timeseries, "load_greek", "greek_timeseries") + ] + + for load_flag, timeseries, load_name, timeseries_name in validatees: + if load_flag and timeseries is not None: + if self._is_missing_dates(self.start_date, self.end_date, timeseries.timeseries): + logger.info(f"Provided {timeseries_name} timeseries has missing dates. Consider reloading without providing timeseries to fetch complete data.") + setattr(self, timeseries_name, None) + setattr(self, load_name, load_flag) # Keep the load flag as is given. Either way we will attempt to load from source, but if provided data is complete we will use it and skip loading from source. + else: + logger.info(f"Using provided {timeseries_name} timeseries for loading.") + setattr(self, load_name, False) # Prevent loading from source since we have provided data + + + def _is_missing_dates(self, start_date, end_date, series: pd.Series) -> bool: + missing_dates = get_missing_dates(_start=start_date, _end=end_date, x=series) + if missing_dates: + logger.warning(f"Missing dates in provided data: {missing_dates}") + return True + return False + + diff --git a/trade/datamanager/result.py b/trade/datamanager/result.py new file mode 100644 index 0000000..a6a9264 --- /dev/null +++ b/trade/datamanager/result.py @@ -0,0 +1,687 @@ +import pandas as pd +from dataclasses import dataclass, field +from typing import Any, Dict, Optional, List +from trade.optionlib.config.types import DivType +from ._enums import ( + GreekType, + OptionSpotEndpointSource, + OptionPricingModel, + VolatilityModel, + SeriesId, + ModelPrice, + RealTimeFallbackOption, + AVAILABLE_GREEKS +) +from .utils.date import DATE_HINT +from typeguard import check_type +from trade.helpers.helper import to_datetime +from typing import get_type_hints + + +@dataclass +class Result: + """Base class for all data manager result containers.""" + + model_input_keys: Optional[Dict[str, Any]] = None + rt: Optional[bool] = False + fallback_option: Optional[RealTimeFallbackOption] = None + + def __post_init__(self): + """Simple formatting""" + timeseries = getattr(self, "timeseries", None) + if timeseries is not None: + if isinstance(timeseries, (pd.Series, pd.DataFrame)): + timeseries.index.name = "datetime" + timeseries.index = to_datetime(timeseries.index) + + def _additional_repr_fields(self) -> Dict[str, Any]: + """Provides additional fields for string representation. Override in subclasses.""" + return {} + + def is_empty(self) -> bool: + """Checks if the result container has no data. Override in subclasses if needed.""" + raise NotImplementedError("is_empty method must be implemented in subclasses.") + + def __repr__(self) -> str: + """Returns string representation with additional fields from subclass.""" + additional_fields = self._additional_repr_fields() + if additional_fields: + fields_str = ", ".join(f"{k}={v!r}" for k, v in additional_fields.items()) + return f"{self.__class__.__name__}({fields_str})" + return f"{self.__class__.__name__}()" + + def __setattr__(self, name, value): + """Validates inputs on attribute set.""" + all_hints = get_type_hints(self.__class__) + hint = all_hints.get(name) + if hint is not None: + check_type(value, hint) + super().__setattr__(name, value) + + +@dataclass +class _EquityResultsBase(Result): + """Base class for equity-related result containers.""" + + symbol: Optional[str] = None + + def __repr__(self): + return super().__repr__() + + +@dataclass +class DividendsResult(_EquityResultsBase): + """Contains dividend schedule or yield data for a date range.""" + timeseries: Optional[pd.Series] = None + dividend_type: Optional[DivType] = None + key: Optional[str] = None + undo_adjust: Optional[bool] = None + + @property + def daily_discrete_dividends(self) -> Optional[pd.Series]: + if self.dividend_type == DivType.DISCRETE: + return self.timeseries + return None + + @daily_discrete_dividends.setter + def daily_discrete_dividends(self, value: Optional[pd.Series]) -> None: + self.timeseries = value + + @property + def daily_continuous_dividends(self) -> Optional[pd.Series]: + if self.dividend_type == DivType.CONTINUOUS: + return self.timeseries + return None + + @daily_continuous_dividends.setter + def daily_continuous_dividends(self, value: Optional[pd.Series]) -> None: + self.timeseries = value + + + ## For schedule timeseries, this will be the actual schedule keys + model_input_keys: Optional[Dict[str, Any]] = None + + def __repr__(self) -> str: + return super().__repr__() + + def is_empty(self) -> bool: + """Checks if dividend data is missing or empty.""" + if self.dividend_type == DivType.DISCRETE: + return self.daily_discrete_dividends is None or self.daily_discrete_dividends.empty + elif self.dividend_type == DivType.CONTINUOUS: + return self.daily_continuous_dividends is None or self.daily_continuous_dividends.empty + return True + + def _additional_repr_fields(self) -> Dict[str, Any]: + """Provides dividend-specific fields for string representation.""" + return { + "symbol": self.symbol, + "dividend_type": self.dividend_type, + "key": self.key, + "is_empty": self.is_empty(), + "undo_adjust": self.undo_adjust, + } + + def __setattr__(self, name, value): + + ## Intercept dataframe/series, and add name attribute if missing. Only add name for series. + ## Not ideal to do it here, but easier than finding all places where timeseries is set. + if name == "timeseries" and value is not None: + if isinstance(value, (pd.Series, pd.DataFrame)): + value.index.name = "datetime" + if isinstance(value, pd.Series): + if value.name is None: + value.name = "dividends" + + super().__setattr__(name, value) + +@dataclass +class RatesResult(Result): + """Contains risk-free rate data for a date range.""" + + symbol: Optional[str] = None + timeseries: Optional[pd.Series] = None + + @property + def daily_risk_free_rates(self) -> Optional[pd.Series]: + return self.timeseries + + @daily_risk_free_rates.setter + def daily_risk_free_rates(self, value: Optional[pd.Series]) -> None: + self.timeseries = value + + def is_empty(self) -> bool: + """Checks if rate data is missing or empty.""" + return self.timeseries is None or self.timeseries.empty + + def _additional_repr_fields(self): + """Provides rate-specific fields for string representation.""" + return { + "is_empty": self.is_empty(), + } + + def __repr__(self) -> str: + return super().__repr__() + + def __setattr__(self, name, value): + ## Intercept dataframe/series, and add name attribute if missing. Only add name for series. + ## Not ideal to do it here, but easier than finding all places where timeseries is set. + if name == "timeseries" and value is not None: + if isinstance(value, (pd.Series, pd.DataFrame)): + value.index.name = "datetime" + if isinstance(value, pd.Series): + if value.name is None: + value.name = "r" + + super().__setattr__(name, value) + + +@dataclass +class ForwardResult(_EquityResultsBase): + """Contains forward price data (discrete or continuous dividend model).""" + + timeseries: Optional[pd.Series] = None + dividend_type: Optional[DivType] = None + key: Optional[str] = None + dividend_result: Optional[DividendsResult] = None + undo_adjust: Optional[bool] = True + + ## Dividend schedule or yield model input keys + ## Rates model input keys + model_input_keys: Optional[Dict[str, Any]] = None + + @property + def daily_discrete_forward(self) -> Optional[pd.Series]: + if self.dividend_type == DivType.DISCRETE: + return self.timeseries + return None + + @daily_discrete_forward.setter + def daily_discrete_forward(self, value: Optional[pd.Series]) -> None: + self.timeseries = value + + @property + def daily_continuous_forward(self) -> Optional[pd.Series]: + if self.dividend_type == DivType.CONTINUOUS: + return self.timeseries + return None + + @daily_continuous_forward.setter + def daily_continuous_forward(self, value: Optional[pd.Series]) -> None: + self.timeseries = value + + + def is_empty(self) -> bool: + """Checks if forward price data is missing or empty.""" + if self.dividend_type == DivType.DISCRETE: + return self.daily_discrete_forward is None or self.daily_discrete_forward.empty + elif self.dividend_type == DivType.CONTINUOUS: + return self.daily_continuous_forward is None or self.daily_continuous_forward.empty + return True + + def _additional_repr_fields(self) -> Dict[str, Any]: + """Provides forward-specific fields for string representation.""" + return { + "symbol": self.symbol, + "is_empty": self.is_empty(), + "undo_adjust": self.undo_adjust, + "dividend_type": self.dividend_type, + "key": self.key, + } + + def __repr__(self) -> str: + return super().__repr__() + + def __setattr__(self, name, value): + ## Intercept dataframe/series, and add name attribute if missing. Only add name for series. + ## Not ideal to do it here, but easier than finding all places where timeseries is set. + if name == "timeseries" and value is not None: + if isinstance(value, (pd.Series, pd.DataFrame)): + value.index.name = "datetime" + if isinstance(value, pd.Series): + if value.name is None: + value.name = "forward" + + super().__setattr__(name, value) + + +@dataclass +class SpotResult(_EquityResultsBase): + """Contains spot price data with optional split adjustment information.""" + + timeseries: Optional[pd.Series] = None + undo_adjust: Optional[bool] = None + key: Optional[str] = None + + ## For spot timeseries. This is nothing but an indicator of the source of spot data. + model_input_keys: Optional[Dict[str, Any]] = None + + @property + def daily_spot(self) -> Optional[pd.Series]: + return self.timeseries + + @daily_spot.setter + def daily_spot(self, value: Optional[pd.Series]) -> None: + self.timeseries = value + + def is_empty(self) -> bool: + return self.daily_spot is None or self.daily_spot.empty + + def _additional_repr_fields(self) -> Dict[str, Any]: + """Provides spot-specific fields for string representation.""" + return { + "symbol": self.symbol, + "key": self.key, + "is_empty": self.is_empty(), + "undo_adjust": self.undo_adjust, + } + + def __repr__(self) -> str: + return super().__repr__() + + def __setattr__(self, name, value): + ## Intercept dataframe/series, and add name attribute if missing. Only add name for series. + ## Not ideal to do it here, but easier than finding all places where timeseries is set. + if name == "timeseries" and value is not None: + if isinstance(value, (pd.Series, pd.DataFrame)): + value.index.name = "datetime" + if isinstance(value, pd.Series): + if value.name is None: + value.name = "spot" if self.undo_adjust else "spot_unadjusted" + + super().__setattr__(name, value) + + +@dataclass +class _OptionResultsBase(Result): + """Base class for option-related result containers.""" + + symbol: Optional[str] = None + strike: Optional[float] = None + expiration: Optional[DATE_HINT] = None + right: Optional[str] = None + model_price: Optional[ModelPrice] = ModelPrice.MIDPOINT + + def _additional_repr_fields(self) -> Dict[str, Any]: + """Provides option-specific fields for string representation.""" + return { + "symbol": self.symbol, + "strike": self.strike, + "expiration": self.expiration, + "right": self.right, + "model_price": self.model_price, + } + + def __repr__(self) -> str: + """Delegates to base Result repr.""" + return super().__repr__() + +@dataclass +class _OptionModelResultsBase(_OptionResultsBase): + """Base class for option model result containers.""" + endpoint_source: Optional[OptionSpotEndpointSource] = None + market_model: Optional[OptionPricingModel] = None + vol_model: Optional[VolatilityModel] = None + dividend_type: Optional[DivType] = None + undo_adjust: Optional[bool] = None + + def __repr__(self) -> str: + """Delegates to base Result repr.""" + return super().__repr__() + + +@dataclass +class OptionSpotResult(_OptionResultsBase): + """Container for option spot price timeseries data.""" + + timeseries: Optional[pd.DataFrame] = None + key: Optional[str] = None + endpoint_source: Optional[OptionSpotEndpointSource] = None + + + ## For option spot timeseries, this will be the actual endpoint parameters + model_input_keys: Optional[Dict[str, Any]] = None + + @property + def daily_option_spot(self) -> Optional[pd.DataFrame]: + return self.timeseries + + @daily_option_spot.setter + def daily_option_spot(self, value: Optional[pd.DataFrame]) -> None: + self.timeseries = value + + @property + def price(self) -> pd.Series: + if self.rt: + return self.midpoint + + if not self.is_empty(): + if self.model_price == ModelPrice.CLOSE: + p = self.daily_option_spot.get("close") + elif self.model_price == ModelPrice.MIDPOINT: + p = self.daily_option_spot.get("midpoint") + elif self.model_price == ModelPrice.BID: + p = self.daily_option_spot.get("closebid") + elif self.model_price == ModelPrice.ASK: + p = self.daily_option_spot.get("closeask") + elif self.model_price == ModelPrice.OPEN: + p = self.daily_option_spot.get("open") + else: + p = self.daily_option_spot.get("midpoint") + else: + return pd.Series(name="price", index=pd.DatetimeIndex([]), dtype=float) + + if p is None: + raise ValueError(f"Requested model price '{self.model_price}' not found in option spot data. Available columns: {self.daily_option_spot.columns.tolist()}") + return p + + @property + def close(self) -> pd.Series: + if not self.is_empty(): + return self.daily_option_spot["close"] + else: + return pd.Series(name="close", index=pd.DatetimeIndex([]), dtype=float) + + @property + def midpoint(self) -> pd.Series: + if not self.is_empty(): + return self.daily_option_spot["midpoint"] + else: + return pd.Series(name="midpoint", index=pd.DatetimeIndex([]), dtype=float) + + def is_empty(self) -> bool: + """Checks if option spot data is missing or empty.""" + return self.daily_option_spot is None or self.daily_option_spot.empty + + def _additional_repr_fields(self) -> Dict[str, Any]: + """Provides metadata on data presence.""" + return { + "symbol": self.symbol, + "strike": self.strike, + "expiration": self.expiration, + "right": self.right, + "key": self.key, + "is_empty": self.is_empty(), + "endpoint_source": self.endpoint_source, + } + + def __repr__(self) -> str: + """Delegates to base Result repr.""" + return super().__repr__() + + def __setattr__(self, name, value): + ## Intercept dataframe/series, and add name attribute if missing. Only add name for series. + ## Not ideal to do it here, but easier than finding all places where timeseries is set. + if name == "timeseries" and value is not None: + if isinstance(value, (pd.Series, pd.DataFrame)): + value.index.name = "datetime" + if isinstance(value, pd.Series): + if value.name is None: + value.name = "option_spot" + + super().__setattr__(name, value) + + +@dataclass +class VolatilityResult(_OptionModelResultsBase): + """Contains volatility surface data.""" + + timeseries: Optional[pd.Series] = None + key: Optional[str] = None + model_input_keys: Optional[Dict[str, Any]] = None + + def is_empty(self) -> bool: + """Checks if volatility data is missing or empty.""" + return self.timeseries is None or self.timeseries.empty + + def _additional_repr_fields(self) -> Dict[str, Any]: + """Provides volatility-specific fields for string representation.""" + return { + "symbol": self.symbol, + "expiration": self.expiration, + "right": self.right, + "strike": self.strike, + "vol_model": self.vol_model, + "endpoint_source": self.endpoint_source, + "market_model": self.market_model, + "dividend_type": self.dividend_type, + "key": self.key, + "is_empty": self.is_empty(), + } + + def __repr__(self) -> str: + return super().__repr__() + + def __setattr__(self, name, value): + ## Intercept dataframe/series, and add name attribute if missing. Only add name for series. + ## Not ideal to do it here, but easier than finding all places where timeseries is set. + if name == "timeseries" and value is not None: + if isinstance(value, (pd.Series, pd.DataFrame)): + value.index.name = "datetime" + if isinstance(value, pd.Series): + if value.name is None: + value.name = "iv" + + super().__setattr__(name, value) + + +@dataclass +class GreekResultSet(_OptionModelResultsBase): + key: Optional[str] = None + timeseries: Optional[pd.DataFrame] = None + + def is_empty(self) -> bool: + return self.timeseries is None or self.timeseries.empty + + def _additional_repr_fields(self) -> Dict[str, Any]: + super_additional = super()._additional_repr_fields() + return { + **super_additional, + "Available Greeks": [g for g in AVAILABLE_GREEKS if self.timeseries is not None and g in self.timeseries.columns], + "empty": self.is_empty(), + } + + def __repr__(self): + return super().__repr__() + + @property + def delta(self) -> Optional[pd.Series]: + if self.timeseries is not None and GreekType.DELTA.value in self.timeseries.columns: + return self.timeseries[GreekType.DELTA.value] + return None + + @property + def gamma(self) -> Optional[pd.Series]: + if self.timeseries is not None and GreekType.GAMMA.value in self.timeseries.columns: + return self.timeseries[GreekType.GAMMA.value] + return None + + @property + def theta(self) -> Optional[pd.Series]: + if self.timeseries is not None and GreekType.THETA.value in self.timeseries.columns: + return self.timeseries[GreekType.THETA.value] + return None + + @property + def vega(self) -> Optional[pd.Series]: + if self.timeseries is not None and GreekType.VEGA.value in self.timeseries.columns: + return self.timeseries[GreekType.VEGA.value] + return None + + @property + def rho(self) -> Optional[pd.Series]: + if self.timeseries is not None and GreekType.RHO.value in self.timeseries.columns: + return self.timeseries[GreekType.RHO.value] + return None + + @property + def volga(self) -> Optional[pd.Series]: + if self.timeseries is not None and GreekType.VOLGA.value in self.timeseries.columns: + return self.timeseries[GreekType.VOLGA.value] + return None + + def __setattr__(self, name, value): + ## Intercept dataframe/series, and add name attribute if missing. Only add name for series. + ## Not ideal to do it here, but easier than finding all places where timeseries is set. + if name == "timeseries" and value is not None: + if isinstance(value, (pd.Series, pd.DataFrame)): + value.index.name = "datetime" + if isinstance(value, pd.Series): + if value.name is None: + value.name = "greeks" + + super().__setattr__(name, value) + + +@dataclass +class TheoreticalPriceResult(_OptionModelResultsBase): + timeseries: Optional[pd.Series] = None + + def is_empty(self) -> bool: + return self.timeseries is None or self.timeseries.empty + + def __repr__(self) -> str: + return super().__repr__() + + def __setattr__(self, name, value): + ## Intercept dataframe/series, and add name attribute if missing. Only add name for series. + ## Not ideal to do it here, but easier than finding all places where timeseries is set. + if name == "timeseries" and value is not None: + if isinstance(value, (pd.Series, pd.DataFrame)): + value.index.name = "datetime" + if isinstance(value, pd.Series): + if value.name is None: + value.name = "theoretical_price" + + super().__setattr__(name, value) + + + +@dataclass +class ScenariosResult(_OptionModelResultsBase): + grid: Optional[pd.DataFrame] = None + spot_scenarios: List[float] = field(default_factory=lambda: []) + vol_scenarios: List[float] = field(default_factory=lambda: []) + as_of: Optional[DATE_HINT] = None + + def is_empty(self) -> bool: + return self.grid is None or self.grid.empty + + def _additional_repr_fields(self): + return { + "symbol": self.symbol, + "expiration": self.expiration, + "right": self.right, + "strike": self.strike, + "market_model": self.market_model, + "dividend_type": self.dividend_type, + "num_spot_scenarios": len(self.spot_scenarios), + "num_vol_scenarios": len(self.vol_scenarios), + "is_empty": self.is_empty(), + } + + def __repr__(self) -> str: + return super().__repr__() +@dataclass +class ModelResultPack(Result): + """ + A container for various model result types. + """ + + ## Main Results + spot: Optional[SpotResult] = None + forward: Optional[ForwardResult] = None + dividend: Optional[DividendsResult] = None + rates: Optional[RatesResult] = None + option_spot: Optional[OptionSpotResult] = None + vol: Optional[VolatilityResult] = None + greek: Optional[GreekResultSet] = None + + ## Guiding Enums + series_id: Optional[SeriesId] = None + dividend_type: Optional[DivType] = None + undo_adjust: bool = True + endpoint_source: Optional[OptionSpotEndpointSource] = None + price: Optional[ModelPrice] = None + rt: Optional[bool] = False + on_date: Optional[bool] = False + + ## Diagnostic Info + time_to_load: Optional[Dict[str, float]] = None + + def _additional_repr_fields(self): + """Provides model-specific fields for string representation.""" + return { + "symbol": self.spot.symbol if self.spot else None, + "strike": self.option_spot.strike if self.option_spot else None, + "expiration": self.option_spot.expiration if self.option_spot else None, + "right": self.option_spot.right if self.option_spot else None, + "series_id": self.series_id, + "dividend_type": self.dividend_type, + "undo_adjust": self.undo_adjust, + "num_empty": sum( + 1 + for result in [ + self.spot, + self.forward, + self.dividend, + self.rates, + self.option_spot, + self.vol, + self.greek, + ] + if result is None or result.is_empty() + ), + } + + def __repr__(self) -> str: + return super().__repr__() + + def list_all_loaded(self) -> Dict[str, bool]: + return { + "spot": self.spot is not None and not self.spot.is_empty(), + "forward": self.forward is not None and not self.forward.is_empty(), + "dividend": self.dividend is not None and not self.dividend.is_empty(), + "rates": self.rates is not None and not self.rates.is_empty(), + "option_spot": self.option_spot is not None and not self.option_spot.is_empty(), + "vol": self.vol is not None and not self.vol.is_empty(), + "greek": self.greek is not None and not self.greek.is_empty(), + } + + def any_loaded(self) -> bool: + return any( + [ + self.spot is not None and not self.spot.is_empty(), + self.forward is not None and not self.forward.is_empty(), + self.dividend is not None and not self.dividend.is_empty(), + self.rates is not None and not self.rates.is_empty(), + self.option_spot is not None and not self.option_spot.is_empty(), + self.vol is not None and not self.vol.is_empty(), + self.greek is not None and not self.greek.is_empty(), + ] + ) + + def all_loaded(self) -> bool: + return all( + [ + self.spot is not None and not self.spot.is_empty(), + self.forward is not None and not self.forward.is_empty(), + self.dividend is not None and not self.dividend.is_empty(), + self.rates is not None and not self.rates.is_empty(), + self.option_spot is not None and not self.option_spot.is_empty(), + self.vol is not None and not self.vol.is_empty(), + self.greek is not None and not self.greek.is_empty(), + ] + ) + + # def all_passed_loaded(self, requested: List[str]) -> bool: + # mapping = { + # "spot": self.load_spot, + # "forward": self.load_forward, + # "dividend": self.load_dividend, + # "rates": self.load_rates, + # "option_spot": self.load_option_spot, + # "vol": self.load_vol, + # } + # return all([mapping[req] for req in requested if req in mapping]) + diff --git a/trade/datamanager/spot.py b/trade/datamanager/spot.py new file mode 100644 index 0000000..d23f5e6 --- /dev/null +++ b/trade/datamanager/spot.py @@ -0,0 +1,287 @@ +"""Spot price data management for options pricing with split adjustment support. + +This module provides the SpotDataManager class for retrieving spot (or split-adjusted +chain_spot) prices for equity symbols. Implements singleton pattern per symbol to +avoid redundant timeseries loading. + +Typical usage: + >>> spot_mgr = SpotDataManager("AAPL") + >>> result = spot_mgr.get_spot_timeseries( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... undo_adjust=True + ... ) + >>> prices = result.daily_spot +""" + +from datetime import datetime +from typing import Any, ClassVar, Optional, Union +from trade.datamanager.utils.date import is_available_on_date +from trade.helpers.Logging import setup_logger +import pandas as pd +from trade.datamanager.base import BaseDataManager, CacheSpec +from trade.datamanager.result import SpotResult +from trade.datamanager.vars import get_times_series, load_name +from trade.helpers.helper import change_to_last_busday, to_datetime +from trade.datamanager._enums import RealTimeFallbackOption, SeriesId +from trade.datamanager.utils.logging import get_logging_level +from trade.datamanager.utils.data_structure import _data_structure_sanitize + + +logger = setup_logger("trade.datamanager.spot", stream_log_level=get_logging_level()) +TS = get_times_series() # Load market timeseries data on module import to avoid circular imports +class SpotDataManager(BaseDataManager): + """Manages spot price retrieval for a specific symbol with split adjustment support. + + Provides access to spot prices (unadjusted) or chain_spot prices (split-adjusted) + from the global MarketTimeseries cache. Implements singleton pattern per symbol + to ensure efficient data access. + + Attributes: + CACHE_NAME: Class-level cache identifier for this manager type. + DEFAULT_SERIES_ID: Default historical series identifier. + INSTANCES: Class-level cache of manager instances per symbol. + symbol: The equity ticker symbol this manager handles. + + Examples: + >>> # Singleton access - same instance returned for same symbol + >>> spot_mgr1 = SpotDataManager("AAPL") + >>> spot_mgr2 = SpotDataManager("AAPL") + >>> assert spot_mgr1 is spot_mgr2 + + >>> # Get split-adjusted prices (chain_spot) + >>> result = spot_mgr1.get_spot_timeseries( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... undo_adjust=True + ... ) + >>> chain_spot = result.daily_spot + + >>> # Get unadjusted prices (spot) + >>> result = spot_mgr1.get_spot_timeseries( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... undo_adjust=False + ... ) + >>> spot = result.daily_spot + + >>> # Get price at specific datetime + >>> at_time_result = spot_mgr1.get_at_time("2025-01-15") + >>> price = at_time_result.close + """ + + CACHE_NAME: ClassVar[str] = "spot_data_manager" + DEFAULT_SERIES_ID: ClassVar["SeriesId"] = SeriesId.HIST + INSTANCES = {} + CACHE_SPEC: CacheSpec = CacheSpec(cache_fname=CACHE_NAME) + + def __new__(cls, symbol: str, *args: Any, **kwargs: Any) -> "SpotDataManager": + """Returns cached instance for symbol, creating new one if needed. + + Implements singleton pattern per symbol to ensure timeseries are loaded only once. + Automatically loads market timeseries data on first instantiation. + + Args: + symbol: Equity ticker symbol (e.g., "AAPL", "MSFT"). + *args: Additional positional arguments passed to __init__. + **kwargs: Additional keyword arguments passed to __init__. + + Returns: + Singleton SpotDataManager instance for the given symbol. + + Examples: + >>> mgr1 = SpotDataManager("AAPL") + >>> mgr2 = SpotDataManager("AAPL") + >>> assert mgr1 is mgr2 # Same instance + """ + if symbol not in cls.INSTANCES: + instance = super(SpotDataManager, cls).__new__(cls) + cls.INSTANCES[symbol] = instance + return cls.INSTANCES[symbol] + + def __init__( + self, symbol: str, *, enable_namespacing: bool = False + ) -> None: + """Initializes manager once per symbol instance. + + Sets up the data manager for the symbol. Only executes initialization logic + on first instantiation due to singleton pattern. + + Args: + symbol: Equity ticker symbol. + cache_spec: Optional cache configuration. Uses default if None. + enable_namespacing: If True, enables namespace isolation in cache keys. + + Examples: + >>> mgr = SpotDataManager("AAPL") + >>> mgr = SpotDataManager("AAPL", cache_spec=CacheSpec(expire_days=30)) + """ + if getattr(self, "_initialized", False): + return + self._initialized = True + super().__init__(enable_namespacing=enable_namespacing, symbol=symbol) + self.symbol = symbol + + def get_spot_timeseries( + self, + start_date: Union[datetime, str], + end_date: Union[datetime, str], + undo_adjust: bool = True, + ) -> SpotResult: + """Returns spot or chain_spot price series for date range from MarketTimeseries. + + Retrieves closing prices from the global MarketTimeseries cache. Returns either + split-adjusted (chain_spot) or unadjusted (spot) prices based on undo_adjust flag. + + Args: + start_date: Start of date range (YYYY-MM-DD string or datetime). + end_date: End of date range (YYYY-MM-DD string or datetime). + undo_adjust: If True, returns split-adjusted chain_spot prices. + If False, returns unadjusted spot prices. + + Returns: + SpotResult containing daily_spot Series indexed by datetime, plus metadata + (undo_adjust flag and cache key). + + Examples: + >>> spot_mgr = SpotDataManager("AAPL") + >>> # Get split-adjusted prices (recommended for backtesting) + >>> result = spot_mgr.get_spot_timeseries( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... undo_adjust=True + ... ) + >>> chain_spot = result.daily_spot + >>> print(chain_spot.head()) + datetime + 2025-01-02 155.32 + 2025-01-03 156.01 + ... + + >>> # Get unadjusted prices (for real-time pricing) + >>> result = spot_mgr.get_spot_timeseries( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... undo_adjust=False + ... ) + >>> spot = result.daily_spot + + Notes: + - chain_spot: Split-adjusted prices (use with undo_adjust=True dividends) + - spot: Unadjusted prices (use with undo_adjust=False dividends) + - Data loaded directly from global TS cache (no additional caching) + - Automatically filters to business days (excludes weekends/holidays) + """ + ## Load first + load_name(self.symbol) + + if undo_adjust: + spot_series = TS._get_chain_spot_timeseries(sym=self.symbol, start=start_date, end=end_date)["close"] + else: + spot_series = TS._get_spot_timeseries(sym=self.symbol, start=start_date, end=end_date)["close"] + + spot_series = _data_structure_sanitize( + spot_series, + start=start_date, + end=end_date, + source_name=f"{'chain_spot' if undo_adjust else 'spot'} timeseries for {self.symbol} from MarketTimeseries cache", + ) + result = SpotResult() + key = None # No caching key for now + result.daily_spot = spot_series + result.undo_adjust = undo_adjust + result.key = key + result.symbol = self.symbol + + return result + + def get_at_time( + self, + date: Union[datetime, str], + undo_adjust: bool = True, + fallback_option: Optional[RealTimeFallbackOption] = None, + ) -> SpotResult: + """Returns spot data at a specific datetime from MarketTimeseries. + + Retrieves comprehensive market data (OHLCV + other fields) for a specific date + or datetime. Useful for point-in-time lookups. + + Args: + date: Target date or datetime (YYYY-MM-DD string or datetime object). + + Returns: + AtIndexResult containing OHLCV data and other market fields at the + specified datetime. + + Examples: + >>> spot_mgr = SpotDataManager("AAPL") + >>> result = spot_mgr.get_at_time("2025-01-15") + >>> print(f"Close: ${result.close:.2f}") + Close: $156.45 + >>> print(f"Volume: {result.volume:,.0f}") + Volume: 45,123,000 + + >>> # Using datetime object + >>> from datetime import datetime + >>> result = spot_mgr.get_at_time(datetime(2025, 1, 15)) + >>> print(f"Open: ${result.open:.2f}, High: ${result.high:.2f}") + Open: $155.20, High: $157.80 + + Notes: + - Returns data as of market close for the specified date + - Delegates to global TS.get_at_index method + - Result includes open, high, low, close, volume, and other fields + """ + fallback_option = fallback_option or self.CONFIG.real_time_fallback_option + if not is_available_on_date(to_datetime(date).date()): + logger.warning( + f"Requested date {date} is not a business day or is a US holiday. Resorting to fallback option `{fallback_option}`." + ) + if fallback_option == RealTimeFallbackOption.RAISE_ERROR: + raise ValueError(f"Date {date} is not available for risk-free rate data.") + + if fallback_option == RealTimeFallbackOption.USE_LAST_AVAILABLE: + ## Move date back to last business day + ## Using only change_to_last_busday assumes input date is not business day or is holiday + ## Which the function would roll back + ## But there's a possibility input date is today's date but before market open + ## In that case we need to move back one more business day + date = change_to_last_busday(date - pd.tseries.offsets.BDay(1), time_of_day_aware=False) + else: + raise ValueError(f"Unsupported fallback option: {fallback_option}") + + ## Load first + load_name(self.symbol) + res = TS.get_at_index(sym=self.symbol, index=date) + container = SpotResult() + container.symbol = self.symbol + container.rt = True + container.timeseries = res.chain_spot if undo_adjust else res.spot + container.timeseries = container.timeseries.to_frame().T["close"] + container.undo_adjust = undo_adjust + container.timeseries.index = pd.to_datetime(container.timeseries.index, format="%Y-%m-%d") + container.fallback_option = fallback_option + return container + + def rt( + self, + fallback_option: Optional[RealTimeFallbackOption] = None, + undo_adjust: bool = True, + ) -> SpotResult: + """Returns the most recent spot price for the symbol. + + Retrieves the latest available spot price from the MarketTimeseries cache. + Useful for real-time pricing scenarios. + + Returns: + Most recent spot price as a float. + Examples: + >>> spot_mgr = SpotDataManager("AAPL") + >>> latest_price = spot_mgr.rt() + >>> print(f"Latest AAPL Price: ${latest_price:.2f}") + Latest AAPL Price: $158.23 + """ + + date = datetime.now() + at_index_result = self.get_at_time(date=date, undo_adjust=undo_adjust) + return at_index_result diff --git a/trade/datamanager/theo.py b/trade/datamanager/theo.py new file mode 100644 index 0000000..a27c4bf --- /dev/null +++ b/trade/datamanager/theo.py @@ -0,0 +1,961 @@ +"""Theoretical option pricing module for computing fair values and scenario analysis. + +This module provides functions for calculating theoretical option prices using various +pricing models (Black-Scholes-Merton, Cox-Ross-Rubinstein binomial) and performing +scenario analysis across different spot and volatility levels. It handles the complete +workflow including data loading, model selection, and result formatting. + +Key Features: + - Multiple pricing models: BSM, CRR binomial + - Support for American and European exercise styles + - Discrete and continuous dividend treatments + - Automatic data loading + - Scenario analysis (spot and volatility stress testing) + - P&L analysis capabilities + +Typical Usage: + >>> from trade.datamanager.theo import get_option_theoretical_price, calculate_scenarios + >>> from trade.optionlib.config.types import DivType + >>> from trade.datamanager._enums import OptionPricingModel + >>> + >>> # Get theoretical prices for an option over time + >>> result = get_option_theoretical_price( + ... symbol="AAPL", + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... strike=150.0, + ... expiration="2025-06-20", + ... right="c", + ... market_model=OptionPricingModel.BSM, + ... dividend_type=DivType.DISCRETE + ... ) + >>> print(result.timeseries.head()) + >>> + >>> # Run scenario analysis for risk management + >>> scenarios = calculate_scenarios( + ... symbol="AAPL", + ... as_of="2025-01-15", + ... strike=150.0, + ... expiration="2025-06-20", + ... right="c", + ... spot_scenarios=[0.9, 0.95, 1.0, 1.05, 1.1], + ... vol_scenarios=[-0.05, 0.0, 0.05], + ... return_pnl=True + ... ) + >>> print(scenarios.grid) +""" +from datetime import datetime +from itertools import product +import pandas as pd +from typing import Optional, Literal, Dict, List +from trade.datamanager.utils.model import ( + LoadRequest, + _load_model_data_timeseries, + DivType, + VolatilityModel, + OptionPricingModel, +) +from trade.helpers.helper import time_distance_helper +from trade.datamanager.config import OptionDataConfig +from trade.datamanager.result import ( + VolatilityResult, + ForwardResult, + RatesResult, + OptionSpotResult, + SpotResult, + DividendsResult, + TheoreticalPriceResult, + ScenariosResult, +) +from trade.datamanager._enums import ( + OptionSpotEndpointSource, + ModelPrice, +) +from trade.datamanager.utils.model import _adjust_div_yield_for_spot_shock +from trade.datamanager.utils.date import DATE_HINT +from trade.optionlib.assets.dividend import ( + vectorized_discrete_pv, + get_vectorized_continuous_dividends, + vector_convert_to_time_frac, +) +from trade.datamanager.utils.date import sync_date_index, to_datetime +from trade.helpers.Logging import setup_logger +from trade.optionlib.pricing.binomial import vector_crr_binomial_pricing +from trade.optionlib.pricing.black_scholes import black_scholes_vectorized +from trade.optionlib.assets.forward import vectorized_forward_continuous, vectorized_forward_discrete +from trade.datamanager.utils.logging import get_logging_level, register_to_factor_list +from trade.datamanager.vars import DEFAULT_SCENARIOS, DEFAULT_VOL_SCENARIOS + +logger = setup_logger("trade.datamanager.theo", stream_log_level=get_logging_level()) +register_to_factor_list("trade.datamanager.theo") +CONFIG = OptionDataConfig() + + +def _create_load_request( + ## Requied parameters to ensure correct data is loaded + symbol: str, + expiration: DATE_HINT, + strike: float, + right: str, + dividend_type: DivType, + market_model: OptionPricingModel, + endpoint_source: OptionSpotEndpointSource, + model_price: ModelPrice, + is_scenario_load: bool = False, + *, + ## Optional pre-loaded data. If not provided, will be loaded. + start_date: Optional[DATE_HINT] = None, + end_date: Optional[DATE_HINT] = None, + as_of: Optional[DATE_HINT] = None, + rt: Optional[bool] = False, + s: Optional[SpotResult] = None, + r: Optional[RatesResult] = None, + f: Optional[ForwardResult] = None, + d: Optional[DividendsResult] = None, + vol: Optional[VolatilityResult] = None, + option_spot: Optional[OptionSpotResult] = None, + undo_adjust: bool = True, +) -> LoadRequest: + """Create a LoadRequest specifying which market data to load for theoretical pricing. + + Internal utility that determines which data sources need to be loaded based on: + 1. Which data is already provided (pre-loaded) + 2. Which pricing model is being used (BSM needs forwards, binomial needs spot) + 3. Whether this is a scenario load (requires additional data) + + Args: + start_date: First valuation date (YYYY-MM-DD string or datetime). + end_date: Last valuation date (YYYY-MM-DD string or datetime). + symbol: Ticker symbol for the underlying asset. + expiration: Option expiration date (YYYY-MM-DD string or datetime). + strike: Strike price of the option. + right: Option type ('c' for call, 'p' for put). + dividend_type: Dividend treatment type (DISCRETE or CONTINUOUS). + market_model: Pricing model (BSM or BINOMIAL). + endpoint_source: Option data source (ORATS, HIST, QUOTE). + model_price: Which price to use (CLOSE, OPEN, MIDPOINT). + is_scenario_load: If True, loads option_spot for base price comparison. + s: Optional pre-loaded spot data. If None, will be loaded. + r: Optional pre-loaded rates data. If None, will be loaded. + f: Optional pre-loaded forward data. If None, will be loaded (BSM only). + d: Optional pre-loaded dividend data. If None, will be loaded. + vol: Optional pre-loaded volatility data. If None, will be loaded. + option_spot: Optional pre-loaded option market prices. If None, loaded for scenarios. + undo_adjust: If True, uses split-adjusted prices. + + Returns: + LoadRequest object with flags indicating which data sources to load. + + Examples: + >>> # Internal usage - creates request for theoretical pricing + >>> request = _create_load_request( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... symbol="AAPL", + ... expiration="2025-06-20", + ... strike=150.0, + ... right="c", + ... dividend_type=DivType.DISCRETE, + ... market_model=OptionPricingModel.BSM, + ... endpoint_source=OptionSpotEndpointSource.HIST, + ... model_price=ModelPrice.CLOSE + ... ) + >>> # request.load_spot = True (BSM needs spot for forward calc) + >>> # request.load_vol = True (no vol provided) + """ + if is_scenario_load: + ## For scenario loads, always load all data to ensure completeness. + load_spot = s is None + load_vol = vol is None + load_dividend = d is None + load_rates = r is None + option_spot = option_spot is None + load_forward = False ## Not needed for scenario load + else: + ## For regular loads, determine based on provided data and model needs. + load_spot = (s is None) and (market_model == OptionPricingModel.BINOMIAL) + load_vol = vol is None + load_dividend = d is None + load_rates = r is None + option_spot = False ## Not needed for greek calculation + load_forward = (market_model == OptionPricingModel.BSM) and (f is None) + + req = LoadRequest( + symbol=symbol, + start_date=start_date, + end_date=end_date, + expiration=expiration, + strike=strike, + right=right, + dividend_type=dividend_type, + endpoint_source=endpoint_source, + vol_model=VolatilityModel.MARKET, + model_price=model_price, + market_model=market_model, + + ## Load spot only if missing. + load_spot=load_spot, + + ## Load forward only if missing and using BSM model. Binomial uses spot price. + load_forward=load_forward, + load_vol=load_vol, + load_dividend=load_dividend, + load_rates=load_rates, + + ## Not needed for greek calculation + load_option_spot=option_spot, + undo_adjust=undo_adjust, + + ## Real-time/Date flag + rt=rt, + as_of=as_of, + ) + return req + + +def get_option_theoretical_price( + symbol: str, + strike: float, + expiration: DATE_HINT, + right: Literal["c", "p"], + *, + start_date: Optional[DATE_HINT] = None, + end_date: Optional[DATE_HINT] = None, + as_of: Optional[DATE_HINT] = None, + market_model: Optional[OptionPricingModel] = None, + endpoint_source: OptionSpotEndpointSource = None, + dividend_type: Optional[DivType] = None, + vol: Optional[VolatilityResult] = None, + model_price: Optional[ModelPrice] = None, + spot: Optional[SpotResult] = None, + f: Optional[ForwardResult] = None, + r: Optional[RatesResult] = None, + d: Optional[DividendsResult] = None, + undo_adjust: bool = True, + n_steps: Optional[int] = None, + rt: Optional[bool] = False, +) -> TheoreticalPriceResult: + """Calculate theoretical option prices over a date range using specified pricing model. + + Computes fair value option prices for each business day in [start_date, end_date] + using either BSM or binomial pricing models. Automatically loads required market + data (spot, volatility, rates, dividends) if not provided. + + Args: + symbol: Ticker symbol for the underlying asset (e.g., "AAPL", "MSFT"). + start_date: First valuation date (YYYY-MM-DD string or datetime). + end_date: Last valuation date (YYYY-MM-DD string or datetime). + as_of: Specific date for single-date pricing (YYYY-MM-DD string or datetime). + strike: Strike price of the option. + expiration: Option expiration date (YYYY-MM-DD string or datetime). + right: Option type ('c' for call, 'p' for put). + market_model: OptionPricingModel.BSM or BINOMIAL. Defaults to CONFIG setting. + endpoint_source: Option data source for volatility (ORATS, HIST, QUOTE). + Defaults to CONFIG setting. + dividend_type: DivType.DISCRETE or DivType.CONTINUOUS. Defaults to CONFIG setting. + vol: Optional pre-computed implied volatilities. If None, loads automatically. + model_price: Which price to use (CLOSE, OPEN, MIDPOINT). Defaults to CONFIG setting. + spot: Optional pre-computed spot prices. If None, loads automatically. + f: Optional pre-computed forward prices. If None, loads automatically (BSM only). + r: Optional pre-computed risk-free rates. If None, loads automatically. + d: Optional pre-computed dividend data. If None, loads automatically. + undo_adjust: If True, uses split-adjusted prices. + n_steps: Number of time steps for binomial tree. Defaults to CONFIG.n_steps. + as_of: Specific date for single-date pricing (YYYY-MM-DD string or datetime). = None, + rt: If True, prices as of current real-time data. + + Returns: + TheoreticalPriceResult containing daily theoretical prices as Series with + DatetimeIndex, plus model metadata. + + Examples: + >>> # Basic usage with BSM model + >>> result = get_option_theoretical_price( + ... symbol="AAPL", + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... strike=150.0, + ... expiration="2025-06-20", + ... right="c", + ... market_model=OptionPricingModel.BSM, + ... dividend_type=DivType.DISCRETE + ... ) + >>> print(result.timeseries.head()) + + >>> # American option with binomial model + >>> result = get_option_theoretical_price( + ... symbol="AAPL", + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... strike=150.0, + ... expiration="2025-06-20", + ... right="p", + ... market_model=OptionPricingModel.BINOMIAL, + ... n_steps=200 + ... ) + + >>> # Provide pre-computed volatility + >>> from trade.datamanager.vol import VolDataManager + >>> vol_mgr = VolDataManager("AAPL") + >>> vol_result = vol_mgr.get_implied_volatility_timeseries( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... expiration="2025-06-20", + ... strike=150.0, + ... right="c" + ... ) + >>> theo_result = get_option_theoretical_price( + ... symbol="AAPL", + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... strike=150.0, + ... expiration="2025-06-20", + ... right="c", + ... vol=vol_result + ... ) + """ + + if not as_of and not rt and (not start_date or not end_date): + raise ValueError("Either 'as_of', rt=True, or both 'start_date' and 'end_date' must be provided.") + + market_model = market_model or CONFIG.option_model + endpoint_source = endpoint_source or CONFIG.option_spot_endpoint_source + dividend_type = dividend_type or CONFIG.dividend_type + vol_model = CONFIG.volatility_model + model_price = model_price or CONFIG.model_price + n_steps = n_steps or CONFIG.n_steps + result = TheoreticalPriceResult() + result.dividend_type = dividend_type + result.market_model = market_model + result.model_price = model_price + result.vol_model = vol_model + result.endpoint_source = endpoint_source + result.expiration = to_datetime(expiration) + result.right = right + result.strike = strike + result.symbol = symbol + result.rt = rt + result.undo_adjust = undo_adjust + + # Create load request to determine which data to load + load_request = _create_load_request( + symbol=symbol, + start_date=start_date, + end_date=end_date, + expiration=expiration, + strike=strike, + right=right, + dividend_type=dividend_type, + market_model=market_model, + endpoint_source=endpoint_source, + model_price=model_price, + s=spot, + f=f, + r=r, + vol=vol, + is_scenario_load=False, + rt=rt, + as_of=as_of, + ) + + # Load required market data + packet = _load_model_data_timeseries(load_request) + + # Extract time series data, using provided data if available + s, r, vol, d, f = ( + packet.spot.timeseries + if not packet.spot.is_empty() + else spot.timeseries + if spot is not None + else pd.Series(dtype=float), + packet.rates.timeseries + if not packet.rates.is_empty() + else r.timeseries + if r is not None + else pd.Series(dtype=float), + packet.vol.timeseries + if not packet.vol.is_empty() + else vol.timeseries + if vol is not None + else pd.Series(dtype=float), + packet.dividend.timeseries + if not packet.dividend.is_empty() + else d.timeseries + if d is not None + else pd.Series(dtype=float), + packet.forward.timeseries + if not packet.forward.is_empty() + else f.timeseries + if f is not None + else pd.Series(dtype=float), + ) + + # Use loaded data to calculate theoretical prices + if market_model == OptionPricingModel.BINOMIAL: + s, vol, r, d = sync_date_index(s, vol, r, d) + t = time_distance_helper(start=s.index, end=[expiration] * len(s)) + if dividend_type == DivType.DISCRETE: + discrete = vector_convert_to_time_frac( + schedules=d.values, + valuation_dates=d.index, + end_dates=[to_datetime(expiration)] * len(s), + ) + dividend_yield = [0.0] * len(s) + else: + discrete = [()] * len(s) + dividend_yield = d.values + + prices = vector_crr_binomial_pricing( + K=[strike] * len(s), + T=t, + sigma=vol.values, + r=r.values, + N=[n_steps] * len(s), + S0=s.values, + right=[right] * len(s), + american=[True] * len(s), + dividend_yield=dividend_yield, + dividends=discrete, + dividend_type=[dividend_type.value] * len(s), + ) + result.timeseries = pd.Series(data=prices, index=s.index, name="theoretical_price", dtype=float) + return result + + elif market_model == OptionPricingModel.BSM: + f, vol, r, d = ( + packet.forward.timeseries, + packet.vol.timeseries, + packet.rates.timeseries, + packet.dividend.timeseries, + ) + f, vol, r, d = sync_date_index(f, vol, r, d) + t = time_distance_helper(start=f.index, end=[expiration] * len(f)) + prices = black_scholes_vectorized( + F=f.values, + K=[strike] * len(f), + T=t, + r=r.values, + sigma=vol.values, + option_type=[right] * len(f), + ) + result.timeseries = pd.Series(data=prices, index=f.index, name="theoretical_price", dtype=float) + return result + + +def _calculate_binomial_scenarios( + base_prices: pd.Series, + s: pd.Series, + strike: float, + expiration: DATE_HINT, + right: Literal["c", "p"], + vol: pd.Series, + r: pd.Series, + dividend_type: DivType, + dividends: pd.Series, + spot_scenarios: List[float] = None, + vol_scenarios: List[float] = None, + return_pnl: bool = False, + return_pnl_in_pct: bool = False, + n_steps: int = None, + prettify_columns: bool = False, +) -> pd.DataFrame: + """Calculate option price scenarios using Cox-Ross-Rubinstein binomial model. + + Internal function that computes option prices across a grid of spot and volatility + scenarios. Spot scenarios are multiplicative (e.g., 0.9 = 10% down, 1.1 = 10% up). + Volatility scenarios are additive (e.g., 0.05 = +5% vol, -0.05 = -5% vol). + + Args: + base_prices: Current market prices of the option (single-date Series). + s: Current spot prices (single-date Series). + strike: Strike price of the option. + expiration: Option expiration date (YYYY-MM-DD string or datetime). + right: Option type ('c' for call, 'p' for put). + vol: Current implied volatilities (single-date Series). + r: Risk-free interest rates (single-date Series). + dividend_type: Dividend treatment type (DISCRETE or CONTINUOUS). + dividends: Dividend data (schedules for DISCRETE, yields for CONTINUOUS). + spot_scenarios: List of spot price multipliers. E.g., [0.9, 1.0, 1.1] tests + spot -10%, unchanged, +10%. Defaults to [1.0]. + vol_scenarios: List of volatility adjustments. E.g., [-0.05, 0.0, 0.05] tests + vol -5%, unchanged, +5%. Defaults to [0.0]. + return_pnl: If True, returns P&L relative to base_prices instead of absolute prices. + return_pnl_in_pct: If True (with return_pnl=True), returns P&L as percentage. + n_steps: Number of time steps in binomial tree. + prettify_columns: If True, formats column/index labels for display. + + Returns: + DataFrame with volatility scenarios as rows, spot scenarios as columns, and + option prices (or P&L) as values. + + Raises: + AssertionError: If neither spot_scenarios nor vol_scenarios provided. + AssertionError: If input series contain more than one date. + + Examples: + >>> # Internal usage - calculate scenario grid + >>> scenarios_df = _calculate_binomial_scenarios( + ... base_prices=pd.Series([10.5]), + ... s=pd.Series([150.0]), + ... strike=150.0, + ... expiration="2025-06-20", + ... right="c", + ... vol=pd.Series([0.25]), + ... r=pd.Series([0.05]), + ... dividend_type=DivType.DISCRETE, + ... dividends=pd.Series([Schedule()]), + ... spot_scenarios=[0.9, 0.95, 1.0, 1.05, 1.1], + ... vol_scenarios=[-0.05, 0.0, 0.05], + ... n_steps=100, + ... prettify_columns=True + ... ) + """ + assert any([spot_scenarios, vol_scenarios]), "At least one of spot_scenarios or vol_scenarios must be provided." + assert len(vol.index) == 1, "Spot scenarios calculation only supports single-date series." + + ## Default scenarios + if spot_scenarios is None: + spot_scenarios = [1.0] + if vol_scenarios is None: + vol_scenarios = [0.0] + + ## Sync all data to same index + s, vol, r, dividends, base_prices = sync_date_index(s, vol, r, dividends, base_prices) + scenario_prices: Dict[str, pd.Series] = {} + + ## Define pricing function for reuse + def price_func( + scenario_spot: pd.Series, + scenario_vol: pd.Series, + expiration: DATE_HINT, + right: Literal["c", "p"], + strike: float, + dividend_type: DivType, + dividends: pd.Series, + n_steps: int, + r: pd.Series, + ) -> pd.Series: + t = time_distance_helper(start=scenario_spot.index, end=[expiration] * len(scenario_spot)) + if dividend_type == DivType.DISCRETE: + discrete = vector_convert_to_time_frac( + schedules=dividends.values, + valuation_dates=scenario_spot.index, + end_dates=[to_datetime(expiration)] * len(scenario_spot), + ) + dividend_yield = [0.0] * len(scenario_spot) + else: + discrete = [()] * len(scenario_spot) + dividend_yield = dividends.values + + prices = vector_crr_binomial_pricing( + K=[strike] * len(scenario_spot), + T=t, + sigma=scenario_vol.values, + r=r.values, + N=[n_steps] * len(scenario_spot), + S0=scenario_spot.values, + right=[right] * len(scenario_spot), + american=[True] * len(scenario_spot), + dividend_yield=dividend_yield, + dividends=discrete, + dividend_type=[dividend_type.value] * len(scenario_spot), + ) + return pd.Series(data=prices, index=scenario_spot.index, name="theoretical_price", dtype=float) + + ## Calculate prices for each scenario + scenarios = list(product(spot_scenarios, vol_scenarios)) + for spot_mult, vol_add in scenarios: + scenario_spot = s * spot_mult + scenario_vol = vol + vol_add + if dividend_type == DivType.CONTINUOUS: + adjusted_dividends = _adjust_div_yield_for_spot_shock(spot_mult, dividends) + else: + adjusted_dividends = dividends + + prices = price_func( + scenario_spot, scenario_vol, expiration, right, strike, dividend_type, adjusted_dividends, n_steps, r + ) + prices = prices[0] + if return_pnl: + prices = prices - base_prices[0] + if return_pnl_in_pct: + prices = prices / base_prices[0] + scenario_prices.setdefault(spot_mult, []).append(prices) + + df = pd.DataFrame(scenario_prices, index=vol_scenarios) + if prettify_columns: + df.columns = [f"Spot x{col:.2f}" for col in df.columns] + df.index = [f"Vol {'+' if idx > 0 else ''}{idx:.2%}" for idx in df.index] + return df + + +def _calculate_bsm_scenarios( + base_prices: pd.Series, + s: pd.Series, + strike: float, + expiration: DATE_HINT, + right: Literal["c", "p"], + vol: pd.Series, + r: pd.Series, + dividend_type: DivType, + pv_divs: pd.Series = None, + q_factor: pd.Series = None, + spot_scenarios: List[float] = None, + vol_scenarios: List[float] = None, + return_pnl: bool = False, + return_pnl_in_pct: bool = False, + prettify_columns: bool = False, +) -> pd.DataFrame: + """Calculate option price scenarios using Black-Scholes-Merton model. + + Internal function that computes European-style option prices across a grid of spot + and volatility scenarios. Spot scenarios are multiplicative (e.g., 0.9 = 10% down, + 1.1 = 10% up). Volatility scenarios are additive (e.g., 0.05 = +5% vol, -0.05 = -5% vol). + + Args: + base_prices: Current market prices of the option (single-date Series). + s: Current spot prices (single-date Series). + strike: Strike price of the option. + expiration: Option expiration date (YYYY-MM-DD string or datetime). + right: Option type ('c' for call, 'p' for put). + vol: Current implied volatilities (single-date Series). + r: Risk-free interest rates (single-date Series). + dividend_type: Dividend treatment type (DISCRETE or CONTINUOUS). + pv_divs: Present value of discrete dividends (required if dividend_type=DISCRETE). + q_factor: Continuous dividend yield factor (required if dividend_type=CONTINUOUS). + spot_scenarios: List of spot price multipliers. E.g., [0.9, 1.0, 1.1] tests + spot -10%, unchanged, +10%. Defaults to [1.0]. + vol_scenarios: List of volatility adjustments. E.g., [-0.05, 0.0, 0.05] tests + vol -5%, unchanged, +5%. Defaults to [0.0]. + return_pnl: If True, returns P&L relative to base_prices instead of absolute prices. + return_pnl_in_pct: If True (with return_pnl=True), returns P&L as percentage. + prettify_columns: If True, formats column/index labels for display. + + Returns: + DataFrame with volatility scenarios as rows, spot scenarios as columns, and + option prices (or P&L) as values. + + Raises: + AssertionError: If neither spot_scenarios nor vol_scenarios provided. + AssertionError: If input series contain more than one date. + AssertionError: If pv_divs not provided when dividend_type=DISCRETE. + AssertionError: If q_factor not provided when dividend_type=CONTINUOUS. + + Examples: + >>> # Internal usage - calculate scenario grid + >>> scenarios_df = _calculate_bsm_scenarios( + ... base_prices=pd.Series([10.5]), + ... s=pd.Series([150.0]), + ... strike=150.0, + ... expiration="2025-06-20", + ... right="c", + ... vol=pd.Series([0.25]), + ... r=pd.Series([0.05]), + ... dividend_type=DivType.DISCRETE, + ... pv_divs=pd.Series([2.5]), + ... spot_scenarios=[0.9, 0.95, 1.0, 1.05, 1.1], + ... vol_scenarios=[-0.05, 0.0, 0.05], + ... prettify_columns=True + ... ) + """ + assert any([spot_scenarios, vol_scenarios]), "At least one of spot_scenarios or vol_scenarios must be provided." + assert len(vol.index) == 1, "Spot scenarios calculation only supports single-date series." + + ## Default scenarios + if spot_scenarios is None: + spot_scenarios = [1.0] + if vol_scenarios is None: + vol_scenarios = [0.0] + + if dividend_type == DivType.CONTINUOUS: + assert q_factor is not None, "For continuous dividends, q_factor must be provided." + dividends = q_factor + else: + assert pv_divs is not None, "For discrete dividends, pv_divs must be provided." + dividends = pv_divs + + ## Sync all data to same index + s, vol, r, dividends, base_prices = sync_date_index(s, vol, r, dividends, base_prices) + scenario_prices: Dict[str, pd.Series] = {} + + ## Define pricing function for reuse + def price_func( + scenario_spot: pd.Series, + scenario_vol: pd.Series, + expiration: DATE_HINT, + right: Literal["c", "p"], + strike: float, + ) -> pd.Series: + t = time_distance_helper(start=scenario_spot.index, end=[expiration] * len(scenario_spot)) + if dividend_type == DivType.CONTINUOUS: + F = vectorized_forward_continuous( + S=scenario_spot.values, + r=r.values, + q_factor=dividends.values, + T=t, + ) + else: + F = vectorized_forward_discrete( + S=scenario_spot.values, + r=r.values, + pv_divs=dividends.values, + T=t, + ) + prices = black_scholes_vectorized( + F=F, + K=[strike] * len(scenario_spot), + T=t, + r=r.values, + sigma=scenario_vol.values, + option_type=[right] * len(scenario_spot), + ) + return pd.Series(data=prices, index=scenario_spot.index, name="theoretical_price", dtype=float) + + ## Calculate prices for each scenarios + scenarios = list(product(spot_scenarios, vol_scenarios)) + for spot_mult, vol_add in scenarios: + scenario_spot = s * spot_mult + scenario_vol = vol + vol_add + + prices = price_func(scenario_spot, scenario_vol, expiration, right, strike) + prices = prices[0] + if return_pnl: + prices = prices - base_prices[0] + if return_pnl_in_pct: + prices = prices / base_prices[0] + scenario_prices.setdefault(spot_mult, []).append(prices) + + df = pd.DataFrame(scenario_prices, index=vol_scenarios) + if prettify_columns: + df.columns = [f"Spot x{col:.2f}" for col in df.columns] + df.index = [f"Vol {'+' if idx > 0 else ''}{idx:.2%}" for idx in df.index] + return df + + +def calculate_scenarios( + symbol: str, + strike: float, + expiration: DATE_HINT, + right: Literal["c", "p"], + as_of: Optional[DATE_HINT] = None, + spot_scenarios: Optional[List[float]] = None, + vol_scenarios: Optional[List[float]] = None, + *, + rt: Optional[bool] = False, + market_model: Optional[OptionPricingModel] = None, + endpoint_source: OptionSpotEndpointSource = None, + dividend_type: Optional[DivType] = None, + vol: Optional[VolatilityResult] = None, + model_price: Optional[ModelPrice] = None, + spot: Optional[SpotResult] = None, + option_spot: Optional[OptionSpotResult] = None, + r: Optional[RatesResult] = None, + d: Optional[DividendsResult] = None, + undo_adjust: bool = True, + n_steps: Optional[int] = None, + prettify_columns: bool = False, + return_pnl: bool = False, + return_pnl_in_pct: bool = False, +) -> ScenariosResult: + """Calculate option price scenarios across spot and volatility stress levels. + + Performs scenario analysis by computing option prices across a grid of spot price + and volatility levels. Useful for risk management, stress testing, and understanding + option P&L sensitivity. Can return absolute prices or P&L relative to current market. + + Args: + symbol: Ticker symbol for the underlying asset (e.g., "AAPL", "MSFT"). + as_of: Valuation date for scenario analysis (YYYY-MM-DD string or datetime). + strike: Strike price of the option. + expiration: Option expiration date (YYYY-MM-DD string or datetime). + right: Option type ('c' for call, 'p' for put). + spot_scenarios: List of spot price multipliers. E.g., [0.9, 0.95, 1.0, 1.05, 1.1] + tests spot at -10%, -5%, unchanged, +5%, +10%. Defaults to DEFAULT_SCENARIOS. + vol_scenarios: List of volatility adjustments (absolute). E.g., [-0.1, -0.05, 0.0, 0.05, 0.1] + tests vol at -10%, -5%, unchanged, +5%, +10%. Defaults to DEFAULT_VOL_SCENARIOS. + market_model: OptionPricingModel.BSM or BINOMIAL. Defaults to CONFIG setting. + endpoint_source: Option data source for volatility (ORATS, HIST, QUOTE). + Defaults to CONFIG setting. + dividend_type: DivType.DISCRETE or DivType.CONTINUOUS. Defaults to CONFIG setting. + vol: Optional pre-computed implied volatilities. If None, loads automatically. + model_price: Which price to use (CLOSE, OPEN, MIDPOINT). Defaults to CONFIG setting. + spot: Optional pre-computed spot prices. If None, loads automatically. + option_spot: Optional pre-computed option market prices. If None, loads automatically. + r: Optional pre-computed risk-free rates. If None, loads automatically. + d: Optional pre-computed dividend data. If None, loads automatically. + undo_adjust: If True, uses split-adjusted prices. + n_steps: Number of time steps for binomial tree. Defaults to CONFIG.n_steps. + prettify_columns: If True, formats grid labels for display ("Spot x0.95", "Vol +5.00%"). + return_pnl: If True, returns P&L relative to current market price. + return_pnl_in_pct: If True (with return_pnl=True), returns P&L as percentage of market price. + rt: If True, uses real-time data where available (default False). + + Returns: + ScenariosResult containing DataFrame grid with volatility scenarios as rows, + spot scenarios as columns, and prices/P&L as values, plus model metadata. + + Examples: + >>> # Basic scenario analysis + >>> result = calculate_scenarios( + ... symbol="AAPL", + ... as_of="2025-01-15", + ... strike=150.0, + ... expiration="2025-06-20", + ... right="c", + ... spot_scenarios=[0.9, 0.95, 1.0, 1.05, 1.1], + ... vol_scenarios=[-0.05, 0.0, 0.05], + ... prettify_columns=True + ... ) + >>> print(result.grid) + >>> + >>> # P&L analysis for risk management + >>> pnl_result = calculate_scenarios( + ... symbol="AAPL", + ... as_of="2025-01-15", + ... strike=150.0, + ... expiration="2025-06-20", + ... right="p", + ... spot_scenarios=[0.8, 0.9, 1.0, 1.1, 1.2], + ... vol_scenarios=[-0.1, 0.0, 0.1], + ... return_pnl=True, + ... return_pnl_in_pct=True, + ... prettify_columns=True + ... ) + >>> print(f"Worst case: {pnl_result.grid.min().min():.2%}") + >>> + >>> # Custom stress scenarios with binomial model + >>> result = calculate_scenarios( + ... symbol="AAPL", + ... as_of="2025-01-15", + ... strike=150.0, + ... expiration="2025-06-20", + ... right="c", + ... spot_scenarios=[0.7, 0.85, 1.0, 1.15, 1.3], + ... vol_scenarios=[-0.15, -0.075, 0.0, 0.075, 0.15], + ... market_model=OptionPricingModel.BINOMIAL, + ... n_steps=200, + ... return_pnl=True + ... ) + """ + if not as_of and not rt: + raise ValueError("Either as_of date must be provided or rt=True for real-time data.") + + market_model = market_model or CONFIG.option_model + endpoint_source = endpoint_source or CONFIG.option_spot_endpoint_source + dividend_type = dividend_type or CONFIG.dividend_type + vol_model = vol or CONFIG.volatility_model + model_price = model_price or CONFIG.model_price + n_steps = n_steps or CONFIG.n_steps + spot_scenarios = spot_scenarios or DEFAULT_SCENARIOS + vol_scenarios = vol_scenarios or DEFAULT_VOL_SCENARIOS + result = ScenariosResult() + + result.dividend_type = dividend_type + result.market_model = market_model + result.model_price = model_price + result.vol_model = vol_model + result.endpoint_source = endpoint_source + result.expiration = to_datetime(expiration) + result.right = right + result.strike = strike + result.symbol = symbol + result.rt = False + result.undo_adjust = undo_adjust + result.spot_scenarios = spot_scenarios + result.vol_scenarios = vol_scenarios + result.as_of = to_datetime(as_of) if not rt else datetime.now() + result.rt = rt + + # Create load request to determine which data to load + load_request = _create_load_request( + symbol=symbol, + expiration=expiration, + strike=strike, + right=right, + dividend_type=dividend_type, + market_model=market_model, + endpoint_source=endpoint_source, + model_price=model_price, + s=spot, + r=r, + d=d, + vol=vol, + option_spot=option_spot, + is_scenario_load=True, + undo_adjust=undo_adjust, + as_of=as_of, + rt=rt, + ) + + # Load required market data + packet = _load_model_data_timeseries(load_request) + + s, r, vol, base_prices, d = ( + packet.spot.timeseries if not packet.spot.is_empty() else spot.timeseries, + packet.rates.timeseries if not packet.rates.is_empty() else r.timeseries, + packet.vol.timeseries if not packet.vol.is_empty() else vol.timeseries, + packet.option_spot.price if not packet.option_spot.is_empty() else option_spot.price, + packet.dividend.timeseries if not packet.dividend.is_empty() else d.timeseries, + ) + # Use loaded data to calculate theoretical prices + if market_model == OptionPricingModel.BINOMIAL: + s, vol, r, d, base_prices = sync_date_index(s, vol, r, d, base_prices) + df = _calculate_binomial_scenarios( + base_prices=base_prices, + s=s, + strike=strike, + expiration=expiration, + right=right, + vol=vol, + r=r, + dividend_type=dividend_type, + dividends=d, + spot_scenarios=spot_scenarios, + vol_scenarios=vol_scenarios, + n_steps=n_steps, + prettify_columns=prettify_columns, + return_pnl=return_pnl, + return_pnl_in_pct=return_pnl_in_pct, + ) + result.grid = df + return result + + ## BSM model + elif market_model == OptionPricingModel.BSM: + s, vol, r, d, base_prices = sync_date_index(s, vol, r, d, base_prices) + if dividend_type == DivType.DISCRETE: + pv_divs = vectorized_discrete_pv( + schedules=d.values, + _valuation_dates=s.index, + _end_dates=[to_datetime(expiration)] * len(s), + r=r.values, + ) + pv_divs = pd.Series(data=pv_divs, index=s.index, name="pv_dividends", dtype=float) + q_factor = None + else: + pv_divs = None + q_factor = get_vectorized_continuous_dividends( + div_rates=d.values, + _valuation_dates=s.index, + _end_dates=[to_datetime(expiration)] * len(s), + ) + q_factor = pd.Series(data=q_factor, index=s.index, name="q_factor", dtype=float) + df = _calculate_bsm_scenarios( + base_prices=base_prices, + s=s, + strike=strike, + expiration=expiration, + right=right, + vol=vol, + r=r, + dividend_type=dividend_type, + pv_divs=pv_divs, + q_factor=q_factor, + spot_scenarios=spot_scenarios, + vol_scenarios=vol_scenarios, + prettify_columns=prettify_columns, + return_pnl=return_pnl, + return_pnl_in_pct=return_pnl_in_pct, + ) + result.grid = df + return result diff --git a/trade/datamanager/timeseries.py b/trade/datamanager/timeseries.py new file mode 100644 index 0000000..a92c63c --- /dev/null +++ b/trade/datamanager/timeseries.py @@ -0,0 +1,318 @@ +"""Unified timeseries interface for all DataManager classes. + +This module provides TimeseriesDataManager and TimeseriesAdapter classes that create +a consistent, simplified API across all specialized data managers (spot, vol, greeks, +etc.). Each manager's specific method names are mapped to standardized names while +preserving original docstrings and type signatures. + +Key Features: + - Standardized API: rt(), get_at_time(), get_timeseries() across all managers + - Preserves original docstrings and signatures for IDE support + - Property-based access to underlying managers via adapters + - Pass-through to underlying manager attributes when needed + - Single entry point for all market data retrieval + +Typical Usage: + >>> from trade.datamanager.timeseries import TimeseriesDataManager + >>> + >>> # Initialize for a symbol + >>> ts = TimeseriesDataManager("AAPL") + >>> + >>> # Spot data with consistent interface + >>> spot_rt = ts.spot.rt() + >>> spot_series = ts.spot.get_timeseries( + ... start_date="2025-01-01", + ... end_date="2025-01-31" + ... ) + >>> + >>> # Options data (pass strike/expiration/right explicitly) + >>> vol = ts.vol.get_timeseries( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... strike=150.0, + ... expiration="2025-06-20", + ... right="call" + ... ) + >>> + >>> # Greeks with same consistent interface + >>> greeks = ts.greeks.rt( + ... strike=150.0, + ... expiration="2025-06-20", + ... right="call" + ... ) + >>> + >>> # Access underlying manager if needed + >>> underlying_vol_mgr = ts.vol._manager + +Architecture: + TimeseriesDataManager acts as a facade, exposing properties (spot, vol, greeks, etc.) + that return TimeseriesAdapter instances. Each adapter wraps the underlying DataManager + and provides the standardized method names that delegate to the actual methods. +""" + +from typing import Any, Optional +import inspect +from trade.helpers.Logging import setup_logger +from .spot import SpotDataManager +from .vol import VolDataManager +from .dividend import DividendDataManager +from .forward import ForwardDataManager +from .option_spot import OptionSpotDataManager +from .greeks import GreekDataManager +from .rates import RatesDataManager +from trade.datamanager.utils.logging import get_logging_level, register_to_factor_list + +logger = setup_logger("trade.datamanager.timeseries", stream_log_level=get_logging_level()) +register_to_factor_list("trade.datamanager.timeseries") + + +class TimeseriesAdapter: + """Adapter that provides a consistent interface for any DataManager. + + Maps standardized method names (rt, get_at_time, get_timeseries) to + the actual underlying DataManager methods while preserving original + docstrings, signatures, and type hints. + """ + + def __init__( + self, + manager: Any, + rt_method: Optional[str] = "rt", + get_at_time_method: Optional[str] = None, + get_timeseries_method: Optional[str] = None, + ): + """Initialize adapter with method name mappings. + + Args: + manager: The underlying DataManager instance + rt_method: Name of the real-time method (default: "rt") + get_at_time_method: Name of the get-at-time method (e.g., "get_at_time", "get_at_time_implied_volatility") + get_timeseries_method: Name of the timeseries method (e.g., "get_spot_timeseries", "get_implied_volatility_timeseries") + """ + self._manager = manager + self._rt_method = rt_method + self._get_at_time_method = get_at_time_method + self._get_timeseries_method = get_timeseries_method + + # Create wrapper methods with copied metadata + self._create_wrapper_method("rt", rt_method) + self._create_wrapper_method("get_at_time", get_at_time_method) + self._create_wrapper_method("get_timeseries", get_timeseries_method) + + def _create_wrapper_method(self, wrapper_name: str, underlying_method_name: Optional[str]): + """Create a wrapper method that copies docstring and signature from underlying method. + + Args: + wrapper_name: Name of the wrapper method on this adapter + underlying_method_name: Name of the actual method on the underlying manager + """ + if not underlying_method_name or not hasattr(self._manager, underlying_method_name): + return + + underlying_method = getattr(self._manager, underlying_method_name) + + # Create wrapper function that calls the underlying method + def wrapper(*args, **kwargs): + return underlying_method(*args, **kwargs) + + # Copy metadata for proper introspection + wrapper.__name__ = wrapper_name + wrapper.__doc__ = underlying_method.__doc__ + wrapper.__wrapped__ = underlying_method # Allows ? to find original source + + # Copy module and qualname for correct file location display + if hasattr(underlying_method, "__module__"): + wrapper.__module__ = underlying_method.__module__ + if hasattr(underlying_method, "__qualname__"): + # Keep the wrapper name but use the module path + wrapper.__qualname__ = f"{underlying_method.__qualname__.rsplit('.', 1)[0]}.{wrapper_name}" + + # Copy signature + try: + wrapper.__signature__ = inspect.signature(underlying_method) + except (ValueError, TypeError): + pass + + # Copy annotations if available + if hasattr(underlying_method, "__annotations__"): + wrapper.__annotations__ = underlying_method.__annotations__.copy() + + # Set as instance attribute (overrides class method) + setattr(self, wrapper_name, wrapper) + + def rt(self, *args, **kwargs): + """Call the underlying manager's real-time method.""" + if self._rt_method and hasattr(self._manager, self._rt_method): + method = getattr(self._manager, self._rt_method) + return method(*args, **kwargs) + raise NotImplementedError(f"{self._manager.__class__.__name__} does not support rt()") + + def get_at_time(self, *args, **kwargs): + """Call the underlying manager's get-at-time method.""" + if self._get_at_time_method and hasattr(self._manager, self._get_at_time_method): + method = getattr(self._manager, self._get_at_time_method) + return method(*args, **kwargs) + raise NotImplementedError(f"{self._manager.__class__.__name__} does not support get_at_time()") + + def get_timeseries(self, *args, **kwargs): + """Call the underlying manager's timeseries method.""" + if self._get_timeseries_method and hasattr(self._manager, self._get_timeseries_method): + method = getattr(self._manager, self._get_timeseries_method) + return method(*args, **kwargs) + raise NotImplementedError(f"{self._manager.__class__.__name__} does not support get_timeseries()") + + def __getattr__(self, name: str): + """Pass through any other attribute access to the underlying manager.""" + return getattr(self._manager, name) + + +class TimeseriesDataManager: + """Unified interface for all data managers with consistent method naming. + + Each data manager is wrapped with a TimeseriesAdapter that maps standardized + method names (rt, get_at_time, get_timeseries) to the actual underlying methods. + + Examples: + >>> # Basic spot data access + >>> ts = TimeseriesDataManager("AAPL") + >>> spot_result = ts.spot.rt() + >>> spot_series = ts.spot.get_timeseries(start_date="2025-01-01", end_date="2025-01-31") + + >>> # Options data - pass parameters explicitly + >>> ts = TimeseriesDataManager("AAPL") + >>> vol_result = ts.vol.rt(strike=150.0, expiration="2025-06-20", right="call") + >>> greeks = ts.greeks.get_timeseries( + ... start_date="2025-01-01", end_date="2025-01-31", + ... strike=150.0, expiration="2025-06-20", right="call" + ... ) + """ + + def __init__(self, symbol: str): + """Initialize unified timeseries data manager. + + Args: + symbol: Ticker symbol (e.g., "AAPL") + """ + self.symbol = symbol + + # Initialize underlying managers + self._spot_manager = SpotDataManager(symbol=symbol) + self._vol_manager = VolDataManager(symbol=symbol) + self._dividend_manager = DividendDataManager(symbol=symbol) + self._forward_manager = ForwardDataManager(symbol=symbol) + self._option_spot_manager = OptionSpotDataManager(symbol=symbol) + self._greeks_manager = GreekDataManager(symbol=symbol) + self._rates_manager = RatesDataManager() + + @property + def spot(self) -> TimeseriesAdapter: + """Access spot price data with standardized interface. + + Methods: + - rt(): Get real-time spot price + - get_at_time(date): Get spot price at specific date + - get_timeseries(start_date, end_date, undo_adjust=True): Get spot price series + """ + return TimeseriesAdapter( + manager=self._spot_manager, + rt_method="rt", + get_at_time_method="get_at_time", + get_timeseries_method="get_spot_timeseries", + ) + + @property + def vol(self) -> TimeseriesAdapter: + """Access implied volatility data with standardized interface. + + Methods: + - rt(strike, expiration, right, ...): Get real-time implied volatility + - get_at_time(date, strike, expiration, right, ...): Get implied vol at specific date + - get_timeseries(start_date, end_date, strike, expiration, right, ...): Get implied vol series + """ + return TimeseriesAdapter( + manager=self._vol_manager, + rt_method="rt", + get_at_time_method="get_at_time_implied_volatility", + get_timeseries_method="get_implied_volatility_timeseries", + ) + + @property + def greeks(self) -> TimeseriesAdapter: + """Access option greeks data with standardized interface. + + Requires: strike, expiration, right parameters set in constructor + + Methods: + - rt(strike, expiration, right, ...): Get real-time option greeks + - get_at_time(date, strike, expiration, right, ...): Get greeks at specific date + - get_timeseries(start_date, end_date, strike, expiration, right, ...): Get greeks series + """ + return TimeseriesAdapter( + manager=self._greeks_manager, + rt_method="rt", + get_at_time_method="get_at_time_greeks", + get_timeseries_method="get_greeks_timeseries", + ) + + @property + def forward(self) -> TimeseriesAdapter: + """Access forward price data with standardized interface. + + Methods: + - rt(maturity_date): Get real-time forward price + - get_timeseries(start_date, end_date, maturity_date): Get forward price series + """ + return TimeseriesAdapter( + manager=self._forward_manager, + rt_method="rt", + get_at_time_method="get_forward", # Forward doesn't have get_at_time + get_timeseries_method="get_forward_timeseries", + ) + + @property + def dividend(self) -> TimeseriesAdapter: + """Access dividend data with standardized interface. + + Methods: + - rt(maturity_date): Get real-time dividend schedule + - get_timeseries(start_date, end_date, maturity_date): Get dividend series + """ + return TimeseriesAdapter( + manager=self._dividend_manager, + rt_method="rt", + get_at_time_method="get_schedule", # Dividend doesn't have get_at_time + get_timeseries_method="get_schedule_timeseries", + ) + + @property + def rates(self) -> TimeseriesAdapter: + """Access risk-free rate data with standardized interface. + + Methods: + - rt(): Get real-time risk-free rate + - get_timeseries(start_date, end_date): Get rate series + """ + return TimeseriesAdapter( + manager=self._rates_manager, + rt_method="rt", + get_at_time_method="get_rate", # Rates doesn't have get_at_time + get_timeseries_method="get_risk_free_rate_timeseries", + ) + + @property + def option_spot(self) -> TimeseriesAdapter: + """Access option market price data with standardized interface. + + Requires: strike, expiration, right parameters set in constructor + + Methods: + - rt(strike, expiration, right, ...): Get real-time option market price + - get_at_time(date, strike, expiration, right, ...): Get option price at specific date + - get_timeseries(start_date, end_date, strike, expiration, right, ...): Get option price series + """ + return TimeseriesAdapter( + manager=self._option_spot_manager, + rt_method="rt", + get_at_time_method="get_option_spot_at_time", + get_timeseries_method="get_option_spot_timeseries", + ) diff --git a/trade/datamanager/utils/__init__.py b/trade/datamanager/utils/__init__.py new file mode 100644 index 0000000..968c5f2 --- /dev/null +++ b/trade/datamanager/utils/__init__.py @@ -0,0 +1,14 @@ +from bisect import bisect_left, bisect_right +from datetime import date +from typing import List +from trade.optionlib.assets.dividend import ScheduleEntry + +def slice_schedule(full_schedule: List[ScheduleEntry], val_date: date, mat_date: date) -> List[ScheduleEntry]: + """ + Return entries in full_schedule with entry.date in [val_date, mat_date]. + Assumes full_schedule is sorted by entry.date ascending and each entry has .date (datetime.date). + """ + dates = [e.date for e in full_schedule] + i0 = bisect_left(dates, val_date) + i1 = bisect_right(dates, mat_date) + return full_schedule[i0:i1] \ No newline at end of file diff --git a/trade/datamanager/utils/cache.py b/trade/datamanager/utils/cache.py new file mode 100644 index 0000000..9bb68fc --- /dev/null +++ b/trade/datamanager/utils/cache.py @@ -0,0 +1,279 @@ +import pandas as pd +from datetime import date +from typing import Any, List, Optional, Union, Tuple +from trade.helpers.Logging import setup_logger +from trade.helpers.helper import CustomCache, change_to_last_busday, get_missing_dates, to_datetime +from dataclasses import dataclass +from .date import _should_save_today, DATE_HINT +from ..base import BaseDataManager +from .data_structure import _data_structure_sanitize +from trade.datamanager.utils.logging import get_logging_level, UTILS_LOGGER_NAME +logger = setup_logger(UTILS_LOGGER_NAME, stream_log_level=get_logging_level()) + +@dataclass +class _CachedData: + """ + Represents cached timeseries data along with metadata about its date coverage and missing dates. + The goal of this class is to encapsulate the cached data and provide utility methods to check if it fully covers a requested date range. + This allows the cache checking logic to be more efficient by avoiding repeated calculations of missing dates and date range coverage. + """ + key: str + data: Union[pd.Series, pd.DataFrame] + data_start_date: Optional[DATE_HINT] = None + data_end_date: Optional[DATE_HINT] = None + missing_dates_within_range: List[DATE_HINT] = None + + def __post_init__(self): + if not isinstance(self.data, (pd.Series, pd.DataFrame)): + raise TypeError(f"Expected pd.Series or pd.DataFrame for cached data, got {type(self.data)}") + if not isinstance(self.data.index, pd.DatetimeIndex): + raise TypeError("Expected DatetimeIndex for cached timeseries data.") + + self.data_start_date = self.data.index.min().date() if not self.data.empty else None + self.data_end_date = self.data.index.max().date() if not self.data.empty else None + if self.data_start_date and self.data_end_date: + missing = get_missing_dates(self.data, _start=self.data_start_date, _end=self.data_end_date) + self.missing_dates_within_range = [to_datetime(d).date() for d in missing] + else: + self.missing_dates_within_range = [] + + def is_fully_covered(self, start_dt: DATE_HINT, end_dt: DATE_HINT) -> bool: + """Checks if the cached data fully covers the requested date range.""" + if self.data.empty: + logger.info(f"Cached data is empty for key: {self.key}.") + return False + if self.data_start_date > to_datetime(start_dt).date() or self.data_end_date < to_datetime(end_dt).date(): + logger.info(f"Cached data date range {self.data_start_date} to {self.data_end_date} does not cover requested range {to_datetime(start_dt).date()} to {to_datetime(end_dt).date()}.") + return False + if not self.missing_dates_within_range: + logger.info(f"No missing dates within cached data range for key: {self.key}.") + return True + + missing_in_range = [to_datetime(d).date() for d in self.missing_dates_within_range if to_datetime(start_dt).date() <= d <= to_datetime(end_dt).date()] + _bool = len(missing_in_range) == 0 + if not _bool: + logger.info(f"Missing dates within requested range for key {self.key}: {missing_in_range}. Fully covered: {_bool}") + else: + logger.info(f"No missing dates within requested range for key {self.key}. Fully covered: {_bool}") + return _bool + + def _comprehensive_cache_check(self, start_dt: DATE_HINT, end_dt: DATE_HINT) -> Tuple[Optional[Union[pd.Series, pd.DataFrame]], bool, DATE_HINT, DATE_HINT]: + """ + Performs a comprehensive check to determine if the cached data fully covers the requested date range, and identifies any missing dates. + Return args order: + - cached_data: The cached pd.Series or pd.DataFrame if fully present, else None + - is_partial: True if some dates are missing, False if fully present + - missing_start_date: The earliest missing date if partially present, else start_dt + - missing_end_date: The latest missing date if partially present, else end_dt + """ + if self.is_fully_covered(start_dt, end_dt): + logger.info(f"Cache hit for timeseries data structure key: {self.key}") + sanitized_data = _data_structure_sanitize( + self.data, + start=start_dt, + end=end_dt, + source_name=f"cached timeseries for key {self.key}", + ) + return sanitized_data, False, to_datetime(start_dt), to_datetime(end_dt) + + logger.info( + f"Cache partially covers requested date range for timeseries data structure. " + f"Key: {self.key}. Fetching missing dates within range: {[d for d in self.missing_dates_within_range if to_datetime(start_dt).date() <= d <= to_datetime(end_dt).date()]}" + ) + + missing_in_range = get_missing_dates(self.data, _start=start_dt, _end=end_dt) + missing_start_date = to_datetime(min(missing_in_range) if missing_in_range else start_dt) + missing_end_date = to_datetime(max(missing_in_range) if missing_in_range else end_dt) + return self.data, True, missing_start_date, missing_end_date + +def _simple_extract_from_cache(key: str, cache: CustomCache) -> Optional[Union[pd.Series, pd.DataFrame]]: + """Simple helper to extract cached data, handling the _CachedData wrapper.""" + cached = cache.get(key, default=None) + cached = _extract_data(cached) + return cached + +def _extract_data(data: Union[pd.Series, pd.DataFrame, _CachedData]) -> Union[pd.Series, pd.DataFrame]: + """Extracts the actual data from a _CachedData object or returns it directly if it's already a Series/DataFrame.""" + if isinstance(data, _CachedData): + return data.data + return data + +def _data_structure_cache_it( + self: BaseDataManager, + key: str, + value: Union[pd.Series, pd.DataFrame], + *, + expire: Optional[int] = None, +): + """Merges and caches rate timeseries, excluding today's partial data.""" + value = value.copy() + if not isinstance(value, (pd.Series, pd.DataFrame)): + raise TypeError(f"Expected pd.Series or pd.DataFrame for caching, got {type(value)}") + + if not isinstance(value.index, pd.DatetimeIndex): + raise TypeError("Expected DatetimeIndex for caching timeseries data.") + + if not isinstance(self, BaseDataManager): + raise TypeError(f"{self.__class__.__name__} must be a subclass of BaseDataManager.") + + existing: Optional[Union[pd.Series, pd.DataFrame]] = self.get(key, default=None) + _cache_it_timeseries_data_structure( + existing=existing, + key=key, + value=value, + expire=expire, + cache=self, + ) + +def _cache_it_timeseries_data_structure( + existing: Union[pd.Series, pd.DataFrame], + key: str, + value: Union[pd.Series, pd.DataFrame], + expire: Optional[int] = None, + cache: CustomCache = None, + skip_today_check: bool = False, +): + """Caches a timeseries data structure, merging with existing data and handling today's data.""" + if isinstance(existing, _CachedData): + existing = existing.data + assert isinstance(value, (pd.Series, pd.DataFrame)), f"Expected pd.Series or pd.DataFrame for caching, got {type(value)}" + assert isinstance(existing, (pd.Series, pd.DataFrame, type(None))), f"Expected pd.Series, pd.DataFrame, or None for existing data, got {type(existing)}" + + ## Since it is a timeseries, we will append to existing if exists + if existing is not None: + # Merge existing and new values. We're expecting pd.Series + merged = pd.concat([existing, value]) + value = merged[~merged.index.duplicated(keep="last")] + + if value.empty: + logger.info(f"Not caching empty timeseries for key: {key}") + return + + max_date = value.index.max().date() + max_is_today = max_date == date.today() + + ## Really only makes sense to remove today's data if max date is today. if not just skip the check and save whatever we have since it won't be partial day data. + ## This also avoids the overhead of checking today's date and time for every cache entry that has a max date in the past. + if max_is_today: + if not _should_save_today(max_date=value.index.max().date()) and not skip_today_check: + logger.info(f"Cutting off today's data for key: {key} to avoid saving partial day data.") + value = value[value.index < pd.to_datetime(date.today())] + else: + logger.info(f"Max date {max_date} for key: {key} is not today. Skipping today's data check.") + + ## Do not cache rules: + cache_data = True + + ## 1) If after removing today's data, there is no data left + if value.empty: + cache_data = False + logger.info(f"No data left to cache for key: {key} after removing today's data.") + + ## 2) If all data points are NaN + if value.isna().all().all(): + cache_data = False + logger.info(f"All data points are NaN for key: {key}. Not caching.") + + + if not cache_data: + return + + + value.sort_index(inplace=True) + cache_data = _CachedData(key=key, data=value) + logger.info(f"Caching timeseries data structure for key: {key} with date range {cache_data.data_start_date} to {cache_data.data_end_date}, missing dates within range: {cache_data.missing_dates_within_range}") + + cache.set(key, cache_data, expire=expire) + + +def _simple_list_cache_it(self: BaseDataManager, key: str, value: List[Any], *, expire: Optional[int] = None): + """Cache a list of simple values. Will append and keep unique. Also sort""" + + if not isinstance(value, list): + raise TypeError(f"Expected list. Recieved {type(value)}") + + existing: List = self.get(key, default=[]) + existing.extend(value) + existing = sorted(list(set(existing))) + self.set(key, existing, expire=expire) + +def _check_cache_for_timeseries_data_structure( + self: BaseDataManager, + key: str, + start_dt: DATE_HINT, + end_dt: DATE_HINT, +) -> Tuple[Optional[Union[pd.Series, pd.DataFrame]], bool, DATE_HINT, DATE_HINT]: + """ + Checks cache for existing timeseries data structure and identifies missing dates. + + Return args order: + - cached_data: The cached pd.Series or pd.DataFrame if fully present, else None + - is_partial: True if some dates are missing, False if fully present + - missing_start_date: The earliest missing date if partially present, else start_dt + - missing_end_date: The latest missing date if partially present, else end_dt + """ + cached_data = self.get(key, default=None) + if isinstance(cached_data, _CachedData): + cached_data = cached_data.data + + if not isinstance(self, BaseDataManager): + raise TypeError(f"{self.__class__.__name__} must be a subclass of BaseDataManager.") + + if not isinstance(cached_data, (pd.Series, pd.DataFrame, type(None))): + logger.info(f"Cache entry for key: {key} is not a pd.Series, pd.DataFrame, or None. Found type: {type(cached_data)}. Ignoring cache entry.") + return None, False, start_dt, end_dt + + if cached_data is None: + logger.info(f"No cache entry found for key: {key}") + return None, False, start_dt, end_dt + + return _data_structure_cache_check_missing( + cached_data=cached_data, + key=key, + start_dt=start_dt, + end_dt=end_dt, + ) + +def _data_structure_cache_check_missing( + cached_data: Union[pd.Series, pd.DataFrame, _CachedData], + key: str, + start_dt: DATE_HINT, + end_dt: DATE_HINT, +) -> Tuple[Union[pd.Series, pd.DataFrame], bool, DATE_HINT, DATE_HINT]: + """ + Checks cached timeseries data structure for missing dates within a specified range. + Return args order: + - cached_data: The cached pd.Series or pd.DataFrame, sanitized to the requested date range + - is_partial: True if some dates are missing, False if fully present + - missing_start_date: The earliest missing date if partially present, else start_dt + - missing_end_date: The latest missing date if partially present, else end_dt + """ + ## Firstly we want to ensure backward compatibility with old cache data structure which is just the raw pd.Series or pd.DataFrame. + ## We will convert it to the new cache data structure and save it back to cache for future use. This way we can also populate the missing dates info for old cache entries. + + if isinstance(cached_data, (pd.Series, pd.DataFrame)): + logger.info(f"Converting old cache data structure to new for key: {key}") + cached_data = _CachedData(key=key, data=cached_data) + + ## For start, we move forward if not busday + start_dt = change_to_last_busday(start_dt, time_of_day_aware=False, offset=-1) + + ## For end, we move backward if not busday + end_dt = change_to_last_busday(end_dt, time_of_day_aware=False, offset=1) + return cached_data._comprehensive_cache_check(start_dt=start_dt, end_dt=end_dt) + + missing = get_missing_dates(cached_data, _start=start_dt, _end=end_dt) + if not missing: + logger.info(f"Cache hit for timeseries data structure key: {key}") + cached_data = _data_structure_sanitize( + cached_data, + start=start_dt, + end=end_dt, + source_name=f"cached timeseries for key {key}", + ) + return cached_data, False, start_dt, end_dt + logger.info( + f"Cache partially covers requested date range for timeseries data structure. " + f"Key: {key}. Fetching missing dates: {missing}" + ) + return cached_data, True, min(missing), max(missing) diff --git a/trade/datamanager/utils/data_structure.py b/trade/datamanager/utils/data_structure.py new file mode 100644 index 0000000..3c56803 --- /dev/null +++ b/trade/datamanager/utils/data_structure.py @@ -0,0 +1,64 @@ +from datetime import datetime +import numpy as np +from typing import Union +import pandas as pd +from trade.datamanager.exceptions import EmptyDataException +from trade.helpers.helper import to_datetime +from trade.helpers.Logging import setup_logger +from trade.datamanager.utils.logging import get_logging_level, UTILS_LOGGER_NAME +from trade import HOLIDAY_SET + +logger = setup_logger(UTILS_LOGGER_NAME, stream_log_level=get_logging_level()) + + +def _data_structure_sanitize( + df: Union[pd.Series, pd.DataFrame], + start: Union[datetime, str], + end: Union[datetime, str], + source_name: str = "", +) -> Union[pd.Series, pd.DataFrame]: + """Sanitizes the data structure by removing duplicates and sorting the index.""" + logger.info(f"Sanitizing data from {start} to {end}...") + if not isinstance(df, (pd.Series, pd.DataFrame)): + raise TypeError(f"Expected pd.Series or pd.DataFrame for sanitization, got {type(df)}") + + # Ensure DatetimeIndex. If not, attempt conversion + if not isinstance(df.index, pd.DatetimeIndex): + try: + df.index = to_datetime(df.index, format="%Y-%m-%d") + except Exception as e: + raise TypeError("Expected DatetimeIndex for sanitization of timeseries data.") from e + + # Remove duplicates, keeping the last occurrence + df = df[~df.index.duplicated(keep="last")] + + # Sort the index + df = df.sort_index() + + # if dataframe, lower case columns + if isinstance(df, pd.DataFrame): + df.columns = df.columns.str.lower() + + # Filter by start and end dates + df = df[(df.index.date >= pd.to_datetime(start).date()) & (df.index.date <= pd.to_datetime(end).date())] + + if df.empty: + raise EmptyDataException(f"No data available after sanitization between {start} and {end}. Source: {source_name}") + + # Re-sort after filtering + df = df.sort_index() + + # Index name=datetime + df.index.name = "datetime" + + # Resample to business day frequency if not already and fill missing dates with NaN + all_bus_days = pd.date_range(start=df.index.min(), end=df.index.max(), freq="B") + all_bus_days = [d for d in all_bus_days if d.strftime("%Y-%m-%d") not in HOLIDAY_SET] + df = df.reindex(all_bus_days, fill_value=np.nan) + + # Filter out holidays + df = df[~df.index.strftime("%Y-%m-%d").isin(HOLIDAY_SET)] + + + + return df diff --git a/trade/datamanager/utils/date.py b/trade/datamanager/utils/date.py new file mode 100644 index 0000000..7b3c309 --- /dev/null +++ b/trade/datamanager/utils/date.py @@ -0,0 +1,232 @@ +import pandas as pd +from dataclasses import dataclass +from datetime import datetime, date +from pandas.tseries.offsets import BDay +from trade.helpers.helper import to_datetime, is_busday, is_USholiday +from trade.helpers.helper import ny_now +from trade.optionlib.assets.dividend import SECONDS_IN_DAY, SECONDS_IN_YEAR # noqa +from trade.datamanager.vars import TODAY_RELOAD_CUTOFF, MIN_TIME_BEFORE_REAL_TIME +from trade.helpers.helper_types import DATE_HINT +from trade.helpers.helper import time_distance_helper # noqa +from trade.helpers.helper import CustomCache, generate_option_tick_new +from trade.datamanager._enums import OptionSpotEndpointSource +from trade.helpers.helper import is_market_hours_today +from trade.helpers.helper_types import is_iterable # noqa +from trade.helpers.Logging import setup_logger +from trade.optionlib.utils.format import assert_equal_length # noqa +from dbase.DataAPI.ThetaData import list_dates +from pathlib import Path +import os +from typing import Tuple, List, Optional, Union +from trade.datamanager.utils.logging import get_logging_level, UTILS_LOGGER_NAME +logger = setup_logger(UTILS_LOGGER_NAME, stream_log_level=get_logging_level()) + +PATH = Path(os.environ["GEN_CACHE_PATH"]) / "dm_gen_cache" + +## This cache will be used to save the min trading date for each option tick +## This is to avoid calling API all the time + + + +LIST_DATE_CACHE = CustomCache( + location=PATH.as_posix(), + fname="list_date_cache", + clear_on_exit=False, + expire_days=365, +) + +def sync_date_index(*args) -> List[Union[pd.Series, pd.DataFrame]]: + """Synchronizes the date indices of multiple time series.""" + for i, ts in enumerate(args): + if ts is None: + raise ValueError("All time series must be provided and not None. Found None at position {}".format(i)) + if not isinstance(ts, (pd.Series, pd.DataFrame)): + raise TypeError( + "All inputs must be pandas Series or DataFrame. Found {} at position {}".format(type(ts), i) + ) + date_indices = [set(ts.index) for ts in args if ts is not None] + common_dates = list(set.intersection(*date_indices)) + synced_series = [ts.loc[common_dates] if ts is not None else None for ts in args] + synced_series = [ts.sort_index() if ts is not None else None for ts in synced_series] + return synced_series + + + + +def _sync_date( + symbol: str, + start_date: DATE_HINT, + end_date: DATE_HINT, + strike: Optional[float] = None, + expiration: Optional[Union[datetime, str]] = None, + right: Optional[str] = None, + endpoint_source: Optional[OptionSpotEndpointSource] = OptionSpotEndpointSource.EOD, +) -> Tuple[datetime, datetime]: + """Synchronizes requested dates with available data range from Thetadata. + + Queries Thetadata for available dates for the specified option contract and + adjusts the requested date range to fit within available data bounds. + + Args: + start_date: Requested start date. + end_date: Requested end date. + strike: Option strike price. + expiration: Option expiration date. + right: Option type ("C" for call, "P" for put). + endpoint_source: Source of option spot data. + + Returns: + Tuple of (adjusted_start_date, adjusted_end_date) constrained to + available data range. + + Examples: + >>> opt_mgr = OptionSpotDataManager("AAPL") + >>> start, end = opt_mgr._sync_date( + ... start_date="2025-01-01", + ... end_date="2025-12-31", + ... strike=150.0, + ... expiration="2025-06-20", + ... right="C" + ... ) + + Notes: + - Constrains start_date to max(requested_start, min_available_date) + - Constrains end_date to min(requested_end, max_available_date) + - Prevents requesting dates outside available data range + """ + + ## Process Note: + ## list of dates is only important for min date + ## Once we have min date, all dates after that are available until expiration or today + ## For end date, we just need to compare requested end date with expiration/today. + ## There is added logic for EOD source since data is only available after market close + opttick = generate_option_tick_new( + symbol=symbol, + exp=expiration, + right=right, + strike=strike, + ) + + def _get_max_date(requested_end: datetime) -> datetime: + """ + Determines the maximum allowable end date based on requested end date, + option expiration, and data source constraints. + + Note: We don't really need list of dates. min_date is < requested_date, all dates in between are available + + Args: + requested_end: The originally requested end date. + """ + + if to_datetime(requested_end) <= to_datetime(expiration): + ## EOD report is produced after 6pm, + ## so max date is prev bus day as long as it is trading hours + if endpoint_source == OptionSpotEndpointSource.EOD: + max_allowed = prev_busday if is_market_hrs else today + else: + max_allowed = today + + ## Get max date within allowed range + max_date = to_datetime(min(max_allowed.date(), to_datetime(requested_end).date())) + + ## Else, max date is expiration + else: + max_date = to_datetime(expiration) + + return max_date + + is_market_hrs = is_market_hours_today() + today = ny_now() + prev_busday = (today - BDay(1)).to_pydatetime() + start_date = to_datetime(start_date) + end_date = to_datetime(end_date) + + if opttick in LIST_DATE_CACHE.keys(): + logger.info(f"Using cached date range for {start_date} - {end_date} and option tick {opttick}") + cached_dates = LIST_DATE_CACHE.get(key=opttick) + min_date = cached_dates["min_date"] + max_date = _get_max_date(end_date) + + start_date = max(min_date, start_date) + end_date = min(max_date, end_date) + return min(start_date, end_date), max(start_date, end_date) + + logger.info(f"Fetching date range from Thetadata for {opttick}") + dates = list_dates( + symbol=symbol, + exp=expiration, + right=right, + strike=strike, + ) + + if not dates: + raise ValueError(f"No trading dates found for {opttick}") + + dates = to_datetime(dates) + + ## Adjust start date to min + min_date = min(dates) + start_date = max(min_date, start_date) + end_date = _get_max_date(end_date) + + LIST_DATE_CACHE.set(key=opttick, value={"min_date": min_date}, expire=None) + + return min(start_date, end_date), max(start_date, end_date) + + +@dataclass(slots=True) +class DateRangePacket: + """ + Simple container for start/end date ranges with both datetime and string formats. + """ + + start_date: DATE_HINT + end_date: DATE_HINT + start_str: Optional[str] = None + end_str: Optional[str] = None + maturity_date: Optional[DATE_HINT] = None + maturity_str: Optional[str] = None + + def __post_init__(self): + self.start_date = to_datetime(self.start_date) + self.end_date = to_datetime(self.end_date) + if self.maturity_date is not None: + self.maturity_date = to_datetime(self.maturity_date) + + self.start_str = self.start_str or self.start_date.strftime("%Y-%m-%d") + self.end_str = self.end_str or self.end_date.strftime("%Y-%m-%d") + if self.maturity_date is not None: + self.maturity_str = self.maturity_str or self.maturity_date.strftime("%Y-%m-%d") + else: + self.maturity_str = None + + +def _should_save_today(max_date: date) -> bool: + """ + Determines if data should be saved today based on the max_date and current time in New York. + """ + today = date.today() + current_time = ny_now().time() + _bool = max_date >= today and current_time >= TODAY_RELOAD_CUTOFF + return _bool + + +def is_available_on_date(date: date) -> bool: + """ + Returns True if the given date is a business day and not a US holiday, False otherwise. + For when date == today, it checks current time to see if market is open. + """ + date = to_datetime(date) + is_today = date.date() == ny_now().date() + is_trading_day = is_busday(date) and not is_USholiday(date) + + ## If both today and trading day, check time + if is_today and is_trading_day: + current_time = ny_now().time() + + ## If before min time, return False + if current_time < MIN_TIME_BEFORE_REAL_TIME: + return False + + ## Else just return trading day status + return is_trading_day diff --git a/trade/datamanager/utils/enums_utils.py b/trade/datamanager/utils/enums_utils.py new file mode 100644 index 0000000..d09a051 --- /dev/null +++ b/trade/datamanager/utils/enums_utils.py @@ -0,0 +1,76 @@ +from datetime import date, datetime, time +from enum import Enum +from typing import Dict, Optional, Any, Union +from .._enums import Interval, ArtifactType, SeriesId + +DATE_HINT = Union[datetime, str] +def _norm_str(x: str) -> str: + return x.strip().upper() + + +def _safe_part(x: Optional[str]) -> str: + return x if x not in (None, "", "None") else "-" + +def _format_value(v: Any) -> str: + """ + Keep it simple + deterministic. + """ + if v is None: + return "-" + if isinstance(v, Enum): + return str(v.value) + if isinstance(v, str): + return _norm_str(v) + if isinstance(v, bool): + return "1" if v else "0" + if isinstance(v, (int,)): + return str(v) + if isinstance(v, float): + # avoid 0.30000000000004 style keys + return f"{v:.12g}" + if isinstance(v, datetime): + # stable, compact. (no tz handling by design here) + return v.strftime("%Y%m%dT%H%M%S") + if isinstance(v, date): + return v.strftime("%Y%m%d") + + if isinstance(v, time): + return v.strftime("%H%M%S") + return str(v) + + +def construct_cache_key( + symbol: str, + interval: Optional[Interval], + artifact_type: ArtifactType, + series_id: SeriesId, + **extra_parts: Any, +) -> str: + """Constructs deterministic cache key from symbol, interval, artifact type, series ID, and extra parts.""" + + if series_id in (SeriesId.AT_TIME, SeriesId.SNAPSHOT): + assert "time" in extra_parts, "time must be provided for at_time or snapshot series_id" + assert "date" in extra_parts, "date must be provided for at_time or snapshot series_id" + assert isinstance(extra_parts["time"], time), "time must be a time object" + assert isinstance(extra_parts["date"], date), "date must be a date object" + + parts = [ + f"symbol:{_norm_str(symbol)}", + f"interval:{_format_value(interval)}", + f"artifact_type:{artifact_type.value}", + f"series_id:{series_id.value}", + ] + + for k in sorted(extra_parts.keys()): + parts.append(f"{k}:{_format_value(extra_parts[k])}") + + return "|".join(parts) + +def _parse_cache_key(key: str) -> Dict[str, str]: + """Parses a pipe-delimited cache key into a dictionary of key-value pairs.""" + parts = key.split("|") + result = {} + for part in parts: + k, v = part.split(":", 1) + result[k] = v + return result \ No newline at end of file diff --git a/trade/datamanager/utils/greeks_helpers.py b/trade/datamanager/utils/greeks_helpers.py new file mode 100644 index 0000000..46eeea7 --- /dev/null +++ b/trade/datamanager/utils/greeks_helpers.py @@ -0,0 +1,66 @@ +from typing import List, Optional, Union, Iterable +import numpy as np +from trade.helpers.helper_types import DATE_HINT +from trade.datamanager._enums import (GreekType, ModelPrice, OptionPricingModel, OptionSpotEndpointSource, VolatilityModel) +from trade.datamanager.result import GreekResultSet +from trade.optionlib.config.types import DivType +from trade.helpers.Logging import setup_logger +from trade.datamanager.utils.logging import get_logging_level, UTILS_LOGGER_NAME +logger = setup_logger(UTILS_LOGGER_NAME, stream_log_level=get_logging_level()) + +def _get_prefilled_greek_result_set( + key: str, + symbol: str, + strike: float, + expiration: DATE_HINT, + right: str, + endpoint_source: OptionSpotEndpointSource, + market_model: OptionPricingModel, + vol_model: VolatilityModel, + dividend_type: DivType, + undo_adjust: bool = True, + model_price: Optional[ModelPrice] = None, +) -> GreekResultSet: + """Utility to create prefilled GreekResultSet with metadata.""" + result = GreekResultSet( + key=key, + symbol=symbol, + strike=strike, + expiration=expiration, + right=right, + endpoint_source=endpoint_source, + market_model=market_model, + vol_model=vol_model, + dividend_type=dividend_type, + undo_adjust=undo_adjust, + model_price=model_price + ) + return result + + +def _prepare_greeks_to_compute( + greeks_to_compute: Optional[Union[GreekType, Iterable[GreekType]]] = None, +) -> List[GreekType]: + + ## If None, set to all greeks + if greeks_to_compute is None: + greeks_to_compute = GreekType.GREEKS + + ## Expand GREEKS to all greek types + if greeks_to_compute == GreekType.GREEKS: + greeks_to_compute = list(set(GreekType) - {GreekType.GREEKS, GreekType.VANNA}) + + ## Validate greek_to_compute is list/tuple/set of GreekType + if not isinstance(greeks_to_compute, (list, np.ndarray, set, tuple)): + greeks_to_compute = [greeks_to_compute] + + ## Validate all elements are GreekType + if not all(isinstance(greek, GreekType) for greek in greeks_to_compute): + raise ValueError(f"greeks_to_compute must be a GreekType or list of GreekType. Found: {greeks_to_compute}") + + ## Validate no duplicates + greeks_to_compute = list(set(greeks_to_compute)) + + return list(greeks_to_compute) + + \ No newline at end of file diff --git a/trade/datamanager/utils/logging.py b/trade/datamanager/utils/logging.py new file mode 100644 index 0000000..0ee405a --- /dev/null +++ b/trade/datamanager/utils/logging.py @@ -0,0 +1,72 @@ +import logging + +from git import List +from trade.helpers.Logging import setup_logger, find_loggers_by_pattern, change_logger_stream_level +LOGGING_LEVEL = "DEBUG" +logger = setup_logger("trade.datamanager.utils", stream_log_level=LOGGING_LEVEL) + +FACTOR_DMS = { + "trade.datamanager.spot", + "trade.datamanager.rates", + "trade.datamanager.dividends", + "trade.datamanager.forward", + "trade.datamanager.vol", + "trade.datamanager.option_spot", + "trade.datamanager.greeks", + "trade.datamanager.base" +} + +VARS = [ + "trade.datamanager.vars", +] + +UTILS_LOGGER_NAME = "trade.datamanager.utils" + +def set_logging_level(level: str): + global LOGGING_LEVEL + LOGGING_LEVEL = level + +def get_logging_level() -> str: + return LOGGING_LEVEL + +def get_datamanager_loggers() -> List[logging.Logger]: + """Retrieve all loggers under 'trade.datamanager'""" + return find_loggers_by_pattern("trade.datamanager") + +def change_logging_in_all_datamanager_loggers(level: str = None): + """Change logging level for all loggers under 'trade.datamanager'.""" + if level is None: + level = LOGGING_LEVEL + loggers = find_loggers_by_pattern("trade.datamanager") + for logger in loggers: + change_logger_stream_level(logger, getattr(logging, level.upper(), logging.INFO)) + +def change_datamanager_utils_logging_level(level: str = None): + """Change logging level for 'trade.datamanager.utils' logger.""" + if level is None: + level = LOGGING_LEVEL + logger = logging.getLogger("trade.datamanager.utils") + change_logger_stream_level(logger, getattr(logging, level.upper(), logging.INFO)) + +def change_datamanager_factor_loggers_level(level: str = None): + """Change logging level for all factor loggers under 'trade.datamanager'.""" + if level is None: + level = LOGGING_LEVEL + for factor in FACTOR_DMS: + loggers = find_loggers_by_pattern(factor) + for logger in loggers: + change_logger_stream_level(logger, getattr(logging, level.upper(), logging.INFO)) + + +def change_all_optionlib_loggers_level(level: str = None): + """Change logging level for all loggers under 'trade.optionlib'""" + if level is None: + level = LOGGING_LEVEL + loggers = find_loggers_by_pattern("trade.optionlib") + for logger in loggers: + change_logger_stream_level(logger, getattr(logging, level.upper(), logging.INFO)) + + +def register_to_factor_list(name:str): + FACTOR_DMS.add(name) + diff --git a/trade/datamanager/utils/model.py b/trade/datamanager/utils/model.py new file mode 100644 index 0000000..d1a5989 --- /dev/null +++ b/trade/datamanager/utils/model.py @@ -0,0 +1,676 @@ +import time +from trade.helpers.Logging import setup_logger +from trade.datamanager.result import ( + DividendsResult, + ModelResultPack, + SpotResult, + ForwardResult, + RatesResult, + VolatilityResult, + OptionSpotResult, + GreekResultSet, +) +from trade.datamanager._enums import ModelPrice, SeriesId +from trade.datamanager.requests import LoadRequest +from trade.datamanager.utils.date import DateRangePacket +from trade.datamanager.config import OptionDataConfig +from typing import Optional, Union +import pandas as pd +from trade.datamanager._enums import OptionSpotEndpointSource, VolatilityModel, OptionPricingModel +from trade.optionlib.config.types import DivType +from trade.datamanager.utils.logging import get_logging_level, UTILS_LOGGER_NAME +from trade.datamanager.vars import add_to_log_bucket + +logger = setup_logger(UTILS_LOGGER_NAME, stream_log_level=get_logging_level()) + + +def log_model_load_info( + log_info: dict, + is_rt: bool, + is_timeseries: bool, + symbol: str, + expiration: str, + strike: float, + right: str, + dividend_type: str, + market_model: str, +) -> None: + """Logs model load information in a structured format.""" + log_info["symbol"] = symbol + log_info["expiration"] = expiration + log_info["strike"] = strike + log_info["right"] = right + log_info["dividend_type"] = dividend_type + log_info["market_model"] = market_model + log_info["is_rt"] = is_rt + log_info["is_timeseries"] = is_timeseries + log_info["date"] = pd.Timestamp.now().date().strftime("%Y-%m-%d") + add_to_log_bucket(log_info) + + +def _adjust_div_yield_for_spot_shock( + shock: float, + div: float, +) -> float: + """Adjust dividend yield based on spot price shock for continuous dividends.""" + adjusted_div = div / shock + return adjusted_div + + +def assert_synchronized_model( + packet: Optional[ModelResultPack] = None, + *, + # Hard-required guiding attributes (per your instruction) + symbol: str, + undo_adjust: bool, + dividend_type: DivType, + # Optional guiding attributes (enable if you want stricter checks) + series_id: Optional[SeriesId] = None, + endpoint_source: Optional[OptionSpotEndpointSource] = None, + market_model: Optional[OptionPricingModel] = None, + vol_model: Optional[VolatilityModel] = None, + model_price: Optional[ModelPrice] = None, + # Individual results (override packet fields if provided) + spot: Optional[SpotResult] = None, + dividend: Optional[DividendsResult] = None, + rates: Optional[RatesResult] = None, + forward: Optional[ForwardResult] = None, + option_spot: Optional[OptionSpotResult] = None, + vol: Optional[VolatilityResult] = None, + greek: Optional[GreekResultSet] = None, + # Point in time check + is_rt: bool = True, + check_fallback_option: bool = False, + # Alignment policy + anchor: str = "option_spot_midpoint", + require_anchor: bool = True, +) -> None: + """ + Authoritative synchronization checks for model inputs. + + Accepts either: + - packet: ModelResultPack + - and/or individual result overrides (spot=..., dividend=..., ...) + + Hard requirements (must not be None): + - symbol: non-empty string + - undo_adjust: bool + - dividend_type: DivType + + Skips any individual result object that is None. + + Checks: + 1) Symbol consistency across all present results (allows result.symbol=None) + 2) Dividend type consistency across (dividend, forward, vol, packet.dividend_type) + 3) undo_adjust consistency across (spot, dividend, forward, packet.undo_adjust) + 4) Canon hard contract: dividend.undo_adjust must equal undo_adjust when dividend exists + 5) Date/index alignment: anchored on option_spot.midpoint by default + """ + + # ------------------------- + # 0) Validate required args + # ------------------------- + if symbol is None or not isinstance(symbol, str) or not symbol.strip(): + raise ValueError("assert_synchronized_model: `symbol` must be a non-empty string.") + if undo_adjust is None or not isinstance(undo_adjust, bool): + raise ValueError("assert_synchronized_model: `undo_adjust` must be a bool (True/False).") + if dividend_type is None: + raise ValueError("assert_synchronized_model: `dividend_type` must not be None.") + + # ------------------------- + # 1) Load from packet first + # ------------------------- + if packet is not None: + if spot is None: + spot = packet.spot + if dividend is None: + dividend = packet.dividend + if rates is None: + rates = packet.rates + if forward is None: + forward = packet.forward + if option_spot is None: + option_spot = packet.option_spot + if vol is None: + vol = packet.vol + if greek is None: + greek = packet.greek + + # Optional strictness knobs (only check if caller passed them) + # If caller provided series_id/endpoint_source etc, verify packet matches. + if series_id is not None and packet.series_id is not None and packet.series_id != series_id: + raise ValueError(f"series_id mismatch: expected {series_id}, packet has {packet.series_id}") + if ( + endpoint_source is not None + and packet.endpoint_source is not None + and packet.endpoint_source != endpoint_source + ): + raise ValueError( + f"endpoint_source mismatch: expected {endpoint_source}, packet has {packet.endpoint_source}" + ) + + # If packet carries dividend_type and caller supplied dividend_type, enforce. + if packet.dividend_type is not None and packet.dividend_type != dividend_type: + raise ValueError(f"dividend_type mismatch: expected {dividend_type}, packet has {packet.dividend_type}") + + # If packet carries undo_adjust and caller supplied undo_adjust, enforce. + if packet.undo_adjust is not None and packet.undo_adjust != undo_adjust: + raise ValueError(f"undo_adjust mismatch: expected {undo_adjust}, packet has {packet.undo_adjust}") + + results = { + "spot": spot, + "dividend": dividend, + "rates": rates, + "forward": forward, + "option_spot": option_spot, + "vol": vol, + "greek": greek, + } + + dividend_factors = [ + "dividend", + "forward", + "vol", + "greek", + ] + + vol_model_factors = [ + "vol", + "greek", + ] + + market_model_factors = [ + "vol", + "greek", + ] + + undo_adjust_factors = [ + "spot", + "dividend", + "forward", + "greek", + "vol", + ] + + model_price_factors = ["vol", "option_spot", "greek"] + + fallback_option_factors = [ + "spot", + "dividend", + "rates", + "forward", + "vol", + "greek", + ] + + rt_factors = [ + "spot", + "dividend", + "rates", + "forward", + "option_spot", + "vol", + "greek", + ] + + # ------------------------- + # 2) Symbol consistency + # ------------------------- + for name, res in results.items(): + if res is None or name == "rates": + continue + res_sym = getattr(res, "symbol", None) + if res_sym is None: + continue + if res_sym != symbol: + raise ValueError(f"Symbol mismatch: expected symbol={symbol}, but {name}.symbol={res_sym}") + + # ------------------------- + # 3) Dividend type consistency + # ------------------------- + + # Generic dividend_type checks + if dividend is not None: + # Loop through all results that have dividend_type attribute + for name in dividend_factors: + res = results.get(name) + if res is None: + continue + res_div_type = getattr(res, "dividend_type", None) + if res_div_type is None: + raise ValueError(f"{name} missing dividend_type attribute.") + if res_div_type != dividend_type: + raise ValueError(f"Dividend type mismatch: expected {dividend_type}, {name} has {res_div_type}") + + # Generic vol_model checks + if vol_model is not None: + for name in vol_model_factors: + res = results.get(name) + if res is None: + continue + res_vol_model = getattr(res, "vol_model", None) + if vol_model is not None and res_vol_model is not None and res_vol_model != vol_model: + raise ValueError(f"vol_model mismatch: expected {vol_model}, {name} has {res_vol_model}") + + # Generic market_model checks + if market_model is not None: + for name in market_model_factors: + res = results.get(name) + if res is None: + continue + res_market_model = getattr(res, "market_model", None) + if market_model is not None and res_market_model is not None and res_market_model != market_model: + raise ValueError(f"market_model mismatch: expected {market_model}, {name} has {res_market_model}") + + # Generic model_price checks + if model_price is not None: + for name in model_price_factors: + res = results.get(name) + if res is None: + print("Skipping, result is None") + continue + res_model_price = getattr(res, "model_price", None) + if res_model_price is None or res_model_price != model_price: + raise ValueError(f"model_price mismatch: expected {model_price}, {name} has {res_model_price}") + + # ------------------------- + # 4) undo_adjust consistency + canon hard contract + # ------------------------- + for name in undo_adjust_factors: + res = results.get(name) + if res is None: + continue + res_undo_adjust = getattr(res, "undo_adjust", None) + if res_undo_adjust is None: + raise ValueError(f"{name} missing undo_adjust attribute.") + if res_undo_adjust != undo_adjust: + raise ValueError(f"undo_adjust mismatch: expected {undo_adjust}, {name} has {res_undo_adjust}") + + if is_rt: + for name in rt_factors: + res = results.get(name) + if res is None: + continue + res_rt = getattr(res, "rt", None) + if res_rt is None: + raise ValueError(f"{name} missing rt attribute.") + if res_rt != is_rt: + raise ValueError(f"rt mismatch: expected {is_rt}, {name} has {res_rt}") + + if check_fallback_option: + for name in fallback_option_factors: + res = results.get(name) + if res is None: + continue + res_fallback_option = getattr(res, "fallback_option", None) + if res_fallback_option is None: + raise ValueError(f"{name} missing fallback_option attribute.") + if not res_fallback_option: + raise ValueError(f"fallback_option mismatch: expected True, {name} has {res_fallback_option}") + + # ------------------------- + # 5) Timeseries alignment checks + # ------------------------- + def _assert_dt_index(x: Union[pd.Series, pd.DataFrame], label: str) -> pd.DatetimeIndex: + if not isinstance(x.index, pd.DatetimeIndex): + raise TypeError(f"{label} index must be DatetimeIndex; got {type(x.index)}") + if not x.index.is_monotonic_increasing: + raise ValueError(f"{label} index must be sorted increasing.") + return x.index + + for name, res in results.items(): + if res is None: + continue + if res.timeseries is None: + raise ValueError(f"{name} timeseries is None.") + _assert_dt_index(res.timeseries, name) + + series_map = { + "spot": spot.timeseries if spot is not None else None, + "dividend": dividend.timeseries if dividend is not None else None, + "rates": rates.daily_risk_free_rates if rates is not None else None, + "forward": forward.timeseries if forward is not None else None, + "option_spot_midpoint": option_spot.timeseries if option_spot is not None else None, + "vol": vol.timeseries if vol is not None else None, + } + + # Determine anchor + if anchor not in series_map: + raise ValueError(f"Unknown anchor='{anchor}'. Valid anchors: {list(series_map.keys())}") + + anchor_series = series_map[anchor] + if require_anchor: + if anchor_series is None: + raise ValueError(f"Anchor '{anchor}' is None but require_anchor=True.") + if isinstance(anchor_series, pd.Series) and anchor_series.empty: + raise ValueError(f"Anchor '{anchor}' is empty but require_anchor=True.") + if isinstance(anchor_series, pd.DataFrame) and anchor_series.empty: + raise ValueError(f"Anchor '{anchor}' is empty but require_anchor=True.") + + # If no anchor (require_anchor=False) and no series, nothing to check. + if anchor_series is None: + return + + anchor_idx = _assert_dt_index(anchor_series, anchor) + + # Require overlap (intersection) with anchor for all other present series + for name, s in series_map.items(): + if name == anchor or s is None: + continue + + # empty is allowed (you may want to tighten this later) + if isinstance(s, (pd.Series, pd.DataFrame)) and s.empty: + continue + + idx = _assert_dt_index(s, name) + inter = idx.intersection(anchor_idx) + if len(inter) == 0: + raise ValueError( + f"Index intersection empty: '{name}' has [{idx.min().date()}..{idx.max().date()}], " + f"anchor '{anchor}' has [{anchor_idx.min().date()}..{anchor_idx.max().date()}]." + ) + + # Optional: global intersection check for vectorized kernels + common = None + for _, s in series_map.items(): + if s is None or (isinstance(s, (pd.Series, pd.DataFrame)) and s.empty): + continue + idx = s.index + common = idx if common is None else common.intersection(idx) + + if common is not None and len(common) == 0: + raise ValueError( + "All detected non-empty timeseries have an empty global index intersection. " + f"Non-empty series: {[k for k,v in series_map.items() if isinstance(v,(pd.Series,pd.DataFrame)) and not v.empty]}" + ) + + +def _load_model_data_timeseries(load_request: LoadRequest) -> ModelResultPack: + """ + Loads model data based on the provided load request. + + Parameters: + load_request (LoadRequest): The request specifying what data to load. + + Returns: + ModelResultPack: A container with the loaded model data. + """ + ## Import here to avoid circular dependencies + from trade.datamanager.dividend import DividendDataManager + from trade.datamanager.rates import RatesDataManager + from trade.datamanager.spot import SpotDataManager + from trade.datamanager.forward import ForwardDataManager + from trade.datamanager.option_spot import OptionSpotDataManager + from trade.datamanager.vol import VolDataManager + from trade.datamanager.greeks import GreekDataManager + + is_as_of = load_request.on_date + is_rt = load_request.rt + load_info = {} + start_time = time.time() + packet = DateRangePacket( + start_date=load_request.start_date, end_date=load_request.end_date, maturity_date=load_request.expiration + ) + load_info["date_range_packet"] = time.time() - start_time + symbol = load_request.symbol + start_date = packet.start_date + end_date = packet.end_date + expiration = packet.maturity_date + d = load_request.load_dividend + r = load_request.load_rates + s = load_request.load_spot + f = load_request.load_forward + vol = load_request.load_vol + opt_spot = load_request.load_option_spot + greek = load_request.load_greek + model_price = load_request.model_price + dividend_type = load_request.dividend_type or OptionDataConfig().dividend_type + D, R, S, F, V, G, OPTION_SPOT = ( + load_request.dividend_timeseries, + load_request.rates_timeseries, + load_request.spot_timeseries, + load_request.forward_timeseries, + load_request.vol_timeseries, + load_request.greek_timeseries, + load_request.option_spot_timeseries, + ) + + model_data = ModelResultPack() + + # Load BSM-specific data + if d: + start_time = time.time() + d_params = { + "maturity_date": expiration, + "dividend_type": dividend_type, + "undo_adjust": load_request.undo_adjust, + } + if not is_as_of and not is_rt: + D = DividendDataManager(symbol).get_schedule_timeseries( + start_date=start_date, + end_date=end_date, + **d_params, + ) + elif is_as_of and not is_rt: + D = DividendDataManager(symbol).get_schedule( + valuation_date=end_date, + fallback_option=load_request.fall_back_option, + **d_params, + ) + else: # is_rt + D = DividendDataManager(symbol).rt( + fallback_option=load_request.fall_back_option, + **d_params, + ) + load_info["dividend_load_time"] = time.time() - start_time + + if r: + start_time = time.time() + if not is_as_of and not is_rt: + R = RatesDataManager().get_risk_free_rate_timeseries(start_date=start_date, end_date=end_date) + elif is_as_of and not is_rt: + R = RatesDataManager().get_rate(date=end_date, fallback_option=load_request.fall_back_option) + else: # is_rt + R = RatesDataManager().rt(fallback_option=load_request.fall_back_option) + load_info["rates_load_time"] = time.time() - start_time + + if s: + start_time = time.time() + if not is_as_of and not is_rt: + S = SpotDataManager(symbol).get_spot_timeseries( + start_date=start_date, end_date=end_date, undo_adjust=load_request.undo_adjust + ) + elif is_as_of and not is_rt: + S = SpotDataManager(symbol).get_at_time(date=end_date) + else: # is_rt + S = SpotDataManager(symbol=symbol).rt(fallback_option=load_request.fall_back_option) + load_info["spot_load_time"] = time.time() - start_time + + if f: + start_time = time.time() + f_params = { + "maturity_date": expiration, + "use_chain_spot": load_request.undo_adjust, + "dividend_type": dividend_type, + "dividend_result": D, + "spot": S, + "rates": R, + } + if not is_as_of and not is_rt: + F = ForwardDataManager(symbol=symbol).get_forward_timeseries( + start_date=start_date, + end_date=end_date, + **f_params, + ) + elif is_as_of and not is_rt: + F = ForwardDataManager(symbol=symbol).get_forward( + date=end_date, + **f_params, + ) + else: # is_rt + F = ForwardDataManager(symbol=symbol).rt( + fallback_option=load_request.fall_back_option, + **f_params, + ) + load_info["forward_load_time"] = time.time() - start_time + + if opt_spot: + start_time = time.time() + opt_params = { + "expiration": expiration, + "strike": load_request.strike, + "right": load_request.right, + "endpoint_source": load_request.endpoint_source, + "model_price": model_price, + } + if not is_as_of and not is_rt: + market_price = OptionSpotDataManager(symbol=symbol).get_option_spot_timeseries( + start_date=start_date, + end_date=end_date, + **opt_params, + ) + elif is_as_of and not is_rt: + market_price = OptionSpotDataManager(symbol=symbol).get_option_spot( + date=end_date, + **opt_params, + ) + else: # is_rt + opt_params.pop("endpoint_source") # RT does not use endpoint_source + opt_params.pop("model_price") # RT does not use model_price + market_price = OptionSpotDataManager(symbol=symbol).rt( + **opt_params, + ) + + load_info["option_spot_load_time"] = time.time() - start_time + OPTION_SPOT = market_price + + if vol: + start_time = time.time() + v_params = { + "expiration": expiration, + "strike": load_request.strike, + "right": load_request.right, + "market_model": load_request.market_model, + "vol_model": load_request.vol_model, + "dividends": D, + "F": F, + "S": S, + "r": R, + "dividend_type": dividend_type, + "market_price": OPTION_SPOT, + "undo_adjust": load_request.undo_adjust, + "endpoint_source": load_request.endpoint_source, + "model_price": model_price, + } + if not is_as_of and not is_rt: + V = VolDataManager(symbol=symbol).get_implied_volatility_timeseries( + start_date=start_date, + end_date=end_date, + **v_params, + ) + elif is_as_of and not is_rt: + V = VolDataManager(symbol=symbol).get_at_time_implied_volatility( + as_of=end_date, + fallback_option=load_request.fall_back_option, + **v_params, + ) + else: # is_rt + v_params.pop("endpoint_source") # RT does not use endpoint_source + V = VolDataManager(symbol=symbol).rt( + fallback_option=load_request.fall_back_option, + **v_params, + ) + + load_info["vol_load_time"] = time.time() - start_time + model_data.vol = V + if greek: + start_time = time.time() + grk_params = { + "expiration": expiration, + "strike": load_request.strike, + "right": load_request.right, + "market_model": load_request.market_model, + "d": D, + "f": F, + "S": S, + "r": R, + "vol": V, + "dividend_type": dividend_type, + "undo_adjust": load_request.undo_adjust, + "endpoint_source": load_request.endpoint_source, + "model_price": model_price, + } + if not is_as_of and not is_rt: + G = GreekDataManager(symbol=symbol).get_greeks_timeseries( + start_date=start_date, + end_date=end_date, + **grk_params, + ) + elif is_as_of and not is_rt: + G = GreekDataManager(symbol=symbol).get_at_time_greeks( + as_of=end_date, + fallback_option=load_request.fall_back_option, + **grk_params, + ) + else: # is_rt + grk_params.pop("endpoint_source") # RT does not use endpoint_source + G = GreekDataManager(symbol=symbol).rt( + fallback_option=load_request.fall_back_option, + **grk_params, + ) + load_info["greek_load_time"] = time.time() - start_time + model_data.greek = G + + model_data.dividend = D + model_data.dividend_type = dividend_type + model_data.forward = F + model_data.rates = R + model_data.spot = S + model_data.option_spot = OPTION_SPOT + model_data.series_id = SeriesId.HIST if (not is_as_of and not is_rt) else SeriesId.AT_TIME + model_data.undo_adjust = load_request.undo_adjust + model_data.time_to_load = load_info + model_data.endpoint_source = load_request.endpoint_source + + + + if not any( + [ + load_request.load_dividend, + load_request.load_rates, + load_request.load_spot, + load_request.load_forward, + load_request.load_option_spot, + load_request.load_vol, + load_request.load_greek, + ] + ): + logger.info(("No data requested to load in _load_model_data_timeseries()." + f" Option: Symbol={symbol}, exp={expiration}, strike={load_request.strike} right={load_request.right}" + f" Load bools: d={d}, r={r}, s={s}, f={f}, opt_spot={opt_spot}, vol={vol}, greek={greek}")) + return model_data + + assert_synchronized_model( + packet=model_data, + symbol=symbol, + undo_adjust=load_request.undo_adjust, + dividend_type=dividend_type, + require_anchor=model_data.option_spot is not None, + is_rt=is_rt, + check_fallback_option=is_rt or is_as_of, + ) + + ## Log what was loaded only if something was actually loaded + if load_info: + log_model_load_info( + log_info=load_info, + is_rt=is_rt, + is_timeseries=not is_as_of, + symbol=symbol, + expiration=expiration, + strike=load_request.strike, + right=load_request.right, + dividend_type=dividend_type, + market_model=load_request.market_model.name if load_request.market_model else "N/A", + ) + return model_data diff --git a/trade/datamanager/utils/vol_helpers.py b/trade/datamanager/utils/vol_helpers.py new file mode 100644 index 0000000..e41d2ba --- /dev/null +++ b/trade/datamanager/utils/vol_helpers.py @@ -0,0 +1,193 @@ +from datetime import datetime +from typing import Any, Optional, Tuple, List +import pandas as pd +from trade.datamanager.result import ( + DividendsResult, + VolatilityResult, + SpotResult, + ForwardResult, + RatesResult, + OptionSpotResult, + ModelResultPack, +) +from trade.datamanager.utils.date import sync_date_index, time_distance_helper, _sync_date +from trade.datamanager.base import BaseDataManager +from trade.datamanager._enums import OptionSpotEndpointSource +from trade.datamanager.utils.cache import ( + _check_cache_for_timeseries_data_structure, + _data_structure_cache_it, +) +from trade.helpers.helper import to_datetime +from trade.helpers.Logging import setup_logger +from trade.datamanager.utils.data_structure import _data_structure_sanitize +from trade.optionlib.config.types import DivType +from trade.optionlib.assets.dividend import vector_convert_to_time_frac +from trade.datamanager.utils.logging import get_logging_level, UTILS_LOGGER_NAME + +logger = setup_logger(UTILS_LOGGER_NAME, stream_log_level=get_logging_level()) + + +def _prepare_vol_calculation_setup( + manager: BaseDataManager, + start_date: str, + end_date: str, + expiration: str, + strike: float, + right: str, + dividend_type: Optional[DivType], + endpoint_source: Optional[OptionSpotEndpointSource], + result: Optional[VolatilityResult] = None, +) -> Tuple[VolatilityResult, DivType, OptionSpotEndpointSource, str, str, datetime, datetime]: + """Prepare common setup for volatility calculations.""" + result = VolatilityResult() if result is None else result + dividend_type = dividend_type or manager.CONFIG.dividend_type + endpoint_source = endpoint_source or manager.CONFIG.option_spot_endpoint_source + + start_date, end_date = _sync_date( + symbol=manager.symbol, + start_date=start_date, + end_date=end_date, + expiration=expiration, + right=right, + strike=strike, + endpoint_source=endpoint_source, + ) + + start_str = to_datetime(start_date).strftime("%Y-%m-%d") + end_str = to_datetime(end_date).strftime("%Y-%m-%d") + + return result, dividend_type, endpoint_source, start_str, end_str, start_date, end_date + + +def _handle_cache_for_vol( + manager: BaseDataManager, + key: str, + start_date: datetime, + end_date: datetime, + result: VolatilityResult, + optional_name: Optional[str] = "vol" +) -> Tuple[Optional[pd.Series], bool, datetime, datetime, Optional[VolatilityResult]]: + """Handle cache checking logic for volatility calculations. + + Returns: + Tuple of (cached_data, is_partial, adjusted_start, adjusted_end, result_or_none) + If result_or_none is not None, caller should return it immediately (full cache hit) + """ + cached_data, is_partial, start_date, end_date = _check_cache_for_timeseries_data_structure( + key=key, self=manager, start_dt=start_date, end_dt=end_date + ) + + if cached_data is not None and not is_partial: + logger.info(f"Cache hit for {optional_name} timeseries key: {key}") + cached_data = _data_structure_sanitize( + cached_data, + start=start_date.strftime("%Y-%m-%d"), + end=end_date.strftime("%Y-%m-%d"), + source_name=f"cached {optional_name} timeseries for key: {key}", + ) + result.timeseries = cached_data + return cached_data, is_partial, start_date, end_date, result + elif is_partial: + logger.info(f"Cache partially covers requested date range. Key: {key}. Fetching missing dates.") + else: + logger.info(f"No cache found for key: {key}. Fetching from source.") + + return cached_data, is_partial, start_date, end_date, None + + +def _merge_and_cache_vol_result( + manager: BaseDataManager, + iv_timeseries: pd.Series, + cached_data: Optional[pd.Series], + is_partial: bool, + key: str, + start_str: str, + end_str: str, +) -> pd.Series: + """Merge with cache if partial, cache result, and sanitize.""" + # Merge with cached data if partial + if cached_data is not None and is_partial: + merged = pd.concat([cached_data, iv_timeseries]) + iv_timeseries = merged[~merged.index.duplicated(keep="last")].sort_index() + + # Cache the fetched data + _data_structure_cache_it(manager, key, iv_timeseries) + + # Sanitize before returning + iv_timeseries = _data_structure_sanitize( + iv_timeseries, + start=start_str, + end=end_str, + source_name=f"final {key} timeseries after merging cache and fetched data.", + ) + + return iv_timeseries + + +def _merge_provided_with_loaded_data( + model_data: "ModelResultPack", + S: Optional[SpotResult] = None, + F: Optional[ForwardResult] = None, + r: Optional[RatesResult] = None, + dividends: Optional[DividendsResult] = None, + market_price: Optional[OptionSpotResult] = None, +) -> Tuple[ + Optional[SpotResult], Optional[ForwardResult], RatesResult, Optional[DividendsResult], Optional[OptionSpotResult] +]: + """Merge user-provided data with loaded data, prioritizing provided data.""" + S = S if S is not None else model_data.spot + F = F if F is not None else model_data.forward + r = r if r is not None else model_data.rates + dividends = dividends if dividends is not None else model_data.dividend + market_price = market_price if market_price is not None else model_data.option_spot + + # Update model_data for consistency + if S is not None: + model_data.spot = S + if F is not None: + model_data.forward = F + if r is not None: + model_data.rates = r + if dividends is not None: + model_data.dividend = dividends + if market_price is not None: + model_data.option_spot = market_price + + return S, F, r, dividends, market_price + + +def _prepare_dividend_data_for_pricing( + dividends: DividendsResult, + dividend_type: DivType, + expiration: str, + *data_to_sync: pd.Series, +) -> Tuple[Any, ...]: + """Prepare dividend data and synchronize all series. + + Returns: + Tuple of synchronized series (including prepared dividends as last element) + """ + if dividend_type == DivType.DISCRETE: + dividends_ts = dividends.daily_discrete_dividends + synced = sync_date_index(*data_to_sync, dividends_ts) + + # Convert to time fractions + dividends_prepared = vector_convert_to_time_frac( + schedules=synced[-1], + valuation_dates=synced[0].index, + end_dates=[to_datetime(expiration)] * len(synced[0].index), + ) + return (*synced[:-1], dividends_prepared) + + elif dividend_type == DivType.CONTINUOUS: + dividends_ts = dividends.daily_continuous_dividends + synced = sync_date_index(*data_to_sync, dividends_ts) + return synced + + +def _prepare_time_to_expiration( + date_index: pd.DatetimeIndex, + expiration: str, +) -> List[float]: + """Calculate time to expiration for each date in the index.""" + return [time_distance_helper(x, expiration) for x in date_index] diff --git a/trade/datamanager/vars.py b/trade/datamanager/vars.py new file mode 100644 index 0000000..ae4d3a1 --- /dev/null +++ b/trade/datamanager/vars.py @@ -0,0 +1,98 @@ +from pathlib import Path +import os +import pandas as pd +from datetime import time +from datetime import datetime +from typing import List, Dict, Any +from trade.helpers.Logging import setup_logger +from typing import TYPE_CHECKING +from trade.optionlib.config.defaults import OPTION_TIMESERIES_START_DATE +from trade.datamanager.utils.logging import get_logging_level +from trade import register_signal +import signal +if TYPE_CHECKING: + from trade.datamanager.market_data import MarketTimeseries +logger = setup_logger("trade.datamanager.vars", stream_log_level=get_logging_level()) + +DM_GEN_PATH = Path(os.getenv("GEN_CACHE_PATH")) / "dm_gen_cache" +TS: "MarketTimeseries" = None # type: MarketTimeseries +_LOG_TO_DISK_BUCKET : List[Dict[str, Any]] = [] +LOADED_NAMES = set() +MARKET_OPEN_TIME = time(9, 30) +MARKET_CLOSE_TIME = time(16, 0) +DEFAULT_SCENARIOS = [0.9, 0.95, 1.0, 1.05, 1.1] +DEFAULT_VOL_SCENARIOS = [-0.02, -0.01, 0.0, 0.01, 0.02] + + +def set_times_series()-> "MarketTimeseries": + from trade.datamanager.market_data import MarketTimeseries + global TS + TS = MarketTimeseries(_end=datetime.now(), _start=OPTION_TIMESERIES_START_DATE) + return TS + +def get_times_series() -> "MarketTimeseries": + global TS + if TS is None: + set_times_series() + return TS + +def send_log_to_disk() -> None: + global _LOG_TO_DISK_BUCKET + if not _LOG_TO_DISK_BUCKET: + logger.info("No logs to write to disk.") + return + log_path = DM_GEN_PATH / "dm_runtime_logs.csv" + df = pd.DataFrame(_LOG_TO_DISK_BUCKET) + if log_path.exists(): + df_existing = pd.read_csv(log_path) + df = pd.concat([df_existing, df], ignore_index=True) + df.to_csv(log_path, index=False) + logger.info(f"Wrote {_LOG_TO_DISK_BUCKET.__len__()} log entries to disk at {log_path}.") + _LOG_TO_DISK_BUCKET.clear() + +def add_to_log_bucket(entry: Dict[str, Any]) -> None: + global _LOG_TO_DISK_BUCKET + _LOG_TO_DISK_BUCKET.append(entry) + +register_signal("exit", send_log_to_disk) +register_signal(signal.SIGINT, send_log_to_disk) +register_signal(signal.SIGTERM, send_log_to_disk) + +def load_name(symbol: str): + key = (symbol, datetime.now().date()) + global LOADED_NAMES + if key not in LOADED_NAMES: + logger.info(f"Loading timeseries for {symbol}...") + get_times_series().load_timeseries(symbol, start_date=OPTION_TIMESERIES_START_DATE, end_date=datetime.now()) + LOADED_NAMES.add(key) + else: + logger.info(f"Timeseries for {symbol} already loaded.") + +def is_name_loaded(symbol: str) -> bool: + global LOADED_NAMES + key = (symbol, datetime.now().date()) + return key in LOADED_NAMES + +def clear_loaded_names(): + global LOADED_NAMES + LOADED_NAMES.clear() + logger.info("Cleared loaded names cache.") + + +def get_loaded_names() -> set: + global LOADED_NAMES + return LOADED_NAMES + + + +## This is the time after which today data can be cached. Any time before this time, +## today data should be reloaded to ensure completeness. +TODAY_RELOAD_CUTOFF = time(18, 30) # 6:30 PM + +## This is the minimum time before real-time data is requested +## ie if current time is before this time, real-time will not query for today and instead +## rely on RealTimeFallback option +MIN_TIME_BEFORE_REAL_TIME = time(9, 45) # 9:45 AM + +## This is done to avoid circular import issues. MarketTimeseries is the main class responsible +set_times_series() \ No newline at end of file diff --git a/trade/datamanager/vol.py b/trade/datamanager/vol.py new file mode 100644 index 0000000..5ad1e0b --- /dev/null +++ b/trade/datamanager/vol.py @@ -0,0 +1,1055 @@ +"""Volatility data manager for computing implied volatilities from option market prices. + +This module provides the VolDataManager class for calculating implied volatilities using +various pricing models (Black-Scholes-Merton, Cox-Ross-Rubinstein binomial, European +equivalent). It handles the complete workflow including data loading, caching, model +selection, and result formatting. + +Key Features: + - Multiple pricing models: BSM, CRR binomial, European equivalent + - Support for American and European exercise styles + - Discrete and continuous dividend treatments + - Automatic data loading and caching + - Real-time and historical volatility calculation + - Singleton pattern per symbol for efficient resource management + +Typical Usage: + >>> from trade.datamanager.vol import VolDataManager + >>> from trade.optionlib.config.types import DivType + >>> + >>> # Initialize manager for AAPL + >>> vol_mgr = VolDataManager("AAPL") + >>> + >>> # Get implied volatilities for an option + >>> result = vol_mgr.get_implied_volatility_timeseries( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... expiration="2025-06-20", + ... strike=150.0, + ... right="c", + ... dividend_type=DivType.DISCRETE, + ... american=True + ... ) + >>> print(result.timeseries.head()) +""" +from datetime import datetime +from typing import Any, ClassVar, Optional +import pandas as pd +from trade.datamanager._enums import ( + ArtifactType, + Interval, + ModelPrice, + OptionPricingModel, + RealTimeFallbackOption, + VolatilityModel, + SeriesId, + OptionSpotEndpointSource, +) +from trade.datamanager.base import BaseDataManager, CacheSpec +from trade.datamanager.config import OptionDataConfig +from trade.datamanager.requests import LoadRequest +from trade.datamanager.result import ( + VolatilityResult, + ForwardResult, + RatesResult, + OptionSpotResult, + SpotResult, + DividendsResult, +) +from trade.datamanager.utils.vol_helpers import ( + _prepare_time_to_expiration, + _handle_cache_for_vol, + _merge_provided_with_loaded_data, + _prepare_dividend_data_for_pricing, + _merge_and_cache_vol_result, + _prepare_vol_calculation_setup, +) +from trade.datamanager.utils.model import _load_model_data_timeseries +from trade.optionlib.vol.implied_vol import vector_bsm_iv_estimation, vector_crr_iv_estimation +from trade.optionlib.pricing.binomial import vector_crr_binomial_pricing +from trade.optionlib.config.types import DivType +from trade.helpers.helper import change_to_last_busday, to_datetime +from trade.helpers.Logging import setup_logger +from trade.datamanager.utils.date import is_available_on_date, sync_date_index +from trade.datamanager.utils.logging import get_logging_level +from trade.optionlib.assets.dividend import vector_convert_to_time_frac + +logger = setup_logger("trade.datamanager.vol", stream_log_level=get_logging_level()) + +class VolDataManager(BaseDataManager): + """Manager for computing and caching implied volatilities from option market prices. + + Singleton class (per symbol) that orchestrates the computation of implied volatilities + using various option pricing models. Automatically loads required market data (spot, + forward, rates, dividends, option prices) and caches results for efficient reuse. + + Supports three pricing approaches: + 1. Black-Scholes-Merton (BSM) - Fast, European options only + 2. Cox-Ross-Rubinstein (CRR) - Binomial tree, supports American exercise + 3. European Equivalent (EURO_EQIV) - Converts American IVs to European equivalent + + Attributes: + CACHE_NAME: Cache identifier for volatility data. + DEFAULT_SERIES_ID: Default series identifier (historical data). + CONFIG: Configuration object with default settings for pricing models. + INSTANCES: Class-level dict maintaining singleton instances per symbol. + symbol: Ticker symbol for the underlying asset. + + Examples: + >>> # Basic usage with BSM model + >>> vol_mgr = VolDataManager("AAPL") + >>> result = vol_mgr.get_implied_volatility_timeseries( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... expiration="2025-06-20", + ... strike=150.0, + ... right="c", + ... model=OptionPricingModel.BSM + ... ) + + >>> # American option with CRR binomial + >>> result = vol_mgr.get_implied_volatility_timeseries( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... expiration="2025-06-20", + ... strike=150.0, + ... right="p", + ... american=True, + ... model=OptionPricingModel.BINOMIAL, + ... n_steps=200 + ... ) + + >>> # Real-time volatility + >>> rt_vol = vol_mgr.rt( + ... expiration="2025-06-20", + ... strike=150.0, + ... right="c" + ... ) + """ + CACHE_NAME: ClassVar[str] = "vol_data_manager_cache" + DEFAULT_SERIES_ID: ClassVar["SeriesId"] = SeriesId.HIST + CONFIG: OptionDataConfig = OptionDataConfig() + CACHE_SPEC: CacheSpec = CacheSpec(cache_fname=CACHE_NAME) + INSTANCES: ClassVar[dict[str, "VolDataManager"]] = {} + + def __new__(cls, symbol: str, *args: Any, **kwargs: Any) -> "VolDataManager": + if symbol not in cls.INSTANCES: + instance = object.__new__(cls) + cls.INSTANCES[symbol] = instance + return cls.INSTANCES[symbol] + + def __init__( + self, symbol: str, *, enable_namespacing: bool = False + ) -> None: + """Initialize VolDataManager with symbol-specific configuration. + + Args: + symbol: Ticker symbol for the underlying asset (e.g., "AAPL", "MSFT"). + enable_namespacing: If True, enables namespace prefixing for cache keys. + + Examples: + >>> # Basic initialization + >>> vol_mgr = VolDataManager("AAPL") + + >>> # With custom cache settings + >>> from trade.datamanager.base import CacheSpec + >>> cache_spec = CacheSpec( + ... default_expire_days=365, + ... cache_fname="custom_vol_cache" + ... ) + >>> vol_mgr = VolDataManager("AAPL", cache_spec=cache_spec) + """ + self.symbol = symbol + + if getattr(self, "_initialized", False): + return + self._initialized = True + super().__init__( + enable_namespacing=enable_namespacing, + symbol=symbol, + ) + + def _get_bsm_implied_volatility_timeseries( + self, + start_date: str, + end_date: str, + expiration: str, + strike: float, + right: str, + dividend_type: Optional[DivType] = DivType.DISCRETE, + *, + result: Optional[VolatilityResult] = None, + F: Optional[ForwardResult] = None, + r: Optional[RatesResult] = None, + market_price: Optional[OptionSpotResult] = None, + model_price: Optional[ModelPrice] = None, + undo_adjust: bool = True, + ) -> VolatilityResult: + """Compute implied volatilities using Black-Scholes-Merton model. + + Internal method that calculates daily implied volatilities by matching market prices + to BSM prices. Automatically loads required data (forward, rates, option prices) if + not provided. Uses caching to avoid redundant computations. + + Args: + start_date: First valuation date (YYYY-MM-DD string or datetime). + end_date: Last valuation date (YYYY-MM-DD string or datetime). + expiration: Option expiration date (YYYY-MM-DD string or datetime). + strike: Strike price of the option. + right: Option type ('c' for call, 'p' for put). + dividend_type: Dividend treatment type (DISCRETE or CONTINUOUS). + result: Optional pre-initialized VolatilityResult container. + F: Optional pre-computed forward prices. If None, loads automatically. + r: Optional pre-computed risk-free rates. If None, loads automatically. + market_price: Optional pre-computed option market prices. If None, loads automatically. + undo_adjust: If True, uses split-adjusted prices. + model_price: Optional[ModelPrice] = None, + Specifies which price to use from option spot data (CLOSE, OPEN, MIDPOINT). + If None, defaults to CONFIG.model_price. + Returns: + VolatilityResult containing daily implied volatilities with DatetimeIndex, + model metadata, and cache key. + + Examples: + >>> # Internal usage - typically called via get_implied_volatility_timeseries + >>> result = vol_mgr._get_bsm_implied_volatility_timeseries( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... expiration="2025-06-20", + ... strike=150.0, + ... right="c", + ... dividend_type=DivType.DISCRETE + ... ) + """ + + # Use utility: Prepare setup + endpoint_source = result.endpoint_source if result is not None else self.CONFIG.option_spot_endpoint_source + result, dividend_type, endpoint_source, start_str, end_str, start_date, end_date = _prepare_vol_calculation_setup( + self, start_date, end_date, expiration, strike, right, dividend_type, endpoint_source, result + ) + # Make key for caching + key = self.make_key( + symbol=self.symbol, + interval=Interval.EOD, + artifact_type=ArtifactType.IV, + series_id=SeriesId.HIST, + option_pricing_model=OptionPricingModel.BSM, + volatility_model=VolatilityModel.MARKET, + model_price=model_price or self.CONFIG.model_price, + dividend_type=dividend_type, + endpoint_source=endpoint_source, + expiration=expiration, + strike=strike, + right=right, + ) + + # Use utility: Handle cache + cached_data, is_partial, start_date, end_date, early_return = _handle_cache_for_vol( + self, key, start_date, end_date, result + ) + if early_return is not None: + return early_return + + + # Load model data + load_request = LoadRequest( + symbol=self.symbol, + start_date=start_date, + end_date=end_date, + expiration=expiration, + dividend_type=dividend_type, + load_spot=False, + load_forward=F is None, + load_rates=r is None, + load_option_spot=market_price is None, + load_dividend=False, ## Not needed for BSM IV. Already handled in forward. + load_vol=False, + strike=strike, + right=right, + undo_adjust=undo_adjust, + endpoint_source=endpoint_source, + model_price=model_price, + ) + model_data = _load_model_data_timeseries(load_request) + + + # Use utility: Merge provided data + _, F, r, _, market_price = _merge_provided_with_loaded_data(model_data, F=F, r=r, market_price=market_price) + + # Extract data + forward = F.daily_continuous_forward if dividend_type == DivType.CONTINUOUS else F.daily_discrete_forward + rates = r.daily_risk_free_rates + option_spot = market_price.price + forward, rates, option_spot = sync_date_index(forward, rates, option_spot) + + # Use utility: Prepare T + T = _prepare_time_to_expiration(forward.index, expiration) + + # Calculate IV + iv_timeseries = vector_bsm_iv_estimation( + F=forward.values, + K=[strike] * len(forward), + T=T, + r=rates.values, + market_price=option_spot.values, + right=[right.lower()] * len(forward), + ) + iv_timeseries = pd.Series(data=iv_timeseries, index=forward.index) + + # Use utility: Merge and cache + iv_timeseries = _merge_and_cache_vol_result( + self, iv_timeseries, cached_data, is_partial, key, start_str, end_str + ) + + # Prepare result + result.timeseries = iv_timeseries + return result + + def _get_crr_implied_volatility_timeseries( + self, + start_date: str, + end_date: str, + expiration: str, + strike: float, + right: str, + dividend_type: Optional[DivType] = DivType.DISCRETE, + american: bool = True, + result: Optional[VolatilityResult] = None, + *, + S: Optional[SpotResult] = None, + r: Optional[RatesResult] = None, + dividends: Optional[DividendsResult] = None, + market_price: Optional[OptionSpotResult] = None, + model_price: Optional[ModelPrice] = None, + undo_adjust: bool = True, + n_steps: Optional[int] = None, + ) -> VolatilityResult: + """Compute implied volatilities using Cox-Ross-Rubinstein binomial model. + + Internal method that calculates daily implied volatilities using CRR binomial trees. + Supports both American and European exercise styles. Automatically loads required + data (spot, rates, dividends, option prices) if not provided. Uses caching for + efficient reuse. + + Args: + start_date: First valuation date (YYYY-MM-DD string or datetime). + end_date: Last valuation date (YYYY-MM-DD string or datetime). + expiration: Option expiration date (YYYY-MM-DD string or datetime). + strike: Strike price of the option. + right: Option type ('c' for call, 'p' for put). + dividend_type: Dividend treatment type (DISCRETE or CONTINUOUS). + american: If True, prices American exercise; if False, European. + result: Optional pre-initialized VolatilityResult container. + S: Optional pre-computed spot prices. If None, loads automatically. + r: Optional pre-computed risk-free rates. If None, loads automatically. + dividends: Optional pre-computed dividend data. If None, loads automatically. + market_price: Optional pre-computed option market prices. If None, loads automatically. + undo_adjust: If True, uses split-adjusted prices. + n_steps: Number of time steps in binomial tree. Defaults to CONFIG.n_steps. + + Returns: + VolatilityResult containing daily implied volatilities with DatetimeIndex, + model metadata (BINOMIAL), and cache key. + + Examples: + >>> # Internal usage - typically called via get_implied_volatility_timeseries + >>> result = vol_mgr._get_crr_implied_volatility_timeseries( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... expiration="2025-06-20", + ... strike=150.0, + ... right="p", + ... american=True, + ... n_steps=200 + ... ) + """ + + # Use utility: Prepare setup + endpoint_source = market_price.endpoint_source if market_price is not None else None + result, dividend_type, endpoint_source, start_str, end_str, start_date, end_date = _prepare_vol_calculation_setup( + self, start_date, end_date, expiration, strike, right, dividend_type, endpoint_source, result + ) + n_steps = n_steps or self.CONFIG.n_steps + + # Make key for caching + key = self.make_key( + symbol=self.symbol, + interval=Interval.EOD, + artifact_type=ArtifactType.IV, + series_id=SeriesId.HIST, + option_pricing_model=OptionPricingModel.BINOMIAL, + volatility_model=VolatilityModel.MARKET, + model_price=model_price or self.CONFIG.model_price, + dividend_type=dividend_type, + endpoint_source=endpoint_source, + expiration=expiration, + strike=strike, + right=right, + american=american, + n_steps=n_steps, + ) + result.key = key + + # Use utility: Handle cache + cached_data, is_partial, start_date, end_date, early_return = _handle_cache_for_vol( + self, key, start_date, end_date, result + ) + if early_return is not None: + return early_return + + # Load model data + load_request = LoadRequest( + symbol=self.symbol, + start_date=start_date, + end_date=end_date, + expiration=expiration, + dividend_type=dividend_type, + model_price=model_price or self.CONFIG.model_price, + load_spot=S is None, + load_rates=r is None, + load_dividend=dividends is None, + load_option_spot=market_price is None, + load_forward= False, ## Not needed for CRR IV. Spot used directly. + load_vol=False, + strike=strike, + right=right, + undo_adjust=undo_adjust, + endpoint_source=endpoint_source, + ) + model_data = _load_model_data_timeseries(load_request) + + # Use utility: Merge provided data + S, _, r, dividends, market_price = _merge_provided_with_loaded_data( + model_data, S=S, r=r, dividends=dividends, market_price=market_price + ) + + # Extract data + spot = S.daily_spot + rates = r.daily_risk_free_rates + option_spot = market_price.price + + # Use utility: Prepare dividends and sync + spot, rates, option_spot, dividends_ts = _prepare_dividend_data_for_pricing( + dividends, dividend_type, expiration, spot, rates, option_spot + ) + + # Use utility: Prepare T + T = _prepare_time_to_expiration(option_spot.index, expiration) + + # Calculate IV + iv_timeseries = vector_crr_iv_estimation( + S=spot.values, + K=[strike] * len(spot), + T=T, + r=rates.values, + market_price=option_spot.values, + dividends=dividends_ts, + option_type=[right.lower()] * len(spot), + dividend_type=[dividend_type.name.lower()] * len(spot), + american=[american] * len(spot), + N=[n_steps] * len(spot), + ) + iv_timeseries = pd.Series(data=iv_timeseries, index=spot.index) + + # Use utility: Merge and cache + iv_timeseries = _merge_and_cache_vol_result( + self, iv_timeseries, cached_data, is_partial, key, start_str, end_str + ) + + # Prepare result + result.timeseries = iv_timeseries + return result + + def _get_european_equivalent_volatility_timeseries( + self, + start_date: str, + end_date: str, + expiration: str, + strike: float, + right: str, + *, + result: Optional[VolatilityResult] = None, + crr_american_vols: VolatilityResult, + F: Optional[ForwardResult] = None, + r: Optional[RatesResult] = None, + dividends: Optional[DividendsResult] = None, + dividend_type: Optional[DivType] = DivType.DISCRETE, + undo_adjust: bool = True, + n_steps: Optional[int] = None, + ) -> VolatilityResult: + """Convert American implied volatilities to European-equivalent BSM volatilities. + + Internal method that takes CRR American implied volatilities and converts them to + European-equivalent Black-Scholes volatilities. This is done by: + 1. Pricing European options using CRR with American IVs + 2. Solving for BSM volatilities that match those European CRR prices + + This conversion is useful for comparing American option volatilities to European + benchmarks or for further analysis requiring BSM framework. + + Args: + start_date: First valuation date (YYYY-MM-DD string or datetime). + end_date: Last valuation date (YYYY-MM-DD string or datetime). + expiration: Option expiration date (YYYY-MM-DD string or datetime). + strike: Strike price of the option. + right: Option type ('c' for call, 'p' for put). + result: Optional pre-initialized VolatilityResult container. + crr_american_vols: Pre-computed American implied volatilities from CRR model. + F: Optional pre-computed forward prices. If None, loads automatically. + r: Optional pre-computed risk-free rates. If None, loads automatically. + dividends: Optional pre-computed dividend data. If None, loads automatically. + dividend_type: Dividend treatment type (DISCRETE or CONTINUOUS). + undo_adjust: If True, uses split-adjusted prices. + n_steps: Number of time steps in binomial tree. Defaults to CONFIG.n_steps. + + Returns: + VolatilityResult containing daily European-equivalent implied volatilities + with DatetimeIndex, model metadata (EURO_EQIV), and cache key. + + Examples: + >>> # Internal usage - typically called via get_implied_volatility_timeseries + >>> # First get American IVs + >>> american_vols = vol_mgr._get_crr_implied_volatility_timeseries(...) + >>> # Convert to European equivalent + >>> euro_vols = vol_mgr._get_european_equivalent_volatility_timeseries( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... expiration="2025-06-20", + ... strike=150.0, + ... right="p", + ... crr_american_vols=american_vols + ... ) + """ + + # Use utility: Prepare setup + endpoint_source = crr_american_vols.endpoint_source + result, dividend_type, endpoint_source, start_str, end_str, start_date, end_date = _prepare_vol_calculation_setup( + self, start_date, end_date, expiration, strike, right, dividend_type, endpoint_source, result + ) + + # Make key for caching + key = self.make_key( + symbol=self.symbol, + interval=Interval.EOD, + artifact_type=ArtifactType.IV, + series_id=SeriesId.HIST, + option_pricing_model=OptionPricingModel.EURO_EQIV, + volatility_model=VolatilityModel.MARKET, + dividend_type=dividend_type, + endpoint_source=endpoint_source, + expiration=expiration, + strike=strike, + right=right, + ) + + # Use utility: Handle cache + cached_data, is_partial, start_date, end_date, early_return = _handle_cache_for_vol( + self, key, start_date, end_date, result + ) + if early_return is not None: + return early_return + + # Load model data + load_request = LoadRequest( + symbol=self.symbol, + start_date=start_date, + end_date=end_date, + expiration=expiration, + dividend_type=dividend_type, + load_spot=True, + load_forward=F is None, + load_rates=r is None, + load_dividend=dividends is None, + strike=strike, + right=right, + undo_adjust=undo_adjust, + endpoint_source=endpoint_source, + ) + model_data = _load_model_data_timeseries(load_request) + + # Use utility: Merge provided data + S, F, r, dividends, _ = _merge_provided_with_loaded_data( + model_data, S=model_data.spot, F=F, r=r, dividends=dividends + ) + + # Extract data + spot = S.daily_spot + forward = F.daily_continuous_forward if dividend_type == DivType.CONTINUOUS else F.daily_discrete_forward + rates = r.daily_risk_free_rates + + # Prepare dividends based on type + if dividend_type == DivType.DISCRETE: + dividends_ts = dividends.daily_discrete_dividends + spot, forward, rates, dividends_ts, crr_american_iv = sync_date_index( + spot, forward, rates, dividends_ts, crr_american_vols.timeseries + ) + dividends_ts = vector_convert_to_time_frac( + schedules=dividends_ts, + valuation_dates=spot.index, + end_dates=[to_datetime(expiration)] * len(spot.index), + ) + dividend_yield = pd.Series(data=0.0, index=spot.index) + elif dividend_type == DivType.CONTINUOUS: + dividends_yield = dividends.daily_continuous_dividends + spot, forward, rates, dividend_yield, crr_american_iv = sync_date_index( + spot, forward, rates, dividends_yield, crr_american_vols.timeseries + ) + dividends_ts = [()] * len(spot) + + # Price with CRR using American IVs in European mode + european_crr_price = vector_crr_binomial_pricing( + S0=spot.values, + K=[strike] * len(spot), + T=_prepare_time_to_expiration(spot.index, expiration), + r=rates.values, + sigma=crr_american_iv.values, + dividend_yield=dividend_yield.values, + dividends=dividends_ts, + right=[right.lower()] * len(spot), + N=[n_steps or self.CONFIG.n_steps] * len(spot), + dividend_type=[dividend_type.name.lower()] * len(spot), + american=[False] * len(spot), + ) + + # Convert to BSM equivalent IV + european_equiv_iv = vector_bsm_iv_estimation( + F=forward.values, + K=[strike] * len(spot), + T=_prepare_time_to_expiration(spot.index, expiration), + r=rates.values, + market_price=european_crr_price, + right=[right.lower()] * len(spot), + ) + european_equiv_iv = pd.Series(data=european_equiv_iv, index=spot.index) + + # Use utility: Merge and cache + european_equiv_iv = _merge_and_cache_vol_result( + self, european_equiv_iv, cached_data, is_partial, key, start_str, end_str + ) + + # Prepare result + result.timeseries = european_equiv_iv + return result + + def get_implied_volatility_timeseries( + self, + start_date: str, + end_date: str, + expiration: str, + strike: float, + right: str, + dividend_type: Optional[DivType] = None, + american: bool = True, + *, + market_model: Optional[OptionPricingModel] = None, + S: Optional[SpotResult] = None, + F: Optional[ForwardResult] = None, + dividends: Optional[DividendsResult] = None, + r: Optional[RatesResult] = None, + market_price: Optional[OptionSpotResult] = None, + undo_adjust: bool = True, + n_steps: Optional[int] = None, + endpoint_source: Optional[OptionSpotEndpointSource] = None, + vol_model: Optional[VolatilityModel] = None, + model_price: Optional[ModelPrice] = None, + ) -> VolatilityResult: + """Compute daily implied volatilities for a specific option across a date range. + + Main public method for calculating implied volatility timeseries. Automatically + selects the appropriate pricing model (BSM, CRR, or European equivalent) and + orchestrates data loading, computation, and caching. + + Args: + start_date: First valuation date (YYYY-MM-DD string or datetime). + end_date: Last valuation date (YYYY-MM-DD string or datetime). + expiration: Option expiration date (YYYY-MM-DD string or datetime). + strike: Strike price of the option. + right: Option type ('c' for call, 'p' for put). + dividend_type: Dividend treatment (DISCRETE or CONTINUOUS). Defaults to DISCRETE. + american: If True, uses American exercise; if False, European. + model: Pricing model to use (BSM, BINOMIAL, EURO_EQIV). Defaults to CONFIG.option_model. + model_price: Pricing model price to use (CLOSE, MIDPOINT). Defaults to CONFIG.model_price. + S: Optional pre-computed spot prices. If None, loads automatically. + F: Optional pre-computed forward prices. If None, loads automatically. + dividends: Optional pre-computed dividend data. If None, loads automatically. + r: Optional pre-computed risk-free rates. If None, loads automatically. + market_price: Optional pre-computed option prices. If None, loads automatically. + undo_adjust: If True, uses split-adjusted prices. + n_steps: Number of binomial tree steps. Only used for BINOMIAL/EURO_EQIV models. + endpoint_source: Data source for option prices (e.g., CHAIN, QUOTE). + vol_model: Volatility model to use (MARKET). Defaults to CONFIG.volatility_model. + model_price: Pricing model price to use (CLOSE, MIDPOINT). Defaults to CONFIG.model_price. + Returns: + VolatilityResult containing: + - timeseries: Daily implied volatilities as pandas Series + - model: Volatility model type (MARKET) + - market_model: Pricing model used (BSM, BINOMIAL, or EURO_EQIV) + - dividend_type: Dividend treatment used + - key: Cache key for result + - model_price: Pricing model price used (CLOSE, MIDPOINT) + Raises: + ValueError: If unsupported pricing model is specified. + + Examples: + >>> # Basic European call with BSM + >>> vol_mgr = VolDataManager("AAPL") + >>> result = vol_mgr.get_implied_volatility_timeseries( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... expiration="2025-06-20", + ... strike=150.0, + ... right="c", + ... american=False, + ... model=OptionPricingModel.BSM + ... ) + >>> print(result.timeseries.head()) + + >>> # American put with CRR binomial + >>> result = vol_mgr.get_implied_volatility_timeseries( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... expiration="2025-06-20", + ... strike=150.0, + ... right="p", + ... american=True, + ... model=OptionPricingModel.BINOMIAL, + ... n_steps=200, + ... dividend_type=DivType.DISCRETE + ... ) + + >>> # European equivalent from American + >>> result = vol_mgr.get_implied_volatility_timeseries( + ... start_date="2025-01-01", + ... end_date="2025-01-31", + ... expiration="2025-06-20", + ... strike=150.0, + ... right="c", + ... model=OptionPricingModel.EURO_EQIV + ... ) + """ + # Volatility model (currently only MARKET supported) + vol_model = vol_model or self.CONFIG.volatility_model + + # Load model information + market_model = market_model or self.CONFIG.option_model + if dividend_type is None: + logger.info(f"VolDm Using default dividend type from config: {self.CONFIG.dividend_type}") + else: + logger.info(f"VolDm Using specified dividend type: {dividend_type}") + dividend_type = dividend_type or self.CONFIG.dividend_type + endpoint_source = endpoint_source or self.CONFIG.option_spot_endpoint_source + model_price = model_price or self.CONFIG.model_price + logger.info(f"VolDm Using model price: {model_price}") + + # Prepare result container + result = VolatilityResult() + result.symbol = self.symbol + result.expiration = to_datetime(expiration) + result.right = right + result.strike = strike + result.dividend_type = dividend_type + result.vol_model = vol_model + result.endpoint_source = endpoint_source + result.market_model = market_model + result.undo_adjust = undo_adjust + result.model_price = model_price + + if market_model == OptionPricingModel.BSM: + return self._get_bsm_implied_volatility_timeseries( + start_date=start_date, + end_date=end_date, + expiration=expiration, + strike=strike, + right=right, + dividend_type=dividend_type, + F=F, + r=r, + market_price=market_price, + model_price=model_price, + undo_adjust=undo_adjust, + result=result, + ) + elif market_model == OptionPricingModel.BINOMIAL: + return self._get_crr_implied_volatility_timeseries( + start_date=start_date, + end_date=end_date, + expiration=expiration, + strike=strike, + right=right, + dividend_type=dividend_type, + S=S, + r=r, + dividends=dividends, + market_price=market_price, + undo_adjust=undo_adjust, + model_price=model_price, + american=american, + n_steps=n_steps, + result=result, + ) + elif market_model == OptionPricingModel.EURO_EQIV: + # First get the CRR American implied volatilities + crr_american_vols = self._get_crr_implied_volatility_timeseries( + start_date=start_date, + end_date=end_date, + expiration=expiration, + strike=strike, + right=right, + dividend_type=dividend_type, + S=S, + r=r, + dividends=dividends, + market_price=market_price, + undo_adjust=undo_adjust, + american=True, + n_steps=n_steps, + model_price=model_price, + result=result, + ) + return self._get_european_equivalent_volatility_timeseries( + start_date=start_date, + end_date=end_date, + expiration=expiration, + strike=strike, + right=right, + crr_american_vols=crr_american_vols, + F=F, + r=r, + dividends=dividends, + dividend_type=dividend_type, + undo_adjust=undo_adjust, + n_steps=n_steps, + result=result, + ) + else: + raise ValueError(f"Unsupported option pricing model: {market_model}") + + def get_at_time_implied_volatility( + self, + as_of: str, + expiration: str, + strike: float, + right: str, + dividend_type: Optional[DivType] = DivType.DISCRETE, + american: bool = True, + *, + vol_model: Optional[VolatilityModel] = None, + fallback_option: Optional[RealTimeFallbackOption] = None, + market_model: Optional[OptionPricingModel] = None, + S: Optional[SpotResult] = None, + F: Optional[ForwardResult] = None, + dividends: Optional[DividendsResult] = None, + r: Optional[RatesResult] = None, + market_price: Optional[OptionSpotResult] = None, + undo_adjust: bool = True, + n_steps: Optional[int] = None, + endpoint_source: Optional[OptionSpotEndpointSource] = None, + model_price: Optional[ModelPrice] = None, + ) -> VolatilityResult: + """Compute implied volatility at a specific point in time. + + Convenience method that retrieves implied volatility for a single date by calling + get_implied_volatility_timeseries with start_date=end_date=as_of. Useful for + historical backtesting or analysis at specific dates. + + Args: + as_of: Specific valuation date (YYYY-MM-DD string or datetime). + expiration: Option expiration date (YYYY-MM-DD string or datetime). + strike: Strike price of the option. + right: Option type ('c' for call, 'p' for put). + dividend_type: Dividend treatment (DISCRETE or CONTINUOUS). Defaults to DISCRETE. + american: If True, uses American exercise; if False, European. + market_model: Pricing model to use (BSM, BINOMIAL, EURO_EQIV). Defaults to CONFIG.option_model. + S: Optional pre-computed spot prices. If None, loads automatically. + F: Optional pre-computed forward prices. If None, loads automatically. + dividends: Optional pre-computed dividend data. If None, loads automatically. + r: Optional pre-computed risk-free rates. If None, loads automatically. + market_price: Optional pre-computed option prices. If None, loads automatically. + undo_adjust: If True, uses split-adjusted prices. + n_steps: Number of binomial tree steps. Only used for BINOMIAL/EURO_EQIV models. + endpoint_source: Data source for option prices (e.g., CHAIN, QUOTE). + + Returns: + VolatilityResult with single-row timeseries containing the implied volatility + at the specified date. + + Examples: + >>> # Get IV on a specific historical date + >>> vol_mgr = VolDataManager("AAPL") + >>> result = vol_mgr.get_at_time_implied_volatility( + ... as_of="2025-01-15", + ... expiration="2025-06-20", + ... strike=150.0, + ... right="c", + ... american=True + ... ) + >>> print(f"IV on 2025-01-15: {result.timeseries.iloc[0]:.4f}") + + >>> # Use in backtesting loop + >>> for date in backtest_dates: + ... vol_result = vol_mgr.get_at_time_implied_volatility( + ... as_of=date, + ... expiration=expiration, + ... strike=strike, + ... right="p" + ... ) + ... iv_value = vol_result.timeseries.iloc[0] + """ + fallback_option = fallback_option or self.CONFIG.real_time_fallback_option + model_price = model_price or self.CONFIG.model_price + as_of = to_datetime(as_of) + if not is_available_on_date(as_of): + logger.warning( + f"Valuation date {as_of} is not a business day or holiday. Resolving using fallback options {fallback_option}." + ) + if fallback_option == RealTimeFallbackOption.RAISE_ERROR: + raise ValueError(f"Valuation date {as_of} is not a business day or holiday.") + if fallback_option == RealTimeFallbackOption.USE_LAST_AVAILABLE: + ## Move date back to last business day + ## Using only change_to_last_busday assumes input date is not business day or is holiday + ## Which the function would roll back + ## But there's a possibility input date is today's date but before market open + ## In that case we need to move back one more business day + as_of = change_to_last_busday(as_of - pd.tseries.offsets.BDay(1), time_of_day_aware=False) + else: + result = VolatilityResult() + result.timeseries = pd.Series(dtype=float, + index=pd.DatetimeIndex([to_datetime(as_of)]), + values = [float('nan') if fallback_option == RealTimeFallbackOption.NAN else 0.0]) + + result.key = None + result.vol_model = vol_model or self.CONFIG.volatility_model + result.market_model = market_model or self.CONFIG.option_model + result.expiration = to_datetime(expiration) + result.right = right + result.strike = strike + result.endpoint_source = endpoint_source or self.CONFIG.option_spot_endpoint_source + result.dividend_type = dividend_type or self.CONFIG.dividend_type + result.symbol = self.symbol + result.undo_adjust = undo_adjust + result.model_price = model_price + result.fallback_option = fallback_option + + return result + + iv_timeseries = self.get_implied_volatility_timeseries( + start_date=as_of, + end_date=as_of, + expiration=expiration, + strike=strike, + right=right, + dividend_type=dividend_type, + american=american, + market_model=market_model, + S=S, + F=F, + dividends=dividends, + r=r, + market_price=market_price, + undo_adjust=undo_adjust, + n_steps=n_steps, + endpoint_source=endpoint_source, + vol_model=vol_model, + model_price=model_price, + ) + iv_timeseries.timeseries = iv_timeseries.timeseries.loc[to_datetime(as_of) : to_datetime(as_of)] + iv_timeseries.fallback_option = fallback_option + return iv_timeseries + + def rt( + self, + expiration: str, + strike: float, + right: str, + dividend_type: Optional[DivType] = DivType.DISCRETE, + american: bool = True, + *, + vol_model: Optional[VolatilityModel] = None, + fallback_option: Optional[RealTimeFallbackOption] = None, + market_model: Optional[OptionPricingModel] = None, + S: Optional[SpotResult] = None, + F: Optional[ForwardResult] = None, + dividends: Optional[DividendsResult] = None, + r: Optional[RatesResult] = None, + market_price: Optional[OptionSpotResult] = None, + undo_adjust: bool = True, + n_steps: Optional[int] = None, + model_price: Optional[ModelPrice] = None, + ) -> VolatilityResult: + """Compute current real-time implied volatility using latest market data. + + Convenience method for real-time volatility calculation. Automatically uses today's + date and QUOTE endpoint source for live market prices. Useful for live trading, + monitoring, and real-time analytics. + + Args: + expiration: Option expiration date (YYYY-MM-DD string or datetime). + strike: Strike price of the option. + right: Option type ('c' for call, 'p' for put). + dividend_type: Dividend treatment (DISCRETE or CONTINUOUS). Defaults to DISCRETE. + american: If True, uses American exercise; if False, European. + market_model: Pricing model to use (BSM, BINOMIAL, EURO_EQIV). Defaults to CONFIG.option_model. + S: Optional pre-computed spot prices. If None, loads automatically. + F: Optional pre-computed forward prices. If None, loads automatically. + dividends: Optional pre-computed dividend data. If None, loads automatically. + r: Optional pre-computed risk-free rates. If None, loads automatically. + market_price: Optional pre-computed option prices. If None, fetches live quotes. + undo_adjust: If True, uses split-adjusted prices. + n_steps: Number of binomial tree steps. Only used for BINOMIAL/EURO_EQIV models. + + Returns: + VolatilityResult with single-row timeseries containing the current implied + volatility. Uses OptionSpotEndpointSource.QUOTE for real-time data. + + Examples: + >>> # Get current IV for a call option + >>> vol_mgr = VolDataManager("AAPL") + >>> rt_vol = vol_mgr.rt( + ... expiration="2025-06-20", + ... strike=150.0, + ... right="c" + ... ) + >>> print(f"Current IV: {rt_vol.timeseries.iloc[0]:.4f}") + + >>> # Monitor IV throughout the trading day + >>> import time + >>> while market_open: + ... vol = vol_mgr.rt( + ... expiration="2025-06-20", + ... strike=150.0, + ... right="p", + ... american=True + ... ) + ... print(f"Current IV: {vol.timeseries.iloc[0]:.4f}") + ... time.sleep(60) # Update every minute + + >>> # Use with specific model + >>> rt_vol = vol_mgr.rt( + ... expiration="2025-06-20", + ... strike=150.0, + ... right="c", + ... market_model=OptionPricingModel.BSM + ... ) + """ + res = self.get_at_time_implied_volatility( + as_of=datetime.now().strftime("%Y-%m-%d"), + expiration=expiration, + strike=strike, + right=right, + dividend_type=dividend_type, + american=american, + market_model=market_model, + S=S, + F=F, + dividends=dividends, + r=r, + market_price=market_price, + undo_adjust=undo_adjust, + n_steps=n_steps, + endpoint_source=OptionSpotEndpointSource.QUOTE, + fallback_option=fallback_option, + model_price=model_price, + vol_model=vol_model, + ) + res.rt = True + return res \ No newline at end of file diff --git a/trade/helpers/Logging.py b/trade/helpers/Logging.py index cfbd35c..f98c598 100644 --- a/trade/helpers/Logging.py +++ b/trade/helpers/Logging.py @@ -5,6 +5,7 @@ from datetime import datetime from zoneinfo import ZoneInfo from dotenv import load_dotenv +from typing import List from logging.handlers import TimedRotatingFileHandler load_dotenv() @@ -23,6 +24,23 @@ def converter(self, timestamp): if self.tz: dt = dt.astimezone(self.tz) return dt.timetuple() + + +def find_logger_names_by_pattern(pattern: str) -> List[str]: + """Find all logger names that start with the given pattern.""" + return [ + name + for name in logging.Logger.manager.loggerDict.keys() + if name.startswith(pattern) + ] + +def find_loggers_by_pattern(pattern: str) -> List[logging.Logger]: + """Find all loggers whose names start with the given pattern.""" + return [ + logging.getLogger(name) + for name in logging.Logger.manager.loggerDict.keys() + if name.startswith(pattern) + ] def find_project_root(current_path: Path, marker=".git"): diff --git a/trade/helpers/decorators.py b/trade/helpers/decorators.py index dcca5b9..08b8363 100644 --- a/trade/helpers/decorators.py +++ b/trade/helpers/decorators.py @@ -1,5 +1,5 @@ # pylint: disable=broad-exception-caught -from trade import register_signal +from trade import register_signal, TIMING_ANALYSIS_CACHE_PATH import time import numbers import asyncio @@ -10,8 +10,6 @@ import pstats import io import traceback -import os -from pathlib import Path from datetime import datetime import signal import pandas as pd @@ -38,7 +36,7 @@ def _save_timeit_metadata(): return try: - cache_path = Path(os.environ.get("GEN_CACHE_PATH", ".cache")) + cache_path = TIMING_ANALYSIS_CACHE_PATH cache_path.mkdir(parents=True, exist_ok=True) # Single CSV file for all timeit logs @@ -412,7 +410,7 @@ def wrapper(*args, **kwargs): stream = io.StringIO() stats = pstats.Stats(profiler, stream=stream).sort_stats("cumulative") stats.print_stats() - return results, stream.getvalue() + return results, stats return wrapper @@ -426,7 +424,7 @@ def cprofiler_func(func, *args, **kwargs): stream = io.StringIO() stats = pstats.Stats(profiler, stream=stream).sort_stats("cumulative") stats.print_stats() - return results, stream.getvalue() + return results, stats def copy_doc(from_func): diff --git a/trade/helpers/exit_helpers.py b/trade/helpers/exit_helpers.py new file mode 100644 index 0000000..ceb9a08 --- /dev/null +++ b/trade/helpers/exit_helpers.py @@ -0,0 +1,45 @@ + +import signal +import pandas as pd +from trade.helpers.Logging import setup_logger +from trade import register_signal, TIMING_ANALYSIS_CACHE_PATH +logger = setup_logger("trade.optionlib.vol.implied_vol") + +TIME_BUCKET = [] + + +def _record_time(start_time: float, end_time: float, action: str, info: dict) -> None: + elapsed = end_time - start_time + meta = { + "action": action, + "elapsed_time": elapsed, + } + meta.update(info) + TIME_BUCKET.append(meta) + + +def _offload_time_bucket(): + """Offload the time bucket to a CSV for analysis.""" + if not TIME_BUCKET: + logger.info("No timing data to offload.") + return + + ## Loc + loc = TIMING_ANALYSIS_CACHE_PATH + file_name = loc / "time_analysis.csv" + loc.mkdir(parents=True, exist_ok=True) + + ## Load old data if exists and append + if file_name.exists(): + old_data = pd.read_csv(file_name) + old_records = old_data.to_dict(orient="records") + TIME_BUCKET.extend(old_records) + + df = pd.DataFrame(TIME_BUCKET) + df.to_csv(file_name, index=False) + TIME_BUCKET.clear() + + +register_signal(signal.SIGTERM, _offload_time_bucket) +register_signal(signal.SIGINT, _offload_time_bucket) +register_signal("exit", _offload_time_bucket) diff --git a/trade/helpers/helper.py b/trade/helpers/helper.py index 76b20f9..6ac0898 100644 --- a/trade/helpers/helper.py +++ b/trade/helpers/helper.py @@ -1,13 +1,15 @@ ## To-Do: Switch Binomial Pricing to Leisen-Reimer Formulas import inspect import QuantLib as ql -from datetime import datetime +from datetime import datetime, date import time import os import shutil import backoff from dotenv import load_dotenv - +from trade.helpers.helper_types import DATE_HINT, is_iterable +from trade.helpers.vars import SECONDS_IN_DAY, SECONDS_IN_YEAR +from typing import Union, Iterable, TypedDict import sys from enum import Enum from typing import Any, Dict @@ -16,19 +18,17 @@ from pandas.tseries.offsets import BDay from typing import Union from trade.helpers.Configuration import ConfigProxy - +from typing import List import re -from datetime import datetime import QuantLib as ql -from datetime import datetime from dateutil.relativedelta import relativedelta import numpy as np import pandas as pd import yfinance as yf from pandas.tseries.offsets import BDay -from datetime import datetime from trade.helpers.parse import parse_date, parse_time import yfinance as yf +from trade.helpers.vars import register_on_exit from py_vollib.black_scholes import black_scholes as bs from py_vollib.black_scholes.greeks.numerical import delta, vega, theta, rho from py_vollib.black_scholes_merton.implied_volatility import implied_volatility @@ -63,22 +63,27 @@ from trade import get_pool_enabled, register_signal from trade.helpers.pools import runProcesses from trade.helpers.threads import runThreads +from typing import Optional -logger = setup_logger('trade.helpers.helper') +logger = setup_logger("trade.helpers.helper") Configuration = ConfigProxy() load_dotenv() -# To-Dos: +# To-Dos: # If still using binomial, change the r to prompt for it rather than it calling a function option_keys = {} NY = ZoneInfo("America/New_York") + + def ny_now() -> datetime: return datetime.now(tz=NY) + def ny_now_busday() -> datetime: return change_to_last_busday(ny_now()) + def get_parrallel_apply(): """ Get the parallel apply function based on the pool enabled flag. @@ -88,13 +93,14 @@ def get_parrallel_apply(): else: return runThreads -def is_weekend(dt:str|datetime) -> bool: + +def is_weekend(dt: str | datetime) -> bool: """ Check if the given date is a weekend (Saturday or Sunday). - + Args: dt (str | datetime): The date to check. - + Returns: bool: True if the date is a weekend, False otherwise. """ @@ -102,6 +108,24 @@ def is_weekend(dt:str|datetime) -> bool: dt = pd.to_datetime(dt) return dt.weekday() >= 5 # Saturday is 5, Sunday is 6 + +def is_market_hours_today() -> bool: + """ + Check if the current time in New York is within market hours (9:30 AM to 4:00 PM) on a business day. + + Returns: + bool: True if within market hours, False otherwise. + """ + now = ny_now() + if now.weekday() >= 5: # Saturday or Sunday + return False + + market_open = now.replace(hour=9, minute=30, second=0, microsecond=0) + market_close = now.replace(hour=16, minute=0, second=0, microsecond=0) + + return market_open <= now <= market_close + + def assert_member_of_enum(value: Any, enum_class: Enum) -> None: """ Assert that the given value is a member of the specified Enum class. @@ -112,7 +136,6 @@ def assert_member_of_enum(value: Any, enum_class: Enum) -> None: return enum_class(value) - def _ipython_shutdown(_callable): """ Register a shutdown function to be called when the IPython kernel is shutting down. @@ -120,10 +143,11 @@ def _ipython_shutdown(_callable): if not callable(_callable): raise TypeError("The shutdown function must be callable.") from IPython import get_ipython + try: ipython = get_ipython() if ipython is not None: - ipython.events.register('shutdown', _callable) + ipython.events.register("shutdown", _callable) except ImportError as e: pass @@ -163,69 +187,87 @@ def _get_val(self, other): return other.value if isinstance(other, Scalar) else other - class CustomCache(Cache): """ CustomCache is a dictionary-like object that stores data on disk. It is a subclass of diskcache.Cache and provides additional functionality """ - def __init__(self, - location: str | Path = None, - fname: str = None, - log_path: str | Path = None, - clear_on_exit: bool = False, - expire_days: int = 7, - data: dict = None, - **kwargs): + + def __init__( + self, + location: str | Path = None, + fname: str = None, + log_path: str | Path = None, + clear_on_exit: bool = False, + expire_days: int = 7, + size_limit: Optional[int] = None, + cull_limit: Optional[int] = None, + data: dict = None, + **kwargs, + ): """ Important Behavior: 1. The cache is pegged to a specific on disk data. Represented by location/fname - 2. The cache is cleared on exit if clear_on_exit is set to True. Else, it will remain populated and open. But the location of the directory + 2. The cache is cleared on exit if clear_on_exit is set to True. Else, it will remain populated and open. But the location of the directory will be recorded in a file for later clean-up. - + :params location: str | Path: Folder to store the cache. If None, it will use the WORK_DIR environment variable. :params fname: str: Name of the cache file. Defaults to 'cache'. :params log_path: str | Path: Path to the log file. If None, it will use the WORK_DIR environment variable. :params clear_on_exit: bool: Whether to clear the cache on exit. Defaults to False. + :params size_limit: Optional[int]: Maximum on-disk cache size in bytes. Uses diskcache default when None. + :params cull_limit: Optional[int]: Number of entries considered per cull cycle. Uses diskcache default when None. :params kwargs: Additional arguments to pass to the Cache constructor. Example usage: cache = CustomCache(location='/path/to/cache', fname='my_cache', log_path='/path/to/log.txt', clear_on_exit=True) """ - - #1. Check dir & create cache + + # 1. Check dir & create cache fname = str(fname) if fname else shortuuid.random(length=8) - dir = Path(location) / fname if location else Path(os.environ.get('WORK_DIR'))/'.cache'/fname + dir = Path(location) / fname if location else Path(os.environ.get("WORK_DIR")) / ".cache" / fname self.dir = dir self.fname = fname - self.expiry_date = (datetime.today() + relativedelta(days=expire_days)).date().strftime('%Y-%m-%d') + self.expiry_date = (datetime.today() + relativedelta(days=expire_days)).date().strftime("%Y-%m-%d") self._register_location = f'{os.environ["WORK_DIR"]}/trade/helpers/clear_dirs.json' self._owner_pid = os.getpid() # <- track creator - + ## Avoid non path like objects if isinstance(log_path, (str, os.PathLike)): log_path = Path(log_path) elif log_path is None: - log_path = Path(os.environ.get('WORK_DIR'))/'trade'/'helpers'/'cache_clear_log.txt' + log_path = Path(os.environ.get("WORK_DIR")) / "trade" / "helpers" / "cache_clear_log.txt" else: logger.error(f"log_path must be str, Path or None, not {type(log_path)}, recieved {log_path}") - log_path = str(Path(os.environ.get('WORK_DIR'))/'trade'/'helpers'/'cache_clear_log.txt') + log_path = str(Path(os.environ.get("WORK_DIR")) / "trade" / "helpers" / "cache_clear_log.txt") self.__log_path = log_path os.makedirs(dir, exist_ok=True) - - #2. Create cache + + # 2. Create cache + if size_limit is not None: + kwargs.setdefault("size_limit", size_limit) + if cull_limit is not None: + kwargs.setdefault("cull_limit", cull_limit) super().__init__(dir, **kwargs) - #3. Check if the cache is empty + # 3. Check if the cache is empty self.clear_on_exit = clear_on_exit - - #4. If data is passed, load it into the cache + + # 4. If data is passed, load it into the cache if data is not None: if not isinstance(data, dict): raise ValueError("Data must be a dictionary.") for key, value in data.items(): self[key] = value + @classmethod + def register_to_on_exit(cls, func): + """ + Register a function to be called on exit. + This is useful for when an exit needs to be run BEFORE CustomCache closes connection. + """ + register_on_exit(func) + def __getstate__(self): """ Custom serialization to avoid pickling the cache directory. @@ -236,41 +278,65 @@ def __getstate__(self): log_path=str(self.log_path), clear_on_exit=self.clear_on_exit, expire_days=(pd.to_datetime(self.expiry_date).date() - datetime.today().date()).days, - data=dict(self.items()) + size_limit=self.size_limit, + cull_limit=self.cull_limit, + data=dict(self.items()), ) - + def __setstate__(self, state): """ Custom deserialization to restore the cache state. """ self.__init__( - location=state['location'], - fname=state['fname'], - log_path=state['log_path'], - clear_on_exit=state['clear_on_exit'], - expire_days=state['expire_days'], - data=state['data'] + location=state["location"], + fname=state["fname"], + log_path=state["log_path"], + clear_on_exit=state["clear_on_exit"], + expire_days=state["expire_days"], + size_limit=state.get("size_limit"), + cull_limit=state.get("cull_limit"), + data=state["data"], ) def __hash__(self): return super().__hash__() + @staticmethod + def _normalize_key(key: Any) -> Any: + if isinstance(key, str): + return str(key) + return key + + def __getitem__(self, key: Any) -> Any: + return super().__getitem__(self._normalize_key(key)) + + def __setitem__(self, key: Any, value: Any) -> None: + super().__setitem__(self._normalize_key(key), value) + + def __delitem__(self, key: Any) -> None: + super().__delitem__(self._normalize_key(key)) + + def __contains__(self, key: Any) -> bool: + return super().__contains__(self._normalize_key(key)) + + def get(self, key: Any, default: Any = None, retry: bool = False) -> Any: + return super().get(self._normalize_key(key), default, retry=retry) @property def clear_on_exit(self): return self._clear_on_exit - + @clear_on_exit.setter def clear_on_exit(self, value): if not isinstance(value, bool): raise ValueError("clear_on_exit must be a boolean value.") self._clear_on_exit = value self._install_handlers() - + @property def log_path(self): return self.__log_path - + @log_path.setter def log_path(self, value): if not isinstance(value, (str, Path)): @@ -287,26 +353,24 @@ def register_location(self): os.makedirs(os.path.dirname(self._register_location), exist_ok=True) ## Create empty json file - with open(self._register_location, 'w') as f: + with open(self._register_location, "w") as f: json.dump({}, f) return self._register_location - + def _install_handlers(self): """ Central place to register whatever needs doing depending on self._clear_on_exit. """ if self._clear_on_exit: - # atexit.register(self._on_exit) - # signal.signal(signal.SIGTERM, self._on_signal) register_signal(signum=signal.SIGTERM, signal_func=self._on_exit) register_signal(signum=signal.SIGINT, signal_func=self._on_exit) register_signal("exit", self._on_exit) else: # just record the dir for later weekly cron clean-up - with open(self.register_location, 'r') as f: + with open(self.register_location, "r") as f: json_file = json.load(f) - with open(self.register_location, 'w') as f: + with open(self.register_location, "w") as f: loc = str(self.dir) json_file.update({loc: self.expiry_date}) json.dump(json_file, f, default=str) @@ -323,11 +387,10 @@ def items(self): def remove(self, key): if key in self: self.__delitem__(key) - + def pop(self, key, default=None, expire_time=False, tag=False, retry=False): - return super().pop(key, default, expire_time, tag, retry) + return super().pop(self._normalize_key(key), default, expire_time, tag, retry) - def update(self, other): if isinstance(other, dict): for key, value in other.items(): @@ -337,7 +400,7 @@ def update(self, other): self[key] = value else: raise ValueError("Other must be a dictionary or CustomCache instance.") - + def filter_keys(self, x): """ Filter the cache keys based on a condition. @@ -347,7 +410,7 @@ def filter_keys(self, x): list: A list of keys that satisfy the condition. """ return [key for key in self.keys() if x(key)] - + def __repr__(self): sample_keys = list(self)[:10] return f"" @@ -355,12 +418,12 @@ def __repr__(self): def __str__(self): sample = dict(list(self.items())[:10]) return f"" - + def setdefault(self, key, default): if key not in self: self[key] = default return self[key] - + def _on_exit(self): try: self.close() @@ -368,13 +431,12 @@ def _on_exit(self): shutil.rmtree(self.dir) except Exception as e: - with open(f'{self.log_path}', 'a') as f: + with open(f"{self.log_path}", "a") as f: f.write(f"Error clearing cache {self.dir} at {datetime.now()}: {e}\n") else: - with open(f'{self.log_path}', 'a') as f: + with open(f"{self.log_path}", "a") as f: f.write(f"Cache {self.dir} cleared by AtExit at {datetime.now()}\n") - def _on_signal(self, signum, frame): # Only the creating process should handle cleanup if os.getpid() != self._owner_pid: @@ -388,7 +450,8 @@ def _on_signal(self, signum, frame): signal.signal(signum, signal.SIG_DFL) except Exception: pass - os.kill(os.getpid(), signum) # default handler runs now; no recursion + os.kill(os.getpid(), signum) # default handler runs now; no recursion + def str_to_bool(value: str) -> bool: """ @@ -398,14 +461,14 @@ def str_to_bool(value: str) -> bool: Returns: bool: True if the string is 'True', '1', or 'yes' (case-insensitive), False otherwise. """ - if value.lower() in ['true', '1', 'yes']: + if value.lower() in ["true", "1", "yes"]: return True - elif value.lower() in ['false', '0', 'no']: + elif value.lower() in ["false", "0", "no"]: return False else: raise ValueError("Invalid boolean string. Expected 'True', 'False', '1', '0', 'yes', or 'no'.") - - + + def check_all_days_available(x, _start, _end): """ Check if all business days in the range are available in the DataFrame x. @@ -413,15 +476,16 @@ def check_all_days_available(x, _start, _end): x (pd.DataFrame): DataFrame with a 'Datetime' column. _start (str or datetime): Start date of the range. _end (str or datetime): End date of the range. - + Returns: bool: True if all business days in the range are available, False otherwise. """ - date_range = bus_range(_start, _end, freq = '1B') + date_range = bus_range(_start, _end, freq="1B") dates_available = x.Datetime missing_dates_second_check = [x for x in date_range if x not in pd.DatetimeIndex(dates_available)] return all(x in pd.DatetimeIndex(dates_available) for x in date_range) + def check_missing_dates(x, _start, _end): """ Check for missing business days in the DataFrame x within the specified date range. This also skips US market holidays. @@ -433,18 +497,19 @@ def check_missing_dates(x, _start, _end): Returns: list: List of missing business days in the range. """ - if 'Datetime' not in x.columns: + if "Datetime" not in x.columns: logger.warning(f"DataFrame does not contain 'Datetime' column. Will default to index") - x['Datetime'] = x.index - date_range = bus_range(_start, _end, freq = '1B') + x["Datetime"] = x.index + date_range = bus_range(_start, _end, freq="1B") dates_available = x.Datetime missing_dates_second_check = [x for x in date_range if x not in pd.DatetimeIndex(dates_available)] missing_dates_third_check = [x for x in missing_dates_second_check if x not in HOLIDAY_SET] missing_dates_fourth_check = [x for x in missing_dates_third_check if x.weekday() < 5] - x.drop(columns=['Datetime'], inplace=True, errors='ignore') + x.drop(columns=["Datetime"], inplace=True, errors="ignore") return missing_dates_fourth_check -def get_missing_dates(x:pd.Series|pd.DataFrame, _start: datetime, _end: datetime): + +def get_missing_dates(x: pd.Series | pd.DataFrame, _start: datetime, _end: datetime) -> List[datetime]: """ Check for missing business days in the Series or DataFrame x within the specified date range. This also skips US market holidays. It also ensures there are no weekends @@ -458,20 +523,20 @@ def get_missing_dates(x:pd.Series|pd.DataFrame, _start: datetime, _end: datetime assert isinstance(x.index, pd.DatetimeIndex), "DataFrame index must be a DatetimeIndex" date_range = bus_range(_start, _end, freq="1B") dates_available = x.index - + # Numpy optimized version - O(n log n) vs O(n²) - date_range_arr = np.array(date_range, dtype='datetime64[ns]') - dates_available_arr = np.array(dates_available, dtype='datetime64[ns]') - + date_range_arr = np.array(date_range, dtype="datetime64[ns]") + dates_available_arr = np.array(dates_available, dtype="datetime64[ns]") + # Check which dates are missing from available dates missing_mask = ~np.isin(date_range_arr, dates_available_arr) missing_dates_arr = date_range_arr[missing_mask] - + # Filter out holidays using numpy - holiday_arr = np.array(list(HOLIDAY_SET), dtype='datetime64[ns]') + holiday_arr = np.array(list(HOLIDAY_SET), dtype="datetime64[ns]") not_holiday_mask = ~np.isin(missing_dates_arr, holiday_arr) missing_dates_no_holidays_arr = missing_dates_arr[not_holiday_mask] - + # Filter out weekends using vectorized weekday check if len(missing_dates_no_holidays_arr) > 0: missing_dates_idx = pd.DatetimeIndex(missing_dates_no_holidays_arr) @@ -479,9 +544,10 @@ def get_missing_dates(x:pd.Series|pd.DataFrame, _start: datetime, _end: datetime missing_dates_fourth_check = missing_dates_idx[weekdays < 5] else: missing_dates_fourth_check = pd.DatetimeIndex(missing_dates_no_holidays_arr) - + return missing_dates_fourth_check.tolist() + # def get_missing_dates(x:pd.Series|pd.DataFrame, _start: datetime, _end: datetime): # """ # Check for missing business days in the Series or DataFrame x within the specified date range. This also skips US market holidays. @@ -501,16 +567,19 @@ def get_missing_dates(x:pd.Series|pd.DataFrame, _start: datetime, _end: datetime # missing_dates_fourth_check = [x for x in missing_dates_third_check if x.weekday() < 5] # return missing_dates_fourth_check -def vol_backout_errors(sigma, K, S0, T, r, q, market_price, flag): +def vol_backout_errors(sigma, K, S0, T, r, q, market_price, flag): """Check for errors in the input parameters for the vol backout function""" import numbers + assert isinstance(sigma, numbers.Number), f"Recieved '{type(sigma)}' for sigma. Expected 'int' or 'float'" assert isinstance(K, numbers.Number), f"Recieved '{type(K)}' for K. Expected 'int' or 'float'" assert isinstance(S0, numbers.Number), f"Recieved '{type(S0)}' for S0. Expected 'int' or 'float'" assert isinstance(r, numbers.Number), f"Recieved '{type(r)}' for r. Expected 'int' or 'float'" assert isinstance(q, numbers.Number), f"Recieved '{type(q)}' for q. Expected 'int' or 'float'" - assert isinstance(market_price, numbers.Number), f"Recieved '{type(market_price)}' for market_price. Expected 'int' or 'float'" + assert isinstance( + market_price, numbers.Number + ), f"Recieved '{type(market_price)}' for market_price. Expected 'int' or 'float'" assert isinstance(flag, str), f"Recieved '{type(flag)}' for flag. Expected 'str'" if sigma <= 0: @@ -527,39 +596,43 @@ def vol_backout_errors(sigma, K, S0, T, r, q, market_price, flag): raise ValueError("Dividend yield must be non-negative.") if market_price <= 0: raise ValueError("Market price must be positive.") - if flag not in ['c', 'p']: + if flag not in ["c", "p"]: raise ValueError("Flag must be 'c' for call or 'p' for put.") - + if pd.isna(sigma) or pd.isna(K) or pd.isna(S0) or pd.isna(r) or pd.isna(q) or pd.isna(market_price): raise ValueError("Input values cannot be NaN.") -def save_vol_resolve(opt_tick, datetime, vol_resolve, agg = 'eod'): + +def save_vol_resolve(opt_tick, datetime, vol_resolve, agg="eod"): """Utility function to save vol_resolve to json file""" import os, json - with open(f'{os.environ["WORK_DIR"]}/trade/helpers/vol_resolve_{agg}.json', 'r') as f: + + with open(f'{os.environ["WORK_DIR"]}/trade/helpers/vol_resolve_{agg}.json', "r") as f: data = json.load(f) - datetime = pd.to_datetime(datetime).strftime('%Y-%m-%d') + datetime = pd.to_datetime(datetime).strftime("%Y-%m-%d") data.setdefault(datetime, {}) - data[datetime][opt_tick]= {} - data[datetime][opt_tick]['VolResolve'] = vol_resolve - with open(f'{os.environ["WORK_DIR"]}/trade/helpers/vol_resolve_{agg}.json', 'w') as f: + data[datetime][opt_tick] = {} + data[datetime][opt_tick]["VolResolve"] = vol_resolve + with open(f'{os.environ["WORK_DIR"]}/trade/helpers/vol_resolve_{agg}.json', "w") as f: json.dump(data, f) def import_option_keys(): global option_keys import json - with open(f'{os.environ["WORK_DIR"]}/trade/assets/option_key.json', 'rb') as f: + + with open(f'{os.environ["WORK_DIR"]}/trade/assets/option_key.json', "rb") as f: option_keys = json.load(f) def save_option_keys(key, info): import json + global option_keys import_option_keys() if key not in option_keys.keys(): - option_keys[key] = info - with open(f'{os.environ["WORK_DIR"]}/trade/assets/option_key.json', 'w') as f: + option_keys[key] = info + with open(f'{os.environ["WORK_DIR"]}/trade/assets/option_key.json', "w") as f: json.dump(option_keys, f) @@ -579,21 +652,16 @@ def filter_inf(data): data = data.replace([np.inf, -np.inf], np.nan) return data.ffill() + def filter_zeros(data): data = data.replace(0, np.nan) return data.ffill() -@backoff.on_exception(backoff.expo, - (OpenBBEmptyData, YFinanceEmptyData), - max_tries=5, - logger=logger) -def retrieve_timeseries(tick, - start, - end, - interval = '1d', - provider = 'yfinance', - spot_type='close', - **kwargs) -> pd.DataFrame: + +@backoff.on_exception(backoff.expo, (OpenBBEmptyData, YFinanceEmptyData), max_tries=5, logger=logger) +def retrieve_timeseries( + tick, start, end, interval="1d", provider="yfinance", spot_type="close", **kwargs +) -> pd.DataFrame: """ Returns an OHLCV for provided ticker. @@ -608,39 +676,47 @@ def retrieve_timeseries(tick, Returns: pd.DataFrame: DataFrame with OHLCV data and additional columns for split adjustments """ - if spot_type == 'chain_price': - df = retrieve_timeseries(tick, end =(change_to_last_busday(datetime.today())+ BDay(1)).strftime('%Y-%m-%d'), - start = '1960-01-01', interval= interval, provider = provider) + if spot_type == "chain_price": + df = retrieve_timeseries( + tick, + end=(change_to_last_busday(datetime.today()) + BDay(1)).strftime("%Y-%m-%d"), + start="1960-01-01", + interval=interval, + provider=provider, + ) df.index = pd.to_datetime(df.index) df = df[(df.index >= pd.Timestamp(start)) & (df.index <= pd.Timestamp(end))] - df['close'] = df['chain_price'] - df['cum_split_from_start'] = df['split_ratio'].cumprod() + df["close"] = df["chain_price"] + df["cum_split_from_start"] = df["split_ratio"].cumprod() return df else: try: - ## yfinance needs end date to be + 1 day to be inclusive. Doing this before the function call because it's undone later end = pd.to_datetime(end) + relativedelta(days=1) + def query_data(start, end, tick, interval): - data = yf.download(tick, start=start, end = end, interval=interval, multi_level_index=False, progress=False, actions = True) - data.rename(columns={'Stock Splits': 'split_ratio', 'Dividends': 'dividends'}, inplace=True) - data = data.loc[:, ~data.columns.duplicated()] ## For some reason columns are duplicated sometimes - data.columns = data.columns.str.lower() + data = yf.download( + tick, start=start, end=end, interval=interval, multi_level_index=False, progress=False, actions=True + ) + data.rename(columns={"Stock Splits": "split_ratio", "Dividends": "dividends"}, inplace=True) + data = data.loc[:, ~data.columns.duplicated()] ## For some reason columns are duplicated sometimes + data.columns = data.columns.str.lower() return data - + data = query_data(start=start, end=end, tick=tick, interval=interval) ## Check if data is empty. This raises YFinanceEmptyData for backoff to catch if data.empty: raise YFinanceEmptyData(f"OpenBB returned empty data for {tick} with {provider} provider") - - ## Retry logic for missing split_ratio column - if 'split_ratio' not in data.columns: + ## Retry logic for missing split_ratio column + if "split_ratio" not in data.columns: ## `close` spot type means split_ratio isn't important. Set to 1 - if spot_type == 'close': - data['split_ratio'] = 1 - logger.info(f"No splits found for {tick} between {start} and {end}. Added split_ratio column with 1s") + if spot_type == "close": + data["split_ratio"] = 1 + logger.info( + f"No splits found for {tick} between {start} and {end}. Added split_ratio column with 1s" + ) ## `chain_price` spot type means split_ratio is important. Retry up to 3 times else: @@ -651,29 +727,33 @@ def query_data(start, end, tick, interval): data = query_data(start=start, end=end, tick=tick, interval=interval) ## If found, break - if 'split_ratio' in data.columns: + if "split_ratio" in data.columns: break - + ## Else, wait 2 seconds and retry time.sleep(2) retry_counter += 1 - + ## Final check: if still not found, raise error - if 'split_ratio' not in data.columns: - raise YFinanceEmptyData(f"yfinance returned data without split_ratio column for {tick} after 3 retries") - + if "split_ratio" not in data.columns: + raise YFinanceEmptyData( + f"yfinance returned data without split_ratio column for {tick} after 3 retries" + ) + ## Filter Data within range - data = data[(data.index.date >= pd.to_datetime(start).date()) & - (data.index.date <= (pd.to_datetime(end) - relativedelta(days=1)).date())] - except Exception as e: ## Unnecessary placeholder, I know. Will look for best idea for this. + data = data[ + (data.index.date >= pd.to_datetime(start).date()) + & (data.index.date <= (pd.to_datetime(end) - relativedelta(days=1)).date()) + ] + except Exception as e: ## Unnecessary placeholder, I know. Will look for best idea for this. raise e - data['split_ratio'].replace(0, 1, inplace = True) - data['cum_split'] = data['split_ratio'].cumprod() - data['max_cum_split'] = data.cum_split.max() - data['unadjusted_close'] = data.close * data.max_cum_split - data['split_factor'] = data.max_cum_split / data.cum_split - data['chain_price'] = data.close * data.split_factor + data["split_ratio"].replace(0, 1, inplace=True) + data["cum_split"] = data["split_ratio"].cumprod() + data["max_cum_split"] = data.cum_split.max() + data["unadjusted_close"] = data.close * data.max_cum_split + data["split_factor"] = data.max_cum_split / data.cum_split + data["chain_price"] = data.close * data.split_factor data = data[ [ "open", @@ -689,63 +769,72 @@ def query_data(start, end, tick, interval): "max_cum_split", ] ] - data['is_split_date'] = data['split_ratio'] != 1 + data["is_split_date"] = data["split_ratio"] != 1 data.index = pd.to_datetime(data.index) - ## To-Do: Add a data cleaning function to remove zeros and inf and check for other anomalies. + ## To-Do: Add a data cleaning function to remove zeros and inf and check for other anomalies. ## In the function, add a logger to log the anomalies - if data.empty and provider == 'yfinance': + if data.empty and provider == "yfinance": logger.warning(f"yfinance returned empty data for {tick} is empty") raise YFinanceEmptyData(f"yfinance returned empty data for {tick} is empty") ## Fix intraday data missing 16:00:00 timestamp - if 'h' in interval or 'm' in interval: - if 'm' in interval: + if "h" in interval or "m" in interval: + if "m" in interval: ## Pandas doesn't like the 'm' in the interval, so we need to replace it with 'min'. 'm' is month in pandas - interval = interval.replace('m', 'min') + interval = interval.replace("m", "min") data = enforce_bus_hours(data) reindex = bus_range(data.index[0], data.index[-1], interval) - data = data.reindex(reindex, method='ffill').dropna() + data = data.reindex(reindex, method="ffill").dropna() - return data -def identify_interval(timewidth, timeframe, provider = 'default'): - if provider == 'yfinance': - TIMEFRAMES = {'day': 'd', 'hour': 'h', 'minute': 'm', 'week': 'W', 'month': 'M', 'quarter': 'Q'} - assert timeframe.lower() in TIMEFRAMES.keys(), f"For '{provider}' provider timeframes, these are your options, {TIMEFRAMES.keys()}" + +def identify_interval(timewidth, timeframe, provider="default"): + if provider == "yfinance": + TIMEFRAMES = {"day": "d", "hour": "h", "minute": "m", "week": "W", "month": "M", "quarter": "Q"} + assert ( + timeframe.lower() in TIMEFRAMES.keys() + ), f"For '{provider}' provider timeframes, these are your options, {TIMEFRAMES.keys()}" return f"{str(timewidth)}{TIMEFRAMES[timeframe.lower()]}" - - elif provider == 'default': - TIMEFRAMES = {'day': 'd', 'hour': 'h', 'minute': 'm', 'week': 'w', 'month': 'M', 'quarter': 'q', 'year': 'y'} - assert timeframe.lower() in TIMEFRAMES.keys(), f"For '{provider}' provider timeframes, these are your options, {TIMEFRAMES.keys()}" + + elif provider == "default": + TIMEFRAMES = {"day": "d", "hour": "h", "minute": "m", "week": "w", "month": "M", "quarter": "q", "year": "y"} + assert ( + timeframe.lower() in TIMEFRAMES.keys() + ), f"For '{provider}' provider timeframes, these are your options, {TIMEFRAMES.keys()}" return f"{str(timewidth)}{TIMEFRAMES[timeframe.lower()]}" - - - elif provider == 'fmp': - TIMEFRAMES = {'day': 'd', 'hour': 'h', 'minute': 'm'} - assert timeframe.lower() in TIMEFRAMES.keys(), f"For '{provider}' provider timeframes, these are your options, {TIMEFRAMES.keys()}" + + elif provider == "fmp": + TIMEFRAMES = {"day": "d", "hour": "h", "minute": "m"} + assert ( + timeframe.lower() in TIMEFRAMES.keys() + ), f"For '{provider}' provider timeframes, these are your options, {TIMEFRAMES.keys()}" return f"{str(timewidth)}{TIMEFRAMES[timeframe.lower()]}" - def identify_length(string, integer): - TIMEFRAMES_VALUES = {'d': 1, 'w': 5, 'm': 30, 'y': 252, 'q': 91} - assert string in TIMEFRAMES_VALUES.keys(), f'Available timeframes are {TIMEFRAMES_VALUES.keys()}, recieved "{string}"' + TIMEFRAMES_VALUES = {"d": 1, "w": 5, "m": 30, "y": 252, "q": 91} + assert ( + string in TIMEFRAMES_VALUES.keys() + ), f'Available timeframes are {TIMEFRAMES_VALUES.keys()}, recieved "{string}"' return integer * TIMEFRAMES_VALUES[string] + def extract_numeric_value(timeframe_str): - match = re.findall(r'(\d+)([a-zA-Z]+)', timeframe_str) + match = re.findall(r"(\d+)([a-zA-Z]+)", timeframe_str) integers = [int(num) for num, _ in match][0] strings = [str(letter) for _, letter in match][0] return strings, integers + def enforce_allowed_models(model: list) -> list: """ Ensures that the model is in the allowed models list. """ - assert model in PRICING_CONFIG['AVAILABLE_PRICING_MODELS'], f"Model {model} is not in the allowed models list. Expected {PRICING_CONFIG['AVAILABLE_PRICING_MODELS']}" - + assert ( + model in PRICING_CONFIG["AVAILABLE_PRICING_MODELS"] + ), f"Model {model} is not in the allowed models list. Expected {PRICING_CONFIG['AVAILABLE_PRICING_MODELS']}" def date_inbetween(date, start, end, inclusive=True): @@ -764,34 +853,36 @@ def date_inbetween(date, start, end, inclusive=True): else: return start < date < end + class compare_dates: """ A class to compare dates with various methods. """ + @staticmethod def is_before(date1, date2): - """ Check if date1 is before date2.""" + """Check if date1 is before date2.""" return pd.to_datetime(date1) < pd.to_datetime(date2) @staticmethod def is_after(date1, date2): - """ Check if date1 is after date2.""" + """Check if date1 is after date2.""" return pd.to_datetime(date1) > pd.to_datetime(date2) - + @staticmethod def is_on_or_before(date1, date2): - """ Check if date1 is on or before date2.""" + """Check if date1 is on or before date2.""" return pd.to_datetime(date1) <= pd.to_datetime(date2) - + @staticmethod def is_on_or_after(date1, date2): - """ Check if date1 is on or after date2.""" + """Check if date1 is on or after date2.""" return pd.to_datetime(date1) >= pd.to_datetime(date2) @staticmethod def is_equal(date1, date2): return pd.to_datetime(date1) == pd.to_datetime(date2) - + @staticmethod def inbetween(date, start, end, inclusive=True): """ @@ -806,30 +897,30 @@ def inbetween(date, start, end, inclusive=True): return date_inbetween(date, start, end, inclusive) - -def print_cprofile_internal_time_share(_stats, top_n=20, sort_by='tottime', full_name=False): +def print_cprofile_internal_time_share(_stats, top_n=20, sort_by="tottime", full_name=False): """ Print top n functions by internal (self) time, with their share of total self time. """ _stats = deepcopy(_stats) _stats.sort_stats(sort_by) - + all_stats = _stats.stats.items() - total_self_time = sum(stat[2] for _, stat in all_stats) + total_self_time = sum(stat[2] for _, stat in all_stats) top_list = sorted(all_stats, key=lambda x: x[1][2], reverse=True)[:top_n] - print(f"{'Function':<70} {'SelfTime':>10} {'ShareOfTotal':>12}") - print('-' * 95) + print(f"{'Function':<100} {'SelfTime':>10} {'ShareOfTotal':>12}") + print("-" * 115) for func, stat in top_list: filename, line, funcname = func label = f"{filename}:{line} {funcname}" if full_name else funcname self_time = stat[2] ratio = self_time / total_self_time if total_self_time else 0 - print(f"{label:<70} {self_time:>10.4f} {ratio:>12.2%}") + print(f"{label:<100} {self_time:>10.4f} {ratio:>12.2%}") + -def print_top_cprofile_stats(_stats, top_n=20, sort_by='cumulative', full_name=False): +def print_top_cprofile_stats(_stats, top_n=20, sort_by="cumulative", full_name=False): """ Display the top n functions from a cProfile stats file, showing cumulative time and ratio to the top function. @@ -847,8 +938,8 @@ def print_top_cprofile_stats(_stats, top_n=20, sort_by='cumulative', full_name=F top_cum_time = top_list[0][1][3] # Header - print(f"{'Function':<80} {'CumTime':>10} {'RatioToTop':>12}") - print('-' * 105) + print(f"{'Function':<125} {'CumTime':>10} {'RatioToTop':>12}") + print("-" * 150) for func, stat in top_list: filename, line, funcname = func @@ -860,12 +951,14 @@ def print_top_cprofile_stats(_stats, top_n=20, sort_by='cumulative', full_name=F else: label = funcname - print(f"{label:<80} {cum_time:>10.4f} {ratio:>12.2f}") + # Truncate label to fit column width + if len(label) > 122: + label = label[:122] + "..." + print(f"{label:<125} {cum_time:>10.4f} {ratio:>12.2f}") -def find_split_dates_within_range(tick: str, - start: str, - end: str): + +def find_split_dates_within_range(tick: str, start: str, end: str): """ Find split dates within a range params: @@ -875,54 +968,91 @@ def find_split_dates_within_range(tick: str, return: list of split dates within the range - - + + """ - data = retrieve_timeseries(tick, '1900-01-01', end, '1d') + data = retrieve_timeseries(tick, "1900-01-01", end, "1d") data = data[data.index.date >= pd.to_datetime(start).date()] - return list(data[data['is_split_date'] == True]['split_ratio'].to_frame().itertuples(name = None)) - + return list(data[data["is_split_date"] == True]["split_ratio"].to_frame().itertuples(name=None)) def printmd(string): from IPython.display import Markdown, display + display(Markdown(string)) + def copy_doc_from(func): def wrapper(method): method.__doc__ = func.__doc__ return method - return wrapper + return wrapper def contains_time_format(date_str: str) -> bool: try: - datetime.strptime(date_str, '%H:%M:%S') + datetime.strptime(date_str, "%H:%M:%S") return True except ValueError: return False -def time_distance_helper(exp: str, strt: str = None) -> float: + +def assert_equal_length(*args, names: list = None): """ - Calculate the time distance between two dates in years. + Assert that all input lists have the same length. + """ + lengths = [len(arg) for arg in args] + if len(set(lengths)) != 1: + if names is not None: + name_length_pairs = ", ".join(f"{name}: {length}" for name, length in zip(names, lengths)) + raise ValueError(f"Input lists must have the same length. Lengths are: {name_length_pairs}") + else: + raise ValueError(f"Input lists must have the same length. Lengths are: {lengths}") + return True + + +def time_distance_helper( + start: Union[DATE_HINT, Iterable[DATE_HINT]], end: Union[DATE_HINT, Iterable[DATE_HINT]] +) -> Union[float, np.ndarray]: + """Calculates time distance in years between two dates.""" + initial_is_iterable = is_iterable(start, include_str=False) or is_iterable(end, include_str=False) + ## Ensure iterable + if not is_iterable(start, include_str=False): + start = [start] + if not is_iterable(end, include_str=False): + end = [end] + + ## Assert equal length + assert_equal_length(start, end, names=("start", "end")) + + ## Convert to datetime + start = np.array(start, dtype="datetime64[D]") + end = np.array(end, dtype="datetime64[D]") + + ## Calculate time distance in years + dte = (end - start) / np.timedelta64(1, "D") + dte_in_seconds = dte * SECONDS_IN_DAY + dte_in_years = dte_in_seconds / SECONDS_IN_YEAR + + if not initial_is_iterable: + return dte_in_years[0] + return dte_in_years + + +def binomial( + K: Union[int, float], + exp_date: str, + sigma: float, + r: float = None, + N: int = 100, + S0: Union[int, float, None] = None, + y: float = None, + tick: str = None, + opttype="P", + start: str = None, +) -> float: """ - if strt is None: - strt = datetime.today() - - exp = pd.to_datetime(exp) - exp = exp.replace(hour = 16, minute = 0, second = 0, microsecond = 0,) - parsed_dte, start_date = pd.to_datetime(exp), pd.to_datetime(strt) - if start_date.hour == 0 and start_date.minute == 0 and start_date.second == 0: - start_date = start_date.replace(hour=16, minute=0, second=0, microsecond=0) - days = (parsed_dte - start_date).total_seconds() - - T = days/(365.25*24*3600) - return T - - -def binomial(K: Union[int, float], exp_date: str, sigma: float, r: float = None, N: int = 100, S0: Union[int, float, None] = None, y: float = None, tick: str = None, opttype='P', start: str = None) -> float: - ''' Returns the price of an american option Parameters: @@ -935,7 +1065,7 @@ def binomial(K: Union[int, float], exp_date: str, sigma: float, r: float = None, Sigma: Implied Volatility of the option opttype: Option type ie put or call (Defaults to "P") start: Start date of the pricing model. If nothing is passed, defaults to today. If initiated within a context and nothing is passed, defaults to context start date (Optional) - ''' + """ if start is None: if Configuration.start_date is not None: start = Configuration.start_date @@ -954,37 +1084,37 @@ def binomial(K: Union[int, float], exp_date: str, sigma: float, r: float = None, y = 0 if r is None: rates = 0.005 - r = rates.iloc[len(rates)-1, 0]/100 + r = rates.iloc[len(rates) - 1, 0] / 100 # Create a formula to get implied vol - T = time_distance_helper(exp_date, start) - dt = T/N - nu = r - 0.5*sigma**2 - u = np.exp(nu*dt + sigma*np.sqrt(dt)) - d = np.exp(nu*dt - sigma*np.sqrt(dt)) - q = (np.exp((r-y)*dt) - d) / (u-d) - disc = np.exp(-(r-y)*dt) + T = time_distance_helper(end=exp_date, start=start) + dt = T / N + nu = r - 0.5 * sigma**2 + u = np.exp(nu * dt + sigma * np.sqrt(dt)) + d = np.exp(nu * dt - sigma * np.sqrt(dt)) + q = (np.exp((r - y) * dt) - d) / (u - d) + disc = np.exp(-(r - y) * dt) opttype = opttype.upper() # initialise stock prices at maturity (calculating final stock values at the last nodes) - S = np.zeros(N+1) - for j in range(0, N+1): - S[j] = S0 * u**j * d**(N-j) + S = np.zeros(N + 1) + for j in range(0, N + 1): + S[j] = S0 * u**j * d ** (N - j) # option payoff, (calculating the payoffs at each final node.) - C = np.zeros(N+1) - for j in range(0, N+1): - if opttype == 'P': + C = np.zeros(N + 1) + for j in range(0, N + 1): + if opttype == "P": C[j] = max(0, K - S[j]) else: C[j] = max(0, S[j] - K) # backward recursion through the tree - for i in np.arange(N-1, -1, -1): - for j in range(0, i+1): - S = S0 * u**j * d**(i-j) - C[j] = disc * (q*C[j+1] + (1-q)*C[j]) - if opttype == 'P': + for i in np.arange(N - 1, -1, -1): + for j in range(0, i + 1): + S = S0 * u**j * d ** (i - j) + C[j] = disc * (q * C[j + 1] + (1 - q) * C[j]) + if opttype == "P": C[j] = max(C[j], K - S) else: C[j] = max(C[j], S - K) @@ -992,25 +1122,25 @@ def binomial(K: Union[int, float], exp_date: str, sigma: float, r: float = None, return C[0] -def implied_vol_bs_helper(S0, K, T, r, market_price, flag='c', tol=1e-3, exp_date='2024-03-08'): +def implied_vol_bs_helper(S0, K, T, r, market_price, flag="c", tol=1e-3, exp_date="2024-03-08"): """Compute the implied volatility of a European Option - S0: initial stock price - K: strike price - T: maturity - r: risk-free rate - market_price: market observed price - tol: user choosen tolerance + S0: initial stock price + K: strike price + T: maturity + r: risk-free rate + market_price: market observed price + tol: user choosen tolerance """ max_iter = 200 # max number of iterations vol_old = 0.5 # initial guess count = 0 for k in range(max_iter): bs_price = bs(flag, S0, K, T, r, vol_old) - Cprime = vega(flag, S0, K, T, r, vol_old)*100 + Cprime = vega(flag, S0, K, T, r, vol_old) * 100 C = bs_price - market_price - vol_new = vol_old - C/Cprime + vol_new = vol_old - C / Cprime bs_new = bs(flag, S0, K, T, r, vol_new) - if (abs((vol_old - vol_new)/vol_old)) < tol: + if (abs((vol_old - vol_new) / vol_old)) < tol: break vol_old = vol_new implied_vol = vol_old @@ -1018,19 +1148,23 @@ def implied_vol_bs_helper(S0, K, T, r, market_price, flag='c', tol=1e-3, exp_dat return implied_vol -def implied_vol_bt(S0, K, r, market_price,exp_date: str, flag='c', tol=0.000000000001, y=None, start = None, break_time = 60): +def implied_vol_bt( + S0, K, r, market_price, exp_date: str, flag="c", tol=0.000000000001, y=None, start=None, break_time=60 +): """Compute the implied volatility of an American Option - S0: initial stock price - K: strike price - r: risk-free rate - y: Dividend yield - market_price: market observed price - tol: user choosen tolerance + S0: initial stock price + K: strike price + r: risk-free rate + y: Dividend yield + market_price: market observed price + tol: user choosen tolerance """ if pd.to_datetime(exp_date) == pd.to_datetime(start): - logger.warning(f"Expiration date {exp_date} is the same as start date {start}. Include HH:MM:SS in the start date, to prevent pricing EOD") + logger.warning( + f"Expiration date {exp_date} is the same as start date {start}. Include HH:MM:SS in the start date, to prevent pricing EOD" + ) - T = time_distance_helper(exp_date, start) + T = time_distance_helper(end=exp_date, start=start) max_iter = 200 # max number of iterations vol_old = 0.2 # initial guess count = 0 @@ -1039,28 +1173,31 @@ def implied_vol_bt(S0, K, r, market_price,exp_date: str, flag='c', tol=0.0000000 for k in range(max_iter): current_time = time.time() if current_time - start_time > break_time: - logger.error(f"Binomial Implied vol took too long to calculate for {S0}, {K}, {r}, {market_price}, {exp_date}, {flag}, total time: {current_time - start_time}") + logger.error( + f"Binomial Implied vol took too long to calculate for {S0}, {K}, {r}, {market_price}, {exp_date}, {flag}, total time: {current_time - start_time}" + ) return 0.0 - bs_price = binomial( - K=K, exp_date=exp_date, S0=S0, r=r, sigma=vol_old, opttype=flag, y=y, start = start) + bs_price = binomial(K=K, exp_date=exp_date, S0=S0, r=r, sigma=vol_old, opttype=flag, y=y, start=start) - Cprime = vega(flag, S0, K, T, r, vol_old)*100 + Cprime = vega(flag, S0, K, T, r, vol_old) * 100 C = bs_price - market_price - vol_new = vol_old - C/Cprime + vol_new = vol_old - C / Cprime vol_new = np.clip(vol_new, 0.0001, 5) - if (abs((vol_old - vol_new)/vol_old)) < tol: + if (abs((vol_old - vol_new) / vol_old)) < tol: break vol_old = vol_new count += 1 implied_vol = vol_old if pd.isna(implied_vol) or implied_vol == 0.0: - logger.warning(f"Binomial Implied vol is NaN for {S0}, {K}, {r}, {market_price}, Exp: {exp_date}, Flag: {flag}, Start: {start}") + logger.warning( + f"Binomial Implied vol is NaN for {S0}, {K}, {r}, {market_price}, Exp: {exp_date}, Flag: {flag}, Start: {start}" + ) return 0.0 return implied_vol def d1_helper(S, K, r, T, sigma, q): - return (np.log(S / K) + ((r-q) + 0.5 * sigma**2) * T) / (sigma * np.sqrt(T)) + return (np.log(S / K) + ((r - q) + 0.5 * sigma**2) * T) / (sigma * np.sqrt(T)) def d2_helper(S, K, r, T, sigma, q): @@ -1073,11 +1210,11 @@ def volga(S, K, r, T, sigma, flag, q): flag = flag.upper() if sigma <= 0: raise ValueError("Volatility must be positive.") - if flag == 'C' or flag == 'P': - if flag.upper() == 'C': - volga = (d1*d2*S*np.exp(-q*T)*norm.cdf(d1)*np.sqrt(T))/sigma + if flag == "C" or flag == "P": + if flag.upper() == "C": + volga = (d1 * d2 * S * np.exp(-q * T) * norm.cdf(d1) * np.sqrt(T)) / sigma else: - volga = (d1*d2*S*np.exp(-q*T)*norm.cdf(-d1)*np.sqrt(T))/sigma + volga = (d1 * d2 * S * np.exp(-q * T) * norm.cdf(-d1) * np.sqrt(T)) / sigma else: raise ValueError("Invalid Option Type. Only 'C' for Call and 'P' for Put are available.") return volga @@ -1090,11 +1227,11 @@ def vanna(S, K, r, T, sigma, flag, q): if sigma <= 0: raise ValueError("Volatility must be positive.") flag = flag.upper() - if flag == 'C' or flag == 'P': - if flag.upper() == 'C': - vanna = -(d2 * np.exp(-q*T)*norm.cdf(d1))/sigma + if flag == "C" or flag == "P": + if flag.upper() == "C": + vanna = -(d2 * np.exp(-q * T) * norm.cdf(d1)) / sigma else: - vanna = -(d2 * np.exp(-q*T)*norm.cdf(-d1))/sigma + vanna = -(d2 * np.exp(-q * T) * norm.cdf(-d1)) / sigma else: raise ValueError("Invalid Option Type. Only 'C' for Call and 'P' for Put are available.") return vanna @@ -1103,39 +1240,46 @@ def vanna(S, K, r, T, sigma, flag, q): def phi(x): return norm.pdf(x) + def N(x): return norm.cdf(x) -def d1(S,K,r,T,sigma,q): - return (np.log(S/K) + (r - q + 0.5*sigma**2)*T) / (sigma*np.sqrt(T)) -def d2(S,K,r,T,sigma,q): - return d1(S,K,r,T,sigma,q) - sigma*np.sqrt(T) +def d1(S, K, r, T, sigma, q): + return (np.log(S / K) + (r - q + 0.5 * sigma**2) * T) / (sigma * np.sqrt(T)) + + +def d2(S, K, r, T, sigma, q): + return d1(S, K, r, T, sigma, q) - sigma * np.sqrt(T) + -def vega_decimal(S,K,r,T,sigma,q): - return S*np.exp(-q*T)*phi(d1(S,K,r,T,sigma,q))*np.sqrt(T) +def vega_decimal(S, K, r, T, sigma, q): + return S * np.exp(-q * T) * phi(d1(S, K, r, T, sigma, q)) * np.sqrt(T) -def volga_decimal(S,K,r,T,sigma,q): - d_1 = d1(S,K,r,T,sigma,q); d_2 = d2(S,K,r,T,sigma,q) - return vega_decimal(S,K,r,T,sigma,q) * d_1 * d_2 / sigma -def vanna_decimal(S,K,r,T,sigma,q): - d_1 = d1(S,K,r,T,sigma,q); d_2 = d2(S,K,r,T,sigma,q) - return np.exp(-q*T)*phi(d_1) * (-d_2) / sigma +def volga_decimal(S, K, r, T, sigma, q): + d_1 = d1(S, K, r, T, sigma, q) + d_2 = d2(S, K, r, T, sigma, q) + return vega_decimal(S, K, r, T, sigma, q) * d_1 * d_2 / sigma + + +def vanna_decimal(S, K, r, T, sigma, q): + d_1 = d1(S, K, r, T, sigma, q) + d_2 = d2(S, K, r, T, sigma, q) + return np.exp(-q * T) * phi(d_1) * (-d_2) / sigma def optionPV_helper( spot_price: float, strike_price: float | int, - exp_date: str | datetime, + exp_date: str | datetime, risk_free_rate: float, dividend_yield: float, volatility: float, putcall: str, settlement_date_str: str, - model: str = 'bs' + model: str = "bs", ): - """ Price an American option using QuantLib Engine @@ -1148,13 +1292,13 @@ def optionPV_helper( risk_free_rate: Prevailing discount rate, annualized and expressed as 0.01 for 1% volatility: Underlying Volatility settlement_date_str: pricing date - model: Preferred pricing method. + model: Preferred pricing method. Available options: 'bsm': Black Scholes Model 'bt': Binomial Tree Model 'mcs': Monte Carlo Simulation - Returns: + Returns: ____________ PV (float): Option present value @@ -1164,45 +1308,48 @@ def optionPV_helper( try: # Option Parameters - - if model == 'binomial': + if model == "binomial": binomial_price = binomial( - K = strike_price, - exp_date = exp_date, - sigma = volatility, - r = risk_free_rate, + K=strike_price, + exp_date=exp_date, + sigma=volatility, + r=risk_free_rate, S0=spot_price, - y = dividend_yield, + y=dividend_yield, opttype=putcall, - start = settlement_date_str + start=settlement_date_str, ) return binomial_price - spot_price = spot_price # Current stock price + spot_price = spot_price # Current stock price strike_price = strike_price # Option strike price maturity_date_str = exp_date # Option maturity date as a string risk_free_rate = risk_free_rate # Risk-free interest rate volatility = volatility # Volatility of the underlying asset - dividend_yield = dividend_yield # Continuous dividend yield + dividend_yield = dividend_yield # Continuous dividend yield # Convert string date to QuantLib Date - maturity_date = ql.Date(pd.to_datetime(maturity_date_str).day, - pd.to_datetime(maturity_date_str).month, - pd.to_datetime(maturity_date_str).year) + maturity_date = ql.Date( + pd.to_datetime(maturity_date_str).day, + pd.to_datetime(maturity_date_str).month, + pd.to_datetime(maturity_date_str).year, + ) # QuantLib Settings calendar = ql.UnitedStates(ql.UnitedStates.NYSE) # U.S. market calendar (NYSE) day_count = ql.Actual365Fixed() - settlement_date = ql.Date(pd.to_datetime(settlement_date_str).day, - pd.to_datetime(settlement_date_str).month, - pd.to_datetime(settlement_date_str).year) + settlement_date = ql.Date( + pd.to_datetime(settlement_date_str).day, + pd.to_datetime(settlement_date_str).month, + pd.to_datetime(settlement_date_str).year, + ) ql.Settings.instance().evaluationDate = settlement_date # Construct the payoff and the exercise objects - if putcall.upper() == 'P': + if putcall.upper() == "P": right = ql.Option.Put - elif putcall.upper() == 'C': + elif putcall.upper() == "C": right = ql.Option.Call else: raise ValueError(f"Recieved '{putcall}' for putcall. Expected 'P' or 'C'") @@ -1218,8 +1365,8 @@ def optionPV_helper( settlement_date, float(dividend_yield), rate_dc, - ql.Continuous, # make it explicit for dividends - ql.Annual # ignored for continuous but required by signature + ql.Continuous, # make it explicit for dividends + ql.Annual, # ignored for continuous but required by signature ) ) @@ -1228,28 +1375,28 @@ def optionPV_helper( settlement_date, float(risk_free_rate), rate_dc, - ql.Compounded, # common convention for “risk-free” examples - ql.Annual + ql.Compounded, # common convention for “risk-free” examples + ql.Annual, ) ) # risk_free_ts = ql.YieldTermStructureHandle(ql.FlatForward(settlement_date, risk_free_rate, day_count)) - volatility_ts = ql.BlackVolTermStructureHandle(ql.BlackConstantVol(settlement_date, calendar, volatility, day_count)) + volatility_ts = ql.BlackVolTermStructureHandle( + ql.BlackConstantVol(settlement_date, calendar, volatility, day_count) + ) # Black-Scholes-Merton Process (with dividend yield) bsm_process = ql.BlackScholesMertonProcess(spot_handle, dividend_ts, risk_free_ts, volatility_ts) - - - if model == 'mcs': + if model == "mcs": # Monte Carlo Pricing (Longstaff-Schwartz) monte_carlo_engine = ql.MCAmericanEngine(bsm_process, "PseudoRandom", timeSteps=250, requiredSamples=10000) american_option = ql.VanillaOption(payoff, exercise) american_option.setPricingEngine(monte_carlo_engine) monte_carlo_price = american_option.NPV() return monte_carlo_price - - elif model == 'bs': + + elif model == "bs": # Black-Scholes Pricing (Treated as European for comparison) european_exercise = ql.EuropeanExercise(maturity_date) european_option = ql.VanillaOption(payoff, european_exercise) @@ -1259,22 +1406,21 @@ def optionPV_helper( return black_scholes_price except Exception as e: print(f"Error in optionPV_helper: {e}") - logger.info('') + logger.info("") logger.info('"optionPV_helper" raised the below error') logger.info(e) - logger.info(f'Kwargs: {locals()}') + logger.info(f"Kwargs: {locals()}") return 0.0 - def pad_string(input_value): # Convert float to string and remove the decimal point if needed if isinstance(input_value, float): - input_value = str(input_value).replace('.', '') + input_value = str(input_value).replace(".", "") # Convert to string and pad with leading zeros to ensure length of 8 padded_string = str(input_value).zfill(6) - + return padded_string @@ -1294,7 +1440,7 @@ def IV_handler(*args, **kwargs): :param r: risk-free interest rate :type r: float :param q: annualized continuous dividend rate - :type q: float + :type q: float :param flag: 'c' or 'p' for call or put. :type flag: str @@ -1315,15 +1461,15 @@ def IV_handler(*args, **kwargs): >>> abs(expected_price - price) < 0.00001 True >>> abs(expected_iv - iv) < 0.00001 - + """ - keys = ['price', 'S', 'K', 't', 'r', 'q', 'flag'] + keys = ["price", "S", "K", "t", "r", "q", "flag"] if args: extra_kwargs = {k: v for k, v in zip(keys, args)} kwargs.update(extra_kwargs) try: - kwargs['flag'] = kwargs['flag'].lower() + kwargs["flag"] = kwargs["flag"].lower() iv = implied_volatility(**kwargs) if np.isinf(iv): @@ -1331,20 +1477,18 @@ def IV_handler(*args, **kwargs): return iv except (BelowIntrinsicException, ZeroDivisionError) as e: ## Add AboveMaximumException - logger.warning('') + logger.warning("") logger.warning('"implied_volatility" raised the below error') logger.warning(e) - logger.warning(f'Kwargs: {kwargs}') + logger.warning(f"Kwargs: {kwargs}") return 0.0 - + except Exception as j: - logger.warning('') + logger.warning("") logger.warning('"implied_volatility" unrelated error') logger.warning(j) - logger.warning(f'Kwargs: {kwargs}') + logger.warning(f"Kwargs: {kwargs}") return 0.0 - - def binomial_implied_vol(price, S, K, r, exp_date, option_type, pricing_date, dividend_yield): @@ -1379,60 +1523,67 @@ def binomial_implied_vol(price, S, K, r, exp_date, option_type, pricing_date, di >>> iv = binomial_implied_vol(price, S, K, r, exp_date, option_type, pricing_date, dividend_yield) - + """ kwargs = { - 'price': price, - 'S': S, - 'K': K, - 'r': r, - 'T': exp_date, - 'option_type': option_type, - 'pricing_date': pricing_date, - 'dividend_yield': dividend_yield + "price": price, + "S": S, + "K": K, + "r": r, + "T": exp_date, + "option_type": option_type, + "pricing_date": pricing_date, + "dividend_yield": dividend_yield, } try: if price <= 0: - logger.warning('Market price is less than or equal to 0') + logger.warning("Market price is less than or equal to 0") return 0.0 - + return implied_vol_bt( - S0 = S, - K = K, - exp_date = exp_date, - r = r, - y = dividend_yield, - market_price=price, - flag = option_type.lower(), - start = pricing_date + S0=S, + K=K, + exp_date=exp_date, + r=r, + y=dividend_yield, + market_price=price, + flag=option_type.lower(), + start=pricing_date, ) - except Exception as e: - logger.warning('') + logger.warning("") logger.warning('"binomial_implied_vol" raised the below error') logger.warning(e) logger.warning(f"Traceback: {traceback.format_exc()}") - logger.warning(f'Kwargs: {kwargs}') + logger.warning(f"Kwargs: {kwargs}") raise e return 0.0 + def generate_option_tick(symbol, right, exp, strike): - assert right.upper() in ['P', 'C'], f"Recieved '{right}' for right. Expected 'P' or 'C'" - assert isinstance(exp, str), f"Recieved '{type(exp)}' for exp. Expected 'str'" - assert isinstance(strike, ( float)), f"Recieved '{type(strike)}' for strike. Expected 'float'" - - tick_date = pd.to_datetime(exp).strftime('%Y%m%d') - if str(strike)[-1] == '0': + assert right.upper() in ["P", "C"], f"Recieved '{right}' for right. Expected 'P' or 'C'" + assert isinstance(exp, str), f"Recieved '{type(exp)}' for exp. Expected 'str'" + assert isinstance(strike, (float)), f"Recieved '{type(strike)}' for strike. Expected 'float'" + + tick_date = pd.to_datetime(exp).strftime("%Y%m%d") + if str(strike)[-1] == "0": strike = int(strike) else: strike = float(strike) - - key = symbol.upper() + tick_date + pad_string(strike) +right.upper() + + key = symbol.upper() + tick_date + pad_string(strike) + right.upper() return key -def parse_option_tick(tick : str): +class OptionTickComponents(TypedDict): + ticker: str + put_call: str + exp_date: str + strike: float + + +def parse_option_tick(tick: str) -> OptionTickComponents: """ Parse the option tick into its components. returns a dictionary with the following keys @@ -1444,47 +1595,43 @@ def parse_option_tick(tick : str): # Regex pattern to extract components pattern = r"([A-Za-z]+)(\d{8})([CP])(\d+(\.\d+)?)" match = re.match(pattern, tick) - + if not match: raise ValueError(f"Invalid option string format, got: {tick}") - + # Extract components from the regex groups ticker = match.group(1) exp_date_raw = match.group(2) put_call = match.group(3) strike = float(match.group(4)) - + # Convert the expiration date to the desired format exp_date = datetime.strptime(exp_date_raw, "%Y%m%d").strftime("%Y-%m-%d") - + # Construct and return the dictionary - return { - "ticker": ticker, - "put_call": put_call, - "exp_date": exp_date, - "strike": strike - } + return {"ticker": ticker, "put_call": put_call, "exp_date": exp_date, "strike": strike} def generate_option_tick_new(symbol, right, exp, strike) -> str: from datetime import datetime - assert right.upper() in ['P', 'C'], f"Recieved '{right}' for right. Expected 'P' or 'C'" - assert isinstance(exp, (str, datetime)), f"Recieved '{type(exp)}' for exp. Expected 'str'" - assert isinstance(strike, ( float)), f"Recieved '{type(strike)}' for strike. Expected 'float'" - - tick_date = pd.to_datetime(exp).strftime('%Y%m%d') - if str(strike)[-1] == '0': + + assert right.upper() in ["P", "C"], f"Recieved '{right}' for right. Expected 'P' or 'C'" + assert isinstance(exp, (str, datetime)), f"Recieved '{type(exp)}' for exp. Expected 'str'" + assert isinstance(strike, (float)), f"Recieved '{type(strike)}' for strike. Expected 'float'" + + tick_date = pd.to_datetime(exp).strftime("%Y%m%d") + if str(strike)[-1] == "0": strike = int(strike) else: strike = float(strike) - - key = symbol.upper() + tick_date + right.upper() + f'{strike}' + + key = symbol.upper() + tick_date + right.upper() + f"{strike}" return key -def wait_for_response(wait_time, condition_func, interval): +def wait_for_response(wait_time, condition_func, interval): ## Can use time.time to ensure it is not counting (meaning not taking func time into consideration) - ## This is better to ensure if it at least reaches 15 secs it ends, rather than 15 secs + loop of time to run + ## This is better to ensure if it at least reaches 15 secs it ends, rather than 15 secs + loop of time to run ## the func call elapsed_time = 0 while elapsed_time < wait_time: @@ -1493,8 +1640,72 @@ def wait_for_response(wait_time, condition_func, interval): time.sleep(interval) elapsed_time += 1 + +def to_datetime( + date_input: str | datetime | pd.Series | list, format: Optional[str] = None +) -> datetime | pd.DatetimeIndex: + """ + Convert a string or iterable to datetime object(s). + If input is already a datetime object, return as is. + For iterables, uses pd.to_datetime. + + Args: + date_input: String, datetime, or iterable to convert. + format: Optional strftime format. If None, tries "%Y-%m-%d" first, then lets pandas guess. + + Returns: + datetime object for single input, DatetimeIndex for iterables. + + Raises: + ValueError: If conversion fails with all attempted methods. + """ + # Return datetime objects as-is + if isinstance(date_input, (datetime)): + return date_input + + elif isinstance(date_input, pd.Timestamp): + return date_input.to_pydatetime() + + elif isinstance(date_input, np.datetime64): + return pd.to_datetime(date_input).to_pydatetime() + + elif isinstance(date_input, date): + return datetime(date_input.year, date_input.month, date_input.day) + + # Handle iterables (list, tuple, pd.Series, etc.) + if hasattr(date_input, "__iter__") and not isinstance(date_input, str): + if format: + return pd.to_datetime(date_input, format=format) + else: + # Try standard format first + try: + return pd.to_datetime(date_input, format="%Y-%m-%d") + except (ValueError, TypeError): + # Let pandas guess the format + return pd.to_datetime(date_input) + + # Handle single string input + if format: + return datetime.strptime(date_input, format) + + # Try standard format first for speed + try: + return datetime.strptime(date_input, "%Y-%m-%d") + except ValueError: + # Let pandas guess the format + result = pd.to_datetime(date_input) + # Convert pandas Timestamp to datetime + if isinstance(result, pd.Timestamp): + return result.to_pydatetime() + return result + + def is_busday(date): - return bool(len(pd.bdate_range(date, date))) + """ + Returns True if the date is a business day, False otherwise + """ + date = to_datetime(date) + return date.weekday() < 5 def is_USholiday(date): @@ -1502,12 +1713,11 @@ def is_USholiday(date): Returns True if the date is a US holiday, False otherwise """ - # import holidays - import pandas_market_calendars as mcal - date = pd.to_datetime(date) - return date.date().strftime('%Y-%m-%d') in HOLIDAY_SET + date = to_datetime(date) + return date.date().strftime("%Y-%m-%d") in HOLIDAY_SET -def not_trading_day(date: str|datetime, time_aware: bool = False) -> bool: + +def not_trading_day(date: str | datetime, time_aware: bool = False) -> bool: """ Returns True if the date is not a trading day (weekend or holiday), False otherwise If time_aware is True, also checks if the time is outside of trading hours (9:30 - 16:00) @@ -1519,12 +1729,12 @@ def not_trading_day(date: str|datetime, time_aware: bool = False) -> bool: """ conf = get_pricing_config() ret_bool = not is_busday(date) or is_USholiday(date) - open_time = pd.Timestamp(conf['MARKET_OPEN_TIME']).time() - close_time = pd.Timestamp(conf['MARKET_CLOSE_TIME']).time() - + open_time = pd.Timestamp(conf["MARKET_OPEN_TIME"]).time() + close_time = pd.Timestamp(conf["MARKET_CLOSE_TIME"]).time() + if not time_aware: return ret_bool - + ## If today, check if today is 9:30 <= time <= 16:00 if pd.to_datetime(date).date() == datetime.today().date(): if open_time <= pd.to_datetime(date).time() <= close_time: @@ -1533,63 +1743,196 @@ def not_trading_day(date: str|datetime, time_aware: bool = False) -> bool: ret_bool = True ## Time Check only if time != 00:00:00 - elif pd.to_datetime(date).time() != pd.Timestamp('00:00:00').time(): + elif pd.to_datetime(date).time() != pd.Timestamp("00:00:00").time(): if pd.to_datetime(date).time() < open_time or pd.to_datetime(date).time() > close_time: ret_bool = True else: ret_bool = False return ret_bool - -def change_to_last_busday(end, offset = 1): +# def change_to_last_busday(end, +# offset=1, +# eod_time=True, +# time_of_day_aware: bool = True) -> datetime: +# """ +# Change the end date to the last business day if it falls on a weekend or holiday. +# If the time is before 9:30, move to the previous business day. +# If the time is after 16:00, move to the same business day at 16:00. +# params: +# end: str or datetime +# offset: int, number of business days to move back if end is not a business day +# if offset < 0 it will move forward +# if offset = 0 it will stay on the same day if it is a business day +# if offset > 0 it will move back +# eod_time: bool, if True, return the end date at 16:00:00, else at 00:00:00 +# time_of_day_aware: bool, +# if True: +# - If time is missing (00:00:00), default to 16:00:00 +# - If time is before 9:30, move to previous business day at 16:00:00 +# - If time is after 16:00, move to same business day at 16:00:00 +# if False: +# - Ignore time of day, always return date at 00:00:00 + +# returns: datetime +# """ + +# # Enfore time is passed + +# if not isinstance(end, str): +# end = end.strftime("%Y-%m-%d %H:%M:%S") + +# if pd.to_datetime(end).time() == pd.Timestamp("00:00:00").time() and time_of_day_aware: +# end = end + " 16:00:00" + +# ## Convert end to datetime object +# end = to_datetime(end).strftime("%Y-%m-%d %H:%M:%S") + +# ## Make End Comparison Busday +# isBiz = is_busday(end) +# while not isBiz: +# end_dt = to_datetime(end) +# end_dt = end_dt.replace(hour=16, minute=0, second=0) ## Defaulting to EOD +# end = (end_dt - BDay(offset)).strftime("%Y-%m-%d %H:%M:%S") +# isBiz = bool(len(pd.bdate_range(end, end))) + +# ## Make End Comparison prev day if before 9:30 +# if pd.Timestamp(end).time() < pd.Timestamp("9:30").time() and time_of_day_aware: +# end = to_datetime(end) - BDay(offset) +# end = end.replace(hour=16, minute=0, second=0).strftime("%Y-%m-%d %H:%M:%S") + +# ## Make End Comparison same day if after 16:00 +# elif pd.Timestamp(end).time() >= pd.Timestamp("16:00").time() and time_of_day_aware: +# end_dt = to_datetime(end) +# end = end_dt.replace(hour=16, minute=0, second=0).strftime("%Y-%m-%d %H:%M:%S") + +# # Make End Comparison prev day if holiday +# while is_USholiday(end): +# end_dt = to_datetime(end) +# end = (end_dt - BDay(offset)).strftime("%Y-%m-%d %H:%M:%S") + +# if not eod_time: +# end = to_datetime(end) +# end = end.replace(hour=0, minute=0, second=0, microsecond=0) +# return end + +# return datetime.strptime(end, "%Y-%m-%d %H:%M:%S") + + +def change_to_last_busday( + end: Union[str, datetime], offset: int = 1, eod_time: bool = True, time_of_day_aware: bool = True +) -> datetime: """ - Change the end date to the last business day if it falls on a weekend or holiday. - If the time is before 9:30, move to the previous business day. - If the time is after 16:00, move to the same business day at 16:00. - params: - end: str or datetime - offset: int, number of business days to move back if end is not a business day - if offset < 0 it will move forward - if offset = 0 it will stay on the same day if it is a business day - if offset > 0 it will move back - returns: datetime + Adjust date to a valid business day, handling weekends, holidays, and market hours. + + Ensures the returned date falls on a U.S. trading day (not weekend/holiday), and + optionally adjusts for market hours (9:30 AM - 4:00 PM ET). + + Args: + end: Date to adjust (YYYY-MM-DD string or datetime object). + offset: Business day offset for adjustment. Positive values move backward, + negative values move forward. Default 1 (move back 1 day if invalid). + eod_time: If True, return time at market close, else at 00:00:00. + time_of_day_aware: If True, adjust times relative to market hours: + - Missing time (00:00:00) defaults to market close + - Before market open moves to previous business day at market close + - After market close caps at market close same day + If False, ignore intraday times. + + Returns: + Adjusted datetime on a valid business day. + + Raises: + TypeError: If end is None. + ValueError: If date string cannot be parsed. + + Examples: + >>> # Weekend adjustment - Saturday moves to Friday EOD + >>> result = change_to_last_busday("2026-02-14") # Saturday + >>> print(result) + 2026-02-13 16:00:00 + + >>> # Before market open - moves to previous day + >>> result = change_to_last_busday("2026-02-13 08:00:00") + >>> print(result) + 2026-02-12 16:00:00 + + >>> # During market hours - sets to EOD + >>> result = change_to_last_busday("2026-02-13 14:30:00") + >>> print(result) + 2026-02-13 16:00:00 + + >>> # No time awareness - returns midnight + >>> result = change_to_last_busday("2026-02-13", time_of_day_aware=False, eod_time=False) + >>> print(result) + 2026-02-13 00:00:00 + + >>> # Forward offset - moves forward to next business day + >>> result = change_to_last_busday("2026-02-14", offset=-1) # Saturday + >>> print(result) + 2026-02-16 16:00:00 # Monday """ + # Validation + if end is None: + raise TypeError("'end' cannot be None") + + # Get market hours from config + config = get_pricing_config() + market_open = pd.Timestamp(config["MARKET_OPEN_TIME"]).time() + market_close = pd.Timestamp(config["MARKET_CLOSE_TIME"]).time() + + # Convert to datetime and work with datetime throughout + end_dt = to_datetime(end) + + # Step 1: Handle time-of-day adjustments if enabled + if time_of_day_aware: + current_time = end_dt.time() + + # If no time specified (midnight), default to market close + if current_time == pd.Timestamp("00:00:00").time(): + end_dt = end_dt.replace(hour=market_close.hour, minute=market_close.minute, second=0, microsecond=0) + # Before market open - move to previous business day + elif current_time < market_open: + # Determine direction based on offset + if offset >= 0: + end_dt = end_dt - BDay(1) + else: + end_dt = end_dt + BDay(abs(offset)) + end_dt = end_dt.replace(hour=market_close.hour, minute=market_close.minute, second=0, microsecond=0) + # After or at market close - cap at close time + else: + end_dt = end_dt.replace(hour=market_close.hour, minute=market_close.minute, second=0, microsecond=0) + + # Step 2: Ensure we're on a valid business day (not weekend or holiday) + # Use a single consolidated loop to handle both weekends and holidays + max_iterations = 10 # Prevent infinite loops + iterations = 0 + + while (not is_busday(end_dt) or is_USholiday(end_dt)) and iterations < max_iterations: + if offset == 0: + # Try to find nearest business day (prefer backward) + end_dt = end_dt - BDay(1) + elif offset > 0: + # Move backward + end_dt = end_dt - BDay(offset) + else: # offset < 0 + # Move forward + end_dt = end_dt + BDay(abs(offset)) + + iterations += 1 + + if iterations >= max_iterations: + logger.warning(f"change_to_last_busday exceeded max iterations for date {end}") + + # Step 3: Apply final time setting + if not eod_time: + end_dt = end_dt.replace(hour=0, minute=0, second=0, microsecond=0) + # elif not time_of_day_aware: + # # If time_of_day_aware is False but eod_time is True, set to EOD + # end_dt = end_dt.replace(hour=market_close.hour, minute=market_close.minute, second=0, microsecond=0) + + return end_dt - - #Enfore time is passed - - if not isinstance(end, str): - end = end.strftime('%Y-%m-%d %H:%M:%S') - - if pd.to_datetime(end).time() == pd.Timestamp('00:00:00').time(): - end = end + ' 16:00:00' - - ## Make End Comparison Busday - isBiz = is_busday(end) - while not isBiz: - end_dt = pd.to_datetime(end) - end_dt = end_dt.replace(hour=16, minute=0, second=0) ## Defaulting to EOD - end = (end_dt - BDay( offset)).strftime('%Y-%m-%d %H:%M:%S') - isBiz = bool(len(pd.bdate_range(end, end))) - - ## Make End Comparison prev day if before 9:30 - if pd.Timestamp(end).time() = pd.Timestamp('16:00').time(): - end_dt = pd.to_datetime(end) - end = end_dt.replace(hour=16, minute=0, second=0).strftime('%Y-%m-%d %H:%M:%S') - - - # Make End Comparison prev day if holiday - while is_USholiday(end): - end_dt = pd.to_datetime(end) - end = (end_dt - BDay(offset)).strftime('%Y-%m-%d %H:%M:%S') - - return pd.to_datetime(end) def is_class_method(cls, obj): """ @@ -1603,7 +1946,7 @@ def is_class_method(cls, obj): bool: True if the object is a method of the class, False otherwise. """ if inspect.isroutine(obj): - for name, member in inspect.getmembers(cls): + for _, member in inspect.getmembers(cls): if member is obj: return True return False diff --git a/trade/helpers/helper_types.py b/trade/helpers/helper_types.py index b56f6d3..9cc6350 100644 --- a/trade/helpers/helper_types.py +++ b/trade/helpers/helper_types.py @@ -1,40 +1,136 @@ -from typing import TypedDict +from dataclasses import fields +from typing import Iterable, TypedDict, Any from enum import Enum +from datetime import datetime from abc import ABC, abstractmethod from typing import ClassVar from weakref import WeakSet from trade.helpers.exception import SymbolChangeError +from typing import get_origin, get_args, Union, get_type_hints, Literal +import types +from trade.helpers.Logging import setup_logger + +logger = setup_logger(__name__) +DATE_HINT = Union[datetime, str] + +class IncorrectTypeError(Exception): + """Custom exception for incorrect type errors in configuration validation.""" + + pass + + +def validate_inputs(self: object, raise_on_fail: bool = False) -> None: + type_hints = get_type_hints(type(self)) + + for f in fields(self): + try: + field_name = f.name + field_value = getattr(self, field_name) + + type_hint = type_hints.get(field_name) + if type_hint is None: + continue # no annotation, skip + + origin = get_origin(type_hint) + args = get_args(type_hint) + + # --- Handle Literal[...] --- + if origin is Literal: + # e.g. name: Literal["LimitsCog", "OtherCog"] + allowed_values = args # tuple of literals + + if field_value is None: + # If you want to allow None here, add it to the Literal. + logger.warning(f"Configuration '{field_name}' is None but expected one of {allowed_values}.") + elif field_value not in allowed_values: + raise IncorrectTypeError( + f"Configuration '{field_name}' expected one of {allowed_values}, " f"but got {field_value!r}." + ) + continue + + # --- Handle Optional / Union[...] --- + if origin in (Union, types.UnionType): + allows_none = any(arg is type(None) for arg in args) + if field_value is None: + if not allows_none: + logger.warning( + f"Configuration '{field_name}' is not set (None) and is not Optional. Please review." + ) + continue + + valid_types = tuple(arg for arg in args if arg is not type(None)) + if not isinstance(field_value, valid_types): + raise IncorrectTypeError( + f"Configuration '{field_name}' expected types {valid_types}, " f"but got {type(field_value)}." + ) + continue + + # --- Simple (non-generic) types --- + if origin is None: + if field_value is None: + logger.warning(f"Configuration '{field_name}' is not set (None). Please review.") + continue + + if not isinstance(field_value, type_hint): + raise IncorrectTypeError( + f"Configuration '{field_name}' expected type {type_hint}, " f"but got {type(field_value)}." + ) + continue + + # --- Other generics (List, Dict, etc.) – shallow check --- + if field_value is None: + logger.warning(f"Configuration '{field_name}' is not set (None). Please review.") + continue + + try: + if not isinstance(field_value, origin): + raise IncorrectTypeError( + f"Configuration '{field_name}' expected type {origin}, " f"but got {type(field_value)}." + ) + except TypeError: + logger.warning( + f"Could not validate field '{field_name}' with value '{field_value}' against type '{type_hint}' due to TypeError." + ) + pass + + except Exception as e: + logger.critical(f"Failed to validate field '{f.name}' in {self.__class__.__name__}. Error: {e}") + if raise_on_fail: + raise e + class OptionTickMetaData(TypedDict): ticker: str exp_date: str put_call: str strike: float - -class PositionData(TypedDict): + + +class PositionData(TypedDict): long: list[str] short: list[str] - class OptionModelAttributes(Enum): - S0 = 'unadjusted_S0' - K = 'K' - exp_date = 'exp' - sigma = 'sigma' - y = 'y' - put_call = 'put_call' - r = 'rf_rate' - start = 'end_date' - spot_type = 'chain_price' - + S0 = "unadjusted_S0" + K = "K" + exp_date = "exp" + sigma = "sigma" + y = "y" + put_call = "put_call" + r = "rf_rate" + start = "end_date" + spot_type = "chain_price" class TickerMap(dict): - invalid_tickers = {'FB': 'META'} + invalid_tickers = {"FB": "META"} + def __getitem__(self, key): if key in self.invalid_tickers: - raise SymbolChangeError(f"Tick name changed from {key} to {self.invalid_tickers[key]}, access the new tick instead") + raise SymbolChangeError( + f"Tick name changed from {key} to {self.invalid_tickers[key]}, access the new tick instead" + ) return super().__getitem__(key) @@ -50,7 +146,6 @@ def __init_subclass__(cls, **kwargs): super().__init_subclass__(**kwargs) SingletonMixin._registry.add(cls) - @classmethod @abstractmethod def clear_instances(cls): @@ -76,10 +171,19 @@ class SingletonMetaClass(type): A metaclass for singleton classes. It ensures that only one instance of a class is created. """ + _instances = {} def __call__(cls, *args, **kwargs): if cls not in cls._instances: instance = super().__call__(*args, **kwargs) cls._instances[cls] = instance - return cls._instances[cls] \ No newline at end of file + return cls._instances[cls] + + +def is_iterable(obj: Any, include_str: bool = False) -> bool: + """Check if an object is iterable, optionally excluding strings.""" + if include_str: + return isinstance(obj, Iterable) + else: + return isinstance(obj, Iterable) and not isinstance(obj, (str, bytes)) \ No newline at end of file diff --git a/trade/helpers/openbb_helper.py b/trade/helpers/openbb_helper.py index eeefcc0..0a4b933 100644 --- a/trade/helpers/openbb_helper.py +++ b/trade/helpers/openbb_helper.py @@ -11,8 +11,7 @@ def load_openBB(): return try: obb.account.login(pat=openbb_key, remember_me= True) + obb.account.refresh() + obb.account.save() except Exception as e: logger.error("Error logging in to OpenBB: %s", e) - - obb.account.refresh() - obb.account.save() \ No newline at end of file diff --git a/trade/helpers/pools.py b/trade/helpers/pools.py index 501d363..cdefe1a 100644 --- a/trade/helpers/pools.py +++ b/trade/helpers/pools.py @@ -1,9 +1,10 @@ """ This module provides functionality for parallel processing using multiprocessing and threading. """ -from typing import List +import signal +from typing import Any, Callable, List, Optional from multiprocessing import cpu_count -from concurrent.futures import ThreadPoolExecutor, as_completed +from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor, as_completed import os import time import logging @@ -12,78 +13,137 @@ from trade.helpers.Logging import setup_logger, change_logger_stream_level from trade import get_pool_enabled -logger = setup_logger('trade.helpers.pools', stream_log_level=logging.INFO) +logger = setup_logger("trade.helpers.pools", stream_log_level=logging.INFO) shutdown_event = False -num_workers = int(os.environ.get('NUM_WORKERS', str(cpu_count())).strip()) - +num_workers = int(os.environ.get("NUM_WORKERS", str(cpu_count())).strip()) -def _change_global_stream_level(level: str | int): +def _change_global_stream_level(level: int | str) -> None: """ Change the global logger stream level. """ change_logger_stream_level(logger, level) -def runProcesses(func, OrderedInputs: List[List], run_type: str = 'map') -> List: - """ - Run multiprocessing on a given function. - params: - -------- +def _run_processes_pathos( + func: Callable[..., Any], + ordered_inputs: List[List[Any]], + run_type: str, +) -> List[Any]: + """Run processes using Pathos backend. - func: Function to run multiprocessing - OrderedInputs: List of inputs to pass to the function. Must be ordered as below. - [[input1, input1, input1], [input2, input2, input2], [input3, input3, input3]] + Args: + func: Function to run in parallel. + ordered_inputs: Inputs for the function, grouped by argument position. + run_type: Execution mode: map, amap, uimap, imap. - run_type: Type of multiprocessing to run. Default is 'map'. Other options are 'amap', 'uimap', 'imap' + Returns: + Results from the multiprocessing function. - returns: - -------- - List of results from the multiprocessing function. - if run_type is 'map', results are ordered as the inputs. - if run_type is 'amap', results are ordered as the inputs. Asynchronous - if run_type is 'uimap', results are unordered, and a list of futures is returned. - if run_type is 'imap', results are ordered, and a list of futures is returned. Non blocking. + Raises: + ValueError: If run_type is not supported. """ - global shutdown_event ensure_global_start_method() try: pool = PathosPool(cpu_count()) pool.restart(force=True) - if run_type == 'map': - results = pool.map(func, *OrderedInputs) - elif run_type == 'amap': - results = pool.amap(func, *OrderedInputs) - elif run_type == 'uimap': - results = pool.uimap(func, *OrderedInputs) - elif run_type == 'imap': - results = pool.imap(func, *OrderedInputs) - + if run_type == "map": + results = pool.map(func, *ordered_inputs) + elif run_type == "amap": + results = pool.amap(func, *ordered_inputs) + elif run_type == "uimap": + results = pool.uimap(func, *ordered_inputs) + elif run_type == "imap": + results = pool.imap(func, *ordered_inputs) else: - raise ValueError(f'Run type {run_type} not recognized') - - except KeyboardInterrupt as e: - + raise ValueError(f"Run type {run_type} not recognized") + except KeyboardInterrupt: shutdown_event = True shutdown(pool) raise - - except Exception as e: - logger.error('Error occurred: %s', e) + except Exception as exc: + logger.error("Error occurred: %s", exc) shutdown(pool) raise - - finally: pool.close() - if run_type not in ['imap', 'uimap']: + if run_type not in ["imap", "uimap"]: pool.join() return results +def _run_processes_futures( + func: Callable[..., Any], + ordered_inputs: List[List[Any]], + run_type: str, + max_workers: Optional[int] = None, +) -> List[Any]: + """Run processes using concurrent.futures backend. + + Args: + func: Function to run in parallel. + ordered_inputs: Inputs for the function, grouped by argument position. + run_type: Execution mode: map, amap, uimap, imap. + max_workers: Optional override for thread workers. + + Returns: + Results or futures from the process backend. + + Raises: + ValueError: If run_type is not supported. + """ + if run_type not in ["map", "amap", "uimap", "imap"]: + raise ValueError(f"Run type {run_type} not recognized") + + ensure_global_start_method() + with ProcessPoolExecutor(max_workers=max_workers) as executor: + if run_type == "map": + return list(executor.map(func, *ordered_inputs)) + + futures = [executor.submit(func, *args) for args in zip(*ordered_inputs)] + if run_type in ["amap", "imap", "uimap"]: + return futures + + return [] + + +def runProcesses( + func: Callable[..., Any], + OrderedInputs: List[List[Any]], + run_type: str = "map", + *, + backend: str = "pathos", +) -> List[Any]: + """Run parallel execution using a selectable backend. + + Args: + func: Function to run in parallel. + OrderedInputs: Inputs to pass to the function. + Example: [[in1, in1], [in2, in2], [in3, in3]] + run_type: Execution mode: map, amap, uimap, imap. + backend: Backend selector: pathos or futures. + + Returns: + Results or futures depending on the backend and run_type. + + Raises: + ValueError: If backend is not supported. + + Examples: + >>> results = runProcesses(func, [[1, 2], [3, 4]], backend='pathos') + >>> futures = runProcesses(func, [[1, 2], [3, 4]], run_type='imap', backend='futures') + """ + backend_norm = backend.strip().lower() + if backend_norm == "pathos": + return _run_processes_pathos(func, OrderedInputs, run_type) + if backend_norm in ["futures", "concurrent.futures", "threading"]: + return _run_processes_futures(func, OrderedInputs, run_type) + + raise ValueError(f"Backend {backend} not recognized") + def shutdown(pool): global shutdown_event @@ -91,15 +151,12 @@ def shutdown(pool): pool.terminate() - - def parallel_apply(data: List[List], func: callable, timeout: int = 60, pool: Pool = None): """ Apply a function to a DataFrame in parallel using multiprocessing. """ global shutdown_event - ## Set pool if pool is None: pool = get_pool_enabled() @@ -107,21 +164,25 @@ def parallel_apply(data: List[List], func: callable, timeout: int = 60, pool: Po # Check if the function is callable if not callable(func): raise ValueError("Function must be callable") - + # Check if the data is a DataFrame - if not hasattr(data, 'itertuples'): + if not hasattr(data, "itertuples"): raise ValueError("Data must be a DataFrame") - if pool: logger.info("`parrallel_apply` using multiprocessing with %d workers", num_workers) - logger.info("To change to threading, either set the environment POOL_ENABLED to False, or use `set_pool_enabled(False)` found in trade.__init__") - logger.info("Logger stream level is set to %s. To change this behavior & reduce stream logs, use `_change_global_stream_level` found in trade.helpers.pools", logging.getLevelName(logger.level)) + logger.info( + "To change to threading, either set the environment POOL_ENABLED to False, or use `set_pool_enabled(False)` found in trade.__init__" + ) + logger.info( + "Logger stream level is set to %s. To change this behavior & reduce stream logs, use `_change_global_stream_level` found in trade.helpers.pools", + logging.getLevelName(logger.level), + ) shutdown_event = False try: ensure_global_start_method() with PathosPool(num_workers) as p: - p.restart(force = True) + p.restart(force=True) logger.info("Starting Function with multiprocessing") start = time.time() # func = reset_signals_wrapper(func) @@ -146,11 +207,18 @@ def parallel_apply(data: List[List], func: callable, timeout: int = 60, pool: Po else: logger.info("`parrallel_apply` using threading with %d workers", num_workers) - logger.info("To change to multiprocessing, either set the environment POOL_ENABLED to True, or use `set_pool_enabled(True)` found in trade.__init__") - logger.info("Logger stream level is set to %s. To change, use `_change_logger_stream_level` found in trade.helpers.pools", logging.getLevelName(logger.level)) + logger.info( + "To change to multiprocessing, either set the environment POOL_ENABLED to True, or use `set_pool_enabled(True)` found in trade.__init__" + ) + logger.info( + "Logger stream level is set to %s. To change, use `_change_logger_stream_level` found in trade.helpers.pools", + logging.getLevelName(logger.level), + ) results = [None] * len(data) with ThreadPoolExecutor() as executor: - future_to_idx = {executor.submit(func, *row): i for i, row in enumerate(data.itertuples(index=False, name=None))} + future_to_idx = { + executor.submit(func, *row): i for i, row in enumerate(data.itertuples(index=False, name=None)) + } for future in as_completed(future_to_idx): i = future_to_idx[future] @@ -162,13 +230,13 @@ def parallel_apply(data: List[List], func: callable, timeout: int = 60, pool: Po return results -import signal def reset_signals_wrapper(func): def wrapped(*args, **kwargs): signal.signal(signal.SIGTERM, signal.SIG_DFL) signal.signal(signal.SIGINT, signal.SIG_DFL) return func(*args, **kwargs) + return wrapped @@ -177,4 +245,4 @@ def wrapped(*args, **kwargs): # ctx = mp.get_context('fork') # p = ctx.Process(target=save_to_database, args=(request_current, manager.db, manager)) -# p.start() \ No newline at end of file +# p.start() diff --git a/trade/helpers/threads.py b/trade/helpers/threads.py index 0cdc581..d181f47 100644 --- a/trade/helpers/threads.py +++ b/trade/helpers/threads.py @@ -1,11 +1,21 @@ from concurrent.futures import ThreadPoolExecutor from os import cpu_count +from typing import Callable, Any, Optional + from trade.helpers.Logging import setup_logger + logger = setup_logger("trade.helpers.threads") -def runThreads(func, OrderedInputs: list[list], - run_type: str = 'map', block = True, - thread_name_prefix = '') -> list: + +def runThreads( + func: Callable[..., Any], + OrderedInputs: list[list], + run_type: str = "map", + block: bool = True, + thread_name_prefix: str = "", + show_progress: bool = False, + progress_desc: Optional[str] = None, +) -> list: """ Run multithreading on a given function. @@ -14,12 +24,15 @@ def runThreads(func, OrderedInputs: list[list], func: Function to run in multiple threads. OrderedInputs: List of inputs to pass to the function. Example: [[input1, input1, input1], [input2, input2, input2], [input3, input3, input3]] - + run_type: Type of multithreading execution. Default is 'map'. block: Boolean flag to indicate if results should be returned. Default is True. - If False, the function will return a list of futures. + If False, the function will return a list of futures. Note: Returning a list of futures is non blocking. thread_name_prefix: Prefix for the thread names. Default is empty string. + show_progress: If True, show a tqdm progress bar while collecting results. + Only supported when block=True. + progress_desc: Optional progress bar description. returns: -------- @@ -28,16 +41,31 @@ def runThreads(func, OrderedInputs: list[list], global shutdown_event try: + if show_progress and not block: + raise ValueError("show_progress is only supported when block=True") + num_threads = min(max(len(OrderedInputs[0]), 1), cpu_count()) # Limit threads to CPU cores or available inputs results = [] if block: - with ThreadPoolExecutor(max_workers=num_threads, thread_name_prefix=thread_name_prefix+'_thread') as executor: - if run_type == 'map': - results = executor.map(func, *OrderedInputs) + with ThreadPoolExecutor( + max_workers=num_threads, thread_name_prefix=thread_name_prefix + "_thread" + ) as executor: + if run_type == "map": + mapped_results = executor.map(func, *OrderedInputs) + if show_progress: + try: + from tqdm.auto import tqdm + except ImportError as import_error: + raise ImportError("tqdm is required when show_progress=True") from import_error + + total_tasks = len(OrderedInputs[0]) if OrderedInputs else 0 + results = list(tqdm(mapped_results, total=total_tasks, desc=progress_desc)) + else: + results = list(mapped_results) else: - raise ValueError(f'Run type {run_type} not recognized') + raise ValueError(f"Run type {run_type} not recognized") else: - executor = ThreadPoolExecutor(max_workers=num_threads, thread_name_prefix= thread_name_prefix) + executor = ThreadPoolExecutor(max_workers=num_threads, thread_name_prefix=thread_name_prefix) results = executor.map(func, *OrderedInputs) executor.shutdown(wait=False) @@ -45,6 +73,6 @@ def runThreads(func, OrderedInputs: list[list], shutdown_event = True raise except Exception as e: - logger.error('Error occurred: ', e) + logger.error("Error occurred: ", e) raise - return list(results) if block else results + return results if block else results diff --git a/trade/helpers/vars.py b/trade/helpers/vars.py new file mode 100644 index 0000000..8379835 --- /dev/null +++ b/trade/helpers/vars.py @@ -0,0 +1,36 @@ +from typing import List, Callable +_CUSTOM_ON_EXIT_BUCKET: List[Callable] = [] + +def register_on_exit(handler: Callable) -> None: + """ + Register a function to be called upon program exit. + + Parameters: + ---------- + handler : Callable + The function to be called on exit. + """ + global _CUSTOM_ON_EXIT_BUCKET + _CUSTOM_ON_EXIT_BUCKET.append(handler) + +def run_on_exit_handlers() -> None: + """Run all registered on-exit handlers.""" + global _CUSTOM_ON_EXIT_BUCKET + for handler in _CUSTOM_ON_EXIT_BUCKET: + try: + handler() + except Exception as e: + print(f"Error running on-exit handler {handler.__name__}: {e}") + +def get_on_exit_bucket() -> List[Callable]: + """Get the list of registered on-exit handlers.""" + global _CUSTOM_ON_EXIT_BUCKET + return _CUSTOM_ON_EXIT_BUCKET + +def clear_on_exit_bucket() -> None: + """Clear the list of registered on-exit handlers.""" + global _CUSTOM_ON_EXIT_BUCKET + _CUSTOM_ON_EXIT_BUCKET = [] + +SECONDS_IN_YEAR = 365.0 * 24.0 * 3600.0 +SECONDS_IN_DAY = 24.0 * 3600.0 \ No newline at end of file diff --git a/trade/known_issues.txt b/trade/known_issues.txt deleted file mode 100644 index 1cfdb60..0000000 --- a/trade/known_issues.txt +++ /dev/null @@ -1,2 +0,0 @@ -obb.equity.price.historical intradauy (5min) does not return 16:00 timestamp, we will be resampling the last timestamp and ffill - - Will be fixing this directly in the retrieve_timeseries function to propagate \ No newline at end of file diff --git a/trade/models/VolSurface.py b/trade/models/VolSurface.py index 65fd560..aca7b27 100644 --- a/trade/models/VolSurface.py +++ b/trade/models/VolSurface.py @@ -140,7 +140,7 @@ def fit_svi_model( price = x['price'], S = x['Spot'], K = x['Strike'], - t = time_distance_helper(exp = x['Expiration'].strftime('%Y-%m-%d'), strt = x.name.strftime('%Y-%m-%d')), + t = time_distance_helper(end = x['Expiration'].strftime('%Y-%m-%d'), start = x.name.strftime('%Y-%m-%d')), r = x['r'], q = x['q'], flag = x['right'].lower()), axis = 1) diff --git a/trade/models/utils.py b/trade/models/utils.py index 17272ee..89ec378 100644 --- a/trade/models/utils.py +++ b/trade/models/utils.py @@ -115,7 +115,7 @@ def resolve_missing_vol( price = x['Midpoint'], S = S, K = x['strike'], - t = time_distance_helper(exp = expiration, strt = datetime), + t = time_distance_helper(end = expiration, start = datetime), r = r, q = q, flag = x['right'].lower()), axis = 1) @@ -124,7 +124,7 @@ def resolve_missing_vol( price = x['Close'], S = S, K = x['strike'], - t = time_distance_helper(exp = expiration, strt = datetime), + t = time_distance_helper(end = expiration, start = datetime), r = r, q = q, flag = x['right'].lower()), axis = 1) diff --git a/trade/optionlib/assets/dividend.py b/trade/optionlib/assets/dividend.py index 57d0418..fbaabda 100644 --- a/trade/optionlib/assets/dividend.py +++ b/trade/optionlib/assets/dividend.py @@ -1,6 +1,6 @@ from abc import ABC, abstractmethod from datetime import datetime -from typing import List, Tuple, Union, Any +from typing import List, Tuple, Union, Any, Iterable import math from dateutil.rrule import rrule, MONTHLY from dateutil.relativedelta import relativedelta @@ -18,10 +18,10 @@ from ..utils.timing import format_dates, subtract_dates, validate_dates from ..config.defaults import DAILY_BASIS, DIVIDEND_LOOKBACK_YEARS, DIVIDEND_FORECAST_METHOD from trade.helpers.Logging import setup_logger +from trade.helpers.vars import SECONDS_IN_DAY, SECONDS_IN_YEAR # noqa +from trade.helpers.helper_types import DATE_HINT -logger = setup_logger("trade.optionlib.assets.dividend") - - +logger = setup_logger("trade.optionlib.assets.dividend", stream_log_level="DEBUG") FREQ_MAP = { "monthly": 1, "quarterly": 3, @@ -205,13 +205,14 @@ def _dual_project_dividends( """ end_date, valuation_date = format_dates(end_date, valuation_date) typical_spacing = div_history.index.to_series().diff().dt.days.mode()[0] - expected_dividend_size = int((subtract_dates(end_date, valuation_date) // typical_spacing) + 1) - logger.info(f"Expected Dividend Size before adjustment: {expected_dividend_size}") period_inferred = classify_frequency(typical_spacing) + ## Push back valuation date by period & typical spacing * 2 to capture historical dividends + new_valuation_date = valuation_date - relativedelta(days=typical_spacing * 8) + ## Get dividends btwn valuation date and today historical_divs = div_history.loc[ - (div_history.index.date >= valuation_date.date()) + (div_history.index.date >= new_valuation_date.date()) & ## Filter to include only dividends between valuation date and today. With today inclusive (div_history.index.date <= datetime.today().date()) @@ -222,6 +223,16 @@ def _dual_project_dividends( if not date_list: return [], [], valuation_date + ## Expected dividend size: + ## Since we pushed valuation date back, we will include it in expected dividend size calculation + expected_dividend_size = int((subtract_dates(end_date, new_valuation_date) // typical_spacing) + 1) + expected_dividend_size_for_original_valuation = int( + (subtract_dates(end_date, valuation_date) // typical_spacing) + 1 + ) + logger.info( + f"Expected Dividend Size before adjustment: {expected_dividend_size}, for original valuation: {expected_dividend_size_for_original_valuation}. Size from historical divs: {len(date_list)}" + ) + ## Project future dividends after today last_div = amount_list[-1] if amount_list else 0.0 @@ -230,19 +241,27 @@ def _dual_project_dividends( ## We reduce expected dividend size by the number of historical dividends we have expected_dividend_size -= len(date_list) - logger.info(f"Expected Dividend Size after adjustment: {expected_dividend_size}") + + ## If expected dividend size is less than 0, set to 0 + if expected_dividend_size < 0: + expected_dividend_size = 0 + + logger.info(f"Expected Dividend Size to be projected: {expected_dividend_size}") periodic_growth = inferred_growth_rate / (12 / FREQ_MAP[period_inferred]) ## Generate projected dividends starting from last_date dividend_list = [last_div * (1 + periodic_growth) ** i for i in range(expected_dividend_size)] + logger.info(f"Projected Dividend List: {dividend_list}") ## Combine historical and projected dividends dividend_list = amount_list + dividend_list + logger.info(f"Combined Dividend List: {dividend_list}") ## Combine historical and projected dates date_list = date_list + [ last_date + relativedelta(months=i * FREQ_MAP[period_inferred]) for i in range(1, expected_dividend_size + 1, 1) ] + logger.info(f"Combined Date List: {date_list}") ## Cutoff any dates beyond end_date filtered_dividends = [ @@ -302,13 +321,19 @@ def date(self) -> datetime: def amount(self) -> float: return self[1] + def __mul__(self, value) -> "ScheduleEntry": + if not isinstance(value, (int, float)): + raise TypeError(f"Can only multiply ScheduleEntry by int or float, not {type(value)}") + return ScheduleEntry(self.date, self.amount * value) + def __repr__(self) -> str: - return f"" + use_date = self.date.strftime('%Y-%m-%d') if isinstance(self.date, datetime) else str(self.date) + return f"" class Schedule: """ - Class to represent a dividend schedule. + Class to represent a dividend schedule for a given date. """ def __init__(self, schedule: List[Tuple[datetime, float]]): @@ -316,7 +341,7 @@ def __init__(self, schedule: List[Tuple[datetime, float]]): Initialize a Schedule object. schedule: List[Tuple[datetime, float]] - A list of tuples containing dividend dates and amounts. """ - self._schedule = schedule + self._schedule: List[Tuple[datetime, float]] = schedule @property def schedule(self) -> List[ScheduleEntry]: @@ -353,6 +378,18 @@ def __str__(self): """ return self.__repr__() + def __mul__(self, value: float) -> "Schedule": + """ + Multiply all amounts in the schedule by a scalar value. + value: float - The scalar value to multiply by. + Returns: + Schedule: A new Schedule object with updated amounts. + """ + if not isinstance(value, (int, float)): + raise TypeError(f"Can only multiply Schedule by int or float, not {type(value)}") + new_schedule = [(entry.date, entry.amount * value) for entry in self.schedule] + return Schedule(new_schedule) + def __iter__(self): """ Make the Schedule object iterable. @@ -432,7 +469,7 @@ def get_year_fractions(self) -> List[Tuple[float, float]]: """ return Schedule( [ - (time_distance_helper(dt, self.valuation_date), amt) + (time_distance_helper(end=dt, start=self.valuation_date), amt) for dt, amt in self.schedule if dt > self.valuation_date ] @@ -446,7 +483,7 @@ def get_present_value(self, discount_rate: float, sum_up: bool = True, **kwargs) pv = [] for dt, amt in self.schedule: if compare_dates.is_after(dt, self.valuation_date): - time_fraction = time_distance_helper(dt, self.valuation_date) + time_fraction = time_distance_helper(end=dt, start=self.valuation_date) pv_amt = amt * math.exp(-discount_rate * time_fraction) pv.append(pv_amt) return sum(pv) if sum_up else pv @@ -485,8 +522,8 @@ def __init__( self.valuation_date = valuation_date or start_date self.end_date = end_date self.T = time_distance_helper( - self.end_date, - self.valuation_date, + end=self.end_date, + start=self.valuation_date, ) def get_yield(self) -> float: @@ -502,7 +539,7 @@ def get_present_value(self, end_date: datetime = None, **kwargs) -> float: Return the exponential discount factor from q over T: e^{-qT} """ - T = self.T if end_date is None else time_distance_helper(end_date, self.valuation_date) + T = self.T if end_date is None else time_distance_helper(end=end_date, start=self.valuation_date) return math.exp(-self.yield_rate * T) def get_type(self) -> str: @@ -782,23 +819,29 @@ def vector_convert_to_time_frac( Returns a list of lists containing time fractions and amounts. """ - assert_equal_length(schedules, valuation_dates, end_dates) - time_fractions = [] - for i, sch in enumerate(schedules): - time_fractions.append( - Schedule( - [ - (time_distance_helper(dt, valuation_dates[i]), amt) - for amt, dt in sch - if compare_dates.is_after(dt, valuation_dates[i]) - ] - ) - ) - return time_fractions + # assert_equal_length(schedules, valuation_dates, end_dates) + + out: List[Schedule] = [] + + for sch, val, end in zip(schedules, valuation_dates, end_dates): + # Convert once + + # If schedule dates are sorted, you can optionally early-break (see note below) + converted = [] + for dt, amt in sch: # dt is datetime, amt is float + # Exclusive bounds: val < dt < end + days_in_seconds = (dt - val.date()).days * 86400 + if val.date() < dt < end.date(): + t = days_in_seconds / SECONDS_IN_YEAR + converted.append((t, amt)) + + out.append(Schedule(converted)) + + return out def vectorized_discrete_pv( - schedules: List[list], r: List[list], _valuation_dates: List[datetime], _end_dates: List[datetime] + schedules: List[List[ScheduleEntry]], r: List[list], _valuation_dates: List[datetime], _end_dates: List[datetime] ) -> List[float]: """ Calculate the present value of a list of dividend schedules using vectorized operations. @@ -808,21 +851,42 @@ def vectorized_discrete_pv( _end_dates: List[datetime] - List of end dates corresponding to each schedule. Returns a list of present values for each schedule. """ - assert_equal_length(schedules, r, _end_dates, _valuation_dates) + assert_equal_length( + schedules, r, _end_dates, _valuation_dates, names=["schedules", "r", "_end_dates", "_valuation_dates"] + ) + df_cache = {} + pv = [] + SECONDS_IN_YEAR = 365.0 * 24.0 * 3600.0 + for i, sch in enumerate(schedules): - pv.append( - sum( - [ ## Calculating the sum - (x * math.exp(-r[i] * time_distance_helper(dt, _valuation_dates[i]))) ## Applying discount factor - for x, dt in sch - if compare_dates.inbetween( - dt, start=_valuation_dates[i], end=_end_dates[i], inclusive=False - ) ## Filtering for dt after Val - ] - ) - ) - return pv[0] if len(pv) == 1 else pv + ri = r[i] # rate for this schedule + val = _valuation_dates[i] + end = _end_dates[i] + + # Use integer seconds + val_ts = int(val.timestamp()) + + total = 0.0 + + # sch entries are (date, div) per your point (2) + for dt, x in sch: + if val.date() < dt < end.date(): + days_in_seconds = (dt - val.date()).days * 86400 + + key = (ri, val_ts, days_in_seconds) + df = df_cache.get(key) + + if df is None: + t = days_in_seconds / SECONDS_IN_YEAR + df = math.exp(-ri * t) + df_cache[key] = df + + total += x * df + + pv.append(total) + + return pv def get_vectorized_dividend_rate(tickers: str | List[str], spots: List[float], valuation_dates: List[float]): @@ -842,8 +906,10 @@ def get_vectorized_dividend_rate(tickers: str | List[str], spots: List[float], v def get_vectorized_continuous_dividends( - div_rates: List[float], _valuation_dates: List[datetime], _end_dates: List[datetime] -): + div_rates: Iterable[float], + _valuation_dates: Iterable[DATE_HINT], + _end_dates: Iterable[DATE_HINT], +) -> np.ndarray: """ Get the vectorized continuous dividend discount factors. div_rates: List[float] - List of continuous dividend rates. @@ -851,19 +917,11 @@ def get_vectorized_continuous_dividends( _end_dates: List[datetime] - List of end dates. Returns a numpy array of discount factors. """ - - assert_equal_length( - div_rates, - _valuation_dates, + div_rates = np.array(div_rates, dtype=float) + _valuation_dates = np.array(_valuation_dates, dtype='datetime64[D]') + _end_dates = np.array(_end_dates, dtype='datetime64[D]') + t = time_distance_helper( + start=_valuation_dates, + end=_end_dates, ) - discounted = [ - math.exp( - -div_rate - * time_distance_helper( - _end_dates[i], - _valuation_dates[i], - ) - ) - for i, div_rate in enumerate(div_rates) - ] - return np.array(discounted) + return np.exp(-div_rates * t) diff --git a/trade/optionlib/assets/forward.py b/trade/optionlib/assets/forward.py index 4d2cdb4..98dcdeb 100644 --- a/trade/optionlib/assets/forward.py +++ b/trade/optionlib/assets/forward.py @@ -171,7 +171,7 @@ def get_forward_price(self) -> float: q = dividend yield T = time to maturity in years """ - T = time_distance_helper(self.end_date, self.valuation_date) + T = time_distance_helper(end=self.end_date, start=self.valuation_date) if T <= 0: raise ValueError("End date must be after valuation date.") @@ -335,12 +335,12 @@ def vectorized_forward_discrete(S, r, T, pv_divs): T: time to maturity (array) pv_divs: Summation of present value of all dividends till end date """ - assert_equal_length(S, r, pv_divs, T) + assert_equal_length(S, r, pv_divs, T, names=['S', 'r', 'pv_divs', 'T']) S, r, T, pv_divs = convert_to_array(S, r, T, pv_divs) forward = (S - pv_divs) * np.exp(r * T) return forward - +# TODO: Rework on this function. I need to include back-adjusted dividends. def vectorized_market_forward_calc(ticks: List[str], S: List[float], valuation_dates: List[datetime], @@ -377,7 +377,7 @@ def vectorized_market_forward_calc(ticks: List[str], F = vectorized_forward_discrete( S=S, r=r, - T=[time_distance_helper(end_dates[i], valuation_dates[i]) for i in range(len(end_dates))], + T=[time_distance_helper(end=end_dates[i], start=valuation_dates[i]) for i in range(len(end_dates))], pv_divs=div_amt ) @@ -397,7 +397,7 @@ def vectorized_market_forward_calc(ticks: List[str], S=S, r=r, q_factor=div_amt, - T=[time_distance_helper(end_dates[i], valuation_dates[i]) for i in range(len(end_dates))] + T=[time_distance_helper(end=end_dates[i], start=valuation_dates[i]) for i in range(len(end_dates))] ) div_amt = (div_rate, div_amt) # Return the dividend rate and present value of dividends diff --git a/trade/optionlib/config/config.yaml b/trade/optionlib/config/config.yaml index c5d39f6..2c196fe 100644 --- a/trade/optionlib/config/config.yaml +++ b/trade/optionlib/config/config.yaml @@ -2,7 +2,7 @@ DIVIDEND_FORECAST_LOOKBACK_YEARS: 1 DIVIDEND_FORECAST_METHOD: "avg" DIVIDEND_FORECAST_LOOKFORWARD_YEARS: 4 DAILY_BASIS: 365.25 -OPTION_TIMESERIES_START_DATE: "2017-01-01" +OPTION_TIMESERIES_START_DATE: "2018-01-01" VOL_EST_UPPER_BOUND: 5.0 VOL_EST_LOWER_BOUND: 0.01 N_PRECISION_GREEKS: 200 diff --git a/trade/optionlib/core/black_scholes_math.py b/trade/optionlib/core/black_scholes_math.py index f3a43f9..b8687e8 100644 --- a/trade/optionlib/core/black_scholes_math.py +++ b/trade/optionlib/core/black_scholes_math.py @@ -66,13 +66,14 @@ def black_scholes_vectorized_base(F: np.ndarray|List[float], Returns: Option prices (array) """ - # Ensure all inputs are numpy arrays for vectorized operations - F = np.asarray(F) - K = np.asarray(K) - T = np.asarray(T) - r = np.asarray(r) - sigma = np.asarray(sigma) + # Ensure all inputs are numpy arrays for vectorized operations + F = np.asarray(F, dtype=np.float64) + K = np.asarray(K, dtype=np.float64) + T = np.asarray(T, dtype=np.float64) + r = np.asarray(r, dtype=np.float64) + sigma = np.asarray(sigma, dtype=np.float64) + d1 = (np.log(F / K) + 0.5 * sigma**2 * T) / (sigma * np.sqrt(T)) d2 = d1 - sigma * np.sqrt(T) df = np.exp(-r * T) diff --git a/trade/optionlib/demos/american_iv.ipynb b/trade/optionlib/demos/american_iv.ipynb new file mode 100644 index 0000000..09f3c44 --- /dev/null +++ b/trade/optionlib/demos/american_iv.ipynb @@ -0,0 +1,3262 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Console Logging & File Logging Can be configured using STREAM_LOG_LEVEL and FILE_LOG_LEVEL in environment variables.\n", + "Propagate to root logger can be set using PROPAGATE_TO_ROOT_LOGGER in environment variables.\n", + "Example:\n", + "STREAM_LOG_LEVEL = 'DEBUG'\n", + "FILE_LOG_LEVEL = 'INFO'\n", + "PROPAGATE_TO_ROOT_LOGGER = 'False'\n", + "\n", + "2025-07-24 23:43:20 trade.helpers.Logging INFO: Logging Root Directory: /Users/chiemelienwanisobi/cloned_repos/QuantTools/logs\n", + "Using Proxy URL: http://54.144.4.219:5500/thetadata\n" + ] + } + ], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2\n", + "from trade.optionlib.vol.implied_vol import (\n", + " estimate_crr_implied_volatility,\n", + " vol_est_brute_force_bjs_2002,\n", + " vector_vol_estimation\n", + ")\n", + "from trade.optionlib.assets.forward import (\n", + " EquityForward, \n", + " time_distance_helper,\n", + " get_vectorized_dividend_rate,\n", + " get_vectorized_dividend_scehdule\n", + ")\n", + "\n", + "from trade.optionlib.assets.dividend import (\n", + " vector_convert_to_time_frac\n", + ")\n", + "\n", + "from trade.optionlib.greeks.numerical.bjs2002 import (\n", + " bjs2002_numerical_greeks,\n", + ")\n", + "\n", + "from trade.optionlib.greeks.numerical.binomial import (\n", + " binomial_tree_greeks,\n", + ")\n", + "from datetime import datetime\n", + "from dbase.DataAPI.ThetaData import retrieve_chain_bulk\n", + "from trade.helpers.helper import change_to_last_busday, retrieve_timeseries\n", + "import os\n", + "os.environ['PROXY_URL'] = ''\n", + "def get_spot(tick, date):\n", + " return retrieve_timeseries(tick, date, date)['close'][0]\n", + "test_start, test_valuation_date = '2025-07-16', '2025-07-16'" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "pd.options.plotting.backend = \"plotly\"" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [], + "source": [ + "aapl_chain=retrieve_chain_bulk(\n", + " 'AAPL',\n", + " 0,\n", + " change_to_last_busday(test_valuation_date),\n", + " change_to_last_busday(test_valuation_date),\n", + " '16:00'\n", + "\n", + ")\n", + "rates = 0.0423199987411499\n", + "S = get_spot('AAPL', (test_valuation_date))\n", + "valuation_dates = [test_valuation_date] * len(aapl_chain)\n", + "end_dates = aapl_chain['Expiration'].tolist()\n", + "r = [rates] * len(aapl_chain)\n", + "s = [S] * len(aapl_chain)\n", + "tickers = ['AAPL'] * len(aapl_chain)\n", + "T = [time_distance_helper(end_dates[i], valuation_dates[i]) for i in range(len(aapl_chain))]\n", + "\n", + "\n", + "q = get_vectorized_dividend_rate(\n", + " tickers=tickers,\n", + " spots=s,\n", + " valuation_dates=valuation_dates,\n", + ")\n", + "\n", + "\n", + "discrete_q = get_vectorized_dividend_scehdule(\n", + " tickers=['AAPL'] * len(aapl_chain),\n", + " valuation_dates=[test_valuation_date] * len(aapl_chain),\n", + " end_dates=aapl_chain['Expiration'].tolist(),\n", + " start_dates=[test_valuation_date] * len(aapl_chain),\n", + ")\n", + "\n", + "discrete_q_convert = vector_convert_to_time_frac(\n", + " discrete_q, \n", + " valuation_dates=[test_valuation_date] * len(aapl_chain), \n", + " end_dates=aapl_chain['Expiration'].tolist(), \n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([, ,\n", + " , ], dtype=object)" + ] + }, + "execution_count": 50, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import numpy as np\n", + "np.array(discrete_q_convert)[:4]" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "vector_params = list(zip(\n", + " s, aapl_chain['Strike'].tolist(),\n", + " T, r, aapl_chain['Midpoint'], \n", + " q, aapl_chain['Right'].str.lower().tolist(),))" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[0.13222703067576688,\n", + " 0.27657676441911044,\n", + " 0.2802011300282507,\n", + " 0.14197532438310956,\n", + " 0.17022038050951271,\n", + " 0.2707027925698142,\n", + " 0.2655786894672367,\n", + " 0.22921005525138127,\n", + " 0.2627041926048151,\n", + " 0.26782829570739264,\n", + " 0.19671574289357233,\n", + " 0.24333258331458285,\n", + " 0.2763268081702042,\n", + " 0.058489937248431205,\n", + " 0.39018187954698863,\n", + " 0.28182584564614116,\n", + " 0.026995449886247157,\n", + " 0.3173196329908248,\n", + " 0.24133293332333305,\n", + " 0.02062156553913848,\n", + " 0.268203230080752,\n", + " 0.2725774644366109,\n", + " 0.2550805270131753,\n", + " 0.271577639440986,\n", + " 0.2769516987924698,\n", + " 0.40392947323683087,\n", + " 0.40767881697042424,\n", + " 0.27570191754793866,\n", + " 0.2439574739368484,\n", + " 0.2752020050501262,\n", + " 0.4956634165854146,\n", + " 0.03661876546913673,\n", + " 0.3116956173904347,\n", + " 0.07848643716092901,\n", + " 0.2971981549538738,\n", + " 0.0153724843121078,\n", + " 0.0153724843121078,\n", + " 0.3145701142528563,\n", + " 0.27207755193879846,\n", + " 0.30757133928348207,\n", + " 0.28057606440161004,\n", + " 0.2747020925523138,\n", + " 0.018496937423435587,\n", + " 0.01637230930773269,\n", + " 0.015497462436560912,\n", + " 0.0153724843121078,\n", + " 0.271577639440986,\n", + " 0.2609544988624715,\n", + " 0.42667549188729714,\n", + " 0.2733273331833296,\n", + " 0.12272869321733043,\n", + " 0.0153724843121078,\n", + " 0.2645788644716118,\n", + " 0.25670524263106576,\n", + " 0.14809925248131203,\n", + " 0.27207755193879846,\n", + " 0.26332908322708065,\n", + " 0.33181709542738563,\n", + " 0.3450647766194155,\n", + " 0.09760809020225505,\n", + " 0.3124454861371534,\n", + " 0.0462420810520263,\n", + " 0.25083127078176953,\n", + " 0.034619115477886944,\n", + " 0.26320410510262754,\n", + " 0.16897059926498162,\n", + " 0.2650787769694242,\n", + " 0.19371626790669766,\n", + " 0.20796377409435235,\n", + " 0.267078426960674,\n", + " 0.26632855821395535,\n", + " 0.45067129178229454,\n", + " 0.37793402335058374,\n", + " 0.23345931148278706,\n", + " 0.11722965574139353,\n", + " 0.265953623840596,\n", + " 0.03936828420710518,\n", + " 0.054365659141478534,\n", + " 0.2618293457336433,\n", + " 0.3113206830170754,\n", + " 0.032494487362184056,\n", + " 0.2923240081002025,\n", + " 0.276076851921298,\n", + " 0.24570716767919196,\n", + " 0.26745336133403336,\n", + " 0.02824523113077827,\n", + " 0.025120778019450486,\n", + " 0.2668284707117678,\n", + " 0.27095274881872045,\n", + " 0.023371084277106928,\n", + " 0.25483057076426907,\n", + " 0.2609544988624715,\n", + " 0.019246806170154254,\n", + " 0.015497462436560912,\n", + " 0.015747418685467137,\n", + " 0.015497462436560912,\n", + " 0.2515811395284882,\n", + " 0.2583299582489562,\n", + " 0.27657676441911044,\n", + " 0.2697029675741893,\n", + " 0.43142466061651535,\n", + " 0.1347265931648291,\n", + " 0.27320235505887647,\n", + " 0.06298914972874321,\n", + " 0.3126954423860596,\n", + " 0.047991774794369856,\n", + " 0.26145441136028397,\n", + " 0.11273044326108152,\n", + " 0.25857991449786244,\n", + " 0.06348906222655566,\n", + " 0.27007790194754866,\n", + " 0.3009474986874672,\n", + " 0.071737618440461,\n", + " 0.3060716017900447,\n", + " 0.28532523313082825,\n", + " 0.2705778144453611,\n", + " 0.2639539738493462,\n", + " 0.4061790794769869,\n", + " 0.1844678866971674,\n", + " 0.25645528638215953,\n", + " 0.043367584189604735,\n", + " 0.1533483337083427,\n", + " 0.43142466061651535,\n", + " 0.2925739643491087,\n", + " 0.31419517987949697,\n", + " 0.05236600915022875,\n", + " 0.26745336133403336,\n", + " 0.034244181104527614,\n", + " 0.2750770269256731,\n", + " 0.025245756143903595,\n", + " 0.03949326233155829,\n", + " 0.25208105202630066,\n", + " 0.030744793619840494,\n", + " 0.2723275081877047,\n", + " 0.2627041926048151,\n", + " 0.33419167979199477,\n", + " 0.015622440561014025,\n", + " 0.2484566864171604,\n", + " 0.22233625840646015,\n", + " 0.25783004575114377,\n", + " 0.26632855821395535,\n", + " 0.015622440561014025,\n", + " 0.2550805270131753,\n", + " 0.015622440561014025,\n", + " 0.015622440561014025,\n", + " 0.3049467986699667,\n", + " 0.4777915447886197,\n", + " 0.17184509612740317,\n", + " 0.058989849746243654,\n", + " 0.31844443611090273,\n", + " 0.015622440561014025,\n", + " 0.2584549363734093,\n", + " 0.015622440561014025,\n", + " 0.2540807020175504,\n", + " 0.25808000200005,\n", + " 0.015622440561014025,\n", + " 0.25957973949348734,\n", + " 0.26732838320958024,\n", + " 0.3689355983899597,\n", + " 0.09498354958873971,\n", + " 0.19009190229755743,\n", + " 0.5232835820895522,\n", + " 0.3210689767244181,\n", + " 0.08735988399709992,\n", + " 0.3248183204580114,\n", + " 0.06511377784444611,\n", + " 0.05636530913272832,\n", + " 0.29744811120278003,\n", + " 0.2605795644891122,\n", + " 0.27782654566364157,\n", + " 0.1202291307282682,\n", + " 0.04899159978999475,\n", + " 0.27182759568989223,\n", + " 0.04449238730968274,\n", + " 0.2617043676091902,\n", + " 0.03824348108702717,\n", + " 0.2507062926573164,\n", + " 0.030994749868746715,\n", + " 0.01624733118327958,\n", + " 0.015622440561014025,\n", + " 0.25295589889747244,\n", + " 0.24570716767919196,\n", + " 0.015622440561014025,\n", + " 0.2627041926048151,\n", + " 0.1698454461361534,\n", + " 0.2505813145328633,\n", + " 0.204214430360759,\n", + " 0.568025750643766,\n", + " 0.2505813145328633,\n", + " 0.25470559263981596,\n", + " 0.016497287432185804,\n", + " 0.015622440561014025,\n", + " 0.20533923348083702,\n", + " 0.26545371134278356,\n", + " 0.2140877021925548,\n", + " 0.2645788644716118,\n", + " 0.2647038425960649,\n", + " 0.3518135953398835,\n", + " 0.32919255481387033,\n", + " 0.10398197454936373,\n", + " 0.6118930723268081,\n", + " 0.2218363459086477,\n", + " 0.3066964924123103,\n", + " 0.06448888722218055,\n", + " 0.33719115477886946,\n", + " 0.015622440561014025,\n", + " 0.07786154653866346,\n", + " 0.2573301332533313,\n", + " 0.283950473761844,\n", + " 0.056240331008275204,\n", + " 0.05036635915897897,\n", + " 0.27295239880997024,\n", + " 0.2647038425960649,\n", + " 0.04836670916772919,\n", + " 0.03711867796694917,\n", + " 0.2517061176529413,\n", + " 0.2640789519737993,\n", + " 0.25008140203505086,\n", + " 0.2542056801420035,\n", + " 0.015747418685467137,\n", + " 0.24408245206130152,\n", + " 0.022121303032575812,\n", + " 0.015747418685467137,\n", + " 0.24770681767044175,\n", + " 0.25982969574239356,\n", + " 0.23970821770544262,\n", + " 0.6550105252631315,\n", + " 0.11273044326108152,\n", + " 0.24770681767044175,\n", + " 0.015747418685467137,\n", + " 0.28857466436660917,\n", + " 0.2608295207380184,\n", + " 0.015747418685467137,\n", + " 0.6973781094527363,\n", + " 0.256955198879972,\n", + " 0.251331183279582,\n", + " 0.3516886172154304,\n", + " 0.015747418685467137,\n", + " 0.09235900897522438,\n", + " 0.25108122703067576,\n", + " 0.015747418685467137,\n", + " 0.2923240081002025,\n", + " 0.06511377784444611,\n", + " 0.25183109577739443,\n", + " 0.05474059351483787,\n", + " 0.26995292382309555,\n", + " 0.12060406510162754,\n", + " 0.3746845921148028,\n", + " 0.31706967674191855,\n", + " 0.015747418685467137,\n", + " 0.25008140203505086,\n", + " 0.25445563639090973,\n", + " 0.015747418685467137,\n", + " 0.015747418685467137,\n", + " 0.2452072551813795,\n", + " 0.05836495912397809,\n", + " 0.27957623940598514,\n", + " 0.016497287432185804,\n", + " 0.25308087702192555,\n", + " 0.016497287432185804,\n", + " 0.04324260606515162,\n", + " 0.24495729893247328,\n", + " 0.10535673391834795,\n", + " 0.2439574739368484,\n", + " 0.25982969574239356,\n", + " 0.01624733118327958,\n", + " 0.2572051551288782,\n", + " 0.11960424010600264,\n", + " 0.2599546738668467,\n", + " 0.015747418685467137,\n", + " 0.26107947698692463,\n", + " 0.2617043676091902,\n", + " 0.29094924873121825,\n", + " 0.780238605965149,\n", + " 0.2485816645416135,\n", + " 0.10198232455811394,\n", + " 0.3689355983899597,\n", + " 0.015747418685467137,\n", + " 0.07636180904522613,\n", + " 0.30282217055426386,\n", + " 0.13660126503162578,\n", + " 0.40592912322808067,\n", + " 0.27657676441911044,\n", + " 0.06048958723968099,\n", + " 0.01624733118327958,\n", + " 0.2517061176529413,\n", + " 0.33406670166754165,\n", + " 0.08473534338358459,\n", + " 0.24770681767044175,\n", + " 0.01624733118327958,\n", + " 0.28857466436660917,\n", + " 0.016497287432185804,\n", + " 0.0662385809645241,\n", + " 0.2439574739368484,\n", + " 0.2573301332533313,\n", + " 0.04911657791444786,\n", + " 0.2427076926923173,\n", + " 0.17621933048326208,\n", + " 0.01624733118327958,\n", + " 0.2589548488712218,\n", + " 0.24533223330583262,\n", + " 0.01624733118327958,\n", + " 0.25458061451536285,\n", + " 0.2583299582489562,\n", + " 0.22808525213130326,\n", + " 0.015747418685467137,\n", + " 0.3241934298357459,\n", + " 0.8605995399884997,\n", + " 0.11385524638115953,\n", + " 0.38155838895972394,\n", + " 0.3125704642616065,\n", + " 0.08248573714342858,\n", + " 0.01624733118327958,\n", + " 0.24795677391934798,\n", + " 0.282825670641766,\n", + " 0.06761334033350834,\n", + " 0.24645703642591063,\n", + " 0.01624733118327958,\n", + " 0.016497287432185804,\n", + " 0.01624733118327958,\n", + " 0.24770681767044175,\n", + " 0.2503313582839571,\n", + " 0.24345756143903596,\n", + " 0.017747068676716916,\n", + " 0.15222353058826468,\n", + " 0.4043044076101902,\n", + " 0.24158288957223928,\n", + " 0.01624733118327958,\n", + " 0.3469394484862121,\n", + " 0.09460861521538037,\n", + " 0.015872396809920246,\n", + " 0.2494565114127853,\n", + " 0.25483057076426907,\n", + " 0.01624733118327958,\n", + " 0.25558043951098774,\n", + " 0.07398722468061701,\n", + " 0.015872396809920246,\n", + " 0.29769806745168625,\n", + " 0.18834220855521386,\n", + " 0.25870489262231555,\n", + " 0.36468634215855394,\n", + " 0.9388358458961473,\n", + " 0.05499054976374409,\n", + " 0.12622808070201755,\n", + " 0.39805550138753465,\n", + " 0.26120445511137774,\n", + " 0.01624733118327958,\n", + " 0.24683197079926997,\n", + " 0.3289425985649641,\n", + " 0.09073429335733393,\n", + " 0.25283092077301933,\n", + " 0.01624733118327958,\n", + " 0.2925739643491087,\n", + " 0.0761118527963199,\n", + " 0.24483232080802017,\n", + " 0.01787204680117003,\n", + " 0.24820673016825417,\n", + " 0.01624733118327958,\n", + " 0.24308262706567663,\n", + " 0.016497287432185804,\n", + " 0.1677208180204505,\n", + " 0.44117295432385806,\n", + " 0.24158288957223928,\n", + " 0.10898109952748818,\n", + " 0.01624733118327958,\n", + " 0.35618782969574236,\n", + " 0.24733188329708242,\n", + " 0.01624733118327958,\n", + " 0.15634780869521736,\n", + " 0.08136093402335058,\n", + " 0.3079462736568414,\n", + " 0.25470559263981596,\n", + " 0.3964307857696442,\n", + " 1.0148225455636388,\n", + " 0.26745336133403336,\n", + " 0.061864346608665216,\n", + " 0.015997374934373358,\n", + " 0.414177679441986,\n", + " 0.08561019025475636,\n", + " 0.2559553738843471,\n", + " 0.05111622790569764,\n", + " 0.24983144578614463,\n", + " 0.09898284957123928,\n", + " 0.25020638015950397,\n", + " 0.3383159578989475,\n", + " 0.01624733118327958,\n", + " 0.29982269556738916,\n", + " 0.07961124028100702,\n", + " 0.01624733118327958,\n", + " 0.24970646766169152,\n", + " 0.24445738643466086,\n", + " 0.01624733118327958,\n", + " 0.01624733118327958,\n", + " 0.24358253956348908,\n", + " 0.01624733118327958,\n", + " 0.24133293332333305,\n", + " 0.01624733118327958,\n", + " 0.24320760519012974,\n", + " 0.2514561614040351,\n", + " 0.01624733118327958,\n", + " 0.24670699267481686,\n", + " 0.25183109577739443,\n", + " 0.01624733118327958,\n", + " 0.016497287432185804,\n", + " 0.125603190079752,\n", + " 0.18409295232380807,\n", + " 0.477041676041901,\n", + " 0.25220603015075377,\n", + " 0.41117820445511133,\n", + " 1.0889345733643339,\n", + " 0.37618432960824016,\n", + " 0.11335533388334708,\n", + " 0.15059881497037425,\n", + " 0.4339242231055776,\n", + " 0.01624733118327958,\n", + " 0.24545721143028573,\n", + " 0.37355978899472486,\n", + " 0.0871099277481937,\n", + " 0.1069814495362384,\n", + " 0.3180695017375434,\n", + " 0.08623508087702192,\n", + " 0.27320235505887647,\n", + " 0.3090710767769194,\n", + " 0.06773831845796144,\n", + " 0.25358078951973795,\n", + " 0.05361579039475987,\n", + " 0.2495814895372384,\n", + " 0.01624733118327958,\n", + " 0.2517061176529413,\n", + " 0.01624733118327958,\n", + " 0.01624733118327958,\n", + " 0.24445738643466086,\n", + " 0.24308262706567663,\n", + " 0.021121478036950924,\n", + " 0.020121653041326033,\n", + " 0.24145791144778617,\n", + " 0.1975905897647441,\n", + " 0.5120355508887722,\n", + " 0.25083127078176953,\n", + " 0.01624733118327958,\n", + " 0.08248573714342858,\n", + " 0.451171204280107,\n", + " 1.1611719292982323,\n", + " 0.24408245206130152,\n", + " 0.43329933248331204,\n", + " 0.15822248056201405,\n", + " 0.1202291307282682,\n", + " 0.4416728668216705,\n", + " 0.09835795894897371,\n", + " 0.3279427735693392,\n", + " 0.11523000575014375,\n", + " 0.355812895322383,\n", + " 0.2779515237880947,\n", + " 0.07036285907147678,\n", + " 0.3190693267331683,\n", + " 0.25245598639966,\n", + " 0.09260896522413059,\n", + " 0.015997374934373358,\n", + " 0.2573301332533313,\n", + " 0.01624733118327958,\n", + " 0.01787204680117003,\n", + " 0.01624733118327958,\n", + " 0.2538307457686442,\n", + " 0.2484566864171604,\n", + " 0.01624733118327958,\n", + " 0.2462070801770044,\n", + " 0.24145791144778617,\n", + " 0.017747068676716916,\n", + " 0.2485816645416135,\n", + " 0.01624733118327958,\n", + " 0.022621215530388258,\n", + " 0.01624733118327958,\n", + " 0.24095799894997372,\n", + " 0.2485816645416135,\n", + " 0.015997374934373358,\n", + " 0.24158288957223928,\n", + " 0.25208105202630066,\n", + " 0.01624733118327958,\n", + " 0.5019123228080702,\n", + " 1.2317845696142402,\n", + " 0.24420743018575464,\n", + " 0.01624733118327958,\n", + " 0.45941976049401234,\n", + " 0.16934553363834096,\n", + " 0.5460296007400185,\n", + " 0.21808700217505436,\n", + " 0.12310362759068975,\n", + " 0.13610135253381334,\n", + " 0.37693419835495884,\n", + " 0.4636690167254181,\n", + " 0.01624733118327958,\n", + " 0.09898284957123928,\n", + " 0.24308262706567663,\n", + " 0.3289425985649641,\n", + " 0.33956573914347854,\n", + " 0.10323210580264505,\n", + " 0.2868249706242656,\n", + " 0.0772366559163979,\n", + " 0.06586364659116478,\n", + " 0.26107947698692463,\n", + " 0.016497287432185804,\n", + " 0.01624733118327958,\n", + " 0.2549555488887222,\n", + " 0.24595712392809818,\n", + " 0.01624733118327958,\n", + " 0.24733188329708242,\n", + " 0.01624733118327958,\n", + " 0.23933328333208329,\n", + " 0.24258271456786418,\n", + " 0.01624733118327958,\n", + " 0.22646053651341283,\n", + " 0.5793987599689991,\n", + " 0.01612235305882647,\n", + " 0.2484566864171604,\n", + " 0.4902893572339308,\n", + " 0.14060056501412535,\n", + " 0.5112856821420535,\n", + " 1.3006475161879045,\n", + " 0.01624733118327958,\n", + " 0.24208280207005173,\n", + " 0.17609435235880896,\n", + " 0.48504027600690014,\n", + " 0.11060581514537862,\n", + " 0.347939273481837,\n", + " 0.08236075901897547,\n", + " 0.13085227130678265,\n", + " 0.2913241831045776,\n", + " 0.3975555888897222,\n", + " 0.24995642391059775,\n", + " 0.10523175579389484,\n", + " 0.01624733118327958,\n", + " 0.3358163954098852,\n", + " 0.068363209080227,\n", + " 0.26532873321833045,\n", + " 0.01624733118327958,\n", + " 0.24495729893247328,\n", + " 0.25857991449786244,\n", + " 0.016497287432185804,\n", + " 0.24895659891497285,\n", + " 0.021371434285857145,\n", + " 0.01624733118327958,\n", + " 0.24358253956348908,\n", + " 0.24670699267481686,\n", + " 0.01624733118327958,\n", + " 0.01624733118327958,\n", + " 0.01624733118327958,\n", + " 0.24295764894122351,\n", + " 0.01624733118327958,\n", + " 0.24658201455036374,\n", + " 0.24120795519887994,\n", + " 0.24758183954598864,\n", + " 0.01612235305882647,\n", + " 0.5536532663316582,\n", + " 1.3680107252681315,\n", + " 0.24308262706567663,\n", + " 0.01624733118327958,\n", + " 0.5100359008975224,\n", + " 0.18621758043951098,\n", + " 0.24633205830145752,\n", + " 0.6118930723268081,\n", + " 0.13535148378709466,\n", + " 0.14647453686342157,\n", + " 0.4185519137978449,\n", + " 0.39505602640066,\n", + " 0.01624733118327958,\n", + " 0.24195782394559862,\n", + " 0.11123070576764418,\n", + " 0.3568127203180079,\n", + " 0.11972921823045575,\n", + " 0.35718765469136726,\n", + " 0.09023438085952148,\n", + " 0.29757308932723314,\n", + " 0.01624733118327958,\n", + " 0.26932803320083,\n", + " 0.2439574739368484,\n", + " 0.26145441136028397,\n", + " 0.06348906222655566,\n", + " 0.01624733118327958,\n", + " 0.25108122703067576,\n", + " 0.016497287432185804,\n", + " 0.046117102927573185,\n", + " 0.24333258331458285,\n", + " 0.24495729893247328,\n", + " 0.016497287432185804,\n", + " 0.2542056801420035,\n", + " 0.6436375159378984,\n", + " 0.01624733118327958,\n", + " 0.24658201455036374,\n", + " 0.01624733118327958,\n", + " 0.24120795519887994,\n", + " 1.4339991749793743,\n", + " 0.5692755318882972,\n", + " 0.40092999824995623,\n", + " 0.01637230930773269,\n", + " 0.20158988974724368,\n", + " 0.505036775919398,\n", + " 0.12397847446186154,\n", + " 0.3753094827370684,\n", + " 0.09098424960624014,\n", + " 0.402929648241206,\n", + " 0.3056966674166854,\n", + " 0.14260021500537512,\n", + " 0.01624733118327958,\n", + " 0.3476893172329308,\n", + " 0.24770681767044175,\n", + " 0.11722965574139353,\n", + " 0.27420218005450137,\n", + " 0.01787204680117003,\n", + " 0.01624733118327958,\n", + " 0.24420743018575464,\n", + " 0.26420393009825244,\n", + " 0.017747068676716916,\n", + " 0.25358078951973795,\n", + " 0.016497287432185804,\n", + " 0.01787204680117003,\n", + " 0.24670699267481686,\n", + " 0.24570716767919196,\n", + " 0.01787204680117003,\n", + " 0.016497287432185804,\n", + " 0.24633205830145752,\n", + " 0.016497287432185804,\n", + " 0.2452072551813795,\n", + " 0.01624733118327958,\n", + " 0.2417078676966924,\n", + " 1.4984878871971796,\n", + " 0.6092685317132928,\n", + " 0.016497287432185804,\n", + " 0.24245773644341106,\n", + " 0.5277827945698642,\n", + " 0.21046333658341457,\n", + " 0.2460821020525513,\n", + " 0.42092649816245403,\n", + " 0.016497287432185804,\n", + " 0.14984894622365558,\n", + " 0.67463209080227,\n", + " 0.01637230930773269,\n", + " 0.1258531463286582,\n", + " 0.4461720793019825,\n", + " 0.4449222980574514,\n", + " 0.16647103677591937,\n", + " 0.016497287432185804,\n", + " 0.24133293332333305,\n", + " 0.13097724943123576,\n", + " 0.43654876371909296,\n", + " 0.31182059551488783,\n", + " 0.09798302457561438,\n", + " 0.01674724368109203,\n", + " 0.267078426960674,\n", + " 0.2780765019125478,\n", + " 0.01787204680117003,\n", + " 0.016497287432185804,\n", + " 0.016497287432185804,\n", + " 0.25558043951098774,\n", + " 0.2437075176879422,\n", + " 0.24820673016825417,\n", + " 0.016497287432185804,\n", + " 0.2452072551813795,\n", + " 0.01787204680117003,\n", + " 0.01787204680117003,\n", + " 0.24433240831020775,\n", + " 0.7051267531688291,\n", + " 0.2866999924998125,\n", + " 1.561601840046001,\n", + " 0.6253907097677441,\n", + " 0.17147016175404384,\n", + " 0.4647938198454961,\n", + " 0.2197117177929448,\n", + " 0.5501538788469711,\n", + " 0.45529548238705964,\n", + " 0.134601615040376,\n", + " 0.3154449611240281,\n", + " 0.4234260606515163,\n", + " 0.10273219330483262,\n", + " 0.1622217805445136,\n", + " 0.24595712392809818,\n", + " 0.016497287432185804,\n", + " 0.2849502987574689,\n", + " 0.4512961824045601,\n", + " 0.13397672441811045,\n", + " 0.08860966524163104,\n", + " 0.24333258331458285,\n", + " 0.016497287432185804,\n", + " 0.016497287432185804,\n", + " 0.26982794569864244,\n", + " 0.24908157703942596,\n", + " 0.016497287432185804,\n", + " 0.01787204680117003,\n", + " 0.24320760519012974,\n", + " 0.24445738643466086,\n", + " 0.016497287432185804,\n", + " 0.01787204680117003,\n", + " 0.24695694892372308,\n", + " 0.2438324958123953,\n", + " 0.016497287432185804,\n", + " 1.623466011650291,\n", + " 0.6655086877171928,\n", + " 0.016497287432185804,\n", + " 0.24470734268356706,\n", + " 0.2294600115002875,\n", + " 0.5720250506262656,\n", + " 0.24458236455911395,\n", + " 0.016497287432185804,\n", + " 0.16947051176279407,\n", + " 0.44017312932823316,\n", + " 0.7348715467886696,\n", + " 0.29007440186004646,\n", + " 0.37505952648816215,\n", + " 0.19021688042201054,\n", + " 0.13735113377834446,\n", + " 0.4844153853846346,\n", + " 0.016497287432185804,\n", + " 0.24195782394559862,\n", + " 0.3941811795294882,\n", + " 0.1509737493437336,\n", + " 0.11223053076326907,\n", + " 0.32856766419160477,\n", + " 0.016622265556638916,\n", + " 0.28857466436660917,\n", + " 0.27320235505887647,\n", + " 0.08748486212155303,\n", + " 0.01674724368109203,\n", + " 0.016497287432185804,\n", + " 0.260329608240206,\n", + " 0.24333258331458285,\n", + " 0.01674724368109203,\n", + " 0.2515811395284882,\n", + " 0.016497287432185804,\n", + " 0.24320760519012974,\n", + " 0.6908792469811744,\n", + " 1.6842053801345032,\n", + " 0.7639914497862446,\n", + " 0.30057256431410784,\n", + " 0.7208739968499212,\n", + " 0.24583214580364507,\n", + " 0.6168921973049326,\n", + " 0.19096674916872922,\n", + " 0.1500989024725618,\n", + " 0.40967846696167404,\n", + " 0.016622265556638916,\n", + " 0.45654526363159076,\n", + " 0.1102308807720193,\n", + " 0.3325669641741043,\n", + " 0.24495729893247328,\n", + " 0.14310012750318757,\n", + " 0.3890570764269106,\n", + " 0.016497287432185804,\n", + " 0.2923240081002025,\n", + " 0.09460861521538037,\n", + " 0.08361054026350659,\n", + " 0.2762018300457511,\n", + " 0.017747068676716916,\n", + " 0.2527059426485662,\n", + " 0.24408245206130152,\n", + " 0.01674724368109203,\n", + " 0.01674724368109203,\n", + " 0.2437075176879422,\n", + " 0.25008140203505086,\n", + " 0.01787204680117003,\n", + " 0.24245773644341106,\n", + " 0.01674724368109203,\n", + " 1.7436949673741842,\n", + " 0.7151250031250781,\n", + " 0.2472069051726293,\n", + " 0.01674724368109203,\n", + " 0.24358253956348908,\n", + " 0.7454946873671842,\n", + " 0.01674724368109203,\n", + " 0.24220778019450484,\n", + " 0.18409295232380807,\n", + " 0.47266744168604213,\n", + " 0.792611440286007,\n", + " 0.315319982999575,\n", + " 0.19509102727568187,\n", + " 0.6390133253331333,\n", + " 0.4026796919922998,\n", + " 0.14872414310357757,\n", + " 0.01674724368109203,\n", + " 0.24295764894122351,\n", + " 0.1533483337083427,\n", + " 0.42492579814495357,\n", + " 0.2971981549538738,\n", + " 0.01787204680117003,\n", + " 0.01674724368109203,\n", + " 0.24545721143028573,\n", + " 0.2792013050326258,\n", + " 0.08698494962374059,\n", + " 0.01674724368109203,\n", + " 0.2669534488362209,\n", + " 0.25345581139528484,\n", + " 0.01787204680117003,\n", + " 0.01674724368109203,\n", + " 0.24158288957223928,\n", + " 0.8207315182879571,\n", + " 0.341190454761369,\n", + " 0.7637414935373383,\n", + " 1.802059751493787,\n", + " 0.511785594639866,\n", + " 0.2107132928323208,\n", + " 0.6352639815995399,\n", + " 0.2638289957248931,\n", + " 0.4397981949548738,\n", + " 0.016622265556638916,\n", + " 0.4884146853671341,\n", + " 0.19096674916872922,\n", + " 0.35143866096652415,\n", + " 0.12172886822170553,\n", + " 0.24808175204380106,\n", + " 0.01674724368109203,\n", + " 0.4160523513087827,\n", + " 0.30744636115902896,\n", + " 0.15422318057951448,\n", + " 0.10298214955373884,\n", + " 0.28070104252606315,\n", + " 0.01674724368109203,\n", + " 0.2438324958123953,\n", + " 0.01787204680117003,\n", + " 0.24333258331458285,\n", + " 0.01674724368109203,\n", + " 0.24108297707442683,\n", + " 0.01674724368109203,\n", + " 1.859299732493312,\n", + " 0.7706152903822595,\n", + " 0.25358078951973795,\n", + " 0.01674724368109203,\n", + " 0.24995642391059775,\n", + " 0.02299614990374759,\n", + " 0.01674724368109203,\n", + " 0.194091202280057,\n", + " 0.24320760519012974,\n", + " 0.47729163229080723,\n", + " 0.8482267056676416,\n", + " 0.35043883597089925,\n", + " 0.5290325758143953,\n", + " 0.21446263656591413,\n", + " 0.24495729893247328,\n", + " 0.01674724368109203,\n", + " 0.16847068676716917,\n", + " 0.43917330433260826,\n", + " 0.3104458361459036,\n", + " 0.01787204680117003,\n", + " 0.01674724368109203,\n", + " 0.2849502987574689,\n", + " 0.01674724368109203,\n", + " 0.01674724368109203,\n", + " 0.24495729893247328,\n", + " 0.2694530113252831,\n", + " 0.01674724368109203,\n", + " 0.25570541763544086,\n", + " 0.24295764894122351,\n", + " 0.01787204680117003,\n", + " 0.3680607515187879,\n", + " 0.1348515712892822,\n", + " 0.01674724368109203,\n", + " 0.24220778019450484,\n", + " 0.31594487362184054,\n", + " 0.01787204680117003,\n", + " 0.28832470811770294,\n", + " 0.017747068676716916,\n", + " 0.01674724368109203,\n", + " 0.24345756143903596,\n", + " 0.2439574739368484,\n", + " 0.01674724368109203,\n", + " 0.01787204680117003,\n", + " 0.2427076926923173,\n", + " 0.020121653041326033,\n", + " 1.9707802195054873,\n", + " 0.8066089902247555,\n", + " 0.25745511137778443,\n", + " 0.030869771744293607,\n", + " 0.2542056801420035,\n", + " 0.01674724368109203,\n", + " 0.25120620515512887,\n", + " 0.20708892722318056,\n", + " 0.5061615790394759,\n", + " 0.01674724368109203,\n", + " 0.24795677391934798,\n", + " 0.01787204680117003,\n", + " 0.32069404235105875,\n", + " 0.2935737893447336,\n", + " 0.24658201455036374,\n", + " 0.017747068676716916,\n", + " 0.017747068676716916,\n", + " 0.022121303032575812,\n", + " 0.2762018300457511,\n", + " 0.02062156553913848,\n", + " 0.25970471761794045,\n", + " 0.01787204680117003,\n", + " 0.2418328458211455,\n", + " 0.3726849421235531,\n", + " 0.13960074001850045,\n", + " 0.2385834145853646,\n", + " 0.01674724368109203,\n", + " 0.12085402135053376,\n", + " 0.324318407960199,\n", + " 0.29494854871371784,\n", + " 0.017747068676716916,\n", + " 0.04686697167429185,\n", + " 0.24420743018575464,\n", + " 0.017497112427810695,\n", + " 0.24345756143903596,\n", + " 0.017747068676716916,\n", + " 0.2418328458211455,\n", + " 0.26145441136028397,\n", + " 0.017747068676716916,\n", + " 2.0785113627840692,\n", + " 0.855350458761469,\n", + " 0.017747068676716916,\n", + " 0.25857991449786244,\n", + " 0.017747068676716916,\n", + " 0.2542056801420035,\n", + " 0.5339067226680667,\n", + " 0.21708717717942946,\n", + " 0.2507062926573164,\n", + " 0.017747068676716916,\n", + " 0.33319185479636987,\n", + " 0.01787204680117003,\n", + " 0.2484566864171604,\n", + " 0.017747068676716916,\n", + " 0.30269719242981075,\n", + " 0.01787204680117003,\n", + " 0.28420043001075024,\n", + " 0.017747068676716916,\n", + " 0.017747068676716916,\n", + " 0.2684531863296582,\n", + " 0.017747068676716916,\n", + " 0.2437075176879422,\n", + " 0.15222353058826468,\n", + " 0.3604370859271481,\n", + " 0.2428326708167704,\n", + " 0.01787204680117003,\n", + " 0.33506652666316655,\n", + " 0.12347856196404909,\n", + " 0.01787204680117003,\n", + " 0.2452072551813795,\n", + " 0.01787204680117003,\n", + " 0.24445738643466086,\n", + " 0.01787204680117003,\n", + " 0.23770856771419283,\n", + " 0.017747068676716916,\n", + " 0.9118405710142753,\n", + " 2.1824931623290578,\n", + " 0.2650787769694242,\n", + " 0.26232925823145575,\n", + " 0.021371434285857145,\n", + " 0.017747068676716916,\n", + " 0.25745511137778443,\n", + " 0.23245948648716216,\n", + " 0.5607770194254856,\n", + " 0.017747068676716916,\n", + " 0.2539557238930973,\n", + " 0.10273219330483262,\n", + " 0.28645003625090626,\n", + " 0.33519150478761967,\n", + " 0.01787204680117003,\n", + " 0.017497112427810695,\n", + " 0.2503313582839571,\n", + " 0.017747068676716916,\n", + " 0.26245423635590887,\n", + " 0.23783354583864594,\n", + " 0.017747068676716916,\n", + " 0.15947226180654514,\n", + " 0.39918030450761266,\n", + " 0.017747068676716916,\n", + " 0.24308262706567663,\n", + " 0.3433150828770719,\n", + " 0.01787204680117003,\n", + " 0.24670699267481686,\n", + " 0.05099124978124453,\n", + " 0.048491687292182305,\n", + " 0.24658201455036374,\n", + " 0.23795852396309905,\n", + " 0.01787204680117003,\n", + " 2.2832255306382656,\n", + " 0.9839529488237205,\n", + " 0.26995292382309555,\n", + " 0.017747068676716916,\n", + " 0.267078426960674,\n", + " 0.017747068676716916,\n", + " 0.24445738643466086,\n", + " 0.5867724693117328,\n", + " 0.2705778144453611,\n", + " 0.017747068676716916,\n", + " 0.017497112427810695,\n", + " 0.25670524263106576,\n", + " 0.2958233955848896,\n", + " 0.01787204680117003,\n", + " 0.2533308332708318,\n", + " 0.017497112427810695,\n", + " 0.2745771144278607,\n", + " 0.09660826520663016,\n", + " 0.24095799894997372,\n", + " 0.017747068676716916,\n", + " 0.16272169304232606,\n", + " 0.4176770669266731,\n", + " 0.017747068676716916,\n", + " 0.2417078676966924,\n", + " 0.01787204680117003,\n", + " 0.24870664266606662,\n", + " 0.01787204680117003,\n", + " 0.34756433910847767,\n", + " ...]" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "vol_batch_bjs = vector_vol_estimation(\n", + " vol_est_brute_force_bjs_2002,\n", + " vector_params\n", + ")\n", + "vol_batch_bjs" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "from trade.optionlib.utils.batch_operation import vector_batch_processor\n", + "slc = slice(None)\n", + "\n", + "test2 = vector_batch_processor(\n", + " vector_vol_estimation,\n", + " vol_est_brute_force_bjs_2002,\n", + " # vector_params,\n", + " None,\n", + " s[slc], \n", + " aapl_chain['Strike'].tolist()[slc],\n", + " T[slc], \n", + " r[slc], \n", + " aapl_chain['Midpoint'].tolist()[slc], \n", + " q[slc], \n", + " aapl_chain['Right'].str.lower().tolist()[slc],\n", + " \n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "aapl_chain['bjs_vol_non_batch'] = vol_batch_bjs\n", + "aapl_chain['bjs_vol_batch'] = test2\n", + "aapl_chain['diff'] = aapl_chain['bjs_vol_non_batch'] - aapl_chain['bjs_vol_batch']\n", + "aapl_chain['bjs_vol_non_batch'].equals(aapl_chain['bjs_vol_batch'])" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
RootExpirationStrikeRightBid_sizeCloseBidAsk_sizeCloseAskDateMidpointWeighted_midpointbjs_vol_non_batchbjs_vol_batchdiffbjs_vol
datetime
2025-07-16AAPL2025-08-22215.0P19.753810.15202507169.95010.1397440.1322270.1322270.00.132227
2025-07-16AAPL2025-08-29215.0C26.2516.40202507166.3256.3000000.2765770.2765770.00.276577
2025-07-16AAPL2025-08-22215.0C25.6515.75202507165.7005.6833330.2802010.2802010.00.280201
2025-07-16AAPL2025-08-29215.0P249.902310.602025071610.25010.2425530.1419750.1419750.00.141975
2025-07-16AAPL2025-09-19215.0P811.25111.402025071611.32511.2666670.1702200.1702200.00.170220
................................................
2025-07-16AAPL2025-07-25215.0P45.90306.10202507166.0006.0764710.0177470.0177470.00.017747
2025-07-16AAPL2025-08-08215.0C64.45124.55202507164.5004.5166670.3029470.3029470.00.302947
2025-07-16AAPL2025-08-08215.0P48.5568.85202507168.7008.7300000.0458670.0458670.00.045867
2025-07-16AAPL2026-06-18210.0P1318.402318.702025071618.55018.5916670.3741850.3741850.00.374185
2025-07-16AAPL2026-06-18210.0C125.40225.602025071625.50025.5333330.2758270.2758270.00.275827
\n", + "

2428 rows × 15 columns

\n", + "
" + ], + "text/plain": [ + " Root Expiration Strike Right Bid_size CloseBid Ask_size \\\n", + "datetime \n", + "2025-07-16 AAPL 2025-08-22 215.0 P 1 9.75 38 \n", + "2025-07-16 AAPL 2025-08-29 215.0 C 2 6.25 1 \n", + "2025-07-16 AAPL 2025-08-22 215.0 C 2 5.65 1 \n", + "2025-07-16 AAPL 2025-08-29 215.0 P 24 9.90 23 \n", + "2025-07-16 AAPL 2025-09-19 215.0 P 8 11.25 1 \n", + "... ... ... ... ... ... ... ... \n", + "2025-07-16 AAPL 2025-07-25 215.0 P 4 5.90 30 \n", + "2025-07-16 AAPL 2025-08-08 215.0 C 6 4.45 12 \n", + "2025-07-16 AAPL 2025-08-08 215.0 P 4 8.55 6 \n", + "2025-07-16 AAPL 2026-06-18 210.0 P 13 18.40 23 \n", + "2025-07-16 AAPL 2026-06-18 210.0 C 1 25.40 2 \n", + "\n", + " CloseAsk Date Midpoint Weighted_midpoint \\\n", + "datetime \n", + "2025-07-16 10.15 20250716 9.950 10.139744 \n", + "2025-07-16 6.40 20250716 6.325 6.300000 \n", + "2025-07-16 5.75 20250716 5.700 5.683333 \n", + "2025-07-16 10.60 20250716 10.250 10.242553 \n", + "2025-07-16 11.40 20250716 11.325 11.266667 \n", + "... ... ... ... ... \n", + "2025-07-16 6.10 20250716 6.000 6.076471 \n", + "2025-07-16 4.55 20250716 4.500 4.516667 \n", + "2025-07-16 8.85 20250716 8.700 8.730000 \n", + "2025-07-16 18.70 20250716 18.550 18.591667 \n", + "2025-07-16 25.60 20250716 25.500 25.533333 \n", + "\n", + " bjs_vol_non_batch bjs_vol_batch diff bjs_vol \n", + "datetime \n", + "2025-07-16 0.132227 0.132227 0.0 0.132227 \n", + "2025-07-16 0.276577 0.276577 0.0 0.276577 \n", + "2025-07-16 0.280201 0.280201 0.0 0.280201 \n", + "2025-07-16 0.141975 0.141975 0.0 0.141975 \n", + "2025-07-16 0.170220 0.170220 0.0 0.170220 \n", + "... ... ... ... ... \n", + "2025-07-16 0.017747 0.017747 0.0 0.017747 \n", + "2025-07-16 0.302947 0.302947 0.0 0.302947 \n", + "2025-07-16 0.045867 0.045867 0.0 0.045867 \n", + "2025-07-16 0.374185 0.374185 0.0 0.374185 \n", + "2025-07-16 0.275827 0.275827 0.0 0.275827 \n", + "\n", + "[2428 rows x 15 columns]" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "aapl_chain['bjs_vol'] = vol_batch_bjs\n", + "aapl_chain" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[0;31mSignature:\u001b[0m\n", + "\u001b[0mestimate_crr_implied_volatility\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mS\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mK\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mT\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mmarket_price\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mq\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0.0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0moption_type\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'c'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mN\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mint\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m1000\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mdividend_type\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mLiteral\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'continuous'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'discrete'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'continuous'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mamerican\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mbool\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mDocstring:\u001b[0m\n", + "Estimate implied volatility using optimization.\n", + "\n", + "Parameters:\n", + "- S: Spot price\n", + "- K: Strike price\n", + "- T: Time to maturity\n", + "- r: Risk-free interest rate\n", + "- market_price: Market price of the option\n", + "- q: Continuous dividend yield (default is 0.0)\n", + "- option_type: 'c' for call, 'p' for put\n", + "- N: Number of time steps in the binomial tree\n", + "\n", + "Returns:\n", + "- Estimated volatility\n", + "\u001b[0;31mFile:\u001b[0m ~/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/vol/implied_vol.py\n", + "\u001b[0;31mType:\u001b[0m function" + ] + } + ], + "source": [ + "estimate_crr_implied_volatility?\n", + "crr_vector_params_discrete = list(zip(\n", + " s, aapl_chain['Strike'].tolist(), ## Spot, Strike\n", + " T, r, ## Time to Maturity, Risk Free Rate\n", + " aapl_chain['Midpoint'], ## Midpoint Price\n", + " discrete_q_convert, ## Discrete Dividend Schedules\n", + " aapl_chain['Right'].str.lower().tolist(), ## Option Type\n", + " [100] * len(aapl_chain), ## Number of Steps\n", + " ['discrete'] * len(aapl_chain), ## Dividend Type\n", + " [True] * len(aapl_chain),)) ## American==True, European==False\n", + "\n", + "crr_vector_params_cont = list(zip(\n", + " s, aapl_chain['Strike'].tolist(), ## Spot, Strike\n", + " T, r, ## Time to Maturity, Risk Free Rate\n", + " aapl_chain['Midpoint'], ## Midpoint Price\n", + " q, ## Discrete Dividend Schedules\n", + " aapl_chain['Right'].str.lower().tolist(), ## Option Type\n", + " [100] * len(aapl_chain), ## Number of Steps\n", + " ['continuous'] * len(aapl_chain), ## Dividend Type\n", + " [True] * len(aapl_chain),)) ## American==True, European==False" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Finished Discrete in 514.051295042038 seconds\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "--- Logging error ---\n", + "multiprocess.pool.RemoteTraceback: \n", + "\"\"\"\n", + "Traceback (most recent call last):\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/multiprocess/pool.py\", line 125, in worker\n", + " result = (True, func(*args, **kwds))\n", + " ^^^^^^^^^^^^^^^^^^^\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/multiprocess/pool.py\", line 48, in mapstar\n", + " return list(map(*args))\n", + " ^^^^^^^^^^^^^^^^\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/pathos/helpers/mp_helper.py\", line 15, in \n", + " func = lambda args: f(*args)\n", + " ^^^^^^^^\n", + " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/vol/implied_vol.py\", line 158, in vector_vol_estimation\n", + " estimated_vols = [brute_callable(*params) for params in list_input]\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/vol/implied_vol.py\", line 158, in \n", + " estimated_vols = [brute_callable(*params) for params in list_input]\n", + " ^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/vol/implied_vol.py\", line 258, in estimate_crr_implied_volatility\n", + " result = minimize_scalar(\n", + " ^^^^^^^^^^^^^^^^\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/scipy/optimize/_minimize.py\", line 966, in minimize_scalar\n", + " res = _minimize_scalar_bounded(fun, bounds, args, **options)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/scipy/optimize/_optimize.py\", line 2321, in _minimize_scalar_bounded\n", + " fu = func(x, *args)\n", + " ^^^^^^^^^^^^^^\n", + " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/vol/implied_vol.py\", line 244, in binomial_objective_function\n", + " calculated_price = crr_binomial_pricing(\n", + " ^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/pricing/binomial.py\", line 208, in crr_binomial_pricing\n", + " u, d, p = crr_init_parameters(sigma, r, T, N, div_yield=div_amount if dividend_type == 'continuous' else 0.0, dividend_type=dividend_type)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/pricing/binomial.py\", line 53, in crr_init_parameters\n", + " raise ValueError(f\"Invalid probability p={p}. It must be between 0 and 1.\")\n", + "ValueError: Invalid probability p=1.0109933236781294. It must be between 0 and 1.\n", + "\"\"\"\n", + "\n", + "The above exception was the direct cause of the following exception:\n", + "\n", + "Traceback (most recent call last):\n", + " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/pools.py\", line 46, in runProcesses\n", + " results = pool.map(func, *OrderedInputs)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/pathos/multiprocessing.py\", line 135, in map\n", + " return _pool.map(star(f), zip(*args)) # chunksize\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/multiprocess/pool.py\", line 367, in map\n", + " return self._map_async(func, iterable, mapstar, chunksize).get()\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/multiprocess/pool.py\", line 774, in get\n", + " raise self._value\n", + "ValueError: Invalid probability p=1.0109933236781294. It must be between 0 and 1.\n", + "\n", + "During handling of the above exception, another exception occurred:\n", + "\n", + "Traceback (most recent call last):\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/logging/__init__.py\", line 1110, in emit\n", + " msg = self.format(record)\n", + " ^^^^^^^^^^^^^^^^^^^\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/logging/__init__.py\", line 953, in format\n", + " return fmt.format(record)\n", + " ^^^^^^^^^^^^^^^^^^\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/logging/__init__.py\", line 687, in format\n", + " record.message = record.getMessage()\n", + " ^^^^^^^^^^^^^^^^^^^\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/logging/__init__.py\", line 377, in getMessage\n", + " msg = msg % self.args\n", + " ~~~~^~~~~~~~~~~\n", + "TypeError: not all arguments converted during string formatting\n", + "Call stack:\n", + " File \"\", line 198, in _run_module_as_main\n", + " File \"\", line 88, in _run_code\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/ipykernel_launcher.py\", line 17, in \n", + " app.launch_new_instance()\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/traitlets/config/application.py\", line 1053, in launch_instance\n", + " app.start()\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/ipykernel/kernelapp.py\", line 736, in start\n", + " self.io_loop.start()\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/tornado/platform/asyncio.py\", line 195, in start\n", + " self.asyncio_loop.run_forever()\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/asyncio/base_events.py\", line 608, in run_forever\n", + " self._run_once()\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/asyncio/base_events.py\", line 1936, in _run_once\n", + " handle._run()\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/asyncio/events.py\", line 84, in _run\n", + " self._context.run(self._callback, *self._args)\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/ipykernel/kernelbase.py\", line 516, in dispatch_queue\n", + " await self.process_one()\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/ipykernel/kernelbase.py\", line 505, in process_one\n", + " await dispatch(*args)\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/ipykernel/kernelbase.py\", line 412, in dispatch_shell\n", + " await result\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/ipykernel/kernelbase.py\", line 740, in execute_request\n", + " reply_content = await reply_content\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/ipykernel/ipkernel.py\", line 422, in do_execute\n", + " res = shell.run_cell(\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/ipykernel/zmqshell.py\", line 546, in run_cell\n", + " return super().run_cell(*args, **kwargs)\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/IPython/core/interactiveshell.py\", line 3024, in run_cell\n", + " result = self._run_cell(\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/IPython/core/interactiveshell.py\", line 3079, in _run_cell\n", + " result = runner(coro)\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/IPython/core/async_helpers.py\", line 129, in _pseudo_sync_runner\n", + " coro.send(None)\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/IPython/core/interactiveshell.py\", line 3284, in run_cell_async\n", + " has_raised = await self.run_ast_nodes(code_ast.body, cell_name,\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/IPython/core/interactiveshell.py\", line 3466, in run_ast_nodes\n", + " if await self.run_code(code, result, async_=asy):\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/IPython/core/interactiveshell.py\", line 3526, in run_code\n", + " exec(code_obj, self.user_global_ns, self.user_ns)\n", + " File \"/var/folders/j0/80hkbygd4lb27h9mw76gqzpw0000gn/T/ipykernel_56605/2246281926.py\", line 11, in \n", + " vol_batch_crr_cont = vector_batch_processor(\n", + " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/utils/batch_operation.py\", line 53, in vector_batch_processor\n", + " results = runProcesses(\n", + " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/pools.py\", line 64, in runProcesses\n", + " logger.error('Error occured: ', e)\n", + "Message: 'Error occured: '\n", + "Arguments: (ValueError('Invalid probability p=1.0109933236781294. It must be between 0 and 1.'),)\n", + "--- Logging error ---\n", + "multiprocess.pool.RemoteTraceback: \n", + "\"\"\"\n", + "Traceback (most recent call last):\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/multiprocess/pool.py\", line 125, in worker\n", + " result = (True, func(*args, **kwds))\n", + " ^^^^^^^^^^^^^^^^^^^\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/multiprocess/pool.py\", line 48, in mapstar\n", + " return list(map(*args))\n", + " ^^^^^^^^^^^^^^^^\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/pathos/helpers/mp_helper.py\", line 15, in \n", + " func = lambda args: f(*args)\n", + " ^^^^^^^^\n", + " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/vol/implied_vol.py\", line 158, in vector_vol_estimation\n", + " estimated_vols = [brute_callable(*params) for params in list_input]\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/vol/implied_vol.py\", line 158, in \n", + " estimated_vols = [brute_callable(*params) for params in list_input]\n", + " ^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/vol/implied_vol.py\", line 258, in estimate_crr_implied_volatility\n", + " result = minimize_scalar(\n", + " ^^^^^^^^^^^^^^^^\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/scipy/optimize/_minimize.py\", line 966, in minimize_scalar\n", + " res = _minimize_scalar_bounded(fun, bounds, args, **options)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/scipy/optimize/_optimize.py\", line 2321, in _minimize_scalar_bounded\n", + " fu = func(x, *args)\n", + " ^^^^^^^^^^^^^^\n", + " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/vol/implied_vol.py\", line 244, in binomial_objective_function\n", + " calculated_price = crr_binomial_pricing(\n", + " ^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/pricing/binomial.py\", line 208, in crr_binomial_pricing\n", + " u, d, p = crr_init_parameters(sigma, r, T, N, div_yield=div_amount if dividend_type == 'continuous' else 0.0, dividend_type=dividend_type)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/pricing/binomial.py\", line 53, in crr_init_parameters\n", + " raise ValueError(f\"Invalid probability p={p}. It must be between 0 and 1.\")\n", + "ValueError: Invalid probability p=1.0109933236781294. It must be between 0 and 1.\n", + "\"\"\"\n", + "\n", + "The above exception was the direct cause of the following exception:\n", + "\n", + "Traceback (most recent call last):\n", + " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/pools.py\", line 46, in runProcesses\n", + " results = pool.map(func, *OrderedInputs)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/pathos/multiprocessing.py\", line 135, in map\n", + " return _pool.map(star(f), zip(*args)) # chunksize\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/multiprocess/pool.py\", line 367, in map\n", + " return self._map_async(func, iterable, mapstar, chunksize).get()\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/multiprocess/pool.py\", line 774, in get\n", + " raise self._value\n", + "ValueError: Invalid probability p=1.0109933236781294. It must be between 0 and 1.\n", + "\n", + "During handling of the above exception, another exception occurred:\n", + "\n", + "Traceback (most recent call last):\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/logging/__init__.py\", line 1110, in emit\n", + " msg = self.format(record)\n", + " ^^^^^^^^^^^^^^^^^^^\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/logging/__init__.py\", line 953, in format\n", + " return fmt.format(record)\n", + " ^^^^^^^^^^^^^^^^^^\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/logging/__init__.py\", line 687, in format\n", + " record.message = record.getMessage()\n", + " ^^^^^^^^^^^^^^^^^^^\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/logging/__init__.py\", line 377, in getMessage\n", + " msg = msg % self.args\n", + " ~~~~^~~~~~~~~~~\n", + "TypeError: not all arguments converted during string formatting\n", + "Call stack:\n", + " File \"\", line 198, in _run_module_as_main\n", + " File \"\", line 88, in _run_code\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/ipykernel_launcher.py\", line 17, in \n", + " app.launch_new_instance()\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/traitlets/config/application.py\", line 1053, in launch_instance\n", + " app.start()\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/ipykernel/kernelapp.py\", line 736, in start\n", + " self.io_loop.start()\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/tornado/platform/asyncio.py\", line 195, in start\n", + " self.asyncio_loop.run_forever()\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/asyncio/base_events.py\", line 608, in run_forever\n", + " self._run_once()\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/asyncio/base_events.py\", line 1936, in _run_once\n", + " handle._run()\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/asyncio/events.py\", line 84, in _run\n", + " self._context.run(self._callback, *self._args)\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/ipykernel/kernelbase.py\", line 516, in dispatch_queue\n", + " await self.process_one()\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/ipykernel/kernelbase.py\", line 505, in process_one\n", + " await dispatch(*args)\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/ipykernel/kernelbase.py\", line 412, in dispatch_shell\n", + " await result\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/ipykernel/kernelbase.py\", line 740, in execute_request\n", + " reply_content = await reply_content\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/ipykernel/ipkernel.py\", line 422, in do_execute\n", + " res = shell.run_cell(\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/ipykernel/zmqshell.py\", line 546, in run_cell\n", + " return super().run_cell(*args, **kwargs)\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/IPython/core/interactiveshell.py\", line 3024, in run_cell\n", + " result = self._run_cell(\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/IPython/core/interactiveshell.py\", line 3079, in _run_cell\n", + " result = runner(coro)\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/IPython/core/async_helpers.py\", line 129, in _pseudo_sync_runner\n", + " coro.send(None)\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/IPython/core/interactiveshell.py\", line 3284, in run_cell_async\n", + " has_raised = await self.run_ast_nodes(code_ast.body, cell_name,\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/IPython/core/interactiveshell.py\", line 3466, in run_ast_nodes\n", + " if await self.run_code(code, result, async_=asy):\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/IPython/core/interactiveshell.py\", line 3526, in run_code\n", + " exec(code_obj, self.user_global_ns, self.user_ns)\n", + " File \"/var/folders/j0/80hkbygd4lb27h9mw76gqzpw0000gn/T/ipykernel_56605/2246281926.py\", line 11, in \n", + " vol_batch_crr_cont = vector_batch_processor(\n", + " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/utils/batch_operation.py\", line 53, in vector_batch_processor\n", + " results = runProcesses(\n", + " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/pools.py\", line 64, in runProcesses\n", + " logger.error('Error occured: ', e)\n", + "Message: 'Error occured: '\n", + "Arguments: (ValueError('Invalid probability p=1.0109933236781294. It must be between 0 and 1.'),)\n", + "Process ForkPoolWorker-77:\n", + "Process ForkPoolWorker-78:\n", + "Traceback (most recent call last):\n", + "Traceback (most recent call last):\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/multiprocess/process.py\", line 317, in _bootstrap\n", + " util._exit_function()\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/multiprocess/util.py\", line 320, in _exit_function\n", + " def _exit_function(info=info, debug=debug, _run_finalizers=_run_finalizers,\n", + " \n", + " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py\", line 297, in _on_signal\n", + " os.kill(os.getpid(), signum)\n", + " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py\", line 297, in _on_signal\n", + " os.kill(os.getpid(), signum)\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/multiprocess/process.py\", line 314, in _bootstrap\n", + " self.run()\n", + " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py\", line 297, in _on_signal\n", + " os.kill(os.getpid(), signum)\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/multiprocess/process.py\", line 108, in run\n", + " self._target(*self._args, **self._kwargs)\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/multiprocess/pool.py\", line 120, in worker\n", + " util.debug('worker got sentinel -- exiting')\n", + " [Previous line repeated 2942 more times]\n", + " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py\", line 296, in _on_signal\n", + " self._on_exit()\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/multiprocess/util.py\", line 48, in debug\n", + " def debug(msg, *args):\n", + " \n", + " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py\", line 297, in _on_signal\n", + " os.kill(os.getpid(), signum)\n", + " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py\", line 290, in _on_exit\n", + " self.clear()\n", + " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py\", line 297, in _on_signal\n", + " os.kill(os.getpid(), signum)\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/diskcache/core.py\", line 2177, in clear\n", + " return self._select_delete(select, args, retry=retry)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/diskcache/core.py\", line 2187, in _select_delete\n", + " with self._transact(retry) as (sql, cleanup):\n", + " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py\", line 297, in _on_signal\n", + " os.kill(os.getpid(), signum)\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/contextlib.py\", line 137, in __enter__\n", + " return next(self.gen)\n", + " ^^^^^^^^^^^^^^\n", + " [Previous line repeated 2940 more times]\n", + " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py\", line 296, in _on_signal\n", + " self._on_exit()\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/diskcache/core.py\", line 710, in _transact\n", + " sql = self._sql\n", + " ^^^^^^^^^\n", + " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py\", line 290, in _on_exit\n", + " self.clear()\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/diskcache/core.py\", line 648, in _sql\n", + " return self._con.execute\n", + " ^^^^^^^^^\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/diskcache/core.py\", line 2177, in clear\n", + " return self._select_delete(select, args, retry=retry)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/diskcache/core.py\", line 613, in _con\n", + " local_pid = getattr(self._local, 'pid', None)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/diskcache/core.py\", line 2187, in _select_delete\n", + " with self._transact(retry) as (sql, cleanup):\n", + "RecursionError: maximum recursion depth exceeded in comparison\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/contextlib.py\", line 137, in __enter__\n", + " return next(self.gen)\n", + " ^^^^^^^^^^^^^^\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/diskcache/core.py\", line 710, in _transact\n", + " sql = self._sql\n", + " ^^^^^^^^^\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/diskcache/core.py\", line 648, in _sql\n", + " return self._con.execute\n", + " ^^^^^^^^^\n", + " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/diskcache/core.py\", line 613, in _con\n", + " local_pid = getattr(self._local, 'pid', None)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + "RecursionError: maximum recursion depth exceeded in comparison\n" + ] + }, + { + "ename": "ValueError", + "evalue": "Invalid probability p=1.0109933236781294. It must be between 0 and 1.", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mRemoteTraceback\u001b[0m Traceback (most recent call last)", + "\u001b[0;31mRemoteTraceback\u001b[0m: \n\"\"\"\nTraceback (most recent call last):\n File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/multiprocess/pool.py\", line 125, in worker\n result = (True, func(*args, **kwds))\n ^^^^^^^^^^^^^^^^^^^\n File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/multiprocess/pool.py\", line 48, in mapstar\n return list(map(*args))\n ^^^^^^^^^^^^^^^^\n File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/pathos/helpers/mp_helper.py\", line 15, in \n func = lambda args: f(*args)\n ^^^^^^^^\n File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/vol/implied_vol.py\", line 158, in vector_vol_estimation\n estimated_vols = [brute_callable(*params) for params in list_input]\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/vol/implied_vol.py\", line 158, in \n estimated_vols = [brute_callable(*params) for params in list_input]\n ^^^^^^^^^^^^^^^^^^^^^^^\n File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/vol/implied_vol.py\", line 258, in estimate_crr_implied_volatility\n result = minimize_scalar(\n ^^^^^^^^^^^^^^^^\n File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/scipy/optimize/_minimize.py\", line 966, in minimize_scalar\n res = _minimize_scalar_bounded(fun, bounds, args, **options)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/scipy/optimize/_optimize.py\", line 2321, in _minimize_scalar_bounded\n fu = func(x, *args)\n ^^^^^^^^^^^^^^\n File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/vol/implied_vol.py\", line 244, in binomial_objective_function\n calculated_price = crr_binomial_pricing(\n ^^^^^^^^^^^^^^^^^^^^^\n File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/pricing/binomial.py\", line 208, in crr_binomial_pricing\n u, d, p = crr_init_parameters(sigma, r, T, N, div_yield=div_amount if dividend_type == 'continuous' else 0.0, dividend_type=dividend_type)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/pricing/binomial.py\", line 53, in crr_init_parameters\n raise ValueError(f\"Invalid probability p={p}. It must be between 0 and 1.\")\nValueError: Invalid probability p=1.0109933236781294. It must be between 0 and 1.\n\"\"\"", + "\nThe above exception was the direct cause of the following exception:\n", + "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[41], line 11\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mFinished Discrete in \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mtime\u001b[38;5;241m.\u001b[39mtime()\u001b[38;5;250m \u001b[39m\u001b[38;5;241m-\u001b[39m\u001b[38;5;250m \u001b[39mstart\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m seconds\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 10\u001b[0m start \u001b[38;5;241m=\u001b[39m time\u001b[38;5;241m.\u001b[39mtime()\n\u001b[0;32m---> 11\u001b[0m vol_batch_crr_cont \u001b[38;5;241m=\u001b[39m \u001b[43mvector_batch_processor\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 12\u001b[0m \u001b[43m \u001b[49m\u001b[43mvector_vol_estimation\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 13\u001b[0m \u001b[43m \u001b[49m\u001b[43mestimate_crr_implied_volatility\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 14\u001b[0m \u001b[43m \u001b[49m\u001b[43mcrr_vector_params_cont\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 15\u001b[0m \u001b[43m)\u001b[49m\n\u001b[1;32m 16\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mFinished Continuous in \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mtime\u001b[38;5;241m.\u001b[39mtime()\u001b[38;5;250m \u001b[39m\u001b[38;5;241m-\u001b[39m\u001b[38;5;250m \u001b[39mstart\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m seconds\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", + "File \u001b[0;32m~/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/utils/batch_operation.py:53\u001b[0m, in \u001b[0;36mvector_batch_processor\u001b[0;34m(callable, *args, **kwargs)\u001b[0m\n\u001b[1;32m 50\u001b[0m ordered_inputs\u001b[38;5;241m.\u001b[39mappend(split_arg)\n\u001b[1;32m 52\u001b[0m \u001b[38;5;66;03m# print(ordered_inputs)\u001b[39;00m\n\u001b[0;32m---> 53\u001b[0m results \u001b[38;5;241m=\u001b[39m \u001b[43mrunProcesses\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 54\u001b[0m \u001b[43m \u001b[49m\u001b[43mfunc\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mcallable\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 55\u001b[0m \u001b[43m \u001b[49m\u001b[43mOrderedInputs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mordered_inputs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 56\u001b[0m \u001b[43m \u001b[49m\u001b[43mrun_type\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mmap\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 57\u001b[0m res \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mlist\u001b[39m(chain\u001b[38;5;241m.\u001b[39mfrom_iterable(results))\n\u001b[1;32m 59\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m res\n", + "File \u001b[0;32m~/cloned_repos/QuantTools/trade/helpers/pools.py:46\u001b[0m, in \u001b[0;36mrunProcesses\u001b[0;34m(func, OrderedInputs, run_type)\u001b[0m\n\u001b[1;32m 44\u001b[0m pool\u001b[38;5;241m.\u001b[39mrestart(force\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[1;32m 45\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m run_type \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmap\u001b[39m\u001b[38;5;124m'\u001b[39m:\n\u001b[0;32m---> 46\u001b[0m results \u001b[38;5;241m=\u001b[39m \u001b[43mpool\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmap\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfunc\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mOrderedInputs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 47\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m run_type \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mamap\u001b[39m\u001b[38;5;124m'\u001b[39m:\n\u001b[1;32m 48\u001b[0m results \u001b[38;5;241m=\u001b[39m pool\u001b[38;5;241m.\u001b[39mamap(func, \u001b[38;5;241m*\u001b[39mOrderedInputs)\n", + "File \u001b[0;32m~/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/pathos/multiprocessing.py:135\u001b[0m, in \u001b[0;36mProcessPool.map\u001b[0;34m(self, f, *args, **kwds)\u001b[0m\n\u001b[1;32m 133\u001b[0m AbstractWorkerPool\u001b[38;5;241m.\u001b[39m_AbstractWorkerPool__map(\u001b[38;5;28mself\u001b[39m, f, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwds)\n\u001b[1;32m 134\u001b[0m _pool \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_serve()\n\u001b[0;32m--> 135\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43m_pool\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmap\u001b[49m\u001b[43m(\u001b[49m\u001b[43mstar\u001b[49m\u001b[43m(\u001b[49m\u001b[43mf\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mzip\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/multiprocess/pool.py:367\u001b[0m, in \u001b[0;36mPool.map\u001b[0;34m(self, func, iterable, chunksize)\u001b[0m\n\u001b[1;32m 362\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mmap\u001b[39m(\u001b[38;5;28mself\u001b[39m, func, iterable, chunksize\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m):\n\u001b[1;32m 363\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m'''\u001b[39;00m\n\u001b[1;32m 364\u001b[0m \u001b[38;5;124;03m Apply `func` to each element in `iterable`, collecting the results\u001b[39;00m\n\u001b[1;32m 365\u001b[0m \u001b[38;5;124;03m in a list that is returned.\u001b[39;00m\n\u001b[1;32m 366\u001b[0m \u001b[38;5;124;03m '''\u001b[39;00m\n\u001b[0;32m--> 367\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_map_async\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfunc\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43miterable\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmapstar\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mchunksize\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/multiprocess/pool.py:774\u001b[0m, in \u001b[0;36mApplyResult.get\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 772\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_value\n\u001b[1;32m 773\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 774\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_value\n", + "\u001b[0;31mValueError\u001b[0m: Invalid probability p=1.0109933236781294. It must be between 0 and 1." + ] + } + ], + "source": [ + "import time\n", + "start = time.time()\n", + "vol_batch_crr_discrete = vector_batch_processor(\n", + " vector_vol_estimation,\n", + " estimate_crr_implied_volatility,\n", + " crr_vector_params_discrete,\n", + ")\n", + "\n", + "print(f\"Finished Discrete in {time.time() - start} seconds\")\n", + "start = time.time()\n", + "vol_batch_crr_cont = vector_batch_processor(\n", + " vector_vol_estimation,\n", + " estimate_crr_implied_volatility,\n", + " crr_vector_params_cont,\n", + ")\n", + "print(f\"Finished Continuous in {time.time() - start} seconds\")" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\n", + "['2025-07-18 00:00:00', '2025-07-25 00:00:00', '2025-08-01 00:00:00',\n", + " '2025-08-08 00:00:00', '2025-08-15 00:00:00', '2025-08-22 00:00:00',\n", + " '2025-08-29 00:00:00', '2025-09-19 00:00:00', '2025-10-17 00:00:00',\n", + " '2025-11-21 00:00:00', '2025-12-19 00:00:00', '2026-01-16 00:00:00',\n", + " '2026-02-20 00:00:00', '2026-03-20 00:00:00', '2026-05-15 00:00:00',\n", + " '2026-06-18 00:00:00', '2026-09-18 00:00:00', '2026-12-18 00:00:00',\n", + " '2027-01-15 00:00:00', '2027-06-17 00:00:00', '2027-12-17 00:00:00']\n", + "Length: 21, dtype: datetime64[ns]" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "aapl_chain['crr_vol'] = vol_batch_crr\n", + "aapl_chain.Expiration.sort_values().unique()" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "hovertemplate": "variable=crr_vol
Strike=%{x}
value=%{y}", + "legendgroup": "crr_vol", + "line": { + "color": "#636efa", + "dash": "solid" + }, + "marker": { + "symbol": "circle" + }, + "mode": "lines", + "name": "crr_vol", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": [ + 195, + 200, + 205, + 210, + 215, + 220, + 225, + 230, + 235, + 240, + 245, + 250, + 255, + 260, + 265, + 270, + 275, + 280, + 285, + 290, + 295, + 300, + 305, + 310, + 315, + 320, + 325, + 330, + 335, + 340, + 345, + 350, + 355, + 360, + 365, + 370, + 375, + 380, + 385, + 390, + 395, + 400, + 405, + 410, + 415, + 420, + 425, + 430, + 435, + 440 + ], + "xaxis": "x", + "y": [ + 0.2725618439235538, + 0.2633329430498516, + 0.2661143403938405, + 0.2589505740233532, + 0.2480277036823278, + 0.2591549217923299, + 0.2577722026112044, + 0.253772023340116, + 0.2538464472075328, + 0.25183732392271685, + 0.2530594753016646, + 0.24856619748597286, + 0.24617700887352673, + 0.24556736629696668, + 0.2473117655241653, + 0.24312775879719298, + 0.2424455448173008, + 0.2421741110918892, + 0.24094626516501996, + 0.23957334202943711, + 0.23930397476988852, + 0.23924764012244812, + 0.2389513147100834, + 0.23757104667162854, + 0.23694877062421343, + 0.2391020375478598, + 0.2396005668831895, + 0.23869510358360016, + 0.23826188034736304, + 0.24001712328381244, + 0.23479810409077617, + 0.235492415526492, + 0.23508155089659083, + 0.23790014848642907, + 0.23441685216186467, + 0.23618228729123392, + 0.23789785083913836, + 0.2393874496653081, + 0.23852673641763417, + 0.23796608965795227, + 0.23907172144186054, + 0.24096493598698843, + 0.2383828502316963, + 0.24205515808268002, + 0.24088319021797205, + 0.2358504418695725, + 0.23896202581095483, + 0.245514777190725, + 0.24234638338256115, + 0.24108233461303963 + ], + "yaxis": "y" + }, + { + "hovertemplate": "variable=bjs_vol
Strike=%{x}
value=%{y}", + "legendgroup": "bjs_vol", + "line": { + "color": "#EF553B", + "dash": "solid" + }, + "marker": { + "symbol": "circle" + }, + "mode": "lines", + "name": "bjs_vol", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": [ + 195, + 200, + 205, + 210, + 215, + 220, + 225, + 230, + 235, + 240, + 245, + 250, + 255, + 260, + 265, + 270, + 275, + 280, + 285, + 290, + 295, + 300, + 305, + 310, + 315, + 320, + 325, + 330, + 335, + 340, + 345, + 350, + 355, + 360, + 365, + 370, + 375, + 380, + 385, + 390, + 395, + 400, + 405, + 410, + 415, + 420, + 425, + 430, + 435, + 440 + ], + "xaxis": "x", + "y": [ + 0.2827006925173129, + 0.2733273331833296, + 0.2752020050501262, + 0.267078426960674, + 0.25645528638215953, + 0.26732838320958024, + 0.2647038425960649, + 0.2608295207380184, + 0.26107947698692463, + 0.2583299582489562, + 0.25870489262231555, + 0.25470559263981596, + 0.25220603015075377, + 0.25083127078176953, + 0.25208105202630066, + 0.2484566864171604, + 0.24758183954598864, + 0.24658201455036374, + 0.2452072551813795, + 0.24433240831020775, + 0.2438324958123953, + 0.24320760519012974, + 0.24245773644341106, + 0.24158288957223928, + 0.24108297707442683, + 0.24295764894122351, + 0.2427076926923173, + 0.2418328458211455, + 0.2418328458211455, + 0.2437075176879422, + 0.23770856771419283, + 0.23783354583864594, + 0.23795852396309905, + 0.24095799894997372, + 0.2374586114652866, + 0.23895834895872395, + 0.24033310832770818, + 0.24133293332333305, + 0.24095799894997372, + 0.24070804270106752, + 0.2418328458211455, + 0.2437075176879422, + 0.24033310832770818, + 0.2438324958123953, + 0.2427076926923173, + 0.23820848021200527, + 0.24133293332333305, + 0.24795677391934798, + 0.24458236455911395, + 0.24258271456786418 + ], + "yaxis": "y" + } + ], + "layout": { + "legend": { + "title": { + "text": "variable" + }, + "tracegroupgap": 0 + }, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "AAPL Call Options Implied Volatility" + }, + "xaxis": { + "anchor": "y", + "domain": [ + 0, + 1 + ], + "title": { + "text": "Strike" + } + }, + "yaxis": { + "anchor": "x", + "domain": [ + 0, + 1 + ], + "title": { + "text": "value" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "aapl_chain.Expiration.unique()\n", + "aapl_chain[(aapl_chain['Expiration'] == '2027-12-17') & (aapl_chain['Right'] == 'C')].sort_values('Strike').tail(50).plot(y = ['crr_vol', \n", + " 'bjs_vol'], x='Strike', kind='line', title='AAPL Call Options Implied Volatility')" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([-1.66211164, 0.44585662, 0.43537571, ..., -1.95918893,\n", + " -1.3861209 , 0.61119484])" + ] + }, + "execution_count": 60, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "\n", + "bjs_greeks = bjs2002_numerical_greeks(\n", + " K=aapl_chain['Strike'].tolist(),\n", + " T=T,\n", + " r=r,\n", + " sigma=aapl_chain['bjs_vol'].tolist(),\n", + " S=s,\n", + " div_yield=q,\n", + " option_type=aapl_chain['Right'].str.lower().tolist(),\n", + ")\n", + "bjs_greeks['delta']" + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Lengths: K=2428, expiration=2428, sigma=2428, r=2428, N=2428, S=2428, dividend_type=2428, option_type=2428, start_date=2428, valuation_date=2428, american=2428\n" + ] + } + ], + "source": [ + "binomial_greeks = binomial_tree_greeks(\n", + " K=aapl_chain['Strike'].tolist(),\n", + " expiration= aapl_chain['Expiration'].tolist(),\n", + " r=r,\n", + " sigma=aapl_chain['crr_vol'].tolist(),\n", + " S=s,\n", + " div_amount=discrete_q_convert,\n", + " option_type=aapl_chain['Right'].str.lower().tolist(),\n", + " N=100, # Number of steps in the binomial tree\n", + " dividend_type='discrete', # Dividend type\n", + " valuation_date=test_valuation_date, # Valuation date\n", + " american=True, # American options\n", + " start_date=test_valuation_date, # Start date for dividends\n", + "\n", + ")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[0;31mSignature:\u001b[0m\n", + "\u001b[0mbinomial_tree_greeks\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mK\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m \u001b[0;34m|\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mndarray\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mexpiration\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m \u001b[0;34m|\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mndarray\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0msigma\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m \u001b[0;34m|\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mndarray\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m \u001b[0;34m|\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mndarray\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mN\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m \u001b[0;34m|\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mndarray\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mS\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m \u001b[0;34m|\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mndarray\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mdividend_type\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m \u001b[0;34m|\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mndarray\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mdiv_amount\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m \u001b[0;34m|\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mndarray\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0moption_type\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m \u001b[0;34m|\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mndarray\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mstart_date\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m \u001b[0;34m|\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mndarray\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mvaluation_date\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m \u001b[0;34m|\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mndarray\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mamerican\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m \u001b[0;34m|\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mndarray\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mDocstring:\u001b[0m\n", + "Calculate Greeks using a binomial tree model.\n", + "\n", + "Parameters:\n", + "- K: Strike price\n", + "- expiration: Expiration date of the option\n", + "- sigma: Volatility of the underlying asset\n", + "- r: Risk-free interest rate\n", + "- N: Number of time steps in the binomial tree\n", + "- spot_price: Current price of the underlying asset (optional)\n", + "- dividend_type: Type of dividend ('discrete' or 'continuous')\n", + "- div_amount: Amount of dividend (if applicable)\n", + "- option_type: 'c' for call, 'p' for put\n", + "- start_date: Start date for the option pricing (optional)\n", + "- valuation_date: Date for which the option is priced (optional)\n", + "\n", + "Returns:\n", + "Dictionary with calculated Greeks.\n", + "\u001b[0;31mFile:\u001b[0m ~/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/greeks/numerical/binomial.py\n", + "\u001b[0;31mType:\u001b[0m function" + ] + } + ], + "source": [ + "binomial_tree_greeks?" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "openbb_new_use", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.13" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} \ No newline at end of file diff --git a/trade/optionlib/notebooks/binomial.ipynb b/trade/optionlib/demos/binomial.ipynb similarity index 98% rename from trade/optionlib/notebooks/binomial.ipynb rename to trade/optionlib/demos/binomial.ipynb index c610a67..e2cba48 100644 --- a/trade/optionlib/notebooks/binomial.ipynb +++ b/trade/optionlib/demos/binomial.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -26,7 +26,7 @@ "%load_ext autoreload\n", "%autoreload 2\n", "\n", - "from module_test.raw_code.optionlib_2.pricing.binomial import (\n", + "from trade.optionlib.pricing.binomial import (\n", " VectorBinomialCRR,\n", " NodeBinomialCRR,\n", " EquityForward,\n", @@ -37,7 +37,7 @@ " time_distance_helper\n", ")\n", "from trade.helpers.helper import change_to_last_busday, retrieve_timeseries\n", - "from module_test.raw_code.optionlib_2.assets.dividend import Schedule\n", + "from trade.optionlib.assets.dividend import Schedule\n", "def get_spot(tick, date):\n", " return retrieve_timeseries(tick, date, date)['close'][0]" ] diff --git a/trade/optionlib/demos/black_scholes.ipynb b/trade/optionlib/demos/black_scholes.ipynb new file mode 100644 index 0000000..1490aa4 --- /dev/null +++ b/trade/optionlib/demos/black_scholes.ipynb @@ -0,0 +1,773 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Console Logging & File Logging Can be configured using STREAM_LOG_LEVEL and FILE_LOG_LEVEL in environment variables.\n", + "Propagate to root logger can be set using PROPAGATE_TO_ROOT_LOGGER in environment variables.\n", + "Example:\n", + "STREAM_LOG_LEVEL = 'DEBUG'\n", + "FILE_LOG_LEVEL = 'INFO'\n", + "PROPAGATE_TO_ROOT_LOGGER = 'False'\n", + "\n", + "2025-07-23 23:57:36 trade.helpers.Logging INFO: Logging Root Directory: /Users/chiemelienwanisobi/cloned_repos/QuantTools/logs\n", + "Using Proxy URL: http://54.144.4.219:5500/thetadata\n" + ] + } + ], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2\n", + "from trade.optionlib.pricing.black_scholes import (\n", + " BlackScholes,\n", + " MarketBlackScholes,\n", + " black_scholes_vectorized_market,\n", + ")\n", + "from datetime import datetime" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### TESTING" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Base Model" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Discrete Dividends Pricing" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'forward': 214.8645784470177, 'strike': 210, 'T': 0.4462696783025325, 'r': 0.045, 'vol': 0.2725, 'type': 'c', 'price': 17.60284866827155}\n", + "{'spot': 210.85, 'forward': 214.8645784470177, 'type': 'discrete', 'valuation': datetime.date(2025, 7, 9), 'expiry': datetime.date(2025, 12, 19)}\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bs_model = BlackScholes(\n", + " strike_price=210,\n", + " expiration=datetime(2025, 12, 19),\n", + " risk_free_rate=0.045,\n", + " volatility=0.2725,\n", + " start_date=datetime(2023, 1, 1),\n", + " spot_price=210.85,\n", + " dividend_type='discrete',\n", + " valuation_date=datetime(2025, 7, 9),\n", + " freq='quarterly',\n", + " div_amount=0.26,\n", + " option_type='c'\n", + ")\n", + "print(bs_model.summary())\n", + "print(bs_model.forward.summary())\n", + "bs_model.forward.dividend\n", + "bs_model" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'delta': array(0.58582531),\n", + " 'gamma': 0.009962580537501141,\n", + " 'rho': 0.47200904637776536,\n", + " 'theta': -0.05978444198260355,\n", + " 'vega': 0.5593264832634446,\n", + " 'volga': 0.00015478263709686236}" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bs_model.set_greek_calculation_style('analytic')\n", + "(bs_model.greeks())" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'delta': 0.5858253086494187,\n", + " 'gamma': 0.010164673913553489,\n", + " 'rho': 0.47235573244424556,\n", + " 'theta': -0.058873690712538014,\n", + " 'vega': 0.5482060477821096,\n", + " 'volga': 0.00015137831603029753}" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bs_model.finite_estimator.method='central'\n", + "bs_model.set_greek_calculation_style('numerical')\n", + "bs_model.greeks()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'forward': 214.09936459333818, 'strike': 210, 'T': 0.4462696783025325, 'r': 0.045, 'vol': 0.2757, 'type': 'p', 'price': 13.323998912169074}\n", + "{'spot': 210.1, 'forward': 214.09936459333818, 'type': 'discrete', 'valuation': datetime.date(2025, 7, 9), 'expiry': datetime.date(2025, 12, 19)}\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bs_model_put = BlackScholes(\n", + " strike_price=210,\n", + " expiration=datetime(2025, 12, 19),\n", + " risk_free_rate=0.045,\n", + " volatility=0.2757,\n", + " start_date=datetime(2023, 1, 1),\n", + " spot_price=210.10,\n", + " dividend_type='discrete',\n", + " valuation_date=datetime(2025, 7, 9),\n", + " freq='quarterly',\n", + " div_amount=0.26,\n", + " option_type='p'\n", + ")\n", + "print(bs_model_put.summary())\n", + "print(bs_model_put.forward.summary())\n", + "bs_model_put.forward.dividend\n", + "bs_model_put" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'delta': array(-0.42189165),\n", + " 'gamma': 0.009922637529837549,\n", + " 'rho': -0.4545474105116634,\n", + " 'theta': -0.05987609679442674,\n", + " 'vega': 0.5596184570322142,\n", + " 'volga': 5.1516364463452093e-05}" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bs_model_put.set_greek_calculation_style('analytic')\n", + "(bs_model_put.greeks())\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'delta': -0.4218916505427727,\n", + " 'gamma': 0.01012392946402011,\n", + " 'rho': -0.45479708198965024,\n", + " 'theta': -0.03382428316210273,\n", + " 'vega': 0.5484922166138241,\n", + " 'volga': 5.094636161262145e-05}" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bs_model_put.finite_estimator.method='central'\n", + "bs_model_put.set_greek_calculation_style('numerical')\n", + "(bs_model_put.greeks())\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Continuous Dividend Pricing" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'forward': 215.1223860977551, 'strike': 210, 'T': 0.4462696783025325, 'r': 0.045, 'vol': 0.2725, 'type': 'c', 'price': 17.75120036942414}\n", + "{'spot': 210.85, 'forward': 215.1223860977551, 'type': 'continuous', 'valuation': datetime.date(2025, 7, 9), 'expiry': datetime.date(2025, 12, 19)}\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bs_model = BlackScholes(\n", + " strike_price=210,\n", + " expiration=datetime(2025, 12, 19),\n", + " risk_free_rate=0.045,\n", + " volatility=0.2725,\n", + " start_date=datetime(2023, 1, 1),\n", + " spot_price=210.85,\n", + " dividend_type='continuous',\n", + " valuation_date=datetime(2025, 7, 9),\n", + " freq='quarterly',\n", + " div_amount=1.2331041024424947e-05 * 4,\n", + " option_type='c'\n", + ")\n", + "print(bs_model.summary())\n", + "print(bs_model.forward.summary())\n", + "bs_model.forward.dividend\n", + "bs_model" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'delta': array(0.58839035),\n", + " 'gamma': 0.0099362237603873,\n", + " 'rho': 0.4744211445871562,\n", + " 'theta': -0.059839309369576855,\n", + " 'vega': 0.5591862221356935,\n", + " 'volga': 0.00018964403099594948}" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bs_model.set_greek_calculation_style('analytic')\n", + "(bs_model.greeks())" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'delta': 0.5883773962922071,\n", + " 'gamma': 0.010137328763478634,\n", + " 'rho': 0.4744211442660647,\n", + " 'theta': -0.058893465673126144,\n", + " 'vega': 0.5480685753177087,\n", + " 'volga': 0.00018568244137597491}" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bs_model.finite_estimator.method='central'\n", + "bs_model.set_greek_calculation_style('numerical')\n", + "bs_model.greeks()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'forward': 214.35718908768482, 'strike': 210, 'T': 0.4462696783025325, 'r': 0.045, 'vol': 0.2757, 'type': 'p', 'price': 13.217710506842806}\n", + "{'spot': 210.1, 'forward': 214.35718908768482, 'type': 'continuous', 'valuation': datetime.date(2025, 7, 9), 'expiry': datetime.date(2025, 12, 19)}\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bs_model_put = BlackScholes(\n", + " strike_price=210,\n", + " expiration=datetime(2025, 12, 19),\n", + " risk_free_rate=0.045,\n", + " volatility=0.2757,\n", + " start_date=datetime(2023, 1, 1),\n", + " spot_price=210.10,\n", + " dividend_type='continuous',\n", + " valuation_date=datetime(2025, 7, 9),\n", + " freq='quarterly',\n", + " div_amount=1.2331041024424947e-05 * 4,\n", + " option_type='p'\n", + ")\n", + "print(bs_model_put.summary())\n", + "print(bs_model_put.forward.summary())\n", + "bs_model_put.forward.dividend\n", + "bs_model_put" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'delta': array(-0.41933655),\n", + " 'gamma': 0.009897738015178278,\n", + " 'rho': -0.45215321413234394,\n", + " 'theta': -0.059805006074437554,\n", + " 'vega': 0.5595594143299075,\n", + " 'volga': 8.02200697622426e-05}" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bs_model_put.set_greek_calculation_style('analytic')\n", + "(bs_model_put.greeks())\n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'delta': -0.41932732401218403,\n", + " 'gamma': 0.01009806883384709,\n", + " 'rho': -0.4521532142081557,\n", + " 'theta': -0.0339107594961634,\n", + " 'vega': 0.5484343477403055,\n", + " 'volga': 7.861631213984337e-05}" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bs_model_put.finite_estimator.method='central'\n", + "bs_model_put.set_greek_calculation_style('numerical')\n", + "(bs_model_put.greeks())\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Market Model" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Continuous Dividends" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[get_engine] Creating engine for DB: securities_master, PID: 29673\n", + "208.6199951171875\n", + "Forward Price: 211.94729151184956\n", + "BSM Price: 15.512748505148558\n" + ] + } + ], + "source": [ + "mbs=MarketBlackScholes(\n", + " ticker='AAPL',\n", + " strike_price=210,\n", + " expiration=datetime(2025, 12, 19),\n", + " risk_free_rate=None, # Use 0 to let the model use the dividend's risk-free rate\n", + " volatility=0.2678,\n", + " start_date=datetime(2023, 1, 3),\n", + " dividend_type='discrete',\n", + " valuation_date=datetime(2025, 7, 14),\n", + " option_type='c'\n", + ")\n", + "print(mbs.spot_price)\n", + "print(f\"Forward Price: {mbs.forward.get_forward_price()}\")\n", + "print(f\"BSM Price: {mbs.price()}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "numerical\n" + ] + }, + { + "data": { + "text/plain": [ + "{'delta': 0.5558560087961321,\n", + " 'gamma': 0.010777150478159912,\n", + " 'rho': 0.43387253917622887,\n", + " 'theta': -0.057459418105310966,\n", + " 'vega': 0.5406747178126954,\n", + " 'volga': -0.00010137965565221817}" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "print(mbs.get_greek_calculation_style())\n", + "mbs.set_greek_calculation_style('numerical')\n", + "mbs.greeks()" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'delta': array(0.55585601),\n", + " 'gamma': 0.010581650875179385,\n", + " 'rho': 0.4332824356194001,\n", + " 'theta': -0.058272410282780074,\n", + " 'vega': 0.5506638993040862,\n", + " 'volga': -0.00010301154988852094}" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mbs.set_greek_calculation_style('analytic')\n", + "mbs.greeks()" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "208.6199951171875\n", + "Forward Price: 211.94729151184956\n", + "BSM Price: 13.871105818430156\n", + "analytic\n", + "EquityForward\n", + "MarketDividendSchedule\n", + "Stock\n" + ] + } + ], + "source": [ + "mbs=MarketBlackScholes(\n", + " ticker='AAPL',\n", + " strike_price=210,\n", + " expiration=datetime(2025, 12, 19),\n", + " risk_free_rate=None, # Use 0 to let the model use the dividend's risk-free rate\n", + " volatility=0.2728,\n", + " start_date=datetime(2023, 1, 3),\n", + " dividend_type='discrete',\n", + " valuation_date=datetime(2025, 7, 14),\n", + " option_type='p'\n", + ")\n", + "print(mbs.spot_price)\n", + "print(f\"Forward Price: {mbs.forward.get_forward_price()}\")\n", + "print(f\"BSM Price: {mbs.price()}\")\n", + "print(mbs.get_greek_calculation_style())\n", + "print(mbs.forward.__class__.__name__)\n", + "print(mbs.forward.dividend.__class__.__name__)\n", + "print(mbs.forward.dividend.asset.__class__.__name__)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "numerical\n" + ] + }, + { + "data": { + "text/plain": [ + "{'delta': -0.4438738884063381,\n", + " 'gamma': 0.010578602492142673,\n", + " 'rho': -0.46005495212701575,\n", + " 'theta': -0.034335234296367645,\n", + " 'vega': 0.5406226604282662,\n", + " 'volga': -0.00010707812300522983}" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "mbs.set_greek_calculation_style('numerical')\n", + "print(mbs.get_greek_calculation_style())\n", + "mbs.greeks()" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "analytic\n" + ] + }, + { + "data": { + "text/plain": [ + "{'delta': array(-0.44387389),\n", + " 'gamma': 0.010386705510666578,\n", + " 'rho': -0.45958372978984224,\n", + " 'theta': -0.05984361197862239,\n", + " 'vega': 0.5506108802057498,\n", + " 'volga': -0.00010902696444173094}" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mbs.set_greek_calculation_style('analytic')\n", + "print(mbs.get_greek_calculation_style())\n", + "mbs.greeks()" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.0423199987411499" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mbs.forward.risk_free_rate" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Vectorized Pricing" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Vectorized Black-Scholes Market Model Example (Discrete Dividend): [ 15.09713366 20.78417622 371.79467198]\n" + ] + } + ], + "source": [ + "print(\"Vectorized Black-Scholes Market Model Example (Discrete Dividend):\",\n", + " black_scholes_vectorized_market(\n", + " ticks=['AAPL', 'MSFT', 'GOOGL'],\n", + " S=[150, 250, 2800],\n", + " K=[150, 250, 2800],\n", + " valuation_dates=[datetime(2023, 1, 1), datetime(2023, 1, 1), datetime(2023, 1, 1)],\n", + " end_dates=[datetime(2024, 1, 1), datetime(2024, 1, 1), datetime(2024, 1, 1)],\n", + " r=[0.05, 0.04, 0.03],\n", + " sigma=[0.2, 0.25, 0.3],\n", + " option_type=['c', 'p', 'c'],\n", + " div_type='continuous'\n", + "))" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Vectorized Black-Scholes Market Model Example (Continuous Dividend): [ 15.08353295 20.91310523 371.79467198]\n" + ] + } + ], + "source": [ + "print(\"Vectorized Black-Scholes Market Model Example (Continuous Dividend):\",\n", + " black_scholes_vectorized_market(\n", + " ticks=['AAPL', 'MSFT', 'GOOGL'],\n", + " S=[150, 250, 2800],\n", + " K=[150, 250, 2800],\n", + " valuation_dates=[datetime(2023, 1, 1), datetime(2023, 1, 1), datetime(2023, 1, 1)],\n", + " end_dates=[datetime(2024, 1, 1), datetime(2024, 1, 1), datetime(2024, 1, 1)],\n", + " r=[0.05, 0.04, 0.03],\n", + " sigma=[0.2, 0.25, 0.3],\n", + " option_type=['c', 'p', 'c'], # Mixed option types\n", + " div_type='discrete'\n", + "))" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "openbb_new_use", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.13" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} \ No newline at end of file diff --git a/trade/optionlib/demos/bsm_greeks.ipynb b/trade/optionlib/demos/bsm_greeks.ipynb new file mode 100644 index 0000000..7a01402 --- /dev/null +++ b/trade/optionlib/demos/bsm_greeks.ipynb @@ -0,0 +1,126 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Console Logging & File Logging Can be configured using STREAM_LOG_LEVEL and FILE_LOG_LEVEL in environment variables.\n", + "Propagate to root logger can be set using PROPAGATE_TO_ROOT_LOGGER in environment variables.\n", + "Example:\n", + "STREAM_LOG_LEVEL = 'DEBUG'\n", + "FILE_LOG_LEVEL = 'INFO'\n", + "PROPAGATE_TO_ROOT_LOGGER = 'False'\n", + "\n", + "2025-07-24 00:04:54 trade.helpers.Logging INFO: Logging Root Directory: /Users/chiemelienwanisobi/cloned_repos/QuantTools/logs\n", + "Using Proxy URL: http://54.144.4.219:5500/thetadata\n" + ] + } + ], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2\n", + "from trade.optionlib.greeks import vectorized_market_greeks_bsm\n", + "from datetime import datetime " + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'delta': array([ 0.53760409, -0.40550645, 0.59867324]),\n", + " 'gamma': array([0.01110992, 0.00627671, 0.00046049]),\n", + " 'rho': array([ 0.41721394, -1.21053483, 13.03597517]),\n", + " 'theta': array([-0.05964481, -0.01953839, -0.55193583]),\n", + " 'vega': array([ 0.54379121, 0.95789124, 10.8232329 ]),\n", + " 'volga': array([-1.47766544e-04, -9.82822712e-05, -4.50641993e-03])}" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "vectorized_market_greeks_bsm(\n", + " ticks=['AAPL', 'MSFT', 'GOOGL'],\n", + " S=[211.12, 250, 2800],\n", + " K=[215, 250, 2800],\n", + " valuation_dates=[datetime(2025, 7, 18), datetime(2023, 1, 1), datetime(2023, 1, 1)],\n", + " end_dates=[datetime(2025, 12, 19), datetime(2024, 1, 1), datetime(2024, 1, 1)],\n", + " r=[0.05, 0.04, 0.03],\n", + " sigma=[0.2611, 0.25, 0.3],\n", + " option_type=['c', 'p', 'c'], \n", + " div_type='discrete',\n", + " greek_style='numerical'\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'delta': array([ 0.53088881, -0.40550645, 0.59867324]),\n", + " 'gamma': array([0.01422207, 0.00603076, 0.00044689]),\n", + " 'rho': array([ 0.42526334, -1.21053483, 13.03597517]),\n", + " 'theta': array([-0.04992309, -0.04740847, -0.56547187]),\n", + " 'vega': array([ 0.5561839 , 0.99695623, 11.1526204 ]),\n", + " 'volga': array([-0.00011286, -0.00010294, -0.00464374])}" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "vectorized_market_greeks_bsm(\n", + " ticks=['AAPL', 'MSFT', 'GOOGL'],\n", + " S=[211.12, 250, 2800],\n", + " K=[215, 250, 2800],\n", + " valuation_dates=[datetime(2025, 7, 18), datetime(2023, 1, 1), datetime(2023, 1, 1)],\n", + " end_dates=[datetime(2025, 12, 19), datetime(2024, 1, 1), datetime(2024, 1, 1)],\n", + " r=[0.05, 0.04, 0.03],\n", + " sigma=[0.2, 0.25, 0.3],\n", + " option_type=['c', 'p', 'c'], \n", + " div_type='discrete',\n", + " greek_style='analytic'\n", + ")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "openbb_new_use", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.13" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} \ No newline at end of file diff --git a/trade/optionlib/demos/bsm_implied_vols.ipynb b/trade/optionlib/demos/bsm_implied_vols.ipynb new file mode 100644 index 0000000..2da24d3 --- /dev/null +++ b/trade/optionlib/demos/bsm_implied_vols.ipynb @@ -0,0 +1,2342 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The autoreload extension is already loaded. To reload it, use:\n", + " %reload_ext autoreload\n" + ] + } + ], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2\n", + "from trade.optionlib.vol.implied_vol import (\n", + " bsm_vol_est_brute_force,\n", + " bsm_vol_est_minimization,\n", + " vector_vol_estimation\n", + ")\n", + "from trade.optionlib.assets.forward import (\n", + " EquityForward, \n", + " time_distance_helper,\n", + " vectorized_market_forward_calc\n", + ")\n", + "from datetime import datetime\n", + "from dbase.DataAPI.ThetaData import retrieve_chain_bulk\n", + "from trade.helpers.helper import change_to_last_busday, retrieve_timeseries\n", + "import os\n", + "os.environ['PROXY_URL'] = ''\n", + "def get_spot(tick, date):\n", + " return retrieve_timeseries(tick, date, date)['close'][0]\n", + "test_start, test_valuation_date = '2025-07-16', '2025-07-16'" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "pd.options.plotting.backend = \"plotly\"" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(213.46615757988374, 0.0423199987411499)" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "mkt_forward = EquityForward(\n", + " start_date=test_start,\n", + " end_date=datetime(2025, 12, 19),\n", + " ticker='AAPL',\n", + " valuation_date=test_valuation_date,\n", + " risk_free_rate=None,\n", + " dividend_type='discrete',\n", + " dividend=None, # Market dividend will be set later\n", + "\n", + ")\n", + "mkt_forward.get_forward_price(), mkt_forward.risk_free_rate" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.2677398648854257" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rates = mkt_forward.risk_free_rate\n", + "bsm_vol_est_minimization(\n", + " F=mkt_forward.get_forward_price(), # Forward price\n", + " K=220, # Strike price\n", + " T=time_distance_helper('2025-12-19', test_valuation_date), # Time to maturity in years\n", + " r=mkt_forward.risk_free_rate, # Risk-free rate\n", + " market_price=11.85, # Market price of the option\n", + " option_type='c' # Option type: 'c' for call\n", + ")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.2677033175829395" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bsm_vol_est_brute_force(\n", + " F=mkt_forward.get_forward_price(), # Forward price\n", + " K=220, # Strike price\n", + " T=time_distance_helper('2025-12-19', test_start), # Time to maturity in years\n", + " r=mkt_forward.risk_free_rate, # Risk-free rate\n", + " market_price=11.85, # Market price of the option\n", + " option_type='c' # Option type: 'c' for call\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Test Vol Surface Fit" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "aapl_chain=retrieve_chain_bulk(\n", + " 'AAPL',\n", + " 0,\n", + " change_to_last_busday(test_valuation_date),\n", + " change_to_last_busday(test_valuation_date),\n", + " '16:00'\n", + "\n", + ")\n", + "S = get_spot('AAPL', (test_valuation_date))" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([211.06290119, 211.23415549, 211.06290119, ..., 210.72080899,\n", + " 217.71608065, 217.71608065])" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "aapl_chain = aapl_chain[aapl_chain['Expiration'] >= test_valuation_date]\n", + "valuation_dates = [test_valuation_date] * len(aapl_chain)\n", + "end_dates = aapl_chain['Expiration'].tolist()\n", + "r = [rates] * len(aapl_chain)\n", + "s = [S] * len(aapl_chain)\n", + "tickers = ['AAPL'] * len(aapl_chain)\n", + "F = vectorized_market_forward_calc(\n", + " ticks=tickers,\n", + " S=s,\n", + " valuation_dates=valuation_dates,\n", + " end_dates=end_dates,\n", + " r=r,\n", + " div_type='discrete'\n", + ")\n", + "F" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[0;31mSignature:\u001b[0m\n", + "\u001b[0mbsm_vol_est_brute_force\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mF\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mK\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mT\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mmarket_price\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0moption_type\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'c'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mDocstring:\u001b[0m\n", + "Brute force method to estimate implied volatility by minimizing the difference\n", + "between the market price and the Black-Scholes price.\n", + "Parameters:\n", + "- F: Forward price\n", + "- K: Strike price\n", + "- T: Time to maturity\n", + "- r: Risk-free rate\n", + "- market_price: Market price of the option\n", + "- option_type: 'c' for call, 'p' for put\n", + "Returns:\n", + "- Estimated volatility\n", + "\u001b[0;31mFile:\u001b[0m ~/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/vol/implied_vol.py\n", + "\u001b[0;31mType:\u001b[0m function" + ] + } + ], + "source": [ + "bsm_vol_est_brute_force?" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "params = list(zip(\n", + " F, \n", + " aapl_chain['Strike'], \n", + " [time_distance_helper(end_date, test_valuation_date) for end_date in aapl_chain['Expiration']], \n", + " r, \n", + " aapl_chain['Midpoint'], \n", + " aapl_chain['Right'].str.lower()\n", + "))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.0423199987411499" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "S\n", + "rates" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[0.29094924873121825,\n", + " 0.2747020925523138,\n", + " 0.27845143628590713,\n", + " 0.28082602065051626,\n", + " 0.27020288007200177,\n", + " 0.26982794569864244,\n", + " 0.26320410510262754,\n", + " 0.27107772694317356,\n", + " 0.2627041926048151,\n", + " 0.26620358008950223,\n", + " 0.2628291707292682,\n", + " 0.2707027925698142,\n", + " 0.2752020050501262,\n", + " 0.27570191754793866,\n", + " 0.2845753643841096,\n", + " 0.28157588939723494,\n", + " 0.23483407085177127,\n", + " 0.316444786119653,\n", + " 0.24070804270106752,\n", + " 0.31319535488387207,\n", + " 0.2683282082052051,\n", + " 0.27407720193004825,\n", + " 0.2687031425785644,\n", + " 0.27095274881872045,\n", + " 0.276076851921298,\n", + " 0.2870749268731718,\n", + " 0.2869499487487187,\n", + " 0.276076851921298,\n", + " 0.24345756143903596,\n", + " 0.2745771144278607,\n", + " 0.29657326433160824,\n", + " 0.22383599589989747,\n", + " 0.3115706392659816,\n", + " 0.32756783919597987,\n", + " 0.2961983299582489,\n", + " 0.3080712517812945,\n", + " 0.2969481987049676,\n", + " 0.31382024550613763,\n", + " 0.27095274881872045,\n", + " 0.2770766769169229,\n", + " 0.2793262831570789,\n", + " 0.2733273331833296,\n", + " 0.28857466436660917,\n", + " 0.2958233955848896,\n", + " 0.27570191754793866,\n", + " 0.26807825195629886,\n", + " 0.27007790194754866,\n", + " 0.25882987074676866,\n", + " 0.2896994674866871,\n", + " 0.2725774644366109,\n", + " 0.2685781644541113,\n", + " 0.25758008950223754,\n", + " 0.2638289957248931,\n", + " 0.25683022075551887,\n", + " 0.26720340508512713,\n", + " 0.27107772694317356,\n", + " 0.2618293457336433,\n", + " 0.28245073626840667,\n", + " 0.34493979849496237,\n", + " 0.5442799069976749,\n", + " 0.3116956173904347,\n", + " 0.2858251456286407,\n", + " 0.2504563364084102,\n", + " 0.3046968424210605,\n", + " 0.26332908322708065,\n", + " 0.26545371134278356,\n", + " 0.26445388634715866,\n", + " 0.2705778144453611,\n", + " 0.27195257381434534,\n", + " 0.26645353633840846,\n", + " 0.2650787769694242,\n", + " 0.29494854871371784,\n", + " 0.3778090452261306,\n", + " 0.2744521363034076,\n", + " 0.1136052901322533,\n", + " 0.2655786894672367,\n", + " 0.2935737893447336,\n", + " 0.30319710492762314,\n", + " 0.26145441136028397,\n", + " 0.3105708142703567,\n", + " 0.30857116427910697,\n", + " 0.2914491612290307,\n", + " 0.2750770269256731,\n", + " 0.27582689567239177,\n", + " 0.26645353633840846,\n", + " 0.28819972999324983,\n", + " 0.28320060501512534,\n", + " 0.26545371134278356,\n", + " 0.26982794569864244,\n", + " 0.2677033175829395,\n", + " 0.25308087702192555,\n", + " 0.2602046301157529,\n", + " 0.268203230080752,\n", + " 0.2667034925873147,\n", + " 0.2583299582489562,\n", + " 0.26645353633840846,\n", + " 0.2517061176529413,\n", + " 0.256955198879972,\n", + " 0.2812009550238756,\n", + " 0.26882812070301754,\n", + " 0.43117470436760913,\n", + " 0.5496539663491586,\n", + " 0.27295239880997024,\n", + " 0.33519150478761967,\n", + " 0.31219552988824717,\n", + " 0.32619307982699564,\n", + " 0.2608295207380184,\n", + " 0.2705778144453611,\n", + " 0.25857991449786244,\n", + " 0.26345406135153376,\n", + " 0.26932803320083,\n", + " 0.28520025500637514,\n", + " 0.37118520463011573,\n", + " 0.283950473761844,\n", + " 0.2849502987574689,\n", + " 0.27082777069426733,\n", + " 0.2629541488537213,\n", + " 0.29182409560239003,\n", + " 0.27482707067676687,\n", + " 0.25583039575989397,\n", + " 0.3190693267331683,\n", + " 0.6382634565864146,\n", + " 0.43129968249206224,\n", + " 0.29182409560239003,\n", + " 0.3136952673816845,\n", + " 0.3055716892922323,\n", + " 0.26645353633840846,\n", + " 0.277201655041376,\n", + " 0.27420218005450137,\n", + " 0.26657851446286157,\n", + " 0.2924489862246556,\n", + " 0.2505813145328633,\n", + " 0.27845143628590713,\n", + " 0.2717026175654391,\n", + " 0.2615793894847371,\n", + " 0.2859501237530938,\n", + " 0.26345406135153376,\n", + " 0.2484566864171604,\n", + " 0.27970121753043825,\n", + " 0.2572051551288782,\n", + " 0.26545371134278356,\n", + " 0.2744521363034076,\n", + " 0.2539557238930973,\n", + " 0.4236760169004225,\n", + " 0.26345406135153376,\n", + " 0.3045718642966074,\n", + " 0.47766656666416657,\n", + " 0.7016273656841421,\n", + " 0.3373161329033226,\n", + " 0.3179445236130903,\n", + " 0.27020288007200177,\n", + " 0.2579550238755969,\n", + " 0.2650787769694242,\n", + " 0.2542056801420035,\n", + " 0.2570801770044251,\n", + " 0.26932803320083,\n", + " 0.259204805120128,\n", + " 0.2667034925873147,\n", + " 0.29394872371809294,\n", + " 0.2723275081877047,\n", + " 0.7347465686642165,\n", + " 0.5231586039650991,\n", + " 0.32081902047551186,\n", + " 0.44017312932823316,\n", + " 0.324318407960199,\n", + " 0.3403156078901972,\n", + " 0.3221937798444961,\n", + " 0.29682322058051447,\n", + " 0.25970471761794045,\n", + " 0.2770766769169229,\n", + " 0.2745771144278607,\n", + " 0.3068214705367634,\n", + " 0.27095274881872045,\n", + " 0.27395222380559514,\n", + " 0.2607045426135653,\n", + " 0.28982444561114024,\n", + " 0.24933153328833219,\n", + " 0.2814509112727818,\n", + " 0.28345056126403156,\n", + " 0.2639539738493462,\n", + " 0.2523310082752069,\n", + " 0.24570716767919196,\n", + " 0.268203230080752,\n", + " 0.2619543238580964,\n", + " 0.2802011300282507,\n", + " 0.2495814895372384,\n", + " 0.8504763119077976,\n", + " 0.5679007725193129,\n", + " 0.2507062926573164,\n", + " 0.2542056801420035,\n", + " 0.26757833945848647,\n", + " 0.260329608240206,\n", + " 0.2847003425085627,\n", + " 0.264828820720518,\n", + " 0.2845753643841096,\n", + " 0.264828820720518,\n", + " 0.26420393009825244,\n", + " 0.35156363909097726,\n", + " 0.29207405185129626,\n", + " 0.5260331008275206,\n", + " 0.611768094202355,\n", + " 0.8514761369034225,\n", + " 0.30619657991449784,\n", + " 0.35931228280707017,\n", + " 0.336691242281057,\n", + " 0.27557693942348555,\n", + " 0.38168336708417705,\n", + " 0.25658026450661264,\n", + " 0.28320060501512534,\n", + " 0.3308172704317608,\n", + " 0.31694469861746544,\n", + " 0.27207755193879846,\n", + " 0.26370401760044,\n", + " 0.2717026175654391,\n", + " 0.2904493362334058,\n", + " 0.2504563364084102,\n", + " 0.26345406135153376,\n", + " 0.2494565114127853,\n", + " 0.28819972999324983,\n", + " 0.28819972999324983,\n", + " 0.24408245206130152,\n", + " 0.276076851921298,\n", + " 0.27407720193004825,\n", + " 0.24670699267481686,\n", + " 0.259204805120128,\n", + " 1.0414428860721516,\n", + " 0.6548855471386784,\n", + " 0.2809509987749694,\n", + " 0.24783179579489487,\n", + " 0.26532873321833045,\n", + " 0.2879497737443436,\n", + " 0.260329608240206,\n", + " 0.27420218005450137,\n", + " 0.6972531313282831,\n", + " 0.9224637115927897,\n", + " 0.25083127078176953,\n", + " 0.35131368284207104,\n", + " 0.2743271581789545,\n", + " 0.39993017325433133,\n", + " 0.25020638015950397,\n", + " 0.27307737693442335,\n", + " 0.2916991174779369,\n", + " 0.3706852921323033,\n", + " 0.2515811395284882,\n", + " 0.31969421735543385,\n", + " 0.26907807695192376,\n", + " 0.5905218130453261,\n", + " 0.3744346358658966,\n", + " 0.316444786119653,\n", + " 0.4253007325183129,\n", + " 0.2495814895372384,\n", + " 0.25370576764419106,\n", + " 0.2809509987749694,\n", + " 0.27682672066801667,\n", + " 0.24433240831020775,\n", + " 0.3543131578289457,\n", + " 0.27882637065926646,\n", + " 0.2793262831570789,\n", + " 0.25195607390184754,\n", + " 0.27407720193004825,\n", + " 0.3104458361459036,\n", + " 0.2450822770569264,\n", + " 0.2866999924998125,\n", + " 0.2439574739368484,\n", + " 0.259204805120128,\n", + " 0.28232575814395355,\n", + " 0.25645528638215953,\n", + " 0.28632505812645315,\n", + " 0.2600796519912998,\n", + " 0.28232575814395355,\n", + " 0.2605795644891122,\n", + " 0.29669824245606136,\n", + " 1.0725624390609763,\n", + " 0.7801136278406959,\n", + " 0.24820673016825417,\n", + " 0.46516875421885545,\n", + " 0.36856066401660037,\n", + " 0.27682672066801667,\n", + " 0.4118030950773769,\n", + " 0.3021972799319983,\n", + " 0.6526359408985224,\n", + " 0.40567916697917444,\n", + " 0.27582689567239177,\n", + " 0.36668599214980374,\n", + " 0.27957623940598514,\n", + " 0.25095624890622265,\n", + " 0.3335667891697292,\n", + " 0.43454911372784316,\n", + " 0.2472069051726293,\n", + " 0.2926989424735618,\n", + " 0.2879497737443436,\n", + " 0.29207405185129626,\n", + " 0.37918380459511486,\n", + " 0.24308262706567663,\n", + " 0.2562053301332533,\n", + " 0.33806600165004125,\n", + " 0.2428326708167704,\n", + " 0.2903243581089527,\n", + " 0.28182584564614116,\n", + " 0.2583299582489562,\n", + " 0.24533223330583262,\n", + " 0.2905743143578589,\n", + " 0.2539557238930973,\n", + " 0.2579550238755969,\n", + " 0.2979480237005925,\n", + " 0.2840754518862971,\n", + " 1.3595122128053199,\n", + " 0.8604745618640466,\n", + " 0.5502788569714242,\n", + " 0.38118345458636466,\n", + " 0.31207055176379406,\n", + " 0.4462970574264356,\n", + " 0.27657676441911044,\n", + " 0.24758183954598864,\n", + " 0.28207580189504733,\n", + " 0.4070539263481587,\n", + " 0.24570716767919196,\n", + " 0.28157588939723494,\n", + " 0.32644303607590186,\n", + " 0.2799511737793445,\n", + " 0.2472069051726293,\n", + " 0.25008140203505086,\n", + " 0.2427076926923173,\n", + " 0.3030721268031701,\n", + " 0.7126254406360158,\n", + " 0.404054451361284,\n", + " 0.24158288957223928,\n", + " 0.29307387684692116,\n", + " 0.3465645141128528,\n", + " 0.46691844796119897,\n", + " 0.2925739643491087,\n", + " 0.24870664266606662,\n", + " 0.2542056801420035,\n", + " 0.285075276881922,\n", + " 0.25570541763544086,\n", + " 0.39055681392034797,\n", + " 0.28982444561114024,\n", + " 0.2969481987049676,\n", + " 0.29294889872246804,\n", + " 0.2583299582489562,\n", + " 1.4717425685642138,\n", + " 0.9387108677716942,\n", + " 0.3644363859096477,\n", + " 0.5396557163929098,\n", + " 0.3976805670141753,\n", + " 0.2602046301157529,\n", + " 0.33606635165879145,\n", + " 0.24683197079926997,\n", + " 0.32831770794269854,\n", + " 0.4761668291707292,\n", + " 0.25220603015075377,\n", + " 0.2799511737793445,\n", + " 0.29194907372684314,\n", + " 0.4225512137803445,\n", + " 0.24445738643466086,\n", + " 0.296323308082702,\n", + " 0.24783179579489487,\n", + " 0.3354414610365259,\n", + " 0.24233275831895795,\n", + " 0.31494504862621564,\n", + " 0.754368134203355,\n", + " 0.44092299807495183,\n", + " 0.2417078676966924,\n", + " 0.4970381759543988,\n", + " 0.30857116427910697,\n", + " 0.3556879171979299,\n", + " 0.24670699267481686,\n", + " 0.29307387684692116,\n", + " 0.29657326433160824,\n", + " 0.41155313882847067,\n", + " 0.30732138303457585,\n", + " 0.2543306582664566,\n", + " 1.6052192054801369,\n", + " 1.0146975674391858,\n", + " 0.26657851446286157,\n", + " 0.38255821395534884,\n", + " 0.6395132378309457,\n", + " 0.4138027450686267,\n", + " 0.29219902997574937,\n", + " 0.25545546138653463,\n", + " 0.3489390984774619,\n", + " 0.24983144578614463,\n", + " 0.514035200880022,\n", + " 0.24970646766169152,\n", + " 0.337816045401135,\n", + " 0.28420043001075024,\n", + " 0.2991978049451236,\n", + " 0.42755033875846893,\n", + " 0.3384409360234006,\n", + " 0.24933153328833219,\n", + " 0.2437075176879422,\n", + " 0.34294014850371257,\n", + " 0.3056966674166854,\n", + " 0.24320760519012974,\n", + " 0.3250682767069176,\n", + " 0.24145791144778617,\n", + " 0.3011974549363734,\n", + " 0.24258271456786418,\n", + " 0.25095624890622265,\n", + " 0.3058216455411385,\n", + " 0.24645703642591063,\n", + " 0.25195607390184754,\n", + " 0.29294889872246804,\n", + " 0.29969771744293605,\n", + " 0.3036970174254356,\n", + " 0.7611169529238231,\n", + " 0.4767917197929948,\n", + " 0.25183109577739443,\n", + " 1.4762417810445259,\n", + " 1.0888095952398809,\n", + " 0.3756844171104277,\n", + " 0.4934138103452586,\n", + " 0.6822557563939098,\n", + " 0.43354928873221826,\n", + " 0.2955734393359834,\n", + " 0.24483232080802017,\n", + " 0.3730598764969124,\n", + " 0.4739172229305732,\n", + " 0.5662760569014225,\n", + " 0.31744461111527783,\n", + " 0.4891645541138528,\n", + " 0.2723275081877047,\n", + " 0.30844618615465386,\n", + " 0.41805200130003245,\n", + " 0.25358078951973795,\n", + " 0.3708102702567564,\n", + " 0.24895659891497285,\n", + " 0.29682322058051447,\n", + " 0.251331183279582,\n", + " 0.36943551088777216,\n", + " 0.3619368234205855,\n", + " 0.2438324958123953,\n", + " 0.2427076926923173,\n", + " 0.3158198954973874,\n", + " 0.34369001725043125,\n", + " 0.24158288957223928,\n", + " 0.8730973524338108,\n", + " 0.511785594639866,\n", + " 0.2504563364084102,\n", + " 0.31219552988824717,\n", + " 0.3069464486612165,\n", + " 1.7885621140528511,\n", + " 1.161046951173779,\n", + " 0.24358253956348908,\n", + " 0.4329243981099527,\n", + " 0.627515337883447,\n", + " 0.5614019100477512,\n", + " 0.44117295432385806,\n", + " 0.5306572914322858,\n", + " 0.32731788294707365,\n", + " 0.5841479286982174,\n", + " 0.3553129828245706,\n", + " 0.2770766769169229,\n", + " 0.4415478886972174,\n", + " 0.31844443611090273,\n", + " 0.25195607390184754,\n", + " 0.5181594789869747,\n", + " 0.2999476736918423,\n", + " 0.2573301332533313,\n", + " 0.4110532263306582,\n", + " 0.38005865146628665,\n", + " 0.3030721268031701,\n", + " 0.25345581139528484,\n", + " 0.24795677391934798,\n", + " 0.3629366484162104,\n", + " 0.24558218955473884,\n", + " 0.24145791144778617,\n", + " 0.36481132028300706,\n", + " 0.24820673016825417,\n", + " 0.31282042051051273,\n", + " 0.3346915922898072,\n", + " 0.31182059551488783,\n", + " 0.2405830645766144,\n", + " 0.24870664266606662,\n", + " 0.31694469861746544,\n", + " 0.24095799894997372,\n", + " 0.2517061176529413,\n", + " 0.3249432985824645,\n", + " 1.7921864796619913,\n", + " 1.231659591489787,\n", + " 0.24408245206130152,\n", + " 0.31482007050176253,\n", + " 0.4591698042451061,\n", + " 0.7321220280507013,\n", + " 0.5459046226155654,\n", + " 0.9437099927498187,\n", + " 0.6261405785144628,\n", + " 0.6501363784094601,\n", + " 0.3764342858571464,\n", + " 0.46329408235205877,\n", + " 0.32356853921348033,\n", + " 0.5251582539563489,\n", + " 0.24258271456786418,\n", + " 0.32831770794269854,\n", + " 0.3390658266456661,\n", + " 0.5385309132728318,\n", + " 0.2859501237530938,\n", + " 0.49966271656791417,\n", + " 0.41667724193104827,\n", + " 0.26107947698692463,\n", + " 0.41030335758393954,\n", + " 0.3046968424210605,\n", + " 0.25470559263981596,\n", + " 0.24545721143028573,\n", + " 0.40217977949448735,\n", + " 0.24670699267481686,\n", + " 0.3794337608440211,\n", + " 0.23895834895872395,\n", + " 0.2427076926923173,\n", + " 0.3526884422110553,\n", + " 0.9682057051426285,\n", + " 0.5791488037200929,\n", + " 0.31594487362184054,\n", + " 0.24820673016825417,\n", + " 0.48991442286057146,\n", + " 0.7091260531513287,\n", + " 1.8864199854996373,\n", + " 1.3005225380634513,\n", + " 0.3358163954098852,\n", + " 0.24158288957223928,\n", + " 0.7637414935373383,\n", + " 0.4846653416335408,\n", + " 0.5655261881547038,\n", + " 0.34743936098402456,\n", + " 0.4857901447536188,\n", + " 0.6480117502937572,\n", + " 0.2905743143578589,\n", + " 0.39705567639190975,\n", + " 0.2495814895372384,\n", + " 0.5394057601440035,\n", + " 0.31482007050176253,\n", + " 0.33519150478761967,\n", + " 0.43992317307932693,\n", + " 0.26532873321833045,\n", + " 0.33144216105402635,\n", + " 0.24445738643466086,\n", + " 0.2582049801245031,\n", + " 0.4300499012475312,\n", + " 0.2484566864171604,\n", + " 0.42030160754018847,\n", + " 0.3978055451386284,\n", + " 0.24358253956348908,\n", + " 0.24633205830145752,\n", + " 0.32856766419160477,\n", + " 0.36693594839870997,\n", + " 0.32744286107152676,\n", + " 0.2427076926923173,\n", + " 0.3596872171804295,\n", + " 0.24670699267481686,\n", + " 0.24070804270106752,\n", + " 0.24733188329708242,\n", + " 0.32169386734668365,\n", + " 2.0807609690242255,\n", + " 1.3680107252681315,\n", + " 0.24295764894122351,\n", + " 0.34256521413035323,\n", + " 0.509660966524163,\n", + " 0.8233560589014725,\n", + " 1.0375685642141053,\n", + " 0.6116431160779019,\n", + " 0.6921290282257055,\n", + " 0.703751993799845,\n", + " 0.41817697942448556,\n", + " 0.39455611390284756,\n", + " 0.3409404985124628,\n", + " 0.24145791144778617,\n", + " 0.5986453911347783,\n", + " 0.35618782969574236,\n", + " 0.5975205880147003,\n", + " 0.3566877421935548,\n", + " 0.5179095227380685,\n", + " 0.29682322058051447,\n", + " 0.4615443886097152,\n", + " 0.26932803320083,\n", + " 0.24358253956348908,\n", + " 0.26120445511137774,\n", + " 0.4361738293457336,\n", + " 0.3353164829120728,\n", + " 0.2505813145328633,\n", + " 0.4357988949723743,\n", + " 0.38768231705792644,\n", + " 0.24295764894122351,\n", + " 0.24495729893247328,\n", + " 0.4158023950598765,\n", + " 1.0773116077901945,\n", + " 0.6433875596889922,\n", + " 0.32719290482262053,\n", + " 0.24633205830145752,\n", + " 0.35243848596214905,\n", + " 0.24070804270106752,\n", + " 1.4338741968549211,\n", + " 2.20386442161054,\n", + " 0.4005550638765969,\n", + " 0.7376210655266381,\n", + " 0.8389783244581114,\n", + " 0.5047868196704918,\n", + " 0.6142676566914173,\n", + " 0.37480957023925593,\n", + " 0.5479042726068152,\n", + " 0.4024297357433936,\n", + " 0.3049467986699667,\n", + " 0.7224987124678116,\n", + " 0.328817620440511,\n", + " 0.34718940473511833,\n", + " 0.24733188329708242,\n", + " 0.6226411910297757,\n", + " 0.27420218005450137,\n", + " 0.49403870096752417,\n", + " 0.347939273481837,\n", + " 0.2437075176879422,\n", + " 0.2638289957248931,\n", + " 0.4671684042101052,\n", + " 0.25295589889747244,\n", + " 0.455670416760419,\n", + " 0.4346740918522963,\n", + " 0.24670699267481686,\n", + " 0.2452072551813795,\n", + " 0.35706267656691415,\n", + " 0.343440061001525,\n", + " 0.24645703642591063,\n", + " 0.40217977949448735,\n", + " 0.24483232080802017,\n", + " 0.33606635165879145,\n", + " 0.24145791144778617,\n", + " 1.4983629090727266,\n", + " 2.2639788994724865,\n", + " 0.3889320983024575,\n", + " 0.24195782394559862,\n", + " 0.527532838320958,\n", + " 0.8675983149578739,\n", + " 0.24583214580364507,\n", + " 0.4204265856646416,\n", + " 0.37593437335933394,\n", + " 0.745369709242731,\n", + " 0.6745071126778169,\n", + " 1.1447997949948747,\n", + " 0.6556354158853971,\n", + " 0.44554718867971693,\n", + " 0.4445473636840921,\n", + " 0.7197491937298431,\n", + " 0.37043533588339705,\n", + " 0.24083302082552063,\n", + " 0.6508862471561788,\n", + " 0.4359238730968274,\n", + " 0.31107072676816916,\n", + " 0.5632765819145478,\n", + " 0.48204080102002544,\n", + " 0.2667034925873147,\n", + " 0.2780765019125478,\n", + " 0.5067864696617415,\n", + " 0.47529198229955744,\n", + " 0.3630616265406635,\n", + " 0.2550805270131753,\n", + " 0.24320760519012974,\n", + " 0.24820673016825417,\n", + " 0.44192282307057673,\n", + " 0.24495729893247328,\n", + " 0.4168022200555014,\n", + " 0.34468984224605614,\n", + " 0.2439574739368484,\n", + " 0.7048767969199229,\n", + " 1.1161798044951121,\n", + " 1.5614768619215478,\n", + " 2.3525883897097426,\n", + " 0.7787388684717117,\n", + " 0.4644188854721368,\n", + " 0.8950935023375584,\n", + " 0.5499039225980649,\n", + " 0.4546705917647941,\n", + " 0.6628841471036775,\n", + " 0.31482007050176253,\n", + " 0.42292614815370383,\n", + " 0.5940212005300132,\n", + " 0.7638664716617914,\n", + " 0.24558218955473884,\n", + " 0.347939273481837,\n", + " 0.285075276881922,\n", + " 0.45067129178229454,\n", + " 0.6711327033175829,\n", + " 0.5224087352183804,\n", + " 0.24295764894122351,\n", + " 0.37480957023925593,\n", + " 0.4855401885047126,\n", + " 0.2695779894497362,\n", + " 0.24920655516387907,\n", + " 0.4515461386534663,\n", + " 0.3824332358308957,\n", + " 0.2428326708167704,\n", + " 0.24458236455911395,\n", + " 0.36843568589214726,\n", + " 0.35306337658441456,\n", + " 0.24670699267481686,\n", + " 0.24358253956348908,\n", + " 0.4417978449461236,\n", + " 1.623466011650291,\n", + " 2.4391982299557484,\n", + " 0.4234260606515163,\n", + " 0.24420743018575464,\n", + " 0.9618318207955198,\n", + " 0.5717750943773594,\n", + " 0.24445738643466086,\n", + " 0.408553663841596,\n", + " 0.8028596464911623,\n", + " 0.4396732168304207,\n", + " 0.7346215905397634,\n", + " 1.2287850946273655,\n", + " 0.3745596139903497,\n", + " 0.8659735993399834,\n", + " 0.68025610640266,\n", + " 0.48404045101127524,\n", + " 0.3985554138853471,\n", + " 0.24145791144778617,\n", + " 0.3936812670316758,\n", + " 0.7048767969199229,\n", + " 0.6147675691892297,\n", + " 0.3278177954448861,\n", + " 0.5141601790044751,\n", + " 0.28857466436660917,\n", + " 0.27282742068551713,\n", + " 0.5457796444911123,\n", + " 0.502787169679242,\n", + " 0.3886821420535513,\n", + " 0.25982969574239356,\n", + " 0.24295764894122351,\n", + " 0.4797911947798695,\n", + " 0.2517061176529413,\n", + " 0.3611869546738668,\n", + " 0.24295764894122351,\n", + " 2.557552513812845,\n", + " 1.68408040201005,\n", + " 0.7638664716617914,\n", + " 1.2635290132253305,\n", + " 0.7204990624765618,\n", + " 1.0111981799544987,\n", + " 0.6165172629315733,\n", + " 0.9018423210580264,\n", + " 0.721873821845546,\n", + " 0.4091785544638616,\n", + " 0.8198566714167853,\n", + " 0.4560453511337783,\n", + " 0.6335142878571964,\n", + " 0.33194207355183875,\n", + " 0.24470734268356706,\n", + " 0.6728823970599265,\n", + " 0.3884321858046451,\n", + " 0.3710602265056626,\n", + " 0.2923240081002025,\n", + " 0.5640264506612664,\n", + " 0.5404055851396284,\n", + " 0.2759518737968449,\n", + " 0.49928778219455483,\n", + " 0.2527059426485662,\n", + " 0.2438324958123953,\n", + " 0.4080537513437836,\n", + " 0.3940562014050351,\n", + " 0.2438324958123953,\n", + " 0.24995642391059775,\n", + " 0.3729348983724593,\n", + " 0.24220778019450484,\n", + " 0.4569201980049501,\n", + " 1.743569989249731,\n", + " 2.262604140103502,\n", + " 0.24683197079926997,\n", + " 0.4529208980224505,\n", + " 1.0065739893497336,\n", + " 0.7451197529938248,\n", + " 0.42979994499862495,\n", + " 0.24208280207005173,\n", + " 0.8318545713642841,\n", + " 0.4721675291882297,\n", + " 0.7924864621615539,\n", + " 1.3286426160654015,\n", + " 0.905966599164979,\n", + " 0.6385134128353208,\n", + " 0.40217977949448735,\n", + " 0.7439949498737468,\n", + " 0.4301748793719843,\n", + " 0.24258271456786418,\n", + " 0.8049842746068651,\n", + " 0.4244258856471411,\n", + " 0.2971981549538738,\n", + " 0.578148978724468,\n", + " 0.40767881697042424,\n", + " 0.2450822770569264,\n", + " 0.2789513487837196,\n", + " 0.5584024350608765,\n", + " 0.5360313507837695,\n", + " 0.26645353633840846,\n", + " 0.25358078951973795,\n", + " 0.514035200880022,\n", + " 0.38455786394659863,\n", + " 0.24133293332333305,\n", + " 0.8204815620390509,\n", + " 1.3400156253906346,\n", + " 2.7233984849621238,\n", + " 1.801934773369334,\n", + " 0.5114106602665066,\n", + " 0.9215888647216179,\n", + " 0.6348890472261806,\n", + " 1.0480667266681665,\n", + " 0.4392982824570614,\n", + " 0.8087336183404584,\n", + " 0.4880397509937748,\n", + " 0.8663485337133427,\n", + " 0.3508137703442586,\n", + " 0.6808809970249255,\n", + " 0.24783179579489487,\n", + " 0.39030685767144174,\n", + " 0.41555243881097026,\n", + " 0.30744636115902896,\n", + " 0.7568676966924173,\n", + " 0.5956459161479036,\n", + " 0.2804510862771569,\n", + " 0.566900947523688,\n", + " 0.24345756143903596,\n", + " 0.43254946373659336,\n", + " 0.24345756143903596,\n", + " 0.4188018700467511,\n", + " 0.24083302082552063,\n", + " 0.39580589514737863,\n", + " 1.859174754368859,\n", + " 2.7307721943048575,\n", + " 0.2533308332708318,\n", + " 0.4931638540963524,\n", + " 0.2494565114127853,\n", + " 0.48066604165104126,\n", + " 0.46391897297432433,\n", + " 0.9185893897347432,\n", + " 0.24308262706567663,\n", + " 0.4769166979174479,\n", + " 0.8479767494187354,\n", + " 1.404629315732893,\n", + " 0.528657641441036,\n", + " 0.9559578489462236,\n", + " 0.24458236455911395,\n", + " 0.46304412610315254,\n", + " 0.8131078526963174,\n", + " 0.4386733918347958,\n", + " 0.3104458361459036,\n", + " 0.6165172629315733,\n", + " 0.5915216380409509,\n", + " 0.2847003425085627,\n", + " 0.4329243981099527,\n", + " 0.5717750943773594,\n", + " 0.24458236455911395,\n", + " 0.26895309882747065,\n", + " 0.5446548413710343,\n", + " 0.25570541763544086,\n", + " 0.2427076926923173,\n", + " 0.4070539263481587,\n", + " 0.36743586089652236,\n", + " 0.7203740843521087,\n", + " 0.41330283257081424,\n", + " 0.2418328458211455,\n", + " 0.31594487362184054,\n", + " 0.6332643316082902,\n", + " 0.2880747518687967,\n", + " 0.6040194504862622,\n", + " 0.4557953948848721,\n", + " 0.24320760519012974,\n", + " 0.24408245206130152,\n", + " 0.4464220355508887,\n", + " 0.41792702317557934,\n", + " 0.24245773644341106,\n", + " 0.5284076851921298,\n", + " 1.9707802195054873,\n", + " 2.8848702217555435,\n", + " 0.2573301332533313,\n", + " 0.5109107477686942,\n", + " 0.2538307457686442,\n", + " 0.48853966349158723,\n", + " 0.25095624890622265,\n", + " 0.955332958323958,\n", + " 0.5056616665416636,\n", + " 0.4880397509937748,\n", + " 0.24758183954598864,\n", + " 0.6547605690142253,\n", + " 0.32069404235105875,\n", + " 0.2933238330958274,\n", + " 0.24633205830145752,\n", + " 0.6190168254206355,\n", + " 0.4570451761294032,\n", + " 0.5998951723793094,\n", + " 0.27570191754793866,\n", + " 0.5704003350083752,\n", + " 0.25970471761794045,\n", + " 0.42867514187854694,\n", + " 0.24158288957223928,\n", + " 0.3720600515012875,\n", + " 0.7513686592164803,\n", + " 0.2383334583364584,\n", + " 0.4361738293457336,\n", + " 0.6595097377434436,\n", + " 0.324318407960199,\n", + " 0.2946985924648116,\n", + " 0.6337642441061027,\n", + " 0.4735422885572139,\n", + " 0.2438324958123953,\n", + " 0.4690430760769019,\n", + " 0.24358253956348908,\n", + " 0.5549030475761894,\n", + " 0.24158288957223928,\n", + " 0.26120445511137774,\n", + " 0.4392982824570614,\n", + " 2.0783863846596162,\n", + " 3.0734622115552885,\n", + " 0.5381559788994724,\n", + " 0.2582049801245031,\n", + " 0.5157848946223655,\n", + " 0.2539557238930973,\n", + " 0.5335317882947074,\n", + " 1.0200716267906695,\n", + " 0.2503313582839571,\n", + " 0.5136602665066626,\n", + " 0.33319185479636987,\n", + " 0.6831306032650816,\n", + " 0.24808175204380106,\n", + " 0.48104097602440055,\n", + " 0.3024472361809045,\n", + " 0.655510437760944,\n", + " 0.2838254956373909,\n", + " 0.6300149003725093,\n", + " 0.6010199754993875,\n", + " 0.2685781644541113,\n", + " 0.44979644491112275,\n", + " 0.24345756143903596,\n", + " 0.7966107402685066,\n", + " 0.3598121953048826,\n", + " 0.24258271456786418,\n", + " 0.45767006675166877,\n", + " 0.33519150478761967,\n", + " 0.703751993799845,\n", + " 0.4981629790744768,\n", + " 0.24495729893247328,\n", + " 0.4902893572339308,\n", + " 0.24458236455911395,\n", + " 0.46004465111627785,\n", + " 0.2374586114652866,\n", + " 0.5817733443336083,\n", + " 3.2180619015475385,\n", + " 2.1823681842046048,\n", + " 0.264828820720518,\n", + " 0.2619543238580964,\n", + " 0.5656511662791569,\n", + " 0.5361563289082226,\n", + " 0.2573301332533313,\n", + " 1.060814495362384,\n", + " 0.5604020850521263,\n", + " 0.5374061101527537,\n", + " 0.25358078951973795,\n", + " 0.6607595189879747,\n", + " 0.2860751018775469,\n", + " 0.33519150478761967,\n", + " 0.7191243031075776,\n", + " 0.5049117977949449,\n", + " 0.25008140203505086,\n", + " 0.6372636315907897,\n", + " 0.26245423635590887,\n", + " 0.23770856771419283,\n", + " 0.4701678791969799,\n", + " 0.8422277556938923,\n", + " 0.3985554138853471,\n", + " 0.4789163479086977,\n", + " 0.2428326708167704,\n", + " 0.3433150828770719,\n", + " 0.7368711967799194,\n", + " 0.24645703642591063,\n", + " 0.5165347633690842,\n", + " 0.5115356383909597,\n", + " 0.24658201455036374,\n", + " 0.23783354583864594,\n", + " 0.48029110727768193,\n", + " 2.2831005525138126,\n", + " 3.315669816745418,\n", + " 0.2697029675741893,\n", + " 0.6065190129753243,\n", + " 0.2667034925873147,\n", + " 0.5968956973924348,\n", + " 1.0920590264756618,\n", + " 0.5863975349383734,\n", + " 0.270452836320908,\n", + " 0.5592772819320483,\n", + " 0.5609019975499387,\n", + " 0.25645528638215953,\n", + " 0.2954484612115303,\n", + " 0.6853802095052376,\n", + " 0.25295589889747244,\n", + " 0.53203205080127,\n", + " 0.2745771144278607,\n", + " 0.6506362909072726,\n", + " 0.24083302082552063,\n", + " 0.4901643791094777,\n", + " 0.8765967399184978,\n", + " 0.41705217630440755,\n", + " 0.4991628040701017,\n", + " 0.24145791144778617,\n", + " 0.5379060226505662,\n", + " 0.2483317082927073,\n", + " 0.7688655966399159,\n", + " 0.34756433910847767,\n", + " ...]" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "full_vol = vector_vol_estimation(bsm_vol_est_brute_force, params)\n", + "full_vol" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "hovertemplate": "Strike=%{x}
ImpliedVol=%{y}", + "legendgroup": "", + "line": { + "color": "#636efa", + "dash": "solid" + }, + "marker": { + "symbol": "circle" + }, + "mode": "lines", + "name": "", + "orientation": "v", + "showlegend": false, + "type": "scatter", + "x": [ + 15, + 20, + 25, + 30, + 35, + 40, + 45, + 50, + 60, + 70, + 80, + 85, + 90, + 95, + 100, + 105, + 110, + 115, + 120, + 125, + 130, + 135, + 140, + 145, + 150, + 155, + 160, + 165, + 170, + 175, + 180, + 185, + 190, + 195, + 200, + 210, + 220, + 230, + 240, + 250, + 260, + 270, + 280, + 290, + 300, + 310, + 320, + 330, + 340, + 350, + 360, + 370, + 380, + 390, + 400, + 410, + 420, + 430, + 440, + 450 + ], + "xaxis": "x", + "y": [ + 0.8147325683142078, + 0.747619315482887, + 0.7036270156753919, + 0.663509037725943, + 0.6272653816345408, + 0.5943961349033725, + 0.573524788119703, + 0.5474043601090027, + 0.5059116227905697, + 0.4746670916772919, + 0.4446723418085452, + 0.42967496687417184, + 0.41805200130003245, + 0.40667899197479934, + 0.3974306107652691, + 0.3881822295557389, + 0.3796837170929273, + 0.37156013900347507, + 0.3644363859096477, + 0.3566877421935548, + 0.35143866096652415, + 0.3454397109927748, + 0.3393157828945723, + 0.33419167979199477, + 0.32731788294707365, + 0.3230686267156679, + 0.31756958923973094, + 0.3144451361284032, + 0.3103208580214505, + 0.30757133928348207, + 0.3038219955498887, + 0.2990728268206705, + 0.29682322058051447, + 0.29407370184254605, + 0.29219902997574937, + 0.2870749268731718, + 0.28520025500637514, + 0.2847003425085627, + 0.2866999924998125, + 0.2925739643491087, + 0.3058216455411385, + 0.31282042051051273, + 0.32856766419160477, + 0.35706267656691415, + 0.3824332358308957, + 0.4080537513437836, + 0.43254946373659336, + 0.4557953948848721, + 0.4735422885572139, + 0.4981629790744768, + 0.5165347633690842, + 0.5379060226505662, + 0.5576525663141578, + 0.5780240006000149, + 0.5965207630190754, + 0.6161423285582139, + 0.6343891347283681, + 0.6527609190229755, + 0.670132878321958, + 0.6877547938698467 + ], + "yaxis": "y" + } + ], + "layout": { + "legend": { + "tracegroupgap": 0 + }, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "AAPL Call Options Implied Volatility" + }, + "xaxis": { + "anchor": "y", + "domain": [ + 0, + 1 + ], + "title": { + "text": "Strike" + } + }, + "yaxis": { + "anchor": "x", + "domain": [ + 0, + 1 + ], + "title": { + "text": "ImpliedVol" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "aapl_chain['ImpliedVol'] = full_vol\n", + "aapl_chain.Expiration.unique()\n", + "aapl_chain[(aapl_chain['Expiration'] == '2026-12-18') & (aapl_chain['Right'] == 'P')].sort_values('Strike').tail(60).plot(y = 'ImpliedVol', x='Strike', kind='line', title='AAPL Call Options Implied Volatility')" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Object `Scalar` not found.\n" + ] + } + ], + "source": [ + "Scalar?" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "openbb_new_use", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.13" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} \ No newline at end of file diff --git a/trade/optionlib/demos/dividends.ipynb b/trade/optionlib/demos/dividends.ipynb new file mode 100644 index 0000000..bd304a8 --- /dev/null +++ b/trade/optionlib/demos/dividends.ipynb @@ -0,0 +1,114 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Console Logging & File Logging Can be configured using STREAM_LOG_LEVEL and FILE_LOG_LEVEL in environment variables.\n", + "Propagate to root logger can be set using PROPAGATE_TO_ROOT_LOGGER in environment variables.\n", + "Example:\n", + "STREAM_LOG_LEVEL = 'DEBUG'\n", + "FILE_LOG_LEVEL = 'INFO'\n", + "PROPAGATE_TO_ROOT_LOGGER = 'False'\n", + "\n", + "2025-07-23 22:31:21 trade.helpers.Logging INFO: Logging Root Directory: /Users/chiemelienwanisobi/cloned_repos/QuantTools/logs\n", + "Using Proxy URL: http://54.144.4.219:5500/thetadata\n" + ] + } + ], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2\n", + "from trade.optionlib.assets.dividend import (\n", + " MarketContinuousDividends,\n", + " MarketDividendSchedule,\n", + ")\n", + "from datetime import datetime" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Yield Rate before 10% bump: 0.003061224489795918\n", + "Yield Rate after 10% bump: 0.0027829313543599257\n" + ] + } + ], + "source": [ + "a=MarketContinuousDividends(\n", + " ticker='AAPL',\n", + " start_date=datetime(2024, 1, 2),\n", + " end_date=datetime(2025, 1, 2),\n", + " valuation_date=datetime(2025, 1, 6),\n", + ")\n", + "a.asset.clear_bump()\n", + "print(f\"Yield Rate before 10% bump: {a.yield_rate}\")\n", + "a.spot_price *= 1.10\n", + "print(f\"Yield Rate after 10% bump: {a.yield_rate}\")\n", + "a.asset.clear_bump()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "916.5800170898438" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "aapl_div_schedule = MarketDividendSchedule(\n", + " ticker='COST',\n", + " start_date=datetime(2025, 1, 3),\n", + " end_date=datetime(2025, 8, 29),\n", + " valuation_date=datetime(2025, 1, 3),\n", + " lookback_years=1,\n", + " growth_method='cagr'\n", + ")\n", + "\n", + "aapl_div_schedule.spot_price\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "openbb_new_use", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.13" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} \ No newline at end of file diff --git a/trade/optionlib/demos/ssvi_import_test.ipynb b/trade/optionlib/demos/ssvi_import_test.ipynb new file mode 100644 index 0000000..6831242 --- /dev/null +++ b/trade/optionlib/demos/ssvi_import_test.ipynb @@ -0,0 +1,3331 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "33e5db0b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Console Logging & File Logging Can be configured using STREAM_LOG_LEVEL and FILE_LOG_LEVEL in environment variables.\n", + "Propagate to root logger can be set using PROPAGATE_TO_ROOT_LOGGER in environment variables.\n", + "Example:\n", + "STREAM_LOG_LEVEL = 'DEBUG'\n", + "FILE_LOG_LEVEL = 'INFO'\n", + "PROPAGATE_TO_ROOT_LOGGER = 'False'\n", + "\n", + "2025-10-20 09:24:23 trade.helpers.Logging INFO: Logging Root Directory: /Users/chiemelienwanisobi/cloned_repos/QuantTools/logs\n", + "Using Proxy URL: http://54.205.248.219:5500/thetadata\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2\n", + "from trade.optionlib.vol.ssvi.model.chain import (\n", + " _load_chain, get_global_config, \n", + " MarketChainLoader, \n", + " ChainOutput)\n", + "from trade.optionlib.vol.ssvi.model.model_utils import params_cache_key\n", + "from trade.optionlib.vol.ssvi.controller import get_params_cache\n", + "from trade.optionlib.vol.ssvi.model.ssvi_model import _SSVIModel, SSVIParentModel, EODMarketSSVIModel, SsviTimeseriesEOD\n", + "from trade.assets.Stock import Stock\n", + "import pandas as pd\n", + "pd.options.plotting.backend = \"plotly\"\n", + "get_global_config().vol_type = 'bs'\n", + "get_global_config().vol_type" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "id": "de51730d", + "metadata": {}, + "outputs": [], + "source": [ + "get_global_config().vol_side='put'" + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "id": "e73a6f5b", + "metadata": {}, + "outputs": [], + "source": [ + "chain = _load_chain(\"BAX\", \"2025-10-17\")" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "id": "b8b6c0ab", + "metadata": {}, + "outputs": [], + "source": [ + "bax = MarketChainLoader(symbol=\"BAX\", valuation_date=\"2025-10-17\")" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "id": "1c623f54", + "metadata": {}, + "outputs": [], + "source": [ + "model = _SSVIModel(\n", + " chain=chain,\n", + " valuation_date=\"2025-10-17\",\n", + " right=\"otm\"\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "id": "fdad9b7d", + "metadata": {}, + "outputs": [], + "source": [ + "p_model = SSVIParentModel(\n", + " chain=chain,\n", + " valuation_date=\"2025-10-17\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "id": "ba56cd90", + "metadata": {}, + "outputs": [], + "source": [ + "p_model.fit()" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "id": "e9aab020", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'put': SSVIModelParams{'var0_hat': 0.19692301458252587, 'var_inf_hat': 0.049655547797253466, 'kappa_hat': 0.27404767942036207, 'eta_hat': 1.1322279627012617, 'lambda_hat': -0.7467157525074255, 'rho_hat': -0.17098618803759325, 'atm_loss': 0.0044507332880411995, 'surface_loss': 0.014878475373416303}}" + ] + }, + "execution_count": 77, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "p_model._get_or_build(\"put\", fit=True)\n", + "p_model.params" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "id": "93aa59fa", + "metadata": {}, + "outputs": [], + "source": [ + "model.fit()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "id": "262f160c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 79, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bax.build_chain()" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "id": "77612793", + "metadata": {}, + "outputs": [], + "source": [ + "bax_model = EODMarketSSVIModel(\n", + " symbol=\"PG\",\n", + " valuation_date=\"2025-10-17\")" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "id": "2648d06e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
volfwd
strikeexp
0.91m0.360791151.960015
1y0.276032153.443111
3m0.279890151.802050
6m0.261036152.194883
1.01m0.186865151.960015
1y0.271322153.443111
3m0.208824151.802050
6m0.235384152.194883
1.11m0.379057151.960015
1y0.286704153.443111
3m0.299386151.802050
6m0.276963152.194883
\n", + "
" + ], + "text/plain": [ + " vol fwd\n", + "strike exp \n", + "0.9 1m 0.360791 151.960015\n", + " 1y 0.276032 153.443111\n", + " 3m 0.279890 151.802050\n", + " 6m 0.261036 152.194883\n", + "1.0 1m 0.186865 151.960015\n", + " 1y 0.271322 153.443111\n", + " 3m 0.208824 151.802050\n", + " 6m 0.235384 152.194883\n", + "1.1 1m 0.379057 151.960015\n", + " 1y 0.286704 153.443111\n", + " 3m 0.299386 151.802050\n", + " 6m 0.276963 152.194883" + ] + }, + "execution_count": 81, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bax_model.fit()\n", + "get_global_config().vol_side\n", + "bax_model.predict(k=[0.9, 1.0, 1.1], exp = ['1m','3m', '6m', '1y'], strike_type='p',)" + ] + }, + { + "cell_type": "code", + "execution_count": 127, + "id": "88f4a62d", + "metadata": {}, + "outputs": [], + "source": [ + "SsviTimeseriesEOD.clear_instances(clear_tree=True)\n", + "ts = SsviTimeseriesEOD(symbol=\"TSLA\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6fe76a31", + "metadata": {}, + "outputs": [], + "source": [ + "get_global_config().vol_side = 'call'\n", + "vols_09 = ts.predict(strike_type='p', start_date = '2025-05-01', exp = ['3m'], k = [0.8])\n", + "vols_1_3m = ts.predict(strike_type='p', start_date = '2025-05-01', exp = ['3m'], k = [1.])\n", + "vols_1_1y = ts.predict(strike_type='p', start_date = '2025-05-01', exp = ['1y'], k = [1.])\n", + "vols_09" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "664795c2", + "metadata": {}, + "outputs": [], + "source": [ + "pg = Stock(\"PG\")\n", + "rvol=pg.rvol(window=30, ts_start='2024-01-01')" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "0716ce7b", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "hovertemplate": "Datetime=%{x}
vol=%{y}", + "legendgroup": "", + "line": { + "color": "#636efa", + "dash": "solid" + }, + "marker": { + "symbol": "circle" + }, + "mode": "lines", + "name": "", + "orientation": "v", + "showlegend": false, + "type": "scatter", + "x": [ + "2025-05-01", + "2025-05-02", + "2025-05-05", + "2025-05-06", + "2025-05-07", + "2025-05-08", + "2025-05-09", + "2025-05-12", + "2025-05-13", + "2025-05-14", + "2025-05-15", + "2025-05-16", + "2025-05-19", + "2025-05-20", + "2025-05-21", + "2025-05-22", + "2025-05-23", + "2025-05-27", + "2025-05-28", + "2025-05-29", + "2025-05-30", + "2025-06-02", + "2025-06-03", + "2025-06-04", + "2025-06-05", + "2025-06-06", + "2025-06-09", + "2025-06-10", + "2025-06-11", + "2025-06-12", + "2025-06-13", + "2025-06-16", + "2025-06-17", + "2025-06-18", + "2025-06-20", + "2025-06-23", + "2025-06-24", + "2025-06-25", + "2025-06-26", + "2025-06-27", + "2025-06-30", + "2025-07-01", + "2025-07-02", + "2025-07-03", + "2025-07-07", + "2025-07-08", + "2025-07-09", + "2025-07-10", + "2025-07-11", + "2025-07-14", + "2025-07-15", + "2025-07-16", + "2025-07-17", + "2025-07-18", + "2025-07-21", + "2025-07-22", + "2025-07-23", + "2025-07-24", + "2025-07-25", + "2025-07-28", + "2025-07-29", + "2025-07-30", + "2025-07-31", + "2025-08-01", + "2025-08-04", + "2025-08-05", + "2025-08-06", + "2025-08-07", + "2025-08-08", + "2025-08-11", + "2025-08-12", + "2025-08-13", + "2025-08-14", + "2025-08-15", + "2025-08-18", + "2025-08-19", + "2025-08-20", + "2025-08-21", + "2025-08-22", + "2025-08-25", + "2025-08-26", + "2025-08-27", + "2025-08-28", + "2025-08-29", + "2025-09-02", + "2025-09-03", + "2025-09-04", + "2025-09-05", + "2025-09-08", + "2025-09-09", + "2025-09-10", + "2025-09-11", + "2025-09-12", + "2025-09-15", + "2025-09-16", + "2025-09-17", + "2025-09-18", + "2025-09-19", + "2025-09-22", + "2025-09-23", + "2025-09-24", + "2025-09-25", + "2025-09-26", + "2025-09-29", + "2025-09-30", + "2025-10-01", + "2025-10-02", + "2025-10-03", + "2025-10-06", + "2025-10-07", + "2025-10-08", + "2025-10-09", + "2025-10-10", + "2025-10-13", + "2025-10-14", + "2025-10-15", + "2025-10-16", + "2025-10-17" + ], + "xaxis": "x", + "y": { + "bdata": "mWBiq31m1T/Hyl6TTZ7VP82DRsD50dU/ArvICdE61T9VorujO2DUPxEg7Ssy5dU/iT9s0MI91T9v6rYIP+zUP7GUz9E7oNU/xovxfyEj1T82Cyljo53UP8fH6I1d3tM/at4aPbJo1D92ZFd4bdrVP5ytca/E4NQ/vv671Iew1T/ep+9uCBDVP5AWnOyhtdQ/5PWIQBka1D/KM4VtLiLWPw5iQ+kB2NM/K4XRunUA1T/ZdE/MOFvTPw0pqRR6YtM/1s0p6dfp1D8DrWllX33SP52D6yM5mtM/g2wfyIUz0z8f/aZZVYfTP5imz/1jQtQ/DFtM4enW1T9n786S+jDSP9IyFRE3W9U/t17aD6cu1D9aleijOFjUP1UuDeI1bNM/3hqZDLgE1D8W0r216WTVP8I+dPe1kNI/VCJoJVYG0z9WACD4GBnTP+tQ/0K8zdI/yzUxvUa/0z9c8cta+vbRP+e3G3Q7zdE/SAwvRmE90j+17O2KiebTP3W/7s7TDNA/DWbutXCB0D9F3WsaQjnSPwGlUNWVqtE/cQGT1tP50T9rGZaVeEfRP+UoGYznPdE/gmc6bYN51D+dH5R2BunRP0QNxJgbT88/pFTPXp6Pzz+vQSAIwEPRP1Vd6vFyYtE/prbqhnXq0z/oqGZUfRrRPzBKB+dupdE/7UAE98oK0T9KrtYPsF3RP0vW1OPbPdE/yzTQtaaE0j/R1AX6sIHRP5oK5LdB8M8/3sPCVdwb0T9Ax7a2wQTQP7j3lAQfcNE/PGFzA1ue0D8BrGqx8GHPP+wImmkWW9A/Zi/NLW+Pzz+klwWQlvfOP85QXhXDX8s/i/QF+5BB0D/aSnPXFn/QP9R/JCxOEdE/0D4uvMci0D9t9gQh+07QP509GPZILtA/PPEgZPk70T9llZgLhXrQP4OctfcG3dA/0k1ZJPfmzz96/2dtT0fRP8xt972+49E/H9w08XPf0D/1T8NVexjRP312U9tMwdE/JJTP25i10T930S0NmLDQP3BZ/jnKONE/nSmWureX0T9b9oDFj7XOP9rKUXzo/tA/tTnTJWkS0T8GBgPHFfHRP3QgQjWe+tE/BFhYZaAu0T8pQHSShCjQPyOw0aWmFdE/WzP4e8rX0T8L302GYavRP8OOwMRKm9E//4nIfl3q0T9hYDc+RbjRP0dEwzeEpNE/MjhdQ5tJ0D8L5WfRNj/RP750Hd95Q9A/9mdYDfyV0D9z3aeqxhrRP/62X9aQytE/7yIMJ99s0T8=", + "dtype": "f8" + }, + "yaxis": "y" + } + ], + "layout": { + "legend": { + "tracegroupgap": 0 + }, + "margin": { + "t": 60 + }, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermap": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermap" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "xaxis": { + "anchor": "y", + "domain": [ + 0, + 1 + ], + "title": { + "text": "Datetime" + } + }, + "yaxis": { + "anchor": "x", + "domain": [ + 0, + 1 + ], + "title": { + "text": "vol" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "vols_1_3m.reset_index().plot(y='vol', x='Datetime')" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "8f47c067", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "hovertemplate": "Datetime=%{x}
vol=%{y}", + "legendgroup": "", + "line": { + "color": "#636efa", + "dash": "solid" + }, + "marker": { + "symbol": "circle" + }, + "mode": "lines", + "name": "", + "orientation": "v", + "showlegend": false, + "type": "scatter", + "x": [ + "2025-05-01", + "2025-05-02", + "2025-05-05", + "2025-05-06", + "2025-05-07", + "2025-05-08", + "2025-05-09", + "2025-05-12", + "2025-05-13", + "2025-05-14", + "2025-05-15", + "2025-05-16", + "2025-05-19", + "2025-05-20", + "2025-05-21", + "2025-05-22", + "2025-05-23", + "2025-05-27", + "2025-05-28", + "2025-05-29", + "2025-05-30", + "2025-06-02", + "2025-06-03", + "2025-06-04", + "2025-06-05", + "2025-06-06", + "2025-06-09", + "2025-06-10", + "2025-06-11", + "2025-06-12", + "2025-06-13", + "2025-06-16", + "2025-06-17", + "2025-06-18", + "2025-06-20", + "2025-06-23", + "2025-06-24", + "2025-06-25", + "2025-06-26", + "2025-06-27", + "2025-06-30", + "2025-07-01", + "2025-07-02", + "2025-07-03", + "2025-07-07", + "2025-07-08", + "2025-07-09", + "2025-07-10", + "2025-07-11", + "2025-07-14", + "2025-07-15", + "2025-07-16", + "2025-07-17", + "2025-07-18", + "2025-07-21", + "2025-07-22", + "2025-07-23", + "2025-07-24", + "2025-07-25", + "2025-07-28", + "2025-07-29", + "2025-07-30", + "2025-07-31", + "2025-08-01", + "2025-08-04", + "2025-08-05", + "2025-08-06", + "2025-08-07", + "2025-08-08", + "2025-08-11", + "2025-08-12", + "2025-08-13", + "2025-08-14", + "2025-08-15", + "2025-08-18", + "2025-08-19", + "2025-08-20", + "2025-08-21", + "2025-08-22", + "2025-08-25", + "2025-08-26", + "2025-08-27", + "2025-08-28", + "2025-08-29", + "2025-09-02", + "2025-09-03", + "2025-09-04", + "2025-09-05", + "2025-09-08", + "2025-09-09", + "2025-09-10", + "2025-09-11", + "2025-09-12", + "2025-09-15", + "2025-09-16", + "2025-09-17", + "2025-09-18", + "2025-09-19", + "2025-09-22", + "2025-09-23", + "2025-09-24", + "2025-09-25", + "2025-09-26", + "2025-09-29", + "2025-09-30", + "2025-10-01", + "2025-10-02", + "2025-10-03", + "2025-10-06", + "2025-10-07", + "2025-10-08", + "2025-10-09", + "2025-10-10", + "2025-10-13", + "2025-10-14", + "2025-10-15", + "2025-10-16", + "2025-10-17" + ], + "xaxis": "x", + "y": { + "bdata": "zqi8bzx11D/eUmLsx4LUP6A0GMgXt9Q//hMxx9x01D+0oBmXFmrTPxqISb+p4dQ/EJXeSOJx1D/pVuPTserTP6G1rv49idQ/ZW2LPfVa1D//U0emH4bTP7KyV5u++NM/Y52yhB2d0j8NtpkP92zUP3PrPfhybdM/D3hmaPoi1T+NLpWd42HUP6G36ZgXFtQ/OcomAv060z9Nd1h2yW/VP/UzoH2VONM/npMTg7q01D/nIkVo8dfSPyBYlowj5NI/ysyZkGCh1D+rFAF45vPRPyxWdzm/EtM/8zGEtIDN0j+V+suh6jfTP209Z4RyYdQ/HQjLXFtC1j9tFIIJFajRP0I5b7WFWdU/uRkJmNZE1D8OFUn7QurUP/S35gUJh9I/Z9xewFAN1D95xjcLCOrUP4P7SrJOBtI/NJKnW2yT0j/xoG4oEtnSPyaafSRAk9I/esZV2ZLR0z/41kkQbUvRP3lYITLkd9E/+GtfIbIp0j+Jwq71HF3UP0s7y08E584/4i9AJ0UQ0D/uk8QYfFLSP6pQcrxtxtE/N0UJLX8r0j9zYG3lSRrRP68iQT6VQtE/wKE833KF1D9RJ14N78HQP1DC3aIPmMw/A3KjT2+yzD+1pOk28dnQP0USHL4ujNA/Lr5pczHl0z/vnEo5g2rQP5lc1v3KsdA/6UGjQphq0D/DvqxTcWHQP0zHs1o2edA/wLGqkfXZ0T8QUng3KaXQP1poStt1ZM0/HR7Msnln0D9x5HFITBvPP6oBHBO1ntE/kBSVeGjX0D85DjfU6gDPP+aeioCjZtA/rMQU17gVzz9Yc0UrIuTOPwdx7s0fvck/GSSAd/7B0D+ZLjJc1pjPPxlUyB57VNA/NGZoQ7oIzj9WZJZCcrfOPzgBekEWEc4/fGiovUpQ0D9A7cpEEszOP1YfO2n89c8/6Op8MDb8zT9qzqhtqZHQP16QYMjZftE/jaFMlQFA0D9GjCbfXUbQP037CaUMftE//NPH1Z7S0T/Z1FAyG47QP6K/R725mdE/Yv4JOBny0T9I3iiLXXDOP2hmGhvY1NA/f9elyCzZ0D8TgCITTbLRP4DKuddYtNE/YVg2kqTE0D+difkmzAHPPx6UbqVkvtA/HyBhecvc0T9lLX/M4ZbRP/4hzlK8k9E/RClfx7a70T/VpPuTQLDRP7gNXfsRqtE/KhOdZuugzz/BOKUrNYnRPx6cHuIPos8/YA4qHX120D9uWtubDnTRP7YevovWAtM/4tmREuCp0T8=", + "dtype": "f8" + }, + "yaxis": "y" + } + ], + "layout": { + "legend": { + "tracegroupgap": 0 + }, + "margin": { + "t": 60 + }, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermap": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermap" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "xaxis": { + "anchor": "y", + "domain": [ + 0, + 1 + ], + "title": { + "text": "Datetime" + } + }, + "yaxis": { + "anchor": "x", + "domain": [ + 0, + 1 + ], + "title": { + "text": "vol" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "vols_1_1y.reset_index().plot(y='vol', x='Datetime')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1dcb31f6", + "metadata": {}, + "outputs": [ + { + "ename": "AttributeError", + "evalue": "'DatetimeArray' object has no attribute 'sort'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[114], line 3\u001b[0m\n\u001b[1;32m 1\u001b[0m model_chain \u001b[38;5;241m=\u001b[39m ts\u001b[38;5;241m.\u001b[39mmodel_set[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m2025-05-15\u001b[39m\u001b[38;5;124m'\u001b[39m]\u001b[38;5;241m.\u001b[39m_get_or_build(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124motm\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m 2\u001b[0m chain_ \u001b[38;5;241m=\u001b[39m model_chain\u001b[38;5;241m.\u001b[39mdataframe_chain\u001b[38;5;241m.\u001b[39mcopy()\n\u001b[0;32m----> 3\u001b[0m \u001b[43mchain_\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mexpiration\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43munique\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msort\u001b[49m()\n", + "\u001b[0;31mAttributeError\u001b[0m: 'DatetimeArray' object has no attribute 'sort'" + ] + } + ], + "source": [ + "model_chain = ts.model_set['2025-05-15']._get_or_build('otm')\n", + "chain_ = model_chain.dataframe_chain.copy()\n", + "chain_.expiration.unique()" + ] + }, + { + "cell_type": "code", + "execution_count": 113, + "id": "f906dafd", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "hovertemplate": "f_log_moneyness=%{x}
vol=%{y}", + "legendgroup": "", + "line": { + "color": "#636efa", + "dash": "solid" + }, + "marker": { + "symbol": "circle" + }, + "mode": "lines", + "name": "", + "orientation": "v", + "showlegend": false, + "type": "scatter", + "x": { + "bdata": "IKqzSstq57/oukQSg9biv5UqlxveAdq/PZpUE6RD078ZEQtqKFTKv7Y0Hb6g7rO/YZIkr110Tb84+Ktl/726Px0ZpQ3MocU/YueLqRqN0D+i2Z/q4RjZPw==", + "dtype": "f8" + }, + "xaxis": "x", + "y": { + "bdata": "k5iZMwfc2T/Df03Qo0bXP52cSdYbq9Q/3fIoOxvU0z/9ETR8V9zSPyhTYnOfOtE/IdAyNQtlzj+8LJuN3G/RPzIWXmU9ftA/YEVtqm4y0T+8FNKqVVfQPw==", + "dtype": "f8" + }, + "yaxis": "y" + } + ], + "layout": { + "legend": { + "tracegroupgap": 0 + }, + "margin": { + "t": 60 + }, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermap": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermap" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "xaxis": { + "anchor": "y", + "domain": [ + 0, + 1 + ], + "title": { + "text": "f_log_moneyness" + } + }, + "yaxis": { + "anchor": "x", + "domain": [ + 0, + 1 + ], + "title": { + "text": "vol" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "chain_[chain_['expiration'] == '2027-01-15'].plot(x='f_log_moneyness', y='vol')" + ] + }, + { + "cell_type": "code", + "execution_count": 126, + "id": "33c4e6fc", + "metadata": {}, + "outputs": [], + "source": [ + "from algo.strategies.init_orders.core import CloseOrdersPipeline\n", + "from algo.positions.loaders.position_vars import get_position_data\n", + "from algo.strategies.configs import append_to_eod_task\n", + "from algo.positions.loaders.journal import build_trade_journal\n", + "from algo.positions.vars import get_orders_table\n", + "\n", + "op, cl = build_trade_journal(get_orders_table())" + ] + }, + { + "cell_type": "code", + "execution_count": 124, + "id": "9e4bb7f9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[0;31mSignature:\u001b[0m \u001b[0mappend_to_eod_task\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodule\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0menabled\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mbool\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mDocstring:\u001b[0m\n", + "Append a new task to the end of the EOD tasks list.\n", + "Args:\n", + " module (List[str]): List of module paths where the task functions are located.\n", + " name (List[str]): List of task function names.\n", + " enabled (List[bool]): List of booleans indicating whether each task is enabled or\n", + "\u001b[0;31mFile:\u001b[0m ~/cloned_repos/TFP-Algo/algo/strategies/configs/__init__.py\n", + "\u001b[0;31mType:\u001b[0m function" + ] + } + ], + "source": [ + "append_to_eod_task?" + ] + }, + { + "cell_type": "code", + "execution_count": 121, + "id": "b4c69204", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "TEST MODE: True - Loading trades for slug: long_bbands\n", + "WARNING: TEST MODE. USING INCORRECT INFORMATION IN load_position_actions function\n", + "2025-10-19 17:21:05 algo.strategies.init_orders CRITICAL: In TEST mode but active_positions/alpaca_pos not defined globally.\n", + "Processing slug: long_bbands\n" + ] + }, + { + "data": { + "text/plain": [ + "{'long_bbands': [{'result': 'SUCCESSFUL',\n", + " 'signal_id': 'AAPL20250808LONG',\n", + " 'map_signal_id': 'AAPL20250808LONG',\n", + " 'date': datetime.datetime(2025, 10, 21, 16, 0),\n", + " 'data': {'trade_id': '&L:AAPL20260417C265&S:AAPL20260417C270',\n", + " 'long': ['AAPL20260417C265'],\n", + " 'short': ['AAPL20260417C270'],\n", + " 'close': np.float64(2.0500000000000007),\n", + " 'quantity': 3}},\n", + " {'result': 'SUCCESSFUL',\n", + " 'signal_id': 'AMD20250701LONG',\n", + " 'map_signal_id': 'AMD20250701LONG',\n", + " 'date': datetime.datetime(2025, 10, 21, 16, 0),\n", + " 'data': {'trade_id': '&L:AMD20260417C195&S:AMD20260417C200',\n", + " 'long': ['AMD20260417C195'],\n", + " 'short': ['AMD20260417C200'],\n", + " 'close': np.float64(3.075000000000003),\n", + " 'quantity': 5}},\n", + " {'result': 'SUCCESSFUL',\n", + " 'signal_id': 'BA20250701LONG',\n", + " 'map_signal_id': 'BA20250701LONG',\n", + " 'date': datetime.datetime(2025, 10, 21, 16, 0),\n", + " 'data': {'trade_id': '&L:BA20260515C285&S:BA20260515C290',\n", + " 'long': ['BA20260515C285'],\n", + " 'short': ['BA20260515C290'],\n", + " 'close': np.float64(0.125),\n", + " 'quantity': 4}},\n", + " {'result': 'SUCCESSFUL',\n", + " 'signal_id': 'META20250701LONG',\n", + " 'map_signal_id': 'META20250701LONG',\n", + " 'date': datetime.datetime(2025, 10, 21, 16, 0),\n", + " 'data': {'trade_id': '&L:META20260417C990&S:META20260417C1000',\n", + " 'long': ['META20260417C990'],\n", + " 'short': ['META20260417C1000'],\n", + " 'close': np.float64(0.75),\n", + " 'quantity': 2}},\n", + " {'result': 'SUCCESSFUL',\n", + " 'signal_id': 'NFLX20250701LONG',\n", + " 'map_signal_id': 'NFLX20250701LONG',\n", + " 'date': datetime.datetime(2025, 10, 21, 16, 0),\n", + " 'data': {'trade_id': '&L:NFLX20260618C1650&S:NFLX20260618C1660',\n", + " 'long': ['NFLX20260618C1650'],\n", + " 'short': ['NFLX20260618C1660'],\n", + " 'close': np.float64(1.25),\n", + " 'quantity': 2}},\n", + " {'result': 'SUCCESSFUL',\n", + " 'signal_id': 'NVDA20250701LONG',\n", + " 'map_signal_id': 'NVDA20250701LONG',\n", + " 'date': datetime.datetime(2025, 10, 21, 16, 0),\n", + " 'data': {'trade_id': '&L:NVDA20260618C235&S:NVDA20260618C240',\n", + " 'long': ['NVDA20260618C235'],\n", + " 'short': ['NVDA20260618C240'],\n", + " 'close': np.float64(1.0249999999999986),\n", + " 'quantity': 6}},\n", + " {'result': 'SUCCESSFUL',\n", + " 'signal_id': 'TSLA20250915LONG',\n", + " 'map_signal_id': 'TSLA20250915LONG',\n", + " 'date': datetime.datetime(2025, 10, 21, 16, 0),\n", + " 'data': {'trade_id': '&L:TSLA20260417C445&S:TSLA20260417C450',\n", + " 'long': ['TSLA20260417C445'],\n", + " 'short': ['TSLA20260417C450'],\n", + " 'close': np.float64(2.049999999999997),\n", + " 'quantity': 5}}]}" + ] + }, + "execution_count": 121, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "CloseOrdersPipeline.TEST=True\n", + "CloseOrdersPipeline.run()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "openbb_new_use", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/trade/optionlib/greeks/__init__.py b/trade/optionlib/greeks/__init__.py index 09b9446..b6ff693 100644 --- a/trade/optionlib/greeks/__init__.py +++ b/trade/optionlib/greeks/__init__.py @@ -40,7 +40,7 @@ def vectorized_market_greeks_bsm( raise ValueError("option_type must be a single string or a list of strings with the same length as ticks.") # Convert valuation_dates and end_dates to Timedelta - T = [time_distance_helper(end_dates[i], valuation_dates[i]) for i in range(len(end_dates))] + T = [time_distance_helper(end=end_dates[i], start=valuation_dates[i]) for i in range(len(end_dates))] # Calculate the Greeks using the specified style if greek_style == 'analytic': diff --git a/trade/optionlib/greeks/analytical/black_scholes.py b/trade/optionlib/greeks/analytical/black_scholes.py index 5e97b92..966027a 100644 --- a/trade/optionlib/greeks/analytical/black_scholes.py +++ b/trade/optionlib/greeks/analytical/black_scholes.py @@ -36,7 +36,7 @@ def _ptched_bsm_for_analytical( r=r, div_type=div_type ) - T = [time_distance_helper(end_dates[i], valuation_dates[i]) for i in range(len(end_dates))] + T = [time_distance_helper(end=end_dates[i], start=valuation_dates[i]) for i in range(len(end_dates))] greeks = black_scholes_analytic_greeks_vectorized( F=F, K=K, diff --git a/trade/optionlib/greeks/numerical/binomial.py b/trade/optionlib/greeks/numerical/binomial.py index 5c58098..9f98b80 100644 --- a/trade/optionlib/greeks/numerical/binomial.py +++ b/trade/optionlib/greeks/numerical/binomial.py @@ -1,5 +1,6 @@ +from typing import Iterable, List +from trade.optionlib.assets.dividend import Schedule import numpy as np -from typing import Union, List from ...utils.format import convert_to_array, assert_equal_length,equalize_lengths from ...pricing.binomial import VectorBinomialCRR from trade.helpers.Logging import setup_logger @@ -13,7 +14,7 @@ def binomial_tree_price_batch( N: float|np.ndarray, S: float|np.ndarray, dividend_type: float|np.ndarray, - div_amount: float|np.ndarray, + div_amount: List[Schedule] | Iterable[float] | np.ndarray, option_type: float|np.ndarray, start_date: float|np.ndarray, valuation_date: float|np.ndarray, @@ -75,16 +76,6 @@ def binomial_tree_price_batch( ) ] price = np.array([model.price() for model in models]) - # price = [] - # for i, model in enumerate(models): - # try: - # print(f"Model {i}: K={model.K}, S={model.S0}, N={model.N}, T={model.T}, option_type={model.option_type}") - # price.append(model.price()) - # except Exception as e: - # print(f"Error in model {i}: {e}") - # print(model.stock_tree) - # print(model, ) - # raise price = np.array(price) return price, models @@ -97,7 +88,7 @@ def binomial_tree_greeks( N: float|np.ndarray, S: float|np.ndarray, dividend_type: float|np.ndarray, - div_amount: float|np.ndarray, + div_amount: List[Schedule] | Iterable[float] | np.ndarray, option_type: float|np.ndarray, start_date: float|np.ndarray, valuation_date: float|np.ndarray, @@ -114,6 +105,8 @@ def binomial_tree_greeks( - N: Number of time steps in the binomial tree - spot_price: Current price of the underlying asset (optional) - dividend_type: Type of dividend ('discrete' or 'continuous') + - Discrete dividends: (time_frac, amount) schedule + - Continuous dividends: continuous yield rate - div_amount: Amount of dividend (if applicable) - option_type: 'c' for call, 'p' for put - start_date: Start date for the option pricing (optional) diff --git a/trade/optionlib/greeks/numerical/black_scholes.py b/trade/optionlib/greeks/numerical/black_scholes.py index f49b9e0..c92dd8a 100644 --- a/trade/optionlib/greeks/numerical/black_scholes.py +++ b/trade/optionlib/greeks/numerical/black_scholes.py @@ -1,10 +1,7 @@ from datetime import datetime import numpy as np from typing import List, Union -from scipy.stats import norm -from ...config.defaults import DAILY_BASIS from ...core.black_scholes_math import ( - black_scholes_analytic_greeks_vectorized, black_scholes_vectorized_base ) from ...assets.forward import ( @@ -118,7 +115,7 @@ def vectorized_black_scholes_greeks( r: List[float], sigma: List[float], option_type: str|List[str] = "c", - div_type='discrete', + dividend_type='discrete', div_amount=None) -> dict: """ Vectorized Black-Scholes Greeks calculation. @@ -130,29 +127,31 @@ def vectorized_black_scholes_greeks( r: Risk-free rates (annualized, array) sigma: Volatilities (annualized, array) option_type: "c" for call, "p" for put (single string or list of strings) - div_type: Type of dividend ('discrete' or 'continuous') + dividend_type: Type of dividend ('discrete' or 'continuous') div_amount: Dividend amount (single float or list of floats, ignored for continuous dividends) - if discrete expecting present value of discrete dividends, else if continuous expecting continuous yield rate. + if discrete expecting present value of discrete dividends, else if continuous expecting discounted continuous yield rate. Returns: Greeks (dictionary) """ - T = [time_distance_helper(end_dates[i], valuation_dates[i]) for i in range(len(end_dates))] + T = time_distance_helper(start=valuation_dates, end=end_dates) finite_estimator = FiniteGreeksEstimator( price_func=_ptched_bsm_for_numerical, base_params={ - 'F': np.asarray(F), - 'K': np.asarray(K), - 'T': np.asarray(T), - 'r': np.asarray(r), - 'sigma': np.asarray(sigma), - 'q': 0.0, # Assuming no continuous dividend yield for simplicity - 'S': np.asarray(S), # Including spot price for delta calculation - 'option_type': option_type, - 'div_type': div_type, - 'div_amount': div_amount # Placeholder, will be ignored in the patched function + "F": np.asarray(F), + "K": np.asarray(K), + "T": np.asarray(T), + "r": np.asarray(r), + "sigma": np.asarray(sigma), + # Assuming no continuous dividend yield for simplicity + # We pass continuous yield in div_amount if div_type is 'continuous' + "q": 0.0, + "S": np.asarray(S), # Including spot price for delta calculation + "option_type": option_type, + "dividend_type": dividend_type, + "div_amount": div_amount, # Placeholder, will be ignored in the patched function }, dx_thresh=0.00001, - method='central' # Use backward method for finite differences + method="central", # Use backward method for finite differences ) greeks = finite_estimator.all_first_order() greeks.update(finite_estimator.all_second_order()) diff --git a/trade/optionlib/notebooks/american_iv.ipynb b/trade/optionlib/notebooks/american_iv.ipynb deleted file mode 100644 index 833520e..0000000 --- a/trade/optionlib/notebooks/american_iv.ipynb +++ /dev/null @@ -1,3262 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Console Logging & File Logging Can be configured using STREAM_LOG_LEVEL and FILE_LOG_LEVEL in environment variables.\n", - "Propagate to root logger can be set using PROPAGATE_TO_ROOT_LOGGER in environment variables.\n", - "Example:\n", - "STREAM_LOG_LEVEL = 'DEBUG'\n", - "FILE_LOG_LEVEL = 'INFO'\n", - "PROPAGATE_TO_ROOT_LOGGER = 'False'\n", - "\n", - "2025-07-24 23:43:20 trade.helpers.Logging INFO: Logging Root Directory: /Users/chiemelienwanisobi/cloned_repos/QuantTools/logs\n", - "Using Proxy URL: http://54.144.4.219:5500/thetadata\n" - ] - } - ], - "source": [ - "%load_ext autoreload\n", - "%autoreload 2\n", - "from module_test.raw_code.optionlib_2.vol.implied_vol import (\n", - " estimate_crr_implied_volatility,\n", - " vol_est_brute_force_bjs_2002,\n", - " vector_vol_estimation\n", - ")\n", - "from module_test.raw_code.optionlib_2.assets.forward import (\n", - " EquityForward, \n", - " time_distance_helper,\n", - " get_vectorized_dividend_rate,\n", - " get_vectorized_dividend_scehdule\n", - ")\n", - "\n", - "from module_test.raw_code.optionlib_2.assets.dividend import (\n", - " vector_convert_to_time_frac\n", - ")\n", - "\n", - "from module_test.raw_code.optionlib_2.greeks.numerical.bjs2002 import (\n", - " bjs2002_numerical_greeks,\n", - ")\n", - "\n", - "from module_test.raw_code.optionlib_2.greeks.numerical.binomial import (\n", - " binomial_tree_greeks,\n", - ")\n", - "from datetime import datetime\n", - "from dbase.DataAPI.ThetaData import retrieve_chain_bulk\n", - "from trade.helpers.helper import change_to_last_busday, retrieve_timeseries\n", - "import os\n", - "os.environ['PROXY_URL'] = ''\n", - "def get_spot(tick, date):\n", - " return retrieve_timeseries(tick, date, date)['close'][0]\n", - "test_start, test_valuation_date = '2025-07-16', '2025-07-16'" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\n", - "pd.options.plotting.backend = \"plotly\"" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [], - "source": [ - "aapl_chain=retrieve_chain_bulk(\n", - " 'AAPL',\n", - " 0,\n", - " change_to_last_busday(test_valuation_date),\n", - " change_to_last_busday(test_valuation_date),\n", - " '16:00'\n", - "\n", - ")\n", - "rates = 0.0423199987411499\n", - "S = get_spot('AAPL', (test_valuation_date))\n", - "valuation_dates = [test_valuation_date] * len(aapl_chain)\n", - "end_dates = aapl_chain['Expiration'].tolist()\n", - "r = [rates] * len(aapl_chain)\n", - "s = [S] * len(aapl_chain)\n", - "tickers = ['AAPL'] * len(aapl_chain)\n", - "T = [time_distance_helper(end_dates[i], valuation_dates[i]) for i in range(len(aapl_chain))]\n", - "\n", - "\n", - "q = get_vectorized_dividend_rate(\n", - " tickers=tickers,\n", - " spots=s,\n", - " valuation_dates=valuation_dates,\n", - ")\n", - "\n", - "\n", - "discrete_q = get_vectorized_dividend_scehdule(\n", - " tickers=['AAPL'] * len(aapl_chain),\n", - " valuation_dates=[test_valuation_date] * len(aapl_chain),\n", - " end_dates=aapl_chain['Expiration'].tolist(),\n", - " start_dates=[test_valuation_date] * len(aapl_chain),\n", - ")\n", - "\n", - "discrete_q_convert = vector_convert_to_time_frac(\n", - " discrete_q, \n", - " valuation_dates=[test_valuation_date] * len(aapl_chain), \n", - " end_dates=aapl_chain['Expiration'].tolist(), \n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([, ,\n", - " , ], dtype=object)" - ] - }, - "execution_count": 50, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import numpy as np\n", - "np.array(discrete_q_convert)[:4]" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "vector_params = list(zip(\n", - " s, aapl_chain['Strike'].tolist(),\n", - " T, r, aapl_chain['Midpoint'], \n", - " q, aapl_chain['Right'].str.lower().tolist(),))" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[0.13222703067576688,\n", - " 0.27657676441911044,\n", - " 0.2802011300282507,\n", - " 0.14197532438310956,\n", - " 0.17022038050951271,\n", - " 0.2707027925698142,\n", - " 0.2655786894672367,\n", - " 0.22921005525138127,\n", - " 0.2627041926048151,\n", - " 0.26782829570739264,\n", - " 0.19671574289357233,\n", - " 0.24333258331458285,\n", - " 0.2763268081702042,\n", - " 0.058489937248431205,\n", - " 0.39018187954698863,\n", - " 0.28182584564614116,\n", - " 0.026995449886247157,\n", - " 0.3173196329908248,\n", - " 0.24133293332333305,\n", - " 0.02062156553913848,\n", - " 0.268203230080752,\n", - " 0.2725774644366109,\n", - " 0.2550805270131753,\n", - " 0.271577639440986,\n", - " 0.2769516987924698,\n", - " 0.40392947323683087,\n", - " 0.40767881697042424,\n", - " 0.27570191754793866,\n", - " 0.2439574739368484,\n", - " 0.2752020050501262,\n", - " 0.4956634165854146,\n", - " 0.03661876546913673,\n", - " 0.3116956173904347,\n", - " 0.07848643716092901,\n", - " 0.2971981549538738,\n", - " 0.0153724843121078,\n", - " 0.0153724843121078,\n", - " 0.3145701142528563,\n", - " 0.27207755193879846,\n", - " 0.30757133928348207,\n", - " 0.28057606440161004,\n", - " 0.2747020925523138,\n", - " 0.018496937423435587,\n", - " 0.01637230930773269,\n", - " 0.015497462436560912,\n", - " 0.0153724843121078,\n", - " 0.271577639440986,\n", - " 0.2609544988624715,\n", - " 0.42667549188729714,\n", - " 0.2733273331833296,\n", - " 0.12272869321733043,\n", - " 0.0153724843121078,\n", - " 0.2645788644716118,\n", - " 0.25670524263106576,\n", - " 0.14809925248131203,\n", - " 0.27207755193879846,\n", - " 0.26332908322708065,\n", - " 0.33181709542738563,\n", - " 0.3450647766194155,\n", - " 0.09760809020225505,\n", - " 0.3124454861371534,\n", - " 0.0462420810520263,\n", - " 0.25083127078176953,\n", - " 0.034619115477886944,\n", - " 0.26320410510262754,\n", - " 0.16897059926498162,\n", - " 0.2650787769694242,\n", - " 0.19371626790669766,\n", - " 0.20796377409435235,\n", - " 0.267078426960674,\n", - " 0.26632855821395535,\n", - " 0.45067129178229454,\n", - " 0.37793402335058374,\n", - " 0.23345931148278706,\n", - " 0.11722965574139353,\n", - " 0.265953623840596,\n", - " 0.03936828420710518,\n", - " 0.054365659141478534,\n", - " 0.2618293457336433,\n", - " 0.3113206830170754,\n", - " 0.032494487362184056,\n", - " 0.2923240081002025,\n", - " 0.276076851921298,\n", - " 0.24570716767919196,\n", - " 0.26745336133403336,\n", - " 0.02824523113077827,\n", - " 0.025120778019450486,\n", - " 0.2668284707117678,\n", - " 0.27095274881872045,\n", - " 0.023371084277106928,\n", - " 0.25483057076426907,\n", - " 0.2609544988624715,\n", - " 0.019246806170154254,\n", - " 0.015497462436560912,\n", - " 0.015747418685467137,\n", - " 0.015497462436560912,\n", - " 0.2515811395284882,\n", - " 0.2583299582489562,\n", - " 0.27657676441911044,\n", - " 0.2697029675741893,\n", - " 0.43142466061651535,\n", - " 0.1347265931648291,\n", - " 0.27320235505887647,\n", - " 0.06298914972874321,\n", - " 0.3126954423860596,\n", - " 0.047991774794369856,\n", - " 0.26145441136028397,\n", - " 0.11273044326108152,\n", - " 0.25857991449786244,\n", - " 0.06348906222655566,\n", - " 0.27007790194754866,\n", - " 0.3009474986874672,\n", - " 0.071737618440461,\n", - " 0.3060716017900447,\n", - " 0.28532523313082825,\n", - " 0.2705778144453611,\n", - " 0.2639539738493462,\n", - " 0.4061790794769869,\n", - " 0.1844678866971674,\n", - " 0.25645528638215953,\n", - " 0.043367584189604735,\n", - " 0.1533483337083427,\n", - " 0.43142466061651535,\n", - " 0.2925739643491087,\n", - " 0.31419517987949697,\n", - " 0.05236600915022875,\n", - " 0.26745336133403336,\n", - " 0.034244181104527614,\n", - " 0.2750770269256731,\n", - " 0.025245756143903595,\n", - " 0.03949326233155829,\n", - " 0.25208105202630066,\n", - " 0.030744793619840494,\n", - " 0.2723275081877047,\n", - " 0.2627041926048151,\n", - " 0.33419167979199477,\n", - " 0.015622440561014025,\n", - " 0.2484566864171604,\n", - " 0.22233625840646015,\n", - " 0.25783004575114377,\n", - " 0.26632855821395535,\n", - " 0.015622440561014025,\n", - " 0.2550805270131753,\n", - " 0.015622440561014025,\n", - " 0.015622440561014025,\n", - " 0.3049467986699667,\n", - " 0.4777915447886197,\n", - " 0.17184509612740317,\n", - " 0.058989849746243654,\n", - " 0.31844443611090273,\n", - " 0.015622440561014025,\n", - " 0.2584549363734093,\n", - " 0.015622440561014025,\n", - " 0.2540807020175504,\n", - " 0.25808000200005,\n", - " 0.015622440561014025,\n", - " 0.25957973949348734,\n", - " 0.26732838320958024,\n", - " 0.3689355983899597,\n", - " 0.09498354958873971,\n", - " 0.19009190229755743,\n", - " 0.5232835820895522,\n", - " 0.3210689767244181,\n", - " 0.08735988399709992,\n", - " 0.3248183204580114,\n", - " 0.06511377784444611,\n", - " 0.05636530913272832,\n", - " 0.29744811120278003,\n", - " 0.2605795644891122,\n", - " 0.27782654566364157,\n", - " 0.1202291307282682,\n", - " 0.04899159978999475,\n", - " 0.27182759568989223,\n", - " 0.04449238730968274,\n", - " 0.2617043676091902,\n", - " 0.03824348108702717,\n", - " 0.2507062926573164,\n", - " 0.030994749868746715,\n", - " 0.01624733118327958,\n", - " 0.015622440561014025,\n", - " 0.25295589889747244,\n", - " 0.24570716767919196,\n", - " 0.015622440561014025,\n", - " 0.2627041926048151,\n", - " 0.1698454461361534,\n", - " 0.2505813145328633,\n", - " 0.204214430360759,\n", - " 0.568025750643766,\n", - " 0.2505813145328633,\n", - " 0.25470559263981596,\n", - " 0.016497287432185804,\n", - " 0.015622440561014025,\n", - " 0.20533923348083702,\n", - " 0.26545371134278356,\n", - " 0.2140877021925548,\n", - " 0.2645788644716118,\n", - " 0.2647038425960649,\n", - " 0.3518135953398835,\n", - " 0.32919255481387033,\n", - " 0.10398197454936373,\n", - " 0.6118930723268081,\n", - " 0.2218363459086477,\n", - " 0.3066964924123103,\n", - " 0.06448888722218055,\n", - " 0.33719115477886946,\n", - " 0.015622440561014025,\n", - " 0.07786154653866346,\n", - " 0.2573301332533313,\n", - " 0.283950473761844,\n", - " 0.056240331008275204,\n", - " 0.05036635915897897,\n", - " 0.27295239880997024,\n", - " 0.2647038425960649,\n", - " 0.04836670916772919,\n", - " 0.03711867796694917,\n", - " 0.2517061176529413,\n", - " 0.2640789519737993,\n", - " 0.25008140203505086,\n", - " 0.2542056801420035,\n", - " 0.015747418685467137,\n", - " 0.24408245206130152,\n", - " 0.022121303032575812,\n", - " 0.015747418685467137,\n", - " 0.24770681767044175,\n", - " 0.25982969574239356,\n", - " 0.23970821770544262,\n", - " 0.6550105252631315,\n", - " 0.11273044326108152,\n", - " 0.24770681767044175,\n", - " 0.015747418685467137,\n", - " 0.28857466436660917,\n", - " 0.2608295207380184,\n", - " 0.015747418685467137,\n", - " 0.6973781094527363,\n", - " 0.256955198879972,\n", - " 0.251331183279582,\n", - " 0.3516886172154304,\n", - " 0.015747418685467137,\n", - " 0.09235900897522438,\n", - " 0.25108122703067576,\n", - " 0.015747418685467137,\n", - " 0.2923240081002025,\n", - " 0.06511377784444611,\n", - " 0.25183109577739443,\n", - " 0.05474059351483787,\n", - " 0.26995292382309555,\n", - " 0.12060406510162754,\n", - " 0.3746845921148028,\n", - " 0.31706967674191855,\n", - " 0.015747418685467137,\n", - " 0.25008140203505086,\n", - " 0.25445563639090973,\n", - " 0.015747418685467137,\n", - " 0.015747418685467137,\n", - " 0.2452072551813795,\n", - " 0.05836495912397809,\n", - " 0.27957623940598514,\n", - " 0.016497287432185804,\n", - " 0.25308087702192555,\n", - " 0.016497287432185804,\n", - " 0.04324260606515162,\n", - " 0.24495729893247328,\n", - " 0.10535673391834795,\n", - " 0.2439574739368484,\n", - " 0.25982969574239356,\n", - " 0.01624733118327958,\n", - " 0.2572051551288782,\n", - " 0.11960424010600264,\n", - " 0.2599546738668467,\n", - " 0.015747418685467137,\n", - " 0.26107947698692463,\n", - " 0.2617043676091902,\n", - " 0.29094924873121825,\n", - " 0.780238605965149,\n", - " 0.2485816645416135,\n", - " 0.10198232455811394,\n", - " 0.3689355983899597,\n", - " 0.015747418685467137,\n", - " 0.07636180904522613,\n", - " 0.30282217055426386,\n", - " 0.13660126503162578,\n", - " 0.40592912322808067,\n", - " 0.27657676441911044,\n", - " 0.06048958723968099,\n", - " 0.01624733118327958,\n", - " 0.2517061176529413,\n", - " 0.33406670166754165,\n", - " 0.08473534338358459,\n", - " 0.24770681767044175,\n", - " 0.01624733118327958,\n", - " 0.28857466436660917,\n", - " 0.016497287432185804,\n", - " 0.0662385809645241,\n", - " 0.2439574739368484,\n", - " 0.2573301332533313,\n", - " 0.04911657791444786,\n", - " 0.2427076926923173,\n", - " 0.17621933048326208,\n", - " 0.01624733118327958,\n", - " 0.2589548488712218,\n", - " 0.24533223330583262,\n", - " 0.01624733118327958,\n", - " 0.25458061451536285,\n", - " 0.2583299582489562,\n", - " 0.22808525213130326,\n", - " 0.015747418685467137,\n", - " 0.3241934298357459,\n", - " 0.8605995399884997,\n", - " 0.11385524638115953,\n", - " 0.38155838895972394,\n", - " 0.3125704642616065,\n", - " 0.08248573714342858,\n", - " 0.01624733118327958,\n", - " 0.24795677391934798,\n", - " 0.282825670641766,\n", - " 0.06761334033350834,\n", - " 0.24645703642591063,\n", - " 0.01624733118327958,\n", - " 0.016497287432185804,\n", - " 0.01624733118327958,\n", - " 0.24770681767044175,\n", - " 0.2503313582839571,\n", - " 0.24345756143903596,\n", - " 0.017747068676716916,\n", - " 0.15222353058826468,\n", - " 0.4043044076101902,\n", - " 0.24158288957223928,\n", - " 0.01624733118327958,\n", - " 0.3469394484862121,\n", - " 0.09460861521538037,\n", - " 0.015872396809920246,\n", - " 0.2494565114127853,\n", - " 0.25483057076426907,\n", - " 0.01624733118327958,\n", - " 0.25558043951098774,\n", - " 0.07398722468061701,\n", - " 0.015872396809920246,\n", - " 0.29769806745168625,\n", - " 0.18834220855521386,\n", - " 0.25870489262231555,\n", - " 0.36468634215855394,\n", - " 0.9388358458961473,\n", - " 0.05499054976374409,\n", - " 0.12622808070201755,\n", - " 0.39805550138753465,\n", - " 0.26120445511137774,\n", - " 0.01624733118327958,\n", - " 0.24683197079926997,\n", - " 0.3289425985649641,\n", - " 0.09073429335733393,\n", - " 0.25283092077301933,\n", - " 0.01624733118327958,\n", - " 0.2925739643491087,\n", - " 0.0761118527963199,\n", - " 0.24483232080802017,\n", - " 0.01787204680117003,\n", - " 0.24820673016825417,\n", - " 0.01624733118327958,\n", - " 0.24308262706567663,\n", - " 0.016497287432185804,\n", - " 0.1677208180204505,\n", - " 0.44117295432385806,\n", - " 0.24158288957223928,\n", - " 0.10898109952748818,\n", - " 0.01624733118327958,\n", - " 0.35618782969574236,\n", - " 0.24733188329708242,\n", - " 0.01624733118327958,\n", - " 0.15634780869521736,\n", - " 0.08136093402335058,\n", - " 0.3079462736568414,\n", - " 0.25470559263981596,\n", - " 0.3964307857696442,\n", - " 1.0148225455636388,\n", - " 0.26745336133403336,\n", - " 0.061864346608665216,\n", - " 0.015997374934373358,\n", - " 0.414177679441986,\n", - " 0.08561019025475636,\n", - " 0.2559553738843471,\n", - " 0.05111622790569764,\n", - " 0.24983144578614463,\n", - " 0.09898284957123928,\n", - " 0.25020638015950397,\n", - " 0.3383159578989475,\n", - " 0.01624733118327958,\n", - " 0.29982269556738916,\n", - " 0.07961124028100702,\n", - " 0.01624733118327958,\n", - " 0.24970646766169152,\n", - " 0.24445738643466086,\n", - " 0.01624733118327958,\n", - " 0.01624733118327958,\n", - " 0.24358253956348908,\n", - " 0.01624733118327958,\n", - " 0.24133293332333305,\n", - " 0.01624733118327958,\n", - " 0.24320760519012974,\n", - " 0.2514561614040351,\n", - " 0.01624733118327958,\n", - " 0.24670699267481686,\n", - " 0.25183109577739443,\n", - " 0.01624733118327958,\n", - " 0.016497287432185804,\n", - " 0.125603190079752,\n", - " 0.18409295232380807,\n", - " 0.477041676041901,\n", - " 0.25220603015075377,\n", - " 0.41117820445511133,\n", - " 1.0889345733643339,\n", - " 0.37618432960824016,\n", - " 0.11335533388334708,\n", - " 0.15059881497037425,\n", - " 0.4339242231055776,\n", - " 0.01624733118327958,\n", - " 0.24545721143028573,\n", - " 0.37355978899472486,\n", - " 0.0871099277481937,\n", - " 0.1069814495362384,\n", - " 0.3180695017375434,\n", - " 0.08623508087702192,\n", - " 0.27320235505887647,\n", - " 0.3090710767769194,\n", - " 0.06773831845796144,\n", - " 0.25358078951973795,\n", - " 0.05361579039475987,\n", - " 0.2495814895372384,\n", - " 0.01624733118327958,\n", - " 0.2517061176529413,\n", - " 0.01624733118327958,\n", - " 0.01624733118327958,\n", - " 0.24445738643466086,\n", - " 0.24308262706567663,\n", - " 0.021121478036950924,\n", - " 0.020121653041326033,\n", - " 0.24145791144778617,\n", - " 0.1975905897647441,\n", - " 0.5120355508887722,\n", - " 0.25083127078176953,\n", - " 0.01624733118327958,\n", - " 0.08248573714342858,\n", - " 0.451171204280107,\n", - " 1.1611719292982323,\n", - " 0.24408245206130152,\n", - " 0.43329933248331204,\n", - " 0.15822248056201405,\n", - " 0.1202291307282682,\n", - " 0.4416728668216705,\n", - " 0.09835795894897371,\n", - " 0.3279427735693392,\n", - " 0.11523000575014375,\n", - " 0.355812895322383,\n", - " 0.2779515237880947,\n", - " 0.07036285907147678,\n", - " 0.3190693267331683,\n", - " 0.25245598639966,\n", - " 0.09260896522413059,\n", - " 0.015997374934373358,\n", - " 0.2573301332533313,\n", - " 0.01624733118327958,\n", - " 0.01787204680117003,\n", - " 0.01624733118327958,\n", - " 0.2538307457686442,\n", - " 0.2484566864171604,\n", - " 0.01624733118327958,\n", - " 0.2462070801770044,\n", - " 0.24145791144778617,\n", - " 0.017747068676716916,\n", - " 0.2485816645416135,\n", - " 0.01624733118327958,\n", - " 0.022621215530388258,\n", - " 0.01624733118327958,\n", - " 0.24095799894997372,\n", - " 0.2485816645416135,\n", - " 0.015997374934373358,\n", - " 0.24158288957223928,\n", - " 0.25208105202630066,\n", - " 0.01624733118327958,\n", - " 0.5019123228080702,\n", - " 1.2317845696142402,\n", - " 0.24420743018575464,\n", - " 0.01624733118327958,\n", - " 0.45941976049401234,\n", - " 0.16934553363834096,\n", - " 0.5460296007400185,\n", - " 0.21808700217505436,\n", - " 0.12310362759068975,\n", - " 0.13610135253381334,\n", - " 0.37693419835495884,\n", - " 0.4636690167254181,\n", - " 0.01624733118327958,\n", - " 0.09898284957123928,\n", - " 0.24308262706567663,\n", - " 0.3289425985649641,\n", - " 0.33956573914347854,\n", - " 0.10323210580264505,\n", - " 0.2868249706242656,\n", - " 0.0772366559163979,\n", - " 0.06586364659116478,\n", - " 0.26107947698692463,\n", - " 0.016497287432185804,\n", - " 0.01624733118327958,\n", - " 0.2549555488887222,\n", - " 0.24595712392809818,\n", - " 0.01624733118327958,\n", - " 0.24733188329708242,\n", - " 0.01624733118327958,\n", - " 0.23933328333208329,\n", - " 0.24258271456786418,\n", - " 0.01624733118327958,\n", - " 0.22646053651341283,\n", - " 0.5793987599689991,\n", - " 0.01612235305882647,\n", - " 0.2484566864171604,\n", - " 0.4902893572339308,\n", - " 0.14060056501412535,\n", - " 0.5112856821420535,\n", - " 1.3006475161879045,\n", - " 0.01624733118327958,\n", - " 0.24208280207005173,\n", - " 0.17609435235880896,\n", - " 0.48504027600690014,\n", - " 0.11060581514537862,\n", - " 0.347939273481837,\n", - " 0.08236075901897547,\n", - " 0.13085227130678265,\n", - " 0.2913241831045776,\n", - " 0.3975555888897222,\n", - " 0.24995642391059775,\n", - " 0.10523175579389484,\n", - " 0.01624733118327958,\n", - " 0.3358163954098852,\n", - " 0.068363209080227,\n", - " 0.26532873321833045,\n", - " 0.01624733118327958,\n", - " 0.24495729893247328,\n", - " 0.25857991449786244,\n", - " 0.016497287432185804,\n", - " 0.24895659891497285,\n", - " 0.021371434285857145,\n", - " 0.01624733118327958,\n", - " 0.24358253956348908,\n", - " 0.24670699267481686,\n", - " 0.01624733118327958,\n", - " 0.01624733118327958,\n", - " 0.01624733118327958,\n", - " 0.24295764894122351,\n", - " 0.01624733118327958,\n", - " 0.24658201455036374,\n", - " 0.24120795519887994,\n", - " 0.24758183954598864,\n", - " 0.01612235305882647,\n", - " 0.5536532663316582,\n", - " 1.3680107252681315,\n", - " 0.24308262706567663,\n", - " 0.01624733118327958,\n", - " 0.5100359008975224,\n", - " 0.18621758043951098,\n", - " 0.24633205830145752,\n", - " 0.6118930723268081,\n", - " 0.13535148378709466,\n", - " 0.14647453686342157,\n", - " 0.4185519137978449,\n", - " 0.39505602640066,\n", - " 0.01624733118327958,\n", - " 0.24195782394559862,\n", - " 0.11123070576764418,\n", - " 0.3568127203180079,\n", - " 0.11972921823045575,\n", - " 0.35718765469136726,\n", - " 0.09023438085952148,\n", - " 0.29757308932723314,\n", - " 0.01624733118327958,\n", - " 0.26932803320083,\n", - " 0.2439574739368484,\n", - " 0.26145441136028397,\n", - " 0.06348906222655566,\n", - " 0.01624733118327958,\n", - " 0.25108122703067576,\n", - " 0.016497287432185804,\n", - " 0.046117102927573185,\n", - " 0.24333258331458285,\n", - " 0.24495729893247328,\n", - " 0.016497287432185804,\n", - " 0.2542056801420035,\n", - " 0.6436375159378984,\n", - " 0.01624733118327958,\n", - " 0.24658201455036374,\n", - " 0.01624733118327958,\n", - " 0.24120795519887994,\n", - " 1.4339991749793743,\n", - " 0.5692755318882972,\n", - " 0.40092999824995623,\n", - " 0.01637230930773269,\n", - " 0.20158988974724368,\n", - " 0.505036775919398,\n", - " 0.12397847446186154,\n", - " 0.3753094827370684,\n", - " 0.09098424960624014,\n", - " 0.402929648241206,\n", - " 0.3056966674166854,\n", - " 0.14260021500537512,\n", - " 0.01624733118327958,\n", - " 0.3476893172329308,\n", - " 0.24770681767044175,\n", - " 0.11722965574139353,\n", - " 0.27420218005450137,\n", - " 0.01787204680117003,\n", - " 0.01624733118327958,\n", - " 0.24420743018575464,\n", - " 0.26420393009825244,\n", - " 0.017747068676716916,\n", - " 0.25358078951973795,\n", - " 0.016497287432185804,\n", - " 0.01787204680117003,\n", - " 0.24670699267481686,\n", - " 0.24570716767919196,\n", - " 0.01787204680117003,\n", - " 0.016497287432185804,\n", - " 0.24633205830145752,\n", - " 0.016497287432185804,\n", - " 0.2452072551813795,\n", - " 0.01624733118327958,\n", - " 0.2417078676966924,\n", - " 1.4984878871971796,\n", - " 0.6092685317132928,\n", - " 0.016497287432185804,\n", - " 0.24245773644341106,\n", - " 0.5277827945698642,\n", - " 0.21046333658341457,\n", - " 0.2460821020525513,\n", - " 0.42092649816245403,\n", - " 0.016497287432185804,\n", - " 0.14984894622365558,\n", - " 0.67463209080227,\n", - " 0.01637230930773269,\n", - " 0.1258531463286582,\n", - " 0.4461720793019825,\n", - " 0.4449222980574514,\n", - " 0.16647103677591937,\n", - " 0.016497287432185804,\n", - " 0.24133293332333305,\n", - " 0.13097724943123576,\n", - " 0.43654876371909296,\n", - " 0.31182059551488783,\n", - " 0.09798302457561438,\n", - " 0.01674724368109203,\n", - " 0.267078426960674,\n", - " 0.2780765019125478,\n", - " 0.01787204680117003,\n", - " 0.016497287432185804,\n", - " 0.016497287432185804,\n", - " 0.25558043951098774,\n", - " 0.2437075176879422,\n", - " 0.24820673016825417,\n", - " 0.016497287432185804,\n", - " 0.2452072551813795,\n", - " 0.01787204680117003,\n", - " 0.01787204680117003,\n", - " 0.24433240831020775,\n", - " 0.7051267531688291,\n", - " 0.2866999924998125,\n", - " 1.561601840046001,\n", - " 0.6253907097677441,\n", - " 0.17147016175404384,\n", - " 0.4647938198454961,\n", - " 0.2197117177929448,\n", - " 0.5501538788469711,\n", - " 0.45529548238705964,\n", - " 0.134601615040376,\n", - " 0.3154449611240281,\n", - " 0.4234260606515163,\n", - " 0.10273219330483262,\n", - " 0.1622217805445136,\n", - " 0.24595712392809818,\n", - " 0.016497287432185804,\n", - " 0.2849502987574689,\n", - " 0.4512961824045601,\n", - " 0.13397672441811045,\n", - " 0.08860966524163104,\n", - " 0.24333258331458285,\n", - " 0.016497287432185804,\n", - " 0.016497287432185804,\n", - " 0.26982794569864244,\n", - " 0.24908157703942596,\n", - " 0.016497287432185804,\n", - " 0.01787204680117003,\n", - " 0.24320760519012974,\n", - " 0.24445738643466086,\n", - " 0.016497287432185804,\n", - " 0.01787204680117003,\n", - " 0.24695694892372308,\n", - " 0.2438324958123953,\n", - " 0.016497287432185804,\n", - " 1.623466011650291,\n", - " 0.6655086877171928,\n", - " 0.016497287432185804,\n", - " 0.24470734268356706,\n", - " 0.2294600115002875,\n", - " 0.5720250506262656,\n", - " 0.24458236455911395,\n", - " 0.016497287432185804,\n", - " 0.16947051176279407,\n", - " 0.44017312932823316,\n", - " 0.7348715467886696,\n", - " 0.29007440186004646,\n", - " 0.37505952648816215,\n", - " 0.19021688042201054,\n", - " 0.13735113377834446,\n", - " 0.4844153853846346,\n", - " 0.016497287432185804,\n", - " 0.24195782394559862,\n", - " 0.3941811795294882,\n", - " 0.1509737493437336,\n", - " 0.11223053076326907,\n", - " 0.32856766419160477,\n", - " 0.016622265556638916,\n", - " 0.28857466436660917,\n", - " 0.27320235505887647,\n", - " 0.08748486212155303,\n", - " 0.01674724368109203,\n", - " 0.016497287432185804,\n", - " 0.260329608240206,\n", - " 0.24333258331458285,\n", - " 0.01674724368109203,\n", - " 0.2515811395284882,\n", - " 0.016497287432185804,\n", - " 0.24320760519012974,\n", - " 0.6908792469811744,\n", - " 1.6842053801345032,\n", - " 0.7639914497862446,\n", - " 0.30057256431410784,\n", - " 0.7208739968499212,\n", - " 0.24583214580364507,\n", - " 0.6168921973049326,\n", - " 0.19096674916872922,\n", - " 0.1500989024725618,\n", - " 0.40967846696167404,\n", - " 0.016622265556638916,\n", - " 0.45654526363159076,\n", - " 0.1102308807720193,\n", - " 0.3325669641741043,\n", - " 0.24495729893247328,\n", - " 0.14310012750318757,\n", - " 0.3890570764269106,\n", - " 0.016497287432185804,\n", - " 0.2923240081002025,\n", - " 0.09460861521538037,\n", - " 0.08361054026350659,\n", - " 0.2762018300457511,\n", - " 0.017747068676716916,\n", - " 0.2527059426485662,\n", - " 0.24408245206130152,\n", - " 0.01674724368109203,\n", - " 0.01674724368109203,\n", - " 0.2437075176879422,\n", - " 0.25008140203505086,\n", - " 0.01787204680117003,\n", - " 0.24245773644341106,\n", - " 0.01674724368109203,\n", - " 1.7436949673741842,\n", - " 0.7151250031250781,\n", - " 0.2472069051726293,\n", - " 0.01674724368109203,\n", - " 0.24358253956348908,\n", - " 0.7454946873671842,\n", - " 0.01674724368109203,\n", - " 0.24220778019450484,\n", - " 0.18409295232380807,\n", - " 0.47266744168604213,\n", - " 0.792611440286007,\n", - " 0.315319982999575,\n", - " 0.19509102727568187,\n", - " 0.6390133253331333,\n", - " 0.4026796919922998,\n", - " 0.14872414310357757,\n", - " 0.01674724368109203,\n", - " 0.24295764894122351,\n", - " 0.1533483337083427,\n", - " 0.42492579814495357,\n", - " 0.2971981549538738,\n", - " 0.01787204680117003,\n", - " 0.01674724368109203,\n", - " 0.24545721143028573,\n", - " 0.2792013050326258,\n", - " 0.08698494962374059,\n", - " 0.01674724368109203,\n", - " 0.2669534488362209,\n", - " 0.25345581139528484,\n", - " 0.01787204680117003,\n", - " 0.01674724368109203,\n", - " 0.24158288957223928,\n", - " 0.8207315182879571,\n", - " 0.341190454761369,\n", - " 0.7637414935373383,\n", - " 1.802059751493787,\n", - " 0.511785594639866,\n", - " 0.2107132928323208,\n", - " 0.6352639815995399,\n", - " 0.2638289957248931,\n", - " 0.4397981949548738,\n", - " 0.016622265556638916,\n", - " 0.4884146853671341,\n", - " 0.19096674916872922,\n", - " 0.35143866096652415,\n", - " 0.12172886822170553,\n", - " 0.24808175204380106,\n", - " 0.01674724368109203,\n", - " 0.4160523513087827,\n", - " 0.30744636115902896,\n", - " 0.15422318057951448,\n", - " 0.10298214955373884,\n", - " 0.28070104252606315,\n", - " 0.01674724368109203,\n", - " 0.2438324958123953,\n", - " 0.01787204680117003,\n", - " 0.24333258331458285,\n", - " 0.01674724368109203,\n", - " 0.24108297707442683,\n", - " 0.01674724368109203,\n", - " 1.859299732493312,\n", - " 0.7706152903822595,\n", - " 0.25358078951973795,\n", - " 0.01674724368109203,\n", - " 0.24995642391059775,\n", - " 0.02299614990374759,\n", - " 0.01674724368109203,\n", - " 0.194091202280057,\n", - " 0.24320760519012974,\n", - " 0.47729163229080723,\n", - " 0.8482267056676416,\n", - " 0.35043883597089925,\n", - " 0.5290325758143953,\n", - " 0.21446263656591413,\n", - " 0.24495729893247328,\n", - " 0.01674724368109203,\n", - " 0.16847068676716917,\n", - " 0.43917330433260826,\n", - " 0.3104458361459036,\n", - " 0.01787204680117003,\n", - " 0.01674724368109203,\n", - " 0.2849502987574689,\n", - " 0.01674724368109203,\n", - " 0.01674724368109203,\n", - " 0.24495729893247328,\n", - " 0.2694530113252831,\n", - " 0.01674724368109203,\n", - " 0.25570541763544086,\n", - " 0.24295764894122351,\n", - " 0.01787204680117003,\n", - " 0.3680607515187879,\n", - " 0.1348515712892822,\n", - " 0.01674724368109203,\n", - " 0.24220778019450484,\n", - " 0.31594487362184054,\n", - " 0.01787204680117003,\n", - " 0.28832470811770294,\n", - " 0.017747068676716916,\n", - " 0.01674724368109203,\n", - " 0.24345756143903596,\n", - " 0.2439574739368484,\n", - " 0.01674724368109203,\n", - " 0.01787204680117003,\n", - " 0.2427076926923173,\n", - " 0.020121653041326033,\n", - " 1.9707802195054873,\n", - " 0.8066089902247555,\n", - " 0.25745511137778443,\n", - " 0.030869771744293607,\n", - " 0.2542056801420035,\n", - " 0.01674724368109203,\n", - " 0.25120620515512887,\n", - " 0.20708892722318056,\n", - " 0.5061615790394759,\n", - " 0.01674724368109203,\n", - " 0.24795677391934798,\n", - " 0.01787204680117003,\n", - " 0.32069404235105875,\n", - " 0.2935737893447336,\n", - " 0.24658201455036374,\n", - " 0.017747068676716916,\n", - " 0.017747068676716916,\n", - " 0.022121303032575812,\n", - " 0.2762018300457511,\n", - " 0.02062156553913848,\n", - " 0.25970471761794045,\n", - " 0.01787204680117003,\n", - " 0.2418328458211455,\n", - " 0.3726849421235531,\n", - " 0.13960074001850045,\n", - " 0.2385834145853646,\n", - " 0.01674724368109203,\n", - " 0.12085402135053376,\n", - " 0.324318407960199,\n", - " 0.29494854871371784,\n", - " 0.017747068676716916,\n", - " 0.04686697167429185,\n", - " 0.24420743018575464,\n", - " 0.017497112427810695,\n", - " 0.24345756143903596,\n", - " 0.017747068676716916,\n", - " 0.2418328458211455,\n", - " 0.26145441136028397,\n", - " 0.017747068676716916,\n", - " 2.0785113627840692,\n", - " 0.855350458761469,\n", - " 0.017747068676716916,\n", - " 0.25857991449786244,\n", - " 0.017747068676716916,\n", - " 0.2542056801420035,\n", - " 0.5339067226680667,\n", - " 0.21708717717942946,\n", - " 0.2507062926573164,\n", - " 0.017747068676716916,\n", - " 0.33319185479636987,\n", - " 0.01787204680117003,\n", - " 0.2484566864171604,\n", - " 0.017747068676716916,\n", - " 0.30269719242981075,\n", - " 0.01787204680117003,\n", - " 0.28420043001075024,\n", - " 0.017747068676716916,\n", - " 0.017747068676716916,\n", - " 0.2684531863296582,\n", - " 0.017747068676716916,\n", - " 0.2437075176879422,\n", - " 0.15222353058826468,\n", - " 0.3604370859271481,\n", - " 0.2428326708167704,\n", - " 0.01787204680117003,\n", - " 0.33506652666316655,\n", - " 0.12347856196404909,\n", - " 0.01787204680117003,\n", - " 0.2452072551813795,\n", - " 0.01787204680117003,\n", - " 0.24445738643466086,\n", - " 0.01787204680117003,\n", - " 0.23770856771419283,\n", - " 0.017747068676716916,\n", - " 0.9118405710142753,\n", - " 2.1824931623290578,\n", - " 0.2650787769694242,\n", - " 0.26232925823145575,\n", - " 0.021371434285857145,\n", - " 0.017747068676716916,\n", - " 0.25745511137778443,\n", - " 0.23245948648716216,\n", - " 0.5607770194254856,\n", - " 0.017747068676716916,\n", - " 0.2539557238930973,\n", - " 0.10273219330483262,\n", - " 0.28645003625090626,\n", - " 0.33519150478761967,\n", - " 0.01787204680117003,\n", - " 0.017497112427810695,\n", - " 0.2503313582839571,\n", - " 0.017747068676716916,\n", - " 0.26245423635590887,\n", - " 0.23783354583864594,\n", - " 0.017747068676716916,\n", - " 0.15947226180654514,\n", - " 0.39918030450761266,\n", - " 0.017747068676716916,\n", - " 0.24308262706567663,\n", - " 0.3433150828770719,\n", - " 0.01787204680117003,\n", - " 0.24670699267481686,\n", - " 0.05099124978124453,\n", - " 0.048491687292182305,\n", - " 0.24658201455036374,\n", - " 0.23795852396309905,\n", - " 0.01787204680117003,\n", - " 2.2832255306382656,\n", - " 0.9839529488237205,\n", - " 0.26995292382309555,\n", - " 0.017747068676716916,\n", - " 0.267078426960674,\n", - " 0.017747068676716916,\n", - " 0.24445738643466086,\n", - " 0.5867724693117328,\n", - " 0.2705778144453611,\n", - " 0.017747068676716916,\n", - " 0.017497112427810695,\n", - " 0.25670524263106576,\n", - " 0.2958233955848896,\n", - " 0.01787204680117003,\n", - " 0.2533308332708318,\n", - " 0.017497112427810695,\n", - " 0.2745771144278607,\n", - " 0.09660826520663016,\n", - " 0.24095799894997372,\n", - " 0.017747068676716916,\n", - " 0.16272169304232606,\n", - " 0.4176770669266731,\n", - " 0.017747068676716916,\n", - " 0.2417078676966924,\n", - " 0.01787204680117003,\n", - " 0.24870664266606662,\n", - " 0.01787204680117003,\n", - " 0.34756433910847767,\n", - " ...]" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "vol_batch_bjs = vector_vol_estimation(\n", - " vol_est_brute_force_bjs_2002,\n", - " vector_params\n", - ")\n", - "vol_batch_bjs" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "from module_test.raw_code.optionlib_2.utils.batch_operation import vector_batch_processor\n", - "slc = slice(None)\n", - "\n", - "test2 = vector_batch_processor(\n", - " vector_vol_estimation,\n", - " vol_est_brute_force_bjs_2002,\n", - " # vector_params,\n", - " None,\n", - " s[slc], \n", - " aapl_chain['Strike'].tolist()[slc],\n", - " T[slc], \n", - " r[slc], \n", - " aapl_chain['Midpoint'].tolist()[slc], \n", - " q[slc], \n", - " aapl_chain['Right'].str.lower().tolist()[slc],\n", - " \n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "aapl_chain['bjs_vol_non_batch'] = vol_batch_bjs\n", - "aapl_chain['bjs_vol_batch'] = test2\n", - "aapl_chain['diff'] = aapl_chain['bjs_vol_non_batch'] - aapl_chain['bjs_vol_batch']\n", - "aapl_chain['bjs_vol_non_batch'].equals(aapl_chain['bjs_vol_batch'])" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
RootExpirationStrikeRightBid_sizeCloseBidAsk_sizeCloseAskDateMidpointWeighted_midpointbjs_vol_non_batchbjs_vol_batchdiffbjs_vol
datetime
2025-07-16AAPL2025-08-22215.0P19.753810.15202507169.95010.1397440.1322270.1322270.00.132227
2025-07-16AAPL2025-08-29215.0C26.2516.40202507166.3256.3000000.2765770.2765770.00.276577
2025-07-16AAPL2025-08-22215.0C25.6515.75202507165.7005.6833330.2802010.2802010.00.280201
2025-07-16AAPL2025-08-29215.0P249.902310.602025071610.25010.2425530.1419750.1419750.00.141975
2025-07-16AAPL2025-09-19215.0P811.25111.402025071611.32511.2666670.1702200.1702200.00.170220
................................................
2025-07-16AAPL2025-07-25215.0P45.90306.10202507166.0006.0764710.0177470.0177470.00.017747
2025-07-16AAPL2025-08-08215.0C64.45124.55202507164.5004.5166670.3029470.3029470.00.302947
2025-07-16AAPL2025-08-08215.0P48.5568.85202507168.7008.7300000.0458670.0458670.00.045867
2025-07-16AAPL2026-06-18210.0P1318.402318.702025071618.55018.5916670.3741850.3741850.00.374185
2025-07-16AAPL2026-06-18210.0C125.40225.602025071625.50025.5333330.2758270.2758270.00.275827
\n", - "

2428 rows × 15 columns

\n", - "
" - ], - "text/plain": [ - " Root Expiration Strike Right Bid_size CloseBid Ask_size \\\n", - "datetime \n", - "2025-07-16 AAPL 2025-08-22 215.0 P 1 9.75 38 \n", - "2025-07-16 AAPL 2025-08-29 215.0 C 2 6.25 1 \n", - "2025-07-16 AAPL 2025-08-22 215.0 C 2 5.65 1 \n", - "2025-07-16 AAPL 2025-08-29 215.0 P 24 9.90 23 \n", - "2025-07-16 AAPL 2025-09-19 215.0 P 8 11.25 1 \n", - "... ... ... ... ... ... ... ... \n", - "2025-07-16 AAPL 2025-07-25 215.0 P 4 5.90 30 \n", - "2025-07-16 AAPL 2025-08-08 215.0 C 6 4.45 12 \n", - "2025-07-16 AAPL 2025-08-08 215.0 P 4 8.55 6 \n", - "2025-07-16 AAPL 2026-06-18 210.0 P 13 18.40 23 \n", - "2025-07-16 AAPL 2026-06-18 210.0 C 1 25.40 2 \n", - "\n", - " CloseAsk Date Midpoint Weighted_midpoint \\\n", - "datetime \n", - "2025-07-16 10.15 20250716 9.950 10.139744 \n", - "2025-07-16 6.40 20250716 6.325 6.300000 \n", - "2025-07-16 5.75 20250716 5.700 5.683333 \n", - "2025-07-16 10.60 20250716 10.250 10.242553 \n", - "2025-07-16 11.40 20250716 11.325 11.266667 \n", - "... ... ... ... ... \n", - "2025-07-16 6.10 20250716 6.000 6.076471 \n", - "2025-07-16 4.55 20250716 4.500 4.516667 \n", - "2025-07-16 8.85 20250716 8.700 8.730000 \n", - "2025-07-16 18.70 20250716 18.550 18.591667 \n", - "2025-07-16 25.60 20250716 25.500 25.533333 \n", - "\n", - " bjs_vol_non_batch bjs_vol_batch diff bjs_vol \n", - "datetime \n", - "2025-07-16 0.132227 0.132227 0.0 0.132227 \n", - "2025-07-16 0.276577 0.276577 0.0 0.276577 \n", - "2025-07-16 0.280201 0.280201 0.0 0.280201 \n", - "2025-07-16 0.141975 0.141975 0.0 0.141975 \n", - "2025-07-16 0.170220 0.170220 0.0 0.170220 \n", - "... ... ... ... ... \n", - "2025-07-16 0.017747 0.017747 0.0 0.017747 \n", - "2025-07-16 0.302947 0.302947 0.0 0.302947 \n", - "2025-07-16 0.045867 0.045867 0.0 0.045867 \n", - "2025-07-16 0.374185 0.374185 0.0 0.374185 \n", - "2025-07-16 0.275827 0.275827 0.0 0.275827 \n", - "\n", - "[2428 rows x 15 columns]" - ] - }, - "execution_count": 36, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "aapl_chain['bjs_vol'] = vol_batch_bjs\n", - "aapl_chain" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[0;31mSignature:\u001b[0m\n", - "\u001b[0mestimate_crr_implied_volatility\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mS\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mK\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mT\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mmarket_price\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mq\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0.0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0moption_type\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'c'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mN\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mint\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m1000\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mdividend_type\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mLiteral\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'continuous'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'discrete'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'continuous'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mamerican\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mbool\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mDocstring:\u001b[0m\n", - "Estimate implied volatility using optimization.\n", - "\n", - "Parameters:\n", - "- S: Spot price\n", - "- K: Strike price\n", - "- T: Time to maturity\n", - "- r: Risk-free interest rate\n", - "- market_price: Market price of the option\n", - "- q: Continuous dividend yield (default is 0.0)\n", - "- option_type: 'c' for call, 'p' for put\n", - "- N: Number of time steps in the binomial tree\n", - "\n", - "Returns:\n", - "- Estimated volatility\n", - "\u001b[0;31mFile:\u001b[0m ~/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/vol/implied_vol.py\n", - "\u001b[0;31mType:\u001b[0m function" - ] - } - ], - "source": [ - "estimate_crr_implied_volatility?\n", - "crr_vector_params_discrete = list(zip(\n", - " s, aapl_chain['Strike'].tolist(), ## Spot, Strike\n", - " T, r, ## Time to Maturity, Risk Free Rate\n", - " aapl_chain['Midpoint'], ## Midpoint Price\n", - " discrete_q_convert, ## Discrete Dividend Schedules\n", - " aapl_chain['Right'].str.lower().tolist(), ## Option Type\n", - " [100] * len(aapl_chain), ## Number of Steps\n", - " ['discrete'] * len(aapl_chain), ## Dividend Type\n", - " [True] * len(aapl_chain),)) ## American==True, European==False\n", - "\n", - "crr_vector_params_cont = list(zip(\n", - " s, aapl_chain['Strike'].tolist(), ## Spot, Strike\n", - " T, r, ## Time to Maturity, Risk Free Rate\n", - " aapl_chain['Midpoint'], ## Midpoint Price\n", - " q, ## Discrete Dividend Schedules\n", - " aapl_chain['Right'].str.lower().tolist(), ## Option Type\n", - " [100] * len(aapl_chain), ## Number of Steps\n", - " ['continuous'] * len(aapl_chain), ## Dividend Type\n", - " [True] * len(aapl_chain),)) ## American==True, European==False" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Finished Discrete in 514.051295042038 seconds\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "--- Logging error ---\n", - "multiprocess.pool.RemoteTraceback: \n", - "\"\"\"\n", - "Traceback (most recent call last):\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/multiprocess/pool.py\", line 125, in worker\n", - " result = (True, func(*args, **kwds))\n", - " ^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/multiprocess/pool.py\", line 48, in mapstar\n", - " return list(map(*args))\n", - " ^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/pathos/helpers/mp_helper.py\", line 15, in \n", - " func = lambda args: f(*args)\n", - " ^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/vol/implied_vol.py\", line 158, in vector_vol_estimation\n", - " estimated_vols = [brute_callable(*params) for params in list_input]\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/vol/implied_vol.py\", line 158, in \n", - " estimated_vols = [brute_callable(*params) for params in list_input]\n", - " ^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/vol/implied_vol.py\", line 258, in estimate_crr_implied_volatility\n", - " result = minimize_scalar(\n", - " ^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/scipy/optimize/_minimize.py\", line 966, in minimize_scalar\n", - " res = _minimize_scalar_bounded(fun, bounds, args, **options)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/scipy/optimize/_optimize.py\", line 2321, in _minimize_scalar_bounded\n", - " fu = func(x, *args)\n", - " ^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/vol/implied_vol.py\", line 244, in binomial_objective_function\n", - " calculated_price = crr_binomial_pricing(\n", - " ^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/pricing/binomial.py\", line 208, in crr_binomial_pricing\n", - " u, d, p = crr_init_parameters(sigma, r, T, N, div_yield=div_amount if dividend_type == 'continuous' else 0.0, dividend_type=dividend_type)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/pricing/binomial.py\", line 53, in crr_init_parameters\n", - " raise ValueError(f\"Invalid probability p={p}. It must be between 0 and 1.\")\n", - "ValueError: Invalid probability p=1.0109933236781294. It must be between 0 and 1.\n", - "\"\"\"\n", - "\n", - "The above exception was the direct cause of the following exception:\n", - "\n", - "Traceback (most recent call last):\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/pools.py\", line 46, in runProcesses\n", - " results = pool.map(func, *OrderedInputs)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/pathos/multiprocessing.py\", line 135, in map\n", - " return _pool.map(star(f), zip(*args)) # chunksize\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/multiprocess/pool.py\", line 367, in map\n", - " return self._map_async(func, iterable, mapstar, chunksize).get()\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/multiprocess/pool.py\", line 774, in get\n", - " raise self._value\n", - "ValueError: Invalid probability p=1.0109933236781294. It must be between 0 and 1.\n", - "\n", - "During handling of the above exception, another exception occurred:\n", - "\n", - "Traceback (most recent call last):\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/logging/__init__.py\", line 1110, in emit\n", - " msg = self.format(record)\n", - " ^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/logging/__init__.py\", line 953, in format\n", - " return fmt.format(record)\n", - " ^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/logging/__init__.py\", line 687, in format\n", - " record.message = record.getMessage()\n", - " ^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/logging/__init__.py\", line 377, in getMessage\n", - " msg = msg % self.args\n", - " ~~~~^~~~~~~~~~~\n", - "TypeError: not all arguments converted during string formatting\n", - "Call stack:\n", - " File \"\", line 198, in _run_module_as_main\n", - " File \"\", line 88, in _run_code\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/ipykernel_launcher.py\", line 17, in \n", - " app.launch_new_instance()\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/traitlets/config/application.py\", line 1053, in launch_instance\n", - " app.start()\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/ipykernel/kernelapp.py\", line 736, in start\n", - " self.io_loop.start()\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/tornado/platform/asyncio.py\", line 195, in start\n", - " self.asyncio_loop.run_forever()\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/asyncio/base_events.py\", line 608, in run_forever\n", - " self._run_once()\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/asyncio/base_events.py\", line 1936, in _run_once\n", - " handle._run()\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/asyncio/events.py\", line 84, in _run\n", - " self._context.run(self._callback, *self._args)\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/ipykernel/kernelbase.py\", line 516, in dispatch_queue\n", - " await self.process_one()\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/ipykernel/kernelbase.py\", line 505, in process_one\n", - " await dispatch(*args)\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/ipykernel/kernelbase.py\", line 412, in dispatch_shell\n", - " await result\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/ipykernel/kernelbase.py\", line 740, in execute_request\n", - " reply_content = await reply_content\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/ipykernel/ipkernel.py\", line 422, in do_execute\n", - " res = shell.run_cell(\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/ipykernel/zmqshell.py\", line 546, in run_cell\n", - " return super().run_cell(*args, **kwargs)\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/IPython/core/interactiveshell.py\", line 3024, in run_cell\n", - " result = self._run_cell(\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/IPython/core/interactiveshell.py\", line 3079, in _run_cell\n", - " result = runner(coro)\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/IPython/core/async_helpers.py\", line 129, in _pseudo_sync_runner\n", - " coro.send(None)\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/IPython/core/interactiveshell.py\", line 3284, in run_cell_async\n", - " has_raised = await self.run_ast_nodes(code_ast.body, cell_name,\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/IPython/core/interactiveshell.py\", line 3466, in run_ast_nodes\n", - " if await self.run_code(code, result, async_=asy):\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/IPython/core/interactiveshell.py\", line 3526, in run_code\n", - " exec(code_obj, self.user_global_ns, self.user_ns)\n", - " File \"/var/folders/j0/80hkbygd4lb27h9mw76gqzpw0000gn/T/ipykernel_56605/2246281926.py\", line 11, in \n", - " vol_batch_crr_cont = vector_batch_processor(\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/utils/batch_operation.py\", line 53, in vector_batch_processor\n", - " results = runProcesses(\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/pools.py\", line 64, in runProcesses\n", - " logger.error('Error occured: ', e)\n", - "Message: 'Error occured: '\n", - "Arguments: (ValueError('Invalid probability p=1.0109933236781294. It must be between 0 and 1.'),)\n", - "--- Logging error ---\n", - "multiprocess.pool.RemoteTraceback: \n", - "\"\"\"\n", - "Traceback (most recent call last):\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/multiprocess/pool.py\", line 125, in worker\n", - " result = (True, func(*args, **kwds))\n", - " ^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/multiprocess/pool.py\", line 48, in mapstar\n", - " return list(map(*args))\n", - " ^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/pathos/helpers/mp_helper.py\", line 15, in \n", - " func = lambda args: f(*args)\n", - " ^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/vol/implied_vol.py\", line 158, in vector_vol_estimation\n", - " estimated_vols = [brute_callable(*params) for params in list_input]\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/vol/implied_vol.py\", line 158, in \n", - " estimated_vols = [brute_callable(*params) for params in list_input]\n", - " ^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/vol/implied_vol.py\", line 258, in estimate_crr_implied_volatility\n", - " result = minimize_scalar(\n", - " ^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/scipy/optimize/_minimize.py\", line 966, in minimize_scalar\n", - " res = _minimize_scalar_bounded(fun, bounds, args, **options)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/scipy/optimize/_optimize.py\", line 2321, in _minimize_scalar_bounded\n", - " fu = func(x, *args)\n", - " ^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/vol/implied_vol.py\", line 244, in binomial_objective_function\n", - " calculated_price = crr_binomial_pricing(\n", - " ^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/pricing/binomial.py\", line 208, in crr_binomial_pricing\n", - " u, d, p = crr_init_parameters(sigma, r, T, N, div_yield=div_amount if dividend_type == 'continuous' else 0.0, dividend_type=dividend_type)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/pricing/binomial.py\", line 53, in crr_init_parameters\n", - " raise ValueError(f\"Invalid probability p={p}. It must be between 0 and 1.\")\n", - "ValueError: Invalid probability p=1.0109933236781294. It must be between 0 and 1.\n", - "\"\"\"\n", - "\n", - "The above exception was the direct cause of the following exception:\n", - "\n", - "Traceback (most recent call last):\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/pools.py\", line 46, in runProcesses\n", - " results = pool.map(func, *OrderedInputs)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/pathos/multiprocessing.py\", line 135, in map\n", - " return _pool.map(star(f), zip(*args)) # chunksize\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/multiprocess/pool.py\", line 367, in map\n", - " return self._map_async(func, iterable, mapstar, chunksize).get()\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/multiprocess/pool.py\", line 774, in get\n", - " raise self._value\n", - "ValueError: Invalid probability p=1.0109933236781294. It must be between 0 and 1.\n", - "\n", - "During handling of the above exception, another exception occurred:\n", - "\n", - "Traceback (most recent call last):\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/logging/__init__.py\", line 1110, in emit\n", - " msg = self.format(record)\n", - " ^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/logging/__init__.py\", line 953, in format\n", - " return fmt.format(record)\n", - " ^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/logging/__init__.py\", line 687, in format\n", - " record.message = record.getMessage()\n", - " ^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/logging/__init__.py\", line 377, in getMessage\n", - " msg = msg % self.args\n", - " ~~~~^~~~~~~~~~~\n", - "TypeError: not all arguments converted during string formatting\n", - "Call stack:\n", - " File \"\", line 198, in _run_module_as_main\n", - " File \"\", line 88, in _run_code\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/ipykernel_launcher.py\", line 17, in \n", - " app.launch_new_instance()\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/traitlets/config/application.py\", line 1053, in launch_instance\n", - " app.start()\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/ipykernel/kernelapp.py\", line 736, in start\n", - " self.io_loop.start()\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/tornado/platform/asyncio.py\", line 195, in start\n", - " self.asyncio_loop.run_forever()\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/asyncio/base_events.py\", line 608, in run_forever\n", - " self._run_once()\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/asyncio/base_events.py\", line 1936, in _run_once\n", - " handle._run()\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/asyncio/events.py\", line 84, in _run\n", - " self._context.run(self._callback, *self._args)\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/ipykernel/kernelbase.py\", line 516, in dispatch_queue\n", - " await self.process_one()\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/ipykernel/kernelbase.py\", line 505, in process_one\n", - " await dispatch(*args)\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/ipykernel/kernelbase.py\", line 412, in dispatch_shell\n", - " await result\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/ipykernel/kernelbase.py\", line 740, in execute_request\n", - " reply_content = await reply_content\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/ipykernel/ipkernel.py\", line 422, in do_execute\n", - " res = shell.run_cell(\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/ipykernel/zmqshell.py\", line 546, in run_cell\n", - " return super().run_cell(*args, **kwargs)\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/IPython/core/interactiveshell.py\", line 3024, in run_cell\n", - " result = self._run_cell(\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/IPython/core/interactiveshell.py\", line 3079, in _run_cell\n", - " result = runner(coro)\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/IPython/core/async_helpers.py\", line 129, in _pseudo_sync_runner\n", - " coro.send(None)\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/IPython/core/interactiveshell.py\", line 3284, in run_cell_async\n", - " has_raised = await self.run_ast_nodes(code_ast.body, cell_name,\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/IPython/core/interactiveshell.py\", line 3466, in run_ast_nodes\n", - " if await self.run_code(code, result, async_=asy):\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/IPython/core/interactiveshell.py\", line 3526, in run_code\n", - " exec(code_obj, self.user_global_ns, self.user_ns)\n", - " File \"/var/folders/j0/80hkbygd4lb27h9mw76gqzpw0000gn/T/ipykernel_56605/2246281926.py\", line 11, in \n", - " vol_batch_crr_cont = vector_batch_processor(\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/utils/batch_operation.py\", line 53, in vector_batch_processor\n", - " results = runProcesses(\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/pools.py\", line 64, in runProcesses\n", - " logger.error('Error occured: ', e)\n", - "Message: 'Error occured: '\n", - "Arguments: (ValueError('Invalid probability p=1.0109933236781294. It must be between 0 and 1.'),)\n", - "Process ForkPoolWorker-77:\n", - "Process ForkPoolWorker-78:\n", - "Traceback (most recent call last):\n", - "Traceback (most recent call last):\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/multiprocess/process.py\", line 317, in _bootstrap\n", - " util._exit_function()\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/multiprocess/util.py\", line 320, in _exit_function\n", - " def _exit_function(info=info, debug=debug, _run_finalizers=_run_finalizers,\n", - " \n", - " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py\", line 297, in _on_signal\n", - " os.kill(os.getpid(), signum)\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py\", line 297, in _on_signal\n", - " os.kill(os.getpid(), signum)\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/multiprocess/process.py\", line 314, in _bootstrap\n", - " self.run()\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py\", line 297, in _on_signal\n", - " os.kill(os.getpid(), signum)\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/multiprocess/process.py\", line 108, in run\n", - " self._target(*self._args, **self._kwargs)\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/multiprocess/pool.py\", line 120, in worker\n", - " util.debug('worker got sentinel -- exiting')\n", - " [Previous line repeated 2942 more times]\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py\", line 296, in _on_signal\n", - " self._on_exit()\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/multiprocess/util.py\", line 48, in debug\n", - " def debug(msg, *args):\n", - " \n", - " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py\", line 297, in _on_signal\n", - " os.kill(os.getpid(), signum)\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py\", line 290, in _on_exit\n", - " self.clear()\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py\", line 297, in _on_signal\n", - " os.kill(os.getpid(), signum)\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/diskcache/core.py\", line 2177, in clear\n", - " return self._select_delete(select, args, retry=retry)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/diskcache/core.py\", line 2187, in _select_delete\n", - " with self._transact(retry) as (sql, cleanup):\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py\", line 297, in _on_signal\n", - " os.kill(os.getpid(), signum)\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/contextlib.py\", line 137, in __enter__\n", - " return next(self.gen)\n", - " ^^^^^^^^^^^^^^\n", - " [Previous line repeated 2940 more times]\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py\", line 296, in _on_signal\n", - " self._on_exit()\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/diskcache/core.py\", line 710, in _transact\n", - " sql = self._sql\n", - " ^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/trade/helpers/helper.py\", line 290, in _on_exit\n", - " self.clear()\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/diskcache/core.py\", line 648, in _sql\n", - " return self._con.execute\n", - " ^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/diskcache/core.py\", line 2177, in clear\n", - " return self._select_delete(select, args, retry=retry)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/diskcache/core.py\", line 613, in _con\n", - " local_pid = getattr(self._local, 'pid', None)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/diskcache/core.py\", line 2187, in _select_delete\n", - " with self._transact(retry) as (sql, cleanup):\n", - "RecursionError: maximum recursion depth exceeded in comparison\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/contextlib.py\", line 137, in __enter__\n", - " return next(self.gen)\n", - " ^^^^^^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/diskcache/core.py\", line 710, in _transact\n", - " sql = self._sql\n", - " ^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/diskcache/core.py\", line 648, in _sql\n", - " return self._con.execute\n", - " ^^^^^^^^^\n", - " File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/diskcache/core.py\", line 613, in _con\n", - " local_pid = getattr(self._local, 'pid', None)\n", - " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - "RecursionError: maximum recursion depth exceeded in comparison\n" - ] - }, - { - "ename": "ValueError", - "evalue": "Invalid probability p=1.0109933236781294. It must be between 0 and 1.", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mRemoteTraceback\u001b[0m Traceback (most recent call last)", - "\u001b[0;31mRemoteTraceback\u001b[0m: \n\"\"\"\nTraceback (most recent call last):\n File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/multiprocess/pool.py\", line 125, in worker\n result = (True, func(*args, **kwds))\n ^^^^^^^^^^^^^^^^^^^\n File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/multiprocess/pool.py\", line 48, in mapstar\n return list(map(*args))\n ^^^^^^^^^^^^^^^^\n File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/pathos/helpers/mp_helper.py\", line 15, in \n func = lambda args: f(*args)\n ^^^^^^^^\n File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/vol/implied_vol.py\", line 158, in vector_vol_estimation\n estimated_vols = [brute_callable(*params) for params in list_input]\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/vol/implied_vol.py\", line 158, in \n estimated_vols = [brute_callable(*params) for params in list_input]\n ^^^^^^^^^^^^^^^^^^^^^^^\n File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/vol/implied_vol.py\", line 258, in estimate_crr_implied_volatility\n result = minimize_scalar(\n ^^^^^^^^^^^^^^^^\n File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/scipy/optimize/_minimize.py\", line 966, in minimize_scalar\n res = _minimize_scalar_bounded(fun, bounds, args, **options)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/Users/chiemelienwanisobi/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/scipy/optimize/_optimize.py\", line 2321, in _minimize_scalar_bounded\n fu = func(x, *args)\n ^^^^^^^^^^^^^^\n File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/vol/implied_vol.py\", line 244, in binomial_objective_function\n calculated_price = crr_binomial_pricing(\n ^^^^^^^^^^^^^^^^^^^^^\n File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/pricing/binomial.py\", line 208, in crr_binomial_pricing\n u, d, p = crr_init_parameters(sigma, r, T, N, div_yield=div_amount if dividend_type == 'continuous' else 0.0, dividend_type=dividend_type)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/pricing/binomial.py\", line 53, in crr_init_parameters\n raise ValueError(f\"Invalid probability p={p}. It must be between 0 and 1.\")\nValueError: Invalid probability p=1.0109933236781294. It must be between 0 and 1.\n\"\"\"", - "\nThe above exception was the direct cause of the following exception:\n", - "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[41], line 11\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mFinished Discrete in \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mtime\u001b[38;5;241m.\u001b[39mtime()\u001b[38;5;250m \u001b[39m\u001b[38;5;241m-\u001b[39m\u001b[38;5;250m \u001b[39mstart\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m seconds\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 10\u001b[0m start \u001b[38;5;241m=\u001b[39m time\u001b[38;5;241m.\u001b[39mtime()\n\u001b[0;32m---> 11\u001b[0m vol_batch_crr_cont \u001b[38;5;241m=\u001b[39m \u001b[43mvector_batch_processor\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 12\u001b[0m \u001b[43m \u001b[49m\u001b[43mvector_vol_estimation\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 13\u001b[0m \u001b[43m \u001b[49m\u001b[43mestimate_crr_implied_volatility\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 14\u001b[0m \u001b[43m \u001b[49m\u001b[43mcrr_vector_params_cont\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 15\u001b[0m \u001b[43m)\u001b[49m\n\u001b[1;32m 16\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mFinished Continuous in \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mtime\u001b[38;5;241m.\u001b[39mtime()\u001b[38;5;250m \u001b[39m\u001b[38;5;241m-\u001b[39m\u001b[38;5;250m \u001b[39mstart\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m seconds\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", - "File \u001b[0;32m~/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/utils/batch_operation.py:53\u001b[0m, in \u001b[0;36mvector_batch_processor\u001b[0;34m(callable, *args, **kwargs)\u001b[0m\n\u001b[1;32m 50\u001b[0m ordered_inputs\u001b[38;5;241m.\u001b[39mappend(split_arg)\n\u001b[1;32m 52\u001b[0m \u001b[38;5;66;03m# print(ordered_inputs)\u001b[39;00m\n\u001b[0;32m---> 53\u001b[0m results \u001b[38;5;241m=\u001b[39m \u001b[43mrunProcesses\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 54\u001b[0m \u001b[43m \u001b[49m\u001b[43mfunc\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mcallable\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 55\u001b[0m \u001b[43m \u001b[49m\u001b[43mOrderedInputs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mordered_inputs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 56\u001b[0m \u001b[43m \u001b[49m\u001b[43mrun_type\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mmap\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 57\u001b[0m res \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mlist\u001b[39m(chain\u001b[38;5;241m.\u001b[39mfrom_iterable(results))\n\u001b[1;32m 59\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m res\n", - "File \u001b[0;32m~/cloned_repos/QuantTools/trade/helpers/pools.py:46\u001b[0m, in \u001b[0;36mrunProcesses\u001b[0;34m(func, OrderedInputs, run_type)\u001b[0m\n\u001b[1;32m 44\u001b[0m pool\u001b[38;5;241m.\u001b[39mrestart(force\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[1;32m 45\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m run_type \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmap\u001b[39m\u001b[38;5;124m'\u001b[39m:\n\u001b[0;32m---> 46\u001b[0m results \u001b[38;5;241m=\u001b[39m \u001b[43mpool\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmap\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfunc\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mOrderedInputs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 47\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m run_type \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mamap\u001b[39m\u001b[38;5;124m'\u001b[39m:\n\u001b[1;32m 48\u001b[0m results \u001b[38;5;241m=\u001b[39m pool\u001b[38;5;241m.\u001b[39mamap(func, \u001b[38;5;241m*\u001b[39mOrderedInputs)\n", - "File \u001b[0;32m~/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/pathos/multiprocessing.py:135\u001b[0m, in \u001b[0;36mProcessPool.map\u001b[0;34m(self, f, *args, **kwds)\u001b[0m\n\u001b[1;32m 133\u001b[0m AbstractWorkerPool\u001b[38;5;241m.\u001b[39m_AbstractWorkerPool__map(\u001b[38;5;28mself\u001b[39m, f, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwds)\n\u001b[1;32m 134\u001b[0m _pool \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_serve()\n\u001b[0;32m--> 135\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43m_pool\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmap\u001b[49m\u001b[43m(\u001b[49m\u001b[43mstar\u001b[49m\u001b[43m(\u001b[49m\u001b[43mf\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mzip\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/multiprocess/pool.py:367\u001b[0m, in \u001b[0;36mPool.map\u001b[0;34m(self, func, iterable, chunksize)\u001b[0m\n\u001b[1;32m 362\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mmap\u001b[39m(\u001b[38;5;28mself\u001b[39m, func, iterable, chunksize\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m):\n\u001b[1;32m 363\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m'''\u001b[39;00m\n\u001b[1;32m 364\u001b[0m \u001b[38;5;124;03m Apply `func` to each element in `iterable`, collecting the results\u001b[39;00m\n\u001b[1;32m 365\u001b[0m \u001b[38;5;124;03m in a list that is returned.\u001b[39;00m\n\u001b[1;32m 366\u001b[0m \u001b[38;5;124;03m '''\u001b[39;00m\n\u001b[0;32m--> 367\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_map_async\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfunc\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43miterable\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmapstar\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mchunksize\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/multiprocess/pool.py:774\u001b[0m, in \u001b[0;36mApplyResult.get\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 772\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_value\n\u001b[1;32m 773\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 774\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_value\n", - "\u001b[0;31mValueError\u001b[0m: Invalid probability p=1.0109933236781294. It must be between 0 and 1." - ] - } - ], - "source": [ - "import time\n", - "start = time.time()\n", - "vol_batch_crr_discrete = vector_batch_processor(\n", - " vector_vol_estimation,\n", - " estimate_crr_implied_volatility,\n", - " crr_vector_params_discrete,\n", - ")\n", - "\n", - "print(f\"Finished Discrete in {time.time() - start} seconds\")\n", - "start = time.time()\n", - "vol_batch_crr_cont = vector_batch_processor(\n", - " vector_vol_estimation,\n", - " estimate_crr_implied_volatility,\n", - " crr_vector_params_cont,\n", - ")\n", - "print(f\"Finished Continuous in {time.time() - start} seconds\")" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\n", - "['2025-07-18 00:00:00', '2025-07-25 00:00:00', '2025-08-01 00:00:00',\n", - " '2025-08-08 00:00:00', '2025-08-15 00:00:00', '2025-08-22 00:00:00',\n", - " '2025-08-29 00:00:00', '2025-09-19 00:00:00', '2025-10-17 00:00:00',\n", - " '2025-11-21 00:00:00', '2025-12-19 00:00:00', '2026-01-16 00:00:00',\n", - " '2026-02-20 00:00:00', '2026-03-20 00:00:00', '2026-05-15 00:00:00',\n", - " '2026-06-18 00:00:00', '2026-09-18 00:00:00', '2026-12-18 00:00:00',\n", - " '2027-01-15 00:00:00', '2027-06-17 00:00:00', '2027-12-17 00:00:00']\n", - "Length: 21, dtype: datetime64[ns]" - ] - }, - "execution_count": 43, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "aapl_chain['crr_vol'] = vol_batch_crr\n", - "aapl_chain.Expiration.sort_values().unique()" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "hovertemplate": "variable=crr_vol
Strike=%{x}
value=%{y}", - "legendgroup": "crr_vol", - "line": { - "color": "#636efa", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "crr_vol", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": [ - 195, - 200, - 205, - 210, - 215, - 220, - 225, - 230, - 235, - 240, - 245, - 250, - 255, - 260, - 265, - 270, - 275, - 280, - 285, - 290, - 295, - 300, - 305, - 310, - 315, - 320, - 325, - 330, - 335, - 340, - 345, - 350, - 355, - 360, - 365, - 370, - 375, - 380, - 385, - 390, - 395, - 400, - 405, - 410, - 415, - 420, - 425, - 430, - 435, - 440 - ], - "xaxis": "x", - "y": [ - 0.2725618439235538, - 0.2633329430498516, - 0.2661143403938405, - 0.2589505740233532, - 0.2480277036823278, - 0.2591549217923299, - 0.2577722026112044, - 0.253772023340116, - 0.2538464472075328, - 0.25183732392271685, - 0.2530594753016646, - 0.24856619748597286, - 0.24617700887352673, - 0.24556736629696668, - 0.2473117655241653, - 0.24312775879719298, - 0.2424455448173008, - 0.2421741110918892, - 0.24094626516501996, - 0.23957334202943711, - 0.23930397476988852, - 0.23924764012244812, - 0.2389513147100834, - 0.23757104667162854, - 0.23694877062421343, - 0.2391020375478598, - 0.2396005668831895, - 0.23869510358360016, - 0.23826188034736304, - 0.24001712328381244, - 0.23479810409077617, - 0.235492415526492, - 0.23508155089659083, - 0.23790014848642907, - 0.23441685216186467, - 0.23618228729123392, - 0.23789785083913836, - 0.2393874496653081, - 0.23852673641763417, - 0.23796608965795227, - 0.23907172144186054, - 0.24096493598698843, - 0.2383828502316963, - 0.24205515808268002, - 0.24088319021797205, - 0.2358504418695725, - 0.23896202581095483, - 0.245514777190725, - 0.24234638338256115, - 0.24108233461303963 - ], - "yaxis": "y" - }, - { - "hovertemplate": "variable=bjs_vol
Strike=%{x}
value=%{y}", - "legendgroup": "bjs_vol", - "line": { - "color": "#EF553B", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "bjs_vol", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": [ - 195, - 200, - 205, - 210, - 215, - 220, - 225, - 230, - 235, - 240, - 245, - 250, - 255, - 260, - 265, - 270, - 275, - 280, - 285, - 290, - 295, - 300, - 305, - 310, - 315, - 320, - 325, - 330, - 335, - 340, - 345, - 350, - 355, - 360, - 365, - 370, - 375, - 380, - 385, - 390, - 395, - 400, - 405, - 410, - 415, - 420, - 425, - 430, - 435, - 440 - ], - "xaxis": "x", - "y": [ - 0.2827006925173129, - 0.2733273331833296, - 0.2752020050501262, - 0.267078426960674, - 0.25645528638215953, - 0.26732838320958024, - 0.2647038425960649, - 0.2608295207380184, - 0.26107947698692463, - 0.2583299582489562, - 0.25870489262231555, - 0.25470559263981596, - 0.25220603015075377, - 0.25083127078176953, - 0.25208105202630066, - 0.2484566864171604, - 0.24758183954598864, - 0.24658201455036374, - 0.2452072551813795, - 0.24433240831020775, - 0.2438324958123953, - 0.24320760519012974, - 0.24245773644341106, - 0.24158288957223928, - 0.24108297707442683, - 0.24295764894122351, - 0.2427076926923173, - 0.2418328458211455, - 0.2418328458211455, - 0.2437075176879422, - 0.23770856771419283, - 0.23783354583864594, - 0.23795852396309905, - 0.24095799894997372, - 0.2374586114652866, - 0.23895834895872395, - 0.24033310832770818, - 0.24133293332333305, - 0.24095799894997372, - 0.24070804270106752, - 0.2418328458211455, - 0.2437075176879422, - 0.24033310832770818, - 0.2438324958123953, - 0.2427076926923173, - 0.23820848021200527, - 0.24133293332333305, - 0.24795677391934798, - 0.24458236455911395, - 0.24258271456786418 - ], - "yaxis": "y" - } - ], - "layout": { - "legend": { - "title": { - "text": "variable" - }, - "tracegroupgap": 0 - }, - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "heatmapgl": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmapgl" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "title": { - "text": "AAPL Call Options Implied Volatility" - }, - "xaxis": { - "anchor": "y", - "domain": [ - 0, - 1 - ], - "title": { - "text": "Strike" - } - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0, - 1 - ], - "title": { - "text": "value" - } - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "aapl_chain.Expiration.unique()\n", - "aapl_chain[(aapl_chain['Expiration'] == '2027-12-17') & (aapl_chain['Right'] == 'C')].sort_values('Strike').tail(50).plot(y = ['crr_vol', \n", - " 'bjs_vol'], x='Strike', kind='line', title='AAPL Call Options Implied Volatility')" - ] - }, - { - "cell_type": "code", - "execution_count": 60, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([-1.66211164, 0.44585662, 0.43537571, ..., -1.95918893,\n", - " -1.3861209 , 0.61119484])" - ] - }, - "execution_count": 60, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "\n", - "bjs_greeks = bjs2002_numerical_greeks(\n", - " K=aapl_chain['Strike'].tolist(),\n", - " T=T,\n", - " r=r,\n", - " sigma=aapl_chain['bjs_vol'].tolist(),\n", - " S=s,\n", - " div_yield=q,\n", - " option_type=aapl_chain['Right'].str.lower().tolist(),\n", - ")\n", - "bjs_greeks['delta']" - ] - }, - { - "cell_type": "code", - "execution_count": 72, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Lengths: K=2428, expiration=2428, sigma=2428, r=2428, N=2428, S=2428, dividend_type=2428, option_type=2428, start_date=2428, valuation_date=2428, american=2428\n" - ] - } - ], - "source": [ - "binomial_greeks = binomial_tree_greeks(\n", - " K=aapl_chain['Strike'].tolist(),\n", - " expiration= aapl_chain['Expiration'].tolist(),\n", - " r=r,\n", - " sigma=aapl_chain['crr_vol'].tolist(),\n", - " S=s,\n", - " div_amount=discrete_q_convert,\n", - " option_type=aapl_chain['Right'].str.lower().tolist(),\n", - " N=100, # Number of steps in the binomial tree\n", - " dividend_type='discrete', # Dividend type\n", - " valuation_date=test_valuation_date, # Valuation date\n", - " american=True, # American options\n", - " start_date=test_valuation_date, # Start date for dividends\n", - "\n", - ")\n" - ] - }, - { - "cell_type": "code", - "execution_count": 62, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[0;31mSignature:\u001b[0m\n", - "\u001b[0mbinomial_tree_greeks\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mK\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m \u001b[0;34m|\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mndarray\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mexpiration\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m \u001b[0;34m|\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mndarray\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0msigma\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m \u001b[0;34m|\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mndarray\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m \u001b[0;34m|\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mndarray\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mN\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m \u001b[0;34m|\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mndarray\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mS\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m \u001b[0;34m|\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mndarray\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mdividend_type\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m \u001b[0;34m|\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mndarray\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mdiv_amount\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m \u001b[0;34m|\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mndarray\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0moption_type\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m \u001b[0;34m|\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mndarray\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mstart_date\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m \u001b[0;34m|\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mndarray\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mvaluation_date\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m \u001b[0;34m|\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mndarray\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mamerican\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m \u001b[0;34m|\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mndarray\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mDocstring:\u001b[0m\n", - "Calculate Greeks using a binomial tree model.\n", - "\n", - "Parameters:\n", - "- K: Strike price\n", - "- expiration: Expiration date of the option\n", - "- sigma: Volatility of the underlying asset\n", - "- r: Risk-free interest rate\n", - "- N: Number of time steps in the binomial tree\n", - "- spot_price: Current price of the underlying asset (optional)\n", - "- dividend_type: Type of dividend ('discrete' or 'continuous')\n", - "- div_amount: Amount of dividend (if applicable)\n", - "- option_type: 'c' for call, 'p' for put\n", - "- start_date: Start date for the option pricing (optional)\n", - "- valuation_date: Date for which the option is priced (optional)\n", - "\n", - "Returns:\n", - "Dictionary with calculated Greeks.\n", - "\u001b[0;31mFile:\u001b[0m ~/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/greeks/numerical/binomial.py\n", - "\u001b[0;31mType:\u001b[0m function" - ] - } - ], - "source": [ - "binomial_tree_greeks?" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "openbb_new_use", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.13" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/trade/optionlib/notebooks/black_scholes.ipynb b/trade/optionlib/notebooks/black_scholes.ipynb deleted file mode 100644 index 325577e..0000000 --- a/trade/optionlib/notebooks/black_scholes.ipynb +++ /dev/null @@ -1,773 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Console Logging & File Logging Can be configured using STREAM_LOG_LEVEL and FILE_LOG_LEVEL in environment variables.\n", - "Propagate to root logger can be set using PROPAGATE_TO_ROOT_LOGGER in environment variables.\n", - "Example:\n", - "STREAM_LOG_LEVEL = 'DEBUG'\n", - "FILE_LOG_LEVEL = 'INFO'\n", - "PROPAGATE_TO_ROOT_LOGGER = 'False'\n", - "\n", - "2025-07-23 23:57:36 trade.helpers.Logging INFO: Logging Root Directory: /Users/chiemelienwanisobi/cloned_repos/QuantTools/logs\n", - "Using Proxy URL: http://54.144.4.219:5500/thetadata\n" - ] - } - ], - "source": [ - "%load_ext autoreload\n", - "%autoreload 2\n", - "from module_test.raw_code.optionlib_2.pricing.black_scholes import (\n", - " BlackScholes,\n", - " MarketBlackScholes,\n", - " black_scholes_vectorized_market,\n", - ")\n", - "from datetime import datetime" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### TESTING" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Base Model" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### Discrete Dividends Pricing" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'forward': 214.8645784470177, 'strike': 210, 'T': 0.4462696783025325, 'r': 0.045, 'vol': 0.2725, 'type': 'c', 'price': 17.60284866827155}\n", - "{'spot': 210.85, 'forward': 214.8645784470177, 'type': 'discrete', 'valuation': datetime.date(2025, 7, 9), 'expiry': datetime.date(2025, 12, 19)}\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bs_model = BlackScholes(\n", - " strike_price=210,\n", - " expiration=datetime(2025, 12, 19),\n", - " risk_free_rate=0.045,\n", - " volatility=0.2725,\n", - " start_date=datetime(2023, 1, 1),\n", - " spot_price=210.85,\n", - " dividend_type='discrete',\n", - " valuation_date=datetime(2025, 7, 9),\n", - " freq='quarterly',\n", - " div_amount=0.26,\n", - " option_type='c'\n", - ")\n", - "print(bs_model.summary())\n", - "print(bs_model.forward.summary())\n", - "bs_model.forward.dividend\n", - "bs_model" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'delta': array(0.58582531),\n", - " 'gamma': 0.009962580537501141,\n", - " 'rho': 0.47200904637776536,\n", - " 'theta': -0.05978444198260355,\n", - " 'vega': 0.5593264832634446,\n", - " 'volga': 0.00015478263709686236}" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bs_model.set_greek_calculation_style('analytic')\n", - "(bs_model.greeks())" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'delta': 0.5858253086494187,\n", - " 'gamma': 0.010164673913553489,\n", - " 'rho': 0.47235573244424556,\n", - " 'theta': -0.058873690712538014,\n", - " 'vega': 0.5482060477821096,\n", - " 'volga': 0.00015137831603029753}" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bs_model.finite_estimator.method='central'\n", - "bs_model.set_greek_calculation_style('numerical')\n", - "bs_model.greeks()" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'forward': 214.09936459333818, 'strike': 210, 'T': 0.4462696783025325, 'r': 0.045, 'vol': 0.2757, 'type': 'p', 'price': 13.323998912169074}\n", - "{'spot': 210.1, 'forward': 214.09936459333818, 'type': 'discrete', 'valuation': datetime.date(2025, 7, 9), 'expiry': datetime.date(2025, 12, 19)}\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bs_model_put = BlackScholes(\n", - " strike_price=210,\n", - " expiration=datetime(2025, 12, 19),\n", - " risk_free_rate=0.045,\n", - " volatility=0.2757,\n", - " start_date=datetime(2023, 1, 1),\n", - " spot_price=210.10,\n", - " dividend_type='discrete',\n", - " valuation_date=datetime(2025, 7, 9),\n", - " freq='quarterly',\n", - " div_amount=0.26,\n", - " option_type='p'\n", - ")\n", - "print(bs_model_put.summary())\n", - "print(bs_model_put.forward.summary())\n", - "bs_model_put.forward.dividend\n", - "bs_model_put" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'delta': array(-0.42189165),\n", - " 'gamma': 0.009922637529837549,\n", - " 'rho': -0.4545474105116634,\n", - " 'theta': -0.05987609679442674,\n", - " 'vega': 0.5596184570322142,\n", - " 'volga': 5.1516364463452093e-05}" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bs_model_put.set_greek_calculation_style('analytic')\n", - "(bs_model_put.greeks())\n" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'delta': -0.4218916505427727,\n", - " 'gamma': 0.01012392946402011,\n", - " 'rho': -0.45479708198965024,\n", - " 'theta': -0.03382428316210273,\n", - " 'vega': 0.5484922166138241,\n", - " 'volga': 5.094636161262145e-05}" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bs_model_put.finite_estimator.method='central'\n", - "bs_model_put.set_greek_calculation_style('numerical')\n", - "(bs_model_put.greeks())\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### Continuous Dividend Pricing" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'forward': 215.1223860977551, 'strike': 210, 'T': 0.4462696783025325, 'r': 0.045, 'vol': 0.2725, 'type': 'c', 'price': 17.75120036942414}\n", - "{'spot': 210.85, 'forward': 215.1223860977551, 'type': 'continuous', 'valuation': datetime.date(2025, 7, 9), 'expiry': datetime.date(2025, 12, 19)}\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bs_model = BlackScholes(\n", - " strike_price=210,\n", - " expiration=datetime(2025, 12, 19),\n", - " risk_free_rate=0.045,\n", - " volatility=0.2725,\n", - " start_date=datetime(2023, 1, 1),\n", - " spot_price=210.85,\n", - " dividend_type='continuous',\n", - " valuation_date=datetime(2025, 7, 9),\n", - " freq='quarterly',\n", - " div_amount=1.2331041024424947e-05 * 4,\n", - " option_type='c'\n", - ")\n", - "print(bs_model.summary())\n", - "print(bs_model.forward.summary())\n", - "bs_model.forward.dividend\n", - "bs_model" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'delta': array(0.58839035),\n", - " 'gamma': 0.0099362237603873,\n", - " 'rho': 0.4744211445871562,\n", - " 'theta': -0.059839309369576855,\n", - " 'vega': 0.5591862221356935,\n", - " 'volga': 0.00018964403099594948}" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bs_model.set_greek_calculation_style('analytic')\n", - "(bs_model.greeks())" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'delta': 0.5883773962922071,\n", - " 'gamma': 0.010137328763478634,\n", - " 'rho': 0.4744211442660647,\n", - " 'theta': -0.058893465673126144,\n", - " 'vega': 0.5480685753177087,\n", - " 'volga': 0.00018568244137597491}" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bs_model.finite_estimator.method='central'\n", - "bs_model.set_greek_calculation_style('numerical')\n", - "bs_model.greeks()" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'forward': 214.35718908768482, 'strike': 210, 'T': 0.4462696783025325, 'r': 0.045, 'vol': 0.2757, 'type': 'p', 'price': 13.217710506842806}\n", - "{'spot': 210.1, 'forward': 214.35718908768482, 'type': 'continuous', 'valuation': datetime.date(2025, 7, 9), 'expiry': datetime.date(2025, 12, 19)}\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bs_model_put = BlackScholes(\n", - " strike_price=210,\n", - " expiration=datetime(2025, 12, 19),\n", - " risk_free_rate=0.045,\n", - " volatility=0.2757,\n", - " start_date=datetime(2023, 1, 1),\n", - " spot_price=210.10,\n", - " dividend_type='continuous',\n", - " valuation_date=datetime(2025, 7, 9),\n", - " freq='quarterly',\n", - " div_amount=1.2331041024424947e-05 * 4,\n", - " option_type='p'\n", - ")\n", - "print(bs_model_put.summary())\n", - "print(bs_model_put.forward.summary())\n", - "bs_model_put.forward.dividend\n", - "bs_model_put" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'delta': array(-0.41933655),\n", - " 'gamma': 0.009897738015178278,\n", - " 'rho': -0.45215321413234394,\n", - " 'theta': -0.059805006074437554,\n", - " 'vega': 0.5595594143299075,\n", - " 'volga': 8.02200697622426e-05}" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bs_model_put.set_greek_calculation_style('analytic')\n", - "(bs_model_put.greeks())\n" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'delta': -0.41932732401218403,\n", - " 'gamma': 0.01009806883384709,\n", - " 'rho': -0.4521532142081557,\n", - " 'theta': -0.0339107594961634,\n", - " 'vega': 0.5484343477403055,\n", - " 'volga': 7.861631213984337e-05}" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bs_model_put.finite_estimator.method='central'\n", - "bs_model_put.set_greek_calculation_style('numerical')\n", - "(bs_model_put.greeks())\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Market Model" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### Continuous Dividends" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[get_engine] Creating engine for DB: securities_master, PID: 29673\n", - "208.6199951171875\n", - "Forward Price: 211.94729151184956\n", - "BSM Price: 15.512748505148558\n" - ] - } - ], - "source": [ - "mbs=MarketBlackScholes(\n", - " ticker='AAPL',\n", - " strike_price=210,\n", - " expiration=datetime(2025, 12, 19),\n", - " risk_free_rate=None, # Use 0 to let the model use the dividend's risk-free rate\n", - " volatility=0.2678,\n", - " start_date=datetime(2023, 1, 3),\n", - " dividend_type='discrete',\n", - " valuation_date=datetime(2025, 7, 14),\n", - " option_type='c'\n", - ")\n", - "print(mbs.spot_price)\n", - "print(f\"Forward Price: {mbs.forward.get_forward_price()}\")\n", - "print(f\"BSM Price: {mbs.price()}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "numerical\n" - ] - }, - { - "data": { - "text/plain": [ - "{'delta': 0.5558560087961321,\n", - " 'gamma': 0.010777150478159912,\n", - " 'rho': 0.43387253917622887,\n", - " 'theta': -0.057459418105310966,\n", - " 'vega': 0.5406747178126954,\n", - " 'volga': -0.00010137965565221817}" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "print(mbs.get_greek_calculation_style())\n", - "mbs.set_greek_calculation_style('numerical')\n", - "mbs.greeks()" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'delta': array(0.55585601),\n", - " 'gamma': 0.010581650875179385,\n", - " 'rho': 0.4332824356194001,\n", - " 'theta': -0.058272410282780074,\n", - " 'vega': 0.5506638993040862,\n", - " 'volga': -0.00010301154988852094}" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "mbs.set_greek_calculation_style('analytic')\n", - "mbs.greeks()" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "208.6199951171875\n", - "Forward Price: 211.94729151184956\n", - "BSM Price: 13.871105818430156\n", - "analytic\n", - "EquityForward\n", - "MarketDividendSchedule\n", - "Stock\n" - ] - } - ], - "source": [ - "mbs=MarketBlackScholes(\n", - " ticker='AAPL',\n", - " strike_price=210,\n", - " expiration=datetime(2025, 12, 19),\n", - " risk_free_rate=None, # Use 0 to let the model use the dividend's risk-free rate\n", - " volatility=0.2728,\n", - " start_date=datetime(2023, 1, 3),\n", - " dividend_type='discrete',\n", - " valuation_date=datetime(2025, 7, 14),\n", - " option_type='p'\n", - ")\n", - "print(mbs.spot_price)\n", - "print(f\"Forward Price: {mbs.forward.get_forward_price()}\")\n", - "print(f\"BSM Price: {mbs.price()}\")\n", - "print(mbs.get_greek_calculation_style())\n", - "print(mbs.forward.__class__.__name__)\n", - "print(mbs.forward.dividend.__class__.__name__)\n", - "print(mbs.forward.dividend.asset.__class__.__name__)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "numerical\n" - ] - }, - { - "data": { - "text/plain": [ - "{'delta': -0.4438738884063381,\n", - " 'gamma': 0.010578602492142673,\n", - " 'rho': -0.46005495212701575,\n", - " 'theta': -0.034335234296367645,\n", - " 'vega': 0.5406226604282662,\n", - " 'volga': -0.00010707812300522983}" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "mbs.set_greek_calculation_style('numerical')\n", - "print(mbs.get_greek_calculation_style())\n", - "mbs.greeks()" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "analytic\n" - ] - }, - { - "data": { - "text/plain": [ - "{'delta': array(-0.44387389),\n", - " 'gamma': 0.010386705510666578,\n", - " 'rho': -0.45958372978984224,\n", - " 'theta': -0.05984361197862239,\n", - " 'vega': 0.5506108802057498,\n", - " 'volga': -0.00010902696444173094}" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "mbs.set_greek_calculation_style('analytic')\n", - "print(mbs.get_greek_calculation_style())\n", - "mbs.greeks()" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.0423199987411499" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "mbs.forward.risk_free_rate" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Vectorized Pricing" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Vectorized Black-Scholes Market Model Example (Discrete Dividend): [ 15.09713366 20.78417622 371.79467198]\n" - ] - } - ], - "source": [ - "print(\"Vectorized Black-Scholes Market Model Example (Discrete Dividend):\",\n", - " black_scholes_vectorized_market(\n", - " ticks=['AAPL', 'MSFT', 'GOOGL'],\n", - " S=[150, 250, 2800],\n", - " K=[150, 250, 2800],\n", - " valuation_dates=[datetime(2023, 1, 1), datetime(2023, 1, 1), datetime(2023, 1, 1)],\n", - " end_dates=[datetime(2024, 1, 1), datetime(2024, 1, 1), datetime(2024, 1, 1)],\n", - " r=[0.05, 0.04, 0.03],\n", - " sigma=[0.2, 0.25, 0.3],\n", - " option_type=['c', 'p', 'c'],\n", - " div_type='continuous'\n", - "))" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Vectorized Black-Scholes Market Model Example (Continuous Dividend): [ 15.08353295 20.91310523 371.79467198]\n" - ] - } - ], - "source": [ - "print(\"Vectorized Black-Scholes Market Model Example (Continuous Dividend):\",\n", - " black_scholes_vectorized_market(\n", - " ticks=['AAPL', 'MSFT', 'GOOGL'],\n", - " S=[150, 250, 2800],\n", - " K=[150, 250, 2800],\n", - " valuation_dates=[datetime(2023, 1, 1), datetime(2023, 1, 1), datetime(2023, 1, 1)],\n", - " end_dates=[datetime(2024, 1, 1), datetime(2024, 1, 1), datetime(2024, 1, 1)],\n", - " r=[0.05, 0.04, 0.03],\n", - " sigma=[0.2, 0.25, 0.3],\n", - " option_type=['c', 'p', 'c'], # Mixed option types\n", - " div_type='discrete'\n", - "))" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "openbb_new_use", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.13" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/trade/optionlib/notebooks/bsm_greeks.ipynb b/trade/optionlib/notebooks/bsm_greeks.ipynb deleted file mode 100644 index ad1fc13..0000000 --- a/trade/optionlib/notebooks/bsm_greeks.ipynb +++ /dev/null @@ -1,126 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Console Logging & File Logging Can be configured using STREAM_LOG_LEVEL and FILE_LOG_LEVEL in environment variables.\n", - "Propagate to root logger can be set using PROPAGATE_TO_ROOT_LOGGER in environment variables.\n", - "Example:\n", - "STREAM_LOG_LEVEL = 'DEBUG'\n", - "FILE_LOG_LEVEL = 'INFO'\n", - "PROPAGATE_TO_ROOT_LOGGER = 'False'\n", - "\n", - "2025-07-24 00:04:54 trade.helpers.Logging INFO: Logging Root Directory: /Users/chiemelienwanisobi/cloned_repos/QuantTools/logs\n", - "Using Proxy URL: http://54.144.4.219:5500/thetadata\n" - ] - } - ], - "source": [ - "%load_ext autoreload\n", - "%autoreload 2\n", - "from module_test.raw_code.optionlib_2.greeks import vectorized_market_greeks_bsm\n", - "from datetime import datetime " - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'delta': array([ 0.53760409, -0.40550645, 0.59867324]),\n", - " 'gamma': array([0.01110992, 0.00627671, 0.00046049]),\n", - " 'rho': array([ 0.41721394, -1.21053483, 13.03597517]),\n", - " 'theta': array([-0.05964481, -0.01953839, -0.55193583]),\n", - " 'vega': array([ 0.54379121, 0.95789124, 10.8232329 ]),\n", - " 'volga': array([-1.47766544e-04, -9.82822712e-05, -4.50641993e-03])}" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "vectorized_market_greeks_bsm(\n", - " ticks=['AAPL', 'MSFT', 'GOOGL'],\n", - " S=[211.12, 250, 2800],\n", - " K=[215, 250, 2800],\n", - " valuation_dates=[datetime(2025, 7, 18), datetime(2023, 1, 1), datetime(2023, 1, 1)],\n", - " end_dates=[datetime(2025, 12, 19), datetime(2024, 1, 1), datetime(2024, 1, 1)],\n", - " r=[0.05, 0.04, 0.03],\n", - " sigma=[0.2611, 0.25, 0.3],\n", - " option_type=['c', 'p', 'c'], \n", - " div_type='discrete',\n", - " greek_style='numerical'\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'delta': array([ 0.53088881, -0.40550645, 0.59867324]),\n", - " 'gamma': array([0.01422207, 0.00603076, 0.00044689]),\n", - " 'rho': array([ 0.42526334, -1.21053483, 13.03597517]),\n", - " 'theta': array([-0.04992309, -0.04740847, -0.56547187]),\n", - " 'vega': array([ 0.5561839 , 0.99695623, 11.1526204 ]),\n", - " 'volga': array([-0.00011286, -0.00010294, -0.00464374])}" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "vectorized_market_greeks_bsm(\n", - " ticks=['AAPL', 'MSFT', 'GOOGL'],\n", - " S=[211.12, 250, 2800],\n", - " K=[215, 250, 2800],\n", - " valuation_dates=[datetime(2025, 7, 18), datetime(2023, 1, 1), datetime(2023, 1, 1)],\n", - " end_dates=[datetime(2025, 12, 19), datetime(2024, 1, 1), datetime(2024, 1, 1)],\n", - " r=[0.05, 0.04, 0.03],\n", - " sigma=[0.2, 0.25, 0.3],\n", - " option_type=['c', 'p', 'c'], \n", - " div_type='discrete',\n", - " greek_style='analytic'\n", - ")" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "openbb_new_use", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.13" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/trade/optionlib/notebooks/bsm_implied_vols.ipynb b/trade/optionlib/notebooks/bsm_implied_vols.ipynb deleted file mode 100644 index 895eb89..0000000 --- a/trade/optionlib/notebooks/bsm_implied_vols.ipynb +++ /dev/null @@ -1,2342 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The autoreload extension is already loaded. To reload it, use:\n", - " %reload_ext autoreload\n" - ] - } - ], - "source": [ - "%load_ext autoreload\n", - "%autoreload 2\n", - "from module_test.raw_code.optionlib_2.vol.implied_vol import (\n", - " bsm_vol_est_brute_force,\n", - " bsm_vol_est_minimization,\n", - " vector_vol_estimation\n", - ")\n", - "from module_test.raw_code.optionlib_2.assets.forward import (\n", - " EquityForward, \n", - " time_distance_helper,\n", - " vectorized_market_forward_calc\n", - ")\n", - "from datetime import datetime\n", - "from dbase.DataAPI.ThetaData import retrieve_chain_bulk\n", - "from trade.helpers.helper import change_to_last_busday, retrieve_timeseries\n", - "import os\n", - "os.environ['PROXY_URL'] = ''\n", - "def get_spot(tick, date):\n", - " return retrieve_timeseries(tick, date, date)['close'][0]\n", - "test_start, test_valuation_date = '2025-07-16', '2025-07-16'" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\n", - "pd.options.plotting.backend = \"plotly\"" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(213.46615757988374, 0.0423199987411499)" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "mkt_forward = EquityForward(\n", - " start_date=test_start,\n", - " end_date=datetime(2025, 12, 19),\n", - " ticker='AAPL',\n", - " valuation_date=test_valuation_date,\n", - " risk_free_rate=None,\n", - " dividend_type='discrete',\n", - " dividend=None, # Market dividend will be set later\n", - "\n", - ")\n", - "mkt_forward.get_forward_price(), mkt_forward.risk_free_rate" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.2677398648854257" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rates = mkt_forward.risk_free_rate\n", - "bsm_vol_est_minimization(\n", - " F=mkt_forward.get_forward_price(), # Forward price\n", - " K=220, # Strike price\n", - " T=time_distance_helper('2025-12-19', test_valuation_date), # Time to maturity in years\n", - " r=mkt_forward.risk_free_rate, # Risk-free rate\n", - " market_price=11.85, # Market price of the option\n", - " option_type='c' # Option type: 'c' for call\n", - ")\n" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.2677033175829395" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bsm_vol_est_brute_force(\n", - " F=mkt_forward.get_forward_price(), # Forward price\n", - " K=220, # Strike price\n", - " T=time_distance_helper('2025-12-19', test_start), # Time to maturity in years\n", - " r=mkt_forward.risk_free_rate, # Risk-free rate\n", - " market_price=11.85, # Market price of the option\n", - " option_type='c' # Option type: 'c' for call\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Test Vol Surface Fit" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "aapl_chain=retrieve_chain_bulk(\n", - " 'AAPL',\n", - " 0,\n", - " change_to_last_busday(test_valuation_date),\n", - " change_to_last_busday(test_valuation_date),\n", - " '16:00'\n", - "\n", - ")\n", - "S = get_spot('AAPL', (test_valuation_date))" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([211.06290119, 211.23415549, 211.06290119, ..., 210.72080899,\n", - " 217.71608065, 217.71608065])" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "aapl_chain = aapl_chain[aapl_chain['Expiration'] >= test_valuation_date]\n", - "valuation_dates = [test_valuation_date] * len(aapl_chain)\n", - "end_dates = aapl_chain['Expiration'].tolist()\n", - "r = [rates] * len(aapl_chain)\n", - "s = [S] * len(aapl_chain)\n", - "tickers = ['AAPL'] * len(aapl_chain)\n", - "F = vectorized_market_forward_calc(\n", - " ticks=tickers,\n", - " S=s,\n", - " valuation_dates=valuation_dates,\n", - " end_dates=end_dates,\n", - " r=r,\n", - " div_type='discrete'\n", - ")\n", - "F" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[0;31mSignature:\u001b[0m\n", - "\u001b[0mbsm_vol_est_brute_force\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mF\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mK\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mT\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mmarket_price\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0moption_type\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'c'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mDocstring:\u001b[0m\n", - "Brute force method to estimate implied volatility by minimizing the difference\n", - "between the market price and the Black-Scholes price.\n", - "Parameters:\n", - "- F: Forward price\n", - "- K: Strike price\n", - "- T: Time to maturity\n", - "- r: Risk-free rate\n", - "- market_price: Market price of the option\n", - "- option_type: 'c' for call, 'p' for put\n", - "Returns:\n", - "- Estimated volatility\n", - "\u001b[0;31mFile:\u001b[0m ~/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/vol/implied_vol.py\n", - "\u001b[0;31mType:\u001b[0m function" - ] - } - ], - "source": [ - "bsm_vol_est_brute_force?" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "params = list(zip(\n", - " F, \n", - " aapl_chain['Strike'], \n", - " [time_distance_helper(end_date, test_valuation_date) for end_date in aapl_chain['Expiration']], \n", - " r, \n", - " aapl_chain['Midpoint'], \n", - " aapl_chain['Right'].str.lower()\n", - "))\n" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.0423199987411499" - ] - }, - "execution_count": 39, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "S\n", - "rates" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[0.29094924873121825,\n", - " 0.2747020925523138,\n", - " 0.27845143628590713,\n", - " 0.28082602065051626,\n", - " 0.27020288007200177,\n", - " 0.26982794569864244,\n", - " 0.26320410510262754,\n", - " 0.27107772694317356,\n", - " 0.2627041926048151,\n", - " 0.26620358008950223,\n", - " 0.2628291707292682,\n", - " 0.2707027925698142,\n", - " 0.2752020050501262,\n", - " 0.27570191754793866,\n", - " 0.2845753643841096,\n", - " 0.28157588939723494,\n", - " 0.23483407085177127,\n", - " 0.316444786119653,\n", - " 0.24070804270106752,\n", - " 0.31319535488387207,\n", - " 0.2683282082052051,\n", - " 0.27407720193004825,\n", - " 0.2687031425785644,\n", - " 0.27095274881872045,\n", - " 0.276076851921298,\n", - " 0.2870749268731718,\n", - " 0.2869499487487187,\n", - " 0.276076851921298,\n", - " 0.24345756143903596,\n", - " 0.2745771144278607,\n", - " 0.29657326433160824,\n", - " 0.22383599589989747,\n", - " 0.3115706392659816,\n", - " 0.32756783919597987,\n", - " 0.2961983299582489,\n", - " 0.3080712517812945,\n", - " 0.2969481987049676,\n", - " 0.31382024550613763,\n", - " 0.27095274881872045,\n", - " 0.2770766769169229,\n", - " 0.2793262831570789,\n", - " 0.2733273331833296,\n", - " 0.28857466436660917,\n", - " 0.2958233955848896,\n", - " 0.27570191754793866,\n", - " 0.26807825195629886,\n", - " 0.27007790194754866,\n", - " 0.25882987074676866,\n", - " 0.2896994674866871,\n", - " 0.2725774644366109,\n", - " 0.2685781644541113,\n", - " 0.25758008950223754,\n", - " 0.2638289957248931,\n", - " 0.25683022075551887,\n", - " 0.26720340508512713,\n", - " 0.27107772694317356,\n", - " 0.2618293457336433,\n", - " 0.28245073626840667,\n", - " 0.34493979849496237,\n", - " 0.5442799069976749,\n", - " 0.3116956173904347,\n", - " 0.2858251456286407,\n", - " 0.2504563364084102,\n", - " 0.3046968424210605,\n", - " 0.26332908322708065,\n", - " 0.26545371134278356,\n", - " 0.26445388634715866,\n", - " 0.2705778144453611,\n", - " 0.27195257381434534,\n", - " 0.26645353633840846,\n", - " 0.2650787769694242,\n", - " 0.29494854871371784,\n", - " 0.3778090452261306,\n", - " 0.2744521363034076,\n", - " 0.1136052901322533,\n", - " 0.2655786894672367,\n", - " 0.2935737893447336,\n", - " 0.30319710492762314,\n", - " 0.26145441136028397,\n", - " 0.3105708142703567,\n", - " 0.30857116427910697,\n", - " 0.2914491612290307,\n", - " 0.2750770269256731,\n", - " 0.27582689567239177,\n", - " 0.26645353633840846,\n", - " 0.28819972999324983,\n", - " 0.28320060501512534,\n", - " 0.26545371134278356,\n", - " 0.26982794569864244,\n", - " 0.2677033175829395,\n", - " 0.25308087702192555,\n", - " 0.2602046301157529,\n", - " 0.268203230080752,\n", - " 0.2667034925873147,\n", - " 0.2583299582489562,\n", - " 0.26645353633840846,\n", - " 0.2517061176529413,\n", - " 0.256955198879972,\n", - " 0.2812009550238756,\n", - " 0.26882812070301754,\n", - " 0.43117470436760913,\n", - " 0.5496539663491586,\n", - " 0.27295239880997024,\n", - " 0.33519150478761967,\n", - " 0.31219552988824717,\n", - " 0.32619307982699564,\n", - " 0.2608295207380184,\n", - " 0.2705778144453611,\n", - " 0.25857991449786244,\n", - " 0.26345406135153376,\n", - " 0.26932803320083,\n", - " 0.28520025500637514,\n", - " 0.37118520463011573,\n", - " 0.283950473761844,\n", - " 0.2849502987574689,\n", - " 0.27082777069426733,\n", - " 0.2629541488537213,\n", - " 0.29182409560239003,\n", - " 0.27482707067676687,\n", - " 0.25583039575989397,\n", - " 0.3190693267331683,\n", - " 0.6382634565864146,\n", - " 0.43129968249206224,\n", - " 0.29182409560239003,\n", - " 0.3136952673816845,\n", - " 0.3055716892922323,\n", - " 0.26645353633840846,\n", - " 0.277201655041376,\n", - " 0.27420218005450137,\n", - " 0.26657851446286157,\n", - " 0.2924489862246556,\n", - " 0.2505813145328633,\n", - " 0.27845143628590713,\n", - " 0.2717026175654391,\n", - " 0.2615793894847371,\n", - " 0.2859501237530938,\n", - " 0.26345406135153376,\n", - " 0.2484566864171604,\n", - " 0.27970121753043825,\n", - " 0.2572051551288782,\n", - " 0.26545371134278356,\n", - " 0.2744521363034076,\n", - " 0.2539557238930973,\n", - " 0.4236760169004225,\n", - " 0.26345406135153376,\n", - " 0.3045718642966074,\n", - " 0.47766656666416657,\n", - " 0.7016273656841421,\n", - " 0.3373161329033226,\n", - " 0.3179445236130903,\n", - " 0.27020288007200177,\n", - " 0.2579550238755969,\n", - " 0.2650787769694242,\n", - " 0.2542056801420035,\n", - " 0.2570801770044251,\n", - " 0.26932803320083,\n", - " 0.259204805120128,\n", - " 0.2667034925873147,\n", - " 0.29394872371809294,\n", - " 0.2723275081877047,\n", - " 0.7347465686642165,\n", - " 0.5231586039650991,\n", - " 0.32081902047551186,\n", - " 0.44017312932823316,\n", - " 0.324318407960199,\n", - " 0.3403156078901972,\n", - " 0.3221937798444961,\n", - " 0.29682322058051447,\n", - " 0.25970471761794045,\n", - " 0.2770766769169229,\n", - " 0.2745771144278607,\n", - " 0.3068214705367634,\n", - " 0.27095274881872045,\n", - " 0.27395222380559514,\n", - " 0.2607045426135653,\n", - " 0.28982444561114024,\n", - " 0.24933153328833219,\n", - " 0.2814509112727818,\n", - " 0.28345056126403156,\n", - " 0.2639539738493462,\n", - " 0.2523310082752069,\n", - " 0.24570716767919196,\n", - " 0.268203230080752,\n", - " 0.2619543238580964,\n", - " 0.2802011300282507,\n", - " 0.2495814895372384,\n", - " 0.8504763119077976,\n", - " 0.5679007725193129,\n", - " 0.2507062926573164,\n", - " 0.2542056801420035,\n", - " 0.26757833945848647,\n", - " 0.260329608240206,\n", - " 0.2847003425085627,\n", - " 0.264828820720518,\n", - " 0.2845753643841096,\n", - " 0.264828820720518,\n", - " 0.26420393009825244,\n", - " 0.35156363909097726,\n", - " 0.29207405185129626,\n", - " 0.5260331008275206,\n", - " 0.611768094202355,\n", - " 0.8514761369034225,\n", - " 0.30619657991449784,\n", - " 0.35931228280707017,\n", - " 0.336691242281057,\n", - " 0.27557693942348555,\n", - " 0.38168336708417705,\n", - " 0.25658026450661264,\n", - " 0.28320060501512534,\n", - " 0.3308172704317608,\n", - " 0.31694469861746544,\n", - " 0.27207755193879846,\n", - " 0.26370401760044,\n", - " 0.2717026175654391,\n", - " 0.2904493362334058,\n", - " 0.2504563364084102,\n", - " 0.26345406135153376,\n", - " 0.2494565114127853,\n", - " 0.28819972999324983,\n", - " 0.28819972999324983,\n", - " 0.24408245206130152,\n", - " 0.276076851921298,\n", - " 0.27407720193004825,\n", - " 0.24670699267481686,\n", - " 0.259204805120128,\n", - " 1.0414428860721516,\n", - " 0.6548855471386784,\n", - " 0.2809509987749694,\n", - " 0.24783179579489487,\n", - " 0.26532873321833045,\n", - " 0.2879497737443436,\n", - " 0.260329608240206,\n", - " 0.27420218005450137,\n", - " 0.6972531313282831,\n", - " 0.9224637115927897,\n", - " 0.25083127078176953,\n", - " 0.35131368284207104,\n", - " 0.2743271581789545,\n", - " 0.39993017325433133,\n", - " 0.25020638015950397,\n", - " 0.27307737693442335,\n", - " 0.2916991174779369,\n", - " 0.3706852921323033,\n", - " 0.2515811395284882,\n", - " 0.31969421735543385,\n", - " 0.26907807695192376,\n", - " 0.5905218130453261,\n", - " 0.3744346358658966,\n", - " 0.316444786119653,\n", - " 0.4253007325183129,\n", - " 0.2495814895372384,\n", - " 0.25370576764419106,\n", - " 0.2809509987749694,\n", - " 0.27682672066801667,\n", - " 0.24433240831020775,\n", - " 0.3543131578289457,\n", - " 0.27882637065926646,\n", - " 0.2793262831570789,\n", - " 0.25195607390184754,\n", - " 0.27407720193004825,\n", - " 0.3104458361459036,\n", - " 0.2450822770569264,\n", - " 0.2866999924998125,\n", - " 0.2439574739368484,\n", - " 0.259204805120128,\n", - " 0.28232575814395355,\n", - " 0.25645528638215953,\n", - " 0.28632505812645315,\n", - " 0.2600796519912998,\n", - " 0.28232575814395355,\n", - " 0.2605795644891122,\n", - " 0.29669824245606136,\n", - " 1.0725624390609763,\n", - " 0.7801136278406959,\n", - " 0.24820673016825417,\n", - " 0.46516875421885545,\n", - " 0.36856066401660037,\n", - " 0.27682672066801667,\n", - " 0.4118030950773769,\n", - " 0.3021972799319983,\n", - " 0.6526359408985224,\n", - " 0.40567916697917444,\n", - " 0.27582689567239177,\n", - " 0.36668599214980374,\n", - " 0.27957623940598514,\n", - " 0.25095624890622265,\n", - " 0.3335667891697292,\n", - " 0.43454911372784316,\n", - " 0.2472069051726293,\n", - " 0.2926989424735618,\n", - " 0.2879497737443436,\n", - " 0.29207405185129626,\n", - " 0.37918380459511486,\n", - " 0.24308262706567663,\n", - " 0.2562053301332533,\n", - " 0.33806600165004125,\n", - " 0.2428326708167704,\n", - " 0.2903243581089527,\n", - " 0.28182584564614116,\n", - " 0.2583299582489562,\n", - " 0.24533223330583262,\n", - " 0.2905743143578589,\n", - " 0.2539557238930973,\n", - " 0.2579550238755969,\n", - " 0.2979480237005925,\n", - " 0.2840754518862971,\n", - " 1.3595122128053199,\n", - " 0.8604745618640466,\n", - " 0.5502788569714242,\n", - " 0.38118345458636466,\n", - " 0.31207055176379406,\n", - " 0.4462970574264356,\n", - " 0.27657676441911044,\n", - " 0.24758183954598864,\n", - " 0.28207580189504733,\n", - " 0.4070539263481587,\n", - " 0.24570716767919196,\n", - " 0.28157588939723494,\n", - " 0.32644303607590186,\n", - " 0.2799511737793445,\n", - " 0.2472069051726293,\n", - " 0.25008140203505086,\n", - " 0.2427076926923173,\n", - " 0.3030721268031701,\n", - " 0.7126254406360158,\n", - " 0.404054451361284,\n", - " 0.24158288957223928,\n", - " 0.29307387684692116,\n", - " 0.3465645141128528,\n", - " 0.46691844796119897,\n", - " 0.2925739643491087,\n", - " 0.24870664266606662,\n", - " 0.2542056801420035,\n", - " 0.285075276881922,\n", - " 0.25570541763544086,\n", - " 0.39055681392034797,\n", - " 0.28982444561114024,\n", - " 0.2969481987049676,\n", - " 0.29294889872246804,\n", - " 0.2583299582489562,\n", - " 1.4717425685642138,\n", - " 0.9387108677716942,\n", - " 0.3644363859096477,\n", - " 0.5396557163929098,\n", - " 0.3976805670141753,\n", - " 0.2602046301157529,\n", - " 0.33606635165879145,\n", - " 0.24683197079926997,\n", - " 0.32831770794269854,\n", - " 0.4761668291707292,\n", - " 0.25220603015075377,\n", - " 0.2799511737793445,\n", - " 0.29194907372684314,\n", - " 0.4225512137803445,\n", - " 0.24445738643466086,\n", - " 0.296323308082702,\n", - " 0.24783179579489487,\n", - " 0.3354414610365259,\n", - " 0.24233275831895795,\n", - " 0.31494504862621564,\n", - " 0.754368134203355,\n", - " 0.44092299807495183,\n", - " 0.2417078676966924,\n", - " 0.4970381759543988,\n", - " 0.30857116427910697,\n", - " 0.3556879171979299,\n", - " 0.24670699267481686,\n", - " 0.29307387684692116,\n", - " 0.29657326433160824,\n", - " 0.41155313882847067,\n", - " 0.30732138303457585,\n", - " 0.2543306582664566,\n", - " 1.6052192054801369,\n", - " 1.0146975674391858,\n", - " 0.26657851446286157,\n", - " 0.38255821395534884,\n", - " 0.6395132378309457,\n", - " 0.4138027450686267,\n", - " 0.29219902997574937,\n", - " 0.25545546138653463,\n", - " 0.3489390984774619,\n", - " 0.24983144578614463,\n", - " 0.514035200880022,\n", - " 0.24970646766169152,\n", - " 0.337816045401135,\n", - " 0.28420043001075024,\n", - " 0.2991978049451236,\n", - " 0.42755033875846893,\n", - " 0.3384409360234006,\n", - " 0.24933153328833219,\n", - " 0.2437075176879422,\n", - " 0.34294014850371257,\n", - " 0.3056966674166854,\n", - " 0.24320760519012974,\n", - " 0.3250682767069176,\n", - " 0.24145791144778617,\n", - " 0.3011974549363734,\n", - " 0.24258271456786418,\n", - " 0.25095624890622265,\n", - " 0.3058216455411385,\n", - " 0.24645703642591063,\n", - " 0.25195607390184754,\n", - " 0.29294889872246804,\n", - " 0.29969771744293605,\n", - " 0.3036970174254356,\n", - " 0.7611169529238231,\n", - " 0.4767917197929948,\n", - " 0.25183109577739443,\n", - " 1.4762417810445259,\n", - " 1.0888095952398809,\n", - " 0.3756844171104277,\n", - " 0.4934138103452586,\n", - " 0.6822557563939098,\n", - " 0.43354928873221826,\n", - " 0.2955734393359834,\n", - " 0.24483232080802017,\n", - " 0.3730598764969124,\n", - " 0.4739172229305732,\n", - " 0.5662760569014225,\n", - " 0.31744461111527783,\n", - " 0.4891645541138528,\n", - " 0.2723275081877047,\n", - " 0.30844618615465386,\n", - " 0.41805200130003245,\n", - " 0.25358078951973795,\n", - " 0.3708102702567564,\n", - " 0.24895659891497285,\n", - " 0.29682322058051447,\n", - " 0.251331183279582,\n", - " 0.36943551088777216,\n", - " 0.3619368234205855,\n", - " 0.2438324958123953,\n", - " 0.2427076926923173,\n", - " 0.3158198954973874,\n", - " 0.34369001725043125,\n", - " 0.24158288957223928,\n", - " 0.8730973524338108,\n", - " 0.511785594639866,\n", - " 0.2504563364084102,\n", - " 0.31219552988824717,\n", - " 0.3069464486612165,\n", - " 1.7885621140528511,\n", - " 1.161046951173779,\n", - " 0.24358253956348908,\n", - " 0.4329243981099527,\n", - " 0.627515337883447,\n", - " 0.5614019100477512,\n", - " 0.44117295432385806,\n", - " 0.5306572914322858,\n", - " 0.32731788294707365,\n", - " 0.5841479286982174,\n", - " 0.3553129828245706,\n", - " 0.2770766769169229,\n", - " 0.4415478886972174,\n", - " 0.31844443611090273,\n", - " 0.25195607390184754,\n", - " 0.5181594789869747,\n", - " 0.2999476736918423,\n", - " 0.2573301332533313,\n", - " 0.4110532263306582,\n", - " 0.38005865146628665,\n", - " 0.3030721268031701,\n", - " 0.25345581139528484,\n", - " 0.24795677391934798,\n", - " 0.3629366484162104,\n", - " 0.24558218955473884,\n", - " 0.24145791144778617,\n", - " 0.36481132028300706,\n", - " 0.24820673016825417,\n", - " 0.31282042051051273,\n", - " 0.3346915922898072,\n", - " 0.31182059551488783,\n", - " 0.2405830645766144,\n", - " 0.24870664266606662,\n", - " 0.31694469861746544,\n", - " 0.24095799894997372,\n", - " 0.2517061176529413,\n", - " 0.3249432985824645,\n", - " 1.7921864796619913,\n", - " 1.231659591489787,\n", - " 0.24408245206130152,\n", - " 0.31482007050176253,\n", - " 0.4591698042451061,\n", - " 0.7321220280507013,\n", - " 0.5459046226155654,\n", - " 0.9437099927498187,\n", - " 0.6261405785144628,\n", - " 0.6501363784094601,\n", - " 0.3764342858571464,\n", - " 0.46329408235205877,\n", - " 0.32356853921348033,\n", - " 0.5251582539563489,\n", - " 0.24258271456786418,\n", - " 0.32831770794269854,\n", - " 0.3390658266456661,\n", - " 0.5385309132728318,\n", - " 0.2859501237530938,\n", - " 0.49966271656791417,\n", - " 0.41667724193104827,\n", - " 0.26107947698692463,\n", - " 0.41030335758393954,\n", - " 0.3046968424210605,\n", - " 0.25470559263981596,\n", - " 0.24545721143028573,\n", - " 0.40217977949448735,\n", - " 0.24670699267481686,\n", - " 0.3794337608440211,\n", - " 0.23895834895872395,\n", - " 0.2427076926923173,\n", - " 0.3526884422110553,\n", - " 0.9682057051426285,\n", - " 0.5791488037200929,\n", - " 0.31594487362184054,\n", - " 0.24820673016825417,\n", - " 0.48991442286057146,\n", - " 0.7091260531513287,\n", - " 1.8864199854996373,\n", - " 1.3005225380634513,\n", - " 0.3358163954098852,\n", - " 0.24158288957223928,\n", - " 0.7637414935373383,\n", - " 0.4846653416335408,\n", - " 0.5655261881547038,\n", - " 0.34743936098402456,\n", - " 0.4857901447536188,\n", - " 0.6480117502937572,\n", - " 0.2905743143578589,\n", - " 0.39705567639190975,\n", - " 0.2495814895372384,\n", - " 0.5394057601440035,\n", - " 0.31482007050176253,\n", - " 0.33519150478761967,\n", - " 0.43992317307932693,\n", - " 0.26532873321833045,\n", - " 0.33144216105402635,\n", - " 0.24445738643466086,\n", - " 0.2582049801245031,\n", - " 0.4300499012475312,\n", - " 0.2484566864171604,\n", - " 0.42030160754018847,\n", - " 0.3978055451386284,\n", - " 0.24358253956348908,\n", - " 0.24633205830145752,\n", - " 0.32856766419160477,\n", - " 0.36693594839870997,\n", - " 0.32744286107152676,\n", - " 0.2427076926923173,\n", - " 0.3596872171804295,\n", - " 0.24670699267481686,\n", - " 0.24070804270106752,\n", - " 0.24733188329708242,\n", - " 0.32169386734668365,\n", - " 2.0807609690242255,\n", - " 1.3680107252681315,\n", - " 0.24295764894122351,\n", - " 0.34256521413035323,\n", - " 0.509660966524163,\n", - " 0.8233560589014725,\n", - " 1.0375685642141053,\n", - " 0.6116431160779019,\n", - " 0.6921290282257055,\n", - " 0.703751993799845,\n", - " 0.41817697942448556,\n", - " 0.39455611390284756,\n", - " 0.3409404985124628,\n", - " 0.24145791144778617,\n", - " 0.5986453911347783,\n", - " 0.35618782969574236,\n", - " 0.5975205880147003,\n", - " 0.3566877421935548,\n", - " 0.5179095227380685,\n", - " 0.29682322058051447,\n", - " 0.4615443886097152,\n", - " 0.26932803320083,\n", - " 0.24358253956348908,\n", - " 0.26120445511137774,\n", - " 0.4361738293457336,\n", - " 0.3353164829120728,\n", - " 0.2505813145328633,\n", - " 0.4357988949723743,\n", - " 0.38768231705792644,\n", - " 0.24295764894122351,\n", - " 0.24495729893247328,\n", - " 0.4158023950598765,\n", - " 1.0773116077901945,\n", - " 0.6433875596889922,\n", - " 0.32719290482262053,\n", - " 0.24633205830145752,\n", - " 0.35243848596214905,\n", - " 0.24070804270106752,\n", - " 1.4338741968549211,\n", - " 2.20386442161054,\n", - " 0.4005550638765969,\n", - " 0.7376210655266381,\n", - " 0.8389783244581114,\n", - " 0.5047868196704918,\n", - " 0.6142676566914173,\n", - " 0.37480957023925593,\n", - " 0.5479042726068152,\n", - " 0.4024297357433936,\n", - " 0.3049467986699667,\n", - " 0.7224987124678116,\n", - " 0.328817620440511,\n", - " 0.34718940473511833,\n", - " 0.24733188329708242,\n", - " 0.6226411910297757,\n", - " 0.27420218005450137,\n", - " 0.49403870096752417,\n", - " 0.347939273481837,\n", - " 0.2437075176879422,\n", - " 0.2638289957248931,\n", - " 0.4671684042101052,\n", - " 0.25295589889747244,\n", - " 0.455670416760419,\n", - " 0.4346740918522963,\n", - " 0.24670699267481686,\n", - " 0.2452072551813795,\n", - " 0.35706267656691415,\n", - " 0.343440061001525,\n", - " 0.24645703642591063,\n", - " 0.40217977949448735,\n", - " 0.24483232080802017,\n", - " 0.33606635165879145,\n", - " 0.24145791144778617,\n", - " 1.4983629090727266,\n", - " 2.2639788994724865,\n", - " 0.3889320983024575,\n", - " 0.24195782394559862,\n", - " 0.527532838320958,\n", - " 0.8675983149578739,\n", - " 0.24583214580364507,\n", - " 0.4204265856646416,\n", - " 0.37593437335933394,\n", - " 0.745369709242731,\n", - " 0.6745071126778169,\n", - " 1.1447997949948747,\n", - " 0.6556354158853971,\n", - " 0.44554718867971693,\n", - " 0.4445473636840921,\n", - " 0.7197491937298431,\n", - " 0.37043533588339705,\n", - " 0.24083302082552063,\n", - " 0.6508862471561788,\n", - " 0.4359238730968274,\n", - " 0.31107072676816916,\n", - " 0.5632765819145478,\n", - " 0.48204080102002544,\n", - " 0.2667034925873147,\n", - " 0.2780765019125478,\n", - " 0.5067864696617415,\n", - " 0.47529198229955744,\n", - " 0.3630616265406635,\n", - " 0.2550805270131753,\n", - " 0.24320760519012974,\n", - " 0.24820673016825417,\n", - " 0.44192282307057673,\n", - " 0.24495729893247328,\n", - " 0.4168022200555014,\n", - " 0.34468984224605614,\n", - " 0.2439574739368484,\n", - " 0.7048767969199229,\n", - " 1.1161798044951121,\n", - " 1.5614768619215478,\n", - " 2.3525883897097426,\n", - " 0.7787388684717117,\n", - " 0.4644188854721368,\n", - " 0.8950935023375584,\n", - " 0.5499039225980649,\n", - " 0.4546705917647941,\n", - " 0.6628841471036775,\n", - " 0.31482007050176253,\n", - " 0.42292614815370383,\n", - " 0.5940212005300132,\n", - " 0.7638664716617914,\n", - " 0.24558218955473884,\n", - " 0.347939273481837,\n", - " 0.285075276881922,\n", - " 0.45067129178229454,\n", - " 0.6711327033175829,\n", - " 0.5224087352183804,\n", - " 0.24295764894122351,\n", - " 0.37480957023925593,\n", - " 0.4855401885047126,\n", - " 0.2695779894497362,\n", - " 0.24920655516387907,\n", - " 0.4515461386534663,\n", - " 0.3824332358308957,\n", - " 0.2428326708167704,\n", - " 0.24458236455911395,\n", - " 0.36843568589214726,\n", - " 0.35306337658441456,\n", - " 0.24670699267481686,\n", - " 0.24358253956348908,\n", - " 0.4417978449461236,\n", - " 1.623466011650291,\n", - " 2.4391982299557484,\n", - " 0.4234260606515163,\n", - " 0.24420743018575464,\n", - " 0.9618318207955198,\n", - " 0.5717750943773594,\n", - " 0.24445738643466086,\n", - " 0.408553663841596,\n", - " 0.8028596464911623,\n", - " 0.4396732168304207,\n", - " 0.7346215905397634,\n", - " 1.2287850946273655,\n", - " 0.3745596139903497,\n", - " 0.8659735993399834,\n", - " 0.68025610640266,\n", - " 0.48404045101127524,\n", - " 0.3985554138853471,\n", - " 0.24145791144778617,\n", - " 0.3936812670316758,\n", - " 0.7048767969199229,\n", - " 0.6147675691892297,\n", - " 0.3278177954448861,\n", - " 0.5141601790044751,\n", - " 0.28857466436660917,\n", - " 0.27282742068551713,\n", - " 0.5457796444911123,\n", - " 0.502787169679242,\n", - " 0.3886821420535513,\n", - " 0.25982969574239356,\n", - " 0.24295764894122351,\n", - " 0.4797911947798695,\n", - " 0.2517061176529413,\n", - " 0.3611869546738668,\n", - " 0.24295764894122351,\n", - " 2.557552513812845,\n", - " 1.68408040201005,\n", - " 0.7638664716617914,\n", - " 1.2635290132253305,\n", - " 0.7204990624765618,\n", - " 1.0111981799544987,\n", - " 0.6165172629315733,\n", - " 0.9018423210580264,\n", - " 0.721873821845546,\n", - " 0.4091785544638616,\n", - " 0.8198566714167853,\n", - " 0.4560453511337783,\n", - " 0.6335142878571964,\n", - " 0.33194207355183875,\n", - " 0.24470734268356706,\n", - " 0.6728823970599265,\n", - " 0.3884321858046451,\n", - " 0.3710602265056626,\n", - " 0.2923240081002025,\n", - " 0.5640264506612664,\n", - " 0.5404055851396284,\n", - " 0.2759518737968449,\n", - " 0.49928778219455483,\n", - " 0.2527059426485662,\n", - " 0.2438324958123953,\n", - " 0.4080537513437836,\n", - " 0.3940562014050351,\n", - " 0.2438324958123953,\n", - " 0.24995642391059775,\n", - " 0.3729348983724593,\n", - " 0.24220778019450484,\n", - " 0.4569201980049501,\n", - " 1.743569989249731,\n", - " 2.262604140103502,\n", - " 0.24683197079926997,\n", - " 0.4529208980224505,\n", - " 1.0065739893497336,\n", - " 0.7451197529938248,\n", - " 0.42979994499862495,\n", - " 0.24208280207005173,\n", - " 0.8318545713642841,\n", - " 0.4721675291882297,\n", - " 0.7924864621615539,\n", - " 1.3286426160654015,\n", - " 0.905966599164979,\n", - " 0.6385134128353208,\n", - " 0.40217977949448735,\n", - " 0.7439949498737468,\n", - " 0.4301748793719843,\n", - " 0.24258271456786418,\n", - " 0.8049842746068651,\n", - " 0.4244258856471411,\n", - " 0.2971981549538738,\n", - " 0.578148978724468,\n", - " 0.40767881697042424,\n", - " 0.2450822770569264,\n", - " 0.2789513487837196,\n", - " 0.5584024350608765,\n", - " 0.5360313507837695,\n", - " 0.26645353633840846,\n", - " 0.25358078951973795,\n", - " 0.514035200880022,\n", - " 0.38455786394659863,\n", - " 0.24133293332333305,\n", - " 0.8204815620390509,\n", - " 1.3400156253906346,\n", - " 2.7233984849621238,\n", - " 1.801934773369334,\n", - " 0.5114106602665066,\n", - " 0.9215888647216179,\n", - " 0.6348890472261806,\n", - " 1.0480667266681665,\n", - " 0.4392982824570614,\n", - " 0.8087336183404584,\n", - " 0.4880397509937748,\n", - " 0.8663485337133427,\n", - " 0.3508137703442586,\n", - " 0.6808809970249255,\n", - " 0.24783179579489487,\n", - " 0.39030685767144174,\n", - " 0.41555243881097026,\n", - " 0.30744636115902896,\n", - " 0.7568676966924173,\n", - " 0.5956459161479036,\n", - " 0.2804510862771569,\n", - " 0.566900947523688,\n", - " 0.24345756143903596,\n", - " 0.43254946373659336,\n", - " 0.24345756143903596,\n", - " 0.4188018700467511,\n", - " 0.24083302082552063,\n", - " 0.39580589514737863,\n", - " 1.859174754368859,\n", - " 2.7307721943048575,\n", - " 0.2533308332708318,\n", - " 0.4931638540963524,\n", - " 0.2494565114127853,\n", - " 0.48066604165104126,\n", - " 0.46391897297432433,\n", - " 0.9185893897347432,\n", - " 0.24308262706567663,\n", - " 0.4769166979174479,\n", - " 0.8479767494187354,\n", - " 1.404629315732893,\n", - " 0.528657641441036,\n", - " 0.9559578489462236,\n", - " 0.24458236455911395,\n", - " 0.46304412610315254,\n", - " 0.8131078526963174,\n", - " 0.4386733918347958,\n", - " 0.3104458361459036,\n", - " 0.6165172629315733,\n", - " 0.5915216380409509,\n", - " 0.2847003425085627,\n", - " 0.4329243981099527,\n", - " 0.5717750943773594,\n", - " 0.24458236455911395,\n", - " 0.26895309882747065,\n", - " 0.5446548413710343,\n", - " 0.25570541763544086,\n", - " 0.2427076926923173,\n", - " 0.4070539263481587,\n", - " 0.36743586089652236,\n", - " 0.7203740843521087,\n", - " 0.41330283257081424,\n", - " 0.2418328458211455,\n", - " 0.31594487362184054,\n", - " 0.6332643316082902,\n", - " 0.2880747518687967,\n", - " 0.6040194504862622,\n", - " 0.4557953948848721,\n", - " 0.24320760519012974,\n", - " 0.24408245206130152,\n", - " 0.4464220355508887,\n", - " 0.41792702317557934,\n", - " 0.24245773644341106,\n", - " 0.5284076851921298,\n", - " 1.9707802195054873,\n", - " 2.8848702217555435,\n", - " 0.2573301332533313,\n", - " 0.5109107477686942,\n", - " 0.2538307457686442,\n", - " 0.48853966349158723,\n", - " 0.25095624890622265,\n", - " 0.955332958323958,\n", - " 0.5056616665416636,\n", - " 0.4880397509937748,\n", - " 0.24758183954598864,\n", - " 0.6547605690142253,\n", - " 0.32069404235105875,\n", - " 0.2933238330958274,\n", - " 0.24633205830145752,\n", - " 0.6190168254206355,\n", - " 0.4570451761294032,\n", - " 0.5998951723793094,\n", - " 0.27570191754793866,\n", - " 0.5704003350083752,\n", - " 0.25970471761794045,\n", - " 0.42867514187854694,\n", - " 0.24158288957223928,\n", - " 0.3720600515012875,\n", - " 0.7513686592164803,\n", - " 0.2383334583364584,\n", - " 0.4361738293457336,\n", - " 0.6595097377434436,\n", - " 0.324318407960199,\n", - " 0.2946985924648116,\n", - " 0.6337642441061027,\n", - " 0.4735422885572139,\n", - " 0.2438324958123953,\n", - " 0.4690430760769019,\n", - " 0.24358253956348908,\n", - " 0.5549030475761894,\n", - " 0.24158288957223928,\n", - " 0.26120445511137774,\n", - " 0.4392982824570614,\n", - " 2.0783863846596162,\n", - " 3.0734622115552885,\n", - " 0.5381559788994724,\n", - " 0.2582049801245031,\n", - " 0.5157848946223655,\n", - " 0.2539557238930973,\n", - " 0.5335317882947074,\n", - " 1.0200716267906695,\n", - " 0.2503313582839571,\n", - " 0.5136602665066626,\n", - " 0.33319185479636987,\n", - " 0.6831306032650816,\n", - " 0.24808175204380106,\n", - " 0.48104097602440055,\n", - " 0.3024472361809045,\n", - " 0.655510437760944,\n", - " 0.2838254956373909,\n", - " 0.6300149003725093,\n", - " 0.6010199754993875,\n", - " 0.2685781644541113,\n", - " 0.44979644491112275,\n", - " 0.24345756143903596,\n", - " 0.7966107402685066,\n", - " 0.3598121953048826,\n", - " 0.24258271456786418,\n", - " 0.45767006675166877,\n", - " 0.33519150478761967,\n", - " 0.703751993799845,\n", - " 0.4981629790744768,\n", - " 0.24495729893247328,\n", - " 0.4902893572339308,\n", - " 0.24458236455911395,\n", - " 0.46004465111627785,\n", - " 0.2374586114652866,\n", - " 0.5817733443336083,\n", - " 3.2180619015475385,\n", - " 2.1823681842046048,\n", - " 0.264828820720518,\n", - " 0.2619543238580964,\n", - " 0.5656511662791569,\n", - " 0.5361563289082226,\n", - " 0.2573301332533313,\n", - " 1.060814495362384,\n", - " 0.5604020850521263,\n", - " 0.5374061101527537,\n", - " 0.25358078951973795,\n", - " 0.6607595189879747,\n", - " 0.2860751018775469,\n", - " 0.33519150478761967,\n", - " 0.7191243031075776,\n", - " 0.5049117977949449,\n", - " 0.25008140203505086,\n", - " 0.6372636315907897,\n", - " 0.26245423635590887,\n", - " 0.23770856771419283,\n", - " 0.4701678791969799,\n", - " 0.8422277556938923,\n", - " 0.3985554138853471,\n", - " 0.4789163479086977,\n", - " 0.2428326708167704,\n", - " 0.3433150828770719,\n", - " 0.7368711967799194,\n", - " 0.24645703642591063,\n", - " 0.5165347633690842,\n", - " 0.5115356383909597,\n", - " 0.24658201455036374,\n", - " 0.23783354583864594,\n", - " 0.48029110727768193,\n", - " 2.2831005525138126,\n", - " 3.315669816745418,\n", - " 0.2697029675741893,\n", - " 0.6065190129753243,\n", - " 0.2667034925873147,\n", - " 0.5968956973924348,\n", - " 1.0920590264756618,\n", - " 0.5863975349383734,\n", - " 0.270452836320908,\n", - " 0.5592772819320483,\n", - " 0.5609019975499387,\n", - " 0.25645528638215953,\n", - " 0.2954484612115303,\n", - " 0.6853802095052376,\n", - " 0.25295589889747244,\n", - " 0.53203205080127,\n", - " 0.2745771144278607,\n", - " 0.6506362909072726,\n", - " 0.24083302082552063,\n", - " 0.4901643791094777,\n", - " 0.8765967399184978,\n", - " 0.41705217630440755,\n", - " 0.4991628040701017,\n", - " 0.24145791144778617,\n", - " 0.5379060226505662,\n", - " 0.2483317082927073,\n", - " 0.7688655966399159,\n", - " 0.34756433910847767,\n", - " ...]" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "full_vol = vector_vol_estimation(bsm_vol_est_brute_force, params)\n", - "full_vol" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "hovertemplate": "Strike=%{x}
ImpliedVol=%{y}", - "legendgroup": "", - "line": { - "color": "#636efa", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "", - "orientation": "v", - "showlegend": false, - "type": "scatter", - "x": [ - 15, - 20, - 25, - 30, - 35, - 40, - 45, - 50, - 60, - 70, - 80, - 85, - 90, - 95, - 100, - 105, - 110, - 115, - 120, - 125, - 130, - 135, - 140, - 145, - 150, - 155, - 160, - 165, - 170, - 175, - 180, - 185, - 190, - 195, - 200, - 210, - 220, - 230, - 240, - 250, - 260, - 270, - 280, - 290, - 300, - 310, - 320, - 330, - 340, - 350, - 360, - 370, - 380, - 390, - 400, - 410, - 420, - 430, - 440, - 450 - ], - "xaxis": "x", - "y": [ - 0.8147325683142078, - 0.747619315482887, - 0.7036270156753919, - 0.663509037725943, - 0.6272653816345408, - 0.5943961349033725, - 0.573524788119703, - 0.5474043601090027, - 0.5059116227905697, - 0.4746670916772919, - 0.4446723418085452, - 0.42967496687417184, - 0.41805200130003245, - 0.40667899197479934, - 0.3974306107652691, - 0.3881822295557389, - 0.3796837170929273, - 0.37156013900347507, - 0.3644363859096477, - 0.3566877421935548, - 0.35143866096652415, - 0.3454397109927748, - 0.3393157828945723, - 0.33419167979199477, - 0.32731788294707365, - 0.3230686267156679, - 0.31756958923973094, - 0.3144451361284032, - 0.3103208580214505, - 0.30757133928348207, - 0.3038219955498887, - 0.2990728268206705, - 0.29682322058051447, - 0.29407370184254605, - 0.29219902997574937, - 0.2870749268731718, - 0.28520025500637514, - 0.2847003425085627, - 0.2866999924998125, - 0.2925739643491087, - 0.3058216455411385, - 0.31282042051051273, - 0.32856766419160477, - 0.35706267656691415, - 0.3824332358308957, - 0.4080537513437836, - 0.43254946373659336, - 0.4557953948848721, - 0.4735422885572139, - 0.4981629790744768, - 0.5165347633690842, - 0.5379060226505662, - 0.5576525663141578, - 0.5780240006000149, - 0.5965207630190754, - 0.6161423285582139, - 0.6343891347283681, - 0.6527609190229755, - 0.670132878321958, - 0.6877547938698467 - ], - "yaxis": "y" - } - ], - "layout": { - "legend": { - "tracegroupgap": 0 - }, - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "heatmapgl": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmapgl" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "title": { - "text": "AAPL Call Options Implied Volatility" - }, - "xaxis": { - "anchor": "y", - "domain": [ - 0, - 1 - ], - "title": { - "text": "Strike" - } - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0, - 1 - ], - "title": { - "text": "ImpliedVol" - } - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "aapl_chain['ImpliedVol'] = full_vol\n", - "aapl_chain.Expiration.unique()\n", - "aapl_chain[(aapl_chain['Expiration'] == '2026-12-18') & (aapl_chain['Right'] == 'P')].sort_values('Strike').tail(60).plot(y = 'ImpliedVol', x='Strike', kind='line', title='AAPL Call Options Implied Volatility')" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Object `Scalar` not found.\n" - ] - } - ], - "source": [ - "Scalar?" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "openbb_new_use", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.13" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/trade/optionlib/notebooks/dividends.ipynb b/trade/optionlib/notebooks/dividends.ipynb deleted file mode 100644 index 1a56db3..0000000 --- a/trade/optionlib/notebooks/dividends.ipynb +++ /dev/null @@ -1,114 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Console Logging & File Logging Can be configured using STREAM_LOG_LEVEL and FILE_LOG_LEVEL in environment variables.\n", - "Propagate to root logger can be set using PROPAGATE_TO_ROOT_LOGGER in environment variables.\n", - "Example:\n", - "STREAM_LOG_LEVEL = 'DEBUG'\n", - "FILE_LOG_LEVEL = 'INFO'\n", - "PROPAGATE_TO_ROOT_LOGGER = 'False'\n", - "\n", - "2025-07-23 22:31:21 trade.helpers.Logging INFO: Logging Root Directory: /Users/chiemelienwanisobi/cloned_repos/QuantTools/logs\n", - "Using Proxy URL: http://54.144.4.219:5500/thetadata\n" - ] - } - ], - "source": [ - "%load_ext autoreload\n", - "%autoreload 2\n", - "from module_test.raw_code.optionlib_2.assets.dividend import (\n", - " MarketContinuousDividends,\n", - " MarketDividendSchedule,\n", - ")\n", - "from datetime import datetime" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Yield Rate before 10% bump: 0.003061224489795918\n", - "Yield Rate after 10% bump: 0.0027829313543599257\n" - ] - } - ], - "source": [ - "a=MarketContinuousDividends(\n", - " ticker='AAPL',\n", - " start_date=datetime(2024, 1, 2),\n", - " end_date=datetime(2025, 1, 2),\n", - " valuation_date=datetime(2025, 1, 6),\n", - ")\n", - "a.asset.clear_bump()\n", - "print(f\"Yield Rate before 10% bump: {a.yield_rate}\")\n", - "a.spot_price *= 1.10\n", - "print(f\"Yield Rate after 10% bump: {a.yield_rate}\")\n", - "a.asset.clear_bump()" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "916.5800170898438" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "aapl_div_schedule = MarketDividendSchedule(\n", - " ticker='COST',\n", - " start_date=datetime(2025, 1, 3),\n", - " end_date=datetime(2025, 8, 29),\n", - " valuation_date=datetime(2025, 1, 3),\n", - " lookback_years=1,\n", - " growth_method='cagr'\n", - ")\n", - "\n", - "aapl_div_schedule.spot_price\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "openbb_new_use", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.13" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/trade/optionlib/notebooks/forwards.ipynb b/trade/optionlib/notebooks/forwards.ipynb deleted file mode 100644 index e39d86f..0000000 --- a/trade/optionlib/notebooks/forwards.ipynb +++ /dev/null @@ -1,454 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The autoreload extension is already loaded. To reload it, use:\n", - " %reload_ext autoreload\n" - ] - } - ], - "source": [ - "%load_ext autoreload\n", - "%autoreload 2\n", - "from module_test.raw_code.optionlib_2.assets.forward import (\n", - " Forward,\n", - " EquityForward,\n", - " vectorized_forward_discrete,\n", - " vectorized_forward_continuous,\n", - " time_distance_helper\n", - ")\n", - "\n", - "from module_test.raw_code.optionlib_2.assets.dividend import (\n", - " MarketContinuousDividends,\n", - " MarketDividendSchedule,\n", - " vectorized_discrete_pv,\n", - " get_vectorized_dividend_scehdule,\n", - " get_vectorized_dividend_rate,\n", - " get_vectorized_continuous_dividends\n", - ")\n", - "from datetime import datetime" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "from module_test.raw_code.optionlib_2.pricing.binomial import Node" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "tree = []\n", - "for i in range(3):\n", - " tree.append([])\n", - " for j in range(i + 1):\n", - " node = Node(\n", - " 0, 1, (i,j)\n", - " )\n", - " tree[i].append(node)" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "class Empty:\n", - " def __init__(self, *args):\n", - " self.args = args\n", - " def __repr__(self):\n", - " return f\"Empty{self.args}\"" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[Empty(1, 1), Empty(2, 1), Empty(3, 1)],\n", - " [Empty(1, 2), Empty(2, 2), Empty(3, 2)],\n", - " [Empty(1, 3), Empty(2, 3), Empty(3, 3)]], dtype=object)" - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import numpy as np\n", - "test_scheduel = \\\n", - "[\n", - " [Empty(1,1), Empty(2,1), Empty(3,1)],\n", - " [Empty(1,2), Empty(2,2), Empty(3,2)],\n", - " [Empty(1,3), Empty(2,3), Empty(3,3)],\n", - "]\n", - "\n", - "np.array(test_scheduel, dtype=object)" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "105.12351191991695\n", - "0.0\n", - "[0.0, 0.0, 0.0, 0.0]\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "forward = Forward(\n", - " start_date=\"2023-01-01\",\n", - " end_date=\"2024-01-01\",\n", - " spot_price=100,\n", - " risk_free_rate=0.05,\n", - " dividend_type=\"discrete\",\n", - " freq=\"quarterly\",\n", - " div_amount=[0, 0, 0, 0]\n", - ")\n", - "print(forward.get_forward_price()) # Example usage\n", - "print(forward.dividend.get_present_value(forward.risk_free_rate, sum_up=True))\n", - "print(forward.dividend.get_present_value(forward.risk_free_rate, sum_up=False))\n", - "forward" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "105.12351191991695\n" - ] - } - ], - "source": [ - "forward_continous = Forward(\n", - " start_date=\"2023-01-01\",\n", - " end_date=\"2024-01-01\",\n", - " spot_price=100,\n", - " risk_free_rate=0.05,\n", - " dividend_type=\"continuous\",\n", - " div_amount=0.0 # 2% continuous dividend yield\n", - ")\n", - "print(forward_continous.get_forward_price()) # Example usage" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Model (Tickers)\n", - "\n", - "- This section carries out market data injections. Instead of relying on user inputs for" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "34.03482883323706\n", - "0.893653476627657\n", - "[0.21854228010864224, 0.22175365892120283, 0.22501222747605323, 0.2283453101217587]\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "forward = EquityForward(\n", - " start_date=\"2023-01-03\",\n", - " end_date=\"2024-01-03\",\n", - " risk_free_rate=None,\n", - " # risk_free_rate=0.05,\n", - " dividend_type=\"discrete\",\n", - " ticker = 'BAC'\n", - ")\n", - "print(forward.get_forward_price()) # Example usage\n", - "print(forward.dividend.get_present_value(forward.risk_free_rate, sum_up=True))\n", - "print(forward.dividend.get_present_value(forward.risk_free_rate, sum_up=False))\n", - "forward" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{('AAPL',\n", - " '2023-01-03 16:00:00'): Stock(Ticker: AAPL, Build Date: 2023-01-03 16:00:00),\n", - " ('BAC',\n", - " '2023-01-03 16:00:00'): Stock(Ticker: BAC, Build Date: 2023-01-03 16:00:00)}" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "forward.dividend.asset.list_instances()" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[0.23, 0.2329913294797688, 0.23602156353369644, 0.23909120814612894]" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "forward.dividend.asset.rf_rate\n", - "forward.risk_free_rate\n", - "forward.dividend.amounts" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "125.06999969482422" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "forward.dividend.spot_price" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "130.75511472843496\n" - ] - } - ], - "source": [ - "forward_continous = EquityForward(\n", - " start_date=\"2023-01-03\",\n", - " end_date=\"2024-01-03\",\n", - " risk_free_rate=0.05,\n", - " dividend_type=\"continuous\",\n", - " div_amount=0.0, # 2% continuous dividend yield\n", - " ticker = 'AAPL'\n", - ")\n", - "print(forward_continous.get_forward_price()) # Example usage" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.005516910543564624" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "forward_continous.dividend.spot_price \n", - "forward_continous.dividend.yield_rate " - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2025-07-23 23:00:50 trade.optionlib.utils.market_data ERROR: Error fetching dividend schedule for TSLA: \n", - "[Error] -> Error getting data for TSLA: No dividend data found for TSLA\n" - ] - }, - { - "data": { - "text/plain": [ - "array([1. , 0.97898159, 0.99579513])" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "tickers = ['TSLA', 'CVX', 'KO']\n", - "r = [0.045, 0.055, 0.005]\n", - "spots=[100,200,300]\n", - "start_dates = [datetime(2025, 1, 5), datetime(2025, 1, 5), datetime(2025, 1, 5)]\n", - "end_dates = [datetime(2025, 8, 31), datetime(2025, 8, 31), datetime(2025, 8, 31)]\n", - "valuation_dates = [datetime(2025, 1, 5), datetime(2025, 1, 5), datetime(2025, 1, 5)]\n", - "schedules = get_vectorized_dividend_scehdule(\n", - " tickers=tickers,\n", - " start_dates=start_dates,\n", - " end_dates=end_dates,\n", - " valuation_dates=valuation_dates\n", - ")\n", - "discrete_pv = vectorized_discrete_pv(schedules, \n", - " r,\n", - " _valuation_dates=valuation_dates,\n", - " _end_dates=end_dates)\n", - "discrete_pv\n", - "\n", - "\n", - "div_rates = get_vectorized_dividend_rate(\n", - " tickers=tickers,\n", - " spots=spots,\n", - " valuation_dates=valuation_dates\n", - ")\n", - "cont_q = get_vectorized_continuous_dividends(\n", - " div_rates=div_rates,\n", - " _valuation_dates=valuation_dates,\n", - " _end_dates=end_dates\n", - "\n", - ")\n", - "cont_q" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(array([102.97565159, 202.94061447, 299.71342922]),\n", - " array([102.97565159, 203.86358679, 299.98726676]))" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "tickers = ['TSLA', 'CVX', 'KO']\n", - "r = [0.045, 0.055, 0.005]\n", - "spots=[100,200,300]\n", - "start_dates = [datetime(2025, 1, 5), datetime(2025, 1, 5), datetime(2025, 1, 5)]\n", - "end_dates = [datetime(2025, 8, 31), datetime(2025, 8, 31), datetime(2025, 8, 31)]\n", - "valuation_dates = [datetime(2025, 1, 5), datetime(2025, 1, 5), datetime(2025, 1, 5)]\n", - "vector_f_discrete = vectorized_forward_discrete(\n", - " S=spots,\n", - " r=r,\n", - " T=[time_distance_helper(end_dates[i], valuation_dates[i]) for i in range(len(end_dates))],\n", - " pv_divs=discrete_pv\n", - ")\n", - "\n", - "vector_f_continuous = vectorized_forward_continuous(\n", - " S=spots,\n", - " r=r,\n", - " q_factor=cont_q,\n", - " T=[time_distance_helper(end_dates[i], valuation_dates[i]) for i in range(len(end_dates))]\n", - ")\n", - "\n", - "vector_f_continuous, vector_f_discrete" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "openbb_new_use", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.13" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/trade/optionlib/notebooks/ssvi_import_test.ipynb b/trade/optionlib/notebooks/ssvi_import_test.ipynb deleted file mode 100644 index 2f403e1..0000000 --- a/trade/optionlib/notebooks/ssvi_import_test.ipynb +++ /dev/null @@ -1,3331 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "id": "33e5db0b", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Console Logging & File Logging Can be configured using STREAM_LOG_LEVEL and FILE_LOG_LEVEL in environment variables.\n", - "Propagate to root logger can be set using PROPAGATE_TO_ROOT_LOGGER in environment variables.\n", - "Example:\n", - "STREAM_LOG_LEVEL = 'DEBUG'\n", - "FILE_LOG_LEVEL = 'INFO'\n", - "PROPAGATE_TO_ROOT_LOGGER = 'False'\n", - "\n", - "2025-10-20 09:24:23 trade.helpers.Logging INFO: Logging Root Directory: /Users/chiemelienwanisobi/cloned_repos/QuantTools/logs\n", - "Using Proxy URL: http://54.205.248.219:5500/thetadata\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "%load_ext autoreload\n", - "%autoreload 2\n", - "from module_test.raw_code.optionlib_2.vol.ssvi.model.chain import (\n", - " _load_chain, get_global_config, \n", - " MarketChainLoader, \n", - " ChainOutput)\n", - "from module_test.raw_code.optionlib_2.vol.ssvi.model.model_utils import params_cache_key\n", - "from module_test.raw_code.optionlib_2.vol.ssvi.controller import get_params_cache\n", - "from module_test.raw_code.optionlib_2.vol.ssvi.model.ssvi_model import _SSVIModel, SSVIParentModel, EODMarketSSVIModel, SsviTimeseriesEOD\n", - "from trade.assets.Stock import Stock\n", - "import pandas as pd\n", - "pd.options.plotting.backend = \"plotly\"\n", - "get_global_config().vol_type = 'bs'\n", - "get_global_config().vol_type" - ] - }, - { - "cell_type": "code", - "execution_count": 71, - "id": "de51730d", - "metadata": {}, - "outputs": [], - "source": [ - "get_global_config().vol_side='put'" - ] - }, - { - "cell_type": "code", - "execution_count": 72, - "id": "e73a6f5b", - "metadata": {}, - "outputs": [], - "source": [ - "chain = _load_chain(\"BAX\", \"2025-10-17\")" - ] - }, - { - "cell_type": "code", - "execution_count": 73, - "id": "b8b6c0ab", - "metadata": {}, - "outputs": [], - "source": [ - "bax = MarketChainLoader(symbol=\"BAX\", valuation_date=\"2025-10-17\")" - ] - }, - { - "cell_type": "code", - "execution_count": 74, - "id": "1c623f54", - "metadata": {}, - "outputs": [], - "source": [ - "model = _SSVIModel(\n", - " chain=chain,\n", - " valuation_date=\"2025-10-17\",\n", - " right=\"otm\"\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 75, - "id": "fdad9b7d", - "metadata": {}, - "outputs": [], - "source": [ - "p_model = SSVIParentModel(\n", - " chain=chain,\n", - " valuation_date=\"2025-10-17\",\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 76, - "id": "ba56cd90", - "metadata": {}, - "outputs": [], - "source": [ - "p_model.fit()" - ] - }, - { - "cell_type": "code", - "execution_count": 77, - "id": "e9aab020", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'put': SSVIModelParams{'var0_hat': 0.19692301458252587, 'var_inf_hat': 0.049655547797253466, 'kappa_hat': 0.27404767942036207, 'eta_hat': 1.1322279627012617, 'lambda_hat': -0.7467157525074255, 'rho_hat': -0.17098618803759325, 'atm_loss': 0.0044507332880411995, 'surface_loss': 0.014878475373416303}}" - ] - }, - "execution_count": 77, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "p_model._get_or_build(\"put\", fit=True)\n", - "p_model.params" - ] - }, - { - "cell_type": "code", - "execution_count": 78, - "id": "93aa59fa", - "metadata": {}, - "outputs": [], - "source": [ - "model.fit()\n" - ] - }, - { - "cell_type": "code", - "execution_count": 79, - "id": "262f160c", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 79, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bax.build_chain()" - ] - }, - { - "cell_type": "code", - "execution_count": 80, - "id": "77612793", - "metadata": {}, - "outputs": [], - "source": [ - "bax_model = EODMarketSSVIModel(\n", - " symbol=\"PG\",\n", - " valuation_date=\"2025-10-17\")" - ] - }, - { - "cell_type": "code", - "execution_count": 81, - "id": "2648d06e", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
volfwd
strikeexp
0.91m0.360791151.960015
1y0.276032153.443111
3m0.279890151.802050
6m0.261036152.194883
1.01m0.186865151.960015
1y0.271322153.443111
3m0.208824151.802050
6m0.235384152.194883
1.11m0.379057151.960015
1y0.286704153.443111
3m0.299386151.802050
6m0.276963152.194883
\n", - "
" - ], - "text/plain": [ - " vol fwd\n", - "strike exp \n", - "0.9 1m 0.360791 151.960015\n", - " 1y 0.276032 153.443111\n", - " 3m 0.279890 151.802050\n", - " 6m 0.261036 152.194883\n", - "1.0 1m 0.186865 151.960015\n", - " 1y 0.271322 153.443111\n", - " 3m 0.208824 151.802050\n", - " 6m 0.235384 152.194883\n", - "1.1 1m 0.379057 151.960015\n", - " 1y 0.286704 153.443111\n", - " 3m 0.299386 151.802050\n", - " 6m 0.276963 152.194883" - ] - }, - "execution_count": 81, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bax_model.fit()\n", - "get_global_config().vol_side\n", - "bax_model.predict(k=[0.9, 1.0, 1.1], exp = ['1m','3m', '6m', '1y'], strike_type='p',)" - ] - }, - { - "cell_type": "code", - "execution_count": 127, - "id": "88f4a62d", - "metadata": {}, - "outputs": [], - "source": [ - "SsviTimeseriesEOD.clear_instances(clear_tree=True)\n", - "ts = SsviTimeseriesEOD(symbol=\"TSLA\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6fe76a31", - "metadata": {}, - "outputs": [], - "source": [ - "get_global_config().vol_side = 'call'\n", - "vols_09 = ts.predict(strike_type='p', start_date = '2025-05-01', exp = ['3m'], k = [0.8])\n", - "vols_1_3m = ts.predict(strike_type='p', start_date = '2025-05-01', exp = ['3m'], k = [1.])\n", - "vols_1_1y = ts.predict(strike_type='p', start_date = '2025-05-01', exp = ['1y'], k = [1.])\n", - "vols_09" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "id": "664795c2", - "metadata": {}, - "outputs": [], - "source": [ - "pg = Stock(\"PG\")\n", - "rvol=pg.rvol(window=30, ts_start='2024-01-01')" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "id": "0716ce7b", - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "hovertemplate": "Datetime=%{x}
vol=%{y}", - "legendgroup": "", - "line": { - "color": "#636efa", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "", - "orientation": "v", - "showlegend": false, - "type": "scatter", - "x": [ - "2025-05-01", - "2025-05-02", - "2025-05-05", - "2025-05-06", - "2025-05-07", - "2025-05-08", - "2025-05-09", - "2025-05-12", - "2025-05-13", - "2025-05-14", - "2025-05-15", - "2025-05-16", - "2025-05-19", - "2025-05-20", - "2025-05-21", - "2025-05-22", - "2025-05-23", - "2025-05-27", - "2025-05-28", - "2025-05-29", - "2025-05-30", - "2025-06-02", - "2025-06-03", - "2025-06-04", - "2025-06-05", - "2025-06-06", - "2025-06-09", - "2025-06-10", - "2025-06-11", - "2025-06-12", - "2025-06-13", - "2025-06-16", - "2025-06-17", - "2025-06-18", - "2025-06-20", - "2025-06-23", - "2025-06-24", - "2025-06-25", - "2025-06-26", - "2025-06-27", - "2025-06-30", - "2025-07-01", - "2025-07-02", - "2025-07-03", - "2025-07-07", - "2025-07-08", - "2025-07-09", - "2025-07-10", - "2025-07-11", - "2025-07-14", - "2025-07-15", - "2025-07-16", - "2025-07-17", - "2025-07-18", - "2025-07-21", - "2025-07-22", - "2025-07-23", - "2025-07-24", - "2025-07-25", - "2025-07-28", - "2025-07-29", - "2025-07-30", - "2025-07-31", - "2025-08-01", - "2025-08-04", - "2025-08-05", - "2025-08-06", - "2025-08-07", - "2025-08-08", - "2025-08-11", - "2025-08-12", - "2025-08-13", - "2025-08-14", - "2025-08-15", - "2025-08-18", - "2025-08-19", - "2025-08-20", - "2025-08-21", - "2025-08-22", - "2025-08-25", - "2025-08-26", - "2025-08-27", - "2025-08-28", - "2025-08-29", - "2025-09-02", - "2025-09-03", - "2025-09-04", - "2025-09-05", - "2025-09-08", - "2025-09-09", - "2025-09-10", - "2025-09-11", - "2025-09-12", - "2025-09-15", - "2025-09-16", - "2025-09-17", - "2025-09-18", - "2025-09-19", - "2025-09-22", - "2025-09-23", - "2025-09-24", - "2025-09-25", - "2025-09-26", - "2025-09-29", - "2025-09-30", - "2025-10-01", - "2025-10-02", - "2025-10-03", - "2025-10-06", - "2025-10-07", - "2025-10-08", - "2025-10-09", - "2025-10-10", - "2025-10-13", - "2025-10-14", - "2025-10-15", - "2025-10-16", - "2025-10-17" - ], - "xaxis": "x", - "y": { - "bdata": "mWBiq31m1T/Hyl6TTZ7VP82DRsD50dU/ArvICdE61T9VorujO2DUPxEg7Ssy5dU/iT9s0MI91T9v6rYIP+zUP7GUz9E7oNU/xovxfyEj1T82Cyljo53UP8fH6I1d3tM/at4aPbJo1D92ZFd4bdrVP5ytca/E4NQ/vv671Iew1T/ep+9uCBDVP5AWnOyhtdQ/5PWIQBka1D/KM4VtLiLWPw5iQ+kB2NM/K4XRunUA1T/ZdE/MOFvTPw0pqRR6YtM/1s0p6dfp1D8DrWllX33SP52D6yM5mtM/g2wfyIUz0z8f/aZZVYfTP5imz/1jQtQ/DFtM4enW1T9n786S+jDSP9IyFRE3W9U/t17aD6cu1D9aleijOFjUP1UuDeI1bNM/3hqZDLgE1D8W0r216WTVP8I+dPe1kNI/VCJoJVYG0z9WACD4GBnTP+tQ/0K8zdI/yzUxvUa/0z9c8cta+vbRP+e3G3Q7zdE/SAwvRmE90j+17O2KiebTP3W/7s7TDNA/DWbutXCB0D9F3WsaQjnSPwGlUNWVqtE/cQGT1tP50T9rGZaVeEfRP+UoGYznPdE/gmc6bYN51D+dH5R2BunRP0QNxJgbT88/pFTPXp6Pzz+vQSAIwEPRP1Vd6vFyYtE/prbqhnXq0z/oqGZUfRrRPzBKB+dupdE/7UAE98oK0T9KrtYPsF3RP0vW1OPbPdE/yzTQtaaE0j/R1AX6sIHRP5oK5LdB8M8/3sPCVdwb0T9Ax7a2wQTQP7j3lAQfcNE/PGFzA1ue0D8BrGqx8GHPP+wImmkWW9A/Zi/NLW+Pzz+klwWQlvfOP85QXhXDX8s/i/QF+5BB0D/aSnPXFn/QP9R/JCxOEdE/0D4uvMci0D9t9gQh+07QP509GPZILtA/PPEgZPk70T9llZgLhXrQP4OctfcG3dA/0k1ZJPfmzz96/2dtT0fRP8xt972+49E/H9w08XPf0D/1T8NVexjRP312U9tMwdE/JJTP25i10T930S0NmLDQP3BZ/jnKONE/nSmWureX0T9b9oDFj7XOP9rKUXzo/tA/tTnTJWkS0T8GBgPHFfHRP3QgQjWe+tE/BFhYZaAu0T8pQHSShCjQPyOw0aWmFdE/WzP4e8rX0T8L302GYavRP8OOwMRKm9E//4nIfl3q0T9hYDc+RbjRP0dEwzeEpNE/MjhdQ5tJ0D8L5WfRNj/RP750Hd95Q9A/9mdYDfyV0D9z3aeqxhrRP/62X9aQytE/7yIMJ99s0T8=", - "dtype": "f8" - }, - "yaxis": "y" - } - ], - "layout": { - "legend": { - "tracegroupgap": 0 - }, - "margin": { - "t": 60 - }, - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermap": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermap" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "xaxis": { - "anchor": "y", - "domain": [ - 0, - 1 - ], - "title": { - "text": "Datetime" - } - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0, - 1 - ], - "title": { - "text": "vol" - } - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "vols_1_3m.reset_index().plot(y='vol', x='Datetime')" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "id": "8f47c067", - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "hovertemplate": "Datetime=%{x}
vol=%{y}", - "legendgroup": "", - "line": { - "color": "#636efa", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "", - "orientation": "v", - "showlegend": false, - "type": "scatter", - "x": [ - "2025-05-01", - "2025-05-02", - "2025-05-05", - "2025-05-06", - "2025-05-07", - "2025-05-08", - "2025-05-09", - "2025-05-12", - "2025-05-13", - "2025-05-14", - "2025-05-15", - "2025-05-16", - "2025-05-19", - "2025-05-20", - "2025-05-21", - "2025-05-22", - "2025-05-23", - "2025-05-27", - "2025-05-28", - "2025-05-29", - "2025-05-30", - "2025-06-02", - "2025-06-03", - "2025-06-04", - "2025-06-05", - "2025-06-06", - "2025-06-09", - "2025-06-10", - "2025-06-11", - "2025-06-12", - "2025-06-13", - "2025-06-16", - "2025-06-17", - "2025-06-18", - "2025-06-20", - "2025-06-23", - "2025-06-24", - "2025-06-25", - "2025-06-26", - "2025-06-27", - "2025-06-30", - "2025-07-01", - "2025-07-02", - "2025-07-03", - "2025-07-07", - "2025-07-08", - "2025-07-09", - "2025-07-10", - "2025-07-11", - "2025-07-14", - "2025-07-15", - "2025-07-16", - "2025-07-17", - "2025-07-18", - "2025-07-21", - "2025-07-22", - "2025-07-23", - "2025-07-24", - "2025-07-25", - "2025-07-28", - "2025-07-29", - "2025-07-30", - "2025-07-31", - "2025-08-01", - "2025-08-04", - "2025-08-05", - "2025-08-06", - "2025-08-07", - "2025-08-08", - "2025-08-11", - "2025-08-12", - "2025-08-13", - "2025-08-14", - "2025-08-15", - "2025-08-18", - "2025-08-19", - "2025-08-20", - "2025-08-21", - "2025-08-22", - "2025-08-25", - "2025-08-26", - "2025-08-27", - "2025-08-28", - "2025-08-29", - "2025-09-02", - "2025-09-03", - "2025-09-04", - "2025-09-05", - "2025-09-08", - "2025-09-09", - "2025-09-10", - "2025-09-11", - "2025-09-12", - "2025-09-15", - "2025-09-16", - "2025-09-17", - "2025-09-18", - "2025-09-19", - "2025-09-22", - "2025-09-23", - "2025-09-24", - "2025-09-25", - "2025-09-26", - "2025-09-29", - "2025-09-30", - "2025-10-01", - "2025-10-02", - "2025-10-03", - "2025-10-06", - "2025-10-07", - "2025-10-08", - "2025-10-09", - "2025-10-10", - "2025-10-13", - "2025-10-14", - "2025-10-15", - "2025-10-16", - "2025-10-17" - ], - "xaxis": "x", - "y": { - "bdata": "zqi8bzx11D/eUmLsx4LUP6A0GMgXt9Q//hMxx9x01D+0oBmXFmrTPxqISb+p4dQ/EJXeSOJx1D/pVuPTserTP6G1rv49idQ/ZW2LPfVa1D//U0emH4bTP7KyV5u++NM/Y52yhB2d0j8NtpkP92zUP3PrPfhybdM/D3hmaPoi1T+NLpWd42HUP6G36ZgXFtQ/OcomAv060z9Nd1h2yW/VP/UzoH2VONM/npMTg7q01D/nIkVo8dfSPyBYlowj5NI/ysyZkGCh1D+rFAF45vPRPyxWdzm/EtM/8zGEtIDN0j+V+suh6jfTP209Z4RyYdQ/HQjLXFtC1j9tFIIJFajRP0I5b7WFWdU/uRkJmNZE1D8OFUn7QurUP/S35gUJh9I/Z9xewFAN1D95xjcLCOrUP4P7SrJOBtI/NJKnW2yT0j/xoG4oEtnSPyaafSRAk9I/esZV2ZLR0z/41kkQbUvRP3lYITLkd9E/+GtfIbIp0j+Jwq71HF3UP0s7y08E584/4i9AJ0UQ0D/uk8QYfFLSP6pQcrxtxtE/N0UJLX8r0j9zYG3lSRrRP68iQT6VQtE/wKE833KF1D9RJ14N78HQP1DC3aIPmMw/A3KjT2+yzD+1pOk28dnQP0USHL4ujNA/Lr5pczHl0z/vnEo5g2rQP5lc1v3KsdA/6UGjQphq0D/DvqxTcWHQP0zHs1o2edA/wLGqkfXZ0T8QUng3KaXQP1poStt1ZM0/HR7Msnln0D9x5HFITBvPP6oBHBO1ntE/kBSVeGjX0D85DjfU6gDPP+aeioCjZtA/rMQU17gVzz9Yc0UrIuTOPwdx7s0fvck/GSSAd/7B0D+ZLjJc1pjPPxlUyB57VNA/NGZoQ7oIzj9WZJZCcrfOPzgBekEWEc4/fGiovUpQ0D9A7cpEEszOP1YfO2n89c8/6Op8MDb8zT9qzqhtqZHQP16QYMjZftE/jaFMlQFA0D9GjCbfXUbQP037CaUMftE//NPH1Z7S0T/Z1FAyG47QP6K/R725mdE/Yv4JOBny0T9I3iiLXXDOP2hmGhvY1NA/f9elyCzZ0D8TgCITTbLRP4DKuddYtNE/YVg2kqTE0D+difkmzAHPPx6UbqVkvtA/HyBhecvc0T9lLX/M4ZbRP/4hzlK8k9E/RClfx7a70T/VpPuTQLDRP7gNXfsRqtE/KhOdZuugzz/BOKUrNYnRPx6cHuIPos8/YA4qHX120D9uWtubDnTRP7YevovWAtM/4tmREuCp0T8=", - "dtype": "f8" - }, - "yaxis": "y" - } - ], - "layout": { - "legend": { - "tracegroupgap": 0 - }, - "margin": { - "t": 60 - }, - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermap": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermap" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "xaxis": { - "anchor": "y", - "domain": [ - 0, - 1 - ], - "title": { - "text": "Datetime" - } - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0, - 1 - ], - "title": { - "text": "vol" - } - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "vols_1_1y.reset_index().plot(y='vol', x='Datetime')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1dcb31f6", - "metadata": {}, - "outputs": [ - { - "ename": "AttributeError", - "evalue": "'DatetimeArray' object has no attribute 'sort'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[114], line 3\u001b[0m\n\u001b[1;32m 1\u001b[0m model_chain \u001b[38;5;241m=\u001b[39m ts\u001b[38;5;241m.\u001b[39mmodel_set[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m2025-05-15\u001b[39m\u001b[38;5;124m'\u001b[39m]\u001b[38;5;241m.\u001b[39m_get_or_build(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124motm\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m 2\u001b[0m chain_ \u001b[38;5;241m=\u001b[39m model_chain\u001b[38;5;241m.\u001b[39mdataframe_chain\u001b[38;5;241m.\u001b[39mcopy()\n\u001b[0;32m----> 3\u001b[0m \u001b[43mchain_\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mexpiration\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43munique\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msort\u001b[49m()\n", - "\u001b[0;31mAttributeError\u001b[0m: 'DatetimeArray' object has no attribute 'sort'" - ] - } - ], - "source": [ - "model_chain = ts.model_set['2025-05-15']._get_or_build('otm')\n", - "chain_ = model_chain.dataframe_chain.copy()\n", - "chain_.expiration.unique()" - ] - }, - { - "cell_type": "code", - "execution_count": 113, - "id": "f906dafd", - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "hovertemplate": "f_log_moneyness=%{x}
vol=%{y}", - "legendgroup": "", - "line": { - "color": "#636efa", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "", - "orientation": "v", - "showlegend": false, - "type": "scatter", - "x": { - "bdata": "IKqzSstq57/oukQSg9biv5UqlxveAdq/PZpUE6RD078ZEQtqKFTKv7Y0Hb6g7rO/YZIkr110Tb84+Ktl/726Px0ZpQ3MocU/YueLqRqN0D+i2Z/q4RjZPw==", - "dtype": "f8" - }, - "xaxis": "x", - "y": { - "bdata": "k5iZMwfc2T/Df03Qo0bXP52cSdYbq9Q/3fIoOxvU0z/9ETR8V9zSPyhTYnOfOtE/IdAyNQtlzj+8LJuN3G/RPzIWXmU9ftA/YEVtqm4y0T+8FNKqVVfQPw==", - "dtype": "f8" - }, - "yaxis": "y" - } - ], - "layout": { - "legend": { - "tracegroupgap": 0 - }, - "margin": { - "t": 60 - }, - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermap": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermap" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "xaxis": { - "anchor": "y", - "domain": [ - 0, - 1 - ], - "title": { - "text": "f_log_moneyness" - } - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0, - 1 - ], - "title": { - "text": "vol" - } - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "chain_[chain_['expiration'] == '2027-01-15'].plot(x='f_log_moneyness', y='vol')" - ] - }, - { - "cell_type": "code", - "execution_count": 126, - "id": "33c4e6fc", - "metadata": {}, - "outputs": [], - "source": [ - "from algo.strategies.init_orders.core import CloseOrdersPipeline\n", - "from algo.positions.loaders.position_vars import get_position_data\n", - "from algo.strategies.configs import append_to_eod_task\n", - "from algo.positions.loaders.journal import build_trade_journal\n", - "from algo.positions.vars import get_orders_table\n", - "\n", - "op, cl = build_trade_journal(get_orders_table())" - ] - }, - { - "cell_type": "code", - "execution_count": 124, - "id": "9e4bb7f9", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[0;31mSignature:\u001b[0m \u001b[0mappend_to_eod_task\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodule\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0menabled\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mbool\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mDocstring:\u001b[0m\n", - "Append a new task to the end of the EOD tasks list.\n", - "Args:\n", - " module (List[str]): List of module paths where the task functions are located.\n", - " name (List[str]): List of task function names.\n", - " enabled (List[bool]): List of booleans indicating whether each task is enabled or\n", - "\u001b[0;31mFile:\u001b[0m ~/cloned_repos/TFP-Algo/algo/strategies/configs/__init__.py\n", - "\u001b[0;31mType:\u001b[0m function" - ] - } - ], - "source": [ - "append_to_eod_task?" - ] - }, - { - "cell_type": "code", - "execution_count": 121, - "id": "b4c69204", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "TEST MODE: True - Loading trades for slug: long_bbands\n", - "WARNING: TEST MODE. USING INCORRECT INFORMATION IN load_position_actions function\n", - "2025-10-19 17:21:05 algo.strategies.init_orders CRITICAL: In TEST mode but active_positions/alpaca_pos not defined globally.\n", - "Processing slug: long_bbands\n" - ] - }, - { - "data": { - "text/plain": [ - "{'long_bbands': [{'result': 'SUCCESSFUL',\n", - " 'signal_id': 'AAPL20250808LONG',\n", - " 'map_signal_id': 'AAPL20250808LONG',\n", - " 'date': datetime.datetime(2025, 10, 21, 16, 0),\n", - " 'data': {'trade_id': '&L:AAPL20260417C265&S:AAPL20260417C270',\n", - " 'long': ['AAPL20260417C265'],\n", - " 'short': ['AAPL20260417C270'],\n", - " 'close': np.float64(2.0500000000000007),\n", - " 'quantity': 3}},\n", - " {'result': 'SUCCESSFUL',\n", - " 'signal_id': 'AMD20250701LONG',\n", - " 'map_signal_id': 'AMD20250701LONG',\n", - " 'date': datetime.datetime(2025, 10, 21, 16, 0),\n", - " 'data': {'trade_id': '&L:AMD20260417C195&S:AMD20260417C200',\n", - " 'long': ['AMD20260417C195'],\n", - " 'short': ['AMD20260417C200'],\n", - " 'close': np.float64(3.075000000000003),\n", - " 'quantity': 5}},\n", - " {'result': 'SUCCESSFUL',\n", - " 'signal_id': 'BA20250701LONG',\n", - " 'map_signal_id': 'BA20250701LONG',\n", - " 'date': datetime.datetime(2025, 10, 21, 16, 0),\n", - " 'data': {'trade_id': '&L:BA20260515C285&S:BA20260515C290',\n", - " 'long': ['BA20260515C285'],\n", - " 'short': ['BA20260515C290'],\n", - " 'close': np.float64(0.125),\n", - " 'quantity': 4}},\n", - " {'result': 'SUCCESSFUL',\n", - " 'signal_id': 'META20250701LONG',\n", - " 'map_signal_id': 'META20250701LONG',\n", - " 'date': datetime.datetime(2025, 10, 21, 16, 0),\n", - " 'data': {'trade_id': '&L:META20260417C990&S:META20260417C1000',\n", - " 'long': ['META20260417C990'],\n", - " 'short': ['META20260417C1000'],\n", - " 'close': np.float64(0.75),\n", - " 'quantity': 2}},\n", - " {'result': 'SUCCESSFUL',\n", - " 'signal_id': 'NFLX20250701LONG',\n", - " 'map_signal_id': 'NFLX20250701LONG',\n", - " 'date': datetime.datetime(2025, 10, 21, 16, 0),\n", - " 'data': {'trade_id': '&L:NFLX20260618C1650&S:NFLX20260618C1660',\n", - " 'long': ['NFLX20260618C1650'],\n", - " 'short': ['NFLX20260618C1660'],\n", - " 'close': np.float64(1.25),\n", - " 'quantity': 2}},\n", - " {'result': 'SUCCESSFUL',\n", - " 'signal_id': 'NVDA20250701LONG',\n", - " 'map_signal_id': 'NVDA20250701LONG',\n", - " 'date': datetime.datetime(2025, 10, 21, 16, 0),\n", - " 'data': {'trade_id': '&L:NVDA20260618C235&S:NVDA20260618C240',\n", - " 'long': ['NVDA20260618C235'],\n", - " 'short': ['NVDA20260618C240'],\n", - " 'close': np.float64(1.0249999999999986),\n", - " 'quantity': 6}},\n", - " {'result': 'SUCCESSFUL',\n", - " 'signal_id': 'TSLA20250915LONG',\n", - " 'map_signal_id': 'TSLA20250915LONG',\n", - " 'date': datetime.datetime(2025, 10, 21, 16, 0),\n", - " 'data': {'trade_id': '&L:TSLA20260417C445&S:TSLA20260417C450',\n", - " 'long': ['TSLA20260417C445'],\n", - " 'short': ['TSLA20260417C450'],\n", - " 'close': np.float64(2.049999999999997),\n", - " 'quantity': 5}}]}" - ] - }, - "execution_count": 121, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "CloseOrdersPipeline.TEST=True\n", - "CloseOrdersPipeline.run()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "openbb_new_use", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.13" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/trade/optionlib/notebooks/ssvi_model_mod.ipynb b/trade/optionlib/notebooks/ssvi_model_mod.ipynb deleted file mode 100644 index bed9eb1..0000000 --- a/trade/optionlib/notebooks/ssvi_model_mod.ipynb +++ /dev/null @@ -1,8055 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 72, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The autoreload extension is already loaded. To reload it, use:\n", - " %reload_ext autoreload\n" - ] - } - ], - "source": [ - "%load_ext autoreload\n", - "%autoreload 2\n", - "from dotenv import load_dotenv\n", - "load_dotenv()\n", - "from module_test.raw_code.optionlib_2.vol.implied_vol import (\n", - " bsm_vol_est_brute_force,\n", - " bsm_vol_est_minimization,\n", - " vector_vol_estimation\n", - ")\n", - "\n", - "from module_test.raw_code.optionlib_2.config.defaults import DAILY_BASIS\n", - "from module_test.raw_code.optionlib_2.assets.forward import (\n", - " EquityForward, \n", - " time_distance_helper,\n", - " vectorized_market_forward_calc\n", - ")\n", - "from datetime import datetime\n", - "from dbase.DataAPI.ThetaData import retrieve_chain_bulk\n", - "from trade.helpers.helper import change_to_last_busday, retrieve_timeseries\n", - "import os\n", - " \n", - "from module_test.raw_code.optionlib_2.vol.implied_vol import (\n", - " estimate_crr_implied_volatility,\n", - " vol_est_brute_force_bjs_2002,\n", - " vector_vol_estimation\n", - ")\n", - "from module_test.raw_code.optionlib_2.assets.forward import (\n", - " EquityForward, \n", - " time_distance_helper,\n", - " get_vectorized_dividend_rate,\n", - " get_vectorized_dividend_scehdule,\n", - " vectorized_discrete_pv\n", - ")\n", - "\n", - "from module_test.raw_code.optionlib_2.assets.dividend import (\n", - " vector_convert_to_time_frac\n", - ")\n", - "\n", - "from module_test.raw_code.optionlib_2.greeks.numerical.bjs2002 import (\n", - " bjs2002_numerical_greeks,\n", - ")\n", - "from module_test.raw_code.optionlib_2.greeks.numerical.black_scholes import vectorized_black_scholes_greeks\n", - "\n", - "from module_test.raw_code.optionlib_2.greeks.numerical.binomial import (\n", - " binomial_tree_greeks,\n", - ")\n", - "from datetime import datetime\n", - "from dbase.DataAPI.ThetaData import retrieve_chain_bulk\n", - "from trade.helpers.helper import change_to_last_busday, retrieve_timeseries\n", - "import os\n", - "import numpy as np\n", - "import pandas as pd\n", - "from trade.assets.rates import get_risk_free_rate_helper\n", - "from module_test.raw_code.optionlib_2.utils.batch_operation import vector_batch_processor\n", - "# os.environ['PROXY_URL'] = ''\n", - "from dbase.DataAPI.ThetaData import (\n", - " list_contracts,\n", - " retrieve_eod_ohlc,\n", - " retrieve_chain_bulk\n", - ")\n", - "from trade import PRICING_CONFIG, reload_pricing_config, get_pricing_config\n", - "from dataclasses import dataclass, field\n", - "from pydantic import BaseModel, Field, ConfigDict\n", - "from pydantic.dataclasses import dataclass\n", - "from abc import ABC, abstractmethod\n", - "from typing import List, Tuple, Literal\n", - "from scipy.interpolate import interp1d\n", - "from module_test.raw_code.optionlib_2.pricing.black_scholes import black_scholes_vectorized\n", - "from module_test.raw_code.optionlib_2.pricing.binomial import crr_binomial_pricing\n", - "from module_test.raw_code.optionlib_2.greeks.numerical.binomial import binomial_tree_price_batch\n", - "def get_spot(tick, date):\n", - " return retrieve_timeseries(tick, date, date)['close'][0]\n", - "test_start, test_valuation_date = '2025-07-16', '2025-07-16'" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'INTRADAY_AGG': '5m',\n", - " 'MARKET_OPEN_TIME': '09:30',\n", - " 'MARKET_CLOSE_TIME': '16:00',\n", - " 'AVAILABLE_PRICING_MODELS': ['bs', 'binomial', 'mc'],\n", - " 'AVAILABLE_INTERVALS': ['h', 'd', 'w', 'q', 'y', 'M', 'm'],\n", - " 'AVAILABLE_GREEKS': ['vega',\n", - " 'vanna',\n", - " 'volga',\n", - " 'delta',\n", - " 'gamma',\n", - " 'theta',\n", - " 'rho'],\n", - " 'UPPER_BOUND_MONEYNESS': 1.2,\n", - " 'LOWER_BOUND_MONEYNESS': 0.8,\n", - " 'DAYS_IN_MONTH': 30,\n", - " 'DAYS_IN_YEAR': 360,\n", - " 'MIN_BAR_TIME_INTERVAL': '5m',\n", - " 'QUOTE_DATA_START_TIME': '9:45:00',\n", - " 'VOL_SURFACE_WIDTH': 0.8,\n", - " 'VOL_SURFACE_MIN_DTE_THRESHOLD': 30,\n", - " 'VOL_SURFACE_MAX_DTE_THRESHOLD': 732,\n", - " 'ATM_WIDTH': 0.05,\n", - " 'VOL_SURFACE_SURFACE_LOSS_THRESHOLD': 0.1,\n", - " 'VOL_SURFACE_ATM_LOSS_THRESHOLD': 0.05,\n", - " 'DEFAULT_SSVI_PARAMS_ITERATION': 25000}" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "reload_pricing_config()\n", - "PRICING_CONFIG= get_pricing_config()\n", - "PRICING_CONFIG" - ] - }, - { - "cell_type": "code", - "execution_count": 118, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.041380000114440915" - ] - }, - "execution_count": 118, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ticks = ['AAPL', 'MSFT', 'GOOGL', 'AMZN', 'TSLA']\n", - "test_start, test_valuation_date = '2025-07-16', '2025-07-16'\n", - "def pick_random_option(tick, date):\n", - " contracts = list_contracts(tick, date)\n", - " # Pick a random contract from the list\n", - " contract = np.random.choice(contracts.index)\n", - " return contracts.iloc[contract]\n", - "\n", - "def get_option_eod_price(date, contract_series):\n", - " \"\"\"\n", - " Retrieves the end-of-day price for a given option contract on a specific date.\n", - " \n", - " Args:\n", - " date (datetime): The date for which to retrieve the price.\n", - " contract_series (pd.Series): The series containing option contract details.\n", - " \n", - " Returns:\n", - " float: The end-of-day price of the option contract.\n", - " \"\"\"\n", - " eod_data = retrieve_eod_ohlc(symbol=contract_series['root'],\n", - " end_date=date,\n", - " start_date=date,\n", - " exp=str(contract_series['expiration']),\n", - " right=contract_series['right'],\n", - " strike=contract_series['strike'],\n", - " )\n", - " return eod_data.Midpoint[0]\n", - "\n", - "def get_spot(tick, date, spot_type='close'):\n", - " return retrieve_timeseries(tick, date, date, spot_type=spot_type)['close'][0]\n", - "\n", - "def get_rates(date):\n", - " \"\"\"\n", - " Retrieves the risk-free rate for a given date.\n", - " \n", - " Args:\n", - " date (datetime): The date for which to retrieve the risk-free rate.\n", - " \n", - " Returns:\n", - " float: The risk-free rate for the specified date.\n", - " \"\"\"\n", - " date = pd.to_datetime(date).strftime('%Y-%m-%d')\n", - " return get_risk_free_rate_helper()['annualized'][date]\n", - "get_rates('2025-08-08')" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def get_chain(tick, date):\n", - " spot = get_spot(tick, date, spot_type='chain_price')\n", - " date= change_to_last_busday(date)\n", - " chain=retrieve_chain_bulk(\n", - " tick,\n", - " 0, ## This is to get all expirations\n", - " date,\n", - " date,\n", - " '16:00'\n", - " )\n", - " chain['spot'] = spot\n", - " chain['valuation_date'] = date\n", - " chain['moneyness'] = chain['Strike'] / chain['spot']\n", - " chain['log_moneyness'] = np.log(chain['moneyness'])\n", - " chain['T']= chain['Expiration'].apply(\n", - " lambda x: time_distance_helper(\n", - " x,\n", - " date,\n", - " ))\n", - " chain['T'] = chain['T'].astype(float)\n", - " chain['DTE']= chain['T'] * DAILY_BASIS\n", - "\n", - " return chain\n", - "\n", - "chains= {}\n", - "for tick in ticks:\n", - " chains[tick] = get_chain(tick, test_valuation_date)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "def format_chain(chain: pd.DataFrame):\n", - " \"\"\"\n", - " Formats the option chain DataFrame by renaming columns and converting types.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame to format.\n", - " \n", - " Returns:\n", - " pd.DataFrame: The formatted option chain DataFrame.\n", - " \"\"\"\n", - " chain.columns = chain.columns.str.lower() \n", - " return chain\n", - "\n", - "for tick in chains:\n", - " chains[tick] = format_chain(chains[tick])" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "def confine_chain_with_pricing_config(chain:pd.DataFrame) -> pd.DataFrame:\n", - " \"\"\"\n", - " Confines the chain to the pricing configuration limits.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " \n", - " Returns:\n", - " pd.DataFrame: The confined option chain.\n", - " \"\"\"\n", - " return chain[\n", - " (chain['dte'] >= PRICING_CONFIG['VOL_SURFACE_MIN_DTE_THRESHOLD']) &\n", - " (chain['dte'] <= PRICING_CONFIG['VOL_SURFACE_MAX_DTE_THRESHOLD']) &\n", - " (chain['moneyness'] >= 1-PRICING_CONFIG['VOL_SURFACE_WIDTH']) &\n", - " (chain['moneyness'] <= 1+PRICING_CONFIG['VOL_SURFACE_WIDTH'])\n", - " ]\n", - " \n" - ] - }, - { - "cell_type": "raw", - "metadata": { - "vscode": { - "languageId": "raw" - } - }, - "source": [ - "for tick in chains:\n", - " chains[tick] = confine_chain_with_pricing_config(chains[tick])\n", - "\n", - "chains[tick]" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "\n", - "def get_forward_price_on_chain(chain:pd.DataFrame,\n", - " valuation_date:str,\n", - " r:float,\n", - " div_type:str='discrete') -> float:\n", - " \"\"\"\n", - " Calculates the forward price for a given option chain.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " valuation_date (str): The date of valuation.\n", - " end_date (str): The expiration date of the option.\n", - " r (float): The risk-free rate.\n", - " div_type (str): Type of dividend ('discrete' or 'continuous').\n", - " \n", - " Returns:\n", - " float: The calculated forward price.\n", - " \"\"\"\n", - " valuation_dates= [valuation_date] * len(chain)\n", - " end_dates = chain['expiration'].tolist()\n", - " S = chain['spot'].tolist()\n", - " tickers= [chain['root'].iloc[0]] * len(chain)\n", - " r = [get_rates(valuation_date)] * len(chain)\n", - " return vectorized_market_forward_calc(\n", - " ticks=tickers,\n", - " S=S,\n", - " valuation_dates=valuation_dates,\n", - " end_dates=end_dates,\n", - " r=r,\n", - " div_type=div_type)\n", - "\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Calculating forward price for AAPL on 2025-07-16\n", - "Done for AAPL on 2025-07-16\n", - "Calculating forward price for MSFT on 2025-07-16\n", - "Done for MSFT on 2025-07-16\n", - "Calculating forward price for GOOGL on 2025-07-16\n", - "Done for GOOGL on 2025-07-16\n", - "Calculating forward price for AMZN on 2025-07-16\n", - "2025-08-15 10:45:39 trade.optionlib.utils.market_data ERROR: Error fetching dividend schedule for AMZN: \n", - "[Error] -> Error getting data for AMZN: No dividend data found for AMZN\n", - "Done for AMZN on 2025-07-16\n", - "Calculating forward price for TSLA on 2025-07-16\n", - "2025-08-15 10:45:58 trade.optionlib.utils.market_data ERROR: Error fetching dividend schedule for TSLA: \n", - "[Error] -> Error getting data for TSLA: No dividend data found for TSLA\n", - "Done for TSLA on 2025-07-16\n" - ] - } - ], - "source": [ - "for tick in chains:\n", - " print(f\"Calculating forward price for {tick} on {test_valuation_date}\")\n", - " chains[tick]['f'] = get_forward_price_on_chain(\n", - " chains[tick],\n", - " test_valuation_date,\n", - " get_rates(test_valuation_date),\n", - " div_type='discrete'\n", - " )\n", - " chains[tick]['f_moneyness'] = chains[tick]['f'] / chains[tick]['spot']\n", - " chains[tick]['f_log_moneyness'] = np.log(chains[tick]['f_moneyness'])\n", - " print(f\"Done for {tick} on {test_valuation_date}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Calculating dividend schedule for AAPL on 2025-07-16\n", - "Done for AAPL on 2025-07-16\n", - "Calculating dividend schedule for MSFT on 2025-07-16\n", - "Done for MSFT on 2025-07-16\n", - "Calculating dividend schedule for GOOGL on 2025-07-16\n", - "Done for GOOGL on 2025-07-16\n", - "Calculating dividend schedule for AMZN on 2025-07-16\n", - "Done for AMZN on 2025-07-16\n", - "Calculating dividend schedule for TSLA on 2025-07-16\n", - "Done for TSLA on 2025-07-16\n" - ] - } - ], - "source": [ - "def get_dividend_schedule_on_chain(\n", - " chain:pd.DataFrame,\n", - " valuation_date:str\n", - ") -> list:\n", - " \"\"\"\n", - " Retrieves the dividend schedule for a given option chain.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " valuation_date (str): The date of valuation.\n", - " \n", - " Returns:\n", - " list: The dividend schedule for the option chain.\n", - " \"\"\"\n", - " sch= get_vectorized_dividend_scehdule(\n", - " tickers=[chain['root'].iloc[0]] * len(chain),\n", - " valuation_dates=[valuation_date] * len(chain),\n", - " end_dates=chain['expiration'].tolist(),\n", - " start_dates=[valuation_date] * len(chain),\n", - " )\n", - "\n", - " return vector_convert_to_time_frac(\n", - " sch,\n", - " valuation_dates=[valuation_date] * len(chain),\n", - " end_dates=chain['expiration'].tolist(),\n", - " )\n", - "for tick in chains:\n", - " print(f\"Calculating dividend schedule for {tick} on {test_valuation_date}\")\n", - " chains[tick]['div_schedule'] = get_dividend_schedule_on_chain(\n", - " chains[tick],\n", - " test_valuation_date\n", - " )\n", - " print(f\"Done for {tick} on {test_valuation_date}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "for tick in chains:\n", - " chains[tick]=format_chain(chains[tick])" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Calculating BS vol for AAPL on 2025-07-16\n", - "Done for AAPL on 2025-07-16\n", - "Calculating BS vol for MSFT on 2025-07-16\n", - "Done for MSFT on 2025-07-16\n", - "Calculating BS vol for GOOGL on 2025-07-16\n", - "Done for GOOGL on 2025-07-16\n", - "Calculating BS vol for AMZN on 2025-07-16\n", - "Done for AMZN on 2025-07-16\n", - "Calculating BS vol for TSLA on 2025-07-16\n", - "Done for TSLA on 2025-07-16\n" - ] - } - ], - "source": [ - "def get_bs_vol_on_chain(\n", - " chain:pd.DataFrame,\n", - " valuation_date:str\n", - ") -> pd.Series:\n", - " \"\"\"\n", - " Estimates the Black-Scholes implied volatility for a given option chain.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " Expected Columns: `f`, `strike`, `t`, `midpoint`, `right`. \n", - " valuation_date (str): The date of valuation.\n", - " \n", - " Returns:\n", - " pd.Series: The estimated Black-Scholes implied volatility for the option chain.\n", - " \"\"\"\n", - "\n", - " params = list(zip(\n", - " chain['f'], \n", - " chain['strike'], \n", - " chain['t'],\n", - " [get_rates(valuation_date)] * len(chain), \n", - " chain['midpoint'], \n", - " chain['right'].str.lower()\n", - " ))\n", - "\n", - " return vector_batch_processor(\n", - " vector_vol_estimation,\n", - " bsm_vol_est_brute_force,\n", - " params,\n", - "\n", - " )\n", - "\n", - "\n", - "for tick in chains:\n", - " print(f\"Calculating BS vol for {tick} on {test_valuation_date}\")\n", - " chains[tick]['bs_vol'] = get_bs_vol_on_chain(\n", - " chains[tick],\n", - " test_valuation_date\n", - " )\n", - " print(f\"Done for {tick} on {test_valuation_date}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "def get_discrete_crr_vol_on_chain(\n", - " chain:pd.DataFrame,\n", - " valuation_date:str,\n", - " N:int=250\n", - ") -> pd.Series:\n", - " \"\"\"\n", - " Estimates the discrete CRR implied volatility for a given option chain.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " Expected Columns: `spot`, `strike`, `t`, `midpoint`, `div_schedule`, `right`.\n", - " valuation_date (str): The date of valuation.\n", - " \n", - " Returns:\n", - " pd.Series: The estimated discrete CRR implied volatility for the option chain.\n", - " \"\"\"\n", - " crr_vector_params_discrete = list(zip(\n", - " chain['spot'], chain['strike'].tolist(), ## Spot, Strike\n", - " chain['t'], [get_rates(valuation_date)] * len(chain), ## Time to Maturity, Risk Free Rate\n", - " chain['midpoint'], ## Midpoint Price\n", - " chain['div_schedule'], ## Discrete Dividend Schedules\n", - " chain['right'].str.lower().tolist(), ## Option Type\n", - " [N] * len(chain), ## Number of Steps\n", - " ['discrete'] * len(chain), ## Dividend Type\n", - " [True] * len(chain),)) ## American==True, European==False\n", - " return vector_vol_estimation(estimate_crr_implied_volatility, \n", - " crr_vector_params_discrete)\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "# for tick in chains:\n", - "# print(f\"Calculating discrete CRR vol for {tick} on {test_valuation_date}\")\n", - "# chains[tick]['crr_vol_discrete'] = get_discrete_crr_vol_on_chain(\n", - "# chains[tick],\n", - "# test_valuation_date\n", - "# )\n", - "# print(f\"Done for {tick} on {test_valuation_date}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "def intrinsic_value(\n", - " strike: float,\n", - " spot: float,\n", - " right: Literal['c', 'p']\n", - ") -> float:\n", - " \"\"\"\n", - " Calculate the intrinsic value of an option.\n", - " \n", - " Args:\n", - " strike (float): The strike price of the option.\n", - " spot (float): The current spot price of the underlying asset.\n", - " right (Literal['c', 'p']): The type of option ('c' for call, 'p' for put).\n", - " \n", - " Returns:\n", - " float: The intrinsic value of the option.\n", - " \"\"\"\n", - " if right.lower() == 'c':\n", - " return max(0, spot - strike)\n", - " elif right.lower() == 'p':\n", - " return max(0, strike - spot)\n", - " else:\n", - " raise ValueError(f\"Invalid option type: {right}. Expected 'c' or 'p'.\"\n", - ")\n", - " \n", - "\n", - "def vector_eu_boundary(\n", - " f: np.ndarray,\n", - " strike: np.ndarray,\n", - " t: np.ndarray,\n", - " r: np.ndarray,\n", - " right: np.ndarray,\n", - "\n", - ") -> np.ndarray:\n", - " \"\"\"\n", - " Calculate the European option boundary values.\n", - " \n", - " Args:\n", - " f (np.ndarray): Forward prices.\n", - " strike (np.ndarray): Strike prices.\n", - " t (np.ndarray): Time to maturity.\n", - " r (np.ndarray): Risk-free rates.\n", - " right (np.ndarray): Option types ('c' for call, 'p' for put).\n", - " \n", - " Returns:\n", - " np.ndarray: The boundary values of the European options.\n", - " \"\"\"\n", - " f = np.asarray(f)\n", - " strike = np.asarray(strike)\n", - " t = np.asarray(t)\n", - " r = np.asarray(r)\n", - " right = np.asarray(right)\n", - " if f.shape != strike.shape or f.shape != t.shape or f.shape != r.shape or f.shape != right.shape:\n", - " raise ValueError(\"All input arrays must have the same shape.\")\n", - "\n", - " intrinsic_values = np.zeros_like(f)\n", - " call = right == 'c'\n", - " put = right == 'p'\n", - " intrinsic_values[call] = np.maximum(0, f[call] - strike[call])\n", - " intrinsic_values[put] = np.maximum(0, strike[put] - f[put])\n", - " boundary = intrinsic_values * np.exp(-r * t)\n", - " # boundary = np.zeros_like(f)\n", - " # boundary[call] = np.maximum(0, f[call] - pv_k[call])\n", - " # boundary[put] = np.maximum(0, pv_k[put] - f[put])\n", - " return boundary" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Chain Prep Checklist" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Remove Junk (Step 1)" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "## Converting american prices to european prices & Extracting the midpoint\n", - "import time\n", - "start_time = time.time()\n", - "def calculate_european_equivalent(chain: pd.DataFrame) -> pd.DataFrame:\n", - " \"\"\"\n", - " Converts American option prices to European equivalent prices.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " \n", - " Returns:\n", - " pd.DataFrame: The modified option chain DataFrame with European equivalent prices.\n", - " \"\"\"\n", - " chain = chain.copy()\n", - " \n", - " ## Convert American prices to European equivalent prices\n", - "\n", - " ## Calculate European prices using Black-Scholes model\n", - " val_date = chain['valuation_date'].iloc[0].strftime('%Y-%m-%d')\n", - " european_price_params = [\n", - " chain['f'].tolist(),\n", - " chain['strike'].tolist(),\n", - " chain['t'].tolist(),\n", - " [get_rates(val_date)] * len(chain), # Risk-free rate\n", - " chain['bs_vol'].tolist(),\n", - " chain['right'].str.lower().tolist(),\n", - " ]\n", - "\n", - " european_midpoint = black_scholes_vectorized(*european_price_params)\n", - " # european_midpoint = vector_batch_processor(\n", - " # black_scholes_vectorized,\n", - " # *european_price_params\n", - " # )\n", - " chain['european_midpoint'] = european_midpoint\n", - "\n", - " ## Calculate American Prices using CRR Binomial model\n", - " crr_params = [\n", - " chain['strike'].tolist(),\n", - " chain['expiration'].tolist(),\n", - " chain['bs_vol'].tolist(),\n", - " [get_rates(val_date)] * len(chain), # Risk-free rate\n", - " [500] * len(chain), # Number of steps\n", - " chain['spot'].tolist(),\n", - " ['discrete'] * len(chain), # Dividend type\n", - " chain['div_schedule'].tolist(), # Dividend schedules\n", - " chain['right'].str.lower().tolist(),\n", - " chain['valuation_date'].tolist(), # Start dates\n", - " chain['valuation_date'].tolist(), # Valuation dates\n", - " [True] * len(chain), # American options\n", - " ]\n", - "\n", - " def batch_hacked(*args):\n", - " \"\"\"\n", - " A batch processor to handle the CRR binomial pricing.\n", - " \"\"\"\n", - " return binomial_tree_price_batch(*args)[0]\n", - " \n", - " american_midpoint = vector_batch_processor(\n", - " batch_hacked,\n", - " *crr_params\n", - " )\n", - " chain['american_midpoint'] = american_midpoint\n", - "\n", - " return chain\n" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "dict_keys(['AAPL', 'MSFT', 'GOOGL', 'AMZN', 'TSLA'])" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "chains.keys()" - ] - }, - { - "cell_type": "code", - "execution_count": 288, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Size before removing junk quotes: 2428\n", - "Size after removing junk quotes: 2024\n" - ] - } - ], - "source": [ - "sample_chain = chains['AAPL'].reset_index(drop=True)\n", - "\n", - "class ChainChecklist:\n", - " \"\"\"\n", - " A class to perform various checks and transformations on option chain data.\n", - " This class includes methods to prepare the chain, remove junk quotes, and more.\n", - " \"\"\"\n", - "\n", - "\n", - " @staticmethod\n", - " def chain_prep(chain:pd.DataFrame) -> pd.DataFrame:\n", - " \"\"\"\n", - " Prepares the option chain DataFrame for further processing.\n", - " Runs through various transformations.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " \n", - " Returns:\n", - " pd.DataFrame: The prepared option chain DataFrame.\n", - " \"\"\"\n", - " pass\n", - "\n", - "\n", - "\n", - " @staticmethod\n", - " def remove_junk_quotes(chain:pd.DataFrame) -> pd.DataFrame:\n", - " \"\"\"\n", - " Removes junk quotes from the option chain DataFrame.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " \n", - " Returns:\n", - " pd.DataFrame: The cleaned option chain DataFrame.\n", - " \"\"\"\n", - " \n", - " chain = chain.copy()\n", - " ## Remove zero bids and ask\n", - " # chain = chain[(chain['bid_size'] != 0) & \n", - " # (chain['ask_size'] != 0) &\n", - " # (chain['closebid'] != 0) &\n", - " # (chain['closeask'] != 0)]\n", - " \n", - " ## Drop midpoint < intrinsic value\n", - " chain['intrinsic_value'] = chain.apply(\n", - " lambda x: intrinsic_value(\n", - " x['strike'], \n", - " x['spot'], \n", - " x['right']\n", - " ), axis=1)\n", - "\n", - " ## Drop below European lower bound\n", - " chain['eu_lower_bound'] = vector_eu_boundary(\n", - " chain['f'].tolist(),\n", - " chain['strike'].tolist(),\n", - " chain['t'].tolist(),\n", - " [get_rates(chain['valuation_date'].iloc[0].strftime('%Y-%m-%d'))] * len(chain),\n", - " chain['right'].str.lower().tolist()\n", - " )\n", - "\n", - " chain['lower_bound'] = chain.apply(lambda x: max( \n", - " x['intrinsic_value'],\n", - " x['eu_lower_bound'],\n", - " 0), axis=1)\n", - " \n", - " chain['upper_bound'] = chain.apply(lambda x: x['spot'] if x['right'] == 'c' else x['strike'], axis=1)\n", - " chain = chain[chain['midpoint'] >= chain['lower_bound']]\n", - " chain = chain[chain['midpoint'] <= chain['upper_bound']]\n", - "\n", - "\n", - " ## Replace midpoint with upper bound if above upper bound and lower bound if below lower bound\n", - " # chain['midpoint'] = chain.apply(\n", - " # lambda x: min(max(x['midpoint'], x['lower_bound']), x['upper_bound']),\n", - " # axis=1\n", - " # )\n", - " # chain = confine_chain_with_pricing_config(chain)\n", - "\n", - " ## Remove crossed quotes\n", - " # chain = chain[chain['closebid'] <= chain['closeask']]\n", - "\n", - " ## Drop spreads above 25% of midpoint\n", - " # chain['spread'] = abs(chain['closeask'] - chain['closebid'])\n", - " # chain = chain[chain['spread'] <= 0.25 * chain['midpoint']]\n", - "\n", - "\n", - " return chain#.reset_index(drop=True)\n", - " \n", - " @staticmethod\n", - " def get_european_price(\n", - " chain:pd.DataFrame) -> pd.Series:\n", - " \"\"\"\n", - " Calculates the European price for the options in the chain.\n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " Returns:\n", - " pd.Series: The European price for each option in the chain.\n", - " \"\"\"\n", - " chain = chain.copy()\n", - " val_date = chain['valuation_date'].iloc[0].strftime('%Y-%m-%d')\n", - " european_price_params = [\n", - " chain['f'].tolist(),\n", - " chain['strike'].tolist(),\n", - " chain['t'].tolist(),\n", - " [get_rates(val_date)] * len(chain), # Risk-free rate\n", - " chain['bs_vol'].tolist(),\n", - " chain['right'].str.lower().tolist(),\n", - " ]\n", - "\n", - "\n", - " european_midpoint = black_scholes_vectorized(*european_price_params)\n", - " # european_midpoint = vector_batch_processor(\n", - " # black_scholes_vectorized,\n", - " # *european_price_params\n", - " # )\n", - " return pd.Series(european_midpoint, index=chain.index)\n", - " \n", - " @staticmethod\n", - " def get_american_price(chain: pd.DataFrame, N: int = 500) -> pd.Series:\n", - " \"\"\"\n", - " Calculates the American price for the options in the chain using a binomial tree.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " N (int): The number of steps in the binomial tree.\n", - " \n", - " Returns:\n", - " pd.Series: The American price for each option in the chain.\n", - " \"\"\"\n", - " chain = chain.copy()\n", - " val_date = chain['valuation_date'].iloc[0].strftime('%Y-%m-%d')\n", - " crr_params = [\n", - " chain['strike'].tolist(),\n", - " chain['expiration'].tolist(),\n", - " chain['bs_vol'].tolist(),\n", - " [get_rates(val_date)] * len(chain), # Risk-free rate\n", - " [N] * len(chain), # Number of steps\n", - " chain['spot'].tolist(),\n", - " ['discrete'] * len(chain), # Dividend type\n", - " chain['div_schedule'].tolist(), # Dividend schedules\n", - " chain['right'].str.lower().tolist(),\n", - " chain['valuation_date'].tolist(), # Start dates\n", - " chain['valuation_date'].tolist(), # Valuation dates\n", - " [True] * len(chain), # American options\n", - " ]\n", - "\n", - " def batch_hacked(*args):\n", - " \"\"\"\n", - " A batch processor to handle the CRR binomial pricing.\n", - " \"\"\"\n", - " return binomial_tree_price_batch(*args)[0]\n", - " \n", - " american_midpoint = vector_batch_processor(\n", - " batch_hacked,\n", - " *crr_params\n", - " )\n", - " chain['american_midpoint'] = american_midpoint\n", - " return pd.Series(american_midpoint, index=chain.index)\n", - "\n", - " @staticmethod\n", - " def calculate_european_equivalent_vols(chain: pd.DataFrame, N: int = 500) -> pd.DataFrame:\n", - " \"\"\"\n", - " Calculates the European equivalent prices for the options in the chain.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " N (int): The number of steps in the binomial tree.\n", - " \n", - " Returns:\n", - " pd.DataFrame: The option chain DataFrame with European equivalent prices.\n", - " \"\"\"\n", - " chain = chain.copy()\n", - " chain['european_midpoint'] = ChainChecklist.get_european_price(chain)\n", - " chain['american_midpoint'] = ChainChecklist.get_american_price(chain, N)\n", - " chain['early_exercise_premium'] = chain.apply(\n", - " lambda x: max(x['american_midpoint'] - x['european_midpoint'], 0), axis=1\n", - " )\n", - " chain['european_equivalent_mid'] = chain['midpoint'] - chain['early_exercise_premium']\n", - " chain['european_vols_equiv'] = ChainChecklist.get_bs_vol_on_chain(\n", - " chain,\n", - " chain['valuation_date'].iloc[0].strftime('%Y-%m-%d')\n", - " )\n", - " return chain\n", - " \n", - " @staticmethod\n", - " def get_bs_vol_on_chain(\n", - " chain: pd.DataFrame,\n", - " valuation_date: str\n", - " ) -> pd.Series:\n", - " \"\"\"\n", - " Estimates the Black-Scholes implied volatility for a given option chain.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " Expected Columns: `f`, `strike`, `t`, `midpoint`, `right`. \n", - " valuation_date (str): The date of valuation.\n", - " \n", - " Returns:\n", - " pd.Series: The estimated Black-Scholes implied volatility for the option chain.\n", - " \"\"\"\n", - " params = list(zip(\n", - " chain['f'], \n", - " chain['strike'], \n", - " chain['t'],\n", - " [get_rates(valuation_date)] * len(chain), \n", - " chain['european_equivalent_mid'], \n", - " chain['right'].str.lower()\n", - " ))\n", - " return vector_batch_processor(\n", - " vector_vol_estimation,\n", - " bsm_vol_est_brute_force,\n", - " params,\n", - " )\n", - "\n", - "print(f\"Size before removing junk quotes: {sample_chain.shape[0]}\")\n", - "junkless_chain = ChainChecklist.remove_junk_quotes(sample_chain)\n", - "print(f\"Size after removing junk quotes: {junkless_chain.shape[0]}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 289, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(50.93873517786561, 49.06126482213439)\n", - "(45.2970297029703, 54.70297029702971)\n", - "(50.0, 50.0)\n" - ] - } - ], - "source": [ - "## Chain in sample_chain not in junkless_chain\n", - "seperate = sample_chain[~sample_chain.index.isin(junkless_chain.index)]\n", - "\n", - "## Percent P v Percent C\n", - "def percent_put_call(chain: pd.DataFrame) -> Tuple[float, float]:\n", - " \"\"\"\n", - " Calculates the percentage of put and call options in the chain.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " \n", - " Returns:\n", - " Tuple[float, float]: The percentage of put and call options.\n", - " \"\"\"\n", - " total_options = len(chain)\n", - " if total_options == 0:\n", - " return 0.0, 0.0\n", - " put_count = len(chain[chain['right'].str.lower() == 'p'])\n", - " call_count = len(chain[chain['right'].str.lower() == 'c'])\n", - " return (put_count / total_options) * 100, (call_count / total_options) * 100\n", - "print(percent_put_call(junkless_chain))\n", - "print(percent_put_call(seperate))\n", - "print(percent_put_call(sample_chain))" - ] - }, - { - "cell_type": "code", - "execution_count": 290, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Index(['root', 'expiration', 'strike', 'right', 'bid_size', 'closebid',\n", - " 'ask_size', 'closeask', 'date', 'midpoint', 'weighted_midpoint', 'spot',\n", - " 'valuation_date', 'moneyness', 'log_moneyness', 't', 'dte', 'f',\n", - " 'f_moneyness', 'f_log_moneyness', 'div_schedule', 'bs_vol',\n", - " 'intrinsic_value', 'eu_lower_bound', 'lower_bound', 'upper_bound'],\n", - " dtype='object')" - ] - }, - "execution_count": 290, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "junkless_chain.columns" - ] - }, - { - "cell_type": "code", - "execution_count": 291, - "metadata": {}, - "outputs": [], - "source": [ - "european_converted_chain = ChainChecklist.calculate_european_equivalent_vols(junkless_chain, N=250)" - ] - }, - { - "cell_type": "code", - "execution_count": 292, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(Index(['root', 'expiration', 'strike', 'right', 'bid_size', 'closebid',\n", - " 'ask_size', 'closeask', 'date', 'midpoint', 'weighted_midpoint', 'spot',\n", - " 'valuation_date', 'moneyness', 'log_moneyness', 't', 'dte', 'f',\n", - " 'f_moneyness', 'f_log_moneyness', 'div_schedule', 'bs_vol',\n", - " 'intrinsic_value', 'eu_lower_bound', 'lower_bound', 'upper_bound',\n", - " 'european_midpoint', 'american_midpoint', 'early_exercise_premium',\n", - " 'european_equivalent_mid', 'european_vols_equiv'],\n", - " dtype='object'),\n", - " \n", - " ['2025-07-18 00:00:00', '2025-07-25 00:00:00', '2025-08-01 00:00:00',\n", - " '2025-08-08 00:00:00', '2025-08-15 00:00:00', '2025-08-22 00:00:00',\n", - " '2025-08-29 00:00:00', '2025-09-19 00:00:00', '2025-10-17 00:00:00',\n", - " '2025-11-21 00:00:00', '2025-12-19 00:00:00', '2026-01-16 00:00:00',\n", - " '2026-02-20 00:00:00', '2026-03-20 00:00:00', '2026-05-15 00:00:00',\n", - " '2026-06-18 00:00:00', '2026-09-18 00:00:00', '2026-12-18 00:00:00',\n", - " '2027-01-15 00:00:00', '2027-06-17 00:00:00', '2027-12-17 00:00:00']\n", - " Length: 21, dtype: datetime64[ns])" - ] - }, - "execution_count": 292, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "european_converted_chain.columns, european_converted_chain.expiration.sort_values().unique()," - ] - }, - { - "cell_type": "code", - "execution_count": 293, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "210.16000366210938\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
rightstrikemoneynessCP
0115.00.5472020.5556530.582898
1120.00.5709940.5966460.560027
2125.00.5947850.5245330.535281
3130.00.6185760.5089110.509036
4135.00.6423680.4391730.486165
5140.00.6661590.4740420.461544
6145.00.6899510.4104280.439923
7150.00.7137420.4039290.418552
8155.00.7375330.3944310.399555
9160.00.7613250.3821830.380434
10165.00.7851160.3731850.363187
11170.00.8089070.3453150.348814
12175.00.8326990.3328170.335316
13180.00.8564900.3205690.324068
14185.00.8802820.3120710.312445
15190.00.9040730.3010720.302572
16195.00.9278640.2925740.292949
17200.00.9516560.2838250.284825
18205.00.9754470.2759520.277952
19210.00.9992390.2700780.271453
20215.01.0230300.2629540.265204
21220.01.0468210.2587050.260954
22225.01.0706130.2530810.257705
23230.01.0944040.2505810.250581
24235.01.1181960.2493320.259830
25240.01.1419870.2504560.259955
26245.01.1657780.2519560.272702
27250.01.1895700.2562050.295823
28255.01.2133610.2602050.317945
29265.01.2609440.2723280.364061
30275.01.3085270.2859500.452921
31290.01.3799010.3049470.482541
32300.01.4274840.3148200.522784
33305.01.4512750.3278180.539781
34310.01.4750670.3319420.553903
35320.01.5226490.3508140.599145
36330.01.5702320.3674360.633014
37350.01.6653980.3598120.700003
38360.01.7129810.3985550.746120
39370.01.7605630.4170520.774865
40380.01.8081460.4349240.802360
41390.01.8557290.4522960.823356
\n", - "
" - ], - "text/plain": [ - "right strike moneyness C P\n", - "0 115.0 0.547202 0.555653 0.582898\n", - "1 120.0 0.570994 0.596646 0.560027\n", - "2 125.0 0.594785 0.524533 0.535281\n", - "3 130.0 0.618576 0.508911 0.509036\n", - "4 135.0 0.642368 0.439173 0.486165\n", - "5 140.0 0.666159 0.474042 0.461544\n", - "6 145.0 0.689951 0.410428 0.439923\n", - "7 150.0 0.713742 0.403929 0.418552\n", - "8 155.0 0.737533 0.394431 0.399555\n", - "9 160.0 0.761325 0.382183 0.380434\n", - "10 165.0 0.785116 0.373185 0.363187\n", - "11 170.0 0.808907 0.345315 0.348814\n", - "12 175.0 0.832699 0.332817 0.335316\n", - "13 180.0 0.856490 0.320569 0.324068\n", - "14 185.0 0.880282 0.312071 0.312445\n", - "15 190.0 0.904073 0.301072 0.302572\n", - "16 195.0 0.927864 0.292574 0.292949\n", - "17 200.0 0.951656 0.283825 0.284825\n", - "18 205.0 0.975447 0.275952 0.277952\n", - "19 210.0 0.999239 0.270078 0.271453\n", - "20 215.0 1.023030 0.262954 0.265204\n", - "21 220.0 1.046821 0.258705 0.260954\n", - "22 225.0 1.070613 0.253081 0.257705\n", - "23 230.0 1.094404 0.250581 0.250581\n", - "24 235.0 1.118196 0.249332 0.259830\n", - "25 240.0 1.141987 0.250456 0.259955\n", - "26 245.0 1.165778 0.251956 0.272702\n", - "27 250.0 1.189570 0.256205 0.295823\n", - "28 255.0 1.213361 0.260205 0.317945\n", - "29 265.0 1.260944 0.272328 0.364061\n", - "30 275.0 1.308527 0.285950 0.452921\n", - "31 290.0 1.379901 0.304947 0.482541\n", - "32 300.0 1.427484 0.314820 0.522784\n", - "33 305.0 1.451275 0.327818 0.539781\n", - "34 310.0 1.475067 0.331942 0.553903\n", - "35 320.0 1.522649 0.350814 0.599145\n", - "36 330.0 1.570232 0.367436 0.633014\n", - "37 350.0 1.665398 0.359812 0.700003\n", - "38 360.0 1.712981 0.398555 0.746120\n", - "39 370.0 1.760563 0.417052 0.774865\n", - "40 380.0 1.808146 0.434924 0.802360\n", - "41 390.0 1.855729 0.452296 0.823356" - ] - }, - "execution_count": 293, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "european_converted_chain.expiration.sort_values().unique()\n", - "print(european_converted_chain.spot[0])\n", - "rash = european_converted_chain[european_converted_chain.expiration=='2025-09-19'].pivot_table(\n", - " index = 'right',\n", - " columns=['strike', 'moneyness',],\n", - " aggfunc=sum,\n", - " values='european_vols_equiv').dropna(axis=1).T.reset_index()\n", - "\n", - "# rash['spread']=rash['C'] - rash['P']\n", - "# rash.plot(title='Spread between Call and Put Vols',x='log_moneyness', y='spread')\n", - "rash" - ] - }, - { - "cell_type": "code", - "execution_count": 294, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\n", - "['2025-07-18 00:00:00', '2025-07-25 00:00:00', '2025-08-01 00:00:00',\n", - " '2025-08-08 00:00:00', '2025-08-15 00:00:00', '2025-08-22 00:00:00',\n", - " '2025-08-29 00:00:00', '2025-09-19 00:00:00', '2025-10-17 00:00:00',\n", - " '2025-11-21 00:00:00', '2025-12-19 00:00:00', '2026-01-16 00:00:00',\n", - " '2026-02-20 00:00:00', '2026-03-20 00:00:00', '2026-05-15 00:00:00',\n", - " '2026-06-18 00:00:00', '2026-09-18 00:00:00', '2026-12-18 00:00:00',\n", - " '2027-01-15 00:00:00', '2027-06-17 00:00:00', '2027-12-17 00:00:00']\n", - "Length: 21, dtype: datetime64[ns]" - ] - }, - "execution_count": 294, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "european_converted_chain.expiration.sort_values().unique()" - ] - }, - { - "cell_type": "code", - "execution_count": 295, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
rootexpirationstrikerightbid_sizeclosebidask_sizecloseaskdatemidpoint...bs_volintrinsic_valueeu_lower_boundlower_boundupper_boundeuropean_midpointamerican_midpointearly_exercise_premiumeuropean_equivalent_mideuropean_vols_equiv
0AAPL2025-08-22215.0P19.753810.15202507169.950...0.2909494.8399963.9202564.839996215.09.94908510.0396790.0905959.8594050.287575
1AAPL2025-08-29215.0C26.2516.40202507166.325...0.2747020.0000000.0000000.000000215.06.3266166.3247920.0000006.3250000.274702
2AAPL2025-08-22215.0C25.6515.75202507165.700...0.2784510.0000000.0000000.000000215.05.6994995.6936770.0000005.7000000.278451
3AAPL2025-08-29215.0P249.902310.602025071610.250...0.2808264.8399963.7466954.839996215.010.24989710.3639520.11405510.1359450.276827
4AAPL2025-09-19215.0P811.25111.402025071611.325...0.2702034.8399963.2268534.839996215.011.32414311.5025290.17838611.1466140.265204
..................................................................
2423AAPL2025-07-25215.0P45.90306.10202507166.000...0.2384584.8399964.6159134.839996215.06.0003776.0341810.0338055.9661950.235459
2424AAPL2025-08-08215.0C64.45124.55202507164.500...0.3016970.0000000.0000000.000000215.04.5010644.5062380.0051744.4948260.301447
2425AAPL2025-08-08215.0P48.5568.85202507168.700...0.2983234.8399964.2678034.839996215.08.6997168.7649410.0652268.6347740.295199
2426AAPL2026-06-18210.0P1318.402318.702025071618.550...0.2808260.0000000.0000000.000000210.018.55143019.4095900.85816017.6918400.269703
2427AAPL2026-06-18210.0C125.40225.602025071625.500...0.2747020.1600047.4205997.420599210.025.49809225.5811940.08310225.4168980.273702
\n", - "

2024 rows × 31 columns

\n", - "
" - ], - "text/plain": [ - " root expiration strike right bid_size closebid ask_size closeask \\\n", - "0 AAPL 2025-08-22 215.0 P 1 9.75 38 10.15 \n", - "1 AAPL 2025-08-29 215.0 C 2 6.25 1 6.40 \n", - "2 AAPL 2025-08-22 215.0 C 2 5.65 1 5.75 \n", - "3 AAPL 2025-08-29 215.0 P 24 9.90 23 10.60 \n", - "4 AAPL 2025-09-19 215.0 P 8 11.25 1 11.40 \n", - "... ... ... ... ... ... ... ... ... \n", - "2423 AAPL 2025-07-25 215.0 P 4 5.90 30 6.10 \n", - "2424 AAPL 2025-08-08 215.0 C 6 4.45 12 4.55 \n", - "2425 AAPL 2025-08-08 215.0 P 4 8.55 6 8.85 \n", - "2426 AAPL 2026-06-18 210.0 P 13 18.40 23 18.70 \n", - "2427 AAPL 2026-06-18 210.0 C 1 25.40 2 25.60 \n", - "\n", - " date midpoint ... bs_vol intrinsic_value eu_lower_bound \\\n", - "0 20250716 9.950 ... 0.290949 4.839996 3.920256 \n", - "1 20250716 6.325 ... 0.274702 0.000000 0.000000 \n", - "2 20250716 5.700 ... 0.278451 0.000000 0.000000 \n", - "3 20250716 10.250 ... 0.280826 4.839996 3.746695 \n", - "4 20250716 11.325 ... 0.270203 4.839996 3.226853 \n", - "... ... ... ... ... ... ... \n", - "2423 20250716 6.000 ... 0.238458 4.839996 4.615913 \n", - "2424 20250716 4.500 ... 0.301697 0.000000 0.000000 \n", - "2425 20250716 8.700 ... 0.298323 4.839996 4.267803 \n", - "2426 20250716 18.550 ... 0.280826 0.000000 0.000000 \n", - "2427 20250716 25.500 ... 0.274702 0.160004 7.420599 \n", - "\n", - " lower_bound upper_bound european_midpoint american_midpoint \\\n", - "0 4.839996 215.0 9.949085 10.039679 \n", - "1 0.000000 215.0 6.326616 6.324792 \n", - "2 0.000000 215.0 5.699499 5.693677 \n", - "3 4.839996 215.0 10.249897 10.363952 \n", - "4 4.839996 215.0 11.324143 11.502529 \n", - "... ... ... ... ... \n", - "2423 4.839996 215.0 6.000377 6.034181 \n", - "2424 0.000000 215.0 4.501064 4.506238 \n", - "2425 4.839996 215.0 8.699716 8.764941 \n", - "2426 0.000000 210.0 18.551430 19.409590 \n", - "2427 7.420599 210.0 25.498092 25.581194 \n", - "\n", - " early_exercise_premium european_equivalent_mid european_vols_equiv \n", - "0 0.090595 9.859405 0.287575 \n", - "1 0.000000 6.325000 0.274702 \n", - "2 0.000000 5.700000 0.278451 \n", - "3 0.114055 10.135945 0.276827 \n", - "4 0.178386 11.146614 0.265204 \n", - "... ... ... ... \n", - "2423 0.033805 5.966195 0.235459 \n", - "2424 0.005174 4.494826 0.301447 \n", - "2425 0.065226 8.634774 0.295199 \n", - "2426 0.858160 17.691840 0.269703 \n", - "2427 0.083102 25.416898 0.273702 \n", - "\n", - "[2024 rows x 31 columns]" - ] - }, - "execution_count": 295, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "european_converted_chain" - ] - }, - { - "cell_type": "code", - "execution_count": 287, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1IAAAIoCAYAAABj6NoUAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAs8pJREFUeJzs3Xd4k1X7B/DveZJOSnfZ0MEerYAMLVtUQBEXQsGBg6r8HC9uRH1BRQUnKm58xQVUUFRUUEFAAWVjyy6jjJaWpnvQkTzn90dIaEjaJmnSpuX7ua5e0Ccn5zlZTe7c59xHSCkliIiIiIiIyG5KQw+AiIiIiIiosWEgRURERERE5CAGUkRERERERA5iIEVEREREROQgBlJEREREREQOYiBFRERERETkIAZSREREREREDmIgRURERERE5CAGUkRERERERA5iIEVN1vDhwyGEcPt5hBAYPny4xbHZs2dDCIH169fX2pYah8b+2G3fvh1XXXUVwsPDIYRA7969G3pITUpUVBSioqIaehhNxqJFiyCEwKJFixy6XnV/e4mI3IGBFNW7W2+9FUIIvP/++7W2vfrqqyGEwIoVK+phZLa5+wNSQ7zx//7777j11lsRHR0Nf39/+Pn5oVOnTrj99tuxatWqehsH1Y/CwkJce+212Lp1KxISEjBr1izcf//99T4O03O96o+fnx+6dOmCBx54AKdOnXK4zzVr1mDixIno0KEDfH19ERwcjP79++P5559HXl6ey8ZeX1/MNARbj8uFP435S4SLmZQSq1evxkMPPYTevXsjJCQEvr6+6Nq1K6ZPn46srKxqr5ubm4vp06cjKioKPj4+aNOmDe6++26br9OcnBwsXLgQN954Izp16gQ/Pz8EBQVh8ODB+PTTT6GqqtV10tLSanzOJSQkOHRbKysr8fbbb+Ouu+5C79694e3tDSEEFi5cWOt1P//8cwwYMAABAQEICgrC8OHD8dNPPzl0fgDIz8/Ha6+9hltvvRU9evSAVquFEAJr1qyp9jq1vfaEEPjyyy8dHgvVD21DD4AuPomJiVi8eDEWLlyI//u//6u2XVpaGtasWYPWrVvjuuuuq8cROmb//v3w9/d3eVt3KCoqwh133IHvv/8evr6+uOKKK3DTTTfBy8sLx44dwy+//IKvvvoKjz32GF5//fUGG6cnaujHri62bt2KM2fO4KWXXsLMmTMbejgYNmyY+YO5TqfDb7/9hvfffx/ffPMN/vnnH3Ts2LHWPsrLyzF16lR89dVX8PPzw5gxY9ClSxcUFxfjjz/+wOzZs7FgwQJ8++23GDp0qJtvEbB27Vq3n8Pdqj4uF6rvbNuNN96Iyy67DK1bt3boeg8++CASEhLQoUMHN42scSkvL8eYMWPg7e2NoUOH4sorr4TBYMAff/yBt99+G0uXLsVff/2Fzp07W1wvJycH8fHxOHToEK644gokJCTgwIED+Oyzz/Dzzz/j77//RkxMjLn9smXLMG3aNLRu3RojRoxAhw4dkJWVhe+++w5Tp07FqlWrsGzZMptfRlxyySW44YYbrI736tXLodtaUlKC6dOnAwBatmyJVq1a4eTJk7Ve7/HHH8cbb7yBdu3aITExERUVFVi6dCmuu+46vPvuu3jwwQftHkNaWhqefPJJAEC7du0QHh5eY7AKALNmzbJ5vKioCG+++Sa0Wi2uuuoqu8dA9UwSNYAuXbpIAHLHjh3Vtnn22WclADlz5kynzjFs2DDpiqd4ZGSkjIyMdOg6s2bNkgDkunXrXNq2LgwGgxw1apQEIEeMGCHT09Ot2pSVlcn58+fL//u//3PrWKh+ff755xKA/Oyzzxp0HKbn+qxZsyyOV1RUyJEjR0oA8s4777Srr7vuuksCkH379pUnTpywuExVVfnuu+9KRVFkQECA3LdvX53H7qq/J56ouseFGr+Kigo5Z84cmZuba3HcYDDI++67TwKQY8eOtbrevffeKwHIRx991OL422+/LQHIUaNGWRxfu3at/PHHH6XBYLA4fvr0adm+fXsJQC5fvtzismPHjkkAcsqUKXW4heeVl5fLX375RWZkZEgpzz+vP/nkk2qvs2nTJglAduzY0eI+OnbsmAwNDZU+Pj7y2LFjdo8hNzdXrlmzRubk5EgppZwyZYoEIH///XeHb8+HH34oAcgbb7zR4etS/Wma7wrk8V577TUJQN5///02L9fr9bJt27ZSCCGPHj1qPr5mzRo5atQoGRISIr29vWXnzp3lU089JfPz8636sPXBp7y8XL777rtyzJgxskOHDtLb21uGhITIkSNHyl9++cWi7bp16yQAmz9V//ADkMOGDbO4bnXB0YVtIyMjqz2HlFImJCRIAHL9+vU276fly5dLAPKBBx6weXlVX331lQQgO3XqJIuLi2tsW1ZWZvX7K6+8Inv16iX9/Pxk8+bN5eDBg2VSUpLVdau+OR4+fFjefPPNMjQ0VAYEBMirrrpKpqSkSCmlPHPmjExMTJStWrWSPj4+sl+/fvKPP/6w6q/qfblo0SLZu3dv6evrKyMiIuRdd90lT58+bXWd7du3y4cffljGxcXJkJAQ6ePjIzt16iQfffRRqw8UUkr52WefmQONVatWyWHDhsnAwECL54+tx7mwsFC+8MILsmfPnrJ58+YyICBAxsTEyAkTJsjt27dbnScpKUkOGTJEBgYGSl9fX9mrVy/58ssvW93fUp4P4IuLi+Xjjz8u27dvL729vWXHjh3l3LlzpaqqVtep7rGw9VM1qMrIyJD/93//JyMjI6WXl5cMDw+XN954o83bYM99VZ2aPrAnJSVJALJHjx619vPXX39JADIkJMT8ocmWp556SgKQV155pc1x2POcquk+vPC1bOsLF2dfO8eOHZMTJ06UYWFh0sfHR1566aVy5cqVVtcpLy+Xb7/9tuzTp48MDg6Wfn5+MjIyUo4bN87uD2+OBlIPP/ywBCAfeeQRq8sWLlxovs9NH6qr3q79+/fL66+/XoaEhEh/f385aNAg+euvv1r1U/V5VpXpfi4oKJCPPPKIjIyMlFqt1jz22v72Zmdnm//ueHt7yx49esj//e9/Nm9nWVmZnDVrloyOjpbe3t4yKipKPvPMM7KsrMzm34Pa1Pfrvzbp6ekSgAwICLA4XlRUJP38/GSzZs1kYWGhxWUGg8H8vnXkyBG7zvPSSy9JAPLBBx+0OO7qQOpC9gRSt99+uwRg8znw3HPPSQDyv//9r9NjqEsg1bdvXwlArl692unzk/txah81iClTpuCZZ57BkiVL8MYbb1hNmVq1ahXS09Nx1VVXITo6GgDw0UcfYdq0aWjWrBluueUWtGjRAuvXr8e8efOwcuVKbNq0CcHBwTWeNzc3F//5z38QHx+Pq666ChERETh9+jRWrlyJa665Bp988gmmTp0KwDiVZdasWZg/fz4AmKcMAHDZQv3p06fj+++/x4YNGzBlyhSr6TPTpk3D0qVL8fHHH2PYsGFW1//oo48AwK71Lh9//DEA4zSGZs2a1djWx8fH/P+KigqMGjUKGzZsQLdu3fDAAw+gtLQUy5cvx8SJE7F79268/PLLVn2kpaVh4MCB6N69O+68806kpaVhxYoVGD58OP7++2+MHj0agYGBmDhxInJzc7F06VKMGTMGhw4dsjkt56233sJvv/2GiRMnYvTo0di4cSM+++wzrF+/Hlu2bEFERIS57SeffIIVK1Zg2LBhuPLKK6GqKnbs2IE333wTq1atwpYtW9C8eXOrcyxfvhyrV6/GmDFjcP/99+P48ePV3kdSSowePRqbN2/G5ZdfjqlTp0Kr1eLUqVNYt24dhgwZgksvvdTcfubMmXjllVcQHh6OyZMnIyAgAKtWrcLMmTPx66+/4rfffoO3t7fFOSorKzFq1ChkZGRgzJgx0Gq1+P777zFjxgyUlZVVOyXEJDg4GLNmzcLu3bvxww8/4Prrrzc/d03/Hjt2DIMHD0ZGRgauuOIKTJo0CSdPnsSyZcvw888/49tvv8XYsWPrdF/ZQ0oJAHatQ/rkk08AGKcJ1zT166mnnsL8+fOxZs0aHDt2zPy3xMSe55TpPly0aBGOHz9ucZ/XNt3N2dfO8ePHMWDAAMTExOD2229Hbm4ukpKScP3112PNmjUYMWKEue2dd96JJUuWoFevXrjjjjvg5+eHjIwMbNy4EatXr8aVV15Z6/3pqNdeew0bN27E/PnzMXLkSFx77bUAgL179+Lhhx9Gq1at8NVXX0FRLJdhHzt2DJdffjliY2Nx33334fTp00hKSsKYMWOwePFiTJw40a7zV1RU4IorrkBubi6uvvpqBAYGWj22tuTn52PQoEHw9vbG+PHjUV5ejmXLluHuu++GoiiYMmWKua2UEjfffDN+/vlndO7cGQ8++CAqKyuxaNEi7N2714F7y6ghXv+18fLyAgBotZYfBf/55x+cPXsWV199tdXfSUVRMGrUKHz88cdYt26dxfQ+R89jkpGRgY8++gg5OTkICwvD5Zdfjri4OGduksP++OMPAMDo0aOtLhszZgxefPFF/PHHH3j++efrZTwmO3bswM6dOxEVFYWrr766Xs9NDmrgQI4uYhMmTKh2utG4ceMkALls2TIppZRpaWnS29tbNm/eXO7fv9+i7bRp0yQAmZiYaHHcVkaqrKxMnjx50up8+fn5smfPnjIkJESWlpZaXFbb1D7UISNVU1uTnj17Sh8fH6nT6SyOHzlyRAohZHx8fLVjM6msrJTe3t4SgExNTa21fVUvv/yyBCDHjBkjKysrzcezsrLM30xu2rTJfLzqN/hz5syx6OuFF14wZxLuu+8+i2kgX3zxhQQgp0+fbnEd0/3j5eUld+7caXHZ9OnTJQB59913WxxPS0uTer3e6raYvi2fO3euxXHTt99CCLlq1Sqb98OFj11ycrIEIG+44QartgaDwSLztXnzZglAtm/f3iLbUVlZKceOHSsByJdeesmiD9N9O2bMGIvnZFZWlgwKCpJBQUGyoqLC5lgvVN23+1JKefXVV9t8rDZt2iQ1Go0MDQ2VRUVFVn3VdF9Vp7rMR2VlpbziiitsPpa2xMTESADyt99+q7VtfHy8BCC//PJLq3E48pyqbWqfrb8TdXntzJ4926Kv1atXm/syyc/Pl0IIeemll9p8vl/4N6M6pvtj2LBhctasWTZ//v77b4vrpKamyubNm8vw8HB56tQpWVJSInv27CkVRZFr1qyxaFv1dj3++OMWl23btk1qtVoZHBwsCwoKzMdrykgBkCNHjrSZWa/pby8Aec8991jcV3v37pUajUZ2797dor3p79GQIUNkeXm5+XheXp7s2rWrQxmphn79V2fu3LkSgExISLA4vmDBApsZJBPTjJInn3yy1nNUVlbKXr162cys1JTtHT58uDx+/LjzN07WnpEqLi62mZEzyc7OlgBkixYtnB6Dsxkp09TKC58X5HkYSFGDWbNmjQQgBw0aZHE8IyNDarVa2aJFC/MbxZw5cyQA+fTTT1v1k5ubK5s3by59fX0tpkg4uqbhjTfekADkhg0bLI43dCBlelN7/fXXLY7PmDFDApCff/55TTdLSml88zW9QZ09e7bW9lV16tRJCiGsAlgpzwcmd911l/mY6c0xKirK6sPd8ePHJQDp7+9vNWVEr9dLrVYrhw8fbnHcdP/Y+oCdn58vg4KCrB776qiqKgMDA+WIESMsjps+tNkKikyqC6QmTZpU63mnTp0qAciPPvrI6rKDBw9KRVFkdHS0xXHTBylbge8dd9whAZinSdamug+lJ0+elABkhw4dbH4ou+2226yeY/bcV9Wx9YH9wQcflJ07d5YAZHh4uF3Thfz8/CQAm8/JC02cOFECkPPmzbMahyPPKWcCKWdfO5GRkTYDow4dOsiwsDDz7wUFBRKAjI+Pr9NUL9P9UdPPW2+9ZXW9JUuWSABy6NCh5jVrzzzzjFU70+0KCgqyet1Lef7D5qJFi8zHagukdu/eXeNtsfW319/f3yJYMxk6dKgEYPGFgWnN3oXvB1KenyZtbyDV0K9/W7Zu3Wqeanr48GGLy0xT8Ww9llJK+fHHH0sA8t577631PI899pgEIK+55hqry7KysuRzzz0nd+zYIfPy8mReXp7csGGDHDFihATsm4Zek9oCKdPUxrZt29q8vKKiQgKQ3t7eTo/BmUCqqKhINm/eXGq1WptT18mzsPw5NZgrrrgCHTt2xKZNm7B//37z8c8++wx6vR533nmneUrAzp07zde5UEhICPr06YOysjIcOHCg1vPu3bsXd955J2JiYuDn52cuL/rYY48BANLT011x81zmjjvuQEBAgHlqHgDzFJOQkBBMmDDBbecuKirC4cOH0aZNG3Tr1s3qctPjsWvXLqvLevfuDY1GY3GsTZs2AIAuXbpYTRnRaDRo2bJltSWwbU1tDAoKQu/evVFWVmbxHKqsrMSCBQswePBghIaGQqPRQAgBRVFQWFhY7WM8YMAAm8dt6dGjB3r37o0lS5Zg0KBBePXVV7F582ZUVFRYta3p+dulSxe0a9cOx44dQ0FBgdXt69Spk9V12rdvDwB1Lu9tetyGDBlifq1VVdPj68h9daENGzbg+eefx/PPP4+PP/4Yqqri/vvvx86dO+2aKuQqjjynHOXq1w5gfNyrPuaBgYG47rrrsHnzZvTu3RsvvPAC1q1bh9LSUqfGPGvWLEjjF6xWP1WnNpskJCRg6tSp+PPPP/HZZ59h8ODBNU6B6tu3r80ptaZKgbbuC1t8fX2dmvrVuXNnBAYGWh239XratWsXFEVBfHy8VfvBgwc7dF5Pe/0fOnQI1113HSorK/HVV1/ZVSXTGe+88w7eeOMNdOvWzWb57hYtWuCFF15A3759ERwcjODgYAwdOhS//fYbBg4ciMOHD1uULl+/fj1mz55t8ePoPmN19f3331uN4fvvv3fpOZYsWYKioiKMGzcOrVq1cmnf5HpcI0UNRgiBqVOn4umnn8bChQvxxhtvQEqJTz/9FEIIJCYmmtua3mCqWw9hOp6fn1/jOf/55x9cccUV0Ov1GDlyJMaNG4fAwEAoimJeR1JeXu6aG+gizZs3x2233YYPP/wQ69atw4gRI/Djjz8iMzMT06dPh6+vb619hIaGwtvbGxUVFUhPT7f7jbMu93tQUJDVMdMceVuXmS6vrKy0eVnLli1tHje90VT9EDJx4kSsWLECMTExuP7669GqVSvzuq/58+dX+xg78qal0Wjwxx9/4IUXXsDy5cvx1FNPATA+XlOmTMErr7yCgIAAi7HVdD+eOHEC+fn5FvdNdWv+TPejwWCwe7y21OXxrcsb/KxZszB79mynr9+qVSscO3YMJ0+etBmkVGUqf2wK4qty5DnlqLrctzU97hfux5OUlIR58+Zh8eLF5jUzvr6+GD9+PF5//fVqb6OrjB8/3vxh96GHHrIZAJq46v5u0aKFU3t6OfJ6KigoQGhoqM11PY7ep570+j906BBGjBhhXpc6btw4qzamMVT3eJiO17QmecGCBfjPf/6DHj16YO3atQgNDbV7jFqtFlOnTsWWLVvw559/4j//+Q8AYyB1YaA+bNgw3HnnnXb3XZUzt/P777/H559/btFuypQpNsu3O8v0pem9997rsj7JfZiRogZ11113wcvLC1988QUqKirwxx9/4OjRoxgxYoTFN3GmP3iZmZk2+zl9+rRFu+rMmTMHZ8+exW+//YZVq1Zh/vz5eOGFFzB79mwMHDjQRbfK9aZNmwbgfHEJ07/2/qHVarW47LLLADi2342r7ndXqG4vDtPYTGPYvn07VqxYgSuvvBIHDx7EZ599hldeeQWzZ8/Gf//7X5sZIxNHP5yFhITgrbfewsmTJ5GamoqFCxeiW7duWLBggfkxqzo2T7gfq6rLuBpyc1pTRqCmTS4B4zf2O3bsAAAMGjTI6nJ7n1POqK/H3M/PD7Nnz8ahQ4dw4sQJfPXVVxg8eDC++uorjB8/vk5910an0+Gee+6Bv78//P398cgjjyA7O7va9q66v+vjuRcYGIjc3Fzo9Xqry2rbF+hCnvL6379/P4YPHw6dTodly5bh5ptvttmua9euAIxBly2pqakAjNk0W+bPn4+HHnoIvXr1wrp165z60sVUPKikpMR8bPbs2VaZ0rpsZN+sWTO0bdsWxcXF5segKlu3c9GiRVZjcGVWbPfu3di+fTuio6NZZKKRYCBFDaply5YYN24cdDodvv/+e/M3mxcGCH369AEAm3808/PzsXv3bvj6+qJ79+41nu/w4cMIDQ21uenkhg0bbF5Ho9HU+Zv/mpi+wa3pHHFxcRg0aBBWrFiBLVu2YM2aNRg6dGitt7cq0336+uuv1zr1x5Sxad68OTp27Ij09HTzm0pV69atA2CcsuNuth6fgoICq8f+8OHDAIBx48ZZfZu8detWnD171i3j69SpE+655x5s2LABAQEB+OGHH8yX1fT8PXz4ME6dOoXo6Ohaq066mmlcGzdutPmBsT4fX0eYKmsuXLiwxg+1r7/+OsrLy3HllVfarOpm73MKsO91WlVDvHbat2+PW2+9Fb/++is6deqEjRs3Iicnx2X9VyWlxJQpU5Ceno63334bb7/9NjIyMnDHHXeYKzBeaOfOnSgqKrI6bnpdmJ6PnqBPnz5QVRWbN2+2umzjxo0O9wU07Os/JSUFw4cPR25uLr777jtcf/311ba97LLL4Ofnh02bNlk9Xqqq4rfffgMAi+qRJvPmzcMjjzyC3r17Y926dWjRooVT4/3nn38AwO1TfU3TLVevXm112apVqyza1AfTl6RTp05t0C+ryH4MpKjBmabwvfHGG1ixYgXCw8Nx4403WrS57bbb4OXlhXfffdf8QdnkueeeQ2FhIW677TaLst22REVFITc3F8nJyRbHP/30U/z66682rxMWFobs7Gy3fQAPCwsDAJw4caLGdtOmTUNFRQVuvvlmSCntKnle1aRJkzBq1Cikpqbi+uuvt/kNXEVFBd577z3zejEAuPvuuyGlxBNPPGHxIVKn0+HFF180t3G3L7/80moNxezZs1FQUIBJkyaZH3tTSeoLP7ScOXMGDzzwgMvGc+zYMRw9etTqeF5eHsrLy+Hn52c+Zrp/5syZY/GNvcFgwOOPPw5VVXHPPfe4bGz2ateuHa666iqkpaWZy/ybbNmyBYsXL0ZISIjV67GhDR061FwWfOzYsTbX1X344YeYN28eAgIC8Pbbb9vsx97nFGD/67Qqd792srOzkZKSYnW8pKQExcXF0Gq1ViW1XeXNN9/EL7/8gokTJ2Lq1KmYOnUqJk6ciNWrV+O1116zeZ2CggK88MILFse2b9+Or7/+GkFBQR71PLvjjjsAAM8++6xFFrugoMD82NmroV//u3fvxogRI1BUVIQffvjBXK6+OgEBAbj99ttRUlJiNQV3wYIFSEtLw6hRo6yCnBdffBEzZszApZdeirVr1yI8PLzG8+zcudNqqipgnDXx1ltvATC+97uT6X30pZdeslhzlpaWhvfeew8+Pj6466673DoGk5KSEixevBharbZe3lPJNbhGihrc1VdfjaioKGzduhUA8OCDD1q9+UdFRWH+/Pl44IEH0LdvX0yYMAERERHYsGED/v77b3Tr1g3z5s2r9VzTp0/Hr7/+isGDB2PChAkICgrC9u3bsXHjRowfPx7Lly+3us7IkSOxbds2jB49GkOHDoWPjw8uueQSXHfddS65/SNGjICiKHj66aexZ88ehISEADC+gVd1yy234JFHHkF6ejrCw8Nx0003OXQeRVGwbNky3H777fjhhx8QExODkSNHonv37tBoNEhLS8Mff/yB7OxsPP744+brPf7441i1ahV++OEHXHLJJbjmmmtQWlqKZcuW4cyZM3jyyScdXnztjDFjxmDQoEGYMGECWrdujY0bN2Ljxo2IiorC3Llzze369++PQYMG4bvvvkN8fDwGDx6MrKwsrFq1Cl27drW5VsYZ//77L2666Sb0798f3bt3R5s2bZCdnY0ffvgBlZWV5jVTABAfH48nn3wSr776Knr16oXx48ejWbNmWLVqFfbs2YPBgwfjiSeecMm4HPXhhx9i0KBBeOKJJ/Dbb7+hX79+5n2kFEXBZ599ZrNAQEP7+OOPodfrsWTJEnTt2hVjxoxB586dUVJSgnXr1mHPnj0ICwvDt99+ix49etjsw97nFGD8O7Bs2TLcdNNNuOaaa+Dn54fIyEjcfvvt1Y7R3a+d9PR09OnTB7GxsYiLi0P79u1RWFiIn376CZmZmXj44YcdeuxMi/ltCQ4ONhec2LZtG55++mlER0ebv0EHjI/Jtm3b8Mwzz2Do0KHm6cQmQ4cOxcKFC7FlyxYMGjTIvI+Uqqr46KOPbBaCaCh33HEHli5ditWrV6NXr14YN24cKisr8e2336J///44ePCg1T5Z1WnI139eXh5GjhyJ3NxcjBw5En///Tf+/vtvq3bTp0+3yIi9/PLLWL9+Pd58803s3r0bAwYMwP79+/HDDz+gRYsWeO+99yyu//nnn+O///0vNBoNhgwZgnfeecfqHFFRURbrmR599FGkpqYiPj4e7dq1AwAkJyeb93Z68cUXbRb7qMncuXPNRad2794NwFjAypRFHDx4sDmjDRgfm0cffRRvvvkm4uLiMH78eFRUVCApKQm5ubl49913a90v7kKPP/44dDodgPPZy9deew1fffUVAOCGG26wuaZq6dKlKCwsxE033cQiE41J/RYJJLLNVN4cgDxw4EC17X799Vd51VVXyeDgYPMu70888YTMy8uzaltdueKVK1fKgQMHyoCAABkUFCSvuuoquWHDhmrL7RYXF8v7779ftm3bVmo0GglY7sSOOpY/l1LKL7/8Ul5yySXS19fXfD/YYtrj5sK9WBz166+/ykmTJsmoqCjp6+srfXx8ZHR0tJw0aZLNvYHOnj0rX3rpJdmzZ0/p6+srAwIC5KBBg+TixYut2ta2W31194GUtktIV70vP/vsM/P9FB4eLu+8806ZkZFh1U9OTo6cNm2ajIyMlD4+PjImJkY+/fTTsqSkxOY5atpnqbpxnzx5Uj799NMyPj5etmzZUnp7e8u2bdvK0aNHy19++cVmH0uWLJGDBg2SAQEB0sfHR/bo0UPOmTPHZkn6msru11Yy/0K13b5Tp07J+++/X3bo0EF6eXnJsLAwef3118utW7c63FdNqttHqi5+/fVXOX78eNm2bVvp7e0tAwMDZd++feWsWbNkTk5OjeNw5Dml1+vl008/LaOjo6VWq7V6PlT3eLnytXPh37S8vDz5/PPPyxEjRsg2bdpIb29v2apVKzls2DC5ePFiu0ui21P+3HTb8vPzZXR0tPTy8pJbtmyx6mvbtm3S29tbRkVFmf8uV71d+/btk+PGjZPBwcHSz89PxsfHW+0vJGXN5c9r2o7C0b+9Up4vUX3s2DGL42fPnpXPPfecjIqKkt7e3jIyMlLOnDlTnjp1SgKQ119/fbXjsKUhXv817dVU9efC2y6l8e/oww8/bP670KpVK3nXXXfZ3IvRnufQhff/woUL5bXXXisjIyNls2bNpLe3t2zfvr2cMGGC/PPPP2u9bbaYXiPV/VT32vrss89kv379pL+/vwwICJBDhw6VK1eudGoMptL11f1U9/dvwIABErDeb4s8m5CymsnMRORxhg8fjj///BMHDx5E586dG3o49WL27Nl4/vnnsW7dOptr24gcxedU/UpLS0N0dDSmTJlS7+Wq3eH333/H1VdfjRkzZuCVV15p6OEQUQPiGimiRmLr1q3YsGEDRo0addEEUUREDSUjI8PqWE5ODmbMmAEAHrWmi4gaBtdIEXm4Dz74AOnp6fjss8+gKEqNG14SEZFrPProo/j3338RHx+PiIgInDp1CqtWrUJubi7uu+++Om1KTURNAwMpIg83b948nDp1CjExMfjyyy/55k1EVA9uuukmZGVlYeXKlcjPz4evry969uyJe+65p0GqbBKR5+EaKSIiIiIiIgdxjRQREREREZGDGEgRERERERE5iIEUERERERGRgxhIEREREREROYhV+87Jy8uDXq9v6GEQEREREVED0Wq1CAkJsa+tm8fSaOj1elRWVjb0MIiIiIiIqBHg1D4iIiIiIiIHMZAiIiIiIiJyEAMpIiIiIiIiBzGQIiIiIiIichCLTRAREREREaSUKC4uhpSyoYfiVkIIBAQEQAhRp34YSBEREREREYqLi+Hj4wNvb++GHopbVVRUoLi4GM2bN69TP5zaR0REREREkFI2+SAKALy9vV2SdWMgRURERERE5CAGUkRERERERA5iIEVEREREROQgFpsgIiIiIiKXkKoBSN0HmZ8LERwKdO4BoWgaelhuwUCKiIiIiIjqTO7cDHXpJ0BejvF3AAgJg5KQCNE33q3nPnPmDN555x2sXbsWmZmZCAsLQ8+ePTF16lQMGTLELecUsqkXirdTdnY2KisrG3oYREREREQNorCwEIGBgU5dV+7cDPWDudVerkyb4bZg6uTJk7jhhhsQGBiIxx9/HN26dYNer8f69evx9ddf488//7S6TnW31cvLCxEREXadlxkpIiIiIiKyIKUEKsrta6uqkEs+qbGNuuQTiO69IRQ7SjR4+zi0We7MmTMBAD///DP8/f3Nx7t27YqEhAS7+3EUAykPsCQ5G4oQmBgbbnVZUooOqpSYFGdfZExEREREVGcV5VAfnOC6/vJzIB9OgD1T4ZQF3wA+vnZ1m5eXh3Xr1uGpp56yCKJMgoKCHByo/Vi1zwMoQmBxsg5JKTqL40kpOixO1kFxICInIiIiIrpYpKWlQUqJTp061fu5mZHyAKZM1OJkHfacKcWMIW3x08E8LE7WYXJcuM1MFRERERGR23j7GDNDdpCH9kK+83yt7cTDsyC69LTr3PZqyHIPDKQ8xMTYcGw4VojkzFLcuiwVEmAQRUREREQNQghh9/Q69OwNGRJmrtZnU0g4RM/eLi+FHh0dDSEEDh8+7NJ+7cGpfR7kgYGtABhLRWoEGEQRERERkccTigZKQmKNbZSEqW7ZTyokJATDhw/HokWLUFpaanV5QUGBy89pwkDKg+w5c/7BN0jg63+zG3A0RERERET2EX3joUybAYSEWV4QEu7W0ucA8NJLL0FVVVx77bX4+eefcfToUaSmpuLTTz/FuHHj3HZe7iN1TkPvI2UqLHFLz1CsO1YIXakeAKf3EREREVH9qMs+UiZSNQCp+yDzcyGCQ4HOPdySibpQVlYW3nnnHaxZswZnzpxBaGgo4uLikJiYiPh46yDOFftIMZA6pyEDKVMQZQqatqcX48X1pyAArpUiIiIionrhikCqsXBFIMWpfR5AldIiWOrXNgDDowIhAQT6aFBpUBt2gEREREREZIFV+zyArc127+nXErtOl6Cg3ABF4T5SRERERESehBkpDxXoo8G9/VsCAJbvyUFaXlkDj4iIiIiIiEwYSHmwQR2aY2C7ABgk8O4/mTCoXM5GREREROQJGEh5MCEE7uvfEs28FBzOLcOPB3IbekhERERERAQGUh4vzN8Ld1/aAgCwOFmHjMKKBh4RERERERExkGoERsYE4ZJW/qgwSLy35TRUVqwnIiIiImpQDKQaASEEHhjYCj4agT1nzuLX1PyGHhIRERER0UWNgVQj0TLAG7f3NpZJ/3xXNrJLGmbzYCIiIiIiYiDVqFzTJQRdw/1wVq/ig62ZkJziR0RERETUIBhINSIaReChy1pBqwjsyCjBhrTChh4SERERERGWJGcjKUVn87KkFB2WJGe75bzTp09H27Zt0bZtW0RFRWHQoEF46623oNfr3XK+qhhINTLtg3zQPcIXALBwxxnkl1k+Sdz5RCUiIiIiskURAouTdVbBVFKKDouTdVCEcNu5R4wYgV27dmHjxo2499578cYbb+CDDz5w2/lMGEg1Qj1b+AMAisoN+GR7lvl4fTxRiYiIiKjpk1KiTK/a/XN991BM6BWGxck6fP1vNsr0Kr7+NxuLk3WY0CsM13cPtbsvR5eveHt7o0WLFmjXrh2mTJmCIUOG4LfffnPTPXOe1u1nIJebFBeB/DIDVqfmY+PxIgyNLEJafjkWJ+swOS4cE2PDG3R8UjUAqfsg83MhgkOBzj0gFE2DjomIiIiI7FdukJiYdMip636zJwff7Mmp9vfaJE3sAl+t84kBX19f5OXlOX19ezGQaqSmDWiFE/nl2Jd9Fi//mQ4AnhFE7dwMdeknQJ7xxSIBICQMSkIiRN/4Bh0bERERETVdUkr89ddf2LBhA+666y63n4+BVCM2+4r2mHDumwJFwDOCqA/mWl+QlwP1g7lQps1gMEVERETUCPhoBJImdnH4et/uNWaftIqAXpWY0CsMN/cMc/jcjlizZg06d+4MvV4PVVVxww034LHHHnOoD2cwkGrEvt+fa/6/KoFPd2ThnktbNshYpGowZqJqoC5dCKX3QE7zIyIiIvJwQgiHp9clpejwzZ4c8ywp0/p9rSLc+oV/fHw8XnnlFXh7e6Nly5bQausnxGEg1UiZnpiTYsOw98xZJGeV4scDeQjw1jRMZip1n3k6X7XydMZ2XWPrZ0xEREREVC9Mn02rLjUx/bs4WWfxu6v5+/sjOjraLX3XhIFUI3ThE/VYXhke+SUNEu5/olZH5ufW3uhcO9YUJCIiImpaVCltrtc3/a46WImvMWAg1Qhd+ESNDvHFyI5BWHOkAKF+WhjU+n+iiuBQ2HNWERzq9rEQERERUf2aFBdR7WUNvY7fXRhINUK2nqi3XRKBjceLkHtWjzaB3vU/qM49gJCwmqf3hYQb2xERERERucD8+fMb7NzckLeJCPHTYnxPY7bni93ZKNer9Xp+oWigJCTW3GbkdSw0QURERERNAgOpJmRct1BE+GuRU6rHD/vtW7PkSqJvPJRpMwD/AMsLvIwZMrlhFWRpSb2Pi4iIiIjI1RhINSE+WgV39GkBAPh2Xw5ySivrfQyibzxww23GXyI7QXn8JYh5nwJhLYDsTKifvwPZBBcbEhEREdHFhYFUEzMksjm6hvuiTC/x9b+6BhmDMOiN/7ZsA9E1FkrzICj3PQVotMDOvyHX/tgg4yIiIiIichUGUk2MEMK8Ke8fRwtwNLes/gdReS4T5uV1flzRnSEm3A0AkMsXQR45UP/jIiIiIiJyEQZSTVDXcD8MiWwOCeDTnWfqfypdZYXxXy/L6oFixLUQ/QYDBgPUj16FLCqs33ERERERUY0uhiUYrrqNDKSaqDt6t4C3RmBPVim2nCqu35PrzwVS2gsCKSEg7ngQaNEGyNNB/d9bkGr9VhckIiIiItt8fHxw9uzZhh6G25WWlsLHx6fO/XAfqSaqRYAXxnULxfK9OVi06wwubRMAL42on5NXmDJSXlYXCT9/KNOegvryE8CeHZCrlkNcO6F+xkVERERE1fLx8UFJSQkKCgogRD19bqxnUkpotdqmGUitXr0aK1euRH5+PiIjI3H33XejU6dO1bYvKSnBkiVLsHXrVhQXFyMiIgJTpkxB375963HUnunmnqFYcyQfp4sq8cuhPFzfPbR+TmxeI2V7Y2DRLhri1vshF70D+cNiqNFdIDQayPxciOBQoHMP7jdFRERE1ACaNWvW0ENoNDwqkNq8eTO++OILJCYmonPnzvj555/x0ksvYf78+QgKCrJqr9frMWfOHAQGBuLRRx9FaGgodDod/P39G2D0nsffS4NbL4nAe1sykbRHhxExQQj0qYcApbL6jJSJMuhKqIf2Qm5eCzl/lnmuqgSAkDAoCYnGUupERERERB7Io9ZI/fTTTxg5ciRGjBiBdu3aITExEd7e3li3bp3N9n/88QeKi4vxxBNPoFu3bmjRogV69OiBqKio+h24BxsZE4ToEB+UVKhYmpxdPyfV15yRMuvRx/jvhQv+8nKgfjAXcudm14+NiIiIiMgFPCaQ0uv1OHr0KGJjY83HFEVBbGwsDh06ZPM6O3bsQOfOnfHpp58iMTERjz32GL777juoNRQwqKysRGlpqfmnqS+o0ygCd/c1btK7KjUfJwvK3X5OWU3VPos2qgHy289q7EdduhBSNbhyaERERERELuExU/sKCwuhqiqCg4MtjgcHByMjI8PmdbKyspCdnY3Bgwfj6aefRmZmJhYuXAiDwYBbbrnF5nVWrFiB5cuXm3+Pjo7GvHnzXHY7PFFcq2Zo09wLGUWVWLTzDJ4b0d7i8qQUHVQpMSkuwjUntCOQQuo+IC+n5n7ydMZ2XWNrbkdEREREVM88JpByhpQSgYGBuO+++6AoCmJiYpCbm4sff/yx2kDqxhtvxNixY82/N9WKJBfq2yYAGQfzsD2jBLtPl6B3a+NCwqQUHRYn6zA5Ltx1JztXbELUsEZK5ufa1ZXMz8XF8QgRERERUWPiMVP7AgMDoSgK8vPzLY7n5+dbZalMgoOD0aZNGyjK+ZvRtm1b5OfnQ6/X27yOl5cX/P39zT9+fn6uugkeLbFfS3QN8wUAvLkpAwZVWgRRE2NdGUjVnpESwfZVELS3HRERERFRffKYQEqr1SImJgZ79uwxH1NVFXv27EGXLl1sXqdr167IzMy0WBN1+vRphISEQKtt1Mk2t3huRHt4awQKyg0Yv/Sge4IooEr58+ozUujcAwgJq7mfkHBjOyIiIiIiD+MxgRQAjB07FmvXrsX69etx6tQpLFy4EOXl5Rg+fDgAYMGCBVi8eLG5/dVXX43i4mIsWrQIGRkZ2LlzJ1asWIFRo0Y10C3wbM19NLijt3EdlCoBrSJcH0QBgP5cRkpbQ0ZK0UBJSKyxGyVhKveTIiIiIiKP5FFpm/j4eBQWFuKbb75Bfn4+oqKiMHPmTPPUPp1OZ7GmKTw8HM888ww+//xzPPHEEwgNDcWYMWNwww03NMwNaASKK85XwdOfm97nvoxUzeXPRd94KNNmQF36iWXhCSEg7n2C+0gRERERkccSUl64ic/FKTs7G5WmAKCJMq2JGhYViA1phVCEMTPl6ul9hkdvB4oKoMx6B6JdVK3tpWoAUvdB5mZDfvUhUFEG5am5EJ04rY+IiIiI6o+XlxciIuyrZO1RU/vIfaoWlngkvjX6tG4GVQLtAr2xOFmHpBSd605m74a85whFA9E1FsrlV0D0vQwAIHf+7brxEBERERG5GAOpi4QqpTnzJIRxk15FAKcKK3BFTCBUVyYmzVX7aig2UQ3R51wgtesfMFlKRERERJ6KgdRFYlJchMX0vQ7BPhjdORgAcDS3HBN6uWZqn1RVwFR63s6MlIWefQFvb0CXBZw85pIxERERERG5GgOpi9ik2HA081aQll+OtUcLXNOpvso6MycCKeHjawymYMxKERERERF5IgZSF7FAXy0mnctSfbU7GyVVKvo5rbJugRQAiD6XAwDkLq6TIiIiIiLPxEDqIjemSwjaBnqjoNyAZXtyar9CbUzroxQFQuPcHlAirj+g0QDpxyGzMuo+JiIiIiIiF2MgdZHTKsbCEwCw8mAuThdV1K1Dc6EJ57JRACCaBQBdYwEwK0VEREREnomBFOHSNs3Qu3Uz6FVg0a4zdevMXPrc8Yp9VZmn97EMOhERERF5IAZSBCEE7jlXDv2fk8VIzixxvjNTRkrrfEYKAETvgYAQwLFDkHkumHJIRERERORCDKQIgGU59P/tPAOD6uQeTpUuykgFhwIxXQEAcjer9xERERGRZ2EgRWamcujH8upQDt0Fa6RMRF9T9T4GUkRERETkWRhIkVmgrxYJdS2H7spA6tw6KRxMgSwurHN/RERERESuwkCKLIzpHII2zY3l0JfvdWJtkjmQqtvUPgAQEa2AdtGAqkL+u63O/RERERERuQoDKbLgpTlfDv3HA3kOl0OX5jVSdc9IAYDoc5mxX5ZBJyIiIiIPwkCKrPRrayqHLvG5o+XQzVX76p6RAs6vk8LeXZBlZ13SJxERERFRXTGQIitCCLQO8IIA8PfJYqRkWZZDT0rRYUlytu0rmzJS3q7JSKFtJNCitXF/qr07XdMnEREREVEdMZAim0L8tDAVQP90x/ly6EkpOixO1kERwvYVz2WkhKum9glxfnofN+clIiIiIg/BQIpsmhgbjpt7hAKAuRy6KYiaHBeOieeq+1lxYdU+E1P1Ppm87fwaLCIiIiKiBsRAiqp1R58W6Nu6GQDgvS2ZtQdRgHEKHuCyNVIAgOguQFAoUHYWOJDsun6JiIiIiJzEQIpqNHNYO/P/FYGagyjAPRkpRWH1PiIiIiLyKAykqEbf7Tu/l5QqgY+3ZdZ8BXP5cxdmpHC+ep/cvQVSdWKjYCIiIiIiF2IgRdWquiZqYLsAAMDPh/KxtLqKfYBbMlIAgM49Af8AoKgAOLzftX0TERERETmIgRTZdGFhiXsubQFvjbFS35KUHCSl6Gxf0RxIuTgjpdVCXDIAAKv3EREREVHDYyBFNqlSWhSWaBngjZt7hAEA/LwUlOtVm9eT7spIARB9Teuk/oGUspbWRERERETuw0CKbJoUF2FVWOLGHqFoGeCFs5W2gygA59dIubJqn0mPPoC3D5CbDZw44vr+iYiIiIjsxECK7OajVXDPpS0AAD8cyEV6YYV1I3dmpLx9gNhLAQBy5z8u75+IiIiIyF4MpMghA9oG4NI2zaBXgU+2Z1lPsTuXkRLerg+kgCqb87IMOhERERE1IAZS5BAhBKZe2hJaRWDX6RJsOVVs2cCNGSkAELH9AI0WOH0S8vQpt5yDiIiIiKg2DKTIYW0CvXFD91AAwKc7siwLT+jduEYKgPBvBnSPA8CsFBERERE1HAZS5JRbeoUh3F+LMyV6fFtl0153Z6SAKtP7Nq+FumUD5MEUbtJLRERERPWKgRQ5xVer4O5zhSe+25uLzKJzAZSpap8bAyko5562WRmQC9+A+vozUGdMhdy52X3nJCIiIiKqgoEUOS2+fXPEtfJHpSqxcMcZ40E3bchrInduhvz8XesL8nKgfjCXwRQRERER1QsGUuQ0IQTu7dcSGgFsSy/G9vRit2akpGqAuvSTGtuoSxdymh8RERERuR0DKaqT9kE+uK6bsfDEJ9uzUGE4V3jCHRmp1H1AXk7NbfJ0xnZERERERG7EQIrqbGJsGEL8tMgsrsSPbQYZD7ojI5Wf69J2RERERETOYiBFdebvpcFdfSIAAMsjr0C2TzCgdX0gJYJDXdqOiIiIiMhZDKTIJYZGBSLcV0GFxhufdRprNbUvKUWHJcnZdTtJ5x5ASFjNbXx8ITt1r9t5iIiIiIhqwUCKXEIIgf4tjFmofyLi8G/WWfNlSSk6LE7WQRGibudQNFASEmtuVF4GfP0hC04QERERkVsxkCKXua+rN7oUHAcAvLEpA5UGaQ6iJseFY2JseJ3PIfrGQ5k2wzozFRIOjLgWEArkX79B/m8+pIHBFBERERG5h5BSyoYehCfIzs5Gpal0NzlFph9H0ZwnMPXyZ1Cu8YEiAFXCZUGUxblUA5C6DzI/17gmqnMPCEUDddtGyE/fAAwGoG88lMTHILTu2dOKiIiIiJoWLy8vRERE2NWWGSlyncoKNNOXITFjLQBjEKVR4PIgCjBO8xNdY6EMHAbRNRZC0QAAlP6Dodw/A9BqgZ2bob7/CqRpk2AiIiIiIhdhIEWucy6jl+0bYj5kUIGv/61jkQkHid4DoTz4HODtDaRsh/rui5DlZZCqAfJgCtQtGyAPpnAdFRERERE5jVP7zuHUvrqT+3Zj6XcbsDR6FG7qEYr1xwqRe1YPwD3T+2odz8E9UN99ESg/C7RqC5SdBaruMRUSBiUhEaJvfL2Oi4iIiIg8E6f2UYNIShdYGj0KCfnbMaVPCzw2qA2Uc4X6FifrkJSiq9fxiK69oDzyPODtA2SmWwZRAJCXA/WDuZA7N9fruIiIiIio8WMgRS6jGgxIOPYrJpTuBQD0aumPib2MWSitAuSX6et/UNGdAR/fGpuoSxdymh8REREROYSBFLlMQlABJhxfC2i9zcdu6RWGXi39oVeB/dlnUWFQ63dQqfuAooKa2+TpjO2IiIiIiOzEQIpcx1Qdz+t8uXGNIvBofGsE+WhwLK8cn+08U69DkhdO56tjOyIiIiIigIEUudK5Yh3Cy9vicJi/F6bHtwYA/HIoH5tPFNbbkERwqEvbEREREREBDKTIlfTWGSmTvm0CcFMPY7Cy4J9MZBXX095OnXsAIWE1twkJN7YjIiIiIrITAylyHfPUPh+bF996SQS6hvuipFLF6xszoFfdX3lfKBooCYk1tlESppo39CUiIiIisgcDKXId0z5cNjJSAKBVBB4f1BbNvBUcyinDV7vrZ6Ne0TceyrQZ1pmpZs2hTJvBfaSIiIiIyGEMpMh1zBkp72qbtAjwwkOXGddLrdifi+3pxfUxMmMwNXchlMdfAnpfZjzYqTuDKCIiIiJyCgMpcp1aMlIml7dvjmu7BAMA5v99GjmllW4emJFQNBBdY6FcP9l4YO9OyNL6CeSIiIiIqGlhIEWuY0dGyuTOvi0Q7KtBUbkBb2zKgOGC9VJJKTosSXbT1L+2kUDr9oBeD7lri3vOQURERERNGgMpch07M1IA4K1RMDgyEACw98xZJO3RmS9LStFhcbIOihBuGaYQAmLAEACA3P6XW85BRERERE0bAylyGWkqf66tPSMFAIn9WuLy9gEAgKSUHCRnlpiDqMlx4ZgYG+6uoUL0MwZS2Lcbsqj+9rUiIiIioqaBgRS5jjkjZV8gBQAzhrZDTIixXPpza0/WSxAFAKJVW6BDR0BVIXduduu5iIiIiKjpYSBFrlNRbvzXjql9Vb1ydaT5/wJwexBlPpdpet82Tu8jIiIiIscwkCLX0RszUsKBjBQA/LA/1/x/CeDdf067clTVEv0GG/9zaA9kfk69nJOIiIiImgYGUuQ65qp99mekqq6JGtUpGACw5kiB+yr2VSHCWgAduwFSQu7g9D4iIiIish8DKXId8xopH7uaX1hY4rbeEWjubXxKLk3JQVKKrpYe6k705/Q+IiIiInIcAylyHQczUqqUFoUlAn00uK13hLELRaCkwuCWYVYlLh0ECAEcOQCpy3L7+YiIiIioaWAgRa7jYNW+SXERVoUlruoYjE6hvqhUJQrL6yGQCg4FuvQCAMjtG91+PiIiIiJqGhhIkes4sUbqQhpF4L7+LSEArDtWiP1nSl0zthpweh8REREROYqBFLmOaUNeB6v2XahLuB+u7BgEAPhoexYMqqzryGok+sYDigKcOAqZme7WcxERERFR08BAilxCSlllap/zGSmTO3pHIMBbwbG8cqxKzatzfzURzQOBHr0BAHI7s1JEREREVDsGUuQaBj0gz2WOtHXLSAFAoK8Wt11iLDyx+F8d8s/q69xnTczT+7b+ZQwKiYiIiIhqwECKXMOUjQLqPLXP5OpOwegY6oOSShWf73bvvlKi92WAVgucPgmkH3fruYiIiIio8WMgRa5RWX7+/1qtS7o0Fp5oBQD442gB9me7r/CE8G8G9OoHgEUniIiIiKh2DKTINaqUPhdCuKzbrlULT2xzb+EJ0X8wAGMgxel9RERERFQTBlLkGi4ofV6dO3pHoNm5whOrU/Nd3r+JuGQA4O0DZGcCxw+77TxERERE1PgxkCLXMGekfFzedZCvFrfGGQtPfJ2cjYIy9xSeED6+xmAKnN5HRERERDVjIEWu4caMFACM7hyMmBAflFSo+MKNhSfOb867EVJV3XYeIiIiImrcGEiRa1RZI+UOVQtPrDlSgIO6s245D3r1Bfz8gTwdcOSAe85BRERERI0eAylyDTdnpACgW4QfrogxFZ7IdEvhCeHlDdF7IABAbvvT5f0TERERUdPAQIpcQ28KpNyTkTIJ9FHgpQgcyS3Hb4fzLS5LStFhSXLdp/2J/kMBAHL7JkiDoc79EREREVHTw0CKXEKapvZp3ZeRAgB/Lw0qz2Wivvo3G4XnCk8kpeiwOFkHxRWl17tfAjRrDhQVAIf21L0/IiIiImpyXLNzKlFl/WSkJsaGQ5USS1NyUFyh4vPd2WjRzAuLk3WYHBeOibHhdT6H0GohLo2H/PNXqL//AFGYDxEcCnTuAaFoXHAriIiIiKix88hAavXq1Vi5ciXy8/MRGRmJu+++G506dbLZdv369Xj//fctjnl5eeHrr7+uj6GSibnYhHszUgAwKS4COaV6/H6kAGuOFACAy4Ios+BQ478p2yFTtkMCQEgYlIREiL7xrjsPERERETVKHhdIbd68GV988QUSExPRuXNn/Pzzz3jppZcwf/58BAUF2byOn58f3n777XoeKVmoLAdgLNZQHx68rDXWHCmAqdzEdd1CXNa33LkZ8scl1hfk5UD9YC6UaTMYTBERERFd5DxujdRPP/2EkSNHYsSIEWjXrh0SExPh7e2NdevWVXsdIQSCg4Mtfqie1WNGCjCuiapas+/Z30+4pF+pGqAu/aTGNurShZAqi1AQERERXcw8KpDS6/U4evQoYmNjzccURUFsbCwOHTpU7fXKysrwf//3f5g2bRpeffVVnDx5stq2lZWVKC0tNf+cPeum/YguNvW0Rgo4X1hiclw4XrqyAwDgSF453tqUUffOU/cBeTk1t8nTGdsRERER0UXLo6b2FRYWQlVVq4xScHAwMjJsf0hu06YNpk2bhsjISJSWluLHH3/Es88+izfffBNhYWFW7VesWIHly5ebf4+Ojsa8efNcejsuSm7ekNekahBlWhN1XbcQrDyQh/VphQj31+L2Pi2c7l/m59rdzgX1AYmIiIiokfKoQMoZXbp0QZcuXSx+f+SRR/D7778jISHBqv2NN96IsWPHmn8XriiXTfWWkVKltCoscfslEdiRXoKMogpsSy+uUyAlgkNhzza/wlSMgoiIiIguSh41tS8wMBCKoiA/P9/ieH5+vt3rnrRaLaKjo5GZmWnzci8vL/j7+5t//Pz86jhqAlBva6QmxUVYVefz0SqYHt8aigCOF1Tg75NFzp+gcw8gxDqTaSEoxNiOiIiIiC5aHhVIabVaxMTEYM+e85ugqqqKPXv2WGSdaqKqKk6cOIGQENdVcSM71OMaKVu6hvvhxu7GLNEHWzJRcG6jXkcJRQMlIbHmRuXlwMk0p/onIiIioqbBowIpABg7dizWrl2L9evX49SpU1i4cCHKy8sxfPhwAMCCBQuwePFic/vly5fj33//RVZWFo4ePYp33nkH2dnZGDlyZAPdgouU/lxGStswgRQATIoLR2SQDwrKDfhgaxaktGeSnjXRNx7KtBnWmangUCCiFVBWCvWNZyAP7XXBqImIiIioMfK4NVLx8fEoLCzEN998g/z8fERFRWHmzJnmqX06nc5iXVNxcTE++ugj5Ofno1mzZoiJicGcOXPQrl27BroFFydpzkjVT/lzW7w0xil+j69Ow98ni/DX8SIMjQp0qi/RNx5K74FA6j5jYYngUON0vvJyqAteBA7thTp/lnFPqdh+Lr4lREREROTphHT2a/smJjs7G5WmdT7kMMP8WcDeXRB3PwLl8hENOpalyTosSdEhwFvBO9dGI8zftcGdrCiH+uE8IGU7oNFA3PMolP5DXHoOIiIiIqp/Xl5eiIiIsKutx03to0bqXBAqGjAjZTK+Vxg6hvqguELF+1synZ7iVx3h7QPl/2ZCDBgGGAyQn7wOdcNqAMYNfeXBFKhbNkAeTOHGvURERERNlMdN7aNGqoGLTVSlVQSmX94Gj6xKw/aMEqw9WoArOwa79BxCqwXueQTwbwa5/hfIr96HIXUvcGiPeUNfCQAhYVASEiH6xrv0/ERERETUsJiRItfwgDVSVXUI9sGtccYy6Qu3n8GZYtdP2xSKAjH5PohrbjEe2LLBHESZ5eVA/WAu5M7NLj8/ERERETUcBlLkGpUNX7XvQtd3D0XXcD+c1at4d8tpqG5YDiiEgLh+MuDnX2M7delCTvMjIiIiakIYSJFreNDUPhONIvCfy40b9SZnlmJ1ar5Vm6QUHZYkZ9ftRKn7gLOlNbfJ0xnbEREREVGTwECKXMMUSHl7TiAFAG0DvdGndTMAwMLtWThdVGG+LClFh8XJOihVyuk7Q+bnurQdEREREXk+BlLkGqYNeT1kjVRVzw5vhxbNvGCQwHNrTsCgSnMQNTkuHBNjw+vUvwgOdWk7IiIiIvJ8DKTINUwZKQ9aI2WiCIE5V7aHVhHILtVj/NKDLguiABg36g0Jq7lNSLixHRERERE1CQykqM6kqgJ6vfEXD1ojVVXLAG/c178lAECVgFaBa4IoAELRQElIrLGNkjAVQtG45HxERERE1PAYSFHd6auUFvfAqX0muaXnx6lXgcX/1rHIRBWibzyUaTNsZqbETVO4jxQRERFRE8MNeanuKqsGUp6ZkUpK0WFJSg5u7B6KNUfyUVShImlPDjSKcF1mqm88lN4DgdR9kPm5kH+vA/buhDyQDIy52SXnICIiIiLPwIwU1Z1pfZSiQGg8b/pa1cISd/Ztgfv6twIACACLk3VIStG57FxC0UB0jYUycBiUW+8HNBpg3y7IQ3tcdg4iIiIiangMpKjuPHAPqapUKS0KSwyJCsSQyOaQAJr7aFBhUN1yXhHRCmLwVcYxfP8VpBs2BCYiIiKihsFAiurOHEh55vqoSXERVtP37uvfCiF+WhSVG1Cmd1+AI66ZAGi9jJvx7t/ttvMQERERUf1iIEV1Z1oj5YGlz6vT3EeDhwYap/j9dDAPyZklbjmPCA2HGD4GAKB+/zWzUkRERERNBAMpqjsPz0hV59K2ARjVKRgA8Pbfp1FSYXDLecSYmwFvH+DYISB5m1vOQURERET1i4EU1Z0pkPL2adhxOOGuvi3QKsALulI9Fu7Icss5RGAIxMixAM5lpVT3rMkiIiIiovrDQIrqzrSPlLZxZaQAwM9LwX8ubw0B4I+jhfjnZJFbziNG3QT4+QOnjgE7N7vlHERERERUfxhIUd15eNW+2vRo4Y8be4QCAN7fkon8Mr3LzyGaNYe46gYAgPrDYkjVPdMIiYiIiKh+MJCiOpOmYhONbI1UVZPjwhEZ5IOCcgPe35LplqIQ4spxQLPmQOYpyH82uLx/IiIiIqo/DKSo7hp5RgoAvDQKpse3hlYBtpwqxrpjhS4/h/Dzhxh9EwBArlwCqXd95ouIiIiI6gcDKaq7JpCRAoCYUF8knNtv6pPtWcguqXT5OcSIa4HAYECXBbl5jcv7JyIiqs6S5GwkpehsXpaUosOS5Ox6HhFR48ZAiuruXEZKNOKMlMlNPcIQ5qdBaaWKd/4+DfWCKX51faMRPr4Q19wCAJA/fQNpyuYRERG5mSIEFifrrIKppBQdFifroAjRQCMjapwYSFHdNYGpfSYaRSC+QyAAIDmrFL8cyjNf5qo3GjF0FBASDuTpIP/8tU59ERER2WtibDgmx4VbBFOm97bJceGYeG5WBhHZR9vQA6AmoBGXP7dlar+WOF1Uge0ZJfjfjjPo3aoZNp0octkbjfDyhhg7AfLL9yF//gZqizZAaTFEcCjQuQeEonHRLSEiIrJkeg9bnKzDN3tyoFclgygiJzGQorqraDoZKZNnhrfDtB+PIrO4Eg/+dAwScOkbjYi/EvKHxUBhPuQ7zwMAJACEhEFJSIToG++S8xAREV1oYmy4OYjSKoJBFJGTOLWP6s48ta9pZKQA4zzyOVd2AGAMcBQB177RJG8FCvOtj+flQP1gLiQ37SUiIjdJStGZgyi9KqstQEFENWMgRXVnmtrXhDJSAPDH0QLz/1UJzN+c4ZJ+pWqAuvSTGtuoSxdy014iInK5qmuivp3U1WrNFBHZj1P7qO6aULEJk6pvNDmlevx6OB/rjhUi2FeLO/u2qFvnqfuAvJya2+TpjO26xtbtXEREROfYKixRdc1U1d+JqHYMpKjOZBMLpC58oynXqzigO4vj+eVYsT8XPlqBSXERTvcv83PtbsdCtERE5CqqtF1YwvT7hVt+EFHNGEhR3TWRDXlNLnyj8dEqeHJwGzy6Kg3lBom9WaV16l8Eh8KetyoRHFqn8xAREVVV05eAzEQROY5rpKjumlhGalJchNUbSrsgH9w/oBUAYG/2Wew9U4dgqnMPICSs5jbnSqETERERkWdiIEV1dy4jJZpIRqo6V8QEYXh0IFQJvLExA4Vleqf6EYoGSkJizY00WqCkxKn+iYiIiMj9GEhR3TWxjFRN7u/fCm2aeyPnrB5v/30a0sn55KJvPJRpM6wzU4EhgJ8/kHMG6pvPQhYVumDURERERORqXCNFdWcqf65t2hkpAPDzUvDkkDZ4YvVxbM8owY8H8nB9d+fWMom+8VB6DwRS9xkLS5im82VlQH39GeBUGtQ3n4Xy6ByI5oEuviVEREREVBfMSFHdXUQZKQCIDvHFPZcaS6B/sfsMDunOOt2XUDQQXWOhDBwG0TXW+Hvr9lAefxkICjEGU288A1lUUHtnRERERFRvGEhR3VVcXIEUAIzuHIzL2zeHXgVe35SBkgrXbp4rWreD8vhLQFAokH4c6hvPMpgiIiIi8iAMpKju9KZAqulP7TMRQuDBy1qhRTMvZBVXYsGWTKfXS1V7jlbtoDw+xzKYKsyHVA2QB1OgbtkAeTAFUnVtEEdEREREtRPS1Z/+Gqns7GxUmvZDIocYHpwAlJdBefljiIhWDT2cenVIdxYzfjsOgwTu798SY7qEuPwcMjMd6hvPAPm5QEg4oKpAQZVNfUPCoCQkQvSNd/m5iYiIiC4mXl5eiIiofs+1qpiRorq7yNZIVdUl3A939DG+2D7enoW0vDKrNkkpOixJznb6HKJVW+OaKf8AIE9nGUQBQF4O1A/mQu7c7PQ5iIiIiMgxDKSoTqTBYMyQABdlIAUA47qFok1zL6gSeHbtSZytVM2XJaXosDhZB0WIup0koiWgrbnIprp0Iaf5EREREdUTBlJUN6ZsFHBRrZGqShEC866OhJ9WQVG5AU//fhzA+SBqclw4JsaG1+0kqfuAwvya2+TpjO2IiIiIyO0YSFHdVF1XdhHsI1WdQF8tnhveDgLAsbxy3LT4gOuCKAAyP7f2Rg60IyIiIqK6cSqQysvLc/U4qLEyZaS0Wgjl4o7Le7b0x6Q4Y9BkkIBGgUuCKADGzXpd2I6IiIiI6sapT77Tpk3DnDlz8Oeff6KszHpxPV1E9BdvoQlb1CpFMA0q8OXuM67puHMPICSs5jYh4cZ2REREROR2TgVSEyZMQF5eHt577z0kJibinXfewe7du6Gqau1XpqbFNLXvIp7WZ5KUosPSlBzc3CMUEf7GwhDL9+ZiaR0q9pkIRQMlIbHmNjfcBqFo6nwuIiIiIqpdnfaROnbsGP766y9s3rwZeXl5CAwMxKBBgzBkyBB07NjRleN0O+4j5RyZlgr1pceA0Aho5n3a0MNpMBcWlkjNOYsZv52AXjW+vFy2VmrnZqhLPwHycs4fVBRj5cRLBkD5v5kX/RRLIiIiImc5so+USzbklVJiz5492LhxI7Zs2YKzZ8+iTZs2GDJkCIYOHYrwcNesE3EnBlLOkan7oL46A2jZFpo5HzT0cBrMkuRsKEJYBEurU/PwwdYsCADDowMxPb6NS84lVQOQug8yPxciOBTS2xfy1RmAvhLi5ilQRt/skvMQERERXWwcCaRq3pjGTkIIdO/eHSUlJcjNzUVycjIyMzOxbNkyfPPNNxgwYADuuusuhISEuOJ05Ekqy43/XqSlz00mxVm/4EZ1CsaB7LNYd6wQO0+XIKe0EmH+db+fhKIBusbCtDOVAKBOSoT88n3IFV9CxnSF6NKrzuchIiIiourVeQ7Qnj178OGHHyIxMRFvvfUW8vPzcfvtt+ODDz7Axx9/jMmTJyMlJQULFixwxXjJ05iyeCw2YUUIgWkDWiEq2AcFZQa8+lcGKg11TgDbPteQURCXjQBUFerHr0EWsLImERERkTs5lZFKS0vDxo0bsWnTJuTm5iI4OBhXXHEFhg0bhg4dOli0HTduHLy9vfHll1+6ZMDkYSpZta8mPloFM4a2xWOr0nBAdxaLdp1BYr+WLj+PEAK4bRrkiSNAxgmon7wO5ZEXIDQsPkFERETkDk4FUk899RS8vb3Rv39/DB06FHFxcVBqWODerl07dOnSxelBkueS5ozUxT21ryatm3vjP/Gt8fKGdPx0MA9dw/0wNCrQ5ecRPr5Qps2AOucx4GAK5I+LIW683eXnISIi17O11tYkKUUHVUqb08iJqOE4FUhNmzYNl112GXx9fe1q36tXL/TqxTUbTRIzUnYZ2K45xvcMw/K9OXhvy2lEhfigQ5CPy88jWrWDmPIg5MevQf6yDLJjN4i4/i4/DxERuZYiBBYn6wBYbuZetSosEXkWp9ZI6XQ6nDlT/UajJ0+exPLly50eFDUi5zJSgoFUrSbHhSOupT/K9BJz/0xHaaXBLedR+g+BuGIsAED99C2oZ05DHkyBumUD5MEUY9U/IiLyKBNjwzE5LhyLk3VY8M9pfLA1E1/sOmOxtQYReRanMlLLli1Dq1atrNZDmZw8eRLLli3D+PHj6zQ4agT05zJS3JC3VhpF4LHBbfDoL2lIL6zAu/9k4snBbYzrm1xM3HIX5LFDwLFDkP/9P0iDMXiSABASBiUhEaJvvMvPS0REzjldVAFVSgR4K/j9SIH5OIMoIs/llp07i4uLodW6pLI6eTpO7XNIsK8WTw5pC60CbD5RhB8PuKe6ntB6QQwaafzFcEEGKi8H6gdzIXdudsu5iYjIuOYpKUVn87KkFB2WJGejqNyAVYfy8NSvx3H/j0exNCUHxRWquZ1GgEEUkQezO9rZt28f9u3bZ/59y5YtyMzMtGpXUlKCzZs3V5utoiaGxSYc1i3CD3Etm2Hn6RIs2nUGncJ80bOFv/lyVywqlqoB8udvamyjLl0IpfdA475URETkUtWteVr8bzaS9uSgfaA3lu/NhV6V59oDca2awU8r8PfJYmgVAb0qkZSiYzBF5KHsDqT27t1rse5p69at2Lp1q8227dq1w91331330ZHnY0bKKV3DfbHzdAlUCbz2VzrevCYaoX5a1y0qTt0H5OXU3CZPZ2zXNbZu5yIiIium4Gdxsg5SSvRpE4BPtmUhNbcMAHCy0Pj+GR3ig+HRgRgaFYTfD+dbrIkyvSdU7Y+IPIfdgdT111+P0aNHQ0qJxMREJCYmYuDAgRZthBDw9vaGtzc/VF80mJFySkJcBAwS+GZPDvLKDHjtr3TEtfLH0pQcl8yHl/m5drdz/QotIiICjMFPemEFlqTkYEnK+S+3Qvy0GBYViBHRgYgKMVZArvpFmuk9oGowVvV3IvIMdgdSVQOkBQsWIDAwED4+ri/fTI1MZbnxX2akHHbrJREorTTgp4P52Jd9Fvuyz2JSbJhL3ihFcKixsIQd7YiIyH1GdQ7GhrRCAIAAMPuK9oht6Q+NYvk1liqlzS/STL+r0p6/6kRUn5yqCBERwQ3h6BxmpOoksV8rrDqUD8O590cfrYvqv3TuAYSE1Ty9LyTc2I6IiNwmJbMEAMxrng7qzqJ362ZW7WpaF8tMFJFnsiuQeuCBB6AoCt566y1otVo88MADtZZsFkLg3XffdckgyXNJ8xopZiedkZSig0EaFxmrEli0KxutArxxeYfmdepXKBooCYlQP5hbbRslYSoLTRARuVFSig5LqkzZ5ponoqbFrkCqR48eEEJAURSL34mYkXJe1fnwE3qF4YnVx5GaW4bXNqZj7tWR6BLuV6f+Rd94KNNmQF36iXVm6qobuI8UEZEbcc0TUdMnpOSkWwDIzs5GpSkoILsZXn8GOJgCce8TUPoPaejhNBq23mANqsSDPx1FRlElfLQC714bjZYBdV97JlUDkLoPMj8Xcs9O4J91QOce0DxZfbaKiIjqZklyNhQhbAZLrtjmgojcw8vLy+5lTG7ZkJcuInpj8CmYkXKIrUXFGkXgjTFRCPbVoFwv8eL6UyiuMNTQi32EooHoGgtl4DAoN90BKIoxsDp1rM59ExGRbZPiIqrNOE2MDWcQRdQE2DW1r+pGvI7o0YML2Zs80xopLav2OaK6N1B/Lw3eGBOFJ1Yfx8mCCrz6Vzr+O6I9tIprptKKkDCIPpdD7tgEue4XiNsfcEm/RERERBcbuwKp559/3qnOk5KSnLoeNSLmNVIMpFwl3N8Lzw5vh5m/H8e/maX4cGsmHhjYymXrEsWIa42B1D/rIW+eAuEf4JJ+iYiIiC4mdgVSs2bNcvc4qLEyV+3j1D5X6hjqi8cGtcErf6bj9yMFaNPcGzf1DHNN5116Am0jgfTjkJvXQlx5vWv6JSIiIrqI2F21j8gmZqTcZkC75ri7bwss3HEGn+/ORsvmXhjUIbDO/QohIIZfA/n1B5DrVkFecR2EwuWSRERERI7gpyeqG2ak3Oq6bqG4tmsIAGD+5tM4qDvrkn7FZcMBP3/gTAawb7dL+iQiIiK6mNiVkXr//fchhMB9990HRVHw/vvv13odIQSmTZtW5wGShzMHUsxIucs9fVvgTHEFtqWX4Lk1J/DuWOuy6I6W0hW+fhDxIyHXroS6/hdoevV1x9CJiIiImiy7Aqm9e/dCCAFVVaEoCvbu3Vvrdbhhb9MnpWRGqh5oFIHHBrXFtB+PIK/MgMdXH8cH42IQ4K0BYLknlSPE8DGQa1cCydsgszMhIlq5YfRERERETRM35D2HG/I6TlZWQv2/mwEAyttLIPybNfCImrac0ko8sPIYzupVtGzmhfeui8F3+3KsNvZ1hOGt/wL7dkOMugnK+DtdP2giIiKiRsTtG/LqdDpUVFRUe3lFRQV0Op0zXVNjUlnlOeDNqX3uFubvhVeu7gCtIpBVUolblh6sUxAFAMqIawEActPvkBXlrhwuERERUZPmVCD1wAMPYOvWrdVevn37djzwADf6bPL05wIpIQCNXbNEqY6iQ3zx9NC2AAAJQBFwOogCAMT1A8JaAMVFkNs2umaQRERERBcBt1Tt0+v1UFhOuekzlz734pq4enQkt8z8f1UC72857XRfQtFADBsDAJDrfgZn+hIRERHZx+40QmlpKUpLS82/FxUV2Zy+V1JSgs2bNyM4ONglAyQPZprap+W0vvpiKiwxKTYMR/PKseVUMX49XIAAbw3u6NPCqT7F4Ksgf1wMHD8MHDsExHR18aiJiIiImh67A6mff/4Zy5cvN/++aNEiLFq0qNr2EydOrNPAqBHgZrz1qmp1vomx4SipMOCx1Wk4XVSJb/flwksj7C5/XpVoHgjRfwjk339ArvsFgoEUERERUa3sDqQuueQS+Pr6QkqJr7/+GoMGDUJ0dLRFGyEEfHx8EBMTg44dO7p8sORhWPq8XqlSWhSWaOatwYwhbfHEr8dRYZBIySrFJCf7FiOuNQZS2/+CvOUuiMBgl42biIiIqCmyO5Dq0qULunTpAgAoLy/HwIED0aFDB7cMavXq1Vi5ciXy8/MRGRmJu+++G506dar1eps2bcLbb7+Nfv364cknn3TL2KgKZqTqla1sU1SILx4Y2ApvbT6NvWfOYnt6Mfq1DXC4bxHdGYjuAhw7BLnxd4hrbnHFkImIiIiaLKcqQtxyyy1uC6I2b96ML774AuPHj8e8efMQGRmJl156CQUFBTVe78yZM/jyyy/RvXt3t4yLbGBGyiMMjw7CmM7BAIC3Nmcgq7j6rQlqIoZfAwCQG1ZBGgwuGh0RERFR01SnmtUHDhzAsWPHUFpaarPa1/jx4x3u86effsLIkSMxYsQIAEBiYiJ27tyJdevW4YYbbrB5HVVV8e6772LChAnYv38/SkpKHD4vOcFU/pwZqQZ3z6UtcDi3DKk5ZZj3VzrmXh0Jb41j35OI/oMhl/0PyNUByduAPpe5abREREREjZ9TgVRxcTFeeeUVHD58uMZ2jgZSer0eR48etQiYFEVBbGwsDh06VO31li9fjsDAQFxxxRXYv39/jeeorKxEpWlKGozruvz8/BwaJxlJ06bMWmakGpqXRsFTQ9ri0VVpOJJbjo+2ZeGhy1o71Ifw8oYYchXkqm+hrvsZGgZSRERERNVyKpD68ssvceLECfznP/9Bp06d8NBDD+GZZ55BixYt8NNPPyE1NRVPP/20w/0WFhZCVVWr0unBwcHIyMiweZ0DBw7gjz/+wKuvvmrXOVasWGFRfTA6Ohrz5s1zeKwErpHyMBHNvPDYoDaY/cdJrDlSgG7hfriqU7BDfYhhYyBXrwD2/wt181pAo4UIDgU694BQNO4ZOBEREVEj5FQgtWvXLlx55ZWIj49HUVERAGNmp1WrVpg6dSpef/11LFq0CNOnT3flWK2cPXsW7777Lu677z4EBgbadZ0bb7wRY8eONf/OjWTrwLRGypuBlKfo3boZJl8Sjq//1eGjbVmICfVFx1Bfu68vwloAkR2BtFTIz94GAEgACAmDkpAI0TfePQMnIiIiamScKjZRUlKC9u3bAwB8fY0f0srKysyXx8XF4d9//3W438DAQCiKgvz8fIvj+fn5Njf4zcrKQnZ2NubNm4eEhAQkJCTgzz//xI4dO5CQkIDMzEyr63h5ecHf39/8w2l9dXBujZTghrweZXzPMPRvG4BKVWLun+koKre/cITcuRlIS7W+IC8H6gdzjZcTERERkXMZqdDQUHOw4+XlhcDAQBw/fhz9+/cHAOTm5jqV6dFqtYiJicGePXswYMAAAMZCEnv27MHo0aOt2rdp0wavv/66xbGlS5eirKwMd955J8LDwx0eAznAPLWPa6Q8iSIEpl/eGvf+cARnSirx1uYMPDu8HZQqr8mkFB1UKS1KqkvVAHXpJzX2rS5dCKX3QE7zIyIiooueUxmp7t27Izk52fx7fHw8fvjhB3z33XdYvnw5fvnlF/Ts2dOpAY0dOxZr167F+vXrcerUKSxcuBDl5eUYPnw4AGDBggVYvHgxAMDb2xsdOnSw+GnWrBl8fX3RoUMHaLV1KkpItalk1T5PFeCjwdAo43TXHRklWLYnx3xZUooOi5N1FoEVACB1H5CXgxrl6YztiIiIiC5yTkUaY8eORXJyMiorK+Hl5YVbbrkFp06dQlJSEgBjoHX33Xc7NaD4+HgUFhbim2++QX5+PqKiojBz5kzz1D6dTsd1TZ6CGSmPdv+AVsg7q8c/p4qxOFmHzmG+SM0pw+JkHSbHhWNirGXGVubn2tWvzM8FX4FERER0sRPS1gZQTiopKYGiKI1y3VF2drZFWXSqnbr0E8i1KyGuuQXKjbc39HCoGo+tSsPh3PNrGG0FUQAgD6ZAff2ZWvtTHn8JomusS8dIRERE5Am8vLwQERFRe0M4ObWvOs2aNWuUQRQ5iRmpRuGVqztY/D6mS4jthp17ACFhNXem1UKG2vfHhYiIiKgps2tq34YNG5zqfNiwYU5djxoJrpFqFFbss5yy95+fj+H962Lg52X5PYpQNFASEqF+MLf6zvR6yBcfgXrr/VAG8vVNREREFy+7Aqn333/fqc4ZSDVx+nMZKZY/91imwhKT48IR36E5Hl2Vhtyzekz/5RgWjI2Bl8ZytZPoGw9l2gxj9b6qhSdCwiHGjIfcsh44cgBy4RtQ9+yAmHQfhH8zAMaqf0jdZ1xDxU18iYiIqImza41Udna2U53bO7/QE3CNlOMMC+YA/26FuP0BKENHNfRw6AJVgyjTmqiDurN4+rfjMEggMsgb86+Ntq7eh+qDImkwQP78DeRPSYBUgbAWUKY+ChTm2wi+uIkvERERNS6OrJFyabGJxoyBlOMMb80C9u2CuPsRKJePaOjh0AWWJGdDEcKqsMTOjGK8sO4UJIBruwQjsV9LhythysP7oX76JqDLAiAAVP9nRJk2g8EUERERNQr1Wmzi1KlT2LVrF3bt2oVTp07VtTtqTPTGNVLCm1P7PNGkuAib1fn6tgnAo4PaQAD4+VC+xR5T9hKdukP579vAZcNRUxAFGDfxlarB4XMQEREReTKnd6zdtm0bvvjiC5w5c8bieIsWLTBlyhT069evzoMjD1fJNVKN1dCoQBSW6/HJ9jP4OlmH5j6a6qv5VUP4+UMZfBXUf9bX3NC0iS9LphMREVET4lQgtXPnTrzxxhuIiIjApEmT0K5dOwDG7NTatWvx+uuvY8aMGejdu7crx0qexly1j+XPG6OxXUNRUGbAN3ty8NG2LAT6ajCoQ6BDfXATXyIiIrpYORVIffvtt4iMjMTzzz8PX19f8/F+/fph9OjR+O9//4tly5YxkGrqzPtIMSPVWE2OC0dBmQG/Hs7Hm5tOI8Bbg0taNbP7+iI4tJaJfefbERERETUlTq2ROnHiBIYNG2YRRJn4+vpi+PDhOHHiRJ0HRx6OGalGTwiB+/q3xOXtm0OvSry8IR2Hc8rs78CeTXxDwo3tiIiIiJoQpwIpLy8vFBcXV3t5cXExvPjhuunjhrxNgkYReGxQa8S19EeZXsXM348jvbDCql1Sig5Lki23QjBt4lsTcdX13E+KiIiImhynAqlevXrhl19+waFDh6wuS01NxapVqxAby4XlTZ5pQ14GzY2el0bB08PaIsRPi3KDxBOr05BTen47ANOeVLb2nDJt4muVmdIYZw7L1d9CZmW4dfxERERE9c3ufaSKi4sREBAAAMjKysKzzz6LwsJCdOrUCW3atAEAZGRk4PDhwwgKCsKcOXPQokUL943cxbiPlOMM024C9Hoo8/4HEWpdZpsan/wyPR5ceRRFFSqCfDR477oY/HIoz2pjX1su3MRXtomEfPM54NQxIDQCypNzIcIazybdREREdPFxy4a8kydPRp8+fTBkyBBceumlKC0txYoVK7B7925kZxun+0RERKBPnz644YYbEBQU5PwtaAAMpBwjVRXqfTcAAJQ3v4Jo7li1N/JcWcUVePjnNJTpVfNWu7UFUdWRhflQX3sayEwHWrSB8tQrEIGOlVknIiIiqi9uCaTeeecdbN++HeXl5fDz88OAAQMwePBgxMbGQtiY7tPYMJByjKwoh/rALQAA5d0kCF+/Bh4RuVJaXhn+80saAEAASJrYBT5a5/bvlrnZUF99Gsg5A7SNhPLEyxDNmrtusEREREQu4pZACgAqKiqwdetWbNy4EcnJyTAYDAgODsagQYMwePBgxMTEOD3ohsZAyjGypAjq9FsBAMqHKyA0LCbQlJjWRJm0ae6Fd66NgZfGuS9N5JkMYzBVkAdEd4Hy6AsQvv6uGi4RERGRS7gtkKqquLgYf//9NzZu3IgDBw4AAFq3bo0hQ4Zg8ODBaNmypTPdNhgGUo6R+TlQn7gLUBRoPvq+oYdDLmQKoibHhaNnC3/8d+0JGCTQPtAbb18bDY3iZDCVfhzqazOBkiKgayzEg89AHD9iXlOFzj1Y3Y+IiIgaVL0EUlXl5uZi48aN2LRpE9LS0gAAnTt3xpw5c+radb1hIOUYmZ0Jdea9gI8fNAuSGno45CJVgyjTmqhdp0vwwrqTUCUQGeyDt8ZEOR9MHUuF+uazQNlZY7XHqq+5kDAoCYkQfeNdcVOIiIiIHOZIIOXcoocLhIaGYty4cXjggQfQr18/AMYy6NSEcTPeJkmV0qqwRJ/WzfD00LYQAI7nl+ODrZlQnfz+RUR3hhh1o/GXC7+4yMuB+sFcyJ2bnRw9ERERUf3R1rUDnU5nzkadOHECANClSxcMGTKkzoMjD2b6EMzNeJuUSXG2v4EZ0K45nhjcBq9vysDvRwrgrVWQeGkLhwvNSNUA+eevNbZRly6E0nsgp/kRERGRR3MqkCosLDSvjzJtytumTRtMnDgRgwcPblT7R5GTmJG66AyKDESFQeLtv0/j54N58NEI3NE7wrFgKnUfkJdTc5s8nbFdV27qTURERJ7L7kCqrKwMW7duxaZNm5CSkmKu2Hfttdc2+op95ARzIMWM1MVkREwQKgwS72/NxHf7cuGjUZAQZ//+UjI/1+52jX9TBSIiImrK7A6kEhMTUVFRAV9fXwwePBiDBw9Gr169oCguWWZFjY3+3NQ+LTNSF5tRnYNRblDx6Y4zWJKig7dG4KaeYXZdVwSHwp7VVSI4tG6DJCIiInIzuwOp2NhYDB48GP369YO3N7MQFz1mpC5q47qFokIv8eW/2fh8dzb2ninFcyPaW7VLStFBlfL82qvOPYCQsJqn9wUZS6ETEREReTK700lPPvkk4uPjGUQRAECai00wI3WxGt8rDBN6GTNR2zNK8PKGUxaXm0qpK1XWUAlFAyUhseaOtVqgosLl4yUiIiJyJc7LI+cwI0UAJseF44buxml4W04VY96fxmDK1n5UJqJvPJRpM4yZqaqCQgBffyDnDNRP34RU1Xq5DURERETOqHP5c7pIsWofARBC4M4+ESjXq1iVmo/NJ4tx0+IDMEjYDKLM1+sbD6X3QCB1n7GwRPC56XzHUqG+/gywewvkii8hbp5Sz7eIiIiIyD7MSJFzzgVSghmpi54QAvf2b4krYoIAAAYJaASqDaLM11M0EF1joQwcBtE11vh7x24QUx4CAMjV30LdtNbt4yciz7EkORtJKTqblyWl6LAkObueR0REVD0GUuQcbshLVShCoEWz8wlugwReWHfSub4uGw5x7QQAgPzyPchDe10yRiLyfIoQWJysswqmbK25JCJqaAykyDlcI0VVJKXosDQlB5NiwzCuWwgAYEdGCZ5bewJS2lPw3JIYNxm4NB4w6KF+8DJkdqarh0xEHmhibDgmx4VbBFM1rbkkImpIXCNFzmHVPjrnwg85Uko089JgSYoOyZmlePq3E3jl6g4QDnyTLBQFyl2PQNWdAY4fhvrui1BmvArh38yNt4SIPIEpWFqcrMM3e3KgVyWDKCLySMxIkXOYkaJzVGn5IUcIgYS4cNxzaQsAwH7dWXywNQsG1bHMlPDxgfLgM0BwGHD6JNSPX4VaWQF5MAXqlg2QB1MgVYPLbw8RNbyJseHQKgJ6VUKrCAZRROSRmJEi5+jPZaS0zEhd7Myb7V5gXLdQ+GkVvLclE78ezsfZShX/iW8NreJAZio4DMqDz0J9dQawdxfkI7dBlpcBACQAhIRBSUiE6BvvgltCRJ4iKUVnDqL0qkRSio7BFBF5HGakyDnMSJEdruoUjMcHt4FGAH8eL8TcP9NRYXBsfygR2RFixDXGX84FUWZ5OVA/mAu5c7OLRkxEDa3qdOFvJ3W1WjNFROQpGEiRUyQDKbLT4MhAzBzWDt4agW3pxXhh3SmUVto/JU+qBsitf9bYRl26kNP8iJoAW4UlbBWgICLyBAykyDksNkEO6Nc2ALNGtIefVkFKVikeXHkMReXWgY/NfWJS9wF5OTWfIE9nbEdEjdqFay5NTMGU6kQVUCLybFI1NNr1z1wjRc5hRooc1KulP168sj1m/n4COWf1eOCno3j7mmiE+Bn/DFX9JroqmZ9rV/8yPxfcYYaocatuzSVQ+ybfRNT4yJ2boS79xPyFaWNb/8yMFDnnXEZKMCNFDugc5ofXR0fBV6ugoMyAB386ijPFlTXuEyOCQ+3q2952RERE1PDkzs1QP5hrPeukEa1/ZiBFzmFGipwUGeyD+ddEoZmXguIKFYk/HKl5s83OPYCQsJo7DQoxtiMiIiKXcde0O6kaoC75pMY2jWH9M6f2kXMYSFEdtG7ujXfHRuPuFUfMx3q19LfZVigaKAmJxm+tqqPXA7k6ILylq4dKRER0UXLFtDsppXEdc1YGZGY6kJUOmZUOnDgGFObVfGXT+ueusXW7IW7EQIqcw0CK6mjNkQIAgIDxj/Oza07gicFtEN8h0Kqt6BsPZdoMiz/oAIDgUGMP+TlQ33gWypNzIWrLXhEREVGNzNPuLnRu2p0ybYZFMCXPlgKZ54KkrPQq/88AKsqdH4eHr39mIEXOYdU+qoOqa6Ju6B6KR1el4VRhBeb9lYHEfnqM7Wq93kn0jYfSeyCQus/4hzU41DidrzAf6qtPA9mZUN98FsoTL0MEhjTArSIiImr8pGowfnFZA3XRu0DKDuBMhjFYKqghu6TRAOGtgFZtIVq2BVq1BcrLIJMW1joWT1//zECKnKNnRoqcY6uwxDvXRuOpX48jNbcMn2w/A12JHnf0iYAiLL+HEooG6Bpr+e1UcBiUx+ZAfXUGkJkO9c3/Qnn8JYgA68wWERER1cKebUfOlgAbf7c8FhQCtGxjDpZEy7ZAy7ZAeEsIrWXIIVUD5G8raj5PSLjHr39mIEXOMWWktMxIkWNs7ROjUQReGx2JWX+cxL+ZpVixPxc5Z/V4+LLW8NLUntQXYS3OBVMzgfTjUN+aBeWxFyH8A9x5U4iIiJoce7cdQZ/LIPrGnwuY2kD4N7P7HPasf1YSphq/QPVgrNpHzuEaKXLSpLgIm9X5hBB4YWQH/Ofy1tAI4M+0Qryw/iRKKuyr2CNatIHy2ItA8yDgxBGo77wAtbSk0W7yR0REVN+kqkKeSrOrrTLyOiiXDYeI7uxQEGViWv9sVZk3JNxqDZanElJym3AAyM7ORqUpy0I1kgYD1PtvBAAo8xdDNOO3/uRau06XYO6f6SjTq4gK9sF/R7RDmL992U958hjU12cCpSXGjKm+yuu6EW3yR0REVJ/kkQNQkxYCxw7V3jgkHMrcT1ySMZKqwWr9c0Nmory8vBARUf3m4FUxI0WOM2WjABabILfo07oZXrmqA0J8NUjLL8eDK4/i422ZNtsmpeiwJDnb/LtoHw0xerzxF/0FX440ok3+iIiIauLoHk/VtZd5OVA/fQvq3CeNQZSPH3DZ8Br7cuW0O6FoILrGQhk4DKJrrMdP56uKa6TIcVUzd1wjRW4SE+qLeaMi8fy6U0gvrMDPh/JRbpB46LLW5jZVC1eYSNUAue6nGvtWly6E0ntgo/pjTURETZejWRlH93iy2T44DOjSE/h3K1BeBgAQg0ZC3HgHRFAIZJ/LrLcdCQk3BlGc2QGAgRQ5w5SR0mohFCY1yX1aBnhj7tWRmLP+FA7qzmLNkQKU6VU8Mbitzep/AOyrNtQINvkjIqKLg1NBkSN7PFXXPj8H2Pqn8f8duxnPF9XZfHF1247wS8jzGEiR41hogupRoI8GL45sjzc2ZWDLqWJsPF6EzScOQJWwDqJgf7UhT9/kj4iImj6HgyLVAHVJbXs8vQNknoIQCqRUgdXf1TyIZs0hnngZQmMdFtjcdoTMGEiR48wZKU7ro/rho1Xw1JC2+GR7Flal5kOVgCKA8T3DrNqK4FDYVUEniJv2EhFRw7Fr49sv3wPOZEBkZ0FmZQAZx4Giwpo7PlsKrPjKvvdCACgpgji8n7M0nMB5WeQ40xopb5+GHQddVDSKQLDv+ekEqgQe/OkoSisvWFzbuYd1KVUb5JofIUuLXT1MIiIi+9gzFb24CPj2C8g/fwUOptQeRJl06QUx6EqgSy+7mtu9dxRZYCBFjjNP7WNGiupPUooOS1JyMDkuHDOGtIVGABlFlbj/x6PILjlfAMW0yV+NFAX4dyvUOY9Cnjzm5pETERFZszt46dgNYuxEiLsfgZh0n11XUcZNgnLnw1DGTbKrvQgOtW8sZIGBFDlOb5raxzVSVD8uLCxxeYfmmDcqEr5agYIyAx786ShSc86a29e2yZ/y9GtAWAsgOxPqK09A3bTW3MTRcrJERERO8fO3q5ly4+1Qrr8VyuUjIIaPrn3WRUi4cXYGYN8sjartySFcI0WOM03tY0aK6okqpVVhic5hflgwNgaPrU5DQZkBM38/gUcHtcHl7ZsDqL3akPLsm1A/fRPYsxNy0dtQj+wHusVBLv/M7spJREREzpC7/oH8+sPaG14Q5JhmXdgsUHFO1T2eHG1PjhFSSrvXojVl2dnZqKysrL0hQW7fCPWjV4EuvaB54uWGHg5d5EorDXjtrwzsPF0CAeCOPhG4sXsohKi9xpBUVcifv4FcuQSo5U/hhZWTiIiIqlPdvlAyLwfqko+AXf8YGwYGA4X51fZT3XvPhSXTAdS4x5Oj7S9mXl5eiIiIsKstA6lzGEjZT/17HeT/3gJ69oFm+vMNPRwiGFRprugHAFd3CsJ9/VtBq9hXsFVN3g654MWag6mQcChzP+G3dkREVCPbQUsY0KsvsG0jUHYW0GggRt0Ece0EYM8Op4IchzfxdbD9xcqRQIpT+8hx3EeKPIxGEbivf0u0DfTGpzvO4LfDBUjOLMUbY6IQ4G35JpGUooMqJSbFnf8jKXx8UOt3StzEl4iIalHTvlD463fj/2O6Qrn9AYh2Ucbfndz41tE9nrgnlOux2AQ57lzmTjCQIg8ihMB13UIxc1hbaBUgs7gS0348isyiCnMbU9EK5YJpf45s4ktERGSLPftCwb+ZcfNbUxB1jlA0EF1joQwcBtE1lpmiRoKBFDlOzw15yXMNaNccr42Kgp9WQWG5AQ//fAz7s0utKv9VZW/ZV5aHJSK6+NhdzdWefaFKSyCOHHD9IKlBcGofOa6CU/vIs8WE+uK966Lx2Ko05JUZMOO3EwCASbFhVkEUgPPlYWt6AwwOY3lYIqKLzIXrnS6s5ioNBuD4YcgDyZBbNtjXZ34up9c1EQykyHHckJcagTB/L3wwriMmfXMIptVPmcWVKNOr8NVaJuPtKQ8Lb2+gtAQICHTfoImIyGPUtN5J/WAuENkRyMowFo9wAGc3NB2c2keOM1U39GZGijzbjwdyIQGYivetO1aIx1en4URBuVXbajfxDQwGfHyBM6ehvvo0ZG3TNoiIqNGza73T8SPGIMo/AOhzGTBxqvE9oybc/LZJYUaKHGdeI8VAijzXhWui3vk7A2uPFuJkQQUeX5WGaQNaYURMkMV1qtvEF5npUN+aBZw+CXXeU1CmPw/Rqm0D3TIiInKWvSXAZfL22tc7ARC3PQAx5EpzHzI0nJvfXkQYSJHjWP6cPJytwhIPX94GQT5afLc/F+UGifl/n8beM6VI7NcSPlWm+tksD9umA5QZ86C++V/gTAbUV2dAmT4bokPH+r1hRETktFrXO5UWQ+7eArltI7B3p32d+vpaBEam2Q3c/PbiwECKHGea2sc1UuShVCltVueb0rcFvLUCe7JKsffMWfx+pACpOWV4ckhbtA2s+YsBEdYCylNzob49GzhxFOrrz0B58FmILr24ySERkYerfb1TJyA9DdDrHerX1nqn6mY38H2h6RGy1l0oLw7Z2dmoNAUIVCPD+y8Du/6BuO3/oAwb3dDDIXLK7tMleHNTBgrKDfDVKnhwYCsMiaq9kIQsLYH63hzg0F7AyxviynGQ/6yz2sHe9A0nERE1LKkaoM6YatdUPbRuD9F/CND3csi3Z9d8nZBwKHM/YYDUxHh5eSEiIsKutiw2QY5jRoqagN6tm+Gta6LQs4UfyvQqXt+UgcdXpaHCoFq1TUrRYUlyNgBA+DeD8p/ZwCUDgMoKyFXLrd9oz33DKXdurodbQkRENbJnfycAYsrD0LzwHpTrEqC0jYSSkFhje653IgZS5DiukaImIszfCy+O7IDxPY2V+lJzy3DvD0dwuqjC3Ma03koR51dNCW8fiPueBLx9auxfXbqw+o0biYiozmrbLFeWFkPd/Id9nV3wBXG11VxDwqFMm8FZB8Q1UuQEvTEjJZiRoiZAowjc3jsCPSL8MPevdOSdNeChn47hsUFtcKKg3KpohYk4ehCywrqMuoU8nfGb0K6xbrwFREQXp+qKR4iJiRDNgyD/+g1yx6bzXwDXguudyFEMpMhxlSx/Tk3PpW0D8P51MZjx23HoSvWY+1c6ACAhNswqiAKMO9PbgzvYExHZx5HCPTUVj5AfzoVFAYDW7YH8XOBsSfUnr2F/J5vVXInAQIqcYV4jxUCKmpaIZl746PqOuGXpQajn3oV3ny7FVZ0qEe5/wZSP4FDYU6mHO9gTEdWuttLkFm3t2SwXAAZdCWXI1UBMV2DX39zfiVyOa6TIcabpTJzaR03Qt3tzoEpAc+6rxwO6s3jklzTsPn3BN5mde1jPm7+Qtw9k2yi3jJOIqKkwZ5dqKdwjKysgjxyw3qOpGsrlIyA6doMQguudyC1Y/vwclj+3n+HxKUBBHpRZb0O0i27o4RC5zIUb+S7cnoWVB/MAAAJAQmw4bukVBo1ijLKqnVpSVXhLKImPQ8R0dfPoiYgaH7tKk/v4Ai3bAunHAYP9+zyJqY9BGTjM6nxc70Q1Yflzci+ukaIm6MIgCgCm9muJCb2M315KAEtSdHhh/SkUlBnfyGv6hlPceDsQ1gLQZUF9dQbUVcshVWNp9dqqTBERXTTsKU1eXgacOGIMopoHAR272dW1zeIRigaiayyUgcMgusYyiKI64RopchzXSFETpEppszrfrZdEQKsIHMktw67TJdh9ugSP/JKGJ4a0QfcI/xorOsnhYyC/fB9y+0bI776A3P8vRP8hkCuX2LUOgIioqbO3cA+uGAvlquuNX1BJtfYsVg3FI4hchVP7zuHUPvtIKaHeez0AQHnjC4jA4IYdEFE9Sssrw7y/MpBRVAGNAOJa+aNbuB8S4qynACSl6KBKiYTYcMiNv0Mu/eT8+sJqcJ4+EV1s5MEUqK8/U2s75fGXIKpsJVHb1Gr+PSVncWofuY++ytxkZqToIhMV4os3xkRiUIfmMEhg1+lSLEnJwZe7z1i0q7qJrxACypCrIWa+DmhqnkLCDXyJ6GIiVRVq2uHaG9rILrF4BHkCj5zat3r1aqxcuRL5+fmIjIzE3XffjU6dOtlsu2XLFqxYsQKZmZkwGAxo1aoVrrvuOgwdOrSeR32RqLqpHav20UXI30uDJwa3Qc9D+fjfzizoVWD53lyUVKi4f0Arm2utAEAUF0IaagmSuIEvEV0kZGE+1M/eBvbsqLVtdaXJuVkuNTSPC6Q2b96ML774AomJiejcuTN+/vlnvPTSS5g/fz6CgoKs2gcEBOCmm25CmzZtoNVqsXPnTrz//vsIDAxE79696/8GNHX6c4GUEIDG454+RPVCCIFru4agU5gvXvsrHdmleqxKzcevh/OhSthca8UNfImIjOS+3VD/9xZQkAd4eUNMuAdoHgSZdEFZ85BwYxBVQ3aJm+VSQ/K4T8I//fQTRo4ciREjRgAAEhMTsXPnTqxbtw433HCDVfuePXta/H7NNddgw4YNOHDgAAMpdzAXmvCCEPyzRRe3ruF+ePOaaMzfnIEdGSXmTXy7R/hZteUGvkR0sbmw1LiM7gL8tBRy9XeAlECbDlDufQKibaSxfR9ml6hx8ahASq/X4+jRoxYBk6IoiI2NxaFDh2q9vpQSe/bsQUZGBm699VabbSorKy2KSggh4Odn/aGHqsHS50QWAn006BLmix0Z5zfsfW7tSQyObI67+rZAuP+5KbCmDXxrKfOr/v4DlIhWEKH2LXQlIvJEcudmi41zJWCcyXJuHygxdDTEhHsgfHzM12F2iRobjwqkCgsLoaoqgoODLY4HBwcjIyOj2uuVlpbivvvug16vh6IouOeeexAXF2ez7YoVK7B8+XLz79HR0Zg3b55Lxn9RYOlzIgtJKTosScnB5LhwXNMlBM//cRKpuWXYeLwI29OLMaFXOMZ1C4WXRgMlIbHmDXwVBfh3K9QDyRDjJkOMvA7iXIEKbiJJRI1FtRX1TEHU1TdCueWueh4Vket5VCDlLF9fX7z22msoKytDSkoKvvjiC7Rs2dJq2h8A3HjjjRg7dqz5d05Pc5CpfDMLTRDZLCzx+pgofLg1E6tS81Gml/hidzbWHCnAvf1bos+5KlNVv6UFYF4HgJbtoH71PnB4H+Sy/0H+sw7K7Q8AeTrrb3a59xQReSCpGox/r2pqs+0vyJvv4JdB1Oh5VCAVGBgIRVGQn59vcTw/P98qS1WVoiho1aoVACAqKgrp6en4/vvvbQZSXl5e8GIQ4Dw9M1JEJtVt4nv/gFYI9tXgaF45DurOIqOoArP/OIm2gV64tE1H3D13oVV26Zu9eVBzJBKeeBly0xrI5YuAk8egvvy47ZPn5UD9YC7L/BJRvbA3Ky53/F3rFGZWKKWmwqMCKa1Wi5iYGOzZswcDBgwAAKiqij179mD06NF296OqKjfXdRfTGikGUkSYZGMjXhPTJr0lFQYsSdHh54N5SC+sRHphHo7lleO/I3rCW2Pcyq9qZksoCsSQqyEvGQD1m/8BW9bXOAZ16UIovQfym10ichub652qZMVlUSHkjk2Q2/4EDu21r09WKKUmwKMCKQAYO3Ys3nvvPcTExKBTp0745ZdfUF5ejuHDhwMAFixYgNDQUEyePBmAcc1Tx44d0bJlS1RWVmLXrl3466+/MHXq1Aa8FU1Ylap9RFS7Zt4aTL20Ja6MCcIn27Ow58xZpGSV4q7vDmP65W1wNK/M9r5TgcFQhlwFtZZAit/sEpE7Vbve6VxWHO2jgfTjgKo61C8rlFJT4HGBVHx8PAoLC/HNN98gPz8fUVFRmDlzpnlqn06ns1jXVF5ejoULFyInJwfe3t5o27YtHnroIcTHc6qLO0hmpIicEhXiizlXdsBfx4vw/pZMFFeomLPhFADg+m4hVtMDAe49Re61JDkbihA2n3tJKTqoUtaYdaXGy+5penasd8LJY8Z/O3SEGDAE6DsI8rUZNU/vCwk3VjIlauQ8LpACgNGjR1c7lW/27NkWvyckJCAhIaEeRkUAWLWPqA6EEBgaFYh+bZvh1mWp5n2nVqfmI9hXi3HdQ6FVzodE3HuK3EkRAouTdQBgEUxVnWpKTU9t0/Qs2h7cU/t6JwDi7ulQLr/i/PVqqVCqJEzldGRqEjwykCIPZs5IcWofkbNWHsiDKgGNAhhUoNwg8fnubKw7VoD7B7RCzxb+xob27D0lBGRhATNS5DBT8FQ1mLJViZKajtqm6SnTZgDtYyD37YbcvxvYs9O+ji8IikQtFUpZIIeaCgZS5Bi9MZAS3JCXyCkXflBdmpyNJSk58NEInCiowMzfT+CKmCDc2ScCQb7a2veekhLy41eh7t4CMfleiGbN6+/GUKNXNZj6Zk8O9KrtSpTk2eyZqmfPND31o1cdXusE2M6Ki77xUHoP5P531KQxkCLHsNgEkdNsfdufEBcBcW6KVcdQHxzJLccfRwuw9VQRpvRpAZ2mM5Txs3HL2netvtlddsUDUAsKMPGPdyC3boA8mALljgcg4vpzA1+y28TYcHMQpVVsr5kiz2X3VL3UfbVP01NV48bgnbpDdL8E6BoH+fFrQL5z652EogG6xjJjTk0WAylyDItNEDmtun2nTL+rUuLefq3wwdZMpOWX470tmQjz1yKn1B+4bR4m+mSZA6Ok8pZYkpKLyXGRUAa8CvV/84HMU1DffRHoFgtkpgPnilVwA1+qSVKKzhxE6VWJpBQdg6lGwq6pet3igNR9UNevsqtPcfuDUAZfef4ck7jeiag6Qkppz1rmJi87O5t7T9lB/fZzyNXfQlx1PZQJ9zT0cIiaJIMq8dPBPCxO1qFMr0LAGAzd0jMUt/VuYTOzJSvKIX/4GvK372vsmxv4UlUXPpe4RqrxkKoB6oypNWeZNBrAYHCoX+XxlyAu2E7hwqwXAK53oibLy8sLERH2VSxlRoocw4wUkdtpFIHru4diUGRzfLrjDDafKAIALNubi+/25cIgYb3vlLcPcPMUyL/XAUUF1fbNDXzJxFbQZKsABXkoe6bqmYKoVm2Bzr2AnZuAkuLq21czTY/rnYhsYyBFjmHVPqJ6E+7vhaeGtMWO9GJ8vD0LmcWVMEhAAOjfNsD6Cqn7agyiAHADXzKzZ6opeS5795kTk++HMuIa43V69XF6mh7XOxFZUxp6ANTImAMpn4YdB9FF5NK2ARgaFWj+XQJ4ZFUa3ttyGvll+vPHHdjAl2hSXES1GaeJseHcjNeDyfxcyJ1/29VWtGl//v/nypIjJMyyUUg4p/0SOYEZKXIMq/YR1bukFGNp6slx4bgiJggvrjuJ4wUV+O1wATYeL0JCbDiu6RICrZ0b+Mptf0H26stS6UQeqKaKmzI/F3L1t5B//nr+i82a2Jiqx2l6RK7DQIocIrlGiqhe2VrH8s7YGLz7z2msOVKA0koV/9t5BqtT83F330j0rW0DXwD4dyvUZ++HuPEOiMFXnv+QxpLpRA2qulLm4roEIP0E5IbVgP7cF5odu0F0vwTyp6Rq+6tuqh6n6RG5Bqv2ncOqffYxvDUL2LcL4p5HoFw2oqGHQ9TkLUnOhiJs7+2zJDkbR3PLcDCnDAVlxkXlrbwM6Hvsb0w9/KNV+28iR0J2vQQT934LpB83HozsBOXW+4E8nY2qXCyZTlRfqi1lfqFO3aFcNwnofgmEEKyoR+RijlTtYyB1DgMp+xheexo4tBfK/U9BXDqooYdDRABKKw34JiUHKw/mQq8aj3UpOYXndn2MZvoyAMA3Xa/D0tZDMDkuHBO6B0Ou/wXyx8XA2dJa++faCSLn2ZPptauUuVYL8eBzED16QwjLXBKzyUSuw/Ln5D6mYFPLqX1EnsLfS4M7+7bA1Z2C8b+dZ7AtvRiHmrXD1KHP466wIuR7NcPSDI3F9EBx5TjIAUOgLlsE/LOuxv5ZMp3IOdVN1bsw0yt3b619Sq5eD6HVWgVRAKfqETUUBlLkGJY/J/JYbQK98ezwdth1ugRvbspAYbkBH2Ybq/0N6tAct/SyrNQlAkOgDL4Sai2BFEumEzmu2ql6eTlQP5gLMW4SUFkBuXcXcOLo/7d35/FVVef+x797Z2AKmROZAyEhoAYQEBS4AiJaq/WqDA3WWn9WLnBVtFwHtNZqixWooq20agWp1EKIIIhSZVAEGRQ1zLOQyAwJySEmZDrZ+/dHyCEh0zkhyUnI5/16+SI5WXufBxaY/eRZ61nu3dORQbIENCC0P4dnXF37qEgBDdU1bVtp7t0xMks9cW04/KMmf5Kqb49lq/SKblqmA7XPtoqKK1FVjVm2QPYni91OoiQVL9sD0GCQSMEzVKSARmHxrjOybMn3fDblaxpKyczXH784qmdWHdau08V7o9x+MMvKrKtQgcvPgd3VL9WTihtGPPAbGTPmlj/b6WIVtDIH4F0kUvAM7c+BBq90y/TFY+N0T89wOS1bPcJbyN/H0O60XD2z6rBe+PyIDoZFK7H7HUqKGl7hvZKihiux8wjZSe+o6JVnZX+/x/U12yqSvW+HrK/Xyt63o3jDO3AZc+fvvH3ymKzPl7t1P2PQTTKvHybz/L6pqlTWyhyA97BHCp6hIgU0aBWdO1Xy6/zt6bqzR4jynbZWfu9Q8okcJZ/IUcdO1+lIQfG3gzE/fOa6V1LUcCV2uUUJOTuko77S3u2y9m6X4vvJiLta9mcfVbuJHrhcVNU4Qp1jZX+zXvbmddLhg27fs3RF2OgzUObEKbQyBxoR2p+fR/tz9xRNuFsqcsqcMVdGdcsQANS7qs6dWrgjXZZta2zPCJ34sUCJ29O1NjVLtiRDtmwZ+tnhtfp/h5a7kqix4eeUcEsf2WfSZC9fKHvDasmyqoyBdum43Lh9xpMkmabUo5eUckA6l135uJBwmdPerrAVOq3MAe/hHKkaIJGqnm0VyRp/lyTJfPU9GQGBXo4IwKX6wZGvf29L09dHLzzwmbJlydDY+FAl9IwsM946eVT2H38jFeRXftNKHhCBhqbWzniSpJgeMgYMkdF3kIzWQdUmX/zAAWiYOEcKdaPQeeFj9kgBl4Wo4GZ6ZkgH7UvP1Xvb0rT95DlZ5xssZxfaysx1KqTFhW8VxtlM2VUlURLt0tEouHPGk+0slP35crcaR5h33iuj1N95luoBlz8SKbjPWXDhY1/2SAGXk7jwFro6sqW2nzwnQ8UPlR/tzdSKAw79tFuI7royVMHNfd1vl34kpcxDJdCQVHfGk264RcpySHu2S/m57t2zgjOejD4DZfYewFI94DJFIgX3lTSa8PGR4cM3AeByUrpJxZirw/SXTSe0JiVLBUW2lu7J0Cf7M3VbXIjubBWqADfuZ7//jqzjh2XcNkZG2IXlgez/gLe5c8aT1q248HGLVlJuTrX3rewoAcP0keLiOUgXuAyRSMF9JXvIfFnWB1xOKur099jAdmoT4KcFO84otIWvMnKd+mB3hv7j668u/R5RjzMHdG/Kp+XulRQ1XJaPrxIOrZD95UrZGz+XMegmGbeNllIPVLuUCqgpt5N0d894GnSTzGG3yW7fSfYz/1P1NZzxBDRJJFJwH63PgcuSZdtlkqgSCT0jZBiGiixbsWEttGBHmg5m5GtPQEftCeiofYGdNGXXPLVy5klSmU5/5uhhspYtkPZsk73uU9nrV1bc7e/8Uio23uNSVLffybZt6fgR2du+lr3hsyrvVcLo0UtGVNfipa4J46puHMEZT0CTRNe+8+jaVz37h4Oypv5GCgmXz4x3vB0OgHpm27Y2H83Wgh3pSsksbjjhV1SokYfXqMD01QdRN7rapbuu2b9T1ofzpf07q745nf5QQ9W2Jo/vJ504IqWf8ui+5uMvltnnd3GyJonGEcBliK59qBtUpIAmzTAMDejYWtd2CNBXR37Um5tP6Wy+lNjlZklSTGgzDbyuS9lrul0t846xsl7+bdU3p9MfSnF3mZ5b+512fFv8q69f8flO8f2k5Quls5mVX1PBUj0aRwC4GIkU3OdKpNgjBTRlpmFoYKdAXdextUYt2Kei8+savs/I1yMfp6h321a6Iy5E17RrJdMw3O/0d/pEhZ3+aFDRtLjTltw1du8Ot/Y7GXf+QsZN/y2jWfPi64KCa7RUj8YRAEojkYL7nCXNJqhIAZDe33lGRbbkaxpyWrY6BPrr+I8F2noiR1tP5Khda3/dHheiYa1DtaTzCJm2pTE/lN+fkhQ1XJZhKmH+W7IO7ZMx9FYZUTGSPHuoRuNXXVtyc+IUqWO07F3JsndtlXYlu3fj8DauJErijCcAtYNECu4rOF+R8qciBTR1F3f6K/n8ju4hMiStOnhWx38s0D++PaX3/JqpY3gP7QvoIEllkqmSBhUJqaskZ6Hs9atkr18ldY6VOsdIX3xS/s1pUHFZcmeZnvXWjIqbllSjotbkLNUDcKlIpOA2m6V9AFRxu/SSX0ten3NXV605lKWP92Xo+I+F2hfQQYZtKbHLLUprFqz/3b9Y75ckUSkr9PNbr5UROFz2F5/ITt4gpR4o/q8KVuJsmb0H8ODbCLi1PNOdtuSWJZmmFNNDxpXXSD16yX5zWo1bk7NUD8ClIJGC+0ikAKjydukln1u2rZZ+ProtLkS3dgtW8vEcfbQ3Q1tPnpMkfdZugD5r218yDCWc+FIJP73WVVkyYq+U/eODspa+V/ZQ1IrQoKJRcGd5pp15RtbmdW7dz/jlQzIHj7hwf1qTA/ASEim47/weKYM9UkCTNrZn5W1hL06uTMNQv/YB6tc+QIcd+fpo7xmtPHhWMoprADt63qzeHSLUo9Q1RusgGd2ull1dIqXiB/CLqwk0p2g4qtvzpJ7XFrclP37Y7XsaEW3Kfs5+JwBeQiIF91GRAnAJOgU3U3grf0mGTEOybGlXWq6mrDqsvu1a6d5eEYoOLW4IYASHyp1DDu2Fs2UdPyxj4I0y2nSgOUU9qNXW5Nu/Kf7VMKSoGOnkUSkvt/LxlSzTY78TAG8gkYL7Sg4s5hwpADVw8d6qd747pQ/3ZsqQ9N3xHH13PEeDo1rrnp4Rahd7pRQSVvXeF8OQsrNkf7JI9ieLpCvaSaeOlx9Hc4pa41Fr8u82udWaXLcnyBx+u4yAwGoP161qmR77nQDUNxIpuI+KFIAaqqhBxQN9r1Arfx/N356uqKBm+uFsvtb/8KM2Hv5Rw6OD1Hzoo2qVvLbSlul238EaG5kna+PnxYeuVpRElVJVcwqWA1avumV6xgO/kdGihezd22Tv2VZcXXKD0aa9jIDA4o9ZpgegESGRgvuoSAGoIXcaVPymY1v9e1uavjmWo1UHz8o0msvqcovyWgXpvt0fuK5JivuZEtv+l+7pEC4jPlw+fQfJ+m5jcfe2qmSmy974uTTwRleStGB7mowTRzT6s9fLVVneH/6I7LYdq9wTdjlwJ4l0Z5me/c6rFy3HNCQ3Fmhe3JqcZXoAGgsSKbiPihSAGnK3QcWzQztqT9o5vbc1TTtPF++VWRp5nQ5E99e4kExtcgZr4Qmf8kmZs1CJ7hz6++7rshfOlrp0k9G1u4z8NlpQ2F52YG+NySx1vlVgbyWmt9RYHZEqiL2hVrA8jcvtpXrutCaXpOAwGb0HyOjRS3bsVbL/+GiNWpOzTA9AY0AiBfed79onuvYBqEM9Ilpq6k2dtO3kOf1ra5q+z8jTrmxTj2WHSZKCmvvoWFaBFu86o87BzRQV0kyhQaEyz59TJVVy6G/KiuKKel6utKd4+dloSfb5r5dcV3r86G3bZI94u0wyUtOGFjVJvjy5xtO4ql2q99/3SH7+sg/tl/btqDLOEsao+2UOGFL8sWhNDuDyZti27U5jpMteWlqaCkuWrqFC1pyZsr/6QsboB2TefKe3wwHQBNi2ra+OZGv6l8eqXCQW4G+qU0aqCotsHQiK0k3Hv9LPU1dracehWt5xsIad+EYD8o4oN2G8cs9k6tzp0zp34oRyHQ7l+jTTgdYddazVFTJtq7hylbLiQjI26CaZ11wvdewiO2V/lUsIK2poUdHyQUnVLh+8ODEquabCxg7VNWm4KC7bKpI15UH3qkweMB9/UcZF53pV/PtgzxOAhsnPz08REe4t6aYiBbfZBSztA1C/DMPQ4bP5siX5moaclq0hnQPVMchfPzjylerI17GsAmUXWNod0Ml13ep212l1u+tcn69pe63W6Frp67Tzr4RKrUKlVmXfzzJMybaVEtBOO4K76mrHQRkbVsvasLokoCrjraihhXHiiBakt/Ro+WB11aLSiZE7+5esd2dJR1JkZJ2VfTZDOnnMvSQq9koZ8ddKnWNkv/Oq5MiofCytyQE0MSRScF/JHil/EikA9ePibn+lP398cHtJUkGRpaNnC5TqyNcP+w4p9YeT2hrQuTjpsW2FF/6olq1bqkXrALXw81ELX1Mt/Uy1yM5Q881r1LIoX7uDuujb8Ctl2JZsw9TXEfH6OiJenbJP6KfWYd1wequaHzskVbeIIzNd1lsvy+h2pYywSNmh4Rq9+q+yg65xe/mgbRVp/prdMqOGV77f67OdSsjJlpGdJTv1++qTonPZ0scL3TqbqzRjyK2upXr22P+hNTkAlEIiBfexRwpAPaqoZXrJr/O3p7s+9/cxFR3avPgw3+hrlLj9tLbuyJCvbDkNQyP6dlZCz8hy97etSFmrXlZSYG99G36laznf2zH/rU86DJKP5dThgLZ6U231r/DrdVOfLDl3b1HrwnNVN7RIXiU7eYNsSYWGj462ilRY/lnFZB1WYpdbtLDzzbINQz0chxRUmKNkI1SRL09VhI+lZlaBlJ0l069b9fu95s3yLDGKi5cRe5UUFCLlZMle+u9qLyndUY/W5ABQFokU3He+ImWwtA9APXCnZfrFFu5I14IdGeUqWIZhlruPYfro/eGPKDG9ZZk9UeO+/1BBhdlK7HKL+rQq0HGjlU5mF+rDggCp/SDJMHWyeage2fe+q8JSkuCMOPaVVlz3Cx0yg3TIbqUf/ELkNMt+q7XPLw/cExytPcHRZb4WVPCjIgMyFZGXqe6OQ0rscotOtAjX2NSV+uKKPq4kaswPn0kdOsvoGC3bWSB9s77aP0/zZwmu/Uu2VSR77aced9RjmR4AXEAiBfe5zpEikQJQ99xtmV7C3QpWaXbbjhqrIxq9bWuZ18dkbZMR/l+y23bUs1eHK/l4jj7el6GtJ89Jkr5oe62Sw3roJ8c36ZuwK5XSur0M29Kq9tfpYgGF5xSdfUwFhq/2BneRj1WkItNH3c7+oKDCbJ1uHqLTAVcoVz46699aZ/1b60Dghf1ea9v01borrpF9URMMM2GcjLj44j1S3+/xKCkyTB+ZNeyoxzI9AChGIgX3uc6RYmkfgIanJhWssT0jpJ4RskfMLldlSSiVRFzbIUDXdgjQkU1fafmXu7SqzQBl+QcoqfMI1xjbMBXkY6lrZGtFhzZX19Bmig72V/jUiXo/sHeZalLpJXpPH1su46V/6JzT0OmcQp36MV+nFr6n07a/0pqHaHPYVbINU76W88Iyv1KJUU2TIpbqAcClof35ebQ/r17RM/8jpZ2UOWWGjK7dvR0OAHiFnbxR2Unv6r6rJskyfWTalp5KXaKYETcqrP91Mi7q7Je4IlkLLlo+KF1YDjg2/JwSbulT7j2sN6a5xvhaTjlNX9c9KmqzXtM24w31cGEA8Aban6NuuJb2UZEC0HQZfQZquW+MLFdDC1Opd4zTdRU0tJDcWz5Y0Xu8P+r5Mvu3SpIq49r/UkKfPhVeU5P9SyzVA4CaIZGC+5ycIwUAnjS0kNxfPljuPdJbamx8qH7e70bZjt5KCA6VkR+qBTskY0d6he9FUgQA9YdECu4rpP05gKatJg0tSniS5JTd7xXpuiZBkmGYFe73AgDULxIpuK+QihSApq0mDS1qwtOOhQCA+kciBbfYTqdkWcWfkEgBaKJIcAAAJUxvB4BGomR/lCT5k0gBAACgaSORgntKt4ZnjxQAAACaOBIpuKdkf5SvX7kzUgAAAICmhkQK7nGdIcWyPgAAAIBECu5xdexjWR8AAABAIgX3UJECAAAAXEik4B4qUgAAAIALiRTcU9L+3JeKFAAAAEAiBfe4lvZRkQIAAABIpOAe19I+KlIAAAAAiRTcYlORAgAAAFxIpOCewvziX/2aeTcOAAAAoAEgkYJ7zlekDCpSAAAAAIkU3MQeKQAAAMCFRAruYY8UAAAA4EIiBfdQkQIAAABcSKTgHipSAAAAgAuJFNzjPF+R8qUiBQAAAJBIwT0s7QMAAABcSKTgHpb2AQAAAC6+3g4AF9hWkXRgt2xHhozgUCn2Shmmj7fDkiTZVKQAAAAAFxKpBsJO3igr8W0p80zx55IUEiYzYZyMPgO9GpskKlIAAABAKSztawDs5I2y3pjmSqJcMs/IemOa7OSN3gmsNCpSAAAAgAuJlJfZVlFxJaoKVuLs4mV/3nQ+kTJIpAAAAAASKa87sLt8JepimenF47yJihQAAADgQiLlZbYjo1bH1Rn2SAEAAAAuJFJeZgSH1uq4OkNFCgAAAHBpkF37Pv30U3300UdyOByKiorSAw88oJiYmArHrl69WuvWrdORI0ckSdHR0Ro7dmyl4xuc2CulkLCql/eZPrKbtZBRf1GV56QiBQAAAJRocBWpjRs3at68eRo1apSmT5+uqKgovfjiizp79myF43fv3q1Bgwbp97//vaZOnaqwsDBNnTpVGRleXgrnJsP0kZkwrupBVpHs6U/KWrlUtmXVT2AXK6lI+VKRAgAAABpcIvXxxx9r+PDhGjZsmDp06KBx48bJ399fa9asqXD8pEmTdMstt6hz585q3769JkyYINu2tWPHjnqOvOaMPgNlTpxSXJkqLSRcxv2TpF79JadT9vvvyHrt97Id58+asopk79sh6+u1svftqNvOfq49UiRSAAAAQINa2ud0OnXo0CHdeeedrtdM01R8fLz279/v1j3y8/PldDoVEBBQ4dcLCwtVWJIUSDIMQy1atLikuGuD0WegzN4DpAO7ZTsyivdExV4pw/SRPXC47HUrZCfNlvZsk/X8JBmDR8jevLZeDvC1bbvUHimW9gEAAAANKpHKysqSZVkKDg4u83pwcLCOHz/u1j3+/e9/KzQ0VPHx8RV+fcmSJVq0aJHr8y5dumj69Ok1jrk2GaaPFBdfbi+UYRgyhvxEdrerZc1+WTp8SPaKD8rf4PwBvubEKbWbTDmdFz6mIgUAAAA0rETqUi1dulQbNmzQ888/L3//ih/477rrLt1+++2uzw3Dqy0cPGK07SDjqWmyJ/9Kys+tdJyVOFtm7wHFiVltKKlGSVSkAAAAADWwRCowMFCmacrhcJR53eFwlKtSXWzZsmVaunSpfve73ykqKqrScX5+fvJrxMmAkXJAdhVJlKQLB/jGVVyV85jzfCJlGJJPg/orAwAAAHhFg2o24evrq+joaO3cudP1mmVZ2rlzp7p161bpdR9++KEWL16sZ555Rl27dq2PUL3GKwf4Flw4Q6oxVfAAAACAutKgEilJuv322/XZZ5/piy++0NGjRzV79mzl5+dr6NChkqRZs2Zp/vz5rvFLly7VwoULNXHiREVGRsrhcMjhcCgvL89Lv4O65ZUDfOnYBwAAAJTR4NZpDRw4UFlZWUpKSpLD4VDnzp31zDPPuJb2paenl6mKrFq1Sk6nUzNnzixzn1GjRmnMmDH1GXr9cOcAX/9msrt0q70DfOnYBwAAAJRh2LZtezuIhiAtLa1MW/SGzE7eKOuNaVUPuuoamROmyGh+6a3d7YN7ZU17UopoI58//eOS7wcAAAA0RH5+foqIiHBrbINb2ofqVXmA762jJH9/adcWWS//VnaW49Lf0Hk+wfSlIgUAAABIDXBpH9xT5QG+vQfIev0P0g/fy5r+lMzHXpAR0abmb1Z4odkEAAAAACpSjZph+siIi5c5YIiMuHjXuVFGdJzMp2ZIYZHS6ROyXnpC9g/fS5Jsq0j2vh2yvl4re98O2VZR9W/kajZBRQoAAACQqEhdtow27WVOmSHrry9IR1Jk/fm3MkbcIXvDalejCluSQsJkJoyT0WdgpfeyqUgBAAAAZVCRuowZwaEyn3hJ6t5Tys+V/fHC8t3+Ms/IemOa7OSNld+I9ucAAABAGSRSlzmjRUsZDz9bbRJkJc6ufJkf7c8BAACAMkikmgAj9cCFZKgymenSgd0Vf81ZfK3hS0UKAAAAkEikmgTbkXFp4wrOJ2H+JFIAAACARCLVJBjBoZc2jq59AAAAQBkkUk1B7JXlD++9WOug4nEVoWsfAAAAUAaJVBNgmD4yE8ZVPSgnW/a3Gyr+mvN8RYo9UgAAAIAkEqkmw+gzUObEKeUrU8FhUlSMZBXJfvtlWcsWyLbtsmPo2gcAAACUwYG8TYjRZ6DM3gOkA7tlOzKK90SdX85nL54ne+US2R8tkE4dk+6fJKNkKR9L+wAAAIAySKSaGMP0keLiZVz8+uj/J6tNe9n/fkP25nWy00/JfOgZKSBQ9pk0SZKdkSbbKiq+BwAAANCEGXa5dVxNU1pamgpLutM1YfaebbLenCady5ECAiXTlLIcFwaEhMlMGCejz0CvxQgAAADUBT8/P0VERLg1lj1SKMPo0Uvm0y9LgSFSdlbZJEqSMs/IemOa7OSNXokPAAAAaAhIpFBeZBvJvHjxX1lW4mzZVlE9BQQAAAA0LCRSKO/AbsmRUfWYzPTicQAAAEATRCKFcuzqkigPxwEAAACXGxIplGMEh9bqOAAAAOByQyKF8mKvLH9w78VCwl1nUAEAAABNDYkUyjFMH5kJ46ocYyY8yHlSAAAAaLJIpFAho89AmROnlK9MhYTLnDiFc6QAAADQpHEg73kcyFsx2yqSDuyW7cgo3hMVeyWVKAAAAFyWPDmQ17eOY0EjZ5g+Uly8qj5VCgAAAGhaWNoHAAAAAB4ikQIAAAAAD5FIAQAAAICHSKQAAAAAwEMkUgAAAADgIRIpAAAAAPAQiRQAAAAAeIhECgAAAAA8RCIFAAAAAB4ikQIAAAAAD5FIAQAAAICHSKQAAAAAwEMkUgAAAADgIV9vB9BQ+PryRwEAAAA0ZZ7kBIZt23YdxgIAAAAAlx2W9tWB3NxcPfXUU8rNzfV2KKgEc9Q4ME+NA/PUODBPDR9z1DgwT41DfcwTiVQdsG1bKSkpotjXcDFHjQPz1DgwT40D89TwMUeNA/PUONTHPJFIAQAAAICHSKQAAAAAwEMkUnXAz89Po0aNkp+fn7dDQSWYo8aBeWocmKfGgXlq+JijxoF5ahzqY57o2gcAAAAAHqIiBQAAAAAeIpECAAAAAA+RSAEAAACAh0ikAAAAAMBDvt4OoLH69NNP9dFHH8nhcCgqKkoPPPCAYmJiqr1uw4YN+stf/qJ+/frpySefrIdImy5P5ygnJ0cLFizQ5s2blZ2drYiICP3qV79Snz596jHqpsfTeVq+fLlWrlyp9PR0BQYGasCAAbrnnnvk7+9fj1E3Hbt379ayZcuUkpKizMxMPf744+rfv3+V1+zatUvz5s3TkSNHFBYWppEjR2ro0KH1E3AT5ek8ff3111q5cqVSU1PldDrVoUMHjR49Wr17966/oJugmvx7KrF37149//zz6tixo/785z/XcaRNW03mqbCwUIsWLdKXX34ph8OhkJAQjRw5UjfeeGM9Rd201GSOvvzySy1btkwnTpxQy5Yt1bt3b/3yl79U69ataxwHFaka2Lhxo+bNm6dRo0Zp+vTpioqK0osvvqizZ89Wed3p06f1r3/9Sz169KinSJsuT+fI6XRq6tSpSktL0+TJk/Xaa69p/PjxCg0NrefImxZP52n9+vWaP3++Ro8erVdffVUTJkzQpk2btGDBgnqOvOnIz89X586d9etf/9qt8adPn9a0adN01VVXacaMGbrtttv05ptvauvWrXUbaBPn6Tzt2bNHPXv21NNPP+2ar+nTpyslJaWOI23aPJ2nEjk5Ofrb3/6m+Pj4OooMpdVknl599VXt3LlTEyZM0GuvvaZHH31U7dq1q8MomzZP52jv3r2aNWuWhg0bppkzZ2ry5Mk6ePCg3nrrrUuKg4pUDXz88ccaPny4hg0bJkkaN26ckpOTtWbNGt15550VXmNZll5//XWNGTNGe/bsUU5OTj1G3PR4Okeff/65srOz9cc//lG+vsX/LCIjI+sz5CbJ03nat2+f4uLiNHjwYEnFczRo0CAdOHCgPsNuUq655hpdc801bo9fuXKlIiMjdd9990mSOnTooL1792r58uVUO+qQp/N0//33l/n8nnvu0bfffqvvvvtOXbp0qeXoUMLTeSrx9ttva9CgQTJNU998800dRIbSPJ2nrVu3avfu3Zo1a5YCAgIk8QxR1zydo/379ysyMlI//elPJRXPz0033aQPP/zwkuKgIuUhp9OpQ4cOlfmpkGmaio+P1/79+yu9btGiRQoMDKTEWw9qMkffffedYmNjNWfOHI0bN07/93//pw8++ECWZdVX2E1OTeYpLi5Ohw4d0vfffy9JOnXqlLZs2VKjBxPUjQMHDpT7qXmvXr2q/P8jvM+yLOXm5roeAtFwrFmzRqdOndLo0aO9HQoq8e2336pr16768MMPNX78eD366KOaN2+eCgoKvB0azuvWrZvS09OVnJws27blcDj01VdfXfLzAxUpD2VlZcmyLAUHB5d5PTg4WMePH6/wmr179+rzzz/XjBkz6iFC1GSOTp06pbS0NA0ePFhPP/20Tp48qdmzZ6uoqIhvXnWkJvM0ePBgZWVl6Xe/+50kqaioSCNGjNDdd99d1+HCTQ6HQ0FBQWVeCwoKUm5urgoKCtjL1kB99NFHysvL0/XXX+/tUFDKiRMnNH/+fL3wwgvy8fHxdjioxKlTp7R37175+fnpiSeeUFZWlubMmaPs7Gz97//+r7fDg6Tu3btr0qRJeu2111RYWKiioiL17dvX42W2FyORqmO5ubl6/fXXNX78eAUGBno7HFTCtm0FBgZq/PjxMk1T0dHRysjI0LJly0ikGpBdu3ZpyZIlevDBBxUbG6uTJ09q7ty5WrRokUaNGuXt8IBGaf369Vq0aJGeeOKJckkwvMeyLP31r3/V6NGj2WvTwNm2LUmaNGmSWrZsKam4+cTMmTP14IMP8gOkBuDo0aP65z//qVGjRqlXr17KzMzUe++9p7ffflsTJ06s8X1JpDwUGBgo0zTlcDjKvO5wOMr9ZF26UOmYPn2667WSf3AJCQl67bXX1KZNm7oMucnxdI6k4iqIr6+vTPPCatf27dvL4XDI6XS69k2h9tRknhYuXKgbbrhBw4cPlyR16tRJeXl5+sc//qG77767zPzBO4KDg8s1Czl79qxatGjBw0QDtGHDBr355puaPHmyevbs6e1wUEpubq4OHjyolJQUvfPOO5KKnx9s21ZCQoKeffZZXX311V6OElLx//dCQ0NdSZRU/Axh27bOnDmjtm3bejE6SNKSJUsUFxenO+64Q5IUFRWl5s2b67nnnlNCQoJCQkJqdF+eDj3k6+ur6Oho7dy509Vm0bIs7dy5Uz/5yU/KjW/Xrp1efvnlMq8lJiYqLy9P999/v8LDw+sl7qbE0zmSivfebNiwQZZluR7GT5w4oZCQEJKoOlKTecrPz5dhGGVeI3lqWGJjY7Vly5Yyr23fvl3dunXzUkSozPr16/XGG2/oscce45iHBqhFixblnh9WrlypnTt3avLkyTQzaEC6d++ur776Snl5eWrevLmk4mcIwzAUFhbm5eggFT8/XLw8tuT5oaTAURM8gdTA7bffrs8++0xffPGFjh49qtmzZys/P991TsqsWbM0f/58SZK/v786depU5r9WrVqpefPm6tSpEw/pdcSTOZKkm2++WdnZ2frnP/+p48ePKzk5WUuWLNEtt9zipd9B0+DpPPXt21erVq3Shg0bdPr0aW3fvl0LFy5U3759SajqSF5enlJTU5WamiqpuL15amqq0tPTJUnz58/XrFmzXONvvvlmnT59Wu+9956OHTumFStWaNOmTbrtttu8EX6T4ek8rV+/Xn/729903333KTY2Vg6HQw6HQ+fOnfNG+E2GJ/Nkmma554fAwED5+fmpU6dOrgd21D5P/z0NHjxYrVu31t///ncdPXpUu3fv1nvvvadhw4ZRia8jns5Rv379tHnzZq1cudK1p23u3LmKiYm5pKNueIqvgYEDByorK0tJSUlyOBzq3LmznnnmGddypPT09HI/NUf98nSOwsPD9dvf/lbvvvuunnjiCYWGhurWW2+ttJ09aoen8zRy5EgZhqHExERlZGQoMDBQffv21dixY730O7j8HTx4UC+88ILr83nz5kmShgwZooceekiZmZmub1xScUvZKVOm6N1339V//vMfhYWFacKECbQ+r2OeztPq1atVVFSkOXPmaM6cOa7XS8ajbng6T/AOT+epefPmevbZZ/XOO+9oypQpat26ta6//nolJCTUe+xNhadzNHToUOXm5urTTz/VvHnz1KpVK1111VW69957LykOw76UehYAAAAANEGshQEAAAAAD5FIAQAAAICHSKQAAAAAwEMkUgAAAADgIRIpAAAAAPAQiRQAAAAAeIhECgAAAAA8RCIFAAAAAB4ikQIANDpJSUkaM2ZMmdfGjBmjOXPmeCki91QUNwCgcfL1dgAAgMvT4cOH9f777+vgwYM6e/asAgIC1KFDB/Xr10+33nqra9wHH3ygDh06qH///l6Mtnq7du3SCy+84Prcx8dHYWFh6t69u0aPHq0rrrjCi9EBAOobiRQAoNbt27dPL7zwgsLDwzV8+HAFBwfrzJkzOnDggP7zn/+USaSWLFmi6667zqNEauTIkbrzzjvrIPLq3XrrreratauKioqUkpKi1atXKzk5WS+//LJCQ0OrvNabcQMAaheJFACg1n3wwQdq2bKlXnrpJbVq1arM186ePVvj++bl5al58+by8fGRj4/PpYZZIz169NB1110nSRo2bJjatm2ruXPnau3atbrrrrsqvKYhxA0AqF0kUgCAWnfq1Cl17NixXBIlSUFBQa6PS/YLrV27VmvXrpUkDRkyRA899JCSkpK0aNEizZw5U4sXL9bWrVsVERGhGTNmuL6WlJRUZRyLFy9WUlKS7r//flcVbMuWLVqyZIlSUlJkGIZ69Oihe++9Vx07dqzR7/Xqq6+WJJ0+fVqSahT3unXr9Mknn+jIkSPy8/NTp06ddPfdd6tXr16uMbUdNwDg0tBsAgBQ6yIiInTo0CEdPny4ynEPP/yw/Pz81KNHDz388MN6+OGHNWLEiDJjZs6cqfz8fI0dO1bDhw93O4bExEQlJSVp3LhxriRq3bp1mjZtmpo3b65f/OIXGjlypI4eParnnnvOlQh56tSpU5Kk1q1b1yju999/X7NmzZKvr6/GjBmj0aNHKywsTDt37nSNqYu4AQCXhooUAKDW/exnP9Of/vQnPfnkk4qJiVH37t0VHx+vq666Sr6+F7713HDDDXr77bcVGRmpG264ocJ7RUVF6dFHH/Xo/efNm6fly5dr4sSJGjp0qKTi5XVz587VjTfeqPHjx7vGDhkyRI899piWLFlS5vXK5ObmKisry7VHau7cuTIMQwMGDPA47pMnT2rRokXq37+/Jk+eLNO88PNN27ZrNW4AQO0ikQIA1LqePXtq6tSpWrp0qbZt26b9+/dr2bJlCgwM1IQJE9SvXz+373Vxhaoqtm1rzpw5Wr16tR555BENHjzY9bXt27crJydHgwYNUlZWlut10zQVGxurXbt2ufUeb7zxRpnPAwMD9dBDD6lr164ex71582bZtq1Ro0aVSaIkyTCMWo0bAFC7SKQAAHUiJiZGjz/+uJxOp1JTU7V582YtX75cr7zyiv785z+rQ4cObt0nMjLS7fdct26d8vLy9OCDD5ZJoiTpxIkTkqQ//OEPFV7bokULt95j1KhR6t69u0zTVGBgoNq3b19hAwl34j516pQMw6jyz6K24gYA1C4SKQBAnfL19VVMTIxiYmLUrl07/f3vf9emTZs0evRot6739/d3+73i4uKUmpqqFStWaODAgQoICHB9rWSp3MMPP6zg4OBy17rbTa9Tp07q2bNnteM8ibsqtRU3AKB2kUgBAOpNdHS0JCkzM9P1WskSttrQpk0b3XvvvXr++ef14osv6rnnnnNVbEoOzA0KCnIrEaoPV1xxhWzb1tGjR9W5c+dKx0gNK24AAF37AAB1YOfOna5KSmlbtmyRJLVr1871WrNmzZSTk1Nr7x0VFaWnn35ax44d0/Tp01VQUCBJ6tWrl1q0aKElS5bI6XSWu670/qP60r9/fxmGoUWLFsmyrDJfK/nza4hxAwCoSAEA6sDcuXOVn5+v/v37q127dnI6ndq/f782btyoiIgIDRs2zDU2OjpaO3bs0Mcff6yQkBBFRkYqNjb2kt6/W7duevLJJ/XSSy/plVde0RNPPKGWLVtq3Lhxev311/XUU09p0KBBCgwMVHp6upKTkxUXF6df//rXl/pb90ibNm109913a/Hixfr973+v/v37y8/PT99//71CQ0N1zz33NMi4AQAkUgCAOvDLX/5SmzZt0pYtW7R69Wo5nU6Fh4fr5ptv1siRI8sc1PurX/1Kb731lhITE1VQUKAhQ4ZcciIlFR+U+5vf/EavvPKKZs2apUmTJmnw4MEKCQnR0qVLtWzZMhUWFio0NFQ9evQok9zVp5///OeKjIzUp59+qsTERPn7+ysqKqpMO/iGGDcANHWGXdHaCwAAAABApdgjBQAAAAAeIpECAAAAAA+RSAEAAACAh0ikAAAAAMBDJFIAAAAA4CESKQAAAADwEIkUAAAAAHiIRAoAAAAAPEQiBQAAAAAeIpECAAAAAA+RSAEAAACAh0ikAAAAAMBD/x9k1Jl/ofoYDgAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import matplotlib.pyplot as plt\n", - "\n", - "\n", - "\n", - "exp = '2025-10-17'\n", - "# Specify the expiration and right\n", - "specific_expiration = exp # Change this to your desired expiration\n", - "specific_right = 'P' # Change this to 'C' for call or 'P' for put\n", - "\n", - "# Filter the t DataFrame\n", - "filtered_chain = european_converted_chain[\n", - " (european_converted_chain['expiration'] == exp) \n", - "]\n", - "\n", - "filtered_chain = filtered_chain.pivot_table(\n", - " columns = 'right',\n", - " index = 'moneyness',\n", - " values = 'european_vols_equiv'\n", - ")\n", - "\n", - "\n", - "# # Sort by strike\n", - "# filtered_chain = filtered_chain.sort_values(by='moneyness')\n", - "\n", - "# Plotting\n", - "plt.figure(figsize=(10, 6))\n", - "plt.plot(filtered_chain.index, filtered_chain['C'], label='C', marker='o')\n", - "plt.plot(filtered_chain.index, filtered_chain['P'], label='P', marker='x')\n", - "plt.title(f'Volatility Comparison for {specific_right} Options Expiring on {specific_expiration}')\n", - "plt.xlabel('Strike Price')\n", - "plt.ylabel('Volatility')\n", - "plt.legend()\n", - "plt.grid()\n", - "plt.show()\n" - ] - }, - { - "cell_type": "code", - "execution_count": 557, - "metadata": {}, - "outputs": [], - "source": [ - "# Filter the european_converted_chain DataFrame\n", - "filtered_chain = european_converted_chain[\n", - " (european_converted_chain['expiration'] == specific_expiration)]\n", - "filtered_chain.to_csv(\"filtered_chain.csv\", index=False)" - ] - }, - { - "cell_type": "code", - "execution_count": 551, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1sAAAIoCAYAAACf/fHeAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAyCBJREFUeJzs3Xd8FNX6x/HPbHoI6YFQUyB0QlGKoUsTBBSUqogF7HqxY0X9YcGKil69l3tVVCCAohelCdJBEBEBAQHpnSQkQELqnt8fMSsxCSSQZFO+79crL8jMmZlnZje7++w58xzLGGMQERERERGRYmVzdgAiIiIiIiIVkZItERERERGREqBkS0REREREpAQo2RIRERERESkBSrZERERERERKgJItERERERGREqBkS0REREREpAQo2RIRERERESkBSrZERERERERKgJItqZS6du2KZVklfhzLsujatWuuZc8//zyWZbFs2bKLtpXyobw/dhs2bKBnz54EBwdjWRYtW7Z0dkgVUnh4OOHh4c4Oo8L45JNPsCyLTz75pEjbFfQaLCJSEpRsSZly0003YVkWH3zwwUXb9urVC8uymDNnTilElr+S/vDkjA8F33//PTfddBMRERF4e3vj5eVF/fr1GTlyJPPnzy+1OKR0nD59mmuvvZb169czbNgwxo8fz9133+20eNLT0/nPf/7DtddeS40aNfDw8KBq1aq0bNmSsWPHsnnz5iLvc/HixQwdOpS6devi6emJv78/bdq04YUXXuDUqVPFFntpfYnjDDmvRRf6Kc9fOFRmxhgWLFjAAw88QMuWLQkICMDT05OGDRsyduxYjh8/XuC2CQkJjB07lvDwcDw8PKhZsya33347hw4dytM2Pj6eKVOmMHDgQOrXr4+Xlxd+fn507NiR//znP9jt9gKPk5WVxZQpU+jcuTMBAQF4eXkRGRnJ0KFD2blzZ5HPec2aNfTt25fAwEC8vLyIjo5m0qRJZGVl5Wm7ZcsWRo8eTatWrQgJCcHDw4M6derQo0cPvvrqK4wxRTr2pk2beP755+nQoQM1atTA3d2dWrVqMXz4cDZu3HjBa/D2228THR2Nl5cXgYGB9O3blzVr1hT5/KV0uTo7AJHzjRkzhmnTpjFlyhTuvffeAtvt27ePxYsXU6NGDfr371+KERbN9u3b8fb2Lva2JeHMmTPccsstfP3113h6enL11VczaNAg3Nzc2Lt3L/PmzePzzz/nkUce4Y033nBanGWRsx+7y7F+/XpOnDjBSy+9xFNPPeXUWHbu3Mn111/P9u3bCQ4OpmfPntStW5f09HS2bdvGhx9+yLvvvsvXX3/NgAEDLrq/tLQ0Ro8ezeeff46Xlxd9+vShQYMGnD17lh9++IHnn3+eyZMn8+WXX9K5c+cSP78lS5aU+DFKWpcuXQpMqkq7127gwIG0b9+eGjVqFGm7+++/n2HDhlG3bt0Siqx8SUtLo0+fPri7u9O5c2d69OhBVlYWP/zwA++88w4zZsxg5cqVREVF5douPj6emJgYdu7cydVXX82wYcPYsWMHH3/8Md999x1r164lMjLS0X7WrFncc8891KhRg27dulG3bl2OHz/OV199xejRo5k/fz6zZs3K84XF2bNnue666/jhhx9o2bIlo0aNwtPTk8OHD7Ny5Up27txJgwYNCn2+33zzDTfccAOenp4MHTqUwMBA5s6dy0MPPcTq1auZNWtWrvY///wzX3/9Ne3btycmJgY/Pz+OHTvG3LlzueGGGxg5ciRTp04t9PHvvvtu1q1bxxVXXMGgQYPw8fFh06ZNzJgxg9mzZxMbG8ugQYNybWOMYdiwYcyePZuGDRty//33k5CQQGxsLJ07d+bLL7/kuuuuK3QMUsqMSBnToEEDA5iff/65wDbPPPOMAcxTTz11Scfo0qWLKY6nf1hYmAkLCyvSNuPHjzeAWbp0abG2vRxZWVmmd+/eBjDdunUzhw8fztMmNTXVTJo0ydx7770lGouUrk8//dQA5uOPP3ZqHMeOHTO1a9c2gBk7dqxJSUnJ0+b48ePm3nvvNZ988kmh9nnbbbcZwLRu3docOHAg1zq73W7ee+89Y7PZjI+Pj9m2bdtln0Nxva6URTmvRePHj3d2KFLM0tPTzYQJE0xCQkKu5VlZWeauu+4ygOnXr1+e7e68804DmIcffjjX8nfeeccApnfv3rmWL1myxPzvf/8zWVlZuZYfPXrU1KlTxwBm9uzZeY4zYsQIA5gPP/ywwPgLKykpyYSEhBh3d3fz008/OZafO3fOXHXVVQYw06dPz7VNampqgftq3LixAcy6desKHcO7775rdu3alWf5559/bgATFBRk0tLScq2bNm2aAUxMTIw5d+6cY/n69euNu7u7CQkJMadPny50DFK6Kua7gpRrr7/+ugHM3Xffne/6zMxMU6tWLWNZltmzZ49j+eLFi03v3r1NQECAcXd3N1FRUeaJJ54wiYmJefaR34eitLQ0895775k+ffqYunXrGnd3dxMQEGC6d+9u5s2bl6vt0qVLDZDvz6hRoxztANOlS5dc2xaUQP29bVhYWIHHMMaYYcOGGcAsW7Ys3+s0e/ZsA5j77rsv3/Xny3mRr1+/vjl79uwF2/79jSc1NdW88sorplmzZsbLy8tUrVrVdOzY0cTGxubZdu/evY5rtHv3bnPDDTeYwMBA4+PjY3r27Gm2bNlijDHmxIkTZsyYMSY0NNR4eHiYK6+80vzwww959nf+tfzkk09My5YtjaenpwkJCTG33XabOXr0aJ5tNmzYYB588EETHR1tAgICjIeHh6lfv755+OGH83zYMMaYjz/+2JGMzJ8/33Tp0sX4+vrmev7k9zifPn3avPjii6Zp06amatWqxsfHx0RGRpohQ4aYDRs25DlObGys6dSpk/H19TWenp6mWbNm5uWXX873jT4nyT979qx59NFHTZ06dYy7u7upV6+eefXVV43dbs+zTUGPRX4/5ydeR44cMffee68JCwszbm5uJjg42AwcODDfcyjMtSrI6NGjDWCGDx9+0bYFffg538qVKw1gAgICzJEjRwps98QTTxjA9OjRI9fyojy3LnQt//43nd+XM5f6N7R3714zdOhQExQUZDw8PMwVV1xh5s6dm2ebtLQ0884775hWrVoZf39/4+XlZcLCwsyAAQPM999/f9Fref71KGyy9eCDDxrAPPTQQ3nWTZkyxXHNcz54n39e27dvN9ddd50JCAgw3t7epkOHDmbhwoV59nP+8+18Odc5KSnJPPTQQyYsLMy4uro6Yr/Ya/DJkycdrz/u7u6mSZMm5r///W++55mammrGjx9vIiIijLu7uwkPDzdPP/20SU1Nzfd14WJK+3XgYg4fPmwA4+Pjk2v5mTNnjJeXl6lSpUqeD/lZWVmO968//vijUMd56aWXDGDuv//+XMt//vlnA5ihQ4de3on86T//+Y8BzC233JJn3ZIlSwxgOnfuXOj9jR071gDm888/L5b4oqKiDJDn9bVTp04GyPd9cOTIkQYo8DkqzqdkS8qcEydOGHd3d+Pn52eSk5PzrJ87d64BTM+ePR3LPvzwQ2NZlvHx8TG33XabeeKJJ0y7du0MYJo0aWJOnTqVax/5JVtHjx41NpvNdOzY0dxxxx1m3LhxZtSoUSYwMNAA5t///rej7d69e8348eONn5+f8fPzM+PHj3f8zJkzx9HucpKtt99+2xHnqFGjch3DGGOWL19uADNixIh8r2PPnj0N4EhgLqRz584X/OawIGlpaY4YGzVqZB599FFz7733mmrVqhnAPPnkk7na53yg6tKliwkKCjIdO3Y0Dz/8sBk0aJCxLMsEBQWZnTt3msjISNOyZUvzj3/8w4wcOdK4ubkZDw8Ps3///lz7y7mWAwYMMJ6enmbUqFFm3LhxpmPHjgYwERER5sSJE7m2ueuuu0y1atXM4MGDzcMPP2zGjh3reCNr3Lhxng8OOR/orr32WuPi4mL69etnHn/88Vxv/n9/7Ox2u4mJiTGAueqqq8xDDz1kHnvsMTN8+HATGhpq3nvvvVzHePLJJw1ggoODzd13320effRR07RpU8d+//4tZ1hYmKlZs6bp0KGDiYiIMHfeeae59957Tc2aNQ1gnn/++Ys+dqdOnTLjx4831113nQHMdddd53h+/fLLL8YYY/bs2ePY59VXX23GjRtnbrrpJuPu7m7c3d3zfLAvzLXKT0pKivHw8DCA2bFjx0VjL4xbbrnFAObxxx+/YLuEhATHsc//8qYoz62ca5nzAfP8v9XzE4H8kq1L/Rvq2rWrCQkJMe3atTNjx441t9xyi/Hw8DA2my3PB7Lhw4cbwDRr1sw8+OCD5oknnjAjR440ERER5pFHHinU9SxqspWWlmZat25tLMsy3377rWP51q1bjbe3twkNDTXHjh3Lc16dO3c2/v7+plOnTo7XYE9PT2Oz2cyMGTNyHeNCyVaNGjXMFVdcYSIiIsyYMWPMI4884ugRvdBrcIsWLUyDBg1Ms2bNzP3332/GjBlj/P39DZCnR9Vut5trr73WACYqKso8/PDD5oEHHjC1atUy119/fZGTLWe8DlzMiRMnDGD8/f1zLf/+++8NYHr16pXvdjm9XlOmTCnUcV577TVHr/b5HnnkEQOYr7/+2iQmJprPPvvMvPzyy+ajjz7Kt3foYm666SYDmGnTpuVZl5GRYby9vY2rq2uhvtBJTk420dHRBjC//vprkWPJT5MmTQxgNm3a5Fh27tw54+LiYry9vU1GRkaebXJ6vW6++eZiiUGKn5ItKZOGDBmS75uoMcYMGDDAAGbWrFnGGGP27dtn3N3dTdWqVc327dtztb3nnnsMYMaMGZNreX7JVmpqqjl48GCe4yUmJpqmTZuagICAPEObLjaM8HKSrQu1zdG0aVPj4eFh4uLici3/448/jGVZJiYmpsDYcmRkZBh3d3cDFPnN6+WXXzaA6dOnT643gePHjzs+eK5evdqx/PwegAkTJuTa14svvujoibjrrrtyDTWZOnVqvm/EOdfHzc3NbNy4Mde6nG8cb7/99lzL9+3bZzIzM/OcS8637a+++mqu5Tkf6CzLMvPnz8/3Ovz9sdu8ebMBzPXXX5+nbVZWVq4etDVr1hjA1KlTJ1dvSUZGhunXr58BzEsvvZRrHznXtk+fPrmek8ePH3d8AVDYoTUFfWA1xphevXrl+1itXr3auLi4mMDAQHPmzJk8+7rQtcrPihUrDGBq1apV6G0uJjIy0gBm0aJFF22bkxh/9tlnjmWX8ty62DDC/F4vLudv6O8fphcsWODYV47ExERjWZa54oor8n3e//21oyA516NLly65ksnzf9auXZtrm127dpmqVaua4OBgc+jQIZOcnGyaNm1qbDabWbx4ca6255/Xo48+mmvdTz/9ZFxdXY2/v79JSkpyLL9QsgWY7t2759tTf6HXYMDccccdua7Vb7/9ZlxcXEzjxo1ztc95XerUqVOuROjUqVOmYcOGRUq2nP06UJBXX33VAGbYsGG5lk+ePDnfnqgcOSNULvZlhzHZ59isWTMDmAULFuRal/NF4DvvvGOCgoIcj1HO68y9996b7/O6IFdeeWW+PUc5cpLb/IYV79q1y4wfP94888wzZsyYMY6k9u9fiFyqtWvXOl4Hzz+nrVu3Or4syc9PP/1kANO2bdtiiUOKn5ItKZMWL15sANOhQ4dcy48cOWJcXV1NtWrVHG8iEyZMKPAFLyEhwVStWtV4enrm+qaqqPdWvPnmmwYwy5cvz7Xc2clWzhveG2+8kWv5uHHjDGA+/fTTC52WMSb7jTnnzev8seCFUb9+fWNZVp4k15i/kpfbbrvNsSznA1V4eHieN8j9+/cbwHh7e+fpXcrMzDSurq6ma9euuZbnXJ+/f+g1JvtDpp+fX57HviB2u934+vqabt265Vqe84Euv8QpR0HJVmGGxOUMn/voo4/yrPv999+NzWYzERERuZbnfMjKLznO6dEpTI+mMQV/YD148KABTN26dfP9wHbzzTfneY4V5lrlJzY21gCmXbt2RdruQry8vAyQ73Pz74YOHWoAM3HiRMeyS3luXUqydal/Q2FhYfl+yKxbt64JCgpy/J6UlGQg+16PyxlWlnM9LvTz9ttv59lu+vTpjh6rnHvonn766Tztcs7Lz88v33tPRo0alad36WLJ1vm9A/mdS36vwd7e3rkSuhw5H/rP/3Khe/fu+b4vGPPX0OzCJlvOfh3Iz/r16x3DWnfv3p1rXc6wv/weS2OM+de//mUAc+edd170ODm9V3379s2zrlGjRgYwLi4u5oYbbjDbt283Z86cMYsXLzb169c3ULT7CHOG6RX0xWLOFy9r1qzJs27+/Pm5nu/u7u7m9ddfL5bhmvHx8Y7YZs6cmWvd6tWr8/08lGPnzp0GMA0aNLjsOKRkqPS7lElXX3019erVY/Xq1Wzfvt2x/OOPPyYzM5Nbb70VNzc3AEep1KuvvjrPfgICAmjVqhWpqans2LHjosf97bffuPXWW4mMjMTLy8tR0viRRx4B4PDhw8VxesXmlltuwcfHh3/961+OZRkZGXzyyScEBAQwZMiQEjv2mTNn2L17NzVr1qRRo0Z51uc8Hr/88kuedS1btsTFxSXXspo1awLQoEEDqlatmmudi4sL1atXz7ecMGRXSPs7Pz8/WrZsSWpqaq7nUEZGBpMnT6Zjx44EBgbi4uKCZVnYbDZOnz5d4GPctm3bfJfnp0mTJrRs2ZLp06fToUMHXnvtNdasWUN6enqethd6/jZo0IDatWuzd+9ekpKS8pxf/fr182xTp04dgMsuaZ7zuHXq1Mnxt3a+Cz2+RblWZV1RnltFVdx/Q5D9+J//2Pv6+tK/f3/WrFlDy5YtefHFF1m6dCkpKSmXFPP48eMx2V/U5vkZO3ZsnvbDhg1j9OjRrFixgo8//piOHTvywgsvFLj/1q1b5/n7BxwVEPO7Fvnx9PQkOjq6UG3PFxUVha+vb57l+f1d/fLLL9hsNmJiYvK079ixY5GOW9ZeB3bu3En//v3JyMjg888/p169epe0n4t59913efPNN2nUqBGfffZZnvU55eAbNWpEbGwsjRo1wsfHh+7duzN79mxsNhtvvfWW47V12bJlPP/887l+ijoPW0GuueYajDGkp6eze/dunn76aZ566ikGDBiQ67X966+/zhPD119/XeB+k5OTue6669i1axePP/44gwcPLpZ4pexQ6XcpkyzLYvTo0Tz55JNMmTKFN998E2MM//nPf7AsizFjxjja5rz5FFT+N2d5YmLiBY/5448/cvXVV5OZmUn37t0ZMGAAvr6+2Gw2Nm3axDfffENaWlrxnGAxqVq1KjfffDMffvghS5cupVu3bvzvf//j2LFjjB07Fk9Pz4vuIzAwEHd3d9LT0zl8+HCh31Qv57r7+fnlWebq6lrgupz1GRkZ+a6rXr16vstDQ0NzxQowdOhQ5syZQ2RkJNdddx2hoaF4eHgAMGnSpAIf45x9FYaLiws//PADL774IrNnz+aJJ54Ash+vUaNG8corr+Dj45MrtgtdxwMHDpCYmJjr2vj7++fbPuc65jdfTFFczuNblGt1/r6K88uM0NBQ9u7dy8GDB/NNZM538OBB4K+E/3xFeW4V1eVc4ws9/n+fryg2NpaJEycybdo0xo8fD2QnIzfeeCNvvPFGgedYXG688UamTJkCwAMPPJBvkpijuK53tWrVLmnOs6L8XSUlJREYGOhYd76iXtOy9Dqwc+dOunXrRkJCAjNmzMh3moWcGAp6PHKWFxQfwOTJk/nHP/5BkyZNWLJkCYGBgXna5Gzfv3//PM+bFi1aEBERwR9//MH27dtp0aIFy5Yty5PMd+nShVtvvbXY4nZzc6NevXo899xzuLu78+STT/Luu+/y6KOPAtnJ1qeffpprm1GjRnH99dfn2VdycjLXXnstq1at4uGHH2bixIl52hRHzOJc6tmSMuu2227Dzc2NqVOnkp6ezg8//MCePXvo1q1brm/ycl6Ijh07lu9+jh49mqtdQSZMmMC5c+dYtGgR8+fPZ9KkSbz44os8//zztGvXrpjOqvjdc889AHz00Ue5/r3zzjsLtb2rqyvt27cHijYPUHFd9+JQ0KSbObHlxLBhwwbmzJlDjx49+P333/n444955ZVXeP7553nuuefy7XnKUdQPbgEBAbz99tscPHiQXbt2MWXKFBo1asTkyZMdj9n5sZWF63i+y4mrqNfqyiuvxMPDg0OHDl3SBKX5yelZWLx48QXbnTp1ip9//hmADh065Flf2OfWpSitx97Ly4vnn3+enTt3cuDAAT7//HM6duzI559/zo033nhZ+76YuLg47rjjDry9vfH29uahhx7i5MmTBbYvrutdGpNL+/r6kpCQQGZmZp51F5oIOD9l5XVg+/btdO3albi4OGbNmsUNN9yQb7uGDRsCFPj3umvXLoAC57+aNGkSDzzwAM2aNWPp0qUFfkGTc5yCEomAgAAAzp07B2RPvv33Htdly5YVKu7MzEz27t2Lq6trrvnBLqRPnz4AuY7xySef5Ikhv961M2fO0KdPH5YvX87jjz/Om2++me8x6tWrh4uLC3v27Mn3uXaxay3Op2RLyqzq1aszYMAA4uLi+Prrrx3fjP49iWjVqhWQ+8UuR2JiIps2bcLT05PGjRtf8Hi7d+8mMDAw3wk7ly9fnu82Li4ul92DcCE53+Rd6BjR0dF06NCBOXPmsG7dOhYvXkznzp0ver7ny7mmb7zxxkWHF+X0/FStWpV69epx+PBhx4v9+ZYuXQpkDwsqafk9PklJSXke+927dwMwYMCAPN9Gr1+/3vGGXdzq16/PHXfcwfLly/Hx8eGbb75xrLvQ83f37t0cOnSIiIiIUv/WMieuVatW5fsGX5yPr5eXFyNHjgTgxRdfvGj7wvQwjx49GoApU6Zc8IPvG2+8QVpaGj169CAiIiLP+sI+t6Bwf6/nc8bfUJ06dbjppptYuHAh9evXZ9WqVcTHxxfb/s9njGHUqFEcPnyYd955h3feeYcjR45wyy23YIzJd5uNGzdy5syZPMtz/j5ynpdlQatWrbDb7axZsybPulWrVhV5X+Dc14EtW7bQtWtXEhIS+Oqrry44SW779u3x8vJi9erVeR4vu93OokWLAOjWrVuebSdOnMhDDz1Ey5YtWbp0KdWqVSvwOD169ABg69atedalpaU5/m4KO6F2zjDNBQsW5Fm3YsUKUlJSiImJcYx2uJic3vj8ejcvJCkpiV69erFy5UqefvrpfHu0cnh6ehITE0NKSgorV67Ms37+/PlA/kNQpWxQsiVlWs5wwTfffJM5c+YQHBzMwIEDc7W5+eabcXNz47333nN8mM7x7LPPcvr0aW6++eaLvniGh4eTkJDA5s2bcy3/z3/+w8KFC/PdJigoiJMnT5bYh/SgoCAADhw4cMF299xzD+np6dxwww0YY7j77ruLdJzhw4fTu3dvdu3axXXXXef4FvV86enpvP/++4771wBuv/12jDE89thjuT5gxsXF8X//93+ONiXts88+y3Mvx/PPP09SUhLDhw93PPY5b8h//0Bz4sQJ7rvvvmKLZ+/evezZsyfP8lOnTpGWloaXl5djWc71mTBhQq5v/LOysnj00Uex2+3ccccdxRZbYdWuXZuePXuyb98+Jk2alGvdunXrmDZtGgEBAXn+Hi/VhAkTqF27Nl988QWPPfZYvn9TcXFxPPjgg8yYMeOi++vcuTMjR44kISGBfv365Xu/34cffsjEiRPx8fHhnXfeyXc/hX1uQeH/Xs9X0n9DJ0+eZMuWLXmWJycnc/bsWVxdXXF3d7/k/V/IW2+9xbx58xg6dCijR49m9OjRDB06lAULFvD666/nu01SUlKehHvDhg188cUX+Pn5FdvzrTjccsstADzzzDO5esWTkpIcj11hOft1YNOmTXTr1o0zZ87wzTffcO21116wvY+PDyNHjiQ5OZnnn38+17rJkyezb98+evfunaeH6P/+7/8YN24cV1xxBUuWLCE4OPiCx7nhhhuoWbMmsbGxrF+/Ps++kpKS6NatW6GHLt94440EBwczY8YMNmzY4FiemprKM888A5Br5AGQq935Tp48ybhx4wAuer3Od+rUKXr06MGPP/7ICy+8wIQJEy66TU5MzzzzDKmpqY7lP/30E7GxsYSEhBTYCynOp3u2pEzr1asX4eHhjhfZ+++/P88Hg/DwcCZNmsR9991H69atGTJkCCEhISxfvpy1a9fSqFGjC35rlGPs2LEsXLiQjh07MmTIEPz8/NiwYQOrVq3ixhtvZPbs2Xm26d69Oz/99BPXXHMNnTt3xsPDgxYtWtC/f/9iOf9u3bphs9l48skn2bp1q2PIRM6bQo7Bgwfz0EMPcfjwYYKDgxk0aFCRjmOz2Zg1axYjR47km2++ITIyku7du9O4cWNcXFzYt28fP/zwAydPnnSMSwd49NFHmT9/Pt988w0tWrSgb9++pKSkMGvWLE6cOMHjjz9e5BvFL0WfPn3o0KEDQ4YMoUaNGqxatYpVq1YRHh7Oq6++6mjXpk0bOnTowFdffUVMTAwdO3bk+PHjzJ8/n4YNG+Z7z86l+PXXXxk0aBBt2rShcePG1KxZk5MnT/LNN9+QkZHhuIcLICYmhscff5zXXnuNZs2aceONN1KlShXmz5/P1q1b6dixI4899lixxFVUH374IR06dOCxxx5j0aJFXHnllRw8eJBZs2Zhs9n4+OOP8y1mcCmqV6/OkiVLuP7663njjTf49NNP6dmzJ3Xr1iU9PZ3t27ezbNky0tLSLniz+fn+9a9/kZmZyfTp02nYsCF9+vQhKiqK5ORkli5dytatWwkKCuLLL7+kSZMm+e6jsM8tyH49mDVrFoMGDaJv3754eXkRFhbm6LXLT0n/DR0+fJhWrVrRvHlzoqOjqVOnDqdPn+bbb7/l2LFjPPjgg0V6DHMKEOTH39/fUSTjp59+4sknnyQiIsIxtBmyH5OffvqJp59+ms6dOzuGMOfo3LkzU6ZMYd26dXTo0IGjR48SGxuL3W7no48+yrd4hbPccsstzJgxgwULFtCsWTMGDBhARkYGX375JW3atOH333/HZivcd9rOfB04deoU3bt3JyEhge7du7N27VrWrl2bp93YsWNz9ay9/PLLLFu2jLfeeotNmzbRtm1btm/fzjfffEO1atV4//33c23/6aef8txzz+Hi4kKnTp1499138xwjPDzccX8VQJUqVfjkk0/o168fnTp1YtCgQdSqVYt169axatUqqlWrluv5dTG+vr78+9//5sYbb6Rr164MGzaMwMBA/ve///H7779z4403MnTo0FzbjB49mvj4eNq2bUvdunUd74nz5s3j3LlzXH/99UX6QmTQoEFs2LCBevXqYbfb8/17uv7662nZsqXj92HDhvHVV18xe/ZsWrVqRf/+/YmPjyc2NpasrCz+/e9/l6m/DfmbUq19KHIJckq7w4UnPF24cKHp2bOn8ff3N+7u7qZevXrmscceyzOhsTEFl2ieO3euadeunfHx8TF+fn6mZ8+eZvny5QWWGD579qy5++67Ta1atYyLi4uB7AmIc3CZpd+NMeazzz4zLVq0MJ6eno7rkJ+cuX/+PkdNUS1cuNAMHz7chIeHG09PT+Ph4WEiIiLM8OHD85076dy5c+all14yTZs2NZ6ensbHx8d06NAh30kjc8o7n3+NzlfQNTAm/7LZ51/Ljz/+2HGdgoODza233mqOHDmSZz/x8fHmnnvuMWFhYcbDw8NERkaaJ5980iQnJ+d7jAvNQ1VQ3AcPHjRPPvmkiYmJMdWrVzfu7u6mVq1a5pprrjHz5s3Ldx/Tp083HTp0MD4+PsbDw8M0adLETJgwId9y/BeacuBi0wX83cXO79ChQ+buu+82devWNW5ubiYoKMhcd911Zv369UXeV2GkpaWZKVOmmD59+pjQ0FDj5uZmfHx8TLNmzcwDDzxgNm/eXOR9Lly40Nx4442mVq1axt3d3fj6+prWrVub8ePHm/j4+Hy3uZTnVmZmpnnyySdNRESEcXV1zfO8KOhxK86/ob+/tp06dcq88MILplu3bqZmzZrG3d3dhIaGmi5duphp06YVumx1YUq/55xbYmKiiYiIMG5ubmbdunV59vXTTz8Zd3d3Ex4e7nh9Pv+8tm3bZgYMGGD8/f2Nl5eXiYmJyTP/kjEXLv1+oSk5ivoabMxfpef37t2ba/m5c+fMs88+a8LDw427u7sJCwszTz31lDl06JCB7MnCi8IZrwPnz3F2oZ+/n7sx2a+nDz74oOP1ITQ01Nx22235zllZmOdQQdd/06ZN5oYbbjDBwcHGzc3N1KlTx9x9993m8OHDFz2//Kxatcr06dPH+Pv7G09PT9OsWTPz1ltv5TudwmeffWZuuOEGExERYapUqWLc3NxMjRo1zLXXXmtmzJhR5NLvOSX7L/ST32toRkaGeeutt0yzZs2Mp6en8ff3N3369Mk1D5+UTZYxBQycFpFypWvXrqxYsYLff/+dqKgoZ4dTKp5//nleeOEFli5dmu+9diKXSs+t0rVv3z4iIiIYNWpUsZXqdqbvv/+eXr16MW7cOF555RVnhyMiTqR7tkQqgPXr17N8+XJ69+5daRItERFnO3LkSJ5l8fHxjnt5ytI9ZiLiHLpnS6Qc++c//8nhw4f5+OOPsdlsF5wsVEREitfDDz/Mr7/+SkxMDCEhIRw6dIj58+eTkJDAXXfdVaEm+BaRS6NkS6QcmzhxIocOHSIyMpLPPvtMb+wiIqVo0KBBHD9+nLlz55KYmIinpydNmzbljjvucEoVUREpe3TPloiIiIiISAnQPVsiIiIiIiIlQMmWiIiIiIhICVCyJSIiIiIiUgKUbImIiIiIiJQAVSMsglOnTpGZmensMERERERExElcXV0JCAgoXNsSjqVCyczMJCMjw9lhiIiIiIhIOaBhhCIiIiIiIiVAyZaIiIiIiEgJULIlIiIiIiJSApRsiYiIiIiIlAAVyBARERGRAhljOHv2LMYYZ4ciUmo8PDzw8PC47P0o2RIRERGRAp09exYPDw/c3d2dHYpIqTDGcO7cOZKTk6lSpcpl7UvDCEVERESkQMYYJVpSqViWhbe3d7HMr6tkS0RERERE5G8sy7rsfSjZEhERERERKQFKtkREREREREqAki0RERERKVHGnoX5fQv2dcsxv2/B2LOcHZLTxMbG0rhxY2eHIaVE1QhFREREpMSYjWuwz/g3nIrP/h0gIAjbsDFYrWNK5Jhjx45l1qxZjt/9/f1p2bIlTz/9NE2aNHEs/+KLL/j444/Zv38/rq6u1KlTh/79+/PAAw/k2efmzZvp06cP//vf/7jiiivyrB8yZAi+vr5MmTKlRM5Jyif1bImIiIhIiTAb12D/56uORMvhVDz2f76K2bimxI7drVs3fvnlF3755RdiY2NxcXFh1KhRjvUzZsxg/Pjx3HHHHSxatIivv/6ae++9l+Tk5Hz3Fx0dTZMmTYiNjc2z7uDBg6xZs4Zhw4aV2PlI+aSerXLE2LNg1zZMYgKWfyBENcGyuTg7LBEREakkjDGQnla4tnY7Zvq/L9jGPv3fWI1bYtkK8f2/u0eRqsO5u7tTrVo1AKpVq8b999/PwIEDiY+PJygoiEWLFtG/f3+GDx/u2KZhw4YX3Ofw4cN57bXXeOGFF/Dy8nIsnzlzJtWrV6dbt24kJiby3HPPsXjxYtLS0rjqqqt48cUXiYyMLHTsUnEo2SonnNEFLyIiIpJLehr2+4cU3/4S4zEPDsv+XHMRtskzwcPzkg6TnJzMl19+SXh4OAEBAQCEhITw448/cujQIWrXrl2o/QwcOJAJEybw7bffMnjwYCA7AZ01axaDBw/GxcWFhx56iL179/Lxxx/j4+PDyy+/zMiRI1m2bBlubm6XFL+UXxpGWA44swteREREpDxavHgxUVFRREVF0aBBA77//ns+/PBDbH/2oj388MP4+vrSrl07OnXqxNixY/nf//6H3W4vcJ8BAQFcc801uYYSrl69moMHDzJ06FD27NnDokWLeP3112nXrh1Nmzblvffe49ixYyxYsKDEz1nKHvVslXHGnpXdo3UB9hlTsLVspyGFIiIiUrLcPbJ7mArB7PwN8+4LF21nPTgeq0HTQh27KGJiYnjllVcASEpK4tNPP+Xmm2/mu+++o3bt2lSvXp25c+eyY8cOfvzxR37++Wceeughpk+fzhdffOFIyv5u2LBhjBgxgn379hEeHk5sbCxXXXUVERERLFq0CFdXV1q3bu1oHxgYSL169di9e3eR4peKQT1bZd2ubXl7tP7uVFx2OxEREZESZFkWlodn4X6atoSAoAvvMCAYq2nLwu2vCPdrAXh7exMREUFERAQtW7bkjTfeICUlhS+++CJXu0aNGnHrrbfy3nvvMX36dFasWMHatWsL3G/Hjh2pVasWM2fO5MyZM8ybN0+FMaRASrbKOJOYUKztREREREqDZXPBNmzMBdvYho0utZE5lmVhs9lITU0tsE1UVBQAKSkpBbax2WwMHTqUWbNmMWfOHNzd3bn22msBqF+/PpmZmWzcuNHRPiEhgT/++MOxb6lcNIywjLP8Awt106jlH1jisYiIiIgUhdU6Bts943IV+QIgIDg70SrBIl/p6emcOHECyB5G+PHHH5OcnEzPnj0BGDduHNWrV6djx47UqFGD48eP88477xAUFJTvPFrnGzp0KG+//TYTJ07kuuuuc1QmjIyMpHfv3jz++ONMnDiRKlWq8MorrxAaGkrv3r1L7Fyl7FKyVdZFNcnugr/QUMKA4Ox2IiIiImWM1ToGW8t2pT59zdKlS2nVqhUAPj4+1K9fn48++oiYmOwEr1OnTsyYMYPPPvuMU6dOERgYSOvWrYmNjSUw8MJfYteqVYtOnTqxfPnyPEMI33rrLZ577jlGjRpFeno67du357PPPlMlwkrKMsYUpuNEgJMnT5KRkVHqx3VUIyyA7Z5xKv8uIiIiJeL06dP4+vo6OwyRUlfQc9/NzY2QkJBC7UP3bJUDOV3w+d1kavUbqkRLRERERKQM0jDCcuLvXfBmw2rY9CPmyEFnhyYiIiIiIvlQslWOWDYXaNgcCzC1wrBv+hF+XYc5fQrLN8DZ4YmIiIiIyHk0jLCcsmqHQ0QDyMrCrP7B2eGIiIiIiMjfKNkqx6zO2SVEzcqFGLvdydGIiIiIiMj5lGyVA9M3nyR2S1ye5VabTsysdw0zqjSH37c4ITIRERERESmIkq1ywGZZTNsclyfhmrnzLDPqXI3N2DErFzkpOhERERERyY8KZJQDQ5sHAzBtc3aydWPTIGb/Fs+0zXEMD7MxeNkSzCFXzJkkrKp+zgxVRERERET+pGSrnBjaPBi7MUzbHOdIukZEBzO0eTBZy+rD/t2YNT9g9R7o5EhFRERERAQ0jLBcGR4dgvXn/23WXz1efxXKWIQxxknRiYiIiEhFt2bNGmrVqkVSUpKzQ7mgN998k549ezo7DCVb5UnsljhyUim7yS6cAWC17QQennD8MOz8zXkBioiIiJynoCJfkP25JuezTHEbO3YstWrVyvNz0003lcjxyoOTJ08SFhbGN998k+/6Rx55hN69e5d4HDfeeGO+j80TTzxRrMe5++67iY2NLdZ9XgoNIywnYrdkDx8c2iyIebsSOZOWxYwt8dgsi6HNg7Hads7u2VqxEKthM2eHKyIiIuIo8gV/jciBvz7XjIgOLmjTy9atWzfeeuutXMvc3d0veX/GGLKysnB1LZ8fn0NCQujevTszZszguuuuy7UuJSWFuXPn8tRTT5VKLDfddBOPPvpormVeXl7FeowqVapQpUqVYt3npVDPVjlw/gvSiBYh9KyXXQQj1MfNUaXQMZRw4xrM2dPODFdEREQqKGMMqZn2Qv9c1ziQIc2CmLY5ji9+PUlqpp0vfj3JtM1xDGkWxHWNAwu9r6LeKuHu7k61atVy/fj7+wNw8OBBatWqxdatWx3tk5KSqFWrFmvWrAH+Gi73ww8/cM011xAREcH69etJS0vj2WefJTo6msjISK6//no2bdrk2E/OdosXL6ZHjx5ERkbSr18/duzYkSu+9evXM3DgQOrVq8eVV17Js88+S0pKimP97Nmz6dOnDw0aNKBly5bcd999xMXF5TnOypUr6dOnD/Xq1WPAgAHs3r27wGsybNgwVq1axeHDh3Mtnzt3LllZWQwcOPCi5/d3hw4dYtSoUTRp0oT69evTrVs3lixZUmB7AE9PzzyPTdWqVR3rf/nlF3r16kVkZCR9+vRh/vz5uR6v2NhYGjdunGufCxYsoFatWo7fzx9GuHz5ciIjI/MMfXzuuecYPHjwBWO9XOUzNa9k7MY4imEA9K7vz5xtCRw7m0H/hgHYjYGw+lAnAg7uxfy4FKvHdRfZq4iIiEjRpGUZhsbuvKRtZ26NZ+bW+AJ/v5jYoQ3wdLUu3rCYvfzyyzz33HPUrVsXPz8/XnrpJebNm8ekSZOoXbs2H3zwATfddBOrVq0iICDAsd2ECRN48cUXCQkJ4dVXX+XWW29l5cqVuLm5sW/fPm666SYef/xx3nzzTeLj43nmmWd4+umnefvttwHIzMzkscceo169esTFxfHCCy/w0EMP8dlnn+WKb+LEiTz33HMEBQUxbtw4HnnkkQKHCnbv3p2QkBBmzpzJQw895Fg+c+ZM+vTpg5+fH88991yhzi/HU089RUZGBl9++SXe3t7s3LnzsnqUkpOTGTVqFJ07d+a9997jwIEDjB8//pL3B9CxY0d8fX2ZN28ew4cPByArK4v//e9/xT588e/Us1UODI8OydX1HlrVndY1s5/ENuvPwhmW9Vfv1goVyhAREZHKbfHixURFReX6effdd4u8n8cee4zOnTsTHh6Oh4cHU6dO5ZlnnuHqq6+mQYMGvP7663h6ejJjxoxc2z300EN07tyZxo0bM2nSJE6ePMn8+fMBmDx5MgMHDmTMmDFERkbSpk0b/u///o/Zs2eTmpoKZPdCXX311YSFhXHFFVfwf//3f/zwww8kJyfnOs4TTzzBVVddRYMGDbjvvvvYsGGDYx9/5+LiwuDBg5k5c6bjs+K+fftYt24dQ4cOJSUlpdDnl+PIkSO0adOGxo0bExYWRs+ePWnfvv0Fr+nUqVPzPDZfffUVAHPmzMFut/PGG2/QsGFDevbsyd13332RR+nCXFxcGDBgAHPmzHEsW7VqFadPn6Zv376Xte+LUc9WOdW3QQA/H0lmyZ4kbmoRgoerDattF8ysj+HoQfhjO9Rv4uwwRUREpALxcLGIHdqgyNt9+Vt2L5arzSLTbhjSLIgbmgYV+dhFERMTwyuvvJJrWc4wwqKIjo52/H/fvn1kZGTQpk0bxzI3NzdatmzJrl27cm135ZVXOv4fEBBAvXr1HEP8tm3bxvbt23N9+DfGYLfbOXjwIFFRUWzevJk333yTbdu2kZSUhN1uB+Dw4cM0aPDXY9CkyV+f96pXrw5AfHx8riF15xs6dCiTJ09m9erVdOzYkdjYWOrUqUPHjh3Zvn17oc8vx+23386TTz7J8uXL6dSpE3379s0VU34GDhzIgw8+mGtZSEgIALt27aJx48Z4eno61l1xxRUX3F9hDBo0iP79+3Ps2DFCQ0P56quv6N69O35+JTtHrZKtcqpVjSpUq+LGieQMVu4/TY96/ljeVbDadMSsXpJdKEPJloiIiBQjy7KKPJQvdkscM7fGO26JyLkX3dVm5Rq5U9y8vb2JiIjId53NlndwV2ZmZoH7KW7JycncfPPN3H777XnW1apVi5SUFEaMGEHXrl2ZPHkyQUFBHD58mBEjRpCenp6rfX4FO3ISs/xERkbSrl07YmNjiYmJYfbs2YwYMQLLurQhmiNGjKBLly4sWbKEFStWMHnyZJ577rl8zy1H1apVC3xsCsNms+UZxZWRkXHBbVq2bOmoxnjLLbewYMECx5DNkqRhhOWUi83imih/AObvTHQstzr9OZRww2pM8lknRCYiIiKS7fwiXzmJ1dDmwYyIDnYU+XKGwMBAAI4fP+5Y9ttvF58+Jzw8HHd3d3766SfHsoyMDDZt2pSrtwng559/dvw/MTGRPXv2UL9+fQCaN2/Ozp07iYiIyPPj7u7O7t27OXXqFE8++STt2rWjfv36uYpjXK5hw4Yxb948vvvuO44dO8aQIUOKfH7nq1WrFrfccgtTpkzhrrvuYtq0aZccW1RUFNu3b881FHLjxo252gQFBXH27NlcBUUK8/gNGjSIOXPm8P3332Oz2ejevfslx1lYSrbKsR71/HC1WexOSGVX/LnshZENoVYYZKRjflzm1PhERESkcvt7ka8cOQmXvQTvMU9PT+fEiRO5fhISEoDsMuOtW7fm/fffZ9euXaxdu5bXXnvtovv09vZm5MiRTJgwgaVLl7Jz504ee+wxUlNTGTZsWK62kyZNYuXKlezYsYOHHnqIwMBArrnmGgDuvfdeNmzYwNNPP83WrVvZs2cPCxcu5Omnnwaykxd3d3c+/vhj9u/fz6JFi5g0aVKxXZv+/fvj5ubGuHHj6NKli2PIYVHOL8dzzz3HsmXLOHDgAFu2bGH16tWOpLIgqampeR6bxMREIHuIoWVZPPbYY+zcuZMlS5bw4Ycf5tq+VatWeHl58eqrr7Jv3z7mzJnDrFmzLnreAwcOZMuWLbz77rtce+21eHh4FOJqXR4lW+WYn6crHcOyy2TO+7N3y7Ksv3q3Vi5UoQwRERFxmr8X+Trf0ObBDI8OKbFjL126lFatWuX6uf766x3r33rrLTIzM7nmmmsYP348jz/+eKH2+9RTT9G3b18efPBBrrnmGvbt28cXX3yR536wJ598kvHjx9OnTx9OnjzJJ5984pjnq0mTJnz55Zfs2bOHQYMG0bt3b15//XXHPVdBQUG8/fbbfPvtt3Tr1o3Jkyfz7LPPFst1gexkc8CAASQmJjJ06NBLOr8cdrudp59+mq5du3LTTTcRGRnJyy+/fMHjf/HFF3kem/vuuw/Inh/rk08+YceOHfTu3ZuJEyc6ktAcAQEBvPfeeyxZsoTu3bvz9ddf8/DDD1/0vCMiImjVqhXbt29n4MCBF21fHCyjT+OFdvLkyYuOBy1tv8ed4/GF+3F3sfjPwPr4erhgks9if+xWyEjHNu41rHqNnB2miIiIlFOnT5/G19fX2WGUG2vWrGHw4MFs27atxIsvVBYHDx6kffv2LFy4kGbNmpXacQt67ru5uTkKelxMmSyQsWDBAubOnUtiYiJhYWHcfvvtBXZHrlu3jjlz5nDs2DGysrIIDQ2lf//+dO7cOd/2//rXv1i8eDGjRo3i2muvLcnTKBUNgjyJDPBgz6k0ftiTyPWNg7Cq+GBd2QGzdilm5UIlWyIiIiIiTlDmhhGuWbOGqVOncuONNzJx4kTCwsJ46aWX8sz4nMPHx4dBgwYxYcIEXn/9dbp168YHH3yQ70zX69evZ9euXflOyFZeWZZFnwbZ5zN/Z6Jj7LNjzq2fVmFSkgvcXkRERERESkaZS7a+/fZbunfvTrdu3ahduzZjxozB3d2dpUuX5tu+adOmtG3bltq1axMaGkrfvn0JCwtjx44dudolJCTw3//+lwcffDDfEpnlWedwX6q42Th2NoNNR/9MrOo1hhp1ID0Ns365cwMUERERqSRiYmI4fPiwhhAWozp16nD48OFSHUJYXMpUspWZmcmePXto3ry5Y5nNZnOUx7wYYwxbtmzhyJEjuSZTs9vtvPfeewwYMIA6depcdD8ZGRmkpKQ4fs6dO3dpJ1RKPF1tXB2Z/Qedq1BG514AmBUqlCEiIiIiUtrKVBfP6dOnsdvteaqd+Pv7c+TIkQK3S0lJ4a677iIzMxObzcYdd9yRa7bvb775BhcXF/r06VOoOObMmcPs2bMdv0dERDBx4sSinUwpu6aBP3N/P8WGw2c5fjad6j7uWO27Yb6cCgf3wv7dEB7l7DBFRERERCqNMpVsXSpPT09ef/11UlNT2bJlC1OnTqV69eo0bdqUPXv2MG/ePCZOnFjombEHDhxIv379HL9f6ozapam2rwfRod5sPpbCot1JjGwZguXji9U6BrN+OWbFQiwlWyIiInIJjDHl4vOQSHGx2+3Fsp8ylWz5+vpis9kck5rlSExMLLC2P2QPNQwNDQWyZ74+fPgwX3/9NU2bNmX79u2cPn2ae++919HebrczdepU5s2bx/vvv59nf25ubri5uRXLOZWmvlEBbD6Wwve7ExnWPAg3FxtW597Zydb6FZght2N5ejs7TBERESlHPDw8OHfuHN7e+gwhlYPdbufMmTNUqVLlsvdVppItV1dXIiMj2bp1K23btgWyT3br1q2OGbcLw263O+bD6ty5c657wABeeuklOnfuTLdu3Yov+DKgbW0fgrxciT+XyZoDZ+gS4QcNmkL1WnD8MGb9CqzOhb+OIiIiIh4eHiQnJ5OUlKTeLak0qlSpUixF9cpUsgXQr18/3n//fSIjI6lfvz7z5s0jLS2Nrl27AjB58mQCAwMZMWIEkH1/Vb169ahevToZGRn88ssvrFy5ktGjRwNQtWpVqlatmusYrq6u+Pv7U7NmzVI9t5LmYrPoHeXPtM1xzN+VSJcIv+xCGZ16YWZ/jFmxCJRsiYiISBEVxzf8IpVRmUu2YmJiOH36NDNnziQxMZHw8HCeeuopxzDCuLi4XN+qpKWlMWXKFOLj43F3d6dWrVo88MADxMTEOOkMnKtnfX9it8Sx/eQ59p5KJSLAEyvmasycz2D/bsz+P7DC6jk7TBERERGRCs8yqgleaCdPnnQMTyzLXlt5mNUHztC7vj/3tsu+l83+r9cxP63E6nINtpvvvcgeREREREQkP25uboSEhBSqbZmaZ0uKR98GAQAs25tEcnoWAFanP+fcWrcck5bqtNhERERERCoLJVsVUNNqXtTxcycty7B0b1L2wobNISQUUs9hflrp3ABFRERERCoBJVsVkGVZ9InK7t2avzMxe24Mmw2rU28AzIqFzgxPRERERKRSULJVQXWL9MXT1eLQ6XS2HE8BwOpwNbi4wN6dmEN7nRyhiIiIiEjFpmSrgvJ2c6FrhB8A83clAmD5BkCLdgDZZeBFRERERKTEKNmqwPpE+QPw48EzxKdkV1G0df5zKOGPyzBpac4KTURERESkwlOyVYGFB3jSJMQLu4Hvd/9ZKKNxCwiqBueSMT+vcm6AIiIiIiIVmJKtCq7Pn2XgF+5OJNOeUyjjzzLwKzWUUERERESkpCjZquCuqlMVP08XEs5lsv7QGQCsDt3BZoPd2zGHDzg5QhERERGRiknJVgXn5mLRq54/APN2JgJg+QdBdFsAzEqVgRcRERERKQlKtiqB3lH+2CzYcjyFg0nZRTFsnf8cSrh2KSYj3ZnhiYiIiIhUSEq2KoGQKm60qeUD/FUGnqatIDAYUs5ifl7jvOBERERERCooJVuVRE6hjKV7kjiXYceyuWB1zCmUoaGEIiIiIiLFTclWJdEi1JsaVd1IybCzYt9pAKwOPcCywc7fMEcPOTlCEREREZGKRclWJWGzLPpEZfduzdt5CmMMVmAwNL8CALNKZeBFRERERIqTkq1K5OpIP9xdLPYlprEj7hwAts69ATBrlmAyMpwZnoiIiIhIhaJkqxKp6uFCpzBfAOb/WQaeZleAfxCcPYP5Za3zghMRERERqWCUbFUyff8slLH6wBkSUzOxXFywOvYAwKzUUEIRERERkeKiZKuSqR/kSVSQJ5l2w+LdSQBYHXuCZcGOzdjXLsW+bjnm9y0Ye5aToxURERERKb9cnR2AlL6+DQJ4Z+1RFuw6xcAmgbgEVYPaEXBwD+a/bwNgAAKCsA0bg9U6xqnxioiIiIiUR+rZqoQ61K1KVXcbJ1My+fnIWczGNXBwT96Gp+Kx//PV7PUiIiIiIlIkSrYqIQ9XG93r+QMwf+cp7DP+fcH29hlTNKRQRERERKSIlGxVUtdE+QOw8WgKx86ZCzc+FQe7tpV8UCIiIiIiFYiSrUqqRlV3WteoAsDCmlddtL1JTCjpkEREREREKhQlW5VYnwb+ACypcSVptgvXSrH8A0shIhERERGRikPJViV2RU0fQrxdOetWhTUhLQpuGBAMUU1KLzARERERkQpAyVYl5mKzuCYqe5LjBbUKHkpoGzYay+ZSWmGJiIiIiFQISrYquR71/XC1Wezyrcvumk1zr3Rxwbp7nObZEhERERG5BJrUuJLz93SlQ92qLN93moW9H6BBUDzm2GHMtI8gKwsrMNjZIYqIiIiIlEvq2RJHoYyVB85wNrwJti7XYLXtDIBZ+p0TIxMRERERKb+UbAm/HEnG39OF9CzDD3uSALC69gEg9pgb03465MToRERERETKJyVbgovNIjE1C4D5u05hNwYiGzIzejAzwnpgO7THyRGKiIiIiJQ/umdLGNo8mIwsw6zf4jl6JoNfj6WwM+4cMwLbMGzvQgYnb8Vc1xHLptxcRERERKSw9OlZALi5ZQgNgjwBeOGHg0zbHMfwJv4MOfEjxB2H335xcoQiIiIiIuWLki1x+MdVNQAwgKsNhrUKxerQHQD7snlOjExEREREpPxRsiUOqw+ccfw/0w6xW+KwulyTvWDLBkzccSdFJiIiIiJS/ijZEiA7sZq2OY7OYVUBcHexmLY5jpknPaFxCzAGs2KBk6MUERERESk/lGyJI9EaER3M2JiaVKviSnqWoV1tH6ZtjmNW00EAmJXfYzIynBytiIiIiEj5oGRLsBvDiOhghjYPxsVm0ScqAIATyRkMbx6EvXot8A+Cs6cxP692crQiIiIiIuWDki1heHQIQ5sHO37vUd8fdxeLvafSaBFahREtq2F16Q2AUaEMEREREZFCUbIlefh6uNA53BeAb3eeAsDq1BtcXOCPHZgDfzgzPBERERGRckHJluTr2gbZQwnXHjhDfEoGll8AVusYAMyy+c4MTURERESkXFCyJfmKDPSkcYgXWQYW7k4EwOraBwCzbjkm5azzghMRERERKQeUbEmBcnq3Fu5KJCPLQFRTqFkX0tMwa5c6OToRERERkbJNyZYU6Kq6VQnwciUxNYs1B05jWRZW175AdqEMY4xzAxQRERERKcOUbEmBXG0W10T5A/DdzkQArPZdwcMLjh2GHZudFpuIiIiISFmnZEsuqHd9f1xt8HvcOXbHp2J5eWNd1RUAuwpliIiIiIgUSMmWXFCAlysxdbPLwH+XUwb+z6GEbPoRcyreSZGJiIiIiJRtSrbkonIKZazcd5rTqZlYtcKgQVOw2zErFzo5OhERERGRsknJllxUw2BP6gV6kmE3LPojCfird8usWITJzHRidCIiIiIiZZOSLbkoy7K4toE/AAt2niLLbrBatQdff0hKgE0/OjU+EREREZGySMmWFEqncF+qerhwMiWT9YfPYrm6YXXqBahQhoiIiIhIfpRsSaG4u9joVc8PgHm//1koo3NvsGzw+xbMkQPODE9EREREpMxRsiWF1qdBADYLNh9P4UBiGlZgCLRoC4BR75aIiIiISC5KtqTQQqq40ba2DwDz/iwDb+vWBwCz9gdM6jmnxSYiIiIiUtYo2ZIiySkDv3RvEsnpWdCoBVSrCannMOuWOzk6EREREZGyQ8mWFEnz6t7U9XMnNdPww54kLJsNq+ufvVvL5mGMcW6AIiIiIiJlhJItKRLLsuj7Z+/WdztPYTcGK6Y7uLvDoX3wx3bnBigiIiIiUkYo2ZIi6xrhRxU3G0fPZLDpaDJWFR+stl0AMEtVKENEREREBJRsySXwcrNx9Z9l4L/NKQPftS8A5ufVmNOJTopMRERERKTsULIll6RvVPZQwo1Hkjl6Jh0rrB5ENICsTMyq750cnYiIiIiI8ynZkktS09edK2pWwfBXGXhH79byBRh7lvOCExEREREpA5RsySXLKZSx5I8kUjPtWG06QpWqkHASNm9wcnQiIiIiIs6lZEsuWeuaVQj1cSM5w86yvUlYbu5YHXsAYF82z8nRiYiIiIg4l5ItuWS288rAz/s9EWMMVpc+YFnw2y+YE0ecHKGIiIiIiPMo2ZLL0r2eHx4uFvuT0th6IgUrJBSaXQFk37slIiIiIlJZKdmSy+Lj7kLXiOwy8N/9ngiArWsfAMyqxZj0NGeFJiIiIiLiVEq25LJd2zB7KOG6Q2c4mZwBzVpDUDVIOYv5aZWToxMRERERcQ4lW3LZwvw9aFbdG7uBBbsSsWwu2fduAUaFMkRERESkklKyJcWi35+FMhbtTiQ9y55dldDVFfbtwuzd5eToRERERERKn5ItKRZta/sQ7O3K6bQsVu0/g1XVD+vKjgCY5erdEhEREZHKR8mWFAsXm0WfqOzere9+P5VdBr5rXwDM+pWYs6edGJ2IiIiISOlTsiXFpmd9P1xtFrsTUtkZnwqRDaFOBGSkY9YscXZ4IiIiIiKlSsmWFBs/T1c6hVUFsnu3LMvC0bu1bD7GbndidCIiIiIipUvJlhSrnDLwqw+cJvFcJla7LuBVBU4ewyyag33dcszvWzD2LCdHKiIiIiJSslydHYBULFFBXjQI8mRnfCqLdicypHkw1G8MWzZgvvwUAAMQEIRt2Bis1jFOjVdEREREpKSoZ0uKXU7v1vxdiWT8vAa2bMjb6FQ89n++itm4ppSjExEREREpHUq2pNh1qFsVP08XEs5l8uOCFRdsa58xRUMKRURERKRCUrIlxc7NxUbv+v4AzPOPvnDjU3Gwa1vJByUiIiIiUsqUbEmJuCbKHxcM2/wj2VulxgXbmsSEUopKRERERKT0KNmSEhHk7Ub7AAPA/FoXLoJh+QeWRkgiIiIiIqVKyZaUmL6t6wKwonorzrh65d8oIBiimpRiVCIiIiIipUPJlpSYptWrEO6RSbqLO0tqtMm3jW3YaCybSylHJiIiIiJS8pRsSYmxLItrW9YGYGHtjmRh5W4QVA1atnNCZCIiIiIiJU/JlpSoLuG++LjbOO7hzy+jX8Ia/QjWvU+BlzfEn8AsX+jsEEVERERESoSSLSlRX22Lp7avBwDzkv2wteuCrVV7rIEjmRnWnek/HcCcSXJylCIiIiIixU/JlpQom2WxI+4cAJuOJnPodBoAM4PaMCOiN7b0NMycz5wZooiIiIhIiXB1dgD5WbBgAXPnziUxMZGwsDBuv/126tevn2/bdevWMWfOHI4dO0ZWVhahoaH079+fzp07O9rMnDmTNWvWEB8fj6urK5GRkQwbNoyoqKjSOqVKa2jzYACmbY4DYN7ORPw8XJi+JYHhte0MXrYEc8DCdOqFFdHAmaGKiIiIiBQryxhjnB3E+dasWcPkyZMZM2YMUVFRfPfdd/z4449MmjQJPz+/PO1/++03kpOTqVmzJq6urmzcuJGpU6cybtw4WrZsCcCqVavw9fWlevXqpKen891337F27Vree+89fH19Cx3byZMnycjIKK5TrVQmrTnC0r2nHb+PiA5maPNg7P99G7N2KYTVx/bUG1g2dbaKiIiISNnl5uZGSEhIodqWuU+23377Ld27d6dbt27Url2bMWPG4O7uztKlS/Nt37RpU9q2bUvt2rUJDQ2lb9++hIWFsWPHDkebjh07Eh0dTfXq1alTpw633HIL586dY//+/aV1WpXeg1fVcPzfZv3V42XdcGt2sYz9uzGrvndSdCIiIiIixa9MJVuZmZns2bOH5s2bO5bZbDaaN2/Ozp07L7q9MYYtW7Zw5MgRmjTJf6LczMxMFi9ejLe3N2FhYfm2ycjIICUlxfFz7ty5SzshcZi1Nd7xf7uB9348CoDlF4A1YDgAZs5UTPIZp8QnIiIiIlLcytQ9W6dPn8Zut+Pv759rub+/P0eOHClwu5SUFO666y4yMzOx2WzccccdREdH52rz888/M2nSJNLT0/H39+eZZ54pcAjhnDlzmD17tuP3iIgIJk6ceOknVsnFbolj2uY4RkQHcyI5g8V/JLH4jyQCvVy5qUUIVrd+mFWL4fB+zNefY910j7NDFhERERG5bGUq2bpUnp6evP7666SmprJlyxamTp1K9erVadq0qaNN06ZNef311zl9+jRLlizh7bff5uWXX873PrCBAwfSr18/x++WZeVpI4VzfqI1tHkwZ9Oz2HgkmYRzmczcGo+rzWJo82Bsw+/C/sZTmOULMB17YYXVc3boIiIiIiKXpUwNI/T19cVms5GYmJhreWJiYp7ervPZbDZCQ0MJDw+nf//+tG/fnq+//jpXG09PT0JDQ2nQoAH33HMPLi4u/PDDD/nuz83NDW9vb8ePl5fXZZ5Z5WU3xpFoAfi4u3Bv21AALOBEcnbBEathM6y2ncEY7NM/wtjtzgpZRERERKRYlKlkK6cs+9atWx3L7HY7W7dupUGDwpcFt9vtF60aaIxRZcFSMDw6xJFo5WhT24cu4b4Y4Pe4c2RkZSdW1o23gYcX/LEju0KhiIiIiEg5VqaSLYB+/fqxZMkSli1bxqFDh5gyZQppaWl07doVgMmTJzNt2jRH+zlz5rB582aOHz/OoUOHmDt3LitXrqRTp04ApKamMm3aNHbu3MnJkyfZs2cPH3zwAQkJCVx11VXOOEUBRl9ZHT9PFw4mpTPzz+IZVkAQVv+hAJgvP8GknHVmiCIiIiIil6XM3bMVExPD6dOnmTlzJomJiYSHh/PUU085hhHGxcXluocqLS2NKVOmEB8fj7u7O7Vq1eKBBx4gJiYGyB5ieOTIEd58803OnDlD1apVqVevHi+88AJ16tRxxikK4Ovhwt1tqjNx5RFm/xbPVXWqEhnoidW9f3axjGOHMP+bjjVsjLNDFRERERG5JGVuUuOyTJMaF7+JKw+z5sAZIgI8eOOacFxtFmbbJuxvPweWDdtzb2PVjnB2mCIiIiIiQDmf1Fgql7uurE5VDxf2nkrjq9/+HE7YpCVcEQPGjn3aR+j7ABEREREpj5RsiVP5e7ky5opqAMRujeNAYhoAtsF3gLsH7NqGWb/CmSGKiIiIiFwSJVvidJ3DfWlTy4dMO7z741Gy7AYrKASr72AAzKyPMedSnByliIiIiEjRKNkSp7Msi3vaVqeKm41d8al8syMhe3mvgVCtBiQlYL6NdXKUIiIiIiJFo2RLyoQgbzdu/3M44bRf4zh0Og3LzQ3bsDsBMEv+hzlywJkhioiIiIgUiZItKTO6R/rRskYVMuyGyT8eyx5O2PwKaNEWsrKwz/i3imWIiIiISLmhZEvKDMuyuL9dKJ6uNrafPMe8nacAsA0dDa5usP1X+Hm1k6MUERERESkcJVtSpoRUcePWVtnzFny26STHzqRjhYRi9bkBAPvM/2JSzzkzRBERERGRQlGyJWVO7yh/mlX3Ji3LMHndMYwxWNfcAMHV4VQcZt4sZ4coIiIiInJRSrakzLH9OZzQ3cViy/EUFu5OxHL3yB5OCJhFX2OOHXZylCIiIiIiF6ZkS8qkGlXdGdkyezjhJxtPcjI5I7tQRrMrICsT+4x/qViGiIiIiJRpSrakzLq2QQCNgr04l2nng3XHALANGwOurvDbL7BpnZMjFBEREREpmJItKbNcbBYPtA/FzWax8WgyP+xJwqpeM3uyY8AeOwWTnubkKEVERERE8qdkS8q02n4eDI8OBuA/G08Qn5KB1XcwBAZD/AnM/C+dHKGIiIiISP6UbEmZd33jQOoHepKcbufDn46Duwe2IXcAYBZ8iTl5zMkRioiIiIjkpWRLyryc4YSuNlh/6Cwr95+B1jHQuAVkZmCPneLsEEVERERE8lCyJeVCeIAng5tlDyf814bjJKVlYRt+J7i4wK/rsW9ah/l9C/Z1yzG/b8HYs5wcsYiIiIhUdpZR/exCO3nyJBkZGc4Oo9LKtBseXbCPvafS6FC3Ko93qoV99seYhXPAZgO7/a/GAUHYho3Bah3jvIBFREREpMJxc3MjJCSkUG3VsyXlhqvN4oH2NbBZsPrAGdYeOAO1I7JXnp9oAZyKx/7PVzEb15R+oCIiIiIiKNmScqZeoCeDmgQB8OFPxzj9TewF29tnTNGQQhERERFxCiVbUu4MbR5EbV93ElOz+G9wxws3PhUHu7aVTmAiIiIiIudRsiXljruLjQevqoENw/LQK9gQ2OiC7U1iQilFJiIiIiLyFyVbUi41DPaif/Xs+7Q+bDiIZBfPAtta/oGlFZaIiIiIiIOSLSm3RnRugE/mORI8/Pm03rV51s8M686MRtdBVBMnRCciIiIilZ2SLSm3PN3daBdkAbC4Zjs2BUQ51s0M686MiN64NGuFZXNxVogiIiIiUokp2ZJy7cF+LYnyzJ777I0mN3HOxd2RaA13Ociw3q2dHKGIiIiIVFaa1LgINKlx2XQuw84dc3aTnGHHhsGOxbC9CxmSvhPb8++qZ0tEREREio0mNZZKxcvNxmOdagFgx8LVgiFx6+HoQczaZc4NTkREREQqLSVbUiHsjDvn+H+mgVld7gbA/G8aRr2RIiIiIuIESrak3IvdEse0zXH0iPQDwGbB9JQQZjbsDwknMcvnOzlCEREREamMlGxJuZaTaI2IDuaBq2oQXd0bu4H6gZ7MqNGJmWHdMd/NxKSmODtUEREREalklGxJuWY3hhHRwQxtHgzAsD//3ZeYyoCG/th9/ODsacz3/3NmmCIiIiJSCSnZknJteHSII9ECaFrdm+jq3mTaIS0LhneoD4BZNAdzJslZYYqIiIhIJaRkSyqcYdHZydfiPxI52agN1K0Hqecw82Y7OTIRERERqUyUbEmF07SaN9Gh3mQZmL0tAdvAkQCYZfMw8SedHJ2IiIiIVBZKtqRCGv7n0MIlfyRxPKwZNGwOmRmYudOdHJmIiIiIVBZKtqRCalLNmxY5vVu/xf/Vu7XmB8zRQ06OTkREREQqAyVbUmHl9G79sCeJE9UjoWU7MHbsX3/u5MhEREREpDJQsiUVVuNq3rT8s3dr5tZ4bNePBMuCjWswe3c5OzwRERERqeCUbEmFllOZcOmeJI77hmK17wqAfc5UJ0YlIiIiIpWBki2p0BqHeNOyRhWyDMz6LR5rwAhwcYXtv2K2/+rs8ERERESkAlOyJRXe+fduHfcIwOraBwD7V1MxxjgxMhERERGpyC4p2Tp16lRxxyFSYhqFeNGqRhXsf967ZfUdDB6esG8X/LLW2eGJiIiISAV1ScnWPffcw4QJE1ixYgWpqanFHZNIsRuec+/W3iSOWd5YPa8DwP71F5isLGeGJiIiIiIV1CUlW0OGDOHUqVO8//77jBkzhnfffZdNmzZht9uLOz6RYtEw2IvWf/Zuzdoaj9XzeqhSFY4exPy41NnhiYiIiEgFZJnLuGll7969rFy5kjVr1nDq1Cl8fX3p0KEDnTp1ol69esUZZ5lw8uRJMjIynB2GXKLf487x+ML92Cz4oH8k1dd+h5n1MQQGY5vwIZabu7NDFBEREZEyzs3NjZCQkEK1vaxkK4cxhq1bt7Jq1SrWrVvHuXPnqFmzJp06daJz584EBwdf7iHKBCVb5d+LSw/y85Fkro7048ErArE/fTckxmMNvQNbj+ucHZ6IiIiIlHFFSbaKpRqhZVk0btyYVq1aERUVBcCxY8eYNWsW999/P2+99ZaKakiZMOzPyoTL9iZxLM3CGjAcAPPdLExqijNDExEREZEK5rJ7ts7v0UpJSaFu3bp06dKFjh074uLiwtKlS5kzZw6RkZE8++yzxRW3U6hnq2L4q3fLlwfbVsc+/n44fhir/3BsfyZfIiIiIiL5KUrPluulHGDfvn2sWrWK1atXk5CQgL+/P1dffTVdunShbt26udoOGDAAd3d3Pvvss0s5lEixG9Y8mJ+PJLNs72kGNw2mxvU3Yf/oNcyirzHd+mJV9XN2iCIiIiJSAVxSsvXEE0/g7u5OmzZt6Ny5M9HR0dhsBY9IrF27Ng0aNLjkIEWKU4NgL66sWYUNR5KZuTWOf7SPgbD6sH83Zt5srKF3ODtEEREREakALmkY4bJly2jfvj2enp4lEVOZpWGEFceu+HM8uiC7MuHkfpHUPPgb9knjwdUV24SPsIIK1zUsIiIiIpVLiRfIiIuL48SJEwWuP3jwILNnz76UXYuUiqig7N4tu4GZW+OgSUto2BwyMzFzpzk7PBERERGpAC4p2Zo1axYHDhwocP3BgweZNWvWJQclUhqGRWdXJlyx7zSHz6RjGzgSALNmKeboQWeGJiIiIiIVQLGUfv+7s2fP4up6SbeDiZSaqCAv2tTK7t2atSUeq14jaNkejB371587OzwRERERKecKnRFt27aNbdu2OX5ft24dx44dy9MuOTmZNWvW5KlKKFIWDWsewk+Hk1mx/zSDmwdR6/qbsf+6HjauxezdhRUR5ewQRURERKScKnSy9dtvv+W6D2v9+vWsX78+37a1a9fm9ttvv/zoREpY/SBP2tTy4afDZ5m5JZ6HO9TFat8Vs/YH7HOm4vLw/zk7RBEREREppwpdjTA9PZ20tDSMMYwZM4YxY8bQrl273DuzLNzd3XF3dy+RYJ1N1Qgrpj8SUnl4/j5sFrx3bQS1MhKxP3sPZGZie+hFrCYtnR2iiIiIiJQRJVKN0N3dnapVq+Lr68vkyZPp1KkTVatWzfXj4+NTYRMtqbjqBXrStrYPdgOxW+OxgqtjdekDgP2rqVzC7AgiIiIiIpdWICMkJAQPD4/ijkXEaYY3z65MuHLfaQ4lpWH1HQwenrB/N2xc6+ToRERERKQ8KtQ9W/fddx82m423334bV1dX7rvvPizLuuA2lmXx3nvvFUuQIiUtMtCTdrV9WHfoLLFb4nmkY02sntdjvp2Bfc5nWF5V4Ewiln8gRDXBsrk4O2QRERERKeMKlWw1adIEy7Kw2Wy5fhepSIY1D2bdobOs3H+aIc2DqN3reszir+H4YczbzwJgAAKCsA0bg9U6xpnhioiIiEgZV+gCGaICGZXBy8sPse7QWTqFVeUR7/3Y//lqgW1t94xTwiUiIiJSyZRIgQyRymDYn/durdp/hv1zvrpgW/uMKRh7VmmEJSIiIiLlUKGGEZ4/mXFRNGnS5JK2E3GWyEBP2tfx4ceDZ5kZeCWPHNtZcONTcbBrGzRsXnoBioiIiEi5Uahk64UXXrikncfGxl7SdiLONKx5MD8ePMuakGgGey+hbsrxAtuaxAR096KIiIiI5KdQydb48eNLOg6RMiMiwJP2/nZ+TLQxM7wHj277osC2ln9gKUYmIiIiIuVJoasRilQmw9qH8+OCA6wNac7+KtUJS86ndysgGKL0tyEiIiIi+VOBDJF8RAR5c1XVdIxlY1ZYj3zbWENu13xbIiIiIlKgQvVsffDBB1iWxV133YXNZuODDz646DaWZXHPPfdcdoAizjKsUwPWztvHmmot2L9/cd7erZPHnBOYiIiIiJQLhUq2fvvtNyzLwm63Y7PZ+O233y66jSY9lvJu7cEz1PFz52BSOrN6PcRjQSex/AOxnzjKzOXbsf9yjBFN/sAKq+fsUEVERESkDNKkxkWgSY0rl9gtcUzbHOf4/Z2+4YQHeDJj80mmb4ln2N6FDEnbge2ZSVgeHk6MVERERERKS4lPahwXF0d6enqB69PT04mLiytwvUh5MLR5MCOigx2/x26NJ3ZLHNO3xDO8UVWGJP0Cxw5jZv/XiVGKiIiISFl1ScnWfffdx/r16wtcv2HDBu67775LDkqkrBjaPJi+DfwBWHPgDNM2xzEiOphhV9TCdts/ADDL5mN+/cmJUYqIiIhIWVQi1QgzMzOx2VToUCqGu9qE5pq4+PrG2XNrWU1aYfW4DgD7p+9iTp9yQnQiIiIiUlYVOiNKSUkhLi7OMTzwzJkzjt/P/9m/fz9r1qzB39+/pGIWKVWxW+I4/8bGZxcfcPzfGjQSaoXBmSTsn7yHboEUERERkRyFLpAxa9YsZs+eXegdDx06lEGDBl1yYGWRCmRUPjlFMkZEB1M/0JMXlx0C4OpIX/5xVU0AzKF92F96BDIzsG66G1vXvs4MWURERERKUFEKZBSq9DtAixYt8PT0xBjDF198QYcOHYiIiMjVxrIsPDw8iIyMpF49lcOW8u38RGto8+xCGb3q+7FodxI/7DlNkJcrN7eshlU7HOuGWzCx/8HM+i+mYTRWjdpOjl5EREREnK3QyVaDBg1o0KABAGlpabRr1466deuWWGAizmY3JleiBXBb62psOprCieQMfj6SzM0ts5dbV/fHbPkZtm3CPuVNbE++huXq5pzARURERKRM0DxbRaBhhAKw9XgKT/9539azXWtzZS0fAExiPPYXHoSzZ7CuuQHbDaOcGaaIiIiIlICiDCO8rGRrx44d7N27l5SUlHwLA9x4442XuusyScmW5Jjy83Hm7jhFgJcr710bQVUPFwDMxrXY//kKWBa2R17CatjMyZGKiIiISHEq8WTr7NmzvPLKK+zevfuC7WJjY4u66zJNyZbkSMu089D8fRw+nU7nMF8e6VjTsc7+6XuYVd9DYDC28e9iefs4MVIRERERKU5FSbYuaTKszz77jAMHDvCPf/yD9957D4Cnn36ad955h549exIeHs5HH310KbsWKRc8XG2MvaoGNgtW7D/N6v2nHeusoaMhJBQS4jBffOjEKEVERETEmS4p2frll1/o0aMHMTExeHl5AdmVCENDQxk9ejQhISF88sknxRmnSJnTINiLG5oEAfDPn46TeC4TAMvTC9voR8Bmw6xfgf3HZU6MUkRERESc5ZKSreTkZOrUqQOAp6cnAKmpqY710dHR/Prrr8UQnkjZNrR5MBEBHpxJy+L99ccc9y5akQ2x+g0DwEz7EBN33JlhioiIiIgTXFKyFRgYSGJiIpA9ZtHX15f9+/c71ickJGBZVrEEKFKWublYjL2qBq42WH/oLEv3njecsO9gqNcIzqVg/+/bGHuWEyMVERERkdJ2SclW48aN2bx5s+P3mJgYvvnmG7766itmz57NvHnzaNq0abEFKVKWhQd4Mrx59k2S/95wnJPJ2UVULBcXbHc8DB5esGsbZsFXzgxTRERERErZJSVb/fr148orr3RU5hs8eDANGjQgNjaWWbNmERkZye23316sgYqUZQObBNIw2JOUDDvv/Xj0r+GEIaFYw+8EwPxvGmbfLmeGKSIiIiKlqFgnNU5OTsZmszmKZlyqBQsWMHfuXBITEwkLC+P222+nfv36+bZdt24dc+bM4dixY2RlZREaGkr//v3p3LkzAJmZmcyYMYNffvmFEydO4O3tTfPmzRkxYgSBgYFFikul3+VCDp9OZ+y8vaRnGe5qU52+DQIAMMZg/2gi/LwGqtfC9uzbWB6eTo5WRERERC5FqU1qXBLWrFnD5MmTGTNmDFFRUXz33Xf8+OOPTJo0CT8/vzztf/vtN5KTk6lZsyaurq5s3LiRqVOnMm7cOFq2bElKSgpvvvkm3bt3Jzw8nLNnz/LJJ59gt9t59dVXixSbki25mLk7Epjy8wk8XCzeuTaCGlXdATDJZ7A//yAkxmN1vgbbyHudHKmIiIiIXIpiT7aWL19+SYF06dKlyNs89dRT1KtXjzvuuAMAu93OPffcQ58+fbj++usLtY8nnniCVq1aMWzYsHzX7969m6eeeooPPviA4ODgQsemZEsuxm4Mzy05yJbjKTQO8eKlHnVxsWUXizHbf8X+1rMA2O57GqtlO2eGKiIiIiKXoCjJlmthGn3wwQeXFEhRk63MzEz27NmTK6my2Ww0b96cnTt3XnR7Ywxbt27lyJEj3HTTTQW2S0lJwbIsvL29812fkZGRK6myLOuyh0ZK5WCzLB5oH8o/vtvH9pPn+GZHAoP+nIvLatwCq9f1mEVfY//0PWwRDbD8ApwcsYiIiIiUlEIlW5MnTy7pOAA4ffo0drsdf3//XMv9/f05cuRIgdulpKRw1113kZmZic1m44477iA6Ojrftunp6XzxxRd06NChwGRrzpw5zJ492/F7REQEEydOLPoJSaVU3cedO66oxuR1x/ji1ziurOlDXX8PAKzrR2K2bYJD+7ITrgee1TQJIiIiIhVUoZKtwnaTOYunpyevv/46qampbNmyhalTp1K9evU85eczMzN5++23ARg9enSB+xs4cCD9+vVz/K4Pw1JUPer58ePBM2w4ksyktUd4rXc4rjYLy80N2+hHsU94CLZswCybh9XtWmeHKyIiIiIloFDJ1oUcOnSIkydPAtlJWe3atS95X76+vthsNseEyTkSExPz9Hadz2azERoaCkB4eDiHDx/m66+/zpVs5SRacXFxPPfccwX2akH2OEw3N7dLPg8Ry7K4r30NHvh2D38kpDFraxzDo7O/tLBq1cW68VbMjH9jZn2MPaopVvIZTGICln8gRDXBsrk4+QxERERE5HJdcrL1008/MXXqVE6cOJFrebVq1Rg1ahRXXnll0YNxdSUyMpKtW7fStm1bILtAxtatW7nmmmsKvR+73Z7rnqucROvYsWOMHz+eqlWrFjk2kaIK9HLlrjahvLn6CDO3xtOmVlXqB2WXfLeu7ofZsgF++wUz4SFMVhYABiAgCNuwMVitY5wXvIiIiIhctkua1Hjjxo28+eabAAwfPpzHHnuMxx57jOHDhwPwxhtvsGnTpksKqF+/fixZsoRly5Zx6NAhpkyZQlpaGl27dgWy7x+bNm2ao/2cOXPYvHkzx48f59ChQ8ydO5eVK1fSqVMnIDvReuutt9izZw8PPPAAdrudxMREEhMTyczMvKQYRQqrc7gvHepWxW5g0tojpGfZgeyeL+uKDtmN/ky0HE7FY//nq5iNa0o5WhEREREpTpfUs/Xll18SFhbGCy+8gKfnX5OzXnnllVxzzTU899xzzJo1i5YtWxZ53zExMZw+fZqZM2eSmJhIeHg4Tz31lGMYYVxcXK57qNLS0pgyZQrx8fG4u7tTq1YtHnjgAWJisnsFEhIS2LBhAwCPP/54rmONHz8+z31dIsXt7jbV+e1ECgeT0vni1zhua10NY8/CzJ1+we3sM6Zga9lOQwpFREREyqlLmtR45MiRDB8+nL59++a7ft68eUyfPp3PPvvssgMsSzTPllyq9YfO8NLyw1jAyz3r0vjUH9jfePqi29kefQmrYfOSD1BERERECqUo82xd0jBCNzc3zp49W+D6s2fPqsCEyHna1q5K90g/DPDO2qOkJJwq1HYmMaFkAxMRERGREnNJyVazZs2YN29evhMN79q1i/nz59O8ub6NFznfHVdUI8TblWNnM5h6JqhQ21j+gSUclYiIiFQGxp6F+X0L9nXLMb9vwdizLr6RXLZC37N19uxZfHx8ALjpppvYvn07zz77LPXr16dmzZoAHDlyhN27d+Pn58dNN91UMhGLlFNV3F144KoaPLfkIAtOutC2zhW0PPhzwRsEBENUk9ILUERERCqc6ZtPYh09yOAl78GpeOCv6sezuj+AqVHHMT2NFL9C92zdeeedvP766/z4448EBgbyxhtv0KdPH5KTk1mzZg1r1qwhOTmZvn378vrrr1OtWrWSjFukXGoRWoVrG/gD8H7DG0l29SywrdVviIpjiIiIyGWxjh5kepw3M31b5lo+07cl0+O8sY4edE5glUShe7bat2/Phg0b2LBhA15eXrRt25aOHTsyatSoXNUBReTCbmlVjY1Hkzl6Bv577dM8sGKS45smAFxcICsLs3oJJqY7lqvufxQREZGiM/YsBi95D+PbkhkRvTnhEcC1R1bzU1ATZkT0ZtjehQz+9VdMz3/rC94SUqRqhOnp6axfv55Vq1axefNmsrKy8Pf3p0OHDnTs2JHIyMiSjNXpVI1Qisv2kymMW3QAgHGdatD+3AFMYgKWfyDGP4jYT77BnpnJ8Ppe2IaOdnK0IiIiUh6Z37c4qh+PbzGGLQFRjnVXxm3jH9tnUCUrVdWPi6go1QgvqfQ7ZN/DtXbtWlatWsWOHTsAqFGjBp06daJjx45Ur179UnZbpinZkuI0btF+tp88h4erxb+vq4efZ3ZHc+yWOKZtjmPY3oUM2b8E291P/DUBsoiIiEgh2dctx0x5k5lh3ZkR0TvPeo+sdGJO/Eqven40uq4fNtsl1c6rdEol2TpfQkICq1atYvXq1ezbtw+AqKgoJkyYcLm7LlOUbElxysiyc8ecP0hKy6KOrzvv9Ytg5tZ4pm2OY0R0MIN/n4tZOAc8vbA98zZW9ZrODllERETKEfuOzcTOXsaMiF6OZa72TDJtrlRNP8sZdx/H8jpp8fQIyqJbp2j8Av2dEG35UerJVo4DBw4QGxvLhg0bAIiNjS2uXZcJSrakuO1JSOXh+fswgIsFWQZGRAcztHkwJjMT+5vPwO5tUDsc25OvY7l7ODtkERERKQeM3c70aQuItf66zSdn1ExOT1f3I+uwu7qxOqgZ6S7uQHYy1t5+nJ6NQmh+ZVNcXHQv19+VarIVFxfn6NU6cCD7HpQGDRrQqVMnevXqdZGtyxclW1IScoYNArja4MvhjRzrTGI89hfHwpkkrI49sY16wElRioiISHlh7FlM/2IBsbZ6jmU5iVaOnIRreHAK17arz8pVv7LoBOz1+CuJCE1LpIdfKld3aEpQqMrD5yjxZOv06dOO+7VyJjauWbOm436tilr2XcmWlITpm08yY8tf1QiHNgtiRIu//oDN9l+xv/0cGIN16z+wdejujDBFRESkHDBZWUz/fB6xrtnFMKI902jqk5Vrni0AAoKZ1f3+PPNs7fptF9//sp8VWcGc+3OKGpvJ4srM4/Sq70+r9tG4uha6oHmFVCLJVmpqKuvXr2f16tVs2bKl0lUiBCVbUvxyerWuaxTAkj1JnE23A38NJcxh/3YG5ptp4O6O7ck3sGqHOyliERERKavsGRlM/+w7Znpkj5K5NSSZgb2uALJ7u9i1zVH9mKgmFyz3fi45hVUrN/H9kQx+9/ir8F1Q+mm6V0mmR0wjqteuUbInVEaVSLI1cuRI0tPT8fT0pF27dnTs2JFmzZpVqqolSrakOOUkWjmJ1dqDZ3h1xWHH+vMTLmO3Y3/3BfjtF6heC9vTb2J5eTsrdBERESlj7OnpTPvsO2Z5Ngbg1urnGNijVbHse//OfXy/4Q+WZgRw1jX784dl7LTIOE6vcB/axLTA3cO9WI5VHpRIsvXaa6/RsWNHrrzyStzdK8/FPJ+SLSlO0zefxGZZuXqwPvrpGPN2JuLhYnFNlD+3X/HXN0nmzGns/zcWTsVhXdkR687HNKG4iIiIYE9L5Yup3zHbuykAt9VI4/qrWxT7cdJT01m7+he+35/CFo+/erX8Ms7SzTOJnm0bUDuyTrEft6xxWjXCik7JlpS09Cw7jy3Yz77ENKJDvXnh6jrYzkuozB87sL/+JGRlYQ2/E9vV/ZwYrYiIiDibPfUcX3z6HbN9mgFwe60Mruta8hMUH9l3iMXrdrLknC+Jbn+VkG+SdoyedTyJ6dgCTy+vEo/DGZRslRAlW1IaDiWl8fD8faRlGUa2COHGZkG51tsXf4OJ/Q+4uGJ7/BWsyIZOilREREScyX4umS8++ZbZvtm9WLfXyeK6zk1LNYaM9Aw2/LiZ7/9I4he3UOxW9i1GVTLP0dU1gZ5XhBPRqN5F9lK+KNkqIUq2pLQs/iOR9348hs2CV3qG0Sjkr2+GjDHYP5wIG9dAYAi2Z9/G8vF1YrQiIiJS2uzJZ/j80+/40q8lALeHwXUdG114oxJ24vAxlqzdzuIz3sS5+zmWR6WdoGcNFzp1bIF3VZ8L7KF8ULJVQpRsSWkxxvDWmqOs2HeaalVcebtPBD4ef1UMMinJ2F96GE4cheZXYrv/GaxKVKxGRESkMrOfPc1nn37HV/7ZBTDuiLAYEFN2RrpkZmayef1WFu6M5yeXULL+rHromZVGRyuOXi1qE9UsqtwW2lOyVUKUbElpSsnI4qF5+zh2NoOr6lTliU41cxXEMAf2YH/1cchIxxo4ElvfwU6MVkREREqD/XQin02dx1cBrQEYXc+F/u2jnBxVwU6djOeHVVtZfMqdIx4BjuVhaXH0DDZ07dSCqgHla4SOkq0SomRLStuu+HOMW7SfTDvc3aY6fRoE5FpvX7kIM3UyWDZsD7+I1SjaSZGKiIhISbOfimfqZwuYE5Q9d9boKDf6ty0f90PZ7Xa2/bKNRb8dZy3VSHdxA8A9K4OrOEHPJtVp2rpJvr1dRZ0jrKQp2SohSrbEGb7ZnsB/N57A3cXi9d5hhAd4OtYZYzAfv4NZ+wP4+mN7dlL2i5CIiIhUKPb4k3z6+UK+Dr4SgNENPOjfJsLJUV2aM6dOs3zVryw6abHf468pcGqmnaJHQDpXd2xGQEgQ0zefxDp6kMFL3oNT8X/tICCIWd0fwNSow/DowiU9xUnJVglRsiXOYDeGCcsO8fORZGr7uvNmn3A8Xf/61sekpWF/5VE4vB8aNMP28P9huTjv2x4REREpXvaTx/j0i+/5OqQNAGMaedHvijAnR3X57HY7u7buYtGvh1hlgkl18QDAxZ5Fm6xjeHp6sCwrmGF7FzJk/xLHdjPDujMjojfDg1MY1rt1qcetZKuEKNkSZ0lKzeQf8/Zx6lwmPev5cX/7GrnWm2OHsE94BNLOYfW5EdugW5wUqYiIiBQn+/HDfDJ9Cd+EtAXgzsbeXNu6rpOjKn4pZ86yctWvfH80i10e1RzLvTNSSHHzZsCB5dy65ztHojVs70KGnP4V26v/LvUhhUq2SoiSLXGmzceSeW7JQQzwaIeadArPfTOp/adVmH+9BoDt/mexWrRxQpQiIiJSXOxHDvJx7A/8r1o7AO5s6sO1LWs7OaqSt3fHHyxas53ltpoku3k7llvGjrFsuXq6bI++hNWw5CdxPl9Rkq3yWW9RpBKKDq3C4D8nOP5g/TGOnUnPtd7WpiNWt2sBsP/3bUzc8VKPUURERIqH/dA+/jtjiSPRuqt51UqRaAFENKrHmKZVmbJ2Av/YNp2miX8AYCwbrvbMXEMKTWKCs8IsFCVbIuXIsObBNA7xIiXDzhurj5CRlbtj2hp8O4RHQcpZ7B+9hj0tFfP7FuzrlmN+35JdzUdERETKNPv+3fw3dilzq7cH4O5oP/pG13JyVKXL8g/Ew55JlxO/0PzUbiD7Xq5Mmyszw7rnaleWaRhhEWgYoZQFJ5MzGDtvL2fT7QxsHMitravlWm/iT2B/cSyknAUPT0hL/WtlQBC2YWOwWseUbtAiIiJSKPY9v/PfOWuYG3oVAPe08OeaZqFOjqr0GXsW9nGjmenb8q97tPYvKXf3bKlnS6ScCani5iiQMWd7AhuPnM213gqqhtXlmuxfzk+0AE7FY//nq5iNa0ojVBERESkC+65t/Oer8xKtVoGVMtECsGwuzOr+QK5EC2DI/iUM27uQGRG9mdX9fqfOt1UYSrZEyqGr6lSlbwN/ACatOUrCuUzHOmPPwvy49ILb22dM0ZBCERGRMsS+YwtTvlnHtzXOS7SaVLvIVhWbqVGH4cEpDDm9KdfyIad/ZXhwCqZGHecEVgQaRlgEGkYoZUl6lp3HFuxnX2Ia0aHevHB1HWyWlX2P1htPX3R7Z1TvERERkbzsW39hyvxf+K5m9jD/e1sH0btx6U/WW1YZexbs2oZJTMi+RyuqiVN7tDSMUKQScHex8VjHmni4WGw+lsJXv2VX4ylsVZ6yXr1HRESkMrBv+il3onVFsBKtv7FsLlgNm2Nr1wWrYfMyP3TwfEq2RMqx2n4e3NmmOgBfbD7JjpPnCl2Vp6xX7xEREano7D+v4d+LtjgSrfuuDKF3o2AnRyXFScmWSDnXPdKPzuG+2A28ufowZ8MaQkDQhTcKCIaoJqUToIiIiOSRtW4F/1qyg3m1YrCM4b421ejV8CLv31LuKNkSKecsy+KettUJ9XHjRHIm768/iTV0zIW3GTiyXHXBi4iIVCRZq5fw7+W7mZ+TaLWrTq8GGnFSESnZEqkAvN1ceLRjTVxtsPbgGRZWbYztnnF5e7hs2X/yZtOPqDaOiIhI6ctavpB/rd7vSLTubx9KzyglWhWVqhEWgaoRSln3zfYE/rvxBO4uFq/3DiPMzy1X9R7j6oZ5/SnIysQaege2Htc5O2QREZFKI2vJt/zr5xMsqBWDheH+9jXoUc/f2WFJEakaoUgl1b9RAFfUrEJ6luH1VUdIs1u5qvfY6jXCGnI7AGb2J5jd250csYiISOWQuXAOH52XaD2gRKtSULIlUoHYLIt/XFUDT1eLQ6fTmbLheJ42M4PbERtzB2RlYf/X65gzp50QqYiISOWR+e1M/vVrIgvPS7S6K9GqFJRsiVQwfp6uxNStCsD3fySxct9fyVTsljimb4nH1rIthNaCU3HY//Mmxm53VrgiIiIVljGGzDmf89H2FBbWugoLw4NX1VSiVYko2RKpgP5xVU2aVvMC4J21Rzl2Jp3YLXFM2xzHiOhghrWqge3uceDuDr/9gpk308kRi4iIVCzGGLJmf8KHuzNZVLM9FoZ/XFWTqyP9nB2alCIVyCgCFciQ8iTLbrjzmz+IS8nEAgwwIjqYoc3/mizRvmYJ5uN3wLKwjX0Bq0lLZ4UrIiJSYRhjyJoxhQ8PufN9zXZYGMbG1KRrhBKtikAFMkQEF5vFq73CgOxEy7LIlWgB2GK6Y3XqBcZgn/Im5lS8EyIVERGpOIzdTtbn/+SffyZaNiValZqSLZEK7Ic9SY7/GwMvLz+Up401bAzUiYAzSdkFMzIzSzNEERGRCsPYs8j69D3+eawKi/9MtP6hRKtSU7IlUkGdf4/WiOjsHq11h87ywbqjudpZ7h7Y7n4CvLxh9zbM1585I1wREZFyzWRlkfWft/kgPsCRaKlHS5RsiVRA5ydaQ5sHM7hZEG1r+wCwcHcSn/5yIld7q1pNbLc+CIBZOAez6cdSj1lERKS8MpkZZP7rdT5IqsaSGm0diVYXJVqVnpItkQrIbkyuYhg2y2LsVTWo5esOwMr9p8my566NY7WOwepxXfb2/30Hc/JY6QYtIiJSDpmMdDL/+Sr/TK7pSLQe6lBLiZYASrZEKqTh0SF5imFUcXfhyc618HS1cTI5k0/+1rsFYN0wCuo1gnPJ2D+ciMlIL62QRUREyjxjz8L8vgX7uuXZ/6amkDn5JT5IC8+VaHUO93V2qFJGqPR7Eaj0u1QEaw+e4dUVhwF4OKZGnm/eTMJJ7P83Fs6ewepyDbab73VClCIiImWL2bgG+4x/w3mVe7Nc3fmg3nUsrdEGG4aHO9SikxKtCk+l30WkQFfVqcrgpkEATF53jD0JqbnWW4Eh2O54BCwLs3wB9h+XOSFKERGRsmPawl+YMe+n3IkWFh/Uv56lNdoAhkc6KtGSvJRsiVRCw6ODaV2jCulZhldWHOZ0Wlau9Vaz1ljXDgXAfPY+5sgBZ4QpIiLidMaehbVlAzMiejMzrDuQnWi932gwS0OvBKDDqR10qFPFmWFKGaVkS6QScrFZPNKhJqE+bpxIzuDN1UfyFszoPxQat4D0tOz7t1LPOSlaERERJ9q1jSG/z2XY3oXMiOhNbFgPJjcawrKcROvEJh759WPYtc3JgUpZpGRLpJLy8cgumOHhYrHpaDJf/Hoy13rL5oJt9CPgHwhHD2I+/wDd4ikiIpWNSUwAYMj+JQzdu4jYiF4sD70C+DPR2jYtVzuR8ynZEqnEwgM8ub99DQC+3JbA6gOnc623fP2x3fk42GyYdcsxKxY6I0wRERGnsfwDAUhx8eB3vzDHchd7liPROr+dyPmUbIlUcp3Dfbm+cfYbxLtrj3IgMS3XeiuqCdagUQCYGf/C7N9d6jGKiIg4gzEG+x87iPPw4+lW97ApsCGQnWhl2Vwc93AREAxRTZwYqZRVSrZEhFtahhAd6k1qpuGVFYc4m/63ghm9roeW7SAzM/v+reSzzglURESklJiMDMzH77D3+8WMa30/+31qAtDr8FpmrXjScQ/XzLDu2IaNxrK5ODliKYuUbIkILjaLxzrUJMTblSNnMpi05gj28+7PsiwL223/gODqEHcc+yfv6P4tERGpsMyZJOxvPcuG34/wdMt7SfDInpOy/4n13L1rDpB9D9ewoyuzEy63Bs4MV8owTWpcBJrUWCq6PxJSGbdoP+lZhmHNgxgenXvCPrN/N/ZXH4fMTKwbb8PqOQB2bcMkJmSPVY9qom/2RESkXDOHD2Cf/H8sdI/g31HXY7dsVKviSudwX26ODsrzvjfzt1PYjcnznikVV1EmNVayVQRKtqQy+GFPEu+sPQrAU11q0a521Vzr7csXYD7/ACwLqvjC2aS/VgYEYRs2Bqt1TGmGLCIiUizM1p/J/NcbfF6jC1/X7QrA1ZF+3Ns2FDcXy7nBSZlRlGRLwwhFJJerI/24toE/AJPWHOXQ6b8VzOjcO/smYGNyJ1oAp+Kx//NVzMY1pRStiIjI5TPGYF8yl3OTX+HNiIGOROum6GAebK9ESy6dki0RyeP2K6rTJMSLlAw7ryw/TErGeQUzjB1OHrvg9vYZUzD2rAu2ERERKQtMZibmi3+S+OU0xkePYW21aFxt8FBMDYY0D8aylGjJpVOyJSJ5uNosHu9Ui0AvVw6dTufdtUf/KoixaxtcbOLGU3HZ7URERMowk3wW+7svcGj9z4xrfT87/cLwcbfxwtV16Rrh5+zwpAJQsiUi+QrwcmVc51q42izWHjzLl79lJ1jmYonWnwrbTkRExBnM8SPYX3mM346c5skr7uO4VxChPm5M7B1Gs+rezg5PKgglWyJSoIbBXtzVpjoAn/96ko1HzmZXXyqEwrYTEREpbWb7r9hffpQVJoQXWozhrKs3DYI8mdg7jNq+Hs4OTyoQJVsickG96vvTq74fBnhz9RGO1YiCgKALbxQQnF1EQ0REpIyxr1hA1jvPMyukLZOajCDT5spVdaoyoUdd/D1dnR2eVDBKtkTkou68sjoNgjw5m27n1ZVHSR8y5oLtrauv1XxbIiJSphh7FvbYKWR8/iHv1x/E9IhrALi+cSCPd6qJh6s+Fkvx07NKRC7KzcXGuM618Pd0YV9iGh+khmPdPS5vD5erGwBm0deY40ecEKmIiEhe5lwK9skvcXbZIiZE38EPNdpgs+DuNtW5rXU1bKo4KCVEkxoXgSY1lsrutxMpPLv4AFkGbm9djQEN/WDXNkxiApZ/IKZOBObNZ+HAHxBUDdu413TvloiIOJWJO4598gROxCXxUos7OOhdHU9Xi8c61uLKWj7ODk/KoaJMaqxkqwiUbInAd7+f4l8bjmMBL3avQ3RolVzrZ2w4RNaq7xn22xyoHY7tsVewvKvkvzMREZESZHZvw/7BK+ymKi9H306imw+BXq4827U2kYGezg5PyqmiJFsaRigiRdK3gT8R/h4YYMKyQ5xM/usLiNgtcUz//Swu7buBXwAc2of9/ZcwGenOC1hERCol+9ql2N98hp/ca/Jsq3tIdPMh3N+D168JU6IlpUbJlogUiWVZTOwdRoCXC2lZhscW7ict007sljimbY5jRHQww9qHY3twPHh5w86t2P/9Bsae5ezQRUSkEjB2O/avpmL++zbfVW/LxGa3kmZzo1WNKrzSqy7B3m7ODlEqEQ0jLAINIxT5y4mzGdz37R7SswwWYIAR0cEMbR7saGN+34J90vOQmYHVuTfWzfdi6SZkEREpISYtFft/3yZr4498Wq8f39bpBECv+n7c1SYUV5veg+TyaRihiJS4aj5uPNu1NpCdaFnA4Gb/396dh0dV3X8cf987k5XsCUmAhBB2BCKbqICyibi2LohArW0VftK6Vq1b64K74tYWte6VWjZRqAvuIogogoAEkH0NmEB2smdyz++PgYHIlgDJJOHzeh4emDt37nwHBpjPnHO+p3p3QqtTd+xxt4FlYeZ/gnlvav0XKiIiJwWTl4Pz5N2ULV/CxO6/8wWtq3s05099FbTEPxS2ROSY/bS71PdrA9z5yVZ+OVhu9eqHNWa895wPpuHMnVOfJYqIyEnAbFmP88ht5GVmcW/v6/k+9hQCbIvb+7fk8q6xmlUhfqOwJSLH5MA1Wrec2QKAdTll3PPZtoPOtQedj3XxaADM1JcwSxbUa60iItJ0mR++wZl4N9sr3dx12i1sbNaS8CAXDw1N5qw2Ef4uT05yClsiUmsHBq0ru8cxuG0k409LAGD17lLu/eLgwGVdPApr0PlgDM5rz2B++rGeqxYRkabEGIPzwXScfz1Bemgyd/e5id0BEbQID2Di8BS6xIf6u0QRhS0RqT3HmIOaYZzfMZo/9PIuFl2RWcL7a3KrPcayLKzR/we9+4HHg/PCo5htG+u1bhERaRpMZQXm1Wcw//svcxN682CPcZTYgXRpHsKT56bQIjzQ3yWKAOpGWCvqRihydNNWZDM1PRuAG05PZFj7qGr3m8pKnL8/AGvTITwS+64nseJb1H+hIiLSKJmCPO8ejpvXMT11ODNShgJwVko4N53ZgkCXxhKkbqkboYj4zZXdY7mkSwwAzy/KZP6Wwmr3WwEB2Nf/FZJTYU8BznP3Ywry/FGqiIg0MiZjM86jt1G5ZSP/6PYbX9Aa0TWWW/u3VNCSBkfvSBE5oSzL4vc9m3NehygM8OzCnSzavqf6OSGh2Dc/AM0TYXcmzt8fwJSW+KVeERFpHMyP3+M8fidFhcU82Od65sWdim3B9acn8tsezbHVcVAaIIUtETnhLMviutMSGJQagWPgyQU7WfZzcfVzIqOxb3kAwiNh+2bvlJDKCv8ULCIiDZYxBueTWTjPP0KWFcLdZ9zKqmZJhLht7huczLm/mK4u0pAobIlInbAti5vOaMGZyeF4HMOj8zJYtav66JUV39I7whUcAmvTvV0KnSr/FCwiIg2O8VRi3vwnZuYbrAtL4q7Tb2OHO5LYUDePn9uani2a+btEkSNS2BKROuOyLW7r35LeLZtRUWV4aG4G63NKq51jpbTD/tM94HbDDwsxU18+aGNkERE5+ZiiQpxn78d88znfNe/Ofb2vp8AKpG10EBOHp9AmOtjfJYoclcKWiNSpAJfFnWe1oltCKKUehwe+3M6WvLJq51hdTsW+9lawLMxXH2E+mI5xqjBr03EWzcOsTdeIl4jIScT8nIHz6O2YdSt5r80QJna9igps+rRsxqPDUogNDfB3iSI1otbvtaDW7yLHrqSyige+3M7a7DIig108NiyFVhHV90Fx5s7BTPmX90ZoMyg5YJ1XdCz2qHFYvfrVY9UiIlLfzKplOC89SVVZKa91G8XHsT0AOL9DFOP6JOCy1QhD/Eut30WkwQkNcHHfoGRSo4MoKKvi3i+2kVVUvSGGPfgC6N3fe6OkekMN8nJwXnwcs3RhPVUsIiL1zZn7Ic4/JlBaUcnjfa/n49geWMA1veK57jQFLWl8FLZEpN6EBbmYMCSZpIhAcko83PfFdnJK9o8WG6cKNq054jWcaa9qSqGISBNjqqpwpvwLM+Ulct1h3Nv/L/wQkkzg3qnov+4Sg6XW7tIIKWyJSL2KDHbz4NBkEsMCyCyq5L4vtlNQ5vHeuX415OUc+QJ52d7zRESkUfrlmlynqBDnHw9i5s5ha1gL7hpwB5vsSCKDXDx8TmvObB3u75JFjpnb3wX80scff8z7779Pfn4+KSkpXHPNNbRv3/6Q5y5atIhZs2aRmZlJVVUViYmJXHzxxZx99tnVzvnss8/YtGkTRUVFPPnkk7Rp06aeXo2IHEpsaAAPDk3m7s+2kVFYwf1fbufhc1oTmp9bo8eb/Fz0/aaISONjli7EmfaK74s1A2C7wKliefNTmNj9d5Q6Fq0iArlvUBKJ4YFHvJ5IQ9egRrYWLlzI5MmTGTFiBE888QQpKSk88sgjFBQUHPL8sLAwLrvsMh5++GEmTpzI4MGDeeGFF1i+fLnvnPLycjp37sxvfvObenoVIlITCWGBPDS0NVHBLjbnlfPg3O2UhcfU6LFWVM3OExGRhsMsXYjz4uMHz2BwqvisRV8e7uoNWt3iQ3ji3BQFLWkSGlTY+uCDDxg6dCiDBw8mKSmJcePGERgYyNy5cw95fteuXenbty9JSUkkJiZywQUXkJKSwpo1+9d8nH322YwYMYLu3bvX18sQkRpqFRHIhCHJhAXarM0u49EdEZTHJBz5QdFx0OGU+ilQREROCONUMWXuamakDK123MHirdTzeLHTCBwsBrYJ54EhyYQHufxUqciJ1WDClsfjYdOmTdVCkW3bdO/enXXr1h318cYY0tPT2blzJ6eccnwfxCorKykpKfH9KC0tPfqDROSYtIkO5oEhyYS4bdJ3lfLUmTdSaR3+P1l71FgsW/8Ji4g0KutXY5cWMy11uC9wVdhunj1lNO+mDAGga94GbonNJcDVYD6eihy3BrNmq7CwEMdxiIqKqnY8KiqKnTt3HvZxJSUlXHfddXg8Hmzb5tprryUtLe24apk1axYzZ8703U5NTeWJJ544rmuKyOF1iA3h3sFJPPDldn4oDuS5iyZw64LncOVl7z/JtrH+7w7tsyUi0giZ/FxGbv0CgGmpw6mwA1gdlcqayFQATt+dzp2r/gOn3ebPMkVOuAYTto5VcHAwEydOpKysjPT0dCZPnkxCQgJdu3Y95mteeumlXHTRRb7bajUqUve6xodyz8AkJny5nW/3BPL8rx/ipthcrJxdmP++CJUVzCiKwqzYzei0mm0kKCIiDcTez1Ijt35BiSvYN5oFMPjnxdy49m3vaVqTK01MgwlbERER2LZNfn5+teP5+fkHjXYdyLZtEhMTAWjTpg07duxg9uzZxxW2AgICCAgIOObHi8ix6dmiGWelhDN/6x6+2rKH4IDmjO/XDdatZPoOmJZhMyZGX36IiDQmZuMazNSXAcgOimRR826++1yOxxe0tCZXmqIGMynW7XbTtm1bVq5c6TvmOA4rV66kY8eONb6O4zhUVlYe/UQRaZBuG9CKfnv3VPl4fT7/XrabGSlDmZY6nFEZcxnZOdLPFYqISE05i+bhPPVXKCpkd2I77u0xnqyQWADcjocq2+1bw6U1udIUNZiRLYCLLrqI559/nrZt29K+fXvmzJlDeXk5gwYNAmDSpEnExMQwZswYwLu2ql27diQkJFBZWcmyZcv4+uuvGTt2rO+aRUVFZGdnk5vr3b9n3/qvqKioI46YiYj/3HlWKx6dl8GijCJm/5QLuBn183xGbvgIVvaEnmf4u0QRETkC4ziY96diPpgOwO6eg7ivxa/IKvFuYv+rbfP4/aYPfV+mWaedxahevfxYsUjdaFBhq1+/fhQWFjJjxgzy8/Np06YN99xzjy8UZWdnV1s/VV5ezquvvkpOTg6BgYG0atWKG2+8kX799i+gX7JkCS+88ILv9nPPPQfAiBEjGDlyZL28LhGpvXsGJnHJf9dg8E71vzIlALMWnO++wqWwJSLSYJnycswbz2F++AaA3eeO4r6A08kq9s48+nWnKP7Qpx8mvzOjomKwymOYmg5WejZXdo/zZ+kiJ5xljDH+LqKx2L17t6YoitST6enZTFmxvxvhyNYuRk2+Ddxu7KcnY4WG+bE6ERE5FJOfgzPpEdi6AVxudo++iXvzktlVXEmzAJth7SP5Q6+D91Ocnp6NY4waIEmjEBAQQPPmNXuvNpg1WyIi++wLWqO7xxIX6h2An7GtihndLwePB/PDQj9XKCIiv2S2bsR55DZv0AoLJ/v6h3xBq0V4AP+4KPWQQQvgyu5xClrSJClsiUiDsi9ojUmLY1Rac4a09TbEaBkewLTY05mRMhTz3Vf+LVJERKoxSxfiPHkn5OdCi2R2//lJ/rYx2Be0HjmnNXGh6vQsJx+FLRFpUBxjGJMW55u3PzjVG7Yyiyq5JDUYx7Jh3UpMzm5/likiIoAxBufDGTgvPg4VFdC1J7tvfJR7l5ayq7iSlnuDVqyClpykGlSDDBGRX04jaRkRSJfmIfy0u5TIqHB+HZQJgPl+Htb5I/xRooiIAKayEjN5Eua7uQBYQy5i1wVXc+/cDHYVe2gZHsDDClpyktPIlog0ePumEn65qQD6DgTAfDsX9fcREfEPU5iP8/RfvUHLtrF+M57dF/+ev325L2gFKmiJoLAlIo1A/9bhBLosthdUsLFdH3AHwM/bYftmf5cmInLSMTu24jx6O2xcAyHNsG++n129z+Gvn21jd8m+oJWsoCWCwpaINALNAl2ckRwOwNydFVin9gXwTV0REZH6YVYsxnnsDsjZBc0Tse+eSFZyV/76uTdotYoI5JFhGtES2UdhS0QahaF7pxLO31KIp+8gAMz38zFOlR+rEhFpeoxThVmbjrNoHmZtuve2MTif/c+7h1Z5KXTqjn3PU2SGxfPXz7eRXeIhKcI7dTAmRC0BRPbR3wYRaRS6J4QSG+omp8TD4uiOnNEsHAryYM0KOKWnv8sTEWkSzNKFONNegbwc722AqFhokQQ//QiAdda5WGOuI7PU8NfPt5FzQNCKVtASqUYjWyLSKLhsy9cGfu7WIqzTBgBozy0RkRPELF3obeG+N2j55OfsD1ojr8X67fUKWiI1pLAlIo3G4LYRAPyws5j8noMAMEu/w5SX+a8oEZEmwDhV3hGtIwmLwBp6EZlFldWC1iMKWiKHpbAlIo1GUkQQneJCcAzMIx7iEqC8FLN8kb9LExFp3NavPnhE65eKCvk5fTV//cwbtJIjvUErSkFL5LAUtkSkURmyd3Rr7qZCOH0QAGbRPD9WJCLS+Jn83KOeszMkjr/9ZJNT6g1aDw9V0BI5GoUtEWlUBqREEGBbbC0oZ/Mp3nVbrFqKKcz3a10iIo2ZFRVzxPt3hsRxX4/ryKly0TrSu0ZLQUvk6BS2RKRRCQt0cUZyGABfFgZDmw7gOJjFC/xcmYhI4+Xk5wHWIe/bF7RygyJpHRnIQ+e0JipYQUukJhS2RKTRGXLgnlunDwbALPrKjxWJiDROprwcZ/IkePUpprU5hxkpQ6vdvzMkjnt7jCc3KJIIl6OgJVJLClsi0uicmtiMmBA3e8qrWJrcB2wbNq/DZGb4uzQRkUbD7NiK88itmK8/BcvC1eEUpqUOZ0aniwHYEdKce3uMJy/Iu1b2nE5xCloitaS/MSLS6Lhsi0GpEby7OpcvMz307doL0pdgFs3D+vVv/F2eiEiDZozBfP0JZtqrUFkBkdHY197KqC6nYqVnM4WzyE/rx6JcyKtyAXDZKTH8rme8nysXaXw0siUijdK+qYQ/7CiioPcgwLvBsTHGj1WJiDRspqQI89KTmP+84A1aXXti3/d3rC6nAnB+hyjaxwTz8W6XgpbICaCRLRFplJIjg+gQG8z6nDK+juzMRUEhkJ0FG9dA+y7+Lk9EpMExG9fgvPIU5OwClwvr0quxhv0ay7bxOIaP1uUxNT2b4grH9xi3jYKWyHHQyJaINFpD945uzd1WjNXrDECNMkREfsk4Ds7H7+BMvNsbtOISsO98Anv4pVi2zdKdRdz84WZe/WEXxRUOUcHeES23beFxYHp6tp9fgUjjpbAlIo3WWSkRuG2LzXnlbE7b25Vw8QKMp9LPlYmINAymMA/n7xMw77wJVVVYfQZg3/scVmpHdhRW8NDc7UyYm0FGYQWRQS76JoWRX1bFmLQ43hndiTFpcUxZka3AJXKMNI1QRBqtsCAXpyeF8c22PXxpErkmMhoK8mDlUuhxur/LExHxK7N6Gc5rz0JhPgQGYo36P6wBwyiudJjxQxYfrM2jyninCl7UKQa3DTNX5TImLY4ru8cB+H6esiK72m0RqRmFLRFp1Ia0jeSbbXuYv3UPV582EPfnszHffYWlsCUiJynj8WDe+y/m43fBGGjZGvv/7sBpkcznGwt4a/luCsqrADitVTP+0CuBVhGBTF2xu1rQ2mffbUcNiERqTWFLRBq1ni2aER3sIq+simWnnMVpn8/G/Pg9pqQYK7SZv8sTEalXJjsL59Wnvc2CAOvs87BGXsvq/Cpe+XgLm/PKAUiKCOTa3vH0ahnme+zotOaHva5GtESOjcKWiDRq3j23Ipn1Uy5fFoZwWotk+Hk7ZulCrAHD/F2eiEidME4VrF+Nyc/FioqBDqfAskU4b/4TSoshpBn21dezq3Nf3vx+N99s2wNAs0Cb0d3jOL9jNG7b8vOrEGn6FLZEpNEb0tYbtpbsKKLw9HOImP0G5ruvQGFLRJogs3QhzrRXIC/HexsgMAgqvKNWpHak4g+38e4uN7Pe30ylY7AtGN4+ijFpcUQE6+OfSH3R3zYRafRaRwXRPiaYDbllLEjszQW8AetWYnJ3Y8UcflpMXTnUN86W7ar3OkSk6TFLF+K8+PjBd+wNWqbHGSwY/kcmf5tDTqkHgO4JoYztHU+b6OD6LFVEUNgSkSZiSNtINuSW8WVWFRd07OYNW4vmY51/eb3WcchvnKNjsUeNw+rVr15rEZGmxThVTJm7GjtlKCO3fnHQ/S92uIwfQk8hd1EWAAlhAfyhVzxnJIVhWZoyKOIP2mdLRJqEs9p499zalFfO1l7e6YPmu7mYeuye5fvGeW/Q8snLwXnxcczShfVWi4g0QetXY5cWMy11ODNShvoO5wZGcFvvm/ms1RnkBkYQbBt+26M5ky5K5czkcAUtET/SyJaINAkRQS5OaxXGt9v3MDesA793u2HnNsjYAsmpdf78xqnyjmgdgTPtVewep2tKoYgcE7Nzm29Ea1rqcKosm0DHw/Q2w/DY3o90gzOXcNUZKcR17eLPUkVkL41siUiTMbRtJADzMkrxpHn32TLffVU/T75+9cEjWr+Ul+09T0SkFkxlBc6HMzBvvw7AyK1fcN6OhbzdZhj/bXs+HttNbFk+T/zwT25cM4PYuCj/FiwiPgpbItJk9GzZjKhgFwVlVSzv6p1iY76f521YUcdMfu4JPU9ExBiD+WEhzr1/wsx+CyorweVmXkJPvkw8zXeey6ni5e8epcOe7RAd520DLyINgqYRikiT4bYtBraJ4H9r8phrEugTGgb5ubB2JXQ5tU6f24qKoSarw6yomDqtQ0SaBrN9M870V2FtuvdAVCyey3/Pv3MimZO/v6ug2/Hgsd28vbdphj1qrKYqizQgClsi0qQMaRvJ/9bksXhnMXv6DCJ8/geY777CquOwZaJimZZ6LrZTdcguYTNShuJYNqNWLcNu1xnLHVCn9YhI42T2FGBm/xfz9adgHAgIxBp+GXkDf8WTi3JYk1/qO/fKzZ9y5dbPmZEylGmpw7FOO4tRvXr5sXoR+SVNIxSRJqVNdDDtYoLwOLAgdQDg7RJoysvr7DnNzm2YifdgO1UHdQkDfB+EbOPARzNxHrkNk7G5zuoRkcbHeCpxPvsfzl/HY+Z/DMbB6jMA+6EXWHPmJdz2xc+syS4lwPZ2FhzdPYbRVwzGGnsbo64YwujuMUzNDmV6erafX4mIHEgjWyLS5AxpG8nG3F3M3RPC+bHxkLMLs+J7rNPOOuHPZbZuwHnufijaw8hm67EiT2dq6nDAu4h9X9AaHVfClZ374Ly1GDK24Dx8G9avRmMNvwzLpSk/Iiczk/4DzoxXIXOH90DrtthXjoMOp/Dhujxe/2EbVQZSIoPolhBCZLCbK7vHAfHsa+o+CrAsG6cet7sQkaOzTH1uQtPI7d69m8rKSn+XISJHUVjm4Q+zNuBx4LmQlbT+aDJ074PrpvtO6POYdatwJj0EpSWQ0h77lgewwiKY8uMupq/MxcJgsBjdPYZRafHexxTm4fznBVi+yHuRtp2w/3ALVmKrE1qbiDR8JjMDZ8brkL7EeyA8EuvS32L1H0qFY/H8okzmbSkE4KyUcG44owXBbk1KEvG3gIAAmjdvXqNzNbIlIk1ORLCbPq3C+G57EV8178nVTIZVSzF7CrDCI0/Ic5iVS3FefBQqKqBjV+wb7sUKCaWiymFLfoX3nL3fOXdPDPM9zoqIxv7TPZhvv8RMewU2rcV56Gasy36HNfhCLFsfpESaAuNUwfrVmPxcb2OcDqf4GleYkiLM+9Mxcz+AqipwubGGXox14Uis0GZk7qng8a93sDmvHNuC3/eM51edo7U5sUgjpJGtWtDIlkjjsShjD4/O20FUsItXfvoXrq3rsUb/H/aQi4772mbpQpyXn4IqD3TrjT3+LqygIMo8Do/Oy+DHzJJq51vAtb3juahT9Q9LJnc3zr//AT/96D3QqTv2H27Gio0/7hpFxH/M0oXeTc4P3HsvOhZr5LVQXORt417kHbHi1L7YV1yDldASgCU7inhm4U6KKxwig13cMaAV3RJC/fAqRORwajOypbBVCwpbIo2HxzFc8+4GCsqr+FvUDnrN/jukdsR1z1PHdV1n4ReYf//Tu3i9d3+ssbdiuQMoqqjiobkZrMn2dgob0jaC605L5I6Pt7K1wNuc4+w2EdxweiJBB0wDMo6DmfcxZuYbUFEOwSFYV47F6n+OvsUWaYTM0oU4Lz5+9BNbJGOPvBarm7d7oGMMM1bmMG1FNgboFBfMHWe1Ii5UnUtFGprahC3NVxGRJsltW5ydGgHAlyFtwbZh8zpM1s5jvqbz5QeYN/7uDVr9z8H6v9ux3AHkl3n42+fbfEHr3PaR3HxmS4LdNn+/sA29WjYDYP6WQu74ZCs/76nwXdOybezBF2Df93do1xnKSjFv/hNn0sPaAFmkkTFOlXdE60gsC0aOxb7v776gVVRRxaPzMpi6N2id3yGKR85praAl0gQobIlIkzW0rXd91vdZFezp2hcAs+irY7qWM+dtzNSXAbxrK66+Act2kV1SyT2fbWNzXjlBLosLOkRx/ektfI+zLIv7BydzTttIglwWW/LLue3jLSzZUVTt+lZCS+w7HsO6/HfgdsOKxTgP3IizeMEx1SsifrB+dfWpg4diDHbrVCy3d9n8lrwybv94C4t3FBNgW9x0RiLj+yYS4NJHNJGmQH+TRaTJSo0OJjU6CI9jWNjJu/eV+e4rajN72hiD886bmFn/AcC6aJR3mp9t8/OeCu7+dCs7CiuIC3Xz7AWpXNc38ZDXufHMFrz4q7Z0igumuMLh4a8ymLYiu1qbZst2YZ93OfZfn4HkVCjeg3n5SZyXJ2L2re/A++25WZuOs2geZm26dyG+iPid2bqhZuftHbXeP9pdSXwzN4+fm8LQdlF1WKGI1Det2aoFrdkSaXzeW5PLaz/sokN0IE/MuQvKy7DvehKrXeejPtY4DmbqS5ivPgLAGvEH7OGXArA1v5z7v9hGXlkVLcIDeGhoa5o3O/qUn8oqw2s/ZPHR+nwA+rRsxp/7tSQsqPpeW8ZTiflwBmbO2+A4EBmNffUN4Kk85MJ7e9Q4rF79avi7IiIniikqxCz+GvPtXNi8rkaPcW59hDdL4nl/TR4APRJDuW1AKyKCtOeeSGOgBhl1RGFLpPHJL/NwzbsbqDLwj/L5JH37AdbgC7DHjD/i40xVFebff8d89xVYFtZVf8Q++zwA1ueUMuHL7eypcEiJCmLCkGSiQ2q3k8aXmwp48ftMKqoMiWEB3H12K9pEBx9cx+b1OK8/C5kZR72m/ce7FLhE6oHxVMKKJTjfzvXukVXl8d5hWd5pwEf4rJDXPIVnBt3Oqt3eNZ4jusYyJi0Ol62GOCKNhcJWHVHYEmmcHp2XwaKMIi5tXslv3/4rhIVjT3zTt2bil0xlJc7LE2H5d2DbWNf8Gfv0gQCsyirhoa8yKPU4dIwN5r7ByYQf47fRm3LLeGz+DnYVVxLosrjh9EQGph68D5ipKMeZ9R/4/L0jXzA6DvvxV3x7+YjIiWOM8TbZ+XYuZvHXULxn/52t22KdORir79mw4afDdiNcG9GaiX3/RK7HJsRtc0u/FpyRHF5Pr0BEThRtaiwicoDBbSNZlFHEvKJgxkTG4CrIhVVL4dS+B51rystwXngUVi8HdwD2+Dux9p73w44iHv96BxVVhu4JodwzsBWhAccebNrGBPP0+W145pudLPu5mGcW/sz6nDJ+3yse9wHfcluBQdg9Tsc5WtjKy/Yu0O/U/ZhrEjmZHGnjYd85Obu8az2/nQtZO/bfERmDdcZArDMGYyW18R2e6u6ANeIBrvjin77pvgb4pP05vJo0DMdjkRQRyN0DW5EUEVQPr1JE/ElhS0SavD4twwgPcpFbWsWK3hfT88s3Md995QtR+5iSIpx/PAgb10BQMPb1f8XqcioA32wt5JmFO/E43nVWd5zVqtp+WccqIsjFvYOSmLoim7dX5fD+2jw25pZxx1mtqk1NrGkbeJOfiyYjiRzdLzceNuBb/0iXHpilC70Ba236/gcFBmH1OhPrjMHQJe2Qo8i2ZTElOxSueoIrg7Ioy83lpYLmzM3x/nuRHBnIk8NTjuuLGhFpPBS2RKTJC3BZDGwTwQdr85gb042egFm+COfHxVBWghUVg0lMwvz9Adi+GUKbYd90v6+Jxucb83l+USaOgQEp4fy5X8tqI0/Hy2VbXNWjOR1ig3nu259ZvbuUWz/awh1ntaRL81AAb401uJYVFXPC6hJpqg678XBejve42w2eA9ZhderunSbY60ys4NAjXvvK7nFUVDlMTc9lc3I0u4vD2Jjr3di8Z4tQ7h+crA3LRU4iWrNVC1qzJdJ4bcot488fbSHAtnj9x2dplvOLzY1tFzhVEB6J/ecHsZJTAXh/TS6v/rALgGHtIvlj38Q6Xci+o7CCx+ZnsL2gArcN1/ZO4PwOUWAcnLvGHn0PnyuuwT7nYq3bEjkM41Qx5dk3sEuLGbn1i4Pun5EyFMeyGVW6CqvfUKzTB2HFHrw2wxhDTqmHjIIKMgrLySioYEdhBRmFFeSWeg46f0jbCG4+s2WdvCYRqV9asyUi8gup0UGkRAWxNb+cBYHJDOcXYWvvXlXWhVdiJadijOHtlTn8d0U2AL/uHM0fesXX+TfSrSICmTi8Df/87me+2baHlxZnsS67lD/2TSRw1LjDLrz3eft1nO/nY199PVbrdnVaq0ijtH41dmkx01KHA1QLXDNShjItdTijNn+CddWfsDunUVll+LmgnIyCcjIKK9hRUMH2Qm+wKvM4h32a6BA3+aUeDOC2UdASOUlpZKsWNLIl0rjNXp3NG8uy6ViwlceXPX/ok6LjsB57mTd/zGX2T951UqPT4riyW2y9Tv0xxvC/Nbm8uWw3jvGGxbvPbkX8uiWH2GcrDmvktd5NkN95E0qLvV0Uz/kV1q/GYAUd3FJe5GTlLJqHefXpasFq5NYveCv1PN5NGULf3StpWbqbHZ37scMVRmZRJc5hPinZFrQIDyQpYu+PyCBa7f31B2vzmLIiG7dt4XEMY9LiuLJ7XP2+WBGpE2r9XkcUtkQat7yV6Vyz3MaxXPxz0URale4+6JwqLF694lE+2e2dhndNr3h+3cV/66BWZBbz1IKdFJRXEWBD/5QIbjkj4aAOajNW5eEYw6jWLsz0VzFLFngvEBuP/ZvxWN37+O01iDQkzk8/Yp65F4CpbYbxdpthYIx3bdZhhLhtkiL3haog368TwgIJcB38uOnp2UxZke0LWL+8LSKNm6YRiogcQmRxLr1yclgSdwpzE3tz1eaPq93vsWz+2flKvt7twgL+dHoi57aP8kut+6QlNuOZC9rw+PwdrM8p46vNheSWepgwpBv23g+HB36Qs6JisK67A9NvCM5//wU5u3D+8SBWnwFYo8ZhRUb79fWI+JOprMTM/wSAKstmS9jeqX17/y7FluXTqmQXSVV7SDr/PJIjg2kVEUhMiLvGI9uHClb7fp6yd1qyApfIyeP4+xaLiDQSVlQMgzOXAPBVYi+qDmiSXmG7ebLr1Xyd0BOXZbitf0u/B6194kIDeGxYa4bvrWdFZgk3fLCZooqqw35jbnXvgz1hEta5l4BlY5YswLnvTzjzP8Y4h19nItJUmZJinL8/AEsWYGyblzpcyuK4rgC49q7ZHPbzIh5Y8Sr/d3YqF3aKJS2xGbGhAbWaQuyYQ08ZvLJ7HGPS4nA0oUjkpKJphLWgaYQijZtxqnjruTd5L64PFa5A7vvxFXrkrafUFcjj3X5HenQHbFPFPQOTOS05wt/lHtKBbej3OdrUJLNtI87k52HrBu+B9l2wf3s9VsvWdVytSMNg8nJw/jEBMrZAcAhTf30vb2d5J/cMyFrGrT9N9a3hGh1XwqjhvfxbsIg0aLWZRqiRLRE5aVi2i4CuPahwBQIwN7EPRe4QJqSNIz26AwCDoiobbNACOKddFE8OT6l2LL/Mc8SuaFbrdtj3TMS6ciwEBcOGn3AevAVn9luYyoq6LlnEr8zObTiP/8UbtCKjmTPmYV/Q6tuqGbdf2A1r7G2MumIIo7vHMDU7lOnp2f4tWkSaDI1s1YJGtkSahhc+XM4n+cG4nCqSSrLYunfdxrlRZVx/YQ//FlcD+6YOWpZ3XT9Ai/AAbj6zhW8T5MMxObtxpr4EP37vPRDfEvu3f8LqnOa936k6qPmG9uySxsqsX40z6SEoKYbEViwceQ9PryjGAGkJoTx0zsGju9PTs3GMYXRazb61FpGTj7oR1hGFLZGmwRjD797ZQEF5le/Y+R0iGd+3hR+rqplfrtF6buFO5m4uBLxtqC/pEsOYtDgCXIefuGCMgaXf4kx9GQq87e2tfkOhUzfM7Ld+0VY+FnvUOKxe/er0dYmcaGbpQpxXngZPJbTrTPrIv/DQohw8DlzQMYr/65NQr9s5iEjTobBVRxS2RJqO//2Uy+tLdwHeDUffGd3ZzxUd3eGaYfxn+S5mrsr13U6JDOKWfi1oG3Pk/bVMSTFm1n8w8z7aP0R2GPYf71LgkkbDmfshZurL3vf1qX3ZdPlN/G1+JmUeh/6tw7mtf0tctoKWiBwbrdkSETmKkkrvqJbbBo9Do1ijcbguZ7/tEc+YtDgGtA4nMtjF1oJybv94C9PTs6k63G6sgBXazLsH118eg6NMFXSmveqdYijSgBljcN59EzPlJTAG6+zzyLzqNh76Josyj0NaQih/7tdCQUtE6o322RKRk8709GympecctOEoNOz9b460hmRf3QVlHl78Potvt+9hyopsFu8o4uYzW5AcGXTYx1pO1dGDVF42rF8NnbofU+0idc14KjFvTsJ8NxcA69e/IW/IZUz4bBsF5VW0iwni7oGtjjjFVkTkRFPYEpGTSlPfcDQy2M2dZ7Vk/pZCXlqSxfqcMm79aAtXndqciztH+zZCPpDJzz3ElQ5m8nPReIA0RKasBOfFJ2D1MrBtrKtvoPS0wTz0+TayiipJDAvgvkHJhAao2YuI1C+FLRE5qRxpw9F99zd2lmUxMDWSbgmhTPouk6U/F/P60l0sytjDzWe2ICEssPr5UTHU6FUXF9VJvSLHwxTkeffQ2rYJAoOwx99F5Sk9efTL7WzOKycq2MWEIclEhegjj4jUPzXIqAU1yBCRxsYYw6cbCnh9aRZlHkOw2+KaXgmc2z7S14nNOFU4d42t3oXwMKwzBmFd9jus6Ni6Ll3kqEzmDpzn7oecXRAeiX3jfTgp7Zm4YAffbi8ixG3z6LDWR20WIyJSG+pGWEcUtkSkscrcU8E/vvuZVbtKAejVohk3nJFIbGgAsLdN9ouPH/4CndNgbbq3u1tgENb5I7DOvQQr8PBrwUTqktm4xruHVtEeaJ6IfcsEaJ7Ii99n8cmGfNy2xf2Dk0hLbObvUkWkiVHYqiMKWyLSmDnG8P6aPP6zfDeVjqFZoM11fRI4u00ElmV5A9e0V36xz1Yc9qixWL36YbZu8N6/4SfvfbHx2CN+D737a78iqVfmx+9xXn4SKiogpT32TfdhRUQxZcVupqfnYAF3nNWSfq0j/F2qiDRBClt1RGFLRJqC7QXlPLfwZzbklgFwZnI4f+ybQGSw29uVcP1qbzOMqBjocArWAW3hjTGYxV9jZv7b26EQoGNX7CvHYbVu64dXI03Zod6PZsFnmLf+BcaBbr2xr7sDKziEOevyeGlxFgDjT0vg/I7Rfq5eRJoqha06orAlIk2FxzG8syrHuxeXgSCXxelJYdw2oNVB505Pz8YxplrreVNejvnkHcwn73pHFywLa8AwrEuuwoqIqsdXIv52tIB+zNc91EhrcAiUeafCWv3PwbrqT1huN99sLWTigp0YYHT3OEalNd6OoiLS8Cls1RGFLRFpajbmlvHcwp1sK6gAIDUqiIeHtSYs0Pth+VCt8g9kcnZj3vk3ZvHX3gMhoVgXjcIaciGWO6DeXof4x6GnnsZijxqH1avf8V33SGsIe/f3jmhZFisyi5kwNwOPYzivQxTjT0vQtFYRqVMKW3VEYUtEmqLKKocpK7J5d7V3v62QAJvb+7dkQ04pUw/Y/PlIzPrV3g/d2zZ6DyS0wh55DXTvU+2Db12Ngkj9O1ogsv94V60Dl/FUYoqLMQ/eDIV5hz8xOg778VfYnF/JPZ9to9TjcGZyOH8Z0BKXraAlInVLYauOKGyJSFP20+4SHv4qg6IKx3fstFbNuK1/K0IC7KM+3jgOZuEXmHcnw54C78FuvbBHXovVIrnORkGk/tVou4Bm4XDJVVgV5VBW4p3+t/eHKSuF0n3HDvjZ46lxDVk3PMLdG4LJL6uiW0Io9w9OItB19PepiMjxUtiqIwpbItLUlXkcRs9Yh3PA/wyhATZD2kZyfscokiKO3urdlJZgPpyO+fx9qPKAbUPXXpC+5LCPOZZREPEfszYd56m/+u358wPCuHvgPWR53KRGB/HIOa1pFqgRUhGpHwpbdURhS0Saun1rtNy2hccxhAXa1Ua6eiSGckHHaPq0CjvqdC2TtRPn7dfhx++P/sR7p4VpSmHDZ6qqvOv0Pvvf0U9u3Q6rRZK3sUVwCASHen8OCcU68PYBvzZbN2KevfewlyxxBXFvj/FsDm9FQlgAT5ybQnSI+wS+QhGRI6tN2NK/TiIiAhzcDGPf7UGpERRXVLFkRzHLM0tYnllCfDM3wztEM6xdJJHBh/6vxEpoieuGv+F88q63VfyR5GXD+tXQqfsx16/1YHXL7CnAfP0pZt5HkJtdo8fYI6/Bqu2faedumOjYQ05RrLRcPN7td2wOb0VkkIsJQ5IVtESkQdO/UCIicsiug/t+3nd8XJ8EPl6fz2cb8tlV7OE/y3czbUU2A1LCuaBjNB3jQg598ajYGtXgTHsFq3MaJCZhJSZBiyQIj6xRZ7lfrgczcMLXg9VlmGuoQdEYA5vXYebOwSz5ev+aqmZh4KmC8tLDPzg6DjqcUuvntGwX04fehLV4PiO3fuE7XoXFc11GszK6PS4M9w9JpkV4YK2vLyJSnxS2REQEx5hDdh3cd9sxhoSwQH7XM55R3eNYsLWQD9flszG3jLmbC5m7uZAOscFc0DGaASnh1RoVWFEx1Gi+esYWTMYWgP3nh4ZBiySsxFbQItkbwhKTIC4By+UNI4ftipeXg/Pi4ydkPVhdhrn6CIq1rqmiHLN4AWbuh7B1w/47Utp72/qfdhZTv1x1UCDaZ0bKUMxpZzPmGAOjq2UyU1KHQ3AoI9e+jwFe6/Brvo1PA2Bg20jaxQQf07VFROqT1mzVgtZsiYjsZ4xhXU4Zc9blsWDrHjx7u2qEB7kY1i6S8zpEkRAWWLPOdeGR8KsxWLt2YjJ3QGYGZGfB4f6LcrshviUktIKflvs2uj2k41wPVhctzuvj2sdUT3YW5quPMAs+g+I93oNuN9ZpZ2ENvhArtaPv3H2joaN+/pqRa9/3HZ/R6WKmtTirRlsGHMm+649uWQVlpUzNDQOgf+tw7jjr4M23RUTqixpk1BGFLRGRQ8sv8/D5hgI+Wp9Hdol3qpltQZ9WYVzQMZrVP67DXnKUUZDhPasdNxXlsGsn5ucd8PN2yMzAZGZA1g6oqKhdgR27YcW3OKBBw96mDEEhWCGhBzVvIDgE3AFgnKMHxWMMczUKoSegccjRpigax4HVy3G+mgMrFu8PuDHNsQadjzVgGFZ45CGvfWAgGhmazYySOKbudPmClmMMZR6HkkqH0r0/SiodSj0H3q465PFSj0NmUSV7yqt8z9enZTPuHZx8zL8XIiIngsJWHVHYEhE5sirHsHhHEXPW5fFjZonveHigiz0VVVyetZDf/DTbd/xYRkGM40DubsjMwFk0j2mZAdjGOWyQcyybUVs+q/2LcbkgIPDIo2b7tOkIYeG1u37RHtiy7qinWdf8GatXP6ygo7fd/6Uj7W1G5zTvvmhzP4JdO/ff3+VU7CEXQtppRw15uaUeXl6cybfbi7DwToEMD3Lhti1KKx3KPM4RH18btgWzxnQ+YdcTETlWClt1RGFLRKTmMgrKmbM+ny83FlB6wIfudqEOA0OLWOVpxqJ8F4NSIzivQxShAS5C3DahATYhAfZRW8uDd7+naW9/ybTU4Yza/Em1wDUjZej+422DsSKjvRvplns31DUHbLJbbXPd8rI6+f04bqHNvM1GomKxomMgMhaiY7CiYiHae5zwSCzbu17uaFMUcbv3N7wICcXqNxRr0PnedXGHUVRRxcqsElZkFvNjZgkZhTUbYXRZEBKw98/W7SJk75/xvj/rELdd/ZjbJjTAxbfb9/DFpgLcNngcjntqoojIiaCwVUcUtkREaq+ksop5mwuZsy6PbQU1n/4X6LJ8H8RDq30Q3/9hPcQNwR+/zarABL5v3o2BmUu4ZPs8vovrzvTUc71Bq/DHWk3FM04VlJVBWQnmpx8x//7H0R80/HLvflK1YH7OgE/eOfqJ7gDw1PD/HpcLIqIhMhp2bIXKo/x+t0jGGnIR1hmDvPte/UJFlcNPu0tZkVnCj5nFbMwtq7bhtQVEhbjJK/XgsqDKwDltI7mwU3S18BRgWzXqKnmgw21FoMAlIv6msFVHFLZERI6dMYaVu0q494vtGOP9oN6leQilB6zpKal0fI02jlfz0lz67U6nw5m96dgnjfhmAbX+wF+X66pqem3rsZexyssgPxfyczB53p+9v87ZezwXCvOqNRSZ1mbYUadXjr58IHbnNN/xKsewMbeMHzOLWZFZwk+7S6n8xZ9Hy/BATk0MJS0xlA05ZbyzOveEB6LDXUeBS0QaAm1qLCIiDY5lWazeVYox4LYtPI6hR4tmB31orqwyexslHNA44TANFHzNFbJzKM3KYnWzJNgbqHaHxPC/1gNhB7BjE5FBLtrHBtMxNoQOscF0iA0m4jAbMvtqtl3Yo8YduWPgqLHH1MCixtd2ub0t8EPDoGVrDhcXTVUVFOR5Q9jir7HXFzMtdTjAYadXmvw8thWUs2JvuFqZVUJxZfV1VjEhbtISQzk1sRlpiaHEhQYA3uBzYNCC6nuzHXi7tmqyFYGISGOgsCUiIvXicNPCoPqH8gCXRYDLRURQbQJMK6at2MXq9FzcGDxYnJ7UjJiQANbnlLElv4yC8ip+2FnMDzuLfY9KCAvwBa8OsSG0iwkm2G1Xu/I0dwesEQ9wxRf//EWjiTjeHnoDxp3M6GP6HTmx17ZcLoiJ8/6orGDk53/1PscBgWtf0Dp9dzo7Q5tz7bZ48jZurnadZgE23RL2h6ukiMBDjgjWZSAanXb4b4w1oiUijYnCloiI1LlDTf86UaMg+64/Nf3Q09mePr8NFVUOm/PKWZ9TyvqcMtbnlLGjsIKsokqyiipZsNW7p5RtQXJkEB0OGAEDmJodClc9wZVBWb4W6tPLE7zP2bJ2UxMPZFsWU47j2sYYKh1TbQSwtNKhJDSFktQBRJUV0SNnLdNShzO9zTCM5Q2Si5p3916g0rs2rkvzENISm3FqYihto4Nr1JxEgUhE5Oi0ZqsWtGZLROTYTF2xG9uyDvkhfHp6No4xR/zwfiTHur6nqKKKjbllrM8uY93eEJZb6jnovECXRUSQi+wSD2ckhzGoTSTfbCvk6617OCslnP6tI46p7n32XWtASjh9W4Xx9dZCFu8opmt8CG1jgqvvT+WbSrl/imVVLf8Xt41Duz3bOTU1nlN7dKRz8xACXfbRHygiIkATaJDx8ccf8/7775Ofn09KSgrXXHMN7du3P+S5ixYtYtasWWRmZlJVVUViYiIXX3wxZ599tu8cYwwzZszgiy++oLi4mM6dOzN27FhatGhRq7oUtkREGp4TGeRySip9I1/rc0rZkFN20BqmhirYbe1toe7a37mxOJ9du/LYEpqAbRwcy+byrIX8dlBnrF79/F2yiEij1KjD1sKFC5k0aRLjxo2jQ4cOfPjhh3z33Xc899xzREYevIP9qlWrKC4upmXLlrjdbpYuXcrkyZO566676NGjBwCzZ89m9uzZXH/99cTHxzN9+nS2bdvGM888Q2BgYI1rU9gSETm5OMawc08FG3LKWJdTxpy1eRi8nRQ7Nz+4VfrxWLO71HftgW0iDtqLat8+ZL629wfsSRXsPvS+ZPtG90a3rGJkaDYzSuKYutOlbn4iIsehUXcj/OCDDxg6dCiDBw8GYNy4cSxdupS5c+dyySWXHHR+165dq92+4IILmDdvHmvWrKFHjx4YY5gzZw6XXXYZp512GgA33HAD48aNY/HixfTv37/OX5OIiDROtmWRFBFEUkQQWUWVGPZ3Uux5iE6Kx2p6ejY/7S71XbtlROBxX/tQ0yhHAdZhGpOIiMiJ16AmaXs8HjZt2kT37t19x2zbpnv37qxbt+6ojzfGkJ6ezs6dOznllFMA2LVrF/n5+aSl7d9HJDQ0lPbt2x/2mpWVlZSUlPh+lJaWHucrExGRxuzA4PLO6E6MSYtjyopspqdnN9hrH6lb4Ji0OLVPFxGpBw1qZKuwsBDHcYiKiqp2PCoqip07dx72cSUlJVx33XV4PB5s2+baa6/1hav8/HyAg6YgRkZG+u77pVmzZjFz5kzf7dTUVJ544onavyAREWn06rKTYl1eW90CRUT8r0GFrWMVHBzMxIkTKSsrIz09ncmTJ5OQkHDQFMOauvTSS7nooot8tw+1v4iIiJwc6nI/KW3eKyLStDWosBUREYFt2weNOOXn5x802nUg27ZJTEwEoE2bNuzYsYPZs2fTtWtX3+MKCgqIjo72PaagoIA2bdoc8noBAQEEBAQcz0sREZEmoi5HiDT6JCLStDWoNVtut5u2bduycuVK3zHHcVi5ciUdO3as8XUcx/F1DYyPjycqKor09HTf/SUlJWzYsKFW1xQREREREamNBjWyBXDRRRfx/PPP07ZtW9q3b8+cOXMoLy9n0KBBAEyaNImYmBjGjBkDeNdXtWvXjoSEBCorK1m2bBlff/01Y8eOBbxTAC+44ALeffddWrRoQXx8PNOmTSM6OtrXnVBEREREROREa3Bhq1+/fhQWFjJjxgzy8/Np06YN99xzj286YHZ2drU1VOXl5bz66qvk5OQQGBhIq1atuPHGG+nXb/9mjb/+9a8pLy/npZdeoqSkhM6dO3PPPffUao8tERERERGR2mhwmxo3ZNrUWERERETk5FabTY0b1JotERERERGRpkJhS0REREREpA4obImIiIiIiNQBhS0REREREZE6oLAlIiIiIiJSBxS2RERERERE6oDCloiIiIiISB1Q2BIREREREakDClsiIiIiIiJ1QGFLRERERESkDrj9XUBj4nbrt0tERERE5GRWm0xgGWNMHdYiIiIiIiJyUtI0wnpUWlrKnXfeSWlpqb9LETkqvV+lMdH7VRoTvV+lMdH79fgobNUjYwybN29Gg4nSGOj9Ko2J3q/SmOj9Ko2J3q/HR2FLRERERESkDihsiYiIiIiI1AGFrXoUEBDAiBEjCAgI8HcpIkel96s0Jnq/SmOi96s0Jnq/Hh91IxQREREREakDGtkSERERERGpAwpbIiIiIiIidUBhS0REREREpA4obImIiIiIiNQBt78LaGo+/vhj3n//ffLz80lJSeGaa66hffv2hz3/ww8/5NNPPyU7O5uIiAhOP/10xowZQ2BgYD1WLSej1atX895777F582by8vK4/fbb6du37xEfs2rVKiZPnsz27duJjY3l8ssvZ9CgQfVTsJzUavt+XbRoEZ9++ilbtmzB4/GQlJTEFVdcQY8ePeqvaDkpHcu/rfusWbOGBx54gOTkZCZOnFjHlYoc2/u1srKSmTNn8vXXX5Ofn090dDSXX345Q4YMqaeqGxeNbJ1ACxcuZPLkyYwYMYInnniClJQUHnnkEQoKCg55/oIFC5gyZQpXXHEFzz77LOPHj+fbb79l6tSp9Vy5nIzKy8tp06YN1157bY3O37VrF48//jhdu3blySef5MILL+Rf//oXy5cvr9tCRaj9+/Wnn34iLS2Nu+++2/e+feKJJ9i8eXMdVyonu9q+V/cpLi7m+eefp3v37nVUmcjBjuX9+uyzz7Jy5UrGjx/Pc889x80330zLli3rsMrGTSNbJ9AHH3zA0KFDGTx4MADjxo1j6dKlzJ07l0suueSg89euXUunTp0YMGAAAPHx8fTv35/169fXZ9lykurZsyc9e/as8fmffvop8fHxXH311QAkJSWxZs0aPvzwQ40WSJ2r7fv197//fbXbY8aMYcmSJfzwww+kpqae4OpE9qvte3WfV155hf79+2PbNosXL66DykQOVtv36/Lly1m9ejWTJk0iLCwM8H5+lcPTyNYJ4vF42LRpU7VvpGzbpnv37qxbt+6Qj+nUqRObNm1iw4YNAGRlZbFs2bJj+kdapK6tX7/+oG9cTz311MO+v0UaEsdxKC0t9X04EGlI5s6dS1ZWFldccYW/SxE5oiVLltCuXTv+97//cd1113HzzTczefJkKioq/F1ag6WRrROksLAQx3GIioqqdjwqKoqdO3ce8jEDBgygsLCQe++9F4CqqiqGDRvGZZddVtflitRafn4+kZGR1Y5FRkZSWlpKRUWF1hlKg/b+++9TVlbGmWee6e9SRKr5+eefmTJlChMmTMDlcvm7HJEjysrKYs2aNQQEBPCXv/yFwsJCXnvtNYqKivjTn/7k7/IaJIUtP1q1ahWzZs1i7NixdOjQgczMTN544w1mzpzJiBEj/F2eiEiTsGDBAmbOnMlf/vKXg74wEPEnx3H4xz/+wRVXXKE1L9IoGGMAuOmmmwgNDQW8DTOeeeYZxo4dqy9eD0Fh6wSJiIjAtm3y8/OrHc/Pzz9otGuf6dOnc/bZZzN06FAAWrduTVlZGS+//DKXXXYZtq1ZntJwREVFHdTspaCggJCQEP3jKg3WN998w7/+9S9uvfVW0tLS/F2OSDWlpaVs3LiRzZs38/rrrwPeD7PGGEaNGsXf/vY3unXr5ucqRfaLiooiJibGF7QAWrVqhTGGnJwcWrRo4cfqGiaFrRPE7XbTtm1bVq5c6WuZ6TgOK1eu5LzzzjvkY8rLy7Esq9oxBSxpqDp06MCyZcuqHVuxYgUdO3b0U0UiR7ZgwQJefPFFbrnlFnr16uXvckQOEhISwlNPPVXt2KeffsrKlSu59dZb1XhAGpzOnTvz3XffUVZWRnBwMOCdCmtZFrGxsX6urmHSJ/sT6KKLLuKLL77gq6++IiMjg1dffZXy8nLfPkSTJk1iypQpvvN79+7NZ599xjfffMOuXbtYsWIF06dPp3fv3gpdUufKysrYsmULW7ZsAbyt3bds2UJ2djYAU6ZMYdKkSb7zzz33XHbt2sVbb73Fjh07+OSTT/j222+58MIL/VG+nGRq+35dsGABzz//PFdffTUdOnQgPz+f/Px8SkpK/FG+nERq8161bZvWrVtX+xEREUFAQACtW7f2fZgVqSu1/bd1wIABhIeH88ILL5CRkcHq1at56623GDx4sGa5HIZGtk6gfv36UVhYyIwZM8jPz6dNmzbcc889vmmE2dnZ1UayLr/8cizLYtq0aeTm5hIREUHv3r0ZPXq0n16BnEw2btzIhAkTfLcnT54MwMCBA7n++uvJy8vz/WML3taud911F2+++SZz5swhNjaW8ePHq+271Ivavl8///xzqqqqeO2113jttdd8x/edL1JXavteFfGn2r5fg4OD+dvf/sbrr7/OXXfdRXh4OGeeeSajRo2q99obC8vsW+kmIiIiIiIiJ4zmqomIiIiIiNQBhS0REREREZE6oLAlIiIiIiJSBxS2RERERERE6oDCloiIiIiISB1Q2BIREREREakDClsiIiIiIiJ1QGFLRERERESkDihsiYhIkzRjxgxGjhxZ7djIkSN57bXX/FRRzRyqbhERaZzc/i5AREROXtu2bePtt99m48aNFBQUEBYWRlJSEn369OH888/3nffuu++SlJRE3759/Vjt0a1atYoJEyb4brtcLmJjY+ncuTNXXHEFCQkJfqxORETqm8KWiIj4xdq1a5kwYQJxcXEMHTqUqKgocnJyWL9+PXPmzKkWtmbNmsUZZ5xRq7B1+eWXc8kll9RB5Ud3/vnn065dO6qqqti8eTOff/45S5cu5amnniImJuaIj/Vn3SIicmIpbImIiF+8++67hIaG8thjj9GsWbNq9xUUFBzzdcvKyggODsblcuFyuY63zGPSpUsXzjjjDAAGDx5MixYteOONN5g3bx6XXnrpIR/TEOoWEZETS2FLRET8Iisri+Tk5IOCFkBkZKTv1/vWL82bN4958+YBMHDgQK6//npmzJjBzJkzeeaZZ3jnnXdYvnw5zZs358knn/TdN2PGjCPW8c477zBjxgx+//vf+0bTli1bxqxZs9i8eTOWZdGlSxeuuuoqkpOTj+m1duvWDYBdu3YBHFPd8+fP56OPPmL79u0EBATQunVrLrvsMk499VTfOSe6bhEROT5qkCEiIn7RvHlzNm3axLZt24543g033EBAQABdunThhhtu4IYbbmDYsGHVznnmmWcoLy9n9OjRDB06tMY1TJs2jRkzZjBu3Dhf0Jo/fz6PP/44wcHB/OY3v+Hyyy8nIyOD++67zxeWaisrKwuA8PDwY6r77bffZtKkSbjdbkaOHMkVV1xBbGwsK1eu9J1TF3WLiMjx0ciWiIj4xcUXX8yjjz7KHXfcQfv27encuTPdu3ena9euuN37/3s6++yzeeWVV4iPj+fss88+5LVSUlK4+eaba/X8kydP5sMPP+SPf/wjgwYNArxT+d544w2GDBnCdddd5zt34MCB3HLLLcyaNava8cMpLS2lsLDQt2brjTfewLIsTj/99FrXnZmZycyZM+nbty+33nortr3/e1JjzAmtW0RETiyFLRER8Yu0tDQefvhhZs+ezY8//si6det47733iIiIYPz48fTp06fG1/rlSNeRGGN47bXX+Pzzz7nxxhsZMGCA774VK1ZQXFxM//79KSws9B23bZsOHTqwatWqGj3Hiy++WO12REQE119/Pe3atat13d9//z3GGEaMGFEtaAFYlnVC6xYRkRNLYUtERPymffv23H777Xg8HrZs2cL333/Phx9+yNNPP83EiRNJSkqq0XXi4+Nr/Jzz58+nrKyMsWPHVgtaAD///DMADz744CEfGxISUqPnGDFiBJ07d8a2bSIiImjVqtUhm17UpO6srCwsyzri78WJqltERE4shS0REfE7t9tN+/btad++PS1btuSFF17g22+/5YorrqjR4wMDA2v8XJ06dWLLli188skn9OvXj7CwMN99+6bl3XDDDURFRR302Jp2CWzdujVpaWlHPa82dR/JiapbREROLIUtERFpUNq2bQtAXl6e79i+6XInQmJiIldddRUPPPAAjzzyCPfdd59v5GffpsORkZE1Ckv1ISEhAWMMGRkZtGnT5rDnQMOqW0RE1I1QRET8ZOXKlb4RmQMtW7YMgJYtW/qOBQUFUVxcfMKeOyUlhbvvvpsdO3bwxBNPUFFRAcCpp55KSEgIs2bNwuPxHPS4A9dD1Ze+fftiWRYzZ87EcZxq9+37/WuIdYuIiEa2RETET9544w3Ky8vp27cvLVu2xOPxsG7dOhYuXEjz5s0ZPHiw79y2bduSnp7OBx98QHR0NPHx8XTo0OG4nr9jx47ccccdPPbYYzz99NP85S9/ITQ0lHHjxvHPf/6TO++8k/79+xMREUF2djZLly6lU6dOXHvttcf70mslMTGRyy67jHfeeYf777+fvn37EhAQwIYNG4iJiWHMmDENsm4REVHYEhERP/ntb3/Lt99+y7Jly/j888/xeDzExcVx7rnncvnll1fb7Ph3v/sdL730EtOmTaOiooKBAwced9gC72bDf/7zn3n66aeZNGkSN910EwMGDCA6OprZs2fz3nvvUVlZSUxMDF26dKkWAOvTlVdeSXx8PB9//DHTpk0jMDCQlJSUaq3wG2LdIiInO8scag6HiIiIiIiIHBet2RIREREREakDClsiIiIiIiJ1QGFLRERERESkDihsiYiIiIiI1AGFLRERERERkTqgsCUiIiIiIlIHFLZERERERETqgMKWiIiIiIhIHVDYEhERERERqQMKWyIiIiIiInVAYUtERERERKQOKGyJiIiIiIjUgf8H0tzWXEpT/PkAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import matplotlib.pyplot as plt\n", - "\n", - "# Specify the expiration and right\n", - "specific_expiration = exp # Change this to your desired expiration\n", - "specific_right = 'C' # Change this to 'C' for call or 'P' for put\n", - "\n", - "# Filter the european_converted_chain DataFrame\n", - "filtered_chain = european_converted_chain[\n", - " (european_converted_chain['expiration'] == specific_expiration) &\n", - " (european_converted_chain['right'] == specific_right)\n", - "]\n", - "\n", - "# Sort by strike\n", - "filtered_chain = filtered_chain.sort_values(by='moneyness')\n", - "\n", - "# Plotting\n", - "plt.figure(figsize=(10, 6))\n", - "plt.plot(filtered_chain['moneyness'], filtered_chain['bs_vol'], label='BS Vol', marker='o')\n", - "plt.plot(filtered_chain['moneyness'], filtered_chain['european_vols_equiv'], label='European Vols Equiv', marker='x')\n", - "plt.title(f'Volatility Comparison for {specific_right} Options Expiring on {specific_expiration}')\n", - "plt.xlabel('Strike Price')\n", - "plt.ylabel('Volatility')\n", - "plt.legend()\n", - "plt.grid()\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": 379, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
midpointeu_boundarystrikerestrictrestrict2eu_lower_boundvaluation_date
datetime
2025-07-1655.82556.724555155.0-0.8995550.00141755.8235832025-07-16 16:00:00
2025-07-1650.85051.745899160.0-0.8958990.00507350.8449272025-07-16 16:00:00
2025-07-1646.02546.767243165.0-0.7422430.15872945.8662712025-07-16 16:00:00
2025-07-1641.30041.788586170.0-0.4885860.41238540.8876152025-07-16 16:00:00
2025-07-1636.37536.809930175.0-0.4349300.46604235.9089582025-07-16 16:00:00
2025-07-1631.52531.831274180.0-0.3062740.59469830.9303022025-07-16 16:00:00
2025-07-1626.95026.852617185.00.0973830.99835425.9516462025-07-16 16:00:00
2025-07-1622.52521.873961190.00.6510391.55201120.9729892025-07-16 16:00:00
2025-07-1618.25016.895305195.01.3546952.25566715.9943332025-07-16 16:00:00
2025-07-1614.40011.916648200.02.4833523.38432311.0156772025-07-16 16:00:00
2025-07-1611.0756.937992205.04.1370085.0379806.0370202025-07-16 16:00:00
2025-07-168.1251.959336210.06.1656647.0666361.0583642025-07-16 16:00:00
2025-07-165.700-3.019321215.08.7193215.7000000.0000002025-07-16 16:00:00
2025-07-163.825-7.997977220.011.8229773.8250000.0000002025-07-16 16:00:00
2025-07-162.465-12.976633225.015.4416332.4650000.0000002025-07-16 16:00:00
2025-07-161.510-17.955290230.019.4652901.5100000.0000002025-07-16 16:00:00
2025-07-160.975-22.933946235.023.9089460.9750000.0000002025-07-16 16:00:00
2025-07-160.590-27.912602240.028.5026020.5900000.0000002025-07-16 16:00:00
2025-07-160.385-32.891259245.033.2762590.3850000.0000002025-07-16 16:00:00
2025-07-160.265-37.869915250.038.1349150.2650000.0000002025-07-16 16:00:00
2025-07-160.185-42.848571255.043.0335710.1850000.0000002025-07-16 16:00:00
2025-07-160.135-47.827227260.047.9622270.1350000.0000002025-07-16 16:00:00
2025-07-160.100-52.805884265.052.9058840.1000000.0000002025-07-16 16:00:00
\n", - "
" - ], - "text/plain": [ - " midpoint eu_boundary strike restrict restrict2 \\\n", - "datetime \n", - "2025-07-16 55.825 56.724555 155.0 -0.899555 0.001417 \n", - "2025-07-16 50.850 51.745899 160.0 -0.895899 0.005073 \n", - "2025-07-16 46.025 46.767243 165.0 -0.742243 0.158729 \n", - "2025-07-16 41.300 41.788586 170.0 -0.488586 0.412385 \n", - "2025-07-16 36.375 36.809930 175.0 -0.434930 0.466042 \n", - "2025-07-16 31.525 31.831274 180.0 -0.306274 0.594698 \n", - "2025-07-16 26.950 26.852617 185.0 0.097383 0.998354 \n", - "2025-07-16 22.525 21.873961 190.0 0.651039 1.552011 \n", - "2025-07-16 18.250 16.895305 195.0 1.354695 2.255667 \n", - "2025-07-16 14.400 11.916648 200.0 2.483352 3.384323 \n", - "2025-07-16 11.075 6.937992 205.0 4.137008 5.037980 \n", - "2025-07-16 8.125 1.959336 210.0 6.165664 7.066636 \n", - "2025-07-16 5.700 -3.019321 215.0 8.719321 5.700000 \n", - "2025-07-16 3.825 -7.997977 220.0 11.822977 3.825000 \n", - "2025-07-16 2.465 -12.976633 225.0 15.441633 2.465000 \n", - "2025-07-16 1.510 -17.955290 230.0 19.465290 1.510000 \n", - "2025-07-16 0.975 -22.933946 235.0 23.908946 0.975000 \n", - "2025-07-16 0.590 -27.912602 240.0 28.502602 0.590000 \n", - "2025-07-16 0.385 -32.891259 245.0 33.276259 0.385000 \n", - "2025-07-16 0.265 -37.869915 250.0 38.134915 0.265000 \n", - "2025-07-16 0.185 -42.848571 255.0 43.033571 0.185000 \n", - "2025-07-16 0.135 -47.827227 260.0 47.962227 0.135000 \n", - "2025-07-16 0.100 -52.805884 265.0 52.905884 0.100000 \n", - "\n", - " eu_lower_bound valuation_date \n", - "datetime \n", - "2025-07-16 55.823583 2025-07-16 16:00:00 \n", - "2025-07-16 50.844927 2025-07-16 16:00:00 \n", - "2025-07-16 45.866271 2025-07-16 16:00:00 \n", - "2025-07-16 40.887615 2025-07-16 16:00:00 \n", - "2025-07-16 35.908958 2025-07-16 16:00:00 \n", - "2025-07-16 30.930302 2025-07-16 16:00:00 \n", - "2025-07-16 25.951646 2025-07-16 16:00:00 \n", - "2025-07-16 20.972989 2025-07-16 16:00:00 \n", - "2025-07-16 15.994333 2025-07-16 16:00:00 \n", - "2025-07-16 11.015677 2025-07-16 16:00:00 \n", - "2025-07-16 6.037020 2025-07-16 16:00:00 \n", - "2025-07-16 1.058364 2025-07-16 16:00:00 \n", - "2025-07-16 0.000000 2025-07-16 16:00:00 \n", - "2025-07-16 0.000000 2025-07-16 16:00:00 \n", - "2025-07-16 0.000000 2025-07-16 16:00:00 \n", - "2025-07-16 0.000000 2025-07-16 16:00:00 \n", - "2025-07-16 0.000000 2025-07-16 16:00:00 \n", - "2025-07-16 0.000000 2025-07-16 16:00:00 \n", - "2025-07-16 0.000000 2025-07-16 16:00:00 \n", - "2025-07-16 0.000000 2025-07-16 16:00:00 \n", - "2025-07-16 0.000000 2025-07-16 16:00:00 \n", - "2025-07-16 0.000000 2025-07-16 16:00:00 \n", - "2025-07-16 0.000000 2025-07-16 16:00:00 " - ] - }, - "execution_count": 379, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "filtered_chain[['strike', 'bs_vol', 'intrinsic_value', 'midpoint']]\n", - "filtered_chain['eu_boundary'] = filtered_chain['f']-(filtered_chain['strike']/(1+ get_rates('2025-07-16')* filtered_chain['t']))\n", - "filtered_chain['restrict'] = filtered_chain['midpoint'] - filtered_chain['eu_boundary']\n", - "filtered_chain['restrict2'] = filtered_chain['midpoint'] - filtered_chain['eu_lower_bound']\n", - "filtered_chain[['midpoint','eu_boundary', 'strike', 'restrict', 'restrict2', 'eu_lower_bound', 'valuation_date']]" - ] - }, - { - "cell_type": "code", - "execution_count": 376, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'2025-07-16'" - ] - }, - "execution_count": 376, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "test_valuation_date" - ] - }, - { - "cell_type": "code", - "execution_count": 364, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "datetime\n", - "2025-07-16 0.001928\n", - "2025-07-16 0.005539\n", - "2025-07-16 0.159149\n", - "2025-07-16 0.412760\n", - "2025-07-16 0.466371\n", - "2025-07-16 0.594982\n", - "2025-07-16 0.998592\n", - "2025-07-16 1.552203\n", - "2025-07-16 2.255814\n", - "2025-07-16 3.384424\n", - "2025-07-16 5.038035\n", - "2025-07-16 7.066646\n", - "2025-07-16 9.620256\n", - "2025-07-16 12.723867\n", - "2025-07-16 16.342478\n", - "2025-07-16 20.366089\n", - "2025-07-16 24.809699\n", - "2025-07-16 29.403310\n", - "2025-07-16 34.176921\n", - "2025-07-16 39.035531\n", - "2025-07-16 43.934142\n", - "2025-07-16 48.862753\n", - "2025-07-16 53.806363\n", - "dtype: float64" - ] - }, - "execution_count": 364, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "filtered_chain['midpoint'] - (((filtered_chain['f'] - filtered_chain['strike']) * np.exp(-get_rates(test_valuation_date) * filtered_chain['t'])) )" - ] - }, - { - "cell_type": "code", - "execution_count": 316, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(expiration\n", - " 2025-07-18 0.252206\n", - " 2025-07-25 0.241333\n", - " 2025-08-01 0.327943\n", - " 2025-08-08 0.309946\n", - " 2025-08-15 0.293949\n", - " 2025-08-22 0.287825\n", - " 2025-08-29 0.279951\n", - " 2025-09-19 0.270078\n", - " 2025-10-17 0.262454\n", - " 2025-11-21 0.274952\n", - " 2025-12-19 0.267953\n", - " 2026-01-16 0.272952\n", - " 2026-02-20 0.267453\n", - " 2026-03-20 0.273077\n", - " 2026-05-15 0.275077\n", - " 2026-06-18 0.269703\n", - " 2026-09-18 0.273702\n", - " 2026-12-18 0.273077\n", - " 2027-01-15 0.273327\n", - " 2027-06-17 0.273452\n", - " 2027-12-17 0.257955\n", - " dtype: float64,\n", - " expiration\n", - " 2025-07-18 0.005476\n", - " 2025-07-25 0.024641\n", - " 2025-08-01 0.043806\n", - " 2025-08-08 0.062971\n", - " 2025-08-15 0.082136\n", - " 2025-08-22 0.101300\n", - " 2025-08-29 0.120465\n", - " 2025-09-19 0.177960\n", - " 2025-10-17 0.254620\n", - " 2025-11-21 0.350445\n", - " 2025-12-19 0.427105\n", - " 2026-01-16 0.503765\n", - " 2026-02-20 0.599589\n", - " 2026-03-20 0.676249\n", - " 2026-05-15 0.829569\n", - " 2026-06-18 0.922656\n", - " 2026-09-18 1.174538\n", - " 2026-12-18 1.423682\n", - " 2027-01-15 1.500342\n", - " 2027-06-17 1.919233\n", - " 2027-12-17 2.420260\n", - " dtype: float64)" - ] - }, - "execution_count": 316, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# def atm_finder_func(x):\n", - "\n", - "def get_atm_vol(chain: pd.DataFrame) -> pd.Series:\n", - " \"\"\"\n", - " Finds the ATM volatility for a given expiration in the chain.\n", - " Args:\n", - " x (pd.DataFrame): The option chain DataFrame for a specific expiration.\n", - " Returns:\n", - " float: The ATM volatility for the given expiration.\n", - " \"\"\"\n", - " def finder(x):\n", - " min_l_m= abs(x['log_moneyness']).min()\n", - " return x[x['log_moneyness'].abs() == min_l_m]['european_vols_equiv'].values[0]\n", - " return chain.groupby('expiration').apply(finder)\n", - "\n", - "def get_atm_T(chain: pd.DataFrame) -> pd.Series:\n", - " \"\"\"\n", - " Finds the ATM time to expiration for a given expiration in the chain.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame for a specific expiration.\n", - " \n", - " Returns:\n", - " pd.Series: The ATM time to expiration for the given expiration.\n", - " \"\"\"\n", - " def finder(x):\n", - " min_l_m= abs(x['log_moneyness']).min()\n", - " return x[x['log_moneyness'].abs() == min_l_m]['t'].values[0]\n", - " return chain.groupby('expiration').apply(finder)\n", - "\n", - "\n", - "atm_strike = get_atm_vol(european_converted_chain)\n", - "atm_t = get_atm_T(european_converted_chain)\n", - "atm_strike, atm_t" - ] - }, - { - "cell_type": "code", - "execution_count": 87, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(1632, 2428)" - ] - }, - "execution_count": 87, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "refined_chains = {}\n", - "for tick in chains:\n", - " refined_chains[tick] = confine_chain_with_pricing_config(chains[tick])\n", - "\n", - "sample_refined_chain = refined_chains['AAPL']\n", - "len(sample_refined_chain), len(sample_chain)" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "from trade.helpers.Logging import setup_logger\n", - "logger =setup_logger('SSVIModel')\n", - "\n", - "\n", - "def get_expected_column(col, \n", - " chain:pd.DataFrame,\n", - " valuation_date:str=None,\n", - " div_type:str='discrete'):\n", - " \"\"\"\n", - " Retrieves the expected column value for a given option chain.\n", - " Args:\n", - "\n", - " col (str): The column to retrieve ('f', 't', 'div_schedule', 'spot').\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " valuation_date (str): The date of valuation.\n", - " div_type (str): Type of dividend ('discrete' or 'continuous').\n", - " Returns:\n", - " float or pd.Series: The expected value for the specified column.\n", - " \"\"\"\n", - " if col == 'f':\n", - " return get_forward_price_on_chain(\n", - " chain,\n", - " valuation_date,\n", - " get_rates(valuation_date),\n", - " div_type=div_type\n", - " )\n", - " elif col == 't':\n", - " return chain['expiration'].apply(\n", - " lambda x: time_distance_helper(\n", - " x,\n", - " valuation_date,\n", - " )\n", - " ).astype(float)\n", - " elif col == 'div_schedule':\n", - " return get_dividend_schedule_on_chain(\n", - " chain,\n", - " valuation_date\n", - " )\n", - " elif col == 'spot':\n", - " return get_spot(chain['root'].iloc[0], valuation_date)\n", - " \n", - "\n", - "\n", - "def validate_chain_columns(\n", - " chain: pd.DataFrame,\n", - " valuation_date: str,\n", - " required_columns: list = None,\n", - " expected_columns: list = None,\n", - " div_type: str = 'discrete') -> pd.DataFrame :\n", - " \"\"\"\n", - " Validates that the required columns are present in the chain DataFrame.\n", - " Raises ValueError if any required column is missing.\n", - " \"\"\"\n", - " # Ensure chain is formatted\n", - " chain=format_chain(chain)\n", - " chain=confine_chain_with_pricing_config(chain)\n", - " chain['valuation_date'] = valuation_date \n", - " \n", - " # Define required columns based on the model\n", - " if required_columns is None:\n", - " required_columns = ['expiration', 'strike', 'right', 'midpoint', 'f', 'spot']\n", - "\n", - " ## Check for required columns\n", - " for col in required_columns:\n", - " if col not in chain.columns.str.lower():\n", - " raise ValueError(f\"Missing required column: {col} in chain DataFrame\")\n", - " \n", - " # Check for optional columns and fill them if missing\n", - " if expected_columns is None:\n", - " expected_columns = ['t']\n", - " for col in expected_columns:\n", - " if col not in chain.columns.str.lower():\n", - " # If the column is missing, we will fill it with default values\n", - " if col=='spot': assert 'root' in chain.columns.str.lower(), \\\n", - " \"Missing 'root' column in chain DataFrame for spot price retrieval\"\n", - " logger.warning(f\"Column {col} is missing in the chain DataFrame. Filling with default values.\")\n", - " chain[col] = get_expected_column(col,\n", - " chain=chain,\n", - " valuation_date=valuation_date,\n", - " div_type=div_type)\n", - "\n", - " \n", - " chain.columns = chain.columns.str.lower() # Normalize column names to lowercase\n", - " chain['moneyness']= chain['strike'] / chain['spot']\n", - " chain['log_moneyness'] = np.log(chain['moneyness'])\n", - " chain['fwd_moneyness']= chain['f'] / chain['strike']\n", - " chain['dte'] = chain['t'] * DAILY_BASIS # Convert T to DTE\n", - " call_chain = chain[chain['right'].str.lower() == 'c'].copy()\n", - " put_chain = chain[chain['right'].str.lower() == 'p'].copy()\n", - " return call_chain, put_chain, chain\n", - " \n", - "\n", - "\n", - "def calculate_vol(\n", - " chain: pd.DataFrame,\n", - " valuation_date: str,\n", - " N: int = 250,\n", - " model: str = 'binomial',\n", - "):\n", - " \n", - " if 'vol' not in chain.columns.str.lower():\n", - " logger.info(\"Calculating implied volatility for the option chain. Model is set to '%s'.\", model)\n", - " if model == 'bs':\n", - " # Use Black-Scholes model for volatility estimation\n", - " chain['vol'] = get_bs_vol_on_chain(chain, valuation_date)\n", - "\n", - " elif model == 'binomial':\n", - " # Use Binomial model for volatility estimation\n", - " chain['vol'] = get_discrete_crr_vol_on_chain(chain, valuation_date, N=N)\n", - " return chain\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## SSVI " - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "from typing import List, Tuple, Callable\n", - "import math\n", - "from trade.helpers.pools import runProcesses\n", - "\n", - "# -------------------------------------------------\n", - "# 1. Black-Scholes Call price (no SciPy need)\n", - "# -------------------------------------------------\n", - "def normal_cdf(x): # Φ(x)\n", - " return 0.5 * (1.0 + math.erf(x / math.sqrt(2)))\n", - "\n", - "def bs_call_price(spot, strike, maturity, rate, vol):\n", - " \"\"\"Black-Scholes European call.\"\"\"\n", - " if vol <= 0 or maturity <= 0:\n", - " return max(0.0, spot - strike)\n", - " d1 = (math.log(spot / strike) + (rate + 0.5 * vol**2) * maturity) / (vol * math.sqrt(maturity))\n", - " d2 = d1 - vol * math.sqrt(maturity)\n", - " return (spot * normal_cdf(d1) -\n", - " strike * math.exp(-rate * maturity) * normal_cdf(d2))\n", - "\n", - "# -------------------------------------------------\n", - "# 2. SSVI helpers\n", - "# -------------------------------------------------\n", - "def atm_total_variance(t, var0, var_inf, kappa):\n", - " \"\"\"\n", - " θ(t) = ((var0 - var_inf)*(1 - e^{-κ t})/(κ t) + var_inf) * t\n", - " \"\"\"\n", - " return ((var0 - var_inf) * (1 - np.exp(-kappa * t))\n", - " / (kappa * t) + var_inf) * t\n", - "\n", - "def skew_phi(theta_t, eta, lam):\n", - " return eta * theta_t ** lam\n", - "\n", - "def ssvi_total_variance(log_moneyness, theta_t, eta, lam, rho):\n", - " phi_val = skew_phi(theta_t, eta, lam)\n", - " term1 = rho * phi_val * log_moneyness\n", - " term2 = np.sqrt((phi_val * log_moneyness + rho)**2 + 1 - rho**2)\n", - " return 0.5 * theta_t * (1 + term1 + term2)\n", - "\n", - "def ssvi_implied_vol(fwd, strike, maturity,\n", - " var0, var_inf, kappa,\n", - " eta, lam, rho):\n", - " \"\"\"Return σ implied by SSVI.\"\"\"\n", - " k = np.log(strike / fwd) # log-moneyness\n", - " theta_t = atm_total_variance(maturity, var0, var_inf, kappa)\n", - " total_var = ssvi_total_variance(k, theta_t, eta, lam, rho)\n", - " return np.sqrt(total_var / maturity)\n", - "\n", - "def make_candidate(bounds: List[Tuple[float, float]], iterations) -> np.ndarray:\n", - " \"\"\"\n", - " Generate a random candidate solution within the given bounds.\n", - " bounds: list of (low, high) for each dimension\n", - " \"\"\"\n", - " rng = np.random.default_rng(42)\n", - " low = np.array([b[0] for b in bounds])\n", - " high = np.array([b[1] for b in bounds])\n", - "\n", - " # (iterations, d) matrix of uniform random samples\n", - " candidates = low + (high - low) * rng.random((iterations, len(bounds)))\n", - " return candidates\n", - "\n", - "\n", - "def random_search_vec(objective_multi: Callable[[np.ndarray], np.ndarray],\n", - " bounds: List[Tuple[float, float]],\n", - " iterations: int = 40_000) -> Tuple[np.ndarray, float]:\n", - " \"\"\"\n", - " Vectorised random search.\n", - " objective_multi: accepts an (N, d) array -> returns (N,) array of losses\n", - " bounds : list of (low, high) for each dimension\n", - " iterations : how many random draws\n", - " \"\"\"\n", - "\n", - " # vectorised loss evaluation -> (iterations,)\n", - " candidates = make_candidate(bounds, iterations)\n", - " losses = objective_multi(candidates)\n", - "\n", - " best_idx = np.argmin(losses)\n", - " return candidates[best_idx], losses[best_idx]\n", - "\n", - "\n", - "def atm_loss_multi(X, t, iv_atm):\n", - " \"\"\"\n", - " X : (N, 3) – rows = [var0, var_inf, kappa]\n", - " t, iv_atm – market ATM maturities and vols (1-D)\n", - " returns – loss for each row (shape (N,))\n", - " \"\"\"\n", - " var0, var_inf, kappa = X[:, 0], X[:, 1], X[:, 2]\n", - " theta_t = atm_total_variance(t[:, None], var0, var_inf, kappa) # broadcast\n", - " model_iv = np.sqrt(theta_t / t[:, None])\n", - " mse = ((model_iv - iv_atm[:, None])**2).mean(axis=0) # → (N,)\n", - "\n", - " # guard against NaN / huge vols\n", - " invalid = (np.isinf(mse)) | (np.isnan(mse))\n", - " mse = np.where(invalid, 1e4, mse) # penalise\n", - " return mse\n", - "\n", - "def surface_loss_multi(params_mat,\n", - " K_grid, T_grid, fwd,\n", - " var0_hat, var_inf_hat, kappa_hat,\n", - " market_iv):\n", - " \"\"\"\n", - " params_mat : shape (N, 3) – each row [eta, lambda, rho]\n", - " returns : shape (N,) – MSE per candidate\n", - " \"\"\"\n", - " eta, lam, rho = params_mat.T # (N,)\n", - "\n", - " # ---- hard bounds to avoid overflow -----------------------------------\n", - " bad = (eta <= 0) | (lam <= -0.9) | (lam >= 1.0) | (np.abs(rho) >= 0.999)\n", - " # mark bad rows; they get a huge constant loss later\n", - " safe_eta = np.where(bad, 1.0, eta) # (N,)\n", - " safe_lam = np.where(bad, 0.0, lam)\n", - " safe_rho = np.where(bad, 0.0, rho)\n", - "\n", - " # ---- broadcast market grid (M,1) with candidates (1,N) --------------\n", - " k = np.log(K_grid / fwd)[:, None] # (M,1)\n", - " T = T_grid[:, None] # (M,1)\n", - " theta = atm_total_variance(T, var0_hat, var_inf_hat, kappa_hat)\n", - "\n", - " # each safe_* is (N,) so reshape to (1,N) for broadcasting\n", - " total_var = ssvi_total_variance(\n", - " k, theta,\n", - " safe_eta[None, :], safe_lam[None, :], safe_rho[None, :]\n", - " ) # → (M,N)\n", - "\n", - " iv_model = np.sqrt(total_var / T) # (M,N)\n", - "\n", - " # ---- guard against any residual NaN / huge vols ----------------------\n", - " invalid = (~np.isfinite(iv_model)) | (iv_model > 5) # 500 % vol cutoff\n", - " iv_model = np.where(invalid, 1e4, iv_model) # penalise\n", - "\n", - " mse = np.mean((iv_model - market_iv[:, None])**2, axis=0) # (N,)\n", - "\n", - "\n", - " # slam the rows we flagged as ‘bad’\n", - " mse = np.where(bad, 1e9, mse)\n", - " return mse\n", - "\n", - "\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "def _loss_chunk_with_idx(idx,\n", - " params_chunk,\n", - " K_grid, T_grid, fwd,\n", - " var0_hat, var_inf_hat, kappa_hat,\n", - " market_iv):\n", - " # Call your original function on a chunk\n", - " mse = surface_loss_multi(params_chunk,\n", - " K_grid, T_grid, fwd,\n", - " var0_hat, var_inf_hat, kappa_hat,\n", - " market_iv)\n", - " return idx, mse # keep index so we can reassemble in order\n", - "\n", - "\n", - "def surface_loss_multi_parallel(params_mat,\n", - " K_grid, T_grid, fwd,\n", - " var0_hat, var_inf_hat, kappa_hat,\n", - " market_iv,\n", - " *,\n", - " chunk_size=1024,\n", - " run_type='imap'):\n", - " \"\"\"\n", - " Parallel wrapper around surface_loss_multi using runProcesses.\n", - " params_mat: (N,3) -> returns (N,)\n", - " No globals; constants are passed to each worker.\n", - " \"\"\"\n", - " N = int(params_mat.shape[0])\n", - " if N == 0:\n", - " return np.empty((0,), dtype=float)\n", - "\n", - " # 1) Make chunks\n", - " chunks = [params_mat[i:min(i+chunk_size, N)] \n", - " for i in range(0, N, chunk_size)]\n", - " idxs = list(range(len(chunks)))\n", - " n = len(chunks)\n", - "\n", - " # 2) Build OrderedInputs for your runProcesses(func, [args1, args2, ...])\n", - " OrderedInputs = [\n", - " idxs,\n", - " chunks,\n", - " [K_grid] * n,\n", - " [T_grid] * n,\n", - " [fwd] * n,\n", - " [var0_hat] * n,\n", - " [var_inf_hat] * n,\n", - " [kappa_hat] * n,\n", - " [market_iv] * n,\n", - " ]\n", - "\n", - " # 3) Fan out\n", - " results = runProcesses(_loss_chunk_with_idx, OrderedInputs, run_type=run_type)\n", - "\n", - " # 4) Materialize depending on run_type\n", - " if run_type == 'amap': # async ordered\n", - " results = results.get()\n", - " elif run_type in ('imap', 'uimap'): # iterator / unordered\n", - " results = list(results)\n", - "\n", - " # 5) Reassemble in original order of rows\n", - " results.sort(key=lambda x: x[0]) # by chunk index\n", - " mse_chunks = [m for _, m in results]\n", - " return np.concatenate(mse_chunks, axis=0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "PRICING_CONFIG['ATM_WIDTH'] =0.05" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'INTRADAY_AGG': '5m',\n", - " 'MARKET_OPEN_TIME': '09:30',\n", - " 'MARKET_CLOSE_TIME': '16:00',\n", - " 'AVAILABLE_PRICING_MODELS': ['bs', 'binomial', 'mc'],\n", - " 'AVAILABLE_INTERVALS': ['h', 'd', 'w', 'q', 'y', 'M', 'm'],\n", - " 'AVAILABLE_GREEKS': ['vega',\n", - " 'vanna',\n", - " 'volga',\n", - " 'delta',\n", - " 'gamma',\n", - " 'theta',\n", - " 'rho'],\n", - " 'UPPER_BOUND_MONEYNESS': 1.2,\n", - " 'LOWER_BOUND_MONEYNESS': 0.8,\n", - " 'DAYS_IN_MONTH': 30,\n", - " 'DAYS_IN_YEAR': 360,\n", - " 'MIN_BAR_TIME_INTERVAL': '5m',\n", - " 'QUOTE_DATA_START_TIME': '9:45:00',\n", - " 'VOL_SURFACE_WIDTH': 0.8,\n", - " 'VOL_SURFACE_MIN_DTE_THRESHOLD': 30,\n", - " 'VOL_SURFACE_MAX_DTE_THRESHOLD': 732,\n", - " 'ATM_WIDTH': 0.05,\n", - " 'VOL_SURFACE_SURFACE_LOSS_THRESHOLD': 0.1,\n", - " 'VOL_SURFACE_ATM_LOSS_THRESHOLD': 0.05,\n", - " 'DEFAULT_SSVI_PARAMS_ITERATION': 25000}" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "PRICING_CONFIG" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Calculating ATM T and vol for AAPL on 2025-07-16\n", - "Done for AAPL on 2025-07-16\n", - "Calculating ATM T and vol for MSFT on 2025-07-16\n", - "Done for MSFT on 2025-07-16\n", - "Calculating ATM T and vol for GOOGL on 2025-07-16\n", - "Done for GOOGL on 2025-07-16\n", - "Calculating ATM T and vol for AMZN on 2025-07-16\n", - "Done for AMZN on 2025-07-16\n", - "Calculating ATM T and vol for TSLA on 2025-07-16\n", - "Done for TSLA on 2025-07-16\n" - ] - } - ], - "source": [ - "atm_iv ={}\n", - "atm_T={}\n", - "\n", - "def get_atm_T_vols_on_chain(\n", - " chain:pd.DataFrame\n", - ") -> pd.Series:\n", - " \"\"\"\n", - " Retrieves the ATM implied volatilities for a given option chain.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " valuation_date (str): The date of valuation.\n", - " \n", - " Returns:\n", - " pd.Series: The ATM implied volatilities for the option chain.\n", - " \"\"\"\n", - " return chain[chain['moneyness'].between(1-PRICING_CONFIG['ATM_WIDTH'], \n", - " 1+PRICING_CONFIG['ATM_WIDTH'])]['vol'].values\n", - "\n", - "def get_atm_T_maturities_on_chain(\n", - " chain:pd.DataFrame\n", - ") -> pd.Series:\n", - " \"\"\"\n", - " Retrieves the ATM maturities for a given option chain.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " \n", - " Returns:\n", - " pd.Series: The ATM maturities for the option chain.\n", - " \"\"\"\n", - " if 'T' in chain.columns:\n", - " chain['t']= chain['T']\n", - " \n", - " return chain[chain['moneyness'].between(1-PRICING_CONFIG['ATM_WIDTH'], \n", - " 1+PRICING_CONFIG['ATM_WIDTH'])]['t'].values\n", - "\n", - "for tick in refined_chains:\n", - " print(f\"Calculating ATM T and vol for {tick} on {test_valuation_date}\")\n", - " atm_iv[tick] = get_atm_T_vols_on_chain(chains[tick])\n", - " atm_T[tick] = get_atm_T_maturities_on_chain(chains[tick])\n", - " print(f\"Done for {tick} on {test_valuation_date}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Calculating best params for AAPL on 2025-07-16\n", - "Done for AAPL on 2025-07-16\n", - "Calculating best params for MSFT on 2025-07-16\n", - "Done for MSFT on 2025-07-16\n", - "Calculating best params for GOOGL on 2025-07-16\n", - "Done for GOOGL on 2025-07-16\n", - "Calculating best params for AMZN on 2025-07-16\n", - "Done for AMZN on 2025-07-16\n", - "Calculating best params for TSLA on 2025-07-16\n", - "Done for TSLA on 2025-07-16\n" - ] - }, - { - "data": { - "text/plain": [ - "{'AAPL': {'var0_hat': 0.08300936940997879,\n", - " 'var_inf_hat': 0.06550145460933357,\n", - " 'kappa_hat': 2.90959397166083,\n", - " 'atm_loss': 0.0006028864626750488},\n", - " 'MSFT': {'var0_hat': 0.05214367382870849,\n", - " 'var_inf_hat': 0.0645658391494492,\n", - " 'kappa_hat': 0.7653244164335816,\n", - " 'atm_loss': 0.001695821106932738},\n", - " 'GOOGL': {'var0_hat': 0.15622857816972924,\n", - " 'var_inf_hat': 0.067951107265773,\n", - " 'kappa_hat': 2.837984186845636,\n", - " 'atm_loss': 0.0022094514483511508},\n", - " 'AMZN': {'var0_hat': 0.10413944300906883,\n", - " 'var_inf_hat': 0.09278877536483207,\n", - " 'kappa_hat': 2.0858739702564564,\n", - " 'atm_loss': 0.0012366408505716836},\n", - " 'TSLA': {'var0_hat': 0.19908227140274562,\n", - " 'var_inf_hat': 0.19380147408874504,\n", - " 'kappa_hat': 0.7020154721352964,\n", - " 'atm_loss': 0.014546646015758702}}" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "params={}\n", - "def get_best_params(T_atm: List[float],\n", - " iv_atm: List[float]) -> Tuple[np.ndarray, float]:\n", - " \"\"\"\n", - " Find the best parameters for the ATM term structure.\n", - " Returns:\n", - " var0_hat, var_inf_hat, kappa_hat\n", - " \"\"\"\n", - " bounds = [(1e-4, 0.2), # var0: Min ATM Variance across DTE\n", - " (1e-4, 0.2), # var_inf_hat: Max ATM Variance across DTE\n", - " (0.05, 3.0)] # kappa: Speed from var0 to var_inf_hat\n", - " best_params, best_loss = random_search_vec(\n", - " lambda X: atm_loss_multi(X, T_atm, iv_atm),\n", - " bounds,\n", - " iterations=3000\n", - " )\n", - " return best_params, best_loss\n", - "\n", - "\n", - "# best_params, best_loss = get_best_params()\n", - "# var0_hat, var_inf_hat, kappa_hat = best_params\n", - "# print(\"best\", best_params, \"loss\", best_loss)\n", - "\n", - "for tick in refined_chains:\n", - " print(f\"Calculating best params for {tick} on {test_valuation_date}\")\n", - " (var0_hat, var_inf_hat, kappa_hat), atm_loss = get_best_params(\n", - " atm_T[tick],\n", - " atm_iv[tick]\n", - " )\n", - " params[tick] = {\n", - " 'var0_hat': var0_hat,\n", - " 'var_inf_hat': var_inf_hat,\n", - " 'kappa_hat': kappa_hat,\n", - " 'atm_loss': atm_loss\n", - " }\n", - "\n", - " print(f\"Done for {tick} on {test_valuation_date}\")\n", - "params" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Calculating K, T, market IV and F for AAPL on 2025-07-16\n", - "Done for AAPL on 2025-07-16\n", - "Calculating K, T, market IV and F for MSFT on 2025-07-16\n", - "Done for MSFT on 2025-07-16\n", - "Calculating K, T, market IV and F for GOOGL on 2025-07-16\n", - "Done for GOOGL on 2025-07-16\n", - "Calculating K, T, market IV and F for AMZN on 2025-07-16\n", - "Done for AMZN on 2025-07-16\n", - "Calculating K, T, market IV and F for TSLA on 2025-07-16\n", - "Done for TSLA on 2025-07-16\n" - ] - } - ], - "source": [ - "k_grid = {}\n", - "t_grid = {}\n", - "market_iv_grid= {}\n", - "fwd_grid= {}\n", - "\n", - "def get_K_grid(chain:pd.DataFrame) -> np.ndarray:\n", - " \"\"\"\n", - " Retrieves the strike prices from the option chain.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " \n", - " Returns:\n", - " np.ndarray: The strike prices for the option chain.\n", - " \"\"\"\n", - " return chain['strike'].values\n", - "\n", - "def get_T_grid(chain:pd.DataFrame) -> np.ndarray:\n", - " \"\"\"\n", - " Retrieves the maturities from the option chain.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " \n", - " Returns:\n", - " np.ndarray: The maturities for the option chain.\n", - " \"\"\"\n", - " return chain['t'].values\n", - "\n", - "def get_market_iv_grid(chain:pd.DataFrame) -> np.ndarray:\n", - " \"\"\"\n", - " Retrieves the market implied volatilities from the option chain.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " \n", - " Returns:\n", - " np.ndarray: The market implied volatilities for the option chain.\n", - " \"\"\"\n", - " return chain['vol'].values\n", - "\n", - "def get_fwd_grid(chain:pd.DataFrame) -> float:\n", - " \"\"\"\n", - " Retrieves the forward price from the option chain.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " \n", - " Returns:\n", - " float: The forward price for the option chain.\n", - " \"\"\"\n", - " return chain['f'].iloc[0] # Assuming F is constant across the chains\n", - "\n", - "\n", - "for tick in refined_chains:\n", - " print(f\"Calculating K, T, market IV and F for {tick} on {test_valuation_date}\")\n", - " k_grid[tick] = get_K_grid(refined_chains[tick])\n", - " t_grid[tick] = get_T_grid(refined_chains[tick])\n", - " market_iv_grid[tick] = get_market_iv_grid(refined_chains[tick])\n", - " fwd_grid[tick] = get_fwd_grid(refined_chains[tick])\n", - " print(f\"Done for {tick} on {test_valuation_date}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "def get_surface_params(\n", - " k_grid: np.ndarray,\n", - " t_grid: np.ndarray,\n", - " fwd_grid: float,\n", - " var0_hat: float,\n", - " var_inf_hat: float,\n", - " kappa_hat: float,\n", - " market_iv_grid: np.ndarray,\n", - " iterations: int = 50_000,\n", - " chunk_size: int = None\n", - ") -> Tuple[float, float, float, float]:\n", - " \"\"\"\n", - " Estimate the SSVI surface parameters (eta, lambda, rho) using random search.\n", - " Args:\n", - " k_grid (np.ndarray): The strike prices.\n", - " t_grid (np.ndarray): The maturities.\n", - " fwd_grid (float): The forward price.\n", - " var0_hat (float): Estimated initial variance.\n", - " var_inf_hat (float): Estimated long-term variance.\n", - " kappa_hat (float): Estimated speed of mean reversion.\n", - " market_iv_grid (np.ndarray): Market implied volatilities.\n", - " iterations (int): Number of random search iterations.\n", - " chunk_size (int): Size of chunks for parallel processing.\n", - " Returns:\n", - " Tuple[float, float, float, float]: Estimated parameters (eta, lambda, rho) and best loss.\n", - " \"\"\"\n", - " if chunk_size is None:\n", - " chunk_size = int(iterations / 8)\n", - "\n", - " # 1️⃣ tighter parameter bounds\n", - " surf_bounds = [(0.05, 1.5), # eta\n", - " (-0.8, 0.8), # lambda\n", - " (-0.95, 0.95)] # rho\n", - "\n", - "\n", - " surface_lamba = lambda X: surface_loss_multi_parallel(X, K_grid=k_grid, \n", - " T_grid=t_grid,\n", - " fwd=fwd_grid,\n", - " var0_hat=var0_hat,\n", - " var_inf_hat=var_inf_hat,\n", - " kappa_hat=kappa_hat,\n", - " market_iv=market_iv_grid,\n", - " chunk_size=chunk_size)\n", - " (eta_hat, lambda_hat, rho_hat), best_loss = random_search_vec(surface_lamba,\n", - " surf_bounds, iterations)\n", - "\n", - " return eta_hat, lambda_hat, rho_hat, best_loss\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Calculating surface params for AAPL on 2025-07-16\n", - "Done for AAPL on 2025-07-16\n", - "Calculating surface params for MSFT on 2025-07-16\n", - "Done for MSFT on 2025-07-16\n", - "Calculating surface params for GOOGL on 2025-07-16\n", - "Done for GOOGL on 2025-07-16\n", - "Calculating surface params for AMZN on 2025-07-16\n", - "Done for AMZN on 2025-07-16\n", - "Calculating surface params for TSLA on 2025-07-16\n", - "Done for TSLA on 2025-07-16\n" - ] - } - ], - "source": [ - "for tick in refined_chains:\n", - " print(f\"Calculating surface params for {tick} on {test_valuation_date}\")\n", - " eta_hat, lambda_hat, rho_hat, best_loss = get_surface_params(\n", - " k_grid[tick],\n", - " t_grid[tick],\n", - " fwd_grid[tick],\n", - " params[tick]['var0_hat'],\n", - " params[tick]['var_inf_hat'],\n", - " params[tick]['kappa_hat'],\n", - " market_iv_grid[tick]\n", - " )\n", - " params[tick].update({\n", - " 'eta_hat': eta_hat,\n", - " 'lambda_hat': lambda_hat,\n", - " 'rho_hat': rho_hat,\n", - " 'surface_loss': best_loss\n", - " })\n", - " print(f\"Done for {tick} on {test_valuation_date}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "def calculate_normalized_rmse_loss(\n", - " market_iv: np.ndarray,\n", - " model_iv: np.ndarray,\n", - " moneyness: np.ndarray,\n", - ") -> Tuple[float, float, float]:\n", - " \n", - " \"\"\"\n", - " Calculate the normalized loss between market and model implied volatilities.\n", - " \n", - " Args:\n", - " market_iv (np.ndarray): Market implied volatilities.\n", - " model_iv (np.ndarray): Model implied volatilities.\n", - " moneyness (np.ndarray): Moneyness values.\n", - " \n", - " Returns:\n", - " Tuple[float, float, float]: Normalized median loss, right wing loss, left wing loss.\n", - " \"\"\"\n", - " \n", - " ## Normalized Median\n", - " median_iv = np.median(market_iv)\n", - " normalized_median_loss = np.sqrt(np.mean((market_iv - model_iv)**2)) / median_iv\n", - "\n", - " ## Right Wing Loss (> 1.0)\n", - " right_wing_mask = moneyness > 1.0\n", - " median_right_wing_iv = np.median(market_iv[right_wing_mask])\n", - " right_wing_loss = np.sqrt(np.mean(\n", - " (market_iv[right_wing_mask] - model_iv[right_wing_mask]) **2)) / median_right_wing_iv\n", - "\n", - " ## Left Wing Loss (< 1.0)\n", - " left_wing_mask = moneyness < 1.0\n", - " median_left_wing_iv = np.median(market_iv[left_wing_mask])\n", - " left_wing_loss = np.sqrt(np.mean(\n", - " (market_iv[left_wing_mask] - model_iv[left_wing_mask])**2)) / median_left_wing_iv\n", - "\n", - " return normalized_median_loss, right_wing_loss, left_wing_loss\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "def calculate_normalized_mae_loss(\n", - " market_iv: np.ndarray,\n", - " model_iv: np.ndarray,\n", - " moneyness: np.ndarray\n", - ") -> Tuple[float, float, float]:\n", - " \"\"\"\n", - " Calculate the normalized mean absolute error (MAE) loss between market and model implied volatilities.\n", - " \n", - " Args:\n", - " market_iv (np.ndarray): Market implied volatilities.\n", - " model_iv (np.ndarray): Model implied volatilities.\n", - " moneyness (np.ndarray): Moneyness values.\n", - " \n", - " Returns:\n", - " Tuple[float, float, float]: Normalized median MAE loss, right wing MAE loss, left wing MAE loss.\n", - " \"\"\"\n", - " \n", - " ## Normalized Median\n", - " median_iv = np.median(market_iv)\n", - " normalized_median_mae_loss = np.mean(np.abs(market_iv - model_iv)) / median_iv\n", - "\n", - " ## Right Wing Loss (> 1.0)\n", - " right_wing_mask = moneyness > 1.0\n", - " median_right_wing_iv = np.median(market_iv[right_wing_mask])\n", - " right_wing_mae_loss = np.mean(\n", - " np.abs(market_iv[right_wing_mask] - model_iv[right_wing_mask])) / median_right_wing_iv\n", - "\n", - " ## Left Wing Loss (< 1.0)\n", - " left_wing_mask = moneyness < 1.0\n", - " median_left_wing_iv = np.median(market_iv[left_wing_mask])\n", - " left_wing_mae_loss = np.mean(\n", - " np.abs(market_iv[left_wing_mask] - model_iv[left_wing_mask])) / median_left_wing_iv\n", - "\n", - " return normalized_median_mae_loss, right_wing_mae_loss, left_wing_mae_loss" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.2464065708418891" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "## DATE UTILS\n", - "\n", - "from dbase.DataAPI.ThetaData import (\n", - " extract_numeric_value)\n", - "from datetime import date, datetime\n", - "\n", - "\n", - "def identify_length_for_model(string, integer) -> int:\n", - " \"\"\"\n", - " \n", - " Identify the length of the timeframe in minutes based on the string and integer provided.\n", - " Parameters\n", - " \n", - " ----------\n", - " string : str\n", - " The string representing the timeframe (e.g., 'm', 'd', 'w', 'y').\n", - " integer : int\n", - " The integer representing the number of units for the timeframe.\n", - " Returns\n", - " -------\n", - " int\n", - " The length of the timeframe in minutes.\n", - " \n", - " \"\"\"\n", - "\n", - " TIMEFRAMES_VALUES = {'d': 1, 'w': 7, 'm': 30, 'y': DAILY_BASIS}\n", - " assert string in TIMEFRAMES_VALUES.keys(\n", - " ), f'Available timeframes are {TIMEFRAMES_VALUES.keys()}, recieved \"{string}\"'\n", - " return integer * TIMEFRAMES_VALUES[string]\n", - "\n", - "def convert_date_to_time_to_maturity(dt: str,\n", - " valuation_date: str = None) -> float:\n", - " \"\"\"\n", - " Converts a date to time to maturity in years.\n", - " \n", - " Args:\n", - " dt (datetime): The date to convert.\n", - " example: '3m', '2025-08-08', 1\n", - " \n", - " Returns:\n", - " float: Time to maturity in years.\n", - " \"\"\"\n", - "\n", - " ## If dt is a string, check if it is a date or a duration\n", - " if isinstance(dt, (str, pd.Timestamp, datetime, date)):\n", - " try:\n", - " # Try to parse as a date first\n", - " dt = pd.to_datetime(dt)\n", - " assert valuation_date is not None, \"valuation_date must be provided if dt is a date string\"\n", - " valuation_date = pd.to_datetime(valuation_date)\n", - " dt = (dt - valuation_date).days\n", - " except ValueError:\n", - " # If it fails, assume it's a duration\n", - " dt = identify_length_for_model(*extract_numeric_value(dt))\n", - " if dt is None:\n", - " raise ValueError(f\"Invalid date or duration format: {dt}\")\n", - " elif isinstance(dt, (float,int)):\n", - " # If dt is a number, assume it's a duration in days\n", - " dt = float(dt)\n", - " elif isinstance(dt, pd.Timedelta):\n", - " # If dt is a timedelta, convert it to days\n", - " dt = dt.days\n", - "\n", - " else:\n", - " raise ValueError(f\"Unsupported type for dt: {type(dt)}. Expected str, int, float, datetime, or pd.Timedelta.\")\n", - "\n", - " assert_dt_within_range(dt)\n", - " return dt/DAILY_BASIS\n", - "\n", - "def assert_dt_within_range(dt: float):\n", - " \"\"\"\n", - " Asserts that the time to maturity is within the range defined by PRICING_CONFIG.\n", - " \n", - " Args:\n", - " dt (float): The time to maturity in years.\n", - " \n", - " Raises:\n", - " ValueError: If dt is not within the configured range.\n", - " \"\"\"\n", - " if not (PRICING_CONFIG['VOL_SURFACE_MIN_DTE_THRESHOLD'] <= dt <= PRICING_CONFIG['VOL_SURFACE_MAX_DTE_THRESHOLD']):\n", - " raise ValueError(f\"Time to maturity {dt} is out of bounds. \"\n", - " f\"Must be between {PRICING_CONFIG['VOL_SURFACE_MIN_DTE_THRESHOLD']} and {PRICING_CONFIG['VOL_SURFACE_MAX_DTE_THRESHOLD']}.\")\n", - "\n", - "convert_date_to_time_to_maturity('3m')" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "## Strike Convert Utils\n", - "\n", - "def assert_k_bounds_model_range(k: list | np.ndarray,\n", - " f: float) -> None:\n", - " \"\"\"\n", - " Asserts that the strikes are within the bounds defined by PRICING_CONFIG.\n", - " Args:\n", - " k (list or np.ndarray): List of strikes.\n", - " Raises:\n", - " ValueError: If any strike is not within the configured bounds.\n", - " \"\"\"\n", - " k = np.array(k, dtype=float)\n", - " if not np.all((k >= f * (1 - PRICING_CONFIG['VOL_SURFACE_WIDTH'])) &\n", - " (k <= f * (1 + PRICING_CONFIG['VOL_SURFACE_WIDTH']))):\n", - " raise ValueError(f\"Strikes {k} are out of bounds. \"\n", - " f\"Must be between {f * (1 - PRICING_CONFIG['VOL_SURFACE_WIDTH'])} and {f * (1 + PRICING_CONFIG['VOL_SURFACE_WIDTH'])}.\")\n", - "\n", - "def handle_strikes(\n", - " k: list| np.ndarray,\n", - " f: list| float, \n", - " strike_type: Literal['p', 'k', 'pf', 'f'],\n", - " spot: float = None\n", - ") -> np.ndarray:\n", - " \"\"\"\n", - " Convert strikes based on the specified strike type.\n", - " Since SSVI model takes strikes values as absolute values, this function converts the strikes\n", - " \n", - " Args:\n", - " k (list or np.ndarray): List of strikes.\n", - " f (list or float): Forward price.\n", - " strike_type (str): Type of strike ('p', 'k', 'pf', 'f').\n", - " \n", - " Returns:\n", - " np.ndarray: Converted strikes.\n", - " \"\"\"\n", - " k = np.array(k, dtype=float)\n", - " if strike_type == 'p': ## Percent of spot to fwd_grid\n", - " if spot is None:\n", - " raise ValueError(\"Spot price must be provided for 'p' strike type.\")\n", - " \n", - " strikes= k * spot\n", - " elif strike_type == 'k': ## Strike to fwd_grid\n", - " strikes= k\n", - " elif strike_type == 'pf': ## Percent of fwd_grid\n", - " strikes= k * f\n", - " elif strike_type == 'f': ## Forward price\n", - " strikes ## It is expected that strike passed is forward price strike\n", - " else:\n", - " raise ValueError(f\"Invalid strike type: {strike_type}\")\n", - " assert_k_bounds_model_range(strikes, f)\n", - " return strikes\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "from dataclasses import dataclass, field\n", - "from pydantic import BaseModel, Field, ConfigDict\n", - "from pydantic.dataclasses import dataclass\n", - "from abc import ABC, abstractmethod\n", - "from typing import List, Tuple, Literal\n", - "from scipy.interpolate import interp1d\n", - "from trade.helpers.Logging import setup_logger\n", - "logger =setup_logger('SSVIModel')\n", - "\n", - "@dataclass\n", - "class SSVIModelParams:\n", - " \"\"\"\n", - " SSVI Model Parameters for the Stochastic Volatility Surface.\n", - " This class holds the parameters for the SSVI model, including the ATM variance, \n", - " long-term variance, speed of mean reversion, skewness, kurtosis, and correlation.\n", - " Attributes:\n", - " var0_hat (float): Initial variance estimate at ATM.\n", - " var_inf_hat (float): Long-term variance estimate.\n", - " kappa_hat (float): Speed of mean reversion.\n", - " eta_hat (float): Skewness parameter.\n", - " lambda_hat (float): Kurtosis parameter.\n", - " rho_hat (float): Correlation parameter.\n", - " atm_loss (float): Loss associated with the ATM volatility estimation.\n", - " surface_loss (float): Loss associated with the surface fitting.\n", - " \"\"\"\n", - " var0_hat: float = Field(default=0.0, description=\"Initial variance estimate at ATM\")\n", - " var_inf_hat: float = Field(default=0.0, description=\"Long-term variance estimate\")\n", - " kappa_hat: float = Field(default=0.0, description=\"Speed of Mean Reversion\")\n", - " eta_hat: float = Field(default=0.0, description=\"Skewness parameter\")\n", - " lambda_hat: float = Field(default=0.0, description=\"Kurtosis parameter\")\n", - " rho_hat: float = Field(default=0.0, description=\"Correlation parameter\")\n", - " atm_loss: float = Field(default=0.0, description=\"Loss associated with ATM volatility estimation\")\n", - " surface_loss: float = Field(default=0.0, description=\"Loss associated with surface fitting\")\n", - " nrmse: float = Field(default=0.0, description=\"Normalized Mean Squared Error\")\n", - " rw_nrmse: float = Field(default=0.0, description=\"Right Wing Normalized Mean Squared Error\")\n", - " lw_nrmse: float = Field(default=0.0, description=\"Left Wing Normalized Mean Squared Error\")\n", - " nmae: float = Field(default=0.0, description=\"Normalized Mean Absolute Error\")\n", - " rw_nmae: float = Field(default=0.0, description=\"Right Wing Normalized Mean Absolute Error\")\n", - " lw_nmae: float = Field(default=0.0, description=\"Left Wing Normalized Mean Absolute Error\")\n", - " \n", - " def __repr__(self):\n", - " acceptable_fields = ['var0_hat', 'var_inf_hat', 'kappa_hat',\n", - " 'eta_hat', 'lambda_hat', 'rho_hat',\n", - " 'atm_loss', 'surface_loss']\n", - " params = {field: getattr(self, field) for field in acceptable_fields}\n", - " return (f\"SSVIModelParams{params}\\n\")\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "## Right Picking Util\n", - "\n", - "def _sigmoid_func(k: np.ndarray, \n", - " f: float) -> np.ndarray:\n", - " x = np.log(k/f)\n", - " return 1/(1 + np.exp(4*x))\n", - "\n", - "def pick_params(call_params: SSVIModelParams,\n", - " put_params: SSVIModelParams,\n", - " right: str) -> SSVIModelParams:\n", - " \"\"\"\n", - " Pick parameters based on the option type (call or put).\n", - " \n", - " Args:\n", - " call_params (SSVIModelParams): Parameters for call options.\n", - " put_params (SSVIModelParams): Parameters for put options.\n", - " right (str): The option type ('c' for call, 'p' for put).\n", - " \n", - " Returns:\n", - " SSVIModelParams: The selected parameters based on the option type.\n", - " \"\"\"\n", - " if right.lower() == 'c':\n", - " return call_params\n", - " elif right.lower() == 'p':\n", - " return put_params\n", - " else:\n", - " raise ValueError(f\"Invalid option type: {right}. Expected 'c' or 'p'.\")\n", - " \n", - "def predict_vol(\n", - " k: float,\n", - " t: float,\n", - " f: float,\n", - " right: str,\n", - " call_params: SSVIModelParams,\n", - " put_params: SSVIModelParams\n", - ") -> float:\n", - " \"\"\"\n", - " Predict the volatility using the SSVI model parameters.\n", - " \n", - " Args:\n", - " k (float): Strike price.\n", - " t (float): Time to maturity in years.\n", - " f (float): Forward price.\n", - " params (SSVIModelParams): The SSVI model parameters.\n", - " \n", - " Returns:\n", - " float: The predicted volatility.\n", - " \"\"\"\n", - " if right in ['c', 'p']:\n", - " params = pick_params(call_params, put_params, right)\n", - " elif right in ['itm', 'otm']:\n", - " call_vols = predict_vol(k, t, f, 'c', call_params, put_params)\n", - " put_vols = predict_vol(k, t, f, 'p', call_params, put_params)\n", - " w = _sigmoid_func(k, f)\n", - " if right == 'itm': ## Left: Call, Right: Put\n", - " return w * call_vols + (1 - w) * put_vols\n", - " else:\n", - " return (1 - w) * call_vols + w * put_vols\n", - " else:\n", - " raise ValueError(f\"Invalid option type: {right}. Expected 'c', 'p', 'itm', or 'otm'.\")\n", - "\n", - " return ssvi_implied_vol(\n", - " fwd=f, strike=k, maturity=t,\n", - " var0=params.var0_hat, var_inf=params.var_inf_hat, kappa=params.kappa_hat,\n", - " eta=params.eta_hat, lam=params.lambda_hat, rho=params.rho_hat\n", - " )" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [], - "source": [ - "def build_svi_params_obj(\n", - " chain: pd.DataFrame,\n", - " var0_hat: float,\n", - " var_inf_hat: float,\n", - " kappa_hat: float,\n", - " eta_hat: float,\n", - " lambda_hat: float,\n", - " rho_hat: float,\n", - " atm_loss: float,\n", - " surface_loss: float,\n", - ") -> SSVIModelParams:\n", - " \n", - " \"\"\"\n", - " Build an SSVIModelParams object from the given parameters.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " var0_hat (float): Initial variance estimate at ATM.\n", - " var_inf_hat (float): Long-term variance estimate.\n", - " kappa_hat (float): Speed of mean reversion.\n", - " eta_hat (float): Skewness parameter.\n", - " lambda_hat (float): Kurtosis parameter.\n", - " rho_hat (float): Correlation parameter.\n", - " atm_loss (float): Loss associated with ATM volatility estimation.\n", - " surface_loss (float): Loss associated with surface fitting.\n", - " \n", - " Returns:\n", - " SSVIModelParams: The SSVI model parameters object.\n", - " \"\"\"\n", - " ## Calculate normalized losses\n", - " moneyness = chain['moneyness'].values\n", - " market_iv = chain['vol'].values\n", - " model_iv = ssvi_implied_vol(\n", - " fwd=get_fwd_grid(chain),\n", - " strike=get_K_grid(chain),\n", - " maturity= get_T_grid(chain),\n", - " var0=var0_hat, var_inf=var_inf_hat, kappa=kappa_hat,\n", - " eta=eta_hat, lam=lambda_hat, rho=rho_hat\n", - " )\n", - "\n", - " normalized_nrmse, rw_nrmse, lw_nrmse = calculate_normalized_rmse_loss(\n", - " market_iv=market_iv,\n", - " model_iv=model_iv,\n", - " moneyness=moneyness\n", - " )\n", - " normalized_nmae, rw_nmae, lw_nmae = calculate_normalized_mae_loss(\n", - " market_iv=market_iv,\n", - " model_iv=model_iv,\n", - " moneyness=moneyness\n", - " )\n", - " return SSVIModelParams(\n", - " var0_hat=var0_hat,\n", - " var_inf_hat=var_inf_hat,\n", - " kappa_hat=kappa_hat,\n", - " eta_hat=eta_hat,\n", - " lambda_hat=lambda_hat,\n", - " rho_hat=rho_hat,\n", - " atm_loss=atm_loss,\n", - " surface_loss=surface_loss,\n", - " nrmse=normalized_nrmse,\n", - " rw_nrmse=rw_nrmse,\n", - " lw_nrmse=lw_nrmse,\n", - " nmae=normalized_nmae,\n", - " rw_nmae=rw_nmae,\n", - " lw_nmae=lw_nmae\n", - " )" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "from typing import ClassVar\n", - "class BaseSSVIModel(ABC):\n", - "\n", - " @abstractmethod\n", - " def predict(self, *args, **kwargs):\n", - " \"\"\"\n", - " Abstract method to predict the implied volatility surface.\n", - " Must be implemented by subclasses.\n", - " \"\"\"\n", - " pass\n", - "\n", - "\n", - " @abstractmethod\n", - " def fit(self, *args, **kwargs):\n", - " \"\"\"\n", - " Abstract method to fit the SSVI model.\n", - " Must be implemented by subclasses.\n", - " \"\"\"\n", - " pass\n", - "\n", - "\n", - "class SSVIModel(BaseSSVIModel):\n", - " \"\"\"\n", - " SSVI Model for Stochastic Volatility Surface.\n", - " This class implements the SSVI model using the parameters defined in SSVIModelParams.\n", - " It provides methods to predict implied volatility, build the model, and fit the model.\n", - "\n", - " Note: There will be no market data retrieval in this class. Technically, it is completely blind to market data.\n", - " This model will be enforcing discrete dividends and will not support continuous dividends.\n", - " \"\"\"\n", - " REQUIRED_COLUMNS: ClassVar[List[str]] = ['expiration', 'strike', 'right', 'midpoint', 'f', 'spot']\n", - " EXPECTED_COLUMNS: ClassVar[List[str]] = ['t']\n", - "\n", - " def __init__(self,\n", - " chain: pd.DataFrame,\n", - " valuation_date: str | datetime,\n", - " model: Literal['bs', 'binomial'] = 'bs',\n", - " **kwargs):\n", - " \n", - "\n", - " self.params: SSVIModelParams = None\n", - " self.chain: pd.DataFrame = chain.copy()\n", - " self.valuation_date: str|datetime = valuation_date\n", - " self.model: Literal['bs', 'binomial'] = model\n", - " self.call_chain: pd.DataFrame = None # Placeholder for call chain\n", - " self.put_chain: pd.DataFrame = None\n", - " self.atm_t:list = None\n", - " self.atm_iv:list = None\n", - " self.div_type: str = 'discrete' \n", - " self.required_columns: List[str] = self.get_required_columns()\n", - " self.expected_columns: List[str] = self.get_expected_columns()\n", - " self._fwd_interp: interp1d = None # Placeholder for forward price interpolation\n", - " self.call_params: SSVIModelParams = SSVIModelParams()\n", - " self.put_params: SSVIModelParams = SSVIModelParams()\n", - " self.iterations: int = kwargs.get('iterations', PRICING_CONFIG['DEFAULT_SSVI_PARAMS_ITERATION']) # Default iterations for fitting\n", - " self.chunk_size: int = kwargs.get('chunk_size', 2000) # Default chunk size for parallel processing\n", - "\n", - " self.__model_post_init(None) # Call post-init validation and calculation\n", - "\n", - "\n", - " def get_required_columns(self) -> List[str]:\n", - " \"\"\"\n", - " Returns the list of required columns for the SSVI model.\n", - " This includes the columns needed for the option chain DataFrame.\n", - " \"\"\"\n", - " required = self.REQUIRED_COLUMNS.copy()\n", - " if self.model=='binomial':\n", - " required.extend(['div_schedule'])\n", - " return required\n", - " \n", - " def get_expected_columns(self) -> List[str]:\n", - " \"\"\"\n", - " Returns the list of expected columns for the SSVI model.\n", - " This includes the columns that are expected to be present in the option chain DataFrame.\n", - " \"\"\"\n", - " expected= self.EXPECTED_COLUMNS.copy()\n", - " return expected\n", - " \n", - " def __base_model_assert(self):\n", - " \"\"\"\n", - " Asserts that the model has been initialized correctly.\n", - " This method checks if the chain DataFrame is not empty and if the valuation date is set.\n", - " Raises AssertionError if any condition is not met.\n", - " \"\"\"\n", - " assert self.chain is not None, \"Chain DataFrame is not set.\"\n", - " assert not self.chain.empty, \"Chain DataFrame is empty.\"\n", - " assert self.valuation_date is not None, \"Valuation date is not set.\"\n", - " assert self.model in ['bs', 'binomial'], \"Model must be either 'bs' or 'binomial'.\"\n", - "\n", - " def __validate_chain_columns(self):\n", - " \"\"\"\n", - " Validates that the required columns are present in the chain DataFrame.\n", - " Raises ValueError if any required column is missing.\n", - " \"\"\"\n", - "\n", - " \n", - " self.call_chain, self.put_chain, self.chain = validate_chain_columns(\n", - " self.chain,\n", - " self.valuation_date,\n", - " div_type=self.div_type,\n", - " required_columns=self.required_columns,\n", - " expected_columns=self.expected_columns\n", - " )\n", - " logger.info(\"Chain columns validated. Call chain and put chain are set.\")\n", - " \n", - " def __calculate_vol(self):\n", - " \"\"\"\n", - " Calculates the implied volatility for the option chain.\n", - " WIll only run if the chain doesn't have a 'vol' column.\n", - " \"\"\"\n", - " self.chain= calculate_vol(\n", - " self.chain,\n", - " self.valuation_date,\n", - " model=self.model)\n", - " self.call_chain = self.chain[self.chain['right'].str.lower() == 'c'].copy()\n", - " self.put_chain = self.chain[self.chain['right'].str.lower() == 'p'].copy()\n", - " \n", - " def __model_post_init(self, __context):\n", - " \"\"\"\n", - " Post-initialization method to validate the chain DataFrame.\n", - " Ensures that the required columns are present.\n", - " \"\"\"\n", - " self.__base_model_assert() # Assert that the model is initialized correctly\n", - " self.__validate_chain_columns()\n", - " self.__calculate_vol()\n", - " self._fwd_interp= interp1d(\n", - " x=self.call_chain['t'].values,\n", - " y=self.call_chain['f'].values,)\n", - "\n", - " def predict(self,\n", - " k: float| np.ndarray,\n", - " exp: str| datetime| np.ndarray = None,\n", - " right: Literal['c', 'p', 'itm', 'otm'] | np.ndarray = None,\n", - " strike_type: Literal['p', 'k', 'pf', 'f'] = 'f'):\n", - " \"\"\"\n", - " Predict the implied volatility for a given strike and expiration.\n", - " Args:\n", - " k (float | np.ndarray): Strike price or array of strike prices.\n", - " exp (str | datetime | np.ndarray): Expiration date or array of expiration dates.\n", - " right (Literal['c', 'p', 'itm', 'otm'] | np.ndarray): Option type ('c' for call, 'p' for put, etc.).\n", - " c & p are for call and put options, respectively.\n", - " itm & otm are for in-the-money and out-of-the-money options, respectively.\n", - " itm: Will use Calls in left wing and Puts in right wing.\n", - " otm: Will use Calls in right wing and Puts in left wing.\n", - " strike_type (Literal['p', 'k', 'pf', 'f']): Type of strike price ('p' for price, 'k' for strike, etc.).\n", - " p: Percent of spot\n", - " k: Strike price\n", - " pf: Percent of forward\n", - " f: Forward price\n", - " Returns:\n", - " np.ndarray: Predicted implied volatility for the given parameters.\n", - " \"\"\"\n", - " ## Produce DTEs\n", - " exp = np.asarray(exp) if exp is not None else np.array(['3m'])\n", - " dtes = np.array([max(convert_date_to_time_to_maturity(e, self.valuation_date),\n", - " self.chain.t.min()) \n", - " for e in exp])\n", - " exp_map = {dte: e for e, dte in zip(exp, dtes)}\n", - "\n", - " ## Strike Type Handling\n", - " k = np.asarray(k) if isinstance(k, (list, np.ndarray)) else np.array([k])\n", - " fwds = np.array(self._fwd_interp(dtes))\n", - " k_dte_pack =np.array([\n", - " handle_strikes(k=k, \n", - " f=f, \n", - " strike_type=strike_type, \n", - " spot=self.call_chain['spot'].iloc[0])\n", - " for f in fwds\n", - " ])\n", - "\n", - " ## Re-ordering to equalize size and pair to DTE for vectorization\n", - " k_model, dtes, model_f, k_pretty= np.column_stack((\n", - " k_dte_pack.flatten(),\n", - " dtes.repeat(k_dte_pack.shape[1]),\n", - " fwds.repeat(k_dte_pack.shape[1]),\n", - " np.array([k]).repeat(len(k_dte_pack), axis=0).flatten()\n", - " )).T\n", - "\n", - " # Pick the right chain based on the 'right' parameter. This is handled in the predict_vol function.\n", - " vols = predict_vol(\n", - " k=k_model,\n", - " t=dtes,\n", - " f=model_f,\n", - " right=right,\n", - " call_params=self.call_params,\n", - " put_params=self.put_params\n", - " )\n", - "\n", - " dataframe_vols = pd.DataFrame({\n", - " 'strike': k_pretty,\n", - " 'exp': dtes,\n", - " 'vol': vols,\n", - " 'fwd': model_f\n", - " })\n", - "\n", - " dataframe_vols['exp'] = dataframe_vols['exp'].map(exp_map) # Map DTEs back to original expiration strings\n", - " dataframe_vols= dataframe_vols.set_index(['strike', 'exp']).sort_index()\n", - " return dataframe_vols\n", - "\n", - "\n", - " def fit(self, *args, **kwargs):\n", - " \"\"\"\n", - " Fit the SSVI model to the option chain data.\n", - " This method estimates the ATM variance, long-term variance, speed of mean reversion,\n", - " skewness, kurtosis, and correlation parameters using the option chain data.\n", - " It calculates the ATM maturities and implied volatilities, and then uses these to\n", - " estimate the model parameters.\n", - "\n", - " Note: This method is designed to be called after the model has been initialized. It fits per right chain (call and put).\n", - " \"\"\"\n", - " def inner_fit(right_chain_attr: str):\n", - " \"\"\"\n", - " Inner function to perform the fitting process.\n", - " This is called by the fit method.\n", - " \"\"\"\n", - " \n", - " chain = getattr(self, right_chain_attr)\n", - " right_slug = right_chain_attr.split('_')[0] # 'call' or 'put'\n", - " if chain is None or chain.empty:\n", - " raise ValueError(f\"Chain for {right_chain_attr} is empty or not set.\")\n", - " \n", - " atm_t = np.array(get_atm_T_maturities_on_chain(chain))\n", - " atm_iv = np.array(get_atm_T_vols_on_chain(chain))\n", - " if atm_t.size == 0 or atm_iv.size == 0:\n", - " raise ValueError(f\"No ATM maturities or volatilities found in {right_chain_attr} chain. Adjust PRICING_CONFIG['ATM_WIDTH'].\")\n", - " setattr(self, f'atm_t_{right_slug}', atm_t)\n", - " setattr(self, f'atm_iv_{right_slug}', atm_iv)\n", - " (var0_hat, var_inf_hat, kappa_hat), atm_loss = get_best_params(\n", - " atm_t,\n", - " atm_iv\n", - " )\n", - " eta_hat, lambda_hat, rho_hat, surface_loss = get_surface_params(\n", - " get_K_grid(chain),\n", - " get_T_grid(chain),\n", - " get_fwd_grid(chain),\n", - " var0_hat,\n", - " var_inf_hat,\n", - " kappa_hat,\n", - " get_market_iv_grid(chain),\n", - " iterations=self.iterations,\n", - " chunk_size=self.chunk_size\n", - " )\n", - " params = build_svi_params_obj(\n", - " chain=chain,\n", - " var0_hat=var0_hat,\n", - " var_inf_hat=var_inf_hat,\n", - " kappa_hat=kappa_hat,\n", - " eta_hat=eta_hat,\n", - " lambda_hat=lambda_hat,\n", - " rho_hat=rho_hat,\n", - " atm_loss=atm_loss,\n", - " surface_loss=surface_loss\n", - " )\n", - " return params\n", - " # Fit the model for call and put chains\n", - " self.call_params = inner_fit('call_chain')\n", - " self.put_params = inner_fit('put_chain')\n", - " \n" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "metadata": {}, - "outputs": [], - "source": [ - "from trade.helpers.helper import is_USholiday\n", - "\n", - "\n", - "def is_weekend(dt:str|datetime) -> bool:\n", - " \"\"\"\n", - " Check if the given date is a weekend (Saturday or Sunday).\n", - " \n", - " Args:\n", - " dt (str | datetime): The date to check.\n", - " \n", - " Returns:\n", - " bool: True if the date is a weekend, False otherwise.\n", - " \"\"\"\n", - " if isinstance(dt, str):\n", - " dt = pd.to_datetime(dt)\n", - " return dt.weekday() >= 5 # Saturday is 5, Sunday is 6\n", - "\n", - "\n", - "class EODMarketSSVIModel(SSVIModel):\n", - " \"\"\"\n", - " EODMarketSSVIModel extends SSVIModel to handle end-of-day market data.\n", - " This model is designed to work with end-of-day option chains and provides methods\n", - " to predict implied volatility based on the SSVI model parameters.\n", - " \"\"\"\n", - " REQUIRED_COLUMNS: ClassVar[List[str]] = ['expiration', 'strike', 'right', 'midpoint']\n", - " EXPECTED_COLUMNS: ClassVar[List[str]] = ['t', 'f', 'spot']\n", - "\n", - " def __init__(self, \n", - " tick: str, \n", - " valuation_date: str | datetime,\n", - " model: Literal['bs', 'binomial'] = 'bs'):\n", - " \"\"\"\n", - " Initializes the EODMarketSSVIModel with a ticker and valuation date.\n", - " \n", - " Args:\n", - " tick (str): The ticker symbol for the option chain.\n", - " valuation_date (str | datetime): The date of valuation.\n", - " \"\"\"\n", - " self.tick = tick\n", - " self.valuation_date = valuation_date\n", - " self.model = model\n", - " self.__market_model_assert() # Assert that the market model is initialized correctly\n", - " self.__generate_chain()\n", - " super().__init__(chain=self.mkt_chain, valuation_date=self.valuation_date, model=model)\n", - "\n", - "\n", - " def get_required_columns(self) -> List[str]:\n", - " \"\"\"\n", - " Returns the list of required columns for the SSVI model.\n", - " This includes the columns needed for the option chain DataFrame.\n", - " \"\"\"\n", - " required = self.REQUIRED_COLUMNS.copy()\n", - " return required\n", - " \n", - " def get_expected_columns(self) -> List[str]:\n", - " \"\"\"\n", - " Returns the list of expected columns for the SSVI model.\n", - " This includes the columns that are expected to be present in the option chain DataFrame.\n", - " \"\"\"\n", - " expected= self.EXPECTED_COLUMNS.copy()\n", - " if self.model=='binomial':\n", - " expected.extend(['div_schedule'])\n", - " return expected\n", - " \n", - " def __generate_chain(self):\n", - " \"\"\"\n", - " Generates the option chain for the specified ticker and valuation date.\n", - " This method retrieves the option chain data from the database or API.\n", - " \"\"\"\n", - " # Placeholder for actual implementation to retrieve the option chain\n", - " # For example, using a database query or API call\n", - " self.mkt_chain = format_chain(get_chain(tick=self.tick, date=self.valuation_date))\n", - "\n", - " def __market_model_assert(self):\n", - " \"\"\"\n", - " Asserts that the market model has been initialized correctly.\n", - " This method checks if the market chain DataFrame is not empty and if the valuation date is set.\n", - " Raises AssertionError if any condition is not met.\n", - " \"\"\"\n", - " assert self.valuation_date is not None, \"Valuation date is not set.\"\n", - " assert not is_USholiday(self.valuation_date), \"Valuation date cannot be a US holiday.\"\n", - " assert not is_weekend(self.valuation_date), \"Valuation date cannot be a weekend.\"\n", - " assert self.tick is not None, \"Ticker is not set.\"\n", - " assert self.model in ['bs', 'binomial'], \"Model must be either 'bs' or 'binomial'.\"\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['expiration', 'strike', 'right', 'midpoint', 'f', 'spot', 'div_schedule'] ['t']\n" - ] - }, - { - "data": { - "text/plain": [ - "(0.14997374988928716, 0.18905586239122918)" - ] - }, - "execution_count": 36, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "chain=chains['AAPL' ]\n", - "chain['vol']=chain['crr_vol_discrete']\n", - "ssvi= SSVIModel(\n", - " chain=chain,\n", - " valuation_date=test_valuation_date,\n", - " model='binomial',\n", - " iterations=25000\n", - ")\n", - "ssvi.fit()\n", - "ssvi.put_params\n", - "ssvi.call_params.nmae, ssvi.put_params.nrmse" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['expiration', 'strike', 'right', 'midpoint'] ['t', 'f', 'spot', 'div_schedule']\n" - ] - }, - { - "data": { - "text/plain": [ - "['t', 'f', 'spot', 'div_schedule']" - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ssvi_market=EODMarketSSVIModel('AAPL', '2025-04-08', model='binomial')\n", - "ssvi_market.iterations=10\n", - "ssvi_market.get_expected_columns()" - ] - }, - { - "cell_type": "code", - "execution_count": 84, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
intrinsicmidpointmoneynessbid_sizevol
datetime
2025-07-1629.83999629.4751.1419871110.198854
2025-07-1634.83999634.6501.1657781110.190291
2025-07-1639.83999639.8251.1895701050.254929
2025-07-1639.83999639.7751.1895701000.279557
2025-07-1639.83999639.6251.1895701000.059254
..................
2025-07-16159.839996159.7501.7605631000.491062
2025-07-16159.839996159.8001.760563240.153400
2025-07-16159.839996159.7751.7605631050.313527
2025-07-16159.839996159.8251.7605631000.300819
2025-07-16159.839996159.8001.760563310.358113
\n", - "

132 rows × 5 columns

\n", - "
" - ], - "text/plain": [ - " intrinsic midpoint moneyness bid_size vol\n", - "datetime \n", - "2025-07-16 29.839996 29.475 1.141987 111 0.198854\n", - "2025-07-16 34.839996 34.650 1.165778 111 0.190291\n", - "2025-07-16 39.839996 39.825 1.189570 105 0.254929\n", - "2025-07-16 39.839996 39.775 1.189570 100 0.279557\n", - "2025-07-16 39.839996 39.625 1.189570 100 0.059254\n", - "... ... ... ... ... ...\n", - "2025-07-16 159.839996 159.750 1.760563 100 0.491062\n", - "2025-07-16 159.839996 159.800 1.760563 24 0.153400\n", - "2025-07-16 159.839996 159.775 1.760563 105 0.313527\n", - "2025-07-16 159.839996 159.825 1.760563 100 0.300819\n", - "2025-07-16 159.839996 159.800 1.760563 31 0.358113\n", - "\n", - "[132 rows x 5 columns]" - ] - }, - "execution_count": 84, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "chainv2 = confine_chain_with_pricing_config(chain).copy()\n", - "chainv2['intrinsic'] = chainv2.apply(\n", - " lambda row: intrinsic_value(\n", - " row['strike'], row['spot'], row['right']), axis=1)\n", - "chainv2[chainv2['midpoint']\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
volfwd
strikeexp
0.91y0.297392218.348961
1.01y0.279967218.348961
1.11y0.268118218.348961
\n", - "" - ], - "text/plain": [ - " vol fwd\n", - "strike exp \n", - "0.9 1y 0.297392 218.348961\n", - "1.0 1y 0.279967 218.348961\n", - "1.1 1y 0.268118 218.348961" - ] - }, - "execution_count": 48, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "vols = ssvi.predict(\n", - " k=[0.9,1, 1.1],\n", - " exp=['1y'], # Example expirations\n", - " right='c',\n", - " strike_type='p'\n", - ")\n", - "\n", - "vols" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
volfwd
strikeexp
0.91y0.443198178.89333
1.01y0.411143178.89333
1.11y0.385370178.89333
\n", - "
" - ], - "text/plain": [ - " vol fwd\n", - "strike exp \n", - "0.9 1y 0.443198 178.89333\n", - "1.0 1y 0.411143 178.89333\n", - "1.1 1y 0.385370 178.89333" - ] - }, - "execution_count": 49, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "market_vols = ssvi_market.predict(\n", - " k=[0.9,1, 1.1],\n", - " exp=['1y'], # Example expirations\n", - " right='c',\n", - " strike_type='p'\n", - ")\n", - "market_vols" - ] - }, - { - "cell_type": "code", - "execution_count": 555, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 555, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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kbBXofdhKW8+X/m9nPLcd6TRrIKnWQVPswqN5hU8zSp4ZT2rUPYXUeewiIiISGTSIaHD2L17N//4xz/YvXu311HCnmYVPM0qeJpVaDSv4GlWwQuHWamwHIa1ltWrV+sM8iBoVsHTrIKnWYVG8wqeZhW8cJiVCouIiIiEPRUWERERCXsqLIcRHR1Nnz59Dvrp0PI7zSp4mlXwNKvQaF7B06yCFw6z0lVCIiIiEva0wiIiIiJhT4VFREREwp4Ki4iIiIQ9FRYREREJe1X6AxQWL17Mv//9b1avXs22bdu4/fbb6dChg9exwtLs2bOZPXs2OTk5ADRq1Ig+ffpw4oknepwsPG3dupU333yT7777joKCApKTkxkyZAhNmzb1OlrY0s/j/g43kz179jBx4kS++uorduzYQb169TjvvPM455xzPExd8TIyMvjyyy9Zv349MTExtGjRgiuuuIIGDRoEtpkzZw7/+9//WL16Nbt372b8+PHUqFHDw9QSqipdWAoKCkhLS+Oss87iiSee8DpOWKtTpw79+vUjJSUFay0ff/wxjz32GI899hhHH3201/HCys6dO7nnnnto3bo1w4cPJz4+no0bN+p/joehn8f9HW4mr7/+OllZWQwbNoykpCR++OEHxo4dS506dTj55JM9SOyNxYsXc+6559K0aVOKi4t56623ePjhh3nqqaeoVq0a4J9lu3btaNeuHZMmTfI4sZRGlS4sJ5544iFXCG688UbOOussNm7cyMKFC6lVqxYDBgygRYsWvPjii2RmZlK/fn1uuOGGiP+b85//53f55Zcze/Zsli9fztFHH82ll17KoEGD+Oabb8jKyiIpKYkbbriB+Ph4XnzxRVauXElqaipDhw4lOTnZo1dRMaZPn07dunUZMmRI4LF69eqV2Ebvrf0d6udx6tSpfP755zz55JMlHr/jjjs46aST6Nu3b0VErHCH+3/UsmXL6NSpE61btwbg7LPP5qOPPmLFihWBn9mq8LN59913l/j6xhtvZODAgaxatYpWrVoBcMEFFwDw448/HnAfmzZtYujQodxyyy3MmjWLlStXcswxxzBs2DDy8/MZO3Ys69ev57jjjmPo0KHEx8eX74uqAPfffz/HHHMMMTExzJ07F5/PR7du3bj00ksBeP/995k3bx6bNm2iZs2anHTSSVxxxRWBEjh//nxee+01brnlFl5//XU2b95My5YtGTJkCImJiWWeV+ewHMYHH3zAsccey2OPPUb79u157rnnGD16NB07dmTkyJHUr1+f0aNHV6nPonBdl88++4yCggJatGgRePzdd9/lzDPP5LHHHqNBgwY8++yzvPzyy/Ts2ZN//etfWGt59dVXPUxeMb7++muaNGnCU089xcCBA7nzzjuZM2fOftvpvRW8Ll26sG7dOlasWBF4bPXq1axdu5YuXbp4mMxbLVq04JtvvmHr1q1Ya8nKymLjxo20bdu2xHZV7WczPz8fgJo1a4b83HfeeYfevXszcuRIHMdh1KhRTJw4kauvvpoHH3yQ7Oxs3n777bKO7JmPP/6Y2NhYHnnkEa644greffddfvjhBwCMMVxzzTU8+eST3HjjjWRlZfHmm2+WeH5BQQEzZsxg6NChPPDAA2zevJk33nijXLKqsBzGiSeeSLdu3UhJSaFPnz7s3r2bpk2b8pe//IUGDRpw8cUXs379erZv3+511HK3du1a/va3v9GvXz9eeeUVbr/9dho1ahT4/c6dO5Oenh6YS05ODmeccQbt2rWjUaNGnH/++Qf9200k2bRpEx999BHJycncfffdnHPOOYwfP5758+eX2E7vreDVrVuXdu3alZjhvHnzaNWqFfXr1/cumMcGDBhAw4YNuf766+nXrx+PPPII1157bWBVYZ+q9LPpui6vvfYaxx57LMccc0zIz7/wwgtLzGXVqlVccskltGzZksaNG3PWWWdFzKwAUlNT+etf/0pKSgqdOnWiSZMmZGZmAv5VqeOPP5569epx/PHH07dvXz7//PMSzy8uLmbQoEE0bdqUJk2a0L1798Dzy1qVPiQUjNTU1MCva9euDVDihyAhIQGA7du3B34dqRo0aMDjjz9Ofn4+X3zxBWPGjOGBBx4IlJY/zmrfLP44q9q1a1NYWEh+fj5xcXEVmr0iua5L06ZN6devHwCNGzdm7dq1fPTRR3Tu3Dmwnd5boenatSsvvPACV155JY7j8Nlnn3HVVVd5HctTH374IcuXL+fOO+8kKSmJJUuWMG7cOBITE0usslSln81x48bxyy+/8OCDD5bq+X+ey4Eei6S/RPy51CUmJgZe3w8//MC0adNYv349u3fvpri4mMLCQgoKCoiNjQUgNja2xKHExMRE8vLyyiWrCsthREVFBX5tjNnvsX2qwrK9z+cLvDGbNGnCypUrmTlzJtdddx1w4Ln4fL+/xfbNL9JnlZiYWGLlCfxXVS1cuLDEY3pvheakk07C5/Px5Zdf4vP5KCoq4rTTTvM6lmf27t3LW2+9xR133EH79u0BfzFZs2YNM2bMKFFYqsrP5rhx41i0aBEPPPAAdevWLdU+DjSXP/+sVvY5/dEfX+8+1lo2bdrEyJEj6datG3379qVmzZosXbqUF198kaKiokBhqcj/Z6mwSKm5rkthYaHXMcLOsccey4YNG0o8tmHDBpKSkjxKFBmioqLo1KkT8+fPx+fzcfrppxMTE+N1LM8UFRVRXFwc+EN1H8dxIuoP1GDsOwfnyy+/5P7779/vJHcJ3apVq3BdN7CiCex3OKiiVelzWPbs2cOaNWtYs2YN4D/3YM2aNWzevNnbYGFo0qRJLF68mE2bNrF27drA1x07dvQ6Wti54IILWL58Oe+99x7Z2dn873//Y+7cuZx77rleRwtrwfw8du3alaysLL777rsqcbLtoWYSFxdHq1atePPNN/nxxx/ZtGkT8+fP5+OPP65y968ZN24cn376KTfffDPVq1cnNzeX3Nxc9u7dG9gmNzeXNWvWkJ2dDfjPyVuzZg07d+70KnZYS05Opri4mFmzZvHrr7/yySef8NFHH3maqUqvsKxcuZIHHngg8PWECRMA6NSpEzfeeKNXscLS9u3bGTNmDNu2bSMuLo7U1FTuvvvu/a5GEGjWrBm33347kyZN4t1336VevXpcddVVKneHEczPY0pKCsceeyw7d+6kefPmnuSsSIebyS233MKkSZMYNWoUO3fuJCkpicsvv5xu3bp5FdkTs2fPBvyX6f7RkCFDAueNzZ49m6lTpwZ+77777ttvG/ldWloaV155JdOnT2fSpEkcd9xx9OvXj9GjR3uWydiqtnYoIpWWtZabbrqJc889lx49engdR0QqUJVeYRGRyiMvL4/PPvuM3Nxc/Y1YpApSYRGRSmHgwIHUqlWLwYMHl+qGYCJSuemQkIiIiIS9Kn2VkIiIiFQOKiwiIiIS9lRYREREJOypsIiIiEjYU2ERERGRsKfCIiIiImFPhUVERETCngqLiIiIhD0VFhEREQl7ujW/iFS4rVu3MnnyZL799lt27dpFcnIyPXr04KyzzmLv3r3ceeedADz22GPExMQAsHPnTm677Tbq1avHgw8+iOM4jBkzhi+++IInnniCsWPHsnTpUuLi4ujWrRuXXHIJxhgvX6aIlCGtsIhIhcrNzeXuu+8mMzOTc889l6uvvprk5GRefPFFPvjgA2JiYrjxxhvJzs7mrbfeCjxv7Nix5OfnM2TIEBzn9/91ua7LI488Qu3atenfvz+NGzdmypQpTJkyxYuXJyLlRCssIlKhJk+ejOu6PPHEE9SqVQuAc845h2eeeYZ33nmHbt260bx5cy666CKmT59Ohw4d2L59OwsWLODqq6+mQYMGJfZXWFjICSecwIABAwA499xzGTlyJNOnT+e8884jPj6+wl+jiJQ9rbCISIWx1rJw4UJOOukkrLXk5eUF/mnXrh35+fmsWrUKgEsvvZSjjz6aMWPGMHbsWFq1asV55513wP1279498GtjDN27d6eoqIjMzMwKeV0iUv60wiIiFSYvL49du3YxZ84c5syZc9BtAHw+HzfccAN33XUX0dHRDBky5IDnpBhjqF+/fonHUlJSAMjJySnjVyAiXlFhEZEKY60FoGPHjnTq1OmA26SmpgZ+/f333wP+wz4bN26kXr165R9SRMKSCouIVJj4+HiqV6+O67q0bdv2kNv+/PPPTJ06lc6dO/Pzzz/z4osv8uSTTxIXF1diO2stv/76a4lzWzZu3AhAUlJS2b8IEfGEzmERkQrjOA6nnnoqCxcuZO3atfv9/r7DQUVFRTz//PMkJiZyzTXXMGTIELZv385rr712wP3OmjUr8GtrLbNmzSIqKoo2bdqUy+sQkYqnFRYRqVD9+vXjxx9/5O6776Zr1640atSInTt3smrVKjIzMxk/fjzvvfcea9as4Z577qF69eqkpqbSp08fJk+ezGmnnUb79u0D+4uOjub7779n9OjRNG/enG+//ZZFixbRq1cvXSEkEkG0wiIiFSohIYFHHnmEzp07s3DhQsaNG8fMmTPZtWsX/fv3Z9WqVWRkZHDuuedy/PHHB57Xs2dPmjZtyksvvcSuXbsCjzuOw/Dhw9m+fTtvvvkmK1eupE+fPlx22WVevDwRKSfG7jsLTkSkktl3p9s33njD6ygiUs60wiIiIiJhT4VFREREwp4Ki4iIiIQ9ncMiIiIiYU8rLCIiIhL2VFhEREQk7KmwiIiISNhTYREREZGwp8IiIiIiYU+FRURERMKeCouIiIiEPRUWERERCXv/D02l7dPPtiioAAAAAElFTkSuQmCC", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "from pandas import Categorical\n", - "exp_vols = vols[vols.index.get_level_values('strike')==1.0]\n", - "exp_vols.reset_index(inplace=True)\n", - "\n", - "exp_vols['exp'] = Categorical(exp_vols['exp'], categories=['1m', '3m', '6m', '1y', '18m', '21m'], ordered=True)\n", - "exp_vols.sort_values(by='exp', inplace=True)\n", - "exp_vols.plot(x='exp', y='vol', kind='line', marker='o')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Heat Map Aggregate" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "from copy import deepcopy\n", - "# BASE_PRICING_CONFIG = deepcopy(PRICING_CONFIG)\n", - "chain_editable=deepcopy(chains)\n", - "from itertools import product\n", - "width_range = np.arange(0.5, 1, 0.1)\n", - "dte_range= np.arange(0, 70, 10)\n", - "combos=list(product(width_range, dte_range))" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Processing AAPL with combo (0.5, 0)\n", - "Shape of chain_editable[AAPL]: (1418, 22)\n", - "Done for AAPL with combo (0.5, 0)\n", - "Surface Loss for AAPL: 0.03263895401751859\n", - "Processing MSFT with combo (0.5, 0)\n", - "Shape of chain_editable[MSFT]: (2490, 22)\n", - "Done for MSFT with combo (0.5, 0)\n", - "Surface Loss for MSFT: 0.03174952801335476\n", - "Processing GOOGL with combo (0.5, 0)\n", - "Shape of chain_editable[GOOGL]: (1232, 22)\n", - "Done for GOOGL with combo (0.5, 0)\n", - "Surface Loss for GOOGL: 0.02549826077238575\n", - "Processing AMZN with combo (0.5, 0)\n", - "Shape of chain_editable[AMZN]: (1468, 22)\n", - "Done for AMZN with combo (0.5, 0)\n", - "Surface Loss for AMZN: 0.023943976939988225\n", - "Processing TSLA with combo (0.5, 0)\n", - "Shape of chain_editable[TSLA]: (2098, 22)\n", - "Done for TSLA with combo (0.5, 0)\n", - "Surface Loss for TSLA: 0.017454629714797484\n", - "Done processing combo: (0.5, 0)\n", - "Processing AAPL with combo (0.5, 10)\n", - "Shape of chain_editable[AAPL]: (1204, 22)\n", - "Done for AAPL with combo (0.5, 10)\n", - "Surface Loss for AAPL: 0.006238815762247019\n", - "Processing MSFT with combo (0.5, 10)\n", - "Shape of chain_editable[MSFT]: (2074, 22)\n", - "Done for MSFT with combo (0.5, 10)\n", - "Surface Loss for MSFT: 0.0045793730965549605\n", - "Processing GOOGL with combo (0.5, 10)\n", - "Shape of chain_editable[GOOGL]: (1054, 22)\n", - "Done for GOOGL with combo (0.5, 10)\n", - "Surface Loss for GOOGL: 0.005337167380466202\n", - "Processing AMZN with combo (0.5, 10)\n", - "Shape of chain_editable[AMZN]: (1258, 22)\n", - "Done for AMZN with combo (0.5, 10)\n", - "Surface Loss for AMZN: 0.00571797918405535\n", - "Processing TSLA with combo (0.5, 10)\n", - "Shape of chain_editable[TSLA]: (1666, 22)\n", - "Done for TSLA with combo (0.5, 10)\n", - "Surface Loss for TSLA: 0.005032036757607703\n", - "Done processing combo: (0.5, 10)\n", - "Processing AAPL with combo (0.5, 20)\n", - "Shape of chain_editable[AAPL]: (1102, 22)\n", - "Done for AAPL with combo (0.5, 20)\n", - "Surface Loss for AAPL: 0.0050758456353238515\n", - "Processing MSFT with combo (0.5, 20)\n", - "Shape of chain_editable[MSFT]: (1902, 22)\n", - "Done for MSFT with combo (0.5, 20)\n", - "Surface Loss for MSFT: 0.0037852547852971997\n", - "Processing GOOGL with combo (0.5, 20)\n", - "Shape of chain_editable[GOOGL]: (970, 22)\n", - "Done for GOOGL with combo (0.5, 20)\n", - "Surface Loss for GOOGL: 0.002949841403801299\n", - "Processing AMZN with combo (0.5, 20)\n", - "Shape of chain_editable[AMZN]: (1166, 22)\n", - "Done for AMZN with combo (0.5, 20)\n", - "Surface Loss for AMZN: 0.004006287805826672\n", - "Processing TSLA with combo (0.5, 20)\n", - "Shape of chain_editable[TSLA]: (1520, 22)\n", - "Done for TSLA with combo (0.5, 20)\n", - "Surface Loss for TSLA: 0.00421816043884143\n", - "Done processing combo: (0.5, 20)\n", - "Processing AAPL with combo (0.5, 30)\n", - "Shape of chain_editable[AAPL]: (1020, 22)\n", - "Done for AAPL with combo (0.5, 30)\n", - "Surface Loss for AAPL: 0.004122146492534728\n", - "Processing MSFT with combo (0.5, 30)\n", - "Shape of chain_editable[MSFT]: (1748, 22)\n", - "Done for MSFT with combo (0.5, 30)\n", - "Surface Loss for MSFT: 0.003062836834679705\n", - "Processing GOOGL with combo (0.5, 30)\n", - "Shape of chain_editable[GOOGL]: (906, 22)\n", - "Done for GOOGL with combo (0.5, 30)\n", - "Surface Loss for GOOGL: 0.002125808598415844\n", - "Processing AMZN with combo (0.5, 30)\n", - "Shape of chain_editable[AMZN]: (1094, 22)\n", - "Done for AMZN with combo (0.5, 30)\n", - "Surface Loss for AMZN: 0.002649570716960185\n", - "Processing TSLA with combo (0.5, 30)\n", - "Shape of chain_editable[TSLA]: (1394, 22)\n", - "Done for TSLA with combo (0.5, 30)\n", - "Surface Loss for TSLA: 0.0038889169976699593\n", - "Done processing combo: (0.5, 30)\n", - "Processing AAPL with combo (0.5, 40)\n", - "Shape of chain_editable[AAPL]: (854, 22)\n", - "Done for AAPL with combo (0.5, 40)\n", - "Surface Loss for AAPL: 0.0019649129265609873\n", - "Processing MSFT with combo (0.5, 40)\n", - "Shape of chain_editable[MSFT]: (1430, 22)\n", - "Done for MSFT with combo (0.5, 40)\n", - "Surface Loss for MSFT: 0.002002555256398921\n", - "Processing GOOGL with combo (0.5, 40)\n", - "Shape of chain_editable[GOOGL]: (770, 22)\n", - "Done for GOOGL with combo (0.5, 40)\n", - "Surface Loss for GOOGL: 0.0014378850911335862\n", - "Processing AMZN with combo (0.5, 40)\n", - "Shape of chain_editable[AMZN]: (934, 22)\n", - "Done for AMZN with combo (0.5, 40)\n", - "Surface Loss for AMZN: 0.0013837693489990128\n", - "Processing TSLA with combo (0.5, 40)\n", - "Shape of chain_editable[TSLA]: (1140, 22)\n", - "Done for TSLA with combo (0.5, 40)\n", - "Surface Loss for TSLA: 0.003942690005126152\n", - "Done processing combo: (0.5, 40)\n", - "Processing AAPL with combo (0.5, 50)\n", - "Shape of chain_editable[AAPL]: (772, 22)\n", - "Done for AAPL with combo (0.5, 50)\n", - "Surface Loss for AAPL: 0.0011327115207624744\n", - "Processing MSFT with combo (0.5, 50)\n", - "Shape of chain_editable[MSFT]: (1276, 22)\n", - "Done for MSFT with combo (0.5, 50)\n", - "Surface Loss for MSFT: 0.0015611368784404834\n", - "Processing GOOGL with combo (0.5, 50)\n", - "Shape of chain_editable[GOOGL]: (706, 22)\n", - "Done for GOOGL with combo (0.5, 50)\n", - "Surface Loss for GOOGL: 0.0011176665464391505\n", - "Processing AMZN with combo (0.5, 50)\n", - "Shape of chain_editable[AMZN]: (862, 22)\n", - "Done for AMZN with combo (0.5, 50)\n", - "Surface Loss for AMZN: 0.0008171323395746163\n", - "Processing TSLA with combo (0.5, 50)\n", - "Shape of chain_editable[TSLA]: (1014, 22)\n", - "Done for TSLA with combo (0.5, 50)\n", - "Surface Loss for TSLA: 0.003847233307358311\n", - "Done processing combo: (0.5, 50)\n", - "Processing AAPL with combo (0.5, 60)\n", - "Shape of chain_editable[AAPL]: (772, 22)\n", - "Done for AAPL with combo (0.5, 60)\n", - "Surface Loss for AAPL: 0.0011327115207624744\n", - "Processing MSFT with combo (0.5, 60)\n", - "Shape of chain_editable[MSFT]: (1276, 22)\n", - "Done for MSFT with combo (0.5, 60)\n", - "Surface Loss for MSFT: 0.0015611368784404834\n", - "Processing GOOGL with combo (0.5, 60)\n", - "Shape of chain_editable[GOOGL]: (706, 22)\n", - "Done for GOOGL with combo (0.5, 60)\n", - "Surface Loss for GOOGL: 0.0011176665464391505\n", - "Processing AMZN with combo (0.5, 60)\n", - "Shape of chain_editable[AMZN]: (862, 22)\n", - "Done for AMZN with combo (0.5, 60)\n", - "Surface Loss for AMZN: 0.0008171323395746163\n", - "Processing TSLA with combo (0.5, 60)\n", - "Shape of chain_editable[TSLA]: (1014, 22)\n", - "Done for TSLA with combo (0.5, 60)\n", - "Surface Loss for TSLA: 0.003847233307358311\n", - "Done processing combo: (0.5, 60)\n", - "Processing AAPL with combo (0.6, 0)\n", - "Shape of chain_editable[AAPL]: (1598, 22)\n", - "Done for AAPL with combo (0.6, 0)\n", - "Surface Loss for AAPL: 0.0414603270970487\n", - "Processing MSFT with combo (0.6, 0)\n", - "Shape of chain_editable[MSFT]: (2644, 22)\n", - "Done for MSFT with combo (0.6, 0)\n", - "Surface Loss for MSFT: 0.04686668382498438\n", - "Processing GOOGL with combo (0.6, 0)\n", - "Shape of chain_editable[GOOGL]: (1424, 22)\n", - "Done for GOOGL with combo (0.6, 0)\n", - "Surface Loss for GOOGL: 0.03853530013920991\n", - "Processing AMZN with combo (0.6, 0)\n", - "Shape of chain_editable[AMZN]: (1644, 22)\n", - "Done for AMZN with combo (0.6, 0)\n", - "Surface Loss for AMZN: 0.03578957665480703\n", - "Processing TSLA with combo (0.6, 0)\n", - "Shape of chain_editable[TSLA]: (2480, 22)\n", - "Done for TSLA with combo (0.6, 0)\n", - "Surface Loss for TSLA: 0.022458573316262283\n", - "Done processing combo: (0.6, 0)\n", - "Processing AAPL with combo (0.6, 10)\n", - "Shape of chain_editable[AAPL]: (1366, 22)\n", - "Done for AAPL with combo (0.6, 10)\n", - "Surface Loss for AAPL: 0.007310779828593229\n", - "Processing MSFT with combo (0.6, 10)\n", - "Shape of chain_editable[MSFT]: (2202, 22)\n", - "Done for MSFT with combo (0.6, 10)\n", - "Surface Loss for MSFT: 0.00608160607499546\n", - "Processing GOOGL with combo (0.6, 10)\n", - "Shape of chain_editable[GOOGL]: (1228, 22)\n", - "Done for GOOGL with combo (0.6, 10)\n", - "Surface Loss for GOOGL: 0.008623828296074155\n", - "Processing AMZN with combo (0.6, 10)\n", - "Shape of chain_editable[AMZN]: (1410, 22)\n", - "Done for AMZN with combo (0.6, 10)\n", - "Surface Loss for AMZN: 0.006707345513927043\n", - "Processing TSLA with combo (0.6, 10)\n", - "Shape of chain_editable[TSLA]: (2002, 22)\n", - "Done for TSLA with combo (0.6, 10)\n", - "Surface Loss for TSLA: 0.005514165927213207\n", - "Done processing combo: (0.6, 10)\n", - "Processing AAPL with combo (0.6, 20)\n", - "Shape of chain_editable[AAPL]: (1260, 22)\n", - "Done for AAPL with combo (0.6, 20)\n", - "Surface Loss for AAPL: 0.006388304291876295\n", - "Processing MSFT with combo (0.6, 20)\n", - "Shape of chain_editable[MSFT]: (2026, 22)\n", - "Done for MSFT with combo (0.6, 20)\n", - "Surface Loss for MSFT: 0.005189281061762598\n", - "Processing GOOGL with combo (0.6, 20)\n", - "Shape of chain_editable[GOOGL]: (1138, 22)\n", - "Done for GOOGL with combo (0.6, 20)\n", - "Surface Loss for GOOGL: 0.0055777959696281494\n", - "Processing AMZN with combo (0.6, 20)\n", - "Shape of chain_editable[AMZN]: (1316, 22)\n", - "Done for AMZN with combo (0.6, 20)\n", - "Surface Loss for AMZN: 0.0051601188615474905\n", - "Processing TSLA with combo (0.6, 20)\n", - "Shape of chain_editable[TSLA]: (1836, 22)\n", - "Done for TSLA with combo (0.6, 20)\n", - "Surface Loss for TSLA: 0.004530441647989241\n", - "Done processing combo: (0.6, 20)\n", - "Processing AAPL with combo (0.6, 30)\n", - "Shape of chain_editable[AAPL]: (1174, 22)\n", - "Done for AAPL with combo (0.6, 30)\n", - "Surface Loss for AAPL: 0.005690039888467119\n", - "Processing MSFT with combo (0.6, 30)\n", - "Shape of chain_editable[MSFT]: (1870, 22)\n", - "Done for MSFT with combo (0.6, 30)\n", - "Surface Loss for MSFT: 0.0045558394407880405\n", - "Processing GOOGL with combo (0.6, 30)\n", - "Shape of chain_editable[GOOGL]: (1068, 22)\n", - "Done for GOOGL with combo (0.6, 30)\n", - "Surface Loss for GOOGL: 0.004496456954862222\n", - "Processing AMZN with combo (0.6, 30)\n", - "Shape of chain_editable[AMZN]: (1242, 22)\n", - "Done for AMZN with combo (0.6, 30)\n", - "Surface Loss for AMZN: 0.003753744737024491\n", - "Processing TSLA with combo (0.6, 30)\n", - "Shape of chain_editable[TSLA]: (1690, 22)\n", - "Done for TSLA with combo (0.6, 30)\n", - "Surface Loss for TSLA: 0.0040329860392469595\n", - "Done processing combo: (0.6, 30)\n", - "Processing AAPL with combo (0.6, 40)\n", - "Shape of chain_editable[AAPL]: (990, 22)\n", - "Done for AAPL with combo (0.6, 40)\n", - "Surface Loss for AAPL: 0.0029060487017107403\n", - "Processing MSFT with combo (0.6, 40)\n", - "Shape of chain_editable[MSFT]: (1532, 22)\n", - "Done for MSFT with combo (0.6, 40)\n", - "Surface Loss for MSFT: 0.002562786761218709\n", - "Processing GOOGL with combo (0.6, 40)\n", - "Shape of chain_editable[GOOGL]: (912, 22)\n", - "Done for GOOGL with combo (0.6, 40)\n", - "Surface Loss for GOOGL: 0.0027755248385492198\n", - "Processing AMZN with combo (0.6, 40)\n", - "Shape of chain_editable[AMZN]: (1064, 22)\n", - "Done for AMZN with combo (0.6, 40)\n", - "Surface Loss for AMZN: 0.0020257382044943954\n", - "Processing TSLA with combo (0.6, 40)\n", - "Shape of chain_editable[TSLA]: (1390, 22)\n", - "Done for TSLA with combo (0.6, 40)\n", - "Surface Loss for TSLA: 0.0037421310993665914\n", - "Done processing combo: (0.6, 40)\n", - "Processing AAPL with combo (0.6, 50)\n", - "Shape of chain_editable[AAPL]: (904, 22)\n", - "Done for AAPL with combo (0.6, 50)\n", - "Surface Loss for AAPL: 0.002149355285264978\n", - "Processing MSFT with combo (0.6, 50)\n", - "Shape of chain_editable[MSFT]: (1376, 22)\n", - "Done for MSFT with combo (0.6, 50)\n", - "Surface Loss for MSFT: 0.002213813485623961\n", - "Processing GOOGL with combo (0.6, 50)\n", - "Shape of chain_editable[GOOGL]: (842, 22)\n", - "Done for GOOGL with combo (0.6, 50)\n", - "Surface Loss for GOOGL: 0.0021454253783143007\n", - "Processing AMZN with combo (0.6, 50)\n", - "Shape of chain_editable[AMZN]: (992, 22)\n", - "Done for AMZN with combo (0.6, 50)\n", - "Surface Loss for AMZN: 0.0014321790726094714\n", - "Processing TSLA with combo (0.6, 50)\n", - "Shape of chain_editable[TSLA]: (1244, 22)\n", - "Done for TSLA with combo (0.6, 50)\n", - "Surface Loss for TSLA: 0.0035003401107025598\n", - "Done processing combo: (0.6, 50)\n", - "Processing AAPL with combo (0.6, 60)\n", - "Shape of chain_editable[AAPL]: (904, 22)\n", - "Done for AAPL with combo (0.6, 60)\n", - "Surface Loss for AAPL: 0.002149355285264978\n", - "Processing MSFT with combo (0.6, 60)\n", - "Shape of chain_editable[MSFT]: (1376, 22)\n", - "Done for MSFT with combo (0.6, 60)\n", - "Surface Loss for MSFT: 0.002213813485623961\n", - "Processing GOOGL with combo (0.6, 60)\n", - "Shape of chain_editable[GOOGL]: (842, 22)\n", - "Done for GOOGL with combo (0.6, 60)\n", - "Surface Loss for GOOGL: 0.0021454253783143007\n", - "Processing AMZN with combo (0.6, 60)\n", - "Shape of chain_editable[AMZN]: (992, 22)\n", - "Done for AMZN with combo (0.6, 60)\n", - "Surface Loss for AMZN: 0.0014321790726094714\n", - "Processing TSLA with combo (0.6, 60)\n", - "Shape of chain_editable[TSLA]: (1244, 22)\n", - "Done for TSLA with combo (0.6, 60)\n", - "Surface Loss for TSLA: 0.0035003401107025598\n", - "Done processing combo: (0.6, 60)\n", - "Processing AAPL with combo (0.7, 0)\n", - "Shape of chain_editable[AAPL]: (1696, 22)\n", - "Done for AAPL with combo (0.7, 0)\n", - "Surface Loss for AAPL: 0.04167328496111895\n", - "Processing MSFT with combo (0.7, 0)\n", - "Shape of chain_editable[MSFT]: (2746, 22)\n", - "Done for MSFT with combo (0.7, 0)\n", - "Surface Loss for MSFT: 0.055830034542159665\n", - "Processing GOOGL with combo (0.7, 0)\n", - "Shape of chain_editable[GOOGL]: (1540, 22)\n", - "Done for GOOGL with combo (0.7, 0)\n", - "Surface Loss for GOOGL: 0.04699491625169415\n", - "Processing AMZN with combo (0.7, 0)\n", - "Shape of chain_editable[AMZN]: (1696, 22)\n", - "Done for AMZN with combo (0.7, 0)\n", - "Surface Loss for AMZN: 0.037799226089600645\n", - "Processing TSLA with combo (0.7, 0)\n", - "Shape of chain_editable[TSLA]: (2774, 22)\n", - "Done for TSLA with combo (0.7, 0)\n", - "Surface Loss for TSLA: 0.028911291739280486\n", - "Done processing combo: (0.7, 0)\n", - "Processing AAPL with combo (0.7, 10)\n", - "Shape of chain_editable[AAPL]: (1460, 22)\n", - "Done for AAPL with combo (0.7, 10)\n", - "Surface Loss for AAPL: 0.008127461045901755\n", - "Processing MSFT with combo (0.7, 10)\n", - "Shape of chain_editable[MSFT]: (2294, 22)\n", - "Done for MSFT with combo (0.7, 10)\n", - "Surface Loss for MSFT: 0.007431260224864005\n", - "Processing GOOGL with combo (0.7, 10)\n", - "Shape of chain_editable[GOOGL]: (1334, 22)\n", - "Done for GOOGL with combo (0.7, 10)\n", - "Surface Loss for GOOGL: 0.008817019465478523\n", - "Processing AMZN with combo (0.7, 10)\n", - "Shape of chain_editable[AMZN]: (1458, 22)\n", - "Done for AMZN with combo (0.7, 10)\n", - "Surface Loss for AMZN: 0.0071630125922910945\n", - "Processing TSLA with combo (0.7, 10)\n", - "Shape of chain_editable[TSLA]: (2258, 22)\n", - "Done for TSLA with combo (0.7, 10)\n", - "Surface Loss for TSLA: 0.0062449150067723095\n", - "Done processing combo: (0.7, 10)\n", - "Processing AAPL with combo (0.7, 20)\n", - "Shape of chain_editable[AAPL]: (1354, 22)\n", - "Done for AAPL with combo (0.7, 20)\n", - "Surface Loss for AAPL: 0.007333869482820519\n", - "Processing MSFT with combo (0.7, 20)\n", - "Shape of chain_editable[MSFT]: (2118, 22)\n", - "Done for MSFT with combo (0.7, 20)\n", - "Surface Loss for MSFT: 0.006705905430181514\n", - "Processing GOOGL with combo (0.7, 20)\n", - "Shape of chain_editable[GOOGL]: (1244, 22)\n", - "Done for GOOGL with combo (0.7, 20)\n", - "Surface Loss for GOOGL: 0.0060684162024125105\n", - "Processing AMZN with combo (0.7, 20)\n", - "Shape of chain_editable[AMZN]: (1364, 22)\n", - "Done for AMZN with combo (0.7, 20)\n", - "Surface Loss for AMZN: 0.005718784503689611\n", - "Processing TSLA with combo (0.7, 20)\n", - "Shape of chain_editable[TSLA]: (2080, 22)\n", - "Done for TSLA with combo (0.7, 20)\n", - "Surface Loss for TSLA: 0.005177525691205907\n", - "Done processing combo: (0.7, 20)\n", - "Processing AAPL with combo (0.7, 30)\n", - "Shape of chain_editable[AAPL]: (1268, 22)\n", - "Done for AAPL with combo (0.7, 30)\n", - "Surface Loss for AAPL: 0.006764894793981231\n", - "Processing MSFT with combo (0.7, 30)\n", - "Shape of chain_editable[MSFT]: (1962, 22)\n", - "Done for MSFT with combo (0.7, 30)\n", - "Surface Loss for MSFT: 0.006226320721742398\n", - "Processing GOOGL with combo (0.7, 30)\n", - "Shape of chain_editable[GOOGL]: (1174, 22)\n", - "Done for GOOGL with combo (0.7, 30)\n", - "Surface Loss for GOOGL: 0.0050820984090569395\n", - "Processing AMZN with combo (0.7, 30)\n", - "Shape of chain_editable[AMZN]: (1290, 22)\n", - "Done for AMZN with combo (0.7, 30)\n", - "Surface Loss for AMZN: 0.004335474035565609\n", - "Processing TSLA with combo (0.7, 30)\n", - "Shape of chain_editable[TSLA]: (1922, 22)\n", - "Done for TSLA with combo (0.7, 30)\n", - "Surface Loss for TSLA: 0.004608366582213732\n", - "Done processing combo: (0.7, 30)\n", - "Processing AAPL with combo (0.7, 40)\n", - "Shape of chain_editable[AAPL]: (1080, 22)\n", - "Done for AAPL with combo (0.7, 40)\n", - "Surface Loss for AAPL: 0.004189365674053863\n", - "Processing MSFT with combo (0.7, 40)\n", - "Shape of chain_editable[MSFT]: (1614, 22)\n", - "Done for MSFT with combo (0.7, 40)\n", - "Surface Loss for MSFT: 0.0035450178102513505\n", - "Processing GOOGL with combo (0.7, 40)\n", - "Shape of chain_editable[GOOGL]: (1014, 22)\n", - "Done for GOOGL with combo (0.7, 40)\n", - "Surface Loss for GOOGL: 0.0036081550396177735\n", - "Processing AMZN with combo (0.7, 40)\n", - "Shape of chain_editable[AMZN]: (1110, 22)\n", - "Done for AMZN with combo (0.7, 40)\n", - "Surface Loss for AMZN: 0.002596386009402101\n", - "Processing TSLA with combo (0.7, 40)\n", - "Shape of chain_editable[TSLA]: (1590, 22)\n", - "Done for TSLA with combo (0.7, 40)\n", - "Surface Loss for TSLA: 0.003918336252468754\n", - "Done processing combo: (0.7, 40)\n", - "Processing AAPL with combo (0.7, 50)\n", - "Shape of chain_editable[AAPL]: (994, 22)\n", - "Done for AAPL with combo (0.7, 50)\n", - "Surface Loss for AAPL: 0.0036372260903392625\n", - "Processing MSFT with combo (0.7, 50)\n", - "Shape of chain_editable[MSFT]: (1458, 22)\n", - "Done for MSFT with combo (0.7, 50)\n", - "Surface Loss for MSFT: 0.003383744685764854\n", - "Processing GOOGL with combo (0.7, 50)\n", - "Shape of chain_editable[GOOGL]: (944, 22)\n", - "Done for GOOGL with combo (0.7, 50)\n", - "Surface Loss for GOOGL: 0.003131392347621061\n", - "Processing AMZN with combo (0.7, 50)\n", - "Shape of chain_editable[AMZN]: (1038, 22)\n", - "Done for AMZN with combo (0.7, 50)\n", - "Surface Loss for AMZN: 0.0019375733011807786\n", - "Processing TSLA with combo (0.7, 50)\n", - "Shape of chain_editable[TSLA]: (1432, 22)\n", - "Done for TSLA with combo (0.7, 50)\n", - "Surface Loss for TSLA: 0.0035844059332435225\n", - "Done processing combo: (0.7, 50)\n", - "Processing AAPL with combo (0.7, 60)\n", - "Shape of chain_editable[AAPL]: (994, 22)\n", - "Done for AAPL with combo (0.7, 60)\n", - "Surface Loss for AAPL: 0.0036372260903392625\n", - "Processing MSFT with combo (0.7, 60)\n", - "Shape of chain_editable[MSFT]: (1458, 22)\n", - "Done for MSFT with combo (0.7, 60)\n", - "Surface Loss for MSFT: 0.003383744685764854\n", - "Processing GOOGL with combo (0.7, 60)\n", - "Shape of chain_editable[GOOGL]: (944, 22)\n", - "Done for GOOGL with combo (0.7, 60)\n", - "Surface Loss for GOOGL: 0.003131392347621061\n", - "Processing AMZN with combo (0.7, 60)\n", - "Shape of chain_editable[AMZN]: (1038, 22)\n", - "Done for AMZN with combo (0.7, 60)\n", - "Surface Loss for AMZN: 0.0019375733011807786\n", - "Processing TSLA with combo (0.7, 60)\n", - "Shape of chain_editable[TSLA]: (1432, 22)\n", - "Done for TSLA with combo (0.7, 60)\n", - "Surface Loss for TSLA: 0.0035844059332435225\n", - "Done processing combo: (0.7, 60)\n", - "Processing AAPL with combo (0.7999999999999999, 0)\n", - "Shape of chain_editable[AAPL]: (1784, 22)\n", - "Done for AAPL with combo (0.7999999999999999, 0)\n", - "Surface Loss for AAPL: 0.04329873335546823\n", - "Processing MSFT with combo (0.7999999999999999, 0)\n", - "Shape of chain_editable[MSFT]: (2758, 22)\n", - "Done for MSFT with combo (0.7999999999999999, 0)\n", - "Surface Loss for MSFT: 0.05561382935782852\n", - "Processing GOOGL with combo (0.7999999999999999, 0)\n", - "Shape of chain_editable[GOOGL]: (1592, 22)\n", - "Done for GOOGL with combo (0.7999999999999999, 0)\n", - "Surface Loss for GOOGL: 0.047109491420059345\n", - "Processing AMZN with combo (0.7999999999999999, 0)\n", - "Shape of chain_editable[AMZN]: (1708, 22)\n", - "Done for AMZN with combo (0.7999999999999999, 0)\n", - "Surface Loss for AMZN: 0.03774774465478366\n", - "Processing TSLA with combo (0.7999999999999999, 0)\n", - "Shape of chain_editable[TSLA]: (3012, 22)\n", - "Done for TSLA with combo (0.7999999999999999, 0)\n", - "Surface Loss for TSLA: 0.035376395126855344\n", - "Done processing combo: (0.7999999999999999, 0)\n", - "Processing AAPL with combo (0.7999999999999999, 10)\n", - "Shape of chain_editable[AAPL]: (1544, 22)\n", - "Done for AAPL with combo (0.7999999999999999, 10)\n", - "Surface Loss for AAPL: 0.009365017455974158\n", - "Processing MSFT with combo (0.7999999999999999, 10)\n", - "Shape of chain_editable[MSFT]: (2306, 22)\n", - "Done for MSFT with combo (0.7999999999999999, 10)\n", - "Surface Loss for MSFT: 0.007478635484081148\n", - "Processing GOOGL with combo (0.7999999999999999, 10)\n", - "Shape of chain_editable[GOOGL]: (1384, 22)\n", - "Done for GOOGL with combo (0.7999999999999999, 10)\n", - "Surface Loss for GOOGL: 0.009591981753839957\n", - "Processing AMZN with combo (0.7999999999999999, 10)\n", - "Shape of chain_editable[AMZN]: (1470, 22)\n", - "Done for AMZN with combo (0.7999999999999999, 10)\n", - "Surface Loss for AMZN: 0.0073269209824564484\n", - "Processing TSLA with combo (0.7999999999999999, 10)\n", - "Shape of chain_editable[TSLA]: (2462, 22)\n", - "Done for TSLA with combo (0.7999999999999999, 10)\n", - "Surface Loss for TSLA: 0.008120204416770303\n", - "Done processing combo: (0.7999999999999999, 10)\n", - "Processing AAPL with combo (0.7999999999999999, 20)\n", - "Shape of chain_editable[AAPL]: (1438, 22)\n", - "Done for AAPL with combo (0.7999999999999999, 20)\n", - "Surface Loss for AAPL: 0.008681056640326685\n", - "Processing MSFT with combo (0.7999999999999999, 20)\n", - "Shape of chain_editable[MSFT]: (2130, 22)\n", - "Done for MSFT with combo (0.7999999999999999, 20)\n", - "Surface Loss for MSFT: 0.006763053315731471\n", - "Processing GOOGL with combo (0.7999999999999999, 20)\n", - "Shape of chain_editable[GOOGL]: (1294, 22)\n", - "Done for GOOGL with combo (0.7999999999999999, 20)\n", - "Surface Loss for GOOGL: 0.0069848390016988655\n", - "Processing AMZN with combo (0.7999999999999999, 20)\n", - "Shape of chain_editable[AMZN]: (1376, 22)\n", - "Done for AMZN with combo (0.7999999999999999, 20)\n", - "Surface Loss for AMZN: 0.005903817130919375\n", - "Processing TSLA with combo (0.7999999999999999, 20)\n", - "Shape of chain_editable[TSLA]: (2272, 22)\n", - "Done for TSLA with combo (0.7999999999999999, 20)\n", - "Surface Loss for TSLA: 0.006563503847191585\n", - "Done processing combo: (0.7999999999999999, 20)\n", - "Processing AAPL with combo (0.7999999999999999, 30)\n", - "Shape of chain_editable[AAPL]: (1352, 22)\n", - "Done for AAPL with combo (0.7999999999999999, 30)\n", - "Surface Loss for AAPL: 0.008229630789855651\n", - "Processing MSFT with combo (0.7999999999999999, 30)\n", - "Shape of chain_editable[MSFT]: (1974, 22)\n", - "Done for MSFT with combo (0.7999999999999999, 30)\n", - "Surface Loss for MSFT: 0.006282093024795244\n", - "Processing GOOGL with combo (0.7999999999999999, 30)\n", - "Shape of chain_editable[GOOGL]: (1224, 22)\n", - "Done for GOOGL with combo (0.7999999999999999, 30)\n", - "Surface Loss for GOOGL: 0.006077839652955076\n", - "Processing AMZN with combo (0.7999999999999999, 30)\n", - "Shape of chain_editable[AMZN]: (1302, 22)\n", - "Done for AMZN with combo (0.7999999999999999, 30)\n", - "Surface Loss for AMZN: 0.004532646207661211\n", - "Processing TSLA with combo (0.7999999999999999, 30)\n", - "Shape of chain_editable[TSLA]: (2102, 22)\n", - "Done for TSLA with combo (0.7999999999999999, 30)\n", - "Surface Loss for TSLA: 0.005707148088970792\n", - "Done processing combo: (0.7999999999999999, 30)\n", - "Processing AAPL with combo (0.7999999999999999, 40)\n", - "Shape of chain_editable[AAPL]: (1160, 22)\n", - "Done for AAPL with combo (0.7999999999999999, 40)\n", - "Surface Loss for AAPL: 0.005936000238977425\n", - "Processing MSFT with combo (0.7999999999999999, 40)\n", - "Shape of chain_editable[MSFT]: (1626, 22)\n", - "Done for MSFT with combo (0.7999999999999999, 40)\n", - "Surface Loss for MSFT: 0.0036394812636259865\n", - "Processing GOOGL with combo (0.7999999999999999, 40)\n", - "Shape of chain_editable[GOOGL]: (1062, 22)\n", - "Done for GOOGL with combo (0.7999999999999999, 40)\n", - "Surface Loss for GOOGL: 0.004860212708409966\n", - "Processing AMZN with combo (0.7999999999999999, 40)\n", - "Shape of chain_editable[AMZN]: (1122, 22)\n", - "Done for AMZN with combo (0.7999999999999999, 40)\n", - "Surface Loss for AMZN: 0.002859107922319661\n", - "Processing TSLA with combo (0.7999999999999999, 40)\n", - "Shape of chain_editable[TSLA]: (1752, 22)\n", - "Done for TSLA with combo (0.7999999999999999, 40)\n", - "Surface Loss for TSLA: 0.0050018638184806345\n", - "Done processing combo: (0.7999999999999999, 40)\n", - "Processing AAPL with combo (0.7999999999999999, 50)\n", - "Shape of chain_editable[AAPL]: (1074, 22)\n", - "Done for AAPL with combo (0.7999999999999999, 50)\n", - "Surface Loss for AAPL: 0.005572646568914454\n", - "Processing MSFT with combo (0.7999999999999999, 50)\n", - "Shape of chain_editable[MSFT]: (1470, 22)\n", - "Done for MSFT with combo (0.7999999999999999, 50)\n", - "Surface Loss for MSFT: 0.0035000520580062344\n", - "Processing GOOGL with combo (0.7999999999999999, 50)\n", - "Shape of chain_editable[GOOGL]: (992, 22)\n", - "Done for GOOGL with combo (0.7999999999999999, 50)\n", - "Surface Loss for GOOGL: 0.004361827154201867\n", - "Processing AMZN with combo (0.7999999999999999, 50)\n", - "Shape of chain_editable[AMZN]: (1050, 22)\n", - "Done for AMZN with combo (0.7999999999999999, 50)\n", - "Surface Loss for AMZN: 0.0021785396051152268\n", - "Processing TSLA with combo (0.7999999999999999, 50)\n", - "Shape of chain_editable[TSLA]: (1582, 22)\n", - "Done for TSLA with combo (0.7999999999999999, 50)\n", - "Surface Loss for TSLA: 0.00438902404311767\n", - "Done processing combo: (0.7999999999999999, 50)\n", - "Processing AAPL with combo (0.7999999999999999, 60)\n", - "Shape of chain_editable[AAPL]: (1074, 22)\n", - "Done for AAPL with combo (0.7999999999999999, 60)\n", - "Surface Loss for AAPL: 0.005572646568914454\n", - "Processing MSFT with combo (0.7999999999999999, 60)\n", - "Shape of chain_editable[MSFT]: (1470, 22)\n", - "Done for MSFT with combo (0.7999999999999999, 60)\n", - "Surface Loss for MSFT: 0.0035000520580062344\n", - "Processing GOOGL with combo (0.7999999999999999, 60)\n", - "Shape of chain_editable[GOOGL]: (992, 22)\n", - "Done for GOOGL with combo (0.7999999999999999, 60)\n", - "Surface Loss for GOOGL: 0.004361827154201867\n", - "Processing AMZN with combo (0.7999999999999999, 60)\n", - "Shape of chain_editable[AMZN]: (1050, 22)\n", - "Done for AMZN with combo (0.7999999999999999, 60)\n", - "Surface Loss for AMZN: 0.0021785396051152268\n", - "Processing TSLA with combo (0.7999999999999999, 60)\n", - "Shape of chain_editable[TSLA]: (1582, 22)\n", - "Done for TSLA with combo (0.7999999999999999, 60)\n", - "Surface Loss for TSLA: 0.00438902404311767\n", - "Done processing combo: (0.7999999999999999, 60)\n", - "Processing AAPL with combo (0.8999999999999999, 0)\n", - "Shape of chain_editable[AAPL]: (1860, 22)\n", - "Done for AAPL with combo (0.8999999999999999, 0)\n", - "Surface Loss for AAPL: 0.04683758343599148\n", - "Processing MSFT with combo (0.8999999999999999, 0)\n", - "Shape of chain_editable[MSFT]: (2758, 22)\n", - "Done for MSFT with combo (0.8999999999999999, 0)\n", - "Surface Loss for MSFT: 0.05561382935782852\n", - "Processing GOOGL with combo (0.8999999999999999, 0)\n", - "Shape of chain_editable[GOOGL]: (1642, 22)\n", - "Done for GOOGL with combo (0.8999999999999999, 0)\n", - "Surface Loss for GOOGL: 0.04887772750702336\n", - "Processing AMZN with combo (0.8999999999999999, 0)\n", - "Shape of chain_editable[AMZN]: (1708, 22)\n", - "Done for AMZN with combo (0.8999999999999999, 0)\n", - "Surface Loss for AMZN: 0.03774774465478366\n", - "Processing TSLA with combo (0.8999999999999999, 0)\n", - "Shape of chain_editable[TSLA]: (3248, 22)\n", - "Done for TSLA with combo (0.8999999999999999, 0)\n", - "Surface Loss for TSLA: 0.04144365174112133\n", - "Done processing combo: (0.8999999999999999, 0)\n", - "Processing AAPL with combo (0.8999999999999999, 10)\n", - "Shape of chain_editable[AAPL]: (1616, 22)\n", - "Done for AAPL with combo (0.8999999999999999, 10)\n", - "Surface Loss for AAPL: 0.012367954956099844\n", - "Processing MSFT with combo (0.8999999999999999, 10)\n", - "Shape of chain_editable[MSFT]: (2306, 22)\n", - "Done for MSFT with combo (0.8999999999999999, 10)\n", - "Surface Loss for MSFT: 0.007478635484081148\n", - "Processing GOOGL with combo (0.8999999999999999, 10)\n", - "Shape of chain_editable[GOOGL]: (1430, 22)\n", - "Done for GOOGL with combo (0.8999999999999999, 10)\n", - "Surface Loss for GOOGL: 0.010784929495067805\n", - "Processing AMZN with combo (0.8999999999999999, 10)\n", - "Shape of chain_editable[AMZN]: (1470, 22)\n", - "Done for AMZN with combo (0.8999999999999999, 10)\n", - "Surface Loss for AMZN: 0.0073269209824564484\n", - "Processing TSLA with combo (0.8999999999999999, 10)\n", - "Shape of chain_editable[TSLA]: (2676, 22)\n", - "Done for TSLA with combo (0.8999999999999999, 10)\n", - "Surface Loss for TSLA: 0.012208865886395604\n", - "Done processing combo: (0.8999999999999999, 10)\n", - "Processing AAPL with combo (0.8999999999999999, 20)\n", - "Shape of chain_editable[AAPL]: (1510, 22)\n", - "Done for AAPL with combo (0.8999999999999999, 20)\n", - "Surface Loss for AAPL: 0.011930446494876781\n", - "Processing MSFT with combo (0.8999999999999999, 20)\n", - "Shape of chain_editable[MSFT]: (2130, 22)\n", - "Done for MSFT with combo (0.8999999999999999, 20)\n", - "Surface Loss for MSFT: 0.006763053315731471\n", - "Processing GOOGL with combo (0.8999999999999999, 20)\n", - "Shape of chain_editable[GOOGL]: (1340, 22)\n", - "Done for GOOGL with combo (0.8999999999999999, 20)\n", - "Surface Loss for GOOGL: 0.008276056349025855\n", - "Processing AMZN with combo (0.8999999999999999, 20)\n", - "Shape of chain_editable[AMZN]: (1376, 22)\n", - "Done for AMZN with combo (0.8999999999999999, 20)\n", - "Surface Loss for AMZN: 0.005903817130919375\n", - "Processing TSLA with combo (0.8999999999999999, 20)\n", - "Shape of chain_editable[TSLA]: (2474, 22)\n", - "Done for TSLA with combo (0.8999999999999999, 20)\n", - "Surface Loss for TSLA: 0.01014168819508259\n", - "Done processing combo: (0.8999999999999999, 20)\n", - "Processing AAPL with combo (0.8999999999999999, 30)\n", - "Shape of chain_editable[AAPL]: (1424, 22)\n", - "Done for AAPL with combo (0.8999999999999999, 30)\n", - "Surface Loss for AAPL: 0.011719404029772541\n", - "Processing MSFT with combo (0.8999999999999999, 30)\n", - "Shape of chain_editable[MSFT]: (1974, 22)\n", - "Done for MSFT with combo (0.8999999999999999, 30)\n", - "Surface Loss for MSFT: 0.006282093024795244\n", - "Processing GOOGL with combo (0.8999999999999999, 30)\n", - "Shape of chain_editable[GOOGL]: (1270, 22)\n", - "Done for GOOGL with combo (0.8999999999999999, 30)\n", - "Surface Loss for GOOGL: 0.007442483952322532\n", - "Processing AMZN with combo (0.8999999999999999, 30)\n", - "Shape of chain_editable[AMZN]: (1302, 22)\n", - "Done for AMZN with combo (0.8999999999999999, 30)\n", - "Surface Loss for AMZN: 0.004532646207661211\n", - "Processing TSLA with combo (0.8999999999999999, 30)\n", - "Shape of chain_editable[TSLA]: (2292, 22)\n", - "Done for TSLA with combo (0.8999999999999999, 30)\n", - "Surface Loss for TSLA: 0.009175307007612868\n", - "Done processing combo: (0.8999999999999999, 30)\n", - "Processing AAPL with combo (0.8999999999999999, 40)\n", - "Shape of chain_editable[AAPL]: (1228, 22)\n", - "Done for AAPL with combo (0.8999999999999999, 40)\n", - "Surface Loss for AAPL: 0.010080901920407373\n", - "Processing MSFT with combo (0.8999999999999999, 40)\n", - "Shape of chain_editable[MSFT]: (1626, 22)\n", - "Done for MSFT with combo (0.8999999999999999, 40)\n", - "Surface Loss for MSFT: 0.0036394812636259865\n", - "Processing GOOGL with combo (0.8999999999999999, 40)\n", - "Shape of chain_editable[GOOGL]: (1104, 22)\n", - "Done for GOOGL with combo (0.8999999999999999, 40)\n", - "Surface Loss for GOOGL: 0.0064036691222780166\n", - "Processing AMZN with combo (0.8999999999999999, 40)\n", - "Shape of chain_editable[AMZN]: (1122, 22)\n", - "Done for AMZN with combo (0.8999999999999999, 40)\n", - "Surface Loss for AMZN: 0.002859107922319661\n", - "Processing TSLA with combo (0.8999999999999999, 40)\n", - "Shape of chain_editable[TSLA]: (1924, 22)\n", - "Done for TSLA with combo (0.8999999999999999, 40)\n", - "Surface Loss for TSLA: 0.008321188423074236\n", - "Done processing combo: (0.8999999999999999, 40)\n", - "Processing AAPL with combo (0.8999999999999999, 50)\n", - "Shape of chain_editable[AAPL]: (1142, 22)\n", - "Done for AAPL with combo (0.8999999999999999, 50)\n", - "Surface Loss for AAPL: 0.009897304020647051\n", - "Processing MSFT with combo (0.8999999999999999, 50)\n", - "Shape of chain_editable[MSFT]: (1470, 22)\n", - "Done for MSFT with combo (0.8999999999999999, 50)\n", - "Surface Loss for MSFT: 0.0035000520580062344\n", - "Processing GOOGL with combo (0.8999999999999999, 50)\n", - "Shape of chain_editable[GOOGL]: (1034, 22)\n", - "Done for GOOGL with combo (0.8999999999999999, 50)\n", - "Surface Loss for GOOGL: 0.00572727446502046\n", - "Processing AMZN with combo (0.8999999999999999, 50)\n", - "Shape of chain_editable[AMZN]: (1050, 22)\n", - "Done for AMZN with combo (0.8999999999999999, 50)\n", - "Surface Loss for AMZN: 0.0021785396051152268\n", - "Processing TSLA with combo (0.8999999999999999, 50)\n", - "Shape of chain_editable[TSLA]: (1744, 22)\n", - "Done for TSLA with combo (0.8999999999999999, 50)\n", - "Surface Loss for TSLA: 0.0071140129834379616\n", - "Done processing combo: (0.8999999999999999, 50)\n", - "Processing AAPL with combo (0.8999999999999999, 60)\n", - "Shape of chain_editable[AAPL]: (1142, 22)\n", - "Done for AAPL with combo (0.8999999999999999, 60)\n", - "Surface Loss for AAPL: 0.009897304020647051\n", - "Processing MSFT with combo (0.8999999999999999, 60)\n", - "Shape of chain_editable[MSFT]: (1470, 22)\n", - "Done for MSFT with combo (0.8999999999999999, 60)\n", - "Surface Loss for MSFT: 0.0035000520580062344\n", - "Processing GOOGL with combo (0.8999999999999999, 60)\n", - "Shape of chain_editable[GOOGL]: (1034, 22)\n", - "Done for GOOGL with combo (0.8999999999999999, 60)\n", - "Surface Loss for GOOGL: 0.00572727446502046\n", - "Processing AMZN with combo (0.8999999999999999, 60)\n", - "Shape of chain_editable[AMZN]: (1050, 22)\n", - "Done for AMZN with combo (0.8999999999999999, 60)\n", - "Surface Loss for AMZN: 0.0021785396051152268\n", - "Processing TSLA with combo (0.8999999999999999, 60)\n", - "Shape of chain_editable[TSLA]: (1744, 22)\n", - "Done for TSLA with combo (0.8999999999999999, 60)\n", - "Surface Loss for TSLA: 0.0071140129834379616\n", - "Done processing combo: (0.8999999999999999, 60)\n" - ] - } - ], - "source": [ - "all_combos = []\n", - "for combo_choice in combos:\n", - " meta={}\n", - " _k_grid_editable = {}\n", - " _t_grid_editable = {}\n", - " _market_iv_grid_editable = {}\n", - " _fwd_grid_editable = {}\n", - " _atm_iv_editable = {}\n", - " _atm_T_editable = {}\n", - " # print(f\"Testing combo: {combo_choice}\")\n", - "\n", - " PRICING_CONFIG['VOL_SURFACE_WIDTH'] = combo_choice[0]\n", - " PRICING_CONFIG['VOL_SURFACE_MIN_DTE_THRESHOLD'] = combo_choice[1]\n", - " meta['VOL_SURFACE_WIDTH'] = combo_choice[0]\n", - " meta['VOL_SURFACE_MIN_DTE_THRESHOLD'] = combo_choice[1]\n", - " meta['TICK_PARAMS'] = {}\n", - " for tick in chain_editable:\n", - " # if tick != 'AAPL' or combo_choice[1] != 0:\n", - " # continue\n", - " print(f\"Processing {tick} with combo {combo_choice}\")\n", - " chain_editable[tick] = confine_chain_with_pricing_config(chains[tick])\n", - " print(f\"Shape of chain_editable[{tick}]: {chain_editable[tick].shape}\")\n", - " chain_editable[tick]['vol'] = chain_editable[tick]['crr_vol_discrete']\n", - " (var0_hat, var_inf_hat, kappa_hat), atm_loss = get_best_params(\n", - " get_atm_T_maturities_on_chain(chain_editable[tick]),\n", - " get_atm_T_vols_on_chain(chain_editable[tick])\n", - " )\n", - " params[tick] = {\n", - " 'var0_hat': var0_hat,\n", - " 'var_inf_hat': var_inf_hat,\n", - " 'kappa_hat': kappa_hat,\n", - " 'atm_loss': atm_loss\n", - " }\n", - " _k_grid_editable[tick] = get_K_grid(chain_editable[tick])\n", - " _t_grid_editable[tick] = get_T_grid(chain_editable[tick])\n", - " _market_iv_grid_editable[tick] = get_market_iv_grid(chain_editable[tick])\n", - " _fwd_grid_editable[tick] = get_fwd_grid(chain_editable[tick])\n", - "\n", - " eta_hat, lambda_hat, rho_hat, best_loss = get_surface_params(\n", - " get_K_grid(chain_editable[tick]),\n", - " get_T_grid(chain_editable[tick]),\n", - " get_fwd_grid(chain_editable[tick]),\n", - " params[tick]['var0_hat'],\n", - " params[tick]['var_inf_hat'],\n", - " params[tick]['kappa_hat'],\n", - " get_market_iv_grid(chain_editable[tick])\n", - " )\n", - " params[tick].update({\n", - " 'eta_hat': eta_hat,\n", - " 'lambda_hat': lambda_hat,\n", - " 'rho_hat': rho_hat,\n", - " 'surface_loss': best_loss\n", - " })\n", - " meta['TICK_PARAMS'][tick] = params[tick]\n", - " print(f\"Done for {tick} with combo {combo_choice}\")\n", - " print(f\"Surface Loss for {tick}: {params[tick]['surface_loss']}\")\n", - " print(f\"Done processing combo: {combo_choice}\")\n", - " all_combos.append({\n", - " 'meta': meta,\n", - " 'k_grid': _k_grid_editable,\n", - " 't_grid': _t_grid_editable,\n", - " 'market_iv_grid': _market_iv_grid_editable,\n", - " 'fwd_grid': _fwd_grid_editable\n", - " })\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
VOL_SURFACE_WIDTHVOL_SURFACE_MIN_DTE_THRESHOLDmean_surface_loss
00.500.026257
10.5100.005381
20.5200.004007
30.5300.003170
40.5400.002146
50.5500.001695
60.5600.001695
70.600.037022
80.6100.006848
90.6200.005369
100.6300.004506
110.6400.002802
120.6500.002288
130.6600.002288
140.700.042242
150.7100.007557
160.7200.006201
170.7300.005403
180.7400.003571
190.7500.003135
200.7600.003135
210.800.043829
220.8100.008377
230.8200.006979
240.8300.006166
250.8400.004459
260.8500.004000
270.8600.004000
280.900.046104
290.9100.010033
300.9200.008603
310.9300.007830
320.9400.006261
330.9500.005683
340.9600.005683
\n", - "
" - ], - "text/plain": [ - " VOL_SURFACE_WIDTH VOL_SURFACE_MIN_DTE_THRESHOLD mean_surface_loss\n", - "0 0.5 0 0.026257\n", - "1 0.5 10 0.005381\n", - "2 0.5 20 0.004007\n", - "3 0.5 30 0.003170\n", - "4 0.5 40 0.002146\n", - "5 0.5 50 0.001695\n", - "6 0.5 60 0.001695\n", - "7 0.6 0 0.037022\n", - "8 0.6 10 0.006848\n", - "9 0.6 20 0.005369\n", - "10 0.6 30 0.004506\n", - "11 0.6 40 0.002802\n", - "12 0.6 50 0.002288\n", - "13 0.6 60 0.002288\n", - "14 0.7 0 0.042242\n", - "15 0.7 10 0.007557\n", - "16 0.7 20 0.006201\n", - "17 0.7 30 0.005403\n", - "18 0.7 40 0.003571\n", - "19 0.7 50 0.003135\n", - "20 0.7 60 0.003135\n", - "21 0.8 0 0.043829\n", - "22 0.8 10 0.008377\n", - "23 0.8 20 0.006979\n", - "24 0.8 30 0.006166\n", - "25 0.8 40 0.004459\n", - "26 0.8 50 0.004000\n", - "27 0.8 60 0.004000\n", - "28 0.9 0 0.046104\n", - "29 0.9 10 0.010033\n", - "30 0.9 20 0.008603\n", - "31 0.9 30 0.007830\n", - "32 0.9 40 0.006261\n", - "33 0.9 50 0.005683\n", - "34 0.9 60 0.005683" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "surface_meta_mean = []\n", - "for m in all_combos:\n", - " data={}\n", - " data['VOL_SURFACE_WIDTH'] = m['meta']['VOL_SURFACE_WIDTH']\n", - " data['VOL_SURFACE_MIN_DTE_THRESHOLD'] = m['meta']['VOL_SURFACE_MIN_DTE_THRESHOLD']\n", - " data['mean_surface_loss'] = np.mean(\n", - " [v['surface_loss'] for v in m['meta']['TICK_PARAMS'].values()]\n", - " )\n", - " surface_meta_mean.append(data) \n", - "\n", - "error_df = pd.DataFrame(surface_meta_mean)\n", - "error_df" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
VOL_SURFACE_MIN_DTE_THRESHOLD0102030405060
VOL_SURFACE_WIDTH
0.50.0262570.0053810.0040070.0031700.0021460.0016950.001695
0.60.0370220.0068480.0053690.0045060.0028020.0022880.002288
0.70.0422420.0075570.0062010.0054030.0035710.0031350.003135
0.80.0438290.0083770.0069790.0061660.0044590.0040000.004000
0.90.0461040.0100330.0086030.0078300.0062610.0056830.005683
\n", - "
" - ], - "text/plain": [ - "VOL_SURFACE_MIN_DTE_THRESHOLD 0 10 20 30 \\\n", - "VOL_SURFACE_WIDTH \n", - "0.5 0.026257 0.005381 0.004007 0.003170 \n", - "0.6 0.037022 0.006848 0.005369 0.004506 \n", - "0.7 0.042242 0.007557 0.006201 0.005403 \n", - "0.8 0.043829 0.008377 0.006979 0.006166 \n", - "0.9 0.046104 0.010033 0.008603 0.007830 \n", - "\n", - "VOL_SURFACE_MIN_DTE_THRESHOLD 40 50 60 \n", - "VOL_SURFACE_WIDTH \n", - "0.5 0.002146 0.001695 0.001695 \n", - "0.6 0.002802 0.002288 0.002288 \n", - "0.7 0.003571 0.003135 0.003135 \n", - "0.8 0.004459 0.004000 0.004000 \n", - "0.9 0.006261 0.005683 0.005683 " - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "error_df.pivot_table(\n", - " index=\"VOL_SURFACE_WIDTH\", \n", - " columns=\"VOL_SURFACE_MIN_DTE_THRESHOLD\", \n", - " values=\"mean_surface_loss\", \n", - " aggfunc='sum'\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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D2fmzJmMGzcOGxsbGjduzIABA+64/zZms9n8T154UXLt1QcKuguSS3Vqefz/IClwiVdSCroLkgtpyVm3e5fCJ/lSckF3QXIpIy2joLsgcs9I/2xbQXfhHwszfnLX2g4yvHHX2i5sVBEVERERERHJJdO9X8fLF0pERUREREREcslUSKbmFnXarEhERERERETylSqiIiIiIiIiuaSpuXlDFVERERERERHJV6qIioiIiIiI5JIJVUTzgiqiIiIiIiIikq9UERUREREREcklrRHNG6qIioiIiIiISL5SRVRERERERCSXdB/RvKFEVEREREREJJc0NTdvaGquiIiIiIiI5CtVREVERERERHJJFdG8oYqoiIiIiIiI5CtVREVERERERHJJmxXlDVVERUREREREJF+pIioiIiIiIpJLWiOaN1QRFRERERERkXyliqiIiIiIiEgumVBFNC8oERUREREREcklbVaUNzQ1V0RERERERPKVKqIiIiIiIiK5pM2K8oYqoiIiIiIiIpKvVBEVERERERHJJVVE84YqoiIiIiIiIpKvVBEVERERERHJJVVE84YqoiIiIiIiIpKvVBEVERERERHJJd1HNG+oIioiIiIiIiL5ShVRERERERGRXNIa0byhRFRERERERCSXlIjmDU3NFRERERERkXyliqiIiIiIiEgumdBmRXlBFVERERERERHJV6qIioiIiIiI5JLWiOYNVURFREREREQkX6kiKiIiIiIikkuqiOaNQl8RzcjIKOguiIiIiIiISB4qNBXRgwcP4uXlRYUKFTCZTCxdupRff/0Vo9GIp6cnDz30EN27d8fGxqaguyoiIiIiIsWUKqJ5o9AkorNnz+aFF14AYMWKFaxdu5YePXrg7+9PdHQ0y5YtA+CRRx4pwF6KiIiIiEhxZjLr9i15odAkonFxcZQuXRqArVu3MnDgQJo2bQpAnTp18PX1Zfbs2UUyEbVv3g2Hdo9jU9ILU/QpUpdOwxQVmmO8Xe1WOHbqj42XL+a486Su+paM47st5x0efAr7um2wMZSGjHRM506Suvo7TFEnALCtfD/OwyZl2/b1yUMxnQ0DwMavEiV6voRt+WqYrxpJ37qCtI2L8+6FFzF9qz/EwJrdKO1s4MTlM4zbMZPD8eE5xj9UsSmv1OuNv1tpIpMuMHHvD/x+7oBVzMt1n6BXtQ64O7qw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CxcSFxeHn58fffv2pV6920suNm/enO1yyFsbJsXHx/PFF19w9uxZUlJSKFWqFI0aNeLRRx+94yWRhSYRDQ8PZ/z48ZQoUYJatWpZdnRKTEwkJCSElJQURo8eTeXKle+4bSWiRYcS0aJBiWjRoES0aFAiWnQoERXJO0pEs3eniWhRVmim5n733Xc0bdqUQYMGYfOXRdNms5kZM2Ywa9Ysxo8fX0A9FBERERGR4s5UKMp4RV+h2XouMjKSLl26ZElCIXPHsS5dulgWwoqIiIiIiEjRVWgqogaDgfDwcMqVK5ft+fDw8H+9tbCIiIiIiMi/kVE4VjYWeYUmEX344Yf55ptviIiIyLJG9MiRI2zYsIGnnnqqgHspIiIiIiIi/1ahSUQfeugh3N3dWb16NevXr8d068bVtrYEBgYyZMgQmjVrVsC9FBERERGR4kxrRPNGoUlEAZo1a0azZs1IT0/nypUrAJQsWRJ7+0LVTRERERERKaYylIjmiUKZ4dnb2+Pp6VnQ3RAREREREZG7oFAmoiIiIiIiIoWRpubmjUJz+xYREREREREpHlQRFRERERERySXdviVvqCIqIiIiIiIi+UoVURERERERkVy6eZdJ+ZdUERUREREREZF8pYqoiIiIiIhILuk+onlDiaiIiIiIiEgu6fYteUNTc0VERERERCRfqSIqIiIiIiKSS7p9S95QRVRERERERETylSqiIiIiIiIiuaQ1onlDFVERERERERHJV6qIioiIiIiI5JJu35I3VBEVERERERGRfKWKqIiIiIiISC6ZtGtunlAiKiIiIiIikkuamps3NDVXRERERERE8pUqoiIiIiIiIrmk27fkDVVERUREREREJF+pIioiIiIiIpJLWiOaN1QRFRERERERkXyliqiIiIiIiEgumbRINE+oIioiIiIiIiL5ShVRERERERGRXNIa0byhRFRERERERCSXNDM3b2hqroiIiIiIiOQrVURFRERERERySVNz84YqoiIiIiIiIpKvVBEVERERERHJJZNZJdG8oIqoiIiIiIiI5CtVREVERERERHJJa0TzRrFIRF3e71/QXZBcSpyzqKC7ILlww3ijoLsguZB2Pa2guyC5kJ6SXtBdkFwypZsKugsiIveMYpGIioiIiIiI5IUMrRHNE0pERUREREREcimjEE2OWLduHStXrsRoNBIQEMCAAQOoUqVKjvE7duxg0aJFxMXF4evrS9++falXr57l/K5du/j111+JiIjg6tWrfPzxx1SsWNGqjdTUVObOncv27dtJS0ujdu3aDBw4EIPBcEd912ZFIiIiIiIiRcz27duZO3cuPXv2ZMKECQQEBDB+/HgSExOzjQ8NDeWzzz6jXbt2TJgwgYYNGzJx4kSioqIsMSkpKQQHB9O3b98crztnzhz27dvHa6+9xtixY7l8+TKTJk264/4rERUREREREcmlDLP5rj3uxKpVq2jfvj1t27bF39+fQYMG4ejoyKZNm7KNX7NmDXXq1KFbt274+/vTu3dvAgMDWbdunSWmVatW9OzZk1q1amXbRnJyMhs3bqR///7UrFmTwMBAhgwZQmhoKGFhYXfUfyWiIiIiIiIihUBaWhrJyclWj7S0rJsPpqenExERYZUw2traUqtWrRwTwrCwsCwJZu3atTl58mSu+xcREUFGRoZVO+XKlcPb2/uOE1GtERUREREREcmlDNPd26xo2bJlLFmyxOpYz5496dWrl9WxpKQkTCZTlnWZBoOB6OjobNs2Go14eHhYHfPw8MBoNOa6f0ajEXt7e1xdXf9VO6BEVEREREREpFDo0aMHXbt2tTrm4OBQQL25u5SIioiIiIiI5NLdvH2Lg4NDrhJPd3d3bG1ts1QhjUZjjrvXGgyGLBsZJSYm3tFutwaDgfT0dK5du2ZVFb3TdkBrREVERERERIoUe3t7AgMDCQkJsRwzmUyEhIQQFBSU7XOCgoI4cuSI1bHDhw9TtWrVXF83MDAQOzs7q3aio6OJj4/P8bo5voY7ihYRERERESnGCst9RLt27cq0adMIDAykSpUqrFmzhpSUFNq0aQPA1KlT8fLyok+fPgB07tyZMWPGsHLlSurVq8e2bds4deoUzz//vKXNq1evEh8fT0JCAoBlvanBYMBgMODi4kK7du2YO3cubm5uuLi4MGvWLIKCgpSIioiIiIiI3OuaNWtGUlISixcvxmg0UrFiRUaNGmWZIhsfH4+NjY0lvlq1agwfPpyFCxeyYMEC/Pz8GDFiBBUqVLDE7N27l+nTp1u+njJlCmC9YVL//v2xsbFh0qRJpKenU7t2bQYOHHjH/bcxm+/iJOdCwmz8oaC7ILlUZs6igu6C5MIN442C7oLkQtr1rNu9S+GTei21oLsguWRKLyRlEJF7gPnLnQXdhX/s0VX971rbS7vOuWttFzaqiIqIiIiIiOTS3bx9S3GizYpEREREREQkX6kiKiIiIiIikkt38/YtxYkqoiIiIiIiIpKvVBEVERERERHJpcJy+5aiThVRERERERERyVeqiIqIiIiIiOSS1ojmDVVERUREREREJF+pIioiIiIiIpJLqojmDSWiIiIiIiIiuZRhUiKaFzQ1V0RERERERPKVKqIiIiIiIiK5lKGCaJ5QRVRERERERETylSqiIiIiIiIiuaQ1onlDFVERERERERHJV6qIioiIiIiI5JJu35I3VBEVERERERGRfKWKqIiIiIiISC5pjWjeUCIqIiIiIiKSS7p9S97Q1FwRERERERHJV6qIioiIiIiI5JKm5uYNVURFREREREQkX6kiKiIiIiIikku6fUveUEVURERERERE8pUqoiIiIiIiIrmkimjeUEVURERERERE8lWhrYgmJCTw22+/ERMTg8FgoH379pQrV66guyUiIiIiIsVYhqmge3BvKDQV0X79+pGUlATAuXPneO2119i6dSvp6ekcOHCAt956izNnzhRwL0VEREREpDjLMJvv2qM4KTQV0bS0NMw33/z58+dTvXp13njjDezs7DCZTHz++ecsWLCAt956q4B7eufm/biHmfN2EH/pKsFVy/DO6w9xf42cq7vrNhzjs683c/6CkYDyXrwxtD2tm1cFIC09g8++2sTv28M5d96Im1sJmjWsxGtD21OmdEmrdjZvPcn0WVsIDY+lhKM9DetWYNrEJwC4nJjMiPeWExp+EWPidUp5utKuVRCvvdgON7cSd+/NKOQG3N+ZIfUfxcfFk6Pxpxm1+WsOXDyZY/zDVZrzVtN+lHf3IcIYzQfbZrMhcp9VzJtN+tKvZkfcS7iyJ/o4IzZN57TxguX83me/pYJ7GavnfLBtDl/sXZLlepU8/NjQZwoZZhNVv3ryX77aomtQw24Mb/Y4Zdy8CIk5xYi109gXHZpj/CP3teKdtv2pYPDl1KXzvP/bt6wP320VM7pNf/rX64SHkxs7zx7ltdWfcyrhfJa2HO0c2DjwC+73rUzzrwZz5OIpy7kaPpWY1Pkl6pWrRvw1I1/vXsFn2xfn3QsvYl5o8givtu5NGTcvjlwI57WfP2fvuRM5xj9aqzXvPfAcAZ6+hF86xztrv+aX0F1WMe8+8CzPNuyK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pKSk8PXXX5OcnExwcDCjRo2y3EPU3t6e7du38+OPP5KWloaPjw9dunTJsq41N2zMZnPhSOnvIrPxh4LuguRSmTmLCroLkgs3jDcKuguSC2nX0/5/kBS41GupBd0FySVTuqmguyByzzB/ubOgu/CPGcY/eNfaNo7+5a61XdhojaiIiIiIiIjkK03NFRERERERyaXCska0qFMiKiIiIiIikktKRPOGpuaKiIiIiIhIvlJFVEREREREJJeKwV6v+UIVUREREREREclXqoiKiIiIiIjkktaI5g1VREVERERERCRfqSIqIiIiIiKSS6qI5g1VREVERERERCRfqSIqIiIiIiKSS6qI5g0loiIiIiIiIrmkRDRvaGquiIiIiIiI5CtVREVERERERHJJFdG8oYqoiIiIiIiI5CtVREVERERERHJJFdG8oYqoiIiIiIiI5CtVREVERERERHJJFdG8oYqoiIiIiIiI5CtVREVERERERHLJbFZFNC+oIioiIiIiIiL5ShVRERERERGRXNIa0byhRFRERERERCSXlIjmDU3NFRERERERkXyliqiIiIiIiEguqSKaN1QRFRERERERkXyliqiIiIiIiEguqSKaN1QRFRERERERkXxlY9YdWYuctLQ0li1bRo8ePXBwcCjo7sjf0FgVDRqnokHjVHRorIoGjVPRoHGSe5UqokVQWloaS5YsIS0traC7Iv+Hxqpo0DgVDRqnokNjVTRonIoGjZPcq5SIioiIiIiISL5SIioiIiIiIiL5SomoiIiIiIiI5CslokWQg4MDPXv21IL1IkBjVTRonIoGjVPRobEqGjRORYPGSe5V2jVXRERERERE8pUqoiIiIiIiIpKvlIiKiIiIiIhIvlIiKiIiIiIiIvlKiaiIiIiIiIjkK/uC7oDcuXXr1rFy5UqMRiMBAQEMGDCAKlWqFHS3iq1jx47x888/c/r0aS5fvswbb7xBo0aNLOfNZjOLFy9mw4YNXLt2jeDgYAYOHIifn18B9rr4WbZsGbt37+b8+fM4OjoSFBREv379KFu2rCUmNTWVuXPnsn37dtLS0qhduzYDBw7EYDAUXMeLofXr17N+/Xri4uIA8Pf3p2fPntStWxfQOBVWy5cvZ/78+XTu3JlnnnkG0FgVBosXL2bJkiVWx8qWLcuUKVMAjVFhkpCQwA8//MDBgwdJSUnB19eX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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "\n", - "## Plot Heat Map\n", - "import seaborn as sns\n", - "import matplotlib.pyplot as plt\n", - "plt.figure(figsize=(12, 6))\n", - "# heatmap_data = error_df.pivot(index=\"width\", columns=\"DTE_MIN_THRESHOLD\",values=\"surface_loss\")\n", - "heatmap_data = error_df.pivot_table(\n", - " index=\"VOL_SURFACE_WIDTH\", \n", - " columns=\"VOL_SURFACE_MIN_DTE_THRESHOLD\", \n", - " values=\"mean_surface_loss\", \n", - " aggfunc='mean'\n", - ")\n", - "heatmap_data.index = heatmap_data.index.round(2)\n", - "heatmap_data=heatmap_data.iloc[::-1]\n", - "sns.heatmap(heatmap_data, annot=True, fmt=\".4f\", cmap=\"RdYlGn_r\")\n", - "plt.title(\"Surface Loss Heatmap\")\n", - "plt.xlabel(\"DTE Min Threshold\")\n", - "plt.ylabel(\"Width\")\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
rootexpirationstrikerightbid_sizeclosebidask_sizecloseaskdatemidpoint...bs_volintrinsic_valueeu_lower_boundlower_boundupper_boundeuropean_midpointamerican_midpointearly_exercise_premiumeuropean_equivalent_mideuropean_vols_equiv
0TSLA2025-08-22215.0P100.82950.86202507160.840...0.7102510.0000000.0000000.000000215.00.8401680.8348660.0000000.8400000.710251
1TSLA2025-08-22215.0C21107.8518109.5020250716108.675...0.744995106.670013107.589753107.589753215.0108.675066108.6750430.000000108.6750000.744995
2TSLA2025-08-29215.0P31.0261.05202507161.035...0.6781310.0000000.0000000.000000215.01.0349151.0371590.0022441.0327560.677882
3TSLA2025-08-29215.0C26108.0031110.3520250716109.175...0.720999106.670013107.763315107.763315215.0109.174893109.1734170.000000109.1750000.720999
4TSLA2026-07-17210.0P216.30416.502025071616.400...0.5700250.0000000.0000000.000000210.016.39677116.6330260.23625416.1637460.566651
..................................................................
4737TSLA2025-07-18215.0P600.011450.02202507160.015...1.8329290.0000000.0000000.000000215.00.0150040.0146700.0000000.0150001.832929
4738TSLA2025-08-01215.0C1106.8018108.3520250716107.575...0.985578106.670013107.068223107.068223215.0107.575160107.5741730.000000107.5750000.985578
4739TSLA2025-08-01215.0P1200.33280.35202507160.340...0.9264630.0000000.0000000.000000215.00.3400040.3390810.0000000.3400000.926463
4740TSLA2025-08-15215.0C6108.007108.5520250716108.275...0.790612106.670013107.416051107.416051215.0108.275126108.2673840.000000108.2750000.790612
4741TSLA2025-08-15215.0P20.66670.68202507160.670...0.7566180.0000000.0000000.000000215.00.6699920.6694530.0000000.6700000.756618
\n", - "

3883 rows × 31 columns

\n", - "
" - ], - "text/plain": [ - " root expiration strike right bid_size closebid ask_size closeask \\\n", - "0 TSLA 2025-08-22 215.0 P 10 0.82 95 0.86 \n", - "1 TSLA 2025-08-22 215.0 C 21 107.85 18 109.50 \n", - "2 TSLA 2025-08-29 215.0 P 3 1.02 6 1.05 \n", - "3 TSLA 2025-08-29 215.0 C 26 108.00 31 110.35 \n", - "4 TSLA 2026-07-17 210.0 P 2 16.30 4 16.50 \n", - "... ... ... ... ... ... ... ... ... \n", - "4737 TSLA 2025-07-18 215.0 P 60 0.01 145 0.02 \n", - "4738 TSLA 2025-08-01 215.0 C 1 106.80 18 108.35 \n", - "4739 TSLA 2025-08-01 215.0 P 120 0.33 28 0.35 \n", - "4740 TSLA 2025-08-15 215.0 C 6 108.00 7 108.55 \n", - "4741 TSLA 2025-08-15 215.0 P 2 0.66 67 0.68 \n", - "\n", - " date midpoint ... bs_vol intrinsic_value eu_lower_bound \\\n", - "0 20250716 0.840 ... 0.710251 0.000000 0.000000 \n", - "1 20250716 108.675 ... 0.744995 106.670013 107.589753 \n", - "2 20250716 1.035 ... 0.678131 0.000000 0.000000 \n", - "3 20250716 109.175 ... 0.720999 106.670013 107.763315 \n", - "4 20250716 16.400 ... 0.570025 0.000000 0.000000 \n", - "... ... ... ... ... ... ... \n", - "4737 20250716 0.015 ... 1.832929 0.000000 0.000000 \n", - "4738 20250716 107.575 ... 0.985578 106.670013 107.068223 \n", - "4739 20250716 0.340 ... 0.926463 0.000000 0.000000 \n", - "4740 20250716 108.275 ... 0.790612 106.670013 107.416051 \n", - "4741 20250716 0.670 ... 0.756618 0.000000 0.000000 \n", - "\n", - " lower_bound upper_bound european_midpoint american_midpoint \\\n", - "0 0.000000 215.0 0.840168 0.834866 \n", - "1 107.589753 215.0 108.675066 108.675043 \n", - "2 0.000000 215.0 1.034915 1.037159 \n", - "3 107.763315 215.0 109.174893 109.173417 \n", - "4 0.000000 210.0 16.396771 16.633026 \n", - "... ... ... ... ... \n", - "4737 0.000000 215.0 0.015004 0.014670 \n", - "4738 107.068223 215.0 107.575160 107.574173 \n", - "4739 0.000000 215.0 0.340004 0.339081 \n", - "4740 107.416051 215.0 108.275126 108.267384 \n", - "4741 0.000000 215.0 0.669992 0.669453 \n", - "\n", - " early_exercise_premium european_equivalent_mid european_vols_equiv \n", - "0 0.000000 0.840000 0.710251 \n", - "1 0.000000 108.675000 0.744995 \n", - "2 0.002244 1.032756 0.677882 \n", - "3 0.000000 109.175000 0.720999 \n", - "4 0.236254 16.163746 0.566651 \n", - "... ... ... ... \n", - "4737 0.000000 0.015000 1.832929 \n", - "4738 0.000000 107.575000 0.985578 \n", - "4739 0.000000 0.340000 0.926463 \n", - "4740 0.000000 108.275000 0.790612 \n", - "4741 0.000000 0.670000 0.756618 \n", - "\n", - "[3883 rows x 31 columns]" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "european_converted_chain" - ] - }, - { - "cell_type": "code", - "execution_count": 139, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "import pandas as pd\n", - "\n", - "# -------------------- American → European (de-Americanize) --------------------\n", - "\n", - "def _eep_baw_or_bs2002(option_type: str, S: float, K: float, T: float,\n", - " r: float, q: float, sigma: float,\n", - " discrete_divs: list[tuple[float, float]] | None = None) -> float:\n", - " \"\"\"\n", - " Estimate Early Exercise Premium (EEP) for an American vanilla option.\n", - " Returns EEP >= 0 to subtract from the American price to get European price.\n", - " TODO: Plug in your existing BAW or Bjerksund-Stensland implementation here.\n", - " \"\"\"\n", - " # e.g., price_A = bjerksund_stensland_2002(...)\n", - " # price_E = black_scholes(...)\n", - " # return max(price_A - price_E, 0.0)\n", - " raise NotImplementedError(\"Wire your BAW/BS2002 here\")\n", - "\n", - "def _invert_black_for_iv(option_type: str, S: float, K: float, T: float,\n", - " r: float, q: float, price_euro: float,\n", - " iv_init: float | None = None, tol: float = 1e-7, max_iter: int = 50) -> float:\n", - " \"\"\"\n", - " Solve for Black-Scholes European IV given a target European price.\n", - " Use your existing robust IV solver; this is just an interface shim.\n", - " \"\"\"\n", - " # TODO: call your existing implied vol solver\n", - " raise NotImplementedError(\"Connect to your IV solver here\")\n", - "\n", - "def de_americanize_quotes(df: pd.DataFrame,\n", - " r: float, q: float,\n", - " discrete_divs: list[tuple[float, float]] | None = None,\n", - " eep_iters: int = 2) -> pd.DataFrame:\n", - " \"\"\"\n", - " Convert American mid prices to European-equivalent IVs by iterating:\n", - " 1) start with df['mid_iv'] (or a seed) as sigma\n", - " 2) estimate EEP with BAW/BS2002\n", - " 3) price_E = price_A - EEP\n", - " 4) invert for sigma_E (European IV)\n", - " A couple iterations are usually plenty.\n", - " Expects columns: ['right','S','strike','t','mid_price','mid_iv']\n", - " Returns: new column 'euro_iv'\n", - " \"\"\"\n", - " out = df.copy()\n", - " # seed: use current iv if present\n", - " if 'mid_iv' in out:\n", - " out['euro_iv'] = pd.to_numeric(out['mid_iv'], errors='coerce')\n", - " else:\n", - " out['euro_iv'] = np.nan\n", - "\n", - " for _ in range(eep_iters):\n", - " next_iv = []\n", - " for _, row in out.iterrows():\n", - " right = str(row['right']).upper()[0]\n", - " S = float(row['S']); K = float(row['strike'])\n", - " T = float(row['t']); Pm = float(row['mid_price'])\n", - " iv = float(row['euro_iv']) if np.isfinite(row['euro_iv']) else 0.20 # fallback seed\n", - "\n", - " # EEP estimate (depends on IV)\n", - " eep = _eep_baw_or_bs2002(right, S, K, T, r, q, iv, discrete_divs)\n", - " price_euro = max(Pm - eep, 0.0)\n", - "\n", - " # invert to new IV_E\n", - " iv_e = _invert_black_for_iv(right, S, K, T, r, q, price_euro, iv_init=iv)\n", - " next_iv.append(iv_e)\n", - " out['euro_iv'] = next_iv\n", - " return out\n", - "\n", - "# -------------------- D(T) via box spreads; F(T) via parity -------------------\n", - "\n", - "def _compute_discount_from_box(expiry_df: pd.DataFrame) -> float:\n", - " \"\"\"\n", - " Estimate D(T) using box spreads:\n", - " D ≈ ((C(K1)-C(K2)) - (P(K1)-P(K2))) / (K2 - K1), averaged over pairs.\n", - " Expects: euro call/put prices in columns ['call_euro_price','put_euro_price'] at same expiry.\n", - " \"\"\"\n", - " df = expiry_df.dropna(subset=['strike','call_euro_price','put_euro_price']).sort_values('strike')\n", - " Ks = df['strike'].to_numpy()\n", - " C = df['call_euro_price'].to_numpy()\n", - " P = df['put_euro_price'].to_numpy()\n", - "\n", - " Ds = []\n", - " for i in range(len(Ks) - 1):\n", - " K1, K2 = Ks[i], Ks[i+1]\n", - " C1, C2 = C[i], C[i+1]\n", - " P1, P2 = P[i], P[i+1]\n", - " denom = (K2 - K1)\n", - " if denom > 0:\n", - " Ds.append(((C1 - C2) - (P1 - P2)) / denom)\n", - " Ds = np.array([d for d in Ds if np.isfinite(d) and d > 0])\n", - " if len(Ds) == 0:\n", - " raise ValueError(\"Could not infer discount factor from box spreads at this expiry.\")\n", - " # robust location\n", - " return float(np.median(np.clip(Ds, 1e-6, 1.0)))\n", - "\n", - "def _vega_spread_weights(df: pd.DataFrame) -> np.ndarray:\n", - " \"\"\"\n", - " w = vega / (1 + rel_spread), clipped to avoid extremes.\n", - " Expects 'vega' and optional 'rel_spread'.\n", - " \"\"\"\n", - " vega = pd.to_numeric(df['vega'], errors='coerce').fillna(0.0).to_numpy()\n", - " rs = pd.to_numeric(df.get('rel_spread', np.nan), errors='coerce').to_numpy()\n", - " rs = np.where(np.isfinite(rs) & (rs > 0), rs, 0.0)\n", - " w = vega / (1.0 + rs)\n", - " return np.where(np.isfinite(w), np.clip(w, 0.0, np.nanpercentile(w, 95)), 0.0)\n", - "\n", - "def infer_forward_from_parity(expiry_df: pd.DataFrame, D: float) -> float:\n", - " \"\"\"\n", - " With Europeanized prices and discount D(T), get per-strike F_i = K + (C - P)/D,\n", - " then return a robust, weighted estimator F*.\n", - " Expects: columns ['strike','call_euro_price','put_euro_price','vega','rel_spread'].\n", - " \"\"\"\n", - " K = pd.to_numeric(expiry_df['strike'], errors='coerce').to_numpy()\n", - " C = pd.to_numeric(expiry_df['call_euro_price'], errors='coerce').to_numpy()\n", - " P = pd.to_numeric(expiry_df['put_euro_price'], errors='coerce').to_numpy()\n", - " Fi = K + (C - P) / max(D, 1e-8)\n", - "\n", - " w = _vega_spread_weights(expiry_df)\n", - " mask = np.isfinite(Fi) & (w > 0)\n", - " if mask.sum() < 3:\n", - " return float(np.nanmedian(Fi))\n", - "\n", - " # trimmed, weighted median\n", - " Fi, w = Fi[mask], w[mask] ## Keep finite values\n", - " lo, hi = np.nanpercentile(Fi, [10, 90]) ## Filter out extremes\n", - " keep = (Fi >= lo) & (Fi <= hi) ## Extreme filtered mask\n", - " Fi, w = Fi[keep], w[keep] ## Apply mask\n", - " # weighted median\n", - " order = np.argsort(Fi) ## Produce sorted indices for Implied Forward.\n", - " Fi, w = Fi[order], w[order] ## Reorder by Implied Forward\n", - " csum = np.cumsum(w) / np.sum(w) ## Cumsum to get cumulative weights\n", - " j = np.searchsorted(csum, 0.5) ## Pick the index where cumulative weight crosses 0.5\n", - " return float(Fi[min(j, len(Fi)-1)])\n", - "\n", - "def recompute_log_moneyness(df: pd.DataFrame, F_star: float) -> pd.DataFrame:\n", - " out = df.copy()\n", - " out['log_moneyness'] = np.log(pd.to_numeric(out['strike'], errors='coerce') / float(F_star))\n", - " return out\n" - ] - }, - { - "cell_type": "code", - "execution_count": 62, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[0;31mSignature:\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msearchsorted\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mv\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mside\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'left'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msorter\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mDocstring:\u001b[0m\n", - "Find indices where elements should be inserted to maintain order.\n", - "\n", - "Find the indices into a sorted array `a` such that, if the\n", - "corresponding elements in `v` were inserted before the indices, the\n", - "order of `a` would be preserved.\n", - "\n", - "Assuming that `a` is sorted:\n", - "\n", - "====== ============================\n", - "`side` returned index `i` satisfies\n", - "====== ============================\n", - "left ``a[i-1] < v <= a[i]``\n", - "right ``a[i-1] <= v < a[i]``\n", - "====== ============================\n", - "\n", - "Parameters\n", - "----------\n", - "a : 1-D array_like\n", - " Input array. If `sorter` is None, then it must be sorted in\n", - " ascending order, otherwise `sorter` must be an array of indices\n", - " that sort it.\n", - "v : array_like\n", - " Values to insert into `a`.\n", - "side : {'left', 'right'}, optional\n", - " If 'left', the index of the first suitable location found is given.\n", - " If 'right', return the last such index. If there is no suitable\n", - " index, return either 0 or N (where N is the length of `a`).\n", - "sorter : 1-D array_like, optional\n", - " Optional array of integer indices that sort array a into ascending\n", - " order. They are typically the result of argsort.\n", - "\n", - " .. versionadded:: 1.7.0\n", - "\n", - "Returns\n", - "-------\n", - "indices : int or array of ints\n", - " Array of insertion points with the same shape as `v`,\n", - " or an integer if `v` is a scalar.\n", - "\n", - "See Also\n", - "--------\n", - "sort : Return a sorted copy of an array.\n", - "histogram : Produce histogram from 1-D data.\n", - "\n", - "Notes\n", - "-----\n", - "Binary search is used to find the required insertion points.\n", - "\n", - "As of NumPy 1.4.0 `searchsorted` works with real/complex arrays containing\n", - "`nan` values. The enhanced sort order is documented in `sort`.\n", - "\n", - "This function uses the same algorithm as the builtin python `bisect.bisect_left`\n", - "(``side='left'``) and `bisect.bisect_right` (``side='right'``) functions,\n", - "which is also vectorized in the `v` argument.\n", - "\n", - "Examples\n", - "--------\n", - ">>> np.searchsorted([1,2,3,4,5], 3)\n", - "2\n", - ">>> np.searchsorted([1,2,3,4,5], 3, side='right')\n", - "3\n", - ">>> np.searchsorted([1,2,3,4,5], [-10, 10, 2, 3])\n", - "array([0, 5, 1, 2])\n", - "\u001b[0;31mFile:\u001b[0m ~/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/numpy/core/fromnumeric.py\n", - "\u001b[0;31mType:\u001b[0m function" - ] - } - ], - "source": [ - "# np.nanpercentile(np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]), [10, 90])\n", - "np.argsort(np.array([1, 2, 3, 4, 5, 6, 7, 8, 11, 10])) # [0 1 2 3 4 5 6 7 8 9]\n", - "np.searchsorted?" - ] - }, - { - "cell_type": "code", - "execution_count": 119, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Index(['root', 'expiration', 'strike', 'right', 'bid_size', 'closebid',\n", - " 'ask_size', 'closeask', 'date', 'midpoint', 'weighted_midpoint', 'spot',\n", - " 'valuation_date', 'moneyness', 'log_moneyness', 't', 'dte', 'f',\n", - " 'f_moneyness', 'f_log_moneyness', 'div_schedule', 'bs_vol',\n", - " 'intrinsic_value', 'eu_lower_bound', 'lower_bound', 'upper_bound',\n", - " 'european_midpoint', 'american_midpoint', 'early_exercise_premium',\n", - " 'european_equivalent_mid', 'european_vols_equiv', 'vega'],\n", - " dtype='object')" - ] - }, - "execution_count": 119, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "r = get_rates(european_converted_chain['valuation_date'].iloc[0])\n", - "european_converted_chain.columns" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\n", - "['2025-07-18 00:00:00', '2025-07-25 00:00:00', '2025-08-01 00:00:00',\n", - " '2025-08-08 00:00:00', '2025-08-15 00:00:00', '2025-08-22 00:00:00',\n", - " '2025-08-29 00:00:00', '2025-09-19 00:00:00', '2025-10-17 00:00:00',\n", - " '2025-11-21 00:00:00', '2025-12-19 00:00:00', '2026-01-16 00:00:00',\n", - " '2026-02-20 00:00:00', '2026-03-20 00:00:00', '2026-05-15 00:00:00',\n", - " '2026-06-18 00:00:00', '2026-07-17 00:00:00', '2026-09-18 00:00:00',\n", - " '2026-12-18 00:00:00', '2027-01-15 00:00:00', '2027-06-17 00:00:00',\n", - " '2027-12-17 00:00:00']\n", - "Length: 22, dtype: datetime64[ns]" - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "chain_for_box.expiration.unique()" - ] - }, - { - "cell_type": "code", - "execution_count": 67, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[0;31mSignature:\u001b[0m\n", - "\u001b[0mvectorized_black_scholes_greeks\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mF\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mS\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mfloat\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mK\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mfloat\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mvaluation_dates\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mdatetime\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdatetime\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mend_dates\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mdatetime\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdatetime\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mfloat\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0msigma\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mfloat\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0moption_type\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mUnion\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'c'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mdiv_type\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'discrete'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mdiv_amount\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mdict\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mDocstring:\u001b[0m\n", - "Vectorized Black-Scholes Greeks calculation.\n", - "F: Forward prices (array)\n", - "S: Spot prices (array)\n", - "K: Strike prices (array)\n", - "valuation_dates: List of valuation dates (dates for which the option is priced)\n", - "end_dates: List of end dates (expiration dates of the options)\n", - "r: Risk-free rates (annualized, array)\n", - "sigma: Volatilities (annualized, array)\n", - "option_type: \"c\" for call, \"p\" for put (single string or list of strings)\n", - "div_type: Type of dividend ('discrete' or 'continuous')\n", - "div_amount: Dividend amount (single float or list of floats, ignored for continuous dividends)\n", - "Returns: Greeks (dictionary)\n", - "\u001b[0;31mFile:\u001b[0m ~/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/greeks/numerical/black_scholes.py\n", - "\u001b[0;31mType:\u001b[0m function" - ] - } - ], - "source": [ - "vectorized_black_scholes_greeks?" - ] - }, - { - "cell_type": "code", - "execution_count": 242, - "metadata": {}, - "outputs": [], - "source": [ - "div_pv = vectorized_discrete_pv(\n", - " european_converted_chain['div_schedule'].values,\n", - " r = [get_rates(european_converted_chain['valuation_date'].iloc[0].strftime('%Y-%m-%d'))] * len(european_converted_chain),\n", - " _valuation_dates= european_converted_chain['valuation_date'].values,\n", - " _end_dates= european_converted_chain['expiration'].values\n", - ")\n", - "greeks = vectorized_black_scholes_greeks(\n", - " F=european_converted_chain['f'].values,\n", - " S= european_converted_chain['spot'].values,\n", - " K= european_converted_chain['strike'].values,\n", - " valuation_dates= european_converted_chain['valuation_date'].values,\n", - " end_dates= european_converted_chain['expiration'].values,\n", - " r= [get_rates(european_converted_chain['valuation_date'].iloc[0].strftime('%Y-%m-%d'))] * len(european_converted_chain),\n", - " sigma = european_converted_chain['european_vols_equiv'].values,\n", - " option_type= european_converted_chain['right'].str.lower().values,\n", - " div_type='discrete',\n", - " div_amount= div_pv\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 244, - "metadata": {}, - "outputs": [], - "source": [ - "european_converted_chain['vega'] = greeks['vega']\n", - "# european_converted_chain['rel_c'] = greeks['']" - ] - }, - { - "cell_type": "code", - "execution_count": 259, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 259, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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mejatSs33ngj9957LwEBAaxatYqioiLHPt7e3owfP57Tp0/z2WefcerUKcD+x61p06bEx8e7JHt1zy8Vx7nBYKBbt25cc801vP322/z1r3/ltddec8klhStlr+irVFZWxvbt24mKiuIf//gH99xzD3fffTfLli1z/Du4U245p9cfTzynN7iixsvLC7PZjNlsRinluNbat29fWrduTUpKykVN8J07d+bo0aOOb1muEhQUxKBBg4iJicFkMjFmzBh++OGHStexNU2ja9euPPTQQ3z99de8/PLLzJ49m4ULF9KzZ0+X/hKbzeaLhlJ26NCBhIQETp06xe7du4Hzn3tOTg6FhYVkZ2fTvHlz5s+fT5s2bdwq94kTJzh8+DA33XQTM2bM4PHHH3eMRujevTsTJ050jFpwp9wXft4VvwMJCQmkp6eTn5/v0uPc19eXPn36OPqePPzww2zcuJHk5GTHsaGUIjo6msmTJ7Nnzx6mT5/OP/7xD+bOnUu3bt0IDAx0SfbanF+sVqtjRE6zZs14//33HS1O7pR9//79nD59mrvvvpvp06fz+OOPEx4eDsBNN93EfffdR9OmTd0ut5zT648nntMbVFFTcbAPHjyY3bt3c/z48UrX4/v27Ut2drajubKiSbukpIQbbrgBPz8/l/c1uPCb9Q033EDLli1ZsmSJ4z1UGDx4MNOmTePmm28mJCSEV155hTvvvBNN05z+S1zxuV9//fUcPnyYlJSUSvd37twZg8HguJSj0+lIS0vjX//6F7m5ubzxxhs88cQTmEwmt8ttNBpJTk4mMDCQmJiYSv1UwH7d29mT2dX08644zouKihg8eDCBgYEuP84r2Gw2rr32WhISEli5ciU5OTnA+ab5Hj16MG3aNCZMmEDLli157bXXuPfee10yequm5xedTsdvv/3G3//+d8xmM2+++aZLjvPqZs/JySE1NZXo6GhatmxZ6Tyi0+m47bbbnD5cV87pck6vKY8rao4fP37JSYkqDpy2bdvSvn17R+e8ihNghw4dUEo5mlAr/uF69+7NE088QZMmTer14Llc9gsPcE3THO9l/PjxbNu2jR07djgyVzRPxsfHc+utt/Lggw/Wewe+9PR0fv75Z8cfnQtVZG3WrBm9e/dm+fLllZrXK7Jd+Njg4GAef/xx3nzzTZo3b+62uTVN48yZM5X2h/ofEl2X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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# _compute_discount_from_box(european_converted_chain,\n", - "# )\n", - "\n", - "chain_for_box = european_converted_chain.pivot_table(\n", - " index = ['expiration', 'strike', 'valuation_date',],\n", - " columns = 'right',\n", - " values = ['midpoint', 'closebid', 'closeask', 'vega']\n", - ").reset_index()\n", - "chain_for_box.columns = chain_for_box.columns.map(lambda x: f\"{x[0]}_{x[1]}\" if x[1] != '' else x[0])\n", - "chain_for_box['call_euro_price'] = chain_for_box['midpoint_C']\n", - "chain_for_box['put_euro_price'] = chain_for_box['midpoint_P']\n", - "chain_for_box.drop(columns=['midpoint_C', 'midpoint_P'], inplace=True)\n", - "chain_for_box['rel_spread_c'] = (\n", - " chain_for_box['closeask_C'] - chain_for_box['closebid_C']\n", - ") / chain_for_box['call_euro_price']\n", - "\n", - "chain_for_box['rel_spread_p'] = (\n", - " chain_for_box['closeask_P'] - chain_for_box['closebid_P']\n", - ") / chain_for_box['put_euro_price']\n", - "\n", - "chain_for_box['vega'] = chain_for_box.apply(lambda x: min(x['vega_C'], x['vega_P']), axis=1)\n", - "chain_for_box['rel_spread'] = chain_for_box.apply(\n", - " lambda x: min(x['rel_spread_c'], x['rel_spread_p']), axis=1\n", - ")\n", - "\n", - "\n", - "# chain_for_box.expiration.unique()\n", - "\n", - "D_by_exp = chain_for_box.groupby('expiration').apply(\n", - " lambda df: _compute_discount_from_box(df)\n", - ")\n", - "\n", - "F_by_exp = chain_for_box.groupby('expiration').apply(\n", - " lambda df: infer_forward_from_parity(df, D=D_by_exp[df['expiration'].iloc[0]])\n", - ")\n", - "\n", - "T_by_exp = chain_for_box.groupby('expiration').apply(\n", - " lambda df: time_distance_helper(\n", - " df['expiration'].iloc[0], df['valuation_date'].iloc[0]\n", - " )\n", - ")\n", - "\n", - "implied_discount_premium = r +( np.log(D_by_exp) / T_by_exp)\n", - "\n", - "mkt_f_by_exp = european_converted_chain.groupby('expiration').f.last()\n", - "implied_discount_premium\n", - "F_by_exp.plot()\n", - "mkt_f_by_exp.plot()\n" - ] - }, - { - "cell_type": "code", - "execution_count": 260, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 260, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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XH95g6sZNjQ0lNzcXHPCAzk5OWit+d3vfse9997LX/7yF2JiYli2bBn79+9HKWX8coqMjGTChAl89913bN26FYCNGzeakv9Cuffu3Qu4ukTWrVvHb3/7W2bPns3EiRNp164dubm5df768qfs7te89tiZlJQUTpw4QUlJiWnv9ePHj7N69WrS09MZN24cK1asMFoA3DlTU1MZMGAAb7zxBlVVVYSEhADQqVMnwDV110wNfcbUfq937tyZa665hq+++orDhw9jsVjYunWrKUsDXCi3+2cvJCSEb775ht/+9re8+uqr3HDDDbRt25Zjx475PG9jcstnuvcE4md60BU1NTU1HDp0iMjISOMDMjo6mptvvpnCwkI+//xzAKMZ2Gq10rZtW+x2O2FhYab+9dqmTRv69evHtddey913343T6WTJkiV1junQoQPjx49n+/btfPjhh0bT5JYtW+jYsSPdunUzIzrg+kUTEhJCq1atANe4jrFjxxIaGsoHH3wAuD4w3a9xeno6Q4YMYfbs2TzxxBM8//zzphQIF8rtfv3btGnDwYMH6dixI88++yzXX389U6ZMYdWqVXX+yvWn7O7XvHZTcHh4OFVVVTidTtPe6+Hh4WRlZXHVVVdxxx13EBkZybJlyygrKzOOadWqFT/5yU/Iz8/nnXfe4ciRI4Drl1t8fDw9e/Y0JTs0/jPG/V4PDQ2lf//+9OrVi7/85S/85je/4dlnn/V5t0JDud1jlSorK/nhhx/o2LEjzz33HLfeeisTJkxg4cKFxr+DP+WWz3TvCcTP9KArakJCQqiurqa6uhqttdHXOmTIEFJSUti9e/c5ze/p6ens37/f+AvLLNHR0WRnZ5OYmEh4eDgTJ07kk08+qdOPrZQiKyuLKVOmsGTJEn7729/y4osv8tprrzFo0CBTf4irq6vPmUqZlpZGZmYmR44cYdOmTcCZ172oqIjS0lIKCwu55JJL+Oc//0lqaqpf5T506BC7du3immuu4amnnuL+++83ZiMMGDCAyZMnG7MWzNDY19z9c5CZmcnRo0cpLi427b0eERHBZZddZow7uffee/n666/ZunWr8d7QWtOpUyceeughNm/ezJNPPslzzz3Hyy+/TP/+/YmKijIlOzTtM6ampsaYldO5c2f+8Y9/GK1O/pJ727Zt5OfnM2HCBJ588knuv/9+OnToAMA111zDXXfdRXx8vE8zNya3fKZ7TyB+pgdVUeN+s48cOZJNmzZx8ODBOv3xQ4YMobCw0GiudDdpV1RUMGLECFq3bm36oLLaf1WPGDGC5ORk5s+fb3wPbiNHjuSxxx5j1KhRxMbGMmPGDG6++WaUUj7/IXa/7sOHD2fXrl3s3r27zuPp6emEhoYaXTkWi4Xc3Fz+/Oc/c+LECf74xz/ywAMPEB4e7ne5bTYbW7duJSoqisTExDpjVMDV723GQnaevubu93pZWRkjR44kKirK9Pc6uL6Pfv36kZmZyeLFiykqKgLONM0PHDiQxx57jLvvvpvk5GSeffZZ7rjjDtNmbnn6GWOxWNizZw9/+MMfqK6u5oUXXjD1vX6h3EVFRezdu5dOnTqRnJxc53PEYrFw4403+ny6rnymy2e6pwKuqDl48OB5FyVyv3G6d+9O7969jYF57g/AtLQ0tNZGE6r7H27w4ME88MADtG3b1qtvngtlr/0GV0oZ38tPfvITvv/+e3788Ucjs7t5smfPnlx33XVMmjTJ6wP4jh49yueff2780qnNnbVz584MHjyY9957r07Tujtb7efGxMRw//3388ILL3DJJZf4bW6lFMePH69zPPhmOnRzvubu93qPHj342c9+RnR0tNfe6xfKffYHufv7mDp1Krt372b9+vVGVvfr3rFjR6688kpuu+02kpKSvJK5try8PP74xz8as69q/7t7+hkDEBcXx3/913/x3HPPGbNF/DE3YMxE82Uh0Jyvt68/0y+U3d8/00tKSigrK6t3Kw9//kxvSMAUNQ6Hgzlz5vDf//3f5OTk1HnM/Y8REhKC0+mkvLyc2267ja1bt7JixQrjH6i0tJSwsDDatGkDnPnB8HYV3NjsNTU12O32Opl69+7NsGHDWLhwIZs3b+bZZ59l2bJlPhsRX1NTwz//+U8ee+wxdu/ebeQ7O7vD4SAvL4+f/vSnHDlyhI8++sjoS62pqcFqtRqvO7jGVXjzh9YbuX3115I3svuiCGts7pqaGuOXp/tntn379owZM4aPPvqItWvXMmPGDN555x2fznJyOBy8/PLLPPLII3z77bd1Wo2a+hmjtaZt27ZenSHnjdy+eK97I7cvP9Mbk90fP9MdDgf/+Mc/+O1vf8uzzz7L3/72tzqDrN3Z/e0zvbECoqhZvnw5kydP5siRI8ycOZNbb721zuPuN/KyZcv4yU9+woYNG0hLS+PWW29lwYIF/OMf/2Dbtm289957VFRUkJ6e7pfZf/rTn7Jhw4Zz/koaPXo0+/bt4+mnnwZg7NixPmsG/ve//83Bgwd56qmn+NnPfmas5Kq1rpN98uTJrFu3jvbt2zNp0iS+/vprZs2axXfffcdbb71FXl4e/fv390nmQM4dyNkbm3vSpEn8+OOPxgeo+8P++uuvp6CggJdeeomQkBAmT55szATxtsWLFzN58mTj+ikpKRQWFgJ1V1729DPG279cvZXb2wI1t6fZ/e0zPS8vj//93//l6NGj3HvvvWRlZbFz505j0K87gz9+vjSW369Rn5uby5tvvsnAgQP55S9/Cbj+YSIiIoiIiMBqtVJZWcnf/vY3tm3bxv3338+VV14JwM0330x4eDjffPMNr776Kkoppk2bRufOnf02+xVXXFFn3MaaNWuYM2cOqamp3HfffcbKk96mtaakpISNGzdy6623kpqayp49ezh27BiXXHIJcXFxtGrVijlz5vD9998zdepULr/8cgCuvvpqYmJiWLFiBYsXL6ampobHHnvMJwPGAjV3IGdvSu7a73OlFF9++SWzZ88mJSWF+++/36d/8S1YsICvvvqKhx56iMsuuwyALl261FkDpby8nFdeeYUtW7b4zWeM5Pb9Z3pTsvvLZzrAjz/+SFhYGL/+9a8JCwujV69ebNu2jdatWwOuVpx//etffPvtt37z+eIppc0eRdWA6upqFi9ezKeffsr//d//sWDBAvbv34/WmoSEBG644Qb69u3L7t276dSpExEREUDditnpdFJYWEhcXFxAZHerrKzks88+w2azcfXVV/sst3uvlL179/LMM8/w0ksv8fbbb/Pdd98RFRWF3W4nLS2NRx55hNzcXKKjo+t93QHsdjvR0dGSO0izX0xuN6fTybfffsvJkyd9+j53KyoqIiYmpk6rymuvvca+ffv4n//5HyIiIqiurubAgQN+9RkjuX3/md7U7G5mfaa7X7v58+ezZs0aXnrpJcC1uN4LL7zA6NGjSU1NpXPnzn71+dIUflfUfPPNN0RERHDJJZcQExMDuObKP/300+Tl5ZGdnc2QIUMoLS1l1apVlJaWMnXqVFJTU03foC/Ysh85coSXXnqJbt26UVRUxN13302rVq04cOAAf/zjH/nJT37C9ddfb2r2QM0dyNkDNffZ+RMTE4mNjTXu11obXWXr16/nz3/+M6+99prPusAaIrl9Lxiy1/45Xb9+Pa+++ipdunShbdu2fP3116SmplJVVcWJEye4/fbbueqqq/x2E9DG8Jvupy+++II333yTDh06kJ+fT8eOHRk7diyDBw8mJiaGu+++mwMHDnDdddcZFWRCQgLvvPMOq1evJjU11bQPy2DNHhoaSlRUFGvXruWKK64w1tVo164d48ePZ/HixVx//fWmZA/U3IGcPVBzXyj/DTfcwKWXXmoUW+4P8jZt2hAdHc3WrVvJzMw0LbPkNkewZR8zZgyXXXYZ/fv3Jy4ujoMHD/Lee+/xyCOPcNlll1FWVsaKFSt46623GD58uDE1PhCZXtTU1NTwySefsHLlSu644w6uvPJK9uzZw8qVK/n888/JysrCZrPRp08f+vbtS1hYmPFcdwuHe+Myyd682ePi4khPT2fDhg1GTvcPdGJiIq1atSIvL89YjE5yB2f2QM3dmPyfffYZWVlZ56w1FBsbS3l5ufGLy4y/XCW371sKgjX7qlWr6N+/PzabjeTkZGMczWWXXWbsbN6zZ0/ef/99du/ebeqK3RfL9NlPlZWVlJSUMHz4cLKzs7FarfTs2ZPExETKy8uN6XHh4eF1igKAkydPUlFRYcoqlxDc2d0zU0aMGMGgQYP44Ycf2Ldvn/GX9oEDB+jSpYvPf0kFau5Azh6ouRubv761cxISEoiNjT1nCQZfkty+F8zZa2+NUlVVRWRkZJ1ibMeOHaSkpPjFtOyLYUpLzdGjR0lISEApVWfJdPfeHRaLhfbt21NZWVnvNLeqqirKysqYN28egDEKXbI3X3Z333Dr1q258cYbWbhwIU8++SRXXHEFFRUVbNy4kUmTJgHe/8skUHMHcvZAzd2U/Gf/nCqlqKqqomPHjpw4cQKHw+GzJRQkt29zt7Ts7p+9mJgYiouLefHFF7n66qv58ccf+f7775k4caKxz1Og8mlRs3btWt5++21CQ0OJiIjg6quv5qqrrjIqw9qDCH/44QeSk5OxWq117l+7di1btmzhm2++oUuXLjz66KM+ae1oidndP6A9evTg17/+NYsWLaKoqIiamhp+97vfGeMmvPVLKlBzB3L2QM19sflramrqjCOw2Ww4nU7atGnjk3FAktu3uVtqdvfP6ZVXXonFYmHlypUsW7aM8PDwOj+ngcxnRc2mTZt4++23ufHGG4mPj2fTpk3885//xOl0cuWVV2Kz2YylpKurqzl06BA33HADUHc11MTERI4ePcovfvELMjIyJLsXs9f+iyMkJIQJEyb47C/tQM0dyNkDNXdz5K/9S8r9wf/II4/45K9Wye3b3C05e+2f08svv5whQ4Zw8uRJv56i7SmvFzXuD7adO3fStm1bRo4cidVqJTMzk6qqKj777DMiIyO59NJLjQ/A0tJSysvL6d69O+BqYvvkk0+YNGkSXbp0MXb3lezez75ixQruuece47ze/iUVqLkDOXug5vZWfvcHv7d/SUlu3+aW7Of+nIaEhARVQQM+GCjsfnEPHz5MfHy80QQGcPvttxMaGsq3335bZ5+YzZs30759e2JiYnjttdd49NFHKSwsxOFw+HSjNcn+KAUFBT7NHqi5Azl7oOYO9PySW35GW0p2X2r2lppNmzbx3XffER8fT8+ePY1llPv27cubb76J0+k0/jHatGnDlVdeyZIlSzhy5AjR0dForfn+++85ePAgDz30ENHR0Tz99NN069atuaNKdj/IHqi5Azl7oOYO9PySW35GW0p2MzVbS82JEyf4wx/+wEsvvWSsmPv000+ze/duwLVFfHh4OAsWLKjzvKuvvpqKigr2798PuGYHVVVVERYWxr333ssLL7zg9X8Eye777IGaO5CzB2ruQM8vueVntKVk9wfN0lJTWVnJO++8Q1hYGDNmzDD245g+fTorVqwgNTWVmJgYRo0axfvvv8/IkSNp37690UfYqVMnDh06BLj6Jm+77TZjh19vk+y+zx6ouQM5e6DmDvT8klt+RltKdn/RLC01rVq1IjQ0lOzsbOLi4owFirKysjhy5Ahaa8LDw7n88svp2rUrs2bNoqCgAKUUhYWFFBcXc+mllxrn8+U/gmT3ffZAzR3I2QM1d6Dnl9y+zS3Zzf059QfNtqFl7UWH3HPk//KXv9CqVSvuv/9+47iioiKefPJJampq6NatGzt27KBz58784he/MG0UtmT3ffZAzR3I2QM1t1ug5pfcvifZzcnuD7y6S/dvfvMbRo4cSXZ2trFlgMViIS8vj71797Jr1y6SkpLIzs72VoQmk+y+F6i5IXCzB2put0DNL7l9T7K3DF5bp+bYsWPk5eUZ67JYLBYcDgcWi4WEhAQSEhIYOnSo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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "D_by_exp.plot()" - ] - }, - { - "cell_type": "code", - "execution_count": 246, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[0;31mSignature:\u001b[0m\n", - "\u001b[0mget_bs_vol_on_chain\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mchain\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mpandas\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcore\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mframe\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDataFrame\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mvaluation_date\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mpandas\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcore\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mseries\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mSeries\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mDocstring:\u001b[0m\n", - "Estimates the Black-Scholes implied volatility for a given option chain.\n", - "\n", - "Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " Expected Columns: `f`, `strike`, `t`, `midpoint`, `right`. \n", - " valuation_date (str): The date of valuation.\n", - " \n", - "Returns:\n", - " pd.Series: The estimated Black-Scholes implied volatility for the option chain.\n", - "\u001b[0;31mFile:\u001b[0m /var/folders/j0/80hkbygd4lb27h9mw76gqzpw0000gn/T/ipykernel_37786/2020857283.py\n", - "\u001b[0;31mType:\u001b[0m function" - ] - } - ], - "source": [ - "get_bs_vol_on_chain?" - ] - }, - { - "cell_type": "code", - "execution_count": 247, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
expirationstrikevaluation_dateftvariablemidpointrightequalized_iv
02025-07-18110.02025-07-16 16:00:00210.2605550.005476call_euro_price100.375000C3.747594
12025-07-18115.02025-07-16 16:00:00210.2605550.005476call_euro_price95.475000C3.776839
22025-07-18120.02025-07-16 16:00:00210.2605550.005476call_euro_price90.475000C3.533382
32025-07-18130.02025-07-16 16:00:00210.2605550.005476call_euro_price80.475000C3.074212
42025-07-18135.02025-07-16 16:00:00210.2605550.005476call_euro_price75.400000C2.702652
..............................
20192027-12-17420.02025-07-16 16:00:00226.3418742.420260put_euro_price194.528686P0.452546
20202027-12-17425.02025-07-16 16:00:00226.3418742.420260put_euro_price199.261261P0.458920
20212027-12-17430.02025-07-16 16:00:00226.3418742.420260put_euro_price203.994795P0.465294
20222027-12-17435.02025-07-16 16:00:00226.3418742.420260put_euro_price208.727394P0.471543
20232027-12-17440.02025-07-16 16:00:00226.3418742.420260put_euro_price213.459021P0.477792
\n", - "

2024 rows × 9 columns

\n", - "
" - ], - "text/plain": [ - " expiration strike valuation_date f t \\\n", - "0 2025-07-18 110.0 2025-07-16 16:00:00 210.260555 0.005476 \n", - "1 2025-07-18 115.0 2025-07-16 16:00:00 210.260555 0.005476 \n", - "2 2025-07-18 120.0 2025-07-16 16:00:00 210.260555 0.005476 \n", - "3 2025-07-18 130.0 2025-07-16 16:00:00 210.260555 0.005476 \n", - "4 2025-07-18 135.0 2025-07-16 16:00:00 210.260555 0.005476 \n", - "... ... ... ... ... ... \n", - "2019 2027-12-17 420.0 2025-07-16 16:00:00 226.341874 2.420260 \n", - "2020 2027-12-17 425.0 2025-07-16 16:00:00 226.341874 2.420260 \n", - "2021 2027-12-17 430.0 2025-07-16 16:00:00 226.341874 2.420260 \n", - "2022 2027-12-17 435.0 2025-07-16 16:00:00 226.341874 2.420260 \n", - "2023 2027-12-17 440.0 2025-07-16 16:00:00 226.341874 2.420260 \n", - "\n", - " variable midpoint right equalized_iv \n", - "0 call_euro_price 100.375000 C 3.747594 \n", - "1 call_euro_price 95.475000 C 3.776839 \n", - "2 call_euro_price 90.475000 C 3.533382 \n", - "3 call_euro_price 80.475000 C 3.074212 \n", - "4 call_euro_price 75.400000 C 2.702652 \n", - "... ... ... ... ... \n", - "2019 put_euro_price 194.528686 P 0.452546 \n", - "2020 put_euro_price 199.261261 P 0.458920 \n", - "2021 put_euro_price 203.994795 P 0.465294 \n", - "2022 put_euro_price 208.727394 P 0.471543 \n", - "2023 put_euro_price 213.459021 P 0.477792 \n", - "\n", - "[2024 rows x 9 columns]" - ] - }, - "execution_count": 247, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "tester=chain_for_box.set_index(['expiration'])\n", - "tester['f'] = F_by_exp\n", - "tester['t'] = T_by_exp\n", - "tester = tester.reset_index().melt(\n", - " id_vars = ['expiration', 'strike', 'valuation_date', 'f', 't'],\n", - " value_vars = ['call_euro_price', 'put_euro_price'],\n", - " value_name = 'midpoint'\n", - ").dropna().reset_index(drop=True) \n", - "tester['right'] = tester['variable'].str.split('_').str[0].str[0].str.upper()\n", - "tester['equalized_iv']=get_bs_vol_on_chain(\n", - " tester,\n", - " valuation_date=tester['valuation_date'].iloc[0],\n", - ")\n", - "tester" - ] - }, - { - "cell_type": "code", - "execution_count": 248, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\n", - "['2025-07-18 00:00:00', '2025-07-25 00:00:00', '2025-08-01 00:00:00',\n", - " '2025-08-08 00:00:00', '2025-08-15 00:00:00', '2025-08-22 00:00:00',\n", - " '2025-08-29 00:00:00', '2025-09-19 00:00:00', '2025-10-17 00:00:00',\n", - " '2025-11-21 00:00:00', '2025-12-19 00:00:00', '2026-01-16 00:00:00',\n", - " '2026-02-20 00:00:00', '2026-03-20 00:00:00', '2026-05-15 00:00:00',\n", - " '2026-06-18 00:00:00', '2026-09-18 00:00:00', '2026-12-18 00:00:00',\n", - " '2027-01-15 00:00:00', '2027-06-17 00:00:00', '2027-12-17 00:00:00']\n", - "Length: 21, dtype: datetime64[ns]" - ] - }, - "execution_count": 248, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "tester.expiration.unique()" - ] - }, - { - "cell_type": "code", - "execution_count": 249, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
expirationstrikevaluation_dateftvariablemidpointrightequalized_iv
02025-07-18110.02025-07-16 16:00:00210.2605550.005476call_euro_price100.375000C3.747594
12025-07-18115.02025-07-16 16:00:00210.2605550.005476call_euro_price95.475000C3.776839
22025-07-18120.02025-07-16 16:00:00210.2605550.005476call_euro_price90.475000C3.533382
32025-07-18130.02025-07-16 16:00:00210.2605550.005476call_euro_price80.475000C3.074212
42025-07-18135.02025-07-16 16:00:00210.2605550.005476call_euro_price75.400000C2.702652
..............................
20192027-12-17420.02025-07-16 16:00:00226.3418742.420260put_euro_price194.528686P0.452546
20202027-12-17425.02025-07-16 16:00:00226.3418742.420260put_euro_price199.261261P0.458920
20212027-12-17430.02025-07-16 16:00:00226.3418742.420260put_euro_price203.994795P0.465294
20222027-12-17435.02025-07-16 16:00:00226.3418742.420260put_euro_price208.727394P0.471543
20232027-12-17440.02025-07-16 16:00:00226.3418742.420260put_euro_price213.459021P0.477792
\n", - "

2024 rows × 9 columns

\n", - "
" - ], - "text/plain": [ - " expiration strike valuation_date f t \\\n", - "0 2025-07-18 110.0 2025-07-16 16:00:00 210.260555 0.005476 \n", - "1 2025-07-18 115.0 2025-07-16 16:00:00 210.260555 0.005476 \n", - "2 2025-07-18 120.0 2025-07-16 16:00:00 210.260555 0.005476 \n", - "3 2025-07-18 130.0 2025-07-16 16:00:00 210.260555 0.005476 \n", - "4 2025-07-18 135.0 2025-07-16 16:00:00 210.260555 0.005476 \n", - "... ... ... ... ... ... \n", - "2019 2027-12-17 420.0 2025-07-16 16:00:00 226.341874 2.420260 \n", - "2020 2027-12-17 425.0 2025-07-16 16:00:00 226.341874 2.420260 \n", - "2021 2027-12-17 430.0 2025-07-16 16:00:00 226.341874 2.420260 \n", - "2022 2027-12-17 435.0 2025-07-16 16:00:00 226.341874 2.420260 \n", - "2023 2027-12-17 440.0 2025-07-16 16:00:00 226.341874 2.420260 \n", - "\n", - " variable midpoint right equalized_iv \n", - "0 call_euro_price 100.375000 C 3.747594 \n", - "1 call_euro_price 95.475000 C 3.776839 \n", - "2 call_euro_price 90.475000 C 3.533382 \n", - "3 call_euro_price 80.475000 C 3.074212 \n", - "4 call_euro_price 75.400000 C 2.702652 \n", - "... ... ... ... ... \n", - "2019 put_euro_price 194.528686 P 0.452546 \n", - "2020 put_euro_price 199.261261 P 0.458920 \n", - "2021 put_euro_price 203.994795 P 0.465294 \n", - "2022 put_euro_price 208.727394 P 0.471543 \n", - "2023 put_euro_price 213.459021 P 0.477792 \n", - "\n", - "[2024 rows x 9 columns]" - ] - }, - "execution_count": 249, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "tester.dropna()" - ] - }, - { - "cell_type": "code", - "execution_count": 264, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 264, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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pKens23bNj744ANuuukmy7afffYZ99xzD25ublx77bVER0dz+PBhPv30UxYvXsymTZtq/Bs816RJkxgyZEi118W5wzC33347c+bMITo6msmTJ6NpGosWLeKBBx5g3bp1fP3111Y/ZvVlMBgA0Ourvm3/9ttvAJbX+bkqh4oqt7kYTdMsx3dxcbno9j/++COpqakMGjSIdu3aWXUOe6jtsWkon3zyCQD33HOP3c7Rp08fXn75Zf7xj38wZcoU5s+fD4DJZOLWW28lPT2dL774osbn4aabbmLr1q3ccMMNGAwGfvjhB6ZPn862bdv48ccfrR7SfPPNN/n111+55pprGDp0KLm5uZb77r//fjp27MigQYOIiIjgzJkzLF26lNtvv52DBw/y0ksvAX8N9X7xxRecOHGiyrDvxSZ+l5WVcdVVV7FmzRratWvH1KlTKSoqYuHChUyYMIGdO3fy8ssvV9vvxIkT9O7dm5YtW3L77beTlZXFvHnzuO6661ixYgVDhw61qv1AI+wbsxMu0NMEqH/9619V7nvxxRcVoAICAtS9995b5dvm7NmzFaAeffTRKvtUZusGg0Ft3769yn2PPvqoAtRdd91V5fa69DQNHjxYaZqmvvnmmyq3Z2dnq65duyp3d/cqw2eV387Gjx9fJf5jx46pgICAOvU0KaVU7969a+ypUEqprl27KkBt3bpVKaXUhg0bFKCio6Or9LCVl5erMWPGKEDNmDGjyjFq62mqqTv85MmTKiIiQrVr167afVxgeO5Se5pq27ZScXGxCgoKUuHh4aq8vLzKfZXP6y233FJjbOd7/PHHFaDCwsLU9OnT1Zo1a1Rubu4F96lvTxOgbr/99moxnxt3TT2faWlpKi8vr9rtO3fuVF5eXmrkyJFVbv/zzz+VXq9XAQEBau/evdX2O3nypOX/Bw8eVAaDQbVq1UqdOnWqynYrVqxQOp1OjR07tsa21qS218WcOXMUoLp3716ll7SgoED17NlTAerrr7+udqwLPWZ1lZubq8LCwpSmaWrfvn1V7gsODr5gz5CXl5cCVGFh4UXPM3fuXAWovn37WhXXlVdeWWP764N69jSVl5erTp06KUAtX7683uevb09T5XtZmzZt6rRf5fuHn5+fmjZtWo0///nPf6rsYzKZ1OjRoxWgPvzwQ6WUUtOnT6+1N7Hy86N169YqKyvL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r19fp/NfTGhoKJ6envzxxx9VhsjKy8t55JFHyMzMrLbP/fffj16v56WXXqrx+Tt3nuCDDz6IwWDgscce49ChQ9W2LSsrs0lCVfn8PP300xQVFVluLyoqsiwXY81r1RpKKe655x4++OADRo0axY8//oiHh8cF97nzzjtxc3Nj5syZVV4P2dnZlsuvz39tnThxgkGDBnH06FFL2QZrnThxgl9++YWgoKAaPyTt6aWXXuKpp56iZ8+erFy50qGrIjgicTx27BhTpkwhKCjIUgLjyy+/pLCwkAkTJtQ6BPbSSy+RnZ1t+b2kpISnn34aML9+LlXlkOv5X4J//vlnyxfn81nzPnm+u+66C6UU//jHP6okW5mZmZaSBpV/r/Yiw3MOMGrUKPr3789NN91EREQE69atY926dcTFxfHKK6/U+7iVkwPvvvtu3nvvPfr06YO/vz+nTp1i9+7d7N27l40bN1q+mT3++ON8//33fPvtt/To0YOrrrqKnJwc5s+fz6BBg/jxxx/rFcctt9zCE088YfnAOncCeKV+/frx5JNP8tprr9GpUyduuOEGvLy8WLZsGXv37mXAgAH84x//uOi5HnvsMe677z66d+/O9ddfj8FgYP369ezbt49rrrmmxiUxhg8fzty5c7nmmmvo0aMHBoOBQYMGWT0B+2KGDx/O66+/zpQpU7j++uvx8fHB39+fBx98sMp2kydP5sUXX+T06dN07tzZqsm353r77beZPn063bt3p1evXoSEhJCbm8v27dvZuHEjer2eDz/8sEoS/tBDD/H5559z//33s3LlSqKjo9m5cycbN25kzJgxLFmyxCaPAZgTw4cffphXXnmFzp07c91111FWVsaqVavIyspi6NChlm+HlTp06MAHH3xgeU6vu+46WrduzZkzZ9i6dSu+vr6Wfdq1a8dnn33GXXfdRceOHRk5ciRt2rShvLycpKQk1q5dS0hIyEWXxriYW265hR9++IH58+fTsWNHxo4da5mTlZiYyIQJEy44NFIXL774Ip9++ikeHh5069atxveDbt26MXbsWMvv8fHxvP766zz88MP06tWLCRMmWJZROXXqFI8//ni111ZlPbeePXty/PjxOk3a/vTTTzGZTLVOALfWgQMHqrUvOzu7yvDOG2+8YUmMvvzyS55//nlcXFwYOHBgjV/s4uLi6jQh+/vvv+f7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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "tester[tester.expiration == exp].pivot_table(\n", - " columns='right',\n", - " index='strike',\n", - " values='equalized_iv'\n", - ").plot(\n", - " kind='line',\n", - " title='Implied Volatility Surface for 2027-12-17 Expiration',\n", - " ylabel='Implied Volatility',\n", - " xlabel='Strike Price'\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### COLLAPSE ST" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0 0.843129\n", - "2 0.843129\n", - "4 0.843129\n", - "6 0.843129\n", - "8 0.843129\n", - " ... \n", - "3300 2.551069\n", - "3302 3.416304\n", - "3303 3.416304\n", - "3304 6.056636\n", - "3305 6.056636\n", - "Name: div_pv, Length: 2068, dtype: float64" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[0;31mSignature:\u001b[0m\n", - "\u001b[0mvectorized_black_scholes_greeks\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mF\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mS\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mfloat\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mK\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mfloat\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mvaluation_dates\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mdatetime\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdatetime\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mend_dates\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mdatetime\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdatetime\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mfloat\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0msigma\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mfloat\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0moption_type\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mUnion\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'c'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mdiv_type\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'discrete'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mdiv_amount\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mdict\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mDocstring:\u001b[0m\n", - "Vectorized Black-Scholes Greeks calculation.\n", - "F: Forward prices (array)\n", - "S: Spot prices (array)\n", - "K: Strike prices (array)\n", - "valuation_dates: List of valuation dates (dates for which the option is priced)\n", - "end_dates: List of end dates (expiration dates of the options)\n", - "r: Risk-free rates (annualized, array)\n", - "sigma: Volatilities (annualized, array)\n", - "option_type: \"c\" for call, \"p\" for put (single string or list of strings)\n", - "div_type: Type of dividend ('discrete' or 'continuous')\n", - "div_amount: Dividend amount (single float or list of floats, ignored for continuous dividends)\n", - " if discrete expecting present value of discrete dividends, else if continuous expecting continuous yield rate.\n", - "Returns: Greeks (dictionary)\n", - "\u001b[0;31mFile:\u001b[0m ~/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/greeks/numerical/black_scholes.py\n", - "\u001b[0;31mType:\u001b[0m function" - ] - } - ], - "source": [ - "vectorized_black_scholes_greeks?\n", - "junkless_chain.div_pv" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "## Calculate weights\n", - "\n", - "greeks =vectorized_black_scholes_greeks(\n", - " junkless_chain['f'].to_numpy(),\n", - " junkless_chain['spot'].to_numpy(),\n", - " junkless_chain['strike'].to_numpy(),\n", - " junkless_chain['valuation_date'].to_numpy(),\n", - " junkless_chain['expiration'].to_numpy(),\n", - " [r] * len(junkless_chain), # Risk-free rate\n", - " junkless_chain['bs_vol'].to_numpy(),\n", - " junkless_chain['right'].str.lower().to_numpy(),\n", - " 'discrete',\n", - " junkless_chain['div_pv'].to_numpy()\n", - "\n", - ")\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\n", - "['2025-08-15 00:00:00', '2025-08-22 00:00:00', '2025-08-29 00:00:00',\n", - " '2025-09-19 00:00:00', '2025-10-17 00:00:00', '2025-12-19 00:00:00',\n", - " '2026-01-16 00:00:00', '2026-02-20 00:00:00', '2026-03-20 00:00:00',\n", - " '2026-05-15 00:00:00', '2026-06-18 00:00:00', '2026-09-18 00:00:00',\n", - " '2026-12-18 00:00:00', '2027-01-15 00:00:00', '2027-06-17 00:00:00']\n", - "Length: 15, dtype: datetime64[ns]" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import statsmodels.api as sm\n", - "junkless_chain['vega'] = greeks['vega']\n", - "junkless_chain['rel_spread'] = (\n", - " np.abs(junkless_chain['closeask'] - junkless_chain['closebid'])\n", - ") / junkless_chain['midpoint']\n", - "junkless_chain['weight'] = junkless_chain['vega'] / (1+ junkless_chain['rel_spread'])\n", - "re_aligned_chain= junkless_chain.pivot_table(\n", - " index=['expiration', 'strike', 'valuation_date'],\n", - " columns='right',\n", - " values=['weight', 'midpoint'],\n", - " aggfunc='sum' \n", - ").dropna().reset_index()\n", - "re_aligned_chain.columns = [x[0] if x[1] == '' else f\"{x[0]}_{x[1].lower()}\" for x in re_aligned_chain.columns]\n", - "re_aligned_chain['assigned_weight'] = re_aligned_chain.apply(\n", - " lambda x: np.min([x['weight_c'], x['weight_p']]),\n", - " axis = 1\n", - ")\n", - "re_aligned_chain['parity_price'] = re_aligned_chain['midpoint_c'] - re_aligned_chain['midpoint_p']\n", - "re_aligned_chain['root_x'] = re_aligned_chain['strike']\n", - "re_aligned_chain['root_y'] = re_aligned_chain['parity_price']\n", - "re_aligned_chain.expiration.unique()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
expirationimplied_fdiscountrate
02025-08-15507.2690940.9995060.006022
12025-08-22507.3259181.000890-0.008779
22025-08-29507.3337891.000629-0.005220
32025-09-19508.2279801.000777-0.004365
42025-10-17509.8404550.9962010.014948
52025-12-19512.4524440.9921300.018499
62026-01-16513.7703000.9921020.015740
72026-02-20515.3528260.9916210.014033
82026-03-20516.2509010.9874860.018621
92026-05-15516.9753951.001750-0.002108
102026-06-18519.1273440.9877530.013355
112026-09-18521.2506470.9934710.005577
122026-12-18524.1051590.9898240.007185
132027-01-15525.5452120.9871180.008642
142027-06-17530.4668790.9814360.009764
\n", - "
" - ], - "text/plain": [ - " expiration implied_f discount rate\n", - "0 2025-08-15 507.269094 0.999506 0.006022\n", - "1 2025-08-22 507.325918 1.000890 -0.008779\n", - "2 2025-08-29 507.333789 1.000629 -0.005220\n", - "3 2025-09-19 508.227980 1.000777 -0.004365\n", - "4 2025-10-17 509.840455 0.996201 0.014948\n", - "5 2025-12-19 512.452444 0.992130 0.018499\n", - "6 2026-01-16 513.770300 0.992102 0.015740\n", - "7 2026-02-20 515.352826 0.991621 0.014033\n", - "8 2026-03-20 516.250901 0.987486 0.018621\n", - "9 2026-05-15 516.975395 1.001750 -0.002108\n", - "10 2026-06-18 519.127344 0.987753 0.013355\n", - "11 2026-09-18 521.250647 0.993471 0.005577\n", - "12 2026-12-18 524.105159 0.989824 0.007185\n", - "13 2027-01-15 525.545212 0.987118 0.008642\n", - "14 2027-06-17 530.466879 0.981436 0.009764" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "## Test\n", - "def extract_df_forward_with_regression(clipped_chain: pd.DataFrame) -> Tuple[float, float]:\n", - " \"\"\"\n", - " Extracts the forward price and discount from a clipped option chain using regression.\n", - " \n", - " Args:\n", - " clipped_chain (pd.DataFrame): The clipped option chain DataFrame.\n", - " \n", - " Returns:\n", - " Tuple[float, float]: The implied forward price and discount.\n", - " \"\"\"\n", - " x_const = sm.add_constant(clipped_chain['root_x'])\n", - " model = sm.WLS(clipped_chain['root_y'], x_const).fit()\n", - " discounted_f = model.params['const']\n", - " discount = -model.params['root_x']\n", - " implied_f = discounted_f / (discount)\n", - " expiration = clipped_chain['expiration'].iloc[0]\n", - " t = time_distance_helper(\n", - " expiration,\n", - " clipped_chain['valuation_date'].iloc[0]\n", - " )\n", - " return {\n", - " 'implied_f': implied_f,\n", - " 'discount': discount,\n", - " 'rate': -(np.log(discount)/t)\n", - " }\n", - "\n", - "forward_discount_curve_v1 = pd.DataFrame(re_aligned_chain.groupby('expiration').apply(extract_df_forward_with_regression).to_dict()).T.reset_index(names='expiration')\n", - "forward_discount_curve_v1" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Using rates column: rate\n" - ] - } - ], - "source": [ - "junkless_chain_copy = junkless_chain.merge(\n", - " forward_discount_curve_v2,\n", - " on='expiration',\n", - " how='left'\n", - ")\n", - "\n", - "vols = get_discrete_crr_vol_on_chain(\n", - " junkless_chain_copy,\n", - " rates_col_name='rate',\n", - " valuation_date=test_valuation_date,\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "junkless_chain_copy['crr_new_vol_discrete'] = vols\n", - "junkless_chain_copy['crr_new_vol_discrete'].describe()\n", - "junkless_chain_copy['crr_vol_discrete'] - junkless_chain_copy['crr_new_vol_discrete']\n", - "junkless_chain_copy['european_price_crr_vols'] = black_scholes_vectorized(\n", - " F = junkless_chain_copy['implied_f'].to_numpy(),\n", - " K = junkless_chain_copy['strike'].to_numpy(),\n", - " T = junkless_chain_copy['t'].to_numpy(),\n", - " r = junkless_chain_copy['rate'].to_numpy(),\n", - " sigma = junkless_chain_copy['crr_new_vol_discrete'].to_numpy(),\n", - " option_type= junkless_chain_copy['right'].str.lower().to_numpy(),\n", - ")\n", - "eu_vols = get_bs_vol_on_chain(\n", - " junkless_chain_copy,\n", - " test_valuation_date,\n", - " 'rate',\n", - " forward_col_name='implied_f',\n", - " mid_col_name='european_price_crr_vols'\n", - ")\n", - "junkless_chain_copy['european_vols'] = eu_vols" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkQAAAHMCAYAAAA067dyAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAl+tJREFUeJzs3Xd4k9UXwPHvfZt079IBLR1Q9lSmgExBQBTEPVEEF+KeOEAFFXGg4MaFG5AhU2VPGSJL9qaUQvekM/f3R2l+1BYopW3S5nyeh0ebvOOcvmlyct87lNZaI4QQQgjhwAxbByCEEEIIYWtSEAkhhBDC4UlBJIQQQgiHJwWREEIIIRyeFERCCCGEcHhSEAkhhBDC4UlBJIQQQgiHJwWREEIIIRyeFERCCCGEcHhSEAlRQcaMGYNSiuXLl1f6uZYvX45SijFjxlT6uaqzqrwm9uBc+Sql6N69e5XHk5aWxqOPPkpkZCQmkwmlFFu2bKnyOIQoCymIqtDu3bsZOXIkzZs3x8fHB2dnZ+rUqcM111zDl19+SU5OTrHtlVLF/jk5OeHv70/37t355ptvKG3VlcOHD5fYz2QyERQURN++fZkzZ85Fxx0ZGYlSCi8vL06ePFnqNt27d0cpxf79+y/6+JXtiy++QCnFzTfffMFt33jjDZRSPPbYY5UeV9GHV9E/wzDw9vYmIiKC/v37M378eI4fP17pcVS1otfoPffcY+tQKl1sbCxPPPEETZs2xd3dHTc3N8LDw+nWrRsvvvgiBw4cKLZ90d9RTfHss88yadIkWrRowQsvvMDo0aMJCQmp0hiOHz/OpEmT6NevH5GRkbi4uBAQEEDv3r2ZOXPmefedN28e3bt3x8fHB09PTzp06MC3335b6rZr1qzh2WefpV27dgQGBuLi4kJUVBTDhg0r9X2xtPfq0v6tWrXqovI9ffo0o0ePplGjRri6uhIUFMTNN9/Mrl27zrvf5s2buf322wkLC8PFxYXg4GC6devG1KlTL+r8f/75J0899RS9evUiICAApRRdunQ55/b/fR8s7V/9+vUvKobyMlXJWQSvvfYar776KhaLhSuuuIIhQ4bg6enJyZMnWb58OcOGDeOTTz5h06ZNJfYdPXo0AHl5eezfv59Zs2axYsUKNm3axOTJk0s9n4+PD48//jgAOTk5/Pvvv8ybN4/ff/+dCRMm8PTTT190DhkZGYwePZpPP/30ove1pdtuu40nn3ySOXPmkJCQQK1atUrdTmvNl19+CcD9999fZfF169bN+u09MzOTEydOsGbNGhYuXMjo0aMZM2YMzz//fLF92rdvz65du86Zi7C9HTt20K1bN5KSkmjRogVDhgzB39+fU6dOsWHDBt544w2ioqIq9M3+kUce4dZbbyU8PLzCjnkp5s2bR8OGDZk7d67NYpg0aRLjx48nKiqKHj16EBISwpEjR5g5cyaLFy/miSee4L333iux3+TJkxk5ciQBAQHceeedODs7M2PGDO655x62b9/OO++8U2z7G264gfj4eDp16sQdd9yByWRi3bp1fPnll/z888/8+eefXHHFFdbtfX19re/t/3Xs2DG++uorAgICaN++fZlzzcnJoXfv3qxZs4a2bdvy2GOPcezYMaZPn878+fNZunQpHTp0KDXXxx57DD8/P6655hpCQ0NJSkpix44dLFiwgLvvvrvMMXz00UfMmTMHV1dXoqOjSUpKOu/252u5nDt3Lps3b6Zfv35lPv8l0aLSjRs3TgO6bt26+q+//ip1m7lz5+ru3bsXewzQpV2i1atXa8MwtFJKHzx4sNhzhw4d0oCOiIgosd9PP/2kAe3u7q4zMzPLHH9ERIQGdHR0tHZyctI7d+4ssU23bt00oPft21fm41al4cOHa0C/++6759xm8eLFGtCdOnUq1zlGjx6tAb1s2bKL2n706NElnrNYLHrGjBna399fA/rNN98sV0z2qOg1OmTIkEo/18Vek4rUq1cvDegxY8aU+vyBAwf0rl27ij1W9HdU0QDdrVu3Cj/uhSilbHLes/366696+fLlJR7fuXOn9vb21oDetGlTsecOHTqkXVxctL+/vz506JD18aSkJF2/fn0N6LVr1xbb56233tLHjx8vcZ6i9//mzZuXOebnn39eA/qJJ54o8z5aa/3GG29oQN944426oKDA+vjs2bM1oJs2bVrsca21/v3337VSSvfp00enpaWVOGZubu5FxbB27Vq9Y8cOnZ+fb/1b79y580UdQ2ut8/PzdVhYmAb01q1bL3r/8pCCqJIdOnRIm81mbTab9fbt28+7bXZ2drGfz1UQaa1106ZNNaCnT59e4nznKogsFov28PDQgN64cWOZcygqiKZPn64BPWDAgBLbnK8g2rVrlx4yZIgOCwvTZrNZBwUF6dtuu03v3r272HZFbwJ//PFHscdfeeUVDeh69eqVOHZwcLCuW7fuBXPYuHGjBnSTJk3Ouc0tt9yiAf3NN99YH9u7d6++6667dJ06dbTZbNa1a9fWd911l967d2+J/SuyICqydOlSDWg3NzcdGxtrfXzZsmWl7nvgwAE9fPhwXb9+fe3q6qr9/Px08+bN9QMPPKATEhJKHP/nn3/WPXv21H5+ftrFxUVHREToW2+9tdjr4+uvv9aA/vrrr/XChQt1t27drB8kRfLy8vRHH32kO3TooL28vLSbm5tu3bq1njRpUrE34KKcS/v39ddfF4tt0aJFul+/fjogIEA7OzvrevXq6aefflonJyeX6fd79vmWLVumv/nmG926dWvt6uqqAwMD9b333qtPnDhRbPuOHTtqpVSxD8GzvfPOOxrQEyZMuOC53dzcNFCmeIv+bkv7d3ZBERERoSMiInRqaqp+4okndEREhDaZTNbXwbleg+cqiN5++22tlNKdOnXSiYmJ1sf/+usvfcMNN+jg4GBtNpt1WFiYvv/++0v9wC9N0fvB+XIpKCjQn3zyiW7btq328PDQ7u7uum3btvrjjz8u8aF9dg4nTpzQ9913n65Tp442DKPE6+ZiFH1Reuedd4o9/vLLL2tAv/LKKyX2+fLLLzWg77777jKdIz8/3/paKO1v8L9yc3N1SEiIBkoUzOdjsVh0eHi4Bkp8UdZa6yuvvFIDeunSpcUeb9mypXZ3dy9TbBfrUgqi3377TQO6Y8eOFR7Xucgts0r29ddfk5eXx6233krz5s3Pu62Li8tFH99sNpcrrvLsN2jQILp27cq8efNYtmwZPXr0uOA+ixYtYvDgweTl5XHttdcSHR1NTEwMM2fOZP78+SxbtozLL78cgF69evHWW2+xZMkSevfubT3GkiVLADh48CCHDx8mMjISKLwlcfLkyTL1RWnbti2tW7dmy5YtrFmzhs6dOxd7PjExkdmzZ+Pj42Pta7Rx40auuuoq0tPTue6662jatCm7d+/m+++/Z86cOSxevJh27dqV5VdXbj169KBLly6sXr2amTNnMmLEiHNue+LECdq1a0daWhr9+/fnhhtuIDs7m0OHDvHdd9/xyCOPEBAQABTeHrz33nv59ttvqVWrFoMHDyYwMJCYmBiWLVtGo0aNaNu2bbHjz5gxg0WLFtGvXz8efPBBjhw5AmC9tr///juNGjXi9ttvx9XVlWXLljFy5EjWr1/Pd999BxQ2j6ekpPDBBx/QqlUrBg0aZD1+69atrf//6quvMmbMGPz9/RkwYABBQUFs27aNd955hwULFrBu3Tq8vb3L/Ht8//33+eOPP7jlllvo27cvq1ev5uuvv2b58uWsX7+ewMBAAB566CH++usvvvjiC8aNG1fiOJ9//jkuLi5les0FBAQQExPD3r17L3jbo+j2yTfffMORI0eK3Uoper0Xyc3NpWfPniQlJdGnTx+8vb2Jioq68C/hLBaLhccff5xJkyYxePBgfvjhB1xdXQH46quvuP/++3FxceG6666jbt267Nu3jylTpjB37lz++uuvC96Su+eee+jevTuvvvoqERER1t/X2bncdddd/Pjjj9StW5dhw4ahlGLWrFk8/PDDrF69mh9++KHEcZOSkujYsSOenp4MHjwYwzAIDg6+qNzPVvQ+aDIV/yhcunQpAH379i2xT9Htm6JtLqSoHyeAk5PTBbf/7bffiIuLo2vXrjRu3LhM5wA4cOAAR48epWHDhqW+Hvr168eqVatYunSp9b17x44dbNu2jUGDBuHv78+yZcv4+++/UUrRunVrevTogWHYpqvx559/DlRt9wVpIapkPXv21ID+4osvLnpfztFCtGLFCm0YhnZ2di7WaqD1+VuIvvvuOw3owMBAffr06TLHUdRClJeXpzds2KCVUrpNmzbaYrFYtymthSgpKUn7+vrqgIAA/e+//xY75vbt27WHh4e+7LLLrI9lZWVpFxcX3bZtW+tj6enp2mw26969e2tAT5kyxfrcxIkTNaCnTp1apjw+/vjjc96qee+99zSgR4wYobUu/LbVuHFjDejvv/++2LY///yzBnSjRo1Kbf2oyBYirbV+6aWXSnwjLa2F6MMPP9SAnjhxYoljZGRk6KysLOvPn332mQZ0u3btdEpKSrFt8/Pzi72uilqIlFJ64cKF58zjkUce0fn5+cWOM3ToUA3o2bNnWx+/0C2zolaxK664okTrSlEsjz/+eKn7nis2s9msN2/eXOy5xx9/XAN66NCh1sdOnz6tAwICdEhIiM7Lyyu2fdHv/Pbbby/TuZ966ikN6ODgYD1mzBi9YsUKnZqaet59LnTLrOhvsVevXjojI6PE82VpITp9+rQePHiw9Zqd/Rres2ePNpvNun79+jomJqbYMRYvXqwNw9CDBg26QOaln/dsP/74owb0ZZddptPT062PZ2Rk6DZt2mhA//DDDyWOBei77rqrxLUpj9TUVB0cHKyVUiW6AdSqVeu8LTpFLe1l6XpQ9H5R1paOPn36lJr/hcybN++cLfhaa2sL/80332x97KuvvtKAvv/++3XXrl1LtOi1aNHikrpBlLeF6NixY9rJyUn7+PhcVPeOSyUFUSVr0qSJBkr9ILmQohfl6NGj9ejRo/WoUaP0zTffrM1ms1ZK6Q8//LDEPkUvQB8fH+t+zz//vB4wYIBWSmlnZ2c9c+bMi4rj7IJIa61vvfVWDejvvvvOuk1pBVFRwTJ58uRSj1v0gXR2sdS9e3dtGIZOSkrSWms9f/58Dej58+frwMBAfdttt1m3vfbaazVQ5mb81NRUa9P8fz+Yim5BFt2rXr16tfVDuTRdunTRgF6xYoX1scoqiD755BMN6H79+lkfO19B9Nlnn13w3M2bN9dAiSKhNEVFSGkfhAUFBdrf37/UAkJrrZOTk7VSSt90003Wxy5UEA0aNEgDeseOHaU+37p1ax0YGHjBuLX+/+/47KKnSEpKivbx8dGurq7Fblc//fTTGtAzZswotn3R6/7sa34+2dnZevjw4dpkMln/lpVSulGjRvqxxx7TBw4cKLFPWQuiLVu2nDffcxVEiYmJunPnzloppcePH19i/6K/yXnz5pV6/EGDBmknJ6dS+5qU5lwF0VVXXaUB/fvvv5d4rqgvX48ePUocy9nZWZ88ebJM5z4fi8Wib7rpJg3ohx9+uMTzZrO52Hvef9WpU0cDJb6Q/tfBgwd1YGCgNplMJfoclebQoUNaKaUDAgJKdKG4kB9++EED+o477ij1+T/++EMDuk+fPtbH3nrrLQ1oJycnHR4erufPn69TU1P13r179Z133qkB3bBhQ52Tk3NRsZydT3kKojFjxhT7glpV5JZZNfDqq68W+1kpxZdffsm99957zn1SU1NL7Ofi4sKcOXO4+uqrLymeN998k1mzZvHiiy9y4403Wpva/2vdunUAbN26tdT5cvbu3QvArl27aNq0KQA9e/Zk+fLlLF++nOuvv56lS5diNpvp1q0bPXr0sDZTFxQUsHLlSho1akSdOnXKFLe3tze33HILX331FT/88AMPPfQQAGvXrmXnzp20b9+eli1bAoVDUIviKU3Pnj1ZvXo1//zzD127di3T+ctLn5le4ULDsa+77jpGjRrFiBEj+P3337n66qvp3LkzTZs2LbZvZmYmO3bsIDg4mMsuu6zMcZR222fv3r0kJSXRoEEDxo4dW+p+bm5uFxzye7Z169ZhNpuZPn0606dPL/F8bm4u8fHxJCYmWm8BXki3bt1KPObj40Pr1q1ZsWIFu3btst6ye+ihh3j33Xf57LPPuOGGGwBISEhg1qxZNGnSpMzX28XFhc8//5zXX3+dRYsWsX79ejZv3symTZv44IMP+Pzzz5k2bRoDBgwo0/GKuLq6Wl+nF+PkyZN07tyZgwcP8v3333P77beX2Kbob3bFihVs3LixxPOnTp2ioKCAvXv30qZNm4uOocjmzZsxDKPUEUbdunXDycmJf/75p8RzkZGRBAUFlfu8RZ566immT5/OlVdeWeoIs4pw6tQp+vXrR3x8PB999FGxEWbn8sUXX6C1ZsiQIaV2oSjtffSee+4pcVu1rCwWC1D4fvrzzz9bY/T29mbq1Kns3r2bTZs28euvv3LbbbeRkpLCxIkTSxzn8ccfx9fXt1wxlBZT0WjfBx54oEKOWVZSEFWy2rVrs2vXrkuaT6boAzEzM5N169Zx33338eCDDxIREXHOD+yIiAgOHz4MFE6O9ueffzJs2DBuvvlm1q1bZy1AyiMyMpKRI0fyzjvv8MEHH/Dcc8+Vul1iYiJQ+Ed+PhkZGdb/79WrF6+88gpLlizh+uuvZ8mSJXTo0AEPDw969erFtGnT2LFjB5mZmaSmpnLHHXdcVOzDhw/nq6++YsqUKdaCaMqUKUDxe9WpqalA4fUrTdHjKSkpF3X+8oiNjQWw9nM5l4iICDZs2MCYMWNYtGiRdY6VunXr8vTTT/Poo48C/485NDT0ouIobf6Yomu8b9++EgX42c6+xheSmJhIfn7+eY9XdMyyFkTn6mdSlFPR9QaoV68eV199Nb///jsHDhygfv36fPvtt+Tk5JTrDTo4OJghQ4YwZMgQoLAfzHPPPceUKVMYOnQoMTExODs7l/l4QUFB5ZqrKC4ujrS0NMLCws45L0zR9ZwwYcJ5j3Ux17M0qamp+Pv7l5q3yWSiVq1anDp1qsRzFTGH0bPPPsv7779P165dmT9/fqmFh4+PDwkJCaSmppb6Git6vfj4+JR6jlOnTtGzZ0/27NnDBx98wMMPP3zBuPLz8/n666+Bc/ebKe1vonv37kRGRlpjOfu1XFrMZxcuRf8fEhJSomBTSjFw4EA2bdrEhg0brAVRaTHcc889FVYQLVy4kGPHjtGxY0datGhRIccsK5mYsZIVvfEUdQy+FB4eHlx11VXMnTuXgoIChgwZQlZW1gX38/b25oYbbuD7778nLS2Nu+++u9RJHS/Giy++iL+/P2+++SYJCQmlblP0B7p161Z04e3ZUv8VfVBAYSuEp6cnixcvJjExka1bt9KrVy/g/601ixcvtv4+z1UQnkvHjh1p2bIlmzdvZvPmzaSnpzNt2jS8vb259dZbS8QeFxdX6nFOnDhRbLvKtGzZMoBS5w/5ryZNmvDLL7+QmJjIpk2beOutt7BYLDz22GPWb11Fb1wXW6SX9iFclP/1119/3mt86NChMp/Hx8cHPz+/8x5Pa01ERESZj3muCUWLru9/r+NDDz2E1tpazH/++ee4urpe1Hws5+Lv789nn31GeHg48fHx7Nix46L2L+/Eja1ateLbb7/l+PHjdO3alYMHD5bY5uwP1fP97ktrcbsYPj4+JCUlkZeXV+K5/Px8EhISSu00f6mTVj7xxBNMmDCBHj16sHDhQjw9PUvdrlGjRsD/W7HPduLECTIzMwkLC8Pd3b3U57t3787OnTv56KOPrF9ELmTu3LmcOHGCbt26Wc//X6Vdi6JWtvPFDIVfWgAaNmxYIs9zFTN+fn5A4WSPUPhluLQYyttCVZqiztRV3ToEUhBVunvvvRez2cyvv/7Kzp07z7vtf2eqPpeWLVsyfPhwYmJieP/998scyzXXXEPfvn35+++/+fHHH8u8X2l8fX15+eWXS701V6Rjx44AFzXTqslkomvXruzZs4fvvvsOrbW1IIqOjiY8PJwlS5awdOlSDMMo00i3/xo+fDhQ2DL0448/kpmZye23346Hh4d1m6JbSeda8qGoSCkaIVdZli5dypo1a3Bzc+P6668v834mk4k2bdrw3HPP8dNPPwEwe/ZsoLCwbt68OSdPniz1tsTFaNy4Mb6+vvz111+lfriVpmikTUFBQanPd+zYkeTkZP79999Liu1sK1asKPFYamoqW7ZswdXVlSZNmhR7bsCAAYSHh/P111/zxx9/sHfvXm6++WbrB8SlMgzD+no7+8vJhX43l+rOO+/k559/JjY2lq5du5b48CzP32x5XHbZZVgsFlauXFniuZUrV1JQUFChf1taa0aMGMHEiRPp3bs38+fPL7WYKVL0RWvRokUlnlu4cGGxbc4WExNDt27d2L17N59++mmZWoaKXOqoqvr16xMeHs7evXtL/QJSWtwdO3bEw8ODw4cPk5mZWWKfomL9YkcxlldsbCzz58/Hx8eHW265pUrOWUwl9EsS/1E0MVdkZOQ55/9ZuHBhqZ0Iz3WJYmJitIuLi/b19bV2QNb6/KPMtP7/fDz169cv80iN/3aqLpKTk6Pr16+vzWazdZuzO1UnJCRoX19fHRgYqNevX1/iuAUFBaV2QC6a6yUoKEh7eHgUmxjsnnvu0V5eXtrV1bXYCLWLkZycrN3c3LSPj49u2bKlBvTff/9dbBuLxaIbNWqkoeRcT0WjNRo2bFhpo8wsFov+9ddfrRMzvv3228WeL61T9aZNm0qMGDs73rNHl3z++efnHGVWUFBQ6iizc833UjRny4MPPlhsJFuR2NjYYh3n09PTtVJKd+3atdTjFXWqveKKK0rtMJ+RkaHXrVtX6r7/VZZRZvfee2+p+44dO1YDOjQ0VEPJifguZMyYMeecz2j69OlaKaX9/PyKdZ4t6uhb2jwyWv9/HqJzKes8RHPmzNEuLi46JCSkWOf1Xbt2abPZrBs0aKD37NlT4vg5OTl65cqV5zz/f/33vEWKOgC3a9eu2CiizMxM3a5dO00pozvPdawLsVgsetiwYdaBCWUZYXvw4MGLnpjx8OHDOioqqlxzIx0+fFgbhlGuztRnK8/EjI8++qjmzMjNs0cOb9u2Tbu6umqTyaT3799frngutlP1a6+9Zh39aAvSh6gKjBo1ytonol27dnTq1Im2bdtal+5YuXIl+/btKzHvy/mEhoby4IMP8sEHH/D222/z5ptvlmm/tm3bMnDgQObMmcOXX355Sc2Szs7OvPnmm9x8883WOWnOFhAQwIwZM7j++uvp2LEjvXr1olmzZiilOHbsGOvWrSMxMZHs7Oxi+xW1CJ06dYq+ffsWmzOpV69efPPNN8W2u1i+vr7cdNNNTJ06lW3bttGmTZsS30aVUnz77bf07t2bW265hYEDB9K4cWP27NnD7Nmz8fLyYurUqRUyR8fy5cutnSVPnz5NbGwsa9as4dChQ7i4uDB+/HieeeaZCx7nu+++47PPPqNLly7Ur18fPz8/Dhw4wNy5c3FxcbEu5QIwbNgwVq1axXfffUeDBg0YOHAggYGBxMbGsnTpUoYOHVrmhWNffvlltm7dyqeffsrcuXPp2bMnoaGhnDp1in379rFmzRrGjRtn7bdWtCbUqlWruOOOO2jYsCFOTk5cd911tGzZ0jof1QsvvECDBg3o378/UVFRZGRkcOTIEVasWEGXLl1K/fZ+Lv369aNz587cfPPN1K5dm9WrV7N69WoiIyN56623St1n2LBhvPbaaxw/fpwWLVqUqVPs2d5//33GjBnDZZddRtu2bQkMDCQ1NZXNmzezbt06TCYTn376abE+LL169WL69OkMHjyY/v374+bmRkREBHfddddFnftCrrvuOubMmcP1119P9+7dWbx4Ma1ataJx48Z89dVXDB06lGbNmtG3b18aNmxIXl4eR48eZdWqVQQGBrJ79+5LOv/tt9/OnDlzmDZtGs2aNWPQoEEopZg9ezaHDh3illtuuej+gefy2muvMWXKFNzc3GjdunWp17t169bF5sSKiopiwoQJPProo7Rt25ZbbrnFunRHTEwMTz31VInXQ/fu3Tl8+DBt2rTh8OHDF9UBesqUKVgslnN2pi6rJ598knnz5jFjxgw6dOhAr169OHr0KNOnT8fd3Z2vvvqqxHvW66+/zsqVK5k4cSLr1q2jc+fOnDx5kpkzZ5Kdnc3EiRMvanmZ1atXW/tlFvU127dvX7G5u4rew892dmfqKp176Gw2KcMc1M6dO/UjjzyimzVrpr28vLTZbNYhISG6b9++esqUKRc1U7XWWsfFxWl3d3ft7u6u4+LitNYXbiHSWustW7ZopZQODQ0t07elc7UQFbniiiussZY2Z8WhQ4f0iBEjdHR0tHZxcdFeXl66UaNG+s4779SzZs0qsb3FYrHOA/LflpHjx49bz7VgwYILxn4uRcPqucAw9d27d+s777xTh4SEaJPJpENCQvQdd9xRYpZtrcvfQlT0TymlPT09dXh4uO7Xr59+6623SswFU6S0FqK//vpLP/jgg7ply5baz89Pu7q66vr16+t77rnnnLOkf//997pr167a29tbu7i46MjISH377bcXazG7UAuR1oXXbOrUqdZZr81ms65Tp47u3LmzHjdunD569Gix7fft26cHDBig/f39tVKq1OOvWrVK33TTTbp2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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "exp = '2027-06-17'\n", - "junkless_chain_copy[junkless_chain_copy.expiration == exp].pivot_table(\n", - " columns = 'right',\n", - " index = 'log_moneyness',\n", - " values = 'european_vols',\n", - " aggfunc='mean'\n", - "). sort_index(ascending=False).round(3).plot(\n", - " title='CRR New Vol Discrete by Strike for 2027-06-17',\n", - " ylabel='Volatility',\n", - " xlabel='Strike Price'\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkQAAAHMCAYAAAA067dyAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAjFNJREFUeJzs3Xd0VOXWwOHfmcyk95AeUkjohCJVehcQESygqBdFsPf+gQoqiFgQFbzqxQY2ihSpKr0KIjUUaQlJSE9IJ3Xe74+YkZAE0guzn7VYmjPnnNk7M5nsvFVTSimEEEIIIcyYrr4DEEIIIYSob1IQCSGEEMLsSUEkhBBCCLMnBZEQQgghzJ4UREIIIYQwe1IQCSGEEMLsSUEkhBBCCLMnBZEQQgghzJ4UREIIIYQwe1IQCVFDpk+fjqZpbN26tdafa+vWrWiaxvTp02v9uRqzunxNGoLy8tU0jf79+9d5POnp6Tz11FMEBgai1+vRNI1Dhw7VeRxCVIQURHXo5MmTPPnkk7Rr1w4nJycsLS3x8fHh5ptv5ssvvyQ3N7fE+ZqmlfhnYWGBq6sr/fv355tvvqGsXVciIiJKXafX6/Hw8GDYsGGsWrWq0nEHBgaiaRoODg7Ex8eXeU7//v3RNI0zZ85U+v617X//+x+apjF27Nhrnvv222+jaRpPP/10rcdV/Mur+J9Op8PR0ZGAgABGjBjB7NmzuXDhQq3HUdeK36P3339/fYdS62JiYnj22Wdp06YNtra22NjY4O/vT79+/Zg6dSpnz54tcX7xz9H14qWXXuKTTz4hNDSU//u//2PatGl4eXnVaQwXLlzgk08+Yfjw4QQGBmJlZYWbmxtDhgxh+fLlV712zZo19O/fHycnJ+zt7enevTvffvttmefu2rWLl156ia5du+Lu7o6VlRVBQUFMmjSpzM/Fsj6ry/q3Y8eOSuV76dIlpk2bRsuWLbG2tsbDw4OxY8dy4sSJq1534MABxo8fj5+fH1ZWVnh6etKvXz8WLlxYqef//fffef755xk0aBBubm5omkbv3r3LPf/Kz8Gy/gUHB1cqhqrS18mzCN58803eeOMNjEYjN954IxMmTMDe3p74+Hi2bt3KpEmT+O9//8v+/ftLXTtt2jQA8vPzOXPmDCtWrGDbtm3s37+fefPmlfl8Tk5OPPPMMwDk5uZy7Ngx1qxZw6+//sp7773HCy+8UOkcMjMzmTZtGp999lmlr61Pd999N8899xyrVq0iKSmJJk2alHmeUoovv/wSgIceeqjO4uvXr5/pr/esrCxiY2PZtWsX69evZ9q0aUyfPp1XXnmlxDXdunXjxIkT5eYi6l9YWBj9+vUjJSWF0NBQJkyYgKurKwkJCezbt4+3336boKCgGv2wf+KJJ7jrrrvw9/evsXtWx5o1a2jRogWrV6+utxg++eQTZs+eTVBQEAMGDMDLy4vz58+zfPlyNm7cyLPPPsucOXNKXTdv3jyefPJJ3NzcuPfee7G0tGTZsmXcf//9HD16lPfff7/E+bfffjuJiYn07NmTe+65B71ez549e/jyyy/56aef+P3337nxxhtN5zs7O5s+268UFRXFV199hZubG926datwrrm5uQwZMoRdu3bRpUsXnn76aaKioli6dClr165l8+bNdO/evcxcn376aVxcXLj55pvx9fUlJSWFsLAw1q1bx3/+858KxzB//nxWrVqFtbU1ISEhpKSkXPX8q7Vcrl69mgMHDjB8+PAKP3+1KFHrZs6cqQDVtGlT9ccff5R5zurVq1X//v1LHANUWS/Rzp07lU6nU5qmqXPnzpV4LDw8XAEqICCg1HU//vijApStra3KysqqcPwBAQEKUCEhIcrCwkIdP3681Dn9+vVTgDp9+nSF71uXJk+erAD1wQcflHvOxo0bFaB69uxZpeeYNm2aAtSWLVsqdf60adNKPWY0GtWyZcuUq6urAtSsWbOqFFNDVPwenTBhQq0/V2Vfk5o0aNAgBajp06eX+fjZs2fViRMnShwr/jmqaYDq169fjd/3WjRNq5fnvdzPP/+stm7dWur48ePHlaOjowLU/v37SzwWHh6urKyslKurqwoPDzcdT0lJUcHBwQpQu3fvLnHNO++8oy5cuFDqeYo//9u1a1fhmF955RUFqGeffbbC1yil1Ntvv60Adccdd6jCwkLT8ZUrVypAtWnTpsRxpZT69ddflaZpaujQoSo9Pb3UPfPy8ioVw+7du1VYWJgqKCgw/az36tWrUvdQSqmCggLl5+enAHX48OFKX18VUhDVsvDwcGUwGJTBYFBHjx696rk5OTklvi6vIFJKqTZt2ihALV26tNTzlVcQGY1GZWdnpwD1559/VjiH4oJo6dKlClAjR44sdc7VCqITJ06oCRMm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0/D29iY2Ntas+pnNNW8w39zNNW8w39zNNW8w39xrIm+DwVDhQdUNZgyREEIIIUR9kYJICCGEEGZPCiIhhBBCmD0piIQQQghh9qQgEkIIIYTZk4JICCGEEGZPCiIhhBBCmD0piIQQQghh9hrUStUNnV7fOL5djSXOmmaueYP55m6ueYP55m6ueYP55l6dvCtzraxULYQQQgizJ11m15FLly7x8ssvc+nSpfoOpU6Za95gvrmba95gvrmba95gvrnXdd5SEF1HlFKEh4eb1V43YL55g/nmbq55g/nmbq55g/nmXtd5S0EkhBBCCLMnBZEQQgghzJ4URNcRg8HAHXfcgcFgqO9Q6pS55g3mm7u55g3mm7u55g3mm3td5y2zzIQQQghh9qSFSAghhBBmTwoiIYQQQpg9KYiEEEIIYfakIBJCCCGE2TPPjVGuE8uXL+fAgQNERESg1+v55ptvrnmNUoolS5awadMmsrKyaNWqFZMmTcLb27v2A65BmZmZfPXVV/z1119omkb37t154IEHsLa2Lvea1NRUFi1axJEjR8jJycHHx4cxY8bQo0ePOoy8eqqSN8CpU6f48ccfOXPmDDqdjsDAQKZOnYqlpWUdRV59Vc0dit73s2bN4tChQ7zwwgt069atDiKuOZXNPTMzkyVLlnD48GGSkpJwdHSka9eu3HXXXdja2tZx9BW3YcMGVq9eTWpqKgEBAUycOJGQkJByz9+zZw+LFy8mMTERLy8v7rnnHm644YY6jLjmVCb3jRs3sn37dqKiogBo1qwZd99991W/Vw1VZV/zYrt27eKjjz6iS5cuvPTSSzUSi7QQNWIFBQX06NGDoUOHVviaVatWsX79eiZPnszbb7+NlZUVM2fOJC8vrxYjrXkff/wxUVFRvPrqq7zyyiucOHGCzz///KrXzJs3j5iYGF5++WXef/99unXrxocffkh4eHgdRV19Vcn71KlTzJw5kw4dOvD2228za9YsbrrpJjRNq6Ooa0ZVci+2du3aRpfv5Sqbe0pKCikpKdx333188MEHPP744xw+fJj//ve/dRh15ezevZuFCxdyxx13MHv2bAICApg5cyZpaWllnv/333/z0UcfMXDgQGbPnk3Xrl157733iIyMrOPIq6+yuR8/fpxevXoxbdo0ZsyYgZubGzNmzCAlJaWOI6+eyuZdLCEhgUWLFtG6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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "junkless_chain_copy[junkless_chain_copy.expiration == exp].pivot_table(\n", - " columns = 'right',\n", - " index = 'log_moneyness',\n", - " values = 'crr_vol_discrete',\n", - " aggfunc='mean'\n", - "). sort_index(ascending=False).round(3).plot(\n", - " title='CRR New Vol Discrete by Strike for 2027-06-17',\n", - " ylabel='Volatility',\n", - " xlabel='Strike Price'\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\n", - "['2025-08-15 00:00:00', '2025-08-22 00:00:00', '2025-08-29 00:00:00',\n", - " '2025-09-19 00:00:00', '2025-10-17 00:00:00', '2025-12-19 00:00:00',\n", - " '2026-01-16 00:00:00', '2026-02-20 00:00:00', '2026-03-20 00:00:00',\n", - " '2026-05-15 00:00:00', '2026-06-18 00:00:00', '2026-09-18 00:00:00',\n", - " '2026-12-18 00:00:00', '2027-01-15 00:00:00', '2027-06-17 00:00:00']\n", - "Length: 15, dtype: datetime64[ns]" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import statsmodels.api as sm\n", - "junkless_chain_copy['vega'] = greeks['vega']\n", - "junkless_chain_copy['rel_spread'] = (\n", - " np.abs(junkless_chain_copy['closeask'] - junkless_chain_copy['closebid'])\n", - ") / junkless_chain_copy['european_price_crr_vols']\n", - "junkless_chain_copy['weight'] = junkless_chain_copy['vega'] / (1+ junkless_chain_copy['rel_spread'])\n", - "re_aligned_chain= junkless_chain_copy.pivot_table(\n", - " index=['expiration', 'strike', 'valuation_date'],\n", - " columns='right',\n", - " values=['weight', 'european_price_crr_vols'],\n", - " aggfunc='sum' \n", - ").dropna().reset_index()\n", - "re_aligned_chain.columns = [x[0] if x[1] == '' else f\"{x[0]}_{x[1].lower()}\" for x in re_aligned_chain.columns]\n", - "re_aligned_chain['assigned_weight'] = re_aligned_chain.apply(\n", - " lambda x: np.min([x['weight_c'], x['weight_p']]),\n", - " axis = 1\n", - ")\n", - "re_aligned_chain['parity_price'] = re_aligned_chain['european_price_crr_vols_c'] - re_aligned_chain['european_price_crr_vols_p']\n", - "re_aligned_chain['root_x'] = re_aligned_chain['strike']\n", - "re_aligned_chain['root_y'] = re_aligned_chain['parity_price']\n", - "re_aligned_chain.expiration.unique()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
expirationimplied_fdiscountrate
02025-08-15508.6959100.9991210.010704
12025-08-22509.4553791.000070-0.000689
22025-08-29509.3452581.000002-0.000016
32025-09-19511.2440990.9990170.005526
42025-10-17513.4064910.9924580.029731
52025-12-19517.0572730.9856350.033878
62026-01-16520.5660680.9844010.031209
72026-02-20523.6529110.9819710.030344
82026-03-20523.6754350.9771890.034123
92026-05-15531.6432960.9967340.003943
102026-06-18530.7489630.9740240.028526
112026-09-18538.2504260.9800230.017180
122026-12-18543.1939150.9714100.020374
132027-01-15545.1943890.9678680.021768
142027-06-17553.4435360.9562000.023337
\n", - "
" - ], - "text/plain": [ - " expiration implied_f discount rate\n", - "0 2025-08-15 508.695910 0.999121 0.010704\n", - "1 2025-08-22 509.455379 1.000070 -0.000689\n", - "2 2025-08-29 509.345258 1.000002 -0.000016\n", - "3 2025-09-19 511.244099 0.999017 0.005526\n", - "4 2025-10-17 513.406491 0.992458 0.029731\n", - "5 2025-12-19 517.057273 0.985635 0.033878\n", - "6 2026-01-16 520.566068 0.984401 0.031209\n", - "7 2026-02-20 523.652911 0.981971 0.030344\n", - "8 2026-03-20 523.675435 0.977189 0.034123\n", - "9 2026-05-15 531.643296 0.996734 0.003943\n", - "10 2026-06-18 530.748963 0.974024 0.028526\n", - "11 2026-09-18 538.250426 0.980023 0.017180\n", - "12 2026-12-18 543.193915 0.971410 0.020374\n", - "13 2027-01-15 545.194389 0.967868 0.021768\n", - "14 2027-06-17 553.443536 0.956200 0.023337" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "\n", - "forward_discount_curve_v2 = pd.DataFrame(re_aligned_chain.groupby('expiration').apply(extract_df_forward_with_regression).to_dict()).T.reset_index(names='expiration')\n", - "forward_discount_curve_v2" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(49.806576402321085, 50.19342359767892)\n", - "(50.323101777059776, 49.676898222940224)\n", - "(50.0, 50.0)\n" - ] - } - ], - "source": [ - "\n", - "\n", - "## Percent P v Percent C\n", - "def percent_put_call(chain: pd.DataFrame) -> Tuple[float, float]:\n", - " \"\"\"\n", - " Calculates the percentage of put and call options in the chain.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " \n", - " Returns:\n", - " Tuple[float, float]: The percentage of put and call options.\n", - " \"\"\"\n", - " total_options = len(chain)\n", - " if total_options == 0:\n", - " return 0.0, 0.0\n", - " put_count = len(chain[chain['right'].str.lower() == 'p'])\n", - " call_count = len(chain[chain['right'].str.lower() == 'c'])\n", - " return (put_count / total_options) * 100, (call_count / total_options) * 100" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### COLLAPSE END" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "openbb_new_use", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.13" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/trade/optionlib/notebooks/ssvi_model_mod_prod_create.ipynb b/trade/optionlib/notebooks/ssvi_model_mod_prod_create.ipynb deleted file mode 100644 index 8176189..0000000 --- a/trade/optionlib/notebooks/ssvi_model_mod_prod_create.ipynb +++ /dev/null @@ -1,6977 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "from pydantic import BaseModel, field_validator, computed_field, validate_call\n", - "from pydantic.dataclasses import dataclass" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The autoreload extension is already loaded. To reload it, use:\n", - " %reload_ext autoreload\n" - ] - } - ], - "source": [ - "%load_ext autoreload\n", - "%autoreload 2\n", - "from dotenv import load_dotenv\n", - "load_dotenv()\n", - "from module_test.raw_code.optionlib_2.vol.implied_vol import (\n", - " bsm_vol_est_brute_force,\n", - " bsm_vol_est_minimization,\n", - " vector_vol_estimation\n", - ")\n", - "\n", - "from module_test.raw_code.optionlib_2.config.defaults import DAILY_BASIS\n", - "from module_test.raw_code.optionlib_2.assets.forward import (\n", - " EquityForward, \n", - " time_distance_helper,\n", - " vectorized_market_forward_calc\n", - ")\n", - "from datetime import datetime\n", - "from dbase.DataAPI.ThetaData import retrieve_chain_bulk\n", - "from trade.helpers.helper import change_to_last_busday, retrieve_timeseries\n", - "import os\n", - " \n", - "from module_test.raw_code.optionlib_2.vol.implied_vol import (\n", - " estimate_crr_implied_volatility,\n", - " vol_est_brute_force_bjs_2002,\n", - " vector_vol_estimation\n", - ")\n", - "from module_test.raw_code.optionlib_2.assets.forward import (\n", - " EquityForward, \n", - " time_distance_helper,\n", - " get_vectorized_dividend_rate,\n", - " get_vectorized_dividend_scehdule,\n", - " vectorized_discrete_pv\n", - ")\n", - "\n", - "from module_test.raw_code.optionlib_2.assets.dividend import (\n", - " vector_convert_to_time_frac\n", - ")\n", - "\n", - "from module_test.raw_code.optionlib_2.greeks.numerical.bjs2002 import (\n", - " bjs2002_numerical_greeks,\n", - ")\n", - "from module_test.raw_code.optionlib_2.greeks.numerical.black_scholes import vectorized_black_scholes_greeks\n", - "\n", - "from module_test.raw_code.optionlib_2.greeks.numerical.binomial import (\n", - " binomial_tree_greeks,\n", - ")\n", - "from datetime import datetime\n", - "from dbase.DataAPI.ThetaData import retrieve_chain_bulk\n", - "from trade.helpers.helper import change_to_last_busday, retrieve_timeseries\n", - "import os\n", - "import numpy as np\n", - "import pandas as pd\n", - "from trade.assets.rates import get_risk_free_rate_helper\n", - "from module_test.raw_code.optionlib_2.utils.batch_operation import vector_batch_processor\n", - "# os.environ['PROXY_URL'] = ''\n", - "from dbase.DataAPI.ThetaData import (\n", - " list_contracts,\n", - " retrieve_eod_ohlc,\n", - " retrieve_chain_bulk\n", - ")\n", - "from trade import PRICING_CONFIG, reload_pricing_config, get_pricing_config\n", - "from dataclasses import dataclass, field\n", - "from pydantic import BaseModel, Field, ConfigDict\n", - "from pydantic.dataclasses import dataclass\n", - "from abc import ABC, abstractmethod\n", - "from typing import List, Tuple, Literal\n", - "from scipy.interpolate import interp1d\n", - "from module_test.raw_code.optionlib_2.pricing.black_scholes import black_scholes_vectorized\n", - "from module_test.raw_code.optionlib_2.pricing.binomial import crr_binomial_pricing\n", - "from module_test.raw_code.optionlib_2.greeks.numerical.binomial import binomial_tree_price_batch\n", - "from trade.helpers.Logging import setup_logger\n", - "logger =setup_logger('SSVIModel', stream_log_level='INFO')\n", - "test_start, test_valuation_date = '2025-07-16', '2025-07-16'" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "reload_pricing_config()\n", - "PRICING_CONFIG= get_pricing_config()\n", - "# PRICING_CONFIG" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[get_engine] Creating engine for DB: securities_master, PID: 89841\n" - ] - } - ], - "source": [ - "ticks = ['AAPL', 'MSFT', 'GOOGL', 'AMZN', 'TSLA']\n", - "test_start, test_valuation_date = '2025-07-16', '2025-07-16'\n", - "def pick_random_option(tick, date):\n", - " contracts = list_contracts(tick, date)\n", - " # Pick a random contract from the list\n", - " contract = np.random.choice(contracts.index)\n", - " return contracts.iloc[contract]\n", - "\n", - "def get_option_eod_price(date, contract_series):\n", - " \"\"\"\n", - " Retrieves the end-of-day price for a given option contract on a specific date.\n", - " \n", - " Args:\n", - " date (datetime): The date for which to retrieve the price.\n", - " contract_series (pd.Series): The series containing option contract details.\n", - " \n", - " Returns:\n", - " float: The end-of-day price of the option contract.\n", - " \"\"\"\n", - " eod_data = retrieve_eod_ohlc(symbol=contract_series['root'],\n", - " end_date=date,\n", - " start_date=date,\n", - " exp=str(contract_series['expiration']),\n", - " right=contract_series['right'],\n", - " strike=contract_series['strike'],\n", - " )\n", - " return eod_data.Midpoint[0]\n", - "\n", - "def get_spot(tick, date, spot_type='close'):\n", - " return retrieve_timeseries(tick, date, date, spot_type=spot_type)['close'][0]\n", - "\n", - "def get_rates(date):\n", - " \"\"\"\n", - " Retrieves the risk-free rate for a given date.\n", - " \n", - " Args:\n", - " date (datetime): The date for which to retrieve the risk-free rate.\n", - " \n", - " Returns:\n", - " float: The risk-free rate for the specified date.\n", - " \"\"\"\n", - " date = pd.to_datetime(date).strftime('%Y-%m-%d')\n", - " return get_risk_free_rate_helper()['annualized'][date]\n", - "r = get_rates(test_valuation_date)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "def get_chain(tick, date):\n", - " spot = get_spot(tick, date, spot_type='chain_price')\n", - " date= change_to_last_busday(date)\n", - " chain=retrieve_chain_bulk(\n", - " tick,\n", - " 0, ## This is to get all expirations\n", - " date,\n", - " date,\n", - " '16:00'\n", - " )\n", - " chain['spot'] = spot\n", - " chain['valuation_date'] = date\n", - " chain['moneyness'] = chain['Strike'] / chain['spot']\n", - " chain['log_moneyness'] = np.log(chain['moneyness'])\n", - " chain['T']= chain['Expiration'].apply(\n", - " lambda x: time_distance_helper(\n", - " x,\n", - " date,\n", - " ))\n", - " chain['T'] = chain['T'].astype(float)\n", - " chain['DTE']= chain['T'] * DAILY_BASIS\n", - "\n", - " return chain\n" - ] - }, - { - "cell_type": "raw", - "metadata": { - "vscode": { - "languageId": "raw" - } - }, - "source": [ - "##Rawed out\n", - "chains= {}\n", - "for tick in ticks:\n", - " chains[tick] = get_chain(tick, test_valuation_date)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "def format_chain(chain: pd.DataFrame) -> pd.DataFrame:\n", - " \"\"\"\n", - " Formats the option chain DataFrame by renaming columns and converting types.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame to format.\n", - " \n", - " Returns:\n", - " pd.DataFrame: The formatted option chain DataFrame.\n", - " \"\"\"\n", - " chain.columns = chain.columns.str.lower() \n", - " chain['right'] = chain['right'].str.lower()\n", - " return chain\n", - "\n" - ] - }, - { - "cell_type": "raw", - "metadata": { - "vscode": { - "languageId": "raw" - } - }, - "source": [ - "for tick in chains:\n", - " chains[tick] = format_chain(chains[tick])" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "def confine_chain_with_pricing_config(chain:pd.DataFrame) -> pd.DataFrame:\n", - " \"\"\"\n", - " Confines the chain to the pricing configuration limits.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " expected columns: ['dte', 'moneyness']\n", - " \n", - " Returns:\n", - " pd.DataFrame: The confined option chain.\n", - " \"\"\"\n", - " conf = get_pricing_config()\n", - " return chain[\n", - " (chain['dte'] >= conf['VOL_SURFACE_MIN_DTE_THRESHOLD']) &\n", - " (chain['dte'] <= conf['VOL_SURFACE_MAX_DTE_THRESHOLD']) &\n", - " (chain['moneyness'] >= conf['VOL_SURFACE_MIN_MONEYNESS_THRESHOLD']) &\n", - " (chain['moneyness'] <= conf['VOL_SURFACE_MAX_MONEYNESS_THRESHOLD'])\n", - " ]\n", - " \n" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "\n", - "def get_forward_price_on_chain(chain:pd.DataFrame,\n", - " valuation_date:str,\n", - " r:float,\n", - " div_type:str='discrete') -> pd.DataFrame:\n", - " \"\"\"\n", - " Calculates the forward price for a given option chain.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " valuation_date (str): The date of valuation.\n", - " end_date (str): The expiration date of the option.\n", - " r (float): The risk-free rate.\n", - " div_type (str): Type of dividend ('discrete' or 'continuous').\n", - " \n", - " Returns:\n", - " float: The calculated forward price.\n", - " \"\"\"\n", - "\n", - " ## This is per-ticker function. There must be only one ticker, one spot price\n", - " assert len(chain['root'].unique()) == 1, \"Chain must contain options from only one ticker.\"\n", - " assert len(chain['spot'].unique()) == 1, \"Chain must contain a single spot price.\"\n", - " assert len(chain['valuation_date'].unique()) == 1, \"Chain must contain a single valuation date.\"\n", - " assert div_type in ['discrete', 'continuous'], \"div_type must be either 'discrete' or 'continuous'.\"\n", - "\n", - " ## For speed, we will use unique items, and merge back later\n", - " chain = chain.copy()\n", - " end_dates = chain['expiration'].unique()\n", - " valuation_dates= [valuation_date] * len(end_dates)\n", - " S = [chain['spot'].tolist()[0]] * len(end_dates)\n", - " tickers= [chain['root'].iloc[0]] * len(end_dates)\n", - " r = [get_rates(valuation_date)] * len(end_dates)\n", - "\n", - " ## This function returns similar things based on div_type\n", - " ## 1. If div_type is 'discrete', it returns the forward price, (dividend schedule & present value of dividends (It's sum of dividends))\n", - " ## 2. If div_type is 'continuous', it returns the forward price, (dividend rate & present value of dividend rate)\n", - " f, (actual, pv) = vectorized_market_forward_calc(\n", - " ticks=tickers,\n", - " S=S,\n", - " valuation_dates=valuation_dates,\n", - " end_dates=end_dates,\n", - " r=r,\n", - " div_type=div_type,\n", - " return_div = True)\n", - " \n", - " ## Create a series for merging\n", - " f = pd.Series(f, index=end_dates, name='f')\n", - " pv = pd.Series(pv, index=end_dates, name='div_pv')\n", - "\n", - " if div_type == 'discrete':\n", - " actual = vector_convert_to_time_frac(\n", - " actual,\n", - " valuation_dates=[valuation_date] * len(actual),\n", - " end_dates=end_dates,\n", - " )\n", - " \n", - "\n", - "\n", - " ## Merge back to chain\n", - " actual = pd.Series(actual, index=end_dates, name='div_schedule')\n", - " chain = chain.merge(actual, left_on='expiration', right_index=True, how='left')\n", - " chain = chain.merge(f, left_on='expiration', right_index=True, how='left')\n", - " chain = chain.merge(pv, left_on='expiration', right_index=True, how='left')\n", - "\n", - " ## Calculate moneyness and log moneyness based on forward price\n", - " chain['f_moneyness'] = chain['f'] / chain['spot']\n", - " chain['f_log_moneyness'] = np.log(chain['f_moneyness'])\n", - "\n", - " return chain\n", - "\n", - "\n" - ] - }, - { - "cell_type": "raw", - "metadata": { - "vscode": { - "languageId": "raw" - } - }, - "source": [ - "for tick in chains:\n", - " print(f\"Calculating forward price for {tick} on {test_valuation_date}\")\n", - " chains[tick] = get_forward_price_on_chain(\n", - " chains[tick],\n", - " test_valuation_date,\n", - " get_rates(test_valuation_date),\n", - " div_type='discrete'\n", - " )\n", - " print(f\"Done for {tick} on {test_valuation_date}\")" - ] - }, - { - "cell_type": "raw", - "metadata": { - "vscode": { - "languageId": "raw" - } - }, - "source": [ - "def get_dividend_schedule_on_chain(\n", - " chain:pd.DataFrame,\n", - " valuation_date:str\n", - ") -> list:\n", - " \"\"\"\n", - " Retrieves the dividend schedule for a given option chain.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " valuation_date (str): The date of valuation.\n", - " \n", - " Returns:\n", - " list: The dividend schedule for the option chain.\n", - " \"\"\"\n", - " sch= get_vectorized_dividend_scehdule(\n", - " tickers=[chain['root'].iloc[0]] * len(chain),\n", - " valuation_dates=[valuation_date] * len(chain),\n", - " end_dates=chain['expiration'].tolist(),\n", - " start_dates=[valuation_date] * len(chain),\n", - " )\n", - "\n", - " return vector_convert_to_time_frac(\n", - " sch,\n", - " valuation_dates=[valuation_date] * len(chain),\n", - " end_dates=chain['expiration'].tolist(),\n", - " )\n", - "for tick in chains:\n", - " print(f\"Calculating dividend schedule for {tick} on {test_valuation_date}\")\n", - " chains[tick]['div_schedule'] = get_dividend_schedule_on_chain(\n", - " chains[tick],\n", - " test_valuation_date\n", - " )\n", - " print(f\"Done for {tick} on {test_valuation_date}\")" - ] - }, - { - "cell_type": "raw", - "metadata": { - "vscode": { - "languageId": "raw" - } - }, - "source": [ - "for tick in chains:\n", - " chains[tick]=format_chain(chains[tick])" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "def get_bs_vol_on_chain(\n", - " chain:pd.DataFrame,\n", - " valuation_date:str,\n", - " rate_col_name:str=None,\n", - " forward_col_name:str='f',\n", - " mid_col_name:str='midpoint'\n", - ") -> pd.Series:\n", - " \"\"\"\n", - " Estimates the Black-Scholes implied volatility for a given option chain.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " Expected Columns: `f`, `strike`, `t`, `midpoint`, `right`. \n", - " valuation_date (str): The date of valuation.\n", - " \n", - " Returns:\n", - " pd.Series: The estimated Black-Scholes implied volatility for the option chain.\n", - " \"\"\"\n", - " if rate_col_name is None:\n", - " _r = [get_rates(valuation_date)] * len(chain)\n", - " else:\n", - " _r = chain[rate_col_name]\n", - " \n", - " params = list(zip(\n", - " chain[forward_col_name if forward_col_name in chain.columns else 'f'], \n", - " chain['strike'], \n", - " chain['t'],\n", - " _r, \n", - " chain[mid_col_name if mid_col_name in chain.columns else 'midpoint'], \n", - " chain['right'].str.lower()\n", - " ))\n", - "\n", - " return vector_batch_processor(\n", - " vector_vol_estimation,\n", - " bsm_vol_est_brute_force,\n", - " params,\n", - "\n", - " )\n", - "\n", - "\n" - ] - }, - { - "cell_type": "raw", - "metadata": { - "vscode": { - "languageId": "raw" - } - }, - "source": [ - "for tick in chains:\n", - " print(f\"Calculating BS vol for {tick} on {test_valuation_date}\")\n", - " chains[tick]['bs_vol'] = get_bs_vol_on_chain(\n", - " chains[tick],\n", - " test_valuation_date\n", - " )\n", - " print(f\"Done for {tick} on {test_valuation_date}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 153, - "metadata": {}, - "outputs": [], - "source": [ - "def get_discrete_crr_vol_on_chain(\n", - " chain:pd.DataFrame,\n", - " valuation_date:str,\n", - " rates_col_name:str=None,\n", - " div_type:str='discrete',\n", - " N:int=250\n", - ") -> pd.Series:\n", - " \"\"\"\n", - " Estimates the discrete CRR implied volatility for a given option chain.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " Expected Columns: `spot`, `strike`, `t`, `midpoint`, `div_schedule`, `right`.\n", - " valuation_date (str): The date of valuation.\n", - " \n", - " Returns:\n", - " pd.Series: The estimated discrete CRR implied volatility for the option chain.\n", - " \"\"\"\n", - " ## Get risk-free rates\n", - " if rates_col_name is None:\n", - " _r = [get_rates(valuation_date)] * len(chain)\n", - " else:\n", - " _r = chain[rates_col_name].tolist()\n", - "\n", - " ## Pick div based on div_type\n", - " if div_type not in ['discrete', 'continuous']:\n", - " raise ValueError(\"div_type must be either 'discrete' or 'continuous'.\")\n", - " elif div_type == 'continuous':\n", - " divs = chain['div_pv'].tolist()\n", - " else:\n", - " divs = chain['div_schedule'].tolist()\n", - "\n", - " crr_vector_params_discrete = list(zip(\n", - " chain['spot'], chain['strike'].tolist(), ## Spot, Strike\n", - " chain['t'], _r, ## Time to Maturity, Risk Free Rate\n", - " chain['midpoint'], ## Midpoint Price\n", - " divs, ## Dividends based on div_type\n", - " chain['right'].str.lower().tolist(), ## Option Type\n", - " [N] * len(chain), ## Number of Steps\n", - " [div_type] * len(chain), ## Dividend Type\n", - " [True] * len(chain),)) ## American==True, European==False\n", - " \n", - "\n", - " return vector_batch_processor(\n", - " vector_vol_estimation,\n", - " estimate_crr_implied_volatility,\n", - " crr_vector_params_discrete\n", - " )\n" - ] - }, - { - "cell_type": "raw", - "metadata": { - "vscode": { - "languageId": "raw" - } - }, - "source": [ - "for tick in chains:\n", - " print(f\"Calculating discrete CRR vol for {tick} on {test_valuation_date}\")\n", - " chains[tick]['crr_vol_discrete'] = get_discrete_crr_vol_on_chain(\n", - " chains[tick],\n", - " test_valuation_date\n", - " )\n", - " print(f\"Done for {tick} on {test_valuation_date}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "def intrinsic_value(\n", - " strike: float,\n", - " spot: float,\n", - " right: Literal['c', 'p']\n", - ") -> float:\n", - " \"\"\"\n", - " Calculate the intrinsic value of an option.\n", - " \n", - " Args:\n", - " strike (float): The strike price of the option.\n", - " spot (float): The current spot price of the underlying asset.\n", - " right (Literal['c', 'p']): The type of option ('c' for call, 'p' for put).\n", - " \n", - " Returns:\n", - " float: The intrinsic value of the option.\n", - " \"\"\"\n", - " if right.lower() == 'c':\n", - " return max(0, spot - strike)\n", - " elif right.lower() == 'p':\n", - " return max(0, strike - spot)\n", - " else:\n", - " raise ValueError(f\"Invalid option type: {right}. Expected 'c' or 'p'.\")\n", - " \n", - " \n", - "\n", - "def vector_eu_boundary(\n", - " f: np.ndarray,\n", - " strike: np.ndarray,\n", - " t: np.ndarray,\n", - " r: np.ndarray,\n", - " right: np.ndarray,\n", - "\n", - ") -> np.ndarray:\n", - " \"\"\"\n", - " Calculate the European option boundary values.\n", - " \n", - " Args:\n", - " f (np.ndarray): Forward prices.\n", - " strike (np.ndarray): Strike prices.\n", - " t (np.ndarray): Time to maturity.\n", - " r (np.ndarray): Risk-free rates.\n", - " right (np.ndarray): Option types ('c' for call, 'p' for put).\n", - " \n", - " Returns:\n", - " np.ndarray: The boundary values of the European options.\n", - " \"\"\"\n", - " f = np.asarray(f)\n", - " strike = np.asarray(strike)\n", - " t = np.asarray(t)\n", - " r = np.asarray(r)\n", - " right = np.asarray(right)\n", - " if f.shape != strike.shape or f.shape != t.shape or f.shape != r.shape or f.shape != right.shape:\n", - " raise ValueError(\"All input arrays must have the same shape.\")\n", - "\n", - " intrinsic_values = np.zeros_like(f)\n", - " call = right == 'c'\n", - " put = right == 'p'\n", - " intrinsic_values[call] = np.maximum(0, f[call] - strike[call])\n", - " intrinsic_values[put] = np.maximum(0, strike[put] - f[put])\n", - " boundary = intrinsic_values * np.exp(-r * t)\n", - " # boundary = np.zeros_like(f)\n", - " # boundary[call] = np.maximum(0, f[call] - pv_k[call])\n", - " # boundary[put] = np.maximum(0, pv_k[put] - f[put])\n", - " return boundary" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Chain Prep Checklist" - ] - }, - { - "cell_type": "code", - "execution_count": 482, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "class ChainChecklist:\n", - " \"\"\"\n", - " A class to perform various checks and transformations on option chain data.\n", - " This class includes methods to prepare the chain, remove junk quotes, and more.\n", - " \"\"\"\n", - "\n", - "\n", - " @staticmethod\n", - " def chain_prep(chain:pd.DataFrame) -> pd.DataFrame:\n", - " \"\"\"\n", - " Prepares the option chain DataFrame for further processing.\n", - " Runs through various transformations.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " \n", - " Returns:\n", - " pd.DataFrame: The prepared option chain DataFrame.\n", - " \"\"\"\n", - " pass\n", - "\n", - "\n", - "\n", - " @staticmethod\n", - " def remove_junk_quotes(chain:pd.DataFrame) -> pd.DataFrame:\n", - " \"\"\"\n", - " Removes junk quotes from the option chain DataFrame.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " \n", - " Returns:\n", - " pd.DataFrame: The cleaned option chain DataFrame.\n", - " \"\"\"\n", - " \n", - " chain = chain.copy()\n", - "\n", - " ## Format chain\n", - " chain = format_chain(chain)\n", - " logger.info(f\"Initial chain length: {len(chain)}\")\n", - " ## Drop midpoint < intrinsic value\n", - " chain['intrinsic_value'] = chain.apply(\n", - " lambda x: intrinsic_value(\n", - " x['strike'], \n", - " x['f'], ## Use Forward Price for intrinsic value instead of spot price\n", - " x['right']\n", - " ), axis=1)\n", - "\n", - " ## Drop below European lower bound\n", - " chain['eu_lower_bound'] = vector_eu_boundary(\n", - " chain['f'].tolist(),\n", - " chain['strike'].tolist(),\n", - " chain['t'].tolist(),\n", - " [get_rates(chain['valuation_date'].iloc[0].strftime('%Y-%m-%d'))] * len(chain),\n", - " chain['right'].str.lower().tolist()\n", - " )\n", - " \n", - " ## American Options cannot be worth less than max(intrinsic value, european lower bound, 0)\n", - " ## Less than intrinsic value: Exercise\n", - " ## Less than european lower bound: Arbitrage Violation\n", - " chain['lower_bound'] = chain.apply(lambda x: max( \n", - " x['intrinsic_value'],\n", - " x['eu_lower_bound'],\n", - " 0), axis=1)\n", - " \n", - " ## Upper Bound is Spot for Call, Strike for Put\n", - " chain['upper_bound'] = chain.apply(lambda x: x['spot'] if x['right'] == 'c' else x['strike'], axis=1)\n", - " chain = chain[chain['midpoint'] >= chain['lower_bound']]\n", - " chain = chain[chain['midpoint'] <= chain['upper_bound']]\n", - " logger.info(f\"Chain length after removing junk quotes: {len(chain)}\")\n", - "\n", - " ## Confine chain with pricing config\n", - " chain = confine_chain_with_pricing_config(chain)\n", - " logger.info(f\"Chain length after confining with pricing config: {len(chain)}\")\n", - "\n", - " return chain\n", - " \n", - " @staticmethod\n", - " def get_european_price(\n", - " chain:pd.DataFrame,\n", - " bs_vol: np.ndarray,\n", - " forward_col_name: str = 'f',\n", - " rates_col_name: str = None\n", - " ) -> pd.Series:\n", - " \"\"\"\n", - " Calculates the European price for the options in the chain.\n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " Returns:\n", - " pd.Series: The European price for each option in the chain.\n", - " \"\"\"\n", - " if rates_col_name is None:\n", - " _r = [get_rates(chain['valuation_date'].iloc[0].strftime('%Y-%m-%d'))] * len(chain)\n", - " else:\n", - " _r = chain[rates_col_name].tolist()\n", - "\n", - " \n", - " chain = chain.copy()\n", - " val_date = chain['valuation_date'].iloc[0].strftime('%Y-%m-%d')\n", - " european_price_params = [\n", - " chain[forward_col_name if forward_col_name in chain.columns else 'f'].tolist(),\n", - " chain['strike'].tolist(),\n", - " chain['t'].tolist(),\n", - " _r, # Risk-free rate\n", - " bs_vol,\n", - " chain['right'].str.lower().tolist(),\n", - " ]\n", - "\n", - "\n", - " european_midpoint = black_scholes_vectorized(*european_price_params)\n", - " return pd.Series(european_midpoint, index=chain.index)\n", - " \n", - " @staticmethod\n", - " def get_american_price(chain: pd.DataFrame,\n", - " sigmas: np.ndarray,\n", - " rates_col_name: str = None,\n", - " N: int = 500) -> pd.Series:\n", - " \"\"\"\n", - " Calculates the American price for the options in the chain using a binomial tree.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " N (int): The number of steps in the binomial tree.\n", - " \n", - " Returns:\n", - " pd.Series: The American price for each option in the chain.\n", - " \"\"\"\n", - " chain = chain.copy()\n", - " val_date = chain['valuation_date'].iloc[0].strftime('%Y-%m-%d')\n", - " if rates_col_name is None:\n", - " _r = [get_rates(val_date)] * len(chain)\n", - " else:\n", - " _r = chain[rates_col_name].tolist()\n", - " crr_params = [\n", - " chain['strike'].tolist(),\n", - " chain['expiration'].tolist(),\n", - " sigmas,\n", - " _r, # Risk-free rate\n", - " [N] * len(chain), # Number of steps\n", - " chain['spot'].tolist(),\n", - " ['discrete'] * len(chain), # Dividend type\n", - " chain['div_schedule'].tolist(), # Dividend schedules\n", - " chain['right'].str.lower().tolist(),\n", - " chain['valuation_date'].tolist(), # Start dates\n", - " chain['valuation_date'].tolist(), # Valuation dates\n", - " [True] * len(chain), # American options\n", - " ]\n", - "\n", - " def batch_hacked(*args):\n", - " \"\"\"\n", - " A batch processor to handle the CRR binomial pricing.\n", - " \"\"\"\n", - " return binomial_tree_price_batch(*args)[0]\n", - " \n", - " american_midpoint = vector_batch_processor(\n", - " batch_hacked,\n", - " *crr_params\n", - " )\n", - " chain['american_midpoint'] = american_midpoint\n", - " return pd.Series(american_midpoint, index=chain.index)\n", - "\n", - " @staticmethod\n", - " def run_calc_task(chain: pd.DataFrame, \n", - " seed_vol: List[float],\n", - " N: int = 500,\n", - " forward_col_name: str = 'f',\n", - " rates_col_name: str = None\n", - " ) -> pd.DataFrame:\n", - " \"\"\"\n", - " Calculates the European equivalent prices for the options in the chain.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " N (int): The number of steps in the binomial tree.\n", - " \n", - " Returns:\n", - " pd.DataFrame: The option chain DataFrame with European equivalent prices.\n", - " \"\"\"\n", - " chain = chain.copy()\n", - " mid = chain['midpoint'].to_numpy()\n", - "\n", - " ## Using bs_vol as seed because it is backed out of the midpoint\n", - " # seed_vol = list(chain['bs_vol'].to_numpy())\n", - "\n", - " ## Using Midpoint as initial European price because seed_vol is backed out of it\n", - " p_eu_init = ChainChecklist.get_european_price(chain=chain, \n", - " bs_vol=seed_vol,\n", - " forward_col_name=forward_col_name,\n", - " rates_col_name=rates_col_name)\n", - "\n", - " ## Calculate American prices using CRR Binomial model and Seed Vol\n", - " p_am = ChainChecklist.get_american_price(chain=chain, \n", - " sigmas=seed_vol, \n", - " N=N,\n", - " rates_col_name=rates_col_name)\n", - "\n", - " ## Calculate Early Exercise Premium (EEP) and European Equivalent Price\n", - " EEP = np.array(p_am - p_eu_init)\n", - " euro_eq_mid = list(mid - EEP)\n", - "\n", - " ## Calculate European equivalent volatilities\n", - " sigmas = ChainChecklist.get_bs_vol_on_chain(\n", - " chain,\n", - " chain['valuation_date'].iloc[0].strftime('%Y-%m-%d'),\n", - " euro_eq_mid,\n", - " rate_col_name=rates_col_name,\n", - " forward_col_name=forward_col_name\n", - " )\n", - "\n", - " chain['european_midpoint'] = p_eu_init\n", - " chain['european_vols_equiv'] = sigmas\n", - " chain['american_midpoint'] = p_am\n", - " chain['early_exercise_premium'] = EEP\n", - " chain['european_equivalent_mid'] = euro_eq_mid\n", - " return chain\n", - " \n", - " @staticmethod\n", - " def calculate_european_equivalent_vols(chain: pd.DataFrame, \n", - " N: int = 500, \n", - " iteration: int = 4,\n", - " seed_vol_col:str = None,\n", - " forward_col_name: str = 'f',\n", - " rates_col_name: str = None, \n", - " valuation_date: str|datetime = None\n", - " ) -> pd.DataFrame:\n", - " \"\"\"\n", - " Iterates the run_calc_task to refine the European equivalent prices and volatilities.\n", - " \"\"\"\n", - "\n", - " def _name_not_include_error(col_name: str, columns: pd.Index) -> bool:\n", - " if col_name not in columns:\n", - " raise ValueError(f\"{col_name} not found in chain columns: {columns.tolist()}\")\n", - " return False\n", - "\n", - " ## Valuation date validation\n", - " if valuation_date is None:\n", - " try:\n", - " valuation_date = pd.to_datetime(chain['valuation_date'].iloc[0])\n", - " except Exception as e:\n", - " raise ValueError(\"valuation_date must be provided if chain does not contain 'valuation_date' column.\") from e\n", - " else:\n", - " valuation_date = pd.to_datetime(valuation_date)\n", - "\n", - " if rates_col_name is None:\n", - " rates_col_name = 'risk_free_rate' \n", - " \n", - " ## Rates column validation\n", - " if rates_col_name not in chain.columns:\n", - " if rates_col_name != 'risk_free_rate':\n", - " print(f\"Warning: {rates_col_name} not found in chain columns. Defaulting to 'risk_free_rate'.\")\n", - " rates_col_name = 'risk_free_rate'\n", - " chain[rates_col_name] = get_rates(valuation_date.strftime('%Y-%m-%d'))\n", - "\n", - "\n", - " ## Seed Vol column validation\n", - " if seed_vol_col is None:\n", - " seed_vol_col = 'bs_vol'\n", - " chain[seed_vol_col] = get_bs_vol_on_chain(\n", - " chain=chain,\n", - " valuation_date=chain['valuation_date'].iloc[0].strftime('%Y-%m-%d'),\n", - " mid_col_name='midpoint',\n", - " rate_col_name=rates_col_name,\n", - " forward_col_name=forward_col_name\n", - " )\n", - " \n", - " ## Seed vol column validation P2\n", - " elif seed_vol_col not in chain.columns:\n", - " _name_not_include_error(seed_vol_col, chain.columns)\n", - " \n", - " ## Forward column validation\n", - " _name_not_include_error(forward_col_name, chain.columns) \n", - "\n", - "\n", - " ## Begin process\n", - " seed_vol = list(chain[seed_vol_col].to_numpy())\n", - " for i in range(iteration):\n", - " print(f\"Iteration {i+1} of {iteration}\")\n", - " chain = ChainChecklist.run_calc_task(chain,\n", - " seed_vol, \n", - " N, \n", - " forward_col_name=forward_col_name,\n", - " rates_col_name=rates_col_name)\n", - "\n", - " if i == iteration - 1:\n", - " break ## Last iteration, no need to reset variables\n", - " \n", - " ## Reset Variables for rerun\n", - " seed_vol = list(chain['european_vols_equiv'].to_numpy())\n", - " return chain\n", - "\n", - " \n", - " @staticmethod\n", - " def get_bs_vol_on_chain(\n", - " chain: pd.DataFrame,\n", - " valuation_date: str,\n", - " midpoints: pd.Series,\n", - " rate_col_name: str = None,\n", - " forward_col_name: str = 'f'\n", - " ) -> pd.Series:\n", - " \"\"\"\n", - " Estimates the Black-Scholes implied volatility for a given option chain.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " Expected Columns: `f`, `strike`, `t`, `midpoint`, `right`. \n", - " valuation_date (str): The date of valuation.\n", - " \n", - " Returns:\n", - " pd.Series: The estimated Black-Scholes implied volatility for the option chain.\n", - " \"\"\"\n", - " if rate_col_name is None:\n", - " _r = [get_rates(valuation_date)] * len(chain) \n", - "\n", - " else:\n", - " _r = chain[rate_col_name]\n", - " params = list(zip(\n", - " chain[forward_col_name if forward_col_name in chain.columns else 'f'], \n", - " chain['strike'], \n", - " chain['t'],\n", - " _r,\n", - " midpoints, \n", - " chain['right'].str.lower()\n", - " ))\n", - " return vector_batch_processor(\n", - " vector_vol_estimation,\n", - " bsm_vol_est_brute_force,\n", - " params,\n", - " )\n", - "\n", - "# for tick, chain in chains.items():\n", - "# print(f\"Size before removing junk quotes in {tick}: {chain.shape[0]}\")\n", - "# chains[tick] = ChainChecklist.remove_junk_quotes(chain)\n", - "# print(f\"Size after removing junk quotes: {chains[tick].shape[0]}\")\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "def get_expected_column(col, \n", - " chain:pd.DataFrame,\n", - " valuation_date:str=None,\n", - " div_type:str='discrete'):\n", - " \"\"\"\n", - " Retrieves the expected column value for a given option chain.\n", - " Args:\n", - "\n", - " col (str): The column to retrieve ('f', 't', 'div_schedule', 'spot').\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " valuation_date (str): The date of valuation.\n", - " div_type (str): Type of dividend ('discrete' or 'continuous').\n", - " Returns:\n", - " float or pd.Series: The expected value for the specified column.\n", - " \"\"\"\n", - " if col == 'f':\n", - " return get_forward_price_on_chain(\n", - " chain,\n", - " valuation_date,\n", - " get_rates(valuation_date),\n", - " div_type=div_type\n", - " )\n", - " elif col == 't':\n", - " return chain['expiration'].apply(\n", - " lambda x: time_distance_helper(\n", - " x,\n", - " valuation_date,\n", - " )\n", - " ).astype(float)\n", - " elif col == 'div_schedule':\n", - " return get_dividend_schedule_on_chain(\n", - " chain,\n", - " valuation_date\n", - " )\n", - " elif col == 'spot':\n", - " return get_spot(chain['root'].iloc[0], valuation_date)\n", - " \n", - "\n", - "\n", - "def validate_chain_columns(\n", - " chain: pd.DataFrame,\n", - " valuation_date: str,\n", - " required_columns: list = None,\n", - " expected_columns: list = None,\n", - " div_type: str = 'discrete') -> pd.DataFrame :\n", - " \"\"\"\n", - " Validates that the required columns are present in the chain DataFrame.\n", - " Raises ValueError if any required column is missing.\n", - " \"\"\"\n", - " # Ensure chain is formatted\n", - " chain=format_chain(chain)\n", - " chain=confine_chain_with_pricing_config(chain)\n", - " chain['valuation_date'] = valuation_date \n", - " \n", - " # Define required columns based on the model\n", - " if required_columns is None:\n", - " required_columns = ['expiration', 'strike', 'right', 'midpoint', 'f', 'spot']\n", - "\n", - " ## Check for required columns\n", - " for col in required_columns:\n", - " if col not in chain.columns.str.lower():\n", - " raise ValueError(f\"Missing required column: {col} in chain DataFrame\")\n", - " \n", - " # Check for optional columns and fill them if missing\n", - " if expected_columns is None:\n", - " expected_columns = ['t']\n", - " for col in expected_columns:\n", - " if col not in chain.columns.str.lower():\n", - " # If the column is missing, we will fill it with default values\n", - " if col=='spot': assert 'root' in chain.columns.str.lower(), \\\n", - " \"Missing 'root' column in chain DataFrame for spot price retrieval\"\n", - " logger.warning(f\"Column {col} is missing in the chain DataFrame. Filling with default values.\")\n", - " chain[col] = get_expected_column(col,\n", - " chain=chain,\n", - " valuation_date=valuation_date,\n", - " div_type=div_type)\n", - "\n", - " \n", - " chain.columns = chain.columns.str.lower() # Normalize column names to lowercase\n", - " chain['moneyness']= chain['strike'] / chain['spot']\n", - " chain['log_moneyness'] = np.log(chain['moneyness'])\n", - " chain['fwd_moneyness']= chain['f'] / chain['strike']\n", - " chain['dte'] = chain['t'] * DAILY_BASIS # Convert T to DTE\n", - " call_chain = chain[chain['right'].str.lower() == 'c'].copy()\n", - " put_chain = chain[chain['right'].str.lower() == 'p'].copy()\n", - " return call_chain, put_chain, chain\n", - " \n", - "\n", - "\n", - "def calculate_vol(\n", - " chain: pd.DataFrame,\n", - " valuation_date: str,\n", - " N: int = 250,\n", - " model: str = 'binomial',\n", - "):\n", - " \n", - " if 'vol' not in chain.columns.str.lower():\n", - " logger.info(\"Calculating implied volatility for the option chain. Model is set to '%s'.\", model)\n", - " if model == 'bs':\n", - " # Use Black-Scholes model for volatility estimation\n", - " chain['vol'] = get_bs_vol_on_chain(chain, valuation_date)\n", - "\n", - " elif model == 'binomial':\n", - " # Use Binomial model for volatility estimation\n", - " chain['vol'] = get_discrete_crr_vol_on_chain(chain, valuation_date, N=N)\n", - " return chain\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## SSVI " - ] - }, - { - "cell_type": "code", - "execution_count": 330, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "from typing import List, Tuple, Callable\n", - "import math\n", - "from trade.helpers.pools import runProcesses\n", - "\n", - "# -------------------------------------------------\n", - "# 1. Black-Scholes Call price (no SciPy need)\n", - "# -------------------------------------------------\n", - "def normal_cdf(x): # Φ(x)\n", - " return 0.5 * (1.0 + math.erf(x / math.sqrt(2)))\n", - "\n", - "def bs_call_price(spot, strike, maturity, rate, vol):\n", - " \"\"\"Black-Scholes European call.\"\"\"\n", - " if vol <= 0 or maturity <= 0:\n", - " return max(0.0, spot - strike)\n", - " d1 = (math.log(spot / strike) + (rate + 0.5 * vol**2) * maturity) / (vol * math.sqrt(maturity))\n", - " d2 = d1 - vol * math.sqrt(maturity)\n", - " return (spot * normal_cdf(d1) -\n", - " strike * math.exp(-rate * maturity) * normal_cdf(d2))\n", - "\n", - "# -------------------------------------------------\n", - "# 2. SSVI helpers\n", - "# -------------------------------------------------\n", - "def atm_total_variance(t, var0, var_inf, kappa):\n", - " \"\"\"\n", - " θ(t) = ((var0 - var_inf)*(1 - e^{-κ t})/(κ t) + var_inf) * t\n", - " \"\"\"\n", - " return ((var0 - var_inf) * (1 - np.exp(-kappa * t))\n", - " / (kappa * t) + var_inf) * t\n", - "\n", - "def skew_phi(theta_t, eta, lam):\n", - " return eta * theta_t ** lam\n", - "\n", - "def ssvi_total_variance(log_moneyness, theta_t, eta, lam, rho):\n", - " phi_val = skew_phi(theta_t, eta, lam)\n", - " term1 = rho * phi_val * log_moneyness\n", - " term2 = np.sqrt((phi_val * log_moneyness + rho)**2 + 1 - rho**2)\n", - " return 0.5 * theta_t * (1 + term1 + term2)\n", - "\n", - "def ssvi_implied_vol(fwd, strike, maturity,\n", - " var0, var_inf, kappa,\n", - " eta, lam, rho):\n", - " \"\"\"Return σ implied by SSVI.\"\"\"\n", - " k = np.log(strike / fwd) # log-moneyness\n", - " theta_t = atm_total_variance(maturity, var0, var_inf, kappa)\n", - " total_var = ssvi_total_variance(k, theta_t, eta, lam, rho)\n", - " return np.sqrt(total_var / maturity)\n", - "\n", - "def make_candidate(bounds: List[Tuple[float, float]], iterations) -> np.ndarray:\n", - " \"\"\"\n", - " Generate a random candidate solution within the given bounds.\n", - " bounds: list of (low, high) for each dimension\n", - " \"\"\"\n", - " rng = np.random.default_rng(42)\n", - " low = np.array([b[0] for b in bounds])\n", - " high = np.array([b[1] for b in bounds])\n", - "\n", - " # (iterations, d) matrix of uniform random samples\n", - " candidates = low + (high - low) * rng.random((iterations, len(bounds)))\n", - " return candidates\n", - "\n", - "\n", - "def random_search_vec(objective_multi: Callable[[np.ndarray], np.ndarray],\n", - " bounds: List[Tuple[float, float]],\n", - " iterations: int = 40_000) -> Tuple[np.ndarray, float]:\n", - " \"\"\"\n", - " Vectorised random search.\n", - " objective_multi: accepts an (N, d) array -> returns (N,) array of losses\n", - " bounds : list of (low, high) for each dimension\n", - " iterations : how many random draws\n", - " \"\"\"\n", - "\n", - " # vectorised loss evaluation -> (iterations,)\n", - " candidates = make_candidate(bounds, iterations)\n", - " _losses = objective_multi(candidates)\n", - " best_idx = np.argmin(_losses)\n", - " return candidates[best_idx], _losses[best_idx]\n", - "\n", - "\n", - "def atm_loss_multi(X, t, iv_atm):\n", - " \"\"\"\n", - " X : (N, 3) – rows = [var0, var_inf, kappa]\n", - " t, iv_atm – market ATM maturities and vols (1-D)\n", - " returns – loss for each row (shape (N,))\n", - " \"\"\"\n", - " var0, var_inf, kappa = X[:, 0], X[:, 1], X[:, 2]\n", - " theta_t = atm_total_variance(t[:, None], var0, var_inf, kappa) # broadcast\n", - " model_iv = np.sqrt(theta_t / t[:, None])\n", - " mse = ((model_iv - iv_atm[:, None])**2).mean(axis=0) # → (N,)\n", - "\n", - " # guard against NaN / huge vols\n", - " invalid = (np.isinf(mse)) | (np.isnan(mse))\n", - " mse = np.where(invalid, 1e4, mse) # penalise\n", - " return mse\n", - "\n", - "def surface_loss_multi(params_mat, K_grid, T_grid, fwd,\n", - " var0_hat, var_inf_hat, kappa_hat,\n", - " market_iv, weights=None):\n", - " \"\"\"\n", - " params_mat : (N,3) rows [eta, lambda, rho]\n", - " returns : (N,) weighted MSE per candidate\n", - " \"\"\"\n", - " eta, lam, rho = params_mat.T\n", - " M = K_grid.shape[0]\n", - "\n", - " # normalize weights -> (M,)\n", - " if weights is None:\n", - " weights = np.ones(M, dtype=float)\n", - " else:\n", - " weights = np.asarray(weights, dtype=float)\n", - " if weights.ndim != 1 or weights.shape[0] != M:\n", - " raise ValueError(f\"weights must be shape ({M},), got {weights.shape}\")\n", - "\n", - " bad = (eta <= 0) | (lam <= -0.9) | (lam >= 1.0) | (np.abs(rho) >= 0.999)\n", - " safe_eta = np.where(bad, 1.0, eta)\n", - " safe_lam = np.where(bad, 0.0, lam)\n", - " safe_rho = np.where(bad, 0.0, rho)\n", - "\n", - " k = np.log(K_grid / fwd)[:, None] # (M,1)\n", - " T = T_grid[:, None] # (M,1)\n", - " theta = atm_total_variance(T, var0_hat, var_inf_hat, kappa_hat)\n", - "\n", - " total_var = ssvi_total_variance(\n", - " k, theta, safe_eta[None, :], safe_lam[None, :], safe_rho[None, :]\n", - " ) # (M,N)\n", - "\n", - " iv_model = np.sqrt(total_var / T) # (M,N)\n", - " invalid = (~np.isfinite(iv_model)) | (iv_model > 5)\n", - " iv_model = np.where(invalid, 1e4, iv_model)\n", - "\n", - " sqerr = (iv_model - market_iv[:, None]) ** 2 # (M,N)\n", - "\n", - " # ✅ weighted mean over M → shape (N,)\n", - " wmse = np.average(sqerr, axis=0, weights=weights)\n", - "\n", - " # slam bad candidates\n", - " wmse = np.where(bad, 1e9, wmse)\n", - " return wmse\n", - "\n", - "\n", - "\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 324, - "metadata": {}, - "outputs": [], - "source": [ - "def _loss_chunk_with_idx(idx,\n", - " params_chunk,\n", - " K_grid, T_grid, fwd,\n", - " var0_hat, var_inf_hat, kappa_hat,\n", - " market_iv):\n", - " # Call your original function on a chunk\n", - " mse = surface_loss_multi(params_chunk,\n", - " K_grid, T_grid, fwd,\n", - " var0_hat, var_inf_hat, kappa_hat,\n", - " market_iv)\n", - " return idx, mse # keep index so we can reassemble in order\n", - "\n", - "\n", - "def surface_loss_multi_parallel(params_mat,\n", - " K_grid, T_grid, fwd,\n", - " var0_hat, var_inf_hat, kappa_hat,\n", - " market_iv,\n", - " *,\n", - " chunk_size=1024,\n", - " run_type='imap'):\n", - " \"\"\"\n", - " Parallel wrapper around surface_loss_multi using runProcesses.\n", - " params_mat: (N,3) -> returns (N,)\n", - " No globals; constants are passed to each worker.\n", - " \"\"\"\n", - " N = int(params_mat.shape[0])\n", - " if N == 0:\n", - " return np.empty((0,), dtype=float)\n", - "\n", - " # 1) Make chunks\n", - " chunks = [params_mat[i:min(i+chunk_size, N)] \n", - " for i in range(0, N, chunk_size)]\n", - " idxs = list(range(len(chunks)))\n", - " n = len(chunks)\n", - "\n", - " # 2) Build OrderedInputs for your runProcesses(func, [args1, args2, ...])\n", - " OrderedInputs = [\n", - " idxs,\n", - " chunks,\n", - " [K_grid] * n,\n", - " [T_grid] * n,\n", - " [fwd] * n,\n", - " [var0_hat] * n,\n", - " [var_inf_hat] * n,\n", - " [kappa_hat] * n,\n", - " [market_iv] * n,\n", - " ]\n", - "\n", - " # 3) Fan out\n", - " results = runProcesses(_loss_chunk_with_idx, OrderedInputs, run_type=run_type)\n", - "\n", - " # 4) Materialize depending on run_type\n", - " if run_type == 'amap': # async ordered\n", - " results = results.get()\n", - " elif run_type in ('imap', 'uimap'): # iterator / unordered\n", - " results = list(results)\n", - "\n", - " # 5) Reassemble in original order of rows\n", - " results.sort(key=lambda x: x[0]) # by chunk index\n", - " mse_chunks = [m for _, m in results]\n", - " return np.concatenate(mse_chunks, axis=0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 228, - "metadata": {}, - "outputs": [], - "source": [ - "atm_iv ={}\n", - "atm_T={}\n", - "\n", - "\n", - "def get_atm_vol(chain: pd.DataFrame,\n", - " log_moneyness_col_name: str='log_moneyness',\n", - " vol_col_name: str='crr_vol_discrete') -> pd.Series:\n", - " \"\"\"\n", - " Finds the ATM volatility for a given expiration in the chain.\n", - " Args:\n", - " x (pd.DataFrame): The option chain DataFrame for a specific expiration.\n", - " Returns:\n", - " float: The ATM volatility for the given expiration.\n", - " \"\"\"\n", - " def finder(x):\n", - " min_l_m= abs(x[log_moneyness_col_name]).min()\n", - " return x[x[log_moneyness_col_name].abs() == min_l_m][vol_col_name].values[0]\n", - " return chain.groupby('expiration').apply(finder).values\n", - "\n", - "def get_atm_T(chain: pd.DataFrame,\n", - " log_moneyness_col_name: str='log_moneyness',\n", - " t_col_name: str='t') -> pd.Series:\n", - " \"\"\"\n", - " Finds the ATM time to expiration for a given expiration in the chain.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame for a specific expiration.\n", - " \n", - " Returns:\n", - " pd.Series: The ATM time to expiration for the given expiration.\n", - " \"\"\"\n", - " def finder(x):\n", - " min_l_m= abs(x[log_moneyness_col_name]).min()\n", - " return x[x[log_moneyness_col_name].abs() == min_l_m][t_col_name].values[0]\n", - " return chain.groupby('expiration').apply(finder).values\n" - ] - }, - { - "cell_type": "raw", - "metadata": { - "vscode": { - "languageId": "raw" - } - }, - "source": [ - "for tick in chains:\n", - " print(f\"Calculating ATM T and vol for {tick} on {test_valuation_date}\")\n", - " atm_iv[tick] = get_atm_vol(chains[tick])\n", - " atm_T[tick] = get_atm_T(chains[tick])\n", - " print(f\"Done for {tick} on {test_valuation_date}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "params={}\n", - "def get_best_params(T_atm: List[float],\n", - " iv_atm: List[float]) -> Tuple[np.ndarray, float]:\n", - " \"\"\"\n", - " Find the best parameters for the ATM term structure.\n", - " Returns:\n", - " var0_hat, var_inf_hat, kappa_hat\n", - " \"\"\"\n", - " bounds = [(1e-4, 0.2), # var0: Min ATM Variance across DTE\n", - " (1e-4, 0.2), # var_inf_hat: Max ATM Variance across DTE\n", - " (0.05, 3.0)] # kappa: Speed from var0 to var_inf_hat\n", - " best_params, best_loss = random_search_vec(\n", - " lambda X: atm_loss_multi(X, T_atm, iv_atm),\n", - " bounds,\n", - " iterations=3000\n", - " )\n", - " return best_params, best_loss\n", - "\n", - "\n", - "# best_params, best_loss = get_best_params()\n", - "# var0_hat, var_inf_hat, kappa_hat = best_params\n", - "# print(\"best\", best_params, \"loss\", best_loss)\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "# for tick in chains:\n", - "# print(f\"Calculating best params for {tick} on {test_valuation_date}\")\n", - "# (var0_hat, var_inf_hat, kappa_hat), atm_loss = get_best_params(\n", - "# atm_T[tick],\n", - "# atm_iv[tick]\n", - "# )\n", - "# params[tick] = {\n", - "# 'var0_hat': var0_hat,\n", - "# 'var_inf_hat': var_inf_hat,\n", - "# 'kappa_hat': kappa_hat,\n", - "# 'atm_loss': atm_loss\n", - "# }\n", - "\n", - "# print(f\"Done for {tick} on {test_valuation_date}\")\n", - "# params" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "k_grid = {}\n", - "t_grid = {}\n", - "market_iv_grid= {}\n", - "fwd_grid= {}\n", - "\n", - "def get_K_grid(chain:pd.DataFrame) -> np.ndarray:\n", - " \"\"\"\n", - " Retrieves the strike prices from the option chain.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " \n", - " Returns:\n", - " np.ndarray: The strike prices for the option chain.\n", - " \"\"\"\n", - " return chain['strike'].values\n", - "\n", - "def get_T_grid(chain:pd.DataFrame) -> np.ndarray:\n", - " \"\"\"\n", - " Retrieves the maturities from the option chain.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " \n", - " Returns:\n", - " np.ndarray: The maturities for the option chain.\n", - " \"\"\"\n", - " return chain['t'].values\n", - "\n", - "def get_market_iv_grid(chain:pd.DataFrame) -> np.ndarray:\n", - " \"\"\"\n", - " Retrieves the market implied volatilities from the option chain.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " \n", - " Returns:\n", - " np.ndarray: The market implied volatilities for the option chain.\n", - " \"\"\"\n", - " return chain['vol'].values\n", - "\n", - "def get_fwd_grid(chain:pd.DataFrame) -> float:\n", - " \"\"\"\n", - " Retrieves the forward price from the option chain.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " \n", - " Returns:\n", - " float: The forward price for the option chain.\n", - " \"\"\"\n", - " return chain['f'].iloc[0] # Assuming F is constant across the chains\n", - "\n", - "\n", - "# for tick in refined_chains:\n", - "# print(f\"Calculating K, T, market IV and F for {tick} on {test_valuation_date}\")\n", - "# k_grid[tick] = get_K_grid(refined_chains[tick])\n", - "# t_grid[tick] = get_T_grid(refined_chains[tick])\n", - "# market_iv_grid[tick] = get_market_iv_grid(refined_chains[tick])\n", - "# fwd_grid[tick] = get_fwd_grid(refined_chains[tick])\n", - "# print(f\"Done for {tick} on {test_valuation_date}\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "def get_surface_params(\n", - " k_grid: np.ndarray,\n", - " t_grid: np.ndarray,\n", - " fwd_grid: float,\n", - " var0_hat: float,\n", - " var_inf_hat: float,\n", - " kappa_hat: float,\n", - " market_iv_grid: np.ndarray,\n", - " iterations: int = 50_000,\n", - " chunk_size: int = None\n", - ") -> Tuple[float, float, float, float]:\n", - " \"\"\"\n", - " Estimate the SSVI surface parameters (eta, lambda, rho) using random search.\n", - " Args:\n", - " k_grid (np.ndarray): The strike prices.\n", - " t_grid (np.ndarray): The maturities.\n", - " fwd_grid (float): The forward price.\n", - " var0_hat (float): Estimated initial variance.\n", - " var_inf_hat (float): Estimated long-term variance.\n", - " kappa_hat (float): Estimated speed of mean reversion.\n", - " market_iv_grid (np.ndarray): Market implied volatilities.\n", - " iterations (int): Number of random search iterations.\n", - " chunk_size (int): Size of chunks for parallel processing.\n", - " Returns:\n", - " Tuple[float, float, float, float]: Estimated parameters (eta, lambda, rho) and best loss.\n", - " \"\"\"\n", - " if chunk_size is None:\n", - " chunk_size = int(iterations / 8)\n", - "\n", - " # 1️⃣ tighter parameter bounds\n", - " surf_bounds = [(0.05, 1.5), # eta\n", - " (-0.8, 0.8), # lambda\n", - " (-0.95, 0.95)] # rho\n", - "\n", - "\n", - " surface_lamba = lambda X: surface_loss_multi_parallel(X, K_grid=k_grid, \n", - " T_grid=t_grid,\n", - " fwd=fwd_grid,\n", - " var0_hat=var0_hat,\n", - " var_inf_hat=var_inf_hat,\n", - " kappa_hat=kappa_hat,\n", - " market_iv=market_iv_grid,\n", - " chunk_size=chunk_size)\n", - " (eta_hat, lambda_hat, rho_hat), best_loss = random_search_vec(surface_lamba,\n", - " surf_bounds, \n", - " iterations)\n", - "\n", - " return eta_hat, lambda_hat, rho_hat, best_loss\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "# for tick in refined_chains:\n", - "# print(f\"Calculating surface params for {tick} on {test_valuation_date}\")\n", - "# eta_hat, lambda_hat, rho_hat, best_loss = get_surface_params(\n", - "# k_grid[tick],\n", - "# t_grid[tick],\n", - "# fwd_grid[tick],\n", - "# params[tick]['var0_hat'],\n", - "# params[tick]['var_inf_hat'],\n", - "# params[tick]['kappa_hat'],\n", - "# market_iv_grid[tick]\n", - "# )\n", - "# params[tick].update({\n", - "# 'eta_hat': eta_hat,\n", - "# 'lambda_hat': lambda_hat,\n", - "# 'rho_hat': rho_hat,\n", - "# 'surface_loss': best_loss\n", - "# })\n", - "# print(f\"Done for {tick} on {test_valuation_date}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "def calculate_normalized_rmse_loss(\n", - " market_iv: np.ndarray,\n", - " model_iv: np.ndarray,\n", - " moneyness: np.ndarray,\n", - ") -> Tuple[float, float, float]:\n", - " \n", - " \"\"\"\n", - " Calculate the normalized loss between market and model implied volatilities.\n", - " \n", - " Args:\n", - " market_iv (np.ndarray): Market implied volatilities.\n", - " model_iv (np.ndarray): Model implied volatilities.\n", - " moneyness (np.ndarray): Moneyness values.\n", - " \n", - " Returns:\n", - " Tuple[float, float, float]: Normalized median loss, right wing loss, left wing loss.\n", - " \"\"\"\n", - " \n", - " ## Normalized Median\n", - " median_iv = np.median(market_iv)\n", - " normalized_median_loss = np.sqrt(np.mean((market_iv - model_iv)**2)) / median_iv\n", - "\n", - " ## Right Wing Loss (> 1.0)\n", - " right_wing_mask = moneyness > 1.0\n", - " median_right_wing_iv = np.median(market_iv[right_wing_mask])\n", - " right_wing_loss = np.sqrt(np.mean(\n", - " (market_iv[right_wing_mask] - model_iv[right_wing_mask]) **2)) / median_right_wing_iv\n", - "\n", - " ## Left Wing Loss (< 1.0)\n", - " left_wing_mask = moneyness < 1.0\n", - " median_left_wing_iv = np.median(market_iv[left_wing_mask])\n", - " left_wing_loss = np.sqrt(np.mean(\n", - " (market_iv[left_wing_mask] - model_iv[left_wing_mask])**2)) / median_left_wing_iv\n", - "\n", - " return normalized_median_loss, right_wing_loss, left_wing_loss\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "def calculate_normalized_mae_loss(\n", - " market_iv: np.ndarray,\n", - " model_iv: np.ndarray,\n", - " moneyness: np.ndarray\n", - ") -> Tuple[float, float, float]:\n", - " \"\"\"\n", - " Calculate the normalized mean absolute error (MAE) loss between market and model implied volatilities.\n", - " \n", - " Args:\n", - " market_iv (np.ndarray): Market implied volatilities.\n", - " model_iv (np.ndarray): Model implied volatilities.\n", - " moneyness (np.ndarray): Moneyness values.\n", - " \n", - " Returns:\n", - " Tuple[float, float, float]: Normalized median MAE loss, right wing MAE loss, left wing MAE loss.\n", - " \"\"\"\n", - " \n", - " ## Normalized Median\n", - " median_iv = np.median(market_iv)\n", - " normalized_median_mae_loss = np.mean(np.abs(market_iv - model_iv)) / median_iv\n", - "\n", - " ## Right Wing Loss (> 1.0)\n", - " right_wing_mask = moneyness > 1.0\n", - " median_right_wing_iv = np.median(market_iv[right_wing_mask])\n", - " right_wing_mae_loss = np.mean(\n", - " np.abs(market_iv[right_wing_mask] - model_iv[right_wing_mask])) / median_right_wing_iv\n", - "\n", - " ## Left Wing Loss (< 1.0)\n", - " left_wing_mask = moneyness < 1.0\n", - " median_left_wing_iv = np.median(market_iv[left_wing_mask])\n", - " left_wing_mae_loss = np.mean(\n", - " np.abs(market_iv[left_wing_mask] - model_iv[left_wing_mask])) / median_left_wing_iv\n", - "\n", - " return normalized_median_mae_loss, right_wing_mae_loss, left_wing_mae_loss" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.2464065708418891" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "## DATE UTILS\n", - "\n", - "from dbase.DataAPI.ThetaData import (\n", - " extract_numeric_value)\n", - "from datetime import date, datetime\n", - "\n", - "\n", - "def identify_length_for_model(string, integer) -> int:\n", - " \"\"\"\n", - " \n", - " Identify the length of the timeframe in minutes based on the string and integer provided.\n", - " Parameters\n", - " \n", - " ----------\n", - " string : str\n", - " The string representing the timeframe (e.g., 'm', 'd', 'w', 'y').\n", - " integer : int\n", - " The integer representing the number of units for the timeframe.\n", - " Returns\n", - " -------\n", - " int\n", - " The length of the timeframe in minutes.\n", - " \n", - " \"\"\"\n", - "\n", - " TIMEFRAMES_VALUES = {'d': 1, 'w': 7, 'm': 30, 'y': DAILY_BASIS}\n", - " assert string in TIMEFRAMES_VALUES.keys(\n", - " ), f'Available timeframes are {TIMEFRAMES_VALUES.keys()}, recieved \"{string}\"'\n", - " return integer * TIMEFRAMES_VALUES[string]\n", - "\n", - "def convert_date_to_time_to_maturity(dt: str,\n", - " valuation_date: str = None) -> float:\n", - " \"\"\"\n", - " Converts a date to time to maturity in years.\n", - " \n", - " Args:\n", - " dt (datetime): The date to convert.\n", - " example: '3m', '2025-08-08', 1\n", - " \n", - " Returns:\n", - " float: Time to maturity in years.\n", - " \"\"\"\n", - "\n", - " ## If dt is a string, check if it is a date or a duration\n", - " if isinstance(dt, (str, pd.Timestamp, datetime, date)):\n", - " try:\n", - " # Try to parse as a date first\n", - " dt = pd.to_datetime(dt)\n", - " assert valuation_date is not None, \"valuation_date must be provided if dt is a date string\"\n", - " valuation_date = pd.to_datetime(valuation_date)\n", - " dt = (dt - valuation_date).days\n", - " except ValueError:\n", - " # If it fails, assume it's a duration\n", - " dt = identify_length_for_model(*extract_numeric_value(dt))\n", - " if dt is None:\n", - " raise ValueError(f\"Invalid date or duration format: {dt}\")\n", - " elif isinstance(dt, (float,int)):\n", - " # If dt is a number, assume it's a duration in days\n", - " dt = float(dt)\n", - " elif isinstance(dt, pd.Timedelta):\n", - " # If dt is a timedelta, convert it to days\n", - " dt = dt.days\n", - "\n", - " else:\n", - " raise ValueError(f\"Unsupported type for dt: {type(dt)}. Expected str, int, float, datetime, or pd.Timedelta.\")\n", - "\n", - " assert_dt_within_range(dt)\n", - " return dt/DAILY_BASIS\n", - "\n", - "def assert_dt_within_range(dt: float):\n", - " \"\"\"\n", - " Asserts that the time to maturity is within the range defined by PRICING_CONFIG.\n", - " \n", - " Args:\n", - " dt (float): The time to maturity in years.\n", - " \n", - " Raises:\n", - " ValueError: If dt is not within the configured range.\n", - " \"\"\"\n", - " if not (PRICING_CONFIG['VOL_SURFACE_MIN_DTE_THRESHOLD'] <= dt <= PRICING_CONFIG['VOL_SURFACE_MAX_DTE_THRESHOLD']):\n", - " raise ValueError(f\"Time to maturity {dt} is out of bounds. \"\n", - " f\"Must be between {PRICING_CONFIG['VOL_SURFACE_MIN_DTE_THRESHOLD']} and {PRICING_CONFIG['VOL_SURFACE_MAX_DTE_THRESHOLD']}.\")\n", - "\n", - "convert_date_to_time_to_maturity('3m')" - ] - }, - { - "cell_type": "code", - "execution_count": 428, - "metadata": {}, - "outputs": [], - "source": [ - "## Strike Convert Utils\n", - "\n", - "def assert_k_bounds_model_range(k: list | np.ndarray,\n", - " f: float | np.ndarray) -> None:\n", - " \"\"\"\n", - " Asserts that the strikes are within the bounds defined by PRICING_CONFIG.\n", - " Args:\n", - " k (list or np.ndarray): List of strikes.\n", - " Raises:\n", - " ValueError: If any strike is not within the configured bounds.\n", - " \"\"\"\n", - " conf = get_pricing_config()\n", - " k = np.array(k, dtype=float)\n", - " if not np.all((k <= f * (conf['VOL_SURFACE_MAX_MONEYNESS_THRESHOLD'])) &\n", - " (k >= f * (conf['VOL_SURFACE_MIN_MONEYNESS_THRESHOLD']))):\n", - " raise ValueError(f\"Strikes {k} are out of bounds. \"\n", - " f\"Must be between {f * (conf['VOL_SURFACE_MIN_MONEYNESS_THRESHOLD'])} and {f * (conf['VOL_SURFACE_MAX_MONEYNESS_THRESHOLD'])}.\")\n", - "\n", - "def handle_strikes(\n", - " k: list| np.ndarray,\n", - " f: list| float, \n", - " strike_type: Literal['p', 'k', 'pf', 'f'],\n", - " spot: float = None\n", - ") -> np.ndarray:\n", - " \"\"\"\n", - " Convert strikes based on the specified strike type.\n", - " Since SSVI model takes strikes values as absolute values, this function converts the strikes\n", - " \n", - " Args:\n", - " k (list or np.ndarray): List of strikes.\n", - " f (list or float): Forward price.\n", - " strike_type (str): Type of strike ('p', 'k', 'pf', 'f').\n", - " \n", - " Types available:\n", - " - 'p': Percent of spot eg: 1.0 == ATM\n", - " - 'k': Strike to fwd_grid: if spot = 100, k=100=ATM\n", - " - 'pf': Percent of fwd_grid/forward price eg: 1.0 == ATMF\n", - " - 'f': Log moneyness to fwd_grid: 0.0 == ATMF\n", - " \n", - " Returns:\n", - " np.ndarray: Converted strikes.\n", - " \"\"\"\n", - " k = np.array(k, dtype=float)\n", - " if strike_type == 'p': ## Percent of spot to fwd_grid\n", - " if spot is None:\n", - " raise ValueError(\"Spot price must be provided for 'p' strike type.\")\n", - " \n", - " strikes= k * spot\n", - " elif strike_type == 'k': ## Strike to fwd_grid\n", - " strikes= k\n", - " elif strike_type == 'pf': ## Percent of fwd_grid/forward price\n", - " strikes= k * f\n", - " elif strike_type == 'f': ## Log moneyness to fwd_grid\n", - " ## Convert log moneyness to strikes\n", - " strikes= np.exp(k) * f\n", - "\n", - " else:\n", - " raise ValueError(f\"Invalid strike type: {strike_type}\")\n", - " assert_k_bounds_model_range(strikes, f)\n", - " return strikes\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Model Classes\n", - "\n", - "- `SSVIModelParams`: Parameters dataclass\n", - "- `BaseSSVIModel`: ABC class for SSVI Model\n", - "- `SSVIModel`: The model that expects simple inputs, and calibrates accordingly\n", - "- `MarketSSVIModel (EODMarketSSVIModel, IntraMarketSSVIModel)`: Market aware class respnsible for initiating necessary items (Differentiating btwn EOD & Intra might be unnecessary)\n", - "- `ChainInputModel`: Responsible for creating the chain and populating with respective columns\n", - "- `MarketChainInputModel`: Market aware that feeds to ChainInputModel\n", - "- `ChainOutput`: dataclass holding the chain and respective information\n", - "- `SSVI_GlobalConfig`: Class holding information useful for ssvi. Eg when predicting vol, to predict on Put chain, Call chain or OTM chain" - ] - }, - { - "cell_type": "code", - "execution_count": 446, - "metadata": {}, - "outputs": [], - "source": [ - "from dataclasses import dataclass, field\n", - "from pydantic import BaseModel, Field, ConfigDict, PrivateAttr, model_validator\n", - "from pydantic.dataclasses import dataclass\n", - "from abc import ABC, abstractmethod\n", - "from typing import List, Optional, Literal\n", - "from scipy.interpolate import interp1d\n", - "from trade.helpers.Logging import setup_logger\n", - "import pandas as pd\n", - "from enum import Enum, auto\n", - "from concurrent.futures import ThreadPoolExecutor" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Global Config" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from dataclasses import dataclass as stdlib_dataclass, field as stdlib_field\n", - "from typing import ClassVar, Final\n", - "GLOBAL_CONFIG = None\n", - "\n", - "class VolSide(str, Enum):\n", - " CALL = 'call'\n", - " PUT = 'put'\n", - " OTM = 'otm'\n", - "\n", - "class VolType(str, Enum):\n", - " BS = 'bs'\n", - " BINOMIAL = 'binomial'\n", - "\n", - "class DivType(str, Enum):\n", - " DISCRETE = 'discrete'\n", - " CONTINUOUS = 'continuous'\n", - "\n", - "\n", - "@stdlib_dataclass\n", - "class SSVIGlobalConfig:\n", - " \"\"\"\n", - " Singleton class for global configuration of the SSVI model.\n", - " There will only be one instance of this class. Whether you create a new instance or use the instance() method,\n", - " you will always get the same object.\n", - "\n", - " Intention is to provide a centralized configuration for the SSVI model that can be easily accessed and modified.\n", - " \"\"\"\n", - " __SINGLETON__: ClassVar[bool] = True\n", - " _CREATED: ClassVar[Optional[\"SSVIGlobalConfig\"]] = None\n", - " _initialized: ClassVar[bool] = False\n", - " \"\"\"\n", - " Global configuration for SSVI model.\n", - " Attributes:\n", - " vol_side (VolSide): Which side of the volatility surface to model ('call', 'put', 'otm').\n", - " div_type (DivType): Type of dividends to consider ('discrete', 'continuous').\n", - " vol_type (VolType): Type of volatility to use for calibration ('bs', 'binomial').\n", - " N (int): Number of steps for binomial model.\n", - " iteration (int): Number of iterations for refining European equivalent volatilities.\n", - " \"\"\"\n", - " vol_side: VolSide = stdlib_field(default=VolSide.OTM)\n", - " div_type: DivType = stdlib_field(default=DivType.DISCRETE)\n", - " vol_type: VolType = stdlib_field(default=VolType.BINOMIAL)\n", - " N: int = stdlib_field(default=250)\n", - " iteration: int = stdlib_field(default=2)\n", - " chunk_size: int = stdlib_field(default=5000)\n", - " model_iterations: int = stdlib_field(default=50_000)\n", - "\n", - " def __new__(cls, *args, **kwargs):\n", - " if cls.__SINGLETON__ and cls._CREATED is not None:\n", - " return cls._CREATED\n", - " instance = super().__new__(cls)\n", - " cls._CREATED = instance\n", - " return instance\n", - "\n", - " def __init__(self):\n", - " if self._initialized:\n", - " return\n", - " self._initialized = True\n", - "\n", - " @classmethod\n", - " def instance(cls):\n", - " if cls._CREATED is None:\n", - " cls._CREATED = cls()\n", - " return cls._CREATED\n", - "\n", - " @classmethod\n", - " def reset(cls):\n", - " cls._CREATED = None\n", - "\n", - " def __setattr__(self, name, value):\n", - " ## Ensure enum values are valid\n", - " enum_names = {\n", - " 'vol_side': VolSide,\n", - " 'div_type': DivType,\n", - " 'vol_type': VolType, \n", - " }\n", - " if name in enum_names:\n", - " if isinstance(value, str):\n", - " try:\n", - " value = enum_names[name](value)\n", - " except ValueError:\n", - " raise ValueError(f\"Invalid value '{value}' for {name}. Allowed values are: {[e.value for e in enum_names[name]]}\")\n", - " elif not isinstance(value, enum_names[name]):\n", - " raise ValueError(f\"{name} must be an instance of {enum_names[name]}\")\n", - " super().__setattr__(name, value)\n", - "\n", - "def set_global_config(config: SSVIGlobalConfig):\n", - " if not isinstance(config, SSVIGlobalConfig):\n", - " raise ValueError(\"Config must be an instance of SSVIGlobalConfig\")\n", - "\n", - " global GLOBAL_CONFIG\n", - " GLOBAL_CONFIG = config\n", - "\n", - "def get_global_config() -> SSVIGlobalConfig:\n", - " global GLOBAL_CONFIG\n", - " if GLOBAL_CONFIG is None:\n", - " GLOBAL_CONFIG = SSVIGlobalConfig() # Default configuration\n", - " return GLOBAL_CONFIG\n", - "\n", - "GLOBAL_CONFIG = get_global_config()" - ] - }, - { - "cell_type": "code", - "execution_count": 371, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "10\n" - ] - } - ], - "source": [ - "GLOBAL_CONFIG.N = 1\n", - "v1 =SSVIGlobalConfig()\n", - "v2 =SSVIGlobalConfig()\n", - "v1.N = 10\n", - "print(v2.N)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### ChainInputModel" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "class ChainInputModel(ABC):\n", - " \"\"\"\n", - " Abstract base class for option chain input models.\n", - " \"\"\"\n", - " @abstractmethod\n", - " def validate(self):\n", - " pass\n", - "\n", - " @abstractmethod\n", - " def get_chain(self) -> pd.DataFrame:\n", - " pass\n", - "\n", - " @abstractmethod\n", - " def build_chain(self) -> pd.DataFrame:\n", - " pass\n", - "\n", - "\n", - "@dataclass(config=ConfigDict(arbitrary_types_allowed=True))\n", - "class ChainOutput:\n", - " \"\"\"\n", - " Dataclass to hold the output of the chain processing.\n", - " \"\"\"\n", - " root: Optional[str] = Field(default=None, description=\"Root symbol of the underlying asset\")\n", - " chain: pd.DataFrame = Field(default_factory=pd.DataFrame, description=\"Processed option chain DataFrame\")\n", - " spot: float = Field(..., description=\"Spot price of the underlying asset\")\n", - " div_type: DivType = Field(default=GLOBAL_CONFIG.div_type, description=\"Type of dividends considered\")\n", - " vol_type: VolType = Field(default=GLOBAL_CONFIG.vol_type, description=\"Type of volatility used for calibration\")\n", - " pv_div_col: str = Field(default=None, description=\"Column name for present value of dividends if applicable\")\n", - " div_schedule_col: str = Field(default=None, description=\"Column name for dividend schedule if applicable\")\n", - " fwd_col_name: str = Field(default=None, description=\"Column name for forward prices if applicable\")\n", - " rate_col: str = Field(default=None, description=\"Column name for interest rates if applicable\")\n", - " vol_col: str = Field(default='vol', description=\"Column name for implied volatilities\")\n", - " t_col: str = Field(default='t', description=\"Column name for time to maturity\")\n", - " strike_col: str = Field(default='strike', description=\"Column name for strike prices\")\n", - " f_log_m_col: str = Field(default='f_log_moneyness', description=\"Column name for log moneyness\")\n", - " fwd_m_col: str = Field(default='f_moneyness', description=\"Column name for forward moneyness\")\n", - " right_col: str = Field(default='right', description=\"Column name for option rights (call/put)\")\n", - " midpoint_col: str = Field(default='midpoint', description=\"Column name for option midpoints\")\n", - " valuation_date: str = Field(..., description=\"Valuation date for the option chain\")\n", - "\n", - " def __post_init__(self):\n", - " self.validate()\n", - "\n", - " def validate(self):\n", - " \"\"\"\n", - " Validates the chain DataFrame to ensure all required columns are present.\n", - " Raises ValueError if any required column is missing.\n", - " \"\"\"\n", - " if self.chain.empty:\n", - " raise ValueError(\"Chain DataFrame cannot be empty\")\n", - " required_columns = [\n", - " self.strike_col,\n", - " self.right_col,\n", - " self.midpoint_col,\n", - " self.pv_div_col,\n", - " self.div_schedule_col,\n", - " self.rate_col,\n", - " 'expiration',\n", - " self.vol_col,\n", - " self.t_col,\n", - " self.fwd_col_name,\n", - "\n", - " ]\n", - "\n", - " for col in required_columns:\n", - " if col not in self.chain.columns:\n", - " raise ValueError(f\"Missing required column: {col}\")\n", - " \n", - " # Lightweight accessors (views of chain; no extra storage)\n", - " @property\n", - " def vol(self) -> pd.Series:\n", - " return self.chain[self.vol_col]\n", - "\n", - " @property\n", - " def t(self) -> pd.Series:\n", - " return self.chain[self.t_col]\n", - "\n", - " @property\n", - " def strike(self) -> pd.Series:\n", - " return self.chain[self.strike_col]\n", - "\n", - " @property\n", - " def right(self) -> pd.Series:\n", - " return self.chain[self.right_col]\n", - "\n", - " @property\n", - " def midpoint(self) -> pd.Series:\n", - " return self.chain[self.midpoint_col]\n", - "\n", - " @property\n", - " def fwd(self) -> Optional[pd.Series]:\n", - " return None if self.fwd_col_name is None else self.chain[self.fwd_col_name]\n", - "\n", - " @property\n", - " def rates(self) -> Optional[pd.Series]:\n", - " return None if self.rate_col is None else self.chain[self.rate_col]\n", - " \n", - " def __repr__(self):\n", - " return f\"\"\n", - "\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "GLOBAL_CONFIG.div_type = DivType.CONTINUOUS" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##Creating chain process\n", - "run_date = '2025-05-15'\n", - "symbol = 'AAPL'\n", - "def _load_chain(symbol: str, run_date: str) -> ChainOutput:\n", - " \"\"\"\n", - " Load and process the option chain for a given symbol and run date.\n", - " Args:\n", - " symbol (str): The underlying asset symbol.\n", - " run_date (str): The valuation date in 'YYYY-MM-DD' format.\n", - " Returns:\n", - " ChainInputModel: Processed option chain model.\n", - " \"\"\"\n", - " chain = get_chain(symbol, run_date)\n", - " chain = format_chain(chain)\n", - "\n", - " ## Will not do for now\n", - " logger.info(f\"Initial chain size: {chain.shape[0]}\")\n", - "\n", - " ## Get Rates for use\n", - " r = get_rates(run_date)\n", - " chain['risk_free_rate'] = r\n", - " logger.info(f\"Risk-free rate on {run_date}: {r}\")\n", - "\n", - " ## load forward price on chain\n", - " chain = get_forward_price_on_chain(\n", - " chain=chain,\n", - " valuation_date=run_date,\n", - " r=r,\n", - " div_type=GLOBAL_CONFIG.div_type\n", - " )\n", - " logger.info(\"After F load: %s\", chain.shape[0])\n", - "\n", - "\n", - " ## Checklist\n", - " chain = ChainChecklist.remove_junk_quotes(chain)\n", - " logger.info(\"After junk removal: %s\", chain.shape[0])\n", - "\n", - " ## Get Vol on chain\n", - " logger.info(f\"Calculating vols using {GLOBAL_CONFIG.vol_type} model\")\n", - " if GLOBAL_CONFIG.vol_type == VolType.BS:\n", - " ## NOTE: Consider switching to ChainChecklist.calculate_european_equiv_vol\n", - " vol = get_bs_vol_on_chain(\n", - " chain,\n", - " run_date,\n", - " rate_col_name='risk_free_rate',\n", - " forward_col_name='f',\n", - " mid_col_name='midpoint',\n", - " )\n", - "\n", - " elif GLOBAL_CONFIG.vol_type == VolType.BINOMIAL:\n", - " vol = get_discrete_crr_vol_on_chain(\n", - " chain,\n", - " run_date,\n", - " N=GLOBAL_CONFIG.N,\n", - " rates_col_name='risk_free_rate',\n", - " div_type=GLOBAL_CONFIG.div_type.value\n", - " )\n", - "\n", - " else:\n", - " raise ValueError(f\"Invalid vol_type: {GLOBAL_CONFIG.vol_type}\")\n", - "\n", - " chain['vol'] = vol\n", - " logger.info(\"After vol calculation: %s\", chain.shape[0])\n", - "\n", - " ## Create output dataclass\n", - " output = ChainOutput(\n", - " root=symbol,\n", - " chain=chain,\n", - " spot=chain['spot'].iloc[0],\n", - " div_type=GLOBAL_CONFIG.div_type,\n", - " vol_type=GLOBAL_CONFIG.vol_type,\n", - " pv_div_col='div_pv',\n", - " fwd_col_name='f',\n", - " rate_col='risk_free_rate',\n", - " vol_col='vol',\n", - " t_col='t',\n", - " strike_col='strike',\n", - " right_col='right',\n", - " midpoint_col='midpoint',\n", - " valuation_date=run_date,\n", - " div_schedule_col='div_schedule'\n", - " )\n", - " return output\n" - ] - }, - { - "cell_type": "code", - "execution_count": 483, - "metadata": {}, - "outputs": [], - "source": [ - "class MarketChainLoader(BaseModel, ChainInputModel):\n", - " \"\"\"\n", - " Market model to load and process option chain data.\n", - " \"\"\"\n", - " model_config = ConfigDict(validate_assignment=True)\n", - " _instances: ClassVar[dict[str, \"MarketChainLoader\"]] = {}\n", - " _initialized: bool = PrivateAttr(default=False)\n", - " \n", - " symbol: str = Field(..., description=\"Symbol of the underlying asset\")\n", - " run_date: str|datetime = Field(..., description=\"Run date for the data\")\n", - " _chains: Optional[dict[str, ChainOutput]] = PrivateAttr(default_factory=dict)\n", - "\n", - " def model_post_init(self, context):\n", - " self.run_date = pd.to_datetime(self.run_date).strftime('%Y-%m-%d')\n", - "\n", - " def __new__(cls, symbol: str, *args, **kwargs):\n", - " if symbol not in cls._instances:\n", - " instance = super().__new__(cls)\n", - " cls._instances[symbol] = instance\n", - " return cls._instances[symbol]\n", - "\n", - " def __init__(self, *args, **data):\n", - " # First-time init for this cached instance:\n", - " # If __pydantic_private__ isn't set yet, it's the first real init.\n", - " if getattr(self, \"__pydantic_private__\", None) is None:\n", - " super().__init__(*args, **data) # sets fields and creates private store\n", - " self._initialized = True # safe now\n", - " return\n", - " \n", - " # Subsequent inits for this cached instance:\n", - " if self._initialized:\n", - " # Already initialized, just update fields\n", - " for key, value in data.items():\n", - " setattr(self, key, value)\n", - "\n", - " def _force_rebuild(self) -> bool:\n", - " \"\"\"\n", - " Determines if the chain needs to be rebuilt based on the current run date.\n", - " And cross-referencing the GLOBAL_CONFIG settings.\n", - " Returns:\n", - " bool: True if the chain needs to be rebuilt, False otherwise.\n", - " \"\"\"\n", - " ## If run_date not in chains, we need to build\n", - " if self.run_date not in self._chains:\n", - " return True\n", - " \n", - " ## If GLOBAL_CONFIG has changed, we need to rebuild\n", - " existing_chain = self._chains[self.run_date]\n", - " if (existing_chain.div_type != GLOBAL_CONFIG.div_type or\n", - " existing_chain.vol_type != GLOBAL_CONFIG.vol_type):\n", - " return True\n", - " \n", - " def build_chain(self) -> ChainOutput:\n", - " \"\"\"\n", - " Loads and processes the option chain data.\n", - " \"\"\"\n", - " if self._force_rebuild():\n", - " logger.info(f\"Rebuilding chain for {self.symbol} on {self.run_date} because config changed or not cached\")\n", - " self._chains[self.run_date] = _load_chain(self.symbol, self.run_date)\n", - " logger.info(f\"Rebuilt chain for {self.symbol} on {self.run_date}\")\n", - " else:\n", - " logger.info(f\"Using cached chain for {self.symbol} on {self.run_date}\")\n", - "\n", - " if self.run_date not in self._chains:\n", - " logger.info(f\"MarketChainLoader: Loading chain for {self.symbol} on {self.run_date}\")\n", - " self._chains[self.run_date] = _load_chain(self.symbol, self.run_date)\n", - " return self._chains[self.run_date]\n", - "\n", - " def get_chain(self) -> ChainOutput:\n", - " \"\"\"\n", - " Returns the processed option chain data.\n", - " \"\"\"\n", - " if not self._chains:\n", - " raise ValueError(\"Chain not built yet. Call build_chain() first.\")\n", - " return self._chains[self.run_date]\n", - "\n", - " @property\n", - " def chain(self) -> Optional[ChainOutput]:\n", - " return self.get_chain() if self._chains else None\n" - ] - }, - { - "cell_type": "code", - "execution_count": 488, - "metadata": {}, - "outputs": [], - "source": [ - "GLOBAL_CONFIG.vol_type = VolType.BINOMIAL" - ] - }, - { - "cell_type": "code", - "execution_count": 489, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2025-10-13 11:27:12 SSVIModel INFO: Rebuilding chain for META on 2025-06-04 because config changed or not cached\n", - "2025-10-13 11:27:14 SSVIModel INFO: Initial chain size: 5538\n", - "2025-10-13 11:27:15 SSVIModel INFO: Risk-free rate on 2025-06-04: 0.04234999656677246\n", - "2025-10-13 11:27:16 SSVIModel INFO: After F load: 5538\n", - "2025-10-13 11:27:16 SSVIModel INFO: Initial chain length: 5538\n", - "2025-10-13 11:27:16 SSVIModel INFO: Chain length after removing junk quotes: 4828\n", - "2025-10-13 11:27:16 SSVIModel INFO: Chain length after confining with pricing config: 3162\n", - "2025-10-13 11:27:16 SSVIModel INFO: After junk removal: 3162\n", - "2025-10-13 11:27:16 SSVIModel INFO: Calculating vols using VolType.BINOMIAL model\n", - "2025-10-13 11:27:25 SSVIModel INFO: After vol calculation: 3162\n", - "2025-10-13 11:27:25 SSVIModel INFO: Rebuilt chain for META on 2025-06-04\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 489, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "loader = MarketChainLoader( symbol='META', run_date='2025-06-04' )\n", - "chain_output = loader.build_chain()\n", - "chain_output" - ] - }, - { - "cell_type": "code", - "execution_count": 183, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "@dataclass\n", - "class SSVIModelParams:\n", - " \"\"\"\n", - " SSVI Model Parameters for the Stochastic Volatility Surface.\n", - " This class holds the parameters for the SSVI model, including the ATM variance, \n", - " long-term variance, speed of mean reversion, skewness, kurtosis, and correlation.\n", - " Attributes:\n", - " var0_hat (float): Initial variance estimate at ATM.\n", - " var_inf_hat (float): Long-term variance estimate.\n", - " kappa_hat (float): Speed of mean reversion.\n", - " eta_hat (float): Skewness parameter.\n", - " lambda_hat (float): Kurtosis parameter.\n", - " rho_hat (float): Correlation parameter.\n", - " atm_loss (float): Loss associated with the ATM volatility estimation.\n", - " surface_loss (float): Loss associated with the surface fitting.\n", - " \"\"\"\n", - " var0_hat: float = Field(default=0.0, description=\"Initial variance estimate at ATM\")\n", - " var_inf_hat: float = Field(default=0.0, description=\"Long-term variance estimate\")\n", - " kappa_hat: float = Field(default=0.0, description=\"Speed of Mean Reversion\")\n", - " eta_hat: float = Field(default=0.0, description=\"Skewness parameter\")\n", - " lambda_hat: float = Field(default=0.0, description=\"Kurtosis parameter\")\n", - " rho_hat: float = Field(default=0.0, description=\"Correlation parameter\")\n", - " atm_loss: float = Field(default=0.0, description=\"Loss associated with ATM volatility estimation\")\n", - " surface_loss: float = Field(default=0.0, description=\"Loss associated with surface fitting\")\n", - " nrmse: float = Field(default=0.0, description=\"Normalized Mean Squared Error\")\n", - " rw_nrmse: float = Field(default=0.0, description=\"Right Wing Normalized Mean Squared Error\")\n", - " lw_nrmse: float = Field(default=0.0, description=\"Left Wing Normalized Mean Squared Error\")\n", - " nmae: float = Field(default=0.0, description=\"Normalized Mean Absolute Error\")\n", - " rw_nmae: float = Field(default=0.0, description=\"Right Wing Normalized Mean Absolute Error\")\n", - " lw_nmae: float = Field(default=0.0, description=\"Left Wing Normalized Mean Absolute Error\")\n", - " \n", - " def __repr__(self):\n", - " acceptable_fields = ['var0_hat', 'var_inf_hat', 'kappa_hat',\n", - " 'eta_hat', 'lambda_hat', 'rho_hat',\n", - " 'atm_loss', 'surface_loss']\n", - " params = {field: getattr(self, field) for field in acceptable_fields}\n", - " return (f\"SSVIModelParams{params}\\n\")\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": 336, - "metadata": {}, - "outputs": [], - "source": [ - "## Right Picking Util\n", - "\n", - "def _sigmoid_func(k: np.ndarray, \n", - " f: float) -> np.ndarray:\n", - " x = np.log(k/f)\n", - " return 1/(1 + np.exp(4*x))\n", - "\n", - "def pick_params(call_params: SSVIModelParams,\n", - " put_params: SSVIModelParams,\n", - " right: str) -> SSVIModelParams:\n", - " \"\"\"\n", - " Pick parameters based on the option type (call or put).\n", - " \n", - " Args:\n", - " call_params (SSVIModelParams): Parameters for call options.\n", - " put_params (SSVIModelParams): Parameters for put options.\n", - " right (str): The option type ('c' for call, 'p' for put).\n", - " \n", - " Returns:\n", - " SSVIModelParams: The selected parameters based on the option type.\n", - " \"\"\"\n", - " if right.lower() == 'c':\n", - " return call_params\n", - " elif right.lower() == 'p':\n", - " return put_params\n", - " else:\n", - " raise ValueError(f\"Invalid option type: {right}. Expected 'c' or 'p'.\")\n", - " \n", - "def _predict_vol_decider(\n", - " k: float|np.ndarray,\n", - " t: float|np.ndarray,\n", - " f: float|np.ndarray,\n", - " right: str,\n", - " call_params: SSVIModelParams,\n", - " put_params: SSVIModelParams\n", - ") -> float|np.ndarray:\n", - " \"\"\"\n", - " Predict the volatility using the SSVI model parameters.\n", - " This function selects the appropriate parameters based on the option type\n", - " and computes the implied volatility using the SSVI formula.\n", - "\n", - " If 'right' is 'itm' or 'otm', it blends the call and put volatilities\n", - " based on the moneyness using a sigmoid function.\n", - " \n", - " Args:\n", - " k (float): Strike price.\n", - " t (float): Time to maturity in years.\n", - " f (float): Forward price.\n", - " params (SSVIModelParams): The SSVI model parameters.\n", - " \n", - " Returns:\n", - " float: The predicted volatility.\n", - " \"\"\"\n", - " if right in ['c', 'p']:\n", - " params = pick_params(call_params, put_params, right)\n", - " elif right in ['itm', 'otm']:\n", - " call_vols = predict_vol(k, t, f, 'c', call_params, put_params)\n", - " put_vols = predict_vol(k, t, f, 'p', call_params, put_params)\n", - " w = _sigmoid_func(k, f)\n", - " if right == 'itm': ## Left: Call, Right: Put\n", - " return w * call_vols + (1 - w) * put_vols\n", - " else:\n", - " return (1 - w) * call_vols + w * put_vols\n", - " else:\n", - " raise ValueError(f\"Invalid option type: {right}. Expected 'c', 'p', 'itm', or 'otm'.\")\n", - "\n", - " return ssvi_implied_vol(\n", - " fwd=f, strike=k, maturity=t,\n", - " var0=params.var0_hat, var_inf=params.var_inf_hat, kappa=params.kappa_hat,\n", - " eta=params.eta_hat, lam=params.lambda_hat, rho=params.rho_hat\n", - " )\n", - "\n", - "def predict_vol(\n", - " k: float|np.ndarray,\n", - " t: float|np.ndarray,\n", - " f: float,\n", - " params: SSVIModelParams) -> float|np.ndarray:\n", - " \"\"\"\n", - " Predict the volatility using the SSVI model parameters.\n", - " This function computes the implied volatility using the SSVI formula.\n", - " \"\"\"\n", - " return ssvi_implied_vol(\n", - " fwd=f, strike=k, maturity=t,\n", - " var0=params.var0_hat, var_inf=params.var_inf_hat, kappa=params.kappa_hat,\n", - " eta=params.eta_hat, lam=params.lambda_hat, rho=params.rho_hat\n", - " )\n" - ] - }, - { - "cell_type": "code", - "execution_count": 185, - "metadata": {}, - "outputs": [], - "source": [ - "def build_svi_params_obj(\n", - " chain: pd.DataFrame,\n", - " var0_hat: float,\n", - " var_inf_hat: float,\n", - " kappa_hat: float,\n", - " eta_hat: float,\n", - " lambda_hat: float,\n", - " rho_hat: float,\n", - " atm_loss: float,\n", - " surface_loss: float,\n", - ") -> SSVIModelParams:\n", - " \n", - " \"\"\"\n", - " Build an SSVIModelParams object from the given parameters.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " var0_hat (float): Initial variance estimate at ATM.\n", - " var_inf_hat (float): Long-term variance estimate.\n", - " kappa_hat (float): Speed of mean reversion.\n", - " eta_hat (float): Skewness parameter.\n", - " lambda_hat (float): Kurtosis parameter.\n", - " rho_hat (float): Correlation parameter.\n", - " atm_loss (float): Loss associated with ATM volatility estimation.\n", - " surface_loss (float): Loss associated with surface fitting.\n", - " \n", - " Returns:\n", - " SSVIModelParams: The SSVI model parameters object.\n", - " \"\"\"\n", - " ## Calculate normalized losses\n", - " moneyness = chain['moneyness'].values\n", - " market_iv = chain['vol'].values\n", - " model_iv = ssvi_implied_vol(\n", - " fwd=get_fwd_grid(chain),\n", - " strike=get_K_grid(chain),\n", - " maturity= get_T_grid(chain),\n", - " var0=var0_hat, var_inf=var_inf_hat, kappa=kappa_hat,\n", - " eta=eta_hat, lam=lambda_hat, rho=rho_hat\n", - " )\n", - "\n", - " normalized_nrmse, rw_nrmse, lw_nrmse = calculate_normalized_rmse_loss(\n", - " market_iv=market_iv,\n", - " model_iv=model_iv,\n", - " moneyness=moneyness\n", - " )\n", - " normalized_nmae, rw_nmae, lw_nmae = calculate_normalized_mae_loss(\n", - " market_iv=market_iv,\n", - " model_iv=model_iv,\n", - " moneyness=moneyness\n", - " )\n", - " return SSVIModelParams(\n", - " var0_hat=var0_hat,\n", - " var_inf_hat=var_inf_hat,\n", - " kappa_hat=kappa_hat,\n", - " eta_hat=eta_hat,\n", - " lambda_hat=lambda_hat,\n", - " rho_hat=rho_hat,\n", - " atm_loss=atm_loss,\n", - " surface_loss=surface_loss,\n", - " nrmse=normalized_nrmse,\n", - " rw_nrmse=rw_nrmse,\n", - " lw_nrmse=lw_nrmse,\n", - " nmae=normalized_nmae,\n", - " rw_nmae=rw_nmae,\n", - " lw_nmae=lw_nmae\n", - " )" - ] - }, - { - "cell_type": "code", - "execution_count": 230, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'f'" - ] - }, - "execution_count": 230, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "chain_output.f_log_m_col\n", - "\n", - "get_atm_vol(\n", - " chain_output.chain, \n", - " chain_output.f_log_m_col,\n", - " chain_output.vol_col\n", - ")\n", - "chain_output.fwd_col_name" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "from typing import ClassVar\n", - "class BaseSSVIModel(ABC):\n", - "\n", - " @abstractmethod\n", - " def predict(self, *args, **kwargs):\n", - " \"\"\"\n", - " Abstract method to predict the implied volatility surface.\n", - " Must be implemented by subclasses.\n", - " \"\"\"\n", - " pass\n", - "\n", - "\n", - " @abstractmethod\n", - " def fit(self, *args, **kwargs):\n", - " \"\"\"\n", - " Abstract method to fit the SSVI model.\n", - " Must be implemented by subclasses.\n", - " \"\"\"\n", - " pass\n", - "\n", - "\n", - "class _SSVIModel(BaseSSVIModel, BaseModel):\n", - " \"\"\"\n", - " SSVI Model for Stochastic Volatility Surface.\n", - " This class implements the SSVI model using the parameters defined in SSVIModelParams.\n", - " It provides methods to predict implied volatility, build the model, and fit the model.\n", - "\n", - " Note: There will be no market data retrieval in this class. Technically, it is completely blind to market data.\n", - " This model will be enforcing discrete dividends and will not support continuous dividends.\n", - " \"\"\"\n", - " # ==============================\n", - " # Class Variables\n", - " # ==============================\n", - " model_config = ConfigDict(validate_assignment=True, arbitrary_types_allowed=True)\n", - " global_config: ClassVar[SSVIGlobalConfig] = get_global_config()\n", - "\n", - " # ==============================\n", - " # Instance Variables\n", - " # ==============================\n", - "\n", - " ## Compulsory Inputs\n", - " chain: ChainOutput = Field(description=\"Processed option chain output\")\n", - " valuation_date: str|datetime = Field(..., description=\"Valuation date for the option chain\")\n", - " right: VolSide = Field(..., description=\"Which side of the volatility surface to model ('call', 'put', 'otm')\")\n", - " \n", - " ## Optional Inputs/Derived inputs\n", - " model: VolType = Field(default=global_config.vol_type, description=\"Volatility model to use ('bs' or 'binomial')\") \n", - " dataframe_chain: pd.DataFrame = Field(default=None, description=\"DataFrame representation of the option chain\")\n", - " atm_t:list = Field(default_factory=list, description=\"ATM option chain expiration times\")\n", - " atm_iv :list = Field(default_factory=list, description=\"ATM option chain implied volatilities\")\n", - " div_type: str = Field(default=global_config.div_type, description=\"Dividend type to use ('discrete' or 'continuous')\")\n", - " fwd_interp: Optional[interp1d] = Field(default=None, description=\"Forward interpolation function\")\n", - " params: SSVIModelParams = Field(default = None, description=\"SSVI Model Parameters\")\n", - " iterations: int = Field(global_config.model_iterations, description=\"Number of iterations for model fitting\")\n", - " chunk_size: int = Field(global_config.chunk_size, description=\"Chunk size for processing\")\n", - "\n", - " def __repr__(self):\n", - " return f\"\"\n", - "\n", - " def model_post_init(self, context):\n", - " \"\"\"\n", - " Post-initialization to validate and initialize the model.\n", - " \"\"\"\n", - " self.validate()\n", - " self.initialize()\n", - "\n", - " def validate(self):\n", - " \"\"\"\n", - " Validate the input chain DataFrame to ensure it contains all required columns.\n", - " Raises ValueError if any required column is missing.\n", - " \"\"\"\n", - " if self.chain is None or self.chain.chain.empty:\n", - " raise ValueError(\"Chain cannot be None or empty\")\n", - "\n", - " def initialize(self):\n", - " \"\"\"\n", - " Initialize the SSVI model by separating the option chain into calls, puts, and OTM options.\n", - " Also prepares the ATM parameters for fitting.\n", - " \"\"\"\n", - " \n", - " ## Seperate chain into calls, puts, and otm\n", - " chain = self.chain.chain.copy()\n", - " call_bool = chain[self.chain.right_col].str.lower() == 'c'\n", - " put_bool = chain[self.chain.right_col].str.lower() == 'p'\n", - "\n", - " ## Spliting by right\n", - " if self.right == VolSide.CALL:\n", - " self.dataframe_chain = chain[chain[self.chain.right_col].str.lower() == 'c'].copy()\n", - " elif self.right == VolSide.PUT:\n", - " self.dataframe_chain = chain[chain[self.chain.right_col].str.lower() == 'p'].copy()\n", - " elif self.right == VolSide.OTM:\n", - " self.dataframe_chain = chain[((call_bool) & (chain[self.chain.f_log_m_col] >= 0)) |\n", - " ((put_bool) & (chain[self.chain.f_log_m_col] < 0))].copy()\n", - " else:\n", - " raise ValueError(f\"Invalid right side: {self.right}. Must be 'call', 'put', or 'otm'.\")\n", - " \n", - " ## Chain Now\n", - " chain = self.dataframe_chain\n", - "\n", - " ## Get atm_t, atm_iv\n", - " self.atm_t = get_atm_T(self.dataframe_chain, self.chain.t_col, self.chain.f_log_m_col)\n", - " self.atm_iv = get_atm_vol(self.dataframe_chain, self.chain.f_log_m_col, self.chain.vol_col)\n", - "\n", - " ## Prepare fwd_interp\n", - " self.fwd_interp= interp1d(\n", - " x= chain[self.chain.t_col].values,\n", - " y=chain[self.chain.fwd_col_name].values,)\n", - "\n", - "\n", - " def fit(self):\n", - " \"\"\"\n", - " Fit the SSVI model to the option chain data.\n", - " This method estimates the ATM variance, long-term variance, speed of mean reversion,\n", - " skewness, kurtosis, and correlation parameters using the option chain data.\n", - " It calculates the ATM maturities and implied volatilities, and then uses these to\n", - " estimate the model parameters.\n", - "\n", - " Note: This method is designed to be called after the model has been initialized. It fits per right chain (call and put).\n", - " \"\"\"\n", - " if self.dataframe_chain is None or self.dataframe_chain.empty:\n", - " raise ValueError(\"Dataframe chain is empty or not set. Ensure the model is initialized properly.\")\n", - " \n", - " if self.params is not None:\n", - " logger.info(\"Model is already fitted. Overwriting existing parameters.\")\n", - " return\n", - "\n", - " def inner_fit(right_chain_attr: str):\n", - " \"\"\"\n", - " Inner function to perform the fitting process.\n", - " This is called by the fit method.\n", - " \"\"\"\n", - " chain = getattr(self, right_chain_attr)\n", - " if chain is None or chain.empty:\n", - " raise ValueError(f\"Chain for {right_chain_attr} is empty or not set.\")\n", - " \n", - " atm_t = np.array(self.atm_t)\n", - " atm_iv = np.array(self.atm_iv)\n", - " if atm_t.size == 0 or atm_iv.size == 0:\n", - " raise ValueError(f\"No ATM maturities or volatilities found in {right_chain_attr} chain. Adjust PRICING_CONFIG['ATM_WIDTH'].\")\n", - " (var0_hat, var_inf_hat, kappa_hat), atm_loss = get_best_params(\n", - " atm_t,\n", - " atm_iv\n", - " )\n", - " eta_hat, lambda_hat, rho_hat, surface_loss = get_surface_params(\n", - " chain[self.chain.strike_col].values,\n", - " chain[self.chain.t_col].values,\n", - " chain[self.chain.fwd_col_name].values,\n", - " var0_hat,\n", - " var_inf_hat,\n", - " kappa_hat,\n", - " chain[self.chain.vol_col].values,\n", - " iterations=self.iterations,\n", - " chunk_size=self.chunk_size\n", - " )\n", - " params = build_svi_params_obj(\n", - " chain=chain,\n", - " var0_hat=var0_hat,\n", - " var_inf_hat=var_inf_hat,\n", - " kappa_hat=kappa_hat,\n", - " eta_hat=eta_hat,\n", - " lambda_hat=lambda_hat,\n", - " rho_hat=rho_hat,\n", - " atm_loss=atm_loss,\n", - " surface_loss=surface_loss\n", - " )\n", - "\n", - " return params\n", - " self.params = inner_fit('dataframe_chain')\n", - " \n", - " def predict(self,\n", - " k: float| np.ndarray,\n", - " exp: str| datetime| np.ndarray = None,\n", - " strike_type: Literal['p', 'k', 'pf', 'f'] = 'f'):\n", - " \"\"\"\n", - " Predict the implied volatility for a given strike and expiration.\n", - " Args:\n", - " k (float | np.ndarray): Strike price or array of strike prices.\n", - " exp (str | datetime | np.ndarray): Expiration date or array of expiration dates.\n", - " c & p are for call and put options, respectively.\n", - " itm & otm are for in-the-money and out-of-the-money options, respectively.\n", - " itm: Will use Calls in left wing and Puts in right wing.\n", - " otm: Will use Calls in right wing and Puts in left wing.\n", - " strike_type (Literal['p', 'k', 'pf', 'f']): Type of strike price ('p' for price, 'k' for strike, etc.).\n", - " p: Percent of spot\n", - " k: Strike price\n", - " pf: Percent of forward\n", - " f: Forward price\n", - " Returns:\n", - " np.ndarray: Predicted implied volatility for the given parameters.\n", - " \"\"\"\n", - " ## Produce DTEs\n", - " exp = np.asarray(exp) if exp is not None else np.array(['3m'])\n", - " dtes = np.array([max(convert_date_to_time_to_maturity(e, self.valuation_date),\n", - " self.chain.t.min()) \n", - " for e in exp])\n", - " exp_map = {dte: e for e, dte in zip(exp, dtes)}\n", - "\n", - " ## Strike Type Handling\n", - " k = np.asarray(k) if isinstance(k, (list, np.ndarray)) else np.array([k])\n", - " fwds = np.array(self.fwd_interp(dtes))\n", - " k_dte_pack =np.array([\n", - " handle_strikes(k=k, \n", - " f=f, \n", - " strike_type=strike_type, \n", - " spot=self.dataframe_chain['spot'].iloc[0])\n", - " for f in fwds\n", - " ])\n", - "\n", - " ## Re-ordering to equalize size and pair to DTE for vectorization\n", - " k_model, dtes, model_f, k_pretty= np.column_stack((\n", - " k_dte_pack.flatten(),\n", - " dtes.repeat(k_dte_pack.shape[1]),\n", - " fwds.repeat(k_dte_pack.shape[1]),\n", - " np.array([k]).repeat(len(k_dte_pack), axis=0).flatten()\n", - " )).T\n", - "\n", - " # Pick the right chain based on the 'right' parameter. This is handled in the predict_vol function.\n", - " vols = predict_vol(\n", - " k=k_model,\n", - " t=dtes,\n", - " f=model_f,\n", - " params=self.params\n", - " )\n", - "\n", - " dataframe_vols = pd.DataFrame({\n", - " 'strike': k_pretty,\n", - " 'exp': dtes,\n", - " 'vol': vols,\n", - " 'fwd': model_f\n", - " })\n", - "\n", - " dataframe_vols['exp'] = dataframe_vols['exp'].map(exp_map) # Map DTEs back to original expiration strings\n", - " dataframe_vols= dataframe_vols.set_index(['strike', 'exp']).sort_index()\n", - " return dataframe_vols\n", - "\n", - "\n", - "model = _SSVIModel(\n", - " chain=chain_output,\n", - " valuation_date=run_date,\n", - " right=VolSide.OTM\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 364, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
volfwd
strikeexp
200.02025-06-200.544250203.358354
2025-09-200.503899205.260449
210.02025-06-200.251881203.358354
2025-09-200.388863205.260449
220.02025-06-200.239928203.358354
2025-09-200.276369205.260449
\n", - "
" - ], - "text/plain": [ - " vol fwd\n", - "strike exp \n", - "200.0 2025-06-20 0.544250 203.358354\n", - " 2025-09-20 0.503899 205.260449\n", - "210.0 2025-06-20 0.251881 203.358354\n", - " 2025-09-20 0.388863 205.260449\n", - "220.0 2025-06-20 0.239928 203.358354\n", - " 2025-09-20 0.276369 205.260449" - ] - }, - "execution_count": 364, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "model.fit()\n", - "model.params\n", - "model.predict(k=[200, 210, 220], exp=['2025-06-20', '2025-09-20'], strike_type='k')" - ] - }, - { - "cell_type": "code", - "execution_count": 502, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "\n", - "_BG_EXEC = ThreadPoolExecutor(max_workers=2) # reuse across calls\n", - "\n", - "class SSVIParentModel(BaseModel, BaseSSVIModel):\n", - " \"\"\"\n", - " Parent model to manage SSVI models for different option sides (call, put, otm).\n", - " This class initializes and manages separate SSVIModel instances for calls, puts, and OTM options.\n", - " It provides methods to fit all models and predict implied volatilities based on the option type.\n", - " It isn't market data aware; it relies on passed info which creates the child models.\n", - " Attributes:\n", - " call_model (SSVIModel): SSVI model for call options.\n", - " put_model (SSVIModel): SSVI model for put options.\n", - " otm_model (SSVIModel): SSVI model for OTM options.\n", - " \"\"\"\n", - "\n", - " model_config = ConfigDict(validate_assignment=True, arbitrary_types_allowed=True)\n", - "\n", - " ## Compulsory Inputs\n", - " chain: ChainOutput = Field(description=\"Processed option chain output\")\n", - " valuation_date: str|datetime = Field(..., description=\"Valuation date for the option chain\")\n", - " \n", - " ## Optional Inputs/Derived inputs\n", - " model: VolType = Field(default=GLOBAL_CONFIG.vol_type, description=\"Volatility model to use ('bs' or 'binomial')\")\n", - " div_type: str = Field(default=GLOBAL_CONFIG.div_type, description=\"Dividend type to use ('discrete' or 'continuous')\")\n", - " iterations: int = Field(GLOBAL_CONFIG.model_iterations, description=\"Number of iterations for model fitting\")\n", - " chunk_size: int = Field(GLOBAL_CONFIG.chunk_size, description=\"Chunk size for processing\")\n", - " models: Optional[dict[str, _SSVIModel]] = Field(default=None, description=\"Dictionary of SSVI models for different option sides\")\n", - "\n", - " def model_post_init(self, context):\n", - " \"\"\"\n", - " Post-initialization to validate and initialize the parent model.\n", - " \"\"\"\n", - " for right in [VolSide.CALL, VolSide.PUT, VolSide.OTM]:\n", - " model = _SSVIModel(\n", - " chain=self.chain,\n", - " valuation_date=self.valuation_date,\n", - " right=right,\n", - " model=self.model,\n", - " div_type=self.div_type,\n", - " iterations=self.iterations,\n", - " chunk_size=self.chunk_size\n", - " )\n", - " if self.models is None:\n", - " self.models = {}\n", - " self.models[right.value] = model\n", - "\n", - " @property\n", - " def params(self) -> dict[str, SSVIModelParams]:\n", - " \"\"\"\n", - " Returns the parameters of all SSVI models as a dictionary.\n", - " \"\"\"\n", - " if self.models is None:\n", - " raise ValueError(\"Models have not been initialized.\")\n", - " return {right: model.params for right, model in self.models.items()}\n", - " \n", - " @property\n", - " def model_info(self) -> dict[str, dict]:\n", - " \"\"\"\n", - " Returns a summary of the model information for all SSVI models.\n", - " \"\"\"\n", - " if self.models is None:\n", - " raise ValueError(\"Models have not been initialized.\")\n", - " return {right: {\n", - " 'valuation_date': model.valuation_date,\n", - " 'right': model.right.value,\n", - " 'params': model.params\n", - " } for right, model in self.models.items()}\n", - " \n", - " @property\n", - " def call_model(self) -> _SSVIModel:\n", - " if self.models is None or 'call' not in self.models:\n", - " raise ValueError(\"Call model has not been initialized.\")\n", - " return self.models[VolSide.CALL.value]\n", - "\n", - " @property\n", - " def put_model(self) -> _SSVIModel:\n", - " if self.models is None or 'put' not in self.models:\n", - " raise ValueError(\"Put model has not been initialized.\")\n", - " return self.models[VolSide.PUT.value]\n", - "\n", - " @property\n", - " def otm_model(self) -> _SSVIModel:\n", - " if self.models is None or 'otm' not in self.models:\n", - " raise ValueError(\"OTM model has not been initialized.\")\n", - " return self.models[VolSide.OTM.value]\n", - "\n", - " def __repr__(self):\n", - " return f\"\"\n", - " \n", - " \n", - "\n", - " def fit(self):\n", - " \"\"\"\n", - " Fit the SSVI model to the option chain data.\n", - " This method estimates the ATM variance, long-term variance, speed of mean reversion,\n", - " skewness, kurtosis, and correlation parameters using the option chain data.\n", - " It calculates the ATM maturities and implied volatilities, and then uses these to\n", - " estimate the model parameters.\n", - "\n", - " Note: This method is designed to be called after the model has been initialized. It fits per right chain (call and put).\n", - " \"\"\"\n", - " others = [s for s in self.models.keys() if s != GLOBAL_CONFIG.vol_side.value]\n", - " ## Fit the primary model in the main thread\n", - " self.models[GLOBAL_CONFIG.vol_side.value].fit()\n", - " logger.info(f\"Fitted {GLOBAL_CONFIG.vol_side.value} model\")\n", - "\n", - " ## Fit the other models in the background\n", - " for side in others:\n", - " logger.info(f\"Fitting {side} model in background\")\n", - " _BG_EXEC.submit(self.models[side].fit)\n", - "\n", - " def predict(self,\n", - " k: float| np.ndarray,\n", - " exp: str| datetime| np.ndarray = None,\n", - " strike_type: Literal['p', 'k', 'pf', 'f'] = 'f',\n", - " right: VolSide = None):\n", - " \"\"\"\n", - " Predict the implied volatility for a given strike and expiration.\n", - " Args:\n", - " k (float | np.ndarray): Strike price or array of strike prices.\n", - " exp (str | datetime | np.ndarray): Expiration date or array of expiration dates.\n", - " right (Literal['c', 'p', 'itm', 'otm'] | np.ndarray): Option type ('c' for call, 'p' for put, etc.).\n", - " c & p are for call and put options, respectively.\n", - " itm & otm are for in-the-money and out-of-the-money options, respectively.\n", - " itm: Will use Calls in left wing and Puts in right wing.\n", - " otm: Will use Calls in right wing and Puts in left wing.\n", - " strike_type (Literal['p', 'k', 'pf', 'f']): Type of strike price ('p' for price, 'k' for strike, etc.).\n", - " p: Percent of spot\n", - " k: Strike price\n", - " pf: Percent of forward\n", - " f: Log forward moneyness\n", - " Returns:\n", - " np.ndarray: Predicted implied volatility for the given parameters.\n", - " \"\"\"\n", - "\n", - " if right is None:\n", - " right = GLOBAL_CONFIG.vol_side\n", - " elif isinstance(right, str):\n", - " right = VolSide(right.lower())\n", - " if right.value not in self.models:\n", - " raise ValueError(f\"Invalid right side: {right}. Must be 'call', 'put', or 'otm'.\")\n", - " return self.models[right.value].predict(k=k, exp=exp, strike_type=strike_type)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 503, - "metadata": {}, - "outputs": [], - "source": [ - "GLOBAL_CONFIG.vol_side = VolSide.CALL" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "p_model = SSVIParentModel(\n", - " chain=chain_output,\n", - " valuation_date=run_date\n", - ")\n", - "\n", - "# p_model.fit()\n", - "p_model.fit()" - ] - }, - { - "cell_type": "code", - "execution_count": 513, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'call': {'valuation_date': '2025-05-15',\n", - " 'right': 'call',\n", - " 'params': SSVIModelParams{'var0_hat': 0.19869379148704594, 'var_inf_hat': 0.02320420339009833, 'kappa_hat': 2.869872277099417, 'eta_hat': 1.4840092156362865, 'lambda_hat': -0.3138011319087422, 'rho_hat': -0.22823592834303208, 'atm_loss': 0.010160255744440804, 'surface_loss': 0.004209431020789013}},\n", - " 'put': {'valuation_date': '2025-05-15',\n", - " 'right': 'put',\n", - " 'params': SSVIModelParams{'var0_hat': 0.19999540638149707, 'var_inf_hat': 0.15246982969754216, 'kappa_hat': 0.3689780830671835, 'eta_hat': 0.5055245877135964, 'lambda_hat': -0.5739371726606391, 'rho_hat': -0.4428260670183157, 'atm_loss': 0.08035378712870085, 'surface_loss': 0.012248053532854552}},\n", - " 'otm': {'valuation_date': '2025-05-15',\n", - " 'right': 'otm',\n", - " 'params': SSVIModelParams{'var0_hat': 0.19869379148704594, 'var_inf_hat': 0.02320420339009833, 'kappa_hat': 2.869872277099417, 'eta_hat': 1.4840092156362865, 'lambda_hat': -0.3138011319087422, 'rho_hat': -0.22823592834303208, 'atm_loss': 0.010160255744440804, 'surface_loss': 0.004209431020789013}}}" - ] - }, - "execution_count": 513, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "p_model.model_info" - ] - }, - { - "cell_type": "code", - "execution_count": 437, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
volfwd
strikeexp
200.02025-06-200.544250203.358354
2025-09-200.503899205.260449
210.02025-06-200.251881203.358354
2025-09-200.388863205.260449
220.02025-06-200.239928203.358354
2025-09-200.276369205.260449
\n", - "
" - ], - "text/plain": [ - " vol fwd\n", - "strike exp \n", - "200.0 2025-06-20 0.544250 203.358354\n", - " 2025-09-20 0.503899 205.260449\n", - "210.0 2025-06-20 0.251881 203.358354\n", - " 2025-09-20 0.388863 205.260449\n", - "220.0 2025-06-20 0.239928 203.358354\n", - " 2025-09-20 0.276369 205.260449" - ] - }, - "execution_count": 437, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "p_model.predict(k=[200, 210, 220], exp=['2025-06-20', '2025-09-20'], strike_type='k')" - ] - }, - { - "cell_type": "code", - "execution_count": 438, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
volfwd
strikeexp
1.01m0.470048203.358354
2m0.472124203.837597
3m0.473891204.464249
1.51m0.447482203.358354
2m0.375483203.837597
3m0.326225204.464249
2.01m0.576578203.358354
2m0.480269203.837597
3m0.413364204.464249
\n", - "
" - ], - "text/plain": [ - " vol fwd\n", - "strike exp \n", - "1.0 1m 0.470048 203.358354\n", - " 2m 0.472124 203.837597\n", - " 3m 0.473891 204.464249\n", - "1.5 1m 0.447482 203.358354\n", - " 2m 0.375483 203.837597\n", - " 3m 0.326225 204.464249\n", - "2.0 1m 0.576578 203.358354\n", - " 2m 0.480269 203.837597\n", - " 3m 0.413364 204.464249" - ] - }, - "execution_count": 438, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "p_model.predict(k=[1, 1.5, 2], exp=['1m', '2m', '3m'], strike_type='p')" - ] - }, - { - "cell_type": "code", - "execution_count": 500, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2025-10-13 11:31:16 SSVIModel INFO: Using cached chain for AAPL on 2025-06-04\n", - "2025-10-13 11:31:16 SSVIModel INFO: Using cached chain for META on 2025-06-04\n" - ] - } - ], - "source": [ - "\n", - "\n", - "def is_weekend(dt:str|datetime) -> bool:\n", - " \"\"\"\n", - " Check if the given date is a weekend (Saturday or Sunday).\n", - " \n", - " Args:\n", - " dt (str | datetime): The date to check.\n", - " \n", - " Returns:\n", - " bool: True if the date is a weekend, False otherwise.\n", - " \"\"\"\n", - " if isinstance(dt, str):\n", - " dt = pd.to_datetime(dt)\n", - " return dt.weekday() >= 5 # Saturday is 5, Sunday is 6\n", - "\n", - "\n", - "class EODMarketSSVIModel(SSVIParentModel):\n", - " \"\"\"\n", - " EODMarketSSVIModel extends SSVIModel to handle end-of-day market data.\n", - " This model is designed to work with end-of-day option chains and provides methods\n", - " to predict implied volatility based on the SSVI model parameters.\n", - " \"\"\"\n", - " model_config = ConfigDict(validate_assignment=True, arbitrary_types_allowed=True)\n", - " symbol: str = Field(..., description=\"Symbol of the underlying asset\")\n", - " valuation_date: str|datetime = Field(..., description=\"Valuation date for the option chain\")\n", - " chain: Optional[ChainOutput] = Field(default=None, description=\"Processed option chain output\")\n", - " chain_loader: MarketChainLoader = Field(default=None, description=\"Market chain loader instance\")\n", - "\n", - " def model_post_init(self, _):\n", - " if self.chain is None:\n", - " loader = self.chain_loader or MarketChainLoader(symbol=self.symbol, run_date=self.valuation_date)\n", - " self.chain_loader = loader\n", - " self.chain = loader.build_chain()\n", - " super().model_post_init(_)\n", - "\n", - " def __repr__(self):\n", - " return f\"\"\n", - "\n", - " \n", - "aapl_model = EODMarketSSVIModel(\n", - " symbol='AAPL',\n", - " valuation_date='2025-06-04'\n", - ")\n", - "\n", - "meta_model = EODMarketSSVIModel(\n", - " symbol='META',\n", - " valuation_date='2025-06-04'\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 501, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2025-10-13 11:31:21 SSVIModel INFO: Fitted call model\n", - "2025-10-13 11:31:21 SSVIModel INFO: Fitting put model in background\n", - "2025-10-13 11:31:21 SSVIModel INFO: Fitting otm model in background\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 501, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "meta_model.fit()\n", - "meta_model" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "from typing import ClassVar\n", - "class BaseSSVIModel(ABC):\n", - "\n", - " @abstractmethod\n", - " def predict(self, *args, **kwargs):\n", - " \"\"\"\n", - " Abstract method to predict the implied volatility surface.\n", - " Must be implemented by subclasses.\n", - " \"\"\"\n", - " pass\n", - "\n", - "\n", - " @abstractmethod\n", - " def fit(self, *args, **kwargs):\n", - " \"\"\"\n", - " Abstract method to fit the SSVI model.\n", - " Must be implemented by subclasses.\n", - " \"\"\"\n", - " pass\n", - "\n", - "\n", - "class SSVIModel(BaseSSVIModel, BaseModel):\n", - " \"\"\"\n", - " SSVI Model for Stochastic Volatility Surface.\n", - " This class implements the SSVI model using the parameters defined in SSVIModelParams.\n", - " It provides methods to predict implied volatility, build the model, and fit the model.\n", - "\n", - " Note: There will be no market data retrieval in this class. Technically, it is completely blind to market data.\n", - " This model will be enforcing discrete dividends and will not support continuous dividends.\n", - " \"\"\"\n", - " # ==============================\n", - " # Class Variables\n", - " # ==============================\n", - " model_config = ConfigDict(validate_assignment=True, arbitrary_types_allowed=True)\n", - " global_config: ClassVar[SSVIGlobalConfig] = get_global_config()\n", - "\n", - " # ==============================\n", - " # Instance Variables\n", - " # ==============================\n", - "\n", - " ## Compulsory Inputs\n", - " chain: ChainOutput = Field(description=\"Processed option chain output\")\n", - " valuation_date: str|datetime = Field(..., description=\"Valuation date for the option chain\")\n", - "\n", - " ## Optional Inputs/Derived inputs\n", - " model: VolType = Field(default=global_config.vol_type, description=\"Volatility model to use ('bs' or 'binomial')\")\n", - " call_chain: pd.DataFrame = Field(default_factory=pd.DataFrame, description=\"Call option chain DataFrame\")\n", - " put_chain: pd.DataFrame = Field(default_factory=pd.DataFrame, description=\"Put option chain DataFrame\")\n", - " otm_chain: pd.DataFrame = Field(default_factory=pd.DataFrame, description=\"OTM option chain DataFrame\")\n", - " atm_t_put:list = Field(default_factory=list, description=\"ATM option chain expiration times\")\n", - " atm_iv_put:list = Field(default_factory=list, description=\"ATM option chain implied volatilities\")\n", - " atm_t_call:list = Field(default_factory=list, description=\"ATM option chain expiration times\")\n", - " atm_iv_call:list = Field(default_factory=list, description=\"ATM option chain implied volatilities\")\n", - " atm_t_otm:list = Field(default_factory=list, description=\"ATM option chain expiration times\")\n", - " atm_iv_otm:list = Field(default_factory=list, description=\"ATM option chain implied volatilities\")\n", - " div_type: str = Field(default=global_config.div_type, description=\"Dividend type to use ('discrete' or 'continuous')\")\n", - " fwd_interp: Optional[interp1d] = Field(default=None, description=\"Forward interpolation function\")\n", - " params: SSVIModelParams = Field(default_factory=SSVIModelParams, description=\"SSVI Model Parameters\")\n", - " call_params: SSVIModelParams = Field(default_factory=SSVIModelParams, description=\"Call option parameters\")\n", - " put_params: SSVIModelParams = Field(default_factory=SSVIModelParams, description=\"Put option parameters\")\n", - " otm_params: SSVIModelParams = Field(default_factory=SSVIModelParams, description=\"OTM option parameters\")\n", - " iterations: int = Field(global_config.model_iterations, description=\"Number of iterations for model fitting\")\n", - " chunk_size: int = Field(global_config.chunk_size, description=\"Chunk size for processing\")\n", - "\n", - " def model_post_init(self, context):\n", - " \"\"\"\n", - " Post-initialization to validate and initialize the model.\n", - " \"\"\"\n", - " self.validate()\n", - " self.initialize()\n", - "\n", - " def validate(self):\n", - " \"\"\"\n", - " Validate the input chain DataFrame to ensure it contains all required columns.\n", - " Raises ValueError if any required column is missing.\n", - " \"\"\"\n", - " if self.chain is None or self.chain.chain.empty:\n", - " raise ValueError(\"Chain cannot be None or empty\")\n", - "\n", - " def initialize(self):\n", - " \"\"\"\n", - " Initialize the SSVI model by separating the option chain into calls, puts, and OTM options.\n", - " Also prepares the ATM parameters for fitting.\n", - " \"\"\"\n", - " \n", - " ## Seperate chain into calls, puts, and otm\n", - " chain = self.chain.chain.copy()\n", - " call_bool = chain[self.chain.right_col].str.lower() == 'c'\n", - " put_bool = chain[self.chain.right_col].str.lower() == 'p'\n", - " self.call_chain = chain[chain[self.chain.right_col].str.lower() == 'c'].copy()\n", - " self.put_chain = chain[chain[self.chain.right_col].str.lower() == 'p'].copy()\n", - " self.otm_chain = chain[((call_bool) & (chain[self.chain.f_log_m_col] >= 0)) |\n", - " ((put_bool) & (chain[self.chain.f_log_m_col] < 0))].copy()\n", - "\n", - " ## Get atm_t, atm_iv\n", - " self.atm_t_call = get_atm_T(self.call_chain, self.chain.t_col, self.chain.f_log_m_col)\n", - " self.atm_iv_call = get_atm_vol(self.call_chain, self.chain.f_log_m_col, self.chain.vol_col)\n", - " self.atm_t_put = get_atm_T(self.put_chain, self.chain.t_col, self.chain.f_log_m_col)\n", - " self.atm_iv_put = get_atm_vol(self.put_chain, self.chain.f_log_m_col, self.chain.vol_col)\n", - " self.atm_t_otm = get_atm_T(self.otm_chain, self.chain.t_col, self.chain.f_log_m_col)\n", - " self.atm_iv_otm = get_atm_vol(self.otm_chain, self.chain.f_log_m_col, self.chain.vol_col)\n", - "\n", - " ## Prepare fwd_interp\n", - " self.fwd_interp= interp1d(\n", - " x= chain[self.chain.t_col].values,\n", - " y=chain[self.chain.fwd_col_name].values,)\n", - "\n", - "\n", - " def fit(self):\n", - " \"\"\"\n", - " Fit the SSVI model to the option chain data.\n", - " This method estimates the SSVI parameters using the provided option chain.\n", - " \"\"\"\n", - " self._validate_chain()\n", - " self._prepare_chain()\n", - " self._estimate_atm_params()\n", - " self._estimate_surface_params()\n", - " \n", - " def predict(self):\n", - " pass\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "model = SSVIModel(\n", - " chain=chain_output,\n", - " valuation_date=run_date,\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['expiration', 'strike', 'right', 'midpoint', 'f', 'spot', 'div_schedule'] ['t']\n" - ] - }, - { - "data": { - "text/plain": [ - "(0.14997374988928716, 0.18905586239122918)" - ] - }, - "execution_count": 36, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "chain=chains['AAPL' ]\n", - "chain['vol']=chain['crr_vol_discrete']\n", - "ssvi= SSVIModel(\n", - " chain=chain,\n", - " valuation_date=test_valuation_date,\n", - " model='binomial',\n", - " iterations=25000\n", - ")\n", - "ssvi.fit()\n", - "ssvi.put_params\n", - "ssvi.call_params.nmae, ssvi.put_params.nrmse" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['expiration', 'strike', 'right', 'midpoint'] ['t', 'f', 'spot', 'div_schedule']\n" - ] - }, - { - "data": { - "text/plain": [ - "['t', 'f', 'spot', 'div_schedule']" - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ssvi_market=EODMarketSSVIModel('AAPL', '2025-04-08', model='binomial')\n", - "ssvi_market.iterations=10\n", - "ssvi_market.get_expected_columns()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
intrinsicmidpointmoneynessbid_sizevol
datetime
2025-07-1629.83999629.4751.1419871110.198854
2025-07-1634.83999634.6501.1657781110.190291
2025-07-1639.83999639.8251.1895701050.254929
2025-07-1639.83999639.7751.1895701000.279557
2025-07-1639.83999639.6251.1895701000.059254
..................
2025-07-16159.839996159.7501.7605631000.491062
2025-07-16159.839996159.8001.760563240.153400
2025-07-16159.839996159.7751.7605631050.313527
2025-07-16159.839996159.8251.7605631000.300819
2025-07-16159.839996159.8001.760563310.358113
\n", - "

132 rows × 5 columns

\n", - "
" - ], - "text/plain": [ - " intrinsic midpoint moneyness bid_size vol\n", - "datetime \n", - "2025-07-16 29.839996 29.475 1.141987 111 0.198854\n", - "2025-07-16 34.839996 34.650 1.165778 111 0.190291\n", - "2025-07-16 39.839996 39.825 1.189570 105 0.254929\n", - "2025-07-16 39.839996 39.775 1.189570 100 0.279557\n", - "2025-07-16 39.839996 39.625 1.189570 100 0.059254\n", - "... ... ... ... ... ...\n", - "2025-07-16 159.839996 159.750 1.760563 100 0.491062\n", - "2025-07-16 159.839996 159.800 1.760563 24 0.153400\n", - "2025-07-16 159.839996 159.775 1.760563 105 0.313527\n", - "2025-07-16 159.839996 159.825 1.760563 100 0.300819\n", - "2025-07-16 159.839996 159.800 1.760563 31 0.358113\n", - "\n", - "[132 rows x 5 columns]" - ] - }, - "execution_count": 84, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "chainv2 = confine_chain_with_pricing_config(chain).copy()\n", - "chainv2['intrinsic'] = chainv2.apply(\n", - " lambda row: intrinsic_value(\n", - " row['strike'], row['spot'], row['right']), axis=1)\n", - "chainv2[chainv2['midpoint']\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
volfwd
strikeexp
0.91y0.297392218.348961
1.01y0.279967218.348961
1.11y0.268118218.348961
\n", - "" - ], - "text/plain": [ - " vol fwd\n", - "strike exp \n", - "0.9 1y 0.297392 218.348961\n", - "1.0 1y 0.279967 218.348961\n", - "1.1 1y 0.268118 218.348961" - ] - }, - "execution_count": 48, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "vols = ssvi.predict(\n", - " k=[0.9,1, 1.1],\n", - " exp=['1y'], # Example expirations\n", - " right='c',\n", - " strike_type='p'\n", - ")\n", - "\n", - "vols" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
volfwd
strikeexp
0.91y0.443198178.89333
1.01y0.411143178.89333
1.11y0.385370178.89333
\n", - "
" - ], - "text/plain": [ - " vol fwd\n", - "strike exp \n", - "0.9 1y 0.443198 178.89333\n", - "1.0 1y 0.411143 178.89333\n", - "1.1 1y 0.385370 178.89333" - ] - }, - "execution_count": 49, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "market_vols = ssvi_market.predict(\n", - " k=[0.9,1, 1.1],\n", - " exp=['1y'], # Example expirations\n", - " right='c',\n", - " strike_type='p'\n", - ")\n", - "market_vols" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 555, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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kbBXofdhKW8+X/m9nPLcd6TRrIKnWQVPswqN5hU8zSp4ZT2rUPYXUeewiIiISGTSIaHD2L17N//4xz/YvXu311HCnmYVPM0qeJpVaDSv4GlWwQuHWamwHIa1ltWrV+sM8iBoVsHTrIKnWYVG8wqeZhW8cJiVCouIiIiEPRUWERERCXsqLIcRHR1Nnz59Dvrp0PI7zSp4mlXwNKvQaF7B06yCFw6z0lVCIiIiEva0wiIiIiJhT4VFREREwp4Ki4iIiIQ9FRYREREJe1X6AxQWL17Mv//9b1avXs22bdu4/fbb6dChg9exwtLs2bOZPXs2OTk5ADRq1Ig+ffpw4oknepwsPG3dupU333yT7777joKCApKTkxkyZAhNmzb1OlrY0s/j/g43kz179jBx4kS++uorduzYQb169TjvvPM455xzPExd8TIyMvjyyy9Zv349MTExtGjRgiuuuIIGDRoEtpkzZw7/+9//WL16Nbt372b8+PHUqFHDw9QSqipdWAoKCkhLS+Oss87iiSee8DpOWKtTpw79+vUjJSUFay0ff/wxjz32GI899hhHH3201/HCys6dO7nnnnto3bo1w4cPJz4+no0bN+p/joehn8f9HW4mr7/+OllZWQwbNoykpCR++OEHxo4dS506dTj55JM9SOyNxYsXc+6559K0aVOKi4t56623ePjhh3nqqaeoVq0a4J9lu3btaNeuHZMmTfI4sZRGlS4sJ5544iFXCG688UbOOussNm7cyMKFC6lVqxYDBgygRYsWvPjii2RmZlK/fn1uuOGGiP+b85//53f55Zcze/Zsli9fztFHH82ll17KoEGD+Oabb8jKyiIpKYkbbriB+Ph4XnzxRVauXElqaipDhw4lOTnZo1dRMaZPn07dunUZMmRI4LF69eqV2Ebvrf0d6udx6tSpfP755zz55JMlHr/jjjs46aST6Nu3b0VErHCH+3/UsmXL6NSpE61btwbg7LPP5qOPPmLFihWBn9mq8LN59913l/j6xhtvZODAgaxatYpWrVoBcMEFFwDw448/HnAfmzZtYujQodxyyy3MmjWLlStXcswxxzBs2DDy8/MZO3Ys69ev57jjjmPo0KHEx8eX74uqAPfffz/HHHMMMTExzJ07F5/PR7du3bj00ksBeP/995k3bx6bNm2iZs2anHTSSVxxxRWBEjh//nxee+01brnlFl5//XU2b95My5YtGTJkCImJiWWeV+ewHMYHH3zAsccey2OPPUb79u157rnnGD16NB07dmTkyJHUr1+f0aNHV6nPonBdl88++4yCggJatGgRePzdd9/lzDPP5LHHHqNBgwY8++yzvPzyy/Ts2ZN//etfWGt59dVXPUxeMb7++muaNGnCU089xcCBA7nzzjuZM2fOftvpvRW8Ll26sG7dOlasWBF4bPXq1axdu5YuXbp4mMxbLVq04JtvvmHr1q1Ya8nKymLjxo20bdu2xHZV7WczPz8fgJo1a4b83HfeeYfevXszcuRIHMdh1KhRTJw4kauvvpoHH3yQ7Oxs3n777bKO7JmPP/6Y2NhYHnnkEa644greffddfvjhBwCMMVxzzTU8+eST3HjjjWRlZfHmm2+WeH5BQQEzZsxg6NChPPDAA2zevJk33nijXLKqsBzGiSeeSLdu3UhJSaFPnz7s3r2bpk2b8pe//IUGDRpw8cUXs379erZv3+511HK3du1a/va3v9GvXz9eeeUVbr/9dho1ahT4/c6dO5Oenh6YS05ODmeccQbt2rWjUaNGnH/++Qf9200k2bRpEx999BHJycncfffdnHPOOYwfP5758+eX2E7vreDVrVuXdu3alZjhvHnzaNWqFfXr1/cumMcGDBhAw4YNuf766+nXrx+PPPII1157bWBVYZ+q9LPpui6vvfYaxx57LMccc0zIz7/wwgtLzGXVqlVccskltGzZksaNG3PWWWdFzKwAUlNT+etf/0pKSgqdOnWiSZMmZGZmAv5VqeOPP5569epx/PHH07dvXz7//PMSzy8uLmbQoEE0bdqUJk2a0L1798Dzy1qVPiQUjNTU1MCva9euDVDihyAhIQGA7du3B34dqRo0aMDjjz9Ofn4+X3zxBWPGjOGBBx4IlJY/zmrfLP44q9q1a1NYWEh+fj5xcXEVmr0iua5L06ZN6devHwCNGzdm7dq1fPTRR3Tu3Dmwnd5boenatSsvvPACV155JY7j8Nlnn3HVVVd5HctTH374IcuXL+fOO+8kKSmJJUuWMG7cOBITE0usslSln81x48bxyy+/8OCDD5bq+X+ey4Eei6S/RPy51CUmJgZe3w8//MC0adNYv349u3fvpri4mMLCQgoKCoiNjQUgNja2xKHExMRE8vLyyiWrCsthREVFBX5tjNnvsX2q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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "from pandas import Categorical\n", - "exp_vols = vols[vols.index.get_level_values('strike')==1.0]\n", - "exp_vols.reset_index(inplace=True)\n", - "\n", - "exp_vols['exp'] = Categorical(exp_vols['exp'], categories=['1m', '3m', '6m', '1y', '18m', '21m'], ordered=True)\n", - "exp_vols.sort_values(by='exp', inplace=True)\n", - "exp_vols.plot(x='exp', y='vol', kind='line', marker='o')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Heat Map Aggregate" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from copy import deepcopy\n", - "# BASE_PRICING_CONFIG = deepcopy(PRICING_CONFIG)\n", - "chain_editable=deepcopy(chains)\n", - "from itertools import product\n", - "width_range = np.arange(0.5, 1, 0.1)\n", - "dte_range= np.arange(0, 70, 10)\n", - "combos=list(product(width_range, dte_range))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Processing AAPL with combo (0.5, 0)\n", - "Shape of chain_editable[AAPL]: (1418, 22)\n", - "Done for AAPL with combo (0.5, 0)\n", - "Surface Loss for AAPL: 0.03263895401751859\n", - "Processing MSFT with combo (0.5, 0)\n", - "Shape of chain_editable[MSFT]: (2490, 22)\n", - "Done for MSFT with combo (0.5, 0)\n", - "Surface Loss for MSFT: 0.03174952801335476\n", - "Processing GOOGL with combo (0.5, 0)\n", - "Shape of chain_editable[GOOGL]: (1232, 22)\n", - "Done for GOOGL with combo (0.5, 0)\n", - "Surface Loss for GOOGL: 0.02549826077238575\n", - "Processing AMZN with combo (0.5, 0)\n", - "Shape of chain_editable[AMZN]: (1468, 22)\n", - "Done for AMZN with combo (0.5, 0)\n", - "Surface Loss for AMZN: 0.023943976939988225\n", - "Processing TSLA with combo (0.5, 0)\n", - "Shape of chain_editable[TSLA]: (2098, 22)\n", - "Done for TSLA with combo (0.5, 0)\n", - "Surface Loss for TSLA: 0.017454629714797484\n", - "Done processing combo: (0.5, 0)\n", - "Processing AAPL with combo (0.5, 10)\n", - "Shape of chain_editable[AAPL]: (1204, 22)\n", - "Done for AAPL with combo (0.5, 10)\n", - "Surface Loss for AAPL: 0.006238815762247019\n", - "Processing MSFT with combo (0.5, 10)\n", - "Shape of chain_editable[MSFT]: (2074, 22)\n", - "Done for MSFT with combo (0.5, 10)\n", - "Surface Loss for MSFT: 0.0045793730965549605\n", - "Processing GOOGL with combo (0.5, 10)\n", - "Shape of chain_editable[GOOGL]: (1054, 22)\n", - "Done for GOOGL with combo (0.5, 10)\n", - "Surface Loss for GOOGL: 0.005337167380466202\n", - "Processing AMZN with combo (0.5, 10)\n", - "Shape of chain_editable[AMZN]: (1258, 22)\n", - "Done for AMZN with combo (0.5, 10)\n", - "Surface Loss for AMZN: 0.00571797918405535\n", - "Processing TSLA with combo (0.5, 10)\n", - "Shape of chain_editable[TSLA]: (1666, 22)\n", - "Done for TSLA with combo (0.5, 10)\n", - "Surface Loss for TSLA: 0.005032036757607703\n", - "Done processing combo: (0.5, 10)\n", - "Processing AAPL with combo (0.5, 20)\n", - "Shape of chain_editable[AAPL]: (1102, 22)\n", - "Done for AAPL with combo (0.5, 20)\n", - "Surface Loss for AAPL: 0.0050758456353238515\n", - "Processing MSFT with combo (0.5, 20)\n", - "Shape of chain_editable[MSFT]: (1902, 22)\n", - "Done for MSFT with combo (0.5, 20)\n", - "Surface Loss for MSFT: 0.0037852547852971997\n", - "Processing GOOGL with combo (0.5, 20)\n", - "Shape of chain_editable[GOOGL]: (970, 22)\n", - "Done for GOOGL with combo (0.5, 20)\n", - "Surface Loss for GOOGL: 0.002949841403801299\n", - "Processing AMZN with combo (0.5, 20)\n", - "Shape of chain_editable[AMZN]: (1166, 22)\n", - "Done for AMZN with combo (0.5, 20)\n", - "Surface Loss for AMZN: 0.004006287805826672\n", - "Processing TSLA with combo (0.5, 20)\n", - "Shape of chain_editable[TSLA]: (1520, 22)\n", - "Done for TSLA with combo (0.5, 20)\n", - "Surface Loss for TSLA: 0.00421816043884143\n", - "Done processing combo: (0.5, 20)\n", - "Processing AAPL with combo (0.5, 30)\n", - "Shape of chain_editable[AAPL]: (1020, 22)\n", - "Done for AAPL with combo (0.5, 30)\n", - "Surface Loss for AAPL: 0.004122146492534728\n", - "Processing MSFT with combo (0.5, 30)\n", - "Shape of chain_editable[MSFT]: (1748, 22)\n", - "Done for MSFT with combo (0.5, 30)\n", - "Surface Loss for MSFT: 0.003062836834679705\n", - "Processing GOOGL with combo (0.5, 30)\n", - "Shape of chain_editable[GOOGL]: (906, 22)\n", - "Done for GOOGL with combo (0.5, 30)\n", - "Surface Loss for GOOGL: 0.002125808598415844\n", - "Processing AMZN with combo (0.5, 30)\n", - "Shape of chain_editable[AMZN]: (1094, 22)\n", - "Done for AMZN with combo (0.5, 30)\n", - "Surface Loss for AMZN: 0.002649570716960185\n", - "Processing TSLA with combo (0.5, 30)\n", - "Shape of chain_editable[TSLA]: (1394, 22)\n", - "Done for TSLA with combo (0.5, 30)\n", - "Surface Loss for TSLA: 0.0038889169976699593\n", - "Done processing combo: (0.5, 30)\n", - "Processing AAPL with combo (0.5, 40)\n", - "Shape of chain_editable[AAPL]: (854, 22)\n", - "Done for AAPL with combo (0.5, 40)\n", - "Surface Loss for AAPL: 0.0019649129265609873\n", - "Processing MSFT with combo (0.5, 40)\n", - "Shape of chain_editable[MSFT]: (1430, 22)\n", - "Done for MSFT with combo (0.5, 40)\n", - "Surface Loss for MSFT: 0.002002555256398921\n", - "Processing GOOGL with combo (0.5, 40)\n", - "Shape of chain_editable[GOOGL]: (770, 22)\n", - "Done for GOOGL with combo (0.5, 40)\n", - "Surface Loss for GOOGL: 0.0014378850911335862\n", - "Processing AMZN with combo (0.5, 40)\n", - "Shape of chain_editable[AMZN]: (934, 22)\n", - "Done for AMZN with combo (0.5, 40)\n", - "Surface Loss for AMZN: 0.0013837693489990128\n", - "Processing TSLA with combo (0.5, 40)\n", - "Shape of chain_editable[TSLA]: (1140, 22)\n", - "Done for TSLA with combo (0.5, 40)\n", - "Surface Loss for TSLA: 0.003942690005126152\n", - "Done processing combo: (0.5, 40)\n", - "Processing AAPL with combo (0.5, 50)\n", - "Shape of chain_editable[AAPL]: (772, 22)\n", - "Done for AAPL with combo (0.5, 50)\n", - "Surface Loss for AAPL: 0.0011327115207624744\n", - "Processing MSFT with combo (0.5, 50)\n", - "Shape of chain_editable[MSFT]: (1276, 22)\n", - "Done for MSFT with combo (0.5, 50)\n", - "Surface Loss for MSFT: 0.0015611368784404834\n", - "Processing GOOGL with combo (0.5, 50)\n", - "Shape of chain_editable[GOOGL]: (706, 22)\n", - "Done for GOOGL with combo (0.5, 50)\n", - "Surface Loss for GOOGL: 0.0011176665464391505\n", - "Processing AMZN with combo (0.5, 50)\n", - "Shape of chain_editable[AMZN]: (862, 22)\n", - "Done for AMZN with combo (0.5, 50)\n", - "Surface Loss for AMZN: 0.0008171323395746163\n", - "Processing TSLA with combo (0.5, 50)\n", - "Shape of chain_editable[TSLA]: (1014, 22)\n", - "Done for TSLA with combo (0.5, 50)\n", - "Surface Loss for TSLA: 0.003847233307358311\n", - "Done processing combo: (0.5, 50)\n", - "Processing AAPL with combo (0.5, 60)\n", - "Shape of chain_editable[AAPL]: (772, 22)\n", - "Done for AAPL with combo (0.5, 60)\n", - "Surface Loss for AAPL: 0.0011327115207624744\n", - "Processing MSFT with combo (0.5, 60)\n", - "Shape of chain_editable[MSFT]: (1276, 22)\n", - "Done for MSFT with combo (0.5, 60)\n", - "Surface Loss for MSFT: 0.0015611368784404834\n", - "Processing GOOGL with combo (0.5, 60)\n", - "Shape of chain_editable[GOOGL]: (706, 22)\n", - "Done for GOOGL with combo (0.5, 60)\n", - "Surface Loss for GOOGL: 0.0011176665464391505\n", - "Processing AMZN with combo (0.5, 60)\n", - "Shape of chain_editable[AMZN]: (862, 22)\n", - "Done for AMZN with combo (0.5, 60)\n", - "Surface Loss for AMZN: 0.0008171323395746163\n", - "Processing TSLA with combo (0.5, 60)\n", - "Shape of chain_editable[TSLA]: (1014, 22)\n", - "Done for TSLA with combo (0.5, 60)\n", - "Surface Loss for TSLA: 0.003847233307358311\n", - "Done processing combo: (0.5, 60)\n", - "Processing AAPL with combo (0.6, 0)\n", - "Shape of chain_editable[AAPL]: (1598, 22)\n", - "Done for AAPL with combo (0.6, 0)\n", - "Surface Loss for AAPL: 0.0414603270970487\n", - "Processing MSFT with combo (0.6, 0)\n", - "Shape of chain_editable[MSFT]: (2644, 22)\n", - "Done for MSFT with combo (0.6, 0)\n", - "Surface Loss for MSFT: 0.04686668382498438\n", - "Processing GOOGL with combo (0.6, 0)\n", - "Shape of chain_editable[GOOGL]: (1424, 22)\n", - "Done for GOOGL with combo (0.6, 0)\n", - "Surface Loss for GOOGL: 0.03853530013920991\n", - "Processing AMZN with combo (0.6, 0)\n", - "Shape of chain_editable[AMZN]: (1644, 22)\n", - "Done for AMZN with combo (0.6, 0)\n", - "Surface Loss for AMZN: 0.03578957665480703\n", - "Processing TSLA with combo (0.6, 0)\n", - "Shape of chain_editable[TSLA]: (2480, 22)\n", - "Done for TSLA with combo (0.6, 0)\n", - "Surface Loss for TSLA: 0.022458573316262283\n", - "Done processing combo: (0.6, 0)\n", - "Processing AAPL with combo (0.6, 10)\n", - "Shape of chain_editable[AAPL]: (1366, 22)\n", - "Done for AAPL with combo (0.6, 10)\n", - "Surface Loss for AAPL: 0.007310779828593229\n", - "Processing MSFT with combo (0.6, 10)\n", - "Shape of chain_editable[MSFT]: (2202, 22)\n", - "Done for MSFT with combo (0.6, 10)\n", - "Surface Loss for MSFT: 0.00608160607499546\n", - "Processing GOOGL with combo (0.6, 10)\n", - "Shape of chain_editable[GOOGL]: (1228, 22)\n", - "Done for GOOGL with combo (0.6, 10)\n", - "Surface Loss for GOOGL: 0.008623828296074155\n", - "Processing AMZN with combo (0.6, 10)\n", - "Shape of chain_editable[AMZN]: (1410, 22)\n", - "Done for AMZN with combo (0.6, 10)\n", - "Surface Loss for AMZN: 0.006707345513927043\n", - "Processing TSLA with combo (0.6, 10)\n", - "Shape of chain_editable[TSLA]: (2002, 22)\n", - "Done for TSLA with combo (0.6, 10)\n", - "Surface Loss for TSLA: 0.005514165927213207\n", - "Done processing combo: (0.6, 10)\n", - "Processing AAPL with combo (0.6, 20)\n", - "Shape of chain_editable[AAPL]: (1260, 22)\n", - "Done for AAPL with combo (0.6, 20)\n", - "Surface Loss for AAPL: 0.006388304291876295\n", - "Processing MSFT with combo (0.6, 20)\n", - "Shape of chain_editable[MSFT]: (2026, 22)\n", - "Done for MSFT with combo (0.6, 20)\n", - "Surface Loss for MSFT: 0.005189281061762598\n", - "Processing GOOGL with combo (0.6, 20)\n", - "Shape of chain_editable[GOOGL]: (1138, 22)\n", - "Done for GOOGL with combo (0.6, 20)\n", - "Surface Loss for GOOGL: 0.0055777959696281494\n", - "Processing AMZN with combo (0.6, 20)\n", - "Shape of chain_editable[AMZN]: (1316, 22)\n", - "Done for AMZN with combo (0.6, 20)\n", - "Surface Loss for AMZN: 0.0051601188615474905\n", - "Processing TSLA with combo (0.6, 20)\n", - "Shape of chain_editable[TSLA]: (1836, 22)\n", - "Done for TSLA with combo (0.6, 20)\n", - "Surface Loss for TSLA: 0.004530441647989241\n", - "Done processing combo: (0.6, 20)\n", - "Processing AAPL with combo (0.6, 30)\n", - "Shape of chain_editable[AAPL]: (1174, 22)\n", - "Done for AAPL with combo (0.6, 30)\n", - "Surface Loss for AAPL: 0.005690039888467119\n", - "Processing MSFT with combo (0.6, 30)\n", - "Shape of chain_editable[MSFT]: (1870, 22)\n", - "Done for MSFT with combo (0.6, 30)\n", - "Surface Loss for MSFT: 0.0045558394407880405\n", - "Processing GOOGL with combo (0.6, 30)\n", - "Shape of chain_editable[GOOGL]: (1068, 22)\n", - "Done for GOOGL with combo (0.6, 30)\n", - "Surface Loss for GOOGL: 0.004496456954862222\n", - "Processing AMZN with combo (0.6, 30)\n", - "Shape of chain_editable[AMZN]: (1242, 22)\n", - "Done for AMZN with combo (0.6, 30)\n", - "Surface Loss for AMZN: 0.003753744737024491\n", - "Processing TSLA with combo (0.6, 30)\n", - "Shape of chain_editable[TSLA]: (1690, 22)\n", - "Done for TSLA with combo (0.6, 30)\n", - "Surface Loss for TSLA: 0.0040329860392469595\n", - "Done processing combo: (0.6, 30)\n", - "Processing AAPL with combo (0.6, 40)\n", - "Shape of chain_editable[AAPL]: (990, 22)\n", - "Done for AAPL with combo (0.6, 40)\n", - "Surface Loss for AAPL: 0.0029060487017107403\n", - "Processing MSFT with combo (0.6, 40)\n", - "Shape of chain_editable[MSFT]: (1532, 22)\n", - "Done for MSFT with combo (0.6, 40)\n", - "Surface Loss for MSFT: 0.002562786761218709\n", - "Processing GOOGL with combo (0.6, 40)\n", - "Shape of chain_editable[GOOGL]: (912, 22)\n", - "Done for GOOGL with combo (0.6, 40)\n", - "Surface Loss for GOOGL: 0.0027755248385492198\n", - "Processing AMZN with combo (0.6, 40)\n", - "Shape of chain_editable[AMZN]: (1064, 22)\n", - "Done for AMZN with combo (0.6, 40)\n", - "Surface Loss for AMZN: 0.0020257382044943954\n", - "Processing TSLA with combo (0.6, 40)\n", - "Shape of chain_editable[TSLA]: (1390, 22)\n", - "Done for TSLA with combo (0.6, 40)\n", - "Surface Loss for TSLA: 0.0037421310993665914\n", - "Done processing combo: (0.6, 40)\n", - "Processing AAPL with combo (0.6, 50)\n", - "Shape of chain_editable[AAPL]: (904, 22)\n", - "Done for AAPL with combo (0.6, 50)\n", - "Surface Loss for AAPL: 0.002149355285264978\n", - "Processing MSFT with combo (0.6, 50)\n", - "Shape of chain_editable[MSFT]: (1376, 22)\n", - "Done for MSFT with combo (0.6, 50)\n", - "Surface Loss for MSFT: 0.002213813485623961\n", - "Processing GOOGL with combo (0.6, 50)\n", - "Shape of chain_editable[GOOGL]: (842, 22)\n", - "Done for GOOGL with combo (0.6, 50)\n", - "Surface Loss for GOOGL: 0.0021454253783143007\n", - "Processing AMZN with combo (0.6, 50)\n", - "Shape of chain_editable[AMZN]: (992, 22)\n", - "Done for AMZN with combo (0.6, 50)\n", - "Surface Loss for AMZN: 0.0014321790726094714\n", - "Processing TSLA with combo (0.6, 50)\n", - "Shape of chain_editable[TSLA]: (1244, 22)\n", - "Done for TSLA with combo (0.6, 50)\n", - "Surface Loss for TSLA: 0.0035003401107025598\n", - "Done processing combo: (0.6, 50)\n", - "Processing AAPL with combo (0.6, 60)\n", - "Shape of chain_editable[AAPL]: (904, 22)\n", - "Done for AAPL with combo (0.6, 60)\n", - "Surface Loss for AAPL: 0.002149355285264978\n", - "Processing MSFT with combo (0.6, 60)\n", - "Shape of chain_editable[MSFT]: (1376, 22)\n", - "Done for MSFT with combo (0.6, 60)\n", - "Surface Loss for MSFT: 0.002213813485623961\n", - "Processing GOOGL with combo (0.6, 60)\n", - "Shape of chain_editable[GOOGL]: (842, 22)\n", - "Done for GOOGL with combo (0.6, 60)\n", - "Surface Loss for GOOGL: 0.0021454253783143007\n", - "Processing AMZN with combo (0.6, 60)\n", - "Shape of chain_editable[AMZN]: (992, 22)\n", - "Done for AMZN with combo (0.6, 60)\n", - "Surface Loss for AMZN: 0.0014321790726094714\n", - "Processing TSLA with combo (0.6, 60)\n", - "Shape of chain_editable[TSLA]: (1244, 22)\n", - "Done for TSLA with combo (0.6, 60)\n", - "Surface Loss for TSLA: 0.0035003401107025598\n", - "Done processing combo: (0.6, 60)\n", - "Processing AAPL with combo (0.7, 0)\n", - "Shape of chain_editable[AAPL]: (1696, 22)\n", - "Done for AAPL with combo (0.7, 0)\n", - "Surface Loss for AAPL: 0.04167328496111895\n", - "Processing MSFT with combo (0.7, 0)\n", - "Shape of chain_editable[MSFT]: (2746, 22)\n", - "Done for MSFT with combo (0.7, 0)\n", - "Surface Loss for MSFT: 0.055830034542159665\n", - "Processing GOOGL with combo (0.7, 0)\n", - "Shape of chain_editable[GOOGL]: (1540, 22)\n", - "Done for GOOGL with combo (0.7, 0)\n", - "Surface Loss for GOOGL: 0.04699491625169415\n", - "Processing AMZN with combo (0.7, 0)\n", - "Shape of chain_editable[AMZN]: (1696, 22)\n", - "Done for AMZN with combo (0.7, 0)\n", - "Surface Loss for AMZN: 0.037799226089600645\n", - "Processing TSLA with combo (0.7, 0)\n", - "Shape of chain_editable[TSLA]: (2774, 22)\n", - "Done for TSLA with combo (0.7, 0)\n", - "Surface Loss for TSLA: 0.028911291739280486\n", - "Done processing combo: (0.7, 0)\n", - "Processing AAPL with combo (0.7, 10)\n", - "Shape of chain_editable[AAPL]: (1460, 22)\n", - "Done for AAPL with combo (0.7, 10)\n", - "Surface Loss for AAPL: 0.008127461045901755\n", - "Processing MSFT with combo (0.7, 10)\n", - "Shape of chain_editable[MSFT]: (2294, 22)\n", - "Done for MSFT with combo (0.7, 10)\n", - "Surface Loss for MSFT: 0.007431260224864005\n", - "Processing GOOGL with combo (0.7, 10)\n", - "Shape of chain_editable[GOOGL]: (1334, 22)\n", - "Done for GOOGL with combo (0.7, 10)\n", - "Surface Loss for GOOGL: 0.008817019465478523\n", - "Processing AMZN with combo (0.7, 10)\n", - "Shape of chain_editable[AMZN]: (1458, 22)\n", - "Done for AMZN with combo (0.7, 10)\n", - "Surface Loss for AMZN: 0.0071630125922910945\n", - "Processing TSLA with combo (0.7, 10)\n", - "Shape of chain_editable[TSLA]: (2258, 22)\n", - "Done for TSLA with combo (0.7, 10)\n", - "Surface Loss for TSLA: 0.0062449150067723095\n", - "Done processing combo: (0.7, 10)\n", - "Processing AAPL with combo (0.7, 20)\n", - "Shape of chain_editable[AAPL]: (1354, 22)\n", - "Done for AAPL with combo (0.7, 20)\n", - "Surface Loss for AAPL: 0.007333869482820519\n", - "Processing MSFT with combo (0.7, 20)\n", - "Shape of chain_editable[MSFT]: (2118, 22)\n", - "Done for MSFT with combo (0.7, 20)\n", - "Surface Loss for MSFT: 0.006705905430181514\n", - "Processing GOOGL with combo (0.7, 20)\n", - "Shape of chain_editable[GOOGL]: (1244, 22)\n", - "Done for GOOGL with combo (0.7, 20)\n", - "Surface Loss for GOOGL: 0.0060684162024125105\n", - "Processing AMZN with combo (0.7, 20)\n", - "Shape of chain_editable[AMZN]: (1364, 22)\n", - "Done for AMZN with combo (0.7, 20)\n", - "Surface Loss for AMZN: 0.005718784503689611\n", - "Processing TSLA with combo (0.7, 20)\n", - "Shape of chain_editable[TSLA]: (2080, 22)\n", - "Done for TSLA with combo (0.7, 20)\n", - "Surface Loss for TSLA: 0.005177525691205907\n", - "Done processing combo: (0.7, 20)\n", - "Processing AAPL with combo (0.7, 30)\n", - "Shape of chain_editable[AAPL]: (1268, 22)\n", - "Done for AAPL with combo (0.7, 30)\n", - "Surface Loss for AAPL: 0.006764894793981231\n", - "Processing MSFT with combo (0.7, 30)\n", - "Shape of chain_editable[MSFT]: (1962, 22)\n", - "Done for MSFT with combo (0.7, 30)\n", - "Surface Loss for MSFT: 0.006226320721742398\n", - "Processing GOOGL with combo (0.7, 30)\n", - "Shape of chain_editable[GOOGL]: (1174, 22)\n", - "Done for GOOGL with combo (0.7, 30)\n", - "Surface Loss for GOOGL: 0.0050820984090569395\n", - "Processing AMZN with combo (0.7, 30)\n", - "Shape of chain_editable[AMZN]: (1290, 22)\n", - "Done for AMZN with combo (0.7, 30)\n", - "Surface Loss for AMZN: 0.004335474035565609\n", - "Processing TSLA with combo (0.7, 30)\n", - "Shape of chain_editable[TSLA]: (1922, 22)\n", - "Done for TSLA with combo (0.7, 30)\n", - "Surface Loss for TSLA: 0.004608366582213732\n", - "Done processing combo: (0.7, 30)\n", - "Processing AAPL with combo (0.7, 40)\n", - "Shape of chain_editable[AAPL]: (1080, 22)\n", - "Done for AAPL with combo (0.7, 40)\n", - "Surface Loss for AAPL: 0.004189365674053863\n", - "Processing MSFT with combo (0.7, 40)\n", - "Shape of chain_editable[MSFT]: (1614, 22)\n", - "Done for MSFT with combo (0.7, 40)\n", - "Surface Loss for MSFT: 0.0035450178102513505\n", - "Processing GOOGL with combo (0.7, 40)\n", - "Shape of chain_editable[GOOGL]: (1014, 22)\n", - "Done for GOOGL with combo (0.7, 40)\n", - "Surface Loss for GOOGL: 0.0036081550396177735\n", - "Processing AMZN with combo (0.7, 40)\n", - "Shape of chain_editable[AMZN]: (1110, 22)\n", - "Done for AMZN with combo (0.7, 40)\n", - "Surface Loss for AMZN: 0.002596386009402101\n", - "Processing TSLA with combo (0.7, 40)\n", - "Shape of chain_editable[TSLA]: (1590, 22)\n", - "Done for TSLA with combo (0.7, 40)\n", - "Surface Loss for TSLA: 0.003918336252468754\n", - "Done processing combo: (0.7, 40)\n", - "Processing AAPL with combo (0.7, 50)\n", - "Shape of chain_editable[AAPL]: (994, 22)\n", - "Done for AAPL with combo (0.7, 50)\n", - "Surface Loss for AAPL: 0.0036372260903392625\n", - "Processing MSFT with combo (0.7, 50)\n", - "Shape of chain_editable[MSFT]: (1458, 22)\n", - "Done for MSFT with combo (0.7, 50)\n", - "Surface Loss for MSFT: 0.003383744685764854\n", - "Processing GOOGL with combo (0.7, 50)\n", - "Shape of chain_editable[GOOGL]: (944, 22)\n", - "Done for GOOGL with combo (0.7, 50)\n", - "Surface Loss for GOOGL: 0.003131392347621061\n", - "Processing AMZN with combo (0.7, 50)\n", - "Shape of chain_editable[AMZN]: (1038, 22)\n", - "Done for AMZN with combo (0.7, 50)\n", - "Surface Loss for AMZN: 0.0019375733011807786\n", - "Processing TSLA with combo (0.7, 50)\n", - "Shape of chain_editable[TSLA]: (1432, 22)\n", - "Done for TSLA with combo (0.7, 50)\n", - "Surface Loss for TSLA: 0.0035844059332435225\n", - "Done processing combo: (0.7, 50)\n", - "Processing AAPL with combo (0.7, 60)\n", - "Shape of chain_editable[AAPL]: (994, 22)\n", - "Done for AAPL with combo (0.7, 60)\n", - "Surface Loss for AAPL: 0.0036372260903392625\n", - "Processing MSFT with combo (0.7, 60)\n", - "Shape of chain_editable[MSFT]: (1458, 22)\n", - "Done for MSFT with combo (0.7, 60)\n", - "Surface Loss for MSFT: 0.003383744685764854\n", - "Processing GOOGL with combo (0.7, 60)\n", - "Shape of chain_editable[GOOGL]: (944, 22)\n", - "Done for GOOGL with combo (0.7, 60)\n", - "Surface Loss for GOOGL: 0.003131392347621061\n", - "Processing AMZN with combo (0.7, 60)\n", - "Shape of chain_editable[AMZN]: (1038, 22)\n", - "Done for AMZN with combo (0.7, 60)\n", - "Surface Loss for AMZN: 0.0019375733011807786\n", - "Processing TSLA with combo (0.7, 60)\n", - "Shape of chain_editable[TSLA]: (1432, 22)\n", - "Done for TSLA with combo (0.7, 60)\n", - "Surface Loss for TSLA: 0.0035844059332435225\n", - "Done processing combo: (0.7, 60)\n", - "Processing AAPL with combo (0.7999999999999999, 0)\n", - "Shape of chain_editable[AAPL]: (1784, 22)\n", - "Done for AAPL with combo (0.7999999999999999, 0)\n", - "Surface Loss for AAPL: 0.04329873335546823\n", - "Processing MSFT with combo (0.7999999999999999, 0)\n", - "Shape of chain_editable[MSFT]: (2758, 22)\n", - "Done for MSFT with combo (0.7999999999999999, 0)\n", - "Surface Loss for MSFT: 0.05561382935782852\n", - "Processing GOOGL with combo (0.7999999999999999, 0)\n", - "Shape of chain_editable[GOOGL]: (1592, 22)\n", - "Done for GOOGL with combo (0.7999999999999999, 0)\n", - "Surface Loss for GOOGL: 0.047109491420059345\n", - "Processing AMZN with combo (0.7999999999999999, 0)\n", - "Shape of chain_editable[AMZN]: (1708, 22)\n", - "Done for AMZN with combo (0.7999999999999999, 0)\n", - "Surface Loss for AMZN: 0.03774774465478366\n", - "Processing TSLA with combo (0.7999999999999999, 0)\n", - "Shape of chain_editable[TSLA]: (3012, 22)\n", - "Done for TSLA with combo (0.7999999999999999, 0)\n", - "Surface Loss for TSLA: 0.035376395126855344\n", - "Done processing combo: (0.7999999999999999, 0)\n", - "Processing AAPL with combo (0.7999999999999999, 10)\n", - "Shape of chain_editable[AAPL]: (1544, 22)\n", - "Done for AAPL with combo (0.7999999999999999, 10)\n", - "Surface Loss for AAPL: 0.009365017455974158\n", - "Processing MSFT with combo (0.7999999999999999, 10)\n", - "Shape of chain_editable[MSFT]: (2306, 22)\n", - "Done for MSFT with combo (0.7999999999999999, 10)\n", - "Surface Loss for MSFT: 0.007478635484081148\n", - "Processing GOOGL with combo (0.7999999999999999, 10)\n", - "Shape of chain_editable[GOOGL]: (1384, 22)\n", - "Done for GOOGL with combo (0.7999999999999999, 10)\n", - "Surface Loss for GOOGL: 0.009591981753839957\n", - "Processing AMZN with combo (0.7999999999999999, 10)\n", - "Shape of chain_editable[AMZN]: (1470, 22)\n", - "Done for AMZN with combo (0.7999999999999999, 10)\n", - "Surface Loss for AMZN: 0.0073269209824564484\n", - "Processing TSLA with combo (0.7999999999999999, 10)\n", - "Shape of chain_editable[TSLA]: (2462, 22)\n", - "Done for TSLA with combo (0.7999999999999999, 10)\n", - "Surface Loss for TSLA: 0.008120204416770303\n", - "Done processing combo: (0.7999999999999999, 10)\n", - "Processing AAPL with combo (0.7999999999999999, 20)\n", - "Shape of chain_editable[AAPL]: (1438, 22)\n", - "Done for AAPL with combo (0.7999999999999999, 20)\n", - "Surface Loss for AAPL: 0.008681056640326685\n", - "Processing MSFT with combo (0.7999999999999999, 20)\n", - "Shape of chain_editable[MSFT]: (2130, 22)\n", - "Done for MSFT with combo (0.7999999999999999, 20)\n", - "Surface Loss for MSFT: 0.006763053315731471\n", - "Processing GOOGL with combo (0.7999999999999999, 20)\n", - "Shape of chain_editable[GOOGL]: (1294, 22)\n", - "Done for GOOGL with combo (0.7999999999999999, 20)\n", - "Surface Loss for GOOGL: 0.0069848390016988655\n", - "Processing AMZN with combo (0.7999999999999999, 20)\n", - "Shape of chain_editable[AMZN]: (1376, 22)\n", - "Done for AMZN with combo (0.7999999999999999, 20)\n", - "Surface Loss for AMZN: 0.005903817130919375\n", - "Processing TSLA with combo (0.7999999999999999, 20)\n", - "Shape of chain_editable[TSLA]: (2272, 22)\n", - "Done for TSLA with combo (0.7999999999999999, 20)\n", - "Surface Loss for TSLA: 0.006563503847191585\n", - "Done processing combo: (0.7999999999999999, 20)\n", - "Processing AAPL with combo (0.7999999999999999, 30)\n", - "Shape of chain_editable[AAPL]: (1352, 22)\n", - "Done for AAPL with combo (0.7999999999999999, 30)\n", - "Surface Loss for AAPL: 0.008229630789855651\n", - "Processing MSFT with combo (0.7999999999999999, 30)\n", - "Shape of chain_editable[MSFT]: (1974, 22)\n", - "Done for MSFT with combo (0.7999999999999999, 30)\n", - "Surface Loss for MSFT: 0.006282093024795244\n", - "Processing GOOGL with combo (0.7999999999999999, 30)\n", - "Shape of chain_editable[GOOGL]: (1224, 22)\n", - "Done for GOOGL with combo (0.7999999999999999, 30)\n", - "Surface Loss for GOOGL: 0.006077839652955076\n", - "Processing AMZN with combo (0.7999999999999999, 30)\n", - "Shape of chain_editable[AMZN]: (1302, 22)\n", - "Done for AMZN with combo (0.7999999999999999, 30)\n", - "Surface Loss for AMZN: 0.004532646207661211\n", - "Processing TSLA with combo (0.7999999999999999, 30)\n", - "Shape of chain_editable[TSLA]: (2102, 22)\n", - "Done for TSLA with combo (0.7999999999999999, 30)\n", - "Surface Loss for TSLA: 0.005707148088970792\n", - "Done processing combo: (0.7999999999999999, 30)\n", - "Processing AAPL with combo (0.7999999999999999, 40)\n", - "Shape of chain_editable[AAPL]: (1160, 22)\n", - "Done for AAPL with combo (0.7999999999999999, 40)\n", - "Surface Loss for AAPL: 0.005936000238977425\n", - "Processing MSFT with combo (0.7999999999999999, 40)\n", - "Shape of chain_editable[MSFT]: (1626, 22)\n", - "Done for MSFT with combo (0.7999999999999999, 40)\n", - "Surface Loss for MSFT: 0.0036394812636259865\n", - "Processing GOOGL with combo (0.7999999999999999, 40)\n", - "Shape of chain_editable[GOOGL]: (1062, 22)\n", - "Done for GOOGL with combo (0.7999999999999999, 40)\n", - "Surface Loss for GOOGL: 0.004860212708409966\n", - "Processing AMZN with combo (0.7999999999999999, 40)\n", - "Shape of chain_editable[AMZN]: (1122, 22)\n", - "Done for AMZN with combo (0.7999999999999999, 40)\n", - "Surface Loss for AMZN: 0.002859107922319661\n", - "Processing TSLA with combo (0.7999999999999999, 40)\n", - "Shape of chain_editable[TSLA]: (1752, 22)\n", - "Done for TSLA with combo (0.7999999999999999, 40)\n", - "Surface Loss for TSLA: 0.0050018638184806345\n", - "Done processing combo: (0.7999999999999999, 40)\n", - "Processing AAPL with combo (0.7999999999999999, 50)\n", - "Shape of chain_editable[AAPL]: (1074, 22)\n", - "Done for AAPL with combo (0.7999999999999999, 50)\n", - "Surface Loss for AAPL: 0.005572646568914454\n", - "Processing MSFT with combo (0.7999999999999999, 50)\n", - "Shape of chain_editable[MSFT]: (1470, 22)\n", - "Done for MSFT with combo (0.7999999999999999, 50)\n", - "Surface Loss for MSFT: 0.0035000520580062344\n", - "Processing GOOGL with combo (0.7999999999999999, 50)\n", - "Shape of chain_editable[GOOGL]: (992, 22)\n", - "Done for GOOGL with combo (0.7999999999999999, 50)\n", - "Surface Loss for GOOGL: 0.004361827154201867\n", - "Processing AMZN with combo (0.7999999999999999, 50)\n", - "Shape of chain_editable[AMZN]: (1050, 22)\n", - "Done for AMZN with combo (0.7999999999999999, 50)\n", - "Surface Loss for AMZN: 0.0021785396051152268\n", - "Processing TSLA with combo (0.7999999999999999, 50)\n", - "Shape of chain_editable[TSLA]: (1582, 22)\n", - "Done for TSLA with combo (0.7999999999999999, 50)\n", - "Surface Loss for TSLA: 0.00438902404311767\n", - "Done processing combo: (0.7999999999999999, 50)\n", - "Processing AAPL with combo (0.7999999999999999, 60)\n", - "Shape of chain_editable[AAPL]: (1074, 22)\n", - "Done for AAPL with combo (0.7999999999999999, 60)\n", - "Surface Loss for AAPL: 0.005572646568914454\n", - "Processing MSFT with combo (0.7999999999999999, 60)\n", - "Shape of chain_editable[MSFT]: (1470, 22)\n", - "Done for MSFT with combo (0.7999999999999999, 60)\n", - "Surface Loss for MSFT: 0.0035000520580062344\n", - "Processing GOOGL with combo (0.7999999999999999, 60)\n", - "Shape of chain_editable[GOOGL]: (992, 22)\n", - "Done for GOOGL with combo (0.7999999999999999, 60)\n", - "Surface Loss for GOOGL: 0.004361827154201867\n", - "Processing AMZN with combo (0.7999999999999999, 60)\n", - "Shape of chain_editable[AMZN]: (1050, 22)\n", - "Done for AMZN with combo (0.7999999999999999, 60)\n", - "Surface Loss for AMZN: 0.0021785396051152268\n", - "Processing TSLA with combo (0.7999999999999999, 60)\n", - "Shape of chain_editable[TSLA]: (1582, 22)\n", - "Done for TSLA with combo (0.7999999999999999, 60)\n", - "Surface Loss for TSLA: 0.00438902404311767\n", - "Done processing combo: (0.7999999999999999, 60)\n", - "Processing AAPL with combo (0.8999999999999999, 0)\n", - "Shape of chain_editable[AAPL]: (1860, 22)\n", - "Done for AAPL with combo (0.8999999999999999, 0)\n", - "Surface Loss for AAPL: 0.04683758343599148\n", - "Processing MSFT with combo (0.8999999999999999, 0)\n", - "Shape of chain_editable[MSFT]: (2758, 22)\n", - "Done for MSFT with combo (0.8999999999999999, 0)\n", - "Surface Loss for MSFT: 0.05561382935782852\n", - "Processing GOOGL with combo (0.8999999999999999, 0)\n", - "Shape of chain_editable[GOOGL]: (1642, 22)\n", - "Done for GOOGL with combo (0.8999999999999999, 0)\n", - "Surface Loss for GOOGL: 0.04887772750702336\n", - "Processing AMZN with combo (0.8999999999999999, 0)\n", - "Shape of chain_editable[AMZN]: (1708, 22)\n", - "Done for AMZN with combo (0.8999999999999999, 0)\n", - "Surface Loss for AMZN: 0.03774774465478366\n", - "Processing TSLA with combo (0.8999999999999999, 0)\n", - "Shape of chain_editable[TSLA]: (3248, 22)\n", - "Done for TSLA with combo (0.8999999999999999, 0)\n", - "Surface Loss for TSLA: 0.04144365174112133\n", - "Done processing combo: (0.8999999999999999, 0)\n", - "Processing AAPL with combo (0.8999999999999999, 10)\n", - "Shape of chain_editable[AAPL]: (1616, 22)\n", - "Done for AAPL with combo (0.8999999999999999, 10)\n", - "Surface Loss for AAPL: 0.012367954956099844\n", - "Processing MSFT with combo (0.8999999999999999, 10)\n", - "Shape of chain_editable[MSFT]: (2306, 22)\n", - "Done for MSFT with combo (0.8999999999999999, 10)\n", - "Surface Loss for MSFT: 0.007478635484081148\n", - "Processing GOOGL with combo (0.8999999999999999, 10)\n", - "Shape of chain_editable[GOOGL]: (1430, 22)\n", - "Done for GOOGL with combo (0.8999999999999999, 10)\n", - "Surface Loss for GOOGL: 0.010784929495067805\n", - "Processing AMZN with combo (0.8999999999999999, 10)\n", - "Shape of chain_editable[AMZN]: (1470, 22)\n", - "Done for AMZN with combo (0.8999999999999999, 10)\n", - "Surface Loss for AMZN: 0.0073269209824564484\n", - "Processing TSLA with combo (0.8999999999999999, 10)\n", - "Shape of chain_editable[TSLA]: (2676, 22)\n", - "Done for TSLA with combo (0.8999999999999999, 10)\n", - "Surface Loss for TSLA: 0.012208865886395604\n", - "Done processing combo: (0.8999999999999999, 10)\n", - "Processing AAPL with combo (0.8999999999999999, 20)\n", - "Shape of chain_editable[AAPL]: (1510, 22)\n", - "Done for AAPL with combo (0.8999999999999999, 20)\n", - "Surface Loss for AAPL: 0.011930446494876781\n", - "Processing MSFT with combo (0.8999999999999999, 20)\n", - "Shape of chain_editable[MSFT]: (2130, 22)\n", - "Done for MSFT with combo (0.8999999999999999, 20)\n", - "Surface Loss for MSFT: 0.006763053315731471\n", - "Processing GOOGL with combo (0.8999999999999999, 20)\n", - "Shape of chain_editable[GOOGL]: (1340, 22)\n", - "Done for GOOGL with combo (0.8999999999999999, 20)\n", - "Surface Loss for GOOGL: 0.008276056349025855\n", - "Processing AMZN with combo (0.8999999999999999, 20)\n", - "Shape of chain_editable[AMZN]: (1376, 22)\n", - "Done for AMZN with combo (0.8999999999999999, 20)\n", - "Surface Loss for AMZN: 0.005903817130919375\n", - "Processing TSLA with combo (0.8999999999999999, 20)\n", - "Shape of chain_editable[TSLA]: (2474, 22)\n", - "Done for TSLA with combo (0.8999999999999999, 20)\n", - "Surface Loss for TSLA: 0.01014168819508259\n", - "Done processing combo: (0.8999999999999999, 20)\n", - "Processing AAPL with combo (0.8999999999999999, 30)\n", - "Shape of chain_editable[AAPL]: (1424, 22)\n", - "Done for AAPL with combo (0.8999999999999999, 30)\n", - "Surface Loss for AAPL: 0.011719404029772541\n", - "Processing MSFT with combo (0.8999999999999999, 30)\n", - "Shape of chain_editable[MSFT]: (1974, 22)\n", - "Done for MSFT with combo (0.8999999999999999, 30)\n", - "Surface Loss for MSFT: 0.006282093024795244\n", - "Processing GOOGL with combo (0.8999999999999999, 30)\n", - "Shape of chain_editable[GOOGL]: (1270, 22)\n", - "Done for GOOGL with combo (0.8999999999999999, 30)\n", - "Surface Loss for GOOGL: 0.007442483952322532\n", - "Processing AMZN with combo (0.8999999999999999, 30)\n", - "Shape of chain_editable[AMZN]: (1302, 22)\n", - "Done for AMZN with combo (0.8999999999999999, 30)\n", - "Surface Loss for AMZN: 0.004532646207661211\n", - "Processing TSLA with combo (0.8999999999999999, 30)\n", - "Shape of chain_editable[TSLA]: (2292, 22)\n", - "Done for TSLA with combo (0.8999999999999999, 30)\n", - "Surface Loss for TSLA: 0.009175307007612868\n", - "Done processing combo: (0.8999999999999999, 30)\n", - "Processing AAPL with combo (0.8999999999999999, 40)\n", - "Shape of chain_editable[AAPL]: (1228, 22)\n", - "Done for AAPL with combo (0.8999999999999999, 40)\n", - "Surface Loss for AAPL: 0.010080901920407373\n", - "Processing MSFT with combo (0.8999999999999999, 40)\n", - "Shape of chain_editable[MSFT]: (1626, 22)\n", - "Done for MSFT with combo (0.8999999999999999, 40)\n", - "Surface Loss for MSFT: 0.0036394812636259865\n", - "Processing GOOGL with combo (0.8999999999999999, 40)\n", - "Shape of chain_editable[GOOGL]: (1104, 22)\n", - "Done for GOOGL with combo (0.8999999999999999, 40)\n", - "Surface Loss for GOOGL: 0.0064036691222780166\n", - "Processing AMZN with combo (0.8999999999999999, 40)\n", - "Shape of chain_editable[AMZN]: (1122, 22)\n", - "Done for AMZN with combo (0.8999999999999999, 40)\n", - "Surface Loss for AMZN: 0.002859107922319661\n", - "Processing TSLA with combo (0.8999999999999999, 40)\n", - "Shape of chain_editable[TSLA]: (1924, 22)\n", - "Done for TSLA with combo (0.8999999999999999, 40)\n", - "Surface Loss for TSLA: 0.008321188423074236\n", - "Done processing combo: (0.8999999999999999, 40)\n", - "Processing AAPL with combo (0.8999999999999999, 50)\n", - "Shape of chain_editable[AAPL]: (1142, 22)\n", - "Done for AAPL with combo (0.8999999999999999, 50)\n", - "Surface Loss for AAPL: 0.009897304020647051\n", - "Processing MSFT with combo (0.8999999999999999, 50)\n", - "Shape of chain_editable[MSFT]: (1470, 22)\n", - "Done for MSFT with combo (0.8999999999999999, 50)\n", - "Surface Loss for MSFT: 0.0035000520580062344\n", - "Processing GOOGL with combo (0.8999999999999999, 50)\n", - "Shape of chain_editable[GOOGL]: (1034, 22)\n", - "Done for GOOGL with combo (0.8999999999999999, 50)\n", - "Surface Loss for GOOGL: 0.00572727446502046\n", - "Processing AMZN with combo (0.8999999999999999, 50)\n", - "Shape of chain_editable[AMZN]: (1050, 22)\n", - "Done for AMZN with combo (0.8999999999999999, 50)\n", - "Surface Loss for AMZN: 0.0021785396051152268\n", - "Processing TSLA with combo (0.8999999999999999, 50)\n", - "Shape of chain_editable[TSLA]: (1744, 22)\n", - "Done for TSLA with combo (0.8999999999999999, 50)\n", - "Surface Loss for TSLA: 0.0071140129834379616\n", - "Done processing combo: (0.8999999999999999, 50)\n", - "Processing AAPL with combo (0.8999999999999999, 60)\n", - "Shape of chain_editable[AAPL]: (1142, 22)\n", - "Done for AAPL with combo (0.8999999999999999, 60)\n", - "Surface Loss for AAPL: 0.009897304020647051\n", - "Processing MSFT with combo (0.8999999999999999, 60)\n", - "Shape of chain_editable[MSFT]: (1470, 22)\n", - "Done for MSFT with combo (0.8999999999999999, 60)\n", - "Surface Loss for MSFT: 0.0035000520580062344\n", - "Processing GOOGL with combo (0.8999999999999999, 60)\n", - "Shape of chain_editable[GOOGL]: (1034, 22)\n", - "Done for GOOGL with combo (0.8999999999999999, 60)\n", - "Surface Loss for GOOGL: 0.00572727446502046\n", - "Processing AMZN with combo (0.8999999999999999, 60)\n", - "Shape of chain_editable[AMZN]: (1050, 22)\n", - "Done for AMZN with combo (0.8999999999999999, 60)\n", - "Surface Loss for AMZN: 0.0021785396051152268\n", - "Processing TSLA with combo (0.8999999999999999, 60)\n", - "Shape of chain_editable[TSLA]: (1744, 22)\n", - "Done for TSLA with combo (0.8999999999999999, 60)\n", - "Surface Loss for TSLA: 0.0071140129834379616\n", - "Done processing combo: (0.8999999999999999, 60)\n" - ] - } - ], - "source": [ - "all_combos = []\n", - "for combo_choice in combos:\n", - " meta={}\n", - " _k_grid_editable = {}\n", - " _t_grid_editable = {}\n", - " _market_iv_grid_editable = {}\n", - " _fwd_grid_editable = {}\n", - " _atm_iv_editable = {}\n", - " _atm_T_editable = {}\n", - " # print(f\"Testing combo: {combo_choice}\")\n", - "\n", - " PRICING_CONFIG['VOL_SURFACE_WIDTH'] = combo_choice[0]\n", - " PRICING_CONFIG['VOL_SURFACE_MIN_DTE_THRESHOLD'] = combo_choice[1]\n", - " meta['VOL_SURFACE_WIDTH'] = combo_choice[0]\n", - " meta['VOL_SURFACE_MIN_DTE_THRESHOLD'] = combo_choice[1]\n", - " meta['TICK_PARAMS'] = {}\n", - " for tick in chain_editable:\n", - " # if tick != 'AAPL' or combo_choice[1] != 0:\n", - " # continue\n", - " print(f\"Processing {tick} with combo {combo_choice}\")\n", - " chain_editable[tick] = confine_chain_with_pricing_config(chains[tick])\n", - " print(f\"Shape of chain_editable[{tick}]: {chain_editable[tick].shape}\")\n", - " chain_editable[tick]['vol'] = chain_editable[tick]['crr_vol_discrete']\n", - " (var0_hat, var_inf_hat, kappa_hat), atm_loss = get_best_params(\n", - " get_atm_T_maturities_on_chain(chain_editable[tick]),\n", - " get_atm_T_vols_on_chain(chain_editable[tick])\n", - " )\n", - " params[tick] = {\n", - " 'var0_hat': var0_hat,\n", - " 'var_inf_hat': var_inf_hat,\n", - " 'kappa_hat': kappa_hat,\n", - " 'atm_loss': atm_loss\n", - " }\n", - " _k_grid_editable[tick] = get_K_grid(chain_editable[tick])\n", - " _t_grid_editable[tick] = get_T_grid(chain_editable[tick])\n", - " _market_iv_grid_editable[tick] = get_market_iv_grid(chain_editable[tick])\n", - " _fwd_grid_editable[tick] = get_fwd_grid(chain_editable[tick])\n", - "\n", - " eta_hat, lambda_hat, rho_hat, best_loss = get_surface_params(\n", - " get_K_grid(chain_editable[tick]),\n", - " get_T_grid(chain_editable[tick]),\n", - " get_fwd_grid(chain_editable[tick]),\n", - " params[tick]['var0_hat'],\n", - " params[tick]['var_inf_hat'],\n", - " params[tick]['kappa_hat'],\n", - " get_market_iv_grid(chain_editable[tick])\n", - " )\n", - " params[tick].update({\n", - " 'eta_hat': eta_hat,\n", - " 'lambda_hat': lambda_hat,\n", - " 'rho_hat': rho_hat,\n", - " 'surface_loss': best_loss\n", - " })\n", - " meta['TICK_PARAMS'][tick] = params[tick]\n", - " print(f\"Done for {tick} with combo {combo_choice}\")\n", - " print(f\"Surface Loss for {tick}: {params[tick]['surface_loss']}\")\n", - " print(f\"Done processing combo: {combo_choice}\")\n", - " all_combos.append({\n", - " 'meta': meta,\n", - " 'k_grid': _k_grid_editable,\n", - " 't_grid': _t_grid_editable,\n", - " 'market_iv_grid': _market_iv_grid_editable,\n", - " 'fwd_grid': _fwd_grid_editable\n", - " })\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
VOL_SURFACE_WIDTHVOL_SURFACE_MIN_DTE_THRESHOLDmean_surface_loss
00.500.026257
10.5100.005381
20.5200.004007
30.5300.003170
40.5400.002146
50.5500.001695
60.5600.001695
70.600.037022
80.6100.006848
90.6200.005369
100.6300.004506
110.6400.002802
120.6500.002288
130.6600.002288
140.700.042242
150.7100.007557
160.7200.006201
170.7300.005403
180.7400.003571
190.7500.003135
200.7600.003135
210.800.043829
220.8100.008377
230.8200.006979
240.8300.006166
250.8400.004459
260.8500.004000
270.8600.004000
280.900.046104
290.9100.010033
300.9200.008603
310.9300.007830
320.9400.006261
330.9500.005683
340.9600.005683
\n", - "
" - ], - "text/plain": [ - " VOL_SURFACE_WIDTH VOL_SURFACE_MIN_DTE_THRESHOLD mean_surface_loss\n", - "0 0.5 0 0.026257\n", - "1 0.5 10 0.005381\n", - "2 0.5 20 0.004007\n", - "3 0.5 30 0.003170\n", - "4 0.5 40 0.002146\n", - "5 0.5 50 0.001695\n", - "6 0.5 60 0.001695\n", - "7 0.6 0 0.037022\n", - "8 0.6 10 0.006848\n", - "9 0.6 20 0.005369\n", - "10 0.6 30 0.004506\n", - "11 0.6 40 0.002802\n", - "12 0.6 50 0.002288\n", - "13 0.6 60 0.002288\n", - "14 0.7 0 0.042242\n", - "15 0.7 10 0.007557\n", - "16 0.7 20 0.006201\n", - "17 0.7 30 0.005403\n", - "18 0.7 40 0.003571\n", - "19 0.7 50 0.003135\n", - "20 0.7 60 0.003135\n", - "21 0.8 0 0.043829\n", - "22 0.8 10 0.008377\n", - "23 0.8 20 0.006979\n", - "24 0.8 30 0.006166\n", - "25 0.8 40 0.004459\n", - "26 0.8 50 0.004000\n", - "27 0.8 60 0.004000\n", - "28 0.9 0 0.046104\n", - "29 0.9 10 0.010033\n", - "30 0.9 20 0.008603\n", - "31 0.9 30 0.007830\n", - "32 0.9 40 0.006261\n", - "33 0.9 50 0.005683\n", - "34 0.9 60 0.005683" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "surface_meta_mean = []\n", - "for m in all_combos:\n", - " data={}\n", - " data['VOL_SURFACE_WIDTH'] = m['meta']['VOL_SURFACE_WIDTH']\n", - " data['VOL_SURFACE_MIN_DTE_THRESHOLD'] = m['meta']['VOL_SURFACE_MIN_DTE_THRESHOLD']\n", - " data['mean_surface_loss'] = np.mean(\n", - " [v['surface_loss'] for v in m['meta']['TICK_PARAMS'].values()]\n", - " )\n", - " surface_meta_mean.append(data) \n", - "\n", - "error_df = pd.DataFrame(surface_meta_mean)\n", - "error_df" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
VOL_SURFACE_MIN_DTE_THRESHOLD0102030405060
VOL_SURFACE_WIDTH
0.50.0262570.0053810.0040070.0031700.0021460.0016950.001695
0.60.0370220.0068480.0053690.0045060.0028020.0022880.002288
0.70.0422420.0075570.0062010.0054030.0035710.0031350.003135
0.80.0438290.0083770.0069790.0061660.0044590.0040000.004000
0.90.0461040.0100330.0086030.0078300.0062610.0056830.005683
\n", - "
" - ], - "text/plain": [ - "VOL_SURFACE_MIN_DTE_THRESHOLD 0 10 20 30 \\\n", - "VOL_SURFACE_WIDTH \n", - "0.5 0.026257 0.005381 0.004007 0.003170 \n", - "0.6 0.037022 0.006848 0.005369 0.004506 \n", - "0.7 0.042242 0.007557 0.006201 0.005403 \n", - "0.8 0.043829 0.008377 0.006979 0.006166 \n", - "0.9 0.046104 0.010033 0.008603 0.007830 \n", - "\n", - "VOL_SURFACE_MIN_DTE_THRESHOLD 40 50 60 \n", - "VOL_SURFACE_WIDTH \n", - "0.5 0.002146 0.001695 0.001695 \n", - "0.6 0.002802 0.002288 0.002288 \n", - "0.7 0.003571 0.003135 0.003135 \n", - "0.8 0.004459 0.004000 0.004000 \n", - "0.9 0.006261 0.005683 0.005683 " - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "error_df.pivot_table(\n", - " index=\"VOL_SURFACE_WIDTH\", \n", - " columns=\"VOL_SURFACE_MIN_DTE_THRESHOLD\", \n", - " values=\"mean_surface_loss\", \n", - " aggfunc='sum'\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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D2fmzJmMGzcOGxsbGjduzIABA+64/zZms9n8T154UXLt1QcKuguSS3Vqefz/IClwiVdSCroLkgtpyVm3e5fCJ/lSckF3QXIpIy2joLsgcs9I/2xbQXfhHwszfnLX2g4yvHHX2i5sVBEVERERERHJJdO9X8fLF0pERUREREREcslUSKbmFnXarEhERERERETylSqiIiIiIiIiuaSpuXlDFVERERERERHJV6qIioiIiIiI5JIJVUTzgiqiIiIiIiIikq9UERUREREREcklrRHNG6qIioiIiIiISL5SRVRERERERCSXdB/RvKFEVEREREREJJc0NTdvaGquiIiIiIiI5CtVREVERERERHJJFdG8oYqoiIiIiIiI5CtVREVERERERHJJmxXlDVVERUREREREJF+pIioiIiIiIpJLWiOaN1QRFRERERERkXyliqiIiIiIiEgumVBFNC8oERUREREREcklbVaUNzQ1V0RERERERPKVKqIiIiIiIiK5pM2K8oYqoiIiIiIiIpKvVBEVERERERHJJVVE84YqoiIiIiIiIpKvVBEVERERERHJJVVE84YqoiIiIiIiIpKvVBEVERERERHJJd1HNG+oIioiIiIiIiL5ShVRERERERGRXNIa0byhRFRERERERCSXlIjmDU3NFRERERERkXyliqiIiIiIiEgumdBmRXlBFVERERERERHJV6qIioiIiIiI5JLWiOYNVURFREREREQkX6kiKiIiIiIikkuqiOaNQl8RzcjIKOguiIiIiIiISB4qNBXRgwcP4uXlRYUKFTCZTCxdupRff/0Vo9GIp6cnDz30EN27d8fGxqaguyoiIiIiIsWUKqJ5o9AkorNnz+aFF14AYMWKFaxdu5YePXrg7+9PdHQ0y5YtA+CRRx4pwF6KiIiIiEhxZjLr9i15odAkonFxcZQuXRqArVu3MnDgQJo2bQpAnTp18PX1Zfbs2UUyEbVv3g2Hdo9jU9ILU/QpUpdOwxQVmmO8Xe1WOHbqj42XL+a486Su+paM47st5x0efAr7um2wMZSGjHRM506Suvo7TFEnALCtfD/OwyZl2/b1yUMxnQ0DwMavEiV6voRt+WqYrxpJ37qCtI2L8+6FFzF9qz/EwJrdKO1s4MTlM4zbMZPD8eE5xj9UsSmv1OuNv1tpIpMuMHHvD/x+7oBVzMt1n6BXtQ64O7qw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CxcSFxeHn58fffv2pV6920suNm/enO1yyFsbJsXHx/PFF19w9uxZUlJSKFWqFI0aNeLRRx+94yWRhSYRDQ8PZ/z48ZQoUYJatWpZdnRKTEwkJCSElJQURo8eTeXKle+4bSWiRYcS0aJBiWjRoES0aFAiWnQoERXJO0pEs3eniWhRVmim5n733Xc0bdqUQYMGYfOXRdNms5kZM2Ywa9Ysxo8fX0A9FBERERGR4s5UKMp4RV+h2XouMjKSLl26ZElCIXPHsS5dulgWwoqIiIiIiEjRVWgqogaDgfDwcMqVK5ft+fDw8H+9tbCIiIiIiMi/kVE4VjYWeYUmEX344Yf55ptviIiIyLJG9MiRI2zYsIGnnnqqgHspIiIiIiIi/1ahSUQfeugh3N3dWb16NevXr8d068bVtrYEBgYyZMgQmjVrVsC9FBERERGR4kxrRPNGoUlEAZo1a0azZs1IT0/nypUrAJQsWRJ7+0LVTRERERERKaYylIjmiUKZ4dnb2+Pp6VnQ3RAREREREZG7oFAmoiIiIiIiIoWRpubmjUJz+xYREREREREpHlQRFRERERERySXdviVvqCIqIiIiIiIi+UoVURERERERkVy6eZdJ+ZdUERUREREREZF8pYqoiIiIiIhILuk+onlDiaiIiIiIiEgu6fYteUNTc0VERERERCRfqSIqIiIiIiKSS7p9S95QRVRERERERETylSqiIiIiIiIiuaQ1onlDFVERERERERHJV6qIioiIiIiI5JJu35I3VBEVERERERGRfKWKqIiIiIiISC6ZtGtunlAiKiIiIiIikkuamps3NDVXRERERERE8pUqoiIiIiIiIrmk27fkDVVERUREREREJF+pIioiIiIiIpJLWiOaN1QRFRERERERkXyliqiIiIiIiEgumbRINE+oIioiIiIiIiL5ShVRERERERGRXNIa0byhRFRERERERCSXNDM3b2hqroiIiIiIiOQrVURFRERERERySVNz84YqoiIiIiIiIpKvVBEVERERERHJJZNZJdG8oIqoiIiIiIiI5CtVREVERERERHJJa0TzRrFIRF3e71/QXZBcSpyzqKC7ILlww3ijoLsguZB2Pa2guyC5kJ6SXtBdkFwypZsKugsiIveMYpGIioiIiIiI5IUMrRHNE0pERUREREREcimjEE2OWLduHStXrsRoNBIQEMCAAQOoUqVKjvE7duxg0aJFxMXF4evrS9++falXr57l/K5du/j111+JiIjg6tWrfPzxx1SsWNGqjdTUVObOncv27dtJS0ujdu3aDBw4EIPBcEd912ZFIiIiIiIiRcz27duZO3cuPXv2ZMKECQQEBDB+/HgSExOzjQ8NDeWzzz6jXbt2TJgwgYYNGzJx4kSioqIsMSkpKQQHB9O3b98crztnzhz27dvHa6+9xtixY7l8+TKTJk264/4rERUREREREcmlDLP5rj3uxKpVq2jfvj1t27bF39+fQYMG4ejoyKZNm7KNX7NmDXXq1KFbt274+/vTu3dvAgMDWbdunSWmVatW9OzZk1q1amXbRnJyMhs3bqR///7UrFmTwMBAhgwZQmhoKGFhYXfUfyWiIiIiIiIihUBaWhrJyclWj7S0rJsPpqenExERYZUw2traUqtWrRwTwrCwsCwJZu3atTl58mSu+xcREUFGRoZVO+XKlcPb2/uOE1GtERUREREREcmlDNPd26xo2bJlLFmyxOpYz5496dWrl9WxpKQkTCZTlnWZBoOB6OjobNs2Go14eHhYHfPw8MBoNOa6f0ajEXt7e1xdXf9VO6BEVEREREREpFDo0aMHXbt2tTrm4OBQQL25u5SIioiIiIiI5NLdvH2Lg4NDrhJPd3d3bG1ts1QhjUZjjrvXGgyGLBsZJSYm3tFutwaDgfT0dK5du2ZVFb3TdkBrREVERERERIoUe3t7AgMDCQkJsRwzmUyEhIQQFBSU7XOCgoI4cuSI1bHDhw9TtWrVXF83MDAQOzs7q3aio6OJj4/P8bo5voY7ihYRERERESnGCst9RLt27cq0adMIDAykSpUqrFmzhpSUFNq0aQPA1KlT8fLyok+fPgB07tyZMWPGsHLlSurVq8e2bds4deoUzz//vKXNq1evEh8fT0JCAoBlvanBYMBgMODi4kK7du2YO3cubm5uuLi4MGvWLIKCgpSIioiIiIiI3OuaNWtGUlISixcvxmg0UrFiRUaNGmWZIhsfH4+NjY0lvlq1agwfPpyFCxeyYMEC/Pz8GDFiBBUqVLDE7N27l+nTp1u+njJlCmC9YVL//v2xsbFh0qRJpKenU7t2bQYOHHjH/bcxm+/iJOdCwmz8oaC7ILlUZs6igu6C5MIN442C7oLkQtr1rNu9S+GTei21oLsguWRKLyRlEJF7gPnLnQXdhX/s0VX971rbS7vOuWttFzaqiIqIiIiIiOTS3bx9S3GizYpEREREREQkX6kiKiIiIiIikkt38/YtxYkqoiIiIiIiIpKvVBEVERERERHJpcJy+5aiThVRERERERERyVeqiIqIiIiIiOSS1ojmDVVERUREREREJF+pIioiIiIiIpJLqojmDSWiIiIiIiIiuZRhUiKaFzQ1V0RERERERPKVKqIiIiIiIiK5lKGCaJ5QRVRERERERETylSqiIiIiIiIiuaQ1onlDFVERERERERHJV6qIioiIiIiI5JJu35I3VBEVERERERGRfKWKqIiIiIiISC5pjWjeUCIqIiIiIiKSS7p9S97Q1FwRERERERHJV6qIioiIiIiI5JKm5uYNVURFREREREQkX6kiKiIiIiIikku6fUveUEVURERERERE8pUqoiIiIiIiIrmkimjeUEVURERERERE8lWhrYgmJCTw22+/ERMTg8FgoH379pQrV66guyUiIiIiIsVYhqmge3BvKDQV0X79+pGUlATAuXPneO2119i6dSvp6ekcOHCAt956izNnzhRwL0VEREREpDjLMJvv2qM4KTQV0bS0NMw33/z58+dTvXp13njjDezs7DCZTHz++ecsWLCAt956q4B7eufm/biHmfN2EH/pKsFVy/DO6w9xf42cq7vrNhzjs683c/6CkYDyXrwxtD2tm1cFIC09g8++2sTv28M5d96Im1sJmjWsxGtD21OmdEmrdjZvPcn0WVsIDY+lhKM9DetWYNrEJwC4nJjMiPeWExp+EWPidUp5utKuVRCvvdgON7cSd+/NKOQG3N+ZIfUfxcfFk6Pxpxm1+WsOXDyZY/zDVZrzVtN+lHf3IcIYzQfbZrMhcp9VzJtN+tKvZkfcS7iyJ/o4IzZN57TxguX83me/pYJ7GavnfLBtDl/sXZLlepU8/NjQZwoZZhNVv3ryX77aomtQw24Mb/Y4Zdy8CIk5xYi109gXHZpj/CP3teKdtv2pYPDl1KXzvP/bt6wP320VM7pNf/rX64SHkxs7zx7ltdWfcyrhfJa2HO0c2DjwC+73rUzzrwZz5OIpy7kaPpWY1Pkl6pWrRvw1I1/vXsFn2xfn3QsvYl5o8givtu5NGTcvjlwI57WfP2fvuRM5xj9aqzXvPfAcAZ6+hF86xztrv+aX0F1WMe8+8CzPNuyK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pKSk8PXXX5OcnExwcDCjRo2y3EPU3t6e7du38+OPP5KWloaPjw9dunTJsq41N2zMZnPhSOnvIrPxh4LuguRSmTmLCroLkgs3jDcKuguSC2nX0/5/kBS41GupBd0FySVTuqmguyByzzB/ubOgu/CPGcY/eNfaNo7+5a61XdhojaiIiIiIiIjkK03NFRERERERyaXCska0qFMiKiIiIiIikktKRPOGpuaKiIiIiIhIvlJFVEREREREJJeKwV6v+UIVUREREREREclXqoiKiIiIiIjkktaI5g1VREVERERERCRfqSIqIiIiIiKSS6qI5g1VREVERERERCRfqSIqIiIiIiKSS6qI5g0loiIiIiIiIrmkRDRvaGquiIiIiIiI5CtVREVERERERHJJFdG8oYqoiIiIiIiI5CtVREVERERERHJJFdG8oYqoiIiIiIiI5CtVREVERERERHJJFdG8oYqoiIiIiIiI5CtVREVERERERHLJbFZFNC+oIioiIiIiIiL5ShVRERERERGRXNIa0byhRFRERERERCSXlIjmDU3NFRERERERkXyliqiIiIiIiEguqSKaN1QRFRERERERkXyliqiIiIiIiEguqSKaN1QRFRERERERkXxlY9YdWYuctLQ0li1bRo8ePXBwcCjo7sjf0FgVDRqnokHjVHRorIoGjVPRoHGSe5UqokVQWloaS5YsIS0traC7Iv+Hxqpo0DgVDRqnokNjVTRonIoGjZPcq5SIioiIiIiISL5SIioiIiIiIiL5SomoiIiIiIiI5CslokWQg4MDPXv21IL1IkBjVTRonIoGjVPRobEqGjRORYPGSe5V2jVXRERERERE8pUqoiIiIiIiIpKvlIiKiIiIiIhIvlIiKiIiIiIiIvlKiaiIiIiIiIjkK/uC7oDcuXXr1rFy5UqMRiMBAQEMGDCAKlWqFHS3iq1jx47x888/c/r0aS5fvswbb7xBo0aNLOfNZjOLFy9mw4YNXLt2jeDgYAYOHIifn18B9rr4WbZsGbt37+b8+fM4OjoSFBREv379KFu2rCUmNTWVuXPnsn37dtLS0qhduzYDBw7EYDAUXMeLofXr17N+/Xri4uIA8Pf3p2fPntStWxfQOBVWy5cvZ/78+XTu3JlnnnkG0FgVBosXL2bJkiVWx8qWLcuUKVMAjVFhkpCQwA8//MDBgwdJSUnB19eXIUOGULlyZUB/T8i9R7vmFjHbt29n6tSpDBo0iKpVq7J69Wp27tzJlClT8PDwKOjuFUsHDhwgNDSUwMBAPvnkkyyJ6PLly1m+fDlDhw7Fx8eHRYsWERUVxeTJk3F0dCzAnhcv48ePp3nz5lSuXJmMjAwWLFjA2bNnmTx5Mk5OTgDMmDGD/fv3M3ToUFxcXJg5cya2trZ88MEHBdz74mXv3r3Y2tri5+eH2Wzm999/5+eff+bjjz+mfPnyGqdCKDw8nE8//RQXFxdq1KhhSUQ1VgVv8eLF7Nq1i3fffddyzNbWFnd3d0BjVFhcvXqVN998kxo1atCxY0fc3d25cOECZcqUwdfXF9DfE3Lv0dTcImbVqlW0b9+etm3b4u/vz6BBg3B0dGTTpk0F3bViq27duvTu3dsq+bzFbDazZs0aHn30URo2bEhAQADDhg3j8uXL7NmzpwB6W3yNHj2aNm3aUL58eSpWrMjQoUOJj48nIiICgOTkZDZu3Ej//v2pWbMmgYGBDBkyhNDQUMLCwgq498VLgwYNqFevHn5+fpQtW5Ynn3wSJycnTp48qXEqhG7cuMEXX3zBCy+8gKurq+W4xqrwsLW1xWAwWB63klCNUeGxYsUKSpUqxZAhQ6hSpQo+Pj7Url3bkoTq7wm5FykRLULS09OJiIigVq1almO2trbUqlVLvzAKqdjYWIxGI/fff7/lmIuLC1WqVNGYFbDk5GQA3NzcAIiIiCAjI8Pq+6tcuXJ4e3trrAqQyWRi27ZtpKSkEBQUpHEqhL799lvq1q1r9XMO9D1VmMTExPDCCy8wbNgwPv/8c+Lj4wGNUWGyd+9eAgMDmTx5MgMHDmTkyJH89ttvlvP6e0LuRVojWoQkJSVhMpmyrNswGAxER0cXTKfkbxmNRoAs06Y9PDws5yT/mUwmZs+eTbVq1ahQoQKQOVb29vZWFR3QWBWUqKgoRo8eTVpaGk5OTrzxxhv4+/sTGRmpcSpEtm3bxunTp/nvf/+b5Zy+pwqHqlWrMmTIEMqWLcvly5dZsmQJ7733HpMmTdIYFSKxsbH8+uuvdOnShR49enDq1Cm+++477O3tadOmjf6ekHuSElERKXZmzpzJ2bNnGTduXEF3RXJQtmxZJk6cSHJyMjt37mTatGmMHTu2oLslfxIfH8/s2bN55513tD6tELu1yRdAQECAJTHdsWOHxq0QMZlMVK5cmT59+gBQqVIloqKi+PXXX2nTpk3Bdk7kLlEiWoS4u7tja2ub5ZMvo9Go3e0KqVvjkpiYiKenp+V4YmIiFStWLJhOFXMzZ85k//79jB07llKlSlmOGwwG0tPTuXbtmlV1IDExUd9fBcDe3t6yNiowMJBTp06xZs0amjVrpnEqJCIiIkhMTOTNN9+0HDOZTBw/fpx169YxevRojVUh5OrqStmyZYmJieH+++/XGBUSnp6e+Pv7Wx3z9/dn165dgP6ekHuT1ogWIfb29gQGBhISEmI5ZjKZCAkJISgoqAB7Jjnx8fHBYDBw5MgRy7Hk5GTCw8M1ZvnMbDYzc+ZMdu/ezXvvvYePj4/V+cDAQOzs7KzGKjo6mvj4eI1VIWAymUhLS9M4FSK1atXik08+4eOPP7Y8KleuTIsWLSz/rbEqfG7cuEFMTAwGg0HfT4VItWrVsiyzio6OpnTp0oD+npB7kyqiRUzXrl2ZNm0agYGBVKlShTVr1pCSkqJpGwXo1i/1W2JjY4mMjMTNzQ1vb286d+7M0qVL8fPzw8fHh4ULF+Lp6UnDhg0LsNfFz8yZM9m6dSsjR47E2dnZMrPAxcUFR0dHXFxcaNeuHXPnzsXNzQ0XFxdmzZpFUFCQfsnns/nz51OnTh28vb25ceMGW7du5dixY4wePVrjVIg4Oztb1ljfUqJECUqWLGk5rrEqeHPnzqVBgwZ4e3tz+fJlFi9ejK2tLS1atND3UyHSpUsX3n33XZYuXUqzZs0IDw9nw4YNPP/88wDY2Njo7wm55+g+okXQunXr+PnnnzEajVSsWJFnn32WqlWrFnS3iq2jR49mu3atdevWDB061HID6t9++43k5GSCg4N57rnnKFu2bAH0tvjq1atXtseHDBli+SDn1o3dt23bRnp6um7sXkC+/PJLQkJCuHz5Mi4uLgQEBNC9e3fLbpEap8JrzJgxVKxY0XIfUY1VwZsyZQrHjx/nypUruLu7ExwcTO/evS1T3zVGhce+ffuYP38+MTEx+Pj40KVLFzp06GA5r78n5F6jRFRERERERETyldaIioiIiIiISL5SIioiIiIiIiL5SomoiIiIiIiI5CsloiIiIiIiIpKvlIiKiIiIiIhIvlIiKiIiIiIiIvlKiaiIiIiIiIjkKyWiIiIiIiIikq+UiIqISJ46evQovXr14ujRo/l+7TFjxvD666/n+3Vzcjf606tXLxYvXvx/4xYvXkyvXr3y9NoiIiJ5xb6gOyAiUpxt3ryZ6dOnW752cHDAzc2NChUqULduXdq2bYuzszMAsbGxDBs2LFftTp06lbi4OMaOHZtjzMsvv0zz5s1zPD9t2jR+//13nJ2dmTFjBo6OjlbnL1y4wMsvvwxAv3796NatW676dicWL17MkiVL/m/cfffdx5gxY/L8+iIiInJ3KBEVESkEevXqhY+PDxkZGRiNRo4dO8acOXNYvXo1I0eOJCAgAHd39yyJ6KpVq7h06RL9+/e3Ou7u7k5cXBwAnTp1onLlylmuGRQU9H/7ZWdnR0pKCnv37qVZs2ZW5/744w8cHBxIS0uzOl69enV++OEH7O3//a+Yxo0b4+vra/n6xo0bfPvttzRq1IhGjRpZjhsMhn99LREREck/SkRFRAqBunXrWiWLPXr0ICQkhI8++oiPP/6YTz/9FCcnJ1q1amX1vO3bt3Pt2rUsx/+sevXqNGnS5B/1y97enuDgYLZt25YlEd22bRv16tVj165dVsdtbW2zVE//qYCAAAICAixfJyUl8e2331KhQoW/fc3/RGpqKvb29tjaatWKiIjI3aZEVESkkKpZsyaPPfYYCxYsYMuWLXTo0KFA+tG8eXNmzJjBtWvXcHV1BSA8PJwLFy7Qp0+fLIno0aNHGTt2LO+//z41atQAMtdKXrlyhVdffZWZM2dy8uRJXF1d6dy5M927d8/zPp87d+5vr3Orjy+//DJnz55l06ZNGI1GZs2ahaurKydPnmTx4sWEhYWRkZFB5cqVefLJJwkODra0cf36dRYtWsSePXu4fPkyLi4uBAQE0LdvXwIDA++oPwCJiYnMnz+f/fv3k5ycTNmyZenSpQtt2rT5v6/3xIkTzJkzh6ioKLy8vO7KNGkREZG8pI99RUQKsVtVv8OHD//jNq5fv05SUlKWh9lsztXzGzduDGCVcG7dupVy5cpRqVKlXPfj6tWrjB8/noCAAJ5++mnKlSvHvHnzOHDgwJ29oDy8zk8//cT+/ft5+OGHefLJJ7G3tyckJIT333+f69ev8/jjj/Pkk0+SnJzMuHHjCA8Ptzx3xowZrF+/nsaNGzNw4EAefvhhHB0dOX/+/B33JzU1lTFjxrBlyxZatGhBv379cHFxYfr06axZs+ZvX29UVBQffvghiYmJPP7447Rp04bFixezZ8+ef/lOioiI3D2qiIqIFGKlSpXCxcWFixcv/uM2vvzyy2yPf/PNN7laW+ns7Ez9+vXZtm0b7dq1w2QysX37djp27HhH/bh8+TLDhg2zJNft2rVjyJAhbNy4kbp1695RW3l1nbS0ND766CPLVGKz2cyMGTOoUaMGo0aNwsbGBoAHHniA1157jYULF/LOO+8AsH//ftq3b8/TTz9taS+76m5u+vPbb79x/vx5XnrpJVq2bGm55pgxY1i4cKHVplV/tWjRIsxmM+PGjcPb2xvI/PDgjTfe+GdvoIiISD5QIioiUsg5OTlx/fr1f/z8nj17Wk0pvcXNzS3XbbRo0YLJkydjNBqJiorCaDTSokWLO+qHk5OTJcmCzPWnVapUITY29o7aycvrtG7d2mo9a2RkJBcuXODRRx/lypUrVrE1a9bkjz/+wGQyYWtri6urK+Hh4SQkJODl5fWv+nPgwAEMBoPVLsb29vZ06tSJzz77jGPHjlG/fv0sbZtMJg4dOkTDhg0tSSiAv78/tWvXzvNqs4iISF5RIioiUsjduHEDDw+Pf/z8ChUqcP/99/+rPtStWxdnZ2e2b99OZGQklStXxtfX946SyFKlSlkqjLe4urpy5syZf9W3f3MdHx8fq68vXLgAZN66JifJycm4ubnRt29fpk2bxosvvkhgYCB169aldevWlClT5o77ExcXh5+fX5aNksqVK2c5n52kpCRSU1Px8/PLcq5s2bJKREVEpNBSIioiUohdunSJ5OTkLMlNfnNwcKBRo0b8/vvvXLx4kccff/yO28iv3Wjv5Dp/3d331rrZfv36UbFixWyf4+TkBECzZs2oXr06u3fv5tChQ6xcuZIVK1bwxhtvWE0B1i68IiIiWSkRFREpxLZs2QJAnTp1CrYjZE7P3bRpEzY2NlZTSO8ltxJ+FxeXXFWRPT09efDBB3nwwQdJTEzkzTffZOnSpXe85rV06dKcOXPGMu33lujoaMv57Li7u+Po6Gip5P7ZreeKiIgURvqYVkSkkAoJCeGnn37Cx8fnjtdj3g01atTgiSee4LnnnsvVJkdFUWBgIGXKlGHlypXcuHEjy/mkpCQgc21mcnKy1TkPDw88PT1JT0+/4+vWrVsXo9HI9u3bLccyMjJYu3YtTk5O3Hfffdk+z9bWltq1a7Nnzx7i4+Mtx8+dO8ehQ4fuuB8iIiL5RRVREZFC4MCBA5w/fx6TyYTRaOTo0aMcPnwYb29vRo4cmWUK6Z04fvw4qampWY4HBAQQEBCQ63ZsbW157LHH/nE/igJbW1sGDx7Mf/7zH1577TXatGmDl5cXCQkJHD16FGdnZ9566y2uX7/O4MGDadKkCQEBATg5OXHkyBFOnTpltYtubnXo0IFff/2V6dOnExERgY+PDzt37iQ0NJRnnnkmxx1zAXr16sXBgwd577336NixIyaTibVr11K+fPk8X38rIiKSV5SIiogUAosXLwYyd0p1c3OjQoUK9O/f/29v25Fba9euzfZ4z5497ygRLS5q1KjB+PHjWbJkCb/88gs3btzAYDBQpUoVHnjgAQBKlCjBgw8+yKFDh9i9ezcmkwlfX18GDhx4x7e1gcy1qmPGjGHevHn8/vvvXL9+nbJlyzJkyBDatGnzt88NCAhg9OjRzJ07l8WLF1OqVCl69erF5cuXlYiKiEihZWPO7R3NRURERERERPKA1oiKiIiIiIhIvlIiKiIiIiIiIvlKiaiIiIiIiIjkKyWiIiIiIiIikq+UiIqIiIiIiEi+UiIqIiIiIiIi+UqJqIiIiIiIiOQrJaIiIiIiIiKSr5SIioiIiIiISL5SIioiIiIiIiL5SomoiIiIiIiI5CsloiIiIiIiIpKv/gflQXfA0IJM5AAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "\n", - "## Plot Heat Map\n", - "import seaborn as sns\n", - "import matplotlib.pyplot as plt\n", - "plt.figure(figsize=(12, 6))\n", - "# heatmap_data = error_df.pivot(index=\"width\", columns=\"DTE_MIN_THRESHOLD\",values=\"surface_loss\")\n", - "heatmap_data = error_df.pivot_table(\n", - " index=\"VOL_SURFACE_WIDTH\", \n", - " columns=\"VOL_SURFACE_MIN_DTE_THRESHOLD\", \n", - " values=\"mean_surface_loss\", \n", - " aggfunc='mean'\n", - ")\n", - "heatmap_data.index = heatmap_data.index.round(2)\n", - "heatmap_data=heatmap_data.iloc[::-1]\n", - "sns.heatmap(heatmap_data, annot=True, fmt=\".4f\", cmap=\"RdYlGn_r\")\n", - "plt.title(\"Surface Loss Heatmap\")\n", - "plt.xlabel(\"DTE Min Threshold\")\n", - "plt.ylabel(\"Width\")\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
rootexpirationstrikerightbid_sizeclosebidask_sizecloseaskdatemidpoint...bs_volintrinsic_valueeu_lower_boundlower_boundupper_boundeuropean_midpointamerican_midpointearly_exercise_premiumeuropean_equivalent_mideuropean_vols_equiv
0TSLA2025-08-22215.0P100.82950.86202507160.840...0.7102510.0000000.0000000.000000215.00.8401680.8348660.0000000.8400000.710251
1TSLA2025-08-22215.0C21107.8518109.5020250716108.675...0.744995106.670013107.589753107.589753215.0108.675066108.6750430.000000108.6750000.744995
2TSLA2025-08-29215.0P31.0261.05202507161.035...0.6781310.0000000.0000000.000000215.01.0349151.0371590.0022441.0327560.677882
3TSLA2025-08-29215.0C26108.0031110.3520250716109.175...0.720999106.670013107.763315107.763315215.0109.174893109.1734170.000000109.1750000.720999
4TSLA2026-07-17210.0P216.30416.502025071616.400...0.5700250.0000000.0000000.000000210.016.39677116.6330260.23625416.1637460.566651
..................................................................
4737TSLA2025-07-18215.0P600.011450.02202507160.015...1.8329290.0000000.0000000.000000215.00.0150040.0146700.0000000.0150001.832929
4738TSLA2025-08-01215.0C1106.8018108.3520250716107.575...0.985578106.670013107.068223107.068223215.0107.575160107.5741730.000000107.5750000.985578
4739TSLA2025-08-01215.0P1200.33280.35202507160.340...0.9264630.0000000.0000000.000000215.00.3400040.3390810.0000000.3400000.926463
4740TSLA2025-08-15215.0C6108.007108.5520250716108.275...0.790612106.670013107.416051107.416051215.0108.275126108.2673840.000000108.2750000.790612
4741TSLA2025-08-15215.0P20.66670.68202507160.670...0.7566180.0000000.0000000.000000215.00.6699920.6694530.0000000.6700000.756618
\n", - "

3883 rows × 31 columns

\n", - "
" - ], - "text/plain": [ - " root expiration strike right bid_size closebid ask_size closeask \\\n", - "0 TSLA 2025-08-22 215.0 P 10 0.82 95 0.86 \n", - "1 TSLA 2025-08-22 215.0 C 21 107.85 18 109.50 \n", - "2 TSLA 2025-08-29 215.0 P 3 1.02 6 1.05 \n", - "3 TSLA 2025-08-29 215.0 C 26 108.00 31 110.35 \n", - "4 TSLA 2026-07-17 210.0 P 2 16.30 4 16.50 \n", - "... ... ... ... ... ... ... ... ... \n", - "4737 TSLA 2025-07-18 215.0 P 60 0.01 145 0.02 \n", - "4738 TSLA 2025-08-01 215.0 C 1 106.80 18 108.35 \n", - "4739 TSLA 2025-08-01 215.0 P 120 0.33 28 0.35 \n", - "4740 TSLA 2025-08-15 215.0 C 6 108.00 7 108.55 \n", - "4741 TSLA 2025-08-15 215.0 P 2 0.66 67 0.68 \n", - "\n", - " date midpoint ... bs_vol intrinsic_value eu_lower_bound \\\n", - "0 20250716 0.840 ... 0.710251 0.000000 0.000000 \n", - "1 20250716 108.675 ... 0.744995 106.670013 107.589753 \n", - "2 20250716 1.035 ... 0.678131 0.000000 0.000000 \n", - "3 20250716 109.175 ... 0.720999 106.670013 107.763315 \n", - "4 20250716 16.400 ... 0.570025 0.000000 0.000000 \n", - "... ... ... ... ... ... ... \n", - "4737 20250716 0.015 ... 1.832929 0.000000 0.000000 \n", - "4738 20250716 107.575 ... 0.985578 106.670013 107.068223 \n", - "4739 20250716 0.340 ... 0.926463 0.000000 0.000000 \n", - "4740 20250716 108.275 ... 0.790612 106.670013 107.416051 \n", - "4741 20250716 0.670 ... 0.756618 0.000000 0.000000 \n", - "\n", - " lower_bound upper_bound european_midpoint american_midpoint \\\n", - "0 0.000000 215.0 0.840168 0.834866 \n", - "1 107.589753 215.0 108.675066 108.675043 \n", - "2 0.000000 215.0 1.034915 1.037159 \n", - "3 107.763315 215.0 109.174893 109.173417 \n", - "4 0.000000 210.0 16.396771 16.633026 \n", - "... ... ... ... ... \n", - "4737 0.000000 215.0 0.015004 0.014670 \n", - "4738 107.068223 215.0 107.575160 107.574173 \n", - "4739 0.000000 215.0 0.340004 0.339081 \n", - "4740 107.416051 215.0 108.275126 108.267384 \n", - "4741 0.000000 215.0 0.669992 0.669453 \n", - "\n", - " early_exercise_premium european_equivalent_mid european_vols_equiv \n", - "0 0.000000 0.840000 0.710251 \n", - "1 0.000000 108.675000 0.744995 \n", - "2 0.002244 1.032756 0.677882 \n", - "3 0.000000 109.175000 0.720999 \n", - "4 0.236254 16.163746 0.566651 \n", - "... ... ... ... \n", - "4737 0.000000 0.015000 1.832929 \n", - "4738 0.000000 107.575000 0.985578 \n", - "4739 0.000000 0.340000 0.926463 \n", - "4740 0.000000 108.275000 0.790612 \n", - "4741 0.000000 0.670000 0.756618 \n", - "\n", - "[3883 rows x 31 columns]" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "european_converted_chain" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "import pandas as pd\n", - "\n", - "# -------------------- American → European (de-Americanize) --------------------\n", - "\n", - "def _eep_baw_or_bs2002(option_type: str, S: float, K: float, T: float,\n", - " r: float, q: float, sigma: float,\n", - " discrete_divs: list[tuple[float, float]] | None = None) -> float:\n", - " \"\"\"\n", - " Estimate Early Exercise Premium (EEP) for an American vanilla option.\n", - " Returns EEP >= 0 to subtract from the American price to get European price.\n", - " TODO: Plug in your existing BAW or Bjerksund-Stensland implementation here.\n", - " \"\"\"\n", - " # e.g., price_A = bjerksund_stensland_2002(...)\n", - " # price_E = black_scholes(...)\n", - " # return max(price_A - price_E, 0.0)\n", - " raise NotImplementedError(\"Wire your BAW/BS2002 here\")\n", - "\n", - "def _invert_black_for_iv(option_type: str, S: float, K: float, T: float,\n", - " r: float, q: float, price_euro: float,\n", - " iv_init: float | None = None, tol: float = 1e-7, max_iter: int = 50) -> float:\n", - " \"\"\"\n", - " Solve for Black-Scholes European IV given a target European price.\n", - " Use your existing robust IV solver; this is just an interface shim.\n", - " \"\"\"\n", - " # TODO: call your existing implied vol solver\n", - " raise NotImplementedError(\"Connect to your IV solver here\")\n", - "\n", - "def de_americanize_quotes(df: pd.DataFrame,\n", - " r: float, q: float,\n", - " discrete_divs: list[tuple[float, float]] | None = None,\n", - " eep_iters: int = 2) -> pd.DataFrame:\n", - " \"\"\"\n", - " Convert American mid prices to European-equivalent IVs by iterating:\n", - " 1) start with df['mid_iv'] (or a seed) as sigma\n", - " 2) estimate EEP with BAW/BS2002\n", - " 3) price_E = price_A - EEP\n", - " 4) invert for sigma_E (European IV)\n", - " A couple iterations are usually plenty.\n", - " Expects columns: ['right','S','strike','t','mid_price','mid_iv']\n", - " Returns: new column 'euro_iv'\n", - " \"\"\"\n", - " out = df.copy()\n", - " # seed: use current iv if present\n", - " if 'mid_iv' in out:\n", - " out['euro_iv'] = pd.to_numeric(out['mid_iv'], errors='coerce')\n", - " else:\n", - " out['euro_iv'] = np.nan\n", - "\n", - " for _ in range(eep_iters):\n", - " next_iv = []\n", - " for _, row in out.iterrows():\n", - " right = str(row['right']).upper()[0]\n", - " S = float(row['S']); K = float(row['strike'])\n", - " T = float(row['t']); Pm = float(row['mid_price'])\n", - " iv = float(row['euro_iv']) if np.isfinite(row['euro_iv']) else 0.20 # fallback seed\n", - "\n", - " # EEP estimate (depends on IV)\n", - " eep = _eep_baw_or_bs2002(right, S, K, T, r, q, iv, discrete_divs)\n", - " price_euro = max(Pm - eep, 0.0)\n", - "\n", - " # invert to new IV_E\n", - " iv_e = _invert_black_for_iv(right, S, K, T, r, q, price_euro, iv_init=iv)\n", - " next_iv.append(iv_e)\n", - " out['euro_iv'] = next_iv\n", - " return out\n", - "\n", - "# -------------------- D(T) via box spreads; F(T) via parity -------------------\n", - "\n", - "def _compute_discount_from_box(expiry_df: pd.DataFrame) -> float:\n", - " \"\"\"\n", - " Estimate D(T) using box spreads:\n", - " D ≈ ((C(K1)-C(K2)) - (P(K1)-P(K2))) / (K2 - K1), averaged over pairs.\n", - " Expects: euro call/put prices in columns ['call_euro_price','put_euro_price'] at same expiry.\n", - " \"\"\"\n", - " df = expiry_df.dropna(subset=['strike','call_euro_price','put_euro_price']).sort_values('strike')\n", - " Ks = df['strike'].to_numpy()\n", - " C = df['call_euro_price'].to_numpy()\n", - " P = df['put_euro_price'].to_numpy()\n", - "\n", - " Ds = []\n", - " for i in range(len(Ks) - 1):\n", - " K1, K2 = Ks[i], Ks[i+1]\n", - " C1, C2 = C[i], C[i+1]\n", - " P1, P2 = P[i], P[i+1]\n", - " denom = (K2 - K1)\n", - " if denom > 0:\n", - " Ds.append(((C1 - C2) - (P1 - P2)) / denom)\n", - " Ds = np.array([d for d in Ds if np.isfinite(d) and d > 0])\n", - " if len(Ds) == 0:\n", - " raise ValueError(\"Could not infer discount factor from box spreads at this expiry.\")\n", - " # robust location\n", - " return float(np.median(np.clip(Ds, 1e-6, 1.0)))\n", - "\n", - "def _vega_spread_weights(df: pd.DataFrame) -> np.ndarray:\n", - " \"\"\"\n", - " w = vega / (1 + rel_spread), clipped to avoid extremes.\n", - " Expects 'vega' and optional 'rel_spread'.\n", - " \"\"\"\n", - " vega = pd.to_numeric(df['vega'], errors='coerce').fillna(0.0).to_numpy()\n", - " rs = pd.to_numeric(df.get('rel_spread', np.nan), errors='coerce').to_numpy()\n", - " rs = np.where(np.isfinite(rs) & (rs > 0), rs, 0.0)\n", - " w = vega / (1.0 + rs)\n", - " return np.where(np.isfinite(w), np.clip(w, 0.0, np.nanpercentile(w, 95)), 0.0)\n", - "\n", - "def infer_forward_from_parity(expiry_df: pd.DataFrame, D: float) -> float:\n", - " \"\"\"\n", - " With Europeanized prices and discount D(T), get per-strike F_i = K + (C - P)/D,\n", - " then return a robust, weighted estimator F*.\n", - " Expects: columns ['strike','call_euro_price','put_euro_price','vega','rel_spread'].\n", - " \"\"\"\n", - " K = pd.to_numeric(expiry_df['strike'], errors='coerce').to_numpy()\n", - " C = pd.to_numeric(expiry_df['call_euro_price'], errors='coerce').to_numpy()\n", - " P = pd.to_numeric(expiry_df['put_euro_price'], errors='coerce').to_numpy()\n", - " Fi = K + (C - P) / max(D, 1e-8)\n", - "\n", - " w = _vega_spread_weights(expiry_df)\n", - " mask = np.isfinite(Fi) & (w > 0)\n", - " if mask.sum() < 3:\n", - " return float(np.nanmedian(Fi))\n", - "\n", - " # trimmed, weighted median\n", - " Fi, w = Fi[mask], w[mask] ## Keep finite values\n", - " lo, hi = np.nanpercentile(Fi, [10, 90]) ## Filter out extremes\n", - " keep = (Fi >= lo) & (Fi <= hi) ## Extreme filtered mask\n", - " Fi, w = Fi[keep], w[keep] ## Apply mask\n", - " # weighted median\n", - " order = np.argsort(Fi) ## Produce sorted indices for Implied Forward.\n", - " Fi, w = Fi[order], w[order] ## Reorder by Implied Forward\n", - " csum = np.cumsum(w) / np.sum(w) ## Cumsum to get cumulative weights\n", - " j = np.searchsorted(csum, 0.5) ## Pick the index where cumulative weight crosses 0.5\n", - " return float(Fi[min(j, len(Fi)-1)])\n", - "\n", - "def recompute_log_moneyness(df: pd.DataFrame, F_star: float) -> pd.DataFrame:\n", - " out = df.copy()\n", - " out['log_moneyness'] = np.log(pd.to_numeric(out['strike'], errors='coerce') / float(F_star))\n", - " return out\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[0;31mSignature:\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msearchsorted\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mv\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mside\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'left'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msorter\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mDocstring:\u001b[0m\n", - "Find indices where elements should be inserted to maintain order.\n", - "\n", - "Find the indices into a sorted array `a` such that, if the\n", - "corresponding elements in `v` were inserted before the indices, the\n", - "order of `a` would be preserved.\n", - "\n", - "Assuming that `a` is sorted:\n", - "\n", - "====== ============================\n", - "`side` returned index `i` satisfies\n", - "====== ============================\n", - "left ``a[i-1] < v <= a[i]``\n", - "right ``a[i-1] <= v < a[i]``\n", - "====== ============================\n", - "\n", - "Parameters\n", - "----------\n", - "a : 1-D array_like\n", - " Input array. If `sorter` is None, then it must be sorted in\n", - " ascending order, otherwise `sorter` must be an array of indices\n", - " that sort it.\n", - "v : array_like\n", - " Values to insert into `a`.\n", - "side : {'left', 'right'}, optional\n", - " If 'left', the index of the first suitable location found is given.\n", - " If 'right', return the last such index. If there is no suitable\n", - " index, return either 0 or N (where N is the length of `a`).\n", - "sorter : 1-D array_like, optional\n", - " Optional array of integer indices that sort array a into ascending\n", - " order. They are typically the result of argsort.\n", - "\n", - " .. versionadded:: 1.7.0\n", - "\n", - "Returns\n", - "-------\n", - "indices : int or array of ints\n", - " Array of insertion points with the same shape as `v`,\n", - " or an integer if `v` is a scalar.\n", - "\n", - "See Also\n", - "--------\n", - "sort : Return a sorted copy of an array.\n", - "histogram : Produce histogram from 1-D data.\n", - "\n", - "Notes\n", - "-----\n", - "Binary search is used to find the required insertion points.\n", - "\n", - "As of NumPy 1.4.0 `searchsorted` works with real/complex arrays containing\n", - "`nan` values. The enhanced sort order is documented in `sort`.\n", - "\n", - "This function uses the same algorithm as the builtin python `bisect.bisect_left`\n", - "(``side='left'``) and `bisect.bisect_right` (``side='right'``) functions,\n", - "which is also vectorized in the `v` argument.\n", - "\n", - "Examples\n", - "--------\n", - ">>> np.searchsorted([1,2,3,4,5], 3)\n", - "2\n", - ">>> np.searchsorted([1,2,3,4,5], 3, side='right')\n", - "3\n", - ">>> np.searchsorted([1,2,3,4,5], [-10, 10, 2, 3])\n", - "array([0, 5, 1, 2])\n", - "\u001b[0;31mFile:\u001b[0m ~/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/numpy/core/fromnumeric.py\n", - "\u001b[0;31mType:\u001b[0m function" - ] - } - ], - "source": [ - "# np.nanpercentile(np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]), [10, 90])\n", - "np.argsort(np.array([1, 2, 3, 4, 5, 6, 7, 8, 11, 10])) # [0 1 2 3 4 5 6 7 8 9]\n", - "np.searchsorted?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Index(['root', 'expiration', 'strike', 'right', 'bid_size', 'closebid',\n", - " 'ask_size', 'closeask', 'date', 'midpoint', 'weighted_midpoint', 'spot',\n", - " 'valuation_date', 'moneyness', 'log_moneyness', 't', 'dte', 'f',\n", - " 'f_moneyness', 'f_log_moneyness', 'div_schedule', 'bs_vol',\n", - " 'intrinsic_value', 'eu_lower_bound', 'lower_bound', 'upper_bound',\n", - " 'european_midpoint', 'american_midpoint', 'early_exercise_premium',\n", - " 'european_equivalent_mid', 'european_vols_equiv', 'vega'],\n", - " dtype='object')" - ] - }, - "execution_count": 119, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "r = get_rates(european_converted_chain['valuation_date'].iloc[0])\n", - "european_converted_chain.columns" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\n", - "['2025-07-18 00:00:00', '2025-07-25 00:00:00', '2025-08-01 00:00:00',\n", - " '2025-08-08 00:00:00', '2025-08-15 00:00:00', '2025-08-22 00:00:00',\n", - " '2025-08-29 00:00:00', '2025-09-19 00:00:00', '2025-10-17 00:00:00',\n", - " '2025-11-21 00:00:00', '2025-12-19 00:00:00', '2026-01-16 00:00:00',\n", - " '2026-02-20 00:00:00', '2026-03-20 00:00:00', '2026-05-15 00:00:00',\n", - " '2026-06-18 00:00:00', '2026-07-17 00:00:00', '2026-09-18 00:00:00',\n", - " '2026-12-18 00:00:00', '2027-01-15 00:00:00', '2027-06-17 00:00:00',\n", - " '2027-12-17 00:00:00']\n", - "Length: 22, dtype: datetime64[ns]" - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "chain_for_box.expiration.unique()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[0;31mSignature:\u001b[0m\n", - "\u001b[0mvectorized_black_scholes_greeks\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mF\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mS\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mfloat\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mK\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mfloat\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mvaluation_dates\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mdatetime\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdatetime\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mend_dates\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mdatetime\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdatetime\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mfloat\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0msigma\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mfloat\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0moption_type\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mUnion\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'c'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mdiv_type\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'discrete'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mdiv_amount\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mdict\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mDocstring:\u001b[0m\n", - "Vectorized Black-Scholes Greeks calculation.\n", - "F: Forward prices (array)\n", - "S: Spot prices (array)\n", - "K: Strike prices (array)\n", - "valuation_dates: List of valuation dates (dates for which the option is priced)\n", - "end_dates: List of end dates (expiration dates of the options)\n", - "r: Risk-free rates (annualized, array)\n", - "sigma: Volatilities (annualized, array)\n", - "option_type: \"c\" for call, \"p\" for put (single string or list of strings)\n", - "div_type: Type of dividend ('discrete' or 'continuous')\n", - "div_amount: Dividend amount (single float or list of floats, ignored for continuous dividends)\n", - "Returns: Greeks (dictionary)\n", - "\u001b[0;31mFile:\u001b[0m ~/cloned_repos/QuantTools/module_test/raw_code/optionlib_2/greeks/numerical/black_scholes.py\n", - "\u001b[0;31mType:\u001b[0m function" - ] - } - ], - "source": [ - "vectorized_black_scholes_greeks?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "div_pv = vectorized_discrete_pv(\n", - " european_converted_chain['div_schedule'].values,\n", - " r = [get_rates(european_converted_chain['valuation_date'].iloc[0].strftime('%Y-%m-%d'))] * len(european_converted_chain),\n", - " _valuation_dates= european_converted_chain['valuation_date'].values,\n", - " _end_dates= european_converted_chain['expiration'].values\n", - ")\n", - "greeks = vectorized_black_scholes_greeks(\n", - " F=european_converted_chain['f'].values,\n", - " S= european_converted_chain['spot'].values,\n", - " K= european_converted_chain['strike'].values,\n", - " valuation_dates= european_converted_chain['valuation_date'].values,\n", - " end_dates= european_converted_chain['expiration'].values,\n", - " r= [get_rates(european_converted_chain['valuation_date'].iloc[0].strftime('%Y-%m-%d'))] * len(european_converted_chain),\n", - " sigma = european_converted_chain['european_vols_equiv'].values,\n", - " option_type= european_converted_chain['right'].str.lower().values,\n", - " div_type='discrete',\n", - " div_amount= div_pv\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "european_converted_chain['vega'] = greeks['vega']\n", - "# european_converted_chain['rel_c'] = greeks['']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 259, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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mejatSs33ngj9957LwEBAaxatYqioiLHPt7e3owfP57Tp0/z2WefcerUKcD+x61p06bEx8e7JHt1zy8Vx7nBYKBbt25cc801vP322/z1r3/ltddec8klhStlr+irVFZWxvbt24mKiuIf//gH99xzD3fffTfLli1z/Du4U245p9cfTzynN7iixsvLC7PZjNlsRinluNbat29fWrduTUpKykVN8J07d+bo0aOOb1muEhQUxKBBg4iJicFkMjFmzBh++OGHStexNU2ja9euPPTQQ3z99de8/PLLzJ49m4ULF9KzZ0+X/hKbzeaLhlJ26NCBhIQETp06xe7du4Hzn3tOTg6FhYVkZ2fTvHlz5s+fT5s2bdwq94kTJzh8+DA33XQTM2bM4PHHH3eMRujevTsTJ050jFpwp9wXft4VvwMJCQmkp6eTn5/v0uPc19eXPn36OPqePPzww2zcuJHk5GTHsaGUIjo6msmTJ7Nnzx6mT5/OP/7xD+bOnUu3bt0IDAx0SfbanF+sVqtjRE6zZs14//33HS1O7pR9//79nD59mrvvvpvp06fz+OOPEx4eDsBNN93EfffdR9OmTd0ut5zT648nntMbVFFTcbAPHjyY3bt3c/z48UrX4/v27Ut2drajubKiSbukpIQbbrgBPz8/l/c1uPCb9Q033EDLli1ZsmSJ4z1UGDx4MNOmTePmm28mJCSEV155hTvvvBNN05z+S1zxuV9//fUcPnyYlJSUSvd37twZg8HguJSj0+lIS0vjX//6F7m5ubzxxhs88cQTmEwmt8ttNBpJTk4mMDCQmJiYSv1UwH7d29mT2dX08644zouKihg8eDCBgYEuP84r2Gw2rr32WhISEli5ciU5OTnA+ab5Hj16MG3aNCZMmEDLli157bXXuPfee10yequm5xedTsdvv/3G3//+d8xmM2+++aZLjvPqZs/JySE1NZXo6GhatmxZ6Tyi0+m47bbbnD5cV87pck6vKY8rao4fP37JSYkqDpy2bdvSvn17R+e8ihNghw4dUEo5mlAr/uF69+7NE088QZMmTer14Llc9gsPcE3THO9l/PjxbNu2jR07djgyVzRPxsfHc+utt/Lggw/Wewe+9PR0fv75Z8cfnQtVZG3WrBm9e/dm+fLllZrXK7Jd+Njg4GAef/xx3nzzTZo3b+62uTVN48yZM5X2h/ofEl2X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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# _compute_discount_from_box(european_converted_chain,\n", - "# )\n", - "\n", - "chain_for_box = european_converted_chain.pivot_table(\n", - " index = ['expiration', 'strike', 'valuation_date',],\n", - " columns = 'right',\n", - " values = ['midpoint', 'closebid', 'closeask', 'vega']\n", - ").reset_index()\n", - "chain_for_box.columns = chain_for_box.columns.map(lambda x: f\"{x[0]}_{x[1]}\" if x[1] != '' else x[0])\n", - "chain_for_box['call_euro_price'] = chain_for_box['midpoint_C']\n", - "chain_for_box['put_euro_price'] = chain_for_box['midpoint_P']\n", - "chain_for_box.drop(columns=['midpoint_C', 'midpoint_P'], inplace=True)\n", - "chain_for_box['rel_spread_c'] = (\n", - " chain_for_box['closeask_C'] - chain_for_box['closebid_C']\n", - ") / chain_for_box['call_euro_price']\n", - "\n", - "chain_for_box['rel_spread_p'] = (\n", - " chain_for_box['closeask_P'] - chain_for_box['closebid_P']\n", - ") / chain_for_box['put_euro_price']\n", - "\n", - "chain_for_box['vega'] = chain_for_box.apply(lambda x: min(x['vega_C'], x['vega_P']), axis=1)\n", - "chain_for_box['rel_spread'] = chain_for_box.apply(\n", - " lambda x: min(x['rel_spread_c'], x['rel_spread_p']), axis=1\n", - ")\n", - "\n", - "\n", - "# chain_for_box.expiration.unique()\n", - "\n", - "D_by_exp = chain_for_box.groupby('expiration').apply(\n", - " lambda df: _compute_discount_from_box(df)\n", - ")\n", - "\n", - "F_by_exp = chain_for_box.groupby('expiration').apply(\n", - " lambda df: infer_forward_from_parity(df, D=D_by_exp[df['expiration'].iloc[0]])\n", - ")\n", - "\n", - "T_by_exp = chain_for_box.groupby('expiration').apply(\n", - " lambda df: time_distance_helper(\n", - " df['expiration'].iloc[0], df['valuation_date'].iloc[0]\n", - " )\n", - ")\n", - "\n", - "implied_discount_premium = r +( np.log(D_by_exp) / T_by_exp)\n", - "\n", - "mkt_f_by_exp = european_converted_chain.groupby('expiration').f.last()\n", - "implied_discount_premium\n", - "F_by_exp.plot()\n", - "mkt_f_by_exp.plot()\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 260, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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XH95g6sZNjQ0lNzcXHPCAzk5OWit+d3vfse9997LX/7yF2JiYli2bBn79+9HKWX8coqMjGTChAl89913bN26FYCNGzeakv9Cuffu3Qu4ukTWrVvHb3/7W2bPns3EiRNp164dubm5df768qfs7te89tiZlJQUTpw4QUlJiWnv9ePHj7N69WrS09MZN24cK1asMFoA3DlTU1MZMGAAb7zxBlVVVYSEhADQqVMnwDV110wNfcbUfq937tyZa665hq+++orDhw9jsVjYunWrKUsDXCi3+2cvJCSEb775ht/+9re8+uqr3HDDDbRt25Zjx475PG9jcstnuvcE4md60BU1NTU1HDp0iMjISOMDMjo6mptvvpnCwkI+//xzAKMZ2Gq10rZtW+x2O2FhYab+9dqmTRv69evHtddey913343T6WTJkiV1junQoQPjx49n+/btfPjhh0bT5JYtW+jYsSPdunUzIzrg+kUTEhJCq1atANe4jrFjxxIaGsoHH3wAuD4w3a9xeno6Q4YMYfbs2TzxxBM8//zzphQIF8rtfv3btGnDwYMH6dixI88++yzXX389U6ZMYdWqVXX+yvWn7O7XvHZTcHh4OFVVVTidTtPe6+Hh4WRlZXHVVVdxxx13EBkZybJlyygrKzOOadWqFT/5yU/Iz8/nnXfe4ciRI4Drl1t8fDw9e/Y0JTs0/jPG/V4PDQ2lf//+9OrVi7/85S/85je/4dlnn/V5t0JDud1jlSorK/nhhx/o2LEjzz33HLfeeisTJkxg4cKFxr+DP+WWz3TvCcTP9KArakJCQqiurqa6uhqttdHXOmTIEFJSUti9e/c5ze/p6ens37/f+AvLLNHR0WRnZ5OYmEh4eDgTJ07kk08+qdOPrZQiKyuLKVOmsGTJEn7729/y4osv8tprrzFo0CBTf4irq6vPmUqZlpZGZmYmR44cYdOmTcCZ172oqIjS0lIKCwu55JJL+Oc//0lqaqpf5T506BC7du3immuu4amnnuL+++83ZiMMGDCAyZMnG7MWzNDY19z9c5CZmcnRo0cpLi427b0eERHBZZddZow7uffee/n666/ZunWr8d7QWtOpUyceeughNm/ezJNPPslzzz3Hyy+/TP/+/YmKijIlOzTtM6ampsaYldO5c2f+8Y9/GK1O/pJ727Zt5OfnM2HCBJ588knuv/9+OnToAMA111zDXXfdRXx8vE8zNya3fKZ7TyB+pgdVUeN+s48cOZJNmzZx8ODBOv3xQ4YMobCw0GiudDdpV1RUMGLECFq3bm36oLLaf1WPGDGC5ORk5s+fb3wPbiNHjuSxxx5j1KhRxMbGMmPGDG6++WaUUj7/IXa/7sOHD2fXrl3s3r27zuPp6emEhoYaXTkWi4Xc3Fz+/Oc/c+LECf74xz/ywAMPEB4e7ne5bTYbW7duJSoqisTExDpjVMDV723GQnaevubu93pZWRkjR44kKirK9Pc6uL6Pfv36kZmZyeLFiykqKgLONM0PHDiQxx57jLvvvpvk5GSeffZZ7rjjDtNmbnn6GWOxWNizZw9/+MMfqK6u5oUXXjD1vX6h3EVFRezdu5dOnTqRnJxc53PEYrFw4403+ny6rnymy2e6pwKuqDl48OB5FyVyv3G6d+9O7969jYF57g/AtLQ0tNZGE6r7H27w4ME88MADtG3b1qtvngtlr/0GV0oZ38tPfvITvv/+e3788Ucjs7t5smfPnlx33XVMmjTJ6wP4jh49yueff2780qnNnbVz584MHjyY9957r07Tujtb7efGxMRw//3388ILL3DJJZf4bW6lFMePH69zPPhmOnRzvubu93qPHj342c9+RnR0tNfe6xfKffYHufv7mDp1Krt372b9+vVGVvfr3rFjR6688kpuu+02kpKSvJK5try8PP74xz8as69q/7t7+hkDEBcXx3/913/x3HPPGbNF/DE3YMxE82Uh0Jyvt68/0y+U3d8/00tKSigrK6t3Kw9//kxvSMAUNQ6Hgzlz5vDf//3f5OTk1HnM/Y8REhKC0+mkvLyc2267ja1bt7JixQrjH6i0tJSwsDDatGkDnPnB8HYV3NjsNTU12O32Opl69+7NsGHDWLhwIZs3b+bZZ59l2bJlPhsRX1NTwz//+U8ee+wxdu/ebeQ7O7vD4SAvL4+f/vSnHDlyhI8++sjoS62pqcFqtRqvO7jGVXjzh9YbuX3115I3svuiCGts7pqaGuOXp/tntn379owZM4aPPvqItWvXMmPGDN555x2fznJyOBy8/PLLPPLII3z77bd1Wo2a+hmjtaZt27ZenSHnjdy+eK97I7cvP9Mbk90fP9MdDgf/+Mc/+O1vf8uzzz7L3/72tzqDrN3Z/e0zvbECoqhZvnw5kydP5siRI8ycOZNbb721zuPuN/KyZcv4yU9+woYNG0hLS+PWW29lwYIF/OMf/2Dbtm289957VFRUkJ6e7pfZf/rTn7Jhw4Zz/koaPXo0+/bt4+mnnwZg7NixPmsG/ve//83Bgwd56qmn+NnPfmas5Kq1rpN98uTJrFu3jvbt2zNp0iS+/vprZs2axXfffcdbb71FXl4e/fv390nmQM4dyNkbm3vSpEn8+OOPxgeo+8P++uuvp6CggJdeeomQkBAmT55szATxtsWLFzN58mTj+ikpKRQWFgJ1V1729DPG279cvZXb2wI1t6fZ/e0zPS8vj//93//l6NGj3HvvvWRlZbFz505j0K87gz9+vjSW369Rn5uby5tvvsnAgQP55S9/Cbj+YSIiIoiIiMBqtVJZWcnf/vY3tm3bxv3338+VV14JwM0330x4eDjffPMNr776Kkoppk2bRufOnf02+xVXXFFn3MaaNWuYM2cOqamp3HfffcbKk96mtaakpISNGzdy6623kpqayp49ezh27BiXXHIJcXFxtGrVijlz5vD9998zdepULr/8cgCuvvpqYmJiWLFiBYsXL6ampobHHnvMJwPGAjV3IGdvSu7a73OlFF9++SWzZ88mJSWF+++/36d/8S1YsICvvvqKhx56iMsuuwyALl261FkDpby8nFdeeYUtW7b4zWeM5Pb9Z3pTsvvLZzrAjz/+SFhYGL/+9a8JCwujV69ebNu2jdatWwOuVpx//etffPvtt37z+eIppc0eRdWA6upqFi9ezKeffsr//d//sWDBAvbv34/WmoSEBG644Qb69u3L7t276dSpExEREUDditnpdFJYWEhcXFxAZHerrKzks88+w2azcfXVV/sst3uvlL179/LMM8/w0ksv8fbbb/Pdd98RFRWF3W4nLS2NRx55hNzcXKKjo+t93QHsdjvR0dGSO0izX0xuN6fTybfffsvJkyd9+j53KyoqIiYmpk6rymuvvca+ffv4n//5HyIiIqiurubAgQN+9RkjuX3/md7U7G5mfaa7X7v58+ezZs0aXnrpJcC1uN4LL7zA6NGjSU1NpXPnzn71+dIUflfUfPPNN0RERHDJJZcQExMDuObKP/300+Tl5ZGdnc2QIUMoLS1l1apVlJaWMnXqVFJTU03foC/Ysh85coSXXnqJbt26UVRUxN13302rVq04cOAAf/zjH/nJT37C9ddfb2r2QM0dyNkDNffZ+RMTE4mNjTXu11obXWXr16/nz3/+M6+99prPusAaIrl9Lxiy1/45Xb9+Pa+++ipdunShbdu2fP3116SmplJVVcWJEye4/fbbueqqq/x2E9DG8Jvupy+++II333yTDh06kJ+fT8eOHRk7diyDBw8mJiaGu+++mwMHDnDdddcZFWRCQgLvvPMOq1evJjU11bQPy2DNHhoaSlRUFGvXruWKK64w1tVo164d48ePZ/HixVx//fWmZA/U3IGcPVBzXyj/DTfcwKWXXmoUW+4P8jZt2hAdHc3WrVvJzMw0LbPkNkewZR8zZgyXXXYZ/fv3Jy4ujoMHD/Lee+/xyCOPcNlll1FWVsaKFSt46623GD58uDE1PhCZXtTU1NTwySefsHLlSu644w6uvPJK9uzZw8qVK/n888/JysrCZrPRp08f+vbtS1hYmPFcdwuHe+Myyd682ePi4khPT2fDhg1GTvcPdGJiIq1atSIvL89YjE5yB2f2QM3dmPyfffYZWVlZ56w1FBsbS3l5ufGLy4y/XCW371sKgjX7qlWr6N+/PzabjeTkZGMczWWXXWbsbN6zZ0/ef/99du/ebeqK3RfL9NlPlZWVlJSUMHz4cLKzs7FarfTs2ZPExETKy8uN6XHh4eF1igKAkydPUlFRYcoqlxDc2d0zU0aMGMGgQYP44Ycf2Ldvn/GX9oEDB+jSpYvPf0kFau5Azh6ouRubv761cxISEoiNjT1nCQZfkty+F8zZa2+NUlVVRWRkZJ1ibMeOHaSkpPjFtOyLYUpLzdGjR0lISEApVWfJdPfeHRaLhfbt21NZWVnvNLeqqirKysqYN28egDEKXbI3X3Z333Dr1q258cYbWbhwIU8++SRXXHEFFRUVbNy4kUmTJgHe/8skUHMHcvZAzd2U/Gf/nCqlqKqqomPHjpw4cQKHw+GzJRQkt29zt7Ts7p+9mJgYiouLefHFF7n66qv58ccf+f7775k4caKxz1Og8mlRs3btWt5++21CQ0OJiIjg6quv5qqrrjIqw9qDCH/44QeSk5OxWq117l+7di1btmzhm2++oUuXLjz66KM+ae1oidndP6A9evTg17/+NYsWLaKoqIiamhp+97vfGeMmvPVLKlBzB3L2QM19sflramrqjCOw2Ww4nU7atGnjk3FAktu3uVtqdvfP6ZVXXonFYmHlypUsW7aM8PDwOj+ngcxnRc2mTZt4++23ufHGG4mPj2fTpk3885//xOl0cuWVV2Kz2YylpKurqzl06BA33HADUHc11MTERI4ePcovfvELMjIyJLsXs9f+iyMkJIQJEyb47C/tQM0dyNkDNXdz5K/9S8r9wf/II4/45K9Wye3b3C05e+2f08svv5whQ4Zw8uRJv56i7SmvFzXuD7adO3fStm1bRo4cidVqJTMzk6qqKj777DMiIyO59NJLjQ/A0tJSysvL6d69O+BqYvvkk0+YNGkSXbp0MXb3lezez75ixQruuece47ze/iUVqLkDOXug5vZWfvcHv7d/SUlu3+aW7Of+nIaEhARVQQM+GCjsfnEPHz5MfHy80QQGcPvttxMaGsq3335bZ5+YzZs30759e2JiYnjttdd49NFHKSwsxOFw+HSjNcn+KAUFBT7NHqi5Azl7oOYO9PySW35GW0p2X2r2lppNmzbx3XffER8fT8+ePY1llPv27cubb76J0+k0/jHatGnDlVdeyZIlSzhy5AjR0dForfn+++85ePAgDz30ENHR0Tz99NN069atuaNKdj/IHqi5Azl7oOYO9PySW35GW0p2MzVbS82JEyf4wx/+wEsvvWSsmPv000+ze/duwLVFfHh4OAsWLKjzvKuvvpqKigr2798PuGYHVVVVERYWxr333ssLL7zg9X8Eye777IGaO5CzB2ruQM8vueVntKVk9wfN0lJTWVnJO++8Q1hYGDNmzDD245g+fTorVqwgNTWVmJgYRo0axfvvv8/IkSNp37690UfYqVMnDh06BLj6Jm+77TZjh19vk+y+zx6ouQM5e6DmDvT8klt+RltKdn/RLC01rVq1IjQ0lOzsbOLi4owFirKysjhy5Ahaa8LDw7n88svp2rUrs2bNoqCgAKUUhYWFFBcXc+mllxrn8+U/gmT3ffZAzR3I2QM1d6Dnl9y+zS3Zzf059QfNtqFl7UWH3HPk//KXv9CqVSvuv/9+47iioiKefPJJampq6NatGzt27KBz58784he/MG0UtmT3ffZAzR3I2QM1t1ug5pfcvifZzcnuD7y6S/dvfvMbRo4cSXZ2trFlgMViIS8vj71797Jr1y6SkpLIzs72VoQmk+y+F6i5IXCzB2put0DNL7l9T7K3DF5bp+bYsWPk5eUZ67JYLBYcDgcWi4WEhAQSEhIYOnSo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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "D_by_exp.plot()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[0;31mSignature:\u001b[0m\n", - "\u001b[0mget_bs_vol_on_chain\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mchain\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mpandas\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcore\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mframe\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDataFrame\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mvaluation_date\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mpandas\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcore\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mseries\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mSeries\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mDocstring:\u001b[0m\n", - "Estimates the Black-Scholes implied volatility for a given option chain.\n", - "\n", - "Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " Expected Columns: `f`, `strike`, `t`, `midpoint`, `right`. \n", - " valuation_date (str): The date of valuation.\n", - " \n", - "Returns:\n", - " pd.Series: The estimated Black-Scholes implied volatility for the option chain.\n", - "\u001b[0;31mFile:\u001b[0m /var/folders/j0/80hkbygd4lb27h9mw76gqzpw0000gn/T/ipykernel_37786/2020857283.py\n", - "\u001b[0;31mType:\u001b[0m function" - ] - } - ], - "source": [ - "get_bs_vol_on_chain?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
expirationstrikevaluation_dateftvariablemidpointrightequalized_iv
02025-07-18110.02025-07-16 16:00:00210.2605550.005476call_euro_price100.375000C3.747594
12025-07-18115.02025-07-16 16:00:00210.2605550.005476call_euro_price95.475000C3.776839
22025-07-18120.02025-07-16 16:00:00210.2605550.005476call_euro_price90.475000C3.533382
32025-07-18130.02025-07-16 16:00:00210.2605550.005476call_euro_price80.475000C3.074212
42025-07-18135.02025-07-16 16:00:00210.2605550.005476call_euro_price75.400000C2.702652
..............................
20192027-12-17420.02025-07-16 16:00:00226.3418742.420260put_euro_price194.528686P0.452546
20202027-12-17425.02025-07-16 16:00:00226.3418742.420260put_euro_price199.261261P0.458920
20212027-12-17430.02025-07-16 16:00:00226.3418742.420260put_euro_price203.994795P0.465294
20222027-12-17435.02025-07-16 16:00:00226.3418742.420260put_euro_price208.727394P0.471543
20232027-12-17440.02025-07-16 16:00:00226.3418742.420260put_euro_price213.459021P0.477792
\n", - "

2024 rows × 9 columns

\n", - "
" - ], - "text/plain": [ - " expiration strike valuation_date f t \\\n", - "0 2025-07-18 110.0 2025-07-16 16:00:00 210.260555 0.005476 \n", - "1 2025-07-18 115.0 2025-07-16 16:00:00 210.260555 0.005476 \n", - "2 2025-07-18 120.0 2025-07-16 16:00:00 210.260555 0.005476 \n", - "3 2025-07-18 130.0 2025-07-16 16:00:00 210.260555 0.005476 \n", - "4 2025-07-18 135.0 2025-07-16 16:00:00 210.260555 0.005476 \n", - "... ... ... ... ... ... \n", - "2019 2027-12-17 420.0 2025-07-16 16:00:00 226.341874 2.420260 \n", - "2020 2027-12-17 425.0 2025-07-16 16:00:00 226.341874 2.420260 \n", - "2021 2027-12-17 430.0 2025-07-16 16:00:00 226.341874 2.420260 \n", - "2022 2027-12-17 435.0 2025-07-16 16:00:00 226.341874 2.420260 \n", - "2023 2027-12-17 440.0 2025-07-16 16:00:00 226.341874 2.420260 \n", - "\n", - " variable midpoint right equalized_iv \n", - "0 call_euro_price 100.375000 C 3.747594 \n", - "1 call_euro_price 95.475000 C 3.776839 \n", - "2 call_euro_price 90.475000 C 3.533382 \n", - "3 call_euro_price 80.475000 C 3.074212 \n", - "4 call_euro_price 75.400000 C 2.702652 \n", - "... ... ... ... ... \n", - "2019 put_euro_price 194.528686 P 0.452546 \n", - "2020 put_euro_price 199.261261 P 0.458920 \n", - "2021 put_euro_price 203.994795 P 0.465294 \n", - "2022 put_euro_price 208.727394 P 0.471543 \n", - "2023 put_euro_price 213.459021 P 0.477792 \n", - "\n", - "[2024 rows x 9 columns]" - ] - }, - "execution_count": 247, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "tester=chain_for_box.set_index(['expiration'])\n", - "tester['f'] = F_by_exp\n", - "tester['t'] = T_by_exp\n", - "tester = tester.reset_index().melt(\n", - " id_vars = ['expiration', 'strike', 'valuation_date', 'f', 't'],\n", - " value_vars = ['call_euro_price', 'put_euro_price'],\n", - " value_name = 'midpoint'\n", - ").dropna().reset_index(drop=True) \n", - "tester['right'] = tester['variable'].str.split('_').str[0].str[0].str.upper()\n", - "tester['equalized_iv']=get_bs_vol_on_chain(\n", - " tester,\n", - " valuation_date=tester['valuation_date'].iloc[0],\n", - ")\n", - "tester" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\n", - "['2025-07-18 00:00:00', '2025-07-25 00:00:00', '2025-08-01 00:00:00',\n", - " '2025-08-08 00:00:00', '2025-08-15 00:00:00', '2025-08-22 00:00:00',\n", - " '2025-08-29 00:00:00', '2025-09-19 00:00:00', '2025-10-17 00:00:00',\n", - " '2025-11-21 00:00:00', '2025-12-19 00:00:00', '2026-01-16 00:00:00',\n", - " '2026-02-20 00:00:00', '2026-03-20 00:00:00', '2026-05-15 00:00:00',\n", - " '2026-06-18 00:00:00', '2026-09-18 00:00:00', '2026-12-18 00:00:00',\n", - " '2027-01-15 00:00:00', '2027-06-17 00:00:00', '2027-12-17 00:00:00']\n", - "Length: 21, dtype: datetime64[ns]" - ] - }, - "execution_count": 248, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "tester.expiration.unique()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
expirationstrikevaluation_dateftvariablemidpointrightequalized_iv
02025-07-18110.02025-07-16 16:00:00210.2605550.005476call_euro_price100.375000C3.747594
12025-07-18115.02025-07-16 16:00:00210.2605550.005476call_euro_price95.475000C3.776839
22025-07-18120.02025-07-16 16:00:00210.2605550.005476call_euro_price90.475000C3.533382
32025-07-18130.02025-07-16 16:00:00210.2605550.005476call_euro_price80.475000C3.074212
42025-07-18135.02025-07-16 16:00:00210.2605550.005476call_euro_price75.400000C2.702652
..............................
20192027-12-17420.02025-07-16 16:00:00226.3418742.420260put_euro_price194.528686P0.452546
20202027-12-17425.02025-07-16 16:00:00226.3418742.420260put_euro_price199.261261P0.458920
20212027-12-17430.02025-07-16 16:00:00226.3418742.420260put_euro_price203.994795P0.465294
20222027-12-17435.02025-07-16 16:00:00226.3418742.420260put_euro_price208.727394P0.471543
20232027-12-17440.02025-07-16 16:00:00226.3418742.420260put_euro_price213.459021P0.477792
\n", - "

2024 rows × 9 columns

\n", - "
" - ], - "text/plain": [ - " expiration strike valuation_date f t \\\n", - "0 2025-07-18 110.0 2025-07-16 16:00:00 210.260555 0.005476 \n", - "1 2025-07-18 115.0 2025-07-16 16:00:00 210.260555 0.005476 \n", - "2 2025-07-18 120.0 2025-07-16 16:00:00 210.260555 0.005476 \n", - "3 2025-07-18 130.0 2025-07-16 16:00:00 210.260555 0.005476 \n", - "4 2025-07-18 135.0 2025-07-16 16:00:00 210.260555 0.005476 \n", - "... ... ... ... ... ... \n", - "2019 2027-12-17 420.0 2025-07-16 16:00:00 226.341874 2.420260 \n", - "2020 2027-12-17 425.0 2025-07-16 16:00:00 226.341874 2.420260 \n", - "2021 2027-12-17 430.0 2025-07-16 16:00:00 226.341874 2.420260 \n", - "2022 2027-12-17 435.0 2025-07-16 16:00:00 226.341874 2.420260 \n", - "2023 2027-12-17 440.0 2025-07-16 16:00:00 226.341874 2.420260 \n", - "\n", - " variable midpoint right equalized_iv \n", - "0 call_euro_price 100.375000 C 3.747594 \n", - "1 call_euro_price 95.475000 C 3.776839 \n", - "2 call_euro_price 90.475000 C 3.533382 \n", - "3 call_euro_price 80.475000 C 3.074212 \n", - "4 call_euro_price 75.400000 C 2.702652 \n", - "... ... ... ... ... \n", - "2019 put_euro_price 194.528686 P 0.452546 \n", - "2020 put_euro_price 199.261261 P 0.458920 \n", - "2021 put_euro_price 203.994795 P 0.465294 \n", - "2022 put_euro_price 208.727394 P 0.471543 \n", - "2023 put_euro_price 213.459021 P 0.477792 \n", - "\n", - "[2024 rows x 9 columns]" - ] - }, - "execution_count": 249, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "tester.dropna()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 264, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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pKens23bNj744ANuuukmy7afffYZ99xzD25ublx77bVER0dz+PBhPv30UxYvXsymTZtq/Bs816RJkxgyZEi118W5wzC33347c+bMITo6msmTJ6NpGosWLeKBBx5g3bp1fP3111Y/ZvVlMBgA0Ourvm3/9ttvAJbX+bkqh4oqt7kYTdMsx3dxcbno9j/++COpqakMGjSIdu3aWXUOe6jtsWkon3zyCQD33HOP3c7Rp08fXn75Zf7xj38wZcoU5s+fD4DJZOLWW28lPT2dL774osbn4aabbmLr1q3ccMMNGAwGfvjhB6ZPn862bdv48ccfrR7SfPPNN/n111+55pprGDp0KLm5uZb77r//fjp27MigQYOIiIjgzJkzLF26lNtvv52DBw/y0ksvAX8N9X7xxRecOHGiyrDvxSZ+l5WVcdVVV7FmzRratWvH1KlTKSoqYuHChUyYMIGdO3fy8ssvV9vvxIkT9O7dm5YtW3L77beTlZXFvHnzuO6661ixYgVDhw61qv1AI+wbsxMu0NMEqH/9619V7nvxxRcVoAICAtS9995b5dvm7NmzFaAeffTRKvtUZusGg0Ft3769yn2PPvqoAtRdd91V5fa69DQNHjxYaZqmvvnmmyq3Z2dnq65duyp3d/cqw2eV387Gjx9fJf5jx46pgICAOvU0KaVU7969a+ypUEqprl27KkBt3bpVKaXUhg0bFKCio6Or9LCVl5erMWPGKEDNmDGjyjFq62mqqTv85MmTKiIiQrVr167afVxgeO5Se5pq27ZScXGxCgoKUuHh4aq8vLzKfZXP6y233FJjbOd7/PHHFaDCwsLU9OnT1Zo1a1Rubu4F96lvTxOgbr/99moxnxt3TT2faWlpKi8vr9rtO3fuVF5eXmrkyJFVbv/zzz+VXq9XAQEBau/evdX2O3nypOX/Bw8eVAaDQbVq1UqdOnWqynYrVqxQOp1OjR07tsa21qS218WcOXMUoLp3716ll7SgoED17NlTAerrr7+udqwLPWZ1lZubq8LCwpSmaWrfvn1V7gsODr5gz5CXl5cCVGFh4UXPM3fuXAWovn37WhXXlVdeWWP764N69jSVl5erTp06KUAtX7683uevb09T5XtZmzZt6rRf5fuHn5+fmjZtWo0///nPf6rsYzKZ1OjRoxWgPvzwQ6WUUtOnT6+1N7Hy86N169YqKyvL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r19fp/NfTGhoKJ6envzxxx9VhsjKy8t55JFHyMzMrLbP/fffj16v56WXXqrx+Tt3nuCDDz6IwWDgscce49ChQ9W2LSsrs0lCVfn8PP300xQVFVluLyoqsiwXY81r1RpKKe655x4++OADRo0axY8//oiHh8cF97nzzjtxc3Nj5syZVV4P2dnZlsuvz39tnThxgkGDBnH06FFL2QZrnThxgl9++YWgoKAaPyTt6aWXXuKpp56iZ8+erFy50qGrIjgicTx27BhTpkwhKCjIUgLjyy+/pLCwkAkTJtQ6BPbSSy+RnZ1t+b2kpISnn34aML9+LlXlkOv5X4J//vlnyxfn81nzPnm+u+66C6UU//jHP6okW5mZmZaSBpV/r/Yiw3MOMGrUKPr3789NN91EREQE69atY926dcTFxfHKK6/U+7iVkwPvvvtu3nvvPfr06YO/vz+nTp1i9+7d7N27l40bN1q+mT3++ON8//33fPvtt/To0YOrrrqKnJwc5s+fz6BBg/jxxx/rFcctt9zCE088YfnAOncCeKV+/frx5JNP8tprr9GpUyduuOEGvLy8WLZsGXv37mXAgAH84x//uOi5HnvsMe677z66d+/O9ddfj8FgYP369ezbt49rrrmmxiUxhg8fzty5c7nmmmvo0aMHBoOBQYMGWT0B+2KGDx/O66+/zpQpU7j++uvx8fHB39+fBx98sMp2kydP5sUXX+T06dN07tzZqsm353r77beZPn063bt3p1evXoSEhJCbm8v27dvZuHEjer2eDz/8sEoS/tBDD/H5559z//33s3LlSqKjo9m5cycbN25kzJgxLFmyxCaPAZgTw4cffphXXnmFzp07c91111FWVsaqVavIyspi6NChlm+HlTp06MAHH3xgeU6vu+46WrduzZkzZ9i6dSu+vr6Wfdq1a8dnn33GXXfdRceOHRk5ciRt2rShvLycpKQk1q5dS0hIyEWXxriYW265hR9++IH58+fTsWNHxo4da5mTlZiYyIQJEy44NFIXL774Ip9++ikeHh5069atxveDbt26MXbsWMvv8fHxvP766zz88MP06tWLCRMmWJZROXXqFI8//ni111ZlPbeePXty/PjxOk3a/vTTTzGZTLVOALfWgQMHqrUvOzu7yvDOG2+8YUmMvvzyS55//nlcXFwYOHBgjV/s4uLi6jQh+/vvv+f7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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "tester[tester.expiration == exp].pivot_table(\n", - " columns='right',\n", - " index='strike',\n", - " values='equalized_iv'\n", - ").plot(\n", - " kind='line',\n", - " title='Implied Volatility Surface for 2027-12-17 Expiration',\n", - " ylabel='Implied Volatility',\n", - " xlabel='Strike Price'\n", - ")" - ] - }, - { - "cell_type": "raw", - "metadata": { - "vscode": { - "languageId": "raw" - } - }, - "source": [ - "\n", - "\n", - " def predict(self,\n", - " k: float| np.ndarray,\n", - " exp: str| datetime| np.ndarray = None,\n", - " right: Literal['c', 'p', 'itm', 'otm'] | np.ndarray = None,\n", - " strike_type: Literal['p', 'k', 'pf', 'f'] = 'f'):\n", - " \"\"\"\n", - " Predict the implied volatility for a given strike and expiration.\n", - " Args:\n", - " k (float | np.ndarray): Strike price or array of strike prices.\n", - " exp (str | datetime | np.ndarray): Expiration date or array of expiration dates.\n", - " right (Literal['c', 'p', 'itm', 'otm'] | np.ndarray): Option type ('c' for call, 'p' for put, etc.).\n", - " c & p are for call and put options, respectively.\n", - " itm & otm are for in-the-money and out-of-the-money options, respectively.\n", - " itm: Will use Calls in left wing and Puts in right wing.\n", - " otm: Will use Calls in right wing and Puts in left wing.\n", - " strike_type (Literal['p', 'k', 'pf', 'f']): Type of strike price ('p' for price, 'k' for strike, etc.).\n", - " p: Percent of spot\n", - " k: Strike price\n", - " pf: Percent of forward\n", - " f: Forward price\n", - " Returns:\n", - " np.ndarray: Predicted implied volatility for the given parameters.\n", - " \"\"\"\n", - " ## Produce DTEs\n", - " exp = np.asarray(exp) if exp is not None else np.array(['3m'])\n", - " dtes = np.array([max(convert_date_to_time_to_maturity(e, self.valuation_date),\n", - " self.chain.t.min()) \n", - " for e in exp])\n", - " exp_map = {dte: e for e, dte in zip(exp, dtes)}\n", - "\n", - " ## Strike Type Handling\n", - " k = np.asarray(k) if isinstance(k, (list, np.ndarray)) else np.array([k])\n", - " fwds = np.array(self._fwd_interp(dtes))\n", - " k_dte_pack =np.array([\n", - " handle_strikes(k=k, \n", - " f=f, \n", - " strike_type=strike_type, \n", - " spot=self.call_chain['spot'].iloc[0])\n", - " for f in fwds\n", - " ])\n", - "\n", - " ## Re-ordering to equalize size and pair to DTE for vectorization\n", - " k_model, dtes, model_f, k_pretty= np.column_stack((\n", - " k_dte_pack.flatten(),\n", - " dtes.repeat(k_dte_pack.shape[1]),\n", - " fwds.repeat(k_dte_pack.shape[1]),\n", - " np.array([k]).repeat(len(k_dte_pack), axis=0).flatten()\n", - " )).T\n", - "\n", - " # Pick the right chain based on the 'right' parameter. This is handled in the predict_vol function.\n", - " vols = predict_vol(\n", - " k=k_model,\n", - " t=dtes,\n", - " f=model_f,\n", - " params=self.params\n", - " )\n", - "\n", - " dataframe_vols = pd.DataFrame({\n", - " 'strike': k_pretty,\n", - " 'exp': dtes,\n", - " 'vol': vols,\n", - " 'fwd': model_f\n", - " })\n", - "\n", - " dataframe_vols['exp'] = dataframe_vols['exp'].map(exp_map) # Map DTEs back to original expiration strings\n", - " dataframe_vols= dataframe_vols.set_index(['strike', 'exp']).sort_index()\n", - " return dataframe_vols\n", - "\n", - "\n", - " def fit(self, *args, **kwargs):\n", - " \"\"\"\n", - " Fit the SSVI model to the option chain data.\n", - " This method estimates the ATM variance, long-term variance, speed of mean reversion,\n", - " skewness, kurtosis, and correlation parameters using the option chain data.\n", - " It calculates the ATM maturities and implied volatilities, and then uses these to\n", - " estimate the model parameters.\n", - "\n", - " Note: This method is designed to be called after the model has been initialized. It fits per right chain (call and put).\n", - " \"\"\"\n", - " def inner_fit(right_chain_attr: str):\n", - " \"\"\"\n", - " Inner function to perform the fitting process.\n", - " This is called by the fit method.\n", - " \"\"\"\n", - " \n", - " chain = getattr(self, right_chain_attr)\n", - " right_slug = right_chain_attr.split('_')[0] # 'call' or 'put'\n", - " if chain is None or chain.empty:\n", - " raise ValueError(f\"Chain for {right_chain_attr} is empty or not set.\")\n", - " \n", - " atm_t = np.array(get_atm_T_maturities_on_chain(chain))\n", - " atm_iv = np.array(get_atm_T_vols_on_chain(chain))\n", - " if atm_t.size == 0 or atm_iv.size == 0:\n", - " raise ValueError(f\"No ATM maturities or volatilities found in {right_chain_attr} chain. Adjust PRICING_CONFIG['ATM_WIDTH'].\")\n", - " setattr(self, f'atm_t_{right_slug}', atm_t)\n", - " setattr(self, f'atm_iv_{right_slug}', atm_iv)\n", - " (var0_hat, var_inf_hat, kappa_hat), atm_loss = get_best_params(\n", - " atm_t,\n", - " atm_iv\n", - " )\n", - " eta_hat, lambda_hat, rho_hat, surface_loss = get_surface_params(\n", - " get_K_grid(chain),\n", - " get_T_grid(chain),\n", - " get_fwd_grid(chain),\n", - " var0_hat,\n", - " var_inf_hat,\n", - " kappa_hat,\n", - " get_market_iv_grid(chain),\n", - " iterations=self.iterations,\n", - " chunk_size=self.chunk_size\n", - " )\n", - " params = build_svi_params_obj(\n", - " chain=chain,\n", - " var0_hat=var0_hat,\n", - " var_inf_hat=var_inf_hat,\n", - " kappa_hat=kappa_hat,\n", - " eta_hat=eta_hat,\n", - " lambda_hat=lambda_hat,\n", - " rho_hat=rho_hat,\n", - " atm_loss=atm_loss,\n", - " surface_loss=surface_loss\n", - " )\n", - " return params\n", - " # Fit the model for call and put chains\n", - " self.call_params = inner_fit('call_chain')\n", - " self.put_params = inner_fit('put_chain')\n", - " \n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "openbb_new_use", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.13" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/trade/optionlib/notebooks/ssvi_model_prod_decluttered.ipynb b/trade/optionlib/notebooks/ssvi_model_prod_decluttered.ipynb deleted file mode 100644 index e4f9c68..0000000 --- a/trade/optionlib/notebooks/ssvi_model_prod_decluttered.ipynb +++ /dev/null @@ -1,6560 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "61051f03", - "metadata": {}, - "source": [ - "## Imports" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "35b67ae2", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Console Logging & File Logging Can be configured using STREAM_LOG_LEVEL and FILE_LOG_LEVEL in environment variables.\n", - "Propagate to root logger can be set using PROPAGATE_TO_ROOT_LOGGER in environment variables.\n", - "Example:\n", - "STREAM_LOG_LEVEL = 'DEBUG'\n", - "FILE_LOG_LEVEL = 'INFO'\n", - "PROPAGATE_TO_ROOT_LOGGER = 'False'\n", - "\n", - "2025-10-19 00:44:33 trade.helpers.Logging INFO: Logging Root Directory: /Users/chiemelienwanisobi/cloned_repos/QuantTools/logs\n", - "Using Proxy URL: http://54.205.248.219:5500/thetadata\n" - ] - } - ], - "source": [ - "%load_ext autoreload\n", - "%autoreload 2\n", - "from dotenv import load_dotenv\n", - "load_dotenv()\n", - "from module_test.raw_code.optionlib_2.vol.implied_vol import (\n", - " bsm_vol_est_brute_force,\n", - " bsm_vol_est_minimization,\n", - " vector_vol_estimation\n", - ")\n", - "from dbase.DataAPI.ThetaData import (\n", - " extract_numeric_value)\n", - "from datetime import date, datetime\n", - "from module_test.raw_code.optionlib_2.config.defaults import DAILY_BASIS\n", - "from module_test.raw_code.optionlib_2.assets.forward import (\n", - " EquityForward, \n", - " time_distance_helper,\n", - " vectorized_market_forward_calc\n", - ")\n", - "from datetime import datetime\n", - "from dbase.DataAPI.ThetaData import retrieve_chain_bulk\n", - "from trade.helpers.helper import change_to_last_busday, retrieve_timeseries, CustomCache, check_missing_dates, not_trading_day\n", - "import os\n", - " \n", - "from module_test.raw_code.optionlib_2.vol.implied_vol import (\n", - " estimate_crr_implied_volatility,\n", - " vol_est_brute_force_bjs_2002,\n", - " vector_vol_estimation\n", - ")\n", - "from module_test.raw_code.optionlib_2.assets.forward import (\n", - " EquityForward, \n", - " time_distance_helper,\n", - " get_vectorized_dividend_rate,\n", - " get_vectorized_dividend_scehdule,\n", - " vectorized_discrete_pv\n", - ")\n", - "\n", - "from module_test.raw_code.optionlib_2.assets.dividend import (\n", - " vector_convert_to_time_frac\n", - ")\n", - "\n", - "from module_test.raw_code.optionlib_2.greeks.numerical.bjs2002 import (\n", - " bjs2002_numerical_greeks,\n", - ")\n", - "from module_test.raw_code.optionlib_2.greeks.numerical.black_scholes import vectorized_black_scholes_greeks\n", - "\n", - "from module_test.raw_code.optionlib_2.greeks.numerical.binomial import (\n", - " binomial_tree_greeks,\n", - ")\n", - "from datetime import datetime\n", - "from dbase.DataAPI.ThetaData import retrieve_chain_bulk\n", - "from trade.helpers.helper import change_to_last_busday, retrieve_timeseries\n", - "import os\n", - "import numpy as np\n", - "import pandas as pd\n", - "from trade.assets.rates import get_risk_free_rate_helper\n", - "from module_test.raw_code.optionlib_2.utils.batch_operation import vector_batch_processor\n", - "# os.environ['PROXY_URL'] = ''\n", - "from dbase.DataAPI.ThetaData import (\n", - " list_contracts,\n", - " retrieve_eod_ohlc,\n", - " retrieve_chain_bulk\n", - ")\n", - "from trade import PRICING_CONFIG, reload_pricing_config, get_pricing_config\n", - "from dataclasses import dataclass, field\n", - "from pydantic import BaseModel, Field, ConfigDict\n", - "from pydantic.dataclasses import dataclass\n", - "from abc import ABC, abstractmethod\n", - "from weakref import WeakSet\n", - "from typing import List, Tuple, Literal\n", - "from scipy.interpolate import interp1d\n", - "from threading import Semaphore, Thread\n", - "from module_test.raw_code.optionlib_2.pricing.black_scholes import black_scholes_vectorized\n", - "from module_test.raw_code.optionlib_2.pricing.binomial import crr_binomial_pricing\n", - "from module_test.raw_code.optionlib_2.greeks.numerical.binomial import binomial_tree_price_batch\n", - "from trade.helpers.Logging import setup_logger\n", - "from pathlib import Path\n", - "from functools import wraps\n", - "from typing import Callable, Any, Optional\n", - "from dataclasses import dataclass, field\n", - "from pydantic import BaseModel, Field, ConfigDict, PrivateAttr, ValidationError\n", - "from pydantic.dataclasses import dataclass\n", - "from abc import ABC, abstractmethod\n", - "from typing import List, Optional, Literal, Dict\n", - "from scipy.interpolate import interp1d\n", - "from trade.helpers.Logging import setup_logger\n", - "import pandas as pd\n", - "from enum import Enum, auto\n", - "from concurrent.futures import ThreadPoolExecutor, Future\n", - "from dataclasses import dataclass as stdlib_dataclass, field as stdlib_field\n", - "from typing import ClassVar, Final\n", - "from dateutil.relativedelta import relativedelta\n", - "logger =setup_logger('SSVIModel', stream_log_level='INFO')" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "610f3655", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'5d2f204cca67fbf759fec9dbf0f9dbe6e6fb941e004328a2d36c7919adfc6bdc'" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "## Import Resolved\n", - "\n", - "import json, hashlib\n", - "\n", - "def hash_config(config_dict):\n", - " json_bytes = json.dumps(config_dict, sort_keys=True, separators=(\",\", \":\")).encode()\n", - " return hashlib.sha256(json_bytes).hexdigest()\n", - "\n", - "# Example\n", - "config_hash = hash_config(get_pricing_config())\n", - "config_hash" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "dede5e74", - "metadata": {}, - "outputs": [], - "source": [ - "## Import Resolved\n", - "def is_latest_config(stored_hash: str) -> bool:\n", - " current_hash = hash_config(get_pricing_config())\n", - " return stored_hash == current_hash" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "ce443c99", - "metadata": {}, - "outputs": [], - "source": [ - "def validate_ssvi_params(\n", - " rho_hat: float,\n", - " var0_hat: float, var_inf_hat: float, kappa_hat: float,\n", - " eta_hat: float, lambda_hat: float,\n", - " maturities: list[float],\n", - ") -> None:\n", - " # ρ strict bound\n", - " if not (-0.999999 < rho_hat < 0.999999):\n", - " raise ValueError(\"rho_hat must be strictly between -1 and 1\")\n", - "\n", - " # θ(T) term structure (optional, if you use it)\n", - " for v in (var0_hat, var_inf_hat, kappa_hat, eta_hat, lambda_hat):\n", - " if v < 0:\n", - " raise ValueError(\"variance-like and scale parameters must be non-negative\")\n", - "\n", - " # Monotone θ(T): θ(T)=var_inf + (var0 - var_inf) e^{-kappa T}\n", - " if var_inf_hat < var0_hat:\n", - " raise ValueError(\"Require var_inf_hat ≥ var0_hat for increasing θ(T)\")\n", - "\n", - " # Butterfly cap for raw-SSVI with φ(T)=λ/√T and θ(T)=ηT\n", - " psi_max = 4.0 / (1.0 + abs(rho_hat))\n", - " for T in maturities:\n", - " if T <= 0:\n", - " continue\n", - " if eta_hat * lambda_hat * (T ** 0.5) > psi_max:\n", - " raise ValueError(\"Butterfly no-arb violated: eta*lambda*sqrt(T) exceeds 4/(1+|rho|)\")\n" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "9a86f3df", - "metadata": {}, - "outputs": [], - "source": [ - "## Import Resolved\n", - "class BackgroundFits:\n", - " \"\"\"\n", - " One shared, bounded thread pool for all background fits.\n", - " - max_workers: threads running background fits concurrently\n", - " - max_queue: limit queued-but-not-started fits (backpressure)\n", - " Policy: if the queue is full, we SKIP the submission (non-blocking).\n", - " \"\"\"\n", - " def __init__(self, max_workers: int = 3, max_queue: int = 25):\n", - " self._exec = ThreadPoolExecutor(max_workers=max_workers, thread_name_prefix=\"ssvi-bg\")\n", - " # Semaphore counts 'in-flight' = running + queued tasks\n", - " self._slots = Semaphore(max_queue + max_workers)\n", - " self._futs: Dict[str, Future] = {}\n", - "\n", - " def submit(self, key: str, fn, *args, **kwargs) -> bool:\n", - " \"\"\"\n", - " Return True if scheduled, False if skipped due to full queue.\n", - " \"\"\"\n", - "\n", - " ## _slots.acquire() is non-blocking; if it fails, we skip the job\n", - " ## Essentially, we are counting. if it's full, we skip.\n", - " ## Slots start with given max_queue + max_workers, acquire() reduces count by 1, release() increases count by 1\n", - " acquired = self._slots.acquire(blocking=False)\n", - " if not acquired:\n", - "\n", - " ## If acquire() fails, we skip the job\n", - " logger.info(\"BG queue full; skipping background job %s\", key)\n", - " return False\n", - "\n", - " def _done_cb(f: Future):\n", - " ## Release the slot after the job is done (whether success or failure)\n", - " self._slots.release()\n", - " exc = f.exception()\n", - " if exc:\n", - " logger.warning(\"BG job %s failed: %s\", key, exc, exc_info=True)\n", - "\n", - " ## Remove from tracking dict\n", - " self._futs.pop(key, None)\n", - "\n", - " fut = self._exec.submit(fn, *args, **kwargs)\n", - " fut.add_done_callback(_done_cb)\n", - " self._futs[key] = fut\n", - " return True\n", - "\n", - " def status(self, key: str = None) -> Dict[str, str]:\n", - " \"\"\"\n", - " Get the status of all background jobs.\n", - " Returns a dict mapping job keys to their status: \"running\", \"done\", or \"queued\".\n", - " \"\"\"\n", - " st = {}\n", - " for k, f in list(self._futs.items()):\n", - " st[k] = \"running\" if f.running() else (\"done\" if f.done() else \"queued\")\n", - " return st if key is None else {key: st.get(key, \"not found\")}\n", - " \n", - "\n", - " def shutdown(self) -> None:\n", - " \"\"\"\n", - " Shutdown the background executor.\n", - " \"\"\"\n", - " self._exec.shutdown(wait=False, cancel_futures=True)\n", - " self._futs.clear()\n", - "\n", - " def restart(self) -> None:\n", - " \"\"\"\n", - " Restart the background executor.\n", - " \"\"\"\n", - " self.shutdown()\n", - " self._exec = ThreadPoolExecutor(max_workers=3, thread_name_prefix=\"ssvi-bg\")\n", - " self._futs.clear()" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "052d95be", - "metadata": {}, - "outputs": [], - "source": [ - "GLOBAL_BACKGROUND_FITS = BackgroundFits(max_workers=3, max_queue=1_000)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "e4e44731", - "metadata": {}, - "outputs": [], - "source": [ - "## Return later\n", - "class _SingletonMixin(ABC, BaseModel):\n", - " \"\"\"\n", - " A mixin class to make a class a singleton by symbol.\n", - " \"\"\"\n", - " _instances: ClassVar[Dict[str, \"SingletonMixin\"]] = {}\n", - " _initialized: bool = PrivateAttr(False)\n", - " model_config = ConfigDict(arbitrary_types_allowed=True)\n", - "\n", - " def __new__(cls, symbol: str, *args, **kwargs):\n", - " key = symbol\n", - " if key not in cls._instances:\n", - " instance = super().__new__(cls)\n", - " cls._instances[key] = instance\n", - " else:\n", - " logger.info(f\"Using cached instance for {symbol}\")\n", - " return cls._instances[key]\n", - " \n", - " def __init__(self, *args, **data):\n", - " # First-time init for this cached instance:\n", - " # If __pydantic_private__ isn't set yet, it's the first real init.\n", - " if getattr(self, \"__pydantic_private__\", None) is None:\n", - " super().__init__(*args, **data) # sets fields and creates private store\n", - " self._initialized = True # safe now\n", - " return\n", - "\n", - "\n", - " @classmethod\n", - " @abstractmethod\n", - " def clear_instances(cls):\n", - " pass\n", - "\n", - " @classmethod\n", - " @abstractmethod\n", - " def instances(cls):\n", - " pass" - ] - }, - { - "cell_type": "markdown", - "id": "3b04a1de", - "metadata": {}, - "source": [ - "## SingletonMixin" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "113a0584", - "metadata": {}, - "outputs": [], - "source": [ - "## Trade.helpers.types.py\n", - "\n", - "class SingletonMixin(ABC):\n", - " \"\"\"\n", - " A mixin class to make a class a singleton by symbol.\n", - " \"\"\"\n", - "\n", - " _registry: ClassVar[WeakSet[type]] = WeakSet()\n", - "\n", - " def __init_subclass__(cls, **kwargs):\n", - " super().__init_subclass__(**kwargs)\n", - " SingletonMixin._registry.add(cls)\n", - "\n", - "\n", - " @classmethod\n", - " @abstractmethod\n", - " def clear_instances(cls):\n", - " pass\n", - "\n", - " @classmethod\n", - " @abstractmethod\n", - " def instances(cls):\n", - " pass\n", - "\n", - " @classmethod\n", - " def clear_all_instances(cls) -> None:\n", - " for sub in list(cls._registry):\n", - " if issubclass(sub, cls):\n", - " try:\n", - " sub.clear_instances()\n", - " except TypeError:\n", - " pass" - ] - }, - { - "cell_type": "markdown", - "id": "dd8fe61d", - "metadata": {}, - "source": [ - "## Initial Vars\n" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "85bf017f", - "metadata": {}, - "outputs": [], - "source": [ - "ticks = ['AAPL', 'MSFT', 'GOOGL', 'AMZN', 'TSLA']\n", - "test_start, test_valuation_date = '2025-07-16', '2025-07-16'\n", - "reload_pricing_config()\n", - "PRICING_CONFIG= get_pricing_config()\n", - "\n", - "params_dump_path = Path(os.environ['GEN_CACHE_PATH']) / 'optionlib_2' / 'params_dump'\n", - "chain_dump_path = Path(os.environ['GEN_CACHE_PATH']) / 'optionlib_2' / 'chain_dumps'\n", - "\n", - "PARAMS_DUMP_CACHE = CustomCache(location=params_dump_path, \n", - " expire_days=300, \n", - " clear_on_exit=False, \n", - " fname='prod')\n", - "\n", - "\n", - "CHAIN_DUMP_CACHE = CustomCache(location=chain_dump_path, \n", - " expire_days=300, \n", - " clear_on_exit=False, \n", - " fname='prod')" - ] - }, - { - "cell_type": "markdown", - "id": "b59fc478", - "metadata": {}, - "source": [ - "## Market Utility Functions" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "38e58be6", - "metadata": {}, - "outputs": [], - "source": [ - "## trade.helpers.helper.py\n", - "def assert_member_of_enum(value: Any, enum_class: Enum) -> None:\n", - " \"\"\"\n", - " Assert that the given value is a member of the specified Enum class.\n", - " Raises a ValueError if the value is not a valid member.\n", - " \"\"\"\n", - " if value not in enum_class._value2member_map_:\n", - " raise ValueError(f\"{value} is not a valid member of {enum_class.__name__}. Recieved: {value}\")\n", - " return enum_class(value)" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "d9d98d44", - "metadata": {}, - "outputs": [], - "source": [ - "## trade.helpers.pydantic.py\n", - "import sys, traceback\n", - "\n", - "def loud_post_init(fn):\n", - " def wrap(self, ctx):\n", - " try:\n", - " return fn(self, ctx)\n", - " except Exception as err:\n", - " print(f\"\\n[model_post_init] {type(self).__name__} crashed:\", file=sys.stderr)\n", - " traceback.print_exception(type(err), err, err.__traceback__, file=sys.stderr)\n", - " raise\n", - " return wrap\n" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "e567a819", - "metadata": {}, - "outputs": [], - "source": [ - "## Import resolved\n", - "## Market Utility Functions V1\n", - "def pick_random_option(tick, date):\n", - " contracts = list_contracts(tick, date)\n", - " # Pick a random contract from the list\n", - " contract = np.random.choice(contracts.index)\n", - " return contracts.iloc[contract]\n", - "\n", - "def get_option_eod_price(date, contract_series):\n", - " \"\"\"\n", - " Retrieves the end-of-day price for a given option contract on a specific date.\n", - " \n", - " Args:\n", - " date (datetime): The date for which to retrieve the price.\n", - " contract_series (pd.Series): The series containing option contract details.\n", - " \n", - " Returns:\n", - " float: The end-of-day price of the option contract.\n", - " \"\"\"\n", - " eod_data = retrieve_eod_ohlc(symbol=contract_series['root'],\n", - " end_date=date,\n", - " start_date=date,\n", - " exp=str(contract_series['expiration']),\n", - " right=contract_series['right'],\n", - " strike=contract_series['strike'],\n", - " )\n", - " return eod_data.Midpoint[0]\n", - "\n", - "def get_spot(tick, date, spot_type='close'):\n", - " return retrieve_timeseries(tick, date, date, spot_type=spot_type)['close'][0]\n", - "\n", - "def get_rates(date):\n", - " \"\"\"\n", - " Retrieves the risk-free rate for a given date.\n", - " \n", - " Args:\n", - " date (datetime): The date for which to retrieve the risk-free rate.\n", - " \n", - " Returns:\n", - " float: The risk-free rate for the specified date.\n", - " \"\"\"\n", - " date = pd.to_datetime(date).strftime('%Y-%m-%d')\n", - " return get_risk_free_rate_helper()['annualized'][date]" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "c55f1e2d", - "metadata": {}, - "outputs": [], - "source": [ - "## Import Resolved\n", - "def get_chain(tick: str, date: str) -> pd.DataFrame:\n", - " \"\"\"\n", - " Retrieves the option chain for a given ticker and date, along with additional calculated fields. \n", - " Args:\n", - " tick (str): The ticker symbol for the underlying asset.\n", - " date (str): The date for which to retrieve the option chain.\n", - " Returns:\n", - " pd.DataFrame: A DataFrame containing the option chain with additional fields.\n", - " \"\"\"\n", - " spot = get_spot(tick, date, spot_type='chain_price')\n", - " date= change_to_last_busday(date)\n", - " chain=retrieve_chain_bulk(\n", - " tick,\n", - " 0, ## This is to get all expirations\n", - " date,\n", - " date,\n", - " '16:00'\n", - " )\n", - " chain['spot'] = spot\n", - " chain['valuation_date'] = date\n", - " chain['moneyness'] = chain['Strike'] / chain['spot']\n", - " chain['log_moneyness'] = np.log(chain['moneyness'])\n", - " chain['T']= chain['Expiration'].apply(\n", - " lambda x: time_distance_helper(\n", - " x,\n", - " date,\n", - " ))\n", - " chain['T'] = chain['T'].astype(float)\n", - " chain['DTE']= chain['T'] * DAILY_BASIS\n", - "\n", - " return chain\n", - "\n", - "def format_chain(chain: pd.DataFrame) -> pd.DataFrame:\n", - " \"\"\"\n", - " Formats the option chain DataFrame by renaming columns and converting types.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame to format.\n", - " \n", - " Returns:\n", - " pd.DataFrame: The formatted option chain DataFrame.\n", - " \"\"\"\n", - " chain.columns = chain.columns.str.lower() \n", - " chain['right'] = chain['right'].str.lower()\n", - " return chain\n", - "\n", - "def confine_chain_with_pricing_config(chain:pd.DataFrame) -> pd.DataFrame:\n", - " \"\"\"\n", - " Confines the chain to the pricing configuration limits.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " expected columns: ['dte', 'moneyness']\n", - " \n", - " Returns:\n", - " pd.DataFrame: The confined option chain.\n", - " \"\"\"\n", - " conf = get_pricing_config()\n", - " return chain[\n", - " (chain['dte'] >= conf['VOL_SURFACE_MIN_DTE_THRESHOLD']) &\n", - " (chain['dte'] <= conf['VOL_SURFACE_MAX_DTE_THRESHOLD']) &\n", - " (chain['moneyness'] >= conf['VOL_SURFACE_MIN_MONEYNESS_THRESHOLD']) &\n", - " (chain['moneyness'] <= conf['VOL_SURFACE_MAX_MONEYNESS_THRESHOLD'])\n", - " ]\n", - " \n", - "\n", - "\n", - "def get_forward_price_on_chain(chain:pd.DataFrame,\n", - " valuation_date:str,\n", - " r:float,\n", - " div_type:str='discrete') -> pd.DataFrame:\n", - " \"\"\"\n", - " Calculates the forward price for a given option chain.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " valuation_date (str): The date of valuation.\n", - " end_date (str): The expiration date of the option.\n", - " r (float): The risk-free rate.\n", - " div_type (str): Type of dividend ('discrete' or 'continuous').\n", - " \n", - " Returns:\n", - " float: The calculated forward price.\n", - " \"\"\"\n", - "\n", - " ## This is per-ticker function. There must be only one ticker, one spot price\n", - " assert len(chain['root'].unique()) == 1, \"Chain must contain options from only one ticker.\"\n", - " assert len(chain['spot'].unique()) == 1, \"Chain must contain a single spot price.\"\n", - " assert len(chain['valuation_date'].unique()) == 1, \"Chain must contain a single valuation date.\"\n", - " assert div_type in ['discrete', 'continuous'], \"div_type must be either 'discrete' or 'continuous'.\"\n", - "\n", - " ## For speed, we will use unique items, and merge back later\n", - " chain = chain.copy()\n", - " end_dates = chain['expiration'].unique()\n", - " valuation_dates= [valuation_date] * len(end_dates)\n", - " S = [chain['spot'].tolist()[0]] * len(end_dates)\n", - " tickers= [chain['root'].iloc[0]] * len(end_dates)\n", - " r = [get_rates(valuation_date)] * len(end_dates)\n", - "\n", - " ## This function returns similar things based on div_type\n", - " ## 1. If div_type is 'discrete', it returns the forward price, (dividend schedule & present value of dividends (It's sum of dividends))\n", - " ## 2. If div_type is 'continuous', it returns the forward price, (dividend rate & present value of dividend rate)\n", - " f, (actual, pv) = vectorized_market_forward_calc(\n", - " ticks=tickers,\n", - " S=S,\n", - " valuation_dates=valuation_dates,\n", - " end_dates=end_dates,\n", - " r=r,\n", - " div_type=div_type,\n", - " return_div = True)\n", - " \n", - " ## Create a series for merging\n", - " f = pd.Series(f, index=end_dates, name='f')\n", - " pv = pd.Series(pv, index=end_dates, name='div_pv')\n", - "\n", - " if div_type == 'discrete':\n", - " actual = vector_convert_to_time_frac(\n", - " actual,\n", - " valuation_dates=[valuation_date] * len(actual),\n", - " end_dates=end_dates,\n", - " )\n", - " \n", - "\n", - "\n", - " ## Merge back to chain\n", - " actual = pd.Series(actual, index=end_dates, name='div_schedule')\n", - " chain = chain.merge(actual, left_on='expiration', right_index=True, how='left')\n", - " chain = chain.merge(f, left_on='expiration', right_index=True, how='left')\n", - " chain = chain.merge(pv, left_on='expiration', right_index=True, how='left')\n", - "\n", - " ## Calculate moneyness and log moneyness based on forward price\n", - " chain['f_moneyness'] = chain['strike'] / chain['f']\n", - " chain['f_log_moneyness'] = np.log(chain['f_moneyness'])\n", - "\n", - " return chain\n", - "\n", - "\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "99b0987f", - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "## Import Resolved\n", - "## Volatility Calculation Functions\n", - "def get_bs_vol_on_chain(\n", - " chain:pd.DataFrame,\n", - " valuation_date:str,\n", - " rate_col_name:str=None,\n", - " forward_col_name:str='f',\n", - " mid_col_name:str='midpoint'\n", - ") -> pd.Series:\n", - " \"\"\"\n", - " Estimates the Black-Scholes implied volatility for a given option chain.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " Expected Columns: `f`, `strike`, `t`, `midpoint`, `right`. \n", - " valuation_date (str): The date of valuation.\n", - " \n", - " Returns:\n", - " pd.Series: The estimated Black-Scholes implied volatility for the option chain.\n", - " \"\"\"\n", - " if rate_col_name is None:\n", - " _r = [get_rates(valuation_date)] * len(chain)\n", - " else:\n", - " _r = chain[rate_col_name]\n", - " \n", - " params = list(zip(\n", - " chain[forward_col_name if forward_col_name in chain.columns else 'f'], \n", - " chain['strike'], \n", - " chain['t'],\n", - " _r, \n", - " chain[mid_col_name if mid_col_name in chain.columns else 'midpoint'], \n", - " chain['right'].str.lower()\n", - " ))\n", - "\n", - " return vector_batch_processor(\n", - " vector_vol_estimation,\n", - " bsm_vol_est_brute_force,\n", - " params,\n", - "\n", - " )\n", - "\n", - "\n", - "def get_discrete_crr_vol_on_chain(\n", - " chain:pd.DataFrame,\n", - " valuation_date:str,\n", - " rates_col_name:str=None,\n", - " div_type:str='discrete',\n", - " N:int=250\n", - ") -> pd.Series:\n", - " \"\"\"\n", - " Estimates the discrete CRR implied volatility for a given option chain.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " Expected Columns: `spot`, `strike`, `t`, `midpoint`, `div_schedule`, `right`.\n", - " valuation_date (str): The date of valuation.\n", - " \n", - " Returns:\n", - " pd.Series: The estimated discrete CRR implied volatility for the option chain.\n", - " \"\"\"\n", - " ## Get risk-free rates\n", - " if rates_col_name is None:\n", - " _r = [get_rates(valuation_date)] * len(chain)\n", - " else:\n", - " _r = chain[rates_col_name].tolist()\n", - "\n", - " ## Pick div based on div_type\n", - " if div_type not in ['discrete', 'continuous']:\n", - " raise ValueError(\"div_type must be either 'discrete' or 'continuous'.\")\n", - " elif div_type == 'continuous':\n", - " divs = chain['div_pv'].tolist()\n", - " else:\n", - " divs = chain['div_schedule'].tolist()\n", - "\n", - " crr_vector_params_discrete = list(zip(\n", - " chain['spot'], chain['strike'].tolist(), ## Spot, Strike\n", - " chain['t'], _r, ## Time to Maturity, Risk Free Rate\n", - " chain['midpoint'], ## Midpoint Price\n", - " divs, ## Dividends based on div_type\n", - " chain['right'].str.lower().tolist(), ## Option Type\n", - " [N] * len(chain), ## Number of Steps\n", - " [div_type] * len(chain), ## Dividend Type\n", - " [True] * len(chain),)) ## American==True, European==False\n", - " \n", - "\n", - " return vector_batch_processor(\n", - " vector_vol_estimation,\n", - " estimate_crr_implied_volatility,\n", - " crr_vector_params_discrete\n", - " )\n", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "id": "03de3f9c", - "metadata": {}, - "source": [ - "## Chain Prep Checklist" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "5dfa0e9f", - "metadata": {}, - "outputs": [], - "source": [ - "## Import Resolved\n", - "def intrinsic_value(\n", - " strike: float,\n", - " spot: float,\n", - " right: Literal['c', 'p']\n", - ") -> float:\n", - " \"\"\"\n", - " Calculate the intrinsic value of an option.\n", - " \n", - " Args:\n", - " strike (float): The strike price of the option.\n", - " spot (float): The current spot price of the underlying asset.\n", - " right (Literal['c', 'p']): The type of option ('c' for call, 'p' for put).\n", - " \n", - " Returns:\n", - " float: The intrinsic value of the option.\n", - " \"\"\"\n", - " if right.lower() == 'c':\n", - " return max(0, spot - strike)\n", - " elif right.lower() == 'p':\n", - " return max(0, strike - spot)\n", - " else:\n", - " raise ValueError(f\"Invalid option type: {right}. Expected 'c' or 'p'.\")\n", - " \n", - " \n", - "\n", - "def vector_eu_boundary(\n", - " f: np.ndarray,\n", - " strike: np.ndarray,\n", - " t: np.ndarray,\n", - " r: np.ndarray,\n", - " right: np.ndarray,\n", - "\n", - ") -> np.ndarray:\n", - " \"\"\"\n", - " Calculate the European option boundary values.\n", - " \n", - " Args:\n", - " f (np.ndarray): Forward prices.\n", - " strike (np.ndarray): Strike prices.\n", - " t (np.ndarray): Time to maturity.\n", - " r (np.ndarray): Risk-free rates.\n", - " right (np.ndarray): Option types ('c' for call, 'p' for put).\n", - " \n", - " Returns:\n", - " np.ndarray: The boundary values of the European options.\n", - " \"\"\"\n", - " f = np.asarray(f)\n", - " strike = np.asarray(strike)\n", - " t = np.asarray(t)\n", - " r = np.asarray(r)\n", - " right = np.asarray(right)\n", - " if f.shape != strike.shape or f.shape != t.shape or f.shape != r.shape or f.shape != right.shape:\n", - " raise ValueError(\"All input arrays must have the same shape.\")\n", - "\n", - " intrinsic_values = np.zeros_like(f)\n", - " call = right == 'c'\n", - " put = right == 'p'\n", - " intrinsic_values[call] = np.maximum(0, f[call] - strike[call])\n", - " intrinsic_values[put] = np.maximum(0, strike[put] - f[put])\n", - " boundary = intrinsic_values * np.exp(-r * t)\n", - " return boundary" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "37b517e3", - "metadata": {}, - "outputs": [], - "source": [ - "## Import Resolved\n", - "class ChainChecklist:\n", - " \"\"\"\n", - " A class to perform various checks and transformations on option chain data.\n", - " This class includes methods to prepare the chain, remove junk quotes, and more.\n", - " \"\"\"\n", - "\n", - "\n", - " @staticmethod\n", - " def chain_prep(chain:pd.DataFrame) -> pd.DataFrame:\n", - " \"\"\"\n", - " Prepares the option chain DataFrame for further processing.\n", - " Runs through various transformations.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " \n", - " Returns:\n", - " pd.DataFrame: The prepared option chain DataFrame.\n", - " \"\"\"\n", - " pass\n", - "\n", - "\n", - "\n", - " @staticmethod\n", - " def remove_junk_quotes(chain:pd.DataFrame) -> pd.DataFrame:\n", - " \"\"\"\n", - " Removes junk quotes from the option chain DataFrame.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " \n", - " Returns:\n", - " pd.DataFrame: The cleaned option chain DataFrame.\n", - " \"\"\"\n", - " \n", - " chain = chain.copy()\n", - "\n", - " ## Format chain\n", - " chain = format_chain(chain)\n", - " logger.info(f\"Initial chain length: {len(chain)}\")\n", - " ## Drop midpoint < intrinsic value\n", - " chain['intrinsic_value'] = chain.apply(\n", - " lambda x: intrinsic_value(\n", - " x['strike'], \n", - " x['f'], ## Use Forward Price for intrinsic value instead of spot price\n", - " x['right']\n", - " ), axis=1)\n", - "\n", - " ## Drop below European lower bound\n", - " chain['eu_lower_bound'] = vector_eu_boundary(\n", - " chain['f'].tolist(),\n", - " chain['strike'].tolist(),\n", - " chain['t'].tolist(),\n", - " [get_rates(chain['valuation_date'].iloc[0].strftime('%Y-%m-%d'))] * len(chain),\n", - " chain['right'].str.lower().tolist()\n", - " )\n", - " \n", - " ## American Options cannot be worth less than max(intrinsic value, european lower bound, 0)\n", - " ## Less than intrinsic value: Exercise\n", - " ## Less than european lower bound: Arbitrage Violation\n", - " chain['lower_bound'] = chain.apply(lambda x: max( \n", - " # x['intrinsic_value'],\n", - " x['eu_lower_bound'],\n", - " 0), axis=1)\n", - " \n", - " ## Upper Bound is Spot for Call, Strike for Put\n", - " chain['upper_bound'] = chain.apply(lambda x: x['spot'] if x['right'] == 'c' else x['strike'], axis=1)\n", - " chain = chain[chain['midpoint'] >= chain['lower_bound']]\n", - " logger.info(f\"Chain length after dropping below lower bound: {len(chain)}\")\n", - " chain = chain[chain['midpoint'] <= chain['upper_bound']]\n", - " logger.info(f\"Chain length after dropping above upper bound: {len(chain)}\")\n", - "\n", - " ## Confine chain with pricing config\n", - " chain = confine_chain_with_pricing_config(chain)\n", - " logger.info(f\"Chain length after confining with pricing config: {len(chain)}\")\n", - "\n", - " return chain\n", - " \n", - " @staticmethod\n", - " def get_european_price(\n", - " chain:pd.DataFrame,\n", - " bs_vol: np.ndarray,\n", - " forward_col_name: str = 'f',\n", - " rates_col_name: str = None\n", - " ) -> pd.Series:\n", - " \"\"\"\n", - " Calculates the European price for the options in the chain.\n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " Returns:\n", - " pd.Series: The European price for each option in the chain.\n", - " \"\"\"\n", - " if rates_col_name is None:\n", - " _r = [get_rates(chain['valuation_date'].iloc[0].strftime('%Y-%m-%d'))] * len(chain)\n", - " else:\n", - " _r = chain[rates_col_name].tolist()\n", - "\n", - " \n", - " chain = chain.copy()\n", - " val_date = chain['valuation_date'].iloc[0].strftime('%Y-%m-%d')\n", - " european_price_params = [\n", - " chain[forward_col_name if forward_col_name in chain.columns else 'f'].tolist(),\n", - " chain['strike'].tolist(),\n", - " chain['t'].tolist(),\n", - " _r, # Risk-free rate\n", - " bs_vol,\n", - " chain['right'].str.lower().tolist(),\n", - " ]\n", - "\n", - "\n", - " european_midpoint = black_scholes_vectorized(*european_price_params)\n", - " return pd.Series(european_midpoint, index=chain.index)\n", - " \n", - " @staticmethod\n", - " def get_american_price(chain: pd.DataFrame,\n", - " sigmas: np.ndarray,\n", - " rates_col_name: str = None,\n", - " N: int = 500) -> pd.Series:\n", - " \"\"\"\n", - " Calculates the American price for the options in the chain using a binomial tree.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " N (int): The number of steps in the binomial tree.\n", - " \n", - " Returns:\n", - " pd.Series: The American price for each option in the chain.\n", - " \"\"\"\n", - " chain = chain.copy()\n", - " val_date = chain['valuation_date'].iloc[0].strftime('%Y-%m-%d')\n", - " if rates_col_name is None:\n", - " _r = [get_rates(val_date)] * len(chain)\n", - " else:\n", - " _r = chain[rates_col_name].tolist()\n", - " crr_params = [\n", - " chain['strike'].tolist(),\n", - " chain['expiration'].tolist(),\n", - " sigmas,\n", - " _r, # Risk-free rate\n", - " [N] * len(chain), # Number of steps\n", - " chain['spot'].tolist(),\n", - " ['discrete'] * len(chain), # Dividend type\n", - " chain['div_schedule'].tolist(), # Dividend schedules\n", - " chain['right'].str.lower().tolist(),\n", - " chain['valuation_date'].tolist(), # Start dates\n", - " chain['valuation_date'].tolist(), # Valuation dates\n", - " [True] * len(chain), # American options\n", - " ]\n", - "\n", - " def batch_hacked(*args):\n", - " \"\"\"\n", - " A batch processor to handle the CRR binomial pricing.\n", - " \"\"\"\n", - " return binomial_tree_price_batch(*args)[0]\n", - " \n", - " american_midpoint = vector_batch_processor(\n", - " batch_hacked,\n", - " *crr_params\n", - " )\n", - " chain['american_midpoint'] = american_midpoint\n", - " return pd.Series(american_midpoint, index=chain.index)\n", - "\n", - " @staticmethod\n", - " def run_calc_task(chain: pd.DataFrame, \n", - " seed_vol: List[float],\n", - " N: int = 500,\n", - " forward_col_name: str = 'f',\n", - " rates_col_name: str = None\n", - " ) -> pd.DataFrame:\n", - " \"\"\"\n", - " Calculates the European equivalent prices for the options in the chain.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " N (int): The number of steps in the binomial tree.\n", - " \n", - " Returns:\n", - " pd.DataFrame: The option chain DataFrame with European equivalent prices.\n", - " \"\"\"\n", - " chain = chain.copy()\n", - " mid = chain['midpoint'].to_numpy()\n", - "\n", - " ## Using bs_vol as seed because it is backed out of the midpoint\n", - " # seed_vol = list(chain['bs_vol'].to_numpy())\n", - "\n", - " ## Using Midpoint as initial European price because seed_vol is backed out of it\n", - " p_eu_init = ChainChecklist.get_european_price(chain=chain, \n", - " bs_vol=seed_vol,\n", - " forward_col_name=forward_col_name,\n", - " rates_col_name=rates_col_name)\n", - "\n", - " ## Calculate American prices using CRR Binomial model and Seed Vol\n", - " p_am = ChainChecklist.get_american_price(chain=chain, \n", - " sigmas=seed_vol, \n", - " N=N,\n", - " rates_col_name=rates_col_name)\n", - "\n", - " ## Calculate Early Exercise Premium (EEP) and European Equivalent Price\n", - " EEP = np.array(p_am - p_eu_init)\n", - " euro_eq_mid = list(mid - EEP)\n", - "\n", - " ## Calculate European equivalent volatilities\n", - " sigmas = ChainChecklist.get_bs_vol_on_chain(\n", - " chain,\n", - " chain['valuation_date'].iloc[0].strftime('%Y-%m-%d'),\n", - " euro_eq_mid,\n", - " rate_col_name=rates_col_name,\n", - " forward_col_name=forward_col_name\n", - " )\n", - "\n", - " chain['european_midpoint'] = p_eu_init\n", - " chain['european_vols_equiv'] = sigmas\n", - " chain['american_midpoint'] = p_am\n", - " chain['early_exercise_premium'] = EEP\n", - " chain['european_equivalent_mid'] = euro_eq_mid\n", - " return chain\n", - " \n", - " @staticmethod\n", - " def calculate_european_equivalent_vols(chain: pd.DataFrame, \n", - " N: int = 500, \n", - " iteration: int = 4,\n", - " seed_vol_col:str = None,\n", - " forward_col_name: str = 'f',\n", - " rates_col_name: str = None, \n", - " valuation_date: str|datetime = None\n", - " ) -> pd.DataFrame:\n", - " \"\"\"\n", - " Iterates the run_calc_task to refine the European equivalent prices and volatilities.\n", - " \"\"\"\n", - "\n", - " def _name_not_include_error(col_name: str, columns: pd.Index) -> bool:\n", - " if col_name not in columns:\n", - " raise ValueError(f\"{col_name} not found in chain columns: {columns.tolist()}\")\n", - " return False\n", - "\n", - " ## Valuation date validation\n", - " if valuation_date is None:\n", - " try:\n", - " valuation_date = pd.to_datetime(chain['valuation_date'].iloc[0])\n", - " except Exception as e:\n", - " raise ValueError(\"valuation_date must be provided if chain does not contain 'valuation_date' column.\") from e\n", - " else:\n", - " valuation_date = pd.to_datetime(valuation_date)\n", - "\n", - " if rates_col_name is None:\n", - " rates_col_name = 'risk_free_rate' \n", - " \n", - " ## Rates column validation\n", - " if rates_col_name not in chain.columns:\n", - " if rates_col_name != 'risk_free_rate':\n", - " print(f\"Warning: {rates_col_name} not found in chain columns. Defaulting to 'risk_free_rate'.\")\n", - " rates_col_name = 'risk_free_rate'\n", - " chain[rates_col_name] = get_rates(valuation_date.strftime('%Y-%m-%d'))\n", - "\n", - "\n", - " ## Seed Vol column validation\n", - " if seed_vol_col is None:\n", - " seed_vol_col = 'bs_vol'\n", - " chain[seed_vol_col] = get_bs_vol_on_chain(\n", - " chain=chain,\n", - " valuation_date=chain['valuation_date'].iloc[0].strftime('%Y-%m-%d'),\n", - " mid_col_name='midpoint',\n", - " rate_col_name=rates_col_name,\n", - " forward_col_name=forward_col_name\n", - " )\n", - " \n", - " ## Seed vol column validation P2\n", - " elif seed_vol_col not in chain.columns:\n", - " _name_not_include_error(seed_vol_col, chain.columns)\n", - " \n", - " ## Forward column validation\n", - " _name_not_include_error(forward_col_name, chain.columns) \n", - "\n", - "\n", - " ## Begin process\n", - " seed_vol = list(chain[seed_vol_col].to_numpy())\n", - " for i in range(iteration):\n", - " print(f\"Iteration {i+1} of {iteration}\")\n", - " chain = ChainChecklist.run_calc_task(chain,\n", - " seed_vol, \n", - " N, \n", - " forward_col_name=forward_col_name,\n", - " rates_col_name=rates_col_name)\n", - "\n", - " if i == iteration - 1:\n", - " break ## Last iteration, no need to reset variables\n", - " \n", - " ## Reset Variables for rerun\n", - " seed_vol = list(chain['european_vols_equiv'].to_numpy())\n", - " return chain\n", - "\n", - " \n", - " @staticmethod\n", - " def get_bs_vol_on_chain(\n", - " chain: pd.DataFrame,\n", - " valuation_date: str,\n", - " midpoints: pd.Series,\n", - " rate_col_name: str = None,\n", - " forward_col_name: str = 'f'\n", - " ) -> pd.Series:\n", - " \"\"\"\n", - " Estimates the Black-Scholes implied volatility for a given option chain.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " Expected Columns: `f`, `strike`, `t`, `midpoint`, `right`. \n", - " valuation_date (str): The date of valuation.\n", - " \n", - " Returns:\n", - " pd.Series: The estimated Black-Scholes implied volatility for the option chain.\n", - " \"\"\"\n", - " if rate_col_name is None:\n", - " _r = [get_rates(valuation_date)] * len(chain) \n", - "\n", - " else:\n", - " _r = chain[rate_col_name]\n", - " params = list(zip(\n", - " chain[forward_col_name if forward_col_name in chain.columns else 'f'], \n", - " chain['strike'], \n", - " chain['t'],\n", - " _r,\n", - " midpoints, \n", - " chain['right'].str.lower()\n", - " ))\n", - " return vector_batch_processor(\n", - " vector_vol_estimation,\n", - " bsm_vol_est_brute_force,\n", - " params,\n", - " )\n" - ] - }, - { - "cell_type": "markdown", - "id": "07eb9a57", - "metadata": {}, - "source": [ - "## SSVI Utilities" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "53838e5f", - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "from typing import List, Tuple, Callable\n", - "import math\n", - "from trade.helpers.pools import runProcesses\n", - "\n", - "# -------------------------------------------------\n", - "# 1. Black-Scholes Call price (no SciPy need)\n", - "# -------------------------------------------------\n", - "def normal_cdf(x): # Φ(x)\n", - " return 0.5 * (1.0 + math.erf(x / math.sqrt(2)))\n", - "\n", - "def bs_call_price(spot, strike, maturity, rate, vol):\n", - " \"\"\"Black-Scholes European call.\"\"\"\n", - " if vol <= 0 or maturity <= 0:\n", - " return max(0.0, spot - strike)\n", - " d1 = (math.log(spot / strike) + (rate + 0.5 * vol**2) * maturity) / (vol * math.sqrt(maturity))\n", - " d2 = d1 - vol * math.sqrt(maturity)\n", - " return (spot * normal_cdf(d1) -\n", - " strike * math.exp(-rate * maturity) * normal_cdf(d2))\n", - "\n", - "# -------------------------------------------------\n", - "# 2. SSVI helpers\n", - "# -------------------------------------------------\n", - "def atm_total_variance(t, var0, var_inf, kappa):\n", - " \"\"\"\n", - " θ(t) = ((var0 - var_inf)*(1 - e^{-κ t})/(κ t) + var_inf) * t\n", - " \"\"\"\n", - " return ((var0 - var_inf) * (1 - np.exp(-kappa * t))\n", - " / (kappa * t) + var_inf) * t\n", - "\n", - "def skew_phi(theta_t, eta, lam):\n", - " return eta * theta_t ** lam\n", - "\n", - "def ssvi_total_variance(log_moneyness, theta_t, eta, lam, rho):\n", - " phi_val = skew_phi(theta_t, eta, lam)\n", - " term1 = rho * phi_val * log_moneyness\n", - " term2 = np.sqrt((phi_val * log_moneyness + rho)**2 + 1 - rho**2)\n", - " return 0.5 * theta_t * (1 + term1 + term2)\n", - "\n", - "def ssvi_implied_vol(fwd, strike, maturity,\n", - " var0, var_inf, kappa,\n", - " eta, lam, rho):\n", - " \"\"\"Return σ implied by SSVI.\"\"\"\n", - " k = np.log(strike / fwd) # log-moneyness\n", - " theta_t = atm_total_variance(maturity, var0, var_inf, kappa)\n", - " total_var = ssvi_total_variance(k, theta_t, eta, lam, rho)\n", - " return np.sqrt(total_var / maturity)\n", - "\n", - "def make_candidate(bounds: List[Tuple[float, float]], iterations) -> np.ndarray:\n", - " \"\"\"\n", - " Generate a random candidate solution within the given bounds.\n", - " bounds: list of (low, high) for each dimension\n", - " \"\"\"\n", - " rng = np.random.default_rng(42)\n", - " low = np.array([b[0] for b in bounds])\n", - " high = np.array([b[1] for b in bounds])\n", - "\n", - " # (iterations, d) matrix of uniform random samples\n", - " candidates = low + (high - low) * rng.random((iterations, len(bounds)))\n", - " return candidates\n", - "\n", - "\n", - "def random_search_vec(objective_multi: Callable[[np.ndarray], np.ndarray],\n", - " bounds: List[Tuple[float, float]],\n", - " iterations: int = 40_000) -> Tuple[np.ndarray, float]:\n", - " \"\"\"\n", - " Vectorised random search.\n", - " objective_multi: accepts an (N, d) array -> returns (N,) array of losses\n", - " bounds : list of (low, high) for each dimension\n", - " iterations : how many random draws\n", - " \"\"\"\n", - "\n", - " # vectorised loss evaluation -> (iterations,)\n", - " candidates = make_candidate(bounds, iterations)\n", - " _losses = objective_multi(candidates)\n", - " best_idx = np.argmin(_losses)\n", - " return candidates[best_idx], _losses[best_idx]\n", - "\n", - "\n", - "def atm_loss_multi(X, t, iv_atm):\n", - " \"\"\"\n", - " X : (N, 3) – rows = [var0, var_inf, kappa]\n", - " t, iv_atm – market ATM maturities and vols (1-D)\n", - " returns – loss for each row (shape (N,))\n", - " \"\"\"\n", - " var0, var_inf, kappa = X[:, 0], X[:, 1], X[:, 2]\n", - " theta_t = atm_total_variance(t[:, None], var0, var_inf, kappa) # broadcast\n", - " model_iv = np.sqrt(theta_t / t[:, None])\n", - " mse = ((model_iv - iv_atm[:, None])**2).mean(axis=0) # → (N,)\n", - "\n", - " # guard against NaN / huge vols\n", - " invalid = (np.isinf(mse)) | (np.isnan(mse))\n", - " mse = np.where(invalid, 1e4, mse) # penalise\n", - " return mse\n", - "\n", - "def surface_loss_multi(params_mat, K_grid, T_grid, fwd,\n", - " var0_hat, var_inf_hat, kappa_hat,\n", - " market_iv, weights=None):\n", - " \"\"\"\n", - " params_mat : (N,3) rows [eta, lambda, rho]\n", - " returns : (N,) weighted MSE per candidate\n", - " \"\"\"\n", - " eta, lam, rho = params_mat.T\n", - " M = K_grid.shape[0]\n", - "\n", - " # normalize weights -> (M,)\n", - " if weights is None:\n", - " weights = np.ones(M, dtype=float)\n", - " else:\n", - " weights = np.asarray(weights, dtype=float)\n", - " if weights.ndim != 1 or weights.shape[0] != M:\n", - " raise ValueError(f\"weights must be shape ({M},), got {weights.shape}\")\n", - "\n", - " bad = (eta <= 0) | (lam <= -0.9) | (lam >= 1.0) | (np.abs(rho) >= 0.999)\n", - " safe_eta = np.where(bad, 1.0, eta)\n", - " safe_lam = np.where(bad, 0.0, lam)\n", - " safe_rho = np.where(bad, 0.0, rho)\n", - "\n", - " k = np.log(K_grid / fwd)[:, None] # (M,1)\n", - " T = T_grid[:, None] # (M,1)\n", - " theta = atm_total_variance(T, var0_hat, var_inf_hat, kappa_hat)\n", - "\n", - " total_var = ssvi_total_variance(\n", - " k, theta, safe_eta[None, :], safe_lam[None, :], safe_rho[None, :]\n", - " ) # (M,N)\n", - "\n", - " iv_model = np.sqrt(total_var / T) # (M,N)\n", - " invalid = (~np.isfinite(iv_model)) | (iv_model > 5)\n", - " iv_model = np.where(invalid, 1e4, iv_model)\n", - "\n", - " sqerr = (iv_model - market_iv[:, None]) ** 2 # (M,N)\n", - "\n", - " # ✅ weighted mean over M → shape (N,)\n", - " wmse = np.average(sqerr, axis=0, weights=weights)\n", - "\n", - " # slam bad candidates\n", - " wmse = np.where(bad, 1e9, wmse)\n", - " return wmse\n", - "\n", - "\n", - "\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "03996be7", - "metadata": {}, - "outputs": [], - "source": [ - "def _loss_chunk_with_idx(idx,\n", - " params_chunk,\n", - " K_grid, T_grid, fwd,\n", - " var0_hat, var_inf_hat, kappa_hat,\n", - " market_iv):\n", - " # Call your original function on a chunk\n", - " mse = surface_loss_multi(params_chunk,\n", - " K_grid, T_grid, fwd,\n", - " var0_hat, var_inf_hat, kappa_hat,\n", - " market_iv)\n", - " return idx, mse # keep index so we can reassemble in order\n", - "\n", - "\n", - "def surface_loss_multi_parallel(params_mat,\n", - " K_grid, T_grid, fwd,\n", - " var0_hat, var_inf_hat, kappa_hat,\n", - " market_iv,\n", - " *,\n", - " chunk_size=1024,\n", - " run_type='imap'):\n", - " \"\"\"\n", - " Parallel wrapper around surface_loss_multi using runProcesses.\n", - " params_mat: (N,3) -> returns (N,)\n", - " No globals; constants are passed to each worker.\n", - " \"\"\"\n", - " N = int(params_mat.shape[0])\n", - " if N == 0:\n", - " return np.empty((0,), dtype=float)\n", - "\n", - " # 1) Make chunks\n", - " chunks = [params_mat[i:min(i+chunk_size, N)] \n", - " for i in range(0, N, chunk_size)]\n", - " idxs = list(range(len(chunks)))\n", - " n = len(chunks)\n", - "\n", - " # 2) Build OrderedInputs for your runProcesses(func, [args1, args2, ...])\n", - " OrderedInputs = [\n", - " idxs,\n", - " chunks,\n", - " [K_grid] * n,\n", - " [T_grid] * n,\n", - " [fwd] * n,\n", - " [var0_hat] * n,\n", - " [var_inf_hat] * n,\n", - " [kappa_hat] * n,\n", - " [market_iv] * n,\n", - " ]\n", - "\n", - " # 3) Fan out\n", - " results = runProcesses(_loss_chunk_with_idx, OrderedInputs, run_type=run_type)\n", - "\n", - " # 4) Materialize depending on run_type\n", - " if run_type == 'amap': # async ordered\n", - " results = results.get()\n", - " elif run_type in ('imap', 'uimap'): # iterator / unordered\n", - " results = list(results)\n", - "\n", - " # 5) Reassemble in original order of rows\n", - " results.sort(key=lambda x: x[0]) # by chunk index\n", - " mse_chunks = [m for _, m in results]\n", - " return np.concatenate(mse_chunks, axis=0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "1d73db11", - "metadata": {}, - "outputs": [], - "source": [ - "def get_atm_vol(chain: pd.DataFrame,\n", - " log_moneyness_col_name: str='log_moneyness',\n", - " vol_col_name: str='crr_vol_discrete') -> pd.Series:\n", - " \"\"\"\n", - " Finds the ATM volatility for a given expiration in the chain.\n", - " Args:\n", - " x (pd.DataFrame): The option chain DataFrame for a specific expiration.\n", - " Returns:\n", - " float: The ATM volatility for the given expiration.\n", - " \"\"\"\n", - " def finder(x):\n", - " min_l_m= abs(x[log_moneyness_col_name]).min()\n", - " return x[x[log_moneyness_col_name].abs() == min_l_m][vol_col_name].values[0]\n", - " return chain.groupby('expiration').apply(finder).values\n", - "\n", - "def get_atm_T(chain: pd.DataFrame,\n", - " log_moneyness_col_name: str='log_moneyness',\n", - " t_col_name: str='t') -> pd.Series:\n", - " \"\"\"\n", - " Finds the ATM time to expiration for a given expiration in the chain.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame for a specific expiration.\n", - " \n", - " Returns:\n", - " pd.Series: The ATM time to expiration for the given expiration.\n", - " \"\"\"\n", - " def finder(x):\n", - " min_l_m= abs(x[log_moneyness_col_name]).min()\n", - " return x[x[log_moneyness_col_name].abs() == min_l_m][t_col_name].values[0]\n", - " return chain.groupby('expiration').apply(finder).values\n", - "\n", - "\n", - "def get_best_params(T_atm: List[float],\n", - " iv_atm: List[float]) -> Tuple[np.ndarray, float]:\n", - " \"\"\"\n", - " Find the best parameters for the ATM term structure.\n", - " Returns:\n", - " var0_hat, var_inf_hat, kappa_hat\n", - " \"\"\"\n", - " bounds = [(1e-4, 0.2), # var0: Min ATM Variance across DTE\n", - " (1e-4, 0.2), # var_inf_hat: Max ATM Variance across DTE\n", - " (0.05, 3.0)] # kappa: Speed from var0 to var_inf_hat\n", - " best_params, best_loss = random_search_vec(\n", - " lambda X: atm_loss_multi(X, T_atm, iv_atm),\n", - " bounds,\n", - " iterations=3000\n", - " )\n", - " return best_params, best_loss\n" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "6e0bbc8f", - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "def get_surface_params(\n", - " k_grid: np.ndarray,\n", - " t_grid: np.ndarray,\n", - " fwd_grid: float,\n", - " var0_hat: float,\n", - " var_inf_hat: float,\n", - " kappa_hat: float,\n", - " market_iv_grid: np.ndarray,\n", - " iterations: int = 50_000,\n", - " chunk_size: int = None\n", - ") -> Tuple[float, float, float, float]:\n", - " \"\"\"\n", - " Estimate the SSVI surface parameters (eta, lambda, rho) using random search.\n", - " Args:\n", - " k_grid (np.ndarray): The strike prices.\n", - " t_grid (np.ndarray): The maturities.\n", - " fwd_grid (float): The forward price.\n", - " var0_hat (float): Estimated initial variance.\n", - " var_inf_hat (float): Estimated long-term variance.\n", - " kappa_hat (float): Estimated speed of mean reversion.\n", - " market_iv_grid (np.ndarray): Market implied volatilities.\n", - " iterations (int): Number of random search iterations.\n", - " chunk_size (int): Size of chunks for parallel processing.\n", - " Returns:\n", - " Tuple[float, float, float, float]: Estimated parameters (eta, lambda, rho) and best loss.\n", - " \"\"\"\n", - " if chunk_size is None:\n", - " chunk_size = int(iterations / 8)\n", - "\n", - " # 1 tighter parameter bounds v1\n", - " surf_bounds = [(0.05, 1.5), # eta\n", - " (-0.8, 0.8), # lambda\n", - " (-0.95, 0.95)] # rho\n", - " \n", - "\n", - " surface_lamba = lambda X: surface_loss_multi_parallel(X, K_grid=k_grid, \n", - " T_grid=t_grid,\n", - " fwd=fwd_grid,\n", - " var0_hat=var0_hat,\n", - " var_inf_hat=var_inf_hat,\n", - " kappa_hat=kappa_hat,\n", - " market_iv=market_iv_grid,\n", - " chunk_size=chunk_size)\n", - " (eta_hat, lambda_hat, rho_hat), best_loss = random_search_vec(surface_lamba,\n", - " surf_bounds, \n", - " iterations)\n", - "\n", - " return eta_hat, lambda_hat, rho_hat, best_loss\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "53c4302c", - "metadata": {}, - "outputs": [], - "source": [ - "## Getters\n", - "## Import Resolved\n", - "def get_K_grid(chain:pd.DataFrame, col_name: str='strike') -> np.ndarray:\n", - " \"\"\"\n", - " Retrieves the strike prices from the option chain.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " col_name (str): The column name to retrieve (default is 'strike').\n", - " \n", - " Returns:\n", - " np.ndarray: The strike prices for the option chain.\n", - " \"\"\"\n", - " return chain[col_name].values\n", - "\n", - "def get_T_grid(chain:pd.DataFrame, col_name: str='t') -> np.ndarray:\n", - " \"\"\"\n", - " Retrieves the maturities from the option chain.\n", - "\n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " col_name (str): The column name to retrieve (default is 't').\n", - " Returns:\n", - " np.ndarray: The maturities for the option chain.\n", - " \"\"\"\n", - " return chain[col_name].values\n", - "\n", - "def get_T_grid(chain:pd.DataFrame, col_name: str='t') -> np.ndarray:\n", - " \"\"\"\n", - " Retrieves the maturities from the option chain.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " col_name (str): The column name to retrieve (default is 't').\n", - " Returns:\n", - " np.ndarray: The maturities for the option chain.\n", - " \"\"\"\n", - " return chain[col_name].values\n", - "\n", - "def get_market_iv_grid(chain:pd.DataFrame, col_name: str='iv') -> np.ndarray:\n", - " \"\"\"\n", - " Retrieves the market implied volatilities from the option chain.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " col_name (str): The column name to retrieve (default is 'iv').\n", - " \n", - " Returns:\n", - " np.ndarray: The market implied volatilities for the option chain.\n", - " \"\"\"\n", - " return chain[col_name].values\n", - "\n", - "def get_fwd_grid(chain:pd.DataFrame, col_name: str='f') -> float:\n", - " \"\"\"\n", - " Retrieves the forward price from the option chain.\n", - "\n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " col_name (str): The column name to retrieve (default is 'f').\n", - " \"\"\"\n", - " return chain[col_name].iloc[0] # Assuming F is constant across the chains\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "dcea0116", - "metadata": {}, - "outputs": [], - "source": [ - "## Import Resolved\n", - "def calculate_normalized_rmse_loss(\n", - " market_iv: np.ndarray,\n", - " model_iv: np.ndarray,\n", - " moneyness: np.ndarray,\n", - ") -> Tuple[float, float, float]:\n", - " \n", - " \"\"\"\n", - " Calculate the normalized loss between market and model implied volatilities.\n", - " \n", - " Args:\n", - " market_iv (np.ndarray): Market implied volatilities.\n", - " model_iv (np.ndarray): Model implied volatilities.\n", - " moneyness (np.ndarray): Moneyness values.\n", - " \n", - " Returns:\n", - " Tuple[float, float, float]: Normalized median loss, right wing loss, left wing loss.\n", - " \"\"\"\n", - " \n", - " ## Normalized Median\n", - " median_iv = np.median(market_iv)\n", - " normalized_median_loss = np.sqrt(np.mean((market_iv - model_iv)**2)) / median_iv\n", - "\n", - " ## Right Wing Loss (> 1.0)\n", - " right_wing_mask = moneyness > 1.0\n", - " median_right_wing_iv = np.median(market_iv[right_wing_mask])\n", - " right_wing_loss = np.sqrt(np.mean(\n", - " (market_iv[right_wing_mask] - model_iv[right_wing_mask]) **2)) / median_right_wing_iv\n", - "\n", - " ## Left Wing Loss (< 1.0)\n", - " left_wing_mask = moneyness < 1.0\n", - " median_left_wing_iv = np.median(market_iv[left_wing_mask])\n", - " left_wing_loss = np.sqrt(np.mean(\n", - " (market_iv[left_wing_mask] - model_iv[left_wing_mask])**2)) / median_left_wing_iv\n", - "\n", - " return normalized_median_loss, right_wing_loss, left_wing_loss\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "bb21a3f4", - "metadata": {}, - "outputs": [], - "source": [ - "## Import Resolved\n", - "def calculate_normalized_mae_loss(\n", - " market_iv: np.ndarray,\n", - " model_iv: np.ndarray,\n", - " moneyness: np.ndarray\n", - ") -> Tuple[float, float, float]:\n", - " \"\"\"\n", - " Calculate the normalized mean absolute error (MAE) loss between market and model implied volatilities.\n", - " \n", - " Args:\n", - " market_iv (np.ndarray): Market implied volatilities.\n", - " model_iv (np.ndarray): Model implied volatilities.\n", - " moneyness (np.ndarray): Moneyness values.\n", - " \n", - " Returns:\n", - " Tuple[float, float, float]: Normalized median MAE loss, right wing MAE loss, left wing MAE loss.\n", - " \"\"\"\n", - " \n", - " ## Normalized Median\n", - " median_iv = np.median(market_iv)\n", - " normalized_median_mae_loss = np.mean(np.abs(market_iv - model_iv)) / median_iv\n", - "\n", - " ## Right Wing Loss (> 1.0)\n", - " right_wing_mask = moneyness > 1.0\n", - " median_right_wing_iv = np.median(market_iv[right_wing_mask])\n", - " right_wing_mae_loss = np.mean(\n", - " np.abs(market_iv[right_wing_mask] - model_iv[right_wing_mask])) / median_right_wing_iv\n", - "\n", - " ## Left Wing Loss (< 1.0)\n", - " left_wing_mask = moneyness < 1.0\n", - " median_left_wing_iv = np.median(market_iv[left_wing_mask])\n", - " left_wing_mae_loss = np.mean(\n", - " np.abs(market_iv[left_wing_mask] - model_iv[left_wing_mask])) / median_left_wing_iv\n", - "\n", - " return normalized_median_mae_loss, right_wing_mae_loss, left_wing_mae_loss" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "cdf665c6", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.2464065708418891" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "## Import Resolved\n", - "def identify_length_for_model(string, integer) -> int:\n", - " \"\"\"\n", - " \n", - " Identify the length of the timeframe in minutes based on the string and integer provided.\n", - " Parameters\n", - " \n", - " ----------\n", - " string : str\n", - " The string representing the timeframe (e.g., 'm', 'd', 'w', 'y').\n", - " integer : int\n", - " The integer representing the number of units for the timeframe.\n", - " Returns\n", - " -------\n", - " int\n", - " The length of the timeframe in minutes.\n", - " \n", - " \"\"\"\n", - "\n", - " TIMEFRAMES_VALUES = {'d': 1, 'w': 7, 'm': 30, 'y': DAILY_BASIS}\n", - " assert string in TIMEFRAMES_VALUES.keys(\n", - " ), f'Available timeframes are {TIMEFRAMES_VALUES.keys()}, recieved \"{string}\"'\n", - " return integer * TIMEFRAMES_VALUES[string]\n", - "\n", - "def convert_date_to_time_to_maturity(dt: str,\n", - " valuation_date: str = None) -> float:\n", - " \"\"\"\n", - " Converts a date to time to maturity in years.\n", - " \n", - " Args:\n", - " dt (datetime): The date to convert.\n", - " example: '3m', '2025-08-08', 1\n", - " \n", - " Returns:\n", - " float: Time to maturity in years.\n", - " \"\"\"\n", - "\n", - " ## If dt is a string, check if it is a date or a duration\n", - " if isinstance(dt, (str, pd.Timestamp, datetime, date)):\n", - " try:\n", - " # Try to parse as a date first\n", - " dt = pd.to_datetime(dt)\n", - " assert valuation_date is not None, \"valuation_date must be provided if dt is a date string\"\n", - " valuation_date = pd.to_datetime(valuation_date)\n", - " dt = (dt - valuation_date).days\n", - " except ValueError:\n", - " # If it fails, assume it's a duration\n", - " dt = identify_length_for_model(*extract_numeric_value(dt))\n", - " if dt is None:\n", - " raise ValueError(f\"Invalid date or duration format: {dt}\")\n", - " elif isinstance(dt, (float,int)):\n", - " # If dt is a number, assume it's a duration in days\n", - " dt = float(dt)\n", - " elif isinstance(dt, pd.Timedelta):\n", - " # If dt is a timedelta, convert it to days\n", - " dt = dt.days\n", - "\n", - " else:\n", - " raise ValueError(f\"Unsupported type for dt: {type(dt)}. Expected str, int, float, datetime, or pd.Timedelta.\")\n", - "\n", - " assert_dt_within_range(dt)\n", - " return dt/DAILY_BASIS\n", - "\n", - "def assert_dt_within_range(dt: float):\n", - " \"\"\"\n", - " Asserts that the time to maturity is within the range defined by PRICING_CONFIG.\n", - " \n", - " Args:\n", - " dt (float): The time to maturity in years.\n", - " \n", - " Raises:\n", - " ValueError: If dt is not within the configured range.\n", - " \"\"\"\n", - " if not (PRICING_CONFIG['VOL_SURFACE_MIN_DTE_THRESHOLD'] <= dt <= PRICING_CONFIG['VOL_SURFACE_MAX_DTE_THRESHOLD']):\n", - " raise ValueError(f\"Time to maturity {dt} is out of bounds. \"\n", - " f\"Must be between {PRICING_CONFIG['VOL_SURFACE_MIN_DTE_THRESHOLD']} and {PRICING_CONFIG['VOL_SURFACE_MAX_DTE_THRESHOLD']}.\")\n", - "\n", - "convert_date_to_time_to_maturity('3m')" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "2c41d8a4", - "metadata": {}, - "outputs": [], - "source": [ - "## Import Resolved\n", - "## Strike Convert Utils\n", - "\n", - "def assert_k_bounds_model_range(k: list | np.ndarray,\n", - " f: float | np.ndarray) -> None:\n", - " \"\"\"\n", - " Asserts that the strikes are within the bounds defined by PRICING_CONFIG.\n", - " Args:\n", - " k (list or np.ndarray): List of strikes.\n", - " Raises:\n", - " ValueError: If any strike is not within the configured bounds.\n", - " \"\"\"\n", - " conf = get_pricing_config()\n", - " k = np.array(k, dtype=float)\n", - " if not np.all((k <= f * (conf['VOL_SURFACE_MAX_MONEYNESS_THRESHOLD'])) &\n", - " (k >= f * (conf['VOL_SURFACE_MIN_MONEYNESS_THRESHOLD']))):\n", - " raise ValueError(f\"Strikes {k} are out of bounds. \"\n", - " f\"Must be between {f * (conf['VOL_SURFACE_MIN_MONEYNESS_THRESHOLD'])} and {f * (conf['VOL_SURFACE_MAX_MONEYNESS_THRESHOLD'])}.\")\n", - "\n", - "def handle_strikes(\n", - " k: list| np.ndarray,\n", - " f: list| float, \n", - " strike_type: Literal['p', 'k', 'pf', 'f'],\n", - " spot: float = None\n", - ") -> np.ndarray:\n", - " \"\"\"\n", - " Convert strikes based on the specified strike type.\n", - " Since SSVI model takes strikes values as absolute values, this function converts the strikes\n", - " \n", - " Args:\n", - " k (list or np.ndarray): List of strikes.\n", - " f (list or float): Forward price.\n", - " strike_type (str): Type of strike ('p', 'k', 'pf', 'f').\n", - " \n", - " Types available:\n", - " - 'p': Percent of spot eg: 1.0 == ATM\n", - " - 'k': Strike to fwd_grid: if spot = 100, k=100=ATM\n", - " - 'pf': Percent of fwd_grid/forward price eg: 1.0 == ATMF\n", - " - 'f': Log moneyness to fwd_grid: 0.0 == ATMF\n", - " \n", - " Returns:\n", - " np.ndarray: Converted strikes.\n", - " \"\"\"\n", - " k = np.array(k, dtype=float)\n", - " if strike_type == 'p': ## Percent of spot to fwd_grid\n", - " if spot is None:\n", - " raise ValueError(\"Spot price must be provided for 'p' strike type.\")\n", - " \n", - " strikes= k * spot\n", - " elif strike_type == 'k': ## Strike to fwd_grid\n", - " strikes= k\n", - " elif strike_type == 'pf': ## Percent of fwd_grid/forward price\n", - " strikes= k * f\n", - " elif strike_type == 'f': ## Log moneyness to fwd_grid\n", - " ## Convert log moneyness to strikes\n", - " strikes= np.exp(k) * f\n", - "\n", - " else:\n", - " raise ValueError(f\"Invalid strike type: {strike_type}\")\n", - " assert_k_bounds_model_range(strikes, f)\n", - " return strikes\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "id": "6d25652c", - "metadata": {}, - "source": [ - "## Model Classes\n", - "\n", - "- `SSVIModelParams`: Parameters dataclass\n", - "- `BaseSSVIModel`: ABC class for SSVI Model\n", - "- `SSVIModel`: The model that expects simple inputs, and calibrates accordingly\n", - "- `MarketSSVIModel (EODMarketSSVIModel, IntraMarketSSVIModel)`: Market aware class respnsible for initiating necessary items (Differentiating btwn EOD & Intra might be unnecessary)\n", - "- `ChainInputModel`: Responsible for creating the chain and populating with respective columns\n", - "- `MarketChainInputModel`: Market aware that feeds to ChainInputModel\n", - "- `ChainOutput`: dataclass holding the chain and respective information\n", - "- `SSVI_GlobalConfig`: Class holding information useful for ssvi. Eg when predicting vol, to predict on Put chain, Call chain or OTM chain" - ] - }, - { - "cell_type": "markdown", - "id": "077674dd", - "metadata": {}, - "source": [ - "### Global Config" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "5cfd25c4", - "metadata": {}, - "outputs": [], - "source": [ - "## Import Resolved\n", - "GLOBAL_CONFIG = None\n", - "\n", - "class VolSide(str, Enum):\n", - " CALL = 'call'\n", - " PUT = 'put'\n", - " OTM = 'otm'\n", - "\n", - "class VolType(str, Enum):\n", - " BS = 'bs'\n", - " BINOMIAL = 'binomial'\n", - "\n", - "class DivType(str, Enum):\n", - " DISCRETE = 'discrete'\n", - " CONTINUOUS = 'continuous'\n", - "\n", - "\n", - "@stdlib_dataclass\n", - "class SSVIGlobalConfig:\n", - " \"\"\"\n", - " Singleton class for global configuration of the SSVI model.\n", - " There will only be one instance of this class. Whether you create a new instance or use the instance() method,\n", - " you will always get the same object.\n", - "\n", - " Intention is to provide a centralized configuration for the SSVI model that can be easily accessed and modified.\n", - " \"\"\"\n", - " __SINGLETON__: ClassVar[bool] = True\n", - " _CREATED: ClassVar[Optional[\"SSVIGlobalConfig\"]] = None\n", - " _initialized: ClassVar[bool] = False\n", - " \"\"\"\n", - " Global configuration for SSVI model.\n", - " Attributes:\n", - " vol_side (VolSide): Which side of the volatility surface to model ('call', 'put', 'otm').\n", - " div_type (DivType): Type of dividends to consider ('discrete', 'continuous').\n", - " vol_type (VolType): Type of volatility to use for calibration ('bs', 'binomial').\n", - " N (int): Number of steps for binomial model.\n", - " iteration (int): Number of iterations for refining European equivalent volatilities.\n", - " \"\"\"\n", - " vol_side: VolSide = stdlib_field(default=VolSide.OTM)\n", - " div_type: DivType = stdlib_field(default=DivType.DISCRETE)\n", - " vol_type: VolType = stdlib_field(default=VolType.BINOMIAL)\n", - " N: int = stdlib_field(default=250)\n", - " iteration: int = stdlib_field(default=2)\n", - " chunk_size: int = stdlib_field(default=5000)\n", - " model_iterations: int = stdlib_field(default=50_000)\n", - " save_cache: bool = stdlib_field(default=True)\n", - " force_calc: bool = stdlib_field(default=False)\n", - " overwrite_existing: bool = stdlib_field(default=False)\n", - " fit_all_sides: bool = stdlib_field(default=False)\n", - "\n", - " def __new__(cls, *args, **kwargs):\n", - " if cls.__SINGLETON__ and cls._CREATED is not None:\n", - " return cls._CREATED\n", - " instance = super().__new__(cls)\n", - " cls._CREATED = instance\n", - " return instance\n", - "\n", - " def __init__(self):\n", - " if self._initialized:\n", - " return\n", - " self._initialized = True\n", - "\n", - " @classmethod\n", - " def instance(cls):\n", - " if cls._CREATED is None:\n", - " cls._CREATED = cls()\n", - " return cls._CREATED\n", - "\n", - " @classmethod\n", - " def reset(cls):\n", - " cls._CREATED = None\n", - "\n", - " def __setattr__(self, name, value):\n", - " ## Ensure enum values are valid\n", - " enum_names = {\n", - " 'vol_side': VolSide,\n", - " 'div_type': DivType,\n", - " 'vol_type': VolType, \n", - " }\n", - " if name in enum_names:\n", - " if isinstance(value, str):\n", - " try:\n", - " value = enum_names[name](value)\n", - " except ValueError:\n", - " raise ValueError(f\"Invalid value '{value}' for {name}. Allowed values are: {[e.value for e in enum_names[name]]}\")\n", - " elif not isinstance(value, enum_names[name]):\n", - " raise ValueError(f\"{name} must be an instance of {enum_names[name]}\")\n", - " super().__setattr__(name, value)\n", - "\n", - "def set_global_config(config: SSVIGlobalConfig):\n", - " if not isinstance(config, SSVIGlobalConfig):\n", - " raise ValueError(\"Config must be an instance of SSVIGlobalConfig\")\n", - "\n", - " global GLOBAL_CONFIG\n", - " GLOBAL_CONFIG = config\n", - "\n", - "def get_global_config() -> SSVIGlobalConfig:\n", - " global GLOBAL_CONFIG\n", - " if GLOBAL_CONFIG is None:\n", - " GLOBAL_CONFIG = SSVIGlobalConfig() # Default configuration\n", - " return GLOBAL_CONFIG\n", - "\n", - "GLOBAL_CONFIG = get_global_config()" - ] - }, - { - "cell_type": "markdown", - "id": "8c0368c9", - "metadata": {}, - "source": [ - "### ChainInputModel" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "671eedd4", - "metadata": {}, - "outputs": [], - "source": [ - "## Import Resolved\n", - "def chain_cache_key(root: str,\n", - " valuation_date: str|datetime,\n", - " div_type: DivType,\n", - " vol_type: VolType) -> str:\n", - " \"\"\"\n", - " Generates a unique key for caching the option chain based on root, valuation date, dividend type, and volatility type.\n", - " \n", - " Args:\n", - " root (str): The root symbol of the underlying asset.\n", - " valuation_date (str or datetime): The date of valuation.\n", - " div_type (DivType): Type of dividends considered.\n", - " vol_type (VolType): Type of volatility used for calibration.\n", - " \n", - " Returns:\n", - " str: A unique key for caching the option chain.\n", - " \"\"\"\n", - " val_date = pd.to_datetime(valuation_date).strftime('%Y-%m-%d')\n", - " return f\"{root}_{val_date}_{div_type.value}_{vol_type.value}\"\n", - "\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "id": "78b3a157", - "metadata": { - "notebookRunGroups": { - "groupValue": "2" - } - }, - "outputs": [], - "source": [ - "## Import Resolved\n", - "def params_cache_key(\n", - " root: str,\n", - " valuation_date: str|datetime,\n", - " div_type: DivType,\n", - " vol_type: VolType,\n", - " side: VolSide,\n", - ") -> str:\n", - " \"\"\"\n", - " Generates a unique key for caching the params from SSVI fitting based on root, valuation, div type, vol type & vol side\n", - " Args:\n", - " root (str): The root symbol of the underlying asset.\n", - " valuation_date (str or datetime): The date of valuation.\n", - " div_type (DivType): Type of dividends considered.\n", - " vol_type (VolType): Type of volatility used for calibration.\n", - " side (VolSide): Type of side. otm, call, puts\n", - " \n", - " Returns:\n", - " str: A unique key for caching the params chain.\n", - " \"\"\"\n", - " val_date = pd.to_datetime(valuation_date).strftime('%Y-%m-%d')\n", - " return f\"{root}_{val_date}_{div_type.value}_{vol_type.value}_{side.value}\"\n" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "id": "bb74063a", - "metadata": {}, - "outputs": [], - "source": [ - "## Import Resolved\n", - "class ChainInputModel(ABC):\n", - " \"\"\"\n", - " Abstract base class for option chain input models.\n", - " \"\"\"\n", - " @abstractmethod\n", - " def validate(self):\n", - " pass\n", - "\n", - " @abstractmethod\n", - " def get_chain(self) -> pd.DataFrame:\n", - " pass\n", - "\n", - " @abstractmethod\n", - " def build_chain(self) -> pd.DataFrame:\n", - " pass\n", - "\n", - "\n", - "@dataclass(config=ConfigDict(arbitrary_types_allowed=True))\n", - "class ChainOutput:\n", - " \"\"\"\n", - " Dataclass to hold the output of the chain processing.\n", - " \"\"\"\n", - " root: Optional[str] = Field(default=None, description=\"Root symbol of the underlying asset.\")\n", - " data_chain: Optional[pd.DataFrame] = Field(default_factory=None, description=\"Processed option chain DataFrame\")\n", - " source_from_cache: bool = Field(default=False, description=\"Indicates if the chain was sourced from cache\")\n", - " spot: float = Field(..., description=\"Spot price of the underlying asset\")\n", - " div_type: DivType = Field(default=GLOBAL_CONFIG.div_type, description=\"Type of dividends considered\")\n", - " vol_type: VolType = Field(default=GLOBAL_CONFIG.vol_type, description=\"Type of volatility used for calibration\")\n", - " pv_div_col: str = Field(default=None, description=\"Column name for present value of dividends if applicable\")\n", - " div_schedule_col: str = Field(default=None, description=\"Column name for dividend schedule if applicable\")\n", - " fwd_col_name: str = Field(default=None, description=\"Column name for forward prices if applicable\")\n", - " rate_col: str = Field(default=None, description=\"Column name for interest rates if applicable\")\n", - " vol_col: str = Field(default='vol', description=\"Column name for implied volatilities\")\n", - " t_col: str = Field(default='t', description=\"Column name for time to maturity\")\n", - " strike_col: str = Field(default='strike', description=\"Column name for strike prices\")\n", - " f_log_m_col: str = Field(default='f_log_moneyness', description=\"Column name for log moneyness\")\n", - " fwd_m_col: str = Field(default='f_moneyness', description=\"Column name for forward moneyness\")\n", - " right_col: str = Field(default='right', description=\"Column name for option rights (call/put)\")\n", - " midpoint_col: str = Field(default='midpoint', description=\"Column name for option midpoints\")\n", - " valuation_date: str|datetime = Field(..., description=\"Valuation date for the option chain\")\n", - "\n", - " def __post_init__(self):\n", - " self.validate()\n", - "\n", - "\n", - " def validate(self):\n", - " \"\"\"\n", - " Validates the chain DataFrame to ensure all required columns are present.\n", - " Raises ValueError if any required column is missing.\n", - " \"\"\"\n", - " if self.source_from_cache:\n", - " return # Skip validation if sourced from cache\n", - " if self.data_chain is None:\n", - " raise ValueError(\"Chain DataFrame cannot be None\")\n", - " if self.data_chain.empty:\n", - " raise ValueError(\"Chain DataFrame cannot be empty\")\n", - " required_columns = [\n", - " self.strike_col,\n", - " self.right_col,\n", - " self.midpoint_col,\n", - " self.pv_div_col,\n", - " self.div_schedule_col,\n", - " self.rate_col,\n", - " 'expiration',\n", - " self.vol_col,\n", - " self.t_col,\n", - " self.fwd_col_name,\n", - "\n", - " ]\n", - "\n", - " for col in required_columns:\n", - " if col not in self.data_chain.columns:\n", - " raise ValueError(f\"Missing required column: {col}\")\n", - " \n", - " def _cache_chain(self):\n", - " \"\"\"\n", - " Caches the chain DataFrame to optimize access to frequently used columns.\n", - "\n", - " We cache to avoid loading multiple dataframes in memory. Instead it's saved to disk.\n", - " This is particularly useful when dealing with large datasets or when the same data is accessed multiple times.\n", - " 1. Check if the chain with the same key already exists in the cache.\n", - " 2. If not, store the current chain in the cache.\n", - " 3. If it exists, log that the chain is already cached.\n", - " global CHAIN_DUMP_CACHE\n", - " 4. Access the cached chain using the key.\n", - " 5. Use lightweight accessors to retrieve specific columns from the cached chain without duplicating data.\n", - " 6. This approach minimizes memory usage and improves performance by avoiding redundant data storage.\n", - " 7. The use of properties allows for easy and intuitive access to the cached data.\n", - " \"\"\"\n", - " \n", - " if self.key not in CHAIN_DUMP_CACHE:\n", - " if self.data_chain is None:\n", - " raise ValueError(\"Chain DataFrame cannot be None when caching. Consider reloading the chain.\")\n", - " if self.data_chain.empty:\n", - " raise ValueError(\"Chain DataFrame cannot be empty when caching. Consider reloading the chain.\")\n", - " \n", - " ## Add config hash to the chain for versioning\n", - " chain = self.data_chain.copy()\n", - " chain['config_hash']=hash_config(get_pricing_config())\n", - " CHAIN_DUMP_CACHE[self.key] = chain\n", - " logger.info(\"Caching chain for key in ChainOutput: %s\", self.key)\n", - " else:\n", - " logger.info(f\"Chain with key: {self.key} already cached.\")\n", - " \n", - " if self.data_chain is not None:\n", - " self.data_chain = None\n", - " \n", - "\n", - "\n", - " @property\n", - " def key(self):\n", - " val_date = pd.to_datetime(self.valuation_date).strftime('%Y-%m-%d')\n", - " return chain_cache_key(\n", - " self.root,\n", - " val_date,\n", - " self.div_type,\n", - " self.vol_type\n", - " )\n", - "\n", - " @property\n", - " def chain(self):\n", - " chain = CHAIN_DUMP_CACHE.get(self.key, None)\n", - " if chain is None:\n", - " chain = self.data_chain\n", - " if chain is None:\n", - " raise ValueError(\"Chain gone missing from cache. Consider reloading the chain.\")\n", - " return chain\n", - "\n", - " # Lightweight accessors (views of chain; no extra storage)\n", - " @property\n", - " def vol(self) -> pd.Series:\n", - " return self.chain[self.vol_col]\n", - "\n", - " @property\n", - " def t(self) -> pd.Series:\n", - " return self.chain[self.t_col]\n", - "\n", - " @property\n", - " def strike(self) -> pd.Series:\n", - " return self.chain[self.strike_col]\n", - "\n", - " @property\n", - " def right(self) -> pd.Series:\n", - " return self.chain[self.right_col]\n", - "\n", - " @property\n", - " def midpoint(self) -> pd.Series:\n", - " return self.chain[self.midpoint_col]\n", - "\n", - " @property\n", - " def fwd(self) -> Optional[pd.Series]:\n", - " return None if self.fwd_col_name is None else self.chain[self.fwd_col_name]\n", - "\n", - " @property\n", - " def rates(self) -> Optional[pd.Series]:\n", - " return None if self.rate_col is None else self.chain[self.rate_col]\n", - " \n", - " def __repr__(self):\n", - " return f\"\"\n", - "\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "id": "8a4046e6", - "metadata": {}, - "outputs": [], - "source": [ - "GLOBAL_CONFIG.div_type\n", - "import sys" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "id": "d1183f5f", - "metadata": {}, - "outputs": [], - "source": [ - "## Import Resolved\n", - "##Creating chain process\n", - "run_date = '2025-05-15'\n", - "symbol = 'AAPL'\n", - "\n", - "def _load_chain(symbol: str, run_date: str, ignore_cache: bool=False) -> ChainOutput:\n", - " \"\"\"\n", - " Load and process the option chain for a given symbol and run date.\n", - " Args:\n", - " symbol (str): The underlying asset symbol.\n", - " run_date (str): The valuation date in 'YYYY-MM-DD' format.\n", - " Returns:\n", - " ChainInputModel: Processed option chain model.\n", - " \"\"\"\n", - " key = chain_cache_key(\n", - " root=symbol,\n", - " valuation_date=run_date,\n", - " div_type=GLOBAL_CONFIG.div_type,\n", - " vol_type=GLOBAL_CONFIG.vol_type\n", - " )\n", - "\n", - " if key not in CHAIN_DUMP_CACHE or ignore_cache:\n", - " logger.info(f\"Loading chain for {symbol} on {run_date} with key: {key}\")\n", - " chain = get_chain(symbol, run_date)\n", - " chain = format_chain(chain)\n", - "\n", - " ## Will not do for now\n", - " logger.info(f\"Initial chain size: {chain.shape[0]}\")\n", - "\n", - " ## Get Rates for use\n", - " r = get_rates(run_date)\n", - " chain['risk_free_rate'] = r\n", - " logger.info(f\"Risk-free rate on {run_date}: {r}\")\n", - "\n", - " ## load forward price on chain\n", - " chain = get_forward_price_on_chain(\n", - " chain=chain,\n", - " valuation_date=run_date,\n", - " r=r,\n", - " div_type=GLOBAL_CONFIG.div_type\n", - " )\n", - " logger.info(\"After F load: %s\", chain.shape[0])\n", - "\n", - "\n", - " ## Checklist\n", - " chain = ChainChecklist.remove_junk_quotes(chain)\n", - " logger.info(\"After junk removal: %s\", chain.shape[0])\n", - "\n", - " ## Get Vol on chain\n", - " # return chain\n", - " logger.info(f\"Calculating vols using {GLOBAL_CONFIG.vol_type} model\")\n", - " if GLOBAL_CONFIG.vol_type == VolType.BS:\n", - " ## NOTE: Consider switching to ChainChecklist.calculate_european_equiv_vol\n", - " vol = get_bs_vol_on_chain(\n", - " chain,\n", - " run_date,\n", - " rate_col_name='risk_free_rate',\n", - " forward_col_name='f',\n", - " mid_col_name='midpoint',\n", - " )\n", - "\n", - " elif GLOBAL_CONFIG.vol_type == VolType.BINOMIAL:\n", - " vol = get_discrete_crr_vol_on_chain(\n", - " chain,\n", - " run_date,\n", - " N=GLOBAL_CONFIG.N,\n", - " rates_col_name='risk_free_rate',\n", - " div_type=GLOBAL_CONFIG.div_type.value\n", - " )\n", - "\n", - " else:\n", - " raise ValueError(f\"Invalid vol_type: {GLOBAL_CONFIG.vol_type}\")\n", - "\n", - " chain['vol'] = vol\n", - " logger.info(\"After vol calculation: %s\", chain.shape[0])\n", - " else:\n", - " logger.info(f\"Using cached chain for {symbol} on {run_date} with key: {key}\")\n", - " chain = CHAIN_DUMP_CACHE[key]\n", - " \n", - " ## Check if config hash is up to date\n", - " ## If not, reload the chain on overwrite_existing=True\n", - " ## Else, warn user\n", - " if not is_latest_config(chain['config_hash'].values[0]):\n", - " if GLOBAL_CONFIG.overwrite_existing:\n", - " logger.warning(\"Cached chain config hash is outdated. Overwriting existing cache.\")\n", - " del CHAIN_DUMP_CACHE[key]\n", - " return _load_chain(symbol, run_date)\n", - " else:\n", - " logger.warning(\"Cached chain config hash is outdated. Use 'overwrite_existing=True' to overwrite from get_global_config.\")\n", - "\n", - " if chain is None:\n", - " del CHAIN_DUMP_CACHE[key]\n", - " logger.warning(\"Cached chain was None, reloading...\")\n", - " return _load_chain(symbol, run_date)\n", - "\n", - " ## Create output dataclass\n", - " output = ChainOutput(\n", - " root=symbol,\n", - " data_chain=chain,\n", - " spot=chain['spot'].iloc[0],\n", - " div_type=GLOBAL_CONFIG.div_type,\n", - " vol_type=GLOBAL_CONFIG.vol_type,\n", - " pv_div_col='div_pv',\n", - " fwd_col_name='f',\n", - " rate_col='risk_free_rate',\n", - " vol_col='vol',\n", - " t_col='t',\n", - " strike_col='strike',\n", - " right_col='right',\n", - " midpoint_col='midpoint',\n", - " valuation_date=run_date,\n", - " div_schedule_col='div_schedule'\n", - " )\n", - " return output\n", - "\n", - "# chain_output = _load_chain(symbol, run_date)" - ] - }, - { - "cell_type": "markdown", - "id": "e5bbebee", - "metadata": {}, - "source": [ - "### MarketChainLoader" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "id": "bde767d0", - "metadata": {}, - "outputs": [], - "source": [ - "## Import Resolved\n", - "class MarketChainLoader(BaseModel, ChainInputModel, SingletonMixin):\n", - " \"\"\"\n", - " Market model to load and process option chain data.\n", - " \"\"\"\n", - " model_config = ConfigDict(validate_assignment=True)\n", - " _instances: ClassVar[dict[str, \"MarketChainLoader\"]] = {}\n", - " _initialized: bool = PrivateAttr(default=False)\n", - " \n", - " symbol: str = Field(..., description=\"Symbol of the underlying asset\")\n", - " valuation_date: str|datetime = Field(..., description=\"Run date for the data\")\n", - " _chains: Optional[dict[str, ChainOutput]] = PrivateAttr(default_factory=dict)\n", - "\n", - " ## Post init to format valuation_date\n", - " def model_post_init(self, context):\n", - " self.valuation_date = pd.to_datetime(self.valuation_date).strftime('%Y-%m-%d')\n", - "\n", - " @property\n", - " def run_date(self) -> datetime:\n", - " return pd.to_datetime(self.valuation_date)\n", - "\n", - " @classmethod\n", - " def clear_instances(cls):\n", - " cls._instances.clear()\n", - "\n", - " @classmethod\n", - " def instances(cls):\n", - " return cls._instances\n", - "\n", - " def __new__(cls, symbol: str, *args, **kwargs):\n", - " if symbol not in cls._instances:\n", - " instance = super().__new__(cls)\n", - " cls._instances[symbol] = instance\n", - " return cls._instances[symbol]\n", - "\n", - " def __init__(self, *args, **data):\n", - " # First-time init for this cached instance:\n", - " # If __pydantic_private__ isn't set yet, it's the first real init.\n", - " if getattr(self, \"__pydantic_private__\", None) is None:\n", - " super().__init__(*args, **data) # sets fields and creates private store\n", - " self._initialized = True # safe now\n", - " return\n", - " \n", - " # Subsequent inits for this cached instance:\n", - " if self._initialized:\n", - " # Already initialized, just update fields\n", - " for key, value in data.items():\n", - " setattr(self, key, value)\n", - "\n", - " def _force_rebuild(self) -> bool:\n", - " \"\"\"\n", - " Determines if the chain needs to be rebuilt based on the current run date.\n", - " And cross-referencing the GLOBAL_CONFIG settings.\n", - " Returns:\n", - " bool: True if the chain needs to be rebuilt, False otherwise.\n", - " \"\"\"\n", - " ## If run_date not in chains, we need to build\n", - " if self.run_date not in self._chains:\n", - " return True\n", - " \n", - " ## If GLOBAL_CONFIG has changed, we need to rebuild\n", - " existing_chain = self._chains[self.run_date]\n", - " if (existing_chain.div_type != GLOBAL_CONFIG.div_type or\n", - " existing_chain.vol_type != GLOBAL_CONFIG.vol_type):\n", - " return True\n", - "\n", - " def build_chain(self, force_rebuild: bool = False, ignore_cache: bool = False) -> ChainOutput:\n", - " \"\"\"\n", - " Loads and processes the option chain data.\n", - " force_rebuild: If True, forces a rebuild of the ChainOutput object from source even if it is cached within ChainOutput self._chains.\n", - " ignore_cache: If True, ignores any cached chain data in CHAIN_DUMP_CACHE and reloads from source.\n", - " Returns:\n", - " ChainOutput: Processed option chain data.\n", - " \"\"\"\n", - " \n", - " ## Generate cache key for the chain\n", - " chain_key = chain_cache_key(\n", - " root=self.symbol,\n", - " valuation_date=self.run_date,\n", - " div_type=GLOBAL_CONFIG.div_type,\n", - " vol_type=GLOBAL_CONFIG.vol_type\n", - " )\n", - "\n", - " ## Check if key exists in cache\n", - " key_in_cache = chain_key in CHAIN_DUMP_CACHE\n", - "\n", - " ## If force_rebuild is True, or if the chain needs to be rebuilt based on config changes\n", - " if self._force_rebuild() or force_rebuild:\n", - " logger.info(f\"Rebuilding chain for {self.symbol} on {self.run_date} because config changed or not cached\")\n", - " \n", - " ## If key exists in cache, use it to create ChainOutput\n", - " ## Doing this to avoid reloading the chain into memory again.\n", - " if key_in_cache:\n", - " logger.info(f\"Using cached chain data for {self.symbol} on {self.run_date} to rebuild ChainOutput\")\n", - " self._chains[self.run_date] = self._create_chain_output_from_cache(chain_key)\n", - " \n", - " ## Else, load from source\n", - " else:\n", - " logger.info(f\"Loading chain data from source for {self.symbol} on {self.run_date}\")\n", - " self._chains[self.run_date] = _load_chain(self.symbol, self.run_date, ignore_cache=ignore_cache)\n", - " logger.info(f\"Rebuilt chain for {self.symbol} on {self.run_date}\")\n", - " \n", - " ## If not force build, use ChainOutput in self._chains, \n", - " ## pegged to a single run_date, saved under a singleton instance per symbol\n", - " else:\n", - " logger.info(f\"Using cached chain for {self.symbol} on {self.run_date}\")\n", - "\n", - " ## Load ChainOutput if not already loaded for this run_date\n", - " if self.run_date not in self._chains:\n", - " logger.info(f\"MarketChainLoader: Loading chain for {self.symbol} on {self.run_date}\")\n", - " self._chains[self.run_date] = _load_chain(self.symbol, self.run_date, ignore_cache=ignore_cache)\n", - " \n", - " return self._chains[self.run_date]\n", - "\n", - " def get_chain(self) -> ChainOutput:\n", - " \"\"\"\n", - " Returns the processed option chain data.\n", - " \"\"\"\n", - " if not self._chains:\n", - " raise ValueError(\"Chain not built yet. Call build_chain() first.\")\n", - " return self._chains[self.run_date]\n", - " \n", - " def _create_chain_output_from_cache(self, key: str) -> ChainOutput:\n", - " \"\"\"\n", - " Creates a ChainOutput object from the cached chain data.\n", - " Args:\n", - " key (str): The cache key for the chain data.\n", - " Returns:\n", - " ChainOutput: The ChainOutput object created from the cached data.\n", - " \"\"\"\n", - " if key not in CHAIN_DUMP_CACHE:\n", - " raise ValueError(f\"No cached chain found for key: {key}\")\n", - " chain = CHAIN_DUMP_CACHE[key]\n", - " return ChainOutput(\n", - " root=self.symbol,\n", - " data_chain=None,\n", - " spot=chain['spot'].iloc[0],\n", - " div_type=GLOBAL_CONFIG.div_type,\n", - " vol_type=GLOBAL_CONFIG.vol_type,\n", - " pv_div_col='div_pv',\n", - " fwd_col_name='f',\n", - " rate_col='risk_free_rate',\n", - " vol_col='vol',\n", - " t_col='t',\n", - " strike_col='strike',\n", - " right_col='right',\n", - " midpoint_col='midpoint',\n", - " valuation_date=self.run_date,\n", - " div_schedule_col='div_schedule',\n", - " source_from_cache=True\n", - " )\n", - "\n", - " @property\n", - " def chain(self) -> Optional[ChainOutput]:\n", - " return self.get_chain() if self._chains else None\n" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "id": "8b6eb60d", - "metadata": {}, - "outputs": [], - "source": [ - "GLOBAL_CONFIG.vol_type = VolType.BS" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "id": "86d02b72", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2025-10-19 00:45:15 SSVIModel INFO: Rebuilding chain for T on 2025-06-10 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:15 SSVIModel INFO: Using cached chain data for T on 2025-06-10 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:15 SSVIModel INFO: Rebuilt chain for T on 2025-06-10 00:00:00\n" - ] - } - ], - "source": [ - "run_date = '2025-06-04'\n", - "loader = MarketChainLoader( symbol='T', valuation_date='2025-06-10' )\n", - "chain_output = loader.build_chain(ignore_cache=False, force_rebuild=False)\n" - ] - }, - { - "cell_type": "markdown", - "id": "b5ce18a1", - "metadata": {}, - "source": [ - "### SSVI Model Params" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "id": "585c75d0", - "metadata": {}, - "outputs": [], - "source": [ - "## Import Resolved\n", - "@dataclass(slots=True)\n", - "class SSVIModelParams:\n", - " \"\"\"\n", - " SSVI Model Parameters for the Stochastic Volatility Surface.\n", - " This class holds the parameters for the SSVI model, including the ATM variance, \n", - " long-term variance, speed of mean reversion, skewness, kurtosis, and correlation.\n", - " Attributes:\n", - " var0_hat (float): Initial variance estimate at ATM.\n", - " var_inf_hat (float): Long-term variance estimate.\n", - " kappa_hat (float): Speed of mean reversion.\n", - " eta_hat (float): Skewness parameter.\n", - " lambda_hat (float): Kurtosis parameter.\n", - " rho_hat (float): Correlation parameter.\n", - " atm_loss (float): Loss associated with the ATM volatility estimation.\n", - " surface_loss (float): Loss associated with the surface fitting.\n", - " \"\"\"\n", - " var0_hat: float = Field(default=0.0, description=\"Initial variance estimate at ATM\")\n", - " var_inf_hat: float = Field(default=0.0, description=\"Long-term variance estimate\")\n", - " kappa_hat: float = Field(default=0.0, description=\"Speed of Mean Reversion\")\n", - " eta_hat: float = Field(default=0.0, description=\"Skewness parameter\")\n", - " lambda_hat: float = Field(default=0.0, description=\"Kurtosis parameter\")\n", - " rho_hat: float = Field(default=0.0, description=\"Correlation parameter\")\n", - " atm_loss: float = Field(default=0.0, description=\"Loss associated with ATM volatility estimation\")\n", - " surface_loss: float = Field(default=0.0, description=\"Loss associated with surface fitting\")\n", - " nrmse: float = Field(default=0.0, description=\"Normalized Mean Squared Error\")\n", - " rw_nrmse: float = Field(default=0.0, description=\"Right Wing Normalized Mean Squared Error\")\n", - " lw_nrmse: float = Field(default=0.0, description=\"Left Wing Normalized Mean Squared Error\")\n", - " nmae: float = Field(default=0.0, description=\"Normalized Mean Absolute Error\")\n", - " rw_nmae: float = Field(default=0.0, description=\"Right Wing Normalized Mean Absolute Error\")\n", - " lw_nmae: float = Field(default=0.0, description=\"Left Wing Normalized Mean Absolute Error\")\n", - " \n", - " def __repr__(self):\n", - " acceptable_fields = ['var0_hat', 'var_inf_hat', 'kappa_hat',\n", - " 'eta_hat', 'lambda_hat', 'rho_hat',\n", - " 'atm_loss', 'surface_loss']\n", - " params = {field: getattr(self, field) for field in acceptable_fields}\n", - " return (f\"SSVIModelParams{params}\\n\")\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "id": "a23ca7b7", - "metadata": {}, - "outputs": [], - "source": [ - "## Import Resolved\n", - "## Right Picking Util\n", - "from collections.abc import Iterable\n", - "\n", - "def is_iterable(obj, *, exclude_str=True):\n", - " if exclude_str and isinstance(obj, (str, bytes)):\n", - " return False\n", - " return isinstance(obj, Iterable)\n", - "\n", - "\n", - "def _sigmoid_func(k: np.ndarray, \n", - " f: float) -> np.ndarray:\n", - " x = np.log(k/f)\n", - " return 1/(1 + np.exp(4*x))\n", - "\n", - "def pick_params(call_params: SSVIModelParams,\n", - " put_params: SSVIModelParams,\n", - " right: str) -> SSVIModelParams:\n", - " \"\"\"\n", - " Pick parameters based on the option type (call or put).\n", - " \n", - " Args:\n", - " call_params (SSVIModelParams): Parameters for call options.\n", - " put_params (SSVIModelParams): Parameters for put options.\n", - " right (str): The option type ('c' for call, 'p' for put).\n", - " \n", - " Returns:\n", - " SSVIModelParams: The selected parameters based on the option type.\n", - " \"\"\"\n", - " if right.lower() == 'c':\n", - " return call_params\n", - " elif right.lower() == 'p':\n", - " return put_params\n", - " else:\n", - " raise ValueError(f\"Invalid option type: {right}. Expected 'c' or 'p'.\")\n", - " \n", - "def _predict_vol_decider(\n", - " k: float|np.ndarray,\n", - " t: float|np.ndarray,\n", - " f: float|np.ndarray,\n", - " right: str,\n", - " call_params: SSVIModelParams,\n", - " put_params: SSVIModelParams\n", - ") -> float|np.ndarray:\n", - " \"\"\"\n", - " Predict the volatility using the SSVI model parameters.\n", - " This function selects the appropriate parameters based on the option type\n", - " and computes the implied volatility using the SSVI formula.\n", - "\n", - " If 'right' is 'itm' or 'otm', it blends the call and put volatilities\n", - " based on the moneyness using a sigmoid function.\n", - " \n", - " Args:\n", - " k (float): Strike price.\n", - " t (float): Time to maturity in years.\n", - " f (float): Forward price.\n", - " params (SSVIModelParams): The SSVI model parameters.\n", - " \n", - " Returns:\n", - " float: The predicted volatility.\n", - " \"\"\"\n", - " if right in ['c', 'p']:\n", - " params = pick_params(call_params, put_params, right)\n", - " elif right in ['itm', 'otm']:\n", - " call_vols = predict_vol(k, t, f, 'c', call_params, put_params)\n", - " put_vols = predict_vol(k, t, f, 'p', call_params, put_params)\n", - " w = _sigmoid_func(k, f)\n", - " if right == 'itm': ## Left: Call, Right: Put\n", - " return w * call_vols + (1 - w) * put_vols\n", - " else:\n", - " return (1 - w) * call_vols + w * put_vols\n", - " else:\n", - " raise ValueError(f\"Invalid option type: {right}. Expected 'c', 'p', 'itm', or 'otm'.\")\n", - "\n", - " return ssvi_implied_vol(\n", - " fwd=f, strike=k, maturity=t,\n", - " var0=params.var0_hat, var_inf=params.var_inf_hat, kappa=params.kappa_hat,\n", - " eta=params.eta_hat, lam=params.lambda_hat, rho=params.rho_hat\n", - " )\n", - "\n", - "def predict_vol(\n", - " k: float|np.ndarray,\n", - " t: float|np.ndarray,\n", - " f: float,\n", - " params: SSVIModelParams) -> float|np.ndarray:\n", - " \"\"\"\n", - " Predict the volatility using the SSVI model parameters.\n", - " This function computes the implied volatility using the SSVI formula.\n", - " \"\"\"\n", - " return ssvi_implied_vol(\n", - " fwd=f, strike=k, maturity=t,\n", - " var0=params.var0_hat, var_inf=params.var_inf_hat, kappa=params.kappa_hat,\n", - " eta=params.eta_hat, lam=params.lambda_hat, rho=params.rho_hat\n", - " )\n" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "id": "ececf94a", - "metadata": {}, - "outputs": [], - "source": [ - "## Import Resolved\n", - "def build_svi_params_obj(\n", - " chain: pd.DataFrame,\n", - " var0_hat: float,\n", - " var_inf_hat: float,\n", - " kappa_hat: float,\n", - " eta_hat: float,\n", - " lambda_hat: float,\n", - " rho_hat: float,\n", - " atm_loss: float,\n", - " surface_loss: float,\n", - ") -> SSVIModelParams:\n", - " \n", - " \"\"\"\n", - " Build an SSVIModelParams object from the given parameters.\n", - " \n", - " Args:\n", - " chain (pd.DataFrame): The option chain DataFrame.\n", - " var0_hat (float): Initial variance estimate at ATM.\n", - " var_inf_hat (float): Long-term variance estimate.\n", - " kappa_hat (float): Speed of mean reversion.\n", - " eta_hat (float): Skewness parameter.\n", - " lambda_hat (float): Kurtosis parameter.\n", - " rho_hat (float): Correlation parameter.\n", - " atm_loss (float): Loss associated with ATM volatility estimation.\n", - " surface_loss (float): Loss associated with surface fitting.\n", - " \n", - " Returns:\n", - " SSVIModelParams: The SSVI model parameters object.\n", - " \"\"\"\n", - " ## Calculate normalized losses\n", - " moneyness = chain['moneyness'].values\n", - " market_iv = chain['vol'].values\n", - " model_iv = ssvi_implied_vol(\n", - " fwd=get_fwd_grid(chain),\n", - " strike=get_K_grid(chain),\n", - " maturity= get_T_grid(chain),\n", - " var0=var0_hat, var_inf=var_inf_hat, kappa=kappa_hat,\n", - " eta=eta_hat, lam=lambda_hat, rho=rho_hat\n", - " )\n", - "\n", - " normalized_nrmse, rw_nrmse, lw_nrmse = calculate_normalized_rmse_loss(\n", - " market_iv=market_iv,\n", - " model_iv=model_iv,\n", - " moneyness=moneyness\n", - " )\n", - " normalized_nmae, rw_nmae, lw_nmae = calculate_normalized_mae_loss(\n", - " market_iv=market_iv,\n", - " model_iv=model_iv,\n", - " moneyness=moneyness\n", - " )\n", - " return SSVIModelParams(\n", - " var0_hat=var0_hat,\n", - " var_inf_hat=var_inf_hat,\n", - " kappa_hat=kappa_hat,\n", - " eta_hat=eta_hat,\n", - " lambda_hat=lambda_hat,\n", - " rho_hat=rho_hat,\n", - " atm_loss=atm_loss,\n", - " surface_loss=surface_loss,\n", - " nrmse=normalized_nrmse,\n", - " rw_nrmse=rw_nrmse,\n", - " lw_nrmse=lw_nrmse,\n", - " nmae=normalized_nmae,\n", - " rw_nmae=rw_nmae,\n", - " lw_nmae=lw_nmae\n", - " )" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "id": "3d35f272", - "metadata": {}, - "outputs": [], - "source": [ - "## Import Resolved\n", - "def load_ssvi_params_from_cache(\n", - " root: str,\n", - " valuation_date: str|datetime,\n", - " div_type: DivType,\n", - " vol_type: VolType,\n", - " side: VolSide,\n", - ") -> Optional[SSVIModelParams]:\n", - " \"\"\"\n", - " Load SSVI model parameters from cache if available and up-to-date.\n", - " Args:\n", - " root (str): The root symbol of the underlying asset.\n", - " valuation_date (str or datetime): The date of valuation.\n", - " div_type (DivType): Type of dividends considered.\n", - " vol_type (VolType): Type of volatility used for calibration.\n", - " side (VolSide): Type of side. otm, call, puts\n", - " Returns:\n", - " str: The cached SSVI model parameters or None if not found or outdated.\n", - " \"\"\"\n", - " div_type = assert_member_of_enum(div_type, DivType)\n", - " vol_type = assert_member_of_enum(vol_type, VolType)\n", - " key = params_cache_key(\n", - " root=root,\n", - " valuation_date=valuation_date,\n", - " div_type=div_type,\n", - " vol_type=vol_type,\n", - " side=side\n", - " )\n", - " if key in PARAMS_DUMP_CACHE:\n", - " params = PARAMS_DUMP_CACHE[key]\n", - " config_hash = params.pop('config_hash', None)\n", - " if is_latest_config(config_hash):\n", - " return SSVIModelParams(**params)\n", - " else:\n", - " if GLOBAL_CONFIG.overwrite_existing:\n", - " logger.warning(\"Cached params config hash is outdated. Overwriting existing cache.\")\n", - " del PARAMS_DUMP_CACHE[key]\n", - " else:\n", - " logger.warning(\"Cached params config hash is outdated. Use 'overwrite_existing=True' to overwrite from get_global_config.\")\n", - " return None" - ] - }, - { - "cell_type": "markdown", - "id": "221795d4", - "metadata": {}, - "source": [ - "### SSVI Model building object\n", - "\n", - "- This is the base model. it isn't aware of tick centered data. It expects a chain and builds out the params accordingly. As well as side of the chain to build" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "id": "8ced0f6b", - "metadata": {}, - "outputs": [], - "source": [ - "## Import Resolved\n", - "from typing import ClassVar\n", - "class BaseSSVIModel(ABC):\n", - "\n", - " @abstractmethod\n", - " def predict(self, *args, **kwargs):\n", - " \"\"\"\n", - " Abstract method to predict the implied volatility surface.\n", - " Must be implemented by subclasses.\n", - " \"\"\"\n", - " pass\n", - "\n", - "\n", - " @abstractmethod\n", - " def fit(self, *args, **kwargs):\n", - " \"\"\"\n", - " Abstract method to fit the SSVI model.\n", - " Must be implemented by subclasses.\n", - " \"\"\"\n", - " pass\n", - "\n", - "\n", - "class _SSVIModel(BaseSSVIModel, BaseModel):\n", - " \"\"\"\n", - " SSVI Model for Stochastic Volatility Surface.\n", - " This class implements the SSVI model using the parameters defined in SSVIModelParams.\n", - " It provides methods to predict implied volatility, build the model, and fit the model.\n", - "\n", - " Note: There will be no market data retrieval in this class. Technically, it is completely blind to market data.\n", - " This model will be enforcing discrete dividends and will not support continuous dividends.\n", - " \"\"\"\n", - " # ==============================\n", - " # Class Variables\n", - " # ==============================\n", - " model_config = ConfigDict(validate_assignment=True, \n", - " arbitrary_types_allowed=True,\n", - " frozen=True,\n", - " extra='forbid')\n", - " global_config: ClassVar[SSVIGlobalConfig] = get_global_config()\n", - "\n", - " # ==============================\n", - " # Instance Variables\n", - " # ==============================\n", - "\n", - " ## Compulsory Inputs\n", - " chain: ChainOutput = Field(description=\"Processed option chain output\")\n", - " valuation_date: str|datetime = Field(..., description=\"Valuation date for the option chain\")\n", - " right: VolSide = Field(..., description=\"Which side of the volatility surface to model ('call', 'put', 'otm')\")\n", - " \n", - " ## Optional Inputs/Derived inputs\n", - " # dataframe_chain: pd.DataFrame = Field(default=None, description=\"DataFrame representation of the option chain\")\n", - " _atm_t:list = PrivateAttr(default_factory=list)\n", - " _atm_iv:list = PrivateAttr(default_factory=list)\n", - " _fwd_interp: interp1d = PrivateAttr(default=None)\n", - " _params: SSVIModelParams = PrivateAttr(default=None)\n", - " iterations: int = Field(global_config.model_iterations, description=\"Number of iterations for model fitting\")\n", - " chunk_size: int = Field(global_config.chunk_size, description=\"Chunk size for processing\")\n", - "\n", - " @property\n", - " def div_type(self) -> DivType:\n", - " return self.chain.div_type\n", - "\n", - " @ property\n", - " def params(self) -> Optional[SSVIModelParams]:\n", - " return self._params\n", - " \n", - " @property\n", - " def fwd_interp(self) -> interp1d:\n", - " if self._fwd_interp is None:\n", - " raise ValueError(\"Forward interpolation function is not initialized. Ensure the model is initialized properly.\")\n", - " return self._fwd_interp\n", - " \n", - " @property\n", - " def atm_t(self) -> list:\n", - " return self._atm_t\n", - "\n", - " @property\n", - " def atm_iv(self) -> list:\n", - " return self._atm_iv\n", - "\n", - " @property\n", - " def model(self) -> VolType:\n", - " return self.chain.vol_type\n", - "\n", - " @property\n", - " def dataframe_chain(self) -> pd.DataFrame:\n", - " view = self.chain.chain\n", - " if view is None or view.empty:\n", - " raise ValueError(\"Chain cannot be None or empty\")\n", - " \n", - " ## Seperate chain into calls, puts, and otm\n", - " call_bool = view[self.chain.right_col].str.lower() == 'c'\n", - " put_bool = view[self.chain.right_col].str.lower() == 'p'\n", - "\n", - " ## Spliting by right\n", - " if self.right == VolSide.CALL:\n", - " chain = view[view[self.chain.right_col].str.lower() == 'c'].copy()\n", - " elif self.right == VolSide.PUT:\n", - " chain = view[view[self.chain.right_col].str.lower() == 'p'].copy()\n", - " elif self.right == VolSide.OTM:\n", - " chain = view[((call_bool) & (view[self.chain.f_log_m_col] >= 0)) |\n", - " ((put_bool) & (view[self.chain.f_log_m_col] < 0))].copy()\n", - " else:\n", - " raise ValueError(f\"Invalid right side: {self.right}. Must be 'call', 'put', or 'otm'.\")\n", - "\n", - " return chain\n", - " \n", - " \n", - " @model.setter\n", - " def model(self, value: VolType):\n", - " enum_v = assert_member_of_enum(value, VolType)\n", - " self.chain.vol_type = enum_v\n", - "\n", - " @div_type.setter\n", - " def div_type(self, value: DivType):\n", - " enum_v = assert_member_of_enum(value, DivType)\n", - " self.chain.div_type = enum_v\n", - "\n", - " def __repr__(self):\n", - " return f\"\"\n", - "\n", - " @loud_post_init\n", - " def model_post_init(self, context):\n", - " \"\"\"\n", - " Post-initialization to validate and initialize the model.\n", - " \"\"\"\n", - " self.validate()\n", - " self.initialize()\n", - "\n", - " def validate(self):\n", - " \"\"\"\n", - " Validate the input chain DataFrame to ensure it contains all required columns.\n", - " Raises ValueError if any required column is missing.\n", - " \"\"\"\n", - " if self.chain is None or self.chain.chain.empty:\n", - " raise ValueError(\"Chain cannot be None or empty\")\n", - "\n", - " def initialize(self):\n", - " \"\"\"\n", - " Initialize the SSVI model by separating the option chain into calls, puts, and OTM options.\n", - " Also prepares the ATM parameters for fitting.\n", - " \"\"\"\n", - " \n", - " ## Chain Now\n", - " chain = self.dataframe_chain\n", - "\n", - " ## Get atm_t, atm_iv\n", - " self._atm_t = get_atm_T(self.dataframe_chain, self.chain.t_col, self.chain.f_log_m_col)\n", - " self._atm_iv = get_atm_vol(self.dataframe_chain, self.chain.f_log_m_col, self.chain.vol_col)\n", - "\n", - " ## Prepare fwd_interp\n", - " self._fwd_interp= interp1d(\n", - " x= chain[self.chain.t_col].values,\n", - " y=chain[self.chain.fwd_col_name].values,)\n", - "\n", - "\n", - " def fit(self):\n", - " \"\"\"\n", - " Fit the SSVI model to the option chain data.\n", - " This method estimates the ATM variance, long-term variance, speed of mean reversion,\n", - " skewness, kurtosis, and correlation parameters using the option chain data.\n", - " It calculates the ATM maturities and implied volatilities, and then uses these to\n", - " estimate the model parameters.\n", - "\n", - " Note: This method is designed to be called after the model has been initialized. It fits per right chain (call and put).\n", - " \"\"\"\n", - " if self.dataframe_chain is None or self.dataframe_chain.empty:\n", - " raise ValueError(\"Dataframe chain is empty or not set. Ensure the model is initialized properly.\")\n", - " \n", - " if self._params is not None:\n", - " logger.info(\"Model is already fitted for %s\", self.chain.key)\n", - " return\n", - "\n", - " def inner_fit(right_chain_attr: str):\n", - " \"\"\"\n", - " Inner function to perform the fitting process.\n", - " This is called by the fit method.\n", - " \"\"\"\n", - " chain = getattr(self, right_chain_attr)\n", - " if chain is None or chain.empty:\n", - " raise ValueError(f\"Chain for {right_chain_attr} is empty or not set.\")\n", - "\n", - " atm_t = np.array(self._atm_t)\n", - " atm_iv = np.array(self._atm_iv)\n", - " if atm_t.size == 0 or atm_iv.size == 0:\n", - " raise ValueError(f\"No ATM maturities or volatilities found in {right_chain_attr} chain. Adjust PRICING_CONFIG['ATM_WIDTH'].\")\n", - " (var0_hat, var_inf_hat, kappa_hat), atm_loss = get_best_params(\n", - " atm_t,\n", - " atm_iv\n", - " )\n", - " eta_hat, lambda_hat, rho_hat, surface_loss = get_surface_params(\n", - " chain[self.chain.strike_col].values,\n", - " chain[self.chain.t_col].values,\n", - " chain[self.chain.fwd_col_name].values,\n", - " var0_hat,\n", - " var_inf_hat,\n", - " kappa_hat,\n", - " chain[self.chain.vol_col].values,\n", - " iterations=self.iterations,\n", - " chunk_size=self.chunk_size\n", - " )\n", - " params = build_svi_params_obj(\n", - " chain=chain,\n", - " var0_hat=var0_hat,\n", - " var_inf_hat=var_inf_hat,\n", - " kappa_hat=kappa_hat,\n", - " eta_hat=eta_hat,\n", - " lambda_hat=lambda_hat,\n", - " rho_hat=rho_hat,\n", - " atm_loss=atm_loss,\n", - " surface_loss=surface_loss\n", - " )\n", - "\n", - " return params\n", - " self._params = inner_fit('dataframe_chain')\n", - " \n", - " def predict(self,\n", - " k: float| np.ndarray,\n", - " exp: str| datetime| np.ndarray = None,\n", - " strike_type: Literal['p', 'k', 'pf', 'f'] = 'f'):\n", - " \"\"\"\n", - " Predict the implied volatility for a given strike and expiration.\n", - " Args:\n", - " k (float | np.ndarray): Strike price or array of strike prices.\n", - " exp (str | datetime | np.ndarray): Expiration date or array of expiration dates.\n", - " c & p are for call and put options, respectively.\n", - " itm & otm are for in-the-money and out-of-the-money options, respectively.\n", - " itm: Will use Calls in left wing and Puts in right wing.\n", - " otm: Will use Calls in right wing and Puts in left wing.\n", - " strike_type (Literal['p', 'k', 'pf', 'f']): Type of strike price ('p' for price, 'k' for strike, etc.).\n", - " p: Percent of spot\n", - " k: Strike price\n", - " pf: Percent of forward\n", - " f: Forward price\n", - " Returns:\n", - " np.ndarray: Predicted implied volatility for the given parameters.\n", - " \"\"\"\n", - " exp = np.array(['3m'] if exp is None else (exp if hasattr(exp, '__iter__') else [exp]))\n", - " dtes = np.maximum(\n", - " np.array([convert_date_to_time_to_maturity(e, self.valuation_date) for e in exp]),\n", - " self.chain.t.min()\n", - " )\n", - " fwd = np.asarray(self._fwd_interp(dtes))\n", - " k = np.asarray(k if hasattr(k, '__iter__') else [k])\n", - "\n", - " # Broadcast k across maturities\n", - " spot = self.dataframe_chain['spot'].iloc[0] # dynamic access as you prefer\n", - " K = np.vstack([\n", - " handle_strikes(k=k, f=f, strike_type=strike_type, spot=spot)\n", - " for f in fwd\n", - " ])\n", - " T = np.repeat(dtes[:, None], K.shape[1], axis=1)\n", - " F = np.repeat(fwd[:, None], K.shape[1], axis=1)\n", - "\n", - " vols = predict_vol(k=K.ravel(), t=T.ravel(), f=F.ravel(), params=self.params)\n", - "\n", - " # Single DF build; index only if you rely on it downstream\n", - " df = pd.DataFrame({\n", - " 'strike': K.ravel(),\n", - " 'exp': np.repeat(dtes, K.shape[1]),\n", - " 'vol': vols,\n", - " 'fwd': np.repeat(fwd, K.shape[1]),\n", - " })\n", - "\n", - " # map back to the original exp tokens\n", - " df['exp'] = df['exp'].map({d:e for d,e in zip(dtes, exp)})\n", - " return df.set_index(['strike','exp']).sort_index()\n", - "\n", - "\n", - "\n", - "model = _SSVIModel(\n", - " chain=chain_output,\n", - " valuation_date=run_date,\n", - " right=VolSide.OTM\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "id": "0aeda4f3", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
volfwd
strikeexp
20.02025-09-190.58529127.905938
\n", - "
" - ], - "text/plain": [ - " vol fwd\n", - "strike exp \n", - "20.0 2025-09-19 0.585291 27.905938" - ] - }, - "execution_count": 40, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "model.fit()\n", - "model.params\n", - "model.predict(k=[20.0], exp=[ '2025-09-19'], strike_type='k')" - ] - }, - { - "cell_type": "markdown", - "id": "fbe4a21c", - "metadata": {}, - "source": [ - "### SSVI Parent Model Builder\n", - "\n", - "- This object is intended to hold muliple sides, incase user needs to switch from recieving vols created as OTM to Call or to Put" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "id": "db94de70", - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "class SSVIParentModel(BaseModel, BaseSSVIModel):\n", - " \"\"\"\n", - " Parent model to manage SSVI models for different option sides (call, put, otm).\n", - " This class initializes and manages separate SSVIModel instances for calls, puts, and OTM options.\n", - " It provides methods to fit all models and predict implied volatilities based on the option type.\n", - " It isn't market data aware; it relies on passed info which creates the child models.\n", - " Attributes:\n", - " call_model (SSVIModel): SSVI model for call options.\n", - " put_model (SSVIModel): SSVI model for put options.\n", - " otm_model (SSVIModel): SSVI model for OTM options.\n", - " \"\"\"\n", - "\n", - " model_config = ConfigDict(validate_assignment=True, arbitrary_types_allowed=True)\n", - "\n", - " ## Compulsory Inputs\n", - " chain: ChainOutput = Field(..., description=\"Processed option chain output\")\n", - " valuation_date: str|datetime = Field(..., description=\"Valuation date for the option chain\")\n", - " \n", - " ## Optional Inputs/Derived inputs\n", - " iterations: int = Field(GLOBAL_CONFIG.model_iterations, description=\"Number of iterations for model fitting\")\n", - " chunk_size: int = Field(GLOBAL_CONFIG.chunk_size, description=\"Chunk size for processing\")\n", - " _models: Optional[dict[str, _SSVIModel]] = PrivateAttr(default_factory=dict)\n", - "\n", - " @loud_post_init\n", - " def model_post_init(self, context):\n", - " \"\"\"\n", - " Post-initialization to validate and initialize the parent model.\n", - " \"\"\"\n", - " self.valuation_date = pd.to_datetime(self.valuation_date).strftime('%Y-%m-%d')\n", - " \n", - " ## Sticking with chain's vol and div type over global config because info for this model can only be chain related\n", - " self._model = self.chain.vol_type\n", - " self._div_type = self.chain.div_type\n", - "\n", - "\n", - " @property\n", - " def params(self) -> dict[str, SSVIModelParams]:\n", - " \"\"\"\n", - " Returns the parameters of all SSVI models as a dictionary.\n", - " \"\"\"\n", - " if self.models is None:\n", - " raise ValueError(\"Models have not been initialized.\")\n", - " return {right: model.params for right, model in self.models.items()}\n", - " \n", - " @property\n", - " def model_info(self) -> dict[str, dict]:\n", - " \"\"\"\n", - " Returns a summary of the model information for all SSVI models.\n", - " \"\"\"\n", - " if self.models is None:\n", - " raise ValueError(\"Models have not been initialized.\")\n", - " return {right: {\n", - " 'valuation_date': model.valuation_date,\n", - " 'right': model.right.value,\n", - " 'params': model.params\n", - " } for right, model in self.models.items()}\n", - " \n", - " @property\n", - " def call_model(self) -> _SSVIModel:\n", - " if self.models is None or 'call' not in self.models:\n", - " raise ValueError(\"Call model has not been initialized.\")\n", - " return self.models[VolSide.CALL.value]\n", - "\n", - " @property\n", - " def put_model(self) -> _SSVIModel:\n", - " if self.models is None or 'put' not in self.models:\n", - " raise ValueError(\"Put model has not been initialized.\")\n", - " return self.models[VolSide.PUT.value]\n", - "\n", - " @property\n", - " def otm_model(self) -> _SSVIModel:\n", - " if self.models is None or 'otm' not in self.models:\n", - " raise ValueError(\"OTM model has not been initialized.\")\n", - " return self.models[VolSide.OTM.value]\n", - " \n", - " @property\n", - " def div_type(self) -> DivType:\n", - " return self.chain.div_type\n", - " \n", - " @property\n", - " def model(self) -> VolType:\n", - " return self.chain.vol_type\n", - " \n", - " @model.setter\n", - " def model(self, value: VolType):\n", - " enum_v = assert_member_of_enum(value, VolType)\n", - " self.chain.vol_type = enum_v\n", - "\n", - " @div_type.setter\n", - " def div_type(self, value: DivType):\n", - " enum_v = assert_member_of_enum(value, DivType)\n", - " self.chain.div_type = enum_v\n", - "\n", - " def __repr__(self):\n", - " return f\"\"\n", - "\n", - "\n", - " def _get_or_build(self, side: VolSide) -> _SSVIModel:\n", - " key = side.value\n", - " m = self._models.get(key)\n", - " if m is None:\n", - " m = _SSVIModel(\n", - " chain=self.chain,\n", - " valuation_date=self.valuation_date,\n", - " right=side,\n", - " iterations=self.iterations,\n", - " chunk_size=self.chunk_size\n", - " )\n", - " self._models[key] = m\n", - " return m\n", - "\n", - " @property\n", - " def call_model(self) -> _SSVIModel: return self._get_or_build(VolSide.CALL)\n", - " @property\n", - " def put_model(self) -> _SSVIModel: return self._get_or_build(VolSide.PUT)\n", - " @property\n", - " def otm_model(self) -> _SSVIModel: return self._get_or_build(VolSide.OTM)\n", - "\n", - " @property\n", - " def models(self) -> dict[str, _SSVIModel]:\n", - " return self._models\n", - "\n", - " \n", - " \n", - " def fit(self):\n", - " \"\"\"\n", - " Fit the SSVI model to the option chain data.\n", - " This method estimates the ATM variance, long-term variance, speed of mean reversion,\n", - " skewness, kurtosis, and correlation parameters using the option chain data.\n", - " It calculates the ATM maturities and implied volatilities, and then uses these to\n", - " estimate the model parameters.\n", - "\n", - " Note: This method is designed to be called after the model has been initialized. It fits per right chain (call and put).\n", - " \"\"\"\n", - " \n", - " # Fit only the primary side first\n", - " primary = GLOBAL_CONFIG.vol_side\n", - " self._get_or_build(primary).fit()\n", - "\n", - " if GLOBAL_CONFIG.fit_all_sides:\n", - " # Optionally background-fit the others IF you truly need them later\n", - " for side in (VolSide.CALL, VolSide.PUT, VolSide.OTM):\n", - " if side is primary: \n", - " continue\n", - " GLOBAL_BACKGROUND_FITS.submit(fn=self._get_or_build(side).fit,\n", - " key=f\"{self.chain.key}_{side.value}\")\n", - "\n", - " def predict(self,\n", - " k: float| np.ndarray,\n", - " exp: str| datetime| np.ndarray = None,\n", - " strike_type: Literal['p', 'k', 'pf', 'f'] = 'f',\n", - " right: VolSide = None):\n", - " \"\"\"\n", - " Predict the implied volatility for a given strike and expiration.\n", - " Args:\n", - " k (float | np.ndarray): Strike price or array of strike prices.\n", - " exp (str | datetime | np.ndarray): Expiration date or array of expiration dates.\n", - " right (Literal['c', 'p', 'itm', 'otm'] | np.ndarray): Option type ('c' for call, 'p' for put, etc.).\n", - " c & p are for call and put options, respectively.\n", - " itm & otm are for in-the-money and out-of-the-money options, respectively.\n", - " itm: Will use Calls in left wing and Puts in right wing.\n", - " otm: Will use Calls in right wing and Puts in left wing.\n", - " strike_type (Literal['p', 'k', 'pf', 'f']): Type of strike price ('p' for price, 'k' for strike, etc.).\n", - " p: Percent of spot\n", - " k: Strike price\n", - " pf: Percent of forward\n", - " f: Log forward moneyness\n", - " Returns:\n", - " np.ndarray: Predicted implied volatility for the given parameters.\n", - " \"\"\"\n", - "\n", - " if right is None:\n", - " right = GLOBAL_CONFIG.vol_side\n", - " elif isinstance(right, str):\n", - " right = VolSide(right.lower())\n", - "\n", - " right = assert_member_of_enum(right, VolSide)\n", - " model = self._get_or_build(right)\n", - " if model.params is None:\n", - " logger.warning(f\"Model for {right.value} on {self.chain.key} not fitted yet. Fitting now...\")\n", - " model.fit()\n", - " return model.predict(k=k, exp=exp, strike_type=strike_type)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 61, - "id": "ac462af5", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'otm': SSVIModelParams{'var0_hat': 0.07176527488707873, 'var_inf_hat': 0.033144498992750834, 'kappa_hat': 0.38300058188214053, 'eta_hat': 1.0699619336266035, 'lambda_hat': -0.7746100201714848, 'rho_hat': -0.18213076445604126, 'atm_loss': 0.0010895678248389162, 'surface_loss': 0.02517559382364921}}" - ] - }, - "execution_count": 61, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "p_model = SSVIParentModel(\n", - " valuation_date=run_date,\n", - " chain=chain_output\n", - ")\n", - "\n", - "# p_model.fit()\n", - "# p_model.fit()\n", - "p_model.fit()\n", - "p_model.params" - ] - }, - { - "cell_type": "code", - "execution_count": 65, - "id": "ddc9372a", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
volfwd
strikeexp
25.0552052025-09-200.37919927.909175
27.8391172025-09-200.26532727.909175
30.6230292025-09-200.30716727.909175
\n", - "
" - ], - "text/plain": [ - " vol fwd\n", - "strike exp \n", - "25.055205 2025-09-20 0.379199 27.909175\n", - "27.839117 2025-09-20 0.265327 27.909175\n", - "30.623029 2025-09-20 0.307167 27.909175" - ] - }, - "execution_count": 65, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "p_model.predict(k=[0.9, 1.0, 1.1], exp=[ '2025-09-20'], strike_type='p')" - ] - }, - { - "cell_type": "code", - "execution_count": 64, - "id": "b03fc64c", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
volfwd
strikeexp
27.8391171m0.27279427.939291
2m0.27292528.033344
3m0.26694927.938787
41.7586761m0.82750827.939291
2m0.64716828.033344
3m0.56226727.938787
55.6782341m1.07390127.939291
2m0.83598628.033344
3m0.72111027.938787
\n", - "
" - ], - "text/plain": [ - " vol fwd\n", - "strike exp \n", - "27.839117 1m 0.272794 27.939291\n", - " 2m 0.272925 28.033344\n", - " 3m 0.266949 27.938787\n", - "41.758676 1m 0.827508 27.939291\n", - " 2m 0.647168 28.033344\n", - " 3m 0.562267 27.938787\n", - "55.678234 1m 1.073901 27.939291\n", - " 2m 0.835986 28.033344\n", - " 3m 0.721110 27.938787" - ] - }, - "execution_count": 64, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "p_model.predict(k=[1, 1.5, 2], exp=['1m', '2m', '3m'], strike_type='p')" - ] - }, - { - "cell_type": "markdown", - "id": "c91aa3a5", - "metadata": {}, - "source": [ - "### Tick/Market Aware SSVI Model Builder" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "id": "398e2cc2", - "metadata": {}, - "outputs": [], - "source": [ - "import time\n", - "from typing import ClassVar, Tuple \n", - "def is_weekend(dt:str|datetime) -> bool:\n", - " \"\"\"\n", - " Check if the given date is a weekend (Saturday or Sunday).\n", - " \n", - " Args:\n", - " dt (str | datetime): The date to check.\n", - " \n", - " Returns:\n", - " bool: True if the date is a weekend, False otherwise.\n", - " \"\"\"\n", - " if isinstance(dt, str):\n", - " dt = pd.to_datetime(dt)\n", - " return dt.weekday() >= 5 # Saturday is 5, Sunday is 6\n", - "\n", - "\n", - "class EODMarketSSVIModel(SSVIParentModel, SingletonMixin):\n", - " \"\"\"\n", - " EODMarketSSVIModel extends SSVIModel to handle end-of-day market data.\n", - " This model is designed to work with end-of-day option chains and provides methods\n", - " to predict implied volatility based on the SSVI model parameters.\n", - "\n", - " There's a singleton pattern to cache instances based on (symbol, valuation_date).\n", - " \"\"\"\n", - " ## Class variable to cache instances\n", - " _instances: ClassVar[dict[Tuple[str, str], \"EODMarketSSVIModel\"]] = {}\n", - " _initialized: bool = PrivateAttr(default=False)\n", - "\n", - " model_config = ConfigDict(validate_assignment=True, arbitrary_types_allowed=True)\n", - " symbol: str = Field(..., description=\"Symbol of the underlying asset\")\n", - " valuation_date: str|datetime = Field(..., description=\"Valuation date for the option chain\")\n", - " chain: Optional[ChainOutput] = Field(default=None, description=\"Processed option chain output\")\n", - " chain_loader: MarketChainLoader = Field(default=None, description=\"Market chain loader instance\")\n", - "\n", - " @classmethod\n", - " def instances(cls) -> dict[str, \"EODMarketSSVIModel\"]:\n", - " return cls._instances\n", - "\n", - " @classmethod\n", - " def clear_instances(cls, clear_tree: bool = False):\n", - " cls._instances.clear()\n", - " if clear_tree:\n", - " MarketChainLoader.clear_instances()\n", - " EODMarketSSVIModel.clear_all_instances()\n", - "\n", - " @loud_post_init\n", - " def model_post_init(self, _):\n", - " if self.chain is None:\n", - " loader = self.chain_loader or MarketChainLoader(symbol=self.symbol, valuation_date=self.valuation_date)\n", - " self.chain_loader = loader\n", - "\n", - " ## Load chain using loader\n", - " ## Use GLOBAL_CONFIG settings for cache and force_calc\n", - " self.chain = loader.build_chain(\n", - " force_rebuild=GLOBAL_CONFIG.force_calc,\n", - " ignore_cache=GLOBAL_CONFIG.force_calc\n", - " )\n", - "\n", - " ## Cache chain immediately to get it off memory\n", - " self.chain._cache_chain()\n", - "\n", - " super().model_post_init(_)\n", - "\n", - " def __new__(cls, symbol: str, valuation_date: str|datetime, *args, **kwargs):\n", - " key = (symbol, pd.to_datetime(valuation_date).strftime('%Y-%m-%d'))\n", - " if key not in cls._instances:\n", - " instance = super().__new__(cls)\n", - " cls._instances[key] = instance\n", - " else:\n", - " logger.info(f\"Using cached instance for {symbol} on {valuation_date}\")\n", - " return cls._instances[key]\n", - " \n", - " def __init__(self, *args, **data):\n", - " # First-time init for this cached instance:\n", - " # If __pydantic_private__ isn't set yet, it's the first real init.\n", - " if getattr(self, \"__pydantic_private__\", None) is None:\n", - " super().__init__(*args, **data) # sets fields and creates private store\n", - " self._initialized = True # safe now\n", - " return\n", - "\n", - " def __repr__(self):\n", - " return f\"\"\n", - " \n", - " def load_models_from_cache(self):\n", - " \"\"\"\n", - " Load SSVI model parameters for other option sides (call, put, otm) from cache if available.\n", - " This method checks the PARAMS_DUMP_CACHE for each option side and loads the parameters\n", - " into the corresponding SSVIModel instance if found and up-to-date.\n", - " \"\"\"\n", - " for side in self.models.keys():\n", - " cached_params = load_ssvi_params_from_cache(\n", - " root=self.chain.root,\n", - " valuation_date=self.valuation_date,\n", - " div_type=self.div_type,\n", - " vol_type=self.model,\n", - " side=VolSide(side)\n", - " )\n", - " if cached_params is not None:\n", - " logger.info(f\"Loaded cached params for {side} model on {self.chain.key}\")\n", - " self.models[side].params = cached_params\n", - " else:\n", - " logger.info(f\"No cached params found for {side} model on {self.chain.key}\")\n", - " \n", - "\n", - " def fit(self):\n", - " \"\"\"\n", - " Fit the SSVI model to the option chain data.\n", - " This method estimates the ATM variance, long-term variance, speed of mean reversion,\n", - " skewness, kurtosis, and correlation parameters using the option chain data.\n", - " It calculates the ATM maturities and implied volatilities, and then uses these to\n", - " estimate the model parameters.\n", - " Note: This method is designed to be called after the model has been initialized. It fits per right chain (call and put).\n", - " After fitting, it saves the model parameters to the global PARAMS_DUMP_CACHE in the background.\n", - " \"\"\"\n", - " ## Try loading other models from cache first, only if GLOBAL_CONFIG.force_calc is False\n", - " if not GLOBAL_CONFIG.force_calc:\n", - " self.load_models_from_cache()\n", - " if all(model.params is not None for model in self.models.values()):\n", - " logger.info(\"All models are already fitted for %s\", self.chain.key)\n", - " return\n", - " \n", - " ## If not all fitted, fit the primary model and others in background\n", - " super().fit()\n", - "\n", - " ## Save to cache in background, only when GLOBAL_CONFIG.save_cache is True\n", - " if GLOBAL_CONFIG.save_cache:\n", - " GLOBAL_BACKGROUND_FITS.submit(fn=self.save_cache,\n", - " key=f\"{self.chain.key}_save_cache\")\n", - "\n", - " def save_cache(self):\n", - " \"\"\"\n", - " Save the model parameters to the global PARAMS_DUMP_CACHE.\n", - " \"\"\"\n", - "\n", - " ## Save chain here from now on\n", - " self.chain._cache_chain()\n", - "\n", - " ## Cache params\n", - " if self.params is None:\n", - " logger.warning(f\"Parameters for {self.chain.key} not available. Cannot save to cache.\")\n", - " logger.debug(f\"Current params state: {self.params}, {self.__dict__}\")\n", - " \n", - " else:\n", - " for side, params in self.params.items():\n", - " timer = 0\n", - " while params is None:\n", - " time.sleep(2) # Wait for background fitting to complete\n", - " timer += 2\n", - " params = self.params.get(side, None)\n", - " if params is None:\n", - " logger.warning(f\"Parameters for {side} on {self.chain.key} still not available. Waiting...\")\n", - " elif timer >= 120: # Timeout after 2 minutes\n", - " logger.error(f\"Timeout waiting for parameters for {side} on {self.chain.key}. Skipping cache save.\")\n", - " break\n", - " else:\n", - " logger.info(f\"Parameters for {side} on {self.chain.key} now available.\")\n", - " break\n", - "\n", - " params = params.__dict__\n", - " params['config_hash'] = hash_config(get_pricing_config())\n", - " key = params_cache_key(root=self.symbol,\n", - " valuation_date=self.valuation_date,\n", - " div_type=self.div_type,\n", - " vol_type=self.model,\n", - " side=VolSide(side))\n", - " if key not in PARAMS_DUMP_CACHE:\n", - " PARAMS_DUMP_CACHE[key] = params\n", - " \n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "id": "84f01d9a", - "metadata": {}, - "outputs": [], - "source": [ - "GLOBAL_CONFIG.vol_type='bs'" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "id": "4843adb7", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2025-10-19 00:45:21 SSVIModel INFO: Rebuilding chain for T on 2025-10-13 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:21 SSVIModel INFO: Using cached chain data for T on 2025-10-13 00:00:00 to rebuild ChainOutput\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2025-10-19 00:45:21 SSVIModel INFO: Rebuilt chain for T on 2025-10-13 00:00:00\n", - "2025-10-19 00:45:21 SSVIModel INFO: Chain with key: T_2025-10-13_discrete_bs already cached.\n", - "2025-10-19 00:45:21 SSVIModel INFO: All models are already fitted for T_2025-10-13_discrete_bs\n" - ] - } - ], - "source": [ - "EODMarketSSVIModel.clear_instances(clear_tree=True)\n", - "bac_model = EODMarketSSVIModel(\n", - " symbol='T',\n", - " valuation_date='2025-10-13'\n", - ")\n", - "bac_model.fit()" - ] - }, - { - "cell_type": "markdown", - "id": "ebe570ba", - "metadata": {}, - "source": [ - "## Timeseries object\n", - "- Allowed to live in SSVI\n", - "- Loads multiple EODSSVParent" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "id": "ab337c8b", - "metadata": {}, - "outputs": [], - "source": [ - "from typing import Type\n", - "def pydantic_singleton(cls: Type[BaseModel]):\n", - " \"\"\"\n", - " Singleton decorator for Pydantic models.\n", - " \"\"\"\n", - " if not issubclass(cls, BaseModel):\n", - " raise TypeError(f\"{cls.__name__} must subclass pydantic.BaseModel\")\n", - " \n", - " cls._instances = {}\n", - " cls._initialized = False\n", - "\n", - " original_init = cls.__init__\n", - "\n", - " @wraps(original_init)\n", - " def new_init(self, *args, **data):\n", - " if not cls._initialized:\n", - " super(cls, self).__init__(*args, **data)\n", - " cls._initialized = True\n", - " # return cls._instances.setdefault(cls, self)\n", - "\n", - " cls.__init__ = new_init\n", - " return cls" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "id": "010aa684", - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "class SsviTimeseriesEOD(BaseModel, SingletonMixin):\n", - " \"\"\"\n", - " End-of-day SSVI timeseries model for managing SSVI models over time.\n", - " This class extends the SSVIParentModel to handle time series data for SSVI models.\n", - " \"\"\"\n", - "\n", - " ## Class variable to cache instances\n", - " _instances: ClassVar[dict[str, \"EODMarketSSVIModel\"]] = {}\n", - " _initialized: bool = PrivateAttr(default=False)\n", - " model_config = ConfigDict(validate_assignment=True, arbitrary_types_allowed=True)\n", - " symbol: str = Field(..., description=\"Symbol of the underlying asset\")\n", - " _model_set: dict = PrivateAttr(default_factory=dict)\n", - "\n", - " ## Optional Inputs/Derived inputs\n", - " ## In other model classes, div_type & model is populated from chain\n", - " ## But since this will be loading other models, it is populated from global\n", - " _model: VolType = PrivateAttr(default=None)\n", - " _div_type: DivType = PrivateAttr(default=None)\n", - " iterations: int = Field(GLOBAL_CONFIG.model_iterations, description=\"Number of iterations for model fitting\")\n", - " chunk_size: int = Field(GLOBAL_CONFIG.chunk_size, description=\"Chunk size for processing\")\n", - " models: Optional[dict[str, _SSVIModel]] = Field(default=None, description=\"Dictionary of SSVI models for different option sides\")\n", - "\n", - " def model_post_init(self, context):\n", - " self._model = GLOBAL_CONFIG.vol_type\n", - " self._div_type = GLOBAL_CONFIG.div_type\n", - "\n", - " def __new__(cls, symbol: str, *args, **kwargs):\n", - " key = symbol\n", - " if key not in cls._instances:\n", - " instance = super().__new__(cls)\n", - " cls._instances[key] = instance\n", - " else:\n", - " logger.info(f\"Using cached instance for {symbol}\")\n", - " return cls._instances[key]\n", - " \n", - " def __init__(self, *args, **data):\n", - " # First-time init for this cached instance:\n", - " # If __pydantic_private__ isn't set yet, it's the first real init.\n", - " if getattr(self, \"__pydantic_private__\", None) is None:\n", - " super().__init__(*args, **data) # sets fields and creates private store\n", - " self._initialized = True # safe now\n", - " return\n", - "\n", - " @classmethod\n", - " def clear_instances(cls, clear_tree: bool = False):\n", - " \"\"\"\n", - " Clear all cached instances of SsviTimeseriesEOD and optionally clear instances of EODMarketSSVIModel and MarketChainLoader.\n", - " Args:\n", - " clear_tree (bool): If True, also clear instances of EODMarketSSVIModel and MarketChainLoader.\n", - " \"\"\"\n", - " cls._instances.clear()\n", - " if clear_tree:\n", - " EODMarketSSVIModel.clear_instances()\n", - " MarketChainLoader.clear_instances()\n", - " SsviTimeseriesEOD.clear_all_instances()\n", - "\n", - " \n", - "\n", - " @classmethod\n", - " def instances(cls) -> dict[str, \"EODMarketSSVIModel\"]:\n", - " return cls._instances\n", - " \n", - " @property\n", - " def model_set(self) -> dict[str, EODMarketSSVIModel]:\n", - " return self._model_set\n", - " \n", - " @property\n", - " def model(self) -> VolType:\n", - " return self._model\n", - " \n", - " @property\n", - " def div_type(self) -> DivType:\n", - " return self._div_type\n", - " \n", - " @model.setter\n", - " def model(self, value: VolType):\n", - " enum_v = assert_member_of_enum(value, VolType)\n", - " self._model = enum_v\n", - "\n", - " @div_type.setter\n", - " def div_type(self, value: DivType):\n", - " enum_v = assert_member_of_enum(value, DivType)\n", - " self._div_type = enum_v\n", - "\n", - " def __repr__(self):\n", - " return f\"\"\n", - " \n", - " def _get_model_for_date(self, valuation_date: str|datetime) -> EODMarketSSVIModel:\n", - " \"\"\"\n", - " Retrieve or create an EODMarketSSVIModel for the given valuation date.\n", - " \n", - " Args:\n", - " valuation_date (str | datetime): The valuation date for the model.\n", - "\n", - " Returns:\n", - " EODMarketSSVIModel: The EODMarketSSVIModel for the given date.\n", - " \"\"\"\n", - " if isinstance(valuation_date, str):\n", - " valuation_date = pd.to_datetime(valuation_date)\n", - " valuation_date = valuation_date.strftime('%Y-%m-%d')\n", - "\n", - " # Check if the model already exists for the given date\n", - " if valuation_date in self._model_set:\n", - " return self._model_set[valuation_date]\n", - "\n", - " # Create a new model if it doesn't exist\n", - " new_model = EODMarketSSVIModel(valuation_date=valuation_date, symbol=self.symbol)\n", - " new_model.fit() ## Load and save\n", - " self._model_set[valuation_date] = new_model\n", - " return new_model\n", - " \n", - " def predict(self,\n", - " k: float| np.ndarray = None,\n", - " exp: str| datetime| np.ndarray = None,\n", - " strike_type: Literal['p', 'k', 'pf', 'f'] = 'f',\n", - " right: VolSide = None,\n", - " start_date: str|datetime = None,\n", - " end_date: str|datetime = None) -> pd.DataFrame:\n", - " \"\"\"\n", - " Predict the implied volatility for a given strike and expiration over a date range.\n", - " Args:\n", - " k (float | np.ndarray): Strike price or array of strike prices.\n", - " exp (str | datetime | np.ndarray): Expiration date or array of expiration dates.\n", - " right (Literal['c', 'p', 'itm', 'otm'] | np.ndarray): Option type ('c' for call, 'p' for put, etc.).\n", - " c & p are for call and put options, respectively.\n", - " itm & otm are for in-the-money and out-of-the-money options, respectively.\n", - " itm: Will use Calls in left wing and Puts in right wing.\n", - " otm: Will use Calls in right wing and Puts in left wing.\n", - " strike_type (Literal['p', 'k', 'pf', 'f']): Type of strike price ('p' for price, 'k' for strike, etc.).\n", - " p: Percent of spot\n", - " k: Strike price\n", - " pf: Percent of forward\n", - " f: Log forward moneyness\n", - " start_date (str | datetime): Start date for the prediction range.\n", - " end_date (str | datetime): End date for the prediction range.\n", - " Returns:\n", - " pd.DataFrame: Predicted implied volatility for the given parameters over the date range.\n", - " \"\"\"\n", - " if start_date is None:\n", - " start_date = datetime.today() - relativedelta(weeks = 1)\n", - "\n", - " if end_date is None:\n", - " end_date = datetime.today()\n", - "\n", - " start_date = pd.to_datetime(start_date)\n", - " end_date = pd.to_datetime(end_date)\n", - "\n", - " if start_date > end_date:\n", - " raise ValueError(\"start_date must be earlier than or equal to end_date\")\n", - " \n", - " if strike_type is None:\n", - " strike_type = 'p'\n", - "\n", - " if k is None:\n", - " base_k = np.array([0.9, 1.0, 1.1]) # Default strikes as percent of spot\n", - " log_k = np.array([-0.1, 0.0, 0.1]) # Default log-moneyness\n", - " if strike_type == 'k':\n", - " raise ValueError(\"When strike_type is 'k', k must be provided.\")\n", - " elif strike_type == 'pf':\n", - " raise ValueError(\"When strike_type is 'pf', k must be provided.\")\n", - " elif strike_type == 'f':\n", - " k = log_k\n", - " else: # 'p'\n", - " k = base_k\n", - " else:\n", - " k = np.asarray(k) if isinstance(k, (list, np.ndarray)) else np.array([k])\n", - "\n", - " if exp is None:\n", - " exp = np.array(['3m']) # Default expirations\n", - " else:\n", - " exp = np.asarray(exp) if isinstance(exp, (list, np.ndarray)) else np.array([exp])\n", - " \n", - " if right is None:\n", - " right = GLOBAL_CONFIG.vol_side\n", - " elif isinstance(right, str):\n", - " enum_v = assert_member_of_enum(right, VolSide)\n", - " right = enum_v\n", - "\n", - " all_dates = pd.date_range(start=start_date, end=end_date, freq='B') # Business days only\n", - " missing = check_missing_dates(\n", - " x = pd.DataFrame({'Datetime': all_dates}),\n", - " _start = start_date,\n", - " _end = end_date\n", - " )\n", - "\n", - " if missing:\n", - " logger.warning(f\"Missing dates in the range: {missing}. Will load this missing data\")\n", - " for dt in missing:\n", - " if is_weekend(dt):\n", - " logger.info(f\"Skipping weekend date: {dt}\")\n", - " continue\n", - " elif not_trading_day(dt):\n", - " logger.info(f\"Skipping non-trading day: {dt}\")\n", - " continue\n", - " try:\n", - " self._get_model_for_date(dt)\n", - " except Exception as e:\n", - " logger.error(f\"Error loading model for {dt}: {e}\")\n", - " results = []\n", - " for current_date in all_dates:\n", - " if not_trading_day(current_date):\n", - " logger.info(f\"Skipping non-trading day: {current_date}\")\n", - " continue\n", - " try:\n", - " model = self._get_model_for_date(current_date)\n", - " df_vols = model.predict(k=k, exp=exp, strike_type=strike_type, right=right)\n", - " df_vols = df_vols.reset_index()\n", - " df_vols['Datetime'] = current_date.strftime('%Y-%m-%d')\n", - " df_vols.set_index(['Datetime', 'strike', 'exp'], inplace=True)\n", - " results.append(df_vols)\n", - " except Exception as e:\n", - " logger.error(f\"Error predicting for {current_date}: {e}\")\n", - " logger.error(traceback.format_exc())\n", - " if not results:\n", - " raise ValueError(\"No results were generated. Check if the date range includes valid trading days.\")\n", - " return pd.concat(results).sort_index()\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "id": "7e665100", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 50, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "GLOBAL_CONFIG.save_cache" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "id": "a23a2ef6", - "metadata": {}, - "outputs": [], - "source": [ - "SsviTimeseriesEOD.clear_instances(clear_tree=True)\n", - "ts = SsviTimeseriesEOD(symbol=\"T\")" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "id": "3393b3fb", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2025-10-19 00:45:22 SSVIModel INFO: Rebuilding chain for T on 2025-05-01 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:22 SSVIModel INFO: Using cached chain data for T on 2025-05-01 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:22 SSVIModel INFO: Rebuilt chain for T on 2025-05-01 00:00:00\n", - "2025-10-19 00:45:22 SSVIModel INFO: Chain with key: T_2025-05-01_discrete_bs already cached.\n", - "2025-10-19 00:45:22 SSVIModel INFO: All models are already fitted for T_2025-05-01_discrete_bs\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2025-10-19 00:45:22 SSVIModel WARNING: Model for otm on T_2025-05-01_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:45:23 SSVIModel INFO: Rebuilding chain for T on 2025-05-02 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:23 SSVIModel INFO: Using cached chain data for T on 2025-05-02 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:23 SSVIModel INFO: Rebuilt chain for T on 2025-05-02 00:00:00\n", - "2025-10-19 00:45:23 SSVIModel INFO: Chain with key: T_2025-05-02_discrete_bs already cached.\n", - "2025-10-19 00:45:23 SSVIModel INFO: All models are already fitted for T_2025-05-02_discrete_bs\n", - "2025-10-19 00:45:23 SSVIModel WARNING: Model for otm on T_2025-05-02_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:45:23 SSVIModel INFO: Rebuilding chain for T on 2025-05-05 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:23 SSVIModel INFO: Using cached chain data for T on 2025-05-05 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:23 SSVIModel INFO: Rebuilt chain for T on 2025-05-05 00:00:00\n", - "2025-10-19 00:45:23 SSVIModel INFO: Chain with key: T_2025-05-05_discrete_bs already cached.\n", - "2025-10-19 00:45:23 SSVIModel INFO: All models are already fitted for T_2025-05-05_discrete_bs\n", - "2025-10-19 00:45:24 SSVIModel WARNING: Model for otm on T_2025-05-05_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:45:24 SSVIModel INFO: Rebuilding chain for T on 2025-05-06 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:24 SSVIModel INFO: Using cached chain data for T on 2025-05-06 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:24 SSVIModel INFO: Rebuilt chain for T on 2025-05-06 00:00:00\n", - "2025-10-19 00:45:24 SSVIModel INFO: Chain with key: T_2025-05-06_discrete_bs already cached.\n", - "2025-10-19 00:45:24 SSVIModel INFO: All models are already fitted for T_2025-05-06_discrete_bs\n", - "2025-10-19 00:45:25 SSVIModel WARNING: Model for otm on T_2025-05-06_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:45:25 SSVIModel INFO: Rebuilding chain for T on 2025-05-07 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:25 SSVIModel INFO: Using cached chain data for T on 2025-05-07 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:25 SSVIModel INFO: Rebuilt chain for T on 2025-05-07 00:00:00\n", - "2025-10-19 00:45:25 SSVIModel INFO: Chain with key: T_2025-05-07_discrete_bs already cached.\n", - "2025-10-19 00:45:25 SSVIModel INFO: All models are already fitted for T_2025-05-07_discrete_bs\n", - "2025-10-19 00:45:25 SSVIModel WARNING: Model for otm on T_2025-05-07_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:45:26 SSVIModel INFO: Rebuilding chain for T on 2025-05-08 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:26 SSVIModel INFO: Using cached chain data for T on 2025-05-08 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:26 SSVIModel INFO: Rebuilt chain for T on 2025-05-08 00:00:00\n", - "2025-10-19 00:45:26 SSVIModel INFO: Chain with key: T_2025-05-08_discrete_bs already cached.\n", - "2025-10-19 00:45:26 SSVIModel INFO: All models are already fitted for T_2025-05-08_discrete_bs\n", - "2025-10-19 00:45:26 SSVIModel WARNING: Model for otm on T_2025-05-08_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:45:27 SSVIModel INFO: Rebuilding chain for T on 2025-05-09 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:27 SSVIModel INFO: Using cached chain data for T on 2025-05-09 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:27 SSVIModel INFO: Rebuilt chain for T on 2025-05-09 00:00:00\n", - "2025-10-19 00:45:27 SSVIModel INFO: Chain with key: T_2025-05-09_discrete_bs already cached.\n", - "2025-10-19 00:45:27 SSVIModel INFO: All models are already fitted for T_2025-05-09_discrete_bs\n", - "2025-10-19 00:45:27 SSVIModel WARNING: Model for otm on T_2025-05-09_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:45:28 SSVIModel INFO: Rebuilding chain for T on 2025-05-12 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:28 SSVIModel INFO: Using cached chain data for T on 2025-05-12 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:28 SSVIModel INFO: Rebuilt chain for T on 2025-05-12 00:00:00\n", - "2025-10-19 00:45:28 SSVIModel INFO: Chain with key: T_2025-05-12_discrete_bs already cached.\n", - "2025-10-19 00:45:28 SSVIModel INFO: All models are already fitted for T_2025-05-12_discrete_bs\n", - "2025-10-19 00:45:28 SSVIModel WARNING: Model for otm on T_2025-05-12_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:45:29 SSVIModel INFO: Rebuilding chain for T on 2025-05-13 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:29 SSVIModel INFO: Using cached chain data for T on 2025-05-13 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:29 SSVIModel INFO: Rebuilt chain for T on 2025-05-13 00:00:00\n", - "2025-10-19 00:45:29 SSVIModel INFO: Chain with key: T_2025-05-13_discrete_bs already cached.\n", - "2025-10-19 00:45:29 SSVIModel INFO: All models are already fitted for T_2025-05-13_discrete_bs\n", - "2025-10-19 00:45:29 SSVIModel WARNING: Model for otm on T_2025-05-13_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:45:29 SSVIModel INFO: Rebuilding chain for T on 2025-05-14 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:29 SSVIModel INFO: Using cached chain data for T on 2025-05-14 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:29 SSVIModel INFO: Rebuilt chain for T on 2025-05-14 00:00:00\n", - "2025-10-19 00:45:29 SSVIModel INFO: Chain with key: T_2025-05-14_discrete_bs already cached.\n", - "2025-10-19 00:45:29 SSVIModel INFO: All models are already fitted for T_2025-05-14_discrete_bs\n", - "2025-10-19 00:45:30 SSVIModel WARNING: Model for otm on T_2025-05-14_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:45:30 SSVIModel INFO: Rebuilding chain for T on 2025-05-15 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:30 SSVIModel INFO: Using cached chain data for T on 2025-05-15 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:30 SSVIModel INFO: Rebuilt chain for T on 2025-05-15 00:00:00\n", - "2025-10-19 00:45:30 SSVIModel INFO: Chain with key: T_2025-05-15_discrete_bs already cached.\n", - "2025-10-19 00:45:30 SSVIModel INFO: All models are already fitted for T_2025-05-15_discrete_bs\n", - "2025-10-19 00:45:30 SSVIModel WARNING: Model for otm on T_2025-05-15_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:45:31 SSVIModel INFO: Rebuilding chain for T on 2025-05-16 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:31 SSVIModel INFO: Using cached chain data for T on 2025-05-16 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:31 SSVIModel INFO: Rebuilt chain for T on 2025-05-16 00:00:00\n", - "2025-10-19 00:45:31 SSVIModel INFO: Chain with key: T_2025-05-16_discrete_bs already cached.\n", - "2025-10-19 00:45:31 SSVIModel INFO: All models are already fitted for T_2025-05-16_discrete_bs\n", - "2025-10-19 00:45:31 SSVIModel WARNING: Model for otm on T_2025-05-16_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:45:32 SSVIModel INFO: Rebuilding chain for T on 2025-05-19 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:32 SSVIModel INFO: Using cached chain data for T on 2025-05-19 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:32 SSVIModel INFO: Rebuilt chain for T on 2025-05-19 00:00:00\n", - "2025-10-19 00:45:32 SSVIModel INFO: Chain with key: T_2025-05-19_discrete_bs already cached.\n", - "2025-10-19 00:45:32 SSVIModel INFO: All models are already fitted for T_2025-05-19_discrete_bs\n", - "2025-10-19 00:45:32 SSVIModel WARNING: Model for otm on T_2025-05-19_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:45:33 SSVIModel INFO: Rebuilding chain for T on 2025-05-20 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:33 SSVIModel INFO: Using cached chain data for T on 2025-05-20 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:33 SSVIModel INFO: Rebuilt chain for T on 2025-05-20 00:00:00\n", - "2025-10-19 00:45:33 SSVIModel INFO: Chain with key: T_2025-05-20_discrete_bs already cached.\n", - "2025-10-19 00:45:33 SSVIModel INFO: All models are already fitted for T_2025-05-20_discrete_bs\n", - "2025-10-19 00:45:33 SSVIModel WARNING: Model for otm on T_2025-05-20_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:45:34 SSVIModel INFO: Rebuilding chain for T on 2025-05-21 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:34 SSVIModel INFO: Using cached chain data for T on 2025-05-21 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:34 SSVIModel INFO: Rebuilt chain for T on 2025-05-21 00:00:00\n", - "2025-10-19 00:45:34 SSVIModel INFO: Chain with key: T_2025-05-21_discrete_bs already cached.\n", - "2025-10-19 00:45:34 SSVIModel INFO: All models are already fitted for T_2025-05-21_discrete_bs\n", - "2025-10-19 00:45:34 SSVIModel WARNING: Model for otm on T_2025-05-21_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:45:35 SSVIModel INFO: Rebuilding chain for T on 2025-05-22 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:35 SSVIModel INFO: Using cached chain data for T on 2025-05-22 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:35 SSVIModel INFO: Rebuilt chain for T on 2025-05-22 00:00:00\n", - "2025-10-19 00:45:35 SSVIModel INFO: Chain with key: T_2025-05-22_discrete_bs already cached.\n", - "2025-10-19 00:45:35 SSVIModel INFO: All models are already fitted for T_2025-05-22_discrete_bs\n", - "2025-10-19 00:45:35 SSVIModel WARNING: Model for otm on T_2025-05-22_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:45:36 SSVIModel INFO: Rebuilding chain for T on 2025-05-23 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:36 SSVIModel INFO: Using cached chain data for T on 2025-05-23 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:36 SSVIModel INFO: Rebuilt chain for T on 2025-05-23 00:00:00\n", - "2025-10-19 00:45:36 SSVIModel INFO: Chain with key: T_2025-05-23_discrete_bs already cached.\n", - "2025-10-19 00:45:36 SSVIModel INFO: All models are already fitted for T_2025-05-23_discrete_bs\n", - "2025-10-19 00:45:36 SSVIModel WARNING: Model for otm on T_2025-05-23_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:45:37 SSVIModel INFO: Skipping non-trading day: 2025-05-26 00:00:00\n", - "2025-10-19 00:45:37 SSVIModel INFO: Rebuilding chain for T on 2025-05-27 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:37 SSVIModel INFO: Using cached chain data for T on 2025-05-27 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:37 SSVIModel INFO: Rebuilt chain for T on 2025-05-27 00:00:00\n", - "2025-10-19 00:45:37 SSVIModel INFO: Chain with key: T_2025-05-27_discrete_bs already cached.\n", - "2025-10-19 00:45:37 SSVIModel INFO: All models are already fitted for T_2025-05-27_discrete_bs\n", - "2025-10-19 00:45:37 SSVIModel WARNING: Model for otm on T_2025-05-27_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:45:38 SSVIModel INFO: Rebuilding chain for T on 2025-05-28 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:38 SSVIModel INFO: Using cached chain data for T on 2025-05-28 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:38 SSVIModel INFO: Rebuilt chain for T on 2025-05-28 00:00:00\n", - "2025-10-19 00:45:38 SSVIModel INFO: Chain with key: T_2025-05-28_discrete_bs already cached.\n", - "2025-10-19 00:45:38 SSVIModel INFO: All models are already fitted for T_2025-05-28_discrete_bs\n", - "2025-10-19 00:45:38 SSVIModel WARNING: Model for otm on T_2025-05-28_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:45:39 SSVIModel INFO: Rebuilding chain for T on 2025-05-29 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:39 SSVIModel INFO: Using cached chain data for T on 2025-05-29 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:39 SSVIModel INFO: Rebuilt chain for T on 2025-05-29 00:00:00\n", - "2025-10-19 00:45:39 SSVIModel INFO: Chain with key: T_2025-05-29_discrete_bs already cached.\n", - "2025-10-19 00:45:39 SSVIModel INFO: All models are already fitted for T_2025-05-29_discrete_bs\n", - "2025-10-19 00:45:39 SSVIModel WARNING: Model for otm on T_2025-05-29_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:45:40 SSVIModel INFO: Rebuilding chain for T on 2025-05-30 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:40 SSVIModel INFO: Using cached chain data for T on 2025-05-30 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:40 SSVIModel INFO: Rebuilt chain for T on 2025-05-30 00:00:00\n", - "2025-10-19 00:45:40 SSVIModel INFO: Chain with key: T_2025-05-30_discrete_bs already cached.\n", - "2025-10-19 00:45:40 SSVIModel INFO: All models are already fitted for T_2025-05-30_discrete_bs\n", - "2025-10-19 00:45:40 SSVIModel WARNING: Model for otm on T_2025-05-30_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:45:41 SSVIModel INFO: Rebuilding chain for T on 2025-06-02 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:41 SSVIModel INFO: Using cached chain data for T on 2025-06-02 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:41 SSVIModel INFO: Rebuilt chain for T on 2025-06-02 00:00:00\n", - "2025-10-19 00:45:41 SSVIModel INFO: Chain with key: T_2025-06-02_discrete_bs already cached.\n", - "2025-10-19 00:45:41 SSVIModel INFO: All models are already fitted for T_2025-06-02_discrete_bs\n", - "2025-10-19 00:45:41 SSVIModel WARNING: Model for otm on T_2025-06-02_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:45:42 SSVIModel INFO: Rebuilding chain for T on 2025-06-03 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:42 SSVIModel INFO: Using cached chain data for T on 2025-06-03 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:42 SSVIModel INFO: Rebuilt chain for T on 2025-06-03 00:00:00\n", - "2025-10-19 00:45:42 SSVIModel INFO: Chain with key: T_2025-06-03_discrete_bs already cached.\n", - "2025-10-19 00:45:42 SSVIModel INFO: All models are already fitted for T_2025-06-03_discrete_bs\n", - "2025-10-19 00:45:42 SSVIModel WARNING: Model for otm on T_2025-06-03_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:45:42 SSVIModel INFO: Rebuilding chain for T on 2025-06-04 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:42 SSVIModel INFO: Using cached chain data for T on 2025-06-04 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:42 SSVIModel INFO: Rebuilt chain for T on 2025-06-04 00:00:00\n", - "2025-10-19 00:45:42 SSVIModel INFO: Chain with key: T_2025-06-04_discrete_bs already cached.\n", - "2025-10-19 00:45:42 SSVIModel INFO: All models are already fitted for T_2025-06-04_discrete_bs\n", - "2025-10-19 00:45:42 SSVIModel WARNING: Model for otm on T_2025-06-04_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:45:43 SSVIModel INFO: Rebuilding chain for T on 2025-06-05 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:43 SSVIModel INFO: Using cached chain data for T on 2025-06-05 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:43 SSVIModel INFO: Rebuilt chain for T on 2025-06-05 00:00:00\n", - "2025-10-19 00:45:43 SSVIModel INFO: Chain with key: T_2025-06-05_discrete_bs already cached.\n", - "2025-10-19 00:45:43 SSVIModel INFO: All models are already fitted for T_2025-06-05_discrete_bs\n", - "2025-10-19 00:45:43 SSVIModel WARNING: Model for otm on T_2025-06-05_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:45:43 SSVIModel INFO: Rebuilding chain for T on 2025-06-06 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:43 SSVIModel INFO: Using cached chain data for T on 2025-06-06 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:43 SSVIModel INFO: Rebuilt chain for T on 2025-06-06 00:00:00\n", - "2025-10-19 00:45:43 SSVIModel INFO: Chain with key: T_2025-06-06_discrete_bs already cached.\n", - "2025-10-19 00:45:43 SSVIModel INFO: All models are already fitted for T_2025-06-06_discrete_bs\n", - "2025-10-19 00:45:44 SSVIModel WARNING: Model for otm on T_2025-06-06_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:45:44 SSVIModel INFO: Rebuilding chain for T on 2025-06-09 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:44 SSVIModel INFO: Using cached chain data for T on 2025-06-09 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:44 SSVIModel INFO: Rebuilt chain for T on 2025-06-09 00:00:00\n", - "2025-10-19 00:45:44 SSVIModel INFO: Chain with key: T_2025-06-09_discrete_bs already cached.\n", - "2025-10-19 00:45:44 SSVIModel INFO: All models are already fitted for T_2025-06-09_discrete_bs\n", - "2025-10-19 00:45:44 SSVIModel WARNING: Model for otm on T_2025-06-09_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:45:45 SSVIModel INFO: Rebuilding chain for T on 2025-06-10 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:45 SSVIModel INFO: Using cached chain data for T on 2025-06-10 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:45 SSVIModel INFO: Rebuilt chain for T on 2025-06-10 00:00:00\n", - "2025-10-19 00:45:45 SSVIModel INFO: Chain with key: T_2025-06-10_discrete_bs already cached.\n", - "2025-10-19 00:45:45 SSVIModel INFO: All models are already fitted for T_2025-06-10_discrete_bs\n", - "2025-10-19 00:45:45 SSVIModel WARNING: Model for otm on T_2025-06-10_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:45:45 SSVIModel INFO: Rebuilding chain for T on 2025-06-11 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:45 SSVIModel INFO: Using cached chain data for T on 2025-06-11 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:46 SSVIModel INFO: Rebuilt chain for T on 2025-06-11 00:00:00\n", - "2025-10-19 00:45:46 SSVIModel INFO: Chain with key: T_2025-06-11_discrete_bs already cached.\n", - "2025-10-19 00:45:46 SSVIModel INFO: All models are already fitted for T_2025-06-11_discrete_bs\n", - "2025-10-19 00:45:46 SSVIModel WARNING: Model for otm on T_2025-06-11_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:45:46 SSVIModel INFO: Rebuilding chain for T on 2025-06-12 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:46 SSVIModel INFO: Using cached chain data for T on 2025-06-12 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:46 SSVIModel INFO: Rebuilt chain for T on 2025-06-12 00:00:00\n", - "2025-10-19 00:45:46 SSVIModel INFO: Chain with key: T_2025-06-12_discrete_bs already cached.\n", - "2025-10-19 00:45:46 SSVIModel INFO: All models are already fitted for T_2025-06-12_discrete_bs\n", - "2025-10-19 00:45:46 SSVIModel WARNING: Model for otm on T_2025-06-12_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:45:47 SSVIModel INFO: Rebuilding chain for T on 2025-06-13 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:47 SSVIModel INFO: Using cached chain data for T on 2025-06-13 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:47 SSVIModel INFO: Rebuilt chain for T on 2025-06-13 00:00:00\n", - "2025-10-19 00:45:47 SSVIModel INFO: Chain with key: T_2025-06-13_discrete_bs already cached.\n", - "2025-10-19 00:45:47 SSVIModel INFO: All models are already fitted for T_2025-06-13_discrete_bs\n", - "2025-10-19 00:45:47 SSVIModel WARNING: Model for otm on T_2025-06-13_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:45:49 SSVIModel INFO: Rebuilding chain for T on 2025-06-16 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:49 SSVIModel INFO: Using cached chain data for T on 2025-06-16 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:49 SSVIModel INFO: Rebuilt chain for T on 2025-06-16 00:00:00\n", - "2025-10-19 00:45:49 SSVIModel INFO: Chain with key: T_2025-06-16_discrete_bs already cached.\n", - "2025-10-19 00:45:49 SSVIModel INFO: All models are already fitted for T_2025-06-16_discrete_bs\n", - "2025-10-19 00:45:49 SSVIModel WARNING: Model for otm on T_2025-06-16_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:45:49 SSVIModel INFO: Rebuilding chain for T on 2025-06-17 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:49 SSVIModel INFO: Using cached chain data for T on 2025-06-17 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:49 SSVIModel INFO: Rebuilt chain for T on 2025-06-17 00:00:00\n", - "2025-10-19 00:45:49 SSVIModel INFO: Chain with key: T_2025-06-17_discrete_bs already cached.\n", - "2025-10-19 00:45:49 SSVIModel INFO: All models are already fitted for T_2025-06-17_discrete_bs\n", - "2025-10-19 00:45:49 SSVIModel WARNING: Model for otm on T_2025-06-17_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:45:50 SSVIModel INFO: Rebuilding chain for T on 2025-06-18 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:50 SSVIModel INFO: Using cached chain data for T on 2025-06-18 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:50 SSVIModel INFO: Rebuilt chain for T on 2025-06-18 00:00:00\n", - "2025-10-19 00:45:50 SSVIModel INFO: Chain with key: T_2025-06-18_discrete_bs already cached.\n", - "2025-10-19 00:45:50 SSVIModel INFO: All models are already fitted for T_2025-06-18_discrete_bs\n", - "2025-10-19 00:45:50 SSVIModel WARNING: Model for otm on T_2025-06-18_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:45:51 SSVIModel INFO: Skipping non-trading day: 2025-06-19 00:00:00\n", - "2025-10-19 00:45:51 SSVIModel INFO: Rebuilding chain for T on 2025-06-20 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:51 SSVIModel INFO: Using cached chain data for T on 2025-06-20 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:51 SSVIModel INFO: Rebuilt chain for T on 2025-06-20 00:00:00\n", - "2025-10-19 00:45:51 SSVIModel INFO: Chain with key: T_2025-06-20_discrete_bs already cached.\n", - "2025-10-19 00:45:51 SSVIModel INFO: All models are already fitted for T_2025-06-20_discrete_bs\n", - "2025-10-19 00:45:51 SSVIModel WARNING: Model for otm on T_2025-06-20_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:45:51 SSVIModel INFO: Rebuilding chain for T on 2025-06-23 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:51 SSVIModel INFO: Using cached chain data for T on 2025-06-23 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:51 SSVIModel INFO: Rebuilt chain for T on 2025-06-23 00:00:00\n", - "2025-10-19 00:45:51 SSVIModel INFO: Chain with key: T_2025-06-23_discrete_bs already cached.\n", - "2025-10-19 00:45:51 SSVIModel INFO: All models are already fitted for T_2025-06-23_discrete_bs\n", - "2025-10-19 00:45:52 SSVIModel WARNING: Model for otm on T_2025-06-23_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:45:52 SSVIModel INFO: Rebuilding chain for T on 2025-06-24 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:52 SSVIModel INFO: Using cached chain data for T on 2025-06-24 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:52 SSVIModel INFO: Rebuilt chain for T on 2025-06-24 00:00:00\n", - "2025-10-19 00:45:52 SSVIModel INFO: Chain with key: T_2025-06-24_discrete_bs already cached.\n", - "2025-10-19 00:45:52 SSVIModel INFO: All models are already fitted for T_2025-06-24_discrete_bs\n", - "2025-10-19 00:45:52 SSVIModel WARNING: Model for otm on T_2025-06-24_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:45:53 SSVIModel INFO: Rebuilding chain for T on 2025-06-25 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:53 SSVIModel INFO: Using cached chain data for T on 2025-06-25 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:53 SSVIModel INFO: Rebuilt chain for T on 2025-06-25 00:00:00\n", - "2025-10-19 00:45:53 SSVIModel INFO: Chain with key: T_2025-06-25_discrete_bs already cached.\n", - "2025-10-19 00:45:53 SSVIModel INFO: All models are already fitted for T_2025-06-25_discrete_bs\n", - "2025-10-19 00:45:53 SSVIModel WARNING: Model for otm on T_2025-06-25_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:45:53 SSVIModel INFO: Rebuilding chain for T on 2025-06-26 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:53 SSVIModel INFO: Using cached chain data for T on 2025-06-26 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:53 SSVIModel INFO: Rebuilt chain for T on 2025-06-26 00:00:00\n", - "2025-10-19 00:45:53 SSVIModel INFO: Chain with key: T_2025-06-26_discrete_bs already cached.\n", - "2025-10-19 00:45:53 SSVIModel INFO: All models are already fitted for T_2025-06-26_discrete_bs\n", - "2025-10-19 00:45:54 SSVIModel WARNING: Model for otm on T_2025-06-26_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:45:54 SSVIModel INFO: Rebuilding chain for T on 2025-06-27 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:54 SSVIModel INFO: Using cached chain data for T on 2025-06-27 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:54 SSVIModel INFO: Rebuilt chain for T on 2025-06-27 00:00:00\n", - "2025-10-19 00:45:54 SSVIModel INFO: Chain with key: T_2025-06-27_discrete_bs already cached.\n", - "2025-10-19 00:45:54 SSVIModel INFO: All models are already fitted for T_2025-06-27_discrete_bs\n", - "2025-10-19 00:45:54 SSVIModel WARNING: Model for otm on T_2025-06-27_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:45:55 SSVIModel INFO: Rebuilding chain for T on 2025-06-30 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:55 SSVIModel INFO: Using cached chain data for T on 2025-06-30 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:55 SSVIModel INFO: Rebuilt chain for T on 2025-06-30 00:00:00\n", - "2025-10-19 00:45:55 SSVIModel INFO: Chain with key: T_2025-06-30_discrete_bs already cached.\n", - "2025-10-19 00:45:55 SSVIModel INFO: All models are already fitted for T_2025-06-30_discrete_bs\n", - "2025-10-19 00:45:55 SSVIModel WARNING: Model for otm on T_2025-06-30_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:45:55 SSVIModel INFO: Rebuilding chain for T on 2025-07-01 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:55 SSVIModel INFO: Using cached chain data for T on 2025-07-01 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:55 SSVIModel INFO: Rebuilt chain for T on 2025-07-01 00:00:00\n", - "2025-10-19 00:45:55 SSVIModel INFO: Chain with key: T_2025-07-01_discrete_bs already cached.\n", - "2025-10-19 00:45:55 SSVIModel INFO: All models are already fitted for T_2025-07-01_discrete_bs\n", - "2025-10-19 00:45:55 SSVIModel WARNING: Model for otm on T_2025-07-01_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:45:56 SSVIModel INFO: Rebuilding chain for T on 2025-07-02 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:56 SSVIModel INFO: Using cached chain data for T on 2025-07-02 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:56 SSVIModel INFO: Rebuilt chain for T on 2025-07-02 00:00:00\n", - "2025-10-19 00:45:56 SSVIModel INFO: Chain with key: T_2025-07-02_discrete_bs already cached.\n", - "2025-10-19 00:45:56 SSVIModel INFO: All models are already fitted for T_2025-07-02_discrete_bs\n", - "2025-10-19 00:45:56 SSVIModel WARNING: Model for otm on T_2025-07-02_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:45:56 SSVIModel INFO: Rebuilding chain for T on 2025-07-03 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:56 SSVIModel INFO: Using cached chain data for T on 2025-07-03 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:56 SSVIModel INFO: Rebuilt chain for T on 2025-07-03 00:00:00\n", - "2025-10-19 00:45:56 SSVIModel INFO: Chain with key: T_2025-07-03_discrete_bs already cached.\n", - "2025-10-19 00:45:56 SSVIModel INFO: All models are already fitted for T_2025-07-03_discrete_bs\n", - "2025-10-19 00:45:56 SSVIModel WARNING: Model for otm on T_2025-07-03_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:45:57 SSVIModel INFO: Skipping non-trading day: 2025-07-04 00:00:00\n", - "2025-10-19 00:45:57 SSVIModel INFO: Rebuilding chain for T on 2025-07-07 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:57 SSVIModel INFO: Using cached chain data for T on 2025-07-07 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:57 SSVIModel INFO: Rebuilt chain for T on 2025-07-07 00:00:00\n", - "2025-10-19 00:45:57 SSVIModel INFO: Chain with key: T_2025-07-07_discrete_bs already cached.\n", - "2025-10-19 00:45:57 SSVIModel INFO: All models are already fitted for T_2025-07-07_discrete_bs\n", - "2025-10-19 00:45:57 SSVIModel WARNING: Model for otm on T_2025-07-07_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:45:57 SSVIModel INFO: Rebuilding chain for T on 2025-07-08 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:57 SSVIModel INFO: Using cached chain data for T on 2025-07-08 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:57 SSVIModel INFO: Rebuilt chain for T on 2025-07-08 00:00:00\n", - "2025-10-19 00:45:57 SSVIModel INFO: Chain with key: T_2025-07-08_discrete_bs already cached.\n", - "2025-10-19 00:45:57 SSVIModel INFO: All models are already fitted for T_2025-07-08_discrete_bs\n", - "2025-10-19 00:45:57 SSVIModel WARNING: Model for otm on T_2025-07-08_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:45:58 SSVIModel INFO: Rebuilding chain for T on 2025-07-09 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:58 SSVIModel INFO: Using cached chain data for T on 2025-07-09 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:58 SSVIModel INFO: Rebuilt chain for T on 2025-07-09 00:00:00\n", - "2025-10-19 00:45:58 SSVIModel INFO: Chain with key: T_2025-07-09_discrete_bs already cached.\n", - "2025-10-19 00:45:58 SSVIModel INFO: All models are already fitted for T_2025-07-09_discrete_bs\n", - "2025-10-19 00:45:58 SSVIModel WARNING: Model for otm on T_2025-07-09_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:45:58 SSVIModel INFO: Rebuilding chain for T on 2025-07-10 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:58 SSVIModel INFO: Using cached chain data for T on 2025-07-10 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:58 SSVIModel INFO: Rebuilt chain for T on 2025-07-10 00:00:00\n", - "2025-10-19 00:45:58 SSVIModel INFO: Chain with key: T_2025-07-10_discrete_bs already cached.\n", - "2025-10-19 00:45:58 SSVIModel INFO: All models are already fitted for T_2025-07-10_discrete_bs\n", - "2025-10-19 00:45:58 SSVIModel WARNING: Model for otm on T_2025-07-10_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:45:59 SSVIModel INFO: Rebuilding chain for T on 2025-07-11 00:00:00 because config changed or not cached\n", - "2025-10-19 00:45:59 SSVIModel INFO: Using cached chain data for T on 2025-07-11 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:45:59 SSVIModel INFO: Rebuilt chain for T on 2025-07-11 00:00:00\n", - "2025-10-19 00:45:59 SSVIModel INFO: Chain with key: T_2025-07-11_discrete_bs already cached.\n", - "2025-10-19 00:45:59 SSVIModel INFO: All models are already fitted for T_2025-07-11_discrete_bs\n", - "2025-10-19 00:45:59 SSVIModel WARNING: Model for otm on T_2025-07-11_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:00 SSVIModel INFO: Rebuilding chain for T on 2025-07-14 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:00 SSVIModel INFO: Using cached chain data for T on 2025-07-14 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:00 SSVIModel INFO: Rebuilt chain for T on 2025-07-14 00:00:00\n", - "2025-10-19 00:46:00 SSVIModel INFO: Chain with key: T_2025-07-14_discrete_bs already cached.\n", - "2025-10-19 00:46:00 SSVIModel INFO: All models are already fitted for T_2025-07-14_discrete_bs\n", - "2025-10-19 00:46:00 SSVIModel WARNING: Model for otm on T_2025-07-14_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:01 SSVIModel INFO: Rebuilding chain for T on 2025-07-15 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:01 SSVIModel INFO: Using cached chain data for T on 2025-07-15 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:01 SSVIModel INFO: Rebuilt chain for T on 2025-07-15 00:00:00\n", - "2025-10-19 00:46:01 SSVIModel INFO: Chain with key: T_2025-07-15_discrete_bs already cached.\n", - "2025-10-19 00:46:01 SSVIModel INFO: All models are already fitted for T_2025-07-15_discrete_bs\n", - "2025-10-19 00:46:01 SSVIModel WARNING: Model for otm on T_2025-07-15_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:02 SSVIModel INFO: Rebuilding chain for T on 2025-07-16 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:02 SSVIModel INFO: Using cached chain data for T on 2025-07-16 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:02 SSVIModel INFO: Rebuilt chain for T on 2025-07-16 00:00:00\n", - "2025-10-19 00:46:02 SSVIModel INFO: Chain with key: T_2025-07-16_discrete_bs already cached.\n", - "2025-10-19 00:46:02 SSVIModel INFO: All models are already fitted for T_2025-07-16_discrete_bs\n", - "2025-10-19 00:46:02 SSVIModel WARNING: Model for otm on T_2025-07-16_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:03 SSVIModel INFO: Rebuilding chain for T on 2025-07-17 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:03 SSVIModel INFO: Using cached chain data for T on 2025-07-17 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:03 SSVIModel INFO: Rebuilt chain for T on 2025-07-17 00:00:00\n", - "2025-10-19 00:46:03 SSVIModel INFO: Chain with key: T_2025-07-17_discrete_bs already cached.\n", - "2025-10-19 00:46:03 SSVIModel INFO: All models are already fitted for T_2025-07-17_discrete_bs\n", - "2025-10-19 00:46:03 SSVIModel WARNING: Model for otm on T_2025-07-17_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:03 SSVIModel INFO: Rebuilding chain for T on 2025-07-18 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:03 SSVIModel INFO: Using cached chain data for T on 2025-07-18 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:03 SSVIModel INFO: Rebuilt chain for T on 2025-07-18 00:00:00\n", - "2025-10-19 00:46:03 SSVIModel INFO: Chain with key: T_2025-07-18_discrete_bs already cached.\n", - "2025-10-19 00:46:03 SSVIModel INFO: All models are already fitted for T_2025-07-18_discrete_bs\n", - "2025-10-19 00:46:03 SSVIModel WARNING: Model for otm on T_2025-07-18_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:04 SSVIModel INFO: Rebuilding chain for T on 2025-07-21 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:04 SSVIModel INFO: Using cached chain data for T on 2025-07-21 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:04 SSVIModel INFO: Rebuilt chain for T on 2025-07-21 00:00:00\n", - "2025-10-19 00:46:04 SSVIModel INFO: Chain with key: T_2025-07-21_discrete_bs already cached.\n", - "2025-10-19 00:46:04 SSVIModel INFO: All models are already fitted for T_2025-07-21_discrete_bs\n", - "2025-10-19 00:46:04 SSVIModel WARNING: Model for otm on T_2025-07-21_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:05 SSVIModel INFO: Rebuilding chain for T on 2025-07-22 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:05 SSVIModel INFO: Using cached chain data for T on 2025-07-22 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:05 SSVIModel INFO: Rebuilt chain for T on 2025-07-22 00:00:00\n", - "2025-10-19 00:46:05 SSVIModel INFO: Chain with key: T_2025-07-22_discrete_bs already cached.\n", - "2025-10-19 00:46:05 SSVIModel INFO: All models are already fitted for T_2025-07-22_discrete_bs\n", - "2025-10-19 00:46:05 SSVIModel WARNING: Model for otm on T_2025-07-22_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:06 SSVIModel INFO: Rebuilding chain for T on 2025-07-23 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:06 SSVIModel INFO: Using cached chain data for T on 2025-07-23 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:06 SSVIModel INFO: Rebuilt chain for T on 2025-07-23 00:00:00\n", - "2025-10-19 00:46:06 SSVIModel INFO: Chain with key: T_2025-07-23_discrete_bs already cached.\n", - "2025-10-19 00:46:06 SSVIModel INFO: All models are already fitted for T_2025-07-23_discrete_bs\n", - "2025-10-19 00:46:06 SSVIModel WARNING: Model for otm on T_2025-07-23_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:07 SSVIModel INFO: Rebuilding chain for T on 2025-07-24 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:07 SSVIModel INFO: Using cached chain data for T on 2025-07-24 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:07 SSVIModel INFO: Rebuilt chain for T on 2025-07-24 00:00:00\n", - "2025-10-19 00:46:07 SSVIModel INFO: Chain with key: T_2025-07-24_discrete_bs already cached.\n", - "2025-10-19 00:46:07 SSVIModel INFO: All models are already fitted for T_2025-07-24_discrete_bs\n", - "2025-10-19 00:46:07 SSVIModel WARNING: Model for otm on T_2025-07-24_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:08 SSVIModel INFO: Rebuilding chain for T on 2025-07-25 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:08 SSVIModel INFO: Using cached chain data for T on 2025-07-25 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:08 SSVIModel INFO: Rebuilt chain for T on 2025-07-25 00:00:00\n", - "2025-10-19 00:46:08 SSVIModel INFO: Chain with key: T_2025-07-25_discrete_bs already cached.\n", - "2025-10-19 00:46:08 SSVIModel INFO: All models are already fitted for T_2025-07-25_discrete_bs\n", - "2025-10-19 00:46:08 SSVIModel WARNING: Model for otm on T_2025-07-25_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:09 SSVIModel INFO: Rebuilding chain for T on 2025-07-28 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:09 SSVIModel INFO: Using cached chain data for T on 2025-07-28 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:09 SSVIModel INFO: Rebuilt chain for T on 2025-07-28 00:00:00\n", - "2025-10-19 00:46:09 SSVIModel INFO: Chain with key: T_2025-07-28_discrete_bs already cached.\n", - "2025-10-19 00:46:09 SSVIModel INFO: All models are already fitted for T_2025-07-28_discrete_bs\n", - "2025-10-19 00:46:09 SSVIModel WARNING: Model for otm on T_2025-07-28_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:10 SSVIModel INFO: Rebuilding chain for T on 2025-07-29 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:10 SSVIModel INFO: Using cached chain data for T on 2025-07-29 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:10 SSVIModel INFO: Rebuilt chain for T on 2025-07-29 00:00:00\n", - "2025-10-19 00:46:10 SSVIModel INFO: Chain with key: T_2025-07-29_discrete_bs already cached.\n", - "2025-10-19 00:46:10 SSVIModel INFO: All models are already fitted for T_2025-07-29_discrete_bs\n", - "2025-10-19 00:46:10 SSVIModel WARNING: Model for otm on T_2025-07-29_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:11 SSVIModel INFO: Rebuilding chain for T on 2025-07-30 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:11 SSVIModel INFO: Using cached chain data for T on 2025-07-30 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:11 SSVIModel INFO: Rebuilt chain for T on 2025-07-30 00:00:00\n", - "2025-10-19 00:46:11 SSVIModel INFO: Chain with key: T_2025-07-30_discrete_bs already cached.\n", - "2025-10-19 00:46:11 SSVIModel INFO: All models are already fitted for T_2025-07-30_discrete_bs\n", - "2025-10-19 00:46:11 SSVIModel WARNING: Model for otm on T_2025-07-30_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:12 SSVIModel INFO: Rebuilding chain for T on 2025-07-31 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:12 SSVIModel INFO: Using cached chain data for T on 2025-07-31 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:12 SSVIModel INFO: Rebuilt chain for T on 2025-07-31 00:00:00\n", - "2025-10-19 00:46:12 SSVIModel INFO: Chain with key: T_2025-07-31_discrete_bs already cached.\n", - "2025-10-19 00:46:12 SSVIModel INFO: All models are already fitted for T_2025-07-31_discrete_bs\n", - "2025-10-19 00:46:12 SSVIModel WARNING: Model for otm on T_2025-07-31_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:13 SSVIModel INFO: Rebuilding chain for T on 2025-08-01 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:13 SSVIModel INFO: Using cached chain data for T on 2025-08-01 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:13 SSVIModel INFO: Rebuilt chain for T on 2025-08-01 00:00:00\n", - "2025-10-19 00:46:13 SSVIModel INFO: Chain with key: T_2025-08-01_discrete_bs already cached.\n", - "2025-10-19 00:46:13 SSVIModel INFO: All models are already fitted for T_2025-08-01_discrete_bs\n", - "2025-10-19 00:46:13 SSVIModel WARNING: Model for otm on T_2025-08-01_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:14 SSVIModel INFO: Rebuilding chain for T on 2025-08-04 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:14 SSVIModel INFO: Using cached chain data for T on 2025-08-04 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:14 SSVIModel INFO: Rebuilt chain for T on 2025-08-04 00:00:00\n", - "2025-10-19 00:46:14 SSVIModel INFO: Chain with key: T_2025-08-04_discrete_bs already cached.\n", - "2025-10-19 00:46:14 SSVIModel INFO: All models are already fitted for T_2025-08-04_discrete_bs\n", - "2025-10-19 00:46:14 SSVIModel WARNING: Model for otm on T_2025-08-04_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:15 SSVIModel INFO: Rebuilding chain for T on 2025-08-05 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:15 SSVIModel INFO: Using cached chain data for T on 2025-08-05 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:15 SSVIModel INFO: Rebuilt chain for T on 2025-08-05 00:00:00\n", - "2025-10-19 00:46:15 SSVIModel INFO: Chain with key: T_2025-08-05_discrete_bs already cached.\n", - "2025-10-19 00:46:15 SSVIModel INFO: All models are already fitted for T_2025-08-05_discrete_bs\n", - "2025-10-19 00:46:16 SSVIModel WARNING: Model for otm on T_2025-08-05_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:17 SSVIModel INFO: Rebuilding chain for T on 2025-08-06 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:17 SSVIModel INFO: Using cached chain data for T on 2025-08-06 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:17 SSVIModel INFO: Rebuilt chain for T on 2025-08-06 00:00:00\n", - "2025-10-19 00:46:17 SSVIModel INFO: Chain with key: T_2025-08-06_discrete_bs already cached.\n", - "2025-10-19 00:46:17 SSVIModel INFO: All models are already fitted for T_2025-08-06_discrete_bs\n", - "2025-10-19 00:46:17 SSVIModel WARNING: Model for otm on T_2025-08-06_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:18 SSVIModel INFO: Rebuilding chain for T on 2025-08-07 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:18 SSVIModel INFO: Using cached chain data for T on 2025-08-07 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:18 SSVIModel INFO: Rebuilt chain for T on 2025-08-07 00:00:00\n", - "2025-10-19 00:46:18 SSVIModel INFO: Chain with key: T_2025-08-07_discrete_bs already cached.\n", - "2025-10-19 00:46:18 SSVIModel INFO: All models are already fitted for T_2025-08-07_discrete_bs\n", - "2025-10-19 00:46:18 SSVIModel WARNING: Model for otm on T_2025-08-07_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:19 SSVIModel INFO: Rebuilding chain for T on 2025-08-08 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:19 SSVIModel INFO: Using cached chain data for T on 2025-08-08 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:19 SSVIModel INFO: Rebuilt chain for T on 2025-08-08 00:00:00\n", - "2025-10-19 00:46:19 SSVIModel INFO: Chain with key: T_2025-08-08_discrete_bs already cached.\n", - "2025-10-19 00:46:19 SSVIModel INFO: All models are already fitted for T_2025-08-08_discrete_bs\n", - "2025-10-19 00:46:19 SSVIModel WARNING: Model for otm on T_2025-08-08_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:21 SSVIModel INFO: Rebuilding chain for T on 2025-08-11 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:21 SSVIModel INFO: Using cached chain data for T on 2025-08-11 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:21 SSVIModel INFO: Rebuilt chain for T on 2025-08-11 00:00:00\n", - "2025-10-19 00:46:21 SSVIModel INFO: Chain with key: T_2025-08-11_discrete_bs already cached.\n", - "2025-10-19 00:46:21 SSVIModel INFO: All models are already fitted for T_2025-08-11_discrete_bs\n", - "2025-10-19 00:46:21 SSVIModel WARNING: Model for otm on T_2025-08-11_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:22 SSVIModel INFO: Rebuilding chain for T on 2025-08-12 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:22 SSVIModel INFO: Using cached chain data for T on 2025-08-12 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:22 SSVIModel INFO: Rebuilt chain for T on 2025-08-12 00:00:00\n", - "2025-10-19 00:46:22 SSVIModel INFO: Chain with key: T_2025-08-12_discrete_bs already cached.\n", - "2025-10-19 00:46:22 SSVIModel INFO: All models are already fitted for T_2025-08-12_discrete_bs\n", - "2025-10-19 00:46:22 SSVIModel WARNING: Model for otm on T_2025-08-12_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:23 SSVIModel INFO: Rebuilding chain for T on 2025-08-13 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:23 SSVIModel INFO: Using cached chain data for T on 2025-08-13 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:23 SSVIModel INFO: Rebuilt chain for T on 2025-08-13 00:00:00\n", - "2025-10-19 00:46:23 SSVIModel INFO: Chain with key: T_2025-08-13_discrete_bs already cached.\n", - "2025-10-19 00:46:23 SSVIModel INFO: All models are already fitted for T_2025-08-13_discrete_bs\n", - "2025-10-19 00:46:23 SSVIModel WARNING: Model for otm on T_2025-08-13_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:24 SSVIModel INFO: Rebuilding chain for T on 2025-08-14 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:24 SSVIModel INFO: Using cached chain data for T on 2025-08-14 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:24 SSVIModel INFO: Rebuilt chain for T on 2025-08-14 00:00:00\n", - "2025-10-19 00:46:24 SSVIModel INFO: Chain with key: T_2025-08-14_discrete_bs already cached.\n", - "2025-10-19 00:46:24 SSVIModel INFO: All models are already fitted for T_2025-08-14_discrete_bs\n", - "2025-10-19 00:46:24 SSVIModel WARNING: Model for otm on T_2025-08-14_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:24 SSVIModel INFO: Rebuilding chain for T on 2025-08-15 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:24 SSVIModel INFO: Using cached chain data for T on 2025-08-15 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:24 SSVIModel INFO: Rebuilt chain for T on 2025-08-15 00:00:00\n", - "2025-10-19 00:46:24 SSVIModel INFO: Chain with key: T_2025-08-15_discrete_bs already cached.\n", - "2025-10-19 00:46:24 SSVIModel INFO: All models are already fitted for T_2025-08-15_discrete_bs\n", - "2025-10-19 00:46:25 SSVIModel WARNING: Model for otm on T_2025-08-15_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:25 SSVIModel INFO: Rebuilding chain for T on 2025-08-18 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:25 SSVIModel INFO: Using cached chain data for T on 2025-08-18 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:25 SSVIModel INFO: Rebuilt chain for T on 2025-08-18 00:00:00\n", - "2025-10-19 00:46:25 SSVIModel INFO: Chain with key: T_2025-08-18_discrete_bs already cached.\n", - "2025-10-19 00:46:25 SSVIModel INFO: All models are already fitted for T_2025-08-18_discrete_bs\n", - "2025-10-19 00:46:25 SSVIModel WARNING: Model for otm on T_2025-08-18_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:26 SSVIModel INFO: Rebuilding chain for T on 2025-08-19 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:26 SSVIModel INFO: Using cached chain data for T on 2025-08-19 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:26 SSVIModel INFO: Rebuilt chain for T on 2025-08-19 00:00:00\n", - "2025-10-19 00:46:26 SSVIModel INFO: Chain with key: T_2025-08-19_discrete_bs already cached.\n", - "2025-10-19 00:46:26 SSVIModel INFO: All models are already fitted for T_2025-08-19_discrete_bs\n", - "2025-10-19 00:46:26 SSVIModel WARNING: Model for otm on T_2025-08-19_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:26 SSVIModel INFO: Rebuilding chain for T on 2025-08-20 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:26 SSVIModel INFO: Using cached chain data for T on 2025-08-20 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:26 SSVIModel INFO: Rebuilt chain for T on 2025-08-20 00:00:00\n", - "2025-10-19 00:46:27 SSVIModel INFO: Chain with key: T_2025-08-20_discrete_bs already cached.\n", - "2025-10-19 00:46:27 SSVIModel INFO: All models are already fitted for T_2025-08-20_discrete_bs\n", - "2025-10-19 00:46:27 SSVIModel WARNING: Model for otm on T_2025-08-20_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:27 SSVIModel INFO: Rebuilding chain for T on 2025-08-21 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:27 SSVIModel INFO: Using cached chain data for T on 2025-08-21 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:27 SSVIModel INFO: Rebuilt chain for T on 2025-08-21 00:00:00\n", - "2025-10-19 00:46:27 SSVIModel INFO: Chain with key: T_2025-08-21_discrete_bs already cached.\n", - "2025-10-19 00:46:27 SSVIModel INFO: All models are already fitted for T_2025-08-21_discrete_bs\n", - "2025-10-19 00:46:28 SSVIModel WARNING: Model for otm on T_2025-08-21_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:28 SSVIModel INFO: Rebuilding chain for T on 2025-08-22 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:28 SSVIModel INFO: Using cached chain data for T on 2025-08-22 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:28 SSVIModel INFO: Rebuilt chain for T on 2025-08-22 00:00:00\n", - "2025-10-19 00:46:28 SSVIModel INFO: Chain with key: T_2025-08-22_discrete_bs already cached.\n", - "2025-10-19 00:46:28 SSVIModel INFO: All models are already fitted for T_2025-08-22_discrete_bs\n", - "2025-10-19 00:46:28 SSVIModel WARNING: Model for otm on T_2025-08-22_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:29 SSVIModel INFO: Rebuilding chain for T on 2025-08-25 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:29 SSVIModel INFO: Using cached chain data for T on 2025-08-25 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:29 SSVIModel INFO: Rebuilt chain for T on 2025-08-25 00:00:00\n", - "2025-10-19 00:46:29 SSVIModel INFO: Chain with key: T_2025-08-25_discrete_bs already cached.\n", - "2025-10-19 00:46:29 SSVIModel INFO: All models are already fitted for T_2025-08-25_discrete_bs\n", - "2025-10-19 00:46:29 SSVIModel WARNING: Model for otm on T_2025-08-25_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:29 SSVIModel INFO: Rebuilding chain for T on 2025-08-26 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:29 SSVIModel INFO: Using cached chain data for T on 2025-08-26 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:29 SSVIModel INFO: Rebuilt chain for T on 2025-08-26 00:00:00\n", - "2025-10-19 00:46:29 SSVIModel INFO: Chain with key: T_2025-08-26_discrete_bs already cached.\n", - "2025-10-19 00:46:30 SSVIModel INFO: All models are already fitted for T_2025-08-26_discrete_bs\n", - "2025-10-19 00:46:30 SSVIModel WARNING: Model for otm on T_2025-08-26_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:30 SSVIModel INFO: Rebuilding chain for T on 2025-08-27 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:30 SSVIModel INFO: Using cached chain data for T on 2025-08-27 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:30 SSVIModel INFO: Rebuilt chain for T on 2025-08-27 00:00:00\n", - "2025-10-19 00:46:30 SSVIModel INFO: Chain with key: T_2025-08-27_discrete_bs already cached.\n", - "2025-10-19 00:46:30 SSVIModel INFO: All models are already fitted for T_2025-08-27_discrete_bs\n", - "2025-10-19 00:46:30 SSVIModel WARNING: Model for otm on T_2025-08-27_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:31 SSVIModel INFO: Rebuilding chain for T on 2025-08-28 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:31 SSVIModel INFO: Using cached chain data for T on 2025-08-28 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:31 SSVIModel INFO: Rebuilt chain for T on 2025-08-28 00:00:00\n", - "2025-10-19 00:46:31 SSVIModel INFO: Chain with key: T_2025-08-28_discrete_bs already cached.\n", - "2025-10-19 00:46:31 SSVIModel INFO: All models are already fitted for T_2025-08-28_discrete_bs\n", - "2025-10-19 00:46:31 SSVIModel WARNING: Model for otm on T_2025-08-28_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:31 SSVIModel INFO: Rebuilding chain for T on 2025-08-29 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:31 SSVIModel INFO: Using cached chain data for T on 2025-08-29 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:32 SSVIModel INFO: Rebuilt chain for T on 2025-08-29 00:00:00\n", - "2025-10-19 00:46:32 SSVIModel INFO: Chain with key: T_2025-08-29_discrete_bs already cached.\n", - "2025-10-19 00:46:32 SSVIModel INFO: All models are already fitted for T_2025-08-29_discrete_bs\n", - "2025-10-19 00:46:32 SSVIModel WARNING: Model for otm on T_2025-08-29_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:33 SSVIModel INFO: Skipping non-trading day: 2025-09-01 00:00:00\n", - "2025-10-19 00:46:33 SSVIModel INFO: Rebuilding chain for T on 2025-09-02 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:33 SSVIModel INFO: Using cached chain data for T on 2025-09-02 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:33 SSVIModel INFO: Rebuilt chain for T on 2025-09-02 00:00:00\n", - "2025-10-19 00:46:33 SSVIModel INFO: Chain with key: T_2025-09-02_discrete_bs already cached.\n", - "2025-10-19 00:46:33 SSVIModel INFO: All models are already fitted for T_2025-09-02_discrete_bs\n", - "2025-10-19 00:46:33 SSVIModel WARNING: Model for otm on T_2025-09-02_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:33 SSVIModel INFO: Rebuilding chain for T on 2025-09-03 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:33 SSVIModel INFO: Using cached chain data for T on 2025-09-03 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:34 SSVIModel INFO: Rebuilt chain for T on 2025-09-03 00:00:00\n", - "2025-10-19 00:46:34 SSVIModel INFO: Chain with key: T_2025-09-03_discrete_bs already cached.\n", - "2025-10-19 00:46:34 SSVIModel INFO: All models are already fitted for T_2025-09-03_discrete_bs\n", - "2025-10-19 00:46:34 SSVIModel WARNING: Model for otm on T_2025-09-03_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:34 SSVIModel INFO: Rebuilding chain for T on 2025-09-04 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:34 SSVIModel INFO: Using cached chain data for T on 2025-09-04 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:35 SSVIModel INFO: Rebuilt chain for T on 2025-09-04 00:00:00\n", - "2025-10-19 00:46:35 SSVIModel INFO: Chain with key: T_2025-09-04_discrete_bs already cached.\n", - "2025-10-19 00:46:35 SSVIModel INFO: All models are already fitted for T_2025-09-04_discrete_bs\n", - "2025-10-19 00:46:36 SSVIModel WARNING: Model for otm on T_2025-09-04_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:37 SSVIModel INFO: Rebuilding chain for T on 2025-09-05 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:37 SSVIModel INFO: Using cached chain data for T on 2025-09-05 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:37 SSVIModel INFO: Rebuilt chain for T on 2025-09-05 00:00:00\n", - "2025-10-19 00:46:37 SSVIModel INFO: Chain with key: T_2025-09-05_discrete_bs already cached.\n", - "2025-10-19 00:46:37 SSVIModel INFO: All models are already fitted for T_2025-09-05_discrete_bs\n", - "2025-10-19 00:46:37 SSVIModel WARNING: Model for otm on T_2025-09-05_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:38 SSVIModel INFO: Rebuilding chain for T on 2025-09-08 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:38 SSVIModel INFO: Using cached chain data for T on 2025-09-08 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:38 SSVIModel INFO: Rebuilt chain for T on 2025-09-08 00:00:00\n", - "2025-10-19 00:46:38 SSVIModel INFO: Chain with key: T_2025-09-08_discrete_bs already cached.\n", - "2025-10-19 00:46:38 SSVIModel INFO: All models are already fitted for T_2025-09-08_discrete_bs\n", - "2025-10-19 00:46:38 SSVIModel WARNING: Model for otm on T_2025-09-08_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:39 SSVIModel INFO: Rebuilding chain for T on 2025-09-09 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:39 SSVIModel INFO: Using cached chain data for T on 2025-09-09 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:39 SSVIModel INFO: Rebuilt chain for T on 2025-09-09 00:00:00\n", - "2025-10-19 00:46:39 SSVIModel INFO: Chain with key: T_2025-09-09_discrete_bs already cached.\n", - "2025-10-19 00:46:39 SSVIModel INFO: All models are already fitted for T_2025-09-09_discrete_bs\n", - "2025-10-19 00:46:39 SSVIModel WARNING: Model for otm on T_2025-09-09_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:40 SSVIModel INFO: Rebuilding chain for T on 2025-09-10 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:40 SSVIModel INFO: Using cached chain data for T on 2025-09-10 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:40 SSVIModel INFO: Rebuilt chain for T on 2025-09-10 00:00:00\n", - "2025-10-19 00:46:40 SSVIModel INFO: Chain with key: T_2025-09-10_discrete_bs already cached.\n", - "2025-10-19 00:46:40 SSVIModel INFO: All models are already fitted for T_2025-09-10_discrete_bs\n", - "2025-10-19 00:46:40 SSVIModel WARNING: Model for otm on T_2025-09-10_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:41 SSVIModel INFO: Rebuilding chain for T on 2025-09-11 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:41 SSVIModel INFO: Using cached chain data for T on 2025-09-11 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:41 SSVIModel INFO: Rebuilt chain for T on 2025-09-11 00:00:00\n", - "2025-10-19 00:46:41 SSVIModel INFO: Chain with key: T_2025-09-11_discrete_bs already cached.\n", - "2025-10-19 00:46:41 SSVIModel INFO: All models are already fitted for T_2025-09-11_discrete_bs\n", - "2025-10-19 00:46:41 SSVIModel WARNING: Model for otm on T_2025-09-11_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:41 SSVIModel INFO: Rebuilding chain for T on 2025-09-12 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:41 SSVIModel INFO: Using cached chain data for T on 2025-09-12 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:41 SSVIModel INFO: Rebuilt chain for T on 2025-09-12 00:00:00\n", - "2025-10-19 00:46:41 SSVIModel INFO: Chain with key: T_2025-09-12_discrete_bs already cached.\n", - "2025-10-19 00:46:41 SSVIModel INFO: All models are already fitted for T_2025-09-12_discrete_bs\n", - "2025-10-19 00:46:42 SSVIModel WARNING: Model for otm on T_2025-09-12_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:42 SSVIModel INFO: Rebuilding chain for T on 2025-09-15 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:42 SSVIModel INFO: Using cached chain data for T on 2025-09-15 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:42 SSVIModel INFO: Rebuilt chain for T on 2025-09-15 00:00:00\n", - "2025-10-19 00:46:42 SSVIModel INFO: Chain with key: T_2025-09-15_discrete_bs already cached.\n", - "2025-10-19 00:46:42 SSVIModel INFO: All models are already fitted for T_2025-09-15_discrete_bs\n", - "2025-10-19 00:46:42 SSVIModel WARNING: Model for otm on T_2025-09-15_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:43 SSVIModel INFO: Rebuilding chain for T on 2025-09-16 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:43 SSVIModel INFO: Using cached chain data for T on 2025-09-16 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:43 SSVIModel INFO: Rebuilt chain for T on 2025-09-16 00:00:00\n", - "2025-10-19 00:46:43 SSVIModel INFO: Chain with key: T_2025-09-16_discrete_bs already cached.\n", - "2025-10-19 00:46:43 SSVIModel INFO: All models are already fitted for T_2025-09-16_discrete_bs\n", - "2025-10-19 00:46:43 SSVIModel WARNING: Model for otm on T_2025-09-16_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:45 SSVIModel INFO: Rebuilding chain for T on 2025-09-17 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:45 SSVIModel INFO: Using cached chain data for T on 2025-09-17 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:45 SSVIModel INFO: Rebuilt chain for T on 2025-09-17 00:00:00\n", - "2025-10-19 00:46:45 SSVIModel INFO: Chain with key: T_2025-09-17_discrete_bs already cached.\n", - "2025-10-19 00:46:45 SSVIModel INFO: All models are already fitted for T_2025-09-17_discrete_bs\n", - "2025-10-19 00:46:45 SSVIModel WARNING: Model for otm on T_2025-09-17_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:46 SSVIModel INFO: Rebuilding chain for T on 2025-09-18 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:46 SSVIModel INFO: Using cached chain data for T on 2025-09-18 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:46 SSVIModel INFO: Rebuilt chain for T on 2025-09-18 00:00:00\n", - "2025-10-19 00:46:46 SSVIModel INFO: Chain with key: T_2025-09-18_discrete_bs already cached.\n", - "2025-10-19 00:46:46 SSVIModel INFO: All models are already fitted for T_2025-09-18_discrete_bs\n", - "2025-10-19 00:46:46 SSVIModel WARNING: Model for otm on T_2025-09-18_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:47 SSVIModel INFO: Rebuilding chain for T on 2025-09-19 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:47 SSVIModel INFO: Using cached chain data for T on 2025-09-19 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:47 SSVIModel INFO: Rebuilt chain for T on 2025-09-19 00:00:00\n", - "2025-10-19 00:46:47 SSVIModel INFO: Chain with key: T_2025-09-19_discrete_bs already cached.\n", - "2025-10-19 00:46:47 SSVIModel INFO: All models are already fitted for T_2025-09-19_discrete_bs\n", - "2025-10-19 00:46:47 SSVIModel WARNING: Model for otm on T_2025-09-19_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:48 SSVIModel INFO: Rebuilding chain for T on 2025-09-22 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:48 SSVIModel INFO: Using cached chain data for T on 2025-09-22 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:48 SSVIModel INFO: Rebuilt chain for T on 2025-09-22 00:00:00\n", - "2025-10-19 00:46:48 SSVIModel INFO: Chain with key: T_2025-09-22_discrete_bs already cached.\n", - "2025-10-19 00:46:48 SSVIModel INFO: All models are already fitted for T_2025-09-22_discrete_bs\n", - "2025-10-19 00:46:48 SSVIModel WARNING: Model for otm on T_2025-09-22_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:48 SSVIModel INFO: Rebuilding chain for T on 2025-09-23 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:48 SSVIModel INFO: Using cached chain data for T on 2025-09-23 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:49 SSVIModel INFO: Rebuilt chain for T on 2025-09-23 00:00:00\n", - "2025-10-19 00:46:49 SSVIModel INFO: Chain with key: T_2025-09-23_discrete_bs already cached.\n", - "2025-10-19 00:46:49 SSVIModel INFO: All models are already fitted for T_2025-09-23_discrete_bs\n", - "2025-10-19 00:46:49 SSVIModel WARNING: Model for otm on T_2025-09-23_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:50 SSVIModel INFO: Rebuilding chain for T on 2025-09-24 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:50 SSVIModel INFO: Using cached chain data for T on 2025-09-24 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:50 SSVIModel INFO: Rebuilt chain for T on 2025-09-24 00:00:00\n", - "2025-10-19 00:46:50 SSVIModel INFO: Chain with key: T_2025-09-24_discrete_bs already cached.\n", - "2025-10-19 00:46:50 SSVIModel INFO: All models are already fitted for T_2025-09-24_discrete_bs\n", - "2025-10-19 00:46:50 SSVIModel WARNING: Model for otm on T_2025-09-24_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:50 SSVIModel INFO: Rebuilding chain for T on 2025-09-25 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:50 SSVIModel INFO: Using cached chain data for T on 2025-09-25 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:50 SSVIModel INFO: Rebuilt chain for T on 2025-09-25 00:00:00\n", - "2025-10-19 00:46:50 SSVIModel INFO: Chain with key: T_2025-09-25_discrete_bs already cached.\n", - "2025-10-19 00:46:50 SSVIModel INFO: All models are already fitted for T_2025-09-25_discrete_bs\n", - "2025-10-19 00:46:50 SSVIModel WARNING: Model for otm on T_2025-09-25_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:51 SSVIModel INFO: Rebuilding chain for T on 2025-09-26 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:51 SSVIModel INFO: Using cached chain data for T on 2025-09-26 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:51 SSVIModel INFO: Rebuilt chain for T on 2025-09-26 00:00:00\n", - "2025-10-19 00:46:51 SSVIModel INFO: Chain with key: T_2025-09-26_discrete_bs already cached.\n", - "2025-10-19 00:46:51 SSVIModel INFO: All models are already fitted for T_2025-09-26_discrete_bs\n", - "2025-10-19 00:46:51 SSVIModel WARNING: Model for otm on T_2025-09-26_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:52 SSVIModel INFO: Rebuilding chain for T on 2025-09-29 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:52 SSVIModel INFO: Using cached chain data for T on 2025-09-29 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:52 SSVIModel INFO: Rebuilt chain for T on 2025-09-29 00:00:00\n", - "2025-10-19 00:46:52 SSVIModel INFO: Chain with key: T_2025-09-29_discrete_bs already cached.\n", - "2025-10-19 00:46:52 SSVIModel INFO: All models are already fitted for T_2025-09-29_discrete_bs\n", - "2025-10-19 00:46:52 SSVIModel WARNING: Model for otm on T_2025-09-29_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:53 SSVIModel INFO: Rebuilding chain for T on 2025-09-30 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:53 SSVIModel INFO: Using cached chain data for T on 2025-09-30 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:53 SSVIModel INFO: Rebuilt chain for T on 2025-09-30 00:00:00\n", - "2025-10-19 00:46:53 SSVIModel INFO: Chain with key: T_2025-09-30_discrete_bs already cached.\n", - "2025-10-19 00:46:53 SSVIModel INFO: All models are already fitted for T_2025-09-30_discrete_bs\n", - "2025-10-19 00:46:53 SSVIModel WARNING: Model for otm on T_2025-09-30_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:54 SSVIModel INFO: Rebuilding chain for T on 2025-10-01 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:54 SSVIModel INFO: Using cached chain data for T on 2025-10-01 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:54 SSVIModel INFO: Rebuilt chain for T on 2025-10-01 00:00:00\n", - "2025-10-19 00:46:54 SSVIModel INFO: Chain with key: T_2025-10-01_discrete_bs already cached.\n", - "2025-10-19 00:46:54 SSVIModel INFO: All models are already fitted for T_2025-10-01_discrete_bs\n", - "2025-10-19 00:46:54 SSVIModel WARNING: Model for otm on T_2025-10-01_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:55 SSVIModel INFO: Rebuilding chain for T on 2025-10-02 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:55 SSVIModel INFO: Using cached chain data for T on 2025-10-02 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:55 SSVIModel INFO: Rebuilt chain for T on 2025-10-02 00:00:00\n", - "2025-10-19 00:46:55 SSVIModel INFO: Chain with key: T_2025-10-02_discrete_bs already cached.\n", - "2025-10-19 00:46:55 SSVIModel INFO: All models are already fitted for T_2025-10-02_discrete_bs\n", - "2025-10-19 00:46:55 SSVIModel WARNING: Model for otm on T_2025-10-02_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:56 SSVIModel INFO: Rebuilding chain for T on 2025-10-03 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:56 SSVIModel INFO: Using cached chain data for T on 2025-10-03 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:56 SSVIModel INFO: Rebuilt chain for T on 2025-10-03 00:00:00\n", - "2025-10-19 00:46:56 SSVIModel INFO: Chain with key: T_2025-10-03_discrete_bs already cached.\n", - "2025-10-19 00:46:56 SSVIModel INFO: All models are already fitted for T_2025-10-03_discrete_bs\n", - "2025-10-19 00:46:56 SSVIModel WARNING: Model for otm on T_2025-10-03_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:57 SSVIModel INFO: Rebuilding chain for T on 2025-10-06 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:57 SSVIModel INFO: Using cached chain data for T on 2025-10-06 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:57 SSVIModel INFO: Rebuilt chain for T on 2025-10-06 00:00:00\n", - "2025-10-19 00:46:57 SSVIModel INFO: Chain with key: T_2025-10-06_discrete_bs already cached.\n", - "2025-10-19 00:46:57 SSVIModel INFO: All models are already fitted for T_2025-10-06_discrete_bs\n", - "2025-10-19 00:46:57 SSVIModel WARNING: Model for otm on T_2025-10-06_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:58 SSVIModel INFO: Rebuilding chain for T on 2025-10-07 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:58 SSVIModel INFO: Using cached chain data for T on 2025-10-07 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:58 SSVIModel INFO: Rebuilt chain for T on 2025-10-07 00:00:00\n", - "2025-10-19 00:46:58 SSVIModel INFO: Chain with key: T_2025-10-07_discrete_bs already cached.\n", - "2025-10-19 00:46:58 SSVIModel INFO: All models are already fitted for T_2025-10-07_discrete_bs\n", - "2025-10-19 00:46:58 SSVIModel WARNING: Model for otm on T_2025-10-07_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:59 SSVIModel INFO: Rebuilding chain for T on 2025-10-08 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:59 SSVIModel INFO: Using cached chain data for T on 2025-10-08 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:46:59 SSVIModel INFO: Rebuilt chain for T on 2025-10-08 00:00:00\n", - "2025-10-19 00:46:59 SSVIModel INFO: Chain with key: T_2025-10-08_discrete_bs already cached.\n", - "2025-10-19 00:46:59 SSVIModel INFO: All models are already fitted for T_2025-10-08_discrete_bs\n", - "2025-10-19 00:46:59 SSVIModel WARNING: Model for otm on T_2025-10-08_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:46:59 SSVIModel INFO: Rebuilding chain for T on 2025-10-09 00:00:00 because config changed or not cached\n", - "2025-10-19 00:46:59 SSVIModel INFO: Using cached chain data for T on 2025-10-09 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:47:00 SSVIModel INFO: Rebuilt chain for T on 2025-10-09 00:00:00\n", - "2025-10-19 00:47:00 SSVIModel INFO: Chain with key: T_2025-10-09_discrete_bs already cached.\n", - "2025-10-19 00:47:00 SSVIModel INFO: All models are already fitted for T_2025-10-09_discrete_bs\n", - "2025-10-19 00:47:00 SSVIModel WARNING: Model for otm on T_2025-10-09_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:47:00 SSVIModel INFO: Rebuilding chain for T on 2025-10-10 00:00:00 because config changed or not cached\n", - "2025-10-19 00:47:00 SSVIModel INFO: Using cached chain data for T on 2025-10-10 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:47:01 SSVIModel INFO: Rebuilt chain for T on 2025-10-10 00:00:00\n", - "2025-10-19 00:47:01 SSVIModel INFO: Chain with key: T_2025-10-10_discrete_bs already cached.\n", - "2025-10-19 00:47:01 SSVIModel INFO: All models are already fitted for T_2025-10-10_discrete_bs\n", - "2025-10-19 00:47:01 SSVIModel WARNING: Model for otm on T_2025-10-10_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:47:01 SSVIModel INFO: Rebuilding chain for T on 2025-10-13 00:00:00 because config changed or not cached\n", - "2025-10-19 00:47:01 SSVIModel INFO: Using cached chain data for T on 2025-10-13 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:47:01 SSVIModel INFO: Rebuilt chain for T on 2025-10-13 00:00:00\n", - "2025-10-19 00:47:01 SSVIModel INFO: Chain with key: T_2025-10-13_discrete_bs already cached.\n", - "2025-10-19 00:47:01 SSVIModel INFO: All models are already fitted for T_2025-10-13_discrete_bs\n", - "2025-10-19 00:47:01 SSVIModel WARNING: Model for otm on T_2025-10-13_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:47:02 SSVIModel INFO: Rebuilding chain for T on 2025-10-14 00:00:00 because config changed or not cached\n", - "2025-10-19 00:47:02 SSVIModel INFO: Using cached chain data for T on 2025-10-14 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:47:02 SSVIModel INFO: Rebuilt chain for T on 2025-10-14 00:00:00\n", - "2025-10-19 00:47:02 SSVIModel INFO: Chain with key: T_2025-10-14_discrete_bs already cached.\n", - "2025-10-19 00:47:02 SSVIModel INFO: All models are already fitted for T_2025-10-14_discrete_bs\n", - "2025-10-19 00:47:03 SSVIModel WARNING: Model for otm on T_2025-10-14_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:47:03 SSVIModel INFO: Rebuilding chain for T on 2025-10-15 00:00:00 because config changed or not cached\n", - "2025-10-19 00:47:03 SSVIModel INFO: Using cached chain data for T on 2025-10-15 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:47:03 SSVIModel INFO: Rebuilt chain for T on 2025-10-15 00:00:00\n", - "2025-10-19 00:47:03 SSVIModel INFO: Chain with key: T_2025-10-15_discrete_bs already cached.\n", - "2025-10-19 00:47:03 SSVIModel INFO: All models are already fitted for T_2025-10-15_discrete_bs\n", - "2025-10-19 00:47:03 SSVIModel WARNING: Model for otm on T_2025-10-15_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:47:04 SSVIModel INFO: Rebuilding chain for T on 2025-10-16 00:00:00 because config changed or not cached\n", - "2025-10-19 00:47:04 SSVIModel INFO: Using cached chain data for T on 2025-10-16 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:47:04 SSVIModel INFO: Rebuilt chain for T on 2025-10-16 00:00:00\n", - "2025-10-19 00:47:04 SSVIModel INFO: Chain with key: T_2025-10-16_discrete_bs already cached.\n", - "2025-10-19 00:47:04 SSVIModel INFO: All models are already fitted for T_2025-10-16_discrete_bs\n", - "2025-10-19 00:47:04 SSVIModel WARNING: Model for otm on T_2025-10-16_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:47:05 SSVIModel INFO: Rebuilding chain for T on 2025-10-17 00:00:00 because config changed or not cached\n", - "2025-10-19 00:47:05 SSVIModel INFO: Using cached chain data for T on 2025-10-17 00:00:00 to rebuild ChainOutput\n", - "2025-10-19 00:47:05 SSVIModel INFO: Rebuilt chain for T on 2025-10-17 00:00:00\n", - "2025-10-19 00:47:05 SSVIModel INFO: Chain with key: T_2025-10-17_discrete_bs already cached.\n", - "2025-10-19 00:47:05 SSVIModel INFO: All models are already fitted for T_2025-10-17_discrete_bs\n", - "2025-10-19 00:47:05 SSVIModel WARNING: Model for otm on T_2025-10-17_discrete_bs not fitted yet. Fitting now...\n", - "2025-10-19 00:47:06 SSVIModel INFO: Skipping non-trading day: 2025-05-26 00:00:00\n", - "2025-10-19 00:47:07 SSVIModel INFO: Skipping non-trading day: 2025-06-19 00:00:00\n", - "2025-10-19 00:47:07 SSVIModel INFO: Skipping non-trading day: 2025-07-04 00:00:00\n", - "2025-10-19 00:47:07 SSVIModel INFO: Skipping non-trading day: 2025-09-01 00:00:00\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
volfwd
Datetimestrikeexp
2025-05-0121.6600481y0.36704627.248722
2025-05-0221.6365401y0.31853727.213483
2025-05-0521.5581741y0.31429727.108054
2025-05-0622.0675451y0.35386027.768928
2025-05-0722.0205281y0.35702227.704981
...............
2025-10-1320.4720001y0.30347025.626408
2025-10-1420.9039991y0.33303526.182849
2025-10-1520.8560001y0.32326526.115714
2025-10-1620.9620001y0.35812226.249982
2025-10-1721.0720001y0.32938226.386768
\n", - "

118 rows × 2 columns

\n", - "
" - ], - "text/plain": [ - " vol fwd\n", - "Datetime strike exp \n", - "2025-05-01 21.660048 1y 0.367046 27.248722\n", - "2025-05-02 21.636540 1y 0.318537 27.213483\n", - "2025-05-05 21.558174 1y 0.314297 27.108054\n", - "2025-05-06 22.067545 1y 0.353860 27.768928\n", - "2025-05-07 22.020528 1y 0.357022 27.704981\n", - "... ... ...\n", - "2025-10-13 20.472000 1y 0.303470 25.626408\n", - "2025-10-14 20.903999 1y 0.333035 26.182849\n", - "2025-10-15 20.856000 1y 0.323265 26.115714\n", - "2025-10-16 20.962000 1y 0.358122 26.249982\n", - "2025-10-17 21.072000 1y 0.329382 26.386768\n", - "\n", - "[118 rows x 2 columns]" - ] - }, - "execution_count": 52, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "vols_09 = ts.predict(strike_type='p', start_date = '2025-05-01', exp = ['1y'], k = [0.8])\n", - "vols_1 = ts.predict(strike_type='p', start_date = '2025-05-01', exp = ['1y'], k = [1.])\n", - "vols_09" - ] - }, - { - "cell_type": "code", - "execution_count": 53, - "id": "a6851fc1", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
volfwd
Datetimeexp
2025-05-011y0.0616660.0
2025-05-021y0.0952820.0
2025-05-051y0.0901150.0
2025-05-061y0.0668250.0
2025-05-071y0.0644790.0
............
2025-10-131y0.0467310.0
2025-10-141y0.0526000.0
2025-10-151y0.0734030.0
2025-10-161y0.1020750.0
2025-10-171y0.0735480.0
\n", - "

118 rows × 2 columns

\n", - "
" - ], - "text/plain": [ - " vol fwd\n", - "Datetime exp \n", - "2025-05-01 1y 0.061666 0.0\n", - "2025-05-02 1y 0.095282 0.0\n", - "2025-05-05 1y 0.090115 0.0\n", - "2025-05-06 1y 0.066825 0.0\n", - "2025-05-07 1y 0.064479 0.0\n", - "... ... ...\n", - "2025-10-13 1y 0.046731 0.0\n", - "2025-10-14 1y 0.052600 0.0\n", - "2025-10-15 1y 0.073403 0.0\n", - "2025-10-16 1y 0.102075 0.0\n", - "2025-10-17 1y 0.073548 0.0\n", - "\n", - "[118 rows x 2 columns]" - ] - }, - "execution_count": 53, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "skew = vols_09.droplevel('strike') - vols_1.droplevel('strike')\n", - "skew" - ] - }, - { - "cell_type": "code", - "execution_count": 54, - "id": "3a765362", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 54, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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au6hAAAmTZqEt99+G7Nnz8att95qON3u3buxbNkytG3bFhdffHGjj+vvf/87Hn74YbhcLowYMQInnXQSnE4nfv/9d3zzzTeYP38+br31VrhctmSDbT755BMwxjB37lz079+/UddFEHELs8F///tfBoCdeuqprKysLOzz6upq9tVXX6neW758OQPAhgwZEja91+tlp59+OgPA5syZo/psyJAhDABbvny54Xiuu+463XlrampYt27dmMPhYF9//bX8fnFxMcvLy2NJSUls48aNEbeXMcb27dvHXnzxRVZVVRU29osuuogBYJMnTw6b7/zzz2cA2PPPP696/6677mIA2E033aR6/4MPPlCNlbN582aWmZnJALB169apPuP7dsqUKZa2JRKlpaVs2bJlrKSkhDEW2r9ffPGF4Txvv/02A8D69+/Pamtr5ffXrFnDPB4Py83NZRUVFZbHsHLlSgaAdenShZWWlsrv79q1i+Xk5LCkpCS2a9cuS8v6z3/+wwCwsWPHWl4/32ar64iWL7/8kn300UcsEAio3i8qKmIdO3ZkANj8+fNVn5WXl7Pc3Fzm8XjY2rVr5fdra2vZ2WefzQCwd955RzXP888/z7Zv3x62/v/9738MAGvZsiXzer2qz6ZMmRLx3LPD1q1b2Q8//MBqamoYY4zl5+czAMzn8xnO85e//IUBYHfffbfq/X/9618MALvgggtsjeGnn35i69evl7cVAGvfvr3pPHbPYTO+/PJL5nQ6WXJyMnv//ffDPt+0aRMrKChgANjjjz9uuiy+/8yOUX4cjxkzhgFgH3/8cdg0mzdvls8Po2t0Q8bQHDTV+auHnX3YtWtXBoD9+OOPhtP83//9HwPAHnrooajGw39DrbB7927mdDpZZmYm++WXX8I+DwQCbOnSpSwYDEY1Fjtcf/31cXlsNSZz5szR1TJWiKQDGrJsovmwJc5vueUWBoA999xzlucxE+eMMXb33XczAOyf//yn6v2GiHPGGFu7di1zuVwsPz+flZeXM8aY/CP07LPPWh6/GVxInnLKKar3d+zYwQCwgoKCMPFVUVHB0tLSWGpqapjgN2LSpEkMAHvmmWdU78danGuxIs4HDRrEAITdlDHG2J/+9CcGgL3++uuW12k2zyOPPMIAsEcffdTSsk477TQGgC1dutTS9AB0/+Xn56um27ZtG/vTn/7E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rLCwkHk8HvbAAw+EzdfQyDlj4h3zmWeeyQCwpKQklp2dzfbs2WNnk025+eabGYCw8d977726kW7ObbfdxgCwl156KeI6ysvLWZs2bZggCGF3uHzf6v279NJLw+7Q7RIpcr5p0ybdJwectWvXMgCsX79+ltZXVVXFALD09HTdz4uLixkA1rp164jL4raIadOmWVo3x+yxeDAYZN26dWMA2P/+9z/VZ/PmzWMA2EknnWQrwqLF5/OxU045RTfi37dvX91IN6dHjx4MgGEkRMn3338vR4/9fr/qMx451/5LSkpi//d//9fgR9uRIuezZs3SfXLA4VHH+++/P+ox8G03Ipbn8OOPP84AsPHjx0ec9pVXXmEA2DnnnGM4jZ3I+RdffMG+++47BoD9/e9/lz9/55135ON4+/btMY2cA6LlR3kezJ07lwFgLVq0YKNGjVJFOb/99lsGiBYcJcpIqja6NXPmTAaADR8+XHe7rUTO+bTTp09XvV9bW8suuOACJggC++mnn+T333rrLQaAnXXWWarxl5SUsM6dO9veh1dccYXh79cll1wiP/lgTLSdeDwelpGRwbZs2aKalj/RnjRpkup9O5Hzqqoq+TsdNGgQe+2119imTZvCrg1KGhI5FwSBLVmyRHc+s2vw77//rnv94RagefPmqd5/8MEHGQB28cUXq6KdjInR18OHD8uv+XVv8uTJqu32+/1s4sSJDABbuHCh7pi17N69W3ffzZ49mwFgTz31lOr9prC1OJ1OtmzZMtVnDzzwgO45YPfciEQsrwt///vfGQA2cuRI1W/IoUOH5GN45cqV8vv8/AfApk6dqlrW0qVL5WUp4fts7Nixsh2Tw4+TmTNnyu9xrXPppZeGbTuf/pVXXrGyq2RsiXPGxMdfeXl5qh/tnJwcNmbMGPbRRx+FTW8mIAGwESNGsO+//z5svliIc+36//3vf9vdXEMWLVrEBEFgHTp0CBPB3Iby6quv6s770EMPhf1Y6hEMBtnll1/OALBbb7017PNNmzaxp556im3cuJFVVlay4uJitmTJEtanTx8GgA0YMKBBQjGSOOe2ngEDBuh+vm3bNgaAde3a1dL69u/fbyqa6uvrGQDm8XhMl1NZWckyMjKYy+ViRUVFltbNMfthWLFiBQPAzj77bN15Bw4cyACwb775xtY6ldxzzz0MALvwwgvDPuM2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FFpaWmrYQOzcc89lLpeLtWnThmVnZ+seS1aw5TlfvXo1/vWvfyEvLw8DBw6U66/u2rULn3zyCWprazF69GhcdtllYfPu3r1blVxQWlqKVatW4ccff0RKSor82IxTWFiIf/3rX7jjjjtwxhln4OKLL0bXrl1RV1eHb775Bj/++CPatWsnRxo43377LZ599ll07doVTz/9dNg4XnzxRXzzzTd4/PHHcdFFF0WMuvz2228YPXo06urqcOGFF2LRokVYtGhR2HTaxImXXnoJ/fv3xx133IEvv/wSJ598MlavXo3ly5eja9eumDZtmmr6xx9/HLNnz0ZKSgp69+6Np556Kmwd2uTNyy67DC6XC3379kWHDh1QV1eHtWvXYs2aNXC5XHj55ZdtP1q69957ZbsQjxA9/fTT+N///gdATPRTjuGqq67Chx9+iPnz56NPnz64+OKLUVJSgnfffReBQACvvvoqMjMzLa+/f//+uPvuuzFjxgz06tULl112Gerr6/Huu++itLQUL7zwguE2zZs3DxUVFQ1KBD3nnHPw9NNPY9KkSbj00kuRkZGB7OxsTJ48GYIg4M0338R5552HK6+8Um7p/ttvv2HhwoXIyMjA3LlzDXMglLz55pt49NFH4XQ6MWjQIDz//PNh0xQUFKjsIZmZmXj11Vdx2WWXYejQobjqqquQk5ODjz76CL/99hsuu+wyXHnllapljBs3DuvWrUOXLl0QDAZ1E3yUyZslJSU4+eST0bdvX5x88slo27YtiouLsXz5cuzatQutWrXCO++8Y2kbOUeOHMG9996reg0AN9xwg/x044EHHlAl+Pz973/H119/jRkzZmDDhg3o168ftmzZgkWLFqF169Z48cUXLa8fEJPDtOfU0aNHVfv3mWeeUdX6tXsOm3HeeefhrbfewsSJEzFu3Dj069cPAwYMgMfjwa+//orPPvsMPp8P9913Hx555BFb22YVQRBwySWXNMqyG5OLL74YY8eOxdixY1FYWIgNGzZgyZIlyMnJwUsvvRT1cmfNmoXt27fj0UcfxX//+18MHDgQbdq0wYEDB7BlyxasXbsW77zzjvw7d/XVV+Pdd9/FRx99hFNOOQWjR4+Gz+fD/PnzccYZZ+D333+Pahznn38+CgoKsGbNGgDA5MmT4fF4VNMUFBRg5syZuO2223DaaafhiiuuQG5uLr75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eGFUj+Zll12GN954Ay+88AImT56MmpqaMH9kd3c36uvrlccNDQ04ePAgNm7ciI8//njAzdnrr7+O4uJiJVnqiy++wMaNG3HFFVco60yfPh3Lli1DZWUlqqqq8Oqrr6Knpwe1tbX46KOP0nbOnE4nLr30UqxevRpFRUUYPHgwNmzYAACKWNHivffeg9VqxciRI2G32/HNN99gxYoVOP/88xWheuWVV2LRokXYuHEjzjjjDGzfvh3ffPMNioqK8Pnnn6ftnAlqamrQ0NCg5CbEYtu2bVi2bBnmzZuHMWPGKPssjhkAPvvsMwCSeKqvr8ff//53lJWV4cCBA9ixY0faztnYsWORk5ODpUuXYubMmXA4HNi6dSsaGhqiXqTU1NSguroaV1xxBc477zxln202m/KZFt95zz33HKZNm4b6+nqsXbsWV1xxRdr/DgDS99PYsWORmZmJnTt34oUXXsCcOXPCfPJG5s3hcIQlfIvxjCSCE0QqwLi470OkPOrENDV33HGH0pBHNJ/Yvn07vF5vWPOJ1atXY82aNWFjDB48GMuWLQMg1andsmULmpubkZGRgfLyclx33XVRG2sAgeYTW7ZsQWdnJ8aNG4dbbrlF8S3u378fzzzzDI4cOQKPx4OSkhJcdNFFmD59elg1h1B2796N559/HocPH9ZsQhStiYoW/X3OXnvtNWzZsgUNDQ2wWCwoLS3FlClTMHXq1KBI3+uvv44NGzYoFU1+8pOf4De/+U1azxkgRcpXrFiB9957D263G1VVVZg3b16QrzeUHTt2YP369airqwPnHIMHD8aFF16Iq666KujW+vvvv4+XXnoJjY2NGDp0KG666SY88sgjaT9nAPDkk0+iqalJqYcdi0WLFmHPnj1hyy+++GLceeedAKR5XblyJY4dO4acnByce+65uPHGGzFv3jzNMdNpzr755hu89NJL+Oabb+Dz+TB8+HDMnDkTp59+esRxly1bhn/+859hy0866SQsWrRIeSwuxA8ePIjCwkJMnjwZM2bMUCoupfO8LV26FJ988gm6u7tRVlaG73//+7jooouijqt33kJf09HRQU2IiLSDxDlBEARBEARBpAjG0vgJgiAIgiAIgkgaJM4JgiAIgiAIIkUgcU4QBEEQBEEQKQKJc4IgCIIgCIJIEUicEwRBEARBEESKQOKcIAiCIAiCIFIEEucEQRAEQRAEkSKQOCcIgiAIgiCIFMHW1ztAEAQxkHnnnXfwpz/9SXlst9uRk5ODkSNH4vTTT8fkyZORlZVleNy9e/fi888/x1VXXRW1LTpBEASRWpA4JwiCSAFmz56NkpIS+Hw+uFwu7NmzB88//zw2b96MBQsWoLy83NB4e/fuxZo1a3DJJZeQOCcIgkgjSJwTBEGkAKeffjpGjx6tPL722mtRU1ODRx55BI8++iieeOIJOByOPtxDgiAIojcgcU4QBJGinHLKKbjuuuuwcuVKvPvuu5g6dSq+/fZbbNq0CV988QVaWlrgdDpx+umn40c/+hEGDRoEAFi9ejXWrFkDALjrrruU8ZYuXYqSkhIAwLvvvovNmzfj8OHDcDgcOPXUU/HDH/4QxcXFvX+gBEEQhAKJc4IgiBTmoosuwsqVK7Fz505MnToVO3fuRENDAy655BLk5+fj8OHD2LJlCw4fPowlS5aAMYZzzz0XdXV12L59O+bOnauI9tzcXADAK6+8glWrVuH888/HlClT0NbWhtdeew0PPPAAHn30UbLBEARB9CEkzgmCIFKYoqIiOJ1OHD16FABw+eWX4/vf/37QOmPGjMGTTz6JL7/8EieeeCLKy8sxatQobN++HWeffbYSLQeAxsZGrF69Gtdffz1+8IMfKMvPOecc/OpXv8Ibb7wRtJwgCILoXaiUIkEQRIqTmZmJrq4uAAjynbvdbrS1tWHMmDEAgAMHDsQc64MPPgDnHBdccAHa2tqUf/n5+SgtLcXu3buTcxAEQRCELihyThAEkeJ0d3cjLy8PANDe3o5//OMf2LFjB1pbW4PW6+zsjDlWfX09OOe4++67NZ+32ehngSAIoi+hb2GCIIgU5tixY+js7MSQIUMAAE888QT27t2Lq6++GhUVFcjMzITf78fDDz8Mv98fczy/3w/GGO69915YLOE3TzMzM00/BoIgCEI/JM4JgiBSmHfffRcAcNppp6G9vR27du3C7NmzMXPmTGWdurq6sNcxxjTHKy0tBeccJSUlGDZsWHJ2miAIgogb8pwTBEGkKDU1NXj55ZdRUlKCSZMmKZFuznnQeps3bw57bUZGBoBwq8s555wDi8WCNWvWhI3DOcfx48fNPASCIAjCIBQ5JwiCSAE+/fRTHDlyBH6/Hy6XC7t378bOnTtRXFyMBQsWwOFwwOFw4MQTT8SGDRvg8/lQWFiIzz//HA0NDWHjVVZWAgBWrlyJiRMnwmq14swzz0RpaSluuOEGrFixAo2NjTj77LORmZmJhoYGfPTRR5gyZQquvvrq3j58giAIQobx0NAJQRAE0Wu88847+NOf/qQ8ttlsyMnJwciRI3HGGWdg8uTJyMrKUp5vbm7Gs88+i927d4NzjgkTJuAnP/kJbrvtNsycOROzZ89W1n355Zfx5ptvoqWlBZzzoCZEH3zwATZv3qxUeCkuLsYpp5yCK664guwuBEEQfQiJc4IgCIIgCIJIEchzThAEQRAEQRApAolzgiAIgiAIgkgRSJwTBEEQBEEQRIpA4pwgCIIgCIIgUgQS5wRBEARBEASRIpA4JwiCIAiCIIgUgcQ5QRAEQRAEQaQIJM4JgiAIgiAIIkUgcU4QBEEQBEEQKQKJc4IgCIIgCIJIEUicEwRBEARBEESKQOKcIAiCIAiCIFIEEucEQRAEQRAEkSL8f66H5TMY++DQAAAAAElFTkSuQmCC", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "vols_1.droplevel('strike').reset_index().plot(y='vol',\n", - " x = 'Datetime',\n", - " title='SBUX 2025-10-07 to 2025-10-10 OTM Implied Vol Surface at-the-money', \n", - " ylabel='Implied Volatility', \n", - " xlabel='Date')" - ] - }, - { - "cell_type": "code", - "execution_count": 55, - "id": "234b504e", - "metadata": {}, - "outputs": [], - "source": [ - "v_cols = ['spot', 'strike', 'f_log_moneyness', 'right', 'vol', 'moneyness', 'f']" - ] - }, - { - "cell_type": "code", - "execution_count": 56, - "id": "8610fdc8", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
spotstrikef_log_moneynessrightvolmoneynessf
datetime
2025-10-1325.5924.0-0.063349c0.3121960.93786625.569563
2025-10-1325.5924.0-0.063349p0.2622040.93786625.569563
2025-10-1325.5925.0-0.022527p0.2559550.97694425.569563
2025-10-1325.5925.0-0.022527c0.2850750.97694425.569563
2025-10-1325.5926.00.016694c0.2713281.01602225.569563
\n", - "
" - ], - "text/plain": [ - " spot strike f_log_moneyness right vol moneyness \\\n", - "datetime \n", - "2025-10-13 25.59 24.0 -0.063349 c 0.312196 0.937866 \n", - "2025-10-13 25.59 24.0 -0.063349 p 0.262204 0.937866 \n", - "2025-10-13 25.59 25.0 -0.022527 p 0.255955 0.976944 \n", - "2025-10-13 25.59 25.0 -0.022527 c 0.285075 0.976944 \n", - "2025-10-13 25.59 26.0 0.016694 c 0.271328 1.016022 \n", - "\n", - " f \n", - "datetime \n", - "2025-10-13 25.569563 \n", - "2025-10-13 25.569563 \n", - "2025-10-13 25.569563 \n", - "2025-10-13 25.569563 \n", - "2025-10-13 25.569563 " - ] - }, - "execution_count": 56, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_chain = ts._model_set['2025-10-13'].chain.chain.copy()\n", - "\n", - "\n", - "clip = df_chain[(df_chain['dte']==95) & \n", - " (df_chain['f_log_moneyness'].between(-0.1, 0.1))\n", - " ].head(5)[v_cols].copy().sort_values('strike')\n", - "\n", - "clip" - ] - }, - { - "cell_type": "code", - "execution_count": 57, - "id": "d78ff4a1", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
spotstrikef_log_moneynessrightvolmoneynessf
datetime
2025-10-1025.87000124.0-0.085368p0.2910740.92771526.138831
2025-10-1025.87000124.0-0.085368c0.2744520.92771526.138831
2025-10-1025.87000125.0-0.044546p0.2804510.96637026.138831
2025-10-1025.87000125.0-0.044546c0.2538310.96637026.138831
2025-10-1025.87000126.0-0.005325p0.2764521.00502526.138831
\n", - "
" - ], - "text/plain": [ - " spot strike f_log_moneyness right vol moneyness \\\n", - "datetime \n", - "2025-10-10 25.870001 24.0 -0.085368 p 0.291074 0.927715 \n", - "2025-10-10 25.870001 24.0 -0.085368 c 0.274452 0.927715 \n", - "2025-10-10 25.870001 25.0 -0.044546 p 0.280451 0.966370 \n", - "2025-10-10 25.870001 25.0 -0.044546 c 0.253831 0.966370 \n", - "2025-10-10 25.870001 26.0 -0.005325 p 0.276452 1.005025 \n", - "\n", - " f \n", - "datetime \n", - "2025-10-10 26.138831 \n", - "2025-10-10 26.138831 \n", - "2025-10-10 26.138831 \n", - "2025-10-10 26.138831 \n", - "2025-10-10 26.138831 " - ] - }, - "execution_count": 57, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_chain = ts._model_set['2025-10-10'].chain.chain.copy()\n", - "clip_2 = df_chain[(df_chain['dte']==98) & \n", - " (df_chain['f_log_moneyness'].between(-0.1, 0.1))\n", - " ].head(5)[v_cols].copy().sort_values('strike')\n", - "\n", - "clip_2" - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "id": "1d40573a", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{('T', '2025-05-01'): ,\n", - " ('T', '2025-05-02'): ,\n", - " ('T', '2025-05-05'): ,\n", - " ('T', '2025-05-06'): ,\n", - " ('T', '2025-05-07'): ,\n", - " ('T', '2025-05-08'): ,\n", - " ('T', '2025-05-09'): ,\n", - " ('T', '2025-05-12'): ,\n", - " ('T', '2025-05-13'): ,\n", - " ('T', '2025-05-14'): ,\n", - " ('T', '2025-05-15'): ,\n", - " ('T', '2025-05-16'): ,\n", - " ('T', '2025-05-19'): ,\n", - " ('T', '2025-05-20'): ,\n", - " ('T', '2025-05-21'): ,\n", - " ('T', '2025-05-22'): ,\n", - " ('T', '2025-05-23'): ,\n", - " ('T', '2025-05-27'): ,\n", - " ('T', '2025-05-28'): ,\n", - " ('T', '2025-05-29'): ,\n", - " ('T', '2025-05-30'): ,\n", - " ('T', '2025-06-02'): ,\n", - " ('T', '2025-06-03'): ,\n", - " ('T', '2025-06-04'): ,\n", - " ('T', '2025-06-05'): ,\n", - " ('T', '2025-06-06'): ,\n", - " ('T', '2025-06-09'): ,\n", - " ('T', '2025-06-10'): ,\n", - " ('T', '2025-06-11'): ,\n", - " ('T', '2025-06-12'): ,\n", - " ('T', '2025-06-13'): ,\n", - " ('T', '2025-06-16'): ,\n", - " ('T', '2025-06-17'): ,\n", - " ('T', '2025-06-18'): ,\n", - " ('T', '2025-06-20'): ,\n", - " ('T', '2025-06-23'): ,\n", - " ('T', '2025-06-24'): ,\n", - " ('T', '2025-06-25'): ,\n", - " ('T', '2025-06-26'): ,\n", - " ('T', '2025-06-27'): ,\n", - " ('T', '2025-06-30'): ,\n", - " ('T', '2025-07-01'): ,\n", - " ('T', '2025-07-02'): ,\n", - " ('T', '2025-07-03'): ,\n", - " ('T', '2025-07-07'): ,\n", - " ('T', '2025-07-08'): ,\n", - " ('T', '2025-07-09'): ,\n", - " ('T', '2025-07-10'): ,\n", - " ('T', '2025-07-11'): ,\n", - " ('T', '2025-07-14'): ,\n", - " ('T', '2025-07-15'): ,\n", - " ('T', '2025-07-16'): ,\n", - " ('T', '2025-07-17'): ,\n", - " ('T', '2025-07-18'): ,\n", - " ('T', '2025-07-21'): ,\n", - " ('T', '2025-07-22'): ,\n", - " ('T', '2025-07-23'): ,\n", - " ('T', '2025-07-24'): ,\n", - " ('T', '2025-07-25'): ,\n", - " ('T', '2025-07-28'): ,\n", - " ('T', '2025-07-29'): ,\n", - " ('T', '2025-07-30'): ,\n", - " ('T', '2025-07-31'): ,\n", - " ('T', '2025-08-01'): ,\n", - " ('T', '2025-08-04'): ,\n", - " ('T', '2025-08-05'): ,\n", - " ('T', '2025-08-06'): ,\n", - " ('T', '2025-08-07'): ,\n", - " ('T', '2025-08-08'): ,\n", - " ('T', '2025-08-11'): ,\n", - " ('T', '2025-08-12'): ,\n", - " ('T', '2025-08-13'): ,\n", - " ('T', '2025-08-14'): ,\n", - " ('T', '2025-08-15'): ,\n", - " ('T', '2025-08-18'): ,\n", - " ('T', '2025-08-19'): ,\n", - " ('T', '2025-08-20'): ,\n", - " ('T', '2025-08-21'): ,\n", - " ('T', '2025-08-22'): ,\n", - " ('T', '2025-08-25'): ,\n", - " ('T', '2025-08-26'): ,\n", - " ('T', '2025-08-27'): ,\n", - " ('T', '2025-08-28'): ,\n", - " ('T', '2025-08-29'): ,\n", - " ('T', '2025-09-02'): ,\n", - " ('T', '2025-09-03'): ,\n", - " ('T', '2025-09-04'): ,\n", - " ('T', '2025-09-05'): ,\n", - " ('T', '2025-09-08'): ,\n", - " ('T', '2025-09-09'): ,\n", - " ('T', '2025-09-10'): ,\n", - " ('T', '2025-09-11'): ,\n", - " ('T', '2025-09-12'): ,\n", - " ('T', '2025-09-15'): ,\n", - " ('T', '2025-09-16'): ,\n", - " ('T', '2025-09-17'): ,\n", - " ('T', '2025-09-18'): ,\n", - " ('T', '2025-09-19'): ,\n", - " ('T', '2025-09-22'): ,\n", - " ('T', '2025-09-23'): ,\n", - " ('T', '2025-09-24'): ,\n", - " ('T', '2025-09-25'): ,\n", - " ('T', '2025-09-26'): ,\n", - " ('T', '2025-09-29'): ,\n", - " ('T', '2025-09-30'): ,\n", - " ('T', '2025-10-01'): ,\n", - " ('T', '2025-10-02'): ,\n", - " ('T', '2025-10-03'): ,\n", - " ('T', '2025-10-06'): ,\n", - " ('T', '2025-10-07'): ,\n", - " ('T', '2025-10-08'): ,\n", - " ('T', '2025-10-09'): ,\n", - " ('T', '2025-10-10'): ,\n", - " ('T', '2025-10-13'): ,\n", - " ('T', '2025-10-14'): ,\n", - " ('T', '2025-10-15'): ,\n", - " ('T', '2025-10-16'): ,\n", - " ('T', '2025-10-17'): }" - ] - }, - "execution_count": 58, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "EODMarketSSVIModel.instances()" - ] - }, - { - "cell_type": "code", - "execution_count": 59, - "id": "df75f8eb", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2025-10-19 00:47:10 SSVIModel INFO: Using cached instance for T on 2025-10-16\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
rootexpirationstrikerightbid_sizeclosebidask_sizecloseaskdatemidpoint...fdiv_pvf_moneynessf_log_moneynessintrinsic_valueeu_lower_boundlower_boundupper_boundvolconfig_hash
datetime
2025-10-16T2026-01-1629.0c3500.4614620.48202510160.470...26.1801900.2754861.1077080.1022930.0000000.0000000.00000026.2024990.2674535d2f204cca67fbf759fec9dbf0f9dbe6e6fb941e004328...
2025-10-16T2026-01-1629.0p14733.001393.25202510163.125...26.1801900.2754861.1077080.1022932.8198102.7925412.79254129.0000000.2322105d2f204cca67fbf759fec9dbf0f9dbe6e6fb941e004328...
2025-10-16T2026-01-1634.0c25490.0323740.13202510160.080...26.1801900.2754861.2986920.2613570.0000000.0000000.00000026.2024990.3041975d2f204cca67fbf759fec9dbf0f9dbe6e6fb941e004328...
2025-10-16T2026-01-1618.0c5718.054808.80202510168.425...26.1801900.2754860.687543-0.3746318.1801908.1010838.10108326.2024990.5973965d2f204cca67fbf759fec9dbf0f9dbe6e6fb941e004328...
2025-10-16T2026-01-1618.0p13430.0118270.15202510160.080...26.1801900.2754860.687543-0.3746310.0000000.0000000.00000018.0000000.4327995d2f204cca67fbf759fec9dbf0f9dbe6e6fb941e004328...
..................................................................
2025-10-16T2026-06-1825.0p12061.5532501.74202510161.645...26.3266870.5483660.949607-0.0517070.0000000.0000000.00000025.0000000.2738275d2f204cca67fbf759fec9dbf0f9dbe6e6fb941e004328...
2025-10-16T2026-06-1830.0c7020.896080.96202510160.925...26.3266870.5483661.1395280.1306140.0000000.0000000.00000026.2024990.2553305d2f204cca67fbf759fec9dbf0f9dbe6e6fb941e004328...
2025-10-16T2026-06-1818.0c7628.408518.95202510168.675...26.3266870.5483660.683717-0.3802118.3266878.1139708.11397026.2024990.4385485d2f204cca67fbf759fec9dbf0f9dbe6e6fb941e004328...
2025-10-16T2026-06-1830.0p8194.456264.65202510164.550...26.3266870.5483661.1395280.1306143.6733133.5794723.57947230.0000000.2614545d2f204cca67fbf759fec9dbf0f9dbe6e6fb941e004328...
2025-10-16T2026-06-1818.0p20820.198960.30202510160.245...26.3266870.5483660.683717-0.3802110.0000000.0000000.00000018.0000000.3446905d2f204cca67fbf759fec9dbf0f9dbe6e6fb941e004328...
\n", - "

401 rows × 29 columns

\n", - "
" - ], - "text/plain": [ - " root expiration strike right bid_size closebid ask_size \\\n", - "datetime \n", - "2025-10-16 T 2026-01-16 29.0 c 350 0.46 1462 \n", - "2025-10-16 T 2026-01-16 29.0 p 1473 3.00 139 \n", - "2025-10-16 T 2026-01-16 34.0 c 2549 0.03 2374 \n", - "2025-10-16 T 2026-01-16 18.0 c 571 8.05 480 \n", - "2025-10-16 T 2026-01-16 18.0 p 1343 0.01 1827 \n", - "... ... ... ... ... ... ... ... \n", - "2025-10-16 T 2026-06-18 25.0 p 1206 1.55 3250 \n", - "2025-10-16 T 2026-06-18 30.0 c 702 0.89 608 \n", - "2025-10-16 T 2026-06-18 18.0 c 762 8.40 851 \n", - "2025-10-16 T 2026-06-18 30.0 p 819 4.45 626 \n", - "2025-10-16 T 2026-06-18 18.0 p 2082 0.19 896 \n", - "\n", - " closeask date midpoint ... f div_pv \\\n", - "datetime ... \n", - "2025-10-16 0.48 20251016 0.470 ... 26.180190 0.275486 \n", - "2025-10-16 3.25 20251016 3.125 ... 26.180190 0.275486 \n", - "2025-10-16 0.13 20251016 0.080 ... 26.180190 0.275486 \n", - "2025-10-16 8.80 20251016 8.425 ... 26.180190 0.275486 \n", - "2025-10-16 0.15 20251016 0.080 ... 26.180190 0.275486 \n", - "... ... ... ... ... ... ... \n", - "2025-10-16 1.74 20251016 1.645 ... 26.326687 0.548366 \n", - "2025-10-16 0.96 20251016 0.925 ... 26.326687 0.548366 \n", - "2025-10-16 8.95 20251016 8.675 ... 26.326687 0.548366 \n", - "2025-10-16 4.65 20251016 4.550 ... 26.326687 0.548366 \n", - "2025-10-16 0.30 20251016 0.245 ... 26.326687 0.548366 \n", - "\n", - " f_moneyness f_log_moneyness intrinsic_value eu_lower_bound \\\n", - "datetime \n", - "2025-10-16 1.107708 0.102293 0.000000 0.000000 \n", - "2025-10-16 1.107708 0.102293 2.819810 2.792541 \n", - "2025-10-16 1.298692 0.261357 0.000000 0.000000 \n", - "2025-10-16 0.687543 -0.374631 8.180190 8.101083 \n", - "2025-10-16 0.687543 -0.374631 0.000000 0.000000 \n", - "... ... ... ... ... \n", - "2025-10-16 0.949607 -0.051707 0.000000 0.000000 \n", - "2025-10-16 1.139528 0.130614 0.000000 0.000000 \n", - "2025-10-16 0.683717 -0.380211 8.326687 8.113970 \n", - "2025-10-16 1.139528 0.130614 3.673313 3.579472 \n", - "2025-10-16 0.683717 -0.380211 0.000000 0.000000 \n", - "\n", - " lower_bound upper_bound vol \\\n", - "datetime \n", - "2025-10-16 0.000000 26.202499 0.267453 \n", - "2025-10-16 2.792541 29.000000 0.232210 \n", - "2025-10-16 0.000000 26.202499 0.304197 \n", - "2025-10-16 8.101083 26.202499 0.597396 \n", - "2025-10-16 0.000000 18.000000 0.432799 \n", - "... ... ... ... \n", - "2025-10-16 0.000000 25.000000 0.273827 \n", - "2025-10-16 0.000000 26.202499 0.255330 \n", - "2025-10-16 8.113970 26.202499 0.438548 \n", - "2025-10-16 3.579472 30.000000 0.261454 \n", - "2025-10-16 0.000000 18.000000 0.344690 \n", - "\n", - " config_hash \n", - "datetime \n", - "2025-10-16 5d2f204cca67fbf759fec9dbf0f9dbe6e6fb941e004328... \n", - "2025-10-16 5d2f204cca67fbf759fec9dbf0f9dbe6e6fb941e004328... \n", - "2025-10-16 5d2f204cca67fbf759fec9dbf0f9dbe6e6fb941e004328... \n", - "2025-10-16 5d2f204cca67fbf759fec9dbf0f9dbe6e6fb941e004328... \n", - "2025-10-16 5d2f204cca67fbf759fec9dbf0f9dbe6e6fb941e004328... \n", - "... ... \n", - "2025-10-16 5d2f204cca67fbf759fec9dbf0f9dbe6e6fb941e004328... \n", - "2025-10-16 5d2f204cca67fbf759fec9dbf0f9dbe6e6fb941e004328... \n", - "2025-10-16 5d2f204cca67fbf759fec9dbf0f9dbe6e6fb941e004328... \n", - "2025-10-16 5d2f204cca67fbf759fec9dbf0f9dbe6e6fb941e004328... \n", - "2025-10-16 5d2f204cca67fbf759fec9dbf0f9dbe6e6fb941e004328... \n", - "\n", - "[401 rows x 29 columns]" - ] - }, - "execution_count": 59, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "GLOBAL_BACKGROUND_FITS.status()\n", - "# PARAMS_DUMP_CACHE.keys()\n", - "EODMarketSSVIModel(\n", - " symbol='T',\n", - " valuation_date='2025-10-16'\n", - ").chain.chain" - ] - }, - { - "cell_type": "code", - "execution_count": 60, - "id": "2ccec2bc", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The autoreload extension is already loaded. To reload it, use:\n", - " %reload_ext autoreload\n", - "\n", - "\n", - "Scheduled Data Requests will be saved to: /Users/chiemelienwanisobi/cloned_repos/QuantTools/module_test/raw_code/DataManagers/scheduler/requests.jsonl\n", - "2025-10-19 00:47:12 DataManager.py CRITICAL: Using ProcessSaveManager for saving data.\n", - "[get_engine] Creating engine for DB: portfolio_data, PID: 25839\n" - ] - }, - { - "data": { - "text/html": [ - " \n", - "
\n", - " \n", - " Loading BokehJS ...\n", - "
\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/javascript": "'use strict';\n(function(root) {\n function now() {\n return new Date();\n }\n\n const force = true;\n\n if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n root._bokeh_onload_callbacks = [];\n root._bokeh_is_loading = undefined;\n }\n\nconst JS_MIME_TYPE = 'application/javascript';\n const HTML_MIME_TYPE = 'text/html';\n const EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n const CLASS_NAME = 'output_bokeh rendered_html';\n\n /**\n * Render data to the DOM node\n */\n function render(props, node) {\n const script = document.createElement(\"script\");\n node.appendChild(script);\n }\n\n /**\n * Handle when an output is cleared or removed\n */\n function handleClearOutput(event, handle) {\n function drop(id) {\n const view = Bokeh.index.get_by_id(id)\n if (view != null) {\n view.model.document.clear()\n Bokeh.index.delete(view)\n }\n }\n\n const cell = handle.cell;\n\n const id = cell.output_area._bokeh_element_id;\n const server_id = cell.output_area._bokeh_server_id;\n\n // Clean up Bokeh references\n if (id != null) {\n drop(id)\n }\n\n if (server_id !== undefined) {\n // Clean up Bokeh references\n const cmd_clean = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n cell.notebook.kernel.execute(cmd_clean, {\n iopub: {\n output: function(msg) {\n const id = msg.content.text.trim()\n drop(id)\n }\n }\n });\n // Destroy server and session\n const cmd_destroy = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n cell.notebook.kernel.execute(cmd_destroy);\n }\n }\n\n /**\n * Handle when a new output is added\n */\n function handleAddOutput(event, handle) {\n const output_area = handle.output_area;\n const output = handle.output;\n\n // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n if ((output.output_type != \"display_data\") || (!Object.prototype.hasOwnProperty.call(output.data, EXEC_MIME_TYPE))) {\n return\n }\n\n const toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n\n if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n // store reference to embed id on output_area\n output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n }\n if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n const bk_div = document.createElement(\"div\");\n bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n const script_attrs = bk_div.children[0].attributes;\n for (let i = 0; i < script_attrs.length; i++) {\n toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n toinsert[toinsert.length - 1].firstChild.textContent = bk_div.children[0].textContent\n }\n // store reference to server id on output_area\n output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n }\n }\n\n function register_renderer(events, OutputArea) {\n\n function append_mime(data, metadata, element) {\n // create a DOM node to render to\n const toinsert = this.create_output_subarea(\n metadata,\n CLASS_NAME,\n EXEC_MIME_TYPE\n );\n this.keyboard_manager.register_events(toinsert);\n // Render to node\n const props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n render(props, toinsert[toinsert.length - 1]);\n element.append(toinsert);\n return toinsert\n }\n\n /* Handle when an output is cleared or removed */\n events.on('clear_output.CodeCell', handleClearOutput);\n events.on('delete.Cell', handleClearOutput);\n\n /* Handle when a new output is added */\n events.on('output_added.OutputArea', handleAddOutput);\n\n /**\n * Register the mime type and append_mime function with output_area\n */\n OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n /* Is output safe? */\n safe: true,\n /* Index of renderer in `output_area.display_order` */\n index: 0\n });\n }\n\n // register the mime type if in Jupyter Notebook environment and previously unregistered\n if (root.Jupyter !== undefined) {\n const events = require('base/js/events');\n const OutputArea = require('notebook/js/outputarea').OutputArea;\n\n if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n register_renderer(events, OutputArea);\n }\n }\n if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n const NB_LOAD_WARNING = {'data': {'text/html':\n \"
\\n\"+\n \"

\\n\"+\n \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n \"

\\n\"+\n \"
    \\n\"+\n \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n \"
  • use INLINE resources instead, as so:
  • \\n\"+\n \"
\\n\"+\n \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"
\"}};\n\n function display_loaded(error = null) {\n const el = document.getElementById(\"aced82eb-9aa6-4ce1-9565-7f196c6cc0b6\");\n if (el != null) {\n const html = (() => {\n if (typeof root.Bokeh === \"undefined\") {\n if (error == null) {\n return \"BokehJS is loading ...\";\n } else {\n return \"BokehJS failed to load.\";\n }\n } else {\n const prefix = `BokehJS ${root.Bokeh.version}`;\n if (error == null) {\n return `${prefix} successfully loaded.`;\n } else {\n return `${prefix} encountered errors while loading and may not function as expected.`;\n }\n }\n })();\n el.innerHTML = html;\n\n if (error != null) {\n const wrapper = document.createElement(\"div\");\n wrapper.style.overflow = \"auto\";\n wrapper.style.height = \"5em\";\n wrapper.style.resize = \"vertical\";\n const content = document.createElement(\"div\");\n content.style.fontFamily = \"monospace\";\n content.style.whiteSpace = \"pre-wrap\";\n content.style.backgroundColor = \"rgb(255, 221, 221)\";\n content.textContent = error.stack ?? error.toString();\n wrapper.append(content);\n el.append(wrapper);\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(() => display_loaded(error), 100);\n }\n }\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n\n root._bokeh_onload_callbacks.push(callback);\n if (root._bokeh_is_loading > 0) {\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls == null || js_urls.length === 0) {\n run_callbacks();\n return null;\n }\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = css_urls.length + js_urls.length;\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n\n function on_error(url) {\n console.error(\"failed to load \" + url);\n }\n\n for (let i = 0; i < css_urls.length; i++) {\n const url = css_urls[i];\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n }\n\n for (let i = 0; i < js_urls.length; i++) {\n const url = js_urls[i];\n const element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n };\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.7.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.7.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.7.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.7.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.7.3.min.js\"];\n const css_urls = [];\n\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {\n }\n ];\n\n function run_inline_js() {\n if (root.Bokeh !== undefined || force === true) {\n try {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\n\n } catch (error) {display_loaded(error);throw error;\n }if (force === true) {\n display_loaded();\n }} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n } else if (force !== true) {\n const cell = $(document.getElementById(\"aced82eb-9aa6-4ce1-9565-7f196c6cc0b6\")).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\n }\n }\n\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(css_urls, js_urls, function() {\n console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n}(window));", - "application/vnd.bokehjs_load.v0+json": "" - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[get_engine] Creating engine for DB: securities_master, PID: 25839\n", - "YF.download() has changed argument auto_adjust default to True\n", - "2025-10-19 00:47:44 trade.asset.Stock ERROR: Error getting dividends history for AMD from yfinance\n", - "2025-10-19 00:47:44 trade.asset.Stock ERROR: Probably due to no dividends history\n" - ] - }, - { - "ename": "KeyboardInterrupt", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[60], line 5\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;21;01malgo\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpositions\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mloaders\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mposition_vars\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m get_position_data\n\u001b[1;32m 4\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;21;01malgo\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpositions\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mloaders\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01moption_data\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m get_orders_table\n\u001b[0;32m----> 5\u001b[0m pos \u001b[38;5;241m=\u001b[39m \u001b[43mget_position_data\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/cloned_repos/TFP-Algo/algo/positions/loaders/position_vars.py:97\u001b[0m, in \u001b[0;36mget_position_data\u001b[0;34m(date)\u001b[0m\n\u001b[1;32m 94\u001b[0m pos_data \u001b[38;5;241m=\u001b[39m PositionData()\n\u001b[1;32m 96\u001b[0m \u001b[38;5;66;03m## Load after initializing\u001b[39;00m\n\u001b[0;32m---> 97\u001b[0m \u001b[43mpos_data\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mload_positions\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdate\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtoday_key\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mforce\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[1;32m 98\u001b[0m _POSITIONS[today_key] \u001b[38;5;241m=\u001b[39m pos_data\n\u001b[1;32m 99\u001b[0m \u001b[38;5;66;03m## Always return the latest if no date is provided\u001b[39;00m\n", - "File \u001b[0;32m~/cloned_repos/TFP-Algo/algo/positions/loaders/position_vars.py:65\u001b[0m, in \u001b[0;36mPositionData.load_positions\u001b[0;34m(self, date, force)\u001b[0m\n\u001b[1;32m 60\u001b[0m refresh \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_position \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \\\n\u001b[1;32m 61\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m (ny_now() \u001b[38;5;241m-\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mlast_loaded) \u001b[38;5;241m>\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mrefresh_delta \\\n\u001b[1;32m 62\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m force\n\u001b[1;32m 64\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m refresh:\n\u001b[0;32m---> 65\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_position \u001b[38;5;241m=\u001b[39m \u001b[43mload_positions_data\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdate\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdate\u001b[49m\u001b[43m)\u001b[49m[\u001b[38;5;241m0\u001b[39m]\n\u001b[1;32m 66\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mlast_loaded \u001b[38;5;241m=\u001b[39m ny_now()\n", - "File \u001b[0;32m~/cloned_repos/TFP-Algo/algo/positions/loaders/option_data.py:429\u001b[0m, in \u001b[0;36mload_positions_data\u001b[0;34m(live, date, load_scenarios)\u001b[0m\n\u001b[1;32m 425\u001b[0m \u001b[38;5;66;03m## Create ActivePosition objects and associate them with StrategyPositions\u001b[39;00m\n\u001b[1;32m 426\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m _id \u001b[38;5;129;01min\u001b[39;00m open_journal\u001b[38;5;241m.\u001b[39mtrade_id\u001b[38;5;241m.\u001b[39munique():\n\u001b[1;32m 427\u001b[0m \n\u001b[1;32m 428\u001b[0m \u001b[38;5;66;03m## Add position to the corresponding strategy\u001b[39;00m\n\u001b[0;32m--> 429\u001b[0m position \u001b[38;5;241m=\u001b[39m \u001b[43mload_active_positions_object\u001b[49m\u001b[43m(\u001b[49m\u001b[43m_id\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\n\u001b[1;32m 430\u001b[0m \u001b[43m \u001b[49m\u001b[43mdate\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdate\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 431\u001b[0m \u001b[43m \u001b[49m\u001b[43mopen_journal\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mopen_journal\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\n\u001b[1;32m 432\u001b[0m \u001b[43m \u001b[49m\u001b[43mlive\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlive\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\n\u001b[1;32m 433\u001b[0m \u001b[43m \u001b[49m\u001b[43mall_positions_from_alpaca\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mall_positions_from_alpaca\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 434\u001b[0m strategies[position\u001b[38;5;241m.\u001b[39mstrategy_name]\u001b[38;5;241m.\u001b[39madd_position(position)\n\u001b[1;32m 436\u001b[0m \u001b[38;5;66;03m## Create PortfolioPositions\u001b[39;00m\n", - "File \u001b[0;32m~/cloned_repos/TFP-Algo/algo/positions/loaders/option_data.py:329\u001b[0m, in \u001b[0;36mload_active_positions_object\u001b[0;34m(_id, date, open_journal, live, all_positions_from_alpaca)\u001b[0m\n\u001b[1;32m 326\u001b[0m \u001b[38;5;28;01mcontinue\u001b[39;00m\n\u001b[1;32m 327\u001b[0m position\u001b[38;5;241m.\u001b[39madd_alpaca_objs(alpaca_objs\u001b[38;5;241m=\u001b[39malpaca_pos, direction\u001b[38;5;241m=\u001b[39mdirection)\n\u001b[0;32m--> 329\u001b[0m option_data \u001b[38;5;241m=\u001b[39m \u001b[43mcreate_option_data_class\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 330\u001b[0m \u001b[43m \u001b[49m\u001b[43mmeta\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlive_position\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 331\u001b[0m \u001b[43m \u001b[49m\u001b[43mdate\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdate\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 332\u001b[0m \u001b[43m \u001b[49m\u001b[43mqty\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mint\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43malpaca_pos\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mqty\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 333\u001b[0m \u001b[43m \u001b[49m\u001b[43msignal_id\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msignal_id\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 334\u001b[0m \u001b[43m \u001b[49m\u001b[43mtrade_id\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m_id\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 335\u001b[0m \u001b[43m \u001b[49m\u001b[43mdirection\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdirection\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# 'L' or 'S'\u001b[39;49;00m\n\u001b[1;32m 336\u001b[0m \u001b[43m \u001b[49m\u001b[43mstrategy_name\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstrategy_name\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 337\u001b[0m \u001b[43m \u001b[49m\u001b[43mavg_entry_price\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43malpaca_pos\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mavg_entry_price\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43malpaca_pos\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01melse\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mnan\u001b[49m\n\u001b[1;32m 338\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 339\u001b[0m position\u001b[38;5;241m.\u001b[39mposition_data\u001b[38;5;241m.\u001b[39madd_option_data(option_data)\n\u001b[1;32m 341\u001b[0m \u001b[38;5;66;03m# Aggregate Greeks\u001b[39;00m\n", - "File \u001b[0;32m~/cloned_repos/TFP-Algo/algo/positions/loaders/option_data.py:217\u001b[0m, in \u001b[0;36mcreate_option_data_class\u001b[0;34m(meta, date, qty, signal_id, trade_id, direction, strategy_name, avg_entry_price)\u001b[0m\n\u001b[1;32m 198\u001b[0m qty \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mabs\u001b[39m(qty)\n\u001b[1;32m 199\u001b[0m option \u001b[38;5;241m=\u001b[39m OptionData(\n\u001b[1;32m 200\u001b[0m opttick\u001b[38;5;241m=\u001b[39mopttick,\n\u001b[1;32m 201\u001b[0m dt\u001b[38;5;241m=\u001b[39mchange_to_last_busday(date),\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 214\u001b[0m side_int\u001b[38;5;241m=\u001b[39mSideInt\u001b[38;5;241m.\u001b[39mBUY \u001b[38;5;28;01mif\u001b[39;00m direction \u001b[38;5;129;01min\u001b[39;00m {\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mL\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mLONG\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mBTO\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mBUY\u001b[39m\u001b[38;5;124m'\u001b[39m} \u001b[38;5;28;01melse\u001b[39;00m SideInt\u001b[38;5;241m.\u001b[39mSELL\n\u001b[1;32m 215\u001b[0m )\n\u001b[0;32m--> 217\u001b[0m option \u001b[38;5;241m=\u001b[39m \u001b[43madd_last_price_to_option\u001b[49m\u001b[43m(\u001b[49m\u001b[43moption\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 218\u001b[0m option \u001b[38;5;241m=\u001b[39m add_stock_data_to_option(option)\n\u001b[1;32m 219\u001b[0m option \u001b[38;5;241m=\u001b[39m add_iv_to_option(option)\n", - "File \u001b[0;32m~/cloned_repos/TFP-Algo/algo/positions/loaders/option_data.py:162\u001b[0m, in \u001b[0;36madd_last_price_to_option\u001b[0;34m(option)\u001b[0m\n\u001b[1;32m 149\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;21madd_last_price_to_option\u001b[39m(option: OptionData) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m OptionData:\n\u001b[1;32m 150\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 151\u001b[0m \u001b[38;5;124;03m Fetch and add the last price to the OptionData object.\u001b[39;00m\n\u001b[1;32m 152\u001b[0m \n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 160\u001b[0m \u001b[38;5;124;03m - This function is not side-aware. It simply fetches the last price from the market data.\u001b[39;00m\n\u001b[1;32m 161\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m--> 162\u001b[0m option\u001b[38;5;241m.\u001b[39mlast_price \u001b[38;5;241m=\u001b[39m \u001b[43mget_option_price\u001b[49m\u001b[43m(\u001b[49m\u001b[43moption\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mopttick\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\n\u001b[1;32m 163\u001b[0m \u001b[43m \u001b[49m\u001b[43moption\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdt\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstrftime\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43m%\u001b[39;49m\u001b[38;5;124;43mY-\u001b[39;49m\u001b[38;5;124;43m%\u001b[39;49m\u001b[38;5;124;43mm-\u001b[39;49m\u001b[38;5;132;43;01m%d\u001b[39;49;00m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 164\u001b[0m \u001b[43m \u001b[49m\u001b[43mforce\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m \u001b[38;5;66;03m#* np.sign(option.quantity)\u001b[39;00m\n\u001b[1;32m 165\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m option\n", - "File \u001b[0;32m~/cloned_repos/TFP-Algo/algo/strategies/utils/__init__.py:147\u001b[0m, in \u001b[0;36mget_option_price\u001b[0;34m(_id, date, force)\u001b[0m\n\u001b[1;32m 136\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 137\u001b[0m \u001b[38;5;124;03mGet the position price for a given position ID and date.\u001b[39;00m\n\u001b[1;32m 138\u001b[0m \n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 144\u001b[0m \u001b[38;5;124;03mfloat|None: The position price if available, otherwise None.\u001b[39;00m\n\u001b[1;32m 145\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 146\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m _id \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m get_custom_cache() \u001b[38;5;129;01mor\u001b[39;00m force: \u001b[38;5;66;03m## If not in cache or force refresh, get from ThetaData\u001b[39;00m\n\u001b[0;32m--> 147\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mget_option_price_theta_data\u001b[49m\u001b[43m(\u001b[49m\u001b[43m_id\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdate\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 148\u001b[0m data \u001b[38;5;241m=\u001b[39m get_custom_cache()[_id]\n\u001b[1;32m 149\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m date \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m data\u001b[38;5;241m.\u001b[39mindex:\n", - "File \u001b[0;32m~/cloned_repos/TFP-Algo/algo/strategies/utils/__init__.py:118\u001b[0m, in \u001b[0;36mget_option_price_theta_data\u001b[0;34m(opttick, as_of)\u001b[0m\n\u001b[1;32m 116\u001b[0m as_of \u001b[38;5;241m=\u001b[39m pd\u001b[38;5;241m.\u001b[39mto_datetime(as_of)\n\u001b[1;32m 117\u001b[0m meta \u001b[38;5;241m=\u001b[39m parse_option_tick(opttick)\n\u001b[0;32m--> 118\u001b[0m data \u001b[38;5;241m=\u001b[39m \u001b[43mretrieve_quote\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 119\u001b[0m \u001b[43m \u001b[49m\u001b[43msymbol\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmeta\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mticker\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 120\u001b[0m \u001b[43m \u001b[49m\u001b[43mstart_date\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mas_of\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m-\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mtimedelta\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdays\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m7\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 121\u001b[0m \u001b[43m \u001b[49m\u001b[43mend_date\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mas_of\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m+\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mtimedelta\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdays\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 122\u001b[0m \u001b[43m \u001b[49m\u001b[43mstrike\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmeta\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mstrike\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 123\u001b[0m \u001b[43m \u001b[49m\u001b[43mright\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mmeta\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mput_call\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 124\u001b[0m \u001b[43m \u001b[49m\u001b[43mexp\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmeta\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mexp_date\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 125\u001b[0m \u001b[43m \u001b[49m\u001b[43mprint_url\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 126\u001b[0m \u001b[43m \u001b[49m\u001b[43minterval\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43m1d\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 127\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m data \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mor\u001b[39;00m data\u001b[38;5;241m.\u001b[39mempty:\n\u001b[1;32m 128\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n", - "File \u001b[0;32m~/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/backoff/_sync.py:105\u001b[0m, in \u001b[0;36mretry_exception..retry\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 96\u001b[0m details \u001b[38;5;241m=\u001b[39m {\n\u001b[1;32m 97\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtarget\u001b[39m\u001b[38;5;124m\"\u001b[39m: target,\n\u001b[1;32m 98\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124margs\u001b[39m\u001b[38;5;124m\"\u001b[39m: args,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 101\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124melapsed\u001b[39m\u001b[38;5;124m\"\u001b[39m: elapsed,\n\u001b[1;32m 102\u001b[0m }\n\u001b[1;32m 104\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 105\u001b[0m ret \u001b[38;5;241m=\u001b[39m \u001b[43mtarget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 106\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m exception \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 107\u001b[0m max_tries_exceeded \u001b[38;5;241m=\u001b[39m (tries \u001b[38;5;241m==\u001b[39m max_tries_value)\n", - "File \u001b[0;32m~/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:778\u001b[0m, in \u001b[0;36mretrieve_quote\u001b[0;34m(symbol, end_date, exp, right, start_date, strike, start_time, print_url, end_time, interval, proxy, ohlc_format, **kwargs)\u001b[0m\n\u001b[1;32m 776\u001b[0m start_timer \u001b[38;5;241m=\u001b[39m time\u001b[38;5;241m.\u001b[39mtime()\n\u001b[1;32m 777\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m proxy:\n\u001b[0;32m--> 778\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[43mrequest_from_proxy\u001b[49m\u001b[43m(\u001b[49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mquerystring\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mproxy\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 779\u001b[0m response_url \u001b[38;5;241m=\u001b[39m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00murl\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m?\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m&\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;241m.\u001b[39mjoin([\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mkey\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m=\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mvalue\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mfor\u001b[39;00m\u001b[38;5;250m \u001b[39mkey,\u001b[38;5;250m \u001b[39mvalue\u001b[38;5;250m \u001b[39m\u001b[38;5;129;01min\u001b[39;00m\u001b[38;5;250m \u001b[39mquerystring\u001b[38;5;241m.\u001b[39mitems()])\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m \n\u001b[1;32m 780\u001b[0m \u001b[38;5;28mprint\u001b[39m(response_url) \u001b[38;5;28;01mif\u001b[39;00m print_url \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n", - "File \u001b[0;32m~/cloned_repos/FinanceDatabase/dbase/DataAPI/ThetaData.py:133\u001b[0m, in \u001b[0;36mrequest_from_proxy\u001b[0;34m(thetaUrl, queryparam, instanceUrl, print_url)\u001b[0m\n\u001b[1;32m 126\u001b[0m payload \u001b[38;5;241m=\u001b[39m json\u001b[38;5;241m.\u001b[39mdumps({\n\u001b[1;32m 127\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124murl\u001b[39m\u001b[38;5;124m\"\u001b[39m: request_string,\n\u001b[1;32m 128\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmethod\u001b[39m\u001b[38;5;124m\"\u001b[39m: \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mGET\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[1;32m 129\u001b[0m })\n\u001b[1;32m 130\u001b[0m headers \u001b[38;5;241m=\u001b[39m {\n\u001b[1;32m 131\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mContent-Type\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mapplication/json\u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[1;32m 132\u001b[0m }\n\u001b[0;32m--> 133\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[43mrequests\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrequest\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mPOST\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minstanceUrl\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mheaders\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mheaders\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdata\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mpayload\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 134\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m response\n", - "File \u001b[0;32m~/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/requests/api.py:59\u001b[0m, in \u001b[0;36mrequest\u001b[0;34m(method, url, **kwargs)\u001b[0m\n\u001b[1;32m 55\u001b[0m \u001b[38;5;66;03m# By using the 'with' statement we are sure the session is closed, thus we\u001b[39;00m\n\u001b[1;32m 56\u001b[0m \u001b[38;5;66;03m# avoid leaving sockets open which can trigger a ResourceWarning in some\u001b[39;00m\n\u001b[1;32m 57\u001b[0m \u001b[38;5;66;03m# cases, and look like a memory leak in others.\u001b[39;00m\n\u001b[1;32m 58\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m sessions\u001b[38;5;241m.\u001b[39mSession() \u001b[38;5;28;01mas\u001b[39;00m session:\n\u001b[0;32m---> 59\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43msession\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrequest\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmethod\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/requests/sessions.py:589\u001b[0m, in \u001b[0;36mSession.request\u001b[0;34m(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)\u001b[0m\n\u001b[1;32m 584\u001b[0m send_kwargs \u001b[38;5;241m=\u001b[39m {\n\u001b[1;32m 585\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtimeout\u001b[39m\u001b[38;5;124m\"\u001b[39m: timeout,\n\u001b[1;32m 586\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mallow_redirects\u001b[39m\u001b[38;5;124m\"\u001b[39m: allow_redirects,\n\u001b[1;32m 587\u001b[0m }\n\u001b[1;32m 588\u001b[0m send_kwargs\u001b[38;5;241m.\u001b[39mupdate(settings)\n\u001b[0;32m--> 589\u001b[0m resp \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msend\u001b[49m\u001b[43m(\u001b[49m\u001b[43mprep\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43msend_kwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 591\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m resp\n", - "File \u001b[0;32m~/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/requests/sessions.py:703\u001b[0m, in \u001b[0;36mSession.send\u001b[0;34m(self, request, **kwargs)\u001b[0m\n\u001b[1;32m 700\u001b[0m start \u001b[38;5;241m=\u001b[39m preferred_clock()\n\u001b[1;32m 702\u001b[0m \u001b[38;5;66;03m# Send the request\u001b[39;00m\n\u001b[0;32m--> 703\u001b[0m r \u001b[38;5;241m=\u001b[39m \u001b[43madapter\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msend\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 705\u001b[0m \u001b[38;5;66;03m# Total elapsed time of the request (approximately)\u001b[39;00m\n\u001b[1;32m 706\u001b[0m elapsed \u001b[38;5;241m=\u001b[39m preferred_clock() \u001b[38;5;241m-\u001b[39m start\n", - "File \u001b[0;32m~/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/requests/adapters.py:667\u001b[0m, in \u001b[0;36mHTTPAdapter.send\u001b[0;34m(self, request, stream, timeout, verify, cert, proxies)\u001b[0m\n\u001b[1;32m 664\u001b[0m timeout \u001b[38;5;241m=\u001b[39m TimeoutSauce(connect\u001b[38;5;241m=\u001b[39mtimeout, read\u001b[38;5;241m=\u001b[39mtimeout)\n\u001b[1;32m 666\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 667\u001b[0m resp \u001b[38;5;241m=\u001b[39m \u001b[43mconn\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43murlopen\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 668\u001b[0m \u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrequest\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 669\u001b[0m \u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 670\u001b[0m \u001b[43m \u001b[49m\u001b[43mbody\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrequest\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbody\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 671\u001b[0m \u001b[43m \u001b[49m\u001b[43mheaders\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrequest\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mheaders\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 672\u001b[0m \u001b[43m \u001b[49m\u001b[43mredirect\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 673\u001b[0m \u001b[43m \u001b[49m\u001b[43massert_same_host\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 674\u001b[0m \u001b[43m \u001b[49m\u001b[43mpreload_content\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 675\u001b[0m \u001b[43m \u001b[49m\u001b[43mdecode_content\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 676\u001b[0m \u001b[43m \u001b[49m\u001b[43mretries\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmax_retries\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 677\u001b[0m \u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtimeout\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 678\u001b[0m \u001b[43m \u001b[49m\u001b[43mchunked\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mchunked\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 679\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 681\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m (ProtocolError, \u001b[38;5;167;01mOSError\u001b[39;00m) \u001b[38;5;28;01mas\u001b[39;00m err:\n\u001b[1;32m 682\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mConnectionError\u001b[39;00m(err, request\u001b[38;5;241m=\u001b[39mrequest)\n", - "File \u001b[0;32m~/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/urllib3/connectionpool.py:716\u001b[0m, in \u001b[0;36mHTTPConnectionPool.urlopen\u001b[0;34m(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw)\u001b[0m\n\u001b[1;32m 713\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_prepare_proxy(conn)\n\u001b[1;32m 715\u001b[0m \u001b[38;5;66;03m# Make the request on the httplib connection object.\u001b[39;00m\n\u001b[0;32m--> 716\u001b[0m httplib_response \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_make_request\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 717\u001b[0m \u001b[43m \u001b[49m\u001b[43mconn\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 718\u001b[0m \u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 719\u001b[0m \u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 720\u001b[0m \u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtimeout_obj\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 721\u001b[0m \u001b[43m \u001b[49m\u001b[43mbody\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mbody\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 722\u001b[0m \u001b[43m \u001b[49m\u001b[43mheaders\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mheaders\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 723\u001b[0m \u001b[43m \u001b[49m\u001b[43mchunked\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mchunked\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 724\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 726\u001b[0m \u001b[38;5;66;03m# If we're going to release the connection in ``finally:``, then\u001b[39;00m\n\u001b[1;32m 727\u001b[0m \u001b[38;5;66;03m# the response doesn't need to know about the connection. Otherwise\u001b[39;00m\n\u001b[1;32m 728\u001b[0m \u001b[38;5;66;03m# it will also try to release it and we'll have a double-release\u001b[39;00m\n\u001b[1;32m 729\u001b[0m \u001b[38;5;66;03m# mess.\u001b[39;00m\n\u001b[1;32m 730\u001b[0m response_conn \u001b[38;5;241m=\u001b[39m conn \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m release_conn \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n", - "File \u001b[0;32m~/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/urllib3/connectionpool.py:468\u001b[0m, in \u001b[0;36mHTTPConnectionPool._make_request\u001b[0;34m(self, conn, method, url, timeout, chunked, **httplib_request_kw)\u001b[0m\n\u001b[1;32m 463\u001b[0m httplib_response \u001b[38;5;241m=\u001b[39m conn\u001b[38;5;241m.\u001b[39mgetresponse()\n\u001b[1;32m 464\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 465\u001b[0m \u001b[38;5;66;03m# Remove the TypeError from the exception chain in\u001b[39;00m\n\u001b[1;32m 466\u001b[0m \u001b[38;5;66;03m# Python 3 (including for exceptions like SystemExit).\u001b[39;00m\n\u001b[1;32m 467\u001b[0m \u001b[38;5;66;03m# Otherwise it looks like a bug in the code.\u001b[39;00m\n\u001b[0;32m--> 468\u001b[0m \u001b[43msix\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mraise_from\u001b[49m\u001b[43m(\u001b[49m\u001b[43me\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[1;32m 469\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m (SocketTimeout, BaseSSLError, SocketError) \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 470\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_raise_timeout(err\u001b[38;5;241m=\u001b[39me, url\u001b[38;5;241m=\u001b[39murl, timeout_value\u001b[38;5;241m=\u001b[39mread_timeout)\n", - "File \u001b[0;32m:3\u001b[0m, in \u001b[0;36mraise_from\u001b[0;34m(value, from_value)\u001b[0m\n", - "File \u001b[0;32m~/miniconda3/envs/openbb_new_use/lib/python3.11/site-packages/urllib3/connectionpool.py:463\u001b[0m, in \u001b[0;36mHTTPConnectionPool._make_request\u001b[0;34m(self, conn, method, url, timeout, chunked, **httplib_request_kw)\u001b[0m\n\u001b[1;32m 460\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m:\n\u001b[1;32m 461\u001b[0m \u001b[38;5;66;03m# Python 3\u001b[39;00m\n\u001b[1;32m 462\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 463\u001b[0m httplib_response \u001b[38;5;241m=\u001b[39m \u001b[43mconn\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgetresponse\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 464\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 465\u001b[0m \u001b[38;5;66;03m# Remove the TypeError from the exception chain in\u001b[39;00m\n\u001b[1;32m 466\u001b[0m \u001b[38;5;66;03m# Python 3 (including for exceptions like SystemExit).\u001b[39;00m\n\u001b[1;32m 467\u001b[0m \u001b[38;5;66;03m# Otherwise it looks like a bug in the code.\u001b[39;00m\n\u001b[1;32m 468\u001b[0m six\u001b[38;5;241m.\u001b[39mraise_from(e, \u001b[38;5;28;01mNone\u001b[39;00m)\n", - "File \u001b[0;32m~/miniconda3/envs/openbb_new_use/lib/python3.11/http/client.py:1395\u001b[0m, in \u001b[0;36mHTTPConnection.getresponse\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1393\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 1394\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m-> 1395\u001b[0m \u001b[43mresponse\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbegin\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1396\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mConnectionError\u001b[39;00m:\n\u001b[1;32m 1397\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mclose()\n", - "File \u001b[0;32m~/miniconda3/envs/openbb_new_use/lib/python3.11/http/client.py:325\u001b[0m, in \u001b[0;36mHTTPResponse.begin\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 323\u001b[0m \u001b[38;5;66;03m# read until we get a non-100 response\u001b[39;00m\n\u001b[1;32m 324\u001b[0m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[0;32m--> 325\u001b[0m version, status, reason \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_read_status\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 326\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m status \u001b[38;5;241m!=\u001b[39m CONTINUE:\n\u001b[1;32m 327\u001b[0m \u001b[38;5;28;01mbreak\u001b[39;00m\n", - "File \u001b[0;32m~/miniconda3/envs/openbb_new_use/lib/python3.11/http/client.py:286\u001b[0m, in \u001b[0;36mHTTPResponse._read_status\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 285\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;21m_read_status\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[0;32m--> 286\u001b[0m line \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mstr\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfp\u001b[38;5;241m.\u001b[39mreadline(_MAXLINE \u001b[38;5;241m+\u001b[39m \u001b[38;5;241m1\u001b[39m), \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124miso-8859-1\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 287\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(line) \u001b[38;5;241m>\u001b[39m _MAXLINE:\n\u001b[1;32m 288\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m LineTooLong(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mstatus line\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", - "File \u001b[0;32m~/miniconda3/envs/openbb_new_use/lib/python3.11/socket.py:718\u001b[0m, in \u001b[0;36mSocketIO.readinto\u001b[0;34m(self, b)\u001b[0m\n\u001b[1;32m 716\u001b[0m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[1;32m 717\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 718\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_sock\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrecv_into\u001b[49m\u001b[43m(\u001b[49m\u001b[43mb\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 719\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m timeout:\n\u001b[1;32m 720\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_timeout_occurred \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m\n", - "\u001b[0;31mKeyboardInterrupt\u001b[0m: " - ] - } - ], - "source": [ - "%load_ext autoreload\n", - "%autoreload 2\n", - "from algo.positions.loaders.position_vars import get_position_data\n", - "from algo.positions.loaders.option_data import get_orders_table\n", - "pos = get_position_data()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "0627a531", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Approximate total size of objects in memory: 1.29 MB\n" - ] - } - ], - "source": [ - "import sys\n", - "\n", - "total_size = 0\n", - "for name, obj in globals().items():\n", - " try:\n", - " total_size += sys.getsizeof(obj)\n", - " except TypeError:\n", - " pass # some built-ins don't support getsizeof\n", - "\n", - "print(f\"Approximate total size of objects in memory: {total_size / 1024**2:.2f} MB\")\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "43af55af", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Total memory used by this Jupyter process: 551.62 MB\n" - ] - } - ], - "source": [ - "import psutil, os\n", - "\n", - "process = psutil.Process(os.getpid())\n", - "print(f\"Total memory used by this Jupyter process: {process.memory_info().rss / 1024**2:.2f} MB\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7cd8f12e", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Size of Out: 29.41 MB\n", - "Size of exit: 29.41 MB\n", - "Size of quit: 29.41 MB\n", - "Size of logger: 29.41 MB\n", - "Size of PARAMS_DUMP_CACHE: 0.01 MB\n", - "Size of CHAIN_DUMP_CACHE: 0.01 MB\n", - "Size of EODMarketSSVIModel: 0.00 MB\n", - "Size of bac_model: 0.00 MB\n", - "Size of ts: 0.00 MB\n", - "Size of pos: 29.41 MB\n", - "Deep size of all variables: 31.22 MB\n" - ] - } - ], - "source": [ - "from pympler import asizeof\n", - "\n", - "extra = [\n", - " 'PARAMS_DUMP_CACHE',\n", - " 'ts',\n", - " 'CHAIN_DUMP_CACHE',\n", - " 'bac_model',\n", - " 'EODMarketSSVIModel'\n", - "]\n", - "skip = {'In', 'Out', 'exit', 'quit', 'get_ipython', 'logger'}\n", - "\n", - "total_size = 0\n", - "for name, obj in globals().items():\n", - " if not name.startswith('_'): # skip internals\n", - " try:\n", - " if name not in skip:\n", - " total_size += asizeof.asizeof(obj)\n", - " if asizeof.asizeof(obj) > 10*1024**2:\n", - " print(f\"Size of {name}: {asizeof.asizeof(obj) / 1024**2:.2f} MB\")\n", - " if name in extra:\n", - " print(f\"Size of {name}: {asizeof.asizeof(obj) / 1024**2:.2f} MB\")\n", - " except Exception:\n", - " pass\n", - "\n", - "print(f\"Deep size of all variables: {total_size / 1024**2:.2f} MB\")\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b5c98064", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Full process memory (RSS): 545.51 MB\n" - ] - } - ], - "source": [ - "from pympler import asizeof\n", - "import psutil, os\n", - "\n", - "# print(f\"Deep Python object total: {sum(asizeof.asizeof(v) for v in globals().values()) / 1024**2:.2f} MB\")\n", - "print(f\"Full process memory (RSS): {psutil.Process(os.getpid()).memory_info().rss / 1024**2:.2f} MB\")\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "94ace9b3", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Variable Type Data/Info\n", - "---------------------------------------------------------------------\n", - "ABC ABCMeta \n", - "Any _AnyMeta typing.Any\n", - "BackgroundFits type \n", - "BaseModel ModelMetaclass \n", - "BaseSSVIModel ABCMeta \n", - "CHAIN_DUMP_CACHE CustomCache [612 rows x 29 columns]}>\n", - "Callable _CallableType typing.Callable\n", - "ChainChecklist type \n", - "ChainInputModel ABCMeta \n", - "ChainOutput type \n", - "ClassVar _SpecialForm typing.ClassVar\n", - "ConfigDict _TypedDictMeta \n", - "CustomCache type \n", - "DAILY_BASIS float 365.25\n", - "Dict _SpecialGenericAlias typing.Dict\n", - "DivType EnumType \n", - "EODMarketSSVIModel ModelMetaclass \n", - "Enum EnumType \n", - "EquityForward ABCMeta s.forward.EquityForward'>\n", - "Field function \n", - "Final _SpecialForm typing.Final\n", - "Future type \n", - "GLOBAL_BACKGROUND_FITS BackgroundFits <__main__.BackgroundFits object at 0x136b38a10>\n", - "GLOBAL_CONFIG SSVIGlobalConfig SSVIGlobalConfig(vol_side<...>lse, fit_all_sides=False)\n", - "Iterable ABCMeta \n", - "List _SpecialGenericAlias typing.List\n", - "Literal _LiteralSpecialForm typing.Literal\n", - "MarketChainLoader ModelMetaclass \n", - "Optional _SpecialForm typing.Optional\n", - "PARAMS_DUMP_CACHE CustomCache ': 0.01458374922181478}}>\n", - "PRICING_CONFIG dict n=20\n", - "Path type \n", - "PrivateAttr function \n", - "SSVIGlobalConfig type \n", - "SSVIModelParams type \n", - "SSVIParentModel ModelMetaclass \n", - "Semaphore type \n", - "SingletonMixin ABCMeta \n", - "SsviTimeseriesEOD ModelMetaclass \n", - "Thread type \n", - "ThreadPoolExecutor type read.ThreadPoolExecutor'>\n", - "Tuple _TupleType typing.Tuple\n", - "Type _SpecialGenericAlias typing.Type\n", - "ValidationError type ic_core.ValidationError'>\n", - "VolSide EnumType \n", - "VolType EnumType \n", - "WeakSet type \n", - "abstractmethod function \n", - "assert_dt_within_range function \n", - "assert_k_bounds_model_range function del_range at 0x136ca8400>\n", - "assert_member_of_enum function \n", - "atm_loss_multi function \n", - "atm_total_variance function \n", - "auto type \n", - "bac_model EODMarketSSVIModel chain=uation_date='2025-10-13')\n", - "binomial_tree_greeks function \n", - "binomial_tree_price_batch function ice_batch at 0x136aa5e40>\n", - "bjs2002_numerical_greeks function al_greeks at 0x136bc6de0>\n", - "black_scholes_vectorized function ectorized at 0x117451d00>\n", - "bs_call_price function \n", - "bsm_vol_est_brute_force function \n", - "bsm_vol_est_minimization function imization at 0x136bc4680>\n", - "build_svi_params_obj function \n", - "calculate_normalized_mae_loss function _mae_loss at 0x136bfb880>\n", - "calculate_normalized_rmse_loss function rmse_loss at 0x136bfbd80>\n", - "chain_cache_key function \n", - "chain_dump_path PosixPath /Users/chiemelienwanisobi<...>e/optionlib_2/chain_dumps\n", - "chain_output ChainOutput ate=2025-06-10 00:00:00)>\n", - "change_to_last_busday function \n", - "check_missing_dates function \n", - "clip DataFrame spot strike<...>\\n2025-10-13 25.569563 \n", - "clip_2 DataFrame spot st<...>\\n2025-10-10 26.138831 \n", - "config_hash str 5d2f204cca67fbf759fec9dbf<...>e004328a2d36c7919adfc6bdc\n", - "confine_chain_with_pricing_config function ng_config at 0x13a4fd620>\n", - "convert_date_to_time_to_maturity function _maturity at 0x136bfb920>\n", - "crr_binomial_pricing function \n", - "dataclass function \n", - "date type \n", - "datetime type \n", - "df_chain DataFrame root expiratio<...>\\n[386 rows x 29 columns]\n", - "estimate_crr_implied_volatility function olatility at 0x136bc6ac0>\n", - "extract_numeric_value function \n", - "field function \n", - "format_chain function \n", - "get_K_grid function \n", - "get_T_grid function \n", - "get_atm_T function \n", - "get_atm_vol function \n", - "get_best_params function \n", - "get_bs_vol_on_chain function \n", - "get_chain function \n", - "get_discrete_crr_vol_on_chain function _on_chain at 0x13a4fdc60>\n", - "get_forward_price_on_chain function _on_chain at 0x136bf9da0>\n", - "get_fwd_grid function \n", - "get_global_config function \n", - "get_market_iv_grid function \n", - "get_option_eod_price function \n", - "get_orders_table function \n", - "get_position_data function \n", - "get_pricing_config function \n", - "get_rates function \n", - "get_risk_free_rate_helper function te_helper at 0x13496d3a0>\n", - "get_spot function \n", - "get_surface_params function \n", - "get_vectorized_dividend_rate function dend_rate at 0x136aa4400>\n", - "get_vectorized_dividend_scehdule function _scehdule at 0x136aa4220>\n", - "handle_strikes function \n", - "hash_config function \n", - "hashlib module b/python3.11/hashlib.py'>\n", - "identify_length_for_model function for_model at 0x136bfbe20>\n", - "interp1d type \n", - "intrinsic_value function \n", - "is_iterable function \n", - "is_latest_config function \n", - "is_weekend function \n", - "json module on3.11/json/__init__.py'>\n", - "list_contracts function \n", - "load_dotenv function \n", - "load_ssvi_params_from_cache function rom_cache at 0x136bfbc40>\n", - "loader MarketChainLoader symbol='T' valuation_date='2025-06-10'\n", - "logger Logger \n", - "loud_post_init function \n", - "make_candidate function \n", - "math module h.cpython-311-darwin.so'>\n", - "model _SSVIModel chain=ons=50000 chunk_size=5000\n", - "name str _i193\n", - "normal_cdf function \n", - "not_trading_day function \n", - "np module kages/numpy/__init__.py'>\n", - "obj str import sys\\n\\ntotal_size <...>_size / 1024**2:.2f} MB\")\n", - "os module \n", - "p_model SSVIParentModel chain=ons=50000 chunk_size=5000\n", - "params_cache_key function \n", - "params_dump_path PosixPath /Users/chiemelienwanisobi<...>e/optionlib_2/params_dump\n", - "pd module ages/pandas/__init__.py'>\n", - "pick_params function \n", - "pick_random_option function \n", - "pos PortfolioPositions PortfolioPositions(strate<...>p('2025-10-17 00:00:00'))\n", - "predict_vol function \n", - "pydantic_singleton function \n", - "random_search_vec function \n", - "relativedelta type \n", - "reload_pricing_config function \n", - "retrieve_chain_bulk function \n", - "retrieve_eod_ohlc function \n", - "retrieve_timeseries function \n", - "runProcesses function \n", - "run_date str 2025-06-04\n", - "set_global_config function \n", - "setup_logger function \n", - "skew DataFrame vol <...>n\\n[116 rows x 2 columns]\n", - "skew_phi function \n", - "ssvi_implied_vol function \n", - "ssvi_total_variance function \n", - "stdlib_dataclass function \n", - "stdlib_field function \n", - "surface_loss_multi function \n", - "surface_loss_multi_parallel function _parallel at 0x136bf9940>\n", - "symbol str AAPL\n", - "sys module \n", - "table DataFrame signal_id <...>8 None \n", - "test_start str 2025-07-16\n", - "test_valuation_date str 2025-07-16\n", - "ticks list n=5\n", - "time module \n", - "time_distance_helper function \n", - "total_size int 1684171\n", - "traceback module python3.11/traceback.py'>\n", - "ts SsviTimeseriesEOD symbol='T' iterations=500<...>unk_size=5000 models=None\n", - "v_cols list n=7\n", - "validate_ssvi_params function \n", - "vector_batch_processor function \n", - "vector_convert_to_time_frac function time_frac at 0x136aa42c0>\n", - "vector_eu_boundary function \n", - "vector_vol_estimation function \n", - "vectorized_black_scholes_greeks function es_greeks at 0x136a732e0>\n", - "vectorized_discrete_pv function \n", - "vectorized_market_forward_calc function ward_calc at 0x136aa53a0>\n", - "vol_est_brute_force_bjs_2002 function _bjs_2002 at 0x136bc6980>\n", - "vols_09 DataFrame <...>n\\n[116 rows x 2 columns]\n", - "vols_1 DataFrame <...>n\\n[116 rows x 2 columns]\n", - "wraps function \n" - ] - } - ], - "source": [ - "%whos\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a6afd60f", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 233, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "'PARAMS_DUMP_CACHE' in globals().keys()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "openbb_new_use", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.13" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/trade/optionlib/notebooks/ssvi_save_to_db.ipynb b/trade/optionlib/notebooks/ssvi_save_to_db.ipynb deleted file mode 100644 index 7e3d224..0000000 --- a/trade/optionlib/notebooks/ssvi_save_to_db.ipynb +++ /dev/null @@ -1,527 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "id": "2aefb323", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Console Logging & File Logging Can be configured using STREAM_LOG_LEVEL and FILE_LOG_LEVEL in environment variables.\n", - "Propagate to root logger can be set using PROPAGATE_TO_ROOT_LOGGER in environment variables.\n", - "Example:\n", - "STREAM_LOG_LEVEL = 'DEBUG'\n", - "FILE_LOG_LEVEL = 'INFO'\n", - "PROPAGATE_TO_ROOT_LOGGER = 'False'\n", - "\n", - "2025-10-19 18:44:14 trade.helpers.Logging INFO: Logging Root Directory: /Users/chiemelienwanisobi/cloned_repos/QuantTools/logs\n" - ] - } - ], - "source": [ - "from module_test.raw_code.optionlib_2.vol.ssvi.controller import get_params_cache" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "1cc9ff26", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['AAPL_2025-10-10_discrete_bs_call',\n", - " 'AAPL_2025-10-10_discrete_bs_put',\n", - " 'AAPL_2025-10-10_discrete_bs_otm',\n", - " 'BAC_2025-10-10_discrete_bs_call',\n", - " 'BAC_2025-10-10_discrete_bs_put',\n", - " 'BAC_2025-10-10_discrete_bs_otm',\n", - " 'PG_2025-10-10_discrete_bs_call',\n", - " 'PG_2025-10-10_discrete_bs_put',\n", - " 'PG_2025-10-10_discrete_bs_otm',\n", - " 'PG_2025-10-13_discrete_bs_call',\n", - " 'PG_2025-10-13_discrete_bs_put',\n", - " 'PG_2025-10-13_discrete_bs_otm',\n", - " 'T_2025-10-13_discrete_bs_call',\n", - " 'T_2025-10-13_discrete_bs_put',\n", - " 'T_2025-10-13_discrete_bs_otm',\n", - " 'T_2025-09-02_discrete_bs_call',\n", - " 'T_2025-09-02_discrete_bs_put',\n", - " 'T_2025-09-02_discrete_bs_otm',\n", - " 'T_2025-09-03_discrete_bs_call',\n", - " 'T_2025-09-03_discrete_bs_put',\n", - " 'T_2025-09-03_discrete_bs_otm',\n", - " 'T_2025-09-04_discrete_bs_call',\n", - " 'T_2025-09-04_discrete_bs_put',\n", - " 'T_2025-09-04_discrete_bs_otm',\n", - " 'T_2025-09-05_discrete_bs_call',\n", - " 'T_2025-09-05_discrete_bs_put',\n", - " 'T_2025-09-05_discrete_bs_otm',\n", - " 'T_2025-09-08_discrete_bs_call',\n", - " 'T_2025-09-08_discrete_bs_put',\n", - " 'T_2025-09-08_discrete_bs_otm',\n", - " 'T_2025-09-09_discrete_bs_call',\n", - " 'T_2025-09-09_discrete_bs_put',\n", - " 'T_2025-09-09_discrete_bs_otm',\n", - " 'T_2025-09-10_discrete_bs_call',\n", - " 'T_2025-09-10_discrete_bs_put',\n", - " 'T_2025-09-10_discrete_bs_otm',\n", - " 'T_2025-09-11_discrete_bs_call',\n", - " 'T_2025-09-11_discrete_bs_put',\n", - " 'T_2025-09-11_discrete_bs_otm',\n", - " 'T_2025-09-12_discrete_bs_call',\n", - " 'T_2025-09-12_discrete_bs_put',\n", - " 'T_2025-09-12_discrete_bs_otm',\n", - " 'T_2025-09-15_discrete_bs_call',\n", - " 'T_2025-09-15_discrete_bs_put',\n", - " 'T_2025-09-15_discrete_bs_otm',\n", - " 'T_2025-09-16_discrete_bs_call',\n", - " 'T_2025-09-16_discrete_bs_put',\n", - " 'T_2025-09-16_discrete_bs_otm',\n", - " 'T_2025-09-17_discrete_bs_call',\n", - " 'T_2025-09-17_discrete_bs_put',\n", - " 'T_2025-09-17_discrete_bs_otm',\n", - " 'T_2025-09-18_discrete_bs_call',\n", - " 'T_2025-09-18_discrete_bs_put',\n", - " 'T_2025-09-18_discrete_bs_otm',\n", - " 'T_2025-09-19_discrete_bs_call',\n", - " 'T_2025-09-19_discrete_bs_put',\n", - " 'T_2025-09-19_discrete_bs_otm',\n", - " 'T_2025-09-22_discrete_bs_call',\n", - " 'T_2025-09-22_discrete_bs_put',\n", - " 'T_2025-09-22_discrete_bs_otm',\n", - " 'T_2025-09-23_discrete_bs_call',\n", - " 'T_2025-09-23_discrete_bs_put',\n", - " 'T_2025-09-23_discrete_bs_otm',\n", - " 'T_2025-09-24_discrete_bs_call',\n", - " 'T_2025-09-24_discrete_bs_put',\n", - " 'T_2025-09-24_discrete_bs_otm',\n", - " 'T_2025-09-25_discrete_bs_call',\n", - " 'T_2025-09-25_discrete_bs_put',\n", - " 'T_2025-09-25_discrete_bs_otm',\n", - " 'T_2025-09-26_discrete_bs_call',\n", - " 'T_2025-09-26_discrete_bs_put',\n", - " 'T_2025-09-26_discrete_bs_otm',\n", - " 'T_2025-09-29_discrete_bs_call',\n", - " 'T_2025-09-29_discrete_bs_put',\n", - " 'T_2025-09-29_discrete_bs_otm',\n", - " 'T_2025-09-30_discrete_bs_call',\n", - " 'T_2025-09-30_discrete_bs_put',\n", - " 'T_2025-09-30_discrete_bs_otm',\n", - " 'T_2025-10-01_discrete_bs_call',\n", - " 'T_2025-10-01_discrete_bs_put',\n", - " 'T_2025-10-01_discrete_bs_otm',\n", - " 'T_2025-10-02_discrete_bs_call',\n", - " 'T_2025-10-02_discrete_bs_put',\n", - " 'T_2025-10-02_discrete_bs_otm',\n", - " 'T_2025-10-03_discrete_bs_call',\n", - " 'T_2025-10-03_discrete_bs_put',\n", - " 'T_2025-10-03_discrete_bs_otm',\n", - " 'T_2025-10-06_discrete_bs_call',\n", - " 'T_2025-10-06_discrete_bs_put',\n", - " 'T_2025-10-06_discrete_bs_otm',\n", - " 'T_2025-10-07_discrete_bs_call',\n", - " 'T_2025-10-07_discrete_bs_put',\n", - " 'T_2025-10-07_discrete_bs_otm',\n", - " 'T_2025-10-08_discrete_bs_call',\n", - " 'T_2025-10-08_discrete_bs_put',\n", - " 'T_2025-10-08_discrete_bs_otm',\n", - " 'T_2025-10-09_discrete_bs_call',\n", - " 'T_2025-10-09_discrete_bs_put',\n", - " 'T_2025-10-09_discrete_bs_otm',\n", - " 'T_2025-10-10_discrete_bs_call',\n", - " 'T_2025-10-10_discrete_bs_put',\n", - " 'T_2025-10-10_discrete_bs_otm',\n", - " 'T_2025-10-14_discrete_bs_call',\n", - " 'T_2025-10-14_discrete_bs_put',\n", - " 'T_2025-10-14_discrete_bs_otm',\n", - " 'T_2025-10-15_discrete_bs_call',\n", - " 'T_2025-10-15_discrete_bs_put',\n", - " 'T_2025-10-15_discrete_bs_otm',\n", - " 'TSLA_2025-09-02_discrete_bs_call',\n", - " 'TSLA_2025-09-02_discrete_bs_put',\n", - " 'TSLA_2025-09-02_discrete_bs_otm',\n", - " 'TSLA_2025-09-03_discrete_bs_call',\n", - " 'TSLA_2025-09-03_discrete_bs_put',\n", - " 'TSLA_2025-09-03_discrete_bs_otm',\n", - " 'TSLA_2025-09-04_discrete_bs_call',\n", - " 'TSLA_2025-09-04_discrete_bs_put',\n", - " 'TSLA_2025-09-04_discrete_bs_otm',\n", - " 'TSLA_2025-09-05_discrete_bs_call',\n", - " 'TSLA_2025-09-05_discrete_bs_put',\n", - " 'TSLA_2025-09-05_discrete_bs_otm',\n", - " 'TSLA_2025-09-08_discrete_bs_call',\n", - " 'TSLA_2025-09-08_discrete_bs_put',\n", - " 'TSLA_2025-09-08_discrete_bs_otm',\n", - " 'TSLA_2025-09-09_discrete_bs_call',\n", - " 'TSLA_2025-09-09_discrete_bs_put',\n", - " 'TSLA_2025-09-09_discrete_bs_otm',\n", - " 'TSLA_2025-09-10_discrete_bs_call',\n", - " 'TSLA_2025-09-10_discrete_bs_put',\n", - " 'TSLA_2025-09-10_discrete_bs_otm',\n", - " 'TSLA_2025-09-11_discrete_bs_call',\n", - " 'TSLA_2025-09-11_discrete_bs_put',\n", - " 'TSLA_2025-09-11_discrete_bs_otm',\n", - " 'TSLA_2025-09-12_discrete_bs_call',\n", - " 'TSLA_2025-09-12_discrete_bs_put',\n", - " 'TSLA_2025-09-12_discrete_bs_otm',\n", - " 'TSLA_2025-09-15_discrete_bs_call',\n", - " 'TSLA_2025-09-15_discrete_bs_put',\n", - " 'TSLA_2025-09-15_discrete_bs_otm',\n", - " 'TSLA_2025-09-16_discrete_bs_call',\n", - " 'TSLA_2025-09-16_discrete_bs_put',\n", - " 'TSLA_2025-09-16_discrete_bs_otm',\n", - " 'TSLA_2025-09-17_discrete_bs_call',\n", - " 'TSLA_2025-09-17_discrete_bs_put',\n", - " 'TSLA_2025-09-17_discrete_bs_otm',\n", - " 'TSLA_2025-09-18_discrete_bs_call',\n", - " 'TSLA_2025-09-18_discrete_bs_put',\n", - " 'TSLA_2025-09-18_discrete_bs_otm',\n", - " 'TSLA_2025-09-19_discrete_bs_call',\n", - " 'TSLA_2025-09-19_discrete_bs_put',\n", - " 'TSLA_2025-09-19_discrete_bs_otm',\n", - " 'TSLA_2025-09-22_discrete_bs_call',\n", - " 'TSLA_2025-09-22_discrete_bs_put',\n", - " 'TSLA_2025-09-22_discrete_bs_otm',\n", - " 'TSLA_2025-09-23_discrete_bs_call',\n", - " 'TSLA_2025-09-23_discrete_bs_put',\n", - " 'TSLA_2025-09-23_discrete_bs_otm',\n", - " 'TSLA_2025-09-24_discrete_bs_call',\n", - " 'TSLA_2025-09-24_discrete_bs_put',\n", - " 'TSLA_2025-09-24_discrete_bs_otm',\n", - " 'TSLA_2025-09-25_discrete_bs_call',\n", - " 'TSLA_2025-09-25_discrete_bs_put',\n", - " 'TSLA_2025-09-25_discrete_bs_otm',\n", - " 'TSLA_2025-09-26_discrete_bs_call',\n", - " 'TSLA_2025-09-26_discrete_bs_put',\n", - " 'TSLA_2025-09-26_discrete_bs_otm',\n", - " 'TSLA_2025-09-29_discrete_bs_call',\n", - " 'TSLA_2025-09-29_discrete_bs_put',\n", - " 'TSLA_2025-09-29_discrete_bs_otm',\n", - " 'TSLA_2025-09-30_discrete_bs_call',\n", - " 'TSLA_2025-09-30_discrete_bs_put',\n", - " 'TSLA_2025-09-30_discrete_bs_otm',\n", - " 'TSLA_2025-10-01_discrete_bs_call',\n", - " 'TSLA_2025-10-01_discrete_bs_put',\n", - " 'TSLA_2025-10-01_discrete_bs_otm',\n", - " 'TSLA_2025-10-02_discrete_bs_call',\n", - " 'TSLA_2025-10-02_discrete_bs_put',\n", - " 'TSLA_2025-10-02_discrete_bs_otm',\n", - " 'TSLA_2025-10-03_discrete_bs_call',\n", - " 'TSLA_2025-10-03_discrete_bs_put',\n", - " 'TSLA_2025-10-03_discrete_bs_otm',\n", - " 'TSLA_2025-10-06_discrete_bs_call',\n", - " 'TSLA_2025-10-06_discrete_bs_put',\n", - " 'TSLA_2025-10-06_discrete_bs_otm',\n", - " 'TSLA_2025-10-07_discrete_bs_call',\n", - " 'TSLA_2025-10-07_discrete_bs_put',\n", - " 'TSLA_2025-10-07_discrete_bs_otm',\n", - " 'TSLA_2025-10-08_discrete_bs_call',\n", - " 'TSLA_2025-10-08_discrete_bs_put',\n", - " 'TSLA_2025-10-08_discrete_bs_otm',\n", - " 'TSLA_2025-10-09_discrete_bs_call',\n", - " 'TSLA_2025-10-09_discrete_bs_put',\n", - " 'TSLA_2025-10-09_discrete_bs_otm',\n", - " 'TSLA_2025-10-10_discrete_bs_call',\n", - " 'TSLA_2025-10-10_discrete_bs_put',\n", - " 'TSLA_2025-10-10_discrete_bs_otm',\n", - " 'TSLA_2025-10-13_discrete_bs_call',\n", - " 'TSLA_2025-10-13_discrete_bs_put',\n", - " 'TSLA_2025-10-13_discrete_bs_otm',\n", - " 'TSLA_2025-10-14_discrete_bs_call',\n", - " 'TSLA_2025-10-14_discrete_bs_put',\n", - " 'TSLA_2025-10-14_discrete_bs_otm',\n", - " 'TSLA_2025-10-15_discrete_bs_call',\n", - " 'TSLA_2025-10-15_discrete_bs_put',\n", - " 'TSLA_2025-10-15_discrete_bs_otm',\n", - " 'T_2025-05-01_discrete_bs_call',\n", - " 'T_2025-05-01_discrete_bs_put',\n", - " 'T_2025-05-01_discrete_bs_otm',\n", - " 'T_2025-05-02_discrete_bs_call',\n", - " 'T_2025-05-02_discrete_bs_put',\n", - " 'T_2025-05-02_discrete_bs_otm',\n", - " 'T_2025-05-05_discrete_bs_call',\n", - " 'T_2025-05-05_discrete_bs_put',\n", - " 'T_2025-05-05_discrete_bs_otm',\n", - " 'T_2025-05-06_discrete_bs_call',\n", - " 'T_2025-05-06_discrete_bs_put',\n", - " 'T_2025-05-06_discrete_bs_otm',\n", - " 'T_2025-05-07_discrete_bs_call',\n", - " 'T_2025-05-07_discrete_bs_put',\n", - " 'T_2025-05-07_discrete_bs_otm',\n", - " 'T_2025-05-08_discrete_bs_call',\n", - " 'T_2025-05-08_discrete_bs_put',\n", - " 'T_2025-05-08_discrete_bs_otm',\n", - " 'T_2025-05-09_discrete_bs_call',\n", - " 'T_2025-05-09_discrete_bs_put',\n", - " 'T_2025-05-09_discrete_bs_otm',\n", - " 'T_2025-05-12_discrete_bs_call',\n", - " 'T_2025-05-12_discrete_bs_put',\n", - " 'T_2025-05-12_discrete_bs_otm',\n", - " 'T_2025-05-13_discrete_bs_call',\n", - " 'T_2025-05-13_discrete_bs_put',\n", - " 'T_2025-05-13_discrete_bs_otm',\n", - " 'T_2025-05-14_discrete_bs_call',\n", - " 'T_2025-05-14_discrete_bs_put',\n", - " 'T_2025-05-14_discrete_bs_otm',\n", - " 'T_2025-05-15_discrete_bs_call',\n", - " 'T_2025-05-15_discrete_bs_put',\n", - " 'T_2025-05-15_discrete_bs_otm',\n", - " 'T_2025-05-16_discrete_bs_call',\n", - " 'T_2025-05-16_discrete_bs_put',\n", - " 'T_2025-05-16_discrete_bs_otm',\n", - " 'T_2025-05-20_discrete_bs_call',\n", - " 'T_2025-05-20_discrete_bs_put',\n", - " 'T_2025-05-20_discrete_bs_otm',\n", - " 'T_2025-05-21_discrete_bs_call',\n", - " 'T_2025-05-21_discrete_bs_put',\n", - " 'T_2025-05-21_discrete_bs_otm',\n", - " 'T_2025-05-22_discrete_bs_call',\n", - " 'T_2025-05-22_discrete_bs_put',\n", - " 'T_2025-05-22_discrete_bs_otm',\n", - " 'T_2025-05-23_discrete_bs_call',\n", - " 'T_2025-05-23_discrete_bs_put',\n", - " 'T_2025-05-23_discrete_bs_otm',\n", - " 'T_2025-05-27_discrete_bs_call',\n", - " 'T_2025-05-27_discrete_bs_put',\n", - " 'T_2025-05-27_discrete_bs_otm',\n", - " 'T_2025-05-28_discrete_bs_call',\n", - " 'T_2025-05-28_discrete_bs_put',\n", - " 'T_2025-05-28_discrete_bs_otm',\n", - " 'T_2025-05-29_discrete_bs_call',\n", - " 'T_2025-05-29_discrete_bs_put',\n", - " 'T_2025-05-29_discrete_bs_otm',\n", - " 'T_2025-05-30_discrete_bs_call',\n", - " 'T_2025-05-30_discrete_bs_put',\n", - " 'T_2025-05-30_discrete_bs_otm',\n", - " 'T_2025-06-02_discrete_bs_call',\n", - " 'T_2025-06-02_discrete_bs_put',\n", - " 'T_2025-06-02_discrete_bs_otm',\n", - " 'T_2025-06-03_discrete_bs_call',\n", - " 'T_2025-06-03_discrete_bs_put',\n", - " 'T_2025-06-03_discrete_bs_otm',\n", - " 'T_2025-06-04_discrete_bs_call',\n", - " 'T_2025-06-04_discrete_bs_put',\n", - " 'T_2025-06-04_discrete_bs_otm',\n", - " 'T_2025-06-05_discrete_bs_call',\n", - " 'T_2025-06-05_discrete_bs_put',\n", - " 'T_2025-06-05_discrete_bs_otm',\n", - " 'T_2025-06-06_discrete_bs_call',\n", - " 'T_2025-06-06_discrete_bs_put',\n", - " 'T_2025-06-06_discrete_bs_otm',\n", - " 'T_2025-06-09_discrete_bs_call',\n", - " 'T_2025-06-09_discrete_bs_put',\n", - " 'T_2025-06-09_discrete_bs_otm',\n", - " 'T_2025-06-10_discrete_bs_call',\n", - " 'T_2025-06-10_discrete_bs_put',\n", - " 'T_2025-06-10_discrete_bs_otm',\n", - " 'T_2025-06-11_discrete_bs_call',\n", - " 'T_2025-06-11_discrete_bs_put',\n", - " 'T_2025-06-11_discrete_bs_otm',\n", - " 'T_2025-06-12_discrete_bs_call',\n", - " 'T_2025-06-12_discrete_bs_put',\n", - " 'T_2025-06-12_discrete_bs_otm',\n", - " 'T_2025-06-13_discrete_bs_call',\n", - " 'T_2025-06-13_discrete_bs_put',\n", - " 'T_2025-06-13_discrete_bs_otm',\n", - " 'T_2025-06-16_discrete_bs_call',\n", - " 'T_2025-06-16_discrete_bs_put',\n", - " 'T_2025-06-16_discrete_bs_otm',\n", - " 'T_2025-06-17_discrete_bs_call',\n", - " 'T_2025-06-17_discrete_bs_put',\n", - " 'T_2025-06-17_discrete_bs_otm',\n", - " 'T_2025-06-18_discrete_bs_call',\n", - " 'T_2025-06-18_discrete_bs_put',\n", - " 'T_2025-06-18_discrete_bs_otm',\n", - " 'T_2025-06-20_discrete_bs_call',\n", - " 'T_2025-06-20_discrete_bs_put',\n", - " 'T_2025-06-20_discrete_bs_otm',\n", - " 'T_2025-06-23_discrete_bs_call',\n", - " 'T_2025-06-23_discrete_bs_put',\n", - " 'T_2025-06-23_discrete_bs_otm',\n", - " 'T_2025-06-24_discrete_bs_call',\n", - " 'T_2025-06-24_discrete_bs_put',\n", - " 'T_2025-06-24_discrete_bs_otm',\n", - " 'T_2025-06-25_discrete_bs_call',\n", - " 'T_2025-06-25_discrete_bs_put',\n", - " 'T_2025-06-25_discrete_bs_otm',\n", - " 'T_2025-06-26_discrete_bs_call',\n", - " 'T_2025-06-26_discrete_bs_put',\n", - " 'T_2025-06-26_discrete_bs_otm',\n", - " 'T_2025-06-27_discrete_bs_call',\n", - " 'T_2025-06-27_discrete_bs_put',\n", - " 'T_2025-06-27_discrete_bs_otm',\n", - " 'T_2025-06-30_discrete_bs_call',\n", - " 'T_2025-06-30_discrete_bs_put',\n", - " 'T_2025-06-30_discrete_bs_otm',\n", - " 'T_2025-07-01_discrete_bs_call',\n", - " 'T_2025-07-01_discrete_bs_put',\n", - " 'T_2025-07-01_discrete_bs_otm',\n", - " 'T_2025-07-02_discrete_bs_call',\n", - " 'T_2025-07-02_discrete_bs_put',\n", - " 'T_2025-07-02_discrete_bs_otm',\n", - " 'T_2025-07-03_discrete_bs_call',\n", - " 'T_2025-07-03_discrete_bs_put',\n", - " 'T_2025-07-03_discrete_bs_otm',\n", - " 'T_2025-07-07_discrete_bs_call',\n", - " 'T_2025-07-07_discrete_bs_put',\n", - " 'T_2025-07-07_discrete_bs_otm',\n", - " 'T_2025-07-08_discrete_bs_call',\n", - " 'T_2025-07-08_discrete_bs_put',\n", - " 'T_2025-07-08_discrete_bs_otm',\n", - " 'T_2025-07-09_discrete_bs_call',\n", - " 'T_2025-07-09_discrete_bs_put',\n", - " 'T_2025-07-09_discrete_bs_otm',\n", - " 'T_2025-07-10_discrete_bs_call',\n", - " 'T_2025-07-10_discrete_bs_put',\n", - " 'T_2025-07-10_discrete_bs_otm',\n", - " 'T_2025-07-11_discrete_bs_call',\n", - " 'T_2025-07-11_discrete_bs_put',\n", - " 'T_2025-07-11_discrete_bs_otm',\n", - " 'T_2025-07-14_discrete_bs_call',\n", - " 'T_2025-07-14_discrete_bs_put',\n", - " 'T_2025-07-14_discrete_bs_otm',\n", - " 'T_2025-07-15_discrete_bs_call',\n", - " 'T_2025-07-15_discrete_bs_put',\n", - " 'T_2025-07-15_discrete_bs_otm',\n", - " 'T_2025-07-16_discrete_bs_call',\n", - " 'T_2025-07-16_discrete_bs_put',\n", - " 'T_2025-07-16_discrete_bs_otm',\n", - " 'T_2025-07-17_discrete_bs_call',\n", - " 'T_2025-07-17_discrete_bs_put',\n", - " 'T_2025-07-17_discrete_bs_otm',\n", - " 'T_2025-07-18_discrete_bs_call',\n", - " 'T_2025-07-18_discrete_bs_put',\n", - " 'T_2025-07-18_discrete_bs_otm',\n", - " 'T_2025-07-21_discrete_bs_call',\n", - " 'T_2025-07-21_discrete_bs_put',\n", - " 'T_2025-07-21_discrete_bs_otm',\n", - " 'T_2025-07-22_discrete_bs_call',\n", - " 'T_2025-07-22_discrete_bs_put',\n", - " 'T_2025-07-22_discrete_bs_otm',\n", - " 'T_2025-07-23_discrete_bs_call',\n", - " 'T_2025-07-23_discrete_bs_put',\n", - " 'T_2025-07-23_discrete_bs_otm',\n", - " 'T_2025-07-24_discrete_bs_call',\n", - " 'T_2025-07-24_discrete_bs_put',\n", - " 'T_2025-07-24_discrete_bs_otm',\n", - " 'T_2025-07-25_discrete_bs_call',\n", - " 'T_2025-07-25_discrete_bs_put',\n", - " 'T_2025-07-25_discrete_bs_otm',\n", - " 'T_2025-07-28_discrete_bs_call',\n", - " 'T_2025-07-28_discrete_bs_put',\n", - " 'T_2025-07-28_discrete_bs_otm',\n", - " 'T_2025-07-29_discrete_bs_call',\n", - " 'T_2025-07-29_discrete_bs_put',\n", - " 'T_2025-07-29_discrete_bs_otm',\n", - " 'T_2025-07-30_discrete_bs_call',\n", - " 'T_2025-07-30_discrete_bs_put',\n", - " 'T_2025-07-30_discrete_bs_otm',\n", - " 'T_2025-07-31_discrete_bs_call',\n", - " 'T_2025-07-31_discrete_bs_put',\n", - " 'T_2025-07-31_discrete_bs_otm',\n", - " 'T_2025-08-01_discrete_bs_call',\n", - " 'T_2025-08-01_discrete_bs_put',\n", - " 'T_2025-08-01_discrete_bs_otm',\n", - " 'T_2025-08-04_discrete_bs_call',\n", - " 'T_2025-08-04_discrete_bs_put',\n", - " 'T_2025-08-04_discrete_bs_otm',\n", - " 'T_2025-08-05_discrete_bs_call',\n", - " 'T_2025-08-05_discrete_bs_put',\n", - " 'T_2025-08-05_discrete_bs_otm',\n", - " 'T_2025-08-06_discrete_bs_call',\n", - " 'T_2025-08-06_discrete_bs_put',\n", - " 'T_2025-08-06_discrete_bs_otm',\n", - " 'T_2025-08-07_discrete_bs_call',\n", - " 'T_2025-08-07_discrete_bs_put',\n", - " 'T_2025-08-07_discrete_bs_otm',\n", - " 'T_2025-08-08_discrete_bs_call',\n", - " 'T_2025-08-08_discrete_bs_put',\n", - " 'T_2025-08-08_discrete_bs_otm',\n", - " 'T_2025-08-11_discrete_bs_call',\n", - " 'T_2025-08-11_discrete_bs_put',\n", - " 'T_2025-08-11_discrete_bs_otm',\n", - " 'T_2025-08-12_discrete_bs_call',\n", - " 'T_2025-08-12_discrete_bs_put',\n", - " 'T_2025-08-12_discrete_bs_otm',\n", - " 'T_2025-08-13_discrete_bs_call',\n", - " 'T_2025-08-13_discrete_bs_put',\n", - " 'T_2025-08-13_discrete_bs_otm',\n", - " 'T_2025-08-14_discrete_bs_call',\n", - " 'T_2025-08-14_discrete_bs_put',\n", - " 'T_2025-08-14_discrete_bs_otm',\n", - " 'T_2025-08-15_discrete_bs_call',\n", - " 'T_2025-08-15_discrete_bs_put',\n", - " 'T_2025-08-15_discrete_bs_otm',\n", - " 'T_2025-08-18_discrete_bs_call',\n", - " 'T_2025-08-18_discrete_bs_put',\n", - " 'T_2025-08-18_discrete_bs_otm',\n", - " 'T_2025-08-19_discrete_bs_call',\n", - " 'T_2025-08-19_discrete_bs_put',\n", - " 'T_2025-08-19_discrete_bs_otm',\n", - " 'T_2025-08-20_discrete_bs_call',\n", - " 'T_2025-08-20_discrete_bs_put',\n", - " 'T_2025-08-20_discrete_bs_otm',\n", - " 'T_2025-08-21_discrete_bs_call',\n", - " 'T_2025-08-21_discrete_bs_put',\n", - " 'T_2025-08-21_discrete_bs_otm',\n", - " 'T_2025-08-22_discrete_bs_call',\n", - " 'T_2025-08-22_discrete_bs_put',\n", - " 'T_2025-08-22_discrete_bs_otm',\n", - " 'T_2025-08-25_discrete_bs_call',\n", - " 'T_2025-08-25_discrete_bs_put',\n", - " 'T_2025-08-25_discrete_bs_otm',\n", - " 'T_2025-08-26_discrete_bs_call',\n", - " 'T_2025-08-26_discrete_bs_put',\n", - " 'T_2025-08-26_discrete_bs_otm',\n", - " 'T_2025-08-27_discrete_bs_call',\n", - " 'T_2025-08-27_discrete_bs_put',\n", - " 'T_2025-08-27_discrete_bs_otm',\n", - " 'T_2025-08-28_discrete_bs_call',\n", - " 'T_2025-08-28_discrete_bs_put',\n", - " 'T_2025-08-28_discrete_bs_otm',\n", - " 'T_2025-08-29_discrete_bs_call',\n", - " 'T_2025-08-29_discrete_bs_put',\n", - " 'T_2025-08-29_discrete_bs_otm',\n", - " 'T_2025-05-19_discrete_bs_call',\n", - " 'T_2025-05-19_discrete_bs_put',\n", - " 'T_2025-05-19_discrete_bs_otm']" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "get_params_cache().keys()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "openbb_new_use", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.13" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/trade/optionlib/notebooks/svi_model.ipynb b/trade/optionlib/notebooks/svi_model.ipynb deleted file mode 100644 index fe6b8dc..0000000 --- a/trade/optionlib/notebooks/svi_model.ipynb +++ /dev/null @@ -1,14325 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The autoreload extension is already loaded. To reload it, use:\n", - " %reload_ext autoreload\n" - ] - } - ], - "source": [ - "%load_ext autoreload\n", - "%autoreload 2\n", - "from dotenv import load_dotenv\n", - "load_dotenv()\n", - "from module_test.raw_code.optionlib_2.vol.implied_vol import (\n", - " bsm_vol_est_brute_force,\n", - " bsm_vol_est_minimization,\n", - " vector_vol_estimation\n", - ")\n", - "from module_test.raw_code.optionlib_2.assets.forward import (\n", - " EquityForward, \n", - " time_distance_helper,\n", - " vectorized_market_forward_calc\n", - ")\n", - "from datetime import datetime\n", - "from dbase.DataAPI.ThetaData import retrieve_chain_bulk\n", - "from trade.helpers.helper import change_to_last_busday, retrieve_timeseries\n", - "import os\n", - " \n", - "from module_test.raw_code.optionlib_2.vol.implied_vol import (\n", - " estimate_crr_implied_volatility,\n", - " vol_est_brute_force_bjs_2002,\n", - " vector_vol_estimation\n", - ")\n", - "from module_test.raw_code.optionlib_2.assets.forward import (\n", - " EquityForward, \n", - " time_distance_helper,\n", - " get_vectorized_dividend_rate,\n", - " get_vectorized_dividend_scehdule\n", - ")\n", - "\n", - "from module_test.raw_code.optionlib_2.assets.dividend import (\n", - " vector_convert_to_time_frac\n", - ")\n", - "\n", - "from module_test.raw_code.optionlib_2.greeks.numerical.bjs2002 import (\n", - " bjs2002_numerical_greeks,\n", - ")\n", - "\n", - "from module_test.raw_code.optionlib_2.greeks.numerical.binomial import (\n", - " binomial_tree_greeks,\n", - ")\n", - "from datetime import datetime\n", - "from dbase.DataAPI.ThetaData import retrieve_chain_bulk\n", - "from trade.helpers.helper import change_to_last_busday, retrieve_timeseries\n", - "import os\n", - "import numpy as np\n", - "from trade.assets.rates import get_risk_free_rate_helper\n", - "from module_test.raw_code.optionlib_2.utils.batch_operation import vector_batch_processor\n", - "# os.environ['PROXY_URL'] = ''\n", - "from dbase.DataAPI.ThetaData import (\n", - " list_contracts,\n", - " retrieve_eod_ohlc,\n", - " retrieve_chain_bulk\n", - ")\n", - "def get_spot(tick, date):\n", - " return retrieve_timeseries(tick, date, date)['close'][0]\n", - "test_start, test_valuation_date = '2025-07-16', '2025-07-16'" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'2.2.0'" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import numpy as np\n", - "np.__version__" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "from pydantic import BaseModel, field_validator, computed_field, validate_call\n", - "from pydantic.dataclasses import dataclass" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'http://54.205.248.219:5500/thetadata'" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import pandas as pd\n", - "pd.options.plotting.backend = \"plotly\"\n", - "\n", - "from dotenv import load_dotenv \n", - "load_dotenv(override=True)\n", - "os.environ['PROXY_URL']" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "YF.download() has changed argument auto_adjust default to True\n", - "[get_engine] Creating engine for DB: securities_master, PID: 73606\n" - ] - } - ], - "source": [ - "ticks = ['AAPL', 'MSFT', 'GOOGL', 'AMZN', 'TSLA']\n", - "test_start, test_valuation_date = '2025-07-16', '2025-07-16'\n", - "def pick_random_option(tick, date):\n", - " contracts = list_contracts(tick, date)\n", - " # Pick a random contract from the list\n", - " contract = np.random.choice(contracts.index)\n", - " return contracts.iloc[contract]\n", - "\n", - "def get_option_eod_price(date, contract_series):\n", - " \"\"\"\n", - " Retrieves the end-of-day price for a given option contract on a specific date.\n", - " \n", - " Args:\n", - " date (datetime): The date for which to retrieve the price.\n", - " contract_series (pd.Series): The series containing option contract details.\n", - " \n", - " Returns:\n", - " float: The end-of-day price of the option contract.\n", - " \"\"\"\n", - " eod_data = retrieve_eod_ohlc(symbol=contract_series['root'],\n", - " end_date=date,\n", - " start_date=date,\n", - " exp=str(contract_series['expiration']),\n", - " right=contract_series['right'],\n", - " strike=contract_series['strike'],\n", - " )\n", - " return eod_data.Midpoint[0]\n", - "\n", - "def get_spot(tick, date):\n", - " return retrieve_timeseries(tick, date, date)['close'][0]\n", - "\n", - "# contract = pick_random_option(ticks[0], test_start)\n", - "# eod = get_option_eod_price(test_start, contract)\n", - "spot = retrieve_timeseries(ticks[0], test_start, test_start)['close'][0]\n", - "rates = get_risk_free_rate_helper()['annualized'][test_start]\n" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "aapl_chain=retrieve_chain_bulk(\n", - " 'AAPL',\n", - " 0,\n", - " change_to_last_busday(test_valuation_date),\n", - " change_to_last_busday(test_valuation_date),\n", - " '16:00'\n", - ")\n", - "S = get_spot('AAPL', (test_valuation_date))" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([210.8236422 , 210.99470237, 210.8236422 , ..., 210.48193779,\n", - " 217.46835885, 217.46835885], shape=(2428,))" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "aapl_chain = aapl_chain[aapl_chain['Expiration'] >= test_valuation_date]\n", - "valuation_dates = [test_valuation_date] * len(aapl_chain)\n", - "end_dates = aapl_chain['Expiration'].tolist()\n", - "r = [rates] * len(aapl_chain)\n", - "s = [S] * len(aapl_chain)\n", - "tickers = ['AAPL'] * len(aapl_chain)\n", - "F = vectorized_market_forward_calc(\n", - " ticks=tickers,\n", - " S=s,\n", - " valuation_dates=valuation_dates,\n", - " end_dates=end_dates,\n", - " r=r,\n", - " div_type='discrete'\n", - ")\n", - "F" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "T = [time_distance_helper(end_dates[i], valuation_dates[i]) for i in range(len(aapl_chain))]\n", - "q = get_vectorized_dividend_rate(\n", - " tickers=tickers,\n", - " spots=s,\n", - " valuation_dates=valuation_dates,\n", - ")\n", - "\n", - "\n", - "discrete_q = get_vectorized_dividend_scehdule(\n", - " tickers=['AAPL'] * len(aapl_chain),\n", - " valuation_dates=[test_valuation_date] * len(aapl_chain),\n", - " end_dates=aapl_chain['Expiration'].tolist(),\n", - " start_dates=[test_valuation_date] * len(aapl_chain),\n", - ")\n", - "\n", - "discrete_q_convert = vector_convert_to_time_frac(\n", - " discrete_q, \n", - " valuation_dates=[test_valuation_date] * len(aapl_chain), \n", - " end_dates=aapl_chain['Expiration'].tolist(), \n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "params = list(zip(\n", - " F, \n", - " aapl_chain['Strike'], \n", - " T,\n", - " r, \n", - " aapl_chain['Midpoint'], \n", - " aapl_chain['Right'].str.lower()\n", - "))\n" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
RootExpirationStrikeRightBid_sizeCloseBidAsk_sizeCloseAskDateMidpointWeighted_midpointSmoneyness
datetime
2025-07-16AAPL2025-08-22215.0P19.753810.15202507169.95010.139744209.9217681.024191
2025-07-16AAPL2025-08-29215.0C26.2516.40202507166.3256.300000209.9217681.024191
2025-07-16AAPL2025-08-22215.0C25.6515.75202507165.7005.683333209.9217681.024191
2025-07-16AAPL2025-08-29215.0P249.902310.602025071610.25010.242553209.9217681.024191
2025-07-16AAPL2025-09-19215.0P811.25111.402025071611.32511.266667209.9217681.024191
..........................................
2025-07-16AAPL2025-07-25215.0P45.90306.10202507166.0006.076471209.9217681.024191
2025-07-16AAPL2025-08-08215.0C64.45124.55202507164.5004.516667209.9217681.024191
2025-07-16AAPL2025-08-08215.0P48.5568.85202507168.7008.730000209.9217681.024191
2025-07-16AAPL2026-06-18210.0P1318.402318.702025071618.55018.591667209.9217681.000373
2025-07-16AAPL2026-06-18210.0C125.40225.602025071625.50025.533333209.9217681.000373
\n", - "

2428 rows × 13 columns

\n", - "
" - ], - "text/plain": [ - " Root Expiration Strike Right Bid_size CloseBid Ask_size \\\n", - "datetime \n", - "2025-07-16 AAPL 2025-08-22 215.0 P 1 9.75 38 \n", - "2025-07-16 AAPL 2025-08-29 215.0 C 2 6.25 1 \n", - "2025-07-16 AAPL 2025-08-22 215.0 C 2 5.65 1 \n", - "2025-07-16 AAPL 2025-08-29 215.0 P 24 9.90 23 \n", - "2025-07-16 AAPL 2025-09-19 215.0 P 8 11.25 1 \n", - "... ... ... ... ... ... ... ... \n", - "2025-07-16 AAPL 2025-07-25 215.0 P 4 5.90 30 \n", - "2025-07-16 AAPL 2025-08-08 215.0 C 6 4.45 12 \n", - "2025-07-16 AAPL 2025-08-08 215.0 P 4 8.55 6 \n", - "2025-07-16 AAPL 2026-06-18 210.0 P 13 18.40 23 \n", - "2025-07-16 AAPL 2026-06-18 210.0 C 1 25.40 2 \n", - "\n", - " CloseAsk Date Midpoint Weighted_midpoint S \\\n", - "datetime \n", - "2025-07-16 10.15 20250716 9.950 10.139744 209.921768 \n", - "2025-07-16 6.40 20250716 6.325 6.300000 209.921768 \n", - "2025-07-16 5.75 20250716 5.700 5.683333 209.921768 \n", - "2025-07-16 10.60 20250716 10.250 10.242553 209.921768 \n", - "2025-07-16 11.40 20250716 11.325 11.266667 209.921768 \n", - "... ... ... ... ... ... \n", - "2025-07-16 6.10 20250716 6.000 6.076471 209.921768 \n", - "2025-07-16 4.55 20250716 4.500 4.516667 209.921768 \n", - "2025-07-16 8.85 20250716 8.700 8.730000 209.921768 \n", - "2025-07-16 18.70 20250716 18.550 18.591667 209.921768 \n", - "2025-07-16 25.60 20250716 25.500 25.533333 209.921768 \n", - "\n", - " moneyness \n", - "datetime \n", - "2025-07-16 1.024191 \n", - "2025-07-16 1.024191 \n", - "2025-07-16 1.024191 \n", - "2025-07-16 1.024191 \n", - "2025-07-16 1.024191 \n", - "... ... \n", - "2025-07-16 1.024191 \n", - "2025-07-16 1.024191 \n", - "2025-07-16 1.024191 \n", - "2025-07-16 1.000373 \n", - "2025-07-16 1.000373 \n", - "\n", - "[2428 rows x 13 columns]" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "aapl_chain['S'] = S\n", - "aapl_chain['moneyness'] = aapl_chain['Strike'] / S\n", - "aapl_chain" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "datetime\n", - "2025-07-16 0.101300\n", - "2025-07-16 0.120465\n", - "2025-07-16 0.101300\n", - "2025-07-16 0.120465\n", - "2025-07-16 0.177960\n", - " ... \n", - "2025-07-16 0.024641\n", - "2025-07-16 0.062971\n", - "2025-07-16 0.062971\n", - "2025-07-16 0.922656\n", - "2025-07-16 0.922656\n", - "Name: T, Length: 2428, dtype: float64" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "T = [time_distance_helper(end_dates[i], valuation_dates[i]) for i in range(len(aapl_chain))]\n", - "aapl_chain['T'] = T\n", - "aapl_chain['F'] = F\n", - "aapl_chain['log_moneyness'] = np.log(aapl_chain['F']/aapl_chain['Strike'])\n", - "aapl_chain['T']" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "full_vol = vector_vol_estimation(bsm_vol_est_brute_force, params)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "aapl_chain['bs_vol'] = full_vol" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Binomial Tree Vol" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "from module_test.raw_code.optionlib_2.utils.batch_operation import vector_batch_processor\n", - "crr_vector_params_discrete = list(zip(\n", - " s, aapl_chain['Strike'].tolist(), ## Spot, Strike\n", - " T, r, ## Time to Maturity, Risk Free Rate\n", - " aapl_chain['Midpoint'], ## Midpoint Price\n", - " discrete_q_convert, ## Discrete Dividend Schedules\n", - " aapl_chain['Right'].str.lower().tolist(), ## Option Type\n", - " [250] * len(aapl_chain), ## Number of Steps\n", - " ['discrete'] * len(aapl_chain), ## Dividend Type\n", - " [True] * len(aapl_chain),)) ## American==True, European==False\n", - "\n", - "crr_vector_params_cont = list(zip(\n", - " s, aapl_chain['Strike'].tolist(), ## Spot, Strike\n", - " T, r, ## Time to Maturity, Risk Free Rate\n", - " aapl_chain['Midpoint'], ## Midpoint Price\n", - " q, ## Discrete Dividend Schedules\n", - " aapl_chain['Right'].str.lower().tolist(), ## Option Type\n", - " [250] * len(aapl_chain), ## Number of Steps\n", - " ['continuous'] * len(aapl_chain), ## Dividend Type\n", - " [True] * len(aapl_chain),)) ## American==True, European==False" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Starting Discrete\n", - "Finished Discrete in 23.947382926940918 seconds\n", - "Starting Continuous\n", - "Finished Discrete in 17.992415189743042 seconds\n" - ] - } - ], - "source": [ - "import time\n", - "start = time.time()\n", - "print(\"Starting Discrete\")\n", - "vol_batch_crr_discrete = vector_batch_processor(\n", - " vector_vol_estimation,\n", - " estimate_crr_implied_volatility,\n", - " crr_vector_params_discrete,\n", - ")\n", - "time_taken = (time.time() - start)\n", - "print_agg = \"minutes\" if time_taken > 60 else \"seconds\"\n", - "print_time = time_taken / 60 if time_taken > 60 else time_taken\n", - "print(f\"Finished Discrete in {print_time} {print_agg}\")\n", - "\n", - "print(f\"Starting Continuous\")\n", - "start = time.time()\n", - "vol_batch_crr_cont = vector_batch_processor(\n", - " vector_vol_estimation,\n", - " estimate_crr_implied_volatility,\n", - " crr_vector_params_cont,\n", - ")\n", - "time_taken = (time.time() - start)\n", - "print_agg = \"minutes\" if time_taken > 60 else \"seconds\"\n", - "print_time = time_taken / 60 if time_taken > 60 else time_taken\n", - "print(f\"Finished Discrete in {print_time} {print_agg}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\n", - "['2025-07-18 00:00:00', '2025-07-25 00:00:00', '2025-08-01 00:00:00',\n", - " '2025-08-08 00:00:00', '2025-08-15 00:00:00', '2025-08-22 00:00:00',\n", - " '2025-08-29 00:00:00', '2025-09-19 00:00:00', '2025-10-17 00:00:00',\n", - " '2025-11-21 00:00:00', '2025-12-19 00:00:00', '2026-01-16 00:00:00',\n", - " '2026-02-20 00:00:00', '2026-03-20 00:00:00', '2026-05-15 00:00:00',\n", - " '2026-06-18 00:00:00', '2026-09-18 00:00:00', '2026-12-18 00:00:00',\n", - " '2027-01-15 00:00:00', '2027-06-17 00:00:00', '2027-12-17 00:00:00']\n", - "Length: 21, dtype: datetime64[ns]" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "aapl_chain['crr_vol_discrete'] = vol_batch_crr_discrete\n", - "aapl_chain['crr_vol_continuous'] = vol_batch_crr_cont\n", - "aapl_chain.Expiration.sort_values().unique()" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "hovertemplate": "variable=bs_vol
Strike=%{x}
value=%{y}", - "legendgroup": "bs_vol", - "line": { - "color": "#636efa", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "bs_vol", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": { - "bdata": "AAAAAACAW0AAAAAAAABeQAAAAAAAQF9AAAAAAABAYEAAAAAAAOBgQAAAAAAAgGFAAAAAAAAgYkAAAAAAAMBiQAAAAAAAYGNAAAAAAAAAZEAAAAAAAKBkQAAAAAAAQGVAAAAAAADgZUAAAAAAAIBmQAAAAAAAIGdAAAAAAABwZ0AAAAAAAMBnQAAAAAAAEGhAAAAAAABgaEAAAAAAALBoQAAAAAAAAGlAAAAAAABQaUAAAAAAAKBpQAAAAAAA8GlAAAAAAABAakAAAAAAAJBqQAAAAAAA4GpAAAAAAAAwa0AAAAAAAIBrQAAAAAAA0GtAAAAAAAAgbEAAAAAAAHBsQAAAAAAAwGxAAAAAAAAQbUAAAAAAAGBtQAAAAAAAAG5AAAAAAACgbkAAAAAAAEBvQAAAAAAA4G9AAAAAAABAcEAAAAAAAJBwQAAAAAAA4HBAAAAAAAAwcUAAAAAAAIBxQAAAAAAA0HFAAAAAAAAgckAAAAAAAHByQAAAAAAAwHJAAAAAAAAQc0AAAAAAAGBzQAAAAAAAsHNAAAAAAAAAdEAAAAAAAFB0QA==", - "dtype": "f8" - }, - "xaxis": "x", - "y": { - "bdata": "Z4u3wVD49j/b/zLiL9/3P7djjcmOPfQ/fUBEpOxg8z+BoBeRHyfyPz3TFc7y4+8/Pbd9YadP8D9obcFYOObqP6ZkefnJ/Ok/Q87GJ1+N5T/zZI6mMgHjP4P0E8dQheI/cKN2h2iW2T/GRENQnSnfP2UQDVvYg9w/2oLfi0Rn2j9uRE/D+oPZPziZom0Shtg/R3kUrPkA2D8Bj85TvHXXP4KyfcSv8tY/V0G9B1pj1j+LdXm2TTbWP8CpNWVBCdY/zSqA37px1T9SDH7YiRPVP2rHtOuV6tQ/0y8tSX2Q1D+xmTFhTF3UP1gRK0JMMtQ/ciuJGcYb1D/mze0PQDDUP1pwUga6RNQ/CyI4gEyI1D/cCvIdouzUP37cZVlNtdU/sijr6seg1j+yQLTNTrnXPziZom0Shtg//l85VVyU2T/8GNtzdZraP+N1bUPw29s/qSQ7SLPR2z+3ND9MqH3dP/42TodsId8/BXSV43ld4D9kja3dfzPgP6Iok9Lb7uA/+zz+Yh+m4T9xyu6OSlniP87Pj4WvHec/KkMi2mDn5z9d0FscUl7kPw==", - "dtype": "f8" - }, - "yaxis": "y" - }, - { - "hovertemplate": "variable=crr_vol_discrete
Strike=%{x}
value=%{y}", - "legendgroup": "crr_vol_discrete", - "line": { - "color": "#EF553B", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "crr_vol_discrete", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": { - "bdata": "AAAAAACAW0AAAAAAAABeQAAAAAAAQF9AAAAAAABAYEAAAAAAAOBgQAAAAAAAgGFAAAAAAAAgYkAAAAAAAMBiQAAAAAAAYGNAAAAAAAAAZEAAAAAAAKBkQAAAAAAAQGVAAAAAAADgZUAAAAAAAIBmQAAAAAAAIGdAAAAAAABwZ0AAAAAAAMBnQAAAAAAAEGhAAAAAAABgaEAAAAAAALBoQAAAAAAAAGlAAAAAAABQaUAAAAAAAKBpQAAAAAAA8GlAAAAAAABAakAAAAAAAJBqQAAAAAAA4GpAAAAAAAAwa0AAAAAAAIBrQAAAAAAA0GtAAAAAAAAgbEAAAAAAAHBsQAAAAAAAwGxAAAAAAAAQbUAAAAAAAGBtQAAAAAAAAG5AAAAAAACgbkAAAAAAAEBvQAAAAAAA4G9AAAAAAABAcEAAAAAAAJBwQAAAAAAA4HBAAAAAAAAwcUAAAAAAAIBxQAAAAAAA0HFAAAAAAAAgckAAAAAAAHByQAAAAAAAwHJAAAAAAAAQc0AAAAAAAGBzQAAAAAAAsHNAAAAAAAAAdEAAAAAAAFB0QA==", - "dtype": "f8" - }, - "xaxis": "x", - "y": { - "bdata": "tjCN0ZEF9z9gT1AlSub3P3f3Uq07P/Q/ZEivB9to8z+jkjwhxijyP7ZjmWpp5+8/gLMPdsdQ8D/0hc8IP/HqP4g3lgxjBuo/a1G9NQmT5T9Y3uRBOATjP7gsNmPah+I/ItBnCGih2T9tCsrQQDPfPzeL0/Kvg9w/CiXBnfBl2j/sE5R0GIHZP100M3A4gdg/Y3xqkHn81z8Peur0+3LXP3eaKP2f9NY/SwsksAVk1j982E2L0zHWPxfEzDBPBdY/MUkyLTx21T/TGwGleA/VP4eewjsM6dQ/X6cWPoqQ1D8O+KzXd1jUP7/See30N9Q/sUrtHZ0Z1D8uRUIB7S3UP00RFmSISdQ/JhgZEG6Q1D/XnK1DOPfUP4vfuloUvdU/j+TvTQCk1j+PL9JVDMHXP/z8CCgOk9g/U0PHV/ah2T9sGo/cFq3aP2Cncw457Ns/YpQgVLPf2z8iE482OY3dP55LuDHoMt8//iwTtIxo4D9GdHFgvT/gP4tmuKoD+uA/2FrPiySx4T9w4/2IQWXiP40irNjPK+c/jml95zDz5z9BAtHMcnDkPw==", - "dtype": "f8" - }, - "yaxis": "y" - }, - { - "hovertemplate": "variable=crr_vol_continuous
Strike=%{x}
value=%{y}", - "legendgroup": "crr_vol_continuous", - "line": { - "color": "#00cc96", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "crr_vol_continuous", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": { - "bdata": "AAAAAACAW0AAAAAAAABeQAAAAAAAQF9AAAAAAABAYEAAAAAAAOBgQAAAAAAAgGFAAAAAAAAgYkAAAAAAAMBiQAAAAAAAYGNAAAAAAAAAZEAAAAAAAKBkQAAAAAAAQGVAAAAAAADgZUAAAAAAAIBmQAAAAAAAIGdAAAAAAABwZ0AAAAAAAMBnQAAAAAAAEGhAAAAAAABgaEAAAAAAALBoQAAAAAAAAGlAAAAAAABQaUAAAAAAAKBpQAAAAAAA8GlAAAAAAABAakAAAAAAAJBqQAAAAAAA4GpAAAAAAAAwa0AAAAAAAIBrQAAAAAAA0GtAAAAAAAAgbEAAAAAAAHBsQAAAAAAAwGxAAAAAAAAQbUAAAAAAAGBtQAAAAAAAAG5AAAAAAACgbkAAAAAAAEBvQAAAAAAA4G9AAAAAAABAcEAAAAAAAJBwQAAAAAAA4HBAAAAAAAAwcUAAAAAAAIBxQAAAAAAA0HFAAAAAAAAgckAAAAAAAHByQAAAAAAAwHJAAAAAAAAQc0AAAAAAAGBzQAAAAAAAsHNAAAAAAAAAdEAAAAAAAFB0QA==", - "dtype": "f8" - }, - "xaxis": "x", - "y": { - "bdata": "HzNrSRCG9z/6KgStdy34P8o+4m+Am/Q/9gtsfaev8z/LZcjKFG7yPzVNFxizSvA/ieBBJqiF8D9rfItu1nzrP81Mi1Brdeo/hKgIjgMk5j87Qbfu35fjP2y29Y/h6eI/yL+6fUZO2z8xAptN1a/fP5yC2/Zv6Nw/yVKMVEPJ2j8R0mUESNPZP3tcCOsLxtg/LQaJd0w22D/TJ4SF+aPXP4bB3dlCHtc/DHZULVOF1j+OIQulsE7WPx/rTKROHtY/k5u/qd2L1T9FegZrYCLVP9q5+niA+dQ/dDeFfKOf1D/dzgp8mGXUP0mhlZdKQ9Q/Y27E17Ek1D9TgCvWujfUP6gEKu4sUtQ/hKlOOfWY1D/ulLCMhf/UPwo1sobWw9U/fy2SZeiq1j9epjeZCcfXPxfsqqfhmdg/2T6kCHWo2T+jT0GmfrPaP9aHOasu8ds/bQYGgw3l2z8hWQqYQ5LdP3Ykhn2vN98/zTrUStBq4D9NwErmW0LgPwe1fvuC/OA/IiAfr4iz4T+vhLW8jGfiPxkJtCT5Luc/kAQBSj325z+BJxKJfnLkPw==", - "dtype": "f8" - }, - "yaxis": "y" - } - ], - "layout": { - "legend": { - "title": { - "text": "variable" - }, - "tracegroupgap": 0 - }, - "margin": { - "t": 60 - }, - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermap": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermap" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "xaxis": { - "anchor": "y", - "domain": [ - 0, - 1 - ], - "title": { - "text": "Strike" - } - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0, - 1 - ], - "title": { - "text": "value" - } - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - " 'crr_vol_discrete', 'crr_vol_continuous'\n", - "aapl_chain[(aapl_chain.Expiration=='2025-08-01')&\n", - " ((aapl_chain.Right=='C'))].sort_values('Strike').head(60)\\\n", - " .plot(x='Strike', y=['bs_vol',\n", - " 'crr_vol_discrete', \n", - " 'crr_vol_continuous'], kind='line')" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "UPPER_BOUND_MONEYENESS = 1.5\n", - "LOWER_BOUND_MONEYENESS = 0.5\n", - "DTE_MIN_THRESHOLD = 0\n", - "DTE_MAX_THRESHOLD = 730\n", - "DUMAS_WIDTH =0.75\n", - "\n", - "aapl_chain['spot'] = S\n", - "aapl_chain['vol'] = aapl_chain['crr_vol_discrete']\n", - "aapl_chain['r'] = rates\n", - "aapl_chain['q'] = q\n", - "aapl_chain['price'] = aapl_chain['Midpoint']\n", - "tgt_right = 'P'\n", - "\n", - "aapl_chain['DTE'] = (aapl_chain['Expiration'] - aapl_chain.index).dt.days\n", - "aapl_chain_clipped_lab = aapl_chain[\n", - " (aapl_chain['DTE'] >= DTE_MIN_THRESHOLD) &\n", - " (aapl_chain['DTE'] <= DTE_MAX_THRESHOLD) &\n", - " (aapl_chain['moneyness'] <= UPPER_BOUND_MONEYENESS) &\n", - " (aapl_chain['moneyness'] >= LOWER_BOUND_MONEYENESS) \n", - "].copy()\n" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
RootExpirationStrikeRightBid_sizeCloseBidAsk_sizeCloseAskDateMidpoint...log_moneynessbs_volcrr_vol_discretecrr_vol_continuousspotvolrqpriceDTE
datetime
2025-07-16AAPL2025-08-22215.0P19.753810.15202507169.950...-0.0196160.2858250.2821860.280391209.9217680.2821860.042320.0048119.95037
2025-07-16AAPL2025-08-29215.0P249.902310.602025071610.250...-0.0188050.2762020.2723480.270431209.9217680.2723480.042320.00481110.25044
2025-07-16AAPL2025-09-19215.0P811.25111.402025071611.325...-0.0163720.2665790.2614820.259322209.9217680.2614820.042320.00481111.32565
2025-07-16AAPL2025-11-21215.0P6914.35714.602025071614.475...-0.0103170.2687030.2611060.261428209.9217680.2611060.042320.00481114.475128
2025-07-16AAPL2025-10-17215.0P512.551312.702025071612.625...-0.0143730.2599550.2532620.254413209.9217680.2532620.042320.00481112.62593
..................................................................
2025-07-16AAPL2026-03-20210.0P3315.903516.252025071616.075...0.0257590.2750770.2659180.266681209.9217680.2659180.042320.00481116.075247
2025-07-16AAPL2026-05-15210.0P1317.507018.202025071617.850...0.0310060.2799510.2694630.270984209.9217680.2694630.042320.00481117.850303
2025-07-16AAPL2025-07-25215.0P45.90306.10202507166.000...-0.0228600.2227110.2189570.217674209.9217680.2189570.042320.0048116.0009
2025-07-16AAPL2025-08-08215.0P48.5568.85202507168.700...-0.0212380.2913240.2880680.286563209.9217680.2880680.042320.0048118.70023
2025-07-16AAPL2026-06-18210.0P1318.402318.702025071618.550...0.0349460.2795760.2684180.269509209.9217680.2684180.042320.00481118.550337
\n", - "

804 rows × 25 columns

\n", - "
" - ], - "text/plain": [ - " Root Expiration Strike Right Bid_size CloseBid Ask_size \\\n", - "datetime \n", - "2025-07-16 AAPL 2025-08-22 215.0 P 1 9.75 38 \n", - "2025-07-16 AAPL 2025-08-29 215.0 P 24 9.90 23 \n", - "2025-07-16 AAPL 2025-09-19 215.0 P 8 11.25 1 \n", - "2025-07-16 AAPL 2025-11-21 215.0 P 69 14.35 7 \n", - "2025-07-16 AAPL 2025-10-17 215.0 P 5 12.55 13 \n", - "... ... ... ... ... ... ... ... \n", - "2025-07-16 AAPL 2026-03-20 210.0 P 33 15.90 35 \n", - "2025-07-16 AAPL 2026-05-15 210.0 P 13 17.50 70 \n", - "2025-07-16 AAPL 2025-07-25 215.0 P 4 5.90 30 \n", - "2025-07-16 AAPL 2025-08-08 215.0 P 4 8.55 6 \n", - "2025-07-16 AAPL 2026-06-18 210.0 P 13 18.40 23 \n", - "\n", - " CloseAsk Date Midpoint ... log_moneyness bs_vol \\\n", - "datetime ... \n", - "2025-07-16 10.15 20250716 9.950 ... -0.019616 0.285825 \n", - "2025-07-16 10.60 20250716 10.250 ... -0.018805 0.276202 \n", - "2025-07-16 11.40 20250716 11.325 ... -0.016372 0.266579 \n", - "2025-07-16 14.60 20250716 14.475 ... -0.010317 0.268703 \n", - "2025-07-16 12.70 20250716 12.625 ... -0.014373 0.259955 \n", - "... ... ... ... ... ... ... \n", - "2025-07-16 16.25 20250716 16.075 ... 0.025759 0.275077 \n", - "2025-07-16 18.20 20250716 17.850 ... 0.031006 0.279951 \n", - "2025-07-16 6.10 20250716 6.000 ... -0.022860 0.222711 \n", - "2025-07-16 8.85 20250716 8.700 ... -0.021238 0.291324 \n", - "2025-07-16 18.70 20250716 18.550 ... 0.034946 0.279576 \n", - "\n", - " crr_vol_discrete crr_vol_continuous spot vol \\\n", - "datetime \n", - "2025-07-16 0.282186 0.280391 209.921768 0.282186 \n", - "2025-07-16 0.272348 0.270431 209.921768 0.272348 \n", - "2025-07-16 0.261482 0.259322 209.921768 0.261482 \n", - "2025-07-16 0.261106 0.261428 209.921768 0.261106 \n", - "2025-07-16 0.253262 0.254413 209.921768 0.253262 \n", - "... ... ... ... ... \n", - "2025-07-16 0.265918 0.266681 209.921768 0.265918 \n", - "2025-07-16 0.269463 0.270984 209.921768 0.269463 \n", - "2025-07-16 0.218957 0.217674 209.921768 0.218957 \n", - "2025-07-16 0.288068 0.286563 209.921768 0.288068 \n", - "2025-07-16 0.268418 0.269509 209.921768 0.268418 \n", - "\n", - " r q price DTE \n", - "datetime \n", - "2025-07-16 0.04232 0.004811 9.950 37 \n", - "2025-07-16 0.04232 0.004811 10.250 44 \n", - "2025-07-16 0.04232 0.004811 11.325 65 \n", - "2025-07-16 0.04232 0.004811 14.475 128 \n", - "2025-07-16 0.04232 0.004811 12.625 93 \n", - "... ... ... ... ... \n", - "2025-07-16 0.04232 0.004811 16.075 247 \n", - "2025-07-16 0.04232 0.004811 17.850 303 \n", - "2025-07-16 0.04232 0.004811 6.000 9 \n", - "2025-07-16 0.04232 0.004811 8.700 23 \n", - "2025-07-16 0.04232 0.004811 18.550 337 \n", - "\n", - "[804 rows x 25 columns]" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "len(aapl_chain_clipped_lab)\n", - "aapl_chain_clipped_lab.vol.min()\n", - "aapl_chain_clipped_lab[aapl_chain_clipped_lab.Right=='P']" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[get_engine] Creating engine for DB: vol_surface, PID: 73606\n", - "SurfaceLab built in 0.4365405480066935 minutes\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2025-10-12 18:06:08 SQLHelpers.py ERROR: Rows with at least one NA: 1\n", - "Rows inserted into svi_jw_params: 0\r" - ] - } - ], - "source": [ - "from trade.models.VolSurface import SurfaceLab\n", - "import time\n", - "## TO-DO: Fix Dumas model to accept some DTE will be missing\n", - "## TO-DO: Extend SurfaceLab/Manager to have Plot. Get's info from the model\n", - "## TO-DO: Improve predict: strike_type, strikes, exp in str, use F price for fitting\n", - "## TO-DO: Speed up the forward price, div yield calculation.\n", - "start = time.time()\n", - "lab = SurfaceLab(\n", - " tick = 'AAPL',\n", - " date = datetime.strptime(test_valuation_date, '%Y-%m-%d'),\n", - " full_chain= aapl_chain_clipped_lab,\n", - " dumas_width= 0.25,\n", - " force_build=True,\n", - ")\n", - "print(f\"SurfaceLab built in {(time.time() - start)/60} minutes\")" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "np.float64(0.0026296811554427347)" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "np.sqrt(lab.manager.call_builder.svi_models[5].svi_mse1)" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
rootexpirationstrikerightbid_sizeclosebidask_sizecloseaskdatemidpoint...bs_volcrr_vol_discretecrr_vol_continuousspotvolrqpricedtebuild_date
datetime
2025-07-16AAPL2025-08-22215.0P19.753810.15202507169.950...0.2858250.2821860.280391209.9217680.2821860.042320.0048119.950372025-07-16
2025-07-16AAPL2025-08-29215.0C26.2516.40202507166.325...0.2783260.2785070.280348209.9217680.2785070.042320.0048116.325442025-07-16
2025-07-16AAPL2025-08-22215.0C25.6515.75202507165.700...0.2824510.2824790.284181209.9217680.2824790.042320.0048115.700372025-07-16
2025-07-16AAPL2025-08-29215.0P249.902310.602025071610.250...0.2762020.2723480.270431209.9217680.2723480.042320.00481110.250442025-07-16
2025-07-16AAPL2025-09-19215.0P811.25111.402025071611.325...0.2665790.2614820.259322209.9217680.2614820.042320.00481111.325652025-07-16
..................................................................
2025-07-16AAPL2025-07-25215.0P45.90306.10202507166.000...0.2227110.2189570.217674209.9217680.2189570.042320.0048116.00092025-07-16
2025-07-16AAPL2025-08-08215.0C64.45124.55202507164.500...0.3064470.3061050.307368209.9217680.3061050.042320.0048114.500232025-07-16
2025-07-16AAPL2025-08-08215.0P48.5568.85202507168.700...0.2913240.2880680.286563209.9217680.2880680.042320.0048118.700232025-07-16
2025-07-16AAPL2026-06-18210.0P1318.402318.702025071618.550...0.2795760.2684180.269509209.9217680.2684180.042320.00481118.5503372025-07-16
2025-07-16AAPL2026-06-18210.0C125.40225.602025071625.500...0.2765770.2754560.278010209.9217680.2754560.042320.00481125.5003372025-07-16
\n", - "

1608 rows × 26 columns

\n", - "
" - ], - "text/plain": [ - " root expiration strike right bid_size closebid ask_size \\\n", - "datetime \n", - "2025-07-16 AAPL 2025-08-22 215.0 P 1 9.75 38 \n", - "2025-07-16 AAPL 2025-08-29 215.0 C 2 6.25 1 \n", - "2025-07-16 AAPL 2025-08-22 215.0 C 2 5.65 1 \n", - "2025-07-16 AAPL 2025-08-29 215.0 P 24 9.90 23 \n", - "2025-07-16 AAPL 2025-09-19 215.0 P 8 11.25 1 \n", - "... ... ... ... ... ... ... ... \n", - "2025-07-16 AAPL 2025-07-25 215.0 P 4 5.90 30 \n", - "2025-07-16 AAPL 2025-08-08 215.0 C 6 4.45 12 \n", - "2025-07-16 AAPL 2025-08-08 215.0 P 4 8.55 6 \n", - "2025-07-16 AAPL 2026-06-18 210.0 P 13 18.40 23 \n", - "2025-07-16 AAPL 2026-06-18 210.0 C 1 25.40 2 \n", - "\n", - " closeask date midpoint ... bs_vol crr_vol_discrete \\\n", - "datetime ... \n", - "2025-07-16 10.15 20250716 9.950 ... 0.285825 0.282186 \n", - "2025-07-16 6.40 20250716 6.325 ... 0.278326 0.278507 \n", - "2025-07-16 5.75 20250716 5.700 ... 0.282451 0.282479 \n", - "2025-07-16 10.60 20250716 10.250 ... 0.276202 0.272348 \n", - "2025-07-16 11.40 20250716 11.325 ... 0.266579 0.261482 \n", - "... ... ... ... ... ... ... \n", - "2025-07-16 6.10 20250716 6.000 ... 0.222711 0.218957 \n", - "2025-07-16 4.55 20250716 4.500 ... 0.306447 0.306105 \n", - "2025-07-16 8.85 20250716 8.700 ... 0.291324 0.288068 \n", - "2025-07-16 18.70 20250716 18.550 ... 0.279576 0.268418 \n", - "2025-07-16 25.60 20250716 25.500 ... 0.276577 0.275456 \n", - "\n", - " crr_vol_continuous spot vol r q \\\n", - "datetime \n", - "2025-07-16 0.280391 209.921768 0.282186 0.04232 0.004811 \n", - "2025-07-16 0.280348 209.921768 0.278507 0.04232 0.004811 \n", - "2025-07-16 0.284181 209.921768 0.282479 0.04232 0.004811 \n", - "2025-07-16 0.270431 209.921768 0.272348 0.04232 0.004811 \n", - "2025-07-16 0.259322 209.921768 0.261482 0.04232 0.004811 \n", - "... ... ... ... ... ... \n", - "2025-07-16 0.217674 209.921768 0.218957 0.04232 0.004811 \n", - "2025-07-16 0.307368 209.921768 0.306105 0.04232 0.004811 \n", - "2025-07-16 0.286563 209.921768 0.288068 0.04232 0.004811 \n", - "2025-07-16 0.269509 209.921768 0.268418 0.04232 0.004811 \n", - "2025-07-16 0.278010 209.921768 0.275456 0.04232 0.004811 \n", - "\n", - " price dte build_date \n", - "datetime \n", - "2025-07-16 9.950 37 2025-07-16 \n", - "2025-07-16 6.325 44 2025-07-16 \n", - "2025-07-16 5.700 37 2025-07-16 \n", - "2025-07-16 10.250 44 2025-07-16 \n", - "2025-07-16 11.325 65 2025-07-16 \n", - "... ... ... ... \n", - "2025-07-16 6.000 9 2025-07-16 \n", - "2025-07-16 4.500 23 2025-07-16 \n", - "2025-07-16 8.700 23 2025-07-16 \n", - "2025-07-16 18.550 337 2025-07-16 \n", - "2025-07-16 25.500 337 2025-07-16 \n", - "\n", - "[1608 rows x 26 columns]" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "lab.full_chain" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'k': array([179.0185 , 186.03883333, 193.05916667, 200.0795 ,\n", - " 207.09983333, 214.12016667, 221.1405 , 228.16083333,\n", - " 235.18116667, 242.2015 ]),\n", - " 'dumas': array([0.30447649, 0.29546109, 0.28750836, 0.28041392, 0.27399904,\n", - " 0.26810997, 0.26261684, 0.25741197, 0.25240785, 0.24753484]),\n", - " 'svi': array([0.29590151, 0.28866641, 0.28206882, 0.276068 , 0.27062274,\n", - " 0.26569199, 0.26123545, 0.25721415, 0.25359099, 0.2503311 ])}" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "spot_price = 210.61\n", - "strikes = np.linspace(0.85, 1.15, 10) * spot_price\n", - "lab.predict(300, strikes, 'itm')" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "ename": "AttributeError", - "evalue": "'SurfaceManagerModelBuild' object has no attribute 'CallDumasBuilder'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[25], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mlab\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmanager\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mCallDumasBuilder\u001b[49m\u001b[38;5;241m.\u001b[39mplot(\u001b[38;5;241m100\u001b[39m)\n", - "\u001b[0;31mAttributeError\u001b[0m: 'SurfaceManagerModelBuild' object has no attribute 'CallDumasBuilder'" - ] - } - ], - "source": [ - "\n", - "lab.manager.CallDumasBuilder.plot(100)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Testing Speed. Will delete" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## SSVI " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import matplotlib.pyplot as plt\n", - "plt.style.use('ggplot')\n", - "import math\n", - "import numpy as np\n", - "import pandas as pd\n", - "from scipy.stats import norm\n", - "from scipy.interpolate import interp1d\n", - "from scipy.optimize import minimize\n", - "import warnings\n", - "import ipywidgets as widgets\n", - "%matplotlib inline\n", - "from mpl_toolkits.mplot3d import Axes3D\n", - "from matplotlib import cm" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def theta(t, nu_0, nu_inf, kappa):\n", - " return ((nu_0-nu_inf) * (1-np.exp(-kappa * t)) / (kappa * t) + nu_inf) * t\n", - "\n", - "def phi(x, eta, lambda_):\n", - " return eta * x**lambda_\n", - "\n", - "def TotalVarSSVI(S0, K, t, nu_0, nu_inf, kappa, eta, lambda_, rho):\n", - " k = np.log(K / S0)\n", - " theta_t = theta(t, nu_0, nu_inf, kappa)\n", - " phi_ = phi(theta_t, eta, lambda_)\n", - " return theta_t / 2 * (1 + rho * phi_ * k + ((phi_ * k + rho)**2 + (1 - rho**2))**.5)\n", - "\n", - "def CallPrice(S, sigma, K, T, r):\n", - " d1 = (math.log(S / K) + (r + .5 * sigma**2) * T) / (sigma * T**.5)\n", - " d2 = d1-sigma * T**0.5\n", - " n1 = norm.cdf(d1)\n", - " n2 = norm.cdf(d2)\n", - " DF = math.exp(-r * T)\n", - " price=S * n1-K * DF * n2\n", - " return price\n", - "\n", - "\n", - "r = 0.05 #Risk­Free Interest Rate\n", - "S0 = 100 #Asset Price\n", - "#Black­Scholes Implied Volatility\n", - "IV = [.30, .27, .24, .25, .26, .28, .26, .245, .24, .242, \\\n", - ".27, .26, .25, .245, .242, .265, .263, .26, .258, .257]\n", - "#Strike Prices\n", - "K = [95, 97.5, 100, 102.5, 105, 95, 97.5, 100, 102.5, 105, \\\n", - "95, 97.5, 100, 102.5, 105, 95, 97.5, 100, 102.5, 105]\n", - "#Maturities\n", - "T = [0.1, 0.1, 0.1, 0.1, 0.1, 0.25, 0.25, 0.25, 0.25, 0.25, \\\n", - "0.5, 0.5, 0.5, 0.5, 0.5, 1.0, 1.0, 1.0, 1.0, 1.0]\n", - "MarketPrice = [CallPrice(S0, IV[i], K[i], T[i], r) for i in range(len(T))]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Parameters [nu_0, nu_inf, kappa]: [0.056674 0.10738862 0.50621694]\n" - ] - } - ], - "source": [ - "Vol_ATM = [IV[i] for i in range(len(IV)) if K[i] == 100]\n", - "T_ATM = [T[i] for i in range(len(T)) if K[i] == 100]\n", - "Price_ATM = [MarketPrice[i] for i in range(len(MarketPrice)) if K[i] == 100]\n", - "\n", - "\n", - "#Mean­Squared Error between market and model prices\n", - "#params = ﴾nu_0, nu_inf, kappa﴿\n", - "def MSE_Price_ATM(params):\n", - " MSE_Price = 0\n", - " for i in range(len(Price_ATM)):\n", - " MSE_Price = MSE_Price + \\\n", - " (CallPrice(S0, (theta(T_ATM[i], *params)/T_ATM[i])**.5, 100, T_ATM[i], r) - Price_ATM[i])**2\n", - " return MSE_Price / len(Price_ATM)\n", - "\n", - "\n", - "warnings.filterwarnings('ignore')\n", - "params = [0.2**2, 0.3**2, 0.5] #initial params ﴾nu_0, nu_inf, kappa﴿\n", - "result = minimize(MSE_Price_ATM, params, method = 'SLSQP',tol=1e-10)\n", - "new_paramsATM = result['x']\n", - "print(\"Parameters [nu_0, nu_inf, kappa]: \" + str(new_paramsATM))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Parameters [eta, lambda_, rho]: [ 5.13537633e-03 -4.69086188e-01 -5.65480445e+01]\n" - ] - } - ], - "source": [ - "#Mean­Squared Error between market and model prices\n", - "#params = ﴾eta, lambda_, rho﴿\n", - "# Mean-Squared Error between market and model prices\n", - "# params = (eta, lambda_, rho)\n", - "def MSE_Price_SSVI(params):\n", - " MSE_Price = 0\n", - " for i in range(len(MarketPrice)):\n", - " MSE_Price = MSE_Price + \\\n", - " (CallPrice(S0, (TotalVarSSVI(S0, K[i], T[i], *new_paramsATM, *params) / T[i])**0.5, \n", - " K[i], T[i], r) - MarketPrice[i])**2\n", - " return MSE_Price / len(MarketPrice)\n", - "\n", - "warnings.filterwarnings('ignore')\n", - "params = [1.0, -2.0, -0.5] # initial params (eta, lambda_, rho)\n", - "result = minimize(MSE_Price_SSVI, params, method='SLSQP', tol=1e-10)\n", - "new_params = result['x']\n", - "print(\"Parameters [eta, lambda_, rho]: \" + str(new_params))\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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mosXL5bpeaZOneoyf+nSpcYYY06dOmWmTJliAgICirxP/fr1zZNPPlmmn6/Svgt36iqLzMxM8+abb5quXbsWWful77hv375m/vz5ZV43v3Pnzpn77rvPhISEFLl+WFiYefzxx01qaqoxxpgPP/zQpf/DDz8s132Ls3//fmNZlsvzHTx40K01cnNzTWRkpEudc+bMKXZ8RkaGef311027du2K/Z59fX3NyJEjzcqVK8tcR8H3zl133VXqnF27dplnnnnG9O/f3/j6+hZbjyQTERFhnn32WXPu3LlS1y3u91lpP4r6+R06dGiZ36UF35elvc/KsnZ5niP/773Zs2e7XJ8yZUqp319RHnroIZd1/vOf/5RrHQAAAAAAqgKOEwUAAAAAALVWUUeJXtK/f3+1a9fO2V6yZImOHj16uUorl/xHip4/f17z588vcfzx48e1aNGiIudXF//3f/+n6667rtjjU40xmjdvnqKjo7V7927n9fT0dN1444267777dOjQoSLnZmZm6o033tDo0aN18eLFctW3ZcsW9erVS++9954yMzOLHHPu3Dm9/PLL6tWrlw4ePFiu+1SG2NhYde7cWQ8++KC2b99e7Djzv53sbr75Zt10001ufVcJCQnq2rWr3n333WLnpaSk6LXXXlNUVNRl+T3Ypk0bDRkyxNk2xrjs2FgWixcv1rFjx5zt+vXr66abbipy7LZt29S1a1c99thj2rdvX7Fr5uTkaPHixRo8eLB+/etfKzs7262ayuK7775Tp06d9Mwzz2jdunXKyckpcfyJEyc0depU9ejRQ/Hx8R6vp6YaN26cGjVq5Gx/9tlnbr9jMjMzNXPmTGc7ODi4Su8WCgAAAABAaQixAQAAAACAWunSEaGXhIeH64YbbnAZkz8QYLfbXQIDVVGfPn3UrVs3Z7u0ej/++GPl5uZKknx8fKpdAOL111/Xyy+/7GzXrVtXvXr1Uq9evRQSEuIyNjExUWPHjlV2drbsdrsmTJig77//3tnftGlT5/fn6+vrMnfVqlV68MEH3a7v5MmTuuaaa5SYmOi81rx5c/Xt21dt27aVzeb6v+Z2796tESNG6Pjx427fy9O+/fZbDR8+XAcOHHC57u/vr06dOik6OlqdO3cu9F19++23GjFihDIyMkq9x9atWzV69GidOHGiyHv06dNHjRs3dl7fsWOHrrvuOqWnp1fgycrm7rvvdmm7+3u/4FGikydPlr+/f6FxCQkJGjx4sPbv3+9y3c/PTx06dFDfvn3VrFmzQvM+/PBD3XTTTcrKynKrrtIU9fMWFBSkjh07qk+fPurbt6/atGlT6NfusWPHNGzYMO3YscOj9dRU/v7+LkfUpqSk6LPPPnNrjXnz5uns2bPO9i233KI6dep4rEYAAAAAAC43QmwAAAAAAKBW+uKLL1zCMBMmTFBAQIDLmPw7s0mFgylV0Z133un8/PPPP+vkyZPFjs3/PKNHj1aTJk0qtTZP2rt3r5566ilJUlRUlBYvXqwzZ85o06ZN2rRpk86ePav//Oc/Lj+n27dv13//+1+99tpr+uGHHyRJt956q7Zu3arjx48rISFBW7du1cmTJ/XAAw+43G/69OnavHmzWzU+8cQTzkDa5MmTtWPHDh05ckTx8fHat2+fjhw5oscee0w+Pj7OOQcOHNC9995bru/EU7Zt26ZbbrnF5ffH4MGD9d133+nChQvauXOnYmNjtWPHDp07d07//e9/XX7txMXF6aGHHirxHtnZ2brtttt07tw557WwsDD94x//0KlTp7Rz504lJCTo5MmTWrdunXNntC1btui1117z8BMXNmHCBJcg5J49e7R27doyzU1JSXEJyEqFQ3GXxk2cOFFJSUnOa8HBwXrttdd04sQJ7d69W/Hx8Tp27Jh++eUXjRkzxmX+ggUL9Ne//rXsD1VGPj4+uv766/Xuu+9qz549Sk1N1a5du5SQkKD4+Hjt379f58+f18cff6yOHTs656Wlpem2226TMabIdT/55BMtXLhQH3/8scv1UaNGaeHChcX+GD16tMefsaIu1fbGG2+4XL/jjjtKfJZevXo5x/72t7+VZVnO9nvvvedWDQXHT5kypRxPAgAAAABA1eFb+hAAAAAAAICap2AgrWBgTZI6dOig6OhoxcXFSXLslLV27VoNGDDgstRYHr/61a/05JNPym63KycnR59++mmRgaKEhASXIyKr21Gil45qHDdunD777DP5+fm59AcEBOiBBx5QSEiIy7O9/vrrOnXqlCRp2rRpRe6wVr9+ff3nP/9RWlqa89eJMUYffPCB3nzzzTLXeOmY0hdeeMEZuMuvWbNmeu2119S/f39NmjTJuSveggULNGfOHE2cOLHM9/KUnJwcTZ482SXA9uyzz+rpp592CdxcEhYWpilTpui6667T8OHDtWfPHknSO++8o9/+9rfq3bt3kfeZNm2atmzZ4mzXq1dPK1asUPfu3QuN7devn5YtW6a77rpLs2bNuixHroaGhmr8+PEuO7DNmDGjTL/3586dq7S0NGe7a9euioqKKjTu//7v/1yeJTw8XEuXLi3yO+vZs6fmzZunv/zlL3rxxRed119//XVNmjRJV155ZVkfrUR9+vTRvn371KpVqxLHhYWF6fbbb9f48eM1fvx4Zyh006ZNWrBgga699tpCcwYOHChJhX7+mjZtqquuusoj9V8ul+otuBNh27Zty/ws7dq101VXXaWFCxdKchzfu2XLFvXo0aPUufv379fSpUud7W7dulXp/y4BAAAAAFAW7MQGAAAAAABqnX379mnVqlXOdosWLTR06NAix1a33diaNWvmEqIort781+vWraubbrqp0mvztLZt22rmzJmFAmz53XnnnerSpYuzfejQIaWnp+u2224r9YjQF1980eXYxB9//NHtGm+44YYiA2z5jRs3To899pjLtWnTprl9L0+YO3eutm7d6mzfd999+utf/1pkgC2/yMhIffnlly7f19/+9rcix+bm5uqtt95yufbee+8VGWC7xLIsTZ8+XV27di3LY3hEwWDnF198oczMzFLnFTx6tKiA6Pnz5/XBBx+4XJs+fXqxob9LXnjhBZeAmN1u9+ivlTZt2pQaYMsvMDBQs2bNUnh4uPPahx9+6LF6arr77rvPpV3W3djef/99lx3v2IUNAAAAAFATEGIDAAAAAAC1zkcffeTSvu2224oN6UyePNllt53PP/9cGRkZlVleheUPzfzyyy8uO15JUlZWlmbPnu1sT5o0SYGBgZetPk/585//7HLkY3FuvPFGl7ZlWXrmmWdKnRcZGak+ffo423v37lVqaqpbNb766qtlGvfUU0+pTp06zvbatWu1Y8cOt+7lCfl3mgsODtbLL79c5rk9evTQzTff7GzPnz/fubtcfj///LNzJz3JcRzs+PHjS13fz89PL730Upnrqajhw4e7BLqSkpL0zTfflDjn0KFDWr58ubPt4+NT5C6Pn376qctubQMHDizTdyBJf//7313aX3zxhS5cuFCmuZWhfv36LsG6NWvWeK2W6ubmm29W06ZNne2PP/641P++5OTkuPw3LCAgQHfccUdllQgAAAAAwGVDiA0AAAAAANQqxhjNmjXL5VpRIZNLGjVqpFGjRjnb58+f1/z58yutPk8YO3asSyCq4G5s33//vc6ePetsV7ejRCVHEK2soZ+CO3z16tVLHTp0KNPc/Ef72e12HT16tMw19unTp8w7h106vjK//GGoy+Hs2bPOo3Mlxy5y9erVc2uN/L9XUlNTtXHjxkJjli1b5tK+8847y7z+9ddfr0aNGrlVU3lZllWotoK7rBU0a9Yslx2yrr76ajVr1qzQuII/t7/+9a/LXFfnzp0VExPjbGdlZWndunVlnl8Z2rRp4/x87NgxnT592ovVVB++vr4uP/dJSUmaO3duiXO+//57JSYmOtvjx49X/fr1K61GAAAAAAAuF0JsAAAAAACgVlm6dKkOHTrkbPfs2bPEYwwl6fbbb3dpF9zJraoJCgrShAkTnO1PP/3UZUes/KG29u3buwRiqos2bdqUObjRoEEDl/aVV15Z5vsUnJucnFzmucOGDSvz2KLG5w+UXQ6rVq1yCWD17dvX7TVatmzp0i5qN7mCz+XO9+Tr66uBAwe6XVd5FQx4LliwQKdOnSp2fMGAbHEB0djYWJf2iBEj3Kpr5MiRLu3KCLGdP39e06dP1z333KMrr7xSTZs2VUhIiCzLKvSj4I59Z86c8Xg9NdVvf/tbl2N4SztStGA/R4kCAAAAAGoKQmwAAAAAAKBWKRhAK2kXtkvGjBmj0NBQZ3vhwoUuO+FURfnDM4mJifr5558lOcIlP/zwg7PPnV2wqhJ3duMKDg722Nz09PQyzy0tHFna+AMHDrg1v6IKBs4ef/zxIgNLJf24/vrrXdY4d+5cofvkfy4fHx917tzZrTrz745X2dq1a6dBgwY52zk5Ofr000+LHLt27Vrt3r3b2Q4PD9eYMWMKjTPG6MiRI852nTp11Lp1a7fq6tWrl0v78OHDbs0vycWLF/X4448rIiJCv/nNb/TRRx9p48aNOnHihMsRqCU5f/68x+qp6Vq2bOlyHOuKFStcfh3ld/ToUS1YsMDZ7tChg9thWQAAAAAAqipCbAAAAAAAoNZITU3VV1995WzbbDbddtttpc4LDg7W2LFjne3c3NxCOy5VNYMHD3Y54u/SMYiffvqpsrOzJTmOS7zjjju8Ul9FBQYGemVu/p3KSlNwFzd3x1/uIFD+I2Y95cKFC4Wu5X+u8PBw+fr6urWmu99rRd19990u7eKOFC14/ZZbbiny19qFCxdkt9ud7fI8T8OGDV3aSUlJbq9RlDNnzmjAgAF6/fXXlZmZWe51KjK3Nrrvvvtc2u+//36R4z788EOXXTV/85vfVGpdAAAAAABcTu79HyIAAAAAAIBqbM6cObp48aKz3bFjR+3YsaPIIw8Latu2rUt7xowZevzxxz1eo6dcCqg999xzkqT58+crOTnZ5SjRIUOGuL0DFMqu4C5upQkJCXFpp6amerKcUlVGaC5/WOuS/M/l7nckFf6eKtvEiRP1pz/9ybkL2caNG7V161aXnfMyMzP1+eefu8wrGH67pODPa3mep+CclJQUt9coysSJE7VlyxaXay1atNDw4cPVtWtXNW/eXKGhoQoKCnI5AnPmzJlVPthblV133XVq0aKFc4e+GTNm6MUXX5Sfn59zjN1u1/Tp051tPz+/Yn+NAQAAAABQHRFiAwAAAAAAtUb+AJck7dy5U1dffXW51tq+fbvi4+MVFRXlidIqxZ133ukMsaWnp2vq1KnasGGDsz//kaPwvLIevXhJ/oClJJcjbC+HgoGyBx98sNDxoO4qGP6UHAGs5ORkSe5/R1Lh76my1alTR2PHjtUnn3zivDZjxgy9/vrrzva3337rshtax44dNWDAgCLXK/jzWp7nKTgnLCzM7TUK+uabb7Rs2TKXNd9++23deuutLoG1oixevLjC96/NfHx89Jvf/EZTp06VJJ06dUrz58/XhAkTnGMWLlyoQ4cOOds33XSTGjdufNlrBQAAAACgshBiAwAAAAAAtcKBAwe0YsUKj645Y8aMKh1ia9eunQYOHKjVq1dLkt58801nX3BwsEtAAp535swZt8YXPM6zbt26HqymdAWPqGzatKmuuuoqj9+nbt26zhDbhQsXlJ2d7bLjVGkq49jT0tx1110uIbZPPvlEr7zyinx8fCQVDsiWFBANDw+XzWZz7lJXnucp+GurXr16bq9R0GeffebSfvfdd3XrrbeWae65c+cqfP/a7je/+Y2ef/555eTkSJLee+89l3d0wSNGp0yZclnrAwAAAACgspX8T+gAAAAAAABqiBkzZsgY49E1Z8+eraysLI+u6WnFhWnGjh3rkd2bULytW7e6Nb7gMY5t2rTxZDmlKni/vXv3Vsp98u/Olpubq507d7o1f/PmzZ4uqVQj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XdZwV0ZGhhYvXqwff/xRq1ev1qlTp4od6+Pjo0GDBukPf/iDYmJiynyPCRMmaO3atc72sWPHJEm7d+/WP/7xD/30009KT093mXPvvfd6JMT2448/6g9/+IMyMjKc1x5++GE98sgjRY632+368ssv9eGHH2rz5s0yxhQ5rkOHDnrggQc0ceJE2WzFbxAaGRlZ5PW///3v+vvf/17svDlz5rj1HQMAAAAAAAAAAAAAgMuLEBvgBcYY6eBemW3rZfbulDLSpcAgWe07y+rWR2rdXpZlebvMaqtHjx7q3Lmzdu7cKckRYiotxJb/KNEuXbqoe/fuunDhglv3HTt2rDZv3lymsbm5uVq+fLmWL1+uu+++W88++6x8fcv3Sv7qq6/0yCOPKCsrq1zzy+Kjjz7S008/LbvdLskRwnvllVd02223FTl+//79uu+++7R9+/ZS196zZ48efvhhffzxx/roo49cjoMFAAAAAAAAAAAAAAA1HyE24DIyxsisWSzz41wpNUW6mOLav22DzKJvpdAwWddOkBUzkjBbOU2YMEEvvPCCJGnFihU6deqUGjduXOTYkydPasWKFS5zyyMzM7PQtYiICNWtW1fBwcFKT0/XsWPHXHZ8kxwBsfT09BJ3EyvO4sWL9f/+3/9zhstsNptatmypunXr6syZM0pMTCzXs+T38ssv61//+pezHRQUpLfffltXX311keM3bNigu+66S+fOnXO57uPjoxYtWqhevXq6ePGiDh8+7LKr24YNG3TTTTfpm2++IcgGAAAAAAAAAAAAACiVyc2V5ePj7TLgAYTYgMvEpKXK/u+XpCP7pfS04gdedITbzOfvy6xZItvv/09WcOjlK7SGGDdunF5++WXl5uYqNzdXX331le6///4ix3711VfKzc2V5AhajR07ttz3jYyM1A033KARI0aoV69eCgsLc+k3xmjHjh2aNWuWPvnkE+d9P//8c1199dW69tpr3brfI488Irvdrjp16ujBBx/UxIkTVb9+fWf/6dOndfTo0XI9S3Z2th555BF9+eWXzmv169fXjBkzdOWVVxY559SpU7rnnntcAmxdunTRgw8+qOHDhyskJMR5PSMjQz///LNeffVVHTx4UJJ08OBBPfjgg5o5c2ahAOfs2bMlSdu3b9fzzz/vvD5+/PgSg4ddu3Yt+0MDAAAAAAAAAAAAAKo0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ZwQcHO0uxLb9EaL7ckToR3P25ejRffHggw/ml7/8ZZLkhBNOyNe//vU9rr392NChQ3c7r1evXjn11FPz8ssv580338zWrVv3aae57Z111lkZNGhQlixZkpdeeiktLS1paGjYrzUAAAAAANi9suqDlFn3pcydmmxcXyt2655q5MRUV16bqt+x9W0QAAAA6qDdhdg6d+6cXr16Zd26dVm5cuUe565fvz6NjY1Jkn79+n3i954/f35+8pOfJEn69++fb37zm+ndu/ce7+nXr19effXVferho/FSStavX5++ffvud48fhdiampqyfv36vfYHAAAAAMDelTdeqR0Z+sSCpKWlVuw/INW461NdcWWqrt3r2yAAAADUUbsLsSW1oNaLL76YZcuWpbm5OR06dNjlvHfffXeHez6Jxx9/PD/84Q9TSslRRx2VW2+9dZ+CcSeeeGIefvjhJEnLR19s7Mb243ZQAwAAAACor9LcnDz9cFoevCt57aVtA6efm4YJ1ydDL0nVsOvvpwEAAKA9aZchtjPOOCMvvvhiGhsb8/rrr+e0007b5bxFixbtcM/H9dxzz+V73/tempub06tXr3zzm9/MgAED9unes846q/V6+fLle5z7/vvvJ0k6deqUnj17fqxely5d+onXAAAAAABoz8rGDSnzp6XMvC9Z+dvvdTt0TDVsZKrx16c66VP1bRAAAAAOMe0yxDZs2LDceeedSZJZs2btMsTW0tKSOXPmJEl69OiRc84552O918svv5y//uu/TlNTU7p3754//dM/zYknnrjP95999tnp3bt31q5dmyeeeCK///u/v8td1pYvX54333wzSXLmmWd+rJ3YXnrppbzzzjufaA0AAAAAgPaqLH8vZea9KfOnJ42basWevVKNnpRqzORUfY+ua38AAABwqGqXKaUhQ4a07nA2a9asvPLKKzvNuffee1t3JZs0aVI6dtwx7/fCCy/k5ptvzs0335wf/vCHu3yfN998M9/+9rfT2NiYLl265Gtf+1pOPfXU/eq1oaEh1113XZJkxYoVuf3223ea09zcnJ/85CcppSRJJkyYsNOcRx99tHV8V5YtW5bvf//7ra8nTpy4X30CAAAAALRHpZSUV55P8w//Ki3f/L9SZtxTC7ANPDHV7345Dbf9NA03/O8CbAAAALAH7XIntiT5/d///dx6663ZsmVL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NggAAAAcsg7oNmnr1q3Lfffdl/vuuy9nnHFGxo8fn8suuyydO/uyAgAAAADgcFdampOnHknLg3cmr720beDs89Mw4YbknAtSVVW92gMAAAAOE20aYvu93/u9zJw5M++8885OYy+//HJefvnl/Pf//t8zcuTIXHnllTnllFPa8u0BAAAAADgIyuZNKQtmpMy4O1mxrFbs0LG249qE61MNGlzfBgEAAIDDSpuG2CZPnpzJkyfn1VdfzfTp0/PQQw+lsbFxhzkbN27M1KlTM3Xq1Jx66qkZP358rrjiinTt2rUtWwEAAAAAoI2V1atSZt2XMntKsnF9rdijV6rRk1KNnZyq79H1bRAAAAA4LB2Q40RPO+20nHbaafmDP/iDzJ8/PzNmzMjrr7++07zXX389//W//tf8wz/8Q6644opceeWVGTJkyIFoCQAAAACAj6m8+3bKtDtTHpmdbN1aKx47MNX4z6S6/MpUXfxIGQAAAPj4DkiI7SNdu3bN+PHjM378+Lz11luZPn165s+fn40bN+4wb/PmzZkxY0ZmzJiRk046KePHj8/IkSPTvXv3A9keAAAAAAC7UUpJXnkhLVN/kzz3+LaBT52Zhok3JucPS9XQoX4NAgAAAEeMAxpi297JJ5+cL37xi/nd3/3dPPzww5kxY0Zeeumlnea9/fbb+elPf5qf//znueyyyzJu3LiceeaZB6tNAAAAAIB2rTQ3pzy5MGXqHclbi2vFqkrOvzQNE29MNeSs+jYIAAAAHHEOWojtI507d86oUaMyatSovPvuu5kxY0bmzp2btWvX7jBvy5YtmTt3bubOnZvjjz8+48aNy+jRo9OrV6+D3TIAAAAAwBGvbN6UsmB6yoN3JSuX14qdOteOCx3/mVQDTqhvgwAAAMAR66CH2LZ3/PHH53d/93fzhS98IY899lhmzpyZZ599dqd57777bn72s5/ll7/8ZS699NJMnDjR7mwAAAAAAG2grF6VMuu+lNlTko3ra8WevVONvSbV2MmpevWpb4MAAADAEa+uIbaPdOzYMcOHD8/QoUPz61//Ovfdd98u523dujULFizIggULMmTIkNx8880577zzDnK3AAAAAACHv/Lu2ynT7kx5ZHaydWuteOzAVBNuSDX8ylRdutS1PwAAAKD9OCRCbC+99FKmT5+eRx55JFu2bNmnexYvXpy/+qu/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7mlr2+/w1tCw8/8UTz75ZLZs2ZKk9mf3kcbGxixbtiyrV69OKXv/VfJLL72UJDn++OP3uJPbwfjMAAAAALv15uJk/bq2Watr9zR85n9PNeTsvc8FAAAAAOpq1+dPfkwXXnhhFi1alCR5/PHHM3ny5B3GO3funBtvvDG//OUvk9RCXL/4xS/yq1/9Kr17987WrVuzfv36ndb9zGc+s8uQ18exZMmSJMmAAQPSoUOH3c47/vjjd7qnrX30Z5XseBzrR1555ZXW65NOOimLFy/Or371qzz33HOt4bXevXtn+PDhuemmm3YZUNu8eXPrsazbf6Zd2b6HpUuX7tdnAQAAAPikygtPJBvaKMS2eWPKC0+lGnxa26wHAAAAABwwbRpiu+KKK1qPAX3hhReyZMmSDBo0aIc51113XZ599tkdjuhsaWnJ6tWrd7nmRRddtFMY7uPasmVL1q2rfRHar1+/Pc7t2bNnunTpksbGxtYQWFt688038+STTyapBdT++Z9TsmOQ7Pnnn8+PfvSjNDc37zBn7dq1mTp1ah555JF84xvfyCmnnLLD+Pa97+0zbz/+wQcf7HFuU1NTmpqaWl9XVZVu3bqlqqpUVbXHe4H25aNngmcD8M95PgB74hkB7VNZ/FIbr7fIcwTaEX9/AHbH8wHYHc8HYE88I+DgatMQ29FHH53vfOc7rcdk9u7de6c5HTp0yNe+9rX85Cc/yZw5c3a7VlVVmTBhQn7v936vzfrbvHlz6/X2x5ruTteuXdPY2LjDfW2hqakpP/rRj9LS0pIkueWWW3Y5b/td6X784x+3zh01alT69u2bZcuW5e67787s2bOzevXqfOc738l3vvOddO/evfW+TZs27fB59mT78b195jvuuCO333576+vBgwfntttuyzHHHLPH+4D2a8CAAfVuAThEeT4Ae+IZAe3L+6U5W9pwvc6lOccNHNiGKwKHA39/AHbH8wHYHc8HYE88I+DgaNMQW1LbVWxvOnfunC996UuZPHlyHnroobz66qtZs2ZNSinp27dvTj/99IwaNWqvx1/ury1btn0N2rHj3j/6R3O2v68t/Lf/9t/y2muvJUlGjx6diy++eJfztg+SNTU15Y/+6I8yatSo1tqgQYPypS99KR07dsz06dOzYsWKTJs2LTfccMMO931kb595+/Ht79uVG2+8Mddee23r64+Sxx988MFe7wXal6qqMmDAgCxbtqz1KGSAxPMB2DPPCGiftlYd2nS9LVWHvPfee226JnDo8vcHYHc8H4Dd8XwA9sQzAtpGx44d079//73POwi97NYpp5yy0/GXB1Lnzp1brz/aLW5PPpqz/X2f1B133JGZM2cmST71qU/li1/84m7nbv++J5988g4Btu194QtfyJw5c9LU1JSHHnpohxBbp06dWq/39pm3H9/+vl3p1KnTLueUUjy8gV3yfAB2x/MB2BPPCGhfqiFnprzwZBuud7ZnCLRD/v4A7I7nA7A7ng/AnnhGwMHRUO8GDqb9OS5z+zn7cvTovnjwwQfzy1/+Mklywgkn5Otf//oe195+bOjQobud16tXr5x66qlJkjfffHOHMFq3bt1ar/f2mff3uFUAAACANnX2hUnXbnufty969Ep1zgVtsxYAAAAAcEC1qxBb586d06tXryTJypUr9zh3/fr1aWxsTJL069fvE7/3/Pnz85Of/CRJ0r9//3zzm99M796993jP9u+7tx4+Gi+lZP369a31o48+uvV6b595+/Fjjjlmj3MBAAAA2kopJeW5x1N+9V+TzZvaZtGevZJThrTNWgAAAADAAdWuQmxJMmjQoCTJsmXL0tzcvNt577777k73fFyPP/54fvjDH6aUkqOOOiq33nrrPgXjTjzxxNbrlpaWPc7dfryhYdv/rN26dWt9r+0/064sXbq09fqEE07Ya38AAAAAn0QpJeXph9Pyrf9fWr7//yZvvJJ06JB06PjJFu7WPdWkz6WqqrZpFAAAAAA4oNpdiO2MM85IkjQ2Nub111/f7bxFixbtdM/H8dxzz+V73/tempub06tXr3zzm9/MgAED9unes846q/V6+fLle5z7/vvvJ0k6deqUnj177jB25plnJqmF2FavXr3bNdrqMwMAAADsSWlpSXliYVr+36+k5Yd/lby1OOncJdXEG1N9+78lnzozyccNoFXJiaemunxcW7YMAAAAABxA7S7ENmzYsNbrWbNm7XJOS0tL5syZkyTp0aNHzjnnnI/1Xi+//HL++q//Ok1NTenevXv+9E//dIfd1fbm7LPPbj1y9IknntjtbmzLly/Pm2++maQWWNt+J7YkueSSS1qvZ8+evcs1Ghsb89BDDyWp7Tx3/PHH73OfAAAAAPuitDSn5dG5afnzf52W//LtZMkbSZduqSZ9Lg3f/kkaPv8Haeh7dBq+/I1k4KDsf5CtSo4flIYvf8MubAAAAABwGNmnsxn+/M///ED3sUdVVeX/+X/+nzZZa8iQITnrrLPy4osvZtasWRkzZkxOP/30Hebce++9rUdrTpo0KR077vjH9MILL7T+mYwePTpf/vKXd3qfN998M9/+9rfT2NiYLl265Gtf+1pOPfXU/eq1oaEh1113Xf7xH/8xK1asyO23356bb755hznNzc35yU9+klJKkmTChAk7rTNs2LAcd9xxef/993PHHXfksssu22k3uJ/97GfZsGFDkuT666/frz4BAAAA9qQ0N6c8Njflvv+VLKt955JuPVKNuy7V+OtS9ei1w/yqe880fO222i5t77yebNq49zfp1j058dRagK17z73PBwAAAAAOGfsUYtv+mMkjwe///u/n1ltvzZYtW/KXf/mXufHGG3POOedky5YtWbhwYaZPn54kGThwYK677rr9Xn/ZsmX51re+1RoKu+WWW9K9e/e8/fbbu72nT58+6dOnz071SZMmZeHChXnjjTdy++235913382YMWPSu3fvvP/++7nvvvvyyiuvJEkuuOCCXHrppTut0bFjx/zBH/xBbrvttmzatCm33nprbrrppgwZMiTr16/PjBkz8sgjjySp7eQ2atSo/f7MAAAAAP9c2bo15ZHZKff/U7L8vVqxe89UE65PdeW1ewybVd17puFPvpWycEbKlNuT9euSDet2ntijV9KzV6pJn0t1+Tg7sAEAAADAYWifQmxHmsGDB+crX/lKfvCDH2TTpk355S9/udOcgQMH5utf/3q6deu23+u/9NJLWbNmTevrv//7v9/rPZ/73Od22mUtSTp37pyvfe1rue222/L6669n4cKFWbhw4U7zLrjggnzlK1/Z7Re1F154Yf7lv/yX+elPf5o1a9bkpz/96U5zhgwZkj/5kz/Z6ThSAAAAgP1RtjalLJxZC6+tXF4r9uydauINqcZMTtWt+z6tU1VVqivGp1w+LnlzccoLT6YsfjGdS3O2VB1SDTk71TkXJKcMEV4DAAAAgMNYuwyxJcnFF1+c7373u7n//vvz5JNPZtWqVenYsWMGDBiQyy67LFdffXW6dOlS7zaTJEcddVS+9a1vZebMmVmwYEGWLFmSDRs2pFevXhkyZEjGjBmTYcOG7XWd8ePH5/TTT8+UKVPy/PPPZ9WqVenatWtOOOGEjBgxIuPGjUuHDh0OwicCAAAAjkSlaUvK/OkpD9yerPqgVuzVJ9VVn001+upUXff/x4JJLcyWwaelGnxaqqrKcQMH5r333ksppQ27BwAAAADqpSq+7aMNrVixIk1NTfVuAziEVFWVgf6BCdgFzwdgTzwj4PBStjSmzJuW8sCvk9WrasU+R6e6+rOpRl6Vqg1/KOj5AOyO5wOwO54PwO54PgB74hkBbaNTp07p37//Xue1253YAAAAAPhkSmNjypwpKVN/k6xdXSsedUyqSTelGjEhVafOde0PAAAAADg8CLEBAAAAsF9K4+ZaeO2B3yTr1tSK/Y5NNflzqYaPS9WpU30bBAAAAAAOK0JsAAAAAOyT0rg5ZfZvd177KLx2zHGpJn8+1fArU3X0VRMAAAAAsP98swgAAADAHtXCa/enTL1jW3it/4BaeO2yscJrAAAAAMAn4htGAAAAAHapbN5UC69Nu3PH8No1N6e6dIzwGgAAAADQJg7KN43vvvtuFi1alFdffTUffPBBNmzYkE2bNqVbt27p0aNH+vfvn9NOOy1nnXVWjj/++IPREgAAAAC7UTZvSpl1f8q0O5L1a2vF/gNSXfM7qS4dLbwGAAAAALSpA/qN4+OPP5577rknL7300l7nzpo1K0ly9tln59prr81FF110IFsDAAAA4J8pmzduF15bVyseO3DbzmsdOtS3QQAAAADgiHRAQmwbN27Mj3/84yxcuHC/7120aFEWLVqUK664Iv/iX/yLdO/e/QB0CAAAAMBHyuaNKTPvqx0buuGj8Nrxvw2vjRZeAwAAAAAOqDYPsW3evDl/8Rd/kddff/0TrbNgwYK89957+ff//t+na9eubdQdAAAAAB8pmzamzLw35cG7dgyvXfs7qYaNEl4DAAAAAA6KNg+xfe9739spwNa5c+dccskl+fSnP52TTz45vXv3TpcuXdLY2Ji1a9fmrbfeyvPPP59HH300W7Zsab3v9ddfz9/8zd/ka1/7Wlu3CQAAANButYbXpt2ZbFxfKx53Qqprb051ifAaAAAAAHBwtWmI7YknnsjTTz+9Q23ChAm55ZZb0rNnz53m9+rVK8ccc0xOPfXUjB07Nhs2bMivfvWrTJs2rXXOU089lSeffDIXXnhhW7YKAAAA0O6UjRu27bz2UXhtwAmprvmdVMNGpmoQXgMAAAAADr42DbHdcccdO7z+P//P/zPjxo3b5/t79OiRL37xixk8eHB+9KMf7bCuEBsAAADAx1MLr93z2/DahlpxwKDasaGXjBBeAwAAAADqqs1CbGvXrs3ixYtbX48bN26/Amzbu/LKK7N48eLMmDEjSfLqq69m7dq16d27d5v0CgAAANAelI3rU2bcmzJ9u/DawBNTXXOz8BoAAAAAcMhosxDbyy+/nFJK6+sbbrjhE613ww03tIbYSil55ZVXcvHFF3+iNQEAAADag7Jxfcr0e1Km351s2i68dt0tqS66XHgNAAAAADiktFmIbfXq1a3X/fv3z7HHHvuJ1jv22GPTv3//rFixIkny4YcffqL1AAAAAI50tfDa3SnT7/ln4bUv/Da81lDfBgEAAAAAdqHNQmzr169vvW6rYz979+7dGmLbsGFDm6wJAAAAcKQpG34bXptxd7JpY614/ElpuO6W5ELhNQAAAADg0NZmIbbu3bu3Xm8faPsktl+nW7dubbImAAAAwJGibFyf8uA/C6+dcHItvHbBcOE1AAAAAOCw0GYhtj59+rRer1ixIqtXr07fvn0/9nqrV6/O8uXLd7k+AAAAQHtWNm747bGhd287NvSEk9Nw3ReSCy4TXgMAAAAADittFmIbMmRI63VLS0seeOCB3HLLLR97vQceeCCllNbXp5122ifqDwAAAOBwVzZtTJlxd8qDdyUbfxteO/6kNFz/BTuvAQAAAACHrTYLsR1zzDE58cQT88477yRJ7r777px99tkZOnTofq/1/PPP5+677259feKJJ6Zfv35t1SoAAADAYaVs3pgy496UaXcmG9fXigNPTHXdF1JddLnwGgAAAABwWGuzEFuSTJ48OT/60Y+SJM3Nzbntttvyv/1v/1smTZqUhn34MvWjHdx+8YtfpLm5ubV+zTXXtGWbAAAAAIeFsnljysz7auG1DetqxQGDUl13S6qLr0jV0KGu/QEAAAAAtIU2DbGNHTs2U6dOzZtvvpkk2bp1a/7hH/4hU6ZMyahRo3Luuefm5JNPTo8ePVrv2bhxY9588808//zzmTdvXpYvX77DmqeeemrGjh3blm0CAAAAHNLK5k0ps+5PmfabZP1H4bUTUl17S6pLRgivAQAAAABHlDYNsVVVlX/37/5dvvnNb2blypWt9RUrVuTXv/51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bbnllhkzZkxGjx6dYcOGZcCAAenq6srs2bPz3HPP5fHHH8+zzz7bs37jjTfOhz/84ay77rrLdG4AAABg6dSpL6Red0nqvb9Kak1KI2W/g1OOOiVl+CadjgcAAAAAQC+xVCW2MWPGLPWGzz//fM4555zMmDEjSfLOd74zp59+erbYYou3/eyzzz6bCy+8ML///e8zderU/OQnP8kXv/jFjBo1aqnPDwAAACxZnfFy6o2Xpd51a7JoUZKk7L5/yjGnpYz0a3AAAAAAAFattj5OdPbs2fnqV7+aV155JUly/PHH5+STT17qz2+55Zb58pe/nEsvvTRXX311pk+fnq985Sv513/91wwdOrSdUQEAAKDXqbNnpt50Reovb0oWLmgN37FHGseeljJ6m86GAwAAAACg12prie2SSy7pKbDtvffey1Rge71TTjklkydPzr333psZM2bkkksuySc+8Yl2RgUAAIBeo742N/WWa1JvuS7pmtcabjcmjeM+krLd0t99HQAAAAAAVoa2ldjmz5+f8ePH97w+6aSTVmi/k08+Offee2+SZPz48TnjjDMycODAFdoTAAAAepPa1ZV62w2pP7syeW1Oa7jFtmkce3qy824ppXQ2IAAAAAAApI0ltscffzwLFy5MkmywwQYZNWrUCu03atSobLDBBpkxY0YWLFiQxx9/PLvttls7ogIAAMBarS5ckHrHL1JvvDyZ2bpjekZunsaxpyW77au8BgAAAADAaqVtJbYXX3yx53j99ddvy57rr79+ZsyY0bO/EhsAAAAsXl20KPU3v0y9/pJk+tTWcPgmKUd/OGXvA1IafTobEAAAAAAA3kLbSmxdXV09x3Pnzm3Lnq/f5/X7AwAAAP9XrTW5/+40r7komTKpNVx3g5SjTkp5z/tT+vbrbEAAAAAAAFiCtpXYhg0b1nM8derUzJo1K+uss85y7zdr1qxMnTr1LfcHAAAA/qu89tiDaV79k+S5ia3hkGEpR56YctAHUgYM6Gg+AAAAAABYGm0rsW2yySY9x81mM7fccktOOOGE5d7vF7/4RZrN5lvuDwAAAL1dffoPaV51QfKH37cGAwalvP+YlMOOTRk0uLPhAAAAAABgGbStxDZmzJgMHTo0c+bMSZJcddVV2WmnnTJmzJhl3uvRRx/N1Vdf3fN66NChy7UPAAAArG3q5OfTvObC5MHftAZ9+6Yc9IGUD4xNGbZuR7MBAAAAAMDyaFuJrU+fPjnkkENy7bXXJkkWLlyYr371qzn11FNz5JFHptFovO0ezWYzN910Uy699NIsXLiwZ37IIYekT58+7YoKAAAAa5z68kup112c+ptfJrUmpZGy38EpHzo1ZcONOx0PAAAAAACWW9tKbEly4okn5p577smUKVOSJAsWLMgFF1yQG264Ifvvv3/GjBmT0aNHZ+jQoRkwYEC6uroye/bs/PGPf8xjjz2Wu+66KzNmzHjDniNGjMiJJ57YzpgAAACwxqizXkm98aep43+WLPqvv/D17v3SOPa0lJGbdzYcAAAAAAC0QVtLbP3798+XvvSl/OM//mNefvnlnvmMGTNy/fXX5/rrr1+m/YYPH54vfvGL6d+/fztjAgAAwGqvvjY39RdXp956XdI1vzXcadc0jvtIylbbdTYcAAAAAAC0UVtLbEmy8cYb51/+5V/yH//xH3nooYeWe593vOMd+fM///NssMEGbUwHAAAAq7fa3ZV6+42pN1+ZzJ3dGm65XRrHfyRlp107Gw4AAAAAAFaCtpfYkmT99dfPF7/4xdx999256aab8uSTTy71Z7fddtt88IMfzH777bcyogEAAMBqqS5cmHr3ranXX5a8Or01HLl5Gseenuy2T0opnQ0IAAAAAAAryUopsf3Jfvvtl/322y+TJ0/Oo48+mokTJ2batGmZO3du5s+fnwEDBmTIkCHZeOONs+2222bMmDEZNWrUyowEAAAAq5XabKbed2fqtRcnU19oDTfYKOXoD6fse1BKo09nAwIAAAAAwEq2Uktsf7LZZptls802y2GHHbYqTgcAAACrvVpr8sj9aV59QfLHZ1rDYeumfPCklAOOSOnXr7MBAQAAAABgFVklJTYAAADg/6oTH2+V1554tDUYOCjl8ONSDj06ZeDgzoYDAAAAAIBVTIkNAAAAVpE66Zk0r74wefi3rUHffinv+2DKESemDFuns+EAAAAAAKBDlNgAAABgJavTpqRee1Hqvb9Kak0ajZT9D0056uSUDTbqdDwAAAAAAOioVVJimzVrVh5//PFMnjw5c+bMyWuvvZZms5ljjjkmm2222aqIAAAAAKtcfXVG6o2Xp97x82TRoiRJ2eM9KcecljLCr4cBAAAAACBZySW23/72t7nhhhsyYcKEt3z/gAMOeMsS20UXXZSJEycmSTbaaKP8+Z//+cqMCQAAAG1V585J/fmVqeOuT7q7W8Odd0vjuI+kbLFNZ8MBAAAAAMBqZqWU2GbPnp1zzz03DzzwwHJ9frvttst1113X8/pDH/pQNt9883bFAwAAgJWidnWl3nZ96s+uTF6b2xpuvUMax38kZYd3dDYcAAAAAACsptpeYps1a1bOPvvsTJkyZbn32HPPPbPhhhtm+vTpSZI777wzp556arsiAgAAQFvVhQtT77wl9YbLkpkzWsPNtkjj2NOTXfdKKaWzAQEAAAAAYDXW1hJbrTXf/OY331BgGzhwYA455JC8853vzPDhw/PXf/3Xb7tPKSV77713brrppiTJQw89pMQGAADAaqc2m6m/uyv1mguTqS+2hhtunHLMaSl7H5DS6NPZgAAAAAAAsAZoa4lt/PjxefLJJ3teb7/99vnrv/7rrLfeesu817vf/e6eEtuzzz6befPmZdCgQe2KCgAAACukPvZgmlddkDw3sTUYtm7KB09OOfDwlL79OhsOAAAAAADWIG0tsV133XU9xyNGjMgXvvCFDB48eLn22nrrrXuOa62ZNGlStttuuxXOCAAAACuiPvtkq7z2+EOtwYBBKYcfl/L+o1MGLt+vgQEAAAAAoDdrW4lt6tSpmTx5cs/rU089dbkLbEkyZMiQrLfeenn11VeTJC+++KISGwAAAB1TX3oh9eqfpP7urtagT9+Ug45M+eBJKcPW7Wg2AAAAAABYk7WtxDZx4sSe4/79+2ePPfZY4T2HDh3aU2KbM2fOCu8HAAAAy6q+OiP1hktT7/hF0mwmpaTsfVDKMR9OGb5Jp+MBAAAAAMAar20ltlmzZvUcb7zxxunbd8W3HjhwYM9xV1fXCu8HAAAAS6u+Nif151en3npd0v1fvyZ9xx5pHH9GyqitOhsOAAAAAADWIm0rsc2fP7/n+PXls3btOWDAgLbsCQAAAEtSF3Sn3nZj6s1XJHNnt4bb7JjG8WembL9zZ8MBAAAAAMBaqG0ltqFDh/Yct+vRnzNmzOg5XmedddqyJwAAALyV2lyU+uvbU6+7OJnxcms4cvM0jj8j2XXvlFI6GxAAAAAAANZSbSuxrbfeej3HU6dOTVdX1wrdPe25557La6+91vN64403XpF4AAAA8JZqrclD96R51U+SF//YGm4wPOXoD6fse3BKo09nAwIAAAAAwFqubSW27bffvue42Wzm/vvvz7777rvc+91+++09xwMHDsy22267QvkAAADg/1WfeCTNqy5InprQGgwZlvKBE1MO/mBKv/6dDQcAAAAAAL1E20ps66yzTrbeeus8/fTTSZKrr746e++9dxqNxjLv9cILL2TcuHE9r3feeefl2gcAAADeSp30bKu89vv7WoP+/VMOPSbl8ONTBg/pbDgAAAAAAOhl2toMO+KII3qOn3vuuZx//vnLvMf06dPzr//6r+nu7u6ZHX300W3JBwAAQO9WX34pzfP+Lc1/+v+1CmyNRsqBR6Txlf9M47gzFNgAAAAAAKAD2nYntiQ54IADcsMNN+T5559Pktxyyy15+eWXc+aZZ2bkyJFL/OzChQtz++235/LLL8+sWbN65u9617uy4447tjMmAAAAvUydPTP1xstTf3lzsmhhkqTs8Z6UY09P2WTTDqcDAAAAAIDera0ltlJK/uqv/ipnn312Zs+enSR54IEH8sADD2TbbbfNNtts84b1t912W+65555MmTIlTzzxRObPn/+G94cPH57Pfe5z7YwIAABAL1Lnz0u95drUX1ydzJ/XGo55VxrHfyRli207Gw4AAAAAAEjS5hJbkowcOTJ/+7d/m29+85tvuKPaxIkTM3HixDesveuuuxa7z4Ybbpi//du/zbBhw9odEQAAgLVcXbgg9Vc/T73hsmT2zNZwi21b5bUx7+poNgAAAAAA4I3aXmJLku222y7/+q//mu985zt56KGHlvnzu+66az73uc9lnXXWWQnpAAAAWFvVZjP1t3ekXntRMm1Ka7jxyJRjz0jZfb+URqOzAQEAAAAAgDdZKSW2JFlvvfXyxS9+MU8++WRuvPHGPPTQQ3nttdcWu75///7ZZZddcvTRR2ennXZaWbEAAABYC9Vak0cfSPOqHyd/fKY1XHf9lKNOSXnP+1P6rrRf/gIAAAAAACtopf8u/nbbbZfPf/7zqbXm+eefz+TJkzN79uzMnTs3AwYMyLBhw7Lxxhtn2223TV9/qAAAAMAyqs9NTPOKHyUTHm4NBg1OOfz4lEOPThkwsKPZAAAAAACAt7fKWmOllGyxxRbZYostVtUpAQAAWIvVqS+mXnNh6m/vaA369k1531EpR56YMnSdzoYDAAAAAACWmlufAQAAsEaps2em3nBZ6vifJYsWJqWk7H1QyrGnpWy4cafjAQAAAAAAy0iJDQAAgDVC7Zqfess1qT+/Opk/rzXc5d1pHH9myuZbdTYcAAAAAACw3JTYAAAAWK3VhQtT77o19fpLkpmvtIZbbJvGCWem7LRrZ8MBAAAAAAArTIkNAACA1VKtNc3f3Z3mVRckL01uDTcakXLcGSm775/SaHQ2IAAAAAAA0BZLVWIbP378m2YHHnjgUq1rl7c6HwAAAGun+sSjmfqtL6Y54fetwbB1U446OeWAw1P69utsOAAAAAAAoK2WqsT2ne98502ztyqVvdW6dlFiAwAAWPvVF55v3XntoXuzKEn6D0g57NiUw45LGTS40/EAAAAAAICVoNc/TnTatGm5+eabc//992f69Onp27dvRowYkX333TeHH354BgwYsNx7d3V15cEHH8zDDz+cp59+OlOmTMn8+fMzaNCgjBw5MrvuumsOO+ywrLfeekvc5x/+4R/y2GOPLdU5L7/88recT506NZ/73OeWao8DDzwwn/3sZ5dqLQAAQDvUGS+nXndx6t23JbWZNBoZcsRxmX/IMck663U6HgAAAAAAsBL16hLbfffdl3POOSfz5s3rmXV1deWpp57KU089lXHjxuULX/hCRowYscx7P/fcczn77LMzf/78N703Z86cPPnkk3nyySdz44035lOf+lT222+/FfouAAAAa6L62pzUm69MHXd9sqC7NXz3fulz/BnZYLc98+KLL6bW2tmQAAAAAADASrVUJbbPfOYzS7XZ0q5bHTzzzDP593//93R3d2fgwIE59thjs8suu6S7uzt33XVXxo0blxdffDFf+9rX8vWvfz2DBg1apv3nzZvXU2DbYYcdsvvuu2frrbfOsGHDMmvWrNxzzz0ZN25c5s2bl29/+9sZNGhQdttttyXuuc0227Tlf+NTTjkle+yxx2LfHzp06AqfAwAAYEnqggWpt9+YetNPk7mzW8PtxqRxwkdTttkxpZTOBgQAAAAAAFaZpSqxHXTQQUu12dKuWx386Ec/Snd3d/r06ZMvf/nL2X777Xve22WXXTJy5MhceOGFefHFF3P99dfnpJNOWqb9SynZd999M3bs2IwaNepN7++6667Zbbfd8q1vfSvNZjPnn39+vv3tby/xD2oGDBiQ0aNHL1OOt7LBBhu0ZR8AAIBlVZvN1HvGp157UTJ9amu46eg0jj8z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MmNaazhqyzROPCtl5906Gw4AAAAAAFir9MoS21577ZVrrrkmSXL77be/ZYmt2Wxm/PjxSZIhQ4Zk5513Xq5z/eEPf8g3v/nNLFiwIIMHD86XvvSlbL755sud/a0sWrQot99+e8/rnXbaabn2mTBhQv74xz8mSXbcccc0Go225AMAANYs9bEH07zih8kfn2kN1h+ecuxprceHNt76TtYAAAAAAADLq1e2lLbddtueotftt9+eJ5544k1rbrjhhp67kh155JHp2/eNfb9HH300J510Uk466aTFPm712Wefzde//vV0dXVlwIAB+bu/+7tsvfWyPW7nkUceydy5cxf7/sKFC/Pd7363J+vuu++e4cOHv2ndvffem1rrYveZMmVKvv3tb/e8Puyww5YpJwAAsOark57Jon//+zT/7X+0CmyDBqccf2Ya//Ifaex3iAIbAAAAAACwUvTKO7ElyUc/+tGcffbZ6e7uzr/8y7/kuOOOy84775zu7u7cfffdufXWW5MkI0eOzIc+9KFl3n/KlCn5yle+0lNAO+WUUzJ48OA8//zzi/3Muuuum3XXXfcNs/Hjx+eb3/xm9thjj4wZMyabbrppBg8enPnz5+fpp5/Orbfe2vMo0XXXXTdnnXXWW+79rW99KyNGjMhee+2VbbfdNhtuuGH69euXV155JQ899FBuu+22zJ8/P0my7777Zu+9917m7wwAAKyZ6oyXU6+9KPXXtyW1Jn36phx0ZMoHT04Ztk6n4wEAAAAAAGu5Xlti22qrrfL5z38+55xzTubNm5dLLrnkTWtGjhyZL3zhCxk0aNAy7z9hwoTMnDmz5/WPf/zjt/3MiSeemJNOOulN8/nz5+fOO+/MnXfeudjPjh49Op///Oez8cYbL3bNlClTct111y0xw2GHHZYzzzzzbbMCAABrvvra3NSfXZl663XJgu4kSdnjPSnHnZGy8cgOpwMAAAAAAHqLlV5iq7Xm4YcfzqOPPpqnnnoqU6dOzdy5czN//vwMHDgwQ4YMycYbb5xtttkmY8aMya677ppSysqOlSTZY4898q1vfSs33XRT7r///syYMSN9+/bNiBEjss8+++SII47IgAEDVkmWxTnmmGOy5ZZb5oknnsikSZMya9aszJkzJ/369cu6666bbZuRFtMAAKnNSURBVLbZJvvss0/22muvNBqLfzrsf//v/z1PPPFEJk6cmGnTpmX27Nnp6urKoEGDsskmm2THHXfMwQcfnNGjR6/CbwcAAHRCXbggdfzPU2+4NJkzqzXcbkwaJ56VsvUOnQ0HAAAAAAD0OqXWWlfGxs1mMzfeeGN+9rOf5eWXX17qz2244YY54ogjctRRRy2xlMXqadq0aVmwYEGnYwCrkVJKRo4cmRdffDEr6V85wBrK9QFWvVpr8ru70rzqgmTalNZwxKg0Tjgz2XWvVfYXipaGawSwOK4PwOK4PgCL4/oALI7rA7AkrhHQHv369ctGG230tutWyp3YJk2alP/9v/93nn/++WX+7PTp03PRRRfljjvuyF/+5V9m8803XwkJAQAAepf65GNp/vT85JknWoN11ks5+sMp73l/Sp8+nQ0HAAAAAAD0am0vsT399NP56le/mtmzZy92TSkl/fv3T3d392Lbqs8//3z+4R/+IV/60pey9dZbtzsmAABAr1BfnJTmVT9OHrynNRgwMOWw41IOOzZl4KDOhgMAAAAAAEibS2yvvfZavvGNb7ypwDZixIi8973vzc4775zNN988Q4cO7Xlvzpw5ef755/PYY4/ljjvuyJQpU97w3je+8Y38r//1vzJkyJB2RgUAAFir1ZmvpF5/Seodv0iazaTRSHnPYSkfOiVlvQ06HQ8AAAAAAKBHW0tsF198cV599dWe1/3798+ZZ56ZQw45JKWUt/zM0KFDM2bMmIwZMyYnnHBCbr311lxwwQXp7u5Okrz66qu55JJL8md/9mftjAoAALBWqvPnpd5yberPr0q65reGu+6VxglnpozcvLPhAAAAAAAA3kLbSmzd3d254447el73798/Z599drbffvul3qOUkve///3ZYost8k//9E9ZsGBBkuSOO+7IRz7ykfTv379dcQEAANYqtbko9a5xqddelMx8pTXcavs0Tvxoyva7dDYcAAAAAADAErStxPboo49m/vz5Pa/Hjh27TAW219t+++0zduzYXHzxxUmS+fPn59FHH81uu+3WlqwAAABrk/rI79K84kfJ5Odag41GpBz3kZQ99l/sXbEBAAAAAABWF20rsU2bNu3/btq3bw455JAV2u/QQw/NZZddlkWLFr1pfwAAAJI66Zk0f/qj5LEHWoPBQ1M+dHLKQR9I6duvk9EAAAAAAACWWttKbHPmzOk53njjjTNkyJAV2m/I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mfd+7rnncvbZZ2f+/Plvem/OnDl58skn8+STT+bGG2/Mpz71qey3334r9F2W1q233przzz8/Cxcu7JktWLAgEyZMyIQJE/LLX/4yf/d3f5d11nGHEwCgfeprc9I896vJH59u3VltcebOTub+13GjT8rYj6a87yiPDgUAAAAAAIC1XK8ssT3zzDP593//93R3d2fgwIE59thjs8suu6S7uzt33XVXxo0blxdffDFf+9rX8vWvfz2DBg1apv3nzZvXU2DbYYcdsvvuu2frrbfOsGHDMmvWrNxzzz0ZN25c5s2bl29/+9sZNGhQdttttyXuuc022+Qzn/nMcn/n+++/P9///vdTa826666b448/Ptttt13mzJmTW2+9Nffee28mTpyYb33rW/mHf/iHNBqN5T4XAMCf1NfmpPn1v01enJSkLv0Hm4tS7/hFyn6HJIOHrrR8AAAAAAAAQOf1yhLbj370o3R3d6dPnz758pe/nO23/7+Pp9pll10ycuTIXHjhhXnxxRdz/fXX56STTlqm/Usp2XfffTN27NiMGjXqTe/vuuuu2W233fKtb30rzWYz559/fr797W+nlLLYPQcMGJDRo0cvU44/WbhwYX74wx+m1ppBgwbln//5n99wh7l3vetd+cEPfpBf/OIXmTBhQn71q1/loIMOWq5zAQD8Sa21dQe2ZS2w/ckLk9I896tp/M1XlvhzEgAAAAAAALBm63W325o4cWIef/zxJMnBBx/8hgLbnxx11FHZbLPNkiQ333zzGx6/uTR22GGH/Lf/9t/essD2J3vuuWf22muvJMlLL72UZ555ZpnOsSzuvffevPTSS0mS44477i0fkXrGGWdkyJAhSZLrrrtupWUBAHqPeve41iNEl6fA1toh+ePTrX0AAAAAAACAtVavK7Hde++9PccHH3zwW65pNBo58MADkyRz587No48+ulKy7Lzzzj3HfyqZrQy//e1ve44Xd4e1AQMGZN99902STJo0KS+88MJKywMArP1qrak3X5HMe23FNpr3WurNV6TW5S3CAQAAAAAAAKu7Xldi+8Mf/pCkVdraeuutF7tuzJgxb/pMu73+Dm+Nxsr7RzFhwoQkyaabbpr11ltvsetWxXcGAHqJZycmc2a3Z685s1v7AQAAAAAAAGulvp0OsKpNmjQpSTJixIj06dNnses23XTTN32m3R577LGe4z89vnRxJk+enC9+8Yt54YUXsmDBggwbNixbb7119t577+y///7p2/et/1HOnz8/06dPT/LG7/RWXp9h8uTJS/s1AADepD76u2Rum0psc2enPvpAylbbtWc/AAAAAAAAYLXSq0ps3d3dmT279YepG2644RLXDh06NAMGDEhXV1dPCaydnn322dx///1JktGjR2fUqFFLXD9z5szMnDmz5/WMGTMyY8aM3Hfffbn22mvzV3/1V2+5x+uzv913fv37L7/88hLXLliwIAsWLOh5XUrJoEGDUkpJKWWJnwV6lz9dE1wboHepTzz29ouWZb+Jj7mOQC/jZwhgcVwfgMVxfQAWx/UBWBzXB2BJXCNg1epVJbb58+f3HA8cOPBt1w8cODBdXV1v+Fw7LFiwIN/73vfSbDaTJKeccspi15ZS8o53vCO77bZbtthiiwwbNizz5s3LM888k1tuuSWTJ0/OpEmT8o//+I/52te+luHDh7/h8/PmzXvD91mS17//dt/56quvzhVXXNHzequttso3vvGNN50f4E9GjBjR6QjAKjL/od9m2lOPt3XP/nVRNhk5sq17AmsGP0MAi+P6ACyO6wOwOK4PwOK4PgBL4hoBq0avKrF1d3f3HC/u8Zuv96c1r/9cO5x33nl56qmnkiQHHnhg9thjj8Wu/Zu/+ZsMGTLkTfOddtophx12WL73ve9l/PjxmTlzZn70ox/lb/7mb96w7vV3S3u77/z691//ubdy3HHH5aijjup5/afm8csvv/y2nwV6l1JKRowYkSlTpqTW2uk4wEpUX52e5uXnp977q7bv3V365MUXX2z7vsDqy88QwOK4PgCL4/oALI7rA7A4rg/AkrhGQHv07ds3G2200duvWwVZVhv9+/fvOV64cOHbrv/Tmtd/bkVdffXVue2225Ik22yzTT7+8Y8vcf1bFdj+pG/fvvn0pz+dJ598Mi+88ELuvffezJgxIxtssEHPmn79+vUcv913fv37r//cW+nXr99brqm1ungDb8n1AdZeddGi1NtuSL3u4mT+vKQ0ki23SZ55sm3nKNuOcQ2BXsrPEMDiuD4Ai+P6ACyO6wOwOK4PwJK4RsCq0eh0gFVpWR6X+fo1S/Po0aVxyy235JJLLkmSbLbZZvnCF76wwnv36dMn73vf+3peP/bYY294f9CgQT3Hb/edl/VxqwAA9cnH0vznz6defl6rwLbV9ml86X+mceqnkyHD2nOSIcNSdt6tPXsBAAAAAAAAq51edye2YcOGZfbs2Zk+ffoS186ZMyddXV1Jkg033HCFz33nnXfmBz/4QZJko402ype//OWss846K7xvkowaNarneMaMGW947/V3ZXu77/z694cPH96WbADA2qnOejX1ih+l/rp1h9kMGZZywpkp+x+a0mi0/kbS0GHJ3NkrfrKhw5Itt13xfQAAAAAAAIDVUq+6E1vyfwtfU6ZMyaJFixa77oUXXnjTZ5bXfffdl3PPPTe11qy//vo5++yz21KMWxqDBg3qOdfrv9NbmTx5cs/xZptttlJzAQBrptpclObtN6V59md6CmzlvYel8c//kcZ7D0tptH68LKWkHHliMmjwip1w0OCUI09MKWVFowMAAAAAAACrqV5XYtthhx2SJF1dXXn66acXu+71j+X802eWx+9///v827/9WxYtWpRhw4bly1/+ckaMGLHc+72VSZMm9Ryvv/76b3p/xx13TNIqsb366quL3add3xkAWDvVZ55I86v/X+rF301em5uM3jqNv/tmGh/5XMqwN99htux3SLL51kmWt4BWks23bu0DAAAAAAAArLV6XYltr7326jm+/fbb33JNs9nM+PHjkyRDhgzJzjvvvFzn+sMf/pBvfvObWbBgQQYPHpwvfelL2XzzzZdrr8VZtGjRG77HTjvt9KY1e+65Z8/xL3/5y7fcp6urK7/+9a+TtO48t+mmm7Y1JwCw5qpzZ6f5k3PT/Nr/lzw3MRk0JOXUT6bxpf+Zss2Oi/1cKSWNz34xGTkqy15kK8mmo9L47BfdhQ0AAAAAAADWcr2uxLbtttv2FL1uv/32PPHEE29ac8MNN/Q8WvPII49M37593/D+o48+mpNOOiknnXRSzj333Lc8z7PPPpuvf/3r6erqyoABA/J3f/d32XrrrZcp6yOPPJK5c+cu9v2FCxfmu9/9bk/W3XffPcOHD3/Tur322iubbLJJkuTqq6/OlClT3rTmJz/5Sc+5jj766GXKCQCsnWqzmeadt6T55c+k/urnSa0p+xycxr98J433HZXS6PO2e5TBQ9P4u28k2++89I8WHTQ42X7nNP72GymDh67gtwAAAAAAAABWd33ffsna56Mf/WjOPvvsdHd351/+5V9y3HHHZeedd053d3fu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xGjAgAG67LLL1Lp16xrbmT59unbs2OFRn5999lm94wXgqjHHh1WrVun111/3qOz999+vMWPG1FimuLhY33zzjdavX6/09HSVlZWpXbt2GjRokCZMmKCoqKh6xwqgqsYaH06cOKHf/e53daoTFRWlOXPmVLnO/AHwrezsbO3bt0/79u1TamqqUlNTlZubK0kaPXq0HnjgAa/3mZycrFWrVunQoUMqKChQZGSkevfurSuuuEK9evXyqA3mEEDj89X4UFBQoB9//FE///yzDhw4oBMnTqikpEShoaHq2rWrBg0apHHjxiksLKzGdh544AFlZmbW2p+7OQgAz/lqfPjss8+0YMECj8o+88wzSkhIqLFMTk6Oli5dqh9++ME5XkRFRWnIkCG68sorFRER0eCYgZbOF+NDSkqKnn322TrV6du3r6ZPn17lOvMHwLdSU1P1008/adeuXTp69KhycnLk5+entm3bKj4+XuPGjVPv3r292ifPIADfIImtBdi0aZNee+01FRYWOq8VFxc7J30rVqzQU089pejo6Hr3Ybfb9Y9//EMrV650uZ6VlaWsrCz98MMPGjdunH7zm9/IZnO/AGBOTo5mzJih1NRUl+sZGRnKyMjQ6tWrdeedd2r8+PH1jhXAfzXm+HDo0CFNmzZNRUVFVe7l5eVp79692rt3r7766ivde++9GjFiRINeCwDv8sX8wVvS09M1Y8YMpaWluVw/fvy4jh8/rhUrVuihhx7S4MGDLYoQaF6a2vgQGxvrk34A1Oyee+7xWV8lJSX6y1/+op9++snl+smTJ5WcnKy1a9dq4sSJuvnmm2tshzkE4Bu+GB9++uknzZo1S6WlpVXu5ebmKiUlRSkpKVq8eLEeeugh9evXr9FjAlA7X84fvGXv3r3685//rDNnzrhcP3z4sA4fPqyVK1fqD3/4g3r06GFNgEAz0VTHB55BANZ75plntHPnzirXy8rKlJaWprS0NK1atUqjRo3Sb3/7W/n7NywlhmcQgG+RxNbMHThwQK+88opKSkoUHBys66+/Xv369VNJSYnWrl2rFStWKC0tTTNmzNCLL76okJCQevXzySefOBPYunXrpmuvvVYdO3ZURkaGvvzySx04cEArV65Uq1atdOutt1bbht1u16xZs5wJbEOHDlVSUpLCw8O1d+9e/etf/1J2drb+8Y9/qG3bth6v7Aageo09PhQWFjoT2OLj4zV48GDFxcUpIiJCOTk52rBhg1asWKHCwkLNnj1bISEhtb6vu3fvrvvuu6/erxmAZ3w1f6jw9NNPq02bNm7vt2vXzu29wsJClw9+48eP18UXX6zAwEBt375dixYtUmFhoV555RU999xzOv/88xsUK9DSNfb40LZtW82aNavWcosWLVJycrIkx19g14T5A+B77du3V6dOnbR169ZGaf/11193PjxOSEjQlVdeqTZt2ujw4cNauHChMjIy9Pnnn6tNmzZKSkqqtg3mEIA1Gmt8yM3NVWlpqQzDUP/+/XXhhRfqvPPOU1hYmE6dOqXk5GStW7dOZ86c0cyZMz16XycmJmry5Mlu7zf0l2EAXDX2/KFCbZ83OnTo4PbeyZMnNXPmTOdqL1dddZXzF80//vijvvrqK50+fVozZ87Uiy++WOPzDACea6zxoXv37h49g5g3b55zpffankEwfwAaX1ZWliSpTZs2Gj58uHr37q327dvLbrdrz549WrJkibKysrRmzRqVl5fr4YcfblB/PIMAfIv/KZu5d999VyUlJfLz89PUqVNdlrLs16+fYmJi9MEHHygtLU2LFy/WpEmT6tzH8ePHtXjxYkmOCd+zzz6rwMBASVKPHj2UmJio6dOnKzU1VYsXL9a4ceOqXZVh1apV2rVrlyTpsssu09133+2816NHDw0cOFBPPPGECgsL9c4776h///7y8/Orc7wAHBp7fDAMQ8OHD9fNN9+szp07V7k/YMAADRw4ULNmzZLdbte8efM0e/ZsGYbhts2goCB17dq1TnEAqDtfzB8qi4mJqfEhcU2+/PJL5we/X/3qV7r22mud93r16qWEhARNnz5dxcXFevfdd6td7h+A5xp7fPD396/1/3q73a6UlBRJUkhIiIYOHVpjeeYPgG9MnDhR3bt3V/fu3dW6det6bQ/sie3bt2vdunWSpMGDB+sPf/iDc8X3imcQTz75pE6ePKkPP/xQw4YNU3h4eJV2mEMAvuOL8cHf319JSUm68cYb1b59e5d73bp1U2JiouLj4/XOO++ouLhY8+fP1zPPPFNjm2FhYcwhgEbmq/lDZQ15X3/yySfKycmRJD300EMaPny4816fPn0UFxenV155RdnZ2frkk08aZTt1oKXwxfgQHBxc65iQn5+vvXv3SpKio6MVHx9fY3nm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4446xwrAVWOPD5mZmXr22WfVq1cvDR48WOedd57zvZ+RkaH169drw4YNzr9Iuu2229yunnDttddq3bp1SktL0wcffKD09HSNGDFCgYGBSklJ0cKFC1VeXq7AwEBNmTKlfl8QAE6++HxR2dq1a1VWViapbtt4MH8AfG/Xrl0uvyDOyclxHqenp7v8RbFU/5UV+/XrpxEjRmjdunXatGmTnnvuOV111VVq06aNDh8+rH/96186efKkJOmXv/ylwsPDq22HOQTgO74YH/bs2aNZs2aprKxMfn5+uv3221VWVlbjM4h27dopLCzM5dqiRYs0e/ZsDR06VL1791Z0dLSCg4NVUFCg3bt3a9myZc4xJjY2VpMmTapzrAD+yxfjw/79+/XGG28oISFBAwcOVNeuXRUeHi673a5jx44pOTnZmXhms9n0m9/8RsHBwdW2NXnyZG3ZskU5OTl69dVXlZqaqsGDB0ty/DHekiVLJEmtWrWq1y/TAfyXrz5fVFaxsrxUt2cQzB8A33rllVec/3f369dP48aNq3He7+/vr9jY2Hr1xTMIwPdIYmvmunXrpkceeUSvvfaaCgsL9fHHH1cpExMTo6eeekohISH17mfy5MnKzs7Wt99+qwMHDuiVV16pUmbcuHE1fnCz2Wz6wx/+oBkzZig1NVUbNmzQhg0bXMoEBATozjvv1MCBA+sdKwCHxh4fdu3apezsbOf5/Pnza60zceLEaj/AFRUVKTk5WcnJyW7rdu3aVY888kid/8oaQFW+mj/s2bPH7VbkkmNp/dtvv11JSUluy4SEhOipp57SjBkzlJaWpuXLlzuTaCqXeeihhzxewQmAe74aHypUbONhs9mcqx54ivkD4FsrVqxw+aVPZbt373b+hXSFhvyS6f7771dhYaF++uknpaSkKCUlxeW+YRi66aabmEMATYQvxoctW7aouLhYkmOVhNmzZ9da5/7776+2r7y8PK1cudK5KlN1+vbtq4ceesjtL6kAeMZX8we73a6ff/5ZP//8s9syERER+u1vf1vjFqDt27fXE088oT//+c86c+aMvvjiC33xxRcuZVq3bq0//OEPateuXb1iBeDgy88XkmOc+O677yQ5VlOq63bAzB8A39m4caPzePv27Xr88cdrLB8VFeXRjhDu8AwC8C2S2FqAxMREzZo1S19//bU2b96srKws+fv7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/O6779Zll11W53YAAAAAAID3kcQGAAAAAAAAr9uzZ49mzpzpNpFKkjIyMvTSSy9pypQpmjBhgvP6ypUr9eabb6q8vNxt3Z07d2rq1Kn64x//qN69e3sc1969e/Xqq6/qxIkTNZYzTVOpqal66aWXNHjwYD388MNNflWudevWae7cuSosLKyxXGFhodasWaPvv/9et912m6644gofRegQFxenLl266MiRI5IciXu1JbFVTurq2rWrunXrpvz8/Dr3/b//+7/av3+/R2Xtdru2bt2qrVu36vLLL9eUKVO8svpbU2aapt555x198803Vofi4qKLLlKrVq2Uk5MjyfGzfvvtt9fpPVlaWuqyfW1QUJBGjhzp9VgBAAAAAED92KwOAAAAAAAAAM1Lenq6ZsyY4Uxg8/PzU2xsrLp3715lG0LTNPXuu+9q586dkqTk5GTNnTvXmcAWFBSkLl26KC4uTmFhYS51i4qKNGvWLOXl5XkU16ZNm/Tss89WSWDz9/dXbGysevTooU6dOlVJVPrxxx/1f//3fyopKfH8i+Bjy5cv16uvvlolgS04OFhdunTR+eefX+XrV1paqnnz5tW4ElZjqbyS2rZt22pcEe306dPatm2b83zUqFH17re0tLTKtTZt2qhLly7q2bOnunbtqtDQ0Cpl/v3vf2vu3Ln17vdc8fHHH7sksAUGBqpTp06Ki4uzdHtdf39/lxUICwsLtW7dujq1sXHjRpek2uHDh1f7vQYAAAAAANZgJTYAAAAAAAB41dy5c5Wfn6+wsDDdfPPNGj16tEsC1b59+/TGG2/o8OHDkhyJbO+9954efvhhzZ07V6ZpKiYmRr/85S81aNAg+fs7HmHZ7XatX79eb775pnMVrpycHP3rX//Sr3/96xpjOnLkiF555RWXRLQ+ffrouuuuU79+/RQYGOi8XlhYqLVr1+rTTz9Vdna2M+b58+frnnvu8crX6MEHH1RJSYmys7P12muvOa8PGDBA11xzjdt6Xbp0qXJt//79evvtt122fWzfvr1uu+02JSYmKiAgQJLj67dt2za9//77zlXQJMf2j927d9fAgQO98dI8cskll+ijjz6S3W6X3W7Xd9995/Z1f/fdd7Lb7ZIcW3xecsklDeq7ffv2GjZsmAYNGqS4uLgqiUymaerw4cNatmyZli9f7ux71apVSkxMdNlKs8KA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HrdRVlamVatWadGiRV6Nzd/fXzExMc7zgwcPKj093eP6F1xwgc477zzneXFxsV566aUak/TKysr08ssvuyQ8tWnTRiNHjqxj9N5lGIaCg4Nd/nlrC8j4+HiX82XLltX6dV62bJkWL15c5746d+7scr5+/fo61Y+Li3PZJnbv3r1KTk6usc7mzZv18ccf16kfK7Rv395lNbbt27crLy+vQW2OHTtWfn5+zvMlS5a43Lc6ORMAAAAAAHjG3+oAAAAAAAAAgMZks9n02GOP6Y9//KMzuWvPnj167LHHNGHCBI0cOVKxsbFV6p05c0apqan68ccftXHjRuXk5Hhte8vKBgwYoGPHjkmS7Ha7nnnmGSUlJem8886rsv1ily5d1KZNG+e5YRi677779PTTT6u8vFySY/vJP/zhD7rtttuUmJgof39/Z9vbt2/Xe++9p8OHD7u0e9999ykwMNDrr62piI6OVq9evbRnzx5JUmFhoZ555hlNmTJFQ4cOdUmCOnjwoBYuXOhcAa1Tp07O748nEhIS5Ofn5/x+rF69WoWFhRo0aJDatGnj0ldgYKB69+7tUt/f31+jR4/Wl19+6bz2+uuv6/Tp07r00ktdfibS09P19ddf6z//+Y/sdrs6duyojIyMOnxlfMtms6lfv37atGmTJCk/P19PP/20xo4dq06dOlXZzjYuLq7K6m1ni4yM1NChQ6tdsa5t27YaNGiQ914AAAAAAABoNCSxAQAAAAAAoNmLjY3V448/rr/85S/Kz8+X5EigWbBggRYsWKCIiAi1bt1awcHBKigoUG5urnJycnwS22WXXaZly5aptLRUknT69OkqW31WuP/++zVmzBiXa3Fxcbrrrrv05ptvyjRNSVJmZqb++te/KiQkRFFRUbLZbMrMzHS+9somTZqkCy+80KuvqSm67bbbNH36dGdy2enTp/Xyyy8rODhYMTExMgxDp06dctk+NCgoSA899JCeeOIJj/uJjIzUqFGj9O233zqvbdy4URs3bqxSNioqSnPmzKly/cYbb1RycrJztcCysjK9//77+uSTTxQdHa3AwECdOXPGZevYTp066ZZbbtGsWbM8jtUKV199tX788Ufnz2paWpo++uijass+88wzSkhIqLXNSy+9tNoktjFjxrhs1wsAAAAAAJouPsEDAAAAAACgRejXr59mzJih7t27V7mXm5urI0eOaO/evTp27Fi1CWyGYahdu3Zejys2NlYPPvhglVXX6iIpKUkPP/ywQkJCXK4XFhbq8OHDOnjwYJUEtoCAAN15552aOHFivfs9l8THx+vee+91WQlNkoqKinTgwAHt37/fJYEtLCxMTz75pLp161bnvqZMmaL+/fvXO9bQ0FD9z//8jyIiIlyul5aW6siRI0pNTXVJYDvvvPM0bdo0hYWF1btPX+nbt6+mTJlS5fvQEP369XPZlldyvF/HjRvntT4AAAAAAEDjYiU2AAAAAAAAtBjR0dGaMWOGNm3apK+//lq7du1SWVmZ2/I2m009evTQhRdeqEsuuUQdO3ZslLiGDRum+Ph4rV69WikpKTp69Kjy8/NVXFzsXLGqNiNGjFBCQoIWLFigtWvXKi8vr9pyISEhGjJkiCZNmqQOHTp482U0eWPGjFFsbKw+/PBD7dy5s9oyAQEBGjlypCZPnuyydWtdhISE6Omnn9bWrVv1/fff68CBAzp58qQKCwudK8HVJi4uTjNnztSHH36o77//Xna7vUqZsLAwTZgwQddff70CAwOVlpZWr3h9bcKECRo4cKDWrFmjXbt26dixYyooKFBJSYnHP+9nGzt2rMuKbv37929xP98AAAAAAJzLDLO+TwUAAAAAAACAc1xxcbH27t2rkydPKi8vTyUlJQoODlZERIRiY2PVqVOnBq2QZhW73a59+/YpLS1N2dnZMk1TrVq1UseOHdWrVy/5+/O3rSdOnNDu3bt1+vRplZWVKTQ0VLGxsYqPj1dQUJDV4bnIz89XSkqKTp06pYKCAoWGhqpLly6Kj49XQECA1eE1CX/729+0Zs0a5/nvf/97DRs2zMKIAAAAAABAXZDEBgAAAAAAAAA4Z+Xn5+vee+9VSUmJJCkyMlJ///vfSdYEAAAAAOAcYrM6AAAAAAAAAAAA6mvNmjXOBDbJsW0sCWwAAAAAAJxbSGIDAAAAAAAAAJyTysrK9NVXXznPDcPQpZdeamFEAAAAAACgPkhiAwAAAAAAAACck/71r3/pxIkTzvOLLrpIHTp0sDAiAAAAAABQH6ypDgAAAAAAAABo8jIyMpSRkSFJysrK0qZNm7Rx40bnfZvNpokTJ1oVHgAAAAAAaACS2AAAAAAAAAAATd7q1au1YMECt/evuuoqde3a1YcRAQAAAAAAb2E7UQAAAAAAAADAOS0xMVG33HKL1WEAAAAAAIB6YiU2AAAAAAAAAMA5xTAMhYWFqVu3bho9erQuueQSGYZhdVgAAAAAAKCeDNM0TauDAAAAAAAAAAAAAAAAAAC0TGwnCgAAAAAAAAAAAAAAAACwDElsAAAAAAAAAAAAAAAAAADLkMQGAAAAAAAAAAAAAAAAALAMSWwAAAAAAAAAAAAAAAAAAMuQxAYAAAAAAAAAAAAAAAAAsAxJbAAAAAAAAAAAAAAAAAAAy5DEBgAAAAAAAAAAAAAAAACwDElsAAAAAAAAAAAAAAAAAADLkMQGAAAAAAAAAAAAAAAAALDM/wNsAXqleq6B+QAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "t_ = np.linspace(0.1, 2.1, 200)\n", - "nu_0 = 0.2**2\n", - "nu_inf = 0.3**2\n", - "kappa = 0.5\n", - "IV_ATM = [(theta(t, *new_paramsATM)/t)**.5 for t in t_]\n", - "fig, axs = plt.subplots(1,figsize = (30, 15))\n", - "axs.scatter(T_ATM, Vol_ATM, label=\"Market\", s = 200)\n", - "axs.plot(t_, IV_ATM, label = \"Model\")\n", - "axs.set_title('ATM Implied Volatility', fontsize = 30,)\n", - "axs.set_xlabel('Time to Maturity', fontsize = 30)\n", - "axs.set_ylabel('Implied Volatility', fontsize = 30)\n", - "axs.tick_params(axis='x', labelsize = 20)\n", - "axs.tick_params(axis='y', labelsize = 20)\n", - "axs.legend(fontsize=30)\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.005135376331886448" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "new_params[0]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Parameters [eta, lambda_, rho]: [ 5.13537633e-03 -4.69086188e-01 -5.65480445e+01]\n" - ] - } - ], - "source": [ - "def MSE_Price_SSVI(params):\n", - " MSE_Price = 0\n", - " for i in range(len(MarketPrice)):\n", - " MSE_Price = MSE_Price +\\\n", - " (CallPrice(S0, (TotalVarSSVI(S0, K[i], T[i], *new_paramsATM, *params)/T[i])**.5,\\\n", - " K[i], T[i], r) - MarketPrice[i])**2\n", - " return MSE_Price / len(MarketPrice)\n", - "warnings.filterwarnings('ignore')\n", - "params = [1.0, -2.0, -0.5] # initial params (eta, lambda_, rho)\n", - "result = minimize(MSE_Price_SSVI, params, method='SLSQP', tol=1e-10)\n", - "new_params = result['x']\n", - "print(\"Parameters [eta, lambda_, rho]: \" + str(new_params))\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "80 100\n", - "85 100\n", - "90 100\n", - "95 100\n", - "100 100\n", - "105 100\n", - "110 100\n", - "115 100\n", - "120 100\n", - "80 100\n", - "85 100\n", - "90 100\n", - "95 100\n", - "100 100\n", - "105 100\n", - "110 100\n", - "115 100\n", - "120 100\n", - "80 100\n", - "85 100\n", - "90 100\n", - "95 100\n", - "100 100\n", - "105 100\n", - "110 100\n", - "115 100\n", - "120 100\n", - "80 100\n", - "85 100\n", - "90 100\n", - "95 100\n", - "100 100\n", - "105 100\n", - "110 100\n", - "115 100\n", - "120 100\n", - "ATM -> var0=0.0399, var_inf=0.1368, kappa=0.1978\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "Surface -> eta=0.9105, lambda=-0.3584, rho=-0.2909\n", - "[ 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120\n", - " 80 85 90 95 100 105 110 115 120 80 85 90 95 100 105 110 115 120] 100\n", - "Overall implied-vol RMSE: 0.002149\n" - ] - } - ], - "source": [ - "import numpy as np, math, random\n", - "from typing import List, Tuple\n", - "# -------------------------------------------------\n", - "# 1. Black-Scholes Call price (no SciPy need)\n", - "# -------------------------------------------------\n", - "def normal_cdf(x): # Φ(x)\n", - " return 0.5 * (1.0 + math.erf(x / math.sqrt(2)))\n", - "\n", - "def bs_call_price(spot, strike, maturity, rate, vol):\n", - " \"\"\"Black-Scholes European call.\"\"\"\n", - " if vol <= 0 or maturity <= 0:\n", - " return max(0.0, spot - strike)\n", - " d1 = (math.log(spot / strike) + (rate + 0.5 * vol**2) * maturity) / (vol * math.sqrt(maturity))\n", - " d2 = d1 - vol * math.sqrt(maturity)\n", - " return (spot * normal_cdf(d1) -\n", - " strike * math.exp(-rate * maturity) * normal_cdf(d2))\n", - "\n", - "# -------------------------------------------------\n", - "# 2. SSVI helpers\n", - "# -------------------------------------------------\n", - "def atm_total_variance(t, var0, var_inf, kappa):\n", - " \"\"\"\n", - " θ(t) = ((var0 - var_inf)*(1 - e^{-κ t})/(κ t) + var_inf) * t\n", - " \"\"\"\n", - " return ((var0 - var_inf) * (1 - np.exp(-kappa * t))\n", - " / (kappa * t) + var_inf) * t\n", - "\n", - "def skew_phi(theta_t, eta, lam):\n", - " return eta * theta_t ** lam\n", - "\n", - "def ssvi_total_variance(log_moneyness, theta_t, eta, lam, rho):\n", - " phi_val = skew_phi(theta_t, eta, lam)\n", - " term1 = rho * phi_val * log_moneyness\n", - " term2 = np.sqrt((phi_val * log_moneyness + rho)**2 + 1 - rho**2)\n", - " return 0.5 * theta_t * (1 + term1 + term2)\n", - "\n", - "def ssvi_implied_vol(fwd, strike, maturity,\n", - " var0, var_inf, kappa,\n", - " eta, lam, rho):\n", - " \"\"\"Return σ implied by SSVI.\"\"\"\n", - " print(strike, fwd)\n", - " k = np.log(strike / fwd) # log-moneyness\n", - " theta_t = atm_total_variance(maturity, var0, var_inf, kappa)\n", - " total_var = ssvi_total_variance(k, theta_t, eta, lam, rho)\n", - " return np.sqrt(total_var / maturity)\n", - "\n", - "# -------------------------------------------------\n", - "# 3. Example “market” surface (for demo only)\n", - "# -------------------------------------------------\n", - "rate = 0.05\n", - "fwd = spot = 100\n", - "maturities = np.array([0.1, 0.25, 0.5, 1.0])\n", - "strikes = np.arange(80, 121, 5)\n", - "\n", - "# Ground-truth parameters to generate fake market data\n", - "true_var0, true_var_inf, true_kappa = 0.04, 0.09, 0.4\n", - "true_eta, true_lambda, true_rho = 0.8, -0.4, -0.3\n", - "\n", - "market_iv = []\n", - "K_grid = []\n", - "T_grid = []\n", - "\n", - "for T in maturities:\n", - " for K in strikes:\n", - " iv = ssvi_implied_vol(fwd, K, T,\n", - " true_var0, true_var_inf, true_kappa,\n", - " true_eta, true_lambda, true_rho)\n", - " market_iv.append(iv)\n", - " K_grid.append(K)\n", - " T_grid.append(T)\n", - "\n", - "market_iv = np.array(market_iv)\n", - "K_grid = np.array(K_grid)\n", - "T_grid = np.array(T_grid)\n", - "\n", - "# -------------------------------------------------\n", - "# 4. Simple random-search calibration\n", - "# (pure Python / NumPy, no external optimizer)\n", - "# -------------------------------------------------\n", - "def random_search(objective:callable, \n", - " bounds: List[Tuple[float, float]], \n", - " iterations:int=4000): ## Custom Optimization\n", - " best_x, best_val = None, 1e20\n", - " for _ in range(iterations):\n", - " ## Bounds is a list of tuples, each tuple is (lo, hi)\n", - " candidate = np.array([random.uniform(lo, hi) for lo, hi in bounds])\n", - " val = objective(candidate)\n", - "\n", - " ## Update best_x and best_val if candidate is better\n", - " if val < best_val:\n", - " best_x, best_val = candidate, val\n", - " return best_x\n", - "\n", - "# ---- Stage-A: fit ATM term-structure (var0, var_inf, kappa)\n", - "atm_mask = K_grid == fwd\n", - "T_atm, iv_atm = T_grid[atm_mask], market_iv[atm_mask]\n", - "\n", - "def atm_loss(params):\n", - " var0, var_inf, kappa = params\n", - " if min(params) <= 0: # keep parameters positive\n", - " return 1e9\n", - " model_iv = np.sqrt(atm_total_variance(T_atm, var0, var_inf, kappa) / T_atm)\n", - " return np.mean((model_iv - iv_atm)**2)\n", - "\n", - "atm_bounds = [(1e-4, 0.2), (1e-4, 0.2), (0.05, 3.0)]\n", - "var0_hat, var_inf_hat, kappa_hat = random_search(atm_loss, atm_bounds, 3000)\n", - "print(f\"ATM -> var0={var0_hat:.4f}, var_inf={var_inf_hat:.4f}, kappa={kappa_hat:.4f}\")\n", - "\n", - "# ---- Stage-B: fit surface (eta, lambda, rho)\n", - "def surface_loss(params):\n", - " eta, lam, rho = params\n", - " if eta <= 0 or not (-1 < rho < 1):\n", - " return 1e9\n", - " model_iv = ssvi_implied_vol(fwd, K_grid, T_grid,\n", - " var0_hat, var_inf_hat, kappa_hat,\n", - " eta, lam, rho)\n", - " return np.mean((model_iv - market_iv)**2)\n", - "\n", - "surf_bounds = [(0.05, 2.0), (-1.0, 1.0), (-0.999, 0.999)]\n", - "eta_hat, lambda_hat, rho_hat = random_search(surface_loss, surf_bounds, 4000)\n", - "print(f\"Surface -> eta={eta_hat:.4f}, lambda={lambda_hat:.4f}, rho={rho_hat:.4f}\")\n", - "\n", - "# -------------------------------------------------\n", - "# 5. Quality check (RMSE)\n", - "# -------------------------------------------------\n", - "fitted_iv = ssvi_implied_vol(fwd, K_grid, T_grid,\n", - " var0_hat, var_inf_hat, kappa_hat,\n", - " eta_hat, lambda_hat, rho_hat)\n", - "rmse = np.sqrt(np.mean((fitted_iv - market_iv)**2))\n", - "print(f\"Overall implied-vol RMSE: {rmse:.6f}\")\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "from typing import List, Tuple, Callable\n", - "\n", - "\n", - "# -------------------------------------------------\n", - "# 1. Black-Scholes Call price (no SciPy need)\n", - "# -------------------------------------------------\n", - "def normal_cdf(x): # Φ(x)\n", - " return 0.5 * (1.0 + math.erf(x / math.sqrt(2)))\n", - "\n", - "def bs_call_price(spot, strike, maturity, rate, vol):\n", - " \"\"\"Black-Scholes European call.\"\"\"\n", - " if vol <= 0 or maturity <= 0:\n", - " return max(0.0, spot - strike)\n", - " d1 = (math.log(spot / strike) + (rate + 0.5 * vol**2) * maturity) / (vol * math.sqrt(maturity))\n", - " d2 = d1 - vol * math.sqrt(maturity)\n", - " return (spot * normal_cdf(d1) -\n", - " strike * math.exp(-rate * maturity) * normal_cdf(d2))\n", - "\n", - "# -------------------------------------------------\n", - "# 2. SSVI helpers\n", - "# -------------------------------------------------\n", - "def atm_total_variance(t, var0, var_inf, kappa):\n", - " \"\"\"\n", - " θ(t) = ((var0 - var_inf)*(1 - e^{-κ t})/(κ t) + var_inf) * t\n", - " \"\"\"\n", - " return ((var0 - var_inf) * (1 - np.exp(-kappa * t))\n", - " / (kappa * t) + var_inf) * t\n", - "\n", - "def skew_phi(theta_t, eta, lam):\n", - " return eta * theta_t ** lam\n", - "\n", - "def ssvi_total_variance(log_moneyness, theta_t, eta, lam, rho):\n", - " phi_val = skew_phi(theta_t, eta, lam)\n", - " term1 = rho * phi_val * log_moneyness\n", - " term2 = np.sqrt((phi_val * log_moneyness + rho)**2 + 1 - rho**2)\n", - " return 0.5 * theta_t * (1 + term1 + term2)\n", - "\n", - "def ssvi_implied_vol(fwd, strike, maturity,\n", - " var0, var_inf, kappa,\n", - " eta, lam, rho):\n", - " \"\"\"Return σ implied by SSVI.\"\"\"\n", - " k = np.log(strike / fwd) # log-moneyness\n", - " theta_t = atm_total_variance(maturity, var0, var_inf, kappa)\n", - " total_var = ssvi_total_variance(k, theta_t, eta, lam, rho)\n", - " return np.sqrt(total_var / maturity)\n", - "\n", - "def make_candidate(bounds: List[Tuple[float, float]], iterations) -> np.ndarray:\n", - " \"\"\"\n", - " Generate a random candidate solution within the given bounds.\n", - " bounds: list of (low, high) for each dimension\n", - " \"\"\"\n", - " rng = np.random.default_rng(42)\n", - " low = np.array([b[0] for b in bounds])\n", - " high = np.array([b[1] for b in bounds])\n", - "\n", - " # (iterations, d) matrix of uniform random samples\n", - " candidates = low + (high - low) * rng.random((iterations, len(bounds)))\n", - " return candidates\n", - "\n", - "\n", - "def random_search_vec(objective_multi: Callable[[np.ndarray], np.ndarray],\n", - " bounds: List[Tuple[float, float]],\n", - " iterations: int = 40_000) -> Tuple[np.ndarray, float]:\n", - " \"\"\"\n", - " Vectorised random search.\n", - " objective_multi: accepts an (N, d) array -> returns (N,) array of losses\n", - " bounds : list of (low, high) for each dimension\n", - " iterations : how many random draws\n", - " \"\"\"\n", - "\n", - " # vectorised loss evaluation -> (iterations,)\n", - " candidates = make_candidate(bounds, iterations)\n", - " losses = objective_multi(candidates)\n", - "\n", - " best_idx = np.argmin(losses)\n", - " return candidates[best_idx], losses[best_idx]\n", - "\n", - "\n", - "def atm_loss_multi(X, t, iv_atm):\n", - " \"\"\"\n", - " X : (N, 3) – rows = [var0, var_inf, kappa]\n", - " t, iv_atm – market ATM maturities and vols (1-D)\n", - " returns – loss for each row (shape (N,))\n", - " \"\"\"\n", - " var0, var_inf, kappa = X[:, 0], X[:, 1], X[:, 2]\n", - " theta_t = atm_total_variance(t[:, None], var0, var_inf, kappa) # broadcast\n", - " model_iv = np.sqrt(theta_t / t[:, None])\n", - " mse = ((model_iv - iv_atm[:, None])**2).mean(axis=0) # → (N,)\n", - " return mse\n", - "\n", - "def surface_loss_multi(params_mat):\n", - " \"\"\"\n", - " params_mat : shape (N, 3) – each row [eta, lambda, rho]\n", - " returns : shape (N,) – MSE per candidate\n", - " \"\"\"\n", - " eta, lam, rho = params_mat.T # (N,)\n", - "\n", - " # ---- hard bounds to avoid overflow -----------------------------------\n", - " bad = (eta <= 0) | (lam <= -0.9) | (lam >= 1.0) | (np.abs(rho) >= 0.999)\n", - " # mark bad rows; they get a huge constant loss later\n", - " safe_eta = np.where(bad, 1.0, eta) # (N,)\n", - " safe_lam = np.where(bad, 0.0, lam)\n", - " safe_rho = np.where(bad, 0.0, rho)\n", - "\n", - " # ---- broadcast market grid (M,1) with candidates (1,N) --------------\n", - " k = np.log(K_grid / fwd)[:, None] # (M,1)\n", - " T = T_grid[:, None] # (M,1)\n", - " theta = atm_total_variance(T, var0_hat, var_inf_hat, kappa_hat)\n", - "\n", - " # each safe_* is (N,) so reshape to (1,N) for broadcasting\n", - " total_var = ssvi_total_variance(\n", - " k, theta,\n", - " safe_eta[None, :], safe_lam[None, :], safe_rho[None, :]\n", - " ) # → (M,N)\n", - "\n", - " iv_model = np.sqrt(total_var / T) # (M,N)\n", - "\n", - " # ---- guard against any residual NaN / huge vols ----------------------\n", - " invalid = (~np.isfinite(iv_model)) | (iv_model > 5) # 500 % vol cutoff\n", - " iv_model = np.where(invalid, 1e4, iv_model) # penalise\n", - "\n", - " mse = np.mean((iv_model - market_iv[:, None])**2, axis=0) # (N,)\n", - "\n", - "\n", - " # slam the rows we flagged as ‘bad’\n", - " mse = np.where(bad, 1e9, mse)\n", - " return mse\n", - "\n", - "\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "error_track=[]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "35" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from itertools import product\n", - "width_range = np.arange(0.5, 1, 0.1)\n", - "dte_range= np.arange(0, 70, 10)\n", - "combos=list(product(width_range, dte_range))\n", - "len(combos)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "692\n" - ] - } - ], - "source": [ - "\n", - "\n", - "combo_choice=1\n", - "width, DTE_MIN_THRESHOLD = combos[combo_choice]\n", - "UPPER_BOUND_MONEYENESS = 1+width\n", - "LOWER_BOUND_MONEYENESS = 1-width\n", - "DTE_MAX_THRESHOLD = 730\n", - "DUMAS_WIDTH =0.75\n", - "\n", - "aapl_chain['spot'] = S\n", - "aapl_chain['vol'] = aapl_chain['bs_vol']\n", - "aapl_chain['r'] = rates\n", - "aapl_chain['q'] = q\n", - "aapl_chain['price'] = aapl_chain['Midpoint']\n", - "tgt_right = 'P'\n", - "\n", - "aapl_chain['DTE'] = (aapl_chain['Expiration'] - aapl_chain.index).dt.days\n", - "aapl_chain_clipped = aapl_chain[\n", - " (aapl_chain['DTE'] >= DTE_MIN_THRESHOLD) &\n", - " (aapl_chain['DTE'] <= DTE_MAX_THRESHOLD) &\n", - " (aapl_chain['moneyness'] <= UPPER_BOUND_MONEYENESS) &\n", - " (aapl_chain['moneyness'] >= LOWER_BOUND_MONEYENESS) &\n", - " (aapl_chain['Right'] == tgt_right) \n", - "].copy()\n", - "\n", - "meta={\n", - " 'width': width,\n", - " 'UPPER_BOUND_MONEYENESS': UPPER_BOUND_MONEYENESS,\n", - " 'LOWER_BOUND_MONEYENESS': LOWER_BOUND_MONEYENESS,\n", - " 'DTE_MIN_THRESHOLD': DTE_MIN_THRESHOLD,\n", - " 'surface_loss': float\n", - "}\n", - "print(len(aapl_chain_clipped))" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0 False\n", - "Name: en, dtype: bool" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "meta = [{'en': '0'}]\n", - "pd.DataFrame(\n", - " meta\n", - ").en.astype(int).astype(bool)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
RootExpirationStrikeRightBid_sizeCloseBidAsk_sizeCloseAskDateMidpoint...log_moneynessbs_volcrr_vol_discretecrr_vol_continuousspotvolrqpriceDTE
datetime
2025-07-16AAPL2025-09-19215.0P811.25111.402025071611.325...-0.0152380.2702030.2651420.262993210.1600040.2702030.042320.00480611.32565
2025-07-16AAPL2025-11-21215.0P6914.35714.602025071614.475...-0.0091820.2710780.2636440.263976210.1600040.2710780.042320.00480614.475128
2025-07-16AAPL2025-10-17215.0P512.551312.702025071612.625...-0.0132370.2628290.2562850.257443210.1600040.2628290.042320.00480612.62593
2025-07-16AAPL2025-12-19215.0P115.401915.552025071615.475...-0.0059370.2707030.2626330.262476210.1600040.2707030.042320.00480615.475156
2025-07-16AAPL2026-09-18210.0P3020.453420.902025071620.675...0.0455070.2845750.2719850.272835210.1600040.2845750.042320.00480620.675429
..................................................................
2025-07-16AAPL2026-09-18205.0P5518.204818.852025071618.525...0.0696040.2865750.2751660.275949210.1600040.2865750.042320.00480618.525429
2025-07-16AAPL2026-02-20210.0P8215.053815.502025071615.275...0.0236510.2758270.2674170.268509210.1600040.2758270.042320.00480615.275219
2025-07-16AAPL2026-03-20210.0P3315.903516.252025071616.075...0.0268960.2765770.2675070.268212210.1600040.2765770.042320.00480616.075247
2025-07-16AAPL2026-05-15210.0P1317.507018.202025071617.850...0.0321450.2812010.2708760.272356210.1600040.2812010.042320.00480617.850303
2025-07-16AAPL2026-06-18210.0P1318.402318.702025071618.550...0.0360840.2808260.2697490.270805210.1600040.2808260.042320.00480618.550337
\n", - "

725 rows × 25 columns

\n", - "
" - ], - "text/plain": [ - " Root Expiration Strike Right Bid_size CloseBid Ask_size \\\n", - "datetime \n", - "2025-07-16 AAPL 2025-09-19 215.0 P 8 11.25 1 \n", - "2025-07-16 AAPL 2025-11-21 215.0 P 69 14.35 7 \n", - "2025-07-16 AAPL 2025-10-17 215.0 P 5 12.55 13 \n", - "2025-07-16 AAPL 2025-12-19 215.0 P 1 15.40 19 \n", - "2025-07-16 AAPL 2026-09-18 210.0 P 30 20.45 34 \n", - "... ... ... ... ... ... ... ... \n", - "2025-07-16 AAPL 2026-09-18 205.0 P 55 18.20 48 \n", - "2025-07-16 AAPL 2026-02-20 210.0 P 82 15.05 38 \n", - "2025-07-16 AAPL 2026-03-20 210.0 P 33 15.90 35 \n", - "2025-07-16 AAPL 2026-05-15 210.0 P 13 17.50 70 \n", - "2025-07-16 AAPL 2026-06-18 210.0 P 13 18.40 23 \n", - "\n", - " CloseAsk Date Midpoint ... log_moneyness bs_vol \\\n", - "datetime ... \n", - "2025-07-16 11.40 20250716 11.325 ... -0.015238 0.270203 \n", - "2025-07-16 14.60 20250716 14.475 ... -0.009182 0.271078 \n", - "2025-07-16 12.70 20250716 12.625 ... -0.013237 0.262829 \n", - "2025-07-16 15.55 20250716 15.475 ... -0.005937 0.270703 \n", - "2025-07-16 20.90 20250716 20.675 ... 0.045507 0.284575 \n", - "... ... ... ... ... ... ... \n", - "2025-07-16 18.85 20250716 18.525 ... 0.069604 0.286575 \n", - "2025-07-16 15.50 20250716 15.275 ... 0.023651 0.275827 \n", - "2025-07-16 16.25 20250716 16.075 ... 0.026896 0.276577 \n", - "2025-07-16 18.20 20250716 17.850 ... 0.032145 0.281201 \n", - "2025-07-16 18.70 20250716 18.550 ... 0.036084 0.280826 \n", - "\n", - " crr_vol_discrete crr_vol_continuous spot vol \\\n", - "datetime \n", - "2025-07-16 0.265142 0.262993 210.160004 0.270203 \n", - "2025-07-16 0.263644 0.263976 210.160004 0.271078 \n", - "2025-07-16 0.256285 0.257443 210.160004 0.262829 \n", - "2025-07-16 0.262633 0.262476 210.160004 0.270703 \n", - "2025-07-16 0.271985 0.272835 210.160004 0.284575 \n", - "... ... ... ... ... \n", - "2025-07-16 0.275166 0.275949 210.160004 0.286575 \n", - "2025-07-16 0.267417 0.268509 210.160004 0.275827 \n", - "2025-07-16 0.267507 0.268212 210.160004 0.276577 \n", - "2025-07-16 0.270876 0.272356 210.160004 0.281201 \n", - "2025-07-16 0.269749 0.270805 210.160004 0.280826 \n", - "\n", - " r q price DTE \n", - "datetime \n", - "2025-07-16 0.04232 0.004806 11.325 65 \n", - "2025-07-16 0.04232 0.004806 14.475 128 \n", - "2025-07-16 0.04232 0.004806 12.625 93 \n", - "2025-07-16 0.04232 0.004806 15.475 156 \n", - "2025-07-16 0.04232 0.004806 20.675 429 \n", - "... ... ... ... ... \n", - "2025-07-16 0.04232 0.004806 18.525 429 \n", - "2025-07-16 0.04232 0.004806 15.275 219 \n", - "2025-07-16 0.04232 0.004806 16.075 247 \n", - "2025-07-16 0.04232 0.004806 17.850 303 \n", - "2025-07-16 0.04232 0.004806 18.550 337 \n", - "\n", - "[725 rows x 25 columns]" - ] - }, - "execution_count": 103, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "T_atm = aapl_chain_clipped[aapl_chain_clipped['moneyness'].between(0.99, 1.01)]['T'].values\n", - "iv_atm = aapl_chain_clipped[aapl_chain_clipped['moneyness'].between(0.99, 1.01)]['bs_vol'].values\n", - "fwd=aapl_chain_clipped['F'].values\n", - "K_grid = aapl_chain_clipped['Strike'].values\n", - "T_grid = aapl_chain_clipped['T'].values\n", - "rate = aapl_chain_clipped['r'].values[0] # Assuming constant rate for all options\n", - "market_iv= aapl_chain_clipped['bs_vol'].values" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "best [0.08593553 0.07146776 2.74246497] loss 0.00016569324392814555\n" - ] - } - ], - "source": [ - "def get_best_params(T_atm: List[float] = T_atm,\n", - " iv_atm: List[float] = iv_atm) -> Tuple[np.ndarray, float]:\n", - " \"\"\"\n", - " Find the best parameters for the ATM term structure.\n", - " Returns:\n", - " var0_hat, var_inf_hat, kappa_hat\n", - " \"\"\"\n", - " bounds = [(1e-4, 0.2), # var0: Min ATM Variance across DTE\n", - " (1e-4, 0.2), # var_inf_hat: Max ATM Variance across DTE\n", - " (0.05, 3.0)] # kappa: Speed from var0 to var_inf_hat\n", - " best_params, best_loss = random_search_vec(\n", - " lambda X: atm_loss_multi(X, T_atm, iv_atm),\n", - " bounds,\n", - " iterations=3000\n", - " )\n", - " return best_params, best_loss\n", - "\n", - "\n", - "best_params, best_loss = get_best_params()\n", - "var0_hat, var_inf_hat, kappa_hat = best_params\n", - "print(\"best\", best_params, \"loss\", best_loss)\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Surface -> eta=1.3647, lambda=-0.5580, rho=0.1707, loss=0.001719\n" - ] - } - ], - "source": [ - "\n", - "def get_surface_params():\n", - "\n", - " # 1️⃣ tighter parameter bounds\n", - " surf_bounds = [(0.05, 1.5), # eta\n", - " (-0.8, 0.8), # lambda\n", - " (-0.95, 0.95)] # rho\n", - "\n", - "\n", - "\n", - " (eta_hat, lambda_hat, rho_hat), best_loss = random_search_vec(surface_loss_multi,\n", - " surf_bounds, 50_000)\n", - "\n", - " print(f\"Surface -> eta={eta_hat:.4f}, lambda={lambda_hat:.4f}, rho={rho_hat:.4f}, loss={best_loss:.6f}\")\n", - " return eta_hat, lambda_hat, rho_hat, best_loss\n", - "\n", - "eta_hat, lambda_hat, rho_hat, loss = get_surface_params()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[{'width': 0.5,\n", - " 'UPPER_BOUND_MONEYENESS': 1.5,\n", - " 'LOWER_BOUND_MONEYENESS': 0.5,\n", - " 'DTE_MIN_THRESHOLD': 10,\n", - " 'surface_loss': 0.0017186980499904025}]" - ] - }, - "execution_count": 39, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from copy import deepcopy\n", - "meta = deepcopy(meta)\n", - "meta['surface_loss']=loss\n", - "error_track.append(meta)\n", - "error_track" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Heat Map Gen (Dirty)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def clip_chain(width, DTE_MIN_THRESHOLD):\n", - " UPPER_BOUND_MONEYENESS = 1+width\n", - " LOWER_BOUND_MONEYENESS = 1-width\n", - " DTE_MAX_THRESHOLD = 730\n", - " DUMAS_WIDTH =0.75\n", - "\n", - " aapl_chain['spot'] = S\n", - " aapl_chain['vol'] = aapl_chain['bs_vol']\n", - " aapl_chain['r'] = rates\n", - " aapl_chain['q'] = q\n", - " aapl_chain['price'] = aapl_chain['Midpoint']\n", - " tgt_right = 'P'\n", - "\n", - " aapl_chain['DTE'] = (aapl_chain['Expiration'] - aapl_chain.index).dt.days\n", - " aapl_chain_clipped = aapl_chain[\n", - " (aapl_chain['DTE'] >= DTE_MIN_THRESHOLD) &\n", - " (aapl_chain['DTE'] <= DTE_MAX_THRESHOLD) &\n", - " (aapl_chain['moneyness'] <= UPPER_BOUND_MONEYENESS) &\n", - " (aapl_chain['moneyness'] >= LOWER_BOUND_MONEYENESS) &\n", - " (aapl_chain['Right'] == tgt_right) \n", - " ].copy()\n", - "\n", - " meta={\n", - " 'width': width,\n", - " 'UPPER_BOUND_MONEYENESS': UPPER_BOUND_MONEYENESS,\n", - " 'LOWER_BOUND_MONEYENESS': LOWER_BOUND_MONEYENESS,\n", - " 'DTE_MIN_THRESHOLD': DTE_MIN_THRESHOLD,\n", - " 'surface_loss': float\n", - " }\n", - " return aapl_chain_clipped, meta" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "799\n", - "Surface -> eta=0.5167, lambda=-0.7738, rho=0.1859, loss=0.009275\n", - "Combo 0 done: {'width': 0.5, 'UPPER_BOUND_MONEYENESS': 1.5, 'LOWER_BOUND_MONEYENESS': 0.5, 'DTE_MIN_THRESHOLD': 0, 'surface_loss': 0.009274805451422277, 'model_params': {'var0': 0.08593552625319342, 'var_inf': 0.0714677580702203, 'kappa': 2.742464972687961, 'eta': 0.5166832104763232, 'lambda': -0.7738163963606741, 'rho': 0.1859082946782078}}\n", - "692\n", - "Surface -> eta=1.3647, lambda=-0.5580, rho=0.1707, loss=0.001719\n", - "Combo 1 done: {'width': 0.5, 'UPPER_BOUND_MONEYENESS': 1.5, 'LOWER_BOUND_MONEYENESS': 0.5, 'DTE_MIN_THRESHOLD': 10, 'surface_loss': 0.0017186980499904025, 'model_params': {'var0': 0.08593552625319342, 'var_inf': 0.0714677580702203, 'kappa': 2.742464972687961, 'eta': 1.3647232156447906, 'lambda': -0.5579741254492856, 'rho': 0.17065046704197506}}\n", - "641\n", - "Surface -> eta=1.3647, lambda=-0.5580, rho=0.1707, loss=0.001429\n", - "Combo 2 done: {'width': 0.5, 'UPPER_BOUND_MONEYENESS': 1.5, 'LOWER_BOUND_MONEYENESS': 0.5, 'DTE_MIN_THRESHOLD': 20, 'surface_loss': 0.0014289749079885272, 'model_params': {'var0': 0.08593552625319342, 'var_inf': 0.0714677580702203, 'kappa': 2.742464972687961, 'eta': 1.3647232156447906, 'lambda': -0.5579741254492856, 'rho': 0.17065046704197506}}\n", - "600\n", - "Surface -> eta=1.3756, lambda=-0.5467, rho=0.1566, loss=0.001190\n", - "Combo 3 done: {'width': 0.5, 'UPPER_BOUND_MONEYENESS': 1.5, 'LOWER_BOUND_MONEYENESS': 0.5, 'DTE_MIN_THRESHOLD': 30, 'surface_loss': 0.001189582676477227, 'model_params': {'var0': 0.08593552625319342, 'var_inf': 0.0714677580702203, 'kappa': 2.742464972687961, 'eta': 1.375555229492925, 'lambda': -0.5467355269812961, 'rho': 0.15662166594955784}}\n", - "517\n", - "Surface -> eta=1.4804, lambda=-0.5159, rho=0.1365, loss=0.000825\n", - "Combo 4 done: {'width': 0.5, 'UPPER_BOUND_MONEYENESS': 1.5, 'LOWER_BOUND_MONEYENESS': 0.5, 'DTE_MIN_THRESHOLD': 40, 'surface_loss': 0.0008252972383119482, 'model_params': {'var0': 0.08593552625319342, 'var_inf': 0.0714677580702203, 'kappa': 2.742464972687961, 'eta': 1.4803743244380947, 'lambda': -0.5159328499425067, 'rho': 0.1365448305815269}}\n", - "476\n", - "Surface -> eta=1.4804, lambda=-0.5159, rho=0.1365, loss=0.000680\n", - "Combo 5 done: {'width': 0.5, 'UPPER_BOUND_MONEYENESS': 1.5, 'LOWER_BOUND_MONEYENESS': 0.5, 'DTE_MIN_THRESHOLD': 50, 'surface_loss': 0.0006798553104915674, 'model_params': {'var0': 0.08593552625319342, 'var_inf': 0.0714677580702203, 'kappa': 2.742464972687961, 'eta': 1.4803743244380947, 'lambda': -0.5159328499425067, 'rho': 0.1365448305815269}}\n", - "476\n", - "Surface -> eta=1.4804, lambda=-0.5159, rho=0.1365, loss=0.000680\n", - "Combo 6 done: {'width': 0.5, 'UPPER_BOUND_MONEYENESS': 1.5, 'LOWER_BOUND_MONEYENESS': 0.5, 'DTE_MIN_THRESHOLD': 60, 'surface_loss': 0.0006798553104915674, 'model_params': {'var0': 0.08593552625319342, 'var_inf': 0.0714677580702203, 'kappa': 2.742464972687961, 'eta': 1.4803743244380947, 'lambda': -0.5159328499425067, 'rho': 0.1365448305815269}}\n", - "910\n", - "Surface -> eta=0.5220, lambda=-0.7848, rho=0.1643, loss=0.012756\n", - "Combo 7 done: {'width': 0.6, 'UPPER_BOUND_MONEYENESS': 1.6, 'LOWER_BOUND_MONEYENESS': 0.4, 'DTE_MIN_THRESHOLD': 0, 'surface_loss': 0.012755703713393782, 'model_params': {'var0': 0.08593552625319342, 'var_inf': 0.0714677580702203, 'kappa': 2.742464972687961, 'eta': 0.5220494231858159, 'lambda': -0.784813612944668, 'rho': 0.16425455345629958}}\n", - "794\n", - "Surface -> eta=1.2411, lambda=-0.5859, rho=0.2087, loss=0.002089\n", - "Combo 8 done: {'width': 0.6, 'UPPER_BOUND_MONEYENESS': 1.6, 'LOWER_BOUND_MONEYENESS': 0.4, 'DTE_MIN_THRESHOLD': 10, 'surface_loss': 0.002089310281015341, 'model_params': {'var0': 0.08593552625319342, 'var_inf': 0.0714677580702203, 'kappa': 2.742464972687961, 'eta': 1.2411265333427077, 'lambda': -0.5859492143867302, 'rho': 0.20869683390863503}}\n", - "741\n", - "Surface -> eta=1.2655, lambda=-0.5932, rho=0.2058, loss=0.001802\n", - "Combo 9 done: {'width': 0.6, 'UPPER_BOUND_MONEYENESS': 1.6, 'LOWER_BOUND_MONEYENESS': 0.4, 'DTE_MIN_THRESHOLD': 20, 'surface_loss': 0.0018017212875408401, 'model_params': {'var0': 0.08593552625319342, 'var_inf': 0.0714677580702203, 'kappa': 2.742464972687961, 'eta': 1.2654555920361512, 'lambda': -0.5932038227570109, 'rho': 0.20578688325919514}}\n", - "698\n", - "Surface -> eta=1.3647, lambda=-0.5580, rho=0.1707, loss=0.001582\n", - "Combo 10 done: {'width': 0.6, 'UPPER_BOUND_MONEYENESS': 1.6, 'LOWER_BOUND_MONEYENESS': 0.4, 'DTE_MIN_THRESHOLD': 30, 'surface_loss': 0.0015820169547881662, 'model_params': {'var0': 0.08593552625319342, 'var_inf': 0.0714677580702203, 'kappa': 2.742464972687961, 'eta': 1.3647232156447906, 'lambda': -0.5579741254492856, 'rho': 0.17065046704197506}}\n", - "606\n", - "Surface -> eta=1.3647, lambda=-0.5580, rho=0.1707, loss=0.001113\n", - "Combo 11 done: {'width': 0.6, 'UPPER_BOUND_MONEYENESS': 1.6, 'LOWER_BOUND_MONEYENESS': 0.4, 'DTE_MIN_THRESHOLD': 40, 'surface_loss': 0.001113289042754224, 'model_params': {'var0': 0.08593552625319342, 'var_inf': 0.0714677580702203, 'kappa': 2.742464972687961, 'eta': 1.3647232156447906, 'lambda': -0.5579741254492856, 'rho': 0.17065046704197506}}\n", - "563\n", - "Surface -> eta=1.3647, lambda=-0.5580, rho=0.1707, loss=0.000968\n", - "Combo 12 done: {'width': 0.6, 'UPPER_BOUND_MONEYENESS': 1.6, 'LOWER_BOUND_MONEYENESS': 0.4, 'DTE_MIN_THRESHOLD': 50, 'surface_loss': 0.0009678916126545945, 'model_params': {'var0': 0.08593552625319342, 'var_inf': 0.0714677580702203, 'kappa': 2.742464972687961, 'eta': 1.3647232156447906, 'lambda': -0.5579741254492856, 'rho': 0.17065046704197506}}\n", - "563\n", - "Surface -> eta=1.3647, lambda=-0.5580, rho=0.1707, loss=0.000968\n", - "Combo 13 done: {'width': 0.6, 'UPPER_BOUND_MONEYENESS': 1.6, 'LOWER_BOUND_MONEYENESS': 0.4, 'DTE_MIN_THRESHOLD': 60, 'surface_loss': 0.0009678916126545945, 'model_params': {'var0': 0.08593552625319342, 'var_inf': 0.0714677580702203, 'kappa': 2.742464972687961, 'eta': 1.3647232156447906, 'lambda': -0.5579741254492856, 'rho': 0.17065046704197506}}\n", - "973\n", - "Surface -> eta=0.5625, lambda=-0.7811, rho=0.1523, loss=0.013599\n", - "Combo 14 done: {'width': 0.7, 'UPPER_BOUND_MONEYENESS': 1.7, 'LOWER_BOUND_MONEYENESS': 0.30000000000000004, 'DTE_MIN_THRESHOLD': 0, 'surface_loss': 0.013599402621528424, 'model_params': {'var0': 0.08593552625319342, 'var_inf': 0.0714677580702203, 'kappa': 2.742464972687961, 'eta': 0.5624634920862294, 'lambda': -0.7810653658339366, 'rho': 0.15232870822772138}}\n", - "855\n", - "Surface -> eta=1.2980, lambda=-0.5886, rho=0.2173, loss=0.002410\n", - "Combo 15 done: {'width': 0.7, 'UPPER_BOUND_MONEYENESS': 1.7, 'LOWER_BOUND_MONEYENESS': 0.30000000000000004, 'DTE_MIN_THRESHOLD': 10, 'surface_loss': 0.002410043112391858, 'model_params': {'var0': 0.08593552625319342, 'var_inf': 0.0714677580702203, 'kappa': 2.742464972687961, 'eta': 1.2980426490725463, 'lambda': -0.5886354603175298, 'rho': 0.2173215070296477}}\n", - "802\n", - "Surface -> eta=1.2980, lambda=-0.5886, rho=0.2173, loss=0.002151\n", - "Combo 16 done: {'width': 0.7, 'UPPER_BOUND_MONEYENESS': 1.7, 'LOWER_BOUND_MONEYENESS': 0.30000000000000004, 'DTE_MIN_THRESHOLD': 20, 'surface_loss': 0.0021512513774951765, 'model_params': {'var0': 0.08593552625319342, 'var_inf': 0.0714677580702203, 'kappa': 2.742464972687961, 'eta': 1.2980426490725463, 'lambda': -0.5886354603175298, 'rho': 0.2173215070296477}}\n", - "759\n", - "Surface -> eta=1.2980, lambda=-0.5886, rho=0.2173, loss=0.001974\n", - "Combo 17 done: {'width': 0.7, 'UPPER_BOUND_MONEYENESS': 1.7, 'LOWER_BOUND_MONEYENESS': 0.30000000000000004, 'DTE_MIN_THRESHOLD': 30, 'surface_loss': 0.001974482420034329, 'model_params': {'var0': 0.08593552625319342, 'var_inf': 0.0714677580702203, 'kappa': 2.742464972687961, 'eta': 1.2980426490725463, 'lambda': -0.5886354603175298, 'rho': 0.2173215070296477}}\n", - "665\n", - "Surface -> eta=1.4822, lambda=-0.5454, rho=0.2309, loss=0.001550\n", - "Combo 18 done: {'width': 0.7, 'UPPER_BOUND_MONEYENESS': 1.7, 'LOWER_BOUND_MONEYENESS': 0.30000000000000004, 'DTE_MIN_THRESHOLD': 40, 'surface_loss': 0.0015501383430742755, 'model_params': {'var0': 0.08593552625319342, 'var_inf': 0.0714677580702203, 'kappa': 2.742464972687961, 'eta': 1.4821767700737585, 'lambda': -0.5453740353462488, 'rho': 0.23087208940618975}}\n", - "622\n", - "Surface -> eta=1.4016, lambda=-0.5842, rho=0.2017, loss=0.001365\n", - "Combo 19 done: {'width': 0.7, 'UPPER_BOUND_MONEYENESS': 1.7, 'LOWER_BOUND_MONEYENESS': 0.30000000000000004, 'DTE_MIN_THRESHOLD': 50, 'surface_loss': 0.001364912423011291, 'model_params': {'var0': 0.08593552625319342, 'var_inf': 0.0714677580702203, 'kappa': 2.742464972687961, 'eta': 1.4015869600327218, 'lambda': -0.5842413276491021, 'rho': 0.20172681953864702}}\n", - "622\n", - "Surface -> eta=1.4016, lambda=-0.5842, rho=0.2017, loss=0.001365\n", - "Combo 20 done: {'width': 0.7, 'UPPER_BOUND_MONEYENESS': 1.7, 'LOWER_BOUND_MONEYENESS': 0.30000000000000004, 'DTE_MIN_THRESHOLD': 60, 'surface_loss': 0.001364912423011291, 'model_params': {'var0': 0.08593552625319342, 'var_inf': 0.0714677580702203, 'kappa': 2.742464972687961, 'eta': 1.4015869600327218, 'lambda': -0.5842413276491021, 'rho': 0.20172681953864702}}\n", - "1032\n", - "Surface -> eta=0.5637, lambda=-0.7888, rho=0.2090, loss=0.015102\n", - "Combo 21 done: {'width': 0.7999999999999999, 'UPPER_BOUND_MONEYENESS': 1.7999999999999998, 'LOWER_BOUND_MONEYENESS': 0.20000000000000007, 'DTE_MIN_THRESHOLD': 0, 'surface_loss': 0.01510223539122881, 'model_params': {'var0': 0.08593552625319342, 'var_inf': 0.0714677580702203, 'kappa': 2.742464972687961, 'eta': 0.5636689177081843, 'lambda': -0.7888210540799951, 'rho': 0.20901120969032605}}\n", - "912\n", - "Surface -> eta=1.4016, lambda=-0.5842, rho=0.2017, loss=0.003120\n", - "Combo 22 done: {'width': 0.7999999999999999, 'UPPER_BOUND_MONEYENESS': 1.7999999999999998, 'LOWER_BOUND_MONEYENESS': 0.20000000000000007, 'DTE_MIN_THRESHOLD': 10, 'surface_loss': 0.003120382155175345, 'model_params': {'var0': 0.08593552625319342, 'var_inf': 0.0714677580702203, 'kappa': 2.742464972687961, 'eta': 1.4015869600327218, 'lambda': -0.5842413276491021, 'rho': 0.20172681953864702}}\n", - "859\n", - "Surface -> eta=1.4016, lambda=-0.5842, rho=0.2017, loss=0.002885\n", - "Combo 23 done: {'width': 0.7999999999999999, 'UPPER_BOUND_MONEYENESS': 1.7999999999999998, 'LOWER_BOUND_MONEYENESS': 0.20000000000000007, 'DTE_MIN_THRESHOLD': 20, 'surface_loss': 0.0028849398589697287, 'model_params': {'var0': 0.08593552625319342, 'var_inf': 0.0714677580702203, 'kappa': 2.742464972687961, 'eta': 1.4015869600327218, 'lambda': -0.5842413276491021, 'rho': 0.20172681953864702}}\n", - "816\n", - "Surface -> eta=1.4016, lambda=-0.5842, rho=0.2017, loss=0.002726\n", - "Combo 24 done: {'width': 0.7999999999999999, 'UPPER_BOUND_MONEYENESS': 1.7999999999999998, 'LOWER_BOUND_MONEYENESS': 0.20000000000000007, 'DTE_MIN_THRESHOLD': 30, 'surface_loss': 0.0027259881343979567, 'model_params': {'var0': 0.08593552625319342, 'var_inf': 0.0714677580702203, 'kappa': 2.742464972687961, 'eta': 1.4015869600327218, 'lambda': -0.5842413276491021, 'rho': 0.20172681953864702}}\n", - "720\n", - "Surface -> eta=1.4016, lambda=-0.5842, rho=0.2017, loss=0.002321\n", - "Combo 25 done: {'width': 0.7999999999999999, 'UPPER_BOUND_MONEYENESS': 1.7999999999999998, 'LOWER_BOUND_MONEYENESS': 0.20000000000000007, 'DTE_MIN_THRESHOLD': 40, 'surface_loss': 0.0023205794551745275, 'model_params': {'var0': 0.08593552625319342, 'var_inf': 0.0714677580702203, 'kappa': 2.742464972687961, 'eta': 1.4015869600327218, 'lambda': -0.5842413276491021, 'rho': 0.20172681953864702}}\n", - "677\n", - "Surface -> eta=1.3544, lambda=-0.6252, rho=0.2334, loss=0.002151\n", - "Combo 26 done: {'width': 0.7999999999999999, 'UPPER_BOUND_MONEYENESS': 1.7999999999999998, 'LOWER_BOUND_MONEYENESS': 0.20000000000000007, 'DTE_MIN_THRESHOLD': 50, 'surface_loss': 0.0021509116363913625, 'model_params': {'var0': 0.08593552625319342, 'var_inf': 0.0714677580702203, 'kappa': 2.742464972687961, 'eta': 1.3544209532058384, 'lambda': -0.6251661343475914, 'rho': 0.23341683512673228}}\n", - "677\n", - "Surface -> eta=1.3544, lambda=-0.6252, rho=0.2334, loss=0.002151\n", - "Combo 27 done: {'width': 0.7999999999999999, 'UPPER_BOUND_MONEYENESS': 1.7999999999999998, 'LOWER_BOUND_MONEYENESS': 0.20000000000000007, 'DTE_MIN_THRESHOLD': 60, 'surface_loss': 0.0021509116363913625, 'model_params': {'var0': 0.08593552625319342, 'var_inf': 0.0714677580702203, 'kappa': 2.742464972687961, 'eta': 1.3544209532058384, 'lambda': -0.6251661343475914, 'rho': 0.23341683512673228}}\n", - "1084\n", - "Surface -> eta=0.7901, lambda=-0.7493, rho=0.2104, loss=0.017889\n", - "Combo 28 done: {'width': 0.8999999999999999, 'UPPER_BOUND_MONEYENESS': 1.9, 'LOWER_BOUND_MONEYENESS': 0.10000000000000009, 'DTE_MIN_THRESHOLD': 0, 'surface_loss': 0.017889103493598204, 'model_params': {'var0': 0.08593552625319342, 'var_inf': 0.0714677580702203, 'kappa': 2.742464972687961, 'eta': 0.7901181861919677, 'lambda': -0.7492783551298761, 'rho': 0.21036275689226724}}\n", - "962\n", - "Surface -> eta=1.4963, lambda=-0.5767, rho=0.1571, loss=0.005124\n", - "Combo 29 done: {'width': 0.8999999999999999, 'UPPER_BOUND_MONEYENESS': 1.9, 'LOWER_BOUND_MONEYENESS': 0.10000000000000009, 'DTE_MIN_THRESHOLD': 10, 'surface_loss': 0.005123652674857643, 'model_params': {'var0': 0.08593552625319342, 'var_inf': 0.0714677580702203, 'kappa': 2.742464972687961, 'eta': 1.4962858883841612, 'lambda': -0.5766812085485052, 'rho': 0.15711657457471362}}\n", - "909\n", - "Surface -> eta=1.4963, lambda=-0.5767, rho=0.1571, loss=0.004981\n", - "Combo 30 done: {'width': 0.8999999999999999, 'UPPER_BOUND_MONEYENESS': 1.9, 'LOWER_BOUND_MONEYENESS': 0.10000000000000009, 'DTE_MIN_THRESHOLD': 20, 'surface_loss': 0.004981294699984373, 'model_params': {'var0': 0.08593552625319342, 'var_inf': 0.0714677580702203, 'kappa': 2.742464972687961, 'eta': 1.4962858883841612, 'lambda': -0.5766812085485052, 'rho': 0.15711657457471362}}\n", - "866\n", - "Surface -> eta=1.4453, lambda=-0.6036, rho=0.1717, loss=0.004818\n", - "Combo 31 done: {'width': 0.8999999999999999, 'UPPER_BOUND_MONEYENESS': 1.9, 'LOWER_BOUND_MONEYENESS': 0.10000000000000009, 'DTE_MIN_THRESHOLD': 30, 'surface_loss': 0.004817545602688044, 'model_params': {'var0': 0.08593552625319342, 'var_inf': 0.0714677580702203, 'kappa': 2.742464972687961, 'eta': 1.445252867059719, 'lambda': -0.6036499297545861, 'rho': 0.17169266782501835}}\n", - "768\n", - "Surface -> eta=1.4453, lambda=-0.6036, rho=0.1717, loss=0.004378\n", - "Combo 32 done: {'width': 0.8999999999999999, 'UPPER_BOUND_MONEYENESS': 1.9, 'LOWER_BOUND_MONEYENESS': 0.10000000000000009, 'DTE_MIN_THRESHOLD': 40, 'surface_loss': 0.004377739201309356, 'model_params': {'var0': 0.08593552625319342, 'var_inf': 0.0714677580702203, 'kappa': 2.742464972687961, 'eta': 1.445252867059719, 'lambda': -0.6036499297545861, 'rho': 0.17169266782501835}}\n", - "725\n", - "Surface -> eta=1.3490, lambda=-0.6466, rho=0.2174, loss=0.004076\n", - "Combo 33 done: {'width': 0.8999999999999999, 'UPPER_BOUND_MONEYENESS': 1.9, 'LOWER_BOUND_MONEYENESS': 0.10000000000000009, 'DTE_MIN_THRESHOLD': 50, 'surface_loss': 0.004076473609036324, 'model_params': {'var0': 0.08593552625319342, 'var_inf': 0.0714677580702203, 'kappa': 2.742464972687961, 'eta': 1.3490298144258472, 'lambda': -0.6466360105731903, 'rho': 0.21737723570359724}}\n", - "725\n", - "Surface -> eta=1.3490, lambda=-0.6466, rho=0.2174, loss=0.004076\n", - "Combo 34 done: {'width': 0.8999999999999999, 'UPPER_BOUND_MONEYENESS': 1.9, 'LOWER_BOUND_MONEYENESS': 0.10000000000000009, 'DTE_MIN_THRESHOLD': 60, 'surface_loss': 0.004076473609036324, 'model_params': {'var0': 0.08593552625319342, 'var_inf': 0.0714677580702203, 'kappa': 2.742464972687961, 'eta': 1.3490298144258472, 'lambda': -0.6466360105731903, 'rho': 0.21737723570359724}}\n" - ] - } - ], - "source": [ - "for combo_choice in range(len(combos)):\n", - " width, DTE_MIN_THRESHOLD = combos[combo_choice]\n", - " UPPER_BOUND_MONEYENESS = 1+width\n", - " LOWER_BOUND_MONEYENESS = 1-width\n", - " DTE_MAX_THRESHOLD = 730\n", - " DUMAS_WIDTH =0.75\n", - "\n", - " aapl_chain['spot'] = S\n", - " aapl_chain['vol'] = aapl_chain['bs_vol']\n", - " aapl_chain['r'] = rates\n", - " aapl_chain['q'] = q\n", - " aapl_chain['price'] = aapl_chain['Midpoint']\n", - " tgt_right = 'P'\n", - "\n", - " aapl_chain['DTE'] = (aapl_chain['Expiration'] - aapl_chain.index).dt.days\n", - " aapl_chain_clipped = aapl_chain[\n", - " (aapl_chain['DTE'] >= DTE_MIN_THRESHOLD) &\n", - " (aapl_chain['DTE'] <= DTE_MAX_THRESHOLD) &\n", - " (aapl_chain['moneyness'] <= UPPER_BOUND_MONEYENESS) &\n", - " (aapl_chain['moneyness'] >= LOWER_BOUND_MONEYENESS) &\n", - " (aapl_chain['Right'] == tgt_right) \n", - " ].copy()\n", - "\n", - " meta={\n", - " 'width': width,\n", - " 'UPPER_BOUND_MONEYENESS': UPPER_BOUND_MONEYENESS,\n", - " 'LOWER_BOUND_MONEYENESS': LOWER_BOUND_MONEYENESS,\n", - " 'DTE_MIN_THRESHOLD': DTE_MIN_THRESHOLD,\n", - " 'surface_loss': float\n", - " }\n", - " print(len(aapl_chain_clipped))\n", - "\n", - "\n", - " T_atm = aapl_chain_clipped[aapl_chain_clipped['moneyness'].between(0.99, 1.01)]['T'].values\n", - " iv_atm = aapl_chain_clipped[aapl_chain_clipped['moneyness'].between(0.99, 1.01)]['bs_vol'].values\n", - " fwd=aapl_chain_clipped['F'].values\n", - " K_grid = aapl_chain_clipped['Strike'].values\n", - " T_grid = aapl_chain_clipped['T'].values\n", - " rate = aapl_chain_clipped['r'].values[0] # Assuming constant rate for all options\n", - " market_iv= aapl_chain_clipped['bs_vol'].values\n", - "\n", - " best_params, best_loss = get_best_params()\n", - " var0_hat, var_inf_hat, kappa_hat = best_params\n", - "\n", - "\n", - " eta_hat, lambda_hat, rho_hat, loss = get_surface_params()\n", - " model_params={\n", - " 'var0': var0_hat,\n", - " 'var_inf': var_inf_hat,\n", - " 'kappa': kappa_hat,\n", - " 'eta': eta_hat,\n", - " 'lambda': lambda_hat,\n", - " 'rho': rho_hat\n", - " }\n", - "\n", - " meta = deepcopy(meta)\n", - " meta['surface_loss']=loss\n", - " meta['model_params'] = model_params\n", - " error_track.append(meta)\n", - " print(f\"Combo {combo_choice} done: {meta}\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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iIiqVb2oiBIREREREemCmKU8neBAlIiIiIiISEsciOoGLyMRERERERFVK1ZEiYiIiIiItMSKqG7wMhIREREREVG1YkWUiIiIiIhIS6yI6gYvIxEREREREVUrVkSJiIiIiIi0JBbVdA+eD6yIEhERERERUbViRZSIiIiIiEhLvEdUNzgQJSIiIiIi0hIHorrBy0hERERERETVihVRIiIiIiIiLbEiqhu8jERERERERFStWBElIiIiIiLSEiuiusHLSERERERERNWKFVEiIiIiIiItsSKqG7yMREREREREVK1YESUiIiIiItISK6K6wYEoERERERGRljgQ1Q1eRiIiIiIiIqpWrIgSERERERFpSSQS1XQXngusiBIREREREVG1YkWUiIiIiIhIS7xHVDd4GYmIiIiIiKhasSJKRERERESkJVZEdYOXkYiIiIiIiKoVK6JERERERERaYkVUNzgQJSIiIiIi0hIHorrBy0hERERERETVihVRIiIiIiIiLbEiqhu8jERERERERFStWBElIiIiIiLSEiuiusHLSERERERERNWKFVEiIiIiIiItsSKqG7yMREREREREVK1YESUiIiIiItISK6K6UasGorGxsTh48CBCQ0ORmZkJsVgMBwcH+Pv7Y9iwYTA1Na3pLhIRERERUT0mFtV0D54PtWY8HxQUhM8//xyFhYXw8vKCWCxGr1694Ofnh0uXLuGTTz6BVCqt6W4SERERERHRM6o1FdGtW7filVdeQf/+/QEAt2/fxoYNG/DDDz9g3Lhx+Pbbb7F161bMnDmzhntaec1mTkDzOa/BxMkembdCcf3dr5B+LbjC+EZjBqD1V+/B3L0hsiNiEfTJ/5Bw5Jxqv8vIfmj25njYtGsJI1trHG4zHNJboar9Zm4NMTz2tMa2z7/0Hh7sOgoAcOzdEa2/eg8SHy/Ic/MQs2kvbs37AUJJiY7OvG65czwetw48QL6sCDauZugy1RMOTS0rjI++koJrf8UgJ7UAlk4m6PByE7i2tVXtFwQB13fF4N7pRBTlyuHkZYWu0zxh5VxW2d/67mXkpBWotfvCeA+0Ge4GAJAXleDC7+FIjcmG9GEeXP1s8eJHPjo+87on9MRD3DkU9yhX5njhlWawa1JxrmKvpiBoVwxy0gpg6WgKv/EecGmjnqtbu2MREZCIojw57D0t0fFVT1g6leVq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ItISFyvSDU7NJSIiIiIiomrFiigREREREZGWODVXN1gRJSIiIiIiomrFiigREREREZGWeI+obrAiSkRERERERNWKFVEiIiIiIiIticSs5ekCryIRERERERFVK1ZEiYiIiIiItMRVc3WDA1EiIiIiIiItiblYkU5wai4RERERERFVK1ZEiYiIiIiItMSpubrBiigRERERERFVK1ZEiYiIiIiItCTiPaI6wYooERERERERVat6URHt+5JNTXeBtDQiXFbTXSAt5BSV1HQXSAtFCkVNd4G0IMuT13QXSEslxfy7j0hn+tR0B54e7xHVDVZEiYiIiIiIqFrVi4ooERERERGRTvAeUZ3gQJSIiIiIiEhLnJqrG5yaS0RERERERNWKFVEiIiIiIiJt6bGWpwu8ikRERERERFStWBElIiIiIiLSFu8R1QkORImIiIiIiOqgo0eP4sCBA5BKpXBzc8O0adPQtGnTCuMvX76MHTt2IDU1FU5OTpg4cSL8/PxU+69evYoTJ04gOjoaOTk5+O677+Du7q6xLUEQ8O233yIoKAizZ8/GCy+8UKm+c2ouERERERGRlkR6oip7VcalS5ewefNmjBkzBkuXLoWbmxsWL14MmUymMT4sLAwrVqxA7969sXTpUvj7+2PZsmWIi4tTxRQWFsLb2xsTJ078z/c/dOgQRKKnrw5zIEpERERERFTHHDx4EH369EGvXr3g4uKCGTNmwNDQEAEBARrjDx8+jDZt2mDYsGFwcXHB+PHj4eHhgaNHj6piunfvjjFjxsDHx+df3zs2NhYHDx7EW2+99dT950CUiIiIiIhIW2JRlb2Ki4uRl5en9iouLi7XBblcjujoaLUBo1gsho+PD8LDwzV2Ozw8vNwA09fXFxEREZU6/cLCQqxYsQKvvfYaJBJJpY59HO8RJSIiIiIi0lYlp9BWxp49e7Br1y61bWPGjMHYsWPVtmVlZUGhUJQbCEokEiQkJGhsWyqVwsrKSm2blZUVpFJppfq4adMmeHl5wd/fv1LHPYkDUSIiIiIiolpg5MiRGDJkiNo2AwODGupNeYGBgQgJCcF33333zG1xIEpERERERKQlURU+vsXAwECrgaelpSXEYnG5aqZUKq1wuqxEIim3kJFMJqvU9NqQkBAkJydj6tSpatuXL1+O5s2bY8GCBVq3xYEoERERERFRHaKvrw8P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iIqKwoABA1QxOTk5iI2NRXx8PAAgISEBsbGxqsprXl4eFi9ejMLCQrz55pvIz8+HVCqFVCqFQqGoVP85NZeIiIiIiKiO6dy5M7KysrBz505IpVK4u7tj7ty5qqm2aWlpaoNbLy8vzJo1C9u3b8e2bdvg7OyMOXPmwNXVVRUTGBiI1atXq77+8ccfAZQtmBQTE6NaZXfWrFlq/Vm5ciUcHBy07r9IEAShsidd16SM7VTTXSAtjRjlXtNdIC3kFFXuOVFUM4oq+ckk1QxZnrymu0BaKinm331EupLy3oGa7sJTE67NrbK2Rf7fVFnbtQ2n5hIREREREVG14tRcIiIiIiIibVXhqrn1Ca8iERERERERVStWRImIiIiIiLQlrtzqtqQZB6JERERERETa4tRcneBVJCIiIiIiomrFiigREREREZG2ODVXJ1gRJSIiIiIiomrFiigREREREZG2eI+oTvAqEhERERERUbViRZSIiIiIiEhbrIjqBK8iERERERERVStWRImIiIiIiLTFVXN1ggNRIiIiIiIibXFqrk7wKhIREREREVG1YkWUiIiIiIhIW6yI6gSvIhEREREREVUrVkSJiIiIiIi0xcWKdIIVUSIiIiIiIqpWrIgSERERERFpi/eI6kS9GIhadXCu6S6QlmKlBTXdBdKCvFBe010gLSjkipruAmmhMLuwprtAWuLPFBGR7tSLgSgREREREZFOiFgR1QUORImIiIiIiLTFgahO8CoSERERERFRtWJFlIiIiIiISFtcrEgneBWJiIiIiIioWrEiSkREREREpC3eI6oTvIpERERERERUrVgRJSIiIiIi0hYrojrBq0hERERERETVihVRIiIiIiIibbEiqhMciBIREREREWmLj2/RCV5FIiIiIiIiqlasiBIREREREWmLU3N1gleRiIiIiIiIqhUrokRERERERNpiRVQneBWJiIiIiIioWrEiSkREREREpC1WRHWCV5GIiIiIiIiqFSuiRERERERE2mJFVCc4ECUiIiIiItKWmANRXeBVJCIiIiIiomrFiigREREREZGWRCK9mu7Cc4EDUSIiIiIiojro6NGjOHDgAKRSKdzc3DBt2jQ0bdq0wvjLly9jx44dSE1NhZOTEyZOnAg/Pz/V/qtXr+LEiROIjo5GTk4OvvvuO7i7u6u1UVRUhM2bN+PSpUsoLi6G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tkSCIAjPfBVqucLlo2q6C6SlxmbP/bfjc0FeKK/pLpAWFPLa8Q8l/bvC7MKa7gJpiT9TRLqT+/Xpmu7CU4vO+qnK2vawnFVlbdc2rIgSERERERFpSaglFdG6jveIEhERERERUbViRZSIiIiIiEhLikouKkSasSJKRERERERE1YoVUSIiIiIiIi3xHlHdqBcDUYPGVjXdBdJS8f3Umu4CaUFewFVz64KSopKa7gJpoSinqKa7QFpSlPCXTyIiXakXA1EiIiIiIiJdUDz/T7+sFhyIEhERERERaUnBqbk6wcWKiIiIiIiIqFqxIkpERERERKQlTs3VDVZEiYiIiIiIqFqxIkpERERERKQlBVgR1QVWRImIiIiIiKhasSJKRERERESkJd4jqhusiBIREREREVG1YkWUiIiIiIhIS3yOqG5wIEpERERERKQlTs3VDU7NJSIiIiIiomrFiigREREREZGWWBHVDVZEiYiIiIiIqFqxIkpERERERKQlLlakG6yIEhERERERUbViRZSIiIiIiEhLvEdUN1gRJSIiIiIiomrFiigREREREZGWFGBFVBc4ECUiIiIiItISFyvSDU7NJSIiIiIiomrFiigREREREZGWuFiRbrAiSkRERERERNWKFVEiIiIiIiItsSKqG6yIEhERERERUbViRZSIiIiIiEhLrIjqBiuiREREREREVK1YESUiIiIiItISnyOqG6yIEhERERERUbViRZSIiIiIiEhLvEdUNzgQJSIiIiIi0hIHorrBqblERERERERUrVgRJSIiIiIi0pICXKxIF1gRJSIiIiIiomrFiigREREREZGWeI+obrAiSkRERERERNWKFVEiIiIiIiItsSKqG7V+IFpSUgI9Pb2a7gYREREREVGtcvToURw4cABSqRRubm6YNm0amjZtWmH85cuXsWPHDqSmpsLJyQkTJ06En5+far8gCNi5cydOnTqF3NxceHt7Y/r06XB2dlZr58aNG9i1axfu378PQ0NDNG/eHB9//HGl+l5rBqJBQUGwsbGBq6srFAoF/v77b5w4cQJSqRTW1tYYMGAAhg8fDpFIVNNdJSIiIiKieqq2VEQvXbqEzZs3Y8aMGWjWrBkOHTqExYsX48cff4SVlVW5+LCwMKxYsQITJkyAn58fLly4gGXLlmHp0qVwdXUFAOzbtw9HjhzB22+/DQcH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5SFPebbYqdCUZiLarVs3/PnnnwgLC4OTkxMMDPIfIZKSkoKAgACcPXsWQ4YMKedREhERERER0X+lNBPRjh07Ql9fH8eOHcOpU6cgkeTvTCcQCGBrawsvLy94eHiU8yiJiIiIiKgy4z2ipUNpJqIA4OHhAQ8PD+Tm5uL169cAAD09PaipKdUwiYiIiIioksrjRLRUKOUMT01NDYaGhuU9DCIiIiIiIvoElHIiSkREREREpIy4NLd0KM3jW4iIiIiIiKhyYEWUiIiIiIiomPj4ltLBiigRERERERGVKVZEiYiIiIiIiuntUybpP2JFlIiIiIiIiMoUK6JERERERETFxOeIlg5ORImIiIiIiIqJj28pHVyaS0RERERERGWKFVEiIiIiIqJi4uNbSgcrokRERERERFSmWBElIiIiIiIqJt4jWjpYESUiIiIiIqIyxYooERERERFRMfHxLaWDFVEiIiIiIiIqU6yIEhERERERFZOEu+aWCk5EiYiIiIiIiolLc0sHl+YSERERERFRmWJFlIiIiIiIqJj4+JbSwYooERERERERlSlWRImIiIiIiIqJ94iWDlZEiYiIiIiIqEyxIkpERERERFRMEt4kWipYESUiIiIiIqIyxYooERERERFRMfEe0dLBiSgREREREVExcWVu6eDSXCIiIiIiIipTrIgSEREREREVE5fmlg5WRImIiIiIiKhMsSJKRERERERUTBIpS6KlgRVRIiIiIiIiKlOsiBIRERERERUT7xEtHZViIqrSa2h5D4GKKcdnYXkPgYohNyu3vIdAxZCbyTxVBPx5qjgkuZLyHgIRkZwTJ07gyJEjEIvFsLa2xvDhw2FnZ1dk/PXr17F7924kJCTAzMwMgwYNgqurq+y4VCqFr68vzp49i7S0NDg4OGDkyJEwNzcv1FdOTg5mzpyJiIgILF68GDY2NiUaO5fmEhERERERFVOeVPrJvkri2rVr2Lp1K/r06YNFixbB2toaPj4+SElJURj/9OlTLF++HG3atMGiRYvg5uaG3377DZGRkbKYQ4cOwc/PD6NGjcKCBQtQpUoV+Pj4IDs7u1B/27Ztg5GRUcku3ns4ESUiIiIiIiqmPMmn+yqJo0ePom3btmjdujUsLS0xatQoaGho4Pz58wrjjx8/DhcXF3Tv3h2Wlpbo378/bG1tceLECQD51dDjx4+jV69ecHNzg7W1NcaNG4fk5GTcunVLrq979+7h4cOHGDJkyEddQ4ATUSIiIiIiIqWQk5OD9PR0ua+cnJxCcbm5uQgLC4OTk5OsTSAQwMnJCcHBwQr7Dg4OlosHAGdnZzx79gwAEB8fD7FYjPr168uOa2trw87OTq5PsViMdevWYdy4cdDQ0Pjo91op7hElIiIiIiIqDSVdQlsSBw4cwN69e+Xa+vTpg379+sm1paamQiKRQCgUyrULhUJER0cr7FssFsPAwECuzcDAAGKxWHa8oK2oGKlUijVr1uCLL75AzZo1ER8fX4J3J48TUSIiIiIiIiXQs2dPdO3aVa5NXV29nEZTmJ+fHzIyMtCzZ8//3BcnokRERERERMWUJ/l0FVF1dfViTTz19fUhEAhklcoCYrG4UJW0gFAoLLSRUUpKiiy+4HtKSgoMDQ3lYgp2xA0MDERwcDAGDhwo18+MGTPQvHlzjBs37l/HXoATUSIiIiIiogpETU0Ntra2CAwMhLu7OwBAIpEgMDAQHTt2VHiOvb09AgIC0KVLF1nbw4cPUatWLQCASCSCUChEQECAbOKZnp6OkJAQtG/fHgAwfPhw9O/fX3Z+cnIyfHx8MGnSJFk/xX4PJYomIiIiIiKqxD7lPaIl0bVrV6xevRq2traws7PD8ePHkZWVBU9PTwDAqlWrYGRkJKtedu7cGd7e3jhy5AhcXV1x9epVhIaGYvTo0QAAFRUVdO7cGfv374e5uTlEIhF27doFQ0NDuLm5AQBMTEzkxqCpqQkAMDMzg7GxcYnGz4koERERERFRBePh4YHU1FT4+vpCLBbDxsYGM2fOlC2xTUxMhIqKiiy+du3amDBhAnbt2oWdO3fC3NwcP/zwA6ysrGQxPXr0QFZWFtatW4f09HQ4ODhg5syZ/2l33KKoSKVKMqX/hKRQ/CwdUj6GPgvLewhUDLlZueU9BCqG3EzmqSLIySi8LT8pJ0luCR/yR0RFkq69Ud5D+Gh9j339yfre02XzJ+tb2fA5okRERERERFSmuDSXiIiIiIiomJTlHtGKjhNRIiIiIiKiYvqUj2+pTLg0l4iIiIiIiMoUK6JERERERETFxKW5pYMVUSIiIiIiIipTrIgSEREREREVUx6f5FQqWBElIiIiIiKiMsWKKBERERERUTHxHtHSwYooERERERERlSlWRImIiIiIiIqJFdHSwYkoERERERFRMeVJOBEtDVyaS0RERERERGWKFVEiIiIiIqJiymNBtFSwIkpERERERERlihVRIiIiIiKiYuI9oqWDFVEiIiIiIiIqU6yIEhERERERFRMf31I6WBElIiIiIiKiMsWKKBERERERUTHxHtHSwYkoERERERFRMfHxLaWDS3OJiIiIiIioTLEiSkREREREVExcmls6WBElIiIiIiKiMsWKKBERERERUTHx8S2lgxVRIiIiIiIiKlOsiBIRERERERUTK6KlgxVRIiIiIiIiKlNKWxFNSkrCmTNnEBsbC6FQiLZt26JatWrlPSwiIiIiIqrE8iTlPYLPg9JURAcPHozU1FQAwMuXLzF58mRcuXIFubm5uHfvHmbMmIGIiIhyHiUREREREVVmeVLpJ/uqTJSmIpqTkwPp24u/Y8cOODo6YurUqVBVVYVEIsGKFSuwc+dOzJgxo5xHWnLbt1/Axo2nkJiQCgcHS/w0+yvUr1+jyPgTfnewfPlhREW9grWNCFOn9kSrVk6y41KpFCtXHMGePVeQmpoBV9eamOs9ADY2prKYoKBILPl9PwICIiBQFaB9+waYMaMPdHQ0AQDJyW/ww9RNePo0CmJxGoyN9dCmbX1MnvwldHW1Pt3FUGIjG3bDhCZ9INI1QmBcGKadWoO70U+LjO/h0AKzWg2DldAUoUlR8D63EadDb8nFzGw5FEMbdIRBFV3cfPkIk/1WICw5WnZ8SrMBaG/nDidTW+Tk5cJ6SW+58wfW/wJruk1V+Pp2f/RDYnrKf3jHFddo9x6Y2KwfTHWNEBAXiqnHVuJOVNG56lm3JWa3+QZWQjOEJr3E7FPrceqZv1zMT22+xtcNO8NAUxc3IgMx6chyhCZFyY7/0HIgOtg3QX2zmsjOy4Xlrz2KfD0jLX1c9/oT1QyqotqC7kjJTPvvb7oC+rbpl5jcqj9M9YzwMCYUkw8tx+0XT4qM7+XkibkdhsPa0AwhiVGY5fc/nHxyUy5mTvvh+Ma9K4RaurgeHoDxB5YiNPFdnqa3GYyODk3hbGGH7LwcmM3tKne+k3lN/NB6EDxsnGCsY4CIpFisv3EIq6/uK903X4F816IXprYdBDN9IzyICsHEvUtxK+JxkfF9XFpjXtfRsDEyw7OEl/jx0Br4PbouF+PdeSRGenSHUEsPV58/xNjdvyEk4aXsuKG2Hlb0mYyu9ZpDIpVg/4MLmLR3GdKyM2Qx7R0aY27nEahrXgOZOdm4HHofUw+sRERSbOlfhArCq1Vv/PDF4PxcvQzB+N1LcCviUZHxfVzb4Oduo2FjbI5n8S8w/cBq+AXJ52pe11EY1bwHhFq6uBoWgO92LEZIwgvZcUNtfaz8agq6OeXnat+985i45w+kZeXnam6XkfDuOrLQa6dlZUB3UutSeucVC/NEVDxKUxF93/Pnz9G9e3eoqqoCAAQCAXr06IHnz5+X88hK7vjx21j4616MHdsV+w/MRG0HS4wcsRKvXqUqjL97NxRTpmxEnz7NcODgLLRr64JxY/+H4OB3v2htWH8Kf/99Ht7eA+HrOx1aWhoYOWIlsrJyAABxcWIM/2YZrKxE2O07HRvWj0fIs2j8+OMWWR8CgQratnXGmrVeOHFyHn5dOAzXrz3B3Lk7Pu0FUVI9HVvBp91oLLq8Ha02jkVgfBj29/eBibaBwnj3anWwseeP+PvBCbTc4IXjwdewve9cOFa1lsVMbNoP37r1wGS/lWi3eSLSczKxf8ACVFFVl8VoqKrh0ONL2HTnmMLX2f/oIuyX9Zf7OhN6G1ciHlTaSWjvep74teMY/HphK5r/bwwCY0NxcOgiVNURKoxvXL0O/urzE7bc9UOztd/i6OOr2DVgPuqIbGQx3zfvjzGNe2LikWXw/HMc0rIzcXDoQlRRez9X6jgQdBEbbh351zGu/nIqAuPC/utbrdD6OLfG4m5j4XNmC5osH4WAmFAcGfF7kXlqYl0XWwfOxuZbx9F4+SgcCbqMPUN9UMf03Yd2UzwHwKtZL4zfvwQtVo5BWnYmjo74HVXUNGQxGqrq2B9wAX/eOKTwdVyr1Ub8m2R8s+sXuC4ZhkXn/sbPnUZjjEfP0nz7FUY/17ZY0nMCfvbbhEaLv8HDqBD4ef2BqrqGCuOb1qiH7V/Pw6brR9Bw0dc49PAS9o9aiLrmtrKYH9oNxvhWfeG1+zc0XTIS6VmZ8PP6Qy5P24Z5o455DXRYPRHd1/2AFjVdsG7AdNlxG2NzHBi9EOef3YHroq/Rac33MNYRYu/IXz/dxVBy/Rq2w9LeEzHv2Aa4LhiGBy+f4eSEZaiqV0SubJ2wc/h8bLx2BA0WDMPBB5dwcMxi1LV4l6tp7YdgQut+GLNjERovHom0rAycnLBMLlfbh89DXfMa+GLFBHRdMxUtazXAn4PeFQV+P7MdZtM7y30FRYdhz91zn+5iKDHmqXLIk0g/2VdlolQTURUVFQD5E09tbW25Yzo6Onjz5k15DOs/2fzXGfTt1wy9e3vAzs4C8+YNhKamOvbtu6Yw/u+t59C8RV2MGNkeNWuaY+Kk7qhTxwrbt10AkF8N3br1LMZ81wlt27mgtoMlFi3+BvHxYpw5cx8AcOFCANTUVDFnbn/Y2prBqb4NvOcNwqmT9xAREQ8AMDDQwYCBreDkZI1q1YzRtKkDBgxshTu3Q8risiidsY17Ycv9E9j+8BSeJkbi++MrkJ6bhcHOHRTGj3H/EmdCb2Pljb0IfvUCPhe34kFsCEY1elcl+879S/x2ZSeOB19HUPxzjDm8GGZ6xuhS20MW8+ulv7HG/wAeJSj+kCUzNxvxacmyrzypBC1tnPH3/ZOlewEqkHEefbD5znFsu3cSTxIiMOHIMmTkZGGIa0eF8V5NeuF0yC0sv+qLp4mR+PncZtyPeYZvG38pixnbtBcWX9qGY0+uISguDKP3L4K5ngm6OTSXxfic34LV1/chKO6fPxAb6dYNQk0drLjqWyrvt6Ka0KIfNt08iq23/fAkPgLj9i9Bek4mhrl1Vhg/tnkfnAr2xx8Xd+FpfATmndqEe1HB+K7ZuwniuOZ9sfDs3zj66CoCY8MwYvcCmOsbo3vdd3n6+fRfWHl5D4JiFH8QsOX2cUw9vBKXwx7geVIMdt47ja23/fBlvZalewEqiEmt+2PD9cPYfPMYHseG47vdi5GenYVvmnZVGD/Bsx9OPr6JJWd34ElcBOYeW4+7L55ibMt3qzkmevaDz8nNOBxwGQHRoRj293xYGJjgy/r519jB1Bod6zTF6B0L4R/xCFfDHmLi3qX4yrUdzPVNAAANqztAVaCK2Uf/RFhiFO69DMbSczvgUq0W1ASqn/7CKKHJbQdg/dVD2Hw9P1djdi5CenYmhheRq4mtv8KJRzfw++nteBIbjjlH/sTdF08xrlUfWcykNl/hF7+/cPjhZQREhWDo5nn5uXJ5myszG3Sq2xQjty2Af3gQroY+wPjdS9C/4RcwN8jPVVpWBuJSk2RfpnpGqGthi43XDn/6i6KEmCei4lOqiejEiRPxzTffICkpqdD9oAWbFlUk2dm5CAqKhIeHo6xNIBCgqYcj7t9T/EvS/fth8GjqINfWrHkd3L+fH//yZSISElLl+tTT00J95xqyPrOzc6GurgaB4F16NTXzKzt37iieaMbFiXH69D24udX6iHdasakL1OBiXgsXn9+VtUkhxcXn9+BuWUfhOW7VHHHx+T25tnNhd+BeLT8v1kIzmOka42L4uz5Ts9JxJ+qJLOZjDHBqh4ycLBx6cvmj+6jI1FXV0MDcHudD38uVVIrzoXeLzJV79To4H3ZHru1syG24V8+PtzE0h5mesVyfqVlpuB31WBZTXA5VrTHDcwhG7V8ESSW7z+N96qpqcK1mj3Mh7667VCrF+Wd30Ni6rsJzmljVxbln8nk6E3wLja3y42sYmcNc31guJjUzDbdePC6yz+Iy0NRBUrriVSqfM3VVNTSsXhtnn96WtUmlUpx9egtNbeopPKeJTT2ceSp/C8KpJzfRpEZ+fA1jC5gbmMj1mZqZhpvhj2QxTWvUQ3J6Ku68t0z7zNPbkEglaGyT/zN358UTSCQSfNO4CwQqAuhr6mCwW0ecfXobuZK80rkAFYi6qhoaWtXGmSfvrr1UKsWZJ7fQ1NZJ4TlNbevJxQPAyUc3ZPE1TPJz9X5MamYabj4PQtMa+TGyXEW+l6snt97mSvHP3chmPfA0LgJXQh583JutwJinyoP3iJYOpZmIfvfddxg2bBiGDRuGb7/9FmZmZnLHg4OD4e7uXk6j+zjJyW+QlyeBsbG+XLuJsR4SExX/0pOYmApjk6LjExLyv/9Tn02a1EZiYgo2bjiF7OxcpKSkYcmSA3LnF5g8eQNcnMejVcsZ0NXRwi8+Qz7y3VZcxtr6UBOoIj5NLNcen5YMkY7ipTSmuoaIT0suMt5Ux+ht24d9iiHSNfrosQ527oA9QeeRmZv90X1UZMbaBlBTVVV47U31FF9XU10jJLz5IP5NMkzf5sH07RLEeIUxivOviIaqOv7qOwuzTv6JlynxxT7vc2SiYwA1VTXEv5a/pnFv/iFPekaFcvB+fMH3+DdJ8jGvi+6zOJpY10Uf5zbYdPPfl1x/bkx0hFBTVUNc6ofXNAmm+oqvqZm+ceG8vk6GmZ7x2+NGsj7eF/86SXbMVEEfeZI8JKW/hpl+fj/hr2LQcc0k/NJtDDL+uIDk306jmlCEr/766SPfbcVmoltErlKTZdfsQ2b6xv8YX/BdUf5lMQZF5SoVZgaFX7eKmgYGubfHxquV7+cJYJ6ISkppNivy9PT8x+N9+vT5x+MFcnJykJOTI9empV1E8GeqVi0L/LrwayxauBdLlx6EQCDAkCGtYWKiD8Hb5c8FfvyxL8aN7Yrw8DgsXXoQC3/dg7neA8tp5PRP3Ko5wqGqNb49vLi8h0IKzPtiJJ4mRGL3wzPlPRQqpjqmNbBn2AL4nN6MM89u//sJVGZM9YywbsAMbPU/jl13zkCvija8u4yE7wgfdFg1sbyHR0Xo6dIKepo62HLjeHkPhf4B8/TfSfj4llKhNBPR0nLgwAHs3btXrm2373flMhZDQ12oqgoKbUyU+Oo1TD6oehYwMdHHq8Si46tWzf/+6lUqRCIDuRhHB0vZn7t1c0e3bu5ITEyFlpYGVFRUsHnzGVSvbiLXd9WqBqha1QC2Nc1gYKCDQYN+x3deXeT6/ty9Sk9FriQPog82URHpFK56Foh7U7ha+n58XFrS2zYh4t6r4Ih0hAiIC/2ocQ516YiHsSF4EFs57+MFgFfpKcjNy1N47T+swBSIe5NUaOMVka6hLC9xb6tw77cV/PlhTPFz1aqGC+qa1sCXdU4BAAo+84mYfgC/XdoOn/Nb/uHsz0tiWgpy83Ih+mBzDlPdf8jT6ySIdIuOL/gu0jVC7Ht9mOoZ4kF0yX8mHETW8Bu9FJtuHsHCc3+X+PzPQWKaGLl5uYWqn6Z6RoWqLwViU18VzqueIWJfv3p7PEnWR2zqK1mMSM8ID6KeAQDiFPShKlCFkbae7Byvlr2RkpGGGYfWyGKGbp2HyJ8PobFNXdwMD/qYt1xhJb4pIlf6hnLX+X2xqa/+Mb7gu6m+fK5M9Yxw/2V+rmJTisqVPmJTCr/uyGbdcTTgCuKL+Dn/3DFPRCWjNEtz/82OHTuwZs2af43r2bMnNm/eLPdVXjQ01FC3rhWuX3+3Zl8ikeDG9SdwaWCr8BwXF1tcvyH/eINr1x7DxSU/3tLSBFWr6sv1+eZNBh4+eK6wTxMTfejoaMLv+G1UqaIOj2ZF359YcE9bdnZOkTGfoxxJLu7HPEMrmwayNhWooKWNC/xfKt5u/VbUY7Sq4SLX5lnDFf5R+Y88iBDHIvbNK7k+9TS00bCagyymJHTUNfGlY0v8/aDyblIEADl5ubgXEwxP2/dypaICT9sGRebK/8UjeNq6yrW1rtkQ/i/y48OTYxD7+pVcjF4VbTSq5iiLKY5Bu7zRdM1oeKzN/xp7aAkAoP2mSfjTX/EOrp+rnLxc3I0KRmu7hrI2FRUVeNq54maE4gnEjcgguXgAaFOrEW5G5sc/T4pBTOortK4lnye36o5F9lkUR1MbnPx2GbbdOYm5JzeU6NzPSU5eLu68eIo29vJ5amPfCNfDAxWecyM8EG3tG8m1tavtjhvP8+Ofv4pGTEoi2tR+F6OnqY3GNnVkMdefB8JQWx+u1WvLYtrYN4RARYCb4fk/c9oampBI5UsOeW9LEB+u7KkMcvJycSfyKdrWdpO1qaiooG1tN1wPC1B4zvWwQLl4APjCwV0W/zwxP1fvx+hpaqNxjbq4/jw/RpYrq/dyVbsgV/I/dzbG5mht37BSL/dknioPqUT6yb4qkwpTEU1KSsKrV4o/TXqfuro61NXV5drKM6Vff9MOM6ZvRr161qhf3wZbtpxDRkY2evXK3zl1+rS/IDIVYsqU/J0hhwxtg6FDlmDTptPwbOWEY8dvISgwAvPnDwKQ/w/a0KFt8b+1frCxFqGapQlWLD8MkUiIdu1cZK+7bdt5NGhQE9raVXDt2mP8tngfJk/pCX39/HXKFy8GIDHxNZycrKGtXQUhITH4bfE+uLrWhKWlfNW0Mlh9cz/Wdp+KezHBuBP9FN+594SOuia2P8yvbv2v2w+Ifp2I+Rf+yv+z/0EcG/IbxjXujZMh/uhdpxUamNfCpOPLZH2u9T+Iqc0GIDQpChHiWMxqNQyxr1/h2NN3OyZb6leFoZYeLPVFEKgI4GSa/2FCWFI00nIyZXG96rSCmkAVvgFny+BqKLdV1/ZiXc/puBsdjDsvn2Bs097Q1tDEtrv5k/Q/e01HdGoivM9sBACsubEfJ4b/gfEefXEy+Ab6OLWGq4U9JhxeKutz9fX9mNZqEEJfvUREcix+avsNYl4n4siTK7IYSwMRDLX0UF0ogqpAACezmgCAsKQopGVn4nlyjNw4jd8++udpQkSlfI7oisu+2NDvR9x9+QS3XjzB+OZ9oKOhha23/QAAG7+aieiUBMw+sR4AsPrKXpweswITW/aD3+Mb6OfSBg0ta2Psvt9lfa66sgcz2gxFSOJLhCfFYm774YhJfYXDQe/yVF0ogqGWPqobmkJVoIr65nYAgNBXUUjLzkAd0xo48e0fOPP0FlZc8pXdK5wnzUNiWuV7JNKy87vw1+CfcCfyCfwjHmGi51fQqaKJzTeOAgA2D5mNKHECZh35HwBgxQVfnJ+4Bt+3GYDjQdfwlWs7NLJywJhdi2R9Lr/gi1kdhiEk/gWev4rG/K6jEZ2SiIMPLwEAnsRF4MSj61g3YAa8di+GukANK/pOxu67ZxCTmggAOB50DZM8v8JPHb/BrjunoVdFGz7dxiD8VQzuvQwu46ukHJae3Yktw2bjduRj+Ic/wqQ2+bn663r+47+2DJuDKHECZh5aCwBYfn43Lk5ei8ltB+JY4FX0b/QFGlk7YvSOhbI+l53bjZ86f41nCS/wPDEaP3d7m6v7b3MVGw6/oOtYP2gmxuxYBHVVNaz6aip23TmNmJREufEN9+iGmNTEQs+/rGyYp8qhsk0YP5UKMxEdN25ceQ/ho3Tu3AhJSa+xcsURJCSkwtHREus3jJcttY2OSYKK4N2nu66uNfH77yOwbNlh/LH0EGxsRFi1egzs7avJYkaOao+MjCzMmbMdqanpaNjQDus3jEeVKu8m4AEPw7Fy5VGkp2XB1tYU8+YNQo8vm8iOV6migT17rmDhr3uQnZ0LM3NDtP+iAUaNVvy4ks/dgccXYaJjgJmthkKkY4iAuDD03jULCW83G7I0qCr36bx/1COMPLgQP3kOw2zPrxGaFI1Be+bhccK73Z6XX/eFjromlnWeCANNXdx4EYTeu2YhK+9dxXlmy6EY6Nxe9ufLI/P/x9T17x9wJfKhrH2wS0cceXoVKVmVb0LzoX2BF2CibYCf2nwNU11DPIwNRc+/Z8iWRVc3EMntWHvzxSMM3+uD2W2Hw7vdcIS+ikL/nXPwKD5cFvPHlV3Q0dDEyu6TYaCpi+uRAej594/Iyn2Xq5/afI3BDd79fFz3+hMA0GnTZFwO566DH9r74DxMdISY0344TPWM8CA6BN03/iDbkKi6UCT3M3UjIgjDdvwM744jML/jKIQkvkTfrbPw6L3H5Sy5sBM6GlpY3XsqhJq6uBYegG4bf0DWe5t3zWk/HEMadZL92f/7/A8k2v9vIi6F3Uev+q0g0jXEwIbtMbDhu5+9iKQY1F7Y/5NdD2Xle/csTHSF8O4yCmZ6Rrgf9Qyd10yWbXxS3dBULk/Xnwdi8Oa5mN91NHy6fotnCS/Ra/0Mucfl/HZmG3Q0NPG/AdMh1NLFlbCH6LxmslyeBm/xxsq+U3B63ApIpFLsv38BE/f+ITt+PvgOBm/xxtR2g/BDu0FIz87CjeeB6Lx2MjJzKudmbb53zqCqrhDzu46Cmb4x7r98ho4rv5ctr7QyMpP7t+96WAAGbpqDX7p/iwU9xuBZwgt8+b9pCIp+l6vFp/6GjoYm/hw4A0JtXVwJfYiOKyfJ5WrQprlY1X8Kzk5aCYlUin33zmOC77sP8oD8D8m/btIFm68fL1TJrmyYJ6LiU5FKlWef4NTUVJw/fx7BwcEQi8UAAKFQiNq1a8PT0xP6+orvq/w3UpwvxVHSp2Tos/Dfg6jc5WbllvcQqBhyM5mniiAno3LdDlGRSXL5yztRaZGuvVHeQ/hopiu6f7K+4yZUnme7Ks09oiEhIZg4cSL8/Pygra0NR0dHODo6QltbG35+fpg0aRJCQz9ukxciIiIiIiJSHkqzNPevv/5C06ZNMWrUKKh8sBGBVCrF+vXrsWnTJvj4+JTTCImIiIiIqLJTogWlOHHiBI4cOQKxWAxra2sMHz4cdnZ2RcZfv34du3fvRkJCAszMzDBo0CC4ur7bCFAqlcLX1xdnz55FWloaHBwcMHLkSJibmwMA4uPjsW/fPgQGBkIsFsPIyAgtWrRAr169oKZWsqml0lREw8PD0aVLl0KTUCB/TXuXLl0QHh5e9gMjIiIiIiJSMteuXcPWrVvRp08fLFq0CNbW1vDx8UFKiuLN954+fYrly5ejTZs2WLRoEdzc3PDbb78hMjJSFnPo0CH4+flh1KhRWLBgAapUqQIfHx9kZ+ffkxwdHQ2pVIrRo0dj6dKlGDZsGE6fPo0dO3aUePxKMxEVCoUICSn6WXAhISEQCoVlNyAiIiIiIqIPKMvjW44ePYq2bduidevWsLS0xKhRo6ChoYHz5xXvj3P8+HG4uLige/fusLS0RP/+/WFra4sTJ07kvy+pFMePH0evXr3g5uYGa2trjBs3DsnJybh16xYAwMXFBV5eXnB2doapqSkaNWqEbt26wd/fv8TXUWmW5nbr1g1//vknwsLC4OTkBAOD/EcfpKSkICAgAGfPnsWQIUPKeZRERERERESfRk5ODnJy5DexU/R4ytzcXISFheHLL7+UtQkEAjg5OSE4WPFjroKDg9G1a1e5NmdnZ9kkMz4+HmKxGPXr15cd19bWhp2dHYKDg9GsWTOF/aanp0NXV7fY77GA0kxEO3bsCH19fRw7dgynTp2CpODB1QIBbG1t4eXlBQ8Pj3IeJRERERERVWaf8jmiBw4cwN69e+Xa+vTpg379+sm1paamQiKRFFoxKhQKER0drbBvsVgsK/YVMDAwkD2tpOD7P8V8KDY2Fn5+fh9VMFSaiSgAeHh4wMPDA7m5uXj9+jUAQE9Pr8Q3vhIREREREX0Kn3Ii2rNnz0JVyw+rocoiKSkJPj4+aNq0Kdq1a1fi85VyhqempgZDQ8PyHgYREREREVGZUbQMVxF9fX0IBIJClUqxWFzkvjpCobDQRkYpKSmy+ILvKSkpcnOxlJQU2NjYyJ2XlJSEefPmoXbt2hg9evS/jlcRpdmsiIiIiIiISNkpw2ZFampqsLW1RWBgoKxNIpEgMDAQ9vb2Cs+xt7dHQECAXNvDhw9Rq1YtAIBIJIJQKJSLSU9PR0hIiFyfBZPQGjVqwMvLCwLBx00pORElIiIiIiKqYLp27YqzZ8/iwoULePnyJTZs2ICsrCx4enoCAFatWiX3WJXOnTvjwYMHOHLkCKKiouDr64vQ0FB07NgRQP4jMzt37oz9+/fj9u3biIyMxKpVq2BoaAg3NzcA+ZNQb29vmJiYYOjQoUhNTYVYLC7yHtJ/opRLc4mIiIiIiJTRp7xHtCQ8PDyQmpoKX19fiMVi2NjYYObMmbIltomJiVBRUZHF165dGxMmTMCuXbuwc+dOmJub44cffoCVlZUspkePHsjKysK6deuQnp4OBwcHzJw5ExoaGgDyK6ixsbGIjY3FmDFj5Mbj6+tbovGrSKVS5biSn5AUip+lQ8rH0GdheQ+BiiE3K7e8h0DFkJvJPFUEORk5/x5ESkGSKynvIRB9NqRrb5T3ED6a4a8dP1nfyT+e+GR9KxtWRImIiIiIiIpJWSqiFR3vESUiIiIiIqIyxYooERERERFRMbEiWjo4ESUiIiIiIiomTkRLB5fmEhERERERUZliRZSIiIiIiKiYKsFDR8oEK6JERERERERUplgRJSIiIiIiKibeI1o6WBElIiIiIiKiMsWKKBERERERUTGxIlo6WBElIiIiIiKiMsWKKBERERERUTGxIlo6OBElIiIiIiIqJk5ESweX5hIREREREVGZYkWUiIiIiIiomFgRLR2siBIREREREVGZYkWUiIiIiIiomFgRLR2siBIREREREVGZYkWUiIiIiIiomFgRLR2siBIREREREVGZYkWUiIiIiIiomKRSVkRLAyuiREREREREVKZYESUiIiIiIiom3iNaOjgRJSIiIiIiKiZOREsHl+YSERERERFRmWJFlIiIiIiIqJhYES0drIgSERERERFRmWJFlIiIiIiIqJhYES0drIgSERERERFRmVKR8omsFU5OTg4OHDiAnj17Ql1dvbyHQ/+AuaoYmKeKgXmqOJirioF5qhiYJ/pcsSJaAeXk5GDv3r3Iyckp76HQv2CuKgbmqWJgnioO5qpiYJ4qBuaJPleciBIREREREVGZ4kSUiIiIiIiIyhQnokRERERERFSmOBGtgNTV1dGnTx/esF4BMFcVA/NUMTBPFQdzVTEwTxUD80SfK+6aS0RERERERGWKFVEiIiIiIiIqU5yIEhERERERUZniRJSIiIiIiIjKFCeiREREREREVKbUynsAVHInTpzAkSNHIBaLYW1tjeHDh8POzq68h1VpPXr0CIcPH8bz58+RnJyMqVOnwt3dXXZcKpXC19cXZ8+eRVpaGhwcHDBy5EiYm5uX46grnwMHDsDf3x9RUVHQ0NCAvb09Bg8eDAsLC1lMdnY2tm7dimvXriEnJwfOzs4YOXIkhEJh+Q28Ejp16hROnTqFhIQEAIClpSX69OmDBg0aAGCelNXBgwexY8cOdO7cGV9//TUA5koZ+Pr6Yu/evXJtFhYWWLZsGQDmSJkkJSVh27ZtuH//PrKysmBmZgYvLy/UrFkTAH+foM8Pd82tYK5du4ZVq1Zh1KhRqFWrFo4dO4YbN25g2bJlMDAwKO/hVUr37t3D06dPYWtri99//73QRPTgwYM4ePAgxo4dC5FIhN27dyMyMhJLly6FhoZGOY68cvHx8UGzZs1Qs2ZN5OXlYefOnXjx4gWWLl0KTU1NAMD69etx9+5djB07Ftra2ti4cSMEAgF+/vnnch595XL79m0IBAKYm5tDKpXi4sWLOHz4MBYvXozq1aszT0ooJCQEf/zxB7S1tVG3bl3ZRJS5Kn++vr64efMmZs+eLWsTCATQ19cHwBwpizdv3mD69OmoW7cu2rdvD319fcTExMDU1BRmZmYA+PsEfX64NLeCOXr0KNq2bYvWrVvD0tISo0aNgoaGBs6fP1/eQ6u0GjRogP79+8tNPgtIpVIcP34cvXr1gpubG6ytrTFu3DgkJyfj1q1b5TDaymvWrFnw9PRE9erVYWNjg7FjxyIxMRFhYWEAgPT0dJw7dw7Dhg1DvXr1YGtrCy8vLzx9+hTBwcHlPPrKpVGjRnB1dYW5uTksLCwwYMAAaGpq4tmzZ8yTEsrMzMTKlSvx7bffQkdHR9bOXCkPgUAAoVAo+yqYhDJHyuPQoUMwNjaGl5cX7OzsIBKJ4OzsLJuE8vcJ+hxxIlqB5ObmIiwsDE5OTrI2gUAAJycn/g9DScXHx0MsFqN+/fqyNm1tbdjZ2TFn5Sw9PR0AoKurCwAICwtDXl6e3M9XtWrVYGJiwlyVI4lEgqtXryIrKwv29vbMkxLasGEDGjRoIPfvHMCfKWUSGxuLb7/9FuPGjcOKFSuQmJgIgDlSJrdv34atrS2WLl2KkSNHYtq0aThz5ozsOH+foM8R7xGtQFJTUyGRSArdtyEUChEdHV0+g6J/JBaLAaDQsmkDAwPZMSp7EokEmzdvRu3atWFlZQUgP1dqampyFR2AuSovkZGRmDVrFnJycqCpqYmpU6fC0tIS4eHhzJMSuXr1Kp4/f45ff/210DH+TCmHWrVqwcvLCxYWFkhOTsbevXsxZ84cLFmyhDlSIvHx8Th9+jS6dOmCnj17IjQ0FH/99RfU1NTg6enJ3yfos8SJKBFVOhs3bsSLFy8wf/788h4KFcHCwgK//fYb0tPTcePGDaxevRrz5s0r72HRexITE7F582b89NNPvD9NiRVs8gUA1tbWsonp9evXmTclIpFIULNmTQwcOBAAUKNGDURGRuL06dPw9PQs38ERfSKciFYg+vr6EAgEhT75EovF3N1OSRXkJSUlBYaGhrL2lJQU2NjYlM+gKrmNGzfi7t27mDdvHoyNjWXtQqEQubm5SEtLk6sOpKSk8OerHKipqcnujbK1tUVoaCiOHz8ODw8P5klJhIWFISUlBdOnT5e1SSQSPH78GCdOnMCsWbOYKyWko6MDCwsLxMbGon79+syRkjA0NISlpaVcm6WlJW7evAmAv0/Q54n3iFYgampqsLW1RWBgoKxNIpEgMDAQ9vb25TgyKopIJIJQKERAQICsLT09HSEhIcxZGZNKpdi4cSP8/f0xZ84ciEQiueO2trZQVVWVy1V0dDQSExOZKyUgkUiQk5PDPCkRJycn/P7771i8eLHsq2bNmmjevLnsv5kr5ZOZmYnY2FgIhUL+PCmR2rVrF7rNKjo6GlWrVgXA3yfo88SKaAXTtWtXrF69Gra2trCzs8Px48eRlZXFZRvlqOB/6gXi4+MRHh4OXV1dmJiYoHPnzti/fz/Mzc0hEomwa9cuGBoaws3NrRxHXfls3LgRV65cwbRp06ClpSVbWaCtrQ0NDQ1oa2ujTZs22Lp1K3R1daGtrY1NmzbB3t6e/5MvYzt27ICLiwtMTEyQmZmJK1eu4NGjR5g1axbzpES0tLRk91gXqFKlCvT09GTtzFX527p1Kxo1agQTExMkJyfD19cXAoEAzZs358+TEunSpQtmz56N/fv3w8PDAyEhITh79ixGjx4NAFBRUeHvE/TZ4XNEK6ATJ07g8OHDEIvFsLGxwTfffINatWqV97AqraCgIIX3rrVq1Qpjx46VPYD6zJkzSE9Ph4ODA0aMGAELC4tyGG3l1a9fP4XtXl5esg9yCh7sfvXqVeTm5vLB7uVk7dq1CAwMRHJyMrS1tWFtbY0ePXrIdotknpSXt7c3bGxsZM8RZa7K37Jly/D48WO8fv0a+vr6cHBwQP/+/WVL35kj5XHnzh3s2LEDsbGxEIlE6NKlC9q1ayc7zt8n6HPDiSgRERERERGVKd4jSkRERERERGWKE1EiIiIiIiIqU5yIEhERERERUZniRJSIiIiIiIjKFCeiREREREREVKY4ESUiIiIiIqIyxYkoERERERERlSlORImIiIiIiKhMcSJKRESlKigoCP369UNQUFCZv7a3tzemTJlS5q9blE8xnn79+sHX1/df43x9fdGvX79SfW0iIqLSolbeAyAiqswuXLiANWvWyP6srq4OXV1dWFlZoUGDBmjdujW0tLQAAPHx8Rg3blyx+l21ahUSEhIwb968ImMmTpyIZs2aFXl89erVuHjxIrS0tLB+/XpoaGjIHY+JicHEiRMBAIMHD0b37t2LNbaS8PX1xd69e/81rk6dOvD29i711yciIqJPgxNRIiIl0K9fP4hEIuTl5UEsFuPRo0fYsmULjh07hmnTpsHa2hr6+vqFJqJHjx7Fq1evMGzYMLl2fX19JCQkAAA6deqEmjVrFnpNe3v7fx2XqqoqsrKycPv2bXh4eMgdu3z5MtTV1ZGTkyPX7ujoiG3btkFN7b//L6Zx48YwMzOT/TkzMxMbNmyAu7s73N3dZe1CofA/vxYRERGVHU5EiYiUQIMGDeQmiz179kRgYCAWLlyIxYsX448//oCmpiZatmwpd961a9eQlpZWqP19jo6OaNKkyUeNS01NDQ4ODrh69WqhiejVq1fh6uqKmzdvyrULBIJC1dOPZW1tDWtra9mfU1NTsWHDBlhZWf3je/4Y2dnZUFNTg0DAu1aIiIg+NU5EiYiUVL169dC7d2/s3LkTly5dQrt27cplHM2aNcP69euRlpYGHR0dAEBISAhiYmIwcODAQhPRoKAgzJs3D3PnzkXdunUB5N8r+fr1a3z//ffYuHEjnj17Bh0dHXTu3Bk9evQo9TG/fPnyH1+nYIwTJ07EixcvcP78eYjFYmzatAk6Ojp49uwZfH19ERwcjLy8PNSsWRMDBgyAg4ODrI+MjAzs3r0bt27dQnJyMrS1tWFtbY1BgwbB1ta2ROMBgJSUFOzYsQN3795Feno6LCws0KVLF3h6ev7r+33y5Am2bNmCyMhIGBkZfZJl0kRERKWJH/sSESmxgqrfw4cPP7qPjIwMpKamFvqSSqXFOr9x48YAIDfhvHLlCqpVq4YaNWoUexxv3ryBj48PrK2tMXToUFSrVg3bt2/HvXv3SvaGSvF19u3bh7t376Jbt24YMGAA1NTUEBgYiLlz5yIjIwN9+/bFgAEDkJ6ejvnz5yMkJER27vr163Hq1Ck0btwYI0eORLdu3aChoYGoqKgSjyc7Oxve3t64dOkSmjdvjsGDB0NbWxtr1qzB8ePH//H9RkZG4pdffkFKSgr69u0LT09P+Pr64tatW//xShIREX06rIgSESkxY2NjaGtrIy4u7qP7WLt2rcL2P//8s1j3VmppaaFhw4a4evUq2rRpA4lEgmvXrqF9+/YlGkdycjLGjRsnm1y3adMGXl5eOHfuHBo0aFCivkrrdXJycrBw4ULZUmKpVIr169ejbt26mDlzJlRUVAAAX3zxBSZPnoxdu3bhp59+AgDcvXsXbdu2xdChQ2X9KaruFmc8Z86cQVRUFMaPH48WLVrIXtPb2xu7du2S27TqQ7t374ZUKsX8+fNhYmICIP/Dg6lTp37cBSQiIioDnIgSESk5TU1NZGRkfPT5ffr0kVtSWkBXV7fYfTRv3hxLly6FWCxGZGQkxGIxmjdvXqJxaGpqyiZZQP79p3Z2doiPjy9RP6X5Oq1atZK7nzU8PBwxMTHo1asXXr9+LRdbr149XL58GRKJBAKBADo6OggJCUFSUhKMjIz+03ju3bsHoVAot4uxmpoaOnXqhOXLl+PRo0do2LBhob4lEgkePHgANzc32SQUACwtLeHs7Fzq1WYiIqLSwokoEZGSy8zMhIGBwUefb2Vlhfr16/+nMTRo0ABaWlq4du0awsPDUbNmTZiZmZVoEmlsbCyrMBbQ0dFBRETEfxrbf3kdkUgk9+eYmBgA+Y+uKUp6ejp0dXUxaNAgrF69Gt999x1sbW3RoEEDtGrVCqampiUeT0JCAszNzQttlFStWjXZcUVSU1ORnZ0Nc3PzQscsLCw4ESUiIqXFiSgRkRJ79eoV0tPTC01uypq6ujrc3d1x8eJFxMXFoW/fviXuo6x2oy3J63y4u2/BfbODBw+GjY2NwnM0NTUBAB4eHnB0dIS/vz8ePHiAI0eO4NChQ5g6darcEmDuwktERFQYJ6JERErs0qVLAAAXF5fyHQjyl+eeP38eKioqcktIPycFE35tbe1iVZENDQ3RoUMHdOjQASkpKZg+fTr2799f4nteq1atioiICNmy3wLR0dGy44ro6+tDQ0NDVsl9X8G5REREyogf0xIRKanAwEDs27cPIpGoxPdjfgp169bFV199hREjRhRrk6OKyNbWFqampjhy5AgyMzMLHU9NTQWQf29menq63DEDAwMYGhoiNze3xK/boEEDiMViXLt2TdaWl5cHPz8/aGpqok6dOgrPEwgEcHZ2xq1bt5CYmChrf/nyJR48eFDicRAREZUVVkSJiJTAvXv3EBUVBYlEArFYjKCgIDx8+BAmJiaYNm1aoSWkJfH48WNkZ2cXare2toa1tXWx+xEIBOjdu/dHj6MiEAgEGDNmDBYsWIDJkyfD09MTRkZGSEpKQlBQELS0tDBjxgxkZGRgzJgxaNKkCaytraGpqYmAgACEhobK7aJbXO3atcPp06exZs0ahIWFQSQS4caNG3j69Cm+/vrrInfMBYB+/frh/v37mDNnDtq3bw+JRAI/Pz9Ur1691O+/JSIiKi2ciBIRKQFfX18A+Tul6urqwsrKCsOGDfvHx3YUl5+fn8L2Pn36lGgiWlnUrVsXPj4+2Lt3L06ePInMzEwIhULY2dnhiy++AABUqVIFHTp0wIMHD+Dv7w+JRAIzMzOMHDmyxI+1AfLvVfX29sb27dtx8eJFZGRkwMLCAl5eXvD09PzHc62trTFr1ixs3boVvr6+MDY2Rr9+/ZCcnMyJKBERKS0VaXGfaE5ERERERERUCniPKBEREREREZUpTkSJiIiIiIioTHEiSkRERERERGWKE1EiIiIiIiIqU5yIEhERERERUZniRJSIiIiIiIjKFCeiREREREREVKY4ESUiIiIiIqIyxYkoERERERERlSlORImIiIiIiKhMcSJKREREREREZYoTUSIiIiIiIipT/wfg2IwLDcqOEwAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "error_df = pd.DataFrame(error_track)\n", - "## Plot Heat Map\n", - "import seaborn as sns\n", - "import matplotlib.pyplot as plt\n", - "plt.figure(figsize=(12, 6))\n", - "# heatmap_data = error_df.pivot(index=\"width\", columns=\"DTE_MIN_THRESHOLD\",values=\"surface_loss\")\n", - "heatmap_data = error_df.pivot_table(\n", - " index=\"width\", \n", - " columns=\"DTE_MIN_THRESHOLD\", \n", - " values=\"surface_loss\", \n", - " aggfunc='mean'\n", - ")\n", - "heatmap_data.index = heatmap_data.index.round(2)\n", - "heatmap_data=heatmap_data.iloc[::-1]\n", - "sns.heatmap(heatmap_data, annot=True, fmt=\".4f\", cmap=\"RdYlGn_r\")\n", - "plt.title(\"Surface Loss Heatmap\")\n", - "plt.xlabel(\"DTE Min Threshold\")\n", - "plt.ylabel(\"Width\")\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
DTE_MIN_THRESHOLD0102030405060
width
0.90.0178890.0051240.0049810.0048180.0043780.0040760.004076
0.80.0151020.0031200.0028850.0027260.0023210.0021510.002151
0.70.0135990.0024100.0021510.0019740.0015500.0013650.001365
0.60.0127560.0020890.0018020.0015820.0011130.0009680.000968
0.50.0092750.0017190.0014290.0011900.0008250.0006800.000680
\n", - "
" - ], - "text/plain": [ - "DTE_MIN_THRESHOLD 0 10 20 30 40 50 \\\n", - "width \n", - "0.9 0.017889 0.005124 0.004981 0.004818 0.004378 0.004076 \n", - "0.8 0.015102 0.003120 0.002885 0.002726 0.002321 0.002151 \n", - "0.7 0.013599 0.002410 0.002151 0.001974 0.001550 0.001365 \n", - "0.6 0.012756 0.002089 0.001802 0.001582 0.001113 0.000968 \n", - "0.5 0.009275 0.001719 0.001429 0.001190 0.000825 0.000680 \n", - "\n", - "DTE_MIN_THRESHOLD 60 \n", - "width \n", - "0.9 0.004076 \n", - "0.8 0.002151 \n", - "0.7 0.001365 \n", - "0.6 0.000968 \n", - "0.5 0.000680 " - ] - }, - "execution_count": 43, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "heatmap_data" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from typing import Literal\n", - "def plot_subplot(\n", - " grid: pd.DataFrame, \n", - " x: Literal['column', 'index'],\n", - " label: str = 'Value',\n", - " sup_tile: str = '3x2 Subplot Visualization',\n", - " subplot_title_format: list = None,\n", - " nrows: int = 3,\n", - " ncols: int = 2\n", - "):\n", - " if subplot_title_format is None:\n", - " subplot_title_format = \"Plot for {x}\"\n", - " if not isinstance(subplot_title_format, list):\n", - " subplot_title_format = [subplot_title_format] * len(grid.columns)\n", - " grid=grid.copy().T if x=='column' else grid.copy()\n", - " fig, ax = plt.subplots(nrows=nrows, ncols=ncols, figsize=(15, 10))\n", - " idx=0\n", - " for r in range(nrows):\n", - " for c in range(ncols):\n", - " \n", - " if idx > len(grid.columns) -1:\n", - " break\n", - " x_values = grid.index\n", - " y_values = grid.iloc[:, idx]\n", - "\n", - " ax[r, c].plot(x_values, y_values, marker='o', linestyle='-', label=label)\n", - " ax[r, c].set_title(subplot_title_format[idx])\n", - " idx += 1\n", - " fig.suptitle(sup_tile)\n", - " plt.tight_layout(rect=[0, 0.03, 1, 0.95])\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABdEAAAO6CAYAAABwth6pAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzs3Xl8VNX9//HXHZJAWJIJkpiwJAGyIbIYBGVRVhEBWdQKBbciQQXqUqXF1FZqiTXyLZVfQUVF3IEgKLKqRahsIgpK4kLYAggCCTAJEAhJ5vz+SDMwJoMMSyYJ7+fjkYfMuefe85kPw8Mzn5x7rmWMMYiIiIiIiIiIiIiISBk2XwcgIiIiIiIiIiIiIlJZqYguIiIiIiIiIiIiIuKBiugiIiIiIiIiIiIiIh6oiC4iIiIiIiIiIiIi4oGK6CIiIiIiIiIiIiIiHqiILiIiIiIiIiIiIiLigYroIiIiIiIiIiIiIiIeqIguIiIiIiIiIiIiIuKBiugiIiIiIiIiIiIiIh6oiC4iIiIiLFu2jLZt21KrVi0sy8LhcPg6pConKysLy7L4v//7P1+HclYrV67EsixWrlz5q327detGt27dzum63bp14+qrr76w4CrAG2+8gWVZZGVl+ToUEREREakiVEQXERERqYTS09O54447iIqKolatWjRq1IibbrqJf//73xd9rEOHDnHnnXcSGBjItGnTePvtt6lTp85FH+dCREdH079/f1+H4XNpaWlYlsUHH3xQ5libNm2wLIsVK1aUORYZGUmnTp0uePx9+/YxYcIEvvnmmwu+VmU3YcIELMty/dSuXZvIyEhuvfVWZs6cSUFBgatv6S8mzuUHThfyPf188cUXvnrbIiIiIlIOP18HICIiIiLu1q5dS/fu3YmMjCQpKYnw8HD27NnDF198wZQpU/j9739/UcfbsGEDR48e5e9//zu9evW6qNeWi6tLly4ArF69msGDB7va8/LyyMjIwM/PjzVr1tC9e3fXsT179rBnzx6GDh0KwI033siJEycICAjwevx9+/bxt7/9jejoaNq2bXthb6aKeOmll6hbty4FBQXs3buXjz/+mBEjRvDCCy+waNEimjRpQosWLXj77bfdznvyySepW7cuf/7znz1e+5lnnqFp06Zl2mNiYi76+xARERGR86ciuoiIiEglk5KSQnBwMBs2bMBut7sdO3jw4EUb5/jx49SpU8d1zV+OJZVPw4YNadq0KatXr3ZrX7duHcYYfvOb35Q5Vvq6tABvs9moVatWxQRcDdxxxx00aNDA9fqvf/0r7777Lvfccw+/+c1v+OKLL7jyyiu566673M577rnnaNCgQZn2M91yyy1ce+21lyx2EREREbk4tJ2LiIiISCWzfft2WrZsWW5ROywszPXn0j2433jjjTL9LMtiwoQJrtelW1N8//33DBs2jJCQELp06UK3bt249957AWjfvj2WZXHfffcBsGrVKn7zm98QGRlJzZo1adKkCY899hgnTpwoM96PP/7InXfeSWhoKIGBgcTHx5dZgbt3715GjBjBlVdeSc2aNWnZsiWvv/669wnyoKioiL///e80b96cmjVrEh0dTXJystu2GwBfffUVN998Mw0aNCAwMJCmTZsyYsQItz6zZ8+mXbt21KtXj6CgIFq1asWUKVPOOZZ//etfREVFERgYSNeuXcnIyHAdmzlzJpZlsWnTpjLnPfvss9SoUYO9e/d6vHaXLl3YtGmT29/DmjVraNmyJbfccgtffPEFTqfT7ZhlWXTu3BnwvCf6K6+8QvPmzQkMDKRDhw6sWrXK7fjKlStp3749AL/73e9cW4/88vP3/fff0717d2rXrk2jRo14/vnnz56sM/LSo0cPwsLCqFmzJldddRUvvfRSmX6lW/usXr2aDh06UKtWLZo1a8Zbb71Vpu93331Hjx49CAwMpHHjxkycONEtN+dr+PDhjBw5kvXr1/Ppp59e8PVEREREpHLTSnQRERGRSiYqKop169aRkZFx0R/U+Jvf/IbY2FieffZZjDHExsYSHx/PK6+84tpaonnz5gDMnTuX/Px8HnroIa644gq+/PJL/v3vf/PTTz8xd+5c1zU3b97MDTfcgL+/P6NGjSI6Oprt27ezcOFCUlJSADhw4ADXX389lmUxduxYQkNDWbp0Kffffz95eXk8+uijF/zeRo4cyZtvvskdd9zB448/zvr16/nHP/7BDz/84NpD/ODBg/Tu3ZvQ0FDGjx+P3W4nKyuL+fPnu67z6aef8tvf/paePXuSmpoKwA8//MCaNWt45JFHfjWOt956i6NHjzJmzBhOnjzJlClT6NGjB+np6Vx55ZXccccdjBkzhnfffZdrrrnG7dx3332Xbt260ahRI4/X79KlC2+//Tbr1693PfRzzZo1dOrUiU6dOpGbm0tGRgatW7d2HUtISOCKK67weM0ZM2bwwAMP0KlTJx599FF27NjBgAEDqF+/Pk2aNAGgRYsWPPPMM/z1r39l1KhR3HDDDQBue60fOXKEPn36cNttt3HnnXfy/vvv86c//YlWrVpxyy23nDVvL730Ei1btmTAgAH4+fmxcOFCRo8ejdPpZMyYMW59t23bxh133MH999/Pvffey+uvv859991Hu3btaNmyJQD79++ne/fuFBUVMX78eOrUqcMrr7xCYGDgWeM4V3fffTevvPIKn3zyCTfddNN5XSM3N5ecnBy3Nsuyzvp3JSIiIiI+YERERESkUvnkk09MjRo1TI0aNUzHjh3NH//4R/Pxxx+bU6dOufXbuXOnAczMmTPLXAMwTz/9tOv1008/bQDz29/+tkzfmTNnGsBs2LDBrT0/P79M33/84x/Gsiyza9cuV9uNN95o6tWr59ZmjDFOp9P15/vvv99ERESYnJwctz5Dhw41wcHB5Y51pqioKNOvXz+Px7/55hsDmJEjR7q1P/HEEwYwn332mTHGmA8++KDc93qmRx55xAQFBZmioqKzxvRLpX8fgYGB5qeffnK1r1+/3gDmsccec7X99re/NQ0bNjTFxcWuto0bN3r8+zzTd999ZwDz97//3RhjTGFhoalTp4558803jTHGXHnllWbatGnGGGPy8vJMjRo1TFJSkuv8FStWGMCsWLHCGGPMqVOnTFhYmGnbtq0pKChw9XvllVcMYLp27epq27Bhg8cYu3btagDz1ltvudoKCgpMeHi4uf3228/6nowp//N28803m2bNmrm1RUVFGcB8/vnnrraDBw+amjVrmscff9zV9uijjxrArF+/3q1fcHCwAczOnTvPGk/pv5ns7Oxyjx85csQAZvDgweUeb9mypVvuzlT6b668n5o1a541LhERERGpeNrORURERKSSuemmm1i3bh0DBgzg22+/5fnnn+fmm2+mUaNGfPTRRxd07QcffPCc+565Yvf48ePk5OTQqVMnjDGurUiys7P5/PPPGTFiBJGRkW7nW5YFgDGGefPmceutt2KMIScnx/Vz8803k5uby8aNGy/ofS1ZsgSAP/zhD27tjz/+OACLFy8GTu/7vmjRIgoLC8u9lt1u5/jx4+e9TcegQYPcVpJ36NCB6667zhUjwD333MO+fftYsWKFq+3dd98lMDCQ22+//azXb9GiBVdccYVrr/Nvv/2W48ePu1aEd+rUiTVr1gAle6UXFxe79kMvz1dffcXBgwd58MEH3R42et999xEcHOzFO4e6deu67QEeEBBAhw4d2LFjx6+ee+bnrXSFdteuXdmxYwe5ublufa+66irXSniA0NBQ4uPj3cZZsmQJ119/PR06dHDrN3z4cK/ekyd169YF4OjRo+d9jWnTpvHpp5+6/SxduvSixCciIiIiF4+K6CIiIiKVUPv27Zk/fz5Hjhzhyy+/5Mknn+To0aPccccdfP/99+d93aZNm55z3927d3PfffdRv3596tatS2hoKF27dgVwFTVLi5Zn23YmOzsbh8PBK6+8QmhoqNvP7373O+DCH5i6a9cubDYbMTExbu3h4eHY7XZ27doFQNeuXbn99tv529/+RoMGDRg4cCAzZ8502zd99OjRxMXFccstt9C4cWNGjBjBsmXLzjmW2NjYMm1xcXFkZWW5Xt90001ERETw7rvvAuB0Opk1axYDBw6kXr16Z72+ZVl06tTJtff5mjVrCAsLc733M4vopf89WxG9NDe/jNvf359mzZr9yrt117hxY9cvT0qFhIRw5MiRXz13zZo19OrVizp16mC32wkNDSU5ORmgTBH9l7+wKW+cXbt2lft3ER8ff07v5dccO3YM4Ff/vs6mQ4cO9OrVy+2ne/fuFyU+EREREbl4VEQXERERqcQCAgJo3749zz77LC+99BKFhYWu/ch/WawsVVxc7PF657ofdHFxMTfddBOLFy/mT3/6Ex9++CGffvqp6yGS3jycsbTvXXfdVWbVbelP6UMvL5SnnJx5/P3332fdunWMHTvW9bDTdu3auYqiYWFhfPPNN3z00UcMGDCAFStWcMstt7gewHox1KhRg2HDhjFv3jxOnjzJihUr2Ldvn9sq7rPp0qULubm5pKenu/ZDL9WpUyd27drF3r17Wb16NQ0bNvS6GH6+atSoUW67Meas523fvp2ePXuSk5PD5MmTWbx4MZ9++imPPfYYUPbzdr7jXEylD4v95S9uRERERKT60YNFRURERKqIa6+9FoCff/4ZKFl5C+BwONz6la4svhDp6elkZmby5ptvcs8997jaf7nFSWlxtrSgWJ7Q0FDq1atHcXExvXr1uuDYyhMVFYXT6WTr1q20aNHC1X7gwAEcDgdRUVFu/a+//nquv/56UlJSeO+99xg+fDizZ89m5MiRQMkvL2699VZuvfVWnE4no0ePZvr06fzlL3/51aLp1q1by7RlZmYSHR3t1nbPPffwz3/+k4ULF7J06VJCQ0O5+eabz+n9lq4sX716NWvWrHF7MGu7du2oWbMmK1euZP369fTt2/es1yrNzdatW+nRo4ervbCwkJ07d9KmTRtX26/9kuJ8LVy4kIKCAj766CO3VeZnbnfjraioqHL/LrZs2XLe1zzT22+/DXDOf2ciIiIiUnVpJbqIiIhIJbNixYpyV9SW7qlduh1FUFAQDRo04PPPP3fr9+KLL15wDKUrfc+MwxjDlClT3PqFhoZy44038vrrr7N79263Y6Xn1qhRg9tvv5158+aVW2zPzs6+4HhLC8UvvPCCW/vkyZMB6NevHwBHjhwpk9u2bdsCuLZ0OXTokNtxm81G69at3fqczYcffsjevXtdr7/88kvWr1/PLbfc4tavdevWtG7dmtdee4158+YxdOhQ/PzObY3LtddeS61atXj33XfZu3ev20r0mjVrkpiYyLRp0zh+/PhZt3IpvVZoaCgvv/wyp06dcrW/8cYbZX5BU6dOHaDsL24uVHmft9zcXGbOnHne1+zbty9ffPEFX375pastOzvbtYXOhXjvvfd47bXX6NixIz179rzg64mIiIhI5aaV6CIiIiKVzO9//3vy8/MZPHgwCQkJnDp1irVr1zJnzhyio6Nd+4gDjBw5kueee46RI0dy7bXX8vnnn5OZmXnBMSQkJNC8eXOeeOIJ9u7dS1BQEPPmzSt3b+v/9//+H126dCExMZFRo0bRtGlTsrKyWLx4Md988w0Azz33HCtWrOC6664jKSmJq666isOHD7Nx40b+85//cPjw4V+Nadu2bUycOLFM+zXXXEO/fv249957eeWVV3A4HHTt2pUvv/ySN998k0GDBrn2mX7zzTd58cUXGTx4MM2bN+fo0aO8+uqrBAUFuQrxI0eO5PDhw/To0YPGjRuza9cu/v3vf9O2bVu3Ve6exMTE0KVLFx566CEKCgp44YUXuOKKK/jjH/9Ypu8999zDE088AXDOW7nA6W1+Vq1aRc2aNWnXrp3b8U6dOvHPf/4TOPt+6FCy9/nEiRN54IEH6NGjB0OGDGHnzp3MnDmzzDYwzZs3x2638/LLL1OvXj3q1KnDdddd59Ve++Xp3bu3a/X/Aw88wLFjx3j11VcJCwtz3XnhrT/+8Y+8/fbb9OnTh0ceeYQ6derwyiuvEBUVxebNm8/5Ou+//z5169bl1KlT7N27l48//pg1a9bQpk0b19ZK52vp0qX8+OOPZdo7depUYVvwiIiIiMg5MCIiIiJSqSxdutSMGDHCJCQkmLp165qAgAATExNjfv/735sDBw649c3Pzzf333+/CQ4ONvXq1TN33nmnOXjwoAHM008/7er39NNPG8BkZ2eXGW/mzJkGMBs2bHBr//77702vXr1M3bp1TYMGDUxSUpL59ttvDWBmzpzp1jcjI8MMHjzY2O12U6tWLRMfH2/+8pe/uPU5cOCAGTNmjGnSpInx9/c34eHhpmfPnuaVV1751ZxERUUZoNyf+++/3xhjTGFhofnb3/5mmjZtavz9/U2TJk3Mk08+aU6ePOm6zsaNG81vf/tbExkZaWrWrGnCwsJM//79zVdffeXq8/7775vevXubsLAwExAQYCIjI80DDzxgfv7557PGuHPnTgOYSZMmmX/+85+mSZMmpmbNmuaGG24w3377bbnn/Pzzz6ZGjRomLi7uV3PwS08++aQBTKdOncocmz9/vgFMvXr1TFFRkduxFStWGMCsWLHCrf3FF180TZs2NTVr1jTXXnut+fzzz03Xrl1N165d3fotWLDAXHXVVcbPz8/ts9C1a1fTsmXLMrHce++9Jioq6lffz0cffWRat25tatWqZaKjo01qaqp5/fXXDWB27tzp6hcVFWX69etX5vzyYt28ebPp2rWrqVWrlmnUqJH5+9//bmbMmFHmmuUp/TdT+lOrVi3TuHFj079/f/P666+7fa7K07JlyzLxlCr9N+fp55f/vkRERETEtyxjKvDpOyIiIiIi4pKTk0NERAR//etf+ctf/uLrcEREREREpBzaE11ERERExEfeeOMNiouLufvuu30dioiIiIiIeKA90UVEREREKthnn33G999/T0pKCoMGDSI6OtrXIYmIiIiIiAfazkVEREREpIJ169aNtWvX0rlzZ9555x0aNWrk65BERERERMQDFdFFRERERERERERERDzQnugiIiIiIiIiIiIiIh6oiC4iIiIiIiIiIiIi4oGK6CIiIiIiIiIiIiIiHqiILiIiIiIiIiIiIiLigYroIiIiIiIiIiIiIiIeqIguIiIiIiIiIiIiIuKBiugiIiIiIiIiIiIiIh6oiC4iIiIiIiIiIiIi4oGK6CIiIiIiIiIiIiIiHqiILiIiIiIiIiIiIiLigYroIiIiIiIiIiIiIiIeqIguIiIiIiIiIiIiIuKBiugiIiIiIiIiIiIiIh6oiC4iIiIiIiIiIiIi4oGK6CIiIiIiIiIiIiIiHqiILiIiIiIiIiIiIiLigYroIiIiIiIiIiIiIiIeqIguIiIiIiIiIiIiIuKBiugiIiIiIiIiIiIiIh6oiC4iIiIiIiIiIiIi4oGK6CIiIiIiIiIiIiIiHqiILiIiIiIiIiIiIiLigYroIiIiIiIiIiIiIiIeqIguIiIiIiIiIiIiIuKBiugiIiIiIiIiIiIiIh6oiC4iIiIiIiIiIiIi4oGK6CIiIiIiIiIiIiIiHqiILiIiIiIiIiIiIiLigYroIiIiIiIiIiIiIiIeqIguIiIiIiIiIiIiIuKBiugiIiIiIiIiIiIiIh6oiC4iIiIiIiIiIiIi4oGK6CIiIiIiIiIiIiIiHqiILiIiIiIiIiIiIiLigYroIiIiIiIiIiIiIiIeqIguIiIiIiIiIiIiIuKBiugiIiIiIiIiIiIiIh6oiC4iIiIiIiIiIiIi4oGK6CIiIiIiIiIiIiIiHqiILiIiIiIiIiIiIiLigYroIiIiIiIiIiIiIiIeqIguIiIiIiIiIiIiIuKBiugiIiIiIiIiIiIiIh6oiC4iIiIiIiIiIiIi4oGK6CIiIiIiIiIiIiIiHqiILiIiIiIiIiIiIiLigYroIiIiIiIiIiIiIiIeqIguIiIiIiIiIiIiIuKBiugiIiIiIiIiIiIiIh6oiC4iIiIiIiIiIiIi4oGK6CIiIiIiIiIiIiIiHqiILiIiIiIiIiIiIiLigYroIiIiIiIiIiIiIiIeqIguIiIiIiIiIiIiIuKBiugiIiIiIiIiIiIiIh6oiC4iIiIiIiIiIiIi4oGK6CIiIiIiIiIiIiIiHqiILiIiIiIiIiIiIiLigYroIiIiIiIiIiIiIiIeqIguInIOCgsLefrpp4mNjaVmzZpYlsWHH37o67BERERERC4rmpeLiIgvqIguIpVacXExr776Kl27dqV+/fr4+/sTFhZG69atGTlyJB999FGFxPHPf/6TZ555hoYNG/LEE0/w9NNPk5CQUCFjXyzR0dFYlkVWVpavQ7kg3bp1w7Is14+fnx8hISEkJCRw5513MnPmTI4dO+Z2zhtvvOF2zrn8lDqXvitXrryo7/GHH37g6aefZuDAgURGRrrGKSoqOut5hw8f5tFHHyU6OpqaNWvSsGFDRowYwU8//XRR4xMREZHLj+blF4/m5VVjXm6MYdmyZfz+97+nbdu2hISEUKtWLeLj43n00Uc5cOCAx3M1Lxepfvx8HYCIiCfFxcX079+fZcuWYbfb6devH40bN+bUqVN89913vPfee/z4448MGDDgkseyaNEi6taty6effkpAQMAlH09+3b333kt0dDTGGI4ePcqOHTv4z3/+w9y5c0lOTmbGjBn07dsXgLZt2/L000+7nZ+VlcWbb75JVFQU991336+O98vzzxQdHX0hb6WMjz/+mGeeeYYaNWoQGxtLrVq1OHny5FnPOXToEJ06dSIzM5MePXowdOhQfvzxR2bOnMnixYtZt24dzZo1u6hxioiIyOVB83I5m+o6Ly8oKOCWW24hICCAG2+8kV69elFcXMxnn33GlClTmD17NqtWrSI2NtbtPM3LRaopIyJSSb399tsGMG3atDEOh6PM8ePHj5vPPvusQmJp2rSpiYqKqpCxLpWoqCgDmJ07d/o6lAvStWtXA5gVK1aUOXbixAkzceJEY7PZTEBAgPnvf//r8TorVqwwgOnatetZxwNMRf/v8scffzRffPGFyc/PN8ac/rsrLCz0eM6oUaMMYP7whz+4tU+ZMsUA5uabb76kMYuIiEj1pXn5xaV5ubvKOi8/deqUmThxojl8+LBbe3FxsXnggQcMYPr371/mPM3LRaonbeciIpXW2rVrAbjvvvsIDg4uc7x27dp0797drW3ChAkeb+PLysrCsqwyqxvuu+8+LMtix44d/Pvf/6Z169YEBgbSrVs317GdO3eya9cu122CZ65weOONN7j99ttp1qwZgYGBBAUF0blzZ9555x2P7+3w4cP8+c9/5uqrr6Z27doEBwfTpk0bxo8fz/Hjx8v0ffLJJ2nRogWBgYEEBwfTs2dPPvnkk1/J4PlzOp28/PLLtG/fnrp161KnTh3at2/PSy+9hNPpLNN/1apV3HrrrTRu3JiaNWsSHh7O9ddfz9/+9je3fgcOHOCJJ54gPj6eOnXqYLfbiY+P57777mPHjh0XHHetWrX485//zFNPPcWpU6d45JFHLviavhAfH891111HYGDgOfU/duwYb7/9NnXq1GHChAlux8aOHUtUVBQff/zxRcmxiIiIXH40Lz/dV/Pyc1Md5uX+/v78+c9/JiQkxK3dZrPx17/+FaDM51vzcpHqS9u5iEildcUVVwCQmZlZIeM98sgjrFq1in79+tG3b19q1KhB+/btiY6O5oUXXgDg0UcfBcBut7vOe+ihh2jZsiU33ngjERERHDp0iCVLlnD33XezZcsW/v73v7uNs3PnTrp3786uXbto164dDz30EE6nk8zMTP71r3/x4IMPUqdOHQB27dpFt27dyMrK4oYbbqBPnz4cP36cRYsW0adPH6ZPn05SUtJFz8Xdd9/Ne++9R5MmTRg5ciSWZfHBBx8wevRoVq9ezbvvvuvqu2zZMvr160dQUBADBgygUaNGHD58mB9++IEXX3zRdbtlfn4+nTt3Zvv27dx0003ceuutGGPYtWsXCxYs4I477rhotzU+8cQTTJo0iW+++YbvvvuOli1bXpTrVlZffPEFJ06coHfv3tSrV8/tmM1m4+abb+aVV15hxYoVunVUREREvKZ5uebl56u6zsv9/f0B8PNzL6tpXi5SfamILiKV1m233UZqaiovv/wyR48eZfDgwbRr146oqKhLMt7GjRvZtGkTTZs2dWsfNGgQb7zxBkCZ1QQAGRkZNG/e3K3t1KlT3HLLLTz33HM8+OCDNGrUyHVs+PDh7Nq1i2effZYnn3zS7bycnBzq1q3ren3vvfeya9cuZs2axdChQ13tDoeDbt268fDDDzNgwACuvPLK833bZcyaNYv33nuPa665hs8//9wVz8SJE+natSvvvfce/fr1Y9iwYQC8+uqrOJ1OVq5cSZs2bcq8n1LLly9n+/btPProo/zrX/9y63fq1CkKCgou2nuoV68e7dq1Y/Xq1Xz55ZcXZbJe3t89lKyyGT9+vOt1VlaW6/Nyru67774L2r9xy5YtAMTFxZV7vHSfxor64isiIiLVi+blmpefr+o6L3/99dcB6NOnj1u75uUi1ZeK6CJSaV1zzTW88847PPLII7zzzjuu2zDr16/PjTfeyIgRI7j11lsv2nh//OMfy0zUz8UvJ+oAAQEBjBkzhs8++4zly5dzzz33APD111+zbt062rZty5/+9Kcy5zVo0MD152+//Zb//ve/3HHHHW4TdShZcfO3v/2NQYMGMW/ePEaPHu113J6UTgife+45ty8OderUITU1lV69evHaa6+5Juulytt65Mz3c7Z+AQEBF/3BUKVfkLKzsy/K9X55C2yp4ODgMpN1T3096dat2wUV0XNzc12xeIoRSr7kiYiIiHhL83LNyy9EdZuXb9iwgb/97W/Uq1ePiRMnuh3TvFyk+lIRXUQqtTvvvJPBgwezYsUKVq9ezaZNm1i9ejUffvghH374Iffccw9vvPEGlmVd8FgdOnQ4r/N2795Namoqy5cvZ/fu3Zw4ccLt+N69e11//uKLLwC4+eabsdnO/liKdevWASUTsfJWW5ROQn/44YfzituTjRs3YrPZ6NatW5ljXbt2pUaNGmzatMnVNnz4cObPn891113HkCFD6N69O507d6Zx48Zlzm3UqBHPPfccGzdupG/fvnTu3Jm2bdtSo0aNi/oeAIwxABfls3Hm9X5Nt27dzrmviIiISFWhebnm5eerOs3LMzMzufXWWyksLGT27Nnl/uJGRKonFdFFpNLz9/end+/e9O7dG4Di4mLmzZvHiBEjeOuttxg8eDCDBg264HHCw8O9PmfHjh106NCBI0eOcMMNN9C7d2+Cg4OpUaMGWVlZvPnmm263Q5auODjzNlJPDh06BMCnn37Kp59+6rHfsWPHvI77bHJzc6lfv365K1D8/Pxo0KABBw8edLXddtttLFq0iH/+85+8/vrrTJ8+HYB27drxj3/8g5tuugmAoKAgvvjiC55++mk++ugjPv74Y6BkVczo0aN56qmnXHsLXgz79u0DIDQ09KJds7IqXdFSuvLll0rbz9wzVERERMRbmpdrXn4+qsu8PDMzk+7du3P48GFmz57NgAEDyvTRvFyk+lIRXUSqnBo1anDnnXeSnp7OxIkT+eyzz1yT9dJVJEVFRWXO+7Vb5s5nZcTkyZM5dOgQM2fO5L777nM7NmvWLN588023ttLJ0pmrYDwpnYBNmTKFhx9+2OvYzldwcDCHDx+msLCwzOS5qKiInJwcgoKC3Nr79etHv379OH78OOvXr2fRokW89NJL9O/fn02bNnHVVVcB0LhxY2bMmIExhu+//57PPvuMadOm8cwzz+B0Oss87Ol8HT16lK+//hqA66677qJc81z5Yk/0+Ph4wPPeilu3bgU8780oIiIicj40L7+0NC+/MBdzXv7DDz/Qs2dPDh06xNy5cxk4cGC552teLlJ9qYguIlVW6dPOz7xFLyQkBIA9e/aU6f/VV19d9Bi2bdsGwO23317m2H//+98ybddffz0AH3/8Mc8+++xZbx0t7btq1aoKnaxfc801LF++nM8//5yePXu6Hfv8888pLi4mMTGx3HPr1KlDjx496NGjByEhIfz1r39l6dKlrsl6KcuyaNmyJS1btmTQoEFERkby4YcfXrTJ+qRJkzhx4gSJiYm0aNHiolzzXPliT/Trr7+ewMBA1qxZw9GjR13/NgCcTieffPIJAN27dz/vMUREREQ80bz80tC8/MJcrHl5eno6vXr1Ijc3l/nz59OvXz+P52teLlJ9nX3jLxERH5o1axaffvopTqezzLH9+/fz6quvAnDjjTe62kv3T5w5c6bbqpc9e/bwzDPPXPQYSydYK1eudGv/+OOPee2118r0b9euHZ06deKbb74hNTW1zPFDhw5x8uRJAK699lpuuOEG5s+f73qo0C+lp6e73cJ5MYwYMQKAJ598kvz8fFd7fn6+60E9999/v6v9888/L3eF0YEDBwCoXbs2AN99952r7Wz9LsTJkyd59tlnSUlJISAggClTplzwNb1VuveiNz/l7XPpjbp163L33Xdz/PjxMvt0Tp06laysLG6++WaaNWt2QeOIiIjI5Unzcs3LvVVd5uXffPMN3bt35+jRoyxYsOCsBXTQvFykOtNKdBGptNavX8+UKVMIDw+nS5cuNG3aFICdO3eyePFiTpw4wcCBA7njjjtc51x33XXceOONfP7553To0IEePXpw4MABFi5cyM0331zuSpgLMXr0aGbOnMlvfvMb7rjjDho2bEhGRgbLli3jzjvvZM6cOWXOeeedd+jWrRvJycnMmzfPNbnbunUrn3zyCT/++KPrS8B7771Hjx49uP/++/l//+//cd1112G32/npp5/YvHkzGRkZrFu3jrCwsHOO+YknnqBu3brlHnvmmWcYNmwYCxYsIC0tzbUixbIsPvzwQ3bu3MmQIUMYPny465yHH36YvXv30rlzZ6KjowkICODrr7/ms88+IyoqiqFDhwIle0iOGzeOjh07EhcXR1hYGD/99BMLFizAZrMxbtw4LzIPb7zxhutL0tGjR9mxYweff/45hw8fJiIigtdff50uXbp4dc2zKe8hUqUGDRpE27ZtL9pYOTk5PPHEE26voeRLUuntzePHjychIcHV59lnn2XlypVMnjyZb775hg4dOvDDDz+wYMECwsLCmDZt2kWLT0RERC4vmpdrXn421XVefuTIEXr27Mnhw4fp2bMn69atcz1k9kyPPvqo2x7nmpeLVFNGRKSS2r17t5k6daoZNGiQiYuLM/Xq1TP+/v4mPDzc3HLLLebtt982xcXFZc47cuSIGTlypAkNDTUBAQGmZcuWZvr06Wbnzp0GMPfee69b/3vvvdcAZufOnR5jiYqKMlFRUeUeW7Nmjenevbux2+2mbt26pnPnzuaDDz4wK1asMIB5+umny5yTk5Nj/vjHP5q4uDhTs2ZNExwcbNq0aWOSk5PN8ePH3frm5eWZlJQUk5iYaOrUqWNq1aploqOjTd++fc306dPNsWPHfi2VrvcAnPVn06ZNxhhjiouLzbRp00y7du1MYGCgCQwMNImJiWbq1Kllcj5nzhwzdOhQExMTY+rUqWPq1atnWrZsaZKTk83Bgwdd/b7//nvz2GOPmXbt2pkGDRqYgIAAExUVZW6//XazZs2ac3oPxhjTtWtXt5hr1KhhgoODTXx8vLnzzjvNzJkzzyknpX8/Xbt2PWu/X8sZYGbOnHnO8Z+L0s/q2X5WrFhR5rxDhw6Zhx9+2ERGRrr+rfzud78ze/bsuajxiYiIyOVF8/ISmpe7q+7z8nOZk3v6vGpeLlL9WMacsWmZiIiIiIiIiIiIiIi4aE90EREREREREREREREPVEQXEREREREREREREfFARXQREREREREREREREQ9URBcRERERERERERER8UBFdBERERERERERERERD1REFxERERERERERERHxQEV0EREREREREREREREP/HwdQGV05MgRioqKKnTM0NBQsrOzK3TMqkz58p5y5h3lyzvKl3eUL+8oX95Rvrzji3z5+fkREhJSoWNWVb6Yl4P+HXlL+fKO8uUd5cs7ypd3lC/vKF/eUb68V5nn5iqil6OoqIjCwsIKG8+yLNe4xpgKG7eqUr68p5x5R/nyjvLlHeXLO8qXd5Qv7yhflV9Fz8tBnwtvKV/eUb68o3x5R/nyjvLlHeXLO8qX9yp7zrSdi4iIiIiIiIiIiIiIByqii4iIiIiIiIiIiIh4oCK6iIiIiIiIiIiIiIgH2hNdRERERC47xlmM2foDx7d8i9PY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iIiIiIiIiEi1VM6lAThx4gS/+tWvOHHihL+70igoXvYpZvYoXvYoXvYoXvYoXvYoXvYoXlIdvS/sUbzsUbzsUbzsUbzsUbzsUbzsUbzsa+gxUxK9ATDG8M0336CHAi6M4mWfYmaP4mWP4mWP4mWP4mWP4mWP4iXV0fvCHsXLHsXLHsXLHsXLHsXLHsXLHsXLvoYeMyXRRURERERERERERERqoCS6iIiIiIiIiIiIiEgNlERvAAIDA7n77rsJDAz0d1caBcXLPsXMHsXLHsXLHsXLHsXLHsXLHsVLqqP3hT2Klz2Klz2Klz2Klz2Klz2Klz2Kl30NPWaWaaiFZkRERERERERERERE/Ewz0UVEREREREREREREaqAkuoiIiIiIiIiIiIhIDZREFxERERERERERERGpgZLoIiIiIiIiIiIiIiI1UBJdRERERERERERERKQGAf7uQFO1Zs0aVq5cicvlIiYmhvHjxxMfH19t2w8//JBnn33WZ1tgYCB/+ctfvK+NMWRkZLB27VqKi4tJTk5mwoQJREdH1+l91JfajteCBQv46KOPfNr06tWLX//617XfeT+wEy+A4uJiFi9ezD//+U+OHz9Ou3btuO+++0hNTb3oczYmtR2vjIwMli1b5nNMhw4deOaZZ+ryNuqNnXjNnDmTL7/8ssr2q666ikcffRTQ59fZLiRe+vzy9e677/L++++Tn59PaGgo1113HWPGjCEoKOiiz9mY1Ha8mvrnF9iLWXl5OW+//TYfffQRBQUFdOjQgbFjx5KSknLR55SGR+Ny+zQ2t0djc3s0NrdHY3N7NDa3R2NzezQ2t6fJjcuN1LoNGzaYH//4x+aDDz4wBw4cMM8//7y5//77jcvlqrb9unXrzLhx48zRo0d9/pxt+fLl5r777jP//Oc/zd69e016erqZPHmyKS0trYc7qlt1Ea/58+eb2bNn++w/duxYPdxN3bMbr7KyMjN9+nTz1FNPma+++socPnzYfPHFF+abb7656HM2JnURr6VLl5r/+q//8nl/FRYW1tMd1S278Tp27JhPHPbv329GjRpl1q1b522jz68zLiRe+vw645NPPjFjxowxn3zyiTl8+LD5/PPPzcSJE83LL7980edsTOoiXk3588sY+zF77bXXzMSJE81nn31mcnJyzHvvvWfGjBlj9uzZc9HnlIZF43L7NDa3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d5UFdvT5ZS9e+vzyjdfVV1/Nu+++S9euXb2PQC5dupSrr77aOwDV55e9eDXlzy+wH7OdO3dSUFBAbGwsBQUFvPHGGxhjGDZs2AWfUxo2jcvt09jcHo3N7dHY3B6Nze3R2Nwejc3t0djcnqY4LlcSvQ707duXoqIiMjIycLlcxMbGMmPGDO+/JOXn5/v8a9Tx48dZuHAhLpeLkJAQ4uLimDVrFp06dfK2GTZsGKWlpSxcuJCSkhKSk5OZMWNGlZVrG6PajpfD4WD//v189NFHFBcXExERQc+ePRk1ahSBgYH+uMVaZTdebdu25de//jWvvPIK06ZNIyIigjvuuMNnRePznbMxq4t4FRQUMG/ePI4dO0ZoaCjJycnMnj2b0NDQer672mc3XgAHDx7k66+/5rHHHqv2nPr8uvB46fPLN1533XUXlmWxZMkSCgoKCA0N5eqrr+bHP/7xBZ+zMauLeDXlzy+wH7OysjKWLFlCbm4uLVq04KqrrmLKlCmEhIRc8DmlYdO43D6Nze3R2Nwejc3t0djcHo3N7dHY3B6Nze1piuNyyxhj6uVKIiIiIiIiIiIiIiKNjGqii4iIiIiIiIiIiIjUQEl0EREREREREREREZEaKIkuIiIiIiIiIiIiIlIDJdFFRERERERERERERGqgJLqIiIiIiIiIiIiISA2URBcRERERERERERERqYGS6CIiIiIiIiIiIiIiNVASXURERERERERERESkBkqii4iIiIiIiIiIiIjUQEl0EREREREREREREZEaKIkuIiIiIiIiIiIiIlIDJdFFRERERERERERERGqgJLqIiIiIiIiIiIiISA2URBcRERERERERERERqYGS6CIiIiIiIiIiIiIiNVASXURERERERERERESkBkqii4iIiIiIiIiIiIjUQEl0EZELUFZWxhNPPEFCQgLNmzfHsizefvttf3dLREREROSyonG5iIj4g5LoItKgVVRU8MILL3DTTTcRERFBYGAgkZGR9OzZkwkTJvDOO+/USz9+//vf8+STT9KhQwd+8Ytf8MQTT5CcnFwv164tsbGxWJbF3r17/d2VS9K/f38sy/L+CQgIIDw8nOTkZO655x5eeukljh8/7nPMyy+/7HPMhfypdCFtP/zww1q9x7fffptRo0aRnJxMeHg4LVu2JCEhgR//+Mf861//qvG4goICHn74YWJjY2nevDkdOnRg/PjxfPvtt7XaPxEREbn8aFxeezQubzzj8u/Lz88nOjoay7K44YYbamz37bffMn78eDp06EDz5s2JjY3l4Ycf5ujRo3XaPxGpOwH+7oCISE0qKioYMmQIa9aswel0cuedd9KpUydOnTrFF198wV//+le+/vprhg4dWud9WbVqFa1ateJvf/sbQUFBdX49Ob/77ruP2NhYjDEcO3aMPXv28Pe//5033niDGTNmsGjRIgYPHgxASkoKTzzxhM/xe/fu5ZVXXiEmJob777//vNf7/vFni42NvZRbqWLFihVs3ryZ3r1706FDB4KCgti1axfLly9n6dKl/OlPf2LChAk+xxw5coS+ffuSnZ3NzTffzOjRo/n666956aWXePfdd/n000+Ji4ur1X6KiIjI5UHjcjmXpjwu/74HHnigyj8MfN/u3bvp27cvubm5DBs2jOTkZP75z38yb9481qxZw4YNG2jTpk2d9lNE6oAREWmgXnvtNQOYXr16GZfLVWV/cXGx+eCDD+qlL127djUxMTH1cq26EhMTYwDzzTff+Lsrl+Smm24ygFm3bl2VfSdOnDCzZs0yDofDBAUFmY8++qjG86xbt84A5qabbjrn9QBT339dnjhxotrt27ZtM82bNzdhYWGmtLTUZ9/EiRMNYP7rv/7LZ/u8efMMYG6//fY666+IiIg0bRqX1y6Ny3015HH52V555RUDmGeffdYApl+/ftW2GzhwoAHMH//4R5/tjzzyiAHMAw88UB/dFZFapnIuItJgbdy4EYD777+fsLCwKvuDg4MZMGCAz7aZM2fW+Bjf3r17sSyryuyG+++/H8uy2LNnD//3f/9Hz549admyJf379/fu++abb9i3b5/3McGzZzi8/PLL3HXXXcTFxdGyZUtCQ0Pp168fr7/+eo33VlBQwK9//WuuvPJKgoODCQsLo1evXkyfPp3i4uIqbR999FG6detGy5YtCQsL45ZbbuH9998/TwQvntvt5vnnn6d37960atWKkJAQevfuzXPPPYfb7a7S/pNPPuFHP/oRnTp1onnz5kRFRXH99dfzm9/8xqfd4cOH+cUvfkFSUhIhISE4nU6SkpK4//772bNnzyX3u0WLFvz617/mscce49SpU/zsZz+75HP6Q4sWLard3qNHD7p160ZhYSF5eXne7cePH+e1114jJCSEmTNn+hwzZcoUYmJieO+992olxiIiInL50bj8TFuNyy9MUxmXV9q/fz9Tp07lpz/9KXfccUeN7Xbv3s37779PbGwskydP9tn3m9/8hpCQEF577bUq7y0RafhUzkVEGqzKR9yys7Pr5Xo/+9nP+OSTT7jzzjsZPHgwzZo1o3fv3sTGxvLMM88A8PDDDwPgdDq9xz300EN0796dH/7wh0RHR3PkyBEyMzO599572bFjB//zP//jc51vvvmGAQMGsG/fPq6++moeeugh3G432dnZ/OEPf+DBBx8kJCQEgH379tG/f3/27t3LjTfeyKBBgyguLmbVqlUMGjSIhQsXkpaWVuuxuPfee/nrX/9K586dmTBhApZlsXz5ciZNmsT69ev5y1/+4m27Zs0a7rzzTkJDQxk6dCgdO3akoKCAr776imeffdb7uGVJSQn9+vVj9+7d3HbbbfzoRz/CGMO+fftYsWIFd999d62VG/nFL37BnDlz+Pzzz/niiy/o3r17rZzX37Kzs9mxYwdt27YlOjrau/0f//gHJ06cYODAgbRu3drnGIfDwe23386f/vQn1q1bp5IuIiIiYpvG5RqXX6ymMC43xnj/AWnu3LkUFBTU2HbdunUADBw4EIfDd95q69at6devH++//z7/+Mc/uOWWW+q03yJSu5REF5EGa+TIkaSnp/P8889z7NgxRowYwdVXX01MTEydXG/Lli1s3bqVrl27+mwfPnw4L7/8MkCVWb4AWVlZXHHFFT7bTp06xR133MHTTz/Ngw8+SMeOHb37xo4dy759+3jqqad49NFHfY7Lz8+nVatW3tf33Xcf+/btY/HixYwePdq73eVy0b9/f6ZOncrQoUNp3779xd52FYsXL+avf/0rV111FR9//LG3P7NmzeKmm27ir3/9K3feeSdjxowB4IUXXsDtdvPhhx/Sq1evKvdTae3atezevZuHH36YP/zhDz7tTp06RWlpaa3dQ+vWrbn66qtZv349//znP2tlsF7df3vwzLKZPn269/XevXu975cLdf/991dbv/Hvf/8769ev59SpU3zzzTesXLkSgBdffNFnUL5jxw4AEhMTqz1/QkICUH9ffEVERKRp0bhc4/KL1RTG5c888wwffvgh77//PqGhoedMol/IuPz9998nOztbSXSRRkZJdBFpsK666ipef/11fvazn/H66697H8OMiIjghz/8IePHj+dHP/pRrV3vl7/8ZZWB+oX4/kAdICgoiMmTJ/PBBx+wdu1axo0bB8Bnn33Gp59+SkpKCr/61a+qHNe2bVvv7//+97/56KOPuPvuu30G6uCZcfOb3/yG4cOH8+abbzJp0iTb/a7Jn//8ZwCefvppny8OISEhpKenc+utt/Liiy96B+uVWrZsec77OVe7oKCgWl8YqvIL0tllTy7F9x+BrRQWFlZlsF5T25r079+/xiR6enq693VUVBQvv/wyt99+u0+7wsJCb19q6iN4vuSJiIiI2KVxucbll6Ixj8u//PJLZsyYwYMPPsitt9563uM1LhdpupREF5EG7Z577mHEiBGsW7eO9evXs3XrVtavX8/bb7/N22+/zbhx43j55ZexLOuSr3Xttdde1HH79+8nPT2dtWvXsn//fk6cOOGz/7vvvvP+/o9//AOA22+/vcrjfd/36aefAp6BWHWzLSoHoV999dVF9bsmW7ZsweFw0L9//yr7brrpJpo1a8bWrVu928aOHctbb73Fddddx6hRoxgwYAD9+vWjU6dOVY7t2LEjTz/9NFu2bGHw4MH069ePlJQUmjVrVqv3AJ7HLoFaeW+cfb7z6d+//wW3PZ+nn36ap59+muLiYrKzs/nf//1f7rjjDv7nf/6HX//617VyDREREZELoXG5xuUXq7GOy8vKyrj33nuJjo7md7/73UWfR0SaBiXRRaTBCwwMZODAgQwcOBCAiooK3nzzTcaPH8+rr77KiBEjGD58+CVfJyoqyvYxe/bs4dprr+Xo0aPceOONDBw4kLCwMJo1a8bevXt55ZVXfB6HrJxxcPZjpDU5cuQIAH/729/429/+VmO748eP2+73uRQWFhIREVHtDJSAgADatm1Lbm6ud9vIkSNZtWoVv//97/nzn//MwoULAbj66qv57W9/y2233QZAaGgo//jHP3jiiSd45513eO+99wDPrJhJkybx2GOPERgYWGv3cfDgQQDatWtXa+f0l5CQEK666ir+8pe/UFBQwOOPP87AgQPp3bs3cGZGS+XMl++r3H52zVARERERuzQu17j8YjTWcflvf/tbtm7dyrp163yeBDgXjctFmi4l0UWk0WnWrBn33HMP27dvZ9asWXzwwQfewXrlLJLy8vIqx53vkbmLmRkxd+5cjhw5wksvvcT999/vs2/x4sW88sorPtsqB0tnz4KpSeUAbN68eUydOtV23y5WWFgYBQUFlJWVVRk8l5eXk5+fT2hoqM/2O++8kzvvvJPi4mI2bdrEqlWreO655xgyZAhbt27lBz/4AQCdOnVi0aJFGGP48ssv+eCDD1iwYAFPPvkkbre7ymJPF+vYsWN89tlnAFx33XW1cs4LVZs10aszaNAg1qxZw0cffeRNoiclJQE11zzfuXMnUHNtRhEREZGLoXF53dK4/NJc6rh8y5YtGGOqfRIAYMOGDViWRVhYmPc9rXG5SNOlJLqINFqtW7cGfB/nCw8PB+DAgQNV2v/rX/+q9T7s2rULgLvuuqvKvo8++qjKtuuvvx6A9957j6eeeuqcj45Wtv3kk0/qdbB+1VVXsXbtWj7++OMqi918/PHHVFRUkJqaWu2xISEh3Hzzzdx8882Eh4fz3//936xevdo7WK9kWRbdu3ene/fuDB8+nC5duvD222/X2mB9zpw5nDhxgtTUVLp161Yr57xQtVkTvTqVX/QCAs78FX799dfTsmVLNmzYwLFjx7z/bwC43W7ef/99AAYMGGCrXyIiIiIXQuPyuqFx+aW51HH5bbfdVm0t+ePHj7N06VLat2/PkCFDCA4O9u6rHG+///77uN1un/fVsWPH2LBhA8HBwd73lIg0Hucu/CUi4keLFy/mb3/7G263u8q+nJwcXnjhBQB++MMferdX1k986aWXfGa9HDhwgCeffLLW+1g5wPrwww99tr/33nu8+OKLVdpfffXV9O3bl88//9xnwchKR44c4eTJkwBcc8013Hjjjbz11lveRYW+b/v27T6PcNaG8ePHA/Doo49SUlLi3V5SUuJdqOenP/2pd/vHH39c7Qyjw4cPA3gHlV988YV327naXYqTJ0/y1FNPMXv2bIKCgpg3b94ln9OuytqLdv6cPbultLSUf//739Wee/PmzTz//PM0a9aMQYMGebe3atWKe++9l+Li4ip1OufPn8/evXu5/fbbiYuLq4tbFhERkSZO43KNy+1qCuPyyZMn8+KLL1b58/TTTwMQHx/Piy++yB//+EfvMVdccQUDBw5k7969LFiwwKc/TzzxBMXFxdx7772EhITUSwxEpPZoJrqINFibNm1i3rx5REVFccMNN9C1a1cAvvnmG959911OnDjBsGHDuPvuu73HXHfddfzwhz/k448/5tprr+Xmm2/m8OHDrFy5kttvv73amTCXYtKkSbz00kv8x3/8B3fffTcdOnQgKyuLNWvWcM8997B06dIqx7z++uv079+fGTNm8Oabb3oHdzt37uT999/n66+/9n4J+Otf/8rNN9/MT3/6U/74xz9y3XXX4XQ6+fbbb9m2bRtZWVl8+umnREZGXnCff/GLX9RY0+/JJ59kzJgxrFixgoyMDO+MFMuyePvtt/nmm28YNWoUY8eO9R4zdepUvvvuO/r160dsbCxBQUF89tlnfPDBB8TExDB69GjAU0Ny2rRp9OnTh8TERCIjI/n2229ZsWIFDoeDadOm2Yg8vPzyy94vSceOHWPPnj18/PHHFBQUEB0dzZ///GduuOEGW+c8l+oWkao0fPhwUlJSauU6J06cICUlhZ49e3LllVfSqVMnSkpK+Oqrr/jggw8Az4ye5ORkn+OeeuopPvzwQ+bOncvnn3/Otddey1dffcWKFSuIjIysMogXERERuVAal2tcfi5NdVx+sZ599ln69u3L1KlTWbt2Ld26dWPTpk2sW7eOxMREZs+e7df+ichFMiIiDdT+/fvN/PnzzfDhw01iYqJp3bq1CQwMNFFRUeaOO+4wr732mqmoqKhy3NGjR82ECRNMu3btTFBQkOnevbtZuHCh+eabbwxg7rvvPp/29913nwHMN998U2NfYmJiTExMTLX7NmzYYAYMGGCcTqdp1aqV6devn1m+fLlZt26dAcwTTzxR5Zj8/Hzzy1/+0iQmJprmzZubsLAw06tXLzNjxgxTXFzs07aoqMjMnj3bpKammpCQENOiRQsTGxtrBg8ebBYuXGiOHz9+vlB67wE455+tW7caY4ypqKgwCxYsMFdffbVp2bKladmypUlNTTXz58+vEvOlS5ea0aNHm/j4eBMSEmJat25tunfvbmbMmGFyc3O97b788kvzyCOPmKuvvtq0bdvWBAUFmZiYGHPXXXeZDRs2XNA9GGPMTTfd5NPnZs2ambCwMJOUlGTuuece89JLL11QTCr/+9x0003nbHe+mAHmpZdeuuD+n8+pU6fM//zP/5hbb73VdOzY0TRv3ty0aNHCXHHFFebee+81//jHP2o89siRI2bq1KmmS5cu3v9XfvKTn5gDBw7UWv9ERETk8qNxuYfG5b6a+ri8JpXv3379+tXYZv/+/eb+++83UVFR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Xl/2NPd4bd68mfXr1+N2u4mJiWH69OnEx9de63/nzp2sWrWK3NxcoqKimDp1KikpKb79xhhWr17Nli1bKC4uJikpiRkzZhAdHQ14yzG+9tprZGZm4na7iYiI4Oabb2bixIm+0orHjx9nzpw51a79+OOPk5iYWM8REBERkabMeCowa1/GbH7NuyFpII6Zc7E6hV38QJEmxNbCok6nk7i4ODIzM33bPB4PmZmZtQ6GExMTycjI8NuWnp5OQoL3N02RkZG4XC6/NiUlJezbt++iA+zKDzqVNc0TExP5/PPP/WaQp6en07179xpLuYiIiEjLZE4cx5M2z5tAtxxYd96L4/5fYbXrEOiuidS7HTt28NJLL3HXXXeRlpZGTEwMCxcurDaJpdKePXtYsmQJt956K2lpaQwePJhFixZx+PBhX5t169axadMmUlNTeeKJJ2jbti0LFy7k7NmzAGRnZ2OMYebMmSxevJh7772Xf/zjH/ztb3+rdr3f/OY3PPfcc74/cXFxDRMIERERaZLMySI8Ty3wJdCt2ybg+NnvlECXZsd2OZcxY8bw9NNPExcXR3x8PBs3bqS0tJThw4cDsHTpUiIiIpgyZQoAo0ePZsGCBaxfv56UlBS2b9/O/v37mTlzJuB9jHb06NGsWbOG6OhoIiMjWblyJeHh4QwePBiAvXv3sn//fpKSkggJCeHYsWOsWrWKbt26+RLtN910E6+88grPPvss48aN48iRI2zatIl77723PuIkIiIizYD57CM8z/8XnDoJHTvhmPlLrH6DAt0tkQazYcMGRo4cyYgR3jr/qamp7N69m61btzJ+/Phq7Tdu3EhycjJjx44FYPLkyWRkZLB582ZmzpyJMYaNGzcyceJE31h8zpw5pKamsmvXLoYNG0ZycjLJycm+c3br1o3s7Gzeeustpk2b5ne9Tp061fpU6PnKysp8k2PA+xmhffv2vu8bkxactUfxskfxskfxskfxskfxsudy4mUO7fPWPz9xHILb4rjvpziuv7mhutik6PVlX1OPme0k+tChQykqKmL16tW43W5iY2OZP3++b3Ccl5fnd7N9+/blwQcfZOXKlaxYsYLo6Gjmzp1L7969fW3GjRtHaWkpy5Yto6SkhKSkJObPn09wcDAAbdu25f3332f16tWUlpbicrlITk7moYce8pVj6dChA4888gjLly9n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L3sUL3sUL3sUL/uaesyURBcRERERERERERERqYWS6CIiIiIiIiIiIiIitVASvQkICgrirrvuIigoKNBdaRYUL/sUM3sUL3sUL3sUL3sUL3sUL3sUL6mJXhf2KF72KF72KF72KF72KF72KF72KF72NfWYWaapFpoREREREREREREREQkwzUQXEREREREREREREamFkugiIiIiIiIiIiIiIrVQEl1EREREREREREREpBZKoouIiIiIiIiIiIiI1MIZ6A60VJs3b2b9+vW43W5iYmKYPn068fHxNbZ95513+MMf/uC3LSgoiL/+9a++n40xrF69mi1btlBcXExSUhIzZswgOjq6Qe+jsdR3vJ5++mneffddvzaDBg3i17/+df13PgDsxAuguLiYFStW8O9//5tTp07RtWtX7r33XlJSUi77nM1Jfcdr9erVvPrqq37HdO/enaeeeqohb6PR2InXggUL+Oyzz6ptv+aaa3j44YcBvX+dry7x0vuXvzfeeIO33nqLvLw8QkNDueGGG5gyZQrBwcGXfc7mpL7j1dLfv8BezMrLy/n73//Ou+++S35+Pt27d2fq1KkkJydf9jml6dG43D6Nze3R2Nwejc3t0djcHo3N7dHY3B6Nze1pceNyI/Vu+/bt5vvf/755++23zZEjR8yzzz5r7rvvPuN2u2tsv3XrVjNt2jRTUFDg9+d8a9euNffee6/597//bQ4ePGjS0tLM7NmzTWlpaSPcUcNqiHgtXbrULFy40G//yZMnG+FuGp7deJWVlZl58+aZJ554wnz++efm2LFj5tNPPzVffvnlZZ+zOWmIeK1atcr8/Oc/93t9FRYWNtIdNSy78Tp58qRfHA4fPmwmTZpktm7d6muj968qdYmX3r+qvPfee2bKlCnmvffeM8eOHTMff/yxmTlzpnnxxRcv+5zNSUPEqyW/fxljP2Z/+ctfzMyZM82HH35ocnJyzJtvvmmmTJliDhw4cNnnlKZF43L7NDa3R2NzezQ2t0djc3s0NrdHY3N7NDa3pyWOy1XOpQFs2LCBkSNHMmLECHr27ElqairBwcFs3bq11mMsy8Llcvn9qWSMYePGjUycOJHBgwcTExPDnDlzKCgoYNeuXY1wRw2rvuNVyel0+u3v2LFjA95F47Ebr7fffptTp04xd+5ckpKSiIyM5KqrriI2Nvayz9mcNES8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w+12ExISQlxcHI8//jg9e/b0tRk3bhylpaUsW7aMkpISkpKSmD9/frWVa5uj+o6Xw+Hg8OHDvPvuuxQXFxMREcHAgQOZNGkSQUFBgbjFemU3Xl26dOHXv/41f/7zn5k7dy4RERHcfvvtfisaX+qczVlDxCs/P58lS5Zw8uRJQkNDSUpKYuHChYSGhjby3dU/u/ECyM7O5osvvuCRRx6p8Zx6/6p7vPT+5R+vO++8E8uyWLlyJfn5+YSGhnLttdfy/e9/v87nbM4aIl4t+f0L7MesrKyMlStXcvz4cdq1a8c111zDnDlzCAkJqfM5pWnTuNw+jc3t0djcHo3N7dHY3B6Nze3R2Nwejc3taYnjcssYYxrlSiIiIiIiIiIiIiIizYxqoouIiIiIiIiIiIiI1EJJdBERERERERERERGRWiiJLiIiIiIiIiIiIiJSCyXRRURERERERERERERqoSS6iIiIiIiIiIiIiEgtlEQXEREREREREREREamFkugiIiIiIiIiIiIiIrVQEl1EREREREREREREpBZKoouIiIiIiIiIiIiI1EJJdBERERERERERERGRWiiJLiIiIiIiIiIiIiJSCyXRRURERERERERERERqoSS6iIiIiIiIiIiIiEgtlEQXEREREREREREREamFkugiIiIiIiIiIiIiIrVQEl1EREREREREREREpBZKoouIiIiIiIiIiIiI1EJJdBGROigrK+PRRx8lISGBtm3bYlkWf//73wPdLRERERGRVkXjchERCQQl0UWkSauoqOD555/nlltuISIigqCgICIjIxk4cCAzZszg9ddfb5R+/Pd//zePPfYY3bt35xe/+AWPPvooSUlJjXLt+hIbG4tlWRw8eDDQXbkiw4cPx7Is3x+n00l4eDhJSUncfffdvPDCC5w6dcrvmBdffNHvmLr8qVSXtu+880693uOCBQsuer3NmzfXeFx+fj4/+9nPiI2NpW3btnTv3p3p06fz1Vdf1Wv/REREpPXRuLz+aFzefMbllXJycnjooYfo27cv7du3Jzw8nJSUFObNm1dje43LRVoeZ6A7ICJSm4qKCsaMGcPmzZtxuVzccccd9OzZk7Nnz/Lpp5/yt7/9jS+++IKxY8c2eF82bNhAx44d+cc//kFwcHCDX08u7d577yU2NhZjDCdPnuTAgQP83//9H6+88grz589n+fLljB49GoDk5GQeffRRv+MPHjzIn//8Z2JiYrjvvvsueb0Ljz9fbGzsldxKrSrv8ULx8fHVtp04cYKhQ4eSlZXFrbfeyuTJk/niiy944YUXeOONN9i5cydxcXEN0k8RERFp2TQul4tp6ePy7du3M2bMGEpKShg9ejQTJkzg9OnT7Nu3j5UrV/Lkk0/6tde4XKSFMiIiTdRf/vIXA5hBgwYZt9tdbX9xcbF5++23G6Uvffr0MTExMY1yrYYSExNjAPPll18GuitX5JZbbjGA2bp1a7V9p0+fNo8//rhxOBwmODjYvPvuu7WeZ+vWrQYwt9xyy0WvB5jG/u/y0UcfrfUeazNz5kwDmJ///Od+25csWWIA853vfKeeeykiIiKthcbl9Uvjcn9NeVx+9OhR07lzZxMTE2P27NlTbf/Zs2erbdO4XKRlUjkXEWmyduzYAcB9991HWFhYtf0dOnRgxIgRftsqy2DU9BjfwYMHsSyr2uyG++67D8uyOHDgAP/7v//LwIEDad++PcOHD/ft+/LLLzl06JDvMcHzZzi8+OKL3HnnncTFxdG+fXtCQ0MZNmwYL7/8cq33lp+fz69//WuuvvpqOnToQFhYGIMGDWLevHkUFxdXa/vwww/Tr18/2rdvT1hYGCNHjuStt966RAQvn8fj4dlnn2Xw4MF07NiRkJAQBg8ezDPPPIPH46nW/r333uO73/0uPXv2pG3btkRFRXHjjTfyu9/9zq/dsWPH+MUvfkHfvn0JCQnB5XLRt29f7rvvPg4cOHDF/W7Xrh2//vWveeSRRzh79iw//elPr/iczcGpU6f4y1/+QkhICAsWLPDbN2fOHGJiYnjzzTfrJcYiIiLS+mhcXtVW4/K6aSnj8ieeeIITJ07w7LPPkpiYWG1/UFCQ388al4u0XCrnIiJNVufOnQHIyspqlOv99Kc/5b333uOOO+5g9OjRtGnThsGDBxMbG8tTTz0FwM9+9jMAXC6X77gHHniA/v37881vfpPo6GhOnDjBxo0bueeee9izZw//3//3//ld58svv2TEiBEcOnSIa6+9lgceeACPx0NWVhb/8z//w/33309ISAgAhw4dYvjw4Rw8eJCbb76ZUaNGUVxczIYNGxg1ahTLli0jNTW13mNxzz338Le//Y1evXoxY8YMLMti7dq1zJo1i23btvHXv/7V13bz5s3ccccdhIaGMnbsWHr06EF+fj6ff/45f/jDH3yPW5aUlDBs2DD279/Pt7/9bb773e9ijOHQoUOsW7eOu+66q94ea/zFL37BokWL+Pjjj/n000/p379/vZy3sW3bto0PPviAiooKYmNjGTlyJF26dKnW7l//+henT5/mtttuo1OnTn77HA4H3/nOd3juuefYunWrHh0VERER2zQu17j8cjX3cfmKFSsIDw/nO9/5Dp999hlbtmyhpKSEb3zjG4waNYqOHTv6tde4XKTlUhJdRJqsiRMnkpaWxrPPPsvJkyeZMGEC1157LTExMQ1yvd27d/PRRx/Rp08fv+3jx4/nxRdfBKg2mwAgMzOTb3zjG37bzp49y+23386TTz7J/fffT48ePXz7pk6dyqFDh3jiiSd4+OGH/Y7Ly8vzG4jde++9HDp0iBUrVjB58mTfdrfbzfDhw3nwwQcZO3Ys3bp1u9zbrmbFihX87W9/45prruGf//ynrz+PP/44t9xyC3/729+44447mDJlCgDPP/88Ho+Hd955h0GDBlW7n0pbtmxh//79/OxnP+N//ud//NqdPXuW0tLSeruHTp06ce2117Jt2zb+/e9/18tgvaa/e/DOsjl/QaGDBw/6Xi91dd9999VYv/E3v/mN389t27Zl7ty5PPbYY36LLO3ZswegxtkxAAkJCUDjffAVERGRlkXjco3LL1dzHpd/+eWX5OXlMXjwYB566CGWLFni17Zz58689NJLvnrvoHG5SEumJLqINFnXXHMNL7/8Mj/96U95+eWXfY9hRkRE8M1vfpPp06fz3e9+t96u98tf/rLaQL0uLhyoAwQHBzN79mzefvtttmzZwrRp0wD48MMP2blzJ8nJyfzqV7+qdtz5s4w/+eQT3n33Xe666y6/gTp4Z9z87ne/Y/z48bz22mvMmjXLdr9r86c//QmAJ5980u+DQ0hICGlpaXzrW9/ij3/8o2+wXql9+/YXvZ+LtQsODq73haEqPyDl5ubWy/kufAS2UlhYWLXBem1tazN8+HC/JPqgQYP405/+xPDhw4mOjub48eO89dZbPPLIIzz++ONUVFTwxBNP+NoXFhb6+lJbH8H7IU9ERETELo3LNS6/Es11XH78+HHA+0udzMxMli5dyt133015eTkvv/wy8+fP584772T37t3069cP0LhcpCVTEl1EmrS7776bCRMmsHXrVrZt28ZHH33Etm3b+Pvf/87f//53pk2bxosvvug3K/dyXX/99Zd13OHDh0lLS2PLli0cPnyY06dP++3/+uuvfd//61//AuA73/kODsfFl6XYuXMn4B2I1TTbonIQ+vnnn19Wv2uze/duHA4Hw4cPr7bvlltuoU2bNnz00Ue+bVOnTmXNmjXccMMNTJo0iREjRjBs2DB69uxZ7dgePXrw5JNPsnv3bkaPHs2wYcNITk6mTZs29XoPAMYYgHp5bZx/vksZPnx4ndvWZsKECX4/9+7dmxkzZpCSksKNN97If/3Xf/Hzn/+8xg9DIiIiIg1B43KNyy9Xcx2XV9acr6io4Le//S2zZ8/27Zs7dy45OTksXryYp556imXLll32dUSkeVASXUSavKCgIG677TZuu+02wDuIee2115g+fTovvfQSEyZMYPz48Vd8naioKNvHHDhwgOuvv56CggJuvvlmbrvtNsLCwmjTpg0HDx7kz3/+s9/jkJUzDs5/jLQ2J06cAOAf//gH//jHP2ptd+rUKdv9vpjCwkIiIiJqnIHidDrp0qWLb1YGeB/v3bBhA//93//Nn/70J98A8tprr+X3v/893/72twEIDQ3lX//6F48++iivv/46b775JuCdFTNr1iweeeSRagvzXIns7GwAunbtWm/nDLSUlBSuv/56tm/fzs6dO30zvipntFTOfLlQ5fbza4aKiIiI2KVxucbll6O5jsvPHztfOMmlctvixYv597//7dumcblIy6Ukuog0O23atOHuu+8mIyODxx9/nLfffts3WK+cRVJeXl7tuEs9Mnc5MyMWL17MiRMneOGFF7jvvvv89q1YsYI///nPftsqB0vnz4KpTeUAbMmSJTz44IO2+3a5wsLCyM/Pp6ysrNrguby8nLy8PEJDQ/2233HHHdxxxx0UFxfz/vvvs2HDBp555hnGjBnDRx99xFVXXQVAz549Wb58OcYYPvvsM95++22efvppHnvsMTweT7XFni7XyZMn+fDDDwG44YYb6uWcdVWfNdFrUvnho7i42Letb9++QO21Fffu3QvUXptRRERE5HJoXN6wNC6/Mlc6Lv/GN76B0+mkvLy8xqR3eHg4gN8TDxqXi7RcSqKLSLNVudr5+Y/oVQ5kjhw5Uq39Bx98UO992LdvHwB33nlntX3vvvtutW033ngjAG+++SZPPPHERR8drWz73nvvNepg/ZprrmHLli3885//ZOTIkX77/vnPf1JRUUFKSkqNx4aEhHDrrbdy6623Eh4ezm9/+1s2bdrkG6xXsiyL/v37079/f8aPH0/v3r35+9//Xm+D9UWLFnH69GlSUlJ89QkbS33URK9NWVkZu3fvBiAuLs63/cYbb6R9+/Zs376dkydP+v5tgPcx1LfeeguAESNG2OqXiIiISF1oXN4wNC6/Mlc6Lg8ODubmm29m69atZGZmVls0NjMzE8Cvfr/G5SIt18ULf4mIBNCKFSv4xz/+4atFd76cnByef/55AL75zW/6tlfWT3zhhRf8Zr0cOXKExx57rN77WDnAeuedd/y2v/nmm/zxj3+s1v7aa69l6NChfPzxx6SlpVXbf+LECc6cOQPAddddx80338yaNWt8iwpdKCMjw+8Rzvowffp0AB5++GFKSkp820tKSnwL9fzoRz/ybf/nP/9Z4wyjY8eOAdChQwcAPv30U9+2i7W7EmfOnOGJJ55g4cKFBAcHs2TJkis+p12VtRft/Dm/zuXJkyfZs2dPtfOePXuWn/3sZxw+fJikpCSuu+46376OHTtyzz33UFxcXK1O59KlSzl48CDf+c53/BLvIiIiInWlcbnG5Xa1hHE5wE9+8hMAfvvb3/o9Cep2u32/aPj+97/v265xuUjLpZnoItJkvf/++yxZsoSoqChuuukm32/4v/zyS9544w1Onz7NuHHjuOuuu3zH3HDDDXzzm9/kn//8J9dffz233norx44dY/369XznO9+pcSbMlZg1axYvvPAC3/ve97jrrrvo3r07mZmZbN68mbvvvptVq1ZVO+bll19m+PDhzJ8/n9dee803uNu7dy9vvfUWX3zxhe9DwN/+9jduvfVWfvSjH/H//t//44YbbsDlcvHVV1+Rnp5OZmYmO3fuJDIyss59/sUvfkHHjh1r3PfYY48xZcoU1q1bx+rVq30zUizL4u9//ztffvklkyZNYurUqb5jHnzwQb7++muGDRtGbGwswcHBfPjhh7z99tvExMQwefJkwFtDcu7cuQwZMoTExEQiIyP56quvWLduHQ6Hg7lz59qIPLz44ou+D0knT57kwIED/POf/yQ/P5/o6Gj+9Kc/cdNNN9k658XUtIhUpfHjx5OcnFwv1zlx4gT9+vXjuuuuo1+/fkRHR5Obm8vWrVv58ssv6dKlCytWrKg2W+qJJ57gnXfeYfHixXz88cdcf/31fP7556xbt47IyEiefvrpeumfiIiItD4al2tcfjEtdVwO3rrnP/zhD3nhhRcYMGAAt99+OxUVFWzYsIGvv/6aO++8kx/84Ad+x2hcLtJCGRGRJurw4cNm6dKlZvz48SYxMdF06tTJBAUFmaioKHP77bebv/zlL6aioqLacQUFBWbGjBmma9euJjg42PTv398sW7bMfPnllwYw9957r1/7e++91wDmyy+/rLUvMTExJiYmpsZ927dvNyNGjDAul8t07NjRDBs2zKxdu9Zs3brVAObRRx+tdkxeXp755S9/aRITE03btm1NWFiYGTRokJk/f74pLi72a1tUVGQWLlxoUlJSTEhIiGnXrp2JjY01o0ePNsuWLTOnTp26VCh99wBc9M9HH31kjDGmoqLCPP300+baa6817du3N+3btzcpKSlm6dKl1WK+atUqM3nyZBMfH29CQkJMp06dTP/+/c38+fPN8ePHfe0+++wz89BDD5lrr73WdOnSxQQHB5uYmBhz5513mu3bt9fpHowx5pZbbvHrc5s2bUxYWJjp27evufvuu80LL7xQp5hU/v3ccsstF213qZgB5oUXXqhz/y+lsLDQ/OQnPzE33HCD6datmwkKCjIhISFm4MCB5le/+pU5duxYrceeOHHCPPjgg6Z3796+fys//OEPzZEjR+qtfyIiItL6aFzupXG5v5Y+Lq/k8XjM888/b6677jrToUMH0759e3PttdfW+HdQSeNykZbHMua8omUiIiIiIiIiIiIiIuKjmugiIiIiIiIiIiIiIrVQEl1EREREREREREREpBZKoouIiIiIiIiIiIiI1EJJdBERERERERERERGRWiiJLiIiIiIiIiIiIiJSCyXRRURERERERERERERqoSS6iIiIiIiIiIiIiEgtlEQXEREREREREREREamFM9AdaIoKCgooLy9v1Gt27dqV3NzcRr1mc6Z42aeY2aN42aN42aN42aN42aN42ROIeDmdTsLDwxv1ms1VIMbloH9Hdile9ihe9ihe9ihe9ihe9ihe9ihe9jXlsbmS6DUoLy+nrKys0a5nWZbvusaYRrtuc6V42aeY2aN42aN42aN42aN42aN42aN4NX2NPS4HvS7sUrzsUbzsUbzsUbzsUbzsUbzs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66abblJGRkaT+77yyiv6r//6r4htcXFxevLJJ8PfW2u1atUqvfTSSyovL9eYMWM0b948paent+v76ChtHa+HHnpIr776asQ+48eP189//vO2H3wUuMRLksrLy/XUU0/p7bff1pEjRzRw4EB973vfU05OTqvP2Zm0dbxWrVqlZ555JuKYwYMH64EHHmjPt9FhXOJ1991366OPPmq0fcKECfrZz34mic+vhloSLz6/Ir344ov629/+pqKiIiUmJuqCCy7QnDlzFB8f3+pzdiZtHa+u/vklucWsurpa//f//l+9+uqrKi4u1uDBgzV37lxlZ2e3+pyIPeTl7sjN3ZCbuyE3d0Nu7obc3A25uRtyczddLi+3aHNvvPGGveGGG+zLL79s9+7dax955BH7j//4jzYQCDS5/8aNG+2NN95oS0pKIv5r6LnnnrPf+9737Ntvv2337Nljly5dam+99VZbWVnZAe+ofbVHvJYtW2aXLFkS8frhw4c74N20P9d4VVVV2UWLFtlf/epXdseOHfbAgQP2ww8/tJ999lmrz9mZtEe8Vq5caX/84x9H3F+lpaUd9I7al2u8Dh8+HBGHL774wl5//fV248aN4X34/KrXknjx+VXvtddes3PmzLGvvfaaPXDggH3//fftggUL7OOPP97qc3Ym7RGvrvz5Za17zP70pz/ZBQsW2HfffdcWFBTYv/71r3bOnDn2008/bfU5EVvIy92Rm7shN3dDbu6G3NwNubkbcnM35OZuumJeTjuXdrB27VpNmzZNl1xyiYYMGaL58+crPj5eGzdubPYYY4z8fn/Ef3WstVq3bp1mzZqliRMnavjw4brttttUUlKiLVu2dMA7al9tHa86Pp8v4vW+ffu247voOK7xevnll3XkyBHdcccdGjNmjFJTU3XWWWdpxIgRrT5nZ9Ie8ZIkz/Mi7q/ExMQOeDftzzVeffv2jYjDtm3b1LNnT02aNEkSn18nOlW86vD5FbJz506NHj1aF154oVJTUzV+/HhNnTpVu3fvbvU5O5P2iJfUdT+/JPeYvfbaa7r66quVk5OjQYMG6bLLLtOECRO0Zs2aVp8TsYW83B25uRtyczfk5m7Izd2Qm7shN3dDbu6mK+bltHNpY9XV1fr000911VVXhbd5nqexY8cqLy+v2eOOHTumhQsXylqrkSNH6oYbbtDQoUMlSQcP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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "grid_use=heatmap_data.copy().iloc[:, 1:]\n", - "sub_titles = [f\"Surface Loss DTE={dte}\" for dte in grid_use.columns]\n", - "plot_subplot(\n", - " grid=grid_use, \n", - " x='index', \n", - " label='Surface Loss', \n", - " sup_tile='Surface Loss by Width and DTE',\n", - " subplot_title_format=sub_titles\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABdIAAAO6CAYAAACbgaWqAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzs3Xd4VNXWx/HvnjRCTSgxoSWBJBBCDYJUSQClShO9CFdUBK6ior7XglhAr6DIRUWxYUFsFAsgVbkQpCPSQwsl9BogVAWS2e8fYwZjQgQMDAy/z/PwQM7Z58w6sxPds7LOOsZaaxERERERERERERERkVw5PB2AiIiIiIiIiIiIiMjVTIl0EREREREREREREZE8KJEuIiIiIiIiIiIiIpIHJdJFRERERERERERERPKgRLqIiIiIiIiIiIiISB6USBcRERERERERERERyYMS6SIiIiIiIiIiIiIieVAiXUREREREREREREQkD0qki4iIiIiIiIiIiIjkQYl0EREREWHGjBnUrFmTAgUKYIwhPT3d0yFdc7Zt24Yxhv/+97+eDiVPc+bMwRjDnDlz/nJsQkICCQkJF3TehIQEqlat+veCuwI+/fRTjDFs27bN06GIiIiIyDVEiXQRERGRq9CaNWvo3Lkz4eHhFChQgDJlynDLLbfw9ttv5/trHTp0iDvvvJPAwEDeeecdPv/8cwoVKpTvr/N3RERE0LZtW0+H4XHjx4/HGMOECRNy7KtRowbGGJKSknLsK1++PA0aNPjbr79nzx4GDhzIypUr//a5rnYDBw7EGOP+U7BgQcqXL89tt93GqFGjOH36tHts1i8nLuQPnEvmn+/P4sWLPXXZIiIiInIevp4OQERERESyW7hwIYmJiZQvX55evXoRGhrKzp07Wbx4McOHD+eRRx7J19dbunQpx48f5z//+Q/NmzfP13NL/mrUqBEA8+fPp2PHju7tx44dIzk5GV9fXxYsWEBiYqJ7386dO9m5cyddunQB4Oabb+bXX3/F39//ol9/z549vPjii0RERFCzZs2/dzHXiPfee4/ChQtz+vRpdu/ezQ8//ECPHj148803mTJlCuXKlSM2NpbPP/8823HPPPMMhQsX5tlnnz3vuV966SUiIyNzbI+Kisr36xARERGRv0eJdBEREZGrzKBBgyhWrBhLly4lKCgo274DBw7k2+ucPHmSQoUKuc/559eSq0/p0qWJjIxk/vz52bYvWrQIay133HFHjn1ZX2cl4R0OBwUKFLgyAXuBzp07U7JkSffXL7zwAl9++SXdu3fnjjvuYPHixdxwww3885//zHbcq6++SsmSJXNs/6NWrVpx4403XrbYRURERCT/qLWLiIiIyFVmy5YtxMXF5ZrYDgkJcf87qyf3p59+mmOcMYaBAwe6v85qU7Fu3Tq6du1KcHAwjRo1IiEhgXvuuQeAOnXqYIzh3nvvBWDevHnccccdlC9fnoCAAMqVK8fjjz/Or7/+muP1NmzYwJ133kmpUqUIDAykUqVKOSpxd+/eTY8ePbjhhhsICAggLi6OTz755OLfoPPIyMjgP//5DxUrViQgIICIiAj69++frQUHwC+//EKLFi0oWbIkgYGBREZG0qNHj2xjxo4dS+3atSlSpAhFixalWrVqDB8+/IJjeeONNwgPDycwMJAmTZqQnJzs3jdq1CiMMaxYsSLHcYMHD8bHx4fdu3ef99yNGjVixYoV2eZhwYIFxMXF0apVKxYvXozT6cy2zxhDw4YNgfP3SB85ciQVK1YkMDCQunXrMm/evGz758yZQ506dQC477773G1I/vz9t27dOhITEylYsCBlypThtddey/vN+sP70rRpU0JCQggICKBKlSq89957OcZltfmZP38+devWpUCBAlSoUIHPPvssx9i1a9fStGlTAgMDKVu2LC+//HK29+ZSdevWjZ49e7JkyRJmzpz5t88nIiIiIlc/VaSLiIiIXGXCw8NZtGgRycnJ+f7wxjvuuIPo6GgGDx6MtZbo6GgqVarEyJEj3W0mKlasCMDXX3/NqVOnePDBBylRogQ///wzb7/9Nrt27eLrr792n3P16tU0btwYPz8/evfuTUREBFu2bGHy5MkMGjQIgP3791OvXj2MMTz88MOUKlWK6dOnc//993Ps2DEee+yxv31tPXv2ZPTo0XTu3Jl///vfLFmyhFdeeYX169e7e4ofOHCAW2+9lVKlStGvXz+CgoLYtm0b3333nfs8M2fO5K677qJZs2YMGTIEgPXr17NgwQIeffTRv4zjs88+4/jx4zz00EP89ttvDB8+nKZNm7JmzRpuuOEGOnfuzEMPPcSXX35JrVq1sh375ZdfkpCQQJkyZc57/kaNGvH555+zZMkS94NAFyxYQIMGDWjQoAFHjx4lOTmZ6tWru/dVrlyZEiVKnPecH3/8Mf/6179o0KABjz32GFu3bqVdu3YUL16ccuXKARAbG8tLL73ECy+8QO/evWncuDFAtt7rR44coWXLlnTq1Ik777yTb775hqeffppq1arRqlWrPN+39957j7i4ONq1a4evry+TJ0+mT58+OJ1OHnrooWxjN2/eTOfOnbn//vu55557+OSTT7j33nupXbs2cXFxAOzbt4/ExEQyMjLo168fhQoVYuTIkQQGBuYZx4W6++67GTlyJD/++CO33HLLJZ3j6NGjpKWlZdtmjMlzrkRERETEQ6yIiIiIXFV+/PFH6+PjY318fGz9+vXtU089ZX/44Qd75syZbONSU1MtYEeNGpXjHIAdMGCA++sBAwZYwN511105xo4aNcoCdunSpdm2nzp1KsfYV155xRpj7Pbt293bbr75ZlukSJFs26y11ul0uv99//3327CwMJuWlpZtTJcuXWyxYsVyfa0/Cg8Pt23atDnv/pUrV1rA9uzZM9v2J554wgJ29uzZ1lprJ0yYkOu1/tGjjz5qixYtajMyMvKM6c+y5iMwMNDu2rXLvX3JkiUWsI8//rh721133WVLly5tMzMz3duWL19+3vn8o7Vr11rA/uc//7HWWnv27FlbqFAhO3r0aGuttTfccIN95513rLXWHjt2zPr4+NhevXq5j09KSrKATUpKstZae+bMGRsSEmJr1qxpT58+7R43cuRIC9gmTZq4ty1duvS8MTZp0sQC9rPPPnNvO336tA0NDbW33357ntdkbe7fby1atLAVKlTIti08PNwCdu7cue5tBw4csAEBAfbf//63e9tjjz1mAbtkyZJs44oVK2YBm5qammc8WT8zBw8ezHX/kSNHLGA7duyY6/64uLhs790fZf3M5fYnICAgz7hERERExDPU2kVERETkKnPLLbewaNEi2rVrx6pVq3jttddo0aIFZcqU4fvvv/9b537ggQcueOwfK3dPnjxJWloaDRo0wFrrbkty8OBB5s6dS48ePShfvny2440xAFhr+fbbb7ntttuw1pKWlub+06JFC44ePcry5cv/1nVNmzYNgP/7v//Ltv3f//43AFOnTgXO9YGfMmUKZ8+ezfVcQUFBnDx58pJbdnTo0CFbRXndunW56aab3DECdO/enT179pCUlOTe9uWXXxIYGMjtt9+e5/ljY2MpUaKEu/f5qlWrOHnypLsyvEGDBixYsABw9U7PzMx090fPzS+//MKBAwd44IEHsj2A9N5776VYsWIXceVQuHDhbD3B/f39qVu3Llu3bv3LY//4/ZZVqd2kSRO2bt3K0aNHs42tUqWKuyIeoFSpUlSqVCnb60ybNo169epRt27dbOO6det2Udd0PoULFwbg+PHjl3yOd955h5kzZ2b7M3369HyJT0RERETylxLpIiIiIlehOnXq8N1333HkyBF+/vlnnnnmGY4fP07nzp1Zt27dJZ83MjLygsfu2LGDe++9l+LFi1O4cGFKlSpFkyZNANyJzazEZV4taA4ePEh6ejojR46kVKlS2f7cd999wN9/iOr27dtxOBxERUVl2x4aGkpQUBDbt28HoEmTJtx+++28+OKLlCxZkvbt2zNq1KhsfdT79OlDTEwMrVq1omzZsvTo0YMZM2ZccCzR0dE5tsXExLBt2zb317fccgthYWF8+eWXADidTsaMGUP79u0pUqRInuc3xtCgQQN3L/QFCxYQEhLivvY/JtKz/s4rkZ713vw5bj8/PypUqPAXV5td2bJl3b9AyRIcHMyRI0f+8tgFCxbQvHlzChUqRFBQEKVKlaJ///4AORLpf/6lTW6vs3379lznolKlShd0LX/lxIkTAH85X3mpW7cuzZs3z/YnMTExX+ITERERkfylRLqIiIjIVczf3586deowePBg3nvvPc6ePevuT/7nhGWWzMzM857vQvtDZ2ZmcssttzB16lSefvppJk6cyMyZM90PlryYBzZmjf3nP/+Zo/o260/WgzD/rvO9J3/c/80337Bo0SIefvhh9wNQa9eu7U6MhoSEsHLlSr7//nvatWtHUlISrVq1cj+UNT/4+PjQtWtXvv32W3777TeSkpLYs2dPtmruvDRq1IijR4+yZs0ad3/0LA0aNGD79u3s3r2b+fPnU7p06YtOiF8qHx+fXLdba/M8bsuWLTRr1oy0tDRef/11pk6dysyZM3n88ceBnN9vl/o6+SnrAbJ//uWNiIiIiHgnPWxURERE5Bpx4403ArB3717AVYELkJ6enm1cVoXx37FmzRpSUlIYPXo03bt3d2//c7uTrARtVlIxN6VKlaJIkSJkZmbSvHnzvx1bbsLDw3E6nWzatInY2Fj39v3795Oenk54eHi28fXq1aNevXoMGjSIr776im7dujF27Fh69uwJuH6Bcdttt3HbbbfhdDrp06cPH3zwAc8///xfJk43bdqUY1tKSgoRERHZtnXv3p1hw4YxefJkpk+fTqlSpWjRosUFXW9Whfn8+fNZsGBBtoe11q5dm4CAAObMmcOSJUto3bp1nufKem82bdpE06ZN3dvPnj1LamoqNWrUcG/7q19UXKrJkydz+vRpvv/++2zV5n9sfXOxwsPDc52LjRs3XvI5/+jzzz8HuOA5ExEREZFrmyrSRURERK4ySUlJuVbWZvXYzmpNUbRoUUqWLMncuXOzjXv33Xf/dgxZFb9/jMNay/Dhw7ONK1WqFDfffDOffPIJO3bsyLYv61gfHx9uv/12vv3221wT7gcPHvzb8WYli998881s219//XUA2rRpA8CRI0dyvLc1a9YEcLd3OXToULb9DoeD6tWrZxuTl4kTJ7J792731z///DNLliyhVatW2cZVr16d6tWr89FHH/Htt9/SpUsXfH0vrM7lxhtvpECBAnz55Zfs3r07W0V6QEAA8fHxvPPOO5w8eTLPti5Z5ypVqhTvv/8+Z86ccW//9NNPc/ySplChQkDOX978Xbl9vx09epRRo0Zd8jlbt27N4sWL+fnnn93bDh486G6n83d89dVXfPTRR9SvX59mzZr97fOJiIiIyNVPFekiIiIiV5lHHnmEU6dO0bFjRypXrsyZM2dYuHAh48aNIyIiwt1XHKBnz568+uqr9OzZkxtvvJG5c+eSkpLyt2OoXLkyFStW5IknnmD37t0ULVqUb7/9Ntde12+99RaNGjUiPj6e3r17ExkZybZt25g6dSorV64E4NVXXyUpKYmbbrqJXr16UaVKFQ4fPszy5cv53//+x+HDh/8yps2bN/Pyyy/n2F6rVi3atGnDPffcw8iRI0lPT6dJkyb8/PPPjB49mg4dOrj7To8ePZp3332Xjh07UrFiRY4fP86HH35I0aJF3cn4nj17cvjwYZo2bUrZsmXZvn07b7/9NjVr1sxW7X4+UVFRNGrUiAcffJDTp0/z5ptvUqJECZ566qkcY7t3784TTzwBcMFtXeBcy5958+YREBBA7dq1s+1v0KABw4YNA/Lujw6uXugvv/wy//rXv2jatCn/+Mc/SE1NZdSoUTlawlSsWJGgoCDef/99ihQpQqFChbjpppsuqvd+bm699Vb3XQD/+te/OHHiBB9++CEhISHuOzAu1lNPPcXnn39Oy5YtefTRRylUqBAjR44kPDyc1atXX/B5vvnmGwoXLsyZM2fYvXs3P/zwAwsWLKBGjRruNkuXavr06WzYsCHH9gYNGlyxdjwiIiIicoGsiIiIiFxVpk+fbnv06GErV65sCxcubP39/W1UVJR95JFH7P79+7ONPXXqlL3//vttsWLFbJEiReydd95pDxw4YAE7YMAA97gBAwZYwB48eDDH640aNcoCdunSpdm2r1u3zjZv3twWLlzYlixZ0vbq1cuuWrXKAnbUqFHZxiYnJ9uOHTvaoKAgW6BAAVupUiX7/PPPZxuzf/9++9BDD9ly5cpZPz8/Gxoaaps1a2ZHjhz5l+9JeHi4BXL9c//991trrT179qx98cUXbWRkpPXz87PlypWzzzzzjP3tt9/c51m+fLm96667bPny5W1AQIANCQmxbdu2tb/88ot7zDfffGNvvfVWGxISYv39/W358uXtv/71L7t37948Y0xNTbWAHTp0qB02bJgtV66cDQgIsI0bN7arVq3K9Zi9e/daHx8fGxMT85fvwZ8988wzFrANGjTIse+7776zgC1SpIjNyMjIti8pKckCNikpKdv2d99910ZGRtqAgAB744032rlz59omTZrYJk2aZBs3adIkW6VKFevr65vte6FJkyY2Li4uRyz33HOPDQ8P/8vr+f7772316tVtgQIFbEREhB0yZIj95JNPLGBTU1Pd48LDw22bNm1yHJ9brKtXr7ZNmjSxBQoUsGXKlLH/+c9/7Mcff5zjnLnJ+pnJ+lOgQAFbtmxZ27ZtW/vJJ59k+77KTVxcXI54smT9zJ3vz59/vkRERETE84y1V/CJPCIiIiIi4paWlkZYWBgvvPACzz//vKfDERERERGR81CPdBERERERD/n000/JzMzk7rvv9nQoIiIiIiKSB/VIFxERERG5wmbPns26desYNGgQHTp0ICIiwtMhiYiIiIhIHtTaRURERETkCktISGDhwoU0bNiQL774gjJlyng6JBERERERyYMS6SIiIiIiIiIiIiIieVCPdBERERERERERERGRPCiRLiIiIiIiIiIiIiKSByXSRURERERERERERETyoES6iIiIiIiIiIiIiEgelEgXEREREREREREREcmDEukiIiIiIiIiIiIiInlQIl1EREREREREREREJA9KpIuIiIiIiIiIiIiI5EGJdBERERERERERERGRPCiRLiIiIiIiIiIiIiKSByXSRURERERERERERETyoES6iIiIiIiIiIiIiEgelEgXEREREREREREREcmDEukiIiIiIiIiIiIiInlQIl1EREREREREREREJA9KpIuIiIiIiIiIiIiI5EGJdBERERERERERERGRPCiRLiIiIiIiIiIiIiKSByXSRURERERERERERETyoES6iIiIiIiIiIiIiEgelEgXEREREREREREREcmDEukiIiIiIiIiIiIiInlQIl1EREREREREREREJA9KpIuIiIiIiIiIiIiI5EGJdBERERERERERERGRPCiRLiIiIiIiIiIiIiKSByXSRURERERERERERETyoES6iIiIiIiIiIiIiEgelEgXEREREREREREREcmDEukiIiIiIiIiIiIiInlQIl1EREREREREREREJA9KpIuIiIiIiIiIiIiI5EGJdBERERERERERERGRPCiRLiIiIiIiIiIiIiKSByXSRURERERERERERETyoES6iIiIiIiIiIiIiEgelEgXEREREREREREREcmDEukiIiIiIiIiIiIiInlQIl1EREREREREREREJA9KpIuIiIiIiIiIiIiI5EGJdBERERERERERERGRPCiRLiIiIiIiIiIiIiKSByXSRURERERERERERETyoES6iIiIiIiIiIiIiEgelEgXEREREREREREREcmDEukiIiIiIiIiIiIiInlQIl1EREREREREREREJA9KpIuIiIiIiIiIiIiI5EGJdBERERERERERERGRPCiRLiIiIiIiIiIiIiKSByXSRURERERERERERETyoES6iIiIiIiIiIiIiEgelEgXEREREREREREREcmDEukiIiIiIiIiIiIiInlQIl1EREREREREREREJA9KpIuIiIiIiIiIiIiI5EGJdBERERERERERERGRPCiRLiIiIiIiIiIiIiKSByXSRURERERERERERETyoES6iFw3zp49y4ABA4iOjiYgIABjDBMnTvR0WPI33XvvvRhj2LZt2wUfExERQURExEW9zsCBAzHGMGfOnIs6TkREROR6pjW4d9IaXESuR0qki8hll5mZyYcffkiTJk0oXrw4fn5+hISEUL16dXr27Mn3339/ReIYNmwYL730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4Qbi4uJYu3YtQLbejFmyqjzWrFlz3jG5adiwIY888ghvv/02VatWpXPnzvj5+TFp0iSCg4MJCwvLcUz9+vUpWLAgb775JocOHXL3+nzkkUfct6l6wuDBg5kzZw6vv/46K1eupG7duqxfv55JkyYREhLCO++8k+OYZs2asX37dlJTU93fh+D63pgxYwb169cnJCSE3bt38/3335Oens6wYcNo1arVFbwyERERuVy0Btca/Hy0Br8w+bUGL126NM8//zwDBgygVatWtG3b1v2w0e+++44TJ07QsWNHWrdufYWvUEQuiRURuYx27NhhR4wYYTt06GBjYmJskSJFrJ+fnw0NDbWtWrWyn3/+uc3MzMxx3JEjR2zPnj1tqVKlrL+/v42Li7MffPCBTU1NtYC95557so2/5557LGBTU1PPG0t4eLgNDw/Pdd+CBQtsYmKiDQoKsoULF7YNGza0EyZMsElJSRawAwYMyHFMWlqafeqpp2xMTIwNCAiwxYoVszVq1LD9+/e3J0+ezDb22LFjdtCgQTY+Pt4WKlTIFihQwEZERNjWrVvbDz74wJ44ceKv3kr3NQB5/lmxYoW11trMzEz7zjvv2Nq1a9vAwEAbGBho4+Pj7YgRI3K85+PGjbNdunSxUVFRtlChQrZIkSI2Li7O9u/f3x44cMA9bt26dfbxxx+3tWvXtiVLlrT+/v42PDzc3n777XbBggUXdA1/1LdvX3fca9asyXVMmTJlLGCrVKmS6/7zzb3T6bRvv/22rVy5svX397dhYWG2T58+Nj09/bzfC9OnT7f16tWzhQoVcseVdd4BAwZYwCYlJeU47nzfl/nl0KFDtm/fvrZ8+fLun5/77rvP7ty5M9fxWd8nf35PpkyZYhMTE22pUqWsn5+fveGGG2znzp3tokWLLkvcIiIi4hlag7toDZ47rcEvTH6twa21duLEibZly5a2ZMmS1sfHxxYpUsTWr1/fvvvuuzYjI+OyxC8i+c9Y+6d7WERERERERERERERExE090kVERERERERERERE8qBEuoiIiIiIiIiIiIhIHpRIFxERERERERERERHJgxLpIiIiIiIiIiIiIiJ5UCJdRERERERERERERCQPSqSLiIiIiIiIiIiIiORBiXQRERERERERERERkTz4ejqAq9GRI0fIyMi4oq9ZqlQpDh48eEVfU64szbH3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xiIiIiLXF+Vnzuf0GKuQLiIiIhWSie+M6xePl1wxEVYH1y8ex8R39s/E5KpRjEVERESuL8rPnM/JMVaPdBEREamwTHxnXHE3w87thBoPbuuC5q3K7QoJKUkxFhEREbm+KD9zPqfGWIV0ERERqdCMKwAT045qkZGcOnIEay9lCyQpTxRjERERkeuL8jPnc2KM1dpFREREREREREREROQiVEgXEREREREREREREbkItXYpRWCgf/5Y/HVdKTuKsfMpxs6m+DqfYux8ZR1jfU9dOuXgcq0oxs6nGDub4ut8irHzOSUHN9YJDWpERERERERERERERK4RtXa5Dnz99df87ne/4+uvv/b3VOQaUYydTzF2NsXX+RRj51OM5fv0PeF8irHzKcbOpvg6n2LsfE6LsQrp1wFrLXv37nXE7rVSOsXY+RRjZ1N8nU8xdj7FWL5P3xPOpxg7n2LsbIqv8ynGzue0GKuQLiIiIiIiIiIiIiJyESqki4iIiIiIiIiIiIhchArp14GgoCCGDh1KUFCQv6ci14hi7HyKsbMpvs6nGDufYizfp+8J51OMnU8xdjbF1/kUY+dzWoyNdUqTGhERERERERERERGRa0Ar0kVERERERERERERELkKFdBERERERERERERGRi1AhXURERERERERERETkIlRIFxERERERERERERG5CBXSRUREREREREREREQuItDfE6hItm3bxgcffMDevXs5efIkv/nNb+jYsaPvvLWW1NRUFi9ezOnTp4mJiWHUqFFERkb6cdZyqd5//33WrVvHoUOHqFSpEi1atOBnP/sZ9evX9405e/Ysb7/9NqtWraKgoIDY2FhGjRpFaGio/yYul2zBggUsWLCA3NxcABo2bMjQoUO58cYbAcXXaWbPns3UqVNJSkri/vvvBxTj8i41NZWZM2cWO1a/fn3++te/AoqvU5w4cYJ33nmHTz/9lDNnzhAREcGYMWNo1qwZoHyrIlIO7mzKwZ1POXjFohzceZSDVwwVJQc31lrr70lUFJs2bWLHjh00bdqU//u//yuRxM+ePZvZs2fz8MMPEx4ezowZMzhw4AAvvfQSlSpV8uPM5VJMmDCBxMREmjVrxrlz55g2bRoHDx7kpZdeokqVKgC8+uqrbNy4kYcffpjg4GBef/11XC4Xf/rTn/w8e7kUGzZswOVyERkZibWW5cuX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73ts8bv9+d566y3uuusumjZtStWqValZsyaJiYm88847F7y3EydO8MQTT9C2bVuCg4MJCQkhNjaWxx9/nNOnT5cY+/vf/55WrVpRtWpVQkJC6NWrFwsWLPiBP8Er5/F4+Oc//0lCQgLVq1enWrVqJCQk8Morr+DxeEqM//jjj7nzzjtp2LAhlStXJiIigk6dOvHUU08VG/fFF1/wm9/8hpYtW1KtWjVCQ0Np2bIl999/P3v27PnBefXq1QvwJuzft2TJEhITE7n99ts5dOgQO3bsKHH+u+8BF+7PaK1l0qRJtGnThipVqtCgQQPGjh1LXl5eiet2797dt/LmgQceKNbqpLRHeGfOnEnHjh0JDg6mVq1aJCcnc+jQoR+898v11Vdf8Z///Idq1aqVKIKPHTuWxo0b8+GHH17Sn/uFFBQU+B6lHT169I+YrYiIiFwvlIOfH6sc3Es5+KW72jn4uHHjOHv2LP/9739LFNEB3z9OiMj1TyvSReSaql27NgDZ2dllcr1HH32Ujz/+mH79+pGUlERAQAAJCQlERUXx17/+FYBf/epXgHeFbpFf/OIXtGnThltvvZXIyEiOHz9Oeno69957Lzt27OBPf/pTsevs3buXHj16sH//fjp06MAvfvELPB4P2dnZ/OUvf+HnP/851apVA2D//v10796dffv20bVrV/r27cvp06eZO3cuffv2ZcqUKaSkpFz1P4t7772XqVOncsMNNzBq1CiMMbz//vuMGTOGFStW8N///tc3NiMjg379+lGzZk0GDBhAgwYNOHHiBNu3b+cf//iHryVIfn4+iYmJ7N69m9tuu40777wTay379+8nLS2NoUOH/uAjjm3atKFevXps3ryZ48eP+75Hdu/ezf79+3nooYd8H+wWL15My5Ytfa8teuz0u0n8hfzqV7/ib3/7G5GRkYwePZqgoCDS0tJYu3YtZ8+eLbYq6v777yc0NJS0tDQGDhxIXFyc79x3v08A/vGPf/DBBx8wYMAAunXrxtq1a5kxYwabN2/m008/vaorutesWcPXX39Nnz59qFGjRrFzLpeL22+/nX/9618sXbr0sh4t/a4PPviAnJwcbr311nLXr1RERERKpxxcOfj3KQe/dFczBz916hTz5s0jNjaWVq1asW7dOlasWMG5c+do1aoVffr00dMaIuWICukick0NGTKEiRMn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8ynGzuekHFyF9FIUFhZSUFBQZtczxviua60ts+tK2VGMnU8xdjbF1/kUY+dTjK9/ysHlalOMnU8xdjbF1/kUY+dzWozV2kVERERERERERERE5CJUSBcRERERERERERERuQi1dvEz6zmH3bmd0zs247EuaN4K4wrw97RERERERBxLObiIiIiIXC4V0v3IblyFZ/qrcPI4J4oOhtXGlZyCie/sz6mJiIiIiDiScnARERERuRJq7eInduMqPK88DyePFz9x8jieV57Hblzln4mJiIiIiDiUcnARERERuVIqpPuB9ZzzroK5CM/017Cec2U0IxERERERZ1MOLiIiIiI/xhW1dsnIyGDOnDm43W4aN27MyJEjiY6OvuD41atXM2PGDHJzc4mIiGD48OHEx8f7zltrSU1NZfHixZw+fZqYmBhGjRpFZGQkAEePHuW9994jKysLt9tNrVq16Nq1K0OGDCEwsOQt5OTk8Nvf/haXy8Vbb711Jbd4be3cVnIVzPedPOYd17Jd2cxJRERERMTJlIOLiIiIyI9w2SvSV61axdtvv83QoUOZOHEijRs3ZsKECeTl5ZU6fseOHbz88sv07NmTiRMnkpCQwIsvvsiBAwd8Y9LS0pg/fz4pKSk8++yzVK5cmQkTJnD27FkADh8+jLWW0aNH89JLL3HfffexcOFCpk6dWuJ6hYWFvPzyy7Rq1epyb63MWPeJHx50GeNEREREROTilIOLiIiIyI9x2SvS586dS69evejRowcAKSkpbNy4kaVLlzJo0KAS49PT04mLi2PAgAEAJCcnk5mZSUZGBqNHj8ZaS3p6OkOGDCEhIQGAsWPHkpKSwvr160lMTCQuLo64uDjfe9arV4/Dhw+zYMECRowYUex606dPp379+rRr144dO3Zc9F4KCgooKCjwfW2MoWrVqr7fXysmtDb2EsbZzA3Qoi2mVp1rNhcpG0XfT9fy+0r8SzF2NsXX+RRj51OMxYTWurQcfNd2bPsETNXgaz4nERERESk/LquQXlhYyJ49e4oVzF0uF+3atSM7O7vU12RnZ9O/f/9ix2JjY1m/fj3gbdvidrtp376973xwcDDR0dFkZ2eTmJhY6vvm5+dTvXr1YseysrJYs2YNL7zwAuvWrfvB+3n//feZOXOm7+smTZowceJE6tat+4Ov/TFseDhH3grn3LGjFx+4djnn1q+gauce1LjzHiq1idOHv3IuIiLC31OQa0wxdjbF1/kUY+dTjCuw5q0hrPYPt3dZlo5nzVJMl9swPftj6up7RkREREQus5B+6tQpPB4PoaGhxY6HhoZy+PDhUl/jdrsJCQkpdiwkJAS32+07X3TsQmO+Lycnh/nz53Pvvff6jn355ZdMnjyZX/7ylwQHX9rqkcGDBxcr8hcVqXNzcyksLLyk97hS9icPwivPXfC86TMYuy8bsrfy9YpFfL1iEdzQBFfP/pibu2EqVb6m85OryxhDREQEOTk5WHspa6GkvFGMnU3xdT7F2Pn8FePAwMBrvkhDLo1xBeBKTsHzyvMXHtStL2RvhSMHsYs+wC6eCzfejKv3QIhupUUtIiIiIhXYFW026k8nTpxgwoQJ3HLLLfTu3dt3fMqUKXTp0oXWrVtf8nsFBQURFBRU6rlr/QHLxN+C6xeP45n+avFVMWF1cCWPwsR39s7j4F7s0nnYtcvg4F48//47zHzLu0KmRxKmdvg1nadcXdZaFWgcTjF2NsXX+RRj51OMKzYT3/kHc3BrLWzdhGdRGmzdBBtX49m4GhpHY24biOmQiAksdx+jRERERORHuqwMsGbNmrhcrhIrxd1ud4lV6kVCQ0NLbESal5fnG1/0a15eHmFhYcXGREVFFXvdiRMneOqpp2jZsiWjR48udi4rK4sNGzYwZ84c4PyHpOTkZEaPHk3Pnj0v51bLhInvjCvuZti5nVDjwW1d0LwVxhVwfswNTTAjxmLvug+7YiF2aTocP4r9cBZ2wWyI64irZ39o2U4rZEREREREfsAP5eDGGGgbT0DbeOzhA96V6WuWwf5d2Nf+jJ35FqZnP8ytt2Oq1fDvzYiIiIhImbmsQnpgYCBNmzYlKyuLjh07AuDxeMjKyqJv376lvqZFixZkZmbSr18/37EtW7bQvHlzAMLDwwkNDSUzM9NXOM/Pz2fXrl306dPH95qiInqTJk0YM2YMLper2HWeeeYZPB6P7+sNGzaQlpbGn/70J2rVqnU5t1mmjCsAE9OOapGRnDpy5IIrpEy1Gpjbh2BvGwib1+NZMhc+2wKb1uDZtAYaNMb06Ifp1B1TuUoZ34WIiIiISPlxyTl4/UbeRS2D78Uuz8AuSwf3ceyst7FzZ2A698T0GoCJaFDGdyAiIiIiZe2yn0ns378/kydPpmnTpkRHR5Oens6ZM2fo3r07AJMmTaJWrVoMGzYMgKSkJMaPH8+cOXOIj49n5cqV7N6927ei3BhDUlISs2bNIjIykvDwcKZPn05YWBgJCQmAt4g+fvx46taty4gRIzh16pRvPkUr2hs2bFhsnnv27MEYQ6NGjS77D+V6ZlwBcGMnAm7shD10ALt0Lnb1Uji0H/vOP7Cz/u1t+9I9SRsjiYiIiIhcBaZGCKb/Pdjbh2DXf4xdlAYH92KXzccumw/tbsJ120CIaa+nREVEREQc6rIL6Z07d+bUqVOkpqbidruJiopi3LhxvoL2sWPHiiWPLVu25JFHHmH69OlMmzaNyMhIHnvssWIF7oEDB3LmzBmmTJlCfn4+MTExjBs3jkqVKgHeFew5OTnk5OTw85//vNh8UlNTr+S+HcE0aIT52RjskBHYlYuxS+dBbg52wWzswjRon4CrZz9oFaeEXkRERETkRzJBQZjOPbG39IDsLDwL02DLesjcgCdzAzSMwvQeiOl4K+YCezGJiIiISPlkrHZbKiE3N5eCgoIyu54xhsjISI5c5LHSS2E95yBzo7fty7ZN509ENPT2cbylB6ZK8FWYsVyuqxVjuX4pxs6m+DqfYux8/opxUFAQdevWLbPrlWflNgf/4jB28RzsqsVw5hvvwZqhmO5JmG59MTVDr8p85fLp73bnU4ydTfF1PsXY+ZyWg2u7eQcxrgCITSAgNgGb8zl2yTzsqiWQ8zl26hTs+//BdO7l7aVer76/pysiIiIiUu6ZevUxwx7CDhyOXbEAu2QunDiG/WAqNv1d7x5GvQdgGjT291RFRERE5EdQId2hTERDb0I/+F7sqiXeti9fHPKullk8B9p2wNWzP7S5EfO9jVtFREREROTymGrVMbcPwfYagN202ttqcW82dsVC7IqF0DoOV++Byr9FREREyikV0h3OVA3G9OqP7ZEE2zbhWTIPMjdA1id4sj6B8PqYHknelerB1fw9XRERERGRcs0EBmISumJv6gK7P8OzKA02roFtn+LZ9qm37WLvAZhOPTCVK/t7uiIiIiJyiVRIryCMywVtOxDQtgP26GHs0nTsykVw9DB2xmvY2f/19lDv2Q8TeYO/pysiIiIi35ORkcGcOXNwu900btyYkSNHEh0dfcHxq1evZsaMGeTm5hIREcHw4cOJj4/3nbfWkpqayuLFizl9+jQxMTGMGjWKyMhIAI4ePcp7771HVlYWbrebWrVq0bVrV4YMGUJg4PmPEfv37+f1119n9+7d1KxZk759+zJw4MBr9wdRThhjILoVAdGtsMe+wC6Z612ZnvM59p1/YGf/B3NrX++iltDa/p6uiIiIiPwAPVNYAZnw+rjuGYXrhTcxw38OkTfAma+xy9Lx/PFhzv3lj9jN67ybl4qIiIiI361atYq3336boUOHMnHiRBo3bsyECRPIy8srdfyOHTt4+eWX6dmzJxMnTiQhIYEXX3yRAwcO+MakpaUxf/58UlJSePbZZ6lcuTITJkzg7NmzABw+fBhrLaNHj+all17ivvvuY+HChUydOtX3Hvn5+TzzzDPUqVOH559/np/97Ge8++67LFq06Nr+gZQzpk49XHc/iOuFNzD3jII69eCrL7Hp7+J5PAXP6y9h9+/29zRFRERE5CK0Ir0CM1WqYronYbvdAds341kyF7asP//YaZ163hUyibdhqlX393RFREREKqy5c+fSq1cvevToAUBKSgobN25k6dKlDBo0qMT49PR04uLiGDBgAADJyclkZmaSkZHB6NGjsdaSnp7OkCFDSEhIAGDs2LGkpKSwfv16EhMTiYuLIy4uzvee9erV4/DhwyxYsIARI0YAsGLFCgoLCxkzZgyBgYHccMMN7Nu3j7lz59K7d+9r+4dSDpkqwZjeA7A9+8Gn67xtX3Zuw65Zhl2zDFq08fZRj03AuAL8PV0RERER+Q4V0sX72GnrOAJax2Fzc7DL5mNXLIBjX2DffRObNhXTqTumZ39Mg8b+nq6IiIhIhVJYWMiePXuKFcxdLhft2rUjOzu71NdkZ2fTv3//YsdiY2NZv3494G3b4na7ad++ve98cHAw0dHRZGdnk5iYWOr75ufnU736+QUW2dnZtGrVqlirl9jYWNLS0vjqq6+KjS1SUFBAQUGB72tjDFWrVvX9vqwUXassr+m7dkAgdOiMq0Nn7L5deBamYTd8DNlb8WRvhbqRuHr1x3TpjakSXObzcwp/xljKhmLsbIqv8ynGzue0GKuQLsWYuhGYnzyAHTAMu3YZdslcOLQf+9GH2I8+hJbtcPXsD7EdMQFaJSMiIiJyrZ06dQqPx0NoaGix46GhoRw+fLjU17jdbkJCQoodCwkJwe12+84XHbvQmO/Lyclh/vz53HvvvcWuEx4eXmJeRedKK6S///77zJw50/d1kyZNmDhxInXr1i31utdaRESEX67rExkJt3Sl8NhRvpr3Lqfnz8KTewTP9Fcxc6ZRvc8gqg+4h8DwSP/Osxzze4zlmlOMnU3xdT7F2PmcEmMV0qVUpnJlzK23Y7v28a6MWTIHNq2FHZl4dmRCrbqY7kmYrrdhqtf093RFRERE5Bo6ceIEEyZM4JZbbvnRLVsGDx5cbLV80Qql3NxcCgsLf9R7Xw5jDBEREeTk5GCtLbPrXlSfIZhuSbhWL8WzKA2bc4gv33+HL9OmYuJvwXXbIEyzGH/Psty4LmMsV5Vi7GyKr/Mpxs7nrxgHBgZek0UaKqTLRRljoGVbAlq2xR7PxS5Px368AE7kYmf9GztnGubmbt62Lzc08fd0RURERBynZs2auFyuEivF3W53iVXqRUJDQ0tsRJqXl+cbX/RrXl4eYWFhxcZERUUVe92JEyd46qmnaNmyJaNHjy5xndLm9d1rfF9QUBBBQUGlnvPHh2hr7fX14b1SZUy3vri69oGtG/EsTIPtm7EbVnJuw0po0gJz20BMfGc9IXqJrrsYy1WnGDub4ut8irHzOSXGLn9PQMoPU7suriH34Zr4Bub+R6BRUyg4i12xEM/Tj3LuhcexG1Zgy3AlkYiIiIjTBQYG0rRpU7KysnzHPB4PWVlZtGjRotTXtGjRgszMzGLHtmzZQvPmzQEIDw8nNDS02Jj8/Hx27dpV7D2LiuhNmjRhzJgxuFzFPz60aNGC7du3F1tJvmXLFurXr19qWxe5dMblwrS7iYD/+ROuJ/+GSewNgYGwNxv7rxfxjEvB8+EsbP5X/p6qiIiISIWgQrpcNlOpMq7E3rj+8Bdcv30ec1MXcLlg5zY8U17A8/sUPPNSsV/m/fCbiYiIiMgP6t+/P4sXL2bZsmV8/vnnvPbaa5w5c4bu3bsDMGnSJKZOneobn5SUxObNm5kzZw6HDh0iNTWV3bt307dvX8D71GFSUhKzZs1iw4YNHDhwgEmTJhEWFkZCQgLgLaKPHz+eOnXqMGLECE6dOoXb7S62Ar1Lly4EBgbyz3/+k4MHD7Jq1Srmz59fYqNT+XFMwyhc9z+Ca+LrmDuToUYInDiGnfkWnt+OxDN1CvZo6f3yRUREROTqUGsXuWLGGGjeGtO8Nfbkcezy+d4NSd3HsbPfwc6djkm4FdOrP6ZxtL+nKyIiIlJude7cmVOnTpGamorb7SYqKopx48b52qccO3bM12scoGXLljzyyCNMnz6dadOmERkZyWOPPUajRo18YwYOHMiZM2eYMmUK+fn5xMTEMG7cOCpVqgR4V5bn5OSQk5PDz3/+82LzSU1NBSA4OJg//OEPvP766zz++OPUqFGDu+6660f3UZfSmZphmAHDsHcMxa5djl30ARzaj106D7ssHWI74uo9EFq0Kfb9ICIiIiI/nrFOaFBzleXm5lJQUFBm1zPGEBkZyZEjR8p9vyBbUOBt77J4Duzfdf5EsxhMj36YDp0xgaX3xHQyJ8VYSqcYO5vi63yKsfP5K8ZBQUHXZKMjJ1IOfvmstbB9M55FH0DmhvMnGjXF9B6ISehSIXPvIk6IsVycYuxsiq/zKcbO57QcXCvS5aoyQUGYW3pgO3WHPTuwS+ZhP1kJuz/D7v4M++4bmFv7Yrr1xYSE/eD7iYiIiIhI6Ywx0DqOgNZx2COfYxd/gF29BA7swb7xF+x7/8b0SPLm3zVq+nu6IiIiIuWaCulyTRhjvKvQm8Vg7x6JXZ6B/SgD8k5i50zDpr+L6ZDobfvStKW/pysiIiIiUq6ZyIaYn43BDvoZ9qMPsUvngfuEt+XivFTMLT0wvQdgIm/w91RFREREyiUV0uWaMyFhmAE/xSYNxX6yypvU7/4Mu245dt1yiGqO6dkfc1MXTFDFffRUREREROTHMtVrYpJ+gu0zCLthpbeP+v5d3uL6Rx9C23hvH/XWceqjLiIiInIZVEiXMmMCgzA3d4Obu2H37cQumYtd/zHs2+l99PTdNzC33o7pdgcmrLa/pysiIiIiUm6ZwCBMp+7Ym7vBzm14FqXBp2shayOerI1Qv5F3hfrN3TCVKvt7uiIiIiLXPRXSxS9MVHPMyP+HHfoA9uMF2GXzwX0cOy8Vm/Ee5sZbML36Q7NWWikjIiIiInKFjDHQog0BLdpgc3Owi+dgVyyCwwewb0/Cznob0/0OTPck7WEkIiIichEqpItfmZqhmH53Y28fAp+uwbNkLuzcht2wArthBTRq6m370vFWTFAlf09XRERERKTcMnUjMMkp2AHDsCsWYpfMheNHsXNneBezJNyKuW0g5oYm/p6qiIiIyHVHhXS5LpjAQLipCwE3dcEe2ONt+7LuIziwB/vW37Az38R07YPploSpXdff0xURERERKbdMcDVMn0HYXnd6F7MsTPPuYbR6CXb1EmjZDtdtA6HdTRiXy9/TFREREbkuqJAu1x3TqCnm/kewQ+/HfrwQuywdTuRi57+HzXgfbuyEq2d/aNFGbV9ERERERK6QCQiADokEdEjE7s3GLkzDfrISdmTi2ZEJ4fUxve/EdO6FqVzF39MVERER8SsV0uW6ZarXxNxxF7bPINi8ztv2ZUcmbFyFZ+MqaNDY2/bl5u6YytogSURERETkSpkmLTCjH8OeuB+7ZB724w/h6GHs1CnY2e9gut7uzb1r1fH3VEVERET8QoV0ue6ZgACIv4WA+Fuwn+/DLp2HXbMUDu3H/mcy9r1/Y7rchumRhKlTz9/TFREREREpt0ytupih92P73+Nt9bLoAzh6BPvhLOzC2ZgOid4+6k1a+HuqIiIiImVKhXQpV0zDKMy9D2OH3IdduRC7NB2OfYFd8D524WyI7eht+xLTXm1fRERERESukKlSFdOjH7bbHZC5wdtHfUcmdv3H2PUfQ7MYbx/1uE7ehS8iIiIiDqdCupRLplp1TJ/B2N4DIPMTb9uXbZ/Cp2vxfLoWIm/A9OyH6dQDU6Wqv6crIiIiIlIuGZcLYjsSENsRe2APdlEadt3HsPszPLs/g9rh3pYvXW7DBFfz93RFRERErhkV0qVcM66A84n9kYPefo6rl8CRg9j//hM76z+YxF7eti/h9f09XRERERGRcss0aooZ+f+8T4cuS8cuz4DjR7HvvoGdMw2T2BvT605M3Qh/T1VERETkqlMhXRzDRN6AGf5z7OB7sasWY5fO8/ZzXPQBdvEcaNvB2/aldZx3ZY2IiIiIiFw2E1oLM+hn2KSfYNcs8/ZRP3IQu3gOdsk8iOuIq/dAaN5a7RZFRETEMVRIF8cxwdUwvQdge/aHrZu8bV+yPvH2dszcAPUaYHr0w3Tuiaka7O/pioiIiIiUS6ZSZcytt2O79vHm3YvSYOsm2LQGz6Y10DjauzFph0RMoD56ioiISPl2RdlMRkYGc+bMwe1207hxY0aOHEl0dPQFx69evZoZM2aQm5tLREQEw4cPJz4+3nfeWktqaiqLFy/m9OnTxMTEMGrUKCIjIwE4evQo7733HllZWbjdbmrVqkXXrl0ZMmQIgd8mZFu3bmXevHns2rWLr7/+moiICAYMGEDXrl2v5BbFAYzLBe06ENCuAzbnkPfx05WL4ItD2On/ws7+D+aWnt5e6hEN/T1dEREREZFyyRgDbeMJaBuPPXzA+0TommWwfxf2tT9jZ77lzblvvR1TrYa/pysiIiJyRS67v8WqVat4++23GTp0KBMnTqRx48ZMmDCBvLy8Usfv2LGDl19+mZ49ezJx4kQSEhJ48cUXOXDggG9MWloa8+fPJyUlhWeffZbKlSszYcIEzp49C8Dhw4ex1jJ69Gheeukl7rvvPhYuXMjUqVOLXadRo0b8+te/5sUXX6RHjx5MmjSJTz755HJvURzIRDTAlZyC68U3McMegoiG8M3X2KXz8PzvGM799UnslvVYj8ffUxURERERKbdM/Ua4RozFNfF1zMDhEBIG7uPYWW/j+e1IPP99BZvzub+nKSIiInLZLntF+ty5c+nVqxc9evQAICUlhY0bN7J06VIGDRpUYnx6ejpxcXEMGDAAgOTkZDIzM8nIyGD06NFYa0lPT2fIkCEkJCQAMHbsWFJSUli/fj2JiYnExcURFxfne8969epx+PBhFixYwIgRIwAYMmRIsesmJSWxefNm1q5dS4cOHUq9l4KCAgoKCnxfG2OoWrWq7/dlpeha6h947Zmq1aBnf2yPfthtn2KXzMVuWe99FHXrJqgbiatHEqZLb0xw9at3XcXY8RRjZ1N8nU8xdj7FWKRsmRohmP73YG8fgl3/MXZRGhzci102H7tsPrS7CddtAyGmvX4uRUREpFy4rEJ6YWEhe/bsKVYwd7lctGvXjuzs7FJfk52dTf/+/Ysdi42NZf369YC3bYvb7aZ9+/a+88HBwURHR5OdnU1iYmKp75ufn0/16hcvdObn59OgQYMLnn///feZOXOm7+smTZowceJE6tate9H3vVYiIrS7fZmqXx96J1F45HO+nPcupxekYXOP4El9HfPBVIJ7JlHjznsIatT0ql1SMXY+xdjZFF/nU4ydTzEWKVsmKAjTuSf2lh6QnYVnYRpsWX9+/6KGUZjeAzAdb8UEVfL3dEVEREQu6LIK6adOncLj8RAaGlrseGhoKIcPHy71NW63m5CQkGLHQkJCcLvdvvNFxy405vtycnKYP38+99577wXnumrVKnbv3s3o0aMvOGbw4MHFivxFKyFyc3MpLCy84OuuNmMMERER5OTkYK0ts+tKkQDol4yr9yDsmqV4Fs/FHj7A6fT3OJ3+HqZVLKZnf0xsAsYVcEVXUIydTzF2NsXX+RRj5/NXjAMDA/22SEPkemKMgZbtCGjZDvvFYeziOdhVi+Hzfdi3/oZ979+Y7kmY7ndgaob6ebYiIiIiJZW7rdNPnDjBhAkTuOWWW+jdu3epY7KysnjllVd46KGHuOGGGy74XkFBQQQFBZV6zh8foq21+vDuT5UqY27ti6vr7bAjE8+SufDpOuz2zdjtm6F2OKZHEqbLbVe8SZJi7HyKsbMpvs6nGDufYizif6Zefcywh7ADh2NXLMAumQsnjmHnTMPOn4m5uRvmtoGYBo39PVURERERn8sqpNesWROXy1Vipbjb7S6xSr1IaGhoiY1I8/LyfOOLfs3LyyMsLKzYmKioqGKvO3HiBE899RQtW7a84Erzbdu2MXHiRO677z66det2yfcmUsQYAzHtCYhpjz1+FLs0HbtiIRw/ip35FvaDqZibu2N69sM0bOLv6YqIiIiIlEumWnXM7UOwvQZgN63GLkyDvdnYlYuwKxdBq1hvH/U28RiXy9/TFRERkQrusrKRwMBAmjZtSlZWlu+Yx+MhKyuLFi1alPqaFi1akJmZWezYli1baN68OQDh4eGEhoYWG5Ofn8+uXbuKvWdREb1JkyaMGTMGVymJ1NatW3nuuecYPnz4BVeri1wOUzsc19D7cb3wBmbEWGjYBM6exX68AM9Tj3LuxXHYT1Zhz53z91RFRERERMolExiIK6ErAeP+D9fjL2A6JIJxwfbNeP72NJ4nx+JZNh975oy/pyoiIiIV2GW3dunfvz+TJ0+madOmREdHk56ezpkzZ+jevTsAkyZNolatWgwbNgyApKQkxo8fz5w5c4iPj2flypXFepcbY0hKSmLWrFlERkYSHh7O9OnTCQsLIyEhAfAW0cePH0/dunUZMWIEp06d8s2naEV7VlYWEydO5I477qBTp06+VfOBgYE/uCmpyA8xlSpjuvbBdrkNdm7DLpmL3bTau2FSdhbUqoPpdgem6+2YGjWLvdZ6zmF3buf0js14rAuat7riXusiIiIiIk5mmsVgmsVgj33hzblXLIScz7H/fQU7+x3MrbdjevTDhNX291RFRESkgrnsQnrnzp05deoUqampuN1uoqKiGDdunK+gfezYMd+mnQAtW7bkkUceYfr06UybNo3IyEgee+wxGjVq5BszcOBAzpw5w5QpU8jPzycmJoZx48ZRqZJ31/YtW7aQk5NDTk4OP//5z4vNJzU1FYDly5dz5swZZs+ezezZs33nW7duzfjx4y/3NkVKZYyBFm0wLdpgTxzDLp+P/ehDb0/H9/+DnTMd0/FW7+akjZthN67CM/1VOHmcE0VvElYbV3IKJr6zP29FREREROS6ZerUw9z9IHbAT7ErFmEXz4FjX2Dnz8QueB9zUxdvH/XG0f6eqoiIiFQQxmq3pRJyc3MpKCgos+sZY4iMjOTIkSPa/KocsgVnses/xi6ZB/t3nT8R0QByDl3wda5fPK5iuoPo59jZFF/nU4ydz18xDgoKom7dumV2vfJMObhcjPWcg0/X4VmUBju3nT/Rog2u3gMhNqHYU5/Wcw52bifUeHDrqVDH0s+xsym+zqcYO5/TcvDLXpEuIsWZoEqYzr2wt/SEPTu8j6BuWHHRIjqAZ/pruOJuVkIvIiIiIvIDjCsA4m8hIP4W7P5d2IVp3pw7eyue7K1QNwLT605MYi/Y9qmeChUREZGrToV0kavEGAPf9nT0xN+C/efEi7/g5DHvapqW7cpmgiIiIlKuZWRkMGfOHNxuN40bN2bkyJFER1+4rcXq1auZMWMGubm5REREMHz4cOLj433nrbWkpqayePFiTp8+TUxMDKNGjSIyMtI3ZtasWWzcuJF9+/YRGBjIW2+9VeI6u3btYurUqezZswdjDNHR0QwfPpyoqKirefsiPqZxNGbUr7F33Y9dOs/bajE3Bzv9Veysf8PZsyVfdPI4nlee11OhIiIicsVc/p6AiCMVFl7SME/af/GsX4HN/+oaT0hERETKs1WrVvH2228zdOhQJk6cSOPGjZkwYQJ5eXmljt+xYwcvv/wyPXv2ZOLEiSQkJPDiiy9y4MAB35i0tDTmz59PSkoKzz77LJUrV2bChAmc/U4RsrCwkE6dOtGnT59Sr/PNN9/w7LPPUqdOHZ599lmefvppqlSpwoQJEyi8xHxI5EqZsNq4hozANfENzPBfQL36pRfRv8Mz/TVv2xcRERGRy6QV6SLXgAmtxSV1ftq5DbtzG9blguhWmHY3YdrdBPUbFdu0V0RERCq2uXPn0qtXL3r06AFASkoKGzduZOnSpQwaNKjE+PT0dOLi4hgwYAAAycnJZGZmkpGRwejRo7HWkp6ezpAhQ0hISABg7NixpKSksH79ehITEwG4++67AVi2bFmp8zp06BBfffUVd999N3Xq1AHgJz/5Cb/5zW84duwYERERJV5TUFBQrBe6MYaqVav6fl9Wiq6lnKv8M1WqQI8kPBEN8Pz5DxcffPIY7NyOidFToU6gn2NnU3ydTzF2PqfFWIV0kWuheWsIqw0nj194TI0Q6NQDsj6BIwcheys2eyv2vX9DrbqYdh0w7RIgpj2mcuWym7uIiIhcVwoLC9mzZ0+xgrnL5aJdu3ZkZ2eX+prs7Gz69+9f7FhsbCzr168H4OjRo7jdbtq3b+87HxwcTHR0NNnZ2b5C+g+pX78+NWrUYMmSJQwZMgSPx8OSJUto0KDBBTd4ev/995k5c6bv6yZNmjBx4kS/bcpaWrFfyqfTOzaf74l+EUHL5hESWZ9KLds45oN9RaefY2dTfJ1PMXY+p8RYhXSRa8C4AnAlp+B55fkLjnH97Bfe/ox3j8Tm5mCzPsFmfgKfbYETudjlGdjlGRAYBDHtMG1vwrS/CVPXGX/5iIiIyKU5deoUHo+H0NDQYsdDQ0M5fPhwqa9xu92EhIQUOxYSEoLb7fadLzp2oTGXomrVqjz55JO8+OKLvPfeewBERkbyxBNPEBBQ+obqgwcPLlbkLypk5ubmlmk7GGMMERER5OTkYO0lPUso1zmPvbTOpWc2rOTohpVQOxxzUxdcCV2gcbSK6uWQfo6dTfF1PsXY+fwV48DAwGuySEOFdJFrxMR3xvWLx/FMf7X4yvSwOriSRxXb5MjUjcD06Ac9+mHPnIHsTOyWDdjMDXD8KGRtxGZtxE7/F0Q0/Ha1+k3QvDUmMMgPdyciIiICZ8+e5Z///CctW7bk0UcfxePxMGfOHJ5//nmee+45KlWqVOI1QUFBBAWVnr/440O0tVYf3p2ieasffiq0ek1oFQtb1sPxo9gPZ3Huw1lQNwJzUyLmpi5wQ1MV1csZ/Rw7m+LrfIqx8zklxiqki1xDJr4zrribYed2Qo0Ht3VB81YYV+krtABvG5dve6Vba+HIQWzmBu9q9V3bIOdzbM7n2IVpUKUqtI7DtPUW1k1orTK8OxERESkLNWvWxOVylVgp7na7S6xSLxIaGlpiI9K8vDzf+KJf8/LyCAsLKzYmKirqkue2YsUKcnNzeeaZZ3C5vKuBH330UR544IFivdZFysIlPRV67xhMfGfs2TOQ+Ql2wwrslvWQm4Od/x52/nsQXh9zUxdMQiI0iFJRXURERAAV0kWuOeMKwMS0o1pkJKeOHLmsf4Ezxng3Hq3fCG4fgs0/Dds/9a5Wz/oETrlh42rsxtXezU0bNT2/YWmT5hct2IuIiEj5EBgYSNOmTcnKyqJjx44AeDwesrKy6Nu3b6mvadGiBZmZmfTr1893bMuWLTRv3hyA8PBwQkNDyczM9BXO8/Pz2bVrF3369LnkuZ05cwZjTLFCY9HvnbDqSMqfS30q1FSqDB06Yzp0xp75xptfb1gBmRvg6GFseio2PdX7NOhNXTAJXbw5uYiIiFRYKqSLlCMmuBp0SMR0SMR6PHBgNzbzE28LmH074cAe7IE92HmpUL0Gpk28d3V723hMtRr+nr6IiIhcof79+zN58mSaNm1KdHQ06enpnDlzhu7duwMwadIkatWqxbBhwwBISkpi/PjxzJkzh/j4eFauXMnu3bsZPXo04C12JyUlMWvWLCIjIwkPD2f69OmEhYWRkJDgu+6xY8f46quvOHbsGB6Ph3379gHeDaOqVKlC+/bteeedd3j99dfp27cv1lpmz55NQEAAbdq0KdM/I5Eil/tUqKlcBZPQBRK6YL/5Grt5HXbDSsj6xPs06Nzp2LnTvQtciorqEQ3L+K5ERETE34zVUpEScnNzKSgoKLPrGWOIjIzkyGWuVpbyoyxibE+5sVkbIesT7NaNkH/6OxNwQbOW51erN9Qjqlebfo6dTfF1PsXY+fwV46CgoKu20VFGRgYffPABbrebqKgoHnjgAd8K8/Hjx1O3bl0efvhh3/jVq1czffp0cnNziYyMZPjw4cTHx/vOW2tJTU1l0aJF5OfnExMTw4MPPkj9+vV9YyZPnszy5ctLzOXJJ5/0Fcq3bNnCu+++y8GDBzHG0KRJE5KTk2nRosVl3Z9ycLnafmyM7df52M1rvy2qb4Rz39kMt2GUt6h+UxdMvfoXfhO5pvRz7GyKr/Mpxs7nhBz8u1RIL4WSeLnayjrG9tw52L39/Gr1Q/uLDwit7d2wtP1NEBOLqVL1ms/J6fRz7GyKr/Mpxs7ntCTeiZSDy9V2NWNs87/CfvptUX3bJjh37vzJRk3PF9XrRvzIWcvl0M+xsym+zqcYO5/TcnC1dhFxIBMQAC3aYlq0hbvuwx7P9W5YmvUJbN8M7uPYjxdgP14AgYHesd+uVteKGhERERGR4kxwdUznXtC5F/b0l9hNa7w91bdvPt9ecdbb0Dja2/rlpi6Y2uH+nraIiIhcRSqki1QApnZdTPc7oPsd2IKzsCPLW1jP3AC5ObDtU+y2T7EzXoPw+udXqzdviwkK8vf0RURERESuG6ZaDUyX26DLbdgvT2E3rfYW1T/LhP27sPt3YWe+BU1afLtSPRFTS0+miIiIlHcqpItUMCaoErSNx7SNxyanwBeHsFu+Xa2evRWOHsYuPoxdPAcqV4FWsd7CetubMLXq+Hv6IiIiIiLXDVOjJubW2+HW2717Fm38tqienQV7s7F7s7HvvgHNYs4X1UNr+3vaIiIicgVUSBepwIwxENEQE9EQ+gzCfp0P2zd/u1r9E8g7AZ+u9faDBO+mSkUbljZt6W0hIyIiIiIimJqh+J4CzTuJ3bgKu/5j2LUddn+G3f0ZNvV1iG7lLap3SMSEhPl72iIiInKJVEgXER9TNRjib8HE3+LdBOLgnvOr1ffsgM/3YT/fh50/E4KrY9rGQ7sOmDYdMDVq+nv6IiIiIiLXBRMShunRD3r0w548fr6ovvsz2LkNu3Mbdvqr3r2KbkrExHfG1Az197RFRETkIlRIF5FSGWOgUTNMo2bQ/x5v/8etGyFzAzZrI+R/hV33Eaz7CGuMtwdk0Wr1Rk29rxcRERERqeBMWG1Mrzuh153YE7nYT74tqu/Nhh2Z2B2Z2Kn/gph23qL6jZ21SEVEROQ6pEK6iFwSU6MmplN36NQde+4c7N2BzfwEu2UDfL4X9uzA7tmBTfsvhNTCtI33bljaOg5TJdjf0xcRERER8TtTqy7mtoFw20DssS/OF9X37/K2WNy+Gfvff0JMLCahC+bGTphqNfw9bREREUGFdBG5AiYgAKJbY6Jbw+B7sSeOYbM+wWZugO2bIe8EduUi7MpFEBAIzVufX60e0UCr1UVERESkwjN16mFuHwy3D8bm5mA3rMRu+BgO7IFtm7DbNmHf+Qe0ivMW1eNuxgRX9/e0RUREKiwV0kXkRzO16mBuvR1uvR1bUAA7s86vVj96GD7bgv1sC/bdN6BuBKZtB+9q9ZbtMEGV/D19ERERERG/MnUjMHfcBXfchf3iMHbDCuyGFfD5Psj6xLtoJSAQ2tzoLarH3uzd30hERETKjArpInJVmaAgaH0jpvWNcM8o7weBzA3e1erZWZCbg106D7t0HlSq5H1s9dvV6qZ2XX9PX0RERETEr0y9+ph+d0O/u7FHPsd+sgK7fgUcPgBb1mO3rMcGBkHbeMxNXTCxCWqlKCIiUgZUSBeRa8rUq4+pNwB6D8B+8zV8tvn8anX38fMfBgAaND6/Wr1pDCZQf0WJiIiISMVlIhti+idD/2TsoQPfrlT/GHIOwadrsZ+uxQZVgnYdMDd1xbS/CVO5ir+nLSIi4kiqUolImTFVqkJcJ0xcJ6y1cGgfdssGbOYnsPszOLQfe2g/9sNZULUaps2N3g8FbTtgaob6e/oiIiIiIn5jGjTCNBiGHfBTb968/tui+tEjsHE1duNqbKVKmHYJmISu0LYDpnJlf09bRETEMVRIFxG/MMZAwyaYhk0g6SfY019iszb6ekDy1ZfevpAbVmCNgcbR5zcsbdwM43L5+xZERERERMqcN4+OwjSMwg4aDgf3Yjd8jN2w0ttG8ZOV2E9WQuUqmPZFRfV47U0kIiLyI6mQLiLXBVOtBubmbnBzN6znHOzd+W1v9U/gwG7YtxO7byd2zjSoEXK+BUzrGzHB1fw9fRERERGRMmeMgUZNMY2aYgePgAO7seu/LaofP+r9/fqPoUpVTGxHb1G99Y3efY1ERETksqiQLiLXHeMKgGYxmGYxMOhnWPdxbNZG74al2z6FL/Owq5dgVy+BgABo1srbD7LtTVD/Bu8HChERERGRCsQUPcXZOBp71/2wN/vbnuor4eQx7Nrl2LXLoWowJu5mb1G9VSwmUEV1ERGRS6FCuohc90xobUyX26DLbdjCAti5DZv17YalOZ9DdhY2Ows78y2oHY5p18HbAqZle/WFFBEREZEKxxgDTVtimrbEDn0A9uzwFtU/WQnuE9jVS7Grl0JwNcyNnTA3dYWY9phAlQhEREQu5Ir+L5mRkcGcOXNwu900btyYkSNHEh0dfcHxq1evZsaMGeTm5hIREcHw4cOJj4/3nbfWkpqayuLFizl9+jQxMTGMGjWKyMhIAI4ePcp7771HVlYWbrebWrVq0bVrV4YMGULgd/5Hv3//fl5//XV2795NzZo16du3LwMHDrySWxSR65QJDPKunGkVCz8Zic3N+bYFzAb4LNP7COuy+dhl8yGoErRs9+1q9Q6YuhH+nr6IiIiISJkyLhdEt8JEt8Le/SDs2u4tqm9cBXknsSsXY1cuhuo1MDfegrmpizeHDgjw99RFRESuK5ddSF+1ahVvv/02KSkpNG/enHnz5jFhwgT++te/EhISUmL8jh07ePnllxk2bBjx8fGsWLGCF198kYkTJ9KoUSMA0tLSmD9/Pg8//DDh4eHMmDGDCRMm8NJLL1GpUiUOHz6MtZbRo0cTERHBwYMHmTJlCt988w0jRowAID8/n2eeeYZ27dqRkpLCgQMHeOWVV6hWrRq9e/f+kX9MInK9MnUjMD37Q8/+2DNn4LMt2KwN3tXqJ3J9m5dagMgbzq9Wj26lx1hFREREpEIxLhe0aINp0QabPMr7pOeGFdhPVnnbJ368APvxAu+eRPHfFtVbtPG2XhQREangLruQPnfuXHr16kWPHj0ASElJYePGjSxdupRBgwaVGJ+enk5cXBwDBgwAIDk5mczMTDIyMhg9ejTWWtLT0xkyZAgJCQkAjB07lpSUFNavX09iYiJxcXHExcX53rNevXocPnyYBQsW+ArpK1asoLCwkDFjxhAYGMgNN9zAvn37mDt3rgrpIhWEqVwZYhMwsQnYYRYOH8RmrveuVt+1HY4cxB45iF0wG6pU9W60VLRaPSTM39MXERERESkzxhXgXXnesh02ebS3XWLRSvUv87DLM7DLM6BmKKZDZ29RPbq1txgvIiJSAV1WIb2wsJA9e/YUK5i7XC7atWtHdnZ2qa/Jzs6mf//+xY7Fxsayfv16wNu2xe120759e9/54OBgoqOjyc7OJjExsdT3zc/Pp3r16sWu06pVq2KtXmJjY0lLS+Orr74qNrZIQUEBBQUFvq+NMVStWtX3+7Ly/9m79/ic6/+P44/3Zwc2zOawNmQzsw05NJGonEqFIkm++nbGtxDfvh2/OtCB0rm++lbf6pv8+jolEqGDQyUSEZvYnOYshm2xsPm8f39cdtVsZMWu7fK8325uXJ/r/bk+r2uva/O+Xntfr3fBtbRBov9SjkufMQbqxHj+XNULm3sAu3rFsTYwy+HnLFi+CLt8kWe1ekw8pkkLnKYtITa+xKtulGP/pvz6P+XY/ynHIiInZgICvO0T7V/+Bmkpx4rqiyEnCzt/Fnb+LKhaDXNBW8wFbSEuSUV1ERE5q5SokJ6Tk4PruoSHhxc6Hh4ezo4dO4o9Jysrq0jLl6pVq5KVleW9v+DYicYcb9euXcyePZubbrqp0HUiIyOLxFVwX3GF9GnTpjFlyhTv7Xr16jF69Ghq1qxZ7HXPtKgo9W/2d8qxj9VvANf0xrouR9av4dDShRxa9g1H0n+Ezeuxm9dzdOYknLBwKlzQhpAL2lIx+SKcKmEnfVh79CiHV6/g4NofCK9WgwqNz1dPST+l72H/pxz7P+VYROTkTGAgND4f0/h87I13wppVnqL6im8hex927gzs3BkQUQPToqConqhfVIqIiN8rd1ty79u3j5EjR3LRRRf96ZYt1157baHV8gX/8e/Zs4f8/Pw/9dglYYwhKiqKXbt2Ya0ttetK6VGOy6Aq1aDjNdDxGgKy93v6qKcsw65egZuTRe68WeTOmwXGgfgknCYXeHqr14kt9CbB/X4R7sT/wP69vz52RHWcPgNwWrTxwROTM0Hfw/5POfZ/vspxYGCgzxZpiIj8WSYwCJq0wDRpgf3rQPjxB09R/YdvYX8m9ovp2C+mQ7WamAsu9rR/iY1XUV1ERPxSiQrpYWFhOI5TZKV4VlZWkVXqBcLDw8nOzi50LDs72zu+4O/s7GwiIiIKjYmNjS103r59+3j88cdJTExkwIABRa5TXFy/vcbxgoKCCAoqfrNBX7yJttbqzbufU47LqLBwTJtOmDadsPn5sGHtsd7q38OOLbDuR9x1P8LUcZ6VN8c2LLWHD2HffqHo4+3fi/v603DXQ5hkFdP9ib6H/Z9y7P+UYxGRP8YEBf26H1HeEVi9HLv0G+zK72DfHuxn07CfTYMa5/xaVK8bp6K6iIj4jRIV0gMDA4mLiyM1NZVWrVoB4LouqampXHnllcWek5CQQEpKCl27dvUeW7VqFQ0aNAAgMjKS8PBwUlJSvIXz3Nxc1q9fT+fOnb3nFBTR69Wrx8CBA3GO68WWkJDAhAkTyM/P9/ZJX7VqFbVq1Sq2rYuISHFMYCAknodJPA963YbN/MmzWn3VMkhb5Vl589Wn2K8+/d3Hcie+jdP8whL3WxcRERERKctMUDA0b41p3hp75DCkfo9ddqyonvkTds6H2DkfQmT0r0X14z7ZKSIiUt6UuLVLt27deO2114iLiyM+Pp5Zs2Zx+PBh2rdvD8CYMWOoVq0affv2BaBLly6MGDGCGTNmkJyczDfffMOGDRu8K8qNMXTp0oWpU6cSHR1NZGQkEydOJCIigpYtWwKeIvqIESOoWbMmN998Mzk5Od54ClabX3zxxXzwwQe88cYbdO/ena1btzJ79mxuueWWP/P1EZGznKlxDqZ9F2jfxfMmIS3Vs1r9+0WQk3Xyk/dnwrofIbFJaYQqIiIiIlLqTHAFSG6DSW6DPXwIUpbhLl0IKctg907srA+wsz6AqNreorqpHePrsEVEREqsxIX0Nm3akJOTw+TJk8nKyiI2NpZhw4Z5C9qZmZmFfsucmJjIkCFDmDhxIhMmTCA6Opr777+funXresd0796dw4cP8+abb5Kbm0tSUhLDhg0jODgY8Kws37VrF7t27eLOO+8sFM/kyZMBCA0N5ZFHHuGdd97hoYceokqVKlx33XV/uo+6iEgBE1zB2yPSrd+w+LYux7FZ+9C6GxERERE5G5gKFeGCiwm44GLsoV+wq5Zily6E1O9h13bszEnYmZMg+lxPQb3lJZjoOr4OW0RE5JQYqyaRRezZs4e8vLxSu54xhujoaHbu3KmenX5KOfY/Ni0F9/mHf3ecc99IjFakl3v6HvZ/yrH/81WOg4KCTttmo3PmzGHGjBlkZWURExPD7bffTnx8/AnHL168mEmTJrFnzx6ioqK48cYbSU5O9t5vrWXy5MnMnTuXgwcPkpSURL9+/YiOjvaOmTp1KsuXLycjI4PAwEDGjh1b7LUWLFjAzJkz2blzJyEhIbRu3Zp+/fqV6PlpDi6nm3JcdthfcrErv8MuWwirl0N+/q931o75daV6VO0SPa5y7N+UX/+nHPs/f5iD/1aJV6SLiAjQoBFEVIf9e088xnGwToBWpIuIyJ+2aNEixo0bR//+/WnQoAGffPIJI0eO5OWXX6Zq1apFxqelpfHKK6/Qt29fkpOTWbhwIc899xyjR4/2fjJ0+vTpzJ49m0GDBhEZGcmkSZMYOXIkL774oveTofn5+bRu3ZqEhATmzZtXbGwzZ85kxowZ3HTTTcTHx3P48GH27Nlz5r4YIlLumJBQTOv20Lo9NvcA9odjRfUfV8D2zdjtm7HT/wfn1vu1qB4ZfdLHtO5R7Lo1HExbiWsdaNBQexOJiMgZpUK6iMgfYJwAnD79cV9/5sSDXBf73DDcrtdjut7g2chURETkD5g5cyadOnWiQ4cOAPTv35/ly5czf/58evToUWT8rFmzaN68Oddccw0Affr0ISUlhTlz5jBgwACstebfxTMAAMA4SURBVMyaNYuePXt69yUaPHgw/fv3Z+nSpbRt2xaA3r17A54V58U5cOAAEydO5MEHH6RJk18/gRUTc+L+x3l5eYVWnhtjCAkJ8f67tBRcS5sf+i/luGwylapA207QthP2wM/YH5Zgl36NXfMDbN2E3boJO+3/ICYe54KLMS0vxtQ4p9BjuN8vwp34H9i/l30FByOq4/QZgNOiTWk/JTlD9D3s/5Rj/+dvOVZVR0TkDzLJbXDuegh34luFV6ZH1MBcexP8uAL77QJPL8jU5Th33IOJUg9IEREpmfz8fDZu3FioYO44Dk2aNCE9Pb3Yc9LT0+nWrVuhY82aNWPp0qUA7N69m6ysLJo2beq9PzQ0lPj4eNLT072F9N+zatUqrLXs27ePe+65h19++YWEhARuvvlmatSoUew506ZNY8qUKd7b9erVY/To0Wfk47enIioqyifXldKjHJdl0dAgAa6/iaPZWfyyeD65X3/O4VXLYPN63M3r4cOxBCc0JuSSywm9+DKOrPuRva8/XfSh9u/Fff1pIoY9S2jbjqX/VOSM0few/1OO/Z+/5FiFdBGRP8Ekt8FpfiGsW0O4ccn67cdKL+qA27QV9v1/Q8Y63Cf/jrn+dky7q/zmt7EiInLm5eTk4Lou4eHhhY6Hh4ezY8eOYs/Jysoq0vKlatWqZGVlee8vOHaiMadi9+7duK7LtGnTuPXWWwkNDWXSpEk89dRTPP/88wQW82msa6+9tlCRv+D/xD179pD/277JZ5gxhqioKHbt2qW+rH5KOS6HmrWGZq0JyMnCLl+MXbYQm5bKkfTVHElfTfY7L0PAycsYe19/lqzYBLV58QP6HvZ/yrH/81WOAwMD1SNdRKQsMk4AJqkJlaKjyTluAw2n5cXY+Ia4774Ma1Zi//cGdtUynFvuxlSN8F3QIiIip4Hruhw9epTbbruNZs2aATB06FD69+9PamoqzZs3L3JOUFAQQUFBxT6eL95EW2v15t3PKcflUJWqmHZXYtpdic3ej12+yNNTPX01HP2dX7jtz8Smr4bEJicfJ+WGvof9n3Ls//wlx46vAxAR8XcmojrO3x/H3NAPAoMgZRnuiLuxK771dWgiIlIOhIWF4ThOkZXiWVlZRVapFwgPDyc7O7vQsezsbO/4gr9PNuZURER4filcp86vrcvCwsIICwsjMzPzlB9HRORETNUInA5dCbj/aUzfv53SOTZr3+8PEhERKSEV0kVESoFxHJzLrsF55CU4tx4cyMH99yjcsa9gD+X6OjwRESnDAgMDiYuLIzU11XvMdV1SU1NJSEgo9pyEhARSUlIKHVu1ahUNGjQAIDIykvDw8EJjcnNzWb9+/QkfsziJiYkAhVrMHDhwgJycHJ/1PBcR/2Vq1T21ceHVznAkIiJyNlIhXUSkFJnadXGGPY+58jowBvvNXNzHh2LX/+jr0EREpAzr1q0bc+fOZcGCBWzbto23336bw4cP0759ewDGjBnD+PHjveO7dOnCypUrmTFjBtu3b2fy5Mls2LCBK6+8EvD0q+zSpQtTp05l2bJlbNmyhTFjxhAREUHLli29j5OZmUlGRgaZmZm4rktGRgYZGRkcOnQIgFq1anHBBRcwduxY0tLSvI9Tu3ZtGjduXHpfIBE5OzRoBBHVTz4mtBI2vmHpxCMiImcV9UgXESllJjAIc90t2CYtcP/7MmT+hPvsMMxVvTBX98EUszGbiIic3dq0aUNOTg6TJ08mKyuL2NhYhg0b5m3DkpmZWWgj68TERIYMGcLEiROZMGEC0dHR3H///dSt++tqzu7du3P48GHefPNNcnNzSUpKYtiwYQQHB3vHTJo0iS+//NJ7+4EHHgBg+PDh3kL54MGDee+993jmmWcwxtCoUSOGDRtW7EajIiJ/hnECcPr0x339mRMPyj2Iff0Z7C1DMFXCSi84ERHxe8b6Q6f302zPnj3k5eWV2vWMMURHR7PzuE0KxX8ox/7vj+bY5h7ETvwPdvF8z4GYeJw77sFEn3uGIpU/Qt/D/k859n++ynFQUJBanJwizcHldFOO/Zddvgh34luwf++vByNqQKPmsGQB5OdD1Wo4t/8d06i5j6KUP0vfw/5POfZ//jYH1zIREREfMqGVMLffg23WCvf//g2b1+M+eQ+m162YDl0LrS4UEREREREwyW1wml8I69YQblyyrAMNGmKcAGynq3Hfeh52bsV96THMFddievwVExjk67BFRKScU490EZEywLRoizPiVWh8PuQdwU74D+4rI7BZe3/3XBERERGRs41xAnCSmlCp/ZU4SU0wToDn+Ln1cB5+EdPOsyeE/XQa7jMPYndt92W4IiLiB1RIFxEpI0x4dZyhIzB/GQBBwbB6Be6IIdjvF/k6NBERERGRcsNUqIDz14E4A4dBpSqeT30+dQ/uN1+ofYSIiPxhKqSLiJQhxhicjt1wHn0J6sbBwZ9x33gG978vY3/J9XV4IiIiIiLlhjm/Nc7wVyGxCRw+hB37KvY/z2FzD/g6NBERKYdUSBcRKYNM9Lk4/3wOc1UvMA528Tzcx4dg01f7OjQRERERkXLDRFTH+ccTmJ43Q0AAdtlC3MeHYtf96OvQRESknFEhXUSkjDKBQTg9b8a5fxTUOAf27sZ9fhju1Pew+Xm+Dk9EREREpFwwTgDOVb1wHhwNNaNg3x7c54bhfjwee/Sor8MTEZFyQoV0EZEyzjRohPPYK5i2ncBa7OwPcZ++H7tji69DExEREREpN0y9BJzHXsZc1AGsi50xEfe5f2Izf/J1aCIiUg6okC4iUg6YkFCcW4fi3PUQVK4CWzbiPvUP3LkzsK7r6/BERERERMoFUzEU5/Z7MP3uhZBQ2LAW94mhuN995evQRESkjFMhXUSkHDHJbXCG/wvOS4a8I9iJb+G+MgK7f6+vQxMRERERKTecC9vhPPoy1E+CX3Kxbz2P++4r2EO5vg5NRETKKBXSRUTKGRNeDWfIcEzfOyE4GH78AXfE3bhLF/o6NBERERGRcsPUjMK5/2lMtz5gHOyiubhP3oPdtM7XoYmISBmkQrqISDlkjMHp0AXnkZchJh5yD2D/8yzuOy9icw/6OjwRERERkXLBBATgdO+Lc99IqFYDdu/EHf0A7pwP1UJRREQKUSFdRKQcM9F1cB56FtO1t2cVzbcLcB8fgk1P9XVoIiIiIiLlhklojPPYq9CiDRw9iv3wPdyXHlMLRRER8VIhXUSknDOBgTg9/orzwNNQMwr27cF9/mHcKWOxeXm+Dk9EREREpFwwlSrj/O1BzC13Q3AFWLsK94kh2B++9XVoIiJSBqiQLiLiJ0x8Q5zHXsZcfDlYi/10Ku6o+7DbN/s6NBERERGRcsEYg3Px5TiPvgR168OBn3FfG4X7v9exRw77OjwREfEhFdJFRPyIqRiKc8vdOAOHQeUw2LYJ96l/4H4+XT0eRUREREROkYk61kKx87UA2AWzcZ/6B3bbJh9HJiIivqJCuoiIHzLnt8YZ8S9ocgHk52Env4P78nDsvkxfhyYiIiIiUi6YoCCc62/DuedxqBoBO7fijrwPd+5MrLW+Dk9EREqZCukiIn7KVI3AuftRzF8Heno8rlmJ+/jduN995evQRERERETKDdPofJzhr0LTlp5FKhP/g/uvJ7E5Wb4OTURESpEK6SIifswYg9PuSpxHX4bYBpB7EPvW87hvvYDNPeDr8EREREREygVTpSrO4EcwfxkAgUGQsgz38SHY1St8HZqIiJQSFdJFRM4CJqo2zoOjMd36gONgv/vSM/Ffu8rXoYmIiIiIlAvGGJyO3XAefgFq1YWcLNyXh+N+8F9sXp6vwxMRkTMs8I+cNGfOHGbMmEFWVhYxMTHcfvvtxMfHn3D84sWLmTRpEnv27CEqKoobb7yR5ORk7/3WWiZPnszcuXM5ePAgSUlJ9OvXj+joaO+YqVOnsnz5cjIyMggMDGTs2LFFrrN+/XrGjx/Pxo0bMcYQHx/PjTfeSGxs7B95miIifsUEBmK698Wel4z7zouwZxfui49iLu+O6XETJijI1yGKiIiIiJR5pk4szsMvYKe8i50/C/vZR9i1q3D634eJquPr8ERE5Awp8Yr0RYsWMW7cOHr16sXo0aOJiYlh5MiRZGdnFzs+LS2NV155hY4dOzJ69GhatmzJc889x5YtW7xjpk+fzuzZs+nfvz+jRo2iQoUKjBw5kiNHjnjH5Ofn07p1azp37lzsdQ4dOsSoUaOoUaMGo0aN4oknnqBixYqMHDmS/Pz8kj5NERG/Zeon4Tz2CubSK8Ba7Gcf4Y78B3Zbhq9DExEREREpF0xwBZy+d+IMehgqV4EtG3GfvAf368+0EamIiJ8qcSF95syZdOrUiQ4dOlCnTh369+9PcHAw8+fPL3b8rFmzaN68Oddccw116tShT58+xMXFMWfOHMCzGn3WrFn07NmTli1bEhMTw+DBg9m/fz9Lly71Pk7v3r3p1q0bdevWLfY627dv58CBA/Tu3ZtatWpx7rnncv3115OdnU1mZmZJn6aIiF8zFUNwbhqEM/gRqFIVtm/GHfkP3M+mYV3X1+GJiIiIiJQLpvmFno1IGzaDI4ex48bgvjkae1D7EYmI+JsStXbJz89n48aN9OjRw3vMcRyaNGlCenp6seekp6fTrVu3QseaNWvmLZLv3r2brKwsmjZt6r0/NDSU+Ph40tPTadu27SnFVqtWLapUqcK8efPo2bMnrusyb948ateuTc2aNYs9Jy8vj7zf9DEzxhASEuL9d2kpuFZpXlNKl3Ls/8prjk3zCzFxibjv/Qu78jvsB+9CyveY24Ziqkf6Orwyo7zmV06dcuz/lGMRETlTTHh1nL8/jv38I+y0/4PvF+FuSse54x+YhPN8HZ6IiJwmJSqk5+Tk4Lou4eHhhY6Hh4ezY8eOYs/JysqiatWqhY5VrVqVrKws7/0Fx0405lSEhIQwfPhwnnvuOT788EMAoqOjefjhhwkICCj2nGnTpjFlyhTv7Xr16jF69OgTFt7PtKioKJ9cV0qPcuz/ymWOo6OxI1/j4KcfkfWfF7BrV+E+MZSIgQ9Rqf2Vvo6uTCmX+ZUSUY79n3IsIiJngnEczBU9sYlNcN96HnbvxH3+EUyXXphufTCBf2iLOhERKUP85if5kSNHeOONN0hMTGTo0KG4rsuMGTN45plnePrppwkODi5yzrXXXltotXzBCqU9e/aUal91YwxRUVHs2rVLvdT8lHLs//wix81a4zz2CkffeRG7MY19zz3C/i8/w7nxLkylyr6Ozqf8Ir9yUsqx//NVjgMDA322SENEREqfiW2A8+jL2In/wX4zF/vJZOyalTj97sXU1C9zRUTKsxIV0sPCwnAcp8hK8aysrCKr1AuEh4cX2Yg0OzvbO77g7+zsbCIiIgqNiY2NPeXYFi5cyJ49e3jqqadwHE/r96FDh3LbbbexdOnSYlvEBAUFERQUVOzj+eJNtLVWb979nHLs/8p9jiOjcR54BjvrA+zMidjvvuLouh9xbhuKadjM19H5XLnPr/wu5dj/KcciInKmmYohmFuH4jZOxv7fv2FjGu6Tf8fceBfOhe18HZ6IiPxBJSqkBwYGEhcXR2pqKq1atQLAdV1SU1O58sriP/6fkJBASkoKXbt29R5btWoVDRo0ACAyMpLw8HBSUlK8hfPc3FzWr19P586dTzm2w4cPY4wp1Pey4N96syQicupMQADm6j7Y85Jx334Rdu/AffFRzGXdMT1vwgQV/YSPiIiceXPmzGHGjBlkZWURExPD7bffTnx8/AnHL168mEmTJrFnzx6ioqK48cYbSU5O9t5vrWXy5MnMnTuXgwcPkpSURL9+/YiOjvaOmTp1KsuXLycjI4PAwEDGjh17wuv9/PPP3H///ezbt493332XSpUqnZbnLSJSXjktL8HWS8B950VYvwb79gu4qcsxff+GCQn1dXgiIlJCTklP6NatG3PnzmXBggVs27aNt99+m8OHD9O+fXsAxowZw/jx473ju3TpwsqVK5kxYwbbt29n8uTJbNiwwVt4N8bQpUsXpk6dyrJly9iyZQtjxowhIiKCli1beh8nMzOTjIwMMjMzcV2XjIwMMjIyOHToEABNmzbl4MGDvPPOO2zbto2tW7fy73//m4CAABo3bvxnvkYiImclUy8B57GXMe08P6/tF9Nxn/oHdusmH0cmInL2WbRoEePGjaNXr16MHj2amJgYRo4cWeSTnwXS0tJ45ZVX6NixI6NHj6Zly5Y899xzbNmyxTtm+vTpzJ49m/79+zNq1CgqVKjAyJEjOXLkiHdMfn4+rVu3PqUFLq+//joxMTF//smKiPgRU+McnPtGYa7+CxgH++183Cf/jt2U7uvQRESkhErcI71Nmzbk5OQwefJksrKyiI2NZdiwYd4WLZmZmYVWhScmJjJkyBAmTpzIhAkTiI6O5v7776du3breMd27d+fw4cO8+eab5ObmkpSUxLBhwwr1NZ80aRJffvml9/YDDzwAwPDhw2ncuDG1a9fmwQcf5IMPPuCRRx7BGEO9evUYNmxYoZYxIiJy6kyFipi/DsQ2bYk79lXYsQV35L2YHjdiOvfAOMVv5iwiIqfXzJkz6dSpEx06dACgf//+LF++nPnz59OjR48i42fNmkXz5s255pprAOjTpw8pKSnMmTOHAQMGYK1l1qxZ9OzZ07t4ZfDgwfTv379QW8TevXsDsGDBgpPG99lnn5Gbm0uvXr1YsWLFScfm5eWRl5fnvW2MISQkxPvv0lJwrdK8ppQu5dj/lZccm8BA6N4X26g5R99+Afbswh39IE73GzFX9tSc+gTKS37lj1OO/Z+/5fgPbTZ65ZVXnrCVy4gRI4ocu+iii7joootO+HjGGG644QZuuOGGE44ZNGgQgwYNOmlcTZs2pWnTpicdIyIiJWeatsR5fAzuuDHwwxLsh+9hU5bh3H4Ppnqkr8MTEfFr+fn5bNy4sVDB3HEcmjRpQnp68Ssa09PT6datW6FjzZo1Y+nSpQDs3r2brKysQnPn0NBQ4uPjSU9PL3Z/oRPZtm0bU6ZMYdSoUfz000+/O37atGlMmTLFe7tevXqMHj3aZ5uyRkVp8z9/pxz7v3KT4+ho3ORW7HttFL989Tnu1HFUWP8j1e59nMAa5/g6ujKr3ORX/jDl2P/5S47/UCFdRETOPqZKVZyBw7ALP8dOehvSV+M+PgTzl79hWrf3m98wi4iUNTk5Obiu6/0EaIHw8HB27NhR7DlZWVlUrVq10LGqVauSlZXlvb/g2InGnIq8vDxeeeUV/vrXv1KjRo1TKqRfe+21hYr8Bf9/7Nmzh/z8/FO+9p9ljCEqKopdu3ZpTyU/pRz7v/KaY3vT3Tj1G+GOf5PDq5axc2AfnFvuxkk+8QLEs1F5za+cOuXY//kqx4GBgWdkkYYK6SIicsqMMZhLOmMTm+D+9yXYsBb735dg5Xdw00BMpSq+DlFERErR+PHjqV27NpdeeukpnxMUFERQUFCx9/niTbS1Vm/e/Zxy7P/KY45Nm0449RvivvU8bF6P++9R2EuvxPS+A1Ohgq/DK1PKY36lZJRj/+cvOVYhXURESsxERuPc/zR29hTszInY77/BbliDc9tQTKPzfR2eiIhfCQsLw3GcIivFs7KyiqxSLxAeHl5kI9Ls7Gzv+IK/s7OzC+0nlJ2dTWxs7CnHlpqaypYtW/j222+BXwvhd9xxBz179vT2WBcRkaLMObVwHhqNnT4e++lU7FdzsOmpOAPux5xbz9fhiYjIcVRIFxGRP8QEBGC63YA9Lxn3nRdh13bcl4ZjOl2N6XkzJlgraURETofAwEDi4uJITU2lVatWALiuS2pq6gn3LUpISCAlJYWuXbt6j61atYoGDRoAEBkZSXh4OCkpKd7CeW5uLuvXr6dz586nHNu9997LkSNHvLc3bNjA66+/zhNPPME556jfr4jI7zGBQZjrbsE2ao77zkuwaxvuqHsx193qmVerfaKISJnh+DoAEREp30xsA5xHXsa07wKAnTsD96l/YLds8G1gIiJ+pFu3bsydO5cFCxawbds23n77bQ4fPkz79u0BGDNmDOPHj/eO79KlCytXrmTGjBls376dyZMns2HDBm/h3RhDly5dmDp1KsuWLWPLli2MGTOGiIgIWrZs6X2czMxMMjIyyMzMxHVdMjIyyMjI4NChQ4Bn46i6det6/0RGejagrl27dpH+6yIicmKmYTOc4a9Cs1aQn4+d9Dbuq09gc/b7OjQRETlGK9JFRORPMxUqYG68E9u0Je57r8LOrbij7sd074u54lqME+DrEEVEyrU2bdqQk5PD5MmTycrKIjY2lmHDhnlbtGRmZhZatZiYmMiQIUOYOHEiEyZMIDo6mvvvv5+6det6x3Tv3p3Dhw/z5ptvkpubS1JSEsOGDSM4ONg7ZtKkSXz55Zfe2w888AAAw4cPp3Hjxmf4WYuInF1MlTCcQQ9jv5yNnfxfSP0ed8QQnNv/jjmvha/DExE56xnrD53eT7M9e/aQl5dXatczxhAdHc3OnTv9ovG+FKUc+z/l+Ff25xzc91+D5Ys9B+IbeSb/NaN8G9ifoPz6P+XY//kqx0FBQdSsWbPUrleeaQ4up5ty7P/8Ocd2+2bPRqTbNwNgLrsG0/MWzAk2a/ZH/pxf8VCO/Z+/zcHV2kVERE4rUyUM586HMLcOhQohsP5H3CeG4i6aq8mRiIiIiMgpMLVjcIY9j+nYDQD7xce4o+7D7tzq48hERM5eKqSLiMhpZ4zBadsJZ/grEN8QDv2CffcV3DdGYw/k+Do8EREREZEyzwRXwPnLAJzBj0LlMNi2Cfepe3C/mqMFKiIiPqBCuoiInDGmZhTO/aMwPf4KAQGwfBHuiCHY1OW+Dk1EREREpFwwzVp6NiJt1ByOHMH+379xX39aC1REREqZCukiInJGGScAp2tvnH8+B1F1IHsf7isjcMe/iT182NfhiYiIiIiUeSa8Gs7QEZjrb4OAQFjxLe7jQ7FpKb4OTUTkrKFCuoiIlAoTE4/zyEu/9nmc/wnuU/dgN6/3cWQiIiIiImWfcRycztd6FqicUxuy9uK+8AjutP/D5uf7OjwREb+nQrqIiJQaU+FYn8ehI6BqNdi1Dffp+3E/mYx1j/o6PBERERGRMs/E1Md55EXMxZeDtdhZH+A++xB2905fhyYi4tdUSBcRkVJnzkvGGfEqtGgDR49iP3of99l/Yvfs8nVoIiIiIiJlnqkYgnPL3Th/ewBCK8GmdNwn/o67eL6vQxMR8VsqpIuIiE+YymE4f3sQc9vfoWIIbFiL+/hQ3IWfY631dXgiIiIiImWeueBinMdehQaN4PAv2P++hPv2C9hfcn0dmoiI31EhXUREfMYYg9OmI87wVyH+2OT/vX/h/vtp7M/Zvg5PRERERKTMM9Vr4tw3EtO9LzgOdsmXuE8MxW5Y6+vQRET8igrpIiLic6bGOTj3j8T0vAUCAuGHb3FH3I1NWebr0EREREREyjzjBOB064Nz/9NQPRIyf8J99iHcmZO0F5GIyGmiQrqIiJQJxgnAueo6nGHPQfS5kJOF++oTuP97HXv4sK/DExEREREp80x8Q5zHXsG0uhRcFzv9f7gvPILdt8fXoYmIlHsqpIuISJli6tbHeeRFTKerAbALZuM++XfspnU+jkxEREREpOwzoZUw/e717EVUIQTSV+M+PgT7/SJfhyYiUq6pkC4iImWOCa6A06c/zj2PQ3g1+Gk77ugHcGdOxB7VR1NFRERERE7GuxfRYy9BbAPIPYj7xjO448ZgDx/ydXgiIuWSCukiIlJmmUbn44z4F+aCi+HoUez08bjPPoTdvdPXoYmIiIiIlHkmshbOg6MxV/UCY7Bff4b71D3YLRt8HZqISLmjQrqIiJRpplIVzID7MXfcAyGhsDEN94mhuF9/hrXW1+GJiIiIiJRpJjAQp+fNOP94EsKrw67tuKPux/3sI6zr+jo8EZFyQ4V0EREp84wxOK074Ax/FRLOg8OHsOPG4L42EpuT5evwRERERETKPJPUFGf4K9C8NRzNx37wX9xXHsdm7/d1aCIi5YIK6SIiUm6Y6pE49z6J6XUrBATCyu9wR9yNXbnU16GJiIiIiJR5pnIYzsB/Yv46EIKD4ccVno1IU5b5OjQRkTJPhXQRESlXjBOAc0VPnIdfgFp14eds3DFP4v7fa9o4SURERETkdxhjcNpdifPwi1An1jOffvUJ3IlvYfOO+Do8EZEyS4V0EREpl8y59XAeeRFzWXcA7Fef4j4xFLsxzceRiYiIiIiUfaZWXZxhz2M6XQ2AnTsDd+S92O1bfByZiEjZpEK6iIiUWyYoGOeGOzwbJ0XUgN07cUc/iPvxeOzRo74OT0RERESkTDNBwTh9+uMMeQyqVIXtm3FH/gN3wSystb4OT0SkTFEhXUREyj3TsBnO8FcxrS4F18XOmIg7+kHsTzt8HZqIiIiISJlnmlyAM/xVaHw+5B3B/u8N3H+Pwv6c4+vQRETKDBXSRUTEL5hKlXH634fpdy+EVIJN6bhPDMX9co5W04iIiIiI/A5TNQJnyHDMDXdAYCD8sAT3iSHYNSt9HZqISJkQ+EdOmjNnDjNmzCArK4uYmBhuv/124uPjTzh+8eLFTJo0iT179hAVFcWNN95IcnKy935rLZMnT2bu3LkcPHiQpKQk+vXrR3R0tHfM1KlTWb58ORkZGQQGBjJ27Nhir7VgwQJmzpzJzp07CQkJoXXr1vTr1++PPE0RESmHnAvbYeMb4b77MqSlYN//N3bVUpxbBmPCInwdnoiIiIhImWUcB3NZd2zCebhvPQ+7tuO+9Bjmip6Y7jdiAv9QGUlExC+UeEX6okWLGDduHL169WL06NHExMQwcuRIsrOzix2flpbGK6+8QseOHRk9ejQtW7bkueeeY8uWXzevmD59OrNnz6Z///6MGjWKChUqMHLkSI4c+XW36Pz8fFq3bk3nzp1PGNvMmTOZMGECPXr04IUXXuDRRx+lefPmJX2KIiJSzpnqNXH+8STm+ts8q2lWLcUdMQT7wxJfhyYiIiIiUuaZuvVxHnkJc+kVYC12zoee1om71TpRRM5eJf5V4syZM+nUqRMdOnQAoH///ixfvpz58+fTo0ePIuNnzZpF8+bNueaaawDo06cPKSkpzJkzhwEDBmCtZdasWfTs2ZOWLVsCMHjwYPr378/SpUtp27YtAL179wY8K86Lc+DAASZOnMiDDz5IkyZNvMdjYmJO+Fzy8vLIy8vz3jbGEBIS4v13aSm4VmleU0qXcuz/lOOyxwQEwBU9sY2TOfrWC7A9A/e1kZhLOuPc0A9TMeTUH0v59XvKsf9TjkVERErGVKiIuWkQttH5uOPGQMY63CfuwfQdgLmoo/5PFZGzTokK6fn5+WzcuLFQwdxxHJo0aUJ6enqx56Snp9OtW7dCx5o1a8bSpUsB2L17N1lZWTRt2tR7f2hoKPHx8aSnp3sL6b9n1apVWGvZt28f99xzD7/88gsJCQncfPPN1KhRo9hzpk2bxpQpU7y369Wrx+jRo6lZs+YpXfN0i4qK8sl1pfQox/5POS6DoqOxzceTPe51fp72PvbrzzDrf6TavU9QoWHT3z//N5Rf/6cc+z/lWEREpGRMizY49RrgvvMSpKdi330FUpfDX+/ChFb2dXgiIqWmRIX0nJwcXNclPDy80PHw8HB27Cj+4z1ZWVlUrVq10LGqVauSlZXlvb/g2InGnIrdu3fjui7Tpk3j1ltvJTQ0lEmTJvHUU0/x/PPPE1hMH69rr722UJG/4Lepe/bsIT8//5Sv/WcZY4iKimLXrl3aEM9PKcf+TzkuB7r0xolriPvfF8nfuY3d9/fDdL0ep1uf3+31qPz6P+XY//kqx4GBgadtkUZZ3KcoIyODjz76iLS0NHJycoiMjOTyyy+nS5cup+U5i4hI2WCq1cS590ns7A+xH4/HLv0auzENp9+9mPiGvg5PRKRU+M0uEa7rcvToUW677TaaNWsGwNChQ+nfvz+pqanF9koPCgoiKCio2MfzxZtoa63evPs55dj/Kcdlm0k8D2f4q9jxb2KXfImdOYmjqctx7rgHE1Xnd89Xfv2fcuz/ymuOC/Yp6t+/Pw0aNOCTTz5h5MiRvPzyy0UWpMCv+xT17duX5ORkFi5cyHPPPcfo0aOpW7cu8Os+RYMGDSIyMpJJkyYxcuRIXnzxRYKDg4Ff9ylKSEhg3rx5Ra6zceNGqlatyt1330316tVJS0vjP//5D47jcOWVV57ZL4qIiJQq4wRguvbGJjXFffsFyPwJ97l/Yrr1wXS53tNaUUTEj5WokB4WFobjOEVWimdlZRVZpV4gPDy8yEak2dnZ3vEFf2dnZxMREVFoTGxs7CnHVnBunTq/FkLCwsIICwsjMzPzlB9HRET8mwmtjOl3L26zVtj3/+3p9fjk3zHX345pd5V6PYpImVRW9ynq2LFjodvnnHMO6enpLFmy5ISFdO1TJKVFOfZ/yrFvmPiGmOGv4v7vdey3Czwr1Nf8QEC/ezHVI0/fdZRfv6cc+z9/y3GJCumBgYHExcWRmppKq1atAM9K8NTU1BNOlBMSEkhJSaFr167eY6tWraJBgwYAREZGEh4eTkpKirdwnpuby/r16+ncufMpx5aYmAjAjh07qF69OuDZgDQnJ8dnPc9FRKTsclpegq3fEHfsK7BmJfZ/b2BXLcO55W5M1YjffwARkVJSlvcpKk5ubi6VK5+4Z672KZLSphz7P+XYRx59noPzZrH/36Ox637EfWIo1e5+mNBLLj+tl1F+/Z9y7P/8Jcclbu3SrVs3XnvtNeLi4oiPj2fWrFkcPnyY9u3bAzBmzBiqVatG3759AejSpQsjRoxgxowZJCcn880337BhwwYGDBgAeH4j0aVLF6ZOnUp0dDSRkZFMnDiRiIgI7+oYgMzMTA4cOEBmZiau65KRkQF4ElGxYkVq1arFBRdcwNixYxkwYAAhISGMHz+e2rVr07hx4z/5ZRIREX9kqtXA+fvj2HkzsB+Og5RluCPuxrl5MOb81gBY9yh23RoOpq3EtQ40aIhx9LFVESk9ZXmfouOlpaWxePFiHnrooROO0T5FUlqUY/+nHJcBDc/Heexljr71PHZjGnuf+Sf7Fs7D6dMfUzHkTz208uv/lGP/5w/7FBV63JKe0KZNG3Jycpg8eTJZWVnExsYybNgw78Q+MzOz0HL9xMREhgwZwsSJE5kwYQLR0dHcf//93t6MAN27d+fw4cO8+eab5ObmkpSUxLBhw7y9GQEmTZrEl19+6b39wAMPADB8+HBvoXzw4MG89957PPPMMxhjaNSoEcOGDSt2o1EREREA4ziYy7pjGzbHfftF2LYJ99+jMG07QVIz7NT3YP9e9hWcEFHd88YguY0vwxYRKXO2bNnCs88+S69evbx7FhVH+xRJaVOO/Z9y7GM1zsG5/2nsjInY2R9gF37O0XU/4vS/FxNz4k2xT5Xy6/+UY//nLzn+QxXmK6+88oStXEaMGFHk2EUXXcRFF110wsczxnDDDTdwww03nHDMoEGDGDRo0EnjCg0N5a677uKuu+466TgREZHjmdoxOMOex07/H/azadhv5sI3c4sO3L8X9/VncO56SMV0ESkVZXmfogLbtm3jySef5LLLLuO6664r8fkiIlK+mcBAzLV/xTZqjvvOi/DTdtynH8BcexPm8u4Yx/F1iCIif5p+komIiBxjgoJwet2KuedJMCf/L9Kd+DbWPVpKkYnI2ey3+xQVKNinKCEhodhzCvYp+q0T7VNUoGCfohM95ols3bqVxx9/nHbt2vGXv/ylROeKiIh/MYnn4Qx/BZIvgqP52Cnv4r48HJu17/dPFhEp41RIFxEROY5xDFj35IP2Z8K6H0snIBE563Xr1o25c+eyYMECtm3bxttvv11kn6Lx48d7x3fp0oWVK1cyY8YMtm/fzuTJk9mwYYP3U6W/3ado2bJlbNmyhTFjxhS7T1FGRkahfYoyMjI4dOgQ4Gnn8vjjj9O0aVO6detGVlYWWVlZ5OTklN4XR0REyhRTqQrOnQ9hbhoEwcGwZiXu40OwK7/zdWgiIn+KmoeLiIgc51RXzNjNGzCJTc5wNCIiZXefom+//ZacnBy+/vprvv76a++4mjVr8tprr52pL4eIiJRxxhjMpVdgGzTGfes52LoJd8xTmA5dMb1uxQRX8HWIIiIlZqw/dHo/zfbs2UNeXl6pXc8YQ3R0NDt37vSLxvtSlHLs/5Rj/2LTUnCff/jUBkfVxjRrhWl2IdRPxDgBZzY4OSP0Pez/fJXjoKAgatasWWrXK880B5fTTTn2f8px+WDz8rDTxmE/n+45UDsGp/99mNoxJz1P+fV/yrH/87c5uFaki4iIHK9BI4ioDvv3nnhMYBC4Luzajt01DfvpNKgchmlyAab5hdCoOaZiSOnFLCIiIiJSBpmgIEzvO7CNzsd992XYvhn3qX9get+Oad+l0CeqRETKMhXSRUREjmOcAJw+/XFff+aEY5z+90JSM+zqFbByCTZlGRzIwS6eh108z1Nob9js2Gr1lpjw6qX4DEREREREyhZzXjLO8Fdx330FUr/Hjn8Tu3oFzi1DMFXCfB2eiMjvUiFdRESkGCa5Dc5dD+FOfKvwyvSIGjh9+mGS23jGtbwYWl6Mzc+HDWuwP3yHXbkE9uyClGXYlGXY94GYeEzzYy1g6sRq5Y2IiIiInHVMWDjOkMew82Zip7wLK7/DfXwIzu1/xzRq7uvwREROSoV0ERGREzDJbXCaXwjr1hBuXLKsAw0aFtsH3QQGQmITTGITbO/bYcdW7Mol2JXfwaZ02Lweu3k9dvp4qB55bKV6K0hojAkM8sGzExEREREpfcYYTKersQnn4b71POzcivvSY5grrsX0+CsmMAjrHsWuW8PBtJW4J5mDi4iUJhXSRURETsI4AZikJlSKjibnFDdIMcZA7bqY2nWhy/XY7P3YVUs9RfU1P8De3Z5VOPNmQkgo5rwW0KwV5rwWmEqVz/yTEhERERHxMXNuPZyHX8R+8A72yznYT6dh16ZgLuqI/fRD2L+XfQWDI6rj9Onv/VSoiIgvqJAuIiJyhpmqEZhLOsMlnbGHD8PaldiV33kK6zlZ2KVfw9KvsY4DDRp7W8CYmlG+Dl1ERERE5IwxFSpg/joQ2zgZ971/eT/FWcT+vbivP4Nz10MqpouIz6iQLiIiUopMhQqe1efNWmFdFzal/1pU37EF0lKwaSnYSe9A7ZhfW8DENsA4jq/DFxERERE57cz5rTF162MfuRPy8044zp34Nk7zC9XmRUR8QoV0ERERHzGOA/WTMPWToOfN2N07sau+w/7wHaxbDds3Y7dvxs76AMLCfy2qJzXzFORFRERERPyEydyFPUkRHYD9mbDuR0hsUjpBiYj8hgrpIiIiZYSJjMZc1h0u6449eACb+j38sMTzd04W9uvPsF9/BsHB0LD5scJ6S0xYhK9DFxERERH5U2zWvt8fBLgfjsO0usSzGOXcepjAoDMcmYiIhwrpIiIiZZCpVBlzYTu4sJ1nZU56KvaHYy1g9u2BY+1grDEQl/jravXocz2bnYqIiIiIlCMmvBr2VAZuSsNuSvOMDQqGmPqYuCRM/USIS8KEVzuzgYrIWUuFdBERkTLOBAZBo/Mxjc7H/mUAbMvArlziaQGzeT1sWIvdsBY7dRzUjPJsVNq8FcQ3wgSof6SIiIiIlAMNGkFEddi/98RjqlSFjl1hYzpsSoMDP8P6Ndj1a34twleP9KxWLyiu16mHCVT5S0T+PP0kERERKUeMMZ6PsJ5bD7r1we7f++tmpWtXwp5d2C+mY7+YDqGVMU0v8KxUb5yMCQn1dfgiIiIiIsUyTgBOn/64rz9zwjHOX+/CJLcBwFoLP+3AblwLG9I8f2/fAnt3Y/fuhu++8hTXg4MhJh5Tv+Gvq9bDwkvlOYmIf1EhXUREpBwzEdUx7a+C9ldhD/0CP67wtIBJWQoHfsZ+uwD77QIICITEJpjmrTBNW2Gq1/R16CIiIiIihZjkNjh3PYQ78a3CK9MjauD06ectosOxBSZRtTFRtaFNJwDsL7mwKR27cS12QxpsTIPcA7DuR+y6H39dtV4zChOXCPWTMHFJUCdWn+QUkd+lQrqIiIifMBVDILkNJrkN1j3qWZlT0ALmp+2eIvuPK7Dj3/Ssam9+IabZhVA3Tn3VRURERKRMMMltcJpfCOvWEG5csqwDDRpinN8vdJuQUGjUHNOoOQDWdX+zat3TDpGdWz2f4tyzC5Z8eWzVegWol4CJS/y1LUyVsDP6PEWk/FEhXURExA8ZJwAaNMI0aAS9bsPu2uZpAfPDd7BhLWzdhN26CTtjIoRX96xUb9YKEptigoJ8Hb6IiIiInMWME4BJakKl6Ghydu70tHH5Q4/jQHQdTHQdaHsZADb3oGfV+oa1ngL7xnT45SCkpWDTUn5dtR4Z/Zte60lQu+4pFfNFxH+pkC4iInIWMFF1MFF14Iqe2J+zsSnLPH3VV6+ArL3YBbOxC2ZDhRBofD6mWStMkwu0EkdERERE/IoJreSZ7zY+Hzi2an3ntl9XrW9M86xa370Tu3snLJ7vKa5XCIF6DTAFm5jGJWIqa64scjZRIV1EROQsY6pUxbTpBG06YfOOwNoU7A9LsKu+g6x9sHwRdvkirDn2MdpmrTDNLsScU8vXoYuIiIiInFbGcTyrzWvXhUs6A2APHoBNadgNadgNa2BTOhz6Bdauwq5d9euq9ajanh7r9RM9f9c6V6vWRfyYCukiIiJnMRMUDE1aYJq0wLp3wpYNv7aA2bYJ0ldj01djP3gXoup4iurNW3lW4OhNgoiIiIj4IVOpMpzXAnNeCwDP/kM7th5btZ7m+XvXdti1HbtrOyya6ymuVwzx9Fqv39Czar1eouexRMQvqJAuIiIiwLHVOLENMLENoPuN2L27PUX1ld9BWgrs2ubptf7pVKgchmnaEtP8Qs+GThUq+jp8EREREZEzwjgBUCcWUycWLr0SAHsgBzYeW7W+cS1sWudZtb5mJXbNyl9XrUefi4lLhPrHeq1H1fHMu0Wk3FEhXURERIplqkdiOnaDjt2wuQexq5fDD99hU5fBgRzsornYRXMhMAgaNvNsWNq0JSa8uq9DFxERERE5o0zlMGjaEtO0JXBs1fr2LdgNBb3W18LunbBzK3bnVvjmC09xPbSSZ9V6wSam9RI8fdtFpMxTIV1ERER+lwmthGl5CbS8BJufD+t/PNYCZglk/gQpyzwbmIJnVXtBC5jasRhjfB2+iIiIiMgZZZwAOLce5tx60P4qAOzP2cdWrR/bxHRTOuQehNUrsKtXeObOxnhWrddP8qxaj0uCc2pp1bpIGaRCuoiIiJSICQyEpKaYpKbY3nd4+kWuXOJpAbMxDTLWYTPWYaf/D6pHYppfiGnWCho09pwrIiIiInIWMFWqQrNWnrkwYI8ehW0Zx3qtHyuu79kFO7Zgd2yBrz87tmq9smdPovqJmPoNoV4DTMVQnz4XEVEhXURERP4EYwzUroupXRe6XI/N3o9dtdRTVP/xB9i7Gzt3BnbuDAiphDkv2fNmokkLTKg2XhIRERGRs4cJCICY+piY+tChKwA2Z79n1fr6Y+1gMtZD7gFI/R6b+v2xVeuOZ84dlwT1E39dta5PfoqUKhXSRURE5LQxVSMwl3SGSzpjDx+GNT/8umHpz9nYpV/D0q+xAQGeFerHVuiYmlG+Dl1EREREpNSZsAho3hrTvDWAp43itk3YDWmwca2n5/re3Z6V7Nsy4Ks5nuJ65SoQl4SJS/S0hYltgKkY4sunIuL3VEgXERGRM8JUqADNL8Q0vxDrurAp/de+6ju3wtpV2LWrsJPehtoxmGYXevqqx8SrJ6SIiIiInJVMYKCnKB7bADp1A8Bm7TtWVE/7ddX6gZ9h1VLPp0HBs2q9ToynqB6XhKmfCDWjtWpd5DT6Q4X0OXPmMGPGDLKysoiJieH2228nPj7+hOMXL17MpEmT2LNnD1FRUdx4440kJyd777fWMnnyZObOncvBgwdJSkqiX79+REdHe8dMnTqV5cuXk5GRQWBgIGPHjj3h9X7++Wfuv/9+9u3bx7vvvkulStr9WERExJeM43g2T6qfBD1vxu7egV15rAXMutWwfTN2+2bsrMlQNQLTtCWm2YXQsCkmuIKvwxcRERER8RkTXg2S22CS2wBg8/Ng6ybshjVQUFzfl+k5tnUTLJjtKa5XqXqs1/qxTUxjG3gWu4jIH1LiQvqiRYsYN24c/fv3p0GDBnzyySeMHDmSl19+mapVqxYZn5aWxiuvvELfvn1JTk5m4cKFPPfcc4wePZq6desCMH36dGbPns2gQYOIjIxk0qRJjBw5khdffJHg4GAA8vPzad26NQkJCcybN++kMb7++uvExMSwb9++kj49ERERKQUmshbm8u5weXfswZ+xKd/Dyu+wqd9D9n7s159hv/4MgitAo/MxzVthmlyACQv3degiPlNWF7NkZmby1ltvsXr1aipWrEi7du3o27cvAQEBp/X5i4iIiIcJDIJ6CZh6CXCZ55jdv9fbCsZuTIPN6+HnbM8ce+V3nsK648C5cZi4RM8il7hEqHGOVq2LnKISF9JnzpxJp06d6NChAwD9+/dn+fLlzJ8/nx49ehQZP2vWLJo3b84111wDQJ8+fUhJSWHOnDkMGDAAay2zZs2iZ8+etGzZEoDBgwfTv39/li5dStu2bQHo3bs3AAsWLDhpfJ999hm5ubn06tWLFStWnHRsXl4eeXl53tvGGEJCQrz/Li0F19IPLv+lHPs/5di/Kb9nlqkcBhd1gIs6YPPzsGmp2B+WYFcu8ays+eFb7A/fYo2BuCSc5q08q9Wj65y2nCjH/q+857isLmZxXZenn36a8PBwnnrqKfbv38+YMWMICAigb9++Z/aLIiIiIl4mojq0aItp4amj2bw82LLhWGF9LWxIg6y9sHk9dvN6mP+Jp7geFu5tBeNZtR6vT4SKnECJCun5+fls3LixUMHccRyaNGlCenp6seekp6fTrVu3QseaNWvG0qVLAdi9ezdZWVk0bdrUe39oaCjx8fGkp6d7C+mnYtu2bUyZMoVRo0bx008//e74adOmMWXKFO/tevXqMXr0aGrWrHnK1zydoqK00Zq/U479n3Ls35TfUnJuXbisC9Za8jam88uSr/hlyVfkrV8DG9bgblgDH75HYK1zqXjhpYS0bkeFhk0xAX9+6xfl2P+V1xyX1cUsK1euZNu2bTz66KOEh4cTGxvLDTfcwP/+9z969+5NYGDR70stZpHSohz7P+XYvym/f44JDob4hp4/x9h9e7DrPYV1u2EtbNkIOVm/LlwBCAjwrFo/1pbR1E+CajXPSB6UY//nbzku0TvOnJwcXNclPDy80PHw8HB27NhR7DlZWVlFVslUrVqVrKws7/0Fx0405lTk5eXxyiuv8Ne//pUaNWqcUiH92muvLVTkL0jqnj17yM/PP+Vr/1nGGKKioti1axfW2lK7rpQe5dj/Kcf+Tfn1odAw6NANOnQjYF+mZzOlH5Zg164kf8dWDkz7Hwem/Q8qVcE0vcCzYel552MqhpboMsqx//NVjgMDA//0Io2yvJglPT2dunXrFnp/0Lx5c95++222bt1KvXr1ipyjxSxS2pRj/6cc+zfl9zSKjobGv/7f7x4+RN6GtRxek8KRtas4vGYV7v69kLEOm7EOO3cGAE61GgQ3bEpwUlMqJDUhOD7ptK5aV479n7/k+M8v3Sojxo8fT+3atbn00ktP+ZygoCCCgoKKvc8Xb6KttXrz7ueUY/+nHPs35dfHIqpj2l2JaXcl9lAurP4Bu3IJNmUZHPgZu3g+dvF8CAyExCaeonqzlphqJy/OWfcorFvDwbU/cNQ60KAhxlFvZ39S3nNclhezZGVlFYmr4DFP9DhazCKlRTn2f8qxf1N+S0nEOdDmHGhzGcZaAvbu9rSDKWgJs3UT7r5MfvlmHr98c6zNW2Ag1K2PKdjItH5DTLUaJbqsZ372I1VxycaBBo3K1fxMfp8vc3w6FrMU+7glGRwWFobjOEUmxcVNoAuEh4eTnZ1d6Fh2drZ3fMHf2dnZREREFBoTGxt7yrGlpqayZcsWvv32W+DXQvgdd9xBz549vR9LFRERkfLPVAyFFm0wLdpgjx6FDWs9myj9sAR274DVK7CrV2DHvwF14zxF9eatPB9T/c3HCu3yRbgT34L9e/FuUR5RHadPf0xyG588Nzm9lOOyR4tZpLQpx/5POfZvym8pqx6JqR6JaeVZqGoPH4bN67Ab0o71Wl/r2cR0Yxp2Yxr2i48950XUKLyJad36mBP9f6/5md/z1xyXqJAeGBhIXFwcqamptGrVCvBsMJSamsqVV15Z7DkJCQmkpKTQtWtX77FVq1bRoEEDACIjIwkPDyclJcVbOM/NzWX9+vV07tz5lGO79957OXLkiPf2hg0beP3113niiSc455xzSvI0RUREpBwxAQGQ0BiT0Biuvw27a9uxovp3sGENbNmI3bIRO2OCZ4LfrBWmWSts7kHsW88VfcD9e3FffwbnrofK9SRPjk3gX3+m6B3lLMdleTFLeHg469evL3Kd315DREREyi9ToQIknIdJOA849kvvzJ88PdYLeq1vy4D9mdjvM+H7bzy91gODIKa+Z8V6XBLUT8SEV/eb+ZmcmD/nuMStXbp168Zrr71GXFwc8fHxzJo1i8OHD9O+fXsAxowZQ7Vq1ejbty8AXbp0YcSIEcyYMYPk5GS++eYbNmzYwIABAwDPR3W6dOnC1KlTiY6OJjIykokTJxIREeHd+AggMzOTAwcOkJmZieu6ZGRkAJ4eOxUrVizSa+fnn38GoHbt2lSqVKnEXxgREREpn0xUHUxUHbiiJ/bnbOyqZdiVS2D1Cs8Ef8Es7IJZv/s47sS3cZpfqI+YllPWPepZBXMS5SXHZXkxS0JCAlOnTiU7O9vb0mXVqlWEhIRQp06dP/J0RUREpAwzxkDNKEzNKGjdHgB7+JCnr/qGtdiNaZ5V6wdyPJ8a3bAW7+cJImp4jp9EeZmfSfH8aQ5enBIX0tu0aUNOTg6TJ08mKyuL2NhYhg0b5l1xkpmZWegj04mJiQwZMoSJEycyYcIEoqOjuf/++6lbt653TPfu3Tl8+DBvvvkmubm5JCUlMWzYMIKDg71jJk2axJdffum9/cADDwAwfPhwGjduXOInLiIiIv7PVKmKadsJ2nbC5h2BtauwP3yH/f4bOPjzyU/en4n78J1QoWLpBCun1+FDsH/vycfsz4R1P0Jik9KJ6U8oq4tZmjVrRp06dRgzZgw33ngjWVlZTJw4kSuuuOKE7VtERETEv5gKFT17FB2bU1lrYffO36xaT4Ptmz1zr9+jOXj55mdz8OMZq0ZTRezZs4e8vLxSu54xhujoaHbu3Km+X35KOfZ/yrF/U379j/vtAuw7L/o6DCkDTL97cS5sd8YePygo6LRtdDRnzhw+/vhj72KW2267zbvCfMSIEdSsWZNBgwZ5xy9evJiJEyeyZ88eoqOjufHGG0lOTvbeb61l8uTJfPHFF97FLHfccQe1atXyjnnttdcKLWYp8NvFLHv27OHtt99m9erVVKhQgXbt2nHjjTcSEFCyVUaag8vpphz7P+XYvym//sUeysXO/hA76wNfhyJlQHmag/+WCunF0CReTjfl2P8px/5N+fU/Ni0F9/mHf3ecuf52zLn1SiEiOd3s1k3YD/77u+Oc+0Z6V0+dCWdqEu+PNAeX00059n/KsX9Tfv2P5uD+z9/n4CVu7SIiIiJS7jVoBBHVT/6xw4gamMuuLpe9+wRIPA/7xfTfzTENGpVeTCIiIiJnM83B/Z+fz8EdXwcgIiIiUtqME4DTp/9Jxzh9+mkCX44pxyIiIiJli+Zn/s/fc6xCuoiIiJyVTHIbnLse8qyK+a2IGjh3PYRJbuObwOS0UY5FREREyhbNz/yfP+dYrV1ERETkrGWS2+A0vxDWrSHcuGRZBxo0LLcrJKQo5VhERESkbNH8zP/5a45VSBcREZGzmnECMElNqBQdTY42s/JLyrGIiIhI2aL5mf/zxxyrtYuIiIiIiIiIiIiIyEmokC4iIiIiIiIiIiIichIqpIuIiIiIiIiIiIiInIR6pBcjMNA3XxZfXVdKj3Ls/5Rj/6b8+j/l2P+Vdo71mjp1moPLmaIc+z/l2L8pv/5POfZ//jIHN9YfOr2LiIiIiIiIiIiIiJwhau1SBvzyyy88+OCD/PLLL74ORc4Q5dj/Kcf+Tfn1f8qx/1OO5Xh6Tfg/5dj/Kcf+Tfn1f8qx//O3HKuQXgZYa9m0aRP6cID/Uo79n3Ls35Rf/6cc+z/lWI6n14T/U479n3Ls35Rf/6cc+z9/y7EK6SIiIiIiIiIiIiIiJ6FCuoiIiIiIiIiIiIjISaiQXgYEBQXRq1cvgoKCfB2KnCHKsf9Tjv2b8uv/lGP/pxzL8fSa8H/Ksf9Tjv2b8uv/lGP/5285NtZfmtSIiIiIiIiIiIiIiJwBWpEuIiIiIiIiIiIiInISKqSLiIiIiIiIiIiIiJyECukiIiIiIiIiIiIiIiehQrqIiIiIiIiIiIiIyEkE+jqAs8mPP/7Ixx9/zKZNm9i/fz/33XcfrVq18t5vrWXy5MnMnTuXgwcPkpSURL9+/YiOjvZh1HKqpk2bxnfffcf27dsJDg4mISGBv/71r9SqVcs75siRI4wbN45FixaRl5dHs2bN6NevH+Hh4b4LXE7ZZ599xmeffcaePXsAqFOnDr169eL8888HlF9/89FHHzF+/Hi6dOnCrbfeCijH5d3kyZOZMmVKoWO1atXi5ZdfBpRff7Fv3z7ef/99fvjhBw4fPkxUVBQDBw6kfv36gOZbZyPNwf2b5uD+T3Pws4vm4P5Hc/Czw9kyBzfWWuvrIM4WK1asIC0tjbi4OJ5//vkik/iPPvqIjz76iEGDBhEZGcmkSZPYsmULL774IsHBwT6MXE7FyJEjadu2LfXr1+fo0aNMmDCBrVu38uKLL1KxYkUA3nrrLZYvX86gQYMIDQ3lnXfewXEcnnzySR9HL6di2bJlOI5DdHQ01lq+/PJLPv74Y5599lnOPfdc5dePrF+/npdeeonQ0FAaN27sncQrx+Xb5MmTWbJkCY8++qj3mOM4hIWFAcqvPzhw4AAPPvggjRs3pnPnzoSFhbFz507OOeccoqKiAM23zkaag/s3zcH9n+bgZw/Nwf2T5uD+72yag6u1Syk6//zz6dOnT6GJewFrLbNmzaJnz560bNmSmJgYBg8ezP79+1m6dKkPopWSevjhh2nfvj3nnnsusbGxDBo0iMzMTDZu3AhAbm4u8+bN45ZbbuG8884jLi6OgQMHkpaWRnp6uo+jl1NxwQUXkJycTHR0NLVq1eIvf/kLFStWZN26dcqvHzl06BD/+te/+Nvf/kalSpW8x5Vj/+A4DuHh4d4/BRN45dc/TJ8+nerVqzNw4EDi4+OJjIykWbNm3gm85ltnJ83B/Zvm4P5Pc/Czg+bg/k1zcP92Ns3BVUgvI3bv3k1WVhZNmzb1HgsNDSU+Pl4/PMqp3NxcACpXrgzAxo0bOXr0KE2aNPGOqV27NjVq1FCOyyHXdfnmm284fPgwCQkJyq8fefvttzn//PML/TwGfQ/7i127dvG3v/2NwYMH8+qrr5KZmQkov/5i2bJlxMXF8eKLL9KvXz8eeOABvvjiC+/9mm/J8fSa8D+ag/s3zcH9l+bg/k1zcP92Ns3B1SO9jMjKygKgatWqhY5XrVrVe5+UH67rMnbsWBITE6lbty7gyXFgYGCh366DclzebNmyhYcffpi8vDwqVqzIfffdR506dcjIyFB+/cA333zDpk2bePrpp4vcp+/h8q9BgwYMHDiQWrVqsX//fqZMmcJjjz3GCy+8oPz6id27d/P555/TtWtXrr32WjZs2MC7775LYGAg7du313xLitBrwr9oDu6/NAf3b5qD+zfNwf3f2TQHVyFd5Ax455132Lp1K0888YSvQ5HTrFatWjz33HPk5uby7bff8tprr/H444/7Oiw5DTIzMxk7diyPPPJIuerRJqeuYFMygJiYGO+kfvHixcq5n3Bdl/r169O3b18A6tWrx5YtW/j8889p3769b4MTkTNOc3D/pTm4/9Ic3P9pDu7/zqY5uArpZUTBbsTZ2dlERER4j2dnZxMbG+uboOQPeeedd1i+fDmPP/441atX9x4PDw8nPz+fgwcPFvpta3Z2tnajLkcCAwO9fb7i4uLYsGEDs2bNok2bNspvObdx40ays7N58MEHvcdc12XNmjXMmTOHhx9+WDn2M5UqVaJWrVrs2rWLpk2bKr9+ICIigjp16hQ6VqdOHZYsWQJoviVF6TXhPzQH92+ag/svzcHPPpqD+5+zaQ6uHullRGRkJOHh4aSkpHiP5ebmsn79ehISEnwYmZwqay3vvPMO3333HY899hiRkZGF7o+LiyMgIKBQjnfs2EFmZqZyXI65rkteXp7y6weaNGnC888/z7PPPuv9U79+fS6++GLvv5Vj/3Lo0CF27dpFeHi4vof9RGJiIjt27Ch0bMeOHdSsWRPQfEuK0mui/NMc/OykObj/0Bz87KM5uP85m+bgWpFeigp+WBTYvXs3GRkZVK5cmRo1atClSxemTp1KdHQ0kZGRTJw4kYiICFq2bOnDqOVUvfPOOyxcuJAHHniAkJAQb5+n0NBQgoODCQ0NpWPHjowbN47KlSsTGhrKf//7XxISEsrdD46z1fjx42nevDk1atTg0KFDLFy4kB9//JGHH35Y+fUDISEh3n6qBSpUqECVKlW8x5Xj8m3cuHFccMEF1KhRg/379zN58mQcx+Hiiy/W97Cf6Nq1K48++ihTp06lTZs2rF+/nrlz5zJgwAAAjDGab52FNAf3b5qD+z/Nwf2b5uD+T3Nw/3c2zcGNtdb6OoizxerVq4vt49auXTsGDRqEtZbJkyfzxRdfkJubS1JSEnfccQe1atXyQbRSUr179y72+MCBA709oY4cOcK4ceP45ptvyM/Pp1mzZvTr108fWSonXn/9dVJTU9m/fz+hoaHExMTQvXt3787Tyq//GTFiBLGxsdx6662Aclzevfzyy6xZs4aff/6ZsLAwkpKS6NOnj/ej4sqvf/j+++8ZP348u3btIjIykq5du3LZZZd579d86+yjObh/0xzc/2kOfvbRHNy/aA5+djhb5uAqpIuIiIiIiIiIiIiInIR6pIuIiIiIiIiIiIiInIQK6SIiIiIiIiIiIiIiJ6FCuoiIiIiIiIiIiIjISaiQLiIiIiIiIiIiIiJyEiqki4iIiIiIiIiIiIichArpIiIiIiIiIiIiIiInoUK6iIiIiIiIiIiIiMhJqJAuIiIiIiIiIiIiInISKqSLiIiIiIiIiIiIiJyECukiIiIiIiIiIiIiIiehQrqIiIiIiIiIiIiIyEmokC4iIiIiIiIiIiIichIqpIuIiIiIiIiIiIiInIQK6SIiIiIiIiIiIiIiJ6FCuoiIiIiIiIiIiIjISaiQLiIiIiIiIiIiIiJyEiqki4iIiIiIiIiIiIichArpInLWyMvLY/jw4TRo0IAKFSpgjOGjjz7ydVjyJ916660YY8jIyDjlc2JjY4mNjS3RdUaMGIExhgULFpToPBEREREREREp/1RIF5Ez7ujRo7z11lu0a9eOatWqERQURGRkJE2bNqVfv358/PHHpRLHCy+8wBNPPEGtWrW47777GD58OElJSaVy7dMlNja2xEXjsuTo0aOEh4cTFBTEzz//XOT+nTt3YozBGMO7775b7GO0a9cOYwxfffXVaY1t7NixGGMYO3bsaX3c02Hfvn38/e9/JzY2lgoVKlCrVi1uv/12tm3bVqLHKfilw4n+rF279gw9AxEREREREZHyLdDXAYiIfzt69CjdunVjzpw5hIeH07VrV+rUqcORI0dYvXo148ePZ+3atVxzzTVnPJaZM2dSuXJlPv/8c4KDg8/49aSogIAA2rdvz/Tp0/nqq6/o2rVrofvnzp0LgDGGefPmcdtttxW6Pzc3l2+//ZZKlSpx0UUXAfD000/z0EMPUbt27dJ5EqVs7969tGnThvT0dDp27EifPn1Yu3Yt7777Lp988gmLFy8mLi6uRI85dOhQwsPDixyvUaPGaYpaRERERERExL+okC4iZ9SECROYM2cOzZo148svv6Rq1aqF7s/NzWXJkiWlEsuOHTuoXr26iug+1rFjR6ZPn868efOKFNLnzZtHSEgIHTt2ZP78+UXOXbhwIUeOHKFjx44EBQUBEB0dTXR0dKnE7gvDhg0jPT2df/zjH7zwwgve46+++ipDhw5l4MCBzJkzp0SPWbC6XUREREREREROjVq7iMgZtWjRIsDTUuL4IjpAaGgoHTp0KHTsZL2oMzIyMMZw6623Fjpe0LJi48aN/Otf/6Jp06aEhITQvn17732bNm1i8+bN3jYWvy0kjh07luuuu464uDhCQkIICwujbdu2vP/++yd8bvv27ePhhx/mvPPOIzQ0lKpVq9KsWTMeeughDh48WGTsP//5Txo2bEhISAhVq1alU6dOfPbZZ7/zFfzjXNfljTfeoGXLllSuXJlKlSrRsmVLXn/9dVzXLTL+66+/5uqrr6ZOnTpUqFCBqKgoWrduzeOPP15o3E8//cR9991HYmIilSpVIjw8nMTERG699VY2btz4u3F16tQJ8BTNjzdv3jzatm3LFVdcwfbt20lLSyty/28fA07cI91ay5gxY2jcuDEVK1akdu3aDB48mOzs7CLXbd++vXf1+2233Vao3UlxbXSmTJlCq1atCA0NpVq1avTp04ft27f/7nMvqQMHDvB///d/VKpUiREjRhS6b/DgwcTExPDpp5+e0tddRERERERERP44rUgXkTOqevXqAKSnp5fK9YYOHcrXX39N165d6dKlCwEBAbRs2ZLY2FhefvllwLMaFyjU2uKuu+6icePGXHrppURHR7N3715mzZrFTTfdRFpaGk8++WSh62zatIkOHTqwefNmWrRowV133YXruqSnp/PSSy9x5513UqlSJQA2b95M+/btycjI4JJLLuHKK6/k4MGDzJw5kyuvvJI333yT/v37n/avxU033cT48eM599xz6devH8YYpk2bxsCBA1m4cCH/+9//vGPnzJlD165dCQsL45prrqF27drs27ePNWvW8O9//5vhw4cDnk8QtG3blg0bNnD55Zdz9dVXY61l8+bNTJ8+nV69ev1um5HGjRtzzjnnsHLlSvbu3et9jWzYsIHNmzfzt7/9zfvLlblz55KYmOg9t6D1y28L6Sfy97//nVdffZXo6GgGDBhAUFAQ06dPZ8mSJRw5cqTQJxNuvfVWwsPDmT59Ot27d6d58+be+45vgfLvf/+bjz/+mGuuuYZ27dqxZMkSJk2axMqVK/nhhx+oUKHC78Z2qr799lt++eUXOnfuTJUqVQrd5zgOV1xxBf/5z3+YP39+idq7zJ49m5ycHAICAoiPj6djx46EhYWdtrhFRERERERE/I0K6SJyRvXs2ZPRo0fzxhtv8PPPP3PttdfSokULYmJizsj1li9fzooVK6hXr16h4z169PBuInn8yl6A1NRU6tevX+jYkSNHuOqqq3jmmWe48847C/XgvvHGG9m8eTOjRo3in//8Z6HzMjMzqVy5svf2LbfcwubNm5kwYQJ9+vTxHs/KyqJ9+/YMGTKEa665hnPOOeePPu0iJkyYwPjx4zn//PP56quvvPE89dRTtGvXjvHjx9O1a1f69u0LwFtvvYXruixYsIBmzZoVeT4F5s6dy4YNG/j73//OSy+9VGjckSNHOHz48CnF17FjRyZMmMD8+fPp1asX8Otq8w4dOtC4cWNq1qzJvHnzGDhwIADZ2dmsWLGC6tWrFyp0F2fRokW8+uqr1K9fn++++45q1aoBMHLkSDp06MDOnTsLvQYLPuEwffp0evToUeQTD781Z84cli5dSpMmTbzH+vbty4QJE5g+fTq9e/f2Hl+wYEGxn6w4md++PgtW5CckJBQ7tkGDBkDJf1FV8DUtUKVKFZ5++mkGDRpUoscREREREREROVuokC4iZ9T555/P+++/z9ChQ3n//fe9rVKqVavGpZdeyu23387VV1992q73wAMPFCmin4rji+gAwcHBDBo0iHnz5jF37lxuvvlmAL7//nsWL15M8+bNefDBB4uc99sNG1euXMmXX35Jr169ChXRwbPS+fHHH6dHjx58+OGHRYqbf8Z///tfAJ555plCRf1KlSoxevRoLrvsMt5++21vIb1ASEjISZ/PycYFBwefcv/5Tp06MWHCBObNm1eokF6lShUuuOACjDG0b9+eefPmYa31tvo5evQoHTp0wBhz0sd/9913AXj44Ye9RXSAihUr8vTTTxdpJ1QSQ4YMKVREB+jfvz8TJkzgu+++K1JIP741zu/5bSG9oA1NcW2Rfns8KyvrlB770ksvpUuXLrRu3ZrIyEh27NjBtGnTePzxxxk8eDBBQUEMGDCgRPGKiIiIiIiInA1USBeRM653795ce+21zJ8/n4ULF7JixQoWLlzIRx99xEcffcTNN9/M2LFjf7c4eipatWr1h87bsmULo0ePZu7cuWzZsoVffvml0P2/7X/97bffAnDFFVfgOCffamLx4sWApyBa3Er4PXv2ALBmzZo/FPeJLF++HMdxaN++fZH72rVrR0BAACtWrPAeu/HGG5k6dSoXXnghN9xwAx06dKBt27bUqVOnyLm1a9fmmWeeYfny5XTp0oW2bdvSvHlzAgICTjm+jh07AoX7pM+fP59LLrmEwEDPf00dOnTggw8+YOXKlTRv3rzY/ugne/4F8R7v4osvLlGsx7vggguKHDv33HMB2L9/f6HjI0aMKDbvvnL77bcXuh0XF8e9995LYmIiV199NQ8//DB33HHHn/r6iIiIiIiIiPgjFdJFpFQEBQXRuXNnOnfuDMDRo0f58MMPuf322xk3bhzXXnstPXr0+NPXiYqKKvE5GzdupFWrVuzfv59LLrmEzp07U7VqVQICAsjIyOC9994r1LKkYPXvb1u9nMjevXsB+Pzzz/n8889POO7AgQMljvtksrOzqVatWrErxAMDA6lRowa7d+/2HuvZsyczZ87khRde4L///S9vvvkmAC1atODpp5/m8ssvByAsLIxvv/2W4cOH8/HHH/Ppp58CnlXrAwcO5JFHHiEoKOh346tXrx716tUjLS2N7du3s3//fn766SdvgR3w/hJg7ty5NG/e3Nsf/bLLLjul5w8U2y6n4Pn/Ucf3TC94TPC8rk+nghXnxW2Q+tvjxcVUEt26daN27dps376dH3/8sciKexEREREREZGznQrpIuITAQEB9O7dm5SUFJ566inmzZvnLaQXrPLOz88vct7vtbD4I6vaX3zxRfbu3cu7775bpDf2hAkTeO+99wodKyha/naV+okUFEJfeeUVhgwZUuLY/qiqVauyb98+8vLyihS28/PzyczMLLK5ZNeuXenatSsHDx5kyZIlzJw5k9dff51u3bqxYsUKGjVqBECdOnV45513sNby448/Mm/ePF577TWeeOIJXNctsjHriXTs2JF33nmHefPmeVdy/7blSsOGDYmKimLevHncdNNNrF69mrp16xIfH39Kzx/gp59+KrIJZ8HzP361/ZnwZ3ukF2y0eqIe6OvWrQNO3EO9JGrWrMn27ds5ePDgn34sEREREREREX+jQrqI+FSVKlUAsNZ6j0VERACwdevWIuOXLVt22mNYv349ANddd12R+7788ssix1q3bg3Ap59+yqhRo07a3qVg7Ndff12qhfTzzz+fuXPn8tVXXxVphfLVV19x9OhRkpOTiz23UqVKdOzYkY4dOxIREcFjjz3G7NmzvYX0AsYYGjduTOPGjenRowd169blo48+OuVCeqdOnQoV0iMiIopsItq+fXs++eQT78r3U2nrApCcnMzy5cv58ssvixTSFy5cWOzK8YJ2JqdzVfmf7ZHeunVrQkJC+Oabb/j555+93y8Aruvy2WefAfypnu/gWdm+du1ajDF/aI8BEREREREREX938ua+IiJ/0oQJE/j8889xXbfIfbt27eKtt94CPJsgFijoc/7uu+8WWpW+detWnnjiidMeY2xsLECRlcOffvopb7/9dpHxLVq0oE2bNvzwww+MHj26yP179+7l0KFDgKef9iWXXMLUqVO9G4AeLyUlpVCbldOhoBf2P//5T3Jzc73Hc3NzeeihhwC44447vMe/+uqrYj8B8NNPPwEQGhoKwOrVq73HTjbuVBS0cfniiy/48ssvadeuXZFfSnTo0IGff/6Z5557Djj1QnrBJwtGjhzJvn37vMcPHTrEP//5z2LPqV69OuDpl3+6jBgxAmttif78VuXKlbnppps4ePBgkV7rY8aMISMjgyuuuKLILws2bNjA2rVrycvL8x7btWsX27ZtKxLjgQMHuPXWWzl06BCXXXZZse1wRERERERERM52WpEuImfUkiVLeOWVV4iKiuLiiy/2rnbdtGkTn3zyCb/88gvdu3enV69e3nMuvPBCLr30Ur766itatWpFx44d+emnn5gxYwZXXHFFsSvV/4yBAwfy7rvvcv3119OrVy9q1apFamoqc+bMoXfv3kyaNKnIOe+//z7t27dn2LBhfPjhh7Rv3x5rLevWreOzzz5j7dq13gL9+PHj6dixI3fccQevvvoqF154IeHh4Wzbto1Vq1aRmprK4sWLiYyMPOWY77vvPipXrlzsfU888QR9+/Zl+vTpTJ482bti3BjDRx99xKZNm7jhhhu48cYbvecMGTKE7du307ZtW2JjYwkODub7779n3rx5xMTE0KdPH8DT6/3+++/noosuIiEhgcjISLZt28b06dNxHIf777//lJ/DOeecQ+PGjVm9ejVAof7oBQpWWqekpJxwTHHatm3L3Xffzb/+9S/OO+88evXqRVBQENOnTyciIoLo6Ogi51x00UWEhoby8ssvs3fvXm+//bvvvtvbKsYXRo0axYIFC3jxxRf54YcfaNWqFWvWrGH69OlERkby2muvFTmnU6dObN68mU2bNnlfh2vXruWyyy4rlLvt27fz+eef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IdQ+lf05ccyqVas0ZcoUXXzxxbr33nurIVJUh8rOh4MHD+qll17SBx98oAMHDqhZs2a6+eab+bcjiFR2Trz66qtaunSpCgsLFRERoUsvvVQjRoxQeHh4NUaNqvJDNdaKbNy4UbNmzdLOnTvVpEkTXX/99erVq1eljsuK9GpUUlKixMRE/fa3v63w+UWLFum1115Tenq6HnnkEdWrV0+TJk3SkSNHqjlSnI1Nmzapf//+mjRpku6//34dPXpUEydO1OHDh/1jXnjhBX300Uf63e9+pwcffFD79+/X448/HsCoURnR0dEaMWKEHn30Uf3lL39Rhw4d9Nhjj/k/1JHf4LF161a98cYbSkhIKLedHNd+P/nJT/TMM8/4fz300EP+58hv7XfgwAGNHz9eoaGhGjt2rP7617/qV7/6lRo1auQfw/VW9Vu9erVmzZqloUOHKiMjQwkJCZo0aZKKiooqHL9582ZNmTJFffr0UUZGhrp166bJkydrx44d1Rw5qkpl58SmTZvUo0cPPfDAA5o4caKaNGmiiRMnat++fdUcOapKZefEMXv37tW//vUvtWvXrpoiRXWo7HwoKyvTxIkTVVBQoN/97nd68skndeuttyo6OrqaI0dVqeycePfddzV79mzdcMMN+utf/6rbbrtNa9as0UsvvVTNkaOq/FCN9UR79+7Vo48+qvbt2+uxxx7TNddco3/84x/65JNPKnVcCunV6MILL9Tw4cMr/B8Sa62ysrI0ZMgQdevWTQkJCbrrrru0f/9+rV27NgDRorLGjRunXr166Sc/+YkSExN15513qrCwUHl5eZKkQ4cO6a233tLNN9+sDh06KCkpSXfccYc2b96s3NzcAEePM3HxxRera9euiouLU/PmzXXjjTeqfv362rJlC/kNIocPH9ZTTz2lW2+9tVzxjRwHB8dx5PF4/L8iIiIkkd9gsWjRIjVp0kR33HGHkpOTFRMTo86dOys2NlYS11uBsmTJEvXt21e9e/dWfHy80tPTFR4eruXLl1c4PisrS126dNG1116r+Ph4DR8+XElJScrOzq7myFFVKjsnxowZo/79+ysxMVEtWrTQbbfdJmutNmzYUM2Ro6pUdk5Ikuu6euqppzRs2DDFxMRUY7SoapWdD2+99ZYOHDige+65R23btlVMTIwuuOACJSYmVm/gqDKVnRObN29WmzZtdPnll/uvB3v06KGtW7dWc+SoKqersVZk6dKliomJ0a9+9SvFx8drwIABuuyyy/Tqq69W6rgU0muIvXv3yuv1qlOnTv5tDRs2VHJyMh/ga6lDhw5Jkho3bixJysvL09GjR9WxY0f/mBYtWqhp06bkuBZyXVerVq1SSUmJUlNTyW8QmTFjhi688MJyP48l3sPBIj8/X7feeqvuuusu/e1vf1NhYaEk8hssPvzwQyUlJemJJ57Q6NGjde+99+rNN9/0P8/1VvUrKytTXl5eufeW4zjq2LHjKf/Oc3Nzy42XpM6dO2vLli1VGiuqx9nMiROVlJSorKzMf52N2u1s58S8efMUERGhPn36VEeYqCZnMx8++ugjpaSk6Nlnn1V6erp+//vfa/78+XJdt7rCRhU6mznRpk0b5eXl+QvnX3/9tT7++GN/W1bUPVu2bKnw+rKynwHokV5DeL1eSVJkZGS57ZGRkf7nUHu4rquZM2eqTZs2atmypSRfjkNDQ8utcJXIcW2zY8cOjRs3TqWlpapfv77+8Ic/KD4+Xtu3bye/QWDVqlX64osv9Je//OWk53gP134pKSm644471Lx5c+3fv1/z5s3Tn//8Zz3++OPkN0js3btXb7zxhq655hoNHjxY27Zt0/PPP6/Q0FD16tWL660AKC4uluu6J91rwOPxaPfu3RXu4/V6yVEQO5s5caIXX3xR0dHRJ30gRu10NnPi888/11tvvaXHHnusGiJEdTqb+fD111+roKBAl19+uf70pz8pPz9fM2bM0NGjR3XDDTdUQ9SoSmczJy6//HIVFxdr/PjxkqSjR4/qqquu0pAhQ6o6XNRQp7q+/O6773TkyJEz7p1PIR2oAs8++6x27txZrvcugkPz5s01efJkHTp0SO+9956mTZumBx98MNBh4RwoLCzUzJkzdf/993MDmiB1/AqUhIQEf2F9zZo15DxIuK6r1q1ba8SIEZKkVq1aaceOHXrjjTcqfSMhADXTwoULtWrVKk2YMIGf3XXUd99952/Dd6xFG+o2a60iIiJ06623ynEcJSUlad++fXrllVcopNdRGzdu1IIFCzR69GilpKQoPz9fzz//vObNm6ehQ4cGOjzUYhTSa4hj/7NWVFSkqKgo//aioiL6etUyzz77rNatW6cHH3xQTZo08W/3eDwqKyvTwYMHy614LCoqOul/VlFzhYaG+nvtJiUladu2bcrKylL37t3Jby2Xl5enoqIi/fGPf/Rvc11Xn332mbKzszVu3DhyHGQaNWqk5s2bKz8/X506dSK/QSAqKkrx8fHltsXHx+v999+XxPVWIERERMhxnJNWk3u93lO+tzwez0k3D+O9GDzOZk4c88orr2jhwoUaP378STcER+1V2TlxbPVxRkaGf5u1VpI0fPhwPfnkk/7rddQ+Z/vvRmhoqBznv92LW7RoIa/Xq7KyMoWGUvqqzc5mTsydO1dXXHGF+vbtK0lq2bKlDh8+rGeeeUZDhgwpN1dQN5zq+rJBgwaV+o95Zk4NERMTI4/HU+6GOYcOHdLWrVuVmpoawMhwpqy1evbZZ/XBBx/oz3/+80k3vElKSlJISEi5HO/evVuFhYXkuBZzXVelpaXkNwh07NhR//d//6fHHnvM/6t169a6/PLL/X8mx8Hl8OHDys/Pl8fj4T0cJNq0aXPSV3x3796tZs2aSeJ6KxBCQ0OVlJSknJwc/zbXdZWTk3PKv/PU1NSTbiK5fv16paSkVGmsqB5nMyck382EX375ZY0dO1atW7eujlBRTSo7J5o3b37SNdtFF12k9u3b67HHHlPTpk2rM3ycY2fzM6JNmzbKz88v1xN9z549ioqKoogeBM5mTpSUlMgYU24bxfO6LSUlpcLry8p+BuAnSjU69oH9mL1792r79u1q3LixmjZtqoEDB2r+/PmKi4tTTEyM5syZo6ioKHXr1i2AUeNMPfvss3r33Xd17733qkGDBv7/LW3YsKHCw8PVsGFD9enTR7NmzVLjxo3VsGFDPffcc0pNTeXDey0xe/ZsdenSRU2bNtXhw4f17rvvatOmTRo3bhz5DQINGjTw39PgmHr16um8887zbyfHtdusWbN08cUXq2nTptq/f78yMzPlOI4uv/xy3sNB4pprrtH48eM1f/58de/eXVu3btWyZct0yy23SJKMMVxvBUBaWpqmTZumpKQkJScnKysrSyUlJf52O1OnTlV0dLS/Jc/AgQM1YcIELV68WF27dtWqVau0bds2fx5R+1V2TixcuFCZmZkaM2aMYmJi/NfZ9evXV/369QN0FjiXKjMnwsPDT7pmO/ZtshO3o3aq7M+Ifv366fXXX9fMmTM1YMAA5efna8GCBbr66qsDeBY4lyo7Jy666CK9+uqratWqlb+1y9y5c3XRRRdRUA8SP1RjnT17tvbt26e77rpL0n9/Tvz73/9W7969lZOTozVr1ui+++6r1HEppFejbdu2leulPGvWLEnSlVdeqTvvvFPXXXedSkpKNH36dB06dEht27bV2LFj6f1XSyxdulSSNGHChHLb77jjDv8P95tvvlnGGD3++OMqKytT586dNXr06GqOFGerqKhI06ZN0/79+9WwYUMlJCRo3Lhx6tSpkyTyWxeQ49pt3759mjJlir799ltFRESobdu2mjRpkr+/Kvmt/ZKTk/WHP/xBs2fP1ssvv6yYmBjdfPPN6tmzp38M11vVr3v37iouLlZmZqa8Xq8SExM1duxY/9exCwsLy60aa9OmjcaMGaM5c+bopZdeUlxcnO655x4KZEGksnPijTfeUFlZmZ544olyrzN06FANGzasOkNHFansnEBwq+x8aNq0qcaNG6cXXnhB99xzj6Kjo3X11Vdr0KBBgTkBnHOVnRPXX3+9jDGaM2eO9u3bp4iICF100UW68cYbA3QGONd+qMa6f/9+FRYW+p+PiYnRfffdpxdeeEFZWVlq0qSJbrvtNnXp0qVSxzX2WDMxAAAAAAAAAABwEr7PAAAAAAAAAADAaVBIBwAAAAAAAADgNCikAwAAAAAAAABwGhTSAQAAAAAAAAA4DQrpAAAAAAAAAACcBoV0AAAAAAAAAABOg0I6AAAAAAAAAACnQSEdAAAAAAAAAIDToJAOAAAAAAAAAMBpUEgHAAAAAAAAAOA0KKQDAAAAAAAAAHAa/x990JXOEfWSngAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "grid_use=heatmap_data.copy().iloc[:, 1:]\n", - "sub_titles = [f\"Surface Loss Width={width}\" for width in grid_use.index]\n", - "plot_subplot(\n", - " grid=grid_use, \n", - " x='column', \n", - " label='Surface Loss', \n", - " sup_tile='Surface Loss by Width and DTE',\n", - " subplot_title_format=sub_titles\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'var0': 0.08593552625319342,\n", - " 'var_inf': 0.0714677580702203,\n", - " 'kappa': 2.742464972687961,\n", - " 'eta': 1.4015869600327218,\n", - " 'lambda': -0.5842413276491021,\n", - " 'rho': 0.20172681953864702}" - ] - }, - "execution_count": 279, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "params = error_df[(error_df.width==0.8) &\n", - " (error_df.DTE_MIN_THRESHOLD==30)].sort_values('surface_loss').model_params.values[0]\n", - "params\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(219, 'P')" - ] - }, - "execution_count": 280, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# aapl_chain_clipped_lab\n", - "\n", - "tgt_right='P'\n", - "T_use=aapl_chain_clipped_lab['T'].unique()[11]\n", - "dte_use=aapl_chain_clipped_lab[aapl_chain_clipped_lab['T']==T_use]['DTE'].values[0]\n", - "dte_calc=T_use * 365.25\n", - "T_grid= aapl_chain_clipped_lab['T'].values\n", - "T_use_mask = T_grid ==T_use\n", - "C_index = aapl_chain_clipped_lab['Right'] == tgt_right\n", - "T_use_index = np.where(T_use_mask & C_index)\n", - "var0_hat = params['var0']\n", - "var_inf_hat = params['var_inf']\n", - "kappa_hat = params['kappa']\n", - "eta_hat = params['eta']\n", - "lambda_hat = params['lambda']\n", - "rho_hat = params['rho']\n", - "\n", - "K_grid= aapl_chain_clipped_lab['Strike'].values\n", - "fwd = aapl_chain_clipped_lab['F'].values\n", - "market_iv = aapl_chain_clipped_lab['bs_vol'].values\n", - "K_use = K_grid[T_use_index]\n", - "fwd_use = fwd[T_use_index]\n", - "log_moneyness = np.log(K_use / fwd_use)\n", - "market_iv_use = market_iv[T_use_index]\n", - "model_use = ssvi_implied_vol(\n", - " fwd_use, K_use, T_use,\n", - " var0_hat, var_inf_hat, kappa_hat,\n", - " eta_hat, lambda_hat, rho_hat\n", - ")\n", - "model_use\n", - "dte_use, tgt_right" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "SVI RMSE: 0.0770, Dumas RMSE: 0.0884, Model RMSE: 0.0289\n" - ] - }, - { - "data": { - "text/plain": [ - "array([0.26430563, 0.25947963, 0.25486334, 0.25044534, 0.24621503,\n", - " 0.24216258, 0.23827885, 0.23455532, 0.23098402, 0.22755756,\n", - " 0.22426897, 0.22111177, 0.21807986, 0.21516752, 0.21236937,\n", - " 0.20968038, 0.20709577, 0.20461107, 0.19992472, 0.45102003,\n", - " 0.43587886, 0.42174918, 0.4085337 , 0.39614772, 0.38451709,\n", - " 0.37357657, 0.36326852, 0.35354175, 0.34435066, 0.33565446,\n", - " 0.32741653, 0.3196039 , 0.31218679, 0.30513821, 0.29843365,\n", - " 0.29205079, 0.28596925, 0.28017039, 0.2746371 , 0.26935367])" - ] - }, - "execution_count": 281, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "vols = lab.predict(\n", - " dte = float(dte_use),\n", - " k= K_use,\n", - " right='P'\n", - ")\n", - "\n", - "dumas=vols['dumas']\n", - "svi=vols['svi']\n", - "svi_rmse = np.sqrt(np.mean((svi - market_iv_use)**2))\n", - "dumas_rmse = np.sqrt(np.mean((dumas - market_iv_use)**2))\n", - "model_rmse = np.sqrt(np.mean((model_use - market_iv_use)**2))\n", - "print(f\"SVI RMSE: {svi_rmse:.4f}, Dumas RMSE: {dumas_rmse:.4f}, Model RMSE: {model_rmse:.4f}\")\n", - "vols.pop('dumas')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "hovertemplate": "variable=svi
k=%{x}
value=%{y}", - "legendgroup": "svi", - "line": { - "color": "#636efa", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "svi", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": { - "bdata": "AAAAAACAW0AAAAAAAMBcQAAAAAAAAF5AAAAAAABAX0AAAAAAAEBgQAAAAAAA4GBAAAAAAACAYUAAAAAAACBiQAAAAAAAwGJAAAAAAABgY0AAAAAAAABkQAAAAAAAoGRAAAAAAABAZUAAAAAAAOBlQAAAAAAAgGZAAAAAAAAgZ0AAAAAAAMBnQAAAAAAAYGhAAAAAAAAAaUAAAAAAAKBpQAAAAAAAQGpAAAAAAADgakAAAAAAAIBrQAAAAAAAIGxAAAAAAADAbEAAAAAAAGBtQAAAAAAAAG5AAAAAAACgbkAAAAAAAEBvQAAAAAAA4G9AAAAAAABAcEAAAAAAAJBwQAAAAAAA4HBAAAAAAAAwcUAAAAAAAIBxQAAAAAAA0HFAAAAAAAAgckAAAAAAAHByQAAAAAAAwHJAAAAAAABgc0A=", - "dtype": "f8" - }, - "xaxis": "x", - "y": { - "bdata": "91YnB50P2j+oOSD8o5XZPwedKTOxHtk/Tndzyn6q2D8XebpBzjjYP6s+sFtnydc/aHmYMRdc1z8yo5xur/DWP1SjyaoFh9Y/N7l53/Ie1j+oDEfwUrjVPzdfqEQEU9U/lv4fb+fu1D9HPn3f3ovUP3HiJZ7OKdQ/6Ve3DpzI0z+GaJW4LWjTP7TCMRRrCNM/jmwAXDyp0j/kfitgikrSPysRLlw+7NE/mm6MzUGO0T/GoOdKfjDRP5RSrVrd0tA/BQGlSEh10D8hgJz5pxfQPyHIA3nJc88/xTjSMMy3zj/4FiovJfvNP/ke2SKfPc0/NLL99QF/zD/I0hK0Er/LP0GmPZ2U/co/jYIHjFA6yj8Bnwo0XnXJP7BaTITxx8k//SG+LyEzzT+0Bl4NsBvQP04mP5j/dtE/yuIGEL3Y0z8=", - "dtype": "f8" - }, - "yaxis": "y" - }, - { - "hovertemplate": "variable=ssvi
k=%{x}
value=%{y}", - "legendgroup": "ssvi", - "line": { - "color": "#EF553B", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "ssvi", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": { - "bdata": "AAAAAACAW0AAAAAAAMBcQAAAAAAAAF5AAAAAAABAX0AAAAAAAEBgQAAAAAAA4GBAAAAAAACAYUAAAAAAACBiQAAAAAAAwGJAAAAAAABgY0AAAAAAAABkQAAAAAAAoGRAAAAAAABAZUAAAAAAAOBlQAAAAAAAgGZAAAAAAAAgZ0AAAAAAAMBnQAAAAAAAYGhAAAAAAAAAaUAAAAAAAKBpQAAAAAAAQGpAAAAAAADgakAAAAAAAIBrQAAAAAAAIGxAAAAAAADAbEAAAAAAAGBtQAAAAAAAAG5AAAAAAACgbkAAAAAAAEBvQAAAAAAA4G9AAAAAAABAcEAAAAAAAJBwQAAAAAAA4HBAAAAAAAAwcUAAAAAAAIBxQAAAAAAA0HFAAAAAAAAgckAAAAAAAHByQAAAAAAAwHJAAAAAAABgc0A=", - "dtype": "f8" - }, - "xaxis": "x", - "y": { - "bdata": "tafgKzxb3T8jY/hj74zcPxq/7Rl+wts/PK2ITov72j+SZg3kyjfaPzyhW1ECd9k/nzOSkwq52D/71k2+0/3XPxQ3/sVqRdc/JHOXdwKQ1j/N0G0TAd7VPyGQ574UMNU/2wxxAlKH1D+LdWqpYOXTP5T3XNK7TNM/0S7wOQfB0j+KNM/3bkfSP70B+6Li5tE/esr17Lan0T9/FJVEAJLRP2MO0gmFqtE/NmI6/O7v0T9zFu/K2FrSP6UCLn7f4NI/4qjcdQh40z98RVwLgRjUP2K8k3vVvNQ/onqslnph1T/QOud/PQTWPyJM/SfPo9Y/9R5fsXI/1z+fnyynx9bXPxlNTnCnadg/RzGMUA/42D8LCglsEoLZPwC8V97QB9o/eYuRCnKJ2j+y9O35IAfbP1ADnQwKgds/84l8ozpq3D8=", - "dtype": "f8" - }, - "yaxis": "y" - }, - { - "hovertemplate": "variable=market_iv
k=%{x}
value=%{y}", - "legendgroup": "market_iv", - "line": { - "color": "#00cc96", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "market_iv", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": { - "bdata": "AAAAAACAW0AAAAAAAMBcQAAAAAAAAF5AAAAAAABAX0AAAAAAAEBgQAAAAAAA4GBAAAAAAACAYUAAAAAAACBiQAAAAAAAwGJAAAAAAABgY0AAAAAAAABkQAAAAAAAoGRAAAAAAABAZUAAAAAAAOBlQAAAAAAAgGZAAAAAAAAgZ0AAAAAAAMBnQAAAAAAAYGhAAAAAAAAAaUAAAAAAAKBpQAAAAAAAQGpAAAAAAADgakAAAAAAAIBrQAAAAAAAIGxAAAAAAADAbEAAAAAAAGBtQAAAAAAAAG5AAAAAAACgbkAAAAAAAEBvQAAAAAAA4G9AAAAAAABAcEAAAAAAAJBwQAAAAAAA4HBAAAAAAAAwcUAAAAAAAIBxQAAAAAAA0HFAAAAAAAAgckAAAAAAAHByQAAAAAAAwHJAAAAAAABgc0A=", - "dtype": "f8" - }, - "xaxis": "x", - "y": { - "bdata": "WtYgwkUV3D9GwW9UjkrbP4h2dn37hdo/RUp/rZkf2j9qhgA7H1/ZPzXbU+U2Ydg/fgz4Hlvm1z8TLY8afxXXPz0nXzDgedY/Li8kD3Lm1T/nRN62NFvVPxKe1ZAD0tQ/P1b0LkBb1D80HAiWrezTP5slWS8ngNM/yjyfkdEb0z/BYdq8rL/SP7rlPKz1ddI/QCZiaTIq0j/j3wzCVtrRP8FJEdolp9E/hpm3GnuK0T8OOQScJVHRPw45BJwlUdE/uG5MBQFL0T+MnmSEPanQP/jc9EyHjNE/UWX7a4e30T9t3oAHb7PRP8Z+UAn29tI/K0FDwYiQ0z88mKWmZDbUP3dgyEiWa9U/lVA+i3KS1j9XWYbq4HvXP0AVQH7Jz9g/5qQCQlC92T/+dwI446zaPwop33dqRtw/6gnUNi4+3T8=", - "dtype": "f8" - }, - "yaxis": "y" - } - ], - "layout": { - "legend": { - "title": { - "text": "variable" - }, - "tracegroupgap": 0 - }, - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermap": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermap" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "title": { - "text": "Volatility Surface for DTE=219 days" - }, - "xaxis": { - "anchor": "y", - "domain": [ - 0, - 1 - ], - "title": { - "text": "k" - } - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0, - 1 - ], - "title": { - "text": "value" - } - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "full_data = pd.DataFrame(vols).set_index('k')\n", - "full_data['ssvi']= model_use\n", - "full_data['market_iv'] = market_iv_use\n", - "full_data.sort_index(inplace=True)\n", - "full_data.plot(\n", - "\n", - " title=f\"Volatility Surface for DTE={dte_use} days\",\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "hovertemplate": "variable=market_iv
log_moneyness=%{x}
value=%{y}", - "legendgroup": "market_iv", - "line": { - "color": "#636efa", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "market_iv", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": { - "bdata": "RpM/OaYqAcC7k0Jwgmr/v2ZZOrwb8/y/11z16ynQ+r+prRJ1ue34v5IJAvMqPve/JkVu+8a39b/DdsXwYFP0vxubCRSGC/O/bjy9PPrb8b+AI9L3YcHwv79/8NgQcu+/lGnvzG2B7b9hISvrL63rv8qaxrxE8um/NtkJ5xJO6L+3rBqDYr7mv15Q4vdKQeW/u5eS3STV47+Ys5Difnjiv60yI/UUKuG/j/gxUpLR3795qpbpO2fdv9x9APViE9u//91CS3PU2L8gGlThAanWvyd0KWXHj9S/oIvss5uH0r9uCAUDco/Qv5G+1DerTM2/mGFmIs6Wyb/JncOws/vFvxciuW/kecK/0wZj7g0gvr8OgcmVuXm3vzn6fEB//rC/RmTr6XtYpb/0WA6E8AOSvwdlJL3BUXg/LTL94gCfnT9b8VtbEFGqP6IRPQvxyLI/9tpSS19KuD+8MkzjIK69P4YHwI+3esE/BR1cJ7gQxD8FcqqhnJnGP572hFfnFck/wSy+LhOGyz/MkrsolOrNPzUg/fHrIdA/AvbzCCNJ0T+Z1iZxIGvSP+CVsbISiNM/k8i/8iWg1D++WaAchLPVP7j/ypi+zNc/P+gHSurU2T9wa+/6E83bP5UUCmIwtt0/E0PB7B6R3z99UskSVq/gP2rxC+PJj+E/FdktQUFq4j/NCUHMCz/jPw==", - "dtype": "f8" - }, - "xaxis": "x", - "y": { - "bdata": "3nLRqT4D8z/eFdB/ImnuP71PQtLjBOw/UJrBYqX26T+wD6wI4SfoP/9dxo5O5Oc/gsjT4Chb5j/pRcAIX2LlP/Vn475quOQ/qGAnGuT14z+ndZvkMlfjP+qJydENpeI/oUBctWIH4j/apgJ77nLhP/aTI6WS4uA/hMSBAUNU4D8l6r+75ovfP0Oqozi1gd4/Df/24syD3T/XU0qN5IXcP/nRfJKOoNs/4f58nPuw2j8hVVwB+9nZPw1Aq5NDD9k/a243WJhG2D90MTNKNorXP7hFYTcR2NY/NavBHykw1j+Z9sMwx57VP8CRbIK68NQ/XS6hjpVp1D9sDhPNfOTTP0P8edSUZ9M/OMKNOwL50j/1lZZroJLSP7Jpn5s+LNI//1iSXT7W0T9qIDJ/k47RP4B8Qc4xU9E/CRyOT9wZ0T9dhx4ikw3RP600YGxu3NA/mDd44T0q0T+l0Is+PqvRPzmqxFh74NE/o4ktXVex0j/SuDyiiGXTPx7A+EYPKNQ/2sOTPLvy1T+Hz/MQ+SnXPxfr3aJaOtc/5qQCQlC92T912LW2OObaP6uDYgwh5Ns/dmdvQLQp3T9dxAEQL2vePyndUx7VFuA/YOcnOCsn4T8MlGBI+0viP6O3TFxXMuM/yvYiAhUp5D+OXpIl8STlP+nRJHqi7uU/EIWWrhxZ5j884eKgI4fnPw==", - "dtype": "f8" - }, - "yaxis": "y" - }, - { - "hovertemplate": "variable=model_iv
log_moneyness=%{x}
value=%{y}", - "legendgroup": "model_iv", - "line": { - "color": "#EF553B", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "model_iv", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": { - "bdata": "RpM/OaYqAcC7k0Jwgmr/v2ZZOrwb8/y/11z16ynQ+r+prRJ1ue34v5IJAvMqPve/JkVu+8a39b/DdsXwYFP0vxubCRSGC/O/bjy9PPrb8b+AI9L3YcHwv79/8NgQcu+/lGnvzG2B7b9hISvrL63rv8qaxrxE8um/NtkJ5xJO6L+3rBqDYr7mv15Q4vdKQeW/u5eS3STV47+Ys5Difnjiv60yI/UUKuG/j/gxUpLR3795qpbpO2fdv9x9APViE9u//91CS3PU2L8gGlThAanWvyd0KWXHj9S/oIvss5uH0r9uCAUDco/Qv5G+1DerTM2/mGFmIs6Wyb/JncOws/vFvxciuW/kecK/0wZj7g0gvr8OgcmVuXm3vzn6fEB//rC/RmTr6XtYpb/0WA6E8AOSvwdlJL3BUXg/LTL94gCfnT9b8VtbEFGqP6IRPQvxyLI/9tpSS19KuD+8MkzjIK69P4YHwI+3esE/BR1cJ7gQxD8FcqqhnJnGP572hFfnFck/wSy+LhOGyz/MkrsolOrNPzUg/fHrIdA/AvbzCCNJ0T+Z1iZxIGvSP+CVsbISiNM/k8i/8iWg1D++WaAchLPVP7j/ypi+zNc/P+gHSurU2T9wa+/6E83bP5UUCmIwtt0/E0PB7B6R3z99UskSVq/gP2rxC+PJj+E/FdktQUFq4j/NCUHMCz/jPw==", - "dtype": "f8" - }, - "xaxis": "x", - "y": { - "bdata": "poHsFTNC6j/tUCvQ6i3pP5nHzNrPOug/6QJOzVNg5z/Sz4B62JjmP8mNqt134OU/6O7MQF805T/qAPM+cZLkP+iBveIM+eM/FNAtiulm4z+dyhYP/9riP2SeZoN1VOI/BmT/yZnS4T/1XfBo1VThP5iNso+o2uA/1An0qaVj4D/e6wgj3N7fP5EDdi5f+94/dRyAZ0Uc3j/NhTSGEkHdP104/3dbadw/Oa0zwcWU2z+0R4jnB8PaP7UaKBzr89k/H+2SiE4n2T+jS/jiLF3YP5bFqFKlldc/TUg+SAnR1j9t0mPc8Q/WP3kRraxgU9U/HP6GDvKc1D+GA/5GKO/TP9X+3sjWTdM/yMcePqm+0j+yRiSnmEnSPz4VJCK++NE/Qg8GjHvW0T9cKGEMc+nRP+n3du9wMNI/kqH3BFWi0j+a6ZT3WjLTP9NmUxmk1NM/JCgvskKA1D+VwZSaPi/VP3XwWCnd3dU/rV/VyuSJ1j+IThjUEDLXP/hK7pe01dc/GiLioIB02D/9MmYmXg7ZP/9FyWlYo9k/Xdo6qY4z2j9xtLBfK7/aP65mFs9eRts/jex0mVvJ2z8WnnmmVEjcP3XgGl4BO90/dVZQxNwf3j8jvfzLOfjePzjZBDVFxd8/y0evDwRE4D8qBA/ytaDgP6zi5Asf+eA/iaZZIppN4T9gB82bd57hPw==", - "dtype": "f8" - }, - "yaxis": "y" - } - ], - "layout": { - "legend": { - "title": { - "text": "variable" - }, - "tracegroupgap": 0 - }, - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermap": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermap" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "title": { - "text": "SSVI Volatility Surface at T=0.43 years" - }, - "xaxis": { - "anchor": "y", - "domain": [ - 0, - 1 - ], - "title": { - "text": "log_moneyness" - } - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0, - 1 - ], - "title": { - "text": "value" - } - } - } - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "dataframe_vols = pd.DataFrame({\n", - " 'K': K_use,\n", - " 'log_moneyness': log_moneyness,\n", - " 'market_iv': market_iv_use,\n", - " 'model_iv': model_use\n", - "})\n", - "dataframe_vols.sort_values('log_moneyness').plot(\n", - " x='log_moneyness',\n", - " y=['market_iv', 'model_iv'],\n", - " kind='line',\n", - " title=f'SSVI Volatility Surface at T={T_use:.2f} years'\n", - "\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(211.06290118921353, 215.0, 0.10130047912388775, 0.29094924873121825)" - ] - }, - "execution_count": 39, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "fwd[0],\\\n", - "K_grid[0],\\\n", - "T_grid[0],\\\n", - "market_iv[0]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def as_column(a):\n", - " \"\"\"Return a (len,1) column regardless of original rank.\"\"\"\n", - " return np.asarray(a).reshape(-1, 1)\n", - "\n", - "def as_row(a):\n", - " \"\"\"Return a (1,len) row regardless of original rank.\"\"\"\n", - " return np.asarray(a).reshape(1, -1)\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "ename": "ValueError", - "evalue": "operands could not be broadcast together with shapes (43,) (649,) ", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[41], line 12\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m idx, maturity \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28menumerate\u001b[39m(unique_T):\n\u001b[1;32m 11\u001b[0m sel \u001b[38;5;241m=\u001b[39m T_grid \u001b[38;5;241m==\u001b[39m maturity\n\u001b[0;32m---> 12\u001b[0m k_vals \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39mlog(\u001b[43mK_grid\u001b[49m\u001b[43m[\u001b[49m\u001b[43msel\u001b[49m\u001b[43m]\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m/\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mfwd\u001b[49m) \u001b[38;5;66;03m# log-moneyness\u001b[39;00m\n\u001b[1;32m 13\u001b[0m iv_market \u001b[38;5;241m=\u001b[39m market_iv[sel]\n\u001b[1;32m 14\u001b[0m iv_model \u001b[38;5;241m=\u001b[39m fitted_iv[sel]\n", - "\u001b[0;31mValueError\u001b[0m: operands could not be broadcast together with shapes (43,) (649,) " - ] - }, - { - "data": { - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# -------------------------------------------------\n", - "# 6. Plot: market IV (dots) vs SSVI fit (lines)\n", - "# -------------------------------------------------\n", - "import matplotlib.pyplot as plt\n", - "\n", - "unique_T = np.unique(T_grid)\n", - "color_map = plt.cm.viridis(np.linspace(0, 1, len(unique_T)))\n", - "\n", - "plt.figure(figsize=(9, 5))\n", - "for idx, maturity in enumerate(unique_T):\n", - " sel = T_grid == maturity\n", - " k_vals = np.log(K_grid[sel] / fwd) # log-moneyness\n", - " iv_market = market_iv[sel]\n", - " iv_model = fitted_iv[sel]\n", - "\n", - " plt.scatter(k_vals, iv_market, color=color_map[idx],\n", - " label=f\"T={maturity:.2f} market\", marker='o')\n", - " plt.plot (k_vals, iv_model, color=color_map[idx],\n", - " label=f\"T={maturity:.2f} model\")\n", - "\n", - "plt.title(\"SSVI fit vs. market implied vols\")\n", - "plt.xlabel(\"log-moneyness k = ln(K/F)\")\n", - "plt.ylabel(\"Implied volatility\")\n", - "plt.grid(True)\n", - "plt.legend(fontsize=8, ncol=2)\n", - "plt.tight_layout()\n", - "plt.show()\n", - "\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "openbb_new_use", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.13" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/trade/optionlib/pricing/binomial.py b/trade/optionlib/pricing/binomial.py index 916ef06..eb405d9 100644 --- a/trade/optionlib/pricing/binomial.py +++ b/trade/optionlib/pricing/binomial.py @@ -2,38 +2,33 @@ from datetime import datetime from typing import List import numpy as np -from typing import Tuple +from typing import Tuple, Iterable from numba import njit from numba import types +from numba.typed import List as _List from trade.helpers.Logging import setup_logger from trade.helpers.helper import Scalar +from trade.helpers.threads import runThreads +from ..utils.format import assert_equal_length from ..config.defaults import DAILY_BASIS from ..assets.forward import time_distance_helper from ..assets.dividend import ( DividendSchedule, ContinuousDividendYield, ) -from ..assets.forward import ( - EquityForward -) -logger = setup_logger('trade.optionlib.pricing.binomial') +from ..assets.forward import EquityForward + +logger = setup_logger("trade.optionlib.pricing.binomial") def convert_schedule_to_numba(schedule: list[tuple[float, float]]) -> List: - lst = List.empty_list(types.UniTuple(types.float64, 2)) + lst = _List.empty_list(types.UniTuple(types.float64, 2)) for t_frac, amount in schedule: lst.append((float(t_frac), float(amount))) return lst -def crr_init_parameters( - sigma: float, - r: float, - T: float, - N: int, - div_yield: float = 0.0, - dividend_type: bool = True -): +def crr_init_parameters(sigma: float, r: float, T: float, N: int, div_yield: float = 0.0, dividend_type: bool = True): """ params: sigma: Volatility of the underlying asset @@ -43,24 +38,12 @@ def crr_init_parameters( dividend_type: Type of dividend ('discrete' or 'continuous' """ is_continuous = dividend_type - return _crr_init_parameters( - sigma=sigma, - r=r, - T=T, - N=N, - div_yield=div_yield, - is_continuous=is_continuous) - + return _crr_init_parameters(sigma=sigma, r=r, T=T, N=N, div_yield=div_yield, is_continuous=is_continuous) @njit def _crr_init_parameters( - sigma: float, - r: float, - T: float, - N: int, - div_yield: float = 0.0, - is_continuous: bool = True + sigma: float, r: float, T: float, N: int, div_yield: float = 0.0, is_continuous: bool = True ) -> Tuple[float, float, float, float]: """ params: @@ -77,6 +60,7 @@ def _crr_init_parameters( p = (np.exp((r - y) * dt) - d) / (u - d) return u, d, p, dt + @njit def build_tree(S0: float, u: float, d: float, N: int) -> np.ndarray: """ @@ -91,7 +75,7 @@ def build_tree(S0: float, u: float, d: float, N: int) -> np.ndarray: tree = np.zeros((N + 1, N + 1)) for i in range(N + 1): for j in range(i + 1): - tree[i, j] = S0 * (u ** j) * (d ** (i - j)) + tree[i, j] = S0 * (u**j) * (d ** (i - j)) return tree @@ -107,6 +91,7 @@ def apply_discrete_dividends(discrete_dividends: List[Tuple[float, float]], stoc dividends = convert_schedule_to_numba(discrete_dividends) # Convert dividends to a Numba List return _apply_discrete_dividends_jit(dividends, stock_tree, N) + @njit def _apply_discrete_dividends_jit(dividends: List[Tuple[float, float]], tree: np.ndarray, N: int): """ @@ -124,6 +109,7 @@ def _apply_discrete_dividends_jit(dividends: List[Tuple[float, float]], tree: np tree[i, j] = max(tree[i, j] - div, 0) return tree + def create_option_tree(stock_tree: np.ndarray, K: float, option_type: str, N: int) -> np.ndarray: """ Create the option value tree based on the stock price tree. @@ -136,9 +122,10 @@ def create_option_tree(stock_tree: np.ndarray, K: float, option_type: str, N: in """ if stock_tree is None: raise ValueError("stock_tree is None before calling _create_option_tree_jit") - option_type = 0 if option_type.lower() == 'c' else 1 # 0 for call, 1 for put + option_type = 0 if option_type.lower() == "c" else 1 # 0 for call, 1 for put return _create_option_tree_jit(stock_tree, K, option_type, N) + @njit def _create_option_tree_jit(tree: np.ndarray, K: float, option_type: int, N: int) -> np.ndarray: """ @@ -163,7 +150,6 @@ def _create_option_tree_jit(tree: np.ndarray, K: float, option_type: int, N: int return option_tree - def calculate_option_values( stock_tree: np.ndarray, option_values: np.ndarray, @@ -173,7 +159,7 @@ def calculate_option_values( N: int, p: float, american: bool = False, - option_type: int = 0 + option_type: int = 0, ) -> Tuple[float, np.ndarray, np.ndarray]: """ Calculate the option values at each node in the binomial tree. @@ -187,11 +173,8 @@ def calculate_option_values( """ stock_tree = np.asarray(stock_tree) option_values = np.asarray(option_values) - option_type = 0 if option_type.lower() == 'c' else 1 # 0 for call, 1 for put - return _calculate_option_values_jit( - stock_tree, option_values, K, r, dt, N, p, american, option_type - ) - + option_type = 0 if option_type.lower() == "c" else 1 # 0 for call, 1 for put + return _calculate_option_values_jit(stock_tree, option_values, K, r, dt, N, p, american, option_type) @njit @@ -204,7 +187,7 @@ def _calculate_option_values_jit( N: int, p: float, american: bool = False, - option_type: int = 0 + option_type: int = 0, ) -> Tuple[float, np.ndarray, np.ndarray]: """ Calculate the option values at each node in the binomial tree. @@ -220,14 +203,14 @@ def _calculate_option_values_jit( raise ValueError("stock_tree is None before calling _create_option_tree_jit") if option_tree is None: raise ValueError("option_tree is None before calling _calculate_option_values_jit") - + V1 = np.zeros(2) V2 = np.zeros(3) for i in range(N - 1, -1, -1): for j in range(i + 1): expected = np.exp(-r * dt) * (p * option_tree[i + 1, j + 1] + (1 - p) * option_tree[i + 1, j]) if american: - if option_type ==0: + if option_type == 0: intrinsic = max(tree[i, j] - K, 0) else: intrinsic = max(K - tree[i, j], 0) @@ -243,8 +226,6 @@ def _calculate_option_values_jit( return option_tree[0, 0], V1, V2 - - def crr_binomial_pricing( K: float, T: float, @@ -252,15 +233,15 @@ def crr_binomial_pricing( r: float, N: int, S0: float, - option_type: str = 'c', + option_type: str = "c", american: bool = False, div_yield: float = 0.0, - dividends: List[Tuple[float, float]] = [], # noqa - dividend_type: str = 'discrete' + dividends: List[Tuple[float, float]] = [], # noqa + dividend_type: str = "discrete", ) -> float: """ Calculate the price of an option using the Cox-Ross-Rubinstein binomial model. - + Parameters: - K: Strike price - T: Time to expiration (in years) @@ -273,24 +254,20 @@ def crr_binomial_pricing( - div_yield: Dividend yield (annualized, default is 0.0) - dividends: List of tuples (time fraction, amount) for discrete dividends (default is None) - dividend_type: 'discrete' for discrete dividends, 'continuous' for continuous dividends (default is 'discrete') - + If 'discrete', dividends should be a list of tuples where each tuple contains the time fraction (as a float) and the amount (as a float). If 'continuous', div_yield should be provided as a float representing the annualized dividend yield. If no dividends are provided, the function assumes no dividends. If 'dividend_type' is 'continuous', the function will treat the dividend yield as a continuous yield. - + Returns: The calculated price of the option. """ - is_continuous = (dividend_type == 'continuous') - option_type = 0 if option_type.lower() == 'c' else 1 # 0 for call, 1 for put - dividends = convert_schedule_to_numba(dividends) # Convert dividends to a Numba List - - return _crr_binomial_pricing_jit( - K, T, sigma, r, N, S0, option_type, american, - div_yield, dividends, is_continuous - ) + is_continuous = dividend_type == "continuous" + option_type = 0 if option_type.lower() == "c" else 1 # 0 for call, 1 for put + dividends = convert_schedule_to_numba(dividends) # Convert dividends to a Numba List + return _crr_binomial_pricing_jit(K, T, sigma, r, N, S0, option_type, american, div_yield, dividends, is_continuous) @njit @@ -304,12 +281,12 @@ def _crr_binomial_pricing_jit( option_type: int = 0, american: bool = False, div_yield: float = 0.0, - dividends: List[Tuple[float, float]] = [], # noqa - is_continuous: bool = True + dividends: List[Tuple[float, float]] = [], # noqa + is_continuous: bool = True, ) -> float: """ Calculate the price of an option using the Cox-Ross-Rubinstein binomial model. - + Parameters: - K: Strike price - T: Time to expiration (in years) @@ -322,12 +299,12 @@ def _crr_binomial_pricing_jit( - div_yield: Dividend yield (annualized, default is 0.0) - dividends: List of tuples (time fraction, amount) for discrete dividends (default is None) - dividend_type: 'discrete' for discrete dividends, 'continuous' for continuous dividends (default is 'discrete') - + If 'discrete', dividends should be a list of tuples where each tuple contains the time fraction (as a float) and the amount (as a float). If 'continuous', div_yield should be provided as a float representing the annualized dividend yield. If no dividends are provided, the function assumes no dividends. If 'dividend_type' is 'continuous', the function will treat the dividend yield as a continuous yield. - + Returns: The calculated price of the option. """ @@ -339,20 +316,95 @@ def _crr_binomial_pricing_jit( return price +def vector_crr_binomial_pricing( + K: Iterable, + T: Iterable, + sigma: Iterable, + r: Iterable, + N: Iterable, + S0: Iterable, + right: Iterable, + american: Iterable, + dividend_yield: Iterable = None, + dividends: Iterable = None, + dividend_type: Iterable = None, +) -> Iterable[float]: + """ + Vectorized CRR binomial option pricing. + Parameters: + - K: Strike prices + - T: Time to maturities (in years) + - sigma: Volatilities + - r: Risk-free interest rates + - N: Number of binomial steps + - S0: Current underlying asset prices + - right: Option types ('c' for call, 'p' for put) + - american: Flags indicating if options are American (True) or European (False) + - dividend_yield: Continuous dividend yields (optional) + - dividends: Discrete dividend schedules (optional) + - dividend_type: Types of dividends ('continuous' or 'discrete') (optional) + Returns: + - List of option prices + """ + + if dividend_yield is None: + dividend_yield = [0.0] * len(K) + + if dividends is None: + dividends = [()] * len(K) + + if dividend_type is None: + dividend_type = ["continuous"] * len(K) + + assert_equal_length( + K, + T, + sigma, + r, + N, + S0, + right, + american, + dividend_yield, + dividends, + dividend_type, + names=["K", "T", "sigma", "r", "N", "S0", "right", "american", "dividend_yield", "dividends", "dividend_type"], + ) + + return runThreads( + crr_binomial_pricing, + [ + K, # K + T, # T + sigma, # sigma + r, # r + N, # N + S0, # S0 + right, # option_type + american, # american + dividend_yield, # dividend_yield + dividends, # dividends, + dividend_type, + ], + ) + + class BinomialBase(ABC): - def __init__(self, - K: float, - expiration: datetime|str, - sigma: float, - r: float, - N: int = 100, - spot_price: float = None, - dividend_type: str = 'discrete', - div_amount: float = 0.0, - option_type: str = 'c', - start_date: datetime|str = None, - valuation_date: datetime|str = None, - american: bool = False): + def __init__( + self, + K: float, + expiration: datetime | str, + sigma: float, + r: float, + N: int = 100, + spot_price: float = None, + dividend_type: str = "discrete", + div_amount: float = 0.0, + option_type: str = "c", + start_date: datetime | str = None, + valuation_date: datetime | str = None, + american: bool = False, + ): super().__init__() """ Base class for Binomial Tree models. @@ -376,12 +428,12 @@ def __init__(self, self.N = N self.S0 = spot_price self.dividend_type = dividend_type - self.div_yield = div_amount if dividend_type == 'continuous' else 0.0 - self.discrete_dividends = div_amount if dividend_type == 'discrete' else [] + self.div_yield = div_amount if dividend_type == "continuous" else 0.0 + self.discrete_dividends = div_amount if dividend_type == "discrete" else [] self.option_type = option_type self.start_date = start_date self.valuation_date = valuation_date - self.T = time_distance_helper(self.expiration, self.valuation_date or datetime.now()) + self.T = time_distance_helper(end=self.expiration, start=self.valuation_date or datetime.now()) self.american = american self.dt = self.T / self.N self.priced = False @@ -418,9 +470,7 @@ def pricing_warning(self): This method can be overridden in subclasses to provide specific warnings. """ if not self.priced: - # logger.warning("Option has not been priced yet. Please call the price() method first.") - print("Option has not been priced yet. Please call the price() method first.") - + logger.warning("Option has not been priced yet. Please call the price() method first.") def reset_pricing_variables(self): """ @@ -432,7 +482,6 @@ def reset_pricing_variables(self): self.init_parameters() self.build_tree() - def _tree_numerical(self, attr, dx_thresh=0.01): """ Calculate the numerical value of a Greek (delta, gamma, etc.) using the binomial tree. @@ -443,7 +492,7 @@ def _tree_numerical(self, attr, dx_thresh=0.01): bump = actual_value * dx_thresh up_bump = actual_value + bump down_bump = actual_value - bump - + setattr(self, attr, up_bump) price_up = self.price() @@ -454,7 +503,7 @@ def _tree_numerical(self, attr, dx_thresh=0.01): setattr(self, attr, actual_value) return (price_up - price_down) / (2 * bump) - + def _tree_numerical_second_order(self, attr, dx_thresh=0.01): """ Calculate the second-order numerical value of a Greek using the binomial tree. @@ -465,7 +514,7 @@ def _tree_numerical_second_order(self, attr, dx_thresh=0.01): bump = actual_value * dx_thresh up_bump = actual_value + bump down_bump = actual_value - bump - + setattr(self, attr, up_bump) price_up = self.price() @@ -478,8 +527,8 @@ def _tree_numerical_second_order(self, attr, dx_thresh=0.01): ## Reset setattr(self, attr, actual_value) - return (price_up - 2 * price_mid + price_down) / (bump ** 2) - + return (price_up - 2 * price_mid + price_down) / (bump**2) + def theta(self, dx_thresh=0.0001): """ Calculate the theta of the option using the binomial tree. @@ -487,8 +536,8 @@ def theta(self, dx_thresh=0.0001): Returns: Theta value as a float. """ - return -self._tree_numerical('T', dx_thresh)/DAILY_BASIS - + return -self._tree_numerical("T", dx_thresh) / DAILY_BASIS + def vega(self, dx_thresh=0.0001): """ Calculate the vega of the option using the binomial tree. @@ -496,8 +545,8 @@ def vega(self, dx_thresh=0.0001): Returns: Vega value as a float. """ - return self._tree_numerical('sigma', dx_thresh)/100 - + return self._tree_numerical("sigma", dx_thresh) / 100 + def rho(self, dx_thresh=0.0001): """ Calculate the rho of the option using the binomial tree. @@ -505,8 +554,7 @@ def rho(self, dx_thresh=0.0001): Returns: Rho value as a float. """ - return self._tree_numerical('r', dx_thresh)/100 - + return self._tree_numerical("r", dx_thresh) / 100 def volga(self, dx_thresh=0.0001): """ @@ -515,39 +563,47 @@ def volga(self, dx_thresh=0.0001): Returns: Volga value as a float. """ - return self._tree_numerical_second_order('sigma', dx_thresh)/100**2 - - + return self._tree_numerical_second_order("sigma", dx_thresh) / 100**2 def __setattr__(self, name, value): protected = [ - 'K', 'expiration', 'sigma', 'r', 'N', 'S0', 'dividend_type', - 'div_yield', 'discrete_dividends', 'option_type', - 'start_date', 'valuation_date', 'T', 'american' + "K", + "expiration", + "sigma", + "r", + "N", + "S0", + "dividend_type", + "div_yield", + "discrete_dividends", + "option_type", + "start_date", + "valuation_date", + "T", + "american", ] - if not hasattr(self, '_initialized') or not self._initialized: + if not hasattr(self, "_initialized") or not self._initialized: # Allow setting attributes before initialization super().__setattr__(name, value) return - - if hasattr(self, '_initialized') and self._initialized: + + if hasattr(self, "_initialized") and self._initialized: if name in protected: - # raise AttributeError(f"'{name}' is read-only after initialization.") - logger.warning(f"'{name}' is read-only after initialization. Resetting pricing variables.") - super().__setattr__(name, value) ## Set + logger.info(f"'{name}' is read-only after initialization. Resetting pricing variables. This will not change the value of '{name}' but will reset the pricing variables for a new calculation.") + super().__setattr__(name, value) ## Set if name in protected: # Reset pricing variables if a protected attribute is set logger.info(f"Resetting pricing variables due to change in '{name}'.") self.reset_pricing_variables() def __repr__(self): - return f"{self.__class__.__name__}(K={self.K}, expiration={self.expiration}, dividend_type={self.dividend_type})" + return ( + f"{self.__class__.__name__}(K={self.K}, expiration={self.expiration}, dividend_type={self.dividend_type})" + ) - - -class VectorBinomialBase(BinomialBase): +class VectorBinomialBase(BinomialBase): @abstractmethod def init_parameters(self): """ @@ -561,13 +617,8 @@ def build_tree(self): Build the binomial tree structure. This method should be implemented in subclasses. """ - self.stock_tree = build_tree( - S0=self.S0, - u=self.u, - d=self.d, - N=self.N - ) - if self.dividend_type == 'discrete': + self.stock_tree = build_tree(S0=self.S0, u=self.u, d=self.d, N=self.N) + if self.dividend_type == "discrete": self._apply_discrete_dividends() # Apply discrete dividends at time step 0 def _apply_discrete_dividends(self) -> float: @@ -575,19 +626,14 @@ def _apply_discrete_dividends(self) -> float: Apply discrete dividend adjustment to the stock price at a given time step. """ if not list(self.discrete_dividends): - return + return self.stock_tree = apply_discrete_dividends( - discrete_dividends=self.discrete_dividends, - stock_tree=self.stock_tree, - N=self.N + discrete_dividends=self.discrete_dividends, stock_tree=self.stock_tree, N=self.N ) def __create_option_tree(self): self.option_values = create_option_tree( - stock_tree=self.stock_tree, - K=self.K, - option_type=self.option_type, - N=self.N + stock_tree=self.stock_tree, K=self.K, option_type=self.option_type, N=self.N ) def price(self): @@ -602,11 +648,11 @@ def price(self): N=self.N, p=self.p, american=self.american, - option_type=self.option_type + option_type=self.option_type, ) self.priced = True return price - + def delta(self): """ Calculate the delta of the option using the binomial tree. @@ -617,14 +663,14 @@ def delta(self): self.pricing_warning() if self.N < 1: raise ValueError("N must be at least 1 to calculate delta.") - - if not hasattr(self, 'V1'): + + if not hasattr(self, "V1"): self.price() - + stock_tree = self.stock_tree delta = (self.V1[1] - self.V1[0]) / (stock_tree[1][1] - stock_tree[1][0]) return delta - + def gamma(self): """ Calculate the gamma of the option using the binomial tree. @@ -635,65 +681,56 @@ def gamma(self): self.pricing_warning() if self.N < 2: raise ValueError("N must be at least 2 to calculate gamma.") - - if not hasattr(self, 'V2'): + + if not hasattr(self, "V2"): self.price() - + V2, S2 = self.V2, self.stock_tree[2] delta_up = (V2[2] - V2[1]) / (S2[2] - S2[1]) delta_down = (V2[1] - V2[0]) / (S2[1] - S2[0]) gamma = (delta_up - delta_down) / ((S2[2] - S2[0]) / 2) # Average change in delta over the interval return gamma - + ## Child classes for specific binomial models (Vector Operators) -class VectorBinomialCRR(VectorBinomialBase): +class VectorBinomialCRR(VectorBinomialBase): def init_parameters(self): """ Initialize parameters for the binomial tree. This method should be called before building the tree. """ - q = self.div_yield if self.dividend_type == 'continuous' else 0.0 + q = self.div_yield if self.dividend_type == "continuous" else 0.0 self.u, self.d, self.p, _ = crr_init_parameters( - sigma=self.sigma, - r=self.r, - T=self.T, - N=self.N, - div_yield=q, - dividend_type=self.dividend_type + sigma=self.sigma, r=self.r, T=self.T, N=self.N, div_yield=q, dividend_type=self.dividend_type ) + class VectorBinomialLR(VectorBinomialBase): # or NodeBinomialBase def init_parameters(self): """ Initialize Leisen-Reimer parameters: u, d, p. """ - q = self.div_yield if self.dividend_type == 'continuous' else 0.0 + q = self.div_yield if self.dividend_type == "continuous" else 0.0 self.dt = self.T / self.N v = self.sigma * np.sqrt(self.dt) self.u = np.exp(v) self.d = np.exp(-v) - d1 = ( - np.log(self.S0 / self.K) + - (self.r - q + 0.5 * self.sigma ** 2) * self.T - ) / (self.sigma * np.sqrt(self.T)) + d1 = (np.log(self.S0 / self.K) + (self.r - q + 0.5 * self.sigma**2) * self.T) / (self.sigma * np.sqrt(self.T)) x = d1 # Can also use d2 for puts, but d1 gives better results overall # Peizer-Pratt inversion of CDF (used by Leisen-Reimer) - w = np.sqrt(1 - np.exp(-2 * (x ** 2) / self.N)) + w = np.sqrt(1 - np.exp(-2 * (x**2) / self.N)) self.p = 0.5 + np.sign(x) * w / 2 - - # Child classes for specific binomial models (Node Operators) class Node(Scalar): - def __init__(self, stock_price, position,option_value=0.0): + def __init__(self, stock_price, position, option_value=0.0): super().__init__(value=option_value) self.stock_price = stock_price self.value = option_value @@ -704,7 +741,7 @@ def __init__(self, stock_price, position,option_value=0.0): @property def option_value(self): return self.value - + @option_value.setter def option_value(self, value): self.value = value @@ -713,15 +750,12 @@ def __eq__(self, value): if isinstance(value, Node): return self.stock_price == value.stock_price and self.position == value.position return False - + def __repr__(self): return f"Node(price={self.stock_price}, option_value={self.option_value}, pos={self.position})" - - class NodeBinomialBase(BinomialBase): - @abstractmethod def init_parameters(self): """ @@ -739,7 +773,7 @@ def build_tree(self): for i in range(self.N + 1): level = [] for j in range(i + 1): - S = self.S0 * (self.u ** j) * (self.d ** (i - j)) + S = self.S0 * (self.u**j) * (self.d ** (i - j)) node = Node(stock_price=S, position=(i, j)) level.append(node) self.tree.append(level) @@ -747,11 +781,10 @@ def build_tree(self): for i in range(self.N): for j in range(i + 1): current = self.tree[i][j] - current.down = self.tree[i+1][j] # one down move - current.up = self.tree[i+1][j+1] # one up move - + current.down = self.tree[i + 1][j] # one down move + current.up = self.tree[i + 1][j + 1] # one up move - if self.dividend_type == 'discrete': + if self.dividend_type == "discrete": self._apply_discrete_dividends() # Apply discrete dividends at time step 0 def _apply_discrete_dividends(self) -> float: @@ -759,22 +792,19 @@ def _apply_discrete_dividends(self) -> float: Apply discrete dividend adjustment to the stock price at a given time step. """ if not list(self.discrete_dividends): - return - + return + for t_frac, div in self.discrete_dividends: div_step = min(int(round(t_frac * self.N)), self.N) for i in range(div_step, self.N + 1): for node in self.tree[i]: node.stock_price = max(node.stock_price - div, 0) - def __create_option_tree(self): terminal_nodes = self.tree[-1] for node in terminal_nodes: node.option_value = ( - max(0, node.stock_price - self.K) - if self.option_type == 'c' - else max(0, self.K - node.stock_price) + max(0, node.stock_price - self.K) if self.option_type == "c" else max(0, self.K - node.stock_price) ) def price(self): @@ -785,14 +815,12 @@ def price(self): for _, node in enumerate(tree[i]): up_val = node.up.option_value down_val = node.down.option_value - expected = np.exp(-self.r * self.dt) * ( - self.p * up_val + (1 - self.p) * down_val - ) + expected = np.exp(-self.r * self.dt) * (self.p * up_val + (1 - self.p) * down_val) if self.american: intrinsic = ( max(node.stock_price - self.K, 0) - if self.option_type == 'c' + if self.option_type == "c" else max(self.K - node.stock_price, 0) ) node.option_value = max(expected, intrinsic) @@ -801,8 +829,7 @@ def price(self): self.priced = True return tree[0][0].option_value - - + def delta(self): """ Calculate the delta of the option using the binomial tree. @@ -813,12 +840,12 @@ def delta(self): self.pricing_warning() if self.N < 1: raise ValueError("N must be at least 1 to calculate delta.") - + stock_tree = self.tree V1 = self.tree[1] delta = (V1[1] - V1[0]) / (stock_tree[1][1].stock_price - stock_tree[1][0].stock_price) return delta - + def gamma(self): """ Calculate the gamma of the option using the binomial tree. @@ -829,73 +856,71 @@ def gamma(self): self.pricing_warning() if self.N < 2: raise ValueError("N must be at least 2 to calculate gamma.") - - if not hasattr(self, 'V2'): + + if not hasattr(self, "V2"): self.price() - + V2, S2 = self.tree[2], self.tree[2] delta_up = (V2[2] - V2[1]) / (S2[2].stock_price - S2[1].stock_price) delta_down = (V2[1] - V2[0]) / (S2[1].stock_price - S2[0].stock_price) - gamma = (delta_up - delta_down) / ((S2[2].stock_price - S2[0].stock_price) / 2) # Average change in delta over the interval + gamma = (delta_up - delta_down) / ( + (S2[2].stock_price - S2[0].stock_price) / 2 + ) # Average change in delta over the interval return gamma - class NodeBinomialCRR(NodeBinomialBase): - def init_parameters(self): """ Initialize parameters for the binomial tree. This method should be called before building the tree. """ - if self.dividend_type == 'continuous': - y = self.div_yield ## Continuous dividend yield adjustment + if self.dividend_type == "continuous": + y = self.div_yield ## Continuous dividend yield adjustment else: y = 0.0 self.u = np.exp(self.sigma * np.sqrt(self.dt)) self.d = np.exp(-(self.sigma * np.sqrt(self.dt))) self.p = (np.exp((self.r - y) * self.dt) - self.d) / (self.u - self.d) - class NodeBinomialLR(NodeBinomialBase): # or NodeBinomialBase def init_parameters(self): """ Initialize Leisen-Reimer parameters: u, d, p. """ - q = self.div_yield if self.dividend_type == 'continuous' else 0.0 + q = self.div_yield if self.dividend_type == "continuous" else 0.0 self.dt = self.T / self.N v = self.sigma * np.sqrt(self.dt) self.u = np.exp(v) self.d = np.exp(-v) - d1 = ( - np.log(self.S0 / self.K) + - (self.r - q + 0.5 * self.sigma ** 2) * self.T - ) / (self.sigma * np.sqrt(self.T)) + d1 = (np.log(self.S0 / self.K) + (self.r - q + 0.5 * self.sigma**2) * self.T) / (self.sigma * np.sqrt(self.T)) x = d1 # Can also use d2 for puts, but d1 gives better results overall # Peizer-Pratt inversion of CDF (used by Leisen-Reimer) - w = np.sqrt(1 - np.exp(-2 * (x ** 2) / self.N)) + w = np.sqrt(1 - np.exp(-2 * (x**2) / self.N)) self.p = 0.5 + np.sign(x) * w / 2 # Market Child Classes class MarketBinomial(VectorBinomialCRR): - def __init__(self, - tick: str, - K: float, - expiration: datetime|str, - sigma: float, - N: int = 100, - dividend_type: str = 'discrete', - option_type: str = 'c', - start_date: datetime|str = None, - valuation_date: datetime|str = None, - r: float = None, - american: bool = False): + def __init__( + self, + tick: str, + K: float, + expiration: datetime | str, + sigma: float, + N: int = 100, + dividend_type: str = "discrete", + option_type: str = "c", + start_date: datetime | str = None, + valuation_date: datetime | str = None, + r: float = None, + american: bool = False, + ): # super().__init__() """ Base class for Binomial Tree models. @@ -923,14 +948,14 @@ def __init__(self, valuation_date=valuation_date or datetime.now(), risk_free_rate=r, dividend_type=dividend_type, - dividend=None # Market dividend will be set later + dividend=None, # Market dividend will be set later ) self.r = r or self.forward.risk_free_rate self.dividend_type = dividend_type self.option_type = option_type self.start_date = start_date self.valuation_date = valuation_date - self.T = time_distance_helper(self.expiration, self.valuation_date or datetime.now()) + self.T = time_distance_helper(end=self.expiration, start=self.valuation_date or datetime.now()) self.american = american self.dt = self.T / self.N self.tree = [] @@ -963,7 +988,7 @@ def discrete_dividends(self): return self.forward.dividend.get_year_fractions() else: return [] - + @property def div_yield(self): """ @@ -973,6 +998,3 @@ def div_yield(self): return self.forward.dividend.yield_rate else: return 0.0 - - - \ No newline at end of file diff --git a/trade/optionlib/pricing/black_scholes.py b/trade/optionlib/pricing/black_scholes.py index da952a0..f89e4b2 100644 --- a/trade/optionlib/pricing/black_scholes.py +++ b/trade/optionlib/pricing/black_scholes.py @@ -25,6 +25,7 @@ vectorized_market_forward_calc ) from trade.helpers.Logging import setup_logger +from trade.optionlib.utils.format import assert_equal_length logger = setup_logger('trade.optionlib.pricing.black_scholes') @@ -53,6 +54,7 @@ def black_scholes_vectorized(F: Union[float, np.ndarray], r = convert_to_array_individual(r, dtype=float) sigma = convert_to_array_individual(sigma, dtype=float) option_type = convert_to_array_individual(option_type, dtype=str) + assert_equal_length(F, K, T, r, sigma, option_type, names=['F', 'K', 'T', 'r', 'sigma', 'option_type']) d1 = (np.log(F / K) + 0.5 * sigma**2 * T) / (sigma * np.sqrt(T)) @@ -143,7 +145,7 @@ def black_scholes_vectorized_market(ticks: List[str], raise ValueError("option_type must be a single string or a list of strings with the same length as ticks.") # Convert valuation_dates and end_dates to Timedelta - T = [time_distance_helper(end_dates[i], valuation_dates[i]) for i in range(len(end_dates))] + T = [time_distance_helper(end=end_dates[i], start=valuation_dates[i]) for i in range(len(end_dates))] return black_scholes_vectorized_base( F=F, @@ -183,7 +185,7 @@ def __init__(self, - volatility: sigma (annualized) - option_type: "call" or "put" """ - self.T = time_distance_helper(expiration, valuation_date) + self.T = time_distance_helper(end=expiration, start=valuation_date) risk_free_rate = float(risk_free_rate) if risk_free_rate else 0 # Ensure risk-free rate is a float option_inputs_assert(sigma=volatility, K=strike_price, @@ -452,7 +454,7 @@ def price(self, F=None, K=None, T=None, r=None, sigma=None, option_type=None, S= else: # Set valuation date back so that (end_date - valuation_date) = T - temp_val_date = self.forward.valuation_date + _ = self.forward.valuation_date new_val_date = self.expiration - timedelta(days=T * DAILY_BASIS) self.forward.valuation_date = new_val_date self.forward.dividend.valuation_date = new_val_date diff --git a/trade/optionlib/utils/batch_operation.py b/trade/optionlib/utils/batch_operation.py index 66c9a4c..3f4d031 100644 --- a/trade/optionlib/utils/batch_operation.py +++ b/trade/optionlib/utils/batch_operation.py @@ -2,9 +2,8 @@ import numpy as np from itertools import chain from trade.helpers.helper import get_parrallel_apply -from typing import List, Union -parrallel_apply = get_parrallel_apply() ## Using system to pick btwmeen multiprocessing and threading + def vector_batch_processor(callable, *args, **kwargs): """ @@ -50,7 +49,9 @@ def vector_batch_processor(callable, *args, **kwargs): else: split_arg = [arg] * num_process ordered_inputs.append(split_arg) - + + parrallel_apply = get_parrallel_apply() ## Using system to pick btwmeen multiprocessing and threading + results = parrallel_apply( func=callable, OrderedInputs=ordered_inputs, diff --git a/trade/optionlib/utils/format.py b/trade/optionlib/utils/format.py index 69f4d30..d3388f7 100644 --- a/trade/optionlib/utils/format.py +++ b/trade/optionlib/utils/format.py @@ -2,17 +2,24 @@ import numpy as np import pandas as pd from trade.helpers.Logging import setup_logger -logger = setup_logger('trade.optionlib.utils.format') -def assert_equal_length(*args): +logger = setup_logger("trade.optionlib.utils.format") + + +def assert_equal_length(*args, names: list = None): """ Assert that all input lists have the same length. """ lengths = [len(arg) for arg in args] if len(set(lengths)) != 1: - return False + if names is not None: + name_length_pairs = ", ".join(f"{name}: {length}" for name, length in zip(names, lengths)) + raise ValueError(f"Input lists must have the same length. Lengths are: {name_length_pairs}") + else: + raise ValueError(f"Input lists must have the same length. Lengths are: {lengths}") return True + def convert_to_array_individual(value, dtype=None): if isinstance(value, (list, np.ndarray, pd.Series)): return np.array(value, dtype=dtype or object) @@ -31,8 +38,6 @@ def convert_to_array(*args): def option_inputs_assert(sigma, K, S0, T, r, q, market_price, flag): - - """ Check for errors in the input parameters for the vol backout function Args: @@ -44,14 +49,16 @@ def option_inputs_assert(sigma, K, S0, T, r, q, market_price, flag): q (float): Dividend yield. market_price (float): Market price of the option. flag (str): 'c' for call option, 'p' for put option. - + """ assert isinstance(sigma, (int, float)), f"Recieved '{type(sigma)}' for sigma. Expected 'int' or 'float'" assert isinstance(K, (int, float)), f"Recieved '{type(K)}' for K. Expected 'int' or 'float'" assert isinstance(S0, (int, float)), f"Recieved '{type(S0)}' for S0. Expected 'int' or 'float'" assert isinstance(r, (int, float)), f"Recieved '{type(r)}' for r. Expected 'int' or 'float'" assert isinstance(q, (int, float)), f"Recieved '{type(q)}' for q. Expected 'int' or 'float'" - assert isinstance(market_price, (int, float)), f"Recieved '{type(market_price)}' for market_price. Expected 'int' or 'float'" + assert isinstance( + market_price, (int, float) + ), f"Recieved '{type(market_price)}' for market_price. Expected 'int' or 'float'" assert isinstance(flag, str), f"Recieved '{type(flag)}' for flag. Expected 'str'" if sigma <= 0: @@ -68,13 +75,11 @@ def option_inputs_assert(sigma, K, S0, T, r, q, market_price, flag): raise ValueError("Dividend yield must be non-negative.") if market_price <= 0: raise ValueError("Market price must be positive.") - if flag not in ['c', 'p']: + if flag not in ["c", "p"]: raise ValueError("Flag must be 'c' for call or 'p' for put.") - + if pd.isna(sigma) or pd.isna(K) or pd.isna(S0) or pd.isna(r) or pd.isna(q) or pd.isna(market_price): raise ValueError("Input values cannot be NaN.") - - def to_1d_array(x): @@ -83,6 +88,7 @@ def to_1d_array(x): return x.flatten() return x + def equalize_lengths(*args): """ Ensure all inputs have the same length if an arg is a list of size 1 or a single value. @@ -91,5 +97,7 @@ def equalize_lengths(*args): if max_size == 0: raise ValueError("All input arrays are empty.") - return [np.full(max_size, arg) if isinstance(arg, (int, float, str, datetime)) or len(arg) == 1 else np.asarray(arg) for arg in args] - + return [ + np.full(max_size, arg) if isinstance(arg, (int, float, str, datetime)) or len(arg) == 1 else np.asarray(arg) + for arg in args + ] diff --git a/trade/optionlib/utils/market_data.py b/trade/optionlib/utils/market_data.py index a2bb9c0..e1cbcfb 100644 --- a/trade/optionlib/utils/market_data.py +++ b/trade/optionlib/utils/market_data.py @@ -11,6 +11,8 @@ DIVIDEND_CACHE = {} + + def get_div_schedule(ticker, filter_specials=True): """ Fetch the dividend schedule for a given ticker. diff --git a/trade/optionlib/vol/implied_vol.py b/trade/optionlib/vol/implied_vol.py index 8569ac8..2391d35 100644 --- a/trade/optionlib/vol/implied_vol.py +++ b/trade/optionlib/vol/implied_vol.py @@ -1,51 +1,331 @@ -from typing import List, Union, Literal +from typing import Any, List, Union, Literal, Callable, Optional import numpy as np +import pandas as pd +import time from scipy.optimize import minimize, minimize_scalar -from functools import lru_cache +from trade.optionlib.utils.format import assert_equal_length # noqa +from trade.optionlib.utils.batch_operation import vector_batch_processor +from trade import set_pool_enabled, get_pool_enabled from ..pricing.black_scholes import black_scholes_vectorized, black_scholes_vectorized_scalar from ..pricing.bjs2002 import bjerksund_stensland_2002_vectorized from ..pricing.binomial import crr_binomial_pricing from ..config.defaults import BRUTE_FORCE_MAX_ITERATIONS from trade.helpers.Logging import setup_logger -logger = setup_logger('trade.optionlib.vol.implied_vol') +from trade.helpers.exit_helpers import _record_time +import random +logger = setup_logger("trade.optionlib.vol.implied_vol") -def intrinsic_check(F, K, T, r, sigma, market_price, option_type) -> None: + +def vector_crr_iv_estimation( + S: List[float], + K: List[float], + T: List[float], + r: List[float], + market_price: List[float], + dividends: List[Any], + option_type: List[str], + N: List[int] = None, + dividend_type: List[str] = None, + american: List[bool] = None, +) -> List[float]: + """Estimate implied volatilities using Cox-Ross-Rubinstein binomial model for multiple options. + + Vectorized implementation that computes implied volatilities by matching market prices + to CRR binomial tree prices. Automatically selects between standard and batch processing + based on input size (threshold: 200 options). Supports both American and European options + with discrete or continuous dividend treatments. + + Args: + S: List of spot prices for each option. + K: List of strike prices for each option. + T: List of times to maturity (in years) for each option. + r: List of risk-free interest rates (annualized) for each option. + market_price: List of observed market prices to match. + dividends: List of dividend inputs. Format depends on dividend_type: + - For "discrete": Schedule objects or tuples of (ex_date, amount) + - For "continuous": continuous dividend yields (floats) + option_type: List of option types ('c' for call, 'p' for put). + N: Number of time steps in binomial tree for each option. Defaults to 100 for all. + dividend_type: List of dividend types ('discrete' or 'continuous'). + Defaults to 'discrete' for all. + american: List of booleans indicating American (True) or European (False) exercise. + Defaults to True (American) for all. + + Returns: + List of estimated implied volatilities, one per input option. Returns None for + options where optimization fails to converge. + + Raises: + ValueError: If input lists have inconsistent lengths (via assert_equal_length). + + Examples: + >>> # Basic usage with European calls + >>> spots = [100.0, 105.0, 110.0] + >>> strikes = [100.0, 100.0, 100.0] + >>> maturities = [0.25, 0.25, 0.25] + >>> rates = [0.05, 0.05, 0.05] + >>> prices = [5.2, 7.8, 11.3] + >>> divs = [0.02, 0.02, 0.02] + >>> types = ['c', 'c', 'c'] + >>> + >>> ivs = vector_crr_iv_estimation( + ... S=spots, + ... K=strikes, + ... T=maturities, + ... r=rates, + ... market_price=prices, + ... dividends=divs, + ... option_type=types, + ... N=[100, 100, 100], + ... dividend_type=['continuous', 'continuous', 'continuous'], + ... american=[False, False, False] + ... ) + >>> print(ivs) + [0.234, 0.241, 0.248] + + >>> # American options with discrete dividends (using defaults) + >>> from trade.optionlib.utils.schedule import Schedule + >>> div_schedule = Schedule([("2026-03-15", 0.50), ("2026-06-15", 0.50)]) + >>> ivs = vector_crr_iv_estimation( + ... S=[150.0, 155.0], + ... K=[150.0, 150.0], + ... T=[0.5, 0.5], + ... r=[0.04, 0.04], + ... market_price=[8.5, 10.2], + ... dividends=[div_schedule, div_schedule], + ... option_type=['p', 'p'] + ... ) # Uses defaults: N=100, dividend_type='discrete', american=True """ - Check if the intrinsic value of the option is greater than the market price. - If not, log a warning and return NaN. - Parameters: - - F: Forward price - - K: Strike price - - T: Time to maturity - - r: Risk-free rate - - sigma: Volatility - - market_price: Market price of the option - - option_type: 'c' for call, 'p' for put + randint = random.randint(1,3) + if not american: + american = [True] * len(S) + + if not dividend_type: + dividend_type = ["discrete"] * len(S) + + if not N: + N = [100] * len(S) + + assert_equal_length( + S, + K, + T, + r, + market_price, + dividends, + option_type, + N, + dividend_type, + american, + names=[ + "S", + "K", + "T", + "r", + "market_price", + "dividends", + "option_type", + "N", + "dividend_type", + "american", + ], + ) + if randint == 1: + logger.info("Using non-batch processor for CRR implied volatility estimation.") + start = time.time() + result = vector_vol_estimation( + estimate_crr_implied_volatility, + S, + K, + T, + r, + market_price, + dividends, + option_type, + N, + dividend_type, + american, + ) + _record_time(start, + time.time(), + "crr_iv_estimation", + { + "method": "non-batch crr iv estimation", + "nsize": len(S), + "randint": randint + } + ) + + else: + logger.info("Using batch processor for CRR implied volatility estimation.") + current_pool_status = get_pool_enabled() + additional_info = "Batch CRR With " + if randint == 3: + set_pool_enabled(False) ## Use Threading + additional_info += "Threading." + elif randint ==2: + set_pool_enabled(True) ## Use Multiprocessing + additional_info += "Multiprocessing." + start = time.time() + result = vector_batch_processor( + vector_vol_estimation, + estimate_crr_implied_volatility, + S, + K, + T, + r, + market_price, + dividends, + option_type, + N, + dividend_type, + american, + ) + _record_time(start, time.time(), + "crr_iv_estimation", + { + "method": additional_info, + "nsize": len(S), + "randint": randint + } + ) + set_pool_enabled(current_pool_status) ## Reset to original state + return result + + +def vector_bsm_iv_estimation( + F: List[float], + K: List[float], + T: List[float], + r: List[float], + market_price: List[float], + right: List[str], +) -> List[float]: + """Estimate implied volatilities using Black-Scholes-Merton model for multiple European options. + + Vectorized implementation that computes implied volatilities by matching market prices + to Black-Scholes-Merton prices using a brute force grid search method. This function + is optimized for European-style options and uses forward prices (F) directly rather + than spot prices with dividend adjustments. + + The brute force approach tests a range of volatilities (0.001 to 5.0) and selects the + one that minimizes the difference between calculated and market prices. Returns NaN for + options that violate no-arbitrage bounds (intrinsic value or upper bound constraints). + + Args: + F: List of forward prices for each option. Forward price should already incorporate + dividends and cost of carry: F = S * exp((r-q)*T). + K: List of strike prices for each option. + T: List of times to maturity (in years) for each option. + r: List of risk-free interest rates (annualized) for each option. + market_price: List of observed market prices to match. + right: List of option types ('c' for call, 'p' for put). + Returns: - - None + List of estimated implied volatilities, one per input option. Returns np.nan for + options where arbitrage bounds are violated. + + Raises: + ValueError: If input lists have inconsistent lengths (via assert_equal_length). + + Examples: + >>> # Basic usage with European call options + >>> forwards = [102.5, 107.3, 112.8] + >>> strikes = [100.0, 100.0, 100.0] + >>> maturities = [0.25, 0.25, 0.25] + >>> rates = [0.05, 0.05, 0.05] + >>> prices = [5.8, 9.2, 13.5] + >>> types = ['c', 'c', 'c'] + >>> + >>> ivs = vector_bsm_iv_estimation( + ... F=forwards, + ... K=strikes, + ... T=maturities, + ... r=rates, + ... market_price=prices, + ... right=types + ... ) + >>> print(ivs) + [0.235, 0.242, 0.251] + + >>> # Mixed calls and puts with varying parameters + >>> ivs = vector_bsm_iv_estimation( + ... F=[100.0, 105.0, 98.0], + ... K=[100.0, 110.0, 100.0], + ... T=[0.5, 0.75, 0.25], + ... r=[0.04, 0.045, 0.035], + ... market_price=[8.5, 7.2, 3.1], + ... right=['c', 'c', 'p'] + ... ) + """ + + assert_equal_length( + F, + K, + T, + r, + market_price, + right, + names=[ + "F", + "K", + "T", + "r", + "market_price", + "right", + ], + ) + return vector_vol_estimation(bsm_vol_est_brute_force, F, K, T, r, market_price, right) + + +def intrinsic_check(F, K, T, r, sigma, market_price, option_type) -> bool: + """ + Check no-arbitrage bounds (intrinsic + upper bound). + Returns False if violated, True otherwise. """ df = np.exp(-r * T) - intrinsic_value = df * max(F - K if option_type == 'c' else K - F, 0) - ##TODO: Take this out of objective function to avoid repeated logging during minimization - if intrinsic_value < market_price: - logger.warning("Market price exceeds intrinsic value, returning NaN.") - logger.warning(f"Intrinsic Value: {intrinsic_value}, Market Price: {market_price}. Option Details: F={F}, K={K}, T={T}, r={r}, sigma={sigma}, option_type={option_type}") + if option_type == "c": + intrinsic_value = df * max(F - K, 0.0) + upper_bound = df * F + else: + intrinsic_value = df * max(K - F, 0.0) + upper_bound = df * K + + # Lower bound (intrinsic) violation + if market_price < intrinsic_value: + logger.warning("Market price below intrinsic value.") + logger.warning( + f"Intrinsic Value: {intrinsic_value}, Market Price: {market_price}. " + f"Option Details: F={F}, K={K}, T={T}, r={r}, sigma={sigma}, option_type={option_type}" + ) + return False + + # Upper bound (no-arbitrage) violation + if market_price > upper_bound: + logger.warning("Market price exceeds no-arbitrage upper bound.") + logger.warning( + f"Upper Bound: {upper_bound}, Market Price: {market_price}. " + f"Option Details: F={F}, K={K}, T={T}, r={r}, sigma={sigma}, option_type={option_type}" + ) + return False + + return True def bsm_vol_est_minimization( - F: float, - K: float, - T: float, - r: float, - market_price: float, - option_type: str = 'c', + F: float, + K: float, + T: float, + r: float, + market_price: float, + option_type: str = "c", ): """ Objective function for volatility estimation using minimization. This function calculates the difference between the market price and the Black-Scholes price. - + Parameters: - F: Forward price - K: Strike price @@ -53,21 +333,14 @@ def bsm_vol_est_minimization( - r: Risk-free rate - market_price: Market price of the option - option_type: 'c' for call, 'p' for put - + Returns: - Difference between market price and Black-Scholes price """ intrinsic_check(F, K, T, r, 0.2, market_price, option_type) # Check intrinsic value - + def objective_function(sigma): - bs_price = black_scholes_vectorized( - F=F, - K=K, - T=T, - r=r, - sigma=sigma, - option_type=option_type - ) + bs_price = black_scholes_vectorized(F=F, K=K, T=T, r=r, sigma=sigma, option_type=option_type) return (bs_price - market_price) ** 2 # Initial guess for volatility @@ -75,19 +348,20 @@ def objective_function(sigma): # Minimize the objective function to find the implied volatility result = minimize(objective_function, initial_guess, bounds=[(0.01, None)]) - + if result.success: return result.x[0] # Return the estimated volatility else: raise ValueError("Volatility estimation failed.") - + + def bsm_vol_est_brute_force( - F: float, - K: float, - T: float, - r: float, - market_price: float, - option_type: str = 'c', + F: float, + K: float, + T: float, + r: float, + market_price: float, + option_type: str = "c", ): """ @@ -103,17 +377,13 @@ def bsm_vol_est_brute_force( Returns: - Estimated volatility """ - intrinsic_check(F, K, T, r, 0.2, market_price, option_type) # Check intrinsic value + + check = intrinsic_check(F, K, T, r, 0.2, market_price, option_type) # Check intrinsic value + if not check: + return np.nan sigmas = np.linspace(0.001, 5, BRUTE_FORCE_MAX_ITERATIONS) # Range of volatilities to test - prices = black_scholes_vectorized_scalar( - F=F, - K=K, - T=T, - r=r, - sigma=sigmas, - option_type=option_type - ) + prices = black_scholes_vectorized_scalar(F=F, K=K, T=T, r=r, sigma=sigmas, option_type=option_type) # Calculate the absolute differences between market price and calculated prices differences = np.abs(prices - market_price) @@ -124,52 +394,83 @@ def bsm_vol_est_brute_force( return sigmas[min_index] # Return the estimated volatility and corresponding price -def vector_vol_estimation(brute_callable: Union[callable, str], - list_input: List[tuple], - *args) -> List[float]: - """ - Wrapper function to allow passing a callable and a list of inputs, in order to replicate vectorized behavior.. - This function works by using list comprehension to apply the callable to each set of parameters in the list_input. - - Parameters: - - brute_callable: Function to call for brute force estimation - - list_input: List of inputs for the brute force estimation - eg: [ - (S1, K1, T1, r1, market_price1, q1, option_type1), - ] - +def vector_vol_estimation( + brute_callable: Union[Callable, str], *args, list_input: Optional[List[tuple]] = None +) -> List[float]: + """Vectorized volatility estimation using list comprehension. + + Wrapper function to replicate vectorized behavior by applying a callable to each + set of parameters. Supports two input modes: individual parameter lists (*args) + or pre-zipped tuples (list_input keyword argument). + + Args: + brute_callable: Function to call for volatility estimation. Should accept + parameters matching those in list_input or *args. + *args: Individual parameter lists as separate arguments. Each argument should + be a list/tuple/array of values. These will be transposed into tuples. + list_input: Optional keyword-only. List of tuples where each tuple contains + all parameters for one estimation call. + Example: [(S1, K1, T1, r1, price1, q1, type1), (S2, K2, T2, ...)] + Returns: - - Estimated volatilities as a numpy array + List of estimated volatilities, one per parameter set. + + Raises: + ValueError: If both list_input and *args are provided. + ValueError: If *args elements are not lists, tuples, or arrays. + + Examples: + >>> # Using *args (recommended for most cases) + >>> vols = vector_vol_estimation( + ... bsm_vol_est_brute_force, + ... S_list, K_list, T_list, r_list, market_price_list, option_type_list + ... ) + + >>> # Using list_input keyword argument + >>> vols = vector_vol_estimation( + ... bsm_vol_est_brute_force, + ... list_input=[ + ... (100.0, 100.0, 1.0, 0.05, 10.5, 'c'), + ... (105.0, 100.0, 1.0, 0.05, 12.3, 'c'), + ... ] + ... ) + + Notes: + - Cannot use both *args and list_input simultaneously + - When using *args, all lists must have the same length + - Empty inputs return empty list """ ## Can either pass list_input or args, but not both is_list_input = list_input is not None is_args = len(args) > 0 if is_list_input and is_args: - raise ValueError("Either provide list_input or args, not both. If passing list_input, it should be a list of tuples with all parameters. Pass None for list_input if using args.") - + raise ValueError("Either provide list_input (keyword-only) or *args, not both.") + if args: for arg in args: - if not isinstance(arg,(list, tuple, np.ndarray)): - raise ValueError("args must be a list, tuple, or numpy array.") + if not isinstance(arg, (list, tuple, np.ndarray)): + if isinstance(arg, pd.Series): + arg = arg.tolist() + continue + raise ValueError(f"args must be a list, tuple, or numpy array. Recieved {type(arg)}.") list_input = list(zip(*args)) # Transpose args to create list of tuples if len(list_input) == 0: return [] estimated_vols = [brute_callable(*params) for params in list_input] - return estimated_vols def vol_est_brute_force_bjs_2002( - S: float, - K: float, - T: float, - r: float, - market_price: float, - q: float = 0.0, - option_type: str = 'c', + S: float, + K: float, + T: float, + r: float, + market_price: float, + q: float = 0.0, + option_type: str = "c", ): """ @@ -186,8 +487,8 @@ def vol_est_brute_force_bjs_2002( Returns: - Estimated volatility """ - # - + # + sigmas = np.linspace(0.001, 5, BRUTE_FORCE_MAX_ITERATIONS) # Range of volatilities to test S, K, T, r, q, option_type = map(np.asarray, (S, K, T, r, q, option_type)) prices = bjerksund_stensland_2002_vectorized( @@ -197,8 +498,8 @@ def vol_est_brute_force_bjs_2002( r=r, sigma=sigmas, option_type=option_type, - dividend_type='continuous', # Assuming continuous dividends for this example - dividend=q # No discrete dividends in this case + dividend_type="continuous", # Assuming continuous dividends for this example + dividend=q, # No discrete dividends in this case ) non_na_mask = ~np.isnan(prices) & ~np.isinf(prices) # Filter out NaN/Inf prices prices = prices[non_na_mask] # Filter prices @@ -212,34 +513,36 @@ def vol_est_brute_force_bjs_2002( # Return the corresponding volatility return sigmas[min_index] # Return the estimated volatility and corresponding price + def _k(x, nd=4): """ Helper function to round a number to a specified number of decimal places. Parameters: - x: Number to round - nd: Number of decimal places (default is 4) - + Returns: - Rounded number """ return round(x, nd) -@lru_cache(maxsize=2048) + +# @lru_cache(maxsize=2048) def _estimate_crr_cached( - S: float, - K: float, - T: float, - r: float, - market_price: float, - q: float = 0.0, - option_type: str = 'c', - N: int = 1000, - dividend_type: Literal['continuous', 'discrete'] = 'continuous', - american: bool = False + S: float, + K: float, + T: float, + r: float, + market_price: float, + q: float = 0.0, + option_type: str = "c", + N: int = 1000, + dividend_type: Literal["continuous", "discrete"] = "continuous", + american: bool = False, ) -> float: """ Estimate implied volatility using optimization. - + Parameters: - S: Spot price - K: Strike price @@ -249,10 +552,11 @@ def _estimate_crr_cached( - q: Continuous dividend yield (default is 0.0) - option_type: 'c' for call, 'p' for put - N: Number of time steps in the binomial tree - + Returns: - Estimated volatility """ + def binomial_objective_function(sigma: float) -> float: calculated_price = crr_binomial_pricing( K=K, @@ -262,37 +566,37 @@ def binomial_objective_function(sigma: float) -> float: N=N, S0=S, dividend_type=dividend_type, - div_yield=q if dividend_type == 'continuous' else 0.0, # Use q for continuous dividends - dividends=q if dividend_type == 'discrete' else [], # Use q for discrete dividends + div_yield=q if dividend_type == "continuous" else 0.0, # Use q for continuous dividends + dividends=q if dividend_type == "discrete" else [], # Use q for discrete dividends option_type=option_type, - american=american + american=american, ) return (calculated_price - market_price) ** 2 + result = minimize_scalar( binomial_objective_function, bounds=(0.001, 5.0), # Reasonable bounds for volatility - method='bounded' + method="bounded", ) - + return result.x if result.success else None - def estimate_crr_implied_volatility( - S: float, - K: float, - T: float, - r: float, - market_price: float, - q: float = 0.0, - option_type: str = 'c', - N: int = 1000, - dividend_type: Literal['continuous', 'discrete'] = 'continuous', - american: bool = False + S: float, + K: float, + T: float, + r: float, + market_price: float, + q: float = 0.0, + option_type: str = "c", + N: int = 1000, + dividend_type: Literal["continuous", "discrete"] = "continuous", + american: bool = False, ) -> float: """ Estimate implied volatility using optimization. - + Parameters: - S: Spot price - K: Strike price @@ -302,19 +606,30 @@ def estimate_crr_implied_volatility( - q: Continuous dividend yield (default is 0.0) - option_type: 'c' for call, 'p' for put - N: Number of time steps in the binomial tree - + Returns: - Estimated volatility """ + + S = _k(S) + K = _k(K) + T = _k(T, nd=6) + r = _k(r, nd=6) + market_price = _k(market_price) + q = _k(q, nd=6) if dividend_type == "continuous" else q + option_type = option_type + N = N + dividend_type = dividend_type + american = american return _estimate_crr_cached( - S=_k(S), - K=_k(K), - T=_k(T, nd=6), - r=_k(r, nd=6), - market_price=_k(market_price), - q=_k(q, nd=6) if dividend_type == 'continuous' else q, + S=S, + K=K, + T=T, + r=r, + market_price=market_price, + q=q, option_type=option_type, N=N, dividend_type=dividend_type, - american=american + american=american, ) diff --git a/trade/optionlib/vol/ssvi/utils.py b/trade/optionlib/vol/ssvi/utils.py index 92a7ea4..9834401 100644 --- a/trade/optionlib/vol/ssvi/utils.py +++ b/trade/optionlib/vol/ssvi/utils.py @@ -194,8 +194,8 @@ def get_chain(tick: str, date: str) -> pd.DataFrame: chain["log_moneyness"] = np.log(chain["moneyness"]) chain["T"] = chain["Expiration"].apply( lambda x: time_distance_helper( - x, - date, + end=x, + start=date, ) ) chain["T"] = chain["T"].astype(float)